From 23b9f7c5b09945a6a2f22f5cc5bcd3d576a63ed1 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 11 Nov 2022 16:15:46 +0100 Subject: [PATCH 001/381] add new IVAS SID bitrate in cut_bs.py --- scripts/cut_bs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cut_bs.py b/scripts/cut_bs.py index 261a66bc9f..6dab2e3238 100755 --- a/scripts/cut_bs.py +++ b/scripts/cut_bs.py @@ -35,7 +35,7 @@ import argparse import os.path import sys -SID_BITS = {35, 48, 88, 100} +SID_BITS = {35, 48, 104} SYNC_WORDS = {b"!k", b" k"} -- GitLab From 5c09b7625f6fc2f06194372c5d91a06d7d4fa2aa Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 14 Nov 2022 11:17:40 +0100 Subject: [PATCH 002/381] add --length option to cut_bs.py --- scripts/cut_bs.py | 48 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/scripts/cut_bs.py b/scripts/cut_bs.py index 6dab2e3238..bd1978ebe5 100755 --- a/scripts/cut_bs.py +++ b/scripts/cut_bs.py @@ -39,7 +39,28 @@ SID_BITS = {35, 48, 104} SYNC_WORDS = {b"!k", b" k"} -def cut_bs(fp, fp_out, start_frame=0, start_with_sid=False): +def cut_to_length(fp, fp_out, length): + assert length > 0 + + fr_cnt = 0 + + for f in range(length): + sync_word = fp.read(2) + if sync_word == b"": + return (fr_cnt, cut_cnt) + if sync_word not in SYNC_WORDS: + raise ValueError("Bad Sync word!") + n_bits_bs = fp.read(2) + n_bits = struct.unpack("h", n_bits_bs)[0] + fp_out.write(sync_word) + fp_out.write(n_bits_bs) + fp_out.write(fp.read(n_bits * 2)) + fr_cnt += 1 + + return fr_cnt + + +def cut_from_start(fp, fp_out, start_frame=0, start_with_sid=False): # cut until start frame fr_cnt = 0 cut_cnt = 0 @@ -92,14 +113,15 @@ def cut_bs(fp, fp_out, start_frame=0, start_with_sid=False): if __name__ == "__main__": my_parser = argparse.ArgumentParser( - description="Cut frames from the beginning of a G.192 bit stream file" + description="Cut a G.192 bit stream file" ) my_parser.add_argument( - "--sid", "-s", help="Cut until the first SID frame", action="store_true" + "--sid", "-s", help="Cut away all frames before the first SID frame", action="store_true" ) my_parser.add_argument( - "--frame", "-f", type=int, help="Number of frames to cut.", default=0 + "--frame", "-f", type=int, help="Number of frames to cut from the start of the file.", default=0 ) + my_parser.add_argument("--length", "-l", type=int, help="Cut bitstream to this length (in frames)", default=-1) my_parser.add_argument("bs_in", type=str, help="G.192 bit stream file name to cut") my_parser.add_argument("bs_out", type=str, help="Cut G.192 bit stream file name") my_args = my_parser.parse_args() @@ -113,10 +135,16 @@ if __name__ == "__main__": with open(my_args.bs_in, "rb") as fp_in: with open(my_args.bs_out, "wb") as fp_out: - fr_cnt, cut_cnt = cut_bs( - fp_in, fp_out, start_frame=my_args.frame, start_with_sid=my_args.sid - ) + if my_args.sid or my_args.frame: + fr_cnt, cut_cnt = cut_from_start( + fp_in, fp_out, start_frame=my_args.frame, start_with_sid=my_args.sid + ) + if my_args.sid and (fr_cnt == cut_cnt): + print("Warning! No SID frame found in bitstream!") + print(f"Cut {cut_cnt} of {fr_cnt} frames from {my_args.bs_in}") + elif my_args.length: + fr_cnt = cut_to_length(fp_in, fp_out, my_args.length) + if fr_cnt != my_args.length: + print(f"Warning! Could not cut to length {my_args.length} as bitstream only contained {fr_cnt} frames!") + print(f"Cut {my_args.bs_in} to {fr_cnt} frames") - if my_args.sid and (fr_cnt == cut_cnt): - print("Warning! No SID frame found in bitstream!") - print(f"Cut {cut_cnt} of {fr_cnt} frames from {my_args.bs_in}") -- GitLab From 2ef9e79d7cfcb0f4fa780f9dc2721b7e4f611d36 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 14 Nov 2022 12:04:22 +0100 Subject: [PATCH 003/381] add --bs_length option to pyivastest scripts --- scripts/pyivastest/IvasScriptsCommon.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scripts/pyivastest/IvasScriptsCommon.py b/scripts/pyivastest/IvasScriptsCommon.py index 45631566e9..101579da9b 100644 --- a/scripts/pyivastest/IvasScriptsCommon.py +++ b/scripts/pyivastest/IvasScriptsCommon.py @@ -276,6 +276,12 @@ class IvasScriptArgParser(argparse.ArgumentParser): help="Cut frames from the beginning of the encoded bit stream until the first SID frame", action="store_true", ) + self.add_argument( + "--bs_length", + help="Cut bitstream to this (maximum) length. Is applied AFTER --sidstart processing, if this is given", + type=int, + default=-1, + ) self.add_argument( "--info", help="Ouput debug info in subfolders of /res (use with caution, this can generate a huge amount of data)", @@ -604,6 +610,18 @@ def runner_setup(runner, args): ] add_to_proc_chain(bs_proc_chain, sidstart_cmd) + if args["bs_length"] > 0: + bs_len = args["bs_length"] + bs_cut_cmd = [ + os.path.join(constants.SCRIPTS_BASE_DIR, "cut_bs.py"), + "--length", + f"{bs_len}", + "{in_file}", + "{out_file}", + f"{bs_len}frames", + ] + add_to_proc_chain(bs_proc_chain, bs_cut_cmd) + if bs_proc_chain != {}: runner.global_bitstream_processing = bs_proc_chain -- GitLab From 7ec741b77b5601e6e9076be865722bdc648127ee Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 14 Nov 2022 12:19:17 +0100 Subject: [PATCH 004/381] add job and return value for runIvasCodec.py --- .gitlab-ci.yml | 18 ++++++++++++++++++ scripts/runIvasCodec.py | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c4a429c75d..82f79f6026 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -597,6 +597,24 @@ clang-format-check: name: "$ARTIFACT_BASE_NAME" expose_as: 'formatting patch' +# check for crashes if first received frame on decoder side is an SID +check-first-frame-is-sid: + extends: + - .test-job-linux + tags: + - ivas-linux + stage: test + needs: ["build-codec-linux-cmake"] + script: + - *print-common-info + - mkdir + - cmake . + - make -j + + # TODO: add SBA 24.4 kbps back once #185 is fixed + - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v "SBA_b24_4") + - scripts/runIvasCodec.py -p scripts/config/ci_linux_ltv.json -m $modes -s -bs_length 50 + # --------------------------------------------------------------- # Test jobs for main branch # --------------------------------------------------------------- diff --git a/scripts/runIvasCodec.py b/scripts/runIvasCodec.py index 4ec1da90b9..288095bb2a 100755 --- a/scripts/runIvasCodec.py +++ b/scripts/runIvasCodec.py @@ -143,6 +143,10 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript): self.logger.console(r[0]) self.logger.console(" ") + encs_failed = len(runner.failed_modes["enc"]) > 0 + decs_failed = len(runner.failed_modes["dec"]) > 0 + return encs_failed or decs_failed + if __name__ == "__main__": script = RunIvasCodec() -- GitLab From 3c39d16ad00cf4c7413c802fa609749ac94eef74 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 14 Nov 2022 12:25:08 +0100 Subject: [PATCH 005/381] fix job --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 82f79f6026..0e565822be 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -607,7 +607,6 @@ check-first-frame-is-sid: needs: ["build-codec-linux-cmake"] script: - *print-common-info - - mkdir - cmake . - make -j -- GitLab From 0015d8bee28b43a8a1bc7d4fad393f01aca9a081 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 14 Nov 2022 16:00:57 +0100 Subject: [PATCH 006/381] fix flag typo and increase length --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0e565822be..310ba289fc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -612,7 +612,7 @@ check-first-frame-is-sid: # TODO: add SBA 24.4 kbps back once #185 is fixed - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v "SBA_b24_4") - - scripts/runIvasCodec.py -p scripts/config/ci_linux_ltv.json -m $modes -s -bs_length 50 + - scripts/runIvasCodec.py -p scripts/config/ci_linux_ltv.json -m $modes -s --bs_length 100 # --------------------------------------------------------------- # Test jobs for main branch -- GitLab From 24cfe6566acd2e4b01857ecf441bd7dbe53e89c9 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 15 Nov 2022 10:53:02 +0100 Subject: [PATCH 007/381] actually return exit code from runIvasCodec.py --- scripts/runIvasCodec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/runIvasCodec.py b/scripts/runIvasCodec.py index 288095bb2a..ff4637039d 100755 --- a/scripts/runIvasCodec.py +++ b/scripts/runIvasCodec.py @@ -150,4 +150,4 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript): if __name__ == "__main__": script = RunIvasCodec() - script.run() + sys.exit(script.run()) -- GitLab From 0b8e9f066df11783a7432d8eafe7e624e3b22408 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 15 Nov 2022 11:09:40 +0100 Subject: [PATCH 008/381] fix error for end-of-bitstream case --- scripts/cut_bs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cut_bs.py b/scripts/cut_bs.py index bd1978ebe5..cff74952a9 100755 --- a/scripts/cut_bs.py +++ b/scripts/cut_bs.py @@ -47,7 +47,7 @@ def cut_to_length(fp, fp_out, length): for f in range(length): sync_word = fp.read(2) if sync_word == b"": - return (fr_cnt, cut_cnt) + return fr_cnt if sync_word not in SYNC_WORDS: raise ValueError("Bad Sync word!") n_bits_bs = fp.read(2) -- GitLab From 864bdde5a3852d60427524611c8a8e34b680d92b Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 15 Nov 2022 13:56:21 +0100 Subject: [PATCH 009/381] add json file for sidstart test --- scripts/config/ci_linux_sidstart_test.json | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 scripts/config/ci_linux_sidstart_test.json diff --git a/scripts/config/ci_linux_sidstart_test.json b/scripts/config/ci_linux_sidstart_test.json new file mode 100644 index 0000000000..4fe5ae589e --- /dev/null +++ b/scripts/config/ci_linux_sidstart_test.json @@ -0,0 +1,25 @@ +{ + "afspPath": "not_needed", + "utilPath": "/tools", + "inpaths": { + "MONO": "/usr/local/testv/test_mono.wav", + "STEREO": "/usr/local/testv/test_stereo.wav", + "FOA": "/usr/local/testv/test_FOA.wav", + "HOA2": "/usr/local/testv/test_HOA2.wav", + "HOA3": "/usr/local/testv/test_HOA3.wav", + "SBA": "/usr/local/testv/test_HOA3.wav", + "MASA1TC1DIR": "/usr/local/testv/test_MASA_1dir1TC.wav", + "MASA1TC2DIR": "/usr/local/testv/test_MASA_2dir1TC.wav", + "MASA2TC1DIR": "/usr/local/testv/test_MASA_1dir2TC.wav", + "MASA2TC2DIR": "/usr/local/testv/test_MASA_2dir2TC.wav", + "5_1": "/usr/local/testv/test_MC51.wav", + "5_1_2": "/usr/local/testv/test_MC51p2.wav", + "5_1_4": "/usr/local/testv/test_MC51p4.wav", + "7_1": "/usr/local/testv/test_MC71.wav", + "7_1_4": "/usr/local/testv/test_MC71p4.wav", + "ISM1": "/usr/local/testv/test_mono.wav", + "ISM2": "/usr/local/testv/test_ISM_2obj.wav", + "ISM3": "/usr/local/testv/test_ISM_3obj.wav", + "ISM4": "/usr/local/testv/test_ISM_4obj.wav" + } +} -- GitLab From 9a9dca59619985cd99f45a50e16084bf53bb44bd Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 15 Nov 2022 14:15:46 +0100 Subject: [PATCH 010/381] add job for test, modified testvectors and config --- .gitlab-ci.yml | 12 ++++++++++-- scripts/config/ci_linux_sidstart_test.json | 8 ++++---- scripts/testv/test_MASA_1dir1TC.met | 4 ++-- scripts/testv/test_MASA_1dir1TC.wav | 4 ++-- scripts/testv/test_MASA_1dir2TC.met | 4 ++-- scripts/testv/test_MASA_1dir2TC.wav | 4 ++-- scripts/testv/test_mono.wav | 4 ++-- scripts/testv/test_stereo.wav | 4 ++-- 8 files changed, 26 insertions(+), 18 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 310ba289fc..4c67efc5fc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -601,6 +601,7 @@ clang-format-check: check-first-frame-is-sid: extends: - .test-job-linux + - .rules-merge-request tags: - ivas-linux stage: test @@ -610,9 +611,16 @@ check-first-frame-is-sid: - cmake . - make -j + # TODO: for some MASA modes, we currently do not have testvectors that actually trigger DTX # TODO: add SBA 24.4 kbps back once #185 is fixed - - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v "SBA_b24_4") - - scripts/runIvasCodec.py -p scripts/config/ci_linux_ltv.json -m $modes -s --bs_length 100 + - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v "SBA_b24_4" | grep -v MASA) + - scripts/runIvasCodec.py -p scripts/config/ci_linux_sidstart_test.json -m $modes -s --bs_length 500 + artifacts: + paths: + - out/logs + when: on_failure + name: "$CI_JOB_NAME--$CI_MERGE_REQUEST_IID--sha-$CI_COMMIT_SHORT_SHA--sidstart" + expose_as: "logs-sidstart" # --------------------------------------------------------------- # Test jobs for main branch diff --git a/scripts/config/ci_linux_sidstart_test.json b/scripts/config/ci_linux_sidstart_test.json index 4fe5ae589e..3436d9eaea 100644 --- a/scripts/config/ci_linux_sidstart_test.json +++ b/scripts/config/ci_linux_sidstart_test.json @@ -4,10 +4,10 @@ "inpaths": { "MONO": "/usr/local/testv/test_mono.wav", "STEREO": "/usr/local/testv/test_stereo.wav", - "FOA": "/usr/local/testv/test_FOA.wav", - "HOA2": "/usr/local/testv/test_HOA2.wav", - "HOA3": "/usr/local/testv/test_HOA3.wav", - "SBA": "/usr/local/testv/test_HOA3.wav", + "FOA": "/usr/local/ltv/ltv48_FOA.wav", + "HOA2": "/usr/local/ltv/ltv48_HOA2.wav", + "HOA3": "/usr/local/ltv/ltv48_HOA3.wav", + "SBA": "/usr/local/ltv/ltv48_HOA3.wav", "MASA1TC1DIR": "/usr/local/testv/test_MASA_1dir1TC.wav", "MASA1TC2DIR": "/usr/local/testv/test_MASA_2dir1TC.wav", "MASA2TC1DIR": "/usr/local/testv/test_MASA_1dir2TC.wav", diff --git a/scripts/testv/test_MASA_1dir1TC.met b/scripts/testv/test_MASA_1dir1TC.met index f2ce23bd20..945a81f0b4 100644 --- a/scripts/testv/test_MASA_1dir1TC.met +++ b/scripts/testv/test_MASA_1dir1TC.met @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6349efe3448d28979b80744bcdc29d57f1c025704939b42d7b913d7fc3f23ccc -size 102300 +oid sha256:64b974b376ef0ca29da837d33173c621499d753800ebf5e5587019ee5db481bd +size 684728 diff --git a/scripts/testv/test_MASA_1dir1TC.wav b/scripts/testv/test_MASA_1dir1TC.wav index 9291feeee3..880098c1b4 100644 --- a/scripts/testv/test_MASA_1dir1TC.wav +++ b/scripts/testv/test_MASA_1dir1TC.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:54ea4543e4d6d43c312f1e461a75a3d8ce18e34bfb5777f15f2e494dd277d2e5 -size 288106 +oid sha256:d3e49f9bca73feee2717df5f4df1eaf7d3d564eb4ed31e6b5fd4dea0e86950dc +size 1933224 diff --git a/scripts/testv/test_MASA_1dir2TC.met b/scripts/testv/test_MASA_1dir2TC.met index 00acdae539..f6e0e439a0 100644 --- a/scripts/testv/test_MASA_1dir2TC.met +++ b/scripts/testv/test_MASA_1dir2TC.met @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a1f87bfe360dbd221a94583aa68a58ef050e968a63351730d643f2dc2cac4e1 -size 204600 +oid sha256:2ec41c82c305f075c67b51e1f0a6e97dfc272bafcfca64e38c902c9f0d2c4500 +size 684728 diff --git a/scripts/testv/test_MASA_1dir2TC.wav b/scripts/testv/test_MASA_1dir2TC.wav index aefec77efe..f25eb24353 100644 --- a/scripts/testv/test_MASA_1dir2TC.wav +++ b/scripts/testv/test_MASA_1dir2TC.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab7437cdf41e56338c93f5e593118a112a48bae5138be2cdd301eff5da59bb06 -size 1152106 +oid sha256:97f1a7a43012ce166b929df59bd756f5d96433ea00ce0a1005380368c01619a0 +size 3855404 diff --git a/scripts/testv/test_mono.wav b/scripts/testv/test_mono.wav index b841d174c3..a29e0da33b 100644 --- a/scripts/testv/test_mono.wav +++ b/scripts/testv/test_mono.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5daeac3fb92d487fc7ded7d1a4a9e6295d2f2f27f59f19dcdaeebaae01908a86 -size 1920106 +oid sha256:712477a74d65fce8797a03d39bde669f8c285247589c1137a96c871d82fc747b +size 3782444 diff --git a/scripts/testv/test_stereo.wav b/scripts/testv/test_stereo.wav index 70dc46062e..ebea24307b 100644 --- a/scripts/testv/test_stereo.wav +++ b/scripts/testv/test_stereo.wav @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e0de400200071a7b26de03eaef88b49efce7a5df813b971336ed17b90ba02aa2 -size 3840106 +oid sha256:5038043354f9c27899d92f81b3c00702db5e341f912ed01d310c2015272e79aa +size 7564844 -- GitLab From a9394ece9b5ee870de60692f80640a53ff14560a Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 15 Nov 2022 14:34:28 +0100 Subject: [PATCH 011/381] add necessary setup to job --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4c67efc5fc..1572d4b211 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -600,7 +600,7 @@ clang-format-check: # check for crashes if first received frame on decoder side is an SID check-first-frame-is-sid: extends: - - .test-job-linux + - .test-job-linux-needs-testv-dir - .rules-merge-request tags: - ivas-linux @@ -608,12 +608,14 @@ check-first-frame-is-sid: needs: ["build-codec-linux-cmake"] script: - *print-common-info + - *update-ltv-repo - cmake . - make -j # TODO: for some MASA modes, we currently do not have testvectors that actually trigger DTX # TODO: add SBA 24.4 kbps back once #185 is fixed - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v "SBA_b24_4" | grep -v MASA) + - echo $modes - scripts/runIvasCodec.py -p scripts/config/ci_linux_sidstart_test.json -m $modes -s --bs_length 500 artifacts: paths: -- GitLab From be9605c50778dfb72260bcb773d52c59e4d16305 Mon Sep 17 00:00:00 2001 From: Fredrik Jansson Date: Wed, 12 Apr 2023 11:01:28 +0200 Subject: [PATCH 012/381] Add fix for issue 395 --- lib_com/options.h | 2 ++ lib_enc/ivas_cpe_enc.c | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index ba44aa63b9..238a1a9a04 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,6 +166,8 @@ #define FIX_ISM_DTX_CLICKS /* FhG: fix for clicks in ISM DTX for inactive to active TCX transitions */ +#define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index f9b787ac56..2d8521547d 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -569,8 +569,11 @@ ivas_error ivas_cpe_enc( #ifdef DEBUG_MODE_DFT hCPE->hStereoDft->res_cod_bits = 0; #endif - +#ifdef FIX_395_CNG_BW + stereo_dft_enc_update( hCPE->hStereoDft, min( SWB, sts[0]->bwidth ) ); +#else stereo_dft_enc_update( hCPE->hStereoDft, min( SWB, sts[0]->max_bwidth ) ); +#endif } else { -- GitLab From dd88b91f2e483793760852cf37aabe291cf28839 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Wed, 12 Apr 2023 21:27:01 +0300 Subject: [PATCH 013/381] Implementation of contribution 41, orientation information handling --- Workspace_msvc/lib_util.vcxproj | 2 + apps/decoder.c | 112 ++++ apps/renderer.c | 81 +++ lib_com/ivas_error.h | 3 + lib_com/ivas_prot.h | 4 + lib_com/options.h | 1 + lib_dec/ivas_binRenderer_internal.c | 36 ++ lib_dec/ivas_dec.c | 28 + lib_dec/ivas_dirac_dec.c | 24 + lib_dec/ivas_init_dec.c | 52 ++ lib_dec/ivas_ism_renderer.c | 10 + lib_dec/ivas_mc_param_dec.c | 18 + lib_dec/ivas_objectRenderer_internal.c | 13 + lib_dec/ivas_output_config.c | 12 + lib_dec/ivas_stat_dec.h | 7 + lib_dec/lib_dec.c | 66 +++ lib_dec/lib_dec.h | 15 + lib_rend/ivas_crend.c | 36 ++ lib_rend/ivas_dirac_dec_binaural_functions.c | 52 +- lib_rend/ivas_objectRenderer.c | 24 +- lib_rend/ivas_orient_trk.c | 12 + lib_rend/ivas_prot_rend.h | 99 ++++ lib_rend/ivas_rotation.c | 575 +++++++++++++++++++ lib_rend/ivas_stat_rend.h | 40 ++ lib_rend/lib_rend.c | 320 ++++++++++- lib_rend/lib_rend.h | 20 + lib_util/external_orientation_file_reader.c | 183 ++++++ lib_util/external_orientation_file_reader.h | 63 ++ 28 files changed, 1897 insertions(+), 11 deletions(-) create mode 100644 lib_util/external_orientation_file_reader.c create mode 100644 lib_util/external_orientation_file_reader.h diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 5b5e5f30cc..25aeb8b940 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -144,6 +144,7 @@ + @@ -167,6 +168,7 @@ + diff --git a/apps/decoder.c b/apps/decoder.c index 2b7268854a..0d52fed063 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -42,6 +42,9 @@ #include "ls_custom_file_reader.h" #include "hrtf_file_reader.h" #include "head_rotation_file_reader.h" +#ifdef EXTERNAL_ORIENTATIONS +#include "external_orientation_file_reader.h" +#endif #ifdef OTR_REFERENCE_VECTOR_TRACKING #include "vector3_pair_file_reader.h" #endif /* OTR_REFERENCE_VECTOR_TRACKING */ @@ -105,6 +108,10 @@ typedef struct bool enableReferenceVectorTracking; char *referenceVectorTrajFileName; #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + bool enableExternalOrientation; + char *externalOrientationTrajFileName; +#endif #ifdef SUPPORT_JBM_TRACEFILE char *jbmTraceFilename; #endif @@ -142,13 +149,25 @@ static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); #ifdef FIX_I109_ORIENTATION_TRACKING #ifdef OTR_REFERENCE_VECTOR_TRACKING +#ifdef EXTERNAL_ORIENTATIONS +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ExternalOrientationFileReader *externalOrientationFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +#else static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +#endif #else /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, ExternalOrientationFileReader *externalOrientationFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +#else static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #endif +#endif +#else /* FIX_I109_ORIENTATION_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, ExternalOrientationFileReader *externalOrientationFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #else static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #endif +#endif static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); #ifdef DEBUGGING static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); @@ -180,6 +199,9 @@ int main( #ifdef OTR_REFERENCE_VECTOR_TRACKING Vector3PairFileReader *referenceVectorReader = NULL; #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + ExternalOrientationFileReader *externalOrientationFileReader = NULL; +#endif ivas_error error = IVAS_ERR_UNKNOWN; int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; RenderConfigReader *renderConfigReader = NULL; @@ -316,6 +338,21 @@ int main( } #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + /*------------------------------------------------------------------------------------------* + * Open external orientation file + *------------------------------------------------------------------------------------------*/ + + if ( arg.enableExternalOrientation ) + { + if ( ( error = ExternalOrientationFileReader_open( arg.externalOrientationTrajFileName, &externalOrientationFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open external orientation file %s \n\n", arg.externalOrientationTrajFileName ); + goto cleanup; + } + } +#endif + /*------------------------------------------------------------------------------------------* * Open custom loudspeaker layout file *------------------------------------------------------------------------------------------*/ @@ -353,7 +390,11 @@ int main( * Configure the decoder *------------------------------------------------------------------------------------------*/ +#ifdef EXTERNAL_ORIENTATIONS + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -574,12 +615,24 @@ int main( { #ifdef FIX_I109_ORIENTATION_TRACKING #ifdef OTR_REFERENCE_VECTOR_TRACKING +#ifdef EXTERNAL_ORIENTATIONS + error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, externalOrientationFileReader, hIvasDec, pcmBuf ); +#else error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); +#endif +#else +#ifdef EXTERNAL_ORIENTATIONS + error = decodeG192( arg, hBsReader, headRotReader, refRotReader, externalOrientationFileReader, hIvasDec, pcmBuf ); #else error = decodeG192( arg, hBsReader, headRotReader, refRotReader, hIvasDec, pcmBuf ); +#endif #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#else +#ifdef EXTERNAL_ORIENTATIONS + error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, hIvasDec, pcmBuf ); #else error = decodeG192( arg, hBsReader, headRotReader, hIvasDec, pcmBuf ); +#endif #endif } @@ -642,6 +695,9 @@ cleanup: #ifdef OTR_REFERENCE_VECTOR_TRACKING Vector3PairFileReader_close( &referenceVectorReader ); #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + ExternalOrientationFileReader_close( &externalOrientationFileReader ); +#endif RenderConfigReader_close( &renderConfigReader ); if ( BS_Reader_Close( &hBsReader ) != IVAS_ERR_OK ) @@ -789,6 +845,10 @@ static bool parseCmdlIVAS_dec( #else arg->orientation_tracking = IVAS_PUBLIC_ORIENT_TRK_REF; #endif +#ifdef EXTERNAL_ORIENTATIONS + arg->enableExternalOrientation = false; + arg->externalOrientationTrajFileName = NULL; +#endif #ifdef SUPPORT_JBM_TRACEFILE arg->jbmTraceFilename = NULL; @@ -1043,6 +1103,23 @@ static bool parseCmdlIVAS_dec( i++; } #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + else if ( strcmp( argv_to_upper, "-EXOF" ) == 0 ) + { + arg->enableExternalOrientation = true; + i++; + + if ( argc - i <= 4 || argv[i][0] == '-' ) + { + fprintf( stderr, "Error: External orientation file name not specified!\n\n" ); + usage_dec(); + return false; + } + + arg->externalOrientationTrajFileName = argv[i]; + i++; + } +#endif else if ( strcmp( argv_to_upper, "-RENDER_CONFIG" ) == 0 ) { arg->renderConfigEnabled = true; @@ -1251,6 +1328,9 @@ static void usage_dec( void ) fprintf( stdout, " left or l or 1->left, right or r or -1->right, center or c or 0->middle\n" ); fprintf( stdout, "-q : Quiet mode, no frame counter\n" ); fprintf( stdout, " default is deactivated\n" ); +#ifdef EXTERNAL_ORIENTATIONS + fprintf( stdout, "-exof File : External orientation file for external orientation trajectory\n" ); +#endif #ifdef DEBUG_MODE_INFO #ifdef DEBUG_MODE_INFO_TWEAK fprintf( stdout, "-info : specify subfolder name for debug output\n" ); @@ -1484,6 +1564,9 @@ static ivas_error decodeG192( #ifdef OTR_REFERENCE_VECTOR_TRACKING Vector3PairFileReader *referenceVectorReader, #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#endif +#ifdef EXTERNAL_ORIENTATIONS + ExternalOrientationFileReader *externalOrientationFileReader, #endif IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ) @@ -1664,6 +1747,35 @@ static ivas_error decodeG192( goto cleanup; } } + +#ifdef EXTERNAL_ORIENTATIONS + if ( arg.enableExternalOrientation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + + if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &Quaternions[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading external orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), + ExternalOrientationFileReader_getFilePath( externalOrientationFileReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_FeedExternalOrientationData( hIvasDec, Quaternions, enableHeadRotation, enableExternalOrientation, enableRotationInterpolation, numFramesToTargetOrientation ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedExternalOrientationData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif + /* Run decoder for one frame (get rendered output) */ if ( ( error = IVAS_DEC_GetSamples( hIvasDec, pcmBuf, &nOutSamples ) ) != IVAS_ERR_OK ) { diff --git a/apps/renderer.c b/apps/renderer.c index 5e8ca98e9c..460282e7a7 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -45,6 +45,9 @@ #ifdef OTR_REFERENCE_VECTOR_TRACKING #include "vector3_pair_file_reader.h" #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS +#include "external_orientation_file_reader.h" +#endif #include "hrtf_file_reader.h" #include "ism_file_reader.h" #include "ls_custom_file_reader.h" @@ -138,6 +141,9 @@ typedef struct char referenceVectorFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; #endif /* OTR_REFERENCE_VECTOR_TRACKING */ char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; +#endif +#ifdef EXTERNAL_ORIENTATIONS + char externalOrientationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; #endif char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; @@ -178,6 +184,9 @@ typedef enum #ifdef OTR_REFERENCE_VECTOR_TRACKING CmdLnOptionId_referenceVectorFile, #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + CmdLnOptionId_exteriorOrientationFile, +#endif } CmdLnOptionId; static const CmdLnParser_Option cliOptions[] = { @@ -303,6 +312,14 @@ static const CmdLnParser_Option cliOptions[] = { .description = "Reference vector trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", }, #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + { + .id = CmdLnOptionId_exteriorOrientationFile, + .match = "exterior_orientation_file", + .matchShort = "exof", + .description = "External orientation trajectory file for simulation of external orientations", + }, +#endif }; @@ -534,6 +551,9 @@ int main( Vector3PairFileReader *referenceVectorReader = NULL; #endif /* OTR_REFERENCE_VECTOR_TRACKING */ HeadRotFileReader *referenceRotReader = NULL; +#endif +#ifdef EXTERNAL_ORIENTATIONS + ExternalOrientationFileReader *externalOrientationFileReader = NULL; #endif hrtfFileReader *hrtfFileReader = NULL; IsmPositionProvider *positionProvider; @@ -592,6 +612,9 @@ int main( convert_backslash( args.referenceVectorFilePath ); #endif /* OTR_REFERENCE_VECTOR_TRACKING */ convert_backslash( args.referenceRotationFilePath ); +#endif +#ifdef EXTERNAL_ORIENTATIONS + convert_backslash( args.externalOrientationFilePath ); #endif convert_backslash( args.inLfePanningMatrixFile ); @@ -625,6 +648,17 @@ int main( #endif /* OTR_REFERENCE_VECTOR_TRACKING */ #endif +#ifdef EXTERNAL_ORIENTATIONS + if ( !isEmptyString( args.externalOrientationFilePath ) ) + { + if ( ExternalOrientationFileReader_open( args.externalOrientationFilePath, &externalOrientationFileReader ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error opening file: %s\n", args.externalOrientationFilePath ); + exit( -1 ); + } + } +#endif + if ( !isEmptyString( args.customHrtfFilePath ) ) { if ( hrtfFileReader_open( args.customHrtfFilePath, &hrtfFileReader ) != IVAS_ERR_OK ) @@ -1053,6 +1087,41 @@ int main( } } +#ifdef EXTERNAL_ORIENTATIONS + /* Read from external orientation file if specified */ + if ( externalOrientationFileReader != NULL ) + { + IVAS_QUATERNION quatBuffer[RENDERER_HEAD_POSITIONS_PER_FRAME]; + int8_t enableHeadRotation[RENDERER_HEAD_POSITIONS_PER_FRAME]; + int8_t enableExternalOrientation[RENDERER_HEAD_POSITIONS_PER_FRAME]; + int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; i++ ) + { + if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &quatBuffer[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in External Orientation File Reading: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + if ( ( error = IVAS_REND_SetExternalOrientation( hIvasRend, quatBuffer, enableHeadRotation, enableExternalOrientation, enableRotationInterpolation, numFramesToTargetOrientation ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error setting External Orientation: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + /* Combine external orientations and head rotation */ + + if ( ( error = IVAS_REND_CombineHeadAndExternalOrientation( hIvasRend ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error combining external and head orientations: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } +#endif + for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { if ( ( error = IVAS_REND_GetInputNumChannels( hIvasRend, mcIds[i], &numChannels ) ) != IVAS_ERR_OK ) @@ -1231,6 +1300,9 @@ int main( Vector3PairFileReader_close( &referenceVectorReader ); #endif /* OTR_REFERENCE_VECTOR_TRACKING */ HeadRotationFileReader_close( &referenceRotReader ); +#endif +#ifdef EXTERNAL_ORIENTATIONS + ExternalOrientationFileReader_close( &externalOrientationFileReader ); #endif hrtfFileReader_close( &hrtfFileReader ); IVAS_REND_Close( &hIvasRend ); @@ -1707,6 +1779,9 @@ static CmdlnArgs defaultArgs( clearString( args.referenceVectorFilePath ); #endif /* OTR_REFERENCE_VECTOR_TRACKING */ clearString( args.referenceRotationFilePath ); +#endif +#ifdef EXTERNAL_ORIENTATIONS + clearString( args.externalOrientationFilePath ); #endif clearString( args.customHrtfFilePath ); clearString( args.renderConfigFilePath ); @@ -1801,6 +1876,12 @@ static void parseOption( assert( numOptionValues == 1 ); strncpy( args->referenceRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; +#endif +#ifdef EXTERNAL_ORIENTATIONS + case CmdLnOptionId_exteriorOrientationFile: + assert( numOptionValues == 1 ); + strncpy( args->externalOrientationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); + break; #endif case CmdLnOptionId_customHrtfFile: assert( numOptionValues == 1 ); diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 9438ad44a1..afdc4ffcbc 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -76,6 +76,9 @@ typedef enum IVAS_ERR_WRONG_MODE, IVAS_ERR_INVALID_OUTPUT_FORMAT, IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, +#ifdef EXTERNAL_ORIENTATIONS + IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, +#endif IVAS_ERR_INVALID_HRTF, IVAS_ERR_INVALID_INPUT_FORMAT, IVAS_ERR_INVALID_INDEX, diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 90930b0731..10174f92da 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4589,6 +4589,10 @@ void ivas_binaural_cldfb( void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ + int16_t subframe_idx, /* i : subframe index */ +#endif float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ diff --git a/lib_com/options.h b/lib_com/options.h index 1c133b109b..bd5e9f07db 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -160,6 +160,7 @@ #define FIX_380_BFI_PARAMISM /* VA: issue 380 - fix metadata recovery in ParamISM BFI */ +#define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 2db5602519..6858f8653c 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -709,7 +709,11 @@ ivas_error ivas_binRenderer_open( ivas_dirac_dec_get_response( (int16_t) ls_azimuth_CICP19[k], (int16_t) ls_elevation_CICP19[k], hBinRenderer->hReverb->foa_enc[k], 1 ); } } +#ifdef EXTERNAL_ORIENTATIONS + else if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) +#else else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->hDecoderConfig->Opt_Headrotation ) +#endif { if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) { @@ -939,7 +943,11 @@ void ivas_binaural_cldfb( } /* Implement binaural rendering */ +#ifdef EXTERNAL_ORIENTATIONS + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframeIdx, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#endif /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) @@ -973,6 +981,10 @@ void ivas_binaural_cldfb( void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ + int16_t subframe_idx, /* i : subframe index */ +#endif float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -995,6 +1007,29 @@ void ivas_binRenderer( } } +#ifdef EXTERNAL_ORIENTATIONS + /* Head rotation in HOA3 or CICPx */ + if ( hHeadTrackData && hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && hBinRenderer->rotInCldfb ) + { + if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) + { + /* Rotation in SHD (HOA3) */ + if ( hHeadTrackData->shd_rot_max_order == -1 ) + { + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, 3 ); + } + else if ( hHeadTrackData->shd_rot_max_order > 0 ) + { + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, hHeadTrackData->shd_rot_max_order ); + } + } + else + { + /* Rotation in SD (CICPx) */ + rotateFrame_sd_cldfb( hCombinedOrientationData->Rmat[subframe_idx], RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band ); + } + } +#else /* Head rotation in HOA3 or CICPx */ if ( hHeadTrackData && hHeadTrackData->num_quaternions >= 0 && hBinRenderer->rotInCldfb ) { @@ -1017,6 +1052,7 @@ void ivas_binRenderer( rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band ); } } +#endif /* HOA decoding to CICP19 if needed*/ if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 ) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 45f31e9f84..e154317da1 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -97,6 +97,18 @@ ivas_error ivas_dec( output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); +#ifdef EXTERNAL_ORIENTATIONS + /*----------------------------------------------------------------* + * Combine orientations + *----------------------------------------------------------------*/ + + if ( ( error = combine_external_and_head_orientations_dec(st_ivas->hHeadTrackData, st_ivas->hExtOrientationData, + st_ivas->hCombinedOrientationData) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + /*----------------------------------------------------------------* * Decoding + Rendering *----------------------------------------------------------------*/ @@ -174,7 +186,11 @@ ivas_error ivas_dec( { ivas_param_ism_params_to_masa_param_mapping( st_ivas ); +#ifdef EXTERNAL_ORIENTATIONS + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, output, st_ivas->nchan_transport ); +#else ivas_dirac_dec_binaural( st_ivas, output, st_ivas->nchan_transport ); +#endif } else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) { @@ -365,7 +381,11 @@ ivas_error ivas_dec( /* Loudspeakers, Ambisonics or Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { +#ifdef EXTERNAL_ORIENTATIONS + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, output, nchan_remapped ); +#else ivas_dirac_dec_binaural( st_ivas, output, nchan_remapped ); +#endif } else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT ) { @@ -426,7 +446,11 @@ ivas_error ivas_dec( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { +#ifdef EXTERNAL_ORIENTATIONS + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hCombinedOrientationData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -562,7 +586,11 @@ ivas_error ivas_dec( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { +#ifdef EXTERNAL_ORIENTATIONS + ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, output, st_ivas->nchan_transport ); +#else ivas_dirac_dec_binaural( st_ivas, output, st_ivas->nchan_transport ); +#endif } else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ { diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 4d3d1adb3c..df1798405a 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2170,11 +2170,17 @@ void ivas_dirac_dec( set_zero( onset_filter_subframe, hDirAC->num_freq_bands ); } +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hHeadTrackData && st_ivas->hCombinedOrientationData ) + { + p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[subframe_idx][0][0]; +#else if ( st_ivas->hHeadTrackData ) { QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; +#endif if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { @@ -2240,7 +2246,11 @@ void ivas_dirac_dec( } } +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) +#else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) +#endif { ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, @@ -2321,7 +2331,12 @@ void ivas_dirac_dec( if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { + +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) +#else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) +#endif { protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, @@ -2547,7 +2562,12 @@ void ivas_dirac_dec( } /*Compute PSDs*/ + +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 2 ) +#else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 2 ) +#endif { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, @@ -2622,6 +2642,10 @@ void ivas_dirac_dec( /* Perform binaural rendering */ ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData, + subframe_idx, +#endif Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index aeddb3b1b0..6d84cfec52 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -611,6 +611,32 @@ ivas_error ivas_init_decoder_front( } } +#ifdef EXTERNAL_ORIENTATIONS + /*-------------------------------------------------------------------* + * Allocate and initialize external orientation handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + if ( ( error = ivas_external_orientation_open( &( st_ivas->hExtOrientationData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-------------------------------------------------------------------* + * Allocate and initialize combined orientation handle + *--------------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + if ( ( error = ivas_combined_orientation_open( &( st_ivas->hCombinedOrientationData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + /*-------------------------------------------------------------------* * Allocate HRTF binary handle *--------------------------------------------------------------------*/ @@ -1289,7 +1315,11 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) +#else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && st_ivas->hDecoderConfig->Opt_Headrotation ) +#endif { if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) { @@ -1625,6 +1655,10 @@ void ivas_initialize_handles_dec( st_ivas->hHrtfTD = NULL; st_ivas->hLsSetupCustom = NULL; st_ivas->hRenderConfig = NULL; +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hExtOrientationData = NULL; + st_ivas->hCombinedOrientationData = NULL; +#endif return; } @@ -1788,6 +1822,14 @@ void ivas_destroy_dec( } #endif +#ifdef EXTERNAL_ORIENTATIONS + /* External orientation data handle */ + ivas_external_orientation_close( &st_ivas->hExtOrientationData ); + + /* Combined orientation data handle */ + ivas_combined_orientation_close( &st_ivas->hCombinedOrientationData ); +#endif + /* Time Domain binaural renderer handle */ if ( st_ivas->hBinRendererTd != NULL ) { @@ -2073,6 +2115,16 @@ static ivas_error doSanityChecks_IVAS( } } +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) + { + return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); + } + } +#endif + #ifdef DEBUGGING if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) { diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index a965a0ffed..16a9d7c156 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -109,7 +109,9 @@ void ivas_ism_render( float g1, g2; int16_t num_objects, nchan_out_woLFE, lfe_index; int16_t azimuth, elevation; +#ifndef EXTERNAL_ORIENTATIONS float Rmat[3][3]; +#endif num_objects = st_ivas->nchan_transport; nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; @@ -131,11 +133,13 @@ void ivas_ism_render( set_f( output_f[i], 0.0f, output_frame ); } +#ifndef EXTERNAL_ORIENTATIONS if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) { /* Calculate rotation matrix from the quaternion */ QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat ); } +#endif for ( i = 0; i < num_objects; i++ ) { @@ -148,10 +152,16 @@ void ivas_ism_render( } else { +#ifdef EXTERNAL_ORIENTATIONS + /* Combined rotation: rotate the object positions depending the head and external orientations */ + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1) { + rotateAziEle(st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup); +#else /* Head rotation: rotate the object positions depending the head's orientation */ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); +#endif } else { diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index a6637ed1f2..c7745650d9 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -421,8 +421,14 @@ ivas_error ivas_param_mc_dec_open( } + +#ifdef EXTERNAL_ORIENTATIONS + /* Head or external rotation */ + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) +#else /* Head rotation */ if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && st_ivas->hDecoderConfig->Opt_Headrotation ) +#endif { if ( ( hParamMC->hoa_encoder = (float *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( float ) ) ) == NULL ) { @@ -1387,7 +1393,11 @@ void ivas_param_mc_dec( { nchan_out_cldfb = BINAURAL_CHANNELS; set_s( channel_active, 1, nchan_out_cldfb ); +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hHeadTrackData && st_ivas->hCombinedOrientationData ) +#else if ( st_ivas->hHeadTrackData ) +#endif { nchan_out_init = MAX_INTERN_CHANNELS; } @@ -1548,7 +1558,11 @@ void ivas_param_mc_dec( if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) { +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hHeadTrackData && st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) +#else if ( st_ivas->hHeadTrackData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) +#endif { ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); } @@ -1610,7 +1624,11 @@ void ivas_param_mc_dec( if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { +#ifdef EXTERNAL_ORIENTATIONS + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframe_idx, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#endif } else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) { diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index d06a2b8f5b..9815002110 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -81,9 +81,22 @@ ivas_error ivas_td_binaural_renderer( st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, #ifdef TD5 +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hIsmMetaData, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation : NULL, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, + ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); +#else st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); +#endif +#else +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hIsmMetaData, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation : NULL, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, #else st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, output, output_frame ); #endif +#endif } diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index f38e810ce3..9a542f0797 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -191,9 +191,17 @@ void ivas_renderer_select( if ( output_config == AUDIO_CONFIG_BINAURAL ) { #ifdef DEBUGGING +#ifdef EXTERNAL_ORIENTATIONS + if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) +#else if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) +#endif +#else +#ifdef EXTERNAL_ORIENTATIONS + if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && ( st_ivas->mc_mode == MC_MODE_MCT ) ) #else if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT ) ) +#endif #endif { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; @@ -219,7 +227,11 @@ void ivas_renderer_select( *renderer_type = RENDERER_BINAURAL_FASTCONV; } #endif +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) +#else if ( st_ivas->hDecoderConfig->Opt_Headrotation ) +#endif { /* force HOA3 domain for rotation*/ *internal_config = AUDIO_CONFIG_HOA3; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index d8c0f65349..0e2332ac1a 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1148,6 +1148,9 @@ typedef struct decoder_config_structure int16_t orientation_tracking; /* indicates orientation tracking type */ float no_diegetic_pan; int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ +#ifdef EXTERNAL_ORIENTATIONS + int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ +#endif /* temp. development parameters */ #ifdef DEBUGGING @@ -1240,6 +1243,10 @@ typedef struct Decoder_Struct HEAD_TRACK_DATA_HANDLE hHeadTrackData; /* Head tracking data structure */ RENDER_CONFIG_DATA *hRenderConfig; /* Renderer config pointer */ int32_t binaural_latency_ns; /* Binauralization latency in ns */ +#ifdef EXTERNAL_ORIENTATIONS + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData; /* External orientation data structure */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; /* Combined external and head orientation data structure */ +#endif #ifdef DEBUGGING int32_t noClipping; /* number of clipped samples */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 61c9494e30..e81a137cff 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -226,6 +226,9 @@ static void init_decoder_config( hDecoderConfig->Opt_RendConfigCustom = 0; hDecoderConfig->orientation_tracking = orientation_tracking; hDecoderConfig->no_diegetic_pan = no_diegetic_pan; +#ifdef EXTERNAL_ORIENTATIONS + hDecoderConfig->Opt_ExternalOrientation = 0; +#endif return; } @@ -388,6 +391,9 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ +#ifdef EXTERNAL_ORIENTATIONS + const int16_t enableExternalOrientation, /* i : enable external orientations */ +#endif const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ) { @@ -438,6 +444,9 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_Headrotation = enableHeadRotation; hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; +#ifdef EXTERNAL_ORIENTATIONS + hDecoderConfig->Opt_ExternalOrientation = enableExternalOrientation; +#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) @@ -1003,6 +1012,52 @@ ivas_error IVAS_DEC_FeedRefVectorData( #endif /* OTR_REFERENCE_VECTOR_TRACKING */ #endif +#ifdef EXTERNAL_ORIENTATIONS +/*---------------------------------------------------------------------* + * IVAS_DEC_FeedExternalOrientationData( ) + * + * Feed the decoder with the external orientation data + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_FeedExternalOrientationData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + int8_t *enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ +) +{ + EXTERNAL_ORIENTATION_HANDLE hExternalOrientationData; + int16_t i; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || orientation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hExternalOrientationData = hIvasDec->st_ivas->hExtOrientationData; + + if ( hExternalOrientationData == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Move external orientation data to the decoder handle (invert orientations) */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + QuaternionInverse( orientation[i], &hExternalOrientationData->Quaternions[i] ); + + hExternalOrientationData->enableHeadRotation[i] = enableHeadRotation[i]; + hExternalOrientationData->enableExternalOrientation[i] = enableExternalOrientation[i]; + hExternalOrientationData->enableRotationInterpolation[i] = enableRotationInterpolation[i]; + hExternalOrientationData->numFramesToTargetOrientation[i] = numFramesToTargetOrientation[i]; + } + + return IVAS_ERR_OK; +} +#endif + /*---------------------------------------------------------------------* * IVAS_DEC_FeedCustomLsData( ) * @@ -1805,6 +1860,10 @@ const char *IVAS_DEC_GetErrorMessage( return "invalid sampling rate"; case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: return "head rotation not supported"; +#ifdef EXTERNAL_ORIENTATIONS + case IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED: + return "external orientation not supported"; +#endif case IVAS_ERR_INVALID_HRTF: return "Not supported HRTF filter set"; case IVAS_ERR_INVALID_INPUT_FORMAT: @@ -2023,6 +2082,13 @@ static ivas_error printConfigInfo_dec( { fprintf( stdout, "Head rotation: ON\n" ); } + +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + fprintf( stdout, "External orientation: ON\n" ); + } +#endif } return IVAS_ERR_OK; diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index a717e0002e..6e0a0d6499 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -130,6 +130,9 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ +#ifdef EXTERNAL_ORIENTATIONS + const int16_t enableExternalOrientation, /* i : enable external orientations */ +#endif const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ ); @@ -200,6 +203,18 @@ ivas_error IVAS_DEC_FeedRefVectorData( #endif /* OTR_REFERENCE_VECTOR_TRACKING */ #endif +#ifdef EXTERNAL_ORIENTATIONS +/*! r: error code */ +ivas_error IVAS_DEC_FeedExternalOrientationData( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + int8_t *enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ +); +#endif + /*! r: error code */ ivas_error IVAS_DEC_VoIP_FeedFrame( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index c4941b610c..ed0868b2ae 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1105,7 +1105,11 @@ ivas_error ivas_rend_crendProcess( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, DECODER_CONFIG_HANDLE hDecoderConfig, +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, +#endif IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, float output[][L_FRAME48k], /* i/o: input/output audio channels */ @@ -1119,6 +1123,22 @@ ivas_error ivas_rend_crendProcess( ivas_error error; IVAS_REND_AudioConfig inRendConfig; IVAS_REND_AudioConfig outRendConfig; +#ifdef EXTERNAL_ORIENTATIONS + int8_t combinedOrientationEnabled; + + combinedOrientationEnabled = 0; + if (hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if ( hCombinedOrientationData->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } +#endif push_wmops( "ivas_rend_crendProcess" ); @@ -1138,7 +1158,11 @@ ivas_error ivas_rend_crendProcess( subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { +#ifdef EXTERNAL_ORIENTATIONS + if ( hDecoderConfig && combinedOrientationEnabled ) +#else if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) +#endif { /* Orientation tracking */ #ifndef FIX_I109_ORIENTATION_TRACKING @@ -1154,7 +1178,11 @@ ivas_error ivas_rend_crendProcess( } /* get current subframe quaternion and convert to euler angles */ +#ifdef EXTERNAL_ORIENTATIONS + Quat2Euler( hCombinedOrientationData->Quaternions[subframe_idx], &( pCrend->hCrend->m_fYaw ), &( pCrend->hCrend->m_fPitch ), &( pCrend->hCrend->m_fRoll ) ); +#else Quat2Euler( hHeadTrackData->Quaternions[subframe_idx], &( pCrend->hCrend->m_fYaw ), &( pCrend->hCrend->m_fPitch ), &( pCrend->hCrend->m_fRoll ) ); +#endif ivas_orient_trk_SetAbsoluteOrientation( pCrend->hCrend->hTrack, pCrend->hCrend->m_fYaw, pCrend->hCrend->m_fPitch, pCrend->hCrend->m_fRoll ); if ( ( error = ivas_orient_trk_Process( pCrend->hCrend->hTrack ) ) != IVAS_ERR_OK ) @@ -1172,12 +1200,20 @@ ivas_error ivas_rend_crendProcess( */ if ( in_config == AUDIO_CONFIG_FOA || in_config == AUDIO_CONFIG_HOA2 || in_config == AUDIO_CONFIG_HOA3 ) { +#ifdef EXTERNAL_ORIENTATIONS + rotateFrame_shd( hCombinedOrientationData, output, subframe_len, *hIntSetup, subframe_idx ); +#else rotateFrame_shd( hHeadTrackData, output, subframe_len, *hIntSetup, subframe_idx ); +#endif } /* Rotation in SD for MC -> BINAURAL_ROOM */ else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) { +#ifdef EXTERNAL_ORIENTATIONS + rotateFrame_sd( hCombinedOrientationData, output, subframe_len, *hIntSetup, hEFAPdata, subframe_idx ); +#else rotateFrame_sd( hHeadTrackData, output, subframe_len, *hIntSetup, hEFAPdata, subframe_idx ); +#endif } } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 58de4819e8..cdd88c1937 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -58,7 +58,11 @@ * Local function prototypes *------------------------------------------------------------------------*/ -static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], const int16_t nchan_transport, const uint8_t firstSubframe, const uint8_t nSubframes ); +static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, +#endif + float output_f[][L_FRAME48k], const int16_t nchan_transport, const uint8_t firstSubframe, const uint8_t nSubframes ); static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); @@ -68,7 +72,13 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struc static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInputChannels, const uint8_t firstSlot, const uint8_t slotEnd ); -static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hHeadTrackData, +#else + HEAD_TRACK_DATA_HANDLE hHeadTrackData, +#endif + float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); @@ -356,6 +366,9 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs( void ivas_dirac_dec_binaural( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ +#endif float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ const int16_t nchan_transport /* i : number of transport channels */ ) @@ -380,12 +393,20 @@ void ivas_dirac_dec_binaural( uint8_t subframe; for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) { +#ifdef EXTERNAL_ORIENTATIONS + ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, output_f, nchan_transport, subframe, 1u ); +#else ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe, 1u ); +#endif } } else { +#ifdef EXTERNAL_ORIENTATIONS + ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, output_f, nchan_transport, 0u, (uint8_t) MAX_PARAM_SPATIAL_SUBFRAMES ); +#else ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, 0u, (uint8_t) MAX_PARAM_SPATIAL_SUBFRAMES ); +#endif } return; @@ -398,6 +419,9 @@ void ivas_dirac_dec_binaural( static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, +#endif float output_f[][L_FRAME48k], const int16_t nchan_transport, const uint8_t firstSubframe, @@ -411,6 +435,9 @@ static void ivas_dirac_dec_binaural_internal( uint8_t firstSlot, slotEnd; int16_t max_band_decorr; DIFFUSE_DISTRIBUTION_DATA diffuseDistData; +#ifdef EXTERNAL_ORIENTATIONS + int16_t i, j; +#endif firstSlot = firstSubframe * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); slotEnd = ( firstSubframe + nSubframes ) * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); @@ -541,6 +568,22 @@ static void ivas_dirac_dec_binaural_internal( ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSubframe, nSubframes ); } +#ifdef EXTERNAL_ORIENTATIONS + if ( hCombinedOrientationData ) + { + for ( i = 0; i < 3; i++ ) + { + for ( j = 0; j < 3; j++ ) + { + Rmat[i][j] = hCombinedOrientationData->Rmat[firstSubframe][i][j]; + } + } + + if ( nchan_transport == 2 ) + { + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, firstSlot, slotEnd, nBins, Rmat ); + } +#else if ( st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) { QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[firstSubframe], Rmat ); @@ -549,6 +592,7 @@ static void ivas_dirac_dec_binaural_internal( { ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, firstSlot, slotEnd, nBins, Rmat ); } +#endif } ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, firstSubframe, nSubframes ); @@ -1318,7 +1362,11 @@ static void ivas_dirac_dec_binaural_process_output( static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hHeadTrackData, +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, +#endif float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 67b73db6a6..77a913a58a 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -274,7 +274,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ +#ifdef EXTERNAL_ORIENTATIONS + const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ +#else const int16_t Opt_Headrotation, /* i : Head rotation flag */ +#endif const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ #ifdef TD5 const IVAS_POSITION *Pos, /* i : Listener position data per subframe */ @@ -297,9 +301,17 @@ ivas_error ivas_td_binaural_renderer_unwrap( { /* Update the listener's location/orientation */ #ifdef TD5 +#ifdef EXTERNAL_ORIENTATIONS + TDREND_Update_listener_orientation( hBinRendererTd, ( enableCombinedOrientation != NULL ) ? enableCombinedOrientation[subframe_idx] : 0, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); +#else TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); +#endif +#else +#ifdef EXTERNAL_ORIENTATIONS + TDREND_Update_listener_orientation( hBinRendererTd, ( enableCombinedOrientation != NULL) ? enableCombinedOrientation[subframe_idx] : 0, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL ); #else TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL ); +#endif #endif if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) @@ -635,6 +647,9 @@ ivas_error ivas_td_binaural_renderer_ext( const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ +#endif const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const int16_t output_frame, /* i : output frame length */ @@ -688,8 +703,13 @@ ivas_error ivas_td_binaural_renderer_ext( #endif } - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, +#ifdef EXTERNAL_ORIENTATIONS + (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, + (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, +#else + headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, +#endif #ifdef TD5 ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) #else diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index af71cbf543..0dc81f70d7 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -82,7 +82,11 @@ static IVAS_QUATERNION IdentityQuaternion( * Quaternion product *------------------------------------------------------------------------------------------*/ +#ifdef EXTERNAL_ORIENTATIONS +void QuaternionProduct( +#else static void QuaternionProduct( +#endif const IVAS_QUATERNION q1, const IVAS_QUATERNION q2, IVAS_QUATERNION *const r ) @@ -154,7 +158,11 @@ static void QuaternionNormalize( * Computes a spherical linear interpolation between two quaternions *------------------------------------------------------------------------------------------*/ +#ifdef EXTERNAL_ORIENTATIONS +void QuaternionSlerp( +#else static void QuaternionSlerp( +#endif const IVAS_QUATERNION q1, const IVAS_QUATERNION q2, const float t, @@ -232,7 +240,11 @@ static float QuaternionAngle( * Computes an inverse quaternion *------------------------------------------------------------------------------------------*/ +#ifdef EXTERNAL_ORIENTATIONS +void QuaternionInverse( +#else static void QuaternionInverse( +#endif const IVAS_QUATERNION q, IVAS_QUATERNION *const r ) { diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 4c79280a86..4e78a18f11 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -152,6 +152,9 @@ ivas_error ivas_sba_get_hoa_dec_matrix( void ivas_dirac_dec_binaural( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ +#endif float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ const int16_t nchan_transport /* i : number of transport channels */ ); @@ -219,7 +222,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ +#ifdef EXTERNAL_ORIENTATIONS + const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ +#else const int16_t Opt_Headrotation, /* i : Head rotation flag */ +#endif const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ #ifdef TD5 const IVAS_POSITION *Pos, /* i : Listener position data per subframe */ @@ -233,6 +240,9 @@ ivas_error ivas_td_binaural_renderer_ext( const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ +#endif const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const int16_t output_frame, /* i : output frame length */ @@ -511,7 +521,11 @@ ivas_error ivas_rend_crendProcess( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, DECODER_CONFIG_HANDLE hDecoderConfig, +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, +#endif IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, float output[][L_FRAME48k], /* i/o: input/output audio channels */ @@ -816,7 +830,11 @@ void SHrotmatgen( ); void rotateFrame_shd( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ +#endif float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -824,7 +842,11 @@ void rotateFrame_shd( ); void rotateFrame_sd( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ +#endif float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -841,7 +863,11 @@ void rotateFrame_shd_cldfb( ); void rotateFrame_sd_cldfb( +#ifdef EXTERNAL_ORIENTATIONS + float Rmat[3][3], /* i : real-space rotation matrix */ +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ +#endif float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ @@ -849,6 +875,54 @@ void rotateFrame_sd_cldfb( const int16_t nb_band /* i : number of CLDFB bands to process */ ); +#ifdef EXTERNAL_ORIENTATIONS +ivas_error ivas_external_orientation_open( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* o : external orientation handle */ +); + +void ivas_external_orientation_close( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ +); + +ivas_error ivas_combined_orientation_open( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* o : combined orientation handle */ +); + +void ivas_combined_orientation_close( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ +); + +ivas_error combine_external_and_head_orientations_dec( + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +); + +ivas_error combine_external_and_head_orientations_rend( + IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +); + +ivas_error combine_external_and_head_orientations( + IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ + int16_t numHeadRotQuaternions, /* i : number of head rotation quaternions */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +); + +void external_target_interpolation( + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientation handle */ + const int16_t i +); + +bool are_orientations_same( + const IVAS_QUATERNION *orientation1, + const IVAS_QUATERNION *orientation2 +); +#endif + /*----------------------------------------------------------------------------------* * Renderer configuration @@ -868,6 +942,31 @@ ivas_error ivas_render_config_init_from_rom( ); +#ifdef EXTERNAL_ORIENTATIONS +/*----------------------------------------------------------------------------------* + * Quaternion operations + *----------------------------------------------------------------------------------*/ + +void QuaternionProduct( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2, + IVAS_QUATERNION *const r +); + +void QuaternionInverse( + const IVAS_QUATERNION q, + IVAS_QUATERNION *const r +); + +void QuaternionSlerp( + const IVAS_QUATERNION q1, + const IVAS_QUATERNION q2, + const float t, + IVAS_QUATERNION *const r +); +#endif + + /*----------------------------------------------------------------------------------* * Orientation tracking *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 2a45c6d61a..37013546d8 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -349,7 +349,11 @@ void rotateAziEle( *------------------------------------------------------------------------*/ void rotateFrame_shd( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ +#endif float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -381,12 +385,19 @@ void rotateFrame_shd( set_zero( SHrotmat[i], HEADROT_SHMAT_DIM ); } +#ifndef EXTERNAL_ORIENTATIONS /* get next quaternion */ QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); +#endif /* calculate ambisonics rotation matrices for the previous and current frames */ +#ifdef EXTERNAL_ORIENTATIONS + SHrotmatgen( SHrotmat_prev, hCombinedOrientationData->Rmat_prev, shd_rot_max_order ); + SHrotmatgen( SHrotmat, hCombinedOrientationData->Rmat[subframe_idx], shd_rot_max_order ); +#else SHrotmatgen( SHrotmat_prev, hHeadTrackData->Rmat_prev, shd_rot_max_order ); SHrotmatgen( SHrotmat, hHeadTrackData->Rmat, shd_rot_max_order ); +#endif for ( i = 0; i < subframe_len; i++ ) { @@ -438,7 +449,11 @@ void rotateFrame_shd( /* move Rmat to Rmat_prev */ for ( i = 0; i < 3; i++ ) { +#ifdef EXTERNAL_ORIENTATIONS + mvr2r( hCombinedOrientationData->Rmat[subframe_idx][i], hCombinedOrientationData->Rmat_prev[i], 3 ); +#else mvr2r( hHeadTrackData->Rmat[i], hHeadTrackData->Rmat_prev[i], 3 ); +#endif } return; @@ -452,7 +467,11 @@ void rotateFrame_shd( *------------------------------------------------------------------------*/ void rotateFrame_sd( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ +#endif float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -483,8 +502,10 @@ void rotateFrame_sd( cross_fade[i] = i * tmp; } +#ifndef EXTERNAL_ORIENTATIONS /* Get next quaternion and calculate rotation matrix */ QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); +#endif for ( ch_in = 0; ch_in < nchan; ch_in++ ) { @@ -507,7 +528,11 @@ void rotateFrame_sd( ch_in_woLFE = ( ch_in >= index_lfe ) ? ch_in - 1 : ch_in; /* gains for previous subframe rotation */ +#ifdef EXTERNAL_ORIENTATIONS + rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hCombinedOrientationData->Rmat_prev, hTransSetup.is_planar_setup ); +#else rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hHeadTrackData->Rmat_prev, hTransSetup.is_planar_setup ); +#endif if ( hEFAPdata != NULL && ( hTransSetup.ls_azimuth[ch_in_woLFE] != azimuth || hTransSetup.ls_elevation[ch_in_woLFE] != elevation ) ) { efap_determine_gains( hEFAPdata, tmp_gains, azimuth, elevation, EFAP_MODE_EFAP ); @@ -528,7 +553,11 @@ void rotateFrame_sd( /* gains for current subframe rotation */ +#ifdef EXTERNAL_ORIENTATIONS + rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hCombinedOrientationData->Rmat[subframe_idx], hTransSetup.is_planar_setup ); +#else rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hHeadTrackData->Rmat, hTransSetup.is_planar_setup ); +#endif if ( hEFAPdata != NULL && ( hTransSetup.ls_azimuth[ch_in_woLFE] != azimuth || hTransSetup.ls_elevation[ch_in_woLFE] != elevation ) ) { efap_determine_gains( hEFAPdata, tmp_gains, azimuth, elevation, EFAP_MODE_EFAP ); @@ -565,7 +594,11 @@ void rotateFrame_sd( /* move Rmat to Rmat_prev */ for ( i = 0; i < 3; i++ ) { +#ifdef EXTERNAL_ORIENTATIONS + mvr2r( hCombinedOrientationData->Rmat[subframe_idx][i], hCombinedOrientationData->Rmat_prev[i], 3 ); +#else mvr2r( hHeadTrackData->Rmat[i], hHeadTrackData->Rmat_prev[i], 3 ); +#endif } /* copy to output */ @@ -680,7 +713,11 @@ void rotateFrame_shd_cldfb( *------------------------------------------------------------------------*/ void rotateFrame_sd_cldfb( +#ifdef EXTERNAL_ORIENTATIONS + float Rmat[3][3], /* i : real-space rotation matrix */ +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ +#endif float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ @@ -691,7 +728,9 @@ void rotateFrame_sd_cldfb( int16_t iBlock, iBand, m, n; float gains[MAX_CICP_CHANNELS - 1][MAX_CICP_CHANNELS - 1]; int16_t azimuth, elevation; +#ifndef EXTERNAL_ORIENTATIONS float Rmat[3][3]; +#endif float g1; float realRot[MAX_CICP_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; float imagRot[MAX_CICP_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; @@ -713,8 +752,10 @@ void rotateFrame_sd_cldfb( } } +#ifndef EXTERNAL_ORIENTATIONS /* Get next quaternion and calculate rotation matrix */ QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], Rmat ); +#endif /* rotation of Euler angles */ for ( n = 0; n < nInChannels; n++ ) @@ -784,6 +825,540 @@ void rotateFrame_sd_cldfb( return; } + +#ifdef EXTERNAL_ORIENTATIONS +/*-----------------------------------------------------------------------* + * ivas_external_orientation_open() + * + * Allocate and initialize external orientation handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_external_orientation_open( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* o : external orientation handle */ +) +{ + int16_t i; + IVAS_QUATERNION identity; + + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; + + /* Allocate handle */ + if ( ( *hExtOrientationData = (EXTERNAL_ORIENTATION_HANDLE) malloc( sizeof( EXTERNAL_ORIENTATION_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for external orientation memory\n" ) ); + } + + /* Enable head rotation and disable external orientation as default */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + ( *hExtOrientationData )->enableHeadRotation[i] = 1; + ( *hExtOrientationData )->enableExternalOrientation[i] = 0; + ( *hExtOrientationData )->enableRotationInterpolation[i] = 0; + ( *hExtOrientationData )->numFramesToTargetOrientation[i] = 0; + ( *hExtOrientationData )->Quaternions[i] = identity; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_external_orientation_close() + * + * Deallocate external orientation handle + *-----------------------------------------------------------------------*/ + +void ivas_external_orientation_close( + EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* i/o: external orientation handle */ +) +{ + if ( hExtOrientationData == NULL || *hExtOrientationData == NULL ) + { + return; + } + + free( ( *hExtOrientationData ) ); + *hExtOrientationData = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * ivas_combined_orientation_open() + * + * Allocate and initialize combined orientation handle + *-----------------------------------------------------------------------*/ + +ivas_error ivas_combined_orientation_open( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* o : combined orientation handle */ +) +{ + int16_t i, j; + IVAS_QUATERNION identity; + + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; + + /* Allocate handle */ + if ( ( *hCombinedOrientationData = (COMBINED_ORIENTATION_HANDLE) malloc( sizeof( COMBINED_ORIENTATION_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for combined orientation memory\n" ) ); + } + + /* Initialization */ + ( *hCombinedOrientationData )->interpolationCoefficient = 1.0f; + ( *hCombinedOrientationData )->interpolationIncrement = 1.0f; + ( *hCombinedOrientationData )->maximumFramesToTargetOrientation = 500; + ( *hCombinedOrientationData )->lrSwitchedNext = 0; + ( *hCombinedOrientationData )->lrSwitchedCurrent = 0; + ( *hCombinedOrientationData )->lrSwitchInterpVal = 0.0f; + ( *hCombinedOrientationData )->isInterpolationOngoing = FALSE; + ( *hCombinedOrientationData )->Quaternions_ext_interpolation_start = identity; + ( *hCombinedOrientationData )->Quaternions_ext_interpolation_target = identity; + + /* Initialise orientations to identity */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + ( *hCombinedOrientationData )->enableCombinedOrientation[i] = 0; + ( *hCombinedOrientationData )->Quaternions[i] = identity; + ( *hCombinedOrientationData )->Quaternions_prev_headRot[i] = identity; + ( *hCombinedOrientationData )->Quaternions_prev_extOrientation[i] = identity; + + for ( j = 0; j < 3; j++) + { + set_zero( ( *hCombinedOrientationData )->Rmat[i][j], 3 ); + ( *hCombinedOrientationData )->Rmat[i][j][j] = 1.0f; + } + } + + for ( j = 0; j < 3; j++) + { + set_zero( ( *hCombinedOrientationData )->Rmat_prev[j], 3 ); + ( *hCombinedOrientationData )->Rmat_prev[j][j] = 1.0f; + } + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ivas_combined_orientation_close() + * + * Deallocate combined orientation handle + *-----------------------------------------------------------------------*/ + +void ivas_combined_orientation_close( + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + if ( hCombinedOrientationData == NULL || *hCombinedOrientationData == NULL ) + { + return; + } + + free( ( *hCombinedOrientationData ) ); + *hCombinedOrientationData = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * combine_external_and_head_orientations_dec() + * + * + *------------------------------------------------------------------------*/ + +ivas_error combine_external_and_head_orientations_dec( + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + IVAS_QUATERNION *headRotQuaternions = NULL; + int16_t numHeadRotQuaternions = 0; + + if ( hHeadTrackData != NULL ) + { + numHeadRotQuaternions = hHeadTrackData->num_quaternions; + if ( hHeadTrackData->num_quaternions >= 0 ) + { + headRotQuaternions = hHeadTrackData->Quaternions; + } + } + + return combine_external_and_head_orientations(headRotQuaternions, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData); +} + + +/*------------------------------------------------------------------------- + * combine_external_and_head_orientations_rend() + * + * + *------------------------------------------------------------------------*/ + +ivas_error combine_external_and_head_orientations_rend( + IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + IVAS_QUATERNION *headRotQuaternions = NULL; + int16_t numHeadRotQuaternions = 0; + int16_t i; + + if ( hHeadTrackData != NULL ) + { + if ( hHeadTrackData->headRotEnabled ) + { + headRotQuaternions = hHeadTrackData->headPositions; + } + } + else if ( hExtOrientationData != NULL ) + { + /* Head rotation data not available, use the freezed value or disable */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( hExtOrientationData->enableHeadRotation[i] != 2 ) + { + hExtOrientationData->enableHeadRotation[i] = 0; + } + } + } + + return combine_external_and_head_orientations(headRotQuaternions, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData); +} + + +/*------------------------------------------------------------------------- + * combine_external_and_head_orientations() + * + * Combine the external orientations and the head orientation. + * NOTE that the external orientations are inversed. + *------------------------------------------------------------------------*/ + +ivas_error combine_external_and_head_orientations( + IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ + int16_t numHeadRotQuaternions, /* i : number of head rotation quaternions */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ +) +{ + int16_t i, j; + IVAS_QUATERNION identity; + + identity.w = 1.0f; + identity.x = identity.y = identity.z = 0.0f; + + /* Form combined orientations or return if no data available */ + if ( hCombinedOrientationData == NULL ) + { + if ( headRotQuaternions != NULL || hExtOrientationData != NULL) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + else + { + return IVAS_ERR_OK; + } + } + else if ( headRotQuaternions == NULL && hExtOrientationData == NULL ) + { + /* Reset the combined orientations and rotations */ + hCombinedOrientationData->isInterpolationOngoing = FALSE; + hCombinedOrientationData->interpolationCoefficient = 1.0f; + hCombinedOrientationData->interpolationIncrement = 1.0f; + hCombinedOrientationData->Quaternions_ext_interpolation_start = identity; + hCombinedOrientationData->Quaternions_ext_interpolation_target = identity; + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + hCombinedOrientationData->Quaternions[i] = identity; + + for ( j = 0; j < 3; j++) + { + set_zero( hCombinedOrientationData->Rmat[i][j], 3 ); + hCombinedOrientationData->Rmat[i][j][j] = 1.0f; + } + } + } + else if ( hExtOrientationData == NULL && headRotQuaternions != NULL ) + { + /* Head rotation only */ + if ( numHeadRotQuaternions >= 0 ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hCombinedOrientationData->Quaternions[i] = headRotQuaternions[i]; + } + } + } + + if ( hExtOrientationData != NULL ) + { + /* External orientations */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( hExtOrientationData->enableRotationInterpolation[i] == 1 && hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + if ( hCombinedOrientationData->isInterpolationOngoing == TRUE && hCombinedOrientationData->interpolationCoefficient <= 1.0f && are_orientations_same( &hCombinedOrientationData->Quaternions_ext_interpolation_target, &hExtOrientationData->Quaternions[i] ) == true ) + { + /* Continue interpolation */ + QuaternionSlerp( hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i] ); + hCombinedOrientationData->interpolationCoefficient += hCombinedOrientationData->interpolationIncrement; + } + else + { + /* Stop interpolation or check for new interpolation */ + hCombinedOrientationData->isInterpolationOngoing = FALSE; + hCombinedOrientationData->interpolationCoefficient = 1.0f; + hCombinedOrientationData->interpolationIncrement = 1.0f; + external_target_interpolation( hExtOrientationData, hCombinedOrientationData, i ); + } + } + else + { + /* Interpolation disabled, use the current orientation values */ + + /* Use the most recent external orientation */ + if ( hExtOrientationData->enableExternalOrientation[i] == 1 ) + { + hCombinedOrientationData->Quaternions[i] = hExtOrientationData->Quaternions[i]; + } + /* Use the freezed external orientation */ + else if ( hExtOrientationData->enableExternalOrientation[i] == 2 ) + { + hCombinedOrientationData->Quaternions[i] = hCombinedOrientationData->Quaternions_prev_extOrientation[i]; + } + } + } + } + + if ( hExtOrientationData != NULL && headRotQuaternions != NULL ) + { + /* Combine head and external orientations */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + /* Use the most recent head rotation */ + if ( hExtOrientationData->enableHeadRotation[i] == 1 && numHeadRotQuaternions >= 0 ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + QuaternionProduct( hCombinedOrientationData->Quaternions[i], headRotQuaternions[i], &hCombinedOrientationData->Quaternions[i] ); + } + else + { + hCombinedOrientationData->Quaternions[i] = headRotQuaternions[i]; + } + } + /* Use the freezed head rotation */ + else if ( hExtOrientationData->enableHeadRotation[i] == 2 && numHeadRotQuaternions >= 0 ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + QuaternionProduct( hCombinedOrientationData->Quaternions[i], hCombinedOrientationData->Quaternions_prev_headRot[i], &hCombinedOrientationData->Quaternions[i] ); + } + else + { + hCombinedOrientationData->Quaternions[i] = hCombinedOrientationData->Quaternions_prev_headRot[i]; + } + } + + /* Reset the combined orientations to identity */ + if ( hExtOrientationData->enableHeadRotation[i] == 0 && hExtOrientationData->enableExternalOrientation[i] == 0) + { + hCombinedOrientationData->Quaternions[i] = identity; + } + } + } + + if ( headRotQuaternions != NULL || hExtOrientationData != NULL ) + { + /* Calculate the combined rotation matrix */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + QuatToRotMat( hCombinedOrientationData->Quaternions[i], hCombinedOrientationData->Rmat[i] ); + } + } + + /* Save the current orientations */ + if ( hExtOrientationData != NULL ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 ) + { + hCombinedOrientationData->Quaternions_prev_extOrientation[i] = hCombinedOrientationData->Quaternions[i]; + } + else + { + hCombinedOrientationData->Quaternions_prev_extOrientation[i] = identity; + } + } + } + if ( headRotQuaternions != NULL ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( hExtOrientationData != NULL ) + { + if ( hExtOrientationData->enableHeadRotation[i] > 0 && numHeadRotQuaternions >= 0 ) + { + hCombinedOrientationData->Quaternions_prev_headRot[i] = headRotQuaternions[i]; + } + else + { + hCombinedOrientationData->Quaternions_prev_headRot[i] = identity; + } + } + else + { + if ( numHeadRotQuaternions >= 0 ) + { + hCombinedOrientationData->Quaternions_prev_headRot[i] = headRotQuaternions[i]; + } + else + { + hCombinedOrientationData->Quaternions_prev_headRot[i] = identity; + } + } + } + } + + /* Check if combined orientation is enabled */ + if ( headRotQuaternions != NULL && hExtOrientationData == NULL ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( numHeadRotQuaternions >= 0 ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 1; + } + else + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + } + } + } + else if ( headRotQuaternions == NULL && hExtOrientationData != NULL ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 || hExtOrientationData->enableHeadRotation[i] > 0 ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 1; + } + else + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + } + } + } + else if ( headRotQuaternions != NULL && hExtOrientationData != NULL ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( hExtOrientationData->enableExternalOrientation[i] > 0 || ( hExtOrientationData->enableHeadRotation[i] > 0 && numHeadRotQuaternions >= 0 )) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 1; + } + else + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + } + } + } + else + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hCombinedOrientationData->enableCombinedOrientation[i] = 0; + } + } + + return IVAS_ERR_OK; +} + + +/*------------------------------------------------------------------------- + * external_target_interpolation() + * + * + *------------------------------------------------------------------------*/ + +void external_target_interpolation( + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientation handle */ + const int16_t i +) +{ + /* Sanity check for number of frames */ + hExtOrientationData->numFramesToTargetOrientation[i] = min( hExtOrientationData->numFramesToTargetOrientation[i], hCombinedOrientationData->maximumFramesToTargetOrientation ); + hExtOrientationData->numFramesToTargetOrientation[i] = max( hExtOrientationData->numFramesToTargetOrientation[i], 0 ); + + /* Interpolate from the current orientation to the target orientation */ + if ( hExtOrientationData->numFramesToTargetOrientation[i] > 0 ) + { + if ( are_orientations_same( &hCombinedOrientationData->Quaternions_ext_interpolation_target, &hExtOrientationData->Quaternions[i] ) == false ) + { + /* Target orientation is different from the previous target, update the values */ + + /* Set the received orientation as the target */ + hCombinedOrientationData->Quaternions_ext_interpolation_target = hExtOrientationData->Quaternions[i]; + + /* Use the most recent external orientation as the starting orientation */ + hCombinedOrientationData->Quaternions_ext_interpolation_start = hCombinedOrientationData->Quaternions_prev_extOrientation[i]; + + /* Calculate the interpolation increment and coefficient */ + hCombinedOrientationData->interpolationIncrement = 1.0f / ( (float) hExtOrientationData->numFramesToTargetOrientation[i] * (float) MAX_PARAM_SPATIAL_SUBFRAMES ); + hCombinedOrientationData->interpolationCoefficient = hCombinedOrientationData->interpolationIncrement; + } + + /* Interpolate */ + hCombinedOrientationData->isInterpolationOngoing = TRUE; + QuaternionSlerp( hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i] ); + hCombinedOrientationData->interpolationCoefficient += hCombinedOrientationData->interpolationIncrement; + + } + else + { + /* Use the target orientation immediately */ + hCombinedOrientationData->isInterpolationOngoing = FALSE; + hCombinedOrientationData->interpolationCoefficient = 1.0f; + hCombinedOrientationData->interpolationIncrement = 1.0f; + hCombinedOrientationData->Quaternions[i] = hExtOrientationData->Quaternions[i]; + } +} + + +/*------------------------------------------------------------------------- + * are_orientations_same() + * + * + *------------------------------------------------------------------------*/ + +bool are_orientations_same( + const IVAS_QUATERNION *orientation1, + const IVAS_QUATERNION *orientation2 +) +{ + bool orientationsAreSame = true; + float error_margin = 0.05f; + if ( fabsf( orientation1->w - orientation2->w ) > error_margin || + fabsf( orientation1->x - orientation2->x ) > error_margin || + fabsf( orientation1->y - orientation2->y ) > error_margin || + fabsf( orientation1->z - orientation2->z ) > error_margin ) + { + orientationsAreSame = false; + } + + return orientationsAreSame; +} + +#endif // EXTERNAL_ORIENTATIONS + /*-----------------------------------------------------------------------* * Local Function definitions *-----------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 13c6084b2d..01534d0f9a 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -307,6 +307,46 @@ typedef struct ivas_binaural_head_track_struct } HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; +#ifdef EXTERNAL_ORIENTATIONS +/*----------------------------------------------------------------------------------* + * External orientation data structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_external_orientation_struct +{ + int8_t enableHeadRotation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous rotation */ + int8_t enableExternalOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous orientation */ + int8_t enableRotationInterpolation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable */ + int16_t numFramesToTargetOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Number of frames until target orientation is reached */ + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; /* External orientation in quaternions */ + +} EXTERNAL_ORIENTATION_DATA, *EXTERNAL_ORIENTATION_HANDLE; + +/*----------------------------------------------------------------------------------* + * Combined orientation data structure for the external orienations and head orientation + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_combined_orientation_struct +{ + int16_t enableCombinedOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; + float interpolationCoefficient; + float interpolationIncrement; + int16_t maximumFramesToTargetOrientation; + uint8_t lrSwitchedNext; + uint8_t lrSwitchedCurrent; + float lrSwitchInterpVal; + bool isInterpolationOngoing; + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_QUATERNION Quaternions_prev_headRot[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_QUATERNION Quaternions_prev_extOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_QUATERNION Quaternions_ext_interpolation_start; + IVAS_QUATERNION Quaternions_ext_interpolation_target; + float Rmat[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; + float Rmat_prev[3][3]; + +} COMBINED_ORIENTATION_DATA, *COMBINED_ORIENTATION_HANDLE; +#endif + /*----------------------------------------------------------------------------------* * Reverberator structure *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 1dc1c1f956..be73d6986d 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -95,6 +95,9 @@ typedef struct * multiple rendering configurations unless one global one can be used. If this is not relevant, * feel free to remove this TODO. */ +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *pCombinedOrientationData; +#endif } rendering_context; /* Common base for input structs */ @@ -189,6 +192,11 @@ struct IVAS_REND IVAS_REND_HeadRotData headRotData; +#ifdef EXTERNAL_ORIENTATIONS + EXTERNAL_ORIENTATION_HANDLE hExternalOrientationData; + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; +#endif + int8_t rendererConfigEnabled; RENDER_CONFIG_DATA *hRendererConfig; /* Renderer config pointer */ }; @@ -959,6 +967,7 @@ static void closeHeadRotation( } #endif + static void initRotMatrix( rotation_matrix rot_mat ) { @@ -1039,6 +1048,9 @@ static rendering_context getRendCtx( ctx.pCustomLsOut = &hIvasRend->customLsOut; ctx.pEfapOutWrapper = &hIvasRend->efapOutWrapper; ctx.pHeadRotData = &hIvasRend->headRotData; +#ifdef EXTERNAL_ORIENTATIONS + ctx.pCombinedOrientationData = &hIvasRend->hCombinedOrientationData; +#endif return ctx; } @@ -2512,10 +2524,28 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ); ivas_orient_trk_Init( decDummy->hHeadTrackData->OrientationTracker ); #endif + +#ifdef EXTERNAL_ORIENTATIONS + /* External orientations */ + if ( ( error = ivas_external_orientation_open( &( decDummy->hExtOrientationData ) ) ) != IVAS_ERR_OK ) + { + assert( error == IVAS_ERR_OK ); + } + + /* Combined orientations */ + if ( ( error = ivas_combined_orientation_open( &( decDummy->hCombinedOrientationData ) ) ) != IVAS_ERR_OK ) + { + assert( error == IVAS_ERR_OK ); + } +#endif } else { decDummy->hHeadTrackData = NULL; +#ifdef EXTERNAL_ORIENTATIONS + decDummy->hExtOrientationData = NULL; + decDummy->hCombinedOrientationData = NULL; +#endif } if ( enableRenderConfig ) @@ -2600,6 +2630,17 @@ static void freeDecoderDummy( #endif free( pDecDummy->hHeadTrackData ); } +#ifdef EXTERNAL_ORIENTATIONS + if ( pDecDummy->hExtOrientationData != NULL ) + { + free ( pDecDummy->hExtOrientationData ); + } + if ( pDecDummy->hCombinedOrientationData != NULL ) + { + free ( pDecDummy->hCombinedOrientationData ); + } +#endif + ivas_render_config_close( &pDecDummy->hRenderConfig ); /* CLDFB handles */ @@ -2721,6 +2762,20 @@ ivas_error IVAS_REND_Open( initHeadRotation( hIvasRend ); #endif +#ifdef EXTERNAL_ORIENTATIONS + /* Initialize external orientation data */ + if ( ( error = ivas_external_orientation_open( &( hIvasRend->hExternalOrientationData ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Initilize combined orientation data */ + if ( ( error = ivas_combined_orientation_open( &( hIvasRend->hCombinedOrientationData ) ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + /* Initialize EFAP */ if ( ( error = initEfap( &hIvasRend->efapOutWrapper, outConfig, &hIvasRend->customLsOut ) ) != IVAS_ERR_OK ) { @@ -4048,6 +4103,104 @@ ivas_error IVAS_REND_SetReferenceVector( #endif +#ifdef EXTERNAL_ORIENTATIONS +/*---------------------------------------------------------------------* + * IVAS_REND_SetExternalOrientation() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetExternalOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + int8_t *enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ +) +{ + int16_t i; + + /* Validate function arguments */ + if ( hIvasRend == NULL || hIvasRend->hExternalOrientationData == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( orientation == NULL ) + { + for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; ++i ) + { + hIvasRend->hExternalOrientationData->enableExternalOrientation[i] = 0; + } + } + else + { + for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; ++i ) + { + QuaternionInverse( orientation[i], &hIvasRend->hExternalOrientationData->Quaternions[i] ); + + hIvasRend->hExternalOrientationData->enableHeadRotation[i] = enableHeadRotation[i]; + hIvasRend->hExternalOrientationData->enableExternalOrientation[i] = enableExternalOrientation[i]; + hIvasRend->hExternalOrientationData->enableRotationInterpolation[i] = enableRotationInterpolation[i]; + hIvasRend->hExternalOrientationData->numFramesToTargetOrientation[i] = numFramesToTargetOrientation[i]; + } + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_CombineHeadAndExternalOrientation() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_CombineHeadAndExternalOrientation( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +) +{ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + return combine_external_and_head_orientations_rend( &hIvasRend->headRotData, hIvasRend->hExternalOrientationData, hIvasRend->hCombinedOrientationData ); +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_GetCombinedOrientation() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetCombinedOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer processed orientation */ +) +{ + int16_t i; + + if ( hIvasRend == NULL || pOrientation == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hIvasRend->hCombinedOrientationData != NULL ) + { + for ( i = 0; i < RENDERER_HEAD_POSITIONS_PER_FRAME; ++i ) + { + pOrientation[i] = hIvasRend->hCombinedOrientationData->Quaternions[i]; + } + } + + return IVAS_ERR_OK; +} +#endif + + /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ @@ -4143,12 +4296,18 @@ static ivas_error rotateFrameMc( IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ LSSETUP_CUSTOM_STRUCT inCustomLs, /* i : Input Custom LS setup */ const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ +#endif rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) { int16_t i; +#ifdef EXTERNAL_ORIENTATIONS + int16_t j; +#endif int16_t subframe_idx, subframe_len; int16_t azimuth, elevation; int16_t is_planar_setup, lfe_idx; @@ -4192,8 +4351,27 @@ static ivas_error rotateFrameMc( subframe_len = inAudio.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; for ( subframe_idx = 0; subframe_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; subframe_idx++ ) { +#ifdef EXTERNAL_ORIENTATIONS + for ( i = 0; i < 3; i++ ) + { + if ( hCombinedOrientationData != NULL ) + { + for ( j = 0; j < 3; j++ ) + { + Rmat[i][j] = ( * hCombinedOrientationData )->Rmat[subframe_idx][i][j]; + } + } + else + { + /* Set to identity */ + set_zero( Rmat[i], 3 ); + Rmat[i][i] = 1.0f; + } + } +#else /* Get next quaternion and calculate rotation matrix */ QuatToRotMat( headRotData->headPositions[subframe_idx], Rmat ); +#endif for ( ch_in = 0; ch_in < nchan; ch_in++ ) { @@ -4263,6 +4441,9 @@ static ivas_error rotateFrameSba( IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ +#endif rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) @@ -4294,8 +4475,27 @@ static ivas_error rotateFrameSba( set_zero( gains[i], HEADROT_SHMAT_DIM ); } +#ifdef EXTERNAL_ORIENTATIONS + for ( i = 0; i < 3; i++ ) + { + if ( hCombinedOrientationData != NULL ) + { + for ( l = 0; l < 3; l++ ) + { + Rmat[i][l] = ( * hCombinedOrientationData )->Rmat[subframe_idx][i][l]; + } + } + else + { + /* Set to identity */ + set_zero( Rmat[i], 3 ); + Rmat[i][i] = 1.0f; + } + } +#else /* Get next quaternion and calculate rotation matrix */ QuatToRotMat( headRotData->headPositions[subframe_idx], Rmat ); +#endif /* calculate ambisonics rotation matrices for the previous and current frames */ SHrotmatgen( gains, Rmat, shd_rot_max_order ); @@ -4389,6 +4589,9 @@ static ivas_error renderIsmToBinaural( ismInput->base.inConfig, NULL, ismInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + ismInput->base.ctx.pCombinedOrientationData, +#endif &ismInput->currentPos, ismInput->hReverb, outAudio.config.numSamplesPerChannel, @@ -4414,20 +4617,47 @@ static ivas_error renderIsmToBinauralRoom( int16_t tmp; rotation_matrix Rmat; float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - IVAS_QUATERNION quat; ivas_error error; pan_vector currentPanGains; pan_vector previousPanGains; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioObjectPosition rotatedPos; const IVAS_REND_HeadRotData *headRotData; +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t j; +#else + IVAS_QUATERNION quat; +#endif push_wmops( "renderIsmToBinauralRoom" ); headRotData = ismInput->base.ctx.pHeadRotData; rotatedPos = defaultObjectPosition(); - if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && headRotData->headRotEnabled ) +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData = ismInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if (hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if (( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } +#endif + + if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && +#ifdef EXTERNAL_ORIENTATIONS + combinedOrientationEnabled ) +#else + headRotData->headRotEnabled ) +#endif { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); @@ -4436,6 +4666,9 @@ static ivas_error renderIsmToBinauralRoom( ismInput->base.inConfig, NULL, ismInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + ismInput->base.ctx.pCombinedOrientationData, +#endif &ismInput->currentPos, ismInput->hReverb, outAudio.config.numSamplesPerChannel, @@ -4447,19 +4680,41 @@ static ivas_error renderIsmToBinauralRoom( } else { - +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotData->headRotEnabled ) +#endif { subframe_len = ismInput->base.inputBuffer.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; // for ( subframe_idx = 0; subframe_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; subframe_idx++ ) for ( subframe_idx = 0; subframe_idx < 1; subframe_idx++ ) { +#ifdef EXTERNAL_ORIENTATIONS + for ( i = 0; i < 3; i++ ) + { + if (hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) + { + for ( j = 0; j < 3; j++ ) + { + Rmat[i][j] = ( * hCombinedOrientationData )->Rmat[subframe_idx][i][j]; + } + } + else + { + /* Set to identity */ + set_zero( Rmat[i], 3 ); + Rmat[i][i] = 1.0f; + } + } +#else quat.w = headRotData->headPositions[subframe_idx].w; quat.x = headRotData->headPositions[subframe_idx].x; quat.y = headRotData->headPositions[subframe_idx].y; quat.z = headRotData->headPositions[subframe_idx].z; QuatToRotMat( quat, Rmat ); +#endif } (void) subframe_len; // avoid warning } @@ -4468,7 +4723,11 @@ static ivas_error renderIsmToBinauralRoom( /* TODO(sgi): Possible optimization: less processing needed if position didn't change */ /* TODO tmu2sgi: needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ /* previous position gains */ +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotData->headRotEnabled ) +#endif { rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 ); rotatedPos.azimuth = (float) azi_rot; @@ -4484,7 +4743,11 @@ static ivas_error renderIsmToBinauralRoom( } /* current position gains */ +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotData->headRotEnabled ) +#endif { rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 ); rotatedPos.azimuth = (float) azi_rot; @@ -4492,8 +4755,13 @@ static ivas_error renderIsmToBinauralRoom( } if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, +#ifdef EXTERNAL_ORIENTATIONS + ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, + ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, +#else ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, +#endif currentPanGains ) ) != IVAS_ERR_OK ) { return error; @@ -4790,7 +5058,11 @@ static ivas_error renderMcToBinaural( { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); - if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, NULL, + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + mcInput->base.ctx.pCombinedOrientationData, +#endif + NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -4806,6 +5078,9 @@ static ivas_error renderMcToBinaural( set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + mcInput->base.ctx.pCombinedOrientationData, +#endif mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -4861,6 +5136,9 @@ static ivas_error renderMcToBinauralRoom( copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + mcInput->base.ctx.pCombinedOrientationData, +#endif NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -4876,6 +5154,9 @@ static ivas_error renderMcToBinauralRoom( set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + mcInput->base.ctx.pCombinedOrientationData, +#endif mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -4937,7 +5218,11 @@ static ivas_error renderMcCustomLsToBinauralRoom( tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); - if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + mcInput->base.ctx.pCombinedOrientationData, +#endif + mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; } @@ -5178,7 +5463,11 @@ static ivas_error renderSbaToBinaural( /* copy input for in-place rotation */ mvr2r( sbaInput->base.inputBuffer.data, tmpRotBuffer.data, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); - if ( ( error = rotateFrameSba( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, sbaInput->rot_gains_prev, tmpRotBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = rotateFrameSba( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + sbaInput->base.ctx.pCombinedOrientationData, +#endif + sbaInput->rot_gains_prev, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; } @@ -5234,7 +5523,11 @@ static ivas_error renderSbaToBinauralRoom( /* copy input for in-place rotation */ mvr2r( sbaInput->base.inputBuffer.data, tmpRotBuffer.data, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); - if ( ( error = rotateFrameSba( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, sbaInput->rot_gains_prev, tmpRotBuffer ) ) != IVAS_ERR_OK ) + if ( ( error = rotateFrameSba( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, +#ifdef EXTERNAL_ORIENTATIONS + sbaInput->base.ctx.pCombinedOrientationData, +#endif + sbaInput->rot_gains_prev, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; } @@ -5406,7 +5699,11 @@ static void renderMasaToMc( /* TODO(sgi): Remove code duplication w.r.t. MASA rendering to other output configs */ if ( masaInput->decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC ) { +#ifdef EXTERNAL_ORIENTATIONS + ivas_dirac_dec_binaural( masaInput->decDummy, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); +#else ivas_dirac_dec_binaural( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); +#endif } else { @@ -5443,7 +5740,11 @@ static void renderMasaToBinaural( copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC ); +#ifdef EXTERNAL_ORIENTATIONS + ivas_dirac_dec_binaural( masaInput->decDummy, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); +#else ivas_dirac_dec_binaural( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); +#endif accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); @@ -5663,6 +5964,11 @@ void IVAS_REND_Close( closeHeadRotation( hIvasRend ); #endif +#ifdef EXTERNAL_ORIENTATIONS + ivas_external_orientation_close( &hIvasRend->hExternalOrientationData ); + ivas_combined_orientation_close( &hIvasRend->hCombinedOrientationData ); +#endif + free( hIvasRend ); *phIvasRend = NULL; diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index b313bea5c1..b061f7f301 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -282,6 +282,26 @@ ivas_error IVAS_REND_SetReferenceVector( #endif /* OTR_REFERENCE_VECTOR_TRACKING */ #endif /* FIX_I109_ORIENTATION_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS +ivas_error IVAS_REND_SetExternalOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + int8_t *enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ +); + +ivas_error IVAS_REND_CombineHeadAndExternalOrientation( + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ +); + +ivas_error IVAS_REND_GetCombinedOrientation( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer processed orientation */ +); +#endif + ivas_error IVAS_REND_GetSamples( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ diff --git a/lib_util/external_orientation_file_reader.c b/lib_util/external_orientation_file_reader.c new file mode 100644 index 0000000000..1fe37c9833 --- /dev/null +++ b/lib_util/external_orientation_file_reader.c @@ -0,0 +1,183 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "external_orientation_file_reader.h" +#include +#include +#include +#include "prot.h" + +struct ExternalOrientationFileReader +{ + FILE *trajFile; + int32_t frameCounter; + char *file_path; + bool fileRewind; +}; + + +/*-----------------------------------------------------------------------* + * ExternalOrientationFileReader_open() + * + * Allocate and initialize external orientation reader + *-----------------------------------------------------------------------*/ + +ivas_error ExternalOrientationFileReader_open( + char *trajFilePath, /* i : external orientation trajectory file name */ + ExternalOrientationFileReader **externalOrientationReader /* o : ExternalOrientationFileReader handle */ +) +{ + ExternalOrientationFileReader *self; + FILE *trajFile; + + // Open trajectory file + if ( strlen( trajFilePath ) < 1 ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + trajFile = fopen( trajFilePath, "r" ); + + if ( !trajFile ) + { + return IVAS_ERR_FAILED_FILE_OPEN; + } + + self = malloc( sizeof( ExternalOrientationFileReader ) ); + self->trajFile = trajFile; + self->frameCounter = 0; + self->file_path = malloc( ( strlen( trajFilePath ) + 1 ) * sizeof( char ) ); + strcpy( self->file_path, trajFilePath ); + self->fileRewind = false; + + *externalOrientationReader = self; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ExternalOrientationFileReading() + * + * Read values from the trajectory file + *-----------------------------------------------------------------------*/ + +ivas_error ExternalOrientationFileReading( + ExternalOrientationFileReader *externalOrientationReader, /* i/o: ExternalOrientationReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ + int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* o : flag to enable interpolation between the current and target orientations */ + int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is reached */ +) +{ + float w, x, y, z; + float headRotFlag; + float extOrientationFlag; + float rotInterpolationFlag; + float nFramesToTarget; + int32_t read_values; + + /* Initial values, if they are not read from the file */ + headRotFlag = 1; + extOrientationFlag = 1; + rotInterpolationFlag = 0; + nFramesToTarget = 0; + + read_values = fscanf( externalOrientationReader->trajFile, "%f,%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &headRotFlag, &extOrientationFlag, &rotInterpolationFlag, &nFramesToTarget ); + if ( ( read_values != 4 ) && ( read_values != 5 ) && ( read_values != 6 ) && ( read_values != 7 ) && ( read_values != 8 ) ) /* Allow either orientation (4) OR orientation + headRotationFlag (5) OR orientation + headRotationFlag + extOrientationFlag (6) OR orientation + headRotationFlag + extOrientationFlag + rotInterpolationFlag (7) OR orientation + headRotationFlag + extOrientationFlag + rotInterpolationFlag + number of frames to target (8) */ + { + if ( feof( externalOrientationReader->trajFile ) ) + { + rewind( externalOrientationReader->trajFile ); + externalOrientationReader->fileRewind = true; + return ExternalOrientationFileReading( externalOrientationReader, pQuaternion, enableHeadRotation, enableExternalOrientation, enableRotationInterpolation, numFramesToTargetOrientation ); + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + ( externalOrientationReader->frameCounter )++; + + pQuaternion->w = w; + pQuaternion->x = x; + pQuaternion->y = y; + pQuaternion->z = z; + *enableHeadRotation = (int8_t) headRotFlag; + *enableExternalOrientation = (int8_t) extOrientationFlag; + *enableRotationInterpolation = (int8_t) rotInterpolationFlag; + *numFramesToTargetOrientation = (int16_t) nFramesToTarget; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * ExternalOrientationFileReader_close() + * + * Deallocates memory for the external orientation reader + *-----------------------------------------------------------------------*/ + +void ExternalOrientationFileReader_close( + ExternalOrientationFileReader **externalOrientationReader /* i/o: ExternalOrientationFileReader handle */ +) +{ + if ( externalOrientationReader == NULL || *externalOrientationReader == NULL ) + { + return; + } + + fclose( ( *externalOrientationReader )->trajFile ); + free( ( *externalOrientationReader )->file_path ); + free( *externalOrientationReader ); + *externalOrientationReader = NULL; + + return; +} + + +/*-----------------------------------------------------------------------* + * ExternalOrientationFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *ExternalOrientationFileReader_getFilePath( + ExternalOrientationFileReader *externalOrientationReader /* i/o: ExternalOrientationFileReader handle */ +) +{ + if ( externalOrientationReader == NULL ) + { + return NULL; + } + + return externalOrientationReader->file_path; +} diff --git a/lib_util/external_orientation_file_reader.h b/lib_util/external_orientation_file_reader.h new file mode 100644 index 0000000000..98b5700fb6 --- /dev/null +++ b/lib_util/external_orientation_file_reader.h @@ -0,0 +1,63 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_EXTERNAL_ORIENTATION_FILE_READER_H +#define IVAS_EXTERNAL_ORIENTATION_FILE_READER_H + +#include "common_api_types.h" + +typedef struct ExternalOrientationFileReader ExternalOrientationFileReader; + +ivas_error ExternalOrientationFileReader_open( + char *trajFilePath, /* i : external orientation trajectory file name */ + ExternalOrientationFileReader **externalOrientationReader /* o : ExternalOrientationFileReader handle */ +); + +ivas_error ExternalOrientationFileReading( + ExternalOrientationFileReader *externalOrientationReader, /* i/o: ExternalOrientationReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ + int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* o : flag to enable interpolation between the current and target orientations */ + int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is achieved */ +); + +void ExternalOrientationFileReader_close( + ExternalOrientationFileReader **externalOrientationReader /* i/o: ExternalOrientationFileReader handle */ +); + +const char *ExternalOrientationFileReader_getFilePath( + ExternalOrientationFileReader *externalOrientationReader /* i/o: ExternalOrientationFileReader handle */ +); + + +#endif /* IVAS_EXTERNAL_ORIENTATION_FILE_READER_H */ -- GitLab From 39be30e8838eace19a9893c1f03667cd89bb8e2b Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 13 Apr 2023 10:31:57 +0300 Subject: [PATCH 014/381] Implements contribution 42 - MASA support for prerenderer --- apps/renderer.c | 156 ++++- lib_com/ivas_prot.h | 8 + lib_com/options.h | 1 + lib_dec/ivas_masa_dec.c | 6 + lib_rend/ivas_dirac_ana.c | 406 +++++++++++++ lib_rend/ivas_masa_merge.c | 362 ++++++++++++ lib_rend/ivas_mcmasa_ana.c | 1117 ++++++++++++++++++++++++++++++++++++ lib_rend/ivas_omasa_ana.c | 567 ++++++++++++++++++ lib_rend/ivas_prot_rend.h | 107 ++++ lib_rend/ivas_stat_rend.h | 131 +++++ lib_rend/lib_rend.c | 616 +++++++++++++++++++- lib_rend/lib_rend.h | 33 ++ 12 files changed, 3497 insertions(+), 13 deletions(-) create mode 100644 lib_rend/ivas_dirac_ana.c create mode 100644 lib_rend/ivas_masa_merge.c create mode 100644 lib_rend/ivas_mcmasa_ana.c create mode 100644 lib_rend/ivas_omasa_ana.c diff --git a/apps/renderer.c b/apps/renderer.c index 5e8ca98e9c..c8ee306818 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -49,6 +49,9 @@ #include "ism_file_reader.h" #include "ls_custom_file_reader.h" #include "masa_file_reader.h" +#ifdef MASA_PREREND +#include "masa_file_writer.h" +#endif #include "prot.h" #include "render_config_reader.h" #include "wmc_auto.h" @@ -148,7 +151,7 @@ typedef struct bool sceneDescriptionInput; float inputGainGlobal; /* Linear gain (not in dB) */ bool lfePanningEnabled; - float lfeConfigGain; /* Linear gain (not in dB) */ + float lfeConfigGain; /* Linear gain (not in dB) */ float lfeConfigAzimuth; float lfeConfigElevation; bool lfeCustomRoutingEnabled; @@ -416,6 +419,9 @@ static int16_t getTotalNumInChannels( fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } +#ifdef MASA_PREREND + IVAS_REND_GetNumAllObjects( hIvasRend, &numInputChannels ); /* In case of MASA output, modify the numInputChannels to contain all objects. Otherwise, keep the original value. */ +#endif totalNumInChannels += numInputChannels; } @@ -539,6 +545,9 @@ int main( IsmPositionProvider *positionProvider; RenderConfigReader *renderConfigReader = NULL; MasaFileReader *masaReaders[RENDERER_MAX_MASA_INPUTS]; +#ifdef MASA_PREREND + MasaFileWriter *masaWriter = NULL; +#endif IVAS_MASA_METADATA_HANDLE hMasaMetadata[RENDERER_MAX_MASA_INPUTS]; char audioFilePath[FILENAME_MAX]; AudioFileReader *audioReader = NULL; @@ -684,7 +693,6 @@ int main( fprintf( stderr, "Sampling rate must be specified on command line when using raw PCM input\n" ); exit( -1 ); } - args.sampleRate = inFileSampleRate; break; default: fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); @@ -713,7 +721,11 @@ int main( /* === Configure === */ #ifdef TD5 +#ifdef MASA_PREREND + if ( ( error = IVAS_REND_InitConfig( hIvasRend, strlen( args.renderConfigFilePath ) != 0 ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_InitConfig( hIvasRend, ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) || ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) ) != IVAS_ERR_OK ) +#endif #else if ( ( error = IVAS_REND_InitConfig( hIvasRend, strlen( args.renderConfigFilePath ) != 0 ) ) != IVAS_ERR_OK ) #endif @@ -776,6 +788,25 @@ int main( } } +#ifdef MASA_PREREND + /* Set up MASA writer for MASA output */ + if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + MasaFileWriter_open( args.outputFilePath, true, &masaWriter ); /* No delay for audio in renderer, so calling metadata writer in delayCompensated mode, i.e., no delay applied to meta */ + if ( masaWriter == NULL ) + { + fprintf( stderr, "Could not open MASA metadata file %s\n", args.outputFilePath ); + exit( -1 ); + } + } + + /* Set the total number of objects */ + if ( args.inConfig.numAudioObjects > 0 ) + { + IVAS_REND_SetTotalNumberOfObjects( hIvasRend, args.inConfig.numAudioObjects ); + } +#endif + IVAS_REND_LfePanMtx lfePanMatrix; /* parse input LFE panning matrix */ @@ -851,6 +882,14 @@ int main( fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } + +#ifdef MASA_PREREND + /* With MASA output, all objects are handled at once, so add only one input having all objects in it */ + if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + break; + } +#endif } for ( i = 0; i < args.inConfig.numAmbisonicsBuses; ++i ) @@ -1071,6 +1110,43 @@ int main( for ( i = 0; i < args.inConfig.numAudioObjects; ++i ) { +#ifdef MASA_PREREND + if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + if ( i == 0 ) + { + 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 ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + + if ( ( error = IVAS_REND_FeedInputObjectMetadataToOMasa( hIvasRend, i, mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + else + { + 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 ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_FeedInputObjectMetadata( hIvasRend, ismIds[i], mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } +#else 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 ) @@ -1084,6 +1160,7 @@ int main( fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } +#endif } for ( i = 0; i < args.inConfig.numAmbisonicsBuses; ++i ) @@ -1175,6 +1252,81 @@ int main( delayNumSamples -= (int16_t) outBufferSize; } +#ifdef MASA_PREREND + /* Write MASA metadata for MASA outputs */ + if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + IVAS_REND_AudioConfigType inputType1; + IVAS_REND_AudioConfigType inputType2; + MASA_DECODER_EXT_OUT_META_HANDLE hMetaOutput; + int16_t numInputFormats; + + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; + inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; + + numInputFormats = 0; + if ( args.inConfig.numAmbisonicsBuses > 0 ) + { + numInputFormats++; + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS; + } + if ( args.inConfig.numMultiChannelBuses > 0 ) + { + numInputFormats++; + if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ) + { + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED; + } + } + if ( args.inConfig.numMasaBuses > 0 ) + { + numInputFormats++; + if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ) + { + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA; + } + } + if ( args.inConfig.numAudioObjects > 0 ) + { + numInputFormats++; + if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN ) + { + inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED; + } + } + + if ( numInputFormats == 1 ) + { + IVAS_REND_GetMasaMetadata( hIvasRend, &hMetaOutput, inputType1 ); + } + else + { + if ( args.inConfig.numAmbisonicsBuses > 0 && args.inConfig.numMultiChannelBuses > 0 ) + { + inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED; + IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ); + } + + if ( ( args.inConfig.numAmbisonicsBuses > 0 || args.inConfig.numMultiChannelBuses > 0 ) && args.inConfig.numMasaBuses > 0 ) + { + inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA; + IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ); + } + + 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; + IVAS_REND_MergeMasaMetadata( hIvasRend, &hMetaOutput, inputType1, inputType2 ); + } + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMetaOutput ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + } + } +#endif + frame++; if ( !args.quietModeEnabled ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e8597bbf3c..1ee68a2a47 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4661,6 +4661,14 @@ void ivas_spar_param_to_masa_param_mapping( const int16_t nSubframes /* i : Number of subframes to map */ ); +#ifdef MASA_PREREND +uint16_t index_theta_phi_16( + float theta, /* i : input elevation to be indexed */ + float phi, /* i : input azimuth to be indexed */ + SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ +); +#endif + /*---------------------------------------------------------------------------------* * Binaural FastConv Renderer Prototypes diff --git a/lib_com/options.h b/lib_com/options.h index c054a9b5a7..a3b2ea401d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -162,6 +162,7 @@ #define FIX_MDCT_BASED_BWD /* FhG: fixes for BWD for issues with reaction to transients for MDCT-stereo and MCT */ #define DISCRETE_ISM_DTX_CNG /* FhG/VA: contribution 15 - DTX/CNG for (discrete) ISM */ #define NCHAN_ISM_PARAMETER /* VA: make 'nchan_ism' parameter part of st_ivas/hEncoderConfig */ +#define MASA_PREREND /* Nokia: MASA output support to IVAS_rend */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 5b0223a9be..3c7dd021b5 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -57,7 +57,9 @@ *-----------------------------------------------------------------------*/ static int16_t quantize_theta( float x, int16_t no_cb, float *xhat ); +#ifndef MASA_PREREND static uint16_t index_theta_phi_16( float theta, float phi, SPHERICAL_GRID_DATA *Sph_Grid16 ); +#endif static int16_t quantize_phi_masa( float phi, int16_t flag_delta, float *phi_hat, const int16_t n ); static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 ); #ifdef FIX_350_MASA_DELAY_COMP @@ -639,7 +641,11 @@ static int16_t quantize_phi_masa( /* !r: output index for direction */ +#ifdef MASA_PREREND +uint16_t index_theta_phi_16( +#else static uint16_t index_theta_phi_16( +#endif float theta, /* i : input elevation to be indexed */ float phi, /* i : input azimuth to be indexed */ SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c new file mode 100644 index 0000000000..ec3d29c508 --- /dev/null +++ b/lib_rend/ivas_dirac_ana.c @@ -0,0 +1,406 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include "ivas_cnst.h" +#include "ivas_prot_rend.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_stat_rend.h" +#include "ivas_rom_com.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + +#ifdef MASA_PREREND + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_dirac_param_est_ana( DIRAC_ANA_HANDLE hDirAC, float data_f[][L_FRAME48k], float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const int16_t input_frame ); + +static void ivas_dirac_dmx( float data_in_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_transport ); + + +/*--------------------------------------------------------------------------* + * ivas_dirac_ana_open() + * + * Allocate and initialize DIRAC handle + *--------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_ana_open( + DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ + int32_t input_Fs /* i: Sampling frequency */ +) +{ + int16_t i, j; + DIRAC_ANA_HANDLE hDirAC; + int16_t numAnalysisChannels; + int16_t maxBin; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hDirAC = (DIRAC_ANA_HANDLE) malloc( sizeof( DIRAC_ANA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DIRAC\n" ) ); + } + + numAnalysisChannels = DIRAC_MAX_ANA_CHANS; + + /* Determine the number of bands */ + hDirAC->nbands = MASA_FREQUENCY_BANDS; + + /* Determine band grouping */ + mvs2s( MASA_band_grouping_24, hDirAC->band_grouping, 24 + 1 ); + + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + for ( i = 1; i < hDirAC->nbands + 1; i++ ) + { + if ( hDirAC->band_grouping[i] >= maxBin ) + { + hDirAC->band_grouping[i] = maxBin; + hDirAC->nbands = i; + break; + } + } + + /* Determine block grouping */ + mvs2s( DirAC_block_grouping, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + + /* open/initialize CLDFB */ + hDirAC->num_Cldfb_instances = numAnalysisChannels; + for ( i = 0; i < hDirAC->num_Cldfb_instances; i++ ) + { + openCldfb( &( hDirAC->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ); + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + hDirAC->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ); + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + hDirAC->direction_vector_m[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ); + set_zero( hDirAC->direction_vector_m[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + hDirAC->buffer_intensity_real[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ); + set_zero( hDirAC->buffer_intensity_real[i][j], MASA_FREQUENCY_BANDS ); + } + } + + set_zero( hDirAC->buffer_energy, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); + + hDirAC->index_buffer_intensity = 0; + + if ( ( hDirAC->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + if ( ( hDirAC->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + generate_gridEq( hDirAC->sph_grid16 ); + + ( *hDirACPtr ) = hDirAC; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_dirac_ana_close() + * + * Close DIRAC handle + *--------------------------------------------------------------------------*/ + +void ivas_dirac_ana_close( + DIRAC_ANA_HANDLE ( *hDirAC ) /* i/o: analysis DIRAC handle */ +) +{ + int16_t i, j; + + if ( hDirAC == NULL || *hDirAC == NULL ) + { + return; + } + + for ( i = 0; i < ( *hDirAC )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hDirAC )->cldfbAnaEnc[i] ) ); + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hDirAC )->direction_vector_m[i][j] ); + ( *hDirAC )->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hDirAC )->buffer_intensity_real[i][j] ); + ( *hDirAC )->buffer_intensity_real[i][j] = NULL; + } + + free( ( *hDirAC )->direction_vector_m[i] ); + ( *hDirAC )->direction_vector_m[i] = NULL; + } + + free( ( *hDirAC )->hMasaOut ); + ( *hDirAC )->hMasaOut = NULL; + free( ( *hDirAC )->sph_grid16 ); + ( *hDirAC )->sph_grid16 = NULL; + + free( ( *hDirAC ) ); + ( *hDirAC ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_dirac_ana() + * + * DIRAC analysis function + *--------------------------------------------------------------------------*/ + +void ivas_dirac_ana( + DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport /* i : Number of transport channels */ +) +{ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + + /* Estimate MASA parameters from the SBA signals */ + ivas_dirac_param_est_ana( hDirAC, data_in_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame ); + + /* Create MASA metadata buffer from the estimated values */ + ivas_create_masa_out_meta( hDirAC->hMasaOut, hDirAC->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + + /* Downmix */ + ivas_dirac_dmx( data_in_f, input_frame, nchan_transport ); + + return; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + +/* Estimate MASA parameters from the SBA signals */ +static void ivas_dirac_param_est_ana( + DIRAC_ANA_HANDLE hDirAC, + float data_f[][L_FRAME48k], + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const int16_t input_frame ) +{ + float reference_power[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t ts, i, d, j; + int16_t num_freq_bands, index; + float dir_v[DIRAC_NUM_DIMS]; + int16_t l_ts; + float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float diffuseness_vector[MASA_FREQUENCY_BANDS]; + float diffuseness_m[MASA_FREQUENCY_BANDS]; + + int16_t band_m_idx, block_m_idx; + float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; + float norm_tmp; + int16_t mrange[2]; + int16_t brange[2]; + int16_t numAnalysisChannels; + + num_freq_bands = hDirAC->nbands; + l_ts = input_frame / CLDFB_NO_COL_MAX; + numAnalysisChannels = DIRAC_MAX_ANA_CHANS; + + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hDirAC->block_grouping[block_m_idx]; + mrange[1] = hDirAC->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 0.0f; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0.0f; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0.0f; + } + + /* Need to initialize renormalization_factors, and variables to be normalized */ + set_zero( renormalization_factor_diff, hDirAC->nbands ); + set_zero( diffuseness_m, hDirAC->nbands ); + set_zero( hDirAC->energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Foa_RealBuffer[i], Foa_ImagBuffer[i], l_ts, hDirAC->cldfbAnaEnc[i] ); + } + + /* Compute omni energy for metadata processing */ + for ( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) + { + brange[0] = hDirAC->band_grouping[band_m_idx]; + brange[1] = hDirAC->band_grouping[band_m_idx + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + hDirAC->energy[block_m_idx][band_m_idx] += Foa_RealBuffer[0][j] * Foa_RealBuffer[0][j] + Foa_ImagBuffer[0][j] * Foa_ImagBuffer[0][j]; + } + } + + /* Direction estimation */ + computeIntensityVector_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); + computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); + + /* Power estimation for diffuseness */ + computeReferencePower_ana( hDirAC->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands ); + + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ + hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + index = hDirAC->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_real[i], &( hDirAC->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power[ts], &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, diffuseness_vector ); + + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + + diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx]; + } + ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + } + + /* Determine energy ratios */ + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + diffuseness_m[band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + diffuseness_m[band_m_idx] = 0.0f; + } + + energyRatio[block_m_idx][band_m_idx] = 1.0f - diffuseness_m[band_m_idx]; + } + + /* Todo Nokia: Implement coherence analysis */ + for ( band_m_idx = 0; band_m_idx < hDirAC->nbands; band_m_idx++ ) + { + spreadCoherence[block_m_idx][band_m_idx] = 0.0f; + surroundingCoherence[block_m_idx][band_m_idx] = 0.0f; + } + } + + return; +} + + +/* Compute downmix */ +static void ivas_dirac_dmx( + float data_in_f[][L_FRAME48k], + const int16_t input_frame, + const int16_t nchan_transport ) +{ + int16_t i; + float data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; + + if ( nchan_transport == 2) + { + v_add( data_in_f[0], data_in_f[1], data_out_f[0], input_frame ); + v_multc( data_out_f[0], 0.5f, data_out_f[0], input_frame ); + + v_sub( data_in_f[0], data_in_f[1], data_out_f[1], input_frame ); + v_multc( data_out_f[1], 0.5f, data_out_f[1], input_frame ); + + for ( i = 0; i < nchan_transport; i++ ) + { + mvr2r( data_out_f[i], data_in_f[i], input_frame ); + } + } + + return; +} + +#endif /* MASA_PREREND */ diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c new file mode 100644 index 0000000000..e2935d20de --- /dev/null +++ b/lib_rend/ivas_masa_merge.c @@ -0,0 +1,362 @@ +/****************************************************************************************************** + +(C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository. All Rights Reserved. + +This software is protected by copyright law and by international treaties. +The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +contributors to this repository retain full ownership rights in their respective contributions in +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. + +Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +contributions. + +This software is provided "AS IS", without any express or implied warranties. The software is in the +development stage. It is intended exclusively for experts who have experience with such software and +solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +and fitness for a particular purpose are hereby disclaimed and excluded. + +Any dispute, controversy or claim arising under or in relation to providing this software shall be +submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "lib_rend.h" +#include "ivas_prot_rend.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "wmc_auto.h" + +#ifdef MASA_PREREND + + +static void copy_masa_meta_tile( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: metadata to be written */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: input metadata */ + const uint8_t sf, /* i: sub-frame index */ + const uint8_t band /* i: band index */ +); + +static void full_stream_merge( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i: Input metadata 1 */ + float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i: Input metadata 2 */ + float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ +); + +static void diffuse_meta_merge_1x1( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: Input metadata 1 */ + float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i: Input metadata 2 */ + float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ +); + +void copy_masa_meta_tile( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: metadata to be written */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: input metadata */ + const uint8_t sf, /* i: sub-frame index */ + const uint8_t band /* i: band index */ +) +{ + outMeta->directionIndex[0][sf][band] = inMeta->directionIndex[0][sf][band]; + outMeta->directToTotalRatio[0][sf][band] = inMeta->directToTotalRatio[0][sf][band]; + outMeta->spreadCoherence[0][sf][band] = inMeta->spreadCoherence[0][sf][band]; + + outMeta->surroundCoherence[sf][band] = inMeta->surroundCoherence[sf][band]; + outMeta->diffuseToTotalRatio[sf][band] = inMeta->diffuseToTotalRatio[sf][band]; + + if ( inMeta->descriptiveMeta.numberOfDirections == 1 ) + { + outMeta->directionIndex[1][sf][band] = inMeta->directionIndex[1][sf][band]; + outMeta->directToTotalRatio[1][sf][band] = inMeta->directToTotalRatio[1][sf][band]; + outMeta->spreadCoherence[1][sf][band] = inMeta->spreadCoherence[1][sf][band]; + } + else + { + /* make sure the output has zeroed data in the second direction */ + outMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + outMeta->directToTotalRatio[1][sf][band] = 0u; + outMeta->spreadCoherence[1][sf][band] = 0u; + } + + return; +} + +void copy_masa_descriptive_meta( + MASA_DECRIPTIVE_META *outMeta, /* o: metadata to be written */ + MASA_DECRIPTIVE_META *inMeta /* i: input metadata */ +) +{ + uint8_t char_idx; + for ( char_idx = 0; char_idx < 8; char_idx++ ) + { + outMeta->formatDescriptor[char_idx] = inMeta->formatDescriptor[char_idx]; + } + outMeta->numberOfDirections = inMeta->numberOfDirections; + outMeta->numberOfChannels = inMeta->numberOfChannels; + outMeta->sourceFormat = inMeta->sourceFormat; + outMeta->transportDefinition = inMeta->transportDefinition; + outMeta->channelAngle = inMeta->channelAngle; + outMeta->channelDistance = inMeta->channelDistance; + outMeta->channelLayout = inMeta->channelLayout; +} + +void diffuse_meta_merge_1x1( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: Input metadata 1 */ + float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: TF-energy of input 1 */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i: Input metadata 2 */ + float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ +) +{ + int8_t sf, band; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + float energyTimesRatio, energyTimesRatioISM, total_diff_nrg, dir_nrg_ratio, total_nrg; + float dir_ratio_ism; + + energyTimesRatio = (float) ( inMeta->directToTotalRatio[0][sf][band] ) / UINT8_MAX * inEne[sf][band]; + + total_nrg = inEne[sf][band] + inEneISM[sf][band]; + + /* target is original MASA diffuseness */ + total_diff_nrg = (float) ( inMeta->diffuseToTotalRatio[sf][band] ) / UINT8_MAX * inEne[sf][band]; + /* criterion is mean of ISM ratio and new ratio */ + dir_ratio_ism = (float) ( inMetaISM->directToTotalRatio[0][sf][band] ) / UINT8_MAX; + + energyTimesRatioISM = ( dir_ratio_ism + ( 1.0f - total_diff_nrg / ( EPSILON + total_nrg ) ) ) / 2.0f * inEneISM[sf][band]; + + if ( energyTimesRatioISM > energyTimesRatio ) + { + float new_dir_ratio, new_diff_ratio; + outMeta->directionIndex[0][sf][band] = inMetaISM->directionIndex[0][sf][band]; + outMeta->directToTotalRatio[0][sf][band] = inMetaISM->directToTotalRatio[0][sf][band]; + outMeta->spreadCoherence[0][sf][band] = inMetaISM->spreadCoherence[0][sf][band]; + + outMeta->surroundCoherence[sf][band] = inMetaISM->surroundCoherence[sf][band]; + + dir_nrg_ratio = 1.0f - total_diff_nrg / ( EPSILON + total_nrg ); /* new dir ratio */ + new_dir_ratio = min( dir_nrg_ratio, dir_ratio_ism ); /* clip with original ISM dir */ + outMeta->directToTotalRatio[0][sf][band] = (uint8_t) floorf( new_dir_ratio * UINT8_MAX ); + new_diff_ratio = 1.0f - new_dir_ratio; + outMeta->diffuseToTotalRatio[sf][band] = (uint8_t) floorf( new_diff_ratio * UINT8_MAX ); + } + else + { + /* use the plain original meta for this tile */ + outMeta->directionIndex[0][sf][band] = inMeta->directionIndex[0][sf][band]; + outMeta->directToTotalRatio[0][sf][band] = inMeta->directToTotalRatio[0][sf][band]; + outMeta->spreadCoherence[0][sf][band] = inMeta->spreadCoherence[0][sf][band]; + + outMeta->surroundCoherence[sf][band] = inMeta->surroundCoherence[sf][band]; + outMeta->diffuseToTotalRatio[sf][band] = inMeta->diffuseToTotalRatio[sf][band]; + } + outMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + outMeta->directToTotalRatio[1][sf][band] = 0u; + outMeta->spreadCoherence[1][sf][band] = 0u; + + inEne[sf][band] += inEneISM[sf][band]; /* Update energy for subsequent mergings */ + } + } + + /* Set descriptive meta for mixed format */ + outMeta->descriptiveMeta.sourceFormat = 0u; + outMeta->descriptiveMeta.transportDefinition = 0u; + outMeta->descriptiveMeta.channelAngle = 0u; + outMeta->descriptiveMeta.channelDistance = 0u; + outMeta->descriptiveMeta.channelLayout = 0u; + outMeta->descriptiveMeta.numberOfDirections = 0u; + /* Number of transports should be set outside. */ + + return; +} + +void full_stream_merge( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i: Input metadata 1 */ + float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i: Input metadata 2 */ + float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ +) +{ + float dir_nrg_1, dir_nrg_2; + uint8_t n_dirs_1, n_dirs_2; + uint8_t sf, band; + + /* full stream select based on total direct energy */ + n_dirs_1 = inMeta1->descriptiveMeta.numberOfDirections + 1u; /* to 1-based */ + n_dirs_2 = inMeta2->descriptiveMeta.numberOfDirections + 1u; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + dir_nrg_1 = (float) ( inMeta1->directToTotalRatio[0][sf][band] ) / UINT8_MAX * inEne1[sf][band]; + dir_nrg_2 = (float) ( inMeta2->directToTotalRatio[0][sf][band] ) / UINT8_MAX * inEne2[sf][band]; + + if ( n_dirs_1 == 2 ) + { + dir_nrg_1 += (float) ( inMeta1->directToTotalRatio[1][sf][band] ) / UINT8_MAX * inEne1[sf][band]; + } + + if ( n_dirs_2 == 2 ) + { + dir_nrg_2 += (float) ( inMeta2->directToTotalRatio[1][sf][band] ) / UINT8_MAX * inEne2[sf][band]; + } + + if ( dir_nrg_1 > dir_nrg_2 ) + { + copy_masa_meta_tile(outMeta, inMeta1, sf, band); + } + else + { + copy_masa_meta_tile( outMeta, inMeta2, sf, band ); + } + + inEne1[sf][band] += inEne2[sf][band]; /* Update energy for subsequent mergings */ + } + } + + /* Set descriptive meta for mixed format */ + outMeta->descriptiveMeta.sourceFormat = 0u; + outMeta->descriptiveMeta.transportDefinition = 0u; + outMeta->descriptiveMeta.channelAngle = 0u; + outMeta->descriptiveMeta.channelDistance = 0u; + outMeta->descriptiveMeta.channelLayout = 0u; + if ( n_dirs_1 == 2 || n_dirs_2 == 2 ) + { + outMeta->descriptiveMeta.numberOfDirections = 1u; + } + else + { + outMeta->descriptiveMeta.numberOfDirections = 0u; + } + /* Number of transports should be set outside. */ + + return; +} + +void ivas_prerend_merge_masa_metadata( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i: Input metadata 1 */ + IVAS_REND_AudioConfigType inType1, /* i: Type of input 1 */ + float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i: Input metadata 2 */ + IVAS_REND_AudioConfigType inType2, /* i: Type of input 2 */ + float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ +) +{ + /* mixing ISMs with non-ISM use different merge */ + if ( inType1 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && inType2 != IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) + { + /* meta_1 is ISM and both are 1dir */ + diffuse_meta_merge_1x1(outMeta, inMeta2, inEne2, inMeta1, inEne1); + } + else if ( inType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && inType1 != IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) + { + /* meta_2 is ISM and both are 1dir */ + diffuse_meta_merge_1x1(outMeta, inMeta1, inEne1, inMeta2, inEne2); + } + else + { + full_stream_merge(outMeta, inMeta1, inEne1, inMeta2, inEne2); + } + + return; +} + +ivas_error masaPrerendOpen( + MASA_PREREND_HANDLE *hMasaPrerendPtr, /* o: handle to the opened prerenderer */ + int16_t numTransports, /* i: number of transport channels */ + int32_t input_Fs /* i: signal sampling rate */ +) +{ + MASA_PREREND_HANDLE hMasaPrerend; + int16_t i; + ivas_error error; + + error = IVAS_ERR_OK; + + hMasaPrerend = (MASA_PREREND_HANDLE) malloc( sizeof( MASA_PREREND_DATA ) ); + if ( hMasaPrerend == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA prerenderer\n" ) ); + } + + hMasaPrerend->num_Cldfb_instances = numTransports; + for ( i = 0; i < hMasaPrerend->num_Cldfb_instances; i++ ) + { + if ( ( error = openCldfb( &(hMasaPrerend->cldfbAnaEnc[i]), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ; i < MASA_MAX_TRANSPORT_CHANNELS; i++ ) + { + hMasaPrerend->cldfbAnaEnc[i] = NULL; + } + + if ( ( hMasaPrerend->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA prerenderer\n" ) ); + } + + if ( ( hMasaPrerend->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA prerenderer\n" ) ); + } + generate_gridEq( hMasaPrerend->sph_grid16 ); + + if ( error == IVAS_ERR_OK ) + { + *hMasaPrerendPtr = hMasaPrerend; + } + + return error; +} + +void masaPrerendClose( + MASA_PREREND_HANDLE *hMasaPrerendPtr /* i/o: prerenderer handle to be closed */ +) +{ + int16_t i; + + if ( hMasaPrerendPtr == NULL || *hMasaPrerendPtr == NULL ) + { + return; + } + + for ( i = 0; i < ( *hMasaPrerendPtr )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hMasaPrerendPtr )->cldfbAnaEnc[i] ) ); + } + + free( ( *hMasaPrerendPtr )->hMasaOut ); + ( *hMasaPrerendPtr )->hMasaOut = NULL; + free( ( *hMasaPrerendPtr )->sph_grid16 ); + ( *hMasaPrerendPtr )->sph_grid16 = NULL; + + free( ( *hMasaPrerendPtr ) ); + ( *hMasaPrerendPtr ) = NULL; + + return; +} + +#endif /* MASA_PREREND */ diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c new file mode 100644 index 0000000000..bb5c6a3d91 --- /dev/null +++ b/lib_rend/ivas_mcmasa_ana.c @@ -0,0 +1,1117 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include +#include "ivas_cnst.h" +#include "options.h" +#include "ivas_prot_rend.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_stat_rend.h" +#include "ivas_rom_com.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + +#ifdef MASA_PREREND + + +/*------------------------------------------------------------------------- + * Local constants + *------------------------------------------------------------------------*/ + +#define NEAR_HORIZONTAL_PLANE_ELEVATION 17.5f +#define VERTICAL_ENERGY_RATIO_OFFSET 0.15f + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +/* Structure for covariance matrix */ +typedef struct +{ + float xr[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float xi[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; +} CovarianceMatrix; + +void ivas_mcmasa_param_est_ana( MCMASA_ANA_HANDLE hMcMasa, float data_f[][L_FRAME48k], float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const int16_t input_frame, const int16_t nchan_inp ); + +static void ivas_mcmasa_dmx( MCMASA_ANA_HANDLE hMcMasa, float data_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_transport, const int16_t nchan_inp ); + +static void compute_cov_mtx( float sr[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], float si[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], const int16_t freq, const int16_t N, CovarianceMatrix *COVls ); + +static void computeVerticalDiffuseness( float **buffer_intensity, const float *buffer_energy, const int16_t num_freq_bands, float *diffuseness ); + +static void computeEvenLayout( const float *ls_azimuth, float *ls_azimuth_even, const int16_t numChannels ); + + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_ana_open() + * + * + *--------------------------------------------------------------------------*/ + +ivas_error ivas_mcmasa_ana_open( + MCMASA_ANA_HANDLE *hMcMasaPtr, /* i/o: McMASA data handle pointer */ + const IVAS_REND_AudioConfig inConfig, /* i: Input config */ + int32_t input_Fs /* i: Sampling frequency */ +) +{ + int16_t i, j; + MCMASA_ANA_HANDLE hMcMasa; + float ls_azimuth[MCMASA_MAX_ANA_CHANS]; + float ls_elevation[MCMASA_MAX_ANA_CHANS]; + float ls_azimuth_even[MCMASA_MAX_ANA_CHANS]; + int16_t nchan_inp; + int16_t numAnalysisChannels; + float left_min, right_min, azi_diff; + int16_t maxBin, input_frame; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hMcMasa = (MCMASA_ANA_HANDLE) malloc( sizeof( MCMASA_ANA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for McMasa\n" ) ); + } + + if ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 ) + { + nchan_inp = 6; + mvr2r( ls_azimuth_CICP6, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP6, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 1; + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) + { + nchan_inp = 8; + mvr2r( ls_azimuth_CICP12, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP12, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 7; + hMcMasa->isHorizontalSetup = 1; + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1_2 ) + { + nchan_inp = 8; + mvr2r( ls_azimuth_CICP14, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP14, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 0; + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1_4 ) + { + nchan_inp = 10; + mvr2r( ls_azimuth_CICP16, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP16, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 5; + hMcMasa->isHorizontalSetup = 0; + } + else + { + nchan_inp = 12; + mvr2r( ls_azimuth_CICP19, ls_azimuth, nchan_inp - 1 ); + mvr2r( ls_elevation_CICP19, ls_elevation, nchan_inp - 1 ); + hMcMasa->numHorizontalChannels = 7; + hMcMasa->isHorizontalSetup = 0; + } + + numAnalysisChannels = nchan_inp - 1; + + /* Determine the number of bands */ + hMcMasa->nbands = MASA_FREQUENCY_BANDS; + + /* Determine band grouping */ + mvs2s( MASA_band_grouping_24, hMcMasa->band_grouping, 24 + 1 ); + + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + for ( i = 1; i < hMcMasa->nbands + 1; i++ ) + { + if ( hMcMasa->band_grouping[i] >= maxBin ) + { + hMcMasa->band_grouping[i] = maxBin; + hMcMasa->nbands = i; + break; + } + } + + /* Determine block grouping */ + mvs2s( DirAC_block_grouping, hMcMasa->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + + /* open/initialize CLDFB */ + hMcMasa->num_Cldfb_instances = numAnalysisChannels; + for ( i = 0; i < hMcMasa->num_Cldfb_instances; i++ ) + { + openCldfb( &( hMcMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ); + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + hMcMasa->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ); + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + hMcMasa->direction_vector_m[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ); + set_zero( hMcMasa->direction_vector_m[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + hMcMasa->buffer_intensity_real[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ); + set_zero( hMcMasa->buffer_intensity_real[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + hMcMasa->buffer_intensity_real_vert[j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ); + set_zero( hMcMasa->buffer_intensity_real_vert[j], MASA_FREQUENCY_BANDS ); + } + + set_zero( hMcMasa->buffer_energy, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); + + computeEvenLayout( ls_azimuth, ls_azimuth_even, hMcMasa->numHorizontalChannels ); + if ( !hMcMasa->isHorizontalSetup ) + { + computeEvenLayout( &ls_azimuth[hMcMasa->numHorizontalChannels], &ls_azimuth_even[hMcMasa->numHorizontalChannels], numAnalysisChannels - hMcMasa->numHorizontalChannels ); + } + + for ( i = 0; i < numAnalysisChannels; i++ ) + { + hMcMasa->chnlToFoaMtx[0][i] = 1.0f; + hMcMasa->chnlToFoaMtx[1][i] = sinf( ls_azimuth[i] * PI_OVER_180 ) * cosf( ls_elevation[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaMtx[2][i] = sinf( ls_elevation[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaMtx[3][i] = cosf( ls_azimuth[i] * PI_OVER_180 ) * cosf( ls_elevation[i] * PI_OVER_180 ); + + hMcMasa->chnlToFoaEvenMtx[0][i] = 1.0f; + hMcMasa->chnlToFoaEvenMtx[1][i] = sinf( ls_azimuth_even[i] * PI_OVER_180 ); + hMcMasa->chnlToFoaEvenMtx[2][i] = 0.0f; + hMcMasa->chnlToFoaEvenMtx[3][i] = cosf( ls_azimuth_even[i] * PI_OVER_180 ); + } + + mvr2r( ls_azimuth, hMcMasa->ls_azimuth, numAnalysisChannels ); + + for ( i = 0; i < hMcMasa->numHorizontalChannels; i++ ) + { + left_min = 360.0f; + right_min = -360.0f; + + for ( j = 0; j < hMcMasa->numHorizontalChannels; j++ ) + { + azi_diff = ls_azimuth[j] - ls_azimuth[i]; + + if ( azi_diff > 180.0f ) + { + azi_diff -= 360.0f; + } + else if ( azi_diff < -180.0f ) + { + azi_diff += 360.0f; + } + + if ( azi_diff < left_min && azi_diff > 0.0f ) + { + hMcMasa->leftNearest[i] = j; + left_min = azi_diff; + } + + if ( azi_diff > right_min && azi_diff < 0.0f ) + { + hMcMasa->rightNearest[i] = j; + right_min = azi_diff; + } + } + } + + hMcMasa->prevMultiChEne = 0.0f; + hMcMasa->prevDownmixEne = 0.0f; + hMcMasa->prevEQ = 1.0f; + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + for ( i = 0; i < input_frame; i++ ) + { + hMcMasa->interpolator[i] = ( (float) i ) / ( (float) input_frame ); + } + + hMcMasa->index_buffer_intensity = 0; + + if ( ( hMcMasa->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + if ( ( hMcMasa->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + generate_gridEq( hMcMasa->sph_grid16 ); + + ( *hMcMasaPtr ) = hMcMasa; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_ana_close() + * + * + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_ana_close( + MCMASA_ANA_HANDLE *hMcMasa /* i/o: analysis McMASA handle */ +) +{ + int16_t i, j; + + if ( hMcMasa == NULL || *hMcMasa == NULL ) + { + return; + } + + for ( i = 0; i < ( *hMcMasa )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hMcMasa )->cldfbAnaEnc[i] ) ); + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hMcMasa )->direction_vector_m[i][j] ); + ( *hMcMasa )->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hMcMasa )->buffer_intensity_real[i][j] ); + ( *hMcMasa )->buffer_intensity_real[i][j] = NULL; + } + + free( ( *hMcMasa )->direction_vector_m[i] ); + ( *hMcMasa )->direction_vector_m[i] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hMcMasa )->buffer_intensity_real_vert[j] ); + ( *hMcMasa )->buffer_intensity_real_vert[j] = NULL; + } + + free( ( *hMcMasa )->hMasaOut ); + ( *hMcMasa )->hMasaOut = NULL; + free( ( *hMcMasa )->sph_grid16 ); + ( *hMcMasa )->sph_grid16 = NULL; + + free( ( *hMcMasa ) ); + ( *hMcMasa ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_mcmasa_ana() + * + * Multichannel MASA analysis + *--------------------------------------------------------------------------*/ + +void ivas_mcmasa_ana( + MCMASA_ANA_HANDLE hMcMasa, /* i/o: McMASA encoder handle */ + float data_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_inp /* i : Number of input channels */ +) +{ + int16_t i; + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + + /* Sum center and LFE, move surround channels */ + v_add( data_f[2], data_f[3], data_f[2], input_frame ); + for ( i = 4; i < nchan_inp; i++ ) + { + mvr2r( data_f[i], data_f[i - 1], input_frame ); + } + + /* Analysis */ + ivas_mcmasa_param_est_ana( hMcMasa, data_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame, nchan_inp ); + + /* Create MASA metadata buffer from the estimated values */ + ivas_create_masa_out_meta( hMcMasa->hMasaOut, hMcMasa->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + + /* Downmix */ + ivas_mcmasa_dmx( hMcMasa, data_f, input_frame, nchan_transport, nchan_inp ); + + return; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + + /* Estimate metadata parameters for McMASA */ +void ivas_mcmasa_param_est_ana( + MCMASA_ANA_HANDLE hMcMasa, /* i : McMASA analyzer structure */ + float data_f[][L_FRAME48k], /* i : Audio frame in MC-format */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* o : Estimated surround coherence */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_inp /* i : Number of input channels */ +) +{ + float reference_power[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t ts, i, j, d; + int16_t num_freq_bins, num_freq_bands, index; + float dir_v[DIRAC_NUM_DIMS]; + int16_t l_ts; + float Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float FoaEven_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float FoaEven_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float intensity_even_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float diffuseness_vector[MASA_FREQUENCY_BANDS]; + float vertical_diffuseness_vector[MASA_FREQUENCY_BANDS]; + float diffuseness_m[MASA_FREQUENCY_BANDS]; + float coherentEnergyRatio[MASA_FREQUENCY_BANDS]; + int16_t band_m_idx, block_m_idx; + float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; + float norm_tmp; + int16_t mrange[2], brange[2]; + CovarianceMatrix COVls[MASA_FREQUENCY_BANDS]; + float absCOVls[MCMASA_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float lsEnergy[MCMASA_MAX_ANA_CHANS]; + float lsEnergySum, maxEne; + int16_t loudestCh; + float surrCoh, tempCoh, tempCoh2; + int16_t i1, i2, i3; + float angleDist, minAngleDist; + float currentAzi; + float lsEnergyRelation; + float tempLsEnergyRelation; + float stereoness, cohwideness, spreadCoh; + float stereoRatio, cohPanRatio; + float stereoCoh, cohPanCoh, cohRatio; + int16_t numAnalysisChannels; + + num_freq_bins = hMcMasa->cldfbAnaEnc[0]->no_channels; + num_freq_bands = hMcMasa->nbands; + l_ts = input_frame / CLDFB_NO_COL_MAX; + numAnalysisChannels = nchan_inp - 1; + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hMcMasa->block_grouping[block_m_idx]; + mrange[1] = hMcMasa->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + hMcMasa->direction_vector_m[0][block_m_idx][band_m_idx] = 0; + hMcMasa->direction_vector_m[1][block_m_idx][band_m_idx] = 0; + hMcMasa->direction_vector_m[2][block_m_idx][band_m_idx] = 0; + } + + /* Need to initialize renormalization_factors, and variables to be normalized */ + set_zero( renormalization_factor_diff, hMcMasa->nbands ); + set_zero( diffuseness_m, hMcMasa->nbands ); + set_zero( hMcMasa->energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + /* Reset variable */ + for ( i = 0; i < hMcMasa->nbands; i++ ) + { + for ( j = 0; j < numAnalysisChannels; j++ ) + { + set_zero( COVls[i].xr[j], numAnalysisChannels ); + set_zero( COVls[i].xi[j], numAnalysisChannels ); + } + } + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Chnl_RealBuffer[i], Chnl_ImagBuffer[i], l_ts, hMcMasa->cldfbAnaEnc[i] ); + } + + /* Compute channel-based energy for metadata processing */ + for ( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) + { + brange[0] = hMcMasa->band_grouping[band_m_idx]; + brange[1] = hMcMasa->band_grouping[band_m_idx + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + hMcMasa->energy[block_m_idx][band_m_idx] += Chnl_RealBuffer[i][j] * Chnl_RealBuffer[i][j] + Chnl_ImagBuffer[i][j] * Chnl_ImagBuffer[i][j]; + } + } + } + + /* Compute covariance matrix */ + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = hMcMasa->band_grouping[i]; + brange[1] = hMcMasa->band_grouping[i + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + compute_cov_mtx( Chnl_RealBuffer, Chnl_ImagBuffer, j, numAnalysisChannels, &( COVls[i] ) ); + } + } + + /* Compute standard FOA */ + /* W */ + v_add( Chnl_RealBuffer[0], Chnl_RealBuffer[1], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[0], Chnl_ImagBuffer[1], Foa_ImagBuffer[0], num_freq_bins ); + for ( i = 2; i < numAnalysisChannels; i++ ) + { + v_add( Chnl_RealBuffer[i], Foa_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[i], Foa_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + } + + /* Y */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[1][0], Foa_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[1][0], Foa_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[1][i], Foa_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[1][i], Foa_ImagBuffer[1], num_freq_bins ); + } + + /* Z */ + if ( hMcMasa->isHorizontalSetup ) + { + /* Set zero for horizontal setups */ + set_zero( Foa_RealBuffer[2], num_freq_bins ); + set_zero( Foa_ImagBuffer[2], num_freq_bins ); + } + else + { + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[2][0], Foa_RealBuffer[2], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[2][0], Foa_ImagBuffer[2], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[2][i], Foa_RealBuffer[2], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[2][i], Foa_ImagBuffer[2], num_freq_bins ); + } + } + + /* X */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaMtx[3][0], Foa_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaMtx[3][0], Foa_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaMtx[3][i], Foa_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaMtx[3][i], Foa_ImagBuffer[3], num_freq_bins ); + } + + /* Compute even FOA */ + /* W */ + mvr2r( Foa_RealBuffer[0], FoaEven_RealBuffer[0], num_freq_bins ); + mvr2r( Foa_ImagBuffer[0], FoaEven_ImagBuffer[0], num_freq_bins ); + + /* Y */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaEvenMtx[1][0], FoaEven_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaEvenMtx[1][0], FoaEven_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaEvenMtx[1][i], FoaEven_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaEvenMtx[1][i], FoaEven_ImagBuffer[1], num_freq_bins ); + } + + /* Z (even setups are handled as horizontal) */ + set_zero( FoaEven_RealBuffer[2], num_freq_bins ); + set_zero( FoaEven_ImagBuffer[2], num_freq_bins ); + + /* X */ + v_multc( Chnl_RealBuffer[0], hMcMasa->chnlToFoaEvenMtx[3][0], FoaEven_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hMcMasa->chnlToFoaEvenMtx[3][0], FoaEven_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < numAnalysisChannels; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hMcMasa->chnlToFoaEvenMtx[3][i], FoaEven_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hMcMasa->chnlToFoaEvenMtx[3][i], FoaEven_ImagBuffer[3], num_freq_bins ); + } + + /* Direction estimation */ + computeIntensityVector_ana(hMcMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); + computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); + + /* Power and intensity estimation for diffuseness */ + computeIntensityVector_ana( hMcMasa->band_grouping, FoaEven_RealBuffer, FoaEven_ImagBuffer, num_freq_bands, intensity_even_real ); + computeReferencePower_ana( hMcMasa->band_grouping, FoaEven_RealBuffer, FoaEven_ImagBuffer, reference_power[ts], num_freq_bands ); + + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ + hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + index = hMcMasa->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_even_real[i], &( hMcMasa->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power[ts], &( hMcMasa->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hMcMasa->buffer_intensity_real, hMcMasa->buffer_energy, num_freq_bands, diffuseness_vector ); + + /* Compute vertical diffuseness, and tune original diffuseness if needed */ + if ( !hMcMasa->isHorizontalSetup ) + { + mvr2r( intensity_real[2], &( hMcMasa->buffer_intensity_real_vert[index - 1][0] ), num_freq_bands ); + computeVerticalDiffuseness( hMcMasa->buffer_intensity_real_vert, hMcMasa->buffer_energy, num_freq_bands, vertical_diffuseness_vector ); + v_min( diffuseness_vector, vertical_diffuseness_vector, diffuseness_vector, num_freq_bands ); + } + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hMcMasa->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hMcMasa->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hMcMasa->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + + diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hMcMasa->direction_vector_m[d][block_m_idx][band_m_idx]; + } + ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + } + + /* Coherence processing */ + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + /* Compute absolute values */ + for ( i = 0; i < numAnalysisChannels; i++ ) + { + for ( j = i; j < numAnalysisChannels; j++ ) + { + absCOVls[i][j] = sqrtf( ( COVls[band_m_idx].xr[i][j] * COVls[band_m_idx].xr[i][j] + COVls[band_m_idx].xi[i][j] * COVls[band_m_idx].xi[i][j] ) ); + } + lsEnergy[i] = absCOVls[i][i]; + } + + /* Find loudest channel */ + maxEne = lsEnergy[0]; + loudestCh = 0; + for ( i = 1; i < numAnalysisChannels; i++ ) + { + if ( lsEnergy[i] > maxEne ) + { + maxEne = lsEnergy[i]; + loudestCh = i; + } + } + + /* Compute surrounding coherence */ + surrCoh = 1.0f; + for ( i = 0; i < numAnalysisChannels; i++ ) + { + if ( i != loudestCh ) + { + if ( i < loudestCh ) + { + i1 = i; + i2 = loudestCh; + } + else + { + i1 = loudestCh; + i2 = i; + } + tempCoh = absCOVls[i1][i2] / ( sqrtf( ( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ) ); + surrCoh = ( surrCoh < tempCoh ) ? surrCoh : tempCoh; + } + } + surrCoh = surrCoh * surrCoh; + surrCoh = ( surrCoh < 1.0f ) ? surrCoh : 1.0f; + surrCoh = ( surrCoh > 0.0f ) ? surrCoh : 0.0f; + + /* Compute spread coherence */ + if ( elevation_m_values[block_m_idx][band_m_idx] < NEAR_HORIZONTAL_PLANE_ELEVATION ) /* Computed only near horizontal plane */ + { + minAngleDist = 180.0f; + i1 = 0; + currentAzi = azimuth_m_values[block_m_idx][band_m_idx]; + for ( i = 0; i < hMcMasa->numHorizontalChannels; i++ ) + { + angleDist = fabsf( currentAzi - hMcMasa->ls_azimuth[i] ); + if ( angleDist > 180.0f ) + { + angleDist = fabsf( angleDist - 360.0f ); + } + if ( angleDist < minAngleDist ) + { + minAngleDist = angleDist; + i1 = i; + } + } + i2 = hMcMasa->leftNearest[i1]; + i3 = hMcMasa->rightNearest[i1]; + + if ( i2 < i3 ) + { + stereoCoh = absCOVls[i2][i3] / ( sqrtf( lsEnergy[i2] * lsEnergy[i3] + EPSILON ) ); + } + else + { + stereoCoh = absCOVls[i3][i2] / ( sqrtf( lsEnergy[i2] * lsEnergy[i3] + EPSILON ) ); + } + lsEnergyRelation = ( lsEnergy[i2] + lsEnergy[i3] ) / ( lsEnergy[i1] + lsEnergy[i2] + lsEnergy[i3] + EPSILON ); + stereoness = stereoCoh * lsEnergyRelation; + + if ( i1 < i2 ) + { + tempCoh = absCOVls[i1][i2] / ( sqrtf( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ); + } + else + { + tempCoh = absCOVls[i2][i1] / ( sqrtf( lsEnergy[i1] * lsEnergy[i2] + EPSILON ) ); + } + if ( i1 < i3 ) + { + tempCoh2 = absCOVls[i1][i3] / ( sqrtf( lsEnergy[i1] * lsEnergy[i3] + EPSILON ) ); + } + else + { + tempCoh2 = absCOVls[i3][i1] / ( sqrtf( lsEnergy[i1] * lsEnergy[i3] + EPSILON ) ); + } + cohPanCoh = ( tempCoh < tempCoh2 ) ? tempCoh : tempCoh2; + lsEnergyRelation = lsEnergy[i2] / ( lsEnergy[i1] + EPSILON ); + tempLsEnergyRelation = lsEnergy[i1] / ( lsEnergy[i2] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + tempLsEnergyRelation = lsEnergy[i3] / ( lsEnergy[i1] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + tempLsEnergyRelation = lsEnergy[i1] / ( lsEnergy[i3] + EPSILON ); + lsEnergyRelation = ( lsEnergyRelation < tempLsEnergyRelation ) ? lsEnergyRelation : tempLsEnergyRelation; + cohwideness = cohPanCoh * lsEnergyRelation; + + spreadCoh = ( cohwideness > stereoness ) ? cohwideness : stereoness; + if ( spreadCoh > 0.5f ) + { + if ( cohwideness > stereoness ) + { + tempCoh = stereoness - ( cohwideness - 0.5f ); + spreadCoh = ( tempCoh > 0.5f ) ? tempCoh : 0.5f; + } + } + spreadCoh = ( spreadCoh < 1.0f ) ? spreadCoh : 1.0f; + spreadCoh = ( spreadCoh > 0.0f ) ? spreadCoh : 0.0f; + + /* Compute energy ratio tuning parameter */ + lsEnergySum = sum_f( lsEnergy, numAnalysisChannels ) + EPSILON; + lsEnergyRelation = ( lsEnergy[i2] + lsEnergy[i3] ) / lsEnergySum; + stereoRatio = stereoCoh * lsEnergyRelation - surrCoh; + + lsEnergyRelation = ( lsEnergy[i1] + lsEnergy[i2] + lsEnergy[i3] ) / lsEnergySum; + cohPanRatio = cohPanCoh * lsEnergyRelation - surrCoh; + + cohRatio = ( stereoRatio > cohPanRatio ) ? stereoRatio : cohPanRatio; + cohRatio = ( cohRatio < 1.0f ) ? cohRatio : 1.0f; + cohRatio = ( cohRatio > 0.0f ) ? cohRatio : 0.0f; + } + else /* Otherwise, set spread coherence to zero */ + { + spreadCoh = 0.0f; + cohRatio = 0.0f; + lsEnergySum = sum_f( lsEnergy, numAnalysisChannels ); + } + + /* Store values */ + spreadCoherence[block_m_idx][band_m_idx] = spreadCoh; + surroundingCoherence[block_m_idx][band_m_idx] = surrCoh; + coherentEnergyRatio[band_m_idx] = cohRatio; + } + + /* Determine energy ratios */ + for ( band_m_idx = 0; band_m_idx < hMcMasa->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + diffuseness_m[band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + diffuseness_m[band_m_idx] = 0.0f; + } + + energyRatio[block_m_idx][band_m_idx] = 1.0f - diffuseness_m[band_m_idx]; + energyRatio[block_m_idx][band_m_idx] = ( energyRatio[block_m_idx][band_m_idx] > coherentEnergyRatio[band_m_idx] ) ? energyRatio[block_m_idx][band_m_idx] : coherentEnergyRatio[band_m_idx]; + } + } + + return; +} + + +/* Compute downmix */ +static void ivas_mcmasa_dmx( + MCMASA_ANA_HANDLE hMcMasa, + float data_f[][L_FRAME48k], + const int16_t input_frame, + const int16_t nchan_transport, + const int16_t nchan_inp ) +{ + int16_t i, j; + int16_t numAnalysisChannels; + float dmx_c; + float multiChEne, downmixEne; + float prevEQ, currEQ, instEQ; + float alpha; + + numAnalysisChannels = nchan_inp - 1; + + multiChEne = 0.0f; + for ( j = 0; j < numAnalysisChannels; j++ ) + { + for ( i = 0; i < input_frame; i++ ) + { + multiChEne += data_f[j][i] * data_f[j][i]; + } + } + + if ( nchan_transport == 2 ) + { + int16_t numSideChannels; /* Channels other than left, right, center */ + int16_t leftIndex, rightIndex; + + numSideChannels = numAnalysisChannels / 2 - 1; + for ( j = 0; j < numSideChannels; j++ ) + { + leftIndex = j * 2 + 3; + rightIndex = j * 2 + 4; + + for ( i = 0; i < input_frame; i++ ) + { + data_f[0][i] += data_f[leftIndex][i]; + data_f[1][i] += data_f[rightIndex][i]; + } + } + + for ( i = 0; i < input_frame; i++ ) + { + dmx_c = INV_SQRT2 * data_f[2][i]; + data_f[0][i] += dmx_c; + data_f[1][i] += dmx_c; + } + } + else if ( nchan_transport == 1 ) + { + for ( i = 0; i < input_frame; i++ ) + { + for ( j = 1; j < numAnalysisChannels; j++ ) + { + data_f[0][i] += data_f[j][i]; + } + } + } + + downmixEne = 0.0f; + for ( j = 0; j < nchan_transport; j++ ) + { + for ( i = 0; i < input_frame; i++ ) + { + downmixEne += data_f[j][i] * data_f[j][i]; + } + } + + alpha = 0.1f; + hMcMasa->prevMultiChEne = alpha * multiChEne + ( 1.0f - alpha ) * hMcMasa->prevMultiChEne; + hMcMasa->prevDownmixEne = alpha * downmixEne + ( 1.0f - alpha ) * hMcMasa->prevDownmixEne; + + prevEQ = hMcMasa->prevEQ; + currEQ = sqrtf( hMcMasa->prevMultiChEne / ( hMcMasa->prevDownmixEne + EPSILON ) ); + hMcMasa->prevEQ = currEQ; + + for ( i = 0; i < input_frame; i++ ) + { + instEQ = hMcMasa->interpolator[i] * currEQ + ( 1.0f - hMcMasa->interpolator[i] ) * prevEQ; + for ( j = 0; j < nchan_transport; j++ ) + { + data_f[j][i] *= instEQ; + } + } + + return; +} + + +/* Compute covariance matrix, i.e., xT * conj(x), and accumulate to the output */ +static void compute_cov_mtx( + float sr[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Input matrix, real, s[ch][freq] */ + float si[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Input matrix, imag, s[ch][freq] */ + const int16_t freq, /* i : Freq to process */ + const int16_t N, /* i : Number of channels */ + CovarianceMatrix *COVls /* o : Output matrix, contains upper part of cov mtx */ +) +{ + int16_t i, j; + float a, b, c, d; + + for ( i = 0; i < N; i++ ) + { + a = sr[i][freq]; + b = si[i][freq]; + for ( j = i; j < N; j++ ) + { + c = sr[j][freq]; + d = si[j][freq]; + COVls->xr[i][j] += a * c + b * d; + COVls->xi[i][j] += b * c - a * d; + } + } + + return; +} + +/*------------------------------------------------------------------------- + * computeVerticalDiffuseness() + * + * + *------------------------------------------------------------------------*/ + +static void computeVerticalDiffuseness( + float **buffer_intensity, /* i : Intensity vectors */ + const float *buffer_energy, /* i : Energy */ + const int16_t num_freq_bands, /* i : Number of frequency bands */ + float *diffuseness /* o : Estimated diffuseness */ +) +{ + float intensity_slow[MASA_FREQUENCY_BANDS]; + float intensity_slow_abs[MASA_FREQUENCY_BANDS]; + float energy_slow[MASA_FREQUENCY_BANDS]; + int16_t i, k; + float tmp = 0; + const float *p_tmp_c; + + /* Set variables to zero */ + set_f( intensity_slow, 0.0f, MASA_FREQUENCY_BANDS ); + set_f( energy_slow, 0.0f, MASA_FREQUENCY_BANDS ); + + for ( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) + { + /* Energy slow */ + p_tmp_c = buffer_energy + i * num_freq_bands; + for ( k = 0; k < num_freq_bands; k++ ) + { + energy_slow[k] += *( p_tmp_c++ ); + } + + /* Intensity slow */ + for ( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow[k] += buffer_intensity[i][k]; + } + } + + /* Compute absolute value */ + for ( k = 0; k < num_freq_bands; k++ ) + { + intensity_slow_abs[k] = fabsf( intensity_slow[k] ); + } + + /* Compute Diffuseness */ + for ( i = 0; i < num_freq_bands; ++i ) + { + tmp = intensity_slow_abs[i] / ( energy_slow[i] + EPSILON ); + tmp = ( tmp - VERTICAL_ENERGY_RATIO_OFFSET ) / ( 1.0f - VERTICAL_ENERGY_RATIO_OFFSET ); /* Tuned to avoid effect due to ambience of vertically un-even setups */ + tmp = 1.0f - tmp; + diffuseness[i] = ( ( tmp < 1.0f ) ? ( ( tmp < 0.0f ) ? 0.f : tmp ) : 1.0f ); + } + + return; +} + + +static void computeEvenLayout( + const float *ls_azimuth, + float *ls_azimuth_even, + const int16_t numChannels ) +{ + int16_t i; + int16_t j; + float ls_azimuth_temp[MCMASA_MAX_ANA_CHANS]; + float ls_azimuth_even_ordered[MCMASA_MAX_ANA_CHANS]; + int16_t ls_azimuth_order[MCMASA_MAX_ANA_CHANS]; + float smallestAzimuth; + int16_t smallestAzimuthIndex; + float lsSpacing; + uint8_t oddLayout; + float startAzimuth; + int16_t numChannelsHalf; + + lsSpacing = 360.0f / (float) numChannels; + oddLayout = numChannels % 2; + numChannelsHalf = numChannels / 2; + + mvr2r( ls_azimuth, ls_azimuth_temp, numChannels ); + for ( i = 0; i < numChannels; i++ ) + { + smallestAzimuth = 1000.0f; + smallestAzimuthIndex = 0; + for ( j = 0; j < numChannels; j++ ) + { + if ( ls_azimuth_temp[j] < smallestAzimuth ) + { + smallestAzimuth = ls_azimuth_temp[j]; + smallestAzimuthIndex = j; + } + } + ls_azimuth_order[i] = smallestAzimuthIndex; + ls_azimuth_temp[smallestAzimuthIndex] = 1000.0f; + } + + if ( oddLayout ) + { + startAzimuth = -lsSpacing * ( (float) numChannelsHalf ); + } + else + { + startAzimuth = -lsSpacing * ( (float) numChannelsHalf - 0.5f ); + } + + for ( i = 0; i < numChannels; i++ ) + { + ls_azimuth_even_ordered[i] = (float) i * lsSpacing + startAzimuth; + } + + for ( i = 0; i < numChannels; i++ ) + { + ls_azimuth_even[ls_azimuth_order[i]] = roundf( ls_azimuth_even_ordered[i] ); + } + + return; +} + +void ivas_create_masa_out_meta( + MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: MASA metadata handle */ + SPHERICAL_GRID_DATA *Sph_Grid16, /* i: Spherical grid */ + const int16_t nchan_transport, /* i: Number of transport channels */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: Estimated surround coherence */ +) +{ + const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ + int16_t i, sf, band; + uint8_t numFrequencyBands; + uint8_t numDirections; + uint16_t spherical_index; + + + numDirections = 1; + numFrequencyBands = MASA_FREQUENCY_BANDS; + + /* Construct descriptive meta */ + for ( i = 0; i < 8; i++ ) + { + extOutMeta->descriptiveMeta.formatDescriptor[i] = ivasmasaFormatDescriptor[i]; + } + extOutMeta->descriptiveMeta.numberOfDirections = numDirections - 1; + extOutMeta->descriptiveMeta.numberOfChannels = (uint8_t) ( nchan_transport - 1 ); + /* Following correspond to "unknown" values */ + extOutMeta->descriptiveMeta.sourceFormat = 0x0u; + extOutMeta->descriptiveMeta.transportDefinition = 0x0u; + extOutMeta->descriptiveMeta.channelAngle = 0x0u; + extOutMeta->descriptiveMeta.channelDistance = 0x0u; + extOutMeta->descriptiveMeta.channelLayout = 0x0u; + + /* Construct spatial metadata from estimated values */ + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + /* Spherical index */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + spherical_index = index_theta_phi_16( elevation_m_values[sf][band], azimuth_m_values[sf][band], Sph_Grid16 ); + extOutMeta->directionIndex[0][sf][band] = spherical_index; + extOutMeta->directionIndex[1][sf][band] = SPH_IDX_FRONT; + } + + /* Direct-to-total ratio */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + extOutMeta->directToTotalRatio[0][sf][band] = (uint8_t) floorf( energyRatio[sf][band] * UINT8_MAX ); + extOutMeta->directToTotalRatio[1][sf][band] = 0; + } + + /* Spread coherence */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + extOutMeta->spreadCoherence[0][sf][band] = (uint8_t) floorf( spreadCoherence[sf][band] * UINT8_MAX ); + extOutMeta->spreadCoherence[1][sf][band] = 0; + } + + /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + extOutMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX - (uint8_t) floorf( energyRatio[sf][band] * UINT8_MAX ); + } + + /* Surround coherence */ + for ( band = 0; band < numFrequencyBands; band++ ) + { + extOutMeta->surroundCoherence[sf][band] = (uint8_t) floorf( surroundingCoherence[sf][band] * UINT8_MAX ); + } + } + + return; +} + +#endif /* MASA_PREREND */ diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c new file mode 100644 index 0000000000..a91f13f1a9 --- /dev/null +++ b/lib_rend/ivas_omasa_ana.c @@ -0,0 +1,567 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "options.h" +#include +#include +#include "ivas_cnst.h" +#include "ivas_prot_rend.h" +#include "ivas_prot.h" +#include "prot.h" +#include "ivas_stat_rend.h" +#include "ivas_rom_com.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + +#ifdef MASA_PREREND + + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_omasa_param_est_ana( OMASA_ANA_HANDLE hOMasa, float data_f[][L_FRAME48k], float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const int16_t input_frame, const int16_t nchan_ism ); + +static void ivas_omasa_dmx( float data_in_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_transport, const int16_t nchan_ism, const float ism_azimuth[MAX_NUM_OBJECTS], const float ism_elevation[MAX_NUM_OBJECTS], float prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], const float interpolator[L_FRAME48k] ); + + +/*--------------------------------------------------------------------------* + * ivas_omasa_ana_open() + * + * Allocate and initialize OMASA handle + *--------------------------------------------------------------------------*/ + +ivas_error ivas_omasa_ana_open( + OMASA_ANA_HANDLE *hOMasaPtr, /* i/o: OMASA data handle pointer */ + int32_t input_Fs, /* i: Sampling frequency */ + uint16_t total_num_objects /* i: Number of objects */ +) +{ + int16_t i, j; + OMASA_ANA_HANDLE hOMasa; + int16_t numAnalysisChannels; + int16_t maxBin; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( ( hOMasa = (OMASA_ANA_HANDLE) malloc( sizeof( OMASA_ANA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA\n" ) ); + } + + numAnalysisChannels = (int16_t) total_num_objects; + + /* Determine the number of bands */ + hOMasa->nbands = MASA_FREQUENCY_BANDS; + + /* Determine band grouping */ + mvs2s( MASA_band_grouping_24, hOMasa->band_grouping, 24 + 1 ); + + maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + for ( i = 1; i < hOMasa->nbands + 1; i++ ) + { + if ( hOMasa->band_grouping[i] >= maxBin ) + { + hOMasa->band_grouping[i] = maxBin; + hOMasa->nbands = i; + break; + } + } + + /* Determine block grouping */ + mvs2s( DirAC_block_grouping, hOMasa->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + + /* open/initialize CLDFB */ + hOMasa->num_Cldfb_instances = numAnalysisChannels; + for ( i = 0; i < hOMasa->num_Cldfb_instances; i++ ) + { + openCldfb( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ); + } + + /* intensity 3-dim */ + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + hOMasa->direction_vector_m[i] = (float **) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( float * ) ); + + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + hOMasa->direction_vector_m[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ); + set_zero( hOMasa->direction_vector_m[i][j], MASA_FREQUENCY_BANDS ); + } + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + hOMasa->buffer_intensity_real[i][j] = (float *) malloc( MASA_FREQUENCY_BANDS * sizeof( float ) ); + set_zero( hOMasa->buffer_intensity_real[i][j], MASA_FREQUENCY_BANDS ); + } + } + + set_zero( hOMasa->buffer_energy, DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS ); + + for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) + { + set_f( hOMasa->prev_object_dm_gains[i], (float) sqrt( 0.5 ), MASA_MAX_TRANSPORT_CHANNELS ); + } + + hOMasa->index_buffer_intensity = 0; + + if ( ( hOMasa->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + + if ( ( hOMasa->sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); + } + generate_gridEq( hOMasa->sph_grid16 ); + + ( *hOMasaPtr ) = hOMasa; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_ana_close() + * + * Close OMASA handle + *--------------------------------------------------------------------------*/ + +void ivas_omasa_ana_close( + OMASA_ANA_HANDLE *hOMasa /* i/o: analysis OMASA handle */ +) +{ + int16_t i, j; + + if ( hOMasa == NULL || *hOMasa == NULL ) + { + return; + } + + for ( i = 0; i < ( *hOMasa )->num_Cldfb_instances; i++ ) + { + deleteCldfb( &( ( *hOMasa )->cldfbAnaEnc[i] ) ); + } + + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + for ( j = 0; j < MAX_PARAM_SPATIAL_SUBFRAMES; j++ ) + { + free( ( *hOMasa )->direction_vector_m[i][j] ); + ( *hOMasa )->direction_vector_m[i][j] = NULL; + } + + for ( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) + { + free( ( *hOMasa )->buffer_intensity_real[i][j] ); + ( *hOMasa )->buffer_intensity_real[i][j] = NULL; + } + + free( ( *hOMasa )->direction_vector_m[i] ); + ( *hOMasa )->direction_vector_m[i] = NULL; + } + + free( ( *hOMasa )->hMasaOut ); + ( *hOMasa )->hMasaOut = NULL; + free( ( *hOMasa )->sph_grid16 ); + ( *hOMasa )->sph_grid16 = NULL; + + free( ( *hOMasa ) ); + ( *hOMasa ) = NULL; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_omasa_ana() + * + * OMASA analysis function + *--------------------------------------------------------------------------*/ + +void ivas_omasa_ana( + OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_ism /* i : Number of objects for parameter analysis */ +) +{ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + + /* Estimate MASA parameters from the objects */ + ivas_omasa_param_est_ana( hOMasa, data_in_f, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence, input_frame, nchan_ism ); + + /* Create MASA metadata buffer from the estimated values */ + ivas_create_masa_out_meta( hOMasa->hMasaOut, hOMasa->sph_grid16, nchan_transport, elevation_m_values, azimuth_m_values, energyRatio, spreadCoherence, surroundingCoherence ); + + /* Downmix */ + ivas_omasa_dmx( data_in_f, input_frame, nchan_transport, nchan_ism, hOMasa->ism_azimuth, hOMasa->ism_elevation, hOMasa->prev_object_dm_gains, hOMasa->interpolator ); + + return; +} + + +/*--------------------------------------------------------------------------* + * Local functions + *--------------------------------------------------------------------------*/ + +/* Estimate MASA parameters from the objects */ +static void ivas_omasa_param_est_ana( + OMASA_ANA_HANDLE hOMasa, + float data_f[][L_FRAME48k], + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const int16_t input_frame, + const int16_t nchan_ism ) +{ + float reference_power[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t ts, i, d, j; + int16_t num_freq_bins, num_freq_bands, index; + float dir_v[DIRAC_NUM_DIMS]; + int16_t l_ts; + float Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; + float diffuseness_vector[MASA_FREQUENCY_BANDS]; + float diffuseness_m[MASA_FREQUENCY_BANDS]; + + int16_t band_m_idx, block_m_idx; + float renormalization_factor_diff[MASA_FREQUENCY_BANDS]; + float norm_tmp; + int16_t mrange[2]; + int16_t brange[2]; + + num_freq_bins = hOMasa->cldfbAnaEnc[0]->no_channels; + num_freq_bands = hOMasa->nbands; + l_ts = input_frame / CLDFB_NO_COL_MAX; + + + /* Compute ISM to FOA matrices */ + for ( i = 0; i < nchan_ism; i++ ) + { + hOMasa->chnlToFoaMtx[0][i] = 1.0f; + hOMasa->chnlToFoaMtx[1][i] = sinf( ( hOMasa->ism_azimuth[i] / 180.0f * EVS_PI ) ) * cosf( ( hOMasa->ism_elevation[i] / 180.0f * EVS_PI ) ); + hOMasa->chnlToFoaMtx[2][i] = sinf( ( hOMasa->ism_elevation[i] / 180.0f * EVS_PI ) ); + hOMasa->chnlToFoaMtx[3][i] = cosf( ( hOMasa->ism_azimuth[i] / 180.0f * EVS_PI ) ) * cosf( ( hOMasa->ism_elevation[i] / 180.0f * EVS_PI ) ); + } + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = hOMasa->block_grouping[block_m_idx]; + mrange[1] = hOMasa->block_grouping[block_m_idx + 1]; + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + hOMasa->direction_vector_m[0][block_m_idx][band_m_idx] = 0.0f; + hOMasa->direction_vector_m[1][block_m_idx][band_m_idx] = 0.0f; + hOMasa->direction_vector_m[2][block_m_idx][band_m_idx] = 0.0f; + } + + /* Need to initialize renormalization_factors, and variables to be normalized */ + set_zero( renormalization_factor_diff, hOMasa->nbands ); + set_zero( diffuseness_m, hOMasa->nbands ); + set_zero( hOMasa->energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < nchan_ism; i++ ) + { + cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Chnl_RealBuffer[i], Chnl_ImagBuffer[i], l_ts, hOMasa->cldfbAnaEnc[i] ); + } + + /* Compute channel-based energy for metadata processing */ + for ( band_m_idx = 0; band_m_idx < num_freq_bands; band_m_idx++ ) + { + brange[0] = hOMasa->band_grouping[band_m_idx]; + brange[1] = hOMasa->band_grouping[band_m_idx + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + for ( i = 0; i < nchan_ism; i++ ) + { + hOMasa->energy[block_m_idx][band_m_idx] += Chnl_RealBuffer[i][j] * Chnl_RealBuffer[i][j] + Chnl_ImagBuffer[i][j] * Chnl_ImagBuffer[i][j]; + } + } + } + + /* Compute FOA */ + /* W */ + mvr2r( Chnl_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + mvr2r( Chnl_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_add( Chnl_RealBuffer[i], Foa_RealBuffer[0], Foa_RealBuffer[0], num_freq_bins ); + v_add( Chnl_ImagBuffer[i], Foa_ImagBuffer[0], Foa_ImagBuffer[0], num_freq_bins ); + } + + /* Y */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[1][0], Foa_RealBuffer[1], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[1][0], Foa_ImagBuffer[1], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[1][i], Foa_RealBuffer[1], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[1][i], Foa_ImagBuffer[1], num_freq_bins ); + } + + /* Z */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[2][0], Foa_RealBuffer[2], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[2][0], Foa_ImagBuffer[2], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[2][i], Foa_RealBuffer[2], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[2][i], Foa_ImagBuffer[2], num_freq_bins ); + } + + /* X */ + v_multc( Chnl_RealBuffer[0], hOMasa->chnlToFoaMtx[3][0], Foa_RealBuffer[3], num_freq_bins ); + v_multc( Chnl_ImagBuffer[0], hOMasa->chnlToFoaMtx[3][0], Foa_ImagBuffer[3], num_freq_bins ); + for ( i = 1; i < nchan_ism; i++ ) + { + v_multc_acc( Chnl_RealBuffer[i], hOMasa->chnlToFoaMtx[3][i], Foa_RealBuffer[3], num_freq_bins ); + v_multc_acc( Chnl_ImagBuffer[i], hOMasa->chnlToFoaMtx[3][i], Foa_ImagBuffer[3], num_freq_bins ); + } + + /* Direction estimation */ + computeIntensityVector_ana( hOMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); + computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); + + /* Power estimation for diffuseness */ + computeReferencePower_ana( hOMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands ); + + /* Fill buffers of length "averaging_length" time slots for intensity and energy */ + hOMasa->index_buffer_intensity = ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ + index = hOMasa->index_buffer_intensity; + for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) + { + /* only real part needed */ + mvr2r( intensity_real[i], &( hOMasa->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); + } + mvr2r( reference_power[ts], &( hOMasa->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hOMasa->buffer_intensity_real, hOMasa->buffer_energy, num_freq_bands, diffuseness_vector ); + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hOMasa->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hOMasa->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hOMasa->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + + diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hOMasa->direction_vector_m[d][block_m_idx][band_m_idx]; + } + ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &azimuth_m_values[block_m_idx][band_m_idx], &elevation_m_values[block_m_idx][band_m_idx] ); + } + + /* Determine energy ratios */ + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + if ( renormalization_factor_diff[band_m_idx] > EPSILON ) + { + diffuseness_m[band_m_idx] /= renormalization_factor_diff[band_m_idx]; + } + else + { + diffuseness_m[band_m_idx] = 0.0f; + } + + energyRatio[block_m_idx][band_m_idx] = 1.0f - diffuseness_m[band_m_idx]; + } + + /* Set coherences to zero, as this mode is used at lowest bit rates where the coherences are not transmitted */ + for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) + { + spreadCoherence[block_m_idx][band_m_idx] = 0.0f; + surroundingCoherence[block_m_idx][band_m_idx] = 0.0f; + } + } + + return; +} + + +/* Compute downmix */ +static void ivas_omasa_dmx( + float data_in_f[][L_FRAME48k], + const int16_t input_frame, + const int16_t nchan_transport, + const int16_t nchan_ism, + const float ism_azimuth[MAX_NUM_OBJECTS], + const float ism_elevation[MAX_NUM_OBJECTS], + float prev_gains[][MASA_MAX_TRANSPORT_CHANNELS], + const float interpolator[L_FRAME48k] ) +{ + int16_t i, j, k; + float azimuth, elevation; + float gains[MASA_MAX_TRANSPORT_CHANNELS]; + float g1, g2; + float data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; + + + for ( i = 0; i < nchan_transport; i++ ) + { + set_zero( data_out_f[i], input_frame ); + } + + for ( i = 0; i < nchan_ism; i++ ) + { + azimuth = ism_azimuth[i]; + elevation = ism_elevation[i]; + + ivas_ism_get_stereo_gains( azimuth, elevation, &gains[0], &gains[1] ); + + /* Downmix using the panning gains */ + for ( j = 0; j < nchan_transport; j++ ) + { + if ( fabsf( gains[j] ) > 0.0 || fabsf( prev_gains[i][j] ) > 0.0f ) + { + for ( k = 0; k < input_frame; k++ ) + { + g1 = interpolator[k]; + g2 = 1.0f - g1; + data_out_f[j][k] += ( g1 * gains[j] + g2 * prev_gains[i][j] ) * data_in_f[i][k]; + } + } + prev_gains[i][j] = gains[j]; + } + } + + for ( i = 0; i < nchan_transport; i++ ) + { + mvr2r( data_out_f[i], data_in_f[i], input_frame ); + } + + + return; +} + + +void computeIntensityVector_ana( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + const int16_t num_frequency_bands, /* i : Number of frequency bands */ + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector */ +) +{ + /* Reminder + * X = a + ib; Y = c + id + * X*Y = ac - bd + i(ad +bc) + */ + int16_t i, j; + float real, img; + int16_t brange[2]; + + for ( i = 0; i < num_frequency_bands; i++ ) + { + brange[0] = band_grouping[i]; + brange[1] = band_grouping[i + 1]; + + intensity_real[0][i] = 0; + intensity_real[1][i] = 0; + intensity_real[2][i] = 0; + + for ( j = brange[0]; j < brange[1]; j++ ) + { + real = Cldfb_RealBuffer[0][j]; + img = Cldfb_ImagBuffer[0][j]; + intensity_real[0][i] += Cldfb_RealBuffer[3][j] * real + Cldfb_ImagBuffer[3][j] * img; /* Intensity is XYZ order, audio is WYZX order. */ + intensity_real[1][i] += Cldfb_RealBuffer[1][j] * real + Cldfb_ImagBuffer[1][j] * img; + intensity_real[2][i] += Cldfb_RealBuffer[2][j] * real + Cldfb_ImagBuffer[2][j] * img; + } + } + + return; +} + + +void computeReferencePower_ana( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + float *reference_power, /* o : Estimated power */ + const int16_t num_freq_bands /* i : Number of frequency bands */ +) +{ + int16_t brange[2]; + int16_t ch_idx, i, j; + + for ( i = 0; i < num_freq_bands; i++ ) + { + brange[0] = band_grouping[i]; + brange[1] = band_grouping[i + 1]; + reference_power[i] = 0; + + for ( ch_idx = 0; ch_idx < DIRAC_MAX_ANA_CHANS; ch_idx++ ) + { + /* abs()^2 */ + for ( j = brange[0]; j < brange[1]; j++ ) + { + reference_power[i] += ( Cldfb_RealBuffer[ch_idx][j] * Cldfb_RealBuffer[ch_idx][j] ) + ( Cldfb_ImagBuffer[ch_idx][j] * Cldfb_ImagBuffer[ch_idx][j] ); + } + } + } + + v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); + + return; +} + +#endif /* MASA_PREREND */ diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 4c79280a86..d25f21a840 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -941,6 +941,113 @@ void ivas_orient_trk_GetTrackedOrientation( float *roll ); #endif + +#ifdef MASA_PREREND +ivas_error ivas_mcmasa_ana_open( + MCMASA_ANA_HANDLE *hMcMasaPtr, /* i/o: McMASA data handle pointer */ + const IVAS_REND_AudioConfig inConfig, /* i: Input config */ + int32_t input_Fs /* i: Sampling frequency */ +); + +void ivas_mcmasa_ana( + MCMASA_ANA_HANDLE hMcMasa, /* i/o: McMASA encoder handle */ + float data_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_inp /* i : Number of input channels */ +); + +void ivas_mcmasa_ana_close( + MCMASA_ANA_HANDLE *hMcMasa /* i/o: analysis McMASA handle */ +); + +ivas_error ivas_omasa_ana_open( + OMASA_ANA_HANDLE *hOMasaPtr, /* i/o: OMASA data handle pointer */ + int32_t input_Fs, /* i: Sampling frequency */ + uint16_t total_num_objects /* i: Number of objects */ +); + +void ivas_omasa_ana( + OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_ism /* i : Number of objects for parameter analysis */ +); + +void ivas_omasa_ana_close( + OMASA_ANA_HANDLE *hOMasa /* i/o: analysis OMASA handle */ +); + +void computeIntensityVector_ana( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + const int16_t num_frequency_bands, /* i : Number of frequency bands */ + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector */ +); + +void computeReferencePower_ana( + const int16_t *band_grouping, /* i : Band grouping for estimation */ + float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + float *reference_power, /* o : Estimated power */ + const int16_t num_freq_bands /* i : Number of frequency bands */ +); + +void ivas_create_masa_out_meta( + MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: MASA metadata handle */ + SPHERICAL_GRID_DATA *Sph_Grid16, /* i: Spherical grid */ + const int16_t nchan_transport, /* i: Number of transport channels */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: Estimated surround coherence */ +); + +ivas_error ivas_dirac_ana_open( + DIRAC_ANA_HANDLE *hDirACPtr, /* i/o: DIRAC data handle pointer */ + int32_t input_Fs +); + +void ivas_dirac_ana( + DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport /* i : Number of transport channels */ +); + +void ivas_dirac_ana_close( + DIRAC_ANA_HANDLE ( *hDirAC ) /* i/o: analysis DIRAC handle */ +); + +void ivas_prerend_merge_masa_metadata( + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta1, /* i: Input metadata 1 */ + IVAS_REND_AudioConfigType inType1, /* i: Type of input 1 */ + float inEne1[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2, /* i: Input metadata 2 */ + IVAS_REND_AudioConfigType inType2, /* i: Type of input 2 */ + float inEne2[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ +); + +void copy_masa_descriptive_meta( + MASA_DECRIPTIVE_META *outMeta, /* o: metadata to be written */ + MASA_DECRIPTIVE_META *inMeta /* i: input metadata */ +); + +ivas_error masaPrerendOpen( + MASA_PREREND_HANDLE *hMasaPrerendPtr, /* o: handle to the opened prerenderer */ + int16_t numTransports, /* i: number of transport channels */ + int32_t input_Fs /* i: signal sampling rate */ +); + +void masaPrerendClose( + MASA_PREREND_HANDLE *hMasaPrerendPtr /* i/o: prerenderer handle to be closed */ +); +#endif + /* clang-format on */ #endif /* IVAS_PROT_REND_H */ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 13c6084b2d..025d99a359 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -37,6 +37,9 @@ #include "options.h" #include "ivas_cnst.h" #include "ivas_stat_com.h" // note: needed for DIRAC_DEC_BIN_HANDLE until #156 is solved +#ifdef MASA_PREREND +#include "stat_com.h" /* Note: Currently needed for CLDFB. */ +#endif #include "common_api_types.h" @@ -858,4 +861,132 @@ typedef enum CHANNEL_TYPE_LFE } ChannelType; +#ifdef MASA_PREREND +/*----------------------------------------------------------------------------------* + * Multichannel MASA (McMASA) analysis structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_mcmasa_ana_data_structure +{ + int16_t nbands; + + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MCMASA_MAX_ANA_CHANS]; + + /* DirAC parameter estimation */ + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + int16_t block_grouping[5]; + + /* diffuseness */ + int16_t index_buffer_intensity; + float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + float *buffer_intensity_real_vert[DIRAC_NO_COL_AVG_DIFF]; + float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + + float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaEvenMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float ls_azimuth[MCMASA_MAX_ANA_CHANS]; + int16_t leftNearest[MCMASA_MAX_ANA_CHANS]; + int16_t rightNearest[MCMASA_MAX_ANA_CHANS]; + int16_t numHorizontalChannels; + uint8_t isHorizontalSetup; + + float prevMultiChEne; + float prevDownmixEne; + float prevEQ; + float interpolator[L_FRAME48k]; + + MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; + SPHERICAL_GRID_DATA *sph_grid16; + + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} MCMASA_ANA_DATA, *MCMASA_ANA_HANDLE; + +/*----------------------------------------------------------------------------------* + * Object MASA (OMASA) analysis structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_omasa_ana_data_structure +{ + uint8_t nbands; + + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MAX_NUM_OBJECTS]; + + /* DirAC parameter estimation */ + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + int16_t block_grouping[5]; + + /* diffuseness */ + int16_t index_buffer_intensity; + float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + + float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + + float interpolator[L_FRAME48k]; + + float prev_object_dm_gains[MAX_NUM_OBJECTS][MASA_MAX_TRANSPORT_CHANNELS]; + + MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; + SPHERICAL_GRID_DATA *sph_grid16; + float ism_azimuth[MAX_NUM_OBJECTS]; + float ism_elevation[MAX_NUM_OBJECTS]; + + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} OMASA_ANA_DATA, *OMASA_ANA_HANDLE; + +/*----------------------------------------------------------------------------------* + * DirAC analysis structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_dirac_ana_data_structure +{ + uint8_t nbands; + + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[DIRAC_MAX_ANA_CHANS]; + + /* DirAC parameter estimation */ + float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ + int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; + int16_t block_grouping[5]; + + /* diffuseness */ + int16_t index_buffer_intensity; + float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; + float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; + + MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; + SPHERICAL_GRID_DATA *sph_grid16; + + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} DIRAC_ANA_DATA, *DIRAC_ANA_HANDLE; + +/*----------------------------------------------------------------------------------* + * MASA prerend structure + *----------------------------------------------------------------------------------*/ + +typedef struct ivas_masa_prerend_data_structure +{ + /* CLDFB analysis */ + int16_t num_Cldfb_instances; + HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MASA_MAX_TRANSPORT_CHANNELS]; + + MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; + SPHERICAL_GRID_DATA *sph_grid16; + + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + +} MASA_PREREND_DATA, *MASA_PREREND_HANDLE; +#endif + #endif /* IVAS_STAT_REND_H */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 1dc1c1f956..989879e3f4 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -118,6 +118,10 @@ typedef struct CREND_WRAPPER_HANDLE crendWrapper; REVERB_HANDLE hReverb; rotation_matrix rot_mat_prev; +#ifdef MASA_PREREND + OMASA_ANA_HANDLE hOMasa; + uint16_t total_num_objects; +#endif } input_ism; typedef struct @@ -145,6 +149,9 @@ typedef struct REVERB_HANDLE hReverb; rotation_gains rot_gains_prev; lfe_routing lfeRouting; +#ifdef MASA_PREREND + MCMASA_ANA_HANDLE hMcMasa; +#endif } input_mc; typedef struct @@ -153,6 +160,9 @@ typedef struct pan_matrix hoaDecMtx; CREND_WRAPPER_HANDLE crendWrapper; rotation_gains rot_gains_prev; +#ifdef MASA_PREREND + DIRAC_ANA_HANDLE hDirAC; +#endif } input_sba; /* Due to API of some rendering methods, the renderer has to use the decoder struct. @@ -165,6 +175,9 @@ typedef struct DecoderDummy *decDummy; MASA_METADATA_FRAME masaMetadata; bool metadataHasBeenFed; +#ifdef MASA_PREREND + MASA_PREREND_HANDLE hMasaPrerend; +#endif } input_masa; struct IVAS_REND @@ -422,6 +435,10 @@ static ivas_error validateOutputAudioConfig( case IVAS_REND_AUDIO_CONFIG_HOA3: case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#ifdef MASA_PREREND + case IVAS_REND_AUDIO_CONFIG_MASA1: + case IVAS_REND_AUDIO_CONFIG_MASA2: +#endif return IVAS_ERR_OK; default: break; @@ -1082,6 +1099,31 @@ static bool isIoConfigPairSupported( return true; } +#ifdef MASA_PREREND +static ivas_error initIsmMasaRendering( + input_ism *inputIsm, + const IVAS_REND_AudioConfig inConfig, + int32_t inSampleRate ) +{ + ivas_error error; + + if ( inputIsm->tdRendWrapper.hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &inputIsm->tdRendWrapper.hBinRendererTd ); + inputIsm->tdRendWrapper.hHrtfTD = NULL; + } + ivas_rend_closeCrend( &inputIsm->crendWrapper ); + ivas_reverb_close( &inputIsm->hReverb ); + + if ( ( error = ivas_omasa_ana_open( &inputIsm->hOMasa, inSampleRate, inputIsm->total_num_objects ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} +#endif + static ivas_error setRendInputActiveIsm( void *input, const IVAS_REND_AudioConfig inConfig, @@ -1110,6 +1152,9 @@ static ivas_error setRendInputActiveIsm( inputIsm->hReverb = NULL; inputIsm->tdRendWrapper = defaultTdRendWrapper(); initRotMatrix( inputIsm->rot_mat_prev ); +#ifdef MASA_PREREND + inputIsm->hOMasa = NULL; +#endif error = IVAS_ERR_OK; if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) @@ -1153,6 +1198,15 @@ static ivas_error setRendInputActiveIsm( } } } +#ifdef MASA_PREREND + else if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + if ( ( error = initIsmMasaRendering( inputIsm, inConfig, *rendCtx.pOutSampleRate) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif return IVAS_ERR_OK; } @@ -1178,6 +1232,10 @@ static void clearInputIsm( inputIsm->tdRendWrapper.hHrtfTD = NULL; } +#ifdef MASA_PREREND + ivas_omasa_ana_close( &( inputIsm->hOMasa ) ); +#endif + return; } @@ -1767,6 +1825,10 @@ static ivas_error updateMcPanGains( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; +#ifdef MASA_PREREND + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + break; /* Do nothing */ +#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -1880,6 +1942,35 @@ static ivas_error initMcBinauralRendering( return IVAS_ERR_OK; } +#ifdef MASA_PREREND +static ivas_error initMcMasaRendering( + input_mc *inputMc, + const IVAS_REND_AudioConfig inConfig, + int32_t inSampleRate ) +{ + ivas_error error; + + if ( inputMc->tdRendWrapper.hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &inputMc->tdRendWrapper.hBinRendererTd ); + inputMc->tdRendWrapper.hHrtfTD = NULL; + } + ivas_rend_closeCrend( &inputMc->crendWrapper ); + ivas_reverb_close( &inputMc->hReverb ); + if ( inputMc->efapInWrapper.hEfap != NULL ) + { + efap_free_data( &inputMc->efapInWrapper.hEfap ); + } + + if ( ( error = ivas_mcmasa_ana_open( &inputMc->hMcMasa, inConfig, inSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} +#endif + static lfe_routing defaultLfeRouting( const IVAS_REND_AudioConfig inConfig, const LSSETUP_CUSTOM_STRUCT customLsIn, @@ -1964,6 +2055,9 @@ static ivas_error setRendInputActiveMc( inputMc->tdRendWrapper = defaultTdRendWrapper(); inputMc->crendWrapper = NULL; inputMc->hReverb = NULL; +#ifdef MASA_PREREND + inputMc->hMcMasa = NULL; +#endif initRotGains( inputMc->rot_gains_prev ); inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); @@ -1975,6 +2069,16 @@ static ivas_error setRendInputActiveMc( } } +#ifdef MASA_PREREND + if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + if ( ( error = initMcMasaRendering( inputMc, inConfig, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + if ( ( error = updateMcPanGains( inputMc, outConfig ) ) != IVAS_ERR_OK ) { return error; @@ -2008,6 +2112,10 @@ static void clearInputMc( inputMc->tdRendWrapper.hHrtfTD = NULL; } +#ifdef MASA_PREREND + ivas_mcmasa_ana_close( &( inputMc->hMcMasa ) ); +#endif + return; } @@ -2156,6 +2264,11 @@ static ivas_error updateSbaPanGains( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; +#ifdef MASA_PREREND + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + error = IVAS_ERR_OK; + break; /* Do nothing */ +#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -2168,6 +2281,24 @@ static ivas_error updateSbaPanGains( return IVAS_ERR_OK; } +#ifdef MASA_PREREND +static ivas_error initSbaMasaRendering( + input_sba *inputSba, + int32_t inSampleRate ) +{ + ivas_error error; + + ivas_rend_closeCrend( &inputSba->crendWrapper ); + + if ( ( error = ivas_dirac_ana_open( &inputSba->hDirAC, inSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + + return IVAS_ERR_OK; +} +#endif + static ivas_error setRendInputActiveSba( void *input, const IVAS_REND_AudioConfig inConfig, @@ -2191,8 +2322,21 @@ static ivas_error setRendInputActiveSba( initRendInputBase( &inputSba->base, inConfig, id, rendCtx ); setZeroPanMatrix( inputSba->hoaDecMtx ); inputSba->crendWrapper = NULL; +#ifdef MASA_PREREND + inputSba->hDirAC = NULL; +#endif initRotGains( inputSba->rot_gains_prev ); +#ifdef MASA_PREREND + if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + if ( ( error = initSbaMasaRendering( inputSba, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + if ( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) { return error; @@ -2213,6 +2357,10 @@ static void clearInputSba( /* Free input's internal handles */ ivas_rend_closeCrend( &inputSba->crendWrapper ); +#ifdef MASA_PREREND + ivas_dirac_ana_close( &( inputSba->hDirAC ) ); +#endif + return; } @@ -2258,6 +2406,7 @@ static ivas_error initMasaDummyDecForMcOut( { return error; } + decDummy->hDirAC->dirac_bs_md_write_idx = 0; if ( decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC ) { @@ -2334,6 +2483,7 @@ static ivas_error initMasaDummyDecForSbaOut( { return error; } + decDummy->hDirAC->dirac_bs_md_write_idx = 0; numCldfbAnalyses = decDummy->nchan_transport; numCldfbSyntheses = decDummy->hDecoderConfig->nchan_out; @@ -2402,6 +2552,7 @@ static ivas_error initMasaDummyDecForBinauralOut( { return error; } + decDummy->hDirAC->dirac_bs_md_write_idx = 0; if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &decDummy->hHrtfParambin ) ) != IVAS_ERR_OK ) { @@ -2562,6 +2713,26 @@ static ivas_error setRendInputActiveMasa( { return error; } +#ifdef MASA_PREREND + if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + inputMasa->metadataHasBeenFed = false; + if ( ( error = masaPrerendOpen( &inputMasa->hMasaPrerend, inputMasa->base.inConfig == IVAS_REND_AUDIO_CONFIG_MASA1 ? 1 : 2, *( inputMasa->base.ctx.pOutSampleRate ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + inputMasa->decDummy = initDecoderDummy( *rendCtx.pOutSampleRate, numInChannels, outConfig, 0 ); + inputMasa->metadataHasBeenFed = false; + + if ( ( error = updateMasaDummyDec( inputMasa, outConfig ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#else inputMasa->decDummy = initDecoderDummy( *rendCtx.pOutSampleRate, numInChannels, outConfig, 0 ); inputMasa->metadataHasBeenFed = false; @@ -2569,6 +2740,7 @@ static ivas_error setRendInputActiveMasa( { return error; } +#endif return IVAS_ERR_OK; } @@ -2651,6 +2823,9 @@ static void clearInputMasa( rendCtx = inputMasa->base.ctx; +#ifdef MASA_PREREND + masaPrerendClose( &inputMasa->hMasaPrerend ); +#endif initRendInputBase( &inputMasa->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx ); freeDecoderDummy( &inputMasa->decDummy ); @@ -3465,6 +3640,33 @@ ivas_error IVAS_REND_GetInputNumChannels( } +#ifdef MASA_PREREND +/*-------------------------------------------------------------------* + * IVAS_REND_GetNumAllObjects() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetNumAllObjects( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + int16_t *numChannels /* o : number of all objects */ +) +{ + if ( hIvasRend == NULL || numChannels == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + *numChannels = (int16_t) hIvasRend->inputsIsm[0].total_num_objects; + } + + return IVAS_ERR_OK; +} +#endif + + /*-------------------------------------------------------------------* * IVAS_REND_GetDelay() * @@ -3587,6 +3789,12 @@ ivas_error IVAS_REND_FeedInputAudio( { return error; } +#ifdef MASA_PREREND + if ( ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) && inputBase->inConfig == IVAS_REND_AUDIO_CONFIG_OBJECT ) + { + numInputChannels = ( int16_t ) hIvasRend->inputsIsm[0].total_num_objects; + } +#endif if ( numInputChannels != inputAudio.config.numChannels ) { @@ -3644,6 +3852,34 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( } +#ifdef MASA_PREREND +/*-------------------------------------------------------------------* + * IVAS_REND_FeedInputObjectMetadata() + * + * + *-------------------------------------------------------------------*/ + +ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const int16_t inputIndex, /* i : Index of the input */ + const IVAS_REND_AudioObjectPosition objectPosition /* i : object position struct */ +) +{ + /* Validate function arguments */ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Set position to OMasa struct */ + hIvasRend->inputsIsm->hOMasa->ism_azimuth[inputIndex] = objectPosition.azimuth; + hIvasRend->inputsIsm->hOMasa->ism_elevation[inputIndex] = objectPosition.elevation; + + return IVAS_ERR_OK; +} +#endif + + /*-------------------------------------------------------------------* * IVAS_REND_FeedInputMasaMetadata() * @@ -4643,6 +4879,25 @@ static ivas_error renderIsmToSba( return error; } +#ifdef MASA_PREREND +static ivas_error renderIsmToMasa( + input_ism *ismInput, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_NUM_OBJECTS][L_FRAME48k]; + + push_wmops( "renderIsmToMasa" ); + + copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); + ivas_omasa_ana( ismInput->hOMasa, tmpRendBuffer, ismInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, ismInput->base.inputBuffer.config.numChannels ); + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + pop_wmops(); + + return IVAS_ERR_OK; +} +#endif + static ivas_error renderInputIsm( input_ism *ismInput, const IVAS_REND_AudioConfig outConfig, @@ -4684,6 +4939,11 @@ static ivas_error renderInputIsm( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; +#ifdef MASA_PREREND + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + error = renderIsmToMasa( ismInput, outAudio ); + break; +#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -5030,6 +5290,25 @@ static void renderMcToSba( return; } +#ifdef MASA_PREREND +static ivas_error renderMcToMasa( + input_mc *mcInput, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + push_wmops( "renderMcToMasa" ); + + copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); + ivas_mcmasa_ana( mcInput->hMcMasa, tmpRendBuffer, mcInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels, mcInput->base.inputBuffer.config.numChannels ); + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + pop_wmops(); + + return IVAS_ERR_OK; +} +#endif + static ivas_error renderInputMc( input_mc *mcInput, IVAS_REND_AudioConfig outConfig, @@ -5083,6 +5362,11 @@ static ivas_error renderInputMc( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; +#ifdef MASA_PREREND + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + renderMcToMasa( mcInput, outAudio ); + break; +#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -5280,6 +5564,25 @@ static ivas_error renderSbaToBinauralRoom( return IVAS_ERR_OK; } +#ifdef MASA_PREREND +static ivas_error renderSbaToMasa( + input_sba *sbaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + + push_wmops( "renderMcToMasa" ); + + copyBufferTo2dArray( sbaInput->base.inputBuffer, tmpRendBuffer ); + ivas_dirac_ana( sbaInput->hDirAC, tmpRendBuffer, sbaInput->base.inputBuffer.config.numSamplesPerChannel, outAudio.config.numChannels ); + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + + pop_wmops(); + + return IVAS_ERR_OK; +} +#endif + static ivas_error renderInputSba( input_sba *sbaInput, const IVAS_REND_AudioConfig outConfig, @@ -5326,6 +5629,11 @@ static ivas_error renderInputSba( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; +#ifdef MASA_PREREND + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + renderSbaToMasa( sbaInput, outAudio ); + break; +#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -5363,34 +5671,39 @@ static void copyMasaMetadataToDiracRenderer( DIRAC_DEC_HANDLE hDirAC ) { int16_t band, sf, bin; + int16_t meta_write_index; hDirAC->numSimultaneousDirections = meta->descriptive_meta.numberOfDirections + 1; for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { + meta_write_index = ( hDirAC->dirac_bs_md_write_idx + sf ) % hDirAC->dirac_md_buffer_length; + for ( band = 0; band < MASA_MAXIMUM_CODING_SUBBANDS; band++ ) { for ( bin = MASA_band_grouping_24[band]; bin < MASA_band_grouping_24[band + 1]; bin++ ) { - hDirAC->azimuth[sf][bin] = (int16_t) meta->directional_meta[0].azimuth[sf][band]; - hDirAC->elevation[sf][bin] = (int16_t) meta->directional_meta[0].elevation[sf][band]; - hDirAC->energy_ratio1[sf][bin] = meta->directional_meta[0].energy_ratio[sf][band]; - hDirAC->diffuseness_vector[sf][bin] = 1.0f - meta->directional_meta[0].energy_ratio[sf][band]; - hDirAC->spreadCoherence[sf][bin] = meta->directional_meta[0].spread_coherence[sf][band]; - hDirAC->surroundingCoherence[sf][bin] = meta->common_meta.surround_coherence[sf][band]; + hDirAC->azimuth[meta_write_index][bin] = (int16_t) meta->directional_meta[0].azimuth[sf][band]; + hDirAC->elevation[meta_write_index][bin] = (int16_t) meta->directional_meta[0].elevation[sf][band]; + hDirAC->energy_ratio1[meta_write_index][bin] = meta->directional_meta[0].energy_ratio[sf][band]; + hDirAC->diffuseness_vector[meta_write_index][bin] = 1.0f - meta->directional_meta[0].energy_ratio[sf][band]; + hDirAC->spreadCoherence[meta_write_index][bin] = meta->directional_meta[0].spread_coherence[sf][band]; + hDirAC->surroundingCoherence[meta_write_index][bin] = meta->common_meta.surround_coherence[sf][band]; if ( hDirAC->numSimultaneousDirections == 2 ) { - hDirAC->azimuth2[sf][bin] = (int16_t) meta->directional_meta[1].azimuth[sf][band]; - hDirAC->elevation2[sf][bin] = (int16_t) meta->directional_meta[1].elevation[sf][band]; - hDirAC->energy_ratio2[sf][bin] = meta->directional_meta[1].energy_ratio[sf][band]; - hDirAC->diffuseness_vector[sf][bin] -= meta->directional_meta[1].energy_ratio[sf][band]; - hDirAC->spreadCoherence2[sf][bin] = meta->directional_meta[1].spread_coherence[sf][band]; + hDirAC->azimuth2[meta_write_index][bin] = (int16_t) meta->directional_meta[1].azimuth[sf][band]; + hDirAC->elevation2[meta_write_index][bin] = (int16_t) meta->directional_meta[1].elevation[sf][band]; + hDirAC->energy_ratio2[meta_write_index][bin] = meta->directional_meta[1].energy_ratio[sf][band]; + hDirAC->diffuseness_vector[meta_write_index][bin] -= meta->directional_meta[1].energy_ratio[sf][band]; + hDirAC->spreadCoherence2[meta_write_index][bin] = meta->directional_meta[1].spread_coherence[sf][band]; } } } } + hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length; + return; } @@ -5450,6 +5763,136 @@ static void renderMasaToBinaural( return; } +#ifdef MASA_PREREND +static void renderMasaToMasa( + input_masa *masaInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t sf, band, dir, numDirs; + float ratioSum; + MASA_DECODER_EXT_OUT_META_HANDLE outMeta; + MASA_METADATA_FRAME *inMeta; + float tmpBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + int16_t ts, i, j, l_ts; + float Chan_RealBuffer[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Chan_ImagBuffer[MASA_MAX_TRANSPORT_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + + int16_t band_m_idx, block_m_idx; + int16_t mrange[2]; + int16_t brange[2]; + int16_t numAnalysisChannels; + + copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); + + /* Calculate energy */ + l_ts = masaInput->base.inputBuffer.config.numSamplesPerChannel / CLDFB_NO_COL_MAX; + numAnalysisChannels = masaInput->hMasaPrerend->num_Cldfb_instances; + + + /* do processing over all CLDFB time slots */ + for ( block_m_idx = 0; block_m_idx < MAX_PARAM_SPATIAL_SUBFRAMES; block_m_idx++ ) + { + mrange[0] = DirAC_block_grouping[block_m_idx]; + mrange[1] = DirAC_block_grouping[block_m_idx + 1]; + + set_zero( masaInput->hMasaPrerend->energy[block_m_idx], MASA_FREQUENCY_BANDS ); + + for ( ts = mrange[0]; ts < mrange[1]; ts++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + cldfbAnalysis_ts( &( tmpBuffer[i][l_ts * ts] ), Chan_RealBuffer[i], Chan_ImagBuffer[i], l_ts, masaInput->hMasaPrerend->cldfbAnaEnc[i] ); + } + + /* Compute channel energy for metadata processing */ + for ( band_m_idx = 0; band_m_idx < MASA_FREQUENCY_BANDS; band_m_idx++ ) + { + brange[0] = MASA_band_grouping_24[band_m_idx]; + brange[1] = MASA_band_grouping_24[band_m_idx + 1]; + for ( j = brange[0]; j < brange[1]; j++ ) + { + for ( i = 0; i < numAnalysisChannels; i++ ) + { + masaInput->hMasaPrerend->energy[block_m_idx][band_m_idx] += Chan_RealBuffer[0][j] * Chan_RealBuffer[0][j] + Chan_ImagBuffer[0][j] * Chan_ImagBuffer[0][j]; + } + } + } + } + } + + /* Copy audio channels if mismatch in number of transports */ + if ( masaInput->base.inputBuffer.config.numChannels == 1 && outAudio.config.numChannels == 2 ) + { + mvr2r( tmpBuffer[0], tmpBuffer[1], masaInput->base.inputBuffer.config.numSamplesPerChannel ); + } + else if ( masaInput->base.inputBuffer.config.numChannels == 2 && outAudio.config.numChannels == 1 ) + { + v_add( tmpBuffer[0], tmpBuffer[1], tmpBuffer[0], masaInput->base.inputBuffer.config.numSamplesPerChannel ); + } + + /* Copy metadata */ + outMeta = masaInput->hMasaPrerend->hMasaOut; + inMeta = &masaInput->masaMetadata; + numDirs = inMeta->descriptive_meta.numberOfDirections + 1; + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + /* Remainder is always set to zero and energy removal is compensated in following steps + * to other ratios. */ + inMeta->common_meta.remainder_to_total_ratio[sf][band] = 0.0f; + + ratioSum = 0; + for ( dir = 0; dir < numDirs; dir++ ) + { + ratioSum += inMeta->directional_meta[dir].energy_ratio[sf][band]; + } + ratioSum += inMeta->common_meta.diffuse_to_total_ratio[sf][band]; + + if ( ratioSum == 0.0f ) + { + for ( dir = 0; dir < numDirs; dir++ ) + { + inMeta->directional_meta[dir].energy_ratio[sf][band] = 0.0f; + } + inMeta->common_meta.diffuse_to_total_ratio[sf][band] = 1.0f; + } + else if ( ratioSum != 1.0f ) + { + for ( dir = 0; dir < numDirs; dir++ ) + { + inMeta->directional_meta[dir].energy_ratio[sf][band] /= ratioSum; + } + inMeta->common_meta.diffuse_to_total_ratio[sf][band] /= ratioSum; + } + } + } + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + outMeta->diffuseToTotalRatio[sf][band] = UINT8_MAX; + for ( dir = 0; dir < numDirs; dir++ ) + { + outMeta->directionIndex[dir][sf][band] = index_theta_phi_16( inMeta->directional_meta[dir].elevation[sf][band], inMeta->directional_meta[dir].azimuth[sf][band], masaInput->hMasaPrerend->sph_grid16 ); + outMeta->directToTotalRatio[dir][sf][band] = (uint8_t) floorf( inMeta->directional_meta[dir].energy_ratio[sf][band] * UINT8_MAX ); + outMeta->diffuseToTotalRatio[sf][band] -= outMeta->directToTotalRatio[dir][sf][band]; + outMeta->spreadCoherence[dir][sf][band] = (uint8_t) floorf( inMeta->directional_meta[dir].spread_coherence[sf][band] * UINT8_MAX ); + } + outMeta->surroundCoherence[sf][band] = (uint8_t) floorf( inMeta->common_meta.surround_coherence[sf][band] * UINT8_MAX ); + } + } + + copy_masa_descriptive_meta( &(outMeta->descriptiveMeta), &(inMeta->descriptive_meta) ); + + accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); + + return; +} +#endif + static ivas_error renderInputMasa( input_masa *masaInput, const IVAS_REND_AudioConfig outConfig, @@ -5499,6 +5942,11 @@ static ivas_error renderInputMasa( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; +#ifdef MASA_PREREND + case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: + renderMasaToMasa( masaInput, outAudio ); + break; +#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -5532,6 +5980,152 @@ static ivas_error renderActiveInputsMasa( } +#ifdef MASA_PREREND +/*---------------------------------------------------------------------* + * IVAS_REND_GetMasaMetadata( ) + * + * Get metadata of the estimated MASA frame + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_GetMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ + IVAS_REND_AudioConfigType inputType /* i : Input type */ +) +{ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Get the metadata handle */ + if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; + } + else if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; + } + else if ( inputType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; + } + else + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_MergeMasaMetadata( ) + * + * Merge MASA metadata from two formats + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_MergeMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to merged metadata */ + IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ + IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ +) +{ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta2; + float (*inEne1)[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float (*inEne2)[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* Input1 metadata and energy */ + if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; + inEne1 = &(hIvasRend->inputsIsm->hOMasa->energy); + } + else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; + inEne1 = &(hIvasRend->inputsMc->hMcMasa->energy); + } + else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; + inEne1 = &(hIvasRend->inputsSba->hDirAC->energy); + } + else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + *hMasaExtOutMeta = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; + inEne1 = &(hIvasRend->inputsMasa->hMasaPrerend->energy); + } + else + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + /* Input2 metadata and energy */ + if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) + { + inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; + inEne2 = &(hIvasRend->inputsIsm->hOMasa->energy); + } + else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) + { + inMeta2 = hIvasRend->inputsMc->hMcMasa->hMasaOut; + inEne2 = &(hIvasRend->inputsMc->hMcMasa->energy); + } + else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) + { + inMeta2 = hIvasRend->inputsSba->hDirAC->hMasaOut; + inEne2 = &(hIvasRend->inputsSba->hDirAC->energy); + } + else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + inMeta2 = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; + inEne2 = &(hIvasRend->inputsMasa->hMasaPrerend->energy); + } + else + { + return IVAS_ERR_NOT_SUPPORTED_OPTION; + } + + /* Merge metadata */ + ivas_prerend_merge_masa_metadata( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1, inMeta2, inputType2, *inEne2 ); + (*hMasaExtOutMeta)->descriptiveMeta.numberOfChannels = hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA1 ? 0u : 1u; + + + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * IVAS_REND_SetTotalNumberOfObjects( ) + * + * Set the total number of objects to the first object data + *---------------------------------------------------------------------*/ + +ivas_error IVAS_REND_SetTotalNumberOfObjects( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const uint16_t total_num_objects /* i: total number of objects */ +) +{ + if ( hIvasRend == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + hIvasRend->inputsIsm[0].total_num_objects = total_num_objects; + + return IVAS_ERR_OK; +} +#endif + + /*-------------------------------------------------------------------* * IVAS_REND_GetSamples() * diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index b313bea5c1..55bcea29ed 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -221,6 +221,14 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( const IVAS_REND_AudioObjectPosition objectPosition /* i : object position struct */ ); +#ifdef MASA_PREREND +ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const int16_t inputIndex, /* i : Index of the input */ + const IVAS_REND_AudioObjectPosition objectPosition /* i : object position struct */ +); +#endif + ivas_error IVAS_REND_FeedInputMasaMetadata( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_InputId inputId, /* i : ID of the input */ @@ -282,6 +290,31 @@ ivas_error IVAS_REND_SetReferenceVector( #endif /* OTR_REFERENCE_VECTOR_TRACKING */ #endif /* FIX_I109_ORIENTATION_TRACKING */ +#ifdef MASA_PREREND +ivas_error IVAS_REND_GetMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ + IVAS_REND_AudioConfigType inputType /* i : Input type */ +); + +ivas_error IVAS_REND_MergeMasaMetadata( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to merged metadata */ + IVAS_REND_AudioConfigType inputType1, /* i : Input type 1 */ + IVAS_REND_AudioConfigType inputType2 /* i : Input type 2 */ +); + +ivas_error IVAS_REND_SetTotalNumberOfObjects( + IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ + const uint16_t total_num_objects /* i: total number of objects */ +); + +ivas_error IVAS_REND_GetNumAllObjects( + IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ + int16_t *numChannels /* o : number of all objects */ +); +#endif + ivas_error IVAS_REND_GetSamples( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ IVAS_REND_AudioBuffer outAudio /* i/o: buffer for output audio */ -- GitLab From 3d04f9e7a55e401cc9329586c80572f0d6ccbb8f Mon Sep 17 00:00:00 2001 From: Fredrik Jansson Date: Thu, 13 Apr 2023 11:56:05 +0200 Subject: [PATCH 015/381] Added alternate fix in an inactive define --- lib_com/options.h | 2 ++ lib_enc/ivas_stereo_dft_enc.c | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 238a1a9a04..ee0908cd84 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -168,6 +168,8 @@ #define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ +/*#define FIX_395_CNG_BW_ALT*/ /* Eri: Issue 395 - CNG bandwidth issue for unified stereo Alternate solution */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index ab4844ab94..121064c95a 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -2172,6 +2172,18 @@ void stereo_dft_enc_write_BS( k_offset = STEREO_DFT_OFFSET; nbands_full = hStereoDft->nbands; +#ifdef FIX_395_CNG_BW_ALT + if ( core_brate == SID_2k40 ) + { + NFFT_inner = min( STEREO_DFT_N_32k_ENC,STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k ); + } + else + { + NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; + } + + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); +#else NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; if ( !( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) ) @@ -2179,6 +2191,7 @@ void stereo_dft_enc_write_BS( /* set number of bands according to bandwidth after BWD */ hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); } +#endif if ( core_brate == FRAME_NO_DATA ) { -- GitLab From 4168f1d2024d87a82ea9a47ba9d3c148dd454015 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Thu, 13 Apr 2023 21:38:38 +0200 Subject: [PATCH 016/381] Branch for contribution 48 - Enhanced stereo downmix. --- lib_com/ivas_cnst.h | 20 ++ lib_com/options.h | 1 + lib_enc/ivas_stat_enc.h | 34 +++ lib_enc/ivas_stereo_dmx_evs.c | 526 ++++++++++++++++++++++++++++++++++ 4 files changed, 581 insertions(+) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 0b326ba8a5..0641426751 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1677,6 +1677,26 @@ typedef enum #define IVAS_LIMITER_THRESHOLD 32729 /* -0.01 dBFS */ #define IVAS_LIMITER_ATTACK_SECONDS 0.005f +#ifdef ENHANCED_STEREO_DMX +/*----------------------------------------------------------------------------------* + * Stereo downmix EVS constants + *----------------------------------------------------------------------------------*/ + +typedef enum +{ + STEREO_DMX_EVS_PHA_IPD, + STEREO_DMX_EVS_PHA_IPD2, + STEREO_DMX_EVS_NO_PHA + +} STEREO_DMX_EVS_PHA; + +typedef enum +{ + STEREO_DMX_EVS_PRC_POC, + STEREO_DMX_EVS_PRC_PHA, + +} STEREO_DMX_EVS_PRC; +#endif #endif /* clang-format on */ diff --git a/lib_com/options.h b/lib_com/options.h index cce0aff460..c279f8bc41 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -169,6 +169,7 @@ #define ISSUE_24_CLEANUP_MCT_LFE /* Issue 24: Cleanup LFE path withing MCT */ +#define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 6638a89488..3bc8502e8f 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -982,9 +982,43 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure } STEREO_DMX_EVS_POC_DATA, *STEREO_DMX_EVS_POC_HANDLE; +#ifdef ENHANCED_STEREO_DMX +typedef struct stereo_dmx_evs_correlation_filter_structure +{ + float ipd_ff[L_FRAME48k / 2 + 1]; + float Pr[L_FRAME48k / 2 + 1]; + float Pi[L_FRAME48k / 2 + 1]; + + int32_t pha_len; + int32_t fad_len; + + float win[L_FRAME48k]; + float fad_g[L_FRAME48k]; + float *p_prev_taps[CPE_CHANNELS], prev_taps[CPE_CHANNELS][L_FRAME48k]; + float *p_curr_taps[CPE_CHANNELS], curr_taps[CPE_CHANNELS][L_FRAME48k]; + + float data_mem[CPE_CHANNELS][L_FRAME48k*2]; + + STEREO_DMX_EVS_PHA curr_pha; + STEREO_DMX_EVS_PHA prev_pha; + int16_t pha_hys_cnt; + + int16_t prc_thres; + STEREO_DMX_EVS_PRC curr_prc; + STEREO_DMX_EVS_PRC prev_prc; + int16_t prc_hys_cnt; + float fad_g_prc[L_FRAME48k]; + int32_t fad_len_prc; + +} STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; + +#endif typedef struct stereo_dmx_evs_enc_data_structure { STEREO_DMX_EVS_POC_HANDLE hPOC; +#ifdef ENHANCED_STEREO_DMX + STEREO_DMX_EVS_PHA_HANDLE hPHA; +#endif float itd; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index a5c0fe147f..d369bc0a5e 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -65,13 +65,37 @@ #define Q_BAND 0.25f +#ifdef ENHANCED_STEREO_DMX + +#define STEREO_DMX_EVS_PHA_LEN_16 20.0f +#define STEREO_DMX_EVS_FAD_LEN_16 20.0f +#define STEREO_DMX_EVS_PHA_LEN_32 10.0f +#define STEREO_DMX_EVS_FAD_LEN_32 10.0f +#define STEREO_DMX_EVS_PHA_LEN_48 5.0f +#define STEREO_DMX_EVS_FAD_LEN_48 5.0f + +#define STEREO_DMX_EVS_ISD_THRES 1.3f +#define STEREO_DMX_EVS_ISD_DIST_THRES 0.42f +#define STEREO_DMX_EVS_SWTCH_HYS_THRES 1 + +#define STEREO_DMX_EVS_SWTCH_PRC_THRES 0.6f +#define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 +#define STEREO_DMX_EVS_FADE_LEN_PRC 20.0f + +#endif + /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ static void estimate_itd_wnd_fft( const float *input, float *specr, float *speci, const float *rfft_coef, const float *wnd, const int16_t input_frame ); +#ifdef ENHANCED_STEREO_DMX +static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame ); +static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float srcL[], const float srcR[], float itd[], const int16_t input_frame ); +# else static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame ); static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, const float srcL[], const float srcR[], float itd[], const int16_t input_frame ); +#endif static void weighted_ave( const float src1[], const float src2[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] ); static void adapt_gain( const float src[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] ); static void create_M_signal( const float srcL[], const float srcR[], float dmx[], const float w_curr, const int16_t input_frame, const float wnd[], float *w_prev, float *dmx_energy, float *src_energy ); @@ -141,6 +165,9 @@ void estimate_itd_wnd_fft( static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ +#ifdef ENHANCED_STEREO_DMX + STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */ +#endif const float wnd[], /* i : window coef */ const float rfft_coef[], /* i : RFFT coef */ const float specLr[], /* i : Lch real-part spectra */ @@ -167,9 +194,23 @@ static void calc_poc( int16_t cos_step, cos_max; float eps_cos, eps_sin, EPS; +#ifdef ENHANCED_STEREO_DMX + float Nr, Ni, Dr, Di, ISD, isd_rate; + int16_t isd_cnt, n, end8; + float *Pr, *Pi, *ipd_ff; + float tPr, tPi, Pn; + float *p_curr_taps, *p_curr_taps_l2r; + double energy; +#endif + /* Initialization */ iN = 1.0f / (float) input_frame; +#ifdef ENHANCED_STEREO_DMX + Pr = hPHA->Pr; + Pi = hPHA->Pi; +#endif + s = hPOC->sin; P = hPOC->P; n0 = input_frame / 2; @@ -337,6 +378,183 @@ static void calc_poc( } specPOr[n0] = sign( specLr[n0] * specRr[n0] ) * wnd[i * step + bias] * gamma; +#ifdef ENHANCED_STEREO_DMX + + end8 = 160; + + // Memorize the filters N-1 + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if (hPHA->p_curr_taps[n]) + { + hPHA->p_prev_taps[n] = hPHA->prev_taps[n]; + mvr2r( hPHA->p_curr_taps[n], hPHA->p_prev_taps[n], hPHA->pha_len ); + } + else + { + hPHA->p_prev_taps[n] = NULL; + } + + hPHA->p_curr_taps[n] = NULL; + } + + // ISD + isd_cnt = 0; + for ( int i = 1; i <= end8 ; i++ ) + { + Nr = ( specLr[i] - specRr[i] ); + Ni = ( specLi[i] - specRi[i] ); + Dr = ( specLr[i] + specRr[i] ); + Di = ( specLi[i] + specRi[i] ); + ISD = sqrt( (Nr*Nr + Ni*Ni) / (Dr*Dr + Di*Di) ); + if (ISD > STEREO_DMX_EVS_ISD_THRES) + { + isd_cnt++; + } + } + isd_rate = (float)isd_cnt / (float)end8; + + if (isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES) + { + if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD ) + { + if (hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD) + { + hPHA->pha_hys_cnt += 1; + } + else + { + hPHA->pha_hys_cnt = 0; + } + + if (hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES) + { + hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD; + } + } + hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD; + } + else + { + if (hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD2) + { + if (hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD2) + { + hPHA->pha_hys_cnt += 1; + } + else + { + hPHA->pha_hys_cnt = 0; + } + + if (hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES) + { + hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD2; + } + } + hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD2; + } + + if (hPHA->curr_pha != STEREO_DMX_EVS_NO_PHA) + { + ipd_ff = hPHA->ipd_ff; + for ( i = 0; i < ( end8 + 1 ); i++ ) + { + tPr = ( specLr[i] * specRr[i] + specLi[i] * specRi[i] ); + tPi = ( specLi[i] * specRr[i] - specLr[i] * specRi[i] ); + Pn = sqrt( tPr * tPr + tPi * tPi ); + tPr /= (Pn+EPSILON); + tPi /= (Pn+EPSILON); + + if (fabs(tPr*tPi) < EPSILON) + { + tPr = 1.; + tPi = 0.; + } + + Pr[i] = ipd_ff[i]*Pr[i] + (1.0 - ipd_ff[i])*tPr; + Pi[i] = ipd_ff[i]*Pi[i] + (1.0 - ipd_ff[i])*tPi; + + } + + for ( i = end8+1; i < n0; i++ ) + { + Pr[i] = 1.0; + Pi[i] = 0.0; + } + + if (hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD) + { + // PHA R2L + hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; + + p_curr_taps = hPHA->p_curr_taps[1]; + + p_curr_taps[0] = Pr[0]; + p_curr_taps[1] = Pr[n0]; + for ( i = 1; i < n0; i++ ) + { + p_curr_taps[i * 2] = Pr[i]; + p_curr_taps[i * 2 + 1] = Pi[i]; + } + rfft( p_curr_taps, rfft_coef, input_frame, +1 ); + } + else + { + // PHA R2L + hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; + + p_curr_taps = hPHA->p_curr_taps[1]; + + for ( i = 1; i < n0; i++ ) + { + Pn = sqrt( Pr[i] * Pr[i] + Pi[i] * Pi[i] ); + tPr = Pr[i]/(Pn+EPSILON); + p_curr_taps[i * 2] = sqrt((1.+tPr)/2.); + p_curr_taps[i * 2 + 1] = sqrt((1.-tPr)/2.)*sign(Pi[i]); + + } + p_curr_taps[0] = 1; + p_curr_taps[1] = 1; + + rfft( p_curr_taps, rfft_coef, input_frame, +1 ); + + // PHA L2R + hPHA->p_curr_taps[0] = hPHA->curr_taps[0]; + + p_curr_taps_l2r = hPHA->p_curr_taps[0]; + + p_curr_taps_l2r[0] = p_curr_taps[0]; + for ( i = 1; i < input_frame; i++ ) + { + p_curr_taps_l2r[i] = p_curr_taps[input_frame-i]; + } + } + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + if (hPHA->p_curr_taps[n]) + { + for ( i = 0; i < hPHA->pha_len; i++ ) + { + hPHA->p_curr_taps[n][i] *= hPHA->win[i]; + } + + energy = 0; + for ( i = 0; i < hPHA->pha_len; i++ ) + { + energy += hPHA->p_curr_taps[n][i] * hPHA->p_curr_taps[n][i]; + } + energy = sqrtf( energy ); + for ( i = 0; i < hPHA->pha_len; i++ ) + { + hPHA->p_curr_taps[n][i] /= energy; + } + } + } + +#endif rfft_buf[0] = specPOr[0]; rfft_buf[1] = specPOr[n0]; @@ -550,6 +768,9 @@ static float find_poc_peak( static ivas_error estimate_itd( float *corr, /* o : correlation */ STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ +#ifdef ENHANCED_STEREO_DMX + STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */ +#endif const float srcL[], /* i : Lch input signal */ const float srcR[], /* i : Rch input signal */ float itd[], /* o : estimated itd */ @@ -598,7 +819,11 @@ static ivas_error estimate_itd( estimate_itd_wnd_fft( srcL, specLr, specLi, rfft_coef, hPOC->wnd, input_frame ); estimate_itd_wnd_fft( srcR, specRr, specRi, rfft_coef, hPOC->wnd, input_frame ); +#ifdef ENHANCED_STEREO_DMX + calc_poc( hPOC, hPHA, hPOC->wnd, rfft_coef, specLr, specLi, specRr, specRi, input_frame ); +#else calc_poc( hPOC, hPOC->wnd, rfft_coef, specLr, specLi, specRr, specRi, input_frame ); +#endif *corr = find_poc_peak( hPOC, itd, input_frame, STEREO_DMX_EVS_POC_W_FORGETTING ); return error; @@ -794,7 +1019,18 @@ void stereo_dmx_evs_enc( int16_t n; float dmx_weight, corr; float data_f[CPE_CHANNELS][L_FRAME48k]; + +#ifdef ENHANCED_STEREO_DMX + int16_t k, m; + int32_t pha_len, fad_len; + float mem_out_curr[CPE_CHANNELS][L_FRAME48k], mem_out_last[L_FRAME48k]; + float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_mem_out_curr, *p_data_f; + float dmx_itd_data[L_FRAME48k], dmx_ipd_data[L_FRAME48k], *p_dmx_data; + STEREO_DMX_EVS_PRC curr_prc; +#else float dmx_data[L_FRAME48k]; +#endif + int16_t input_frame; input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); @@ -810,6 +1046,186 @@ void stereo_dmx_evs_enc( set_f( data_f[1] + n_samples, 0.0f, input_frame - n_samples ); } +#ifdef ENHANCED_STEREO_DMX + + estimate_itd( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); + + pha_len = hStereoDmxEVS->hPHA->pha_len; + fad_len = hStereoDmxEVS->hPHA->fad_len; + fad_g = hStereoDmxEVS->hPHA->fad_g; + + for ( k = 0; k < CPE_CHANNELS; k++ ) + { + p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps[k]; + p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps[k]; + p_mem_out_curr = mem_out_curr[k]; + p_data_f = data_f[k]; + + p_data_mem = hStereoDmxEVS->hPHA->data_mem[k]; + mvr2r( &( p_data_mem[input_frame] ), p_data_mem, pha_len ); + p_data_mem = &( p_data_mem[pha_len] ); + mvr2r( p_data_f, p_data_mem, input_frame ); + + if (p_prev_taps) + { + for (n = 0; n < fad_len; n++) + { + mem_out_last[n] = 0; + for ( m = 0; m < pha_len; m++ ) + { + mem_out_last[n] += p_data_mem[n - m] * p_prev_taps[m]; + } + mem_out_last[n] *= fad_g[fad_len - (1+n)]; + } + } + + if (p_curr_taps) + { + if (p_prev_taps == NULL) + { + for (n = 0; n < fad_len; n++) + { + mem_out_last[n] = fad_g[fad_len - (1+n)] * p_data_f[n]; + } + } + + for (n = 0; n < fad_len; n++) + { + p_mem_out_curr[n] = 0; + for ( m = 0; m < pha_len; m++ ) + { + p_mem_out_curr[n] += p_data_mem[n - m] * p_curr_taps[m]; + } + p_mem_out_curr[n] = fad_g[n] * p_mem_out_curr[n] + mem_out_last[n]; + } + for (; n < input_frame; n++) + { + p_mem_out_curr[n] = 0; + for (m = 0; m < pha_len; m++) + { + p_mem_out_curr[n] += p_data_mem[n - m] * p_curr_taps[m]; + } + } + } + else + { + if (p_prev_taps) + { + for (n = 0; n < fad_len; n++) + { + p_mem_out_curr[n] = fad_g[n] * p_data_f[n] + mem_out_last[n]; + } + mvr2r( &(p_data_f[fad_len]), &(p_mem_out_curr[fad_len]), input_frame-fad_len ); + } + else + { + mvr2r( p_data_f, p_mem_out_curr, input_frame ); + } + } + } + + // poc + + if ( hStereoDmxEVS->itd ) + { + dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; + } + else + { + dmx_weight = 0.5f; + } + + create_M_signal( data_f[0], data_f[1], dmx_itd_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, + hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); + + // pha + + for ( n=0; n < input_frame; n++ ) + { + dmx_ipd_data[n] = (mem_out_curr[0][n] + mem_out_curr[1][n])*0.5; + } + + // prc switch + + curr_prc = hStereoDmxEVS->hPHA->curr_prc; + if (abs((int16_t)hStereoDmxEVS->itd) > hStereoDmxEVS->hPHA->prc_thres) + { + if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_POC ) + { + if (hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_POC) + { + hStereoDmxEVS->hPHA->prc_hys_cnt += 1; + } + else + { + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + } + + if (hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + } + } + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; + } + else + { + if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_PHA ) + { + if (hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_PHA) + { + hStereoDmxEVS->hPHA->prc_hys_cnt += 1; + } + else + { + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + } + + if (hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES) + { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; + } + } + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; + } + + if ( hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC ) + { + p_dmx_data = dmx_itd_data; + + if (curr_prc != hStereoDmxEVS->hPHA->curr_prc) + { + fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + fad_g = hStereoDmxEVS->hPHA->fad_g_prc; + + for (n = 0; n < fad_len; n++) + { + p_dmx_data[n] *= fad_g[n]; + p_dmx_data[n] += (1.-fad_g[n]) * dmx_ipd_data[n]; + } + } + } + else + { + p_dmx_data = dmx_ipd_data; + + if (curr_prc != hStereoDmxEVS->hPHA->curr_prc) + { + fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + fad_g = hStereoDmxEVS->hPHA->fad_g_prc; + + for (n = 0; n < fad_len; n++) + { + p_dmx_data[n] *= fad_g[n]; + p_dmx_data[n] += (1.-fad_g[n]) * dmx_itd_data[n]; + } + } + } + + mvr2s( p_dmx_data, data, n_samples ); + +#else + estimate_itd( &corr, hStereoDmxEVS->hPOC, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); if ( hStereoDmxEVS->itd ) @@ -825,6 +1241,8 @@ void stereo_dmx_evs_enc( hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); mvr2s( dmx_data, data, n_samples ); + +#endif return; } @@ -844,6 +1262,15 @@ ivas_error stereo_dmx_evs_init_encoder( STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS; int16_t n, input_frame; +#ifdef ENHANCED_STEREO_DMX + int32_t f_len, pha_len, fad_len; + float *win, *fad_g; + + float a_min, a_max, a_step, n0, itrh; + float *ipd_ff; + +#endif + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); hStereoDmxEVS = NULL; @@ -933,6 +1360,97 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPOC->confidence = 0.0f; +#ifdef ENHANCED_STEREO_DMX + + hStereoDmxEVS->hPHA = NULL; + if ( ( hStereoDmxEVS->hPHA = (STEREO_DMX_EVS_PHA_HANDLE) malloc( sizeof( STEREO_DMX_EVS_PHA_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for STEREO_DMX_EVS_CORFILT_DATA\n" ) ); + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hStereoDmxEVS->hPHA->p_curr_taps[n] = NULL; + hStereoDmxEVS->hPHA->p_prev_taps[n] = NULL; + + set_zero( hStereoDmxEVS->hPHA->data_mem[n], L_FRAME48k * 2 ); + set_zero( hStereoDmxEVS->hPHA->curr_taps[n], L_FRAME48k ); + } + + if ( input_Fs == 16000 ) + { + f_len = STEREO_DMX_EVS_PHA_LEN_16 * input_Fs / 1000; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_16 * input_Fs / 1000; + } + else if ( input_Fs == 32000 ) + { + f_len = STEREO_DMX_EVS_PHA_LEN_32 * input_Fs / 1000; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_32 * input_Fs / 1000; + } + else if ( input_Fs == 48000 ) + { + f_len = STEREO_DMX_EVS_PHA_LEN_48 * input_Fs / 1000; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48 * input_Fs / 1000; + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" ); + } + + hStereoDmxEVS->hPHA->pha_len = f_len/2; + + pha_len = hStereoDmxEVS->hPHA->pha_len; + fad_len = hStereoDmxEVS->hPHA->fad_len; + + win = hStereoDmxEVS->hPHA->win; + set_zero( win, L_FRAME48k ); + for ( n = 0; n < pha_len; n++ ) + { + win[n] = 0.5f * (1.0f + cosf( ( PI2 * ( n + 1 ) ) / ( ( f_len ) + 1 ) ) ); + } + + fad_g = hStereoDmxEVS->hPHA->fad_g; + for ( n = 0; n < fad_len; n++ ) + { + fad_g[n] = (float) n / (float)fad_len; + } + + hStereoDmxEVS->hPHA->curr_pha = STEREO_DMX_EVS_NO_PHA; + hStereoDmxEVS->hPHA->prev_pha = STEREO_DMX_EVS_NO_PHA; + hStereoDmxEVS->hPHA->pha_hys_cnt = 0; + + // Compute the forgetting factor + a_min = 0.8576958985908941; + a_max = 0.9440608762859234; + itrh = 60; + n0 = input_frame / 2; + a_step = ( a_min - a_max ) / (n0+1-itrh); + ipd_ff = hStereoDmxEVS->hPHA->ipd_ff; + for ( n = 0; n < itrh; n++ ) + { + ipd_ff[n] = a_max; + } + for ( ; n < ( n0 + 1 ); n++ ) + { + ipd_ff[n] = a_max + (n-itrh) * a_step; + } + + hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES * input_Fs / 1000; + + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + + hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC * input_Fs / 1000; + fad_len = hStereoDmxEVS->hPHA->fad_len_prc; + fad_g = hStereoDmxEVS->hPHA->fad_g_prc; + for ( n = 0; n < fad_len; n++ ) + { + fad_g[n] = (float) n / (float)fad_len; + } + +#endif + *hStereoDmxEVS_out = hStereoDmxEVS; return IVAS_ERR_OK; @@ -960,6 +1478,14 @@ void stereo_dmx_evs_close_encoder( ( *hStereoDmxEVS )->hPOC = NULL; } +#ifdef ENHANCED_STEREO_DMX + if ( ( *hStereoDmxEVS )->hPHA != NULL ) + { + free( ( *hStereoDmxEVS )->hPHA ); + ( *hStereoDmxEVS )->hPHA = NULL; + } +#endif + free( ( *hStereoDmxEVS ) ); ( *hStereoDmxEVS ) = NULL; -- GitLab From 375afdb863806e5b6191cadc97c8ec46539e6482 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Fri, 14 Apr 2023 13:46:00 +0200 Subject: [PATCH 017/381] Initialisation missing fixed. --- lib_enc/ivas_stat_enc.h | 2 +- lib_enc/ivas_stereo_dmx_evs.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 3bc8502e8f..6d29ea020b 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -985,7 +985,7 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure #ifdef ENHANCED_STEREO_DMX typedef struct stereo_dmx_evs_correlation_filter_structure { - float ipd_ff[L_FRAME48k / 2 + 1]; + float ipd_ff[L_FRAME16k / 2 + 1]; float Pr[L_FRAME48k / 2 + 1]; float Pi[L_FRAME48k / 2 + 1]; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index d369bc0a5e..ea98a4f163 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -380,7 +380,7 @@ static void calc_poc( #ifdef ENHANCED_STEREO_DMX - end8 = 160; + end8 = L_FRAME16k / 2; // Memorize the filters N-1 for ( n = 0; n < CPE_CHANNELS; n++ ) @@ -1423,7 +1423,7 @@ ivas_error stereo_dmx_evs_init_encoder( a_min = 0.8576958985908941; a_max = 0.9440608762859234; itrh = 60; - n0 = input_frame / 2; + n0 = L_FRAME16k / 2; a_step = ( a_min - a_max ) / (n0+1-itrh); ipd_ff = hStereoDmxEVS->hPHA->ipd_ff; for ( n = 0; n < itrh; n++ ) @@ -1434,6 +1434,8 @@ ivas_error stereo_dmx_evs_init_encoder( { ipd_ff[n] = a_max + (n-itrh) * a_step; } + set_zero( hStereoDmxEVS->hPHA->Pr, L_FRAME48k / 2 + 1 ); + set_zero( hStereoDmxEVS->hPHA->Pi, L_FRAME48k / 2 + 1 ); hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES * input_Fs / 1000; -- GitLab From 4c4cd11b7bb65f2f388792acfcbbe41148915a69 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Fri, 14 Apr 2023 21:51:04 +0200 Subject: [PATCH 018/381] Warnings removed. --- lib_enc/ivas_stat_enc.h | 8 +-- lib_enc/ivas_stereo_dmx_evs.c | 131 ++++++++++++++++++++-------------- 2 files changed, 80 insertions(+), 59 deletions(-) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 6d29ea020b..6ffa8ea2ba 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -985,12 +985,12 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure #ifdef ENHANCED_STEREO_DMX typedef struct stereo_dmx_evs_correlation_filter_structure { - float ipd_ff[L_FRAME16k / 2 + 1]; + float ipd_ff[L_FRAME48k / 2 + 1]; float Pr[L_FRAME48k / 2 + 1]; float Pi[L_FRAME48k / 2 + 1]; - int32_t pha_len; - int32_t fad_len; + int16_t pha_len; + int16_t fad_len; float win[L_FRAME48k]; float fad_g[L_FRAME48k]; @@ -1008,7 +1008,7 @@ typedef struct stereo_dmx_evs_correlation_filter_structure STEREO_DMX_EVS_PRC prev_prc; int16_t prc_hys_cnt; float fad_g_prc[L_FRAME48k]; - int32_t fad_len_prc; + int16_t fad_len_prc; } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index ea98a4f163..73bb70fc0a 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -67,10 +67,10 @@ #ifdef ENHANCED_STEREO_DMX -#define STEREO_DMX_EVS_PHA_LEN_16 20.0f -#define STEREO_DMX_EVS_FAD_LEN_16 20.0f -#define STEREO_DMX_EVS_PHA_LEN_32 10.0f -#define STEREO_DMX_EVS_FAD_LEN_32 10.0f +#define STEREO_DMX_EVS_PHA_LEN_16 15.0f +#define STEREO_DMX_EVS_FAD_LEN_16 15.0f +#define STEREO_DMX_EVS_PHA_LEN_32 5.0f +#define STEREO_DMX_EVS_FAD_LEN_32 5.0f #define STEREO_DMX_EVS_PHA_LEN_48 5.0f #define STEREO_DMX_EVS_FAD_LEN_48 5.0f @@ -200,7 +200,7 @@ static void calc_poc( float *Pr, *Pi, *ipd_ff; float tPr, tPi, Pn; float *p_curr_taps, *p_curr_taps_l2r; - double energy; + float energy; #endif /* Initialization */ @@ -400,13 +400,13 @@ static void calc_poc( // ISD isd_cnt = 0; - for ( int i = 1; i <= end8 ; i++ ) + for ( i = 1; i <= end8 ; i++ ) { Nr = ( specLr[i] - specRr[i] ); Ni = ( specLi[i] - specRi[i] ); Dr = ( specLr[i] + specRr[i] ); Di = ( specLi[i] + specRi[i] ); - ISD = sqrt( (Nr*Nr + Ni*Ni) / (Dr*Dr + Di*Di) ); + ISD = sqrtf( (Nr*Nr + Ni*Ni) / (Dr*Dr + Di*Di) ); if (ISD > STEREO_DMX_EVS_ISD_THRES) { isd_cnt++; @@ -457,34 +457,33 @@ static void calc_poc( if (hPHA->curr_pha != STEREO_DMX_EVS_NO_PHA) { - ipd_ff = hPHA->ipd_ff; - for ( i = 0; i < ( end8 + 1 ); i++ ) - { - tPr = ( specLr[i] * specRr[i] + specLi[i] * specRi[i] ); - tPi = ( specLi[i] * specRr[i] - specLr[i] * specRi[i] ); - Pn = sqrt( tPr * tPr + tPi * tPi ); - tPr /= (Pn+EPSILON); - tPi /= (Pn+EPSILON); - if (fabs(tPr*tPi) < EPSILON) + if (hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD) + { + ipd_ff = hPHA->ipd_ff; + for ( i = 0; i < ( end8 + 1 ); i++ ) { - tPr = 1.; - tPi = 0.; - } - - Pr[i] = ipd_ff[i]*Pr[i] + (1.0 - ipd_ff[i])*tPr; - Pi[i] = ipd_ff[i]*Pi[i] + (1.0 - ipd_ff[i])*tPi; - - } + tPr = ( specLr[i] * specRr[i] + specLi[i] * specRi[i] ); + tPi = ( specLi[i] * specRr[i] - specLr[i] * specRi[i] ); + Pn = sqrtf( tPr * tPr + tPi * tPi ); + tPr /= (Pn+EPSILON); + tPi /= (Pn+EPSILON); - for ( i = end8+1; i < n0; i++ ) - { - Pr[i] = 1.0; - Pi[i] = 0.0; - } + if (fabs((double)tPr* (double)tPi) < EPSILON) + { + tPr = 1.; + tPi = 0.; + } - if (hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD) - { + Pr[i] = ipd_ff[i]*Pr[i] + (1.0f - ipd_ff[i])*tPr; + Pi[i] = ipd_ff[i]*Pi[i] + (1.0f - ipd_ff[i])*tPi; + } + for ( ; i < ( n0 + 1 ); i++ ) + { + Pr[i] = 1.0; + Pi[i] = 0.0; + } + // PHA R2L hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; @@ -492,7 +491,7 @@ static void calc_poc( p_curr_taps[0] = Pr[0]; p_curr_taps[1] = Pr[n0]; - for ( i = 1; i < n0; i++ ) + for ( i = 1; i < n0+1; i++ ) { p_curr_taps[i * 2] = Pr[i]; p_curr_taps[i * 2 + 1] = Pi[i]; @@ -501,17 +500,36 @@ static void calc_poc( } else { + ipd_ff = hPHA->ipd_ff; + for ( i = 0; i < ( n0 + 1 ); i++ ) + { + tPr = ( specLr[i] * specRr[i] + specLi[i] * specRi[i] ); + tPi = ( specLi[i] * specRr[i] - specLr[i] * specRi[i] ); + Pn = sqrtf( tPr * tPr + tPi * tPi ); + tPr /= (Pn+EPSILON); + tPi /= (Pn+EPSILON); + + if (fabs((double)tPr* (double)tPi) < EPSILON) + { + tPr = 1.; + tPi = 0.; + } + + Pr[i] = ipd_ff[i]*Pr[i] + (1.0f - ipd_ff[i])*tPr; + Pi[i] = ipd_ff[i]*Pi[i] + (1.0f - ipd_ff[i])*tPi; + } + // PHA R2L hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; p_curr_taps = hPHA->p_curr_taps[1]; - for ( i = 1; i < n0; i++ ) + for ( i = 1; i < n0+1; i++ ) { - Pn = sqrt( Pr[i] * Pr[i] + Pi[i] * Pi[i] ); + Pn = sqrtf(Pr[i] * Pr[i] + Pi[i] * Pi[i] ); tPr = Pr[i]/(Pn+EPSILON); - p_curr_taps[i * 2] = sqrt((1.+tPr)/2.); - p_curr_taps[i * 2 + 1] = sqrt((1.-tPr)/2.)*sign(Pi[i]); + p_curr_taps[i * 2] = sqrtf((1.0f+tPr)/2.0f); + p_curr_taps[i * 2 + 1] = sqrtf((1.0f-tPr)/2.0f)*sign(Pi[i]); } p_curr_taps[0] = 1; @@ -541,10 +559,10 @@ static void calc_poc( hPHA->p_curr_taps[n][i] *= hPHA->win[i]; } - energy = 0; + energy = 0.; for ( i = 0; i < hPHA->pha_len; i++ ) { - energy += hPHA->p_curr_taps[n][i] * hPHA->p_curr_taps[n][i]; + energy += hPHA->p_curr_taps[n][i] *hPHA->p_curr_taps[n][i]; } energy = sqrtf( energy ); for ( i = 0; i < hPHA->pha_len; i++ ) @@ -1021,8 +1039,7 @@ void stereo_dmx_evs_enc( float data_f[CPE_CHANNELS][L_FRAME48k]; #ifdef ENHANCED_STEREO_DMX - int16_t k, m; - int32_t pha_len, fad_len; + int16_t k, m, pha_len, fad_len; float mem_out_curr[CPE_CHANNELS][L_FRAME48k], mem_out_last[L_FRAME48k]; float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_mem_out_curr, *p_data_f; float dmx_itd_data[L_FRAME48k], dmx_ipd_data[L_FRAME48k], *p_dmx_data; @@ -1142,7 +1159,7 @@ void stereo_dmx_evs_enc( for ( n=0; n < input_frame; n++ ) { - dmx_ipd_data[n] = (mem_out_curr[0][n] + mem_out_curr[1][n])*0.5; + dmx_ipd_data[n] = (mem_out_curr[0][n] + mem_out_curr[1][n])*0.5f; } // prc switch @@ -1201,7 +1218,7 @@ void stereo_dmx_evs_enc( for (n = 0; n < fad_len; n++) { p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += (1.-fad_g[n]) * dmx_ipd_data[n]; + p_dmx_data[n] += (1.0f-fad_g[n]) * dmx_ipd_data[n]; } } } @@ -1217,7 +1234,7 @@ void stereo_dmx_evs_enc( for (n = 0; n < fad_len; n++) { p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += (1.-fad_g[n]) * dmx_itd_data[n]; + p_dmx_data[n] += (1.0f-fad_g[n]) * dmx_itd_data[n]; } } } @@ -1263,7 +1280,7 @@ ivas_error stereo_dmx_evs_init_encoder( int16_t n, input_frame; #ifdef ENHANCED_STEREO_DMX - int32_t f_len, pha_len, fad_len; + int16_t f_len, pha_len, fad_len; float *win, *fad_g; float a_min, a_max, a_step, n0, itrh; @@ -1379,18 +1396,18 @@ ivas_error stereo_dmx_evs_init_encoder( if ( input_Fs == 16000 ) { - f_len = STEREO_DMX_EVS_PHA_LEN_16 * input_Fs / 1000; - hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_16 * input_Fs / 1000; + f_len = (int16_t)(STEREO_DMX_EVS_PHA_LEN_16 * (float)input_Fs / 1000.0f); + hStereoDmxEVS->hPHA->fad_len = (int16_t)(STEREO_DMX_EVS_FAD_LEN_16 * (float)input_Fs / 1000.0f); } else if ( input_Fs == 32000 ) { - f_len = STEREO_DMX_EVS_PHA_LEN_32 * input_Fs / 1000; - hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_32 * input_Fs / 1000; + f_len = (int16_t)(STEREO_DMX_EVS_PHA_LEN_32 * (float)input_Fs / 1000.0f); + hStereoDmxEVS->hPHA->fad_len = (int16_t)(STEREO_DMX_EVS_FAD_LEN_32 * (float)input_Fs / 1000.0f); } else if ( input_Fs == 48000 ) { - f_len = STEREO_DMX_EVS_PHA_LEN_48 * input_Fs / 1000; - hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48 * input_Fs / 1000; + f_len = (int16_t)(STEREO_DMX_EVS_PHA_LEN_48 * (float)input_Fs / 1000.0f); + hStereoDmxEVS->hPHA->fad_len = (int16_t)(STEREO_DMX_EVS_FAD_LEN_48 * (float)input_Fs / 1000.0f); } else { @@ -1420,8 +1437,8 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->pha_hys_cnt = 0; // Compute the forgetting factor - a_min = 0.8576958985908941; - a_max = 0.9440608762859234; + a_min = 0.8576958985908941f; + a_max = 0.9440608762859234f; itrh = 60; n0 = L_FRAME16k / 2; a_step = ( a_min - a_max ) / (n0+1-itrh); @@ -1434,16 +1451,20 @@ ivas_error stereo_dmx_evs_init_encoder( { ipd_ff[n] = a_max + (n-itrh) * a_step; } - set_zero( hStereoDmxEVS->hPHA->Pr, L_FRAME48k / 2 + 1 ); + for ( ; n < L_FRAME48k/2+1; n++ ) + { + ipd_ff[n] = a_min; + } + set_f( hStereoDmxEVS->hPHA->Pr, 1.0, L_FRAME48k / 2 + 1 ); set_zero( hStereoDmxEVS->hPHA->Pi, L_FRAME48k / 2 + 1 ); - hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES * input_Fs / 1000; + hStereoDmxEVS->hPHA->prc_thres = (int16_t)(STEREO_DMX_EVS_SWTCH_PRC_THRES * (float)input_Fs / 1000.0); hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - hStereoDmxEVS->hPHA->fad_len_prc = STEREO_DMX_EVS_FADE_LEN_PRC * input_Fs / 1000; + hStereoDmxEVS->hPHA->fad_len_prc = (int16_t)(STEREO_DMX_EVS_FADE_LEN_PRC * (float)input_Fs / 1000.0); fad_len = hStereoDmxEVS->hPHA->fad_len_prc; fad_g = hStereoDmxEVS->hPHA->fad_g_prc; for ( n = 0; n < fad_len; n++ ) -- GitLab From cac7755407026bc1c0c090af432e1908946ed343 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Mon, 17 Apr 2023 16:33:41 +0200 Subject: [PATCH 019/381] Output's level equalisation added. --- lib_enc/ivas_stat_enc.h | 9 ++++++--- lib_enc/ivas_stereo_dmx_evs.c | 27 ++++++++++++++++++++------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 6ffa8ea2ba..052de92fd6 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -997,7 +997,7 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float *p_prev_taps[CPE_CHANNELS], prev_taps[CPE_CHANNELS][L_FRAME48k]; float *p_curr_taps[CPE_CHANNELS], curr_taps[CPE_CHANNELS][L_FRAME48k]; - float data_mem[CPE_CHANNELS][L_FRAME48k*2]; + float data_mem[CPE_CHANNELS][L_FRAME48k * 2]; STEREO_DMX_EVS_PHA curr_pha; STEREO_DMX_EVS_PHA prev_pha; @@ -1010,15 +1010,18 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float fad_g_prc[L_FRAME48k]; int16_t fad_len_prc; + float dmx_ener; + float dmx_old_gain; + } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; -#endif +#endif typedef struct stereo_dmx_evs_enc_data_structure { STEREO_DMX_EVS_POC_HANDLE hPOC; #ifdef ENHANCED_STEREO_DMX STEREO_DMX_EVS_PHA_HANDLE hPHA; -#endif +#endif float itd; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 73bb70fc0a..610d936d86 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -1042,7 +1042,7 @@ void stereo_dmx_evs_enc( int16_t k, m, pha_len, fad_len; float mem_out_curr[CPE_CHANNELS][L_FRAME48k], mem_out_last[L_FRAME48k]; float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_mem_out_curr, *p_data_f; - float dmx_itd_data[L_FRAME48k], dmx_ipd_data[L_FRAME48k], *p_dmx_data; + float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, dmx_gain; STEREO_DMX_EVS_PRC curr_prc; #else float dmx_data[L_FRAME48k]; @@ -1152,16 +1152,26 @@ void stereo_dmx_evs_enc( dmx_weight = 0.5f; } - create_M_signal( data_f[0], data_f[1], dmx_itd_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, + create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); // pha for ( n=0; n < input_frame; n++ ) { - dmx_ipd_data[n] = (mem_out_curr[0][n] + mem_out_curr[1][n])*0.5f; + dmx_pha_data[n] = (mem_out_curr[0][n] + mem_out_curr[1][n])*0.5f; } + calc_energy( dmx_pha_data, dmx_pha_data, &(hStereoDmxEVS->hPHA->dmx_ener), input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + dmx_gain = sqrtf((hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1]) / (hStereoDmxEVS->hPHA->dmx_ener)); + /*if (hStereoDmxEVS->aux_dmx_energy[0] > hStereoDmxEVS->aux_dmx_energy[1]) { + dmx_gain = sqrtf( ( hStereoDmxEVS->aux_dmx_energy[0] + EPSILON ) / ( hStereoDmxEVS->hPHA->dmx_ener + EPSILON ) ); + } else { + dmx_gain = sqrtf( ( hStereoDmxEVS->aux_dmx_energy[1] + EPSILON ) / ( hStereoDmxEVS->hPHA->dmx_ener + EPSILON ) ); + }*/ + adapt_gain(dmx_pha_data, dmx_pha_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_old_gain, input_frame, hStereoDmxEVS->s_wnd); + hStereoDmxEVS->hPHA->dmx_old_gain = dmx_gain; + // prc switch curr_prc = hStereoDmxEVS->hPHA->curr_prc; @@ -1208,7 +1218,7 @@ void stereo_dmx_evs_enc( if ( hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC ) { - p_dmx_data = dmx_itd_data; + p_dmx_data = dmx_poc_data; if (curr_prc != hStereoDmxEVS->hPHA->curr_prc) { @@ -1218,13 +1228,13 @@ void stereo_dmx_evs_enc( for (n = 0; n < fad_len; n++) { p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += (1.0f-fad_g[n]) * dmx_ipd_data[n]; + p_dmx_data[n] += (1.0f-fad_g[n]) * dmx_pha_data[n]; } } } else { - p_dmx_data = dmx_ipd_data; + p_dmx_data = dmx_pha_data; if (curr_prc != hStereoDmxEVS->hPHA->curr_prc) { @@ -1234,7 +1244,7 @@ void stereo_dmx_evs_enc( for (n = 0; n < fad_len; n++) { p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += (1.0f-fad_g[n]) * dmx_itd_data[n]; + p_dmx_data[n] += (1.0f-fad_g[n]) * dmx_poc_data[n]; } } } @@ -1472,6 +1482,9 @@ ivas_error stereo_dmx_evs_init_encoder( fad_g[n] = (float) n / (float)fad_len; } + hStereoDmxEVS->hPHA->dmx_ener = 0; + hStereoDmxEVS->hPHA->dmx_old_gain = 0; + #endif *hStereoDmxEVS_out = hStereoDmxEVS; -- GitLab From 3a44715632bdbb01cbbc328cdc944158ea8c38c9 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Tue, 18 Apr 2023 09:52:46 +0200 Subject: [PATCH 020/381] Set of PHA corrected. --- lib_enc/ivas_stereo_dmx_evs.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 610d936d86..d612ff9c7a 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -68,11 +68,11 @@ #ifdef ENHANCED_STEREO_DMX #define STEREO_DMX_EVS_PHA_LEN_16 15.0f -#define STEREO_DMX_EVS_FAD_LEN_16 15.0f +#define STEREO_DMX_EVS_FAD_LEN_16 2.0f #define STEREO_DMX_EVS_PHA_LEN_32 5.0f -#define STEREO_DMX_EVS_FAD_LEN_32 5.0f +#define STEREO_DMX_EVS_FAD_LEN_32 1.0f #define STEREO_DMX_EVS_PHA_LEN_48 5.0f -#define STEREO_DMX_EVS_FAD_LEN_48 5.0f +#define STEREO_DMX_EVS_FAD_LEN_48 0.5f #define STEREO_DMX_EVS_ISD_THRES 1.3f #define STEREO_DMX_EVS_ISD_DIST_THRES 0.42f @@ -1162,15 +1162,15 @@ void stereo_dmx_evs_enc( dmx_pha_data[n] = (mem_out_curr[0][n] + mem_out_curr[1][n])*0.5f; } - calc_energy( dmx_pha_data, dmx_pha_data, &(hStereoDmxEVS->hPHA->dmx_ener), input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + /*calc_energy( dmx_pha_data, dmx_pha_data, &(hStereoDmxEVS->hPHA->dmx_ener), input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); dmx_gain = sqrtf((hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1]) / (hStereoDmxEVS->hPHA->dmx_ener)); - /*if (hStereoDmxEVS->aux_dmx_energy[0] > hStereoDmxEVS->aux_dmx_energy[1]) { + *//*if (hStereoDmxEVS->aux_dmx_energy[0] > hStereoDmxEVS->aux_dmx_energy[1]) { dmx_gain = sqrtf( ( hStereoDmxEVS->aux_dmx_energy[0] + EPSILON ) / ( hStereoDmxEVS->hPHA->dmx_ener + EPSILON ) ); } else { dmx_gain = sqrtf( ( hStereoDmxEVS->aux_dmx_energy[1] + EPSILON ) / ( hStereoDmxEVS->hPHA->dmx_ener + EPSILON ) ); - }*/ + }*//* adapt_gain(dmx_pha_data, dmx_pha_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_old_gain, input_frame, hStereoDmxEVS->s_wnd); - hStereoDmxEVS->hPHA->dmx_old_gain = dmx_gain; + hStereoDmxEVS->hPHA->dmx_old_gain = dmx_gain;*/ // prc switch -- GitLab From dc4ed53fd848dbadfeec49798f84d702f5de84a6 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Wed, 26 Apr 2023 14:17:52 +0200 Subject: [PATCH 021/381] Updated from main. --- apps/decoder.c | 24 +- apps/renderer.c | 13 +- ci/run_scheduled_sanitizer_test.py | 21 +- ci/smoke_test.sh | 7 +- lib_com/bits_alloc.c | 47 +- lib_com/bitstream.c | 7 - lib_com/cnst.h | 19 + lib_com/common_api_types.h | 9 - lib_com/core_com_config.c | 53 +- lib_com/delay_comp.c | 4 - lib_com/ivas_cnst.h | 60 +- lib_com/ivas_error_utils.h | 1 + lib_com/ivas_fb_mixer.c | 4 + lib_com/ivas_ism_com.c | 15 - lib_com/ivas_masa_com.c | 4 - lib_com/ivas_mct_com.c | 24 - lib_com/ivas_mdft_imdft.c | 5 + lib_com/ivas_prot.h | 116 +- lib_com/ivas_rom_com.c | 638 +++- lib_com/ivas_rom_com.h | 38 +- lib_com/ivas_stat_com.h | 28 +- lib_com/ivas_stereo_td_bit_alloc.c | 135 +- lib_com/lsf_tools.c | 284 +- lib_com/options.h | 42 +- lib_com/prot.h | 161 +- lib_com/rom_com.c | 300 ++ lib_com/rom_com.h | 46 + lib_com/tcx_utils.c | 92 +- lib_dec/acelp_core_dec.c | 44 +- lib_dec/acelp_core_switch_dec.c | 4 + lib_dec/cng_dec.c | 10 +- lib_dec/core_dec_init.c | 17 +- lib_dec/core_dec_switch.c | 14 +- lib_dec/core_switching_dec.c | 16 +- lib_dec/dec_tcx.c | 52 +- lib_dec/dlpc_stoch.c | 23 +- lib_dec/er_util.c | 7 +- lib_dec/evs_dec.c | 8 +- lib_dec/fd_cng_dec.c | 66 +- lib_dec/gs_dec.c | 4 + lib_dec/init_dec.c | 49 +- lib_dec/ivas_core_dec.c | 30 +- lib_dec/ivas_corecoder_dec_reconfig.c | 55 - lib_dec/ivas_cpe_dec.c | 16 +- lib_dec/ivas_dec.c | 97 +- lib_dec/ivas_dirac_dec.c | 82 +- lib_dec/ivas_dirac_output_synthesis_dec.c | 34 +- lib_dec/ivas_init_dec.c | 118 +- lib_dec/ivas_ism_dec.c | 91 +- lib_dec/ivas_ism_dtx_dec.c | 92 +- lib_dec/ivas_ism_metadata_dec.c | 341 +- lib_dec/ivas_ism_param_dec.c | 220 +- lib_dec/ivas_ism_renderer.c | 4 - lib_dec/ivas_masa_dec.c | 22 +- lib_dec/ivas_mcmasa_dec.c | 4 - lib_dec/ivas_mct_core_dec.c | 24 +- lib_dec/ivas_mct_dec.c | 133 +- lib_dec/ivas_mct_dec_mct.c | 59 +- lib_dec/ivas_mdct_core_dec.c | 256 +- lib_dec/ivas_out_setup_conversion.c | 8 - lib_dec/ivas_output_config.c | 10 +- lib_dec/ivas_sba_dec.c | 23 - lib_dec/ivas_sba_dirac_stereo_dec.c | 70 +- lib_dec/ivas_sce_dec.c | 47 +- lib_dec/ivas_sns_dec.c | 132 +- lib_dec/ivas_stat_dec.h | 24 +- lib_dec/ivas_stereo_cng_dec.c | 6 + lib_dec/ivas_stereo_dft_dec.c | 16 +- lib_dec/ivas_stereo_mdct_core_dec.c | 12 - lib_dec/ivas_stereo_switching_dec.c | 7 - lib_dec/ivas_tcx_core_dec.c | 25 +- lib_dec/lib_dec.c | 18 +- lib_dec/lib_dec.h | 6 +- lib_dec/lsf_dec.c | 18 +- lib_dec/lsf_msvq_ma_dec.c | 13 + lib_dec/stat_dec.h | 6 +- lib_dec/tonalMDCTconcealment.c | 35 +- lib_enc/acelp_core_enc.c | 37 +- lib_enc/acelp_core_switch_enc.c | 4 + lib_enc/amr_wb_enc.c | 8 +- lib_enc/bw_detect.c | 65 +- lib_enc/cod_tcx.c | 43 +- lib_enc/core_enc_init.c | 7 +- lib_enc/core_enc_switch.c | 21 +- lib_enc/evs_enc.c | 11 +- lib_enc/ext_sig_ana.c | 96 +- lib_enc/fd_cng_enc.c | 154 +- lib_enc/hq_core_enc.c | 7 +- lib_enc/init_enc.c | 42 +- lib_enc/ivas_core_enc.c | 13 +- lib_enc/ivas_core_pre_proc_front.c | 43 +- lib_enc/ivas_corecoder_enc_reconfig.c | 18 +- lib_enc/ivas_cpe_enc.c | 40 +- lib_enc/ivas_enc.c | 5 - lib_enc/ivas_init_enc.c | 8 - lib_enc/ivas_ism_dtx_enc.c | 147 - lib_enc/ivas_ism_enc.c | 73 - lib_enc/ivas_ism_metadata_enc.c | 361 +-- lib_enc/ivas_ism_param_enc.c | 218 +- lib_enc/ivas_masa_enc.c | 290 +- lib_enc/ivas_mc_param_enc.c | 12 + lib_enc/ivas_mcmasa_enc.c | 4 - lib_enc/ivas_mct_core_enc.c | 78 +- lib_enc/ivas_mct_enc.c | 104 +- lib_enc/ivas_mct_enc_mct.c | 142 +- lib_enc/ivas_mdct_core_enc.c | 327 +- lib_enc/ivas_sns_enc.c | 174 +- lib_enc/ivas_stat_enc.h | 51 +- lib_enc/ivas_stereo_cng_enc.c | 6 + lib_enc/ivas_stereo_dft_enc.c | 15 - lib_enc/ivas_stereo_dft_enc_itd.c | 296 -- lib_enc/ivas_stereo_mdct_core_enc.c | 6 - lib_enc/ivas_stereo_switching_enc.c | 7 +- lib_enc/ivas_tcx_core_enc.c | 14 +- lib_enc/lib_enc.c | 52 +- lib_enc/lsf_enc.c | 13 +- lib_enc/lsf_msvq_ma_enc.c | 277 +- lib_enc/pre_proc.c | 15 +- lib_enc/qlpc_stoch.c | 15 +- lib_enc/transient_detection.c | 107 +- lib_enc/transition_enc.c | 8 + lib_enc/updt_enc.c | 7 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 90 - lib_rend/ivas_objectRenderer.c | 4 +- lib_rend/ivas_objectRenderer_hrFilt.c | 8 + lib_rend/ivas_objectRenderer_sfx.c | 20 +- lib_rend/ivas_objectRenderer_sources.c | 8 +- lib_rend/ivas_prot_rend.h | 9 +- lib_rend/ivas_reverb.c | 23 - lib_rend/ivas_rotation.c | 9 - lib_rend/ivas_stat_rend.h | 16 +- lib_rend/lib_rend.c | 43 +- lib_rend/lib_rend.h | 6 +- lib_util/head_rotation_file_reader.c | 2 +- lib_util/head_rotation_file_reader.h | 2 +- lib_util/ism_file_reader.c | 13 - lib_util/masa_file_writer.c | 192 +- lib_util/masa_file_writer.h | 14 +- scripts/config/ci_linux.json | 4 +- scripts/config/ivas_modes.json | 16 +- scripts/config/ivas_modes_debug.json | 386 +-- scripts/config/self_test.prm | 9 + scripts/pyivastest/IvasModeAnalyzer.py | 1 + scripts/pyivastest/IvasScriptsCommon.py | 3 +- scripts/self_test.py | 2 +- scripts/testv/config_directivity.cfg | 3 + scripts/testv/headrot_case04_3000_q.csv | 3000 ++++++++++++++++++ scripts/testv/stvISM1.csv | 3000 +++++++++--------- scripts/testv/stvISM2.csv | 3000 +++++++++--------- scripts/testv/stvISM3.csv | 3000 +++++++++--------- scripts/testv/stvISM4.csv | 3000 +++++++++--------- 151 files changed, 12701 insertions(+), 11288 deletions(-) mode change 100755 => 100644 lib_dec/ivas_cpe_dec.c mode change 100755 => 100644 lib_dec/ivas_init_dec.c mode change 100755 => 100644 lib_dec/ivas_mct_dec.c mode change 100755 => 100644 lib_enc/amr_wb_enc.c mode change 100755 => 100644 lib_enc/bw_detect.c mode change 100755 => 100644 lib_enc/ivas_core_pre_proc_front.c mode change 100755 => 100644 lib_enc/ivas_mdct_core_enc.c mode change 100755 => 100644 lib_enc/pre_proc.c create mode 100644 scripts/testv/config_directivity.cfg create mode 100644 scripts/testv/headrot_case04_3000_q.csv diff --git a/apps/decoder.c b/apps/decoder.c index d2260713c2..22dc235fff 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1353,24 +1353,15 @@ static ivas_error initOnFirstGoodFrame( /* If outputting MASA, open output file and write metadata for initial bad frames */ else if ( *pBsFormat == IVAS_DEC_BS_MASA ) { -#ifdef FIX_350_MASA_DELAY_COMP if ( ( error = MasaFileWriter_open( arg.outputWavFilename, arg.delayCompensationEnabled, ppMasaWriter ) ) != IVAS_ERR_OK ) -#else - if ( ( error = MasaFileWriter_open( arg.outputWavFilename, ppMasaWriter ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError: Error opening MASA decoded metadata file %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); return error; } /* Duplicate good first frame metadata to fill the beginning of stream. */ -#ifdef FIX_350_MASA_DELAY_COMP MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta = NULL; if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#else - IVAS_MASA_QMETADATA_HANDLE qMetadata = NULL; - if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &qMetadata ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); return error; @@ -1378,11 +1369,7 @@ static ivas_error initOnFirstGoodFrame( for ( int16_t j = 0; j < numInitialBadFrames; ++j ) { -#ifdef FIX_350_MASA_DELAY_COMP if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#else - if ( ( error = MasaFileWriter_writeFrame( *ppMasaWriter, qMetadata ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) ); return error; @@ -1429,7 +1416,7 @@ static ivas_error decodeG192( ivas_error error = IVAS_ERR_UNKNOWN; uint16_t numObj = 0; IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN; - IVAS_POSITION Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS]; for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) @@ -1642,23 +1629,14 @@ static ivas_error decodeG192( } else if ( bsFormat == IVAS_DEC_BS_MASA ) { -#ifdef FIX_350_MASA_DELAY_COMP MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#else - IVAS_MASA_QMETADATA_HANDLE qMetadata; - if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &qMetadata ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } -#ifdef FIX_350_MASA_DELAY_COMP if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) -#else - if ( ( error = MasaFileWriter_writeFrame( masaWriter, qMetadata ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); goto cleanup; diff --git a/apps/renderer.c b/apps/renderer.c index 726eeb237b..be23df8b98 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -536,7 +536,7 @@ int main( int32_t delayTimeScale = 0; int16_t i, numChannels; ivas_error error = IVAS_ERR_OK; - IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME]; + IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME]; #ifdef WMOPS reset_wmops(); @@ -645,9 +645,6 @@ int main( fprintf( stderr, "Sampling rate must be specified on command line when using raw PCM input\n" ); exit( -1 ); } -#ifndef FIX_389_EXT_REND_PCM_SR - args.sampleRate = inFileSampleRate; -#endif break; default: fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); @@ -675,11 +672,7 @@ int main( } /* === Configure === */ -#ifdef FIX_392_LATE_REVERB if ( ( error = IVAS_REND_InitConfig( hIvasRend, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_REND_InitConfig( hIvasRend, ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) || ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "Error in Renderer Config Init\n" ); exit( -1 ); @@ -971,12 +964,8 @@ int main( } else { -#ifdef FIX_379_EXT_METADATA error = IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ); if ( ( error != IVAS_ERR_OK ) && ( error != IVAS_ERR_INVALID_OUTPUT_FORMAT ) ) // VE: TBC -#else - if ( ( ( error = IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ) ) != IVAS_ERR_OK ) && ( IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ) != IVAS_ERR_INVALID_OUTPUT_FORMAT ) ) // VE: TBC -#endif { fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); exit( -1 ); diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index aa6f2636a4..9886de4291 100755 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -63,8 +63,7 @@ def main(args): assert all([t in SUPPORTED_TESTS for t in tests]) - modes = get_modes(in_format) - returncode = run_check(modes, out_formats, tests, run_fec=run_fec) + returncode = run_check(in_format, out_formats, tests, run_fec=run_fec) collect_for_sanitizer_test(CONSOLE_OUT_FILE) @@ -92,7 +91,22 @@ def get_modes(in_format: str) -> list: return mode_list -def run_check(modes: list, out_formats: list, tests: list, run_fec: bool = True): +def get_md_file_command(in_format: str) -> list: + + cmd = list() + if in_format.startswith("ISM"): + cmd.append("--metadata_files") + md_filename = "/usr/local/ltv/ltvISM{}.csv" + n = int(in_format[-1]) + cmd.extend([md_filename.format(i) for i in range(1, n + 1)]) + + return cmd + + +def run_check(in_format: str, out_formats: list, tests: list, run_fec: bool = True): + + modes = get_modes(in_format) + md_file_command = get_md_file_command(in_format) ### always run encoder and decoder with no frameloss cmd_no_fec = [ @@ -107,6 +121,7 @@ def run_check(modes: list, out_formats: list, tests: list, run_fec: bool = True) *modes, "--oc", *out_formats, + *md_file_command, ] print( diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 2062ff5080..852b74fe47 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -55,6 +55,7 @@ fi cfg=./scripts/config/ci_linux.json dly_profile=./scripts/dly_error_profiles/dly_error_profile_10.dat +ism_md_cmd="--metadata_files /usr/local/testv/stvISM1.csv /usr/local/testv/stvISM2.csv /usr/local/testv/stvISM3.csv /usr/local/testv/stvISM4.csv" if [ $BUILD -eq 1 ];then # Enable memory macros to find unbalanced memory allocations/deallocations @@ -74,7 +75,11 @@ if [ $BUILD -eq 1 ];then fi # run all modes vanilla-fashion -./scripts/runIvasCodec.py -p $cfg -U 1 $WORKERS | tee smoke_test_output.txt +# treat ISM modes separately because passing the metadata files to MASA modes causes crashes +ism_modes=$(./scripts/runIvasCodec.py -l | grep ISM) +non_ism_modes=$(./scripts/runIvasCodec.py -l | grep -v ISM) +./scripts/runIvasCodec.py -m $non_ism_modes -p $cfg -U 1 $WORKERS | tee smoke_test_output.txt +./scripts/runIvasCodec.py -m $ism_modes -p $cfg -U 1 $WORKERS $ism_md_cmd | tee smoke_test_output.txt # run the decoding again, but with 15% frame loss ./scripts/runIvasCodec.py -p $cfg -U 1 $WORKERS -D="-fec 15" --decoder_only | tee smoke_test_output_plc.txt diff --git a/lib_com/bits_alloc.c b/lib_com/bits_alloc.c index 41acc25b48..a162e40be3 100644 --- a/lib_com/bits_alloc.c +++ b/lib_com/bits_alloc.c @@ -516,26 +516,29 @@ static ivas_error acelp_FCB_allocator( *--------------------------------------------------------------------*/ ivas_error config_acelp1( - const int16_t enc_dec, /* i : encoder/decoder flag */ - const int32_t total_brate, /* i : total bitrate */ - const int32_t core_brate_inp, /* i : core bitrate */ - const int16_t core, /* i : core */ - const int16_t extl, /* i : extension layer */ - const int32_t extl_brate, /* i : extension layer bitrate */ - const int16_t L_frame, /* i : frame length at internal Fs */ - const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const int16_t signaling_bits, /* i : number of signaling bits */ - const int16_t coder_type, /* i : coder type */ - const int16_t tc_subfr, /* i : TC subfr ID */ - const int16_t tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - int16_t *unbits, /* o : number of unused bits */ - const int16_t element_mode, /* i : element mode */ - int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - 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 idchan, /* i : stereo channel ID */ + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t core_brate_inp, /* i : core bitrate */ + const int16_t core, /* i : core */ + const int16_t extl, /* i : extension layer */ + const int32_t extl_brate, /* i : extension layer bitrate */ + const int16_t L_frame, /* i : frame length at internal Fs */ + const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ + ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ + const int16_t signaling_bits, /* i : number of signaling bits */ + const int16_t coder_type, /* i : coder type */ + const int16_t tc_subfr, /* i : TC subfr ID */ + const int16_t tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ + int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ + int16_t *unbits, /* o : number of unused bits */ + const int16_t element_mode, /* i : element mode */ + int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ + 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 idchan, /* i : stereo channel ID */ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + const int16_t active_cnt, /* i : Active frame counter */ +#endif 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 GSC_IVAS_mode /* i : GSC IVAS mode */ @@ -754,11 +757,12 @@ ivas_error config_acelp1( bits -= acelp_cfg->mid_lsf_bits; } #ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE - else if ( tdm_lp_reuse_flag == 1 && idchan == 1 ) + else if ( tdm_lp_reuse_flag == 1 && idchan == 1 && active_cnt != 1 ) { bits -= TDM_IC_LSF_PRED_BITS; } #endif + /* gain Q bit-budget - part 1 */ if ( ( coder_type != UNVOICED && coder_type != AUDIO && coder_type != INACTIVE && !( core_brate <= ACELP_8k00 && coder_type != TRANSITION ) ) || ( coder_type == INACTIVE && total_brate > MAX_GSC_INACTIVE_BRATE ) ) { @@ -1323,6 +1327,7 @@ ivas_error config_acelp1( else { int16_t nb_prm = 4; + if ( tdm_low_rate_mode == 1 ) { nb_prm = 2; diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index f8e70061bf..446cf8ca85 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -833,13 +833,6 @@ static ivas_error write_indices_element( /* restore previous pointer position */ pt_stream_loc = pt_stream_backup; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - /* TODO implemented only for MCT for now */ - if ( ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && ( element_id * CPE_CHANNELS + n == LFE_CHANNEL ) ) - { - continue; - } -#endif #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif diff --git a/lib_com/cnst.h b/lib_com/cnst.h index db1dc3d898..7b359e2f40 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -1391,6 +1391,25 @@ enum #define NPARTCLDFB 10 #define NPART_SHAPING 62 +#ifdef ERI_FDCNGVQ_LOW_ROM +#define FDCNG_VQ_MAX_LEN FD_CNG_maxN_37bits +#define FDCNG_VQ_DCT_NSEGM 4 +#define FDCNG_VQ_DCT_MINTRUNC 8 +#define FDCNG_VQ_DCT_MAXTRUNC 18 +#define FDCNG_VQ_MAX_LEN_WB 21 + +#define FDCNG_VQ_DCT_NPOST 8 + +typedef enum _DCTTYPE +{ + DCT_T2_24_XX = 0, /* truncated DCT_T2_24 */ + IDCT_T2_XX_24 = 1, + DCT_T2_21_XX = 2, /* truncated DCT_T2_21 */ + IDCT_T2_XX_21 = 3 +} DCTTYPE; + +#endif + #define MSSUBFRLEN 12 #define MSNUMSUBFR 6 #define MSBUFLEN 5 diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 3e012a6f99..61c68eae5d 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -93,18 +93,9 @@ typedef struct float x, y, z; } IVAS_VECTOR3; -typedef struct -{ - float x, y, z; - -} IVAS_POSITION; typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE; -#ifdef FIX_350_MASA_DELAY_COMP typedef struct ivas_masa_decoder_ext_out_meta_struct *MASA_DECODER_EXT_OUT_META_HANDLE; -#else -typedef struct ivas_masa_qmetadata_frame_struct *IVAS_MASA_QMETADATA_HANDLE; -#endif typedef struct TDREND_HRFILT_FiltSet_struct *IVAS_DEC_HRTF_HANDLE; typedef struct ivas_hrtfs_crend_structure *IVAS_DEC_HRTF_CREND_HANDLE; diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index d138fe1a1e..7f9b385c3f 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -250,32 +250,21 @@ int16_t getTnsAllowed( const int32_t total_brate, /* i : total bitrate */ const int16_t igf, /* i : flag indicating IGF activity*/ const int16_t element_mode /* i : IVAS element mode */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const MCT_CHAN_MODE mct_chan_mode /* i : MCT channel mode */ -#endif ) { int16_t tnsAllowed = 0; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( mct_chan_mode != MCT_CHAN_MODE_LFE ) + if ( igf ) { -#endif - if ( igf ) - { - if ( total_brate > HQ_16k40 || ( ( total_brate > HQ_13k20 ) && element_mode == IVAS_CPE_DFT ) ) - { - tnsAllowed = 1; - } - } - else if ( total_brate > HQ_32k ) + if ( total_brate > HQ_16k40 || ( ( total_brate > HQ_13k20 ) && element_mode == IVAS_CPE_DFT ) ) { tnsAllowed = 1; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE } -#endif + else if ( total_brate > HQ_32k ) + { + tnsAllowed = 1; + } return tnsAllowed; } @@ -419,20 +408,10 @@ int16_t getIgfPresent( const int32_t total_brate, /* i : total bitrate */ const int16_t bwidth, /* i : audio bandwidth */ const int16_t rf_mode /* i : flag to signal the RF mode */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const int16_t mct_chan_mode /* i : MCT channel mode */ -#endif ) { int16_t igfPresent = 0; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - return igfPresent; - } -#endif if ( bwidth == SWB ) { @@ -820,12 +799,7 @@ void init_tcx_cfg( const int16_t infoIGFStopFreq, const int16_t element_mode, const int16_t ini_frame, - const int16_t MCT_flag -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const MCT_CHAN_MODE mct_chan_mode /* i : MDCT channel mode */ -#endif -) + const int16_t MCT_flag ) { int16_t i; int16_t mdctWindowLength; @@ -855,20 +829,9 @@ void init_tcx_cfg( /* set number of coded lines */ hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( bwidth ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - hTcxCfg->tcx_coded_lines = MCT_LFE_MAX_LINE; - } -#endif /* TNS in TCX */ hTcxCfg->pCurrentTnsConfig = NULL; - hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, igf, element_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - mct_chan_mode -#endif - ); + hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, igf, element_mode ); if ( hTcxCfg->fIsTNSAllowed ) { diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c index b96798815e..5557a88606 100644 --- a/lib_com/delay_comp.c +++ b/lib_com/delay_comp.c @@ -69,12 +69,10 @@ int32_t get_delay( { delay = IVAS_ENC_DELAY_NS; -#ifdef FIX_350_MASA_DELAY_COMP if ( ivas_format == MASA_FORMAT ) { delay = 0; /* All delay is compensated in the decoder with MASA */ } -#endif } if ( ivas_format == SBA_FORMAT ) @@ -107,12 +105,10 @@ int32_t get_delay( } -#ifdef FIX_350_MASA_DELAY_COMP if ( ivas_format == MASA_FORMAT ) { delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ } -#endif } } diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 0641426751..582a52d513 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -325,9 +325,7 @@ typedef enum #define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ #define ISM_EXTENDED_METADATA_BRATE IVAS_64k #define ISM_EXTENDED_METADATA_BITS 1 -#ifdef FIX_379_EXT_METADATA #define ISM_METADATA_RS_MAX_FRAMES 5 /* Number of frames with opposite extended metadata flags before switching */ -#endif /* Parametric ISM */ #define MAX_PARAM_ISM_NBANDS 11 @@ -343,12 +341,7 @@ typedef enum #define PARAM_ISM_HYS_BUF_SIZE 10 /* ISM DTX */ -#ifdef DISCRETE_ISM_DTX_CNG #define ISM_DTX_COH_SCA_BITS 4 -#else -#define PARAM_ISM_DTX_COH_SCA_BITS 4 -#endif -#ifdef DISCRETE_ISM_DTX_CNG #define ISM_DTX_AZI_BITS_HIGH 8 #define ISM_DTX_ELE_BITS_HIGH 7 #define ISM_Q_STEP_HIGH (ISM_Q_STEP / 2) @@ -357,10 +350,6 @@ typedef enum #define ISM_DTX_ELE_BITS_LOW 5 #define ISM_Q_STEP_LOW (ISM_Q_STEP * 2) #define ISM_Q_STEP_BORDER_LOW (ISM_Q_STEP_BORDER * 2) -#else -#define PARAM_ISM_DTX_AZI_BITS 5 -#define PARAM_ISM_DTX_ELE_BITS 4 -#endif typedef enum @@ -376,19 +365,10 @@ enum { IND_ISM_NUM_OBJECTS, IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS, -#ifdef FIX_379_EXT_METADATA IND_ISM_METADATA_FLAG, -#else - IND_ISM_METADATA_FLAG = IND_ISM_EXTENDED_FLAG + MAX_NUM_OBJECTS, /* EN2VE: Is this not supposed to be in the loop part below, since it is one per ISM? */ -#endif IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, -#ifdef DISCRETE_ISM_DTX_CNG IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, IND_ISM_SCE_ID_DTX, -#else - IND_ISM_SCE_ID_DTX = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, - IND_ISM_NOISY_SPEECH_FLAG, -#endif IND_ISM_DTX_COH_SCA, /* ------------- loop for objects -------------- */ @@ -813,7 +793,7 @@ enum fea_names #define TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ( TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS + TDM_LR_CONTENT_BITS + STEREO_BITS_TCA ) #ifdef LSF_RE_USE_SECONDARY_CHANNEL #ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE -#define TDM_IC_LSF_PRED_BITS 1 /* Number of bits to code the inter channel lsf prediction mode */ +#define TDM_IC_LSF_PRED_BITS 1 /* number of bits to code the inter channel LSF prediction mode */ #endif #endif @@ -849,6 +829,14 @@ enum fea_names #define SNS_LOW_BR_MODE -1 #define SNS_NPTS 16 /* Number of downsampled SNS parameters */ +#ifdef SNS_MSVQ +#define SNS_STEREO_MODE_LR 0 +#define SNS_STEREO_MODE_MS 1 +#define SNS_STEREO_MODE_OFFSET_INDICES 4 +#define SNS_MSVQ_NSTAGES_TCX20 4 +#define SNS_MSVQ_NSTAGES_TCX10 3 +#define SNS_MSVQ_NSTAGES_SIDE 2 +#endif #define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f #define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC @@ -961,10 +949,8 @@ typedef enum #define DELAY_DIRAC_SPAR_ENC_CMP_NS 500000L /* here we may set the 24 samples (at 48 kHz) additional delay to something else, leave as is for now*/ #define DELAY_DIRAC_PARAM_DEC_SFR 2 /* Delay to be compensation for DirAC parameters in the decoder (subframes) */ -#ifdef FIX_350_MASA_DELAY_COMP #define DELAY_MASA_PARAM_DEC_SFR 2 /* Delay to be compensation for MASA parameters in the decoder (subframes) */ #define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ -#endif #define DIRAC_SLOT_NS 1250000L /* time duration of a time slot, 1.25ms (==DELAY_RENERER_NS/MAX_PARAM_SPATIAL_SUBFRAMES) */ #define DIRAC_SLOT_ENC_NS 5000000L @@ -1136,9 +1122,6 @@ enum #define MASA_MAXIMUM_DIRECTIONS 2 #define MASA_MAX_TRANSPORT_CHANNELS 2 -#ifndef FIX_350_MASA_DELAY_COMP -#define MASA_ENC_DELAY_SLOTS 7 -#endif #define MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS 5 @@ -1211,13 +1194,11 @@ typedef enum MASA_STEREO_DOWNMIX } MASA_TRANSPORT_SIGNAL_TYPE; -#ifdef FIX_382_MASA_META_FRAMING_ASYNC typedef enum { MASA_FRAME_1SF, MASA_FRAME_4SF } MASA_FRAME_MODE; -#endif /*----------------------------------------------------------------------------------* * Multichannel format @@ -1283,26 +1264,13 @@ typedef enum #define NBBITS_MCT_RATIO 4 #define BITRATE_MCT_RATIO_RANGE ( 1 << NBBITS_MCT_RATIO ) /* Range of the coded bitrate distribution ratio */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE -#define LFE_BITS 180 -#define MCT_LFE_MAX_LINE 24 -#endif #define MCT_NUM_BLOCK_DATA_BITS 4 -#ifndef ISSUE_24_CLEANUP_MCT_LFE -typedef enum -{ - MCT_CHAN_MODE_REGULAR, - MCT_CHAN_MODE_LFE, - MCT_CHAN_MODE_IGNORE -} MCT_CHAN_MODE; -#else typedef enum { MCT_CHAN_MODE_REGULAR, MCT_CHAN_MODE_IGNORE } MCT_CHAN_MODE; -#endif /*----------------------------------------------------------------------------------* * Parametric MC Constants @@ -1351,6 +1319,9 @@ typedef enum #define PARAM_MC_BAND_TO_MDCT_BAND_RATIO 16 /* Ratio of resolution of CLDFB Bands to MDCT Bands */ #define PARAM_MC_SLOT_ENC_NS 2500000L #define PARAM_MC_MDFT_NO_SLOTS 8 +#ifdef PARAMMC_SHORT_ENC_MDFT +#define PARAM_MC_CLDFB_TO_MDFT_FAC 2 +#endif /*----------------------------------------------------------------------------------* * LFE Coding Constants @@ -1471,7 +1442,11 @@ typedef enum #define SFX_SPAT_BIN_NUM_SUBSAMPLES 64 #define ITD_MEM_LEN (MAX_ITD + SFX_SPAT_BIN_SINC_M) #define L_SUBFRAME5MS_48k (L_FRAME48k/4) +#ifdef FIX_421_TD_INT_TUNE +#define MAX_ANGULAR_STEP (0.01f) +#else #define MAX_ANGULAR_STEP (1.0f) +#endif #define MAX_ANGULAR_STEP_INV ( 1.0f / MAX_ANGULAR_STEP ) #define MAX_INTERPOLATION_STEPS 12 @@ -1561,6 +1536,9 @@ typedef enum #define IVAS_320_PT_LEN 320 #define IVAS_240_PT_LEN 240 #define IVAS_160_PT_LEN 160 +#ifdef PARAMMC_SHORT_ENC_MDFT +#define IVAS_120_PT_LEN 120 +#endif #define IVAS_80_PT_LEN 80 #define IVAS_40_PT_LEN 40 diff --git a/lib_com/ivas_error_utils.h b/lib_com/ivas_error_utils.h index 034369656b..b9a6b3f872 100644 --- a/lib_com/ivas_error_utils.h +++ b/lib_com/ivas_error_utils.h @@ -84,6 +84,7 @@ static inline ivas_error ivas_error_wrapper( const ivas_error error_code, const fprintf( stderr, "\n\nIn function: %s(), %s:%d\n\n", function, file, line ); // assert( 0 ); + return error_code; } #else diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 3e0d68049a..f42e8bde74 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -156,7 +156,11 @@ ivas_error ivas_fb_set_cfg( { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS ); +#ifdef PARAMMC_SHORT_ENC_MDFT + pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS ); +#else pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + 3 * NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS ); +#endif } *pFb_cfg_out = pFb_cfg; diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 297e2cfb45..38a34a15bd 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -455,22 +455,13 @@ float ism_dequant_meta( void ivas_param_ism_config( PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: IVAS Param ISM Config Structure */ -#ifdef NCHAN_ISM_PARAMETER , const int16_t nchan_obj /* i : number of ISM channels */ -#endif ) { -#ifdef NCHAN_ISM_PARAMETER int16_t i; hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; -#else - int16_t i, num_obj; - - hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; - num_obj = hParamIsm->num_obj; -#endif for ( i = 0; i < hParamIsm->nbands; i++ ) { @@ -478,11 +469,7 @@ void ivas_param_ism_config( } /* for elevation zero compute the max azi quantization indices */ -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < nchan_obj; i++ ) -#else - for ( i = 0; i < num_obj; i++ ) -#endif { hParamIsm->last_az_diff[i] = 0; hParamIsm->last_az_sgn[i] = 1; @@ -551,7 +538,6 @@ void ivas_ism_metadata_close( } -#ifdef DISCRETE_ISM_DTX_CNG /*-------------------------------------------------------------------* * update_last_metadata() * @@ -613,4 +599,3 @@ void ivas_get_ism_sid_quan_bitbudget( return; } -#endif diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 3a53b2c682..e576c725b2 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -314,10 +314,8 @@ void masa_sample_rate_band_correction( int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ const int32_t sampling_rate /* i : Sampling rate */ -#ifdef FIX_350_MASA_DELAY_COMP , MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ -#endif ) { uint8_t band, sf; @@ -390,7 +388,6 @@ void masa_sample_rate_band_correction( hQMetaData->twoDirBands[band] = 0; } } -#ifdef FIX_350_MASA_DELAY_COMP if ( hExtOutMeta != NULL ) { /* in decoder, zero the EXT out MASA meta buffer */ @@ -411,7 +408,6 @@ void masa_sample_rate_band_correction( } } } -#endif return; } diff --git a/lib_com/ivas_mct_com.c b/lib_com/ivas_mct_com.c index 5a6eafed5b..97c5f5dd8c 100644 --- a/lib_com/ivas_mct_com.c +++ b/lib_com/ivas_mct_com.c @@ -66,13 +66,6 @@ void splitAvailableBitsMCT( int16_t min_chan_bits[MCT_MAX_CHANNELS], min_bits_tot, remaining_bits; int16_t core[MCT_MAX_CHANNELS]; MCT_CHAN_MODE mct_chan_mode[MCT_MAX_CHANNELS]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t num_lfe; - int16_t lfe_channel; - - num_lfe = 0; - lfe_channel = -1; -#endif min_bits_tot = 0; for ( i = 0; i < nchan; i++ ) @@ -87,22 +80,11 @@ void splitAvailableBitsMCT( mct_chan_mode[i] = ( (Decoder_State *) sts[i] )->mct_chan_mode; core[i] = ( (Decoder_State *) sts[i] )->core; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( mct_chan_mode[i] == MCT_CHAN_MODE_LFE ) - { - num_lfe++; - lfe_channel = i; - assert( lfe_channel == LFE_CHANNEL ); - } -#endif } for ( i = 0; i < nchan; i++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - mct_chan_mode[i] != MCT_CHAN_MODE_LFE && -#endif mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) { min_chan_bits[i] = 0; @@ -136,9 +118,6 @@ void splitAvailableBitsMCT( } if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - mct_chan_mode[i] != MCT_CHAN_MODE_LFE && -#endif mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) { assert( split_ratio[i] >= 1 && split_ratio[i] < BITRATE_MCT_RATIO_RANGE ); @@ -174,9 +153,6 @@ void splitAvailableBitsMCT( } if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - mct_chan_mode[i] != MCT_CHAN_MODE_LFE && -#endif mct_chan_mode[i] != MCT_CHAN_MODE_IGNORE ) { *bits_frame_channel -= diff * split_ratio[i] / BITRATE_MCT_RATIO_RANGE; diff --git a/lib_com/ivas_mdft_imdft.c b/lib_com/ivas_mdft_imdft.c index e6f276575e..a9f5bac532 100644 --- a/lib_com/ivas_mdft_imdft.c +++ b/lib_com/ivas_mdft_imdft.c @@ -82,6 +82,11 @@ static void ivas_get_mdft_twid_factors( case IVAS_160_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_160[0]; break; +#ifdef PARAMMC_SHORT_ENC_MDFT + case IVAS_120_PT_LEN: + *ppTwid = &ivas_mdft_coeff_cos_twid_120[0]; + break; +#endif case IVAS_80_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_80[0]; break; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2e7bc2799c..261b1d38a8 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -501,9 +501,6 @@ void stereo_tcx_core_dec( STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ const int16_t nchan_out, /* i : number of output channels */ const IVAS_FORMAT ivas_format /* i : IVAS format */ -#ifndef DISCRETE_ISM_DTX_CNG - ,const ISM_MODE ism_mode /* i : ISM mode (only needed if format is ISM) */ -#endif ); void stereo_tcx_init_dec( @@ -813,9 +810,7 @@ ivas_error ivas_ism_enc( ivas_error ivas_ism_metadata_enc( const int32_t ism_total_brate, /* i : ISM total bitrate */ -#ifdef NCHAN_ISM_PARAMETER const int16_t nchan_ism, /* i : number of ISM channels */ -#endif const int16_t nchan_transport, /* i : number of transport channels */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ @@ -829,25 +824,17 @@ ivas_error ivas_ism_metadata_enc( ivas_error ivas_ism_metadata_dec( const int32_t ism_total_brate, /* i : ISM total bitrate */ -#ifdef NCHAN_ISM_PARAMETER const int16_t nchan_ism, /* i : number of ISM channels */ -#endif int16_t *nchan_transport, /* o : number of transport channels */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ const int16_t bfi, /* i : bfi flag */ int16_t nb_bits_metadata[], /* o : number of metadata bits */ ISM_MODE ism_mode, /* i : ISM mode */ -#ifdef DISCRETE_ISM_DTX_CNG ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ -#endif -#ifdef FIX_379_EXT_METADATA const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ int16_t *ism_extended_metadata_flag, /* i/o: Extended metadata active in renderer */ int16_t *ism_extmeta_cnt /* i/o: Number of change frames observed */ -#else - const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Config Handle */ -#endif ); @@ -888,10 +875,8 @@ void ivas_param_ism_stereo_dmx( void ivas_param_ism_config( PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: IVAS Param ISM Config Structure */ -#ifdef NCHAN_ISM_PARAMETER , const int16_t nchan_ism /* i : number of ISM channels */ -#endif ); ivas_error ivas_ism_enc_config( @@ -900,13 +885,8 @@ ivas_error ivas_ism_enc_config( ivas_error ivas_ism_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -#ifdef DISCRETE_ISM_DTX_CNG , const ISM_MODE last_ism_mode /* i/o: last ISM mode */ -#endif -#ifndef NCHAN_ISM_PARAMETER - ,const int16_t num_obj /* i : number of objects in the bitstream */ -#endif ); ivas_error ivas_param_ism_dec_open( @@ -936,7 +916,6 @@ ivas_error ivas_ism_dtx_open( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); -#ifdef DISCRETE_ISM_DTX_CNG /*! r: indication of DTX frame */ int16_t ivas_ism_dtx_enc( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ @@ -949,20 +928,12 @@ int16_t ivas_ism_dtx_enc( int16_t md_diff_flag[], /* o : metadata differential flag */ int16_t *sid_flag /* o : indication of SID frame */ ); -#else -/*! r: indication of DTX frame */ -int16_t ivas_ism_dtx_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - int16_t *sid_flag /* o : indication of SID frame */ -); -#endif ivas_error ivas_ism_dtx_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t *nb_bits_metadata /* o : number of metadata bits */ ); -#ifdef DISCRETE_ISM_DTX_CNG void ivas_ism_metadata_sid_enc( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ const int16_t flag_noisy_speech, /* i : noisy speech flag */ @@ -975,19 +946,7 @@ void ivas_ism_metadata_sid_enc( BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ int16_t nb_bits_metadata[] /* o : number of metadata bits */ ); -#else -void ivas_param_ism_metadata_dtx_enc( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */ - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ -#ifdef NCHAN_ISM_PARAMETER - ,const int16_t nchan_ism /* i : number of ISM channels */ -#endif -); -#endif -#ifdef DISCRETE_ISM_DTX_CNG void ivas_ism_metadata_sid_dec( SCE_DEC_HANDLE hSCE[MAX_SCE], /* i/o: SCE encoder structure */ const int32_t ism_total_brate, /* i : ISms total bitrate */ @@ -1000,11 +959,6 @@ void ivas_ism_metadata_sid_dec( ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ int16_t nb_bits_metadata[] /* o : number of metadata bits */ ); -#else -void ivas_param_ism_metadata_dtx_dec( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); -#endif void ivas_ism_get_sce_id_dtx( ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ @@ -1024,7 +978,6 @@ void ivas_ism_coh_estim_dtx_enc( const int16_t input_frame /* i : input frame length */ ); -#ifdef DISCRETE_ISM_DTX_CNG void update_last_metadata( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ @@ -1040,7 +993,6 @@ void ivas_get_ism_sid_quan_bitbudget( int16_t *nBits_coh, /* o : number of Q bits for coherence */ int16_t *nBits_sce_id /* o : number of Q bits for sce_id_dtx */ ); -#endif /*----------------------------------------------------------------------------------* @@ -1211,9 +1163,7 @@ void stereo_dft_dec( float *input_mem, /* i/o: mem of buffer DFT analysis */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ -#ifdef SBA2MONO const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */ -#endif ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs, /* i : Fs for delay calculation */ @@ -1969,18 +1919,18 @@ void tdm_low_rate_dec( void tdm_SCh_LSF_intra_pred( const int32_t element_brate, /* i : element bitrate */ const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ - float *pred_lsf_secondary /* o : predicted secondary channel LSFs */ + float *pred_lsf_SCh /* o : predicted secondary channel LSFs */ ); #ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE void tdm_SCh_lsf_reuse( - const int16_t enc_dec, /* i : encoder/decoder flag */ - const int32_t element_brate, /* i : element bitrate */ + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t element_brate, /* i : element bitrate */ float lsf_new[M], /* i/o: LSFs at the end of the frame */ float lsp_new[M], /* i/o: LSPs at the end of the frame */ const float tdm_lsfQ_PCh[M], /* i : primary channel LSFs */ const float lsf_wgts[M], /* i : LSF weights */ - int16_t beta_index[] /* i/o: quantization index */ + int16_t *beta_index /* i/o: quantization index */ ); #endif #endif @@ -2233,9 +2183,6 @@ void decoder_tcx_imdct( float synthFB[], const int16_t bfi, /* i : Bad frame indicator */ const int16_t frame_cnt, /* i : frame counter in the super frame */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t isLFE, /* i : is LFE */ -#endif const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ); @@ -2444,6 +2391,23 @@ void sns_shape_spectrum( const int16_t L_frame /* i : frame length */ ); +#ifdef SNS_MSVQ +int16_t quantize_sns( + float sns_in[CPE_CHANNELS][NB_DIV][M], + float snsQ_out[CPE_CHANNELS][NB_DIV][M], + Encoder_State **sts, + int16_t *indices, + int16_t *zero_side_flag, + int16_t *sns_stereo_mode +); + +void dequantize_sns( + int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW], + float snsQ_out[CPE_CHANNELS][NB_DIV][M], + Decoder_State **sts +); +#endif + void sns_avq_cod( const float *sns, /* i : Input sns vectors */ const float *snsmid, /* i : Input mid-sns vectors */ @@ -2465,7 +2429,11 @@ void sns_avq_cod_stereo( void sns_avq_dec( int16_t *index, /* i : Quantization indices */ +#ifdef SNS_MSVQ + float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ +#else float *SNS_Q, /* o : Quantized SNS vectors */ +#endif const int16_t numlpc /* i : Number of sets of lpc */ ); @@ -2800,9 +2768,6 @@ void ivas_mdct_core_whitening_enc( int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : size of TNS */ int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to parameter array */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t *LFE_off, /* o : flag if LFE has content */ -#endif const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ const int16_t nChannels /* i : total number of coded channels */ ); @@ -2820,9 +2785,6 @@ void ivas_mct_core_enc( void ivas_mdct_quant_coder( CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t LFE_off, /* i : flag if LFE has content */ -#endif int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */ int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */ int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */ @@ -2873,9 +2835,6 @@ void ivas_mdct_dec_side_bits_frame_channel( int16_t param_lpc[MCT_MAX_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */ Decoder_State *st0, /* i : pointer to bitstream handle */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t *LFE_off, /* o : flag if LFE has content */ -#endif int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */ int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */ const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0) */ @@ -2895,9 +2854,6 @@ void ivas_mct_side_bits( void ivas_mdct_core_invQ( CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t LFE_off, /* i : flag if LFE content */ -#endif int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */ int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */ int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */ @@ -2915,18 +2871,12 @@ void ivas_mdct_core_reconstruct( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ float *x[][NB_DIV], /* i/o: pointers to synthesis @internal_FS */ float signal_outFB[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t LFE_off, /* i : flag if LFE content */ -#endif int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ ); void ivas_mdct_core_tns_ns( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t LFE_off, /* i : flag if LFE has content */ -#endif int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */ STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */ float *x[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */ @@ -3248,11 +3198,9 @@ void ivas_sba_config( int16_t *element_mode /* o : element mode of the core coder */ ); -#ifdef FIX_386_CORECODER_RECONFIG void ivas_sba_set_cna_cng_flag( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); -#endif ivas_error ivas_sba_dec_reconfigure( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ @@ -3330,11 +3278,9 @@ void ivas_sba_dirac_stereo_config( STEREO_DFT_CONFIG_DATA_HANDLE hConfig /* o : DFT stereo configuration */ ); -#ifdef SBA2MONO int16_t ivas_get_sba_dirac_stereo_flag( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); -#endif void ivas_sba_dirac_stereo_smooth_parameters( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ @@ -3543,8 +3489,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t index_slot + const int16_t nchan_transport /* i : number of transport channels */ ); void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( @@ -3597,8 +3542,6 @@ void ivas_dirac_dec_compute_directional_responses( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ - const int16_t direction_idx, /* i : index for direction (azi and ele) */ - const int16_t subframe_idx, /* i : subframe index */ const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ @@ -4568,11 +4511,6 @@ ivas_error ivas_masa_enc_open( void ivas_masa_enc_close( MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ - #ifndef FIX_350_MASA_DELAY_COMP - , - const int16_t nchan_transport, /* i : Number of transport channels */ - const IVAS_FORMAT ivas_format /* i : IVAS format */ - #endif ); void ivas_masa_enc_reconfigure( @@ -4654,9 +4592,7 @@ void masa_sample_rate_band_correction( int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ const int32_t sampling_rate /* i : sampling rate */ -#ifdef FIX_350_MASA_DELAY_COMP , MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ -#endif ); void invdct4_transform( diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index f04538c479..6677b53a9f 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -669,10 +669,10 @@ const float tdm_LSF_MEAN_RE_USE[M] = 3299.107307F, 3686.249102F, 4034.473656F, 4393.818819F, 4781.683038F, 5155.954294F, 5542.569582F, 5927.377309F }; -const float tdm_Beta_Q1bit_re_use_132[2] = { 0.97F, 0.75F }; -const float tdm_Beta_Q1bit_re_use_164[2] = { 0.95F, 0.71F }; -const float tdm_Beta_Q1bit_re_use_244_320[2] = { 0.93F, 0.73F }; -const float tdm_Beta_Q1bit_re_use_480[2] = { 0.97F, 0.77F }; +const float tdm_Beta_Q1bit_re_use_13k2[2] = { 0.97F, 0.75F }; +const float tdm_Beta_Q1bit_re_use_16k4[2] = { 0.95F, 0.71F }; +const float tdm_Beta_Q1bit_re_use_24k4_32k[2] = { 0.93F, 0.73F }; +const float tdm_Beta_Q1bit_re_use_48k[2] = { 0.97F, 0.77F }; const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15] = { @@ -3980,6 +3980,30 @@ const float ivas_cos_twiddle_160[IVAS_160_PT_LEN >> 1] = 0.0760120586092433f, 0.0564205163668375f, 0.0368072229413588f, 0.0171797396307788f }; +#ifdef PARAMMC_SHORT_ENC_MDFT +const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1] = +{ + 1.0000000000f, 0.9999143276f, 0.9996573250f, 0.9992290362f, 0.9986295348f, 0.9978589232f, 0.9969173337f, + 0.9958049276f, 0.9945218954f, 0.9930684570f, 0.9914448614f, 0.9896513868f, 0.9876883406f, 0.9855560591f, + 0.9832549076f, 0.9807852804f, 0.9781476007f, 0.9753423205f, 0.9723699204f, 0.9692309097f, 0.9659258263f, + 0.9624552365f, 0.9588197349f, 0.9550199445f, 0.9510565163f, 0.9469301295f, 0.9426414911f, 0.9381913359f, + 0.9335804265f, 0.9288095529f, 0.9238795325f, 0.9187912101f, 0.9135454576f, 0.9081431738f, 0.9025852843f, + 0.8968727415f, 0.8910065242f, 0.8849876375f, 0.8788171127f, 0.8724960071f, 0.8660254038f, 0.8594064115f, + 0.8526401644f, 0.8457278217f, 0.8386705679f, 0.8314696123f, 0.8241261886f, 0.8166415552f, 0.8090169944f, + 0.8012538127f, 0.7933533403f, 0.7853169309f, 0.7771459615f, 0.7688418321f, 0.7604059656f, 0.7518398075f, + 0.7431448255f, 0.7343225094f, 0.7253743710f, 0.7163019434f, 0.7071067812f, 0.6977904598f, 0.6883545757f, + 0.6788007455f, 0.6691306064f, 0.6593458151f, 0.6494480483f, 0.6394390020f, 0.6293203910f, 0.6190939493f, + 0.6087614290f, 0.5983246006f, 0.5877852523f, 0.5771451900f, 0.5664062369f, 0.5555702330f, 0.5446390350f, + 0.5336145159f, 0.5224985647f, 0.5112930861f, 0.5000000000f, 0.4886212415f, 0.4771587603f, 0.4656145203f, + 0.4539904997f, 0.4422886902f, 0.4305110968f, 0.4186597375f, 0.4067366431f, 0.3947438564f, 0.3826834324f, + 0.3705574375f, 0.3583679495f, 0.3461170571f, 0.3338068592f, 0.3214394653f, 0.3090169944f, 0.2965415750f, + 0.2840153447f, 0.2714404499f, 0.2588190451f, 0.2461532930f, 0.2334453639f, 0.2206974350f, 0.2079116908f, + 0.1950903220f, 0.1822355255f, 0.1693495038f, 0.1564344650f, 0.1434926220f, 0.1305261922f, 0.1175373975f, + 0.1045284633f, 0.0915016187f, 0.0784590957f, 0.0654031292f, 0.0523359562f, 0.0392598158f, 0.0261769483f, + 0.0130895956f, 0.0000000000f +}; +#endif + const float ivas_sin_twiddle_80[IVAS_80_PT_LEN >> 1] = { -0.00490871880799799f, -0.0441642771270674f, -0.0833517373318975f, -0.122410675199216f, @@ -5530,5 +5554,611 @@ const int16_t ivas_num_active_bands[FB - WB + 1] = IVAS_16K_12BANDS_ACTIVE_BANDS, IVAS_FB_BANDS_12, IVAS_FB_BANDS_12 }; +#ifdef SNS_MSVQ +const int16_t ivas_sns_cdbks_tcx20_levels[SNS_MSVQ_NSTAGES_TCX20] = { 128, 64, 32, 32 }; +const int16_t ivas_sns_cdbks_tcx20_bits[SNS_MSVQ_NSTAGES_TCX20] = { 7, 6, 5, 5 }; + +/* codebooks trained for no adaptive tilt */ +const float ivas_sns_cdbk_tcx20_stage1[ 128 * 16 ] = { + -3.24881770f, -1.99497051f, -0.04725080f, 1.02318508f, 1.51589220f, 1.44649178f, 1.27858728f, 1.15137095f, 0.98029724f, 0.69167126f, 0.33414576f, 0.11759238f, -0.27510520f, -0.63610342f, -1.05394049f, -1.28304590f, + -3.24340413f, -4.15075396f, -2.86242117f, -1.11561919f, 1.12899983f, 1.98341478f, 0.56638511f, -0.05841474f, -0.14875192f, 0.31098029f, 1.87121037f, 0.91347082f, 1.02548459f, 1.98227488f, 1.30278860f, 0.49435585f, + 1.23065598f, 0.87793778f, 0.28294330f, 0.02972172f, 0.42574775f, 0.83386805f, 0.95758438f, 1.21299710f, 1.15042593f, 1.00234403f, 0.60083169f, -0.06520030f, -1.53941239f, -2.26801783f, -2.42116011f, -2.31126766f, + 0.06088614f, 0.02623315f, -0.61781539f, -1.23181247f, -1.40815590f, -1.42831471f, -1.44033232f, -1.33353337f, -0.99555917f, -0.36554180f, 0.55314618f, 1.56114474f, 2.01339157f, 1.99106535f, 1.51097476f, 1.10422329f, + -0.46337128f, -1.76230281f, -2.14514561f, -1.74284853f, -0.74943182f, 0.04642704f, 0.99955801f, 1.04344919f, 1.33994604f, 1.17515394f, 1.38810800f, 1.59087304f, 0.68196542f, -0.13955087f, -0.49622391f, -0.76660607f, + -2.07291483f, -1.16133507f, -1.23972694f, -1.55319745f, -1.53709378f, -0.89687815f, -0.30493476f, 0.53566030f, 0.90463531f, 1.12789938f, 1.18233130f, 1.05231063f, 0.85029894f, 0.96079862f, 1.14041844f, 1.01172838f, + 2.12762247f, 0.85938708f, 0.01404337f, -0.21119526f, -0.23292897f, -0.20800178f, 0.17965021f, 0.51517794f, 0.58450068f, 0.57289696f, 0.08413189f, -0.34604446f, -0.63957268f, -0.82541169f, -1.16686648f, -1.30738935f, + 1.40474083f, 0.32307263f, 0.16419111f, 0.38346550f, 0.50108274f, 0.37590359f, 0.08846238f, -0.23008300f, -0.45942672f, -0.45977478f, -0.43670746f, -0.36727746f, -0.35363526f, -0.33341415f, -0.31539698f, -0.28520292f, + -1.63093109f, 0.32670603f, 1.08393314f, 0.58998372f, 0.53843053f, 0.88612683f, 0.92734321f, 0.85881168f, 0.60801083f, 0.37502839f, -0.29325438f, -0.61636624f, -0.51913318f, -0.70035895f, -0.99754553f, -1.43678500f, + -1.93833343f, -0.69005518f, -0.75170110f, -1.07591216f, -1.13136476f, -0.91057037f, -0.96360579f, -0.81544927f, -0.72636191f, -0.36468519f, 0.13935276f, 1.01589488f, 1.62003238f, 2.00743696f, 2.33078654f, 2.25453582f, + 0.79346182f, 0.75880356f, 0.99941121f, 1.41339988f, 1.42679902f, 1.10135650f, 0.67724856f, 0.16701926f, -0.44226147f, -0.83565024f, -0.96240506f, -0.97710726f, -1.05267194f, -1.07354671f, -1.04194230f, -0.95191489f, + 1.32136151f, -0.10247792f, -0.44723017f, -0.36075427f, -0.71183851f, -0.78401615f, 0.03854040f, 0.61579422f, 0.72990899f, 0.74660263f, 0.27260947f, -0.45511245f, -0.57501743f, -0.20707029f, -0.10728071f, 0.02598055f, + -2.38997175f, -0.94335853f, 0.22486968f, 0.68758389f, 0.77400708f, 0.48551812f, 0.16770824f, 0.18451833f, 0.33722182f, 0.44300618f, 0.45730356f, 0.25903292f, 0.07348018f, -0.18351294f, -0.34985810f, -0.22754861f, + -0.04011386f, -2.74627791f, -2.64617639f, -2.12344376f, -1.04417531f, -1.19773434f, -1.09890378f, -1.14847926f, -1.25163399f, -1.37182360f, -0.92453053f, 0.26852562f, 2.49004087f, 5.03865317f, 3.18845554f, 4.60761675f, + 1.14142799f, 2.34150710f, 1.12597821f, 0.18025034f, -0.06854703f, 0.11882225f, -0.04029384f, -0.10117108f, -1.28130702f, -1.15721800f, 0.11730029f, 0.68335719f, -0.86449861f, -0.91274565f, -0.63726145f, -0.64560064f, + 0.13591417f, 1.45701293f, 0.18328994f, -1.33736241f, -1.63073739f, -1.11748160f, 0.33426081f, 1.38341076f, 1.23963779f, 1.15857921f, -0.19884512f, -0.46649971f, -0.23043753f, -0.16721531f, -0.08938742f, -0.65413930f, + -3.20422583f, -2.18732518f, -1.06476764f, -0.35148934f, 0.10909386f, 0.39065642f, 0.55826648f, 0.44049157f, 0.21409388f, 0.73508456f, 0.80931151f, 0.46688874f, 0.41272044f, 0.76516296f, 1.00398863f, 0.90204888f, + -2.87971458f, -4.23728027f, -0.84454748f, -0.07411834f, 0.21882417f, -1.73386520f, 0.44502397f, -0.29845675f, 0.51877264f, 1.16767994f, -0.80604089f, 1.51749444f, 2.06387385f, 2.42941495f, 1.48054035f, 1.03239888f, + 0.41502416f, 1.92937242f, 2.34493885f, 2.24663449f, 1.97723622f, 1.21219002f, 0.63995779f, 0.11201995f, -0.55860561f, -1.24739776f, -1.54711086f, -1.65155024f, -1.60927011f, -1.56104438f, -1.42473910f, -1.27765585f, + 0.97567115f, -1.33363678f, -2.33351304f, -2.63770798f, -2.22869213f, -1.57504148f, -1.07402035f, -0.47932319f, 0.18065985f, 0.66105619f, 1.18623833f, 1.66207325f, 1.92650802f, 1.89672632f, 1.54070829f, 1.63229361f, + -1.83309029f, -1.12088085f, -0.69053368f, -0.04697322f, 0.16614312f, 0.20653379f, 0.18628141f, 0.29156151f, 0.23415032f, 0.18998435f, 0.46020416f, 0.73218863f, 0.60617333f, 0.33402310f, 0.20549266f, 0.07874144f, + 1.16879643f, -0.94945093f, -1.28153207f, -1.43119528f, -1.63599975f, -1.48906283f, -0.72189452f, 0.19212127f, 0.62604095f, 0.71399312f, 0.84540884f, 0.67919451f, 0.73724815f, 0.94849167f, 0.74181449f, 0.85602585f, + 3.95026110f, 1.56392643f, -0.09370037f, -1.55546296f, -0.28400433f, 2.65160213f, 1.72026891f, -1.03325487f, -2.07533128f, -1.61929448f, -0.37408941f, -0.62936182f, -0.97909452f, -0.16160269f, -0.16361090f, -0.91725088f, + 0.53671249f, -1.03786958f, -1.08801981f, -0.37356699f, -0.22489401f, 0.02309705f, 0.14784551f, 0.19793732f, 0.12472343f, 0.09506024f, 0.05869315f, 0.14383214f, 0.10038818f, 0.25076267f, 0.40789510f, 0.63740306f, + -1.95841389f, 0.03478956f, 1.04981544f, 1.45141888f, 1.01368780f, 1.76553008f, 0.97518033f, 0.87744500f, 1.11998177f, 1.49531245f, 0.43867723f, -1.39588091f, -2.49552623f, -2.06407734f, -1.18465117f, -1.12328885f, + -1.17302983f, 0.17875585f, 0.89193716f, 1.29461477f, 1.14616923f, 0.04577007f, -0.87252250f, -0.55960184f, -0.58720665f, -0.52949712f, -0.37526793f, 0.00605696f, -0.15490600f, 0.06404177f, 0.40280720f, 0.22187871f, + 0.64131376f, 1.75231910f, 2.22508888f, 1.98484418f, 0.78172753f, -0.67005650f, -0.79535378f, 0.16537851f, 0.46442966f, -0.37889506f, -1.24009244f, -0.92537177f, -0.87140953f, -1.04472250f, -1.06971265f, -1.01948730f, + 0.34969434f, 1.41127416f, 0.95134631f, -0.49521902f, -1.13459218f, -1.02414143f, -0.54470763f, 0.04902381f, -0.01765934f, -0.09518271f, -0.07199094f, -0.00398826f, 0.14565429f, 0.17470642f, 0.18302401f, 0.12275814f, + -0.44981302f, -0.20165042f, -0.00073479f, 0.26315901f, 0.44473473f, 0.36317865f, 0.17484972f, 0.03171990f, 0.07343634f, 0.04543774f, -0.09709362f, -0.05624873f, -0.00866747f, -0.02410679f, -0.21651202f, -0.34168925f, + -1.24451525f, -1.23251652f, -1.59614073f, -2.03789978f, -1.96213854f, -1.71444999f, -1.60613134f, -1.51978903f, -1.00014591f, 0.04117804f, 1.34166006f, 2.42925461f, 2.88303472f, 2.83027230f, 2.48737677f, 1.90095093f, + 1.96467234f, 1.49818482f, 0.23737321f, -0.11314831f, -0.14050512f, -0.25201114f, -0.17389748f, -0.07042668f, -0.18426976f, -0.34937744f, -0.42674607f, -0.50442879f, -0.58679768f, -0.52836378f, -0.35445903f, -0.01579900f, + -0.99933612f, 1.11819495f, 1.29449512f, -0.02576221f, -0.61170357f, 0.30864176f, 0.87998806f, 0.96699269f, 0.98082342f, 1.27485776f, 0.52941745f, -1.29529727f, -1.88922976f, -1.36858904f, -0.37094568f, -0.79254774f, + -2.00039877f, -0.30176543f, 0.62981832f, 1.66518235f, 1.71899440f, 1.30408052f, 0.82774193f, 1.00586191f, 0.86017140f, 0.54233910f, -0.13420070f, -0.66585251f, -0.96492148f, -1.18998336f, -1.56871158f, -1.72835605f, + -2.69937742f, -3.72437438f, -3.23623013f, -0.25624354f, 1.96357307f, 2.46814215f, 3.53069303f, -1.06174110f, -1.09336853f, -0.07686535f, 1.29279961f, 1.80354460f, 1.27988399f, -0.42606045f, -0.44754574f, 0.68316996f, + -0.09822772f, 1.26120245f, 1.70052823f, 1.56502837f, 1.15694639f, 0.88838189f, 0.57465867f, 0.31853596f, 0.03466567f, -0.25958767f, -0.49911919f, -0.76007985f, -1.16055649f, -1.53569625f, -1.61195549f, -1.57472513f, + -1.14376495f, -1.43799067f, -1.45325578f, -1.52444742f, -1.38528757f, -1.09797958f, -0.89118095f, -0.62608417f, -0.00250085f, 0.94458366f, 1.51363028f, 1.81223868f, 1.83008829f, 1.56737959f, 1.18148735f, 0.71308420f, + -0.16148812f, -2.04769833f, -2.09471486f, -1.43005703f, -0.50205979f, -0.54822778f, 1.68195446f, 4.00061129f, 1.03275735f, 0.41847912f, 0.66770340f, -0.11822564f, -0.63042447f, -0.32785779f, -0.23825248f, 0.29750055f, + -3.59916102f, -3.16769339f, -2.44843270f, -2.08077491f, -1.31387103f, -0.17348440f, 0.36398119f, 1.21172207f, 1.38864588f, 1.46347831f, 1.46684451f, 1.84157730f, 1.58044756f, 1.35394187f, 1.27155115f, 0.84122764f, + 1.12168796f, 1.77011301f, 0.80501182f, -0.65059510f, -0.86885740f, -0.21223750f, 0.66413611f, 0.77827963f, 0.37800197f, -0.26796888f, -0.97801860f, -0.64966444f, -0.50047252f, -0.44549810f, -0.47750530f, -0.46641261f, + 1.69417025f, 0.14170351f, -0.30309571f, -0.50074499f, -0.60597114f, -0.65756500f, -0.62775844f, -0.41013834f, -0.07761611f, 0.16510349f, 0.25158511f, 0.34758291f, 0.28289899f, 0.29273919f, 0.09829950f, -0.09119332f, + -0.86153928f, 1.09981825f, 0.79441249f, 0.41436072f, 0.25807562f, -0.33355863f, -0.51983659f, -0.25841284f, 0.00191053f, 0.13240503f, 0.19942573f, 0.24363814f, 0.08478089f, -0.15773770f, -0.37897853f, -0.71876393f, + -3.54840520f, -3.31670990f, -2.41138986f, -1.93012869f, -1.20864357f, -0.47291818f, -0.18678664f, 0.02177990f, 0.31458995f, 0.70059621f, 1.23845973f, 1.82707181f, 2.12918865f, 2.27071260f, 2.36659938f, 2.20598371f, + -1.13771731f, 0.39368618f, 0.69608234f, 1.45165188f, 1.41884327f, 1.47720631f, 0.71071536f, 0.51669579f, 0.07379070f, -0.91725636f, -1.46431524f, -2.01818354f, -0.45034354f, -0.20458063f, -0.61685389f, 0.07057863f, + 1.94180196f, -0.43938181f, -1.45235723f, -1.62714803f, -0.56602083f, 0.17861664f, -0.11574800f, -0.55042921f, -0.26385634f, 0.14973980f, 0.40358646f, 0.57744006f, 0.91363053f, 0.71399177f, -0.04044356f, 0.17657766f, + -2.29623160f, 0.37017475f, -0.14625619f, 1.40510672f, -0.18688173f, 0.98162341f, -0.08351923f, 0.30727120f, 0.21088276f, 0.00882905f, 0.20930156f, 0.07859582f, 0.11868622f, 0.19357924f, -0.59940040f, -0.57176126f, + 0.32770546f, -2.17703619f, -2.14694909f, -1.21327174f, -0.09787592f, -0.38390569f, -0.54684876f, -0.76275935f, -1.00614562f, -1.06555455f, -0.70232123f, -0.12667989f, 0.23719344f, 0.82854727f, 3.01646153f, 5.81943998f, + 1.74451794f, 2.61728252f, 2.50084081f, 2.14806463f, 1.03256213f, -0.14230845f, -0.89600957f, -1.26996454f, -1.47590648f, -1.42717085f, -1.20779572f, -0.98498624f, -0.82778555f, -0.73610012f, -0.59428320f, -0.48095729f, + -1.63200590f, 0.23028801f, -0.00907184f, -0.79978843f, -1.00748376f, -0.12526203f, 0.79168097f, 0.90826744f, 0.57548955f, 0.65151547f, 0.37307684f, -0.12047965f, -0.13538324f, 0.00756611f, 0.31705141f, -0.02546129f, + -2.96255244f, -1.89398578f, -1.11705055f, -0.49587679f, -0.64879460f, 0.52145289f, -0.11691144f, 1.02365070f, 0.12124424f, 1.06613244f, 2.03450026f, 1.32855094f, 0.54450823f, -0.09583278f, -0.09304639f, 0.78401059f, + -2.74846388f, -3.29381816f, -1.69589747f, 0.09992536f, 1.19730664f, -0.16362356f, -0.15703004f, 0.55042720f, 0.31568131f, 0.18156842f, 0.68590339f, 1.08986889f, 1.58662197f, 1.58930878f, 0.65286724f, 0.10935410f, + 2.40977200f, 1.75366309f, 0.74979137f, 0.75357579f, 0.58888421f, 0.34045829f, 0.41658500f, 0.41731179f, 0.35825939f, 0.03048901f, -0.69808452f, -1.34206657f, -1.51950247f, -1.45414323f, -1.40318331f, -1.40180996f, + -0.45462369f, -0.79464966f, -0.73449499f, -0.64030961f, -0.59804980f, -0.52688087f, -0.50966580f, -0.32241860f, -0.22751147f, -0.05981052f, 0.18569777f, 0.50293633f, 0.68570837f, 0.93799600f, 1.18364242f, 1.37243415f, + 0.71230959f, -0.15258830f, -0.30639043f, -0.10789426f, 0.13596677f, 0.06139692f, -0.05906250f, -0.09243858f, 0.16058801f, 0.19962984f, -0.02914953f, -0.05986174f, -0.00798730f, -0.03679071f, -0.19035654f, -0.22737122f, + 0.20985119f, 0.67531452f, -0.76482923f, -1.95548615f, -2.01335569f, -1.31859418f, -0.44117933f, 0.43598020f, 0.63898416f, 0.59260283f, 0.59660664f, 0.64364003f, 0.57962656f, 0.72198795f, 0.77431143f, 0.62453906f, + 3.37266827f, 1.16546541f, 0.15487771f, 0.57979973f, 1.63054771f, 1.04524609f, -0.13961184f, -0.53246008f, -0.51061506f, -0.83238697f, -1.04232388f, -0.96061103f, -0.90339873f, -0.99671658f, -1.06027762f, -0.97020325f, + -2.45339028f, 0.22870307f, 0.50079654f, 0.82545821f, -0.45080889f, -0.16537387f, -0.25306064f, -0.33349906f, 0.26143456f, 0.09313222f, 0.86160665f, 0.75164534f, -1.22179547f, -0.18801375f, 1.02457992f, 0.51858541f, + -1.46171297f, 0.63898461f, 2.15634917f, 1.94818588f, 2.12627540f, 1.70759626f, 1.43815259f, 0.82410049f, 0.20479176f, -0.43378728f, -0.89783731f, -1.30555797f, -1.66597981f, -1.80440934f, -1.79291067f, -1.68224086f, + -0.10170911f, 1.63842605f, 2.05629785f, 1.72760611f, 0.13751598f, -1.26847816f, -1.58069540f, -1.04510855f, -0.88231099f, -0.68616151f, -0.59891556f, -0.49054331f, -0.18451655f, 0.19151542f, 0.64619056f, 0.44088718f, + -0.86655238f, 0.59030963f, 1.14256838f, 1.66795450f, 1.50058628f, 1.34944192f, 0.08257813f, 0.24901720f, -0.18852178f, -0.03650931f, -0.27994508f, -1.06110568f, -2.06900429f, -1.73358377f, -0.24057835f, -0.10665549f, + 1.50872779f, 1.31070374f, 0.39357214f, -0.46407462f, -0.92397447f, -1.13436545f, -1.23237146f, -1.13209159f, -1.03095318f, -0.62563255f, -0.17705075f, 0.30244717f, 0.51989500f, 0.80258928f, 0.87034201f, 1.01223693f, + -0.30437289f, -0.88801487f, -0.86107707f, -0.28285107f, 0.28699382f, 0.45911485f, 0.48852566f, 0.45550239f, 0.58082722f, 0.55866427f, 0.31299044f, 0.14102370f, 0.07480087f, -0.08720185f, -0.35323153f, -0.58169395f, + -2.81842263f, -2.50111842f, -2.46829445f, -2.46942172f, -2.16241013f, -1.43881623f, -1.42903221f, -0.83291045f, 0.08734224f, 1.62875243f, 2.38321450f, 2.57841755f, 2.43444406f, 2.45552669f, 2.52427006f, 2.02845861f, + 3.37066045f, 1.49218725f, 0.55470586f, 0.13748306f, -0.13402053f, -0.39589325f, -0.44410867f, -0.48568748f, -0.51085663f, -0.42397560f, -0.53871831f, -0.60800303f, -0.57632384f, -0.50071998f, -0.46558245f, -0.47114696f, + -0.62183100f, 1.32484675f, 1.39280525f, 0.63916764f, 0.07573329f, 0.57096453f, 0.11014546f, -0.13955579f, -0.60839590f, -0.77966466f, -1.07179154f, -1.77671234f, -0.71411508f, 0.13441149f, 0.72184010f, 0.74215154f, + -2.90081845f, -3.29359883f, -1.89249569f, 2.35796037f, 2.47210792f, 0.89083303f, 1.25230145f, 1.03281210f, 1.34506489f, 0.48347288f, -0.08158884f, 0.21388757f, 0.05047384f, -0.37546417f, -0.70672331f, -0.84822525f, + -0.68878586f, -3.17765901f, -2.72677654f, -0.83696096f, 1.93901658f, 2.45806994f, 0.77003930f, 0.58220309f, 0.28500621f, -0.15305225f, 0.53711675f, 0.20321993f, 0.20435459f, 0.27124049f, 0.02126411f, 0.31170327f, + 1.03813940f, 1.60082720f, 1.24608760f, 0.78739775f, 0.96747591f, 1.10068123f, 1.15134869f, 0.74915981f, 0.42167811f, 0.15553718f, -0.33259317f, -0.97385519f, -1.61082594f, -2.05590168f, -2.15737100f, -2.08778582f, + -0.64496025f, 0.35212582f, -0.04908282f, -1.05504457f, -1.19731005f, -0.73315350f, -0.66929749f, -0.60130627f, -0.33236585f, 0.23014025f, 0.69893111f, 1.09565077f, 1.08466375f, 0.94366305f, 0.65639554f, 0.22095053f, + 0.48358349f, -0.37847120f, -1.02753771f, -0.73518795f, -0.11326269f, 0.53003780f, 0.88038488f, 0.88882395f, 0.97329253f, 0.69212641f, 0.87373175f, 0.80871682f, -0.03656343f, -0.94980974f, -1.26081773f, -1.62904720f, + -2.23244251f, -1.79490434f, -1.96001543f, -2.27380061f, -2.07255037f, -1.46415033f, -1.04393033f, 0.20282312f, 1.57244767f, 1.97591827f, 1.77648956f, 1.75160994f, 1.62357252f, 1.47414518f, 1.35930993f, 1.10547779f, + 0.79628045f, 0.95200921f, 0.49234542f, 0.09199320f, -0.05724590f, -0.07118046f, -0.04634766f, -0.00096416f, -0.17970825f, -0.09563800f, -0.01779017f, 0.13120319f, -0.03610489f, -0.35895498f, -0.62415601f, -0.97574095f, + 1.23786391f, -0.05332070f, 0.12142715f, 0.41317442f, 0.15674045f, -0.23609842f, -0.45604039f, -0.60612644f, -0.72063869f, -0.65773356f, -0.45446098f, -0.19856125f, -0.01567566f, 0.31093945f, 0.48567017f, 0.67284050f, + -0.38959317f, 0.48417975f, 0.67846195f, 0.96883427f, 0.97152360f, 0.77479838f, 0.58711345f, 0.71066957f, 0.54730033f, 0.30078955f, -0.00792413f, -0.23889729f, -0.71320215f, -1.17067509f, -1.60334166f, -1.90003738f, + -0.58748774f, -1.47663922f, -1.69196885f, -1.58982061f, -1.20534794f, -0.84425696f, -0.58959522f, -0.30927859f, 0.05320947f, 0.43265601f, 0.78002809f, 1.13478063f, 1.29240277f, 1.39914925f, 1.52607187f, 1.67609674f, + 0.21900175f, 0.90198746f, 1.47152638f, 1.60585024f, 1.28627552f, 0.62955762f, -0.10179136f, -0.53979665f, -0.95849172f, -1.05549774f, -0.93249423f, -0.63224235f, -0.54606380f, -0.47048197f, -0.44721628f, -0.43012290f, + 1.16598857f, -0.44883323f, -0.35990019f, 0.55867022f, 0.76350144f, 0.40336553f, -0.17899520f, -0.32789312f, 0.39266043f, 1.31706823f, 0.14239671f, -1.37351682f, -1.43994906f, -0.44961849f, 0.22694761f, -0.39189263f, + -2.38540927f, -1.62852954f, -0.88269400f, -0.07377225f, 0.58356450f, 0.88990527f, 0.91596948f, 0.64591793f, 0.36616944f, 0.38677852f, 0.46220080f, 0.31194777f, 0.22940934f, 0.16539664f, 0.07914516f, -0.06599966f, + 0.72463355f, -0.52958069f, -1.48068920f, -1.78301927f, -1.84235585f, -1.64970240f, -1.53867955f, -1.38956832f, -1.22397576f, -0.84685537f, -0.05213558f, 1.07240247f, 1.81984926f, 2.69693629f, 2.99963897f, 3.02310102f, + 1.19409909f, 2.68519772f, 1.98964488f, 0.67968388f, -0.01774621f, -0.15701839f, -0.09104235f, 0.24620030f, -0.83163859f, -1.22467182f, -1.23467957f, -1.15083406f, -0.63344301f, -0.72619249f, -0.46989224f, -0.25766714f, + -0.36982280f, 1.17012486f, 0.65527007f, -0.63203416f, -0.41714099f, 0.81639854f, 0.54164978f, 0.77650051f, 0.59880614f, 0.82660687f, -1.04749065f, -0.62911908f, -0.34368981f, -0.45351210f, -0.51314098f, -0.97940604f, + -2.68285677f, -0.85691687f, -0.20235026f, -0.01759520f, -0.00179021f, 0.11451343f, 0.27056934f, 0.20577824f, -0.23029364f, 0.11388472f, -0.05166620f, 0.07283122f, 0.56553984f, 0.81068091f, 1.04931803f, 0.84035365f, + -1.52932955f, -1.34785922f, -0.57071683f, -0.20686289f, 0.08155976f, -0.47381873f, -0.77622457f, -0.57310159f, -0.22137986f, 0.13834100f, 0.49481460f, 0.80177416f, 0.88568748f, 1.02957744f, 1.20356068f, 1.06397834f, + 0.85311314f, 1.33739225f, 1.91363915f, 1.93231248f, 2.08304754f, 1.71778606f, 0.86773094f, 0.43475180f, 0.03661492f, -0.61728713f, -1.15699401f, -1.66982248f, -1.98244609f, -2.00151078f, -1.93416224f, -1.81416574f, + 1.60126279f, -0.81833805f, -1.38880039f, -1.40634796f, -1.32149763f, -1.28036492f, -1.07256373f, -0.72500244f, -0.46550137f, -0.10403512f, 0.28677127f, 0.67644278f, 1.00944110f, 1.34460513f, 1.63359356f, 2.03033498f, + -1.12256198f, -1.95155583f, -1.32316561f, -0.63266570f, -0.15627220f, 0.07123786f, 0.13550620f, 0.25890778f, 0.47783453f, 0.57057758f, 0.68332609f, 0.73453078f, 0.66233264f, 0.62861164f, 0.56744294f, 0.39591321f, + 0.06875844f, -0.77557401f, -1.05293353f, -1.03197877f, -0.85111938f, -0.61756528f, -0.16943921f, 0.22208891f, 0.49771452f, 0.66450860f, 0.73241467f, 0.72611275f, 0.63156506f, 0.52604468f, 0.30774149f, 0.12166125f, + 3.80400584f, 1.75988157f, 0.24665703f, -1.24851564f, -1.25633571f, 0.32422259f, 2.13094918f, 0.70439664f, -1.53713254f, -1.71622823f, -1.08819715f, -0.50716458f, -0.74087437f, -0.99402032f, -0.10491345f, 0.22326928f, + -0.65058475f, -0.32678303f, -0.20547132f, -0.11041511f, -0.11848885f, -0.20790889f, -0.31102714f, -0.27474061f, -0.20625644f, -0.08260245f, 0.09887987f, 0.33251986f, 0.41319745f, 0.49892877f, 0.56061378f, 0.59013885f, + -2.39642240f, -0.73872271f, 0.49057636f, 1.16325658f, 0.79747808f, 1.34021740f, 0.82073194f, 1.17831994f, 1.25881141f, 0.84489551f, -0.77511278f, -1.30893620f, -1.25529283f, -0.65601516f, -0.34679935f, -0.41698601f, + -0.54371008f, 0.45990001f, 0.73230478f, 1.41706822f, 1.07142705f, 0.82233755f, -0.15928811f, -0.34139895f, -0.08643862f, -0.24274513f, -0.48172279f, -0.46452865f, -0.44837803f, -0.43356299f, -0.59008965f, -0.71117480f, + -0.36854343f, 1.40608712f, 2.13291678f, 1.80061219f, 1.15989238f, -0.32896337f, -0.86683083f, -0.45937605f, -0.17796119f, -0.40226921f, -0.30363529f, -1.08494615f, -0.97269428f, -0.91102639f, -0.31526836f, -0.30799363f, + 0.16771127f, 1.28284008f, 0.25724837f, -1.11750032f, -1.04368583f, 0.13121741f, 0.10609539f, 0.02437401f, -0.56098948f, -0.38744327f, 0.07855531f, 0.20548373f, 0.06560664f, 0.24342662f, 0.39885137f, 0.14820870f, + 0.20792769f, -0.15663987f, -0.04445993f, 0.27319064f, 0.51281629f, 0.57962552f, 0.54535177f, 0.41567183f, 0.41718141f, 0.20916435f, -0.10574785f, -0.26957618f, -0.44861183f, -0.55143961f, -0.71969549f, -0.86475851f, + -2.53854175f, -2.10301056f, -1.97482174f, -2.12277877f, -1.80824545f, -1.32660134f, -1.25816793f, -0.90711327f, -0.59056817f, -0.05426883f, 0.60446374f, 1.61001048f, 2.40601840f, 3.00689095f, 3.60110855f, 3.45562566f, + 1.07778822f, 2.19172459f, 1.44013405f, 0.27222350f, 0.03173527f, -0.04691321f, 0.06376916f, 0.63907484f, -0.17949007f, 0.10010871f, -0.52495472f, -0.90729516f, -0.89428983f, -1.02410889f, -1.09546364f, -1.14404292f, + 0.76276530f, 1.59524592f, 1.47474021f, 0.18145014f, 0.13550913f, 0.88510912f, 1.03412929f, 1.01111065f, 0.77539585f, 0.20329499f, -1.35508663f, -1.83340559f, -1.40465488f, -1.14514789f, -1.16420913f, -1.15624650f, + -2.56605999f, -0.69575164f, 0.80693890f, 1.72778867f, 2.34339014f, 2.09042055f, 1.74382199f, 1.18476481f, 0.71416221f, 0.16808900f, -0.19808303f, -0.77842890f, -1.40866559f, -1.73499872f, -1.76586854f, -1.63151971f, + -0.32618212f, -2.76955063f, -2.78043449f, 0.51956703f, 4.34383806f, 1.88716237f, 4.47289205f, -0.68129863f, -1.52511041f, -1.32636741f, 0.65997777f, -0.52682311f, -0.69581956f, -0.43799624f, -0.50098243f, -0.31287245f, + 1.11744895f, 0.76474262f, 0.68913317f, 0.77356058f, 0.73021025f, 0.55480731f, 0.41334472f, 0.23384124f, 0.00040865f, -0.18384701f, -0.30336471f, -0.46628578f, -0.73968976f, -1.02792872f, -1.19473003f, -1.36165137f, + -1.09856438f, -2.65937422f, -2.23447552f, -2.36127808f, -1.92601400f, -1.29606162f, -0.86847602f, -0.41112389f, 0.27059515f, 0.62653494f, 1.25539083f, 2.16718498f, 2.40401093f, 1.97246907f, 1.87623832f, 2.28294385f, + -2.23812017f, -3.37112518f, -3.06489410f, -2.44639779f, -1.77205118f, -0.96847500f, 3.20788062f, 2.74986128f, 2.48376367f, 3.58855607f, 1.46558359f, 0.58208141f, 0.58647621f, -0.03336968f, -0.01161197f, -0.75815742f, + -3.34068874f, -3.31330139f, -3.27624195f, -3.18776773f, -2.60176738f, -1.35466356f, -0.47112724f, 0.80847853f, 1.80958348f, 2.21285031f, 2.26554713f, 2.76880679f, 2.60017886f, 2.04062204f, 1.67575322f, 1.36373732f, + 0.04677635f, 1.13691098f, 1.30914680f, 0.25672818f, 0.15799852f, 0.60568291f, 0.31771628f, 0.07597951f, -0.26589647f, -0.54972118f, -0.86844552f, -0.61094603f, -0.47072310f, -0.40511943f, -0.38309528f, -0.35299238f, + 0.22528620f, 0.31743905f, 0.31483553f, 0.17720192f, 0.16231355f, -0.06831057f, -0.29693139f, -0.45560458f, -0.21127731f, -0.08624191f, -0.20781580f, -0.12232125f, 0.08133224f, 0.09984234f, 0.03187445f, 0.03837752f, + 0.45404525f, 1.31244734f, 1.09193858f, 0.46595512f, 0.31516414f, -0.08250116f, -0.64154502f, -0.86897307f, -0.92275973f, -0.84086567f, -0.63886704f, -0.14652849f, 0.08165072f, 0.18249933f, 0.18288233f, 0.05545734f, + -2.78701578f, -2.31409561f, -1.68556203f, -1.40144529f, -0.74842449f, -0.07375189f, -0.20211385f, 0.09260002f, 0.29898930f, 0.66465229f, 0.75558861f, 0.96729187f, 1.14177838f, 1.55174084f, 1.99705535f, 1.74271247f, + -0.10464683f, -0.94242352f, -0.57955843f, 1.29762166f, 1.68516688f, 1.09852539f, 0.72099378f, 0.51323036f, -0.24285175f, -0.55888513f, -0.50577021f, -0.46366004f, -0.55836815f, -0.58550721f, -0.50078205f, -0.27308479f, + 3.45286440f, 0.59611628f, -0.69351346f, -1.14674518f, -1.07854543f, -0.89938730f, -0.76263547f, -0.52068670f, -0.36216337f, -0.17157688f, -0.01447939f, 0.15778389f, 0.27944020f, 0.35739675f, 0.34083744f, 0.46529411f, + -1.28927442f, 0.10726691f, 0.86158650f, 0.06273348f, -0.04085696f, 1.13928101f, 0.37886132f, 0.13576595f, -0.53530704f, -0.37566277f, -0.10613359f, -0.03059598f, -0.04857175f, -0.00612681f, 0.00516239f, -0.25812835f, + 2.89076531f, -0.04664344f, -1.93237643f, -2.19996964f, -1.86412035f, -1.18315371f, -1.10120931f, -1.31680378f, -1.30399765f, -1.28669610f, -0.94489947f, -0.60614659f, 1.58599312f, 0.95842154f, 2.94815038f, 5.40268579f, + 3.83455417f, 3.13869337f, 1.72510455f, 1.17236146f, 0.33356711f, 0.11348813f, -0.29704182f, -1.13829975f, -1.48383443f, -1.43388842f, -1.35163818f, -1.16938088f, -1.02627819f, -0.92590386f, -0.82058768f, -0.67091549f, + -0.93172509f, 0.85237993f, 1.34276319f, 0.25174685f, -0.79705618f, -0.63895111f, 0.21118680f, 0.97143052f, 0.70458966f, -0.18635616f, -0.52911893f, -1.85150883f, -0.43982599f, 0.04075634f, 0.50586277f, 0.49382650f, + -3.79516923f, -3.31533743f, -1.55672619f, 0.02918112f, 0.69887327f, 0.58481500f, 1.07030510f, 1.26562384f, 1.20349632f, 1.07269840f, 0.89773042f, 0.88137053f, 0.60964812f, 0.28884498f, 0.12262285f, -0.05797732f, + -0.08660073f, -3.36745835f, -3.82012977f, -2.75147711f, -0.36352096f, 0.85747874f, 1.11140604f, 0.65593665f, 0.35792228f, 0.54619342f, 0.99489751f, 1.28924616f, 0.96663509f, 1.40602119f, 1.12645860f, 1.07699149f, + 1.92634136f, 2.07569243f, 1.90024169f, 1.55333140f, 1.00662166f, 0.59662392f, 0.41735113f, 0.03712017f, -0.30033462f, -0.70147399f, -1.26150322f, -1.36946469f, -1.49306813f, -1.53593901f, -1.47859712f, -1.37294294f, + 0.41088895f, -0.68758389f, -0.85837881f, -0.86844724f, -0.85475992f, -0.88373397f, -0.82636157f, -0.54233624f, -0.33497780f, -0.06884329f, 0.24209832f, 0.60199869f, 0.83678079f, 1.05727685f, 1.27867768f, 1.49770152f, + -0.45442780f, -0.39381771f, -0.35575987f, -0.28279611f, -0.03460671f, 0.02188475f, -0.06207990f, -0.02068513f, 0.24104453f, 0.35743869f, 0.26392307f, 0.33209979f, 0.34550175f, 0.24362296f, 0.00439669f, -0.20573886f, + -1.38047831f, 0.78167658f, 0.42055729f, -0.93786054f, -1.72548724f, -1.52410071f, -0.47028251f, 0.81491117f, 0.82382622f, 0.46806997f, 0.95867097f, 0.52433344f, -0.02522016f, 0.39885676f, 0.61128096f, 0.26124617f, + 1.92925285f, 1.70790963f, 1.15526536f, 0.66461298f, 0.67490541f, 0.23892474f, -0.12861693f, -0.33635752f, -0.52286346f, -0.56868795f, -0.86695874f, -0.88842939f, -0.86631615f, -0.80495760f, -0.73812023f, -0.64956301f, + -0.46329214f, 0.55823622f, 0.34966614f, -0.14855330f, -0.35757896f, -0.52459469f, -0.85251369f, -0.95064429f, -0.99468342f, -0.76192580f, -0.41419015f, 0.12436151f, 0.64925405f, 1.13684199f, 1.33630964f, 1.31330685f, + 0.86356450f, 0.34381018f, -0.02085849f, 1.83539444f, 2.32518759f, 1.67398143f, 1.25867313f, 1.20615444f, 0.52697956f, -0.09144588f, -0.76159106f, -1.51187022f, -1.92351238f, -1.95050372f, -1.91438733f, -1.85957587f, + 1.24350337f, 2.40332737f, 1.88241131f, 1.35749721f, -0.42200494f, -1.44428015f, -1.39178301f, -0.93577948f, -0.61036359f, -0.51298915f, -0.79745508f, 0.00259692f, 0.20231677f, -0.31281818f, -0.31072767f, -0.35345154f, + -1.27391584f, 0.23665237f, 1.44085187f, 2.06602253f, 1.71605896f, 0.13376293f, -0.37509412f, 0.40922525f, 0.84118074f, 0.94717998f, -0.77859633f, -1.07717911f, -1.15385313f, -1.14774662f, -0.82654451f, -1.15800495f, + 1.30848084f, 0.08937934f, -0.37852967f, -0.65194579f, -0.75067573f, -0.79649158f, -0.77379985f, -0.60797455f, -0.51295495f, -0.32714998f, -0.08812522f, 0.24492207f, 0.48331843f, 0.72894883f, 0.89967800f, 1.13292004f, + -1.59837663f, -0.80221740f, -0.23176726f, 0.53351299f, 0.66646844f, 0.70631763f, 0.72180374f, 0.68847102f, 0.63073539f, 0.46683184f, 0.29870291f, 0.24285644f, -0.04345483f, -0.36903735f, -0.77735195f, -1.13349493f, + -3.27008180f, -3.34427840f, -3.19628867f, -2.98677397f, -2.40944350f, -1.63513906f, -1.40569428f, -0.88190894f, -0.25273952f, 0.84351501f, 1.96278949f, 2.92570176f, 3.17223429f, 3.47899460f, 3.70716828f, 3.29194486f, + 2.58466208f, 2.01534437f, 1.28252767f, 0.44865967f, -0.33100837f, -0.81011259f, -1.06701187f, -1.12743988f, -1.21505758f, -0.99337144f, -0.66853937f, -0.46093443f, -0.22132067f, 0.00996599f, 0.24481197f, 0.30882455f, + -0.62864502f, 1.04984327f, 1.56877053f, 0.77975000f, 0.01037804f, 0.92352492f, 1.12297462f, 0.76284403f, -0.16106015f, -0.21398417f, -0.62673537f, -1.68917053f, -1.60748063f, -0.79116243f, -0.06290217f, -0.43694470f +}; +const float ivas_sns_cdbk_tcx20_stage2[ 64 * 16 ] = { + -0.14487037f, 0.32346300f, 0.29798679f, -0.52393127f, -0.25671033f, 0.85717754f, -0.09030235f, -0.41110330f, -0.32938564f, -0.36580017f, -0.13142117f, -0.06404494f, 0.10671000f, 0.18731030f, 0.26606878f, 0.27885301f, + 0.52707061f, 0.35016312f, 0.54090507f, 0.82023896f, 0.46675870f, -0.60012182f, -0.76783382f, -0.39198749f, -0.17916696f, -0.17307722f, -0.10507731f, -0.09327542f, -0.12176361f, -0.12715624f, -0.11980175f, -0.02587481f, + -0.71420988f, -0.65927011f, -0.35007906f, -0.01478187f, 0.15375095f, 0.11149616f, 0.08819131f, 0.11537168f, 0.18041243f, 0.28846009f, 0.61920238f, 0.78709602f, 0.49945852f, -0.03863360f, -0.42339912f, -0.64306599f, + -0.81717379f, 0.06122156f, 0.05823003f, 0.10166328f, 0.27940347f, 0.24198679f, 0.13036228f, 0.07594383f, 0.21865219f, 0.19571948f, 0.11860502f, 0.04836758f, -0.03211315f, -0.14926357f, -0.23274285f, -0.29886216f, + -0.68529960f, -0.60305257f, -0.55080408f, -0.31252031f, 0.02732556f, 0.58303818f, 0.67638004f, 0.45008305f, 0.44400610f, 0.24064307f, 0.01598330f, -0.02342002f, -0.05864021f, -0.08903495f, -0.06326312f, -0.05142446f, + 0.89939472f, 0.31232066f, -0.27153630f, -0.52911639f, -0.58173141f, -0.63610440f, -0.61689761f, -0.43424024f, -0.23705022f, -0.00031150f, 0.15363335f, 0.19705513f, 0.25413198f, 0.35648787f, 0.53897823f, 0.59498626f, + 0.29798691f, 0.08114488f, 0.25286730f, -0.14155021f, -0.55163298f, -0.91534601f, -0.57551866f, 0.56064647f, 0.80731933f, -0.19474923f, -0.20126966f, 0.06517040f, 0.06866947f, 0.09059095f, 0.13444783f, 0.22122305f, + -0.19554741f, -1.08027678f, -0.01182563f, 0.56474090f, 0.41996725f, 0.08237738f, 0.08022205f, 0.10168343f, 0.06794579f, -0.08037661f, -0.20594204f, -0.13493371f, -0.05614077f, 0.03317273f, 0.14216415f, 0.27276933f, + -0.23050462f, -0.75246507f, -0.69868854f, -0.48346371f, -0.40917848f, -0.36594095f, -0.07600729f, 0.12198463f, 0.35806061f, 0.42664099f, 0.36253664f, 0.28721164f, 0.28501428f, 0.31580309f, 0.39290382f, 0.46609294f, + -0.67820482f, -0.00872112f, 0.40025028f, 0.70327670f, 0.42493234f, -0.57698003f, -0.97061329f, -0.62910745f, -0.24969320f, -0.09521511f, 0.04433478f, 0.16549806f, 0.17050527f, 0.26401941f, 0.52200672f, 0.51371134f, + 1.15515222f, -0.29885937f, -0.45759359f, -0.16519237f, -0.04117621f, -0.07252194f, -0.02430911f, -0.04766781f, -0.02328497f, -0.05048145f, -0.05153410f, -0.06528098f, -0.04522347f, -0.01163017f, 0.03517569f, 0.16442759f, + 1.26308471f, 0.47631737f, 0.20702857f, 0.04885555f, 0.01820924f, -0.04929548f, -0.00848071f, -0.02414509f, -0.04549576f, -0.16589601f, -0.22069993f, -0.30533811f, -0.30611208f, -0.31300078f, -0.32636395f, -0.24866742f, + -0.64451248f, -0.26649107f, 0.11640199f, 0.09050698f, -0.25875099f, -0.58989672f, -0.18201608f, 0.56293201f, 0.69520096f, 0.55973258f, 0.03137457f, -0.53909145f, -0.42689946f, 0.14106379f, 0.40632407f, 0.30412130f, + 0.15140746f, 0.14125954f, -0.08456824f, -0.13219101f, 0.06042009f, 0.33575532f, 0.35779441f, 0.19239547f, -0.11511443f, -0.41291307f, -0.06796502f, 0.62883409f, 0.54647417f, -0.03056743f, -0.64102233f, -0.92999908f, + -0.20214866f, 0.33358969f, 0.69126333f, 0.34454972f, 0.05105591f, 0.16949466f, 0.15791728f, -0.06633089f, -0.02155995f, 0.20242418f, 0.31712646f, 0.04823767f, -0.30694375f, -0.55917643f, -0.61612875f, -0.54337052f, + 0.11822897f, -0.04039421f, 0.70914148f, 0.55687588f, 0.06691609f, -0.01671241f, 0.38831368f, 0.48498674f, 0.23982281f, -0.11333950f, -0.44950589f, -0.59143612f, -0.55439378f, -0.42178388f, -0.28206333f, -0.09465644f, + -0.14336086f, 0.05638831f, -0.01441642f, -0.42382782f, -0.38698654f, 0.24817171f, 0.77752198f, 0.25906019f, -0.48986881f, -0.97798705f, -0.62796677f, 0.10790457f, 0.39301453f, 0.49075265f, 0.45648021f, 0.27511976f, + 0.57860103f, -0.01948333f, -0.01550826f, 0.52219942f, 0.68939814f, 0.35139876f, -0.01666617f, -0.21673535f, -0.47658403f, -0.68042929f, -0.65034996f, -0.34910948f, -0.19976833f, -0.03318456f, 0.13815711f, 0.37806438f, + 0.37246276f, -0.08878862f, -0.58662283f, -0.58539914f, -0.25552364f, 0.03268078f, 0.23525090f, 0.52779846f, 0.89804404f, 0.85582758f, 0.41881201f, -0.00512611f, -0.24135956f, -0.44973199f, -0.57601809f, -0.55230687f, + -0.32189259f, -0.20721675f, -0.09742343f, -0.05501794f, -0.02597120f, -0.10341441f, -0.07152803f, 0.00321003f, 0.14348106f, 0.13459909f, 0.13417173f, 0.08360042f, 0.09862647f, 0.09372765f, 0.07551569f, 0.11553216f, + 0.23782332f, 0.49257946f, 0.16314649f, -0.21082378f, -0.15908458f, 0.19948076f, 0.80829724f, 0.74048420f, 0.31470714f, -0.11736674f, -0.41702302f, -0.38958905f, -0.30642209f, -0.41287171f, -0.48993898f, -0.45339847f, + -0.64636094f, -0.04385833f, 0.14399510f, -0.43842603f, -0.73607781f, -0.26594508f, 0.62882301f, 0.35001150f, 0.28828962f, 0.02070640f, 0.04274640f, 0.10066767f, 0.01277906f, 0.02855391f, 0.23224313f, 0.28185233f, + 0.47046627f, 0.94887935f, 0.24713839f, -0.23737461f, -0.23876072f, -0.07439994f, -0.09495447f, -0.13384673f, -0.10919962f, 0.11561096f, 0.34750397f, 0.22863541f, -0.07880257f, -0.39830725f, -0.49574485f, -0.49684374f, + -0.40909559f, -0.18655327f, 0.13106838f, 0.38799987f, 0.49861722f, 0.83281701f, 0.69114756f, 0.20069371f, -0.12792677f, -0.35587040f, -0.42614275f, -0.34440943f, -0.28876141f, -0.27425834f, -0.22103645f, -0.10828931f, + -1.18999475f, -0.19958884f, -0.14983643f, 0.01470880f, -0.02795637f, -0.14641321f, -0.31784893f, -0.46245588f, -0.18208072f, 0.19701783f, 0.59261157f, 0.51921614f, 0.35016513f, 0.38054069f, 0.38692917f, 0.23498570f, + 0.09958109f, -0.26177154f, -0.09010091f, 0.31898761f, 0.75461690f, 0.12276914f, -0.81281416f, -0.78184322f, -0.24358470f, 0.82758568f, 0.36579631f, -0.14176577f, -0.08975069f, -0.12652615f, 0.12350150f, -0.06468093f, + 0.08899403f, -0.19355344f, -0.19424186f, -0.07670148f, -0.01129831f, -0.12185644f, -0.22497393f, -0.43014230f, -0.38336267f, -0.26093033f, -0.06975312f, 0.14762185f, 0.34014822f, 0.41134546f, 0.45027987f, 0.52842445f, + 0.21499436f, 0.50168679f, 0.45504898f, 0.25411634f, -0.47901658f, -0.45717782f, -0.14093183f, 0.17265389f, 0.11115764f, -0.41915721f, -0.31922857f, 0.22345448f, 0.48226916f, 0.07143490f, -0.26830399f, -0.40300051f, + 0.12687524f, 0.05171471f, -0.07690770f, 0.26252085f, 0.27712144f, 0.23952572f, 0.03309903f, 0.01500629f, 0.06484326f, 0.06571283f, -0.16817282f, -0.63246792f, -0.98935090f, -0.44804742f, 0.39837118f, 0.78015619f, + -0.27518648f, -0.48420415f, -0.24141667f, 0.57134912f, 0.65714603f, 0.42293616f, -0.10408493f, -0.38791089f, -0.61076554f, -0.57292363f, -0.09457207f, 0.54285737f, 0.61562883f, 0.23132651f, -0.13569709f, -0.13448269f, + -0.44830103f, 0.90540056f, 0.00072142f, -0.39226111f, -0.46186317f, -0.43645456f, -0.37826714f, -0.24360826f, -0.04123674f, 0.14260549f, 0.22801709f, 0.22668095f, 0.21516528f, 0.17002730f, 0.24853909f, 0.26483493f, + 0.82582984f, -0.18396730f, -0.69977925f, -0.51672827f, 0.33935958f, 1.15275754f, 0.74107352f, 0.01951258f, -0.25558033f, -0.43304939f, -0.34099848f, -0.20947442f, -0.14398117f, -0.10182217f, -0.18238069f, -0.01077166f, + -0.05956926f, -0.06776164f, 0.03443600f, -0.24779379f, -0.39446507f, 0.19355305f, 0.85153169f, -0.02976018f, -0.70253585f, 0.23290277f, 0.42513902f, -0.02301892f, -0.00892405f, -0.00056059f, -0.02586520f, -0.17730813f, + -0.10475355f, -0.12240226f, 0.23596905f, 0.84034179f, 1.10352903f, -0.04380181f, -0.55005573f, -0.07517667f, 0.38548284f, 0.23177362f, -0.44010180f, -0.37858708f, -0.16160512f, -0.18482124f, -0.37409253f, -0.36169852f, + -0.66969186f, 0.05371874f, -0.03936352f, -0.29928720f, -0.41624260f, -0.41299981f, -0.08577629f, 0.31675281f, 0.52331795f, 0.62411866f, 0.60734652f, 0.31853824f, 0.22382100f, -0.00426635f, -0.24809569f, -0.49189053f, + 0.42558925f, -0.08740923f, -0.12413315f, 0.07160194f, 0.21621681f, 0.18737853f, 0.20692231f, 0.06594840f, 0.06316038f, -0.01455973f, -0.09736051f, -0.19278266f, -0.20576965f, -0.20479396f, -0.19511934f, -0.11488934f, + 0.36293062f, -0.57831316f, -0.52476107f, -0.18291608f, 0.05956296f, 0.17827873f, 0.56052629f, 0.90619512f, 0.33375509f, -0.31016948f, -0.35518802f, -0.18057272f, -0.07051228f, -0.11858827f, -0.10671145f, 0.02648366f, + -0.47233802f, -0.10696118f, -0.17385597f, -0.31283671f, -0.54242892f, -0.48720345f, -0.41705631f, -0.17742297f, 0.04283104f, -0.05195671f, -0.10468624f, -0.03852503f, 0.06812391f, 0.59475499f, 1.17499043f, 1.00457125f, + 0.33658160f, 0.35011487f, 0.45187233f, -0.02492518f, -0.55350758f, -0.59303580f, -0.31109052f, 0.13779098f, 0.55888251f, 0.84708841f, 0.47270673f, -0.43127783f, -0.54032183f, -0.34904867f, -0.17752966f, -0.17430036f, + 0.44845114f, -0.49717161f, -0.47780018f, 0.51116217f, 0.25239415f, -0.46774617f, -0.37660723f, -0.11699702f, 0.09542037f, -0.01250943f, 0.20050057f, 0.40176439f, 0.32380431f, 0.15297561f, -0.14232876f, -0.29531216f, + 0.58997624f, 0.33423174f, -0.49272429f, -0.77991590f, -0.63691990f, -0.16375248f, 0.20892044f, 0.18843065f, 0.17599488f, 0.14061586f, 0.15322675f, 0.18367503f, 0.13457790f, 0.01264192f, -0.03498125f, -0.01399761f, + 0.11883889f, -0.17653462f, -0.07102121f, -0.16170325f, -0.31396815f, -0.45007863f, -0.66549732f, -0.56194237f, -0.04368741f, 0.74826150f, 1.05944395f, 0.45896665f, 0.13555009f, 0.05510292f, 0.02009383f, -0.15182464f, + 0.07240272f, -0.58533213f, -0.60637060f, -0.30890106f, -0.02128210f, 0.09681284f, 0.16938452f, 0.09862013f, 0.19046479f, 0.19100352f, 0.26416808f, 0.26993362f, 0.23648423f, 0.09763257f, -0.04637479f, -0.11864633f, + 1.00841842f, 0.48487093f, -0.06341281f, -0.08270476f, 0.05744570f, 0.01750478f, -0.34725114f, -0.56805040f, -0.46574885f, -0.30005483f, -0.09520550f, 0.06924440f, 0.18895007f, 0.12019539f, -0.01497133f, -0.00923003f, + -0.11951983f, -0.09981565f, -0.02725746f, -0.30082482f, 0.20230754f, 0.13666509f, -0.43246623f, 0.35244293f, 0.18119722f, 1.02992782f, -0.88125774f, 0.02331986f, 0.31122766f, -0.27229286f, 0.03194423f, -0.13559793f, + 0.30038871f, 0.08947897f, -0.39317595f, -0.46247446f, -0.42411556f, -0.42404287f, -0.31600225f, -0.23970776f, -0.22563637f, -0.14999339f, 0.24040805f, 0.88216954f, 0.90562440f, 0.49896646f, -0.00532430f, -0.27656328f, + -1.03852817f, -0.43685628f, 0.97570249f, 0.40073542f, -0.16567993f, -0.21536660f, 0.12504130f, 0.05185039f, 0.10097880f, 0.11493671f, 0.11604106f, 0.09278894f, 0.06924125f, -0.04393053f, -0.08352009f, -0.06343456f, + 0.63612744f, 0.65518210f, 0.45922163f, 0.32046049f, 0.42927283f, 0.43905062f, 0.21015594f, -0.14220340f, -0.37678678f, -0.46507109f, -0.45569496f, -0.37686899f, -0.32849396f, -0.33044372f, -0.35635326f, -0.31755504f, + 0.41636915f, 0.62005731f, 0.06636205f, -0.59228655f, 0.33311937f, 0.75787668f, 0.00941011f, -0.45161756f, -0.65103077f, -1.10958672f, -1.02188609f, -0.67703448f, 0.33622739f, 1.61684726f, 0.14432118f, 0.20285196f, + -0.54161629f, 0.29651460f, 0.48390239f, 0.54479388f, 0.45539891f, 0.27213590f, -0.06343843f, -0.24873747f, -0.31972562f, -0.38332671f, -0.30589718f, -0.21560606f, -0.11351916f, -0.04853252f, 0.04142231f, 0.14623145f, + -0.21538006f, -0.50670918f, -0.02385513f, 0.35315677f, 0.10824776f, 0.03860134f, 0.48712274f, 0.49283326f, 0.39503514f, 0.30292369f, 0.35920722f, 0.11075640f, -0.28306221f, -0.52442456f, -0.56662428f, -0.52782887f, + 0.24246654f, 0.15496835f, 0.07742345f, -0.00816546f, -0.02214009f, -0.12207666f, -0.09321134f, -0.14020839f, -0.02096415f, 0.02403039f, -0.00227972f, -0.07257466f, -0.06385085f, -0.03120190f, -0.01017645f, 0.08796095f, + 0.55718201f, 0.39817200f, 0.01585643f, -0.42726280f, -0.49946467f, -0.23926890f, 0.12647764f, 0.16539668f, -0.09322228f, -0.28903514f, -0.36248464f, -0.37621498f, -0.21830881f, 0.12546719f, 0.47757747f, 0.63913280f, + 0.07202509f, -0.30917825f, 0.26796130f, 0.18122649f, -0.74238320f, -0.65070972f, 0.20487278f, -0.03910861f, -0.13788223f, -0.13927704f, 0.30951126f, 0.22564689f, 0.18217460f, 0.23128586f, 0.20552209f, 0.13831273f, + 0.81154454f, 0.16848402f, -0.17973760f, -0.10712113f, -0.08562767f, -0.33154566f, -0.24733460f, -0.19259111f, 0.09705231f, 0.36926093f, 0.39058223f, 0.34681425f, 0.16685070f, -0.13716590f, -0.45775544f, -0.61170978f, + -1.33280729f, -0.16122649f, -0.09275794f, 0.58345947f, 0.61239977f, 0.50766167f, 0.06032890f, 0.13414746f, 0.18885722f, 0.13865434f, 0.23772269f, -0.25267260f, -0.54709895f, -0.31230173f, 0.07737009f, 0.15826345f, + -1.08561454f, -0.71787872f, -0.33522393f, 0.09636394f, 0.26521236f, 0.37639836f, 0.31311513f, 0.09537412f, -0.07885832f, -0.23990515f, -0.16502660f, 0.10895014f, 0.26463981f, 0.29732376f, 0.35578048f, 0.44934924f, + -0.29274363f, 0.08361693f, 0.01766194f, -0.22807328f, -0.16950675f, 0.28608384f, 0.00299181f, 0.07025513f, -0.20633117f, 0.48438844f, 0.91263549f, 0.04231580f, -0.66916627f, -0.44689801f, 0.06041835f, 0.05235140f, + 0.18067823f, -0.43833102f, -0.91255750f, -0.38799121f, 0.28155095f, 0.40506215f, 0.07352559f, -0.10582149f, -0.13688260f, -0.20626464f, -0.13280234f, -0.02533342f, 0.03247104f, 0.20876704f, 0.46466759f, 0.69926172f, + 0.51511088f, 0.81421556f, 0.82445640f, 0.01131859f, -0.32041051f, -0.39839079f, -0.43152495f, -0.42594915f, -0.41684800f, -0.38010709f, -0.25091606f, -0.15334343f, -0.03594408f, 0.06862608f, 0.21814936f, 0.36155722f, + -0.74835512f, -0.03907167f, -0.02730968f, 0.01017743f, 0.06598847f, 0.36210429f, 0.29611340f, 0.34006521f, 0.09628113f, -0.15142368f, -0.62878543f, -0.79996695f, -0.45331571f, 0.20593004f, 0.80186308f, 0.66970511f, + -0.25432502f, 0.38418428f, 0.43145928f, 0.30498956f, 0.19189249f, -0.25021553f, -0.53882666f, -0.61584834f, -0.43654724f, -0.03402395f, 0.45760398f, 0.60327277f, 0.53610474f, 0.16098234f, -0.30297334f, -0.63772932f, + -0.42321919f, 0.85086362f, 0.60159420f, 0.08633772f, -0.28445894f, -0.22512885f, 0.23909004f, 0.20046697f, 0.01484137f, -0.11652413f, -0.12017169f, -0.26922922f, -0.26311675f, -0.18921524f, -0.06712212f, -0.03500777f, + 0.58209071f, -0.26533411f, -0.20240535f, 0.27577532f, 0.65478295f, 0.66491349f, 0.41026256f, 0.22123940f, 0.15813271f, 0.07048989f, -0.03133192f, -0.19389440f, -0.34519672f, -0.53017394f, -0.73238212f, -0.73696843f +}; +const float ivas_sns_cdbk_tcx20_stage3[ 32 * 16 ] = { + -0.08443224f, -0.18703635f, -0.02297765f, 0.35108322f, -0.47365404f, 0.60080101f, -0.14560352f, 0.01413276f, 0.01222370f, 0.01369841f, 0.05509108f, 0.03233707f, 0.01187713f, -0.08225931f, -0.08910713f, -0.00617424f, + -0.45134081f, -0.18205893f, -0.21886586f, -0.27082278f, -0.18872267f, -0.08438255f, 0.11808124f, 0.11472340f, 0.08049694f, 0.05868671f, 0.08856118f, 0.10686811f, 0.14792971f, 0.16522330f, 0.21823435f, 0.29738868f, + -0.11328915f, 0.10130429f, -0.14943437f, 0.15645630f, 0.63935450f, 0.37821704f, -0.21310801f, -0.24867988f, -0.01659672f, 0.03328198f, -0.08180066f, -0.05657044f, 0.10906149f, 0.03196869f, -0.22137928f, -0.34878580f, + 0.05458665f, -0.05919364f, -0.13460386f, 0.10683925f, 0.02486665f, -0.03996090f, -0.07800776f, -0.00646458f, -0.21155480f, -0.27387617f, 0.02240932f, 0.70908553f, -0.66258796f, -0.11916859f, 0.46104817f, 0.20658280f, + -0.18236160f, -0.42556974f, -0.01518583f, 0.40249814f, 0.16028064f, -0.31751965f, -0.32775039f, -0.07115151f, 0.14131570f, 0.25092515f, 0.30150209f, 0.11921413f, 0.03049898f, 0.00963513f, -0.00838672f, -0.06794450f, + 0.43233298f, 0.11411029f, -0.14415844f, -0.34176452f, -0.41588457f, -0.29962161f, 0.10637969f, 0.23407196f, 0.10305969f, -0.00062410f, 0.02900924f, 0.03866877f, 0.08640844f, 0.05154612f, 0.00161694f, 0.00484903f, + -0.21512794f, 0.25425865f, 0.27105566f, -0.05213586f, -0.05906940f, -0.26548344f, -0.44413633f, 0.03920286f, 0.46845996f, 0.41236263f, -0.31903770f, -0.32961136f, 0.22647316f, 0.19335126f, -0.03700087f, -0.14356117f, + 0.21924285f, -0.02083234f, -0.21264229f, -0.32008443f, 0.85787441f, -0.31109029f, -0.11710511f, 0.15258065f, -0.05422604f, 0.04703640f, 0.03138786f, 0.00284139f, -0.14128648f, -0.12246651f, -0.12553053f, 0.11430042f, + -0.06983219f, 0.15566395f, 0.00257636f, -0.43107600f, -0.19146497f, 0.19866667f, 0.23130140f, -0.15042179f, -0.31509935f, -0.19492938f, 0.13173040f, 0.34976123f, 0.35522809f, 0.15128504f, -0.03897684f, -0.18441264f, + 0.03835343f, -0.41781092f, -0.09130119f, 0.23649600f, 0.31864720f, 0.31965077f, 0.31997092f, 0.09379415f, -0.07805132f, -0.17350540f, -0.16066354f, -0.15534991f, -0.10595695f, -0.07769963f, -0.06267573f, -0.00389790f, + -0.06072967f, -0.08529762f, -0.25895528f, -0.11410745f, -0.03994694f, 0.00520744f, 0.13029546f, 0.20924505f, 0.20033325f, 0.00128218f, -0.48912530f, -0.29001748f, 0.59798769f, 0.57708579f, -0.00334114f, -0.37991599f, + 0.67709987f, 0.24479940f, 0.09839041f, 0.09240624f, 0.04874621f, -0.07903978f, -0.10677716f, -0.20070119f, -0.12618873f, -0.06680438f, -0.05551493f, -0.11559282f, -0.11011740f, -0.12021879f, -0.12904082f, -0.05144612f, + -0.24390844f, -0.02971498f, 0.26491058f, 0.32477805f, 0.15268137f, -0.03230336f, -0.09305650f, -0.07114758f, -0.26964124f, -0.44939594f, -0.31245133f, 0.05828219f, 0.30712838f, 0.31280972f, 0.10713241f, -0.02610336f, + 0.19735739f, -0.09060264f, 0.00825537f, -0.36599055f, 0.05585799f, 0.37908316f, -0.38413173f, 0.35027949f, 0.34555851f, -0.34241207f, -0.18091006f, 0.16295794f, 0.08399265f, -0.12258257f, -0.08886776f, -0.00784505f, + 0.18552089f, -0.05448505f, -0.06090343f, 0.28995307f, -0.00222442f, -0.38233148f, -0.18031475f, 0.21268787f, 0.02073848f, -0.18932508f, -0.18523794f, -0.18812600f, -0.12671694f, 0.01228197f, 0.22055935f, 0.42792350f, + 0.12799222f, 0.22968936f, 0.03802711f, -0.14099927f, -0.08635323f, 0.16987494f, 0.35348472f, 0.04505467f, -0.26388915f, -0.34916901f, -0.22942166f, -0.17684250f, -0.08724829f, -0.00054213f, 0.12610262f, 0.24423959f, + -0.08038187f, -0.16879152f, -0.00176772f, 0.35376535f, -0.37011098f, -0.36320739f, 0.66636341f, -0.06773157f, -0.07814045f, -0.04765960f, -0.03365673f, 0.02181851f, 0.03254002f, 0.03483427f, 0.02717800f, 0.07494827f, + -0.34868864f, 0.17040333f, 0.25260784f, 0.10076787f, 0.06839398f, -0.02800665f, -0.06848675f, -0.16826923f, -0.07268923f, 0.01087754f, 0.05460110f, 0.00431011f, 0.03885215f, 0.00975901f, -0.01527130f, -0.00916121f, + 0.18571700f, 0.08336153f, 0.02979922f, -0.39409904f, -0.12098272f, 0.43026379f, -0.26722488f, -0.41282119f, 0.02970150f, 0.49897713f, 0.10843837f, -0.24094187f, -0.08115504f, 0.00006204f, 0.10433840f, 0.04656578f, + 0.00538329f, -0.07750994f, -0.10910098f, 0.04048538f, 0.03334399f, 0.28342260f, 0.14581840f, -0.24746813f, -0.34416074f, 0.06151045f, 0.68745611f, 0.19063398f, -0.23771814f, -0.28316033f, -0.12688702f, -0.02204889f, + -0.60521242f, -0.06124017f, 0.11564466f, 0.07475615f, 0.11824730f, 0.14189819f, 0.27204580f, 0.27978428f, 0.25196977f, 0.13866750f, 0.00205101f, -0.10150602f, -0.11644945f, -0.18929950f, -0.17648802f, -0.14486907f, + 0.06856566f, -0.13844197f, -0.26691240f, -0.18845012f, -0.05126065f, 0.00304429f, 0.11414309f, 0.06950182f, 0.19286717f, 0.29037166f, 0.27053650f, 0.17652627f, 0.09171994f, -0.09001258f, -0.24528745f, -0.29691120f, + -0.13004111f, 0.35130055f, 0.29363124f, -0.18853208f, -0.39468716f, -0.19791109f, -0.04383464f, 0.00894901f, 0.12616722f, 0.23070746f, 0.26441755f, 0.01948829f, -0.23089364f, -0.30363455f, -0.02382649f, 0.21869951f, + 0.11164215f, 0.03116967f, -0.06353187f, 0.16924336f, -0.01461062f, -0.19152070f, 0.03686445f, 0.20477538f, -0.03967336f, -0.32744743f, -0.17088429f, 0.63829176f, 0.35280729f, -0.43549735f, -0.27277762f, -0.02885087f, + -0.30725406f, 0.74701729f, -0.39274145f, 0.04302180f, 0.07483049f, -0.03413902f, 0.09344659f, 0.09169015f, 0.04345559f, -0.04477331f, -0.00176985f, -0.03585142f, -0.03405962f, -0.07575575f, -0.09739054f, -0.06972689f, + 0.28265268f, -0.39222951f, -0.42695953f, -0.10897533f, 0.07424889f, 0.08797478f, 0.00908971f, -0.13637855f, -0.12075776f, -0.04977985f, 0.06395383f, 0.09442120f, 0.15174794f, 0.13939497f, 0.13041070f, 0.20118587f, + -0.06637296f, 0.10778732f, -0.07433513f, -0.03524749f, -0.17212396f, -0.11995773f, 0.04291853f, -0.06480863f, -0.07793575f, 0.16559639f, 0.16476497f, -0.45667097f, -0.18714125f, 0.71725922f, 0.42534599f, -0.36907862f, + 0.15419735f, 0.13519411f, 0.37767798f, 0.23431801f, -0.02281061f, -0.05079690f, 0.14170781f, 0.09854410f, 0.01337290f, -0.01979078f, -0.01296254f, -0.03126860f, -0.07566643f, -0.16863998f, -0.32784959f, -0.44522679f, + -0.24074183f, 0.08320241f, 0.21818929f, 0.23760260f, 0.19352113f, 0.17458723f, -0.14563963f, -0.24861723f, -0.22656746f, -0.05362363f, 0.00368164f, -0.25389215f, -0.34172497f, -0.16702059f, 0.23332537f, 0.53371777f, + 0.03933551f, -0.61436501f, 0.74997308f, -0.14605678f, -0.06355008f, -0.07845237f, 0.03677743f, -0.01381658f, 0.03542562f, 0.01940321f, 0.04277388f, 0.01439240f, 0.05417023f, -0.03165523f, -0.04388511f, -0.00047013f, + 0.19660049f, -0.03582845f, -0.21224511f, -0.09633821f, 0.02140122f, 0.06690902f, 0.14753796f, 0.23491232f, 0.40075372f, 0.33318442f, -0.21453422f, -0.44835823f, -0.31995723f, -0.14770359f, -0.02720588f, 0.10087175f, + 0.22313452f, 0.23174662f, 0.13588360f, -0.01979092f, -0.17483898f, -0.36387601f, -0.35104947f, -0.34545228f, -0.17072761f, 0.01654692f, 0.12560464f, 0.14070090f, 0.18025650f, 0.13082045f, 0.10588357f, 0.13515746f +}; +const float ivas_sns_cdbk_tcx20_stage4[ 32 * 16 ] = { + -0.01178932f, -0.08216325f, 0.00009975f, 0.07861932f, 0.10639093f, 0.10607783f, -0.11972309f, 0.01910820f, -0.05635505f, 0.02765448f, -0.08840101f, -0.09623400f, 0.34917350f, -0.19835894f, -0.46938213f, 0.43528268f, + -0.08636054f, 0.13923351f, -0.15932705f, -0.10849641f, -0.02303533f, -0.23968519f, -0.02192257f, 0.50128910f, 0.27139459f, -0.07262939f, -0.06622134f, -0.01073419f, -0.04308095f, -0.05629457f, -0.03175020f, 0.00762044f, + 0.24815560f, 0.14657944f, 0.07172491f, 0.02302382f, 0.01991109f, -0.10204469f, -0.24960876f, -0.07085594f, 0.12223419f, 0.06999865f, 0.10986748f, 0.13492392f, 0.05865008f, -0.10366906f, -0.23987720f, -0.23901358f, + -0.15438243f, -0.04559005f, 0.16760111f, 0.26289859f, 0.24002732f, 0.06333052f, -0.04293731f, 0.16191749f, 0.12993586f, -0.15916904f, -0.24049436f, -0.13688115f, -0.13764233f, -0.11140102f, -0.01899323f, 0.02178000f, + -0.09362153f, -0.06475772f, -0.01949932f, -0.04249530f, -0.05109865f, 0.07410551f, -0.01006480f, 0.04753318f, -0.02781557f, 0.07745214f, 0.06146913f, -0.16546467f, -0.41512457f, 0.10097607f, 0.66727071f, -0.13886467f, + -0.07368760f, 0.36035427f, 0.21605884f, -0.01438276f, -0.11360433f, -0.05644934f, 0.03063785f, -0.05006328f, -0.07521149f, -0.13595728f, -0.01277458f, 0.04492285f, 0.01200858f, -0.04176021f, -0.04570247f, -0.04438907f, + 0.09516185f, -0.01929782f, 0.00494854f, -0.09763747f, -0.07344490f, 0.12994610f, 0.48094184f, -0.48192847f, -0.05573409f, 0.26426544f, -0.27655157f, -0.08642901f, 0.08435032f, 0.13304512f, -0.05782422f, -0.04381160f, + -0.09313450f, 0.05540574f, 0.01201341f, -0.06726039f, -0.10451812f, 0.02669040f, -0.05484815f, 0.07449424f, -0.34344135f, 0.56109258f, -0.27428709f, -0.09301413f, 0.41965904f, -0.13902794f, 0.18473846f, -0.16456202f, + 0.08693855f, 0.01453042f, -0.11107078f, 0.06241724f, 0.10204906f, -0.07064796f, -0.13846291f, 0.08293345f, -0.10757619f, -0.22863306f, 0.03213009f, 0.19644778f, 0.16452805f, 0.34110370f, 0.09006750f, -0.51675482f, + -0.18423905f, 0.01384230f, 0.26714303f, -0.40934167f, 0.39275996f, -0.01237613f, -0.25919307f, -0.08619564f, -0.04046283f, -0.01126873f, -0.01664395f, 0.01744563f, 0.10282249f, 0.09607820f, 0.04998616f, 0.07964328f, + -0.02274322f, 0.17908332f, -0.02788687f, 0.00807798f, -0.14435131f, -0.02676761f, 0.10369709f, -0.23851723f, 0.57714821f, -0.24897036f, -0.18048434f, 0.02001729f, -0.12740088f, -0.09982727f, 0.00840552f, 0.22051971f, + 0.13771932f, -0.17471600f, 0.18563016f, 0.18284665f, 0.11307352f, 0.20075992f, -0.03584593f, -0.25044388f, -0.20529947f, -0.11730357f, 0.05388263f, 0.08544750f, 0.04416102f, -0.02585125f, -0.09278592f, -0.10127474f, + 0.08834726f, 0.11313223f, -0.16483942f, -0.28318232f, -0.23943962f, -0.10440104f, -0.03978272f, -0.07375089f, -0.00562577f, 0.02329676f, 0.14600550f, 0.17681015f, 0.14410817f, 0.09264978f, 0.05695417f, 0.06971767f, + 0.14265864f, -0.42999794f, -0.17884255f, -0.08097949f, -0.04680661f, -0.04620171f, 0.02411542f, 0.04266824f, 0.15894248f, 0.24773695f, 0.15192868f, -0.01414995f, -0.13102813f, -0.07567236f, 0.04332535f, 0.19230306f, + -0.21142675f, -0.18455704f, -0.13706857f, -0.09760966f, -0.00844340f, 0.14865602f, 0.20607338f, 0.12012844f, -0.00914924f, -0.14368559f, -0.00265126f, 0.10043210f, 0.09154737f, 0.03443178f, 0.02422327f, 0.06909914f, + 0.18450361f, 0.00435351f, 0.27864126f, 0.17704943f, -0.20479796f, -0.29862599f, -0.17089168f, -0.09881143f, 0.04783000f, 0.14260548f, -0.02349078f, -0.20487241f, -0.13745683f, 0.05546335f, 0.10019847f, 0.14830206f, + 0.10317471f, -0.16998911f, 0.09734737f, 0.06796242f, -0.01161580f, -0.18371589f, -0.08936939f, 0.07107444f, -0.09565406f, -0.23557438f, 0.42834066f, 0.31175412f, -0.11511657f, -0.28572113f, -0.06889545f, 0.17599802f, + 0.11312034f, 0.08666296f, 0.02086535f, 0.12656018f, -0.12520471f, 0.04702581f, 0.39113807f, 0.09775371f, -0.00094471f, 0.08191930f, 0.07626151f, -0.13554986f, -0.29383511f, -0.25857022f, -0.15738811f, -0.06981449f, + 0.07590872f, 0.10290609f, -0.14618577f, 0.13491216f, 0.33869686f, -0.04072549f, -0.30046897f, -0.07243681f, 0.07180300f, 0.23060158f, 0.21642544f, -0.13575731f, -0.31781641f, -0.19431392f, -0.02233810f, 0.05878895f, + -0.11105764f, -0.05437616f, -0.00379085f, 0.08951467f, 0.39169243f, -0.38233560f, 0.34492699f, -0.09947370f, -0.08648526f, -0.03340088f, -0.02593483f, 0.11572014f, 0.01899877f, -0.03965890f, -0.06421047f, -0.06012863f, + -0.01630162f, 0.17784241f, -0.29989778f, 0.10469439f, 0.14861228f, -0.00722859f, -0.10711587f, -0.18435390f, -0.22539717f, -0.21441284f, 0.00336383f, 0.04362196f, 0.03914130f, 0.10650815f, 0.16959322f, 0.26133027f, + -0.45700261f, 0.07282251f, 0.00944859f, 0.03968330f, -0.02457975f, 0.11148291f, -0.02109853f, -0.18417192f, 0.02503845f, 0.10733751f, 0.21565042f, 0.09727523f, 0.00466877f, -0.01572810f, -0.00245341f, 0.02162664f, + 0.01471341f, -0.09796256f, 0.37685840f, -0.27373841f, -0.22809280f, 0.20207443f, 0.12508033f, 0.16172866f, 0.15442152f, -0.03971152f, -0.03731565f, 0.04320052f, -0.02493079f, -0.08894232f, -0.13155708f, -0.15582618f, + -0.04063466f, 0.14873431f, 0.10076527f, -0.09442471f, 0.02133939f, -0.04747602f, 0.02176493f, 0.52606315f, -0.60183613f, -0.05056878f, 0.18858100f, -0.00936749f, -0.17007143f, -0.00822640f, 0.01473704f, 0.00062041f, + -0.01851982f, 0.07661957f, -0.30452796f, 0.64817852f, -0.21819667f, -0.15094971f, -0.02014064f, 0.04976562f, 0.03988913f, 0.00229505f, -0.01596447f, -0.00497683f, 0.01888521f, 0.00912230f, -0.04741494f, -0.06406442f, + -0.18646693f, -0.25658854f, 0.20567339f, 0.06671960f, -0.24836724f, -0.23737029f, 0.03275858f, 0.09293590f, 0.06861982f, 0.01487215f, 0.10808605f, 0.17546010f, 0.16832370f, 0.12557457f, -0.00949461f, -0.12073619f, + -0.08559046f, -0.16350668f, -0.28729498f, 0.01179878f, 0.06195939f, 0.06121501f, -0.29667937f, -0.19145944f, 0.41150010f, 0.18707789f, -0.21406932f, 0.19248440f, 0.16889573f, 0.10825101f, 0.07412737f, -0.03870938f, + 0.00652202f, -0.15316918f, 0.25343593f, -0.09299964f, -0.22861167f, 0.06865193f, 0.02064443f, -0.10488496f, -0.18017250f, -0.21898191f, -0.08742146f, 0.02608617f, 0.05046582f, 0.08687786f, 0.21515984f, 0.33839723f, + 0.12533507f, 0.27191291f, 0.06056226f, -0.10872799f, 0.01799135f, 0.17589055f, -0.05514906f, -0.01148984f, 0.01373578f, -0.08944541f, -0.35717808f, -0.38014180f, 0.05531840f, 0.30742910f, 0.08016039f, -0.10620357f, + -0.01190022f, -0.24441497f, -0.07461266f, 0.02317252f, 0.05704737f, 0.16442883f, 0.06955004f, 0.05748732f, 0.05251523f, 0.22879327f, 0.21860705f, -0.37376474f, 0.03987437f, 0.33071525f, -0.23228300f, -0.30521565f, + -0.00581916f, 0.24592784f, -0.27266538f, -0.28914327f, 0.09129356f, 0.42079957f, 0.05815983f, 0.01136363f, 0.03980200f, -0.04215296f, 0.01465284f, 0.03859289f, -0.13354970f, -0.16935580f, -0.05814064f, 0.05023468f, + 0.44241891f, -0.06885632f, -0.14130761f, -0.04771012f, -0.00863562f, 0.00586591f, 0.12381405f, 0.08059256f, -0.06764947f, -0.22513354f, -0.10536820f, 0.02669478f, 0.01147300f, -0.01584685f, -0.02845628f, 0.01810479f +}; + +const float *const ivas_sns_cdbks_tcx20[SNS_MSVQ_NSTAGES_TCX20] = { ivas_sns_cdbk_tcx20_stage1, ivas_sns_cdbk_tcx20_stage2, ivas_sns_cdbk_tcx20_stage3, ivas_sns_cdbk_tcx20_stage4 }; + +const float ivas_sns_means_tcx20[M] = { + 0.9155f , 1.2408f , 1.0050f , 0.5846f, + 0.2472f , 0.1902f , 0.0984f , 0.1039f, + -0.0139f , -0.0856f , -0.4157f , -0.6148f, + -0.7026f , -0.7216f , -0.8052f , -1.0262f +}; + +const int16_t ivas_sns_cdbks_tcx10_levels[SNS_MSVQ_NSTAGES_TCX10] = { 128, 32, 8 }; +const int16_t ivas_sns_cdbks_tcx10_bits[SNS_MSVQ_NSTAGES_TCX10] = { 7, 5, 3 }; + +const float ivas_sns_cdbk_tcx10_stage1[ 128 * 16 ] = { + 0.06343891f, -0.00651786f, -0.56994713f, -0.98772396f, -1.35099293f, -1.24848646f, -1.20301995f, -0.81089507f, -0.06563095f, 1.11147581f, 1.73933309f, 1.65859611f, 1.26237806f, 0.68028141f, 0.12449909f, -0.39678907f, + -1.34007175f, -1.50272189f, -2.07958791f, -2.38322761f, -2.22156614f, -1.96435669f, -1.68760863f, -1.23664935f, -0.28772180f, 0.87765579f, 1.83822720f, 1.95281398f, 2.33671266f, 2.76119687f, 2.75790597f, 2.17899850f, + -0.51450332f, 0.69692757f, 1.90898730f, 1.89179379f, 1.41350404f, 0.03604267f, 0.02251128f, -1.04270018f, -0.97981089f, -0.36225564f, 0.14171617f, -0.32050715f, -0.56272675f, -0.38710633f, -0.74842203f, -1.19345103f, + 0.61027733f, -0.25705654f, -0.30960961f, 0.11651829f, 0.08424358f, -0.04474594f, -0.21961636f, -0.26522327f, -0.31681379f, -0.23903185f, -0.07879718f, 0.00383111f, 0.09522293f, 0.15157026f, 0.24747985f, 0.42175137f, + 0.06215930f, 0.74417332f, -0.05737044f, -0.84302341f, -0.79474372f, -0.48758880f, 0.00597663f, 0.39113473f, 0.94133689f, 1.03804127f, 0.53832521f, -0.22235026f, -0.44306288f, -0.22065599f, -0.22880587f, -0.42354568f, + -1.79298887f, -1.27561542f, -0.40453013f, 0.23597108f, 1.02842032f, 1.26211371f, 0.67302878f, 0.34945977f, 0.47749022f, 0.37809966f, 0.32913783f, 0.24544337f, -0.10938763f, -0.26555659f, -0.53889493f, -0.59219154f, + 1.13009762f, 0.63132036f, 0.20308733f, 0.12539517f, -0.05215684f, -0.59255734f, -0.72324525f, -0.47416068f, -0.34730473f, -0.17547668f, -0.01869868f, -0.01336213f, -0.03177292f, -0.01470495f, 0.12726970f, 0.22627027f, + 0.77990892f, 0.11720033f, -0.36217078f, -0.11533103f, -0.09211988f, -0.10379850f, 0.04466728f, 0.23851356f, 0.32838480f, 0.57072608f, 0.78005115f, 0.64032724f, 0.04609407f, -0.53665387f, -1.07338898f, -1.26240993f, + 0.71007500f, 1.67092184f, 0.87004285f, -0.47652190f, -0.41457815f, 1.09228787f, 1.43629613f, 1.29941339f, 0.74914490f, -0.87973861f, -1.00898687f, -0.76690679f, -0.87310138f, -0.89762148f, -1.11083002f, -1.39989674f, + 0.93106313f, -0.58060200f, -1.42018765f, -1.93078113f, -1.40332079f, -1.01406592f, -0.68270775f, -0.12421160f, -0.12818640f, 0.46306788f, 0.74384671f, 1.78170251f, 1.49298768f, 0.36128067f, 0.32905160f, 1.18106291f, + -0.34612942f, -0.05241863f, 0.63278953f, 1.64696186f, 1.83789559f, 1.82381570f, 1.71656555f, 1.45437140f, 1.06980287f, 0.39137818f, -0.16457688f, -0.79497784f, -1.78896933f, -2.38820658f, -2.55386733f, -2.48443600f, + -1.86975241f, -1.08195483f, -0.57202727f, -0.39808906f, -0.40936508f, 0.09703771f, 0.81017115f, 0.38629167f, 0.19481800f, 0.19706778f, -0.03872708f, -0.18683058f, 0.37148725f, 0.91055817f, 0.85929760f, 0.73001606f, + 0.13134993f, -0.43834896f, -0.42233235f, -0.34270675f, -0.42348478f, -0.62064185f, -0.67185252f, -0.57602218f, -0.46183286f, -0.05757593f, 0.38429775f, 0.63679540f, 0.59933007f, 0.44800121f, 0.69922041f, 1.11580320f, + -3.26282616f, -2.43458949f, -1.60312382f, -1.18490625f, -0.63841390f, -0.06739227f, 0.57790279f, 1.01010243f, 0.95682720f, 0.75035821f, 0.76084039f, 0.55166704f, 0.83933875f, 1.36392702f, 1.32925064f, 1.05103737f, + 2.94202112f, 3.01169534f, 2.23272878f, 2.33910012f, 1.97620433f, 1.92572769f, -0.00413067f, -1.30712114f, -1.48714461f, -1.62849896f, -1.56921600f, -1.60110814f, -1.73339679f, -1.81275951f, -1.69381023f, -1.59029306f, + -2.29630904f, -1.61967905f, -0.50968315f, 0.70826746f, 1.31943393f, 1.58078613f, 1.31857322f, 0.52237224f, 0.09330352f, 0.13994471f, 0.02623813f, -0.21467602f, -0.33140340f, -0.32793129f, -0.24016399f, -0.16907333f, + 1.17007844f, 1.46542856f, 1.12327460f, 0.78468376f, 0.28858044f, -0.24345469f, -0.36619581f, -0.30604001f, -0.24486928f, -0.39076408f, -0.42628982f, -0.47126418f, -0.48974406f, -0.58899141f, -0.61209496f, -0.69233731f, + 1.07869290f, -1.09624499f, -1.92296142f, -2.03260639f, -0.72727691f, 0.59938120f, 1.09296276f, -0.23244761f, -0.74213456f, -0.00394467f, 0.65433789f, 0.15922442f, 0.10516506f, 0.08483738f, 1.10833114f, 1.87468404f, + -0.45930662f, 0.49568081f, 0.92195224f, 1.70200988f, 1.24720421f, 1.19845895f, 0.75959352f, 0.23323360f, -0.27099240f, -1.38259199f, -2.25979609f, -0.92875900f, -0.06647214f, -0.58552485f, -0.33254823f, -0.27214292f, + -0.34979667f, 0.75395625f, 0.28769469f, -0.85592098f, -0.65167816f, 0.61099639f, 0.60402617f, 0.14561560f, -0.35073645f, -0.56010271f, -0.46661447f, -0.33527423f, -0.00166125f, 0.46634881f, 0.62977271f, 0.07337395f, + -0.41325825f, -0.71696540f, -0.72218212f, -0.64886200f, -0.33204525f, -0.13777071f, -0.05902665f, 0.08826462f, 0.09668422f, 0.34870144f, 0.76742933f, 1.02820877f, 0.66254418f, 0.26837143f, -0.04920095f, -0.18089312f, + -3.00863529f, -3.40420466f, -1.94263495f, -0.42577604f, 1.34874808f, 1.22039392f, -0.16945247f, -0.55999693f, 0.06330206f, 1.23795253f, 0.30477631f, 0.53425336f, 1.62154688f, 1.44462099f, 0.96061888f, 0.77448714f, + 1.81574209f, 1.72942805f, 0.78817895f, 0.12550764f, -0.50423190f, -0.81032090f, -0.83940826f, -0.95575724f, -0.70482913f, -0.32127670f, -0.08073867f, -0.13170408f, -0.16649118f, -0.08610719f, -0.03381103f, 0.17581953f, + -0.84693001f, -0.20800644f, 0.25371425f, 0.56604831f, 0.68467374f, 0.74501557f, 0.69436428f, 0.53975035f, 0.44393852f, 0.30580817f, 0.06566139f, -0.27742827f, -0.57148395f, -0.67328070f, -0.81658998f, -0.90525565f, + -0.44018762f, 0.22712975f, 1.11402502f, 1.98499541f, 1.52065113f, 0.79057891f, 0.55313940f, 0.32776632f, 0.39113088f, 0.10707747f, -0.20138118f, -0.67412788f, -1.34113027f, -1.39661518f, -1.43118002f, -1.53187281f, + -0.71632657f, -0.79492959f, -1.11328698f, -1.41494496f, -1.48929785f, -1.40383584f, -1.26657215f, -1.11367689f, -0.76426307f, 0.01056535f, 0.85354567f, 1.27473730f, 1.64108006f, 2.08311127f, 2.27822947f, 1.93586484f, + 2.05008554f, 2.18328135f, 1.98567996f, 2.35703511f, 2.27653310f, 2.41056123f, 1.36801069f, 0.12761937f, -0.59913124f, -1.45799255f, -1.89092221f, -1.99613693f, -2.20251841f, -2.33272106f, -2.21702011f, -2.06236397f, + -0.88997509f, -0.45675689f, 0.38059457f, 0.51582524f, 0.11775375f, -0.01509768f, -0.18542670f, -0.33776632f, -0.39018689f, -0.33129536f, -0.13149667f, 0.00113524f, 0.03060501f, 0.32190251f, 0.62848970f, 0.74169479f, + 1.19033790f, 0.59193623f, -0.18758267f, -0.71960274f, -0.81756997f, -0.65024529f, -0.64463404f, -0.82612299f, -0.84513928f, -0.45206413f, -0.04059069f, 0.00434486f, 0.50165507f, 1.00958611f, 0.97568033f, 0.91001135f, + -2.25864394f, -2.18529992f, -1.67272884f, -1.18053068f, -0.96703519f, -0.83661833f, -0.59641534f, -0.08623307f, 0.57868270f, 1.39398557f, 2.00205076f, 1.91429603f, 1.37348845f, 1.02732012f, 0.88340938f, 0.61027091f, + 1.13384373f, 2.01444926f, 1.64076134f, 0.39967630f, 0.11211256f, 0.60599786f, 0.41069653f, -0.08528479f, -0.18299306f, -0.80418851f, -1.03743576f, -1.04941914f, -0.88831874f, -0.76292972f, -0.67716107f, -0.82980704f, + -1.17168042f, -0.44794963f, 0.01219570f, -0.09679638f, 0.01681223f, 0.42983884f, 0.69873962f, 1.14025903f, 1.28455301f, 0.60046712f, -0.18327995f, -0.56883208f, -0.60793720f, -0.38487681f, -0.31833900f, -0.40317432f, + 0.85846316f, 0.89573242f, -0.03759975f, -0.56845446f, -0.63431292f, -0.69230128f, -0.59890012f, -0.27699442f, -0.10781577f, 0.38926803f, 0.44176667f, 0.74409936f, 0.51508281f, -0.44324047f, -0.56579214f, 0.08099815f, + -3.15663729f, -3.79941004f, -3.31993311f, -2.54887019f, -1.08297819f, 1.57490155f, 2.29511481f, 2.21386433f, 2.04448334f, 1.39028095f, 1.22351492f, 1.20294900f, 1.33557966f, 1.22044095f, 0.22504752f, -0.81835038f, + 2.10765319f, 2.66375515f, 1.73697111f, 0.50664812f, -0.22472176f, -0.63409486f, -0.65405139f, -0.71248479f, -0.73053296f, -0.87990271f, -0.82710167f, -0.73244187f, -0.64629112f, -0.47294253f, -0.23431056f, -0.26615160f, + -0.03257826f, 0.53214066f, -0.00109639f, -0.42211164f, -0.51464982f, -0.59747387f, -0.63145473f, -0.49761105f, -0.36163571f, 0.00923799f, 0.32394200f, 0.34648466f, 0.32420111f, 0.44177392f, 0.52684150f, 0.55398991f, + 0.38342101f, 0.05503415f, -0.69210895f, -1.40291256f, -1.20627913f, -0.22810180f, 0.91689677f, 1.67212414f, 1.26349034f, 0.48698570f, 0.10567292f, 0.13423949f, -0.02515828f, -0.41152165f, -0.51320898f, -0.53857267f, + -2.82653388f, -3.73292024f, -3.01554952f, 0.33800837f, 1.63071077f, 3.70049918f, 1.52548217f, -0.51327972f, -0.09119392f, 0.92240352f, 2.33190356f, 1.84268123f, -0.37179294f, -0.94969237f, -1.13179438f, 0.34106773f, + 1.56686851f, 0.88339322f, 0.31264631f, -0.04528796f, -0.42838354f, -0.20342114f, 0.40102389f, 0.54537791f, 0.35383369f, -0.18334298f, -0.75234358f, -0.76217615f, -0.36188398f, -0.46147282f, -0.54662536f, -0.31820590f, + 1.24862641f, 0.57117898f, 0.32856394f, 0.39564440f, 0.31824468f, 0.20893064f, 0.02628416f, -0.15359328f, -0.37616872f, -0.26748355f, -0.12954661f, -0.12215355f, -0.31835718f, -0.55834118f, -0.61233860f, -0.55948996f, + -0.59446013f, 0.48100057f, 1.20941553f, 0.41887505f, 0.63264306f, 1.37297652f, 1.40760513f, 0.91551762f, 0.67322895f, -0.90761879f, -1.23123057f, -0.97622159f, -0.96118737f, -0.53857839f, -0.69473239f, -1.20723297f, + -0.59728936f, -1.63533369f, -2.00769344f, -1.93041740f, -1.52949359f, -0.77428525f, -0.21146300f, 0.18478098f, 0.44962772f, 0.95017605f, 1.24326918f, 1.36658626f, 1.25105966f, 1.00442735f, 1.03660313f, 1.19944572f, + 0.32910504f, 1.16199966f, 2.05499236f, 2.56854877f, 2.45081012f, 1.66017811f, 1.01838813f, 0.51773322f, -0.06505376f, -1.14261830f, -1.77930778f, -1.94467446f, -1.83142606f, -1.76577923f, -1.67433287f, -1.55856482f, + -2.64386625f, -1.44973884f, -0.70503582f, -0.39387129f, -0.07345342f, 0.04530383f, 0.12054861f, 0.18110856f, 0.21747675f, 0.44785123f, 0.60100453f, 0.60149054f, 0.48165166f, 0.67654040f, 0.91879547f, 0.97419414f, + 0.52841759f, -0.23803980f, -0.77847320f, -1.06415798f, -1.29095335f, -0.94613842f, 0.01856631f, 0.57516289f, 0.58685158f, 0.24351075f, -0.23807950f, -0.16772309f, 0.27674343f, 0.40698887f, 0.73162063f, 1.35570347f, + -2.57939825f, -1.65066455f, -0.80960514f, -0.40285025f, -0.02550543f, 0.48071345f, 0.90391140f, 1.61193038f, 1.46090124f, 0.72305123f, 0.34664153f, 0.08297581f, -0.07460306f, 0.06306698f, -0.00946438f, -0.12110157f, + 1.93616583f, 2.87229439f, 2.28910932f, 1.18636717f, 0.28185288f, 0.08337698f, 0.52019726f, -0.70876138f, -1.13139506f, -1.42927692f, -1.07719650f, -0.84569529f, -1.10761102f, -1.14612879f, -0.78606400f, -0.93723475f, + -0.83260061f, -1.02726632f, -0.72610655f, 0.18186308f, 0.34897446f, 0.12845730f, 0.04139028f, 0.52688618f, 0.69166145f, 0.76853602f, 0.83316573f, 0.74702270f, 0.29499833f, -0.33104569f, -0.74851736f, -0.89741947f, + 2.77837874f, 1.31099865f, 0.62870774f, 0.35471489f, 0.05642577f, -0.02869061f, 0.19231930f, 0.50340721f, 0.36258783f, -0.06924684f, -0.52796695f, -0.75396481f, -0.89969036f, -1.23296254f, -1.40215690f, -1.27286039f, + -2.03034497f, -1.73876167f, -1.42952672f, -1.24259095f, -0.92252541f, -0.61137126f, -0.50926746f, -0.37515247f, -0.01804868f, 0.44616051f, 0.86247078f, 1.09558380f, 1.34244283f, 1.77606518f, 1.80302809f, 1.55183866f, + -0.13073542f, 0.74480506f, 1.75612393f, 1.94677409f, 1.45854395f, 0.14973385f, 0.41257896f, 0.78276795f, 0.53033406f, -0.97322979f, -1.31039960f, -1.18457724f, -1.39195239f, -0.74765434f, -0.89874803f, -1.14436551f, + -0.34864040f, 0.37594126f, 1.12760599f, 0.69668388f, 0.42042319f, 0.18779444f, -0.10969643f, -0.21695083f, -0.15889803f, -0.31866683f, -0.31049579f, -0.24646351f, -0.37724204f, -0.33366480f, -0.20076896f, -0.18696143f, + -0.21183487f, 0.60232151f, 0.88716970f, 0.69703105f, 0.10878166f, -0.60737034f, -0.81172315f, -0.92047926f, -0.64811892f, -0.24324457f, 0.15840527f, 0.21438269f, 0.31129327f, 0.53391758f, 0.13740501f, -0.20793704f, + -4.29885487f, -4.07150539f, -2.63799263f, -0.36599561f, 1.44131158f, 1.45858072f, -0.19422385f, -1.06386090f, -0.33862479f, 1.91691551f, 0.64172657f, 0.73115700f, 2.00475202f, 1.65789788f, 1.59229150f, 1.52642575f, + 2.70538594f, 1.21062684f, 0.58857880f, 0.37060452f, 0.32021415f, 0.15108056f, -0.18531087f, -0.47434646f, -0.64590620f, -0.70151444f, -0.68058335f, -0.63299041f, -0.53628956f, -0.62363375f, -0.52279857f, -0.34311771f, + -1.21504940f, -0.39554896f, 0.66755826f, 1.39859234f, 1.07486796f, 1.12290637f, 1.04295204f, 1.14165077f, 1.23441664f, 0.53720217f, -1.08842200f, -1.71470800f, -1.43192570f, -1.01274229f, -0.48508172f, -0.87666906f, + 0.79744189f, 0.76166108f, 0.24454768f, -0.10831092f, 0.07052421f, 0.61249105f, 1.01239329f, 0.92265182f, 0.79053239f, 0.48135056f, 0.14383439f, -0.46575922f, -0.96925167f, -1.31622221f, -1.46252773f, -1.51535724f, + 0.81612871f, -1.33697557f, -1.87521893f, -0.34596308f, 1.89973642f, 0.17905631f, -0.58156390f, -1.21825474f, -1.35128034f, -0.86896364f, -0.55987250f, -0.57592082f, -0.20226923f, 0.35191711f, 1.77194975f, 3.89749413f, + 1.63600586f, 1.88172004f, 2.47282363f, 2.31646225f, 1.68082996f, 0.43732883f, 0.54619537f, 0.53604274f, -0.42499034f, -1.38097531f, -1.67316581f, -1.66333999f, -1.66730967f, -1.61301407f, -1.62366867f, -1.46094527f, + -1.13086259f, -0.59286092f, -0.77851750f, -1.03233519f, -1.00728739f, -0.89574050f, -0.77142682f, -0.49554543f, -0.07881573f, 0.54315382f, 0.97530238f, 1.12272839f, 0.97460042f, 0.97504778f, 1.10466703f, 1.08789246f, + 2.01814493f, 0.44413768f, -0.35041288f, -0.98686383f, -1.26200527f, -1.52732432f, -1.48571248f, -1.19925108f, -0.92116223f, -0.35166881f, 0.13444272f, 0.18334560f, 0.92894956f, 1.08294765f, 1.35106569f, 1.94136698f, + -1.70233870f, -1.07878027f, -0.41699769f, -0.44160483f, -0.44460656f, -0.07853597f, -0.00754784f, 0.33653711f, 1.01426686f, 1.48915964f, 0.89682530f, 0.27439080f, 0.11875833f, 0.11843921f, 0.03694301f, -0.11490828f, + 2.92061289f, 2.48313078f, 1.67219449f, 1.01289511f, 0.89753859f, 0.94593326f, 0.70215728f, 0.23868842f, -0.29061326f, -1.00973596f, -1.40595256f, -1.63034802f, -1.68974684f, -1.71427450f, -1.62221007f, -1.51026992f, + -0.53491548f, -0.78055602f, -0.76775254f, 0.10333314f, 0.89464100f, 1.39260245f, 1.42278905f, 1.08133696f, 0.66191720f, 0.26667076f, 0.06990779f, -0.05792125f, -0.54825802f, -0.97098851f, -1.11014442f, -1.12266153f, + 0.08434699f, -0.45396949f, -0.94011771f, -1.20989965f, -1.27570370f, -1.00735662f, -0.43812010f, 0.32116477f, 0.90682311f, 1.07490930f, 1.04265682f, 0.83531254f, 0.64508330f, 0.31821119f, 0.09966431f, -0.00300507f, + -3.45239663f, -3.47846075f, -3.31323927f, -2.90259299f, -2.36355887f, -1.50192157f, -0.92288952f, -0.22530010f, 0.43258717f, 1.44935400f, 2.42148671f, 2.40769873f, 2.68306011f, 3.17878912f, 2.96783805f, 2.61954501f, + 0.48284645f, 1.41799541f, 1.97243102f, 1.59009976f, 1.22294070f, 0.43320660f, -0.04294311f, -0.31344005f, -0.66525145f, -1.13038241f, -1.07639821f, -0.88736938f, -0.84264379f, -0.79497080f, -0.64026957f, -0.72585115f, + -0.53516472f, -0.76920408f, -0.88526173f, -0.38845075f, -0.11227754f, 0.13805981f, 0.30967527f, 0.39937585f, 0.29135651f, 0.31552367f, 0.32154879f, 0.11114380f, 0.10183365f, 0.23587895f, 0.26513073f, 0.20083182f, + -0.82074713f, 0.00036242f, 0.05382877f, -0.93967714f, -1.34393534f, -0.63769734f, 0.72309703f, 0.71909478f, 0.67996995f, 0.71025231f, 0.03684615f, -0.42385779f, 0.20909277f, 0.74865506f, 0.36478854f, -0.08007303f, + -3.48156475f, -2.62401860f, -1.04625145f, 0.48561624f, 1.08462887f, 1.17430353f, 0.89095108f, 0.61098007f, 0.50455996f, 0.68603781f, 0.79217569f, 0.58623668f, 0.26474313f, 0.08681209f, -0.00104191f, -0.01416800f, + 0.84688039f, 0.96543736f, 0.75181222f, 0.42822852f, 0.24904957f, 0.14177234f, -0.40028407f, -0.85658294f, -0.99971434f, -0.98122097f, -0.75656716f, -0.49934498f, -0.24276416f, 0.09868884f, 0.51868958f, 0.73591908f, + -0.06813618f, -0.46119843f, -0.30096714f, 0.02701580f, 0.39106072f, 0.62007470f, 0.37968778f, 0.26617731f, 0.19689970f, 0.13864013f, 0.13523990f, 0.07059597f, -0.06298216f, -0.21734863f, -0.46878891f, -0.64597009f, + 0.51769554f, 1.42736951f, 1.88530137f, 0.81872770f, 0.32102451f, 1.12825115f, 1.21494458f, 1.01472394f, 0.70810844f, -0.50467729f, -1.98880367f, -2.08711611f, -1.72264586f, -0.93580475f, -0.50571272f, -1.29138527f, + 0.60536537f, -0.70354528f, -1.21617652f, -1.24262631f, -1.19828977f, -1.12565262f, -1.02203112f, -0.75894521f, -0.36826442f, 0.22795933f, 0.70544758f, 0.89015550f, 1.16228260f, 1.29703247f, 1.33542695f, 1.41186140f, + 1.04571798f, 1.61006483f, 1.19302962f, 0.57809989f, 0.71546259f, 1.30149630f, 1.62036473f, 1.44726990f, 1.32882491f, 0.70680094f, -0.39181833f, -1.57019972f, -2.33882246f, -2.53038720f, -2.43836110f, -2.27754281f, + -1.70543716f, -1.02771491f, -0.55943640f, -0.54366014f, 0.38503076f, 1.17876631f, 0.37193454f, -0.12189347f, 0.01303672f, -0.31900986f, -0.63608524f, -0.16956145f, 0.42659413f, 0.80300802f, 1.20767125f, 0.69675704f, + 1.23368326f, -0.17372473f, -0.75359852f, -0.99565343f, -0.84904797f, -0.66289765f, -0.45993622f, -0.17721316f, 0.04972474f, 0.35539595f, 0.55580381f, 0.47907626f, 0.35782172f, 0.37623101f, 0.34327632f, 0.32105845f, + -2.18352213f, -1.61901373f, -1.19957932f, -1.19527760f, -1.04950866f, -0.80750101f, -0.01092868f, 0.85242547f, 1.12490981f, 0.83609667f, 0.69994996f, 0.68985497f, 0.89390672f, 1.14712210f, 1.06776086f, 0.75330468f, + 2.33432113f, 2.91068592f, 2.96537876f, 2.14989074f, 1.35332201f, -0.15166191f, -0.61009155f, -1.11607408f, -1.38841709f, -1.32795548f, -1.18652766f, -1.19841345f, -1.27066378f, -1.28720326f, -1.20653804f, -0.97005218f, + -1.23488338f, -0.82668707f, -0.18190692f, 0.80577567f, 1.40765006f, 1.57572199f, 0.77649472f, 0.06817818f, -0.35316133f, -0.31163295f, -0.22814807f, -0.08516639f, -0.14974413f, -0.40747307f, -0.44196718f, -0.41305033f, + 1.49614141f, 2.17073361f, 1.21828130f, 0.24082715f, -0.04653730f, -0.02674890f, 0.07730547f, -0.75552212f, -0.53247648f, 0.68923075f, 0.51413502f, -1.15304142f, -1.36047405f, -1.08476009f, -0.71333064f, -0.73376398f, + -0.89704242f, -1.73833976f, -1.54624918f, -0.75197415f, -0.28436966f, -0.17513881f, -0.18327761f, -0.08090335f, 0.17526730f, 0.62711579f, 0.87938919f, 0.73687059f, 0.73766468f, 0.77613800f, 0.76077200f, 0.96407748f, + -0.74442989f, 0.06393849f, 0.79593747f, 2.27945407f, 2.65112193f, 2.16937280f, 1.04534068f, 0.40390110f, -0.66651353f, -1.35166042f, -1.46612345f, -0.64581600f, -0.65681647f, -1.60629861f, -1.31557834f, -0.95583049f, + 1.36402643f, 1.80223774f, 0.69837068f, -0.49496040f, -0.78242114f, -0.27168915f, 0.02445085f, -0.20866271f, -0.30035706f, -0.41170635f, -0.35841577f, -0.34242299f, -0.28692410f, -0.02094657f, -0.05934480f, -0.35123483f, + -1.08520561f, -0.84120058f, -0.40604501f, -0.30838475f, -0.39817946f, -0.45244145f, -0.46460261f, -0.31407296f, -0.03689281f, 0.38084328f, 0.75874597f, 0.64589942f, 0.68713572f, 0.85059140f, 0.70295555f, 0.28085506f, + -3.41901495f, -4.05624120f, -2.77833774f, -0.25403214f, 1.87889428f, 1.49402114f, -0.04104013f, -0.12322346f, 0.66403332f, 2.05218773f, 0.76725378f, 0.75987949f, 1.64445951f, 1.18046450f, 0.23904189f, -0.00834539f, + 2.34563559f, 1.85433514f, 0.92188091f, 0.00938003f, -0.66632165f, -1.24128642f, -1.45925477f, -1.45794931f, -1.45009658f, -1.08637380f, -0.53948104f, -0.13215543f, 0.79501605f, 0.54741060f, 0.55538134f, 1.00387907f, + 0.18830608f, 0.82743615f, 0.71353361f, 0.08375013f, 0.72945362f, 1.56781385f, 0.82203061f, -0.15761113f, -1.14514559f, -0.94404839f, -0.45524505f, -0.03539938f, -0.38522988f, -0.55123197f, -0.43254198f, -0.82587158f, + 0.28717168f, 1.26620628f, 1.79284485f, 0.74811924f, 0.75340319f, 0.55244948f, 0.46108770f, 0.62189892f, 0.63524206f, -0.36020964f, -0.49840190f, -0.49783437f, -1.24630499f, -1.48121128f, -1.52882801f, -1.50563245f, + 0.77651863f, -0.09801613f, -0.65368548f, -1.42314584f, -1.95826046f, -2.20248886f, -1.97940063f, -1.63600078f, -1.05805019f, -0.03308653f, 1.18890487f, 1.59425997f, 1.56951997f, 1.72023665f, 1.99206238f, 2.20063258f, + 1.86036810f, 1.95524352f, 1.65802754f, 0.51762484f, 0.32278641f, 1.41534130f, 1.58480385f, 1.00644422f, -0.43304110f, -1.52615221f, -1.54409319f, -1.50951389f, -1.44095494f, -1.33336688f, -1.41459830f, -1.11891940f, + -0.48994782f, -0.25738925f, -0.03744629f, -0.08936731f, -0.21819055f, -0.21749988f, -0.57009207f, -0.68163031f, -0.77904329f, -0.92638722f, -0.49253451f, -0.11015934f, 0.49328977f, 1.25069491f, 1.61419932f, 1.51150480f, + 2.17925129f, 0.65744215f, -0.14102877f, -0.68226531f, -0.86240255f, -0.96233313f, -0.77240075f, -0.60150667f, -0.43620670f, -0.12974041f, 0.06940761f, 0.29313968f, 0.32005914f, 0.04484663f, 0.20342365f, 0.82031433f, + -2.73276927f, -1.95293295f, -1.25302447f, -1.26607638f, -1.03464322f, -0.41097672f, 0.11299908f, 0.61306244f, 1.35234054f, 1.98785456f, 1.65758988f, 0.94482039f, 0.67093436f, 0.60201696f, 0.38959545f, 0.31920903f, + 1.99599002f, 1.78113188f, 1.60094449f, 1.49585133f, 1.05949606f, 0.38027999f, -0.00956917f, -0.37696778f, -0.58734884f, -0.88374264f, -1.14734587f, -1.24114441f, -1.17843206f, -1.09199503f, -0.92371805f, -0.87342960f, + -1.37903570f, -0.79248227f, 0.13536234f, 0.47656459f, 0.43589978f, 0.88461367f, 1.02738581f, 0.55354663f, 0.25049941f, -0.28501314f, -0.80941419f, -0.81019030f, -0.45648923f, 0.11389766f, 0.39621982f, 0.25863532f, + 2.10361489f, 0.37593562f, -0.16944555f, -0.32212923f, -0.22241176f, -0.24351656f, -0.27375398f, 0.02762124f, 0.11073362f, 0.23273069f, 0.27063497f, 0.08607178f, -0.19792432f, -0.48410706f, -0.59195084f, -0.70210352f, + -3.28081022f, -2.84286219f, -2.41405615f, -2.18965898f, -1.85813828f, -1.04835079f, -0.44771380f, 0.59206456f, 1.50301948f, 2.07448941f, 2.16550955f, 1.89856464f, 1.75678779f, 1.60095964f, 1.36941840f, 1.12077632f, + 1.20650745f, 1.87107653f, 1.86883453f, 1.42456949f, 0.48789223f, -0.72412798f, -1.11112426f, -1.49029508f, -1.30798779f, -1.39394685f, -1.21186297f, -0.51923241f, 0.01995250f, 0.34176002f, 0.40195072f, 0.13603383f, + 1.27785134f, 0.88553037f, 0.16900733f, -0.27809430f, -1.01525323f, -1.49395836f, -1.43232130f, -1.19784251f, -0.74210861f, -0.08619940f, 0.47709237f, 0.55331864f, 0.84110624f, 0.88279667f, 0.58250791f, 0.57656718f, + 0.33221429f, 1.11386403f, 0.75316099f, -0.54031614f, -1.07863165f, -0.21932249f, 1.22065947f, 1.15034668f, 1.03141160f, -0.31201434f, -1.38480174f, -0.81360834f, -0.27523041f, 0.24071536f, -0.19254386f, -1.02590322f, + -1.49213877f, -2.62687029f, -1.76800978f, 0.37484393f, 2.24342021f, 1.70797214f, 0.00785579f, -0.16576749f, 0.40170467f, 1.53774796f, 0.29192482f, 0.32972463f, 0.96040034f, 0.07052406f, -0.75744205f, -1.11588939f, + 1.68310221f, 0.62723214f, -0.21848789f, -0.50907306f, -0.77679516f, -0.86027718f, -0.37120564f, 0.20445818f, 0.27312526f, -0.13982446f, -0.56141448f, -0.66669228f, 0.06397763f, 0.19621457f, 0.32877219f, 0.72688794f, + 0.71839263f, 0.21641507f, 0.34358239f, 1.05799089f, 1.05814284f, 0.52787967f, 0.14046002f, 0.11966559f, 0.07361240f, -0.17447064f, -0.37909417f, -0.61722985f, -0.71730019f, -0.79744166f, -0.77133987f, -0.79926472f, + -0.02890014f, 0.92802997f, 1.03744813f, 0.32870919f, 0.07886022f, 0.63362031f, 0.46497182f, 0.14157700f, -0.03057580f, -0.54785692f, -1.11970728f, -1.36023434f, -0.91731394f, 0.07493639f, 0.47210281f, -0.15566707f, + -0.69638941f, -0.91666102f, -1.56178072f, -1.95501706f, -1.82786692f, -1.74880889f, -1.34684465f, 0.11048340f, 1.37545972f, 1.36714659f, 1.44286472f, 1.29857548f, 1.10826459f, 1.56371080f, 1.18624590f, 0.60061806f, + -0.68066861f, 0.38195183f, 1.51822296f, 2.21510524f, 2.33189221f, 1.97513513f, 1.15635207f, 1.51498823f, 1.49065161f, -0.27868821f, -1.78208773f, -2.20070549f, -2.26038069f, -2.05737950f, -1.59696081f, -1.72742716f, + -2.17324712f, -1.42748120f, -0.47105336f, 0.06399853f, -0.10139724f, -0.33208523f, -0.36226578f, -0.45684329f, -0.45421750f, -0.02950979f, 0.57908509f, 0.82823657f, 0.84044612f, 0.96336259f, 1.18058199f, 1.35238916f, + 0.30637595f, -0.07750454f, -0.01603143f, -0.03845729f, -0.46768884f, -0.33028351f, 0.33893858f, 0.66006523f, 0.64603598f, 0.25681503f, -0.24604284f, -0.37133227f, -0.20588021f, -0.28072164f, -0.22555667f, 0.05126849f, + -1.81904207f, -1.97008939f, -1.38138723f, -0.56721565f, 0.08439254f, 0.50012417f, 0.41461731f, 0.70946239f, 0.65844196f, 0.50418711f, 0.67016347f, 0.85608609f, 0.63818532f, 0.38340644f, 0.22816114f, 0.09050718f, + 3.82551321f, 3.02994002f, 1.79732057f, 1.05862951f, 0.33021546f, 0.01969982f, -0.57482284f, -1.10367492f, -1.21202781f, -1.06293594f, -0.97966329f, -1.01767532f, -1.10340104f, -1.13918652f, -1.02503523f, -0.84289579f, + -2.06530906f, -1.02138773f, 0.19121847f, 0.64135688f, 0.47353945f, 0.29125589f, 0.17346435f, 0.09846354f, 0.14173379f, 0.44108119f, 0.42909595f, 0.13671490f, -0.09429711f, 0.06651142f, 0.02429001f, 0.07226851f, + 1.63249192f, 0.94436017f, 0.65530634f, 0.76476367f, 1.10302458f, 1.20701875f, 0.88073298f, 0.43640158f, -0.07220279f, -0.39214092f, -0.60759685f, -0.87296187f, -1.13810886f, -1.40490240f, -1.54422408f, -1.59196182f, + -2.96354446f, -2.66922503f, -2.35080143f, -1.84250497f, -1.24255764f, -0.53451683f, -0.22318900f, 0.15923121f, 0.44185767f, 0.90571587f, 1.20883041f, 1.21786822f, 1.54160670f, 2.22751201f, 2.21090650f, 1.91281110f, + -0.09062710f, 0.80687377f, 1.69510603f, 2.38364009f, 2.08626387f, 1.00304738f, 0.66997543f, 0.04541459f, -0.35848319f, -0.80600051f, -1.65487629f, -2.04562701f, -2.03869244f, -1.11898388f, 0.04427361f, -0.62130392f, + -0.99015493f, -0.47096904f, 0.39660329f, 1.29486538f, 1.58962509f, 0.33608325f, -0.41798602f, -0.54749259f, -0.00991716f, -0.02240745f, -0.93933104f, -0.69735917f, -0.17095973f, 0.19272004f, 0.29655039f, 0.16013060f, + -0.50032252f, -0.00936927f, 0.13895740f, 0.11955067f, -0.00882381f, -0.31634261f, -0.30280409f, -0.10222302f, -0.04951847f, 0.13870349f, 0.43344396f, 0.56559398f, 0.24092822f, -0.05903140f, -0.12616386f, -0.16257807f, + -4.66891396f, -4.62476618f, -2.72504562f, -0.11626174f, 1.38983931f, 1.37676145f, 0.15183709f, -0.07491020f, 0.54070200f, 1.84266982f, 0.65624201f, 0.70100510f, 1.81013255f, 1.75739872f, 0.97189375f, 1.01141647f, + 3.82513926f, 1.74864093f, 0.71663856f, -0.06702053f, -0.46144066f, -0.68679697f, -0.83513366f, -0.69088271f, -0.63484378f, -0.48492965f, -0.30596681f, -0.27767202f, -0.29901877f, -0.55135905f, -0.55561568f, -0.43973879f, + -1.83506374f, -1.72166910f, -0.66010462f, 1.71984506f, 2.40983158f, 1.81667012f, 1.44944523f, 1.31000271f, 0.86661928f, 0.58345030f, -0.05866711f, -0.37487717f, -0.74598532f, -1.38021702f, -1.58454113f, -1.79473786f, + 0.16939787f, 1.05222199f, 0.60925979f, -0.08245082f, -0.05127361f, -0.01958411f, -0.04649851f, 0.11008216f, 0.21213694f, -0.02520358f, -0.00574917f, -0.04591061f, -0.24174211f, -0.38605009f, -0.52417208f, -0.72446423f, + -0.07063893f, -1.74970518f, -1.79098807f, -1.50819293f, -1.06029380f, -1.44474701f, -1.24662095f, -1.20341521f, -1.18506899f, -0.88327503f, -0.47818767f, 0.53478172f, 1.99588317f, 2.01785324f, 2.86156101f, 5.21105441f, + 1.18577996f, 1.82923029f, 2.00218590f, 1.75897045f, 1.55666666f, 1.15213194f, 1.02264996f, 0.58845201f, 0.39345304f, -0.25590088f, -1.11168611f, -1.75581078f, -2.05745836f, -2.20440070f, -2.14031291f, -1.96395016f, + -0.49703383f, -0.62650520f, -0.98853522f, -1.16849765f, -1.02786508f, -0.51447634f, -0.02538523f, 0.08704333f, 0.03359763f, 0.17774887f, 0.30484412f, 0.32520735f, 0.62948522f, 1.14552041f, 1.22336987f, 0.92148234f, + -0.07188198f, 0.18500810f, -0.22096354f, -0.56851679f, -0.98832362f, -1.20304996f, -1.11943691f, -1.09383807f, -0.85446062f, -0.29360582f, 0.44439822f, 0.64306330f, 1.09971537f, 1.50142342f, 1.36382024f, 1.17664847f, + -1.21730935f, -1.48884440f, -1.78500620f, -1.57607634f, -0.82775565f, -0.09612994f, 0.49933981f, 1.06136160f, 1.31463011f, 1.46090638f, 1.14896512f, 0.64320117f, 0.39111587f, 0.36061229f, 0.18325675f, -0.07226660f, + 2.30575156f, 2.37005513f, 1.37776397f, 0.78509487f, 0.18022242f, -0.13093354f, 0.22126477f, -0.11444642f, -0.35716968f, -0.59492665f, -0.35765935f, -0.44655201f, -1.03213345f, -1.27074059f, -1.44000075f, -1.49558947f, + -1.00874079f, -1.64011865f, -1.86084729f, -1.06805908f, 0.07222945f, 1.36179475f, 1.87160360f, 1.76248472f, 1.52374330f, 1.04119855f, 0.73448166f, 0.13768018f, -0.49711929f, -0.73696841f, -0.89885406f, -0.79450886f +}; +const float ivas_sns_cdbk_tcx10_stage2[ 32 * 16 ] = { + 0.30627323f, 0.48836579f, -0.02716944f, -0.47680077f, -0.52992614f, -0.25467720f, -0.13298242f, -0.14929291f, -0.14808149f, 0.08665801f, 0.28830653f, 0.27526330f, 0.09942358f, -0.01755061f, 0.03315580f, 0.15903469f, + 0.40931263f, -0.04412117f, -0.08826419f, 0.38716891f, 0.51515595f, 0.42227845f, 0.34963425f, 0.26800736f, 0.03770000f, -0.19967080f, -0.31044249f, -0.32623294f, -0.38445978f, -0.38085950f, -0.38590829f, -0.26929836f, + -0.16037262f, -0.37557223f, -0.41481262f, -0.12384627f, 0.25702942f, 0.29593484f, 0.04534352f, -0.04349856f, -0.11439445f, -0.20184919f, 0.03250628f, 0.58473249f, 1.07468564f, 0.31789485f, -0.43837532f, -0.73540590f, + -0.72021067f, 0.08601834f, 0.36444345f, 0.07734969f, -0.03855524f, -0.02016363f, 0.22787880f, 0.23660595f, -0.06162934f, -0.60111840f, -0.53416841f, -0.01411490f, 0.31545914f, 0.35328934f, 0.27371155f, 0.05520477f, + 0.17033204f, -0.13395098f, -0.17486207f, -0.16431307f, -0.15028250f, -0.16217158f, 0.20788205f, 0.78892741f, 0.82887028f, 0.27828798f, -0.09961411f, -0.26525390f, -0.29531330f, -0.31862369f, -0.30357092f, -0.20634333f, + 0.66971623f, 0.62862982f, 0.51073654f, 0.36780819f, 0.09494981f, -0.26895298f, -0.43607248f, -0.52929484f, -0.50226353f, -0.28888748f, -0.08077826f, 0.07870787f, -0.04066089f, -0.15014043f, -0.07631337f, 0.02281584f, + -0.14637266f, -0.46934298f, -0.43556714f, -0.11250329f, 0.02177593f, -0.06273200f, -0.10608254f, -0.23883852f, -0.34273025f, -0.21064510f, 0.01000878f, 0.26290329f, 0.36940740f, 0.45606583f, 0.50057089f, 0.50408231f, + -0.63822919f, -0.37848043f, -0.12025765f, 0.46869706f, 0.60287599f, 0.40487467f, 0.32284423f, 0.21760285f, 0.02923608f, 0.00961581f, 0.09146575f, 0.01422525f, -0.19921025f, -0.27268562f, -0.30705403f, -0.24552069f, + 1.00438179f, 0.03452909f, -0.36528888f, -0.16282387f, -0.17507552f, -0.16366972f, 0.01988929f, 0.04208138f, -0.09195065f, -0.12550201f, -0.13827904f, -0.15519976f, -0.13718296f, -0.04187317f, 0.11795197f, 0.33801187f, + -0.29872646f, -0.05673935f, 0.22627715f, 0.35384240f, 0.40583411f, 0.05342130f, -0.33165017f, -0.58372192f, -0.59880799f, -0.13860904f, 0.35292935f, 0.42680564f, 0.12541820f, -0.05244271f, 0.02304693f, 0.09312233f, + -0.62056798f, -0.65569894f, -0.39193684f, -0.23470135f, -0.10487732f, -0.02415277f, 0.10485475f, 0.27475842f, 0.33639795f, 0.28659695f, 0.29816270f, 0.35486347f, 0.22178257f, 0.06294332f, 0.00371302f, 0.08786182f, + -0.24167361f, 0.39335919f, 0.45401345f, -0.01359878f, -0.02799250f, 0.03219280f, -0.03498926f, 0.13917253f, 0.56998817f, 0.30076805f, -0.02861530f, -0.08301223f, -0.23268793f, -0.25582563f, -0.40349390f, -0.56760551f, + -0.25453749f, 0.20141031f, 0.13622118f, 0.02192458f, 0.01884274f, 0.35426017f, 0.30533029f, -0.04383371f, -0.03213904f, 0.48723585f, 0.26916690f, -0.57914714f, -0.86274497f, -0.46431975f, 0.21456299f, 0.22776732f, + 0.10091242f, -0.00486621f, 0.15438553f, 0.58933636f, 0.58327809f, 0.15020643f, -0.13942120f, -0.30560120f, -0.39802935f, -0.42014770f, -0.43506227f, -0.49122908f, -0.24162334f, 0.07789107f, 0.33589368f, 0.44407700f, + -0.86901291f, -0.12649490f, 0.37769660f, 0.32335451f, -0.09778731f, -0.30169760f, -0.11330902f, 0.06975956f, 0.10852794f, 0.10187023f, 0.01908335f, -0.02063501f, -0.02583787f, 0.01976747f, 0.15814638f, 0.37656868f, + 0.04263499f, 0.02090495f, 0.31860242f, 0.23302977f, -0.33090591f, -0.80333458f, -0.73651770f, -0.34102413f, 0.01204330f, 0.27818705f, 0.45925162f, 0.49138398f, 0.30213637f, 0.14165342f, -0.01743260f, -0.07061291f, + -0.33546750f, 0.07559517f, -0.29917689f, -0.73625773f, -0.65250278f, -0.17791468f, 0.36283358f, 0.41870726f, 0.25167625f, 0.10475438f, 0.03036614f, -0.11264997f, 0.02694511f, 0.35023967f, 0.42385566f, 0.26899640f, + 0.35439950f, 0.67540976f, 0.38662754f, 0.00957348f, -0.04081569f, 0.08980026f, 0.24456400f, 0.16454453f, -0.17326799f, -0.44054817f, -0.46528410f, -0.40046956f, -0.28220380f, -0.18741583f, -0.03688613f, 0.10197206f, + 0.42543134f, 0.16124378f, -0.11664388f, -0.16052109f, -0.14380996f, -0.20548992f, -0.07681681f, -0.05550879f, -0.19682147f, -0.44926335f, -0.31008693f, 0.10843293f, 0.56978845f, 0.55547148f, 0.11319503f, -0.21860065f, + -0.29805544f, -0.51653600f, -0.50993841f, -0.23042275f, 0.24667415f, 0.49673729f, 0.44572321f, 0.45012593f, 0.15926189f, -0.25316153f, -0.34302757f, -0.25146569f, -0.04585493f, 0.07882198f, 0.19017230f, 0.38094576f, + 0.32844224f, 0.41193928f, 0.40958218f, 0.23076367f, -0.27298459f, -0.73724149f, -0.33139249f, 0.20850941f, 0.29246785f, 0.02387269f, -0.22298162f, -0.22401730f, -0.10602946f, -0.10948655f, -0.04914188f, 0.14769834f, + -0.17579666f, 0.35780877f, 0.71235588f, 0.55448086f, 0.37958752f, 0.25325181f, 0.00067976f, -0.17449727f, -0.19933258f, -0.18272217f, -0.13825657f, -0.13482936f, -0.26973501f, -0.36527057f, -0.38046021f, -0.23726392f, + 0.18763378f, -0.33806505f, -0.40345471f, -0.16420458f, -0.35258917f, -0.57440801f, -0.40444473f, 0.03937379f, 0.28301143f, 0.24202773f, 0.11450746f, -0.01201630f, 0.15584175f, 0.29186178f, 0.39454798f, 0.54037647f, + 0.22483690f, -0.44980090f, -0.04869487f, 0.59069175f, 0.53952189f, -0.08294351f, -0.50222392f, -0.24118691f, 0.23316504f, 0.15935219f, -0.04441873f, 0.04368785f, -0.01936622f, -0.19829407f, -0.17269697f, -0.03162974f, + 0.86145933f, 0.21872440f, 0.03989593f, 0.02383014f, -0.09253274f, -0.16857595f, -0.11671737f, 0.08021353f, 0.06125647f, 0.12344152f, 0.23383136f, 0.23023986f, 0.00554465f, -0.33666994f, -0.57850362f, -0.58543742f, + 0.51765053f, 0.14453794f, -0.21849231f, -0.46766148f, 0.28518641f, 0.98554209f, 0.04290847f, -0.60417524f, -0.40619174f, 0.07096948f, -0.07934046f, -0.11108689f, 0.01736604f, 0.02182622f, -0.13816306f, -0.06087569f, + 0.48940455f, -0.48846716f, -0.76449136f, -0.43167975f, -0.08214146f, 0.11409731f, 0.23323066f, 0.14717357f, 0.03539665f, 0.18939153f, 0.30742449f, 0.25985980f, 0.09542412f, -0.02333196f, -0.07732568f, -0.00396539f, + -0.11187535f, 0.22479868f, 0.00043228f, -0.32181417f, -0.15096473f, 0.43016822f, 0.70121781f, 0.35219596f, -0.12050155f, -0.23287073f, 0.15265180f, 0.19690580f, -0.06424055f, -0.21596133f, -0.38579166f, -0.45435087f, + -0.22289529f, -0.33733328f, 0.06840735f, 0.09280703f, 0.04636627f, 0.21910935f, -0.03558133f, 0.03650325f, 0.61258277f, 0.50575298f, -0.41287364f, -0.69151766f, -0.55346043f, 0.16231747f, 0.54407303f, -0.03425754f, + -0.01396139f, 0.41256481f, 0.28386076f, -0.13079544f, -0.35049882f, -0.37139357f, -0.26190236f, -0.28543916f, -0.36404168f, -0.41216213f, -0.30446824f, -0.16554805f, 0.07635435f, 0.40718475f, 0.72148357f, 0.75876291f, + -0.78143464f, 0.05520810f, 0.09851993f, -0.35088396f, -0.29183273f, 0.13535467f, 0.10630173f, -0.35151176f, -0.27502696f, 0.15923208f, 0.34325564f, 0.26263384f, 0.39924614f, 0.42088604f, 0.20935571f, -0.13930422f, + -0.20363163f, -0.21557857f, -0.16300691f, -0.04183005f, -0.11100316f, -0.05771045f, 0.03898740f, 0.01316220f, 0.17362802f, 0.74914331f, 0.94477958f, 0.44778038f, -0.09421183f, -0.32736334f, -0.50631884f, -0.64682642f +}; +const float ivas_sns_cdbk_tcx10_stage3[ 8 * 16 ] = { + 0.15213764f, -0.12778955f, 0.09362990f, -0.08343056f, -0.25379718f, 0.12518895f, 0.29943288f, -0.09857322f, -0.34816031f, -0.24349585f, -0.11266650f, -0.05996015f, 0.03254247f, 0.15532134f, 0.23410563f, 0.23551447f, + -0.16242282f, -0.11097776f, -0.31747514f, -0.25628076f, 0.13836003f, 0.29861681f, 0.10506779f, 0.11734717f, 0.26608658f, 0.05454060f, -0.14603348f, -0.19239843f, 0.04173306f, 0.20966631f, 0.07432020f, -0.12015035f, + -0.05086737f, 0.14763099f, -0.10027459f, -0.32093478f, -0.17515530f, -0.18641303f, -0.27141947f, -0.07787662f, 0.00378069f, -0.04285463f, 0.10140687f, 0.34974771f, 0.30832793f, 0.10107726f, 0.07691200f, 0.13691240f, + -0.19149570f, -0.03034820f, 0.22501633f, 0.07949802f, -0.27147765f, -0.19613243f, 0.27922429f, 0.35035416f, 0.10414276f, 0.00614821f, 0.06550601f, 0.11675054f, 0.03695278f, -0.13039057f, -0.22716902f, -0.21657951f, + 0.26536712f, -0.20814302f, -0.25065997f, 0.11971631f, 0.27275427f, 0.17786545f, -0.00254739f, -0.12770659f, -0.22797897f, 0.00768447f, 0.21340357f, 0.19482691f, 0.04586545f, -0.11847485f, -0.17809566f, -0.18387694f, + 0.25667429f, 0.24654641f, 0.10151031f, -0.02938848f, -0.14360442f, -0.13987667f, -0.20754252f, -0.19670735f, 0.17496815f, 0.41594389f, 0.13093074f, -0.20541061f, -0.16236246f, 0.04068170f, -0.03728146f, -0.24508149f, + -0.08722397f, 0.02295918f, 0.00051204f, 0.07408103f, 0.14389321f, 0.06786859f, 0.00359252f, 0.11717038f, 0.08740562f, 0.00119184f, -0.07592203f, -0.11362449f, -0.31422561f, -0.38910675f, -0.02291088f, 0.48433932f, + -0.18216919f, 0.06012195f, 0.24774113f, 0.41673922f, 0.28902704f, -0.14711768f, -0.20580810f, -0.08400793f, -0.06024452f, -0.19915854f, -0.17662518f, -0.08993148f, 0.01116638f, 0.13122555f, 0.08011919f, -0.09107791f +}; + +const float *const ivas_sns_cdbks_tcx10[SNS_MSVQ_NSTAGES_TCX10] = { ivas_sns_cdbk_tcx10_stage1, ivas_sns_cdbk_tcx10_stage2, ivas_sns_cdbk_tcx10_stage3}; + +const float ivas_sns_means_tcx10[M] = { + 0.9510f , 1.1892f , 0.8969f , 0.3467f, + 0.1347f , 0.1074f , 0.0504f , -0.0790f, + -0.1305f , -0.3713f , -0.5611f , -0.5757f, + -0.4801f , -0.4108f , -0.4564f , -0.6112f +}; + +const int16_t ivas_sns_cdbks_side_tcx20_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 32 }; +const int16_t ivas_sns_cdbks_side_tcx20_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 5 }; +const int16_t ivas_sns_cdbks_side_tcx10_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 8 }; +const int16_t ivas_sns_cdbks_side_tcx10_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 3 }; + +const float ivas_sns_means_side_tcx20[M] = { + -0.0181f , 0.0044f , 0.0133f , 0.0096f, + 0.0073f , 0.0038f , 0.0058f , 0.0015f, + -0.0046f , -0.0096f , -0.0099f , -0.0173f, + -0.0075f , 0.0049f , 0.0023f , 0.0141f +}; + +const float ivas_sns_cdbks_side_tcx20_stage1[ 32 * 16 ] = { + -0.09561560f, -0.07036320f, 0.02878750f, 0.03511974f, 0.17132389f, -0.03138941f, -0.33178799f, -0.21216198f, -0.04445341f, 0.02221417f, 0.02283919f, 0.03233147f, 0.08941267f, 0.12190493f, 0.12476806f, 0.13706984f, + 0.00109929f, 0.08875231f, 0.22238215f, 0.21457590f, 0.10015343f, 0.04638508f, 0.03393346f, -0.00874452f, -0.04376851f, -0.07742100f, -0.07534945f, -0.10337673f, -0.10407952f, -0.11112585f, -0.09133646f, -0.09207950f, + -0.24818594f, 0.26921203f, 0.44107852f, 0.17248048f, 0.64417785f, 0.17680036f, 0.13990282f, -0.00956079f, 0.26766161f, -0.03617849f, -0.51006953f, -0.14559280f, 0.04585566f, -0.32296828f, -0.43440915f, -0.45020472f, + -0.02603883f, -0.10893371f, -0.10500311f, -0.11573136f, -0.10145701f, 0.08950274f, 0.26393655f, 0.16421642f, 0.06653788f, 0.02055681f, 0.03165200f, -0.00660730f, -0.02920382f, -0.04413712f, -0.04586630f, -0.05342379f, + 0.42792206f, 0.05873236f, -0.03519993f, -0.02404930f, -0.02129021f, -0.02228539f, -0.05794333f, -0.05329147f, -0.02713142f, -0.02536622f, -0.01781476f, -0.04129741f, -0.03786846f, -0.04699464f, -0.04049980f, -0.03562223f, + 0.02055988f, 0.02639971f, 0.00689886f, 0.00418128f, -0.01634280f, 0.00921734f, 0.00364626f, -0.03176210f, -0.04382792f, -0.01247039f, 0.02183370f, -0.00002241f, -0.00402301f, -0.00566646f, 0.00978385f, 0.01159419f, + 0.19157117f, 0.21950742f, 0.18377101f, -0.02875442f, -0.28243126f, -0.54171973f, -0.31264637f, -0.03676636f, 0.00528891f, -0.04001921f, 0.08505054f, 0.06946939f, 0.13428842f, 0.15810925f, 0.11903950f, 0.07624180f, + -0.30190937f, -0.29575446f, -0.26060885f, -0.18754051f, -0.14798754f, -0.10966049f, -0.13245975f, -0.11017279f, -0.08153340f, -0.06447313f, 0.04034392f, 0.17641778f, 0.25731939f, 0.31027339f, 0.40673221f, 0.50101364f, + -0.47842978f, -0.03818905f, 0.07056377f, 0.03300345f, 0.02730699f, 0.05007915f, 0.02893237f, 0.02226785f, 0.04222222f, 0.04128904f, 0.03830734f, 0.01743857f, 0.03607951f, 0.02582752f, 0.04198512f, 0.04131589f, + -0.02242885f, 0.01802990f, -0.00361209f, 0.02714255f, 0.04843318f, 0.04306928f, 0.02675985f, 0.07964815f, 0.10019006f, 0.05262710f, 0.00113825f, -0.04747375f, -0.04988074f, -0.05204562f, -0.09989329f, -0.12170389f, + 0.28967652f, 0.36512749f, 0.38343313f, 0.37459919f, 0.29419461f, 0.21272806f, 0.14963422f, 0.11987446f, -0.00354946f, -0.11817788f, -0.21991893f, -0.37389500f, -0.43897693f, -0.47312318f, -0.36222971f, -0.19939667f, + -0.29847367f, -0.28024953f, -0.23616334f, -0.19456539f, -0.16497910f, -0.12215408f, -0.05213406f, 0.03088777f, 0.11427925f, 0.17777695f, 0.21315635f, 0.18382103f, 0.20758797f, 0.19478448f, 0.14014366f, 0.08628162f, + -0.01005369f, -0.03186180f, -0.07995901f, -0.10893772f, -0.11257191f, -0.10933952f, -0.06260446f, 0.01592879f, 0.06618622f, 0.08792663f, 0.09779631f, 0.06871009f, 0.06158038f, 0.04699408f, 0.04045205f, 0.02975352f, + -0.12591171f, -0.31330699f, -0.09207505f, 0.04353844f, 0.05691547f, 0.02830292f, 0.05190188f, 0.05663181f, 0.05579546f, 0.05136184f, 0.06373287f, 0.03243363f, 0.03631576f, 0.02886726f, 0.02108611f, 0.00441022f, + 0.51424359f, 0.44825357f, 0.27826391f, 0.14692419f, 0.04486213f, 0.01374316f, -0.05577450f, -0.06790050f, -0.10394906f, -0.14111342f, -0.16141165f, -0.18795338f, -0.17689540f, -0.18030471f, -0.19451666f, -0.17647134f, + 0.01250082f, -0.03513855f, -0.10558904f, -0.13589106f, -0.16642959f, -0.12403555f, -0.11639493f, -0.13504470f, -0.12448111f, -0.08902796f, 0.02742439f, 0.14597597f, 0.22586358f, 0.24372767f, 0.18517594f, 0.19136417f, + 0.00690369f, -0.06536790f, -0.04560492f, 0.17183296f, 0.06108150f, -0.14297504f, -0.10743566f, 0.00028842f, -0.00000737f, 0.01948888f, 0.04144583f, 0.01034213f, 0.01186359f, 0.01904016f, 0.01513936f, 0.00396440f, + -0.02696488f, -0.05930555f, -0.05635944f, 0.04417762f, 0.20483421f, 0.24818872f, 0.08337011f, -0.03555721f, -0.04496794f, -0.05268211f, -0.05177582f, -0.06105043f, -0.04493356f, -0.04903822f, -0.04844764f, -0.04948792f, + 0.09934599f, 0.20097988f, 0.02959104f, 0.10059414f, 0.36489123f, 0.42345991f, 0.31306867f, 0.19189664f, 0.02025838f, -0.16920767f, -0.19221388f, -0.36590851f, -0.24124038f, -0.21069901f, -0.24782116f, -0.31699542f, + -0.38302159f, -0.20867958f, -0.06199247f, 0.00929974f, -0.08763027f, 0.01230753f, 0.12845035f, 0.27194101f, 0.35480151f, 0.36726532f, 0.20142240f, -0.03957218f, -0.10891503f, -0.16235951f, -0.15207841f, -0.14123875f, + 0.29448433f, 0.27467021f, 0.21093907f, 0.02636253f, -0.10971996f, -0.06520899f, -0.09114815f, -0.19988466f, -0.25173695f, -0.21777001f, -0.19036007f, -0.10825290f, 0.00468462f, 0.07695453f, 0.14592570f, 0.20006079f, + -0.09613522f, -0.07305197f, 0.23140183f, -0.01276782f, -0.05046178f, -0.03690868f, 0.01854782f, -0.00516658f, -0.01794740f, 0.01127293f, 0.02845775f, 0.00246563f, -0.00285605f, -0.00274282f, 0.00447526f, 0.00141708f, + 0.09853152f, 0.23398475f, 0.15560679f, 0.01939291f, -0.05095939f, -0.10951335f, -0.08366621f, -0.03852663f, -0.00171258f, -0.01619636f, -0.02703945f, -0.04625883f, -0.03573599f, -0.03656223f, -0.03486191f, -0.02648302f, + -0.05407938f, -0.18042914f, -0.31075117f, -0.36223570f, -0.35545274f, -0.26114190f, -0.21540173f, -0.18652814f, -0.10764184f, -0.04326102f, 0.10627938f, 0.32432791f, 0.40043785f, 0.56193174f, 0.40395999f, 0.27998606f, + -0.22375901f, -0.11453094f, -0.06437672f, 0.02966050f, -0.06882505f, -0.02229970f, 0.00519106f, 0.04139490f, -0.21099529f, -0.00965469f, 0.01906172f, 0.06535794f, 0.27085374f, 0.36298568f, 0.13009871f, -0.21016295f, + 0.18023915f, 0.15936182f, 0.13064987f, 0.09848966f, 0.08230524f, 0.11068418f, 0.11168088f, 0.11505046f, 0.13567778f, 0.12259236f, 0.03115883f, -0.14115321f, -0.20420262f, -0.27855554f, -0.34034745f, -0.31363132f, + -0.12817652f, 0.06412346f, 0.23407500f, 0.37946648f, 0.31127015f, 0.27044470f, 0.18591463f, 0.13643852f, 0.07403884f, -0.00928348f, -0.10609226f, -0.26765738f, -0.35056732f, -0.38530570f, -0.26185421f, -0.14683496f, + -0.63004591f, -0.58451443f, -0.16857245f, -0.08058005f, -0.09034904f, 0.00601978f, 0.10036174f, 0.10417477f, 0.14447621f, 0.13945086f, 0.18409447f, 0.20139949f, 0.10118410f, 0.12033491f, 0.20454736f, 0.24801829f, + 0.09650912f, 0.15979369f, -0.02778062f, -0.21860304f, -0.09723043f, 0.03923136f, 0.06141602f, 0.00600025f, -0.03251321f, -0.01956117f, -0.01004770f, -0.01435564f, 0.01114831f, 0.01113413f, 0.01304939f, 0.02180959f, + -0.00555466f, -0.14717213f, -0.37968771f, -0.12250216f, 0.03497204f, 0.13708345f, 0.03564652f, 0.00785509f, 0.04438533f, 0.06495152f, 0.07142555f, 0.05800545f, 0.06370878f, 0.05930816f, 0.05015268f, 0.02742217f, + 0.24931986f, 0.21084678f, 0.15421842f, 0.14679305f, 0.11899038f, 0.10112391f, 0.08120544f, 0.01848917f, -0.03021656f, -0.11872087f, -0.17582510f, -0.27756371f, -0.26300284f, -0.17730239f, -0.07164775f, 0.03329224f, + -0.17764482f, -0.15058551f, -0.12627503f, -0.06547272f, -0.05935809f, -0.01277874f, 0.01723090f, -0.00829920f, -0.02788840f, 0.01142219f, 0.05531784f, 0.04254613f, 0.04730144f, 0.07050022f, 0.15526930f, 0.22871460f +}; + +const float ivas_sns_cdbks_side_tcx20_stage2[ 32 * 16 ] = { + -0.01387178f, 0.00066194f, 0.01705500f, 0.00585076f, 0.05625865f, -0.08189174f, -0.29272907f, 0.00394582f, 0.14068978f, 0.03888049f, 0.01046905f, 0.03828706f, 0.04214951f, 0.02083198f, 0.00583650f, 0.00757601f, + -0.07101791f, -0.10250166f, 0.03818920f, 0.09162373f, 0.11895681f, 0.13465195f, 0.05088923f, -0.11144198f, -0.13846971f, -0.20720284f, -0.25737659f, -0.15071919f, 0.03249921f, 0.08124332f, 0.17587328f, 0.31480317f, + 0.07163217f, 0.02904662f, 0.01959293f, 0.00805967f, 0.02343380f, 0.02069451f, 0.03232257f, 0.02206815f, 0.03462995f, 0.01790113f, -0.03778174f, -0.14048245f, -0.21681559f, -0.11035045f, 0.05755451f, 0.16849432f, + -0.10816723f, -0.02739052f, -0.08241511f, -0.08220118f, -0.07911491f, 0.04976754f, 0.10255540f, 0.23875558f, 0.25687913f, 0.03165525f, -0.15819986f, -0.14652796f, -0.00803674f, -0.00055281f, -0.01439374f, 0.02738701f, + -0.02270156f, 0.02799492f, 0.14119353f, -0.06753253f, -0.07348415f, 0.16270911f, -0.00726861f, -0.06576199f, -0.02852827f, -0.01072544f, -0.02385080f, 0.01259492f, -0.00575096f, -0.00670975f, -0.01412345f, -0.01805497f, + -0.09730804f, -0.09207854f, -0.06155676f, -0.01193574f, 0.00669004f, 0.04165295f, 0.00840306f, -0.01763756f, -0.08511468f, -0.12564582f, -0.06302424f, 0.13694410f, 0.25188182f, 0.15335399f, 0.00198570f, -0.04661036f, + -0.20229607f, 0.27055253f, 0.05937269f, 0.00423687f, 0.02212468f, -0.00979552f, -0.02654450f, -0.02737173f, -0.03263414f, -0.01695365f, -0.02587673f, -0.00157241f, -0.00766337f, -0.00946241f, 0.00474761f, -0.00086382f, + 0.06446543f, -0.26714355f, 0.12269745f, 0.02565502f, -0.00628892f, 0.00430942f, 0.00862473f, -0.00170779f, 0.00617105f, -0.00718104f, -0.01871731f, 0.01193483f, 0.00860795f, 0.00997801f, 0.02026700f, 0.01832765f, + -0.00061741f, -0.03771131f, -0.03643531f, -0.01560727f, 0.00567664f, -0.00566226f, -0.00287572f, 0.03281006f, 0.04750282f, 0.01895354f, -0.01051254f, 0.01765380f, 0.01259038f, 0.00436097f, -0.01332776f, -0.01679868f, + 0.06930783f, 0.05302917f, 0.06102093f, 0.13367091f, 0.13415662f, 0.00542245f, -0.09926086f, -0.18333294f, -0.21849319f, -0.08349384f, 0.02026711f, 0.05881583f, 0.01345789f, 0.01158885f, 0.01962784f, 0.00421544f, + 0.00361302f, -0.05045316f, -0.00509374f, 0.19082766f, -0.18804365f, -0.05470887f, 0.00052718f, -0.02162397f, -0.00194290f, 0.00166374f, 0.00419055f, 0.02490528f, 0.02211515f, 0.02768455f, 0.02704636f, 0.01929285f, + 0.02476472f, -0.00405085f, -0.02659682f, -0.08596413f, -0.06315428f, -0.06855039f, -0.07500519f, -0.05011866f, -0.06108486f, -0.00618761f, 0.05634272f, 0.08835189f, 0.05894742f, 0.06729406f, 0.07762828f, 0.06738369f, + 0.13702164f, 0.08497052f, 0.07105828f, 0.04681336f, 0.02464482f, 0.00482884f, -0.01068152f, -0.00650854f, 0.01424842f, -0.00735400f, -0.04158832f, -0.02704081f, -0.04141575f, -0.06089035f, -0.09289456f, -0.09521199f, + -0.16780678f, 0.06667456f, 0.18201515f, 0.07399154f, -0.01999438f, 0.05535422f, 0.03900328f, -0.12016656f, -0.10793461f, 0.12328733f, 0.37944090f, 0.03265145f, -0.16138072f, -0.15224770f, -0.10548425f, -0.11740339f, + -0.01321210f, -0.01125461f, -0.03726540f, 0.00275729f, -0.04632781f, -0.24449670f, 0.09996640f, 0.11060024f, 0.00843480f, 0.01020953f, 0.01323100f, 0.03866782f, 0.01652133f, 0.01477176f, 0.01931947f, 0.01807687f, + 0.04427139f, 0.07762448f, -0.03500615f, -0.18353333f, 0.15726631f, 0.06121580f, -0.02944487f, -0.01882019f, -0.02386520f, 0.00077271f, -0.01038885f, 0.00869168f, -0.00564164f, -0.00937383f, -0.01500538f, -0.01876296f, + 0.13690793f, 0.01111401f, -0.03351651f, -0.01725554f, -0.07761571f, -0.12250939f, -0.07631311f, -0.01738486f, 0.14254332f, 0.21322328f, 0.14586930f, 0.03233900f, -0.08363281f, -0.12036013f, -0.07612890f, -0.05727984f, + 0.02949784f, -0.12225020f, -0.24763790f, 0.09504104f, 0.18885156f, 0.02619185f, 0.01292378f, 0.03000215f, 0.00909582f, -0.00936785f, -0.02571287f, 0.00889712f, -0.00234566f, -0.00169068f, 0.00871879f, -0.00021486f, + -0.03852054f, -0.03889437f, -0.08884280f, -0.06896184f, 0.02214326f, 0.10225505f, 0.12832898f, 0.08401269f, 0.06576567f, 0.08182152f, 0.07603111f, 0.04006712f, -0.04791395f, -0.09454805f, -0.10354215f, -0.11920167f, + 0.00938218f, 0.04681937f, 0.08173506f, 0.03766262f, 0.00645705f, -0.03830769f, -0.01180921f, 0.28211251f, 0.02788724f, -0.25197511f, -0.12812732f, 0.01575526f, 0.01158131f, -0.01435589f, -0.04416799f, -0.03064940f, + 0.06374854f, 0.12417689f, 0.09544838f, -0.13379816f, -0.26304159f, -0.06323982f, 0.03308697f, 0.06602140f, 0.04869582f, 0.02626429f, 0.00579212f, 0.01966626f, -0.00288156f, -0.00594553f, -0.00083407f, -0.01315989f, + -0.01689007f, -0.05224654f, -0.05732359f, 0.00797541f, -0.01178359f, -0.06878838f, -0.08592686f, -0.01631491f, -0.01215461f, 0.04690048f, 0.18175850f, 0.26923595f, 0.13470179f, -0.02451530f, -0.12744548f, -0.16718270f, + -0.02187075f, -0.05395855f, -0.02263713f, -0.00045869f, 0.07200871f, 0.08343703f, 0.05673476f, -0.01486174f, 0.02824052f, 0.09407959f, 0.06117651f, -0.48782246f, -0.01849447f, 0.15501071f, 0.05869060f, 0.01072538f, + 0.38479396f, -0.04937867f, -0.07935772f, -0.02506650f, -0.02316760f, -0.02067798f, 0.02695150f, -0.00054291f, -0.05256493f, -0.03399701f, -0.04629317f, -0.01085654f, -0.01817534f, -0.02213798f, -0.01605045f, -0.01347864f, + -0.23847427f, -0.06501920f, -0.01803515f, -0.00348509f, 0.04039109f, 0.01940591f, 0.01835329f, 0.03075053f, 0.03001602f, 0.02853897f, 0.01016726f, 0.03707260f, 0.02160199f, 0.03493100f, 0.03506401f, 0.01872098f, + 0.03862266f, 0.02890076f, 0.02592629f, 0.04317070f, 0.03495444f, -0.02192080f, -0.03469867f, -0.01962511f, -0.02362473f, -0.09521267f, -0.13881717f, -0.03271523f, 0.01372571f, 0.05875682f, 0.06459397f, 0.05796305f, + -0.01487374f, 0.01485744f, 0.01264233f, 0.04546350f, 0.00733058f, 0.08289797f, 0.17793293f, 0.03071348f, -0.11739129f, -0.07170388f, -0.04800450f, -0.00719781f, -0.01613242f, -0.02445791f, -0.03329781f, -0.03877884f, + 0.06919396f, -0.04913878f, -0.23414589f, -0.32278902f, -0.15262688f, -0.02830432f, 0.05881428f, 0.05602689f, 0.08630162f, 0.08206753f, 0.05235369f, 0.05459854f, 0.02224523f, 0.07894449f, 0.13055514f, 0.09590365f, + -0.13456165f, -0.02675728f, 0.10718846f, 0.16038985f, 0.13314470f, 0.04370885f, 0.00879630f, 0.02004215f, 0.04004457f, 0.01767300f, -0.03006764f, -0.02489721f, -0.06793547f, -0.08666415f, -0.07647774f, -0.08362676f, + -0.01963376f, -0.05985601f, -0.06123515f, 0.00802984f, 0.03197310f, 0.08198580f, -0.04518129f, -0.25550460f, -0.02763673f, 0.10534295f, 0.06276998f, 0.04687612f, 0.02909544f, 0.03184387f, 0.04253063f, 0.02859974f, + -0.05005194f, 0.08455623f, 0.27160784f, 0.05333258f, -0.06395559f, -0.12989814f, -0.07303311f, -0.05166257f, -0.03661287f, -0.00149673f, -0.00090933f, 0.02163393f, 0.00899793f, -0.00065646f, -0.01328460f, -0.01856715f, + 0.08465235f, 0.18910437f, -0.17964239f, -0.01596332f, -0.01786381f, -0.02173723f, 0.00655794f, -0.00747303f, -0.01909382f, -0.01073786f, -0.01461080f, 0.01419150f, 0.00349640f, -0.00567498f, -0.00358136f, -0.00162392f +}; + +const float *const ivas_sns_cdbks_side_tcx20[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx20_stage1, ivas_sns_cdbks_side_tcx20_stage2 }; + +const float ivas_sns_means_side_tcx10[M] = { + -0.0085f , 0.0070f , 0.0074f , 0.0045f, + -0.0038f , 0.0071f , 0.0040f , -0.0068f, + -0.0104f , -0.0095f , -0.0259f , -0.0163f, + 0.0127f , 0.0087f , 0.0036f , 0.0262f +}; + +const float ivas_sns_cdbks_side_tcx10_stage1[ 32 * 16 ] = { + -0.23085418f, -0.21005449f, -0.18570241f, -0.13606880f, -0.11948469f, -0.10308038f, -0.11104958f, -0.15882089f, -0.13896854f, -0.06621316f, 0.05217852f, 0.11795393f, 0.15762859f, 0.26837024f, 0.37542593f, 0.48873907f, + 0.13745600f, 0.20131847f, 0.22182278f, 0.29526068f, 0.24656821f, 0.13757111f, 0.07460669f, 0.03134436f, -0.06561883f, -0.17480962f, -0.24070771f, -0.31627147f, -0.28865063f, -0.14849001f, -0.03399112f, -0.07740884f, + -0.13299250f, -0.14002491f, -0.11936499f, -0.04179630f, -0.03438902f, 0.04431344f, 0.06951552f, 0.01403797f, 0.05531963f, -0.01394528f, -0.09745552f, 0.00448586f, 0.26823524f, 0.23321159f, 0.06675539f, -0.17590634f, + 0.06191756f, 0.11582434f, 0.13192343f, 0.09527126f, 0.08193836f, 0.01139745f, 0.03044540f, 0.11065563f, 0.07578016f, -0.02083963f, -0.07297648f, -0.08340844f, -0.07282079f, -0.12840160f, -0.18605485f, -0.15065167f, + -0.03483375f, -0.04038755f, -0.07410056f, -0.06961358f, -0.04495163f, -0.12359739f, -0.20954724f, -0.19583867f, -0.14529606f, 0.00841374f, 0.12968518f, 0.22831580f, 0.23147392f, 0.13653895f, 0.09511995f, 0.10861877f, + 0.06658553f, 0.21860187f, 0.09436141f, -0.09071645f, -0.07082980f, 0.04518200f, 0.04859027f, -0.03547180f, -0.06006165f, -0.02756024f, 0.00158143f, -0.01511772f, -0.04477551f, -0.04937419f, -0.04159366f, -0.03940128f, + 0.02864506f, -0.04039106f, -0.15284948f, -0.42538299f, -0.19236357f, 0.03104685f, 0.02253710f, 0.02311004f, 0.04867318f, 0.06745871f, 0.09338212f, 0.09710035f, 0.07856015f, 0.09301454f, 0.11632315f, 0.11113598f, + 0.14528623f, 0.29868967f, 0.46429789f, 0.54323288f, 0.40204138f, 0.26355278f, 0.17207026f, 0.09889195f, -0.00279626f, -0.16206412f, -0.29083020f, -0.40501466f, -0.54537297f, -0.46768767f, -0.27766915f, -0.23662804f, + -0.38143153f, -0.38286102f, -0.37711911f, -0.29609917f, -0.25719669f, -0.20628984f, -0.15545466f, -0.08387721f, -0.03028209f, 0.14307072f, 0.32718172f, 0.40216059f, 0.39369890f, 0.30234268f, 0.29650354f, 0.30565312f, + 0.35958422f, 0.51604595f, 0.41116626f, 0.13914238f, -0.03378266f, -0.13855653f, -0.18788816f, -0.17389274f, -0.14739128f, -0.16521614f, -0.14451729f, -0.13567903f, -0.09514774f, -0.07488226f, -0.06811874f, -0.06086662f, + -0.66004345f, -0.31718869f, -0.22177390f, -0.12449418f, -0.09939825f, 0.07331022f, 0.21408044f, 0.21558931f, 0.11208625f, 0.04257974f, -0.01807639f, 0.09442548f, 0.06053141f, 0.06888331f, 0.20357028f, 0.35591847f, + -0.16304924f, -0.12420037f, -0.04222860f, 0.05588216f, 0.18467874f, 0.32957705f, 0.39156897f, 0.27848510f, 0.13897139f, -0.02741662f, -0.14580317f, -0.19651482f, -0.22072919f, -0.18213237f, -0.12846721f, -0.14862176f, + -0.17887269f, -0.40659902f, -0.02516902f, 0.09601495f, 0.06138763f, 0.02130781f, 0.05102018f, 0.04939750f, 0.05199909f, 0.05639114f, 0.06766195f, 0.07106289f, 0.04938017f, 0.02276475f, 0.00986626f, 0.00238653f, + 0.35668951f, 0.22742896f, -0.06232152f, -0.18667516f, -0.28394315f, -0.31893226f, -0.28501785f, -0.19154472f, -0.14625471f, -0.07293625f, 0.05620192f, 0.15269426f, 0.20840665f, 0.19892856f, 0.16095072f, 0.18632539f, + -0.04935166f, -0.11272268f, 0.08233717f, 0.29988006f, 0.19331526f, 0.14054174f, 0.08680898f, -0.01410902f, -0.04313985f, -0.03494681f, -0.04540697f, -0.07243925f, -0.09250963f, -0.09472804f, -0.10148439f, -0.14204503f, + 0.18485137f, 0.25341568f, 0.21009944f, 0.20568550f, 0.20518381f, 0.27019582f, 0.21216885f, 0.00546777f, -0.00044021f, -0.10735443f, -0.20735090f, -0.14224940f, -0.09351389f, -0.09761419f, -0.36078632f, -0.53775866f, + -0.37281135f, -0.49261999f, -0.36727842f, -0.16577288f, -0.02238290f, 0.00199674f, -0.01679564f, 0.04714198f, 0.10589472f, 0.16394573f, 0.18921056f, 0.20782063f, 0.19861654f, 0.19447370f, 0.17625681f, 0.15230414f, + 0.06686853f, 0.05611921f, 0.03365910f, 0.02756852f, 0.08295478f, 0.06008045f, -0.03273553f, -0.04364718f, -0.01449926f, -0.16865975f, -0.29690154f, -0.15022460f, -0.01812698f, 0.04654261f, 0.11587511f, 0.23512676f, + 0.05629958f, -0.04922929f, -0.24893641f, -0.04282766f, 0.05664299f, 0.06157661f, 0.05406340f, 0.01868661f, -0.00352496f, -0.00155314f, 0.04576544f, 0.04384907f, 0.01829060f, 0.01451148f, 0.01064548f, -0.03425997f, + 0.00489548f, -0.00560306f, 0.00615573f, -0.00441324f, 0.02514502f, 0.02634783f, 0.01098806f, 0.01133668f, 0.06739798f, 0.14368795f, 0.11283267f, 0.01118776f, -0.08555990f, -0.10393666f, -0.11315265f, -0.10730981f, + -0.15112519f, -0.11783557f, -0.13754019f, -0.07632290f, -0.06121828f, -0.06360113f, -0.05018035f, -0.00549590f, 0.05908192f, 0.04630727f, 0.02538631f, -0.00811102f, -0.02567731f, 0.08327373f, 0.21071206f, 0.27234661f, + 0.56834545f, 0.15133540f, -0.01992277f, -0.04770211f, -0.05432411f, -0.02191499f, -0.02550971f, -0.03144176f, -0.02317891f, -0.02811835f, -0.04327235f, -0.06018613f, -0.07647819f, -0.07349573f, -0.08821391f, -0.12592196f, + -0.03137272f, -0.03974785f, -0.03770784f, -0.05600026f, -0.03191645f, -0.04815164f, -0.04304812f, 0.02455638f, 0.06207261f, 0.02331568f, -0.01876696f, -0.04473163f, -0.02498340f, 0.06425271f, 0.11960865f, 0.08262092f, + 0.45973777f, 0.45999547f, 0.38173824f, 0.22785755f, 0.16821465f, 0.17382620f, 0.20517627f, 0.04061839f, -0.12685907f, -0.26643193f, -0.37356030f, -0.36765140f, -0.32336919f, -0.29335060f, -0.29318189f, -0.07275984f, + -0.07969188f, -0.23669686f, -0.42690692f, -0.49932686f, -0.40006183f, -0.28450852f, -0.22942850f, -0.12475617f, -0.03421007f, 0.12993786f, 0.27530393f, 0.32731838f, 0.50859567f, 0.47553443f, 0.32383390f, 0.27506335f, + 0.34046042f, 0.28909102f, 0.17226731f, 0.06244214f, 0.10377957f, 0.13146006f, 0.03081777f, -0.02599206f, -0.11020633f, -0.20031818f, -0.27040991f, -0.19266314f, -0.09502591f, -0.17705982f, -0.16383079f, 0.10518781f, + -0.43345226f, 0.01054419f, 0.06653837f, 0.02899912f, 0.04789640f, 0.03995846f, 0.02631173f, 0.04744618f, 0.05142942f, 0.03249742f, 0.03044055f, 0.03518159f, 0.01592359f, 0.00998224f, -0.00417209f, -0.00552518f, + -0.35779590f, -0.24084024f, -0.08920896f, -0.01964746f, -0.04518980f, 0.07193759f, 0.22722040f, 0.28999718f, 0.39417664f, 0.30171530f, 0.12526317f, 0.00759665f, -0.11081727f, -0.17325866f, -0.19301481f, -0.18813416f, + -0.16184582f, -0.19051919f, -0.19758934f, -0.16274525f, -0.19869541f, -0.22576659f, -0.13506612f, 0.01672518f, 0.13044875f, 0.26035967f, 0.27598891f, 0.22195891f, 0.13262193f, 0.13096192f, 0.10021772f, 0.00294471f, + 0.07825952f, 0.06525092f, 0.17527642f, 0.02096373f, -0.24373383f, -0.29324959f, -0.11558339f, -0.03040273f, 0.01406029f, 0.04150557f, 0.06984124f, 0.07372710f, 0.06551062f, 0.06332513f, 0.02509070f, -0.00984142f, + 0.08701726f, 0.12843394f, 0.16700094f, 0.15034452f, 0.12947411f, -0.01656238f, -0.15483649f, -0.18970569f, -0.18557831f, -0.09352705f, -0.01998975f, -0.00988876f, 0.00753489f, 0.01530672f, 0.00965047f, -0.02467425f, + 0.26197082f, 0.21849905f, 0.21673972f, 0.16654799f, 0.18547759f, 0.16177425f, 0.16111117f, 0.20927596f, 0.18073438f, 0.03535012f, -0.14032550f, -0.22486416f, -0.33259461f, -0.40957544f, -0.38613800f, -0.30398287f +}; + +const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = { + -0.13993218f, -0.02453874f, 0.12672628f, 0.02785695f, 0.06681568f, 0.12811808f, 0.07492973f, -0.01977524f, -0.05822869f, -0.07547464f, -0.06553072f, -0.05473233f, -0.04357434f, -0.00634272f, 0.03406826f, 0.02961442f, + -0.06711216f, -0.11444162f, -0.09789788f, -0.09123304f, -0.12190348f, -0.00995424f, 0.10989921f, 0.11555575f, 0.06002452f, 0.03801973f, 0.02047622f, 0.01721280f, 0.02414692f, 0.02829613f, 0.03827912f, 0.05063187f, + 0.05523005f, 0.03052467f, 0.03910551f, 0.05802321f, 0.02158461f, 0.03249705f, 0.04015871f, -0.00878163f, -0.05597684f, -0.02391125f, 0.03722223f, 0.06349026f, 0.02718346f, -0.07380323f, -0.12743287f, -0.11511406f, + 0.11202279f, 0.20074913f, 0.04546646f, -0.10844616f, -0.14193153f, -0.08529745f, -0.03252409f, 0.03394947f, 0.04414551f, 0.00658101f, -0.01249852f, -0.01845361f, -0.01335408f, -0.01042434f, -0.00769413f, -0.01229041f, + -0.04167890f, -0.07371348f, -0.14826543f, 0.02126701f, 0.16009313f, 0.11910639f, 0.05602141f, 0.08082496f, 0.12544839f, 0.05415940f, -0.03080142f, -0.04070302f, -0.06024186f, -0.07129750f, -0.07769974f, -0.07251926f, + -0.07457123f, -0.04115197f, -0.04049765f, -0.06857318f, -0.04225051f, -0.03861733f, -0.05120942f, -0.08876715f, -0.05537668f, 0.03678654f, 0.09038235f, 0.06681871f, 0.08915640f, 0.13108744f, 0.08129597f, 0.00548771f, + -0.05294641f, 0.03370244f, 0.16024587f, 0.17199155f, 0.02454307f, -0.13278320f, -0.13945295f, -0.04199699f, 0.00678627f, 0.02029543f, 0.00856028f, 0.00137417f, -0.01135502f, -0.03017687f, -0.02257884f, 0.00379131f, + 0.20898804f, -0.01113044f, -0.08488316f, -0.01088633f, 0.03304903f, -0.01306932f, -0.05782260f, -0.07100917f, -0.06682249f, -0.05645623f, -0.04781041f, -0.03500698f, -0.01196148f, 0.03266111f, 0.08176223f, 0.11039842f +}; + +const float *const ivas_sns_cdbks_side_tcx10[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1, ivas_sns_cdbks_side_tcx10_stage2 }; + +#endif // SNS_MSVQ /* clang-format on */ diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index a095c9e4b4..9e3c431e70 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -115,10 +115,10 @@ extern const float tdm_LSF_MEAN_RE_USE_OUT[M]; extern const float tdm_LSF_MEAN_RE_USE_IN[M]; extern const float tdm_LSF_MEAN_RE_USE[M]; -extern const float tdm_Beta_Q1bit_re_use_132[2]; -extern const float tdm_Beta_Q1bit_re_use_164[2]; -extern const float tdm_Beta_Q1bit_re_use_244_320[2]; -extern const float tdm_Beta_Q1bit_re_use_480[2]; +extern const float tdm_Beta_Q1bit_re_use_13k2[2]; +extern const float tdm_Beta_Q1bit_re_use_16k4[2]; +extern const float tdm_Beta_Q1bit_re_use_24k4_32k[2]; +extern const float tdm_Beta_Q1bit_re_use_48k[2]; extern const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15]; #endif @@ -364,6 +364,9 @@ extern const float ivas_cos_twiddle_80[IVAS_80_PT_LEN >> 1]; extern const float ivas_mdft_coeff_cos_twid_240[IVAS_240_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_160[IVAS_160_PT_LEN + 1]; +#ifdef PARAMMC_SHORT_ENC_MDFT +extern const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1]; +#endif extern const float ivas_mdft_coeff_cos_twid_80[IVAS_80_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_40[IVAS_40_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_960[IVAS_960_PT_LEN + 1]; @@ -400,5 +403,32 @@ extern const float ivas_fb_resp_cheby_ramp_16del[IVAS_FB_1MS_16K_SAMP + 1]; extern const int16_t ivas_num_active_bands[FB - WB + 1]; +#ifdef SNS_MSVQ +/*------------------------------------------------------------------------------------------* + * SNS MSVQ codebooks and means + *------------------------------------------------------------------------------------------*/ +extern const int16_t ivas_sns_cdbks_tcx20_levels[]; +extern const int16_t ivas_sns_cdbks_tcx20_bits[]; + +extern const int16_t ivas_sns_cdbks_tcx10_levels[]; +extern const int16_t ivas_sns_cdbks_tcx10_bits[]; + +extern const float *const ivas_sns_cdbks_tcx20[]; +extern const float *const ivas_sns_cdbks_tcx10[]; + +extern const float ivas_sns_means_tcx20[]; +extern const float ivas_sns_means_tcx10[]; + +extern const int16_t ivas_sns_cdbks_side_tcx20_levels[]; +extern const int16_t ivas_sns_cdbks_side_tcx20_bits[]; +extern const int16_t ivas_sns_cdbks_side_tcx10_levels[]; +extern const int16_t ivas_sns_cdbks_side_tcx10_bits[]; + +extern const float *const ivas_sns_cdbks_side_tcx20[]; +extern const float ivas_sns_means_side_tcx20[]; +extern const float *const ivas_sns_cdbks_side_tcx10[]; +extern const float ivas_sns_means_side_tcx10[]; +#endif + /* IVAS_ROM_COM_H */ #endif diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 041a589ee3..7fceb7941f 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -43,7 +43,6 @@ /*----------------------------------------------------------------------------------* * Declaration of ISM common (encoder & decoder) structure *----------------------------------------------------------------------------------*/ -#ifdef FIX_379_ANGLE typedef struct { int16_t last_angle1_idx; /* last frame index of coded azimuth/yaw */ @@ -51,16 +50,6 @@ typedef struct int16_t last_angle2_idx; /* last frame index of coded elevation/pitch */ int16_t angle2_diff_cnt; /* FEC counter of consecutive differentially elevation/pitch coded frames */ } ISM_METADATA_ANGLE, *ISM_METADATA_ANGLE_HANDLE; -#else -typedef struct -{ - int16_t last_azimuth_idx; /* last frame index of coded azimuth */ - int16_t azimuth_diff_cnt; /* FEC counter of consecutive differentially azimuth coded frames */ - int16_t last_elevation_idx; /* last frame index of coded elevation */ - int16_t elevation_diff_cnt; /* FEC counter of consecutive differentially elevation coded frames */ - -} ISM_METADATA_ANGLE, *ISM_METADATA_ANGLE_HANDLE; -#endif /* ISM metadata handle (storage for one frame of read ISM metadata) */ typedef struct { @@ -70,23 +59,17 @@ typedef struct float azimuth; /* azimuth value read from the input metadata file */ float elevation; /* azimuth value read from the input metadata file */ float radius; - float yaw; /* azimuth orientation value read from the input metadata file */ - float pitch; /* elevation orientation value read from the input metadata file */ -#ifdef FIX_379_ANGLE + float yaw; /* azimuth orientation value read from the input metadata file */ + float pitch; /* elevation orientation value read from the input metadata file */ ISM_METADATA_ANGLE position_angle; /* Angle structs for azimuth and elevation */ ISM_METADATA_ANGLE orientation_angle; /* Angle structs for yaw and pitch */ -#else - ISM_METADATA_ANGLE angle[2]; /* Angle structs for [0] azimuth/elevation and [1] yaw/pitch */ -#endif - int16_t last_radius_idx; /* last frame index of coded radius */ - int16_t radius_diff_cnt; /* FEC counter of consecutive differentially radius coded frames */ + int16_t last_radius_idx; /* last frame index of coded radius */ + int16_t radius_diff_cnt; /* FEC counter of consecutive differentially radius coded frames */ -#ifdef DISCRETE_ISM_DTX_CNG float last_azimuth; /* MD smoothing in DTX- last Q azimuth value */ float last_elevation; /* MD smoothing in DTX - last Q elevation value */ float last_true_azimuth; /* MD smoothing in DTX- last true Q azimuth value */ float last_true_elevation; /* MD smoothing in DTX- last true Q elevation value */ -#endif } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; @@ -160,9 +143,6 @@ typedef struct ivas_param_ism_data_structure int16_t nbands; int16_t nblocks[MAX_PARAM_ISM_NBANDS]; int16_t band_grouping[MAX_PARAM_ISM_NBANDS + 1]; -#ifndef NCHAN_ISM_PARAMETER - int16_t num_obj; -#endif int16_t azi_index[MAX_NUM_OBJECTS]; int16_t ele_index[MAX_NUM_OBJECTS]; diff --git a/lib_com/ivas_stereo_td_bit_alloc.c b/lib_com/ivas_stereo_td_bit_alloc.c index 8b93558b21..b1fa0a49c8 100644 --- a/lib_com/ivas_stereo_td_bit_alloc.c +++ b/lib_com/ivas_stereo_td_bit_alloc.c @@ -487,7 +487,7 @@ void td_stereo_param_updt( static void tdm_SCh_LSF_intra_pred_zero_bits( const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ - float *pred_lsf_secondary, /* o : predicted secondary channel LSFs */ + float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */ const float *lsf_mean, /* i : secondary channel mean LSFs */ const float beta /* i : pull to average beta factor */ ) @@ -497,7 +497,7 @@ static void tdm_SCh_LSF_intra_pred_zero_bits( /* pulling the LSFs closer to the average */ for ( i = 0; i < M; i++ ) { - pred_lsf_secondary[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i]; + pred_lsf_SCh[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i]; } return; @@ -511,7 +511,7 @@ static void tdm_SCh_LSF_intra_pred_zero_bits( *-------------------------------------------------------------------*/ static void tdm_SCh_LSF_intra_pred_tri_diag_mat( - float *lsf_secondary, /* i/o: secondary channel LSFs */ + float *lsf_SCh, /* i/o: secondary channel LSFs */ const float *lsf_mean_in, /* i : secondary channel mean LSFs (in) */ const float *lsf_mean_out, /* i : secondary channel mean LSFs (out) */ const float *prd_diag_3 /* i : secondary channel mean LSFs */ @@ -522,37 +522,38 @@ static void tdm_SCh_LSF_intra_pred_tri_diag_mat( const float *prd_ptr; float *lsf_tmp_ptr1; float *lsf_tmp_ptr2; - float *lsf_second_ptr; + float *lsf_SCh_ptr; prd_ptr = prd_diag_3; - v_sub( lsf_secondary, lsf_mean_in, lsf_tmp, M ); + v_sub( lsf_SCh, lsf_mean_in, lsf_tmp, M ); lsf_tmp_ptr1 = lsf_tmp; - lsf_second_ptr = lsf_secondary; + lsf_SCh_ptr = lsf_SCh; lsf_tmp_ptr2 = lsf_tmp_ptr1; - *lsf_second_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); - ( *lsf_second_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ ); + *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); + ( *lsf_SCh_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ ); for ( i = 1; i < M - 1; i++ ) { lsf_tmp_ptr1 = lsf_tmp_ptr2; - *lsf_second_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); + *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); lsf_tmp_ptr2 = lsf_tmp_ptr1; - *lsf_second_ptr += ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); - ( *lsf_second_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ ); + *lsf_SCh_ptr += ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); + ( *lsf_SCh_ptr++ ) += ( *lsf_tmp_ptr1 ) * ( *prd_ptr++ ); } lsf_tmp_ptr1 = lsf_tmp_ptr2; - *lsf_second_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); - *lsf_second_ptr += ( *lsf_tmp_ptr1 ) * ( *prd_ptr ); + *lsf_SCh_ptr = ( *lsf_tmp_ptr1++ ) * ( *prd_ptr++ ); + *lsf_SCh_ptr += ( *lsf_tmp_ptr1 ) * ( *prd_ptr ); - v_add( lsf_secondary, lsf_mean_out, lsf_secondary, M ); + v_add( lsf_SCh, lsf_mean_out, lsf_SCh, M ); return; } + /*-------------------------------------------------------------------* * tdm_SCh_LSF_intra_pred() * @@ -562,7 +563,7 @@ static void tdm_SCh_LSF_intra_pred_tri_diag_mat( void tdm_SCh_LSF_intra_pred( const int32_t element_brate, /* i : element bitrate */ const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ - float *pred_lsf_secondary /* o : predicted secondary channel LSFs */ + float *pred_lsf_SCh /* o : predicted secondary channel LSFs */ ) { float fixed_beta; @@ -588,15 +589,45 @@ void tdm_SCh_LSF_intra_pred( fixed_beta = 0.91F; } - tdm_SCh_LSF_intra_pred_zero_bits( tdm_lsfQ_PCh, pred_lsf_secondary, tdm_LSF_MEAN_PRED_QNT, fixed_beta ); + tdm_SCh_LSF_intra_pred_zero_bits( tdm_lsfQ_PCh, pred_lsf_SCh, tdm_LSF_MEAN_PRED_QNT, fixed_beta ); - tdm_SCh_LSF_intra_pred_tri_diag_mat( pred_lsf_secondary, tdm_LSF_MEAN_PRED_QNT_IN, tdm_LSF_MEAN_PRED_QNT_OUT, tdm_PRED_QNT_fixed_beta_prd_diag_3 ); + tdm_SCh_LSF_intra_pred_tri_diag_mat( pred_lsf_SCh, tdm_LSF_MEAN_PRED_QNT_IN, tdm_LSF_MEAN_PRED_QNT_OUT, tdm_PRED_QNT_fixed_beta_prd_diag_3 ); return; } #ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + +/*-------------------------------------------------------------------* + * tdm_SCh_LSF_intra_pred_one_bit_dec() + * + * + *-------------------------------------------------------------------*/ + +static void tdm_SCh_LSF_intra_pred_one_bit_dec( + const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ + float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */ + const float *lsf_mean, /* i : secondary channel mean LSFs */ + const float *Beta_Q_x, /* i : beta quantization values */ + const int16_t beta_index /* i : the quantization bits for beta (-1 if beta fixed)*/ +) +{ + int16_t i; + float beta; + + beta = Beta_Q_x[beta_index]; + + /* pulling the LSFs closer to the avergae */ + for ( i = 0; i < M; i++ ) + { + pred_lsf_SCh[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i]; + } + + return; +} + + /*-------------------------------------------------------------------* * tdm_SCh_LSF_intra_pred_one_bit_enc() * @@ -604,29 +635,28 @@ void tdm_SCh_LSF_intra_pred( *-------------------------------------------------------------------*/ static void tdm_SCh_LSF_intra_pred_one_bit_enc( - const float *lsf_secondary, /* i : secondary channel LSFs */ - const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ - float *pred_lsf_secondary, /* o : predicted secondary channel LSFs */ - const float *lsf_mean, /* i : secondary channel mean LSFs */ - const float *lsf_wgts_new, /* i : Improved wgts for LSFs */ - const float *Beta_Q_x, /* i : beta quantization values */ - int16_t *beta_index /* o : the quantization bits for beta (-1 if beta fixed) */ + const float *lsf_SCh, /* i : secondary channel LSFs */ + const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ + float *pred_lsf_SCh, /* o : predicted secondary channel LSFs */ + const float *lsf_mean, /* i : secondary channel mean LSFs */ + const float *lsf_wgts_new, /* i : Improved wgts for LSFs */ + const float *Beta_Q_x, /* i : beta quantization values */ + int16_t *beta_index /* o : the quantization bits for beta (-1 if beta fixed) */ ) { int16_t i; float A_temp[M]; float B_temp[M]; float WD[2]; - float beta; for ( i = 0; i < M; i++ ) { - A_temp[i] = lsf_secondary[i] - lsf_mean[i]; + A_temp[i] = lsf_SCh[i] - lsf_mean[i]; B_temp[i] = lsf_mean[i] - tdm_lsfQ_PCh[i]; } - WD[0] = 0.; - WD[1] = 0.; + WD[0] = 0.f; + WD[1] = 0.f; for ( i = 0; i < M; i++ ) { WD[0] += lsf_wgts_new[i] * SQR( A_temp[i] ) + 2.0f * Beta_Q_x[0] * lsf_wgts_new[i] * A_temp[i] * B_temp[i] + lsf_wgts_new[i] * SQR( Beta_Q_x[0] ) * SQR( B_temp[i] ); @@ -635,49 +665,14 @@ static void tdm_SCh_LSF_intra_pred_one_bit_enc( if ( WD[0] < WD[1] ) { - beta = Beta_Q_x[0]; *beta_index = 0; } else { - beta = Beta_Q_x[1]; *beta_index = 1; } - /* pulling the LSFs closer to the avergae */ - for ( i = 0; i < M; i++ ) - { - pred_lsf_secondary[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i]; - } - - return; -} - - -/*-------------------------------------------------------------------* - * tdm_SCh_LSF_intra_pred_one_bit_dec() - * - * - *-------------------------------------------------------------------*/ - -static void tdm_SCh_LSF_intra_pred_one_bit_dec( - const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ - float *pred_lsf_secondary, /* o : predicted secondary channel LSFs */ - const float *lsf_mean, /* i : secondary channel mean LSFs */ - const float *Beta_Q_x, /* i : beta quantization values */ - const int16_t beta_index /* i : the quantization bits for beta (-1 if beta fixed)*/ -) -{ - int16_t i; - float beta; - - beta = Beta_Q_x[beta_index]; - - /* pulling the LSFs closer to the avergae */ - for ( i = 0; i < M; i++ ) - { - pred_lsf_secondary[i] = beta * tdm_lsfQ_PCh[i] + ( 1.0f - beta ) * lsf_mean[i]; - } + tdm_SCh_LSF_intra_pred_one_bit_dec( tdm_lsfQ_PCh, pred_lsf_SCh, tdm_LSF_MEAN_RE_USE, Beta_Q_x, *beta_index ); return; } @@ -696,26 +691,26 @@ void tdm_SCh_lsf_reuse( float lsp_new[M], /* i/o: LSPs at the end of the frame */ const float tdm_lsfQ_PCh[M], /* i : primary channel LSFs */ const float lsf_wgts[M], /* i : LSF weights */ - int16_t beta_index[] /* i/o: quantization index */ + int16_t *beta_index /* i/o: quantization index */ ) { const float *Beta_Q1bit_re_use; if ( element_brate <= IVAS_13k2 ) { - Beta_Q1bit_re_use = &tdm_Beta_Q1bit_re_use_132[0]; + Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_13k2; } else if ( element_brate <= IVAS_16k4 ) { - Beta_Q1bit_re_use = &tdm_Beta_Q1bit_re_use_164[0]; + Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_16k4; } else if ( element_brate <= IVAS_32k ) { - Beta_Q1bit_re_use = &tdm_Beta_Q1bit_re_use_244_320[0]; + Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_24k4_32k; } else { - Beta_Q1bit_re_use = &tdm_Beta_Q1bit_re_use_480[0]; + Beta_Q1bit_re_use = tdm_Beta_Q1bit_re_use_48k; } if ( enc_dec == ENC ) @@ -729,7 +724,7 @@ void tdm_SCh_lsf_reuse( tdm_SCh_LSF_intra_pred_tri_diag_mat( lsf_new, tdm_LSF_MEAN_RE_USE_IN, tdm_LSF_MEAN_RE_USE_OUT, tdm_RE_USE_adaptive_beta_prd_diag_3 ); - lsf2lsp( lsf_new, lsp_new, M, 12800 ); + lsf2lsp( lsf_new, lsp_new, M, INT_FS_12k8 ); return; } diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c index 19321e21d9..5f0916dbd1 100644 --- a/lib_com/lsf_tools.c +++ b/lib_com/lsf_tools.c @@ -2027,6 +2027,64 @@ int16_t tcxlpc_get_cdk( return cdk; } +#ifdef ERI_FDCNGVQ_LOW_ROM +void dec_FDCNG_MSVQ_stage1( + int16_t j_full, /* i: index full range */ + int16_t n, /* i: dimension to generate */ + const float *invTrfMatrix, /* i: IDCT matrix for synthesis */ + const DCTTYPE idcttype, /* i: specify which IDCT */ + float *uq, /* o: synthesized stage1 vector */ + Word16 *uq_ind /* o: synthesized stage1 vector in BASOP */ +) +{ + int16_t col, segm_ind, j; + float dct_vec[FDCNG_VQ_MAX_LEN]; + float idct_vec[FDCNG_VQ_MAX_LEN]; + const Word8 *cbpW8; + const Word16 *dct_col_shift_tab; + + assert( n <= FDCNG_VQ_MAX_LEN ); + assert( n >= FDCNG_VQ_DCT_MINTRUNC ); + + segm_ind = 0; + for ( col = 1; col <= FDCNG_VQ_DCT_NSEGM; col++ ) + { + if ( j_full >= cdk1_ivas_cum_entries_per_segment[col] ) + { + segm_ind++; + } + } + + j = j_full - cdk1_ivas_cum_entries_per_segment[segm_ind]; /* j is the local segment index */ + + assert( j < cdk1_ivas_entries_per_segment[segm_ind] ); + + /* Word8 column variable Qx storage*/ + cbpW8 = cdk_37bits_ivas_stage1_W8Qx_dct_sections[segm_ind]; /* Word8 storage fixed ptr_init */ + cbpW8 += j * cdk1_ivas_cols_per_segment[segm_ind]; /* adaptive ptr init */ + dct_col_shift_tab = stage1_dct_col_syn_shift[segm_ind]; + + for ( col = 0; col < cdk1_ivas_cols_per_segment[segm_ind]; col++ ) + { + dct_vec[col] = (float) ( ( (Word16) cbpW8[col] ) << dct_col_shift_tab[col] ); + /* LOGIC( 1 );SHIFT( 1 ); ADD( 1 ); + in BASOP: s_and(for W8->W16), shl(), sub() + */ + } + dctT2_N_apply_matrix( (const float *) dct_vec, idct_vec, cdk1_ivas_cols_per_segment[segm_ind], n, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, idcttype ); + + /*scale down to original fdcngvq domain and move to Q0 */ + v_multc( idct_vec, fdcng_dct_scaleF[1], idct_vec, n ); + /* fdcng_dct_scaleF[1] --> 0.0625-->scale down from search Q4 domain to Q0 , + not really relevant for BASOP loop */ + + /*add common mid fdcng vector, in fdcng bands domain */ + v_add( idct_vec, cdk1r_tr_midQ_truncQ, uq, n ); + assert( uq_ind == NULL ); +} +#endif + + /*--------------------------------------------------------------------------* * msvq_dec() * @@ -2042,8 +2100,12 @@ void msvq_dec( const int16_t N, /* i : Vector dimension */ const int16_t maxN, /* i : Codebook dimension */ const int16_t Idx[], /* i : Indices */ - float *uq, /* o : quantized vector */ - Word16 *uq_ind /* o : quantized vector (fixed point) */ +#ifdef ERI_FDCNGVQ_LOW_ROM + const int16_t applyIDCT_flag, /* i : applyIDCT flag */ + const float *invTrfMatrix, /* i: matrix for IDCT synthesis */ +#endif + float *uq, /* o : quantized vector */ + Word16 *uq_ind /* o : quantized vector (fixed point) */ ) { int16_t i, n, maxn, start; @@ -2079,9 +2141,32 @@ void msvq_dec( start = 0; } +#ifdef ERI_FDCNGVQ_LOW_ROM + if ( i == 0 && applyIDCT_flag != 0 ) + { + assert( start == 0 ); + dec_FDCNG_MSVQ_stage1( Idx[0], N, invTrfMatrix, IDCT_T2_XX_24, uq, uq_ind ); /* IDCT_T2 N=24 used for all synthesis */ + } + else + { + v_add( uq + start, cb[i] + Idx[i] * maxn, uq + start, n ); + } + #define WMC_TOOL_SKIP + IF( uq_ind != NULL ) + { + FOR( j = 0; j < n; ++j ) + { + move16(); + uq_ind[start + j] = add( uq_ind[start + j], (Word16) ( cb[i][Idx[i] * maxn + j] * 2.0f * 1.28f ) ); + } + } +#undef WMC_TOOL_SKIP +#else + v_add( uq + start, cb[i] + Idx[i] * maxn, uq + start, n ); +#define WMC_TOOL_SKIP IF( uq_ind != NULL ) { FOR( j = 0; j < n; ++j ) @@ -2091,6 +2176,7 @@ void msvq_dec( } } #undef WMC_TOOL_SKIP +#endif } return; @@ -2358,3 +2444,197 @@ void a2isf( return; } + +#ifdef ERI_FDCNGVQ_LOW_ROM +/*-------------------------------------------------------------------* + * dctT2_N_apply_matrix() + * + * dct/idct truncated matrix appl. for DCT basis vector lengths of N + *-------------------------------------------------------------------*/ +void dctT2_N_apply_matrix( + const float *input, + float *output, + const int16_t dct_dim, + int16_t fdcngvq_dim, + const float *matrix, + const int16_t matrix_row_dim, + DCTTYPE dcttype ) +{ + int16_t i, j, dim_in, dim_out; + int16_t mat_step_col, mat_step_row, mat_step_col_flag; + const float *pt_x, *pt_A; + float tmp_y[FDCNG_VQ_MAX_LEN]; + float *pt_y; + + /* non-square DCT_N and IDCT_N matrix application, + using a stored format of an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ + /* efficiently parallelized in SIMD */ + + assert( dct_dim <= FDCNG_VQ_DCT_MAXTRUNC ); + assert( fdcngvq_dim <= FDCNG_VQ_MAX_LEN ); + + if ( ( dcttype & 1 ) == 0 ) /* even entries are DCTs */ + { + /* DCT_typeII 24,21 -> XX in worst case */ + dim_in = fdcngvq_dim; + dim_out = dct_dim; + mat_step_col = matrix_row_dim; /* matrix maximum storage size dependent, width of first row in matrix */ + mat_step_row = 0; + mat_step_col_flag = 1; + assert( dcttype == DCT_T2_21_XX || dcttype == DCT_T2_24_XX ); + } + else + { + assert( ( dcttype & 1 ) != 0 ); /* idct */ + dim_in = dct_dim; + dim_out = fdcngvq_dim; + mat_step_col = 1; + mat_step_row = matrix_row_dim; + mat_step_col_flag = 0; + assert( dcttype == IDCT_T2_XX_24 ); + } + + pt_y = tmp_y; + for ( i = 0; i < dim_out; i++ ) + { + pt_x = input; + *pt_y = 0; + + /* +i(DCT) or +i*maxTrunc(IDCT) */ +#define WMC_TOOL_SKIP + pt_A = &( matrix[i * ( mat_step_row + mat_step_col_flag )] ); /* ptr indexing */ + PTR_INIT( 1 ); +#undef WMC_TOOL_SKIP + for ( j = 0; j < dim_in; j++ ) + { +#define WMC_TOOL_SKIP + *pt_y += ( *pt_x++ ) * ( *pt_A ); + pt_A += mat_step_col; /* step +maxtrunc or +1 */ /* ptr indexing*/ + MAC( 1 ); +#undef WMC_TOOL_SKIP + } + pt_y++; + } + mvr2r( tmp_y, output, dim_out ); +} + +/*-------------------------------------------------------------------* + * extend_dctN_input() + * + * (inputN, dctN) -> idct(N_ext) idct_N matrix application loop for + * extending, extrapolating a DCT basis vector length of N to N_ext + *-------------------------------------------------------------------*/ + +void extend_dctN_input( + const float *input, /* i: input in fdcng domain */ + const float *dct_input, /* i: input in dctN(fdcng) domain */ + const int16_t in_dim, /* i: in_dim == N */ + float *ext_sig, /* o: extended output in fdcng domain */ + const int16_t out_dim, /* i: output total dim */ + float *matrix, /* i: idct synthesis matrix N rows, n_cols columns */ + const int16_t n_cols, /* i: number of columns == DCT truncation length */ + DCTTYPE dcttype ) /* i: matrix operation type */ +{ + int16_t i, j, i_rev; + const float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix; + + /* stored format is an IDCT_Nx(FDCNG_VQ_DCT_MAXTRUNC) matrix */ + assert( in_dim < FDCNG_VQ_MAX_LEN ); + assert( out_dim <= FDCNG_VQ_MAX_LEN ); + assert( out_dim > in_dim ); + assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); /* for *ptr[MAX_TRUNC] adressing*/ + assert( ( dcttype & 1 ) != 0 ); /* idct tables always in use for this basis vector extension */ + + mvr2r( input, ext_sig, in_dim ); /* copy initial part, i.e. only last/tail parts are extended */ + set_f( &( ext_sig[in_dim] ), 0.0, out_dim - in_dim ); + + i_rev = in_dim; /*ptr init*/ + for ( i = in_dim; i < out_dim; i++ ) + { /* for each extension sample */ + /* i = 21 22 23; + i_rev = 20 19 18; for odd dctII reflect basis vector + */ + i_rev--; + + for ( j = 0; j < n_cols; j++ ) /* for each available DCT coeff */ + { + /* DCTcoeff * reflected basis vector */ +#define WMC_TOOL_SKIP + /* pure ptr MAC operations */ + ext_sig[i] += dct_input[j] * ptr[i_rev][j]; /* sum up scaled and extended basis vector */ + MAC( 1 ); +#undef WMC_TOOL_SKIP + } + } +} + + +/* inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in RAM from a quantized compressed ROM format */ +void create_IDCT_N_Matrix( float *inv_matrixFloatQ, const int16_t N, const int16_t n_cols, const int16_t alloc_size ) +{ + int16_t c, c1, r, r_flip, W16_val; + int16_t len; + int16_t mat_cpy_size; + const Word16 *absval_ptr; + const Word8 *idx_ptr; + Word16 idx; + float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) inv_matrixFloatQ; /* fixed number of columns pointers, to simplifies adressing in ANSIC */ + + absval_ptr = unique_idctT2_24coeffsQ16; + idx_ptr = idctT2_24_compressed_idx; + len = FDCNG_VQ_MAX_LEN; + + if ( N == FDCNG_VQ_MAX_LEN_WB ) + { + absval_ptr = unique_idctT2_21coeffsQ16; + idx_ptr = idctT2_21_compressed_idx; + len = N; + } + + assert( alloc_size >= ( n_cols * len ) ); /* enough space for the full expanded IDCT matrix */ + assert( N <= len ); + + mat_cpy_size = ( n_cols ) * ( len >> 1 ); /* NB integer division of "len" */ + + if ( ( len & 1 ) != 0 ) + { /* odd sized DCT with a non-reflected center row */ + mat_cpy_size += n_cols; + } + + for ( c = 0; c < mat_cpy_size; c++ ) + { + idx = (Word16) ( idx_ptr[c] ); + W16_val = absval_ptr[abs( idx )]; + + if ( idx < 0 ) + { + W16_val = -( W16_val ); + } + inv_matrixFloatQ[c] = ( +1.52587890625e-05f ) * ( (float) W16_val ); /* 1.0/2.^16 scaling to a float-"Q0" , a scaling that is not done in BASOP */ + } + + /* for even number of coeffs DCT24, + flip symmetry for odd, even is used to save 50% IDCT Table ROM */ + /* for an odd DCT center is not flipped e.g for DCT21 */ + + assert( n_cols == FDCNG_VQ_DCT_MAXTRUNC ); + assert( ( n_cols & 1 ) == 0 ); + + for ( c = 0; c < ( n_cols ); c += 2 ) + { + c1 = c + 1; + r_flip = len - 1; + for ( r = 0; r < ( len / 2 ); r++, r_flip-- ) + { +#define WMC_TOOL_SKIP + ptr[r_flip][c] = ptr[r][c]; /* flipped */ + ptr[r_flip][c1] = -( ptr[r][c1] ); /* flipped and sign swapped */ + MOVE( 2 ); + MULT( 1 ); /* for negate */ +#undef WMC_TOOL_SKIP + } + } +} + + +#endif diff --git a/lib_com/options.h b/lib_com/options.h index c279f8bc41..18b77cd678 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -83,7 +83,7 @@ /*#define ALLOW_BYTE_EP*/ /* allow byte fer pattern files and check fer pattern file validity */ #define WRAP_AS_EIDXOR /* wraps FER file (as in STL_eid-xor.c/softbit.c) */ -#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stere 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ +#define DEBUG_FORCE_MDCT_STEREO_MODE /* Force stereo mode decision for MDCT stereo: -stereo 3 1 forces L/R coding and -stereo 3 2 forces full M/S coding */ /*#define DEBUG_STEREO_DFT_NOCORE*/ /* DFT stereo: by-pass core coder at decoder side*/ /*#define DEBUG_STEREO_DFT_NOSTEREO*/ /* DFT stereo: by-pass stereo processing at encoder and decoder side*/ /*#define DEBUG_STEREO_DFT_NOQRES*/ @@ -136,38 +136,32 @@ #define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL -/*#define LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE */ /* switch to isolate the reuse mode case */ +#define LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE /* switch to isolate the reuse mode case */ #endif #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ -/*#define ITD_WINNER_GAIN_MODIFY */ /* ITD optimization - WORK IN PROGRESS */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_103_RA_PARAMS_PARAM_BIN_REND /* Issue 103: Digest room acoustics parameters for Parametric Binaural Renderer*/ -/*#define SBA_HPF_TUNING_DEC*/ +#define FIX_ISM_DTX_CNG_BWIDTH_ALT /* VA: issue 396 - alternative fix for bw changes on CNG frames in ISM DTX for objects that use the decoder-side noise estimation */ -#define FIX_350_MASA_DELAY_COMP /* Nokia: Issue 350: MASA audio/meta delay compensation */ -#define FIX_MDCT_BASED_BWD /* FhG: fixes for BWD for issues with reaction to transients for MDCT-stereo and MCT */ -#define DISCRETE_ISM_DTX_CNG /* FhG/VA: contribution 15 - DTX/CNG for (discrete) ISM */ -#define NCHAN_ISM_PARAMETER /* VA: make 'nchan_ism' parameter part of st_ivas/hEncoderConfig */ -#define FIX_382_MASA_META_FRAMING_ASYNC /* Nokia: Issue 382: detect potential MASA metadata framing offset */ -#define FIX_386_CORECODER_RECONFIG /* VA: Issue 386: Resolve ToDo comments in CoreCoder reconfig. */ +#define FIX_398_MASA_DIRECTION_ALIGNMENT /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */ +#define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ +#define FIX_419_ISM_MD_FIX /* VA: Issue 419: fix the upper value limitation for parameter angle1_diff_cnt */ +#define SNS_MSVQ /* FhG: contribution 33 - MSVQ for SNS parameters at stereo mid bitrates */ -#define SBA2MONO /* FhG: Issue 365: Adapt processing of SBA mono output to be in line with stereo output (less delay, lower complexity) */ -#define FIX_379_EXT_METADATA /* Eri: Extended metadata issues */ -#define FIX_379_ANGLE /* Eri: Extended metadata issues related to angle structure */ +#define FIX_379_GAININTP /* Eri: Adds a gain interpolation for directional/distance gain to handle abrupt changes in metadata (Non BE) */ +#define FIX_418_SID_BITRATE /* Eri: Issue 418: Using the correct bitrate for unified stereo SID */ +#define PARAMMC_SHORT_ENC_MDFT /* FhG: Issue 410: complexity optimization for parametric Multichannel modes */ +#define FIX_421_TD_INT_TUNE /* Eri: Issue 421: Increase use of interpolation in TD renderer filter transition */ +#define FIX_419_ISM_BRATE_SW_DTX /* VA: issue 419: fix ISM Bitrate Switching with dtx */ +#define FIX_422 /* FhG: Issue 422: re-introduce fix for noisy speech buffer in ParamISM */ -#define NOKIA_PARAMBIN_REQULARIZATION /* Nokia: Contribution - Configured reqularization factor for parametric binauralizer. */ -#define NOKIA_ADAPTIVE_BINAURAL_PROTOS /* Nokia: Contribution 28: Adaptive binaural prototypes */ -#define NOKIA_ADAPTIVE_BINAURAL_PROTOS_OPT /* Nokia: enable adaptive binaural prototype complexity optimizations */ +#define ERI_FDCNGVQ_LOW_ROM /* Eri: Contribution #31 Table ROM saving for IVAS FDCNG-VQ modes */ -#define FIX_389_EXT_REND_PCM_SR /* Nokia: Issue 389: Fix assignment of sample rate with PCM input. */ -#define FIX_390_EXT_REND_MASA_META_COPY /* Nokia: Issue 390: Fixes MASA metadata copying to renderer. */ -#define FIX_392_LATE_REVERB /* DLB : Issue 392: keep late reverb by default off when output config is not BINAURAL_ROOM*/ - -#define FIX_ISM_DTX_CLICKS /* FhG: fix for clicks in ISM DTX for inactive to active TCX transitions */ - -#define ISSUE_24_CLEANUP_MCT_LFE /* Issue 24: Cleanup LFE path withing MCT */ +#define FIX_401_DIRAC_RENDERER_META_READ_INDICES /* Nokia: Issue 401: Fix metadata reading indices in DirAC renderer. */ +#define FIX_406_IVAS_POSITION /* Eri: Issue 406: Unify IVAS_POSITION to use IVAS_VECTOR3 instead */ +#define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ +#define FIX_416_ISM_BR_SWITCHING /* FhG: add missing CLDFB reconfig to ISM BR switching */ #define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 65846708ef..c63a8d93de 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2323,8 +2323,10 @@ ivas_error acelp_core_enc( float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ int16_t *unbits, /* o : number of unused bits */ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +#ifndef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ +#endif + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); ivas_error acelp_core_switch_dec_bfi( @@ -3823,10 +3825,8 @@ void bw_detect( const float signal_in[], /* i : input signal */ float *spectrum, /* i : MDCT spectrum */ const float *enerBuffer /* i : energy buffer */ -#ifdef FIX_MDCT_BASED_BWD , const int16_t mct_on /* i : flag MCT mode */ -#endif ); @@ -4502,6 +4502,10 @@ ivas_error acelp_core_dec( const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + , + const int16_t read_sid_info /* i : read SID info flag */ +#endif ); void bass_psfilter_init( @@ -5856,13 +5860,11 @@ void core_switching_post_enc( ); ivas_error core_switching_post_dec( - Decoder_State *st, /* i/o: decoder state structure */ - float *synth, /* i/o: output synthesis */ - float *output, /* i/o: LB synth/upsampled LB synth */ - float output_mem[], /* i : OLA memory from last TCX/HQ frame */ -#ifdef FIX_ISM_DTX_CLICKS - const IVAS_FORMAT ivas_format, /* i : IVAS format */ -#endif + Decoder_State *st, /* i/o: decoder state structure */ + float *synth, /* i/o: output synthesis */ + float *output, /* i/o: LB synth/upsampled LB synth */ + float output_mem[], /* i : OLA memory from last TCX/HQ frame */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ const int16_t output_frame, /* i : frame length */ const int16_t core_switching_flag, /* i : ACELP->HQ switching frame flag */ @@ -7154,10 +7156,6 @@ void WindowSignal( float out[], /* o : output windowed signal */ const int16_t truncate_aldo, /* i : nonzero to truncate long ALDO slope */ const int16_t fullband /* i : fullband flag */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const int16_t isLfe /* i : LFE flag */ -#endif ); void HBAutocorrelation( @@ -7311,10 +7309,6 @@ void tcx_get_windows( int16_t *right_overlap, /* o : right overlap length */ const float **right_win, /* o : right overlap window */ const int16_t fullband /* i : fullband flag */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const int16_t isLfe /* i : LFE flag */ -#endif ); void tcx_windowing_analysis( @@ -8070,7 +8064,11 @@ void msvq_enc( const float w[], /* i : Weights */ const int16_t N, /* i : Vector dimension */ const int16_t maxN, /* i : Codebook dimension */ - int16_t Idx[] /* o : Indices */ +#ifdef ERI_FDCNGVQ_LOW_ROM + const int16_t applyDCT_flag, /* i : applyDCT flag */ + float *invTrfMatrix, /* i:/o expanded synthesis matrix */ +#endif + int16_t Idx[] /* o : Indices */ ); void msvq_dec( @@ -8081,9 +8079,51 @@ void msvq_dec( const int16_t N, /* i : Vector dimension */ const int16_t maxN, /* i : Codebook dimension */ const int16_t Idx[], /* i : Indices */ - float *uq, /* o : quantized vector */ - Word16 *uq_ind /* o : quantized vector (fixed point) */ -); +#ifdef ERI_FDCNGVQ_LOW_ROM + const int16_t applyIDCT_flag, /* i : applyIDCT flag */ + const float *invTrfMatrix, /* i: synthesis matrix */ +#endif + float *uq, /* o : quantized vector */ + Word16 *uq_ind /* o : quantized vector (fixed point) */ +); + +#ifdef ERI_FDCNGVQ_LOW_ROM +void dec_FDCNG_MSVQ_stage1( + int16_t j_full, /* i: index full range */ + int16_t n, /* i: dimension to generate */ + const float *invTrfMatrix, /* i: synthesis matrix */ + DCTTYPE idcttype, /* i: idct type */ + float *uq, /* o: synthesized stage1 vector */ + Word16 *uq_ind /* o: synthesized stage1 vector in BASOP */ +); + +void create_IDCT_N_Matrix( + float *inv_matrixFloatQ, /* i/o: RAM buffer */ + const int16_t N, /* i: DCT length , number of time samples */ + const int16_t n_cols, /* i: number of dct coeffs (as DCT may be truncated) */ + const int16_t alloc_size /* i: RAM buffer size in elements*/ +); + + +void dctT2_N_apply_matrix( + const float *input, /* i: input in fdcng or DCT(fdcng) domain */ + float *output, /* o: output in DCT(fdcng) or fdcng ordomain */ + const int16_t dct_dim, /* i: dct processing dim possibly truncated */ + int16_t fdcngvq_dim, /* i: fdcng domain length */ + const float *idctT2_N_16matrixQ16, /* i: IDCT matrix */ + const int16_t matrix_1st_dim, /* i: */ + DCTTYPE dcttype ); /* i: matrix operation type */ + +void extend_dctN_input( + const float *input, /* i: input in fdcng domain */ + const float *dct_input, /* i: input in dctN(fdcng) domain */ + const int16_t in_dim, /* i: in_dim==N */ + float *ext_sig, /* o: extended output in fdcng domain */ + const int16_t out_dim, /* i: output total dim */ + float *matrix, /* i: idct matrix of size N rows , n_cols columns*/ + const int16_t n_cols, /* i: number of columns == truncation length */ + DCTTYPE dcttype ); /* i: matrix type */ +#endif void PulseResynchronization( const float *src_exc, /* i : Input excitation buffer */ @@ -8222,14 +8262,14 @@ void lsf_end_enc( ); void lsf_end_dec( - Decoder_State *st, - const int16_t coder_type_org, - const int16_t bwidth, - const int16_t nBits, - float *qlsf, - int16_t *lpc_param, - int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ - int16_t *nb_indices + Decoder_State *st, /* i/o: decoder state structure */ + const int16_t coder_type_org, /* i : coding type */ + const int16_t bwidth, /* i : input signal bandwidth */ + const int16_t nBits, /* i : number of bits used for ISF quantization*/ + float *qlsf, /* o : quantized LSFs in the cosine domain */ + int16_t *lpc_param, /* i : LPC parameters */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + int16_t *nb_indices /* o : number of indices */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL , const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ @@ -8974,26 +9014,29 @@ int16_t BITS_ALLOC_config_acelp( ); ivas_error config_acelp1( - const int16_t enc_dec, /* i : encoder/decoder flag */ - const int32_t total_brate, /* i : total bitrate */ - const int32_t core_brate_inp, /* i : core bitrate */ - const int16_t core, /* i : core */ - const int16_t extl, /* i : extension layer */ - const int32_t extl_brate, /* i : extension layer bitrate */ - const int16_t L_frame, /* i : frame length at internal Fs */ - const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const int16_t signaling_bits, /* i : number of signaling bits */ - const int16_t coder_type, /* i : coder type */ - const int16_t tc_subfr, /* i : TC subfr ID */ - const int16_t tc_call, /* i : TC call number (0,1,2) */ - int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - int16_t *unbits, /* o : number of unused bits */ - const int16_t element_mode, /* i : element mode */ - int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - 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 idchan, /* i : channel id */ + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t core_brate_inp, /* i : core bitrate */ + const int16_t core, /* i : core */ + const int16_t extl, /* i : extension layer */ + const int32_t extl_brate, /* i : extension layer bitrate */ + const int16_t L_frame, /* i : frame length at internal Fs */ + const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ + ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ + const int16_t signaling_bits, /* i : number of signaling bits */ + const int16_t coder_type, /* i : coder type */ + const int16_t tc_subfr, /* i : TC subfr ID */ + const int16_t tc_call, /* i : TC call number (0,1,2) */ + int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ + int16_t *unbits, /* o : number of unused bits */ + const int16_t element_mode, /* i : element mode */ + int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ + 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 idchan, /* i : channel id */ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + const int16_t active_cnt, /* i : Active frame counter */ +#endif 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 GSC_IVAS_mode /* i : GSC IVAS mode */ @@ -9505,10 +9548,6 @@ void TonalMDCTConceal_Detect( const float pitchLag, /*IN */ int16_t *umIndices, /*OUT*/ const PsychoacousticParameters *psychParamsCurrent /*IN*/ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const int16_t isLfe -#endif ); void TonalMDCTConceal_Apply( @@ -9644,10 +9683,6 @@ int16_t getTnsAllowed( const int32_t total_brate, /* i : total bitrate */ const int16_t igf, /* i : flag indicating IGF activity*/ const int16_t element_mode /* i : IVAS element mode */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const MCT_CHAN_MODE mct_chan_mode /* i : MCT channel mode */ -#endif ); int16_t getCtxHm( @@ -9690,10 +9725,6 @@ int16_t getIgfPresent( const int32_t total_brate, /* i : total bitrate */ const int16_t bwidth, /* i : audio bandwidth */ const int16_t rf_mode /* i : flag to signal the RF mode */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const int16_t mct_chan_mode /* i : MCT channel mode */ -#endif ); int16_t getCnaPresent( @@ -9991,8 +10022,4 @@ void init_tcx_cfg( const int16_t element_mode, const int16_t ini_frame, const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0) */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const MCT_CHAN_MODE mct_chan_mode /* i : MCT channel mode */ -#endif ); diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index b0c0c61978..6701d39534 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -6036,6 +6036,299 @@ const FD_CNG_SETUP FdCngSetup_swb2 = { 640, 320, sizeof(sidPartitions_swb2)/size const int16_t levels_37bits[FD_CNG_stages_37bits] = { 128, 64, 64, 64, 64, 64 }; const int16_t bits_37bits[FD_CNG_stages_37bits] = { 7, 6, 6, 6, 6, 6 }; +#ifdef ERI_FDCNGVQ_LOW_ROM +/* IDCT_MATRIX_ROM: 18*24 Word16 = 432 Word16 */ +/* or compressed IDCT_MATRIX_ROM: 18*24 Word8 + 25 = 230 Word16 + WMOPS (INDIRECT(432) and STORE(432) ) */ + +/* Stage1 Word8 tables 16x8+ 17*10+ 17*16 + 78*18 = = 1974 Word8 -> 987 Word16 */ + +/* ROM storeSizeW8 = W8reduction (3072- (987+230) )/3072 = 1207/3072 --> 39.3 % */ +/* ROM with DCTII-24 in PROM = W8reduction (3072- (987) )/3072 = /3072 --> 31.8 % */ + +/* additional minor Table ROM ( dct_mid points 18 Word16, dct_col_upshifts 52, scaleFactors 2*2 = ~= 74 Word16s */ + + +const Word16 cdk1_ivas_entries_per_segment[FDCNG_VQ_DCT_NSEGM] = { 16, 17, 17, 78 }; +const Word16 cdk1_ivas_cum_entries_per_segment[FDCNG_VQ_DCT_NSEGM + 1] = { 0, 16 ,33, 50, 128 }; +const Word16 /* DCT trunc_len */ cdk1_ivas_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MINTRUNC, 10, 16, FDCNG_VQ_DCT_MAXTRUNC }; /* 8, 10, 16, 18 */ +const Word16 /* segment inner DCT trunc_len */ cdk1_ivas_trunc_dct_cols_per_segment[FDCNG_VQ_DCT_NSEGM] = { FDCNG_VQ_DCT_MAXTRUNC - FDCNG_VQ_DCT_MINTRUNC, FDCNG_VQ_DCT_MAXTRUNC - 10 , FDCNG_VQ_DCT_MAXTRUNC - 16 , 0 }; + +/* to get back to FDCNG VQ domain for segment S use : idct as follows */ +/* cdk1r_vec[col, row] = cdk1r_tr_midQ_truncQ(col 1:24 ) + invScaleFQ * idctMat( cdk1_ivas_dct_sS_W8[1:col]<tcx_mdct_window_length; - *left_win = hTcxCfg->tcx_mdct_window; - } - else - { -#endif - *left_overlap = hTcxCfg->tcx_mdct_window_length; - *left_win = hTcxCfg->tcx_aldo_window_1_trunc; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } -#endif + *left_overlap = hTcxCfg->tcx_mdct_window_length; + *left_win = hTcxCfg->tcx_aldo_window_1_trunc; } else { @@ -129,20 +106,8 @@ void tcx_get_windows( } else if ( right_mode == FULL_OVERLAP ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( isLfe ) - { - *right_overlap = hTcxCfg->tcx_mdct_window_length; - *right_win = hTcxCfg->tcx_mdct_window; - } - else - { -#endif - *right_overlap = hTcxCfg->tcx_mdct_window_delay; - *right_win = hTcxCfg->tcx_aldo_window_2; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } -#endif + *right_overlap = hTcxCfg->tcx_mdct_window_delay; + *right_win = hTcxCfg->tcx_aldo_window_2; } else { @@ -176,20 +141,8 @@ void tcx_get_windows( } else if ( left_mode == FULL_OVERLAP ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( isLfe ) - { - *left_overlap = hTcxCfg->tcx_mdct_window_lengthFB; - *left_win = hTcxCfg->tcx_mdct_windowFB; - } - else - { -#endif - *left_overlap = hTcxCfg->tcx_mdct_window_lengthFB; - *left_win = hTcxCfg->tcx_aldo_window_1_FB_trunc; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } -#endif + *left_overlap = hTcxCfg->tcx_mdct_window_lengthFB; + *left_win = hTcxCfg->tcx_aldo_window_1_FB_trunc; } else { @@ -215,20 +168,8 @@ void tcx_get_windows( } else if ( right_mode == FULL_OVERLAP ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( isLfe ) - { - *right_overlap = hTcxCfg->tcx_mdct_window_lengthFB; - *right_win = hTcxCfg->tcx_mdct_windowFB; - } - else - { -#endif - *right_overlap = hTcxCfg->tcx_mdct_window_delayFB; - *right_win = hTcxCfg->tcx_aldo_window_2_FB; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } -#endif + *right_overlap = hTcxCfg->tcx_mdct_window_delayFB; + *right_win = hTcxCfg->tcx_aldo_window_2_FB; } else { @@ -297,10 +238,6 @@ void WindowSignal( float out[], /* o : output windowed signal */ const int16_t truncate_aldo, /* i : nonzero to truncate long ALDO slope */ const int16_t fullband /* i : fullband flag */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const int16_t isLfe /* i : LFE flag */ -#endif ) { int16_t l, r; @@ -311,12 +248,7 @@ void WindowSignal( * Init * *-----------------------------------------------------------*/ - tcx_get_windows( hTcxCfg, left_overlap_mode, right_overlap_mode, &l, &left_win, &r, &right_win, fullband -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - isLfe -#endif - ); + tcx_get_windows( hTcxCfg, left_overlap_mode, right_overlap_mode, &l, &left_win, &r, &right_win, fullband ); /* Init lengths */ @@ -342,11 +274,7 @@ void WindowSignal( tcx_windowing_analysis( in - l / 2 + offset, *L_frame, l, left_win, r, right_win, out ); - if ( left_overlap_mode == FULL_OVERLAP && truncate_aldo -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && !isLfe -#endif - ) + if ( left_overlap_mode == FULL_OVERLAP && truncate_aldo ) { /* fade truncated ALDO window to avoid discontinuities */ if ( !fullband ) diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index eb53379d66..c89c5f53b0 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -77,6 +77,10 @@ ivas_error acelp_core_dec( const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + , + const int16_t read_sid_info /* i : read SID info flag */ +#endif ) { float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */ @@ -512,7 +516,11 @@ ivas_error acelp_core_dec( } else { +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) +#else if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT && st->read_sid_info ) +#endif { FdCng_decodeSID( st ); *sid_bw = 0; @@ -528,8 +536,13 @@ ivas_error acelp_core_dec( } ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } + +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + if ( !read_sid_info ) +#else if ( !st->read_sid_info ) // if (!st->read_sid_info && st->cng_ism_flag) /* read_sid_info can only be 0 in ParamISM mode */ +#endif { float noise_lvl_highest; @@ -614,11 +627,19 @@ ivas_error acelp_core_dec( nb_bits = -1; } +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#else config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#endif if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME ) /* ISfm: why is this called again after above */ { +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#else config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#endif } } @@ -650,25 +671,34 @@ ivas_error acelp_core_dec( if ( !tdm_lp_reuse_flag ) { - lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode #ifdef LSF_RE_USE_SECONDARY_CHANNEL - , - tdm_lsfQ_PCh + lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode, tdm_lsfQ_PCh ); +#else + lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode ); #endif - ); } else { const float *pt_interp_2; + #ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE - int16_t beta_index[1]; + if ( st->active_cnt != 1 ) + { + int16_t beta_index; - beta_index[0] = get_next_indice( st, TDM_IC_LSF_PRED_BITS ); - tdm_SCh_lsf_reuse( DEC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, NULL, beta_index ); + beta_index = get_next_indice( st, TDM_IC_LSF_PRED_BITS ); + tdm_SCh_lsf_reuse( DEC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, NULL, &beta_index ); + } + else + { + mvr2r( tdm_lspQ_PCh, lsp_new, M ); + mvr2r( tdm_lsfQ_PCh, lsf_new, M ); + } #else mvr2r( tdm_lspQ_PCh, lsp_new, M ); mvr2r( tdm_lsfQ_PCh, lsf_new, M ); #endif + if ( st->rate_switching_reset ) { /* extrapolation in case of unstable LSF convert */ diff --git a/lib_dec/acelp_core_switch_dec.c b/lib_dec/acelp_core_switch_dec.c index 6953551452..4a49d6b2db 100644 --- a/lib_dec/acelp_core_switch_dec.c +++ b/lib_dec/acelp_core_switch_dec.c @@ -158,7 +158,11 @@ ivas_error acelp_core_switch_dec( * Excitation decoding *----------------------------------------------------------------*/ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( DEC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st->element_mode, &i /*dummy*/, 0, 0, st->idchan, st->active_cnt, 0, 0, 0 /*st->GSC_IVAS_mode*/ ); +#else config_acelp1( DEC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st->element_mode, &i /*dummy*/, 0, 0, st->idchan, 0, 0, 0 /*st->GSC_IVAS_mode*/ ); +#endif decod_gen_voic_core_switch( st, L_frame_for_cs, 0, Aq, exc, cbrate ); diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c index b780db062f..6d02f18309 100644 --- a/lib_dec/cng_dec.c +++ b/lib_dec/cng_dec.c @@ -109,13 +109,13 @@ void CNG_dec( } else { - lsf_dec( st, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0 #ifdef LSF_RE_USE_SECONDARY_CHANNEL - , - NULL -#endif - ); + lsf_dec( st, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, NULL ); + } +#else + lsf_dec( st, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0 ); } +#endif } else { diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index 6d6ebeef86..aa8f576cec 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -190,12 +190,7 @@ void open_decoder_LPD( { if ( !is_init || st->element_mode != IVAS_CPE_MDCT ) { - init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->output_Fs, st->L_frame, st->bwidth, st->hTcxDec->L_frameTCX, st->fscale, encoderLookahead, encoderLookaheadFB, st->preemph_fac, st->tcxonly, st->rf_flag, st->igf, st->hIGFDec->infoIGFStopFreq, st->element_mode, st->ini_frame, MCT_flag ); } else { @@ -677,17 +672,9 @@ void open_decoder_LPD( st->second_last_core = -1; if ( st->hTcxCfg != NULL && -#ifndef ISSUE_24_CLEANUP_MCT_LFE - !MCT_flag && -#endif st->element_mode != EVS_MONO ) { - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( is_init ? total_brate : st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode ); } if ( hTcxDec != NULL ) { diff --git a/lib_dec/core_dec_switch.c b/lib_dec/core_dec_switch.c index b02d0a78f5..ef0a12696f 100644 --- a/lib_dec/core_dec_switch.c +++ b/lib_dec/core_dec_switch.c @@ -91,12 +91,7 @@ void mode_switch_decoder_LPD( switchWB = 1; /*force init when coming from MODE1*/ } - st->igf = getIgfPresent( st->element_mode, total_brate, bwidth, st->rf_flag -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, total_brate, bwidth, st->rf_flag ); if ( st->hIGFDec != NULL ) { @@ -145,12 +140,7 @@ void mode_switch_decoder_LPD( if ( st->hTcxCfg != NULL ) { st->hTcxCfg->pCurrentTnsConfig = NULL; - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, st->igf, st->element_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, st->igf, st->element_mode ); } if ( st->hTcxCfg->fIsTNSAllowed && st->hIGFDec != NULL && st->hTcxCfg != NULL ) diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index fc331a2e9f..9ae8550e40 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -552,13 +552,11 @@ ivas_error core_switching_pre_dec( *---------------------------------------------------------------------*/ ivas_error core_switching_post_dec( - Decoder_State *st, /* i/o: decoder state structure */ - float *synth, /* i/o: output synthesis */ - float *output, /* i/o: LB synth/upsampled LB synth */ - float output_mem[], /* i : OLA memory from last TCX/HQ frame */ -#ifdef FIX_ISM_DTX_CLICKS - const IVAS_FORMAT ivas_format, /* i : IVAS format */ -#endif + Decoder_State *st, /* i/o: decoder state structure */ + float *synth, /* i/o: output synthesis */ + float *output, /* i/o: LB synth/upsampled LB synth */ + float output_mem[], /* i : OLA memory from last TCX/HQ frame */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ const int16_t use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo */ const int16_t output_frame, /* i : frame length */ const int16_t core_switching_flag, /* i : ACELP->HQ switching flag */ @@ -680,11 +678,7 @@ ivas_error core_switching_post_dec( synth[i + delay_comp] = ( synth[i + delay_comp] * i + ( tmpDelta - i ) * st->previoussynth[i + delay_comp] ) / tmpDelta; } -#ifdef FIX_ISM_DTX_CLICKS if ( ( st->element_mode == IVAS_CPE_MDCT || ( ivas_format == ISM_FORMAT && st->core == TCX_20_CORE /* <- means TCX in general, TCX10 is forbidden after ACELP */ ) ) && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40 ) -#else - if ( st->element_mode == IVAS_CPE_MDCT && st->last_core_brate <= SID_2k40 && st->core_brate > SID_2k40 ) -#endif { /* smooth transitions to avoid pops in car noise items */ smoothTransitionDtxToTcx( synth, output_frame, delay_comp ); diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c index fbdd150217..9896d1d8c0 100644 --- a/lib_dec/dec_tcx.c +++ b/lib_dec/dec_tcx.c @@ -108,9 +108,6 @@ void decoder_tcx( decoder_tcx_imdct( st, L_frame_glob, L_frameTCX_glob, L_spec, tcx_offset, tcx_offsetFB, L_frame, L_frameTCX, left_rect, &x[0], &xn_buf[0], MDCT_IV, fUseTns, &synth[0], &synthFB[0], bfi, frame_cnt, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - 0, -#endif sba_dirac_stereo_flag ); return; @@ -339,11 +336,7 @@ void IMDCT( v_multc( old_syn_overl, hTcxDec->conceal_eof_gain * st->last_concealed_gain_syn_deemph, old_syn_overl, overlap ); } - if ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || st->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) && + if ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && ( st->tcxonly ) ) { /* Mode decision in PLC @@ -363,9 +356,6 @@ void IMDCT( if ( ( !bfi && hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) || ( bfi && ( hTcxCfg->tcx_last_overlap_mode != FULL_OVERLAP ) && ( hTcxCfg->tcx_curr_overlap_mode != FULL_OVERLAP ) ) ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE ); -#endif /* minimum or half overlap, two transforms, grouping into one window */ L_win = L_frame >> 1; L_ola = ( hTcxCfg->tcx_last_overlap_mode == MIN_OVERLAP ) ? tcx_mdct_window_min_length : tcx_mdct_window_half_length; @@ -403,11 +393,7 @@ void IMDCT( /* To assure that no garbage values are passed to overlap */ set_zero( xn_buf + L_frame + tcx_offset + ( L_ola >> 1 ), overlap - tcx_offset - ( L_ola >> 1 ) ); } - else if ( !bfi && ( frame_cnt == 0 ) && ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + else if ( !bfi && ( frame_cnt == 0 ) && ( hTcxCfg->tcx_curr_overlap_mode == FULL_OVERLAP ) ) { /* special overlap attempt, two transforms, grouping into one window */ @@ -568,11 +554,7 @@ void IMDCT( /* Window and overlap-add past frame if past frame is TCX */ if ( ( frame_cnt != 0 ) || ( st->last_core_bfi > ACELP_CORE ) ) { - if ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || st->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) && + if ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && ( st->tcxonly ) ) || ( hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ) { @@ -637,11 +619,7 @@ void IMDCT( } } - if ( !aldo && ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && frame_cnt > 0 ) || L_frameTCX != ( hTcxDec->L_frameTCX >> 1 ) ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( !aldo && ( ( ( L_frameTCX == hTcxDec->L_frameTCX >> 1 ) && frame_cnt > 0 ) || L_frameTCX != ( hTcxDec->L_frameTCX >> 1 ) ) ) { /* Compute windowed synthesis in case of switching to ALDO windows in next frame */ mvr2r( xn_buf + L_frame - nz, old_out, nz + overlap ); @@ -1582,11 +1560,8 @@ void decoder_tcx_imdct( const int16_t fUseTns, /* i : flag that is set if TNS data is present */ float synth[], /* i/o: synth[-M..L_frame] */ float synthFB[], - const int16_t bfi, /* i : Bad frame indicator */ - const int16_t frame_cnt, /* i : frame counter in the super frame */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t isLFE, /* i : is LFE */ -#endif + const int16_t bfi, /* i : Bad frame indicator */ + const int16_t frame_cnt, /* i : frame counter in the super frame */ const int16_t sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ ) { @@ -1619,9 +1594,6 @@ void decoder_tcx_imdct( } if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - !isLFE && -#endif st->igf ) { proc = st->hIGFDec->flatteningTrigger; @@ -1721,16 +1693,8 @@ void decoder_tcx_imdct( if ( st->element_mode != IVAS_CPE_DFT && !sba_dirac_stereo_flag ) { IMDCT( xn_bufFB, hTcxDec->syn_Overl, hTcxDec->syn_Overl_TDAC, xn_buf, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - st->mct_chan_mode == MCT_CHAN_MODE_LFE ? hTcxCfg->tcx_mdct_window : hTcxCfg->tcx_aldo_window_1_trunc, -#else hTcxCfg->tcx_aldo_window_1_trunc, -#endif -#ifndef ISSUE_24_CLEANUP_MCT_LFE - st->mct_chan_mode == MCT_CHAN_MODE_LFE ? hTcxCfg->tcx_mdct_window : hTcxCfg->tcx_aldo_window_2, -#else hTcxCfg->tcx_aldo_window_2, -#endif hTcxCfg->tcx_mdct_window_half, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_half_length, hTcxCfg->tcx_mdct_window_min_length, index, kernelType, left_rect, tcx_offset, overlap, L_frame, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frame_glob, frame_cnt, bfi, st->hHQ_core->old_outLB, 0, st, 0, acelp_zir ); } @@ -1752,11 +1716,7 @@ void decoder_tcx_imdct( if ( st->element_mode != EVS_MONO ) { IMDCT( x_tmp, hTcxDec->syn_OverlFB, hTcxDec->syn_Overl_TDACFB, xn_bufFB, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - st->mct_chan_mode == MCT_CHAN_MODE_LFE ? hTcxCfg->tcx_mdct_windowFB : hTcxCfg->tcx_aldo_window_1_FB_trunc, st->mct_chan_mode == MCT_CHAN_MODE_LFE ? hTcxCfg->tcx_mdct_windowFB : hTcxCfg->tcx_aldo_window_2_FB, -#else hTcxCfg->tcx_aldo_window_1_FB_trunc, hTcxCfg->tcx_aldo_window_2_FB, -#endif hTcxCfg->tcx_mdct_window_halfFB, hTcxCfg->tcx_mdct_window_minimumFB, hTcxCfg->tcx_mdct_window_transFB, hTcxCfg->tcx_mdct_window_half_lengthFB, hTcxCfg->tcx_mdct_window_min_lengthFB, index, kernelType, left_rect, tcx_offsetFB, overlapFB, L_frameTCX, L_frameTCX, max( L_frameTCX, L_spec ) >> 1, L_frameTCX_glob, frame_cnt, bfi, st->hHQ_core->old_out, 1, st, FSCALE_DENOM * L_frameTCX_glob / L_frame_glob, acelp_zir ); } diff --git a/lib_dec/dlpc_stoch.c b/lib_dec/dlpc_stoch.c index 1bbba46b1b..9a86d06224 100644 --- a/lib_dec/dlpc_stoch.c +++ b/lib_dec/dlpc_stoch.c @@ -81,32 +81,31 @@ void lpc_unquantize( { if ( st->sr_core == INT_FS_16k && coder_type == UNVOICED ) { - lsf_end_dec( st, GENERIC, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices #ifdef LSF_RE_USE_SECONDARY_CHANNEL - , - NULL + lsf_end_dec( st, GENERIC, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); +#else + lsf_end_dec( st, GENERIC, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices ); #endif - ); } else { if ( st->core == TCX_20_CORE ) { - lsf_end_dec( st, AUDIO, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices #ifdef LSF_RE_USE_SECONDARY_CHANNEL - , - NULL + lsf_end_dec( st, AUDIO, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); +#else + lsf_end_dec( st, AUDIO, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices ); #endif - ); } else { - lsf_end_dec( st, coder_type, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices #ifdef LSF_RE_USE_SECONDARY_CHANNEL - , - NULL -#endif + lsf_end_dec( st, coder_type, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); +#else + lsf_end_dec( st, coder_type, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices + ); +#endif } } diff --git a/lib_dec/er_util.c b/lib_dec/er_util.c index 75f553f1e8..5326f28e90 100644 --- a/lib_dec/er_util.c +++ b/lib_dec/er_util.c @@ -318,12 +318,7 @@ int16_t GetPLCModeDecision( { TonalMDCTConceal_Detect( st->hTonalMDCTConc, ( hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, &numIndices, - ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ); + ( st->element_mode == IVAS_CPE_MDCT ? &( st->hTcxCfg->psychParamsTCX20 ) : st->hTcxCfg->psychParamsCurrent ) ); if ( ( numIndices > 10 ) || ( ( numIndices > 5 ) && ( fabs( hTcxDec->tcxltp_third_last_pitch - hTcxDec->tcxltp_second_last_pitch ) < 0.5f ) ) || ( ( numIndices > 0 ) && ( ( st->last_good <= UNVOICED_TRANSITION ) || ( hTcxDec->tcxltp_last_gain_unmodified <= 0.4f ) ) && ( fabs( hTcxDec->tcxltp_third_last_pitch - hTcxDec->tcxltp_second_last_pitch ) < 0.5f ) ) ) { diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 0dbc0feafc..8ea2d71159 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -261,7 +261,11 @@ ivas_error evs_dec( if ( st->core == ACELP_CORE ) { /* ACELP core decoder */ +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) +#else if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -276,11 +280,7 @@ ivas_error evs_dec( * Postprocessing for ACELP/MDCT core switching *---------------------------------------------------------------------*/ -#ifdef FIX_ISM_DTX_CLICKS if ( ( error = core_switching_post_dec( st, synth, NULL, NULL, 0, MONO_FORMAT, output_frame, core_switching_flag, 0, -1, EVS_MONO ) ) != IVAS_ERR_OK ) -#else - if ( ( error = core_switching_post_dec( st, synth, NULL, NULL, 0, output_frame, core_switching_flag, 0, -1, EVS_MONO ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index ab9465a93a..cae9b6945f 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -420,17 +420,6 @@ void ApplyFdCng( hFdCngCom->sid_frame_counter = 0; /* set noise estimation inactive during concealment, as no update with noise generated by concealment should be performed. */ /* set noise estimation inactive when we have bit errors, as no update with noise generated by corrupt frame (biterror) should be performed. */ -#ifndef DISCRETE_ISM_DTX_CNG - if ( concealWholeFrame == 0 && - ( timeDomainInput == NULL || - ( *timeDomainInput( -FLT_MAX ) && - *( timeDomainInput + hFdCngCom->frameSize - 1 ) < FLT_MAX && - *( timeDomainInput + hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) && - ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && hFdCngDec->flag_dtx_mode ) || !st->VAD ) && - !( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) || - ( st->element_mode == IVAS_CPE_TD ) ) && - ( !st->BER_detect ) ) -#else if ( concealWholeFrame == 0 && ( timeDomainInput == NULL || ( *timeDomainInput( -FLT_MAX ) && @@ -440,7 +429,6 @@ void ApplyFdCng( !( st->cng_type == LP_CNG && hFdCngDec->flag_dtx_mode ) && ( is_music == 0 ) ) || ( st->element_mode == IVAS_CPE_TD ) ) && ( !st->BER_detect ) ) -#endif { /* Perform noise estimation at the decoder */ perform_noise_estimation_dec( timeDomainInput, powerSpectrum, hFdCngDec, st->element_mode, st->bwidth, L_frame, last_L_frame, st->last_core_brate, st->VAD ); @@ -978,10 +966,20 @@ void FdCng_decodeSID( float v[32]; int16_t indices[32]; HANDLE_FD_CNG_COM hFdCngCom; +#ifdef ERI_FDCNGVQ_LOW_ROM + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; +#endif +#ifndef ERI_FDCNGVQ_LOW_ROM const float *const *codebooks = ( st->element_mode == EVS_MONO ) ? cdk_37bits : cdk_37bits_ivas; +#endif const float gain_q_offset = ( st->element_mode == EVS_MONO ) ? GAIN_Q_OFFSET_EVS : GAIN_Q_OFFSET_IVAS; +#ifdef ERI_FDCNGVQ_LOW_ROM + invTrfMatrix = (float *) tmpRAM; +#endif + hFdCngCom = ( st->hFdCngDec )->hFdCngCom; sidNoiseEst = hFdCngCom->sidNoiseEst; @@ -999,7 +997,21 @@ void FdCng_decodeSID( index = get_next_indice( st, 7 ); /* MSVQ decoder */ + +#ifdef ERI_FDCNGVQ_LOW_ROM + if ( st->element_mode != EVS_MONO ) + { + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, v, NULL ); + } + else + { /* Legacy EVS_MONO MSVQ tables */ + msvq_dec( cdk_37bits, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v, NULL ); + } + +#else msvq_dec( codebooks, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, v, NULL ); +#endif /* Decode gain */ gain = ( (float) index - gain_q_offset ) / 1.5f; @@ -2004,6 +2016,16 @@ void FdCngDecodeMDCTStereoSID( int16_t indices[FD_CNG_stages_37bits]; int16_t N, i, ch, p, stages; int16_t is_out_ms; +#ifdef ERI_FDCNGVQ_LOW_ROM + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; +#endif + + +#ifdef ERI_FDCNGVQ_LOW_ROM + invTrfMatrix = (float *) tmpRAM; + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); +#endif is_out_ms = 0; if ( hCPE->hCoreCoder[0]->cng_sba_flag ) @@ -2047,7 +2069,11 @@ void FdCngDecodeMDCTStereoSID( } /* MSVQ decoder */ +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, ms_ptr[ch], NULL ); +#else msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices, ms_ptr[ch], NULL ); +#endif } dtx_read_padding_bits( sts[1], ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); @@ -2091,7 +2117,7 @@ void FdCngDecodeMDCTStereoSID( /*------------------------------------------------------------------- * FdCngDecodeDiracMDCTStereoSID() * - * Decode FD-Cng parameters for CNG in 2TC DirAC mode from the bitstream + * Decode FD-CNG parameters for CNG in 2TC DirAC mode from the bitstream *-------------------------------------------------------------------*/ void FdCngDecodeDiracMDCTStereoSID( @@ -2106,6 +2132,16 @@ void FdCngDecodeDiracMDCTStereoSID( float gain[CPE_CHANNELS]; int16_t indices[FD_CNG_stages_37bits]; int16_t N, i, ch, p; +#ifdef ERI_FDCNGVQ_LOW_ROM + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; +#endif + + +#ifdef ERI_FDCNGVQ_LOW_ROM + invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); +#endif for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -2128,7 +2164,11 @@ void FdCngDecodeDiracMDCTStereoSID( gain[1] = gain[0]; /* MSVQ decoder */ +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, ms_ptr[0], NULL ); +#else msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, ms_ptr[0], NULL ); +#endif mvr2r( ms_ptr[0], ms_ptr[1], N ); /*inverseMS( N, ms_ptr[0], ms_ptr[1], 1.f );*/ diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c index e8112c6c4d..29e134db25 100644 --- a/lib_dec/gs_dec.c +++ b/lib_dec/gs_dec.c @@ -111,7 +111,11 @@ void decod_audio( } /* set bit-allocation */ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, -1, 1, &nb_bits, NULL, st->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#else config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, -1, 1, &nb_bits, NULL, st->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#endif /*---------------------------------------------------------------* * Decode energy dynamics diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 97aa4a0fc8..20bc7a0b84 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -326,11 +326,7 @@ ivas_error init_decoder( set_f( st->old_synth_sw, 0.0f, NS2SA( 48000, FRAME_SIZE_NS - ACELP_LOOK_NS - DELAY_BWE_TOTAL_NS ) ); } - if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT || st->element_mode == IVAS_SCE || st->element_mode == EVS_MONO ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT || st->element_mode == IVAS_SCE || st->element_mode == EVS_MONO ) ) { if ( ( st->hHQ_core = (HQ_DEC_HANDLE) malloc( sizeof( HQ_DEC_DATA ) ) ) == NULL ) { @@ -523,21 +519,10 @@ ivas_error init_decoder( } /* open synthesis for output sampling rate */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { -#endif - if ( ( error = openCldfb( &st->cldfbSyn, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) - { - return error; - } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } - else + if ( ( error = openCldfb( &st->cldfbSyn, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { - st->cldfbSyn = NULL; + return error; } -#endif st->cldfbSynHB = NULL; @@ -593,11 +578,7 @@ ivas_error init_decoder( *-----------------------------------------------------------------*/ /* TCX-LTP */ - if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) { if ( ( st->hTcxLtpDec = (TCX_LTP_DEC_HANDLE) malloc( sizeof( TCX_LTP_DEC_DATA ) ) ) == NULL ) { @@ -629,11 +610,7 @@ ivas_error init_decoder( } /* TCX config. data structure */ - if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) { if ( ( st->hTcxCfg = (TCX_CONFIG_HANDLE) malloc( sizeof( TCX_config ) ) ) == NULL ) { @@ -646,11 +623,7 @@ ivas_error init_decoder( } /* Tonal MDCT concealment data structure */ - if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) { if ( ( st->hTonalMDCTConc = (TonalMDCTConcealPtr) malloc( sizeof( TonalMDCTConceal_INSTANCE ) ) ) == NULL ) { @@ -666,11 +639,7 @@ ivas_error init_decoder( * IGF *-----------------------------------------------------------------*/ - if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) { if ( ( st->hIGFDec = (IGF_DEC_INSTANCE_HANDLE) malloc( sizeof( IGFDEC_INSTANCE ) ) ) == NULL ) { @@ -763,10 +732,10 @@ ivas_error init_decoder( st->cna_dirac_flag = 0; st->cng_sba_flag = 0; st->cng_ism_flag = 0; +#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT st->read_sid_info = 1; /* by default read the sid info from bitstream */ -#ifdef DISCRETE_ISM_DTX_CNG - st->is_ism_format = 0; #endif + st->is_ism_format = 0; return error; diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 05c1f41727..516e027f90 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -90,6 +90,9 @@ ivas_error ivas_core_dec( int16_t use_cldfb_for_dft; float *p_output_mem; int16_t flag_sec_CNA; +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + int16_t read_sid_info; +#endif int16_t last_element_mode; int16_t nchan_out; float *save_hb_synth; @@ -105,6 +108,9 @@ ivas_error ivas_core_dec( use_cldfb_for_dft = 0; tdm_LRTD_flag = -1; +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + read_sid_info = 1; /* read SID by default */ +#endif if ( hSCE != NULL ) { @@ -116,6 +122,15 @@ ivas_error ivas_core_dec( hStereoTD = NULL; p_output_mem = NULL; nchan_out = 1; +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + if ( st_ivas != NULL && st_ivas->ivas_format == ISM_FORMAT ) + { + if ( st_ivas->hISMDTX.sce_id_dtx != hSCE->sce_id ) + { + read_sid_info = 0; + } + } +#endif } else { @@ -332,7 +347,11 @@ ivas_error ivas_core_dec( if ( st->core == ACELP_CORE ) { /* ACELP core decoder */ +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng, read_sid_info ) ) != IVAS_ERR_OK ) +#else if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -341,12 +360,7 @@ ivas_error ivas_core_dec( if ( ( st->core == TCX_20_CORE || st->core == TCX_10_CORE ) && st->element_mode != IVAS_CPE_MDCT ) { /* TCX decoder */ - stereo_tcx_core_dec( st, frameMode[n], output[n], synth[n], pitch_buf[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format -#ifndef DISCRETE_ISM_DTX_CNG - , - st_ivas == NULL ? 0 : st_ivas->ism_mode -#endif - ); + stereo_tcx_core_dec( st, frameMode[n], output[n], synth[n], pitch_buf[n], sba_dirac_stereo_flag, hStereoTD, last_element_mode, flag_sec_CNA, hCPE == NULL ? NULL : hCPE->hStereoCng, nchan_out, st_ivas == NULL ? 0 : st_ivas->ivas_format ); } if ( st->core == HQ_CORE ) @@ -451,11 +465,7 @@ ivas_error ivas_core_dec( mvr2r( synth[n], hSCE->save_synth, output_frame ); } -#ifdef FIX_ISM_DTX_CLICKS if ( ( error = core_switching_post_dec( st, synth[n], output[n], p_output_mem, ( st_ivas != NULL ) ? st_ivas->ivas_format : UNDEFINED_FORMAT, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, ( hCPE != NULL ) ? hCPE->last_element_mode : IVAS_SCE ) ) != IVAS_ERR_OK ) -#else - if ( ( error = core_switching_post_dec( st, synth[n], output[n], p_output_mem, use_cldfb_for_dft, output_frame, 0 /*core_switching_flag*/, sba_dirac_stereo_flag, nchan_out, ( hCPE != NULL ) ? hCPE->last_element_mode : IVAS_SCE ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index d2cf408dce..9d15f1bdfc 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -87,13 +87,8 @@ ivas_error ivas_corecoder_dec_reconfig( *-----------------------------------------------------------------*/ /* remove dummy CPE element for DFT stereo-like upmix */ -#ifdef SBA2MONO if ( ( st_ivas->ivas_format == SBA_FORMAT && sba_dirac_stereo_flag_old && nchan_transport_old == 1 && ( !st_ivas->sba_dirac_stereo_flag || st_ivas->nchan_transport > 1 ) ) || ( st_ivas->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && sba_dirac_stereo_flag_old && nchan_transport_old == 1 && ( !st_ivas->sba_dirac_stereo_flag || st_ivas->nchan_transport > 1 ) ) ) -#else - if ( ( st_ivas->ivas_format == SBA_FORMAT && sba_dirac_stereo_flag_old && !st_ivas->sba_dirac_stereo_flag ) || - ( st_ivas->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && sba_dirac_stereo_flag_old && !st_ivas->sba_dirac_stereo_flag ) ) -#endif { st_ivas->hCPE[0]->hCoreCoder[0] = NULL; st_ivas->hCPE[0]->hCoreCoder[1] = NULL; @@ -151,7 +146,6 @@ ivas_error ivas_corecoder_dec_reconfig( for ( cpe_id = st_ivas->nCPE; cpe_id < nCPE_old; cpe_id++ ) { -#ifdef SBA2MONO /* don't deallocate first CPE in case of mono/stereo output of 1 TC SBA, only deallocate core coder */ if ( cpe_id == 0 && st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old ) { @@ -167,7 +161,6 @@ ivas_error ivas_corecoder_dec_reconfig( } continue; } -#endif destroy_cpe_dec( st_ivas->hCPE[cpe_id] ); st_ivas->hCPE[cpe_id] = NULL; } @@ -207,13 +200,11 @@ ivas_error ivas_corecoder_dec_reconfig( return error; } } -#ifdef SBA2MONO if ( st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old && st_ivas->nchan_transport == 1 && nSCE_old == 0 ) { st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */ st_ivas->hCPE[0]->hCoreCoder[1] = NULL; } -#endif for ( cpe_id = 0; cpe_id < nCPE_existing; cpe_id++ ) { @@ -293,7 +284,6 @@ ivas_error ivas_corecoder_dec_reconfig( if ( ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_dirac_stereo_flag && !sba_dirac_stereo_flag_old ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->sba_dirac_stereo_flag && !sba_dirac_stereo_flag_old ) ) { -#ifdef SBA2MONO /* if at least one CPE is already available, only allocate DFT Stereo struct */ if ( st_ivas->nCPE > 0 ) { @@ -310,12 +300,6 @@ ivas_error ivas_corecoder_dec_reconfig( return error; } } -#else - if ( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif set_f( st_ivas->hCPE[0]->hStereoDft->buff_LBTCX_mem, 0, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) ); @@ -345,45 +329,10 @@ ivas_error ivas_corecoder_dec_reconfig( * Set CNA/CNG flags *-----------------------------------------------------------------*/ -#ifdef FIX_386_CORECODER_RECONFIG if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) { ivas_sba_set_cna_cng_flag( st_ivas ); } -#else - /// VE: this could be merged with part of ivas_init_decoder() - if ( st_ivas->ivas_format == SBA_FORMAT ) - { - if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 ) - { - /* skip as done in init function */ - } - else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; - st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; - } - else if ( st_ivas->nchan_transport == 2 ) - { - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; - st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1; - } - } - else - { - for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cna_dirac_flag = 0; - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 0; - } - } - } - } -#endif /* special case, if the decoder goes from 1TC DTX to 2TC active frame (in case the bitstream started with an SBA SID frame), allocate DTX memories */ if ( hDecoderConfig->last_ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE >= 1 ) @@ -563,11 +512,7 @@ ivas_error ivas_cldfb_dec_reconfig( } /* CLDFB Interpolation weights */ -#ifdef SBA2MONO if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) -#else - if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) ) -#endif { ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c old mode 100755 new mode 100644 index 5156aad08c..186d1c4c7d --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -405,11 +405,7 @@ ivas_error ivas_cpe_dec( } else { -#ifdef SBA2MONO stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 ); -#else - stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0 ); -#endif } /* synthesis iFFT */ @@ -691,12 +687,6 @@ ivas_error create_cpe_dec( st->total_brate = hCPE->element_brate / ( CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) - { - st->mct_chan_mode = MCT_CHAN_MODE_LFE; - } -#endif if ( ( error = init_decoder( st, n, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) { @@ -838,11 +828,7 @@ void destroy_cpe_dec( Decoder_State *st; /* make sure we deallocate a potential distinct hTcxCfg for a MCT LFE channel (can only happen in rs) */ /*TODO Check this again with LFE clean up!*/ - if ( hCPE->hCoreCoder[1] != NULL -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && hCPE->hCoreCoder[1]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - && hCPE->hCoreCoder[1]->hTcxCfg != hCPE->hCoreCoder[0]->hTcxCfg ) + if ( hCPE->hCoreCoder[1] != NULL && hCPE->hCoreCoder[1]->hTcxCfg != hCPE->hCoreCoder[0]->hTcxCfg ) { hCPE->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; } diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index b4eb783624..88e631908c 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -150,73 +150,17 @@ ivas_error ivas_dec( else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { // VE: call ivas_ism_metadata_dec() with 'st_ivas' - TBD -#ifdef DISCRETE_ISM_DTX_CNG -#ifdef NCHAN_ISM_PARAMETER -#ifdef FIX_379_EXT_METADATA if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef FIX_379_EXT_METADATA - if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm ) ) != IVAS_ERR_OK ) -#endif -#endif { return error; } -#else -#ifdef NCHAN_ISM_PARAMETER -#ifdef FIX_379_EXT_METADATA - ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ); -#else - ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm ); -#endif -#else -#ifdef FIX_379_EXT_METADATA - ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ); -#else - ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm ); -#endif -#endif -#endif } else /* ISM_MODE_DISC */ { -#ifdef DISCRETE_ISM_DTX_CNG -#ifdef NCHAN_ISM_PARAMETER -#ifdef FIX_379_EXT_METADATA if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef FIX_379_EXT_METADATA - if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL ) ) != IVAS_ERR_OK ) -#endif -#endif { return error; } -#else -#ifdef NCHAN_ISM_PARAMETER -#ifdef FIX_379_EXT_METADATA - ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ); -#else - ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, NULL ); -#endif -#else -#ifdef FIX_379_EXT_METADATA - ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ); -#else - ivas_ism_metadata_dec( ivas_total_brate, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, NULL ); -#endif -#endif -#endif } for ( n = 0; n < st_ivas->nchan_transport; n++ ) @@ -266,14 +210,18 @@ ivas_error ivas_dec( /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ ivas_ism_render( st_ivas, output, output_frame ); } +#ifdef REND_DEBUGGING_REVISION +#ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) +#else + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) +#endif +#else + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) +#endif { /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ -#ifdef NCHAN_ISM_PARAMETER ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); -#else - ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_transport, output_frame, st_ivas->hIntSetup.ambisonics_order ); -#endif } /* Binaural rendering */ @@ -371,15 +319,10 @@ ivas_error ivas_dec( nchan_remapped = st_ivas->nchan_transport; if ( st_ivas->sba_dirac_stereo_flag ) { -#ifdef SBA2MONO nchan_remapped = nchan_out; -#else - nchan_remapped = CPE_CHANNELS; -#endif if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { -#ifdef SBA2MONO ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); if ( st_ivas->hSpar->hPCA != NULL ) @@ -387,7 +330,6 @@ ivas_error ivas_dec( ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); } -#endif ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi ); } @@ -400,20 +342,7 @@ ivas_error ivas_dec( /* HP filtering */ #ifndef DEBUG_SPAR_BYPASS_EVS_CODEC -#ifdef SBA_HPF_TUNING_DEC - int16_t nchan_hp20; - if ( st_ivas->ivas_format == MASA_FORMAT ) - { - nchan_hp20 = nchan_remapped; - } - else - { - nchan_hp20 = getNumChanSynthesis( st_ivas ); - } - for ( n = 0; n < nchan_hp20; n++ ) -#else for ( n = 0; n < nchan_remapped; n++ ) -#endif { hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); } @@ -461,11 +390,7 @@ ivas_error ivas_dec( ivas_dirac_dec( st_ivas, output, nchan_remapped, NULL, NULL, -1 ); } } -#ifdef SBA2MONO else if ( !st_ivas->sba_dirac_stereo_flag && nchan_out != 1 ) -#else - else if ( !st_ivas->sba_dirac_stereo_flag ) -#endif { ivas_sba_upmixer_renderer( st_ivas, output, output_frame ); /* Note: ivas_sba_linear_renderer() or ivas_dirac_dec() are called internally */ } @@ -477,12 +402,6 @@ ivas_error ivas_dec( /* LFE channel decoder */ if ( st_ivas->mc_mode == MC_MODE_MCT ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg == NULL ) - { - st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg = st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg; - } -#endif ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch ); } diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 4d3d1adb3c..dfeb946a02 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -821,7 +821,6 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; -#ifdef FIX_350_MASA_DELAY_COMP if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; @@ -831,12 +830,6 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; hDirAC->dirac_bs_md_write_idx = DELAY_MASA_PARAM_DEC_SFR; } -#else - if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->mc_mode == MC_MODE_MCMASA ) - { - hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; - } -#endif else { int16_t num_slots_in_subfr; @@ -1715,7 +1708,6 @@ void ivas_qmetadata_to_dirac( if ( hMasa != NULL && ivas_total_brate > IVAS_SID_5k2 ) { -#ifdef FIX_350_MASA_DELAY_COMP int16_t meta_write_index; band_mapping = hMasa->data.band_mapping; @@ -1752,45 +1744,10 @@ void ivas_qmetadata_to_dirac( } } } -#else - band_mapping = hMasa->data.band_mapping; - for ( band = 0; band < hMasa->config.numCodingBands; ++band ) - { - for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) - { - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) - { - hDirAC->azimuth[block][b] = (int16_t) q_direction->band_data[band].azimuth[block]; - hDirAC->elevation[block][b] = (int16_t) q_direction->band_data[band].elevation[block]; - hDirAC->energy_ratio1[block][b] = q_direction->band_data[band].energy_ratio[block]; - hDirAC->diffuseness_vector[block][b] = 1.0f - q_direction->band_data[band].energy_ratio[block]; - - if ( q_direction->coherence_band_data != NULL ) - { - hDirAC->spreadCoherence[block][b] = q_direction->coherence_band_data[band].spread_coherence[block] / 255.0f; - } - else - { - hDirAC->spreadCoherence[block][b] = 0.0f; - } - - if ( hQMetaData->surcoh_band_data != NULL ) - { - hDirAC->surroundingCoherence[block][b] = hQMetaData->surcoh_band_data[band].surround_coherence[block] / 255.0f; - } - else - { - hDirAC->surroundingCoherence[block][b] = 0.0f; - } - } - } - } -#endif if ( hQMetaData->no_directions == 2 ) { q_direction = &( hQMetaData->q_direction[1] ); -#ifdef FIX_350_MASA_DELAY_COMP for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) { meta_write_index = ( hDirAC->dirac_bs_md_write_idx + block ) % hDirAC->dirac_md_buffer_length; @@ -1815,32 +1772,7 @@ void ivas_qmetadata_to_dirac( } } } -#else - for ( band = 0; band < hMasa->config.numCodingBands; ++band ) - { - for ( b = MASA_band_grouping_24[band_mapping[band]]; b < MASA_band_grouping_24[band_mapping[band + 1]]; ++b ) - { - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; ++block ) - { - hDirAC->azimuth2[block][b] = (int16_t) q_direction->band_data[band].azimuth[block]; - hDirAC->elevation2[block][b] = (int16_t) q_direction->band_data[band].elevation[block]; - hDirAC->energy_ratio2[block][b] = q_direction->band_data[band].energy_ratio[block]; - hDirAC->diffuseness_vector[block][b] -= q_direction->band_data[band].energy_ratio[block]; - - if ( q_direction->coherence_band_data != NULL ) - { - hDirAC->spreadCoherence2[block][b] = q_direction->coherence_band_data[band].spread_coherence[block] / 255.0f; - } - else - { - hDirAC->spreadCoherence2[block][b] = 0.0f; - } - } - } - } -#endif } -#ifdef FIX_350_MASA_DELAY_COMP else if ( hDirAC->azimuth2 != NULL && hDirAC->elevation2 != NULL && hDirAC->energy_ratio2 != NULL && hDirAC->spreadCoherence2 != NULL ) { /* zero out old dir2 data */ @@ -1853,7 +1785,6 @@ void ivas_qmetadata_to_dirac( set_zero( hDirAC->spreadCoherence2[meta_write_index], hDirAC->num_freq_bands ); } } -#endif } else /* SBA mode/SID/Zero frame*/ { @@ -2182,6 +2113,7 @@ void ivas_dirac_dec( for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) { index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; + /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } } @@ -2207,7 +2139,7 @@ void ivas_dirac_dec( for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; - surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[subframe_idx][i]; + surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; @@ -2245,8 +2177,6 @@ void ivas_dirac_dec( ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, st_ivas->hMasa, - subframe_idx, - subframe_idx, surCohRatio, st_ivas->hHeadTrackData->shd_rot_max_order, p_Rmat ); @@ -2256,8 +2186,6 @@ void ivas_dirac_dec( ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, st_ivas->hMasa, - subframe_idx, - subframe_idx, surCohRatio, 0, 0 ); @@ -2555,8 +2483,7 @@ void ivas_dirac_dec( p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport, - index_slot ); + nchan_transport ); } else { @@ -2566,8 +2493,7 @@ void ivas_dirac_dec( 0, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport, - index_slot ); + nchan_transport ); } if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 3541bc5cfe..362b63c04b 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -517,8 +517,8 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport, /* i : number of transport channels*/ - const int16_t index_slot ) + const int16_t nchan_transport /* i : number of transport channels*/ +) { int16_t num_freq_bands, num_channels_dir; int16_t num_freq_bands_diff, num_channels_diff; @@ -556,8 +556,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( ivas_dirac_dec_compute_directional_responses( hDirAC, hVBAPdata, NULL, - index_slot, - index_slot / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, + NULL, 2, p_Rmat ); @@ -1484,8 +1483,6 @@ void ivas_dirac_dec_compute_directional_responses( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ - const int16_t direction_idx, /* i : index for direction (azi and ele), can slot index (>2TCs) or subrame index (<=2TCs) */ - const int16_t subframe_idx, /* i : subframe index */ const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ @@ -1522,8 +1519,8 @@ void ivas_dirac_dec_compute_directional_responses( elevation = hDirAC->elevation[hDirAC->dirac_read_idx]; if ( hDirAC->numSimultaneousDirections == 2 ) { - azimuth2 = hDirAC->azimuth2[direction_idx]; - elevation2 = hDirAC->elevation2[direction_idx]; + azimuth2 = hDirAC->azimuth2[hDirAC->dirac_read_idx]; + elevation2 = hDirAC->elevation2[hDirAC->dirac_read_idx]; } codingBand = -1; @@ -1575,17 +1572,18 @@ void ivas_dirac_dec_compute_directional_responses( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) { /* Synthesize the first direction */ - spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[subframe_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); + spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); /* Synthesize the second direction and combine the gains */ if ( hDirAC->numSimultaneousDirections == 2 ) { - spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[subframe_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); + spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); /* Combine gains from the two directions */ - totalDirect = hDirAC->energy_ratio1[subframe_idx][k] + hDirAC->energy_ratio2[subframe_idx][k] + EPSILON; - directRatio[0] = hDirAC->energy_ratio1[subframe_idx][k] / totalDirect; - directRatio[1] = hDirAC->energy_ratio2[subframe_idx][k] / totalDirect; + totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; + for ( l = 0; l < num_channels_dir; l++ ) { direct_response_hoa[l] *= directRatio[0]; @@ -1633,20 +1631,20 @@ void ivas_dirac_dec_compute_directional_responses( else if ( hDirAC->panningConf == DIRAC_PANNING_VBAP ) /*VBAP*/ { /* Synthesize the first direction */ - spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[subframe_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); + spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); normalizePanningGains( direct_response_ls, num_channels_dir ); /* Synthesize the second direction and combine the gains */ if ( hDirAC->numSimultaneousDirections == 2 ) { - spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[subframe_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); + spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); normalizePanningGains( direct_response_dir2, num_channels_dir ); /* Combine gains from the two directions */ - totalDirect = hDirAC->energy_ratio1[subframe_idx][k] + hDirAC->energy_ratio2[subframe_idx][k] + EPSILON; - directRatio[0] = hDirAC->energy_ratio1[subframe_idx][k] / totalDirect; - directRatio[1] = hDirAC->energy_ratio2[subframe_idx][k] / totalDirect; + totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; for ( l = 0; l < num_channels_dir; l++ ) { direct_response_ls[l] *= directRatio[0]; diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c old mode 100755 new mode 100644 index c0f073af4b..58c945b190 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -110,26 +110,12 @@ ivas_error ivas_dec_setup( k--; } -#ifdef NCHAN_ISM_PARAMETER st_ivas->nchan_ism = nchan_ism; -#endif -#ifdef DISCRETE_ISM_DTX_CNG -#ifdef NCHAN_ISM_PARAMETER if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nchan_ism ) ) != IVAS_ERR_OK ) -#endif { return error; } -#else -#ifdef NCHAN_ISM_PARAMETER - ivas_ism_dec_config( st_ivas ); -#else - ivas_ism_dec_config( st_ivas, nchan_ism ); -#endif -#endif } else if ( st_ivas->ivas_format == SBA_FORMAT ) { @@ -242,11 +228,9 @@ ivas_error ivas_dec_setup( case SID_MDCT_STEREO: st_ivas->element_mode_init = IVAS_CPE_MDCT; break; -#ifdef DISCRETE_ISM_DTX_CNG case SID_ISM: st_ivas->element_mode_init = IVAS_SCE; break; -#endif case SID_MASA_1TC: st_ivas->element_mode_init = IVAS_SCE; st_ivas->nchan_transport = 1; @@ -426,27 +410,6 @@ static ivas_error ivas_read_format( break; case SID_ISM: st_ivas->ivas_format = ISM_FORMAT; -#ifndef DISCRETE_ISM_DTX_CNG - if ( st_ivas->ism_mode == ISM_MODE_DISC ) - { - ivas_ism_dec_config( st_ivas -#ifndef NCHAN_ISM_PARAMETER - , - 1 -#endif - ); /* currently DTX supported for 1 ISM when ISM Mode is DISC_ISM */ - } - - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) - { - ivas_ism_dec_config( st_ivas -#ifndef NCHAN_ISM_PARAMETER - , - st_ivas->nSCE -#endif - ); /* for Param-ISM, we need to generate 2 TCs */ - } -#endif break; case SID_MULTICHANNEL: st_ivas->ivas_format = MC_FORMAT; @@ -532,28 +495,10 @@ int16_t getNumChanSynthesis( { n = CPE_CHANNELS; } -#ifdef SBA_HPF_TUNING_DEC - else if ( st_ivas->ivas_format == SBA_FORMAT ) - { - if ( st_ivas->sba_analysis_order > 1 ) - { - n = 0; - } - else - { - n = st_ivas->nchan_transport; - } - } - else if ( st_ivas->hMCT != NULL ) - { - n = st_ivas->nchan_transport; - } -#else else if ( st_ivas->hMCT != NULL || st_ivas->ivas_format == SBA_FORMAT ) { n = st_ivas->nchan_transport; } -#endif return n; } @@ -888,10 +833,8 @@ ivas_error ivas_init_decoder( st_ivas->nSCE = st_ivas->nchan_transport; /* "st_ivas->nchan_transport" is known from ivas_dec_setup */ st_ivas->nCPE = 0; -#ifdef FIX_379_EXT_METADATA st_ivas->ism_extmeta_active = -1; st_ivas->ism_extmeta_cnt = 0; -#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { @@ -918,11 +861,13 @@ ivas_error ivas_init_decoder( reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); -#ifdef DISCRETE_ISM_DTX_CNG st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; -#endif } +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + st_ivas->hISMDTX.sce_id_dtx = 0; +#endif + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { st_ivas->hSCE[1]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed3 = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->seed2; @@ -987,11 +932,7 @@ ivas_error ivas_init_decoder( ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } -#ifdef SBA2MONO st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#else - st_ivas->sba_dirac_stereo_flag = ( output_config == AUDIO_CONFIG_STEREO ); -#endif } else /* SBA_MODE_DIRAC */ { @@ -1000,11 +941,7 @@ ivas_error ivas_init_decoder( return error; } -#ifdef SBA2MONO st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#else - st_ivas->sba_dirac_stereo_flag = ( st_ivas->nchan_transport == 1 && output_config == AUDIO_CONFIG_STEREO ); -#endif } } @@ -1041,11 +978,7 @@ ivas_error ivas_init_decoder( } /* create CPE element for DFT Stereo like upmix */ -#ifdef SBA2MONO if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nCPE == 0 ) -#else - if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nchan_transport == 1 ) -#endif { if ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) { @@ -1065,28 +998,7 @@ ivas_error ivas_init_decoder( } /* set CNA/CNG flags */ -#ifdef FIX_386_CORECODER_RECONFIG ivas_sba_set_cna_cng_flag( st_ivas ); -#else - if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; /* Todo: Check if these can be enabled */ - st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 0; - } - else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; - st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; - } - else if ( st_ivas->nchan_transport == 2 ) - { - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; /* Todo: Check if these can be enabled */ - st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1; - } - } -#endif } else if ( st_ivas->ivas_format == MC_FORMAT ) { @@ -1178,11 +1090,7 @@ ivas_error ivas_init_decoder( return error; } -#ifdef SBA2MONO st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#else - st_ivas->sba_dirac_stereo_flag = ( st_ivas->nchan_transport == 1 && output_config == AUDIO_CONFIG_STEREO ); -#endif if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) { @@ -1404,14 +1312,6 @@ ivas_error ivas_init_decoder( return error; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - /* reuse core-coder buffers for LFE decoder */ - cpe_id = LFE_CHANNEL / CPE_CHANNELS; - n = LFE_CHANNEL % CPE_CHANNELS; - - st_ivas->hLFE->prevsynth_buf = &st_ivas->hCPE[cpe_id]->hCoreCoder[n]->old_synth_sw[0]; - st_ivas->hLFE->prior_out_buffer = &st_ivas->hCPE[cpe_id]->hCoreCoder[n]->previoussynth[0]; -#endif set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); } @@ -1447,11 +1347,7 @@ ivas_error ivas_init_decoder( } /* CLDFB Interpolation weights */ -#ifdef SBA2MONO if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) -#else - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !st_ivas->sba_dirac_stereo_flag ) -#endif { ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } @@ -1571,11 +1467,7 @@ void destroy_core_dec( hCoreCoder->hTcxDec = NULL; } - if ( hCoreCoder->hTcxCfg != NULL -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && hCoreCoder->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( hCoreCoder->hTcxCfg != NULL ) { free( hCoreCoder->hTcxCfg ); hCoreCoder->hTcxCfg = NULL; diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index e6571e83d9..e3efac13a1 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -50,26 +50,25 @@ static ivas_error ivas_ism_bitrate_switching( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nchan_transport_old, /* i : last number of transport channels */ const ISM_MODE last_ism_mode /* i : last ISM mode */ -#ifndef NCHAN_ISM_PARAMETER - , - const int16_t num_obj /* i : number of objects in the bitstream */ -#endif ) { ivas_error error; int32_t element_brate_tmp[MAX_NUM_OBJECTS]; int16_t nSCE_old, nCPE_old; +#ifdef FIX_416_ISM_BR_SWITCHING + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; +#endif error = IVAS_ERR_OK; nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; -#ifdef NCHAN_ISM_PARAMETER - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, num_obj, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#ifdef FIX_416_ISM_BR_SWITCHING + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); #endif + + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) { return error; } @@ -229,6 +228,17 @@ static ivas_error ivas_ism_bitrate_switching( } } +#ifdef FIX_416_ISM_BR_SWITCHING + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + return error; } @@ -242,20 +252,11 @@ static ivas_error ivas_ism_bitrate_switching( ivas_error ivas_ism_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -#ifdef DISCRETE_ISM_DTX_CNG , const ISM_MODE last_ism_mode /* i/o: last ISM mode */ -#endif -#ifndef NCHAN_ISM_PARAMETER - , - const int16_t num_obj /* i : number of objects in the bitstream */ -#endif ) { int32_t ivas_total_brate; -#ifndef DISCRETE_ISM_DTX_CNG - ISM_MODE last_ism_mode; -#endif ivas_error error; int16_t nchan_transport_old; @@ -263,17 +264,9 @@ ivas_error ivas_ism_dec_config( ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; -#ifndef DISCRETE_ISM_DTX_CNG - /* store last frame ISM mode */ - last_ism_mode = st_ivas->ism_mode; -#endif /* Assumes that num of input objects are constant */ -#ifdef NCHAN_ISM_PARAMETER nchan_transport_old = st_ivas->nchan_ism; -#else - nchan_transport_old = num_obj; -#endif if ( last_ism_mode == ISM_MODE_PARAM ) { @@ -283,42 +276,25 @@ ivas_error ivas_ism_dec_config( if ( !st_ivas->bfi && ivas_total_brate != IVAS_SID_5k2 && ivas_total_brate != FRAME_NO_DATA ) { /* select ISM format mode */ -#ifdef NCHAN_ISM_PARAMETER st_ivas->ism_mode = ivas_ism_mode_select( st_ivas->nchan_ism, ivas_total_brate ); st_ivas->nchan_transport = st_ivas->nchan_ism; -#else - st_ivas->ism_mode = ivas_ism_mode_select( num_obj, ivas_total_brate ); - - st_ivas->nchan_transport = num_obj; -#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { -#ifdef NCHAN_ISM_PARAMETER st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism; -#else - st_ivas->hDecoderConfig->nchan_out = num_obj; -#endif } } if ( st_ivas->ini_active_frame != 0 ) { /* ISM bit-rate switching */ -#ifndef DISCRETE_ISM_DTX_CNG - if ( st_ivas->hDecoderConfig->last_ivas_total_brate != IVAS_SID_5k2 && st_ivas->hDecoderConfig->last_ivas_total_brate != FRAME_NO_DATA ) -#endif { if ( ( st_ivas->ism_mode != last_ism_mode ) || ( st_ivas->hDecoderConfig->ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) ) { -#ifdef NCHAN_ISM_PARAMETER if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, num_obj ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -328,58 +304,27 @@ ivas_error ivas_ism_dec_config( } else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) { -#ifdef DISCRETE_ISM_DTX_CNG -#ifdef NCHAN_ISM_PARAMETER st_ivas->nchan_transport = st_ivas->nchan_ism; -#else - st_ivas->nchan_transport = num_obj; -#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { st_ivas->nchan_transport = MAX_PARAM_ISM_WAVE; if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { -#ifdef NCHAN_ISM_PARAMETER st_ivas->hDecoderConfig->nchan_out = st_ivas->nchan_ism; -#else - st_ivas->hDecoderConfig->nchan_out = num_obj; -#endif } } /* ISM mode switching */ if ( st_ivas->ism_mode != last_ism_mode ) { -#ifdef NCHAN_ISM_PARAMETER if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, num_obj ) ) != IVAS_ERR_OK ) -#endif { return error; } } -#else - if ( last_ism_mode == ISM_MODE_PARAM ) - { - nchan_transport_old = MAX_PARAM_ISM_WAVE; - } - else - { -#ifdef NCHAN_ISM_PARAMETER - st_ivas->nchan_transport = st_ivas->nchan_ism; -#else - st_ivas->nchan_transport = num_obj; -#endif - } -#endif } -#ifdef NCHAN_ISM_PARAMETER switch ( st_ivas->nchan_ism ) -#else - switch ( num_obj ) -#endif { case 1: st_ivas->transport_config = AUDIO_CONFIG_ISM1; diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index ef52c082b7..7eb6c115ea 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -39,7 +39,7 @@ #endif #include "wmc_auto.h" - +#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT /*-------------------------------------------------------------------* * ivas_ism_preprocessing() * @@ -51,24 +51,14 @@ static void ivas_ism_preprocessing( const int16_t sce_id /* i : SCE # identifier */ ) { -#ifndef DISCRETE_ISM_DTX_CNG - int32_t ivas_total_brate; -#endif Decoder_State *st; st = st_ivas->hSCE[sce_id]->hCoreCoder[0]; -#ifndef DISCRETE_ISM_DTX_CNG - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - - if ( ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) -#endif { /* reset the bitstream to at least read the cng type and bandwidth for non transmitted SCE */ st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; -#ifdef DISCRETE_ISM_DTX_CNG st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ -#endif if ( sce_id == st_ivas->hISMDTX.sce_id_dtx ) { @@ -81,16 +71,10 @@ static void ivas_ism_preprocessing( st->cng_ism_flag = 1; } -#ifndef DISCRETE_ISM_DTX_CNG - else - { - st->cng_ism_flag = 0; - } -#endif return; } - +#endif /*-------------------------------------------------------------------* * ivas_ism_dtx_dec() @@ -105,36 +89,18 @@ ivas_error ivas_ism_dtx_dec( { int16_t ch, pos, nchan_ism, nchan_ism_prev; int32_t ivas_total_brate; -#ifdef DISCRETE_ISM_DTX_CNG int16_t md_diff_flag[MAX_NUM_OBJECTS]; int16_t idx, flag_noisy_speech, sce_id_dtx; ISM_MODE last_ism_mode, ism_mode_bstr; ivas_error error; +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + Decoder_State *st; #endif ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; -#ifndef DISCRETE_ISM_DTX_CNG - if ( st_ivas->nchan_transport == 1 ) - { - nb_bits_metadata[0] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; - - return IVAS_ERR_OK; - } -#endif -#ifdef NCHAN_ISM_PARAMETER nchan_ism_prev = st_ivas->nchan_ism; -#else - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) - { - nchan_ism_prev = st_ivas->hDirAC->hParamIsm->num_obj; - } - else /* ism_mode == ISM_MODE_DISC */ - { - nchan_ism_prev = st_ivas->nchan_transport; - } -#endif if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) { @@ -147,12 +113,8 @@ ivas_error ivas_ism_dtx_dec( ( nchan_ism )++; pos--; } -#ifdef NCHAN_ISM_PARAMETER st_ivas->nchan_ism = nchan_ism; -#endif -#ifdef DISCRETE_ISM_DTX_CNG pos--; -#endif if ( nchan_ism != nchan_ism_prev ) { @@ -160,7 +122,6 @@ ivas_error ivas_ism_dtx_dec( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } -#ifdef DISCRETE_ISM_DTX_CNG last_ism_mode = st_ivas->ism_mode; /* read ism_mode */ @@ -173,34 +134,10 @@ ivas_error ivas_ism_dtx_dec( st_ivas->ism_mode = ism_mode_bstr; } -#ifdef NCHAN_ISM_PARAMETER if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, nchan_ism ) ) != IVAS_ERR_OK ) -#endif { return error; } -#else -#ifdef NCHAN_ISM_PARAMETER - ivas_ism_dec_config( st_ivas ); -#else - ivas_ism_dec_config( st_ivas, nchan_ism ); -#endif - - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) - { -#ifdef NCHAN_ISM_PARAMETER - st_ivas->nchan_transport = 2; -#else - st_ivas->hDirAC->hParamIsm->num_obj = nchan_ism; -#endif - } - else /* ism_mode == ISM_MODE_DISC */ - { - st_ivas->nchan_transport = nchan_ism; - } -#endif } else { @@ -208,7 +145,6 @@ ivas_error ivas_ism_dtx_dec( } /* Metadata decoding and dequantization */ -#ifdef DISCRETE_ISM_DTX_CNG ivas_ism_metadata_sid_dec( st_ivas->hSCE, ivas_total_brate, st_ivas->bfi, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, &flag_noisy_speech, &sce_id_dtx, st_ivas->hIsmMetaData, nb_bits_metadata ); @@ -221,11 +157,7 @@ ivas_error ivas_ism_dtx_dec( st_ivas->hISMDTX.sce_id_dtx = sce_id_dtx; } -#else - ivas_param_ism_metadata_dtx_dec( st_ivas ); -#endif -#ifdef DISCRETE_ISM_DTX_CNG set_s( md_diff_flag, 1, nchan_ism ); if ( st_ivas->ism_mode == ISM_MODE_PARAM ) @@ -240,29 +172,27 @@ ivas_error ivas_ism_dtx_dec( update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); st_ivas->hISMDTX.ism_dtx_hangover_cnt = 0; -#endif if ( ivas_total_brate == IVAS_SID_5k2 && !st_ivas->bfi ) { for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) { -#ifdef DISCRETE_ISM_DTX_CNG nb_bits_metadata[ch] = nb_bits_metadata[sce_id_dtx]; -#else - nb_bits_metadata[ch] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; -#endif } } -#ifdef DISCRETE_ISM_DTX_CNG if ( !st_ivas->bfi ) -#else - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) -#endif { for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) { +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + st = st_ivas->hSCE[ch]->hCoreCoder[0]; + st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; + st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ + st->cng_ism_flag = 1; +#else ivas_ism_preprocessing( st_ivas, ch ); // VE: after the acceptance of switches, replace the function call by its content +#endif } } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index feccbc9766..7a61424a1f 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -37,9 +37,7 @@ #include "ivas_rom_com.h" #include "prot.h" #include "ivas_stat_enc.h" -#ifdef DISCRETE_ISM_DTX_CNG #include -#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -54,7 +52,6 @@ static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int16_t *flag_abs_radius ); -#ifdef DISCRETE_ISM_DTX_CNG /*-------------------------------------------------------------------------* * Local constants *-------------------------------------------------------------------------*/ @@ -131,7 +128,6 @@ static void ism_metadata_smooth( return; } -#endif /*-------------------------------------------------------------------------* @@ -141,90 +137,43 @@ static void ism_metadata_smooth( *-------------------------------------------------------------------------*/ ivas_error ivas_ism_metadata_dec( - const int32_t ism_total_brate, /* i : ISM total bitrate */ -#ifdef NCHAN_ISM_PARAMETER - const int16_t nchan_ism, /* i : number of ISM channels */ -#endif - int16_t *nchan_transport, /* o : number of transport channels */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ - const int16_t bfi, /* i : bfi flag */ - int16_t nb_bits_metadata[], /* o : number of metadata bits */ - ISM_MODE ism_mode, /* i : ISM mode */ -#ifdef DISCRETE_ISM_DTX_CNG - ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ -#endif -#ifdef FIX_379_EXT_METADATA + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_ism, /* i : number of ISM channels */ + int16_t *nchan_transport, /* o : number of transport channels */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + SCE_DEC_HANDLE hSCE[], /* i/o: SCE decoder handles */ + const int16_t bfi, /* i : bfi flag */ + int16_t nb_bits_metadata[], /* o : number of metadata bits */ + ISM_MODE ism_mode, /* i : ISM mode */ + ISM_DTX_DATA_DEC hISMDTX, /* i/o: ISM DTX structure */ const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Config Handle */ int16_t *ism_extmeta_active, /* i/o: Extended metadata active in renderer*/ int16_t *ism_extmeta_cnt /* i/o: Number of change frames observed*/ -#else - const PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Config Handle */ -#endif ) { int16_t ch, nb_bits_start = 0, last_bit_pos; int16_t idx_radius; int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; DEC_CORE_HANDLE st0; -#ifdef FIX_379_EXT_METADATA int16_t ism_extmeta_bitstream; float yaw, pitch, radius; -#else - int16_t ism_extended_metadata_flag; -#endif int16_t flag_abs_radius; int16_t flag_abs_orientation; -#ifdef FIX_379_ANGLE int16_t flag_abs_position; int16_t idx_angle1; int16_t idx_angle2; -#else - int16_t idx_azimuth, flag_abs_azimuth; - int16_t idx_elevation; -#endif int16_t next_bit_pos_orig; uint16_t i, bstr_meta[MAX_BITS_METADATA], *bstr_orig; ISM_METADATA_HANDLE hIsmMetaData; int16_t nchan_transport_prev, ism_metadata_flag_global; int16_t localVAD[MAX_NUM_OBJECTS]; int16_t ism_imp[MAX_NUM_OBJECTS]; -#ifdef NCHAN_ISM_PARAMETER int16_t nbands, nblocks; -#else - int16_t nchan_ism = 0, nbands, nblocks; -#endif -#ifdef DISCRETE_ISM_DTX_CNG int16_t md_diff_flag[MAX_NUM_OBJECTS]; -#endif ivas_error error; push_wmops( "ism_meta_dec" ); -#ifndef DISCRETE_ISM_DTX_CNG - if ( ism_total_brate == IVAS_SID_5k2 || ism_total_brate == FRAME_NO_DATA ) - { - /* no metadata decoding in CNG */ - for ( ch = 0; ch < *nchan_transport; ch++ ) - { - hIsmMeta[ch]->ism_metadata_flag = 0; - } - - /* set padding bits as metadata bits to keep later bitrate checks valid */ - nb_bits_metadata[0] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; - -#ifdef DEBUGGING - /* sanity check */ - if ( *nchan_transport != 1 ) - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\n!!! Error: SID/CNG frame not expect for decoding more than 1 object. Exiting.\n\n" ); - } -#endif - - pop_wmops(); - return IVAS_ERR_OK; - } -#endif /* initialization */ st0 = hSCE[0]->hCoreCoder[0]; @@ -235,11 +184,7 @@ ivas_error ivas_ism_metadata_dec( bstr_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; st0->next_bit_pos = 0; -#ifdef FIX_379_EXT_METADATA ism_extmeta_bitstream = 0; -#else - ism_extended_metadata_flag = 0; -#endif /* reverse the bitstream for easier reading of indices */ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) @@ -255,27 +200,14 @@ ivas_error ivas_ism_metadata_dec( * Read ISM common signaling *----------------------------------------------------------------*/ -#ifdef NCHAN_ISM_PARAMETER /* number of objects was read in ivas_dec_setup() */ st0->next_bit_pos += nchan_ism; -#else - /* read number of objects */ - nchan_ism = 1; - while ( get_next_indice( st0, 1 ) == 1 && nchan_ism < MAX_NUM_OBJECTS ) - { - ( nchan_ism )++; - } -#endif ism_mode = ivas_ism_mode_select( nchan_ism, ism_total_brate ); if ( ism_mode == ISM_MODE_PARAM ) { -#ifdef NCHAN_ISM_PARAMETER *nchan_transport = MAX_PARAM_ISM_WAVE; -#else - hParamIsm->num_obj = nchan_ism; -#endif } else if ( ism_mode == ISM_MODE_DISC ) { @@ -291,13 +223,8 @@ ivas_error ivas_ism_metadata_dec( /* read extended metadata presence flag */ if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) { -#ifdef FIX_379_EXT_METADATA ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS ); -#else - ism_extended_metadata_flag = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS ); -#endif } -#ifdef FIX_379_EXT_METADATA /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */ if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */ { @@ -313,7 +240,6 @@ ivas_error ivas_ism_metadata_dec( *ism_extmeta_cnt = 0; } } -#endif /* Read ISM present flags (one per object) */ for ( ch = 0; ch < *nchan_transport; ch++ ) @@ -372,109 +298,57 @@ ivas_error ivas_ism_metadata_dec( { nb_bits_start = st0->next_bit_pos; } -#ifdef FIX_379_ANGLE flag_abs_position = 0; -#else - flag_abs_azimuth = 0; -#endif flag_abs_orientation = 0; flag_abs_radius = 0; if ( hIsmMeta[ch]->ism_metadata_flag ) { -#ifdef FIX_379_ANGLE decode_angle_indices( st0, &( hIsmMetaData->position_angle ), &flag_abs_position ); idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; idx_angle2 = hIsmMetaData->position_angle.last_angle2_idx; -#else - decode_angle_indices( st0, &( hIsmMetaData->angle[0] ), &flag_abs_azimuth ); - idx_azimuth = hIsmMetaData->angle[0].last_azimuth_idx; - idx_elevation = hIsmMetaData->angle[0].last_elevation_idx; -#endif /* Azimuth/Elevation dequantization */ if ( ism_mode == ISM_MODE_PARAM ) { -#ifdef FIX_379_ANGLE hParamIsm->azi_index[ch] = idx_angle1; hParamIsm->ele_index[ch] = idx_angle2; -#else - hParamIsm->azi_index[ch] = idx_azimuth; - hParamIsm->ele_index[ch] = idx_elevation; -#endif } else /* ISM_MODE_DISC */ { -#ifdef FIX_379_ANGLE hIsmMetaData->azimuth = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); hIsmMetaData->elevation = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#else - hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - hIsmMetaData->elevation = ism_dequant_meta( idx_elevation, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#endif /* radius/raw/pitch dequantization */ -#ifdef FIX_379_EXT_METADATA if ( ism_extmeta_bitstream ) -#else - if ( ism_extended_metadata_flag ) -#endif { -#ifdef FIX_379_ANGLE decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), &flag_abs_orientation ); idx_angle1 = hIsmMetaData->orientation_angle.last_angle1_idx; idx_angle2 = hIsmMetaData->orientation_angle.last_angle2_idx; -#else - decode_angle_indices( st0, &( hIsmMetaData->angle[1] ), &flag_abs_orientation ); - idx_azimuth = hIsmMetaData->angle[1].last_azimuth_idx; - idx_elevation = hIsmMetaData->angle[1].last_elevation_idx; -#endif -#ifdef FIX_379_EXT_METADATA -#ifdef FIX_379_ANGLE yaw = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); pitch = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#else - yaw = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - pitch = ism_dequant_meta( idx_elevation, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#endif -#else - hIsmMetaData->yaw = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - hIsmMetaData->pitch = ism_dequant_meta( idx_elevation, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#endif idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); -#ifdef FIX_379_EXT_METADATA radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA ); -#else - hIsmMetaData->radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA ); -#endif -#ifdef FIX_379_EXT_METADATA if ( *ism_extmeta_active == 1 ) { hIsmMetaData->yaw = yaw; hIsmMetaData->pitch = pitch; hIsmMetaData->radius = radius; } -#endif } else { -#ifdef FIX_379_EXT_METADATA if ( *ism_extmeta_active == 0 ) { hIsmMetaData->yaw = 0.0f; hIsmMetaData->pitch = 0.0f; hIsmMetaData->radius = 1.0f; } -#else - hIsmMetaData->radius = 1.0f; -#endif } } -#ifdef DISCRETE_ISM_DTX_CNG /* save for smoothing metadata evolution */ hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; -#endif } /* save number of metadata bits read */ @@ -537,17 +411,6 @@ ivas_error ivas_ism_metadata_dec( } else /* BFI */ { -#ifndef NCHAN_ISM_PARAMETER - /* "nchan_ism", "hIsmMeta->azimuth" and "hIsmMeta->elevation" are recycled from the last frame */ - if ( ism_mode == ISM_MODE_PARAM ) - { - nchan_ism = hParamIsm->num_obj; - } - else if ( ism_mode == ISM_MODE_DISC ) - { - nchan_ism = *nchan_transport; - } -#endif for ( ch = 0; ch < nchan_ism; ch++ ) { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; @@ -561,24 +424,17 @@ ivas_error ivas_ism_metadata_dec( { hParamIsm->azi_index[ch] = hParamIsm->azi_index[ch] + hParamIsm->last_az_sgn[ch] * hParamIsm->last_az_diff[ch]; hParamIsm->ele_index[ch] = hParamIsm->ele_index[ch] + hParamIsm->last_el_sgn[ch] * hParamIsm->last_el_diff[ch]; -#ifdef FIX_379_ANGLE hIsmMeta[ch]->position_angle.last_angle1_idx = hParamIsm->azi_index[ch]; hIsmMeta[ch]->position_angle.last_angle2_idx = hParamIsm->ele_index[ch]; -#else - hIsmMeta[ch]->angle[0].last_azimuth_idx = hParamIsm->azi_index[ch]; - hIsmMeta[ch]->angle[0].last_elevation_idx = hParamIsm->ele_index[ch]; -#endif } } } -#ifdef DISCRETE_ISM_DTX_CNG if ( hISMDTX.ism_dtx_hangover_cnt < IVAS_ISM_DTX_HO_MAX ) { ism_metadata_smooth( hIsmMeta, ism_total_brate, nchan_ism ); hISMDTX.ism_dtx_hangover_cnt += 1; } -#endif /*----------------------------------------------------------------* * Configuration and decision about bitrates per channel @@ -595,9 +451,14 @@ ivas_error ivas_ism_metadata_dec( { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; +#ifdef FIX_419_ISM_BRATE_SW_DTX + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; +#endif if ( ism_mode == ISM_MODE_DISC ) { +#ifndef FIX_419_ISM_BRATE_SW_DTX hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; +#endif if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; @@ -636,7 +497,6 @@ ivas_error ivas_ism_metadata_dec( hSCE[ch]->hCoreCoder[0]->bit_stream = hSCE[ch - 1]->hCoreCoder[0]->bit_stream + ( hSCE[ch - 1]->hCoreCoder[0]->total_brate / FRAMES_PER_SEC ); } -#ifdef DISCRETE_ISM_DTX_CNG /*----------------------------------------------------------------* * Updates *----------------------------------------------------------------*/ @@ -644,7 +504,6 @@ ivas_error ivas_ism_metadata_dec( set_s( md_diff_flag, 1, nchan_ism ); update_last_metadata( nchan_ism, hIsmMeta, md_diff_flag ); -#endif for ( ch = 0; ch < *nchan_transport; ch++ ) { @@ -681,23 +540,14 @@ ivas_error ivas_ism_metadata_dec_create( } st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; -#ifdef FIX_379_ANGLE st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0; st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle1_idx = 0; st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); -#else - st_ivas->hIsmMetaData[ch]->angle[0].last_azimuth_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[0].last_elevation_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); - st_ivas->hIsmMetaData[ch]->angle[1].last_azimuth_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[1].last_elevation_idx = 1 << ( ISM_ELEVATION_NBITS - 1 ); -#endif st_ivas->hIsmMetaData[ch]->last_radius_idx = 8; /* Init to radius 1.0 */ -#ifdef DISCRETE_ISM_DTX_CNG st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0; st_ivas->hIsmMetaData[ch]->last_true_elevation = 0; -#endif ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } @@ -707,9 +557,7 @@ ivas_error ivas_ism_metadata_dec_create( return error; } -#ifdef DISCRETE_ISM_DTX_CNG st_ivas->hISMDTX.ism_dtx_hangover_cnt = IVAS_ISM_DTX_HO_MAX; -#endif return IVAS_ERR_OK; } @@ -720,7 +568,6 @@ ivas_error ivas_ism_metadata_dec_create( * * Decoding of an angle *-------------------------------------------------------------------------*/ -#ifdef FIX_379_ANGLE static void decode_angle_indices( DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ @@ -861,149 +708,6 @@ static void decode_angle_indices( return; } -#else - -static void decode_angle_indices( - DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ - ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ - int16_t *flag_abs_azimuth /* o : Azimuth encoding mode */ -) -{ - int16_t idx_azimuth, nbits_diff_azimuth, diff, sgn; - int16_t idx_elevation, nbits_diff_elevation; - - /*----------------------------------------------------------------* - * Azimuth decoding and dequantization - *----------------------------------------------------------------*/ - - /* Decode azimuth index */ - if ( get_next_indice( st0, 1 ) == 1 ) /* azimuth_abs_flag */ - { - idx_azimuth = get_next_indice( st0, ISM_AZIMUTH_NBITS ); - *flag_abs_azimuth = 1; - } - else - { - diff = 0; - sgn = 1; - - if ( get_next_indice( st0, 1 ) == 0 ) - { - nbits_diff_azimuth = 1; - } - else - { - nbits_diff_azimuth = 1; - - if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ - { - sgn = -1; - } - - nbits_diff_azimuth++; - - /* read until the stop bit */ - while ( ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) && ( get_next_indice( st0, 1 ) == 1 ) ) - { - diff++; - nbits_diff_azimuth++; - } - - if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) - { - /* count stop bit */ - nbits_diff_azimuth++; - } - } - idx_azimuth = angle->last_azimuth_idx + sgn * diff; - } - - /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */ - if ( idx_azimuth > ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - { - idx_azimuth -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* +180° -> -180° */ - } - else if ( idx_azimuth < 0 ) - { - idx_azimuth += ( 1 << ISM_AZIMUTH_NBITS ) - 1; /* -180° -> +180° */ - } - - /* +180° == -180° */ - if ( idx_azimuth == ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - { - idx_azimuth = 0; - } - - /* sanity check in case of FER or BER */ - if ( idx_azimuth < 0 || idx_azimuth > ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - { - idx_azimuth = angle->last_azimuth_idx; - } - - /*----------------------------------------------------------------* - * Elevation decoding and dequantization - *----------------------------------------------------------------*/ - - /* Decode elevation index */ - if ( *flag_abs_azimuth == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */ - { - idx_elevation = get_next_indice( st0, ISM_ELEVATION_NBITS ); - } - else - { - diff = 0; - sgn = 1; - - if ( get_next_indice( st0, 1 ) == 0 ) - { - nbits_diff_elevation = 1; - } - else - { - nbits_diff_elevation = 1; - - if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ - { - sgn = -1; - } - - nbits_diff_elevation++; - - /* read until the stop bit */ - while ( ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) ) - { - diff++; - nbits_diff_elevation++; - } - - if ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) - { - /* count stop bit */ - nbits_diff_elevation++; - } - } - - idx_elevation = angle->last_elevation_idx + sgn * diff; - } - - /* sanity check in case of FER or BER */ - if ( idx_elevation < 0 || idx_elevation > ( 1 << ISM_ELEVATION_NBITS ) - 1 ) - { - idx_elevation = angle->last_elevation_idx; - } - - /*----------------------------------------------------------------* - * Final updates - *----------------------------------------------------------------*/ - - angle->last_azimuth_idx = idx_azimuth; - angle->last_elevation_idx = idx_elevation; - - return; -} - -#endif - /*------------------------------------------------------------------------- * decode_radius() @@ -1074,7 +778,6 @@ static int16_t decode_radius( } -#ifdef DISCRETE_ISM_DTX_CNG /*-------------------------------------------------------------------* * ivas_ism_metadata_sid_dec() * @@ -1157,7 +860,7 @@ void ivas_ism_metadata_sid_dec( *flag_noisy_speech = 0; *sce_id_dtx = 0; - /* write ISM mode flag to explicitly signal number of spatial parameters */ + /* read ISM mode flag to explicitly signal number of spatial parameters */ if ( nchan_ism > 2 ) { idx = get_next_indice( st0, 1 ); @@ -1190,10 +893,12 @@ void ivas_ism_metadata_sid_dec( hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = (float) ( idx ) / (float) ( ( 1 << nBits_coh ) - 1 ); } } +#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT else { *sce_id_dtx = 0; } +#endif if ( ism_mode == ISM_MODE_PARAM ) { @@ -1221,24 +926,13 @@ void ivas_ism_metadata_sid_dec( /* update last indexes to correspond to active frames coding */ if ( nBits_azimuth > ISM_AZIMUTH_NBITS ) { -#ifdef FIX_379_ANGLE hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); hIsmMetaData->position_angle.last_angle2_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); -#else - hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); - hIsmMetaData->angle[0].last_elevation_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); -#endif } else { -#ifdef FIX_379_ANGLE hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); -#else - hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); - hIsmMetaData->angle[0].last_elevation_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); - -#endif } /* save for smoothing metadata evolution */ @@ -1260,4 +954,3 @@ void ivas_ism_metadata_sid_dec( return; } -#endif diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index f66323d8a4..244bf1f398 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -51,10 +51,8 @@ static void ivas_param_ism_dec_dequant_DOA( DIRAC_DEC_HANDLE hDirAC /* i/o: decoder DirAC handle */ -#ifdef NCHAN_ISM_PARAMETER , const int16_t nchan_ism /* i : number of ISM channels */ -#endif ) { int16_t i; @@ -62,18 +60,10 @@ static void ivas_param_ism_dec_dequant_DOA( hParamIsm = hDirAC->hParamIsm; -#ifdef NCHAN_ISM_PARAMETER assert( nchan_ism <= MAX_NUM_OBJECTS ); -#else - assert( hParamIsm->num_obj <= MAX_NUM_OBJECTS ); -#endif /* Get the azimuth and elevation values */ -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < nchan_ism; i++ ) -#else - for ( i = 0; i < hParamIsm->num_obj; i++ ) -#endif { hDirAC->azimuth_values[i] = ism_dequant_meta( hParamIsm->azi_index[i], ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); hDirAC->elevation_values[i] = ism_dequant_meta( hParamIsm->ele_index[i], ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); @@ -169,9 +159,7 @@ static void ivas_ism_get_proto_matrix( static void ivas_param_ism_compute_mixing_matrix( -#ifdef NCHAN_ISM_PARAMETER - const int16_t nchan_ism, /* i : number of ISM channels */ -#endif + const int16_t nchan_ism, /* i : number of ISM channels */ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */ float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -198,20 +186,12 @@ static void ivas_param_ism_compute_mixing_matrix( proto_matrix = hDirAC->hParamIsmRendering->proto_matrix; -#ifdef NCHAN_ISM_PARAMETER assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) ); -#else - assert( ( hDirAC->hParamIsm->num_obj == 3 ) || ( hDirAC->hParamIsm->num_obj == 4 ) ); -#endif assert( nchan_transport == 2 ); if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) { -#ifdef NCHAN_ISM_PARAMETER num_wave = nchan_ism; -#else - num_wave = hDirAC->hParamIsm->num_obj; -#endif } else { @@ -272,11 +252,7 @@ static void ivas_param_ism_compute_mixing_matrix( { if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) { -#ifdef NCHAN_ISM_PARAMETER direct_power[w] = ( 1.0f / nchan_ism ) * ref_power; -#else - direct_power[w] = ( 1.0f / hDirAC->hParamIsm->num_obj ) * ref_power; -#endif } else { @@ -422,9 +398,6 @@ ivas_error ivas_param_ism_dec_open( IVAS_OUTPUT_SETUP hOutSetup; AUDIO_CONFIG output_config; int32_t output_Fs; -#ifndef NCHAN_ISM_PARAMETER - int16_t nchan_out; -#endif ivas_error error; error = IVAS_ERR_OK; @@ -453,22 +426,8 @@ ivas_error ivas_param_ism_dec_open( output_Fs = st_ivas->hDecoderConfig->output_Fs; output_config = st_ivas->hDecoderConfig->output_config; -#ifdef NCHAN_ISM_PARAMETER ivas_param_ism_config( hDirAC->hParamIsm, st_ivas->nchan_ism ); -#else - nchan_out = st_ivas->hDecoderConfig->nchan_out; - - if ( output_config == AUDIO_CONFIG_EXTERNAL ) - { - hDirAC->hParamIsm->num_obj = nchan_out; - } - else - { - hDirAC->hParamIsm->num_obj = MAX_NUM_OBJECTS; - } - ivas_param_ism_config( hDirAC->hParamIsm ); -#endif /*-----------------------------------------------------------------* * set input parameters @@ -500,11 +459,7 @@ ivas_error ivas_param_ism_dec_open( if ( output_config == AUDIO_CONFIG_EXTERNAL ) { /* nchan_out is essential for memory initialization for CLDFB Synthesis */ -#ifdef NCHAN_ISM_PARAMETER st_ivas->hIntSetup.nchan_out_woLFE = st_ivas->nchan_ism; -#else - st_ivas->hIntSetup.nchan_out_woLFE = hDirAC->hParamIsm->num_obj; -#endif st_ivas->hIntSetup.is_loudspeaker_setup = 1; } @@ -875,11 +830,7 @@ void ivas_param_ism_dec( nchan_transport = st_ivas->nchan_transport; if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { -#ifdef NCHAN_ISM_PARAMETER nchan_out = st_ivas->nchan_ism; -#else - nchan_out = st_ivas->hDirAC->hParamIsm->num_obj; -#endif nchan_out_woLFE = nchan_out; st_ivas->hDecoderConfig->nchan_out = nchan_out; } @@ -899,11 +850,7 @@ void ivas_param_ism_dec( /* De-quantization */ if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) { -#ifdef NCHAN_ISM_PARAMETER ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism ); -#else - ivas_param_ism_dec_dequant_DOA( hDirAC ); -#endif ivas_param_ism_dec_dequant_powrat( hDirAC ); st_ivas->hISMDTX.dtx_flag = 0; } @@ -915,11 +862,7 @@ void ivas_param_ism_dec( /* obtain the direct response using EFAP */ if ( !( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) ) { -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < st_ivas->nchan_ism; i++ ) -#else - for ( i = 0; i < hDirAC->hParamIsm->num_obj; i++ ) -#endif { efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hDirAC->azimuth_values[i], hDirAC->elevation_values[i], EFAP_MODE_EFAP ); } @@ -928,11 +871,7 @@ void ivas_param_ism_dec( { int16_t j; -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < st_ivas->nchan_ism; i++ ) -#else - for ( i = 0; i < hDirAC->hParamIsm->num_obj; i++ ) -#endif { for ( j = 0; j < nchan_out_woLFE; j++ ) { @@ -981,11 +920,7 @@ void ivas_param_ism_dec( } /* Compute mixing matrix */ -#ifdef NCHAN_ISM_PARAMETER ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); -#else - ivas_param_ism_compute_mixing_matrix( hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); -#endif /* subframe loop for synthesis*/ for ( subframe_idx = 0; subframe_idx < hDirAC->nb_subframes; subframe_idx++ ) @@ -1054,11 +989,7 @@ void ivas_param_ism_dec( ivas_param_ism_update_mixing_matrix( hDirAC, mixing_matrix, nchan_transport, nchan_out_woLFE ); /* store MetaData parameters */ -#ifdef NCHAN_ISM_PARAMETER for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) -#else - for ( ch = 0; ch < hDirAC->hParamIsm->num_obj; ch++ ) -#endif { if ( st_ivas->hDirAC->azimuth_values[ch] > 180.0f ) { @@ -1104,11 +1035,7 @@ void ivas_param_ism_params_to_masa_param_mapping( if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) { -#ifdef NCHAN_ISM_PARAMETER ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism ); -#else - ivas_param_ism_dec_dequant_DOA( hDirAC ); -#endif ivas_param_ism_dec_dequant_powrat( hDirAC ); st_ivas->hISMDTX.dtx_flag = 0; } @@ -1117,11 +1044,7 @@ void ivas_param_ism_params_to_masa_param_mapping( st_ivas->hISMDTX.dtx_flag = 1; } -#ifdef NCHAN_ISM_PARAMETER if ( st_ivas->nchan_ism > 1 ) -#else - if ( hDirAC->hParamIsm->num_obj > 1 ) -#endif { if ( st_ivas->hISMDTX.dtx_flag ) { @@ -1205,144 +1128,3 @@ void ivas_param_ism_params_to_masa_param_mapping( return; } - -#ifndef DISCRETE_ISM_DTX_CNG -static void ivas_param_ism_dec_dequantize_DOA_dtx( - int16_t azi_bits, - int16_t ele_bits, - int16_t azi_idx, - int16_t ele_idx, - float *azi_val, - float *ele_val ) -{ - int16_t nbits, npoints, angle_spacing, az_alpha, ele_alpha, tmp_alpha; - - /* Step 1: Determine angle spacing/n_points based on minimum value among elevation/azimuth bits */ - nbits = min( azi_bits, ele_bits ); - - if ( nbits == ISM_ELEVATION_NBITS ) - { - angle_spacing = 5; - } - else - { - angle_spacing = (int16_t) ( ( 180.f / (float) ( 1 << nbits ) ) + 0.5f ); - } - - npoints = (int16_t) ( ( 90 / angle_spacing ) + 0.5f ); - - /* sanity check */ - if ( angle_spacing == 360 ) - { - assert( azi_idx == 0 ); - assert( ele_idx == 0 ); - - *azi_val = 0.f; - *ele_val = 0.f; - return; - } - - /* Get the azimuth and elevation values */ - ele_alpha = 2 * npoints - 1; - assert( ( 0 <= ele_idx ) && ( ele_idx < ele_alpha ) ); - *ele_val = (float) ( ( ele_idx - npoints ) * angle_spacing ); - - az_alpha = 4 * npoints - 1; - assert( ( 0 <= azi_idx ) && ( azi_idx < az_alpha ) ); - tmp_alpha = (int16_t) ( azi_idx * ( 360.f / az_alpha ) ); - - if ( tmp_alpha > 180.0f ) - { - *azi_val = ( (float) tmp_alpha ) - 360.0f; - } - else - { - *azi_val = (float) tmp_alpha; - } - - return; -} - - -/*------------------------------------------------------------------------- - * ivas_param_ism_metadata_dtx_dec() - * - * - *-------------------------------------------------------------------------*/ - -void ivas_param_ism_metadata_dtx_dec( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -) -{ - int16_t azi_idx, ele_idx, i; - int16_t last_bit_pos, next_bit_pos_orig; - uint16_t bstr_meta[IVAS_SID_5k2 / FRAMES_PER_SEC], *bstr_orig; - DEC_CORE_HANDLE st0; - PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM handle */ - int16_t coh_idx; - - if ( st_ivas->hDecoderConfig->ivas_total_brate == FRAME_NO_DATA ) - { - return; - } - - st0 = st_ivas->hSCE[0]->hCoreCoder[0]; - hParamIsm = st_ivas->hDirAC->hParamIsm; - - last_bit_pos = (int16_t) ( ( st_ivas->hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); - bstr_orig = st0->bit_stream; - next_bit_pos_orig = st0->next_bit_pos; - st0->next_bit_pos = 0; - - /* reverse the bitstream for easier reading of indices */ - for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) - { - bstr_meta[i] = st0->bit_stream[last_bit_pos - i]; - } - st0->bit_stream = bstr_meta; - st0->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* needed for BER detection in get_next_indice() */ - - /* number of objects was already read in ivas_ism_get_dtx_dec() */ - /* update the position in the bitstream */ -#ifdef NCHAN_ISM_PARAMETER - st0->next_bit_pos += st_ivas->nchan_ism; -#else - st0->next_bit_pos += hParamIsm->num_obj; -#endif - - /* read sce id */ - st_ivas->hISMDTX.sce_id_dtx = get_next_indice( st0, 1 ); - - /* read the noisy speech flag */ - hParamIsm->flag_noisy_speech = get_next_indice( st0, 1 ); - - /* decode the coherence */ - coh_idx = get_next_indice( st0, PARAM_ISM_DTX_COH_SCA_BITS ); - st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = (float) ( coh_idx ) / (float) ( ( 1 << PARAM_ISM_DTX_COH_SCA_BITS ) - 1 ); - st_ivas->hSCE[1]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence; - - /* get the DOA'S */ -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < st_ivas->nchan_ism; i++ ) -#else - for ( i = 0; i < hParamIsm->num_obj; i++ ) -#endif - { - /* read from bitstream and dequantize */ - azi_idx = get_next_indice( st0, PARAM_ISM_DTX_AZI_BITS ); - ele_idx = get_next_indice( st0, PARAM_ISM_DTX_ELE_BITS ); - - ivas_param_ism_dec_dequantize_DOA_dtx( PARAM_ISM_DTX_AZI_BITS, PARAM_ISM_DTX_ELE_BITS, azi_idx, ele_idx, &( st_ivas->hDirAC->azimuth_values[i] ), &( st_ivas->hDirAC->elevation_values[i] ) ); - } - - /* set the bitstream pointer to its original position */ - st0->bit_stream = bstr_orig; - st0->next_bit_pos = next_bit_pos_orig; - -#ifdef DEBUG_MODE_PARAM_ISM - dbgwrite( &( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence ), sizeof( float ), 1, 1, "./res/ParamISM_coh_dec.dat" ); -#endif - - return; -} -#endif diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index a5bdcc4100..1e60143cb4 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -111,11 +111,7 @@ void ivas_ism_render( int16_t azimuth, elevation; float Rmat[3][3]; -#ifdef NCHAN_ISM_PARAMETER nchan_ism = st_ivas->nchan_ism; -#else - nchan_ism = st_ivas->nchan_transport; -#endif nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; lfe_index = 0; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 3c7e490cbc..9cadbcc4fc 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -47,10 +47,8 @@ /*-----------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------*/ -#define SPAR_META_DELAY_SUBFRAMES 2 /* Number of subframes to delay the SPAR metadata */ -#ifdef FIX_350_MASA_DELAY_COMP -#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ -#endif +#define SPAR_META_DELAY_SUBFRAMES 2 /* Number of subframes to delay the SPAR metadata */ +#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ /*-----------------------------------------------------------------------* * Local function prototypes @@ -60,9 +58,7 @@ static int16_t quantize_theta( float x, int16_t no_cb, float *xhat ); static uint16_t index_theta_phi_16( float theta, float phi, SPHERICAL_GRID_DATA *Sph_Grid16 ); static int16_t quantize_phi_masa( float phi, int16_t flag_delta, float *phi_hat, const int16_t n ); static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 ); -#ifdef FIX_350_MASA_DELAY_COMP static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, const int16_t nchan_transport ); -#endif static void replicate_subframes( IVAS_QMETADATA_HANDLE hQMetaData ); @@ -308,12 +304,10 @@ ivas_error ivas_masa_decode( } } -#ifdef FIX_350_MASA_DELAY_COMP if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { create_masa_ext_out_meta( hMasa, hQMetaData, st_ivas->nchan_transport ); } -#endif return error /* *nb_bits_read*/; } @@ -355,19 +349,15 @@ ivas_error ivas_masa_dec_open( } generate_gridEq( hMasa->data.sph_grid16 ); -#ifdef FIX_350_MASA_DELAY_COMP if ( ( hMasa->data.extOutMeta = (MASA_DECODER_EXT_OUT_META *) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA decoder\n" ) ); } -#endif } else { hMasa->data.sph_grid16 = NULL; -#ifdef FIX_350_MASA_DELAY_COMP hMasa->data.extOutMeta = NULL; -#endif } if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -411,13 +401,11 @@ void ivas_masa_dec_close( hMasa->data.sph_grid16 = NULL; } -#ifdef FIX_350_MASA_DELAY_COMP if ( hMasa->data.extOutMeta != NULL ) { free( hMasa->data.extOutMeta ); hMasa->data.extOutMeta = NULL; } -#endif if ( hMasa->hMasaLfeSynth != NULL ) { @@ -501,7 +489,6 @@ static ivas_error ivas_masa_dec_config( ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format ); -#ifdef FIX_350_MASA_DELAY_COMP if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ @@ -511,9 +498,6 @@ static ivas_error ivas_masa_dec_config( { masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, NULL ); } -#else - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs ); -#endif return error; } @@ -1428,7 +1412,6 @@ static void compute_foa_cov_matrix( return; } -#ifdef FIX_350_MASA_DELAY_COMP static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, @@ -1560,4 +1543,3 @@ static void create_masa_ext_out_meta( return; } -#endif diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index d075bf61da..0b375d4031 100755 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -76,11 +76,7 @@ ivas_error ivas_mcmasa_dec_reconfig( return error; } -#ifdef SBA2MONO st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#else - st_ivas->sba_dirac_stereo_flag = ( st_ivas->nchan_transport == 1 && st_ivas->hOutSetup.output_config == AUDIO_CONFIG_STEREO ); -#endif if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_MCMASA_MONO_STEREO ) { diff --git a/lib_dec/ivas_mct_core_dec.c b/lib_dec/ivas_mct_core_dec.c index 5222d39b64..6c5e6575a6 100644 --- a/lib_dec/ivas_mct_core_dec.c +++ b/lib_dec/ivas_mct_core_dec.c @@ -70,11 +70,7 @@ void ivas_mct_side_bits( Decoder_State *st, *sts[MCT_MAX_CHANNELS]; nf_side_bits = 0; - nChannels = hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ; + nChannels = hMCT->nchan_out_woLFE; /*initializations */ for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ ) @@ -93,9 +89,6 @@ void ivas_mct_side_bits( { st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - st->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -123,9 +116,6 @@ void ivas_mct_side_bits( st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && hMCT->LFE_off ) || -#endif st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { chBitRatios[ch] = 0; @@ -199,11 +189,7 @@ void ivas_mct_core_dec( * Initializations *--------------------------------------------------------------------------------*/ - nChannels = hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ; + nChannels = hMCT->nchan_out_woLFE; /*initializations */ for ( cpe_id = 0, i = 0; cpe_id < nCPE; cpe_id++ ) @@ -218,9 +204,6 @@ void ivas_mct_core_dec( for ( ch = 0, i = 0; ch < nChannels; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -251,9 +234,6 @@ void ivas_mct_core_dec( st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - st->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) /*indicates LFE */ { continue; diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c old mode 100755 new mode 100644 index 4492968ad8..1ad01239cb --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -106,12 +106,6 @@ ivas_error ivas_mct_dec( } } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( !st_ivas->bfi ) - { - hMCT->LFE_off = 0; /* in case of PLC, stick to LFE_off of previous frame; otherwise, the update happens in ivas_mdct_dec_side_bits_frame_channel() */ - } -#endif for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) { @@ -133,13 +127,8 @@ ivas_error ivas_mct_dec( if ( !st_ivas->bfi ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ivas_mdct_dec_side_bits_frame_channel( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], &hMCT->LFE_off, nTnsBitsTCX10[cpe_id], param[cpe_id], 1, - ( ( cpe_id + 1 ) * CPE_CHANNELS > st_ivas->nchan_transport ) ); -#else ivas_mdct_dec_side_bits_frame_channel( st_ivas->hCPE[cpe_id], param_lpc[cpe_id], p_param[cpe_id], st_ivas->hCPE[0]->hCoreCoder[0], nTnsBitsTCX10[cpe_id], param[cpe_id], 1, ( ( cpe_id + 1 ) * CPE_CHANNELS > hMCT->nchan_out_woLFE ) ); -#endif st_ivas->BER_detect |= st_ivas->hCPE[cpe_id]->hCoreCoder[0]->BER_detect; @@ -163,12 +152,7 @@ ivas_error ivas_mct_dec( set_zero( x[n][1], L_FRAME48k / 2 ); } - ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id] -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - hMCT->LFE_off -#endif - , + ivas_mdct_core_invQ( st_ivas->hCPE[cpe_id], nTnsBitsTCX10[cpe_id], p_param[cpe_id], param_lpc[cpe_id], param[cpe_id], fUseTns[cpe_id], tnsData[cpe_id], x, x, Aq[cpe_id], NULL, 1 ); @@ -203,9 +187,6 @@ ivas_error ivas_mct_dec( } ivas_mdct_core_tns_ns( hCPE, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->LFE_off, -#endif fUseTns[cpe_id], tnsData[cpe_id], x, Aq[cpe_id], 1 ); } @@ -242,9 +223,6 @@ ivas_error ivas_mct_dec( } ivas_mdct_core_reconstruct( hCPE, x, synth, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->LFE_off, -#endif fUseTns[cpe_id], 1 ); /*----------------------------------------------------------------* @@ -253,12 +231,6 @@ ivas_error ivas_mct_dec( for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[n]->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - break; - } -#endif if ( st_ivas->sba_dirac_stereo_flag ) { @@ -266,11 +238,7 @@ ivas_error ivas_mct_dec( } /* Postprocessing for ACELP/MDCT core switching and synchronization */ -#ifdef FIX_ISM_DTX_CLICKS if ( ( error = core_switching_post_dec( sts[n], synth[n], output[cpe_id * CPE_CHANNELS + n], hCPE->output_mem[1], st_ivas->ivas_format, 0, output_frame, 0 /*core_switching_flag*/, st_ivas->sba_dirac_stereo_flag, -1, hCPE->last_element_mode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = core_switching_post_dec( sts[n], synth[n], output[cpe_id * CPE_CHANNELS + n], hCPE->output_mem[1], 0, output_frame, 0 /*core_switching_flag*/, st_ivas->sba_dirac_stereo_flag, -1, hCPE->last_element_mode ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -304,7 +272,6 @@ ivas_error ivas_mct_dec( } #endif } -#ifdef ISSUE_24_CLEANUP_MCT_LFE /* move channels after LFE to correct output for multi-channel MCT */ if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) { @@ -320,7 +287,6 @@ ivas_error ivas_mct_dec( mvr2r( tmp, output[LFE_CHANNEL - 1], output_frame ); set_zero( output[LFE_CHANNEL], output_frame ); } -#endif #ifdef DEBUG_MODE_INFO for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) @@ -370,23 +336,6 @@ ivas_error create_mct_dec( *-----------------------------------------------------------------*/ /* Determine active channels */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) - { - hMCT->num_lfe = st_ivas->hTransSetup.num_lfe; - hMCT->nchan_out_woLFE = st_ivas->nchan_transport - hMCT->num_lfe; /* LFE channel is coded separately */ - } - else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) - { - hMCT->num_lfe = 0; - hMCT->nchan_out_woLFE = st_ivas->nchan_transport; - } - else if ( st_ivas->ivas_format == SBA_FORMAT ) - { - hMCT->num_lfe = 0; - hMCT->nchan_out_woLFE = st_ivas->nchan_transport; - } -#else if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT ) { hMCT->nchan_out_woLFE = st_ivas->nchan_transport; @@ -395,7 +344,6 @@ ivas_error create_mct_dec( { hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; } -#endif else { assert( !"IVAS format currently not supported for MCT" ); @@ -409,20 +357,10 @@ ivas_error create_mct_dec( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( hMCT->num_lfe > 0 ) && ( ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_LFE; - } -#endif } } /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ - if ( ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ) % + if ( ( hMCT->nchan_out_woLFE ) % 2 ) { st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; @@ -503,23 +441,6 @@ ivas_error mct_dec_reconfigure( if ( b_nchan_change ) { /* Determine active channels */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) - { - hMCT->num_lfe = st_ivas->hTransSetup.num_lfe; - hMCT->nchan_out_woLFE = st_ivas->nchan_transport - hMCT->num_lfe; /* LFE channel is coded separately */ - } - else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) - { - hMCT->num_lfe = 0; - hMCT->nchan_out_woLFE = st_ivas->nchan_transport; - } - else if ( st_ivas->ivas_format == SBA_FORMAT ) - { - hMCT->num_lfe = 0; - hMCT->nchan_out_woLFE = st_ivas->nchan_transport; - } -#else if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) || st_ivas->ivas_format == SBA_FORMAT ) { hMCT->nchan_out_woLFE = st_ivas->nchan_transport; @@ -528,7 +449,6 @@ ivas_error mct_dec_reconfigure( { hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; } -#endif else { assert( !"IVAS format currently not supported for MCT" ); @@ -541,21 +461,11 @@ ivas_error mct_dec_reconfigure( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( hMCT->num_lfe > 0 ) && ( ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_LFE; - } -#endif } } /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ - if ( ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ) % + if ( ( hMCT->nchan_out_woLFE ) % 2 ) { st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; @@ -574,18 +484,10 @@ ivas_error mct_dec_reconfigure( st->total_brate = st_ivas->hCPE[cpe_id]->element_brate; if ( !( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) || -#endif ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) ) { st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); - st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag ); if ( st->igf ) { IGFDecSetMode( st->hIGFDec, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, -1, -1, st->rf_flag ); @@ -796,11 +698,7 @@ static ivas_error ivas_mc_dec_reconfig( { nchan_hp20_old = nchan_transport_old; } -#ifdef SBA2MONO st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#else - st_ivas->sba_dirac_stereo_flag = 0; /* needs to be after getNumChanSynthesis() */ -#endif /* renderer might have changed, reselect */ renderer_type_old = st_ivas->renderer_type; @@ -980,24 +878,8 @@ static ivas_error ivas_mc_dec_reconfig( } } - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); - } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - else if ( last_mc_mode == MC_MODE_PARAMMC && st_ivas->mc_mode == MC_MODE_MCT && nchan_transport_old > 2 ) - { -#ifdef DEBUGGING - assert( st_ivas->hCPE[1] != NULL ); -#endif - st = st_ivas->hCPE[1]->hCoreCoder[1]; - st->mct_chan_mode = MCT_CHAN_MODE_LFE; - st->hTcxCfg->fIsTNSAllowed = 0; + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( ivas_total_brate, st->igf, st->element_mode ); } -#endif if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { uint8_t separateChannelEnabled; @@ -1080,11 +962,6 @@ static ivas_error ivas_mc_dec_reconfig( return error; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - /* reuse core-coder buffers for LFE decoder */ - st_ivas->hLFE->prevsynth_buf = &st_ivas->hCPE[1]->hCoreCoder[1]->old_synth_sw[0]; - st_ivas->hLFE->prior_out_buffer = &st_ivas->hCPE[1]->hCoreCoder[1]->previoussynth[0]; -#endif set_zero( st_ivas->hLFE->prevsynth_buf, LFE_PLC_BUFLEN ); set_zero( st_ivas->hLFE->prior_out_buffer, L_FRAME48k ); diff --git a/lib_dec/ivas_mct_dec_mct.c b/lib_dec/ivas_mct_dec_mct.c index 68a846b876..987a9cc72f 100644 --- a/lib_dec/ivas_mct_dec_mct.c +++ b/lib_dec/ivas_mct_dec_mct.c @@ -49,12 +49,7 @@ static void indexToChannelPair( MCT_DEC_BLOCK_DATA_HANDLE hBlock, const int16_t nChannels, - const int16_t pairIdx -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - Decoder_State **sts /* i/o: decoder state structure */ -#endif -) + const int16_t pairIdx ) { int16_t ch1, ch2; int16_t tmpIdx = 0; @@ -63,12 +58,6 @@ static void indexToChannelPair( { for ( ch1 = 0; ch1 < ch2; ch1++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[ch1]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch2]->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - continue; - } -#endif if ( tmpIdx == pairIdx ) { @@ -111,9 +100,6 @@ void ivas_mct_dec_mct( for ( ch = 0; ch < nchan; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE ) && -#endif hMCT->currBlockDataCnt && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { hMCT->mc_global_ild[ch] = get_next_indice( sts[0], SMDCT_GLOBAL_ILD_BITS ); @@ -129,9 +115,6 @@ void ivas_mct_dec_mct( for ( ch = 0; ch < nchan; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE && -#endif sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { hMCT->lowE_ch[ch] = get_next_indice( sts[0], 1 ); @@ -142,9 +125,6 @@ void ivas_mct_dec_mct( for ( ch = 0; ch < nchan; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE && -#endif sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { nchan_active++; @@ -158,12 +138,7 @@ void ivas_mct_dec_mct( /*get channel pair index from BS*/ channelPairIndex = get_next_indice( sts[0], hMCT->bitsChannelPairIndex ); - indexToChannelPair( hBlock, nchan, channelPairIndex -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - sts -#endif - ); + indexToChannelPair( hBlock, nchan, channelPairIndex ); /*point to decoder states of actual channels to read block pair bits*/ p_st[0] = sts[hBlock->ch1]; @@ -192,11 +167,7 @@ static void applyGlobalILD( int16_t nSubframes, L_subframeTCX; float qratio; - for ( ch = 0; ch < ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + for ( ch = 0; ch < ( hMCT->nchan_out_woLFE ); ch++ ) { nSubframes = ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV; @@ -279,11 +250,7 @@ void mctStereoIGF_dec( float *p_x[CPE_CHANNELS][NB_DIV]; int16_t singleChEle[MCT_MAX_CHANNELS]; - set_s( singleChEle, 1, ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ) ); + set_s( singleChEle, 1, ( hMCT->nchan_out_woLFE ) ); for ( b = 0; b < hMCT->currBlockDataCnt; b++ ) { @@ -336,17 +303,9 @@ void mctStereoIGF_dec( } - if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ) ) != 0 ) + if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE ) ) != 0 ) { - for ( ch = 0; ch < ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + for ( ch = 0; ch < ( hMCT->nchan_out_woLFE ); ch++ ) { if ( singleChEle[ch] ) @@ -356,11 +315,7 @@ void mctStereoIGF_dec( { continue; } - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || st->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 83aac5cbc1..843c739fbc 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -35,6 +35,9 @@ #include "options.h" #include "prot.h" #include "rom_com.h" +#ifdef SNS_MSVQ +#include "ivas_rom_com.h" +#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -162,26 +165,11 @@ static void dec_prm_tcx_sidebits( getTCXWindowing( st->core, st->last_core, st->element_mode, st->hTcxCfg, st0 ); st->hTcxDec->kernel_type[0] = st->hTcxDec->kernel_type[1] = MDCT_IV; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->element_mode == IVAS_CPE_MDCT && st->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { -#endif - st->hTcxDec->kernel_type[0] = get_next_indice( st0, st->last_core_from_bs != ACELP_CORE ? 2 : 1 ); - if ( st->core == TCX_10_CORE ) - { - st->hTcxDec->kernel_type[1] = 2 * ( st->hTcxDec->kernel_type[0] & 1 ) + get_next_indice( st0, 1 ); - } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } - - - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) + st->hTcxDec->kernel_type[0] = get_next_indice( st0, st->last_core_from_bs != ACELP_CORE ? 2 : 1 ); + if ( st->core == TCX_10_CORE ) { - st->hTcxCfg->tcx_curr_overlap_mode = FULL_OVERLAP; - st->hTcxCfg->tcx_last_overlap_mode = FULL_OVERLAP; - st->hTcxCfg->last_aldo = 0; + st->hTcxDec->kernel_type[1] = 2 * ( st->hTcxDec->kernel_type[0] & 1 ) + get_next_indice( st0, 1 ); } -#endif if ( st->core == TCX_20_CORE ) { st->transform_type[0] = st->transform_type[1] = TCX_20; @@ -298,13 +286,10 @@ static void dec_prm_tcx_spec( *-----------------------------------------------------------------*/ void ivas_mdct_dec_side_bits_frame_channel( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - int16_t param_lpc[MCT_MAX_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ - int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */ - Decoder_State *st0, /* i : pointer to bitstream handle */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t *LFE_off, /* o : flag if LFE has content */ -#endif + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + int16_t param_lpc[MCT_MAX_CHANNELS][NPRM_LPC_NEW], /* o : lpc_parameters */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to param buffer */ + Decoder_State *st0, /* i : pointer to bitstream handle */ int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* o : number of bits for TNS */ int16_t param[CPE_CHANNELS][DEC_NPRM_DIV * NB_DIV], /* i/o: parameters buffer */ const int16_t MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ @@ -346,14 +331,7 @@ void ivas_mdct_dec_side_bits_frame_channel( continue; } st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - *LFE_off = get_next_indice( st0, 1 ); - } - else -#endif - if ( MCT_flag ) + if ( MCT_flag ) { tmp = get_next_indice( st0, 1 ); if ( tmp ) @@ -371,11 +349,7 @@ void ivas_mdct_dec_side_bits_frame_channel( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && *LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { sts[ch]->coder_type = INACTIVE; sts[ch]->side_bits_frame_channel = 0; @@ -397,17 +371,113 @@ void ivas_mdct_dec_side_bits_frame_channel( * SNS parameters *--------------------------------------------------------------------------------*/ +#ifdef SNS_MSVQ + sns_low_br_mode = 0; + skipped_first_channel = 0; + if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + { + param_lpc[0][0] = SNS_STEREO_MODE_LR; + param_lpc[0][1] = SNS_STEREO_MODE_LR; + param_lpc[0][2] = 0; + param_lpc[0][3] = 0; + if ( sts[0]->core == sts[1]->core ) + { + int16_t nSubframes; + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + + for ( int16_t n = 0; n < nSubframes; ++n ) + { + param_lpc[0][n] = get_next_indice( st0, 1 ); + } + + /* zero side flags only get transmitted if needed */ + for ( int16_t n = 0; n < nSubframes; ++n ) + { + if ( param_lpc[0][n] == SNS_STEREO_MODE_MS ) + { + param_lpc[0][n + SNS_STEREO_MODE_OFFSET_INDICES / 2] = get_next_indice( st0, 1 ); + } + } + } + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + int16_t nSubframes; + int16_t idxIndices; + + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + idxIndices = 0; + + for ( int16_t n = 0; n < nSubframes; ++n ) + { + const int16_t is_side = ch == 1 && param_lpc[0][n] == SNS_STEREO_MODE_MS; + const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; + int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + + if ( is_side ) + { + /* check for zero-side flag */ + if ( param_lpc[0][n + SNS_STEREO_MODE_OFFSET_INDICES / 2] ) + { + continue; + } + nStages = SNS_MSVQ_NSTAGES_SIDE; + bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; + } + for ( int16_t j = 0; j < nStages; ++j ) + { + /* plus one in index for stereo mode storage! */ + param_lpc[ch][j + idxIndices + SNS_STEREO_MODE_OFFSET_INDICES] = get_next_indice( st0, bits[j] ); + } + idxIndices += nStages; + } + } + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + skipped_first_channel = 1; + continue; + } + + start_bit_pos_sns = st0->next_bit_pos; + + if ( ch == 0 || skipped_first_channel ) + { + /* read SNS stereo mode */ + param_lpc[0][0] = get_next_indice( st0, 1 ) << 1; + + /* read low br mode flag (if it is possible to be non-zero) */ + if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) + { + sns_low_br_mode = get_next_indice( st0, 1 ); + } + } + + tmp = ch; + if ( ch == 1 && param_lpc[0][0] == 2 ) + { + tmp = 3; + } + + getLPCparam( st, ¶m_lpc[ch][0], st0, tmp, sns_low_br_mode && !( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ); + + st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; + } + } +#else skipped_first_channel = 0; sns_low_br_mode = 0; for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && *LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { skipped_first_channel = 1; continue; @@ -421,11 +491,7 @@ void ivas_mdct_dec_side_bits_frame_channel( param_lpc[0][0] = get_next_indice( st0, 1 ) << 1; /* read low br mode flag (if it is possible to be non-zero) */ - if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[1]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) ) + if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) { sns_low_br_mode = get_next_indice( st0, 1 ); } @@ -441,6 +507,7 @@ void ivas_mdct_dec_side_bits_frame_channel( st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; } +#endif // SNS_MSVQ } return; @@ -454,10 +521,7 @@ void ivas_mdct_dec_side_bits_frame_channel( *-----------------------------------------------------------------*/ void ivas_mdct_core_invQ( - CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t LFE_off, /* i : flag if LFE content */ -#endif + CPE_DEC_HANDLE hCPE, /* i/o: CPE handle */ int16_t nTnsBitsTCX10[CPE_CHANNELS][NB_DIV], /* i : number of TNS bits */ int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to param buffer */ int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW], /* i : lpc parameters */ @@ -479,7 +543,11 @@ void ivas_mdct_core_invQ( int16_t *prm[CPE_CHANNELS]; /* LPC */ Word16 Aind[CPE_CHANNELS][M + 1]; +#ifdef SNS_MSVQ + float sns[CPE_CHANNELS][NB_DIV][M]; +#else float lsf[CPE_CHANNELS][( NB_DIV + 1 ) * M]; +#endif /* TCX */ float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; int16_t tcx_offset[CPE_CHANNELS]; @@ -544,11 +612,7 @@ void ivas_mdct_core_invQ( { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { st->total_brate = st->bits_frame_channel; continue; @@ -602,13 +666,6 @@ void ivas_mdct_core_invQ( /* PLC: [Common: mode decision] * PLC: Decide which Concealment to use. Update pitch lags if needed */ st->core = GetPLCModeDecision( st ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - /*disable ACELP_PLC for LFE channel */ - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - st->core = st->last_core; - } -#endif } if ( ( !st->bfi || st->hTcxCfg->psychParamsCurrent == NULL ) && st->core > ACELP_CORE ) @@ -657,6 +714,33 @@ void ivas_mdct_core_invQ( * LPC PARAMETERS *--------------------------------------------------------------------------------*/ +#ifdef SNS_MSVQ + if ( bfi == 0 ) + { + if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + { + dequantize_sns( param_lpc, sns, sts ); + } + else + { + if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + sns_avq_dec_stereo( param_lpc[0], param_lpc[1], &sns[0][0][0], &sns[1][0][0] ); + } + else + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) + { + sns_avq_dec( param_lpc[ch], sns[ch], st->numlpc ); + } + } + } + } + } +#else if ( bfi == 0 ) { if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) @@ -675,6 +759,8 @@ void ivas_mdct_core_invQ( } } } +#endif + /*--------------------------------------------------------------* * Rate switching @@ -698,11 +784,7 @@ void ivas_mdct_core_invQ( { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { set_f( x[ch][0], 0.f, st->hTcxCfg->tcx_coded_lines ); /* usually set in decoder_tcx_invQ(), needed for concealment */ @@ -722,7 +804,11 @@ void ivas_mdct_core_invQ( /* Stability Factor */ if ( !bfi ) { +#ifdef SNS_MSVQ + mvr2r( sns[ch][k], &Aq[ch][k * M], M ); +#else mvr2r( &lsf[ch][( k + 1 ) * M], &Aq[ch][k * M], M ); +#endif } else { @@ -758,13 +844,6 @@ void ivas_mdct_core_invQ( decoder_tcx_noiseshaping_igf( st, L_spec[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x[ch][k], NULL, &tmp_concealment_method, bfi ); } } - -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) /*indicates LFE with no content*/ - { - set_f( &x[ch][0][MCT_LFE_MAX_LINE], 0.f, st->hTcxCfg->tcx_coded_lines - MCT_LFE_MAX_LINE ); - } -#endif } pop_wmops(); @@ -782,11 +861,8 @@ void ivas_mdct_core_reconstruct( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ float *x[][NB_DIV], /* i/o: synthesis @internal_FS */ float signal_outFB[CPE_CHANNELS][L_FRAME_PLUS], /* o : synthesis @output_FS */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t LFE_off, /* i : flag if LFE content */ -#endif - int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ - const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ + int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : flage TNS enabled */ + const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ ) { int16_t ch, k, bfi; @@ -808,9 +884,6 @@ void ivas_mdct_core_reconstruct( int16_t pitch[CPE_CHANNELS][NB_SUBFR16k]; float pit_gain[CPE_CHANNELS][NB_SUBFR16k]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t isLFE; -#endif int16_t skip_decoding; set_f( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); @@ -825,21 +898,10 @@ void ivas_mdct_core_reconstruct( st = sts[ch]; skip_decoding = 0; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { skip_decoding = 1; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - isLFE = 0; - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - isLFE = 1; - } -#endif nSubframes[ch] = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; synth = synth_buf + st->hTcxDec->old_synth_len; @@ -866,9 +928,6 @@ void ivas_mdct_core_reconstruct( tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], &x[ch][k][0], xn_buf, ( ( hCPE->nchan_out == 1 && st->hTcxDec->kernel_type[k] == MDST_IV ) || st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) ? MDCT_IV : st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth[k * L_frame[ch]], &synthFB[k * L_frameTCX[ch]], bfi, k, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - isLFE, -#endif 0 ); } else @@ -1015,10 +1074,7 @@ void ivas_mdct_core_reconstruct( *-----------------------------------------------------------------*/ void ivas_mdct_core_tns_ns( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t LFE_off, /* i : flag if LFE has content */ -#endif + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ int16_t fUseTns[CPE_CHANNELS][NB_DIV], /* i : two entries for each channel in TCX10 */ STnsData tnsData[CPE_CHANNELS][NB_DIV], /* o : TNS parameter */ float *x[CPE_CHANNELS][NB_DIV], /* o : synthesis @internal_FS */ @@ -1046,6 +1102,7 @@ void ivas_mdct_core_tns_ns( set_f( xn_buf, 0, L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX ); + /* TNS, ITF, IMDCT and updates */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -1056,9 +1113,6 @@ void ivas_mdct_core_tns_ns( L_spec[ch] = st->hTcxCfg->tcx_coded_lines / nSubframes[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && LFE_off ) || -#endif ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) || ( st->bfi && st->core == ACELP_CORE ) ) /* indicates LFE with no content, or odd number of channels */ { if ( st->hTonalMDCTConc != NULL ) diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index b396fa415c..2fb04af8d7 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -601,11 +601,7 @@ void ivas_ls_setup_conversion_process_mdct( dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - !( chInIdx == LFE_CHANNEL && st_ivas->hMCT->LFE_off ) && -#else chInIdx != LFE_CHANNEL && -#endif mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE ) { /* Step 1: Compute the target energy and DMX signal (possible since we have all signals in TCX20 resolution) */ @@ -700,11 +696,7 @@ void ivas_ls_setup_conversion_process_mdct( for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - !( chInIdx == LFE_CHANNEL && st_ivas->hMCT->LFE_off ) && -#else chInIdx != LFE_CHANNEL && -#endif mct_chan_mode[chInIdx] != MCT_CHAN_MODE_IGNORE ) { if ( transform_type[chInIdx][0] == TCX_20 ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index f522a3217d..ff73e6aa49 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -114,7 +114,7 @@ void ivas_renderer_select( else { *renderer_type = RENDERER_BINAURAL_MIXER_CONV_ROOM; -#if defined( DEBUGGING ) +#ifdef DEBUGGING if ( st_ivas->hRenderConfig->renderer_type_override == RENDER_TYPE_OVERRIDE_FASTCONV ) { *renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM; @@ -303,11 +303,7 @@ void ivas_renderer_select( *renderer_type = RENDERER_DIRAC; if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && -#ifdef SBA2MONO ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) ) -#else - ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM ) ) -#endif { if ( output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_FOA ) { @@ -324,11 +320,7 @@ void ivas_renderer_select( st_ivas->renderer_type = RENDERER_SBA_LINEAR_DEC; } else if ( ( st_ivas->ivas_format == MASA_FORMAT && output_config == AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) || -#ifdef SBA2MONO ( st_ivas->ivas_format == SBA_FORMAT && ( output_config == AUDIO_CONFIG_STEREO || output_config == AUDIO_CONFIG_MONO ) ) ) -#else - ( st_ivas->ivas_format == SBA_FORMAT && output_config == AUDIO_CONFIG_STEREO && st_ivas->nchan_transport == 1 ) ) -#endif { *renderer_type = RENDERER_DISABLE; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 5377ad9402..af7281a578 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -47,7 +47,6 @@ #include "wmc_auto.h" -#ifdef FIX_386_CORECODER_RECONFIG /*-------------------------------------------------------------------* * ivas_sba_set_cna_cng_flag() * @@ -93,7 +92,6 @@ void ivas_sba_set_cna_cng_flag( return; } -#endif /*-------------------------------------------------------------------* @@ -132,20 +130,7 @@ ivas_error ivas_sba_dec_reconfigure( *-----------------------------------------------------------------*/ ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); -#ifndef SBA_HPF_TUNING_DEC nchan_hp20_old = getNumChanSynthesis( st_ivas ); -#else - int16_t analysis_order_old; - analysis_order_old = ivas_sba_get_analysis_order( last_ivas_total_brate, st_ivas->sba_order ); - if ( analysis_order_old > 1 ) - { - nchan_hp20_old = 0; - } - else - { - nchan_hp20_old = st_ivas->nchan_transport; - } -#endif nSCE_old = st_ivas->nSCE; nCPE_old = st_ivas->nCPE; nchan_transport_old = st_ivas->nchan_transport; @@ -167,11 +152,7 @@ ivas_error ivas_sba_dec_reconfigure( return error; } -#ifdef SBA2MONO st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#else - st_ivas->sba_dirac_stereo_flag = ( st_ivas->nchan_transport == 1 && hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ); -#endif } else { @@ -210,11 +191,7 @@ ivas_error ivas_sba_dec_reconfigure( } hSpar = st_ivas->hSpar; -#ifdef SBA2MONO st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#else - st_ivas->sba_dirac_stereo_flag = 0; -#endif } if ( st_ivas->nchan_transport == 1 ) diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 82ccaceea9..644a3dc523 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -45,7 +45,6 @@ #include "wmc_auto.h" -#ifdef SBA2MONO /*-------------------------------------------------------------------* * ivas_get_sba_dirac_stereo_flag() * @@ -82,7 +81,6 @@ int16_t ivas_get_sba_dirac_stereo_flag( return sba_dirac_stereo_flag; } -#endif /*-------------------------------------------------------------------* @@ -493,22 +491,17 @@ static void ivas_sba_dirac_stereo_upmix_hb( float hb_gain[NB_DIV], /* i : side gains for HB signal */ const int16_t output_frame, /* i : output frame length per channel */ const int16_t mcmasa, /* i : McMASA flag */ -#ifdef SBA2MONO - const int16_t sba_mono_flag, /* i : flag for mono output */ - const int16_t bwidth, /* i : bandwidth of signal */ -#endif - const STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i : Stereo DFT handle for mixing matrix */ + const int16_t sba_mono_flag, /* i : flag for mono output */ + const int16_t bwidth, /* i : bandwidth of signal */ + const STEREO_DFT_DEC_DATA_HANDLE hStereoDft /* i : Stereo DFT handle for mixing matrix */ ) { int16_t i; -#ifdef SBA2MONO float gp, gm; float gain_fac; -#endif if ( !mcmasa ) { -#ifdef SBA2MONO gain_fac = ( bwidth == FB ) ? 0.25f : 0.33f; /* last matrix element not used for SWB, divide by 3 instead of 4*/ if ( sba_mono_flag ) { @@ -579,38 +572,6 @@ static void ivas_sba_dirac_stereo_upmix_hb( hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * gain_fac * gm; } } -#else - for ( i = 0; i < output_frame / 2; i++ ) - { - float gp = hStereoDft->mixer_mat_smooth[0][0][8] + hStereoDft->mixer_mat_smooth[1][0][8] + - hStereoDft->mixer_mat_smooth[0][0][9] + hStereoDft->mixer_mat_smooth[1][0][9] + - hStereoDft->mixer_mat_smooth[0][0][10] + hStereoDft->mixer_mat_smooth[1][0][10] + - hStereoDft->mixer_mat_smooth[0][0][11] + hStereoDft->mixer_mat_smooth[1][0][11]; - - float gm = hStereoDft->mixer_mat_smooth[0][0][8] - hStereoDft->mixer_mat_smooth[1][0][8] + - hStereoDft->mixer_mat_smooth[0][0][9] - hStereoDft->mixer_mat_smooth[1][0][9] + - hStereoDft->mixer_mat_smooth[0][0][10] - hStereoDft->mixer_mat_smooth[1][0][10] + - hStereoDft->mixer_mat_smooth[0][0][11] - hStereoDft->mixer_mat_smooth[1][0][11]; - - hb_stereo_synth[0][i] = 0.5f * hb_synth[i] * 0.25f * gp; - hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * 0.25f * gm; - } - for ( i = output_frame / 2; i < output_frame; i++ ) - { - float gp = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][8 + IVAS_MAX_NUM_BANDS] + - hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][9 + IVAS_MAX_NUM_BANDS] + - hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][10 + IVAS_MAX_NUM_BANDS] + - hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS] + hStereoDft->mixer_mat_smooth[1][0][11 + IVAS_MAX_NUM_BANDS]; - - float gm = hStereoDft->mixer_mat_smooth[0][0][8 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][8 + IVAS_MAX_NUM_BANDS] + - hStereoDft->mixer_mat_smooth[0][0][9 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][9 + IVAS_MAX_NUM_BANDS] + - hStereoDft->mixer_mat_smooth[0][0][10 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][10 + IVAS_MAX_NUM_BANDS] + - hStereoDft->mixer_mat_smooth[0][0][11 + IVAS_MAX_NUM_BANDS] - hStereoDft->mixer_mat_smooth[1][0][11 + IVAS_MAX_NUM_BANDS]; - - hb_stereo_synth[0][i] = 0.5f * hb_synth[i] * 0.25f * gp; - hb_stereo_synth[1][i] = 0.5f * hb_synth[i] * 0.25f * gm; - } -#endif } else { @@ -853,9 +814,7 @@ void ivas_sba_dirac_stereo_dec( ) { int16_t dtx_flag, fd_cng_flag; -#ifdef SBA2MONO int16_t sba_mono_flag; -#endif int16_t memOffset; float tmp_buf[NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; float tmp_synth[L_FRAME16k]; @@ -880,9 +839,7 @@ void ivas_sba_dirac_stereo_dec( dtx_flag = ( hSCE->hCoreCoder[0]->core_brate <= SID_2k40 ); fd_cng_flag = ( dtx_flag && hSCE->hCoreCoder[0]->cng_type == FD_CNG ); } -#ifdef SBA2MONO sba_mono_flag = ( st_ivas->hDecoderConfig->nchan_out == 1 ) ? 1 : 0; -#endif memOffset = NS2SA( output_frame * FRAMES_PER_SEC, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); @@ -921,39 +878,26 @@ void ivas_sba_dirac_stereo_dec( } /* DFT Stereo upmix */ -#ifdef SBA2MONO stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1 /*st_ivas->sba_dirac_stereo_flag*/, sba_mono_flag, -#else - stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1, /*st_ivas->sba_dirac_stereo_flag*/ -#endif ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : 0, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hFbMixer->cross_fade_start_offset : 0, st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport ); /* DFT synthesis */ stereo_dft_dec_synthesize( hCPE, DFT, 0, output[0], output_frame ); -#ifdef SBA2MONO if ( !sba_mono_flag ) { stereo_dft_dec_synthesize( hCPE, DFT, 1, output[1], output_frame ); } -#else - stereo_dft_dec_synthesize( hCPE, DFT, 1, output[1], output_frame ); -#endif synchro_synthesis( st_ivas->hDecoderConfig->ivas_total_brate, hCPE, output, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); /* output scaling */ -#ifdef SBA2MONO if ( !sba_mono_flag ) { v_multc( output[0], 0.5f, output[0], output_frame ); v_multc( output[1], 0.5f, output[1], output_frame ); } -#else - v_multc( output[0], 0.5f, output[0], output_frame ); - v_multc( output[1], 0.5f, output[1], output_frame ); -#endif /* delay HB synth */ if ( st_ivas->nchan_transport == 1 ) @@ -970,26 +914,18 @@ void ivas_sba_dirac_stereo_dec( ivas_sba_dirac_stereo_compute_hb_gain( hStereoDft, hb_gain ); ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, -#ifdef SBA2MONO ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); -#else - ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ), hStereoDft ); -#endif /* add HB to ACELP core */ v_add( output[0], hb_synth_stereo[0], output[0], output_frame ); -#ifdef SBA2MONO if ( !sba_mono_flag ) { -#endif v_add( output[1], hb_synth_stereo[1], output[1], output_frame ); /* apply TD Stereo Filling as is done in ICBWE */ ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) ); -#ifdef SBA2MONO } -#endif } return; diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 064cdbb4e0..9a940b9b6d 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -77,11 +77,7 @@ ivas_error ivas_sce_dec( ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate; -#ifdef DISCRETE_ISM_DTX_CNG if ( st_ivas->ivas_format == ISM_FORMAT ) -#else - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) -#endif { st->cng_type = FD_CNG; } @@ -91,30 +87,30 @@ ivas_error ivas_sce_dec( *-----------------------------------------------------------------*/ /* set total_brate - needed in DTX */ - if ( !st_ivas->bfi && ( ivas_total_brate == IVAS_SID_5k2 ) ) + if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) { st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; assert( st->total_brate == SID_2k40 && "SCE SID must be 2.4kbps!" ); + +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id ) + { + st->total_brate = FRAME_NO_DATA; + } +#endif } +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA ) +#else else if ( !st_ivas->bfi && ivas_total_brate <= SID_2k40 ) +#endif { - st->total_brate = ivas_total_brate; + st->total_brate = FRAME_NO_DATA; } -#ifdef DISCRETE_ISM_DTX_CNG else if ( !st_ivas->bfi && st_ivas->ivas_format != ISM_FORMAT && last_ivas_total_brate <= IVAS_SID_5k2 ) { st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; } -#else - else if ( !st_ivas->bfi && ( last_ivas_total_brate <= SID_2k40 || last_ivas_total_brate == IVAS_SID_5k2 ) ) - { - /* check if this is indeed needed? */ - if ( st_ivas->ivas_format != ISM_FORMAT ) - { - st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; - } - } -#endif /* read the bandwidth */ if ( st_ivas->bfi || st->total_brate <= SID_2k40 ) @@ -181,11 +177,22 @@ ivas_error ivas_sce_dec( } /* set "total_brate" */ - if ( !st_ivas->bfi && ( ivas_total_brate == IVAS_SID_5k2 ) ) + if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) { st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; + +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id ) + { + st->total_brate = FRAME_NO_DATA; + } +#endif } +#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT + else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA ) +#else else if ( !st_ivas->bfi && ivas_total_brate <= SID_2k40 ) +#endif { st->total_brate = ivas_total_brate; } @@ -365,11 +372,7 @@ ivas_error create_sce_dec( return error; } -#ifdef SBA2MONO if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) ) ) -#else - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) -#endif { if ( ( error = openCldfb( &st->cldfbSynHB, CLDFB_SYNTHESIS, st->output_Fs, CLDFB_PROTOTYPE_1_25MS ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_sns_dec.c b/lib_dec/ivas_sns_dec.c index 7aecb898d1..6cf80ec0d1 100644 --- a/lib_dec/ivas_sns_dec.c +++ b/lib_dec/ivas_sns_dec.c @@ -35,6 +35,10 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" +#ifdef SNS_MSVQ +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#endif #include "wmc_auto.h" /*------------------------------------------------------------------- @@ -103,14 +107,22 @@ static void sns_2st_dec( *-------------------------------------------------------------------*/ void sns_avq_dec( - int16_t *index, /* i : Quantization indices */ - float *SNS_Q, /* o : Quantized SNS vectors */ + int16_t *index, /* i : Quantization indices */ +#ifdef SNS_MSVQ + float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ +#else + float *SNS_Q, /* o : Quantized SNS vectors */ +#endif const int16_t numlpc /* i : Number of sets of lpc */ ) { int16_t i, nbi, last; int16_t q_type; +#ifdef SNS_MSVQ + /* go from one-based indexing to zero-based indexing */ + last = numlpc - 1; +#else /* Last LPC index */ if ( numlpc == 1 ) { @@ -120,12 +132,18 @@ void sns_avq_dec( { last = M; } +#endif index++; /* Decode last LPC */ +#ifdef SNS_MSVQ + sns_1st_dec( *index++, SNS_Q[last] ); + sns_2st_dec( SNS_Q[last], index ); +#else sns_1st_dec( *index++, &SNS_Q[last] ); sns_2st_dec( &SNS_Q[last], index ); +#endif nbi = 2 + index[0] + index[1]; index += nbi; @@ -136,16 +154,29 @@ void sns_avq_dec( if ( q_type == 0 ) { +#ifdef SNS_MSVQ + sns_1st_dec( *index++, SNS_Q[0] ); + sns_2st_dec( SNS_Q[0], index ); +#else sns_1st_dec( *index++, &SNS_Q[0] ); sns_2st_dec( &SNS_Q[0], index ); +#endif } else if ( q_type == 1 ) { for ( i = 0; i < M; i++ ) { +#ifdef SNS_MSVQ + SNS_Q[0][i] = SNS_Q[0][M + i]; +#else SNS_Q[i] = SNS_Q[M + i]; +#endif } +#ifdef SNS_MSVQ + sns_2st_dec( SNS_Q[0], index ); +#else sns_2st_dec( &SNS_Q[0], index ); +#endif } } @@ -160,10 +191,10 @@ void sns_avq_dec( *-------------------------------------------------------------------*/ void sns_avq_dec_stereo( - int16_t *indexl, /* i : Quantization indices (left channel) */ - int16_t *indexr, /* i : Quantization indices (right channe) */ - float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ - float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ + int16_t *indexl, /* i : Quantization indices (left channel) */ + int16_t *indexr, /* i : Quantization indices (right channe) */ + float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ + float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ ) { int16_t i, stereo_mode; @@ -208,3 +239,92 @@ void sns_avq_dec_stereo( return; } + +#ifdef SNS_MSVQ +void dequantize_sns( + int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW], + float snsQ_out[CPE_CHANNELS][NB_DIV][M], + Decoder_State **sts ) +{ + int16_t nSubframes, k, ch; + const float *means; + int16_t sns_stereo_mode[NB_DIV]; + int16_t zero_side_flag[NB_DIV]; + Decoder_State *st; + + sns_stereo_mode[0] = indices[0][0]; + sns_stereo_mode[1] = indices[0][1]; + zero_side_flag[0] = indices[0][2]; + zero_side_flag[1] = indices[0][3]; + + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + int16_t idxIndices; + + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + idxIndices = 0; + + for ( k = 0; k < nSubframes; ++k ) + { + const int16_t is_side = ch == 1 && sns_stereo_mode[k] == SNS_STEREO_MODE_MS; + const float *const *cdbks = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20 : ivas_sns_cdbks_tcx10; + int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + float *snsQ = snsQ_out[ch][k]; + + if ( is_side ) + { + const float *const *side_cdbks = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20 : ivas_sns_cdbks_side_tcx10; + if ( zero_side_flag[k] ) + { + set_zero( snsQ, M ); + continue; + } + + nStages = SNS_MSVQ_NSTAGES_SIDE; + means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_side_tcx20 : ivas_sns_means_side_tcx10; +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL ); +#else + msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], snsQ, NULL ); +#endif + + v_add( snsQ, means, snsQ, M ); + } + else + { +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL ); +#else + msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], snsQ, NULL ); +#endif + } + idxIndices += nStages; + } + } + + if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; ++k ) + { + if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) + { + inverseMS( M, snsQ_out[0][k], snsQ_out[1][k], 1.f ); + } + } + } + + /* add means back */ + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; + for ( k = 0; k < nSubframes; ++k ) + { + v_add( snsQ_out[ch][k], means, snsQ_out[ch][k], M ); + } + } +} +#endif // SNS_MSVQ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 8c27a09baf..4a17c75dda 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -391,9 +391,7 @@ typedef struct int16_t dtx_flag; int16_t sce_id_dtx; -#ifdef DISCRETE_ISM_DTX_CNG int16_t ism_dtx_hangover_cnt; /* hangover counter for ISM DTX decoder */ -#endif } ISM_DTX_DATA_DEC; @@ -953,14 +951,8 @@ typedef struct mct_dec_data_structure MCT_DEC_BLOCK_DATA_HANDLE hBlockData[MCT_MAX_BLOCKS]; int16_t chBitRatios[MCT_MAX_CHANNELS]; - int16_t lowE_ch[MCT_MAX_CHANNELS]; /* note: pointer to local parameter */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t LFE_off; -#endif + int16_t lowE_ch[MCT_MAX_CHANNELS]; /* note: pointer to local parameter */ uint16_t mc_global_ild[MCT_MAX_CHANNELS]; /* note: pointer to local parameter */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t num_lfe; -#endif } MCT_DEC_DATA, *MCT_DEC_HANDLE; @@ -976,15 +968,9 @@ typedef struct ivas_lfe_dec_data_structure int16_t lfe_dec_indices_coeffs_tbl[IVAS_MAX_NUM_QUANT_STRATS][IVAS_MAX_NUM_DCT_COEF_GROUPS]; float lfe_block_delay_s; int16_t lfe_prior_buf_len; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - float *prior_out_buffer; - - float *prevsynth_buf; -#else float prior_out_buffer[L_FRAME48k]; float prevsynth_buf[LFE_PLC_BUFLEN]; -#endif float *lfe_delay_buf; int16_t lfe_addl_delay; int16_t bfi_count; @@ -1108,7 +1094,6 @@ typedef struct ivas_mcmasa_lfe_synth_struct } MCMASA_LFE_SYNTH_DATA, *MCMASA_LFE_SYNTH_DATA_HANDLE; -#ifdef FIX_350_MASA_DELAY_COMP typedef struct ivas_masa_decoder_ext_out_meta_struct { MASA_DECRIPTIVE_META descriptiveMeta; @@ -1121,16 +1106,13 @@ typedef struct ivas_masa_decoder_ext_out_meta_struct uint8_t diffuseToTotalRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; } MASA_DECODER_EXT_OUT_META; -#endif typedef struct ivas_masa_decoder_data_struct { int16_t band_mapping[MASA_FREQUENCY_BANDS + 1]; SPHERICAL_GRID_DATA *sph_grid16; -#ifdef FIX_350_MASA_DELAY_COMP MASA_DECODER_EXT_OUT_META *extOutMeta; -#endif float dir_decode_quality; } MASA_DECODER_DATA; @@ -1224,9 +1206,7 @@ typedef struct Decoder_Struct LFE_DEC_HANDLE hLFE; /* LFE handle */ ISM_MODE ism_mode; /* ISM format mode */ -#ifdef NCHAN_ISM_PARAMETER int16_t nchan_ism; /* number of ISM channels */ -#endif SBA_MODE sba_mode; /* SBA format mode */ MC_MODE mc_mode; /* MC format mode */ int16_t sba_order; /* Ambisonic (SBA) order */ @@ -1261,10 +1241,8 @@ typedef struct Decoder_Struct int32_t noClipping; /* number of clipped samples */ #endif int32_t last_active_ivas_total_brate; -#ifdef FIX_379_EXT_METADATA int16_t ism_extmeta_active; /* Extended metadata active in decoder */ int16_t ism_extmeta_cnt; /* Change frame counter for extended metadata */ -#endif } Decoder_Struct; diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index b55cf4cfbd..2e31375996 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -90,8 +90,12 @@ void stereo_dft_dec_sid_coh( int16_t bits_tmp; int16_t b; +#ifdef FIX_418_SID_BITRATE + nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else /* TODO: still use old number of bits to keep bitexactness in output */ nr_of_sid_stereo_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */ /* from the previous frame is used. */ @@ -174,7 +178,9 @@ void stereo_dft_dec_sid_coh( ( *nb_bits )++; } +#ifndef FIX_418_SID_BITRATE dtx_read_padding_bits( st, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); +#endif return; } diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 769f6016b4..1fac575de9 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1126,13 +1126,11 @@ void stereo_dft_dec( float *input_mem, /* i/o: mem of buffer DFT analysis */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ const int16_t sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ -#ifdef SBA2MONO - const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */ -#endif - ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ - const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ - const int32_t output_Fs, /* i : Fs for delay calculation */ - const int16_t nchan_transport /* i : number of transpor channels */ + const int16_t sba_mono_flag, /* i : signal mono output for SBA DirAC */ + ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ + const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ + const int32_t output_Fs, /* i : Fs for delay calculation */ + const int16_t nchan_transport /* i : number of transpor channels */ ) { int16_t i, k, b, N_div, stop; @@ -1413,7 +1411,6 @@ void stereo_dft_dec( if ( nchan_transport == 1 ) { -#ifdef SBA2MONO if ( sba_mono_flag ) { if ( b == 0 ) @@ -1451,7 +1448,6 @@ void stereo_dft_dec( } else { -#endif if ( b == 0 ) { i = 0; @@ -1496,9 +1492,7 @@ void stereo_dft_dec( DFT_L[2 * i + 1] = DFT_W + DFT_Y; DFT_R[2 * i + 1] = DFT_W - DFT_Y; } -#ifdef SBA2MONO } -#endif } else if ( nchan_transport >= 2 ) { diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index ab8844c8e8..cbeaf2a1e5 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -222,9 +222,6 @@ void stereo_mdct_core_dec( if ( !bfi ) { ivas_mdct_dec_side_bits_frame_channel( hCPE, param_lpc, p_param, hCPE->hCoreCoder[0], -#ifndef ISSUE_24_CLEANUP_MCT_LFE - NULL, -#endif nTnsBitsTCX10, param, 0, 0 ); if ( sts[0]->igf ) @@ -257,9 +254,6 @@ void stereo_mdct_core_dec( } ivas_mdct_core_invQ( hCPE, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - 0, -#endif nTnsBitsTCX10, p_param, param_lpc, param, fUseTns, tnsData, x_0, x, Aq, ms_mask, 0 ); for ( ch = 0; ch < nChannels; ch++ ) @@ -354,9 +348,6 @@ void stereo_mdct_core_dec( } ivas_mdct_core_tns_ns( hCPE, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - 0, -#endif fUseTns, tnsData, x, Aq, 0 ); if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) @@ -372,9 +363,6 @@ void stereo_mdct_core_dec( } ivas_mdct_core_reconstruct( hCPE, x, signal_outFB_tmp, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - 0, -#endif fUseTns, 0 ); mvr2r( signal_out_tmp[0], signal_out[0], L_FRAME48k ); diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 144f7950e9..0a436ec0d2 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -969,13 +969,6 @@ ivas_error stereo_memory_dec( for ( i = 0; i < CPE_CHANNELS; ++i ) { deleteFdCngDec( &hCPE->hCoreCoder[i]->hFdCngDec ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - /* deallocate CLDFB synthesis for LFE channel */ - if ( hCPE->hCoreCoder[i]->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - deleteCldfb( &hCPE->hCoreCoder[i]->cldfbSyn ); - } -#endif } } else diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index b5dcfd2bbe..ab82fb4e07 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -95,25 +95,12 @@ void stereo_tcx_init_dec( st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_flag ); st->hTcxCfg->resq = getResq( st->bits_frame_nominal * FRAMES_PER_SEC ); hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_flag, st->element_mode ); - st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_flag ); if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - !MCT_flag && -#endif st->element_mode != EVS_MONO ) { - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode ); } if ( hTcxLtpDec != NULL ) { @@ -176,10 +163,6 @@ void stereo_tcx_core_dec( STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ const int16_t nchan_out, /* i : number of output channels */ const IVAS_FORMAT ivas_format /* i : IVAS format */ -#ifndef DISCRETE_ISM_DTX_CNG - , - const ISM_MODE ism_mode /* i : ISM mode (only needed if format is ISM)*/ -#endif ) { int16_t i, k; @@ -743,11 +726,7 @@ void stereo_tcx_core_dec( if ( st->element_mode != IVAS_CPE_TD ) { -#ifndef DISCRETE_ISM_DTX_CNG - if ( ivas_format == ISM_FORMAT && ism_mode == ISM_MODE_PARAM ) -#else if ( ivas_format == ISM_FORMAT ) -#endif { float buffer[L_FRAME16k]; lerp( signal_outFB, buffer, st->L_frame, hTcxDec->L_frameTCX ); diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index a1410c482e..ee315bf399 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -825,17 +825,11 @@ ivas_error IVAS_DEC_GetObjectMetadata( { metadata->azimuth = 0.f; metadata->elevation = 0.f; -#ifdef FIX_379_EXT_METADATA metadata->radius = 1.f; metadata->spread = 0.f; metadata->gainFactor = 1.f; metadata->yaw = 0.f; metadata->pitch = 0.f; -#else - metadata->radius = 0.f; - metadata->spread = 0.f; - metadata->gainFactor = 1.f; -#endif } else { @@ -859,12 +853,8 @@ ivas_error IVAS_DEC_GetObjectMetadata( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_GetMasaMetadata( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef FIX_350_MASA_DELAY_COMP + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */ -#else - IVAS_MASA_QMETADATA_HANDLE *hMasaMetadata /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */ -#endif ) { if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) @@ -877,11 +867,7 @@ ivas_error IVAS_DEC_GetMasaMetadata( return IVAS_ERR_WRONG_MODE; } -#ifdef FIX_350_MASA_DELAY_COMP *hMasaExtOutMeta = hIvasDec->st_ivas->hMasa->data.extOutMeta; -#else - *hMasaMetadata = hIvasDec->st_ivas->hQMetaData; -#endif return IVAS_ERR_OK; } @@ -895,7 +881,7 @@ ivas_error IVAS_DEC_GetMasaMetadata( ivas_error IVAS_DEC_FeedHeadTrackData( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_QUATERNION *orientation, /* i : head-tracking data, listener orientation */ - IVAS_POSITION *Pos /* i : listener position */ + IVAS_VECTOR3 *Pos /* i : listener position */ ) { HEAD_TRACK_DATA_HANDLE hHeadTrackData; diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index e1e5bfe9f4..17af564295 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -166,18 +166,14 @@ ivas_error IVAS_DEC_GetObjectMetadata( /*! r: error code */ ivas_error IVAS_DEC_GetMasaMetadata( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ -#ifdef FIX_350_MASA_DELAY_COMP MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */ -#else - IVAS_MASA_QMETADATA_HANDLE *hMasaMetadata /* o : pointer to handle, which will be set to point to metadata from the most recently decoded frame */ -#endif ); /*! r: error code */ ivas_error IVAS_DEC_FeedHeadTrackData( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ IVAS_QUATERNION *orientation, /* i : head-tracking data */ - IVAS_POSITION *Pos /* i : listener position */ + IVAS_VECTOR3 *Pos /* i : listener position */ ); /*! r: error code */ diff --git a/lib_dec/lsf_dec.c b/lib_dec/lsf_dec.c index e29cc480a2..6aa31243af 100644 --- a/lib_dec/lsf_dec.c +++ b/lib_dec/lsf_dec.c @@ -264,12 +264,12 @@ void lsf_end_dec( const int16_t bwidth, /* i : input signal bandwidth */ const int16_t nBits_in, /* i : number of bits used for ISF quantization*/ float *qlsf, /* o : quantized LSFs in the cosine domain */ - int16_t *lpc_param, - int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ - int16_t *nb_indices + int16_t *lpc_param, /* i : LPC parameters */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + int16_t *nb_indices /* o : number of indices */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL , - const float tdm_lsfQ_PCh[M] + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ #endif ) { @@ -295,6 +295,7 @@ void lsf_end_dec( #ifdef LSF_RE_USE_SECONDARY_CHANNEL float pred3[M]; #endif + flag_1bit_gran = ( st->element_mode > EVS_MONO ); nBits = nBits_in; *nb_indices = 0; @@ -343,6 +344,8 @@ void lsf_end_dec( * Select safety_net or predictive mode *--------------------------------------------------------------------------*/ + p_lpc_param = lpc_param; + #ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) { @@ -350,7 +353,6 @@ void lsf_end_dec( predmode += 3; } #endif - p_lpc_param = lpc_param; if ( predmode == 0 ) { @@ -579,11 +581,11 @@ void lsf_end_dec( st->BER_detect = st->BER_detect | vq_dec_lvq( 0, qlsf, &lindice[1], stages1, M, mode_lvq_p, levels1[stages1 - 1] ); - if ( predmode == 1 #ifdef LSF_RE_USE_SECONDARY_CHANNEL - || ( predmode == 4 ) + if ( predmode == 1 || ( predmode == 4 ) ) /* MA only */ +#else + if ( predmode == 1 ) /* MA only */ #endif - ) /* MA only */ { mvr2r( qlsf, st->mem_MA, M ); v_add( qlsf, pred1, qlsf, M ); diff --git a/lib_dec/lsf_msvq_ma_dec.c b/lib_dec/lsf_msvq_ma_dec.c index 2fa1f3573b..ede93bb162 100644 --- a/lib_dec/lsf_msvq_ma_dec.c +++ b/lib_dec/lsf_msvq_ma_dec.c @@ -187,7 +187,11 @@ int16_t D_lsf_tcxlpc( NumIndices = 1; +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_q, lsf_q_ind ); +#else msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, indices + NumIndices, lsf_q, lsf_q_ind ); +#endif NumIndices += TCXLPC_NUMSTAGES; @@ -195,7 +199,12 @@ int16_t D_lsf_tcxlpc( { /* Only add contribution if flag is enabled */ + +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_dec( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, TCXLPC_IND_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_rem_q, lsf_rem_q_ind ); +#else msvq_dec( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, TCXLPC_IND_NUMSTAGES, M, M, indices + NumIndices, lsf_rem_q, lsf_rem_q_ind ); +#endif NumIndices += TCXLPC_IND_NUMSTAGES; /* Add to MA-removed vector */ @@ -264,7 +273,11 @@ int16_t dec_lsf_tcxlpc( } /* Decode independent lsf */ +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, flag + 1, 0, NULL, lsf_q_ignored, lsf_q_ind ); +#else msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, flag + 1, lsf_q_ignored, lsf_q_ind ); +#endif /* Update flag */ *flag = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk ); diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 1a82d45587..13fed9573b 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -1345,11 +1345,11 @@ typedef struct Decoder_State /* MCT Channel mode indication: LFE, ignore channel? */ MCT_CHAN_MODE mct_chan_mode; - int16_t cng_ism_flag; /* CNG in Param-ISM flag */ + int16_t cng_ism_flag; /* CNG in ISM format flag */ +#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT int16_t read_sid_info; /* For ParamISM, use the transmitted noise */ -#ifdef DISCRETE_ISM_DTX_CNG - int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ #endif + int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ } Decoder_State, *DEC_CORE_HANDLE; diff --git a/lib_dec/tonalMDCTconcealment.c b/lib_dec/tonalMDCTconcealment.c index 81fa9fdf90..041e3a3d2f 100644 --- a/lib_dec/tonalMDCTconcealment.c +++ b/lib_dec/tonalMDCTconcealment.c @@ -386,24 +386,14 @@ static void CalcMDXT( const TonalMDCTConcealPtr hTonalMDCTConc, const char type, const float *timeSignal, - float *mdxtOutput -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const int16_t isLfe -#endif -) + float *mdxtOutput ) { float windowedTimeSignal[L_FRAME_PLUS + 2 * L_MDCT_OVLP_MAX]; int16_t left_overlap, right_overlap; int16_t L_frame; L_frame = hTonalMDCTConc->nSamples; - WindowSignal( hTonalMDCTConc->tcx_cfg, hTonalMDCTConc->tcx_cfg->tcx_offsetFB, FULL_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, timeSignal, &L_frame, windowedTimeSignal, 1, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - isLfe -#endif - ); + WindowSignal( hTonalMDCTConc->tcx_cfg, hTonalMDCTConc->tcx_cfg->tcx_offsetFB, FULL_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, timeSignal, &L_frame, windowedTimeSignal, 1, 1 ); if ( type == 'S' ) { @@ -422,12 +412,7 @@ void TonalMDCTConceal_Detect( const TonalMDCTConcealPtr hTonalMDCTConc, const float pitchLag, int16_t *numIndices, - const PsychoacousticParameters *psychParamsCurrent -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - const int16_t isLfe -#endif -) + const PsychoacousticParameters *psychParamsCurrent ) { float secondLastMDST[L_FRAME_MAX]; /* 32 bits are required */ float secondLastMDCT[L_FRAME_MAX]; /* 32 bits are required */ @@ -444,18 +429,8 @@ void TonalMDCTConceal_Detect( { if ( !hTonalMDCTConc->secondLastBlockData.tonalConcealmentActive ) { - CalcMDXT( hTonalMDCTConc, 'S', hTonalMDCTConc->secondLastPcmOut, secondLastMDST -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - isLfe -#endif - ); - CalcMDXT( hTonalMDCTConc, 'C', hTonalMDCTConc->secondLastPcmOut, secondLastMDCT -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - isLfe -#endif - ); + CalcMDXT( hTonalMDCTConc, 'S', hTonalMDCTConc->secondLastPcmOut, secondLastMDST ); + CalcMDXT( hTonalMDCTConc, 'C', hTonalMDCTConc->secondLastPcmOut, secondLastMDCT ); hTonalMDCTConc->nNonZeroSamples = 0; for ( i = 0; i < hTonalMDCTConc->nSamples; i++ ) { diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 48cdb5c536..0310a713e3 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -75,8 +75,10 @@ ivas_error acelp_core_enc( float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ int16_t *unbits, /* o : number of unused bits */ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ +#ifndef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ +#endif + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ) { int16_t i, nBits; /* reserved bits */ @@ -372,9 +374,14 @@ ivas_error acelp_core_enc( nb_bits = 0; st->acelp_cfg.FEC_mode = 0; uc_two_stage_flag = 0; + if ( !nelp_mode && !ppp_mode ) { +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#else config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#endif } /*-----------------------------------------------------------------* @@ -419,10 +426,11 @@ ivas_error acelp_core_enc( else { const float *pt_interp_2; + #ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE if ( st->active_cnt != 1 ) { - int16_t beta_index[1]; + int16_t beta_index; float lsf_wgts[M]; /* intra_frame prediction for the LSFs */ @@ -430,15 +438,9 @@ ivas_error acelp_core_enc( Unified_weighting( &st->Bin_E[L_FFT / 2], lsf_new, lsf_wgts, st->bwidth == NB, st->coder_type == UNVOICED, st->sr_core, M ); - tdm_SCh_lsf_reuse( ENC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, lsf_wgts, beta_index ); + tdm_SCh_lsf_reuse( ENC, st->element_brate, lsf_new, lsp_new, tdm_lsfQ_PCh, lsf_wgts, &beta_index ); - push_indice( hBstr, IND_IC_LSF_PRED, beta_index[0], TDM_IC_LSF_PRED_BITS ); - } - if ( st->active_cnt == 1 ) - { - mvr2r( lsp_new, st->lsp_old, M ); - lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core ); - lsp2lsf( lsp_new, lsf_new, M, st->sr_core ); + push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS ); } #else if ( st->active_cnt != 1 ) @@ -447,19 +449,20 @@ ivas_error acelp_core_enc( mvr2r( tdm_lsfQ_PCh, lsf_new, M ); } #endif + pt_interp_2 = interpol_frac_12k8; if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED ) { pt_interp_2 = interpol_frac2; } -#ifndef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + if ( st->active_cnt == 1 ) { mvr2r( lsp_new, st->lsp_old, M ); lsp2lsf( lsp_new, st->lsf_old, M, st->sr_core ); lsp2lsf( lsp_new, lsf_new, M, st->sr_core ); } -#endif + /* LSP interpolation and conversion of LSPs to A(z) */ int_lsp( st->L_frame, st->lsp_old, lsp_new, Aq, M, pt_interp_2, 0 ); @@ -503,7 +506,11 @@ ivas_error acelp_core_enc( { tc_classif_enc( st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res ); +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#else config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#endif } /*---------------------------------------------------------------* @@ -561,7 +568,11 @@ ivas_error acelp_core_enc( lsf_syn_mem_restore( st, tilt_code_bck, gc_threshold_bck, clip_var_bck, next_force_sf_bck, lsp_new, lsp_mid, clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, mem_w0_bck, streaklimit, pstreaklen ); /* Configure ACELP bit allocation */ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#else config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); +#endif /* redo LSF quantization */ #ifdef LSF_RE_USE_SECONDARY_CHANNEL diff --git a/lib_enc/acelp_core_switch_enc.c b/lib_enc/acelp_core_switch_enc.c index 291c2128a1..5813968434 100644 --- a/lib_enc/acelp_core_switch_enc.c +++ b/lib_enc/acelp_core_switch_enc.c @@ -151,7 +151,11 @@ void acelp_core_switch_enc( * Excitation encoding *----------------------------------------------------------------*/ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( ENC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); +#else config_acelp1( ENC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); +#endif encod_gen_voic_core_switch( st, st->last_L_frame, inp, Aq, A, T_op, st->voicing, exc, cbrate ); diff --git a/lib_enc/amr_wb_enc.c b/lib_enc/amr_wb_enc.c old mode 100755 new mode 100644 index 88b3faa5d6..c0c0b4f18e --- a/lib_enc/amr_wb_enc.c +++ b/lib_enc/amr_wb_enc.c @@ -342,12 +342,8 @@ void amr_wb_enc( * WB, SWB and FB bandwidth detector *----------------------------------------------------------------*/ - bw_detect( st, st->input, NULL, NULL -#ifdef FIX_MDCT_BASED_BWD - , - 0 -#endif - ); + bw_detect( st, st->input, NULL, NULL, + 0 ); /* in AMR_WB IO, limit the maximum band-width to WB */ if ( st->bwidth > WB ) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c old mode 100755 new mode 100644 index 810527e0ef..6de35a211a --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -55,11 +55,9 @@ #define ALPHA_BWD 0.75f #define BWD_LT_THRESH 0.6f -#define BWD_COUNT_MAX 100 -#define BWD_COUNT_WIDER_BW 10 -#ifdef FIX_MDCT_BASED_BWD +#define BWD_COUNT_MAX 100 +#define BWD_COUNT_WIDER_BW 10 #define BWD_COUNT_WIDER_BW_MDCT 0 -#endif #define CLDFB_ENER_OFFSET 1.6f @@ -74,10 +72,8 @@ void bw_detect( const float signal_in[], /* i : input signal */ float *spectrum, /* i : MDCT spectrum */ const float *enerBuffer /* i : energy buffer */ -#ifdef FIX_MDCT_BASED_BWD , const int16_t mct_on /* i : flag MCT mode */ -#endif ) { int16_t i, j, k, bw_max, bin_width, n_bins; @@ -87,7 +83,6 @@ void bw_detect( const float *pt, *pt1; float max_NB, max_WB, max_SWB, max_FB, mean_NB, mean_WB, mean_SWB, mean_FB; int16_t cldfb_bin_width = 4; -#ifdef FIX_MDCT_BASED_BWD int16_t bwd_count_wider_bw, l_frame; bwd_count_wider_bw = BWD_COUNT_WIDER_BW; @@ -95,7 +90,6 @@ void bw_detect( { bwd_count_wider_bw = BWD_COUNT_WIDER_BW_MDCT; } -#endif if ( st->input_Fs > 8000 ) { @@ -189,10 +183,6 @@ void bw_detect( } else { -#ifndef FIX_MDCT_BASED_BWD - bin_width *= (int16_t) ( ( st->input_Fs / FRAMES_PER_SEC ) / BWD_TOTAL_WIDTH ); - mvr2r( spectrum, spect, (int16_t) ( st->input_Fs / FRAMES_PER_SEC ) ); -#else l_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); if ( st->core == TCX_10_CORE ) { @@ -201,7 +191,6 @@ void bw_detect( bin_width *= ( l_frame / BWD_TOTAL_WIDTH ); mvr2r( spectrum, spect, l_frame ); -#endif } /*---------------------------------------------------------------------* * compute energy per spectral bins @@ -419,29 +408,17 @@ void bw_detect( /* switching to a higher BW */ if ( st->last_input_bwidth == NB ) { -#ifdef FIX_MDCT_BASED_BWD if ( st->count_WB > bwd_count_wider_bw ) -#else - if ( st->count_WB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = WB; st->count_WB = BWD_COUNT_MAX; -#ifdef FIX_MDCT_BASED_BWD if ( st->count_SWB > bwd_count_wider_bw ) -#else - if ( st->count_SWB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = SWB; st->count_SWB = BWD_COUNT_MAX; -#ifdef FIX_MDCT_BASED_BWD if ( st->count_FB > bwd_count_wider_bw ) -#else - if ( st->count_FB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; @@ -452,20 +429,12 @@ void bw_detect( if ( st->last_input_bwidth == WB && st->input_Fs > 16000 ) { -#ifdef FIX_MDCT_BASED_BWD if ( st->count_SWB > bwd_count_wider_bw ) -#else - if ( st->count_SWB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = SWB; st->count_SWB = BWD_COUNT_MAX; -#ifdef FIX_MDCT_BASED_BWD if ( st->count_FB > bwd_count_wider_bw ) -#else - if ( st->count_FB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; @@ -475,11 +444,7 @@ void bw_detect( if ( st->last_input_bwidth == SWB && st->input_Fs > 32000 ) { -#ifdef FIX_MDCT_BASED_BWD if ( st->count_FB > bwd_count_wider_bw ) -#else - if ( st->count_FB > BWD_COUNT_WIDER_BW ) -#endif { st->input_bwidth = FB; st->count_FB = BWD_COUNT_MAX; @@ -671,28 +636,6 @@ void set_bw_stereo( if ( hCPE->element_mode == IVAS_CPE_MDCT ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - /* do not check bandwidth in LFE channel */ - if ( sts[0]->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - sts[0]->bwidth = sts[0]->input_bwidth; - } - else if ( sts[1]->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - sts[1]->bwidth = sts[1]->input_bwidth; - } - /* ensure that both CPE channels have the same audio band-width */ - else if ( sts[0]->input_bwidth == sts[1]->input_bwidth ) - { - sts[0]->bwidth = sts[0]->input_bwidth; - sts[1]->bwidth = sts[0]->input_bwidth; - } - else if ( sts[0]->input_bwidth != sts[1]->input_bwidth ) - { - sts[0]->bwidth = max( sts[0]->input_bwidth, sts[1]->input_bwidth ); - sts[1]->bwidth = max( sts[0]->input_bwidth, sts[1]->input_bwidth ); - } -#else /* ensure that both CPE channels have the same audio band-width */ if ( sts[0]->input_bwidth == sts[1]->input_bwidth ) { @@ -704,7 +647,6 @@ void set_bw_stereo( sts[0]->bwidth = max( sts[0]->input_bwidth, sts[1]->input_bwidth ); sts[1]->bwidth = max( sts[0]->input_bwidth, sts[1]->input_bwidth ); } -#endif } sts[0]->bwidth = max( sts[0]->bwidth, WB ); @@ -738,9 +680,6 @@ int16_t set_bw_mct( { st = hCPE[cpe_id]->hCoreCoder[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - st->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; diff --git a/lib_enc/cod_tcx.c b/lib_enc/cod_tcx.c index ee948998a1..ac24d74bf2 100644 --- a/lib_enc/cod_tcx.c +++ b/lib_enc/cod_tcx.c @@ -73,12 +73,7 @@ void HBAutocorrelation( * Windowing * *-----------------------------------------------------------*/ - WindowSignal( hTcxCfg, hTcxCfg->tcx_offset, left_overlap_mode, right_overlap_mode, &left_overlap, &right_overlap, speech, &L_frame, xn_buf, 1, 0 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( hTcxCfg, hTcxCfg->tcx_offset, left_overlap_mode, right_overlap_mode, &left_overlap, &right_overlap, speech, &L_frame, xn_buf, 1, 0 ); /*-----------------------------------------------------------* * Autocorrelation * @@ -139,11 +134,7 @@ void TNSAnalysisStereo( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { continue; } @@ -391,11 +382,7 @@ void TNSAnalysisStereo( /* individual decision for each channel */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE ) -#else if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { continue; } @@ -477,11 +464,7 @@ void TNSAnalysisStereo( /* we have the decision, set filter data accordingly */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE ) -#else if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { continue; } @@ -518,11 +501,7 @@ void TNSAnalysisStereo( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { continue; } @@ -992,12 +971,6 @@ void EstimateStereoTCXNoiseLevel( { fac_ns_q = param_core[ch] + n * NPRM_DIV + 1; maxNfCalcBw = min( noiseFillingBorder[ch][n], (int16_t) ( hTcxEnc->measuredBwRatio * (float) L_frame[ch][n] + 0.5f ) ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - maxNfCalcBw = min( maxNfCalcBw, MCT_LFE_MAX_LINE ); - } -#endif if ( ( total_brate >= HQ_96k && ( st->element_mode <= IVAS_SCE || st->bwidth < SWB ) ) || total_brate > IVAS_192k ) { fac_ns[ch][n] = 0.0f; @@ -2130,12 +2103,7 @@ void coder_tcx( if ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) { - WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, win, 1, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, win, 1, 1 ); /* Compute MDCT for xn_buf[] */ TCX_MDCT( win, spectrum, left_overlap, L_frame - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); @@ -2144,12 +2112,7 @@ void coder_tcx( { wtda( st->hTcxEnc->new_speech_TCX, win, NULL, hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode, L_frame ); - WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, winMDST, 1, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( hTcxCfg, hTcxCfg->tcx_offsetFB, hTcxCfg->tcx_last_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_last_overlap_mode, hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ? FULL_OVERLAP : hTcxCfg->tcx_curr_overlap_mode, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_frame, winMDST, 1, 1 ); edct( win, spectrum, L_frame, st->element_mode ); diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c index f89f4a132c..774b1398c5 100644 --- a/lib_enc/core_enc_init.c +++ b/lib_enc/core_enc_init.c @@ -261,12 +261,7 @@ static void init_tcx( hTcxEnc->spectrum[0] = hTcxEnc->spectrum_long; hTcxEnc->spectrum[1] = hTcxEnc->spectrum_long + N_TCX10_MAX; - init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX, st->fscale, st->encoderLookahead_enc, st->encoderLookahead_FB, st->preemph_fac, st->tcxonly, st->rf_mode, st->igf, st->hIGFEnc != NULL ? st->hIGFEnc->infoStopFrequency : 0, st->element_mode, st->ini_frame, MCT_flag -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + init_tcx_cfg( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX, st->fscale, st->encoderLookahead_enc, st->encoderLookahead_FB, st->preemph_fac, st->tcxonly, st->rf_mode, st->igf, st->hIGFEnc != NULL ? st->hIGFEnc->infoStopFrequency : 0, st->element_mode, st->ini_frame, MCT_flag ); /* Init TCX target bits correction factor */ hTcxEnc->tcx_target_bits_fac = 1.0f; diff --git a/lib_enc/core_enc_switch.c b/lib_enc/core_enc_switch.c index 806afd273b..d6c866d4c5 100644 --- a/lib_enc/core_enc_switch.c +++ b/lib_enc/core_enc_switch.c @@ -95,12 +95,7 @@ void core_coder_mode_switch( st->bits_frame_nominal = (int16_t) ( (float) st->L_frame / (float) st->fscale * (float) FSCALE_DENOM / 128.0f * (float) st->total_brate / 100.0f + 0.49f ); - st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); /* switch IGF configuration */ if ( st->igf ) @@ -117,12 +112,7 @@ void core_coder_mode_switch( hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->total_brate, st->rf_mode, st->element_mode ); st->hTcxCfg->tcxRateLoopOpt = ( st->hTcxCfg->resq && !st->tcxonly ) ? 1 : st->hTcxCfg->tcxRateLoopOpt; - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->total_brate, st->igf, st->element_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->total_brate, st->igf, st->element_mode ); if ( st->hTcxCfg->fIsTNSAllowed ) { @@ -161,12 +151,7 @@ void core_coder_mode_switch( } else { - st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); init_coder_ace_plus( st, last_total_brate, MCT_flag ); } diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c index 44c34a2bd7..2e2a379ec9 100644 --- a/lib_enc/evs_enc.c +++ b/lib_enc/evs_enc.c @@ -242,7 +242,11 @@ ivas_error evs_enc( if ( st->core == ACELP_CORE ) { +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + if ( ( error = acelp_core_enc( st, inp, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = acelp_core_enc( st, inp, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -686,12 +690,7 @@ static void configure_core_coder( } } - st->igf = getIgfPresent( 0, st->total_brate, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( 0, st->total_brate, st->bwidth, st->rf_mode ); if ( st->core_brate != SID_2k40 && st->core_brate != FRAME_NO_DATA ) { diff --git a/lib_enc/ext_sig_ana.c b/lib_enc/ext_sig_ana.c index 0588f0ddf1..80e652cf07 100644 --- a/lib_enc/ext_sig_ana.c +++ b/lib_enc/ext_sig_ana.c @@ -215,48 +215,24 @@ void core_signal_analysis_high_bitrate( if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { -#endif - wtda( hTcxEnc->new_speech_TCX, tcx20Win, NULL, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX ); + wtda( hTcxEnc->new_speech_TCX, tcx20Win, NULL, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX ); - if ( windowed_samples != NULL ) /* store overlap data for later */ - { - assert( frameno == 0 ); - windowed_samples[0] = (float) overlap_mode[frameno]; - windowed_samples[1] = (float) overlap_mode[frameno + 1]; - } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } - else + if ( windowed_samples != NULL ) /* store overlap data for later */ { - /* Windowing of the LFE Signal*/ - WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win, - st->element_mode != IVAS_CPE_MDCT /* truncate_aldo */, - 1, 1 ); + assert( frameno == 0 ); + windowed_samples[0] = (float) overlap_mode[frameno]; + windowed_samples[1] = (float) overlap_mode[frameno + 1]; } -#endif if ( st->element_mode != IVAS_CPE_MDCT ) { /* Windowing of the 2xTCX5 subframes or 1xTCX10 or 1xTCX20 */ - WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 1, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 1, 1 ); } } else { /* Windowing of the 2xTCX5 subframes or 1xTCX10 or 1xTCX20 */ - WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno], overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win, st->element_mode != IVAS_CPE_MDCT, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno], overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, tcx20Win, st->element_mode != IVAS_CPE_MDCT, 1 ); if ( windowed_samples != NULL ) /* save windowed speech_TCX samples */ { @@ -295,15 +271,7 @@ void core_signal_analysis_high_bitrate( for ( i = 0; i < 2; i++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE ); -#endif - WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, tcx20Win + i * tcx5SizeFB, &L_subframe, tcx5Win, st->element_mode != IVAS_CPE_MDCT, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, tcx20Win + i * tcx5SizeFB, &L_subframe, tcx5Win, st->element_mode != IVAS_CPE_MDCT, 1 ); TCX_MDCT( tcx5Win, hTcxEnc->spectrum[frameno] + i * tcx5SizeFB, left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); @@ -318,11 +286,7 @@ void core_signal_analysis_high_bitrate( { assert( transform_type[frameno] == TCX_10 || transform_type[frameno] == TCX_20 ); - if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) { edct( tcx20Win, hTcxEnc->spectrum[frameno], L_subframe, st->element_mode ); @@ -347,13 +311,6 @@ void core_signal_analysis_high_bitrate( { v_multc( hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, hTcxEnc->spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - set_f( &hTcxEnc->spectrum[frameno][MCT_LFE_MAX_LINE], 0.f, L_subframe - MCT_LFE_MAX_LINE ); - st->hTcxCfg->tcx_coded_lines = MCT_LFE_MAX_LINE; - } -#endif if ( st->element_mode != IVAS_CPE_MDCT ) { @@ -370,23 +327,14 @@ void core_signal_analysis_high_bitrate( { L_subframe = L_frameTCX / nSubframes; - if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) { wtda_ext( hTcxEnc->new_speech_TCX, mdstWin, overlap_mode[frameno], overlap_mode[frameno + 1], L_frameTCX, 3 ); } else { /* Windowing for the MDST */ - WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 0, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ); + WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, overlap_mode[frameno] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno], overlap_mode[frameno + 1] == ALDO_WINDOW ? FULL_OVERLAP : overlap_mode[frameno + 1], &left_overlap, &right_overlap, &hTcxEnc->speech_TCX[frameno * tcx10SizeFB], &L_subframe, mdstWin, 0, 1 ); } if ( transform_type[frameno] == TCX_5 ) @@ -417,15 +365,7 @@ void core_signal_analysis_high_bitrate( for ( i = 0; i < 2; i++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - assert( st->mct_chan_mode != MCT_CHAN_MODE_LFE ); -#endif - WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, mdstWin + i * tcx5SizeFB, &L_subframe, tcx5Win, 0, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( st->hTcxCfg, folding_offset, i == 0 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, i == 1 ? RECTANGULAR_OVERLAP : MIN_OVERLAP, &left_overlap, &right_overlap, mdstWin + i * tcx5SizeFB, &L_subframe, tcx5Win, 0, 1 ); TCX_MDST( tcx5Win, mdst_spectrum[frameno] + i * tcx5SizeFB, left_overlap, L_subframe - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); /* high-band gain control in case of BWS */ @@ -437,11 +377,7 @@ void core_signal_analysis_high_bitrate( } else /* transform_type[frameno] != TCX_5 */ { - if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( transform_type[frameno] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) { edst( mdstWin, mdst_spectrum[frameno], L_subframe, st->element_mode ); @@ -466,12 +402,6 @@ void core_signal_analysis_high_bitrate( v_multc( mdst_spectrum[frameno] + L_FRAME16k / nSubframes, (float) ( st->bwidth_sw_cnt ) / (float) BWS_TRAN_PERIOD, mdst_spectrum[frameno] + L_FRAME16k / nSubframes, L_subframe - L_FRAME16k / nSubframes ); } } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - set_f( &mdst_spectrum[frameno][MCT_LFE_MAX_LINE], 0.f, L_subframe - MCT_LFE_MAX_LINE ); - } -#endif } if ( st->element_mode != IVAS_CPE_MDCT ) diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index e43b65d56a..a76b741ca4 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -513,12 +513,24 @@ void FdCng_encodeSID( float w[32]; float preemph_fac = st->preemph_fac; +#ifdef ERI_FDCNGVQ_LOW_ROM + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; + float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; + float tot_sig_ext[FDCNG_VQ_MAX_LEN]; +#else const float *const *codebooks = ( st->element_mode == EVS_MONO ) ? cdk_37bits : cdk_37bits_ivas; +#endif const float gain_q_offset = ( st->element_mode == EVS_MONO ) ? GAIN_Q_OFFSET_EVS : GAIN_Q_OFFSET_IVAS; /* Init */ N = hFdCngEnc->npartDec; +#ifdef ERI_FDCNGVQ_LOW_ROM + invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ + set_zero( v, FDCNG_VQ_MAX_LEN ); +#endif + /* Convert to LOG */ e = 0.f; for ( i = 0; i < N; i++ ) @@ -544,10 +556,39 @@ void FdCng_encodeSID( /* MSVQ encoder */ set_f( w, 1.0f, N ); +#ifdef ERI_FDCNGVQ_LOW_ROM + if ( st->element_mode != EVS_MONO ) + { + /* DCT domain compressed/truncated indices used for first stage */ + /* quantization with stage1 stored in DCT24 domain, stages 2 through 6 directly dearched + in FDCNG band domain + */ + if ( N == FDCNG_VQ_MAX_LEN_WB ) + { + create_IDCT_N_Matrix( invTrfMatrix, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + /* truncated DCT21 analysis */ + dctT2_N_apply_matrix( (const float *) v, dct_target, FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); + /* truncated IDCT21 extension to 24 bands */ + extend_dctN_input( v, dct_target, N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); + + mvr2r( tot_sig_ext, v, FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ + } + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + msvq_enc( cdk_37bits_ivas, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, 1, invTrfMatrix, indices ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, v, NULL ); + } + else + { /* EVS_MONO tables */ + msvq_enc( cdk_37bits, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, 0, NULL, indices ); + msvq_dec( cdk_37bits, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v, NULL ); + } +#else msvq_enc( codebooks, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, indices ); /* MSVQ decoder */ msvq_dec( codebooks, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, v, NULL ); +#endif + /* Compute gain */ gain = 0.f; @@ -973,6 +1014,14 @@ void FdCngEncodeMDCTStereoSID( int16_t no_side_flag; int16_t is_inp_ms; +#ifdef ERI_FDCNGVQ_LOW_ROM + float tot_sig_ext[FDCNG_VQ_MAX_LEN], dct_target[CPE_CHANNELS][FDCNG_VQ_DCT_MAXTRUNC]; /* 24 +2*18*/ + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; /*24*18*/ + invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ +#endif + + is_inp_ms = 0; if ( hCPE->hCoreCoder[0]->cng_sba_flag == 1 ) { @@ -1023,7 +1072,11 @@ void FdCngEncodeMDCTStereoSID( /* Quantize noise shapes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { +#ifdef ERI_FDCNGVQ_LOW_ROM + /* Normalize MSVQ input */ +#else /* Normalize MSVW input */ +#endif gain[ch] = 0.f; for ( p = N_GAIN_MIN; p < N_GAIN_MAX; p++ ) { @@ -1036,6 +1089,39 @@ void FdCngEncodeMDCTStereoSID( ms_ptr[ch][p] -= gain[ch]; } +#ifdef ERI_FDCNGVQ_LOW_ROM + } + /* always split channel targetloop */ + + /* extend fdcng envelope from length 21 to a 24 length fdncg domain envelope signal */ + /* High quality cosine smooth basis extension used to not introduce noise in stage#1 DCT24 analysis and subsequent VQ-steps */ + if ( N == FDCNG_VQ_MAX_LEN_WB ) + { + create_IDCT_N_Matrix( invTrfMatrix, N, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); /*WB: create truncated IDCT21 matrix */ + + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + /* run DCT_N N==21 , truncated at 18/21 ~= 86% , i.e use a bit better better quality in extrapolation , than subsequent DCT24 analysis which is truncated at 75%*/ + + /* truncated DCT 21 analysis */ + dctT2_N_apply_matrix( (const float *) ms_ptr[ch], dct_target[ch], FDCNG_VQ_DCT_MAXTRUNC, N, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); + + /* extrapolate extend fdcng envelope signal in the fdncg ienvelope/"time" domain using DCT21 basis vectors, + estimated DCT21 coeffs scaling extended basis vectors are used to create extrapolated length 24 input target envelope signal */ + /* this DCT21 extension does not introduce DCT24 coefficient noise for the subsequent dct24 target analysis, and later in IDCT24 synthesis */ + + /* truncated IDCT 21 extension synthesis */ + extend_dctN_input( ms_ptr[ch], dct_target[ch], N, tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix /* DCT_N basis vectors */, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/ + + mvr2r( tot_sig_ext, ms_ptr[ch], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ */ + } + } + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); /*always create/set up IDCT24 matrix in RAM */ + + /* end split */ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { +#endif /* MSVQ */ if ( ch ) { @@ -1046,8 +1132,21 @@ void FdCngEncodeMDCTStereoSID( stages = FD_CNG_stages_37bits; } +#ifdef ERI_FDCNGVQ_LOW_ROM + /* DCT24 domain compressed/truncated indices used for first stage */ + /* mid channel quantization using stages 1 through 6 */ + /* & side channel quantization using stages 1 through 4 */ + + { + msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[ch], levels_37bits, FD_CNG_maxC_37bits, stages, weights, N, FD_CNG_maxN_37bits, 1, invTrfMatrix, indices[ch] ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], 1, invTrfMatrix, ms_ptr[ch], NULL ); + } +#else msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[ch], levels_37bits, FD_CNG_maxC_37bits, stages, weights, N, FD_CNG_maxN_37bits, indices[ch] ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], ms_ptr[ch], NULL ); + +#endif } if ( no_side_flag ) @@ -1133,6 +1232,7 @@ void FdCngEncodeMDCTStereoSID( /* pad with zeros to reach common SID frame size */ push_indice( sts[1]->hBstr, IND_ENERGY, 0, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); + return; } @@ -1160,6 +1260,13 @@ void FdCngEncodeDiracMDCTStereoSID( int16_t indices[CPE_CHANNELS][FD_CNG_stages_37bits]; int16_t gain_idx[CPE_CHANNELS]; int16_t ch, p; +#ifdef ERI_FDCNGVQ_LOW_ROM + float *invTrfMatrix; + float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; + float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; + float tot_sig_ext[FDCNG_VQ_MAX_LEN]; + invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ +#endif /* set pointers and initialize */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1176,7 +1283,11 @@ void FdCngEncodeDiracMDCTStereoSID( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { E[ch] = 0.0f; +#ifdef ERI_FDCNGVQ_LOW_ROM + for ( p = 0; p < NPART; p++ ) /* TBD Note: NPART should likely be N[ch] if N[ch] may change */ +#else for ( p = 0; p < NPART; p++ ) +#endif { ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON ); E[ch] += ms_ptr[ch][p]; @@ -1184,12 +1295,22 @@ void FdCngEncodeDiracMDCTStereoSID( } /* M/S transform on log envelopes */ +#ifdef ERI_FDCNGVQ_LOW_ROM + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ + + E[0] = sum_f( ms_ptr[0], NPART ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ +#else convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); E[0] = sum_f( ms_ptr[0], NPART ); +#endif /* Quantize M noise shape */ +#ifdef ERI_FDCNGVQ_LOW_ROM + /* Normalize MSVQ input */ +#else /* Normalize MSVW input */ +#endif gain[0] = sum_f( ms_ptr[0] + N_GAIN_MIN, N_GAIN_MAX - N_GAIN_MIN ); gain[0] /= (float) ( N_GAIN_MAX - N_GAIN_MIN ); @@ -1199,14 +1320,38 @@ void FdCngEncodeDiracMDCTStereoSID( } /* MSVQ */ +#ifdef ERI_FDCNGVQ_LOW_ROM + /* DCT domain compressed/truncated indices used for first stage */ + /* mid quantization using stages #1 through 6 */ + if ( N[0] == FDCNG_VQ_MAX_LEN_WB ) + { + create_IDCT_N_Matrix( invTrfMatrix, N[0], FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + /* truncated DCT 21 analysis */ + dctT2_N_apply_matrix( (const float *) ms_ptr[0], dct_target, FDCNG_VQ_DCT_MAXTRUNC, N[0], invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, DCT_T2_21_XX ); + /* truncated IDCT21 extension to 24 synthesis */ + extend_dctN_input( ms_ptr[0], dct_target, N[0], tot_sig_ext, FDCNG_VQ_MAX_LEN, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, IDCT_T2_XX_21 ); /* use 18 basis vectors*/ + + mvr2r( tot_sig_ext, ms_ptr[0], FDCNG_VQ_MAX_LEN ); /* write extended result as input to VQ stage #1 */ + } + create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); + + msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[0], levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights, N[0], FD_CNG_maxN_37bits, 1, invTrfMatrix, indices[0] ); + msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], 1, invTrfMatrix, ms_ptr[0], NULL ); + +#else msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[0], levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights, N[0], FD_CNG_maxN_37bits, indices[0] ); msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], ms_ptr[0], NULL ); +#endif /* set S to zero */ set_zero( ms_ptr[1], NPART ); /* compute M gain */ +#ifdef ERI_FDCNGVQ_LOW_ROM + gain[0] = sum_f( ms_ptr[0], NPART ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ +#else gain[0] = sum_f( ms_ptr[0], NPART ); +#endif gain[0] = ( E[0] - gain[0] ) / (float) N[0]; apply_scale( &gain[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); @@ -1218,7 +1363,11 @@ void FdCngEncodeDiracMDCTStereoSID( gain[1] = gain[0]; /* undo M/S */ +#ifdef ERI_FDCNGVQ_LOW_ROM + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ +#else convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); +#endif /* restore channel noise envelopes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1226,7 +1375,11 @@ void FdCngEncodeDiracMDCTStereoSID( HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc; HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; +#ifdef ERI_FDCNGVQ_LOW_ROM + for ( p = 0; p < NPART; p++ ) /* TBD Note: NPART should likely be N[0] if N[0] may change */ +#else for ( p = 0; p < NPART; p++ ) +#endif { lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); } @@ -1265,6 +1418,5 @@ void FdCngEncodeDiracMDCTStereoSID( } push_indice( sts[0]->hBstr, IND_ENERGY, gain_idx[0], 7 ); - return; } diff --git a/lib_enc/hq_core_enc.c b/lib_enc/hq_core_enc.c index 43b5ebd68c..3fb39b535a 100644 --- a/lib_enc/hq_core_enc.c +++ b/lib_enc/hq_core_enc.c @@ -116,12 +116,7 @@ void hq_core_enc( left_overlap = -1; right_overlap = -1; - WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_spec, wtda_audio, 1, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( st->hTcxCfg, st->hTcxCfg->tcx_offsetFB, TRANSITION_OVERLAP, FULL_OVERLAP, &left_overlap, &right_overlap, st->hTcxEnc->speech_TCX, &L_spec, wtda_audio, 1, 1 ); TCX_MDCT( wtda_audio, t_audio, left_overlap, L_spec - ( left_overlap + right_overlap ) / 2, right_overlap, st->element_mode ); diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index d73434c15f..9efd3c7f16 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -463,11 +463,7 @@ ivas_error init_encoder( * LP-CNG *-----------------------------------------------------------------*/ -#ifdef DISCRETE_ISM_DTX_CNG if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM || ism_mode == ISM_MODE_DISC ) ) -#else - if ( ( ( idchan == 0 && st->Opt_DTX_ON && st->element_mode != IVAS_CPE_MDCT ) || st->element_mode == EVS_MONO ) && !( ism_mode == ISM_MODE_PARAM ) ) -#endif { if ( ( st->hTdCngEnc = (TD_CNG_ENC_HANDLE) malloc( sizeof( TD_CNG_ENC_DATA ) ) ) == NULL ) { @@ -731,11 +727,7 @@ ivas_error init_encoder( * IGF *-----------------------------------------------------------------*/ - if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) ) { if ( ( st->hIGFEnc = (IGF_ENC_INSTANCE_HANDLE) malloc( sizeof( IGF_ENC_INSTANCE ) ) ) == NULL ) { @@ -755,12 +747,7 @@ ivas_error init_encoder( if ( st->codec_mode == MODE2 || st->element_mode > EVS_MONO ) { - st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); } else { @@ -814,30 +801,19 @@ ivas_error init_encoder( /*-----------------------------------------------------------------* * Transient detector *-----------------------------------------------------------------*/ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE ) + if ( ( st->hTranDet = (TRAN_DET_HANDLE) malloc( sizeof( TRAN_DET_DATA ) ) ) == NULL ) { -#endif - if ( ( st->hTranDet = (TRAN_DET_HANDLE) malloc( sizeof( TRAN_DET_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) ); - } + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Transient Detection\n" ) ); + } - if ( st->element_mode > EVS_MONO ) - { - InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), 0, st->hTranDet, 1 ); - } - else - { - InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); - } -#ifndef ISSUE_24_CLEANUP_MCT_LFE + if ( st->element_mode > EVS_MONO ) + { + InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), 0, st->hTranDet, 1 ); } else { - st->hTranDet = NULL; + InitTransientDetection( (int16_t) ( st->input_Fs / FRAMES_PER_SEC ), NS2SA( st->input_Fs, DELAY_FIR_RESAMPL_NS ), st->hTranDet, 0 ); } -#endif /*-----------------------------------------------------------------* * IVAS parameters diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 0c85ca186d..a7c37a79af 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -219,7 +219,11 @@ ivas_error ivas_core_enc( if ( st->core == ACELP_CORE ) { /* ACELP core encoder */ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + if ( ( error = acelp_core_enc( st, inp[n], ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK ) +#else if ( ( error = acelp_core_enc( st, inp[n], ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -260,14 +264,7 @@ ivas_error ivas_core_enc( { ivas_mdct_core_whitening_enc( hCPE, old_inp_16k, old_wsp, pitch_buf, hMCT->p_mdst_spectrum_long[cpe_id], hMCT->tnsBits[cpe_id], hMCT->p_orig_spectrum_long[cpe_id], hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - &hMCT->LFE_off, -#endif - 1, hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + 1, hMCT->nchan_out_woLFE ); } else { diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c old mode 100755 new mode 100644 index 85eba72f00..cf23ddef53 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -443,13 +443,6 @@ ivas_error pre_proc_front_ivas( st->vad_flag = wb_vad( st, fr_bands, &i, &i, &i, &snr_sum_he, &localVAD_HE_SAD, &( st->flag_noisy_speech_snr ), NULL, NULL, -1000.0f, -1000.0f ); -#ifdef ITD_WINNER_GAIN_MODIFY - /*Save the local_vad flag for the noise coherence calculation*/ - if ( element_mode == IVAS_CPE_DFT ) - { - hCPE->hStereoDft->local_vad = (short) ( st->vad_flag ); - } -#endif if ( force_front_vad == 1 || front_vad_flag == 1 ) { @@ -486,12 +479,8 @@ ivas_error pre_proc_front_ivas( if ( st->idchan == 0 && element_mode != IVAS_CPE_MDCT ) { - bw_detect( st, st->input, NULL, enerBuffer -#ifdef FIX_MDCT_BASED_BWD - , - 0 -#endif - ); + bw_detect( st, st->input, NULL, enerBuffer, + 0 ); } if ( element_mode != IVAS_CPE_MDCT ) /* in MDCT stereo, set_bw_stereo() is used instead */ @@ -834,34 +823,6 @@ ivas_error pre_proc_front_ivas( /* 2nd stage speech/music classification (ACELP/GSC/TCX core selection) */ ivas_smc_mode_selection( st, element_brate, smc_dec, *relE, Etot, attack_flag, inp_12k8, S_map, flag_spitch ); - -#ifdef ITD_WINNER_GAIN_MODIFY - if ( element_mode == IVAS_CPE_DFT ) - { - if ( hCPE->hStereoDft->mus_flag != smc_dec || hCPE->element_mode != hCPE->last_element_mode ) - { - hCPE->hStereoDft->noise_coherence = 0.0f; - set_zero( hCPE->hStereoDft->spd_L_noise, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hCPE->hStereoDft->spd_R_noise, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hCPE->hStereoDft->spd_L_noise_min, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hCPE->hStereoDft->spd_R_noise_min, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hCPE->hStereoDft->spd_L_noise_max, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hCPE->hStereoDft->spd_R_noise_max, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hCPE->hStereoDft->winner_gain_L, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hCPE->hStereoDft->winner_gain_R, STEREO_DFT_N_32k_ENC / 2 ); - set_f( hCPE->hStereoDft->spd_L_smooth_new, 1.0f, STEREO_DFT_N_32k_ENC / 2 ); - set_f( hCPE->hStereoDft->spd_R_smooth_new, 1.0f, STEREO_DFT_N_32k_ENC / 2 ); - } - if ( smc_dec == MUSIC && st->vad_flag == 1 ) - { - hCPE->hStereoDft->mus_flag = 2; - } - else - { - hCPE->hStereoDft->mus_flag = 0; - } - } -#endif } /*----------------------------------------------------------------* diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index cbb48495bf..080ecc2046 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -211,11 +211,7 @@ ivas_error ivas_corecoder_enc_reconfig( { if ( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n ) { -#ifdef FIX_386_CORECODER_RECONFIG mvr2r( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff, input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n], len_inp_memory ); -#else - mvr2r( st_ivas->hCPE[cpe_id]->hCoreCoder[0]->input_buff, input_buff[( cpe_id - st_ivas->nCPE ) * CPE_CHANNELS + n], len_inp_memory ); /* TODO VoiceAge: Please check if this should be hCoreCoder[n] */ -#endif } } @@ -381,12 +377,7 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, - st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode -#endif - ); + st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode ); if ( st_ivas->hCPE[0]->hCoreCoder[n]->igf ) { @@ -453,12 +444,7 @@ ivas_error ivas_corecoder_enc_reconfig( st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, st_ivas->hCPE[0]->hCoreCoder[n]->bwidth, - st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st_ivas->hCPE[0]->hCoreCoder[n]->mct_chan_mode -#endif - ); + st_ivas->hCPE[0]->hCoreCoder[n]->rf_mode ); if ( st_ivas->hCPE[0]->hCoreCoder[n]->igf ) { diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 184a867cd1..72a737e64b 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -154,14 +154,10 @@ ivas_error ivas_cpe_enc( } mvr2r( data_f_ch0, sts[0]->input, input_frame ); -#ifdef ISSUE_24_CLEANUP_MCT_LFE if ( data_f_ch1 != NULL ) /*this may happen for cases with odd number of channels*/ { mvr2r( data_f_ch1, sts[1]->input, input_frame ); } -#else - mvr2r( data_f_ch1, sts[1]->input, input_frame ); -#endif /*----------------------------------------------------------------* * Stereo technology selection @@ -303,27 +299,14 @@ ivas_error ivas_cpe_enc( { if ( st_ivas->hMCT ) { -#ifdef ISSUE_24_CLEANUP_MCT_LFE int16_t lfe_bits; lfe_bits = ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ? st_ivas->hLFE->lfe_bits : 0 ); -#endif sts[n]->total_brate = hCPE->element_brate; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[n]->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { -#endif - sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); - sts[n]->bits_frame_channel = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC - -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( st_ivas->hMCT->num_lfe == FALSE ? 0 : LFE_BITS ) - -#else + sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); + sts[n]->bits_frame_channel = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC - lfe_bits - -#endif - nb_bits_metadata ) / - st_ivas->hMCT->nchan_out_woLFE ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } -#endif + nb_bits_metadata ) / + st_ivas->hMCT->nchan_out_woLFE ); } else { @@ -682,14 +665,7 @@ ivas_error ivas_cpe_enc( /* Store previous attack detection flag */ for ( n = 0; n < CPE_CHANNELS; n++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[n]->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { -#endif - sts[n]->hTranDet->transientDetector.prev_bIsAttackPresent = sts[n]->hTranDet->transientDetector.bIsAttackPresent; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } -#endif + sts[n]->hTranDet->transientDetector.prev_bIsAttackPresent = sts[n]->hTranDet->transientDetector.bIsAttackPresent; } #ifdef DEBUG_MODE_INFO @@ -853,12 +829,6 @@ ivas_error create_cpe_enc( copy_encoder_config( st_ivas, st, 1 ); st->total_brate = hCPE->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) - { - st->mct_chan_mode = MCT_CHAN_MODE_LFE; - } -#endif if ( ( error = init_encoder( st, n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 535a1196ab..bc374f88e5 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -227,16 +227,11 @@ ivas_error ivas_enc( } else { -#ifdef FIX_382_MASA_META_FRAMING_ASYNC ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ -#endif if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { return error; } -#ifndef FIX_382_MASA_META_FRAMING_ASYNC - ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ -#endif if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, ivas_total_brate, hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1 ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index dfaa321605..d6f23d1c9b 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -431,11 +431,7 @@ ivas_error ivas_init_encoder( } } -#ifdef DISCRETE_ISM_DTX_CNG if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) -#else - if ( st_ivas->hEncoderConfig->Opt_DTX_ON && st_ivas->ism_mode == ISM_MODE_PARAM ) -#endif { if ( ( error = ivas_ism_dtx_open( st_ivas ) ) != IVAS_ERR_OK ) { @@ -946,11 +942,7 @@ void ivas_destroy_enc( ivas_spar_enc_close( &( st_ivas->hSpar ), st_ivas->hEncoderConfig->input_Fs, nchan_inp, 0 ); /* MASA handle */ -#ifdef FIX_350_MASA_DELAY_COMP ivas_masa_enc_close( &( st_ivas->hMasa ) ); -#else - ivas_masa_enc_close( &( st_ivas->hMasa ), st_ivas->nchan_transport, ivas_format ); -#endif /* MCT handle */ ivas_mct_enc_close( &( st_ivas->hMCT ) ); diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 3839a42a9d..aff8b9a0b6 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -42,14 +42,12 @@ #include "wmc_auto.h" -#ifdef DISCRETE_ISM_DTX_CNG /*-----------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------*/ #define MD_MAX_DIFF_AZIMUTH 10 #define MD_MAX_DIFF_ELEVATION 10 -#endif /*-------------------------------------------------------------------* @@ -76,11 +74,7 @@ ivas_error ivas_ism_dtx_open( hISMDTX->dtx_flag = 0; hISMDTX->sce_id_dtx = 0; -#ifdef DISCRETE_ISM_DTX_CNG hISMDTX->cnt_SID_ISM = -1; -#else - set_s( hISMDTX->dtx_speech_buffer_enc, 0, PARAM_ISM_HYS_BUF_SIZE ); -#endif for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { @@ -95,7 +89,6 @@ ivas_error ivas_ism_dtx_open( } -#ifdef DISCRETE_ISM_DTX_CNG /*-------------------------------------------------------------------* * ivas_ism_get_dtx_enc() * @@ -297,142 +290,6 @@ int16_t ivas_ism_dtx_enc( return dtx_flag; } -#else -/*-------------------------------------------------------------------* - * ivas_ism_dtx_enc() - * - * Analysis and decision about DTX in ISM format - *-------------------------------------------------------------------*/ - -/*! r: indication of DTX frame */ -int16_t ivas_ism_dtx_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - int16_t *sid_flag /* o : indication of SID frame */ -) -{ - int16_t i, val, dtx_flag; - - dtx_flag = 0; - *sid_flag = 0; - - /* Move the DTX/CNG speech buffer */ - for ( i = 0; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) - { - st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = st_ivas->hISMDTX->dtx_speech_buffer_enc[i + 1]; - } - - /* If both TCs are active frame, do not do any post processing */ - if ( !( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 && st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == -1 ) ) - { - /* covers 3 cases - * case 1: ch0 -> Inactive Frame, ch 1 -> Inactive Frame -> do not do any post-processing (Activate DTX) - * case 2: ch0 -> Inactive Frame, ch 1 -> Active Frame - * case 3: ch0 -> Active Frame, ch 1 -> Inactive Frame - */ - - /* case 2 -> ch 0 is inactive, set it to active */ - if ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == -1 && ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) ) - { - st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 0; - } - - /* case 3 -> ch 1 is inactive, set it to active */ - if ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 && ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) ) - { - st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 0; - } - - /* case 1: both TCs are inactive */ - if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) ) - { - st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 1; - } - } - else - { - st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 0; - } - - /* Do a decision based on hysteresis */ - st_ivas->hISMDTX->dtx_flag = 1; - - for ( i = 1; i < ( PARAM_ISM_HYS_BUF_SIZE - 1 ); i++ ) - { - if ( ( st_ivas->hISMDTX->dtx_speech_buffer_enc[i + 1] == 1 ) && ( st_ivas->hISMDTX->dtx_speech_buffer_enc[i - 1] == 1 ) && ( st_ivas->hISMDTX->dtx_speech_buffer_enc[i] == 0 ) ) - { - st_ivas->hISMDTX->dtx_speech_buffer_enc[i] = 1; - } - } - - val = sum_s( st_ivas->hISMDTX->dtx_speech_buffer_enc, PARAM_ISM_HYS_BUF_SIZE ); - - if ( val < 7 ) - { - for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) - { - st_ivas->hISMDTX->dtx_flag = st_ivas->hISMDTX->dtx_flag && st_ivas->hISMDTX->dtx_speech_buffer_enc[i]; - } - } - - if ( st_ivas->hISMDTX->dtx_flag ) - { - /* case 1 */ - /* force FD-CNG */ - st_ivas->hSCE[0]->hCoreCoder[0]->cng_type = FD_CNG; - st_ivas->hSCE[1]->hCoreCoder[0]->cng_type = FD_CNG; - - /* synchronize the core bitrate */ - if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate == FRAME_NO_DATA ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->last_core_brate; - reset_indices_enc( st_ivas->hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); - } - - st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = st_ivas->hSCE[0]->hCoreCoder[0]->core_brate; - } - else - { - if ( ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = -1; - st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = -1; - - /* since ch0 is detected as inactive frame and we are setting it as active frame, - we need to reset bitstream pointer and write the ivas_format once more */ - ivas_write_format( st_ivas ); - } - - /* case 3 -> ch 1 is inactive, set it to active */ - if ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == -1 && ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) ) - { - st_ivas->hSCE[1]->hCoreCoder[0]->core_brate = -1; - } - - /* case 2 -> ch 0 is inactive, set it to active */ - if ( st_ivas->hSCE[1]->hCoreCoder[0]->core_brate == -1 && ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) ) - { - st_ivas->hSCE[0]->hCoreCoder[0]->core_brate = -1; - - /* since ch0 is detected as inactive frame and we are setting it as active frame, - we need to reset bitstream pointer and write the ivas_format once more */ - ivas_write_format( st_ivas ); - } - } - - if ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) - { - *sid_flag = 1; - dtx_flag = 1; - } - - if ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) - { - dtx_flag = 1; - } - - return dtx_flag; -} -#endif /*-------------------------------------------------------------------* * ivas_ism_get_sce_id_dtx() @@ -504,11 +361,7 @@ void ivas_ism_coh_estim_dtx_enc( { Encoder_State *st, *st_id0; int16_t sce_id, i; -#ifdef DISCRETE_ISM_DTX_CNG float acorr_ene[MAX_NUM_OBJECTS], xcorr_ene; -#else - float acorr_ene[PARAM_ISM_MAX_DMX], xcorr_ene; -#endif if ( nchan_transport == 1 ) { diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index f073609b8a..4a56252be8 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -85,17 +85,8 @@ ivas_error ivas_ism_enc( float Etot_LR[1]; /* total energy; correlation shift */ float lf_E[1][2 * VOIC_BINS]; /* per bin spectrum energy in lf */ int16_t localVAD_HE_SAD[1]; /* local HE VAD */ -#ifdef DISCRETE_ISM_DTX_CNG int16_t nchan_ism, dtx_flag, sid_flag, flag_noisy_speech; int16_t md_diff_flag[MAX_NUM_OBJECTS]; -#else -#ifdef NCHAN_ISM_PARAMETER - int16_t nchan_ism, dtx_flag, sid_flag; -#else - int16_t dtx_flag, sid_flag, flag_noisy_speech; -#endif - int16_t i, nBits; -#endif ivas_error error; push_wmops( "ivas_ism_enc" ); @@ -108,24 +99,9 @@ ivas_error ivas_ism_enc( dtx_flag = 0; sid_flag = 0; -#if ( !defined NCHAN_ISM_PARAMETER || defined DISCRETE_ISM_DTX_CNG ) flag_noisy_speech = 0; -#endif -#ifdef NCHAN_ISM_PARAMETER nchan_ism = st_ivas->hEncoderConfig->nchan_ism; -#else -#ifdef DISCRETE_ISM_DTX_CNG - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) - { - nchan_ism = st_ivas->hDirAC->hParamIsm->num_obj; - } - else /* ism_mode == ISM_MODE_DISC */ - { - nchan_ism = st_ivas->nchan_transport; - } -#endif -#endif set_s( md_diff_flag, 1, nchan_ism ); /*------------------------------------------------------------------* @@ -192,13 +168,11 @@ ivas_error ivas_ism_enc( return error; } -#ifdef DISCRETE_ISM_DTX_CNG if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) { vad_flag[sce_id] = vad_flag_dtx[sce_id][0]; } else -#endif { vad_flag[sce_id] = st->vad_flag; } @@ -208,21 +182,13 @@ ivas_error ivas_ism_enc( * DTX analysis *-----------------------------------------------------------------*/ -#ifdef DISCRETE_ISM_DTX_CNG if ( st_ivas->hEncoderConfig->Opt_DTX_ON ) -#else - if ( st_ivas->hEncoderConfig->Opt_DTX_ON && st_ivas->ism_mode == ISM_MODE_PARAM ) -#endif { /* compute the dominant sce_id using long term energy */ ivas_ism_get_sce_id_dtx( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->nchan_transport, input_frame ); /* analysis and decision about DTX */ -#ifdef DISCRETE_ISM_DTX_CNG dtx_flag = ivas_ism_dtx_enc( st_ivas->hISMDTX, st_ivas->hSCE, st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, vad_flag, st_ivas->hIsmMetaData, md_diff_flag, &sid_flag ); -#else - dtx_flag = ivas_ism_dtx_enc( st_ivas, &sid_flag ); -#endif if ( sid_flag ) { @@ -247,47 +213,28 @@ ivas_error ivas_ism_enc( if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { ivas_param_ism_compute_noisy_speech_flag( st_ivas ); -#ifdef DISCRETE_ISM_DTX_CNG flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech; -#endif } if ( dtx_flag ) { -#ifdef DISCRETE_ISM_DTX_CNG ivas_ism_metadata_sid_enc( st_ivas->hISMDTX, flag_noisy_speech, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode, st_ivas->hIsmMetaData, sid_flag, md_diff_flag, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata ); -#else - if ( sid_flag ) - { -#ifdef NCHAN_ISM_PARAMETER - ivas_param_ism_metadata_dtx_enc( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, st_ivas->hIsmMetaData, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, nchan_ism ); -#else - ivas_param_ism_metadata_dtx_enc( st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, st_ivas->hIsmMetaData, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm ); -#endif - } -#endif } else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { // VE: call ivas_ism_metadata_enc() with 'st_ivas' - TBD ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, -#ifdef NCHAN_ISM_PARAMETER nchan_ism, -#endif st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); } else /* ISM_MODE_DISC */ { ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, -#ifdef NCHAN_ISM_PARAMETER nchan_ism, -#endif st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); } -#ifdef DISCRETE_ISM_DTX_CNG update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); -#endif /*----------------------------------------------------------------* * Write IVAS format signaling in SID frames @@ -295,27 +242,9 @@ ivas_error ivas_ism_enc( st = st_ivas->hSCE[0]->hCoreCoder[0]; -#ifdef DISCRETE_ISM_DTX_CNG if ( sid_flag ) -#else - if ( st->core_brate == SID_2k40 ) -#endif { ivas_write_format_sid( st_ivas->hEncoderConfig->ivas_format, IVAS_SCE, st->hBstr ); - -#ifndef DISCRETE_ISM_DTX_CNG - if ( st_ivas->ism_mode != ISM_MODE_PARAM ) - { - /* write unused bits */ - nBits = ( IVAS_SID_5k2 - SID_2k40 ) / 50 - SID_FORMAT_NBITS; - while ( nBits > 0 ) - { - i = min( nBits, 16 ); - push_indice( st->hBstr, IND_UNUSED, 0, i ); - nBits -= i; - } - } -#endif } /*------------------------------------------------------------------* @@ -389,7 +318,6 @@ ivas_error ivas_ism_enc( } } -#ifdef DISCRETE_ISM_DTX_CNG #ifdef DEBUG_MODE_INFO if ( dtx_flag ) { @@ -423,7 +351,6 @@ ivas_error ivas_ism_enc( } } } -#endif #endif pop_wmops(); diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index d34479ad2d..e5e1e99156 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -64,11 +64,7 @@ * Local function declarations *-----------------------------------------------------------------------*/ -#ifdef FIX_379_ANGLE static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_angle1_abs, const int16_t idx_angle2_abs, int16_t *flag_abs_angle1, int16_t *flag_abs_angle2 ); -#else -static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, ISM_METADATA_ANGLE_HANDLE angle, const int16_t last_ism_metadata_flag, const int16_t ini_frame, const int16_t idx_azimuth_abs, const int16_t idx_elevation_abs, int16_t *flag_abs_azimuth, int16_t *flag_abs_elevation ); -#endif static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int16_t *radius_diff_cnt, const int16_t last_ism_metadata_flag, const int16_t idx_radius_abs, int16_t *flag_abs_radius ); @@ -166,10 +162,8 @@ static void rate_ism_importance( *-------------------------------------------------------------------------*/ ivas_error ivas_ism_metadata_enc( - const int32_t ism_total_brate, /* i : ISM total bitrate */ -#ifdef NCHAN_ISM_PARAMETER - const int16_t nchan_ism, /* i : number of ISM channels */ -#endif + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_ism, /* i : number of ISM channels */ const int16_t nchan_transport, /* i : number of transport channels */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ @@ -182,71 +176,33 @@ ivas_error ivas_ism_metadata_enc( ) { int16_t i, ch, nb_bits_start = 0; -#ifdef FIX_379_ANGLE int16_t flag_abs_azimuth[MAX_NUM_OBJECTS]; int16_t flag_abs_elevation[MAX_NUM_OBJECTS]; int16_t idx_angle1_abs = 0; int16_t idx_angle2_abs = 0; int16_t flag_abs_yaw[MAX_NUM_OBJECTS]; int16_t flag_abs_pitch[MAX_NUM_OBJECTS]; -#else - int16_t idx_azimuth_abs = 0, flag_abs_azimuth[MAX_NUM_OBJECTS]; - int16_t idx_elevation_abs = 0, flag_abs_elevation[MAX_NUM_OBJECTS]; - int16_t flag_abs_azimuth_orientation[MAX_NUM_OBJECTS]; -#endif int16_t idx_radius_abs = 0, flag_abs_radius[MAX_NUM_OBJECTS]; float valQ; ISM_METADATA_HANDLE hIsmMetaData; int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; int16_t ism_metadata_flag_global; int16_t ism_imp[MAX_NUM_OBJECTS]; -#ifdef NCHAN_ISM_PARAMETER int16_t nbands, nblocks; -#else - int16_t nchan_ism, nbands, nblocks; -#endif ivas_error error; error = IVAS_ERR_OK; push_wmops( "ism_meta_enc" ); -#ifndef NCHAN_ISM_PARAMETER - if ( ism_mode == ISM_MODE_PARAM ) - { - nchan_ism = hParamIsm->num_obj; - } - else if ( ism_mode == ISM_MODE_DISC ) - { - nchan_ism = nchan_transport; - } - else - { - return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: incorrect ISM mode" ); - } -#endif - -#ifndef DISCRETE_ISM_DTX_CNG - if ( nchan_ism == 1 && ( hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 || hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA ) && ism_mode == ISM_MODE_DISC ) - { - /* no metadata encoding in CNG */ - pop_wmops(); - - return error; - } -#endif /* initialization */ ism_metadata_flag_global = 0; set_s( nb_bits_metadata, 0, nchan_transport ); set_s( flag_abs_azimuth, 0, nchan_ism ); set_s( flag_abs_elevation, 0, nchan_ism ); -#ifdef FIX_379_ANGLE set_s( flag_abs_yaw, 0, nchan_ism ); set_s( flag_abs_pitch, 0, nchan_ism ); -#else - set_s( flag_abs_azimuth_orientation, 0, nchan_ism ); -#endif set_s( flag_abs_radius, 0, nchan_ism ); /*----------------------------------------------------------------* @@ -261,15 +217,7 @@ ivas_error ivas_ism_metadata_enc( } else if ( ism_mode == ISM_MODE_DISC ) { -#ifdef DISCRETE_ISM_DTX_CNG hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10; -#else - /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ - if ( localVAD[ch] == 0 && !( hSCE[ch]->hCoreCoder[0]->tcxonly ) && ( hSCE[ch]->hCoreCoder[0]->lp_noise <= 10 ) ) - { - hIsmMeta[ch]->ism_metadata_flag = 0; - } -#endif } } @@ -351,48 +299,25 @@ ivas_error ivas_ism_metadata_enc( if ( ism_mode == ISM_MODE_DISC ) { -#ifdef FIX_379_ANGLE idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); idx_angle2_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#else - idx_azimuth_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - idx_elevation_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#endif } else /* ISM_MODE_PARAM */ { -#ifdef FIX_379_ANGLE idx_angle1_abs = hParamIsm->azi_index[ch]; idx_angle2_abs = hParamIsm->ele_index[ch]; -#else - idx_azimuth_abs = hParamIsm->azi_index[ch]; - idx_elevation_abs = hParamIsm->ele_index[ch]; -#endif } -#ifdef FIX_379_ANGLE encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); -#else - encode_angle_indices( hBstr, &( hIsmMetaData->angle[0] ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_azimuth_abs, idx_elevation_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); -#endif /*----------------------------------------------------------------* * Quantize and encode radius, yaw, and pitch *----------------------------------------------------------------*/ if ( ism_mode == ISM_MODE_DISC && ism_extended_metadata_flag ) { -#ifdef FIX_379_ANGLE idx_angle1_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#else - idx_azimuth_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - idx_elevation_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); -#endif idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); -#ifdef FIX_379_ANGLE encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); -#else - encode_angle_indices( hBstr, &( hIsmMetaData->angle[1] ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_azimuth_abs, idx_elevation_abs, &flag_abs_azimuth_orientation[ch], &flag_abs_elevation[ch] ); -#endif encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); } @@ -461,20 +386,12 @@ ivas_error ivas_ism_metadata_enc( if ( abs_next % ISM_NUM_PARAM == 0 ) { -#ifdef FIX_379_ANGLE hIsmMeta[ch]->position_angle.angle1_diff_cnt = abs_num - 1; -#else - hIsmMeta[ch]->angle[0].azimuth_diff_cnt = abs_num - 1; -#endif } if ( abs_next % ISM_NUM_PARAM == 1 ) { -#ifdef FIX_379_ANGLE hIsmMeta[ch]->position_angle.angle2_diff_cnt = abs_num - 1; -#else - hIsmMeta[ch]->angle[0].elevation_diff_cnt = abs_num - 1; -#endif /*hIsmMeta[ch]->elevation_diff_cnt = min( hIsmMeta[ch]->elevation_diff_cnt, ISM_FEC_MAX );*/ } @@ -549,9 +466,14 @@ ivas_error ivas_ism_metadata_enc( for ( ch = 0; ch < nchan_transport; ch++ ) { +#ifdef FIX_419_ISM_BRATE_SW_DTX + hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; +#endif if ( ism_mode == ISM_MODE_DISC ) { +#ifndef FIX_419_ISM_BRATE_SW_DTX hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; +#endif if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; @@ -609,7 +531,6 @@ ivas_error ivas_ism_metadata_enc_create( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for ISM MetaData\n" ) ); } -#ifdef FIX_379_ANGLE st_ivas->hIsmMetaData[ch]->position_angle.last_angle1_idx = 0; st_ivas->hIsmMetaData[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; st_ivas->hIsmMetaData[ch]->position_angle.last_angle2_idx = 0; @@ -618,26 +539,14 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->orientation_angle.angle1_diff_cnt = ISM_FEC_MAX - 2; st_ivas->hIsmMetaData[ch]->orientation_angle.last_angle2_idx = 0; st_ivas->hIsmMetaData[ch]->orientation_angle.angle2_diff_cnt = ISM_FEC_MAX - 2; -#else - st_ivas->hIsmMetaData[ch]->angle[0].last_azimuth_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[0].azimuth_diff_cnt = ISM_FEC_MAX; - st_ivas->hIsmMetaData[ch]->angle[0].last_elevation_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[0].elevation_diff_cnt = ISM_FEC_MAX - 1; - st_ivas->hIsmMetaData[ch]->angle[1].last_azimuth_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[1].azimuth_diff_cnt = ISM_FEC_MAX - 2; - st_ivas->hIsmMetaData[ch]->angle[1].last_elevation_idx = 0; - st_ivas->hIsmMetaData[ch]->angle[1].elevation_diff_cnt = ISM_FEC_MAX - 2; -#endif st_ivas->hIsmMetaData[ch]->last_radius_idx = 0; st_ivas->hIsmMetaData[ch]->radius_diff_cnt = ISM_FEC_MAX - 2; st_ivas->hIsmMetaData[ch]->last_ism_metadata_flag = 0; ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); -#ifdef DISCRETE_ISM_DTX_CNG st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f; st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f; -#endif } if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) @@ -757,7 +666,6 @@ static void encode_radius( * * Encoding of an angle *----------------------------------------------------------------*/ -#ifdef FIX_379_ANGLE static void encode_angle_indices( BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ @@ -850,7 +758,11 @@ static void encode_angle_indices( if ( *flag_abs_angle1 == 0 ) { angle->angle1_diff_cnt++; +#ifdef FIX_419_ISM_MD_FIX + angle->angle1_diff_cnt = min( angle->angle1_diff_cnt, ISM_FEC_MAX ); +#else angle->angle2_diff_cnt = min( angle->angle2_diff_cnt, ISM_FEC_MAX ); +#endif } else { @@ -994,246 +906,7 @@ static void encode_angle_indices( return; } -#else - -static void encode_angle_indices( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ - const int16_t last_ism_metadata_flag, /* i : last frame ism_metadata_flag */ - const int16_t ini_frame, /* i : initialization frames counter */ - const int16_t idx_azimuth_abs, /* i : Azimuth index */ - const int16_t idx_elevation_abs, /* i : Elevation index */ - int16_t *flag_abs_azimuth, /* o : Azimuth encoding mode */ - int16_t *flag_abs_elevation /* o : Elevation encoding mode */ -) -{ - int16_t idx_azimuth, nbits_diff_azimuth, diff; - int16_t idx_elevation, nbits_diff_elevation; - - /*----------------------------------------------------------------* - * Azimuth index encoding - *----------------------------------------------------------------*/ - - idx_azimuth = idx_azimuth_abs; - - nbits_diff_azimuth = 0; - - *flag_abs_azimuth = 0; /* differential coding by default */ - if ( angle->azimuth_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ - || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ - ) - { - *flag_abs_azimuth = 1; - } - - /* try differential coding */ - if ( *flag_abs_azimuth == 0 ) - { - diff = idx_azimuth_abs - angle->last_azimuth_idx; - - /* azimuth is on a circle - check for diff coding for -180° -> 180° and vice versa changes */ - if ( abs( diff ) > ( ( 1 << ISM_AZIMUTH_NBITS ) - 1 ) - ISM_MAX_AZIMUTH_DIFF_IDX ) - { - if ( diff > 0 ) - { - diff -= ( 1 << ISM_AZIMUTH_NBITS ) - 1; - } - else - { - diff += ( 1 << ISM_AZIMUTH_NBITS ) - 1; - } - } - - if ( diff == 0 ) - { - idx_azimuth = 0; - nbits_diff_azimuth = 1; - } - else if ( ABSVAL( diff ) < ISM_MAX_AZIMUTH_DIFF_IDX ) /* when diff bits >= abs bits, prefer abs */ - { - idx_azimuth = 1 << 1; - nbits_diff_azimuth = 1; - - if ( diff < 0 ) - { - idx_azimuth += 1; /* negative sign */ - diff *= -1; - } - else - { - idx_azimuth += 0; /* positive sign */ - } - - idx_azimuth = idx_azimuth << diff; - nbits_diff_azimuth++; - - /* unary coding of "diff */ - idx_azimuth += ( ( 1 << diff ) - 1 ); - nbits_diff_azimuth += diff; - - if ( nbits_diff_azimuth < ISM_AZIMUTH_NBITS - 1 ) - { - /* add stop bit - only for codewords shorter than ISM_AZIMUTH_NBITS */ - idx_azimuth = idx_azimuth << 1; - nbits_diff_azimuth++; - } - } - else - { - *flag_abs_azimuth = 1; - } - } - - /* update counter */ - if ( *flag_abs_azimuth == 0 ) - { - angle->azimuth_diff_cnt++; - angle->elevation_diff_cnt = min( angle->elevation_diff_cnt, ISM_FEC_MAX ); - } - else - { - angle->azimuth_diff_cnt = 0; - } - - /* Write azimuth */ - push_indice( hBstr, IND_ISM_AZIMUTH_DIFF_FLAG, *flag_abs_azimuth, 1 ); - - if ( *flag_abs_azimuth ) - { - push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, ISM_AZIMUTH_NBITS ); - } - else - { - push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nbits_diff_azimuth ); - } - - /*----------------------------------------------------------------* - * Elevation index encoding - *----------------------------------------------------------------*/ - - idx_elevation = idx_elevation_abs; - nbits_diff_elevation = 0; - *flag_abs_elevation = 0; /* differential coding by default */ - if ( angle->elevation_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ - || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ - ) - { - *flag_abs_elevation = 1; - } - - /* note: elevation is coded starting from the second frame only (it is meaningless in the init_frame) */ - if ( ini_frame == 0 ) - { - *flag_abs_elevation = 1; - angle->last_elevation_idx = idx_elevation_abs; - } - - diff = idx_elevation_abs - angle->last_elevation_idx; - - /* avoid absolute coding of elevation if absolute coding was already used for azimuth */ - if ( *flag_abs_azimuth == 1 ) - { - int16_t diff_orig = diff; - - *flag_abs_elevation = 0; - - - if ( diff >= 0 ) - { - diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX ); - } - else - { - diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX ); - } - - if ( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX ) - { - angle->elevation_diff_cnt = ISM_FEC_MAX - 1; - } - } - - /* try differential coding */ - if ( *flag_abs_elevation == 0 ) - { - if ( diff == 0 ) - { - idx_elevation = 0; - nbits_diff_elevation = 1; - } - else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX ) - { - idx_elevation = 1 << 1; - nbits_diff_elevation = 1; - - if ( diff < 0 ) - { - idx_elevation += 1; /* negative sign */ - diff *= -1; - } - else - { - idx_elevation += 0; /* positive sign */ - } - - idx_elevation = idx_elevation << diff; - nbits_diff_elevation++; - /* unary coding of "diff */ - idx_elevation += ( ( 1 << diff ) - 1 ); - nbits_diff_elevation += diff; - - if ( nbits_diff_elevation < ISM_ELEVATION_NBITS ) - { - /* add stop bit */ - idx_elevation = idx_elevation << 1; - nbits_diff_elevation++; - } - } - else - { - *flag_abs_elevation = 1; - } - } - - /* update counter */ - if ( *flag_abs_elevation == 0 ) - { - angle->elevation_diff_cnt++; - angle->elevation_diff_cnt = min( angle->elevation_diff_cnt, ISM_FEC_MAX ); - } - else - { - angle->elevation_diff_cnt = 0; - } - - /* Write elevation */ - if ( *flag_abs_azimuth == 0 ) /* do not write "flag_abs_elevation" if "flag_abs_azimuth == 1" */ - { - push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_elevation, 1 ); - } - - if ( *flag_abs_elevation ) - { - push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, ISM_ELEVATION_NBITS ); - } - else - { - push_indice( hBstr, IND_ISM_ELEVATION, idx_elevation, nbits_diff_elevation ); - } - - /*----------------------------------------------------------------* - * Updates - *----------------------------------------------------------------*/ - - angle->last_azimuth_idx = idx_azimuth_abs; - angle->last_elevation_idx = idx_elevation_abs; - - return; -} -#endif - -#ifdef DISCRETE_ISM_DTX_CNG /*-------------------------------------------------------------------* * ivas_ism_metadata_sid_enc() * @@ -1351,24 +1024,13 @@ void ivas_ism_metadata_sid_enc( /* update last indexes to correspond to active frames coding */ if ( nBits_azimuth > ISM_AZIMUTH_NBITS ) { -#ifdef FIX_379_ANGLE hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); hIsmMetaData->position_angle.last_angle2_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); - -#else - hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth >> ( nBits_azimuth - ISM_AZIMUTH_NBITS ); - hIsmMetaData->angle[0].last_elevation_idx = idx_elevation >> ( nBits_elevation - ISM_ELEVATION_NBITS ); -#endif } else { -#ifdef FIX_379_ANGLE hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); -#else - hIsmMetaData->angle[0].last_azimuth_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); - hIsmMetaData->angle[0].last_elevation_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); -#endif } } } @@ -1387,4 +1049,3 @@ void ivas_ism_metadata_sid_enc( return; } -#endif diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 63c1fcea81..32fb6af515 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -47,27 +47,16 @@ static void ivas_param_ism_compute_obj_parameters( -#ifdef NCHAN_ISM_PARAMETER - const int16_t nchan_ism, /* i : number of ISM channels */ -#endif + const int16_t nchan_ism, /* i : number of ISM channels */ float reference_power_obj[MAX_NUM_OBJECTS][PARAM_ISM_MDFT_NO_SLOTS][DIRAC_NO_FB_BANDS_MAX], /* i : Reference power */ PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM Enc Handle */ ) { -#ifdef NCHAN_ISM_PARAMETER int16_t i, b, m, br, mr; -#else - int16_t i, b, m, br, mr, num_obj; -#endif int16_t brange_start, brange_end, mrange_start, mrange_end, time_merge_fac; float power_ratios_m[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS]; -#ifdef NCHAN_ISM_PARAMETER assert( nchan_ism == 3 || nchan_ism == 4 ); -#else - num_obj = hParamIsm->num_obj; - assert( num_obj == 3 || num_obj == 4 ); -#endif for ( b = 0; b < hParamIsm->nbands; b++ ) { @@ -92,11 +81,7 @@ static void ivas_param_ism_compute_obj_parameters( /* for each object, sum up reference power within current T/F tile */ -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < nchan_ism; i++ ) -#else - for ( i = 0; i < num_obj; i++ ) -#endif { for ( mr = mrange_start; mr < mrange_end; mr++ ) { @@ -119,11 +104,7 @@ static void ivas_param_ism_compute_obj_parameters( index_2 = 0; } -#ifdef NCHAN_ISM_PARAMETER for ( i = MAX_PARAM_ISM_WAVE; i < nchan_ism; i++ ) -#else - for ( i = MAX_PARAM_ISM_WAVE; i < num_obj; i++ ) -#endif { if ( ref_power_local[i] > ref_power_local[index_1] ) { @@ -169,30 +150,17 @@ static void ivas_param_ism_compute_obj_parameters( static void ivas_param_ism_enc_quantize_DOA( -#ifdef NCHAN_ISM_PARAMETER - const int16_t nchan_ism, /* i : number of ISM channels */ -#endif + const int16_t nchan_ism, /* i : number of ISM channels */ ISM_METADATA_HANDLE hIsmMetaData[MAX_NUM_OBJECTS], /* i : ISM metadata */ PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: Param ISM encoder handle */ ) { -#ifdef NCHAN_ISM_PARAMETER int16_t i, azi_idx, ele_idx; -#else - int16_t i, azi_idx, ele_idx, num_obj; -#endif float valQ; -#ifndef NCHAN_ISM_PARAMETER - num_obj = hParamIsm->num_obj; -#endif /* Loop over objects */ -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < nchan_ism; i++ ) -#else - for ( i = 0; i < num_obj; i++ ) -#endif { /* Quantize the elevation and obtain quantized elevation value and index */ ele_idx = ism_quant_meta( hIsmMetaData[i]->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); @@ -224,11 +192,7 @@ void ivas_param_ism_stereo_dmx( const int16_t input_frame /* i : Length of input frame */ ) { -#ifdef NCHAN_ISM_PARAMETER int16_t i, j; -#else - int16_t i, j, num_obj; -#endif float alpha, azi_shift, tmp, tmp_1; float cardioid_left[MAX_NUM_OBJECTS], cardioid_right[MAX_NUM_OBJECTS]; float stereo_dmx[2][L_FRAME48k]; @@ -239,20 +203,13 @@ void ivas_param_ism_stereo_dmx( /*Initialization*/ alpha = 0.5; azi_shift = 0; -#ifndef NCHAN_ISM_PARAMETER - num_obj = st_ivas->hDirAC->hParamIsm->num_obj; -#endif /* Set the stereo dmx to zero */ set_zero( stereo_dmx[0], L_FRAME48k ); set_zero( stereo_dmx[1], L_FRAME48k ); /* Loop over all objects */ -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < st_ivas->hEncoderConfig->nchan_ism; i++ ) -#else - for ( i = 0; i < num_obj; i++ ) -#endif { hIsmMetaData = st_ivas->hIsmMetaData[i]; @@ -314,10 +271,6 @@ ivas_error ivas_param_ism_enc_open( input_Fs = st_ivas->hEncoderConfig->input_Fs; -#ifndef NCHAN_ISM_PARAMETER - /* Assign the number of objects */ - hDirAC->hParamIsm->num_obj = st_ivas->hEncoderConfig->nchan_inp; -#endif /* set FB config. */ if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) @@ -331,11 +284,7 @@ ivas_error ivas_param_ism_enc_open( return error; } -#ifdef NCHAN_ISM_PARAMETER ivas_param_ism_config( hDirAC->hParamIsm, st_ivas->hEncoderConfig->nchan_inp ); -#else - ivas_param_ism_config( hDirAC->hParamIsm ); -#endif /* Assign memories for Band and Block grouping */ hDirAC->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; @@ -402,9 +351,7 @@ void ivas_param_ism_enc( ) { int16_t i, j, ts, l_ts; -#ifdef NCHAN_ISM_PARAMETER int16_t nchan_ism; -#endif int16_t num_time_slots; float *pcm_in[MAX_NUM_OBJECTS]; float fb_RealBuffer[MAX_NUM_OBJECTS][DIRAC_NO_FB_BANDS_MAX]; @@ -415,9 +362,7 @@ void ivas_param_ism_enc( DIRAC_ENC_HANDLE hDirAC; PARAM_ISM_CONFIG_HANDLE hParamIsm; -#ifdef NCHAN_ISM_PARAMETER nchan_ism = st_ivas->hEncoderConfig->nchan_ism; -#endif hDirAC = st_ivas->hDirAC; hParamIsm = hDirAC->hParamIsm; @@ -426,11 +371,7 @@ void ivas_param_ism_enc( l_ts = input_frame / PARAM_ISM_MDFT_NO_SLOTS; num_time_slots = PARAM_ISM_MDFT_NO_SLOTS; -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < nchan_ism; i++ ) -#else - for ( i = 0; i < hParamIsm->num_obj; i++ ) -#endif { pcm_in[i] = &data[i][0]; @@ -446,11 +387,7 @@ void ivas_param_ism_enc( ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); -#ifdef NCHAN_ISM_PARAMETER for ( i = 0; i < nchan_ism; i++ ) -#else - for ( i = 0; i < hParamIsm->num_obj; i++ ) -#endif { pcm_in[i] += l_ts; for ( j = 0; j < DIRAC_NO_FB_BANDS_MAX; j++ ) @@ -461,163 +398,16 @@ void ivas_param_ism_enc( } /* Quantize DOAs */ -#ifdef NCHAN_ISM_PARAMETER ivas_param_ism_enc_quantize_DOA( nchan_ism, st_ivas->hIsmMetaData, hParamIsm ); -#else - ivas_param_ism_enc_quantize_DOA( st_ivas->hIsmMetaData, hParamIsm ); -#endif /* Compute object indices and power ratios */ -#ifdef NCHAN_ISM_PARAMETER ivas_param_ism_compute_obj_parameters( nchan_ism, reference_power_obj, hParamIsm ); -#else - ivas_param_ism_compute_obj_parameters( reference_power_obj, hParamIsm ); -#endif pop_wmops(); return; } -#ifndef DISCRETE_ISM_DTX_CNG -static void ivas_param_ism_enc_quantize_DOA_dtx( - float azimuth, - float elevation, - int16_t azi_bits, - int16_t ele_bits, - int16_t *azi_idx, - int16_t *ele_idx ) -{ - int16_t nbits, npoints, angle_spacing, az_alpha, ele_alpha; - float azi_val; - - /* Step 1: Determine angle spacing/n_points based on minimum value among elevation/azimuth bits */ - nbits = min( azi_bits, ele_bits ); - - if ( nbits == ISM_ELEVATION_NBITS ) - { - angle_spacing = 5; - } - else - { - angle_spacing = (int16_t) ( ( 180.f / (float) ( 1 << nbits ) ) + 0.5f ); - } - - npoints = (int16_t) ( ( 90 / angle_spacing ) + 0.5f ); - - /* Step 2: Quantize Elevation */ - ele_alpha = 2 * npoints - 1; - *ele_idx = (int16_t) ( ( elevation / angle_spacing ) + 0.5f ) + npoints; - if ( *ele_idx >= ele_alpha ) - { - *ele_idx = ele_alpha - 1; - } - assert( ( 0 <= *ele_idx ) && ( *ele_idx < ele_alpha ) ); - - /* Step 3: Quantize Azimuth */ - az_alpha = 4 * npoints - 1; - - /* Convert azimuth in {-180,180} into {0,360} before quantization */ - if ( azimuth >= 0 ) - { - azi_val = azimuth; - } - else - { - azi_val = azimuth + 360.f; - } - - /* Obtain the index of quantized azimuth values */ - *azi_idx = (int16_t) ( ( ( azi_val / 360.f ) * az_alpha ) + 0.5f ); - if ( *azi_idx == az_alpha ) - { - /*wrap around the azimuth angle*/ - *azi_idx = 0; - } - assert( ( 0 <= *azi_idx ) && ( *azi_idx < az_alpha ) ); - - return; -} - - -/*------------------------------------------------------------------------- - * ivas_param_ism_metadata_dtx_enc() - * - *-------------------------------------------------------------------------*/ - -void ivas_param_ism_metadata_dtx_enc( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ - ISM_METADATA_HANDLE hIsmMeta[], /* i : ISM metadata handles */ - ISM_DTX_HANDLE hISMDTX, /* i/o: ISM DTX handle */ - PARAM_ISM_CONFIG_HANDLE hParamIsm /* i : Param ISM Enc Handle */ -#ifdef NCHAN_ISM_PARAMETER - , - const int16_t nchan_ism /* i : number of ISM channels */ -#endif -) -{ - int16_t i, nBits, nBits_unused; - int16_t azi_idx, ele_idx; - int16_t coh_idx; - - nBits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; - nBits -= SID_FORMAT_NBITS; - - /* Transmit the metadata */ - /* write number of objects - unary coding */ -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < nchan_ism; i++ ) -#else - for ( i = 1; i < hParamIsm->num_obj; i++ ) -#endif - { - push_indice( hBstr, IND_ISM_NUM_OBJECTS, 1, 1 ); - } - push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); - - /* write sce id */ - push_indice( hBstr, IND_ISM_SCE_ID_DTX, hISMDTX->sce_id_dtx, 1 ); - - /* write noisy speech flag */ - push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, hParamIsm->flag_noisy_speech, 1 ); - - /* quantize and write coherence */ - coh_idx = (int16_t) ( hISMDTX->coh[0] * ( ( 1 << PARAM_ISM_DTX_COH_SCA_BITS ) - 1 ) + 0.5f ); - assert( ( coh_idx >= 0 ) && ( coh_idx <= ( ( 1 << PARAM_ISM_DTX_COH_SCA_BITS ) - 1 ) ) ); - push_indice( hBstr, IND_ISM_DTX_COH_SCA, coh_idx, PARAM_ISM_DTX_COH_SCA_BITS ); - -#ifdef NCHAN_ISM_PARAMETER - for ( i = 0; i < nchan_ism; i++ ) -#else - for ( i = 0; i < hParamIsm->num_obj; i++ ) -#endif - { - ivas_param_ism_enc_quantize_DOA_dtx( hIsmMeta[i]->azimuth, hIsmMeta[i]->elevation, PARAM_ISM_DTX_AZI_BITS, PARAM_ISM_DTX_ELE_BITS, &azi_idx, &ele_idx ); - push_indice( hBstr, IND_ISM_AZIMUTH, azi_idx, PARAM_ISM_DTX_AZI_BITS ); - push_indice( hBstr, IND_ISM_ELEVATION, ele_idx, PARAM_ISM_DTX_ELE_BITS ); - } - -#ifdef DEBUG_MODE_PARAM_ISM - dbgwrite( &( hParamIsm->coh ), sizeof( float ), 1, 1, "./res/ParamISM_coh_enc.dat" ); -#endif - - /* Write unused (padding) bits */ - nBits_unused = nBits - hBstr->nb_bits_tot; - while ( nBits_unused > 0 ) - { - i = min( nBits_unused, 16 ); - push_indice( hBstr, IND_UNUSED, 0, i ); - nBits_unused -= i; - } - -#ifdef DEBUGGING - assert( hBstr->nb_bits_tot == nBits ); -#endif - - return; -} -#endif - /*-------------------------------------------------------------------* * ivas_param_ism_compute_noisy_speech_flag() * @@ -639,7 +429,11 @@ void ivas_param_ism_compute_noisy_speech_flag( /* For the current frame, make a decision based on some core-coder flags */ if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) { +#ifdef FIX_422 + if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) +#else if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag && st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) +#endif { st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index fbb7af9ab4..2a21a667e9 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -61,7 +61,6 @@ static int16_t encode_lfe_to_total_energy_ratio( MASA_ENCODER_HANDLE hMasa, BSTR static void reduce_metadata_further( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hqmetadata, const IVAS_FORMAT ivas_format ); -#ifdef FIX_382_MASA_META_FRAMING_ASYNC static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] ); static void copy_masa_metadata_subframe( const MASA_METADATA_HANDLE hMetaFrom, const uint8_t sfFrom, MASA_METADATA_HANDLE hMetaTo, const uint8_t sfTo ); @@ -71,6 +70,9 @@ static void copy_masa_metadata( const MASA_METADATA_HANDLE hMetaFrom, MASA_METAD static uint8_t are_masa_subframes_similar( const MASA_METADATA_HANDLE frame1, const uint8_t sf1_idx, const MASA_METADATA_HANDLE frame2, const uint8_t sf2_idx ); static void detect_framing_async( MASA_ENCODER_HANDLE hMasa ); + +#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT +static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa ); #endif /*-----------------------------------------------------------------------* @@ -131,16 +133,6 @@ ivas_error ivas_masa_enc_open( mvs2s( DirAC_block_grouping, hMasa->config.block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); mvs2s( MASA_band_grouping_24, hMasa->config.band_grouping, MASA_FREQUENCY_BANDS + 1 ); -#ifndef FIX_350_MASA_DELAY_COMP - if ( hEncoderConfig->ivas_format == MASA_FORMAT ) - { - for ( i = 0; i < st_ivas->nchan_transport; i++ ) - { - hMasa->data.delay_buffer[i] = (float *) malloc( MASA_ENC_DELAY_SLOTS * CLDFB_NO_CHANNELS_MAX * sizeof( float ) ); - set_f( hMasa->data.delay_buffer[i], 0.0f, MASA_ENC_DELAY_SLOTS * CLDFB_NO_CHANNELS_MAX ); - } - } -#endif hMasa->data.onset_detector_1 = 0.0f; hMasa->data.onset_detector_2 = 0.0f; @@ -149,10 +141,15 @@ ivas_error ivas_masa_enc_open( hMasa->data.prevq_lfeToTotalEnergyRatio = 0.0f; hMasa->data.prevq_lfeIndex = 0; -#ifdef FIX_382_MASA_META_FRAMING_ASYNC hMasa->data.sync_state.prev_sim_stop = 0; hMasa->data.sync_state.prev_offset = 0; hMasa->data.sync_state.frame_mode = MASA_FRAME_4SF; + +#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT + set_zero( hMasa->data.dir_align_state.previous_azi_dir1, MASA_FREQUENCY_BANDS ); + set_zero( hMasa->data.dir_align_state.previous_ele_dir1, MASA_FREQUENCY_BANDS ); + set_zero( hMasa->data.dir_align_state.previous_azi_dir2, MASA_FREQUENCY_BANDS ); + set_zero( hMasa->data.dir_align_state.previous_ele_dir2, MASA_FREQUENCY_BANDS ); #endif st_ivas->hMasa = hMasa; @@ -169,11 +166,6 @@ ivas_error ivas_masa_enc_open( void ivas_masa_enc_close( MASA_ENCODER_HANDLE *hMasa /* i/o: MASA metadata structure */ -#ifndef FIX_350_MASA_DELAY_COMP - , - const int16_t nchan_transport, /* i : Number of transport channels */ - const IVAS_FORMAT ivas_format /* i : IVAS format */ -#endif ) { int16_t i; @@ -188,16 +180,6 @@ void ivas_masa_enc_close( deleteCldfb( &( ( *hMasa )->data.cldfbAnaEnc[i] ) ); } -#ifndef FIX_350_MASA_DELAY_COMP - if ( ivas_format == MASA_FORMAT ) - { - for ( i = 0; i < nchan_transport; i++ ) - { - free( ( *hMasa )->data.delay_buffer[i] ); - ( *hMasa )->data.delay_buffer[i] = NULL; - } - } -#endif free( ( *hMasa ) ); ( *hMasa ) = NULL; @@ -433,27 +415,10 @@ void ivas_masa_estimate_energy( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { -#ifdef FIX_350_MASA_DELAY_COMP for ( i = 0; i < nchan_transport; i++ ) { cldfbAnalysis_ts( &( data_f[i][l_ts * ts] ), Input_RealBuffer[i], Input_ImagBuffer[i], l_ts, hMasa->data.cldfbAnaEnc[i] ); } -#else - if ( ts < MASA_ENC_DELAY_SLOTS ) - { - for ( i = 0; i < nchan_transport; i++ ) - { - cldfbAnalysis_ts( &( hMasa->data.delay_buffer[i][l_ts * ts] ), Input_RealBuffer[i], Input_ImagBuffer[i], l_ts, hMasa->data.cldfbAnaEnc[i] ); - } - } - else - { - for ( i = 0; i < nchan_transport; i++ ) - { - cldfbAnalysis_ts( &( data_f[i][l_ts * ( ts - MASA_ENC_DELAY_SLOTS )] ), Input_RealBuffer[i], Input_ImagBuffer[i], l_ts, hMasa->data.cldfbAnaEnc[i] ); - } - } -#endif for ( band_m_idx = 0; band_m_idx < MASA_FREQUENCY_BANDS; band_m_idx++ ) { @@ -481,12 +446,6 @@ void ivas_masa_estimate_energy( } } -#ifndef FIX_350_MASA_DELAY_COMP - for ( i = 0; i < nchan_transport; i++ ) - { - mvr2r( &data_f[i][input_frame - MASA_ENC_DELAY_SLOTS * maxBin], &( hMasa->data.delay_buffer[i][0] ), MASA_ENC_DELAY_SLOTS * maxBin ); - } -#endif return; } @@ -525,14 +484,17 @@ ivas_error ivas_masa_enc_config( if ( ivas_format == MASA_FORMAT ) { -#ifdef FIX_382_MASA_META_FRAMING_ASYNC +#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT + masa_metadata_direction_alignment( hMasa ); +#endif + detect_framing_async( hMasa ); /* detect the offset, set 1sf/4sf mode based on this. potentially also shift the metadata using a history buffer */ + if ( hMasa->data.sync_state.frame_mode == MASA_FRAME_1SF && hMasa->data.sync_state.prev_offset != 0 ) { /* average over sub-frames */ average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy ); } -#endif /* Inspect metadata for parameter changes that affect coding. */ detect_metadata_composition( hMasa, &joinedSubframes, &coherencePresent, &isActualTwoDir ); @@ -623,11 +585,7 @@ ivas_error ivas_masa_enc_config( ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format ); -#ifdef FIX_350_MASA_DELAY_COMP masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL ); -#else - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs ); -#endif /* Transmit stereo signals using a mono downmix at lowest bitrates */ if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) @@ -1121,18 +1079,12 @@ static void detect_metadata_composition( ) { MASA_METADATA_FRAME *hMeta; -#ifdef FIX_382_MASA_META_FRAMING_ASYNC int8_t sf, band, dir, numDir; -#else - int16_t sf, band, dir, numDir; -#endif int16_t nSubFrames; uint8_t dirValid[2] = { FALSE }; uint8_t cohPresent = FALSE; uint8_t sfDiffer = FALSE; -#ifdef FIX_382_MASA_META_FRAMING_ASYNC uint8_t sfSimilar; -#endif hMeta = &( hMasa->masaMetadata ); numDir = hMeta->descriptive_meta.numberOfDirections + 1; @@ -1197,7 +1149,6 @@ static void detect_metadata_composition( } /* Check if data over subframes is identical. Check is done by comparing to first subframe. */ -#ifdef FIX_382_MASA_META_FRAMING_ASYNC sfSimilar = TRUE; sf = 1; while ( ( sfSimilar == TRUE ) && ( sf < MAX_PARAM_SPATIAL_SUBFRAMES ) ) @@ -1206,54 +1157,6 @@ static void detect_metadata_composition( sf++; } sfDiffer = sfSimilar == TRUE ? FALSE : TRUE; -#else - dir = 0; - while ( sfDiffer == FALSE && dir < numDir ) - { - sf = 1; - while ( sfDiffer == FALSE && sf < MAX_PARAM_SPATIAL_SUBFRAMES ) - { - band = 0; - while ( sfDiffer == FALSE && band < MASA_FREQUENCY_BANDS ) - { - float aziDif; - aziDif = fabsf( hMeta->directional_meta[dir].azimuth[sf][band] - hMeta->directional_meta[dir].azimuth[0][band] ); - aziDif = aziDif > 180.0f ? aziDif - 360.0f : aziDif; - if ( aziDif > MASA_ANGLE_TOLERANCE ) - { - sfDiffer = TRUE; - break; - } - - if ( fabsf( hMeta->directional_meta[dir].elevation[sf][band] - hMeta->directional_meta[dir].elevation[0][band] ) > MASA_ANGLE_TOLERANCE ) - { - sfDiffer = TRUE; - break; - } - - if ( fabsf( hMeta->directional_meta[dir].energy_ratio[sf][band] - hMeta->directional_meta[dir].energy_ratio[0][band] ) > MASA_RATIO_TOLERANCE ) - { - sfDiffer = TRUE; - break; - } - - if ( fabsf( hMeta->directional_meta[dir].spread_coherence[sf][band] - hMeta->directional_meta[dir].spread_coherence[0][band] ) > MASA_COHERENCE_TOLERANCE ) - { - sfDiffer = TRUE; - break; - } - - if ( dir == 0 && fabsf( hMeta->common_meta.surround_coherence[sf][band] - hMeta->common_meta.surround_coherence[0][band] ) > MASA_COHERENCE_TOLERANCE ) - { - sfDiffer = TRUE; - } - band++; - } - sf++; - } - dir++; - } -#endif /* Further checks can be done with just one subframe if they are identical */ nSubFrames = sfDiffer == TRUE ? MAX_PARAM_SPATIAL_SUBFRAMES : 1; @@ -1799,7 +1702,6 @@ void ivas_masa_enc_reconfigure( } -#ifdef FIX_382_MASA_META_FRAMING_ASYNC /*-------------------------------------------------------------------* * average_masa_metadata() * @@ -2197,4 +2099,168 @@ static void detect_framing_async( return; } + + +#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT +/*-------------------------------------------------------------------* + * masa_metadata_direction_alignment() + * + * In 2dir MASA metadata, determine the ordering of the directional + * fields such that the azi/ele change across time is minimized. + *-------------------------------------------------------------------*/ + +static void masa_metadata_direction_alignment( + MASA_ENCODER_HANDLE hMasa /* i/o: MASA encoder handle */ +) +{ + uint8_t band, n_dirs; + + MASA_DIR_ALIGN_HANDLE hAlignState; + MASA_METADATA_HANDLE hMeta; + + hAlignState = &( hMasa->data.dir_align_state ); + hMeta = &( hMasa->masaMetadata ); + + n_dirs = hMeta->descriptive_meta.numberOfDirections + 1; /* 1-based */ + for ( band = 0; band < MASA_FREQUENCY_BANDS; band++ ) + { + uint8_t sf; + float diff_swap, diff_no_swap; + + /* trade 2*(cos+sin) against storing the values between frames */ + float prev_ele_dir1_sin, prev_ele_dir2_sin; + float prev_ele_dir1_cos, prev_ele_dir2_cos; + + prev_ele_dir1_sin = sinf( hAlignState->previous_ele_dir1[band] ); + prev_ele_dir2_sin = sinf( hAlignState->previous_ele_dir2[band] ); + + prev_ele_dir1_cos = cosf( hAlignState->previous_ele_dir1[band] ); + prev_ele_dir2_cos = cosf( hAlignState->previous_ele_dir2[band] ); + + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + float azi_rad1, ele_rad1; + float azi_rad2, ele_rad2; + float cos_ele1, cos_ele2; + float sin_ele1, sin_ele2; + + azi_rad1 = hMeta->directional_meta[0].azimuth[sf][band] * PI_OVER_180; + ele_rad1 = hMeta->directional_meta[0].elevation[sf][band] * PI_OVER_180; + + if ( n_dirs > 1 ) + { + azi_rad2 = hMeta->directional_meta[1].azimuth[sf][band] * PI_OVER_180; + ele_rad2 = hMeta->directional_meta[1].elevation[sf][band] * PI_OVER_180; + + /* quick checks to detect constant data and earlier flip */ + if ( fabsf( azi_rad1 - hAlignState->previous_azi_dir1[band] ) < EPSILON && + fabsf( azi_rad2 - hAlignState->previous_azi_dir2[band] ) < EPSILON && + fabsf( ele_rad1 - hAlignState->previous_ele_dir1[band] ) < EPSILON && + fabsf( ele_rad2 - hAlignState->previous_ele_dir2[band] ) < EPSILON ) + { + diff_swap = 1.0f; + diff_no_swap = 0.0f; + /* cached values that will be used for the short-cuts and over-written by the real computations, if done */ + sin_ele1 = prev_ele_dir1_sin; + sin_ele2 = prev_ele_dir2_sin; + cos_ele1 = prev_ele_dir1_cos; + cos_ele2 = prev_ele_dir2_cos; + } + else if ( fabsf( azi_rad1 - hAlignState->previous_azi_dir2[band] ) < EPSILON && + fabsf( azi_rad2 - hAlignState->previous_azi_dir1[band] ) < EPSILON && + fabsf( ele_rad1 - hAlignState->previous_ele_dir2[band] ) < EPSILON && + fabsf( ele_rad2 - hAlignState->previous_ele_dir1[band] ) < EPSILON ) + { + diff_swap = 0.0f; + diff_no_swap = 1.0f; + /* cached values that will be used for the short-cuts and over-written by the real computations, if done */ + sin_ele1 = prev_ele_dir2_sin; + sin_ele2 = prev_ele_dir1_sin; + cos_ele1 = prev_ele_dir2_cos; + cos_ele2 = prev_ele_dir1_cos; + } + else + { + /* angular distance of the two vectors */ + /* pre-compute values for re-use */ + sin_ele1 = sinf( ele_rad1 ); + sin_ele2 = sinf( ele_rad2 ); + + cos_ele1 = cosf( ele_rad1 ); + cos_ele2 = cosf( ele_rad2 ); + + diff_no_swap = acosf( cos_ele1 * prev_ele_dir1_cos * cosf( azi_rad1 - hAlignState->previous_azi_dir1[band] ) + sin_ele1 * prev_ele_dir1_sin ) + + acosf( cos_ele2 * prev_ele_dir2_cos * cosf( azi_rad2 - hAlignState->previous_azi_dir2[band] ) + sin_ele2 * prev_ele_dir2_sin ); + + diff_swap = acosf( cos_ele1 * prev_ele_dir2_cos * cosf( azi_rad1 - hAlignState->previous_azi_dir2[band] ) + sin_ele1 * prev_ele_dir2_sin ) + + acosf( cos_ele2 * prev_ele_dir1_cos * cosf( azi_rad2 - hAlignState->previous_azi_dir1[band] ) + sin_ele2 * prev_ele_dir1_sin ); + } + } + else + { + /* 1dir */ + sin_ele1 = sinf( ele_rad1 ); + cos_ele1 = cosf( ele_rad1 ); + + azi_rad2 = 0.0f; + ele_rad2 = 0.0f; + + sin_ele2 = 0.0f; /* sin(0) */ + cos_ele2 = 1.0f; /* cos(0) */ + + diff_swap = 1.0f; + diff_no_swap = 0.0f; + } + + if ( n_dirs > 1 && diff_no_swap > diff_swap ) + { + /* swap the metadata of the two directions in this TF-tile */ + float tmp_val; + tmp_val = hMeta->directional_meta[0].azimuth[sf][band]; + hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; + hMeta->directional_meta[1].azimuth[sf][band] = tmp_val; + + tmp_val = hMeta->directional_meta[0].elevation[sf][band]; + hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; + hMeta->directional_meta[1].elevation[sf][band] = tmp_val; + + tmp_val = hMeta->directional_meta[0].energy_ratio[sf][band]; + hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; + hMeta->directional_meta[1].energy_ratio[sf][band] = tmp_val; + + tmp_val = hMeta->directional_meta[0].spread_coherence[sf][band]; + hMeta->directional_meta[0].spread_coherence[sf][band] = hMeta->directional_meta[1].spread_coherence[sf][band]; + hMeta->directional_meta[1].spread_coherence[sf][band] = tmp_val; + + hAlignState->previous_azi_dir1[band] = azi_rad2; + hAlignState->previous_ele_dir1[band] = ele_rad2; + + hAlignState->previous_azi_dir2[band] = azi_rad1; + hAlignState->previous_ele_dir2[band] = ele_rad1; + + prev_ele_dir1_cos = cos_ele2; + prev_ele_dir1_sin = sin_ele2; + + prev_ele_dir2_cos = cos_ele1; + prev_ele_dir2_sin = sin_ele1; + } + else + { + hAlignState->previous_azi_dir1[band] = azi_rad1; + hAlignState->previous_ele_dir1[band] = ele_rad1; + + hAlignState->previous_azi_dir2[band] = azi_rad2; + hAlignState->previous_ele_dir2[band] = ele_rad2; + + prev_ele_dir1_cos = cos_ele1; + prev_ele_dir1_sin = sin_ele1; + + prev_ele_dir2_cos = cos_ele2; + prev_ele_dir2_sin = sin_ele2; + } + } /* sf */ + } /* band */ + + return; +} #endif diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index db9945d0ce..14eca6afee 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -199,7 +199,11 @@ ivas_error ivas_param_mc_enc_open( /* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */ for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ ) { +#ifdef PARAMMC_SHORT_ENC_MDFT + hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC; +#else hParamMC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; +#endif } /* set correct coded band width */ @@ -335,7 +339,11 @@ ivas_error ivas_param_mc_enc_reconfig( /* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */ for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ ) { +#ifdef PARAMMC_SHORT_ENC_MDFT + hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC; +#else hParamMC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; +#endif } /* set correct coded band width */ @@ -682,7 +690,11 @@ static void ivas_param_mc_param_est_enc( for ( ts = start_ts; ts < num_time_slots; ts++ ) { +#ifdef PARAMMC_SHORT_ENC_MDFT + ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts ); +#else ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, 2 * l_ts ); +#endif ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts ); for ( i = 0; i < nchan_input; i++ ) { diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 866e4e176c..8151b33c66 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -450,11 +450,7 @@ ivas_error ivas_mcmasa_enc_reconfig( /* bitrate changed, may need to do something */ /* brute-force solution: close McMASA and re-instantiate with new settings */ -#ifdef FIX_350_MASA_DELAY_COMP ivas_masa_enc_close( &( st_ivas->hMasa ) ); -#else - ivas_masa_enc_close( &( st_ivas->hMasa ), st_ivas->nchan_transport, st_ivas->hEncoderConfig->ivas_format ); -#endif ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); /* Determine if to separate some channels from the analysis */ diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index c2c2e284c2..900c5e1653 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -51,9 +51,6 @@ *----------------------------------------------------------*/ static void FindChannelRatio( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ -#endif Encoder_State **sts, /* i/o: encoder state structure */ int16_t chBitRatios[MCT_MAX_CHANNELS], /* o : bit-disctribution channel ratios */ const int16_t nChannels /* i : number of channels to be coded */ @@ -71,11 +68,7 @@ static void FindChannelRatio( sum_nrg = 0; for ( i = 0; i < nChannels; i++ ) { - if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[i]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { sum_nrg += nrg[i]; } @@ -84,11 +77,7 @@ static void FindChannelRatio( for ( i = 0; i < nChannels; i++ ) { - if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[i]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[i]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { chRatio = nrg[i] * sum_nrg; chBitRatios[i] = min( BITRATE_MCT_RATIO_RANGE - 1, max( 1, (uint16_t) ( BITRATE_MCT_RATIO_RANGE * chRatio + 0.5f ) ) ); @@ -97,13 +86,6 @@ static void FindChannelRatio( { chBitRatios[i] = 0; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - else if ( hMCT->num_lfe ) - { - assert( sts[i]->mct_chan_mode == MCT_CHAN_MODE_LFE ); - chBitRatios[i] = !hMCT->LFE_off; - } -#endif } #ifdef DEBUG_MODE_MDCT @@ -269,11 +251,7 @@ void ivas_mct_core_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { sts[i] = hCPE[cpe_id]->hCoreCoder[ch]; - if ( hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) + if ( hCPE[cpe_id]->hCoreCoder[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { i++; continue; @@ -323,9 +301,6 @@ void ivas_mct_core_enc( st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && hMCT->LFE_off ) || -#endif st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -355,9 +330,6 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -406,9 +378,6 @@ void ivas_mct_core_enc( { st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -442,9 +411,6 @@ void ivas_mct_core_enc( { st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -467,9 +433,6 @@ void ivas_mct_core_enc( { st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -484,9 +447,6 @@ void ivas_mct_core_enc( st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) && hMCT->LFE_off ) || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -503,9 +463,6 @@ void ivas_mct_core_enc( write_mct_bitstream( sts, hMCT, nChannels ); FindChannelRatio( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT, -#endif sts, chBitRatios, nChannels ); nAvailBits = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - NBITS_BWIDTH - hMCT->nBitsMCT - lfe_bits ); @@ -535,20 +492,13 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE ) && hMCT->LFE_off ) || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } nAvailBits -= NBBITS_MCT_RATIO; } - nAvailBits -= total_side_bits -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + ( hMCT->num_lfe ? 1 : 0 ) -#endif - + hMCT->nchan_out_woLFE; /* if MC 1 extra bit that was initially send to signal LFE_off */ + nAvailBits -= total_side_bits + hMCT->nchan_out_woLFE; /* if MC 1 extra bit that was initially send to signal LFE_off */ #ifdef DEBUG_MODE_MDCT dbgwrite( &nAvailBits, sizeof( int16_t ), 1, 1, "./res/availBits" ); @@ -563,9 +513,6 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE ) && hMCT->LFE_off ) || -#endif sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; @@ -589,17 +536,10 @@ void ivas_mct_core_enc( { continue; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( !( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) && hMCT->LFE_off ) ) /* indicates LFE with no content */ - { -#endif - st->total_brate = ( st->bits_frame_channel + st->side_bits_frame_channel ) * FRAMES_PER_SEC; + st->total_brate = ( st->bits_frame_channel + st->side_bits_frame_channel ) * FRAMES_PER_SEC; #ifdef DEBUGGING - total_brate += st->total_brate; -#endif -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } + total_brate += st->total_brate; #endif } #ifdef DEBUGGING @@ -612,11 +552,7 @@ void ivas_mct_core_enc( #ifdef DEBUGGING format_bits = ( ivas_format == MC_FORMAT ? IVAS_FORMAT_SIGNALING_NBITS + MC_LS_SETUP_BITS : IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS ); - mct_bits += hMCT->nBitsMCT -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + ( hMCT->num_lfe ? 1 : 0 ) -#endif - + hMCT->nchan_out_woLFE; + mct_bits += hMCT->nBitsMCT + hMCT->nchan_out_woLFE; assert( ( total_brate + ( NBITS_BWIDTH + format_bits + mct_bits + sba_meta + lfe_bits ) * FRAMES_PER_SEC ) == ivas_total_brate ); #endif diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index 75191d0a41..f2f5d23461 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -101,7 +101,6 @@ static void set_mct_enc_params( * cpe_id 1: L=data[4] R=data[5] * cpe_id 2: L=data[2] (mid) R=NULL *-------------------------------------------------------------------*/ -#ifdef ISSUE_24_CLEANUP_MCT_LFE static void map_input_to_cpe_channels( const Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ float *pdata[MAX_INPUT_CHANNELS], /* o: mapped input pointers */ @@ -144,7 +143,6 @@ static void map_input_to_cpe_channels( return; } -#endif /*-------------------------------------------------------------------* * ivas_mct_enc() * @@ -168,9 +166,7 @@ ivas_error ivas_mct_enc( int16_t max_bwidth; int32_t ivas_total_brate; ivas_error error; -#ifdef ISSUE_24_CLEANUP_MCT_LFE float *pdata[MAX_INPUT_CHANNELS]; -#endif error = IVAS_ERR_OK; @@ -200,7 +196,6 @@ ivas_error ivas_mct_enc( hMCT->p_orig_spectrum_long[cpe_id][n] = orig_spectrum_long[cpe_id][n]; hCPE->hCoreCoder[n]->input_bwidth = hCPE->hCoreCoder[n]->last_input_bwidth; /* updated in BWD */ hCPE->hCoreCoder[n]->bwidth = hCPE->hCoreCoder[n]->last_bwidth; /* updated in BWD */ -#ifdef ISSUE_24_CLEANUP_MCT_LFE /* reset channel mode from previous state*/ if ( ( hCPE->cpe_id * CPE_CHANNELS + n ) >= hMCT->nchan_out_woLFE ) { @@ -210,12 +205,8 @@ ivas_error ivas_mct_enc( { hCPE->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; } -#endif } } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->LFE_off = 1; /* disable LFE coding by default for the moment */ -#endif /* reconfiguration in case of bitrate switching */ if ( ivas_total_brate != st_ivas->hEncoderConfig->last_ivas_total_brate ) { @@ -231,18 +222,12 @@ ivas_error ivas_mct_enc( /* set coded audio band-width */ switch_bw = set_bw_mct( st_ivas->hCPE, st_ivas->nCPE ); -#ifdef ISSUE_24_CLEANUP_MCT_LFE /*for MC and MCT remove pointer to LFE input that has been processed seperately */ map_input_to_cpe_channels( st_ivas, pdata, data ); -#endif /* pre-processing */ for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { -#ifdef ISSUE_24_CLEANUP_MCT_LFE if ( ( error = ivas_cpe_enc( st_ivas, cpe_id, pdata[cpe_id * CPE_CHANNELS], pdata[cpe_id * CPE_CHANNELS + 1], input_frame, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_cpe_enc( st_ivas, cpe_id, data[cpe_id * CPE_CHANNELS], data[cpe_id * CPE_CHANNELS + 1], input_frame, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -250,12 +235,7 @@ ivas_error ivas_mct_enc( /* joint MCT encoding */ ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->nchan_out_woLFE + hMCT->num_lfe -#else - hMCT->nchan_out_woLFE -#endif - , + hMCT->nchan_out_woLFE, ivas_total_brate, switch_bw, ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); @@ -266,9 +246,6 @@ ivas_error ivas_mct_enc( hCPE = st_ivas->hCPE[cpe_id]; ivas_mdct_quant_coder( hCPE, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->LFE_off, -#endif hMCT->tnsBits[cpe_id], hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], 1 ); /* update input samples buffer (as done in ivas_cpe_enc() for other than MCT coding) */ @@ -324,30 +301,18 @@ ivas_error create_mct_enc( if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) { hMCT->nchan_out_woLFE = st_ivas->hEncoderConfig->nchan_inp - 1; /* LFE channel is coded separately */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->num_lfe = TRUE; -#endif } else if ( ivas_format == SBA_FORMAT ) { hMCT->nchan_out_woLFE = ivas_get_sba_num_TCs( ivas_total_brate, st_ivas->sba_analysis_order ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->num_lfe = FALSE; -#endif } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) { hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->num_lfe = FALSE; -#endif } else if ( ivas_format == SBA_FORMAT ) { hMCT->nchan_out_woLFE = ivas_sba_get_nchan( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->sba_planar ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->num_lfe = FALSE; -#endif } else { @@ -361,21 +326,11 @@ ivas_error create_mct_enc( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( hMCT->num_lfe > 0 ) && ( ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_LFE; - } -#endif } } /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ - if ( ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ) % + if ( ( hMCT->nchan_out_woLFE ) % 2 ) { st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; @@ -462,23 +417,14 @@ ivas_error mct_enc_reconfigure( if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) { hMCT->nchan_out_woLFE = st_ivas->hEncoderConfig->nchan_inp - 1; /* LFE channel is coded separately */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->num_lfe = TRUE; -#endif } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) { hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->num_lfe = FALSE; -#endif } else if ( ivas_format == SBA_FORMAT ) { hMCT->nchan_out_woLFE = st_ivas->nchan_transport; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - hMCT->num_lfe = FALSE; -#endif } else { @@ -494,21 +440,11 @@ ivas_error mct_enc_reconfigure( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( hMCT->num_lfe > 0 ) && ( ( n + cpe_id * CPE_CHANNELS ) == LFE_CHANNEL ) ) - { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->mct_chan_mode = MCT_CHAN_MODE_LFE; - } -#endif } } /* in case we have an uneven number of transport channels, indicate last channel ID as inactive */ - if ( ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ) % + if ( ( hMCT->nchan_out_woLFE ) % 2 ) { st_ivas->hCPE[st_ivas->nCPE - 1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; @@ -527,18 +463,10 @@ ivas_error mct_enc_reconfigure( st->total_brate = st_ivas->hCPE[cpe_id]->element_brate; if ( !( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) || -#endif ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) ) { st->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[cpe_id]->element_brate / FRAMES_PER_SEC ); - st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode ); if ( st->igf ) { IGFEncSetMode( st->hIGFEnc, st_ivas->hCPE[cpe_id]->element_brate, st->bwidth, st->element_mode, st->rf_mode ); @@ -741,11 +669,7 @@ static ivas_error ivas_mc_enc_reconfig( /* De-allocate McMasa-related handles */ ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); -#ifdef FIX_350_MASA_DELAY_COMP ivas_masa_enc_close( &( st_ivas->hMasa ) ); -#else - ivas_masa_enc_close( &( st_ivas->hMasa ), nchan_transport_old, MC_FORMAT ); -#endif ivas_qmetadata_close( &st_ivas->hQMetaData ); } @@ -772,11 +696,7 @@ static ivas_error ivas_mc_enc_reconfig( if ( st_ivas->hMasa != NULL ) { -#ifdef FIX_350_MASA_DELAY_COMP ivas_masa_enc_close( &( st_ivas->hMasa ) ); -#else - ivas_masa_enc_close( &( st_ivas->hMasa ), nchan_transport_old, MC_FORMAT ); -#endif st_ivas->hMasa = NULL; } @@ -886,24 +806,10 @@ static ivas_error ivas_mc_enc_reconfig( } } - st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); /* set last core to TCX20 */ st->last_core = TCX_20_CORE; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - else if ( last_mc_mode == MC_MODE_PARAMMC && st_ivas->mc_mode == MC_MODE_MCT && nchan_transport_old > 2 ) - { -#ifdef DEBUGGING - assert( st_ivas->hCPE[1] != NULL ); -#endif - st_ivas->hCPE[1]->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_LFE; - } -#endif if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { ivas_mcmasa_split_brate( st_ivas->hMcMasa->separateChannelEnabled, st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &new_brate_SCE, &new_brate_CPE ); diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index 9c0e43caa0..7ab6206a29 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -62,11 +62,7 @@ void getChannelEnergies( for ( ch = 0; ch < nchan; ch++ ) { st = sts[ch]; - if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && st->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; L_subframe = st->hTcxEnc->L_frameTCX / nSubframes; @@ -160,11 +156,7 @@ static void getCorrelationMatrix( int16_t ch1, ch2, n, nchan; float tmp; - nchan = hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ; + nchan = hMCT->nchan_out_woLFE; /* correlation */ for ( ch1 = 0; ch1 < nchan; ch1++ ) @@ -174,12 +166,7 @@ static void getCorrelationMatrix( xCorrMatrix[ch1][ch2] = 0; if ( sts[ch1]->core == sts[ch2]->core && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && - sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_LFE && - sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { int16_t nSubframes = ( sts[ch1]->core == TCX_20_CORE ? 1 : NB_DIV ); int16_t L_subframe = sts[ch1]->hTcxEnc->L_frameTCX / nSubframes; @@ -237,18 +224,10 @@ static void getBestCorrelation( *_ch2 = -1; *max_corr = 0.f; - for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE ); ch1++ ) { - for ( ch2 = ch1 + 1; ch2 < ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + for ( ch2 = ch1 + 1; ch2 < ( hMCT->nchan_out_woLFE ); ch2++ ) { if ( fabsf( *max_corr ) < fabsf( xCorrMatrix[ch1][ch2] ) ) @@ -330,27 +309,14 @@ static void updateCorrelationMatrix( int16_t ch1, ch2, n; /* correlation: */ - for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + for ( ch1 = 0; ch1 < ( hMCT->nchan_out_woLFE ); ch1++ ) { - for ( ch2 = ch1; ch2 < ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + for ( ch2 = ch1; ch2 < ( hMCT->nchan_out_woLFE ); ch2++ ) { if ( sts[ch1]->core == sts[ch2]->core && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && - sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_LFE && - sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { int16_t nSubframes = ( sts[ch1]->core == TCX_20_CORE ? 1 : NB_DIV ); @@ -377,12 +343,7 @@ static void updateCorrelationMatrix( static int16_t channelPairToIndex( const int16_t chIdx1, const int16_t chIdx2, - const int16_t nChannels -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - Encoder_State **sts /* i/o: encoder state structure */ -#endif -) + const int16_t nChannels ) { int16_t ch1, ch2; int16_t pairIdx; @@ -393,12 +354,6 @@ static int16_t channelPairToIndex( { for ( ch1 = 0; ch1 < ch2; ch1++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[ch1]->mct_chan_mode == MCT_CHAN_MODE_LFE || sts[ch2]->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - continue; - } -#endif if ( ch1 == chIdx1 && ch2 == chIdx2 ) { return pairIdx; @@ -438,11 +393,7 @@ static void getGlobalILD( /*calculate total energy without LFE*/ for ( ch = 0; ch < nchan; ch++ ) { - if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { meanE += nrg[ch]; cnt++; @@ -454,11 +405,7 @@ static void getGlobalILD( meanE = max( meanE / cnt, EPSILON ); for ( ch = 0; ch < nchan; ch++ ) { - if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { nSubframes = ( sts[ch]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; L_subframe = sts[ch]->hTcxEnc->L_frameTCX / nSubframes; @@ -531,19 +478,11 @@ void apply_MCT_enc( /*Determine active channels*/ for ( ch = 0; ch < nchan; ch++ ) { - if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { count_active_ch++; } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#else else -#endif { hMCT->mc_global_ild[ch] = 0; } @@ -564,16 +503,8 @@ void apply_MCT_enc( { for ( ch1 = 0; ch1 < ch2; ch1++ ) { - if ( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - && - sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && + sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { sumCorrDiff += fabsf( hMCT->lastxCorrMatrix[ch1][ch2] - xCorrMatrix[ch1][ch2] ); } @@ -664,12 +595,7 @@ void apply_MCT_enc( } /* calculate all related values: */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - assert( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_LFE && - sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_LFE ); -#else assert( sts[ch1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[ch2]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ); -#endif getBlockValues( sts, ch1, ch2, hMCT->hBlockData[currBlockDataCnt], mdst_spectrum, inv_spectrum, inv_mdst_spectrum ); @@ -754,11 +680,7 @@ void apply_MCT_enc( for ( ch = 0; ch < nchan; ch++ ) { - if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { if ( ( !cpEle[ch] ) || hMCT->currBlockDataCnt == 0 ) { @@ -844,9 +766,6 @@ void write_mct_bitstream( for ( ch = 0; ch < nchan; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE ) && -#endif hMCT->currBlockDataCnt && sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { push_next_indice( hBstr, hMCT->mc_global_ild[ch], SMDCT_GLOBAL_ILD_BITS ); @@ -858,9 +777,6 @@ void write_mct_bitstream( for ( ch = 0; ch < nchan; ch++ ) { if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE && -#endif sts[ch]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { push_next_indice( hBstr, hMCT->lowE_ch[ch], 1 ); @@ -874,12 +790,7 @@ void write_mct_bitstream( hBlock = hMCT->hBlockData[pair]; /*calculate channel pair index and write it to BS*/ - channelPairIndex = channelPairToIndex( hBlock->ch1, hBlock->ch2, nchan -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - sts -#endif - ); + channelPairIndex = channelPairToIndex( hBlock->ch1, hBlock->ch2, nchan ); push_next_indice( hBstr, channelPairIndex, hMCT->bitsChannelPairIndex ); /*point to encoder states of actual channels to write block pair bits*/ @@ -923,11 +834,7 @@ void mctStereoIGF_enc( int16_t singleChEle[MCT_MAX_CHANNELS]; L_subframeTCX = 0; /* to avoid compilation warning */ - set_s( singleChEle, 1, hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + set_s( singleChEle, 1, hMCT->nchan_out_woLFE ); for ( b = 0; b < hMCT->currBlockDataCnt; b++ ) { @@ -978,17 +885,9 @@ void mctStereoIGF_enc( } /* channel elements that are coded separately detected */ - if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ) ) != 0 ) + if ( sum_s( singleChEle, ( hMCT->nchan_out_woLFE ) ) != 0 ) { - for ( ch = 0; ch < ( hMCT->nchan_out_woLFE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - + hMCT->num_lfe -#endif - ); + for ( ch = 0; ch < ( hMCT->nchan_out_woLFE ); ch++ ) { if ( singleChEle[ch] ) @@ -996,9 +895,6 @@ void mctStereoIGF_enc( st = sts[ch]; if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - st->mct_chan_mode == MCT_CHAN_MODE_LFE || -#endif st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c old mode 100755 new mode 100644 index 62223d9005..b1b9389c5e --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -30,6 +30,7 @@ *******************************************************************************************************/ +#include "ivas_cnst.h" #include #include #include "options.h" @@ -38,6 +39,9 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" +#ifdef SNS_MSVQ +#include "ivas_rom_com.h" +#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -88,19 +92,12 @@ static void enc_prm_pre_mdct( { writeTCXWindowing( hBstr, st->hTcxCfg->tcx_last_overlap_mode ); } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->element_mode == IVAS_CPE_MDCT && st->mct_chan_mode != MCT_CHAN_MODE_LFE ) + push_next_indice( hBstr, st->hTcxEnc->kernel_type[0], st->last_core != ACELP_CORE ? 2 : 1 ); + if ( st->core == TCX_10_CORE ) { -#endif - push_next_indice( hBstr, st->hTcxEnc->kernel_type[0], st->last_core != ACELP_CORE ? 2 : 1 ); - if ( st->core == TCX_10_CORE ) - { - assert( ( st->hTcxEnc->kernel_type[0] & 1 ) == ( st->hTcxEnc->kernel_type[1] >> 1 ) ); - push_next_indice( hBstr, st->hTcxEnc->kernel_type[1] & 1, 1 ); - } -#ifndef ISSUE_24_CLEANUP_MCT_LFE + assert( ( st->hTcxEnc->kernel_type[0] & 1 ) == ( st->hTcxEnc->kernel_type[1] >> 1 ) ); + push_next_indice( hBstr, st->hTcxEnc->kernel_type[1] & 1, 1 ); } -#endif st->glr_reset = 0; #ifdef DEBUG_PLOT_BITS @@ -291,12 +288,7 @@ static void kernel_switch_update_transforms( int16_t i, leftOverlap = 0, rightOverlap = 0; const float *left_win, *right_win; - tcx_get_windows( hTcxCfg, (int16_t) windowedTimeSignal[0], (int16_t) windowedTimeSignal[1], &leftOverlap, &left_win, &rightOverlap, &right_win, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + tcx_get_windows( hTcxCfg, (int16_t) windowedTimeSignal[0], (int16_t) windowedTimeSignal[1], &leftOverlap, &left_win, &rightOverlap, &right_win, 1 ); if ( speech_TCX != NULL && tcxTransType != TCX_20 && (int16_t) windowedTimeSignal[0] == FULL_OVERLAP && s - leftOverlap > minWindowLen ) { for ( i = minWindowLen; i >= 0; i-- ) /* outer left folding of shortened long ALDO slope */ @@ -319,12 +311,7 @@ static void kernel_switch_update_transforms( s = hTcxCfg->tcx5SizeFB; /* obtain 1st TCX5 again */ nSubframes *= 2; - WindowSignal( hTcxCfg, leftOverlap / 2, RECTANGULAR_OVERLAP, MIN_OVERLAP, &leftOverlap, &rightOverlap, windowedTimeSignal + 2, &s, tcx5Win, 0, 1 -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - 0 -#endif - ); + WindowSignal( hTcxCfg, leftOverlap / 2, RECTANGULAR_OVERLAP, MIN_OVERLAP, &leftOverlap, &rightOverlap, windowedTimeSignal + 2, &s, tcx5Win, 0, 1 ); kernel_switch_trafo( tcx5Win, sigR, leftOverlap, s /* L_subfr. */ - ( leftOverlap + rightOverlap ) / 2, rightOverlap, kernelType ); if ( kernelType & 1 ) /* 2nd TCX5 is kernelType 3 */ @@ -589,15 +576,18 @@ void ivas_mdct_core_whitening_enc( int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : number of tns parameters put into prm */ int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to the parameter table */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t *LFE_off, /* o : flag if LFE has zero content */ -#endif - const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ - const int16_t nChannels /* i : total number of coded channels */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ + const int16_t nChannels /* i : total number of coded channels */ ) { int16_t n, ch, nSubframes, L_subframe, L_subframeTCX, tcx_subframe_coded_lines; float A_q[CPE_CHANNELS][NB_DIV][M + 1]; +#ifdef SNS_MSVQ + int16_t sns_vq_indices[CPE_CHANNELS * NB_DIV * SNS_MSVQ_NSTAGES_TCX10]; + int16_t nbits_sns; + int16_t sns_stereo_mode[NB_DIV]; + int16_t idx; +#endif int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; int16_t param_core[CPE_CHANNELS][2 * NPRM_DIV]; int16_t ltpBits[CPE_CHANNELS]; @@ -613,9 +603,12 @@ void ivas_mdct_core_whitening_enc( float scf_q[CPE_CHANNELS][NB_DIV][M]; float chE[2], chE_tot; int8_t sns_low_br_mode; - int8_t skipped_first_channel; int16_t nbits_start_sns; int16_t num_sns; + int8_t skipped_first_channel; +#ifdef SNS_MSVQ + int16_t zero_side_flag[NB_DIV]; +#endif push_wmops( "mdct_core_whitening" ); @@ -627,14 +620,7 @@ void ivas_mdct_core_whitening_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( sts[ch]->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { -#endif - stereo_tcx_init_enc( sts[ch] ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } -#endif + stereo_tcx_init_enc( sts[ch] ); set_s( tnsSize[ch], 0, 2 ); set_s( tnsBits[ch], 0, 2 ); @@ -674,14 +660,7 @@ void ivas_mdct_core_whitening_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE ) - { -#endif - SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); -#ifndef ISSUE_24_CLEANUP_MCT_LFE - } -#endif + SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); } } @@ -695,11 +674,7 @@ void ivas_mdct_core_whitening_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) -#else if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) -#endif { continue; } @@ -711,24 +686,7 @@ void ivas_mdct_core_whitening_enc( core_signal_analysis_high_bitrate( new_samples[ch] + L_INP_MEM, T_op[ch], NULL, NULL, st, mdst_spectrum[ch], tnsSize[ch], tnsBits[ch], param_core[ch], <pBits[ch], windowedSignal[ch], st->L_frame, st->hTcxEnc->L_frameTCX, hCPE->last_element_mode, 0 ); /* BWD in MDCT domain */ -#ifndef FIX_MDCT_BASED_BWD - if ( st->hTcxEnc->transform_type[0] == TCX_20 && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) - { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE ) -#else - if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) -#endif - { - bw_detect( st, NULL, st->hTcxEnc->spectrum[0], NULL ); - } - } -#else -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE && st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) -#else if ( st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) -#endif { nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; @@ -742,7 +700,6 @@ void ivas_mdct_core_whitening_enc( } } } -#endif if ( st->last_core == ACELP_CORE ) /* reset past kernel info */ { @@ -853,11 +810,7 @@ void ivas_mdct_core_whitening_enc( { TCX_ENC_HANDLE hTcxEncCh = sts[ch]->hTcxEnc; - if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) + if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) { hTcxEncCh->kernel_symmetry_past = hTcxEncCh->kernel_type[0] = 0; @@ -884,13 +837,10 @@ void ivas_mdct_core_whitening_enc( * Envelope Quantization and FDNS *---------------------------------------------------------------*/ + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { - if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) + if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) { continue; } @@ -936,9 +886,6 @@ void ivas_mdct_core_whitening_enc( /* MCT: detect whether there are silent channels and set mct_chan_mode accordingly */ if ( -#ifndef ISSUE_24_CLEANUP_MCT_LFE - st->mct_chan_mode != MCT_CHAN_MODE_LFE && -#endif mct_on ) { chE_tot = sum_f( chE, NB_DIV ); @@ -956,11 +903,7 @@ void ivas_mdct_core_whitening_enc( } /* set low br mode, if possible. Can later be discarded, depending on the stereo mode used for SNS parameter decoding */ - if ( hCPE->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[1]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) ) + if ( hCPE->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) { sns_low_br_mode = !sts[0]->sp_aud_decision0; } @@ -969,6 +912,49 @@ void ivas_mdct_core_whitening_enc( sns_low_br_mode = 0; } +#ifdef SNS_MSVQ + if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + { + nbits_sns = quantize_sns( scf, scf_q, sts, sns_vq_indices, zero_side_flag, sns_stereo_mode ); + } + else + { + if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && + sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) + { + sns_avq_cod_stereo( scf[0][0], scf[1][0], scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); + } + else + { +#ifdef DEBUG_MODE_MDCT + { + float ener_side = 0; + float ener_mid = 0; + dbgwrite( &ener_side, sizeof( float ), 1, 1, "./res/ener_side" ); + dbgwrite( &ener_mid, sizeof( float ), 1, 1, "./res/ener_mid" ); + } +#endif + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + param_lpc[ch][0] = ch; + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + continue; + } + st = sts[ch]; + + if ( st->hTcxEnc->tcxMode == TCX_20 ) + { + sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); + } + else + { + sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); + } + } + } + } +#else // else of SNS_MSVQ if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) { @@ -987,11 +973,7 @@ void ivas_mdct_core_whitening_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { param_lpc[ch][0] = ch; - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } @@ -1003,22 +985,15 @@ void ivas_mdct_core_whitening_enc( } else { -#ifdef SNS_LOW_BR_MODE sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); -#else - sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, ( hCPE->element_brate == IVAS_48k && !hCPE->hCoreCoder[0]->sp_aud_decision0 ) ); -#endif } } } +#endif // SNS_AVQ4TCX20_MSVQ4TCX10 for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } @@ -1039,6 +1014,7 @@ void ivas_mdct_core_whitening_enc( } } + /*--------------------------------------------------------------* * TNS *---------------------------------------------------------------*/ @@ -1046,11 +1022,7 @@ void ivas_mdct_core_whitening_enc( /* first deinterleave once more */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } @@ -1071,11 +1043,7 @@ void ivas_mdct_core_whitening_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[ch]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } @@ -1097,9 +1065,6 @@ void ivas_mdct_core_whitening_enc( } } } -#ifndef ISSUE_24_CLEANUP_MCT_LFE -/*check whether LFE channel is active*/ -#endif for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { /*no need to write last channel bit in case of odd channels*/ @@ -1112,15 +1077,7 @@ void ivas_mdct_core_whitening_enc( if ( mct_on ) /* signal bits should be written only for MCT*/ { -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) - { - assert( *LFE_off == 1 ); - push_next_indice( hBstr, *LFE_off, 1 ); - } - else -#endif - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { push_next_indice( hBstr, 1, 1 ); } @@ -1137,11 +1094,7 @@ void ivas_mdct_core_whitening_enc( { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { st->side_bits_frame_channel = 0; /*dummy initialization to prevent range coder crashing in case all channels are silent and bits are distributed to channel 0 */ @@ -1179,18 +1132,105 @@ void ivas_mdct_core_whitening_enc( /*--------------------------------------------------------------------------------* * SNS parameters *--------------------------------------------------------------------------------*/ +#ifdef SNS_MSVQ + if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + { + nbits_sns = 0; + idx = 0; + + if ( sts[0]->core == sts[1]->core ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + /* push all stereo mode bits first */ + for ( n = 0; n < nSubframes; ++n ) + { + push_next_indice( hBstr, sns_stereo_mode[n], 1 ); + nbits_sns++; + sts[0]->side_bits_frame_channel++; + } + + /* zero side flags only get transmitted if needed */ + for ( n = 0; n < nSubframes; ++n ) + { + if ( sns_stereo_mode[n] == SNS_STEREO_MODE_MS ) + { + push_next_indice( hBstr, zero_side_flag[n], 1 ); + nbits_sns++; + sts[0]->side_bits_frame_channel++; + } + } + } + + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + st = sts[ch]; + nbits_start_sns = hBstr->nb_bits_tot; + nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; ++n ) + { + const int16_t is_side = ch == 1 && sns_stereo_mode[n] == SNS_STEREO_MODE_MS; + const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; + int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + + if ( is_side ) + { + if ( zero_side_flag[n] ) + { + continue; + } + nStages = SNS_MSVQ_NSTAGES_SIDE; + bits = ( sts[ch]->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; + } + for ( int16_t j = 0; j < nStages; ++j, ++idx ) + { + push_next_indice( hBstr, sns_vq_indices[idx], bits[j] ); + } + } + st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; + } + } + else + { + /* write SNS parameter separately since at the decoder, both channels' cores need to be decoded before, so the joint SNS decoding can be done */ + skipped_first_channel = 0; + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st = sts[ch]; + + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + { + skipped_first_channel = 1; + continue; + } + + nbits_start_sns = hBstr->nb_bits_tot; + + num_sns = ( st->core == TCX_20_CORE ) ? 1 : 2; + + if ( ch == 0 || skipped_first_channel ) + { + push_next_indice( hBstr, param_lpc[0][0] >> 1, 1 ); + + if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) + { + /* write classifier decision to signal low br mode for SNS encoding, for all other configs, low_br mode is not possible */ + push_next_indice( hBstr, sns_low_br_mode, 1 ); + } + } + encode_lpc_avq( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode ); + + st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; + } + } +#else // else of SNS_MSVQ /* write SNS parameter separately since at the decoder, both channels' cores need to be decoded before, so the joint SNS decoding can be done */ skipped_first_channel = 0; for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { skipped_first_channel = 1; continue; @@ -1204,11 +1244,7 @@ void ivas_mdct_core_whitening_enc( { push_next_indice( hBstr, param_lpc[0][0] >> 1, 1 ); - if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) -#ifndef ISSUE_24_CLEANUP_MCT_LFE - || sts[1]->mct_chan_mode == MCT_CHAN_MODE_LFE -#endif - ) ) + if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) { /* write classifier decision to signal low br mode for SNS encoding, for all other configs, low_br mode is not possible */ push_next_indice( hBstr, sns_low_br_mode, 1 ); @@ -1219,15 +1255,13 @@ void ivas_mdct_core_whitening_enc( st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; } +#endif // MSVQ_SNS + /*update pitch buffer*/ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( *LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { continue; } @@ -1253,10 +1287,7 @@ void ivas_mdct_core_whitening_enc( *---------------------------------------------------------------*/ void ivas_mdct_quant_coder( - CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - const int16_t LFE_off, /* i : flag if LFE is inactive */ -#endif + CPE_ENC_HANDLE hCPE, /* i/o: Encoder CPE handle */ int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* i : bits needed for TNS parameters */ int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* i : size of TNS */ int16_t p_param[CPE_CHANNELS][NB_DIV], /* i : pointer to parameter array */ @@ -1302,11 +1333,7 @@ void ivas_mdct_quant_coder( st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { ignore_chan[ch] = 1; continue; @@ -1366,11 +1393,7 @@ void ivas_mdct_quant_coder( { st = sts[ch]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { /*Enable appropriate upadte of tcx_curr_overlap_mode even for uncoded channel index 1*/ L_frameTCX[ch][0] = ( st->core == TCX_10_CORE ) ? st->hTcxEnc->L_frameTCX >> 1 : st->hTcxEnc->L_frameTCX; @@ -1397,11 +1420,7 @@ void ivas_mdct_quant_coder( * Generate Bitstream *---------------------------------------------------------------*/ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( ( st->mct_chan_mode == MCT_CHAN_MODE_LFE && ( LFE_off ) ) || ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) ) -#else if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) -#endif { continue; } diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c index 9eeb4d8760..762b0aeb0f 100644 --- a/lib_enc/ivas_sns_enc.c +++ b/lib_enc/ivas_sns_enc.c @@ -38,6 +38,10 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" +#ifdef SNS_MSVQ +#include "ivas_rom_com.h" +#include "ivas_cnst.h" +#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -130,7 +134,7 @@ static int16_t sns_1st_cod( /*------------------------------------------------------------------- - * sns_1st_cod() + * sns_2st_cod() * * *-------------------------------------------------------------------*/ @@ -282,12 +286,12 @@ void sns_avq_cod( *-------------------------------------------------------------------*/ void sns_avq_cod_stereo( - const float *snsl, /* i : Input sns vector (left channel) */ - const float *snsr, /* i : Input sns vector (right channel) */ - float *snsl_q, /* o : Quantized sns vector (left channel) */ - float *snsr_q, /* o : Quantized sns vector (right channel) */ - int16_t *indexl, /* o : Quantization indices (left channel) */ - int16_t *indexr /* o : Quantization indices (right channel) */ + const float *snsl, /* i : Input sns vector (left channel) */ + const float *snsr, /* i : Input sns vector (right channel) */ + float *snsl_q, /* o : Quantized sns vector (left channel) */ + float *snsr_q, /* o : Quantized sns vector (right channel) */ + int16_t *indexl, /* o : Quantization indices (left channel) */ + int16_t *indexr /* o : Quantization indices (right channel) */ ) { int16_t i, flag_zero; @@ -377,3 +381,159 @@ void sns_avq_cod_stereo( return; } + +#ifdef SNS_MSVQ +int16_t quantize_sns( + float sns_in[CPE_CHANNELS][NB_DIV][M], + float snsQ_out[CPE_CHANNELS][NB_DIV][M], + Encoder_State **sts, + int16_t *indices, + int16_t *zero_side_flag, + int16_t *sns_stereo_mode ) +{ + int16_t nSubframes, k, ch, i; + int16_t nbits, idxIndices; + Encoder_State *st; + float weights[M]; + const float *means; + float sns_buffer[CPE_CHANNELS][NB_DIV][M]; + + nbits = 0; + idxIndices = 0; + set_f( weights, 1.0f, M ); + + /* stereo mode decision */ + sns_stereo_mode[0] = SNS_STEREO_MODE_LR; + sns_stereo_mode[1] = SNS_STEREO_MODE_LR; + zero_side_flag[0] = 0; + zero_side_flag[1] = 0; + if ( sts[0]->core == sts[1]->core ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; ++k ) + { + float *side; + float ener_side; + + side = &sns_buffer[1][k][0]; + v_sub( sns_in[0][k], sns_in[1][k], side, M ); + ener_side = dotp( side, side, M ); + + sns_stereo_mode[k] = ener_side < 12.f; + zero_side_flag[k] = ener_side < 1.f; + } + } + + /* prepare buffers depending on the chosen stereo mode */ + + /* remove means of L/R SNS parameters */ + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; + for ( k = 0; k < nSubframes; ++k ) + { + v_sub( sns_in[ch][k], means, sns_buffer[ch][k], M ); + } + } + + if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; ++k ) + { + if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) + { + convertToMS( M, sns_buffer[0][k], sns_buffer[1][k], 0.5f ); + } + } + } + + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + + for ( k = 0; k < nSubframes; ++k ) + { + const int16_t is_side = ch == 1 && sns_stereo_mode[k] == SNS_STEREO_MODE_MS; + const float *const *cdbks = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20 : ivas_sns_cdbks_tcx10; + const int16_t *levels = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_levels : ivas_sns_cdbks_tcx10_levels; + const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; + int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + float *snsQ = snsQ_out[ch][k]; + const float *sns_ptr = sns_buffer[ch][k]; + + if ( is_side ) + { + const float *const *side_cdbks = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20 : ivas_sns_cdbks_side_tcx10; + const int16_t *side_levels = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_levels : ivas_sns_cdbks_side_tcx10_levels; + + if ( zero_side_flag[k] ) + { + set_zero( snsQ, M ); + continue; + } + + nStages = SNS_MSVQ_NSTAGES_SIDE; + bits = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; + means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_side_tcx20 : ivas_sns_means_side_tcx10; + + v_sub( sns_ptr, means, snsQ, M ); +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_enc( side_cdbks, NULL, NULL, snsQ, side_levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] ); + msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL ); +#else + msvq_enc( side_cdbks, NULL, NULL, snsQ, side_levels, 3, nStages, weights, M, M, &indices[idxIndices] ); + msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], snsQ, NULL ); +#endif + v_add( snsQ, means, snsQ, M ); + } + else + { +#ifdef ERI_FDCNGVQ_LOW_ROM + msvq_enc( cdbks, NULL, NULL, sns_ptr, levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] ); + msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL ); +#else + msvq_enc( cdbks, NULL, NULL, sns_ptr, levels, 3, nStages, weights, M, M, &indices[idxIndices] ); + msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], snsQ, NULL ); +#endif + } + idxIndices += nStages; + + for ( i = 0; i < nStages; ++i ) + { + nbits += bits[i]; + } + } + } + + if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS ) + { + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; ++k ) + { + if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) + { + convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 1.f ); + } + } + } + + /* add means back */ + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + st = sts[ch]; + nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; + for ( k = 0; k < nSubframes; ++k ) + { + v_add( snsQ_out[ch][k], means, snsQ_out[ch][k], M ); + } + } + + return nbits; +} +#endif // SNS_MSVQ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 052de92fd6..2562bc0e59 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -219,22 +219,6 @@ typedef struct stereo_dft_enc_data_struct float voicing_lt; -#ifdef ITD_WINNER_GAIN_MODIFY - float noise_coherence; - int16_t local_vad; - int16_t mus_flag; - float spd_L_noise[STEREO_DFT_N_32k_ENC / 2]; /*The estimation of spectral power density of noise in the left channel*/ - float spd_R_noise[STEREO_DFT_N_32k_ENC / 2]; /*The estimation of spectral power density of noise in the right channel*/ - float spd_L_noise_min[STEREO_DFT_N_32k_ENC / 2]; - float spd_R_noise_min[STEREO_DFT_N_32k_ENC / 2]; - float spd_L_noise_max[STEREO_DFT_N_32k_ENC / 2]; - float spd_R_noise_max[STEREO_DFT_N_32k_ENC / 2]; - float winner_gain_L[STEREO_DFT_N_32k_ENC / 2]; /*The estimation of the Winner gain of the left channel*/ - float winner_gain_R[STEREO_DFT_N_32k_ENC / 2]; /*The estimation of the Winner gain of the right channel*/ - float spd_L_smooth_new[STEREO_DFT_N_32k_ENC / 2]; - float spd_R_smooth_new[STEREO_DFT_N_32k_ENC / 2]; - -#endif int16_t currentNumUpdates; int16_t expectedNumUpdates; /* Expected number of frames before use of ITD estimate */ @@ -559,11 +543,7 @@ typedef struct int16_t dtx_flag; int16_t sce_id_dtx; -#ifdef DISCRETE_ISM_DTX_CNG int16_t cnt_SID_ISM; -#else - int16_t dtx_speech_buffer_enc[PARAM_ISM_HYS_BUF_SIZE]; -#endif float long_term_energy_stereo_dmx_enc[MAX_NUM_OBJECTS][PARAM_ISM_HYS_BUF_SIZE]; float coh[MAX_NUM_OBJECTS]; @@ -740,7 +720,18 @@ typedef struct ivas_param_mc_enc_data_structure * MASA encoder structures *----------------------------------------------------------------------------------*/ -#ifdef FIX_382_MASA_META_FRAMING_ASYNC +#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT +typedef struct ivas_masa_dir_align_struct +{ + float previous_azi_dir1[MASA_FREQUENCY_BANDS]; + float previous_ele_dir1[MASA_FREQUENCY_BANDS]; + + float previous_azi_dir2[MASA_FREQUENCY_BANDS]; + float previous_ele_dir2[MASA_FREQUENCY_BANDS]; + +} MASA_DIR_ALIGN_STATE, *MASA_DIR_ALIGN_HANDLE; +#endif + /* structure storing MASA framing sync detection and compensation data */ typedef struct ivas_masa_sync_struct { @@ -748,17 +739,14 @@ typedef struct ivas_masa_sync_struct uint8_t prev_sim_stop; uint8_t prev_offset; MASA_FRAME_MODE frame_mode; + } MASA_SYNC_STATE, *MASA_SYNC_HANDLE; -#endif typedef struct ivas_masa_encoder_data_struct { float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; int16_t num_Cldfb_instances; HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MAX_NUM_ENC_CLDFB_INSTANCES]; -#ifndef FIX_350_MASA_DELAY_COMP - float *delay_buffer[MASA_MAX_TRANSPORT_CHANNELS]; -#endif int16_t band_mapping[MASA_FREQUENCY_BANDS + 1]; uint8_t twoDirBands[MASA_FREQUENCY_BANDS]; float importanceWeight[MASA_FREQUENCY_BANDS]; @@ -770,9 +758,12 @@ typedef struct ivas_masa_encoder_data_struct float onset_detector_1; float onset_detector_2; -#ifdef FIX_382_MASA_META_FRAMING_ASYNC MASA_SYNC_STATE sync_state; + +#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT + MASA_DIR_ALIGN_STATE dir_align_state; #endif + } MASA_ENCODER_DATA; typedef struct ivas_masa_encoder_struct @@ -941,14 +932,8 @@ typedef struct mct_enc_data_structure float lastxCorrMatrix[MCT_MAX_CHANNELS][MCT_MAX_CHANNELS]; int16_t lowE_ch[MCT_MAX_CHANNELS]; -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t LFE_off; -#endif uint16_t mc_global_ild[MCT_MAX_CHANNELS]; int16_t nBitsMCT; /* number of bits spent on mct side info */ -#ifndef ISSUE_24_CLEANUP_MCT_LFE - int16_t num_lfe; -#endif /* pointers to local buffers */ float *p_mdst_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS]; float *p_orig_spectrum_long[MCT_MAX_BLOCKS][CPE_CHANNELS]; @@ -1068,9 +1053,7 @@ typedef struct encoder_config_structure int16_t element_mode_init; /* element mode used at initialization */ int16_t stereo_dmx_evs; /* flag to indicate that stereo downmix for EVS encoder */ -#ifdef NCHAN_ISM_PARAMETER int16_t nchan_ism; /* number of ISM channels */ -#endif int16_t sba_order; /* Ambisonic (SBA) order */ int16_t sba_planar; /* Ambisonic (SBA) planar flag */ MC_LS_SETUP mc_input_setup; /* multichannel input ls setup */ diff --git a/lib_enc/ivas_stereo_cng_enc.c b/lib_enc/ivas_stereo_cng_enc.c index 784ec10807..2eb838bf5c 100644 --- a/lib_enc/ivas_stereo_cng_enc.c +++ b/lib_enc/ivas_stereo_cng_enc.c @@ -173,8 +173,12 @@ void stereo_dft_enc_sid_coh( int16_t alpha_level; int16_t n; +#ifdef FIX_418_SID_BITRATE + nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else /* TODO: still use old number of bits to keep bitexactness in output */ nr_of_sid_stereo_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif zeropad = 0; /* Encode coherence vector. Find best fixed predictor by minimizing prediction error on input vector. @@ -329,7 +333,9 @@ void stereo_dft_enc_sid_coh( ( *nb_bits )++; } +#ifndef FIX_418_SID_BITRATE push_next_indice( hBstr, zeropad, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); +#endif return; } diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index ab4844ab94..43546261a4 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -416,21 +416,6 @@ void stereo_dft_enc_reset( ) { int16_t i; -#ifdef ITD_WINNER_GAIN_MODIFY - hStereoDft->noise_coherence = 0.0f; - hStereoDft->local_vad = 0; - hStereoDft->mus_flag = 2; - set_zero( hStereoDft->spd_L_noise, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hStereoDft->spd_R_noise, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hStereoDft->spd_L_noise_min, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hStereoDft->spd_R_noise_min, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hStereoDft->spd_L_noise_max, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hStereoDft->spd_R_noise_max, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hStereoDft->winner_gain_L, STEREO_DFT_N_32k_ENC / 2 ); - set_zero( hStereoDft->winner_gain_R, STEREO_DFT_N_32k_ENC / 2 ); - set_f( hStereoDft->spd_L_smooth_new, 1.0f, STEREO_DFT_N_32k_ENC / 2 ); - set_f( hStereoDft->spd_R_smooth_new, 1.0f, STEREO_DFT_N_32k_ENC / 2 ); -#endif /*reset parameters*/ set_zero( hStereoDft->side_gain, STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX ); set_s( hStereoDft->side_gain_index_EC, 15, STEREO_DFT_BAND_MAX ); diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c index f52d67a47a..d2c0bc7fe1 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -82,135 +82,6 @@ #define ITD_MAX_MDCT 80 -#ifdef ITD_WINNER_GAIN_MODIFY -/*------------------------------------------------------------------------- - * stereo_dft_frame_coherence() - * Calculate the frame coherence of the stereo signal - * - *-------------------------------------------------------------------------*/ - -static void stereo_dft_frame_coherence( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, - float *xcorr, - float *Spd_L, - float *Spd_R, - float *frame_coherence ) -{ - float spd_xcorr_real, spd_xcorr_imag, spd_LR; - int16_t i, NFFT; - - NFFT = min( STEREO_DFT_N_32k_ENC, hStereoDft->NFFT ); - spd_xcorr_real = 0.0f; - spd_xcorr_imag = 0.0f; - spd_LR = 0.0f; - *frame_coherence = 0.0f; - - for ( i = 1; i < NFFT / 2; i++ ) - { - spd_xcorr_real += (float) xcorr[i * 2]; - spd_xcorr_imag += (float) xcorr[i * 2 + 1]; - spd_LR += (float) sqrt( Spd_L[i] ) * sqrt( Spd_R[i] ); - } - - *frame_coherence = (float) ( sqrt( spd_xcorr_real * spd_xcorr_real + spd_xcorr_imag * spd_xcorr_imag ) / spd_LR ); - - return; -} - - -/*------------------------------------------------------------------------- - * stereo_dft_itd_winner_gain() - * Estimate the spectral power density of noise in the stereo signal and - * calculate the winner gain for the ITD estimation - *-------------------------------------------------------------------------*/ - -static void stereo_dft_itd_winner_gain( - STEREO_DFT_ENC_DATA_HANDLE hStereoDft, - float *Spd_L, - float *Spd_R ) -{ - int16_t i; - float alpha1 = 0.05f; - float alpha2 = 0.95f; - float trackingfactor = 0.5f; - float ratio = 2.75f; - - for ( i = 0; i < STEREO_DFT_N_16k_ENC / 2; i++ ) - { - if ( hStereoDft->spd_L_noise_min[i] > Spd_L[i] ) - { - hStereoDft->spd_L_noise_min[i] = ( 1 - 0.15 ) * hStereoDft->spd_L_noise_min[i] + 0.15 * Spd_L[i]; - } - else - { - hStereoDft->spd_L_noise_min[i] = hStereoDft->spd_L_noise_min[i] + alpha1 * ( Spd_L[i] - hStereoDft->spd_L_noise_min[i] ); - } - if ( hStereoDft->spd_R_noise[i] > Spd_R[i] ) - { - hStereoDft->spd_R_noise_min[i] = ( 1 - 0.15 ) * hStereoDft->spd_R_noise_min[i] + 0.15 * Spd_R[i]; - } - else - { - hStereoDft->spd_R_noise_min[i] = hStereoDft->spd_R_noise_min[i] + alpha1 * ( Spd_R[i] - hStereoDft->spd_R_noise_min[i] ); - } - if ( hStereoDft->spd_L_noise_max[i] < Spd_L[i] ) - { - hStereoDft->spd_L_noise_max[i] = Spd_L[i]; - } - else - { - hStereoDft->spd_L_noise_max[i] = hStereoDft->spd_L_noise_max[i] + alpha2 * ( Spd_L[i] - hStereoDft->spd_L_noise_max[i] ); - } - if ( hStereoDft->spd_R_noise_max[i] < Spd_R[i] ) - { - hStereoDft->spd_R_noise_max[i] = Spd_R[i]; - } - else - { - hStereoDft->spd_R_noise_max[i] = hStereoDft->spd_R_noise_max[i] + alpha2 * ( Spd_R[i] - hStereoDft->spd_R_noise_max[i] ); - } - if ( hStereoDft->spd_L_noise_max[i] > ratio * hStereoDft->spd_L_noise_min[i] ) - { - hStereoDft->spd_L_noise[i] = hStereoDft->spd_L_noise[i]; - hStereoDft->winner_gain_L[i] = ( Spd_L[i] - hStereoDft->spd_L_noise[i] ) / Spd_L[i]; - } - else - { - hStereoDft->spd_L_noise[i] = hStereoDft->spd_L_noise[i] + trackingfactor * ( Spd_L[i] - hStereoDft->spd_L_noise[i] ); - hStereoDft->winner_gain_L[i] = ( Spd_L[i] - hStereoDft->spd_L_noise[i] ) / Spd_L[i]; - } - if ( hStereoDft->spd_R_noise_max[i] > ratio * hStereoDft->spd_R_noise_min[i] ) - { - hStereoDft->spd_R_noise[i] = hStereoDft->spd_R_noise[i]; - hStereoDft->winner_gain_R[i] = ( Spd_R[i] - hStereoDft->spd_R_noise[i] ) / Spd_R[i]; - } - else - { - hStereoDft->spd_R_noise[i] = hStereoDft->spd_R_noise[i] + trackingfactor * ( Spd_R[i] - hStereoDft->spd_R_noise[i] ); - hStereoDft->winner_gain_R[i] = ( Spd_R[i] - hStereoDft->spd_R_noise[i] ) / Spd_R[i]; - } - } - - for ( i = 0; i < STEREO_DFT_N_16k_ENC / 2; i++ ) - { - hStereoDft->winner_gain_L[i] = max( hStereoDft->winner_gain_L[i], 0.01f ); - hStereoDft->winner_gain_R[i] = max( hStereoDft->winner_gain_R[i], 0.01f ); - hStereoDft->winner_gain_L[i] = min( hStereoDft->winner_gain_L[i], 1.0f ); - hStereoDft->winner_gain_R[i] = min( hStereoDft->winner_gain_R[i], 1.0f ); - if ( hStereoDft->winner_gain_L[i] >= 0.80f ) - hStereoDft->winner_gain_L[i] = 1.0f; - else - hStereoDft->winner_gain_L[i] = 0.01f; - if ( hStereoDft->winner_gain_R[i] >= 0.80f ) - hStereoDft->winner_gain_R[i] = 1.0f; - else - hStereoDft->winner_gain_R[i] = 0.01f; - } - - return; -} -#endif - /*------------------------------------------------------------------------- * set_band_limits() * @@ -741,9 +612,6 @@ void stereo_dft_enc_compute_itd( int16_t itd, itd_td; float xcorr_itd[STEREO_DFT_N_32k_ENC]; float tmpf1, tmpf2, tmpf3; -#ifdef ITD_WINNER_GAIN_MODIFY - float frame_coherence, tmpf4; -#endif float thres, alpha; int16_t index; float xcorr_max, sum_nrg_L_lb, par_L[XCORR_LB_NUM_BANDS], par_L_avrg, sum_nrg_L_tmp; @@ -984,32 +852,6 @@ void stereo_dft_enc_compute_itd( xcorr[0] = sign( hItd->xcorr_smooth[0] ); xcorr[1] = sign( hItd->xcorr_smooth[1] ); -#ifdef ITD_WINNER_GAIN_MODIFY - if ( hStereoDft->mus_flag == 0 ) - { - stereo_dft_frame_coherence( hStereoDft, xcorr, Spd_L, Spd_R, &frame_coherence ); - if ( hStereoDft->local_vad == 0 ) - { - hStereoDft->noise_coherence = 0.9f * hStereoDft->noise_coherence + ( 1.0 - 0.9f ) * frame_coherence; - } - else - { - hStereoDft->noise_coherence = hStereoDft->noise_coherence; - } - stereo_dft_itd_winner_gain( hStereoDft, Spd_L, Spd_R ); - - if ( hStereoDft->noise_coherence > 0.25f ) - { - for ( i = 1; i < NFFT / 2; i++ ) - { - xcorr[2 * i] = ( hStereoDft->winner_gain_L[i] * hStereoDft->winner_gain_R[i] ) * xcorr[2 * i]; - xcorr[2 * i + 1] = ( hStereoDft->winner_gain_L[i] * hStereoDft->winner_gain_R[i] ) * xcorr[2 * i + 1]; - Spd_L[i] = hStereoDft->winner_gain_L[i] * Spd_L[i]; - Spd_R[i] = hStereoDft->winner_gain_R[i] * Spd_R[i]; - } - } - } -#endif if ( hCPE->element_mode == IVAS_CPE_DFT && ( hItd->td_itd[k_offset] - hItd->td_itd[k_offset - 1] ) ) { @@ -1032,23 +874,6 @@ void stereo_dft_enc_compute_itd( } tmpf3 = 2.f; -#ifdef ITD_WINNER_GAIN_MODIFY - if ( hStereoDft->mus_flag == 0 ) - { - alpha = -0.8f; - } - else - { - if ( flag_noisy_speech_snr ) - { - alpha = -0.8f; - } - else - { - alpha = -1.0f; - } - } -#else if ( flag_noisy_speech_snr ) { alpha = -0.8f; @@ -1057,7 +882,6 @@ void stereo_dft_enc_compute_itd( { alpha = -1.0f; } -#endif if ( hCPE->hCoreCoder[0]->Opt_DTX_ON && hCPE->element_mode == IVAS_CPE_DFT ) { @@ -1140,42 +964,9 @@ void stereo_dft_enc_compute_itd( tmpf1 += EPSILON; tmpf2 = tmpf1; tmpf1 = powf( tmpf1, alpha ); -#ifdef ITD_WINNER_GAIN_MODIFY - if ( hStereoDft->mus_flag == 0 ) - { - tmpf4 = 1.0f; - /* Calculate smoothed spectral power density for the L/R channel */ - hStereoDft->spd_L_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_L_smooth_new[i] + sfm_L * Spd_L[i]; - hStereoDft->spd_R_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_R_smooth_new[i] + sfm_L * Spd_R[i]; - /* Calculate cross spectral power density using the smoothed spectral power density*/ - tmpf4 = (float) sqrt( hStereoDft->spd_L_smooth_new[i] ) * sqrt( hStereoDft->spd_R_smooth_new[i] ); - /* Calculate the value of weighted function for each frequency bin */ - tmpf4 += EPSILON; - if ( hStereoDft->noise_coherence > 0.25f ) - { - tmpf4 = tmpf1 * pow( tmpf2, 2.0f ) * pow( tmpf4, -2.0f ); - tmpf3 += tmpf2 * tmpf1; - tmpf3 -= tmpf2 * tmpf4; - } - else - { - tmpf4 = tmpf2 * pow( tmpf4, -2.0f ); - } - /* Calculate the value of weighted generlized cross-correlation function for each frequency bin */ - xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf4; - xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf4; - } - else - { - tmpf3 += tmpf2 * tmpf1; - xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; - xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; - } -#else tmpf3 += tmpf2 * tmpf1; xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; -#endif /* Low pass filter L/R power spectrum */ /* Calculate coherence as cross spectral density divided by L*R power spectrum */ @@ -1193,42 +984,9 @@ void stereo_dft_enc_compute_itd( tmpf1 += EPSILON; tmpf2 = tmpf1; tmpf1 = powf( tmpf1, alpha ); -#ifdef ITD_WINNER_GAIN_MODIFY - if ( hStereoDft->mus_flag == 0 ) - { - tmpf4 = 1.0f; - /* Calculate smoothed spectral power density for the L/R channel */ - hStereoDft->spd_L_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_L_smooth_new[i] + sfm_L * Spd_L[i]; - hStereoDft->spd_R_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_R_smooth_new[i] + sfm_L * Spd_R[i]; - /* Calculate cross spectral power density using the smoothed spectral power density*/ - tmpf4 = (float) sqrt( hStereoDft->spd_L_smooth_new[i] ) * sqrt( hStereoDft->spd_R_smooth_new[i] ); - /* Calculate the value of weighted function for each frequency bin */ - tmpf4 += EPSILON; - if ( hStereoDft->noise_coherence > 0.25f ) - { - tmpf4 = tmpf1 * pow( tmpf2, 2.0f ) * pow( tmpf4, -2.0f ); - tmpf3 += tmpf2 * tmpf1; - tmpf3 -= tmpf2 * tmpf4; - } - else - { - tmpf4 = tmpf2 * pow( tmpf4, -2.0f ); - } - /* Calculate the value of weighted generlized cross-correlation function for each frequency bin */ - xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf4; - xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf4; - } - else - { - tmpf3 += tmpf2 * tmpf1; - xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; - xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; - } -#else tmpf3 += tmpf2 * tmpf1; xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; -#endif } } } @@ -1242,70 +1000,16 @@ void stereo_dft_enc_compute_itd( tmpf1 += EPSILON; tmpf2 = tmpf1; tmpf1 = powf( tmpf1, alpha ); -#ifdef ITD_WINNER_GAIN_MODIFY - if ( hStereoDft->mus_flag == 0 ) - { - tmpf4 = 1.0f; - /* Calculate smoothed spectral power density for the L/R channel */ - hStereoDft->spd_L_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_L_smooth_new[i] + sfm_L * Spd_L[i]; - hStereoDft->spd_R_smooth_new[i] = ( 1.f - sfm_L ) * hStereoDft->spd_R_smooth_new[i] + sfm_L * Spd_R[i]; - /* Calculate cross spectral power density using the smoothed spectral power density*/ - tmpf4 = (float) sqrt( hStereoDft->spd_L_smooth_new[i] ) * sqrt( hStereoDft->spd_R_smooth_new[i] ); - /* Calculate the value of weighted function for each frequency bin */ - tmpf4 += EPSILON; - if ( hStereoDft->noise_coherence > 0.25f ) - { - tmpf4 = tmpf1 * pow( tmpf2, 2.0f ) * pow( tmpf4, -2.0f ); - tmpf3 += tmpf2 * tmpf1; - tmpf3 -= tmpf2 * tmpf4; - } - else - { - tmpf4 = tmpf2 * pow( tmpf4, -2.0f ); - } - /* Calculate the value of weighted generlized cross-correlation function for each frequency bin */ - xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf4; - xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf4; - } - else - { - tmpf3 += tmpf2 * tmpf1; - xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; - xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; - } -#else tmpf3 += tmpf2 * tmpf1; xcorr[2 * i] = hItd->xcorr_smooth[2 * i] * tmpf1; xcorr[2 * i + 1] = hItd->xcorr_smooth[2 * i + 1] * tmpf1; -#endif - } - } -#ifdef ITD_WINNER_GAIN_MODIFY - if ( hStereoDft->mus_flag == 0 ) - { - if ( hStereoDft->noise_coherence > 0.25f ) - { - tmpf1 = (float) ( NFFT / 2 + 1 ) / tmpf3; - for ( i = 0; i < NFFT; i++ ) - { - xcorr[i] *= tmpf1; - } - } - else - { - for ( i = NFFT / 2; i < NFFT; i++ ) - { - xcorr[i] = 0.0f; - } } } -#else tmpf1 = (float) ( NFFT / 2 + 1 ) / tmpf3; for ( i = 0; i < NFFT; i++ ) { xcorr[i] *= tmpf1; } -#endif /*calculate mean E ratio of main to background signal for cohSNR*/ if ( hCPE->element_mode == IVAS_CPE_DFT ) { diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index fa9b108f00..2e739cc906 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -236,9 +236,6 @@ void stereo_mdct_core_enc( ivas_mdct_core_whitening_enc( hCPE, new_samples, old_wsp, pitch_buf, p_mdst_spectrum_long, tnsBits, p_orig_spectrum_long, tnsSize, p_param, hBstr, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - NULL, -#endif 0, CPE_CHANNELS ); for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -454,9 +451,6 @@ void stereo_mdct_core_enc( #endif ivas_mdct_quant_coder( hCPE, -#ifndef ISSUE_24_CLEANUP_MCT_LFE - 0, -#endif tnsBits, tnsSize, p_param, 0 ); pop_wmops(); diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index 0e6fe1496b..fca3c7785e 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -526,12 +526,7 @@ ivas_error stereo_memory_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hIGFEnc\n" ) ); } - st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->total_brate, st->bwidth, st->rf_mode ); /* allocate and initialize MDCT stereo structure */ if ( ( hCPE->hStereoMdct = (STEREO_MDCT_ENC_DATA_HANDLE) malloc( sizeof( STEREO_MDCT_ENC_DATA ) ) ) == NULL ) diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index 3bda423fad..e334f4d029 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -99,20 +99,10 @@ void stereo_tcx_init_enc( st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_mode ); st->hTcxCfg->resq = getResq( st->bits_frame_nominal * FRAMES_PER_SEC ); st->hTcxEnc->tcx_lpc_shaped_ari = getTcxLpcShapedAri( st->bits_frame_nominal * FRAMES_PER_SEC, st->rf_mode, st->element_mode ); - st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->igf = getIgfPresent( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->rf_mode ); if ( st->element_mode != EVS_MONO ) { - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - st->mct_chan_mode -#endif - ); + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( st->bits_frame_nominal * FRAMES_PER_SEC, st->igf, st->element_mode ); } st->core_brate = st->total_brate; diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index d9bd9d688f..f9deb214e6 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -61,9 +61,7 @@ struct IVAS_ENC bool ismMetadataProvided[MAX_NUM_OBJECTS]; bool maxBandwidthUser; /* Was a specific max bandwith selected by the user? */ IVAS_ENC_BANDWIDTH newBandwidthApi; /* maximum encoded bandwidth, as set on API level */ -#ifdef FIX_379_EXT_METADATA - bool extMetadataApi; /* External metadata requested, to be checked against current bit rate */ -#endif + bool extMetadataApi; /* External metadata requested, to be checked against current bit rate */ }; /*---------------------------------------------------------------------* @@ -78,11 +76,7 @@ static int16_t getInputBufferSize( const Encoder_Struct *st_ivas ); static ivas_error doCommonConfigureChecks( IVAS_ENC_HANDLE hIvasEnc ); static ivas_error doCommonSetterChecks( IVAS_ENC_HANDLE hIvasEnc ); static ivas_error sanitizeBandwidth( const IVAS_ENC_HANDLE hIvasEnc ); -#ifdef FIX_379_EXT_METADATA static ivas_error sanitizeBitrateISM( const ENCODER_CONFIG_HANDLE hEncoderConfig, const IVAS_ENC_HANDLE hIvasEnc ); -#else -static ivas_error sanitizeBitrateISM( const ENCODER_CONFIG_HANDLE hEncoderConfig ); -#endif static void init_encoder_config( ENCODER_CONFIG_HANDLE hEncoderConfig ); static void resetIsmMetadataProvidedFlags( IVAS_ENC_HANDLE hIvasEnc ); static ivas_error bandwidthApiToInternal( const IVAS_ENC_BANDWIDTH maxBandwidth, int16_t *internalMaxBandwidth ); @@ -394,13 +388,9 @@ ivas_error IVAS_ENC_ConfigureForObjects( st_ivas->hEncoderConfig->ivas_format = ISM_FORMAT; st_ivas->hEncoderConfig->element_mode_init = IVAS_SCE; st_ivas->hEncoderConfig->nchan_inp = numObjects; -#ifdef NCHAN_ISM_PARAMETER st_ivas->hEncoderConfig->nchan_ism = numObjects; -#endif st_ivas->hEncoderConfig->ism_extended_metadata_flag = ism_extended_metadata; -#ifdef FIX_379_EXT_METADATA hIvasEnc->extMetadataApi = ( ism_extended_metadata == 1 ); -#endif hIvasEnc->maxBandwidthUser = max_bwidth_user; error = configureEncoder( hIvasEnc, inputFs, bitrate, maxBandwidth, dtxConfig, IVAS_ENC_GetDefaultChannelAwareConfig() ); @@ -791,11 +781,7 @@ static ivas_error configureEncoder( } else if ( hEncoderConfig->ivas_format == ISM_FORMAT ) { -#ifdef FIX_379_EXT_METADATA if ( ( error = sanitizeBitrateISM( hEncoderConfig, hIvasEnc ) ) != IVAS_ERR_OK ) -#else - if ( ( error = sanitizeBitrateISM( hEncoderConfig ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -893,15 +879,10 @@ static ivas_error configureEncoder( } if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && - ( -#ifndef DISCRETE_ISM_DTX_CNG - ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp == 2 ) || // ToDo: see Issue 113 - ( hEncoderConfig->ivas_format == ISM_FORMAT && hEncoderConfig->nchan_inp > 2 && hEncoderConfig->ivas_total_brate != IVAS_24k4 && hEncoderConfig->ivas_total_brate != IVAS_32k ) || // ParamISM -#endif - ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation - ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done - hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD - ) ) + ( ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation + ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done + hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD + ) ) { return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); } @@ -932,12 +913,6 @@ static ivas_error configureEncoder( return error; } -#ifndef DISCRETE_ISM_DTX_CNG - if ( hEncoderConfig->Opt_DTX_ON && ( hEncoderConfig->ivas_format == ISM_FORMAT ) && !( st_ivas->ism_mode == ISM_MODE_DISC && hEncoderConfig->nchan_inp == 1 ) && !( st_ivas->ism_mode == ISM_MODE_PARAM && ( hEncoderConfig->nchan_inp == 3 || hEncoderConfig->nchan_inp == 4 ) ) ) - { - return IVAS_ERROR( IVAS_ERR_UNKNOWN, "DTX is not supported in this IVAS format and element mode." ); - } -#endif if ( hEncoderConfig->ivas_format == MONO_FORMAT ) { @@ -1751,11 +1726,7 @@ static ivas_error setBitrate( if ( hEncoderConfig->ivas_format == ISM_FORMAT ) { -#ifdef FIX_379_EXT_METADATA if ( ( error = sanitizeBitrateISM( hEncoderConfig, hIvasEnc ) ) != IVAS_ERR_OK ) -#else - if ( ( error = sanitizeBitrateISM( hEncoderConfig ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1994,12 +1965,8 @@ static ivas_error sanitizeBandwidth( *---------------------------------------------------------------------*/ static ivas_error sanitizeBitrateISM( -#ifdef FIX_379_EXT_METADATA const ENCODER_CONFIG_HANDLE hEncoderConfig, const IVAS_ENC_HANDLE hIvasEnc ) -#else - const ENCODER_CONFIG_HANDLE hEncoderConfig ) -#endif { if ( hEncoderConfig->ivas_total_brate > IVAS_128k && hEncoderConfig->nchan_inp == 1 ) { @@ -2031,7 +1998,6 @@ static ivas_error sanitizeBitrateISM( return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for 4 ISM specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); } -#ifdef FIX_379_EXT_METADATA if ( hIvasEnc->extMetadataApi ) { hEncoderConfig->ism_extended_metadata_flag = ( hEncoderConfig->ivas_total_brate >= ISM_EXTENDED_METADATA_BRATE ); @@ -2040,12 +2006,6 @@ static ivas_error sanitizeBitrateISM( { hEncoderConfig->ism_extended_metadata_flag = 0; } -#else - if ( hEncoderConfig->ivas_total_brate < ISM_EXTENDED_METADATA_BRATE && hEncoderConfig->ism_extended_metadata_flag == 1 ) - { - return IVAS_ERROR( IVAS_ERR_INVALID_BITRATE, "Too low bitrate for extended metadata format specified in IVAS: %d", hEncoderConfig->ivas_total_brate ); - } -#endif return IVAS_ERR_OK; } @@ -2302,9 +2262,7 @@ static void init_encoder_config( hEncoderConfig->var_SID_rate_flag = 1; hEncoderConfig->mc_input_setup = MC_LS_SETUP_INVALID; hEncoderConfig->stereo_dmx_evs = 0; -#ifdef NCHAN_ISM_PARAMETER hEncoderConfig->nchan_ism = 0; -#endif hEncoderConfig->sba_order = 0; hEncoderConfig->sba_planar = 0; hEncoderConfig->ism_extended_metadata_flag = 0; diff --git a/lib_enc/lsf_enc.c b/lib_enc/lsf_enc.c index 052bfbe96e..62e93912ed 100644 --- a/lib_enc/lsf_enc.c +++ b/lib_enc/lsf_enc.c @@ -185,8 +185,7 @@ void lsf_enc( *-------------------------------------------------------------------------------------*/ #ifdef LSF_RE_USE_SECONDARY_CHANNEL - lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw, - tdm_lsfQ_PCh ); + lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw, tdm_lsfQ_PCh ); #else lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw ); #endif @@ -734,7 +733,6 @@ void lsf_end_enc( /* AR inter-frame prediction */ lsf_allocate( nBits - 1, mode_lvq, mode_lvq_p, &dummy, &stages1, dummy_v, levels1, dummy_v, bits1 ); - Err[1] = vq_lvq_lsf_enc( 2, mode_lvq_p, Tmp, levels1, stages1, wghts, Idx1, lsf, pred2, resq, lsfq ); if ( Err[0] * ( st->streaklimit ) < PREFERSFNET * Err[1] ) @@ -751,6 +749,7 @@ void lsf_end_enc( } } #endif + /*--------------------------------------------------------------------------* * Write indices to array *--------------------------------------------------------------------------*/ @@ -758,11 +757,13 @@ void lsf_end_enc( if ( st->codec_mode == MODE1 && st->core == ACELP_CORE ) { /* write coder_type bit for VOICED@16kHz or GENERIC@16kHz */ - if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k #ifdef LSF_RE_USE_SECONDARY_CHANNEL - && ( st->idchan == 0 ) -#endif + if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->idchan == 0 + ) +#else + if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k ) +#endif { /* VOICED =2 and GENERIC=3, so "coder_type-2" means VOICED =0 and GENERIC=1*/ push_indice( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, coder_type - 2, 1 ); diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c index a620dfac38..190f4e2a74 100644 --- a/lib_enc/lsf_msvq_ma_enc.c +++ b/lib_enc/lsf_msvq_ma_enc.c @@ -48,12 +48,18 @@ #define kMaxC 8 + +#ifdef ERI_FDCNGVQ_LOW_ROM + +#include "ivas_prot.h" +void dctT2_N_apply_matrix( const float *input, float *output, const int16_t dct_dim, int16_t fdcngvq_dim, const float *idctT2_24_X_matrixQ16, const int16_t matrix_1st_dim, DCTTYPE dcttype ); +#endif + /*--------------------------------------------------------------------------* * msvq_enc() * * MSVQ encoder *--------------------------------------------------------------------------*/ - void msvq_enc( const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ @@ -66,7 +72,11 @@ void msvq_enc( const float w[], /* i : Weights */ const int16_t N, /* i : Vector dimension */ const int16_t maxN, /* i : Codebook dimension */ - int16_t Idx[] /* o : Indices */ +#ifdef ERI_FDCNGVQ_LOW_ROM + const int16_t applyDCT_flag, /* i : applyDCT flag */ + float *invTrfMatrix, /*i/o : synthesis matrix */ +#endif + int16_t Idx[] /* o : Indices */ ) { float *resid[2], *dist[2]; @@ -78,8 +88,46 @@ void msvq_enc( int16_t idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; int16_t n, maxn, start; + +#ifdef ERI_FDCNGVQ_LOW_ROM + /* buffers */ + float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; + float u_mr[FDCNG_VQ_MAX_LEN]; + float u_mr_scaled[FDCNG_VQ_MAX_LEN]; + float mse_trunc_all_segms; + float mse_trunc_segm[FDCNG_VQ_DCT_NSEGM]; + float mse; + + const Word8 *cbpW8; + const Word16 *dct_col_shift_tab; + + float *st1_mse_pair; + int16_t *st1_idx_pair; + int16_t indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; /* after stage#1 DCT search this is copied to the global indices[1][s*stages] structure */ + int16_t n_ana, p_mins[2], idx_min[2]; + DCTTYPE dcttype = DCT_T2_24_XX; + float tmp2; + + int16_t check_ind[FDCNG_VQ_DCT_NPOST]; + int16_t segm, j_full, maxC_pre; + float *st1_syn_vec_ptr; /* 8* 24 floats in dynRAM */ + float *st1_mse_ptr; /* 2^¨7 == 128 floats in existing dRAM used for stage 1 candidate analysis, 128 Word32 in BASOP */ + float res24, high_diff[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; + + maxC_pre = ( FDCNG_VQ_DCT_NSEGM * 2 ); + assert( maxC <= LSFMBEST_MAX ); + assert( ( LSFMBEST_MAX * M_MAX ) > ( N * maxC ) ); + /* top of resid_buf is resid[1] and used for stage#1 residuals (input target u), + we here reuse resid[0] part of the buffer for stage#1 DCT dynamic RAM needs + */ + st1_mse_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - ( levels[0] ); /* reuse top of residual resid[0] scratch RAM for stage1 MSEs */ + st1_syn_vec_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; /* reuse top of resid[0] scratch RAM for residual */ + + dcttype = DCT_T2_24_XX; +#endif + /*----------------------------------------------------------------* - * Allocate memory for previous (parent) and current nodes. + * Allocate memory for previous (parent) and current nodes. * Parent node is indexed [0], current node is indexed [1]. *----------------------------------------------------------------*/ @@ -159,7 +207,173 @@ void msvq_enc( { dist[1][j] = FLT_MAX; } - if ( !s ) /* means: m==1 */ + +#ifdef ERI_FDCNGVQ_LOW_ROM + if ( !s && applyDCT_flag != 0 ) /* means: m==1 */ + { /* stage 1 search in truncated dct domain without any weights */ + + n_ana = FDCNG_VQ_MAX_LEN; /* VQ stage#1 core is always using stored DCT24 coeffs */ + /*remove mean/mid fdcng stage#1 vector, in original subband domain */ + v_sub( u, cdk1r_tr_midQ_truncQ, u_mr, n_ana ); + + v_multc( u_mr, fdcng_dct_invScaleF[1], u_mr_scaled, n_ana ); /*scale up target to upscaled W8x storage domain */ + /* 16.0-->scale up from Q0 to search domain in Q4, not really needed in BASOP , impl. by shifts */ + + assert( n_ana >= FDCNG_VQ_DCT_MAXTRUNC ); /* check for WB , SWB, FB operation */ + + dctT2_N_apply_matrix( (const float *) u_mr_scaled, dct_target, min( FDCNG_VQ_DCT_MAXTRUNC, n_ana ), n_ana, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, dcttype ); + + mse_trunc_all_segms = 0; + mse = 0; + + /* init search state ptr's at the top */ + for ( segm = 0; segm < FDCNG_VQ_DCT_NSEGM; segm++ ) + { + /* point to a new paired location */ + st1_mse_pair = &( dist[1][2 * segm] ); /* req. ptr init +=2 */ + st1_mse_pair[0] = FLT_MAX; /* req */ + st1_mse_pair[1] = FLT_MAX; /* req */ + st1_idx_pair = &( indices_st1_local[2 * segm] ); /* +=2 */ + p_max = 0; /* req. to point to 1 or 0 */ + + /* compute segment common trunction error in dct domain */ + mse_trunc_segm[segm] = mse_trunc_all_segms; + mse_trunc_segm[segm] += sum2_f( (const float *) ( &( dct_target[cdk1_ivas_cols_per_segment[segm]] ) ), cdk1_ivas_trunc_dct_cols_per_segment[segm] ); + + cbpW8 = cdk_37bits_ivas_stage1_W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage*/ + + for ( j = 0; j < cdk1_ivas_entries_per_segment[segm]; j++ ) + { + /* unweighted segmented search DCT domain loop */ + j_full = j + cdk1_ivas_cum_entries_per_segment[segm]; /* or simply use j_full++ */ + + mse = mse_trunc_segm[segm]; /* move32() init mse with with common mse truncation part */ + + dct_col_shift_tab = stage1_dct_col_syn_shift[segm]; /* ptr init */ + + for ( c2 = 0; c2 < cdk1_ivas_cols_per_segment[segm]; c2++ ) + { + +#define WMC_TOOL_SKIP + tmp = dct_target[c2] - (float) ( ( (Word16) cbpW8[c2] ) << dct_col_shift_tab[c2] ); /* Word8 storage MSE inner loop */ + LOGIC( 1 ); + SHIFT( 1 ); + ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ +#undef WMC_TOOL_SKIP + + mse += tmp * tmp; /* L_mac or L_mac0() square Word16 -> Word32*/ + } + st1_mse_ptr[j_full] = mse; /* save MSE in shared dynamic 2^7=128 RAM, move32() in BASOP */ + +#define WMC_TOOL_SKIP + cbpW8 += cdk1_ivas_cols_per_segment[segm]; /* pointer increment */ +#undef WMC_TOOL_SKIP + /* overwrite with a new worst index at p_max */ + +#ifdef ERI_FDCNGVQ_LOW_ROM + /* The three inner loop if's below are not really properly instrumented by WMC tool */ + /* a ptr to worst index will be in use */ +#endif + if ( mse < st1_mse_pair[p_max] ) /* L_sub */ + { + st1_idx_pair[p_max] = j_full; /* simplified */ + } /* BASOP 2 ops */ + + if ( st1_idx_pair[p_max] == j_full ) /* simplified */ + { /*idx updated to j_full --> also update mse */ + st1_mse_pair[p_max] = mse; /* move32(), single BASOP */ + } /* BASOP 3 ops */ + /* avoid WC costly list management by always updating p_max, as we have only a pair to maintain */ + p_max = 0; /* move16() */ + if ( ( st1_mse_pair[0] - st1_mse_pair[1] ) < 0 ) /* L_sub()*/ + { + p_max = 1; /* move16() */ + } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ + + /* Note: logical shift right not available in ANSI-C */ + /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ + /* in java logical shift right is available as >>> , in BASOP it is L_lshr */ + + /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ + } /* j in section */ + + } /* next segment */ + + for ( j = 0; j < maxC_pre; j++ ) + { + /* compute_full mse using stored DCT24 domain MSE's */ + /* calculate MSE from stage1 inner using existing inner DCT domain variables */ + dist[1][j] *= fdcng_dct_scaleF[2]; /* single multiplication to get the MSE scale to the correct input domain */ + } + + p_max = maximum( dist[1], maxC_pre, NULL ); /* establish current worst candidate for stage#2 among all maxC_pre candidates */ + + p_mins[0] = minimum( dist[1], maxC_pre, NULL ); /* find best entry among all maxC_pre */ + tmp = dist[1][p_mins[0]]; + dist[1][p_mins[0]] = FLT_MAX; /* exclude 1st */ + + p_mins[1] = minimum( dist[1], maxC_pre, NULL ); /* find 2nd best entry */ + tmp2 = dist[1][p_mins[1]]; + dist[1][p_mins[1]] = FLT_MAX; /* exclude 2nd*/ + + dist[1][p_mins[0]] = tmp; /* restore 1st */ + dist[1][p_mins[1]] = tmp2; /* restore 2nd */ + + idx_min[0] = indices_st1_local[p_mins[0]]; + idx_min[1] = indices_st1_local[p_mins[1]]; + + + /* use global exclusion list to never reselect the two (best) mse values sofar */ + st1_mse_ptr[idx_min[0]] = FLT_MAX; /* move32() */ + st1_mse_ptr[idx_min[1]] = FLT_MAX; /* move32() */ + + /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ + /* using both 1st and 2nd best neighbours in fwd and rev directions */ + check_ind[0] = cdk1_ivas_segm_neighbour_fwd[idx_min[0]]; + check_ind[1] = cdk1_ivas_segm_neighbour_rev[idx_min[0]]; + + check_ind[2] = cdk1_ivas_segm_neighbour_fwd[idx_min[1]]; + check_ind[3] = cdk1_ivas_segm_neighbour_rev[idx_min[1]]; + + check_ind[4] = cdk1_ivas_segm_neighbour_fwd[check_ind[0]]; + check_ind[5] = cdk1_ivas_segm_neighbour_rev[check_ind[1]]; + + check_ind[6] = cdk1_ivas_segm_neighbour_fwd[check_ind[2]]; + check_ind[7] = cdk1_ivas_segm_neighbour_rev[check_ind[3]]; + + for ( i = 0; i < FDCNG_VQ_DCT_NPOST; i++ ) + { + float check_mse = st1_mse_ptr[check_ind[i]] * fdcng_dct_scaleF[2]; + /* *= fdcng_dct_scaleF[2]; */ /* multiplication in use to get the float outer loop scale correct */ + + if ( check_mse < dist[1][p_max] ) + { + /* new winner , replace */ + dist[1][p_max] = check_mse; + indices_st1_local[p_max] = check_ind[i]; + st1_mse_ptr[check_ind[i]] = FLT_MAX; /* BASOP: move32() */ + p_max = maximum( dist[1], maxC_pre, NULL ); /* establish a new current worst candidate among all maxC */ + } + } + + for ( c = 0; c < maxC_pre; c++ ) + { + indices[1][c * stages] = indices_st1_local[c]; /* move established stage#1 indices to global MSVQ list structure */ + } + + /* extract the selected stage one vectors in DCT domain , apply IDCT_N and scale up */ + /*always extract full length signal(24) to be able to update WB( N==21) candidate MSE values */ + for ( c = 0; c < maxC_pre; c++ ) + { + dec_FDCNG_MSVQ_stage1( indices_st1_local[c], FDCNG_VQ_MAX_LEN, invTrfMatrix, dcttype + 1, &( st1_syn_vec_ptr[c * FDCNG_VQ_MAX_LEN] ), NULL ); + } + + assert( maxC == maxC_pre ); + } + else + /* non-DCT Stage #1 code below */ +#endif + if ( !s ) /* means: m==1 */ { /* This loop is identical to the one below, except, that the inner loop over c=0..m is hardcoded to c=0, since m=1. */ @@ -202,9 +416,16 @@ void msvq_enc( } } /* if (tmp <= dist[1][p_max]) */ } /* for (j=0; jinput, NULL, enerBuffer -#ifdef FIX_MDCT_BASED_BWD - , - 0 -#endif - ); + bw_detect( st, st->input, NULL, enerBuffer, + 0 ); /*----------------------------------------------------------------* * Noise energy down-ward update and total noise energy estimation @@ -621,12 +617,7 @@ void pre_proc( st->gamma = GAMMA16k; } - st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - MCT_CHAN_MODE_REGULAR -#endif - ); + st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode ); } st->coder_type = st->coder_type_raw; diff --git a/lib_enc/qlpc_stoch.c b/lib_enc/qlpc_stoch.c index 8defb07034..b7103bc169 100644 --- a/lib_enc/qlpc_stoch.c +++ b/lib_enc/qlpc_stoch.c @@ -103,7 +103,6 @@ void lpc_quantization( /****** Low-rate LPC quantizer *******/ else if ( st->lpcQuantization == 1 ) { - lsp2lsf( lsp, lsf, M, st->sr_core ); force_sf = 0; @@ -122,23 +121,21 @@ void lpc_quantization( if ( st->sr_core == INT_FS_16k && coder_type == UNVOICED ) { - lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, GENERIC, force_sf, param_lpc, no_param_lpc, bits_param_lpc, GENERIC #ifdef LSF_RE_USE_SECONDARY_CHANNEL - , - NULL + lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, GENERIC, force_sf, param_lpc, no_param_lpc, bits_param_lpc, GENERIC, NULL ); +#else + lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, GENERIC, force_sf, param_lpc, no_param_lpc, bits_param_lpc, GENERIC ); #endif - ); nb_indices = *no_param_lpc; } else { - lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, coder_type, force_sf, param_lpc, no_param_lpc, bits_param_lpc, coder_type #ifdef LSF_RE_USE_SECONDARY_CHANNEL - , - NULL + lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, coder_type, force_sf, param_lpc, no_param_lpc, bits_param_lpc, coder_type, NULL ); +#else + lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, coder_type, force_sf, param_lpc, no_param_lpc, bits_param_lpc, coder_type ); #endif - ); nb_indices = *no_param_lpc; } diff --git a/lib_enc/transient_detection.c b/lib_enc/transient_detection.c index 83f9e2e7a0..1f8b36819f 100644 --- a/lib_enc/transient_detection.c +++ b/lib_enc/transient_detection.c @@ -324,89 +324,74 @@ void SetTCXModeInfo( hTcxEnc->tcxMode = NO_TCX; } } -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode == MCT_CHAN_MODE_LFE ) + /* set the left window overlap */ + if ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) + { + st->hTcxCfg->tcx_last_overlap_mode = TRANSITION_OVERLAP; + } + else if ( ( hTcxEnc->tcxMode == TCX_10 ) && ( st->hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ) ) + { + st->hTcxCfg->tcx_last_overlap_mode = FULL_OVERLAP; + } + else { - hTcxEnc->tcxMode = TCX_20; - *tcxModeOverlap = FULL_OVERLAP; st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; } -#endif -#ifndef ISSUE_24_CLEANUP_MCT_LFE - if ( st->mct_chan_mode != MCT_CHAN_MODE_LFE ) + + /* determine the right window overlap */ + if ( hTcxEnc->tcxMode == TCX_10 ) { -#endif - /* set the left window overlap */ - if ( st->last_core == ACELP_CORE || st->last_core == AMR_WB_CORE ) + if ( hTranDet->transientDetector.attackIndex < 0 ) { - st->hTcxCfg->tcx_last_overlap_mode = TRANSITION_OVERLAP; - } - else if ( ( hTcxEnc->tcxMode == TCX_10 ) && ( st->hTcxCfg->tcx_curr_overlap_mode == ALDO_WINDOW ) ) - { - st->hTcxCfg->tcx_last_overlap_mode = FULL_OVERLAP; + *tcxModeOverlap = HALF_OVERLAP; } else { - st->hTcxCfg->tcx_last_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; - } - - /* determine the right window overlap */ - if ( hTcxEnc->tcxMode == TCX_10 ) - { - if ( hTranDet->transientDetector.attackIndex < 0 ) - { - *tcxModeOverlap = HALF_OVERLAP; - } - else + *tcxModeOverlap = hTranDet->transientDetector.attackIndex % 4; + if ( *tcxModeOverlap == 1 ) { - *tcxModeOverlap = hTranDet->transientDetector.attackIndex % 4; - if ( *tcxModeOverlap == 1 ) - { - *tcxModeOverlap = FULL_OVERLAP; - } - } - if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT ) - { - if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) ) - { - *tcxModeOverlap = HALF_OVERLAP; - } + *tcxModeOverlap = FULL_OVERLAP; } } - else if ( hTcxEnc->tcxMode == TCX_20 ) + if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT ) { - if ( hTranDet->transientDetector.attackIndex == 7 ) + if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) ) { *tcxModeOverlap = HALF_OVERLAP; } - else if ( hTranDet->transientDetector.attackIndex == 6 ) - { - *tcxModeOverlap = MIN_OVERLAP; - } - else - { - *tcxModeOverlap = ALDO_WINDOW; - } - if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT ) - { - if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) ) - { - *tcxModeOverlap = HALF_OVERLAP; - } - } + } + } + else if ( hTcxEnc->tcxMode == TCX_20 ) + { + if ( hTranDet->transientDetector.attackIndex == 7 ) + { + *tcxModeOverlap = HALF_OVERLAP; + } + else if ( hTranDet->transientDetector.attackIndex == 6 ) + { + *tcxModeOverlap = MIN_OVERLAP; } else { - /* NO_TCX */ - *tcxModeOverlap = TRANSITION_OVERLAP; - if ( st->element_mode == IVAS_CPE_MDCT ) + *tcxModeOverlap = ALDO_WINDOW; + } + if ( isLongTermTransient( 1.0f / GetTCXAvgTemporalFlatnessMeasure( hTranDet, NSUBBLOCKS, 0 ), &hTcxEnc->tfm_mem ) && st->element_mode == IVAS_CPE_MDCT ) + { + if ( ( *tcxModeOverlap != MIN_OVERLAP ) && ( hTcxEnc->tcxltp_norm_corr_past < 0.5625f ) ) { - hTcxEnc->tfm_mem = 0.75f; + *tcxModeOverlap = HALF_OVERLAP; } } -#ifndef ISSUE_24_CLEANUP_MCT_LFE } -#endif + else + { + /* NO_TCX */ + *tcxModeOverlap = TRANSITION_OVERLAP; + if ( st->element_mode == IVAS_CPE_MDCT ) + { + hTcxEnc->tfm_mem = 0.75f; + } + } /* for the ACELP -> TCX transition frames use full right window overlap */ if ( ( st->hTcxCfg->tcx_last_overlap_mode == TRANSITION_OVERLAP ) && ( *tcxModeOverlap == ALDO_WINDOW ) ) diff --git a/lib_enc/transition_enc.c b/lib_enc/transition_enc.c index ce13d7fa36..1ba6c37852 100644 --- a/lib_enc/transition_enc.c +++ b/lib_enc/transition_enc.c @@ -178,7 +178,11 @@ void transition_enc( if ( *tc_subfr == TC_0_0 ) { /* this is called only to compute unused bits */ +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, L_FRAME, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#else config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, L_FRAME, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#endif } *clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, TRANSITION, xn, gp_cl ); @@ -274,7 +278,11 @@ void transition_enc( if ( i_subfr - *tc_subfr <= L_SUBFR ) { +#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE + config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#else config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); +#endif } /*-----------------------------------------------------------------* diff --git a/lib_enc/updt_enc.c b/lib_enc/updt_enc.c index b194de06d5..6b8c595f5e 100644 --- a/lib_enc/updt_enc.c +++ b/lib_enc/updt_enc.c @@ -408,12 +408,7 @@ void updt_enc_common( st->gamma = GAMMA16k; } - st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode -#ifndef ISSUE_24_CLEANUP_MCT_LFE - , - MCT_CHAN_MODE_REGULAR -#endif - ); + st->igf = getIgfPresent( EVS_MONO, st->total_brate, st->bwidth, st->rf_mode ); } /* update FER clas */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 09704b969e..35819cf8cb 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -40,9 +40,7 @@ #include "ivas_cnst.h" #include "ivas_rom_binauralRenderer.h" #include "ivas_rom_rend.h" -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS #include "ivas_rom_com.h" -#endif #ifdef DEBUGGING #include "debug.h" @@ -58,19 +56,13 @@ #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) #define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS_OPT /* powf(0.95f, 4.0f) for sub-frame smoothing instead of CLDFB slot */ #define ADAPT_HTPROTO_IIR_FAC 0.81450625f -#else -#define ADAPT_HTPROTO_IIR_FAC 0.95f -#endif #define ADAPT_HTPROTO_ILD_LIM_DB0 1.0f #define ADAPT_HTPROTO_ILD_LIM_DB1 4.0f #define ADAPT_HTPROTO_ROT_LIM_0 0.4f #define ADAPT_HTPROTO_ROT_LIM_1 0.8f -#endif /*------------------------------------------------------------------------- * Local function prototypes @@ -86,9 +78,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struc static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInputChannels, const uint8_t firstSlot, const uint8_t slotEnd ); -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); -#endif static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); @@ -102,9 +92,7 @@ static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Ai static void matrixTransp2Mul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); -#ifdef NOKIA_PARAMBIN_REQULARIZATION static float configure_reqularization_factor( const IVAS_FORMAT ivas_format, const int32_t ivas_brate ); -#endif /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() @@ -293,9 +281,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( ivas_td_decorr_dec_close( &( hBinaural->hTdDecorr ) ); } -#ifdef NOKIA_PARAMBIN_REQULARIZATION hBinaural->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); -#endif st_ivas->hDiracDecBin = hBinaural; @@ -576,9 +562,7 @@ static void ivas_dirac_dec_binaural_internal( if ( nchan_transport == 2 ) { -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSlot, slotEnd, nBins, Rmat ); -#endif ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, firstSlot, slotEnd, nBins, Rmat ); } @@ -1097,19 +1081,11 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( CrEneR = 0.0f; /* Formulate main processing matrix M */ -#ifdef NOKIA_PARAMBIN_REQULARIZATION formulate2x2MixingMatrix( h->ChEne[0][bin], h->ChEne[1][bin], h->ChCrossRe[bin], h->ChCrossIm[bin], h->ChEneOut[0][bin], h->ChEneOut[1][bin], h->ChCrossReOut[bin], h->ChCrossImOut[bin], prototypeMtx, Mre, Mim, h->reqularizationFactor ); -#else - formulate2x2MixingMatrix( h->ChEne[0][bin], h->ChEne[1][bin], - h->ChCrossRe[bin], h->ChCrossIm[bin], - h->ChEneOut[0][bin], h->ChEneOut[1][bin], - h->ChCrossReOut[bin], h->ChCrossImOut[bin], - prototypeMtx, Mre, Mim, 1.0f ); -#endif /* Load estimated covariance matrix to the [2][2] matrix form */ CxRe[0][0] = h->ChEne[0][bin]; @@ -1358,7 +1334,6 @@ static void ivas_dirac_dec_binaural_process_output( } -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], @@ -1369,14 +1344,9 @@ static void adaptTransportSignalsHeadtracked( float Rmat[3][3] ) { int16_t slot, ch, bin, louderCh; -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS_OPT float ILD, mono_factor_ILD, mono_factor_rotation, mono_factor, y_val, ene_proc, ene_target; uint8_t n_slots_per_sf, sf_idx, n_sf; int16_t max_band; -#else - float re[2], im[2], ILD, mono_factor_ILD, mono_factor_rotation, mono_factor, y_val; - float proc_re[2], proc_im[2], sum_re, sum_im, ene_proc, ene_target, mf; -#endif /* Determine head-orientation-based mono factor. Rmat[1][1] entry informs how close the ears are aligned according to transport signals. */ @@ -1385,7 +1355,6 @@ static void adaptTransportSignalsHeadtracked( mono_factor_rotation = fmaxf( 0.0f, fminf( 1.0f, mono_factor_rotation ) ); /* Adapt transport signals in frequency bands */ -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS_OPT /* optimization grouping CLDFB bins into MASA bands (they are readily available in ROM and suitable for the task) AND group CLDFB slots into sub-frames */ n_slots_per_sf = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; n_sf = ( slotEnd - firstSlot ) / n_slots_per_sf; @@ -1488,66 +1457,9 @@ static void adaptTransportSignalsHeadtracked( } } } -#else - /* original contribution */ - for ( slot = firstSlot; slot < slotEnd; slot++ ) - { - float eqVal[60]; - - for ( bin = 0; bin < nBins; bin++ ) - { - /* Determine channel energies */ - for ( ch = 0; ch < 2; ch++ ) - { - re[ch] = inRe[ch][slot][bin]; - im[ch] = inIm[ch][slot][bin]; - - hHeadTrackData->chEneIIR[ch][bin] *= ADAPT_HTPROTO_IIR_FAC; - hHeadTrackData->chEneIIR[ch][bin] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ( ( re[ch] * re[ch] ) + ( im[ch] * im[ch] ) ); - } - - /* Determine ILD */ - ILD = fabsf( 10.0f * log10f( fmaxf( 1e-12f, hHeadTrackData->chEneIIR[0][bin] ) / fmaxf( 1e-12f, hHeadTrackData->chEneIIR[1][bin] ) ) ); - louderCh = ( hHeadTrackData->chEneIIR[1][bin] > hHeadTrackData->chEneIIR[0][bin] ); - - /* Determine ILD-based mono factor */ - mono_factor_ILD = ( ILD - ADAPT_HTPROTO_ILD_LIM_DB0 ) / ( ADAPT_HTPROTO_ILD_LIM_DB1 - ADAPT_HTPROTO_ILD_LIM_DB0 ); - mono_factor_ILD = fmaxf( 0.0f, fminf( 1.0f, mono_factor_ILD ) ); - - /* Combine mono factors */ - mono_factor = mono_factor_ILD * mono_factor_rotation; - - /* Mix original audio and sum signal according to determined mono factor */ - sum_re = re[0] + re[1]; - sum_im = im[0] + im[1]; - for ( ch = 0; ch < 2; ch++ ) - { - mf = ( ch == louderCh ) ? 0.0f : mono_factor; - - proc_re[ch] = mf * sum_re + ( 1.0f - mf ) * re[ch]; - proc_im[ch] = mf * sum_im + ( 1.0f - mf ) * im[ch]; - - hHeadTrackData->procChEneIIR[ch][bin] *= ADAPT_HTPROTO_IIR_FAC; - hHeadTrackData->procChEneIIR[ch][bin] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ( ( proc_re[ch] * proc_re[ch] ) + ( proc_im[ch] * proc_im[ch] ) ); - } - - /* Equalize */ - ene_target = hHeadTrackData->chEneIIR[0][bin] + hHeadTrackData->chEneIIR[1][bin]; - ene_proc = hHeadTrackData->procChEneIIR[0][bin] + hHeadTrackData->procChEneIIR[1][bin]; - eqVal[bin] = fminf( 4.0f, sqrtf( ene_target / fmaxf( 1e-12f, ene_proc ) ) ); - - for ( ch = 0; ch < 2; ch++ ) - { - inRe[ch][slot][bin] = proc_re[ch] * eqVal[bin]; - inIm[ch][slot][bin] = proc_im[ch] * eqVal[bin]; - } - } - } -#endif return; } -#endif static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( @@ -2089,7 +2001,6 @@ static void hrtfShGetHrtf( } -#ifdef NOKIA_PARAMBIN_REQULARIZATION /*------------------------------------------------------------------------- * configure_reqularization_factor() * @@ -2165,4 +2076,3 @@ static float configure_reqularization_factor( return reqularizationFactor; } -#endif diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index ed36fa26b1..0618534448 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -258,7 +258,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_POSITION *Pos, /* i : Listener position data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ const int16_t output_frame /* i : output frame length */ ) @@ -462,7 +462,7 @@ void TDREND_Update_listener_orientation( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ const int16_t headRotEnabled, /* i : Headrotation flag */ const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ - const IVAS_POSITION *Pos /* i : Listener Position */ + const IVAS_VECTOR3 *Pos /* i : Listener Position */ ) { float FrontVec[3]; diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index 91b018b148..97d0b68fb8 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -69,13 +69,21 @@ ivas_error TDREND_REND_RenderSourceHRFilt( { float LeftOutputFrame[L_SPATIAL_SUBFR_48k]; float RightOutputFrame[L_SPATIAL_SUBFR_48k]; +#ifndef FIX_379_GAININTP float Gain; Gain = ( *Src_p->SrcRend_p->DirGain_p ) * ( *Src_p->SrcRend_p->DistGain_p ); +#endif TDREND_Apply_ITD( Src_p->InputFrame_p, LeftOutputFrame, RightOutputFrame, &Src_p->previtd, Src_p->itd, Src_p->mem_itd, subframe_length ); +#ifdef FIX_379_GAININTP + TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain ); + TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain ); + Src_p->prevGain = Src_p->Gain; +#else TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Gain ); TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Gain ); +#endif /* Copy to accumulative output frame */ v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length ); diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index 98f45a5dd9..af3231df61 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -236,7 +236,12 @@ void TDREND_firfilt( float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ const int16_t filterlength, /* i : Filter length */ - const float Gain /* i : Gain */ +#ifdef FIX_379_GAININTP + const float Gain, /* i : Gain */ + const float prevGain /* i : Previous gain */ +#else + const float Gain /* i : Gain */ +#endif ) { float buffer[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; @@ -245,6 +250,13 @@ void TDREND_firfilt( float *p_filter; float tmp; int16_t i, j; +#ifdef FIX_379_GAININTP + float step, gain_tmp, gain_delta; + + gain_delta = ( Gain - prevGain ); + step = gain_delta / ( subframe_length ); + gain_tmp = prevGain; +#endif /* Handle memory */ p_signal = buffer + filterlength - 1; @@ -262,7 +274,13 @@ void TDREND_firfilt( { tmp += ( *p_filter++ ) * ( *p_tmp-- ); } +#ifdef FIX_379_GAININTP + /* Apply linear gain interpolation in case of abrupt gain changes */ + gain_tmp = gain_tmp + step; + signal[i] = tmp * gain_tmp; +#else signal[i] = tmp * Gain; +#endif if ( i < intp_count ) { diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index b14db0b7c2..91253748b2 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -460,11 +460,7 @@ static void TDREND_SRC_SPATIAL_Init( SrcSpatial_p->DistAttenEnabled = FALSE; SrcSpatial_p->DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; SrcSpatial_p->DistAtten.RefDist = 1.0f; -#ifdef FIX_379_EXT_METADATA SrcSpatial_p->DistAtten.MaxDist = 15.75f; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ -#else - SrcSpatial_p->DistAtten.MaxDist = 10.0f; -#endif SrcSpatial_p->DistAtten.RollOffFactor = 1.0f; return; @@ -691,7 +687,9 @@ void TDREND_SRC_Init( Src_p->hrf_right_prev[0] = 1; Src_p->azim_prev = 0.0f; Src_p->elev_prev = 0.0f; - +#ifdef FIX_379_GAININTP + Src_p->prevGain = 1.0f; +#endif return; } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 938e8de02c..7713dbe1a3 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -221,7 +221,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_POSITION *Pos, /* i : Listener position data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ const int16_t output_frame /* i : output frame length */ ); @@ -273,7 +273,7 @@ void TDREND_Update_listener_orientation( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD Renderer handle */ const int16_t headRotEnabled, /* i : Headrotation flag */ const IVAS_QUATERNION *headPosition, /* i : Listener orientation */ - const IVAS_POSITION *Pos /* i : Listener Position */ + const IVAS_VECTOR3 *Pos /* i : Listener Position */ ); void TDREND_Update_object_positions( @@ -462,7 +462,12 @@ void TDREND_firfilt( float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ const int16_t filterlength, /* i : Filter length */ +#ifdef FIX_379_GAININTP + const float Gain, /* i : Gain */ + const float prevGain /* i : Previous gain */ +#else const float Gain /* i : Gain */ +#endif ); diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index d31d1bd1a6..65a7c60ed9 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1895,7 +1895,6 @@ ivas_error ivas_binaural_reverb_open( } -#ifdef FIX_103_RA_PARAMS_PARAM_BIN_REND if ( ( roomAcoustics ) && ( roomAcoustics->override ) ) { ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, output_config, roomAcoustics->use_brir, sampling_rate, t60, ene ); @@ -1915,28 +1914,6 @@ ivas_error ivas_binaural_reverb_open( ivas_binaural_reverb_setPreDelay( hReverb, 10 ); } } -#else - if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - if ( !roomAcoustics->override ) - { - ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, hHrtfFastConv->fastconvReverberationTimes, hHrtfFastConv->fastconvReverberationEneCorrections ); - ivas_binaural_reverb_setPreDelay( hReverb, 10 ); - } - else - { - ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, output_config, roomAcoustics->use_brir, sampling_rate, t60, ene ); - ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, t60, ene ); - ivas_binaural_reverb_setPreDelay( hReverb, (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ) ); - } - } - else - { - ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, hHrtfParambin->parametricReverberationTimes, hHrtfParambin->parametricReverberationEneCorrections ); - ivas_binaural_reverb_setPreDelay( hReverb, 10 ); - } - -#endif return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 58536df19f..ddfdcb6763 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -85,19 +85,10 @@ ivas_error ivas_headTrack_open( ( *hHeadTrackData )->Rmat_prev[i][i] = 1.0f; } -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS_OPT set_zero( ( *hHeadTrackData )->chEneIIR[0], MASA_FREQUENCY_BANDS ); set_zero( ( *hHeadTrackData )->chEneIIR[1], MASA_FREQUENCY_BANDS ); set_zero( ( *hHeadTrackData )->procChEneIIR[0], MASA_FREQUENCY_BANDS ); set_zero( ( *hHeadTrackData )->procChEneIIR[1], MASA_FREQUENCY_BANDS ); -#else - set_zero( ( *hHeadTrackData )->chEneIIR[0], CLDFB_NO_CHANNELS_MAX ); - set_zero( ( *hHeadTrackData )->chEneIIR[1], CLDFB_NO_CHANNELS_MAX ); - set_zero( ( *hHeadTrackData )->procChEneIIR[0], CLDFB_NO_CHANNELS_MAX ); - set_zero( ( *hHeadTrackData )->procChEneIIR[1], CLDFB_NO_CHANNELS_MAX ); -#endif -#endif return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index e7ff9eb0ba..a3308e23c2 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -140,9 +140,7 @@ typedef struct ivas_dirac_dec_binaural_data_structure uint16_t useSubframeMode; /* 0 = process in 20 ms frames, 1 = process in 5 ms subframes */ uint16_t useTdDecorr; ivas_td_decorr_state_t *hTdDecorr; -#ifdef NOKIA_PARAMBIN_REQULARIZATION float reqularizationFactor; -#endif } DIRAC_DEC_BIN_DATA, *DIRAC_DEC_BIN_HANDLE; @@ -250,7 +248,7 @@ typedef struct { int8_t headRotEnabled; IVAS_QUATERNION headPositions[RENDERER_HEAD_POSITIONS_PER_FRAME]; - IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME]; + IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME]; float crossfade[L_FRAME48k / RENDERER_HEAD_POSITIONS_PER_FRAME]; ivas_orient_trk_state_t *hOrientationTracker; @@ -260,7 +258,7 @@ typedef struct ivas_binaural_head_track_struct { int16_t num_quaternions; IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; - IVAS_POSITION Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; + IVAS_VECTOR3 Pos[MAX_PARAM_SPATIAL_SUBFRAMES]; float Rmat[3][3]; float Rmat_prev[3][3]; @@ -268,15 +266,8 @@ typedef struct ivas_binaural_head_track_struct uint8_t lrSwitchedCurrent; float lrSwitchInterpVal; -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS -#ifdef NOKIA_ADAPTIVE_BINAURAL_PROTOS_OPT float chEneIIR[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ float procChEneIIR[2][MASA_FREQUENCY_BANDS]; -#else - float chEneIIR[2][CLDFB_NO_CHANNELS_MAX]; - float procChEneIIR[2][CLDFB_NO_CHANNELS_MAX]; -#endif -#endif int16_t shd_rot_max_order; ivas_orient_trk_state_t *OrientationTracker; @@ -613,6 +604,9 @@ typedef struct float mem_hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; float mem_hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; float Gain; +#ifdef FIX_379_GAININTP + float prevGain; +#endif } TDREND_SRC_t; /* Top level TD binaural renderer handle */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 3d2420632d..7744a6582b 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2222,9 +2222,7 @@ static ivas_error initMasaDummyDecForMcOut( { return error; } -#ifdef FIX_390_EXT_REND_MASA_META_COPY decDummy->hDirAC->dirac_bs_md_write_idx = 0; -#endif if ( decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC ) { @@ -2301,9 +2299,7 @@ static ivas_error initMasaDummyDecForSbaOut( { return error; } -#ifdef FIX_390_EXT_REND_MASA_META_COPY decDummy->hDirAC->dirac_bs_md_write_idx = 0; -#endif numCldfbAnalyses = decDummy->nchan_transport; numCldfbSyntheses = decDummy->hDecoderConfig->nchan_out; @@ -2372,9 +2368,7 @@ static ivas_error initMasaDummyDecForBinauralOut( { return error; } -#ifdef FIX_390_EXT_REND_MASA_META_COPY decDummy->hDirAC->dirac_bs_md_write_idx = 0; -#endif if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &decDummy->hHrtfParambin ) ) != IVAS_ERR_OK ) { @@ -3657,20 +3651,14 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( *-------------------------------------------------------------------*/ ivas_error IVAS_REND_InitConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -#ifdef FIX_392_LATE_REVERB + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */ -#else - const bool rendererConfigEnabled /* i : flag indicating if a renderer configuration file was supplied */ -#endif ) { ivas_error error; -#ifdef FIX_392_LATE_REVERB bool rendererConfigEnabled; rendererConfigEnabled = ( getAudioConfigType( outAudioConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ); -#endif if ( rendererConfigEnabled ) { @@ -3687,11 +3675,7 @@ ivas_error IVAS_REND_InitConfig( { return error; } -#ifdef FIX_392_LATE_REVERB if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, hIvasRend->rendererConfigEnabled ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -3807,7 +3791,7 @@ int16_t IVAS_REND_FeedRenderConfig( ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */ - const IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ + const IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ ) { int16_t i; @@ -5308,61 +5292,38 @@ static void copyMasaMetadataToDiracRenderer( DIRAC_DEC_HANDLE hDirAC ) { int16_t band, sf, bin; -#ifdef FIX_390_EXT_REND_MASA_META_COPY int16_t meta_write_index; -#endif hDirAC->numSimultaneousDirections = meta->descriptive_meta.numberOfDirections + 1; for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { -#ifdef FIX_390_EXT_REND_MASA_META_COPY meta_write_index = ( hDirAC->dirac_bs_md_write_idx + sf ) % hDirAC->dirac_md_buffer_length; -#endif for ( band = 0; band < MASA_MAXIMUM_CODING_SUBBANDS; band++ ) { for ( bin = MASA_band_grouping_24[band]; bin < MASA_band_grouping_24[band + 1]; bin++ ) { -#ifdef FIX_390_EXT_REND_MASA_META_COPY hDirAC->azimuth[meta_write_index][bin] = (int16_t) meta->directional_meta[0].azimuth[sf][band]; hDirAC->elevation[meta_write_index][bin] = (int16_t) meta->directional_meta[0].elevation[sf][band]; hDirAC->energy_ratio1[meta_write_index][bin] = meta->directional_meta[0].energy_ratio[sf][band]; hDirAC->diffuseness_vector[meta_write_index][bin] = 1.0f - meta->directional_meta[0].energy_ratio[sf][band]; hDirAC->spreadCoherence[meta_write_index][bin] = meta->directional_meta[0].spread_coherence[sf][band]; hDirAC->surroundingCoherence[meta_write_index][bin] = meta->common_meta.surround_coherence[sf][band]; -#else - hDirAC->azimuth[sf][bin] = (int16_t) meta->directional_meta[0].azimuth[sf][band]; - hDirAC->elevation[sf][bin] = (int16_t) meta->directional_meta[0].elevation[sf][band]; - hDirAC->energy_ratio1[sf][bin] = meta->directional_meta[0].energy_ratio[sf][band]; - hDirAC->diffuseness_vector[sf][bin] = 1.0f - meta->directional_meta[0].energy_ratio[sf][band]; - hDirAC->spreadCoherence[sf][bin] = meta->directional_meta[0].spread_coherence[sf][band]; - hDirAC->surroundingCoherence[sf][bin] = meta->common_meta.surround_coherence[sf][band]; -#endif if ( hDirAC->numSimultaneousDirections == 2 ) { -#ifdef FIX_390_EXT_REND_MASA_META_COPY hDirAC->azimuth2[meta_write_index][bin] = (int16_t) meta->directional_meta[1].azimuth[sf][band]; hDirAC->elevation2[meta_write_index][bin] = (int16_t) meta->directional_meta[1].elevation[sf][band]; hDirAC->energy_ratio2[meta_write_index][bin] = meta->directional_meta[1].energy_ratio[sf][band]; hDirAC->diffuseness_vector[meta_write_index][bin] -= meta->directional_meta[1].energy_ratio[sf][band]; hDirAC->spreadCoherence2[meta_write_index][bin] = meta->directional_meta[1].spread_coherence[sf][band]; -#else - hDirAC->azimuth2[sf][bin] = (int16_t) meta->directional_meta[1].azimuth[sf][band]; - hDirAC->elevation2[sf][bin] = (int16_t) meta->directional_meta[1].elevation[sf][band]; - hDirAC->energy_ratio2[sf][bin] = meta->directional_meta[1].energy_ratio[sf][band]; - hDirAC->diffuseness_vector[sf][bin] -= meta->directional_meta[1].energy_ratio[sf][band]; - hDirAC->spreadCoherence2[sf][bin] = meta->directional_meta[1].spread_coherence[sf][band]; -#endif } } } } -#ifdef FIX_390_EXT_REND_MASA_META_COPY hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length; -#endif return; } diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index ec4c05a6d6..1e9d41fd38 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -229,11 +229,7 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( ivas_error IVAS_REND_InitConfig( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -#ifdef FIX_392_LATE_REVERB const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */ -#else - const bool rendererConfigEnabled /* i : flag indicating if a renderer configuration file was supplied */ -#endif ); int16_t IVAS_REND_GetRenderConfig( @@ -249,7 +245,7 @@ int16_t IVAS_REND_FeedRenderConfig( ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */ - const IVAS_POSITION Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ + const IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ ); ivas_error IVAS_REND_SetOrientationTrackingMode( diff --git a/lib_util/head_rotation_file_reader.c b/lib_util/head_rotation_file_reader.c index 02f14be924..0283c29233 100644 --- a/lib_util/head_rotation_file_reader.c +++ b/lib_util/head_rotation_file_reader.c @@ -94,7 +94,7 @@ ivas_error HeadRotationFileReader_open( ivas_error HeadRotationFileReading( HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_POSITION *pPos /* o : listener position */ + IVAS_VECTOR3 *pPos /* o : listener position */ ) { float w, x, y, z; diff --git a/lib_util/head_rotation_file_reader.h b/lib_util/head_rotation_file_reader.h index 4794aeba45..52b97ae1c3 100644 --- a/lib_util/head_rotation_file_reader.h +++ b/lib_util/head_rotation_file_reader.h @@ -60,7 +60,7 @@ ivas_error HeadRotationFileReader_open( ivas_error HeadRotationFileReading( HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_POSITION *pPos /* o : listener position */ + IVAS_VECTOR3 *pPos /* o : listener position */ ); /*-----------------------------------------------------------------------* diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index 0aeca6d6a0..fa449512e4 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -135,21 +135,12 @@ ivas_error IsmFileReader_readNextFrame( meta_prm[i++] = (float) atof( char_ptr ); } -#ifdef FIX_379_EXT_METADATA /* Verify the number of metadata values. */ if ( i < NUM_MIN_ISM_METADATA || char_ptr != NULL ) { /* Invalid number of metadata parameters (2-7 supported) */ return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; } -#else - /* Check if minimum number of metadata values were read. Additional values are ignored. */ - if ( i < NUM_MIN_ISM_METADATA ) - { - /* Not enough values provided in one line */ - return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; - } -#endif ismMetadata->azimuth = meta_prm[0]; @@ -171,11 +162,7 @@ ivas_error IsmFileReader_readNextFrame( return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } -#ifdef FIX_379_EXT_METADATA if ( ismMetadata->radius < 0 ) /* Negative radius not supported. Max quantized radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ -#else - if ( ismMetadata->radius < 0 ) // Ivas_fmToDo: to be reviewed -#endif { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; } diff --git a/lib_util/masa_file_writer.c b/lib_util/masa_file_writer.c index 5667968ece..e7f3aca0b6 100644 --- a/lib_util/masa_file_writer.c +++ b/lib_util/masa_file_writer.c @@ -32,15 +32,12 @@ #include "masa_file_writer.h" #include "ivas_stat_com.h" -#ifdef FIX_350_MASA_DELAY_COMP #include "ivas_stat_dec.h" -#endif #include "ivas_cnst.h" #include #include #include -#ifdef FIX_350_MASA_DELAY_COMP typedef struct masaMetaDelayStorage { MASA_DECRIPTIVE_META descriptiveMeta; @@ -51,24 +48,18 @@ typedef struct masaMetaDelayStorage uint8_t diffuseToTotalRatio[DELAY_MASA_PARAM_DEC_SFR][MASA_FREQUENCY_BANDS]; } MASA_META_DELAY_STORAGE; -#endif struct MasaFileWriter { FILE *file; char *file_path; -#ifdef FIX_350_MASA_DELAY_COMP MASA_META_DELAY_STORAGE *delayStorage; -#endif }; /*-----------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------*/ -#ifndef FIX_350_MASA_DELAY_COMP -#define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ -#endif /*-----------------------------------------------------------------------* * Local functions @@ -93,7 +84,6 @@ static void getExtMasaMetadataFileName( return; } -#ifdef FIX_350_MASA_DELAY_COMP static void delayMasaMetadata( MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o : New input metadata which is inplace replaced with delayed metadata frame */ MASA_META_DELAY_STORAGE *delayStorage /* i/o : Storage for 10 ms of metadata and related descriptive metadata */ @@ -150,7 +140,6 @@ static void delayMasaMetadata( return; } -#endif /*---------------------------------------------------------------------* * MasaFileWriter_open() @@ -159,11 +148,9 @@ static void delayMasaMetadata( *---------------------------------------------------------------------*/ ivas_error MasaFileWriter_open( - const char *outputWavFilename, /* i : name of the output audio file */ -#ifdef FIX_350_MASA_DELAY_COMP + const char *outputWavFilename, /* i : name of the output audio file */ const bool delayCompensationEnabled, /* i : is delay compensation enabled */ -#endif - MasaFileWriter **masaWriter /* o : MasaFileWriter handle */ + MasaFileWriter **masaWriter /* o : MasaFileWriter handle */ ) { MasaFileWriter *self; @@ -189,12 +176,10 @@ ivas_error MasaFileWriter_open( self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); strcpy( self->file_path, filePath ); -#ifdef FIX_350_MASA_DELAY_COMP if ( !delayCompensationEnabled ) { self->delayStorage = calloc( sizeof( MASA_META_DELAY_STORAGE ), 1 ); } -#endif *masaWriter = self; @@ -209,12 +194,8 @@ ivas_error MasaFileWriter_open( *---------------------------------------------------------------------*/ ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ -#ifdef FIX_350_MASA_DELAY_COMP + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ -#else - IVAS_MASA_QMETADATA_HANDLE hMasaQMetadata /* i/o: MASA qMetadata handle to be written */ -#endif ) { if ( self == NULL ) @@ -222,29 +203,10 @@ ivas_error MasaFileWriter_writeFrame( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef FIX_350_MASA_DELAY_COMP uint16_t descMetaTemp = 0; int16_t i, sf, dir, numDirections; uint8_t writeTempOther[MASA_FREQUENCY_BANDS]; -#else - const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ - uint16_t descMetaTemp = 0; - int16_t i, sf, b_old, b_new, dir; - uint16_t writeTempIndex[MASA_FREQUENCY_BANDS]; - uint8_t writeTempOther[MASA_FREQUENCY_BANDS]; - MASA_DECRIPTIVE_META descMeta; - int16_t *bandMap; - uint8_t numCodingBands; - uint8_t numDirections; - int16_t nchan_transport; - - numDirections = (uint8_t) hMasaQMetadata->no_directions; - numCodingBands = hMasaQMetadata->numCodingBands; - bandMap = hMasaQMetadata->bandMap; - nchan_transport = hMasaQMetadata->nchan_transport; -#endif - -#ifdef FIX_350_MASA_DELAY_COMP + /* If delay storage has been reserved, then we are in the normal mode for the decoder * (i.e., no delay compensation for PCM) which means that metadata should be delayed * by two subframes (10 ms). Descriptive metadata is a combined result. */ @@ -280,47 +242,6 @@ ivas_error MasaFileWriter_writeFrame( descMetaTemp += hMasaExtOutMeta->descriptiveMeta.channelAngle << 6u; /* 6 LSB remain at zero */ } -#else - /* Construct descriptive meta */ - for ( i = 0; i < 8; i++ ) - { - descMeta.formatDescriptor[i] = ivasmasaFormatDescriptor[i]; - descMeta.numberOfDirections = numDirections - 1; - descMeta.numberOfChannels = (uint8_t) ( nchan_transport - 1 ); - /* Following correspond to "unknown" values until transmission is implemented */ - descMeta.sourceFormat = 0x0u; - descMeta.transportDefinition = 0x0u; - descMeta.channelAngle = 0x0u; - descMeta.channelDistance = 0x0u; - descMeta.channelLayout = 0x0u; - } - - if ( fwrite( &( descMeta.formatDescriptor ), sizeof( uint8_t ), 8, self->file ) != 8 ) - { - return IVAS_ERR_FAILED_FILE_WRITE; - } - - descMetaTemp += descMeta.numberOfDirections << 15u; - descMetaTemp += descMeta.numberOfChannels << 14u; - descMetaTemp += descMeta.sourceFormat << 12u; - if ( descMeta.sourceFormat == 0x0 || descMeta.sourceFormat == 0x1 ) - { - descMetaTemp += descMeta.transportDefinition << 9u; - descMetaTemp += descMeta.channelAngle << 6u; - descMetaTemp += descMeta.channelDistance; - } - else if ( descMeta.sourceFormat == 0x2 ) - { - descMetaTemp += descMeta.channelLayout << 9u; - /* 9 LSB remain at zero */ - } - else if ( descMeta.sourceFormat == 0x3 ) - { - descMetaTemp += descMeta.transportDefinition << 9u; - descMetaTemp += descMeta.channelAngle << 6u; - /* 6 LSB remain at zero */ - } -#endif if ( fwrite( &( descMetaTemp ), sizeof( uint16_t ), 1, self->file ) != 1 ) { @@ -332,73 +253,19 @@ ivas_error MasaFileWriter_writeFrame( for ( dir = 0; dir < numDirections; dir++ ) { /* Spherical index */ -#ifdef FIX_350_MASA_DELAY_COMP if ( fwrite( hMasaExtOutMeta->directionIndex[dir][sf], sizeof( uint16_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#else - for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) - { - writeTempIndex[i] = SPH_IDX_FRONT; - } - - for ( b_old = 0; b_old < numCodingBands; b_old++ ) - { - for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) - { - writeTempIndex[b_new] = hMasaQMetadata->q_direction[dir].band_data[b_old].spherical_index[sf]; - } - } - - if ( fwrite( writeTempIndex, sizeof( uint16_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#endif { return IVAS_ERR_FAILED_FILE_WRITE; } /* Direct-to-total ratio */ -#ifdef FIX_350_MASA_DELAY_COMP if ( fwrite( hMasaExtOutMeta->directToTotalRatio[dir][sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#else - for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) - { - writeTempOther[i] = 0; - } - - for ( b_old = 0; b_old < numCodingBands; b_old++ ) - { - for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) - { - writeTempOther[b_new] = (uint8_t) floorf( hMasaQMetadata->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX ); - } - } - - if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#endif { return IVAS_ERR_FAILED_FILE_WRITE; } /* Spread coherence */ -#ifdef FIX_350_MASA_DELAY_COMP if ( fwrite( hMasaExtOutMeta->spreadCoherence[dir][sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#else - for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) - { - writeTempOther[i] = 0; - } - - if ( hMasaQMetadata->q_direction[dir].coherence_band_data != NULL ) - { - for ( b_old = 0; b_old < numCodingBands; b_old++ ) - { - for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) - { - writeTempOther[b_new] = hMasaQMetadata->q_direction[dir].coherence_band_data[b_old].spread_coherence[sf]; - } - } - } - - if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#endif { return IVAS_ERR_FAILED_FILE_WRITE; } @@ -406,72 +273,23 @@ ivas_error MasaFileWriter_writeFrame( /* Common spatial meta */ /* Diffuse-to-total ratio = 1 - sum(direct-to-total ratios) */ -#ifdef FIX_350_MASA_DELAY_COMP if ( fwrite( hMasaExtOutMeta->diffuseToTotalRatio[sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#else - for ( b_new = 0; b_new < MASA_FREQUENCY_BANDS; b_new++ ) - { - writeTempOther[b_new] = UINT8_MAX; - } - - for ( b_old = 0; b_old < numCodingBands; b_old++ ) - { - for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) - { - writeTempOther[b_new] = UINT8_MAX; - for ( dir = 0; dir < numDirections; dir++ ) - { - writeTempOther[b_new] -= (uint8_t) floorf( hMasaQMetadata->q_direction[dir].band_data[b_old].energy_ratio[sf] * UINT8_MAX ); - } - } - } - - if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#endif { return IVAS_ERR_FAILED_FILE_WRITE; } /* Surround coherence */ -#ifdef FIX_350_MASA_DELAY_COMP if ( fwrite( hMasaExtOutMeta->surroundCoherence[sf], sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#else - /* Surround coherence */ - for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) - { - writeTempOther[i] = 0; - } - - if ( hMasaQMetadata->surcoh_band_data != NULL ) - { - for ( b_old = 0; b_old < numCodingBands; b_old++ ) - { - for ( b_new = bandMap[b_old]; b_new < bandMap[b_old + 1]; b_new++ ) - { - writeTempOther[b_new] = hMasaQMetadata->surcoh_band_data[b_old].surround_coherence[sf]; - } - } - } - - if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) -#endif { return IVAS_ERR_FAILED_FILE_WRITE; } /* Remainder-to-total ratio */ /* This is zero after codec */ -#ifdef FIX_350_MASA_DELAY_COMP for ( i = 0; i < MASA_FREQUENCY_BANDS; i++ ) { writeTempOther[i] = 0u; } -#else - for ( b_new = 0; b_new < MASA_FREQUENCY_BANDS; b_new++ ) - { - writeTempOther[b_new] = 0u; - } -#endif if ( fwrite( writeTempOther, sizeof( uint8_t ), MASA_FREQUENCY_BANDS, self->file ) != MASA_FREQUENCY_BANDS ) { @@ -500,9 +318,7 @@ void MasaFileWriter_close( fclose( ( *selfPtr )->file ); free( ( *selfPtr )->file_path ); -#ifdef FIX_350_MASA_DELAY_COMP free( ( *selfPtr )->delayStorage ); -#endif free( *selfPtr ); *selfPtr = NULL; diff --git a/lib_util/masa_file_writer.h b/lib_util/masa_file_writer.h index cb7d8f3d1e..62aa8c6b48 100644 --- a/lib_util/masa_file_writer.h +++ b/lib_util/masa_file_writer.h @@ -35,9 +35,7 @@ #include #include "options.h" -#ifdef FIX_350_MASA_DELAY_COMP #include -#endif #include "common_api_types.h" @@ -45,20 +43,14 @@ struct MasaFileWriter; typedef struct MasaFileWriter MasaFileWriter; ivas_error MasaFileWriter_open( - const char *outputWavFilename, /* i : name of the output audio file */ -#ifdef FIX_350_MASA_DELAY_COMP + const char *outputWavFilename, /* i : name of the output audio file */ const bool delayCompensationEnabled, /* i : is delay compensation enabled */ -#endif - MasaFileWriter **masaWriter /* o : MasaFileWriter handle */ + MasaFileWriter **masaWriter /* o : MasaFileWriter handle */ ); ivas_error MasaFileWriter_writeFrame( - MasaFileWriter *self, /* i/o: MasaFileWriter handle */ -#ifdef FIX_350_MASA_DELAY_COMP + MasaFileWriter *self, /* i/o: MasaFileWriter handle */ MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta /* i/o: MASA ext out meta handle to be written */ -#else - IVAS_MASA_QMETADATA_HANDLE hMasaQMetadata /* i/o: MASA qMetadata handle to be written */ -#endif ); void MasaFileWriter_close( diff --git a/scripts/config/ci_linux.json b/scripts/config/ci_linux.json index 6bca2663d9..1cb1141752 100644 --- a/scripts/config/ci_linux.json +++ b/scripts/config/ci_linux.json @@ -10,8 +10,8 @@ "SBA": "/usr/local/testv/stv3OA48c.wav", "MASA1TC1DIR": "/usr/local/testv/stv1MASA1TC48c.wav", "MASA1TC2DIR": "/usr/local/testv/stv2MASA1TC48c.wav", - "MASA2TC1DIR": "/usr/local/testv/stv1MASA2TC48c.wav.wav", - "MASA2TC2DIR": "/usr/local/testv/stv2MASA2TC48c.wav.wav", + "MASA2TC1DIR": "/usr/local/testv/stv1MASA2TC48c.wav", + "MASA2TC2DIR": "/usr/local/testv/stv2MASA2TC48c.wav", "5_1": "/usr/local/testv/stv51MC48c.wav", "5_1_2": "/usr/local/testv/stv512MC48c.wav", "5_1_4": "/usr/local/testv/stv514MC48c.wav", diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index 0e4ef469d9..2f8d4ce398 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -1813,7 +1813,7 @@ "table_name": "ISM1@{table_bitrate} kbps {bandwidth}", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -1868,7 +1868,7 @@ "table_name": "ISM1@{table_bitrate} kbps DTX {bandwidth}", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -1924,7 +1924,7 @@ "table_name": "ISM2@{table_bitrate} kbps {bandwidth}", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -1986,7 +1986,7 @@ "table_name": "ISM2@{table_bitrate} kbps DTX {bandwidth}", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -2049,7 +2049,7 @@ "table_name": "ISM3@{table_bitrate} kbps {bandwidth}", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -2112,7 +2112,7 @@ "table_name": "ISM3@{table_bitrate} kbps DTX {bandwidth}", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -2176,7 +2176,7 @@ "table_name": "ISM4@{table_bitrate} kbps {bandwidth}", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -2242,7 +2242,7 @@ "table_name": "ISM4@{table_bitrate} kbps DTX {bandwidth}", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, diff --git a/scripts/config/ivas_modes_debug.json b/scripts/config/ivas_modes_debug.json index 769ed791ea..bbd63d224c 100644 --- a/scripts/config/ivas_modes_debug.json +++ b/scripts/config/ivas_modes_debug.json @@ -12117,7 +12117,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12141,7 +12141,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12165,7 +12165,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12189,7 +12189,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12213,7 +12213,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12237,7 +12237,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12261,7 +12261,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12285,7 +12285,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12309,7 +12309,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12333,7 +12333,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12357,7 +12357,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12381,7 +12381,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12405,7 +12405,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12429,7 +12429,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12453,7 +12453,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12477,7 +12477,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12501,7 +12501,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12525,7 +12525,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12549,7 +12549,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12573,7 +12573,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12597,7 +12597,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12621,7 +12621,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12645,7 +12645,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12669,7 +12669,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12693,7 +12693,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12717,7 +12717,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12741,7 +12741,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12765,7 +12765,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12789,7 +12789,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12813,7 +12813,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12837,7 +12837,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12861,7 +12861,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12885,7 +12885,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12909,7 +12909,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12933,7 +12933,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12958,7 +12958,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -12983,7 +12983,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13008,7 +13008,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13033,7 +13033,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13058,7 +13058,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13083,7 +13083,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13108,7 +13108,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13133,7 +13133,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13158,7 +13158,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13183,7 +13183,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13208,7 +13208,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13233,7 +13233,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13258,7 +13258,7 @@ "bw": "wb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13283,7 +13283,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13308,7 +13308,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13333,7 +13333,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13358,7 +13358,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13383,7 +13383,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13408,7 +13408,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13433,7 +13433,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13458,7 +13458,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13483,7 +13483,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13508,7 +13508,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13533,7 +13533,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13558,7 +13558,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13583,7 +13583,7 @@ "bw": "swb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13608,7 +13608,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13633,7 +13633,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13658,7 +13658,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13683,7 +13683,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13708,7 +13708,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13733,7 +13733,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13758,7 +13758,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13783,7 +13783,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13808,7 +13808,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13833,7 +13833,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13858,7 +13858,7 @@ "bw": "fb", "nummetadata": 1, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13884,7 +13884,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13908,7 +13908,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13932,7 +13932,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13956,7 +13956,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -13980,7 +13980,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14004,7 +14004,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14028,7 +14028,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14052,7 +14052,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14076,7 +14076,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14100,7 +14100,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14124,7 +14124,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14148,7 +14148,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14172,7 +14172,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14196,7 +14196,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14220,7 +14220,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14244,7 +14244,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14268,7 +14268,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14292,7 +14292,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14316,7 +14316,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14340,7 +14340,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14364,7 +14364,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14388,7 +14388,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14412,7 +14412,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14436,7 +14436,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14460,7 +14460,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14484,7 +14484,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14508,7 +14508,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14532,7 +14532,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14556,7 +14556,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14580,7 +14580,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14604,7 +14604,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14628,7 +14628,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14653,7 +14653,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14678,7 +14678,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14703,7 +14703,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14728,7 +14728,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14753,7 +14753,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14778,7 +14778,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14803,7 +14803,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14828,7 +14828,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14853,7 +14853,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14878,7 +14878,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14903,7 +14903,7 @@ "bw": "wb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14928,7 +14928,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14953,7 +14953,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -14978,7 +14978,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15003,7 +15003,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15028,7 +15028,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15053,7 +15053,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15078,7 +15078,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15103,7 +15103,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15128,7 +15128,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15153,7 +15153,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15178,7 +15178,7 @@ "bw": "swb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15203,7 +15203,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15228,7 +15228,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15253,7 +15253,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15278,7 +15278,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15303,7 +15303,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15328,7 +15328,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15353,7 +15353,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15378,7 +15378,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15403,7 +15403,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15428,7 +15428,7 @@ "bw": "fb", "nummetadata": 2, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15454,7 +15454,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15478,7 +15478,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15502,7 +15502,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15526,7 +15526,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15550,7 +15550,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15574,7 +15574,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15598,7 +15598,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15622,7 +15622,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15646,7 +15646,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15670,7 +15670,7 @@ "bw": "wb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15694,7 +15694,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15718,7 +15718,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15742,7 +15742,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15766,7 +15766,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15790,7 +15790,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15814,7 +15814,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15838,7 +15838,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15862,7 +15862,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15886,7 +15886,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15910,7 +15910,7 @@ "bw": "swb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15934,7 +15934,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15958,7 +15958,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -15982,7 +15982,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16006,7 +16006,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16030,7 +16030,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16054,7 +16054,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16078,7 +16078,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16102,7 +16102,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16126,7 +16126,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16150,7 +16150,7 @@ "bw": "fb", "nummetadata": 3, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16176,7 +16176,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16200,7 +16200,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16224,7 +16224,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16248,7 +16248,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16272,7 +16272,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16296,7 +16296,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16320,7 +16320,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16344,7 +16344,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16368,7 +16368,7 @@ "bw": "wb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16392,7 +16392,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16416,7 +16416,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16440,7 +16440,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16464,7 +16464,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16488,7 +16488,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16512,7 +16512,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16536,7 +16536,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16560,7 +16560,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16584,7 +16584,7 @@ "bw": "swb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16608,7 +16608,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16632,7 +16632,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16656,7 +16656,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16680,7 +16680,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16704,7 +16704,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16728,7 +16728,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16752,7 +16752,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16776,7 +16776,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, @@ -16800,7 +16800,7 @@ "bw": "fb", "nummetadata": 4, "metadatafilenames": [ - "test_ISM_trajectory{mdi}.csv" + "stvISM{mdi}.csv" ], "rs": false, "amr": false, diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 70f0ef6b36..91bca7eef2 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -419,6 +419,15 @@ ../IVAS_dec HOA3 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_DTX_hoa3.tst +// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, directivity configuration, random FEC at 5% +../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +../IVAS_dec -fec 5 -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv BINAURAL 48 bit testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FEC5.tst + +// 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out +../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s.wav_brate_sw_48-48_DTX_binaural.tst + + // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out ../IVAS_cod -sba 3 13200 32 testv/stv3OA32c.wav bit ../IVAS_dec HOA3 32 bit testv/stv3OA32c.wav_SBA_13200_32-32_HOA3.tst diff --git a/scripts/pyivastest/IvasModeAnalyzer.py b/scripts/pyivastest/IvasModeAnalyzer.py index fed4f29ecd..94e2646684 100644 --- a/scripts/pyivastest/IvasModeAnalyzer.py +++ b/scripts/pyivastest/IvasModeAnalyzer.py @@ -958,6 +958,7 @@ class IvasModeAnalyzer(IvasModeCollector): IvasModeAnalyzer.write_csv_file(filename, table) def all_instrumented_to_csv(self, basefilename, encdec=-1): + basefilename = os.path.abspath(basefilename) for value in INSTRUMENTED_RESULTS: table = self.get_instrumented_value(value, encdec=encdec) IvasModeAnalyzer.write_csv_file("".join([basefilename, "_", value]), table) diff --git a/scripts/pyivastest/IvasScriptsCommon.py b/scripts/pyivastest/IvasScriptsCommon.py index 3df9994170..681e6b1b7f 100644 --- a/scripts/pyivastest/IvasScriptsCommon.py +++ b/scripts/pyivastest/IvasScriptsCommon.py @@ -631,7 +631,8 @@ def runner_setup(runner, args): if args["item_list"]: runner.set_global_item_list(args["item_list"]) if args["metadata_files"]: - runner.set_global_metadata_file_list(args["metadata_files"]) + metadata_files = [os.path.abspath(f) for f in args["metadata_files"]] + runner.set_global_metadata_file_list(metadata_files) if args["decoder_only"]: runner.run_encoder = False if args["info"]: diff --git a/scripts/self_test.py b/scripts/self_test.py index 2be585882b..d7118832db 100755 --- a/scripts/self_test.py +++ b/scripts/self_test.py @@ -63,7 +63,7 @@ MODES = { "5_1_4": "5_1_4", "7_1_4": "7_1_4", }, - "-ISM": {"1": "ISM1", "2": "ISM2", "3": "ISM3", "4": "ISM4"}, + "-ISM": {"1": "ISM1", "2": "ISM2", "3": "ISM3", "4": "ISM4", "+4": "ISM+4"}, "-SBA": { "-3": "HOA3", "3": "HOA3", diff --git a/scripts/testv/config_directivity.cfg b/scripts/testv/config_directivity.cfg new file mode 100644 index 0000000000..94807d688c --- /dev/null +++ b/scripts/testv/config_directivity.cfg @@ -0,0 +1,3 @@ +[general] +directivity = [0.0, 360.0, 0.2512]; + diff --git a/scripts/testv/headrot_case04_3000_q.csv b/scripts/testv/headrot_case04_3000_q.csv new file mode 100644 index 0000000000..9f90e9e38b --- /dev/null +++ b/scripts/testv/headrot_case04_3000_q.csv @@ -0,0 +1,3000 @@ +1.00,0.00,0.00,0.00,5.03,6.40,0.00 +1.00,-0.00,0.00,0.00,5.03,6.40,0.00 +1.00,-0.00,0.00,0.00,5.03,6.40,0.00 +1.00,-0.00,0.00,0.00,5.03,6.41,0.01 +1.00,-0.00,0.00,0.00,5.03,6.41,0.01 +1.00,-0.00,0.00,0.00,5.03,6.41,0.01 +1.00,-0.00,0.00,0.01,5.03,6.41,0.01 +1.00,-0.00,0.00,0.01,5.03,6.42,0.01 +1.00,-0.00,0.00,0.01,5.03,6.42,0.01 +1.00,-0.00,0.00,0.01,5.03,6.42,0.02 +1.00,-0.00,0.00,0.01,5.03,6.43,0.02 +1.00,-0.00,0.00,0.01,5.03,6.43,0.02 +1.00,-0.00,0.00,0.01,5.03,6.43,0.02 +1.00,-0.00,0.00,0.01,5.03,6.43,0.02 +1.00,-0.00,0.00,0.01,5.03,6.44,0.03 +1.00,-0.00,0.01,0.01,5.03,6.44,0.03 +1.00,-0.00,0.01,0.01,5.03,6.44,0.03 +1.00,-0.00,0.01,0.02,5.03,6.44,0.03 +1.00,-0.00,0.01,0.02,5.03,6.45,0.03 +1.00,-0.00,0.01,0.02,5.03,6.45,0.03 +1.00,-0.00,0.01,0.02,5.03,6.45,0.04 +1.00,-0.00,0.01,0.02,5.03,6.46,0.04 +1.00,-0.00,0.01,0.02,5.03,6.46,0.04 +1.00,-0.00,0.01,0.02,5.03,6.46,0.04 +1.00,-0.00,0.01,0.02,5.03,6.46,0.04 +1.00,-0.00,0.01,0.02,5.03,6.47,0.05 +1.00,-0.00,0.01,0.02,5.03,6.47,0.05 +1.00,-0.00,0.01,0.02,5.03,6.47,0.05 +1.00,-0.00,0.01,0.03,5.03,6.48,0.05 +1.00,-0.00,0.01,0.03,5.03,6.48,0.05 +1.00,-0.00,0.01,0.03,5.02,6.48,0.05 +1.00,-0.00,0.01,0.03,5.02,6.48,0.06 +1.00,-0.00,0.01,0.03,5.02,6.49,0.06 +1.00,-0.00,0.01,0.03,5.02,6.49,0.06 +1.00,-0.00,0.01,0.03,5.02,6.49,0.06 +1.00,-0.00,0.01,0.03,5.02,6.49,0.06 +1.00,-0.00,0.01,0.03,5.02,6.50,0.07 +1.00,-0.00,0.01,0.03,5.02,6.50,0.07 +1.00,-0.00,0.01,0.03,5.02,6.50,0.07 +1.00,-0.00,0.01,0.04,5.02,6.51,0.07 +1.00,-0.00,0.01,0.04,5.02,6.51,0.07 +1.00,-0.00,0.01,0.04,5.02,6.51,0.08 +1.00,-0.00,0.01,0.04,5.02,6.51,0.08 +1.00,-0.00,0.01,0.04,5.02,6.52,0.08 +1.00,-0.00,0.02,0.04,5.02,6.52,0.08 +1.00,-0.00,0.02,0.04,5.02,6.52,0.08 +1.00,-0.00,0.02,0.04,5.02,6.53,0.08 +1.00,-0.00,0.02,0.04,5.02,6.53,0.09 +1.00,-0.00,0.02,0.04,5.02,6.53,0.09 +1.00,-0.00,0.02,0.04,5.02,6.53,0.09 +1.00,-0.00,0.02,0.05,5.02,6.54,0.09 +1.00,-0.00,0.02,0.05,5.02,6.54,0.09 +1.00,-0.00,0.02,0.05,5.02,6.54,0.10 +1.00,-0.00,0.02,0.05,5.02,6.54,0.10 +1.00,-0.00,0.02,0.05,5.02,6.55,0.10 +1.00,-0.00,0.02,0.05,5.02,6.55,0.10 +1.00,-0.00,0.02,0.05,5.02,6.55,0.10 +1.00,-0.00,0.02,0.05,5.02,6.56,0.10 +1.00,-0.00,0.02,0.05,5.02,6.56,0.11 +1.00,-0.00,0.02,0.05,5.02,6.56,0.11 +1.00,-0.00,0.02,0.05,5.02,6.56,0.11 +1.00,-0.00,0.02,0.06,5.02,6.57,0.11 +1.00,-0.00,0.02,0.06,5.02,6.57,0.11 +1.00,-0.00,0.02,0.06,5.02,6.57,0.12 +1.00,-0.00,0.02,0.06,5.02,6.58,0.12 +1.00,-0.00,0.02,0.06,5.02,6.58,0.12 +1.00,-0.00,0.02,0.06,5.02,6.58,0.12 +1.00,-0.00,0.02,0.06,5.02,6.58,0.12 +1.00,-0.00,0.02,0.06,5.02,6.59,0.12 +1.00,-0.00,0.02,0.06,5.02,6.59,0.13 +1.00,-0.00,0.02,0.06,5.01,6.59,0.13 +1.00,-0.00,0.02,0.06,5.01,6.59,0.13 +1.00,-0.00,0.03,0.07,5.01,6.60,0.13 +1.00,-0.00,0.03,0.07,5.01,6.60,0.13 +1.00,-0.00,0.03,0.07,5.01,6.60,0.14 +1.00,-0.00,0.03,0.07,5.01,6.61,0.14 +1.00,-0.00,0.03,0.07,5.01,6.61,0.14 +1.00,-0.00,0.03,0.07,5.01,6.61,0.14 +1.00,-0.00,0.03,0.07,5.01,6.61,0.14 +1.00,-0.00,0.03,0.07,5.01,6.62,0.14 +1.00,-0.00,0.03,0.07,5.01,6.62,0.15 +1.00,-0.00,0.03,0.07,5.01,6.62,0.15 +1.00,-0.00,0.03,0.08,5.01,6.63,0.15 +1.00,-0.00,0.03,0.08,5.01,6.63,0.15 +1.00,-0.00,0.03,0.08,5.01,6.63,0.15 +1.00,-0.00,0.03,0.08,5.01,6.63,0.16 +1.00,-0.00,0.03,0.08,5.01,6.64,0.16 +1.00,-0.00,0.03,0.08,5.01,6.64,0.16 +1.00,-0.00,0.03,0.08,5.01,6.64,0.16 +1.00,-0.00,0.03,0.08,5.01,6.64,0.16 +1.00,-0.00,0.03,0.08,5.01,6.65,0.16 +1.00,-0.00,0.03,0.08,5.01,6.65,0.17 +1.00,-0.00,0.03,0.08,5.01,6.65,0.17 +1.00,-0.00,0.03,0.09,5.01,6.66,0.17 +1.00,-0.00,0.03,0.09,5.00,6.66,0.17 +1.00,-0.00,0.03,0.09,5.00,6.66,0.17 +1.00,-0.00,0.03,0.09,5.00,6.66,0.18 +1.00,-0.00,0.03,0.09,5.00,6.67,0.18 +1.00,-0.00,0.03,0.09,5.00,6.67,0.18 +1.00,-0.00,0.03,0.09,5.00,6.67,0.18 +1.00,-0.00,0.03,0.09,5.00,6.68,0.18 +1.00,-0.00,0.04,0.09,5.00,6.68,0.18 +1.00,-0.00,0.04,0.09,5.00,6.68,0.19 +0.99,-0.00,0.04,0.09,5.00,6.68,0.19 +0.99,-0.00,0.04,0.10,5.00,6.69,0.19 +0.99,-0.00,0.04,0.10,5.00,6.69,0.19 +0.99,-0.00,0.04,0.10,5.00,6.69,0.19 +0.99,-0.00,0.04,0.10,5.00,6.69,0.20 +0.99,-0.00,0.04,0.10,5.00,6.70,0.20 +0.99,-0.00,0.04,0.10,5.00,6.70,0.20 +0.99,-0.00,0.04,0.10,5.00,6.70,0.20 +0.99,-0.00,0.04,0.10,5.00,6.71,0.20 +0.99,-0.00,0.04,0.10,5.00,6.71,0.20 +0.99,-0.00,0.04,0.10,4.99,6.71,0.21 +0.99,-0.00,0.04,0.10,4.99,6.71,0.21 +0.99,-0.00,0.04,0.11,4.99,6.72,0.21 +0.99,-0.00,0.04,0.11,4.99,6.72,0.21 +0.99,-0.00,0.04,0.11,4.99,6.72,0.21 +0.99,-0.00,0.04,0.11,4.99,6.72,0.22 +0.99,-0.00,0.04,0.11,4.99,6.73,0.22 +0.99,-0.00,0.04,0.11,4.99,6.73,0.22 +0.99,-0.00,0.04,0.11,4.99,6.73,0.22 +0.99,-0.00,0.04,0.11,4.99,6.74,0.22 +0.99,-0.00,0.04,0.11,4.99,6.74,0.22 +0.99,-0.00,0.04,0.11,4.99,6.74,0.23 +0.99,-0.00,0.04,0.11,4.99,6.74,0.23 +0.99,-0.01,0.04,0.12,4.99,6.75,0.23 +0.99,-0.01,0.04,0.12,4.99,6.75,0.23 +0.99,-0.01,0.04,0.12,4.99,6.75,0.23 +0.99,-0.01,0.04,0.12,4.98,6.75,0.24 +0.99,-0.01,0.05,0.12,4.98,6.76,0.24 +0.99,-0.01,0.05,0.12,4.98,6.76,0.24 +0.99,-0.01,0.05,0.12,4.98,6.76,0.24 +0.99,-0.01,0.05,0.12,4.98,6.77,0.24 +0.99,-0.01,0.05,0.12,4.98,6.77,0.24 +0.99,-0.01,0.05,0.12,4.98,6.77,0.25 +0.99,-0.01,0.05,0.12,4.98,6.77,0.25 +0.99,-0.01,0.05,0.13,4.98,6.78,0.25 +0.99,-0.01,0.05,0.13,4.98,6.78,0.25 +0.99,-0.01,0.05,0.13,4.98,6.78,0.25 +0.99,-0.01,0.05,0.13,4.98,6.78,0.26 +0.99,-0.01,0.05,0.13,4.98,6.79,0.26 +0.99,-0.01,0.05,0.13,4.98,6.79,0.26 +0.99,-0.01,0.05,0.13,4.98,6.79,0.26 +0.99,-0.01,0.05,0.13,4.97,6.80,0.26 +0.99,-0.01,0.05,0.13,4.97,6.80,0.26 +0.99,-0.01,0.05,0.13,4.97,6.80,0.27 +0.99,-0.01,0.05,0.13,4.97,6.80,0.27 +0.99,-0.01,0.05,0.14,4.97,6.81,0.27 +0.99,-0.01,0.05,0.14,4.97,6.81,0.27 +0.99,-0.01,0.05,0.14,4.97,6.81,0.27 +0.99,-0.01,0.05,0.14,4.97,6.81,0.28 +0.99,-0.01,0.05,0.14,4.97,6.82,0.28 +0.99,-0.01,0.05,0.14,4.97,6.82,0.28 +0.99,-0.01,0.05,0.14,4.97,6.82,0.28 +0.99,-0.01,0.05,0.14,4.97,6.83,0.28 +0.99,-0.01,0.05,0.14,4.97,6.83,0.28 +0.99,-0.01,0.05,0.14,4.96,6.83,0.29 +0.99,-0.01,0.05,0.14,4.96,6.83,0.29 +0.99,-0.01,0.05,0.14,4.96,6.84,0.29 +0.99,-0.01,0.06,0.15,4.96,6.84,0.29 +0.99,-0.01,0.06,0.15,4.96,6.84,0.29 +0.99,-0.01,0.06,0.15,4.96,6.84,0.30 +0.99,-0.01,0.06,0.15,4.96,6.85,0.30 +0.99,-0.01,0.06,0.15,4.96,6.85,0.30 +0.99,-0.01,0.06,0.15,4.96,6.85,0.30 +0.99,-0.01,0.06,0.15,4.96,6.86,0.30 +0.99,-0.01,0.06,0.15,4.96,6.86,0.30 +0.99,-0.01,0.06,0.15,4.96,6.86,0.31 +0.99,-0.01,0.06,0.15,4.95,6.86,0.31 +0.99,-0.01,0.06,0.15,4.95,6.87,0.31 +0.99,-0.01,0.06,0.16,4.95,6.87,0.31 +0.99,-0.01,0.06,0.16,4.95,6.87,0.31 +0.99,-0.01,0.06,0.16,4.95,6.87,0.32 +0.99,-0.01,0.06,0.16,4.95,6.88,0.32 +0.99,-0.01,0.06,0.16,4.95,6.88,0.32 +0.99,-0.01,0.06,0.16,4.95,6.88,0.32 +0.98,-0.01,0.06,0.16,4.95,6.88,0.32 +0.98,-0.01,0.06,0.16,4.95,6.89,0.32 +0.98,-0.01,0.06,0.16,4.95,6.89,0.33 +0.98,-0.01,0.06,0.16,4.94,6.89,0.33 +0.98,-0.01,0.06,0.16,4.94,6.90,0.33 +0.98,-0.01,0.06,0.17,4.94,6.90,0.33 +0.98,-0.01,0.06,0.17,4.94,6.90,0.33 +0.98,-0.01,0.06,0.17,4.94,6.90,0.33 +0.98,-0.01,0.06,0.17,4.94,6.91,0.34 +0.98,-0.01,0.06,0.17,4.94,6.91,0.34 +0.98,-0.01,0.06,0.17,4.94,6.91,0.34 +0.98,-0.01,0.06,0.17,4.94,6.91,0.34 +0.98,-0.01,0.06,0.17,4.94,6.92,0.34 +0.98,-0.01,0.07,0.17,4.94,6.92,0.35 +0.98,-0.01,0.07,0.17,4.93,6.92,0.35 +0.98,-0.01,0.07,0.17,4.93,6.92,0.35 +0.98,-0.01,0.07,0.18,4.93,6.93,0.35 +0.98,-0.01,0.07,0.18,4.93,6.93,0.35 +0.98,-0.01,0.07,0.18,4.93,6.93,0.35 +0.98,-0.01,0.07,0.18,4.93,6.94,0.36 +0.98,-0.01,0.07,0.18,4.93,6.94,0.36 +0.98,-0.01,0.07,0.18,4.93,6.94,0.36 +0.98,-0.01,0.07,0.18,4.93,6.94,0.36 +0.98,-0.01,0.07,0.18,4.93,6.95,0.36 +0.98,-0.01,0.07,0.18,4.92,6.95,0.37 +0.98,-0.01,0.07,0.18,4.92,6.95,0.37 +0.98,-0.01,0.07,0.18,4.92,6.95,0.37 +0.98,-0.01,0.07,0.19,4.92,6.96,0.37 +0.98,-0.01,0.07,0.19,4.92,6.96,0.37 +0.98,-0.01,0.07,0.19,4.92,6.96,0.37 +0.98,-0.01,0.07,0.19,4.92,6.96,0.38 +0.98,-0.01,0.07,0.19,4.92,6.97,0.38 +0.98,-0.01,0.07,0.19,4.92,6.97,0.38 +0.98,-0.01,0.07,0.19,4.92,6.97,0.38 +0.98,-0.01,0.07,0.19,4.91,6.97,0.38 +0.98,-0.01,0.07,0.19,4.91,6.98,0.39 +0.98,-0.01,0.07,0.19,4.91,6.98,0.39 +0.98,-0.01,0.07,0.19,4.91,6.98,0.39 +0.98,-0.01,0.07,0.20,4.91,6.99,0.39 +0.98,-0.01,0.07,0.20,4.91,6.99,0.39 +0.98,-0.01,0.07,0.20,4.91,6.99,0.39 +0.98,-0.02,0.07,0.20,4.91,6.99,0.40 +0.98,-0.02,0.07,0.20,4.91,7.00,0.40 +0.98,-0.02,0.08,0.20,4.90,7.00,0.40 +0.98,-0.02,0.08,0.20,4.90,7.00,0.40 +0.98,-0.02,0.08,0.20,4.90,7.00,0.40 +0.98,-0.02,0.08,0.20,4.90,7.01,0.40 +0.98,-0.02,0.08,0.20,4.90,7.01,0.41 +0.98,-0.02,0.08,0.20,4.90,7.01,0.41 +0.98,-0.02,0.08,0.20,4.90,7.01,0.41 +0.98,-0.02,0.08,0.21,4.90,7.02,0.41 +0.98,-0.02,0.08,0.21,4.90,7.02,0.41 +0.97,-0.02,0.08,0.21,4.89,7.02,0.42 +0.97,-0.02,0.08,0.21,4.89,7.02,0.42 +0.97,-0.02,0.08,0.21,4.89,7.03,0.42 +0.97,-0.02,0.08,0.21,4.89,7.03,0.42 +0.97,-0.02,0.08,0.21,4.89,7.03,0.42 +0.97,-0.02,0.08,0.21,4.89,7.03,0.42 +0.97,-0.02,0.08,0.21,4.89,7.04,0.43 +0.97,-0.02,0.08,0.21,4.89,7.04,0.43 +0.97,-0.02,0.08,0.21,4.88,7.04,0.43 +0.97,-0.02,0.08,0.22,4.88,7.05,0.43 +0.97,-0.02,0.08,0.22,4.88,7.05,0.43 +0.97,-0.02,0.08,0.22,4.88,7.05,0.43 +0.97,-0.02,0.08,0.22,4.88,7.05,0.44 +0.97,-0.02,0.08,0.22,4.88,7.06,0.44 +0.97,-0.02,0.08,0.22,4.88,7.06,0.44 +0.97,-0.02,0.08,0.22,4.88,7.06,0.44 +0.97,-0.02,0.08,0.22,4.88,7.06,0.44 +0.97,-0.02,0.08,0.22,4.87,7.07,0.45 +0.97,-0.02,0.08,0.22,4.87,7.07,0.45 +0.97,-0.02,0.08,0.22,4.87,7.07,0.45 +0.97,-0.02,0.08,0.23,4.87,7.07,0.45 +0.97,-0.02,0.08,0.23,4.87,7.08,0.45 +0.97,-0.02,0.09,0.23,4.87,7.08,0.45 +0.97,-0.02,0.09,0.23,4.87,7.08,0.46 +0.97,-0.02,0.09,0.23,4.87,7.08,0.46 +0.97,-0.02,0.09,0.23,4.86,7.09,0.46 +0.97,-0.02,0.09,0.23,4.86,7.09,0.46 +0.97,-0.02,0.09,0.23,4.86,7.09,0.46 +0.97,-0.02,0.09,0.23,4.86,7.09,0.46 +0.97,-0.02,0.09,0.23,4.86,7.10,0.47 +0.97,-0.02,0.09,0.23,4.86,7.10,0.47 +0.97,-0.02,0.09,0.24,4.86,7.10,0.47 +0.97,-0.02,0.09,0.24,4.85,7.10,0.47 +0.97,-0.02,0.09,0.24,4.85,7.11,0.47 +0.97,-0.02,0.09,0.24,4.85,7.11,0.48 +0.97,-0.02,0.09,0.24,4.85,7.11,0.48 +0.97,-0.02,0.09,0.24,4.85,7.11,0.48 +0.97,-0.02,0.09,0.24,4.85,7.12,0.48 +0.97,-0.02,0.09,0.24,4.85,7.12,0.48 +0.97,-0.02,0.09,0.24,4.85,7.12,0.48 +0.97,-0.02,0.09,0.24,4.84,7.12,0.49 +0.97,-0.02,0.09,0.24,4.84,7.13,0.49 +0.96,-0.02,0.09,0.24,4.84,7.13,0.49 +0.96,-0.02,0.09,0.25,4.84,7.13,0.49 +0.96,-0.02,0.09,0.25,4.84,7.13,0.49 +0.96,-0.02,0.09,0.25,4.84,7.14,0.49 +0.96,-0.02,0.09,0.25,4.84,7.14,0.50 +0.96,-0.02,0.09,0.25,4.83,7.14,0.50 +0.96,-0.02,0.09,0.25,4.83,7.14,0.50 +0.96,-0.02,0.09,0.25,4.83,7.15,0.50 +0.96,-0.02,0.09,0.25,4.83,7.15,0.50 +0.96,-0.02,0.09,0.25,4.83,7.15,0.51 +0.96,-0.02,0.09,0.25,4.83,7.15,0.51 +0.96,-0.03,0.10,0.25,4.83,7.16,0.51 +0.96,-0.03,0.10,0.26,4.82,7.16,0.51 +0.96,-0.03,0.10,0.26,4.82,7.16,0.51 +0.96,-0.03,0.10,0.26,4.82,7.16,0.51 +0.96,-0.03,0.10,0.26,4.82,7.17,0.52 +0.96,-0.03,0.10,0.26,4.82,7.17,0.52 +0.96,-0.03,0.10,0.26,4.82,7.17,0.52 +0.96,-0.03,0.10,0.26,4.82,7.17,0.52 +0.96,-0.03,0.10,0.26,4.81,7.18,0.52 +0.96,-0.03,0.10,0.26,4.81,7.18,0.52 +0.96,-0.03,0.10,0.26,4.81,7.18,0.53 +0.96,-0.03,0.10,0.26,4.81,7.18,0.53 +0.96,-0.03,0.10,0.26,4.81,7.19,0.53 +0.96,-0.03,0.10,0.27,4.81,7.19,0.53 +0.96,-0.03,0.10,0.27,4.81,7.19,0.53 +0.96,-0.03,0.10,0.27,4.80,7.19,0.53 +0.96,-0.03,0.10,0.27,4.80,7.20,0.54 +0.96,-0.03,0.10,0.27,4.80,7.20,0.54 +0.96,-0.03,0.10,0.27,4.80,7.20,0.54 +0.96,-0.03,0.10,0.27,4.80,7.20,0.54 +0.96,-0.03,0.10,0.27,4.80,7.21,0.54 +0.96,-0.03,0.10,0.27,4.80,7.21,0.55 +0.96,-0.03,0.10,0.27,4.79,7.21,0.55 +0.96,-0.03,0.10,0.27,4.79,7.21,0.55 +0.96,-0.03,0.10,0.28,4.79,7.22,0.55 +0.96,-0.03,0.10,0.28,4.79,7.22,0.55 +0.95,-0.03,0.10,0.28,4.79,7.22,0.55 +0.95,-0.03,0.10,0.28,4.79,7.22,0.56 +0.95,-0.03,0.10,0.28,4.79,7.23,0.56 +0.95,-0.03,0.10,0.28,4.78,7.23,0.56 +0.95,-0.03,0.10,0.28,4.78,7.23,0.56 +0.95,-0.03,0.10,0.28,4.78,7.23,0.56 +0.95,-0.03,0.10,0.28,4.78,7.24,0.56 +0.95,-0.03,0.11,0.28,4.78,7.24,0.57 +0.95,-0.03,0.11,0.28,4.78,7.24,0.57 +0.95,-0.03,0.11,0.28,4.77,7.24,0.57 +0.95,-0.03,0.11,0.29,4.77,7.25,0.57 +0.95,-0.03,0.11,0.29,4.77,7.25,0.57 +0.95,-0.03,0.11,0.29,4.77,7.25,0.57 +0.95,-0.03,0.11,0.29,4.77,7.25,0.58 +0.95,-0.03,0.11,0.29,4.77,7.26,0.58 +0.95,-0.03,0.11,0.29,4.76,7.26,0.58 +0.95,-0.03,0.11,0.29,4.76,7.26,0.58 +0.95,-0.03,0.11,0.29,4.76,7.26,0.58 +0.95,-0.03,0.11,0.29,4.76,7.27,0.58 +0.95,-0.03,0.11,0.29,4.76,7.27,0.59 +0.95,-0.03,0.11,0.29,4.76,7.27,0.59 +0.95,-0.03,0.11,0.29,4.76,7.27,0.59 +0.95,-0.03,0.11,0.30,4.75,7.27,0.59 +0.95,-0.03,0.11,0.30,4.75,7.28,0.59 +0.95,-0.03,0.11,0.30,4.75,7.28,0.60 +0.95,-0.03,0.11,0.30,4.75,7.28,0.60 +0.95,-0.04,0.11,0.30,4.75,7.28,0.60 +0.95,-0.04,0.11,0.30,4.75,7.29,0.60 +0.95,-0.04,0.11,0.30,4.74,7.29,0.60 +0.95,-0.04,0.11,0.30,4.74,7.29,0.60 +0.95,-0.04,0.11,0.30,4.74,7.29,0.61 +0.95,-0.04,0.11,0.30,4.74,7.30,0.61 +0.95,-0.04,0.11,0.30,4.74,7.30,0.61 +0.94,-0.04,0.11,0.31,4.74,7.30,0.61 +0.94,-0.04,0.11,0.31,4.73,7.30,0.61 +0.94,-0.04,0.11,0.31,4.73,7.31,0.61 +0.94,-0.04,0.11,0.31,4.73,7.31,0.62 +0.94,-0.04,0.11,0.31,4.73,7.31,0.62 +0.94,-0.04,0.11,0.31,4.73,7.31,0.62 +0.94,-0.04,0.11,0.31,4.73,7.32,0.62 +0.94,-0.04,0.12,0.31,4.72,7.32,0.62 +0.94,-0.04,0.12,0.31,4.72,7.32,0.62 +0.94,-0.04,0.12,0.31,4.72,7.32,0.63 +0.94,-0.04,0.12,0.31,4.72,7.32,0.63 +0.94,-0.04,0.12,0.31,4.72,7.33,0.63 +0.94,-0.04,0.12,0.32,4.71,7.33,0.63 +0.94,-0.04,0.12,0.32,4.71,7.33,0.63 +0.94,-0.04,0.12,0.32,4.71,7.33,0.63 +0.94,-0.04,0.12,0.32,4.71,7.34,0.64 +0.94,-0.04,0.12,0.32,4.71,7.34,0.64 +0.94,-0.04,0.12,0.32,4.71,7.34,0.64 +0.94,-0.04,0.12,0.32,4.70,7.34,0.64 +0.94,-0.04,0.12,0.32,4.70,7.35,0.64 +0.94,-0.04,0.12,0.32,4.70,7.35,0.64 +0.94,-0.04,0.12,0.32,4.70,7.35,0.65 +0.94,-0.04,0.12,0.32,4.70,7.35,0.65 +0.94,-0.04,0.12,0.32,4.70,7.35,0.65 +0.94,-0.04,0.12,0.33,4.69,7.36,0.65 +0.94,-0.04,0.12,0.33,4.69,7.36,0.65 +0.94,-0.04,0.12,0.33,4.69,7.36,0.65 +0.94,-0.04,0.12,0.33,4.69,7.36,0.66 +0.94,-0.04,0.12,0.33,4.69,7.37,0.66 +0.94,-0.04,0.12,0.33,4.68,7.37,0.66 +0.93,-0.04,0.12,0.33,4.68,7.37,0.66 +0.93,-0.04,0.12,0.33,4.68,7.37,0.66 +0.93,-0.04,0.12,0.33,4.68,7.38,0.66 +0.93,-0.04,0.12,0.33,4.68,7.38,0.67 +0.93,-0.04,0.12,0.33,4.68,7.38,0.67 +0.93,-0.04,0.12,0.33,4.67,7.38,0.67 +0.93,-0.04,0.12,0.34,4.67,7.38,0.67 +0.93,-0.04,0.12,0.34,4.67,7.39,0.67 +0.93,-0.04,0.12,0.34,4.67,7.39,0.67 +0.93,-0.05,0.12,0.34,4.67,7.39,0.68 +0.93,-0.05,0.12,0.34,4.66,7.39,0.68 +0.93,-0.05,0.12,0.34,4.66,7.40,0.68 +0.93,-0.05,0.13,0.34,4.66,7.40,0.68 +0.93,-0.05,0.13,0.34,4.66,7.40,0.68 +0.93,-0.05,0.13,0.34,4.66,7.40,0.68 +0.93,-0.05,0.13,0.34,4.65,7.41,0.69 +0.93,-0.05,0.13,0.34,4.65,7.41,0.69 +0.93,-0.05,0.13,0.34,4.65,7.41,0.69 +0.93,-0.05,0.13,0.35,4.65,7.41,0.69 +0.93,-0.05,0.13,0.35,4.65,7.41,0.69 +0.93,-0.05,0.13,0.35,4.65,7.42,0.69 +0.93,-0.05,0.13,0.35,4.64,7.42,0.70 +0.93,-0.05,0.13,0.35,4.64,7.42,0.70 +0.93,-0.05,0.13,0.35,4.64,7.42,0.70 +0.93,-0.05,0.13,0.35,4.64,7.43,0.70 +0.93,-0.05,0.13,0.35,4.64,7.43,0.70 +0.93,-0.05,0.13,0.35,4.63,7.43,0.70 +0.93,-0.05,0.13,0.35,4.63,7.43,0.71 +0.92,-0.05,0.13,0.35,4.63,7.43,0.71 +0.92,-0.05,0.13,0.35,4.63,7.44,0.71 +0.92,-0.05,0.13,0.36,4.63,7.44,0.71 +0.92,-0.05,0.13,0.36,4.62,7.44,0.71 +0.92,-0.05,0.13,0.36,4.62,7.44,0.71 +0.92,-0.05,0.13,0.36,4.62,7.45,0.72 +0.92,-0.05,0.13,0.36,4.62,7.45,0.72 +0.92,-0.05,0.13,0.36,4.62,7.45,0.72 +0.92,-0.05,0.13,0.36,4.61,7.45,0.72 +0.92,-0.05,0.13,0.36,4.61,7.45,0.72 +0.92,-0.05,0.13,0.36,4.61,7.46,0.72 +0.92,-0.05,0.13,0.36,4.61,7.46,0.73 +0.92,-0.05,0.13,0.36,4.61,7.46,0.73 +0.92,-0.05,0.13,0.36,4.60,7.46,0.73 +0.92,-0.05,0.13,0.37,4.60,7.47,0.73 +0.92,-0.05,0.13,0.37,4.60,7.47,0.73 +0.92,-0.05,0.13,0.37,4.60,7.47,0.73 +0.92,-0.05,0.13,0.37,4.60,7.47,0.74 +0.92,-0.05,0.13,0.37,4.59,7.47,0.74 +0.92,-0.05,0.13,0.37,4.59,7.48,0.74 +0.92,-0.05,0.14,0.37,4.59,7.48,0.74 +0.92,-0.05,0.14,0.37,4.59,7.48,0.74 +0.92,-0.06,0.14,0.37,4.59,7.48,0.74 +0.92,-0.06,0.14,0.37,4.58,7.48,0.75 +0.92,-0.06,0.14,0.37,4.58,7.49,0.75 +0.92,-0.06,0.14,0.37,4.58,7.49,0.75 +0.91,-0.06,0.14,0.38,4.58,7.49,0.75 +0.91,-0.06,0.14,0.38,4.58,7.49,0.75 +0.91,-0.06,0.14,0.38,4.57,7.50,0.75 +0.91,-0.06,0.14,0.38,4.57,7.50,0.76 +0.91,-0.06,0.14,0.38,4.57,7.50,0.76 +0.91,-0.06,0.14,0.38,4.57,7.50,0.76 +0.91,-0.06,0.14,0.38,4.57,7.50,0.76 +0.91,-0.06,0.14,0.38,4.56,7.51,0.76 +0.91,-0.06,0.14,0.38,4.56,7.51,0.76 +0.91,-0.06,0.14,0.38,4.56,7.51,0.77 +0.91,-0.06,0.14,0.38,4.56,7.51,0.77 +0.91,-0.06,0.14,0.38,4.56,7.51,0.77 +0.91,-0.06,0.14,0.39,4.55,7.52,0.77 +0.91,-0.06,0.14,0.39,4.55,7.52,0.77 +0.91,-0.06,0.14,0.39,4.55,7.52,0.77 +0.91,-0.06,0.14,0.39,4.55,7.52,0.78 +0.91,-0.06,0.14,0.39,4.54,7.52,0.78 +0.91,-0.06,0.14,0.39,4.54,7.53,0.78 +0.91,-0.06,0.14,0.39,4.54,7.53,0.78 +0.91,-0.06,0.14,0.39,4.54,7.53,0.78 +0.91,-0.06,0.14,0.39,4.54,7.53,0.78 +0.91,-0.06,0.14,0.39,4.53,7.54,0.79 +0.91,-0.06,0.14,0.39,4.53,7.54,0.79 +0.91,-0.06,0.14,0.39,4.53,7.54,0.79 +0.91,-0.06,0.14,0.40,4.53,7.54,0.79 +0.90,-0.06,0.14,0.40,4.53,7.54,0.79 +0.90,-0.06,0.14,0.40,4.52,7.55,0.79 +0.90,-0.06,0.14,0.40,4.52,7.55,0.79 +0.90,-0.06,0.14,0.40,4.52,7.55,0.80 +0.90,-0.06,0.14,0.40,4.52,7.55,0.80 +0.90,-0.06,0.14,0.40,4.51,7.55,0.80 +0.90,-0.06,0.14,0.40,4.51,7.56,0.80 +0.90,-0.06,0.15,0.40,4.51,7.56,0.80 +0.90,-0.06,0.15,0.40,4.51,7.56,0.80 +0.90,-0.07,0.15,0.40,4.51,7.56,0.81 +0.90,-0.07,0.15,0.40,4.50,7.56,0.81 +0.90,-0.07,0.15,0.40,4.50,7.57,0.81 +0.90,-0.07,0.15,0.41,4.50,7.57,0.81 +0.90,-0.07,0.15,0.41,4.50,7.57,0.81 +0.90,-0.07,0.15,0.41,4.50,7.57,0.81 +0.90,-0.07,0.15,0.41,4.49,7.57,0.82 +0.90,-0.07,0.15,0.41,4.49,7.58,0.82 +0.90,-0.07,0.15,0.41,4.49,7.58,0.82 +0.90,-0.07,0.15,0.41,4.49,7.58,0.82 +0.90,-0.07,0.15,0.41,4.48,7.58,0.82 +0.90,-0.07,0.15,0.41,4.48,7.58,0.82 +0.90,-0.07,0.15,0.41,4.48,7.59,0.83 +0.90,-0.07,0.15,0.41,4.48,7.59,0.83 +0.90,-0.07,0.15,0.41,4.47,7.59,0.83 +0.89,-0.07,0.15,0.42,4.47,7.59,0.83 +0.89,-0.07,0.15,0.42,4.47,7.59,0.83 +0.89,-0.07,0.15,0.42,4.47,7.60,0.83 +0.89,-0.07,0.15,0.42,4.47,7.60,0.83 +0.89,-0.07,0.15,0.42,4.46,7.60,0.84 +0.89,-0.07,0.15,0.42,4.46,7.60,0.84 +0.89,-0.07,0.15,0.42,4.46,7.60,0.84 +0.89,-0.07,0.15,0.42,4.46,7.61,0.84 +0.89,-0.07,0.15,0.42,4.45,7.61,0.84 +0.89,-0.07,0.15,0.42,4.45,7.61,0.84 +0.89,-0.07,0.15,0.42,4.45,7.61,0.85 +0.89,-0.07,0.15,0.42,4.45,7.61,0.85 +0.89,-0.07,0.15,0.42,4.45,7.62,0.85 +0.89,-0.07,0.15,0.43,4.44,7.62,0.85 +0.89,-0.07,0.15,0.43,4.44,7.62,0.85 +0.89,-0.07,0.15,0.43,4.44,7.62,0.85 +0.89,-0.07,0.15,0.43,4.44,7.62,0.86 +0.89,-0.07,0.15,0.43,4.43,7.63,0.86 +0.89,-0.07,0.15,0.43,4.43,7.63,0.86 +0.89,-0.07,0.15,0.43,4.43,7.63,0.86 +0.89,-0.08,0.15,0.43,4.43,7.63,0.86 +0.89,-0.08,0.15,0.43,4.42,7.63,0.86 +0.89,-0.08,0.15,0.43,4.42,7.64,0.86 +0.88,-0.08,0.16,0.43,4.42,7.64,0.87 +0.88,-0.08,0.16,0.43,4.42,7.64,0.87 +0.88,-0.08,0.16,0.43,4.42,7.64,0.87 +0.88,-0.08,0.16,0.44,4.41,7.64,0.87 +0.88,-0.08,0.16,0.44,4.41,7.64,0.87 +0.88,-0.08,0.16,0.44,4.41,7.65,0.87 +0.88,-0.08,0.16,0.44,4.41,7.65,0.88 +0.88,-0.08,0.16,0.44,4.40,7.65,0.88 +0.88,-0.08,0.16,0.44,4.40,7.65,0.88 +0.88,-0.08,0.16,0.44,4.40,7.65,0.88 +0.88,-0.08,0.16,0.44,4.40,7.66,0.88 +0.88,-0.08,0.16,0.44,4.39,7.66,0.88 +0.88,-0.08,0.16,0.44,4.39,7.66,0.89 +0.88,-0.08,0.16,0.44,4.39,7.66,0.89 +0.88,-0.08,0.16,0.44,4.39,7.66,0.89 +0.88,-0.08,0.16,0.44,4.38,7.67,0.89 +0.88,-0.08,0.16,0.45,4.38,7.67,0.89 +0.88,-0.08,0.16,0.45,4.38,7.67,0.89 +0.88,-0.08,0.16,0.45,4.38,7.67,0.89 +0.88,-0.08,0.16,0.45,4.37,7.67,0.90 +0.88,-0.08,0.16,0.45,4.37,7.67,0.90 +0.87,-0.08,0.16,0.45,4.37,7.68,0.90 +0.87,-0.08,0.16,0.45,4.37,7.68,0.90 +0.87,-0.08,0.16,0.45,4.36,7.68,0.90 +0.87,-0.08,0.16,0.45,4.36,7.68,0.90 +0.87,-0.08,0.16,0.45,4.36,7.68,0.91 +0.87,-0.08,0.16,0.45,4.36,7.69,0.91 +0.87,-0.08,0.16,0.45,4.36,7.69,0.91 +0.87,-0.08,0.16,0.45,4.35,7.69,0.91 +0.87,-0.08,0.16,0.46,4.35,7.69,0.91 +0.87,-0.08,0.16,0.46,4.35,7.69,0.91 +0.87,-0.09,0.16,0.46,4.35,7.69,0.91 +0.87,-0.09,0.16,0.46,4.34,7.70,0.92 +0.87,-0.09,0.16,0.46,4.34,7.70,0.92 +0.87,-0.09,0.16,0.46,4.34,7.70,0.92 +0.87,-0.09,0.16,0.46,4.34,7.70,0.92 +0.87,-0.09,0.16,0.46,4.33,7.70,0.92 +0.87,-0.09,0.16,0.46,4.33,7.71,0.92 +0.87,-0.09,0.16,0.46,4.33,7.71,0.93 +0.87,-0.09,0.16,0.46,4.33,7.71,0.93 +0.87,-0.09,0.16,0.46,4.32,7.71,0.93 +0.87,-0.09,0.16,0.46,4.32,7.71,0.93 +0.86,-0.09,0.16,0.47,4.32,7.71,0.93 +0.86,-0.09,0.16,0.47,4.32,7.72,0.93 +0.86,-0.09,0.17,0.47,4.31,7.72,0.93 +0.86,-0.09,0.17,0.47,4.31,7.72,0.94 +0.86,-0.09,0.17,0.47,4.31,7.72,0.94 +0.86,-0.09,0.17,0.47,4.31,7.72,0.94 +0.86,-0.09,0.17,0.47,4.30,7.73,0.94 +0.86,-0.09,0.17,0.47,4.30,7.73,0.94 +0.86,-0.09,0.17,0.47,4.30,7.73,0.94 +0.86,-0.09,0.17,0.47,4.30,7.73,0.95 +0.86,-0.09,0.17,0.47,4.29,7.73,0.95 +0.86,-0.09,0.17,0.47,4.29,7.73,0.95 +0.86,-0.09,0.17,0.47,4.29,7.74,0.95 +0.86,-0.09,0.17,0.48,4.28,7.74,0.95 +0.86,-0.09,0.17,0.48,4.28,7.74,0.95 +0.86,-0.09,0.17,0.48,4.28,7.74,0.95 +0.86,-0.09,0.17,0.48,4.28,7.74,0.96 +0.86,-0.09,0.17,0.48,4.27,7.74,0.96 +0.86,-0.09,0.17,0.48,4.27,7.75,0.96 +0.86,-0.09,0.17,0.48,4.27,7.75,0.96 +0.86,-0.10,0.17,0.48,4.27,7.75,0.96 +0.85,-0.10,0.17,0.48,4.26,7.75,0.96 +0.85,-0.10,0.17,0.48,4.26,7.75,0.96 +0.85,-0.10,0.17,0.48,4.26,7.75,0.97 +0.85,-0.10,0.17,0.48,4.26,7.76,0.97 +0.85,-0.10,0.17,0.48,4.25,7.76,0.97 +0.85,-0.10,0.17,0.49,4.25,7.76,0.97 +0.85,-0.10,0.17,0.49,4.25,7.76,0.97 +0.85,-0.10,0.17,0.49,4.25,7.76,0.97 +0.85,-0.10,0.17,0.49,4.24,7.76,0.98 +0.85,-0.10,0.17,0.49,4.24,7.77,0.98 +0.85,-0.10,0.17,0.49,4.24,7.77,0.98 +0.85,-0.10,0.17,0.49,4.24,7.77,0.98 +0.85,-0.10,0.17,0.49,4.23,7.77,0.98 +0.85,-0.10,0.17,0.49,4.23,7.77,0.98 +0.85,-0.10,0.17,0.49,4.23,7.77,0.98 +0.85,-0.10,0.17,0.49,4.23,7.78,0.99 +0.85,-0.10,0.17,0.49,4.22,7.78,0.99 +0.85,-0.10,0.17,0.49,4.22,7.78,0.99 +0.85,-0.10,0.17,0.49,4.22,7.78,0.99 +0.84,-0.10,0.17,0.50,4.21,7.78,0.99 +0.84,-0.10,0.17,0.50,4.21,7.78,0.99 +0.84,-0.10,0.17,0.50,4.21,7.79,0.99 +0.84,-0.10,0.17,0.50,4.21,7.79,1.00 +0.84,-0.10,0.17,0.50,4.20,7.79,1.00 +0.84,-0.10,0.17,0.50,4.20,7.79,1.00 +0.84,-0.10,0.17,0.50,4.20,7.79,1.00 +0.84,-0.10,0.17,0.50,4.20,7.79,1.00 +0.84,-0.10,0.17,0.50,4.19,7.80,1.00 +0.84,-0.10,0.17,0.50,4.19,7.80,1.00 +0.84,-0.10,0.18,0.50,4.19,7.80,1.01 +0.84,-0.11,0.18,0.50,4.19,7.80,1.01 +0.84,-0.11,0.18,0.50,4.18,7.80,1.01 +0.84,-0.11,0.18,0.51,4.18,7.80,1.01 +0.84,-0.11,0.18,0.51,4.18,7.80,1.01 +0.84,-0.11,0.18,0.51,4.17,7.81,1.01 +0.84,-0.11,0.18,0.51,4.17,7.81,1.01 +0.84,-0.11,0.18,0.51,4.17,7.81,1.02 +0.84,-0.11,0.18,0.51,4.17,7.81,1.02 +0.84,-0.11,0.18,0.51,4.16,7.81,1.02 +0.83,-0.11,0.18,0.51,4.16,7.81,1.02 +0.83,-0.11,0.18,0.51,4.16,7.82,1.02 +0.83,-0.11,0.18,0.51,4.16,7.82,1.02 +0.83,-0.11,0.18,0.51,4.15,7.82,1.03 +0.83,-0.11,0.18,0.51,4.15,7.82,1.03 +0.83,-0.11,0.18,0.51,4.15,7.82,1.03 +0.83,-0.11,0.18,0.51,4.14,7.82,1.03 +0.83,-0.11,0.18,0.52,4.14,7.82,1.03 +0.83,-0.11,0.18,0.52,4.14,7.83,1.03 +0.83,-0.11,0.18,0.52,4.14,7.83,1.03 +0.83,-0.11,0.18,0.52,4.13,7.83,1.04 +0.83,-0.11,0.18,0.52,4.13,7.83,1.04 +0.83,-0.11,0.18,0.52,4.13,7.83,1.04 +0.83,-0.11,0.18,0.52,4.13,7.83,1.04 +0.83,-0.11,0.18,0.52,4.12,7.83,1.04 +0.83,-0.11,0.18,0.52,4.12,7.84,1.04 +0.83,-0.11,0.18,0.52,4.12,7.84,1.04 +0.83,-0.11,0.18,0.52,4.11,7.84,1.05 +0.82,-0.11,0.18,0.52,4.11,7.84,1.05 +0.82,-0.11,0.18,0.52,4.11,7.84,1.05 +0.82,-0.12,0.18,0.52,4.11,7.84,1.05 +0.82,-0.12,0.18,0.53,4.10,7.85,1.05 +0.82,-0.12,0.18,0.53,4.10,7.85,1.05 +0.82,-0.12,0.18,0.53,4.10,7.85,1.05 +0.82,-0.12,0.18,0.53,4.09,7.85,1.06 +0.82,-0.12,0.18,0.53,4.09,7.85,1.06 +0.82,-0.12,0.18,0.53,4.09,7.85,1.06 +0.82,-0.12,0.18,0.53,4.09,7.85,1.06 +0.82,-0.12,0.18,0.53,4.08,7.86,1.06 +0.82,-0.12,0.18,0.53,4.08,7.86,1.06 +0.82,-0.12,0.18,0.53,4.08,7.86,1.06 +0.82,-0.12,0.18,0.53,4.07,7.86,1.07 +0.82,-0.12,0.18,0.53,4.07,7.86,1.07 +0.82,-0.12,0.18,0.53,4.07,7.86,1.07 +0.82,-0.12,0.18,0.53,4.07,7.86,1.07 +0.82,-0.12,0.18,0.54,4.06,7.87,1.07 +0.82,-0.12,0.18,0.54,4.06,7.87,1.07 +0.81,-0.12,0.18,0.54,4.06,7.87,1.07 +0.81,-0.12,0.18,0.54,4.05,7.87,1.08 +0.81,-0.12,0.18,0.54,4.05,7.87,1.08 +0.81,-0.12,0.18,0.54,4.05,7.87,1.08 +0.81,-0.12,0.18,0.54,4.05,7.87,1.08 +0.81,-0.12,0.18,0.54,4.04,7.87,1.08 +0.81,-0.12,0.18,0.54,4.04,7.88,1.08 +0.81,-0.12,0.19,0.54,4.04,7.88,1.08 +0.81,-0.12,0.19,0.54,4.03,7.88,1.08 +0.81,-0.12,0.19,0.54,4.03,7.88,1.09 +0.81,-0.12,0.19,0.54,4.03,7.88,1.09 +0.81,-0.13,0.19,0.54,4.03,7.88,1.09 +0.81,-0.13,0.19,0.55,4.02,7.88,1.09 +0.81,-0.13,0.19,0.55,4.02,7.89,1.09 +0.81,-0.13,0.19,0.55,4.02,7.89,1.09 +0.81,-0.13,0.19,0.55,4.01,7.89,1.09 +0.81,-0.13,0.19,0.55,4.01,7.89,1.10 +0.80,-0.13,0.19,0.55,4.01,7.89,1.10 +0.80,-0.13,0.19,0.55,4.01,7.89,1.10 +0.80,-0.13,0.19,0.55,4.00,7.89,1.10 +0.80,-0.13,0.19,0.55,4.00,7.89,1.10 +0.80,-0.13,0.19,0.55,4.00,7.90,1.10 +0.80,-0.13,0.19,0.55,3.99,7.90,1.10 +0.80,-0.13,0.19,0.55,3.99,7.90,1.11 +0.80,-0.13,0.19,0.55,3.99,7.90,1.11 +0.80,-0.13,0.19,0.55,3.99,7.90,1.11 +0.80,-0.13,0.19,0.55,3.98,7.90,1.11 +0.80,-0.13,0.19,0.56,3.98,7.90,1.11 +0.80,-0.13,0.19,0.56,3.98,7.91,1.11 +0.80,-0.13,0.19,0.56,3.97,7.91,1.11 +0.80,-0.13,0.19,0.56,3.97,7.91,1.12 +0.80,-0.13,0.19,0.56,3.97,7.91,1.12 +0.80,-0.13,0.19,0.56,3.97,7.91,1.12 +0.80,-0.13,0.19,0.56,3.96,7.91,1.12 +0.80,-0.13,0.19,0.56,3.96,7.91,1.12 +0.79,-0.13,0.19,0.56,3.96,7.91,1.12 +0.79,-0.13,0.19,0.56,3.95,7.92,1.12 +0.79,-0.13,0.19,0.56,3.95,7.92,1.12 +0.79,-0.13,0.19,0.56,3.95,7.92,1.13 +0.79,-0.14,0.19,0.56,3.94,7.92,1.13 +0.79,-0.14,0.19,0.56,3.94,7.92,1.13 +0.79,-0.14,0.19,0.57,3.94,7.92,1.13 +0.79,-0.14,0.19,0.57,3.94,7.92,1.13 +0.79,-0.14,0.19,0.57,3.93,7.92,1.13 +0.79,-0.14,0.19,0.57,3.93,7.92,1.13 +0.79,-0.14,0.19,0.57,3.93,7.93,1.14 +0.79,-0.14,0.19,0.57,3.92,7.93,1.14 +0.79,-0.14,0.19,0.57,3.92,7.93,1.14 +0.79,-0.14,0.19,0.57,3.92,7.93,1.14 +0.79,-0.14,0.19,0.57,3.91,7.93,1.14 +0.79,-0.14,0.19,0.57,3.91,7.93,1.14 +0.79,-0.14,0.19,0.57,3.91,7.93,1.14 +0.78,-0.14,0.19,0.57,3.91,7.93,1.15 +0.78,-0.14,0.19,0.57,3.90,7.94,1.15 +0.78,-0.14,0.19,0.57,3.90,7.94,1.15 +0.78,-0.14,0.19,0.57,3.90,7.94,1.15 +0.78,-0.14,0.19,0.58,3.89,7.94,1.15 +0.78,-0.14,0.19,0.58,3.89,7.94,1.15 +0.78,-0.14,0.19,0.58,3.89,7.94,1.15 +0.78,-0.14,0.19,0.58,3.88,7.94,1.15 +0.78,-0.14,0.19,0.58,3.88,7.94,1.16 +0.78,-0.14,0.19,0.58,3.88,7.94,1.16 +0.78,-0.14,0.19,0.58,3.88,7.95,1.16 +0.78,-0.14,0.19,0.58,3.87,7.95,1.16 +0.78,-0.14,0.19,0.58,3.87,7.95,1.16 +0.78,-0.15,0.19,0.58,3.87,7.95,1.16 +0.78,-0.15,0.19,0.58,3.86,7.95,1.16 +0.78,-0.15,0.19,0.58,3.86,7.95,1.17 +0.78,-0.15,0.19,0.58,3.86,7.95,1.17 +0.77,-0.15,0.19,0.58,3.85,7.95,1.17 +0.77,-0.15,0.19,0.58,3.85,7.95,1.17 +0.77,-0.15,0.19,0.59,3.85,7.96,1.17 +0.77,-0.15,0.19,0.59,3.84,7.96,1.17 +0.77,-0.15,0.20,0.59,3.84,7.96,1.17 +0.77,-0.15,0.20,0.59,3.84,7.96,1.17 +0.77,-0.15,0.20,0.59,3.84,7.96,1.18 +0.77,-0.15,0.20,0.59,3.83,7.96,1.18 +0.77,-0.15,0.20,0.59,3.83,7.96,1.18 +0.77,-0.15,0.20,0.59,3.83,7.96,1.18 +0.77,-0.15,0.20,0.59,3.82,7.96,1.18 +0.77,-0.15,0.20,0.59,3.82,7.97,1.18 +0.77,-0.15,0.20,0.59,3.82,7.97,1.18 +0.77,-0.15,0.20,0.59,3.81,7.97,1.18 +0.77,-0.15,0.20,0.59,3.81,7.97,1.19 +0.77,-0.15,0.20,0.59,3.81,7.97,1.19 +0.76,-0.15,0.20,0.59,3.80,7.97,1.19 +0.76,-0.15,0.20,0.59,3.80,7.97,1.19 +0.76,-0.15,0.20,0.60,3.80,7.97,1.19 +0.76,-0.15,0.20,0.60,3.80,7.97,1.19 +0.76,-0.15,0.20,0.60,3.79,7.97,1.19 +0.76,-0.15,0.20,0.60,3.79,7.98,1.20 +0.76,-0.16,0.20,0.60,3.79,7.98,1.20 +0.76,-0.16,0.20,0.60,3.78,7.98,1.20 +0.76,-0.16,0.20,0.60,3.78,7.98,1.20 +0.76,-0.16,0.20,0.60,3.78,7.98,1.20 +0.76,-0.16,0.20,0.60,3.77,7.98,1.20 +0.76,-0.16,0.20,0.60,3.77,7.98,1.20 +0.76,-0.16,0.20,0.60,3.77,7.98,1.20 +0.76,-0.16,0.20,0.60,3.76,7.98,1.21 +0.76,-0.16,0.20,0.60,3.76,7.98,1.21 +0.76,-0.16,0.20,0.60,3.76,7.98,1.21 +0.75,-0.16,0.20,0.60,3.75,7.99,1.21 +0.75,-0.16,0.20,0.61,3.75,7.99,1.21 +0.75,-0.16,0.20,0.61,3.75,7.99,1.21 +0.75,-0.16,0.20,0.61,3.75,7.99,1.21 +0.75,-0.16,0.20,0.61,3.74,7.99,1.21 +0.75,-0.16,0.20,0.61,3.74,7.99,1.22 +0.75,-0.16,0.20,0.61,3.74,7.99,1.22 +0.75,-0.16,0.20,0.61,3.73,7.99,1.22 +0.75,-0.16,0.20,0.61,3.73,7.99,1.22 +0.75,-0.16,0.20,0.61,3.73,7.99,1.22 +0.75,-0.16,0.20,0.61,3.72,7.99,1.22 +0.75,-0.16,0.20,0.61,3.72,8.00,1.22 +0.75,-0.16,0.20,0.61,3.72,8.00,1.22 +0.75,-0.16,0.20,0.61,3.71,8.00,1.23 +0.75,-0.16,0.20,0.61,3.71,8.00,1.23 +0.75,-0.16,0.20,0.61,3.71,8.00,1.23 +0.74,-0.17,0.20,0.61,3.70,8.00,1.23 +0.74,-0.17,0.20,0.62,3.70,8.00,1.23 +0.74,-0.17,0.20,0.62,3.70,8.00,1.23 +0.74,-0.17,0.20,0.62,3.69,8.00,1.23 +0.74,-0.17,0.20,0.62,3.69,8.00,1.23 +0.74,-0.17,0.20,0.62,3.69,8.00,1.24 +0.74,-0.17,0.20,0.62,3.68,8.01,1.24 +0.74,-0.17,0.20,0.62,3.68,8.01,1.24 +0.74,-0.17,0.20,0.62,3.68,8.01,1.24 +0.74,-0.17,0.20,0.62,3.68,8.01,1.24 +0.74,-0.17,0.20,0.62,3.67,8.01,1.24 +0.74,-0.17,0.20,0.62,3.67,8.01,1.24 +0.74,-0.17,0.20,0.62,3.67,8.01,1.24 +0.74,-0.17,0.20,0.62,3.66,8.01,1.25 +0.74,-0.17,0.20,0.62,3.66,8.01,1.25 +0.74,-0.17,0.20,0.62,3.66,8.01,1.25 +0.73,-0.17,0.20,0.62,3.65,8.01,1.25 +0.73,-0.17,0.20,0.63,3.65,8.01,1.25 +0.73,-0.17,0.20,0.63,3.65,8.02,1.25 +0.73,-0.17,0.20,0.63,3.64,8.02,1.25 +0.73,-0.17,0.20,0.63,3.64,8.02,1.25 +0.73,-0.17,0.20,0.63,3.64,8.02,1.26 +0.73,-0.17,0.20,0.63,3.63,8.02,1.26 +0.73,-0.17,0.20,0.63,3.63,8.02,1.26 +0.73,-0.18,0.20,0.63,3.63,8.02,1.26 +0.73,-0.18,0.20,0.63,3.62,8.02,1.26 +0.73,-0.18,0.20,0.63,3.62,8.02,1.26 +0.73,-0.18,0.20,0.63,3.62,8.02,1.26 +0.73,-0.18,0.20,0.63,3.61,8.02,1.26 +0.73,-0.18,0.20,0.63,3.61,8.02,1.26 +0.73,-0.18,0.20,0.63,3.61,8.02,1.27 +0.72,-0.18,0.20,0.63,3.60,8.02,1.27 +0.72,-0.18,0.20,0.63,3.60,8.03,1.27 +0.72,-0.18,0.20,0.63,3.60,8.03,1.27 +0.72,-0.18,0.20,0.64,3.59,8.03,1.27 +0.72,-0.18,0.20,0.64,3.59,8.03,1.27 +0.72,-0.18,0.20,0.64,3.59,8.03,1.27 +0.72,-0.18,0.20,0.64,3.58,8.03,1.27 +0.72,-0.18,0.20,0.64,3.58,8.03,1.28 +0.72,-0.18,0.20,0.64,3.58,8.03,1.28 +0.72,-0.18,0.20,0.64,3.57,8.03,1.28 +0.72,-0.18,0.20,0.64,3.57,8.03,1.28 +0.72,-0.18,0.20,0.64,3.57,8.03,1.28 +0.72,-0.18,0.20,0.64,3.56,8.03,1.28 +0.72,-0.18,0.20,0.64,3.56,8.03,1.28 +0.72,-0.18,0.20,0.64,3.56,8.03,1.28 +0.72,-0.18,0.20,0.64,3.55,8.04,1.29 +0.71,-0.18,0.20,0.64,3.55,8.04,1.29 +0.71,-0.18,0.20,0.64,3.55,8.04,1.29 +0.71,-0.19,0.20,0.64,3.55,8.04,1.29 +0.71,-0.19,0.21,0.64,3.54,8.04,1.29 +0.71,-0.19,0.21,0.65,3.54,8.04,1.29 +0.71,-0.19,0.21,0.65,3.54,8.04,1.29 +0.71,-0.19,0.21,0.65,3.53,8.04,1.29 +0.71,-0.19,0.21,0.65,3.53,8.04,1.29 +0.71,-0.19,0.21,0.65,3.53,8.04,1.30 +0.71,-0.19,0.21,0.65,3.52,8.04,1.30 +0.71,-0.19,0.21,0.65,3.52,8.04,1.30 +0.71,-0.19,0.21,0.65,3.52,8.04,1.30 +0.71,-0.19,0.21,0.65,3.51,8.04,1.30 +0.71,-0.19,0.21,0.65,3.51,8.04,1.30 +0.71,-0.19,0.21,0.65,3.51,8.04,1.30 +0.70,-0.19,0.21,0.65,3.50,8.04,1.30 +0.70,-0.19,0.21,0.65,3.50,8.05,1.31 +0.70,-0.19,0.21,0.65,3.50,8.05,1.31 +0.70,-0.19,0.21,0.65,3.49,8.05,1.31 +0.70,-0.19,0.21,0.65,3.49,8.05,1.31 +0.70,-0.19,0.21,0.65,3.49,8.05,1.31 +0.70,-0.19,0.21,0.66,3.48,8.05,1.31 +0.70,-0.19,0.21,0.66,3.48,8.05,1.31 +0.70,-0.19,0.21,0.66,3.48,8.05,1.31 +0.70,-0.19,0.21,0.66,3.47,8.05,1.31 +0.70,-0.19,0.21,0.66,3.47,8.05,1.32 +0.70,-0.20,0.21,0.66,3.47,8.05,1.32 +0.70,-0.20,0.21,0.66,3.46,8.05,1.32 +0.70,-0.20,0.21,0.66,3.46,8.05,1.32 +0.69,-0.20,0.21,0.66,3.46,8.05,1.32 +0.69,-0.20,0.21,0.66,3.45,8.05,1.32 +0.69,-0.20,0.21,0.66,3.45,8.05,1.32 +0.69,-0.20,0.21,0.66,3.45,8.05,1.32 +0.69,-0.20,0.21,0.66,3.44,8.05,1.32 +0.69,-0.20,0.21,0.66,3.44,8.05,1.33 +0.69,-0.20,0.21,0.66,3.43,8.06,1.33 +0.69,-0.20,0.21,0.66,3.43,8.06,1.33 +0.69,-0.20,0.21,0.66,3.43,8.06,1.33 +0.69,-0.20,0.21,0.67,3.42,8.06,1.33 +0.69,-0.20,0.21,0.67,3.42,8.06,1.33 +0.69,-0.20,0.21,0.67,3.42,8.06,1.33 +0.69,-0.20,0.21,0.67,3.41,8.06,1.33 +0.69,-0.20,0.21,0.67,3.41,8.06,1.33 +0.69,-0.20,0.21,0.67,3.41,8.06,1.34 +0.68,-0.20,0.21,0.67,3.40,8.06,1.34 +0.68,-0.20,0.21,0.67,3.40,8.06,1.34 +0.68,-0.20,0.21,0.67,3.40,8.06,1.34 +0.68,-0.20,0.21,0.67,3.39,8.06,1.34 +0.68,-0.20,0.21,0.67,3.39,8.06,1.34 +0.68,-0.20,0.21,0.67,3.39,8.06,1.34 +0.68,-0.21,0.21,0.67,3.38,8.06,1.34 +0.68,-0.21,0.21,0.67,3.38,8.06,1.34 +0.68,-0.21,0.21,0.67,3.38,8.06,1.35 +0.68,-0.21,0.21,0.67,3.37,8.06,1.35 +0.68,-0.21,0.21,0.67,3.37,8.06,1.35 +0.68,-0.21,0.21,0.67,3.37,8.06,1.35 +0.68,-0.21,0.21,0.68,3.36,8.06,1.35 +0.68,-0.21,0.21,0.68,3.36,8.06,1.35 +0.68,-0.21,0.21,0.68,3.36,8.06,1.35 +0.67,-0.21,0.21,0.68,3.35,8.07,1.35 +0.67,-0.21,0.21,0.68,3.35,8.07,1.35 +0.67,-0.21,0.21,0.68,3.35,8.07,1.36 +0.67,-0.21,0.21,0.68,3.34,8.07,1.36 +0.67,-0.21,0.21,0.68,3.34,8.07,1.36 +0.67,-0.21,0.21,0.68,3.34,8.07,1.36 +0.67,-0.21,0.21,0.68,3.33,8.07,1.36 +0.67,-0.21,0.21,0.68,3.33,8.07,1.36 +0.67,-0.21,0.21,0.68,3.33,8.07,1.36 +0.67,-0.21,0.21,0.68,3.32,8.07,1.36 +0.67,-0.21,0.21,0.68,3.32,8.07,1.36 +0.67,-0.21,0.21,0.68,3.32,8.07,1.37 +0.67,-0.21,0.21,0.68,3.31,8.07,1.37 +0.67,-0.21,0.21,0.68,3.31,8.07,1.37 +0.66,-0.22,0.21,0.68,3.31,8.07,1.37 +0.66,-0.22,0.21,0.68,3.30,8.07,1.37 +0.66,-0.22,0.21,0.69,3.30,8.07,1.37 +0.66,-0.22,0.21,0.69,3.30,8.07,1.37 +0.66,-0.22,0.21,0.69,3.29,8.07,1.37 +0.66,-0.22,0.21,0.69,3.29,8.07,1.37 +0.66,-0.22,0.21,0.69,3.28,8.07,1.37 +0.66,-0.22,0.21,0.69,3.28,8.07,1.38 +0.66,-0.22,0.21,0.69,3.28,8.07,1.38 +0.66,-0.22,0.21,0.69,3.27,8.07,1.38 +0.66,-0.22,0.21,0.69,3.27,8.07,1.38 +0.66,-0.22,0.21,0.69,3.27,8.07,1.38 +0.66,-0.22,0.21,0.69,3.26,8.07,1.38 +0.66,-0.22,0.21,0.69,3.26,8.07,1.38 +0.65,-0.22,0.21,0.69,3.26,8.07,1.38 +0.65,-0.22,0.21,0.69,3.25,8.07,1.38 +0.65,-0.22,0.21,0.69,3.25,8.07,1.39 +0.65,-0.22,0.21,0.69,3.25,8.07,1.39 +0.65,-0.22,0.21,0.69,3.24,8.07,1.39 +0.65,-0.22,0.21,0.69,3.24,8.07,1.39 +0.65,-0.22,0.21,0.69,3.24,8.07,1.39 +0.65,-0.22,0.21,0.70,3.23,8.07,1.39 +0.65,-0.22,0.21,0.70,3.23,8.07,1.39 +0.65,-0.23,0.21,0.70,3.23,8.07,1.39 +0.65,-0.23,0.21,0.70,3.22,8.07,1.39 +0.65,-0.23,0.21,0.70,3.22,8.07,1.39 +0.65,-0.23,0.21,0.70,3.22,8.08,1.40 +0.65,-0.23,0.21,0.70,3.21,8.08,1.40 +0.64,-0.23,0.21,0.70,3.21,8.08,1.40 +0.64,-0.23,0.21,0.70,3.20,8.08,1.40 +0.64,-0.23,0.21,0.70,3.20,8.08,1.40 +0.64,-0.23,0.21,0.70,3.20,8.08,1.40 +0.64,-0.23,0.21,0.70,3.19,8.08,1.40 +0.64,-0.23,0.21,0.70,3.19,8.08,1.40 +0.64,-0.23,0.21,0.70,3.19,8.08,1.40 +0.64,-0.23,0.21,0.70,3.18,8.08,1.40 +0.64,-0.23,0.21,0.70,3.18,8.08,1.41 +0.64,-0.23,0.21,0.70,3.18,8.08,1.41 +0.64,-0.23,0.21,0.70,3.17,8.08,1.41 +0.64,-0.23,0.21,0.70,3.17,8.08,1.41 +0.64,-0.23,0.21,0.70,3.17,8.08,1.41 +0.64,-0.23,0.21,0.71,3.16,8.08,1.41 +0.63,-0.23,0.21,0.71,3.16,8.08,1.41 +0.63,-0.23,0.21,0.71,3.16,8.08,1.41 +0.63,-0.23,0.21,0.71,3.15,8.08,1.41 +0.63,-0.23,0.21,0.71,3.15,8.08,1.41 +0.63,-0.24,0.21,0.71,3.15,8.08,1.42 +0.63,-0.24,0.21,0.71,3.14,8.08,1.42 +0.63,-0.24,0.21,0.71,3.14,8.08,1.42 +0.63,-0.24,0.21,0.71,3.13,8.08,1.42 +0.63,-0.24,0.21,0.71,3.13,8.08,1.42 +0.63,-0.24,0.21,0.71,3.13,8.08,1.42 +0.63,-0.24,0.21,0.71,3.12,8.08,1.42 +0.63,-0.24,0.21,0.71,3.12,8.08,1.42 +0.63,-0.24,0.21,0.71,3.12,8.08,1.42 +0.63,-0.24,0.21,0.71,3.11,8.08,1.42 +0.62,-0.24,0.21,0.71,3.11,8.08,1.43 +0.62,-0.24,0.21,0.71,3.11,8.08,1.43 +0.62,-0.24,0.21,0.71,3.10,8.08,1.43 +0.62,-0.24,0.21,0.71,3.10,8.08,1.43 +0.62,-0.24,0.21,0.71,3.10,8.08,1.43 +0.62,-0.24,0.21,0.72,3.09,8.08,1.43 +0.62,-0.24,0.21,0.72,3.09,8.08,1.43 +0.62,-0.24,0.21,0.72,3.09,8.08,1.43 +0.62,-0.24,0.21,0.72,3.08,8.08,1.43 +0.62,-0.24,0.21,0.72,3.08,8.08,1.43 +0.62,-0.24,0.21,0.72,3.07,8.08,1.44 +0.62,-0.24,0.21,0.72,3.07,8.08,1.44 +0.62,-0.24,0.21,0.72,3.07,8.08,1.44 +0.62,-0.25,0.21,0.72,3.06,8.08,1.44 +0.61,-0.25,0.21,0.72,3.06,8.08,1.44 +0.61,-0.25,0.21,0.72,3.06,8.08,1.44 +0.61,-0.25,0.21,0.72,3.05,8.08,1.44 +0.61,-0.25,0.21,0.72,3.05,8.08,1.44 +0.61,-0.25,0.21,0.72,3.05,8.08,1.44 +0.61,-0.25,0.21,0.72,3.04,8.08,1.44 +0.61,-0.25,0.21,0.72,3.04,8.08,1.45 +0.61,-0.25,0.21,0.72,3.04,8.08,1.45 +0.61,-0.25,0.21,0.72,3.03,8.08,1.45 +0.61,-0.25,0.21,0.72,3.03,8.08,1.45 +0.61,-0.25,0.21,0.72,3.02,8.08,1.45 +0.61,-0.25,0.21,0.72,3.02,8.08,1.45 +0.61,-0.25,0.21,0.73,3.02,8.07,1.45 +0.60,-0.25,0.21,0.73,3.01,8.07,1.45 +0.60,-0.25,0.21,0.73,3.01,8.07,1.45 +0.60,-0.25,0.21,0.73,3.01,8.07,1.45 +0.60,-0.25,0.21,0.73,3.00,8.07,1.45 +0.60,-0.25,0.21,0.73,3.00,8.07,1.46 +0.60,-0.25,0.21,0.73,3.00,8.07,1.46 +0.60,-0.25,0.21,0.73,2.99,8.07,1.46 +0.60,-0.25,0.21,0.73,2.99,8.07,1.46 +0.60,-0.26,0.21,0.73,2.99,8.07,1.46 +0.60,-0.26,0.21,0.73,2.98,8.07,1.46 +0.60,-0.26,0.21,0.73,2.98,8.07,1.46 +0.60,-0.26,0.21,0.73,2.98,8.07,1.46 +0.60,-0.26,0.21,0.73,2.97,8.07,1.46 +0.60,-0.26,0.21,0.73,2.97,8.07,1.46 +0.59,-0.26,0.21,0.73,2.96,8.07,1.46 +0.59,-0.26,0.21,0.73,2.96,8.07,1.47 +0.59,-0.26,0.21,0.73,2.96,8.07,1.47 +0.59,-0.26,0.21,0.73,2.95,8.07,1.47 +0.59,-0.26,0.21,0.73,2.95,8.07,1.47 +0.59,-0.26,0.21,0.73,2.95,8.07,1.47 +0.59,-0.26,0.21,0.73,2.94,8.07,1.47 +0.59,-0.26,0.21,0.74,2.94,8.07,1.47 +0.59,-0.26,0.21,0.74,2.94,8.07,1.47 +0.59,-0.26,0.21,0.74,2.93,8.07,1.47 +0.59,-0.26,0.21,0.74,2.93,8.07,1.47 +0.59,-0.26,0.21,0.74,2.92,8.07,1.47 +0.59,-0.26,0.21,0.74,2.92,8.07,1.48 +0.58,-0.26,0.21,0.74,2.92,8.07,1.48 +0.58,-0.26,0.21,0.74,2.91,8.07,1.48 +0.58,-0.26,0.21,0.74,2.91,8.07,1.48 +0.58,-0.27,0.21,0.74,2.91,8.07,1.48 +0.58,-0.27,0.21,0.74,2.90,8.07,1.48 +0.58,-0.27,0.21,0.74,2.90,8.07,1.48 +0.58,-0.27,0.21,0.74,2.90,8.07,1.48 +0.58,-0.27,0.21,0.74,2.89,8.07,1.48 +0.58,-0.27,0.21,0.74,2.89,8.07,1.48 +0.58,-0.27,0.21,0.74,2.89,8.07,1.48 +0.58,-0.27,0.21,0.74,2.88,8.07,1.48 +0.58,-0.27,0.21,0.74,2.88,8.07,1.49 +0.58,-0.27,0.21,0.74,2.87,8.06,1.49 +0.58,-0.27,0.21,0.74,2.87,8.06,1.49 +0.57,-0.27,0.21,0.74,2.87,8.06,1.49 +0.57,-0.27,0.21,0.74,2.86,8.06,1.49 +0.57,-0.27,0.21,0.75,2.86,8.06,1.49 +0.57,-0.27,0.21,0.75,2.86,8.06,1.49 +0.57,-0.27,0.21,0.75,2.85,8.06,1.49 +0.57,-0.27,0.21,0.75,2.85,8.06,1.49 +0.57,-0.27,0.21,0.75,2.85,8.06,1.49 +0.57,-0.27,0.21,0.75,2.84,8.06,1.49 +0.57,-0.27,0.21,0.75,2.84,8.06,1.50 +0.57,-0.27,0.21,0.75,2.83,8.06,1.50 +0.57,-0.27,0.21,0.75,2.83,8.06,1.50 +0.57,-0.27,0.21,0.75,2.83,8.06,1.50 +0.57,-0.28,0.21,0.75,2.82,8.06,1.50 +0.56,-0.28,0.21,0.75,2.82,8.06,1.50 +0.56,-0.28,0.21,0.75,2.82,8.06,1.50 +0.56,-0.28,0.21,0.75,2.81,8.06,1.50 +0.56,-0.28,0.21,0.75,2.81,8.06,1.50 +0.56,-0.28,0.21,0.75,2.81,8.06,1.50 +0.56,-0.28,0.21,0.75,2.80,8.06,1.50 +0.56,-0.28,0.21,0.75,2.80,8.06,1.50 +0.56,-0.28,0.21,0.75,2.80,8.06,1.51 +0.56,-0.28,0.21,0.75,2.79,8.05,1.51 +0.56,-0.28,0.21,0.75,2.79,8.05,1.51 +0.56,-0.28,0.21,0.75,2.78,8.05,1.51 +0.56,-0.28,0.21,0.75,2.78,8.05,1.51 +0.56,-0.28,0.21,0.75,2.78,8.05,1.51 +0.55,-0.28,0.21,0.76,2.77,8.05,1.51 +0.55,-0.28,0.21,0.76,2.77,8.05,1.51 +0.55,-0.28,0.21,0.76,2.77,8.05,1.51 +0.55,-0.28,0.21,0.76,2.76,8.05,1.51 +0.55,-0.28,0.21,0.76,2.76,8.05,1.51 +0.55,-0.28,0.21,0.76,2.76,8.05,1.51 +0.55,-0.28,0.21,0.76,2.75,8.05,1.52 +0.55,-0.28,0.21,0.76,2.75,8.05,1.52 +0.55,-0.29,0.21,0.76,2.74,8.05,1.52 +0.55,-0.29,0.21,0.76,2.74,8.05,1.52 +0.55,-0.29,0.21,0.76,2.74,8.05,1.52 +0.55,-0.29,0.21,0.76,2.73,8.05,1.52 +0.55,-0.29,0.21,0.76,2.73,8.05,1.52 +0.54,-0.29,0.21,0.76,2.73,8.05,1.52 +0.54,-0.29,0.21,0.76,2.72,8.04,1.52 +0.54,-0.29,0.21,0.76,2.72,8.04,1.52 +0.54,-0.29,0.21,0.76,2.72,8.04,1.52 +0.54,-0.29,0.21,0.76,2.71,8.04,1.52 +0.54,-0.29,0.21,0.76,2.71,8.04,1.52 +0.54,-0.29,0.21,0.76,2.70,8.04,1.53 +0.54,-0.29,0.21,0.76,2.70,8.04,1.53 +0.54,-0.29,0.21,0.76,2.70,8.04,1.53 +0.54,-0.29,0.21,0.76,2.69,8.04,1.53 +0.54,-0.29,0.21,0.76,2.69,8.04,1.53 +0.54,-0.29,0.21,0.76,2.69,8.04,1.53 +0.54,-0.29,0.21,0.77,2.68,8.04,1.53 +0.53,-0.29,0.20,0.77,2.68,8.04,1.53 +0.53,-0.29,0.20,0.77,2.68,8.04,1.53 +0.53,-0.29,0.20,0.77,2.67,8.04,1.53 +0.53,-0.29,0.20,0.77,2.67,8.04,1.53 +0.53,-0.30,0.20,0.77,2.66,8.03,1.53 +0.53,-0.30,0.20,0.77,2.66,8.03,1.53 +0.53,-0.30,0.20,0.77,2.66,8.03,1.54 +0.53,-0.30,0.20,0.77,2.65,8.03,1.54 +0.53,-0.30,0.20,0.77,2.65,8.03,1.54 +0.53,-0.30,0.20,0.77,2.65,8.03,1.54 +0.53,-0.30,0.20,0.77,2.64,8.03,1.54 +0.53,-0.30,0.20,0.77,2.64,8.03,1.54 +0.53,-0.30,0.20,0.77,2.64,8.03,1.54 +0.52,-0.30,0.20,0.77,2.63,8.03,1.54 +0.52,-0.30,0.20,0.77,2.63,8.03,1.54 +0.52,-0.30,0.20,0.77,2.62,8.03,1.54 +0.52,-0.30,0.20,0.77,2.62,8.03,1.54 +0.52,-0.30,0.20,0.77,2.62,8.03,1.54 +0.52,-0.30,0.20,0.77,2.61,8.02,1.54 +0.52,-0.30,0.20,0.77,2.61,8.02,1.55 +0.52,-0.30,0.20,0.77,2.61,8.02,1.55 +0.52,-0.30,0.20,0.77,2.60,8.02,1.55 +0.52,-0.30,0.20,0.77,2.60,8.02,1.55 +0.52,-0.30,0.20,0.77,2.59,8.02,1.55 +0.52,-0.30,0.20,0.77,2.59,8.02,1.55 +0.52,-0.30,0.20,0.77,2.59,8.02,1.55 +0.51,-0.31,0.20,0.78,2.58,8.02,1.55 +0.51,-0.31,0.20,0.78,2.58,8.02,1.55 +0.51,-0.31,0.20,0.78,2.58,8.02,1.55 +0.51,-0.31,0.20,0.78,2.57,8.02,1.55 +0.51,-0.31,0.20,0.78,2.57,8.01,1.55 +0.51,-0.31,0.20,0.78,2.57,8.01,1.55 +0.51,-0.31,0.20,0.78,2.56,8.01,1.55 +0.51,-0.31,0.20,0.78,2.56,8.01,1.56 +0.51,-0.31,0.20,0.78,2.55,8.01,1.56 +0.51,-0.31,0.20,0.78,2.55,8.01,1.56 +0.51,-0.31,0.20,0.78,2.55,8.01,1.56 +0.51,-0.31,0.20,0.78,2.54,8.01,1.56 +0.50,-0.31,0.20,0.78,2.54,8.01,1.56 +0.50,-0.31,0.20,0.78,2.54,8.01,1.56 +0.50,-0.31,0.20,0.78,2.53,8.01,1.56 +0.50,-0.31,0.20,0.78,2.53,8.01,1.56 +0.50,-0.31,0.20,0.78,2.53,8.00,1.56 +0.50,-0.31,0.20,0.78,2.52,8.00,1.56 +0.50,-0.31,0.20,0.78,2.52,8.00,1.56 +0.50,-0.31,0.20,0.78,2.51,8.00,1.56 +0.50,-0.31,0.20,0.78,2.51,8.00,1.56 +0.50,-0.31,0.20,0.78,2.51,8.00,1.57 +0.50,-0.32,0.20,0.78,2.50,8.00,1.57 +0.50,-0.32,0.20,0.78,2.50,8.00,1.57 +0.50,-0.32,0.20,0.78,2.50,8.00,1.57 +0.49,-0.32,0.20,0.78,2.49,8.00,1.57 +0.49,-0.32,0.20,0.78,2.49,8.00,1.57 +0.49,-0.32,0.20,0.78,2.49,7.99,1.57 +0.49,-0.32,0.20,0.79,2.48,7.99,1.57 +0.49,-0.32,0.20,0.79,2.48,7.99,1.57 +0.49,-0.32,0.20,0.79,2.47,7.99,1.57 +0.49,-0.32,0.20,0.79,2.47,7.99,1.57 +0.49,-0.32,0.20,0.79,2.47,7.99,1.57 +0.49,-0.32,0.20,0.79,2.46,7.99,1.57 +0.49,-0.32,0.20,0.79,2.46,7.99,1.57 +0.49,-0.32,0.20,0.79,2.46,7.99,1.58 +0.49,-0.32,0.20,0.79,2.45,7.99,1.58 +0.49,-0.32,0.20,0.79,2.45,7.98,1.58 +0.48,-0.32,0.20,0.79,2.45,7.98,1.58 +0.48,-0.32,0.20,0.79,2.44,7.98,1.58 +0.48,-0.32,0.20,0.79,2.44,7.98,1.58 +0.48,-0.32,0.20,0.79,2.43,7.98,1.58 +0.48,-0.32,0.20,0.79,2.43,7.98,1.58 +0.48,-0.33,0.20,0.79,2.43,7.98,1.58 +0.48,-0.33,0.20,0.79,2.42,7.98,1.58 +0.48,-0.33,0.20,0.79,2.42,7.98,1.58 +0.48,-0.33,0.20,0.79,2.42,7.98,1.58 +0.48,-0.33,0.20,0.79,2.41,7.97,1.58 +0.48,-0.33,0.20,0.79,2.41,7.97,1.58 +0.48,-0.33,0.20,0.79,2.40,7.97,1.58 +0.47,-0.33,0.20,0.79,2.40,7.97,1.58 +0.47,-0.33,0.20,0.79,2.40,7.97,1.59 +0.47,-0.33,0.20,0.79,2.39,7.97,1.59 +0.47,-0.33,0.20,0.79,2.39,7.97,1.59 +0.47,-0.33,0.20,0.79,2.39,7.97,1.59 +0.47,-0.33,0.20,0.79,2.38,7.97,1.59 +0.47,-0.33,0.20,0.79,2.38,7.96,1.59 +0.47,-0.33,0.20,0.79,2.38,7.96,1.59 +0.47,-0.33,0.20,0.79,2.37,7.96,1.59 +0.47,-0.33,0.20,0.80,2.37,7.96,1.59 +0.47,-0.33,0.20,0.80,2.36,7.96,1.59 +0.47,-0.33,0.20,0.80,2.36,7.96,1.59 +0.47,-0.33,0.20,0.80,2.36,7.96,1.59 +0.46,-0.33,0.19,0.80,2.35,7.96,1.59 +0.46,-0.33,0.19,0.80,2.35,7.96,1.59 +0.46,-0.34,0.19,0.80,2.35,7.95,1.59 +0.46,-0.34,0.19,0.80,2.34,7.95,1.59 +0.46,-0.34,0.19,0.80,2.34,7.95,1.60 +0.46,-0.34,0.19,0.80,2.34,7.95,1.60 +0.46,-0.34,0.19,0.80,2.33,7.95,1.60 +0.46,-0.34,0.19,0.80,2.33,7.95,1.60 +0.46,-0.34,0.19,0.80,2.32,7.95,1.60 +0.46,-0.34,0.19,0.80,2.32,7.95,1.60 +0.46,-0.34,0.19,0.80,2.32,7.94,1.60 +0.46,-0.34,0.19,0.80,2.31,7.94,1.60 +0.46,-0.34,0.19,0.80,2.31,7.94,1.60 +0.45,-0.34,0.19,0.80,2.31,7.94,1.60 +0.45,-0.34,0.19,0.80,2.30,7.94,1.60 +0.45,-0.34,0.19,0.80,2.30,7.94,1.60 +0.45,-0.34,0.19,0.80,2.30,7.94,1.60 +0.45,-0.34,0.19,0.80,2.29,7.94,1.60 +0.45,-0.34,0.19,0.80,2.29,7.93,1.60 +0.45,-0.34,0.19,0.80,2.28,7.93,1.60 +0.45,-0.34,0.19,0.80,2.28,7.93,1.61 +0.45,-0.34,0.19,0.80,2.28,7.93,1.61 +0.45,-0.34,0.19,0.80,2.27,7.93,1.61 +0.45,-0.34,0.19,0.80,2.27,7.93,1.61 +0.45,-0.35,0.19,0.80,2.27,7.93,1.61 +0.44,-0.35,0.19,0.80,2.26,7.93,1.61 +0.44,-0.35,0.19,0.80,2.26,7.92,1.61 +0.44,-0.35,0.19,0.80,2.26,7.92,1.61 +0.44,-0.35,0.19,0.80,2.25,7.92,1.61 +0.44,-0.35,0.19,0.81,2.25,7.92,1.61 +0.44,-0.35,0.19,0.81,2.24,7.92,1.61 +0.44,-0.35,0.19,0.81,2.24,7.92,1.61 +0.44,-0.35,0.19,0.81,2.24,7.92,1.61 +0.44,-0.35,0.19,0.81,2.23,7.92,1.61 +0.44,-0.35,0.19,0.81,2.23,7.91,1.61 +0.44,-0.35,0.19,0.81,2.23,7.91,1.61 +0.44,-0.35,0.19,0.81,2.22,7.91,1.61 +0.43,-0.35,0.19,0.81,2.22,7.91,1.61 +0.43,-0.35,0.19,0.81,2.22,7.91,1.62 +0.43,-0.35,0.19,0.81,2.21,7.91,1.62 +0.43,-0.35,0.19,0.81,2.21,7.91,1.62 +0.43,-0.35,0.19,0.81,2.20,7.90,1.62 +0.43,-0.35,0.19,0.81,2.20,7.90,1.62 +0.43,-0.35,0.19,0.81,2.20,7.90,1.62 +0.43,-0.35,0.19,0.81,2.19,7.90,1.62 +0.43,-0.35,0.19,0.81,2.19,7.90,1.62 +0.43,-0.36,0.19,0.81,2.19,7.90,1.62 +0.43,-0.36,0.19,0.81,2.18,7.90,1.62 +0.43,-0.36,0.19,0.81,2.18,7.89,1.62 +0.43,-0.36,0.19,0.81,2.18,7.89,1.62 +0.42,-0.36,0.19,0.81,2.17,7.89,1.62 +0.42,-0.36,0.19,0.81,2.17,7.89,1.62 +0.42,-0.36,0.19,0.81,2.16,7.89,1.62 +0.42,-0.36,0.19,0.81,2.16,7.89,1.62 +0.42,-0.36,0.19,0.81,2.16,7.89,1.62 +0.42,-0.36,0.19,0.81,2.15,7.88,1.62 +0.42,-0.36,0.19,0.81,2.15,7.88,1.62 +0.42,-0.36,0.19,0.81,2.15,7.88,1.63 +0.42,-0.36,0.19,0.81,2.14,7.88,1.63 +0.42,-0.36,0.19,0.81,2.14,7.88,1.63 +0.42,-0.36,0.19,0.81,2.14,7.88,1.63 +0.42,-0.36,0.18,0.81,2.13,7.88,1.63 +0.41,-0.36,0.18,0.81,2.13,7.87,1.63 +0.41,-0.36,0.18,0.81,2.12,7.87,1.63 +0.41,-0.36,0.18,0.81,2.12,7.87,1.63 +0.41,-0.36,0.18,0.81,2.12,7.87,1.63 +0.41,-0.36,0.18,0.81,2.11,7.87,1.63 +0.41,-0.36,0.18,0.82,2.11,7.87,1.63 +0.41,-0.37,0.18,0.82,2.11,7.87,1.63 +0.41,-0.37,0.18,0.82,2.10,7.86,1.63 +0.41,-0.37,0.18,0.82,2.10,7.86,1.63 +0.41,-0.37,0.18,0.82,2.10,7.86,1.63 +0.41,-0.37,0.18,0.82,2.09,7.86,1.63 +0.41,-0.37,0.18,0.82,2.09,7.86,1.63 +0.41,-0.37,0.18,0.82,2.08,7.86,1.63 +0.40,-0.37,0.18,0.82,2.08,7.85,1.63 +0.40,-0.37,0.18,0.82,2.08,7.85,1.63 +0.40,-0.37,0.18,0.82,2.07,7.85,1.64 +0.40,-0.37,0.18,0.82,2.07,7.85,1.64 +0.40,-0.37,0.18,0.82,2.07,7.85,1.64 +0.40,-0.37,0.18,0.82,2.06,7.85,1.64 +0.40,-0.37,0.18,0.82,2.06,7.84,1.64 +0.40,-0.37,0.18,0.82,2.06,7.84,1.64 +0.40,-0.37,0.18,0.82,2.05,7.84,1.64 +0.40,-0.37,0.18,0.82,2.05,7.84,1.64 +0.40,-0.37,0.18,0.82,2.04,7.84,1.64 +0.40,-0.37,0.18,0.82,2.04,7.84,1.64 +0.39,-0.37,0.18,0.82,2.04,7.84,1.64 +0.39,-0.37,0.18,0.82,2.03,7.83,1.64 +0.39,-0.37,0.18,0.82,2.03,7.83,1.64 +0.39,-0.38,0.18,0.82,2.03,7.83,1.64 +0.39,-0.38,0.18,0.82,2.02,7.83,1.64 +0.39,-0.38,0.18,0.82,2.02,7.83,1.64 +0.39,-0.38,0.18,0.82,2.02,7.83,1.64 +0.39,-0.38,0.18,0.82,2.01,7.82,1.64 +0.39,-0.38,0.18,0.82,2.01,7.82,1.64 +0.39,-0.38,0.18,0.82,2.01,7.82,1.64 +0.39,-0.38,0.18,0.82,2.00,7.82,1.64 +0.39,-0.38,0.18,0.82,2.00,7.82,1.65 +0.38,-0.38,0.18,0.82,1.99,7.82,1.65 +0.38,-0.38,0.18,0.82,1.99,7.81,1.65 +0.38,-0.38,0.18,0.82,1.99,7.81,1.65 +0.38,-0.38,0.18,0.82,1.98,7.81,1.65 +0.38,-0.38,0.18,0.82,1.98,7.81,1.65 +0.38,-0.38,0.18,0.82,1.98,7.81,1.65 +0.38,-0.38,0.18,0.82,1.97,7.80,1.65 +0.38,-0.38,0.18,0.82,1.97,7.80,1.65 +0.38,-0.38,0.18,0.82,1.97,7.80,1.65 +0.38,-0.38,0.18,0.82,1.96,7.80,1.65 +0.38,-0.38,0.18,0.82,1.96,7.80,1.65 +0.38,-0.38,0.17,0.83,1.95,7.80,1.65 +0.37,-0.38,0.17,0.83,1.95,7.79,1.65 +0.37,-0.38,0.17,0.83,1.95,7.79,1.65 +0.37,-0.39,0.17,0.83,1.94,7.79,1.65 +0.37,-0.39,0.17,0.83,1.94,7.79,1.65 +0.37,-0.39,0.17,0.83,1.94,7.79,1.65 +0.37,-0.39,0.17,0.83,1.93,7.79,1.65 +0.37,-0.39,0.17,0.83,1.93,7.78,1.65 +0.37,-0.39,0.17,0.83,1.93,7.78,1.65 +0.37,-0.39,0.17,0.83,1.92,7.78,1.65 +0.37,-0.39,0.17,0.83,1.92,7.78,1.65 +0.37,-0.39,0.17,0.83,1.92,7.78,1.65 +0.37,-0.39,0.17,0.83,1.91,7.77,1.66 +0.37,-0.39,0.17,0.83,1.91,7.77,1.66 +0.36,-0.39,0.17,0.83,1.90,7.77,1.66 +0.36,-0.39,0.17,0.83,1.90,7.77,1.66 +0.36,-0.39,0.17,0.83,1.90,7.77,1.66 +0.36,-0.39,0.17,0.83,1.89,7.77,1.66 +0.36,-0.39,0.17,0.83,1.89,7.76,1.66 +0.36,-0.39,0.17,0.83,1.89,7.76,1.66 +0.36,-0.39,0.17,0.83,1.88,7.76,1.66 +0.36,-0.39,0.17,0.83,1.88,7.76,1.66 +0.36,-0.39,0.17,0.83,1.88,7.76,1.66 +0.36,-0.39,0.17,0.83,1.87,7.75,1.66 +0.36,-0.39,0.17,0.83,1.87,7.75,1.66 +0.36,-0.40,0.17,0.83,1.87,7.75,1.66 +0.35,-0.40,0.17,0.83,1.86,7.75,1.66 +0.35,-0.40,0.17,0.83,1.86,7.75,1.66 +0.35,-0.40,0.17,0.83,1.85,7.74,1.66 +0.35,-0.40,0.17,0.83,1.85,7.74,1.66 +0.35,-0.40,0.17,0.83,1.85,7.74,1.66 +0.35,-0.40,0.17,0.83,1.84,7.74,1.66 +0.35,-0.40,0.17,0.83,1.84,7.74,1.66 +0.35,-0.40,0.17,0.83,1.84,7.73,1.66 +0.35,-0.40,0.17,0.83,1.83,7.73,1.66 +0.35,-0.40,0.17,0.83,1.83,7.73,1.66 +0.35,-0.40,0.17,0.83,1.83,7.73,1.66 +0.35,-0.40,0.17,0.83,1.82,7.73,1.66 +0.34,-0.40,0.17,0.83,1.82,7.72,1.66 +0.34,-0.40,0.17,0.83,1.82,7.72,1.67 +0.34,-0.40,0.17,0.83,1.81,7.72,1.67 +0.34,-0.40,0.17,0.83,1.81,7.72,1.67 +0.34,-0.40,0.16,0.83,1.81,7.72,1.67 +0.34,-0.40,0.16,0.83,1.80,7.71,1.67 +0.34,-0.40,0.16,0.83,1.80,7.71,1.67 +0.34,-0.40,0.16,0.83,1.79,7.71,1.67 +0.34,-0.40,0.16,0.83,1.79,7.71,1.67 +0.34,-0.40,0.16,0.83,1.79,7.71,1.67 +0.34,-0.41,0.16,0.83,1.78,7.70,1.67 +0.34,-0.41,0.16,0.83,1.78,7.70,1.67 +0.33,-0.41,0.16,0.83,1.78,7.70,1.67 +0.33,-0.41,0.16,0.83,1.77,7.70,1.67 +0.33,-0.41,0.16,0.83,1.77,7.70,1.67 +0.33,-0.41,0.16,0.83,1.77,7.69,1.67 +0.33,-0.41,0.16,0.84,1.76,7.69,1.67 +0.33,-0.41,0.16,0.84,1.76,7.69,1.67 +0.33,-0.41,0.16,0.84,1.76,7.69,1.67 +0.33,-0.41,0.16,0.84,1.75,7.69,1.67 +0.33,-0.41,0.16,0.84,1.75,7.68,1.67 +0.33,-0.41,0.16,0.84,1.75,7.68,1.67 +0.33,-0.41,0.16,0.84,1.74,7.68,1.67 +0.33,-0.41,0.16,0.84,1.74,7.68,1.67 +0.32,-0.41,0.16,0.84,1.73,7.68,1.67 +0.32,-0.41,0.16,0.84,1.73,7.67,1.67 +0.32,-0.41,0.16,0.84,1.73,7.67,1.67 +0.32,-0.41,0.16,0.84,1.72,7.67,1.67 +0.32,-0.41,0.16,0.84,1.72,7.67,1.67 +0.32,-0.41,0.16,0.84,1.72,7.67,1.67 +0.32,-0.41,0.16,0.84,1.71,7.66,1.67 +0.32,-0.41,0.16,0.84,1.71,7.66,1.67 +0.32,-0.42,0.16,0.84,1.71,7.66,1.68 +0.32,-0.42,0.16,0.84,1.70,7.66,1.68 +0.32,-0.42,0.16,0.84,1.70,7.65,1.68 +0.32,-0.42,0.16,0.84,1.70,7.65,1.68 +0.31,-0.42,0.16,0.84,1.69,7.65,1.68 +0.31,-0.42,0.16,0.84,1.69,7.65,1.68 +0.31,-0.42,0.16,0.84,1.69,7.65,1.68 +0.31,-0.42,0.16,0.84,1.68,7.64,1.68 +0.31,-0.42,0.16,0.84,1.68,7.64,1.68 +0.31,-0.42,0.16,0.84,1.68,7.64,1.68 +0.31,-0.42,0.15,0.84,1.67,7.64,1.68 +0.31,-0.42,0.15,0.84,1.67,7.63,1.68 +0.31,-0.42,0.15,0.84,1.66,7.63,1.68 +0.31,-0.42,0.15,0.84,1.66,7.63,1.68 +0.31,-0.42,0.15,0.84,1.66,7.63,1.68 +0.31,-0.42,0.15,0.84,1.65,7.63,1.68 +0.31,-0.42,0.15,0.84,1.65,7.62,1.68 +0.30,-0.42,0.15,0.84,1.65,7.62,1.68 +0.30,-0.42,0.15,0.84,1.64,7.62,1.68 +0.30,-0.42,0.15,0.84,1.64,7.62,1.68 +0.30,-0.42,0.15,0.84,1.64,7.61,1.68 +0.30,-0.42,0.15,0.84,1.63,7.61,1.68 +0.30,-0.42,0.15,0.84,1.63,7.61,1.68 +0.30,-0.43,0.15,0.84,1.63,7.61,1.68 +0.30,-0.43,0.15,0.84,1.62,7.61,1.68 +0.30,-0.43,0.15,0.84,1.62,7.60,1.68 +0.30,-0.43,0.15,0.84,1.62,7.60,1.68 +0.30,-0.43,0.15,0.84,1.61,7.60,1.68 +0.30,-0.43,0.15,0.84,1.61,7.60,1.68 +0.29,-0.43,0.15,0.84,1.61,7.59,1.68 +0.29,-0.43,0.15,0.84,1.60,7.59,1.68 +0.29,-0.43,0.15,0.84,1.60,7.59,1.68 +0.29,-0.43,0.15,0.84,1.60,7.59,1.68 +0.29,-0.43,0.15,0.84,1.59,7.58,1.68 +0.29,-0.43,0.15,0.84,1.59,7.58,1.68 +0.29,-0.43,0.15,0.84,1.59,7.58,1.68 +0.29,-0.43,0.15,0.84,1.58,7.58,1.68 +0.29,-0.43,0.15,0.84,1.58,7.58,1.68 +0.29,-0.43,0.15,0.84,1.58,7.57,1.69 +0.29,-0.43,0.15,0.84,1.57,7.57,1.69 +0.29,-0.43,0.15,0.84,1.57,7.57,1.69 +0.28,-0.43,0.15,0.84,1.56,7.57,1.69 +0.28,-0.43,0.15,0.84,1.56,7.56,1.69 +0.28,-0.43,0.15,0.84,1.56,7.56,1.69 +0.28,-0.43,0.15,0.84,1.55,7.56,1.69 +0.28,-0.43,0.14,0.84,1.55,7.56,1.69 +0.28,-0.43,0.14,0.84,1.55,7.55,1.69 +0.28,-0.44,0.14,0.84,1.54,7.55,1.69 +0.28,-0.44,0.14,0.84,1.54,7.55,1.69 +0.28,-0.44,0.14,0.84,1.54,7.55,1.69 +0.28,-0.44,0.14,0.84,1.53,7.54,1.69 +0.28,-0.44,0.14,0.84,1.53,7.54,1.69 +0.28,-0.44,0.14,0.84,1.53,7.54,1.69 +0.27,-0.44,0.14,0.84,1.52,7.54,1.69 +0.27,-0.44,0.14,0.84,1.52,7.53,1.69 +0.27,-0.44,0.14,0.84,1.52,7.53,1.69 +0.27,-0.44,0.14,0.84,1.51,7.53,1.69 +0.27,-0.44,0.14,0.84,1.51,7.53,1.69 +0.27,-0.44,0.14,0.84,1.51,7.52,1.69 +0.27,-0.44,0.14,0.84,1.50,7.52,1.69 +0.27,-0.44,0.14,0.84,1.50,7.52,1.69 +0.27,-0.44,0.14,0.84,1.50,7.52,1.69 +0.27,-0.44,0.14,0.84,1.49,7.51,1.69 +0.27,-0.44,0.14,0.85,1.49,7.51,1.69 +0.27,-0.44,0.14,0.85,1.49,7.51,1.69 +0.26,-0.44,0.14,0.85,1.48,7.51,1.69 +0.26,-0.44,0.14,0.85,1.48,7.50,1.69 +0.26,-0.44,0.14,0.85,1.48,7.50,1.69 +0.26,-0.44,0.14,0.85,1.47,7.50,1.69 +0.26,-0.44,0.14,0.85,1.47,7.50,1.69 +0.26,-0.45,0.14,0.85,1.47,7.49,1.69 +0.26,-0.45,0.14,0.85,1.46,7.49,1.69 +0.26,-0.45,0.14,0.85,1.46,7.49,1.69 +0.26,-0.45,0.14,0.85,1.46,7.49,1.69 +0.26,-0.45,0.14,0.85,1.45,7.48,1.69 +0.26,-0.45,0.14,0.85,1.45,7.48,1.69 +0.26,-0.45,0.14,0.85,1.45,7.48,1.69 +0.25,-0.45,0.13,0.85,1.44,7.48,1.69 +0.25,-0.45,0.13,0.85,1.44,7.47,1.69 +0.25,-0.45,0.13,0.85,1.44,7.47,1.69 +0.25,-0.45,0.13,0.85,1.43,7.47,1.69 +0.25,-0.45,0.13,0.85,1.43,7.47,1.69 +0.25,-0.45,0.13,0.85,1.43,7.46,1.69 +0.25,-0.45,0.13,0.85,1.42,7.46,1.69 +0.25,-0.45,0.13,0.85,1.42,7.46,1.69 +0.25,-0.45,0.13,0.85,1.42,7.46,1.69 +0.25,-0.45,0.13,0.85,1.41,7.45,1.69 +0.25,-0.45,0.13,0.85,1.41,7.45,1.69 +0.25,-0.45,0.13,0.85,1.41,7.45,1.69 +0.25,-0.45,0.13,0.85,1.40,7.45,1.69 +0.24,-0.45,0.13,0.85,1.40,7.44,1.69 +0.24,-0.45,0.13,0.85,1.40,7.44,1.69 +0.24,-0.45,0.13,0.85,1.39,7.44,1.69 +0.24,-0.45,0.13,0.85,1.39,7.43,1.69 +0.24,-0.46,0.13,0.85,1.39,7.43,1.69 +0.24,-0.46,0.13,0.85,1.38,7.43,1.69 +0.24,-0.46,0.13,0.85,1.38,7.43,1.70 +0.24,-0.46,0.13,0.85,1.38,7.42,1.70 +0.24,-0.46,0.13,0.85,1.37,7.42,1.70 +0.24,-0.46,0.13,0.85,1.37,7.42,1.70 +0.24,-0.46,0.13,0.85,1.37,7.42,1.70 +0.24,-0.46,0.13,0.85,1.36,7.41,1.70 +0.23,-0.46,0.13,0.85,1.36,7.41,1.70 +0.23,-0.46,0.13,0.85,1.36,7.41,1.70 +0.23,-0.46,0.13,0.85,1.35,7.41,1.70 +0.23,-0.46,0.13,0.85,1.35,7.40,1.70 +0.23,-0.46,0.13,0.85,1.35,7.40,1.70 +0.23,-0.46,0.13,0.85,1.34,7.40,1.70 +0.23,-0.46,0.12,0.85,1.34,7.39,1.70 +0.23,-0.46,0.12,0.85,1.34,7.39,1.70 +0.23,-0.46,0.12,0.85,1.33,7.39,1.70 +0.23,-0.46,0.12,0.85,1.33,7.39,1.70 +0.23,-0.46,0.12,0.85,1.33,7.38,1.70 +0.23,-0.46,0.12,0.85,1.32,7.38,1.70 +0.22,-0.46,0.12,0.85,1.32,7.38,1.70 +0.22,-0.46,0.12,0.85,1.32,7.38,1.70 +0.22,-0.46,0.12,0.85,1.31,7.37,1.70 +0.22,-0.46,0.12,0.85,1.31,7.37,1.70 +0.22,-0.46,0.12,0.85,1.31,7.37,1.70 +0.22,-0.47,0.12,0.85,1.30,7.36,1.70 +0.22,-0.47,0.12,0.85,1.30,7.36,1.70 +0.22,-0.47,0.12,0.85,1.30,7.36,1.70 +0.22,-0.47,0.12,0.85,1.29,7.36,1.70 +0.22,-0.47,0.12,0.85,1.29,7.35,1.70 +0.22,-0.47,0.12,0.85,1.29,7.35,1.70 +0.22,-0.47,0.12,0.85,1.28,7.35,1.70 +0.21,-0.47,0.12,0.85,1.28,7.34,1.70 +0.21,-0.47,0.12,0.85,1.28,7.34,1.70 +0.21,-0.47,0.12,0.85,1.27,7.34,1.70 +0.21,-0.47,0.12,0.85,1.27,7.34,1.70 +0.21,-0.47,0.12,0.85,1.27,7.33,1.70 +0.21,-0.47,0.12,0.85,1.27,7.33,1.70 +0.21,-0.47,0.12,0.85,1.26,7.33,1.70 +0.21,-0.47,0.12,0.85,1.26,7.32,1.70 +0.21,-0.47,0.12,0.85,1.26,7.32,1.70 +0.21,-0.47,0.12,0.85,1.25,7.32,1.70 +0.21,-0.47,0.11,0.85,1.25,7.32,1.70 +0.21,-0.47,0.11,0.85,1.25,7.31,1.70 +0.20,-0.47,0.11,0.85,1.24,7.31,1.70 +0.20,-0.47,0.11,0.85,1.24,7.31,1.70 +0.20,-0.47,0.11,0.85,1.24,7.30,1.70 +0.20,-0.47,0.11,0.85,1.23,7.30,1.70 +0.20,-0.47,0.11,0.85,1.23,7.30,1.70 +0.20,-0.48,0.11,0.85,1.23,7.30,1.70 +0.20,-0.48,0.11,0.85,1.22,7.29,1.70 +0.20,-0.48,0.11,0.85,1.22,7.29,1.70 +0.20,-0.48,0.11,0.85,1.22,7.29,1.70 +0.20,-0.48,0.11,0.85,1.21,7.28,1.70 +0.20,-0.48,0.11,0.85,1.21,7.28,1.70 +0.20,-0.48,0.11,0.85,1.21,7.28,1.70 +0.20,-0.48,0.11,0.85,1.20,7.27,1.70 +0.19,-0.48,0.11,0.85,1.20,7.27,1.70 +0.19,-0.48,0.11,0.85,1.20,7.27,1.70 +0.19,-0.48,0.11,0.85,1.19,7.27,1.70 +0.19,-0.48,0.11,0.85,1.19,7.26,1.70 +0.19,-0.48,0.11,0.85,1.19,7.26,1.70 +0.19,-0.48,0.11,0.85,1.19,7.26,1.70 +0.19,-0.48,0.11,0.85,1.18,7.25,1.70 +0.19,-0.48,0.11,0.85,1.18,7.25,1.70 +0.19,-0.48,0.11,0.85,1.18,7.25,1.70 +0.19,-0.48,0.11,0.85,1.17,7.24,1.70 +0.19,-0.48,0.11,0.85,1.17,7.24,1.70 +0.19,-0.48,0.11,0.85,1.17,7.24,1.70 +0.18,-0.48,0.10,0.85,1.16,7.24,1.70 +0.18,-0.48,0.10,0.85,1.16,7.23,1.70 +0.18,-0.48,0.10,0.85,1.16,7.23,1.70 +0.18,-0.48,0.10,0.85,1.15,7.23,1.70 +0.18,-0.48,0.10,0.85,1.15,7.22,1.70 +0.18,-0.48,0.10,0.85,1.15,7.22,1.70 +0.18,-0.49,0.10,0.85,1.14,7.22,1.70 +0.18,-0.49,0.10,0.85,1.14,7.21,1.70 +0.18,-0.49,0.10,0.85,1.14,7.21,1.70 +0.18,-0.49,0.10,0.85,1.14,7.21,1.70 +0.18,-0.49,0.10,0.85,1.13,7.21,1.70 +0.18,-0.49,0.10,0.85,1.13,7.20,1.70 +0.17,-0.49,0.10,0.85,1.13,7.20,1.70 +0.17,-0.49,0.10,0.85,1.12,7.20,1.70 +0.17,-0.49,0.10,0.85,1.12,7.19,1.70 +0.17,-0.49,0.10,0.85,1.12,7.19,1.70 +0.17,-0.49,0.10,0.85,1.11,7.19,1.70 +0.17,-0.49,0.10,0.85,1.11,7.18,1.70 +0.17,-0.49,0.10,0.85,1.11,7.18,1.70 +0.17,-0.49,0.10,0.85,1.10,7.18,1.70 +0.17,-0.49,0.10,0.85,1.10,7.17,1.70 +0.17,-0.49,0.10,0.85,1.10,7.17,1.70 +0.17,-0.49,0.10,0.85,1.09,7.17,1.70 +0.17,-0.49,0.10,0.85,1.09,7.16,1.70 +0.16,-0.49,0.10,0.85,1.09,7.16,1.70 +0.16,-0.49,0.10,0.85,1.09,7.16,1.70 +0.16,-0.49,0.09,0.85,1.08,7.16,1.70 +0.16,-0.49,0.09,0.85,1.08,7.15,1.70 +0.16,-0.49,0.09,0.85,1.08,7.15,1.70 +0.16,-0.49,0.09,0.85,1.07,7.15,1.70 +0.16,-0.49,0.09,0.85,1.07,7.14,1.70 +0.16,-0.49,0.09,0.85,1.07,7.14,1.70 +0.16,-0.50,0.09,0.85,1.06,7.14,1.70 +0.16,-0.50,0.09,0.85,1.06,7.13,1.70 +0.16,-0.50,0.09,0.85,1.06,7.13,1.70 +0.16,-0.50,0.09,0.85,1.06,7.13,1.70 +0.16,-0.50,0.09,0.85,1.05,7.12,1.70 +0.15,-0.50,0.09,0.85,1.05,7.12,1.70 +0.15,-0.50,0.09,0.85,1.05,7.12,1.70 +0.15,-0.50,0.09,0.85,1.04,7.11,1.70 +0.15,-0.50,0.09,0.85,1.04,7.11,1.70 +0.15,-0.50,0.09,0.85,1.04,7.11,1.70 +0.15,-0.50,0.09,0.85,1.03,7.10,1.70 +0.15,-0.50,0.09,0.85,1.03,7.10,1.70 +0.15,-0.50,0.09,0.85,1.03,7.10,1.70 +0.15,-0.50,0.09,0.85,1.02,7.09,1.70 +0.15,-0.50,0.09,0.85,1.02,7.09,1.70 +0.15,-0.50,0.09,0.85,1.02,7.09,1.70 +0.15,-0.50,0.09,0.85,1.02,7.08,1.70 +0.14,-0.50,0.09,0.85,1.01,7.08,1.70 +0.14,-0.50,0.09,0.85,1.01,7.08,1.70 +0.14,-0.50,0.08,0.85,1.01,7.07,1.70 +0.14,-0.50,0.08,0.85,1.00,7.07,1.70 +0.14,-0.50,0.08,0.85,1.00,7.07,1.70 +0.14,-0.50,0.08,0.85,1.00,7.07,1.70 +0.14,-0.50,0.08,0.85,0.99,7.06,1.70 +0.14,-0.50,0.08,0.85,0.99,7.06,1.70 +0.14,-0.50,0.08,0.85,0.99,7.06,1.70 +0.14,-0.51,0.08,0.85,0.99,7.05,1.70 +0.14,-0.51,0.08,0.85,0.98,7.05,1.70 +0.14,-0.51,0.08,0.85,0.98,7.05,1.70 +0.13,-0.51,0.08,0.85,0.98,7.04,1.70 +0.13,-0.51,0.08,0.85,0.97,7.04,1.70 +0.13,-0.51,0.08,0.85,0.97,7.04,1.70 +0.13,-0.51,0.08,0.85,0.97,7.03,1.70 +0.13,-0.51,0.08,0.85,0.97,7.03,1.70 +0.13,-0.51,0.08,0.85,0.96,7.03,1.70 +0.13,-0.51,0.08,0.85,0.96,7.02,1.70 +0.13,-0.51,0.08,0.85,0.96,7.02,1.70 +0.13,-0.51,0.08,0.85,0.95,7.02,1.69 +0.13,-0.51,0.08,0.85,0.95,7.01,1.69 +0.13,-0.51,0.08,0.85,0.95,7.01,1.69 +0.13,-0.51,0.08,0.85,0.94,7.00,1.69 +0.13,-0.51,0.08,0.85,0.94,7.00,1.69 +0.12,-0.51,0.08,0.85,0.94,7.00,1.69 +0.12,-0.51,0.07,0.85,0.94,6.99,1.69 +0.12,-0.51,0.07,0.85,0.93,6.99,1.69 +0.12,-0.51,0.07,0.85,0.93,6.99,1.69 +0.12,-0.51,0.07,0.85,0.93,6.98,1.69 +0.12,-0.51,0.07,0.85,0.92,6.98,1.69 +0.12,-0.51,0.07,0.85,0.92,6.98,1.69 +0.12,-0.51,0.07,0.85,0.92,6.97,1.69 +0.12,-0.51,0.07,0.85,0.92,6.97,1.69 +0.12,-0.51,0.07,0.85,0.91,6.97,1.69 +0.12,-0.51,0.07,0.85,0.91,6.96,1.69 +0.12,-0.52,0.07,0.85,0.91,6.96,1.69 +0.11,-0.52,0.07,0.85,0.90,6.96,1.69 +0.11,-0.52,0.07,0.85,0.90,6.95,1.69 +0.11,-0.52,0.07,0.85,0.90,6.95,1.69 +0.11,-0.52,0.07,0.85,0.90,6.95,1.69 +0.11,-0.52,0.07,0.85,0.89,6.94,1.69 +0.11,-0.52,0.07,0.85,0.89,6.94,1.69 +0.11,-0.52,0.07,0.85,0.89,6.94,1.69 +0.11,-0.52,0.07,0.85,0.88,6.93,1.69 +0.11,-0.52,0.07,0.85,0.88,6.93,1.69 +0.11,-0.52,0.07,0.85,0.88,6.93,1.69 +0.11,-0.52,0.07,0.85,0.88,6.92,1.69 +0.11,-0.52,0.07,0.85,0.87,6.92,1.69 +0.11,-0.52,0.06,0.85,0.87,6.92,1.69 +0.10,-0.52,0.06,0.85,0.87,6.91,1.69 +0.10,-0.52,0.06,0.85,0.86,6.91,1.69 +0.10,-0.52,0.06,0.85,0.86,6.90,1.69 +0.10,-0.52,0.06,0.85,0.86,6.90,1.69 +0.10,-0.52,0.06,0.84,0.86,6.90,1.69 +0.10,-0.52,0.06,0.84,0.85,6.89,1.69 +0.10,-0.52,0.06,0.84,0.85,6.89,1.69 +0.10,-0.52,0.06,0.84,0.85,6.89,1.69 +0.10,-0.52,0.06,0.84,0.84,6.88,1.69 +0.10,-0.52,0.06,0.84,0.84,6.88,1.69 +0.10,-0.52,0.06,0.84,0.84,6.88,1.69 +0.10,-0.52,0.06,0.84,0.84,6.87,1.69 +0.09,-0.52,0.06,0.84,0.83,6.87,1.69 +0.09,-0.52,0.06,0.84,0.83,6.87,1.69 +0.09,-0.52,0.06,0.84,0.83,6.86,1.69 +0.09,-0.53,0.06,0.84,0.82,6.86,1.69 +0.09,-0.53,0.06,0.84,0.82,6.85,1.69 +0.09,-0.53,0.06,0.84,0.82,6.85,1.69 +0.09,-0.53,0.06,0.84,0.82,6.85,1.69 +0.09,-0.53,0.06,0.84,0.81,6.84,1.69 +0.09,-0.53,0.06,0.84,0.81,6.84,1.69 +0.09,-0.53,0.05,0.84,0.81,6.84,1.69 +0.09,-0.53,0.05,0.84,0.81,6.83,1.69 +0.09,-0.53,0.05,0.84,0.80,6.83,1.69 +0.09,-0.53,0.05,0.84,0.80,6.83,1.69 +0.08,-0.53,0.05,0.84,0.80,6.82,1.69 +0.08,-0.53,0.05,0.84,0.79,6.82,1.69 +0.08,-0.53,0.05,0.84,0.79,6.81,1.69 +0.08,-0.53,0.05,0.84,0.79,6.81,1.69 +0.08,-0.53,0.05,0.84,0.79,6.81,1.68 +0.08,-0.53,0.05,0.84,0.78,6.80,1.68 +0.08,-0.53,0.05,0.84,0.78,6.80,1.68 +0.08,-0.53,0.05,0.84,0.78,6.80,1.68 +0.08,-0.53,0.05,0.84,0.78,6.79,1.68 +0.08,-0.53,0.05,0.84,0.77,6.79,1.68 +0.08,-0.53,0.05,0.84,0.77,6.79,1.68 +0.08,-0.53,0.05,0.84,0.77,6.78,1.68 +0.08,-0.53,0.05,0.84,0.76,6.78,1.68 +0.07,-0.53,0.05,0.84,0.76,6.77,1.68 +0.07,-0.53,0.05,0.84,0.76,6.77,1.68 +0.07,-0.53,0.05,0.84,0.76,6.77,1.68 +0.07,-0.53,0.05,0.84,0.75,6.76,1.68 +0.07,-0.53,0.05,0.84,0.75,6.76,1.68 +0.07,-0.53,0.04,0.84,0.75,6.76,1.68 +0.07,-0.54,0.04,0.84,0.75,6.75,1.68 +0.07,-0.54,0.04,0.84,0.74,6.75,1.68 +0.07,-0.54,0.04,0.84,0.74,6.74,1.68 +0.07,-0.54,0.04,0.84,0.74,6.74,1.68 +0.07,-0.54,0.04,0.84,0.74,6.74,1.68 +0.07,-0.54,0.04,0.84,0.73,6.73,1.68 +0.06,-0.54,0.04,0.84,0.73,6.73,1.68 +0.06,-0.54,0.04,0.84,0.73,6.73,1.68 +0.06,-0.54,0.04,0.84,0.72,6.72,1.68 +0.06,-0.54,0.04,0.84,0.72,6.72,1.68 +0.06,-0.54,0.04,0.84,0.72,6.71,1.68 +0.06,-0.54,0.04,0.84,0.72,6.71,1.68 +0.06,-0.54,0.04,0.84,0.71,6.71,1.68 +0.06,-0.54,0.04,0.84,0.71,6.70,1.68 +0.06,-0.54,0.04,0.84,0.71,6.70,1.68 +0.06,-0.54,0.04,0.84,0.71,6.70,1.68 +0.06,-0.54,0.04,0.84,0.70,6.69,1.68 +0.06,-0.54,0.04,0.84,0.70,6.69,1.68 +0.06,-0.54,0.04,0.84,0.70,6.68,1.68 +0.05,-0.54,0.04,0.84,0.70,6.68,1.68 +0.05,-0.54,0.03,0.84,0.69,6.68,1.68 +0.05,-0.54,0.03,0.84,0.69,6.67,1.68 +0.05,-0.54,0.03,0.84,0.69,6.67,1.68 +0.05,-0.54,0.03,0.84,0.69,6.67,1.68 +0.05,-0.54,0.03,0.84,0.68,6.66,1.68 +0.05,-0.54,0.03,0.84,0.68,6.66,1.67 +0.05,-0.54,0.03,0.84,0.68,6.65,1.67 +0.05,-0.54,0.03,0.84,0.68,6.65,1.67 +0.05,-0.54,0.03,0.84,0.67,6.65,1.67 +0.05,-0.54,0.03,0.84,0.67,6.64,1.67 +0.05,-0.54,0.03,0.84,0.67,6.64,1.67 +0.05,-0.55,0.03,0.84,0.66,6.63,1.67 +0.04,-0.55,0.03,0.84,0.66,6.63,1.67 +0.04,-0.55,0.03,0.84,0.66,6.63,1.67 +0.04,-0.55,0.03,0.84,0.66,6.62,1.67 +0.04,-0.55,0.03,0.84,0.65,6.62,1.67 +0.04,-0.55,0.03,0.84,0.65,6.61,1.67 +0.04,-0.55,0.03,0.84,0.65,6.61,1.67 +0.04,-0.55,0.03,0.84,0.65,6.61,1.67 +0.04,-0.55,0.03,0.84,0.64,6.60,1.67 +0.04,-0.55,0.03,0.84,0.64,6.60,1.67 +0.04,-0.55,0.02,0.83,0.64,6.60,1.67 +0.04,-0.55,0.02,0.83,0.64,6.59,1.67 +0.04,-0.55,0.02,0.83,0.63,6.59,1.67 +0.04,-0.55,0.02,0.83,0.63,6.58,1.67 +0.03,-0.55,0.02,0.83,0.63,6.58,1.67 +0.03,-0.55,0.02,0.83,0.63,6.58,1.67 +0.03,-0.55,0.02,0.83,0.62,6.57,1.67 +0.03,-0.55,0.02,0.83,0.62,6.57,1.67 +0.03,-0.55,0.02,0.83,0.62,6.56,1.67 +0.03,-0.55,0.02,0.83,0.62,6.56,1.67 +0.03,-0.55,0.02,0.83,0.61,6.56,1.67 +0.03,-0.55,0.02,0.83,0.61,6.55,1.67 +0.03,-0.55,0.02,0.83,0.61,6.55,1.67 +0.03,-0.55,0.02,0.83,0.61,6.54,1.67 +0.03,-0.55,0.02,0.83,0.60,6.54,1.67 +0.03,-0.55,0.02,0.83,0.60,6.54,1.67 +0.03,-0.55,0.02,0.83,0.60,6.53,1.66 +0.02,-0.55,0.02,0.83,0.60,6.53,1.66 +0.02,-0.55,0.02,0.83,0.59,6.52,1.66 +0.02,-0.55,0.02,0.83,0.59,6.52,1.66 +0.02,-0.55,0.01,0.83,0.59,6.52,1.66 +0.02,-0.55,0.01,0.83,0.59,6.51,1.66 +0.02,-0.56,0.01,0.83,0.59,6.51,1.66 +0.02,-0.56,0.01,0.83,0.58,6.50,1.66 +0.02,-0.56,0.01,0.83,0.58,6.50,1.66 +0.02,-0.56,0.01,0.83,0.58,6.50,1.66 +0.02,-0.56,0.01,0.83,0.58,6.49,1.66 +0.02,-0.56,0.01,0.83,0.57,6.49,1.66 +0.02,-0.56,0.01,0.83,0.57,6.48,1.66 +0.02,-0.56,0.01,0.83,0.57,6.48,1.66 +0.01,-0.56,0.01,0.83,0.57,6.48,1.66 +0.01,-0.56,0.01,0.83,0.56,6.47,1.66 +0.01,-0.56,0.01,0.83,0.56,6.47,1.66 +0.01,-0.56,0.01,0.83,0.56,6.46,1.66 +0.01,-0.56,0.01,0.83,0.56,6.46,1.66 +0.01,-0.56,0.01,0.83,0.55,6.46,1.66 +0.01,-0.56,0.01,0.83,0.55,6.45,1.66 +0.01,-0.56,0.01,0.83,0.55,6.45,1.66 +0.01,-0.56,0.01,0.83,0.55,6.44,1.66 +0.01,-0.56,0.01,0.83,0.54,6.44,1.66 +0.01,-0.56,0.00,0.83,0.54,6.44,1.66 +0.01,-0.56,0.00,0.83,0.54,6.43,1.66 +0.01,-0.56,0.00,0.83,0.54,6.43,1.66 +0.00,-0.56,0.00,0.83,0.54,6.42,1.65 +0.00,-0.56,0.00,0.83,0.53,6.42,1.65 +0.00,-0.56,0.00,0.83,0.53,6.41,1.65 +0.00,-0.56,0.00,0.83,0.53,6.41,1.65 +0.00,-0.56,0.00,0.83,0.53,6.41,1.65 +0.00,-0.56,0.00,0.83,0.52,6.40,1.65 +0.00,-0.56,0.00,0.83,0.52,6.40,1.65 +-0.00,-0.56,-0.00,0.83,0.52,6.39,1.65 +-0.00,-0.56,-0.00,0.83,0.52,6.39,1.65 +-0.00,-0.56,-0.00,0.83,0.51,6.39,1.65 +-0.00,-0.56,-0.00,0.83,0.51,6.38,1.65 +-0.00,-0.56,-0.00,0.83,0.51,6.38,1.65 +-0.00,-0.56,-0.00,0.83,0.51,6.37,1.65 +-0.01,-0.57,-0.00,0.82,0.51,6.37,1.65 +-0.01,-0.57,-0.00,0.82,0.50,6.37,1.65 +-0.01,-0.57,-0.00,0.82,0.50,6.36,1.65 +-0.01,-0.57,-0.01,0.82,0.50,6.36,1.65 +-0.01,-0.57,-0.01,0.82,0.50,6.35,1.65 +-0.01,-0.57,-0.01,0.82,0.49,6.35,1.65 +-0.01,-0.57,-0.01,0.82,0.49,6.34,1.65 +-0.01,-0.57,-0.01,0.82,0.49,6.34,1.65 +-0.01,-0.57,-0.01,0.82,0.49,6.34,1.65 +-0.01,-0.57,-0.01,0.82,0.48,6.33,1.65 +-0.01,-0.57,-0.01,0.82,0.48,6.33,1.65 +-0.01,-0.57,-0.01,0.82,0.48,6.32,1.65 +-0.01,-0.57,-0.01,0.82,0.48,6.32,1.64 +-0.01,-0.57,-0.01,0.82,0.48,6.31,1.64 +-0.02,-0.57,-0.01,0.82,0.47,6.31,1.64 +-0.02,-0.57,-0.01,0.82,0.47,6.31,1.64 +-0.02,-0.57,-0.01,0.82,0.47,6.30,1.64 +-0.02,-0.57,-0.01,0.82,0.47,6.30,1.64 +-0.02,-0.57,-0.01,0.82,0.46,6.29,1.64 +-0.02,-0.57,-0.01,0.82,0.46,6.29,1.64 +-0.02,-0.57,-0.01,0.82,0.46,6.29,1.64 +-0.02,-0.57,-0.01,0.82,0.46,6.28,1.64 +-0.02,-0.57,-0.02,0.82,0.46,6.28,1.64 +-0.02,-0.57,-0.02,0.82,0.45,6.27,1.64 +-0.02,-0.57,-0.02,0.82,0.45,6.27,1.64 +-0.02,-0.57,-0.02,0.82,0.45,6.26,1.64 +-0.02,-0.57,-0.02,0.82,0.45,6.26,1.64 +-0.03,-0.57,-0.02,0.82,0.45,6.26,1.64 +-0.03,-0.57,-0.02,0.82,0.44,6.25,1.64 +-0.03,-0.57,-0.02,0.82,0.44,6.25,1.64 +-0.03,-0.57,-0.02,0.82,0.44,6.24,1.64 +-0.03,-0.57,-0.02,0.82,0.44,6.24,1.64 +-0.03,-0.57,-0.02,0.82,0.43,6.23,1.64 +-0.03,-0.57,-0.02,0.82,0.43,6.23,1.64 +-0.03,-0.57,-0.02,0.82,0.43,6.23,1.64 +-0.03,-0.57,-0.02,0.82,0.43,6.22,1.63 +-0.03,-0.58,-0.02,0.82,0.43,6.22,1.63 +-0.03,-0.58,-0.02,0.82,0.42,6.21,1.63 +-0.03,-0.58,-0.02,0.82,0.42,6.21,1.63 +-0.03,-0.58,-0.02,0.82,0.42,6.20,1.63 +-0.03,-0.58,-0.02,0.82,0.42,6.20,1.63 +-0.04,-0.58,-0.03,0.82,0.42,6.20,1.63 +-0.04,-0.58,-0.03,0.82,0.41,6.19,1.63 +-0.04,-0.58,-0.03,0.82,0.41,6.19,1.63 +-0.04,-0.58,-0.03,0.82,0.41,6.18,1.63 +-0.04,-0.58,-0.03,0.82,0.41,6.18,1.63 +-0.04,-0.58,-0.03,0.81,0.41,6.17,1.63 +-0.04,-0.58,-0.03,0.81,0.40,6.17,1.63 +-0.04,-0.58,-0.03,0.81,0.40,6.16,1.63 +-0.04,-0.58,-0.03,0.81,0.40,6.16,1.63 +-0.04,-0.58,-0.03,0.81,0.40,6.16,1.63 +-0.04,-0.58,-0.03,0.81,0.39,6.15,1.63 +-0.04,-0.58,-0.03,0.81,0.39,6.15,1.63 +-0.04,-0.58,-0.03,0.81,0.39,6.14,1.63 +-0.05,-0.58,-0.03,0.81,0.39,6.14,1.63 +-0.05,-0.58,-0.03,0.81,0.39,6.13,1.63 +-0.05,-0.58,-0.03,0.81,0.38,6.13,1.62 +-0.05,-0.58,-0.03,0.81,0.38,6.13,1.62 +-0.05,-0.58,-0.03,0.81,0.38,6.12,1.62 +-0.05,-0.58,-0.04,0.81,0.38,6.12,1.62 +-0.05,-0.58,-0.04,0.81,0.38,6.11,1.62 +-0.05,-0.58,-0.04,0.81,0.37,6.11,1.62 +-0.05,-0.58,-0.04,0.81,0.37,6.10,1.62 +-0.05,-0.58,-0.04,0.81,0.37,6.10,1.62 +-0.05,-0.58,-0.04,0.81,0.37,6.09,1.62 +-0.05,-0.58,-0.04,0.81,0.37,6.09,1.62 +-0.05,-0.58,-0.04,0.81,0.36,6.09,1.62 +-0.05,-0.58,-0.04,0.81,0.36,6.08,1.62 +-0.06,-0.58,-0.04,0.81,0.36,6.08,1.62 +-0.06,-0.58,-0.04,0.81,0.36,6.07,1.62 +-0.06,-0.58,-0.04,0.81,0.36,6.07,1.62 +-0.06,-0.58,-0.04,0.81,0.35,6.06,1.62 +-0.06,-0.58,-0.04,0.81,0.35,6.06,1.62 +-0.06,-0.58,-0.04,0.81,0.35,6.05,1.62 +-0.06,-0.58,-0.04,0.81,0.35,6.05,1.62 +-0.06,-0.59,-0.04,0.81,0.35,6.05,1.62 +-0.06,-0.59,-0.04,0.81,0.35,6.04,1.61 +-0.06,-0.59,-0.04,0.81,0.34,6.04,1.61 +-0.06,-0.59,-0.05,0.81,0.34,6.03,1.61 +-0.06,-0.59,-0.05,0.81,0.34,6.03,1.61 +-0.06,-0.59,-0.05,0.81,0.34,6.02,1.61 +-0.06,-0.59,-0.05,0.81,0.34,6.02,1.61 +-0.07,-0.59,-0.05,0.81,0.33,6.01,1.61 +-0.07,-0.59,-0.05,0.81,0.33,6.01,1.61 +-0.07,-0.59,-0.05,0.81,0.33,6.01,1.61 +-0.07,-0.59,-0.05,0.80,0.33,6.00,1.61 +-0.07,-0.59,-0.05,0.80,0.33,6.00,1.61 +-0.07,-0.59,-0.05,0.80,0.32,5.99,1.61 +-0.07,-0.59,-0.05,0.80,0.32,5.99,1.61 +-0.07,-0.59,-0.05,0.80,0.32,5.98,1.61 +-0.07,-0.59,-0.05,0.80,0.32,5.98,1.61 +-0.07,-0.59,-0.05,0.80,0.32,5.97,1.61 +-0.07,-0.59,-0.05,0.80,0.31,5.97,1.61 +-0.07,-0.59,-0.05,0.80,0.31,5.97,1.61 +-0.07,-0.59,-0.05,0.80,0.31,5.96,1.60 +-0.07,-0.59,-0.06,0.80,0.31,5.96,1.60 +-0.08,-0.59,-0.06,0.80,0.31,5.95,1.60 +-0.08,-0.59,-0.06,0.80,0.31,5.95,1.60 +-0.08,-0.59,-0.06,0.80,0.30,5.94,1.60 +-0.08,-0.59,-0.06,0.80,0.30,5.94,1.60 +-0.08,-0.59,-0.06,0.80,0.30,5.93,1.60 +-0.08,-0.59,-0.06,0.80,0.30,5.93,1.60 +-0.08,-0.59,-0.06,0.80,0.30,5.92,1.60 +-0.08,-0.59,-0.06,0.80,0.29,5.92,1.60 +-0.08,-0.59,-0.06,0.80,0.29,5.92,1.60 +-0.08,-0.59,-0.06,0.80,0.29,5.91,1.60 +-0.08,-0.59,-0.06,0.80,0.29,5.91,1.60 +-0.08,-0.59,-0.06,0.80,0.29,5.90,1.60 +-0.08,-0.59,-0.06,0.80,0.29,5.90,1.60 +-0.08,-0.59,-0.06,0.80,0.28,5.89,1.60 +-0.09,-0.59,-0.06,0.80,0.28,5.89,1.60 +-0.09,-0.59,-0.06,0.80,0.28,5.88,1.60 +-0.09,-0.59,-0.06,0.80,0.28,5.88,1.59 +-0.09,-0.59,-0.07,0.80,0.28,5.87,1.59 +-0.09,-0.59,-0.07,0.80,0.28,5.87,1.59 +-0.09,-0.59,-0.07,0.80,0.27,5.86,1.59 +-0.09,-0.59,-0.07,0.80,0.27,5.86,1.59 +-0.09,-0.59,-0.07,0.80,0.27,5.86,1.59 +-0.09,-0.59,-0.07,0.80,0.27,5.85,1.59 +-0.09,-0.60,-0.07,0.80,0.27,5.85,1.59 +-0.09,-0.60,-0.07,0.80,0.27,5.84,1.59 +-0.09,-0.60,-0.07,0.79,0.26,5.84,1.59 +-0.09,-0.60,-0.07,0.79,0.26,5.83,1.59 +-0.09,-0.60,-0.07,0.79,0.26,5.83,1.59 +-0.10,-0.60,-0.07,0.79,0.26,5.82,1.59 +-0.10,-0.60,-0.07,0.79,0.26,5.82,1.59 +-0.10,-0.60,-0.07,0.79,0.25,5.81,1.59 +-0.10,-0.60,-0.07,0.79,0.25,5.81,1.59 +-0.10,-0.60,-0.07,0.79,0.25,5.80,1.59 +-0.10,-0.60,-0.07,0.79,0.25,5.80,1.58 +-0.10,-0.60,-0.08,0.79,0.25,5.80,1.58 +-0.10,-0.60,-0.08,0.79,0.25,5.79,1.58 +-0.10,-0.60,-0.08,0.79,0.24,5.79,1.58 +-0.10,-0.60,-0.08,0.79,0.24,5.78,1.58 +-0.10,-0.60,-0.08,0.79,0.24,5.78,1.58 +-0.10,-0.60,-0.08,0.79,0.24,5.77,1.58 +-0.10,-0.60,-0.08,0.79,0.24,5.77,1.58 +-0.10,-0.60,-0.08,0.79,0.24,5.76,1.58 +-0.11,-0.60,-0.08,0.79,0.24,5.76,1.58 +-0.11,-0.60,-0.08,0.79,0.23,5.75,1.58 +-0.11,-0.60,-0.08,0.79,0.23,5.75,1.58 +-0.11,-0.60,-0.08,0.79,0.23,5.74,1.58 +-0.11,-0.60,-0.08,0.79,0.23,5.74,1.58 +-0.11,-0.60,-0.08,0.79,0.23,5.73,1.58 +-0.11,-0.60,-0.08,0.79,0.23,5.73,1.58 +-0.11,-0.60,-0.08,0.79,0.22,5.73,1.58 +-0.11,-0.60,-0.08,0.79,0.22,5.72,1.57 +-0.11,-0.60,-0.09,0.79,0.22,5.72,1.57 +-0.11,-0.60,-0.09,0.79,0.22,5.71,1.57 +-0.11,-0.60,-0.09,0.79,0.22,5.71,1.57 +-0.11,-0.60,-0.09,0.79,0.22,5.70,1.57 +-0.11,-0.60,-0.09,0.79,0.21,5.70,1.57 +-0.12,-0.60,-0.09,0.79,0.21,5.69,1.57 +-0.12,-0.60,-0.09,0.79,0.21,5.69,1.57 +-0.12,-0.60,-0.09,0.78,0.21,5.68,1.57 +-0.12,-0.60,-0.09,0.78,0.21,5.68,1.57 +-0.12,-0.60,-0.09,0.78,0.21,5.67,1.57 +-0.12,-0.60,-0.09,0.78,0.21,5.67,1.57 +-0.12,-0.60,-0.09,0.78,0.20,5.66,1.57 +-0.12,-0.60,-0.09,0.78,0.20,5.66,1.57 +-0.12,-0.60,-0.09,0.78,0.20,5.65,1.57 +-0.12,-0.60,-0.09,0.78,0.20,5.65,1.57 +-0.12,-0.60,-0.09,0.78,0.20,5.64,1.56 +-0.12,-0.60,-0.09,0.78,0.20,5.64,1.56 +-0.12,-0.60,-0.10,0.78,0.19,5.63,1.56 +-0.12,-0.60,-0.10,0.78,0.19,5.63,1.56 +-0.12,-0.60,-0.10,0.78,0.19,5.63,1.56 +-0.13,-0.60,-0.10,0.78,0.19,5.62,1.56 +-0.13,-0.60,-0.10,0.78,0.19,5.62,1.56 +-0.13,-0.60,-0.10,0.78,0.19,5.61,1.56 +-0.13,-0.61,-0.10,0.78,0.19,5.61,1.56 +-0.13,-0.61,-0.10,0.78,0.18,5.60,1.56 +-0.13,-0.61,-0.10,0.78,0.18,5.60,1.56 +-0.13,-0.61,-0.10,0.78,0.18,5.59,1.56 +-0.13,-0.61,-0.10,0.78,0.18,5.59,1.56 +-0.13,-0.61,-0.10,0.78,0.18,5.58,1.56 +-0.13,-0.61,-0.10,0.78,0.18,5.58,1.56 +-0.13,-0.61,-0.10,0.78,0.18,5.57,1.55 +-0.13,-0.61,-0.10,0.78,0.17,5.57,1.55 +-0.13,-0.61,-0.10,0.78,0.17,5.56,1.55 +-0.13,-0.61,-0.10,0.78,0.17,5.56,1.55 +-0.13,-0.61,-0.11,0.78,0.17,5.55,1.55 +-0.14,-0.61,-0.11,0.78,0.17,5.55,1.55 +-0.14,-0.61,-0.11,0.78,0.17,5.54,1.55 +-0.14,-0.61,-0.11,0.77,0.17,5.54,1.55 +-0.14,-0.61,-0.11,0.77,0.16,5.53,1.55 +-0.14,-0.61,-0.11,0.77,0.16,5.53,1.55 +-0.14,-0.61,-0.11,0.77,0.16,5.52,1.55 +-0.14,-0.61,-0.11,0.77,0.16,5.52,1.55 +-0.14,-0.61,-0.11,0.77,0.16,5.51,1.55 +-0.14,-0.61,-0.11,0.77,0.16,5.51,1.55 +-0.14,-0.61,-0.11,0.77,0.16,5.50,1.55 +-0.14,-0.61,-0.11,0.77,0.16,5.50,1.54 +-0.14,-0.61,-0.11,0.77,0.15,5.50,1.54 +-0.14,-0.61,-0.11,0.77,0.15,5.49,1.54 +-0.14,-0.61,-0.11,0.77,0.15,5.49,1.54 +-0.14,-0.61,-0.11,0.77,0.15,5.48,1.54 +-0.15,-0.61,-0.12,0.77,0.15,5.48,1.54 +-0.15,-0.61,-0.12,0.77,0.15,5.47,1.54 +-0.15,-0.61,-0.12,0.77,0.15,5.47,1.54 +-0.15,-0.61,-0.12,0.77,0.14,5.46,1.54 +-0.15,-0.61,-0.12,0.77,0.14,5.46,1.54 +-0.15,-0.61,-0.12,0.77,0.14,5.45,1.54 +-0.15,-0.61,-0.12,0.77,0.14,5.45,1.54 +-0.15,-0.61,-0.12,0.77,0.14,5.44,1.54 +-0.15,-0.61,-0.12,0.77,0.14,5.44,1.54 +-0.15,-0.61,-0.12,0.77,0.14,5.43,1.53 +-0.15,-0.61,-0.12,0.77,0.14,5.43,1.53 +-0.15,-0.61,-0.12,0.77,0.13,5.42,1.53 +-0.15,-0.61,-0.12,0.77,0.13,5.42,1.53 +-0.15,-0.61,-0.12,0.77,0.13,5.41,1.53 +-0.15,-0.61,-0.12,0.77,0.13,5.41,1.53 +-0.16,-0.61,-0.12,0.77,0.13,5.40,1.53 +-0.16,-0.61,-0.12,0.76,0.13,5.40,1.53 +-0.16,-0.61,-0.13,0.76,0.13,5.39,1.53 +-0.16,-0.61,-0.13,0.76,0.13,5.39,1.53 +-0.16,-0.61,-0.13,0.76,0.12,5.38,1.53 +-0.16,-0.61,-0.13,0.76,0.12,5.38,1.53 +-0.16,-0.61,-0.13,0.76,0.12,5.37,1.53 +-0.16,-0.61,-0.13,0.76,0.12,5.37,1.53 +-0.16,-0.61,-0.13,0.76,0.12,5.36,1.52 +-0.16,-0.61,-0.13,0.76,0.12,5.36,1.52 +-0.16,-0.61,-0.13,0.76,0.12,5.35,1.52 +-0.16,-0.61,-0.13,0.76,0.12,5.35,1.52 +-0.16,-0.61,-0.13,0.76,0.12,5.34,1.52 +-0.16,-0.61,-0.13,0.76,0.11,5.34,1.52 +-0.16,-0.61,-0.13,0.76,0.11,5.33,1.52 +-0.17,-0.61,-0.13,0.76,0.11,5.33,1.52 +-0.17,-0.61,-0.13,0.76,0.11,5.32,1.52 +-0.17,-0.61,-0.13,0.76,0.11,5.32,1.52 +-0.17,-0.61,-0.14,0.76,0.11,5.31,1.52 +-0.17,-0.61,-0.14,0.76,0.11,5.31,1.52 +-0.17,-0.62,-0.14,0.76,0.11,5.30,1.52 +-0.17,-0.62,-0.14,0.76,0.11,5.30,1.52 +-0.17,-0.62,-0.14,0.76,0.10,5.29,1.51 +-0.17,-0.62,-0.14,0.76,0.10,5.29,1.51 +-0.17,-0.62,-0.14,0.76,0.10,5.28,1.51 +-0.17,-0.62,-0.14,0.76,0.10,5.28,1.51 +-0.17,-0.62,-0.14,0.76,0.10,5.27,1.51 +-0.17,-0.62,-0.14,0.76,0.10,5.27,1.51 +-0.17,-0.62,-0.14,0.76,0.10,5.26,1.51 +-0.17,-0.62,-0.14,0.75,0.10,5.26,1.51 +-0.17,-0.62,-0.14,0.75,0.10,5.25,1.51 +-0.18,-0.62,-0.14,0.75,0.09,5.25,1.51 +-0.18,-0.62,-0.14,0.75,0.09,5.24,1.51 +-0.18,-0.62,-0.14,0.75,0.09,5.24,1.51 +-0.18,-0.62,-0.15,0.75,0.09,5.23,1.51 +-0.18,-0.62,-0.15,0.75,0.09,5.23,1.50 +-0.18,-0.62,-0.15,0.75,0.09,5.22,1.50 +-0.18,-0.62,-0.15,0.75,0.09,5.22,1.50 +-0.18,-0.62,-0.15,0.75,0.09,5.21,1.50 +-0.18,-0.62,-0.15,0.75,0.09,5.21,1.50 +-0.18,-0.62,-0.15,0.75,0.09,5.20,1.50 +-0.18,-0.62,-0.15,0.75,0.08,5.20,1.50 +-0.18,-0.62,-0.15,0.75,0.08,5.19,1.50 +-0.18,-0.62,-0.15,0.75,0.08,5.19,1.50 +-0.18,-0.62,-0.15,0.75,0.08,5.18,1.50 +-0.18,-0.62,-0.15,0.75,0.08,5.18,1.50 +-0.19,-0.62,-0.15,0.75,0.08,5.17,1.50 +-0.19,-0.62,-0.15,0.75,0.08,5.17,1.50 +-0.19,-0.62,-0.15,0.75,0.08,5.16,1.49 +-0.19,-0.62,-0.15,0.75,0.08,5.16,1.49 +-0.19,-0.62,-0.16,0.75,0.08,5.15,1.49 +-0.19,-0.62,-0.16,0.75,0.07,5.15,1.49 +-0.19,-0.62,-0.16,0.75,0.07,5.14,1.49 +-0.19,-0.62,-0.16,0.75,0.07,5.14,1.49 +-0.19,-0.62,-0.16,0.75,0.07,5.13,1.49 +-0.19,-0.62,-0.16,0.74,0.07,5.13,1.49 +-0.19,-0.62,-0.16,0.74,0.07,5.12,1.49 +-0.19,-0.62,-0.16,0.74,0.07,5.12,1.49 +-0.19,-0.62,-0.16,0.74,0.07,5.11,1.49 +-0.19,-0.62,-0.16,0.74,0.07,5.11,1.49 +-0.19,-0.62,-0.16,0.74,0.07,5.10,1.49 +-0.19,-0.62,-0.16,0.74,0.07,5.10,1.48 +-0.20,-0.62,-0.16,0.74,0.06,5.09,1.48 +-0.20,-0.62,-0.16,0.74,0.06,5.09,1.48 +-0.20,-0.62,-0.16,0.74,0.06,5.08,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.08,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.07,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.07,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.06,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.06,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.05,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.05,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.04,1.48 +-0.20,-0.62,-0.17,0.74,0.06,5.04,1.48 +-0.20,-0.62,-0.17,0.74,0.05,5.03,1.47 +-0.20,-0.62,-0.17,0.74,0.05,5.03,1.47 +-0.20,-0.62,-0.17,0.74,0.05,5.02,1.47 +-0.20,-0.62,-0.17,0.74,0.05,5.02,1.47 +-0.21,-0.62,-0.17,0.74,0.05,5.01,1.47 +-0.21,-0.62,-0.17,0.74,0.05,5.00,1.47 +-0.21,-0.62,-0.17,0.73,0.05,5.00,1.47 +-0.21,-0.62,-0.18,0.73,0.05,4.99,1.47 +-0.21,-0.62,-0.18,0.73,0.05,4.99,1.47 +-0.21,-0.62,-0.18,0.73,0.05,4.98,1.47 +-0.21,-0.62,-0.18,0.73,0.05,4.98,1.47 +-0.21,-0.62,-0.18,0.73,0.05,4.97,1.47 +-0.21,-0.62,-0.18,0.73,0.05,4.97,1.46 +-0.21,-0.62,-0.18,0.73,0.04,4.96,1.46 +-0.21,-0.62,-0.18,0.73,0.04,4.96,1.46 +-0.21,-0.62,-0.18,0.73,0.04,4.95,1.46 +-0.21,-0.62,-0.18,0.73,0.04,4.95,1.46 +-0.21,-0.62,-0.18,0.73,0.04,4.94,1.46 +-0.21,-0.62,-0.18,0.73,0.04,4.94,1.46 +-0.21,-0.62,-0.18,0.73,0.04,4.93,1.46 +-0.21,-0.62,-0.18,0.73,0.04,4.93,1.46 +-0.22,-0.62,-0.18,0.73,0.04,4.92,1.46 +-0.22,-0.62,-0.18,0.73,0.04,4.92,1.46 +-0.22,-0.62,-0.19,0.73,0.04,4.91,1.46 +-0.22,-0.62,-0.19,0.73,0.04,4.91,1.45 +-0.22,-0.62,-0.19,0.73,0.04,4.90,1.45 +-0.22,-0.62,-0.19,0.73,0.04,4.90,1.45 +-0.22,-0.62,-0.19,0.73,0.03,4.89,1.45 +-0.22,-0.62,-0.19,0.73,0.03,4.89,1.45 +-0.22,-0.62,-0.19,0.73,0.03,4.88,1.45 +-0.22,-0.62,-0.19,0.72,0.03,4.88,1.45 +-0.22,-0.62,-0.19,0.72,0.03,4.87,1.45 +-0.22,-0.62,-0.19,0.72,0.03,4.87,1.45 +-0.22,-0.62,-0.19,0.72,0.03,4.86,1.45 +-0.22,-0.62,-0.19,0.72,0.03,4.85,1.45 +-0.22,-0.62,-0.19,0.72,0.03,4.85,1.45 +-0.22,-0.62,-0.19,0.72,0.03,4.84,1.44 +-0.22,-0.62,-0.19,0.72,0.03,4.84,1.44 +-0.23,-0.62,-0.20,0.72,0.03,4.83,1.44 +-0.23,-0.62,-0.20,0.72,0.03,4.83,1.44 +-0.23,-0.63,-0.20,0.72,0.03,4.82,1.44 +-0.23,-0.63,-0.20,0.72,0.03,4.82,1.44 +-0.23,-0.63,-0.20,0.72,0.03,4.81,1.44 +-0.23,-0.63,-0.20,0.72,0.03,4.81,1.44 +-0.23,-0.63,-0.20,0.72,0.02,4.80,1.44 +-0.23,-0.63,-0.20,0.72,0.02,4.80,1.44 +-0.23,-0.63,-0.20,0.72,0.02,4.79,1.44 +-0.23,-0.63,-0.20,0.72,0.02,4.79,1.44 +-0.23,-0.63,-0.20,0.72,0.02,4.78,1.43 +-0.23,-0.63,-0.20,0.72,0.02,4.78,1.43 +-0.23,-0.63,-0.20,0.72,0.02,4.77,1.43 +-0.23,-0.63,-0.20,0.72,0.02,4.77,1.43 +-0.23,-0.63,-0.20,0.72,0.02,4.76,1.43 +-0.23,-0.63,-0.21,0.71,0.02,4.76,1.43 +-0.23,-0.63,-0.21,0.71,0.02,4.75,1.43 +-0.24,-0.63,-0.21,0.71,0.02,4.75,1.43 +-0.24,-0.63,-0.21,0.71,0.02,4.74,1.43 +-0.24,-0.63,-0.21,0.71,0.02,4.73,1.43 +-0.24,-0.63,-0.21,0.71,0.02,4.73,1.43 +-0.24,-0.63,-0.21,0.71,0.02,4.72,1.42 +-0.24,-0.63,-0.21,0.71,0.02,4.72,1.42 +-0.24,-0.63,-0.21,0.71,0.02,4.71,1.42 +-0.24,-0.63,-0.21,0.71,0.02,4.71,1.42 +-0.24,-0.63,-0.21,0.71,0.02,4.70,1.42 +-0.24,-0.63,-0.21,0.71,0.01,4.70,1.42 +-0.24,-0.63,-0.21,0.71,0.01,4.69,1.42 +-0.24,-0.63,-0.21,0.71,0.01,4.69,1.42 +-0.24,-0.63,-0.21,0.71,0.01,4.68,1.42 +-0.24,-0.63,-0.22,0.71,0.01,4.68,1.42 +-0.24,-0.63,-0.22,0.71,0.01,4.67,1.42 +-0.24,-0.63,-0.22,0.71,0.01,4.67,1.42 +-0.24,-0.63,-0.22,0.71,0.01,4.66,1.41 +-0.25,-0.63,-0.22,0.71,0.01,4.66,1.41 +-0.25,-0.63,-0.22,0.71,0.01,4.65,1.41 +-0.25,-0.63,-0.22,0.71,0.01,4.65,1.41 +-0.25,-0.63,-0.22,0.71,0.01,4.64,1.41 +-0.25,-0.63,-0.22,0.70,0.01,4.63,1.41 +-0.25,-0.63,-0.22,0.70,0.01,4.63,1.41 +-0.25,-0.63,-0.22,0.70,0.01,4.62,1.41 +-0.25,-0.63,-0.22,0.70,0.01,4.62,1.41 +-0.25,-0.63,-0.22,0.70,0.01,4.61,1.41 +-0.25,-0.63,-0.22,0.70,0.01,4.61,1.41 +-0.25,-0.63,-0.22,0.70,0.01,4.60,1.40 +-0.25,-0.63,-0.22,0.70,0.01,4.60,1.40 +-0.25,-0.63,-0.23,0.70,0.01,4.59,1.40 +-0.25,-0.63,-0.23,0.70,0.01,4.59,1.40 +-0.25,-0.63,-0.23,0.70,0.01,4.58,1.40 +-0.25,-0.63,-0.23,0.70,0.01,4.58,1.40 +-0.25,-0.63,-0.23,0.70,0.01,4.57,1.40 +-0.25,-0.63,-0.23,0.70,0.01,4.57,1.40 +-0.26,-0.63,-0.23,0.70,0.01,4.56,1.40 +-0.26,-0.63,-0.23,0.70,0.01,4.55,1.40 +-0.26,-0.63,-0.23,0.70,0.01,4.55,1.40 +-0.26,-0.63,-0.23,0.70,0.01,4.54,1.39 +-0.26,-0.63,-0.23,0.70,0.00,4.54,1.39 +-0.26,-0.63,-0.23,0.70,0.00,4.53,1.39 +-0.26,-0.63,-0.23,0.70,0.00,4.53,1.39 +-0.26,-0.63,-0.23,0.70,0.00,4.52,1.39 +-0.26,-0.63,-0.23,0.69,0.00,4.52,1.39 +-0.26,-0.63,-0.24,0.69,0.00,4.51,1.39 +-0.26,-0.63,-0.24,0.69,0.00,4.51,1.39 +-0.26,-0.63,-0.24,0.69,0.00,4.50,1.39 +-0.26,-0.63,-0.24,0.69,0.00,4.50,1.39 +-0.26,-0.63,-0.24,0.69,0.00,4.49,1.39 +-0.26,-0.63,-0.24,0.69,0.00,4.49,1.38 +-0.26,-0.63,-0.24,0.69,0.00,4.48,1.38 +-0.26,-0.63,-0.24,0.69,0.00,4.48,1.38 +-0.26,-0.63,-0.24,0.69,0.00,4.47,1.38 +-0.27,-0.63,-0.24,0.69,0.00,4.46,1.38 +-0.27,-0.63,-0.24,0.69,0.00,4.46,1.38 +-0.27,-0.63,-0.24,0.69,0.00,4.45,1.38 +-0.27,-0.63,-0.24,0.69,0.00,4.45,1.38 +-0.27,-0.63,-0.24,0.69,0.00,4.44,1.38 +-0.27,-0.63,-0.24,0.69,0.00,4.44,1.38 +-0.27,-0.63,-0.25,0.69,0.00,4.43,1.38 +-0.27,-0.63,-0.25,0.69,0.00,4.43,1.37 +-0.27,-0.63,-0.25,0.69,0.00,4.42,1.37 +-0.27,-0.63,-0.25,0.69,0.00,4.42,1.37 +-0.27,-0.63,-0.25,0.69,0.00,4.41,1.37 +-0.27,-0.63,-0.25,0.69,0.00,4.41,1.37 +-0.27,-0.63,-0.25,0.68,0.00,4.40,1.37 +-0.27,-0.63,-0.25,0.68,0.00,4.39,1.37 +-0.27,-0.63,-0.25,0.68,0.00,4.39,1.37 +-0.27,-0.63,-0.25,0.68,0.00,4.38,1.37 +-0.27,-0.63,-0.25,0.68,0.00,4.38,1.37 +-0.27,-0.63,-0.25,0.68,0.00,4.37,1.36 +-0.28,-0.63,-0.25,0.68,0.00,4.37,1.36 +-0.28,-0.63,-0.25,0.68,0.00,4.36,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.36,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.35,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.35,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.34,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.34,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.33,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.32,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.32,1.36 +-0.28,-0.63,-0.26,0.68,0.00,4.31,1.35 +-0.28,-0.63,-0.26,0.68,0.00,4.31,1.35 +-0.28,-0.63,-0.26,0.68,0.00,4.30,1.35 +-0.28,-0.63,-0.26,0.68,0.00,4.30,1.35 +-0.28,-0.63,-0.26,0.68,0.00,4.29,1.35 +-0.28,-0.63,-0.26,0.67,0.00,4.29,1.35 +-0.28,-0.63,-0.26,0.67,0.00,4.28,1.35 +-0.28,-0.63,-0.27,0.67,0.00,4.28,1.35 +-0.28,-0.63,-0.27,0.67,0.00,4.27,1.35 +-0.29,-0.63,-0.27,0.67,0.00,4.27,1.35 +-0.29,-0.63,-0.27,0.67,0.00,4.26,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.25,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.25,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.24,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.24,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.23,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.23,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.22,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.22,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.21,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.21,1.34 +-0.29,-0.63,-0.27,0.67,0.00,4.20,1.33 +-0.29,-0.63,-0.28,0.67,0.00,4.20,1.33 +-0.29,-0.63,-0.28,0.67,0.00,4.19,1.33 +-0.29,-0.63,-0.28,0.67,0.00,4.18,1.33 +-0.29,-0.63,-0.28,0.67,0.00,4.18,1.33 +-0.29,-0.63,-0.28,0.66,0.00,4.17,1.33 +-0.29,-0.63,-0.28,0.66,0.00,4.17,1.33 +-0.30,-0.63,-0.28,0.66,0.00,4.16,1.33 +-0.30,-0.63,-0.28,0.66,0.00,4.16,1.33 +-0.30,-0.63,-0.28,0.66,0.00,4.15,1.33 +-0.30,-0.63,-0.28,0.66,0.00,4.15,1.32 +-0.30,-0.63,-0.28,0.66,0.00,4.14,1.32 +-0.30,-0.63,-0.28,0.66,0.00,4.14,1.32 +-0.30,-0.63,-0.28,0.66,0.00,4.13,1.32 +-0.30,-0.63,-0.28,0.66,0.00,4.12,1.32 +-0.30,-0.63,-0.28,0.66,0.00,4.12,1.32 +-0.30,-0.63,-0.29,0.66,0.00,4.11,1.32 +-0.30,-0.63,-0.29,0.66,0.01,4.11,1.32 +-0.30,-0.63,-0.29,0.66,0.01,4.10,1.32 +-0.30,-0.63,-0.29,0.66,0.01,4.10,1.32 +-0.30,-0.63,-0.29,0.66,0.01,4.09,1.31 +-0.30,-0.63,-0.29,0.66,0.01,4.09,1.31 +-0.30,-0.63,-0.29,0.66,0.01,4.08,1.31 +-0.30,-0.63,-0.29,0.66,0.01,4.08,1.31 +-0.30,-0.63,-0.29,0.66,0.01,4.07,1.31 +-0.30,-0.63,-0.29,0.65,0.01,4.06,1.31 +-0.30,-0.63,-0.29,0.65,0.01,4.06,1.31 +-0.31,-0.63,-0.29,0.65,0.01,4.05,1.31 +-0.31,-0.63,-0.29,0.65,0.01,4.05,1.31 +-0.31,-0.63,-0.29,0.65,0.01,4.04,1.31 +-0.31,-0.63,-0.29,0.65,0.01,4.04,1.30 +-0.31,-0.63,-0.30,0.65,0.01,4.03,1.30 +-0.31,-0.63,-0.30,0.65,0.01,4.03,1.30 +-0.31,-0.63,-0.30,0.65,0.01,4.02,1.30 +-0.31,-0.63,-0.30,0.65,0.01,4.02,1.30 +-0.31,-0.63,-0.30,0.65,0.01,4.01,1.30 +-0.31,-0.63,-0.30,0.65,0.01,4.00,1.30 +-0.31,-0.63,-0.30,0.65,0.01,4.00,1.30 +-0.31,-0.63,-0.30,0.65,0.01,3.99,1.30 +-0.31,-0.63,-0.30,0.65,0.01,3.99,1.30 +-0.31,-0.63,-0.30,0.65,0.01,3.98,1.29 +-0.31,-0.63,-0.30,0.65,0.01,3.98,1.29 +-0.31,-0.63,-0.30,0.65,0.01,3.97,1.29 +-0.31,-0.63,-0.30,0.65,0.01,3.97,1.29 +-0.31,-0.63,-0.30,0.65,0.01,3.96,1.29 +-0.31,-0.63,-0.31,0.64,0.01,3.96,1.29 +-0.31,-0.63,-0.31,0.64,0.02,3.95,1.29 +-0.32,-0.63,-0.31,0.64,0.02,3.94,1.29 +-0.32,-0.63,-0.31,0.64,0.02,3.94,1.29 +-0.32,-0.63,-0.31,0.64,0.02,3.93,1.29 +-0.32,-0.63,-0.31,0.64,0.02,3.93,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.92,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.92,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.91,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.91,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.90,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.90,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.89,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.88,1.28 +-0.32,-0.63,-0.31,0.64,0.02,3.88,1.28 +-0.32,-0.63,-0.32,0.64,0.02,3.87,1.27 +-0.32,-0.63,-0.32,0.64,0.02,3.87,1.27 +-0.32,-0.63,-0.32,0.64,0.02,3.86,1.27 +-0.32,-0.63,-0.32,0.64,0.02,3.86,1.27 +-0.32,-0.63,-0.32,0.64,0.02,3.85,1.27 +-0.32,-0.63,-0.32,0.63,0.02,3.85,1.27 +-0.32,-0.63,-0.32,0.63,0.03,3.84,1.27 +-0.32,-0.63,-0.32,0.63,0.03,3.83,1.27 +-0.33,-0.63,-0.32,0.63,0.03,3.83,1.27 +-0.33,-0.62,-0.32,0.63,0.03,3.82,1.26 +-0.33,-0.62,-0.32,0.63,0.03,3.82,1.26 +-0.33,-0.62,-0.32,0.63,0.03,3.81,1.26 +-0.33,-0.62,-0.32,0.63,0.03,3.81,1.26 +-0.33,-0.62,-0.32,0.63,0.03,3.80,1.26 +-0.33,-0.62,-0.33,0.63,0.03,3.80,1.26 +-0.33,-0.62,-0.33,0.63,0.03,3.79,1.26 +-0.33,-0.62,-0.33,0.63,0.03,3.79,1.26 +-0.33,-0.62,-0.33,0.63,0.03,3.78,1.26 +-0.33,-0.62,-0.33,0.63,0.03,3.77,1.26 +-0.33,-0.62,-0.33,0.63,0.03,3.77,1.25 +-0.33,-0.62,-0.33,0.63,0.03,3.76,1.25 +-0.33,-0.62,-0.33,0.63,0.03,3.76,1.25 +-0.33,-0.62,-0.33,0.63,0.04,3.75,1.25 +-0.33,-0.62,-0.33,0.63,0.04,3.75,1.25 +-0.33,-0.62,-0.33,0.62,0.04,3.74,1.25 +-0.33,-0.62,-0.33,0.62,0.04,3.74,1.25 +-0.33,-0.62,-0.33,0.62,0.04,3.73,1.25 +-0.33,-0.62,-0.33,0.62,0.04,3.72,1.25 +-0.33,-0.62,-0.33,0.62,0.04,3.72,1.25 +-0.33,-0.62,-0.34,0.62,0.04,3.71,1.24 +-0.34,-0.62,-0.34,0.62,0.04,3.71,1.24 +-0.34,-0.62,-0.34,0.62,0.04,3.70,1.24 +-0.34,-0.62,-0.34,0.62,0.04,3.70,1.24 +-0.34,-0.62,-0.34,0.62,0.04,3.69,1.24 +-0.34,-0.62,-0.34,0.62,0.04,3.69,1.24 +-0.34,-0.62,-0.34,0.62,0.04,3.68,1.24 +-0.34,-0.62,-0.34,0.62,0.05,3.68,1.24 +-0.34,-0.62,-0.34,0.62,0.05,3.67,1.24 +-0.34,-0.62,-0.34,0.62,0.05,3.66,1.23 +-0.34,-0.62,-0.34,0.62,0.05,3.66,1.23 +-0.34,-0.62,-0.34,0.62,0.05,3.65,1.23 +-0.34,-0.62,-0.34,0.62,0.05,3.65,1.23 +-0.34,-0.62,-0.34,0.62,0.05,3.64,1.23 +-0.34,-0.62,-0.35,0.61,0.05,3.64,1.23 +-0.34,-0.62,-0.35,0.61,0.05,3.63,1.23 +-0.34,-0.62,-0.35,0.61,0.05,3.63,1.23 +-0.34,-0.62,-0.35,0.61,0.05,3.62,1.23 +-0.34,-0.62,-0.35,0.61,0.05,3.61,1.23 +-0.34,-0.62,-0.35,0.61,0.06,3.61,1.22 +-0.34,-0.62,-0.35,0.61,0.06,3.60,1.22 +-0.34,-0.62,-0.35,0.61,0.06,3.60,1.22 +-0.34,-0.62,-0.35,0.61,0.06,3.59,1.22 +-0.34,-0.62,-0.35,0.61,0.06,3.59,1.22 +-0.35,-0.62,-0.35,0.61,0.06,3.58,1.22 +-0.35,-0.62,-0.35,0.61,0.06,3.58,1.22 +-0.35,-0.62,-0.35,0.61,0.06,3.57,1.22 +-0.35,-0.62,-0.35,0.61,0.06,3.57,1.22 +-0.35,-0.62,-0.35,0.61,0.06,3.56,1.21 +-0.35,-0.62,-0.36,0.61,0.06,3.55,1.21 +-0.35,-0.62,-0.36,0.61,0.07,3.55,1.21 +-0.35,-0.62,-0.36,0.61,0.07,3.54,1.21 +-0.35,-0.62,-0.36,0.61,0.07,3.54,1.21 +-0.35,-0.62,-0.36,0.60,0.07,3.53,1.21 +-0.35,-0.62,-0.36,0.60,0.07,3.53,1.21 +-0.35,-0.62,-0.36,0.60,0.07,3.52,1.21 +-0.35,-0.62,-0.36,0.60,0.07,3.52,1.21 +-0.35,-0.62,-0.36,0.60,0.07,3.51,1.20 +-0.35,-0.62,-0.36,0.60,0.07,3.50,1.20 +-0.35,-0.62,-0.36,0.60,0.07,3.50,1.20 +-0.35,-0.62,-0.36,0.60,0.07,3.49,1.20 +-0.35,-0.62,-0.36,0.60,0.08,3.49,1.20 +-0.35,-0.62,-0.36,0.60,0.08,3.48,1.20 +-0.35,-0.62,-0.37,0.60,0.08,3.48,1.20 +-0.35,-0.62,-0.37,0.60,0.08,3.47,1.20 +-0.35,-0.62,-0.37,0.60,0.08,3.47,1.20 +-0.35,-0.62,-0.37,0.60,0.08,3.46,1.20 +-0.36,-0.62,-0.37,0.60,0.08,3.45,1.19 +-0.36,-0.62,-0.37,0.60,0.08,3.45,1.19 +-0.36,-0.62,-0.37,0.60,0.08,3.44,1.19 +-0.36,-0.62,-0.37,0.60,0.08,3.44,1.19 +-0.36,-0.62,-0.37,0.59,0.09,3.43,1.19 +-0.36,-0.62,-0.37,0.59,0.09,3.43,1.19 +-0.36,-0.62,-0.37,0.59,0.09,3.42,1.19 +-0.36,-0.62,-0.37,0.59,0.09,3.42,1.19 +-0.36,-0.62,-0.37,0.59,0.09,3.41,1.19 +-0.36,-0.62,-0.37,0.59,0.09,3.41,1.18 +-0.36,-0.62,-0.37,0.59,0.09,3.40,1.18 +-0.36,-0.62,-0.38,0.59,0.09,3.39,1.18 +-0.36,-0.62,-0.38,0.59,0.09,3.39,1.18 +-0.36,-0.62,-0.38,0.59,0.10,3.38,1.18 +-0.36,-0.62,-0.38,0.59,0.10,3.38,1.18 +-0.36,-0.62,-0.38,0.59,0.10,3.37,1.18 +-0.36,-0.62,-0.38,0.59,0.10,3.37,1.18 +-0.36,-0.62,-0.38,0.59,0.10,3.36,1.18 +-0.36,-0.62,-0.38,0.59,0.10,3.36,1.17 +-0.36,-0.62,-0.38,0.59,0.10,3.35,1.17 +-0.36,-0.62,-0.38,0.59,0.10,3.34,1.17 +-0.36,-0.62,-0.38,0.59,0.10,3.34,1.17 +-0.36,-0.62,-0.38,0.59,0.11,3.33,1.17 +-0.36,-0.62,-0.38,0.58,0.11,3.33,1.17 +-0.37,-0.61,-0.38,0.58,0.11,3.32,1.17 +-0.37,-0.61,-0.39,0.58,0.11,3.32,1.17 +-0.37,-0.61,-0.39,0.58,0.11,3.31,1.17 +-0.37,-0.61,-0.39,0.58,0.11,3.31,1.16 +-0.37,-0.61,-0.39,0.58,0.11,3.30,1.16 +-0.37,-0.61,-0.39,0.58,0.11,3.29,1.16 +-0.37,-0.61,-0.39,0.58,0.12,3.29,1.16 +-0.37,-0.61,-0.39,0.58,0.12,3.28,1.16 +-0.37,-0.61,-0.39,0.58,0.12,3.28,1.16 +-0.37,-0.61,-0.39,0.58,0.12,3.27,1.16 +-0.37,-0.61,-0.39,0.58,0.12,3.27,1.16 +-0.37,-0.61,-0.39,0.58,0.12,3.26,1.16 +-0.37,-0.61,-0.39,0.58,0.12,3.26,1.15 +-0.37,-0.61,-0.39,0.58,0.12,3.25,1.15 +-0.37,-0.61,-0.39,0.58,0.13,3.24,1.15 +-0.37,-0.61,-0.39,0.58,0.13,3.24,1.15 +-0.37,-0.61,-0.40,0.58,0.13,3.23,1.15 +-0.37,-0.61,-0.40,0.57,0.13,3.23,1.15 +-0.37,-0.61,-0.40,0.57,0.13,3.22,1.15 +-0.37,-0.61,-0.40,0.57,0.13,3.22,1.15 +-0.37,-0.61,-0.40,0.57,0.13,3.21,1.15 +-0.37,-0.61,-0.40,0.57,0.13,3.21,1.14 +-0.37,-0.61,-0.40,0.57,0.14,3.20,1.14 +-0.37,-0.61,-0.40,0.57,0.14,3.20,1.14 +-0.37,-0.61,-0.40,0.57,0.14,3.19,1.14 +-0.37,-0.61,-0.40,0.57,0.14,3.18,1.14 +-0.38,-0.61,-0.40,0.57,0.14,3.18,1.14 +-0.38,-0.61,-0.40,0.57,0.14,3.17,1.14 +-0.38,-0.61,-0.40,0.57,0.14,3.17,1.14 +-0.38,-0.61,-0.40,0.57,0.15,3.16,1.14 +-0.38,-0.61,-0.41,0.57,0.15,3.16,1.13 +-0.38,-0.61,-0.41,0.57,0.15,3.15,1.13 +-0.38,-0.61,-0.41,0.57,0.15,3.15,1.13 +-0.38,-0.61,-0.41,0.57,0.15,3.14,1.13 +-0.38,-0.61,-0.41,0.57,0.15,3.13,1.13 +-0.38,-0.61,-0.41,0.56,0.15,3.13,1.13 +-0.38,-0.61,-0.41,0.56,0.16,3.12,1.13 +-0.38,-0.61,-0.41,0.56,0.16,3.12,1.13 +-0.38,-0.61,-0.41,0.56,0.16,3.11,1.13 +-0.38,-0.61,-0.41,0.56,0.16,3.11,1.12 +-0.38,-0.61,-0.41,0.56,0.16,3.10,1.12 +-0.38,-0.61,-0.41,0.56,0.16,3.10,1.12 +-0.38,-0.61,-0.41,0.56,0.16,3.09,1.12 +-0.38,-0.61,-0.41,0.56,0.17,3.08,1.12 +-0.38,-0.61,-0.41,0.56,0.17,3.08,1.12 +-0.38,-0.61,-0.42,0.56,0.17,3.07,1.12 +-0.38,-0.61,-0.42,0.56,0.17,3.07,1.12 +-0.38,-0.61,-0.42,0.56,0.17,3.06,1.12 +-0.38,-0.61,-0.42,0.56,0.17,3.06,1.11 +-0.38,-0.61,-0.42,0.56,0.17,3.05,1.11 +-0.38,-0.61,-0.42,0.56,0.18,3.05,1.11 +-0.38,-0.61,-0.42,0.56,0.18,3.04,1.11 +-0.38,-0.61,-0.42,0.55,0.18,3.03,1.11 +-0.39,-0.61,-0.42,0.55,0.18,3.03,1.11 +-0.39,-0.61,-0.42,0.55,0.18,3.02,1.11 +-0.39,-0.61,-0.42,0.55,0.18,3.02,1.11 +-0.39,-0.61,-0.42,0.55,0.18,3.01,1.11 +-0.39,-0.61,-0.42,0.55,0.19,3.01,1.10 +-0.39,-0.60,-0.42,0.55,0.19,3.00,1.10 +-0.39,-0.60,-0.43,0.55,0.19,3.00,1.10 +-0.39,-0.60,-0.43,0.55,0.19,2.99,1.10 +-0.39,-0.60,-0.43,0.55,0.19,2.99,1.10 +-0.39,-0.60,-0.43,0.55,0.19,2.98,1.10 +-0.39,-0.60,-0.43,0.55,0.20,2.97,1.10 +-0.39,-0.60,-0.43,0.55,0.20,2.97,1.10 +-0.39,-0.60,-0.43,0.55,0.20,2.96,1.10 +-0.39,-0.60,-0.43,0.55,0.20,2.96,1.09 +-0.39,-0.60,-0.43,0.55,0.20,2.95,1.09 +-0.39,-0.60,-0.43,0.55,0.20,2.95,1.09 +-0.39,-0.60,-0.43,0.55,0.21,2.94,1.09 +-0.39,-0.60,-0.43,0.54,0.21,2.94,1.09 +-0.39,-0.60,-0.43,0.54,0.21,2.93,1.09 +-0.39,-0.60,-0.43,0.54,0.21,2.92,1.09 +-0.39,-0.60,-0.43,0.54,0.21,2.92,1.09 +-0.39,-0.60,-0.44,0.54,0.21,2.91,1.08 +-0.39,-0.60,-0.44,0.54,0.22,2.91,1.08 +-0.39,-0.60,-0.44,0.54,0.22,2.90,1.08 +-0.39,-0.60,-0.44,0.54,0.22,2.90,1.08 +-0.39,-0.60,-0.44,0.54,0.22,2.89,1.08 +-0.39,-0.60,-0.44,0.54,0.22,2.89,1.08 +-0.39,-0.60,-0.44,0.54,0.22,2.88,1.08 +-0.40,-0.60,-0.44,0.54,0.23,2.88,1.08 +-0.40,-0.60,-0.44,0.54,0.23,2.87,1.08 +-0.40,-0.60,-0.44,0.54,0.23,2.86,1.07 +-0.40,-0.60,-0.44,0.54,0.23,2.86,1.07 +-0.40,-0.60,-0.44,0.54,0.23,2.85,1.07 +-0.40,-0.60,-0.44,0.54,0.23,2.85,1.07 +-0.40,-0.60,-0.44,0.54,0.24,2.84,1.07 +-0.40,-0.60,-0.45,0.53,0.24,2.84,1.07 +-0.40,-0.60,-0.45,0.53,0.24,2.83,1.07 +-0.40,-0.60,-0.45,0.53,0.24,2.83,1.07 +-0.40,-0.60,-0.45,0.53,0.24,2.82,1.07 +-0.40,-0.60,-0.45,0.53,0.25,2.81,1.06 +-0.40,-0.60,-0.45,0.53,0.25,2.81,1.06 +-0.40,-0.60,-0.45,0.53,0.25,2.80,1.06 +-0.40,-0.60,-0.45,0.53,0.25,2.80,1.06 +-0.40,-0.60,-0.45,0.53,0.25,2.79,1.06 +-0.40,-0.60,-0.45,0.53,0.25,2.79,1.06 +-0.40,-0.60,-0.45,0.53,0.26,2.78,1.06 +-0.40,-0.60,-0.45,0.53,0.26,2.78,1.06 +-0.40,-0.60,-0.45,0.53,0.26,2.77,1.06 +-0.40,-0.60,-0.45,0.53,0.26,2.77,1.05 +-0.40,-0.60,-0.45,0.53,0.26,2.76,1.05 +-0.40,-0.60,-0.46,0.53,0.27,2.75,1.05 +-0.40,-0.59,-0.46,0.53,0.27,2.75,1.05 +-0.40,-0.59,-0.46,0.52,0.27,2.74,1.05 +-0.40,-0.59,-0.46,0.52,0.27,2.74,1.05 +-0.40,-0.59,-0.46,0.52,0.27,2.73,1.05 +-0.40,-0.59,-0.46,0.52,0.27,2.73,1.05 +-0.40,-0.59,-0.46,0.52,0.28,2.72,1.04 +-0.40,-0.59,-0.46,0.52,0.28,2.72,1.04 +-0.40,-0.59,-0.46,0.52,0.28,2.71,1.04 +-0.41,-0.59,-0.46,0.52,0.28,2.70,1.04 +-0.41,-0.59,-0.46,0.52,0.28,2.70,1.04 +-0.41,-0.59,-0.46,0.52,0.29,2.69,1.04 +-0.41,-0.59,-0.46,0.52,0.29,2.69,1.04 +-0.41,-0.59,-0.46,0.52,0.29,2.68,1.04 +-0.41,-0.59,-0.46,0.52,0.29,2.68,1.04 +-0.41,-0.59,-0.47,0.52,0.29,2.67,1.03 +-0.41,-0.59,-0.47,0.52,0.30,2.67,1.03 +-0.41,-0.59,-0.47,0.52,0.30,2.66,1.03 +-0.41,-0.59,-0.47,0.52,0.30,2.66,1.03 +-0.41,-0.59,-0.47,0.51,0.30,2.65,1.03 +-0.41,-0.59,-0.47,0.51,0.30,2.64,1.03 +-0.41,-0.59,-0.47,0.51,0.31,2.64,1.03 +-0.41,-0.59,-0.47,0.51,0.31,2.63,1.03 +-0.41,-0.59,-0.47,0.51,0.31,2.63,1.03 +-0.41,-0.59,-0.47,0.51,0.31,2.62,1.02 +-0.41,-0.59,-0.47,0.51,0.31,2.62,1.02 +-0.41,-0.59,-0.47,0.51,0.32,2.61,1.02 +-0.41,-0.59,-0.47,0.51,0.32,2.61,1.02 +-0.41,-0.59,-0.47,0.51,0.32,2.60,1.02 +-0.41,-0.59,-0.48,0.51,0.32,2.60,1.02 +-0.41,-0.59,-0.48,0.51,0.32,2.59,1.02 +-0.41,-0.59,-0.48,0.51,0.33,2.58,1.02 +-0.41,-0.59,-0.48,0.51,0.33,2.58,1.01 +-0.41,-0.59,-0.48,0.51,0.33,2.57,1.01 +-0.41,-0.59,-0.48,0.51,0.33,2.57,1.01 +-0.41,-0.59,-0.48,0.51,0.34,2.56,1.01 +-0.41,-0.59,-0.48,0.50,0.34,2.56,1.01 +-0.41,-0.59,-0.48,0.50,0.34,2.55,1.01 +-0.41,-0.59,-0.48,0.50,0.34,2.55,1.01 +-0.41,-0.59,-0.48,0.50,0.34,2.54,1.01 +-0.41,-0.59,-0.48,0.50,0.35,2.54,1.01 +-0.41,-0.58,-0.48,0.50,0.35,2.53,1.00 +-0.42,-0.58,-0.48,0.50,0.35,2.52,1.00 +-0.42,-0.58,-0.48,0.50,0.35,2.52,1.00 +-0.42,-0.58,-0.49,0.50,0.35,2.51,1.00 +-0.42,-0.58,-0.49,0.50,0.36,2.51,1.00 +-0.42,-0.58,-0.49,0.50,0.36,2.50,1.00 +-0.42,-0.58,-0.49,0.50,0.36,2.50,1.00 +-0.42,-0.58,-0.49,0.50,0.36,2.49,1.00 +-0.42,-0.58,-0.49,0.50,0.37,2.49,0.99 +-0.42,-0.58,-0.49,0.50,0.37,2.48,0.99 +-0.42,-0.58,-0.49,0.50,0.37,2.48,0.99 +-0.42,-0.58,-0.49,0.50,0.37,2.47,0.99 +-0.42,-0.58,-0.49,0.50,0.37,2.46,0.99 +-0.42,-0.58,-0.49,0.49,0.38,2.46,0.99 +-0.42,-0.58,-0.49,0.49,0.38,2.45,0.99 +-0.42,-0.58,-0.49,0.49,0.38,2.45,0.99 +-0.42,-0.58,-0.49,0.49,0.38,2.44,0.99 +-0.42,-0.58,-0.49,0.49,0.39,2.44,0.98 +-0.42,-0.58,-0.50,0.49,0.39,2.43,0.98 +-0.42,-0.58,-0.50,0.49,0.39,2.43,0.98 +-0.42,-0.58,-0.50,0.49,0.39,2.42,0.98 +-0.42,-0.58,-0.50,0.49,0.39,2.42,0.98 +-0.42,-0.58,-0.50,0.49,0.40,2.41,0.98 +-0.42,-0.58,-0.50,0.49,0.40,2.41,0.98 +-0.42,-0.58,-0.50,0.49,0.40,2.40,0.98 +-0.42,-0.58,-0.50,0.49,0.40,2.39,0.97 +-0.42,-0.58,-0.50,0.49,0.41,2.39,0.97 +-0.42,-0.58,-0.50,0.49,0.41,2.38,0.97 +-0.42,-0.58,-0.50,0.49,0.41,2.38,0.97 +-0.42,-0.58,-0.50,0.49,0.41,2.37,0.97 +-0.42,-0.58,-0.50,0.48,0.41,2.37,0.97 +-0.42,-0.58,-0.50,0.48,0.42,2.36,0.97 +-0.42,-0.58,-0.51,0.48,0.42,2.36,0.97 +-0.42,-0.58,-0.51,0.48,0.42,2.35,0.97 +-0.42,-0.58,-0.51,0.48,0.42,2.35,0.96 +-0.42,-0.58,-0.51,0.48,0.43,2.34,0.96 +-0.42,-0.57,-0.51,0.48,0.43,2.33,0.96 +-0.43,-0.57,-0.51,0.48,0.43,2.33,0.96 +-0.43,-0.57,-0.51,0.48,0.43,2.32,0.96 +-0.43,-0.57,-0.51,0.48,0.44,2.32,0.96 +-0.43,-0.57,-0.51,0.48,0.44,2.31,0.96 +-0.43,-0.57,-0.51,0.48,0.44,2.31,0.96 +-0.43,-0.57,-0.51,0.48,0.44,2.30,0.95 +-0.43,-0.57,-0.51,0.48,0.45,2.30,0.95 +-0.43,-0.57,-0.51,0.48,0.45,2.29,0.95 +-0.43,-0.57,-0.51,0.48,0.45,2.29,0.95 +-0.43,-0.57,-0.51,0.48,0.45,2.28,0.95 +-0.43,-0.57,-0.52,0.47,0.46,2.28,0.95 +-0.43,-0.57,-0.52,0.47,0.46,2.27,0.95 +-0.43,-0.57,-0.52,0.47,0.46,2.26,0.95 +-0.43,-0.57,-0.52,0.47,0.46,2.26,0.95 +-0.43,-0.57,-0.52,0.47,0.47,2.25,0.94 +-0.43,-0.57,-0.52,0.47,0.47,2.25,0.94 +-0.43,-0.57,-0.52,0.47,0.47,2.24,0.94 +-0.43,-0.57,-0.52,0.47,0.47,2.24,0.94 +-0.43,-0.57,-0.52,0.47,0.48,2.23,0.94 +-0.43,-0.57,-0.52,0.47,0.48,2.23,0.94 +-0.43,-0.57,-0.52,0.47,0.48,2.22,0.94 +-0.43,-0.57,-0.52,0.47,0.48,2.22,0.94 +-0.43,-0.57,-0.52,0.47,0.49,2.21,0.93 +-0.43,-0.57,-0.52,0.47,0.49,2.21,0.93 +-0.43,-0.57,-0.52,0.47,0.49,2.20,0.93 +-0.43,-0.57,-0.53,0.47,0.49,2.19,0.93 +-0.43,-0.57,-0.53,0.46,0.50,2.19,0.93 +-0.43,-0.57,-0.53,0.46,0.50,2.18,0.93 +-0.43,-0.57,-0.53,0.46,0.50,2.18,0.93 +-0.43,-0.57,-0.53,0.46,0.50,2.17,0.93 +-0.43,-0.57,-0.53,0.46,0.51,2.17,0.93 +-0.43,-0.56,-0.53,0.46,0.51,2.16,0.92 +-0.43,-0.56,-0.53,0.46,0.51,2.16,0.92 +-0.43,-0.56,-0.53,0.46,0.51,2.15,0.92 +-0.43,-0.56,-0.53,0.46,0.52,2.15,0.92 +-0.43,-0.56,-0.53,0.46,0.52,2.14,0.92 +-0.43,-0.56,-0.53,0.46,0.52,2.14,0.92 +-0.43,-0.56,-0.53,0.46,0.52,2.13,0.92 +-0.43,-0.56,-0.53,0.46,0.53,2.13,0.92 +-0.43,-0.56,-0.53,0.46,0.53,2.12,0.91 +-0.44,-0.56,-0.54,0.46,0.53,2.11,0.91 +-0.44,-0.56,-0.54,0.46,0.53,2.11,0.91 +-0.44,-0.56,-0.54,0.46,0.54,2.10,0.91 +-0.44,-0.56,-0.54,0.45,0.54,2.10,0.91 +-0.44,-0.56,-0.54,0.45,0.54,2.09,0.91 +-0.44,-0.56,-0.54,0.45,0.55,2.09,0.91 +-0.44,-0.56,-0.54,0.45,0.55,2.08,0.91 +-0.44,-0.56,-0.54,0.45,0.55,2.08,0.90 +-0.44,-0.56,-0.54,0.45,0.55,2.07,0.90 +-0.44,-0.56,-0.54,0.45,0.56,2.07,0.90 +-0.44,-0.56,-0.54,0.45,0.56,2.06,0.90 +-0.44,-0.56,-0.54,0.45,0.56,2.06,0.90 +-0.44,-0.56,-0.54,0.45,0.56,2.05,0.90 +-0.44,-0.56,-0.54,0.45,0.57,2.05,0.90 +-0.44,-0.56,-0.54,0.45,0.57,2.04,0.90 +-0.44,-0.56,-0.55,0.45,0.57,2.03,0.90 +-0.44,-0.56,-0.55,0.45,0.58,2.03,0.89 +-0.44,-0.56,-0.55,0.45,0.58,2.02,0.89 +-0.44,-0.56,-0.55,0.45,0.58,2.02,0.89 +-0.44,-0.56,-0.55,0.45,0.58,2.01,0.89 +-0.44,-0.56,-0.55,0.44,0.59,2.01,0.89 +-0.44,-0.55,-0.55,0.44,0.59,2.00,0.89 +-0.44,-0.55,-0.55,0.44,0.59,2.00,0.89 +-0.44,-0.55,-0.55,0.44,0.59,1.99,0.89 +-0.44,-0.55,-0.55,0.44,0.60,1.99,0.88 +-0.44,-0.55,-0.55,0.44,0.60,1.98,0.88 +-0.44,-0.55,-0.55,0.44,0.60,1.98,0.88 +-0.44,-0.55,-0.55,0.44,0.61,1.97,0.88 +-0.44,-0.55,-0.55,0.44,0.61,1.97,0.88 +-0.44,-0.55,-0.55,0.44,0.61,1.96,0.88 +-0.44,-0.55,-0.56,0.44,0.61,1.96,0.88 +-0.44,-0.55,-0.56,0.44,0.62,1.95,0.88 +-0.44,-0.55,-0.56,0.44,0.62,1.94,0.88 +-0.44,-0.55,-0.56,0.44,0.62,1.94,0.87 +-0.44,-0.55,-0.56,0.44,0.63,1.93,0.87 +-0.44,-0.55,-0.56,0.44,0.63,1.93,0.87 +-0.44,-0.55,-0.56,0.44,0.63,1.92,0.87 +-0.44,-0.55,-0.56,0.43,0.63,1.92,0.87 +-0.44,-0.55,-0.56,0.43,0.64,1.91,0.87 +-0.44,-0.55,-0.56,0.43,0.64,1.91,0.87 +-0.44,-0.55,-0.56,0.43,0.64,1.90,0.87 +-0.44,-0.55,-0.56,0.43,0.65,1.90,0.86 +-0.44,-0.55,-0.56,0.43,0.65,1.89,0.86 +-0.44,-0.55,-0.56,0.43,0.65,1.89,0.86 +-0.44,-0.55,-0.56,0.43,0.66,1.88,0.86 +-0.44,-0.55,-0.57,0.43,0.66,1.88,0.86 +-0.44,-0.55,-0.57,0.43,0.66,1.87,0.86 +-0.45,-0.55,-0.57,0.43,0.66,1.87,0.86 +-0.45,-0.55,-0.57,0.43,0.67,1.86,0.86 +-0.45,-0.54,-0.57,0.43,0.67,1.86,0.85 +-0.45,-0.54,-0.57,0.43,0.67,1.85,0.85 +-0.45,-0.54,-0.57,0.43,0.68,1.85,0.85 +-0.45,-0.54,-0.57,0.43,0.68,1.84,0.85 +-0.45,-0.54,-0.57,0.42,0.68,1.83,0.85 +-0.45,-0.54,-0.57,0.42,0.68,1.83,0.85 +-0.45,-0.54,-0.57,0.42,0.69,1.82,0.85 +-0.45,-0.54,-0.57,0.42,0.69,1.82,0.85 +-0.45,-0.54,-0.57,0.42,0.69,1.81,0.85 +-0.45,-0.54,-0.57,0.42,0.70,1.81,0.84 +-0.45,-0.54,-0.57,0.42,0.70,1.80,0.84 +-0.45,-0.54,-0.57,0.42,0.70,1.80,0.84 +-0.45,-0.54,-0.58,0.42,0.71,1.79,0.84 +-0.45,-0.54,-0.58,0.42,0.71,1.79,0.84 +-0.45,-0.54,-0.58,0.42,0.71,1.78,0.84 +-0.45,-0.54,-0.58,0.42,0.72,1.78,0.84 +-0.45,-0.54,-0.58,0.42,0.72,1.77,0.84 +-0.45,-0.54,-0.58,0.42,0.72,1.77,0.83 +-0.45,-0.54,-0.58,0.42,0.72,1.76,0.83 +-0.45,-0.54,-0.58,0.42,0.73,1.76,0.83 +-0.45,-0.54,-0.58,0.42,0.73,1.75,0.83 +-0.45,-0.54,-0.58,0.41,0.73,1.75,0.83 +-0.45,-0.54,-0.58,0.41,0.74,1.74,0.83 +-0.45,-0.54,-0.58,0.41,0.74,1.74,0.83 +-0.45,-0.54,-0.58,0.41,0.74,1.73,0.83 +-0.45,-0.54,-0.58,0.41,0.75,1.73,0.82 +-0.45,-0.53,-0.58,0.41,0.75,1.72,0.82 +-0.45,-0.53,-0.59,0.41,0.75,1.72,0.82 +-0.45,-0.53,-0.59,0.41,0.76,1.71,0.82 +-0.45,-0.53,-0.59,0.41,0.76,1.70,0.82 +-0.45,-0.53,-0.59,0.41,0.76,1.70,0.82 +-0.45,-0.53,-0.59,0.41,0.76,1.69,0.82 +-0.45,-0.53,-0.59,0.41,0.77,1.69,0.82 +-0.45,-0.53,-0.59,0.41,0.77,1.68,0.82 +-0.45,-0.53,-0.59,0.41,0.77,1.68,0.81 +-0.45,-0.53,-0.59,0.41,0.78,1.67,0.81 +-0.45,-0.53,-0.59,0.41,0.78,1.67,0.81 +-0.45,-0.53,-0.59,0.41,0.78,1.66,0.81 +-0.45,-0.53,-0.59,0.40,0.79,1.66,0.81 +-0.45,-0.53,-0.59,0.40,0.79,1.65,0.81 +-0.45,-0.53,-0.59,0.40,0.79,1.65,0.81 +-0.45,-0.53,-0.59,0.40,0.80,1.64,0.81 +-0.45,-0.53,-0.59,0.40,0.80,1.64,0.80 +-0.45,-0.53,-0.60,0.40,0.80,1.63,0.80 +-0.45,-0.53,-0.60,0.40,0.81,1.63,0.80 +-0.45,-0.53,-0.60,0.40,0.81,1.62,0.80 +-0.45,-0.53,-0.60,0.40,0.81,1.62,0.80 +-0.45,-0.53,-0.60,0.40,0.82,1.61,0.80 +-0.45,-0.53,-0.60,0.40,0.82,1.61,0.80 +-0.45,-0.53,-0.60,0.40,0.82,1.60,0.80 +-0.45,-0.53,-0.60,0.40,0.83,1.60,0.79 +-0.45,-0.52,-0.60,0.40,0.83,1.59,0.79 +-0.45,-0.52,-0.60,0.40,0.83,1.59,0.79 +-0.45,-0.52,-0.60,0.40,0.84,1.58,0.79 +-0.45,-0.52,-0.60,0.40,0.84,1.58,0.79 +-0.45,-0.52,-0.60,0.39,0.84,1.57,0.79 +-0.46,-0.52,-0.60,0.39,0.85,1.57,0.79 +-0.46,-0.52,-0.60,0.39,0.85,1.56,0.79 +-0.46,-0.52,-0.61,0.39,0.85,1.56,0.79 +-0.46,-0.52,-0.61,0.39,0.86,1.55,0.78 +-0.46,-0.52,-0.61,0.39,0.86,1.55,0.78 +-0.46,-0.52,-0.61,0.39,0.86,1.54,0.78 +-0.46,-0.52,-0.61,0.39,0.87,1.54,0.78 +-0.46,-0.52,-0.61,0.39,0.87,1.53,0.78 +-0.46,-0.52,-0.61,0.39,0.87,1.53,0.78 +-0.46,-0.52,-0.61,0.39,0.88,1.52,0.78 +-0.46,-0.52,-0.61,0.39,0.88,1.52,0.78 +-0.46,-0.52,-0.61,0.39,0.88,1.51,0.77 +-0.46,-0.52,-0.61,0.39,0.89,1.51,0.77 +-0.46,-0.52,-0.61,0.39,0.89,1.50,0.77 +-0.46,-0.52,-0.61,0.39,0.89,1.49,0.77 +-0.46,-0.52,-0.61,0.38,0.90,1.49,0.77 +-0.46,-0.52,-0.61,0.38,0.90,1.48,0.77 +-0.46,-0.52,-0.61,0.38,0.90,1.48,0.77 +-0.46,-0.52,-0.62,0.38,0.91,1.47,0.77 +-0.46,-0.51,-0.62,0.38,0.91,1.47,0.76 +-0.46,-0.51,-0.62,0.38,0.91,1.46,0.76 +-0.46,-0.51,-0.62,0.38,0.92,1.46,0.76 +-0.46,-0.51,-0.62,0.38,0.92,1.45,0.76 +-0.46,-0.51,-0.62,0.38,0.92,1.45,0.76 +-0.46,-0.51,-0.62,0.38,0.93,1.44,0.76 +-0.46,-0.51,-0.62,0.38,0.93,1.44,0.76 +-0.46,-0.51,-0.62,0.38,0.93,1.43,0.76 +-0.46,-0.51,-0.62,0.38,0.94,1.43,0.76 +-0.46,-0.51,-0.62,0.38,0.94,1.42,0.75 +-0.46,-0.51,-0.62,0.38,0.95,1.42,0.75 +-0.46,-0.51,-0.62,0.38,0.95,1.41,0.75 +-0.46,-0.51,-0.62,0.38,0.95,1.41,0.75 +-0.46,-0.51,-0.62,0.37,0.96,1.40,0.75 +-0.46,-0.51,-0.62,0.37,0.96,1.40,0.75 +-0.46,-0.51,-0.63,0.37,0.96,1.39,0.75 +-0.46,-0.51,-0.63,0.37,0.97,1.39,0.75 +-0.46,-0.51,-0.63,0.37,0.97,1.38,0.74 +-0.46,-0.51,-0.63,0.37,0.97,1.38,0.74 +-0.46,-0.51,-0.63,0.37,0.98,1.37,0.74 +-0.46,-0.51,-0.63,0.37,0.98,1.37,0.74 +-0.46,-0.51,-0.63,0.37,0.98,1.36,0.74 +-0.46,-0.50,-0.63,0.37,0.99,1.36,0.74 +-0.46,-0.50,-0.63,0.37,0.99,1.35,0.74 +-0.46,-0.50,-0.63,0.37,1.00,1.35,0.74 +-0.46,-0.50,-0.63,0.37,1.00,1.34,0.73 +-0.46,-0.50,-0.63,0.37,1.00,1.34,0.73 +-0.46,-0.50,-0.63,0.37,1.01,1.33,0.73 +-0.46,-0.50,-0.63,0.37,1.01,1.33,0.73 +-0.46,-0.50,-0.63,0.37,1.01,1.32,0.73 +-0.46,-0.50,-0.63,0.36,1.02,1.32,0.73 +-0.46,-0.50,-0.64,0.36,1.02,1.31,0.73 +-0.46,-0.50,-0.64,0.36,1.02,1.31,0.73 +-0.46,-0.50,-0.64,0.36,1.03,1.30,0.73 +-0.46,-0.50,-0.64,0.36,1.03,1.30,0.72 +-0.46,-0.50,-0.64,0.36,1.03,1.29,0.72 +-0.46,-0.50,-0.64,0.36,1.04,1.29,0.72 +-0.46,-0.50,-0.64,0.36,1.04,1.28,0.72 +-0.46,-0.50,-0.64,0.36,1.05,1.28,0.72 +-0.46,-0.50,-0.64,0.36,1.05,1.27,0.72 +-0.46,-0.50,-0.64,0.36,1.05,1.27,0.72 +-0.46,-0.50,-0.64,0.36,1.06,1.26,0.72 +-0.46,-0.50,-0.64,0.36,1.06,1.26,0.71 +-0.46,-0.50,-0.64,0.36,1.06,1.26,0.71 +-0.46,-0.49,-0.64,0.36,1.07,1.25,0.71 +-0.46,-0.49,-0.64,0.36,1.07,1.25,0.71 +-0.46,-0.49,-0.64,0.35,1.08,1.24,0.71 +-0.46,-0.49,-0.65,0.35,1.08,1.24,0.71 +-0.46,-0.49,-0.65,0.35,1.08,1.23,0.71 +-0.46,-0.49,-0.65,0.35,1.09,1.23,0.71 +-0.46,-0.49,-0.65,0.35,1.09,1.22,0.71 +-0.46,-0.49,-0.65,0.35,1.09,1.22,0.70 +-0.46,-0.49,-0.65,0.35,1.10,1.21,0.70 +-0.46,-0.49,-0.65,0.35,1.10,1.21,0.70 +-0.46,-0.49,-0.65,0.35,1.11,1.20,0.70 +-0.46,-0.49,-0.65,0.35,1.11,1.20,0.70 +-0.46,-0.49,-0.65,0.35,1.11,1.19,0.70 +-0.46,-0.49,-0.65,0.35,1.12,1.19,0.70 +-0.46,-0.49,-0.65,0.35,1.12,1.18,0.70 +-0.46,-0.49,-0.65,0.35,1.12,1.18,0.69 +-0.46,-0.49,-0.65,0.35,1.13,1.17,0.69 +-0.46,-0.49,-0.65,0.35,1.13,1.17,0.69 +-0.46,-0.49,-0.65,0.35,1.14,1.16,0.69 +-0.46,-0.49,-0.65,0.34,1.14,1.16,0.69 +-0.46,-0.49,-0.66,0.34,1.14,1.15,0.69 +-0.46,-0.48,-0.66,0.34,1.15,1.15,0.69 +-0.47,-0.48,-0.66,0.34,1.15,1.14,0.69 +-0.47,-0.48,-0.66,0.34,1.16,1.14,0.68 +-0.47,-0.48,-0.66,0.34,1.16,1.13,0.68 +-0.47,-0.48,-0.66,0.34,1.16,1.13,0.68 +-0.47,-0.48,-0.66,0.34,1.17,1.12,0.68 +-0.47,-0.48,-0.66,0.34,1.17,1.12,0.68 +-0.47,-0.48,-0.66,0.34,1.17,1.11,0.68 +-0.47,-0.48,-0.66,0.34,1.18,1.11,0.68 +-0.47,-0.48,-0.66,0.34,1.18,1.10,0.68 +-0.47,-0.48,-0.66,0.34,1.19,1.10,0.68 +-0.47,-0.48,-0.66,0.34,1.19,1.09,0.67 +-0.47,-0.48,-0.66,0.34,1.19,1.09,0.67 +-0.47,-0.48,-0.66,0.34,1.20,1.08,0.67 +-0.47,-0.48,-0.66,0.34,1.20,1.08,0.67 +-0.47,-0.48,-0.67,0.33,1.21,1.08,0.67 +-0.47,-0.48,-0.67,0.33,1.21,1.07,0.67 +-0.47,-0.48,-0.67,0.33,1.21,1.07,0.67 +-0.47,-0.48,-0.67,0.33,1.22,1.06,0.67 +-0.47,-0.48,-0.67,0.33,1.22,1.06,0.66 +-0.47,-0.48,-0.67,0.33,1.23,1.05,0.66 +-0.47,-0.47,-0.67,0.33,1.23,1.05,0.66 +-0.47,-0.47,-0.67,0.33,1.23,1.04,0.66 +-0.47,-0.47,-0.67,0.33,1.24,1.04,0.66 +-0.47,-0.47,-0.67,0.33,1.24,1.03,0.66 +-0.47,-0.47,-0.67,0.33,1.25,1.03,0.66 +-0.47,-0.47,-0.67,0.33,1.25,1.02,0.66 +-0.47,-0.47,-0.67,0.33,1.25,1.02,0.66 +-0.47,-0.47,-0.67,0.33,1.26,1.01,0.65 +-0.47,-0.47,-0.67,0.33,1.26,1.01,0.65 +-0.47,-0.47,-0.67,0.33,1.27,1.00,0.65 +-0.47,-0.47,-0.67,0.33,1.27,1.00,0.65 +-0.47,-0.47,-0.68,0.32,1.27,0.99,0.65 +-0.47,-0.47,-0.68,0.32,1.28,0.99,0.65 +-0.47,-0.47,-0.68,0.32,1.28,0.98,0.65 +-0.47,-0.47,-0.68,0.32,1.29,0.98,0.65 +-0.47,-0.47,-0.68,0.32,1.29,0.98,0.64 +-0.47,-0.47,-0.68,0.32,1.29,0.97,0.64 +-0.47,-0.47,-0.68,0.32,1.30,0.97,0.64 +-0.47,-0.47,-0.68,0.32,1.30,0.96,0.64 +-0.47,-0.47,-0.68,0.32,1.31,0.96,0.64 +-0.47,-0.46,-0.68,0.32,1.31,0.95,0.64 +-0.47,-0.46,-0.68,0.32,1.31,0.95,0.64 +-0.47,-0.46,-0.68,0.32,1.32,0.94,0.64 +-0.47,-0.46,-0.68,0.32,1.32,0.94,0.64 +-0.47,-0.46,-0.68,0.32,1.33,0.93,0.63 +-0.47,-0.46,-0.68,0.32,1.33,0.93,0.63 +-0.47,-0.46,-0.68,0.32,1.34,0.92,0.63 +-0.47,-0.46,-0.68,0.32,1.34,0.92,0.63 +-0.47,-0.46,-0.69,0.31,1.34,0.91,0.63 +-0.47,-0.46,-0.69,0.31,1.35,0.91,0.63 +-0.47,-0.46,-0.69,0.31,1.35,0.90,0.63 +-0.47,-0.46,-0.69,0.31,1.36,0.90,0.63 +-0.47,-0.46,-0.69,0.31,1.36,0.90,0.62 +-0.47,-0.46,-0.69,0.31,1.36,0.89,0.62 +-0.47,-0.46,-0.69,0.31,1.37,0.89,0.62 +-0.47,-0.46,-0.69,0.31,1.37,0.88,0.62 +-0.47,-0.46,-0.69,0.31,1.38,0.88,0.62 +-0.47,-0.46,-0.69,0.31,1.38,0.87,0.62 +-0.47,-0.46,-0.69,0.31,1.39,0.87,0.62 +-0.47,-0.45,-0.69,0.31,1.39,0.86,0.62 +-0.47,-0.45,-0.69,0.31,1.39,0.86,0.61 +-0.47,-0.45,-0.69,0.31,1.40,0.85,0.61 +-0.47,-0.45,-0.69,0.31,1.40,0.85,0.61 +-0.47,-0.45,-0.69,0.31,1.41,0.84,0.61 +-0.47,-0.45,-0.69,0.31,1.41,0.84,0.61 +-0.47,-0.45,-0.70,0.30,1.41,0.83,0.61 +-0.47,-0.45,-0.70,0.30,1.42,0.83,0.61 +-0.47,-0.45,-0.70,0.30,1.42,0.83,0.61 +-0.47,-0.45,-0.70,0.30,1.43,0.82,0.61 +-0.47,-0.45,-0.70,0.30,1.43,0.82,0.60 +-0.47,-0.45,-0.70,0.30,1.44,0.81,0.60 +-0.47,-0.45,-0.70,0.30,1.44,0.81,0.60 +-0.47,-0.45,-0.70,0.30,1.44,0.80,0.60 +-0.47,-0.45,-0.70,0.30,1.45,0.80,0.60 +-0.47,-0.45,-0.70,0.30,1.45,0.79,0.60 +-0.47,-0.45,-0.70,0.30,1.46,0.79,0.60 +-0.47,-0.45,-0.70,0.30,1.46,0.78,0.60 +-0.47,-0.45,-0.70,0.30,1.47,0.78,0.60 +-0.47,-0.44,-0.70,0.30,1.47,0.78,0.59 +-0.47,-0.44,-0.70,0.30,1.48,0.77,0.59 +-0.47,-0.44,-0.70,0.30,1.48,0.77,0.59 +-0.47,-0.44,-0.70,0.30,1.48,0.76,0.59 +-0.47,-0.44,-0.71,0.29,1.49,0.76,0.59 +-0.47,-0.44,-0.71,0.29,1.49,0.75,0.59 +-0.47,-0.44,-0.71,0.29,1.50,0.75,0.59 +-0.47,-0.44,-0.71,0.29,1.50,0.74,0.59 +-0.47,-0.44,-0.71,0.29,1.51,0.74,0.58 +-0.47,-0.44,-0.71,0.29,1.51,0.73,0.58 +-0.47,-0.44,-0.71,0.29,1.51,0.73,0.58 +-0.47,-0.44,-0.71,0.29,1.52,0.73,0.58 +-0.47,-0.44,-0.71,0.29,1.52,0.72,0.58 +-0.47,-0.44,-0.71,0.29,1.53,0.72,0.58 +-0.47,-0.44,-0.71,0.29,1.53,0.71,0.58 +-0.47,-0.44,-0.71,0.29,1.54,0.71,0.58 +-0.47,-0.44,-0.71,0.29,1.54,0.70,0.58 +-0.47,-0.44,-0.71,0.29,1.54,0.70,0.57 +-0.47,-0.43,-0.71,0.29,1.55,0.69,0.57 +-0.47,-0.43,-0.71,0.29,1.55,0.69,0.57 +-0.47,-0.43,-0.71,0.29,1.56,0.68,0.57 +-0.47,-0.43,-0.71,0.28,1.56,0.68,0.57 +-0.47,-0.43,-0.72,0.28,1.57,0.68,0.57 +-0.47,-0.43,-0.72,0.28,1.57,0.67,0.57 +-0.47,-0.43,-0.72,0.28,1.58,0.67,0.57 +-0.47,-0.43,-0.72,0.28,1.58,0.66,0.56 +-0.47,-0.43,-0.72,0.28,1.59,0.66,0.56 +-0.47,-0.43,-0.72,0.28,1.59,0.65,0.56 +-0.47,-0.43,-0.72,0.28,1.59,0.65,0.56 +-0.47,-0.43,-0.72,0.28,1.60,0.64,0.56 +-0.47,-0.43,-0.72,0.28,1.60,0.64,0.56 +-0.47,-0.43,-0.72,0.28,1.61,0.64,0.56 +-0.47,-0.43,-0.72,0.28,1.61,0.63,0.56 +-0.47,-0.43,-0.72,0.28,1.62,0.63,0.56 +-0.47,-0.43,-0.72,0.28,1.62,0.62,0.55 +-0.47,-0.43,-0.72,0.28,1.63,0.62,0.55 +-0.47,-0.42,-0.72,0.28,1.63,0.61,0.55 +-0.47,-0.42,-0.72,0.28,1.63,0.61,0.55 +-0.47,-0.42,-0.72,0.27,1.64,0.60,0.55 +-0.47,-0.42,-0.72,0.27,1.64,0.60,0.55 +-0.47,-0.42,-0.73,0.27,1.65,0.60,0.55 +-0.47,-0.42,-0.73,0.27,1.65,0.59,0.55 +-0.47,-0.42,-0.73,0.27,1.66,0.59,0.55 +-0.47,-0.42,-0.73,0.27,1.66,0.58,0.54 +-0.47,-0.42,-0.73,0.27,1.67,0.58,0.54 +-0.47,-0.42,-0.73,0.27,1.67,0.57,0.54 +-0.47,-0.42,-0.73,0.27,1.68,0.57,0.54 +-0.47,-0.42,-0.73,0.27,1.68,0.56,0.54 +-0.47,-0.42,-0.73,0.27,1.68,0.56,0.54 +-0.47,-0.42,-0.73,0.27,1.69,0.56,0.54 +-0.47,-0.42,-0.73,0.27,1.69,0.55,0.54 +-0.47,-0.42,-0.73,0.27,1.70,0.55,0.53 +-0.47,-0.42,-0.73,0.27,1.70,0.54,0.53 +-0.47,-0.41,-0.73,0.27,1.71,0.54,0.53 +-0.47,-0.41,-0.73,0.27,1.71,0.53,0.53 +-0.47,-0.41,-0.73,0.27,1.72,0.53,0.53 +-0.47,-0.41,-0.73,0.26,1.72,0.53,0.53 +-0.47,-0.41,-0.73,0.26,1.73,0.52,0.53 +-0.47,-0.41,-0.74,0.26,1.73,0.52,0.53 +-0.47,-0.41,-0.74,0.26,1.74,0.51,0.53 +-0.47,-0.41,-0.74,0.26,1.74,0.51,0.52 +-0.47,-0.41,-0.74,0.26,1.75,0.50,0.52 +-0.47,-0.41,-0.74,0.26,1.75,0.50,0.52 +-0.47,-0.41,-0.74,0.26,1.75,0.50,0.52 +-0.47,-0.41,-0.74,0.26,1.76,0.49,0.52 +-0.47,-0.41,-0.74,0.26,1.76,0.49,0.52 +-0.47,-0.41,-0.74,0.26,1.77,0.48,0.52 +-0.47,-0.41,-0.74,0.26,1.77,0.48,0.52 +-0.47,-0.41,-0.74,0.26,1.78,0.47,0.52 +-0.47,-0.41,-0.74,0.26,1.78,0.47,0.51 +-0.47,-0.40,-0.74,0.26,1.79,0.47,0.51 +-0.47,-0.40,-0.74,0.26,1.79,0.46,0.51 +-0.47,-0.40,-0.74,0.26,1.80,0.46,0.51 +-0.47,-0.40,-0.74,0.25,1.80,0.45,0.51 +-0.47,-0.40,-0.74,0.25,1.81,0.45,0.51 +-0.47,-0.40,-0.74,0.25,1.81,0.44,0.51 +-0.47,-0.40,-0.74,0.25,1.82,0.44,0.51 +-0.47,-0.40,-0.75,0.25,1.82,0.44,0.50 +-0.47,-0.40,-0.75,0.25,1.83,0.43,0.50 +-0.47,-0.40,-0.75,0.25,1.83,0.43,0.50 +-0.47,-0.40,-0.75,0.25,1.83,0.42,0.50 +-0.47,-0.40,-0.75,0.25,1.84,0.42,0.50 +-0.47,-0.40,-0.75,0.25,1.84,0.41,0.50 +-0.47,-0.40,-0.75,0.25,1.85,0.41,0.50 +-0.47,-0.40,-0.75,0.25,1.85,0.41,0.50 +-0.47,-0.40,-0.75,0.25,1.86,0.40,0.50 +-0.47,-0.40,-0.75,0.25,1.86,0.40,0.49 +-0.47,-0.39,-0.75,0.25,1.87,0.39,0.49 +-0.47,-0.39,-0.75,0.25,1.87,0.39,0.49 +-0.47,-0.39,-0.75,0.25,1.88,0.38,0.49 +-0.47,-0.39,-0.75,0.25,1.88,0.38,0.49 +-0.47,-0.39,-0.75,0.24,1.89,0.38,0.49 +-0.47,-0.39,-0.75,0.24,1.89,0.37,0.49 +-0.47,-0.39,-0.75,0.24,1.90,0.37,0.49 +-0.47,-0.39,-0.75,0.24,1.90,0.36,0.49 +-0.47,-0.39,-0.75,0.24,1.91,0.36,0.48 +-0.47,-0.39,-0.76,0.24,1.91,0.36,0.48 +-0.47,-0.39,-0.76,0.24,1.92,0.35,0.48 +-0.47,-0.39,-0.76,0.24,1.92,0.35,0.48 +-0.47,-0.39,-0.76,0.24,1.93,0.34,0.48 +-0.47,-0.39,-0.76,0.24,1.93,0.34,0.48 +-0.47,-0.39,-0.76,0.24,1.94,0.33,0.48 +-0.47,-0.39,-0.76,0.24,1.94,0.33,0.48 +-0.47,-0.39,-0.76,0.24,1.95,0.33,0.48 +-0.47,-0.38,-0.76,0.24,1.95,0.32,0.47 +-0.47,-0.38,-0.76,0.24,1.96,0.32,0.47 +-0.47,-0.38,-0.76,0.24,1.96,0.31,0.47 +-0.47,-0.38,-0.76,0.24,1.97,0.31,0.47 +-0.47,-0.38,-0.76,0.23,1.97,0.31,0.47 +-0.47,-0.38,-0.76,0.23,1.98,0.30,0.47 +-0.47,-0.38,-0.76,0.23,1.98,0.30,0.47 +-0.47,-0.38,-0.76,0.23,1.99,0.29,0.47 +-0.47,-0.38,-0.76,0.23,1.99,0.29,0.47 +-0.47,-0.38,-0.76,0.23,2.00,0.29,0.46 +-0.47,-0.38,-0.76,0.23,2.00,0.28,0.46 +-0.47,-0.38,-0.77,0.23,2.01,0.28,0.46 +-0.47,-0.38,-0.77,0.23,2.01,0.27,0.46 +-0.47,-0.38,-0.77,0.23,2.02,0.27,0.46 +-0.47,-0.38,-0.77,0.23,2.02,0.26,0.46 +-0.47,-0.38,-0.77,0.23,2.03,0.26,0.46 +-0.47,-0.37,-0.77,0.23,2.03,0.26,0.46 +-0.47,-0.37,-0.77,0.23,2.04,0.25,0.46 +-0.47,-0.37,-0.77,0.23,2.04,0.25,0.45 +-0.47,-0.37,-0.77,0.23,2.05,0.24,0.45 +-0.47,-0.37,-0.77,0.23,2.05,0.24,0.45 +-0.47,-0.37,-0.77,0.23,2.06,0.24,0.45 +-0.47,-0.37,-0.77,0.22,2.06,0.23,0.45 +-0.47,-0.37,-0.77,0.22,2.07,0.23,0.45 +-0.47,-0.37,-0.77,0.22,2.07,0.22,0.45 +-0.47,-0.37,-0.77,0.22,2.08,0.22,0.45 +-0.47,-0.37,-0.77,0.22,2.08,0.22,0.45 +-0.47,-0.37,-0.77,0.22,2.09,0.21,0.44 +-0.47,-0.37,-0.77,0.22,2.09,0.21,0.44 +-0.47,-0.37,-0.77,0.22,2.10,0.20,0.44 +-0.47,-0.37,-0.77,0.22,2.10,0.20,0.44 +-0.47,-0.37,-0.78,0.22,2.11,0.20,0.44 +-0.47,-0.36,-0.78,0.22,2.11,0.19,0.44 +-0.47,-0.36,-0.78,0.22,2.12,0.19,0.44 +-0.47,-0.36,-0.78,0.22,2.12,0.18,0.44 +-0.47,-0.36,-0.78,0.22,2.13,0.18,0.44 +-0.47,-0.36,-0.78,0.22,2.13,0.18,0.43 +-0.47,-0.36,-0.78,0.22,2.14,0.17,0.43 +-0.47,-0.36,-0.78,0.22,2.14,0.17,0.43 +-0.47,-0.36,-0.78,0.22,2.15,0.16,0.43 +-0.47,-0.36,-0.78,0.21,2.15,0.16,0.43 +-0.47,-0.36,-0.78,0.21,2.16,0.16,0.43 +-0.47,-0.36,-0.78,0.21,2.16,0.15,0.43 +-0.47,-0.36,-0.78,0.21,2.17,0.15,0.43 +-0.47,-0.36,-0.78,0.21,2.17,0.15,0.43 +-0.47,-0.36,-0.78,0.21,2.18,0.14,0.42 +-0.47,-0.36,-0.78,0.21,2.18,0.14,0.42 +-0.47,-0.35,-0.78,0.21,2.19,0.13,0.42 +-0.47,-0.35,-0.78,0.21,2.19,0.13,0.42 +-0.47,-0.35,-0.78,0.21,2.20,0.13,0.42 +-0.47,-0.35,-0.78,0.21,2.20,0.12,0.42 +-0.46,-0.35,-0.78,0.21,2.21,0.12,0.42 +-0.46,-0.35,-0.79,0.21,2.21,0.11,0.42 +-0.46,-0.35,-0.79,0.21,2.22,0.11,0.42 +-0.46,-0.35,-0.79,0.21,2.22,0.11,0.41 +-0.46,-0.35,-0.79,0.21,2.23,0.10,0.41 +-0.46,-0.35,-0.79,0.21,2.23,0.10,0.41 +-0.46,-0.35,-0.79,0.21,2.24,0.09,0.41 +-0.46,-0.35,-0.79,0.20,2.24,0.09,0.41 +-0.46,-0.35,-0.79,0.20,2.25,0.09,0.41 +-0.46,-0.35,-0.79,0.20,2.25,0.08,0.41 +-0.46,-0.35,-0.79,0.20,2.26,0.08,0.41 +-0.46,-0.35,-0.79,0.20,2.27,0.08,0.41 +-0.46,-0.34,-0.79,0.20,2.27,0.07,0.40 +-0.46,-0.34,-0.79,0.20,2.28,0.07,0.40 +-0.46,-0.34,-0.79,0.20,2.28,0.06,0.40 +-0.46,-0.34,-0.79,0.20,2.29,0.06,0.40 +-0.46,-0.34,-0.79,0.20,2.29,0.06,0.40 +-0.46,-0.34,-0.79,0.20,2.30,0.05,0.40 +-0.46,-0.34,-0.79,0.20,2.30,0.05,0.40 +-0.46,-0.34,-0.79,0.20,2.31,0.05,0.40 +-0.46,-0.34,-0.79,0.20,2.31,0.04,0.40 +-0.46,-0.34,-0.79,0.20,2.32,0.04,0.39 +-0.46,-0.34,-0.80,0.20,2.32,0.03,0.39 +-0.46,-0.34,-0.80,0.20,2.33,0.03,0.39 +-0.46,-0.34,-0.80,0.20,2.33,0.03,0.39 +-0.46,-0.34,-0.80,0.20,2.34,0.02,0.39 +-0.46,-0.34,-0.80,0.19,2.34,0.02,0.39 +-0.46,-0.33,-0.80,0.19,2.35,0.01,0.39 +-0.46,-0.33,-0.80,0.19,2.35,0.01,0.39 +-0.46,-0.33,-0.80,0.19,2.36,0.01,0.39 +-0.46,-0.33,-0.80,0.19,2.37,0.00,0.38 +-0.46,-0.33,-0.80,0.19,2.37,0.00,0.38 diff --git a/scripts/testv/stvISM1.csv b/scripts/testv/stvISM1.csv index 8d729654c4..0082c12823 100644 --- a/scripts/testv/stvISM1.csv +++ b/scripts/testv/stvISM1.csv @@ -1,1500 +1,1500 @@ -0.00,0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 -9.60,0.00,1.00,0.00,1.00 -14.40,0.00,1.00,0.00,1.00 -19.20,0.00,1.00,0.00,1.00 -24.00,0.00,1.00,0.00,1.00 -28.80,0.00,1.00,0.00,1.00 -33.60,0.00,1.00,0.00,1.00 -38.40,0.00,1.00,0.00,1.00 -43.20,0.00,1.00,0.00,1.00 -48.00,0.00,1.00,0.00,1.00 -52.80,0.00,1.00,0.00,1.00 -57.60,0.00,1.00,0.00,1.00 -62.40,0.00,1.00,0.00,1.00 -67.20,0.00,1.00,0.00,1.00 -72.00,0.00,1.00,0.00,1.00 -76.80,0.00,1.00,0.00,1.00 -81.60,0.00,1.00,0.00,1.00 -86.40,0.00,1.00,0.00,1.00 -91.20,0.00,1.00,0.00,1.00 -96.00,0.00,1.00,0.00,1.00 -100.80,0.00,1.00,0.00,1.00 -105.60,0.00,1.00,0.00,1.00 -110.40,0.00,1.00,0.00,1.00 -115.20,0.00,1.00,0.00,1.00 -120.00,0.00,1.00,0.00,1.00 -124.80,0.00,1.00,0.00,1.00 -129.60,0.00,1.00,0.00,1.00 -134.40,0.00,1.00,0.00,1.00 -139.20,0.00,1.00,0.00,1.00 -144.00,0.00,1.00,0.00,1.00 -148.80,0.00,1.00,0.00,1.00 -153.60,0.00,1.00,0.00,1.00 -158.40,0.00,1.00,0.00,1.00 -163.20,0.00,1.00,0.00,1.00 -168.00,0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 --163.20,0.00,1.00,0.00,1.00 --158.40,0.00,1.00,0.00,1.00 --153.60,0.00,1.00,0.00,1.00 --148.80,0.00,1.00,0.00,1.00 --144.00,0.00,1.00,0.00,1.00 --139.20,0.00,1.00,0.00,1.00 --134.40,0.00,1.00,0.00,1.00 --129.60,0.00,1.00,0.00,1.00 --124.80,0.00,1.00,0.00,1.00 --120.00,0.00,1.00,0.00,1.00 --115.20,0.00,1.00,0.00,1.00 --110.40,0.00,1.00,0.00,1.00 --105.60,0.00,1.00,0.00,1.00 --100.80,0.00,1.00,0.00,1.00 --96.00,0.00,1.00,0.00,1.00 --91.20,0.00,1.00,0.00,1.00 --86.40,0.00,1.00,0.00,1.00 --81.60,0.00,1.00,0.00,1.00 --76.80,0.00,1.00,0.00,1.00 --72.00,0.00,1.00,0.00,1.00 --67.20,0.00,1.00,0.00,1.00 --62.40,0.00,1.00,0.00,1.00 --57.60,0.00,1.00,0.00,1.00 --52.80,0.00,1.00,0.00,1.00 --48.00,0.00,1.00,0.00,1.00 --43.20,0.00,1.00,0.00,1.00 --38.40,0.00,1.00,0.00,1.00 --33.60,0.00,1.00,0.00,1.00 --28.80,0.00,1.00,0.00,1.00 --24.00,0.00,1.00,0.00,1.00 --19.20,0.00,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 -14.40,-0.00,1.00,0.00,1.00 -19.20,-0.00,1.00,0.00,1.00 -24.00,-0.00,1.00,0.00,1.00 -28.80,-0.00,1.00,0.00,1.00 -33.60,-4.80,1.00,0.00,1.00 -38.40,-4.80,1.00,0.00,1.00 -43.20,-4.80,1.00,0.00,1.00 -48.00,-4.80,1.00,0.00,1.00 -52.80,-4.80,1.00,0.00,1.00 -57.60,-4.80,1.00,0.00,1.00 -62.40,-4.80,1.00,0.00,1.00 -67.20,-4.80,1.00,0.00,1.00 -72.00,-4.80,1.00,0.00,1.00 -76.80,-4.80,1.00,0.00,1.00 -81.60,-4.80,1.00,0.00,1.00 -86.40,-4.80,1.00,0.00,1.00 -91.20,-4.80,1.00,0.00,1.00 -96.00,-4.80,1.00,0.00,1.00 -100.80,-4.80,1.00,0.00,1.00 -105.60,-4.80,1.00,0.00,1.00 -110.40,-4.80,1.00,0.00,1.00 -115.20,-4.80,1.00,0.00,1.00 -120.00,-4.80,1.00,0.00,1.00 -124.80,-4.80,1.00,0.00,1.00 -129.60,-4.80,1.00,0.00,1.00 -134.40,-4.80,1.00,0.00,1.00 -139.20,-4.80,1.00,0.00,1.00 -144.00,-4.80,1.00,0.00,1.00 -148.80,-4.80,1.00,0.00,1.00 -153.60,-0.00,1.00,0.00,1.00 -158.40,-0.00,1.00,0.00,1.00 -163.20,-0.00,1.00,0.00,1.00 -168.00,-0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 --163.20,0.00,1.00,0.00,1.00 --158.40,0.00,1.00,0.00,1.00 --153.60,0.00,1.00,0.00,1.00 --148.80,4.80,1.00,0.00,1.00 --144.00,4.80,1.00,0.00,1.00 --139.20,4.80,1.00,0.00,1.00 --134.40,4.80,1.00,0.00,1.00 --129.60,4.80,1.00,0.00,1.00 --124.80,4.80,1.00,0.00,1.00 --120.00,4.80,1.00,0.00,1.00 --115.20,4.80,1.00,0.00,1.00 --110.40,4.80,1.00,0.00,1.00 --105.60,4.80,1.00,0.00,1.00 --100.80,4.80,1.00,0.00,1.00 --96.00,4.80,1.00,0.00,1.00 --91.20,4.80,1.00,0.00,1.00 --86.40,4.80,1.00,0.00,1.00 --81.60,4.80,1.00,0.00,1.00 --76.80,4.80,1.00,0.00,1.00 --72.00,4.80,1.00,0.00,1.00 --67.20,4.80,1.00,0.00,1.00 --62.40,4.80,1.00,0.00,1.00 --57.60,4.80,1.00,0.00,1.00 --52.80,4.80,1.00,0.00,1.00 --48.00,4.80,1.00,0.00,1.00 --43.20,4.80,1.00,0.00,1.00 --38.40,4.80,1.00,0.00,1.00 --33.60,4.80,1.00,0.00,1.00 --28.80,0.00,1.00,0.00,1.00 --24.00,0.00,1.00,0.00,1.00 --19.20,0.00,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 -14.40,-0.00,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 -24.00,-4.80,1.00,0.00,1.00 -28.80,-4.80,1.00,0.00,1.00 -33.60,-4.80,1.00,0.00,1.00 -38.40,-4.80,1.00,0.00,1.00 -43.20,-4.80,1.00,0.00,1.00 -48.00,-4.80,1.00,0.00,1.00 -52.80,-9.60,1.00,0.00,1.00 -57.60,-9.60,1.00,0.00,1.00 -62.40,-9.60,1.00,0.00,1.00 -67.20,-9.60,1.00,0.00,1.00 -72.00,-9.60,1.00,0.00,1.00 -76.80,-9.60,1.00,0.00,1.00 -81.60,-9.60,1.00,0.00,1.00 -86.40,-9.60,1.00,0.00,1.00 -91.20,-9.60,1.00,0.00,1.00 -96.00,-9.60,1.00,0.00,1.00 -100.80,-9.60,1.00,0.00,1.00 -105.60,-9.60,1.00,0.00,1.00 -110.40,-9.60,1.00,0.00,1.00 -115.20,-9.60,1.00,0.00,1.00 -120.00,-9.60,1.00,0.00,1.00 -124.80,-9.60,1.00,0.00,1.00 -129.60,-9.60,1.00,0.00,1.00 -134.40,-4.80,1.00,0.00,1.00 -139.20,-4.80,1.00,0.00,1.00 -144.00,-4.80,1.00,0.00,1.00 -148.80,-4.80,1.00,0.00,1.00 -153.60,-4.80,1.00,0.00,1.00 -158.40,-4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 -168.00,-0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 --163.20,4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 --153.60,4.80,1.00,0.00,1.00 --148.80,4.80,1.00,0.00,1.00 --144.00,4.80,1.00,0.00,1.00 --139.20,4.80,1.00,0.00,1.00 --134.40,4.80,1.00,0.00,1.00 --129.60,9.60,1.00,0.00,1.00 --124.80,9.60,1.00,0.00,1.00 --120.00,9.60,1.00,0.00,1.00 --115.20,9.60,1.00,0.00,1.00 --110.40,9.60,1.00,0.00,1.00 --105.60,9.60,1.00,0.00,1.00 --100.80,9.60,1.00,0.00,1.00 --96.00,9.60,1.00,0.00,1.00 --91.20,9.60,1.00,0.00,1.00 --86.40,9.60,1.00,0.00,1.00 --81.60,9.60,1.00,0.00,1.00 --76.80,9.60,1.00,0.00,1.00 --72.00,9.60,1.00,0.00,1.00 --67.20,9.60,1.00,0.00,1.00 --62.40,9.60,1.00,0.00,1.00 --57.60,9.60,1.00,0.00,1.00 --52.80,9.60,1.00,0.00,1.00 --48.00,4.80,1.00,0.00,1.00 --43.20,4.80,1.00,0.00,1.00 --38.40,4.80,1.00,0.00,1.00 --33.60,4.80,1.00,0.00,1.00 --28.80,4.80,1.00,0.00,1.00 --24.00,4.80,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 -24.00,-4.80,1.00,0.00,1.00 -28.80,-4.80,1.00,0.00,1.00 -33.60,-9.60,1.00,0.00,1.00 -38.40,-9.60,1.00,0.00,1.00 -43.20,-9.60,1.00,0.00,1.00 -48.00,-9.60,1.00,0.00,1.00 -52.80,-9.60,1.00,0.00,1.00 -57.60,-14.40,1.00,0.00,1.00 -62.40,-14.40,1.00,0.00,1.00 -67.20,-14.40,1.00,0.00,1.00 -72.00,-14.40,1.00,0.00,1.00 -76.80,-14.40,1.00,0.00,1.00 -81.60,-14.40,1.00,0.00,1.00 -86.40,-14.40,1.00,0.00,1.00 -91.20,-14.40,1.00,0.00,1.00 -96.00,-14.40,1.00,0.00,1.00 -100.80,-14.40,1.00,0.00,1.00 -105.60,-14.40,1.00,0.00,1.00 -110.40,-14.40,1.00,0.00,1.00 -115.20,-14.40,1.00,0.00,1.00 -120.00,-14.40,1.00,0.00,1.00 -124.80,-9.60,1.00,0.00,1.00 -129.60,-9.60,1.00,0.00,1.00 -134.40,-9.60,1.00,0.00,1.00 -139.20,-9.60,1.00,0.00,1.00 -144.00,-9.60,1.00,0.00,1.00 -148.80,-9.60,1.00,0.00,1.00 -153.60,-4.80,1.00,0.00,1.00 -158.40,-4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --163.20,4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 --153.60,4.80,1.00,0.00,1.00 --148.80,9.60,1.00,0.00,1.00 --144.00,9.60,1.00,0.00,1.00 --139.20,9.60,1.00,0.00,1.00 --134.40,9.60,1.00,0.00,1.00 --129.60,9.60,1.00,0.00,1.00 --124.80,9.60,1.00,0.00,1.00 --120.00,14.40,1.00,0.00,1.00 --115.20,14.40,1.00,0.00,1.00 --110.40,14.40,1.00,0.00,1.00 --105.60,14.40,1.00,0.00,1.00 --100.80,14.40,1.00,0.00,1.00 --96.00,14.40,1.00,0.00,1.00 --91.20,14.40,1.00,0.00,1.00 --86.40,14.40,1.00,0.00,1.00 --81.60,14.40,1.00,0.00,1.00 --76.80,14.40,1.00,0.00,1.00 --72.00,14.40,1.00,0.00,1.00 --67.20,14.40,1.00,0.00,1.00 --62.40,14.40,1.00,0.00,1.00 --57.60,14.40,1.00,0.00,1.00 --52.80,9.60,1.00,0.00,1.00 --48.00,9.60,1.00,0.00,1.00 --43.20,9.60,1.00,0.00,1.00 --38.40,9.60,1.00,0.00,1.00 --33.60,9.60,1.00,0.00,1.00 --28.80,4.80,1.00,0.00,1.00 --24.00,4.80,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 -24.00,-9.60,1.00,0.00,1.00 -28.80,-9.60,1.00,0.00,1.00 -33.60,-9.60,1.00,0.00,1.00 -38.40,-9.60,1.00,0.00,1.00 -43.20,-14.40,1.00,0.00,1.00 -48.00,-14.40,1.00,0.00,1.00 -52.80,-14.40,1.00,0.00,1.00 -57.60,-14.40,1.00,0.00,1.00 -62.40,-19.20,1.00,0.00,1.00 -67.20,-19.20,1.00,0.00,1.00 -72.00,-19.20,1.00,0.00,1.00 -76.80,-19.20,1.00,0.00,1.00 -81.60,-19.20,1.00,0.00,1.00 -86.40,-19.20,1.00,0.00,1.00 -91.20,-19.20,1.00,0.00,1.00 -96.00,-19.20,1.00,0.00,1.00 -100.80,-19.20,1.00,0.00,1.00 -105.60,-19.20,1.00,0.00,1.00 -110.40,-19.20,1.00,0.00,1.00 -115.20,-19.20,1.00,0.00,1.00 -120.00,-14.40,1.00,0.00,1.00 -124.80,-14.40,1.00,0.00,1.00 -129.60,-14.40,1.00,0.00,1.00 -134.40,-14.40,1.00,0.00,1.00 -139.20,-14.40,1.00,0.00,1.00 -144.00,-9.60,1.00,0.00,1.00 -148.80,-9.60,1.00,0.00,1.00 -153.60,-9.60,1.00,0.00,1.00 -158.40,-4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --163.20,4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 --153.60,9.60,1.00,0.00,1.00 --148.80,9.60,1.00,0.00,1.00 --144.00,9.60,1.00,0.00,1.00 --139.20,14.40,1.00,0.00,1.00 --134.40,14.40,1.00,0.00,1.00 --129.60,14.40,1.00,0.00,1.00 --124.80,14.40,1.00,0.00,1.00 --120.00,14.40,1.00,0.00,1.00 --115.20,19.20,1.00,0.00,1.00 --110.40,19.20,1.00,0.00,1.00 --105.60,19.20,1.00,0.00,1.00 --100.80,19.20,1.00,0.00,1.00 --96.00,19.20,1.00,0.00,1.00 --91.20,19.20,1.00,0.00,1.00 --86.40,19.20,1.00,0.00,1.00 --81.60,19.20,1.00,0.00,1.00 --76.80,19.20,1.00,0.00,1.00 --72.00,19.20,1.00,0.00,1.00 --67.20,19.20,1.00,0.00,1.00 --62.40,19.20,1.00,0.00,1.00 --57.60,14.40,1.00,0.00,1.00 --52.80,14.40,1.00,0.00,1.00 --48.00,14.40,1.00,0.00,1.00 --43.20,14.40,1.00,0.00,1.00 --38.40,9.60,1.00,0.00,1.00 --33.60,9.60,1.00,0.00,1.00 --28.80,9.60,1.00,0.00,1.00 --24.00,9.60,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 -19.20,-9.60,1.00,0.00,1.00 -24.00,-9.60,1.00,0.00,1.00 -28.80,-9.60,1.00,0.00,1.00 -33.60,-14.40,1.00,0.00,1.00 -33.60,-14.40,1.00,0.00,1.00 -38.40,-14.40,1.00,0.00,1.00 -43.20,-19.20,1.00,0.00,1.00 -48.00,-19.20,1.00,0.00,1.00 -57.60,-19.20,1.00,0.00,1.00 -62.40,-19.20,1.00,0.00,1.00 -67.20,-24.00,1.00,0.00,1.00 -72.00,-24.00,1.00,0.00,1.00 -76.80,-24.00,1.00,0.00,1.00 -81.60,-24.00,1.00,0.00,1.00 -86.40,-24.00,1.00,0.00,1.00 -91.20,-24.00,1.00,0.00,1.00 -96.00,-24.00,1.00,0.00,1.00 -100.80,-24.00,1.00,0.00,1.00 -105.60,-24.00,1.00,0.00,1.00 -110.40,-24.00,1.00,0.00,1.00 -115.20,-19.20,1.00,0.00,1.00 -120.00,-19.20,1.00,0.00,1.00 -129.60,-19.20,1.00,0.00,1.00 -134.40,-19.20,1.00,0.00,1.00 -139.20,-19.20,1.00,0.00,1.00 -144.00,-14.40,1.00,0.00,1.00 -148.80,-14.40,1.00,0.00,1.00 -148.80,-14.40,1.00,0.00,1.00 -153.60,-9.60,1.00,0.00,1.00 -158.40,-9.60,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --163.20,4.80,1.00,0.00,1.00 --158.40,9.60,1.00,0.00,1.00 --153.60,9.60,1.00,0.00,1.00 --148.80,14.40,1.00,0.00,1.00 --148.80,14.40,1.00,0.00,1.00 --144.00,14.40,1.00,0.00,1.00 --139.20,19.20,1.00,0.00,1.00 --134.40,19.20,1.00,0.00,1.00 --129.60,19.20,1.00,0.00,1.00 --120.00,19.20,1.00,0.00,1.00 --115.20,19.20,1.00,0.00,1.00 --110.40,24.00,1.00,0.00,1.00 --105.60,24.00,1.00,0.00,1.00 --100.80,24.00,1.00,0.00,1.00 --96.00,24.00,1.00,0.00,1.00 --91.20,24.00,1.00,0.00,1.00 --86.40,24.00,1.00,0.00,1.00 --81.60,24.00,1.00,0.00,1.00 --76.80,24.00,1.00,0.00,1.00 --72.00,24.00,1.00,0.00,1.00 --67.20,24.00,1.00,0.00,1.00 --62.40,19.20,1.00,0.00,1.00 --57.60,19.20,1.00,0.00,1.00 --48.00,19.20,1.00,0.00,1.00 --43.20,19.20,1.00,0.00,1.00 --38.40,14.40,1.00,0.00,1.00 --33.60,14.40,1.00,0.00,1.00 --33.60,14.40,1.00,0.00,1.00 --28.80,9.60,1.00,0.00,1.00 --24.00,9.60,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 -19.20,-9.60,1.00,0.00,1.00 -19.20,-9.60,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 -28.80,-14.40,1.00,0.00,1.00 -33.60,-19.20,1.00,0.00,1.00 -38.40,-19.20,1.00,0.00,1.00 -43.20,-19.20,1.00,0.00,1.00 -48.00,-24.00,1.00,0.00,1.00 -52.80,-24.00,1.00,0.00,1.00 -57.60,-24.00,1.00,0.00,1.00 -62.40,-24.00,1.00,0.00,1.00 -72.00,-28.80,1.00,0.00,1.00 -76.80,-28.80,1.00,0.00,1.00 -81.60,-28.80,1.00,0.00,1.00 -86.40,-28.80,1.00,0.00,1.00 -91.20,-28.80,1.00,0.00,1.00 -96.00,-28.80,1.00,0.00,1.00 -100.80,-28.80,1.00,0.00,1.00 -105.60,-28.80,1.00,0.00,1.00 -115.20,-28.80,1.00,0.00,1.00 -120.00,-24.00,1.00,0.00,1.00 -124.80,-24.00,1.00,0.00,1.00 -129.60,-24.00,1.00,0.00,1.00 -134.40,-24.00,1.00,0.00,1.00 -139.20,-19.20,1.00,0.00,1.00 -144.00,-19.20,1.00,0.00,1.00 -148.80,-14.40,1.00,0.00,1.00 -153.60,-14.40,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --163.20,9.60,1.00,0.00,1.00 --163.20,9.60,1.00,0.00,1.00 --158.40,14.40,1.00,0.00,1.00 --153.60,14.40,1.00,0.00,1.00 --148.80,14.40,1.00,0.00,1.00 --144.00,19.20,1.00,0.00,1.00 --139.20,19.20,1.00,0.00,1.00 --134.40,24.00,1.00,0.00,1.00 --129.60,24.00,1.00,0.00,1.00 --124.80,24.00,1.00,0.00,1.00 --120.00,24.00,1.00,0.00,1.00 --115.20,28.80,1.00,0.00,1.00 --105.60,28.80,1.00,0.00,1.00 --100.80,28.80,1.00,0.00,1.00 --96.00,28.80,1.00,0.00,1.00 --91.20,28.80,1.00,0.00,1.00 --86.40,28.80,1.00,0.00,1.00 --81.60,28.80,1.00,0.00,1.00 --76.80,28.80,1.00,0.00,1.00 --72.00,28.80,1.00,0.00,1.00 --62.40,24.00,1.00,0.00,1.00 --57.60,24.00,1.00,0.00,1.00 --52.80,24.00,1.00,0.00,1.00 --48.00,24.00,1.00,0.00,1.00 --43.20,19.20,1.00,0.00,1.00 --38.40,19.20,1.00,0.00,1.00 --33.60,19.20,1.00,0.00,1.00 --28.80,14.40,1.00,0.00,1.00 --24.00,14.40,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 -19.20,-14.40,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 -28.80,-19.20,1.00,0.00,1.00 -33.60,-19.20,1.00,0.00,1.00 -38.40,-24.00,1.00,0.00,1.00 -43.20,-24.00,1.00,0.00,1.00 -48.00,-24.00,1.00,0.00,1.00 -52.80,-28.80,1.00,0.00,1.00 -57.60,-28.80,1.00,0.00,1.00 -62.40,-28.80,1.00,0.00,1.00 -67.20,-33.60,1.00,0.00,1.00 -72.00,-33.60,1.00,0.00,1.00 -81.60,-33.60,1.00,0.00,1.00 -86.40,-33.60,1.00,0.00,1.00 -91.20,-33.60,1.00,0.00,1.00 -96.00,-33.60,1.00,0.00,1.00 -100.80,-33.60,1.00,0.00,1.00 -110.40,-33.60,1.00,0.00,1.00 -115.20,-33.60,1.00,0.00,1.00 -120.00,-28.80,1.00,0.00,1.00 -124.80,-28.80,1.00,0.00,1.00 -129.60,-28.80,1.00,0.00,1.00 -134.40,-24.00,1.00,0.00,1.00 -139.20,-24.00,1.00,0.00,1.00 -144.00,-19.20,1.00,0.00,1.00 -148.80,-19.20,1.00,0.00,1.00 -153.60,-14.40,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 --163.20,9.60,1.00,0.00,1.00 --158.40,14.40,1.00,0.00,1.00 --153.60,14.40,1.00,0.00,1.00 --148.80,19.20,1.00,0.00,1.00 --144.00,19.20,1.00,0.00,1.00 --139.20,24.00,1.00,0.00,1.00 --134.40,24.00,1.00,0.00,1.00 --129.60,28.80,1.00,0.00,1.00 --124.80,28.80,1.00,0.00,1.00 --120.00,28.80,1.00,0.00,1.00 --115.20,33.60,1.00,0.00,1.00 --110.40,33.60,1.00,0.00,1.00 --100.80,33.60,1.00,0.00,1.00 --96.00,33.60,1.00,0.00,1.00 --91.20,33.60,1.00,0.00,1.00 --86.40,33.60,1.00,0.00,1.00 --81.60,33.60,1.00,0.00,1.00 --72.00,33.60,1.00,0.00,1.00 --67.20,33.60,1.00,0.00,1.00 --62.40,28.80,1.00,0.00,1.00 --57.60,28.80,1.00,0.00,1.00 --52.80,28.80,1.00,0.00,1.00 --48.00,24.00,1.00,0.00,1.00 --43.20,24.00,1.00,0.00,1.00 --38.40,24.00,1.00,0.00,1.00 --33.60,19.20,1.00,0.00,1.00 --28.80,19.20,1.00,0.00,1.00 --24.00,14.40,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 --14.40,9.60,1.00,0.00,1.00 --14.40,9.60,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -9.60,-9.60,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 -19.20,-14.40,1.00,0.00,1.00 -24.00,-19.20,1.00,0.00,1.00 -28.80,-19.20,1.00,0.00,1.00 -33.60,-24.00,1.00,0.00,1.00 -38.40,-24.00,1.00,0.00,1.00 -43.20,-28.80,1.00,0.00,1.00 -48.00,-28.80,1.00,0.00,1.00 -52.80,-33.60,1.00,0.00,1.00 -57.60,-33.60,1.00,0.00,1.00 -62.40,-33.60,1.00,0.00,1.00 -67.20,-38.40,1.00,0.00,1.00 -72.00,-38.40,1.00,0.00,1.00 -81.60,-38.40,1.00,0.00,1.00 -86.40,-38.40,1.00,0.00,1.00 -91.20,-38.40,1.00,0.00,1.00 -96.00,-38.40,1.00,0.00,1.00 -105.60,-38.40,1.00,0.00,1.00 -110.40,-38.40,1.00,0.00,1.00 -115.20,-33.60,1.00,0.00,1.00 -120.00,-33.60,1.00,0.00,1.00 -124.80,-33.60,1.00,0.00,1.00 -129.60,-28.80,1.00,0.00,1.00 -134.40,-28.80,1.00,0.00,1.00 -139.20,-24.00,1.00,0.00,1.00 -144.00,-24.00,1.00,0.00,1.00 -148.80,-19.20,1.00,0.00,1.00 -153.60,-19.20,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 -163.20,-14.40,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 --158.40,14.40,1.00,0.00,1.00 --153.60,19.20,1.00,0.00,1.00 --148.80,19.20,1.00,0.00,1.00 --144.00,24.00,1.00,0.00,1.00 --139.20,24.00,1.00,0.00,1.00 --134.40,28.80,1.00,0.00,1.00 --129.60,28.80,1.00,0.00,1.00 --124.80,33.60,1.00,0.00,1.00 --120.00,33.60,1.00,0.00,1.00 --115.20,33.60,1.00,0.00,1.00 --110.40,38.40,1.00,0.00,1.00 --105.60,38.40,1.00,0.00,1.00 --96.00,38.40,1.00,0.00,1.00 --91.20,38.40,1.00,0.00,1.00 --86.40,38.40,1.00,0.00,1.00 --81.60,38.40,1.00,0.00,1.00 --72.00,38.40,1.00,0.00,1.00 --67.20,38.40,1.00,0.00,1.00 --62.40,33.60,1.00,0.00,1.00 --57.60,33.60,1.00,0.00,1.00 --52.80,33.60,1.00,0.00,1.00 --48.00,28.80,1.00,0.00,1.00 --43.20,28.80,1.00,0.00,1.00 --38.40,24.00,1.00,0.00,1.00 --33.60,24.00,1.00,0.00,1.00 --28.80,19.20,1.00,0.00,1.00 --24.00,19.20,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 --14.40,9.60,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -9.60,-9.60,1.00,0.00,1.00 -14.40,-14.40,1.00,0.00,1.00 -19.20,-14.40,1.00,0.00,1.00 -24.00,-19.20,1.00,0.00,1.00 -24.00,-24.00,1.00,0.00,1.00 -28.80,-24.00,1.00,0.00,1.00 -33.60,-28.80,1.00,0.00,1.00 -38.40,-28.80,1.00,0.00,1.00 -43.20,-33.60,1.00,0.00,1.00 -48.00,-33.60,1.00,0.00,1.00 -52.80,-38.40,1.00,0.00,1.00 -62.40,-38.40,1.00,0.00,1.00 -67.20,-38.40,1.00,0.00,1.00 -72.00,-43.20,1.00,0.00,1.00 -76.80,-43.20,1.00,0.00,1.00 -86.40,-43.20,1.00,0.00,1.00 -91.20,-43.20,1.00,0.00,1.00 -96.00,-43.20,1.00,0.00,1.00 -105.60,-43.20,1.00,0.00,1.00 -110.40,-43.20,1.00,0.00,1.00 -115.20,-38.40,1.00,0.00,1.00 -124.80,-38.40,1.00,0.00,1.00 -129.60,-38.40,1.00,0.00,1.00 -134.40,-33.60,1.00,0.00,1.00 -139.20,-33.60,1.00,0.00,1.00 -144.00,-28.80,1.00,0.00,1.00 -148.80,-28.80,1.00,0.00,1.00 -153.60,-24.00,1.00,0.00,1.00 -158.40,-19.20,1.00,0.00,1.00 -158.40,-19.20,1.00,0.00,1.00 -163.20,-14.40,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 --158.40,19.20,1.00,0.00,1.00 --158.40,19.20,1.00,0.00,1.00 --153.60,24.00,1.00,0.00,1.00 --148.80,28.80,1.00,0.00,1.00 --144.00,28.80,1.00,0.00,1.00 --139.20,33.60,1.00,0.00,1.00 --134.40,33.60,1.00,0.00,1.00 --129.60,38.40,1.00,0.00,1.00 --124.80,38.40,1.00,0.00,1.00 --115.20,38.40,1.00,0.00,1.00 --110.40,43.20,1.00,0.00,1.00 --105.60,43.20,1.00,0.00,1.00 --96.00,43.20,1.00,0.00,1.00 --91.20,43.20,1.00,0.00,1.00 --86.40,43.20,1.00,0.00,1.00 --76.80,43.20,1.00,0.00,1.00 --72.00,43.20,1.00,0.00,1.00 --67.20,38.40,1.00,0.00,1.00 --62.40,38.40,1.00,0.00,1.00 --52.80,38.40,1.00,0.00,1.00 --48.00,33.60,1.00,0.00,1.00 --43.20,33.60,1.00,0.00,1.00 --38.40,28.80,1.00,0.00,1.00 --33.60,28.80,1.00,0.00,1.00 --28.80,24.00,1.00,0.00,1.00 --24.00,24.00,1.00,0.00,1.00 --24.00,19.20,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 --14.40,14.40,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -9.60,-9.60,1.00,0.00,1.00 -14.40,-14.40,1.00,0.00,1.00 -14.40,-19.20,1.00,0.00,1.00 -19.20,-19.20,1.00,0.00,1.00 -24.00,-24.00,1.00,0.00,1.00 -28.80,-28.80,1.00,0.00,1.00 -33.60,-28.80,1.00,0.00,1.00 -38.40,-33.60,1.00,0.00,1.00 -43.20,-38.40,1.00,0.00,1.00 -48.00,-38.40,1.00,0.00,1.00 -52.80,-43.20,1.00,0.00,1.00 -57.60,-43.20,1.00,0.00,1.00 -62.40,-43.20,1.00,0.00,1.00 -72.00,-48.00,1.00,0.00,1.00 -76.80,-48.00,1.00,0.00,1.00 -86.40,-48.00,1.00,0.00,1.00 -91.20,-48.00,1.00,0.00,1.00 -100.80,-48.00,1.00,0.00,1.00 -105.60,-48.00,1.00,0.00,1.00 -110.40,-48.00,1.00,0.00,1.00 -120.00,-43.20,1.00,0.00,1.00 -124.80,-43.20,1.00,0.00,1.00 -129.60,-38.40,1.00,0.00,1.00 -134.40,-38.40,1.00,0.00,1.00 -139.20,-33.60,1.00,0.00,1.00 -144.00,-33.60,1.00,0.00,1.00 -148.80,-28.80,1.00,0.00,1.00 -153.60,-24.00,1.00,0.00,1.00 -158.40,-24.00,1.00,0.00,1.00 -163.20,-19.20,1.00,0.00,1.00 -163.20,-14.40,1.00,0.00,1.00 -168.00,-14.40,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --168.00,14.40,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 --163.20,19.20,1.00,0.00,1.00 --158.40,24.00,1.00,0.00,1.00 --153.60,24.00,1.00,0.00,1.00 --148.80,28.80,1.00,0.00,1.00 --144.00,33.60,1.00,0.00,1.00 --139.20,33.60,1.00,0.00,1.00 --134.40,38.40,1.00,0.00,1.00 --129.60,38.40,1.00,0.00,1.00 --124.80,43.20,1.00,0.00,1.00 --120.00,43.20,1.00,0.00,1.00 --110.40,48.00,1.00,0.00,1.00 --105.60,48.00,1.00,0.00,1.00 --100.80,48.00,1.00,0.00,1.00 --91.20,48.00,1.00,0.00,1.00 --86.40,48.00,1.00,0.00,1.00 --76.80,48.00,1.00,0.00,1.00 --72.00,48.00,1.00,0.00,1.00 --62.40,43.20,1.00,0.00,1.00 --57.60,43.20,1.00,0.00,1.00 --52.80,43.20,1.00,0.00,1.00 --48.00,38.40,1.00,0.00,1.00 --43.20,38.40,1.00,0.00,1.00 --38.40,33.60,1.00,0.00,1.00 --33.60,28.80,1.00,0.00,1.00 --28.80,28.80,1.00,0.00,1.00 --24.00,24.00,1.00,0.00,1.00 --19.20,19.20,1.00,0.00,1.00 --14.40,19.20,1.00,0.00,1.00 --14.40,14.40,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -9.60,-9.60,1.00,0.00,1.00 -9.60,-14.40,1.00,0.00,1.00 -14.40,-19.20,1.00,0.00,1.00 -19.20,-24.00,1.00,0.00,1.00 -24.00,-24.00,1.00,0.00,1.00 -24.00,-28.80,1.00,0.00,1.00 -28.80,-33.60,1.00,0.00,1.00 -33.60,-38.40,1.00,0.00,1.00 -38.40,-38.40,1.00,0.00,1.00 -43.20,-43.20,1.00,0.00,1.00 -48.00,-43.20,1.00,0.00,1.00 -52.80,-48.00,1.00,0.00,1.00 -62.40,-48.00,1.00,0.00,1.00 -67.20,-52.80,1.00,0.00,1.00 -76.80,-52.80,1.00,0.00,1.00 -86.40,-52.80,1.00,0.00,1.00 -91.20,-52.80,1.00,0.00,1.00 -100.80,-52.80,1.00,0.00,1.00 -105.60,-52.80,1.00,0.00,1.00 -115.20,-48.00,1.00,0.00,1.00 -120.00,-48.00,1.00,0.00,1.00 -129.60,-48.00,1.00,0.00,1.00 -134.40,-43.20,1.00,0.00,1.00 -139.20,-43.20,1.00,0.00,1.00 -144.00,-38.40,1.00,0.00,1.00 -148.80,-33.60,1.00,0.00,1.00 -153.60,-33.60,1.00,0.00,1.00 -158.40,-28.80,1.00,0.00,1.00 -158.40,-24.00,1.00,0.00,1.00 -163.20,-19.20,1.00,0.00,1.00 -168.00,-19.20,1.00,0.00,1.00 -168.00,-14.40,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --168.00,14.40,1.00,0.00,1.00 --168.00,19.20,1.00,0.00,1.00 --163.20,19.20,1.00,0.00,1.00 --158.40,24.00,1.00,0.00,1.00 --158.40,28.80,1.00,0.00,1.00 --153.60,33.60,1.00,0.00,1.00 --148.80,33.60,1.00,0.00,1.00 --144.00,38.40,1.00,0.00,1.00 --139.20,43.20,1.00,0.00,1.00 --134.40,43.20,1.00,0.00,1.00 --129.60,48.00,1.00,0.00,1.00 --120.00,48.00,1.00,0.00,1.00 --115.20,48.00,1.00,0.00,1.00 --105.60,52.80,1.00,0.00,1.00 --100.80,52.80,1.00,0.00,1.00 --91.20,52.80,1.00,0.00,1.00 --86.40,52.80,1.00,0.00,1.00 --76.80,52.80,1.00,0.00,1.00 --67.20,52.80,1.00,0.00,1.00 --62.40,48.00,1.00,0.00,1.00 --52.80,48.00,1.00,0.00,1.00 --48.00,43.20,1.00,0.00,1.00 --43.20,43.20,1.00,0.00,1.00 --38.40,38.40,1.00,0.00,1.00 --33.60,38.40,1.00,0.00,1.00 --28.80,33.60,1.00,0.00,1.00 --24.00,28.80,1.00,0.00,1.00 --24.00,24.00,1.00,0.00,1.00 --19.20,24.00,1.00,0.00,1.00 --14.40,19.20,1.00,0.00,1.00 --9.60,14.40,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -9.60,-14.40,1.00,0.00,1.00 -9.60,-14.40,1.00,0.00,1.00 -14.40,-19.20,1.00,0.00,1.00 -14.40,-24.00,1.00,0.00,1.00 -19.20,-28.80,1.00,0.00,1.00 -24.00,-33.60,1.00,0.00,1.00 -28.80,-33.60,1.00,0.00,1.00 -28.80,-38.40,1.00,0.00,1.00 -33.60,-43.20,1.00,0.00,1.00 -38.40,-43.20,1.00,0.00,1.00 -48.00,-48.00,1.00,0.00,1.00 -52.80,-52.80,1.00,0.00,1.00 -57.60,-52.80,1.00,0.00,1.00 -67.20,-57.60,1.00,0.00,1.00 -76.80,-57.60,1.00,0.00,1.00 -81.60,-57.60,1.00,0.00,1.00 -91.20,-57.60,1.00,0.00,1.00 -100.80,-57.60,1.00,0.00,1.00 -110.40,-57.60,1.00,0.00,1.00 -115.20,-52.80,1.00,0.00,1.00 -124.80,-52.80,1.00,0.00,1.00 -129.60,-48.00,1.00,0.00,1.00 -139.20,-48.00,1.00,0.00,1.00 -144.00,-43.20,1.00,0.00,1.00 -148.80,-38.40,1.00,0.00,1.00 -153.60,-38.40,1.00,0.00,1.00 -153.60,-33.60,1.00,0.00,1.00 -158.40,-28.80,1.00,0.00,1.00 -163.20,-24.00,1.00,0.00,1.00 -163.20,-24.00,1.00,0.00,1.00 -168.00,-19.20,1.00,0.00,1.00 -172.80,-14.40,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --172.80,14.40,1.00,0.00,1.00 --168.00,19.20,1.00,0.00,1.00 --163.20,24.00,1.00,0.00,1.00 --163.20,24.00,1.00,0.00,1.00 --158.40,28.80,1.00,0.00,1.00 --153.60,33.60,1.00,0.00,1.00 --153.60,38.40,1.00,0.00,1.00 --148.80,38.40,1.00,0.00,1.00 --144.00,43.20,1.00,0.00,1.00 --139.20,48.00,1.00,0.00,1.00 --129.60,48.00,1.00,0.00,1.00 --124.80,52.80,1.00,0.00,1.00 --115.20,52.80,1.00,0.00,1.00 --110.40,57.60,1.00,0.00,1.00 --100.80,57.60,1.00,0.00,1.00 --91.20,57.60,1.00,0.00,1.00 --81.60,57.60,1.00,0.00,1.00 --76.80,57.60,1.00,0.00,1.00 --67.20,57.60,1.00,0.00,1.00 --57.60,52.80,1.00,0.00,1.00 --52.80,52.80,1.00,0.00,1.00 --48.00,48.00,1.00,0.00,1.00 --38.40,43.20,1.00,0.00,1.00 --33.60,43.20,1.00,0.00,1.00 --28.80,38.40,1.00,0.00,1.00 --28.80,33.60,1.00,0.00,1.00 --24.00,33.60,1.00,0.00,1.00 --19.20,28.80,1.00,0.00,1.00 --14.40,24.00,1.00,0.00,1.00 --14.40,19.20,1.00,0.00,1.00 --9.60,14.40,1.00,0.00,1.00 --9.60,14.40,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -4.80,-14.40,1.00,0.00,1.00 -9.60,-19.20,1.00,0.00,1.00 -9.60,-19.20,1.00,0.00,1.00 -14.40,-24.00,1.00,0.00,1.00 -19.20,-28.80,1.00,0.00,1.00 -19.20,-33.60,1.00,0.00,1.00 -24.00,-38.40,1.00,0.00,1.00 -28.80,-43.20,1.00,0.00,1.00 -33.60,-43.20,1.00,0.00,1.00 -38.40,-48.00,1.00,0.00,1.00 -43.20,-52.80,1.00,0.00,1.00 -48.00,-52.80,1.00,0.00,1.00 -52.80,-57.60,1.00,0.00,1.00 -62.40,-57.60,1.00,0.00,1.00 -72.00,-62.40,1.00,0.00,1.00 -81.60,-62.40,1.00,0.00,1.00 -91.20,-62.40,1.00,0.00,1.00 -100.80,-62.40,1.00,0.00,1.00 -110.40,-62.40,1.00,0.00,1.00 -120.00,-57.60,1.00,0.00,1.00 -129.60,-57.60,1.00,0.00,1.00 -134.40,-52.80,1.00,0.00,1.00 -139.20,-48.00,1.00,0.00,1.00 -144.00,-48.00,1.00,0.00,1.00 -148.80,-43.20,1.00,0.00,1.00 -153.60,-38.40,1.00,0.00,1.00 -158.40,-33.60,1.00,0.00,1.00 -163.20,-33.60,1.00,0.00,1.00 -163.20,-28.80,1.00,0.00,1.00 -168.00,-24.00,1.00,0.00,1.00 -168.00,-19.20,1.00,0.00,1.00 -172.80,-14.40,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --172.80,14.40,1.00,0.00,1.00 --168.00,19.20,1.00,0.00,1.00 --168.00,24.00,1.00,0.00,1.00 --163.20,28.80,1.00,0.00,1.00 --163.20,33.60,1.00,0.00,1.00 --158.40,33.60,1.00,0.00,1.00 --153.60,38.40,1.00,0.00,1.00 --148.80,43.20,1.00,0.00,1.00 --144.00,48.00,1.00,0.00,1.00 --139.20,48.00,1.00,0.00,1.00 --134.40,52.80,1.00,0.00,1.00 --129.60,57.60,1.00,0.00,1.00 --120.00,57.60,1.00,0.00,1.00 --110.40,62.40,1.00,0.00,1.00 --100.80,62.40,1.00,0.00,1.00 --91.20,62.40,1.00,0.00,1.00 --81.60,62.40,1.00,0.00,1.00 --72.00,62.40,1.00,0.00,1.00 --62.40,57.60,1.00,0.00,1.00 --52.80,57.60,1.00,0.00,1.00 --48.00,52.80,1.00,0.00,1.00 --43.20,52.80,1.00,0.00,1.00 --38.40,48.00,1.00,0.00,1.00 --33.60,43.20,1.00,0.00,1.00 --28.80,43.20,1.00,0.00,1.00 --24.00,38.40,1.00,0.00,1.00 --19.20,33.60,1.00,0.00,1.00 --19.20,28.80,1.00,0.00,1.00 --14.40,24.00,1.00,0.00,1.00 --9.60,19.20,1.00,0.00,1.00 --9.60,19.20,1.00,0.00,1.00 --4.80,14.40,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -4.80,-14.40,1.00,0.00,1.00 -9.60,-19.20,1.00,0.00,1.00 -9.60,-24.00,1.00,0.00,1.00 -14.40,-24.00,1.00,0.00,1.00 -14.40,-28.80,1.00,0.00,1.00 -19.20,-33.60,1.00,0.00,1.00 -19.20,-38.40,1.00,0.00,1.00 -24.00,-43.20,1.00,0.00,1.00 -28.80,-48.00,1.00,0.00,1.00 -33.60,-52.80,1.00,0.00,1.00 -38.40,-52.80,1.00,0.00,1.00 -43.20,-57.60,1.00,0.00,1.00 -48.00,-62.40,1.00,0.00,1.00 -57.60,-62.40,1.00,0.00,1.00 -67.20,-67.20,1.00,0.00,1.00 -81.60,-67.20,1.00,0.00,1.00 -91.20,-67.20,1.00,0.00,1.00 -105.60,-67.20,1.00,0.00,1.00 -115.20,-67.20,1.00,0.00,1.00 -124.80,-62.40,1.00,0.00,1.00 -134.40,-57.60,1.00,0.00,1.00 -139.20,-57.60,1.00,0.00,1.00 -144.00,-52.80,1.00,0.00,1.00 -148.80,-48.00,1.00,0.00,1.00 -153.60,-43.20,1.00,0.00,1.00 -158.40,-43.20,1.00,0.00,1.00 -163.20,-38.40,1.00,0.00,1.00 -163.20,-33.60,1.00,0.00,1.00 -168.00,-28.80,1.00,0.00,1.00 -168.00,-24.00,1.00,0.00,1.00 -172.80,-19.20,1.00,0.00,1.00 -172.80,-14.40,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --172.80,14.40,1.00,0.00,1.00 --172.80,19.20,1.00,0.00,1.00 --168.00,24.00,1.00,0.00,1.00 --168.00,28.80,1.00,0.00,1.00 --163.20,33.60,1.00,0.00,1.00 --163.20,38.40,1.00,0.00,1.00 --158.40,43.20,1.00,0.00,1.00 --153.60,43.20,1.00,0.00,1.00 --148.80,48.00,1.00,0.00,1.00 --144.00,52.80,1.00,0.00,1.00 --139.20,57.60,1.00,0.00,1.00 --134.40,57.60,1.00,0.00,1.00 --124.80,62.40,1.00,0.00,1.00 --115.20,67.20,1.00,0.00,1.00 --105.60,67.20,1.00,0.00,1.00 --91.20,67.20,1.00,0.00,1.00 --81.60,67.20,1.00,0.00,1.00 --67.20,67.20,1.00,0.00,1.00 --57.60,62.40,1.00,0.00,1.00 --48.00,62.40,1.00,0.00,1.00 --43.20,57.60,1.00,0.00,1.00 --38.40,52.80,1.00,0.00,1.00 --33.60,52.80,1.00,0.00,1.00 --28.80,48.00,1.00,0.00,1.00 --24.00,43.20,1.00,0.00,1.00 --19.20,38.40,1.00,0.00,1.00 --19.20,33.60,1.00,0.00,1.00 --14.40,28.80,1.00,0.00,1.00 --14.40,24.00,1.00,0.00,1.00 --9.60,24.00,1.00,0.00,1.00 --9.60,19.20,1.00,0.00,1.00 --4.80,14.40,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -4.80,-14.40,1.00,0.00,1.00 -4.80,-19.20,1.00,0.00,1.00 -9.60,-24.00,1.00,0.00,1.00 -9.60,-28.80,1.00,0.00,1.00 -9.60,-33.60,1.00,0.00,1.00 -14.40,-38.40,1.00,0.00,1.00 -14.40,-38.40,1.00,0.00,1.00 -19.20,-43.20,1.00,0.00,1.00 -24.00,-48.00,1.00,0.00,1.00 -24.00,-52.80,1.00,0.00,1.00 -28.80,-57.60,1.00,0.00,1.00 -38.40,-62.40,1.00,0.00,1.00 -43.20,-62.40,1.00,0.00,1.00 -52.80,-67.20,1.00,0.00,1.00 -62.40,-72.00,1.00,0.00,1.00 -76.80,-72.00,1.00,0.00,1.00 -96.00,-72.00,1.00,0.00,1.00 -110.40,-72.00,1.00,0.00,1.00 -120.00,-67.20,1.00,0.00,1.00 -134.40,-67.20,1.00,0.00,1.00 -139.20,-62.40,1.00,0.00,1.00 -148.80,-57.60,1.00,0.00,1.00 -153.60,-57.60,1.00,0.00,1.00 -158.40,-52.80,1.00,0.00,1.00 -158.40,-48.00,1.00,0.00,1.00 -163.20,-43.20,1.00,0.00,1.00 -163.20,-38.40,1.00,0.00,1.00 -168.00,-33.60,1.00,0.00,1.00 -168.00,-28.80,1.00,0.00,1.00 -172.80,-24.00,1.00,0.00,1.00 -172.80,-19.20,1.00,0.00,1.00 -172.80,-14.40,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --172.80,14.40,1.00,0.00,1.00 --172.80,19.20,1.00,0.00,1.00 --172.80,24.00,1.00,0.00,1.00 --168.00,28.80,1.00,0.00,1.00 --168.00,33.60,1.00,0.00,1.00 --163.20,38.40,1.00,0.00,1.00 --163.20,43.20,1.00,0.00,1.00 --158.40,48.00,1.00,0.00,1.00 --158.40,52.80,1.00,0.00,1.00 --153.60,57.60,1.00,0.00,1.00 --148.80,57.60,1.00,0.00,1.00 --139.20,62.40,1.00,0.00,1.00 --134.40,67.20,1.00,0.00,1.00 --120.00,67.20,1.00,0.00,1.00 --110.40,72.00,1.00,0.00,1.00 --96.00,72.00,1.00,0.00,1.00 --76.80,72.00,1.00,0.00,1.00 --62.40,72.00,1.00,0.00,1.00 --52.80,67.20,1.00,0.00,1.00 --43.20,62.40,1.00,0.00,1.00 --38.40,62.40,1.00,0.00,1.00 --28.80,57.60,1.00,0.00,1.00 --24.00,52.80,1.00,0.00,1.00 --24.00,48.00,1.00,0.00,1.00 --19.20,43.20,1.00,0.00,1.00 --14.40,38.40,1.00,0.00,1.00 --14.40,38.40,1.00,0.00,1.00 --9.60,33.60,1.00,0.00,1.00 --9.60,28.80,1.00,0.00,1.00 --9.60,24.00,1.00,0.00,1.00 --4.80,19.20,1.00,0.00,1.00 --4.80,14.40,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,-9.60,1.00,0.00,1.00 -4.80,-14.40,1.00,0.00,1.00 -4.80,-19.20,1.00,0.00,1.00 -4.80,-24.00,1.00,0.00,1.00 -4.80,-28.80,1.00,0.00,1.00 -9.60,-33.60,1.00,0.00,1.00 -9.60,-38.40,1.00,0.00,1.00 -14.40,-43.20,1.00,0.00,1.00 -14.40,-48.00,1.00,0.00,1.00 -14.40,-52.80,1.00,0.00,1.00 -19.20,-57.60,1.00,0.00,1.00 -24.00,-57.60,1.00,0.00,1.00 -28.80,-62.40,1.00,0.00,1.00 -33.60,-67.20,1.00,0.00,1.00 -43.20,-72.00,1.00,0.00,1.00 -57.60,-72.00,1.00,0.00,1.00 -76.80,-76.80,1.00,0.00,1.00 -96.00,-76.80,1.00,0.00,1.00 -115.20,-76.80,1.00,0.00,1.00 -129.60,-72.00,1.00,0.00,1.00 -139.20,-72.00,1.00,0.00,1.00 -148.80,-67.20,1.00,0.00,1.00 -153.60,-62.40,1.00,0.00,1.00 -158.40,-57.60,1.00,0.00,1.00 -163.20,-52.80,1.00,0.00,1.00 -163.20,-48.00,1.00,0.00,1.00 -168.00,-43.20,1.00,0.00,1.00 -168.00,-38.40,1.00,0.00,1.00 -172.80,-33.60,1.00,0.00,1.00 -172.80,-28.80,1.00,0.00,1.00 -172.80,-24.00,1.00,0.00,1.00 -172.80,-19.20,1.00,0.00,1.00 -177.60,-14.40,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --177.60,14.40,1.00,0.00,1.00 --172.80,19.20,1.00,0.00,1.00 --172.80,24.00,1.00,0.00,1.00 --172.80,28.80,1.00,0.00,1.00 --172.80,33.60,1.00,0.00,1.00 --168.00,38.40,1.00,0.00,1.00 --168.00,43.20,1.00,0.00,1.00 --163.20,48.00,1.00,0.00,1.00 --163.20,52.80,1.00,0.00,1.00 --158.40,57.60,1.00,0.00,1.00 --153.60,62.40,1.00,0.00,1.00 --148.80,67.20,1.00,0.00,1.00 --139.20,72.00,1.00,0.00,1.00 --129.60,72.00,1.00,0.00,1.00 --115.20,76.80,1.00,0.00,1.00 --96.00,76.80,1.00,0.00,1.00 --76.80,76.80,1.00,0.00,1.00 --57.60,72.00,1.00,0.00,1.00 --43.20,72.00,1.00,0.00,1.00 --33.60,67.20,1.00,0.00,1.00 --28.80,62.40,1.00,0.00,1.00 --24.00,57.60,1.00,0.00,1.00 --19.20,57.60,1.00,0.00,1.00 --14.40,52.80,1.00,0.00,1.00 --14.40,48.00,1.00,0.00,1.00 --14.40,43.20,1.00,0.00,1.00 --9.60,38.40,1.00,0.00,1.00 --9.60,33.60,1.00,0.00,1.00 --4.80,28.80,1.00,0.00,1.00 --4.80,24.00,1.00,0.00,1.00 --4.80,19.20,1.00,0.00,1.00 --4.80,14.40,1.00,0.00,1.00 --0.00,9.60,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,-9.60,1.00,0.00,1.00 -0.00,-14.40,1.00,0.00,1.00 -4.80,-19.20,1.00,0.00,1.00 -4.80,-24.00,1.00,0.00,1.00 -4.80,-28.80,1.00,0.00,1.00 -4.80,-33.60,1.00,0.00,1.00 -4.80,-38.40,1.00,0.00,1.00 -9.60,-43.20,1.00,0.00,1.00 -9.60,-48.00,1.00,0.00,1.00 -9.60,-52.80,1.00,0.00,1.00 -14.40,-57.60,1.00,0.00,1.00 -14.40,-62.40,1.00,0.00,1.00 -19.20,-67.20,1.00,0.00,1.00 -24.00,-72.00,1.00,0.00,1.00 -33.60,-72.00,1.00,0.00,1.00 -43.20,-76.80,1.00,0.00,1.00 -67.20,-81.60,1.00,0.00,1.00 -96.00,-81.60,1.00,0.00,1.00 -124.80,-81.60,1.00,0.00,1.00 -144.00,-76.80,1.00,0.00,1.00 -153.60,-72.00,1.00,0.00,1.00 -158.40,-67.20,1.00,0.00,1.00 -163.20,-62.40,1.00,0.00,1.00 -168.00,-57.60,1.00,0.00,1.00 -168.00,-52.80,1.00,0.00,1.00 -168.00,-48.00,1.00,0.00,1.00 -172.80,-43.20,1.00,0.00,1.00 -172.80,-38.40,1.00,0.00,1.00 -172.80,-33.60,1.00,0.00,1.00 -172.80,-28.80,1.00,0.00,1.00 -177.60,-24.00,1.00,0.00,1.00 -177.60,-19.20,1.00,0.00,1.00 -177.60,-14.40,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --177.60,14.40,1.00,0.00,1.00 --177.60,19.20,1.00,0.00,1.00 --177.60,24.00,1.00,0.00,1.00 --172.80,28.80,1.00,0.00,1.00 --172.80,33.60,1.00,0.00,1.00 --172.80,38.40,1.00,0.00,1.00 --172.80,43.20,1.00,0.00,1.00 --168.00,48.00,1.00,0.00,1.00 --168.00,52.80,1.00,0.00,1.00 --168.00,57.60,1.00,0.00,1.00 --163.20,62.40,1.00,0.00,1.00 --158.40,67.20,1.00,0.00,1.00 --153.60,72.00,1.00,0.00,1.00 --144.00,76.80,1.00,0.00,1.00 --124.80,81.60,1.00,0.00,1.00 --96.00,81.60,1.00,0.00,1.00 --67.20,81.60,1.00,0.00,1.00 --43.20,76.80,1.00,0.00,1.00 --33.60,72.00,1.00,0.00,1.00 --24.00,72.00,1.00,0.00,1.00 --19.20,67.20,1.00,0.00,1.00 --14.40,62.40,1.00,0.00,1.00 --14.40,57.60,1.00,0.00,1.00 --9.60,52.80,1.00,0.00,1.00 --9.60,48.00,1.00,0.00,1.00 --9.60,43.20,1.00,0.00,1.00 --4.80,38.40,1.00,0.00,1.00 --4.80,33.60,1.00,0.00,1.00 --4.80,28.80,1.00,0.00,1.00 --4.80,24.00,1.00,0.00,1.00 --4.80,19.20,1.00,0.00,1.00 --0.00,14.40,1.00,0.00,1.00 --0.00,9.60,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,-9.60,1.00,0.00,1.00 -0.00,-14.40,1.00,0.00,1.00 -0.00,-19.20,1.00,0.00,1.00 -0.00,-24.00,1.00,0.00,1.00 -0.00,-28.80,1.00,0.00,1.00 -0.00,-33.60,1.00,0.00,1.00 -4.80,-38.40,1.00,0.00,1.00 -4.80,-43.20,1.00,0.00,1.00 -4.80,-48.00,1.00,0.00,1.00 -4.80,-52.80,1.00,0.00,1.00 -4.80,-57.60,1.00,0.00,1.00 -4.80,-62.40,1.00,0.00,1.00 -9.60,-67.20,1.00,0.00,1.00 -9.60,-72.00,1.00,0.00,1.00 -14.40,-76.80,1.00,0.00,1.00 -24.00,-81.60,1.00,0.00,1.00 -43.20,-86.40,1.00,0.00,1.00 -110.40,-86.40,1.00,0.00,1.00 -148.80,-81.60,1.00,0.00,1.00 -163.20,-76.80,1.00,0.00,1.00 -168.00,-72.00,1.00,0.00,1.00 -172.80,-67.20,1.00,0.00,1.00 -172.80,-62.40,1.00,0.00,1.00 -172.80,-57.60,1.00,0.00,1.00 -172.80,-52.80,1.00,0.00,1.00 -177.60,-48.00,1.00,0.00,1.00 -177.60,-43.20,1.00,0.00,1.00 -177.60,-38.40,1.00,0.00,1.00 -177.60,-33.60,1.00,0.00,1.00 -177.60,-28.80,1.00,0.00,1.00 -177.60,-24.00,1.00,0.00,1.00 -177.60,-19.20,1.00,0.00,1.00 -177.60,-14.40,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --177.60,14.40,1.00,0.00,1.00 --177.60,19.20,1.00,0.00,1.00 --177.60,24.00,1.00,0.00,1.00 --177.60,28.80,1.00,0.00,1.00 --177.60,33.60,1.00,0.00,1.00 --177.60,38.40,1.00,0.00,1.00 --177.60,43.20,1.00,0.00,1.00 --177.60,48.00,1.00,0.00,1.00 --172.80,52.80,1.00,0.00,1.00 --172.80,57.60,1.00,0.00,1.00 --172.80,62.40,1.00,0.00,1.00 --172.80,67.20,1.00,0.00,1.00 --168.00,72.00,1.00,0.00,1.00 --163.20,76.80,1.00,0.00,1.00 --148.80,81.60,1.00,0.00,1.00 --110.40,86.40,1.00,0.00,1.00 --43.20,86.40,1.00,0.00,1.00 --24.00,81.60,1.00,0.00,1.00 --14.40,76.80,1.00,0.00,1.00 --9.60,72.00,1.00,0.00,1.00 --9.60,67.20,1.00,0.00,1.00 --4.80,62.40,1.00,0.00,1.00 --4.80,57.60,1.00,0.00,1.00 --4.80,52.80,1.00,0.00,1.00 --4.80,48.00,1.00,0.00,1.00 --4.80,43.20,1.00,0.00,1.00 --4.80,38.40,1.00,0.00,1.00 --0.00,33.60,1.00,0.00,1.00 --0.00,28.80,1.00,0.00,1.00 --0.00,24.00,1.00,0.00,1.00 --0.00,19.20,1.00,0.00,1.00 --0.00,14.40,1.00,0.00,1.00 --0.00,9.60,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --0.00,-4.80,1.00,0.00,1.00 --0.00,-9.60,1.00,0.00,1.00 --0.00,-14.40,1.00,0.00,1.00 --0.00,-19.20,1.00,0.00,1.00 --0.00,-24.00,1.00,0.00,1.00 --0.00,-28.80,1.00,0.00,1.00 --0.00,-33.60,1.00,0.00,1.00 --0.00,-38.40,1.00,0.00,1.00 --0.00,-43.20,1.00,0.00,1.00 --0.00,-48.00,1.00,0.00,1.00 --0.00,-52.80,1.00,0.00,1.00 --0.00,-57.60,1.00,0.00,1.00 --0.00,-62.40,1.00,0.00,1.00 --4.80,-67.20,1.00,0.00,1.00 --4.80,-72.00,1.00,0.00,1.00 --4.80,-76.80,1.00,0.00,1.00 --9.60,-81.60,1.00,0.00,1.00 --19.20,-86.40,1.00,0.00,1.00 --134.40,-86.40,1.00,0.00,1.00 --168.00,-81.60,1.00,0.00,1.00 --172.80,-76.80,1.00,0.00,1.00 --177.60,-72.00,1.00,0.00,1.00 --177.60,-67.20,1.00,0.00,1.00 --177.60,-62.40,1.00,0.00,1.00 --177.60,-57.60,1.00,0.00,1.00 --177.60,-52.80,1.00,0.00,1.00 --177.60,-48.00,1.00,0.00,1.00 --177.60,-43.20,1.00,0.00,1.00 --177.60,-38.40,1.00,0.00,1.00 --177.60,-33.60,1.00,0.00,1.00 --177.60,-28.80,1.00,0.00,1.00 --177.60,-24.00,1.00,0.00,1.00 --177.60,-19.20,1.00,0.00,1.00 --177.60,-14.40,1.00,0.00,1.00 --177.60,-9.60,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,9.60,1.00,0.00,1.00 -177.60,14.40,1.00,0.00,1.00 -177.60,19.20,1.00,0.00,1.00 -177.60,24.00,1.00,0.00,1.00 -177.60,28.80,1.00,0.00,1.00 -177.60,33.60,1.00,0.00,1.00 -177.60,38.40,1.00,0.00,1.00 -177.60,43.20,1.00,0.00,1.00 -177.60,48.00,1.00,0.00,1.00 -177.60,52.80,1.00,0.00,1.00 -177.60,57.60,1.00,0.00,1.00 -177.60,62.40,1.00,0.00,1.00 -177.60,67.20,1.00,0.00,1.00 -177.60,72.00,1.00,0.00,1.00 -172.80,76.80,1.00,0.00,1.00 -168.00,81.60,1.00,0.00,1.00 -134.40,86.40,1.00,0.00,1.00 -19.20,86.40,1.00,0.00,1.00 -9.60,81.60,1.00,0.00,1.00 -4.80,76.80,1.00,0.00,1.00 -4.80,72.00,1.00,0.00,1.00 -4.80,67.20,1.00,0.00,1.00 -0.00,62.40,1.00,0.00,1.00 -0.00,57.60,1.00,0.00,1.00 -0.00,52.80,1.00,0.00,1.00 -0.00,48.00,1.00,0.00,1.00 -0.00,43.20,1.00,0.00,1.00 -0.00,38.40,1.00,0.00,1.00 -0.00,33.60,1.00,0.00,1.00 -0.00,28.80,1.00,0.00,1.00 -0.00,24.00,1.00,0.00,1.00 -0.00,19.20,1.00,0.00,1.00 -0.00,14.40,1.00,0.00,1.00 -0.00,9.60,1.00,0.00,1.00 -0.00,4.80,1.00,0.00,1.00 +0.00,0.00,0.00,0.00,1.00,0.00,0.00 +4.80,0.00,0.02,0.00,1.00,0.00,-4.80 +9.60,0.00,0.04,0.00,1.00,0.00,4.80 +14.40,0.00,0.06,0.00,1.00,0.00,-9.60 +19.20,0.00,0.09,0.00,1.00,0.00,14.40 +24.00,0.00,0.11,0.00,1.00,0.00,-14.40 +28.80,0.00,0.13,0.00,1.00,0.00,19.20 +33.60,0.00,0.15,0.00,1.00,0.00,-24.00 +38.40,0.00,0.17,0.00,1.00,0.00,24.00 +43.20,0.00,0.19,0.00,1.00,0.00,-28.80 +48.00,0.00,0.21,0.00,1.00,0.00,33.60 +52.80,0.00,0.23,0.00,1.00,0.00,-33.60 +57.60,0.00,0.26,0.00,1.00,0.00,38.40 +62.40,0.00,0.28,0.00,1.00,4.80,-38.40 +67.20,0.00,0.30,0.00,1.00,4.80,38.40 +72.00,0.00,0.32,0.00,1.00,4.80,-43.20 +76.80,0.00,0.34,0.00,1.00,9.60,43.20 +81.60,0.00,0.36,0.00,1.00,19.20,-43.20 +86.40,0.00,0.38,0.00,1.00,134.40,43.20 +91.20,0.00,0.41,0.00,1.00,168.00,-43.20 +96.00,0.00,0.43,0.00,1.00,172.80,43.20 +100.80,0.00,0.45,0.00,1.00,177.60,-43.20 +105.60,0.00,0.47,0.00,1.00,177.60,43.20 +110.40,0.00,0.49,0.00,1.00,177.60,-43.20 +115.20,0.00,0.51,0.00,1.00,177.60,38.40 +120.00,0.00,0.53,0.00,1.00,177.60,-38.40 +124.80,0.00,0.56,0.00,1.00,177.60,33.60 +129.60,0.00,0.58,0.00,1.00,177.60,-33.60 +134.40,0.00,0.60,0.00,1.00,177.60,28.80 +139.20,0.00,0.62,0.00,1.00,177.60,-28.80 +144.00,0.00,0.64,0.00,1.00,177.60,24.00 +148.80,0.00,0.66,0.00,1.00,177.60,-19.20 +153.60,0.00,0.68,0.00,1.00,177.60,19.20 +158.40,0.00,0.70,0.00,1.00,177.60,-14.40 +163.20,0.00,0.73,0.00,1.00,177.60,9.60 +168.00,0.00,0.75,0.00,1.00,177.60,-9.60 +172.80,0.00,0.77,0.00,1.00,177.60,4.80 +177.60,0.00,0.79,0.00,1.00,-177.60,-0.00 +-177.60,0.00,0.81,0.00,1.00,-177.60,-0.00 +-172.80,0.00,0.83,0.00,1.00,-177.60,4.80 +-168.00,0.00,0.85,0.00,1.00,-177.60,-9.60 +-163.20,0.00,0.88,0.00,1.00,-177.60,9.60 +-158.40,0.00,0.90,0.00,1.00,-177.60,-14.40 +-153.60,0.00,0.92,0.00,1.00,-177.60,19.20 +-148.80,0.00,0.94,0.00,1.00,-177.60,-19.20 +-144.00,0.00,0.96,0.00,1.00,-177.60,24.00 +-139.20,0.00,0.98,0.00,1.00,-177.60,-28.80 +-134.40,0.00,1.00,0.00,1.00,-177.60,28.80 +-129.60,0.00,1.03,0.00,1.00,-177.60,-33.60 +-124.80,0.00,1.05,0.00,1.00,-177.60,33.60 +-120.00,0.00,1.07,0.00,1.00,-177.60,-38.40 +-115.20,0.00,1.09,0.00,1.00,-177.60,38.40 +-110.40,0.00,1.11,0.00,1.00,-177.60,-43.20 +-105.60,0.00,1.13,0.00,1.00,-172.80,43.20 +-100.80,0.00,1.15,0.00,1.00,-168.00,-43.20 +-96.00,0.00,1.17,0.00,1.00,-134.40,43.20 +-91.20,0.00,1.20,0.00,1.00,-19.20,-43.20 +-86.40,0.00,1.22,0.00,1.00,-9.60,43.20 +-81.60,0.00,1.24,0.00,1.00,-4.80,-43.20 +-76.80,0.00,1.26,0.00,1.00,-4.80,43.20 +-72.00,0.00,1.28,0.00,1.00,-4.80,-43.20 +-67.20,0.00,1.30,0.00,1.00,-0.00,38.40 +-62.40,0.00,1.32,0.00,1.00,-0.00,-38.40 +-57.60,0.00,1.35,0.00,1.00,-0.00,38.40 +-52.80,0.00,1.37,0.00,1.00,-0.00,-33.60 +-48.00,0.00,1.39,0.00,1.00,-0.00,33.60 +-43.20,0.00,1.41,0.00,1.00,-0.00,-28.80 +-38.40,0.00,1.43,0.00,1.00,-0.00,24.00 +-33.60,0.00,1.45,0.00,1.00,-0.00,-24.00 +-28.80,0.00,1.47,0.00,1.00,-0.00,19.20 +-24.00,0.00,1.50,0.00,1.00,-0.00,-14.40 +-19.20,0.00,1.52,0.00,1.00,-0.00,14.40 +-14.40,0.00,1.54,0.00,1.00,-0.00,-9.60 +-9.60,0.00,1.56,0.00,1.00,-0.00,4.80 +-4.80,0.00,1.58,0.00,1.00,-0.00,-4.80 +0.00,0.00,1.60,0.00,1.00,-0.00,0.00 +4.80,-0.00,1.62,0.00,1.00,-0.00,-4.80 +9.60,-0.00,1.64,0.00,1.00,-0.00,4.80 +14.40,-0.00,1.67,0.00,1.00,-0.00,-9.60 +19.20,-0.00,1.69,0.00,1.00,-0.00,14.40 +24.00,-0.00,1.71,0.00,1.00,-0.00,-14.40 +28.80,-0.00,1.73,0.00,1.00,-0.00,19.20 +33.60,-4.80,1.75,0.00,1.00,-4.80,-19.20 +38.40,-4.80,1.77,0.00,1.00,-4.80,24.00 +43.20,-4.80,1.79,0.00,1.00,-4.80,-24.00 +48.00,-4.80,1.82,0.00,1.00,-4.80,28.80 +52.80,-4.80,1.84,0.00,1.00,-4.80,-28.80 +57.60,-4.80,1.86,0.00,1.00,-4.80,33.60 +62.40,-4.80,1.88,0.00,1.00,-9.60,-33.60 +67.20,-4.80,1.90,0.00,1.00,-9.60,38.40 +72.00,-4.80,1.92,0.00,1.00,-14.40,-38.40 +76.80,-4.80,1.94,0.00,1.00,-24.00,38.40 +81.60,-4.80,1.97,0.00,1.00,-43.20,-38.40 +86.40,-4.80,1.99,0.00,1.00,-110.40,38.40 +91.20,-4.80,2.01,0.00,1.00,-148.80,-38.40 +96.00,-4.80,2.03,0.00,1.00,-163.20,38.40 +100.80,-4.80,2.05,0.00,1.00,-168.00,-38.40 +105.60,-4.80,2.07,0.00,1.00,-172.80,38.40 +110.40,-4.80,2.09,0.00,1.00,-172.80,-38.40 +115.20,-4.80,2.11,0.00,1.00,-172.80,33.60 +120.00,-4.80,2.14,0.00,1.00,-172.80,-33.60 +124.80,-4.80,2.16,0.00,1.00,-177.60,33.60 +129.60,-4.80,2.18,0.00,1.00,-177.60,-28.80 +134.40,-4.80,2.20,0.00,1.00,-177.60,28.80 +139.20,-4.80,2.22,0.00,1.00,-177.60,-24.00 +144.00,-4.80,2.24,0.00,1.00,-177.60,24.00 +148.80,-4.80,2.26,0.00,1.00,-177.60,-19.20 +153.60,-0.00,2.29,0.00,1.00,-177.60,14.40 +158.40,-0.00,2.31,0.00,1.00,-177.60,-14.40 +163.20,-0.00,2.33,0.00,1.00,-177.60,9.60 +168.00,-0.00,2.35,0.00,1.00,-177.60,-9.60 +172.80,-0.00,2.37,0.00,1.00,-177.60,4.80 +177.60,-0.00,2.39,0.00,1.00,177.60,-0.00 +-177.60,0.00,2.41,0.00,1.00,177.60,-0.00 +-172.80,0.00,2.44,0.00,1.00,177.60,4.80 +-168.00,0.00,2.46,0.00,1.00,177.60,-9.60 +-163.20,0.00,2.48,0.00,1.00,177.60,9.60 +-158.40,0.00,2.50,0.00,1.00,177.60,-14.40 +-153.60,0.00,2.52,0.00,1.00,177.60,14.40 +-148.80,4.80,2.54,0.00,1.00,177.60,-19.20 +-144.00,4.80,2.56,0.00,1.00,177.60,24.00 +-139.20,4.80,2.58,0.00,1.00,177.60,-24.00 +-134.40,4.80,2.61,0.00,1.00,177.60,28.80 +-129.60,4.80,2.63,0.00,1.00,172.80,-28.80 +-124.80,4.80,2.65,0.00,1.00,172.80,33.60 +-120.00,4.80,2.67,0.00,1.00,172.80,-33.60 +-115.20,4.80,2.69,0.00,1.00,172.80,33.60 +-110.40,4.80,2.71,0.00,1.00,168.00,-38.40 +-105.60,4.80,2.73,0.00,1.00,163.20,38.40 +-100.80,4.80,2.76,0.00,1.00,148.80,-38.40 +-96.00,4.80,2.78,0.00,1.00,110.40,38.40 +-91.20,4.80,2.80,0.00,1.00,43.20,-38.40 +-86.40,4.80,2.82,0.00,1.00,24.00,38.40 +-81.60,4.80,2.84,0.00,1.00,14.40,-38.40 +-76.80,4.80,2.86,0.00,1.00,9.60,38.40 +-72.00,4.80,2.88,0.00,1.00,9.60,-38.40 +-67.20,4.80,2.91,0.00,1.00,4.80,38.40 +-62.40,4.80,2.93,0.00,1.00,4.80,-33.60 +-57.60,4.80,2.95,0.00,1.00,4.80,33.60 +-52.80,4.80,2.97,0.00,1.00,4.80,-28.80 +-48.00,4.80,2.99,0.00,1.00,4.80,28.80 +-43.20,4.80,3.01,0.00,1.00,4.80,-24.00 +-38.40,4.80,3.03,0.00,1.00,0.00,24.00 +-33.60,4.80,3.05,0.00,1.00,0.00,-19.20 +-28.80,0.00,3.08,0.00,1.00,0.00,19.20 +-24.00,0.00,3.10,0.00,1.00,0.00,-14.40 +-19.20,0.00,3.12,0.00,1.00,0.00,14.40 +-14.40,0.00,3.14,0.00,1.00,0.00,-9.60 +-9.60,0.00,3.16,0.00,1.00,0.00,4.80 +-4.80,0.00,3.18,0.00,1.00,0.00,-4.80 +0.00,0.00,3.20,0.00,1.00,-0.00,0.00 +4.80,-0.00,3.23,0.00,1.00,-0.00,-4.80 +9.60,-0.00,3.25,0.00,1.00,-0.00,4.80 +14.40,-0.00,3.27,0.00,1.00,-4.80,-9.60 +19.20,-4.80,3.29,0.00,1.00,-4.80,9.60 +24.00,-4.80,3.31,0.00,1.00,-4.80,-14.40 +28.80,-4.80,3.33,0.00,1.00,-4.80,14.40 +33.60,-4.80,3.35,0.00,1.00,-4.80,-19.20 +38.40,-4.80,3.38,0.00,1.00,-9.60,19.20 +43.20,-4.80,3.40,0.00,1.00,-9.60,-24.00 +48.00,-4.80,3.42,0.00,1.00,-9.60,24.00 +52.80,-9.60,3.44,0.00,1.00,-14.40,-28.80 +57.60,-9.60,3.46,0.00,1.00,-14.40,28.80 +62.40,-9.60,3.48,0.00,1.00,-19.20,-28.80 +67.20,-9.60,3.50,0.00,1.00,-24.00,33.60 +72.00,-9.60,3.52,0.00,1.00,-33.60,-33.60 +76.80,-9.60,3.55,0.00,1.00,-43.20,33.60 +81.60,-9.60,3.57,0.00,1.00,-67.20,-33.60 +86.40,-9.60,3.59,0.00,1.00,-96.00,33.60 +91.20,-9.60,3.61,0.00,1.00,-124.80,-33.60 +96.00,-9.60,3.63,0.00,1.00,-144.00,33.60 +100.80,-9.60,3.65,0.00,1.00,-153.60,-33.60 +105.60,-9.60,3.67,0.00,1.00,-158.40,33.60 +110.40,-9.60,3.70,0.00,1.00,-163.20,-33.60 +115.20,-9.60,3.72,0.00,1.00,-168.00,33.60 +120.00,-9.60,3.74,0.00,1.00,-168.00,-28.80 +124.80,-9.60,3.76,0.00,1.00,-168.00,28.80 +129.60,-9.60,3.78,0.00,1.00,-172.80,-28.80 +134.40,-4.80,3.80,0.00,1.00,-172.80,24.00 +139.20,-4.80,3.82,0.00,1.00,-172.80,-24.00 +144.00,-4.80,3.85,0.00,1.00,-172.80,19.20 +148.80,-4.80,3.87,0.00,1.00,-177.60,-19.20 +153.60,-4.80,3.89,0.00,1.00,-177.60,14.40 +158.40,-4.80,3.91,0.00,1.00,-177.60,-14.40 +163.20,-4.80,3.93,0.00,1.00,-177.60,9.60 +168.00,-0.00,3.95,0.00,1.00,-177.60,-4.80 +172.80,-0.00,3.97,0.00,1.00,-177.60,4.80 +177.60,-0.00,3.99,0.00,1.00,177.60,-0.00 +-177.60,0.00,4.02,0.00,1.00,177.60,-0.00 +-172.80,0.00,4.04,0.00,1.00,177.60,4.80 +-168.00,0.00,4.06,0.00,1.00,177.60,-4.80 +-163.20,4.80,4.08,0.00,1.00,177.60,9.60 +-158.40,4.80,4.10,0.00,1.00,177.60,-14.40 +-153.60,4.80,4.12,0.00,1.00,172.80,14.40 +-148.80,4.80,4.14,0.00,1.00,172.80,-19.20 +-144.00,4.80,4.17,0.00,1.00,172.80,19.20 +-139.20,4.80,4.19,0.00,1.00,172.80,-24.00 +-134.40,4.80,4.21,0.00,1.00,168.00,24.00 +-129.60,9.60,4.23,0.00,1.00,168.00,-28.80 +-124.80,9.60,4.25,0.00,1.00,168.00,28.80 +-120.00,9.60,4.27,0.00,1.00,163.20,-28.80 +-115.20,9.60,4.29,0.00,1.00,158.40,33.60 +-110.40,9.60,4.32,0.00,1.00,153.60,-33.60 +-105.60,9.60,4.34,0.00,1.00,144.00,33.60 +-100.80,9.60,4.36,0.00,1.00,124.80,-33.60 +-96.00,9.60,4.38,0.00,1.00,96.00,33.60 +-91.20,9.60,4.40,0.00,1.00,67.20,-33.60 +-86.40,9.60,4.42,0.00,1.00,43.20,33.60 +-81.60,9.60,4.44,0.00,1.00,33.60,-33.60 +-76.80,9.60,4.46,0.00,1.00,24.00,33.60 +-72.00,9.60,4.49,0.00,1.00,19.20,-33.60 +-67.20,9.60,4.51,0.00,1.00,14.40,33.60 +-62.40,9.60,4.53,0.00,1.00,14.40,-28.80 +-57.60,9.60,4.55,0.00,1.00,9.60,28.80 +-52.80,9.60,4.57,0.00,1.00,9.60,-28.80 +-48.00,4.80,4.59,0.00,1.00,9.60,24.00 +-43.20,4.80,4.61,0.00,1.00,4.80,-24.00 +-38.40,4.80,4.64,0.00,1.00,4.80,19.20 +-33.60,4.80,4.66,0.00,1.00,4.80,-19.20 +-28.80,4.80,4.68,0.00,1.00,4.80,14.40 +-24.00,4.80,4.70,0.00,1.00,4.80,-14.40 +-19.20,4.80,4.72,0.00,1.00,0.00,9.60 +-14.40,0.00,4.74,0.00,1.00,0.00,-9.60 +-9.60,0.00,4.76,0.00,1.00,0.00,4.80 +-4.80,0.00,4.79,0.00,1.00,0.00,-4.80 +0.00,0.00,4.81,0.00,1.00,-0.00,0.00 +4.80,-0.00,4.83,0.00,1.00,-0.00,-4.80 +9.60,-0.00,4.85,0.00,1.00,-4.80,4.80 +14.40,-4.80,4.87,0.00,1.00,-4.80,-9.60 +19.20,-4.80,4.89,0.00,1.00,-4.80,9.60 +24.00,-4.80,4.91,0.00,1.00,-4.80,-9.60 +28.80,-4.80,4.93,0.00,1.00,-9.60,14.40 +33.60,-9.60,4.96,0.00,1.00,-9.60,-14.40 +38.40,-9.60,4.98,0.00,1.00,-14.40,19.20 +43.20,-9.60,5.00,0.00,1.00,-14.40,-19.20 +48.00,-9.60,5.02,0.00,1.00,-14.40,24.00 +52.80,-9.60,5.04,0.00,1.00,-19.20,-24.00 +57.60,-14.40,5.06,0.00,1.00,-24.00,24.00 +62.40,-14.40,5.08,0.00,1.00,-28.80,-28.80 +67.20,-14.40,5.11,0.00,1.00,-33.60,28.80 +72.00,-14.40,5.13,0.00,1.00,-43.20,-28.80 +76.80,-14.40,5.15,0.00,1.00,-57.60,28.80 +81.60,-14.40,5.17,0.00,1.00,-76.80,-28.80 +86.40,-14.40,5.19,0.00,1.00,-96.00,28.80 +91.20,-14.40,5.21,0.00,1.00,-115.20,-28.80 +96.00,-14.40,5.23,0.00,1.00,-129.60,28.80 +100.80,-14.40,5.26,0.00,1.00,-139.20,-28.80 +105.60,-14.40,5.28,0.00,1.00,-148.80,28.80 +110.40,-14.40,5.30,0.00,1.00,-153.60,-28.80 +115.20,-14.40,5.32,0.00,1.00,-158.40,28.80 +120.00,-14.40,5.34,0.00,1.00,-163.20,-24.00 +124.80,-9.60,5.36,0.00,1.00,-163.20,24.00 +129.60,-9.60,5.38,0.00,1.00,-168.00,-24.00 +134.40,-9.60,5.40,0.00,1.00,-168.00,19.20 +139.20,-9.60,5.43,0.00,1.00,-172.80,-19.20 +144.00,-9.60,5.45,0.00,1.00,-172.80,19.20 +148.80,-9.60,5.47,0.00,1.00,-172.80,-14.40 +153.60,-4.80,5.49,0.00,1.00,-172.80,14.40 +158.40,-4.80,5.51,0.00,1.00,-177.60,-9.60 +163.20,-4.80,5.53,0.00,1.00,-177.60,9.60 +168.00,-4.80,5.55,0.00,1.00,-177.60,-4.80 +172.80,-0.00,5.58,0.00,1.00,-177.60,4.80 +177.60,-0.00,5.60,0.00,1.00,177.60,-0.00 +-177.60,0.00,5.62,0.00,1.00,177.60,-0.00 +-172.80,0.00,5.64,0.00,1.00,177.60,4.80 +-168.00,4.80,5.66,0.00,1.00,177.60,-4.80 +-163.20,4.80,5.68,0.00,1.00,172.80,9.60 +-158.40,4.80,5.70,0.00,1.00,172.80,-9.60 +-153.60,4.80,5.72,0.00,1.00,172.80,14.40 +-148.80,9.60,5.75,0.00,1.00,172.80,-14.40 +-144.00,9.60,5.77,0.00,1.00,168.00,19.20 +-139.20,9.60,5.79,0.00,1.00,168.00,-19.20 +-134.40,9.60,5.81,0.00,1.00,163.20,19.20 +-129.60,9.60,5.83,0.00,1.00,163.20,-24.00 +-124.80,9.60,5.85,0.00,1.00,158.40,24.00 +-120.00,14.40,5.87,0.00,1.00,153.60,-24.00 +-115.20,14.40,5.90,0.00,1.00,148.80,28.80 +-110.40,14.40,5.92,0.00,1.00,139.20,-28.80 +-105.60,14.40,5.94,0.00,1.00,129.60,28.80 +-100.80,14.40,5.96,0.00,1.00,115.20,-28.80 +-96.00,14.40,5.98,0.00,1.00,96.00,28.80 +-91.20,14.40,6.00,0.00,1.00,76.80,-28.80 +-86.40,14.40,6.02,0.00,1.00,57.60,28.80 +-81.60,14.40,6.05,0.00,1.00,43.20,-28.80 +-76.80,14.40,6.07,0.00,1.00,33.60,28.80 +-72.00,14.40,6.09,0.00,1.00,28.80,-28.80 +-67.20,14.40,6.11,0.00,1.00,24.00,28.80 +-62.40,14.40,6.13,0.00,1.00,19.20,-28.80 +-57.60,14.40,6.15,0.00,1.00,14.40,24.00 +-52.80,9.60,6.17,0.00,1.00,14.40,-24.00 +-48.00,9.60,6.19,0.00,1.00,14.40,24.00 +-43.20,9.60,6.22,0.00,1.00,9.60,-19.20 +-38.40,9.60,6.24,0.00,1.00,9.60,19.20 +-33.60,9.60,6.26,0.00,1.00,4.80,-14.40 +-28.80,4.80,6.28,0.00,1.00,4.80,14.40 +-24.00,4.80,6.30,0.00,1.00,4.80,-9.60 +-19.20,4.80,6.32,0.00,1.00,4.80,9.60 +-14.40,4.80,6.34,0.00,1.00,0.00,-9.60 +-9.60,0.00,6.37,0.00,1.00,0.00,4.80 +-4.80,0.00,6.39,0.00,1.00,0.00,-4.80 +0.00,0.00,6.41,0.00,1.00,-0.00,0.00 +4.80,-0.00,6.43,0.00,1.00,-4.80,-0.00 +9.60,-4.80,6.45,0.00,1.00,-4.80,4.80 +14.40,-4.80,6.47,0.00,1.00,-4.80,-4.80 +19.20,-4.80,6.49,0.00,1.00,-9.60,9.60 +24.00,-9.60,6.52,0.00,1.00,-9.60,-9.60 +28.80,-9.60,6.54,0.00,1.00,-9.60,14.40 +33.60,-9.60,6.56,0.00,1.00,-14.40,-14.40 +38.40,-9.60,6.58,0.00,1.00,-14.40,14.40 +43.20,-14.40,6.60,0.00,1.00,-19.20,-19.20 +48.00,-14.40,6.62,0.00,1.00,-24.00,19.20 +52.80,-14.40,6.64,0.00,1.00,-24.00,-19.20 +57.60,-14.40,6.66,0.00,1.00,-28.80,19.20 +62.40,-19.20,6.69,0.00,1.00,-38.40,-24.00 +67.20,-19.20,6.71,0.00,1.00,-43.20,24.00 +72.00,-19.20,6.73,0.00,1.00,-52.80,-24.00 +76.80,-19.20,6.75,0.00,1.00,-62.40,24.00 +81.60,-19.20,6.77,0.00,1.00,-76.80,-24.00 +86.40,-19.20,6.79,0.00,1.00,-96.00,24.00 +91.20,-19.20,6.81,0.00,1.00,-110.40,-24.00 +96.00,-19.20,6.84,0.00,1.00,-120.00,24.00 +100.80,-19.20,6.86,0.00,1.00,-134.40,-24.00 +105.60,-19.20,6.88,0.00,1.00,-139.20,24.00 +110.40,-19.20,6.90,0.00,1.00,-148.80,-24.00 +115.20,-19.20,6.92,0.00,1.00,-153.60,24.00 +120.00,-14.40,6.94,0.00,1.00,-158.40,-24.00 +124.80,-14.40,6.96,0.00,1.00,-158.40,19.20 +129.60,-14.40,6.99,0.00,1.00,-163.20,-19.20 +134.40,-14.40,7.01,0.00,1.00,-163.20,19.20 +139.20,-14.40,7.03,0.00,1.00,-168.00,-14.40 +144.00,-9.60,7.05,0.00,1.00,-168.00,14.40 +148.80,-9.60,7.07,0.00,1.00,-172.80,-14.40 +153.60,-9.60,7.09,0.00,1.00,-172.80,9.60 +158.40,-4.80,7.11,0.00,1.00,-172.80,-9.60 +163.20,-4.80,7.13,0.00,1.00,-177.60,9.60 +168.00,-4.80,7.16,0.00,1.00,-177.60,-4.80 +172.80,-0.00,7.18,0.00,1.00,-177.60,4.80 +177.60,-0.00,7.20,0.00,1.00,177.60,-0.00 +-177.60,0.00,7.22,0.00,1.00,177.60,-0.00 +-172.80,0.00,7.24,0.00,1.00,177.60,4.80 +-168.00,4.80,7.26,0.00,1.00,172.80,-4.80 +-163.20,4.80,7.28,0.00,1.00,172.80,9.60 +-158.40,4.80,7.31,0.00,1.00,172.80,-9.60 +-153.60,9.60,7.33,0.00,1.00,168.00,9.60 +-148.80,9.60,7.35,0.00,1.00,168.00,-14.40 +-144.00,9.60,7.37,0.00,1.00,163.20,14.40 +-139.20,14.40,7.39,0.00,1.00,163.20,-14.40 +-134.40,14.40,7.41,0.00,1.00,158.40,19.20 +-129.60,14.40,7.43,0.00,1.00,158.40,-19.20 +-124.80,14.40,7.46,0.00,1.00,153.60,19.20 +-120.00,14.40,7.48,0.00,1.00,148.80,-24.00 +-115.20,19.20,7.50,0.00,1.00,139.20,24.00 +-110.40,19.20,7.52,0.00,1.00,134.40,-24.00 +-105.60,19.20,7.54,0.00,1.00,120.00,24.00 +-100.80,19.20,7.56,0.00,1.00,110.40,-24.00 +-96.00,19.20,7.58,0.00,1.00,96.00,24.00 +-91.20,19.20,7.60,0.00,1.00,76.80,-24.00 +-86.40,19.20,7.63,0.00,1.00,62.40,24.00 +-81.60,19.20,7.65,0.00,1.00,52.80,-24.00 +-76.80,19.20,7.67,0.00,1.00,43.20,24.00 +-72.00,19.20,7.69,0.00,1.00,38.40,-24.00 +-67.20,19.20,7.71,0.00,1.00,28.80,24.00 +-62.40,19.20,7.73,0.00,1.00,24.00,-24.00 +-57.60,14.40,7.75,0.00,1.00,24.00,19.20 +-52.80,14.40,7.78,0.00,1.00,19.20,-19.20 +-48.00,14.40,7.80,0.00,1.00,14.40,19.20 +-43.20,14.40,7.82,0.00,1.00,14.40,-19.20 +-38.40,9.60,7.84,0.00,1.00,9.60,14.40 +-33.60,9.60,7.86,0.00,1.00,9.60,-14.40 +-28.80,9.60,7.88,0.00,1.00,9.60,14.40 +-24.00,9.60,7.90,0.00,1.00,4.80,-9.60 +-19.20,4.80,7.93,0.00,1.00,4.80,9.60 +-14.40,4.80,7.95,0.00,1.00,4.80,-4.80 +-9.60,4.80,7.97,0.00,1.00,0.00,4.80 +-4.80,0.00,7.99,0.00,1.00,0.00,-0.00 +0.00,0.00,8.01,0.00,1.00,-0.00,0.00 +4.80,-0.00,8.03,0.00,1.00,-4.80,-0.00 +9.60,-4.80,8.05,0.00,1.00,-4.80,4.80 +14.40,-4.80,8.07,0.00,1.00,-9.60,-4.80 +19.20,-9.60,8.10,0.00,1.00,-9.60,4.80 +24.00,-9.60,8.12,0.00,1.00,-14.40,-9.60 +28.80,-9.60,8.14,0.00,1.00,-14.40,9.60 +33.60,-14.40,8.16,0.00,1.00,-19.20,-9.60 +33.60,-14.40,8.18,0.00,1.00,-19.20,14.40 +38.40,-14.40,8.20,0.00,1.00,-24.00,-14.40 +43.20,-19.20,8.22,0.00,1.00,-28.80,14.40 +48.00,-19.20,8.25,0.00,1.00,-33.60,-14.40 +57.60,-19.20,8.27,0.00,1.00,-38.40,19.20 +62.40,-19.20,8.29,0.00,1.00,-43.20,-19.20 +67.20,-24.00,8.31,0.00,1.00,-48.00,19.20 +72.00,-24.00,8.33,0.00,1.00,-57.60,-19.20 +76.80,-24.00,8.35,0.00,1.00,-67.20,19.20 +81.60,-24.00,8.37,0.00,1.00,-81.60,-19.20 +86.40,-24.00,8.40,0.00,1.00,-91.20,19.20 +91.20,-24.00,8.42,0.00,1.00,-105.60,-19.20 +96.00,-24.00,8.44,0.00,1.00,-115.20,19.20 +100.80,-24.00,8.46,0.00,1.00,-124.80,-19.20 +105.60,-24.00,8.48,0.00,1.00,-134.40,19.20 +110.40,-24.00,8.50,0.00,1.00,-139.20,-19.20 +115.20,-19.20,8.52,0.00,1.00,-144.00,19.20 +120.00,-19.20,8.54,0.00,1.00,-148.80,-19.20 +129.60,-19.20,8.57,0.00,1.00,-153.60,19.20 +134.40,-19.20,8.59,0.00,1.00,-158.40,-14.40 +139.20,-19.20,8.61,0.00,1.00,-163.20,14.40 +144.00,-14.40,8.63,0.00,1.00,-163.20,-14.40 +148.80,-14.40,8.65,0.00,1.00,-168.00,14.40 +148.80,-14.40,8.67,0.00,1.00,-168.00,-9.60 +153.60,-9.60,8.69,0.00,1.00,-172.80,9.60 +158.40,-9.60,8.72,0.00,1.00,-172.80,-9.60 +163.20,-4.80,8.74,0.00,1.00,-177.60,4.80 +168.00,-4.80,8.76,0.00,1.00,-177.60,-4.80 +172.80,-4.80,8.78,0.00,1.00,-177.60,4.80 +177.60,-0.00,8.80,0.00,1.00,177.60,-0.00 +-177.60,0.00,8.82,0.00,1.00,177.60,-0.00 +-172.80,4.80,8.84,0.00,1.00,177.60,4.80 +-168.00,4.80,8.87,0.00,1.00,172.80,-4.80 +-163.20,4.80,8.89,0.00,1.00,172.80,4.80 +-158.40,9.60,8.91,0.00,1.00,168.00,-9.60 +-153.60,9.60,8.93,0.00,1.00,168.00,9.60 +-148.80,14.40,8.95,0.00,1.00,163.20,-9.60 +-148.80,14.40,8.97,0.00,1.00,163.20,14.40 +-144.00,14.40,8.99,0.00,1.00,158.40,-14.40 +-139.20,19.20,9.01,0.00,1.00,153.60,14.40 +-134.40,19.20,9.04,0.00,1.00,148.80,-14.40 +-129.60,19.20,9.06,0.00,1.00,144.00,19.20 +-120.00,19.20,9.08,0.00,1.00,139.20,-19.20 +-115.20,19.20,9.10,0.00,1.00,134.40,19.20 +-110.40,24.00,9.12,0.00,1.00,124.80,-19.20 +-105.60,24.00,9.14,0.00,1.00,115.20,19.20 +-100.80,24.00,9.16,0.00,1.00,105.60,-19.20 +-96.00,24.00,9.19,0.00,1.00,91.20,19.20 +-91.20,24.00,9.21,0.00,1.00,81.60,-19.20 +-86.40,24.00,9.23,0.00,1.00,67.20,19.20 +-81.60,24.00,9.25,0.00,1.00,57.60,-19.20 +-76.80,24.00,9.27,0.00,1.00,48.00,19.20 +-72.00,24.00,9.29,0.00,1.00,43.20,-19.20 +-67.20,24.00,9.31,0.00,1.00,38.40,19.20 +-62.40,19.20,9.34,0.00,1.00,33.60,-19.20 +-57.60,19.20,9.36,0.00,1.00,28.80,19.20 +-48.00,19.20,9.38,0.00,1.00,24.00,-14.40 +-43.20,19.20,9.40,0.00,1.00,19.20,14.40 +-38.40,14.40,9.42,0.00,1.00,19.20,-14.40 +-33.60,14.40,9.44,0.00,1.00,14.40,14.40 +-33.60,14.40,9.46,0.00,1.00,14.40,-9.60 +-28.80,9.60,9.48,0.00,1.00,9.60,9.60 +-24.00,9.60,9.51,0.00,1.00,9.60,-9.60 +-19.20,9.60,9.53,0.00,1.00,4.80,4.80 +-14.40,4.80,9.55,0.00,1.00,4.80,-4.80 +-9.60,4.80,9.57,0.00,1.00,0.00,4.80 +-4.80,0.00,9.59,0.00,1.00,0.00,-0.00 +0.00,0.00,9.61,0.00,1.00,-0.00,0.00 +4.80,-0.00,9.63,0.00,1.00,-4.80,-0.00 +9.60,-4.80,9.66,0.00,1.00,-4.80,4.80 +14.40,-4.80,9.68,0.00,1.00,-9.60,-4.80 +19.20,-9.60,9.70,0.00,1.00,-9.60,4.80 +19.20,-9.60,9.72,0.00,1.00,-14.40,-4.80 +24.00,-14.40,9.74,0.00,1.00,-19.20,9.60 +28.80,-14.40,9.76,0.00,1.00,-19.20,-9.60 +33.60,-19.20,9.78,0.00,1.00,-24.00,9.60 +38.40,-19.20,9.81,0.00,1.00,-28.80,-9.60 +43.20,-19.20,9.83,0.00,1.00,-33.60,9.60 +48.00,-24.00,9.85,0.00,1.00,-38.40,-14.40 +52.80,-24.00,9.87,0.00,1.00,-43.20,14.40 +57.60,-24.00,9.89,0.00,1.00,-48.00,-14.40 +62.40,-24.00,9.91,0.00,1.00,-52.80,14.40 +72.00,-28.80,9.93,0.00,1.00,-62.40,-14.40 +76.80,-28.80,9.95,0.00,1.00,-72.00,14.40 +81.60,-28.80,9.98,0.00,1.00,-81.60,-14.40 +86.40,-28.80,10.00,0.00,1.00,-91.20,14.40 +91.20,-28.80,10.02,0.00,1.00,-100.80,-14.40 +96.00,-28.80,10.04,0.00,1.00,-110.40,14.40 +100.80,-28.80,10.06,0.00,1.00,-120.00,-14.40 +105.60,-28.80,10.08,0.00,1.00,-129.60,14.40 +115.20,-28.80,10.10,0.00,1.00,-134.40,-14.40 +120.00,-24.00,10.13,0.00,1.00,-139.20,14.40 +124.80,-24.00,10.15,0.00,1.00,-144.00,-14.40 +129.60,-24.00,10.17,0.00,1.00,-148.80,14.40 +134.40,-24.00,10.19,0.00,1.00,-153.60,-14.40 +139.20,-19.20,10.21,0.00,1.00,-158.40,9.60 +144.00,-19.20,10.23,0.00,1.00,-163.20,-9.60 +148.80,-14.40,10.25,0.00,1.00,-163.20,9.60 +153.60,-14.40,10.28,0.00,1.00,-168.00,-9.60 +158.40,-14.40,10.30,0.00,1.00,-168.00,4.80 +163.20,-9.60,10.32,0.00,1.00,-172.80,-4.80 +163.20,-9.60,10.34,0.00,1.00,-172.80,4.80 +168.00,-4.80,10.36,0.00,1.00,-177.60,-4.80 +172.80,-4.80,10.38,0.00,1.00,-177.60,0.00 +177.60,-0.00,10.40,0.00,1.00,177.60,-0.00 +-177.60,0.00,10.42,0.00,1.00,177.60,-0.00 +-172.80,4.80,10.45,0.00,1.00,172.80,0.00 +-168.00,4.80,10.47,0.00,1.00,172.80,-4.80 +-163.20,9.60,10.49,0.00,1.00,168.00,4.80 +-163.20,9.60,10.51,0.00,1.00,168.00,-4.80 +-158.40,14.40,10.53,0.00,1.00,163.20,4.80 +-153.60,14.40,10.55,0.00,1.00,163.20,-9.60 +-148.80,14.40,10.57,0.00,1.00,158.40,9.60 +-144.00,19.20,10.60,0.00,1.00,153.60,-9.60 +-139.20,19.20,10.62,0.00,1.00,148.80,9.60 +-134.40,24.00,10.64,0.00,1.00,144.00,-14.40 +-129.60,24.00,10.66,0.00,1.00,139.20,14.40 +-124.80,24.00,10.68,0.00,1.00,134.40,-14.40 +-120.00,24.00,10.70,0.00,1.00,129.60,14.40 +-115.20,28.80,10.72,0.00,1.00,120.00,-14.40 +-105.60,28.80,10.74,0.00,1.00,110.40,14.40 +-100.80,28.80,10.77,0.00,1.00,100.80,-14.40 +-96.00,28.80,10.79,0.00,1.00,91.20,14.40 +-91.20,28.80,10.81,0.00,1.00,81.60,-14.40 +-86.40,28.80,10.83,0.00,1.00,72.00,14.40 +-81.60,28.80,10.85,0.00,1.00,62.40,-14.40 +-76.80,28.80,10.87,0.00,1.00,52.80,14.40 +-72.00,28.80,10.89,0.00,1.00,48.00,-14.40 +-62.40,24.00,10.92,0.00,1.00,43.20,14.40 +-57.60,24.00,10.94,0.00,1.00,38.40,-14.40 +-52.80,24.00,10.96,0.00,1.00,33.60,14.40 +-48.00,24.00,10.98,0.00,1.00,28.80,-14.40 +-43.20,19.20,11.00,0.00,1.00,24.00,9.60 +-38.40,19.20,11.02,0.00,1.00,19.20,-9.60 +-33.60,19.20,11.04,0.00,1.00,19.20,9.60 +-28.80,14.40,11.07,0.00,1.00,14.40,-9.60 +-24.00,14.40,11.09,0.00,1.00,9.60,9.60 +-19.20,9.60,11.11,0.00,1.00,9.60,-4.80 +-19.20,9.60,11.13,0.00,1.00,4.80,4.80 +-14.40,4.80,11.15,0.00,1.00,4.80,-4.80 +-9.60,4.80,11.17,0.00,1.00,0.00,4.80 +-4.80,0.00,11.19,0.00,1.00,0.00,-0.00 +0.00,0.00,11.21,0.00,1.00,-4.80,0.00 +4.80,-4.80,11.24,0.00,1.00,-4.80,-0.00 +9.60,-4.80,11.26,0.00,1.00,-9.60,0.00 +14.40,-9.60,11.28,0.00,1.00,-9.60,-4.80 +14.40,-9.60,11.30,0.00,1.00,-14.40,4.80 +19.20,-14.40,11.32,0.00,1.00,-14.40,-4.80 +24.00,-14.40,11.34,0.00,1.00,-19.20,4.80 +28.80,-19.20,11.36,0.00,1.00,-24.00,-4.80 +33.60,-19.20,11.39,0.00,1.00,-28.80,4.80 +38.40,-24.00,11.41,0.00,1.00,-28.80,-9.60 +43.20,-24.00,11.43,0.00,1.00,-33.60,9.60 +48.00,-24.00,11.45,0.00,1.00,-38.40,-9.60 +52.80,-28.80,11.47,0.00,1.00,-48.00,9.60 +57.60,-28.80,11.49,0.00,1.00,-52.80,-9.60 +62.40,-28.80,11.51,0.00,1.00,-57.60,9.60 +67.20,-33.60,11.54,0.00,1.00,-67.20,-9.60 +72.00,-33.60,11.56,0.00,1.00,-76.80,9.60 +81.60,-33.60,11.58,0.00,1.00,-81.60,-9.60 +86.40,-33.60,11.60,0.00,1.00,-91.20,9.60 +91.20,-33.60,11.62,0.00,1.00,-100.80,-9.60 +96.00,-33.60,11.64,0.00,1.00,-110.40,9.60 +100.80,-33.60,11.66,0.00,1.00,-115.20,-9.60 +110.40,-33.60,11.68,0.00,1.00,-124.80,9.60 +115.20,-33.60,11.71,0.00,1.00,-129.60,-9.60 +120.00,-28.80,11.73,0.00,1.00,-139.20,9.60 +124.80,-28.80,11.75,0.00,1.00,-144.00,-9.60 +129.60,-28.80,11.77,0.00,1.00,-148.80,9.60 +134.40,-24.00,11.79,0.00,1.00,-153.60,-9.60 +139.20,-24.00,11.81,0.00,1.00,-153.60,9.60 +144.00,-19.20,11.83,0.00,1.00,-158.40,-9.60 +148.80,-19.20,11.86,0.00,1.00,-163.20,4.80 +153.60,-14.40,11.88,0.00,1.00,-163.20,-4.80 +158.40,-14.40,11.90,0.00,1.00,-168.00,4.80 +163.20,-9.60,11.92,0.00,1.00,-172.80,-4.80 +168.00,-9.60,11.94,0.00,1.00,-172.80,4.80 +168.00,-4.80,11.96,0.00,1.00,-177.60,-0.00 +172.80,-4.80,11.98,0.00,1.00,-177.60,0.00 +177.60,-0.00,12.01,0.00,1.00,177.60,-0.00 +-177.60,0.00,12.03,0.00,1.00,177.60,-0.00 +-172.80,4.80,12.05,0.00,1.00,172.80,0.00 +-168.00,4.80,12.07,0.00,1.00,172.80,-0.00 +-168.00,9.60,12.09,0.00,1.00,168.00,4.80 +-163.20,9.60,12.11,0.00,1.00,163.20,-4.80 +-158.40,14.40,12.13,0.00,1.00,163.20,4.80 +-153.60,14.40,12.15,0.00,1.00,158.40,-4.80 +-148.80,19.20,12.18,0.00,1.00,153.60,4.80 +-144.00,19.20,12.20,0.00,1.00,153.60,-9.60 +-139.20,24.00,12.22,0.00,1.00,148.80,9.60 +-134.40,24.00,12.24,0.00,1.00,144.00,-9.60 +-129.60,28.80,12.26,0.00,1.00,139.20,9.60 +-124.80,28.80,12.28,0.00,1.00,129.60,-9.60 +-120.00,28.80,12.30,0.00,1.00,124.80,9.60 +-115.20,33.60,12.33,0.00,1.00,115.20,-9.60 +-110.40,33.60,12.35,0.00,1.00,110.40,9.60 +-100.80,33.60,12.37,0.00,1.00,100.80,-9.60 +-96.00,33.60,12.39,0.00,1.00,91.20,9.60 +-91.20,33.60,12.41,0.00,1.00,81.60,-9.60 +-86.40,33.60,12.43,0.00,1.00,76.80,9.60 +-81.60,33.60,12.45,0.00,1.00,67.20,-9.60 +-72.00,33.60,12.48,0.00,1.00,57.60,9.60 +-67.20,33.60,12.50,0.00,1.00,52.80,-9.60 +-62.40,28.80,12.52,0.00,1.00,48.00,9.60 +-57.60,28.80,12.54,0.00,1.00,38.40,-9.60 +-52.80,28.80,12.56,0.00,1.00,33.60,9.60 +-48.00,24.00,12.58,0.00,1.00,28.80,-9.60 +-43.20,24.00,12.60,0.00,1.00,28.80,9.60 +-38.40,24.00,12.62,0.00,1.00,24.00,-9.60 +-33.60,19.20,12.65,0.00,1.00,19.20,4.80 +-28.80,19.20,12.67,0.00,1.00,14.40,-4.80 +-24.00,14.40,12.69,0.00,1.00,14.40,4.80 +-19.20,14.40,12.71,0.00,1.00,9.60,-4.80 +-14.40,9.60,12.73,0.00,1.00,9.60,4.80 +-14.40,9.60,12.75,0.00,1.00,4.80,-4.80 +-9.60,4.80,12.77,0.00,1.00,4.80,0.00 +-4.80,4.80,12.80,0.00,1.00,0.00,-0.00 +0.00,0.00,12.82,0.00,1.00,-4.80,0.00 +4.80,-4.80,12.84,0.00,1.00,-4.80,-0.00 +9.60,-4.80,12.86,0.00,1.00,-9.60,0.00 +9.60,-9.60,12.88,0.00,1.00,-9.60,-0.00 +14.40,-9.60,12.90,0.00,1.00,-14.40,0.00 +19.20,-14.40,12.92,0.00,1.00,-19.20,-4.80 +24.00,-19.20,12.95,0.00,1.00,-24.00,4.80 +28.80,-19.20,12.97,0.00,1.00,-24.00,-4.80 +33.60,-24.00,12.99,0.00,1.00,-28.80,4.80 +38.40,-24.00,13.01,0.00,1.00,-33.60,-4.80 +43.20,-28.80,13.03,0.00,1.00,-38.40,4.80 +48.00,-28.80,13.05,0.00,1.00,-43.20,-4.80 +52.80,-33.60,13.07,0.00,1.00,-48.00,4.80 +57.60,-33.60,13.09,0.00,1.00,-52.80,-4.80 +62.40,-33.60,13.12,0.00,1.00,-62.40,4.80 +67.20,-38.40,13.14,0.00,1.00,-67.20,-4.80 +72.00,-38.40,13.16,0.00,1.00,-76.80,4.80 +81.60,-38.40,13.18,0.00,1.00,-86.40,-4.80 +86.40,-38.40,13.20,0.00,1.00,-91.20,4.80 +91.20,-38.40,13.22,0.00,1.00,-100.80,-4.80 +96.00,-38.40,13.24,0.00,1.00,-105.60,4.80 +105.60,-38.40,13.27,0.00,1.00,-115.20,-4.80 +110.40,-38.40,13.29,0.00,1.00,-120.00,4.80 +115.20,-33.60,13.31,0.00,1.00,-129.60,-4.80 +120.00,-33.60,13.33,0.00,1.00,-134.40,4.80 +124.80,-33.60,13.35,0.00,1.00,-139.20,-4.80 +129.60,-28.80,13.37,0.00,1.00,-144.00,4.80 +134.40,-28.80,13.39,0.00,1.00,-148.80,-4.80 +139.20,-24.00,13.42,0.00,1.00,-153.60,4.80 +144.00,-24.00,13.44,0.00,1.00,-158.40,-4.80 +148.80,-19.20,13.46,0.00,1.00,-158.40,4.80 +153.60,-19.20,13.48,0.00,1.00,-163.20,-4.80 +158.40,-14.40,13.50,0.00,1.00,-168.00,4.80 +163.20,-14.40,13.52,0.00,1.00,-168.00,-4.80 +168.00,-9.60,13.54,0.00,1.00,-172.80,0.00 +172.80,-9.60,13.56,0.00,1.00,-177.60,-0.00 +172.80,-4.80,13.59,0.00,1.00,-177.60,0.00 +177.60,-0.00,13.61,0.00,1.00,177.60,-0.00 +-177.60,0.00,13.63,0.00,1.00,177.60,-0.00 +-172.80,4.80,13.65,0.00,1.00,172.80,0.00 +-172.80,9.60,13.67,0.00,1.00,168.00,-0.00 +-168.00,9.60,13.69,0.00,1.00,168.00,0.00 +-163.20,14.40,13.71,0.00,1.00,163.20,-4.80 +-158.40,14.40,13.74,0.00,1.00,158.40,4.80 +-153.60,19.20,13.76,0.00,1.00,158.40,-4.80 +-148.80,19.20,13.78,0.00,1.00,153.60,4.80 +-144.00,24.00,13.80,0.00,1.00,148.80,-4.80 +-139.20,24.00,13.82,0.00,1.00,144.00,4.80 +-134.40,28.80,13.84,0.00,1.00,139.20,-4.80 +-129.60,28.80,13.86,0.00,1.00,134.40,4.80 +-124.80,33.60,13.89,0.00,1.00,129.60,-4.80 +-120.00,33.60,13.91,0.00,1.00,120.00,4.80 +-115.20,33.60,13.93,0.00,1.00,115.20,-4.80 +-110.40,38.40,13.95,0.00,1.00,105.60,4.80 +-105.60,38.40,13.97,0.00,1.00,100.80,-4.80 +-96.00,38.40,13.99,0.00,1.00,91.20,4.80 +-91.20,38.40,14.01,0.00,1.00,86.40,-4.80 +-86.40,38.40,14.03,0.00,1.00,76.80,4.80 +-81.60,38.40,14.06,0.00,1.00,67.20,-4.80 +-72.00,38.40,14.08,0.00,1.00,62.40,4.80 +-67.20,38.40,14.10,0.00,1.00,52.80,-4.80 +-62.40,33.60,14.12,0.00,1.00,48.00,4.80 +-57.60,33.60,14.14,0.00,1.00,43.20,-4.80 +-52.80,33.60,14.16,0.00,1.00,38.40,4.80 +-48.00,28.80,14.18,0.00,1.00,33.60,-4.80 +-43.20,28.80,14.21,0.00,1.00,28.80,4.80 +-38.40,24.00,14.23,0.00,1.00,24.00,-4.80 +-33.60,24.00,14.25,0.00,1.00,24.00,4.80 +-28.80,19.20,14.27,0.00,1.00,19.20,-4.80 +-24.00,19.20,14.29,0.00,1.00,14.40,4.80 +-19.20,14.40,14.31,0.00,1.00,9.60,-4.80 +-14.40,9.60,14.33,0.00,1.00,9.60,0.00 +-9.60,9.60,14.36,0.00,1.00,4.80,-0.00 +-9.60,4.80,14.38,0.00,1.00,4.80,0.00 +-4.80,4.80,14.40,0.00,1.00,0.00,-0.00 +0.00,0.00,14.42,0.00,1.00,-4.80,0.00 +4.80,-4.80,14.44,0.00,1.00,-4.80,-0.00 +4.80,-4.80,14.46,0.00,1.00,-9.60,0.00 +9.60,-9.60,14.48,0.00,1.00,-14.40,-0.00 +14.40,-14.40,14.50,0.00,1.00,-14.40,0.00 +19.20,-14.40,14.53,0.00,1.00,-19.20,-0.00 +24.00,-19.20,14.55,0.00,1.00,-24.00,0.00 +24.00,-24.00,14.57,0.00,1.00,-28.80,-0.00 +28.80,-24.00,14.59,0.00,1.00,-33.60,0.00 +33.60,-28.80,14.61,0.00,1.00,-38.40,-0.00 +38.40,-28.80,14.63,0.00,1.00,-43.20,0.00 +43.20,-33.60,14.65,0.00,1.00,-48.00,-0.00 +48.00,-33.60,14.68,0.00,1.00,-52.80,0.00 +52.80,-38.40,14.70,0.00,1.00,-57.60,-0.00 +62.40,-38.40,14.72,0.00,1.00,-62.40,0.00 +67.20,-38.40,14.74,0.00,1.00,-72.00,-0.00 +72.00,-43.20,14.76,0.00,1.00,-76.80,0.00 +76.80,-43.20,14.78,0.00,1.00,-86.40,-0.00 +86.40,-43.20,14.80,0.00,1.00,-91.20,0.00 +91.20,-43.20,14.83,0.00,1.00,-100.80,-0.00 +96.00,-43.20,14.85,0.00,1.00,-105.60,0.00 +105.60,-43.20,14.87,0.00,1.00,-110.40,-0.00 +110.40,-43.20,14.89,0.00,1.00,-120.00,0.00 +115.20,-38.40,14.91,0.00,1.00,-124.80,-0.00 +124.80,-38.40,14.93,0.00,1.00,-129.60,0.00 +129.60,-38.40,14.95,0.00,1.00,-134.40,-0.00 +134.40,-33.60,14.97,0.00,1.00,-139.20,0.00 +139.20,-33.60,15.00,0.00,1.00,-144.00,-0.00 +144.00,-28.80,15.02,0.00,1.00,-148.80,0.00 +148.80,-28.80,15.04,0.00,1.00,-153.60,-0.00 +153.60,-24.00,15.06,0.00,1.00,-158.40,0.00 +158.40,-19.20,15.08,0.00,1.00,-163.20,-0.00 +158.40,-19.20,15.10,0.00,1.00,-163.20,0.00 +163.20,-14.40,15.12,0.00,1.00,-168.00,-0.00 +168.00,-9.60,15.15,0.00,1.00,-172.80,0.00 +172.80,-9.60,15.17,0.00,1.00,-172.80,-0.00 +172.80,-4.80,15.19,0.00,1.00,-177.60,0.00 +177.60,-0.00,15.21,0.00,1.00,177.60,-0.00 +-177.60,0.00,15.23,0.00,1.00,172.80,-0.00 +-172.80,4.80,15.25,0.00,1.00,172.80,0.00 +-172.80,9.60,15.27,0.00,1.00,168.00,-0.00 +-168.00,9.60,15.30,0.00,1.00,163.20,0.00 +-163.20,14.40,15.32,0.00,1.00,163.20,-0.00 +-158.40,19.20,15.34,0.00,1.00,158.40,0.00 +-158.40,19.20,15.36,0.00,1.00,153.60,-0.00 +-153.60,24.00,15.38,0.00,1.00,148.80,0.00 +-148.80,28.80,15.40,0.00,1.00,144.00,-0.00 +-144.00,28.80,15.42,0.00,1.00,139.20,0.00 +-139.20,33.60,15.44,0.00,1.00,134.40,-0.00 +-134.40,33.60,15.47,0.00,1.00,129.60,0.00 +-129.60,38.40,15.49,0.00,1.00,124.80,-0.00 +-124.80,38.40,15.51,0.00,1.00,120.00,0.00 +-115.20,38.40,15.53,0.00,1.00,110.40,-0.00 +-110.40,43.20,15.55,0.00,1.00,105.60,0.00 +-105.60,43.20,15.57,0.00,1.00,100.80,-0.00 +-96.00,43.20,15.59,0.00,1.00,91.20,0.00 +-91.20,43.20,15.62,0.00,1.00,86.40,-0.00 +-86.40,43.20,15.64,0.00,1.00,76.80,0.00 +-76.80,43.20,15.66,0.00,1.00,72.00,-0.00 +-72.00,43.20,15.68,0.00,1.00,62.40,0.00 +-67.20,38.40,15.70,0.00,1.00,57.60,-0.00 +-62.40,38.40,15.72,0.00,1.00,52.80,0.00 +-52.80,38.40,15.74,0.00,1.00,48.00,-0.00 +-48.00,33.60,15.77,0.00,1.00,43.20,0.00 +-43.20,33.60,15.79,0.00,1.00,38.40,-0.00 +-38.40,28.80,15.81,0.00,1.00,33.60,0.00 +-33.60,28.80,15.83,0.00,1.00,28.80,-0.00 +-28.80,24.00,15.85,0.00,1.00,24.00,0.00 +-24.00,24.00,15.87,0.00,1.00,19.20,-0.00 +-24.00,19.20,15.89,0.00,1.00,14.40,0.00 +-19.20,14.40,15.91,0.00,1.00,14.40,-0.00 +-14.40,14.40,15.94,0.00,1.00,9.60,0.00 +-9.60,9.60,15.96,0.00,1.00,4.80,-0.00 +-4.80,4.80,15.98,0.00,1.00,4.80,0.00 +-4.80,4.80,16.00,0.00,1.00,0.00,-0.00 +0.00,0.00,16.00,0.00,1.00,-4.80,0.00 +4.80,-4.80,15.98,0.00,1.00,-4.80,0.00 +4.80,-4.80,15.96,0.00,1.00,-9.60,-0.00 +9.60,-9.60,15.94,0.00,1.00,-14.40,0.00 +14.40,-14.40,15.91,0.00,1.00,-19.20,-0.00 +14.40,-19.20,15.89,0.00,1.00,-24.00,0.00 +19.20,-19.20,15.87,0.00,1.00,-24.00,-0.00 +24.00,-24.00,15.85,0.00,1.00,-28.80,0.00 +28.80,-28.80,15.83,0.00,1.00,-33.60,-0.00 +33.60,-28.80,15.81,0.00,1.00,-38.40,0.00 +38.40,-33.60,15.79,0.00,1.00,-43.20,-0.00 +43.20,-38.40,15.77,0.00,1.00,-48.00,0.00 +48.00,-38.40,15.74,0.00,1.00,-52.80,-4.80 +52.80,-43.20,15.72,0.00,1.00,-62.40,4.80 +57.60,-43.20,15.70,0.00,1.00,-67.20,-4.80 +62.40,-43.20,15.68,0.00,1.00,-72.00,4.80 +72.00,-48.00,15.66,0.00,1.00,-76.80,-4.80 +76.80,-48.00,15.64,0.00,1.00,-86.40,4.80 +86.40,-48.00,15.62,0.00,1.00,-91.20,-4.80 +91.20,-48.00,15.59,0.00,1.00,-96.00,4.80 +100.80,-48.00,15.57,0.00,1.00,-105.60,-4.80 +105.60,-48.00,15.55,0.00,1.00,-110.40,4.80 +110.40,-48.00,15.53,0.00,1.00,-115.20,-4.80 +120.00,-43.20,15.51,0.00,1.00,-124.80,4.80 +124.80,-43.20,15.49,0.00,1.00,-129.60,-4.80 +129.60,-38.40,15.47,0.00,1.00,-134.40,4.80 +134.40,-38.40,15.44,0.00,1.00,-139.20,-4.80 +139.20,-33.60,15.42,0.00,1.00,-144.00,0.00 +144.00,-33.60,15.40,0.00,1.00,-148.80,-0.00 +148.80,-28.80,15.38,0.00,1.00,-153.60,0.00 +153.60,-24.00,15.36,0.00,1.00,-158.40,-0.00 +158.40,-24.00,15.34,0.00,1.00,-158.40,0.00 +163.20,-19.20,15.32,0.00,1.00,-163.20,-0.00 +163.20,-14.40,15.30,0.00,1.00,-168.00,0.00 +168.00,-14.40,15.27,0.00,1.00,-172.80,-0.00 +172.80,-9.60,15.25,0.00,1.00,-172.80,0.00 +172.80,-4.80,15.23,0.00,1.00,-177.60,-0.00 +177.60,-0.00,15.21,0.00,1.00,177.60,0.00 +-177.60,0.00,15.19,0.00,1.00,172.80,0.00 +-172.80,4.80,15.17,0.00,1.00,172.80,-0.00 +-172.80,9.60,15.15,0.00,1.00,168.00,0.00 +-168.00,14.40,15.12,0.00,1.00,163.20,-0.00 +-163.20,14.40,15.10,0.00,1.00,158.40,0.00 +-163.20,19.20,15.08,0.00,1.00,158.40,-0.00 +-158.40,24.00,15.06,0.00,1.00,153.60,0.00 +-153.60,24.00,15.04,0.00,1.00,148.80,-0.00 +-148.80,28.80,15.02,0.00,1.00,144.00,0.00 +-144.00,33.60,15.00,0.00,1.00,139.20,-0.00 +-139.20,33.60,14.97,0.00,1.00,134.40,0.00 +-134.40,38.40,14.95,0.00,1.00,129.60,-4.80 +-129.60,38.40,14.93,0.00,1.00,124.80,4.80 +-124.80,43.20,14.91,0.00,1.00,115.20,-4.80 +-120.00,43.20,14.89,0.00,1.00,110.40,4.80 +-110.40,48.00,14.87,0.00,1.00,105.60,-4.80 +-105.60,48.00,14.85,0.00,1.00,96.00,4.80 +-100.80,48.00,14.83,0.00,1.00,91.20,-4.80 +-91.20,48.00,14.80,0.00,1.00,86.40,4.80 +-86.40,48.00,14.78,0.00,1.00,76.80,-4.80 +-76.80,48.00,14.76,0.00,1.00,72.00,4.80 +-72.00,48.00,14.74,0.00,1.00,67.20,-4.80 +-62.40,43.20,14.72,0.00,1.00,62.40,4.80 +-57.60,43.20,14.70,0.00,1.00,52.80,-4.80 +-52.80,43.20,14.68,0.00,1.00,48.00,4.80 +-48.00,38.40,14.65,0.00,1.00,43.20,-4.80 +-43.20,38.40,14.63,0.00,1.00,38.40,0.00 +-38.40,33.60,14.61,0.00,1.00,33.60,-0.00 +-33.60,28.80,14.59,0.00,1.00,28.80,0.00 +-28.80,28.80,14.57,0.00,1.00,24.00,-0.00 +-24.00,24.00,14.55,0.00,1.00,24.00,0.00 +-19.20,19.20,14.53,0.00,1.00,19.20,-0.00 +-14.40,19.20,14.50,0.00,1.00,14.40,0.00 +-14.40,14.40,14.48,0.00,1.00,9.60,-0.00 +-9.60,9.60,14.46,0.00,1.00,4.80,0.00 +-4.80,4.80,14.44,0.00,1.00,4.80,-0.00 +-4.80,4.80,14.42,0.00,1.00,0.00,0.00 +0.00,0.00,14.40,0.00,1.00,-4.80,0.00 +4.80,-4.80,14.38,0.00,1.00,-9.60,0.00 +4.80,-9.60,14.36,0.00,1.00,-9.60,-0.00 +9.60,-9.60,14.33,0.00,1.00,-14.40,0.00 +9.60,-14.40,14.31,0.00,1.00,-19.20,-4.80 +14.40,-19.20,14.29,0.00,1.00,-24.00,4.80 +19.20,-24.00,14.27,0.00,1.00,-28.80,-4.80 +24.00,-24.00,14.25,0.00,1.00,-33.60,4.80 +24.00,-28.80,14.23,0.00,1.00,-38.40,-4.80 +28.80,-33.60,14.21,0.00,1.00,-43.20,4.80 +33.60,-38.40,14.18,0.00,1.00,-48.00,-4.80 +38.40,-38.40,14.16,0.00,1.00,-52.80,4.80 +43.20,-43.20,14.14,0.00,1.00,-57.60,-4.80 +48.00,-43.20,14.12,0.00,1.00,-62.40,4.80 +52.80,-48.00,14.10,0.00,1.00,-67.20,-4.80 +62.40,-48.00,14.08,0.00,1.00,-72.00,9.60 +67.20,-52.80,14.06,0.00,1.00,-81.60,-9.60 +76.80,-52.80,14.03,0.00,1.00,-86.40,9.60 +86.40,-52.80,14.01,0.00,1.00,-91.20,-9.60 +91.20,-52.80,13.99,0.00,1.00,-96.00,9.60 +100.80,-52.80,13.97,0.00,1.00,-105.60,-9.60 +105.60,-52.80,13.95,0.00,1.00,-110.40,9.60 +115.20,-48.00,13.93,0.00,1.00,-115.20,-9.60 +120.00,-48.00,13.91,0.00,1.00,-120.00,9.60 +129.60,-48.00,13.89,0.00,1.00,-124.80,-4.80 +134.40,-43.20,13.86,0.00,1.00,-129.60,4.80 +139.20,-43.20,13.84,0.00,1.00,-134.40,-4.80 +144.00,-38.40,13.82,0.00,1.00,-139.20,4.80 +148.80,-33.60,13.80,0.00,1.00,-144.00,-4.80 +153.60,-33.60,13.78,0.00,1.00,-148.80,4.80 +158.40,-28.80,13.76,0.00,1.00,-153.60,-4.80 +158.40,-24.00,13.74,0.00,1.00,-158.40,4.80 +163.20,-19.20,13.71,0.00,1.00,-163.20,-4.80 +168.00,-19.20,13.69,0.00,1.00,-168.00,4.80 +168.00,-14.40,13.67,0.00,1.00,-172.80,-0.00 +172.80,-9.60,13.65,0.00,1.00,-172.80,0.00 +177.60,-4.80,13.63,0.00,1.00,-177.60,-0.00 +177.60,-0.00,13.61,0.00,1.00,177.60,0.00 +-177.60,0.00,13.59,0.00,1.00,172.80,0.00 +-177.60,4.80,13.56,0.00,1.00,172.80,-0.00 +-172.80,9.60,13.54,0.00,1.00,168.00,0.00 +-168.00,14.40,13.52,0.00,1.00,163.20,-0.00 +-168.00,19.20,13.50,0.00,1.00,158.40,4.80 +-163.20,19.20,13.48,0.00,1.00,153.60,-4.80 +-158.40,24.00,13.46,0.00,1.00,148.80,4.80 +-158.40,28.80,13.44,0.00,1.00,144.00,-4.80 +-153.60,33.60,13.42,0.00,1.00,139.20,4.80 +-148.80,33.60,13.39,0.00,1.00,134.40,-4.80 +-144.00,38.40,13.37,0.00,1.00,129.60,4.80 +-139.20,43.20,13.35,0.00,1.00,124.80,-4.80 +-134.40,43.20,13.33,0.00,1.00,120.00,4.80 +-129.60,48.00,13.31,0.00,1.00,115.20,-4.80 +-120.00,48.00,13.29,0.00,1.00,110.40,9.60 +-115.20,48.00,13.27,0.00,1.00,105.60,-9.60 +-105.60,52.80,13.24,0.00,1.00,96.00,9.60 +-100.80,52.80,13.22,0.00,1.00,91.20,-9.60 +-91.20,52.80,13.20,0.00,1.00,86.40,9.60 +-86.40,52.80,13.18,0.00,1.00,81.60,-9.60 +-76.80,52.80,13.16,0.00,1.00,72.00,9.60 +-67.20,52.80,13.14,0.00,1.00,67.20,-9.60 +-62.40,48.00,13.12,0.00,1.00,62.40,9.60 +-52.80,48.00,13.09,0.00,1.00,57.60,-4.80 +-48.00,43.20,13.07,0.00,1.00,52.80,4.80 +-43.20,43.20,13.05,0.00,1.00,48.00,-4.80 +-38.40,38.40,13.03,0.00,1.00,43.20,4.80 +-33.60,38.40,13.01,0.00,1.00,38.40,-4.80 +-28.80,33.60,12.99,0.00,1.00,33.60,4.80 +-24.00,28.80,12.97,0.00,1.00,28.80,-4.80 +-24.00,24.00,12.95,0.00,1.00,24.00,4.80 +-19.20,24.00,12.92,0.00,1.00,19.20,-4.80 +-14.40,19.20,12.90,0.00,1.00,14.40,4.80 +-9.60,14.40,12.88,0.00,1.00,9.60,-4.80 +-9.60,9.60,12.86,0.00,1.00,9.60,0.00 +-4.80,9.60,12.84,0.00,1.00,4.80,-0.00 +-4.80,4.80,12.82,0.00,1.00,0.00,0.00 +0.00,0.00,12.80,0.00,1.00,-4.80,0.00 +4.80,-4.80,12.77,0.00,1.00,-9.60,0.00 +4.80,-9.60,12.75,0.00,1.00,-14.40,-0.00 +9.60,-14.40,12.73,0.00,1.00,-14.40,4.80 +9.60,-14.40,12.71,0.00,1.00,-19.20,-4.80 +14.40,-19.20,12.69,0.00,1.00,-24.00,4.80 +14.40,-24.00,12.67,0.00,1.00,-28.80,-4.80 +19.20,-28.80,12.65,0.00,1.00,-33.60,4.80 +24.00,-33.60,12.62,0.00,1.00,-38.40,-9.60 +28.80,-33.60,12.60,0.00,1.00,-43.20,9.60 +28.80,-38.40,12.58,0.00,1.00,-48.00,-9.60 +33.60,-43.20,12.56,0.00,1.00,-52.80,9.60 +38.40,-43.20,12.54,0.00,1.00,-57.60,-9.60 +48.00,-48.00,12.52,0.00,1.00,-62.40,9.60 +52.80,-52.80,12.50,0.00,1.00,-67.20,-9.60 +57.60,-52.80,12.48,0.00,1.00,-72.00,9.60 +67.20,-57.60,12.45,0.00,1.00,-81.60,-14.40 +76.80,-57.60,12.43,0.00,1.00,-86.40,14.40 +81.60,-57.60,12.41,0.00,1.00,-91.20,-14.40 +91.20,-57.60,12.39,0.00,1.00,-96.00,14.40 +100.80,-57.60,12.37,0.00,1.00,-100.80,-14.40 +110.40,-57.60,12.35,0.00,1.00,-110.40,14.40 +115.20,-52.80,12.33,0.00,1.00,-115.20,-14.40 +124.80,-52.80,12.30,0.00,1.00,-120.00,9.60 +129.60,-48.00,12.28,0.00,1.00,-124.80,-9.60 +139.20,-48.00,12.26,0.00,1.00,-129.60,9.60 +144.00,-43.20,12.24,0.00,1.00,-134.40,-9.60 +148.80,-38.40,12.22,0.00,1.00,-139.20,9.60 +153.60,-38.40,12.20,0.00,1.00,-144.00,-9.60 +153.60,-33.60,12.18,0.00,1.00,-148.80,9.60 +158.40,-28.80,12.15,0.00,1.00,-153.60,-9.60 +163.20,-24.00,12.13,0.00,1.00,-158.40,4.80 +163.20,-24.00,12.11,0.00,1.00,-163.20,-4.80 +168.00,-19.20,12.09,0.00,1.00,-168.00,4.80 +172.80,-14.40,12.07,0.00,1.00,-168.00,-4.80 +172.80,-9.60,12.05,0.00,1.00,-172.80,4.80 +177.60,-4.80,12.03,0.00,1.00,-177.60,-0.00 +177.60,-0.00,12.01,0.00,1.00,177.60,0.00 +-177.60,0.00,11.98,0.00,1.00,172.80,0.00 +-177.60,4.80,11.96,0.00,1.00,168.00,-0.00 +-172.80,9.60,11.94,0.00,1.00,168.00,4.80 +-172.80,14.40,11.92,0.00,1.00,163.20,-4.80 +-168.00,19.20,11.90,0.00,1.00,158.40,4.80 +-163.20,24.00,11.88,0.00,1.00,153.60,-4.80 +-163.20,24.00,11.86,0.00,1.00,148.80,4.80 +-158.40,28.80,11.83,0.00,1.00,144.00,-9.60 +-153.60,33.60,11.81,0.00,1.00,139.20,9.60 +-153.60,38.40,11.79,0.00,1.00,134.40,-9.60 +-148.80,38.40,11.77,0.00,1.00,129.60,9.60 +-144.00,43.20,11.75,0.00,1.00,124.80,-9.60 +-139.20,48.00,11.73,0.00,1.00,120.00,9.60 +-129.60,48.00,11.71,0.00,1.00,115.20,-9.60 +-124.80,52.80,11.68,0.00,1.00,110.40,9.60 +-115.20,52.80,11.66,0.00,1.00,100.80,-14.40 +-110.40,57.60,11.64,0.00,1.00,96.00,14.40 +-100.80,57.60,11.62,0.00,1.00,91.20,-14.40 +-91.20,57.60,11.60,0.00,1.00,86.40,14.40 +-81.60,57.60,11.58,0.00,1.00,81.60,-14.40 +-76.80,57.60,11.56,0.00,1.00,72.00,14.40 +-67.20,57.60,11.54,0.00,1.00,67.20,-14.40 +-57.60,52.80,11.51,0.00,1.00,62.40,9.60 +-52.80,52.80,11.49,0.00,1.00,57.60,-9.60 +-48.00,48.00,11.47,0.00,1.00,52.80,9.60 +-38.40,43.20,11.45,0.00,1.00,48.00,-9.60 +-33.60,43.20,11.43,0.00,1.00,43.20,9.60 +-28.80,38.40,11.41,0.00,1.00,38.40,-9.60 +-28.80,33.60,11.39,0.00,1.00,33.60,9.60 +-24.00,33.60,11.36,0.00,1.00,28.80,-9.60 +-19.20,28.80,11.34,0.00,1.00,24.00,4.80 +-14.40,24.00,11.32,0.00,1.00,19.20,-4.80 +-14.40,19.20,11.30,0.00,1.00,14.40,4.80 +-9.60,14.40,11.28,0.00,1.00,14.40,-4.80 +-9.60,14.40,11.26,0.00,1.00,9.60,4.80 +-4.80,9.60,11.24,0.00,1.00,4.80,-0.00 +-4.80,4.80,11.21,0.00,1.00,0.00,0.00 +0.00,0.00,11.19,0.00,1.00,-4.80,0.00 +0.00,-4.80,11.17,0.00,1.00,-9.60,0.00 +4.80,-9.60,11.15,0.00,1.00,-14.40,-4.80 +4.80,-14.40,11.13,0.00,1.00,-19.20,4.80 +9.60,-19.20,11.11,0.00,1.00,-19.20,-4.80 +9.60,-19.20,11.09,0.00,1.00,-24.00,4.80 +14.40,-24.00,11.07,0.00,1.00,-28.80,-9.60 +19.20,-28.80,11.04,0.00,1.00,-33.60,9.60 +19.20,-33.60,11.02,0.00,1.00,-38.40,-9.60 +24.00,-38.40,11.00,0.00,1.00,-43.20,9.60 +28.80,-43.20,10.98,0.00,1.00,-48.00,-14.40 +33.60,-43.20,10.96,0.00,1.00,-52.80,14.40 +38.40,-48.00,10.94,0.00,1.00,-57.60,-14.40 +43.20,-52.80,10.92,0.00,1.00,-62.40,14.40 +48.00,-52.80,10.89,0.00,1.00,-72.00,-14.40 +52.80,-57.60,10.87,0.00,1.00,-76.80,14.40 +62.40,-57.60,10.85,0.00,1.00,-81.60,-19.20 +72.00,-62.40,10.83,0.00,1.00,-86.40,19.20 +81.60,-62.40,10.81,0.00,1.00,-91.20,-19.20 +91.20,-62.40,10.79,0.00,1.00,-96.00,19.20 +100.80,-62.40,10.77,0.00,1.00,-100.80,-19.20 +110.40,-62.40,10.74,0.00,1.00,-105.60,19.20 +120.00,-57.60,10.72,0.00,1.00,-115.20,-14.40 +129.60,-57.60,10.70,0.00,1.00,-120.00,14.40 +134.40,-52.80,10.68,0.00,1.00,-124.80,-14.40 +139.20,-48.00,10.66,0.00,1.00,-129.60,14.40 +144.00,-48.00,10.64,0.00,1.00,-134.40,-14.40 +148.80,-43.20,10.62,0.00,1.00,-139.20,14.40 +153.60,-38.40,10.60,0.00,1.00,-144.00,-14.40 +158.40,-33.60,10.57,0.00,1.00,-148.80,9.60 +163.20,-33.60,10.55,0.00,1.00,-153.60,-9.60 +163.20,-28.80,10.53,0.00,1.00,-158.40,9.60 +168.00,-24.00,10.51,0.00,1.00,-163.20,-9.60 +168.00,-19.20,10.49,0.00,1.00,-163.20,4.80 +172.80,-14.40,10.47,0.00,1.00,-168.00,-4.80 +172.80,-9.60,10.45,0.00,1.00,-172.80,4.80 +177.60,-4.80,10.42,0.00,1.00,-177.60,-0.00 +177.60,-0.00,10.40,0.00,1.00,177.60,0.00 +-177.60,0.00,10.38,0.00,1.00,172.80,0.00 +-177.60,4.80,10.36,0.00,1.00,168.00,-0.00 +-172.80,9.60,10.34,0.00,1.00,163.20,4.80 +-172.80,14.40,10.32,0.00,1.00,163.20,-4.80 +-168.00,19.20,10.30,0.00,1.00,158.40,4.80 +-168.00,24.00,10.28,0.00,1.00,153.60,-9.60 +-163.20,28.80,10.25,0.00,1.00,148.80,9.60 +-163.20,33.60,10.23,0.00,1.00,144.00,-9.60 +-158.40,33.60,10.21,0.00,1.00,139.20,9.60 +-153.60,38.40,10.19,0.00,1.00,134.40,-14.40 +-148.80,43.20,10.17,0.00,1.00,129.60,14.40 +-144.00,48.00,10.15,0.00,1.00,124.80,-14.40 +-139.20,48.00,10.13,0.00,1.00,120.00,14.40 +-134.40,52.80,10.10,0.00,1.00,115.20,-14.40 +-129.60,57.60,10.08,0.00,1.00,105.60,14.40 +-120.00,57.60,10.06,0.00,1.00,100.80,-14.40 +-110.40,62.40,10.04,0.00,1.00,96.00,19.20 +-100.80,62.40,10.02,0.00,1.00,91.20,-19.20 +-91.20,62.40,10.00,0.00,1.00,86.40,19.20 +-81.60,62.40,9.98,0.00,1.00,81.60,-19.20 +-72.00,62.40,9.95,0.00,1.00,76.80,19.20 +-62.40,57.60,9.93,0.00,1.00,72.00,-19.20 +-52.80,57.60,9.91,0.00,1.00,62.40,14.40 +-48.00,52.80,9.89,0.00,1.00,57.60,-14.40 +-43.20,52.80,9.87,0.00,1.00,52.80,14.40 +-38.40,48.00,9.85,0.00,1.00,48.00,-14.40 +-33.60,43.20,9.83,0.00,1.00,43.20,14.40 +-28.80,43.20,9.81,0.00,1.00,38.40,-14.40 +-24.00,38.40,9.78,0.00,1.00,33.60,9.60 +-19.20,33.60,9.76,0.00,1.00,28.80,-9.60 +-19.20,28.80,9.74,0.00,1.00,24.00,9.60 +-14.40,24.00,9.72,0.00,1.00,19.20,-9.60 +-9.60,19.20,9.70,0.00,1.00,19.20,4.80 +-9.60,19.20,9.68,0.00,1.00,14.40,-4.80 +-4.80,14.40,9.66,0.00,1.00,9.60,4.80 +-4.80,9.60,9.63,0.00,1.00,4.80,-4.80 +-0.00,4.80,9.61,0.00,1.00,0.00,0.00 +0.00,0.00,9.59,0.00,1.00,-4.80,0.00 +0.00,-4.80,9.57,0.00,1.00,-9.60,0.00 +4.80,-9.60,9.55,0.00,1.00,-14.40,-4.80 +4.80,-14.40,9.53,0.00,1.00,-19.20,4.80 +9.60,-19.20,9.51,0.00,1.00,-24.00,-4.80 +9.60,-24.00,9.48,0.00,1.00,-28.80,9.60 +14.40,-24.00,9.46,0.00,1.00,-33.60,-9.60 +14.40,-28.80,9.44,0.00,1.00,-33.60,14.40 +19.20,-33.60,9.42,0.00,1.00,-38.40,-14.40 +19.20,-38.40,9.40,0.00,1.00,-43.20,14.40 +24.00,-43.20,9.38,0.00,1.00,-48.00,-14.40 +28.80,-48.00,9.36,0.00,1.00,-57.60,19.20 +33.60,-52.80,9.34,0.00,1.00,-62.40,-19.20 +38.40,-52.80,9.31,0.00,1.00,-67.20,19.20 +43.20,-57.60,9.29,0.00,1.00,-72.00,-19.20 +48.00,-62.40,9.27,0.00,1.00,-76.80,19.20 +57.60,-62.40,9.25,0.00,1.00,-81.60,-19.20 +67.20,-67.20,9.23,0.00,1.00,-86.40,24.00 +81.60,-67.20,9.21,0.00,1.00,-91.20,-24.00 +91.20,-67.20,9.19,0.00,1.00,-96.00,24.00 +105.60,-67.20,9.16,0.00,1.00,-100.80,-24.00 +115.20,-67.20,9.14,0.00,1.00,-105.60,24.00 +124.80,-62.40,9.12,0.00,1.00,-110.40,-19.20 +134.40,-57.60,9.10,0.00,1.00,-115.20,19.20 +139.20,-57.60,9.08,0.00,1.00,-120.00,-19.20 +144.00,-52.80,9.06,0.00,1.00,-129.60,19.20 +148.80,-48.00,9.04,0.00,1.00,-134.40,-19.20 +153.60,-43.20,9.01,0.00,1.00,-139.20,19.20 +158.40,-43.20,8.99,0.00,1.00,-144.00,-14.40 +163.20,-38.40,8.97,0.00,1.00,-148.80,14.40 +163.20,-33.60,8.95,0.00,1.00,-148.80,-14.40 +168.00,-28.80,8.93,0.00,1.00,-153.60,9.60 +168.00,-24.00,8.91,0.00,1.00,-158.40,-9.60 +172.80,-19.20,8.89,0.00,1.00,-163.20,9.60 +172.80,-14.40,8.87,0.00,1.00,-168.00,-4.80 +177.60,-9.60,8.84,0.00,1.00,-172.80,4.80 +177.60,-4.80,8.82,0.00,1.00,-177.60,-4.80 +177.60,-0.00,8.80,0.00,1.00,177.60,0.00 +-177.60,0.00,8.78,0.00,1.00,172.80,0.00 +-177.60,4.80,8.76,0.00,1.00,168.00,-4.80 +-177.60,9.60,8.74,0.00,1.00,163.20,4.80 +-172.80,14.40,8.72,0.00,1.00,158.40,-4.80 +-172.80,19.20,8.69,0.00,1.00,153.60,9.60 +-168.00,24.00,8.67,0.00,1.00,148.80,-9.60 +-168.00,28.80,8.65,0.00,1.00,148.80,9.60 +-163.20,33.60,8.63,0.00,1.00,144.00,-14.40 +-163.20,38.40,8.61,0.00,1.00,139.20,14.40 +-158.40,43.20,8.59,0.00,1.00,134.40,-14.40 +-153.60,43.20,8.57,0.00,1.00,129.60,19.20 +-148.80,48.00,8.54,0.00,1.00,120.00,-19.20 +-144.00,52.80,8.52,0.00,1.00,115.20,19.20 +-139.20,57.60,8.50,0.00,1.00,110.40,-19.20 +-134.40,57.60,8.48,0.00,1.00,105.60,19.20 +-124.80,62.40,8.46,0.00,1.00,100.80,-19.20 +-115.20,67.20,8.44,0.00,1.00,96.00,24.00 +-105.60,67.20,8.42,0.00,1.00,91.20,-24.00 +-91.20,67.20,8.40,0.00,1.00,86.40,24.00 +-81.60,67.20,8.37,0.00,1.00,81.60,-24.00 +-67.20,67.20,8.35,0.00,1.00,76.80,24.00 +-57.60,62.40,8.33,0.00,1.00,72.00,-19.20 +-48.00,62.40,8.31,0.00,1.00,67.20,19.20 +-43.20,57.60,8.29,0.00,1.00,62.40,-19.20 +-38.40,52.80,8.27,0.00,1.00,57.60,19.20 +-33.60,52.80,8.25,0.00,1.00,48.00,-19.20 +-28.80,48.00,8.22,0.00,1.00,43.20,19.20 +-24.00,43.20,8.20,0.00,1.00,38.40,-14.40 +-19.20,38.40,8.18,0.00,1.00,33.60,14.40 +-19.20,33.60,8.16,0.00,1.00,33.60,-14.40 +-14.40,28.80,8.14,0.00,1.00,28.80,14.40 +-14.40,24.00,8.12,0.00,1.00,24.00,-9.60 +-9.60,24.00,8.10,0.00,1.00,19.20,9.60 +-9.60,19.20,8.07,0.00,1.00,14.40,-4.80 +-4.80,14.40,8.05,0.00,1.00,9.60,4.80 +-4.80,9.60,8.03,0.00,1.00,4.80,-4.80 +-0.00,4.80,8.01,0.00,1.00,0.00,0.00 +0.00,0.00,7.99,0.00,1.00,-4.80,0.00 +0.00,-4.80,7.97,0.00,1.00,-9.60,0.00 +4.80,-9.60,7.95,0.00,1.00,-14.40,-4.80 +4.80,-14.40,7.93,0.00,1.00,-19.20,4.80 +4.80,-19.20,7.90,0.00,1.00,-24.00,-9.60 +9.60,-24.00,7.88,0.00,1.00,-28.80,9.60 +9.60,-28.80,7.86,0.00,1.00,-33.60,-14.40 +9.60,-33.60,7.84,0.00,1.00,-38.40,14.40 +14.40,-38.40,7.82,0.00,1.00,-43.20,-14.40 +14.40,-38.40,7.80,0.00,1.00,-48.00,19.20 +19.20,-43.20,7.78,0.00,1.00,-52.80,-19.20 +24.00,-48.00,7.75,0.00,1.00,-57.60,19.20 +24.00,-52.80,7.73,0.00,1.00,-62.40,-24.00 +28.80,-57.60,7.71,0.00,1.00,-67.20,24.00 +38.40,-62.40,7.69,0.00,1.00,-72.00,-24.00 +43.20,-62.40,7.67,0.00,1.00,-76.80,24.00 +52.80,-67.20,7.65,0.00,1.00,-81.60,-24.00 +62.40,-72.00,7.63,0.00,1.00,-86.40,28.80 +76.80,-72.00,7.60,0.00,1.00,-91.20,-28.80 +96.00,-72.00,7.58,0.00,1.00,-96.00,28.80 +110.40,-72.00,7.56,0.00,1.00,-100.80,-28.80 +120.00,-67.20,7.54,0.00,1.00,-105.60,28.80 +134.40,-67.20,7.52,0.00,1.00,-110.40,-24.00 +139.20,-62.40,7.50,0.00,1.00,-115.20,24.00 +148.80,-57.60,7.48,0.00,1.00,-120.00,-24.00 +153.60,-57.60,7.46,0.00,1.00,-124.80,24.00 +158.40,-52.80,7.43,0.00,1.00,-129.60,-24.00 +158.40,-48.00,7.41,0.00,1.00,-134.40,19.20 +163.20,-43.20,7.39,0.00,1.00,-139.20,-19.20 +163.20,-38.40,7.37,0.00,1.00,-144.00,19.20 +168.00,-33.60,7.35,0.00,1.00,-148.80,-14.40 +168.00,-28.80,7.33,0.00,1.00,-153.60,14.40 +172.80,-24.00,7.31,0.00,1.00,-158.40,-9.60 +172.80,-19.20,7.28,0.00,1.00,-163.20,9.60 +172.80,-14.40,7.26,0.00,1.00,-168.00,-9.60 +177.60,-9.60,7.24,0.00,1.00,-172.80,4.80 +177.60,-4.80,7.22,0.00,1.00,-177.60,-4.80 +177.60,-0.00,7.20,0.00,1.00,177.60,0.00 +-177.60,0.00,7.18,0.00,1.00,172.80,0.00 +-177.60,4.80,7.16,0.00,1.00,168.00,-4.80 +-177.60,9.60,7.13,0.00,1.00,163.20,4.80 +-172.80,14.40,7.11,0.00,1.00,158.40,-9.60 +-172.80,19.20,7.09,0.00,1.00,153.60,9.60 +-172.80,24.00,7.07,0.00,1.00,148.80,-9.60 +-168.00,28.80,7.05,0.00,1.00,144.00,14.40 +-168.00,33.60,7.03,0.00,1.00,139.20,-14.40 +-163.20,38.40,7.01,0.00,1.00,134.40,19.20 +-163.20,43.20,6.99,0.00,1.00,129.60,-19.20 +-158.40,48.00,6.96,0.00,1.00,124.80,19.20 +-158.40,52.80,6.94,0.00,1.00,120.00,-24.00 +-153.60,57.60,6.92,0.00,1.00,115.20,24.00 +-148.80,57.60,6.90,0.00,1.00,110.40,-24.00 +-139.20,62.40,6.88,0.00,1.00,105.60,24.00 +-134.40,67.20,6.86,0.00,1.00,100.80,-24.00 +-120.00,67.20,6.84,0.00,1.00,96.00,28.80 +-110.40,72.00,6.81,0.00,1.00,91.20,-28.80 +-96.00,72.00,6.79,0.00,1.00,86.40,28.80 +-76.80,72.00,6.77,0.00,1.00,81.60,-28.80 +-62.40,72.00,6.75,0.00,1.00,76.80,28.80 +-52.80,67.20,6.73,0.00,1.00,72.00,-24.00 +-43.20,62.40,6.71,0.00,1.00,67.20,24.00 +-38.40,62.40,6.69,0.00,1.00,62.40,-24.00 +-28.80,57.60,6.66,0.00,1.00,57.60,24.00 +-24.00,52.80,6.64,0.00,1.00,52.80,-24.00 +-24.00,48.00,6.62,0.00,1.00,48.00,19.20 +-19.20,43.20,6.60,0.00,1.00,43.20,-19.20 +-14.40,38.40,6.58,0.00,1.00,38.40,19.20 +-14.40,38.40,6.56,0.00,1.00,33.60,-14.40 +-9.60,33.60,6.54,0.00,1.00,28.80,14.40 +-9.60,28.80,6.52,0.00,1.00,24.00,-14.40 +-9.60,24.00,6.49,0.00,1.00,19.20,9.60 +-4.80,19.20,6.47,0.00,1.00,14.40,-9.60 +-4.80,14.40,6.45,0.00,1.00,9.60,4.80 +-4.80,9.60,6.43,0.00,1.00,4.80,-4.80 +-0.00,4.80,6.41,0.00,1.00,0.00,0.00 +0.00,0.00,6.39,0.00,1.00,-4.80,0.00 +0.00,-4.80,6.37,0.00,1.00,-9.60,4.80 +0.00,-9.60,6.34,0.00,1.00,-14.40,-4.80 +4.80,-14.40,6.32,0.00,1.00,-19.20,9.60 +4.80,-19.20,6.30,0.00,1.00,-24.00,-9.60 +4.80,-24.00,6.28,0.00,1.00,-28.80,14.40 +4.80,-28.80,6.26,0.00,1.00,-33.60,-14.40 +9.60,-33.60,6.24,0.00,1.00,-38.40,19.20 +9.60,-38.40,6.22,0.00,1.00,-43.20,-19.20 +14.40,-43.20,6.19,0.00,1.00,-48.00,19.20 +14.40,-48.00,6.17,0.00,1.00,-52.80,-24.00 +14.40,-52.80,6.15,0.00,1.00,-57.60,24.00 +19.20,-57.60,6.13,0.00,1.00,-62.40,-28.80 +24.00,-57.60,6.11,0.00,1.00,-67.20,28.80 +28.80,-62.40,6.09,0.00,1.00,-72.00,-28.80 +33.60,-67.20,6.07,0.00,1.00,-76.80,28.80 +43.20,-72.00,6.05,0.00,1.00,-81.60,-28.80 +57.60,-72.00,6.02,0.00,1.00,-86.40,33.60 +76.80,-76.80,6.00,0.00,1.00,-91.20,-33.60 +96.00,-76.80,5.98,0.00,1.00,-96.00,33.60 +115.20,-76.80,5.96,0.00,1.00,-100.80,-33.60 +129.60,-72.00,5.94,0.00,1.00,-105.60,28.80 +139.20,-72.00,5.92,0.00,1.00,-110.40,-28.80 +148.80,-67.20,5.90,0.00,1.00,-115.20,28.80 +153.60,-62.40,5.87,0.00,1.00,-120.00,-28.80 +158.40,-57.60,5.85,0.00,1.00,-124.80,28.80 +163.20,-52.80,5.83,0.00,1.00,-129.60,-24.00 +163.20,-48.00,5.81,0.00,1.00,-134.40,24.00 +168.00,-43.20,5.79,0.00,1.00,-139.20,-24.00 +168.00,-38.40,5.77,0.00,1.00,-144.00,19.20 +172.80,-33.60,5.75,0.00,1.00,-148.80,-19.20 +172.80,-28.80,5.72,0.00,1.00,-153.60,14.40 +172.80,-24.00,5.70,0.00,1.00,-158.40,-14.40 +172.80,-19.20,5.68,0.00,1.00,-163.20,9.60 +177.60,-14.40,5.66,0.00,1.00,-168.00,-9.60 +177.60,-9.60,5.64,0.00,1.00,-172.80,4.80 +177.60,-4.80,5.62,0.00,1.00,-177.60,-4.80 +177.60,-0.00,5.60,0.00,1.00,177.60,0.00 +-177.60,0.00,5.58,0.00,1.00,172.80,0.00 +-177.60,4.80,5.55,0.00,1.00,168.00,-4.80 +-177.60,9.60,5.53,0.00,1.00,163.20,4.80 +-177.60,14.40,5.51,0.00,1.00,158.40,-9.60 +-172.80,19.20,5.49,0.00,1.00,153.60,9.60 +-172.80,24.00,5.47,0.00,1.00,148.80,-14.40 +-172.80,28.80,5.45,0.00,1.00,144.00,14.40 +-172.80,33.60,5.43,0.00,1.00,139.20,-19.20 +-168.00,38.40,5.40,0.00,1.00,134.40,19.20 +-168.00,43.20,5.38,0.00,1.00,129.60,-24.00 +-163.20,48.00,5.36,0.00,1.00,124.80,24.00 +-163.20,52.80,5.34,0.00,1.00,120.00,-24.00 +-158.40,57.60,5.32,0.00,1.00,115.20,28.80 +-153.60,62.40,5.30,0.00,1.00,110.40,-28.80 +-148.80,67.20,5.28,0.00,1.00,105.60,28.80 +-139.20,72.00,5.26,0.00,1.00,100.80,-28.80 +-129.60,72.00,5.23,0.00,1.00,96.00,28.80 +-115.20,76.80,5.21,0.00,1.00,91.20,-33.60 +-96.00,76.80,5.19,0.00,1.00,86.40,33.60 +-76.80,76.80,5.17,0.00,1.00,81.60,-33.60 +-57.60,72.00,5.15,0.00,1.00,76.80,33.60 +-43.20,72.00,5.13,0.00,1.00,72.00,-28.80 +-33.60,67.20,5.11,0.00,1.00,67.20,28.80 +-28.80,62.40,5.08,0.00,1.00,62.40,-28.80 +-24.00,57.60,5.06,0.00,1.00,57.60,28.80 +-19.20,57.60,5.04,0.00,1.00,52.80,-28.80 +-14.40,52.80,5.02,0.00,1.00,48.00,24.00 +-14.40,48.00,5.00,0.00,1.00,43.20,-24.00 +-14.40,43.20,4.98,0.00,1.00,38.40,19.20 +-9.60,38.40,4.96,0.00,1.00,33.60,-19.20 +-9.60,33.60,4.93,0.00,1.00,28.80,19.20 +-4.80,28.80,4.91,0.00,1.00,24.00,-14.40 +-4.80,24.00,4.89,0.00,1.00,19.20,14.40 +-4.80,19.20,4.87,0.00,1.00,14.40,-9.60 +-4.80,14.40,4.85,0.00,1.00,9.60,9.60 +-0.00,9.60,4.83,0.00,1.00,4.80,-4.80 +-0.00,4.80,4.81,0.00,1.00,0.00,4.80 +0.00,0.00,4.79,0.00,1.00,-4.80,0.00 +0.00,-4.80,4.76,0.00,1.00,-9.60,4.80 +0.00,-9.60,4.74,0.00,1.00,-14.40,-4.80 +0.00,-14.40,4.72,0.00,1.00,-19.20,9.60 +4.80,-19.20,4.70,0.00,1.00,-24.00,-9.60 +4.80,-24.00,4.68,0.00,1.00,-28.80,14.40 +4.80,-28.80,4.66,0.00,1.00,-33.60,-14.40 +4.80,-33.60,4.64,0.00,1.00,-38.40,19.20 +4.80,-38.40,4.61,0.00,1.00,-43.20,-24.00 +9.60,-43.20,4.59,0.00,1.00,-48.00,24.00 +9.60,-48.00,4.57,0.00,1.00,-52.80,-24.00 +9.60,-52.80,4.55,0.00,1.00,-57.60,28.80 +14.40,-57.60,4.53,0.00,1.00,-62.40,-28.80 +14.40,-62.40,4.51,0.00,1.00,-67.20,33.60 +19.20,-67.20,4.49,0.00,1.00,-72.00,-33.60 +24.00,-72.00,4.46,0.00,1.00,-76.80,33.60 +33.60,-72.00,4.44,0.00,1.00,-81.60,-33.60 +43.20,-76.80,4.42,0.00,1.00,-86.40,38.40 +67.20,-81.60,4.40,0.00,1.00,-91.20,-38.40 +96.00,-81.60,4.38,0.00,1.00,-96.00,38.40 +124.80,-81.60,4.36,0.00,1.00,-100.80,-38.40 +144.00,-76.80,4.34,0.00,1.00,-105.60,33.60 +153.60,-72.00,4.32,0.00,1.00,-110.40,-33.60 +158.40,-67.20,4.29,0.00,1.00,-115.20,33.60 +163.20,-62.40,4.27,0.00,1.00,-120.00,-33.60 +168.00,-57.60,4.25,0.00,1.00,-124.80,28.80 +168.00,-52.80,4.23,0.00,1.00,-129.60,-28.80 +168.00,-48.00,4.21,0.00,1.00,-134.40,28.80 +172.80,-43.20,4.19,0.00,1.00,-139.20,-24.00 +172.80,-38.40,4.17,0.00,1.00,-144.00,24.00 +172.80,-33.60,4.14,0.00,1.00,-148.80,-19.20 +172.80,-28.80,4.12,0.00,1.00,-153.60,19.20 +177.60,-24.00,4.10,0.00,1.00,-158.40,-14.40 +177.60,-19.20,4.08,0.00,1.00,-163.20,14.40 +177.60,-14.40,4.06,0.00,1.00,-168.00,-9.60 +177.60,-9.60,4.04,0.00,1.00,-172.80,4.80 +177.60,-4.80,4.02,0.00,1.00,-177.60,-4.80 +177.60,-0.00,3.99,0.00,1.00,177.60,0.00 +-177.60,0.00,3.97,0.00,1.00,172.80,0.00 +-177.60,4.80,3.95,0.00,1.00,168.00,-4.80 +-177.60,9.60,3.93,0.00,1.00,163.20,4.80 +-177.60,14.40,3.91,0.00,1.00,158.40,-9.60 +-177.60,19.20,3.89,0.00,1.00,153.60,14.40 +-177.60,24.00,3.87,0.00,1.00,148.80,-14.40 +-172.80,28.80,3.85,0.00,1.00,144.00,19.20 +-172.80,33.60,3.82,0.00,1.00,139.20,-19.20 +-172.80,38.40,3.80,0.00,1.00,134.40,24.00 +-172.80,43.20,3.78,0.00,1.00,129.60,-24.00 +-168.00,48.00,3.76,0.00,1.00,124.80,28.80 +-168.00,52.80,3.74,0.00,1.00,120.00,-28.80 +-168.00,57.60,3.72,0.00,1.00,115.20,28.80 +-163.20,62.40,3.70,0.00,1.00,110.40,-33.60 +-158.40,67.20,3.67,0.00,1.00,105.60,33.60 +-153.60,72.00,3.65,0.00,1.00,100.80,-33.60 +-144.00,76.80,3.63,0.00,1.00,96.00,33.60 +-124.80,81.60,3.61,0.00,1.00,91.20,-38.40 +-96.00,81.60,3.59,0.00,1.00,86.40,38.40 +-67.20,81.60,3.57,0.00,1.00,81.60,-38.40 +-43.20,76.80,3.55,0.00,1.00,76.80,38.40 +-33.60,72.00,3.52,0.00,1.00,72.00,-33.60 +-24.00,72.00,3.50,0.00,1.00,67.20,33.60 +-19.20,67.20,3.48,0.00,1.00,62.40,-33.60 +-14.40,62.40,3.46,0.00,1.00,57.60,33.60 +-14.40,57.60,3.44,0.00,1.00,52.80,-28.80 +-9.60,52.80,3.42,0.00,1.00,48.00,28.80 +-9.60,48.00,3.40,0.00,1.00,43.20,-24.00 +-9.60,43.20,3.38,0.00,1.00,38.40,24.00 +-4.80,38.40,3.35,0.00,1.00,33.60,-24.00 +-4.80,33.60,3.33,0.00,1.00,28.80,19.20 +-4.80,28.80,3.31,0.00,1.00,24.00,-14.40 +-4.80,24.00,3.29,0.00,1.00,19.20,14.40 +-4.80,19.20,3.27,0.00,1.00,14.40,-9.60 +-0.00,14.40,3.25,0.00,1.00,9.60,9.60 +-0.00,9.60,3.23,0.00,1.00,4.80,-4.80 +-0.00,4.80,3.20,0.00,1.00,0.00,4.80 +0.00,0.00,3.18,0.00,1.00,-4.80,0.00 +0.00,-4.80,3.16,0.00,1.00,-9.60,4.80 +0.00,-9.60,3.14,0.00,1.00,-14.40,-4.80 +0.00,-14.40,3.12,0.00,1.00,-19.20,9.60 +0.00,-19.20,3.10,0.00,1.00,-24.00,-14.40 +0.00,-24.00,3.08,0.00,1.00,-28.80,14.40 +0.00,-28.80,3.05,0.00,1.00,-33.60,-19.20 +0.00,-33.60,3.03,0.00,1.00,-38.40,19.20 +4.80,-38.40,3.01,0.00,1.00,-43.20,-24.00 +4.80,-43.20,2.99,0.00,1.00,-48.00,28.80 +4.80,-48.00,2.97,0.00,1.00,-52.80,-28.80 +4.80,-52.80,2.95,0.00,1.00,-57.60,33.60 +4.80,-57.60,2.93,0.00,1.00,-62.40,-33.60 +4.80,-62.40,2.91,0.00,1.00,-67.20,33.60 +9.60,-67.20,2.88,0.00,1.00,-72.00,-38.40 +9.60,-72.00,2.86,0.00,1.00,-76.80,38.40 +14.40,-76.80,2.84,0.00,1.00,-81.60,-38.40 +24.00,-81.60,2.82,0.00,1.00,-86.40,43.20 +43.20,-86.40,2.80,0.00,1.00,-91.20,-43.20 +110.40,-86.40,2.78,0.00,1.00,-96.00,43.20 +148.80,-81.60,2.76,0.00,1.00,-100.80,-43.20 +163.20,-76.80,2.73,0.00,1.00,-105.60,38.40 +168.00,-72.00,2.71,0.00,1.00,-110.40,-38.40 +172.80,-67.20,2.69,0.00,1.00,-115.20,38.40 +172.80,-62.40,2.67,0.00,1.00,-120.00,-38.40 +172.80,-57.60,2.65,0.00,1.00,-124.80,33.60 +172.80,-52.80,2.63,0.00,1.00,-129.60,-33.60 +177.60,-48.00,2.61,0.00,1.00,-134.40,28.80 +177.60,-43.20,2.58,0.00,1.00,-139.20,-28.80 +177.60,-38.40,2.56,0.00,1.00,-144.00,24.00 +177.60,-33.60,2.54,0.00,1.00,-148.80,-24.00 +177.60,-28.80,2.52,0.00,1.00,-153.60,19.20 +177.60,-24.00,2.50,0.00,1.00,-158.40,-19.20 +177.60,-19.20,2.48,0.00,1.00,-163.20,14.40 +177.60,-14.40,2.46,0.00,1.00,-168.00,-9.60 +177.60,-9.60,2.44,0.00,1.00,-172.80,9.60 +177.60,-4.80,2.41,0.00,1.00,-177.60,-4.80 +177.60,-0.00,2.39,0.00,1.00,177.60,0.00 +-177.60,0.00,2.37,0.00,1.00,172.80,0.00 +-177.60,4.80,2.35,0.00,1.00,168.00,-4.80 +-177.60,9.60,2.33,0.00,1.00,163.20,9.60 +-177.60,14.40,2.31,0.00,1.00,158.40,-9.60 +-177.60,19.20,2.29,0.00,1.00,153.60,14.40 +-177.60,24.00,2.26,0.00,1.00,148.80,-19.20 +-177.60,28.80,2.24,0.00,1.00,144.00,19.20 +-177.60,33.60,2.22,0.00,1.00,139.20,-24.00 +-177.60,38.40,2.20,0.00,1.00,134.40,24.00 +-177.60,43.20,2.18,0.00,1.00,129.60,-28.80 +-177.60,48.00,2.16,0.00,1.00,124.80,28.80 +-172.80,52.80,2.14,0.00,1.00,120.00,-33.60 +-172.80,57.60,2.11,0.00,1.00,115.20,33.60 +-172.80,62.40,2.09,0.00,1.00,110.40,-38.40 +-172.80,67.20,2.07,0.00,1.00,105.60,38.40 +-168.00,72.00,2.05,0.00,1.00,100.80,-38.40 +-163.20,76.80,2.03,0.00,1.00,96.00,38.40 +-148.80,81.60,2.01,0.00,1.00,91.20,-43.20 +-110.40,86.40,1.99,0.00,1.00,86.40,43.20 +-43.20,86.40,1.97,0.00,1.00,81.60,-43.20 +-24.00,81.60,1.94,0.00,1.00,76.80,43.20 +-14.40,76.80,1.92,0.00,1.00,72.00,-38.40 +-9.60,72.00,1.90,0.00,1.00,67.20,38.40 +-9.60,67.20,1.88,0.00,1.00,62.40,-38.40 +-4.80,62.40,1.86,0.00,1.00,57.60,33.60 +-4.80,57.60,1.84,0.00,1.00,52.80,-33.60 +-4.80,52.80,1.82,0.00,1.00,48.00,33.60 +-4.80,48.00,1.79,0.00,1.00,43.20,-28.80 +-4.80,43.20,1.77,0.00,1.00,38.40,28.80 +-4.80,38.40,1.75,0.00,1.00,33.60,-24.00 +-0.00,33.60,1.73,0.00,1.00,28.80,19.20 +-0.00,28.80,1.71,0.00,1.00,24.00,-19.20 +-0.00,24.00,1.69,0.00,1.00,19.20,14.40 +-0.00,19.20,1.67,0.00,1.00,14.40,-14.40 +-0.00,14.40,1.64,0.00,1.00,9.60,9.60 +-0.00,9.60,1.62,0.00,1.00,4.80,-4.80 +-0.00,4.80,1.60,0.00,1.00,0.00,4.80 +-0.00,0.00,1.58,0.00,1.00,-4.80,0.00 +-0.00,-4.80,1.56,0.00,1.00,-9.60,4.80 +-0.00,-9.60,1.54,0.00,1.00,-14.40,-4.80 +-0.00,-14.40,1.52,0.00,1.00,-19.20,9.60 +-0.00,-19.20,1.50,0.00,1.00,-24.00,-14.40 +-0.00,-24.00,1.47,0.00,1.00,-28.80,19.20 +-0.00,-28.80,1.45,0.00,1.00,-33.60,-19.20 +-0.00,-33.60,1.43,0.00,1.00,-38.40,24.00 +-0.00,-38.40,1.41,0.00,1.00,-43.20,-28.80 +-0.00,-43.20,1.39,0.00,1.00,-48.00,28.80 +-0.00,-48.00,1.37,0.00,1.00,-52.80,-33.60 +-0.00,-52.80,1.35,0.00,1.00,-57.60,33.60 +-0.00,-57.60,1.32,0.00,1.00,-62.40,-38.40 +-0.00,-62.40,1.30,0.00,1.00,-67.20,38.40 +-4.80,-67.20,1.28,0.00,1.00,-72.00,-43.20 +-4.80,-72.00,1.26,0.00,1.00,-76.80,43.20 +-4.80,-76.80,1.24,0.00,1.00,-81.60,-43.20 +-9.60,-81.60,1.22,0.00,1.00,-86.40,43.20 +-19.20,-86.40,1.20,0.00,1.00,-91.20,-48.00 +-134.40,-86.40,1.17,0.00,1.00,-96.00,48.00 +-168.00,-81.60,1.15,0.00,1.00,-100.80,-48.00 +-172.80,-76.80,1.13,0.00,1.00,-105.60,43.20 +-177.60,-72.00,1.11,0.00,1.00,-110.40,-43.20 +-177.60,-67.20,1.09,0.00,1.00,-115.20,43.20 +-177.60,-62.40,1.07,0.00,1.00,-120.00,-38.40 +-177.60,-57.60,1.05,0.00,1.00,-124.80,38.40 +-177.60,-52.80,1.03,0.00,1.00,-129.60,-38.40 +-177.60,-48.00,1.00,0.00,1.00,-134.40,33.60 +-177.60,-43.20,0.98,0.00,1.00,-139.20,-28.80 +-177.60,-38.40,0.96,0.00,1.00,-144.00,28.80 +-177.60,-33.60,0.94,0.00,1.00,-148.80,-24.00 +-177.60,-28.80,0.92,0.00,1.00,-153.60,24.00 +-177.60,-24.00,0.90,0.00,1.00,-158.40,-19.20 +-177.60,-19.20,0.88,0.00,1.00,-163.20,14.40 +-177.60,-14.40,0.85,0.00,1.00,-168.00,-14.40 +-177.60,-9.60,0.83,0.00,1.00,-172.80,9.60 +-177.60,-4.80,0.81,0.00,1.00,-177.60,-4.80 +-177.60,-0.00,0.79,0.00,1.00,177.60,0.00 +177.60,0.00,0.77,0.00,1.00,172.80,0.00 +177.60,4.80,0.75,0.00,1.00,168.00,-4.80 +177.60,9.60,0.73,0.00,1.00,163.20,9.60 +177.60,14.40,0.70,0.00,1.00,158.40,-14.40 +177.60,19.20,0.68,0.00,1.00,153.60,14.40 +177.60,24.00,0.66,0.00,1.00,148.80,-19.20 +177.60,28.80,0.64,0.00,1.00,144.00,24.00 +177.60,33.60,0.62,0.00,1.00,139.20,-24.00 +177.60,38.40,0.60,0.00,1.00,134.40,28.80 +177.60,43.20,0.58,0.00,1.00,129.60,-28.80 +177.60,48.00,0.56,0.00,1.00,124.80,33.60 +177.60,52.80,0.53,0.00,1.00,120.00,-38.40 +177.60,57.60,0.51,0.00,1.00,115.20,38.40 +177.60,62.40,0.49,0.00,1.00,110.40,-38.40 +177.60,67.20,0.47,0.00,1.00,105.60,43.20 +177.60,72.00,0.45,0.00,1.00,100.80,-43.20 +172.80,76.80,0.43,0.00,1.00,96.00,43.20 +168.00,81.60,0.41,0.00,1.00,91.20,-48.00 +134.40,86.40,0.38,0.00,1.00,86.40,48.00 +19.20,86.40,0.36,0.00,1.00,81.60,-48.00 +9.60,81.60,0.34,0.00,1.00,76.80,43.20 +4.80,76.80,0.32,0.00,1.00,72.00,-43.20 +4.80,72.00,0.30,0.00,1.00,67.20,43.20 +4.80,67.20,0.28,0.00,1.00,62.40,-43.20 +0.00,62.40,0.26,0.00,1.00,57.60,38.40 +0.00,57.60,0.23,0.00,1.00,52.80,-38.40 +0.00,52.80,0.21,0.00,1.00,48.00,33.60 +0.00,48.00,0.19,0.00,1.00,43.20,-33.60 +0.00,43.20,0.17,0.00,1.00,38.40,28.80 +0.00,38.40,0.15,0.00,1.00,33.60,-28.80 +0.00,33.60,0.13,0.00,1.00,28.80,24.00 +0.00,28.80,0.11,0.00,1.00,24.00,-19.20 +0.00,24.00,0.09,0.00,1.00,19.20,19.20 +0.00,19.20,0.06,0.00,1.00,14.40,-14.40 +0.00,14.40,0.04,0.00,1.00,9.60,9.60 +0.00,9.60,0.02,0.00,1.00,4.80,-4.80 +0.00,4.80,0.00,0.00,1.00,0.00,4.80 diff --git a/scripts/testv/stvISM2.csv b/scripts/testv/stvISM2.csv index dcd3fee39c..35698d046f 100644 --- a/scripts/testv/stvISM2.csv +++ b/scripts/testv/stvISM2.csv @@ -1,1500 +1,1500 @@ -0.00,4.80,1.00,0.00,1.00 -0.00,9.60,1.00,0.00,1.00 -0.00,14.40,1.00,0.00,1.00 -0.00,19.20,1.00,0.00,1.00 -0.00,24.00,1.00,0.00,1.00 -0.00,28.80,1.00,0.00,1.00 -0.00,33.60,1.00,0.00,1.00 -0.00,38.40,1.00,0.00,1.00 -0.00,43.20,1.00,0.00,1.00 -0.00,48.00,1.00,0.00,1.00 -0.00,52.80,1.00,0.00,1.00 -0.00,57.60,1.00,0.00,1.00 -0.00,62.40,1.00,0.00,1.00 -4.80,67.20,1.00,0.00,1.00 -4.80,72.00,1.00,0.00,1.00 -4.80,76.80,1.00,0.00,1.00 -9.60,81.60,1.00,0.00,1.00 -19.20,86.40,1.00,0.00,1.00 -134.40,86.40,1.00,0.00,1.00 -168.00,81.60,1.00,0.00,1.00 -172.80,76.80,1.00,0.00,1.00 -177.60,72.00,1.00,0.00,1.00 -177.60,67.20,1.00,0.00,1.00 -177.60,62.40,1.00,0.00,1.00 -177.60,57.60,1.00,0.00,1.00 -177.60,52.80,1.00,0.00,1.00 -177.60,48.00,1.00,0.00,1.00 -177.60,43.20,1.00,0.00,1.00 -177.60,38.40,1.00,0.00,1.00 -177.60,33.60,1.00,0.00,1.00 -177.60,28.80,1.00,0.00,1.00 -177.60,24.00,1.00,0.00,1.00 -177.60,19.20,1.00,0.00,1.00 -177.60,14.40,1.00,0.00,1.00 -177.60,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --177.60,-9.60,1.00,0.00,1.00 --177.60,-14.40,1.00,0.00,1.00 --177.60,-19.20,1.00,0.00,1.00 --177.60,-24.00,1.00,0.00,1.00 --177.60,-28.80,1.00,0.00,1.00 --177.60,-33.60,1.00,0.00,1.00 --177.60,-38.40,1.00,0.00,1.00 --177.60,-43.20,1.00,0.00,1.00 --177.60,-48.00,1.00,0.00,1.00 --177.60,-52.80,1.00,0.00,1.00 --177.60,-57.60,1.00,0.00,1.00 --177.60,-62.40,1.00,0.00,1.00 --177.60,-67.20,1.00,0.00,1.00 --177.60,-72.00,1.00,0.00,1.00 --172.80,-76.80,1.00,0.00,1.00 --168.00,-81.60,1.00,0.00,1.00 --134.40,-86.40,1.00,0.00,1.00 --19.20,-86.40,1.00,0.00,1.00 --9.60,-81.60,1.00,0.00,1.00 --4.80,-76.80,1.00,0.00,1.00 --4.80,-72.00,1.00,0.00,1.00 --4.80,-67.20,1.00,0.00,1.00 --0.00,-62.40,1.00,0.00,1.00 --0.00,-57.60,1.00,0.00,1.00 --0.00,-52.80,1.00,0.00,1.00 --0.00,-48.00,1.00,0.00,1.00 --0.00,-43.20,1.00,0.00,1.00 --0.00,-38.40,1.00,0.00,1.00 --0.00,-33.60,1.00,0.00,1.00 --0.00,-28.80,1.00,0.00,1.00 --0.00,-24.00,1.00,0.00,1.00 --0.00,-19.20,1.00,0.00,1.00 --0.00,-14.40,1.00,0.00,1.00 --0.00,-9.60,1.00,0.00,1.00 --0.00,-4.80,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 --0.00,9.60,1.00,0.00,1.00 --0.00,14.40,1.00,0.00,1.00 --0.00,19.20,1.00,0.00,1.00 --0.00,24.00,1.00,0.00,1.00 --0.00,28.80,1.00,0.00,1.00 --0.00,33.60,1.00,0.00,1.00 --4.80,38.40,1.00,0.00,1.00 --4.80,43.20,1.00,0.00,1.00 --4.80,48.00,1.00,0.00,1.00 --4.80,52.80,1.00,0.00,1.00 --4.80,57.60,1.00,0.00,1.00 --4.80,62.40,1.00,0.00,1.00 --9.60,67.20,1.00,0.00,1.00 --9.60,72.00,1.00,0.00,1.00 --14.40,76.80,1.00,0.00,1.00 --24.00,81.60,1.00,0.00,1.00 --43.20,86.40,1.00,0.00,1.00 --110.40,86.40,1.00,0.00,1.00 --148.80,81.60,1.00,0.00,1.00 --163.20,76.80,1.00,0.00,1.00 --168.00,72.00,1.00,0.00,1.00 --172.80,67.20,1.00,0.00,1.00 --172.80,62.40,1.00,0.00,1.00 --172.80,57.60,1.00,0.00,1.00 --172.80,52.80,1.00,0.00,1.00 --177.60,48.00,1.00,0.00,1.00 --177.60,43.20,1.00,0.00,1.00 --177.60,38.40,1.00,0.00,1.00 --177.60,33.60,1.00,0.00,1.00 --177.60,28.80,1.00,0.00,1.00 --177.60,24.00,1.00,0.00,1.00 --177.60,19.20,1.00,0.00,1.00 --177.60,14.40,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -177.60,-14.40,1.00,0.00,1.00 -177.60,-19.20,1.00,0.00,1.00 -177.60,-24.00,1.00,0.00,1.00 -177.60,-28.80,1.00,0.00,1.00 -177.60,-33.60,1.00,0.00,1.00 -177.60,-38.40,1.00,0.00,1.00 -177.60,-43.20,1.00,0.00,1.00 -177.60,-48.00,1.00,0.00,1.00 -172.80,-52.80,1.00,0.00,1.00 -172.80,-57.60,1.00,0.00,1.00 -172.80,-62.40,1.00,0.00,1.00 -172.80,-67.20,1.00,0.00,1.00 -168.00,-72.00,1.00,0.00,1.00 -163.20,-76.80,1.00,0.00,1.00 -148.80,-81.60,1.00,0.00,1.00 -110.40,-86.40,1.00,0.00,1.00 -43.20,-86.40,1.00,0.00,1.00 -24.00,-81.60,1.00,0.00,1.00 -14.40,-76.80,1.00,0.00,1.00 -9.60,-72.00,1.00,0.00,1.00 -9.60,-67.20,1.00,0.00,1.00 -4.80,-62.40,1.00,0.00,1.00 -4.80,-57.60,1.00,0.00,1.00 -4.80,-52.80,1.00,0.00,1.00 -4.80,-48.00,1.00,0.00,1.00 -4.80,-43.20,1.00,0.00,1.00 -4.80,-38.40,1.00,0.00,1.00 -0.00,-33.60,1.00,0.00,1.00 -0.00,-28.80,1.00,0.00,1.00 -0.00,-24.00,1.00,0.00,1.00 -0.00,-19.20,1.00,0.00,1.00 -0.00,-14.40,1.00,0.00,1.00 -0.00,-9.60,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 --0.00,9.60,1.00,0.00,1.00 --0.00,14.40,1.00,0.00,1.00 --4.80,19.20,1.00,0.00,1.00 --4.80,24.00,1.00,0.00,1.00 --4.80,28.80,1.00,0.00,1.00 --4.80,33.60,1.00,0.00,1.00 --4.80,38.40,1.00,0.00,1.00 --9.60,43.20,1.00,0.00,1.00 --9.60,48.00,1.00,0.00,1.00 --9.60,52.80,1.00,0.00,1.00 --14.40,57.60,1.00,0.00,1.00 --14.40,62.40,1.00,0.00,1.00 --19.20,67.20,1.00,0.00,1.00 --24.00,72.00,1.00,0.00,1.00 --33.60,72.00,1.00,0.00,1.00 --43.20,76.80,1.00,0.00,1.00 --67.20,81.60,1.00,0.00,1.00 --96.00,81.60,1.00,0.00,1.00 --124.80,81.60,1.00,0.00,1.00 --144.00,76.80,1.00,0.00,1.00 --153.60,72.00,1.00,0.00,1.00 --158.40,67.20,1.00,0.00,1.00 --163.20,62.40,1.00,0.00,1.00 --168.00,57.60,1.00,0.00,1.00 --168.00,52.80,1.00,0.00,1.00 --168.00,48.00,1.00,0.00,1.00 --172.80,43.20,1.00,0.00,1.00 --172.80,38.40,1.00,0.00,1.00 --172.80,33.60,1.00,0.00,1.00 --172.80,28.80,1.00,0.00,1.00 --177.60,24.00,1.00,0.00,1.00 --177.60,19.20,1.00,0.00,1.00 --177.60,14.40,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -177.60,-14.40,1.00,0.00,1.00 -177.60,-19.20,1.00,0.00,1.00 -177.60,-24.00,1.00,0.00,1.00 -172.80,-28.80,1.00,0.00,1.00 -172.80,-33.60,1.00,0.00,1.00 -172.80,-38.40,1.00,0.00,1.00 -172.80,-43.20,1.00,0.00,1.00 -168.00,-48.00,1.00,0.00,1.00 -168.00,-52.80,1.00,0.00,1.00 -168.00,-57.60,1.00,0.00,1.00 -163.20,-62.40,1.00,0.00,1.00 -158.40,-67.20,1.00,0.00,1.00 -153.60,-72.00,1.00,0.00,1.00 -144.00,-76.80,1.00,0.00,1.00 -124.80,-81.60,1.00,0.00,1.00 -96.00,-81.60,1.00,0.00,1.00 -67.20,-81.60,1.00,0.00,1.00 -43.20,-76.80,1.00,0.00,1.00 -33.60,-72.00,1.00,0.00,1.00 -24.00,-72.00,1.00,0.00,1.00 -19.20,-67.20,1.00,0.00,1.00 -14.40,-62.40,1.00,0.00,1.00 -14.40,-57.60,1.00,0.00,1.00 -9.60,-52.80,1.00,0.00,1.00 -9.60,-48.00,1.00,0.00,1.00 -9.60,-43.20,1.00,0.00,1.00 -4.80,-38.40,1.00,0.00,1.00 -4.80,-33.60,1.00,0.00,1.00 -4.80,-28.80,1.00,0.00,1.00 -4.80,-24.00,1.00,0.00,1.00 -4.80,-19.20,1.00,0.00,1.00 -0.00,-14.40,1.00,0.00,1.00 -0.00,-9.60,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 --0.00,9.60,1.00,0.00,1.00 --4.80,14.40,1.00,0.00,1.00 --4.80,19.20,1.00,0.00,1.00 --4.80,24.00,1.00,0.00,1.00 --4.80,28.80,1.00,0.00,1.00 --9.60,33.60,1.00,0.00,1.00 --9.60,38.40,1.00,0.00,1.00 --14.40,43.20,1.00,0.00,1.00 --14.40,48.00,1.00,0.00,1.00 --14.40,52.80,1.00,0.00,1.00 --19.20,57.60,1.00,0.00,1.00 --24.00,57.60,1.00,0.00,1.00 --28.80,62.40,1.00,0.00,1.00 --33.60,67.20,1.00,0.00,1.00 --43.20,72.00,1.00,0.00,1.00 --57.60,72.00,1.00,0.00,1.00 --76.80,76.80,1.00,0.00,1.00 --96.00,76.80,1.00,0.00,1.00 --115.20,76.80,1.00,0.00,1.00 --129.60,72.00,1.00,0.00,1.00 --139.20,72.00,1.00,0.00,1.00 --148.80,67.20,1.00,0.00,1.00 --153.60,62.40,1.00,0.00,1.00 --158.40,57.60,1.00,0.00,1.00 --163.20,52.80,1.00,0.00,1.00 --163.20,48.00,1.00,0.00,1.00 --168.00,43.20,1.00,0.00,1.00 --168.00,38.40,1.00,0.00,1.00 --172.80,33.60,1.00,0.00,1.00 --172.80,28.80,1.00,0.00,1.00 --172.80,24.00,1.00,0.00,1.00 --172.80,19.20,1.00,0.00,1.00 --177.60,14.40,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -177.60,-14.40,1.00,0.00,1.00 -172.80,-19.20,1.00,0.00,1.00 -172.80,-24.00,1.00,0.00,1.00 -172.80,-28.80,1.00,0.00,1.00 -172.80,-33.60,1.00,0.00,1.00 -168.00,-38.40,1.00,0.00,1.00 -168.00,-43.20,1.00,0.00,1.00 -163.20,-48.00,1.00,0.00,1.00 -163.20,-52.80,1.00,0.00,1.00 -158.40,-57.60,1.00,0.00,1.00 -153.60,-62.40,1.00,0.00,1.00 -148.80,-67.20,1.00,0.00,1.00 -139.20,-72.00,1.00,0.00,1.00 -129.60,-72.00,1.00,0.00,1.00 -115.20,-76.80,1.00,0.00,1.00 -96.00,-76.80,1.00,0.00,1.00 -76.80,-76.80,1.00,0.00,1.00 -57.60,-72.00,1.00,0.00,1.00 -43.20,-72.00,1.00,0.00,1.00 -33.60,-67.20,1.00,0.00,1.00 -28.80,-62.40,1.00,0.00,1.00 -24.00,-57.60,1.00,0.00,1.00 -19.20,-57.60,1.00,0.00,1.00 -14.40,-52.80,1.00,0.00,1.00 -14.40,-48.00,1.00,0.00,1.00 -14.40,-43.20,1.00,0.00,1.00 -9.60,-38.40,1.00,0.00,1.00 -9.60,-33.60,1.00,0.00,1.00 -4.80,-28.80,1.00,0.00,1.00 -4.80,-24.00,1.00,0.00,1.00 -4.80,-19.20,1.00,0.00,1.00 -4.80,-14.40,1.00,0.00,1.00 -0.00,-9.60,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --4.80,14.40,1.00,0.00,1.00 --4.80,19.20,1.00,0.00,1.00 --9.60,24.00,1.00,0.00,1.00 --9.60,28.80,1.00,0.00,1.00 --9.60,33.60,1.00,0.00,1.00 --14.40,38.40,1.00,0.00,1.00 --14.40,38.40,1.00,0.00,1.00 --19.20,43.20,1.00,0.00,1.00 --24.00,48.00,1.00,0.00,1.00 --24.00,52.80,1.00,0.00,1.00 --28.80,57.60,1.00,0.00,1.00 --38.40,62.40,1.00,0.00,1.00 --43.20,62.40,1.00,0.00,1.00 --52.80,67.20,1.00,0.00,1.00 --62.40,72.00,1.00,0.00,1.00 --76.80,72.00,1.00,0.00,1.00 --96.00,72.00,1.00,0.00,1.00 --110.40,72.00,1.00,0.00,1.00 --120.00,67.20,1.00,0.00,1.00 --134.40,67.20,1.00,0.00,1.00 --139.20,62.40,1.00,0.00,1.00 --148.80,57.60,1.00,0.00,1.00 --153.60,57.60,1.00,0.00,1.00 --158.40,52.80,1.00,0.00,1.00 --158.40,48.00,1.00,0.00,1.00 --163.20,43.20,1.00,0.00,1.00 --163.20,38.40,1.00,0.00,1.00 --168.00,33.60,1.00,0.00,1.00 --168.00,28.80,1.00,0.00,1.00 --172.80,24.00,1.00,0.00,1.00 --172.80,19.20,1.00,0.00,1.00 --172.80,14.40,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -172.80,-14.40,1.00,0.00,1.00 -172.80,-19.20,1.00,0.00,1.00 -172.80,-24.00,1.00,0.00,1.00 -168.00,-28.80,1.00,0.00,1.00 -168.00,-33.60,1.00,0.00,1.00 -163.20,-38.40,1.00,0.00,1.00 -163.20,-43.20,1.00,0.00,1.00 -158.40,-48.00,1.00,0.00,1.00 -158.40,-52.80,1.00,0.00,1.00 -153.60,-57.60,1.00,0.00,1.00 -148.80,-57.60,1.00,0.00,1.00 -139.20,-62.40,1.00,0.00,1.00 -134.40,-67.20,1.00,0.00,1.00 -120.00,-67.20,1.00,0.00,1.00 -110.40,-72.00,1.00,0.00,1.00 -96.00,-72.00,1.00,0.00,1.00 -76.80,-72.00,1.00,0.00,1.00 -62.40,-72.00,1.00,0.00,1.00 -52.80,-67.20,1.00,0.00,1.00 -43.20,-62.40,1.00,0.00,1.00 -38.40,-62.40,1.00,0.00,1.00 -28.80,-57.60,1.00,0.00,1.00 -24.00,-52.80,1.00,0.00,1.00 -24.00,-48.00,1.00,0.00,1.00 -19.20,-43.20,1.00,0.00,1.00 -14.40,-38.40,1.00,0.00,1.00 -14.40,-38.40,1.00,0.00,1.00 -9.60,-33.60,1.00,0.00,1.00 -9.60,-28.80,1.00,0.00,1.00 -9.60,-24.00,1.00,0.00,1.00 -4.80,-19.20,1.00,0.00,1.00 -4.80,-14.40,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --4.80,14.40,1.00,0.00,1.00 --9.60,19.20,1.00,0.00,1.00 --9.60,24.00,1.00,0.00,1.00 --14.40,24.00,1.00,0.00,1.00 --14.40,28.80,1.00,0.00,1.00 --19.20,33.60,1.00,0.00,1.00 --19.20,38.40,1.00,0.00,1.00 --24.00,43.20,1.00,0.00,1.00 --28.80,48.00,1.00,0.00,1.00 --33.60,52.80,1.00,0.00,1.00 --38.40,52.80,1.00,0.00,1.00 --43.20,57.60,1.00,0.00,1.00 --48.00,62.40,1.00,0.00,1.00 --57.60,62.40,1.00,0.00,1.00 --67.20,67.20,1.00,0.00,1.00 --81.60,67.20,1.00,0.00,1.00 --91.20,67.20,1.00,0.00,1.00 --105.60,67.20,1.00,0.00,1.00 --115.20,67.20,1.00,0.00,1.00 --124.80,62.40,1.00,0.00,1.00 --134.40,57.60,1.00,0.00,1.00 --139.20,57.60,1.00,0.00,1.00 --144.00,52.80,1.00,0.00,1.00 --148.80,48.00,1.00,0.00,1.00 --153.60,43.20,1.00,0.00,1.00 --158.40,43.20,1.00,0.00,1.00 --163.20,38.40,1.00,0.00,1.00 --163.20,33.60,1.00,0.00,1.00 --168.00,28.80,1.00,0.00,1.00 --168.00,24.00,1.00,0.00,1.00 --172.80,19.20,1.00,0.00,1.00 --172.80,14.40,1.00,0.00,1.00 --177.60,9.60,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -177.60,-9.60,1.00,0.00,1.00 -172.80,-14.40,1.00,0.00,1.00 -172.80,-19.20,1.00,0.00,1.00 -168.00,-24.00,1.00,0.00,1.00 -168.00,-28.80,1.00,0.00,1.00 -163.20,-33.60,1.00,0.00,1.00 -163.20,-38.40,1.00,0.00,1.00 -158.40,-43.20,1.00,0.00,1.00 -153.60,-43.20,1.00,0.00,1.00 -148.80,-48.00,1.00,0.00,1.00 -144.00,-52.80,1.00,0.00,1.00 -139.20,-57.60,1.00,0.00,1.00 -134.40,-57.60,1.00,0.00,1.00 -124.80,-62.40,1.00,0.00,1.00 -115.20,-67.20,1.00,0.00,1.00 -105.60,-67.20,1.00,0.00,1.00 -91.20,-67.20,1.00,0.00,1.00 -81.60,-67.20,1.00,0.00,1.00 -67.20,-67.20,1.00,0.00,1.00 -57.60,-62.40,1.00,0.00,1.00 -48.00,-62.40,1.00,0.00,1.00 -43.20,-57.60,1.00,0.00,1.00 -38.40,-52.80,1.00,0.00,1.00 -33.60,-52.80,1.00,0.00,1.00 -28.80,-48.00,1.00,0.00,1.00 -24.00,-43.20,1.00,0.00,1.00 -19.20,-38.40,1.00,0.00,1.00 -19.20,-33.60,1.00,0.00,1.00 -14.40,-28.80,1.00,0.00,1.00 -14.40,-24.00,1.00,0.00,1.00 -9.60,-24.00,1.00,0.00,1.00 -9.60,-19.20,1.00,0.00,1.00 -4.80,-14.40,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --4.80,14.40,1.00,0.00,1.00 --9.60,19.20,1.00,0.00,1.00 --9.60,19.20,1.00,0.00,1.00 --14.40,24.00,1.00,0.00,1.00 --19.20,28.80,1.00,0.00,1.00 --19.20,33.60,1.00,0.00,1.00 --24.00,38.40,1.00,0.00,1.00 --28.80,43.20,1.00,0.00,1.00 --33.60,43.20,1.00,0.00,1.00 --38.40,48.00,1.00,0.00,1.00 --43.20,52.80,1.00,0.00,1.00 --48.00,52.80,1.00,0.00,1.00 --52.80,57.60,1.00,0.00,1.00 --62.40,57.60,1.00,0.00,1.00 --72.00,62.40,1.00,0.00,1.00 --81.60,62.40,1.00,0.00,1.00 --91.20,62.40,1.00,0.00,1.00 --100.80,62.40,1.00,0.00,1.00 --110.40,62.40,1.00,0.00,1.00 --120.00,57.60,1.00,0.00,1.00 --129.60,57.60,1.00,0.00,1.00 --134.40,52.80,1.00,0.00,1.00 --139.20,48.00,1.00,0.00,1.00 --144.00,48.00,1.00,0.00,1.00 --148.80,43.20,1.00,0.00,1.00 --153.60,38.40,1.00,0.00,1.00 --158.40,33.60,1.00,0.00,1.00 --163.20,33.60,1.00,0.00,1.00 --163.20,28.80,1.00,0.00,1.00 --168.00,24.00,1.00,0.00,1.00 --168.00,19.20,1.00,0.00,1.00 --172.80,14.40,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -172.80,-14.40,1.00,0.00,1.00 -168.00,-19.20,1.00,0.00,1.00 -168.00,-24.00,1.00,0.00,1.00 -163.20,-28.80,1.00,0.00,1.00 -163.20,-33.60,1.00,0.00,1.00 -158.40,-33.60,1.00,0.00,1.00 -153.60,-38.40,1.00,0.00,1.00 -148.80,-43.20,1.00,0.00,1.00 -144.00,-48.00,1.00,0.00,1.00 -139.20,-48.00,1.00,0.00,1.00 -134.40,-52.80,1.00,0.00,1.00 -129.60,-57.60,1.00,0.00,1.00 -120.00,-57.60,1.00,0.00,1.00 -110.40,-62.40,1.00,0.00,1.00 -100.80,-62.40,1.00,0.00,1.00 -91.20,-62.40,1.00,0.00,1.00 -81.60,-62.40,1.00,0.00,1.00 -72.00,-62.40,1.00,0.00,1.00 -62.40,-57.60,1.00,0.00,1.00 -52.80,-57.60,1.00,0.00,1.00 -48.00,-52.80,1.00,0.00,1.00 -43.20,-52.80,1.00,0.00,1.00 -38.40,-48.00,1.00,0.00,1.00 -33.60,-43.20,1.00,0.00,1.00 -28.80,-43.20,1.00,0.00,1.00 -24.00,-38.40,1.00,0.00,1.00 -19.20,-33.60,1.00,0.00,1.00 -19.20,-28.80,1.00,0.00,1.00 -14.40,-24.00,1.00,0.00,1.00 -9.60,-19.20,1.00,0.00,1.00 -9.60,-19.20,1.00,0.00,1.00 -4.80,-14.40,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --9.60,14.40,1.00,0.00,1.00 --9.60,14.40,1.00,0.00,1.00 --14.40,19.20,1.00,0.00,1.00 --14.40,24.00,1.00,0.00,1.00 --19.20,28.80,1.00,0.00,1.00 --24.00,33.60,1.00,0.00,1.00 --28.80,33.60,1.00,0.00,1.00 --28.80,38.40,1.00,0.00,1.00 --33.60,43.20,1.00,0.00,1.00 --38.40,43.20,1.00,0.00,1.00 --48.00,48.00,1.00,0.00,1.00 --52.80,52.80,1.00,0.00,1.00 --57.60,52.80,1.00,0.00,1.00 --67.20,57.60,1.00,0.00,1.00 --76.80,57.60,1.00,0.00,1.00 --81.60,57.60,1.00,0.00,1.00 --91.20,57.60,1.00,0.00,1.00 --100.80,57.60,1.00,0.00,1.00 --110.40,57.60,1.00,0.00,1.00 --115.20,52.80,1.00,0.00,1.00 --124.80,52.80,1.00,0.00,1.00 --129.60,48.00,1.00,0.00,1.00 --139.20,48.00,1.00,0.00,1.00 --144.00,43.20,1.00,0.00,1.00 --148.80,38.40,1.00,0.00,1.00 --153.60,38.40,1.00,0.00,1.00 --153.60,33.60,1.00,0.00,1.00 --158.40,28.80,1.00,0.00,1.00 --163.20,24.00,1.00,0.00,1.00 --163.20,24.00,1.00,0.00,1.00 --168.00,19.20,1.00,0.00,1.00 --172.80,14.40,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -172.80,-14.40,1.00,0.00,1.00 -168.00,-19.20,1.00,0.00,1.00 -163.20,-24.00,1.00,0.00,1.00 -163.20,-24.00,1.00,0.00,1.00 -158.40,-28.80,1.00,0.00,1.00 -153.60,-33.60,1.00,0.00,1.00 -153.60,-38.40,1.00,0.00,1.00 -148.80,-38.40,1.00,0.00,1.00 -144.00,-43.20,1.00,0.00,1.00 -139.20,-48.00,1.00,0.00,1.00 -129.60,-48.00,1.00,0.00,1.00 -124.80,-52.80,1.00,0.00,1.00 -115.20,-52.80,1.00,0.00,1.00 -110.40,-57.60,1.00,0.00,1.00 -100.80,-57.60,1.00,0.00,1.00 -91.20,-57.60,1.00,0.00,1.00 -81.60,-57.60,1.00,0.00,1.00 -76.80,-57.60,1.00,0.00,1.00 -67.20,-57.60,1.00,0.00,1.00 -57.60,-52.80,1.00,0.00,1.00 -52.80,-52.80,1.00,0.00,1.00 -48.00,-48.00,1.00,0.00,1.00 -38.40,-43.20,1.00,0.00,1.00 -33.60,-43.20,1.00,0.00,1.00 -28.80,-38.40,1.00,0.00,1.00 -28.80,-33.60,1.00,0.00,1.00 -24.00,-33.60,1.00,0.00,1.00 -19.20,-28.80,1.00,0.00,1.00 -14.40,-24.00,1.00,0.00,1.00 -14.40,-19.20,1.00,0.00,1.00 -9.60,-14.40,1.00,0.00,1.00 -9.60,-14.40,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --4.80,9.60,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 --9.60,14.40,1.00,0.00,1.00 --14.40,19.20,1.00,0.00,1.00 --19.20,24.00,1.00,0.00,1.00 --24.00,24.00,1.00,0.00,1.00 --24.00,28.80,1.00,0.00,1.00 --28.80,33.60,1.00,0.00,1.00 --33.60,38.40,1.00,0.00,1.00 --38.40,38.40,1.00,0.00,1.00 --43.20,43.20,1.00,0.00,1.00 --48.00,43.20,1.00,0.00,1.00 --52.80,48.00,1.00,0.00,1.00 --62.40,48.00,1.00,0.00,1.00 --67.20,52.80,1.00,0.00,1.00 --76.80,52.80,1.00,0.00,1.00 --86.40,52.80,1.00,0.00,1.00 --91.20,52.80,1.00,0.00,1.00 --100.80,52.80,1.00,0.00,1.00 --105.60,52.80,1.00,0.00,1.00 --115.20,48.00,1.00,0.00,1.00 --120.00,48.00,1.00,0.00,1.00 --129.60,48.00,1.00,0.00,1.00 --134.40,43.20,1.00,0.00,1.00 --139.20,43.20,1.00,0.00,1.00 --144.00,38.40,1.00,0.00,1.00 --148.80,33.60,1.00,0.00,1.00 --153.60,33.60,1.00,0.00,1.00 --158.40,28.80,1.00,0.00,1.00 --158.40,24.00,1.00,0.00,1.00 --163.20,19.20,1.00,0.00,1.00 --168.00,19.20,1.00,0.00,1.00 --168.00,14.40,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -177.60,-4.80,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -168.00,-14.40,1.00,0.00,1.00 -168.00,-19.20,1.00,0.00,1.00 -163.20,-19.20,1.00,0.00,1.00 -158.40,-24.00,1.00,0.00,1.00 -158.40,-28.80,1.00,0.00,1.00 -153.60,-33.60,1.00,0.00,1.00 -148.80,-33.60,1.00,0.00,1.00 -144.00,-38.40,1.00,0.00,1.00 -139.20,-43.20,1.00,0.00,1.00 -134.40,-43.20,1.00,0.00,1.00 -129.60,-48.00,1.00,0.00,1.00 -120.00,-48.00,1.00,0.00,1.00 -115.20,-48.00,1.00,0.00,1.00 -105.60,-52.80,1.00,0.00,1.00 -100.80,-52.80,1.00,0.00,1.00 -91.20,-52.80,1.00,0.00,1.00 -86.40,-52.80,1.00,0.00,1.00 -76.80,-52.80,1.00,0.00,1.00 -67.20,-52.80,1.00,0.00,1.00 -62.40,-48.00,1.00,0.00,1.00 -52.80,-48.00,1.00,0.00,1.00 -48.00,-43.20,1.00,0.00,1.00 -43.20,-43.20,1.00,0.00,1.00 -38.40,-38.40,1.00,0.00,1.00 -33.60,-38.40,1.00,0.00,1.00 -28.80,-33.60,1.00,0.00,1.00 -24.00,-28.80,1.00,0.00,1.00 -24.00,-24.00,1.00,0.00,1.00 -19.20,-24.00,1.00,0.00,1.00 -14.40,-19.20,1.00,0.00,1.00 -9.60,-14.40,1.00,0.00,1.00 -9.60,-9.60,1.00,0.00,1.00 -4.80,-9.60,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 --14.40,14.40,1.00,0.00,1.00 --14.40,19.20,1.00,0.00,1.00 --19.20,19.20,1.00,0.00,1.00 --24.00,24.00,1.00,0.00,1.00 --28.80,28.80,1.00,0.00,1.00 --33.60,28.80,1.00,0.00,1.00 --38.40,33.60,1.00,0.00,1.00 --43.20,38.40,1.00,0.00,1.00 --48.00,38.40,1.00,0.00,1.00 --52.80,43.20,1.00,0.00,1.00 --57.60,43.20,1.00,0.00,1.00 --62.40,43.20,1.00,0.00,1.00 --72.00,48.00,1.00,0.00,1.00 --76.80,48.00,1.00,0.00,1.00 --86.40,48.00,1.00,0.00,1.00 --91.20,48.00,1.00,0.00,1.00 --100.80,48.00,1.00,0.00,1.00 --105.60,48.00,1.00,0.00,1.00 --110.40,48.00,1.00,0.00,1.00 --120.00,43.20,1.00,0.00,1.00 --124.80,43.20,1.00,0.00,1.00 --129.60,38.40,1.00,0.00,1.00 --134.40,38.40,1.00,0.00,1.00 --139.20,33.60,1.00,0.00,1.00 --144.00,33.60,1.00,0.00,1.00 --148.80,28.80,1.00,0.00,1.00 --153.60,24.00,1.00,0.00,1.00 --158.40,24.00,1.00,0.00,1.00 --163.20,19.20,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 --168.00,14.40,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -168.00,-14.40,1.00,0.00,1.00 -163.20,-14.40,1.00,0.00,1.00 -163.20,-19.20,1.00,0.00,1.00 -158.40,-24.00,1.00,0.00,1.00 -153.60,-24.00,1.00,0.00,1.00 -148.80,-28.80,1.00,0.00,1.00 -144.00,-33.60,1.00,0.00,1.00 -139.20,-33.60,1.00,0.00,1.00 -134.40,-38.40,1.00,0.00,1.00 -129.60,-38.40,1.00,0.00,1.00 -124.80,-43.20,1.00,0.00,1.00 -120.00,-43.20,1.00,0.00,1.00 -110.40,-48.00,1.00,0.00,1.00 -105.60,-48.00,1.00,0.00,1.00 -100.80,-48.00,1.00,0.00,1.00 -91.20,-48.00,1.00,0.00,1.00 -86.40,-48.00,1.00,0.00,1.00 -76.80,-48.00,1.00,0.00,1.00 -72.00,-48.00,1.00,0.00,1.00 -62.40,-43.20,1.00,0.00,1.00 -57.60,-43.20,1.00,0.00,1.00 -52.80,-43.20,1.00,0.00,1.00 -48.00,-38.40,1.00,0.00,1.00 -43.20,-38.40,1.00,0.00,1.00 -38.40,-33.60,1.00,0.00,1.00 -33.60,-28.80,1.00,0.00,1.00 -28.80,-28.80,1.00,0.00,1.00 -24.00,-24.00,1.00,0.00,1.00 -19.20,-19.20,1.00,0.00,1.00 -14.40,-19.20,1.00,0.00,1.00 -14.40,-14.40,1.00,0.00,1.00 -9.60,-9.60,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 --14.40,14.40,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 --24.00,19.20,1.00,0.00,1.00 --24.00,24.00,1.00,0.00,1.00 --28.80,24.00,1.00,0.00,1.00 --33.60,28.80,1.00,0.00,1.00 --38.40,28.80,1.00,0.00,1.00 --43.20,33.60,1.00,0.00,1.00 --48.00,33.60,1.00,0.00,1.00 --52.80,38.40,1.00,0.00,1.00 --62.40,38.40,1.00,0.00,1.00 --67.20,38.40,1.00,0.00,1.00 --72.00,43.20,1.00,0.00,1.00 --76.80,43.20,1.00,0.00,1.00 --86.40,43.20,1.00,0.00,1.00 --91.20,43.20,1.00,0.00,1.00 --96.00,43.20,1.00,0.00,1.00 --105.60,43.20,1.00,0.00,1.00 --110.40,43.20,1.00,0.00,1.00 --115.20,38.40,1.00,0.00,1.00 --124.80,38.40,1.00,0.00,1.00 --129.60,38.40,1.00,0.00,1.00 --134.40,33.60,1.00,0.00,1.00 --139.20,33.60,1.00,0.00,1.00 --144.00,28.80,1.00,0.00,1.00 --148.80,28.80,1.00,0.00,1.00 --153.60,24.00,1.00,0.00,1.00 --158.40,19.20,1.00,0.00,1.00 --158.40,19.20,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 -163.20,-14.40,1.00,0.00,1.00 -158.40,-19.20,1.00,0.00,1.00 -158.40,-19.20,1.00,0.00,1.00 -153.60,-24.00,1.00,0.00,1.00 -148.80,-28.80,1.00,0.00,1.00 -144.00,-28.80,1.00,0.00,1.00 -139.20,-33.60,1.00,0.00,1.00 -134.40,-33.60,1.00,0.00,1.00 -129.60,-38.40,1.00,0.00,1.00 -124.80,-38.40,1.00,0.00,1.00 -115.20,-38.40,1.00,0.00,1.00 -110.40,-43.20,1.00,0.00,1.00 -105.60,-43.20,1.00,0.00,1.00 -96.00,-43.20,1.00,0.00,1.00 -91.20,-43.20,1.00,0.00,1.00 -86.40,-43.20,1.00,0.00,1.00 -76.80,-43.20,1.00,0.00,1.00 -72.00,-43.20,1.00,0.00,1.00 -67.20,-38.40,1.00,0.00,1.00 -62.40,-38.40,1.00,0.00,1.00 -52.80,-38.40,1.00,0.00,1.00 -48.00,-33.60,1.00,0.00,1.00 -43.20,-33.60,1.00,0.00,1.00 -38.40,-28.80,1.00,0.00,1.00 -33.60,-28.80,1.00,0.00,1.00 -28.80,-24.00,1.00,0.00,1.00 -24.00,-24.00,1.00,0.00,1.00 -24.00,-19.20,1.00,0.00,1.00 -19.20,-14.40,1.00,0.00,1.00 -14.40,-14.40,1.00,0.00,1.00 -9.60,-9.60,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 --14.40,9.60,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 --24.00,19.20,1.00,0.00,1.00 --28.80,19.20,1.00,0.00,1.00 --33.60,24.00,1.00,0.00,1.00 --38.40,24.00,1.00,0.00,1.00 --43.20,28.80,1.00,0.00,1.00 --48.00,28.80,1.00,0.00,1.00 --52.80,33.60,1.00,0.00,1.00 --57.60,33.60,1.00,0.00,1.00 --62.40,33.60,1.00,0.00,1.00 --67.20,38.40,1.00,0.00,1.00 --72.00,38.40,1.00,0.00,1.00 --81.60,38.40,1.00,0.00,1.00 --86.40,38.40,1.00,0.00,1.00 --91.20,38.40,1.00,0.00,1.00 --96.00,38.40,1.00,0.00,1.00 --105.60,38.40,1.00,0.00,1.00 --110.40,38.40,1.00,0.00,1.00 --115.20,33.60,1.00,0.00,1.00 --120.00,33.60,1.00,0.00,1.00 --124.80,33.60,1.00,0.00,1.00 --129.60,28.80,1.00,0.00,1.00 --134.40,28.80,1.00,0.00,1.00 --139.20,24.00,1.00,0.00,1.00 --144.00,24.00,1.00,0.00,1.00 --148.80,19.20,1.00,0.00,1.00 --153.60,19.20,1.00,0.00,1.00 --158.40,14.40,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -172.80,-9.60,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 -163.20,-14.40,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 -153.60,-19.20,1.00,0.00,1.00 -148.80,-19.20,1.00,0.00,1.00 -144.00,-24.00,1.00,0.00,1.00 -139.20,-24.00,1.00,0.00,1.00 -134.40,-28.80,1.00,0.00,1.00 -129.60,-28.80,1.00,0.00,1.00 -124.80,-33.60,1.00,0.00,1.00 -120.00,-33.60,1.00,0.00,1.00 -115.20,-33.60,1.00,0.00,1.00 -110.40,-38.40,1.00,0.00,1.00 -105.60,-38.40,1.00,0.00,1.00 -96.00,-38.40,1.00,0.00,1.00 -91.20,-38.40,1.00,0.00,1.00 -86.40,-38.40,1.00,0.00,1.00 -81.60,-38.40,1.00,0.00,1.00 -72.00,-38.40,1.00,0.00,1.00 -67.20,-38.40,1.00,0.00,1.00 -62.40,-33.60,1.00,0.00,1.00 -57.60,-33.60,1.00,0.00,1.00 -52.80,-33.60,1.00,0.00,1.00 -48.00,-28.80,1.00,0.00,1.00 -43.20,-28.80,1.00,0.00,1.00 -38.40,-24.00,1.00,0.00,1.00 -33.60,-24.00,1.00,0.00,1.00 -28.80,-19.20,1.00,0.00,1.00 -24.00,-19.20,1.00,0.00,1.00 -19.20,-14.40,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 -9.60,-9.60,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --14.40,9.60,1.00,0.00,1.00 --14.40,9.60,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 --24.00,14.40,1.00,0.00,1.00 --28.80,19.20,1.00,0.00,1.00 --33.60,19.20,1.00,0.00,1.00 --38.40,24.00,1.00,0.00,1.00 --43.20,24.00,1.00,0.00,1.00 --48.00,24.00,1.00,0.00,1.00 --52.80,28.80,1.00,0.00,1.00 --57.60,28.80,1.00,0.00,1.00 --62.40,28.80,1.00,0.00,1.00 --67.20,33.60,1.00,0.00,1.00 --72.00,33.60,1.00,0.00,1.00 --81.60,33.60,1.00,0.00,1.00 --86.40,33.60,1.00,0.00,1.00 --91.20,33.60,1.00,0.00,1.00 --96.00,33.60,1.00,0.00,1.00 --100.80,33.60,1.00,0.00,1.00 --110.40,33.60,1.00,0.00,1.00 --115.20,33.60,1.00,0.00,1.00 --120.00,28.80,1.00,0.00,1.00 --124.80,28.80,1.00,0.00,1.00 --129.60,28.80,1.00,0.00,1.00 --134.40,24.00,1.00,0.00,1.00 --139.20,24.00,1.00,0.00,1.00 --144.00,19.20,1.00,0.00,1.00 --148.80,19.20,1.00,0.00,1.00 --153.60,14.40,1.00,0.00,1.00 --158.40,14.40,1.00,0.00,1.00 --163.20,9.60,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 -153.60,-14.40,1.00,0.00,1.00 -148.80,-19.20,1.00,0.00,1.00 -144.00,-19.20,1.00,0.00,1.00 -139.20,-24.00,1.00,0.00,1.00 -134.40,-24.00,1.00,0.00,1.00 -129.60,-28.80,1.00,0.00,1.00 -124.80,-28.80,1.00,0.00,1.00 -120.00,-28.80,1.00,0.00,1.00 -115.20,-33.60,1.00,0.00,1.00 -110.40,-33.60,1.00,0.00,1.00 -100.80,-33.60,1.00,0.00,1.00 -96.00,-33.60,1.00,0.00,1.00 -91.20,-33.60,1.00,0.00,1.00 -86.40,-33.60,1.00,0.00,1.00 -81.60,-33.60,1.00,0.00,1.00 -72.00,-33.60,1.00,0.00,1.00 -67.20,-33.60,1.00,0.00,1.00 -62.40,-28.80,1.00,0.00,1.00 -57.60,-28.80,1.00,0.00,1.00 -52.80,-28.80,1.00,0.00,1.00 -48.00,-24.00,1.00,0.00,1.00 -43.20,-24.00,1.00,0.00,1.00 -38.40,-24.00,1.00,0.00,1.00 -33.60,-19.20,1.00,0.00,1.00 -28.80,-19.20,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 -19.20,-14.40,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 --24.00,14.40,1.00,0.00,1.00 --28.80,14.40,1.00,0.00,1.00 --33.60,19.20,1.00,0.00,1.00 --38.40,19.20,1.00,0.00,1.00 --43.20,19.20,1.00,0.00,1.00 --48.00,24.00,1.00,0.00,1.00 --52.80,24.00,1.00,0.00,1.00 --57.60,24.00,1.00,0.00,1.00 --62.40,24.00,1.00,0.00,1.00 --72.00,28.80,1.00,0.00,1.00 --76.80,28.80,1.00,0.00,1.00 --81.60,28.80,1.00,0.00,1.00 --86.40,28.80,1.00,0.00,1.00 --91.20,28.80,1.00,0.00,1.00 --96.00,28.80,1.00,0.00,1.00 --100.80,28.80,1.00,0.00,1.00 --105.60,28.80,1.00,0.00,1.00 --115.20,28.80,1.00,0.00,1.00 --120.00,24.00,1.00,0.00,1.00 --124.80,24.00,1.00,0.00,1.00 --129.60,24.00,1.00,0.00,1.00 --134.40,24.00,1.00,0.00,1.00 --139.20,19.20,1.00,0.00,1.00 --144.00,19.20,1.00,0.00,1.00 --148.80,14.40,1.00,0.00,1.00 --153.60,14.40,1.00,0.00,1.00 --158.40,14.40,1.00,0.00,1.00 --163.20,9.60,1.00,0.00,1.00 --163.20,9.60,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 -153.60,-14.40,1.00,0.00,1.00 -148.80,-14.40,1.00,0.00,1.00 -144.00,-19.20,1.00,0.00,1.00 -139.20,-19.20,1.00,0.00,1.00 -134.40,-24.00,1.00,0.00,1.00 -129.60,-24.00,1.00,0.00,1.00 -124.80,-24.00,1.00,0.00,1.00 -120.00,-24.00,1.00,0.00,1.00 -115.20,-28.80,1.00,0.00,1.00 -105.60,-28.80,1.00,0.00,1.00 -100.80,-28.80,1.00,0.00,1.00 -96.00,-28.80,1.00,0.00,1.00 -91.20,-28.80,1.00,0.00,1.00 -86.40,-28.80,1.00,0.00,1.00 -81.60,-28.80,1.00,0.00,1.00 -76.80,-28.80,1.00,0.00,1.00 -72.00,-28.80,1.00,0.00,1.00 -62.40,-24.00,1.00,0.00,1.00 -57.60,-24.00,1.00,0.00,1.00 -52.80,-24.00,1.00,0.00,1.00 -48.00,-24.00,1.00,0.00,1.00 -43.20,-19.20,1.00,0.00,1.00 -38.40,-19.20,1.00,0.00,1.00 -33.60,-19.20,1.00,0.00,1.00 -28.80,-14.40,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 -19.20,-9.60,1.00,0.00,1.00 -19.20,-9.60,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 --24.00,9.60,1.00,0.00,1.00 --28.80,9.60,1.00,0.00,1.00 --33.60,14.40,1.00,0.00,1.00 --33.60,14.40,1.00,0.00,1.00 --38.40,14.40,1.00,0.00,1.00 --43.20,19.20,1.00,0.00,1.00 --48.00,19.20,1.00,0.00,1.00 --57.60,19.20,1.00,0.00,1.00 --62.40,19.20,1.00,0.00,1.00 --67.20,24.00,1.00,0.00,1.00 --72.00,24.00,1.00,0.00,1.00 --76.80,24.00,1.00,0.00,1.00 --81.60,24.00,1.00,0.00,1.00 --86.40,24.00,1.00,0.00,1.00 --91.20,24.00,1.00,0.00,1.00 --96.00,24.00,1.00,0.00,1.00 --100.80,24.00,1.00,0.00,1.00 --105.60,24.00,1.00,0.00,1.00 --110.40,24.00,1.00,0.00,1.00 --115.20,19.20,1.00,0.00,1.00 --120.00,19.20,1.00,0.00,1.00 --129.60,19.20,1.00,0.00,1.00 --134.40,19.20,1.00,0.00,1.00 --139.20,19.20,1.00,0.00,1.00 --144.00,14.40,1.00,0.00,1.00 --148.80,14.40,1.00,0.00,1.00 --148.80,14.40,1.00,0.00,1.00 --153.60,9.60,1.00,0.00,1.00 --158.40,9.60,1.00,0.00,1.00 --163.20,4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --172.80,4.80,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 -158.40,-9.60,1.00,0.00,1.00 -153.60,-9.60,1.00,0.00,1.00 -148.80,-14.40,1.00,0.00,1.00 -148.80,-14.40,1.00,0.00,1.00 -144.00,-14.40,1.00,0.00,1.00 -139.20,-19.20,1.00,0.00,1.00 -134.40,-19.20,1.00,0.00,1.00 -129.60,-19.20,1.00,0.00,1.00 -120.00,-19.20,1.00,0.00,1.00 -115.20,-19.20,1.00,0.00,1.00 -110.40,-24.00,1.00,0.00,1.00 -105.60,-24.00,1.00,0.00,1.00 -100.80,-24.00,1.00,0.00,1.00 -96.00,-24.00,1.00,0.00,1.00 -91.20,-24.00,1.00,0.00,1.00 -86.40,-24.00,1.00,0.00,1.00 -81.60,-24.00,1.00,0.00,1.00 -76.80,-24.00,1.00,0.00,1.00 -72.00,-24.00,1.00,0.00,1.00 -67.20,-24.00,1.00,0.00,1.00 -62.40,-19.20,1.00,0.00,1.00 -57.60,-19.20,1.00,0.00,1.00 -48.00,-19.20,1.00,0.00,1.00 -43.20,-19.20,1.00,0.00,1.00 -38.40,-14.40,1.00,0.00,1.00 -33.60,-14.40,1.00,0.00,1.00 -33.60,-14.40,1.00,0.00,1.00 -28.80,-9.60,1.00,0.00,1.00 -24.00,-9.60,1.00,0.00,1.00 -19.20,-9.60,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 --24.00,9.60,1.00,0.00,1.00 --28.80,9.60,1.00,0.00,1.00 --33.60,9.60,1.00,0.00,1.00 --38.40,9.60,1.00,0.00,1.00 --43.20,14.40,1.00,0.00,1.00 --48.00,14.40,1.00,0.00,1.00 --52.80,14.40,1.00,0.00,1.00 --57.60,14.40,1.00,0.00,1.00 --62.40,19.20,1.00,0.00,1.00 --67.20,19.20,1.00,0.00,1.00 --72.00,19.20,1.00,0.00,1.00 --76.80,19.20,1.00,0.00,1.00 --81.60,19.20,1.00,0.00,1.00 --86.40,19.20,1.00,0.00,1.00 --91.20,19.20,1.00,0.00,1.00 --96.00,19.20,1.00,0.00,1.00 --100.80,19.20,1.00,0.00,1.00 --105.60,19.20,1.00,0.00,1.00 --110.40,19.20,1.00,0.00,1.00 --115.20,19.20,1.00,0.00,1.00 --120.00,14.40,1.00,0.00,1.00 --124.80,14.40,1.00,0.00,1.00 --129.60,14.40,1.00,0.00,1.00 --134.40,14.40,1.00,0.00,1.00 --139.20,14.40,1.00,0.00,1.00 --144.00,9.60,1.00,0.00,1.00 --148.80,9.60,1.00,0.00,1.00 --153.60,9.60,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 --163.20,4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 -158.40,-4.80,1.00,0.00,1.00 -153.60,-9.60,1.00,0.00,1.00 -148.80,-9.60,1.00,0.00,1.00 -144.00,-9.60,1.00,0.00,1.00 -139.20,-14.40,1.00,0.00,1.00 -134.40,-14.40,1.00,0.00,1.00 -129.60,-14.40,1.00,0.00,1.00 -124.80,-14.40,1.00,0.00,1.00 -120.00,-14.40,1.00,0.00,1.00 -115.20,-19.20,1.00,0.00,1.00 -110.40,-19.20,1.00,0.00,1.00 -105.60,-19.20,1.00,0.00,1.00 -100.80,-19.20,1.00,0.00,1.00 -96.00,-19.20,1.00,0.00,1.00 -91.20,-19.20,1.00,0.00,1.00 -86.40,-19.20,1.00,0.00,1.00 -81.60,-19.20,1.00,0.00,1.00 -76.80,-19.20,1.00,0.00,1.00 -72.00,-19.20,1.00,0.00,1.00 -67.20,-19.20,1.00,0.00,1.00 -62.40,-19.20,1.00,0.00,1.00 -57.60,-14.40,1.00,0.00,1.00 -52.80,-14.40,1.00,0.00,1.00 -48.00,-14.40,1.00,0.00,1.00 -43.20,-14.40,1.00,0.00,1.00 -38.40,-9.60,1.00,0.00,1.00 -33.60,-9.60,1.00,0.00,1.00 -28.80,-9.60,1.00,0.00,1.00 -24.00,-9.60,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 --24.00,4.80,1.00,0.00,1.00 --28.80,4.80,1.00,0.00,1.00 --33.60,9.60,1.00,0.00,1.00 --38.40,9.60,1.00,0.00,1.00 --43.20,9.60,1.00,0.00,1.00 --48.00,9.60,1.00,0.00,1.00 --52.80,9.60,1.00,0.00,1.00 --57.60,14.40,1.00,0.00,1.00 --62.40,14.40,1.00,0.00,1.00 --67.20,14.40,1.00,0.00,1.00 --72.00,14.40,1.00,0.00,1.00 --76.80,14.40,1.00,0.00,1.00 --81.60,14.40,1.00,0.00,1.00 --86.40,14.40,1.00,0.00,1.00 --91.20,14.40,1.00,0.00,1.00 --96.00,14.40,1.00,0.00,1.00 --100.80,14.40,1.00,0.00,1.00 --105.60,14.40,1.00,0.00,1.00 --110.40,14.40,1.00,0.00,1.00 --115.20,14.40,1.00,0.00,1.00 --120.00,14.40,1.00,0.00,1.00 --124.80,9.60,1.00,0.00,1.00 --129.60,9.60,1.00,0.00,1.00 --134.40,9.60,1.00,0.00,1.00 --139.20,9.60,1.00,0.00,1.00 --144.00,9.60,1.00,0.00,1.00 --148.80,9.60,1.00,0.00,1.00 --153.60,4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 --163.20,4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -168.00,-4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 -158.40,-4.80,1.00,0.00,1.00 -153.60,-4.80,1.00,0.00,1.00 -148.80,-9.60,1.00,0.00,1.00 -144.00,-9.60,1.00,0.00,1.00 -139.20,-9.60,1.00,0.00,1.00 -134.40,-9.60,1.00,0.00,1.00 -129.60,-9.60,1.00,0.00,1.00 -124.80,-9.60,1.00,0.00,1.00 -120.00,-14.40,1.00,0.00,1.00 -115.20,-14.40,1.00,0.00,1.00 -110.40,-14.40,1.00,0.00,1.00 -105.60,-14.40,1.00,0.00,1.00 -100.80,-14.40,1.00,0.00,1.00 -96.00,-14.40,1.00,0.00,1.00 -91.20,-14.40,1.00,0.00,1.00 -86.40,-14.40,1.00,0.00,1.00 -81.60,-14.40,1.00,0.00,1.00 -76.80,-14.40,1.00,0.00,1.00 -72.00,-14.40,1.00,0.00,1.00 -67.20,-14.40,1.00,0.00,1.00 -62.40,-14.40,1.00,0.00,1.00 -57.60,-14.40,1.00,0.00,1.00 -52.80,-9.60,1.00,0.00,1.00 -48.00,-9.60,1.00,0.00,1.00 -43.20,-9.60,1.00,0.00,1.00 -38.40,-9.60,1.00,0.00,1.00 -33.60,-9.60,1.00,0.00,1.00 -28.80,-4.80,1.00,0.00,1.00 -24.00,-4.80,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 --24.00,4.80,1.00,0.00,1.00 --28.80,4.80,1.00,0.00,1.00 --33.60,4.80,1.00,0.00,1.00 --38.40,4.80,1.00,0.00,1.00 --43.20,4.80,1.00,0.00,1.00 --48.00,4.80,1.00,0.00,1.00 --52.80,9.60,1.00,0.00,1.00 --57.60,9.60,1.00,0.00,1.00 --62.40,9.60,1.00,0.00,1.00 --67.20,9.60,1.00,0.00,1.00 --72.00,9.60,1.00,0.00,1.00 --76.80,9.60,1.00,0.00,1.00 --81.60,9.60,1.00,0.00,1.00 --86.40,9.60,1.00,0.00,1.00 --91.20,9.60,1.00,0.00,1.00 --96.00,9.60,1.00,0.00,1.00 --100.80,9.60,1.00,0.00,1.00 --105.60,9.60,1.00,0.00,1.00 --110.40,9.60,1.00,0.00,1.00 --115.20,9.60,1.00,0.00,1.00 --120.00,9.60,1.00,0.00,1.00 --124.80,9.60,1.00,0.00,1.00 --129.60,9.60,1.00,0.00,1.00 --134.40,4.80,1.00,0.00,1.00 --139.20,4.80,1.00,0.00,1.00 --144.00,4.80,1.00,0.00,1.00 --148.80,4.80,1.00,0.00,1.00 --153.60,4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 --163.20,4.80,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -168.00,-0.00,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 -158.40,-4.80,1.00,0.00,1.00 -153.60,-4.80,1.00,0.00,1.00 -148.80,-4.80,1.00,0.00,1.00 -144.00,-4.80,1.00,0.00,1.00 -139.20,-4.80,1.00,0.00,1.00 -134.40,-4.80,1.00,0.00,1.00 -129.60,-9.60,1.00,0.00,1.00 -124.80,-9.60,1.00,0.00,1.00 -120.00,-9.60,1.00,0.00,1.00 -115.20,-9.60,1.00,0.00,1.00 -110.40,-9.60,1.00,0.00,1.00 -105.60,-9.60,1.00,0.00,1.00 -100.80,-9.60,1.00,0.00,1.00 -96.00,-9.60,1.00,0.00,1.00 -91.20,-9.60,1.00,0.00,1.00 -86.40,-9.60,1.00,0.00,1.00 -81.60,-9.60,1.00,0.00,1.00 -76.80,-9.60,1.00,0.00,1.00 -72.00,-9.60,1.00,0.00,1.00 -67.20,-9.60,1.00,0.00,1.00 -62.40,-9.60,1.00,0.00,1.00 -57.60,-9.60,1.00,0.00,1.00 -52.80,-9.60,1.00,0.00,1.00 -48.00,-4.80,1.00,0.00,1.00 -43.20,-4.80,1.00,0.00,1.00 -38.40,-4.80,1.00,0.00,1.00 -33.60,-4.80,1.00,0.00,1.00 -28.80,-4.80,1.00,0.00,1.00 -24.00,-4.80,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 -14.40,-0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 --19.20,0.00,1.00,0.00,1.00 --24.00,0.00,1.00,0.00,1.00 --28.80,0.00,1.00,0.00,1.00 --33.60,4.80,1.00,0.00,1.00 --38.40,4.80,1.00,0.00,1.00 --43.20,4.80,1.00,0.00,1.00 --48.00,4.80,1.00,0.00,1.00 --52.80,4.80,1.00,0.00,1.00 --57.60,4.80,1.00,0.00,1.00 --62.40,4.80,1.00,0.00,1.00 --67.20,4.80,1.00,0.00,1.00 --72.00,4.80,1.00,0.00,1.00 --76.80,4.80,1.00,0.00,1.00 --81.60,4.80,1.00,0.00,1.00 --86.40,4.80,1.00,0.00,1.00 --91.20,4.80,1.00,0.00,1.00 --96.00,4.80,1.00,0.00,1.00 --100.80,4.80,1.00,0.00,1.00 --105.60,4.80,1.00,0.00,1.00 --110.40,4.80,1.00,0.00,1.00 --115.20,4.80,1.00,0.00,1.00 --120.00,4.80,1.00,0.00,1.00 --124.80,4.80,1.00,0.00,1.00 --129.60,4.80,1.00,0.00,1.00 --134.40,4.80,1.00,0.00,1.00 --139.20,4.80,1.00,0.00,1.00 --144.00,4.80,1.00,0.00,1.00 --148.80,4.80,1.00,0.00,1.00 --153.60,0.00,1.00,0.00,1.00 --158.40,0.00,1.00,0.00,1.00 --163.20,0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -168.00,-0.00,1.00,0.00,1.00 -163.20,-0.00,1.00,0.00,1.00 -158.40,-0.00,1.00,0.00,1.00 -153.60,-0.00,1.00,0.00,1.00 -148.80,-4.80,1.00,0.00,1.00 -144.00,-4.80,1.00,0.00,1.00 -139.20,-4.80,1.00,0.00,1.00 -134.40,-4.80,1.00,0.00,1.00 -129.60,-4.80,1.00,0.00,1.00 -124.80,-4.80,1.00,0.00,1.00 -120.00,-4.80,1.00,0.00,1.00 -115.20,-4.80,1.00,0.00,1.00 -110.40,-4.80,1.00,0.00,1.00 -105.60,-4.80,1.00,0.00,1.00 -100.80,-4.80,1.00,0.00,1.00 -96.00,-4.80,1.00,0.00,1.00 -91.20,-4.80,1.00,0.00,1.00 -86.40,-4.80,1.00,0.00,1.00 -81.60,-4.80,1.00,0.00,1.00 -76.80,-4.80,1.00,0.00,1.00 -72.00,-4.80,1.00,0.00,1.00 -67.20,-4.80,1.00,0.00,1.00 -62.40,-4.80,1.00,0.00,1.00 -57.60,-4.80,1.00,0.00,1.00 -52.80,-4.80,1.00,0.00,1.00 -48.00,-4.80,1.00,0.00,1.00 -43.20,-4.80,1.00,0.00,1.00 -38.40,-4.80,1.00,0.00,1.00 -33.60,-4.80,1.00,0.00,1.00 -28.80,-0.00,1.00,0.00,1.00 -24.00,-0.00,1.00,0.00,1.00 -19.20,-0.00,1.00,0.00,1.00 -14.40,-0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 --19.20,0.00,1.00,0.00,1.00 --24.00,0.00,1.00,0.00,1.00 --28.80,0.00,1.00,0.00,1.00 --33.60,0.00,1.00,0.00,1.00 --38.40,0.00,1.00,0.00,1.00 --43.20,0.00,1.00,0.00,1.00 --48.00,0.00,1.00,0.00,1.00 --52.80,0.00,1.00,0.00,1.00 --57.60,0.00,1.00,0.00,1.00 --62.40,0.00,1.00,0.00,1.00 --67.20,0.00,1.00,0.00,1.00 --72.00,0.00,1.00,0.00,1.00 --76.80,0.00,1.00,0.00,1.00 --81.60,0.00,1.00,0.00,1.00 --86.40,0.00,1.00,0.00,1.00 --91.20,0.00,1.00,0.00,1.00 --96.00,0.00,1.00,0.00,1.00 --100.80,0.00,1.00,0.00,1.00 --105.60,0.00,1.00,0.00,1.00 --110.40,0.00,1.00,0.00,1.00 --115.20,0.00,1.00,0.00,1.00 --120.00,0.00,1.00,0.00,1.00 --124.80,0.00,1.00,0.00,1.00 --129.60,0.00,1.00,0.00,1.00 --134.40,0.00,1.00,0.00,1.00 --139.20,0.00,1.00,0.00,1.00 --144.00,0.00,1.00,0.00,1.00 --148.80,0.00,1.00,0.00,1.00 --153.60,0.00,1.00,0.00,1.00 --158.40,0.00,1.00,0.00,1.00 --163.20,0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 -168.00,0.00,1.00,0.00,1.00 -163.20,0.00,1.00,0.00,1.00 -158.40,0.00,1.00,0.00,1.00 -153.60,0.00,1.00,0.00,1.00 -148.80,0.00,1.00,0.00,1.00 -144.00,0.00,1.00,0.00,1.00 -139.20,0.00,1.00,0.00,1.00 -134.40,0.00,1.00,0.00,1.00 -129.60,0.00,1.00,0.00,1.00 -124.80,0.00,1.00,0.00,1.00 -120.00,0.00,1.00,0.00,1.00 -115.20,0.00,1.00,0.00,1.00 -110.40,0.00,1.00,0.00,1.00 -105.60,0.00,1.00,0.00,1.00 -100.80,0.00,1.00,0.00,1.00 -96.00,0.00,1.00,0.00,1.00 -91.20,0.00,1.00,0.00,1.00 -86.40,0.00,1.00,0.00,1.00 -81.60,0.00,1.00,0.00,1.00 -76.80,0.00,1.00,0.00,1.00 -72.00,0.00,1.00,0.00,1.00 -67.20,0.00,1.00,0.00,1.00 -62.40,0.00,1.00,0.00,1.00 -57.60,0.00,1.00,0.00,1.00 -52.80,0.00,1.00,0.00,1.00 -48.00,0.00,1.00,0.00,1.00 -43.20,0.00,1.00,0.00,1.00 -38.40,0.00,1.00,0.00,1.00 -33.60,0.00,1.00,0.00,1.00 -28.80,0.00,1.00,0.00,1.00 -24.00,0.00,1.00,0.00,1.00 -19.20,0.00,1.00,0.00,1.00 -14.40,0.00,1.00,0.00,1.00 -9.60,0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 +0.00,4.80,16.00,0.00,1.00,0.00,0.00 +0.00,9.60,15.98,0.00,1.00,-177.60,4.80 +0.00,14.40,15.96,0.00,1.00,4.80,9.60 +0.00,19.20,15.94,0.00,1.00,-168.00,14.40 +0.00,24.00,15.91,0.00,1.00,14.40,19.20 +0.00,28.80,15.89,0.00,1.00,-163.20,24.00 +0.00,33.60,15.87,0.00,1.00,19.20,28.80 +0.00,38.40,15.85,0.00,1.00,-153.60,33.60 +0.00,43.20,15.83,0.00,1.00,28.80,38.40 +0.00,48.00,15.81,0.00,1.00,-148.80,43.20 +0.00,52.80,15.79,0.00,1.00,38.40,48.00 +0.00,57.60,15.77,0.00,1.00,-139.20,52.80 +0.00,62.40,15.74,0.00,1.00,48.00,57.60 +4.80,67.20,15.72,0.00,1.00,-124.80,62.40 +4.80,72.00,15.70,0.00,1.00,57.60,67.20 +4.80,76.80,15.68,0.00,1.00,-115.20,72.00 +9.60,81.60,15.66,0.00,1.00,72.00,76.80 +19.20,86.40,15.64,0.00,1.00,-100.80,81.60 +134.40,86.40,15.62,0.00,1.00,86.40,86.40 +168.00,81.60,15.59,0.00,1.00,-86.40,89.20 +172.80,76.80,15.57,0.00,1.00,100.80,86.40 +177.60,72.00,15.55,0.00,1.00,-76.80,81.60 +177.60,67.20,15.53,0.00,1.00,110.40,76.80 +177.60,62.40,15.51,0.00,1.00,-62.40,72.00 +177.60,57.60,15.49,0.00,1.00,124.80,67.20 +177.60,52.80,15.47,0.00,1.00,-52.80,62.40 +177.60,48.00,15.44,0.00,1.00,134.40,57.60 +177.60,43.20,15.42,0.00,1.00,-38.40,52.80 +177.60,38.40,15.40,0.00,1.00,144.00,48.00 +177.60,33.60,15.38,0.00,1.00,-33.60,43.20 +177.60,28.80,15.36,0.00,1.00,153.60,38.40 +177.60,24.00,15.34,0.00,1.00,-24.00,33.60 +177.60,19.20,15.32,0.00,1.00,158.40,28.80 +177.60,14.40,15.30,0.00,1.00,-14.40,24.00 +177.60,9.60,15.27,0.00,1.00,168.00,19.20 +177.60,4.80,15.25,0.00,1.00,-9.60,14.40 +177.60,0.00,15.23,0.00,1.00,172.80,9.60 +-177.60,-0.00,15.21,0.00,1.00,-0.00,4.80 +-177.60,-4.80,15.19,0.00,1.00,-177.60,-0.00 +-177.60,-9.60,15.17,0.00,1.00,4.80,-4.80 +-177.60,-14.40,15.15,0.00,1.00,-172.80,-9.60 +-177.60,-19.20,15.12,0.00,1.00,14.40,-14.40 +-177.60,-24.00,15.10,0.00,1.00,-163.20,-19.20 +-177.60,-28.80,15.08,0.00,1.00,19.20,-24.00 +-177.60,-33.60,15.06,0.00,1.00,-158.40,-28.80 +-177.60,-38.40,15.04,0.00,1.00,28.80,-33.60 +-177.60,-43.20,15.02,0.00,1.00,-148.80,-38.40 +-177.60,-48.00,15.00,0.00,1.00,33.60,-48.00 +-177.60,-52.80,14.97,0.00,1.00,-139.20,-48.00 +-177.60,-57.60,14.95,0.00,1.00,43.20,-52.80 +-177.60,-62.40,14.93,0.00,1.00,-129.60,-57.60 +-177.60,-67.20,14.91,0.00,1.00,57.60,-62.40 +-177.60,-72.00,14.89,0.00,1.00,-120.00,-67.20 +-172.80,-76.80,14.87,0.00,1.00,67.20,-76.80 +-168.00,-81.60,14.85,0.00,1.00,-105.60,-76.80 +-134.40,-86.40,14.83,0.00,1.00,81.60,-86.40 +-19.20,-86.40,14.80,0.00,1.00,-91.20,-89.20 +-9.60,-81.60,14.78,0.00,1.00,96.00,-86.40 +-4.80,-76.80,14.76,0.00,1.00,-76.80,-81.60 +-4.80,-72.00,14.74,0.00,1.00,110.40,-76.80 +-4.80,-67.20,14.72,0.00,1.00,-67.20,-72.00 +-0.00,-62.40,14.70,0.00,1.00,120.00,-67.20 +-0.00,-57.60,14.68,0.00,1.00,-52.80,-62.40 +-0.00,-52.80,14.65,0.00,1.00,129.60,-57.60 +-0.00,-48.00,14.63,0.00,1.00,-43.20,-52.80 +-0.00,-43.20,14.61,0.00,1.00,144.00,-48.00 +-0.00,-38.40,14.59,0.00,1.00,-33.60,-43.20 +-0.00,-33.60,14.57,0.00,1.00,148.80,-38.40 +-0.00,-28.80,14.55,0.00,1.00,-24.00,-33.60 +-0.00,-24.00,14.53,0.00,1.00,158.40,-28.80 +-0.00,-19.20,14.50,0.00,1.00,-19.20,-24.00 +-0.00,-14.40,14.48,0.00,1.00,168.00,-19.20 +-0.00,-9.60,14.46,0.00,1.00,-9.60,-14.40 +-0.00,-4.80,14.44,0.00,1.00,172.80,-9.60 +-0.00,0.00,14.42,0.00,1.00,-4.80,-4.80 +-0.00,4.80,14.40,0.00,1.00,0.00,0.00 +-0.00,9.60,14.38,0.00,1.00,-177.60,4.80 +-0.00,14.40,14.36,0.00,1.00,9.60,9.60 +-0.00,19.20,14.33,0.00,1.00,-168.00,14.40 +-0.00,24.00,14.31,0.00,1.00,14.40,19.20 +-0.00,28.80,14.29,0.00,1.00,-163.20,24.00 +-0.00,33.60,14.27,0.00,1.00,24.00,28.80 +-4.80,38.40,14.25,0.00,1.00,-153.60,33.60 +-4.80,43.20,14.23,0.00,1.00,28.80,38.40 +-4.80,48.00,14.21,0.00,1.00,-144.00,43.20 +-4.80,52.80,14.18,0.00,1.00,38.40,48.00 +-4.80,57.60,14.16,0.00,1.00,-134.40,52.80 +-4.80,62.40,14.14,0.00,1.00,48.00,57.60 +-9.60,67.20,14.12,0.00,1.00,-124.80,62.40 +-9.60,72.00,14.10,0.00,1.00,62.40,67.20 +-14.40,76.80,14.08,0.00,1.00,-115.20,72.00 +-24.00,81.60,14.06,0.00,1.00,72.00,76.80 +-43.20,86.40,14.03,0.00,1.00,-100.80,81.60 +-110.40,86.40,14.01,0.00,1.00,86.40,86.40 +-148.80,81.60,13.99,0.00,1.00,-86.40,86.40 +-163.20,76.80,13.97,0.00,1.00,96.00,81.60 +-168.00,72.00,13.95,0.00,1.00,-76.80,76.80 +-172.80,67.20,13.93,0.00,1.00,110.40,72.00 +-172.80,62.40,13.91,0.00,1.00,-62.40,67.20 +-172.80,57.60,13.89,0.00,1.00,120.00,62.40 +-172.80,52.80,13.86,0.00,1.00,-52.80,57.60 +-177.60,48.00,13.84,0.00,1.00,134.40,52.80 +-177.60,43.20,13.82,0.00,1.00,-43.20,48.00 +-177.60,38.40,13.80,0.00,1.00,144.00,43.20 +-177.60,33.60,13.78,0.00,1.00,-33.60,38.40 +-177.60,28.80,13.76,0.00,1.00,148.80,33.60 +-177.60,24.00,13.74,0.00,1.00,-24.00,28.80 +-177.60,19.20,13.71,0.00,1.00,158.40,24.00 +-177.60,14.40,13.69,0.00,1.00,-19.20,19.20 +-177.60,9.60,13.67,0.00,1.00,168.00,14.40 +-177.60,4.80,13.65,0.00,1.00,-9.60,9.60 +-177.60,0.00,13.63,0.00,1.00,172.80,4.80 +177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 +177.60,-4.80,13.59,0.00,1.00,-177.60,-0.00 +177.60,-9.60,13.56,0.00,1.00,4.80,-4.80 +177.60,-14.40,13.54,0.00,1.00,-172.80,-9.60 +177.60,-19.20,13.52,0.00,1.00,14.40,-14.40 +177.60,-24.00,13.50,0.00,1.00,-163.20,-19.20 +177.60,-28.80,13.48,0.00,1.00,19.20,-24.00 +177.60,-33.60,13.46,0.00,1.00,-153.60,-28.80 +177.60,-38.40,13.44,0.00,1.00,28.80,-33.60 +177.60,-43.20,13.42,0.00,1.00,-148.80,-38.40 +177.60,-48.00,13.39,0.00,1.00,38.40,-43.20 +172.80,-52.80,13.37,0.00,1.00,-139.20,-48.00 +172.80,-57.60,13.35,0.00,1.00,48.00,-52.80 +172.80,-62.40,13.33,0.00,1.00,-124.80,-57.60 +172.80,-67.20,13.31,0.00,1.00,57.60,-62.40 +168.00,-72.00,13.29,0.00,1.00,-115.20,-67.20 +163.20,-76.80,13.27,0.00,1.00,72.00,-72.00 +148.80,-81.60,13.24,0.00,1.00,-105.60,-76.80 +110.40,-86.40,13.22,0.00,1.00,81.60,-81.60 +43.20,-86.40,13.20,0.00,1.00,-91.20,-86.40 +24.00,-81.60,13.18,0.00,1.00,96.00,-86.40 +14.40,-76.80,13.16,0.00,1.00,-76.80,-81.60 +9.60,-72.00,13.14,0.00,1.00,105.60,-76.80 +9.60,-67.20,13.12,0.00,1.00,-67.20,-72.00 +4.80,-62.40,13.09,0.00,1.00,120.00,-67.20 +4.80,-57.60,13.07,0.00,1.00,-57.60,-62.40 +4.80,-52.80,13.05,0.00,1.00,129.60,-57.60 +4.80,-48.00,13.03,0.00,1.00,-43.20,-52.80 +4.80,-43.20,13.01,0.00,1.00,139.20,-48.00 +4.80,-38.40,12.99,0.00,1.00,-33.60,-43.20 +0.00,-33.60,12.97,0.00,1.00,148.80,-38.40 +0.00,-28.80,12.95,0.00,1.00,-28.80,-33.60 +0.00,-24.00,12.92,0.00,1.00,158.40,-28.80 +0.00,-19.20,12.90,0.00,1.00,-19.20,-24.00 +0.00,-14.40,12.88,0.00,1.00,163.20,-19.20 +0.00,-9.60,12.86,0.00,1.00,-9.60,-14.40 +0.00,-4.80,12.84,0.00,1.00,172.80,-9.60 +0.00,0.00,12.82,0.00,1.00,-4.80,-4.80 +-0.00,4.80,12.80,0.00,1.00,0.00,0.00 +-0.00,9.60,12.77,0.00,1.00,-177.60,4.80 +-0.00,14.40,12.75,0.00,1.00,9.60,9.60 +-4.80,19.20,12.73,0.00,1.00,-168.00,14.40 +-4.80,24.00,12.71,0.00,1.00,14.40,19.20 +-4.80,28.80,12.69,0.00,1.00,-158.40,24.00 +-4.80,33.60,12.67,0.00,1.00,24.00,28.80 +-4.80,38.40,12.65,0.00,1.00,-153.60,33.60 +-9.60,43.20,12.62,0.00,1.00,33.60,38.40 +-9.60,48.00,12.60,0.00,1.00,-144.00,43.20 +-9.60,52.80,12.58,0.00,1.00,43.20,48.00 +-14.40,57.60,12.56,0.00,1.00,-134.40,52.80 +-14.40,62.40,12.54,0.00,1.00,52.80,57.60 +-19.20,67.20,12.52,0.00,1.00,-124.80,62.40 +-24.00,72.00,12.50,0.00,1.00,62.40,67.20 +-33.60,72.00,12.48,0.00,1.00,-110.40,72.00 +-43.20,76.80,12.45,0.00,1.00,72.00,72.00 +-67.20,81.60,12.43,0.00,1.00,-100.80,76.80 +-96.00,81.60,12.41,0.00,1.00,86.40,81.60 +-124.80,81.60,12.39,0.00,1.00,-86.40,81.60 +-144.00,76.80,12.37,0.00,1.00,96.00,76.80 +-153.60,72.00,12.35,0.00,1.00,-76.80,76.80 +-158.40,67.20,12.33,0.00,1.00,110.40,72.00 +-163.20,62.40,12.30,0.00,1.00,-67.20,67.20 +-168.00,57.60,12.28,0.00,1.00,120.00,62.40 +-168.00,52.80,12.26,0.00,1.00,-52.80,57.60 +-168.00,48.00,12.24,0.00,1.00,129.60,52.80 +-172.80,43.20,12.22,0.00,1.00,-43.20,48.00 +-172.80,38.40,12.20,0.00,1.00,139.20,43.20 +-172.80,33.60,12.18,0.00,1.00,-33.60,38.40 +-172.80,28.80,12.15,0.00,1.00,148.80,33.60 +-177.60,24.00,12.13,0.00,1.00,-24.00,28.80 +-177.60,19.20,12.11,0.00,1.00,158.40,24.00 +-177.60,14.40,12.09,0.00,1.00,-19.20,19.20 +-177.60,9.60,12.07,0.00,1.00,168.00,14.40 +-177.60,4.80,12.05,0.00,1.00,-9.60,9.60 +-177.60,0.00,12.03,0.00,1.00,172.80,4.80 +177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 +177.60,-4.80,11.98,0.00,1.00,-177.60,-0.00 +177.60,-9.60,11.96,0.00,1.00,4.80,-4.80 +177.60,-14.40,11.94,0.00,1.00,-168.00,-9.60 +177.60,-19.20,11.92,0.00,1.00,14.40,-14.40 +177.60,-24.00,11.90,0.00,1.00,-163.20,-19.20 +172.80,-28.80,11.88,0.00,1.00,24.00,-24.00 +172.80,-33.60,11.86,0.00,1.00,-153.60,-28.80 +172.80,-38.40,11.83,0.00,1.00,28.80,-33.60 +172.80,-43.20,11.81,0.00,1.00,-144.00,-38.40 +168.00,-48.00,11.79,0.00,1.00,38.40,-43.20 +168.00,-52.80,11.77,0.00,1.00,-134.40,-48.00 +168.00,-57.60,11.75,0.00,1.00,48.00,-52.80 +163.20,-62.40,11.73,0.00,1.00,-124.80,-57.60 +158.40,-67.20,11.71,0.00,1.00,62.40,-62.40 +153.60,-72.00,11.68,0.00,1.00,-115.20,-67.20 +144.00,-76.80,11.66,0.00,1.00,72.00,-72.00 +124.80,-81.60,11.64,0.00,1.00,-100.80,-76.80 +96.00,-81.60,11.62,0.00,1.00,81.60,-76.80 +67.20,-81.60,11.60,0.00,1.00,-91.20,-81.60 +43.20,-76.80,11.58,0.00,1.00,96.00,-81.60 +33.60,-72.00,11.56,0.00,1.00,-81.60,-76.80 +24.00,-72.00,11.54,0.00,1.00,105.60,-72.00 +19.20,-67.20,11.51,0.00,1.00,-67.20,-72.00 +14.40,-62.40,11.49,0.00,1.00,115.20,-67.20 +14.40,-57.60,11.47,0.00,1.00,-57.60,-62.40 +9.60,-52.80,11.45,0.00,1.00,129.60,-57.60 +9.60,-48.00,11.43,0.00,1.00,-48.00,-52.80 +9.60,-43.20,11.41,0.00,1.00,139.20,-48.00 +4.80,-38.40,11.39,0.00,1.00,-38.40,-43.20 +4.80,-33.60,11.36,0.00,1.00,148.80,-38.40 +4.80,-28.80,11.34,0.00,1.00,-28.80,-33.60 +4.80,-24.00,11.32,0.00,1.00,153.60,-28.80 +4.80,-19.20,11.30,0.00,1.00,-19.20,-24.00 +0.00,-14.40,11.28,0.00,1.00,163.20,-19.20 +0.00,-9.60,11.26,0.00,1.00,-9.60,-14.40 +0.00,-4.80,11.24,0.00,1.00,172.80,-9.60 +0.00,0.00,11.21,0.00,1.00,-4.80,-4.80 +-0.00,4.80,11.19,0.00,1.00,0.00,0.00 +-0.00,9.60,11.17,0.00,1.00,-177.60,4.80 +-4.80,14.40,11.15,0.00,1.00,9.60,9.60 +-4.80,19.20,11.13,0.00,1.00,-168.00,14.40 +-4.80,24.00,11.11,0.00,1.00,14.40,19.20 +-4.80,28.80,11.09,0.00,1.00,-158.40,24.00 +-9.60,33.60,11.07,0.00,1.00,24.00,28.80 +-9.60,38.40,11.04,0.00,1.00,-148.80,33.60 +-14.40,43.20,11.02,0.00,1.00,33.60,38.40 +-14.40,48.00,11.00,0.00,1.00,-139.20,43.20 +-14.40,52.80,10.98,0.00,1.00,43.20,48.00 +-19.20,57.60,10.96,0.00,1.00,-129.60,52.80 +-24.00,57.60,10.94,0.00,1.00,52.80,52.80 +-28.80,62.40,10.92,0.00,1.00,-120.00,57.60 +-33.60,67.20,10.89,0.00,1.00,62.40,62.40 +-43.20,72.00,10.87,0.00,1.00,-110.40,67.20 +-57.60,72.00,10.85,0.00,1.00,76.80,72.00 +-76.80,76.80,10.83,0.00,1.00,-100.80,72.00 +-96.00,76.80,10.81,0.00,1.00,86.40,76.80 +-115.20,76.80,10.79,0.00,1.00,-86.40,76.80 +-129.60,72.00,10.77,0.00,1.00,96.00,76.80 +-139.20,72.00,10.74,0.00,1.00,-76.80,72.00 +-148.80,67.20,10.72,0.00,1.00,105.60,67.20 +-153.60,62.40,10.70,0.00,1.00,-67.20,67.20 +-158.40,57.60,10.68,0.00,1.00,120.00,62.40 +-163.20,52.80,10.66,0.00,1.00,-57.60,57.60 +-163.20,48.00,10.64,0.00,1.00,129.60,52.80 +-168.00,43.20,10.62,0.00,1.00,-48.00,48.00 +-168.00,38.40,10.60,0.00,1.00,139.20,43.20 +-172.80,33.60,10.57,0.00,1.00,-38.40,38.40 +-172.80,28.80,10.55,0.00,1.00,148.80,33.60 +-172.80,24.00,10.53,0.00,1.00,-28.80,28.80 +-172.80,19.20,10.51,0.00,1.00,158.40,24.00 +-177.60,14.40,10.49,0.00,1.00,-19.20,19.20 +-177.60,9.60,10.47,0.00,1.00,163.20,14.40 +-177.60,4.80,10.45,0.00,1.00,-9.60,9.60 +-177.60,0.00,10.42,0.00,1.00,172.80,4.80 +177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 +177.60,-4.80,10.38,0.00,1.00,-177.60,-0.00 +177.60,-9.60,10.36,0.00,1.00,4.80,-4.80 +177.60,-14.40,10.34,0.00,1.00,-168.00,-9.60 +172.80,-19.20,10.32,0.00,1.00,14.40,-14.40 +172.80,-24.00,10.30,0.00,1.00,-163.20,-19.20 +172.80,-28.80,10.28,0.00,1.00,24.00,-24.00 +172.80,-33.60,10.25,0.00,1.00,-153.60,-28.80 +168.00,-38.40,10.23,0.00,1.00,33.60,-33.60 +168.00,-43.20,10.21,0.00,1.00,-144.00,-38.40 +163.20,-48.00,10.19,0.00,1.00,43.20,-43.20 +163.20,-52.80,10.17,0.00,1.00,-134.40,-48.00 +158.40,-57.60,10.15,0.00,1.00,52.80,-52.80 +153.60,-62.40,10.13,0.00,1.00,-124.80,-57.60 +148.80,-67.20,10.10,0.00,1.00,62.40,-62.40 +139.20,-72.00,10.08,0.00,1.00,-115.20,-67.20 +129.60,-72.00,10.06,0.00,1.00,72.00,-67.20 +115.20,-76.80,10.04,0.00,1.00,-100.80,-72.00 +96.00,-76.80,10.02,0.00,1.00,81.60,-76.80 +76.80,-76.80,10.00,0.00,1.00,-91.20,-76.80 +57.60,-72.00,9.98,0.00,1.00,96.00,-76.80 +43.20,-72.00,9.95,0.00,1.00,-81.60,-72.00 +33.60,-67.20,9.93,0.00,1.00,105.60,-72.00 +28.80,-62.40,9.91,0.00,1.00,-67.20,-67.20 +24.00,-57.60,9.89,0.00,1.00,115.20,-62.40 +19.20,-57.60,9.87,0.00,1.00,-57.60,-57.60 +14.40,-52.80,9.85,0.00,1.00,124.80,-52.80 +14.40,-48.00,9.83,0.00,1.00,-48.00,-52.80 +14.40,-43.20,9.81,0.00,1.00,134.40,-48.00 +9.60,-38.40,9.78,0.00,1.00,-38.40,-43.20 +9.60,-33.60,9.76,0.00,1.00,144.00,-38.40 +4.80,-28.80,9.74,0.00,1.00,-28.80,-33.60 +4.80,-24.00,9.72,0.00,1.00,153.60,-28.80 +4.80,-19.20,9.70,0.00,1.00,-19.20,-24.00 +4.80,-14.40,9.68,0.00,1.00,163.20,-19.20 +0.00,-9.60,9.66,0.00,1.00,-14.40,-14.40 +0.00,-4.80,9.63,0.00,1.00,172.80,-9.60 +0.00,0.00,9.61,0.00,1.00,-4.80,-4.80 +-0.00,4.80,9.59,0.00,1.00,0.00,0.00 +-4.80,9.60,9.57,0.00,1.00,-177.60,4.80 +-4.80,14.40,9.55,0.00,1.00,9.60,9.60 +-4.80,19.20,9.53,0.00,1.00,-168.00,14.40 +-9.60,24.00,9.51,0.00,1.00,19.20,19.20 +-9.60,28.80,9.48,0.00,1.00,-158.40,24.00 +-9.60,33.60,9.46,0.00,1.00,24.00,28.80 +-14.40,38.40,9.44,0.00,1.00,-148.80,33.60 +-14.40,38.40,9.42,0.00,1.00,33.60,33.60 +-19.20,43.20,9.40,0.00,1.00,-139.20,38.40 +-24.00,48.00,9.38,0.00,1.00,43.20,43.20 +-24.00,52.80,9.36,0.00,1.00,-129.60,48.00 +-28.80,57.60,9.34,0.00,1.00,52.80,52.80 +-38.40,62.40,9.31,0.00,1.00,-120.00,57.60 +-43.20,62.40,9.29,0.00,1.00,67.20,62.40 +-52.80,67.20,9.27,0.00,1.00,-110.40,62.40 +-62.40,72.00,9.25,0.00,1.00,76.80,67.20 +-76.80,72.00,9.23,0.00,1.00,-100.80,67.20 +-96.00,72.00,9.21,0.00,1.00,86.40,72.00 +-110.40,72.00,9.19,0.00,1.00,-86.40,72.00 +-120.00,67.20,9.16,0.00,1.00,96.00,72.00 +-134.40,67.20,9.14,0.00,1.00,-76.80,67.20 +-139.20,62.40,9.12,0.00,1.00,105.60,67.20 +-148.80,57.60,9.10,0.00,1.00,-67.20,62.40 +-153.60,57.60,9.08,0.00,1.00,115.20,57.60 +-158.40,52.80,9.06,0.00,1.00,-57.60,52.80 +-158.40,48.00,9.04,0.00,1.00,129.60,52.80 +-163.20,43.20,9.01,0.00,1.00,-48.00,48.00 +-163.20,38.40,8.99,0.00,1.00,139.20,43.20 +-168.00,33.60,8.97,0.00,1.00,-38.40,38.40 +-168.00,28.80,8.95,0.00,1.00,148.80,33.60 +-172.80,24.00,8.93,0.00,1.00,-28.80,28.80 +-172.80,19.20,8.91,0.00,1.00,153.60,24.00 +-172.80,14.40,8.89,0.00,1.00,-19.20,19.20 +-177.60,9.60,8.87,0.00,1.00,163.20,14.40 +-177.60,4.80,8.84,0.00,1.00,-9.60,9.60 +-177.60,0.00,8.82,0.00,1.00,172.80,4.80 +177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 +177.60,-4.80,8.78,0.00,1.00,-177.60,-0.00 +177.60,-9.60,8.76,0.00,1.00,4.80,-4.80 +172.80,-14.40,8.74,0.00,1.00,-168.00,-9.60 +172.80,-19.20,8.72,0.00,1.00,14.40,-14.40 +172.80,-24.00,8.69,0.00,1.00,-158.40,-19.20 +168.00,-28.80,8.67,0.00,1.00,24.00,-24.00 +168.00,-33.60,8.65,0.00,1.00,-153.60,-28.80 +163.20,-38.40,8.63,0.00,1.00,33.60,-33.60 +163.20,-43.20,8.61,0.00,1.00,-144.00,-38.40 +158.40,-48.00,8.59,0.00,1.00,43.20,-43.20 +158.40,-52.80,8.57,0.00,1.00,-134.40,-48.00 +153.60,-57.60,8.54,0.00,1.00,52.80,-52.80 +148.80,-57.60,8.52,0.00,1.00,-124.80,-52.80 +139.20,-62.40,8.50,0.00,1.00,62.40,-57.60 +134.40,-67.20,8.48,0.00,1.00,-110.40,-62.40 +120.00,-67.20,8.46,0.00,1.00,72.00,-67.20 +110.40,-72.00,8.44,0.00,1.00,-100.80,-67.20 +96.00,-72.00,8.42,0.00,1.00,81.60,-72.00 +76.80,-72.00,8.40,0.00,1.00,-91.20,-72.00 +62.40,-72.00,8.37,0.00,1.00,96.00,-72.00 +52.80,-67.20,8.35,0.00,1.00,-81.60,-67.20 +43.20,-62.40,8.33,0.00,1.00,105.60,-67.20 +38.40,-62.40,8.31,0.00,1.00,-72.00,-62.40 +28.80,-57.60,8.29,0.00,1.00,115.20,-62.40 +24.00,-52.80,8.27,0.00,1.00,-57.60,-57.60 +24.00,-48.00,8.25,0.00,1.00,124.80,-52.80 +19.20,-43.20,8.22,0.00,1.00,-48.00,-48.00 +14.40,-38.40,8.20,0.00,1.00,134.40,-43.20 +14.40,-38.40,8.18,0.00,1.00,-38.40,-38.40 +9.60,-33.60,8.16,0.00,1.00,144.00,-33.60 +9.60,-28.80,8.14,0.00,1.00,-28.80,-33.60 +9.60,-24.00,8.12,0.00,1.00,153.60,-28.80 +4.80,-19.20,8.10,0.00,1.00,-24.00,-24.00 +4.80,-14.40,8.07,0.00,1.00,163.20,-19.20 +4.80,-9.60,8.05,0.00,1.00,-14.40,-14.40 +0.00,-4.80,8.03,0.00,1.00,172.80,-9.60 +0.00,0.00,8.01,0.00,1.00,-4.80,-4.80 +-0.00,4.80,7.99,0.00,1.00,0.00,0.00 +-4.80,9.60,7.97,0.00,1.00,-177.60,4.80 +-4.80,14.40,7.95,0.00,1.00,9.60,9.60 +-9.60,19.20,7.93,0.00,1.00,-168.00,14.40 +-9.60,24.00,7.90,0.00,1.00,19.20,19.20 +-14.40,24.00,7.88,0.00,1.00,-158.40,24.00 +-14.40,28.80,7.86,0.00,1.00,28.80,24.00 +-19.20,33.60,7.84,0.00,1.00,-148.80,28.80 +-19.20,38.40,7.82,0.00,1.00,38.40,33.60 +-24.00,43.20,7.80,0.00,1.00,-139.20,38.40 +-28.80,48.00,7.78,0.00,1.00,48.00,43.20 +-33.60,52.80,7.75,0.00,1.00,-129.60,48.00 +-38.40,52.80,7.73,0.00,1.00,57.60,52.80 +-43.20,57.60,7.71,0.00,1.00,-120.00,52.80 +-48.00,62.40,7.69,0.00,1.00,67.20,57.60 +-57.60,62.40,7.67,0.00,1.00,-110.40,62.40 +-67.20,67.20,7.65,0.00,1.00,76.80,62.40 +-81.60,67.20,7.63,0.00,1.00,-100.80,62.40 +-91.20,67.20,7.60,0.00,1.00,86.40,67.20 +-105.60,67.20,7.58,0.00,1.00,-86.40,67.20 +-115.20,67.20,7.56,0.00,1.00,96.00,67.20 +-124.80,62.40,7.54,0.00,1.00,-76.80,62.40 +-134.40,57.60,7.52,0.00,1.00,105.60,62.40 +-139.20,57.60,7.50,0.00,1.00,-67.20,57.60 +-144.00,52.80,7.48,0.00,1.00,115.20,57.60 +-148.80,48.00,7.46,0.00,1.00,-57.60,52.80 +-153.60,43.20,7.43,0.00,1.00,124.80,48.00 +-158.40,43.20,7.41,0.00,1.00,-48.00,43.20 +-163.20,38.40,7.39,0.00,1.00,134.40,38.40 +-163.20,33.60,7.37,0.00,1.00,-38.40,38.40 +-168.00,28.80,7.35,0.00,1.00,144.00,33.60 +-168.00,24.00,7.33,0.00,1.00,-28.80,28.80 +-172.80,19.20,7.31,0.00,1.00,153.60,24.00 +-172.80,14.40,7.28,0.00,1.00,-19.20,19.20 +-177.60,9.60,7.26,0.00,1.00,163.20,14.40 +-177.60,4.80,7.24,0.00,1.00,-9.60,9.60 +-177.60,0.00,7.22,0.00,1.00,172.80,4.80 +177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 +177.60,-4.80,7.18,0.00,1.00,-177.60,-0.00 +177.60,-9.60,7.16,0.00,1.00,4.80,-4.80 +172.80,-14.40,7.13,0.00,1.00,-168.00,-9.60 +172.80,-19.20,7.11,0.00,1.00,14.40,-14.40 +168.00,-24.00,7.09,0.00,1.00,-158.40,-19.20 +168.00,-28.80,7.07,0.00,1.00,24.00,-24.00 +163.20,-33.60,7.05,0.00,1.00,-148.80,-28.80 +163.20,-38.40,7.03,0.00,1.00,33.60,-33.60 +158.40,-43.20,7.01,0.00,1.00,-139.20,-38.40 +153.60,-43.20,6.99,0.00,1.00,43.20,-38.40 +148.80,-48.00,6.96,0.00,1.00,-129.60,-43.20 +144.00,-52.80,6.94,0.00,1.00,52.80,-48.00 +139.20,-57.60,6.92,0.00,1.00,-120.00,-52.80 +134.40,-57.60,6.90,0.00,1.00,62.40,-57.60 +124.80,-62.40,6.88,0.00,1.00,-110.40,-57.60 +115.20,-67.20,6.86,0.00,1.00,72.00,-62.40 +105.60,-67.20,6.84,0.00,1.00,-100.80,-62.40 +91.20,-67.20,6.81,0.00,1.00,81.60,-67.20 +81.60,-67.20,6.79,0.00,1.00,-91.20,-67.20 +67.20,-67.20,6.77,0.00,1.00,96.00,-67.20 +57.60,-62.40,6.75,0.00,1.00,-81.60,-62.40 +48.00,-62.40,6.73,0.00,1.00,105.60,-62.40 +43.20,-57.60,6.71,0.00,1.00,-72.00,-62.40 +38.40,-52.80,6.69,0.00,1.00,115.20,-57.60 +33.60,-52.80,6.66,0.00,1.00,-62.40,-52.80 +28.80,-48.00,6.64,0.00,1.00,124.80,-52.80 +24.00,-43.20,6.62,0.00,1.00,-52.80,-48.00 +19.20,-38.40,6.60,0.00,1.00,134.40,-43.20 +19.20,-33.60,6.58,0.00,1.00,-43.20,-38.40 +14.40,-28.80,6.56,0.00,1.00,144.00,-33.60 +14.40,-24.00,6.54,0.00,1.00,-33.60,-28.80 +9.60,-24.00,6.52,0.00,1.00,153.60,-24.00 +9.60,-19.20,6.49,0.00,1.00,-24.00,-24.00 +4.80,-14.40,6.47,0.00,1.00,163.20,-19.20 +4.80,-9.60,6.45,0.00,1.00,-14.40,-14.40 +0.00,-4.80,6.43,0.00,1.00,172.80,-9.60 +0.00,0.00,6.41,0.00,1.00,-4.80,-4.80 +-0.00,4.80,6.39,0.00,1.00,0.00,0.00 +-4.80,9.60,6.37,0.00,1.00,-177.60,4.80 +-4.80,14.40,6.34,0.00,1.00,9.60,9.60 +-9.60,19.20,6.32,0.00,1.00,-168.00,14.40 +-9.60,19.20,6.30,0.00,1.00,19.20,14.40 +-14.40,24.00,6.28,0.00,1.00,-158.40,19.20 +-19.20,28.80,6.26,0.00,1.00,28.80,24.00 +-19.20,33.60,6.24,0.00,1.00,-148.80,28.80 +-24.00,38.40,6.22,0.00,1.00,38.40,33.60 +-28.80,43.20,6.19,0.00,1.00,-139.20,38.40 +-33.60,43.20,6.17,0.00,1.00,48.00,38.40 +-38.40,48.00,6.15,0.00,1.00,-129.60,43.20 +-43.20,52.80,6.13,0.00,1.00,57.60,48.00 +-48.00,52.80,6.11,0.00,1.00,-120.00,52.80 +-52.80,57.60,6.09,0.00,1.00,67.20,52.80 +-62.40,57.60,6.07,0.00,1.00,-110.40,57.60 +-72.00,62.40,6.05,0.00,1.00,76.80,57.60 +-81.60,62.40,6.02,0.00,1.00,-100.80,62.40 +-91.20,62.40,6.00,0.00,1.00,86.40,62.40 +-100.80,62.40,5.98,0.00,1.00,-86.40,62.40 +-110.40,62.40,5.96,0.00,1.00,96.00,62.40 +-120.00,57.60,5.94,0.00,1.00,-76.80,57.60 +-129.60,57.60,5.92,0.00,1.00,105.60,57.60 +-134.40,52.80,5.90,0.00,1.00,-67.20,57.60 +-139.20,48.00,5.87,0.00,1.00,115.20,52.80 +-144.00,48.00,5.85,0.00,1.00,-57.60,48.00 +-148.80,43.20,5.83,0.00,1.00,124.80,48.00 +-153.60,38.40,5.81,0.00,1.00,-48.00,43.20 +-158.40,33.60,5.79,0.00,1.00,134.40,38.40 +-163.20,33.60,5.77,0.00,1.00,-38.40,33.60 +-163.20,28.80,5.75,0.00,1.00,144.00,28.80 +-168.00,24.00,5.72,0.00,1.00,-28.80,28.80 +-168.00,19.20,5.70,0.00,1.00,153.60,24.00 +-172.80,14.40,5.68,0.00,1.00,-19.20,19.20 +-172.80,9.60,5.66,0.00,1.00,163.20,14.40 +-177.60,4.80,5.64,0.00,1.00,-9.60,9.60 +-177.60,0.00,5.62,0.00,1.00,172.80,4.80 +177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 +177.60,-4.80,5.58,0.00,1.00,-177.60,-0.00 +172.80,-9.60,5.55,0.00,1.00,4.80,-4.80 +172.80,-14.40,5.53,0.00,1.00,-168.00,-9.60 +168.00,-19.20,5.51,0.00,1.00,14.40,-14.40 +168.00,-24.00,5.49,0.00,1.00,-158.40,-19.20 +163.20,-28.80,5.47,0.00,1.00,24.00,-24.00 +163.20,-33.60,5.45,0.00,1.00,-148.80,-28.80 +158.40,-33.60,5.43,0.00,1.00,33.60,-28.80 +153.60,-38.40,5.40,0.00,1.00,-139.20,-33.60 +148.80,-43.20,5.38,0.00,1.00,43.20,-38.40 +144.00,-48.00,5.36,0.00,1.00,-129.60,-43.20 +139.20,-48.00,5.34,0.00,1.00,52.80,-48.00 +134.40,-52.80,5.32,0.00,1.00,-120.00,-48.00 +129.60,-57.60,5.30,0.00,1.00,62.40,-52.80 +120.00,-57.60,5.28,0.00,1.00,-110.40,-57.60 +110.40,-62.40,5.26,0.00,1.00,72.00,-57.60 +100.80,-62.40,5.23,0.00,1.00,-100.80,-57.60 +91.20,-62.40,5.21,0.00,1.00,81.60,-62.40 +81.60,-62.40,5.19,0.00,1.00,-91.20,-62.40 +72.00,-62.40,5.17,0.00,1.00,96.00,-62.40 +62.40,-57.60,5.15,0.00,1.00,-81.60,-62.40 +52.80,-57.60,5.13,0.00,1.00,105.60,-57.60 +48.00,-52.80,5.11,0.00,1.00,-72.00,-57.60 +43.20,-52.80,5.08,0.00,1.00,115.20,-52.80 +38.40,-48.00,5.06,0.00,1.00,-62.40,-52.80 +33.60,-43.20,5.04,0.00,1.00,124.80,-48.00 +28.80,-43.20,5.02,0.00,1.00,-52.80,-43.20 +24.00,-38.40,5.00,0.00,1.00,134.40,-38.40 +19.20,-33.60,4.98,0.00,1.00,-43.20,-38.40 +19.20,-28.80,4.96,0.00,1.00,144.00,-33.60 +14.40,-24.00,4.93,0.00,1.00,-33.60,-28.80 +9.60,-19.20,4.91,0.00,1.00,153.60,-24.00 +9.60,-19.20,4.89,0.00,1.00,-24.00,-19.20 +4.80,-14.40,4.87,0.00,1.00,163.20,-14.40 +4.80,-9.60,4.85,0.00,1.00,-14.40,-14.40 +0.00,-4.80,4.83,0.00,1.00,172.80,-9.60 +0.00,0.00,4.81,0.00,1.00,-4.80,-4.80 +-4.80,4.80,4.79,0.00,1.00,0.00,0.00 +-4.80,9.60,4.76,0.00,1.00,-177.60,4.80 +-9.60,14.40,4.74,0.00,1.00,9.60,9.60 +-9.60,14.40,4.72,0.00,1.00,-168.00,9.60 +-14.40,19.20,4.70,0.00,1.00,19.20,14.40 +-14.40,24.00,4.68,0.00,1.00,-158.40,19.20 +-19.20,28.80,4.66,0.00,1.00,28.80,24.00 +-24.00,33.60,4.64,0.00,1.00,-148.80,28.80 +-28.80,33.60,4.61,0.00,1.00,38.40,28.80 +-28.80,38.40,4.59,0.00,1.00,-139.20,33.60 +-33.60,43.20,4.57,0.00,1.00,48.00,38.40 +-38.40,43.20,4.55,0.00,1.00,-129.60,43.20 +-48.00,48.00,4.53,0.00,1.00,57.60,43.20 +-52.80,52.80,4.51,0.00,1.00,-120.00,48.00 +-57.60,52.80,4.49,0.00,1.00,67.20,48.00 +-67.20,57.60,4.46,0.00,1.00,-110.40,52.80 +-76.80,57.60,4.44,0.00,1.00,76.80,52.80 +-81.60,57.60,4.42,0.00,1.00,-100.80,57.60 +-91.20,57.60,4.40,0.00,1.00,86.40,57.60 +-100.80,57.60,4.38,0.00,1.00,-86.40,57.60 +-110.40,57.60,4.36,0.00,1.00,96.00,57.60 +-115.20,52.80,4.34,0.00,1.00,-76.80,52.80 +-124.80,52.80,4.32,0.00,1.00,105.60,52.80 +-129.60,48.00,4.29,0.00,1.00,-67.20,52.80 +-139.20,48.00,4.27,0.00,1.00,115.20,48.00 +-144.00,43.20,4.25,0.00,1.00,-57.60,48.00 +-148.80,38.40,4.23,0.00,1.00,124.80,43.20 +-153.60,38.40,4.21,0.00,1.00,-48.00,38.40 +-153.60,33.60,4.19,0.00,1.00,134.40,38.40 +-158.40,28.80,4.17,0.00,1.00,-38.40,33.60 +-163.20,24.00,4.14,0.00,1.00,144.00,28.80 +-163.20,24.00,4.12,0.00,1.00,-28.80,24.00 +-168.00,19.20,4.10,0.00,1.00,153.60,24.00 +-172.80,14.40,4.08,0.00,1.00,-19.20,19.20 +-172.80,9.60,4.06,0.00,1.00,163.20,14.40 +-177.60,4.80,4.04,0.00,1.00,-9.60,9.60 +-177.60,0.00,4.02,0.00,1.00,172.80,4.80 +177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 +177.60,-4.80,3.97,0.00,1.00,-177.60,-0.00 +172.80,-9.60,3.95,0.00,1.00,4.80,-4.80 +172.80,-14.40,3.93,0.00,1.00,-168.00,-9.60 +168.00,-19.20,3.91,0.00,1.00,14.40,-14.40 +163.20,-24.00,3.89,0.00,1.00,-158.40,-19.20 +163.20,-24.00,3.87,0.00,1.00,24.00,-24.00 +158.40,-28.80,3.85,0.00,1.00,-148.80,-24.00 +153.60,-33.60,3.82,0.00,1.00,33.60,-28.80 +153.60,-38.40,3.80,0.00,1.00,-139.20,-33.60 +148.80,-38.40,3.78,0.00,1.00,43.20,-38.40 +144.00,-43.20,3.76,0.00,1.00,-129.60,-38.40 +139.20,-48.00,3.74,0.00,1.00,52.80,-43.20 +129.60,-48.00,3.72,0.00,1.00,-120.00,-48.00 +124.80,-52.80,3.70,0.00,1.00,62.40,-48.00 +115.20,-52.80,3.67,0.00,1.00,-110.40,-52.80 +110.40,-57.60,3.65,0.00,1.00,72.00,-52.80 +100.80,-57.60,3.63,0.00,1.00,-100.80,-52.80 +91.20,-57.60,3.61,0.00,1.00,81.60,-57.60 +81.60,-57.60,3.59,0.00,1.00,-91.20,-57.60 +76.80,-57.60,3.57,0.00,1.00,96.00,-57.60 +67.20,-57.60,3.55,0.00,1.00,-81.60,-57.60 +57.60,-52.80,3.52,0.00,1.00,105.60,-52.80 +52.80,-52.80,3.50,0.00,1.00,-72.00,-52.80 +48.00,-48.00,3.48,0.00,1.00,115.20,-48.00 +38.40,-43.20,3.46,0.00,1.00,-62.40,-48.00 +33.60,-43.20,3.44,0.00,1.00,124.80,-43.20 +28.80,-38.40,3.42,0.00,1.00,-52.80,-43.20 +28.80,-33.60,3.40,0.00,1.00,134.40,-38.40 +24.00,-33.60,3.38,0.00,1.00,-43.20,-33.60 +19.20,-28.80,3.35,0.00,1.00,144.00,-28.80 +14.40,-24.00,3.33,0.00,1.00,-33.60,-28.80 +14.40,-19.20,3.31,0.00,1.00,153.60,-24.00 +9.60,-14.40,3.29,0.00,1.00,-24.00,-19.20 +9.60,-14.40,3.27,0.00,1.00,163.20,-14.40 +4.80,-9.60,3.25,0.00,1.00,-14.40,-9.60 +4.80,-4.80,3.23,0.00,1.00,172.80,-9.60 +0.00,0.00,3.20,0.00,1.00,-4.80,-4.80 +-4.80,4.80,3.18,0.00,1.00,0.00,0.00 +-4.80,9.60,3.16,0.00,1.00,-177.60,4.80 +-9.60,9.60,3.14,0.00,1.00,9.60,9.60 +-9.60,14.40,3.12,0.00,1.00,-168.00,9.60 +-14.40,19.20,3.10,0.00,1.00,19.20,14.40 +-19.20,24.00,3.08,0.00,1.00,-158.40,19.20 +-24.00,24.00,3.05,0.00,1.00,28.80,24.00 +-24.00,28.80,3.03,0.00,1.00,-148.80,24.00 +-28.80,33.60,3.01,0.00,1.00,38.40,28.80 +-33.60,38.40,2.99,0.00,1.00,-139.20,33.60 +-38.40,38.40,2.97,0.00,1.00,48.00,33.60 +-43.20,43.20,2.95,0.00,1.00,-129.60,38.40 +-48.00,43.20,2.93,0.00,1.00,57.60,43.20 +-52.80,48.00,2.91,0.00,1.00,-120.00,43.20 +-62.40,48.00,2.88,0.00,1.00,67.20,48.00 +-67.20,52.80,2.86,0.00,1.00,-110.40,48.00 +-76.80,52.80,2.84,0.00,1.00,76.80,48.00 +-86.40,52.80,2.82,0.00,1.00,-100.80,52.80 +-91.20,52.80,2.80,0.00,1.00,86.40,52.80 +-100.80,52.80,2.78,0.00,1.00,-86.40,52.80 +-105.60,52.80,2.76,0.00,1.00,96.00,52.80 +-115.20,48.00,2.73,0.00,1.00,-76.80,48.00 +-120.00,48.00,2.71,0.00,1.00,105.60,48.00 +-129.60,48.00,2.69,0.00,1.00,-67.20,48.00 +-134.40,43.20,2.67,0.00,1.00,115.20,43.20 +-139.20,43.20,2.65,0.00,1.00,-57.60,43.20 +-144.00,38.40,2.63,0.00,1.00,124.80,38.40 +-148.80,33.60,2.61,0.00,1.00,-48.00,38.40 +-153.60,33.60,2.58,0.00,1.00,134.40,33.60 +-158.40,28.80,2.56,0.00,1.00,-38.40,28.80 +-158.40,24.00,2.54,0.00,1.00,144.00,28.80 +-163.20,19.20,2.52,0.00,1.00,-28.80,24.00 +-168.00,19.20,2.50,0.00,1.00,153.60,19.20 +-168.00,14.40,2.48,0.00,1.00,-19.20,14.40 +-172.80,9.60,2.46,0.00,1.00,163.20,14.40 +-177.60,4.80,2.44,0.00,1.00,-9.60,9.60 +-177.60,0.00,2.41,0.00,1.00,172.80,4.80 +177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 +177.60,-4.80,2.37,0.00,1.00,-177.60,-0.00 +172.80,-9.60,2.35,0.00,1.00,4.80,-4.80 +168.00,-14.40,2.33,0.00,1.00,-168.00,-9.60 +168.00,-19.20,2.31,0.00,1.00,14.40,-14.40 +163.20,-19.20,2.29,0.00,1.00,-158.40,-14.40 +158.40,-24.00,2.26,0.00,1.00,24.00,-19.20 +158.40,-28.80,2.24,0.00,1.00,-148.80,-24.00 +153.60,-33.60,2.22,0.00,1.00,33.60,-28.80 +148.80,-33.60,2.20,0.00,1.00,-139.20,-28.80 +144.00,-38.40,2.18,0.00,1.00,43.20,-33.60 +139.20,-43.20,2.16,0.00,1.00,-129.60,-38.40 +134.40,-43.20,2.14,0.00,1.00,52.80,-38.40 +129.60,-48.00,2.11,0.00,1.00,-120.00,-43.20 +120.00,-48.00,2.09,0.00,1.00,62.40,-43.20 +115.20,-48.00,2.07,0.00,1.00,-110.40,-48.00 +105.60,-52.80,2.05,0.00,1.00,72.00,-48.00 +100.80,-52.80,2.03,0.00,1.00,-100.80,-48.00 +91.20,-52.80,2.01,0.00,1.00,81.60,-52.80 +86.40,-52.80,1.99,0.00,1.00,-91.20,-52.80 +76.80,-52.80,1.97,0.00,1.00,96.00,-52.80 +67.20,-52.80,1.94,0.00,1.00,-81.60,-52.80 +62.40,-48.00,1.92,0.00,1.00,105.60,-48.00 +52.80,-48.00,1.90,0.00,1.00,-72.00,-48.00 +48.00,-43.20,1.88,0.00,1.00,115.20,-48.00 +43.20,-43.20,1.86,0.00,1.00,-62.40,-43.20 +38.40,-38.40,1.84,0.00,1.00,124.80,-43.20 +33.60,-38.40,1.82,0.00,1.00,-52.80,-38.40 +28.80,-33.60,1.79,0.00,1.00,134.40,-33.60 +24.00,-28.80,1.77,0.00,1.00,-43.20,-33.60 +24.00,-24.00,1.75,0.00,1.00,144.00,-28.80 +19.20,-24.00,1.73,0.00,1.00,-33.60,-24.00 +14.40,-19.20,1.71,0.00,1.00,153.60,-24.00 +9.60,-14.40,1.69,0.00,1.00,-24.00,-19.20 +9.60,-9.60,1.67,0.00,1.00,163.20,-14.40 +4.80,-9.60,1.64,0.00,1.00,-14.40,-9.60 +4.80,-4.80,1.62,0.00,1.00,172.80,-9.60 +0.00,0.00,1.60,0.00,1.00,-4.80,-4.80 +-4.80,4.80,1.58,0.00,1.00,0.00,0.00 +-4.80,4.80,1.56,0.00,1.00,-177.60,4.80 +-9.60,9.60,1.54,0.00,1.00,9.60,4.80 +-14.40,14.40,1.52,0.00,1.00,-168.00,9.60 +-14.40,19.20,1.50,0.00,1.00,19.20,14.40 +-19.20,19.20,1.47,0.00,1.00,-158.40,19.20 +-24.00,24.00,1.45,0.00,1.00,28.80,19.20 +-28.80,28.80,1.43,0.00,1.00,-148.80,24.00 +-33.60,28.80,1.41,0.00,1.00,38.40,28.80 +-38.40,33.60,1.39,0.00,1.00,-139.20,28.80 +-43.20,38.40,1.37,0.00,1.00,48.00,33.60 +-48.00,38.40,1.35,0.00,1.00,-129.60,33.60 +-52.80,43.20,1.32,0.00,1.00,57.60,38.40 +-57.60,43.20,1.30,0.00,1.00,-120.00,38.40 +-62.40,43.20,1.28,0.00,1.00,67.20,43.20 +-72.00,48.00,1.26,0.00,1.00,-110.40,43.20 +-76.80,48.00,1.24,0.00,1.00,76.80,43.20 +-86.40,48.00,1.22,0.00,1.00,-100.80,48.00 +-91.20,48.00,1.20,0.00,1.00,86.40,48.00 +-100.80,48.00,1.17,0.00,1.00,-86.40,48.00 +-105.60,48.00,1.15,0.00,1.00,96.00,48.00 +-110.40,48.00,1.13,0.00,1.00,-76.80,48.00 +-120.00,43.20,1.11,0.00,1.00,105.60,43.20 +-124.80,43.20,1.09,0.00,1.00,-67.20,43.20 +-129.60,38.40,1.07,0.00,1.00,115.20,43.20 +-134.40,38.40,1.05,0.00,1.00,-57.60,38.40 +-139.20,33.60,1.03,0.00,1.00,124.80,38.40 +-144.00,33.60,1.00,0.00,1.00,-48.00,33.60 +-148.80,28.80,0.98,0.00,1.00,134.40,33.60 +-153.60,24.00,0.96,0.00,1.00,-38.40,28.80 +-158.40,24.00,0.94,0.00,1.00,144.00,24.00 +-163.20,19.20,0.92,0.00,1.00,-28.80,24.00 +-163.20,14.40,0.90,0.00,1.00,153.60,19.20 +-168.00,14.40,0.88,0.00,1.00,-19.20,14.40 +-172.80,9.60,0.85,0.00,1.00,163.20,14.40 +-172.80,4.80,0.83,0.00,1.00,-9.60,9.60 +-177.60,0.00,0.81,0.00,1.00,172.80,4.80 +177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 +172.80,-4.80,0.77,0.00,1.00,-177.60,-0.00 +172.80,-9.60,0.75,0.00,1.00,4.80,-4.80 +168.00,-14.40,0.73,0.00,1.00,-168.00,-9.60 +163.20,-14.40,0.70,0.00,1.00,14.40,-14.40 +163.20,-19.20,0.68,0.00,1.00,-158.40,-14.40 +158.40,-24.00,0.66,0.00,1.00,24.00,-19.20 +153.60,-24.00,0.64,0.00,1.00,-148.80,-24.00 +148.80,-28.80,0.62,0.00,1.00,33.60,-24.00 +144.00,-33.60,0.60,0.00,1.00,-139.20,-28.80 +139.20,-33.60,0.58,0.00,1.00,43.20,-33.60 +134.40,-38.40,0.56,0.00,1.00,-129.60,-33.60 +129.60,-38.40,0.53,0.00,1.00,52.80,-38.40 +124.80,-43.20,0.51,0.00,1.00,-120.00,-38.40 +120.00,-43.20,0.49,0.00,1.00,62.40,-43.20 +110.40,-48.00,0.47,0.00,1.00,-110.40,-43.20 +105.60,-48.00,0.45,0.00,1.00,72.00,-43.20 +100.80,-48.00,0.43,0.00,1.00,-100.80,-48.00 +91.20,-48.00,0.41,0.00,1.00,81.60,-48.00 +86.40,-48.00,0.38,0.00,1.00,-91.20,-48.00 +76.80,-48.00,0.36,0.00,1.00,96.00,-48.00 +72.00,-48.00,0.34,0.00,1.00,-81.60,-48.00 +62.40,-43.20,0.32,0.00,1.00,105.60,-43.20 +57.60,-43.20,0.30,0.00,1.00,-72.00,-43.20 +52.80,-43.20,0.28,0.00,1.00,115.20,-43.20 +48.00,-38.40,0.26,0.00,1.00,-62.40,-38.40 +43.20,-38.40,0.23,0.00,1.00,124.80,-38.40 +38.40,-33.60,0.21,0.00,1.00,-52.80,-33.60 +33.60,-28.80,0.19,0.00,1.00,134.40,-33.60 +28.80,-28.80,0.17,0.00,1.00,-43.20,-28.80 +24.00,-24.00,0.15,0.00,1.00,144.00,-28.80 +19.20,-19.20,0.13,0.00,1.00,-33.60,-24.00 +14.40,-19.20,0.11,0.00,1.00,153.60,-19.20 +14.40,-14.40,0.09,0.00,1.00,-24.00,-19.20 +9.60,-9.60,0.06,0.00,1.00,163.20,-14.40 +4.80,-4.80,0.04,0.00,1.00,-14.40,-9.60 +4.80,-4.80,0.02,0.00,1.00,172.80,-4.80 +0.00,0.00,0.00,0.00,1.00,-4.80,-4.80 +-4.80,4.80,0.00,0.00,1.00,0.00,0.00 +-4.80,4.80,0.02,0.00,1.00,-177.60,4.80 +-9.60,9.60,0.04,0.00,1.00,9.60,4.80 +-14.40,14.40,0.06,0.00,1.00,-168.00,9.60 +-19.20,14.40,0.09,0.00,1.00,19.20,14.40 +-24.00,19.20,0.11,0.00,1.00,-158.40,14.40 +-24.00,24.00,0.13,0.00,1.00,28.80,19.20 +-28.80,24.00,0.15,0.00,1.00,-148.80,24.00 +-33.60,28.80,0.17,0.00,1.00,38.40,24.00 +-38.40,28.80,0.19,0.00,1.00,-139.20,28.80 +-43.20,33.60,0.21,0.00,1.00,48.00,28.80 +-48.00,33.60,0.23,0.00,1.00,-129.60,33.60 +-52.80,38.40,0.26,0.00,1.00,57.60,33.60 +-62.40,38.40,0.28,0.00,1.00,-120.00,38.40 +-67.20,38.40,0.30,0.00,1.00,67.20,38.40 +-72.00,43.20,0.32,0.00,1.00,-110.40,38.40 +-76.80,43.20,0.34,0.00,1.00,76.80,38.40 +-86.40,43.20,0.36,0.00,1.00,-100.80,43.20 +-91.20,43.20,0.38,0.00,1.00,86.40,43.20 +-96.00,43.20,0.41,0.00,1.00,-86.40,43.20 +-105.60,43.20,0.43,0.00,1.00,96.00,43.20 +-110.40,43.20,0.45,0.00,1.00,-76.80,43.20 +-115.20,38.40,0.47,0.00,1.00,105.60,38.40 +-124.80,38.40,0.49,0.00,1.00,-67.20,38.40 +-129.60,38.40,0.51,0.00,1.00,115.20,38.40 +-134.40,33.60,0.53,0.00,1.00,-57.60,33.60 +-139.20,33.60,0.56,0.00,1.00,124.80,33.60 +-144.00,28.80,0.58,0.00,1.00,-48.00,28.80 +-148.80,28.80,0.60,0.00,1.00,134.40,28.80 +-153.60,24.00,0.62,0.00,1.00,-38.40,24.00 +-158.40,19.20,0.64,0.00,1.00,144.00,24.00 +-158.40,19.20,0.66,0.00,1.00,-28.80,19.20 +-163.20,14.40,0.68,0.00,1.00,153.60,19.20 +-168.00,9.60,0.70,0.00,1.00,-19.20,14.40 +-172.80,9.60,0.73,0.00,1.00,163.20,9.60 +-172.80,4.80,0.75,0.00,1.00,-9.60,9.60 +-177.60,0.00,0.77,0.00,1.00,172.80,4.80 +177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 +172.80,-4.80,0.81,0.00,1.00,-177.60,-0.00 +172.80,-9.60,0.83,0.00,1.00,4.80,-4.80 +168.00,-9.60,0.85,0.00,1.00,-168.00,-9.60 +163.20,-14.40,0.88,0.00,1.00,14.40,-9.60 +158.40,-19.20,0.90,0.00,1.00,-158.40,-14.40 +158.40,-19.20,0.92,0.00,1.00,24.00,-19.20 +153.60,-24.00,0.94,0.00,1.00,-148.80,-19.20 +148.80,-28.80,0.96,0.00,1.00,33.60,-24.00 +144.00,-28.80,0.98,0.00,1.00,-139.20,-24.00 +139.20,-33.60,1.00,0.00,1.00,43.20,-28.80 +134.40,-33.60,1.03,0.00,1.00,-129.60,-28.80 +129.60,-38.40,1.05,0.00,1.00,52.80,-33.60 +124.80,-38.40,1.07,0.00,1.00,-120.00,-33.60 +115.20,-38.40,1.09,0.00,1.00,62.40,-38.40 +110.40,-43.20,1.11,0.00,1.00,-110.40,-38.40 +105.60,-43.20,1.13,0.00,1.00,72.00,-38.40 +96.00,-43.20,1.15,0.00,1.00,-100.80,-43.20 +91.20,-43.20,1.17,0.00,1.00,81.60,-43.20 +86.40,-43.20,1.20,0.00,1.00,-91.20,-43.20 +76.80,-43.20,1.22,0.00,1.00,96.00,-43.20 +72.00,-43.20,1.24,0.00,1.00,-81.60,-43.20 +67.20,-38.40,1.26,0.00,1.00,105.60,-38.40 +62.40,-38.40,1.28,0.00,1.00,-72.00,-38.40 +52.80,-38.40,1.30,0.00,1.00,115.20,-38.40 +48.00,-33.60,1.32,0.00,1.00,-62.40,-38.40 +43.20,-33.60,1.35,0.00,1.00,124.80,-33.60 +38.40,-28.80,1.37,0.00,1.00,-52.80,-33.60 +33.60,-28.80,1.39,0.00,1.00,134.40,-28.80 +28.80,-24.00,1.41,0.00,1.00,-43.20,-28.80 +24.00,-24.00,1.43,0.00,1.00,144.00,-24.00 +24.00,-19.20,1.45,0.00,1.00,-33.60,-24.00 +19.20,-14.40,1.47,0.00,1.00,153.60,-19.20 +14.40,-14.40,1.50,0.00,1.00,-24.00,-14.40 +9.60,-9.60,1.52,0.00,1.00,163.20,-14.40 +4.80,-4.80,1.54,0.00,1.00,-14.40,-9.60 +4.80,-4.80,1.56,0.00,1.00,172.80,-4.80 +0.00,0.00,1.58,0.00,1.00,-4.80,-4.80 +-4.80,4.80,1.60,0.00,1.00,0.00,0.00 +-9.60,4.80,1.62,0.00,1.00,-177.60,4.80 +-9.60,9.60,1.64,0.00,1.00,9.60,4.80 +-14.40,9.60,1.67,0.00,1.00,-168.00,9.60 +-19.20,14.40,1.69,0.00,1.00,19.20,9.60 +-24.00,19.20,1.71,0.00,1.00,-158.40,14.40 +-28.80,19.20,1.73,0.00,1.00,28.80,19.20 +-33.60,24.00,1.75,0.00,1.00,-148.80,19.20 +-38.40,24.00,1.77,0.00,1.00,38.40,24.00 +-43.20,28.80,1.79,0.00,1.00,-139.20,24.00 +-48.00,28.80,1.82,0.00,1.00,48.00,28.80 +-52.80,33.60,1.84,0.00,1.00,-129.60,28.80 +-57.60,33.60,1.86,0.00,1.00,57.60,28.80 +-62.40,33.60,1.88,0.00,1.00,-120.00,33.60 +-67.20,38.40,1.90,0.00,1.00,67.20,33.60 +-72.00,38.40,1.92,0.00,1.00,-110.40,33.60 +-81.60,38.40,1.94,0.00,1.00,76.80,38.40 +-86.40,38.40,1.97,0.00,1.00,-100.80,38.40 +-91.20,38.40,1.99,0.00,1.00,86.40,38.40 +-96.00,38.40,2.01,0.00,1.00,-86.40,38.40 +-105.60,38.40,2.03,0.00,1.00,96.00,38.40 +-110.40,38.40,2.05,0.00,1.00,-76.80,38.40 +-115.20,33.60,2.07,0.00,1.00,105.60,33.60 +-120.00,33.60,2.09,0.00,1.00,-67.20,33.60 +-124.80,33.60,2.11,0.00,1.00,115.20,33.60 +-129.60,28.80,2.14,0.00,1.00,-57.60,33.60 +-134.40,28.80,2.16,0.00,1.00,124.80,28.80 +-139.20,24.00,2.18,0.00,1.00,-48.00,28.80 +-144.00,24.00,2.20,0.00,1.00,134.40,24.00 +-148.80,19.20,2.22,0.00,1.00,-38.40,24.00 +-153.60,19.20,2.24,0.00,1.00,144.00,19.20 +-158.40,14.40,2.26,0.00,1.00,-28.80,19.20 +-163.20,14.40,2.29,0.00,1.00,153.60,14.40 +-168.00,9.60,2.31,0.00,1.00,-19.20,14.40 +-172.80,9.60,2.33,0.00,1.00,163.20,9.60 +-172.80,4.80,2.35,0.00,1.00,-9.60,9.60 +-177.60,0.00,2.37,0.00,1.00,172.80,4.80 +177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 +172.80,-4.80,2.41,0.00,1.00,-177.60,-0.00 +172.80,-9.60,2.44,0.00,1.00,4.80,-4.80 +168.00,-9.60,2.46,0.00,1.00,-168.00,-9.60 +163.20,-14.40,2.48,0.00,1.00,14.40,-9.60 +158.40,-14.40,2.50,0.00,1.00,-158.40,-14.40 +153.60,-19.20,2.52,0.00,1.00,24.00,-14.40 +148.80,-19.20,2.54,0.00,1.00,-148.80,-19.20 +144.00,-24.00,2.56,0.00,1.00,33.60,-19.20 +139.20,-24.00,2.58,0.00,1.00,-139.20,-24.00 +134.40,-28.80,2.61,0.00,1.00,43.20,-24.00 +129.60,-28.80,2.63,0.00,1.00,-129.60,-28.80 +124.80,-33.60,2.65,0.00,1.00,52.80,-28.80 +120.00,-33.60,2.67,0.00,1.00,-120.00,-33.60 +115.20,-33.60,2.69,0.00,1.00,62.40,-33.60 +110.40,-38.40,2.71,0.00,1.00,-110.40,-33.60 +105.60,-38.40,2.73,0.00,1.00,72.00,-33.60 +96.00,-38.40,2.76,0.00,1.00,-100.80,-38.40 +91.20,-38.40,2.78,0.00,1.00,81.60,-38.40 +86.40,-38.40,2.80,0.00,1.00,-91.20,-38.40 +81.60,-38.40,2.82,0.00,1.00,96.00,-38.40 +72.00,-38.40,2.84,0.00,1.00,-81.60,-38.40 +67.20,-38.40,2.86,0.00,1.00,105.60,-38.40 +62.40,-33.60,2.88,0.00,1.00,-72.00,-33.60 +57.60,-33.60,2.91,0.00,1.00,115.20,-33.60 +52.80,-33.60,2.93,0.00,1.00,-62.40,-33.60 +48.00,-28.80,2.95,0.00,1.00,124.80,-28.80 +43.20,-28.80,2.97,0.00,1.00,-52.80,-28.80 +38.40,-24.00,2.99,0.00,1.00,134.40,-28.80 +33.60,-24.00,3.01,0.00,1.00,-43.20,-24.00 +28.80,-19.20,3.03,0.00,1.00,144.00,-24.00 +24.00,-19.20,3.05,0.00,1.00,-33.60,-19.20 +19.20,-14.40,3.08,0.00,1.00,153.60,-19.20 +14.40,-9.60,3.10,0.00,1.00,-24.00,-14.40 +9.60,-9.60,3.12,0.00,1.00,163.20,-9.60 +9.60,-4.80,3.14,0.00,1.00,-14.40,-9.60 +4.80,-4.80,3.16,0.00,1.00,172.80,-4.80 +0.00,0.00,3.18,0.00,1.00,-4.80,-4.80 +-4.80,4.80,3.20,0.00,1.00,0.00,0.00 +-9.60,4.80,3.23,0.00,1.00,-177.60,4.80 +-14.40,9.60,3.25,0.00,1.00,9.60,4.80 +-14.40,9.60,3.27,0.00,1.00,-168.00,9.60 +-19.20,14.40,3.29,0.00,1.00,19.20,9.60 +-24.00,14.40,3.31,0.00,1.00,-158.40,14.40 +-28.80,19.20,3.33,0.00,1.00,28.80,14.40 +-33.60,19.20,3.35,0.00,1.00,-148.80,19.20 +-38.40,24.00,3.38,0.00,1.00,38.40,19.20 +-43.20,24.00,3.40,0.00,1.00,-139.20,19.20 +-48.00,24.00,3.42,0.00,1.00,48.00,24.00 +-52.80,28.80,3.44,0.00,1.00,-129.60,24.00 +-57.60,28.80,3.46,0.00,1.00,57.60,28.80 +-62.40,28.80,3.48,0.00,1.00,-120.00,28.80 +-67.20,33.60,3.50,0.00,1.00,67.20,28.80 +-72.00,33.60,3.52,0.00,1.00,-110.40,28.80 +-81.60,33.60,3.55,0.00,1.00,76.80,33.60 +-86.40,33.60,3.57,0.00,1.00,-100.80,33.60 +-91.20,33.60,3.59,0.00,1.00,86.40,33.60 +-96.00,33.60,3.61,0.00,1.00,-86.40,33.60 +-100.80,33.60,3.63,0.00,1.00,96.00,33.60 +-110.40,33.60,3.65,0.00,1.00,-76.80,33.60 +-115.20,33.60,3.67,0.00,1.00,105.60,28.80 +-120.00,28.80,3.70,0.00,1.00,-67.20,28.80 +-124.80,28.80,3.72,0.00,1.00,115.20,28.80 +-129.60,28.80,3.74,0.00,1.00,-57.60,28.80 +-134.40,24.00,3.76,0.00,1.00,124.80,24.00 +-139.20,24.00,3.78,0.00,1.00,-48.00,24.00 +-144.00,19.20,3.80,0.00,1.00,134.40,24.00 +-148.80,19.20,3.82,0.00,1.00,-38.40,19.20 +-153.60,14.40,3.85,0.00,1.00,144.00,19.20 +-158.40,14.40,3.87,0.00,1.00,-28.80,14.40 +-163.20,9.60,3.89,0.00,1.00,153.60,14.40 +-168.00,9.60,3.91,0.00,1.00,-19.20,9.60 +-168.00,4.80,3.93,0.00,1.00,163.20,9.60 +-172.80,4.80,3.95,0.00,1.00,-9.60,4.80 +-177.60,0.00,3.97,0.00,1.00,172.80,4.80 +177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 +172.80,-4.80,4.02,0.00,1.00,-177.60,-0.00 +168.00,-4.80,4.04,0.00,1.00,4.80,-4.80 +168.00,-9.60,4.06,0.00,1.00,-168.00,-4.80 +163.20,-9.60,4.08,0.00,1.00,14.40,-9.60 +158.40,-14.40,4.10,0.00,1.00,-158.40,-9.60 +153.60,-14.40,4.12,0.00,1.00,24.00,-14.40 +148.80,-19.20,4.14,0.00,1.00,-148.80,-14.40 +144.00,-19.20,4.17,0.00,1.00,33.60,-19.20 +139.20,-24.00,4.19,0.00,1.00,-139.20,-19.20 +134.40,-24.00,4.21,0.00,1.00,43.20,-24.00 +129.60,-28.80,4.23,0.00,1.00,-129.60,-24.00 +124.80,-28.80,4.25,0.00,1.00,52.80,-24.00 +120.00,-28.80,4.27,0.00,1.00,-120.00,-28.80 +115.20,-33.60,4.29,0.00,1.00,62.40,-28.80 +110.40,-33.60,4.32,0.00,1.00,-110.40,-28.80 +100.80,-33.60,4.34,0.00,1.00,72.00,-28.80 +96.00,-33.60,4.36,0.00,1.00,-100.80,-33.60 +91.20,-33.60,4.38,0.00,1.00,81.60,-33.60 +86.40,-33.60,4.40,0.00,1.00,-91.20,-33.60 +81.60,-33.60,4.42,0.00,1.00,96.00,-33.60 +72.00,-33.60,4.44,0.00,1.00,-81.60,-33.60 +67.20,-33.60,4.46,0.00,1.00,105.60,-33.60 +62.40,-28.80,4.49,0.00,1.00,-72.00,-28.80 +57.60,-28.80,4.51,0.00,1.00,115.20,-28.80 +52.80,-28.80,4.53,0.00,1.00,-62.40,-28.80 +48.00,-24.00,4.55,0.00,1.00,124.80,-28.80 +43.20,-24.00,4.57,0.00,1.00,-52.80,-24.00 +38.40,-24.00,4.59,0.00,1.00,134.40,-24.00 +33.60,-19.20,4.61,0.00,1.00,-43.20,-19.20 +28.80,-19.20,4.64,0.00,1.00,144.00,-19.20 +24.00,-14.40,4.66,0.00,1.00,-33.60,-19.20 +19.20,-14.40,4.68,0.00,1.00,153.60,-14.40 +14.40,-9.60,4.70,0.00,1.00,-24.00,-14.40 +14.40,-9.60,4.72,0.00,1.00,163.20,-9.60 +9.60,-4.80,4.74,0.00,1.00,-14.40,-9.60 +4.80,-4.80,4.76,0.00,1.00,172.80,-4.80 +0.00,0.00,4.79,0.00,1.00,-4.80,-4.80 +-4.80,0.00,4.81,0.00,1.00,0.00,0.00 +-9.60,4.80,4.83,0.00,1.00,-177.60,0.00 +-14.40,4.80,4.85,0.00,1.00,9.60,4.80 +-19.20,9.60,4.87,0.00,1.00,-168.00,4.80 +-19.20,9.60,4.89,0.00,1.00,19.20,9.60 +-24.00,14.40,4.91,0.00,1.00,-158.40,9.60 +-28.80,14.40,4.93,0.00,1.00,28.80,14.40 +-33.60,19.20,4.96,0.00,1.00,-148.80,14.40 +-38.40,19.20,4.98,0.00,1.00,38.40,14.40 +-43.20,19.20,5.00,0.00,1.00,-139.20,19.20 +-48.00,24.00,5.02,0.00,1.00,48.00,19.20 +-52.80,24.00,5.04,0.00,1.00,-129.60,24.00 +-57.60,24.00,5.06,0.00,1.00,57.60,24.00 +-62.40,24.00,5.08,0.00,1.00,-120.00,24.00 +-72.00,28.80,5.11,0.00,1.00,67.20,24.00 +-76.80,28.80,5.13,0.00,1.00,-110.40,24.00 +-81.60,28.80,5.15,0.00,1.00,76.80,28.80 +-86.40,28.80,5.17,0.00,1.00,-100.80,28.80 +-91.20,28.80,5.19,0.00,1.00,86.40,28.80 +-96.00,28.80,5.21,0.00,1.00,-86.40,28.80 +-100.80,28.80,5.23,0.00,1.00,96.00,28.80 +-105.60,28.80,5.26,0.00,1.00,-76.80,28.80 +-115.20,28.80,5.28,0.00,1.00,105.60,28.80 +-120.00,24.00,5.30,0.00,1.00,-67.20,24.00 +-124.80,24.00,5.32,0.00,1.00,115.20,24.00 +-129.60,24.00,5.34,0.00,1.00,-57.60,24.00 +-134.40,24.00,5.36,0.00,1.00,124.80,24.00 +-139.20,19.20,5.38,0.00,1.00,-48.00,19.20 +-144.00,19.20,5.40,0.00,1.00,134.40,19.20 +-148.80,14.40,5.43,0.00,1.00,-38.40,19.20 +-153.60,14.40,5.45,0.00,1.00,144.00,14.40 +-158.40,14.40,5.47,0.00,1.00,-28.80,14.40 +-163.20,9.60,5.49,0.00,1.00,153.60,9.60 +-163.20,9.60,5.51,0.00,1.00,-19.20,9.60 +-168.00,4.80,5.53,0.00,1.00,163.20,9.60 +-172.80,4.80,5.55,0.00,1.00,-9.60,4.80 +-177.60,0.00,5.58,0.00,1.00,172.80,4.80 +177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 +172.80,-4.80,5.62,0.00,1.00,-177.60,-0.00 +168.00,-4.80,5.64,0.00,1.00,4.80,-4.80 +163.20,-9.60,5.66,0.00,1.00,-168.00,-4.80 +163.20,-9.60,5.68,0.00,1.00,14.40,-9.60 +158.40,-14.40,5.70,0.00,1.00,-158.40,-9.60 +153.60,-14.40,5.72,0.00,1.00,24.00,-9.60 +148.80,-14.40,5.75,0.00,1.00,-148.80,-14.40 +144.00,-19.20,5.77,0.00,1.00,33.60,-14.40 +139.20,-19.20,5.79,0.00,1.00,-139.20,-19.20 +134.40,-24.00,5.81,0.00,1.00,43.20,-19.20 +129.60,-24.00,5.83,0.00,1.00,-129.60,-19.20 +124.80,-24.00,5.85,0.00,1.00,52.80,-24.00 +120.00,-24.00,5.87,0.00,1.00,-120.00,-24.00 +115.20,-28.80,5.90,0.00,1.00,62.40,-24.00 +105.60,-28.80,5.92,0.00,1.00,-110.40,-24.00 +100.80,-28.80,5.94,0.00,1.00,72.00,-28.80 +96.00,-28.80,5.96,0.00,1.00,-100.80,-28.80 +91.20,-28.80,5.98,0.00,1.00,81.60,-28.80 +86.40,-28.80,6.00,0.00,1.00,-91.20,-28.80 +81.60,-28.80,6.02,0.00,1.00,96.00,-28.80 +76.80,-28.80,6.05,0.00,1.00,-81.60,-28.80 +72.00,-28.80,6.07,0.00,1.00,105.60,-28.80 +62.40,-24.00,6.09,0.00,1.00,-72.00,-24.00 +57.60,-24.00,6.11,0.00,1.00,115.20,-24.00 +52.80,-24.00,6.13,0.00,1.00,-62.40,-24.00 +48.00,-24.00,6.15,0.00,1.00,124.80,-24.00 +43.20,-19.20,6.17,0.00,1.00,-52.80,-24.00 +38.40,-19.20,6.19,0.00,1.00,134.40,-19.20 +33.60,-19.20,6.22,0.00,1.00,-43.20,-19.20 +28.80,-14.40,6.24,0.00,1.00,144.00,-14.40 +24.00,-14.40,6.26,0.00,1.00,-33.60,-14.40 +19.20,-9.60,6.28,0.00,1.00,153.60,-14.40 +19.20,-9.60,6.30,0.00,1.00,-24.00,-9.60 +14.40,-4.80,6.32,0.00,1.00,163.20,-9.60 +9.60,-4.80,6.34,0.00,1.00,-14.40,-4.80 +4.80,-0.00,6.37,0.00,1.00,172.80,-4.80 +0.00,0.00,6.39,0.00,1.00,-4.80,-0.00 +-4.80,0.00,6.41,0.00,1.00,0.00,0.00 +-9.60,4.80,6.43,0.00,1.00,-177.60,0.00 +-14.40,4.80,6.45,0.00,1.00,9.60,4.80 +-19.20,9.60,6.47,0.00,1.00,-168.00,4.80 +-24.00,9.60,6.49,0.00,1.00,19.20,9.60 +-28.80,9.60,6.52,0.00,1.00,-158.40,9.60 +-33.60,14.40,6.54,0.00,1.00,28.80,9.60 +-33.60,14.40,6.56,0.00,1.00,-148.80,14.40 +-38.40,14.40,6.58,0.00,1.00,38.40,14.40 +-43.20,19.20,6.60,0.00,1.00,-139.20,14.40 +-48.00,19.20,6.62,0.00,1.00,48.00,14.40 +-57.60,19.20,6.64,0.00,1.00,-129.60,19.20 +-62.40,19.20,6.66,0.00,1.00,57.60,19.20 +-67.20,24.00,6.69,0.00,1.00,-120.00,19.20 +-72.00,24.00,6.71,0.00,1.00,67.20,19.20 +-76.80,24.00,6.73,0.00,1.00,-110.40,24.00 +-81.60,24.00,6.75,0.00,1.00,76.80,24.00 +-86.40,24.00,6.77,0.00,1.00,-100.80,24.00 +-91.20,24.00,6.79,0.00,1.00,86.40,24.00 +-96.00,24.00,6.81,0.00,1.00,-86.40,24.00 +-100.80,24.00,6.84,0.00,1.00,96.00,24.00 +-105.60,24.00,6.86,0.00,1.00,-76.80,24.00 +-110.40,24.00,6.88,0.00,1.00,105.60,24.00 +-115.20,19.20,6.90,0.00,1.00,-67.20,19.20 +-120.00,19.20,6.92,0.00,1.00,115.20,19.20 +-129.60,19.20,6.94,0.00,1.00,-57.60,19.20 +-134.40,19.20,6.96,0.00,1.00,124.80,19.20 +-139.20,19.20,6.99,0.00,1.00,-48.00,19.20 +-144.00,14.40,7.01,0.00,1.00,134.40,14.40 +-148.80,14.40,7.03,0.00,1.00,-38.40,14.40 +-148.80,14.40,7.05,0.00,1.00,144.00,14.40 +-153.60,9.60,7.07,0.00,1.00,-28.80,9.60 +-158.40,9.60,7.09,0.00,1.00,153.60,9.60 +-163.20,4.80,7.11,0.00,1.00,-19.20,9.60 +-168.00,4.80,7.13,0.00,1.00,163.20,4.80 +-172.80,4.80,7.16,0.00,1.00,-9.60,4.80 +-177.60,0.00,7.18,0.00,1.00,172.80,4.80 +177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 +172.80,-4.80,7.22,0.00,1.00,-177.60,-0.00 +168.00,-4.80,7.24,0.00,1.00,4.80,-4.80 +163.20,-4.80,7.26,0.00,1.00,-168.00,-4.80 +158.40,-9.60,7.28,0.00,1.00,14.40,-4.80 +153.60,-9.60,7.31,0.00,1.00,-158.40,-9.60 +148.80,-14.40,7.33,0.00,1.00,24.00,-9.60 +148.80,-14.40,7.35,0.00,1.00,-148.80,-9.60 +144.00,-14.40,7.37,0.00,1.00,33.60,-14.40 +139.20,-19.20,7.39,0.00,1.00,-139.20,-14.40 +134.40,-19.20,7.41,0.00,1.00,43.20,-14.40 +129.60,-19.20,7.43,0.00,1.00,-129.60,-19.20 +120.00,-19.20,7.46,0.00,1.00,52.80,-19.20 +115.20,-19.20,7.48,0.00,1.00,-120.00,-19.20 +110.40,-24.00,7.50,0.00,1.00,62.40,-19.20 +105.60,-24.00,7.52,0.00,1.00,-110.40,-19.20 +100.80,-24.00,7.54,0.00,1.00,72.00,-24.00 +96.00,-24.00,7.56,0.00,1.00,-100.80,-24.00 +91.20,-24.00,7.58,0.00,1.00,81.60,-24.00 +86.40,-24.00,7.60,0.00,1.00,-91.20,-24.00 +81.60,-24.00,7.63,0.00,1.00,96.00,-24.00 +76.80,-24.00,7.65,0.00,1.00,-81.60,-24.00 +72.00,-24.00,7.67,0.00,1.00,105.60,-24.00 +67.20,-24.00,7.69,0.00,1.00,-72.00,-24.00 +62.40,-19.20,7.71,0.00,1.00,115.20,-19.20 +57.60,-19.20,7.73,0.00,1.00,-62.40,-19.20 +48.00,-19.20,7.75,0.00,1.00,124.80,-19.20 +43.20,-19.20,7.78,0.00,1.00,-52.80,-19.20 +38.40,-14.40,7.80,0.00,1.00,134.40,-14.40 +33.60,-14.40,7.82,0.00,1.00,-43.20,-14.40 +33.60,-14.40,7.84,0.00,1.00,144.00,-14.40 +28.80,-9.60,7.86,0.00,1.00,-33.60,-14.40 +24.00,-9.60,7.88,0.00,1.00,153.60,-9.60 +19.20,-9.60,7.90,0.00,1.00,-24.00,-9.60 +14.40,-4.80,7.93,0.00,1.00,163.20,-9.60 +9.60,-4.80,7.95,0.00,1.00,-14.40,-4.80 +4.80,-0.00,7.97,0.00,1.00,172.80,-4.80 +0.00,0.00,7.99,0.00,1.00,-4.80,-0.00 +-4.80,0.00,8.01,0.00,1.00,0.00,0.00 +-9.60,4.80,8.03,0.00,1.00,-177.60,0.00 +-14.40,4.80,8.05,0.00,1.00,9.60,4.80 +-19.20,4.80,8.07,0.00,1.00,-168.00,4.80 +-24.00,9.60,8.10,0.00,1.00,19.20,4.80 +-28.80,9.60,8.12,0.00,1.00,-158.40,9.60 +-33.60,9.60,8.14,0.00,1.00,24.00,9.60 +-38.40,9.60,8.16,0.00,1.00,-148.80,9.60 +-43.20,14.40,8.18,0.00,1.00,33.60,9.60 +-48.00,14.40,8.20,0.00,1.00,-139.20,14.40 +-52.80,14.40,8.22,0.00,1.00,43.20,14.40 +-57.60,14.40,8.25,0.00,1.00,-129.60,14.40 +-62.40,19.20,8.27,0.00,1.00,52.80,14.40 +-67.20,19.20,8.29,0.00,1.00,-120.00,14.40 +-72.00,19.20,8.31,0.00,1.00,62.40,14.40 +-76.80,19.20,8.33,0.00,1.00,-110.40,19.20 +-81.60,19.20,8.35,0.00,1.00,76.80,19.20 +-86.40,19.20,8.37,0.00,1.00,-100.80,19.20 +-91.20,19.20,8.40,0.00,1.00,86.40,19.20 +-96.00,19.20,8.42,0.00,1.00,-86.40,19.20 +-100.80,19.20,8.44,0.00,1.00,96.00,19.20 +-105.60,19.20,8.46,0.00,1.00,-76.80,19.20 +-110.40,19.20,8.48,0.00,1.00,105.60,19.20 +-115.20,19.20,8.50,0.00,1.00,-67.20,19.20 +-120.00,14.40,8.52,0.00,1.00,120.00,14.40 +-124.80,14.40,8.54,0.00,1.00,-57.60,14.40 +-129.60,14.40,8.57,0.00,1.00,129.60,14.40 +-134.40,14.40,8.59,0.00,1.00,-48.00,14.40 +-139.20,14.40,8.61,0.00,1.00,139.20,14.40 +-144.00,9.60,8.63,0.00,1.00,-38.40,9.60 +-148.80,9.60,8.65,0.00,1.00,148.80,9.60 +-153.60,9.60,8.67,0.00,1.00,-28.80,9.60 +-158.40,4.80,8.69,0.00,1.00,158.40,9.60 +-163.20,4.80,8.72,0.00,1.00,-19.20,4.80 +-168.00,4.80,8.74,0.00,1.00,163.20,4.80 +-172.80,0.00,8.76,0.00,1.00,-9.60,4.80 +-177.60,0.00,8.78,0.00,1.00,172.80,0.00 +177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 +172.80,-0.00,8.82,0.00,1.00,-177.60,-0.00 +168.00,-4.80,8.84,0.00,1.00,4.80,-0.00 +163.20,-4.80,8.87,0.00,1.00,-168.00,-4.80 +158.40,-4.80,8.89,0.00,1.00,14.40,-4.80 +153.60,-9.60,8.91,0.00,1.00,-158.40,-4.80 +148.80,-9.60,8.93,0.00,1.00,24.00,-9.60 +144.00,-9.60,8.95,0.00,1.00,-153.60,-9.60 +139.20,-14.40,8.97,0.00,1.00,33.60,-9.60 +134.40,-14.40,8.99,0.00,1.00,-144.00,-9.60 +129.60,-14.40,9.01,0.00,1.00,43.20,-14.40 +124.80,-14.40,9.04,0.00,1.00,-134.40,-14.40 +120.00,-14.40,9.06,0.00,1.00,52.80,-14.40 +115.20,-19.20,9.08,0.00,1.00,-124.80,-14.40 +110.40,-19.20,9.10,0.00,1.00,62.40,-14.40 +105.60,-19.20,9.12,0.00,1.00,-110.40,-19.20 +100.80,-19.20,9.14,0.00,1.00,72.00,-19.20 +96.00,-19.20,9.16,0.00,1.00,-100.80,-19.20 +91.20,-19.20,9.19,0.00,1.00,81.60,-19.20 +86.40,-19.20,9.21,0.00,1.00,-91.20,-19.20 +81.60,-19.20,9.23,0.00,1.00,96.00,-19.20 +76.80,-19.20,9.25,0.00,1.00,-81.60,-19.20 +72.00,-19.20,9.27,0.00,1.00,105.60,-19.20 +67.20,-19.20,9.29,0.00,1.00,-72.00,-19.20 +62.40,-19.20,9.31,0.00,1.00,115.20,-14.40 +57.60,-14.40,9.34,0.00,1.00,-57.60,-14.40 +52.80,-14.40,9.36,0.00,1.00,124.80,-14.40 +48.00,-14.40,9.38,0.00,1.00,-48.00,-14.40 +43.20,-14.40,9.40,0.00,1.00,134.40,-14.40 +38.40,-9.60,9.42,0.00,1.00,-38.40,-14.40 +33.60,-9.60,9.44,0.00,1.00,144.00,-9.60 +28.80,-9.60,9.46,0.00,1.00,-28.80,-9.60 +24.00,-9.60,9.48,0.00,1.00,153.60,-9.60 +19.20,-4.80,9.51,0.00,1.00,-24.00,-9.60 +14.40,-4.80,9.53,0.00,1.00,163.20,-4.80 +9.60,-4.80,9.55,0.00,1.00,-14.40,-4.80 +4.80,-0.00,9.57,0.00,1.00,172.80,-4.80 +0.00,0.00,9.59,0.00,1.00,-4.80,-0.00 +-4.80,0.00,9.61,0.00,1.00,0.00,0.00 +-9.60,0.00,9.63,0.00,1.00,-177.60,0.00 +-14.40,4.80,9.66,0.00,1.00,9.60,0.00 +-19.20,4.80,9.68,0.00,1.00,-168.00,4.80 +-24.00,4.80,9.70,0.00,1.00,14.40,4.80 +-28.80,4.80,9.72,0.00,1.00,-158.40,4.80 +-33.60,9.60,9.74,0.00,1.00,24.00,4.80 +-38.40,9.60,9.76,0.00,1.00,-148.80,9.60 +-43.20,9.60,9.78,0.00,1.00,33.60,9.60 +-48.00,9.60,9.81,0.00,1.00,-139.20,9.60 +-52.80,9.60,9.83,0.00,1.00,43.20,9.60 +-57.60,14.40,9.85,0.00,1.00,-129.60,9.60 +-62.40,14.40,9.87,0.00,1.00,52.80,9.60 +-67.20,14.40,9.89,0.00,1.00,-120.00,9.60 +-72.00,14.40,9.91,0.00,1.00,62.40,14.40 +-76.80,14.40,9.93,0.00,1.00,-110.40,14.40 +-81.60,14.40,9.95,0.00,1.00,76.80,14.40 +-86.40,14.40,9.98,0.00,1.00,-100.80,14.40 +-91.20,14.40,10.00,0.00,1.00,86.40,14.40 +-96.00,14.40,10.02,0.00,1.00,-86.40,14.40 +-100.80,14.40,10.04,0.00,1.00,96.00,14.40 +-105.60,14.40,10.06,0.00,1.00,-76.80,14.40 +-110.40,14.40,10.08,0.00,1.00,110.40,14.40 +-115.20,14.40,10.10,0.00,1.00,-67.20,14.40 +-120.00,14.40,10.13,0.00,1.00,120.00,9.60 +-124.80,9.60,10.15,0.00,1.00,-57.60,9.60 +-129.60,9.60,10.17,0.00,1.00,129.60,9.60 +-134.40,9.60,10.19,0.00,1.00,-48.00,9.60 +-139.20,9.60,10.21,0.00,1.00,139.20,9.60 +-144.00,9.60,10.23,0.00,1.00,-38.40,9.60 +-148.80,9.60,10.25,0.00,1.00,148.80,9.60 +-153.60,4.80,10.28,0.00,1.00,-28.80,4.80 +-158.40,4.80,10.30,0.00,1.00,158.40,4.80 +-163.20,4.80,10.32,0.00,1.00,-19.20,4.80 +-168.00,4.80,10.34,0.00,1.00,168.00,4.80 +-172.80,0.00,10.36,0.00,1.00,-9.60,4.80 +-177.60,0.00,10.38,0.00,1.00,172.80,0.00 +177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 +172.80,-0.00,10.42,0.00,1.00,-177.60,-0.00 +168.00,-4.80,10.45,0.00,1.00,4.80,-0.00 +163.20,-4.80,10.47,0.00,1.00,-168.00,-4.80 +158.40,-4.80,10.49,0.00,1.00,14.40,-4.80 +153.60,-4.80,10.51,0.00,1.00,-163.20,-4.80 +148.80,-9.60,10.53,0.00,1.00,24.00,-4.80 +144.00,-9.60,10.55,0.00,1.00,-153.60,-4.80 +139.20,-9.60,10.57,0.00,1.00,33.60,-9.60 +134.40,-9.60,10.60,0.00,1.00,-144.00,-9.60 +129.60,-9.60,10.62,0.00,1.00,43.20,-9.60 +124.80,-9.60,10.64,0.00,1.00,-134.40,-9.60 +120.00,-14.40,10.66,0.00,1.00,52.80,-9.60 +115.20,-14.40,10.68,0.00,1.00,-124.80,-9.60 +110.40,-14.40,10.70,0.00,1.00,62.40,-9.60 +105.60,-14.40,10.72,0.00,1.00,-115.20,-14.40 +100.80,-14.40,10.74,0.00,1.00,72.00,-14.40 +96.00,-14.40,10.77,0.00,1.00,-100.80,-14.40 +91.20,-14.40,10.79,0.00,1.00,81.60,-14.40 +86.40,-14.40,10.81,0.00,1.00,-91.20,-14.40 +81.60,-14.40,10.83,0.00,1.00,96.00,-14.40 +76.80,-14.40,10.85,0.00,1.00,-81.60,-14.40 +72.00,-14.40,10.87,0.00,1.00,105.60,-14.40 +67.20,-14.40,10.89,0.00,1.00,-67.20,-14.40 +62.40,-14.40,10.92,0.00,1.00,115.20,-14.40 +57.60,-14.40,10.94,0.00,1.00,-57.60,-9.60 +52.80,-9.60,10.96,0.00,1.00,124.80,-9.60 +48.00,-9.60,10.98,0.00,1.00,-48.00,-9.60 +43.20,-9.60,11.00,0.00,1.00,134.40,-9.60 +38.40,-9.60,11.02,0.00,1.00,-38.40,-9.60 +33.60,-9.60,11.04,0.00,1.00,144.00,-9.60 +28.80,-4.80,11.07,0.00,1.00,-28.80,-9.60 +24.00,-4.80,11.09,0.00,1.00,153.60,-4.80 +19.20,-4.80,11.11,0.00,1.00,-19.20,-4.80 +14.40,-4.80,11.13,0.00,1.00,163.20,-4.80 +9.60,-0.00,11.15,0.00,1.00,-14.40,-4.80 +4.80,-0.00,11.17,0.00,1.00,172.80,-0.00 +0.00,0.00,11.19,0.00,1.00,-4.80,-0.00 +-4.80,0.00,11.21,0.00,1.00,0.00,0.00 +-9.60,0.00,11.24,0.00,1.00,-177.60,0.00 +-14.40,0.00,11.26,0.00,1.00,9.60,0.00 +-19.20,4.80,11.28,0.00,1.00,-168.00,0.00 +-24.00,4.80,11.30,0.00,1.00,14.40,4.80 +-28.80,4.80,11.32,0.00,1.00,-158.40,4.80 +-33.60,4.80,11.34,0.00,1.00,24.00,4.80 +-38.40,4.80,11.36,0.00,1.00,-153.60,4.80 +-43.20,4.80,11.39,0.00,1.00,33.60,4.80 +-48.00,4.80,11.41,0.00,1.00,-144.00,4.80 +-52.80,9.60,11.43,0.00,1.00,43.20,4.80 +-57.60,9.60,11.45,0.00,1.00,-134.40,4.80 +-62.40,9.60,11.47,0.00,1.00,52.80,4.80 +-67.20,9.60,11.49,0.00,1.00,-124.80,9.60 +-72.00,9.60,11.51,0.00,1.00,62.40,9.60 +-76.80,9.60,11.54,0.00,1.00,-110.40,9.60 +-81.60,9.60,11.56,0.00,1.00,72.00,9.60 +-86.40,9.60,11.58,0.00,1.00,-100.80,9.60 +-91.20,9.60,11.60,0.00,1.00,86.40,9.60 +-96.00,9.60,11.62,0.00,1.00,-86.40,9.60 +-100.80,9.60,11.64,0.00,1.00,96.00,9.60 +-105.60,9.60,11.66,0.00,1.00,-76.80,9.60 +-110.40,9.60,11.68,0.00,1.00,110.40,9.60 +-115.20,9.60,11.71,0.00,1.00,-67.20,9.60 +-120.00,9.60,11.73,0.00,1.00,120.00,9.60 +-124.80,9.60,11.75,0.00,1.00,-52.80,9.60 +-129.60,9.60,11.77,0.00,1.00,129.60,4.80 +-134.40,4.80,11.79,0.00,1.00,-43.20,4.80 +-139.20,4.80,11.81,0.00,1.00,139.20,4.80 +-144.00,4.80,11.83,0.00,1.00,-33.60,4.80 +-148.80,4.80,11.86,0.00,1.00,148.80,4.80 +-153.60,4.80,11.88,0.00,1.00,-24.00,4.80 +-158.40,4.80,11.90,0.00,1.00,158.40,4.80 +-163.20,4.80,11.92,0.00,1.00,-19.20,4.80 +-168.00,0.00,11.94,0.00,1.00,168.00,4.80 +-172.80,0.00,11.96,0.00,1.00,-9.60,0.00 +-177.60,0.00,11.98,0.00,1.00,172.80,0.00 +177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 +172.80,-0.00,12.03,0.00,1.00,-177.60,-0.00 +168.00,-0.00,12.05,0.00,1.00,4.80,-0.00 +163.20,-4.80,12.07,0.00,1.00,-168.00,-0.00 +158.40,-4.80,12.09,0.00,1.00,14.40,-4.80 +153.60,-4.80,12.11,0.00,1.00,-163.20,-4.80 +148.80,-4.80,12.13,0.00,1.00,24.00,-4.80 +144.00,-4.80,12.15,0.00,1.00,-153.60,-4.80 +139.20,-4.80,12.18,0.00,1.00,28.80,-4.80 +134.40,-4.80,12.20,0.00,1.00,-144.00,-4.80 +129.60,-9.60,12.22,0.00,1.00,38.40,-4.80 +124.80,-9.60,12.24,0.00,1.00,-134.40,-4.80 +120.00,-9.60,12.26,0.00,1.00,48.00,-4.80 +115.20,-9.60,12.28,0.00,1.00,-124.80,-9.60 +110.40,-9.60,12.30,0.00,1.00,57.60,-9.60 +105.60,-9.60,12.33,0.00,1.00,-115.20,-9.60 +100.80,-9.60,12.35,0.00,1.00,72.00,-9.60 +96.00,-9.60,12.37,0.00,1.00,-105.60,-9.60 +91.20,-9.60,12.39,0.00,1.00,81.60,-9.60 +86.40,-9.60,12.41,0.00,1.00,-91.20,-9.60 +81.60,-9.60,12.43,0.00,1.00,96.00,-9.60 +76.80,-9.60,12.45,0.00,1.00,-81.60,-9.60 +72.00,-9.60,12.48,0.00,1.00,105.60,-9.60 +67.20,-9.60,12.50,0.00,1.00,-67.20,-9.60 +62.40,-9.60,12.52,0.00,1.00,120.00,-9.60 +57.60,-9.60,12.54,0.00,1.00,-57.60,-9.60 +52.80,-9.60,12.56,0.00,1.00,129.60,-4.80 +48.00,-4.80,12.58,0.00,1.00,-48.00,-4.80 +43.20,-4.80,12.60,0.00,1.00,139.20,-4.80 +38.40,-4.80,12.62,0.00,1.00,-38.40,-4.80 +33.60,-4.80,12.65,0.00,1.00,148.80,-4.80 +28.80,-4.80,12.67,0.00,1.00,-28.80,-4.80 +24.00,-4.80,12.69,0.00,1.00,158.40,-4.80 +19.20,-4.80,12.71,0.00,1.00,-19.20,-4.80 +14.40,-0.00,12.73,0.00,1.00,163.20,-4.80 +9.60,-0.00,12.75,0.00,1.00,-9.60,-0.00 +4.80,-0.00,12.77,0.00,1.00,172.80,-0.00 +0.00,0.00,12.80,0.00,1.00,-4.80,-0.00 +-4.80,0.00,12.82,0.00,1.00,0.00,0.00 +-9.60,0.00,12.84,0.00,1.00,-177.60,0.00 +-14.40,0.00,12.86,0.00,1.00,9.60,0.00 +-19.20,0.00,12.88,0.00,1.00,-168.00,0.00 +-24.00,0.00,12.90,0.00,1.00,14.40,0.00 +-28.80,0.00,12.92,0.00,1.00,-163.20,0.00 +-33.60,4.80,12.95,0.00,1.00,24.00,0.00 +-38.40,4.80,12.97,0.00,1.00,-153.60,0.00 +-43.20,4.80,12.99,0.00,1.00,28.80,0.00 +-48.00,4.80,13.01,0.00,1.00,-144.00,4.80 +-52.80,4.80,13.03,0.00,1.00,38.40,4.80 +-57.60,4.80,13.05,0.00,1.00,-134.40,4.80 +-62.40,4.80,13.07,0.00,1.00,48.00,4.80 +-67.20,4.80,13.09,0.00,1.00,-124.80,4.80 +-72.00,4.80,13.12,0.00,1.00,62.40,4.80 +-76.80,4.80,13.14,0.00,1.00,-115.20,4.80 +-81.60,4.80,13.16,0.00,1.00,72.00,4.80 +-86.40,4.80,13.18,0.00,1.00,-100.80,4.80 +-91.20,4.80,13.20,0.00,1.00,86.40,4.80 +-96.00,4.80,13.22,0.00,1.00,-86.40,4.80 +-100.80,4.80,13.24,0.00,1.00,96.00,4.80 +-105.60,4.80,13.27,0.00,1.00,-76.80,4.80 +-110.40,4.80,13.29,0.00,1.00,110.40,4.80 +-115.20,4.80,13.31,0.00,1.00,-62.40,4.80 +-120.00,4.80,13.33,0.00,1.00,120.00,4.80 +-124.80,4.80,13.35,0.00,1.00,-52.80,4.80 +-129.60,4.80,13.37,0.00,1.00,134.40,4.80 +-134.40,4.80,13.39,0.00,1.00,-43.20,4.80 +-139.20,4.80,13.42,0.00,1.00,144.00,4.80 +-144.00,4.80,13.44,0.00,1.00,-33.60,0.00 +-148.80,4.80,13.46,0.00,1.00,153.60,0.00 +-153.60,0.00,13.48,0.00,1.00,-24.00,0.00 +-158.40,0.00,13.50,0.00,1.00,158.40,0.00 +-163.20,0.00,13.52,0.00,1.00,-14.40,0.00 +-168.00,0.00,13.54,0.00,1.00,168.00,0.00 +-172.80,0.00,13.56,0.00,1.00,-9.60,0.00 +-177.60,0.00,13.59,0.00,1.00,172.80,0.00 +177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 +172.80,-0.00,13.63,0.00,1.00,-177.60,-0.00 +168.00,-0.00,13.65,0.00,1.00,4.80,-0.00 +163.20,-0.00,13.67,0.00,1.00,-172.80,-0.00 +158.40,-0.00,13.69,0.00,1.00,14.40,-0.00 +153.60,-0.00,13.71,0.00,1.00,-163.20,-0.00 +148.80,-4.80,13.74,0.00,1.00,19.20,-0.00 +144.00,-4.80,13.76,0.00,1.00,-153.60,-0.00 +139.20,-4.80,13.78,0.00,1.00,28.80,-0.00 +134.40,-4.80,13.80,0.00,1.00,-148.80,-0.00 +129.60,-4.80,13.82,0.00,1.00,38.40,-4.80 +124.80,-4.80,13.84,0.00,1.00,-139.20,-4.80 +120.00,-4.80,13.86,0.00,1.00,48.00,-4.80 +115.20,-4.80,13.89,0.00,1.00,-129.60,-4.80 +110.40,-4.80,13.91,0.00,1.00,57.60,-4.80 +105.60,-4.80,13.93,0.00,1.00,-115.20,-4.80 +100.80,-4.80,13.95,0.00,1.00,67.20,-4.80 +96.00,-4.80,13.97,0.00,1.00,-105.60,-4.80 +91.20,-4.80,13.99,0.00,1.00,81.60,-4.80 +86.40,-4.80,14.01,0.00,1.00,-91.20,-4.80 +81.60,-4.80,14.03,0.00,1.00,96.00,-4.80 +76.80,-4.80,14.06,0.00,1.00,-76.80,-4.80 +72.00,-4.80,14.08,0.00,1.00,105.60,-4.80 +67.20,-4.80,14.10,0.00,1.00,-67.20,-4.80 +62.40,-4.80,14.12,0.00,1.00,120.00,-4.80 +57.60,-4.80,14.14,0.00,1.00,-52.80,-4.80 +52.80,-4.80,14.16,0.00,1.00,129.60,-4.80 +48.00,-4.80,14.18,0.00,1.00,-43.20,-4.80 +43.20,-4.80,14.21,0.00,1.00,139.20,-4.80 +38.40,-4.80,14.23,0.00,1.00,-33.60,-4.80 +33.60,-4.80,14.25,0.00,1.00,148.80,-0.00 +28.80,-0.00,14.27,0.00,1.00,-28.80,-0.00 +24.00,-0.00,14.29,0.00,1.00,158.40,-0.00 +19.20,-0.00,14.31,0.00,1.00,-19.20,-0.00 +14.40,-0.00,14.33,0.00,1.00,163.20,-0.00 +9.60,-0.00,14.36,0.00,1.00,-9.60,-0.00 +4.80,-0.00,14.38,0.00,1.00,172.80,-0.00 +0.00,0.00,14.40,0.00,1.00,-4.80,-0.00 +-4.80,0.00,14.42,0.00,1.00,0.00,0.00 +-9.60,0.00,14.44,0.00,1.00,-177.60,-0.00 +-14.40,0.00,14.46,0.00,1.00,4.80,-0.00 +-19.20,0.00,14.48,0.00,1.00,-168.00,-0.00 +-24.00,0.00,14.50,0.00,1.00,14.40,-0.00 +-28.80,0.00,14.53,0.00,1.00,-163.20,-0.00 +-33.60,0.00,14.55,0.00,1.00,19.20,-0.00 +-38.40,0.00,14.57,0.00,1.00,-153.60,-0.00 +-43.20,0.00,14.59,0.00,1.00,28.80,-0.00 +-48.00,0.00,14.61,0.00,1.00,-148.80,-0.00 +-52.80,0.00,14.63,0.00,1.00,38.40,-0.00 +-57.60,0.00,14.65,0.00,1.00,-139.20,-0.00 +-62.40,0.00,14.68,0.00,1.00,48.00,-0.00 +-67.20,0.00,14.70,0.00,1.00,-124.80,-0.00 +-72.00,0.00,14.72,0.00,1.00,57.60,-0.00 +-76.80,0.00,14.74,0.00,1.00,-115.20,-0.00 +-81.60,0.00,14.76,0.00,1.00,72.00,-0.00 +-86.40,0.00,14.78,0.00,1.00,-100.80,-0.00 +-91.20,0.00,14.80,0.00,1.00,86.40,-0.00 +-96.00,0.00,14.83,0.00,1.00,-86.40,-0.00 +-100.80,0.00,14.85,0.00,1.00,100.80,-0.00 +-105.60,0.00,14.87,0.00,1.00,-76.80,-0.00 +-110.40,0.00,14.89,0.00,1.00,110.40,-0.00 +-115.20,0.00,14.91,0.00,1.00,-62.40,-0.00 +-120.00,0.00,14.93,0.00,1.00,124.80,-0.00 +-124.80,0.00,14.95,0.00,1.00,-48.00,-0.00 +-129.60,0.00,14.97,0.00,1.00,134.40,-0.00 +-134.40,0.00,15.00,0.00,1.00,-38.40,-0.00 +-139.20,0.00,15.02,0.00,1.00,144.00,-0.00 +-144.00,0.00,15.04,0.00,1.00,-28.80,-0.00 +-148.80,0.00,15.06,0.00,1.00,153.60,-0.00 +-153.60,0.00,15.08,0.00,1.00,-24.00,-0.00 +-158.40,0.00,15.10,0.00,1.00,163.20,-0.00 +-163.20,0.00,15.12,0.00,1.00,-14.40,-0.00 +-168.00,0.00,15.15,0.00,1.00,168.00,-0.00 +-172.80,0.00,15.17,0.00,1.00,-9.60,-0.00 +-177.60,0.00,15.19,0.00,1.00,172.80,-0.00 +177.60,0.00,15.21,0.00,1.00,-0.00,-0.00 +172.80,0.00,15.23,0.00,1.00,-177.60,0.00 +168.00,0.00,15.25,0.00,1.00,4.80,0.00 +163.20,0.00,15.27,0.00,1.00,-172.80,0.00 +158.40,0.00,15.30,0.00,1.00,9.60,0.00 +153.60,0.00,15.32,0.00,1.00,-163.20,0.00 +148.80,0.00,15.34,0.00,1.00,19.20,0.00 +144.00,0.00,15.36,0.00,1.00,-158.40,0.00 +139.20,0.00,15.38,0.00,1.00,28.80,0.00 +134.40,0.00,15.40,0.00,1.00,-148.80,0.00 +129.60,0.00,15.42,0.00,1.00,33.60,0.00 +124.80,0.00,15.44,0.00,1.00,-139.20,0.00 +120.00,0.00,15.47,0.00,1.00,43.20,0.00 +115.20,0.00,15.49,0.00,1.00,-129.60,0.00 +110.40,0.00,15.51,0.00,1.00,57.60,0.00 +105.60,0.00,15.53,0.00,1.00,-120.00,0.00 +100.80,0.00,15.55,0.00,1.00,67.20,0.00 +96.00,0.00,15.57,0.00,1.00,-105.60,0.00 +91.20,0.00,15.59,0.00,1.00,81.60,0.00 +86.40,0.00,15.62,0.00,1.00,-91.20,0.00 +81.60,0.00,15.64,0.00,1.00,96.00,0.00 +76.80,0.00,15.66,0.00,1.00,-76.80,0.00 +72.00,0.00,15.68,0.00,1.00,110.40,0.00 +67.20,0.00,15.70,0.00,1.00,-67.20,0.00 +62.40,0.00,15.72,0.00,1.00,120.00,0.00 +57.60,0.00,15.74,0.00,1.00,-52.80,0.00 +52.80,0.00,15.77,0.00,1.00,134.40,0.00 +48.00,0.00,15.79,0.00,1.00,-43.20,0.00 +43.20,0.00,15.81,0.00,1.00,144.00,0.00 +38.40,0.00,15.83,0.00,1.00,-33.60,0.00 +33.60,0.00,15.85,0.00,1.00,153.60,0.00 +28.80,0.00,15.87,0.00,1.00,-24.00,0.00 +24.00,0.00,15.89,0.00,1.00,158.40,0.00 +19.20,0.00,15.91,0.00,1.00,-19.20,0.00 +14.40,0.00,15.94,0.00,1.00,168.00,0.00 +9.60,0.00,15.96,0.00,1.00,-9.60,0.00 +4.80,0.00,15.98,0.00,1.00,172.80,0.00 +0.00,0.00,16.00,0.00,1.00,-4.80,0.00 diff --git a/scripts/testv/stvISM3.csv b/scripts/testv/stvISM3.csv index d2474d78fd..ac37e672e3 100644 --- a/scripts/testv/stvISM3.csv +++ b/scripts/testv/stvISM3.csv @@ -1,1500 +1,1500 @@ -0.00,0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 --168.00,-9.60,1.00,0.00,1.00 -14.40,14.40,1.00,0.00,1.00 --163.20,-14.40,1.00,0.00,1.00 -19.20,19.20,1.00,0.00,1.00 --153.60,-24.00,1.00,0.00,1.00 -28.80,24.00,1.00,0.00,1.00 --148.80,-28.80,1.00,0.00,1.00 -38.40,33.60,1.00,0.00,1.00 --139.20,-33.60,1.00,0.00,1.00 -48.00,38.40,1.00,0.00,1.00 --124.80,-38.40,1.00,0.00,1.00 -57.60,38.40,1.00,0.00,1.00 --115.20,-43.20,1.00,0.00,1.00 -72.00,43.20,1.00,0.00,1.00 --100.80,-43.20,1.00,0.00,1.00 -86.40,43.20,1.00,0.00,1.00 --86.40,-43.20,1.00,0.00,1.00 -100.80,43.20,1.00,0.00,1.00 --76.80,-43.20,1.00,0.00,1.00 -110.40,43.20,1.00,0.00,1.00 --62.40,-43.20,1.00,0.00,1.00 -124.80,38.40,1.00,0.00,1.00 --52.80,-38.40,1.00,0.00,1.00 -134.40,33.60,1.00,0.00,1.00 --38.40,-33.60,1.00,0.00,1.00 -144.00,28.80,1.00,0.00,1.00 --33.60,-28.80,1.00,0.00,1.00 -153.60,24.00,1.00,0.00,1.00 --24.00,-19.20,1.00,0.00,1.00 -158.40,19.20,1.00,0.00,1.00 --14.40,-14.40,1.00,0.00,1.00 -168.00,9.60,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 --172.80,-9.60,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 --163.20,-14.40,1.00,0.00,1.00 -19.20,19.20,1.00,0.00,1.00 --158.40,-19.20,1.00,0.00,1.00 -28.80,24.00,1.00,0.00,1.00 --148.80,-28.80,1.00,0.00,1.00 -33.60,28.80,1.00,0.00,1.00 --139.20,-33.60,1.00,0.00,1.00 -43.20,33.60,1.00,0.00,1.00 --129.60,-38.40,1.00,0.00,1.00 -57.60,38.40,1.00,0.00,1.00 --120.00,-43.20,1.00,0.00,1.00 -67.20,43.20,1.00,0.00,1.00 --105.60,-43.20,1.00,0.00,1.00 -81.60,43.20,1.00,0.00,1.00 --91.20,-43.20,1.00,0.00,1.00 -96.00,43.20,1.00,0.00,1.00 --76.80,-43.20,1.00,0.00,1.00 -110.40,43.20,1.00,0.00,1.00 --67.20,-43.20,1.00,0.00,1.00 -120.00,38.40,1.00,0.00,1.00 --52.80,-38.40,1.00,0.00,1.00 -129.60,38.40,1.00,0.00,1.00 --43.20,-33.60,1.00,0.00,1.00 -144.00,33.60,1.00,0.00,1.00 --33.60,-28.80,1.00,0.00,1.00 -148.80,24.00,1.00,0.00,1.00 --24.00,-24.00,1.00,0.00,1.00 -158.40,19.20,1.00,0.00,1.00 --19.20,-14.40,1.00,0.00,1.00 -168.00,14.40,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 --168.00,-9.60,1.00,0.00,1.00 -14.40,14.40,1.00,0.00,1.00 --163.20,-14.40,1.00,0.00,1.00 -24.00,19.20,1.00,0.00,1.00 --153.60,-19.20,1.00,0.00,1.00 -28.80,24.00,1.00,0.00,1.00 --144.00,-24.00,1.00,0.00,1.00 -38.40,28.80,1.00,0.00,1.00 --134.40,-28.80,1.00,0.00,1.00 -48.00,33.60,1.00,0.00,1.00 --124.80,-33.60,1.00,0.00,1.00 -62.40,38.40,1.00,0.00,1.00 --115.20,-38.40,1.00,0.00,1.00 -72.00,38.40,1.00,0.00,1.00 --100.80,-38.40,1.00,0.00,1.00 -86.40,38.40,1.00,0.00,1.00 --86.40,-38.40,1.00,0.00,1.00 -96.00,38.40,1.00,0.00,1.00 --76.80,-38.40,1.00,0.00,1.00 -110.40,38.40,1.00,0.00,1.00 --62.40,-38.40,1.00,0.00,1.00 -120.00,33.60,1.00,0.00,1.00 --52.80,-33.60,1.00,0.00,1.00 -134.40,33.60,1.00,0.00,1.00 --43.20,-28.80,1.00,0.00,1.00 -144.00,28.80,1.00,0.00,1.00 --33.60,-24.00,1.00,0.00,1.00 -148.80,24.00,1.00,0.00,1.00 --24.00,-19.20,1.00,0.00,1.00 -158.40,14.40,1.00,0.00,1.00 --19.20,-14.40,1.00,0.00,1.00 -168.00,9.60,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 --172.80,-9.60,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 --163.20,-14.40,1.00,0.00,1.00 -19.20,14.40,1.00,0.00,1.00 --153.60,-19.20,1.00,0.00,1.00 -28.80,24.00,1.00,0.00,1.00 --148.80,-24.00,1.00,0.00,1.00 -38.40,28.80,1.00,0.00,1.00 --139.20,-28.80,1.00,0.00,1.00 -48.00,33.60,1.00,0.00,1.00 --124.80,-33.60,1.00,0.00,1.00 -57.60,33.60,1.00,0.00,1.00 --115.20,-38.40,1.00,0.00,1.00 -72.00,38.40,1.00,0.00,1.00 --105.60,-38.40,1.00,0.00,1.00 -81.60,38.40,1.00,0.00,1.00 --91.20,-38.40,1.00,0.00,1.00 -96.00,38.40,1.00,0.00,1.00 --76.80,-38.40,1.00,0.00,1.00 -105.60,38.40,1.00,0.00,1.00 --67.20,-38.40,1.00,0.00,1.00 -120.00,38.40,1.00,0.00,1.00 --57.60,-33.60,1.00,0.00,1.00 -129.60,33.60,1.00,0.00,1.00 --43.20,-28.80,1.00,0.00,1.00 -139.20,28.80,1.00,0.00,1.00 --33.60,-24.00,1.00,0.00,1.00 -148.80,24.00,1.00,0.00,1.00 --28.80,-19.20,1.00,0.00,1.00 -158.40,19.20,1.00,0.00,1.00 --19.20,-14.40,1.00,0.00,1.00 -163.20,14.40,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 --168.00,-9.60,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 --158.40,-14.40,1.00,0.00,1.00 -24.00,14.40,1.00,0.00,1.00 --153.60,-19.20,1.00,0.00,1.00 -33.60,19.20,1.00,0.00,1.00 --144.00,-24.00,1.00,0.00,1.00 -43.20,24.00,1.00,0.00,1.00 --134.40,-28.80,1.00,0.00,1.00 -52.80,28.80,1.00,0.00,1.00 --124.80,-28.80,1.00,0.00,1.00 -62.40,33.60,1.00,0.00,1.00 --110.40,-33.60,1.00,0.00,1.00 -72.00,33.60,1.00,0.00,1.00 --100.80,-33.60,1.00,0.00,1.00 -86.40,33.60,1.00,0.00,1.00 --86.40,-33.60,1.00,0.00,1.00 -96.00,33.60,1.00,0.00,1.00 --76.80,-33.60,1.00,0.00,1.00 -110.40,33.60,1.00,0.00,1.00 --67.20,-33.60,1.00,0.00,1.00 -120.00,33.60,1.00,0.00,1.00 --52.80,-28.80,1.00,0.00,1.00 -129.60,28.80,1.00,0.00,1.00 --43.20,-28.80,1.00,0.00,1.00 -139.20,24.00,1.00,0.00,1.00 --33.60,-24.00,1.00,0.00,1.00 -148.80,19.20,1.00,0.00,1.00 --24.00,-19.20,1.00,0.00,1.00 -158.40,14.40,1.00,0.00,1.00 --19.20,-14.40,1.00,0.00,1.00 -168.00,9.60,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 --163.20,-14.40,1.00,0.00,1.00 -24.00,14.40,1.00,0.00,1.00 --153.60,-19.20,1.00,0.00,1.00 -28.80,19.20,1.00,0.00,1.00 --144.00,-24.00,1.00,0.00,1.00 -38.40,24.00,1.00,0.00,1.00 --134.40,-28.80,1.00,0.00,1.00 -48.00,28.80,1.00,0.00,1.00 --124.80,-28.80,1.00,0.00,1.00 -62.40,33.60,1.00,0.00,1.00 --115.20,-33.60,1.00,0.00,1.00 -72.00,33.60,1.00,0.00,1.00 --100.80,-33.60,1.00,0.00,1.00 -81.60,33.60,1.00,0.00,1.00 --91.20,-33.60,1.00,0.00,1.00 -96.00,33.60,1.00,0.00,1.00 --81.60,-33.60,1.00,0.00,1.00 -105.60,33.60,1.00,0.00,1.00 --67.20,-33.60,1.00,0.00,1.00 -115.20,33.60,1.00,0.00,1.00 --57.60,-28.80,1.00,0.00,1.00 -129.60,28.80,1.00,0.00,1.00 --48.00,-28.80,1.00,0.00,1.00 -139.20,24.00,1.00,0.00,1.00 --38.40,-24.00,1.00,0.00,1.00 -148.80,19.20,1.00,0.00,1.00 --28.80,-19.20,1.00,0.00,1.00 -153.60,14.40,1.00,0.00,1.00 --19.20,-14.40,1.00,0.00,1.00 -163.20,9.60,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 --168.00,-9.60,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 --158.40,-9.60,1.00,0.00,1.00 -24.00,14.40,1.00,0.00,1.00 --148.80,-14.40,1.00,0.00,1.00 -33.60,19.20,1.00,0.00,1.00 --139.20,-19.20,1.00,0.00,1.00 -43.20,24.00,1.00,0.00,1.00 --129.60,-24.00,1.00,0.00,1.00 -52.80,24.00,1.00,0.00,1.00 --120.00,-28.80,1.00,0.00,1.00 -62.40,28.80,1.00,0.00,1.00 --110.40,-28.80,1.00,0.00,1.00 -76.80,28.80,1.00,0.00,1.00 --100.80,-28.80,1.00,0.00,1.00 -86.40,28.80,1.00,0.00,1.00 --86.40,-28.80,1.00,0.00,1.00 -96.00,28.80,1.00,0.00,1.00 --76.80,-28.80,1.00,0.00,1.00 -105.60,28.80,1.00,0.00,1.00 --67.20,-28.80,1.00,0.00,1.00 -120.00,28.80,1.00,0.00,1.00 --57.60,-24.00,1.00,0.00,1.00 -129.60,24.00,1.00,0.00,1.00 --48.00,-24.00,1.00,0.00,1.00 -139.20,19.20,1.00,0.00,1.00 --38.40,-19.20,1.00,0.00,1.00 -148.80,19.20,1.00,0.00,1.00 --28.80,-14.40,1.00,0.00,1.00 -158.40,14.40,1.00,0.00,1.00 --19.20,-9.60,1.00,0.00,1.00 -163.20,9.60,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 --163.20,-9.60,1.00,0.00,1.00 -24.00,14.40,1.00,0.00,1.00 --153.60,-14.40,1.00,0.00,1.00 -33.60,19.20,1.00,0.00,1.00 --144.00,-19.20,1.00,0.00,1.00 -43.20,19.20,1.00,0.00,1.00 --134.40,-24.00,1.00,0.00,1.00 -52.80,24.00,1.00,0.00,1.00 --124.80,-24.00,1.00,0.00,1.00 -62.40,28.80,1.00,0.00,1.00 --115.20,-28.80,1.00,0.00,1.00 -72.00,28.80,1.00,0.00,1.00 --100.80,-28.80,1.00,0.00,1.00 -81.60,28.80,1.00,0.00,1.00 --91.20,-28.80,1.00,0.00,1.00 -96.00,28.80,1.00,0.00,1.00 --81.60,-28.80,1.00,0.00,1.00 -105.60,28.80,1.00,0.00,1.00 --67.20,-28.80,1.00,0.00,1.00 -115.20,28.80,1.00,0.00,1.00 --57.60,-28.80,1.00,0.00,1.00 -124.80,24.00,1.00,0.00,1.00 --48.00,-24.00,1.00,0.00,1.00 -134.40,24.00,1.00,0.00,1.00 --38.40,-19.20,1.00,0.00,1.00 -144.00,19.20,1.00,0.00,1.00 --28.80,-14.40,1.00,0.00,1.00 -153.60,14.40,1.00,0.00,1.00 --19.20,-9.60,1.00,0.00,1.00 -163.20,9.60,1.00,0.00,1.00 --14.40,-9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -19.20,9.60,1.00,0.00,1.00 --158.40,-9.60,1.00,0.00,1.00 -24.00,14.40,1.00,0.00,1.00 --148.80,-14.40,1.00,0.00,1.00 -33.60,14.40,1.00,0.00,1.00 --139.20,-19.20,1.00,0.00,1.00 -43.20,19.20,1.00,0.00,1.00 --129.60,-19.20,1.00,0.00,1.00 -52.80,19.20,1.00,0.00,1.00 --120.00,-24.00,1.00,0.00,1.00 -67.20,24.00,1.00,0.00,1.00 --110.40,-24.00,1.00,0.00,1.00 -76.80,24.00,1.00,0.00,1.00 --100.80,-24.00,1.00,0.00,1.00 -86.40,24.00,1.00,0.00,1.00 --86.40,-24.00,1.00,0.00,1.00 -96.00,24.00,1.00,0.00,1.00 --76.80,-24.00,1.00,0.00,1.00 -105.60,24.00,1.00,0.00,1.00 --67.20,-24.00,1.00,0.00,1.00 -115.20,24.00,1.00,0.00,1.00 --57.60,-24.00,1.00,0.00,1.00 -129.60,19.20,1.00,0.00,1.00 --48.00,-19.20,1.00,0.00,1.00 -139.20,19.20,1.00,0.00,1.00 --38.40,-14.40,1.00,0.00,1.00 -148.80,14.40,1.00,0.00,1.00 --28.80,-14.40,1.00,0.00,1.00 -153.60,9.60,1.00,0.00,1.00 --19.20,-9.60,1.00,0.00,1.00 -163.20,9.60,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 --158.40,-9.60,1.00,0.00,1.00 -24.00,9.60,1.00,0.00,1.00 --153.60,-14.40,1.00,0.00,1.00 -33.60,14.40,1.00,0.00,1.00 --144.00,-14.40,1.00,0.00,1.00 -43.20,19.20,1.00,0.00,1.00 --134.40,-19.20,1.00,0.00,1.00 -52.80,19.20,1.00,0.00,1.00 --124.80,-24.00,1.00,0.00,1.00 -62.40,24.00,1.00,0.00,1.00 --110.40,-24.00,1.00,0.00,1.00 -72.00,24.00,1.00,0.00,1.00 --100.80,-24.00,1.00,0.00,1.00 -81.60,24.00,1.00,0.00,1.00 --91.20,-24.00,1.00,0.00,1.00 -96.00,24.00,1.00,0.00,1.00 --81.60,-24.00,1.00,0.00,1.00 -105.60,24.00,1.00,0.00,1.00 --72.00,-24.00,1.00,0.00,1.00 -115.20,24.00,1.00,0.00,1.00 --57.60,-24.00,1.00,0.00,1.00 -124.80,19.20,1.00,0.00,1.00 --48.00,-19.20,1.00,0.00,1.00 -134.40,19.20,1.00,0.00,1.00 --38.40,-19.20,1.00,0.00,1.00 -144.00,14.40,1.00,0.00,1.00 --28.80,-14.40,1.00,0.00,1.00 -153.60,14.40,1.00,0.00,1.00 --24.00,-9.60,1.00,0.00,1.00 -163.20,9.60,1.00,0.00,1.00 --14.40,-4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -19.20,4.80,1.00,0.00,1.00 --158.40,-9.60,1.00,0.00,1.00 -28.80,9.60,1.00,0.00,1.00 --148.80,-9.60,1.00,0.00,1.00 -38.40,14.40,1.00,0.00,1.00 --139.20,-14.40,1.00,0.00,1.00 -48.00,14.40,1.00,0.00,1.00 --129.60,-14.40,1.00,0.00,1.00 -57.60,19.20,1.00,0.00,1.00 --120.00,-19.20,1.00,0.00,1.00 -67.20,19.20,1.00,0.00,1.00 --110.40,-19.20,1.00,0.00,1.00 -76.80,19.20,1.00,0.00,1.00 --100.80,-19.20,1.00,0.00,1.00 -86.40,19.20,1.00,0.00,1.00 --86.40,-19.20,1.00,0.00,1.00 -96.00,19.20,1.00,0.00,1.00 --76.80,-19.20,1.00,0.00,1.00 -105.60,19.20,1.00,0.00,1.00 --67.20,-19.20,1.00,0.00,1.00 -115.20,19.20,1.00,0.00,1.00 --57.60,-19.20,1.00,0.00,1.00 -124.80,19.20,1.00,0.00,1.00 --48.00,-14.40,1.00,0.00,1.00 -134.40,14.40,1.00,0.00,1.00 --38.40,-14.40,1.00,0.00,1.00 -144.00,14.40,1.00,0.00,1.00 --28.80,-9.60,1.00,0.00,1.00 -153.60,9.60,1.00,0.00,1.00 --19.20,-9.60,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -14.40,4.80,1.00,0.00,1.00 --158.40,-9.60,1.00,0.00,1.00 -24.00,9.60,1.00,0.00,1.00 --148.80,-9.60,1.00,0.00,1.00 -33.60,14.40,1.00,0.00,1.00 --139.20,-14.40,1.00,0.00,1.00 -43.20,14.40,1.00,0.00,1.00 --129.60,-14.40,1.00,0.00,1.00 -52.80,19.20,1.00,0.00,1.00 --120.00,-19.20,1.00,0.00,1.00 -62.40,19.20,1.00,0.00,1.00 --110.40,-19.20,1.00,0.00,1.00 -72.00,19.20,1.00,0.00,1.00 --100.80,-19.20,1.00,0.00,1.00 -81.60,19.20,1.00,0.00,1.00 --91.20,-19.20,1.00,0.00,1.00 -96.00,19.20,1.00,0.00,1.00 --81.60,-19.20,1.00,0.00,1.00 -105.60,19.20,1.00,0.00,1.00 --72.00,-19.20,1.00,0.00,1.00 -115.20,19.20,1.00,0.00,1.00 --62.40,-19.20,1.00,0.00,1.00 -124.80,19.20,1.00,0.00,1.00 --52.80,-14.40,1.00,0.00,1.00 -134.40,14.40,1.00,0.00,1.00 --43.20,-14.40,1.00,0.00,1.00 -144.00,14.40,1.00,0.00,1.00 --33.60,-9.60,1.00,0.00,1.00 -153.60,9.60,1.00,0.00,1.00 --24.00,-9.60,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 --14.40,-4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -19.20,4.80,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 -28.80,9.60,1.00,0.00,1.00 --148.80,-9.60,1.00,0.00,1.00 -38.40,9.60,1.00,0.00,1.00 --139.20,-9.60,1.00,0.00,1.00 -48.00,9.60,1.00,0.00,1.00 --129.60,-14.40,1.00,0.00,1.00 -57.60,14.40,1.00,0.00,1.00 --120.00,-14.40,1.00,0.00,1.00 -67.20,14.40,1.00,0.00,1.00 --110.40,-14.40,1.00,0.00,1.00 -76.80,14.40,1.00,0.00,1.00 --100.80,-14.40,1.00,0.00,1.00 -86.40,14.40,1.00,0.00,1.00 --86.40,-14.40,1.00,0.00,1.00 -96.00,14.40,1.00,0.00,1.00 --76.80,-14.40,1.00,0.00,1.00 -105.60,14.40,1.00,0.00,1.00 --67.20,-14.40,1.00,0.00,1.00 -115.20,14.40,1.00,0.00,1.00 --57.60,-14.40,1.00,0.00,1.00 -124.80,14.40,1.00,0.00,1.00 --48.00,-14.40,1.00,0.00,1.00 -134.40,9.60,1.00,0.00,1.00 --38.40,-9.60,1.00,0.00,1.00 -144.00,9.60,1.00,0.00,1.00 --28.80,-9.60,1.00,0.00,1.00 -153.60,4.80,1.00,0.00,1.00 --19.20,-4.80,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -14.40,4.80,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 -24.00,4.80,1.00,0.00,1.00 --148.80,-9.60,1.00,0.00,1.00 -33.60,9.60,1.00,0.00,1.00 --139.20,-9.60,1.00,0.00,1.00 -43.20,9.60,1.00,0.00,1.00 --129.60,-14.40,1.00,0.00,1.00 -52.80,14.40,1.00,0.00,1.00 --120.00,-14.40,1.00,0.00,1.00 -62.40,14.40,1.00,0.00,1.00 --110.40,-14.40,1.00,0.00,1.00 -72.00,14.40,1.00,0.00,1.00 --100.80,-14.40,1.00,0.00,1.00 -81.60,14.40,1.00,0.00,1.00 --91.20,-14.40,1.00,0.00,1.00 -96.00,14.40,1.00,0.00,1.00 --81.60,-14.40,1.00,0.00,1.00 -105.60,14.40,1.00,0.00,1.00 --72.00,-14.40,1.00,0.00,1.00 -115.20,14.40,1.00,0.00,1.00 --62.40,-14.40,1.00,0.00,1.00 -124.80,14.40,1.00,0.00,1.00 --52.80,-14.40,1.00,0.00,1.00 -134.40,9.60,1.00,0.00,1.00 --43.20,-9.60,1.00,0.00,1.00 -144.00,9.60,1.00,0.00,1.00 --33.60,-9.60,1.00,0.00,1.00 -153.60,9.60,1.00,0.00,1.00 --24.00,-4.80,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 --14.40,-4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -9.60,0.00,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 -19.20,4.80,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 -28.80,4.80,1.00,0.00,1.00 --148.80,-4.80,1.00,0.00,1.00 -38.40,4.80,1.00,0.00,1.00 --139.20,-9.60,1.00,0.00,1.00 -48.00,9.60,1.00,0.00,1.00 --129.60,-9.60,1.00,0.00,1.00 -57.60,9.60,1.00,0.00,1.00 --120.00,-9.60,1.00,0.00,1.00 -67.20,9.60,1.00,0.00,1.00 --110.40,-9.60,1.00,0.00,1.00 -76.80,9.60,1.00,0.00,1.00 --100.80,-9.60,1.00,0.00,1.00 -86.40,9.60,1.00,0.00,1.00 --86.40,-9.60,1.00,0.00,1.00 -96.00,9.60,1.00,0.00,1.00 --76.80,-9.60,1.00,0.00,1.00 -105.60,9.60,1.00,0.00,1.00 --67.20,-9.60,1.00,0.00,1.00 -115.20,9.60,1.00,0.00,1.00 --57.60,-9.60,1.00,0.00,1.00 -124.80,9.60,1.00,0.00,1.00 --48.00,-9.60,1.00,0.00,1.00 -134.40,9.60,1.00,0.00,1.00 --38.40,-9.60,1.00,0.00,1.00 -144.00,4.80,1.00,0.00,1.00 --28.80,-4.80,1.00,0.00,1.00 -153.60,4.80,1.00,0.00,1.00 --19.20,-4.80,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 --9.60,-0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 --168.00,-0.00,1.00,0.00,1.00 -14.40,4.80,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 -24.00,4.80,1.00,0.00,1.00 --148.80,-4.80,1.00,0.00,1.00 -33.60,4.80,1.00,0.00,1.00 --139.20,-9.60,1.00,0.00,1.00 -43.20,9.60,1.00,0.00,1.00 --129.60,-9.60,1.00,0.00,1.00 -52.80,9.60,1.00,0.00,1.00 --120.00,-9.60,1.00,0.00,1.00 -62.40,9.60,1.00,0.00,1.00 --110.40,-9.60,1.00,0.00,1.00 -72.00,9.60,1.00,0.00,1.00 --100.80,-9.60,1.00,0.00,1.00 -81.60,9.60,1.00,0.00,1.00 --91.20,-9.60,1.00,0.00,1.00 -96.00,9.60,1.00,0.00,1.00 --81.60,-9.60,1.00,0.00,1.00 -105.60,9.60,1.00,0.00,1.00 --72.00,-9.60,1.00,0.00,1.00 -115.20,9.60,1.00,0.00,1.00 --62.40,-9.60,1.00,0.00,1.00 -124.80,9.60,1.00,0.00,1.00 --52.80,-9.60,1.00,0.00,1.00 -134.40,9.60,1.00,0.00,1.00 --43.20,-9.60,1.00,0.00,1.00 -144.00,4.80,1.00,0.00,1.00 --33.60,-4.80,1.00,0.00,1.00 -153.60,4.80,1.00,0.00,1.00 --24.00,-4.80,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 --14.40,-4.80,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -9.60,0.00,1.00,0.00,1.00 --168.00,-0.00,1.00,0.00,1.00 -19.20,0.00,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 -28.80,4.80,1.00,0.00,1.00 --148.80,-4.80,1.00,0.00,1.00 -38.40,4.80,1.00,0.00,1.00 --139.20,-4.80,1.00,0.00,1.00 -48.00,4.80,1.00,0.00,1.00 --129.60,-4.80,1.00,0.00,1.00 -57.60,4.80,1.00,0.00,1.00 --120.00,-4.80,1.00,0.00,1.00 -67.20,4.80,1.00,0.00,1.00 --110.40,-4.80,1.00,0.00,1.00 -76.80,4.80,1.00,0.00,1.00 --100.80,-4.80,1.00,0.00,1.00 -86.40,4.80,1.00,0.00,1.00 --86.40,-4.80,1.00,0.00,1.00 -96.00,4.80,1.00,0.00,1.00 --76.80,-4.80,1.00,0.00,1.00 -105.60,4.80,1.00,0.00,1.00 --67.20,-4.80,1.00,0.00,1.00 -115.20,4.80,1.00,0.00,1.00 --57.60,-4.80,1.00,0.00,1.00 -124.80,4.80,1.00,0.00,1.00 --48.00,-4.80,1.00,0.00,1.00 -134.40,4.80,1.00,0.00,1.00 --38.40,-4.80,1.00,0.00,1.00 -144.00,4.80,1.00,0.00,1.00 --28.80,-4.80,1.00,0.00,1.00 -153.60,4.80,1.00,0.00,1.00 --19.20,-4.80,1.00,0.00,1.00 -163.20,0.00,1.00,0.00,1.00 --9.60,-0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 --168.00,-0.00,1.00,0.00,1.00 -14.40,0.00,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 -24.00,4.80,1.00,0.00,1.00 --148.80,-4.80,1.00,0.00,1.00 -33.60,4.80,1.00,0.00,1.00 --139.20,-4.80,1.00,0.00,1.00 -43.20,4.80,1.00,0.00,1.00 --129.60,-4.80,1.00,0.00,1.00 -52.80,4.80,1.00,0.00,1.00 --120.00,-4.80,1.00,0.00,1.00 -62.40,4.80,1.00,0.00,1.00 --110.40,-4.80,1.00,0.00,1.00 -72.00,4.80,1.00,0.00,1.00 --100.80,-4.80,1.00,0.00,1.00 -81.60,4.80,1.00,0.00,1.00 --91.20,-4.80,1.00,0.00,1.00 -96.00,4.80,1.00,0.00,1.00 --81.60,-4.80,1.00,0.00,1.00 -105.60,4.80,1.00,0.00,1.00 --72.00,-4.80,1.00,0.00,1.00 -115.20,4.80,1.00,0.00,1.00 --62.40,-4.80,1.00,0.00,1.00 -124.80,4.80,1.00,0.00,1.00 --52.80,-4.80,1.00,0.00,1.00 -134.40,4.80,1.00,0.00,1.00 --43.20,-4.80,1.00,0.00,1.00 -144.00,4.80,1.00,0.00,1.00 --33.60,-4.80,1.00,0.00,1.00 -153.60,4.80,1.00,0.00,1.00 --24.00,-4.80,1.00,0.00,1.00 -163.20,0.00,1.00,0.00,1.00 --14.40,-0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -9.60,0.00,1.00,0.00,1.00 --168.00,-0.00,1.00,0.00,1.00 -19.20,0.00,1.00,0.00,1.00 --158.40,-0.00,1.00,0.00,1.00 -28.80,0.00,1.00,0.00,1.00 --148.80,-0.00,1.00,0.00,1.00 -38.40,0.00,1.00,0.00,1.00 --139.20,-0.00,1.00,0.00,1.00 -48.00,0.00,1.00,0.00,1.00 --129.60,-0.00,1.00,0.00,1.00 -57.60,0.00,1.00,0.00,1.00 --120.00,-0.00,1.00,0.00,1.00 -67.20,0.00,1.00,0.00,1.00 --110.40,-0.00,1.00,0.00,1.00 -76.80,0.00,1.00,0.00,1.00 --100.80,-0.00,1.00,0.00,1.00 -86.40,0.00,1.00,0.00,1.00 --86.40,-0.00,1.00,0.00,1.00 -96.00,0.00,1.00,0.00,1.00 --76.80,-0.00,1.00,0.00,1.00 -105.60,0.00,1.00,0.00,1.00 --67.20,-0.00,1.00,0.00,1.00 -115.20,0.00,1.00,0.00,1.00 --57.60,-0.00,1.00,0.00,1.00 -124.80,0.00,1.00,0.00,1.00 --48.00,-0.00,1.00,0.00,1.00 -134.40,0.00,1.00,0.00,1.00 --38.40,-0.00,1.00,0.00,1.00 -144.00,0.00,1.00,0.00,1.00 --28.80,-0.00,1.00,0.00,1.00 -153.60,0.00,1.00,0.00,1.00 --19.20,-0.00,1.00,0.00,1.00 -163.20,0.00,1.00,0.00,1.00 --9.60,-0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 --0.00,-0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 --168.00,-0.00,1.00,0.00,1.00 -14.40,0.00,1.00,0.00,1.00 --158.40,-0.00,1.00,0.00,1.00 -24.00,0.00,1.00,0.00,1.00 --148.80,-0.00,1.00,0.00,1.00 -33.60,0.00,1.00,0.00,1.00 --139.20,-0.00,1.00,0.00,1.00 -43.20,0.00,1.00,0.00,1.00 --129.60,-0.00,1.00,0.00,1.00 -52.80,0.00,1.00,0.00,1.00 --120.00,-0.00,1.00,0.00,1.00 -62.40,0.00,1.00,0.00,1.00 --110.40,-0.00,1.00,0.00,1.00 -72.00,0.00,1.00,0.00,1.00 --100.80,-0.00,1.00,0.00,1.00 -81.60,0.00,1.00,0.00,1.00 --91.20,-0.00,1.00,0.00,1.00 -96.00,0.00,1.00,0.00,1.00 --81.60,-0.00,1.00,0.00,1.00 -105.60,0.00,1.00,0.00,1.00 --72.00,-0.00,1.00,0.00,1.00 -115.20,0.00,1.00,0.00,1.00 --62.40,-0.00,1.00,0.00,1.00 -124.80,0.00,1.00,0.00,1.00 --52.80,-0.00,1.00,0.00,1.00 -134.40,0.00,1.00,0.00,1.00 --43.20,-0.00,1.00,0.00,1.00 -144.00,0.00,1.00,0.00,1.00 --33.60,-0.00,1.00,0.00,1.00 -153.60,0.00,1.00,0.00,1.00 --24.00,-0.00,1.00,0.00,1.00 -163.20,0.00,1.00,0.00,1.00 --14.40,-0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 -19.20,-0.00,1.00,0.00,1.00 --158.40,0.00,1.00,0.00,1.00 -28.80,-0.00,1.00,0.00,1.00 --148.80,0.00,1.00,0.00,1.00 -38.40,-0.00,1.00,0.00,1.00 --139.20,0.00,1.00,0.00,1.00 -48.00,-0.00,1.00,0.00,1.00 --129.60,0.00,1.00,0.00,1.00 -57.60,-4.80,1.00,0.00,1.00 --120.00,4.80,1.00,0.00,1.00 -67.20,-4.80,1.00,0.00,1.00 --110.40,4.80,1.00,0.00,1.00 -76.80,-4.80,1.00,0.00,1.00 --100.80,4.80,1.00,0.00,1.00 -86.40,-4.80,1.00,0.00,1.00 --86.40,4.80,1.00,0.00,1.00 -96.00,-4.80,1.00,0.00,1.00 --76.80,4.80,1.00,0.00,1.00 -105.60,-4.80,1.00,0.00,1.00 --67.20,4.80,1.00,0.00,1.00 -115.20,-4.80,1.00,0.00,1.00 --57.60,4.80,1.00,0.00,1.00 -124.80,-4.80,1.00,0.00,1.00 --48.00,0.00,1.00,0.00,1.00 -134.40,-0.00,1.00,0.00,1.00 --38.40,0.00,1.00,0.00,1.00 -144.00,-0.00,1.00,0.00,1.00 --28.80,0.00,1.00,0.00,1.00 -153.60,-0.00,1.00,0.00,1.00 --19.20,0.00,1.00,0.00,1.00 -163.20,-0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 -14.40,-0.00,1.00,0.00,1.00 --158.40,0.00,1.00,0.00,1.00 -24.00,-0.00,1.00,0.00,1.00 --148.80,0.00,1.00,0.00,1.00 -33.60,-0.00,1.00,0.00,1.00 --139.20,0.00,1.00,0.00,1.00 -43.20,-0.00,1.00,0.00,1.00 --129.60,0.00,1.00,0.00,1.00 -52.80,-4.80,1.00,0.00,1.00 --120.00,4.80,1.00,0.00,1.00 -62.40,-4.80,1.00,0.00,1.00 --110.40,4.80,1.00,0.00,1.00 -72.00,-4.80,1.00,0.00,1.00 --100.80,4.80,1.00,0.00,1.00 -81.60,-4.80,1.00,0.00,1.00 --91.20,4.80,1.00,0.00,1.00 -96.00,-4.80,1.00,0.00,1.00 --81.60,4.80,1.00,0.00,1.00 -105.60,-4.80,1.00,0.00,1.00 --72.00,4.80,1.00,0.00,1.00 -115.20,-4.80,1.00,0.00,1.00 --62.40,4.80,1.00,0.00,1.00 -124.80,-4.80,1.00,0.00,1.00 --52.80,0.00,1.00,0.00,1.00 -134.40,-0.00,1.00,0.00,1.00 --43.20,0.00,1.00,0.00,1.00 -144.00,-0.00,1.00,0.00,1.00 --33.60,0.00,1.00,0.00,1.00 -153.60,-0.00,1.00,0.00,1.00 --24.00,0.00,1.00,0.00,1.00 -163.20,-0.00,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 -28.80,-4.80,1.00,0.00,1.00 --148.80,4.80,1.00,0.00,1.00 -38.40,-4.80,1.00,0.00,1.00 --139.20,4.80,1.00,0.00,1.00 -48.00,-4.80,1.00,0.00,1.00 --129.60,4.80,1.00,0.00,1.00 -57.60,-4.80,1.00,0.00,1.00 --120.00,4.80,1.00,0.00,1.00 -67.20,-4.80,1.00,0.00,1.00 --110.40,9.60,1.00,0.00,1.00 -76.80,-9.60,1.00,0.00,1.00 --100.80,9.60,1.00,0.00,1.00 -86.40,-9.60,1.00,0.00,1.00 --86.40,9.60,1.00,0.00,1.00 -96.00,-9.60,1.00,0.00,1.00 --76.80,9.60,1.00,0.00,1.00 -105.60,-9.60,1.00,0.00,1.00 --67.20,9.60,1.00,0.00,1.00 -115.20,-4.80,1.00,0.00,1.00 --57.60,4.80,1.00,0.00,1.00 -124.80,-4.80,1.00,0.00,1.00 --48.00,4.80,1.00,0.00,1.00 -134.40,-4.80,1.00,0.00,1.00 --38.40,4.80,1.00,0.00,1.00 -144.00,-4.80,1.00,0.00,1.00 --28.80,4.80,1.00,0.00,1.00 -153.60,-4.80,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 -163.20,-0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 -14.40,-0.00,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 -24.00,-4.80,1.00,0.00,1.00 --148.80,4.80,1.00,0.00,1.00 -33.60,-4.80,1.00,0.00,1.00 --139.20,4.80,1.00,0.00,1.00 -43.20,-4.80,1.00,0.00,1.00 --129.60,4.80,1.00,0.00,1.00 -52.80,-4.80,1.00,0.00,1.00 --120.00,4.80,1.00,0.00,1.00 -62.40,-4.80,1.00,0.00,1.00 --110.40,9.60,1.00,0.00,1.00 -72.00,-9.60,1.00,0.00,1.00 --100.80,9.60,1.00,0.00,1.00 -81.60,-9.60,1.00,0.00,1.00 --91.20,9.60,1.00,0.00,1.00 -96.00,-9.60,1.00,0.00,1.00 --81.60,9.60,1.00,0.00,1.00 -105.60,-9.60,1.00,0.00,1.00 --72.00,9.60,1.00,0.00,1.00 -115.20,-4.80,1.00,0.00,1.00 --62.40,4.80,1.00,0.00,1.00 -124.80,-4.80,1.00,0.00,1.00 --52.80,4.80,1.00,0.00,1.00 -134.40,-4.80,1.00,0.00,1.00 --43.20,4.80,1.00,0.00,1.00 -144.00,-4.80,1.00,0.00,1.00 --33.60,4.80,1.00,0.00,1.00 -153.60,-4.80,1.00,0.00,1.00 --24.00,4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 -28.80,-4.80,1.00,0.00,1.00 --148.80,4.80,1.00,0.00,1.00 -38.40,-9.60,1.00,0.00,1.00 --139.20,9.60,1.00,0.00,1.00 -48.00,-9.60,1.00,0.00,1.00 --129.60,9.60,1.00,0.00,1.00 -57.60,-9.60,1.00,0.00,1.00 --120.00,9.60,1.00,0.00,1.00 -67.20,-9.60,1.00,0.00,1.00 --110.40,9.60,1.00,0.00,1.00 -76.80,-14.40,1.00,0.00,1.00 --100.80,14.40,1.00,0.00,1.00 -86.40,-14.40,1.00,0.00,1.00 --86.40,14.40,1.00,0.00,1.00 -96.00,-14.40,1.00,0.00,1.00 --76.80,14.40,1.00,0.00,1.00 -105.60,-14.40,1.00,0.00,1.00 --67.20,9.60,1.00,0.00,1.00 -115.20,-9.60,1.00,0.00,1.00 --57.60,9.60,1.00,0.00,1.00 -124.80,-9.60,1.00,0.00,1.00 --48.00,9.60,1.00,0.00,1.00 -134.40,-9.60,1.00,0.00,1.00 --38.40,9.60,1.00,0.00,1.00 -144.00,-9.60,1.00,0.00,1.00 --28.80,4.80,1.00,0.00,1.00 -153.60,-4.80,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 -24.00,-4.80,1.00,0.00,1.00 --148.80,4.80,1.00,0.00,1.00 -33.60,-9.60,1.00,0.00,1.00 --139.20,9.60,1.00,0.00,1.00 -43.20,-9.60,1.00,0.00,1.00 --129.60,9.60,1.00,0.00,1.00 -52.80,-9.60,1.00,0.00,1.00 --120.00,9.60,1.00,0.00,1.00 -62.40,-9.60,1.00,0.00,1.00 --110.40,9.60,1.00,0.00,1.00 -72.00,-14.40,1.00,0.00,1.00 --100.80,14.40,1.00,0.00,1.00 -81.60,-14.40,1.00,0.00,1.00 --91.20,14.40,1.00,0.00,1.00 -96.00,-14.40,1.00,0.00,1.00 --81.60,14.40,1.00,0.00,1.00 -105.60,-14.40,1.00,0.00,1.00 --72.00,9.60,1.00,0.00,1.00 -115.20,-9.60,1.00,0.00,1.00 --62.40,9.60,1.00,0.00,1.00 -124.80,-9.60,1.00,0.00,1.00 --52.80,9.60,1.00,0.00,1.00 -134.40,-9.60,1.00,0.00,1.00 --43.20,9.60,1.00,0.00,1.00 -144.00,-9.60,1.00,0.00,1.00 --33.60,4.80,1.00,0.00,1.00 -153.60,-4.80,1.00,0.00,1.00 --24.00,4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 -28.80,-9.60,1.00,0.00,1.00 --148.80,9.60,1.00,0.00,1.00 -38.40,-9.60,1.00,0.00,1.00 --139.20,9.60,1.00,0.00,1.00 -48.00,-14.40,1.00,0.00,1.00 --129.60,14.40,1.00,0.00,1.00 -57.60,-14.40,1.00,0.00,1.00 --120.00,14.40,1.00,0.00,1.00 -67.20,-14.40,1.00,0.00,1.00 --110.40,14.40,1.00,0.00,1.00 -76.80,-19.20,1.00,0.00,1.00 --100.80,19.20,1.00,0.00,1.00 -86.40,-19.20,1.00,0.00,1.00 --86.40,19.20,1.00,0.00,1.00 -96.00,-19.20,1.00,0.00,1.00 --76.80,19.20,1.00,0.00,1.00 -105.60,-14.40,1.00,0.00,1.00 --67.20,14.40,1.00,0.00,1.00 -115.20,-14.40,1.00,0.00,1.00 --57.60,14.40,1.00,0.00,1.00 -124.80,-14.40,1.00,0.00,1.00 --48.00,14.40,1.00,0.00,1.00 -134.40,-14.40,1.00,0.00,1.00 --38.40,9.60,1.00,0.00,1.00 -144.00,-9.60,1.00,0.00,1.00 --28.80,9.60,1.00,0.00,1.00 -153.60,-9.60,1.00,0.00,1.00 --19.20,4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 --158.40,4.80,1.00,0.00,1.00 -24.00,-9.60,1.00,0.00,1.00 --148.80,9.60,1.00,0.00,1.00 -33.60,-9.60,1.00,0.00,1.00 --139.20,9.60,1.00,0.00,1.00 -43.20,-14.40,1.00,0.00,1.00 --129.60,14.40,1.00,0.00,1.00 -52.80,-14.40,1.00,0.00,1.00 --120.00,14.40,1.00,0.00,1.00 -62.40,-14.40,1.00,0.00,1.00 --110.40,14.40,1.00,0.00,1.00 -72.00,-14.40,1.00,0.00,1.00 --100.80,19.20,1.00,0.00,1.00 -81.60,-19.20,1.00,0.00,1.00 --91.20,19.20,1.00,0.00,1.00 -96.00,-19.20,1.00,0.00,1.00 --81.60,19.20,1.00,0.00,1.00 -105.60,-19.20,1.00,0.00,1.00 --72.00,14.40,1.00,0.00,1.00 -115.20,-14.40,1.00,0.00,1.00 --62.40,14.40,1.00,0.00,1.00 -124.80,-14.40,1.00,0.00,1.00 --52.80,14.40,1.00,0.00,1.00 -134.40,-14.40,1.00,0.00,1.00 --43.20,9.60,1.00,0.00,1.00 -144.00,-9.60,1.00,0.00,1.00 --33.60,9.60,1.00,0.00,1.00 -153.60,-9.60,1.00,0.00,1.00 --24.00,4.80,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -19.20,-4.80,1.00,0.00,1.00 --158.40,9.60,1.00,0.00,1.00 -28.80,-9.60,1.00,0.00,1.00 --148.80,14.40,1.00,0.00,1.00 -38.40,-14.40,1.00,0.00,1.00 --139.20,14.40,1.00,0.00,1.00 -48.00,-14.40,1.00,0.00,1.00 --129.60,19.20,1.00,0.00,1.00 -57.60,-19.20,1.00,0.00,1.00 --120.00,19.20,1.00,0.00,1.00 -67.20,-19.20,1.00,0.00,1.00 --110.40,19.20,1.00,0.00,1.00 -76.80,-19.20,1.00,0.00,1.00 --100.80,24.00,1.00,0.00,1.00 -86.40,-24.00,1.00,0.00,1.00 --86.40,24.00,1.00,0.00,1.00 -96.00,-24.00,1.00,0.00,1.00 --76.80,24.00,1.00,0.00,1.00 -105.60,-19.20,1.00,0.00,1.00 --67.20,19.20,1.00,0.00,1.00 -115.20,-19.20,1.00,0.00,1.00 --57.60,19.20,1.00,0.00,1.00 -124.80,-19.20,1.00,0.00,1.00 --48.00,19.20,1.00,0.00,1.00 -134.40,-14.40,1.00,0.00,1.00 --38.40,14.40,1.00,0.00,1.00 -144.00,-14.40,1.00,0.00,1.00 --28.80,9.60,1.00,0.00,1.00 -153.60,-9.60,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -14.40,-4.80,1.00,0.00,1.00 --158.40,9.60,1.00,0.00,1.00 -24.00,-9.60,1.00,0.00,1.00 --148.80,9.60,1.00,0.00,1.00 -33.60,-14.40,1.00,0.00,1.00 --139.20,14.40,1.00,0.00,1.00 -43.20,-14.40,1.00,0.00,1.00 --129.60,19.20,1.00,0.00,1.00 -52.80,-19.20,1.00,0.00,1.00 --120.00,19.20,1.00,0.00,1.00 -62.40,-19.20,1.00,0.00,1.00 --110.40,19.20,1.00,0.00,1.00 -72.00,-19.20,1.00,0.00,1.00 --100.80,24.00,1.00,0.00,1.00 -81.60,-24.00,1.00,0.00,1.00 --91.20,24.00,1.00,0.00,1.00 -96.00,-24.00,1.00,0.00,1.00 --81.60,24.00,1.00,0.00,1.00 -105.60,-19.20,1.00,0.00,1.00 --72.00,19.20,1.00,0.00,1.00 -115.20,-19.20,1.00,0.00,1.00 --62.40,19.20,1.00,0.00,1.00 -124.80,-19.20,1.00,0.00,1.00 --52.80,19.20,1.00,0.00,1.00 -134.40,-14.40,1.00,0.00,1.00 --43.20,14.40,1.00,0.00,1.00 -144.00,-14.40,1.00,0.00,1.00 --33.60,14.40,1.00,0.00,1.00 -153.60,-9.60,1.00,0.00,1.00 --24.00,9.60,1.00,0.00,1.00 -163.20,-4.80,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -19.20,-9.60,1.00,0.00,1.00 --158.40,9.60,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 --148.80,14.40,1.00,0.00,1.00 -33.60,-14.40,1.00,0.00,1.00 --139.20,19.20,1.00,0.00,1.00 -43.20,-19.20,1.00,0.00,1.00 --129.60,19.20,1.00,0.00,1.00 -52.80,-24.00,1.00,0.00,1.00 --120.00,24.00,1.00,0.00,1.00 -62.40,-24.00,1.00,0.00,1.00 --110.40,24.00,1.00,0.00,1.00 -76.80,-24.00,1.00,0.00,1.00 --100.80,28.80,1.00,0.00,1.00 -86.40,-28.80,1.00,0.00,1.00 --86.40,28.80,1.00,0.00,1.00 -96.00,-28.80,1.00,0.00,1.00 --76.80,28.80,1.00,0.00,1.00 -105.60,-24.00,1.00,0.00,1.00 --67.20,24.00,1.00,0.00,1.00 -120.00,-24.00,1.00,0.00,1.00 --57.60,24.00,1.00,0.00,1.00 -129.60,-24.00,1.00,0.00,1.00 --48.00,19.20,1.00,0.00,1.00 -139.20,-19.20,1.00,0.00,1.00 --38.40,19.20,1.00,0.00,1.00 -148.80,-14.40,1.00,0.00,1.00 --28.80,14.40,1.00,0.00,1.00 -158.40,-9.60,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 --158.40,9.60,1.00,0.00,1.00 -24.00,-9.60,1.00,0.00,1.00 --153.60,14.40,1.00,0.00,1.00 -33.60,-14.40,1.00,0.00,1.00 --144.00,19.20,1.00,0.00,1.00 -43.20,-19.20,1.00,0.00,1.00 --134.40,19.20,1.00,0.00,1.00 -52.80,-24.00,1.00,0.00,1.00 --124.80,24.00,1.00,0.00,1.00 -62.40,-24.00,1.00,0.00,1.00 --110.40,24.00,1.00,0.00,1.00 -72.00,-24.00,1.00,0.00,1.00 --100.80,28.80,1.00,0.00,1.00 -81.60,-28.80,1.00,0.00,1.00 --91.20,28.80,1.00,0.00,1.00 -96.00,-28.80,1.00,0.00,1.00 --81.60,28.80,1.00,0.00,1.00 -105.60,-24.00,1.00,0.00,1.00 --72.00,24.00,1.00,0.00,1.00 -115.20,-24.00,1.00,0.00,1.00 --57.60,24.00,1.00,0.00,1.00 -124.80,-24.00,1.00,0.00,1.00 --48.00,19.20,1.00,0.00,1.00 -134.40,-19.20,1.00,0.00,1.00 --38.40,19.20,1.00,0.00,1.00 -144.00,-14.40,1.00,0.00,1.00 --28.80,14.40,1.00,0.00,1.00 -153.60,-14.40,1.00,0.00,1.00 --24.00,9.60,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 --14.40,4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 --158.40,14.40,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 --148.80,19.20,1.00,0.00,1.00 -33.60,-19.20,1.00,0.00,1.00 --139.20,19.20,1.00,0.00,1.00 -43.20,-24.00,1.00,0.00,1.00 --129.60,24.00,1.00,0.00,1.00 -52.80,-28.80,1.00,0.00,1.00 --120.00,28.80,1.00,0.00,1.00 -62.40,-28.80,1.00,0.00,1.00 --110.40,28.80,1.00,0.00,1.00 -76.80,-28.80,1.00,0.00,1.00 --100.80,33.60,1.00,0.00,1.00 -86.40,-33.60,1.00,0.00,1.00 --86.40,33.60,1.00,0.00,1.00 -96.00,-33.60,1.00,0.00,1.00 --76.80,28.80,1.00,0.00,1.00 -110.40,-28.80,1.00,0.00,1.00 --67.20,28.80,1.00,0.00,1.00 -120.00,-28.80,1.00,0.00,1.00 --57.60,28.80,1.00,0.00,1.00 -129.60,-24.00,1.00,0.00,1.00 --48.00,24.00,1.00,0.00,1.00 -139.20,-24.00,1.00,0.00,1.00 --38.40,19.20,1.00,0.00,1.00 -148.80,-19.20,1.00,0.00,1.00 --28.80,14.40,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 --19.20,9.60,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 --163.20,9.60,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 --153.60,14.40,1.00,0.00,1.00 -33.60,-19.20,1.00,0.00,1.00 --144.00,19.20,1.00,0.00,1.00 -43.20,-24.00,1.00,0.00,1.00 --134.40,24.00,1.00,0.00,1.00 -52.80,-24.00,1.00,0.00,1.00 --124.80,28.80,1.00,0.00,1.00 -62.40,-28.80,1.00,0.00,1.00 --115.20,28.80,1.00,0.00,1.00 -72.00,-28.80,1.00,0.00,1.00 --100.80,28.80,1.00,0.00,1.00 -81.60,-33.60,1.00,0.00,1.00 --91.20,33.60,1.00,0.00,1.00 -96.00,-33.60,1.00,0.00,1.00 --81.60,33.60,1.00,0.00,1.00 -105.60,-28.80,1.00,0.00,1.00 --67.20,28.80,1.00,0.00,1.00 -115.20,-28.80,1.00,0.00,1.00 --57.60,28.80,1.00,0.00,1.00 -124.80,-28.80,1.00,0.00,1.00 --48.00,24.00,1.00,0.00,1.00 -134.40,-24.00,1.00,0.00,1.00 --38.40,19.20,1.00,0.00,1.00 -144.00,-19.20,1.00,0.00,1.00 --28.80,19.20,1.00,0.00,1.00 -153.60,-14.40,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 --14.40,9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 --158.40,14.40,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 --153.60,19.20,1.00,0.00,1.00 -33.60,-24.00,1.00,0.00,1.00 --144.00,24.00,1.00,0.00,1.00 -43.20,-24.00,1.00,0.00,1.00 --134.40,28.80,1.00,0.00,1.00 -52.80,-28.80,1.00,0.00,1.00 --124.80,33.60,1.00,0.00,1.00 -62.40,-33.60,1.00,0.00,1.00 --110.40,33.60,1.00,0.00,1.00 -72.00,-33.60,1.00,0.00,1.00 --100.80,38.40,1.00,0.00,1.00 -86.40,-38.40,1.00,0.00,1.00 --86.40,38.40,1.00,0.00,1.00 -96.00,-38.40,1.00,0.00,1.00 --76.80,33.60,1.00,0.00,1.00 -110.40,-33.60,1.00,0.00,1.00 --67.20,33.60,1.00,0.00,1.00 -120.00,-33.60,1.00,0.00,1.00 --52.80,28.80,1.00,0.00,1.00 -129.60,-28.80,1.00,0.00,1.00 --43.20,28.80,1.00,0.00,1.00 -139.20,-24.00,1.00,0.00,1.00 --33.60,24.00,1.00,0.00,1.00 -148.80,-19.20,1.00,0.00,1.00 --24.00,19.20,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 --9.60,4.80,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 --168.00,4.80,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 -24.00,-14.40,1.00,0.00,1.00 --153.60,19.20,1.00,0.00,1.00 -28.80,-19.20,1.00,0.00,1.00 --144.00,24.00,1.00,0.00,1.00 -38.40,-24.00,1.00,0.00,1.00 --134.40,28.80,1.00,0.00,1.00 -48.00,-28.80,1.00,0.00,1.00 --124.80,28.80,1.00,0.00,1.00 -57.60,-33.60,1.00,0.00,1.00 --115.20,33.60,1.00,0.00,1.00 -72.00,-33.60,1.00,0.00,1.00 --105.60,33.60,1.00,0.00,1.00 -81.60,-38.40,1.00,0.00,1.00 --91.20,38.40,1.00,0.00,1.00 -96.00,-38.40,1.00,0.00,1.00 --81.60,38.40,1.00,0.00,1.00 -105.60,-33.60,1.00,0.00,1.00 --67.20,33.60,1.00,0.00,1.00 -120.00,-33.60,1.00,0.00,1.00 --57.60,33.60,1.00,0.00,1.00 -129.60,-28.80,1.00,0.00,1.00 --48.00,28.80,1.00,0.00,1.00 -139.20,-24.00,1.00,0.00,1.00 --38.40,24.00,1.00,0.00,1.00 -148.80,-24.00,1.00,0.00,1.00 --28.80,19.20,1.00,0.00,1.00 -158.40,-14.40,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 -163.20,-9.60,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 -9.60,-4.80,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 -14.40,-14.40,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 -24.00,-19.20,1.00,0.00,1.00 --153.60,19.20,1.00,0.00,1.00 -28.80,-24.00,1.00,0.00,1.00 --144.00,28.80,1.00,0.00,1.00 -38.40,-28.80,1.00,0.00,1.00 --134.40,33.60,1.00,0.00,1.00 -48.00,-33.60,1.00,0.00,1.00 --124.80,33.60,1.00,0.00,1.00 -62.40,-38.40,1.00,0.00,1.00 --115.20,38.40,1.00,0.00,1.00 -72.00,-38.40,1.00,0.00,1.00 --100.80,43.20,1.00,0.00,1.00 -86.40,-43.20,1.00,0.00,1.00 --86.40,43.20,1.00,0.00,1.00 -96.00,-43.20,1.00,0.00,1.00 --76.80,38.40,1.00,0.00,1.00 -110.40,-38.40,1.00,0.00,1.00 --62.40,38.40,1.00,0.00,1.00 -120.00,-38.40,1.00,0.00,1.00 --52.80,33.60,1.00,0.00,1.00 -134.40,-33.60,1.00,0.00,1.00 --43.20,28.80,1.00,0.00,1.00 -144.00,-28.80,1.00,0.00,1.00 --33.60,24.00,1.00,0.00,1.00 -153.60,-24.00,1.00,0.00,1.00 --24.00,19.20,1.00,0.00,1.00 -158.40,-19.20,1.00,0.00,1.00 --14.40,14.40,1.00,0.00,1.00 -168.00,-9.60,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 -14.40,-9.60,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 -19.20,-19.20,1.00,0.00,1.00 --153.60,19.20,1.00,0.00,1.00 -28.80,-24.00,1.00,0.00,1.00 --148.80,24.00,1.00,0.00,1.00 -38.40,-28.80,1.00,0.00,1.00 --139.20,28.80,1.00,0.00,1.00 -48.00,-33.60,1.00,0.00,1.00 --129.60,33.60,1.00,0.00,1.00 -57.60,-38.40,1.00,0.00,1.00 --115.20,38.40,1.00,0.00,1.00 -67.20,-38.40,1.00,0.00,1.00 --105.60,38.40,1.00,0.00,1.00 -81.60,-43.20,1.00,0.00,1.00 --91.20,43.20,1.00,0.00,1.00 -96.00,-43.20,1.00,0.00,1.00 --76.80,43.20,1.00,0.00,1.00 -105.60,-38.40,1.00,0.00,1.00 --67.20,38.40,1.00,0.00,1.00 -120.00,-38.40,1.00,0.00,1.00 --52.80,33.60,1.00,0.00,1.00 -129.60,-33.60,1.00,0.00,1.00 --43.20,33.60,1.00,0.00,1.00 -139.20,-28.80,1.00,0.00,1.00 --33.60,28.80,1.00,0.00,1.00 -148.80,-24.00,1.00,0.00,1.00 --28.80,19.20,1.00,0.00,1.00 -158.40,-19.20,1.00,0.00,1.00 --19.20,14.40,1.00,0.00,1.00 -163.20,-14.40,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 --177.60,4.80,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 --168.00,9.60,1.00,0.00,1.00 -14.40,-14.40,1.00,0.00,1.00 --163.20,19.20,1.00,0.00,1.00 -19.20,-19.20,1.00,0.00,1.00 --153.60,24.00,1.00,0.00,1.00 -28.80,-28.80,1.00,0.00,1.00 --148.80,28.80,1.00,0.00,1.00 -38.40,-33.60,1.00,0.00,1.00 --139.20,33.60,1.00,0.00,1.00 -48.00,-38.40,1.00,0.00,1.00 --124.80,38.40,1.00,0.00,1.00 -57.60,-43.20,1.00,0.00,1.00 --115.20,43.20,1.00,0.00,1.00 -72.00,-43.20,1.00,0.00,1.00 --100.80,43.20,1.00,0.00,1.00 -86.40,-48.00,1.00,0.00,1.00 --86.40,48.00,1.00,0.00,1.00 -100.80,-48.00,1.00,0.00,1.00 --76.80,43.20,1.00,0.00,1.00 -110.40,-43.20,1.00,0.00,1.00 --62.40,43.20,1.00,0.00,1.00 -124.80,-38.40,1.00,0.00,1.00 --48.00,38.40,1.00,0.00,1.00 -134.40,-38.40,1.00,0.00,1.00 --38.40,33.60,1.00,0.00,1.00 -144.00,-28.80,1.00,0.00,1.00 --28.80,28.80,1.00,0.00,1.00 -153.60,-24.00,1.00,0.00,1.00 --24.00,24.00,1.00,0.00,1.00 -163.20,-19.20,1.00,0.00,1.00 --14.40,14.40,1.00,0.00,1.00 -168.00,-14.40,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --0.00,0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 -4.80,-4.80,1.00,0.00,1.00 --172.80,9.60,1.00,0.00,1.00 -9.60,-14.40,1.00,0.00,1.00 --163.20,14.40,1.00,0.00,1.00 -19.20,-19.20,1.00,0.00,1.00 --158.40,24.00,1.00,0.00,1.00 -28.80,-24.00,1.00,0.00,1.00 --148.80,28.80,1.00,0.00,1.00 -33.60,-28.80,1.00,0.00,1.00 --139.20,33.60,1.00,0.00,1.00 -43.20,-38.40,1.00,0.00,1.00 --129.60,38.40,1.00,0.00,1.00 -57.60,-38.40,1.00,0.00,1.00 --120.00,43.20,1.00,0.00,1.00 -67.20,-43.20,1.00,0.00,1.00 --105.60,43.20,1.00,0.00,1.00 -81.60,-48.00,1.00,0.00,1.00 --91.20,48.00,1.00,0.00,1.00 -96.00,-48.00,1.00,0.00,1.00 --76.80,43.20,1.00,0.00,1.00 -110.40,-43.20,1.00,0.00,1.00 --67.20,43.20,1.00,0.00,1.00 -120.00,-43.20,1.00,0.00,1.00 --52.80,38.40,1.00,0.00,1.00 -134.40,-38.40,1.00,0.00,1.00 --43.20,33.60,1.00,0.00,1.00 -144.00,-33.60,1.00,0.00,1.00 --33.60,28.80,1.00,0.00,1.00 -153.60,-28.80,1.00,0.00,1.00 --24.00,24.00,1.00,0.00,1.00 -158.40,-19.20,1.00,0.00,1.00 --19.20,19.20,1.00,0.00,1.00 -168.00,-14.40,1.00,0.00,1.00 --9.60,9.60,1.00,0.00,1.00 -172.80,-4.80,1.00,0.00,1.00 --4.80,4.80,1.00,0.00,1.00 +0.00,0.00,0.00,0.00,1.00,-0.00,0.00 +-177.60,-4.80,16.00,0.00,1.00,-0.00,0.00 +4.80,4.80,0.02,0.00,1.00,-0.00,0.00 +-168.00,-9.60,15.98,0.00,1.00,-0.00,0.00 +14.40,14.40,0.04,0.00,1.00,-0.00,0.00 +-163.20,-14.40,15.96,0.00,1.00,-0.00,0.00 +19.20,19.20,0.06,0.00,1.00,-0.00,0.00 +-153.60,-24.00,15.94,0.00,1.00,-0.00,0.00 +28.80,24.00,0.09,0.00,1.00,-0.00,0.00 +-148.80,-28.80,15.91,0.00,1.00,-0.00,0.00 +38.40,33.60,0.11,0.00,1.00,-0.00,0.00 +-139.20,-33.60,15.89,0.00,1.00,-0.00,0.00 +48.00,38.40,0.13,0.00,1.00,-0.00,0.00 +-124.80,-38.40,15.87,0.00,1.00,-0.00,0.00 +57.60,38.40,0.15,0.00,1.00,-0.00,0.00 +-115.20,-43.20,15.85,0.00,1.00,-0.00,0.00 +72.00,43.20,0.17,0.00,1.00,-0.00,0.00 +-100.80,-43.20,15.83,0.00,1.00,-0.00,0.00 +86.40,43.20,0.19,0.00,1.00,-0.00,0.00 +-86.40,-43.20,15.81,0.00,1.00,-177.60,0.00 +100.80,43.20,0.21,0.00,1.00,-177.60,0.00 +-76.80,-43.20,15.79,0.00,1.00,-177.60,0.00 +110.40,43.20,0.23,0.00,1.00,-177.60,0.00 +-62.40,-43.20,15.77,0.00,1.00,-177.60,0.00 +124.80,38.40,0.26,0.00,1.00,-177.60,0.00 +-52.80,-38.40,15.74,0.00,1.00,177.60,0.00 +134.40,33.60,0.28,0.00,1.00,177.60,0.00 +-38.40,-33.60,15.72,0.00,1.00,177.60,0.00 +144.00,28.80,0.30,0.00,1.00,177.60,0.00 +-33.60,-28.80,15.70,0.00,1.00,177.60,0.00 +153.60,24.00,0.32,0.00,1.00,177.60,0.00 +-24.00,-19.20,15.68,0.00,1.00,177.60,0.00 +158.40,19.20,0.34,0.00,1.00,177.60,0.00 +-14.40,-14.40,15.66,0.00,1.00,177.60,0.00 +168.00,9.60,0.36,0.00,1.00,177.60,0.00 +-9.60,-9.60,15.64,0.00,1.00,177.60,0.00 +172.80,4.80,0.38,0.00,1.00,177.60,0.00 +-0.00,-0.00,15.62,0.00,1.00,177.60,0.00 +-177.60,-0.00,0.41,0.00,1.00,-177.60,0.00 +4.80,4.80,15.59,0.00,1.00,-177.60,0.00 +-172.80,-9.60,0.43,0.00,1.00,-177.60,0.00 +14.40,9.60,15.57,0.00,1.00,-177.60,0.00 +-163.20,-14.40,0.45,0.00,1.00,-177.60,0.00 +19.20,19.20,15.55,0.00,1.00,-177.60,0.00 +-158.40,-19.20,0.47,0.00,1.00,-177.60,0.00 +28.80,24.00,15.53,0.00,1.00,-177.60,0.00 +-148.80,-28.80,0.49,0.00,1.00,-177.60,0.00 +33.60,28.80,15.51,0.00,1.00,-177.60,0.00 +-139.20,-33.60,0.51,0.00,1.00,-177.60,0.00 +43.20,33.60,15.49,0.00,1.00,-177.60,0.00 +-129.60,-38.40,0.53,0.00,1.00,-177.60,0.00 +57.60,38.40,15.47,0.00,1.00,177.60,0.00 +-120.00,-43.20,0.56,0.00,1.00,177.60,0.00 +67.20,43.20,15.44,0.00,1.00,177.60,0.00 +-105.60,-43.20,0.58,0.00,1.00,177.60,0.00 +81.60,43.20,15.42,0.00,1.00,177.60,0.00 +-91.20,-43.20,0.60,0.00,1.00,177.60,0.00 +96.00,43.20,15.40,0.00,1.00,0.00,0.00 +-76.80,-43.20,0.62,0.00,1.00,0.00,0.00 +110.40,43.20,15.38,0.00,1.00,0.00,0.00 +-67.20,-43.20,0.64,0.00,1.00,0.00,0.00 +120.00,38.40,15.36,0.00,1.00,0.00,0.00 +-52.80,-38.40,0.66,0.00,1.00,0.00,0.00 +129.60,38.40,15.34,0.00,1.00,0.00,0.00 +-43.20,-33.60,0.68,0.00,1.00,0.00,0.00 +144.00,33.60,15.32,0.00,1.00,0.00,0.00 +-33.60,-28.80,0.70,0.00,1.00,0.00,0.00 +148.80,24.00,15.30,0.00,1.00,0.00,0.00 +-24.00,-24.00,0.73,0.00,1.00,0.00,0.00 +158.40,19.20,15.27,0.00,1.00,0.00,0.00 +-19.20,-14.40,0.75,0.00,1.00,0.00,0.00 +168.00,14.40,15.25,0.00,1.00,0.00,0.00 +-9.60,-9.60,0.77,0.00,1.00,0.00,0.00 +172.80,4.80,15.23,0.00,1.00,0.00,0.00 +-4.80,-4.80,0.79,0.00,1.00,0.00,0.00 +0.00,0.00,15.21,0.00,1.00,0.00,0.00 +-177.60,-4.80,0.81,0.00,1.00,0.00,-0.00 +9.60,4.80,15.19,0.00,1.00,0.00,-0.00 +-168.00,-9.60,0.83,0.00,1.00,0.00,-0.00 +14.40,14.40,15.17,0.00,1.00,0.00,-0.00 +-163.20,-14.40,0.85,0.00,1.00,0.00,-0.00 +24.00,19.20,15.15,0.00,1.00,4.80,-0.00 +-153.60,-19.20,0.88,0.00,1.00,4.80,-4.80 +28.80,24.00,15.12,0.00,1.00,4.80,-4.80 +-144.00,-24.00,0.90,0.00,1.00,4.80,-4.80 +38.40,28.80,15.10,0.00,1.00,4.80,-4.80 +-134.40,-28.80,0.92,0.00,1.00,4.80,-4.80 +48.00,33.60,15.08,0.00,1.00,9.60,-4.80 +-124.80,-33.60,0.94,0.00,1.00,9.60,-4.80 +62.40,38.40,15.06,0.00,1.00,9.60,-4.80 +-115.20,-38.40,0.96,0.00,1.00,14.40,-4.80 +72.00,38.40,15.04,0.00,1.00,19.20,-4.80 +-100.80,-38.40,0.98,0.00,1.00,28.80,-4.80 +86.40,38.40,15.02,0.00,1.00,52.80,-4.80 +-86.40,-38.40,1.00,0.00,1.00,105.60,-4.80 +96.00,38.40,15.00,0.00,1.00,139.20,-4.80 +-76.80,-38.40,1.03,0.00,1.00,158.40,-4.80 +110.40,38.40,14.97,0.00,1.00,163.20,-4.80 +-62.40,-38.40,1.05,0.00,1.00,168.00,-4.80 +120.00,33.60,14.95,0.00,1.00,168.00,-4.80 +-52.80,-33.60,1.07,0.00,1.00,172.80,-4.80 +134.40,33.60,14.93,0.00,1.00,172.80,-4.80 +-43.20,-28.80,1.09,0.00,1.00,172.80,-4.80 +144.00,28.80,14.91,0.00,1.00,172.80,-4.80 +-33.60,-24.00,1.11,0.00,1.00,177.60,-4.80 +148.80,24.00,14.89,0.00,1.00,177.60,-4.80 +-24.00,-19.20,1.13,0.00,1.00,177.60,-4.80 +158.40,14.40,14.87,0.00,1.00,177.60,-0.00 +-19.20,-14.40,1.15,0.00,1.00,177.60,-0.00 +168.00,9.60,14.85,0.00,1.00,177.60,-0.00 +-9.60,-9.60,1.17,0.00,1.00,177.60,-0.00 +172.80,4.80,14.83,0.00,1.00,177.60,-0.00 +-0.00,-0.00,1.20,0.00,1.00,177.60,-0.00 +-177.60,-0.00,14.80,0.00,1.00,-177.60,0.00 +4.80,4.80,1.22,0.00,1.00,-177.60,0.00 +-172.80,-9.60,14.78,0.00,1.00,-177.60,0.00 +14.40,9.60,1.24,0.00,1.00,-177.60,0.00 +-163.20,-14.40,14.76,0.00,1.00,-177.60,0.00 +19.20,14.40,1.26,0.00,1.00,-177.60,0.00 +-153.60,-19.20,14.74,0.00,1.00,-177.60,4.80 +28.80,24.00,1.28,0.00,1.00,-177.60,4.80 +-148.80,-24.00,14.72,0.00,1.00,-177.60,4.80 +38.40,28.80,1.30,0.00,1.00,-172.80,4.80 +-139.20,-28.80,14.70,0.00,1.00,-172.80,4.80 +48.00,33.60,1.32,0.00,1.00,-172.80,4.80 +-124.80,-33.60,14.68,0.00,1.00,-172.80,4.80 +57.60,33.60,1.35,0.00,1.00,-168.00,4.80 +-115.20,-38.40,14.65,0.00,1.00,-168.00,4.80 +72.00,38.40,1.37,0.00,1.00,-163.20,4.80 +-105.60,-38.40,14.63,0.00,1.00,-158.40,4.80 +81.60,38.40,1.39,0.00,1.00,-139.20,4.80 +-91.20,-38.40,14.61,0.00,1.00,-105.60,4.80 +96.00,38.40,1.41,0.00,1.00,-52.80,4.80 +-76.80,-38.40,14.59,0.00,1.00,-28.80,4.80 +105.60,38.40,1.43,0.00,1.00,-19.20,4.80 +-67.20,-38.40,14.57,0.00,1.00,-14.40,4.80 +120.00,38.40,1.45,0.00,1.00,-9.60,4.80 +-57.60,-33.60,14.55,0.00,1.00,-9.60,4.80 +129.60,33.60,1.47,0.00,1.00,-9.60,4.80 +-43.20,-28.80,14.53,0.00,1.00,-4.80,4.80 +139.20,28.80,1.50,0.00,1.00,-4.80,4.80 +-33.60,-24.00,14.50,0.00,1.00,-4.80,4.80 +148.80,24.00,1.52,0.00,1.00,-4.80,4.80 +-28.80,-19.20,14.48,0.00,1.00,-4.80,4.80 +158.40,19.20,1.54,0.00,1.00,-4.80,0.00 +-19.20,-14.40,14.46,0.00,1.00,-0.00,0.00 +163.20,14.40,1.56,0.00,1.00,-0.00,0.00 +-9.60,-9.60,14.44,0.00,1.00,-0.00,0.00 +172.80,4.80,1.58,0.00,1.00,-0.00,0.00 +-4.80,-4.80,14.42,0.00,1.00,-0.00,0.00 +0.00,0.00,1.60,0.00,1.00,0.00,0.00 +-177.60,-4.80,14.40,0.00,1.00,0.00,-0.00 +9.60,4.80,1.62,0.00,1.00,0.00,-0.00 +-168.00,-9.60,14.38,0.00,1.00,4.80,-0.00 +14.40,9.60,1.64,0.00,1.00,4.80,-4.80 +-158.40,-14.40,14.36,0.00,1.00,4.80,-4.80 +24.00,14.40,1.67,0.00,1.00,4.80,-4.80 +-153.60,-19.20,14.33,0.00,1.00,4.80,-4.80 +33.60,19.20,1.69,0.00,1.00,9.60,-4.80 +-144.00,-24.00,14.31,0.00,1.00,9.60,-4.80 +43.20,24.00,1.71,0.00,1.00,9.60,-4.80 +-134.40,-28.80,14.29,0.00,1.00,14.40,-9.60 +52.80,28.80,1.73,0.00,1.00,14.40,-9.60 +-124.80,-28.80,14.27,0.00,1.00,19.20,-9.60 +62.40,33.60,1.75,0.00,1.00,24.00,-9.60 +-110.40,-33.60,14.25,0.00,1.00,28.80,-9.60 +72.00,33.60,1.77,0.00,1.00,33.60,-9.60 +-100.80,-33.60,14.23,0.00,1.00,48.00,-9.60 +86.40,33.60,1.79,0.00,1.00,67.20,-9.60 +-86.40,-33.60,14.21,0.00,1.00,96.00,-9.60 +96.00,33.60,1.82,0.00,1.00,120.00,-9.60 +-76.80,-33.60,14.18,0.00,1.00,139.20,-9.60 +110.40,33.60,1.84,0.00,1.00,148.80,-9.60 +-67.20,-33.60,14.16,0.00,1.00,153.60,-9.60 +120.00,33.60,1.86,0.00,1.00,158.40,-9.60 +-52.80,-28.80,14.14,0.00,1.00,163.20,-9.60 +129.60,28.80,1.88,0.00,1.00,168.00,-9.60 +-43.20,-28.80,14.12,0.00,1.00,168.00,-9.60 +139.20,24.00,1.90,0.00,1.00,168.00,-4.80 +-33.60,-24.00,14.10,0.00,1.00,172.80,-4.80 +148.80,19.20,1.92,0.00,1.00,172.80,-4.80 +-24.00,-19.20,14.08,0.00,1.00,172.80,-4.80 +158.40,14.40,1.94,0.00,1.00,177.60,-4.80 +-19.20,-14.40,14.06,0.00,1.00,177.60,-4.80 +168.00,9.60,1.97,0.00,1.00,177.60,-4.80 +-9.60,-4.80,14.03,0.00,1.00,177.60,-0.00 +172.80,4.80,1.99,0.00,1.00,177.60,-0.00 +-0.00,-0.00,14.01,0.00,1.00,177.60,-0.00 +-177.60,-0.00,2.01,0.00,1.00,-177.60,0.00 +4.80,4.80,13.99,0.00,1.00,-177.60,0.00 +-168.00,-4.80,2.03,0.00,1.00,-177.60,0.00 +14.40,9.60,13.97,0.00,1.00,-177.60,4.80 +-163.20,-14.40,2.05,0.00,1.00,-177.60,4.80 +24.00,14.40,13.95,0.00,1.00,-177.60,4.80 +-153.60,-19.20,2.07,0.00,1.00,-172.80,4.80 +28.80,19.20,13.93,0.00,1.00,-172.80,4.80 +-144.00,-24.00,2.09,0.00,1.00,-172.80,4.80 +38.40,24.00,13.91,0.00,1.00,-168.00,4.80 +-134.40,-28.80,2.11,0.00,1.00,-168.00,9.60 +48.00,28.80,13.89,0.00,1.00,-168.00,9.60 +-124.80,-28.80,2.14,0.00,1.00,-163.20,9.60 +62.40,33.60,13.86,0.00,1.00,-158.40,9.60 +-115.20,-33.60,2.16,0.00,1.00,-153.60,9.60 +72.00,33.60,13.84,0.00,1.00,-148.80,9.60 +-100.80,-33.60,2.18,0.00,1.00,-139.20,9.60 +81.60,33.60,13.82,0.00,1.00,-120.00,9.60 +-91.20,-33.60,2.20,0.00,1.00,-96.00,9.60 +96.00,33.60,13.80,0.00,1.00,-67.20,9.60 +-81.60,-33.60,2.22,0.00,1.00,-48.00,9.60 +105.60,33.60,13.78,0.00,1.00,-33.60,9.60 +-67.20,-33.60,2.24,0.00,1.00,-28.80,9.60 +115.20,33.60,13.76,0.00,1.00,-24.00,9.60 +-57.60,-28.80,2.26,0.00,1.00,-19.20,9.60 +129.60,28.80,13.74,0.00,1.00,-14.40,9.60 +-48.00,-28.80,2.29,0.00,1.00,-14.40,9.60 +139.20,24.00,13.71,0.00,1.00,-9.60,4.80 +-38.40,-24.00,2.31,0.00,1.00,-9.60,4.80 +148.80,19.20,13.69,0.00,1.00,-9.60,4.80 +-28.80,-19.20,2.33,0.00,1.00,-4.80,4.80 +153.60,14.40,13.67,0.00,1.00,-4.80,4.80 +-19.20,-14.40,2.35,0.00,1.00,-4.80,4.80 +163.20,9.60,13.65,0.00,1.00,-4.80,4.80 +-9.60,-9.60,2.37,0.00,1.00,-4.80,0.00 +172.80,4.80,13.63,0.00,1.00,-0.00,0.00 +-4.80,-4.80,2.39,0.00,1.00,-0.00,0.00 +0.00,0.00,13.61,0.00,1.00,0.00,0.00 +-177.60,-4.80,2.41,0.00,1.00,0.00,-0.00 +9.60,4.80,13.59,0.00,1.00,4.80,-0.00 +-168.00,-9.60,2.44,0.00,1.00,4.80,-4.80 +14.40,9.60,13.56,0.00,1.00,4.80,-4.80 +-158.40,-9.60,2.46,0.00,1.00,4.80,-4.80 +24.00,14.40,13.54,0.00,1.00,9.60,-4.80 +-148.80,-14.40,2.48,0.00,1.00,9.60,-9.60 +33.60,19.20,13.52,0.00,1.00,9.60,-9.60 +-139.20,-19.20,2.50,0.00,1.00,14.40,-9.60 +43.20,24.00,13.50,0.00,1.00,14.40,-9.60 +-129.60,-24.00,2.52,0.00,1.00,19.20,-9.60 +52.80,24.00,13.48,0.00,1.00,19.20,-14.40 +-120.00,-28.80,2.54,0.00,1.00,24.00,-14.40 +62.40,28.80,13.46,0.00,1.00,28.80,-14.40 +-110.40,-28.80,2.56,0.00,1.00,38.40,-14.40 +76.80,28.80,13.44,0.00,1.00,48.00,-14.40 +-100.80,-28.80,2.58,0.00,1.00,57.60,-14.40 +86.40,28.80,13.42,0.00,1.00,76.80,-14.40 +-86.40,-28.80,2.61,0.00,1.00,96.00,-14.40 +96.00,28.80,13.39,0.00,1.00,115.20,-14.40 +-76.80,-28.80,2.63,0.00,1.00,129.60,-14.40 +105.60,28.80,13.37,0.00,1.00,139.20,-14.40 +-67.20,-28.80,2.65,0.00,1.00,144.00,-14.40 +120.00,28.80,13.35,0.00,1.00,153.60,-14.40 +-57.60,-24.00,2.67,0.00,1.00,158.40,-14.40 +129.60,24.00,13.33,0.00,1.00,158.40,-9.60 +-48.00,-24.00,2.69,0.00,1.00,163.20,-9.60 +139.20,19.20,13.31,0.00,1.00,168.00,-9.60 +-38.40,-19.20,2.71,0.00,1.00,168.00,-9.60 +148.80,19.20,13.29,0.00,1.00,168.00,-9.60 +-28.80,-14.40,2.73,0.00,1.00,172.80,-9.60 +158.40,14.40,13.27,0.00,1.00,172.80,-4.80 +-19.20,-9.60,2.76,0.00,1.00,172.80,-4.80 +163.20,9.60,13.24,0.00,1.00,177.60,-4.80 +-9.60,-4.80,2.78,0.00,1.00,177.60,-4.80 +172.80,4.80,13.22,0.00,1.00,177.60,-0.00 +-0.00,-0.00,2.80,0.00,1.00,177.60,-0.00 +-177.60,-0.00,13.20,0.00,1.00,-177.60,0.00 +4.80,4.80,2.82,0.00,1.00,-177.60,0.00 +-168.00,-4.80,13.18,0.00,1.00,-177.60,4.80 +14.40,9.60,2.84,0.00,1.00,-177.60,4.80 +-163.20,-9.60,13.16,0.00,1.00,-172.80,4.80 +24.00,14.40,2.86,0.00,1.00,-172.80,4.80 +-153.60,-14.40,13.14,0.00,1.00,-172.80,9.60 +33.60,19.20,2.88,0.00,1.00,-168.00,9.60 +-144.00,-19.20,13.12,0.00,1.00,-168.00,9.60 +43.20,19.20,2.91,0.00,1.00,-168.00,9.60 +-134.40,-24.00,13.09,0.00,1.00,-163.20,9.60 +52.80,24.00,2.93,0.00,1.00,-158.40,9.60 +-124.80,-24.00,13.07,0.00,1.00,-158.40,14.40 +62.40,28.80,2.95,0.00,1.00,-153.60,14.40 +-115.20,-28.80,13.05,0.00,1.00,-144.00,14.40 +72.00,28.80,2.97,0.00,1.00,-139.20,14.40 +-100.80,-28.80,13.03,0.00,1.00,-129.60,14.40 +81.60,28.80,2.99,0.00,1.00,-115.20,14.40 +-91.20,-28.80,13.01,0.00,1.00,-96.00,14.40 +96.00,28.80,3.01,0.00,1.00,-76.80,14.40 +-81.60,-28.80,12.99,0.00,1.00,-57.60,14.40 +105.60,28.80,3.03,0.00,1.00,-48.00,14.40 +-67.20,-28.80,12.97,0.00,1.00,-38.40,14.40 +115.20,28.80,3.05,0.00,1.00,-28.80,14.40 +-57.60,-28.80,12.95,0.00,1.00,-24.00,14.40 +124.80,24.00,3.08,0.00,1.00,-19.20,14.40 +-48.00,-24.00,12.92,0.00,1.00,-19.20,9.60 +134.40,24.00,3.10,0.00,1.00,-14.40,9.60 +-38.40,-19.20,12.90,0.00,1.00,-14.40,9.60 +144.00,19.20,3.12,0.00,1.00,-9.60,9.60 +-28.80,-14.40,12.88,0.00,1.00,-9.60,9.60 +153.60,14.40,3.14,0.00,1.00,-9.60,4.80 +-19.20,-9.60,12.86,0.00,1.00,-4.80,4.80 +163.20,9.60,3.16,0.00,1.00,-4.80,4.80 +-14.40,-9.60,12.84,0.00,1.00,-4.80,4.80 +172.80,4.80,3.18,0.00,1.00,-4.80,0.00 +-4.80,-4.80,12.82,0.00,1.00,-0.00,0.00 +0.00,0.00,3.20,0.00,1.00,0.00,0.00 +-177.60,-0.00,12.80,0.00,1.00,0.00,-0.00 +9.60,4.80,3.23,0.00,1.00,4.80,-4.80 +-168.00,-4.80,12.77,0.00,1.00,4.80,-4.80 +19.20,9.60,3.25,0.00,1.00,4.80,-4.80 +-158.40,-9.60,12.75,0.00,1.00,9.60,-9.60 +24.00,14.40,3.27,0.00,1.00,9.60,-9.60 +-148.80,-14.40,12.73,0.00,1.00,14.40,-9.60 +33.60,14.40,3.29,0.00,1.00,14.40,-9.60 +-139.20,-19.20,12.71,0.00,1.00,19.20,-14.40 +43.20,19.20,3.31,0.00,1.00,19.20,-14.40 +-129.60,-19.20,12.69,0.00,1.00,24.00,-14.40 +52.80,19.20,3.33,0.00,1.00,28.80,-14.40 +-120.00,-24.00,12.67,0.00,1.00,33.60,-19.20 +67.20,24.00,3.35,0.00,1.00,38.40,-19.20 +-110.40,-24.00,12.65,0.00,1.00,43.20,-19.20 +76.80,24.00,3.38,0.00,1.00,52.80,-19.20 +-100.80,-24.00,12.62,0.00,1.00,67.20,-19.20 +86.40,24.00,3.40,0.00,1.00,76.80,-19.20 +-86.40,-24.00,12.60,0.00,1.00,96.00,-19.20 +96.00,24.00,3.42,0.00,1.00,105.60,-19.20 +-76.80,-24.00,12.58,0.00,1.00,120.00,-19.20 +105.60,24.00,3.44,0.00,1.00,129.60,-19.20 +-67.20,-24.00,12.56,0.00,1.00,139.20,-19.20 +115.20,24.00,3.46,0.00,1.00,144.00,-19.20 +-57.60,-24.00,12.54,0.00,1.00,148.80,-14.40 +129.60,19.20,3.48,0.00,1.00,153.60,-14.40 +-48.00,-19.20,12.52,0.00,1.00,158.40,-14.40 +139.20,19.20,3.50,0.00,1.00,163.20,-14.40 +-38.40,-14.40,12.50,0.00,1.00,163.20,-14.40 +148.80,14.40,3.52,0.00,1.00,168.00,-9.60 +-28.80,-14.40,12.48,0.00,1.00,168.00,-9.60 +153.60,9.60,3.55,0.00,1.00,172.80,-9.60 +-19.20,-9.60,12.45,0.00,1.00,172.80,-4.80 +163.20,9.60,3.57,0.00,1.00,172.80,-4.80 +-9.60,-4.80,12.43,0.00,1.00,177.60,-4.80 +172.80,4.80,3.59,0.00,1.00,177.60,-0.00 +-0.00,-0.00,12.41,0.00,1.00,177.60,-0.00 +-177.60,-0.00,3.61,0.00,1.00,-177.60,0.00 +4.80,4.80,12.39,0.00,1.00,-177.60,0.00 +-168.00,-4.80,3.63,0.00,1.00,-177.60,4.80 +14.40,9.60,12.37,0.00,1.00,-172.80,4.80 +-158.40,-9.60,3.65,0.00,1.00,-172.80,4.80 +24.00,9.60,12.35,0.00,1.00,-172.80,9.60 +-153.60,-14.40,3.67,0.00,1.00,-168.00,9.60 +33.60,14.40,12.33,0.00,1.00,-168.00,9.60 +-144.00,-14.40,3.70,0.00,1.00,-163.20,14.40 +43.20,19.20,12.30,0.00,1.00,-163.20,14.40 +-134.40,-19.20,3.72,0.00,1.00,-158.40,14.40 +52.80,19.20,12.28,0.00,1.00,-153.60,14.40 +-124.80,-24.00,3.74,0.00,1.00,-148.80,14.40 +62.40,24.00,12.26,0.00,1.00,-144.00,19.20 +-110.40,-24.00,3.76,0.00,1.00,-139.20,19.20 +72.00,24.00,12.24,0.00,1.00,-129.60,19.20 +-100.80,-24.00,3.78,0.00,1.00,-120.00,19.20 +81.60,24.00,12.22,0.00,1.00,-105.60,19.20 +-91.20,-24.00,3.80,0.00,1.00,-96.00,19.20 +96.00,24.00,12.20,0.00,1.00,-76.80,19.20 +-81.60,-24.00,3.82,0.00,1.00,-67.20,19.20 +105.60,24.00,12.18,0.00,1.00,-52.80,19.20 +-72.00,-24.00,3.85,0.00,1.00,-43.20,19.20 +115.20,24.00,12.15,0.00,1.00,-38.40,19.20 +-57.60,-24.00,3.87,0.00,1.00,-33.60,19.20 +124.80,19.20,12.13,0.00,1.00,-28.80,14.40 +-48.00,-19.20,3.89,0.00,1.00,-24.00,14.40 +134.40,19.20,12.11,0.00,1.00,-19.20,14.40 +-38.40,-19.20,3.91,0.00,1.00,-19.20,14.40 +144.00,14.40,12.09,0.00,1.00,-14.40,9.60 +-28.80,-14.40,3.93,0.00,1.00,-14.40,9.60 +153.60,14.40,12.07,0.00,1.00,-9.60,9.60 +-24.00,-9.60,3.95,0.00,1.00,-9.60,9.60 +163.20,9.60,12.05,0.00,1.00,-4.80,4.80 +-14.40,-4.80,3.97,0.00,1.00,-4.80,4.80 +172.80,4.80,12.03,0.00,1.00,-4.80,4.80 +-4.80,-0.00,3.99,0.00,1.00,-0.00,0.00 +0.00,0.00,12.01,0.00,1.00,0.00,0.00 +-177.60,-0.00,4.02,0.00,1.00,0.00,-0.00 +9.60,4.80,11.98,0.00,1.00,4.80,-4.80 +-168.00,-4.80,4.04,0.00,1.00,4.80,-4.80 +19.20,4.80,11.96,0.00,1.00,9.60,-9.60 +-158.40,-9.60,4.06,0.00,1.00,9.60,-9.60 +28.80,9.60,11.94,0.00,1.00,14.40,-9.60 +-148.80,-9.60,4.08,0.00,1.00,14.40,-14.40 +38.40,14.40,11.92,0.00,1.00,19.20,-14.40 +-139.20,-14.40,4.10,0.00,1.00,19.20,-14.40 +48.00,14.40,11.90,0.00,1.00,24.00,-19.20 +-129.60,-14.40,4.12,0.00,1.00,28.80,-19.20 +57.60,19.20,11.88,0.00,1.00,33.60,-19.20 +-120.00,-19.20,4.14,0.00,1.00,38.40,-19.20 +67.20,19.20,11.86,0.00,1.00,43.20,-24.00 +-110.40,-19.20,4.17,0.00,1.00,52.80,-24.00 +76.80,19.20,11.83,0.00,1.00,62.40,-24.00 +-100.80,-19.20,4.19,0.00,1.00,72.00,-24.00 +86.40,19.20,11.81,0.00,1.00,81.60,-24.00 +-86.40,-19.20,4.21,0.00,1.00,91.20,-24.00 +96.00,19.20,11.79,0.00,1.00,105.60,-24.00 +-76.80,-19.20,4.23,0.00,1.00,115.20,-24.00 +105.60,19.20,11.77,0.00,1.00,124.80,-24.00 +-67.20,-19.20,4.25,0.00,1.00,134.40,-24.00 +115.20,19.20,11.75,0.00,1.00,139.20,-19.20 +-57.60,-19.20,4.27,0.00,1.00,144.00,-19.20 +124.80,19.20,11.73,0.00,1.00,148.80,-19.20 +-48.00,-14.40,4.29,0.00,1.00,153.60,-19.20 +134.40,14.40,11.71,0.00,1.00,158.40,-19.20 +-38.40,-14.40,4.32,0.00,1.00,158.40,-14.40 +144.00,14.40,11.68,0.00,1.00,163.20,-14.40 +-28.80,-9.60,4.34,0.00,1.00,168.00,-14.40 +153.60,9.60,11.66,0.00,1.00,168.00,-9.60 +-19.20,-9.60,4.36,0.00,1.00,172.80,-9.60 +163.20,4.80,11.64,0.00,1.00,172.80,-4.80 +-9.60,-4.80,4.38,0.00,1.00,172.80,-4.80 +172.80,4.80,11.62,0.00,1.00,177.60,-4.80 +-0.00,-0.00,4.40,0.00,1.00,177.60,-0.00 +-177.60,-0.00,11.60,0.00,1.00,-177.60,0.00 +4.80,4.80,4.42,0.00,1.00,-177.60,4.80 +-168.00,-4.80,11.58,0.00,1.00,-172.80,4.80 +14.40,4.80,4.44,0.00,1.00,-172.80,4.80 +-158.40,-9.60,11.56,0.00,1.00,-172.80,9.60 +24.00,9.60,4.46,0.00,1.00,-168.00,9.60 +-148.80,-9.60,11.54,0.00,1.00,-168.00,14.40 +33.60,14.40,4.49,0.00,1.00,-163.20,14.40 +-139.20,-14.40,11.51,0.00,1.00,-158.40,14.40 +43.20,14.40,4.51,0.00,1.00,-158.40,19.20 +-129.60,-14.40,11.49,0.00,1.00,-153.60,19.20 +52.80,19.20,4.53,0.00,1.00,-148.80,19.20 +-120.00,-19.20,11.47,0.00,1.00,-144.00,19.20 +62.40,19.20,4.55,0.00,1.00,-139.20,19.20 +-110.40,-19.20,11.45,0.00,1.00,-134.40,24.00 +72.00,19.20,4.57,0.00,1.00,-124.80,24.00 +-100.80,-19.20,11.43,0.00,1.00,-115.20,24.00 +81.60,19.20,4.59,0.00,1.00,-105.60,24.00 +-91.20,-19.20,11.41,0.00,1.00,-91.20,24.00 +96.00,19.20,4.61,0.00,1.00,-81.60,24.00 +-81.60,-19.20,11.39,0.00,1.00,-72.00,24.00 +105.60,19.20,4.64,0.00,1.00,-62.40,24.00 +-72.00,-19.20,11.36,0.00,1.00,-52.80,24.00 +115.20,19.20,4.66,0.00,1.00,-43.20,24.00 +-62.40,-19.20,11.34,0.00,1.00,-38.40,19.20 +124.80,19.20,4.68,0.00,1.00,-33.60,19.20 +-52.80,-14.40,11.32,0.00,1.00,-28.80,19.20 +134.40,14.40,4.70,0.00,1.00,-24.00,19.20 +-43.20,-14.40,11.30,0.00,1.00,-19.20,14.40 +144.00,14.40,4.72,0.00,1.00,-19.20,14.40 +-33.60,-9.60,11.28,0.00,1.00,-14.40,14.40 +153.60,9.60,4.74,0.00,1.00,-14.40,9.60 +-24.00,-9.60,11.26,0.00,1.00,-9.60,9.60 +163.20,4.80,4.76,0.00,1.00,-9.60,9.60 +-14.40,-4.80,11.24,0.00,1.00,-4.80,4.80 +172.80,4.80,4.79,0.00,1.00,-4.80,4.80 +-4.80,-0.00,11.21,0.00,1.00,-0.00,0.00 +0.00,0.00,4.81,0.00,1.00,0.00,0.00 +-177.60,-0.00,11.19,0.00,1.00,0.00,-0.00 +9.60,4.80,4.83,0.00,1.00,4.80,-4.80 +-168.00,-4.80,11.17,0.00,1.00,4.80,-4.80 +19.20,4.80,4.85,0.00,1.00,9.60,-9.60 +-158.40,-4.80,11.15,0.00,1.00,14.40,-9.60 +28.80,9.60,4.87,0.00,1.00,14.40,-14.40 +-148.80,-9.60,11.13,0.00,1.00,19.20,-14.40 +38.40,9.60,4.89,0.00,1.00,19.20,-19.20 +-139.20,-9.60,11.11,0.00,1.00,24.00,-19.20 +48.00,9.60,4.91,0.00,1.00,28.80,-19.20 +-129.60,-14.40,11.09,0.00,1.00,33.60,-24.00 +57.60,14.40,4.93,0.00,1.00,38.40,-24.00 +-120.00,-14.40,11.07,0.00,1.00,43.20,-24.00 +67.20,14.40,4.96,0.00,1.00,48.00,-24.00 +-110.40,-14.40,11.04,0.00,1.00,57.60,-28.80 +76.80,14.40,4.98,0.00,1.00,62.40,-28.80 +-100.80,-14.40,11.02,0.00,1.00,72.00,-28.80 +86.40,14.40,5.00,0.00,1.00,81.60,-28.80 +-86.40,-14.40,11.00,0.00,1.00,91.20,-28.80 +96.00,14.40,5.02,0.00,1.00,100.80,-28.80 +-76.80,-14.40,10.98,0.00,1.00,110.40,-28.80 +105.60,14.40,5.04,0.00,1.00,120.00,-28.80 +-67.20,-14.40,10.96,0.00,1.00,129.60,-28.80 +115.20,14.40,5.06,0.00,1.00,134.40,-24.00 +-57.60,-14.40,10.94,0.00,1.00,139.20,-24.00 +124.80,14.40,5.08,0.00,1.00,144.00,-24.00 +-48.00,-14.40,10.92,0.00,1.00,148.80,-24.00 +134.40,9.60,5.11,0.00,1.00,153.60,-19.20 +-38.40,-9.60,10.89,0.00,1.00,158.40,-19.20 +144.00,9.60,5.13,0.00,1.00,158.40,-14.40 +-28.80,-9.60,10.87,0.00,1.00,163.20,-14.40 +153.60,4.80,5.15,0.00,1.00,168.00,-14.40 +-19.20,-4.80,10.85,0.00,1.00,168.00,-9.60 +163.20,4.80,5.17,0.00,1.00,172.80,-9.60 +-9.60,-4.80,10.83,0.00,1.00,172.80,-4.80 +172.80,0.00,5.19,0.00,1.00,177.60,-4.80 +-0.00,-0.00,10.81,0.00,1.00,177.60,-0.00 +-177.60,-0.00,5.21,0.00,1.00,-177.60,0.00 +4.80,0.00,10.79,0.00,1.00,-177.60,4.80 +-168.00,-4.80,5.23,0.00,1.00,-172.80,4.80 +14.40,4.80,10.77,0.00,1.00,-172.80,9.60 +-158.40,-4.80,5.26,0.00,1.00,-168.00,9.60 +24.00,4.80,10.74,0.00,1.00,-168.00,14.40 +-148.80,-9.60,5.28,0.00,1.00,-163.20,14.40 +33.60,9.60,10.72,0.00,1.00,-158.40,14.40 +-139.20,-9.60,5.30,0.00,1.00,-158.40,19.20 +43.20,9.60,10.70,0.00,1.00,-153.60,19.20 +-129.60,-14.40,5.32,0.00,1.00,-148.80,24.00 +52.80,14.40,10.68,0.00,1.00,-144.00,24.00 +-120.00,-14.40,5.34,0.00,1.00,-139.20,24.00 +62.40,14.40,10.66,0.00,1.00,-134.40,24.00 +-110.40,-14.40,5.36,0.00,1.00,-129.60,28.80 +72.00,14.40,10.64,0.00,1.00,-120.00,28.80 +-100.80,-14.40,5.38,0.00,1.00,-110.40,28.80 +81.60,14.40,10.62,0.00,1.00,-100.80,28.80 +-91.20,-14.40,5.40,0.00,1.00,-91.20,28.80 +96.00,14.40,10.60,0.00,1.00,-81.60,28.80 +-81.60,-14.40,5.43,0.00,1.00,-72.00,28.80 +105.60,14.40,10.57,0.00,1.00,-62.40,28.80 +-72.00,-14.40,5.45,0.00,1.00,-57.60,28.80 +115.20,14.40,10.55,0.00,1.00,-48.00,24.00 +-62.40,-14.40,5.47,0.00,1.00,-43.20,24.00 +124.80,14.40,10.53,0.00,1.00,-38.40,24.00 +-52.80,-14.40,5.49,0.00,1.00,-33.60,24.00 +134.40,9.60,10.51,0.00,1.00,-28.80,19.20 +-43.20,-9.60,5.51,0.00,1.00,-24.00,19.20 +144.00,9.60,10.49,0.00,1.00,-19.20,19.20 +-33.60,-9.60,5.53,0.00,1.00,-19.20,14.40 +153.60,9.60,10.47,0.00,1.00,-14.40,14.40 +-24.00,-4.80,5.55,0.00,1.00,-14.40,9.60 +163.20,4.80,10.45,0.00,1.00,-9.60,9.60 +-14.40,-4.80,5.58,0.00,1.00,-4.80,4.80 +172.80,4.80,10.42,0.00,1.00,-4.80,4.80 +-4.80,-0.00,5.60,0.00,1.00,-0.00,0.00 +0.00,0.00,10.40,0.00,1.00,0.00,0.00 +-177.60,-0.00,5.62,0.00,1.00,4.80,-4.80 +9.60,0.00,10.38,0.00,1.00,4.80,-4.80 +-168.00,-4.80,5.64,0.00,1.00,9.60,-9.60 +19.20,4.80,10.36,0.00,1.00,9.60,-9.60 +-158.40,-4.80,5.66,0.00,1.00,14.40,-14.40 +28.80,4.80,10.34,0.00,1.00,19.20,-14.40 +-148.80,-4.80,5.68,0.00,1.00,19.20,-19.20 +38.40,4.80,10.32,0.00,1.00,24.00,-19.20 +-139.20,-9.60,5.70,0.00,1.00,28.80,-24.00 +48.00,9.60,10.30,0.00,1.00,33.60,-24.00 +-129.60,-9.60,5.72,0.00,1.00,38.40,-24.00 +57.60,9.60,10.28,0.00,1.00,43.20,-28.80 +-120.00,-9.60,5.75,0.00,1.00,48.00,-28.80 +67.20,9.60,10.25,0.00,1.00,52.80,-28.80 +-110.40,-9.60,5.77,0.00,1.00,57.60,-33.60 +76.80,9.60,10.23,0.00,1.00,67.20,-33.60 +-100.80,-9.60,5.79,0.00,1.00,76.80,-33.60 +86.40,9.60,10.21,0.00,1.00,81.60,-33.60 +-86.40,-9.60,5.81,0.00,1.00,91.20,-33.60 +96.00,9.60,10.19,0.00,1.00,100.80,-33.60 +-76.80,-9.60,5.83,0.00,1.00,110.40,-33.60 +105.60,9.60,10.17,0.00,1.00,115.20,-33.60 +-67.20,-9.60,5.85,0.00,1.00,124.80,-33.60 +115.20,9.60,10.15,0.00,1.00,129.60,-28.80 +-57.60,-9.60,5.87,0.00,1.00,134.40,-28.80 +124.80,9.60,10.13,0.00,1.00,139.20,-28.80 +-48.00,-9.60,5.90,0.00,1.00,144.00,-24.00 +134.40,9.60,10.10,0.00,1.00,148.80,-24.00 +-38.40,-9.60,5.92,0.00,1.00,153.60,-19.20 +144.00,4.80,10.08,0.00,1.00,158.40,-19.20 +-28.80,-4.80,5.94,0.00,1.00,163.20,-14.40 +153.60,4.80,10.06,0.00,1.00,163.20,-14.40 +-19.20,-4.80,5.96,0.00,1.00,168.00,-9.60 +163.20,4.80,10.04,0.00,1.00,172.80,-9.60 +-9.60,-0.00,5.98,0.00,1.00,172.80,-4.80 +172.80,0.00,10.02,0.00,1.00,177.60,-4.80 +-0.00,-0.00,6.00,0.00,1.00,177.60,-0.00 +-177.60,-0.00,10.00,0.00,1.00,-177.60,0.00 +4.80,0.00,6.02,0.00,1.00,-177.60,4.80 +-168.00,-0.00,9.98,0.00,1.00,-172.80,4.80 +14.40,4.80,6.05,0.00,1.00,-172.80,9.60 +-158.40,-4.80,9.95,0.00,1.00,-168.00,9.60 +24.00,4.80,6.07,0.00,1.00,-163.20,14.40 +-148.80,-4.80,9.93,0.00,1.00,-163.20,14.40 +33.60,4.80,6.09,0.00,1.00,-158.40,19.20 +-139.20,-9.60,9.91,0.00,1.00,-153.60,19.20 +43.20,9.60,6.11,0.00,1.00,-148.80,24.00 +-129.60,-9.60,9.89,0.00,1.00,-144.00,24.00 +52.80,9.60,6.13,0.00,1.00,-139.20,28.80 +-120.00,-9.60,9.87,0.00,1.00,-134.40,28.80 +62.40,9.60,6.15,0.00,1.00,-129.60,28.80 +-110.40,-9.60,9.85,0.00,1.00,-124.80,33.60 +72.00,9.60,6.17,0.00,1.00,-115.20,33.60 +-100.80,-9.60,9.83,0.00,1.00,-110.40,33.60 +81.60,9.60,6.19,0.00,1.00,-100.80,33.60 +-91.20,-9.60,9.81,0.00,1.00,-91.20,33.60 +96.00,9.60,6.22,0.00,1.00,-81.60,33.60 +-81.60,-9.60,9.78,0.00,1.00,-76.80,33.60 +105.60,9.60,6.24,0.00,1.00,-67.20,33.60 +-72.00,-9.60,9.76,0.00,1.00,-57.60,33.60 +115.20,9.60,6.26,0.00,1.00,-52.80,28.80 +-62.40,-9.60,9.74,0.00,1.00,-48.00,28.80 +124.80,9.60,6.28,0.00,1.00,-43.20,28.80 +-52.80,-9.60,9.72,0.00,1.00,-38.40,24.00 +134.40,9.60,6.30,0.00,1.00,-33.60,24.00 +-43.20,-9.60,9.70,0.00,1.00,-28.80,24.00 +144.00,4.80,6.32,0.00,1.00,-24.00,19.20 +-33.60,-4.80,9.68,0.00,1.00,-19.20,19.20 +153.60,4.80,6.34,0.00,1.00,-19.20,14.40 +-24.00,-4.80,9.66,0.00,1.00,-14.40,14.40 +163.20,4.80,6.37,0.00,1.00,-9.60,9.60 +-14.40,-4.80,9.63,0.00,1.00,-9.60,9.60 +172.80,0.00,6.39,0.00,1.00,-4.80,4.80 +-4.80,-0.00,9.61,0.00,1.00,-4.80,4.80 +0.00,0.00,6.41,0.00,1.00,0.00,0.00 +-177.60,-0.00,9.59,0.00,1.00,4.80,-4.80 +9.60,0.00,6.43,0.00,1.00,4.80,-4.80 +-168.00,-0.00,9.57,0.00,1.00,9.60,-9.60 +19.20,0.00,6.45,0.00,1.00,14.40,-9.60 +-158.40,-4.80,9.55,0.00,1.00,14.40,-14.40 +28.80,4.80,6.47,0.00,1.00,19.20,-19.20 +-148.80,-4.80,9.53,0.00,1.00,24.00,-19.20 +38.40,4.80,6.49,0.00,1.00,24.00,-24.00 +-139.20,-4.80,9.51,0.00,1.00,28.80,-24.00 +48.00,4.80,6.52,0.00,1.00,33.60,-28.80 +-129.60,-4.80,9.48,0.00,1.00,38.40,-28.80 +57.60,4.80,6.54,0.00,1.00,43.20,-33.60 +-120.00,-4.80,9.46,0.00,1.00,48.00,-33.60 +67.20,4.80,6.56,0.00,1.00,57.60,-33.60 +-110.40,-4.80,9.44,0.00,1.00,62.40,-38.40 +76.80,4.80,6.58,0.00,1.00,67.20,-38.40 +-100.80,-4.80,9.42,0.00,1.00,76.80,-38.40 +86.40,4.80,6.60,0.00,1.00,86.40,-38.40 +-86.40,-4.80,9.40,0.00,1.00,91.20,-38.40 +96.00,4.80,6.62,0.00,1.00,100.80,-38.40 +-76.80,-4.80,9.38,0.00,1.00,105.60,-38.40 +105.60,4.80,6.64,0.00,1.00,115.20,-38.40 +-67.20,-4.80,9.36,0.00,1.00,120.00,-33.60 +115.20,4.80,6.66,0.00,1.00,124.80,-33.60 +-57.60,-4.80,9.34,0.00,1.00,134.40,-33.60 +124.80,4.80,6.69,0.00,1.00,139.20,-28.80 +-48.00,-4.80,9.31,0.00,1.00,144.00,-28.80 +134.40,4.80,6.71,0.00,1.00,148.80,-24.00 +-38.40,-4.80,9.29,0.00,1.00,153.60,-24.00 +144.00,4.80,6.73,0.00,1.00,153.60,-19.20 +-28.80,-4.80,9.27,0.00,1.00,158.40,-19.20 +153.60,4.80,6.75,0.00,1.00,163.20,-14.40 +-19.20,-4.80,9.25,0.00,1.00,168.00,-14.40 +163.20,0.00,6.77,0.00,1.00,168.00,-9.60 +-9.60,-0.00,9.23,0.00,1.00,172.80,-9.60 +172.80,0.00,6.79,0.00,1.00,177.60,-4.80 +-0.00,-0.00,9.21,0.00,1.00,177.60,-0.00 +-177.60,-0.00,6.81,0.00,1.00,-177.60,0.00 +4.80,0.00,9.19,0.00,1.00,-177.60,4.80 +-168.00,-0.00,6.84,0.00,1.00,-172.80,9.60 +14.40,0.00,9.16,0.00,1.00,-168.00,9.60 +-158.40,-4.80,6.86,0.00,1.00,-168.00,14.40 +24.00,4.80,9.14,0.00,1.00,-163.20,14.40 +-148.80,-4.80,6.88,0.00,1.00,-158.40,19.20 +33.60,4.80,9.12,0.00,1.00,-153.60,19.20 +-139.20,-4.80,6.90,0.00,1.00,-153.60,24.00 +43.20,4.80,9.10,0.00,1.00,-148.80,24.00 +-129.60,-4.80,6.92,0.00,1.00,-144.00,28.80 +52.80,4.80,9.08,0.00,1.00,-139.20,28.80 +-120.00,-4.80,6.94,0.00,1.00,-134.40,33.60 +62.40,4.80,9.06,0.00,1.00,-124.80,33.60 +-110.40,-4.80,6.96,0.00,1.00,-120.00,33.60 +72.00,4.80,9.04,0.00,1.00,-115.20,38.40 +-100.80,-4.80,6.99,0.00,1.00,-105.60,38.40 +81.60,4.80,9.01,0.00,1.00,-100.80,38.40 +-91.20,-4.80,7.01,0.00,1.00,-91.20,38.40 +96.00,4.80,8.99,0.00,1.00,-86.40,38.40 +-81.60,-4.80,7.03,0.00,1.00,-76.80,38.40 +105.60,4.80,8.97,0.00,1.00,-67.20,38.40 +-72.00,-4.80,7.05,0.00,1.00,-62.40,38.40 +115.20,4.80,8.95,0.00,1.00,-57.60,33.60 +-62.40,-4.80,7.07,0.00,1.00,-48.00,33.60 +124.80,4.80,8.93,0.00,1.00,-43.20,33.60 +-52.80,-4.80,7.09,0.00,1.00,-38.40,28.80 +134.40,4.80,8.91,0.00,1.00,-33.60,28.80 +-43.20,-4.80,7.11,0.00,1.00,-28.80,24.00 +144.00,4.80,8.89,0.00,1.00,-24.00,24.00 +-33.60,-4.80,7.13,0.00,1.00,-24.00,19.20 +153.60,4.80,8.87,0.00,1.00,-19.20,19.20 +-24.00,-4.80,7.16,0.00,1.00,-14.40,14.40 +163.20,0.00,8.84,0.00,1.00,-14.40,9.60 +-14.40,-0.00,7.18,0.00,1.00,-9.60,9.60 +172.80,0.00,8.82,0.00,1.00,-4.80,4.80 +-4.80,-0.00,7.20,0.00,1.00,-4.80,4.80 +0.00,0.00,8.80,0.00,1.00,0.00,0.00 +-177.60,-0.00,7.22,0.00,1.00,4.80,-4.80 +9.60,0.00,8.78,0.00,1.00,4.80,-4.80 +-168.00,-0.00,7.24,0.00,1.00,9.60,-9.60 +19.20,0.00,8.76,0.00,1.00,14.40,-14.40 +-158.40,-0.00,7.26,0.00,1.00,19.20,-14.40 +28.80,0.00,8.74,0.00,1.00,19.20,-19.20 +-148.80,-0.00,7.28,0.00,1.00,24.00,-24.00 +38.40,0.00,8.72,0.00,1.00,28.80,-24.00 +-139.20,-0.00,7.31,0.00,1.00,33.60,-28.80 +48.00,0.00,8.69,0.00,1.00,38.40,-28.80 +-129.60,-0.00,7.33,0.00,1.00,43.20,-33.60 +57.60,0.00,8.67,0.00,1.00,48.00,-33.60 +-120.00,-0.00,7.35,0.00,1.00,52.80,-38.40 +67.20,0.00,8.65,0.00,1.00,57.60,-38.40 +-110.40,-0.00,7.37,0.00,1.00,62.40,-38.40 +76.80,0.00,8.63,0.00,1.00,72.00,-43.20 +-100.80,-0.00,7.39,0.00,1.00,76.80,-43.20 +86.40,0.00,8.61,0.00,1.00,86.40,-43.20 +-86.40,-0.00,7.41,0.00,1.00,91.20,-43.20 +96.00,0.00,8.59,0.00,1.00,100.80,-43.20 +-76.80,-0.00,7.43,0.00,1.00,105.60,-43.20 +105.60,0.00,8.57,0.00,1.00,110.40,-43.20 +-67.20,-0.00,7.46,0.00,1.00,120.00,-38.40 +115.20,0.00,8.54,0.00,1.00,124.80,-38.40 +-57.60,-0.00,7.48,0.00,1.00,129.60,-38.40 +124.80,0.00,8.52,0.00,1.00,134.40,-33.60 +-48.00,-0.00,7.50,0.00,1.00,139.20,-33.60 +134.40,0.00,8.50,0.00,1.00,144.00,-28.80 +-38.40,-0.00,7.52,0.00,1.00,148.80,-28.80 +144.00,0.00,8.48,0.00,1.00,153.60,-24.00 +-28.80,-0.00,7.54,0.00,1.00,158.40,-19.20 +153.60,0.00,8.46,0.00,1.00,163.20,-19.20 +-19.20,-0.00,7.56,0.00,1.00,163.20,-14.40 +163.20,0.00,8.44,0.00,1.00,168.00,-9.60 +-9.60,-0.00,7.58,0.00,1.00,172.80,-9.60 +172.80,0.00,8.42,0.00,1.00,172.80,-4.80 +-0.00,-0.00,7.60,0.00,1.00,177.60,-0.00 +-177.60,-0.00,8.40,0.00,1.00,-177.60,0.00 +4.80,0.00,7.63,0.00,1.00,-172.80,4.80 +-168.00,-0.00,8.37,0.00,1.00,-172.80,9.60 +14.40,0.00,7.65,0.00,1.00,-168.00,9.60 +-158.40,-0.00,8.35,0.00,1.00,-163.20,14.40 +24.00,0.00,7.67,0.00,1.00,-163.20,19.20 +-148.80,-0.00,8.33,0.00,1.00,-158.40,19.20 +33.60,0.00,7.69,0.00,1.00,-153.60,24.00 +-139.20,-0.00,8.31,0.00,1.00,-148.80,28.80 +43.20,0.00,7.71,0.00,1.00,-144.00,28.80 +-129.60,-0.00,8.29,0.00,1.00,-139.20,33.60 +52.80,0.00,7.73,0.00,1.00,-134.40,33.60 +-120.00,-0.00,8.27,0.00,1.00,-129.60,38.40 +62.40,0.00,7.75,0.00,1.00,-124.80,38.40 +-110.40,-0.00,8.25,0.00,1.00,-120.00,38.40 +72.00,0.00,7.78,0.00,1.00,-110.40,43.20 +-100.80,-0.00,8.22,0.00,1.00,-105.60,43.20 +81.60,0.00,7.80,0.00,1.00,-100.80,43.20 +-91.20,-0.00,8.20,0.00,1.00,-91.20,43.20 +96.00,0.00,7.82,0.00,1.00,-86.40,43.20 +-81.60,-0.00,8.18,0.00,1.00,-76.80,43.20 +105.60,0.00,7.84,0.00,1.00,-72.00,43.20 +-72.00,-0.00,8.16,0.00,1.00,-62.40,38.40 +115.20,0.00,7.86,0.00,1.00,-57.60,38.40 +-62.40,-0.00,8.14,0.00,1.00,-52.80,38.40 +124.80,0.00,7.88,0.00,1.00,-48.00,33.60 +-52.80,-0.00,8.12,0.00,1.00,-43.20,33.60 +134.40,0.00,7.90,0.00,1.00,-38.40,28.80 +-43.20,-0.00,8.10,0.00,1.00,-33.60,28.80 +144.00,0.00,7.93,0.00,1.00,-28.80,24.00 +-33.60,-0.00,8.07,0.00,1.00,-24.00,24.00 +153.60,0.00,7.95,0.00,1.00,-19.20,19.20 +-24.00,-0.00,8.05,0.00,1.00,-19.20,14.40 +163.20,0.00,7.97,0.00,1.00,-14.40,14.40 +-14.40,-0.00,8.03,0.00,1.00,-9.60,9.60 +172.80,0.00,7.99,0.00,1.00,-4.80,4.80 +-4.80,-0.00,8.01,0.00,1.00,-4.80,4.80 +0.00,0.00,8.01,0.00,1.00,0.00,0.00 +-177.60,0.00,7.99,0.00,1.00,4.80,-4.80 +9.60,-0.00,8.03,0.00,1.00,4.80,-4.80 +-168.00,0.00,7.97,0.00,1.00,9.60,-9.60 +19.20,-0.00,8.05,0.00,1.00,14.40,-14.40 +-158.40,0.00,7.95,0.00,1.00,19.20,-19.20 +28.80,-0.00,8.07,0.00,1.00,24.00,-19.20 +-148.80,0.00,7.93,0.00,1.00,24.00,-24.00 +38.40,-0.00,8.10,0.00,1.00,28.80,-28.80 +-139.20,0.00,7.90,0.00,1.00,33.60,-28.80 +48.00,-0.00,8.12,0.00,1.00,38.40,-33.60 +-129.60,0.00,7.88,0.00,1.00,43.20,-38.40 +57.60,-4.80,8.14,0.00,1.00,48.00,-38.40 +-120.00,4.80,7.86,0.00,1.00,52.80,-43.20 +67.20,-4.80,8.16,0.00,1.00,62.40,-43.20 +-110.40,4.80,7.84,0.00,1.00,67.20,-43.20 +76.80,-4.80,8.18,0.00,1.00,72.00,-48.00 +-100.80,4.80,7.82,0.00,1.00,76.80,-48.00 +86.40,-4.80,8.20,0.00,1.00,86.40,-48.00 +-86.40,4.80,7.80,0.00,1.00,91.20,-48.00 +96.00,-4.80,8.22,0.00,1.00,96.00,-48.00 +-76.80,4.80,7.78,0.00,1.00,105.60,-48.00 +105.60,-4.80,8.25,0.00,1.00,110.40,-48.00 +-67.20,4.80,7.75,0.00,1.00,115.20,-43.20 +115.20,-4.80,8.27,0.00,1.00,120.00,-43.20 +-57.60,4.80,7.73,0.00,1.00,129.60,-38.40 +124.80,-4.80,8.29,0.00,1.00,134.40,-38.40 +-48.00,0.00,7.71,0.00,1.00,139.20,-33.60 +134.40,-0.00,8.31,0.00,1.00,144.00,-33.60 +-38.40,0.00,7.69,0.00,1.00,148.80,-28.80 +144.00,-0.00,8.33,0.00,1.00,153.60,-24.00 +-28.80,0.00,7.67,0.00,1.00,153.60,-24.00 +153.60,-0.00,8.35,0.00,1.00,158.40,-19.20 +-19.20,0.00,7.65,0.00,1.00,163.20,-14.40 +163.20,-0.00,8.37,0.00,1.00,168.00,-14.40 +-9.60,0.00,7.63,0.00,1.00,172.80,-9.60 +172.80,-0.00,8.40,0.00,1.00,172.80,-4.80 +-0.00,0.00,7.60,0.00,1.00,177.60,-0.00 +-177.60,0.00,8.42,0.00,1.00,-177.60,0.00 +4.80,-0.00,7.58,0.00,1.00,-172.80,4.80 +-168.00,0.00,8.44,0.00,1.00,-172.80,9.60 +14.40,-0.00,7.56,0.00,1.00,-168.00,14.40 +-158.40,0.00,8.46,0.00,1.00,-163.20,14.40 +24.00,-0.00,7.54,0.00,1.00,-158.40,19.20 +-148.80,0.00,8.48,0.00,1.00,-153.60,24.00 +33.60,-0.00,7.52,0.00,1.00,-153.60,24.00 +-139.20,0.00,8.50,0.00,1.00,-148.80,28.80 +43.20,-0.00,7.50,0.00,1.00,-144.00,33.60 +-129.60,0.00,8.52,0.00,1.00,-139.20,33.60 +52.80,-4.80,7.48,0.00,1.00,-134.40,38.40 +-120.00,4.80,8.54,0.00,1.00,-129.60,38.40 +62.40,-4.80,7.46,0.00,1.00,-120.00,43.20 +-110.40,4.80,8.57,0.00,1.00,-115.20,43.20 +72.00,-4.80,7.43,0.00,1.00,-110.40,48.00 +-100.80,4.80,8.59,0.00,1.00,-105.60,48.00 +81.60,-4.80,7.41,0.00,1.00,-96.00,48.00 +-91.20,4.80,8.61,0.00,1.00,-91.20,48.00 +96.00,-4.80,7.39,0.00,1.00,-86.40,48.00 +-81.60,4.80,8.63,0.00,1.00,-76.80,48.00 +105.60,-4.80,7.37,0.00,1.00,-72.00,48.00 +-72.00,4.80,8.65,0.00,1.00,-67.20,43.20 +115.20,-4.80,7.35,0.00,1.00,-62.40,43.20 +-62.40,4.80,8.67,0.00,1.00,-52.80,43.20 +124.80,-4.80,7.33,0.00,1.00,-48.00,38.40 +-52.80,0.00,8.69,0.00,1.00,-43.20,38.40 +134.40,-0.00,7.31,0.00,1.00,-38.40,33.60 +-43.20,0.00,8.72,0.00,1.00,-33.60,28.80 +144.00,-0.00,7.28,0.00,1.00,-28.80,28.80 +-33.60,0.00,8.74,0.00,1.00,-24.00,24.00 +153.60,-0.00,7.26,0.00,1.00,-24.00,19.20 +-24.00,0.00,8.76,0.00,1.00,-19.20,19.20 +163.20,-0.00,7.24,0.00,1.00,-14.40,14.40 +-14.40,0.00,8.78,0.00,1.00,-9.60,9.60 +172.80,-0.00,7.22,0.00,1.00,-4.80,4.80 +-4.80,0.00,8.80,0.00,1.00,-4.80,4.80 +0.00,0.00,7.20,0.00,1.00,0.00,0.00 +-177.60,0.00,8.82,0.00,1.00,4.80,-4.80 +9.60,-0.00,7.18,0.00,1.00,9.60,-9.60 +-168.00,0.00,8.84,0.00,1.00,9.60,-9.60 +19.20,-4.80,7.16,0.00,1.00,14.40,-14.40 +-158.40,4.80,8.87,0.00,1.00,19.20,-19.20 +28.80,-4.80,7.13,0.00,1.00,24.00,-24.00 +-148.80,4.80,8.89,0.00,1.00,28.80,-24.00 +38.40,-4.80,7.11,0.00,1.00,33.60,-28.80 +-139.20,4.80,8.91,0.00,1.00,38.40,-33.60 +48.00,-4.80,7.09,0.00,1.00,43.20,-38.40 +-129.60,4.80,8.93,0.00,1.00,48.00,-38.40 +57.60,-4.80,7.07,0.00,1.00,52.80,-43.20 +-120.00,4.80,8.95,0.00,1.00,57.60,-43.20 +67.20,-4.80,7.05,0.00,1.00,62.40,-48.00 +-110.40,9.60,8.97,0.00,1.00,67.20,-48.00 +76.80,-9.60,7.03,0.00,1.00,72.00,-52.80 +-100.80,9.60,8.99,0.00,1.00,81.60,-52.80 +86.40,-9.60,7.01,0.00,1.00,86.40,-52.80 +-86.40,9.60,9.01,0.00,1.00,91.20,-52.80 +96.00,-9.60,6.99,0.00,1.00,96.00,-52.80 +-76.80,9.60,9.04,0.00,1.00,105.60,-52.80 +105.60,-9.60,6.96,0.00,1.00,110.40,-48.00 +-67.20,9.60,9.06,0.00,1.00,115.20,-48.00 +115.20,-4.80,6.94,0.00,1.00,120.00,-48.00 +-57.60,4.80,9.08,0.00,1.00,124.80,-43.20 +124.80,-4.80,6.92,0.00,1.00,129.60,-43.20 +-48.00,4.80,9.10,0.00,1.00,134.40,-38.40 +134.40,-4.80,6.90,0.00,1.00,139.20,-33.60 +-38.40,4.80,9.12,0.00,1.00,144.00,-33.60 +144.00,-4.80,6.88,0.00,1.00,148.80,-28.80 +-28.80,4.80,9.14,0.00,1.00,153.60,-24.00 +153.60,-4.80,6.86,0.00,1.00,158.40,-19.20 +-19.20,4.80,9.16,0.00,1.00,163.20,-19.20 +163.20,-0.00,6.84,0.00,1.00,168.00,-14.40 +-9.60,0.00,9.19,0.00,1.00,168.00,-9.60 +172.80,-0.00,6.81,0.00,1.00,172.80,-4.80 +-0.00,0.00,9.21,0.00,1.00,177.60,-0.00 +-177.60,0.00,6.79,0.00,1.00,-177.60,0.00 +4.80,-0.00,9.23,0.00,1.00,-172.80,4.80 +-168.00,0.00,6.77,0.00,1.00,-168.00,9.60 +14.40,-0.00,9.25,0.00,1.00,-168.00,14.40 +-158.40,4.80,6.75,0.00,1.00,-163.20,19.20 +24.00,-4.80,9.27,0.00,1.00,-158.40,19.20 +-148.80,4.80,6.73,0.00,1.00,-153.60,24.00 +33.60,-4.80,9.29,0.00,1.00,-148.80,28.80 +-139.20,4.80,6.71,0.00,1.00,-144.00,33.60 +43.20,-4.80,9.31,0.00,1.00,-139.20,33.60 +-129.60,4.80,6.69,0.00,1.00,-134.40,38.40 +52.80,-4.80,9.34,0.00,1.00,-129.60,43.20 +-120.00,4.80,6.66,0.00,1.00,-124.80,43.20 +62.40,-4.80,9.36,0.00,1.00,-120.00,48.00 +-110.40,9.60,6.64,0.00,1.00,-115.20,48.00 +72.00,-9.60,9.38,0.00,1.00,-110.40,48.00 +-100.80,9.60,6.62,0.00,1.00,-105.60,52.80 +81.60,-9.60,9.40,0.00,1.00,-96.00,52.80 +-91.20,9.60,6.60,0.00,1.00,-91.20,52.80 +96.00,-9.60,9.42,0.00,1.00,-86.40,52.80 +-81.60,9.60,6.58,0.00,1.00,-81.60,52.80 +105.60,-9.60,9.44,0.00,1.00,-72.00,52.80 +-72.00,9.60,6.56,0.00,1.00,-67.20,48.00 +115.20,-4.80,9.46,0.00,1.00,-62.40,48.00 +-62.40,4.80,6.54,0.00,1.00,-57.60,43.20 +124.80,-4.80,9.48,0.00,1.00,-52.80,43.20 +-52.80,4.80,6.52,0.00,1.00,-48.00,38.40 +134.40,-4.80,9.51,0.00,1.00,-43.20,38.40 +-43.20,4.80,6.49,0.00,1.00,-38.40,33.60 +144.00,-4.80,9.53,0.00,1.00,-33.60,28.80 +-33.60,4.80,6.47,0.00,1.00,-28.80,24.00 +153.60,-4.80,9.55,0.00,1.00,-24.00,24.00 +-24.00,4.80,6.45,0.00,1.00,-19.20,19.20 +163.20,-4.80,9.57,0.00,1.00,-14.40,14.40 +-14.40,0.00,6.43,0.00,1.00,-9.60,9.60 +172.80,-0.00,9.59,0.00,1.00,-9.60,9.60 +-4.80,0.00,6.41,0.00,1.00,-4.80,4.80 +0.00,0.00,9.61,0.00,1.00,0.00,0.00 +-177.60,0.00,6.39,0.00,1.00,4.80,-4.80 +9.60,-0.00,9.63,0.00,1.00,9.60,-9.60 +-168.00,4.80,6.37,0.00,1.00,14.40,-14.40 +19.20,-4.80,9.66,0.00,1.00,14.40,-14.40 +-158.40,4.80,6.34,0.00,1.00,19.20,-19.20 +28.80,-4.80,9.68,0.00,1.00,24.00,-24.00 +-148.80,4.80,6.32,0.00,1.00,28.80,-28.80 +38.40,-9.60,9.70,0.00,1.00,33.60,-33.60 +-139.20,9.60,6.30,0.00,1.00,38.40,-33.60 +48.00,-9.60,9.72,0.00,1.00,43.20,-38.40 +-129.60,9.60,6.28,0.00,1.00,48.00,-43.20 +57.60,-9.60,9.74,0.00,1.00,52.80,-43.20 +-120.00,9.60,6.26,0.00,1.00,57.60,-48.00 +67.20,-9.60,9.76,0.00,1.00,62.40,-52.80 +-110.40,9.60,6.24,0.00,1.00,67.20,-52.80 +76.80,-14.40,9.78,0.00,1.00,76.80,-57.60 +-100.80,14.40,6.22,0.00,1.00,81.60,-57.60 +86.40,-14.40,9.81,0.00,1.00,86.40,-57.60 +-86.40,14.40,6.19,0.00,1.00,91.20,-57.60 +96.00,-14.40,9.83,0.00,1.00,96.00,-57.60 +-76.80,14.40,6.17,0.00,1.00,100.80,-57.60 +105.60,-14.40,9.85,0.00,1.00,110.40,-52.80 +-67.20,9.60,6.15,0.00,1.00,115.20,-52.80 +115.20,-9.60,9.87,0.00,1.00,120.00,-48.00 +-57.60,9.60,6.13,0.00,1.00,124.80,-48.00 +124.80,-9.60,9.89,0.00,1.00,129.60,-43.20 +-48.00,9.60,6.11,0.00,1.00,134.40,-38.40 +134.40,-9.60,9.91,0.00,1.00,139.20,-38.40 +-38.40,9.60,6.09,0.00,1.00,144.00,-33.60 +144.00,-9.60,9.93,0.00,1.00,148.80,-28.80 +-28.80,4.80,6.07,0.00,1.00,153.60,-24.00 +153.60,-4.80,9.95,0.00,1.00,158.40,-24.00 +-19.20,4.80,6.05,0.00,1.00,163.20,-19.20 +163.20,-4.80,9.98,0.00,1.00,168.00,-14.40 +-9.60,4.80,6.02,0.00,1.00,168.00,-9.60 +172.80,-0.00,10.00,0.00,1.00,172.80,-4.80 +-0.00,0.00,6.00,0.00,1.00,177.60,-0.00 +-177.60,0.00,10.02,0.00,1.00,-177.60,0.00 +4.80,-0.00,5.98,0.00,1.00,-172.80,4.80 +-168.00,4.80,10.04,0.00,1.00,-168.00,9.60 +14.40,-4.80,5.96,0.00,1.00,-168.00,14.40 +-158.40,4.80,10.06,0.00,1.00,-163.20,19.20 +24.00,-4.80,5.94,0.00,1.00,-158.40,24.00 +-148.80,4.80,10.08,0.00,1.00,-153.60,24.00 +33.60,-9.60,5.92,0.00,1.00,-148.80,28.80 +-139.20,9.60,10.10,0.00,1.00,-144.00,33.60 +43.20,-9.60,5.90,0.00,1.00,-139.20,38.40 +-129.60,9.60,10.13,0.00,1.00,-134.40,38.40 +52.80,-9.60,5.87,0.00,1.00,-129.60,43.20 +-120.00,9.60,10.15,0.00,1.00,-124.80,48.00 +62.40,-9.60,5.85,0.00,1.00,-120.00,48.00 +-110.40,9.60,10.17,0.00,1.00,-115.20,52.80 +72.00,-14.40,5.83,0.00,1.00,-110.40,52.80 +-100.80,14.40,10.19,0.00,1.00,-100.80,57.60 +81.60,-14.40,5.81,0.00,1.00,-96.00,57.60 +-91.20,14.40,10.21,0.00,1.00,-91.20,57.60 +96.00,-14.40,5.79,0.00,1.00,-86.40,57.60 +-81.60,14.40,10.23,0.00,1.00,-81.60,57.60 +105.60,-14.40,5.77,0.00,1.00,-76.80,57.60 +-72.00,9.60,10.25,0.00,1.00,-67.20,52.80 +115.20,-9.60,5.75,0.00,1.00,-62.40,52.80 +-62.40,9.60,10.28,0.00,1.00,-57.60,48.00 +124.80,-9.60,5.72,0.00,1.00,-52.80,43.20 +-52.80,9.60,10.30,0.00,1.00,-48.00,43.20 +134.40,-9.60,5.70,0.00,1.00,-43.20,38.40 +-43.20,9.60,10.32,0.00,1.00,-38.40,33.60 +144.00,-9.60,5.68,0.00,1.00,-33.60,33.60 +-33.60,4.80,10.34,0.00,1.00,-28.80,28.80 +153.60,-4.80,5.66,0.00,1.00,-24.00,24.00 +-24.00,4.80,10.36,0.00,1.00,-19.20,19.20 +163.20,-4.80,5.64,0.00,1.00,-14.40,14.40 +-14.40,4.80,10.38,0.00,1.00,-14.40,14.40 +172.80,-0.00,5.62,0.00,1.00,-9.60,9.60 +-4.80,0.00,10.40,0.00,1.00,-4.80,4.80 +0.00,0.00,5.60,0.00,1.00,0.00,0.00 +-177.60,0.00,10.42,0.00,1.00,4.80,-4.80 +9.60,-4.80,5.58,0.00,1.00,9.60,-9.60 +-168.00,4.80,10.45,0.00,1.00,14.40,-14.40 +19.20,-4.80,5.55,0.00,1.00,19.20,-19.20 +-158.40,4.80,10.47,0.00,1.00,19.20,-19.20 +28.80,-9.60,5.53,0.00,1.00,24.00,-24.00 +-148.80,9.60,10.49,0.00,1.00,28.80,-28.80 +38.40,-9.60,5.51,0.00,1.00,33.60,-33.60 +-139.20,9.60,10.51,0.00,1.00,38.40,-38.40 +48.00,-14.40,5.49,0.00,1.00,43.20,-43.20 +-129.60,14.40,10.53,0.00,1.00,48.00,-43.20 +57.60,-14.40,5.47,0.00,1.00,52.80,-48.00 +-120.00,14.40,10.55,0.00,1.00,57.60,-52.80 +67.20,-14.40,5.45,0.00,1.00,62.40,-52.80 +-110.40,14.40,10.57,0.00,1.00,72.00,-57.60 +76.80,-19.20,5.43,0.00,1.00,76.80,-57.60 +-100.80,19.20,10.60,0.00,1.00,81.60,-62.40 +86.40,-19.20,5.40,0.00,1.00,86.40,-62.40 +-86.40,19.20,10.62,0.00,1.00,91.20,-62.40 +96.00,-19.20,5.38,0.00,1.00,96.00,-62.40 +-76.80,19.20,10.64,0.00,1.00,100.80,-62.40 +105.60,-14.40,5.36,0.00,1.00,105.60,-57.60 +-67.20,14.40,10.66,0.00,1.00,110.40,-57.60 +115.20,-14.40,5.34,0.00,1.00,120.00,-52.80 +-57.60,14.40,10.68,0.00,1.00,124.80,-48.00 +124.80,-14.40,5.32,0.00,1.00,129.60,-48.00 +-48.00,14.40,10.70,0.00,1.00,134.40,-43.20 +134.40,-14.40,5.30,0.00,1.00,139.20,-38.40 +-38.40,9.60,10.72,0.00,1.00,144.00,-33.60 +144.00,-9.60,5.28,0.00,1.00,148.80,-33.60 +-28.80,9.60,10.74,0.00,1.00,153.60,-28.80 +153.60,-9.60,5.26,0.00,1.00,158.40,-24.00 +-19.20,4.80,10.77,0.00,1.00,158.40,-19.20 +163.20,-4.80,5.23,0.00,1.00,163.20,-14.40 +-9.60,4.80,10.79,0.00,1.00,168.00,-9.60 +172.80,-0.00,5.21,0.00,1.00,172.80,-4.80 +-0.00,0.00,10.81,0.00,1.00,177.60,-0.00 +-177.60,0.00,5.19,0.00,1.00,-177.60,0.00 +4.80,-0.00,10.83,0.00,1.00,-172.80,4.80 +-168.00,4.80,5.17,0.00,1.00,-168.00,9.60 +14.40,-4.80,10.85,0.00,1.00,-163.20,14.40 +-158.40,4.80,5.15,0.00,1.00,-158.40,19.20 +24.00,-9.60,10.87,0.00,1.00,-158.40,24.00 +-148.80,9.60,5.13,0.00,1.00,-153.60,28.80 +33.60,-9.60,10.89,0.00,1.00,-148.80,33.60 +-139.20,9.60,5.11,0.00,1.00,-144.00,33.60 +43.20,-14.40,10.92,0.00,1.00,-139.20,38.40 +-129.60,14.40,5.08,0.00,1.00,-134.40,43.20 +52.80,-14.40,10.94,0.00,1.00,-129.60,48.00 +-120.00,14.40,5.06,0.00,1.00,-124.80,48.00 +62.40,-14.40,10.96,0.00,1.00,-120.00,52.80 +-110.40,14.40,5.04,0.00,1.00,-110.40,57.60 +72.00,-14.40,10.98,0.00,1.00,-105.60,57.60 +-100.80,19.20,5.02,0.00,1.00,-100.80,62.40 +81.60,-19.20,11.00,0.00,1.00,-96.00,62.40 +-91.20,19.20,5.00,0.00,1.00,-91.20,62.40 +96.00,-19.20,11.02,0.00,1.00,-86.40,62.40 +-81.60,19.20,4.98,0.00,1.00,-81.60,62.40 +105.60,-19.20,11.04,0.00,1.00,-76.80,57.60 +-72.00,14.40,4.96,0.00,1.00,-72.00,57.60 +115.20,-14.40,11.07,0.00,1.00,-62.40,52.80 +-62.40,14.40,4.93,0.00,1.00,-57.60,52.80 +124.80,-14.40,11.09,0.00,1.00,-52.80,48.00 +-52.80,14.40,4.91,0.00,1.00,-48.00,43.20 +134.40,-14.40,11.11,0.00,1.00,-43.20,43.20 +-43.20,9.60,4.89,0.00,1.00,-38.40,38.40 +144.00,-9.60,11.13,0.00,1.00,-33.60,33.60 +-33.60,9.60,4.87,0.00,1.00,-28.80,28.80 +153.60,-9.60,11.15,0.00,1.00,-24.00,24.00 +-24.00,4.80,4.85,0.00,1.00,-19.20,19.20 +163.20,-4.80,11.17,0.00,1.00,-19.20,19.20 +-14.40,4.80,4.83,0.00,1.00,-14.40,14.40 +172.80,-4.80,11.19,0.00,1.00,-9.60,9.60 +-4.80,0.00,4.81,0.00,1.00,-4.80,4.80 +0.00,0.00,11.21,0.00,1.00,0.00,0.00 +-177.60,0.00,4.79,0.00,1.00,4.80,-4.80 +9.60,-4.80,11.24,0.00,1.00,9.60,-9.60 +-168.00,4.80,4.76,0.00,1.00,14.40,-14.40 +19.20,-4.80,11.26,0.00,1.00,19.20,-19.20 +-158.40,9.60,4.74,0.00,1.00,24.00,-24.00 +28.80,-9.60,11.28,0.00,1.00,28.80,-24.00 +-148.80,14.40,4.72,0.00,1.00,33.60,-28.80 +38.40,-14.40,11.30,0.00,1.00,38.40,-33.60 +-139.20,14.40,4.70,0.00,1.00,43.20,-38.40 +48.00,-14.40,11.32,0.00,1.00,48.00,-43.20 +-129.60,19.20,4.68,0.00,1.00,52.80,-48.00 +57.60,-19.20,11.34,0.00,1.00,57.60,-52.80 +-120.00,19.20,4.66,0.00,1.00,62.40,-52.80 +67.20,-19.20,11.36,0.00,1.00,67.20,-57.60 +-110.40,19.20,4.64,0.00,1.00,72.00,-62.40 +76.80,-19.20,11.39,0.00,1.00,76.80,-62.40 +-100.80,24.00,4.61,0.00,1.00,81.60,-67.20 +86.40,-24.00,11.41,0.00,1.00,86.40,-67.20 +-86.40,24.00,4.59,0.00,1.00,91.20,-67.20 +96.00,-24.00,11.43,0.00,1.00,96.00,-67.20 +-76.80,24.00,4.57,0.00,1.00,100.80,-67.20 +105.60,-19.20,11.45,0.00,1.00,105.60,-62.40 +-67.20,19.20,4.55,0.00,1.00,110.40,-57.60 +115.20,-19.20,11.47,0.00,1.00,115.20,-57.60 +-57.60,19.20,4.53,0.00,1.00,120.00,-52.80 +124.80,-19.20,11.49,0.00,1.00,124.80,-48.00 +-48.00,19.20,4.51,0.00,1.00,129.60,-43.20 +134.40,-14.40,11.51,0.00,1.00,134.40,-43.20 +-38.40,14.40,4.49,0.00,1.00,139.20,-38.40 +144.00,-14.40,11.54,0.00,1.00,144.00,-33.60 +-28.80,9.60,4.46,0.00,1.00,148.80,-28.80 +153.60,-9.60,11.56,0.00,1.00,153.60,-24.00 +-19.20,9.60,4.44,0.00,1.00,158.40,-19.20 +163.20,-4.80,11.58,0.00,1.00,163.20,-14.40 +-9.60,4.80,4.42,0.00,1.00,168.00,-9.60 +172.80,-4.80,11.60,0.00,1.00,172.80,-4.80 +-0.00,0.00,4.40,0.00,1.00,177.60,-0.00 +-177.60,0.00,11.62,0.00,1.00,-177.60,0.00 +4.80,-4.80,4.38,0.00,1.00,-172.80,4.80 +-168.00,4.80,11.64,0.00,1.00,-168.00,9.60 +14.40,-4.80,4.36,0.00,1.00,-163.20,14.40 +-158.40,9.60,11.66,0.00,1.00,-158.40,19.20 +24.00,-9.60,4.34,0.00,1.00,-153.60,24.00 +-148.80,9.60,11.68,0.00,1.00,-148.80,28.80 +33.60,-14.40,4.32,0.00,1.00,-144.00,33.60 +-139.20,14.40,11.71,0.00,1.00,-139.20,38.40 +43.20,-14.40,4.29,0.00,1.00,-134.40,43.20 +-129.60,19.20,11.73,0.00,1.00,-129.60,43.20 +52.80,-19.20,4.27,0.00,1.00,-124.80,48.00 +-120.00,19.20,11.75,0.00,1.00,-120.00,52.80 +62.40,-19.20,4.25,0.00,1.00,-115.20,57.60 +-110.40,19.20,11.77,0.00,1.00,-110.40,57.60 +72.00,-19.20,4.23,0.00,1.00,-105.60,62.40 +-100.80,24.00,11.79,0.00,1.00,-100.80,67.20 +81.60,-24.00,4.21,0.00,1.00,-96.00,67.20 +-91.20,24.00,11.81,0.00,1.00,-91.20,67.20 +96.00,-24.00,4.19,0.00,1.00,-86.40,67.20 +-81.60,24.00,11.83,0.00,1.00,-81.60,67.20 +105.60,-19.20,4.17,0.00,1.00,-76.80,62.40 +-72.00,19.20,11.86,0.00,1.00,-72.00,62.40 +115.20,-19.20,4.14,0.00,1.00,-67.20,57.60 +-62.40,19.20,11.88,0.00,1.00,-62.40,52.80 +124.80,-19.20,4.12,0.00,1.00,-57.60,52.80 +-52.80,19.20,11.90,0.00,1.00,-52.80,48.00 +134.40,-14.40,4.10,0.00,1.00,-48.00,43.20 +-43.20,14.40,11.92,0.00,1.00,-43.20,38.40 +144.00,-14.40,4.08,0.00,1.00,-38.40,33.60 +-33.60,14.40,11.94,0.00,1.00,-33.60,28.80 +153.60,-9.60,4.06,0.00,1.00,-28.80,24.00 +-24.00,9.60,11.96,0.00,1.00,-24.00,24.00 +163.20,-4.80,4.04,0.00,1.00,-19.20,19.20 +-14.40,4.80,11.98,0.00,1.00,-14.40,14.40 +172.80,-4.80,4.02,0.00,1.00,-9.60,9.60 +-4.80,0.00,12.01,0.00,1.00,-4.80,4.80 +0.00,0.00,3.99,0.00,1.00,0.00,0.00 +-177.60,0.00,12.03,0.00,1.00,4.80,-4.80 +9.60,-4.80,3.97,0.00,1.00,9.60,-9.60 +-168.00,4.80,12.05,0.00,1.00,14.40,-14.40 +19.20,-9.60,3.95,0.00,1.00,19.20,-19.20 +-158.40,9.60,12.07,0.00,1.00,24.00,-24.00 +24.00,-14.40,3.93,0.00,1.00,28.80,-28.80 +-148.80,14.40,12.09,0.00,1.00,33.60,-33.60 +33.60,-14.40,3.91,0.00,1.00,38.40,-38.40 +-139.20,19.20,12.11,0.00,1.00,43.20,-38.40 +43.20,-19.20,3.89,0.00,1.00,48.00,-43.20 +-129.60,19.20,12.13,0.00,1.00,52.80,-48.00 +52.80,-24.00,3.87,0.00,1.00,57.60,-52.80 +-120.00,24.00,12.15,0.00,1.00,62.40,-57.60 +62.40,-24.00,3.85,0.00,1.00,67.20,-62.40 +-110.40,24.00,12.18,0.00,1.00,72.00,-62.40 +76.80,-24.00,3.82,0.00,1.00,76.80,-67.20 +-100.80,28.80,12.20,0.00,1.00,81.60,-72.00 +86.40,-28.80,3.80,0.00,1.00,86.40,-72.00 +-86.40,28.80,12.22,0.00,1.00,91.20,-72.00 +96.00,-28.80,3.78,0.00,1.00,96.00,-72.00 +-76.80,28.80,12.24,0.00,1.00,100.80,-67.20 +105.60,-24.00,3.76,0.00,1.00,105.60,-67.20 +-67.20,24.00,12.26,0.00,1.00,110.40,-62.40 +120.00,-24.00,3.74,0.00,1.00,115.20,-57.60 +-57.60,24.00,12.28,0.00,1.00,120.00,-57.60 +129.60,-24.00,3.72,0.00,1.00,124.80,-52.80 +-48.00,19.20,12.30,0.00,1.00,129.60,-48.00 +139.20,-19.20,3.70,0.00,1.00,134.40,-43.20 +-38.40,19.20,12.33,0.00,1.00,139.20,-38.40 +148.80,-14.40,3.67,0.00,1.00,144.00,-33.60 +-28.80,14.40,12.35,0.00,1.00,148.80,-28.80 +158.40,-9.60,3.65,0.00,1.00,153.60,-24.00 +-19.20,9.60,12.37,0.00,1.00,158.40,-19.20 +163.20,-9.60,3.63,0.00,1.00,163.20,-14.40 +-9.60,4.80,12.39,0.00,1.00,168.00,-9.60 +172.80,-4.80,3.61,0.00,1.00,172.80,-4.80 +-0.00,0.00,12.41,0.00,1.00,177.60,-0.00 +-177.60,0.00,3.59,0.00,1.00,-177.60,0.00 +4.80,-4.80,12.43,0.00,1.00,-172.80,4.80 +-168.00,4.80,3.57,0.00,1.00,-168.00,9.60 +14.40,-9.60,12.45,0.00,1.00,-163.20,14.40 +-158.40,9.60,3.55,0.00,1.00,-158.40,19.20 +24.00,-9.60,12.48,0.00,1.00,-153.60,24.00 +-153.60,14.40,3.52,0.00,1.00,-148.80,28.80 +33.60,-14.40,12.50,0.00,1.00,-144.00,33.60 +-144.00,19.20,3.50,0.00,1.00,-139.20,38.40 +43.20,-19.20,12.52,0.00,1.00,-134.40,43.20 +-134.40,19.20,3.48,0.00,1.00,-129.60,48.00 +52.80,-24.00,12.54,0.00,1.00,-124.80,52.80 +-124.80,24.00,3.46,0.00,1.00,-120.00,57.60 +62.40,-24.00,12.56,0.00,1.00,-115.20,57.60 +-110.40,24.00,3.44,0.00,1.00,-110.40,62.40 +72.00,-24.00,12.58,0.00,1.00,-105.60,67.20 +-100.80,28.80,3.42,0.00,1.00,-100.80,67.20 +81.60,-28.80,12.60,0.00,1.00,-96.00,72.00 +-91.20,28.80,3.40,0.00,1.00,-91.20,72.00 +96.00,-28.80,12.62,0.00,1.00,-86.40,72.00 +-81.60,28.80,3.38,0.00,1.00,-81.60,72.00 +105.60,-24.00,12.65,0.00,1.00,-76.80,67.20 +-72.00,24.00,3.35,0.00,1.00,-72.00,62.40 +115.20,-24.00,12.67,0.00,1.00,-67.20,62.40 +-57.60,24.00,3.33,0.00,1.00,-62.40,57.60 +124.80,-24.00,12.69,0.00,1.00,-57.60,52.80 +-48.00,19.20,3.31,0.00,1.00,-52.80,48.00 +134.40,-19.20,12.71,0.00,1.00,-48.00,43.20 +-38.40,19.20,3.29,0.00,1.00,-43.20,38.40 +144.00,-14.40,12.73,0.00,1.00,-38.40,38.40 +-28.80,14.40,3.27,0.00,1.00,-33.60,33.60 +153.60,-14.40,12.75,0.00,1.00,-28.80,28.80 +-24.00,9.60,3.25,0.00,1.00,-24.00,24.00 +163.20,-9.60,12.77,0.00,1.00,-19.20,19.20 +-14.40,4.80,3.23,0.00,1.00,-14.40,14.40 +172.80,-4.80,12.80,0.00,1.00,-9.60,9.60 +-4.80,0.00,3.20,0.00,1.00,-4.80,4.80 +0.00,0.00,12.82,0.00,1.00,0.00,0.00 +-177.60,4.80,3.18,0.00,1.00,4.80,-4.80 +9.60,-4.80,12.84,0.00,1.00,9.60,-9.60 +-168.00,9.60,3.16,0.00,1.00,14.40,-14.40 +14.40,-9.60,12.86,0.00,1.00,19.20,-19.20 +-158.40,14.40,3.14,0.00,1.00,24.00,-24.00 +24.00,-14.40,12.88,0.00,1.00,28.80,-28.80 +-148.80,19.20,3.12,0.00,1.00,33.60,-33.60 +33.60,-19.20,12.90,0.00,1.00,38.40,-38.40 +-139.20,19.20,3.10,0.00,1.00,43.20,-43.20 +43.20,-24.00,12.92,0.00,1.00,48.00,-48.00 +-129.60,24.00,3.08,0.00,1.00,52.80,-52.80 +52.80,-28.80,12.95,0.00,1.00,57.60,-57.60 +-120.00,28.80,3.05,0.00,1.00,62.40,-57.60 +62.40,-28.80,12.97,0.00,1.00,67.20,-62.40 +-110.40,28.80,3.03,0.00,1.00,72.00,-67.20 +76.80,-28.80,12.99,0.00,1.00,76.80,-72.00 +-100.80,33.60,3.01,0.00,1.00,81.60,-72.00 +86.40,-33.60,13.01,0.00,1.00,86.40,-76.80 +-86.40,33.60,2.99,0.00,1.00,91.20,-76.80 +96.00,-33.60,13.03,0.00,1.00,96.00,-76.80 +-76.80,28.80,2.97,0.00,1.00,100.80,-72.00 +110.40,-28.80,13.05,0.00,1.00,105.60,-72.00 +-67.20,28.80,2.95,0.00,1.00,110.40,-67.20 +120.00,-28.80,13.07,0.00,1.00,115.20,-62.40 +-57.60,28.80,2.93,0.00,1.00,120.00,-57.60 +129.60,-24.00,13.09,0.00,1.00,124.80,-52.80 +-48.00,24.00,2.91,0.00,1.00,129.60,-48.00 +139.20,-24.00,13.12,0.00,1.00,134.40,-43.20 +-38.40,19.20,2.88,0.00,1.00,139.20,-38.40 +148.80,-19.20,13.14,0.00,1.00,144.00,-33.60 +-28.80,14.40,2.86,0.00,1.00,148.80,-28.80 +158.40,-14.40,13.16,0.00,1.00,153.60,-24.00 +-19.20,9.60,2.84,0.00,1.00,158.40,-19.20 +168.00,-9.60,13.18,0.00,1.00,163.20,-14.40 +-9.60,4.80,2.82,0.00,1.00,168.00,-9.60 +172.80,-4.80,13.20,0.00,1.00,172.80,-4.80 +-0.00,0.00,2.80,0.00,1.00,177.60,-0.00 +-177.60,0.00,13.22,0.00,1.00,-177.60,0.00 +4.80,-4.80,2.78,0.00,1.00,-172.80,4.80 +-168.00,4.80,13.24,0.00,1.00,-168.00,9.60 +14.40,-9.60,2.76,0.00,1.00,-163.20,14.40 +-163.20,9.60,13.27,0.00,1.00,-158.40,19.20 +24.00,-14.40,2.73,0.00,1.00,-153.60,24.00 +-153.60,14.40,13.29,0.00,1.00,-148.80,28.80 +33.60,-19.20,2.71,0.00,1.00,-144.00,33.60 +-144.00,19.20,13.31,0.00,1.00,-139.20,38.40 +43.20,-24.00,2.69,0.00,1.00,-134.40,43.20 +-134.40,24.00,13.33,0.00,1.00,-129.60,48.00 +52.80,-24.00,2.67,0.00,1.00,-124.80,52.80 +-124.80,28.80,13.35,0.00,1.00,-120.00,57.60 +62.40,-28.80,2.65,0.00,1.00,-115.20,62.40 +-115.20,28.80,13.37,0.00,1.00,-110.40,67.20 +72.00,-28.80,2.63,0.00,1.00,-105.60,72.00 +-100.80,28.80,13.39,0.00,1.00,-100.80,72.00 +81.60,-33.60,2.61,0.00,1.00,-96.00,76.80 +-91.20,33.60,13.42,0.00,1.00,-91.20,76.80 +96.00,-33.60,2.58,0.00,1.00,-86.40,76.80 +-81.60,33.60,13.44,0.00,1.00,-81.60,72.00 +105.60,-28.80,2.56,0.00,1.00,-76.80,72.00 +-67.20,28.80,13.46,0.00,1.00,-72.00,67.20 +115.20,-28.80,2.54,0.00,1.00,-67.20,62.40 +-57.60,28.80,13.48,0.00,1.00,-62.40,57.60 +124.80,-28.80,2.52,0.00,1.00,-57.60,57.60 +-48.00,24.00,13.50,0.00,1.00,-52.80,52.80 +134.40,-24.00,2.50,0.00,1.00,-48.00,48.00 +-38.40,19.20,13.52,0.00,1.00,-43.20,43.20 +144.00,-19.20,2.48,0.00,1.00,-38.40,38.40 +-28.80,19.20,13.54,0.00,1.00,-33.60,33.60 +153.60,-14.40,2.46,0.00,1.00,-28.80,28.80 +-19.20,14.40,13.56,0.00,1.00,-24.00,24.00 +163.20,-9.60,2.44,0.00,1.00,-19.20,19.20 +-14.40,9.60,13.59,0.00,1.00,-14.40,14.40 +172.80,-4.80,2.41,0.00,1.00,-9.60,9.60 +-4.80,4.80,13.61,0.00,1.00,-4.80,4.80 +0.00,0.00,2.39,0.00,1.00,0.00,0.00 +-177.60,4.80,13.63,0.00,1.00,4.80,-4.80 +9.60,-4.80,2.37,0.00,1.00,9.60,-9.60 +-168.00,9.60,13.65,0.00,1.00,14.40,-14.40 +14.40,-9.60,2.35,0.00,1.00,19.20,-19.20 +-158.40,14.40,13.67,0.00,1.00,24.00,-24.00 +24.00,-14.40,2.33,0.00,1.00,28.80,-28.80 +-153.60,19.20,13.69,0.00,1.00,33.60,-33.60 +33.60,-24.00,2.31,0.00,1.00,38.40,-38.40 +-144.00,24.00,13.71,0.00,1.00,43.20,-43.20 +43.20,-24.00,2.29,0.00,1.00,48.00,-48.00 +-134.40,28.80,13.74,0.00,1.00,52.80,-52.80 +52.80,-28.80,2.26,0.00,1.00,57.60,-57.60 +-124.80,33.60,13.76,0.00,1.00,62.40,-62.40 +62.40,-33.60,2.24,0.00,1.00,67.20,-67.20 +-110.40,33.60,13.78,0.00,1.00,72.00,-72.00 +72.00,-33.60,2.22,0.00,1.00,76.80,-72.00 +-100.80,38.40,13.80,0.00,1.00,81.60,-76.80 +86.40,-38.40,2.20,0.00,1.00,86.40,-81.60 +-86.40,38.40,13.82,0.00,1.00,91.20,-81.60 +96.00,-38.40,2.18,0.00,1.00,96.00,-81.60 +-76.80,33.60,13.84,0.00,1.00,100.80,-76.80 +110.40,-33.60,2.16,0.00,1.00,105.60,-72.00 +-67.20,33.60,13.86,0.00,1.00,110.40,-67.20 +120.00,-33.60,2.14,0.00,1.00,115.20,-62.40 +-52.80,28.80,13.89,0.00,1.00,120.00,-57.60 +129.60,-28.80,2.11,0.00,1.00,124.80,-52.80 +-43.20,28.80,13.91,0.00,1.00,129.60,-48.00 +139.20,-24.00,2.09,0.00,1.00,134.40,-43.20 +-33.60,24.00,13.93,0.00,1.00,139.20,-38.40 +148.80,-19.20,2.07,0.00,1.00,144.00,-33.60 +-24.00,19.20,13.95,0.00,1.00,148.80,-28.80 +158.40,-14.40,2.05,0.00,1.00,153.60,-24.00 +-19.20,14.40,13.97,0.00,1.00,158.40,-19.20 +168.00,-9.60,2.03,0.00,1.00,163.20,-14.40 +-9.60,4.80,13.99,0.00,1.00,168.00,-9.60 +172.80,-4.80,2.01,0.00,1.00,172.80,-4.80 +-0.00,0.00,14.01,0.00,1.00,177.60,-0.00 +-177.60,0.00,1.99,0.00,1.00,-177.60,0.00 +4.80,-4.80,14.03,0.00,1.00,-172.80,4.80 +-168.00,4.80,1.97,0.00,1.00,-168.00,9.60 +14.40,-9.60,14.06,0.00,1.00,-163.20,14.40 +-163.20,14.40,1.94,0.00,1.00,-158.40,19.20 +24.00,-14.40,14.08,0.00,1.00,-153.60,24.00 +-153.60,19.20,1.92,0.00,1.00,-148.80,28.80 +28.80,-19.20,14.10,0.00,1.00,-144.00,33.60 +-144.00,24.00,1.90,0.00,1.00,-139.20,38.40 +38.40,-24.00,14.12,0.00,1.00,-134.40,43.20 +-134.40,28.80,1.88,0.00,1.00,-129.60,48.00 +48.00,-28.80,14.14,0.00,1.00,-124.80,52.80 +-124.80,28.80,1.86,0.00,1.00,-120.00,57.60 +57.60,-33.60,14.16,0.00,1.00,-115.20,62.40 +-115.20,33.60,1.84,0.00,1.00,-110.40,67.20 +72.00,-33.60,14.18,0.00,1.00,-105.60,72.00 +-105.60,33.60,1.82,0.00,1.00,-100.80,76.80 +81.60,-38.40,14.21,0.00,1.00,-96.00,81.60 +-91.20,38.40,1.79,0.00,1.00,-91.20,81.60 +96.00,-38.40,14.23,0.00,1.00,-86.40,81.60 +-81.60,38.40,1.77,0.00,1.00,-81.60,76.80 +105.60,-33.60,14.25,0.00,1.00,-76.80,72.00 +-67.20,33.60,1.75,0.00,1.00,-72.00,72.00 +120.00,-33.60,14.27,0.00,1.00,-67.20,67.20 +-57.60,33.60,1.73,0.00,1.00,-62.40,62.40 +129.60,-28.80,14.29,0.00,1.00,-57.60,57.60 +-48.00,28.80,1.71,0.00,1.00,-52.80,52.80 +139.20,-24.00,14.31,0.00,1.00,-48.00,48.00 +-38.40,24.00,1.69,0.00,1.00,-43.20,43.20 +148.80,-24.00,14.33,0.00,1.00,-38.40,38.40 +-28.80,19.20,1.67,0.00,1.00,-33.60,33.60 +158.40,-14.40,14.36,0.00,1.00,-28.80,28.80 +-19.20,14.40,1.64,0.00,1.00,-24.00,24.00 +163.20,-9.60,14.38,0.00,1.00,-19.20,19.20 +-9.60,9.60,1.62,0.00,1.00,-14.40,14.40 +172.80,-4.80,14.40,0.00,1.00,-9.60,9.60 +-4.80,4.80,1.60,0.00,1.00,-4.80,4.80 +0.00,0.00,14.42,0.00,1.00,0.00,0.00 +-177.60,4.80,1.58,0.00,1.00,4.80,-4.80 +9.60,-4.80,14.44,0.00,1.00,9.60,-9.60 +-168.00,9.60,1.56,0.00,1.00,14.40,-14.40 +14.40,-14.40,14.46,0.00,1.00,19.20,-19.20 +-163.20,14.40,1.54,0.00,1.00,24.00,-24.00 +24.00,-19.20,14.48,0.00,1.00,28.80,-28.80 +-153.60,19.20,1.52,0.00,1.00,33.60,-33.60 +28.80,-24.00,14.50,0.00,1.00,38.40,-38.40 +-144.00,28.80,1.50,0.00,1.00,43.20,-43.20 +38.40,-28.80,14.53,0.00,1.00,48.00,-48.00 +-134.40,33.60,1.47,0.00,1.00,52.80,-52.80 +48.00,-33.60,14.55,0.00,1.00,57.60,-57.60 +-124.80,33.60,1.45,0.00,1.00,62.40,-62.40 +62.40,-38.40,14.57,0.00,1.00,67.20,-67.20 +-115.20,38.40,1.43,0.00,1.00,72.00,-72.00 +72.00,-38.40,14.59,0.00,1.00,76.80,-76.80 +-100.80,43.20,1.41,0.00,1.00,81.60,-81.60 +86.40,-43.20,14.61,0.00,1.00,86.40,-86.40 +-86.40,43.20,1.39,0.00,1.00,91.20,-86.40 +96.00,-43.20,14.63,0.00,1.00,96.00,-81.60 +-76.80,38.40,1.37,0.00,1.00,100.80,-76.80 +110.40,-38.40,14.65,0.00,1.00,105.60,-72.00 +-62.40,38.40,1.35,0.00,1.00,110.40,-67.20 +120.00,-38.40,14.68,0.00,1.00,115.20,-62.40 +-52.80,33.60,1.32,0.00,1.00,120.00,-57.60 +134.40,-33.60,14.70,0.00,1.00,124.80,-52.80 +-43.20,28.80,1.30,0.00,1.00,129.60,-48.00 +144.00,-28.80,14.72,0.00,1.00,134.40,-43.20 +-33.60,24.00,1.28,0.00,1.00,139.20,-38.40 +153.60,-24.00,14.74,0.00,1.00,144.00,-33.60 +-24.00,19.20,1.26,0.00,1.00,148.80,-28.80 +158.40,-19.20,14.76,0.00,1.00,153.60,-24.00 +-14.40,14.40,1.24,0.00,1.00,158.40,-19.20 +168.00,-9.60,14.78,0.00,1.00,163.20,-14.40 +-9.60,9.60,1.22,0.00,1.00,168.00,-9.60 +172.80,-4.80,14.80,0.00,1.00,172.80,-4.80 +-0.00,0.00,1.20,0.00,1.00,177.60,-0.00 +-177.60,0.00,14.83,0.00,1.00,-177.60,0.00 +4.80,-4.80,1.17,0.00,1.00,-172.80,4.80 +-172.80,9.60,14.85,0.00,1.00,-168.00,9.60 +14.40,-9.60,1.15,0.00,1.00,-163.20,14.40 +-163.20,14.40,14.87,0.00,1.00,-158.40,19.20 +19.20,-19.20,1.13,0.00,1.00,-153.60,24.00 +-153.60,19.20,14.89,0.00,1.00,-148.80,28.80 +28.80,-24.00,1.11,0.00,1.00,-144.00,33.60 +-148.80,24.00,14.91,0.00,1.00,-139.20,38.40 +38.40,-28.80,1.09,0.00,1.00,-134.40,43.20 +-139.20,28.80,14.93,0.00,1.00,-129.60,48.00 +48.00,-33.60,1.07,0.00,1.00,-124.80,52.80 +-129.60,33.60,14.95,0.00,1.00,-120.00,57.60 +57.60,-38.40,1.05,0.00,1.00,-115.20,62.40 +-115.20,38.40,14.97,0.00,1.00,-110.40,67.20 +67.20,-38.40,1.03,0.00,1.00,-105.60,72.00 +-105.60,38.40,15.00,0.00,1.00,-100.80,76.80 +81.60,-43.20,1.00,0.00,1.00,-96.00,81.60 +-91.20,43.20,15.02,0.00,1.00,-91.20,86.40 +96.00,-43.20,0.98,0.00,1.00,-86.40,86.40 +-76.80,43.20,15.04,0.00,1.00,-81.60,81.60 +105.60,-38.40,0.96,0.00,1.00,-76.80,76.80 +-67.20,38.40,15.06,0.00,1.00,-72.00,72.00 +120.00,-38.40,0.94,0.00,1.00,-67.20,67.20 +-52.80,33.60,15.08,0.00,1.00,-62.40,62.40 +129.60,-33.60,0.92,0.00,1.00,-57.60,57.60 +-43.20,33.60,15.10,0.00,1.00,-52.80,52.80 +139.20,-28.80,0.90,0.00,1.00,-48.00,48.00 +-33.60,28.80,15.12,0.00,1.00,-43.20,43.20 +148.80,-24.00,0.88,0.00,1.00,-38.40,38.40 +-28.80,19.20,15.15,0.00,1.00,-33.60,33.60 +158.40,-19.20,0.85,0.00,1.00,-28.80,28.80 +-19.20,14.40,15.17,0.00,1.00,-24.00,24.00 +163.20,-14.40,0.83,0.00,1.00,-19.20,19.20 +-9.60,9.60,15.19,0.00,1.00,-14.40,14.40 +172.80,-4.80,0.81,0.00,1.00,-9.60,9.60 +-4.80,4.80,15.21,0.00,1.00,-4.80,4.80 +0.00,0.00,0.79,0.00,1.00,0.00,0.00 +-177.60,4.80,15.23,0.00,1.00,4.80,-4.80 +4.80,-4.80,0.77,0.00,1.00,9.60,-9.60 +-168.00,9.60,15.25,0.00,1.00,14.40,-14.40 +14.40,-14.40,0.75,0.00,1.00,19.20,-19.20 +-163.20,19.20,15.27,0.00,1.00,24.00,-24.00 +19.20,-19.20,0.73,0.00,1.00,28.80,-28.80 +-153.60,24.00,15.30,0.00,1.00,33.60,-33.60 +28.80,-28.80,0.70,0.00,1.00,38.40,-38.40 +-148.80,28.80,15.32,0.00,1.00,43.20,-43.20 +38.40,-33.60,0.68,0.00,1.00,48.00,-48.00 +-139.20,33.60,15.34,0.00,1.00,52.80,-52.80 +48.00,-38.40,0.66,0.00,1.00,57.60,-57.60 +-124.80,38.40,15.36,0.00,1.00,62.40,-62.40 +57.60,-43.20,0.64,0.00,1.00,67.20,-67.20 +-115.20,43.20,15.38,0.00,1.00,72.00,-72.00 +72.00,-43.20,0.62,0.00,1.00,76.80,-76.80 +-100.80,43.20,15.40,0.00,1.00,81.60,-81.60 +86.40,-48.00,0.60,0.00,1.00,86.40,-86.40 +-86.40,48.00,15.42,0.00,1.00,91.20,-86.40 +100.80,-48.00,0.58,0.00,1.00,96.00,-81.60 +-76.80,43.20,15.44,0.00,1.00,100.80,-76.80 +110.40,-43.20,0.56,0.00,1.00,105.60,-72.00 +-62.40,43.20,15.47,0.00,1.00,110.40,-67.20 +124.80,-38.40,0.53,0.00,1.00,115.20,-62.40 +-48.00,38.40,15.49,0.00,1.00,120.00,-57.60 +134.40,-38.40,0.51,0.00,1.00,124.80,-52.80 +-38.40,33.60,15.51,0.00,1.00,129.60,-48.00 +144.00,-28.80,0.49,0.00,1.00,134.40,-43.20 +-28.80,28.80,15.53,0.00,1.00,139.20,-38.40 +153.60,-24.00,0.47,0.00,1.00,144.00,-33.60 +-24.00,24.00,15.55,0.00,1.00,148.80,-28.80 +163.20,-19.20,0.45,0.00,1.00,153.60,-24.00 +-14.40,14.40,15.57,0.00,1.00,158.40,-19.20 +168.00,-14.40,0.43,0.00,1.00,163.20,-14.40 +-9.60,9.60,15.59,0.00,1.00,168.00,-9.60 +172.80,-4.80,0.41,0.00,1.00,172.80,-4.80 +-0.00,0.00,15.62,0.00,1.00,177.60,-0.00 +-177.60,0.00,0.38,0.00,1.00,-177.60,0.00 +4.80,-4.80,15.64,0.00,1.00,-172.80,4.80 +-172.80,9.60,0.36,0.00,1.00,-168.00,9.60 +9.60,-14.40,15.66,0.00,1.00,-163.20,14.40 +-163.20,14.40,0.34,0.00,1.00,-158.40,19.20 +19.20,-19.20,15.68,0.00,1.00,-153.60,24.00 +-158.40,24.00,0.32,0.00,1.00,-148.80,28.80 +28.80,-24.00,15.70,0.00,1.00,-144.00,33.60 +-148.80,28.80,0.30,0.00,1.00,-139.20,38.40 +33.60,-28.80,15.72,0.00,1.00,-134.40,43.20 +-139.20,33.60,0.28,0.00,1.00,-129.60,48.00 +43.20,-38.40,15.74,0.00,1.00,-124.80,52.80 +-129.60,38.40,0.26,0.00,1.00,-120.00,57.60 +57.60,-38.40,15.77,0.00,1.00,-115.20,62.40 +-120.00,43.20,0.23,0.00,1.00,-110.40,67.20 +67.20,-43.20,15.79,0.00,1.00,-105.60,72.00 +-105.60,43.20,0.21,0.00,1.00,-100.80,76.80 +81.60,-48.00,15.81,0.00,1.00,-96.00,81.60 +-91.20,48.00,0.19,0.00,1.00,-91.20,86.40 +96.00,-48.00,15.83,0.00,1.00,-86.40,86.40 +-76.80,43.20,0.17,0.00,1.00,-81.60,81.60 +110.40,-43.20,15.85,0.00,1.00,-76.80,76.80 +-67.20,43.20,0.15,0.00,1.00,-72.00,72.00 +120.00,-43.20,15.87,0.00,1.00,-67.20,67.20 +-52.80,38.40,0.13,0.00,1.00,-62.40,62.40 +134.40,-38.40,15.89,0.00,1.00,-57.60,57.60 +-43.20,33.60,0.11,0.00,1.00,-52.80,52.80 +144.00,-33.60,15.91,0.00,1.00,-48.00,48.00 +-33.60,28.80,0.09,0.00,1.00,-43.20,43.20 +153.60,-28.80,15.94,0.00,1.00,-38.40,38.40 +-24.00,24.00,0.06,0.00,1.00,-33.60,33.60 +158.40,-19.20,15.96,0.00,1.00,-28.80,28.80 +-19.20,19.20,0.04,0.00,1.00,-24.00,24.00 +168.00,-14.40,15.98,0.00,1.00,-19.20,19.20 +-9.60,9.60,0.02,0.00,1.00,-14.40,14.40 +172.80,-4.80,16.00,0.00,1.00,-9.60,9.60 +-4.80,4.80,0.00,0.00,1.00,-4.80,4.80 diff --git a/scripts/testv/stvISM4.csv b/scripts/testv/stvISM4.csv index 6318155a25..326176319a 100644 --- a/scripts/testv/stvISM4.csv +++ b/scripts/testv/stvISM4.csv @@ -1,1500 +1,1500 @@ --0.00,0.00,1.00,0.00,1.00 --0.00,4.80,1.00,0.00,1.00 --0.00,9.60,1.00,0.00,1.00 --0.00,14.40,1.00,0.00,1.00 --0.00,19.20,1.00,0.00,1.00 --0.00,24.00,1.00,0.00,1.00 --0.00,28.80,1.00,0.00,1.00 --0.00,33.60,1.00,0.00,1.00 --0.00,38.40,1.00,0.00,1.00 --0.00,43.20,1.00,0.00,1.00 --0.00,48.00,1.00,0.00,1.00 --0.00,52.80,1.00,0.00,1.00 --0.00,57.60,1.00,0.00,1.00 --0.00,62.40,1.00,0.00,1.00 --0.00,67.20,1.00,0.00,1.00 --0.00,72.00,1.00,0.00,1.00 --0.00,76.80,1.00,0.00,1.00 --0.00,81.60,1.00,0.00,1.00 --0.00,86.40,1.00,0.00,1.00 --177.60,89.20,1.00,0.00,1.00 --177.60,86.40,1.00,0.00,1.00 --177.60,81.60,1.00,0.00,1.00 --177.60,76.80,1.00,0.00,1.00 --177.60,72.00,1.00,0.00,1.00 --177.60,67.20,1.00,0.00,1.00 -177.60,62.40,1.00,0.00,1.00 -177.60,57.60,1.00,0.00,1.00 -177.60,52.80,1.00,0.00,1.00 -177.60,48.00,1.00,0.00,1.00 -177.60,43.20,1.00,0.00,1.00 -177.60,38.40,1.00,0.00,1.00 -177.60,33.60,1.00,0.00,1.00 -177.60,28.80,1.00,0.00,1.00 -177.60,24.00,1.00,0.00,1.00 -177.60,19.20,1.00,0.00,1.00 -177.60,14.40,1.00,0.00,1.00 -177.60,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --177.60,-9.60,1.00,0.00,1.00 --177.60,-14.40,1.00,0.00,1.00 --177.60,-19.20,1.00,0.00,1.00 --177.60,-24.00,1.00,0.00,1.00 --177.60,-28.80,1.00,0.00,1.00 --177.60,-33.60,1.00,0.00,1.00 --177.60,-38.40,1.00,0.00,1.00 --177.60,-48.00,1.00,0.00,1.00 --177.60,-48.00,1.00,0.00,1.00 --177.60,-52.80,1.00,0.00,1.00 --177.60,-57.60,1.00,0.00,1.00 -177.60,-62.40,1.00,0.00,1.00 -177.60,-67.20,1.00,0.00,1.00 -177.60,-76.80,1.00,0.00,1.00 -177.60,-76.80,1.00,0.00,1.00 -177.60,-86.40,1.00,0.00,1.00 -177.60,-89.20,1.00,0.00,1.00 -0.00,-86.40,1.00,0.00,1.00 -0.00,-81.60,1.00,0.00,1.00 -0.00,-76.80,1.00,0.00,1.00 -0.00,-72.00,1.00,0.00,1.00 -0.00,-67.20,1.00,0.00,1.00 -0.00,-62.40,1.00,0.00,1.00 -0.00,-57.60,1.00,0.00,1.00 -0.00,-52.80,1.00,0.00,1.00 -0.00,-48.00,1.00,0.00,1.00 -0.00,-43.20,1.00,0.00,1.00 -0.00,-38.40,1.00,0.00,1.00 -0.00,-33.60,1.00,0.00,1.00 -0.00,-28.80,1.00,0.00,1.00 -0.00,-24.00,1.00,0.00,1.00 -0.00,-19.20,1.00,0.00,1.00 -0.00,-14.40,1.00,0.00,1.00 -0.00,-9.60,1.00,0.00,1.00 -0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,4.80,1.00,0.00,1.00 -0.00,9.60,1.00,0.00,1.00 -0.00,14.40,1.00,0.00,1.00 -0.00,19.20,1.00,0.00,1.00 -0.00,24.00,1.00,0.00,1.00 -4.80,28.80,1.00,0.00,1.00 -4.80,33.60,1.00,0.00,1.00 -4.80,38.40,1.00,0.00,1.00 -4.80,43.20,1.00,0.00,1.00 -4.80,48.00,1.00,0.00,1.00 -4.80,52.80,1.00,0.00,1.00 -9.60,57.60,1.00,0.00,1.00 -9.60,62.40,1.00,0.00,1.00 -9.60,67.20,1.00,0.00,1.00 -14.40,72.00,1.00,0.00,1.00 -19.20,76.80,1.00,0.00,1.00 -28.80,81.60,1.00,0.00,1.00 -52.80,86.40,1.00,0.00,1.00 -105.60,86.40,1.00,0.00,1.00 -139.20,81.60,1.00,0.00,1.00 -158.40,76.80,1.00,0.00,1.00 -163.20,72.00,1.00,0.00,1.00 -168.00,67.20,1.00,0.00,1.00 -168.00,62.40,1.00,0.00,1.00 -172.80,57.60,1.00,0.00,1.00 -172.80,52.80,1.00,0.00,1.00 -172.80,48.00,1.00,0.00,1.00 -172.80,43.20,1.00,0.00,1.00 -177.60,38.40,1.00,0.00,1.00 -177.60,33.60,1.00,0.00,1.00 -177.60,28.80,1.00,0.00,1.00 -177.60,24.00,1.00,0.00,1.00 -177.60,19.20,1.00,0.00,1.00 -177.60,14.40,1.00,0.00,1.00 -177.60,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --177.60,-9.60,1.00,0.00,1.00 --177.60,-14.40,1.00,0.00,1.00 --177.60,-19.20,1.00,0.00,1.00 --177.60,-24.00,1.00,0.00,1.00 --177.60,-28.80,1.00,0.00,1.00 --177.60,-33.60,1.00,0.00,1.00 --177.60,-38.40,1.00,0.00,1.00 --172.80,-43.20,1.00,0.00,1.00 --172.80,-48.00,1.00,0.00,1.00 --172.80,-52.80,1.00,0.00,1.00 --172.80,-57.60,1.00,0.00,1.00 --168.00,-62.40,1.00,0.00,1.00 --168.00,-67.20,1.00,0.00,1.00 --163.20,-72.00,1.00,0.00,1.00 --158.40,-76.80,1.00,0.00,1.00 --139.20,-81.60,1.00,0.00,1.00 --105.60,-86.40,1.00,0.00,1.00 --52.80,-86.40,1.00,0.00,1.00 --28.80,-81.60,1.00,0.00,1.00 --19.20,-76.80,1.00,0.00,1.00 --14.40,-72.00,1.00,0.00,1.00 --9.60,-67.20,1.00,0.00,1.00 --9.60,-62.40,1.00,0.00,1.00 --9.60,-57.60,1.00,0.00,1.00 --4.80,-52.80,1.00,0.00,1.00 --4.80,-48.00,1.00,0.00,1.00 --4.80,-43.20,1.00,0.00,1.00 --4.80,-38.40,1.00,0.00,1.00 --4.80,-33.60,1.00,0.00,1.00 --4.80,-28.80,1.00,0.00,1.00 --0.00,-24.00,1.00,0.00,1.00 --0.00,-19.20,1.00,0.00,1.00 --0.00,-14.40,1.00,0.00,1.00 --0.00,-9.60,1.00,0.00,1.00 --0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,4.80,1.00,0.00,1.00 -0.00,9.60,1.00,0.00,1.00 -4.80,14.40,1.00,0.00,1.00 -4.80,19.20,1.00,0.00,1.00 -4.80,24.00,1.00,0.00,1.00 -4.80,28.80,1.00,0.00,1.00 -4.80,33.60,1.00,0.00,1.00 -9.60,38.40,1.00,0.00,1.00 -9.60,43.20,1.00,0.00,1.00 -9.60,48.00,1.00,0.00,1.00 -14.40,52.80,1.00,0.00,1.00 -14.40,57.60,1.00,0.00,1.00 -19.20,62.40,1.00,0.00,1.00 -24.00,67.20,1.00,0.00,1.00 -28.80,72.00,1.00,0.00,1.00 -33.60,72.00,1.00,0.00,1.00 -48.00,76.80,1.00,0.00,1.00 -67.20,81.60,1.00,0.00,1.00 -96.00,81.60,1.00,0.00,1.00 -120.00,76.80,1.00,0.00,1.00 -139.20,76.80,1.00,0.00,1.00 -148.80,72.00,1.00,0.00,1.00 -153.60,67.20,1.00,0.00,1.00 -158.40,62.40,1.00,0.00,1.00 -163.20,57.60,1.00,0.00,1.00 -168.00,52.80,1.00,0.00,1.00 -168.00,48.00,1.00,0.00,1.00 -168.00,43.20,1.00,0.00,1.00 -172.80,38.40,1.00,0.00,1.00 -172.80,33.60,1.00,0.00,1.00 -172.80,28.80,1.00,0.00,1.00 -177.60,24.00,1.00,0.00,1.00 -177.60,19.20,1.00,0.00,1.00 -177.60,14.40,1.00,0.00,1.00 -177.60,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --177.60,-9.60,1.00,0.00,1.00 --177.60,-14.40,1.00,0.00,1.00 --177.60,-19.20,1.00,0.00,1.00 --177.60,-24.00,1.00,0.00,1.00 --172.80,-28.80,1.00,0.00,1.00 --172.80,-33.60,1.00,0.00,1.00 --172.80,-38.40,1.00,0.00,1.00 --168.00,-43.20,1.00,0.00,1.00 --168.00,-48.00,1.00,0.00,1.00 --168.00,-52.80,1.00,0.00,1.00 --163.20,-57.60,1.00,0.00,1.00 --158.40,-62.40,1.00,0.00,1.00 --153.60,-67.20,1.00,0.00,1.00 --148.80,-72.00,1.00,0.00,1.00 --139.20,-76.80,1.00,0.00,1.00 --120.00,-76.80,1.00,0.00,1.00 --96.00,-81.60,1.00,0.00,1.00 --67.20,-81.60,1.00,0.00,1.00 --48.00,-76.80,1.00,0.00,1.00 --33.60,-72.00,1.00,0.00,1.00 --28.80,-72.00,1.00,0.00,1.00 --24.00,-67.20,1.00,0.00,1.00 --19.20,-62.40,1.00,0.00,1.00 --14.40,-57.60,1.00,0.00,1.00 --14.40,-52.80,1.00,0.00,1.00 --9.60,-48.00,1.00,0.00,1.00 --9.60,-43.20,1.00,0.00,1.00 --9.60,-38.40,1.00,0.00,1.00 --4.80,-33.60,1.00,0.00,1.00 --4.80,-28.80,1.00,0.00,1.00 --4.80,-24.00,1.00,0.00,1.00 --4.80,-19.20,1.00,0.00,1.00 --4.80,-14.40,1.00,0.00,1.00 --0.00,-9.60,1.00,0.00,1.00 --0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,4.80,1.00,0.00,1.00 -4.80,9.60,1.00,0.00,1.00 -4.80,14.40,1.00,0.00,1.00 -4.80,19.20,1.00,0.00,1.00 -4.80,24.00,1.00,0.00,1.00 -9.60,28.80,1.00,0.00,1.00 -9.60,33.60,1.00,0.00,1.00 -9.60,38.40,1.00,0.00,1.00 -14.40,43.20,1.00,0.00,1.00 -14.40,48.00,1.00,0.00,1.00 -19.20,52.80,1.00,0.00,1.00 -19.20,52.80,1.00,0.00,1.00 -24.00,57.60,1.00,0.00,1.00 -28.80,62.40,1.00,0.00,1.00 -38.40,67.20,1.00,0.00,1.00 -48.00,72.00,1.00,0.00,1.00 -57.60,72.00,1.00,0.00,1.00 -76.80,76.80,1.00,0.00,1.00 -96.00,76.80,1.00,0.00,1.00 -115.20,76.80,1.00,0.00,1.00 -129.60,72.00,1.00,0.00,1.00 -139.20,67.20,1.00,0.00,1.00 -144.00,67.20,1.00,0.00,1.00 -153.60,62.40,1.00,0.00,1.00 -158.40,57.60,1.00,0.00,1.00 -158.40,52.80,1.00,0.00,1.00 -163.20,48.00,1.00,0.00,1.00 -168.00,43.20,1.00,0.00,1.00 -168.00,38.40,1.00,0.00,1.00 -168.00,33.60,1.00,0.00,1.00 -172.80,28.80,1.00,0.00,1.00 -172.80,24.00,1.00,0.00,1.00 -172.80,19.20,1.00,0.00,1.00 -177.60,14.40,1.00,0.00,1.00 -177.60,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --177.60,-9.60,1.00,0.00,1.00 --177.60,-14.40,1.00,0.00,1.00 --172.80,-19.20,1.00,0.00,1.00 --172.80,-24.00,1.00,0.00,1.00 --172.80,-28.80,1.00,0.00,1.00 --168.00,-33.60,1.00,0.00,1.00 --168.00,-38.40,1.00,0.00,1.00 --168.00,-43.20,1.00,0.00,1.00 --163.20,-48.00,1.00,0.00,1.00 --158.40,-52.80,1.00,0.00,1.00 --158.40,-57.60,1.00,0.00,1.00 --153.60,-62.40,1.00,0.00,1.00 --144.00,-67.20,1.00,0.00,1.00 --139.20,-67.20,1.00,0.00,1.00 --129.60,-72.00,1.00,0.00,1.00 --115.20,-76.80,1.00,0.00,1.00 --96.00,-76.80,1.00,0.00,1.00 --76.80,-76.80,1.00,0.00,1.00 --57.60,-72.00,1.00,0.00,1.00 --48.00,-72.00,1.00,0.00,1.00 --38.40,-67.20,1.00,0.00,1.00 --28.80,-62.40,1.00,0.00,1.00 --24.00,-57.60,1.00,0.00,1.00 --19.20,-52.80,1.00,0.00,1.00 --19.20,-52.80,1.00,0.00,1.00 --14.40,-48.00,1.00,0.00,1.00 --14.40,-43.20,1.00,0.00,1.00 --9.60,-38.40,1.00,0.00,1.00 --9.60,-33.60,1.00,0.00,1.00 --9.60,-28.80,1.00,0.00,1.00 --4.80,-24.00,1.00,0.00,1.00 --4.80,-19.20,1.00,0.00,1.00 --4.80,-14.40,1.00,0.00,1.00 --4.80,-9.60,1.00,0.00,1.00 --0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,4.80,1.00,0.00,1.00 -4.80,9.60,1.00,0.00,1.00 -4.80,14.40,1.00,0.00,1.00 -4.80,19.20,1.00,0.00,1.00 -9.60,24.00,1.00,0.00,1.00 -9.60,28.80,1.00,0.00,1.00 -14.40,33.60,1.00,0.00,1.00 -14.40,33.60,1.00,0.00,1.00 -19.20,38.40,1.00,0.00,1.00 -19.20,43.20,1.00,0.00,1.00 -24.00,48.00,1.00,0.00,1.00 -28.80,52.80,1.00,0.00,1.00 -33.60,57.60,1.00,0.00,1.00 -38.40,62.40,1.00,0.00,1.00 -43.20,62.40,1.00,0.00,1.00 -52.80,67.20,1.00,0.00,1.00 -67.20,67.20,1.00,0.00,1.00 -76.80,72.00,1.00,0.00,1.00 -96.00,72.00,1.00,0.00,1.00 -105.60,72.00,1.00,0.00,1.00 -120.00,67.20,1.00,0.00,1.00 -129.60,67.20,1.00,0.00,1.00 -139.20,62.40,1.00,0.00,1.00 -144.00,57.60,1.00,0.00,1.00 -148.80,52.80,1.00,0.00,1.00 -153.60,52.80,1.00,0.00,1.00 -158.40,48.00,1.00,0.00,1.00 -163.20,43.20,1.00,0.00,1.00 -163.20,38.40,1.00,0.00,1.00 -168.00,33.60,1.00,0.00,1.00 -168.00,28.80,1.00,0.00,1.00 -172.80,24.00,1.00,0.00,1.00 -172.80,19.20,1.00,0.00,1.00 -172.80,14.40,1.00,0.00,1.00 -177.60,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --177.60,-9.60,1.00,0.00,1.00 --172.80,-14.40,1.00,0.00,1.00 --172.80,-19.20,1.00,0.00,1.00 --172.80,-24.00,1.00,0.00,1.00 --168.00,-28.80,1.00,0.00,1.00 --168.00,-33.60,1.00,0.00,1.00 --163.20,-38.40,1.00,0.00,1.00 --163.20,-43.20,1.00,0.00,1.00 --158.40,-48.00,1.00,0.00,1.00 --153.60,-52.80,1.00,0.00,1.00 --148.80,-52.80,1.00,0.00,1.00 --144.00,-57.60,1.00,0.00,1.00 --139.20,-62.40,1.00,0.00,1.00 --129.60,-67.20,1.00,0.00,1.00 --120.00,-67.20,1.00,0.00,1.00 --105.60,-72.00,1.00,0.00,1.00 --96.00,-72.00,1.00,0.00,1.00 --76.80,-72.00,1.00,0.00,1.00 --67.20,-67.20,1.00,0.00,1.00 --52.80,-67.20,1.00,0.00,1.00 --43.20,-62.40,1.00,0.00,1.00 --38.40,-62.40,1.00,0.00,1.00 --33.60,-57.60,1.00,0.00,1.00 --28.80,-52.80,1.00,0.00,1.00 --24.00,-48.00,1.00,0.00,1.00 --19.20,-43.20,1.00,0.00,1.00 --19.20,-38.40,1.00,0.00,1.00 --14.40,-33.60,1.00,0.00,1.00 --14.40,-33.60,1.00,0.00,1.00 --9.60,-28.80,1.00,0.00,1.00 --9.60,-24.00,1.00,0.00,1.00 --4.80,-19.20,1.00,0.00,1.00 --4.80,-14.40,1.00,0.00,1.00 --4.80,-9.60,1.00,0.00,1.00 --0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,4.80,1.00,0.00,1.00 -4.80,9.60,1.00,0.00,1.00 -4.80,14.40,1.00,0.00,1.00 -9.60,19.20,1.00,0.00,1.00 -9.60,24.00,1.00,0.00,1.00 -14.40,24.00,1.00,0.00,1.00 -14.40,28.80,1.00,0.00,1.00 -19.20,33.60,1.00,0.00,1.00 -19.20,38.40,1.00,0.00,1.00 -24.00,43.20,1.00,0.00,1.00 -28.80,48.00,1.00,0.00,1.00 -33.60,52.80,1.00,0.00,1.00 -38.40,52.80,1.00,0.00,1.00 -43.20,57.60,1.00,0.00,1.00 -52.80,62.40,1.00,0.00,1.00 -62.40,62.40,1.00,0.00,1.00 -72.00,62.40,1.00,0.00,1.00 -81.60,67.20,1.00,0.00,1.00 -91.20,67.20,1.00,0.00,1.00 -105.60,67.20,1.00,0.00,1.00 -115.20,62.40,1.00,0.00,1.00 -124.80,62.40,1.00,0.00,1.00 -134.40,57.60,1.00,0.00,1.00 -139.20,57.60,1.00,0.00,1.00 -144.00,52.80,1.00,0.00,1.00 -148.80,48.00,1.00,0.00,1.00 -153.60,43.20,1.00,0.00,1.00 -158.40,38.40,1.00,0.00,1.00 -158.40,38.40,1.00,0.00,1.00 -163.20,33.60,1.00,0.00,1.00 -168.00,28.80,1.00,0.00,1.00 -168.00,24.00,1.00,0.00,1.00 -172.80,19.20,1.00,0.00,1.00 -172.80,14.40,1.00,0.00,1.00 -172.80,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --172.80,-9.60,1.00,0.00,1.00 --172.80,-14.40,1.00,0.00,1.00 --172.80,-19.20,1.00,0.00,1.00 --168.00,-24.00,1.00,0.00,1.00 --168.00,-28.80,1.00,0.00,1.00 --163.20,-33.60,1.00,0.00,1.00 --158.40,-38.40,1.00,0.00,1.00 --158.40,-38.40,1.00,0.00,1.00 --153.60,-43.20,1.00,0.00,1.00 --148.80,-48.00,1.00,0.00,1.00 --144.00,-52.80,1.00,0.00,1.00 --139.20,-57.60,1.00,0.00,1.00 --134.40,-57.60,1.00,0.00,1.00 --124.80,-62.40,1.00,0.00,1.00 --115.20,-62.40,1.00,0.00,1.00 --105.60,-67.20,1.00,0.00,1.00 --91.20,-67.20,1.00,0.00,1.00 --81.60,-67.20,1.00,0.00,1.00 --72.00,-62.40,1.00,0.00,1.00 --62.40,-62.40,1.00,0.00,1.00 --52.80,-62.40,1.00,0.00,1.00 --43.20,-57.60,1.00,0.00,1.00 --38.40,-52.80,1.00,0.00,1.00 --33.60,-52.80,1.00,0.00,1.00 --28.80,-48.00,1.00,0.00,1.00 --24.00,-43.20,1.00,0.00,1.00 --19.20,-38.40,1.00,0.00,1.00 --19.20,-33.60,1.00,0.00,1.00 --14.40,-28.80,1.00,0.00,1.00 --14.40,-24.00,1.00,0.00,1.00 --9.60,-24.00,1.00,0.00,1.00 --9.60,-19.20,1.00,0.00,1.00 --4.80,-14.40,1.00,0.00,1.00 --4.80,-9.60,1.00,0.00,1.00 --0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -0.00,4.80,1.00,0.00,1.00 -4.80,9.60,1.00,0.00,1.00 -4.80,14.40,1.00,0.00,1.00 -9.60,14.40,1.00,0.00,1.00 -14.40,19.20,1.00,0.00,1.00 -14.40,24.00,1.00,0.00,1.00 -19.20,28.80,1.00,0.00,1.00 -19.20,33.60,1.00,0.00,1.00 -24.00,38.40,1.00,0.00,1.00 -28.80,38.40,1.00,0.00,1.00 -33.60,43.20,1.00,0.00,1.00 -38.40,48.00,1.00,0.00,1.00 -43.20,52.80,1.00,0.00,1.00 -48.00,52.80,1.00,0.00,1.00 -57.60,57.60,1.00,0.00,1.00 -62.40,57.60,1.00,0.00,1.00 -72.00,62.40,1.00,0.00,1.00 -81.60,62.40,1.00,0.00,1.00 -91.20,62.40,1.00,0.00,1.00 -100.80,62.40,1.00,0.00,1.00 -110.40,57.60,1.00,0.00,1.00 -120.00,57.60,1.00,0.00,1.00 -129.60,57.60,1.00,0.00,1.00 -134.40,52.80,1.00,0.00,1.00 -139.20,48.00,1.00,0.00,1.00 -144.00,48.00,1.00,0.00,1.00 -148.80,43.20,1.00,0.00,1.00 -153.60,38.40,1.00,0.00,1.00 -158.40,33.60,1.00,0.00,1.00 -158.40,28.80,1.00,0.00,1.00 -163.20,28.80,1.00,0.00,1.00 -168.00,24.00,1.00,0.00,1.00 -168.00,19.20,1.00,0.00,1.00 -172.80,14.40,1.00,0.00,1.00 -172.80,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --172.80,-9.60,1.00,0.00,1.00 --172.80,-14.40,1.00,0.00,1.00 --168.00,-19.20,1.00,0.00,1.00 --168.00,-24.00,1.00,0.00,1.00 --163.20,-28.80,1.00,0.00,1.00 --158.40,-28.80,1.00,0.00,1.00 --158.40,-33.60,1.00,0.00,1.00 --153.60,-38.40,1.00,0.00,1.00 --148.80,-43.20,1.00,0.00,1.00 --144.00,-48.00,1.00,0.00,1.00 --139.20,-48.00,1.00,0.00,1.00 --134.40,-52.80,1.00,0.00,1.00 --129.60,-57.60,1.00,0.00,1.00 --120.00,-57.60,1.00,0.00,1.00 --110.40,-57.60,1.00,0.00,1.00 --100.80,-62.40,1.00,0.00,1.00 --91.20,-62.40,1.00,0.00,1.00 --81.60,-62.40,1.00,0.00,1.00 --72.00,-62.40,1.00,0.00,1.00 --62.40,-57.60,1.00,0.00,1.00 --57.60,-57.60,1.00,0.00,1.00 --48.00,-52.80,1.00,0.00,1.00 --43.20,-52.80,1.00,0.00,1.00 --38.40,-48.00,1.00,0.00,1.00 --33.60,-43.20,1.00,0.00,1.00 --28.80,-38.40,1.00,0.00,1.00 --24.00,-38.40,1.00,0.00,1.00 --19.20,-33.60,1.00,0.00,1.00 --19.20,-28.80,1.00,0.00,1.00 --14.40,-24.00,1.00,0.00,1.00 --14.40,-19.20,1.00,0.00,1.00 --9.60,-14.40,1.00,0.00,1.00 --4.80,-14.40,1.00,0.00,1.00 --4.80,-9.60,1.00,0.00,1.00 --0.00,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 -4.80,9.60,1.00,0.00,1.00 -9.60,9.60,1.00,0.00,1.00 -9.60,14.40,1.00,0.00,1.00 -14.40,19.20,1.00,0.00,1.00 -19.20,24.00,1.00,0.00,1.00 -19.20,28.80,1.00,0.00,1.00 -24.00,28.80,1.00,0.00,1.00 -28.80,33.60,1.00,0.00,1.00 -33.60,38.40,1.00,0.00,1.00 -38.40,43.20,1.00,0.00,1.00 -43.20,43.20,1.00,0.00,1.00 -48.00,48.00,1.00,0.00,1.00 -52.80,48.00,1.00,0.00,1.00 -57.60,52.80,1.00,0.00,1.00 -67.20,52.80,1.00,0.00,1.00 -76.80,57.60,1.00,0.00,1.00 -81.60,57.60,1.00,0.00,1.00 -91.20,57.60,1.00,0.00,1.00 -100.80,57.60,1.00,0.00,1.00 -110.40,52.80,1.00,0.00,1.00 -115.20,52.80,1.00,0.00,1.00 -124.80,52.80,1.00,0.00,1.00 -129.60,48.00,1.00,0.00,1.00 -134.40,48.00,1.00,0.00,1.00 -139.20,43.20,1.00,0.00,1.00 -144.00,38.40,1.00,0.00,1.00 -148.80,38.40,1.00,0.00,1.00 -153.60,33.60,1.00,0.00,1.00 -158.40,28.80,1.00,0.00,1.00 -163.20,24.00,1.00,0.00,1.00 -163.20,24.00,1.00,0.00,1.00 -168.00,19.20,1.00,0.00,1.00 -172.80,14.40,1.00,0.00,1.00 -172.80,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --172.80,-9.60,1.00,0.00,1.00 --172.80,-14.40,1.00,0.00,1.00 --168.00,-19.20,1.00,0.00,1.00 --163.20,-24.00,1.00,0.00,1.00 --163.20,-24.00,1.00,0.00,1.00 --158.40,-28.80,1.00,0.00,1.00 --153.60,-33.60,1.00,0.00,1.00 --148.80,-38.40,1.00,0.00,1.00 --144.00,-38.40,1.00,0.00,1.00 --139.20,-43.20,1.00,0.00,1.00 --134.40,-48.00,1.00,0.00,1.00 --129.60,-48.00,1.00,0.00,1.00 --124.80,-52.80,1.00,0.00,1.00 --115.20,-52.80,1.00,0.00,1.00 --110.40,-52.80,1.00,0.00,1.00 --100.80,-57.60,1.00,0.00,1.00 --91.20,-57.60,1.00,0.00,1.00 --81.60,-57.60,1.00,0.00,1.00 --76.80,-57.60,1.00,0.00,1.00 --67.20,-52.80,1.00,0.00,1.00 --57.60,-52.80,1.00,0.00,1.00 --52.80,-48.00,1.00,0.00,1.00 --48.00,-48.00,1.00,0.00,1.00 --43.20,-43.20,1.00,0.00,1.00 --38.40,-43.20,1.00,0.00,1.00 --33.60,-38.40,1.00,0.00,1.00 --28.80,-33.60,1.00,0.00,1.00 --24.00,-28.80,1.00,0.00,1.00 --19.20,-28.80,1.00,0.00,1.00 --19.20,-24.00,1.00,0.00,1.00 --14.40,-19.20,1.00,0.00,1.00 --9.60,-14.40,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 --4.80,-9.60,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 -4.80,9.60,1.00,0.00,1.00 -9.60,9.60,1.00,0.00,1.00 -14.40,14.40,1.00,0.00,1.00 -14.40,19.20,1.00,0.00,1.00 -19.20,24.00,1.00,0.00,1.00 -24.00,24.00,1.00,0.00,1.00 -24.00,28.80,1.00,0.00,1.00 -28.80,33.60,1.00,0.00,1.00 -33.60,33.60,1.00,0.00,1.00 -38.40,38.40,1.00,0.00,1.00 -43.20,43.20,1.00,0.00,1.00 -48.00,43.20,1.00,0.00,1.00 -57.60,48.00,1.00,0.00,1.00 -62.40,48.00,1.00,0.00,1.00 -67.20,48.00,1.00,0.00,1.00 -76.80,52.80,1.00,0.00,1.00 -86.40,52.80,1.00,0.00,1.00 -91.20,52.80,1.00,0.00,1.00 -100.80,52.80,1.00,0.00,1.00 -105.60,48.00,1.00,0.00,1.00 -115.20,48.00,1.00,0.00,1.00 -120.00,48.00,1.00,0.00,1.00 -124.80,43.20,1.00,0.00,1.00 -134.40,43.20,1.00,0.00,1.00 -139.20,38.40,1.00,0.00,1.00 -144.00,38.40,1.00,0.00,1.00 -148.80,33.60,1.00,0.00,1.00 -153.60,28.80,1.00,0.00,1.00 -153.60,28.80,1.00,0.00,1.00 -158.40,24.00,1.00,0.00,1.00 -163.20,19.20,1.00,0.00,1.00 -168.00,14.40,1.00,0.00,1.00 -168.00,14.40,1.00,0.00,1.00 -172.80,9.60,1.00,0.00,1.00 -177.60,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --177.60,-4.80,1.00,0.00,1.00 --172.80,-9.60,1.00,0.00,1.00 --168.00,-14.40,1.00,0.00,1.00 --168.00,-14.40,1.00,0.00,1.00 --163.20,-19.20,1.00,0.00,1.00 --158.40,-24.00,1.00,0.00,1.00 --153.60,-28.80,1.00,0.00,1.00 --153.60,-28.80,1.00,0.00,1.00 --148.80,-33.60,1.00,0.00,1.00 --144.00,-38.40,1.00,0.00,1.00 --139.20,-38.40,1.00,0.00,1.00 --134.40,-43.20,1.00,0.00,1.00 --124.80,-43.20,1.00,0.00,1.00 --120.00,-48.00,1.00,0.00,1.00 --115.20,-48.00,1.00,0.00,1.00 --105.60,-48.00,1.00,0.00,1.00 --100.80,-52.80,1.00,0.00,1.00 --91.20,-52.80,1.00,0.00,1.00 --86.40,-52.80,1.00,0.00,1.00 --76.80,-52.80,1.00,0.00,1.00 --67.20,-48.00,1.00,0.00,1.00 --62.40,-48.00,1.00,0.00,1.00 --57.60,-48.00,1.00,0.00,1.00 --48.00,-43.20,1.00,0.00,1.00 --43.20,-43.20,1.00,0.00,1.00 --38.40,-38.40,1.00,0.00,1.00 --33.60,-33.60,1.00,0.00,1.00 --28.80,-33.60,1.00,0.00,1.00 --24.00,-28.80,1.00,0.00,1.00 --24.00,-24.00,1.00,0.00,1.00 --19.20,-24.00,1.00,0.00,1.00 --14.40,-19.20,1.00,0.00,1.00 --14.40,-14.40,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 --4.80,-9.60,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 -9.60,9.60,1.00,0.00,1.00 -14.40,14.40,1.00,0.00,1.00 -19.20,19.20,1.00,0.00,1.00 -19.20,19.20,1.00,0.00,1.00 -24.00,24.00,1.00,0.00,1.00 -28.80,28.80,1.00,0.00,1.00 -33.60,28.80,1.00,0.00,1.00 -38.40,33.60,1.00,0.00,1.00 -43.20,33.60,1.00,0.00,1.00 -48.00,38.40,1.00,0.00,1.00 -52.80,38.40,1.00,0.00,1.00 -57.60,43.20,1.00,0.00,1.00 -62.40,43.20,1.00,0.00,1.00 -72.00,43.20,1.00,0.00,1.00 -76.80,48.00,1.00,0.00,1.00 -86.40,48.00,1.00,0.00,1.00 -91.20,48.00,1.00,0.00,1.00 -100.80,48.00,1.00,0.00,1.00 -105.60,48.00,1.00,0.00,1.00 -110.40,43.20,1.00,0.00,1.00 -120.00,43.20,1.00,0.00,1.00 -124.80,43.20,1.00,0.00,1.00 -129.60,38.40,1.00,0.00,1.00 -134.40,38.40,1.00,0.00,1.00 -139.20,33.60,1.00,0.00,1.00 -144.00,33.60,1.00,0.00,1.00 -148.80,28.80,1.00,0.00,1.00 -153.60,24.00,1.00,0.00,1.00 -158.40,24.00,1.00,0.00,1.00 -163.20,19.20,1.00,0.00,1.00 -163.20,14.40,1.00,0.00,1.00 -168.00,14.40,1.00,0.00,1.00 -172.80,9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-4.80,1.00,0.00,1.00 --172.80,-9.60,1.00,0.00,1.00 --168.00,-14.40,1.00,0.00,1.00 --163.20,-14.40,1.00,0.00,1.00 --163.20,-19.20,1.00,0.00,1.00 --158.40,-24.00,1.00,0.00,1.00 --153.60,-24.00,1.00,0.00,1.00 --148.80,-28.80,1.00,0.00,1.00 --144.00,-33.60,1.00,0.00,1.00 --139.20,-33.60,1.00,0.00,1.00 --134.40,-38.40,1.00,0.00,1.00 --129.60,-38.40,1.00,0.00,1.00 --124.80,-43.20,1.00,0.00,1.00 --120.00,-43.20,1.00,0.00,1.00 --110.40,-43.20,1.00,0.00,1.00 --105.60,-48.00,1.00,0.00,1.00 --100.80,-48.00,1.00,0.00,1.00 --91.20,-48.00,1.00,0.00,1.00 --86.40,-48.00,1.00,0.00,1.00 --76.80,-48.00,1.00,0.00,1.00 --72.00,-43.20,1.00,0.00,1.00 --62.40,-43.20,1.00,0.00,1.00 --57.60,-43.20,1.00,0.00,1.00 --52.80,-38.40,1.00,0.00,1.00 --48.00,-38.40,1.00,0.00,1.00 --43.20,-33.60,1.00,0.00,1.00 --38.40,-33.60,1.00,0.00,1.00 --33.60,-28.80,1.00,0.00,1.00 --28.80,-28.80,1.00,0.00,1.00 --24.00,-24.00,1.00,0.00,1.00 --19.20,-19.20,1.00,0.00,1.00 --19.20,-19.20,1.00,0.00,1.00 --14.40,-14.40,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 -9.60,9.60,1.00,0.00,1.00 -14.40,14.40,1.00,0.00,1.00 -19.20,14.40,1.00,0.00,1.00 -24.00,19.20,1.00,0.00,1.00 -24.00,24.00,1.00,0.00,1.00 -28.80,24.00,1.00,0.00,1.00 -33.60,28.80,1.00,0.00,1.00 -38.40,28.80,1.00,0.00,1.00 -43.20,33.60,1.00,0.00,1.00 -48.00,33.60,1.00,0.00,1.00 -52.80,38.40,1.00,0.00,1.00 -62.40,38.40,1.00,0.00,1.00 -67.20,38.40,1.00,0.00,1.00 -72.00,38.40,1.00,0.00,1.00 -76.80,43.20,1.00,0.00,1.00 -86.40,43.20,1.00,0.00,1.00 -91.20,43.20,1.00,0.00,1.00 -96.00,43.20,1.00,0.00,1.00 -105.60,43.20,1.00,0.00,1.00 -110.40,38.40,1.00,0.00,1.00 -115.20,38.40,1.00,0.00,1.00 -120.00,38.40,1.00,0.00,1.00 -129.60,33.60,1.00,0.00,1.00 -134.40,33.60,1.00,0.00,1.00 -139.20,28.80,1.00,0.00,1.00 -144.00,28.80,1.00,0.00,1.00 -148.80,24.00,1.00,0.00,1.00 -153.60,24.00,1.00,0.00,1.00 -153.60,19.20,1.00,0.00,1.00 -158.40,19.20,1.00,0.00,1.00 -163.20,14.40,1.00,0.00,1.00 -168.00,9.60,1.00,0.00,1.00 -172.80,9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-4.80,1.00,0.00,1.00 --172.80,-9.60,1.00,0.00,1.00 --168.00,-9.60,1.00,0.00,1.00 --163.20,-14.40,1.00,0.00,1.00 --158.40,-19.20,1.00,0.00,1.00 --153.60,-19.20,1.00,0.00,1.00 --153.60,-24.00,1.00,0.00,1.00 --148.80,-24.00,1.00,0.00,1.00 --144.00,-28.80,1.00,0.00,1.00 --139.20,-28.80,1.00,0.00,1.00 --134.40,-33.60,1.00,0.00,1.00 --129.60,-33.60,1.00,0.00,1.00 --120.00,-38.40,1.00,0.00,1.00 --115.20,-38.40,1.00,0.00,1.00 --110.40,-38.40,1.00,0.00,1.00 --105.60,-43.20,1.00,0.00,1.00 --96.00,-43.20,1.00,0.00,1.00 --91.20,-43.20,1.00,0.00,1.00 --86.40,-43.20,1.00,0.00,1.00 --76.80,-43.20,1.00,0.00,1.00 --72.00,-38.40,1.00,0.00,1.00 --67.20,-38.40,1.00,0.00,1.00 --62.40,-38.40,1.00,0.00,1.00 --52.80,-38.40,1.00,0.00,1.00 --48.00,-33.60,1.00,0.00,1.00 --43.20,-33.60,1.00,0.00,1.00 --38.40,-28.80,1.00,0.00,1.00 --33.60,-28.80,1.00,0.00,1.00 --28.80,-24.00,1.00,0.00,1.00 --24.00,-24.00,1.00,0.00,1.00 --24.00,-19.20,1.00,0.00,1.00 --19.20,-14.40,1.00,0.00,1.00 --14.40,-14.40,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 -9.60,9.60,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 -19.20,14.40,1.00,0.00,1.00 -24.00,19.20,1.00,0.00,1.00 -28.80,19.20,1.00,0.00,1.00 -33.60,24.00,1.00,0.00,1.00 -38.40,24.00,1.00,0.00,1.00 -43.20,28.80,1.00,0.00,1.00 -48.00,28.80,1.00,0.00,1.00 -52.80,28.80,1.00,0.00,1.00 -57.60,33.60,1.00,0.00,1.00 -62.40,33.60,1.00,0.00,1.00 -67.20,33.60,1.00,0.00,1.00 -72.00,38.40,1.00,0.00,1.00 -81.60,38.40,1.00,0.00,1.00 -86.40,38.40,1.00,0.00,1.00 -91.20,38.40,1.00,0.00,1.00 -96.00,38.40,1.00,0.00,1.00 -105.60,38.40,1.00,0.00,1.00 -110.40,33.60,1.00,0.00,1.00 -115.20,33.60,1.00,0.00,1.00 -120.00,33.60,1.00,0.00,1.00 -124.80,33.60,1.00,0.00,1.00 -129.60,28.80,1.00,0.00,1.00 -134.40,28.80,1.00,0.00,1.00 -139.20,24.00,1.00,0.00,1.00 -144.00,24.00,1.00,0.00,1.00 -148.80,19.20,1.00,0.00,1.00 -153.60,19.20,1.00,0.00,1.00 -158.40,14.40,1.00,0.00,1.00 -163.20,14.40,1.00,0.00,1.00 -168.00,9.60,1.00,0.00,1.00 -168.00,9.60,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-4.80,1.00,0.00,1.00 --168.00,-9.60,1.00,0.00,1.00 --168.00,-9.60,1.00,0.00,1.00 --163.20,-14.40,1.00,0.00,1.00 --158.40,-14.40,1.00,0.00,1.00 --153.60,-19.20,1.00,0.00,1.00 --148.80,-19.20,1.00,0.00,1.00 --144.00,-24.00,1.00,0.00,1.00 --139.20,-24.00,1.00,0.00,1.00 --134.40,-28.80,1.00,0.00,1.00 --129.60,-28.80,1.00,0.00,1.00 --124.80,-33.60,1.00,0.00,1.00 --120.00,-33.60,1.00,0.00,1.00 --115.20,-33.60,1.00,0.00,1.00 --110.40,-33.60,1.00,0.00,1.00 --105.60,-38.40,1.00,0.00,1.00 --96.00,-38.40,1.00,0.00,1.00 --91.20,-38.40,1.00,0.00,1.00 --86.40,-38.40,1.00,0.00,1.00 --81.60,-38.40,1.00,0.00,1.00 --72.00,-38.40,1.00,0.00,1.00 --67.20,-33.60,1.00,0.00,1.00 --62.40,-33.60,1.00,0.00,1.00 --57.60,-33.60,1.00,0.00,1.00 --52.80,-28.80,1.00,0.00,1.00 --48.00,-28.80,1.00,0.00,1.00 --43.20,-28.80,1.00,0.00,1.00 --38.40,-24.00,1.00,0.00,1.00 --33.60,-24.00,1.00,0.00,1.00 --28.80,-19.20,1.00,0.00,1.00 --24.00,-19.20,1.00,0.00,1.00 --19.20,-14.40,1.00,0.00,1.00 --14.40,-9.60,1.00,0.00,1.00 --9.60,-9.60,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,4.80,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 -14.40,9.60,1.00,0.00,1.00 -19.20,14.40,1.00,0.00,1.00 -24.00,14.40,1.00,0.00,1.00 -28.80,19.20,1.00,0.00,1.00 -33.60,19.20,1.00,0.00,1.00 -38.40,19.20,1.00,0.00,1.00 -43.20,24.00,1.00,0.00,1.00 -48.00,24.00,1.00,0.00,1.00 -52.80,28.80,1.00,0.00,1.00 -57.60,28.80,1.00,0.00,1.00 -62.40,28.80,1.00,0.00,1.00 -67.20,28.80,1.00,0.00,1.00 -76.80,33.60,1.00,0.00,1.00 -81.60,33.60,1.00,0.00,1.00 -86.40,33.60,1.00,0.00,1.00 -91.20,33.60,1.00,0.00,1.00 -96.00,33.60,1.00,0.00,1.00 -100.80,33.60,1.00,0.00,1.00 -110.40,28.80,1.00,0.00,1.00 -115.20,28.80,1.00,0.00,1.00 -120.00,28.80,1.00,0.00,1.00 -124.80,28.80,1.00,0.00,1.00 -129.60,24.00,1.00,0.00,1.00 -134.40,24.00,1.00,0.00,1.00 -139.20,24.00,1.00,0.00,1.00 -144.00,19.20,1.00,0.00,1.00 -148.80,19.20,1.00,0.00,1.00 -153.60,14.40,1.00,0.00,1.00 -158.40,14.40,1.00,0.00,1.00 -163.20,9.60,1.00,0.00,1.00 -168.00,9.60,1.00,0.00,1.00 -168.00,4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 --168.00,-9.60,1.00,0.00,1.00 --163.20,-9.60,1.00,0.00,1.00 --158.40,-14.40,1.00,0.00,1.00 --153.60,-14.40,1.00,0.00,1.00 --148.80,-19.20,1.00,0.00,1.00 --144.00,-19.20,1.00,0.00,1.00 --139.20,-24.00,1.00,0.00,1.00 --134.40,-24.00,1.00,0.00,1.00 --129.60,-24.00,1.00,0.00,1.00 --124.80,-28.80,1.00,0.00,1.00 --120.00,-28.80,1.00,0.00,1.00 --115.20,-28.80,1.00,0.00,1.00 --110.40,-28.80,1.00,0.00,1.00 --100.80,-33.60,1.00,0.00,1.00 --96.00,-33.60,1.00,0.00,1.00 --91.20,-33.60,1.00,0.00,1.00 --86.40,-33.60,1.00,0.00,1.00 --81.60,-33.60,1.00,0.00,1.00 --76.80,-33.60,1.00,0.00,1.00 --67.20,-28.80,1.00,0.00,1.00 --62.40,-28.80,1.00,0.00,1.00 --57.60,-28.80,1.00,0.00,1.00 --52.80,-28.80,1.00,0.00,1.00 --48.00,-24.00,1.00,0.00,1.00 --43.20,-24.00,1.00,0.00,1.00 --38.40,-19.20,1.00,0.00,1.00 --33.60,-19.20,1.00,0.00,1.00 --28.80,-19.20,1.00,0.00,1.00 --24.00,-14.40,1.00,0.00,1.00 --19.20,-14.40,1.00,0.00,1.00 --14.40,-9.60,1.00,0.00,1.00 --14.40,-9.60,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 --4.80,-4.80,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 -14.40,4.80,1.00,0.00,1.00 -19.20,9.60,1.00,0.00,1.00 -19.20,9.60,1.00,0.00,1.00 -24.00,14.40,1.00,0.00,1.00 -28.80,14.40,1.00,0.00,1.00 -33.60,14.40,1.00,0.00,1.00 -38.40,19.20,1.00,0.00,1.00 -43.20,19.20,1.00,0.00,1.00 -48.00,24.00,1.00,0.00,1.00 -52.80,24.00,1.00,0.00,1.00 -57.60,24.00,1.00,0.00,1.00 -62.40,24.00,1.00,0.00,1.00 -72.00,24.00,1.00,0.00,1.00 -76.80,28.80,1.00,0.00,1.00 -81.60,28.80,1.00,0.00,1.00 -86.40,28.80,1.00,0.00,1.00 -91.20,28.80,1.00,0.00,1.00 -96.00,28.80,1.00,0.00,1.00 -100.80,28.80,1.00,0.00,1.00 -105.60,28.80,1.00,0.00,1.00 -110.40,24.00,1.00,0.00,1.00 -120.00,24.00,1.00,0.00,1.00 -124.80,24.00,1.00,0.00,1.00 -129.60,24.00,1.00,0.00,1.00 -134.40,19.20,1.00,0.00,1.00 -139.20,19.20,1.00,0.00,1.00 -144.00,19.20,1.00,0.00,1.00 -148.80,14.40,1.00,0.00,1.00 -153.60,14.40,1.00,0.00,1.00 -158.40,9.60,1.00,0.00,1.00 -158.40,9.60,1.00,0.00,1.00 -163.20,9.60,1.00,0.00,1.00 -168.00,4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 --163.20,-9.60,1.00,0.00,1.00 --158.40,-9.60,1.00,0.00,1.00 --158.40,-9.60,1.00,0.00,1.00 --153.60,-14.40,1.00,0.00,1.00 --148.80,-14.40,1.00,0.00,1.00 --144.00,-19.20,1.00,0.00,1.00 --139.20,-19.20,1.00,0.00,1.00 --134.40,-19.20,1.00,0.00,1.00 --129.60,-24.00,1.00,0.00,1.00 --124.80,-24.00,1.00,0.00,1.00 --120.00,-24.00,1.00,0.00,1.00 --110.40,-24.00,1.00,0.00,1.00 --105.60,-28.80,1.00,0.00,1.00 --100.80,-28.80,1.00,0.00,1.00 --96.00,-28.80,1.00,0.00,1.00 --91.20,-28.80,1.00,0.00,1.00 --86.40,-28.80,1.00,0.00,1.00 --81.60,-28.80,1.00,0.00,1.00 --76.80,-28.80,1.00,0.00,1.00 --72.00,-24.00,1.00,0.00,1.00 --62.40,-24.00,1.00,0.00,1.00 --57.60,-24.00,1.00,0.00,1.00 --52.80,-24.00,1.00,0.00,1.00 --48.00,-24.00,1.00,0.00,1.00 --43.20,-19.20,1.00,0.00,1.00 --38.40,-19.20,1.00,0.00,1.00 --33.60,-14.40,1.00,0.00,1.00 --28.80,-14.40,1.00,0.00,1.00 --24.00,-14.40,1.00,0.00,1.00 --19.20,-9.60,1.00,0.00,1.00 --19.20,-9.60,1.00,0.00,1.00 --14.40,-4.80,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 -14.40,4.80,1.00,0.00,1.00 -19.20,9.60,1.00,0.00,1.00 -24.00,9.60,1.00,0.00,1.00 -28.80,9.60,1.00,0.00,1.00 -33.60,14.40,1.00,0.00,1.00 -38.40,14.40,1.00,0.00,1.00 -43.20,14.40,1.00,0.00,1.00 -48.00,14.40,1.00,0.00,1.00 -52.80,19.20,1.00,0.00,1.00 -57.60,19.20,1.00,0.00,1.00 -62.40,19.20,1.00,0.00,1.00 -67.20,19.20,1.00,0.00,1.00 -72.00,24.00,1.00,0.00,1.00 -76.80,24.00,1.00,0.00,1.00 -81.60,24.00,1.00,0.00,1.00 -86.40,24.00,1.00,0.00,1.00 -91.20,24.00,1.00,0.00,1.00 -96.00,24.00,1.00,0.00,1.00 -100.80,24.00,1.00,0.00,1.00 -105.60,24.00,1.00,0.00,1.00 -110.40,19.20,1.00,0.00,1.00 -115.20,19.20,1.00,0.00,1.00 -120.00,19.20,1.00,0.00,1.00 -124.80,19.20,1.00,0.00,1.00 -129.60,19.20,1.00,0.00,1.00 -134.40,14.40,1.00,0.00,1.00 -139.20,14.40,1.00,0.00,1.00 -144.00,14.40,1.00,0.00,1.00 -148.80,9.60,1.00,0.00,1.00 -153.60,9.60,1.00,0.00,1.00 -158.40,9.60,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 -168.00,4.80,1.00,0.00,1.00 -172.80,4.80,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-4.80,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 --163.20,-4.80,1.00,0.00,1.00 --158.40,-9.60,1.00,0.00,1.00 --153.60,-9.60,1.00,0.00,1.00 --148.80,-9.60,1.00,0.00,1.00 --144.00,-14.40,1.00,0.00,1.00 --139.20,-14.40,1.00,0.00,1.00 --134.40,-14.40,1.00,0.00,1.00 --129.60,-19.20,1.00,0.00,1.00 --124.80,-19.20,1.00,0.00,1.00 --120.00,-19.20,1.00,0.00,1.00 --115.20,-19.20,1.00,0.00,1.00 --110.40,-19.20,1.00,0.00,1.00 --105.60,-24.00,1.00,0.00,1.00 --100.80,-24.00,1.00,0.00,1.00 --96.00,-24.00,1.00,0.00,1.00 --91.20,-24.00,1.00,0.00,1.00 --86.40,-24.00,1.00,0.00,1.00 --81.60,-24.00,1.00,0.00,1.00 --76.80,-24.00,1.00,0.00,1.00 --72.00,-24.00,1.00,0.00,1.00 --67.20,-19.20,1.00,0.00,1.00 --62.40,-19.20,1.00,0.00,1.00 --57.60,-19.20,1.00,0.00,1.00 --52.80,-19.20,1.00,0.00,1.00 --48.00,-14.40,1.00,0.00,1.00 --43.20,-14.40,1.00,0.00,1.00 --38.40,-14.40,1.00,0.00,1.00 --33.60,-14.40,1.00,0.00,1.00 --28.80,-9.60,1.00,0.00,1.00 --24.00,-9.60,1.00,0.00,1.00 --19.20,-9.60,1.00,0.00,1.00 --14.40,-4.80,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 -9.60,4.80,1.00,0.00,1.00 -14.40,4.80,1.00,0.00,1.00 -19.20,4.80,1.00,0.00,1.00 -24.00,9.60,1.00,0.00,1.00 -28.80,9.60,1.00,0.00,1.00 -33.60,9.60,1.00,0.00,1.00 -38.40,9.60,1.00,0.00,1.00 -43.20,14.40,1.00,0.00,1.00 -48.00,14.40,1.00,0.00,1.00 -52.80,14.40,1.00,0.00,1.00 -57.60,14.40,1.00,0.00,1.00 -62.40,14.40,1.00,0.00,1.00 -67.20,14.40,1.00,0.00,1.00 -72.00,19.20,1.00,0.00,1.00 -76.80,19.20,1.00,0.00,1.00 -81.60,19.20,1.00,0.00,1.00 -86.40,19.20,1.00,0.00,1.00 -91.20,19.20,1.00,0.00,1.00 -96.00,19.20,1.00,0.00,1.00 -100.80,19.20,1.00,0.00,1.00 -105.60,19.20,1.00,0.00,1.00 -110.40,19.20,1.00,0.00,1.00 -115.20,14.40,1.00,0.00,1.00 -120.00,14.40,1.00,0.00,1.00 -124.80,14.40,1.00,0.00,1.00 -129.60,14.40,1.00,0.00,1.00 -134.40,14.40,1.00,0.00,1.00 -139.20,9.60,1.00,0.00,1.00 -144.00,9.60,1.00,0.00,1.00 -148.80,9.60,1.00,0.00,1.00 -153.60,9.60,1.00,0.00,1.00 -158.40,4.80,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 -168.00,4.80,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-0.00,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 --163.20,-4.80,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 --153.60,-9.60,1.00,0.00,1.00 --148.80,-9.60,1.00,0.00,1.00 --144.00,-9.60,1.00,0.00,1.00 --139.20,-9.60,1.00,0.00,1.00 --134.40,-14.40,1.00,0.00,1.00 --129.60,-14.40,1.00,0.00,1.00 --124.80,-14.40,1.00,0.00,1.00 --120.00,-14.40,1.00,0.00,1.00 --115.20,-14.40,1.00,0.00,1.00 --110.40,-19.20,1.00,0.00,1.00 --105.60,-19.20,1.00,0.00,1.00 --100.80,-19.20,1.00,0.00,1.00 --96.00,-19.20,1.00,0.00,1.00 --91.20,-19.20,1.00,0.00,1.00 --86.40,-19.20,1.00,0.00,1.00 --81.60,-19.20,1.00,0.00,1.00 --76.80,-19.20,1.00,0.00,1.00 --72.00,-19.20,1.00,0.00,1.00 --67.20,-14.40,1.00,0.00,1.00 --62.40,-14.40,1.00,0.00,1.00 --57.60,-14.40,1.00,0.00,1.00 --52.80,-14.40,1.00,0.00,1.00 --48.00,-14.40,1.00,0.00,1.00 --43.20,-14.40,1.00,0.00,1.00 --38.40,-9.60,1.00,0.00,1.00 --33.60,-9.60,1.00,0.00,1.00 --28.80,-9.60,1.00,0.00,1.00 --24.00,-9.60,1.00,0.00,1.00 --19.20,-4.80,1.00,0.00,1.00 --14.40,-4.80,1.00,0.00,1.00 --9.60,-4.80,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 -9.60,0.00,1.00,0.00,1.00 -14.40,4.80,1.00,0.00,1.00 -19.20,4.80,1.00,0.00,1.00 -24.00,4.80,1.00,0.00,1.00 -28.80,4.80,1.00,0.00,1.00 -33.60,9.60,1.00,0.00,1.00 -38.40,9.60,1.00,0.00,1.00 -43.20,9.60,1.00,0.00,1.00 -48.00,9.60,1.00,0.00,1.00 -52.80,9.60,1.00,0.00,1.00 -57.60,9.60,1.00,0.00,1.00 -62.40,9.60,1.00,0.00,1.00 -67.20,14.40,1.00,0.00,1.00 -72.00,14.40,1.00,0.00,1.00 -76.80,14.40,1.00,0.00,1.00 -81.60,14.40,1.00,0.00,1.00 -86.40,14.40,1.00,0.00,1.00 -91.20,14.40,1.00,0.00,1.00 -96.00,14.40,1.00,0.00,1.00 -100.80,14.40,1.00,0.00,1.00 -105.60,14.40,1.00,0.00,1.00 -110.40,14.40,1.00,0.00,1.00 -115.20,9.60,1.00,0.00,1.00 -120.00,9.60,1.00,0.00,1.00 -124.80,9.60,1.00,0.00,1.00 -129.60,9.60,1.00,0.00,1.00 -134.40,9.60,1.00,0.00,1.00 -139.20,9.60,1.00,0.00,1.00 -144.00,9.60,1.00,0.00,1.00 -148.80,4.80,1.00,0.00,1.00 -153.60,4.80,1.00,0.00,1.00 -158.40,4.80,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 -168.00,4.80,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-0.00,1.00,0.00,1.00 --168.00,-4.80,1.00,0.00,1.00 --163.20,-4.80,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 --153.60,-4.80,1.00,0.00,1.00 --148.80,-4.80,1.00,0.00,1.00 --144.00,-9.60,1.00,0.00,1.00 --139.20,-9.60,1.00,0.00,1.00 --134.40,-9.60,1.00,0.00,1.00 --129.60,-9.60,1.00,0.00,1.00 --124.80,-9.60,1.00,0.00,1.00 --120.00,-9.60,1.00,0.00,1.00 --115.20,-9.60,1.00,0.00,1.00 --110.40,-14.40,1.00,0.00,1.00 --105.60,-14.40,1.00,0.00,1.00 --100.80,-14.40,1.00,0.00,1.00 --96.00,-14.40,1.00,0.00,1.00 --91.20,-14.40,1.00,0.00,1.00 --86.40,-14.40,1.00,0.00,1.00 --81.60,-14.40,1.00,0.00,1.00 --76.80,-14.40,1.00,0.00,1.00 --72.00,-14.40,1.00,0.00,1.00 --67.20,-14.40,1.00,0.00,1.00 --62.40,-9.60,1.00,0.00,1.00 --57.60,-9.60,1.00,0.00,1.00 --52.80,-9.60,1.00,0.00,1.00 --48.00,-9.60,1.00,0.00,1.00 --43.20,-9.60,1.00,0.00,1.00 --38.40,-9.60,1.00,0.00,1.00 --33.60,-9.60,1.00,0.00,1.00 --28.80,-4.80,1.00,0.00,1.00 --24.00,-4.80,1.00,0.00,1.00 --19.20,-4.80,1.00,0.00,1.00 --14.40,-4.80,1.00,0.00,1.00 --9.60,-0.00,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 -9.60,0.00,1.00,0.00,1.00 -14.40,0.00,1.00,0.00,1.00 -19.20,4.80,1.00,0.00,1.00 -24.00,4.80,1.00,0.00,1.00 -28.80,4.80,1.00,0.00,1.00 -33.60,4.80,1.00,0.00,1.00 -38.40,4.80,1.00,0.00,1.00 -43.20,4.80,1.00,0.00,1.00 -48.00,4.80,1.00,0.00,1.00 -52.80,4.80,1.00,0.00,1.00 -57.60,4.80,1.00,0.00,1.00 -62.40,9.60,1.00,0.00,1.00 -67.20,9.60,1.00,0.00,1.00 -72.00,9.60,1.00,0.00,1.00 -76.80,9.60,1.00,0.00,1.00 -81.60,9.60,1.00,0.00,1.00 -86.40,9.60,1.00,0.00,1.00 -91.20,9.60,1.00,0.00,1.00 -96.00,9.60,1.00,0.00,1.00 -100.80,9.60,1.00,0.00,1.00 -105.60,9.60,1.00,0.00,1.00 -110.40,9.60,1.00,0.00,1.00 -115.20,9.60,1.00,0.00,1.00 -120.00,9.60,1.00,0.00,1.00 -124.80,4.80,1.00,0.00,1.00 -129.60,4.80,1.00,0.00,1.00 -134.40,4.80,1.00,0.00,1.00 -139.20,4.80,1.00,0.00,1.00 -144.00,4.80,1.00,0.00,1.00 -148.80,4.80,1.00,0.00,1.00 -153.60,4.80,1.00,0.00,1.00 -158.40,4.80,1.00,0.00,1.00 -163.20,4.80,1.00,0.00,1.00 -168.00,0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-0.00,1.00,0.00,1.00 --168.00,-0.00,1.00,0.00,1.00 --163.20,-4.80,1.00,0.00,1.00 --158.40,-4.80,1.00,0.00,1.00 --153.60,-4.80,1.00,0.00,1.00 --148.80,-4.80,1.00,0.00,1.00 --144.00,-4.80,1.00,0.00,1.00 --139.20,-4.80,1.00,0.00,1.00 --134.40,-4.80,1.00,0.00,1.00 --129.60,-4.80,1.00,0.00,1.00 --124.80,-4.80,1.00,0.00,1.00 --120.00,-9.60,1.00,0.00,1.00 --115.20,-9.60,1.00,0.00,1.00 --110.40,-9.60,1.00,0.00,1.00 --105.60,-9.60,1.00,0.00,1.00 --100.80,-9.60,1.00,0.00,1.00 --96.00,-9.60,1.00,0.00,1.00 --91.20,-9.60,1.00,0.00,1.00 --86.40,-9.60,1.00,0.00,1.00 --81.60,-9.60,1.00,0.00,1.00 --76.80,-9.60,1.00,0.00,1.00 --72.00,-9.60,1.00,0.00,1.00 --67.20,-9.60,1.00,0.00,1.00 --62.40,-9.60,1.00,0.00,1.00 --57.60,-4.80,1.00,0.00,1.00 --52.80,-4.80,1.00,0.00,1.00 --48.00,-4.80,1.00,0.00,1.00 --43.20,-4.80,1.00,0.00,1.00 --38.40,-4.80,1.00,0.00,1.00 --33.60,-4.80,1.00,0.00,1.00 --28.80,-4.80,1.00,0.00,1.00 --24.00,-4.80,1.00,0.00,1.00 --19.20,-4.80,1.00,0.00,1.00 --14.40,-0.00,1.00,0.00,1.00 --9.60,-0.00,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,0.00,1.00,0.00,1.00 -9.60,0.00,1.00,0.00,1.00 -14.40,0.00,1.00,0.00,1.00 -19.20,0.00,1.00,0.00,1.00 -24.00,0.00,1.00,0.00,1.00 -28.80,0.00,1.00,0.00,1.00 -33.60,0.00,1.00,0.00,1.00 -38.40,0.00,1.00,0.00,1.00 -43.20,4.80,1.00,0.00,1.00 -48.00,4.80,1.00,0.00,1.00 -52.80,4.80,1.00,0.00,1.00 -57.60,4.80,1.00,0.00,1.00 -62.40,4.80,1.00,0.00,1.00 -67.20,4.80,1.00,0.00,1.00 -72.00,4.80,1.00,0.00,1.00 -76.80,4.80,1.00,0.00,1.00 -81.60,4.80,1.00,0.00,1.00 -86.40,4.80,1.00,0.00,1.00 -91.20,4.80,1.00,0.00,1.00 -96.00,4.80,1.00,0.00,1.00 -100.80,4.80,1.00,0.00,1.00 -105.60,4.80,1.00,0.00,1.00 -110.40,4.80,1.00,0.00,1.00 -115.20,4.80,1.00,0.00,1.00 -120.00,4.80,1.00,0.00,1.00 -124.80,4.80,1.00,0.00,1.00 -129.60,4.80,1.00,0.00,1.00 -134.40,4.80,1.00,0.00,1.00 -139.20,0.00,1.00,0.00,1.00 -144.00,0.00,1.00,0.00,1.00 -148.80,0.00,1.00,0.00,1.00 -153.60,0.00,1.00,0.00,1.00 -158.40,0.00,1.00,0.00,1.00 -163.20,0.00,1.00,0.00,1.00 -168.00,0.00,1.00,0.00,1.00 -172.80,0.00,1.00,0.00,1.00 -177.60,0.00,1.00,0.00,1.00 --177.60,-0.00,1.00,0.00,1.00 --172.80,-0.00,1.00,0.00,1.00 --168.00,-0.00,1.00,0.00,1.00 --163.20,-0.00,1.00,0.00,1.00 --158.40,-0.00,1.00,0.00,1.00 --153.60,-0.00,1.00,0.00,1.00 --148.80,-0.00,1.00,0.00,1.00 --144.00,-0.00,1.00,0.00,1.00 --139.20,-0.00,1.00,0.00,1.00 --134.40,-4.80,1.00,0.00,1.00 --129.60,-4.80,1.00,0.00,1.00 --124.80,-4.80,1.00,0.00,1.00 --120.00,-4.80,1.00,0.00,1.00 --115.20,-4.80,1.00,0.00,1.00 --110.40,-4.80,1.00,0.00,1.00 --105.60,-4.80,1.00,0.00,1.00 --100.80,-4.80,1.00,0.00,1.00 --96.00,-4.80,1.00,0.00,1.00 --91.20,-4.80,1.00,0.00,1.00 --86.40,-4.80,1.00,0.00,1.00 --81.60,-4.80,1.00,0.00,1.00 --76.80,-4.80,1.00,0.00,1.00 --72.00,-4.80,1.00,0.00,1.00 --67.20,-4.80,1.00,0.00,1.00 --62.40,-4.80,1.00,0.00,1.00 --57.60,-4.80,1.00,0.00,1.00 --52.80,-4.80,1.00,0.00,1.00 --48.00,-4.80,1.00,0.00,1.00 --43.20,-4.80,1.00,0.00,1.00 --38.40,-0.00,1.00,0.00,1.00 --33.60,-0.00,1.00,0.00,1.00 --28.80,-0.00,1.00,0.00,1.00 --24.00,-0.00,1.00,0.00,1.00 --19.20,-0.00,1.00,0.00,1.00 --14.40,-0.00,1.00,0.00,1.00 --9.60,-0.00,1.00,0.00,1.00 --4.80,-0.00,1.00,0.00,1.00 -0.00,0.00,1.00,0.00,1.00 -4.80,-0.00,1.00,0.00,1.00 -9.60,-0.00,1.00,0.00,1.00 -14.40,-0.00,1.00,0.00,1.00 -19.20,-0.00,1.00,0.00,1.00 -24.00,-0.00,1.00,0.00,1.00 -28.80,-0.00,1.00,0.00,1.00 -33.60,-0.00,1.00,0.00,1.00 -38.40,-0.00,1.00,0.00,1.00 -43.20,-0.00,1.00,0.00,1.00 -48.00,-0.00,1.00,0.00,1.00 -52.80,-0.00,1.00,0.00,1.00 -57.60,-0.00,1.00,0.00,1.00 -62.40,-0.00,1.00,0.00,1.00 -67.20,-0.00,1.00,0.00,1.00 -72.00,-0.00,1.00,0.00,1.00 -76.80,-0.00,1.00,0.00,1.00 -81.60,-0.00,1.00,0.00,1.00 -86.40,-0.00,1.00,0.00,1.00 -91.20,-0.00,1.00,0.00,1.00 -96.00,-0.00,1.00,0.00,1.00 -100.80,-0.00,1.00,0.00,1.00 -105.60,-0.00,1.00,0.00,1.00 -110.40,-0.00,1.00,0.00,1.00 -115.20,-0.00,1.00,0.00,1.00 -120.00,-0.00,1.00,0.00,1.00 -124.80,-0.00,1.00,0.00,1.00 -129.60,-0.00,1.00,0.00,1.00 -134.40,-0.00,1.00,0.00,1.00 -139.20,-0.00,1.00,0.00,1.00 -144.00,-0.00,1.00,0.00,1.00 -148.80,-0.00,1.00,0.00,1.00 -153.60,-0.00,1.00,0.00,1.00 -158.40,-0.00,1.00,0.00,1.00 -163.20,-0.00,1.00,0.00,1.00 -168.00,-0.00,1.00,0.00,1.00 -172.80,-0.00,1.00,0.00,1.00 -177.60,-0.00,1.00,0.00,1.00 --177.60,0.00,1.00,0.00,1.00 --172.80,0.00,1.00,0.00,1.00 --168.00,0.00,1.00,0.00,1.00 --163.20,0.00,1.00,0.00,1.00 --158.40,0.00,1.00,0.00,1.00 --153.60,0.00,1.00,0.00,1.00 --148.80,0.00,1.00,0.00,1.00 --144.00,0.00,1.00,0.00,1.00 --139.20,0.00,1.00,0.00,1.00 --134.40,0.00,1.00,0.00,1.00 --129.60,0.00,1.00,0.00,1.00 --124.80,0.00,1.00,0.00,1.00 --120.00,0.00,1.00,0.00,1.00 --115.20,0.00,1.00,0.00,1.00 --110.40,0.00,1.00,0.00,1.00 --105.60,0.00,1.00,0.00,1.00 --100.80,0.00,1.00,0.00,1.00 --96.00,0.00,1.00,0.00,1.00 --91.20,0.00,1.00,0.00,1.00 --86.40,0.00,1.00,0.00,1.00 --81.60,0.00,1.00,0.00,1.00 --76.80,0.00,1.00,0.00,1.00 --72.00,0.00,1.00,0.00,1.00 --67.20,0.00,1.00,0.00,1.00 --62.40,0.00,1.00,0.00,1.00 --57.60,0.00,1.00,0.00,1.00 --52.80,0.00,1.00,0.00,1.00 --48.00,0.00,1.00,0.00,1.00 --43.20,0.00,1.00,0.00,1.00 --38.40,0.00,1.00,0.00,1.00 --33.60,0.00,1.00,0.00,1.00 --28.80,0.00,1.00,0.00,1.00 --24.00,0.00,1.00,0.00,1.00 --19.20,0.00,1.00,0.00,1.00 --14.40,0.00,1.00,0.00,1.00 --9.60,0.00,1.00,0.00,1.00 --4.80,0.00,1.00,0.00,1.00 +-0.00,0.00,0.00,0.00,1.00,0.00,4.80 +-0.00,4.80,0.06,0.00,1.00,4.80,9.60 +-0.00,9.60,0.13,0.00,1.00,9.60,14.40 +-0.00,14.40,0.19,0.00,1.00,14.40,19.20 +-0.00,19.20,0.26,0.00,1.00,19.20,24.00 +-0.00,24.00,0.32,0.00,1.00,24.00,28.80 +-0.00,28.80,0.39,0.00,1.00,28.80,33.60 +-0.00,33.60,0.45,0.00,1.00,33.60,38.40 +-0.00,38.40,0.51,0.00,1.00,38.40,43.20 +-0.00,43.20,0.58,0.00,1.00,43.20,48.00 +-0.00,48.00,0.64,0.00,1.00,48.00,52.80 +-0.00,52.80,0.71,0.00,1.00,52.80,57.60 +-0.00,57.60,0.77,0.00,1.00,57.60,62.40 +-0.00,62.40,0.84,0.00,1.00,62.40,67.20 +-0.00,67.20,0.90,0.00,1.00,67.20,72.00 +-0.00,72.00,0.96,0.00,1.00,72.00,76.80 +-0.00,76.80,1.03,0.00,1.00,76.80,81.60 +-0.00,81.60,1.09,0.00,1.00,81.60,86.40 +-0.00,86.40,1.16,0.00,1.00,86.40,86.40 +-177.60,89.20,1.22,0.00,1.00,91.20,81.60 +-177.60,86.40,1.29,0.00,1.00,96.00,76.80 +-177.60,81.60,1.35,0.00,1.00,100.80,72.00 +-177.60,76.80,1.41,0.00,1.00,105.60,67.20 +-177.60,72.00,1.48,0.00,1.00,110.40,62.40 +-177.60,67.20,1.54,0.00,1.00,115.20,57.60 +177.60,62.40,1.61,0.00,1.00,120.00,52.80 +177.60,57.60,1.67,0.00,1.00,124.80,48.00 +177.60,52.80,1.73,0.00,1.00,129.60,43.20 +177.60,48.00,1.80,0.00,1.00,134.40,38.40 +177.60,43.20,1.86,0.00,1.00,139.20,33.60 +177.60,38.40,1.93,0.00,1.00,144.00,28.80 +177.60,33.60,1.99,0.00,1.00,148.80,24.00 +177.60,28.80,2.06,0.00,1.00,153.60,19.20 +177.60,24.00,2.12,0.00,1.00,158.40,14.40 +177.60,19.20,2.18,0.00,1.00,163.20,9.60 +177.60,14.40,2.25,0.00,1.00,168.00,4.80 +177.60,9.60,2.31,0.00,1.00,172.80,0.00 +177.60,4.80,2.38,0.00,1.00,177.60,-0.00 +-177.60,-0.00,2.44,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,2.51,0.00,1.00,-172.80,-9.60 +-177.60,-9.60,2.57,0.00,1.00,-168.00,-14.40 +-177.60,-14.40,2.63,0.00,1.00,-163.20,-19.20 +-177.60,-19.20,2.70,0.00,1.00,-158.40,-24.00 +-177.60,-24.00,2.76,0.00,1.00,-153.60,-28.80 +-177.60,-28.80,2.83,0.00,1.00,-148.80,-33.60 +-177.60,-33.60,2.89,0.00,1.00,-144.00,-38.40 +-177.60,-38.40,2.96,0.00,1.00,-139.20,-43.20 +-177.60,-48.00,3.02,0.00,1.00,-134.40,-48.00 +-177.60,-48.00,3.08,0.00,1.00,-129.60,-52.80 +-177.60,-52.80,3.15,0.00,1.00,-124.80,-57.60 +-177.60,-57.60,3.21,0.00,1.00,-120.00,-62.40 +177.60,-62.40,3.28,0.00,1.00,-115.20,-67.20 +177.60,-67.20,3.34,0.00,1.00,-110.40,-72.00 +177.60,-76.80,3.41,0.00,1.00,-105.60,-76.80 +177.60,-76.80,3.47,0.00,1.00,-100.80,-81.60 +177.60,-86.40,3.53,0.00,1.00,-96.00,-86.40 +177.60,-89.20,3.60,0.00,1.00,-91.20,-86.40 +0.00,-86.40,3.66,0.00,1.00,-86.40,-81.60 +0.00,-81.60,3.73,0.00,1.00,-81.60,-76.80 +0.00,-76.80,3.79,0.00,1.00,-76.80,-72.00 +0.00,-72.00,3.86,0.00,1.00,-72.00,-67.20 +0.00,-67.20,3.92,0.00,1.00,-67.20,-62.40 +0.00,-62.40,3.98,0.00,1.00,-62.40,-57.60 +0.00,-57.60,4.05,0.00,1.00,-57.60,-52.80 +0.00,-52.80,4.11,0.00,1.00,-52.80,-48.00 +0.00,-48.00,4.18,0.00,1.00,-48.00,-43.20 +0.00,-43.20,4.24,0.00,1.00,-43.20,-38.40 +0.00,-38.40,4.31,0.00,1.00,-38.40,-33.60 +0.00,-33.60,4.37,0.00,1.00,-33.60,-28.80 +0.00,-28.80,4.43,0.00,1.00,-28.80,-24.00 +0.00,-24.00,4.50,0.00,1.00,-24.00,-19.20 +0.00,-19.20,4.56,0.00,1.00,-19.20,-14.40 +0.00,-14.40,4.63,0.00,1.00,-14.40,-9.60 +0.00,-9.60,4.69,0.00,1.00,-9.60,-4.80 +0.00,-4.80,4.76,0.00,1.00,-4.80,0.00 +0.00,0.00,4.82,0.00,1.00,0.00,4.80 +0.00,4.80,4.88,0.00,1.00,4.80,9.60 +0.00,9.60,4.95,0.00,1.00,9.60,14.40 +0.00,14.40,5.01,0.00,1.00,14.40,19.20 +0.00,19.20,5.08,0.00,1.00,19.20,24.00 +0.00,24.00,5.14,0.00,1.00,24.00,28.80 +4.80,28.80,5.20,0.00,1.00,28.80,33.60 +4.80,33.60,5.27,0.00,1.00,33.60,38.40 +4.80,38.40,5.33,0.00,1.00,38.40,43.20 +4.80,43.20,5.40,0.00,1.00,43.20,48.00 +4.80,48.00,5.46,0.00,1.00,48.00,52.80 +4.80,52.80,5.53,0.00,1.00,52.80,57.60 +9.60,57.60,5.59,0.00,1.00,57.60,62.40 +9.60,62.40,5.65,0.00,1.00,62.40,67.20 +9.60,67.20,5.72,0.00,1.00,67.20,72.00 +14.40,72.00,5.78,0.00,1.00,72.00,76.80 +19.20,76.80,5.85,0.00,1.00,76.80,81.60 +28.80,81.60,5.91,0.00,1.00,81.60,86.40 +52.80,86.40,5.98,0.00,1.00,86.40,86.40 +105.60,86.40,6.04,0.00,1.00,91.20,81.60 +139.20,81.60,6.10,0.00,1.00,96.00,76.80 +158.40,76.80,6.17,0.00,1.00,100.80,72.00 +163.20,72.00,6.23,0.00,1.00,105.60,67.20 +168.00,67.20,6.30,0.00,1.00,110.40,62.40 +168.00,62.40,6.36,0.00,1.00,115.20,57.60 +172.80,57.60,6.43,0.00,1.00,120.00,52.80 +172.80,52.80,6.49,0.00,1.00,124.80,48.00 +172.80,48.00,6.55,0.00,1.00,129.60,43.20 +172.80,43.20,6.62,0.00,1.00,134.40,38.40 +177.60,38.40,6.68,0.00,1.00,139.20,33.60 +177.60,33.60,6.75,0.00,1.00,144.00,28.80 +177.60,28.80,6.81,0.00,1.00,148.80,24.00 +177.60,24.00,6.88,0.00,1.00,153.60,19.20 +177.60,19.20,6.94,0.00,1.00,158.40,14.40 +177.60,14.40,7.00,0.00,1.00,163.20,9.60 +177.60,9.60,7.07,0.00,1.00,168.00,4.80 +177.60,4.80,7.13,0.00,1.00,172.80,0.00 +177.60,0.00,7.20,0.00,1.00,177.60,-0.00 +-177.60,-0.00,7.26,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,7.33,0.00,1.00,-172.80,-9.60 +-177.60,-9.60,7.39,0.00,1.00,-168.00,-14.40 +-177.60,-14.40,7.45,0.00,1.00,-163.20,-19.20 +-177.60,-19.20,7.52,0.00,1.00,-158.40,-24.00 +-177.60,-24.00,7.58,0.00,1.00,-153.60,-28.80 +-177.60,-28.80,7.65,0.00,1.00,-148.80,-33.60 +-177.60,-33.60,7.71,0.00,1.00,-144.00,-38.40 +-177.60,-38.40,7.78,0.00,1.00,-139.20,-43.20 +-172.80,-43.20,7.84,0.00,1.00,-134.40,-48.00 +-172.80,-48.00,7.90,0.00,1.00,-129.60,-52.80 +-172.80,-52.80,7.97,0.00,1.00,-124.80,-57.60 +-172.80,-57.60,8.03,0.00,1.00,-120.00,-62.40 +-168.00,-62.40,8.10,0.00,1.00,-115.20,-67.20 +-168.00,-67.20,8.16,0.00,1.00,-110.40,-72.00 +-163.20,-72.00,8.22,0.00,1.00,-105.60,-76.80 +-158.40,-76.80,8.29,0.00,1.00,-100.80,-81.60 +-139.20,-81.60,8.35,0.00,1.00,-96.00,-86.40 +-105.60,-86.40,8.42,0.00,1.00,-91.20,-86.40 +-52.80,-86.40,8.48,0.00,1.00,-86.40,-81.60 +-28.80,-81.60,8.55,0.00,1.00,-81.60,-76.80 +-19.20,-76.80,8.61,0.00,1.00,-76.80,-72.00 +-14.40,-72.00,8.67,0.00,1.00,-72.00,-67.20 +-9.60,-67.20,8.74,0.00,1.00,-67.20,-62.40 +-9.60,-62.40,8.80,0.00,1.00,-62.40,-57.60 +-9.60,-57.60,8.87,0.00,1.00,-57.60,-52.80 +-4.80,-52.80,8.93,0.00,1.00,-52.80,-48.00 +-4.80,-48.00,9.00,0.00,1.00,-48.00,-43.20 +-4.80,-43.20,9.06,0.00,1.00,-43.20,-38.40 +-4.80,-38.40,9.12,0.00,1.00,-38.40,-33.60 +-4.80,-33.60,9.19,0.00,1.00,-33.60,-28.80 +-4.80,-28.80,9.25,0.00,1.00,-28.80,-24.00 +-0.00,-24.00,9.32,0.00,1.00,-24.00,-19.20 +-0.00,-19.20,9.38,0.00,1.00,-19.20,-14.40 +-0.00,-14.40,9.45,0.00,1.00,-14.40,-9.60 +-0.00,-9.60,9.51,0.00,1.00,-9.60,-4.80 +-0.00,-4.80,9.57,0.00,1.00,-4.80,0.00 +0.00,0.00,9.64,0.00,1.00,0.00,4.80 +0.00,4.80,9.70,0.00,1.00,4.80,9.60 +0.00,9.60,9.77,0.00,1.00,9.60,14.40 +4.80,14.40,9.83,0.00,1.00,14.40,19.20 +4.80,19.20,9.90,0.00,1.00,19.20,24.00 +4.80,24.00,9.96,0.00,1.00,24.00,28.80 +4.80,28.80,10.02,0.00,1.00,28.80,33.60 +4.80,33.60,10.09,0.00,1.00,33.60,38.40 +9.60,38.40,10.15,0.00,1.00,38.40,43.20 +9.60,43.20,10.22,0.00,1.00,43.20,48.00 +9.60,48.00,10.28,0.00,1.00,48.00,52.80 +14.40,52.80,10.35,0.00,1.00,52.80,57.60 +14.40,57.60,10.41,0.00,1.00,57.60,62.40 +19.20,62.40,10.47,0.00,1.00,62.40,67.20 +24.00,67.20,10.54,0.00,1.00,67.20,72.00 +28.80,72.00,10.60,0.00,1.00,72.00,72.00 +33.60,72.00,10.67,0.00,1.00,76.80,76.80 +48.00,76.80,10.73,0.00,1.00,81.60,81.60 +67.20,81.60,10.80,0.00,1.00,86.40,81.60 +96.00,81.60,10.86,0.00,1.00,91.20,81.60 +120.00,76.80,10.92,0.00,1.00,96.00,76.80 +139.20,76.80,10.99,0.00,1.00,100.80,72.00 +148.80,72.00,11.05,0.00,1.00,105.60,67.20 +153.60,67.20,11.12,0.00,1.00,110.40,62.40 +158.40,62.40,11.18,0.00,1.00,115.20,57.60 +163.20,57.60,11.24,0.00,1.00,120.00,52.80 +168.00,52.80,11.31,0.00,1.00,124.80,48.00 +168.00,48.00,11.37,0.00,1.00,129.60,43.20 +168.00,43.20,11.44,0.00,1.00,134.40,38.40 +172.80,38.40,11.50,0.00,1.00,139.20,33.60 +172.80,33.60,11.57,0.00,1.00,144.00,28.80 +172.80,28.80,11.63,0.00,1.00,148.80,24.00 +177.60,24.00,11.69,0.00,1.00,153.60,19.20 +177.60,19.20,11.76,0.00,1.00,158.40,14.40 +177.60,14.40,11.82,0.00,1.00,163.20,9.60 +177.60,9.60,11.89,0.00,1.00,168.00,4.80 +177.60,4.80,11.95,0.00,1.00,172.80,0.00 +177.60,0.00,12.02,0.00,1.00,177.60,-0.00 +-177.60,-0.00,12.08,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,12.14,0.00,1.00,-172.80,-9.60 +-177.60,-9.60,12.21,0.00,1.00,-168.00,-14.40 +-177.60,-14.40,12.27,0.00,1.00,-163.20,-19.20 +-177.60,-19.20,12.34,0.00,1.00,-158.40,-24.00 +-177.60,-24.00,12.40,0.00,1.00,-153.60,-28.80 +-172.80,-28.80,12.47,0.00,1.00,-148.80,-33.60 +-172.80,-33.60,12.53,0.00,1.00,-144.00,-38.40 +-172.80,-38.40,12.59,0.00,1.00,-139.20,-43.20 +-168.00,-43.20,12.66,0.00,1.00,-134.40,-48.00 +-168.00,-48.00,12.72,0.00,1.00,-129.60,-52.80 +-168.00,-52.80,12.79,0.00,1.00,-124.80,-57.60 +-163.20,-57.60,12.85,0.00,1.00,-120.00,-62.40 +-158.40,-62.40,12.92,0.00,1.00,-115.20,-67.20 +-153.60,-67.20,12.98,0.00,1.00,-110.40,-72.00 +-148.80,-72.00,13.04,0.00,1.00,-105.60,-76.80 +-139.20,-76.80,13.11,0.00,1.00,-100.80,-81.60 +-120.00,-76.80,13.17,0.00,1.00,-96.00,-81.60 +-96.00,-81.60,13.24,0.00,1.00,-91.20,-81.60 +-67.20,-81.60,13.30,0.00,1.00,-86.40,-76.80 +-48.00,-76.80,13.37,0.00,1.00,-81.60,-72.00 +-33.60,-72.00,13.43,0.00,1.00,-76.80,-72.00 +-28.80,-72.00,13.49,0.00,1.00,-72.00,-67.20 +-24.00,-67.20,13.56,0.00,1.00,-67.20,-62.40 +-19.20,-62.40,13.62,0.00,1.00,-62.40,-57.60 +-14.40,-57.60,13.69,0.00,1.00,-57.60,-52.80 +-14.40,-52.80,13.75,0.00,1.00,-52.80,-48.00 +-9.60,-48.00,13.82,0.00,1.00,-48.00,-43.20 +-9.60,-43.20,13.88,0.00,1.00,-43.20,-38.40 +-9.60,-38.40,13.94,0.00,1.00,-38.40,-33.60 +-4.80,-33.60,14.01,0.00,1.00,-33.60,-28.80 +-4.80,-28.80,14.07,0.00,1.00,-28.80,-24.00 +-4.80,-24.00,14.14,0.00,1.00,-24.00,-19.20 +-4.80,-19.20,14.20,0.00,1.00,-19.20,-14.40 +-4.80,-14.40,14.27,0.00,1.00,-14.40,-9.60 +-0.00,-9.60,14.33,0.00,1.00,-9.60,-4.80 +-0.00,-4.80,14.39,0.00,1.00,-4.80,0.00 +0.00,0.00,14.46,0.00,1.00,0.00,4.80 +0.00,4.80,14.52,0.00,1.00,4.80,9.60 +4.80,9.60,14.59,0.00,1.00,9.60,14.40 +4.80,14.40,14.65,0.00,1.00,14.40,19.20 +4.80,19.20,14.71,0.00,1.00,19.20,24.00 +4.80,24.00,14.78,0.00,1.00,24.00,28.80 +9.60,28.80,14.84,0.00,1.00,28.80,33.60 +9.60,33.60,14.91,0.00,1.00,33.60,38.40 +9.60,38.40,14.97,0.00,1.00,38.40,43.20 +14.40,43.20,15.04,0.00,1.00,43.20,48.00 +14.40,48.00,15.10,0.00,1.00,48.00,52.80 +19.20,52.80,15.16,0.00,1.00,52.80,57.60 +19.20,52.80,15.23,0.00,1.00,57.60,57.60 +24.00,57.60,15.29,0.00,1.00,62.40,62.40 +28.80,62.40,15.36,0.00,1.00,67.20,67.20 +38.40,67.20,15.42,0.00,1.00,72.00,72.00 +48.00,72.00,15.49,0.00,1.00,76.80,72.00 +57.60,72.00,15.55,0.00,1.00,81.60,76.80 +76.80,76.80,15.61,0.00,1.00,86.40,76.80 +96.00,76.80,15.68,0.00,1.00,91.20,76.80 +115.20,76.80,15.74,0.00,1.00,96.00,72.00 +129.60,72.00,15.81,0.00,1.00,100.80,72.00 +139.20,67.20,15.87,0.00,1.00,105.60,67.20 +144.00,67.20,15.94,0.00,1.00,110.40,62.40 +153.60,62.40,16.00,0.00,1.00,115.20,57.60 +158.40,57.60,16.00,0.00,1.00,120.00,52.80 +158.40,52.80,15.94,0.00,1.00,124.80,48.00 +163.20,48.00,15.87,0.00,1.00,129.60,43.20 +168.00,43.20,15.81,0.00,1.00,134.40,38.40 +168.00,38.40,15.74,0.00,1.00,139.20,33.60 +168.00,33.60,15.68,0.00,1.00,144.00,28.80 +172.80,28.80,15.61,0.00,1.00,148.80,24.00 +172.80,24.00,15.55,0.00,1.00,153.60,19.20 +172.80,19.20,15.49,0.00,1.00,158.40,14.40 +177.60,14.40,15.42,0.00,1.00,163.20,9.60 +177.60,9.60,15.36,0.00,1.00,168.00,4.80 +177.60,4.80,15.29,0.00,1.00,172.80,0.00 +177.60,0.00,15.23,0.00,1.00,177.60,-0.00 +-177.60,-0.00,15.16,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,15.10,0.00,1.00,-172.80,-9.60 +-177.60,-9.60,15.04,0.00,1.00,-168.00,-14.40 +-177.60,-14.40,14.97,0.00,1.00,-163.20,-19.20 +-172.80,-19.20,14.91,0.00,1.00,-158.40,-24.00 +-172.80,-24.00,14.84,0.00,1.00,-153.60,-28.80 +-172.80,-28.80,14.78,0.00,1.00,-148.80,-33.60 +-168.00,-33.60,14.71,0.00,1.00,-144.00,-38.40 +-168.00,-38.40,14.65,0.00,1.00,-139.20,-43.20 +-168.00,-43.20,14.59,0.00,1.00,-134.40,-48.00 +-163.20,-48.00,14.52,0.00,1.00,-129.60,-52.80 +-158.40,-52.80,14.46,0.00,1.00,-124.80,-57.60 +-158.40,-57.60,14.39,0.00,1.00,-120.00,-62.40 +-153.60,-62.40,14.33,0.00,1.00,-115.20,-67.20 +-144.00,-67.20,14.27,0.00,1.00,-110.40,-72.00 +-139.20,-67.20,14.20,0.00,1.00,-105.60,-72.00 +-129.60,-72.00,14.14,0.00,1.00,-100.80,-76.80 +-115.20,-76.80,14.07,0.00,1.00,-96.00,-76.80 +-96.00,-76.80,14.01,0.00,1.00,-91.20,-76.80 +-76.80,-76.80,13.94,0.00,1.00,-86.40,-72.00 +-57.60,-72.00,13.88,0.00,1.00,-81.60,-72.00 +-48.00,-72.00,13.82,0.00,1.00,-76.80,-67.20 +-38.40,-67.20,13.75,0.00,1.00,-72.00,-62.40 +-28.80,-62.40,13.69,0.00,1.00,-67.20,-57.60 +-24.00,-57.60,13.62,0.00,1.00,-62.40,-57.60 +-19.20,-52.80,13.56,0.00,1.00,-57.60,-52.80 +-19.20,-52.80,13.49,0.00,1.00,-52.80,-48.00 +-14.40,-48.00,13.43,0.00,1.00,-48.00,-43.20 +-14.40,-43.20,13.37,0.00,1.00,-43.20,-38.40 +-9.60,-38.40,13.30,0.00,1.00,-38.40,-33.60 +-9.60,-33.60,13.24,0.00,1.00,-33.60,-28.80 +-9.60,-28.80,13.17,0.00,1.00,-28.80,-24.00 +-4.80,-24.00,13.11,0.00,1.00,-24.00,-19.20 +-4.80,-19.20,13.04,0.00,1.00,-19.20,-14.40 +-4.80,-14.40,12.98,0.00,1.00,-14.40,-9.60 +-4.80,-9.60,12.92,0.00,1.00,-9.60,-4.80 +-0.00,-4.80,12.85,0.00,1.00,-4.80,0.00 +0.00,0.00,12.79,0.00,1.00,0.00,4.80 +0.00,4.80,12.72,0.00,1.00,4.80,9.60 +4.80,9.60,12.66,0.00,1.00,9.60,14.40 +4.80,14.40,12.59,0.00,1.00,14.40,19.20 +4.80,19.20,12.53,0.00,1.00,19.20,24.00 +9.60,24.00,12.47,0.00,1.00,24.00,28.80 +9.60,28.80,12.40,0.00,1.00,28.80,33.60 +14.40,33.60,12.34,0.00,1.00,33.60,38.40 +14.40,33.60,12.27,0.00,1.00,38.40,38.40 +19.20,38.40,12.21,0.00,1.00,43.20,43.20 +19.20,43.20,12.14,0.00,1.00,48.00,48.00 +24.00,48.00,12.08,0.00,1.00,52.80,52.80 +28.80,52.80,12.02,0.00,1.00,57.60,57.60 +33.60,57.60,11.95,0.00,1.00,62.40,62.40 +38.40,62.40,11.89,0.00,1.00,67.20,62.40 +43.20,62.40,11.82,0.00,1.00,72.00,67.20 +52.80,67.20,11.76,0.00,1.00,76.80,72.00 +67.20,67.20,11.69,0.00,1.00,81.60,72.00 +76.80,72.00,11.63,0.00,1.00,86.40,72.00 +96.00,72.00,11.57,0.00,1.00,91.20,72.00 +105.60,72.00,11.50,0.00,1.00,96.00,67.20 +120.00,67.20,11.44,0.00,1.00,100.80,67.20 +129.60,67.20,11.37,0.00,1.00,105.60,62.40 +139.20,62.40,11.31,0.00,1.00,110.40,57.60 +144.00,57.60,11.24,0.00,1.00,115.20,57.60 +148.80,52.80,11.18,0.00,1.00,120.00,52.80 +153.60,52.80,11.12,0.00,1.00,124.80,48.00 +158.40,48.00,11.05,0.00,1.00,129.60,43.20 +163.20,43.20,10.99,0.00,1.00,134.40,38.40 +163.20,38.40,10.92,0.00,1.00,139.20,33.60 +168.00,33.60,10.86,0.00,1.00,144.00,28.80 +168.00,28.80,10.80,0.00,1.00,148.80,24.00 +172.80,24.00,10.73,0.00,1.00,153.60,19.20 +172.80,19.20,10.67,0.00,1.00,158.40,14.40 +172.80,14.40,10.60,0.00,1.00,163.20,9.60 +177.60,9.60,10.54,0.00,1.00,168.00,4.80 +177.60,4.80,10.47,0.00,1.00,172.80,0.00 +177.60,0.00,10.41,0.00,1.00,177.60,-0.00 +-177.60,-0.00,10.35,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,10.28,0.00,1.00,-172.80,-9.60 +-177.60,-9.60,10.22,0.00,1.00,-168.00,-14.40 +-172.80,-14.40,10.15,0.00,1.00,-163.20,-19.20 +-172.80,-19.20,10.09,0.00,1.00,-158.40,-24.00 +-172.80,-24.00,10.02,0.00,1.00,-153.60,-28.80 +-168.00,-28.80,9.96,0.00,1.00,-148.80,-33.60 +-168.00,-33.60,9.90,0.00,1.00,-144.00,-38.40 +-163.20,-38.40,9.83,0.00,1.00,-139.20,-43.20 +-163.20,-43.20,9.77,0.00,1.00,-134.40,-48.00 +-158.40,-48.00,9.70,0.00,1.00,-129.60,-52.80 +-153.60,-52.80,9.64,0.00,1.00,-124.80,-57.60 +-148.80,-52.80,9.57,0.00,1.00,-120.00,-57.60 +-144.00,-57.60,9.51,0.00,1.00,-115.20,-62.40 +-139.20,-62.40,9.45,0.00,1.00,-110.40,-67.20 +-129.60,-67.20,9.38,0.00,1.00,-105.60,-67.20 +-120.00,-67.20,9.32,0.00,1.00,-100.80,-72.00 +-105.60,-72.00,9.25,0.00,1.00,-96.00,-72.00 +-96.00,-72.00,9.19,0.00,1.00,-91.20,-72.00 +-76.80,-72.00,9.12,0.00,1.00,-86.40,-72.00 +-67.20,-67.20,9.06,0.00,1.00,-81.60,-67.20 +-52.80,-67.20,9.00,0.00,1.00,-76.80,-62.40 +-43.20,-62.40,8.93,0.00,1.00,-72.00,-62.40 +-38.40,-62.40,8.87,0.00,1.00,-67.20,-57.60 +-33.60,-57.60,8.80,0.00,1.00,-62.40,-52.80 +-28.80,-52.80,8.74,0.00,1.00,-57.60,-48.00 +-24.00,-48.00,8.67,0.00,1.00,-52.80,-43.20 +-19.20,-43.20,8.61,0.00,1.00,-48.00,-38.40 +-19.20,-38.40,8.55,0.00,1.00,-43.20,-38.40 +-14.40,-33.60,8.48,0.00,1.00,-38.40,-33.60 +-14.40,-33.60,8.42,0.00,1.00,-33.60,-28.80 +-9.60,-28.80,8.35,0.00,1.00,-28.80,-24.00 +-9.60,-24.00,8.29,0.00,1.00,-24.00,-19.20 +-4.80,-19.20,8.22,0.00,1.00,-19.20,-14.40 +-4.80,-14.40,8.16,0.00,1.00,-14.40,-9.60 +-4.80,-9.60,8.10,0.00,1.00,-9.60,-4.80 +-0.00,-4.80,8.03,0.00,1.00,-4.80,0.00 +0.00,0.00,7.97,0.00,1.00,0.00,4.80 +0.00,4.80,7.90,0.00,1.00,4.80,9.60 +4.80,9.60,7.84,0.00,1.00,9.60,14.40 +4.80,14.40,7.78,0.00,1.00,14.40,19.20 +9.60,19.20,7.71,0.00,1.00,19.20,24.00 +9.60,24.00,7.65,0.00,1.00,24.00,24.00 +14.40,24.00,7.58,0.00,1.00,28.80,28.80 +14.40,28.80,7.52,0.00,1.00,33.60,33.60 +19.20,33.60,7.45,0.00,1.00,33.60,38.40 +19.20,38.40,7.39,0.00,1.00,38.40,43.20 +24.00,43.20,7.33,0.00,1.00,43.20,48.00 +28.80,48.00,7.26,0.00,1.00,48.00,52.80 +33.60,52.80,7.20,0.00,1.00,57.60,52.80 +38.40,52.80,7.13,0.00,1.00,62.40,57.60 +43.20,57.60,7.07,0.00,1.00,67.20,62.40 +52.80,62.40,7.00,0.00,1.00,72.00,62.40 +62.40,62.40,6.94,0.00,1.00,76.80,67.20 +72.00,62.40,6.88,0.00,1.00,81.60,67.20 +81.60,67.20,6.81,0.00,1.00,86.40,67.20 +91.20,67.20,6.75,0.00,1.00,91.20,67.20 +105.60,67.20,6.68,0.00,1.00,96.00,67.20 +115.20,62.40,6.62,0.00,1.00,100.80,62.40 +124.80,62.40,6.55,0.00,1.00,105.60,57.60 +134.40,57.60,6.49,0.00,1.00,110.40,57.60 +139.20,57.60,6.43,0.00,1.00,115.20,52.80 +144.00,52.80,6.36,0.00,1.00,120.00,48.00 +148.80,48.00,6.30,0.00,1.00,129.60,43.20 +153.60,43.20,6.23,0.00,1.00,134.40,43.20 +158.40,38.40,6.17,0.00,1.00,139.20,38.40 +158.40,38.40,6.10,0.00,1.00,144.00,33.60 +163.20,33.60,6.04,0.00,1.00,148.80,28.80 +168.00,28.80,5.98,0.00,1.00,148.80,24.00 +168.00,24.00,5.91,0.00,1.00,153.60,19.20 +172.80,19.20,5.85,0.00,1.00,158.40,14.40 +172.80,14.40,5.78,0.00,1.00,163.20,9.60 +172.80,9.60,5.72,0.00,1.00,168.00,4.80 +177.60,4.80,5.65,0.00,1.00,172.80,0.00 +177.60,0.00,5.59,0.00,1.00,177.60,-0.00 +-177.60,-0.00,5.53,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,5.46,0.00,1.00,-172.80,-9.60 +-172.80,-9.60,5.40,0.00,1.00,-168.00,-14.40 +-172.80,-14.40,5.33,0.00,1.00,-163.20,-19.20 +-172.80,-19.20,5.27,0.00,1.00,-158.40,-24.00 +-168.00,-24.00,5.20,0.00,1.00,-153.60,-28.80 +-168.00,-28.80,5.14,0.00,1.00,-148.80,-33.60 +-163.20,-33.60,5.08,0.00,1.00,-148.80,-38.40 +-158.40,-38.40,5.01,0.00,1.00,-144.00,-43.20 +-158.40,-38.40,4.95,0.00,1.00,-139.20,-43.20 +-153.60,-43.20,4.88,0.00,1.00,-134.40,-48.00 +-148.80,-48.00,4.82,0.00,1.00,-129.60,-52.80 +-144.00,-52.80,4.76,0.00,1.00,-120.00,-57.60 +-139.20,-57.60,4.69,0.00,1.00,-115.20,-57.60 +-134.40,-57.60,4.63,0.00,1.00,-110.40,-62.40 +-124.80,-62.40,4.56,0.00,1.00,-105.60,-67.20 +-115.20,-62.40,4.50,0.00,1.00,-100.80,-67.20 +-105.60,-67.20,4.43,0.00,1.00,-96.00,-67.20 +-91.20,-67.20,4.37,0.00,1.00,-91.20,-67.20 +-81.60,-67.20,4.31,0.00,1.00,-86.40,-67.20 +-72.00,-62.40,4.24,0.00,1.00,-81.60,-62.40 +-62.40,-62.40,4.18,0.00,1.00,-76.80,-62.40 +-52.80,-62.40,4.11,0.00,1.00,-72.00,-57.60 +-43.20,-57.60,4.05,0.00,1.00,-67.20,-52.80 +-38.40,-52.80,3.98,0.00,1.00,-62.40,-52.80 +-33.60,-52.80,3.92,0.00,1.00,-57.60,-48.00 +-28.80,-48.00,3.86,0.00,1.00,-48.00,-43.20 +-24.00,-43.20,3.79,0.00,1.00,-43.20,-38.40 +-19.20,-38.40,3.73,0.00,1.00,-38.40,-33.60 +-19.20,-33.60,3.66,0.00,1.00,-33.60,-28.80 +-14.40,-28.80,3.60,0.00,1.00,-33.60,-24.00 +-14.40,-24.00,3.53,0.00,1.00,-28.80,-24.00 +-9.60,-24.00,3.47,0.00,1.00,-24.00,-19.20 +-9.60,-19.20,3.41,0.00,1.00,-19.20,-14.40 +-4.80,-14.40,3.34,0.00,1.00,-14.40,-9.60 +-4.80,-9.60,3.28,0.00,1.00,-9.60,-4.80 +-0.00,-4.80,3.21,0.00,1.00,-4.80,0.00 +0.00,0.00,3.15,0.00,1.00,0.00,4.80 +0.00,4.80,3.08,0.00,1.00,4.80,9.60 +4.80,9.60,3.02,0.00,1.00,9.60,14.40 +4.80,14.40,2.96,0.00,1.00,14.40,19.20 +9.60,14.40,2.89,0.00,1.00,19.20,19.20 +14.40,19.20,2.83,0.00,1.00,19.20,24.00 +14.40,24.00,2.76,0.00,1.00,24.00,28.80 +19.20,28.80,2.70,0.00,1.00,28.80,33.60 +19.20,33.60,2.63,0.00,1.00,33.60,38.40 +24.00,38.40,2.57,0.00,1.00,38.40,43.20 +28.80,38.40,2.51,0.00,1.00,43.20,43.20 +33.60,43.20,2.44,0.00,1.00,48.00,48.00 +38.40,48.00,2.38,0.00,1.00,52.80,52.80 +43.20,52.80,2.31,0.00,1.00,57.60,52.80 +48.00,52.80,2.25,0.00,1.00,62.40,57.60 +57.60,57.60,2.18,0.00,1.00,72.00,57.60 +62.40,57.60,2.12,0.00,1.00,76.80,62.40 +72.00,62.40,2.06,0.00,1.00,81.60,62.40 +81.60,62.40,1.99,0.00,1.00,86.40,62.40 +91.20,62.40,1.93,0.00,1.00,91.20,62.40 +100.80,62.40,1.86,0.00,1.00,96.00,62.40 +110.40,57.60,1.80,0.00,1.00,100.80,57.60 +120.00,57.60,1.73,0.00,1.00,105.60,57.60 +129.60,57.60,1.67,0.00,1.00,115.20,52.80 +134.40,52.80,1.61,0.00,1.00,120.00,48.00 +139.20,48.00,1.54,0.00,1.00,124.80,48.00 +144.00,48.00,1.48,0.00,1.00,129.60,43.20 +148.80,43.20,1.41,0.00,1.00,134.40,38.40 +153.60,38.40,1.35,0.00,1.00,139.20,33.60 +158.40,33.60,1.29,0.00,1.00,144.00,33.60 +158.40,28.80,1.22,0.00,1.00,148.80,28.80 +163.20,28.80,1.16,0.00,1.00,153.60,24.00 +168.00,24.00,1.09,0.00,1.00,158.40,19.20 +168.00,19.20,1.03,0.00,1.00,163.20,14.40 +172.80,14.40,0.96,0.00,1.00,163.20,9.60 +172.80,9.60,0.90,0.00,1.00,168.00,4.80 +177.60,4.80,0.84,0.00,1.00,172.80,0.00 +177.60,0.00,0.77,0.00,1.00,177.60,-0.00 +-177.60,-0.00,0.71,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,0.64,0.00,1.00,-172.80,-9.60 +-172.80,-9.60,0.58,0.00,1.00,-168.00,-14.40 +-172.80,-14.40,0.51,0.00,1.00,-163.20,-19.20 +-168.00,-19.20,0.45,0.00,1.00,-163.20,-24.00 +-168.00,-24.00,0.39,0.00,1.00,-158.40,-28.80 +-163.20,-28.80,0.32,0.00,1.00,-153.60,-33.60 +-158.40,-28.80,0.26,0.00,1.00,-148.80,-33.60 +-158.40,-33.60,0.19,0.00,1.00,-144.00,-38.40 +-153.60,-38.40,0.13,0.00,1.00,-139.20,-43.20 +-148.80,-43.20,0.06,0.00,1.00,-134.40,-48.00 +-144.00,-48.00,0.00,0.00,1.00,-129.60,-48.00 +-139.20,-48.00,0.00,0.00,1.00,-124.80,-52.80 +-134.40,-52.80,0.16,0.00,1.00,-120.00,-57.60 +-129.60,-57.60,0.32,0.00,1.00,-115.20,-57.60 +-120.00,-57.60,0.48,0.00,1.00,-105.60,-62.40 +-110.40,-57.60,0.65,0.00,1.00,-100.80,-62.40 +-100.80,-62.40,0.81,0.00,1.00,-96.00,-62.40 +-91.20,-62.40,0.97,0.00,1.00,-91.20,-62.40 +-81.60,-62.40,1.13,0.00,1.00,-86.40,-62.40 +-72.00,-62.40,1.29,0.00,1.00,-81.60,-57.60 +-62.40,-57.60,1.45,0.00,1.00,-76.80,-57.60 +-57.60,-57.60,1.62,0.00,1.00,-72.00,-52.80 +-48.00,-52.80,1.78,0.00,1.00,-62.40,-52.80 +-43.20,-52.80,1.94,0.00,1.00,-57.60,-48.00 +-38.40,-48.00,2.10,0.00,1.00,-52.80,-43.20 +-33.60,-43.20,2.26,0.00,1.00,-48.00,-43.20 +-28.80,-38.40,2.42,0.00,1.00,-43.20,-38.40 +-24.00,-38.40,2.59,0.00,1.00,-38.40,-33.60 +-19.20,-33.60,2.75,0.00,1.00,-33.60,-28.80 +-19.20,-28.80,2.91,0.00,1.00,-28.80,-24.00 +-14.40,-24.00,3.07,0.00,1.00,-24.00,-19.20 +-14.40,-19.20,3.23,0.00,1.00,-19.20,-19.20 +-9.60,-14.40,3.39,0.00,1.00,-19.20,-14.40 +-4.80,-14.40,3.56,0.00,1.00,-14.40,-9.60 +-4.80,-9.60,3.72,0.00,1.00,-9.60,-4.80 +-0.00,-4.80,3.88,0.00,1.00,-4.80,0.00 +0.00,0.00,4.04,0.00,1.00,0.00,4.80 +4.80,4.80,4.20,0.00,1.00,4.80,9.60 +4.80,9.60,4.36,0.00,1.00,9.60,14.40 +9.60,9.60,4.53,0.00,1.00,14.40,14.40 +9.60,14.40,4.69,0.00,1.00,14.40,19.20 +14.40,19.20,4.85,0.00,1.00,19.20,24.00 +19.20,24.00,5.01,0.00,1.00,24.00,28.80 +19.20,28.80,5.17,0.00,1.00,28.80,33.60 +24.00,28.80,5.33,0.00,1.00,33.60,33.60 +28.80,33.60,5.49,0.00,1.00,38.40,38.40 +33.60,38.40,5.66,0.00,1.00,43.20,43.20 +38.40,43.20,5.82,0.00,1.00,48.00,43.20 +43.20,43.20,5.98,0.00,1.00,52.80,48.00 +48.00,48.00,6.14,0.00,1.00,57.60,52.80 +52.80,48.00,6.30,0.00,1.00,62.40,52.80 +57.60,52.80,6.46,0.00,1.00,67.20,57.60 +67.20,52.80,6.63,0.00,1.00,72.00,57.60 +76.80,57.60,6.79,0.00,1.00,81.60,57.60 +81.60,57.60,6.95,0.00,1.00,86.40,57.60 +91.20,57.60,7.11,0.00,1.00,91.20,57.60 +100.80,57.60,7.27,0.00,1.00,96.00,57.60 +110.40,52.80,7.43,0.00,1.00,100.80,52.80 +115.20,52.80,7.60,0.00,1.00,110.40,52.80 +124.80,52.80,7.76,0.00,1.00,115.20,48.00 +129.60,48.00,7.92,0.00,1.00,120.00,48.00 +134.40,48.00,8.08,0.00,1.00,124.80,43.20 +139.20,43.20,8.24,0.00,1.00,129.60,38.40 +144.00,38.40,8.40,0.00,1.00,134.40,38.40 +148.80,38.40,8.57,0.00,1.00,139.20,33.60 +153.60,33.60,8.73,0.00,1.00,144.00,28.80 +158.40,28.80,8.89,0.00,1.00,148.80,24.00 +163.20,24.00,9.05,0.00,1.00,153.60,24.00 +163.20,24.00,9.21,0.00,1.00,158.40,19.20 +168.00,19.20,9.37,0.00,1.00,163.20,14.40 +172.80,14.40,9.54,0.00,1.00,168.00,9.60 +172.80,9.60,9.70,0.00,1.00,168.00,4.80 +177.60,4.80,9.86,0.00,1.00,172.80,0.00 +177.60,0.00,10.02,0.00,1.00,177.60,-0.00 +-177.60,-0.00,10.18,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,10.34,0.00,1.00,-172.80,-9.60 +-172.80,-9.60,10.51,0.00,1.00,-168.00,-14.40 +-172.80,-14.40,10.67,0.00,1.00,-168.00,-19.20 +-168.00,-19.20,10.83,0.00,1.00,-163.20,-24.00 +-163.20,-24.00,10.99,0.00,1.00,-158.40,-24.00 +-163.20,-24.00,11.15,0.00,1.00,-153.60,-28.80 +-158.40,-28.80,11.31,0.00,1.00,-148.80,-33.60 +-153.60,-33.60,11.47,0.00,1.00,-144.00,-38.40 +-148.80,-38.40,11.64,0.00,1.00,-139.20,-38.40 +-144.00,-38.40,11.80,0.00,1.00,-134.40,-43.20 +-139.20,-43.20,11.96,0.00,1.00,-129.60,-48.00 +-134.40,-48.00,12.12,0.00,1.00,-124.80,-48.00 +-129.60,-48.00,12.28,0.00,1.00,-120.00,-52.80 +-124.80,-52.80,12.44,0.00,1.00,-115.20,-52.80 +-115.20,-52.80,12.61,0.00,1.00,-110.40,-57.60 +-110.40,-52.80,12.77,0.00,1.00,-100.80,-57.60 +-100.80,-57.60,12.93,0.00,1.00,-96.00,-57.60 +-91.20,-57.60,13.09,0.00,1.00,-91.20,-57.60 +-81.60,-57.60,13.25,0.00,1.00,-86.40,-57.60 +-76.80,-57.60,13.41,0.00,1.00,-81.60,-57.60 +-67.20,-52.80,13.58,0.00,1.00,-72.00,-52.80 +-57.60,-52.80,13.74,0.00,1.00,-67.20,-52.80 +-52.80,-48.00,13.90,0.00,1.00,-62.40,-48.00 +-48.00,-48.00,14.06,0.00,1.00,-57.60,-43.20 +-43.20,-43.20,14.22,0.00,1.00,-52.80,-43.20 +-38.40,-43.20,14.38,0.00,1.00,-48.00,-38.40 +-33.60,-38.40,14.55,0.00,1.00,-43.20,-33.60 +-28.80,-33.60,14.71,0.00,1.00,-38.40,-33.60 +-24.00,-28.80,14.87,0.00,1.00,-33.60,-28.80 +-19.20,-28.80,15.03,0.00,1.00,-28.80,-24.00 +-19.20,-24.00,15.19,0.00,1.00,-24.00,-19.20 +-14.40,-19.20,15.35,0.00,1.00,-19.20,-14.40 +-9.60,-14.40,15.52,0.00,1.00,-14.40,-14.40 +-9.60,-9.60,15.68,0.00,1.00,-14.40,-9.60 +-4.80,-9.60,15.84,0.00,1.00,-9.60,-4.80 +-4.80,-4.80,16.00,0.00,1.00,-4.80,0.00 +0.00,0.00,16.00,0.00,1.00,0.00,4.80 +4.80,4.80,15.84,0.00,1.00,4.80,9.60 +4.80,9.60,15.68,0.00,1.00,9.60,9.60 +9.60,9.60,15.52,0.00,1.00,9.60,14.40 +14.40,14.40,15.35,0.00,1.00,14.40,19.20 +14.40,19.20,15.19,0.00,1.00,19.20,24.00 +19.20,24.00,15.03,0.00,1.00,24.00,24.00 +24.00,24.00,14.87,0.00,1.00,28.80,28.80 +24.00,28.80,14.71,0.00,1.00,33.60,33.60 +28.80,33.60,14.55,0.00,1.00,38.40,38.40 +33.60,33.60,14.38,0.00,1.00,43.20,38.40 +38.40,38.40,14.22,0.00,1.00,48.00,43.20 +43.20,43.20,14.06,0.00,1.00,52.80,43.20 +48.00,43.20,13.90,0.00,1.00,57.60,48.00 +57.60,48.00,13.74,0.00,1.00,62.40,48.00 +62.40,48.00,13.58,0.00,1.00,67.20,52.80 +67.20,48.00,13.41,0.00,1.00,72.00,52.80 +76.80,52.80,13.25,0.00,1.00,81.60,52.80 +86.40,52.80,13.09,0.00,1.00,86.40,52.80 +91.20,52.80,12.93,0.00,1.00,91.20,52.80 +100.80,52.80,12.77,0.00,1.00,96.00,52.80 +105.60,48.00,12.61,0.00,1.00,105.60,48.00 +115.20,48.00,12.44,0.00,1.00,110.40,48.00 +120.00,48.00,12.28,0.00,1.00,115.20,48.00 +124.80,43.20,12.12,0.00,1.00,120.00,43.20 +134.40,43.20,11.96,0.00,1.00,124.80,43.20 +139.20,38.40,11.80,0.00,1.00,129.60,38.40 +144.00,38.40,11.64,0.00,1.00,134.40,33.60 +148.80,33.60,11.47,0.00,1.00,139.20,33.60 +153.60,28.80,11.31,0.00,1.00,144.00,28.80 +153.60,28.80,11.15,0.00,1.00,148.80,24.00 +158.40,24.00,10.99,0.00,1.00,153.60,19.20 +163.20,19.20,10.83,0.00,1.00,158.40,19.20 +168.00,14.40,10.67,0.00,1.00,163.20,14.40 +168.00,14.40,10.51,0.00,1.00,168.00,9.60 +172.80,9.60,10.34,0.00,1.00,172.80,4.80 +177.60,4.80,10.18,0.00,1.00,172.80,0.00 +177.60,0.00,10.02,0.00,1.00,177.60,-0.00 +-177.60,-0.00,9.86,0.00,1.00,-177.60,-4.80 +-177.60,-4.80,9.70,0.00,1.00,-172.80,-9.60 +-172.80,-9.60,9.54,0.00,1.00,-172.80,-14.40 +-168.00,-14.40,9.37,0.00,1.00,-168.00,-19.20 +-168.00,-14.40,9.21,0.00,1.00,-163.20,-19.20 +-163.20,-19.20,9.05,0.00,1.00,-158.40,-24.00 +-158.40,-24.00,8.89,0.00,1.00,-153.60,-28.80 +-153.60,-28.80,8.73,0.00,1.00,-148.80,-33.60 +-153.60,-28.80,8.57,0.00,1.00,-144.00,-33.60 +-148.80,-33.60,8.40,0.00,1.00,-139.20,-38.40 +-144.00,-38.40,8.24,0.00,1.00,-134.40,-43.20 +-139.20,-38.40,8.08,0.00,1.00,-129.60,-43.20 +-134.40,-43.20,7.92,0.00,1.00,-124.80,-48.00 +-124.80,-43.20,7.76,0.00,1.00,-120.00,-48.00 +-120.00,-48.00,7.60,0.00,1.00,-115.20,-48.00 +-115.20,-48.00,7.43,0.00,1.00,-110.40,-52.80 +-105.60,-48.00,7.27,0.00,1.00,-105.60,-52.80 +-100.80,-52.80,7.11,0.00,1.00,-96.00,-52.80 +-91.20,-52.80,6.95,0.00,1.00,-91.20,-52.80 +-86.40,-52.80,6.79,0.00,1.00,-86.40,-52.80 +-76.80,-52.80,6.63,0.00,1.00,-81.60,-52.80 +-67.20,-48.00,6.46,0.00,1.00,-72.00,-48.00 +-62.40,-48.00,6.30,0.00,1.00,-67.20,-48.00 +-57.60,-48.00,6.14,0.00,1.00,-62.40,-43.20 +-48.00,-43.20,5.98,0.00,1.00,-57.60,-43.20 +-43.20,-43.20,5.82,0.00,1.00,-52.80,-38.40 +-38.40,-38.40,5.66,0.00,1.00,-48.00,-38.40 +-33.60,-33.60,5.49,0.00,1.00,-43.20,-33.60 +-28.80,-33.60,5.33,0.00,1.00,-38.40,-28.80 +-24.00,-28.80,5.17,0.00,1.00,-33.60,-24.00 +-24.00,-24.00,5.01,0.00,1.00,-28.80,-24.00 +-19.20,-24.00,4.85,0.00,1.00,-24.00,-19.20 +-14.40,-19.20,4.69,0.00,1.00,-19.20,-14.40 +-14.40,-14.40,4.53,0.00,1.00,-14.40,-9.60 +-9.60,-9.60,4.36,0.00,1.00,-9.60,-9.60 +-4.80,-9.60,4.20,0.00,1.00,-9.60,-4.80 +-4.80,-4.80,4.04,0.00,1.00,-4.80,0.00 +0.00,0.00,3.88,0.00,1.00,0.00,4.80 +4.80,4.80,3.72,0.00,1.00,4.80,4.80 +4.80,4.80,3.56,0.00,1.00,4.80,9.60 +9.60,9.60,3.39,0.00,1.00,9.60,14.40 +14.40,14.40,3.23,0.00,1.00,14.40,19.20 +19.20,19.20,3.07,0.00,1.00,19.20,19.20 +19.20,19.20,2.91,0.00,1.00,24.00,24.00 +24.00,24.00,2.75,0.00,1.00,24.00,28.80 +28.80,28.80,2.59,0.00,1.00,28.80,28.80 +33.60,28.80,2.42,0.00,1.00,33.60,33.60 +38.40,33.60,2.26,0.00,1.00,38.40,38.40 +43.20,33.60,2.10,0.00,1.00,43.20,38.40 +48.00,38.40,1.94,0.00,1.00,48.00,43.20 +52.80,38.40,1.78,0.00,1.00,52.80,43.20 +57.60,43.20,1.62,0.00,1.00,62.40,43.20 +62.40,43.20,1.45,0.00,1.00,67.20,48.00 +72.00,43.20,1.29,0.00,1.00,72.00,48.00 +76.80,48.00,1.13,0.00,1.00,76.80,48.00 +86.40,48.00,0.97,0.00,1.00,86.40,48.00 +91.20,48.00,0.81,0.00,1.00,91.20,48.00 +100.80,48.00,0.65,0.00,1.00,96.00,48.00 +105.60,48.00,0.48,0.00,1.00,105.60,48.00 +110.40,43.20,0.32,0.00,1.00,110.40,43.20 +120.00,43.20,0.16,0.00,1.00,115.20,43.20 +124.80,43.20,0.00,0.00,1.00,124.80,38.40 +129.60,38.40,0.00,0.00,1.00,129.60,38.40 +134.40,38.40,0.04,0.00,1.00,134.40,33.60 +139.20,33.60,0.08,0.00,1.00,139.20,33.60 +144.00,33.60,0.12,0.00,1.00,144.00,28.80 +148.80,28.80,0.16,0.00,1.00,148.80,24.00 +153.60,24.00,0.20,0.00,1.00,153.60,24.00 +158.40,24.00,0.24,0.00,1.00,158.40,19.20 +163.20,19.20,0.28,0.00,1.00,158.40,14.40 +163.20,14.40,0.32,0.00,1.00,163.20,14.40 +168.00,14.40,0.36,0.00,1.00,168.00,9.60 +172.80,9.60,0.40,0.00,1.00,172.80,4.80 +172.80,4.80,0.44,0.00,1.00,172.80,0.00 +177.60,0.00,0.48,0.00,1.00,177.60,-0.00 +-177.60,-0.00,0.52,0.00,1.00,-177.60,-4.80 +-172.80,-4.80,0.56,0.00,1.00,-172.80,-9.60 +-172.80,-9.60,0.60,0.00,1.00,-172.80,-14.40 +-168.00,-14.40,0.64,0.00,1.00,-168.00,-14.40 +-163.20,-14.40,0.68,0.00,1.00,-163.20,-19.20 +-163.20,-19.20,0.72,0.00,1.00,-158.40,-24.00 +-158.40,-24.00,0.76,0.00,1.00,-158.40,-24.00 +-153.60,-24.00,0.80,0.00,1.00,-153.60,-28.80 +-148.80,-28.80,0.84,0.00,1.00,-148.80,-33.60 +-144.00,-33.60,0.88,0.00,1.00,-144.00,-33.60 +-139.20,-33.60,0.92,0.00,1.00,-139.20,-38.40 +-134.40,-38.40,0.96,0.00,1.00,-134.40,-38.40 +-129.60,-38.40,1.00,0.00,1.00,-129.60,-43.20 +-124.80,-43.20,1.04,0.00,1.00,-124.80,-43.20 +-120.00,-43.20,1.08,0.00,1.00,-115.20,-48.00 +-110.40,-43.20,1.12,0.00,1.00,-110.40,-48.00 +-105.60,-48.00,1.16,0.00,1.00,-105.60,-48.00 +-100.80,-48.00,1.20,0.00,1.00,-96.00,-48.00 +-91.20,-48.00,1.24,0.00,1.00,-91.20,-48.00 +-86.40,-48.00,1.28,0.00,1.00,-86.40,-48.00 +-76.80,-48.00,1.32,0.00,1.00,-76.80,-48.00 +-72.00,-43.20,1.36,0.00,1.00,-72.00,-43.20 +-62.40,-43.20,1.40,0.00,1.00,-67.20,-43.20 +-57.60,-43.20,1.44,0.00,1.00,-62.40,-43.20 +-52.80,-38.40,1.48,0.00,1.00,-52.80,-38.40 +-48.00,-38.40,1.52,0.00,1.00,-48.00,-38.40 +-43.20,-33.60,1.56,0.00,1.00,-43.20,-33.60 +-38.40,-33.60,1.60,0.00,1.00,-38.40,-28.80 +-33.60,-28.80,1.64,0.00,1.00,-33.60,-28.80 +-28.80,-28.80,1.68,0.00,1.00,-28.80,-24.00 +-24.00,-24.00,1.72,0.00,1.00,-24.00,-19.20 +-19.20,-19.20,1.76,0.00,1.00,-24.00,-19.20 +-19.20,-19.20,1.80,0.00,1.00,-19.20,-14.40 +-14.40,-14.40,1.84,0.00,1.00,-14.40,-9.60 +-9.60,-9.60,1.88,0.00,1.00,-9.60,-4.80 +-4.80,-4.80,1.92,0.00,1.00,-4.80,-4.80 +-4.80,-4.80,1.96,0.00,1.00,-4.80,0.00 +0.00,0.00,2.01,0.00,1.00,0.00,4.80 +4.80,4.80,2.05,0.00,1.00,4.80,4.80 +4.80,4.80,2.09,0.00,1.00,4.80,9.60 +9.60,9.60,2.13,0.00,1.00,9.60,14.40 +14.40,14.40,2.17,0.00,1.00,14.40,14.40 +19.20,14.40,2.21,0.00,1.00,14.40,19.20 +24.00,19.20,2.25,0.00,1.00,19.20,24.00 +24.00,24.00,2.29,0.00,1.00,24.00,24.00 +28.80,24.00,2.33,0.00,1.00,28.80,28.80 +33.60,28.80,2.37,0.00,1.00,33.60,28.80 +38.40,28.80,2.41,0.00,1.00,38.40,33.60 +43.20,33.60,2.45,0.00,1.00,43.20,33.60 +48.00,33.60,2.49,0.00,1.00,48.00,38.40 +52.80,38.40,2.53,0.00,1.00,52.80,38.40 +62.40,38.40,2.57,0.00,1.00,57.60,38.40 +67.20,38.40,2.61,0.00,1.00,62.40,43.20 +72.00,38.40,2.65,0.00,1.00,72.00,43.20 +76.80,43.20,2.69,0.00,1.00,76.80,43.20 +86.40,43.20,2.73,0.00,1.00,86.40,43.20 +91.20,43.20,2.77,0.00,1.00,91.20,43.20 +96.00,43.20,2.81,0.00,1.00,100.80,43.20 +105.60,43.20,2.85,0.00,1.00,105.60,43.20 +110.40,38.40,2.89,0.00,1.00,110.40,38.40 +115.20,38.40,2.93,0.00,1.00,120.00,38.40 +120.00,38.40,2.97,0.00,1.00,124.80,38.40 +129.60,33.60,3.01,0.00,1.00,129.60,33.60 +134.40,33.60,3.05,0.00,1.00,134.40,33.60 +139.20,28.80,3.09,0.00,1.00,139.20,28.80 +144.00,28.80,3.13,0.00,1.00,144.00,28.80 +148.80,24.00,3.17,0.00,1.00,148.80,24.00 +153.60,24.00,3.21,0.00,1.00,153.60,19.20 +153.60,19.20,3.25,0.00,1.00,158.40,19.20 +158.40,19.20,3.29,0.00,1.00,163.20,14.40 +163.20,14.40,3.33,0.00,1.00,163.20,9.60 +168.00,9.60,3.37,0.00,1.00,168.00,9.60 +172.80,9.60,3.41,0.00,1.00,172.80,4.80 +172.80,4.80,3.45,0.00,1.00,172.80,0.00 +177.60,0.00,3.49,0.00,1.00,177.60,-0.00 +-177.60,-0.00,3.53,0.00,1.00,-177.60,-4.80 +-172.80,-4.80,3.57,0.00,1.00,-172.80,-9.60 +-172.80,-9.60,3.61,0.00,1.00,-172.80,-9.60 +-168.00,-9.60,3.65,0.00,1.00,-168.00,-14.40 +-163.20,-14.40,3.69,0.00,1.00,-163.20,-19.20 +-158.40,-19.20,3.73,0.00,1.00,-163.20,-19.20 +-153.60,-19.20,3.77,0.00,1.00,-158.40,-24.00 +-153.60,-24.00,3.81,0.00,1.00,-153.60,-28.80 +-148.80,-24.00,3.85,0.00,1.00,-148.80,-28.80 +-144.00,-28.80,3.89,0.00,1.00,-144.00,-33.60 +-139.20,-28.80,3.93,0.00,1.00,-139.20,-33.60 +-134.40,-33.60,3.97,0.00,1.00,-134.40,-38.40 +-129.60,-33.60,4.01,0.00,1.00,-129.60,-38.40 +-120.00,-38.40,4.05,0.00,1.00,-124.80,-38.40 +-115.20,-38.40,4.09,0.00,1.00,-120.00,-43.20 +-110.40,-38.40,4.13,0.00,1.00,-110.40,-43.20 +-105.60,-43.20,4.17,0.00,1.00,-105.60,-43.20 +-96.00,-43.20,4.21,0.00,1.00,-100.80,-43.20 +-91.20,-43.20,4.25,0.00,1.00,-91.20,-43.20 +-86.40,-43.20,4.29,0.00,1.00,-86.40,-43.20 +-76.80,-43.20,4.33,0.00,1.00,-76.80,-43.20 +-72.00,-38.40,4.37,0.00,1.00,-72.00,-38.40 +-67.20,-38.40,4.41,0.00,1.00,-62.40,-38.40 +-62.40,-38.40,4.45,0.00,1.00,-57.60,-38.40 +-52.80,-38.40,4.49,0.00,1.00,-52.80,-33.60 +-48.00,-33.60,4.53,0.00,1.00,-48.00,-33.60 +-43.20,-33.60,4.57,0.00,1.00,-43.20,-28.80 +-38.40,-28.80,4.61,0.00,1.00,-38.40,-28.80 +-33.60,-28.80,4.65,0.00,1.00,-33.60,-24.00 +-28.80,-24.00,4.69,0.00,1.00,-28.80,-24.00 +-24.00,-24.00,4.73,0.00,1.00,-24.00,-19.20 +-24.00,-19.20,4.77,0.00,1.00,-19.20,-14.40 +-19.20,-14.40,4.81,0.00,1.00,-14.40,-14.40 +-14.40,-14.40,4.85,0.00,1.00,-14.40,-9.60 +-9.60,-9.60,4.89,0.00,1.00,-9.60,-4.80 +-4.80,-4.80,4.93,0.00,1.00,-4.80,-4.80 +-4.80,-4.80,4.97,0.00,1.00,-4.80,0.00 +0.00,0.00,5.01,0.00,1.00,0.00,4.80 +4.80,4.80,5.05,0.00,1.00,4.80,4.80 +9.60,4.80,5.09,0.00,1.00,4.80,9.60 +9.60,9.60,5.13,0.00,1.00,9.60,9.60 +14.40,9.60,5.17,0.00,1.00,9.60,14.40 +19.20,14.40,5.21,0.00,1.00,14.40,19.20 +24.00,19.20,5.25,0.00,1.00,19.20,19.20 +28.80,19.20,5.29,0.00,1.00,24.00,24.00 +33.60,24.00,5.33,0.00,1.00,24.00,24.00 +38.40,24.00,5.37,0.00,1.00,28.80,28.80 +43.20,28.80,5.41,0.00,1.00,33.60,28.80 +48.00,28.80,5.45,0.00,1.00,38.40,33.60 +52.80,28.80,5.49,0.00,1.00,43.20,33.60 +57.60,33.60,5.53,0.00,1.00,48.00,33.60 +62.40,33.60,5.57,0.00,1.00,52.80,38.40 +67.20,33.60,5.61,0.00,1.00,62.40,38.40 +72.00,38.40,5.65,0.00,1.00,67.20,38.40 +81.60,38.40,5.69,0.00,1.00,76.80,38.40 +86.40,38.40,5.73,0.00,1.00,86.40,38.40 +91.20,38.40,5.77,0.00,1.00,91.20,38.40 +96.00,38.40,5.81,0.00,1.00,100.80,38.40 +105.60,38.40,5.85,0.00,1.00,105.60,38.40 +110.40,33.60,5.89,0.00,1.00,115.20,33.60 +115.20,33.60,5.93,0.00,1.00,120.00,33.60 +120.00,33.60,5.97,0.00,1.00,129.60,33.60 +124.80,33.60,6.02,0.00,1.00,134.40,28.80 +129.60,28.80,6.06,0.00,1.00,139.20,28.80 +134.40,28.80,6.10,0.00,1.00,144.00,24.00 +139.20,24.00,6.14,0.00,1.00,148.80,24.00 +144.00,24.00,6.18,0.00,1.00,153.60,19.20 +148.80,19.20,6.22,0.00,1.00,158.40,19.20 +153.60,19.20,6.26,0.00,1.00,158.40,14.40 +158.40,14.40,6.30,0.00,1.00,163.20,14.40 +163.20,14.40,6.34,0.00,1.00,168.00,9.60 +168.00,9.60,6.38,0.00,1.00,168.00,9.60 +168.00,9.60,6.42,0.00,1.00,172.80,4.80 +172.80,4.80,6.46,0.00,1.00,177.60,0.00 +177.60,0.00,6.50,0.00,1.00,177.60,-0.00 +-177.60,-0.00,6.54,0.00,1.00,-177.60,-4.80 +-172.80,-4.80,6.58,0.00,1.00,-177.60,-9.60 +-168.00,-9.60,6.62,0.00,1.00,-172.80,-9.60 +-168.00,-9.60,6.66,0.00,1.00,-168.00,-14.40 +-163.20,-14.40,6.70,0.00,1.00,-168.00,-14.40 +-158.40,-14.40,6.74,0.00,1.00,-163.20,-19.20 +-153.60,-19.20,6.78,0.00,1.00,-158.40,-19.20 +-148.80,-19.20,6.82,0.00,1.00,-158.40,-24.00 +-144.00,-24.00,6.86,0.00,1.00,-153.60,-24.00 +-139.20,-24.00,6.90,0.00,1.00,-148.80,-28.80 +-134.40,-28.80,6.94,0.00,1.00,-144.00,-28.80 +-129.60,-28.80,6.98,0.00,1.00,-139.20,-33.60 +-124.80,-33.60,7.02,0.00,1.00,-134.40,-33.60 +-120.00,-33.60,7.06,0.00,1.00,-129.60,-33.60 +-115.20,-33.60,7.10,0.00,1.00,-120.00,-38.40 +-110.40,-33.60,7.14,0.00,1.00,-115.20,-38.40 +-105.60,-38.40,7.18,0.00,1.00,-105.60,-38.40 +-96.00,-38.40,7.22,0.00,1.00,-100.80,-38.40 +-91.20,-38.40,7.26,0.00,1.00,-91.20,-38.40 +-86.40,-38.40,7.30,0.00,1.00,-86.40,-38.40 +-81.60,-38.40,7.34,0.00,1.00,-76.80,-38.40 +-72.00,-38.40,7.38,0.00,1.00,-67.20,-38.40 +-67.20,-33.60,7.42,0.00,1.00,-62.40,-33.60 +-62.40,-33.60,7.46,0.00,1.00,-52.80,-33.60 +-57.60,-33.60,7.50,0.00,1.00,-48.00,-33.60 +-52.80,-28.80,7.54,0.00,1.00,-43.20,-28.80 +-48.00,-28.80,7.58,0.00,1.00,-38.40,-28.80 +-43.20,-28.80,7.62,0.00,1.00,-33.60,-24.00 +-38.40,-24.00,7.66,0.00,1.00,-28.80,-24.00 +-33.60,-24.00,7.70,0.00,1.00,-24.00,-19.20 +-28.80,-19.20,7.74,0.00,1.00,-24.00,-19.20 +-24.00,-19.20,7.78,0.00,1.00,-19.20,-14.40 +-19.20,-14.40,7.82,0.00,1.00,-14.40,-9.60 +-14.40,-9.60,7.86,0.00,1.00,-9.60,-9.60 +-9.60,-9.60,7.90,0.00,1.00,-9.60,-4.80 +-9.60,-4.80,7.94,0.00,1.00,-4.80,-4.80 +-4.80,-4.80,7.98,0.00,1.00,-4.80,0.00 +0.00,0.00,8.02,0.00,1.00,0.00,4.80 +4.80,4.80,8.06,0.00,1.00,4.80,4.80 +9.60,4.80,8.10,0.00,1.00,4.80,9.60 +14.40,9.60,8.14,0.00,1.00,9.60,9.60 +14.40,9.60,8.18,0.00,1.00,9.60,14.40 +19.20,14.40,8.22,0.00,1.00,14.40,14.40 +24.00,14.40,8.26,0.00,1.00,14.40,19.20 +28.80,19.20,8.30,0.00,1.00,19.20,19.20 +33.60,19.20,8.34,0.00,1.00,24.00,24.00 +38.40,19.20,8.38,0.00,1.00,28.80,24.00 +43.20,24.00,8.42,0.00,1.00,28.80,24.00 +48.00,24.00,8.46,0.00,1.00,33.60,28.80 +52.80,28.80,8.50,0.00,1.00,38.40,28.80 +57.60,28.80,8.54,0.00,1.00,48.00,28.80 +62.40,28.80,8.58,0.00,1.00,52.80,33.60 +67.20,28.80,8.62,0.00,1.00,57.60,33.60 +76.80,33.60,8.66,0.00,1.00,67.20,33.60 +81.60,33.60,8.70,0.00,1.00,76.80,33.60 +86.40,33.60,8.74,0.00,1.00,81.60,33.60 +91.20,33.60,8.78,0.00,1.00,91.20,33.60 +96.00,33.60,8.82,0.00,1.00,100.80,33.60 +100.80,33.60,8.86,0.00,1.00,110.40,33.60 +110.40,28.80,8.90,0.00,1.00,115.20,33.60 +115.20,28.80,8.94,0.00,1.00,124.80,28.80 +120.00,28.80,8.98,0.00,1.00,129.60,28.80 +124.80,28.80,9.02,0.00,1.00,139.20,28.80 +129.60,24.00,9.06,0.00,1.00,144.00,24.00 +134.40,24.00,9.10,0.00,1.00,148.80,24.00 +139.20,24.00,9.14,0.00,1.00,153.60,19.20 +144.00,19.20,9.18,0.00,1.00,153.60,19.20 +148.80,19.20,9.22,0.00,1.00,158.40,14.40 +153.60,14.40,9.26,0.00,1.00,163.20,14.40 +158.40,14.40,9.30,0.00,1.00,163.20,9.60 +163.20,9.60,9.34,0.00,1.00,168.00,9.60 +168.00,9.60,9.38,0.00,1.00,172.80,4.80 +168.00,4.80,9.42,0.00,1.00,172.80,4.80 +172.80,4.80,9.46,0.00,1.00,177.60,0.00 +177.60,0.00,9.50,0.00,1.00,177.60,-0.00 +-177.60,-0.00,9.54,0.00,1.00,-177.60,-4.80 +-172.80,-4.80,9.58,0.00,1.00,-177.60,-4.80 +-168.00,-4.80,9.62,0.00,1.00,-172.80,-9.60 +-168.00,-9.60,9.66,0.00,1.00,-172.80,-9.60 +-163.20,-9.60,9.70,0.00,1.00,-168.00,-14.40 +-158.40,-14.40,9.74,0.00,1.00,-163.20,-14.40 +-153.60,-14.40,9.78,0.00,1.00,-163.20,-19.20 +-148.80,-19.20,9.82,0.00,1.00,-158.40,-19.20 +-144.00,-19.20,9.86,0.00,1.00,-153.60,-24.00 +-139.20,-24.00,9.90,0.00,1.00,-153.60,-24.00 +-134.40,-24.00,9.94,0.00,1.00,-148.80,-28.80 +-129.60,-24.00,9.98,0.00,1.00,-144.00,-28.80 +-124.80,-28.80,10.03,0.00,1.00,-139.20,-28.80 +-120.00,-28.80,10.07,0.00,1.00,-129.60,-33.60 +-115.20,-28.80,10.11,0.00,1.00,-124.80,-33.60 +-110.40,-28.80,10.15,0.00,1.00,-115.20,-33.60 +-100.80,-33.60,10.19,0.00,1.00,-110.40,-33.60 +-96.00,-33.60,10.23,0.00,1.00,-100.80,-33.60 +-91.20,-33.60,10.27,0.00,1.00,-91.20,-33.60 +-86.40,-33.60,10.31,0.00,1.00,-81.60,-33.60 +-81.60,-33.60,10.35,0.00,1.00,-76.80,-33.60 +-76.80,-33.60,10.39,0.00,1.00,-67.20,-33.60 +-67.20,-28.80,10.43,0.00,1.00,-57.60,-28.80 +-62.40,-28.80,10.47,0.00,1.00,-52.80,-28.80 +-57.60,-28.80,10.51,0.00,1.00,-48.00,-28.80 +-52.80,-28.80,10.55,0.00,1.00,-38.40,-24.00 +-48.00,-24.00,10.59,0.00,1.00,-33.60,-24.00 +-43.20,-24.00,10.63,0.00,1.00,-28.80,-24.00 +-38.40,-19.20,10.67,0.00,1.00,-28.80,-19.20 +-33.60,-19.20,10.71,0.00,1.00,-24.00,-19.20 +-28.80,-19.20,10.75,0.00,1.00,-19.20,-14.40 +-24.00,-14.40,10.79,0.00,1.00,-14.40,-14.40 +-19.20,-14.40,10.83,0.00,1.00,-14.40,-9.60 +-14.40,-9.60,10.87,0.00,1.00,-9.60,-9.60 +-14.40,-9.60,10.91,0.00,1.00,-9.60,-4.80 +-9.60,-4.80,10.95,0.00,1.00,-4.80,-4.80 +-4.80,-4.80,10.99,0.00,1.00,-4.80,0.00 +0.00,0.00,11.03,0.00,1.00,0.00,0.00 +4.80,0.00,11.07,0.00,1.00,0.00,4.80 +9.60,4.80,11.11,0.00,1.00,4.80,4.80 +14.40,4.80,11.15,0.00,1.00,4.80,9.60 +19.20,9.60,11.19,0.00,1.00,9.60,9.60 +19.20,9.60,11.23,0.00,1.00,9.60,14.40 +24.00,14.40,11.27,0.00,1.00,14.40,14.40 +28.80,14.40,11.31,0.00,1.00,19.20,19.20 +33.60,14.40,11.35,0.00,1.00,19.20,19.20 +38.40,19.20,11.39,0.00,1.00,24.00,19.20 +43.20,19.20,11.43,0.00,1.00,28.80,24.00 +48.00,24.00,11.47,0.00,1.00,33.60,24.00 +52.80,24.00,11.51,0.00,1.00,38.40,24.00 +57.60,24.00,11.55,0.00,1.00,43.20,24.00 +62.40,24.00,11.59,0.00,1.00,48.00,28.80 +72.00,24.00,11.63,0.00,1.00,52.80,28.80 +76.80,28.80,11.67,0.00,1.00,62.40,28.80 +81.60,28.80,11.71,0.00,1.00,72.00,28.80 +86.40,28.80,11.75,0.00,1.00,81.60,28.80 +91.20,28.80,11.79,0.00,1.00,91.20,28.80 +96.00,28.80,11.83,0.00,1.00,100.80,28.80 +100.80,28.80,11.87,0.00,1.00,110.40,28.80 +105.60,28.80,11.91,0.00,1.00,120.00,28.80 +110.40,24.00,11.95,0.00,1.00,129.60,24.00 +120.00,24.00,11.99,0.00,1.00,134.40,24.00 +124.80,24.00,12.03,0.00,1.00,139.20,24.00 +129.60,24.00,12.07,0.00,1.00,144.00,24.00 +134.40,19.20,12.11,0.00,1.00,148.80,19.20 +139.20,19.20,12.15,0.00,1.00,153.60,19.20 +144.00,19.20,12.19,0.00,1.00,158.40,14.40 +148.80,14.40,12.23,0.00,1.00,163.20,14.40 +153.60,14.40,12.27,0.00,1.00,163.20,14.40 +158.40,9.60,12.31,0.00,1.00,168.00,9.60 +158.40,9.60,12.35,0.00,1.00,168.00,9.60 +163.20,9.60,12.39,0.00,1.00,172.80,4.80 +168.00,4.80,12.43,0.00,1.00,172.80,4.80 +172.80,4.80,12.47,0.00,1.00,177.60,0.00 +177.60,0.00,12.51,0.00,1.00,177.60,-0.00 +-177.60,-0.00,12.55,0.00,1.00,-177.60,-4.80 +-172.80,-4.80,12.59,0.00,1.00,-177.60,-4.80 +-168.00,-4.80,12.63,0.00,1.00,-172.80,-9.60 +-163.20,-9.60,12.67,0.00,1.00,-172.80,-9.60 +-158.40,-9.60,12.71,0.00,1.00,-168.00,-14.40 +-158.40,-9.60,12.75,0.00,1.00,-168.00,-14.40 +-153.60,-14.40,12.79,0.00,1.00,-163.20,-14.40 +-148.80,-14.40,12.83,0.00,1.00,-163.20,-19.20 +-144.00,-19.20,12.87,0.00,1.00,-158.40,-19.20 +-139.20,-19.20,12.91,0.00,1.00,-153.60,-24.00 +-134.40,-19.20,12.95,0.00,1.00,-148.80,-24.00 +-129.60,-24.00,12.99,0.00,1.00,-144.00,-24.00 +-124.80,-24.00,13.03,0.00,1.00,-139.20,-24.00 +-120.00,-24.00,13.07,0.00,1.00,-134.40,-28.80 +-110.40,-24.00,13.11,0.00,1.00,-129.60,-28.80 +-105.60,-28.80,13.15,0.00,1.00,-120.00,-28.80 +-100.80,-28.80,13.19,0.00,1.00,-110.40,-28.80 +-96.00,-28.80,13.23,0.00,1.00,-100.80,-28.80 +-91.20,-28.80,13.27,0.00,1.00,-91.20,-28.80 +-86.40,-28.80,13.31,0.00,1.00,-81.60,-28.80 +-81.60,-28.80,13.35,0.00,1.00,-72.00,-28.80 +-76.80,-28.80,13.39,0.00,1.00,-62.40,-28.80 +-72.00,-24.00,13.43,0.00,1.00,-52.80,-24.00 +-62.40,-24.00,13.47,0.00,1.00,-48.00,-24.00 +-57.60,-24.00,13.51,0.00,1.00,-43.20,-24.00 +-52.80,-24.00,13.55,0.00,1.00,-38.40,-24.00 +-48.00,-24.00,13.59,0.00,1.00,-33.60,-19.20 +-43.20,-19.20,13.63,0.00,1.00,-28.80,-19.20 +-38.40,-19.20,13.67,0.00,1.00,-24.00,-19.20 +-33.60,-14.40,13.71,0.00,1.00,-19.20,-14.40 +-28.80,-14.40,13.75,0.00,1.00,-19.20,-14.40 +-24.00,-14.40,13.79,0.00,1.00,-14.40,-9.60 +-19.20,-9.60,13.83,0.00,1.00,-9.60,-9.60 +-19.20,-9.60,13.87,0.00,1.00,-9.60,-4.80 +-14.40,-4.80,13.91,0.00,1.00,-4.80,-4.80 +-9.60,-4.80,13.95,0.00,1.00,-4.80,-0.00 +-4.80,-0.00,13.99,0.00,1.00,-0.00,0.00 +0.00,0.00,14.04,0.00,1.00,0.00,0.00 +4.80,0.00,14.08,0.00,1.00,0.00,4.80 +9.60,4.80,14.12,0.00,1.00,4.80,4.80 +14.40,4.80,14.16,0.00,1.00,4.80,9.60 +19.20,9.60,14.20,0.00,1.00,9.60,9.60 +24.00,9.60,14.24,0.00,1.00,9.60,9.60 +28.80,9.60,14.28,0.00,1.00,14.40,14.40 +33.60,14.40,14.32,0.00,1.00,14.40,14.40 +38.40,14.40,14.36,0.00,1.00,19.20,14.40 +43.20,14.40,14.40,0.00,1.00,19.20,19.20 +48.00,14.40,14.44,0.00,1.00,24.00,19.20 +52.80,19.20,14.48,0.00,1.00,28.80,19.20 +57.60,19.20,14.52,0.00,1.00,33.60,19.20 +62.40,19.20,14.56,0.00,1.00,38.40,24.00 +67.20,19.20,14.60,0.00,1.00,43.20,24.00 +72.00,24.00,14.64,0.00,1.00,48.00,24.00 +76.80,24.00,14.68,0.00,1.00,57.60,24.00 +81.60,24.00,14.72,0.00,1.00,67.20,24.00 +86.40,24.00,14.76,0.00,1.00,81.60,24.00 +91.20,24.00,14.80,0.00,1.00,91.20,24.00 +96.00,24.00,14.84,0.00,1.00,105.60,24.00 +100.80,24.00,14.88,0.00,1.00,115.20,24.00 +105.60,24.00,14.92,0.00,1.00,124.80,24.00 +110.40,19.20,14.96,0.00,1.00,134.40,19.20 +115.20,19.20,15.00,0.00,1.00,139.20,19.20 +120.00,19.20,15.04,0.00,1.00,144.00,19.20 +124.80,19.20,15.08,0.00,1.00,148.80,19.20 +129.60,19.20,15.12,0.00,1.00,153.60,19.20 +134.40,14.40,15.16,0.00,1.00,158.40,14.40 +139.20,14.40,15.20,0.00,1.00,163.20,14.40 +144.00,14.40,15.24,0.00,1.00,163.20,14.40 +148.80,9.60,15.28,0.00,1.00,168.00,9.60 +153.60,9.60,15.32,0.00,1.00,168.00,9.60 +158.40,9.60,15.36,0.00,1.00,172.80,4.80 +163.20,4.80,15.40,0.00,1.00,172.80,4.80 +168.00,4.80,15.44,0.00,1.00,177.60,4.80 +172.80,4.80,15.48,0.00,1.00,177.60,0.00 +177.60,0.00,15.52,0.00,1.00,177.60,-0.00 +-177.60,-0.00,15.56,0.00,1.00,-177.60,-4.80 +-172.80,-4.80,15.60,0.00,1.00,-177.60,-4.80 +-168.00,-4.80,15.64,0.00,1.00,-177.60,-4.80 +-163.20,-4.80,15.68,0.00,1.00,-172.80,-9.60 +-158.40,-9.60,15.72,0.00,1.00,-172.80,-9.60 +-153.60,-9.60,15.76,0.00,1.00,-168.00,-14.40 +-148.80,-9.60,15.80,0.00,1.00,-168.00,-14.40 +-144.00,-14.40,15.84,0.00,1.00,-163.20,-14.40 +-139.20,-14.40,15.88,0.00,1.00,-163.20,-19.20 +-134.40,-14.40,15.92,0.00,1.00,-158.40,-19.20 +-129.60,-19.20,15.96,0.00,1.00,-153.60,-19.20 +-124.80,-19.20,16.00,0.00,1.00,-148.80,-19.20 +-120.00,-19.20,16.00,0.00,1.00,-144.00,-19.20 +-115.20,-19.20,15.96,0.00,1.00,-139.20,-24.00 +-110.40,-19.20,15.92,0.00,1.00,-134.40,-24.00 +-105.60,-24.00,15.88,0.00,1.00,-124.80,-24.00 +-100.80,-24.00,15.84,0.00,1.00,-115.20,-24.00 +-96.00,-24.00,15.80,0.00,1.00,-105.60,-24.00 +-91.20,-24.00,15.76,0.00,1.00,-91.20,-24.00 +-86.40,-24.00,15.72,0.00,1.00,-81.60,-24.00 +-81.60,-24.00,15.68,0.00,1.00,-67.20,-24.00 +-76.80,-24.00,15.64,0.00,1.00,-57.60,-24.00 +-72.00,-24.00,15.60,0.00,1.00,-48.00,-24.00 +-67.20,-19.20,15.56,0.00,1.00,-43.20,-19.20 +-62.40,-19.20,15.52,0.00,1.00,-38.40,-19.20 +-57.60,-19.20,15.48,0.00,1.00,-33.60,-19.20 +-52.80,-19.20,15.44,0.00,1.00,-28.80,-19.20 +-48.00,-14.40,15.40,0.00,1.00,-24.00,-14.40 +-43.20,-14.40,15.36,0.00,1.00,-19.20,-14.40 +-38.40,-14.40,15.32,0.00,1.00,-19.20,-14.40 +-33.60,-14.40,15.28,0.00,1.00,-14.40,-9.60 +-28.80,-9.60,15.24,0.00,1.00,-14.40,-9.60 +-24.00,-9.60,15.20,0.00,1.00,-9.60,-9.60 +-19.20,-9.60,15.16,0.00,1.00,-9.60,-4.80 +-14.40,-4.80,15.12,0.00,1.00,-4.80,-4.80 +-9.60,-4.80,15.08,0.00,1.00,-4.80,-0.00 +-4.80,-0.00,15.04,0.00,1.00,-0.00,0.00 +0.00,0.00,15.00,0.00,1.00,0.00,0.00 +4.80,0.00,14.96,0.00,1.00,0.00,4.80 +9.60,4.80,14.92,0.00,1.00,4.80,4.80 +14.40,4.80,14.88,0.00,1.00,4.80,4.80 +19.20,4.80,14.84,0.00,1.00,4.80,9.60 +24.00,9.60,14.80,0.00,1.00,9.60,9.60 +28.80,9.60,14.76,0.00,1.00,9.60,9.60 +33.60,9.60,14.72,0.00,1.00,9.60,9.60 +38.40,9.60,14.68,0.00,1.00,14.40,14.40 +43.20,14.40,14.64,0.00,1.00,14.40,14.40 +48.00,14.40,14.60,0.00,1.00,19.20,14.40 +52.80,14.40,14.56,0.00,1.00,24.00,14.40 +57.60,14.40,14.52,0.00,1.00,24.00,19.20 +62.40,14.40,14.48,0.00,1.00,28.80,19.20 +67.20,14.40,14.44,0.00,1.00,38.40,19.20 +72.00,19.20,14.40,0.00,1.00,43.20,19.20 +76.80,19.20,14.36,0.00,1.00,52.80,19.20 +81.60,19.20,14.32,0.00,1.00,62.40,19.20 +86.40,19.20,14.28,0.00,1.00,76.80,19.20 +91.20,19.20,14.24,0.00,1.00,96.00,19.20 +96.00,19.20,14.20,0.00,1.00,110.40,19.20 +100.80,19.20,14.16,0.00,1.00,120.00,19.20 +105.60,19.20,14.12,0.00,1.00,134.40,19.20 +110.40,19.20,14.08,0.00,1.00,139.20,19.20 +115.20,14.40,14.04,0.00,1.00,148.80,14.40 +120.00,14.40,13.99,0.00,1.00,153.60,14.40 +124.80,14.40,13.95,0.00,1.00,158.40,14.40 +129.60,14.40,13.91,0.00,1.00,158.40,14.40 +134.40,14.40,13.87,0.00,1.00,163.20,14.40 +139.20,9.60,13.83,0.00,1.00,163.20,9.60 +144.00,9.60,13.79,0.00,1.00,168.00,9.60 +148.80,9.60,13.75,0.00,1.00,168.00,9.60 +153.60,9.60,13.71,0.00,1.00,172.80,4.80 +158.40,4.80,13.67,0.00,1.00,172.80,4.80 +163.20,4.80,13.63,0.00,1.00,172.80,4.80 +168.00,4.80,13.59,0.00,1.00,177.60,0.00 +172.80,0.00,13.55,0.00,1.00,177.60,0.00 +177.60,0.00,13.51,0.00,1.00,177.60,-0.00 +-177.60,-0.00,13.47,0.00,1.00,-177.60,-0.00 +-172.80,-0.00,13.43,0.00,1.00,-177.60,-4.80 +-168.00,-4.80,13.39,0.00,1.00,-177.60,-4.80 +-163.20,-4.80,13.35,0.00,1.00,-172.80,-4.80 +-158.40,-4.80,13.31,0.00,1.00,-172.80,-9.60 +-153.60,-9.60,13.27,0.00,1.00,-172.80,-9.60 +-148.80,-9.60,13.23,0.00,1.00,-168.00,-9.60 +-144.00,-9.60,13.19,0.00,1.00,-168.00,-14.40 +-139.20,-9.60,13.15,0.00,1.00,-163.20,-14.40 +-134.40,-14.40,13.11,0.00,1.00,-163.20,-14.40 +-129.60,-14.40,13.07,0.00,1.00,-158.40,-14.40 +-124.80,-14.40,13.03,0.00,1.00,-158.40,-14.40 +-120.00,-14.40,12.99,0.00,1.00,-153.60,-19.20 +-115.20,-14.40,12.95,0.00,1.00,-148.80,-19.20 +-110.40,-19.20,12.91,0.00,1.00,-139.20,-19.20 +-105.60,-19.20,12.87,0.00,1.00,-134.40,-19.20 +-100.80,-19.20,12.83,0.00,1.00,-120.00,-19.20 +-96.00,-19.20,12.79,0.00,1.00,-110.40,-19.20 +-91.20,-19.20,12.75,0.00,1.00,-96.00,-19.20 +-86.40,-19.20,12.71,0.00,1.00,-76.80,-19.20 +-81.60,-19.20,12.67,0.00,1.00,-62.40,-19.20 +-76.80,-19.20,12.63,0.00,1.00,-52.80,-19.20 +-72.00,-19.20,12.59,0.00,1.00,-43.20,-19.20 +-67.20,-14.40,12.55,0.00,1.00,-38.40,-19.20 +-62.40,-14.40,12.51,0.00,1.00,-28.80,-14.40 +-57.60,-14.40,12.47,0.00,1.00,-24.00,-14.40 +-52.80,-14.40,12.43,0.00,1.00,-24.00,-14.40 +-48.00,-14.40,12.39,0.00,1.00,-19.20,-14.40 +-43.20,-14.40,12.35,0.00,1.00,-14.40,-9.60 +-38.40,-9.60,12.31,0.00,1.00,-14.40,-9.60 +-33.60,-9.60,12.27,0.00,1.00,-9.60,-9.60 +-28.80,-9.60,12.23,0.00,1.00,-9.60,-9.60 +-24.00,-9.60,12.19,0.00,1.00,-9.60,-4.80 +-19.20,-4.80,12.15,0.00,1.00,-4.80,-4.80 +-14.40,-4.80,12.11,0.00,1.00,-4.80,-4.80 +-9.60,-4.80,12.07,0.00,1.00,-4.80,-0.00 +-4.80,-0.00,12.03,0.00,1.00,-0.00,0.00 +0.00,0.00,11.99,0.00,1.00,0.00,0.00 +4.80,0.00,11.95,0.00,1.00,0.00,0.00 +9.60,0.00,11.91,0.00,1.00,0.00,4.80 +14.40,4.80,11.87,0.00,1.00,4.80,4.80 +19.20,4.80,11.83,0.00,1.00,4.80,4.80 +24.00,4.80,11.79,0.00,1.00,4.80,4.80 +28.80,4.80,11.75,0.00,1.00,4.80,9.60 +33.60,9.60,11.71,0.00,1.00,9.60,9.60 +38.40,9.60,11.67,0.00,1.00,9.60,9.60 +43.20,9.60,11.63,0.00,1.00,14.40,9.60 +48.00,9.60,11.59,0.00,1.00,14.40,9.60 +52.80,9.60,11.55,0.00,1.00,14.40,14.40 +57.60,9.60,11.51,0.00,1.00,19.20,14.40 +62.40,9.60,11.47,0.00,1.00,24.00,14.40 +67.20,14.40,11.43,0.00,1.00,28.80,14.40 +72.00,14.40,11.39,0.00,1.00,33.60,14.40 +76.80,14.40,11.35,0.00,1.00,43.20,14.40 +81.60,14.40,11.31,0.00,1.00,57.60,14.40 +86.40,14.40,11.27,0.00,1.00,76.80,14.40 +91.20,14.40,11.23,0.00,1.00,96.00,14.40 +96.00,14.40,11.19,0.00,1.00,115.20,14.40 +100.80,14.40,11.15,0.00,1.00,129.60,14.40 +105.60,14.40,11.11,0.00,1.00,139.20,14.40 +110.40,14.40,11.07,0.00,1.00,148.80,14.40 +115.20,9.60,11.03,0.00,1.00,153.60,14.40 +120.00,9.60,10.99,0.00,1.00,158.40,9.60 +124.80,9.60,10.95,0.00,1.00,163.20,9.60 +129.60,9.60,10.91,0.00,1.00,163.20,9.60 +134.40,9.60,10.87,0.00,1.00,168.00,9.60 +139.20,9.60,10.83,0.00,1.00,168.00,9.60 +144.00,9.60,10.79,0.00,1.00,172.80,9.60 +148.80,4.80,10.75,0.00,1.00,172.80,4.80 +153.60,4.80,10.71,0.00,1.00,172.80,4.80 +158.40,4.80,10.67,0.00,1.00,172.80,4.80 +163.20,4.80,10.63,0.00,1.00,177.60,4.80 +168.00,4.80,10.59,0.00,1.00,177.60,0.00 +172.80,0.00,10.55,0.00,1.00,177.60,0.00 +177.60,0.00,10.51,0.00,1.00,177.60,-0.00 +-177.60,-0.00,10.47,0.00,1.00,-177.60,-0.00 +-172.80,-0.00,10.43,0.00,1.00,-177.60,-4.80 +-168.00,-4.80,10.39,0.00,1.00,-177.60,-4.80 +-163.20,-4.80,10.35,0.00,1.00,-177.60,-4.80 +-158.40,-4.80,10.31,0.00,1.00,-172.80,-4.80 +-153.60,-4.80,10.27,0.00,1.00,-172.80,-9.60 +-148.80,-4.80,10.23,0.00,1.00,-172.80,-9.60 +-144.00,-9.60,10.19,0.00,1.00,-172.80,-9.60 +-139.20,-9.60,10.15,0.00,1.00,-168.00,-9.60 +-134.40,-9.60,10.11,0.00,1.00,-168.00,-9.60 +-129.60,-9.60,10.07,0.00,1.00,-163.20,-9.60 +-124.80,-9.60,10.03,0.00,1.00,-163.20,-14.40 +-120.00,-9.60,9.98,0.00,1.00,-158.40,-14.40 +-115.20,-9.60,9.94,0.00,1.00,-153.60,-14.40 +-110.40,-14.40,9.90,0.00,1.00,-148.80,-14.40 +-105.60,-14.40,9.86,0.00,1.00,-139.20,-14.40 +-100.80,-14.40,9.82,0.00,1.00,-129.60,-14.40 +-96.00,-14.40,9.78,0.00,1.00,-115.20,-14.40 +-91.20,-14.40,9.74,0.00,1.00,-96.00,-14.40 +-86.40,-14.40,9.70,0.00,1.00,-76.80,-14.40 +-81.60,-14.40,9.66,0.00,1.00,-57.60,-14.40 +-76.80,-14.40,9.62,0.00,1.00,-43.20,-14.40 +-72.00,-14.40,9.58,0.00,1.00,-33.60,-14.40 +-67.20,-14.40,9.54,0.00,1.00,-28.80,-14.40 +-62.40,-9.60,9.50,0.00,1.00,-24.00,-14.40 +-57.60,-9.60,9.46,0.00,1.00,-19.20,-9.60 +-52.80,-9.60,9.42,0.00,1.00,-14.40,-9.60 +-48.00,-9.60,9.38,0.00,1.00,-14.40,-9.60 +-43.20,-9.60,9.34,0.00,1.00,-14.40,-9.60 +-38.40,-9.60,9.30,0.00,1.00,-9.60,-9.60 +-33.60,-9.60,9.26,0.00,1.00,-9.60,-4.80 +-28.80,-4.80,9.22,0.00,1.00,-4.80,-4.80 +-24.00,-4.80,9.18,0.00,1.00,-4.80,-4.80 +-19.20,-4.80,9.14,0.00,1.00,-4.80,-4.80 +-14.40,-4.80,9.10,0.00,1.00,-4.80,-0.00 +-9.60,-0.00,9.06,0.00,1.00,-0.00,-0.00 +-4.80,-0.00,9.02,0.00,1.00,-0.00,0.00 +0.00,0.00,8.98,0.00,1.00,0.00,0.00 +4.80,0.00,8.94,0.00,1.00,0.00,0.00 +9.60,0.00,8.90,0.00,1.00,0.00,0.00 +14.40,0.00,8.86,0.00,1.00,0.00,4.80 +19.20,4.80,8.82,0.00,1.00,4.80,4.80 +24.00,4.80,8.78,0.00,1.00,4.80,4.80 +28.80,4.80,8.74,0.00,1.00,4.80,4.80 +33.60,4.80,8.70,0.00,1.00,4.80,4.80 +38.40,4.80,8.66,0.00,1.00,4.80,4.80 +43.20,4.80,8.62,0.00,1.00,9.60,4.80 +48.00,4.80,8.58,0.00,1.00,9.60,9.60 +52.80,4.80,8.54,0.00,1.00,9.60,9.60 +57.60,4.80,8.50,0.00,1.00,14.40,9.60 +62.40,9.60,8.46,0.00,1.00,14.40,9.60 +67.20,9.60,8.42,0.00,1.00,19.20,9.60 +72.00,9.60,8.38,0.00,1.00,24.00,9.60 +76.80,9.60,8.34,0.00,1.00,33.60,9.60 +81.60,9.60,8.30,0.00,1.00,43.20,9.60 +86.40,9.60,8.26,0.00,1.00,67.20,9.60 +91.20,9.60,8.22,0.00,1.00,96.00,9.60 +96.00,9.60,8.18,0.00,1.00,124.80,9.60 +100.80,9.60,8.14,0.00,1.00,144.00,9.60 +105.60,9.60,8.10,0.00,1.00,153.60,9.60 +110.40,9.60,8.06,0.00,1.00,158.40,9.60 +115.20,9.60,8.02,0.00,1.00,163.20,9.60 +120.00,9.60,7.98,0.00,1.00,168.00,9.60 +124.80,4.80,7.94,0.00,1.00,168.00,9.60 +129.60,4.80,7.90,0.00,1.00,168.00,4.80 +134.40,4.80,7.86,0.00,1.00,172.80,4.80 +139.20,4.80,7.82,0.00,1.00,172.80,4.80 +144.00,4.80,7.78,0.00,1.00,172.80,4.80 +148.80,4.80,7.74,0.00,1.00,172.80,4.80 +153.60,4.80,7.70,0.00,1.00,177.60,4.80 +158.40,4.80,7.66,0.00,1.00,177.60,4.80 +163.20,4.80,7.62,0.00,1.00,177.60,0.00 +168.00,0.00,7.58,0.00,1.00,177.60,0.00 +172.80,0.00,7.54,0.00,1.00,177.60,0.00 +177.60,0.00,7.50,0.00,1.00,177.60,-0.00 +-177.60,-0.00,7.46,0.00,1.00,-177.60,-0.00 +-172.80,-0.00,7.42,0.00,1.00,-177.60,-0.00 +-168.00,-0.00,7.38,0.00,1.00,-177.60,-4.80 +-163.20,-4.80,7.34,0.00,1.00,-177.60,-4.80 +-158.40,-4.80,7.30,0.00,1.00,-177.60,-4.80 +-153.60,-4.80,7.26,0.00,1.00,-177.60,-4.80 +-148.80,-4.80,7.22,0.00,1.00,-172.80,-4.80 +-144.00,-4.80,7.18,0.00,1.00,-172.80,-4.80 +-139.20,-4.80,7.14,0.00,1.00,-172.80,-4.80 +-134.40,-4.80,7.10,0.00,1.00,-172.80,-9.60 +-129.60,-4.80,7.06,0.00,1.00,-168.00,-9.60 +-124.80,-4.80,7.02,0.00,1.00,-168.00,-9.60 +-120.00,-9.60,6.98,0.00,1.00,-168.00,-9.60 +-115.20,-9.60,6.94,0.00,1.00,-163.20,-9.60 +-110.40,-9.60,6.90,0.00,1.00,-158.40,-9.60 +-105.60,-9.60,6.86,0.00,1.00,-153.60,-9.60 +-100.80,-9.60,6.82,0.00,1.00,-144.00,-9.60 +-96.00,-9.60,6.78,0.00,1.00,-124.80,-9.60 +-91.20,-9.60,6.74,0.00,1.00,-96.00,-9.60 +-86.40,-9.60,6.70,0.00,1.00,-67.20,-9.60 +-81.60,-9.60,6.66,0.00,1.00,-43.20,-9.60 +-76.80,-9.60,6.62,0.00,1.00,-33.60,-9.60 +-72.00,-9.60,6.58,0.00,1.00,-24.00,-9.60 +-67.20,-9.60,6.54,0.00,1.00,-19.20,-9.60 +-62.40,-9.60,6.50,0.00,1.00,-14.40,-9.60 +-57.60,-4.80,6.46,0.00,1.00,-14.40,-9.60 +-52.80,-4.80,6.42,0.00,1.00,-9.60,-4.80 +-48.00,-4.80,6.38,0.00,1.00,-9.60,-4.80 +-43.20,-4.80,6.34,0.00,1.00,-9.60,-4.80 +-38.40,-4.80,6.30,0.00,1.00,-4.80,-4.80 +-33.60,-4.80,6.26,0.00,1.00,-4.80,-4.80 +-28.80,-4.80,6.22,0.00,1.00,-4.80,-4.80 +-24.00,-4.80,6.18,0.00,1.00,-4.80,-4.80 +-19.20,-4.80,6.14,0.00,1.00,-4.80,-0.00 +-14.40,-0.00,6.10,0.00,1.00,-0.00,-0.00 +-9.60,-0.00,6.06,0.00,1.00,-0.00,-0.00 +-4.80,-0.00,6.02,0.00,1.00,-0.00,0.00 +0.00,0.00,5.97,0.00,1.00,0.00,0.00 +4.80,0.00,5.93,0.00,1.00,0.00,0.00 +9.60,0.00,5.89,0.00,1.00,0.00,0.00 +14.40,0.00,5.85,0.00,1.00,0.00,0.00 +19.20,0.00,5.81,0.00,1.00,0.00,0.00 +24.00,0.00,5.77,0.00,1.00,0.00,0.00 +28.80,0.00,5.73,0.00,1.00,0.00,4.80 +33.60,0.00,5.69,0.00,1.00,0.00,4.80 +38.40,0.00,5.65,0.00,1.00,4.80,4.80 +43.20,4.80,5.61,0.00,1.00,4.80,4.80 +48.00,4.80,5.57,0.00,1.00,4.80,4.80 +52.80,4.80,5.53,0.00,1.00,4.80,4.80 +57.60,4.80,5.49,0.00,1.00,4.80,4.80 +62.40,4.80,5.45,0.00,1.00,4.80,4.80 +67.20,4.80,5.41,0.00,1.00,9.60,4.80 +72.00,4.80,5.37,0.00,1.00,9.60,4.80 +76.80,4.80,5.33,0.00,1.00,14.40,4.80 +81.60,4.80,5.29,0.00,1.00,24.00,4.80 +86.40,4.80,5.25,0.00,1.00,43.20,4.80 +91.20,4.80,5.21,0.00,1.00,110.40,4.80 +96.00,4.80,5.17,0.00,1.00,148.80,4.80 +100.80,4.80,5.13,0.00,1.00,163.20,4.80 +105.60,4.80,5.09,0.00,1.00,168.00,4.80 +110.40,4.80,5.05,0.00,1.00,172.80,4.80 +115.20,4.80,5.01,0.00,1.00,172.80,4.80 +120.00,4.80,4.97,0.00,1.00,172.80,4.80 +124.80,4.80,4.93,0.00,1.00,172.80,4.80 +129.60,4.80,4.89,0.00,1.00,177.60,4.80 +134.40,4.80,4.85,0.00,1.00,177.60,4.80 +139.20,0.00,4.81,0.00,1.00,177.60,4.80 +144.00,0.00,4.77,0.00,1.00,177.60,4.80 +148.80,0.00,4.73,0.00,1.00,177.60,0.00 +153.60,0.00,4.69,0.00,1.00,177.60,0.00 +158.40,0.00,4.65,0.00,1.00,177.60,0.00 +163.20,0.00,4.61,0.00,1.00,177.60,0.00 +168.00,0.00,4.57,0.00,1.00,177.60,0.00 +172.80,0.00,4.53,0.00,1.00,177.60,0.00 +177.60,0.00,4.49,0.00,1.00,177.60,-0.00 +-177.60,-0.00,4.45,0.00,1.00,-177.60,-0.00 +-172.80,-0.00,4.41,0.00,1.00,-177.60,-0.00 +-168.00,-0.00,4.37,0.00,1.00,-177.60,-0.00 +-163.20,-0.00,4.33,0.00,1.00,-177.60,-0.00 +-158.40,-0.00,4.29,0.00,1.00,-177.60,-0.00 +-153.60,-0.00,4.25,0.00,1.00,-177.60,-4.80 +-148.80,-0.00,4.21,0.00,1.00,-177.60,-4.80 +-144.00,-0.00,4.17,0.00,1.00,-177.60,-4.80 +-139.20,-0.00,4.13,0.00,1.00,-177.60,-4.80 +-134.40,-4.80,4.09,0.00,1.00,-177.60,-4.80 +-129.60,-4.80,4.05,0.00,1.00,-177.60,-4.80 +-124.80,-4.80,4.01,0.00,1.00,-172.80,-4.80 +-120.00,-4.80,3.97,0.00,1.00,-172.80,-4.80 +-115.20,-4.80,3.93,0.00,1.00,-172.80,-4.80 +-110.40,-4.80,3.89,0.00,1.00,-172.80,-4.80 +-105.60,-4.80,3.85,0.00,1.00,-168.00,-4.80 +-100.80,-4.80,3.81,0.00,1.00,-163.20,-4.80 +-96.00,-4.80,3.77,0.00,1.00,-148.80,-4.80 +-91.20,-4.80,3.73,0.00,1.00,-110.40,-4.80 +-86.40,-4.80,3.69,0.00,1.00,-43.20,-4.80 +-81.60,-4.80,3.65,0.00,1.00,-24.00,-4.80 +-76.80,-4.80,3.61,0.00,1.00,-14.40,-4.80 +-72.00,-4.80,3.57,0.00,1.00,-9.60,-4.80 +-67.20,-4.80,3.53,0.00,1.00,-9.60,-4.80 +-62.40,-4.80,3.49,0.00,1.00,-4.80,-4.80 +-57.60,-4.80,3.45,0.00,1.00,-4.80,-4.80 +-52.80,-4.80,3.41,0.00,1.00,-4.80,-4.80 +-48.00,-4.80,3.37,0.00,1.00,-4.80,-4.80 +-43.20,-4.80,3.33,0.00,1.00,-4.80,-4.80 +-38.40,-0.00,3.29,0.00,1.00,-4.80,-4.80 +-33.60,-0.00,3.25,0.00,1.00,-0.00,-0.00 +-28.80,-0.00,3.21,0.00,1.00,-0.00,-0.00 +-24.00,-0.00,3.17,0.00,1.00,-0.00,-0.00 +-19.20,-0.00,3.13,0.00,1.00,-0.00,-0.00 +-14.40,-0.00,3.09,0.00,1.00,-0.00,-0.00 +-9.60,-0.00,3.05,0.00,1.00,-0.00,-0.00 +-4.80,-0.00,3.01,0.00,1.00,-0.00,0.00 +0.00,0.00,2.97,0.00,1.00,-0.00,0.00 +4.80,-0.00,2.93,0.00,1.00,-0.00,0.00 +9.60,-0.00,2.89,0.00,1.00,-0.00,0.00 +14.40,-0.00,2.85,0.00,1.00,-0.00,0.00 +19.20,-0.00,2.81,0.00,1.00,-0.00,0.00 +24.00,-0.00,2.77,0.00,1.00,-0.00,0.00 +28.80,-0.00,2.73,0.00,1.00,-0.00,0.00 +33.60,-0.00,2.69,0.00,1.00,-0.00,0.00 +38.40,-0.00,2.65,0.00,1.00,-0.00,0.00 +43.20,-0.00,2.61,0.00,1.00,-0.00,0.00 +48.00,-0.00,2.57,0.00,1.00,-0.00,0.00 +52.80,-0.00,2.53,0.00,1.00,-0.00,0.00 +57.60,-0.00,2.49,0.00,1.00,-0.00,0.00 +62.40,-0.00,2.45,0.00,1.00,-0.00,0.00 +67.20,-0.00,2.41,0.00,1.00,-4.80,0.00 +72.00,-0.00,2.37,0.00,1.00,-4.80,0.00 +76.80,-0.00,2.33,0.00,1.00,-4.80,0.00 +81.60,-0.00,2.29,0.00,1.00,-9.60,0.00 +86.40,-0.00,2.25,0.00,1.00,-19.20,0.00 +91.20,-0.00,2.21,0.00,1.00,-134.40,0.00 +96.00,-0.00,2.17,0.00,1.00,-168.00,0.00 +100.80,-0.00,2.13,0.00,1.00,-172.80,0.00 +105.60,-0.00,2.09,0.00,1.00,-177.60,0.00 +110.40,-0.00,2.05,0.00,1.00,-177.60,0.00 +115.20,-0.00,2.01,0.00,1.00,-177.60,0.00 +120.00,-0.00,1.96,0.00,1.00,-177.60,0.00 +124.80,-0.00,1.92,0.00,1.00,-177.60,0.00 +129.60,-0.00,1.88,0.00,1.00,-177.60,0.00 +134.40,-0.00,1.84,0.00,1.00,-177.60,0.00 +139.20,-0.00,1.80,0.00,1.00,-177.60,0.00 +144.00,-0.00,1.76,0.00,1.00,-177.60,0.00 +148.80,-0.00,1.72,0.00,1.00,-177.60,0.00 +153.60,-0.00,1.68,0.00,1.00,-177.60,0.00 +158.40,-0.00,1.64,0.00,1.00,-177.60,0.00 +163.20,-0.00,1.60,0.00,1.00,-177.60,0.00 +168.00,-0.00,1.56,0.00,1.00,-177.60,0.00 +172.80,-0.00,1.52,0.00,1.00,-177.60,0.00 +177.60,-0.00,1.48,0.00,1.00,-177.60,0.00 +-177.60,0.00,1.44,0.00,1.00,177.60,0.00 +-172.80,0.00,1.40,0.00,1.00,177.60,0.00 +-168.00,0.00,1.36,0.00,1.00,177.60,0.00 +-163.20,0.00,1.32,0.00,1.00,177.60,0.00 +-158.40,0.00,1.28,0.00,1.00,177.60,0.00 +-153.60,0.00,1.24,0.00,1.00,177.60,0.00 +-148.80,0.00,1.20,0.00,1.00,177.60,0.00 +-144.00,0.00,1.16,0.00,1.00,177.60,0.00 +-139.20,0.00,1.12,0.00,1.00,177.60,0.00 +-134.40,0.00,1.08,0.00,1.00,177.60,0.00 +-129.60,0.00,1.04,0.00,1.00,177.60,0.00 +-124.80,0.00,1.00,0.00,1.00,177.60,0.00 +-120.00,0.00,0.96,0.00,1.00,177.60,0.00 +-115.20,0.00,0.92,0.00,1.00,177.60,0.00 +-110.40,0.00,0.88,0.00,1.00,177.60,0.00 +-105.60,0.00,0.84,0.00,1.00,177.60,0.00 +-100.80,0.00,0.80,0.00,1.00,172.80,0.00 +-96.00,0.00,0.76,0.00,1.00,168.00,0.00 +-91.20,0.00,0.72,0.00,1.00,134.40,0.00 +-86.40,0.00,0.68,0.00,1.00,19.20,0.00 +-81.60,0.00,0.64,0.00,1.00,9.60,0.00 +-76.80,0.00,0.60,0.00,1.00,4.80,0.00 +-72.00,0.00,0.56,0.00,1.00,4.80,0.00 +-67.20,0.00,0.52,0.00,1.00,4.80,0.00 +-62.40,0.00,0.48,0.00,1.00,0.00,0.00 +-57.60,0.00,0.44,0.00,1.00,0.00,0.00 +-52.80,0.00,0.40,0.00,1.00,0.00,0.00 +-48.00,0.00,0.36,0.00,1.00,0.00,0.00 +-43.20,0.00,0.32,0.00,1.00,0.00,0.00 +-38.40,0.00,0.28,0.00,1.00,0.00,0.00 +-33.60,0.00,0.24,0.00,1.00,0.00,0.00 +-28.80,0.00,0.20,0.00,1.00,0.00,0.00 +-24.00,0.00,0.16,0.00,1.00,0.00,0.00 +-19.20,0.00,0.12,0.00,1.00,0.00,0.00 +-14.40,0.00,0.08,0.00,1.00,0.00,0.00 +-9.60,0.00,0.04,0.00,1.00,0.00,0.00 +-4.80,0.00,0.00,0.00,1.00,0.00,0.00 -- GitLab From 3eff482866b33e05c2a080860e17a3a6b32b92c2 Mon Sep 17 00:00:00 2001 From: "@ragot" Date: Thu, 27 Apr 2023 13:12:57 +0200 Subject: [PATCH 022/381] algorithmic tuning --- lib_enc/ivas_stat_enc.h | 5 +- lib_enc/ivas_stereo_dmx_evs.c | 244 +++++++++++++++++++--------------- 2 files changed, 139 insertions(+), 110 deletions(-) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 2562bc0e59..6cfbf5c365 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -995,9 +995,12 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float fad_g_prc[L_FRAME48k]; int16_t fad_len_prc; - float dmx_ener; + float dmx_pha_ener; + float dmx_poc_ener; float dmx_old_gain; + float aux_energy[CPE_CHANNELS]; + } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; #endif diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index d612ff9c7a..0d7e4134bf 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -67,12 +67,12 @@ #ifdef ENHANCED_STEREO_DMX -#define STEREO_DMX_EVS_PHA_LEN_16 15.0f -#define STEREO_DMX_EVS_FAD_LEN_16 2.0f -#define STEREO_DMX_EVS_PHA_LEN_32 5.0f -#define STEREO_DMX_EVS_FAD_LEN_32 1.0f -#define STEREO_DMX_EVS_PHA_LEN_48 5.0f -#define STEREO_DMX_EVS_FAD_LEN_48 0.5f +#define STEREO_DMX_EVS_PHA_LEN_16 240 /* 15 */ +#define STEREO_DMX_EVS_FAD_LEN_16 160 /* 10 */ +#define STEREO_DMX_EVS_PHA_LEN_32 160 /* 5 */ +#define STEREO_DMX_EVS_FAD_LEN_32 320 /* 10 */ +#define STEREO_DMX_EVS_PHA_LEN_48 240 /* 5 */ +#define STEREO_DMX_EVS_FAD_LEN_48 240 /* 5 */ #define STEREO_DMX_EVS_ISD_THRES 1.3f #define STEREO_DMX_EVS_ISD_DIST_THRES 0.42f @@ -82,6 +82,11 @@ #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 #define STEREO_DMX_EVS_FADE_LEN_PRC 20.0f +#define STEREO_DMX_EVS_NB_SBFRM 5 +#define STEREO_DMX_EVS_TRNS_DTC_INST 30.0f +#define STEREO_DMX_EVS_CRST_FCTR 25.0f +#define STEREO_DMX_EVS_EGY_FORGETTING 0.75f + #endif /*-----------------------------------------------------------------------* @@ -455,9 +460,6 @@ static void calc_poc( hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD2; } - if (hPHA->curr_pha != STEREO_DMX_EVS_NO_PHA) - { - if (hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD) { ipd_ff = hPHA->ipd_ff; @@ -543,12 +545,11 @@ static void calc_poc( p_curr_taps_l2r = hPHA->p_curr_taps[0]; p_curr_taps_l2r[0] = p_curr_taps[0]; - for ( i = 1; i < input_frame; i++ ) + for ( i = 1; i < hPHA->pha_len; i++ ) { p_curr_taps_l2r[i] = p_curr_taps[input_frame-i]; } } - } for ( n = 0; n < CPE_CHANNELS; n++ ) { @@ -564,10 +565,10 @@ static void calc_poc( { energy += hPHA->p_curr_taps[n][i] *hPHA->p_curr_taps[n][i]; } - energy = sqrtf( energy ); + energy = 1.0/sqrtf( energy ); for ( i = 0; i < hPHA->pha_len; i++ ) { - hPHA->p_curr_taps[n][i] /= energy; + hPHA->p_curr_taps[n][i] *= energy; } } } @@ -1040,10 +1041,12 @@ void stereo_dmx_evs_enc( #ifdef ENHANCED_STEREO_DMX int16_t k, m, pha_len, fad_len; - float mem_out_curr[CPE_CHANNELS][L_FRAME48k], mem_out_last[L_FRAME48k]; - float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_mem_out_curr, *p_data_f; - float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, dmx_gain; + float mem_prev[L_FRAME48k]; + float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; + float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, dmx_gain, ftmp; STEREO_DMX_EVS_PRC curr_prc; + int16_t is_transient, input_subframe; + float *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; #else float dmx_data[L_FRAME48k]; #endif @@ -1067,110 +1070,86 @@ void stereo_dmx_evs_enc( estimate_itd( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); + // poc + + if ( hStereoDmxEVS->itd ) + { + dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; + } + else + { + dmx_weight = 0.5f; + } + + create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, + hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); + + // pha + pha_len = hStereoDmxEVS->hPHA->pha_len; fad_len = hStereoDmxEVS->hPHA->fad_len; fad_g = hStereoDmxEVS->hPHA->fad_g; + set_zero(dmx_pha_data, input_frame); + set_zero(mem_prev, fad_len); + for ( k = 0; k < CPE_CHANNELS; k++ ) { - p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps[k]; - p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps[k]; - p_mem_out_curr = mem_out_curr[k]; - p_data_f = data_f[k]; - + p_data = data_f[k]; p_data_mem = hStereoDmxEVS->hPHA->data_mem[k]; mvr2r( &( p_data_mem[input_frame] ), p_data_mem, pha_len ); p_data_mem = &( p_data_mem[pha_len] ); - mvr2r( p_data_f, p_data_mem, input_frame ); + mvr2r( p_data, p_data_mem, input_frame ); + p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps[k]; if (p_prev_taps) { for (n = 0; n < fad_len; n++) { - mem_out_last[n] = 0; - for ( m = 0; m < pha_len; m++ ) - { - mem_out_last[n] += p_data_mem[n - m] * p_prev_taps[m]; + for (ftmp = 0, m = 0; m < pha_len; m++) { + ftmp += p_data_mem[n - m] * p_prev_taps[m]; } - mem_out_last[n] *= fad_g[fad_len - (1+n)]; + mem_prev[n] += ftmp; } } - - if (p_curr_taps) - { - if (p_prev_taps == NULL) + else { for (n = 0; n < fad_len; n++) { - mem_out_last[n] = fad_g[fad_len - (1+n)] * p_data_f[n]; + mem_prev[n] += p_data[n]; } } - for (n = 0; n < fad_len; n++) - { - p_mem_out_curr[n] = 0; - for ( m = 0; m < pha_len; m++ ) - { - p_mem_out_curr[n] += p_data_mem[n - m] * p_curr_taps[m]; - } - p_mem_out_curr[n] = fad_g[n] * p_mem_out_curr[n] + mem_out_last[n]; - } - for (; n < input_frame; n++) + p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps[k]; + if (p_curr_taps) { + for (n = 0; n < input_frame; n++) { - p_mem_out_curr[n] = 0; - for (m = 0; m < pha_len; m++) + for (ftmp = 0, m = 0; m < pha_len; m++) { - p_mem_out_curr[n] += p_data_mem[n - m] * p_curr_taps[m]; + ftmp += p_data_mem[n - m] * p_curr_taps[m]; } + dmx_pha_data[n] += ftmp; } } else { - if (p_prev_taps) - { - for (n = 0; n < fad_len; n++) + for (n = 0; n < input_frame; n++) { - p_mem_out_curr[n] = fad_g[n] * p_data_f[n] + mem_out_last[n]; - } - mvr2r( &(p_data_f[fad_len]), &(p_mem_out_curr[fad_len]), input_frame-fad_len ); - } - else - { - mvr2r( p_data_f, p_mem_out_curr, input_frame ); - } - } + dmx_pha_data[n] += p_data[n]; } - - // poc - - if ( hStereoDmxEVS->itd ) - { - dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; } - else - { - dmx_weight = 0.5f; } - create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, - hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); - - // pha - - for ( n=0; n < input_frame; n++ ) + for ( n=0, m=(fad_len-1); n < fad_len; n++, m-- ) { - dmx_pha_data[n] = (mem_out_curr[0][n] + mem_out_curr[1][n])*0.5f; + dmx_pha_data[n] *= fad_g[n]; + dmx_pha_data[n] += (mem_prev[n]) * fad_g[m]; } - /*calc_energy( dmx_pha_data, dmx_pha_data, &(hStereoDmxEVS->hPHA->dmx_ener), input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); - dmx_gain = sqrtf((hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1]) / (hStereoDmxEVS->hPHA->dmx_ener)); - *//*if (hStereoDmxEVS->aux_dmx_energy[0] > hStereoDmxEVS->aux_dmx_energy[1]) { - dmx_gain = sqrtf( ( hStereoDmxEVS->aux_dmx_energy[0] + EPSILON ) / ( hStereoDmxEVS->hPHA->dmx_ener + EPSILON ) ); - } else { - dmx_gain = sqrtf( ( hStereoDmxEVS->aux_dmx_energy[1] + EPSILON ) / ( hStereoDmxEVS->hPHA->dmx_ener + EPSILON ) ); - }*//* + calc_energy( dmx_pha_data, dmx_pha_data, &(hStereoDmxEVS->hPHA->dmx_pha_ener), input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + dmx_gain = INV_SQRT_2 * sqrtf((hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1]) / (hStereoDmxEVS->hPHA->dmx_pha_ener)); adapt_gain(dmx_pha_data, dmx_pha_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_old_gain, input_frame, hStereoDmxEVS->s_wnd); - hStereoDmxEVS->hPHA->dmx_old_gain = dmx_gain;*/ + hStereoDmxEVS->hPHA->dmx_old_gain = dmx_gain; // prc switch @@ -1216,8 +1195,43 @@ void stereo_dmx_evs_enc( hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; } - if ( hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC ) + input_subframe = input_frame / STEREO_DMX_EVS_NB_SBFRM; + is_transient = 0; + for ( k = 0; k < CPE_CHANNELS; k++ ) + { + for (m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++) + { + p_sub_frame = &(data_f[k][m * input_subframe]); + subframe_energy[m] = 0; + for ( n=0 ; n < input_subframe; n++ ) + { + subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; + } + + if (subframe_energy[m] / (hStereoDmxEVS->hPHA->aux_energy[k] + EPSILON) > STEREO_DMX_EVS_CRST_FCTR) + { + is_transient = 1; + } + + hStereoDmxEVS->hPHA->aux_energy[k] = STEREO_DMX_EVS_EGY_FORGETTING * hStereoDmxEVS->hPHA->aux_energy[k] + (1.0f - STEREO_DMX_EVS_EGY_FORGETTING) * subframe_energy[m]; + } + + for (m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++) + { + if (subframe_energy[m]/(subframe_energy[m-1] + EPSILON) > STEREO_DMX_EVS_TRNS_DTC_INST) + { + is_transient = 1; + } + } + } + + if (is_transient == 1) { + hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; + hStereoDmxEVS->hPHA->prc_hys_cnt = 0; + } + + if (hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC) { p_dmx_data = dmx_poc_data; if (curr_prc != hStereoDmxEVS->hPHA->curr_prc) @@ -1225,10 +1239,10 @@ void stereo_dmx_evs_enc( fad_len = hStereoDmxEVS->hPHA->fad_len_prc; fad_g = hStereoDmxEVS->hPHA->fad_g_prc; - for (n = 0; n < fad_len; n++) + for (n = 0, m=(fad_len-1); n < fad_len; n++, m--) { p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += (1.0f-fad_g[n]) * dmx_pha_data[n]; + p_dmx_data[n] += fad_g[m] * dmx_pha_data[n]; } } } @@ -1241,10 +1255,10 @@ void stereo_dmx_evs_enc( fad_len = hStereoDmxEVS->hPHA->fad_len_prc; fad_g = hStereoDmxEVS->hPHA->fad_g_prc; - for (n = 0; n < fad_len; n++) + for (n = 0, m=(fad_len-1); n < fad_len; n++, m--) { p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += (1.0f-fad_g[n]) * dmx_poc_data[n]; + p_dmx_data[n] += fad_g[m] * dmx_poc_data[n]; } } } @@ -1290,8 +1304,8 @@ ivas_error stereo_dmx_evs_init_encoder( int16_t n, input_frame; #ifdef ENHANCED_STEREO_DMX - int16_t f_len, pha_len, fad_len; - float *win, *fad_g; + int16_t m, f_len, pha_len, fad_len, fad_len2, trans_len; + float *win, *fad_g, fad_r, tmp_r; float a_min, a_max, a_step, n0, itrh; float *ipd_ff; @@ -1406,18 +1420,18 @@ ivas_error stereo_dmx_evs_init_encoder( if ( input_Fs == 16000 ) { - f_len = (int16_t)(STEREO_DMX_EVS_PHA_LEN_16 * (float)input_Fs / 1000.0f); - hStereoDmxEVS->hPHA->fad_len = (int16_t)(STEREO_DMX_EVS_FAD_LEN_16 * (float)input_Fs / 1000.0f); + f_len = STEREO_DMX_EVS_PHA_LEN_16; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_16; } else if ( input_Fs == 32000 ) { - f_len = (int16_t)(STEREO_DMX_EVS_PHA_LEN_32 * (float)input_Fs / 1000.0f); - hStereoDmxEVS->hPHA->fad_len = (int16_t)(STEREO_DMX_EVS_FAD_LEN_32 * (float)input_Fs / 1000.0f); + f_len = STEREO_DMX_EVS_PHA_LEN_32; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_32; } else if ( input_Fs == 48000 ) { - f_len = (int16_t)(STEREO_DMX_EVS_PHA_LEN_48 * (float)input_Fs / 1000.0f); - hStereoDmxEVS->hPHA->fad_len = (int16_t)(STEREO_DMX_EVS_FAD_LEN_48 * (float)input_Fs / 1000.0f); + f_len = STEREO_DMX_EVS_PHA_LEN_48; + hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48; } else { @@ -1429,21 +1443,25 @@ ivas_error stereo_dmx_evs_init_encoder( pha_len = hStereoDmxEVS->hPHA->pha_len; fad_len = hStereoDmxEVS->hPHA->fad_len; - win = hStereoDmxEVS->hPHA->win; - set_zero( win, L_FRAME48k ); - for ( n = 0; n < pha_len; n++ ) - { - win[n] = 0.5f * (1.0f + cosf( ( PI2 * ( n + 1 ) ) / ( ( f_len ) + 1 ) ) ); + trans_len = (int16_t)((float)pha_len / 20.0f); + set_f(hStereoDmxEVS->hPHA->win, 1.8f, pha_len - trans_len); + hStereoDmxEVS->hPHA->win[0] = 1.0f; + tmp_r = 1.0f / ((trans_len * 2) + 1); + win = &(hStereoDmxEVS->hPHA->win[pha_len - trans_len]); + for (n = 0; n < trans_len; n++) { + win[n] = (0.5f * (1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ))*1.8; } fad_g = hStereoDmxEVS->hPHA->fad_g; - for ( n = 0; n < fad_len; n++ ) - { - fad_g[n] = (float) n / (float)fad_len; + fad_r = 1.0f / (float)(fad_len + 1); + fad_len2 = fad_len / 2; + for (n = 0, m=(fad_len-1); n < fad_len2; n++, m--) { + fad_g[n] = (float)(n+1) * fad_r; + fad_g[m] = 1.0f - fad_g[n]; } - hStereoDmxEVS->hPHA->curr_pha = STEREO_DMX_EVS_NO_PHA; - hStereoDmxEVS->hPHA->prev_pha = STEREO_DMX_EVS_NO_PHA; + hStereoDmxEVS->hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD; + hStereoDmxEVS->hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD; hStereoDmxEVS->hPHA->pha_hys_cnt = 0; // Compute the forgetting factor @@ -1477,13 +1495,21 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->fad_len_prc = (int16_t)(STEREO_DMX_EVS_FADE_LEN_PRC * (float)input_Fs / 1000.0); fad_len = hStereoDmxEVS->hPHA->fad_len_prc; fad_g = hStereoDmxEVS->hPHA->fad_g_prc; - for ( n = 0; n < fad_len; n++ ) - { - fad_g[n] = (float) n / (float)fad_len; + fad_r = 1.0f / (float)(fad_len + 1); + fad_len2 = fad_len / 2; + for (n = 0, m=(fad_len-1); n < fad_len2; n++, m--) { + fad_g[n] = (float)(n+1) * fad_r; + fad_g[m] = 1.0f - fad_g[n]; } - hStereoDmxEVS->hPHA->dmx_ener = 0; - hStereoDmxEVS->hPHA->dmx_old_gain = 0; + hStereoDmxEVS->hPHA->dmx_pha_ener = 0; + hStereoDmxEVS->hPHA->dmx_poc_ener = 0; + hStereoDmxEVS->hPHA->dmx_old_gain = 1.; + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hStereoDmxEVS->hPHA->aux_energy[n] = 0.0f; + } #endif -- GitLab From d647e81bf56e1ab76bcad44e603da16c3b701726 Mon Sep 17 00:00:00 2001 From: "Brown, Stefanie" Date: Fri, 5 May 2023 13:48:00 +1000 Subject: [PATCH 023/381] Removing some unneeded comments. --- lib_com/ivas_rom_com.c | 1 - lib_enc/ivas_spar_md_enc.c | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index b220f19f9e..997106c08f 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -887,7 +887,6 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { /* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ - /* preferred tuning (3.2/4.9kbps) with/out TDD */ { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, { { 10000, 8300, 13150 } }, { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index cdfd6050ba..72f7cbab84 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -1714,8 +1714,7 @@ static void ivas_store_prior_coeffs( for ( i = 0; i < num_bands; i++ ) { b = i; - /* TODO: Bitrate switching will require dependence on bands_bw, and changes to time differential coding/prior index - storage for 6-12 band switching. e.g. b = (int16_t) floor( i * one_by_bands_bw ); */ + for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { hMdEnc->spar_md_prior.band_coeffs_idx[i].pred_index_re[j] = hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[j]; -- GitLab From 7c30f52dc92f08a06751da3ad9948dee43a65b49 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Fri, 5 May 2023 16:40:11 +0300 Subject: [PATCH 024/381] Add tests for combined orientations, fixes Add test file for combined orientations, test_combined_orientations.py Few fixes for checking enabled rotations and null pointers Add commented-out code part, which can be used to test near-BE behaviour of the combined orientations --- lib_dec/ivas_dirac_dec.c | 3 +- lib_rend/ivas_objectRenderer.c | 17 ++ lib_rend/ivas_rotation.c | 14 ++ .../const030_enableHead_noExt.csv | 4 + .../const030_noHead_enableExt.csv | 4 + .../trajectories/const030_noHead_noExt.csv | 4 + scripts/trajectories/const_minus030.csv | 4 + tests/test_combined_orientations.py | 159 ++++++++++++++++++ 8 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 scripts/trajectories/const030_enableHead_noExt.csv create mode 100644 scripts/trajectories/const030_noHead_enableExt.csv create mode 100644 scripts/trajectories/const030_noHead_noExt.csv create mode 100644 scripts/trajectories/const_minus030.csv create mode 100644 tests/test_combined_orientations.py diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index df1798405a..b6d9a5ded0 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2171,7 +2171,8 @@ void ivas_dirac_dec( } #ifdef EXTERNAL_ORIENTATIONS - if ( st_ivas->hHeadTrackData && st_ivas->hCombinedOrientationData ) + + if ( st_ivas->hHeadTrackData && st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] ) { p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[subframe_idx][0][0]; #else diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 77a913a58a..4e142437b6 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -544,10 +544,27 @@ void TDREND_Update_listener_orientation( UpVec[1] = Rmat[2][1]; UpVec[2] = Rmat[2][2]; #ifdef TD5 +#ifdef EXTERNAL_ORIENTATIONS + if ( Pos != NULL ) + { + /* Input position */ + Pos_p[0] = ( *Pos ).x; + Pos_p[1] = ( *Pos ).y; + Pos_p[2] = ( *Pos ).z; + } + else + { + /* Listener at the origin */ + Pos_p[0] = 0.0f; + Pos_p[1] = 0.0f; + Pos_p[2] = 0.0f; + } +#else /* Input position */ Pos_p[0] = ( *Pos ).x; Pos_p[1] = ( *Pos ).y; Pos_p[2] = ( *Pos ).z; +#endif #endif } else diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 37013546d8..ce3e5e6cd9 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -1174,6 +1174,20 @@ ivas_error combine_external_and_head_orientations( } } + // TODO(Nokia): remove this before merging to main + ////////////////////////////////////////////////////////////////////////// + /* Uncomment below to round the combined quaternions. Rounded values should get rid of numerical errors and + * the output should be BE.*/ + /*for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + float divFloat = 10000.0f; + hCombinedOrientationData->Quaternions[i].w = roundf(hCombinedOrientationData->Quaternions[i].w * divFloat) / divFloat; + hCombinedOrientationData->Quaternions[i].x = roundf(hCombinedOrientationData->Quaternions[i].x * divFloat) / divFloat; + hCombinedOrientationData->Quaternions[i].y = roundf(hCombinedOrientationData->Quaternions[i].y * divFloat) / divFloat; + hCombinedOrientationData->Quaternions[i].z = roundf(hCombinedOrientationData->Quaternions[i].z * divFloat) / divFloat; + }*/ + ////////////////////////////////////////////////////////////////////////// + if ( headRotQuaternions != NULL || hExtOrientationData != NULL ) { /* Calculate the combined rotation matrix */ diff --git a/scripts/trajectories/const030_enableHead_noExt.csv b/scripts/trajectories/const030_enableHead_noExt.csv new file mode 100644 index 0000000000..784bfcf70d --- /dev/null +++ b/scripts/trajectories/const030_enableHead_noExt.csv @@ -0,0 +1,4 @@ +0.965926,0.00,0.00,0.258819,1,0,0,0 +0.965926,0.00,0.00,0.258819,1,0,0,0 +0.965926,0.00,0.00,0.258819,1,0,0,0 +0.965926,0.00,0.00,0.258819,1,0,0,0 \ No newline at end of file diff --git a/scripts/trajectories/const030_noHead_enableExt.csv b/scripts/trajectories/const030_noHead_enableExt.csv new file mode 100644 index 0000000000..612df07495 --- /dev/null +++ b/scripts/trajectories/const030_noHead_enableExt.csv @@ -0,0 +1,4 @@ +0.965926,0.00,0.00,0.258819,0,1,0,0 +0.965926,0.00,0.00,0.258819,0,1,0,0 +0.965926,0.00,0.00,0.258819,0,1,0,0 +0.965926,0.00,0.00,0.258819,0,1,0,0 \ No newline at end of file diff --git a/scripts/trajectories/const030_noHead_noExt.csv b/scripts/trajectories/const030_noHead_noExt.csv new file mode 100644 index 0000000000..3272ad33bc --- /dev/null +++ b/scripts/trajectories/const030_noHead_noExt.csv @@ -0,0 +1,4 @@ +0.965926,0.00,0.00,0.258819,0,0,0,0 +0.965926,0.00,0.00,0.258819,0,0,0,0 +0.965926,0.00,0.00,0.258819,0,0,0,0 +0.965926,0.00,0.00,0.258819,0,0,0,0 \ No newline at end of file diff --git a/scripts/trajectories/const_minus030.csv b/scripts/trajectories/const_minus030.csv new file mode 100644 index 0000000000..9a6e49a63d --- /dev/null +++ b/scripts/trajectories/const_minus030.csv @@ -0,0 +1,4 @@ +-0.965926,-0.00,0.00,0.258819 +-0.965926,-0.00,0.00,0.258819 +-0.965926,-0.00,0.00,0.258819 +-0.965926,-0.00,0.00,0.258819 \ No newline at end of file diff --git a/tests/test_combined_orientations.py b/tests/test_combined_orientations.py new file mode 100644 index 0000000000..8a087bf939 --- /dev/null +++ b/tests/test_combined_orientations.py @@ -0,0 +1,159 @@ +__copyright__ = \ + """ + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + """ + +__doc__ = \ + """ + Test file to run C encoder and decoder code. + The outputs are compared with C generated references. + """ + +import os +import errno +import pytest + +from cmp_pcm import cmp_pcm +from conftest import EncoderFrontend, DecoderFrontend + +# params +input_mode_list = ['ism', 'sba', 'masa', 'mc'] +output_mode_list = ['BINAURAL', 'BINAURAL_ROOM'] +ivas_br_list = [13200, 16400, 24400, 32000, 48000, 64000, 80000, + 96000, 128000, 160000, 192000, 256000, 384000, 512000] + +head_ext_reference_list = [# Head rotation disabled, constant 30 degree external orientation --> output should be flipped external orientation, constant -30 degrees + ('full-circle-4s.csv', 'const030_noHead_enableExt.csv', 'const_minus030.csv'), + # Constant 240 degree head rotation, ext orientation disabled --> output should be same as head rotation, constant 240 degrees + ('const240.csv', 'const030_enableHead_noExt.csv', 'const240.csv'), + # Head rotation disabled, external orientation disabled --> output should be same as no rotation applied + ('full-circle-4s.csv', 'const030_noHead_noExt.csv', None, 'const000.csv'), + # Constant 30 degrees head rotation, constant 30 degrees external orientation --> rotations counter each other, output should be zero rotations (due to numerical errors the output is not exactly BE) + ('const030.csv', 'const030.csv', 'const000.csv')] + + +def check_and_makedir(dir_path): + if not os.path.exists(dir_path): + try: + os.makedirs(dir_path) + except OSError as e: + if e.errno != errno.EEXIST: + raise # raises the error again + + +@pytest.mark.parametrize("input_mode", input_mode_list) +@pytest.mark.parametrize("output_mode", output_mode_list) +@pytest.mark.parametrize("ivas_br", ivas_br_list) +@pytest.mark.parametrize("head_ext_reference", head_ext_reference_list) +def test_combined_orientations( + dut_encoder_frontend: EncoderFrontend, + dut_decoder_frontend: DecoderFrontend, + dut_base_path, + ivas_br, + head_ext_reference, + test_vector_path, + input_mode, + output_mode, +): + if input_mode == "ism" and ivas_br < 24400: + pytest.skip("ISM4 supported for bitrates above and including 24.4kbps") + + # Input parameters + in_fs = 48 + out_fs = 48 + out_fs_hz = 48000 + head_rotation_file = head_ext_reference[0] + ext_orientation_file = head_ext_reference[1] + reference_rotation_file = head_ext_reference[2] + head_rotation_file_path = f"{test_vector_path}/../trajectories/{head_rotation_file}" + ext_orientation_file_path = f"{test_vector_path}/../trajectories/{ext_orientation_file}" + + out_dir_bs = f"{dut_base_path}/combined_orientations" + check_and_makedir(out_dir_bs) + output_bitstream = f"{out_dir_bs}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}.bts" + dec_output_ref = f"{out_dir_bs}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_ref.wav" + dec_output_test = f"{out_dir_bs}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_test.wav" + + # Set options + if input_mode == "ism": + input_options = ['-ism', '4', f"{test_vector_path}/stvISM1.csv", f"{test_vector_path}/stvISM2.csv", f"{test_vector_path}/stvISM3.csv", f"{test_vector_path}/stvISM4.csv"] + input_audio_path = f"{test_vector_path}/stv4ISM48s.wav" + elif input_mode == "sba": + input_options = ['-sba', '1'] + input_audio_path = f"{test_vector_path}/stvFOA48c.wav" + elif input_mode == "masa": + input_options = ['-masa', '2', f"{test_vector_path}/stv1MASA2TC48c.met"] + input_audio_path = f"{test_vector_path}/stv1MASA2TC48c.wav" + elif input_mode == "mc": + input_options = ['-mc', '5_1'] + input_audio_path = f"{test_vector_path}/stv51MC48c.wav" + + # In MC binaural output, a different renderer is used if head rotation or external orientation file is detected + # in the input. Instead of not using a head rotation file, use zero head rotation for reference so that the same + # renderer is used in both cases (test head + ext, reference head). + if reference_rotation_file is None and output_mode == "BINAURAL": + reference_rotation_file = head_ext_reference[3] + + test_output_options = ['-T', f"{head_rotation_file_path}", '-EXOF', f"{ext_orientation_file_path}"] + ref_output_options = [] + if reference_rotation_file is not None: + reference_rotation_file_path = f"{test_vector_path}/../trajectories/{reference_rotation_file}" + ref_output_options = ['-T', f"{reference_rotation_file_path}"] + + # Encode + dut_encoder_frontend.run( + ivas_br, + in_fs, + input_audio_path, + output_bitstream, + add_option_list=input_options, + ) + + # Decode head + ext + dut_decoder_frontend.run( + output_mode, + out_fs, + output_bitstream, + dec_output_test, + add_option_list=test_output_options + ) + + # Decode reference + dut_decoder_frontend.run( + output_mode, + out_fs, + output_bitstream, + dec_output_ref, + add_option_list=ref_output_options + ) + + # Compare audio outputs + cmp_result, reason = cmp_pcm(dec_output_ref, dec_output_test, output_mode, out_fs_hz) + # Report compare result + assert cmp_result == 0, reason -- GitLab From 5e3fad251e0d8b468900aa85c1d0aa14854a9afb Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Fri, 5 May 2023 17:30:52 +0300 Subject: [PATCH 025/381] Add possiblity to run the combined orientation tests with real reference codec --- tests/test_combined_orientations.py | 44 +++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/tests/test_combined_orientations.py b/tests/test_combined_orientations.py index 8a087bf939..b6a7148fe4 100644 --- a/tests/test_combined_orientations.py +++ b/tests/test_combined_orientations.py @@ -74,6 +74,9 @@ def check_and_makedir(dir_path): def test_combined_orientations( dut_encoder_frontend: EncoderFrontend, dut_decoder_frontend: DecoderFrontend, + ref_encoder_path, + ref_decoder_path, + reference_path, dut_base_path, ivas_br, head_ext_reference, @@ -94,11 +97,23 @@ def test_combined_orientations( head_rotation_file_path = f"{test_vector_path}/../trajectories/{head_rotation_file}" ext_orientation_file_path = f"{test_vector_path}/../trajectories/{ext_orientation_file}" - out_dir_bs = f"{dut_base_path}/combined_orientations" - check_and_makedir(out_dir_bs) - output_bitstream = f"{out_dir_bs}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}.bts" - dec_output_ref = f"{out_dir_bs}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_ref.wav" - dec_output_test = f"{out_dir_bs}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_test.wav" + # Set reference encoder and decoder + if ref_encoder_path is None and ref_decoder_path is None: + ref_encoder_frontend = dut_encoder_frontend + ref_decoder_frontend = dut_decoder_frontend + else: + ref_encoder_frontend = EncoderFrontend(ref_encoder_path, "REF") + ref_decoder_frontend = DecoderFrontend(ref_decoder_path, "REF") + + # Set output paths + out_dir_bs_ref = f"{reference_path}/combined_orientations" + out_dir_bs_dut = f"{dut_base_path}/combined_orientations" + check_and_makedir(out_dir_bs_ref) + check_and_makedir(out_dir_bs_dut) + output_bitstream_ref = f"{out_dir_bs_ref}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_ref.bts" + output_bitstream_dut = f"{out_dir_bs_dut}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}.bts" + dec_output_ref = f"{out_dir_bs_ref}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_ref.wav" + dec_output_dut = f"{out_dir_bs_dut}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_test.wav" # Set options if input_mode == "ism": @@ -131,7 +146,14 @@ def test_combined_orientations( ivas_br, in_fs, input_audio_path, - output_bitstream, + output_bitstream_dut, + add_option_list=input_options, + ) + ref_encoder_frontend.run( + ivas_br, + in_fs, + input_audio_path, + output_bitstream_ref, add_option_list=input_options, ) @@ -139,21 +161,21 @@ def test_combined_orientations( dut_decoder_frontend.run( output_mode, out_fs, - output_bitstream, - dec_output_test, + output_bitstream_dut, + dec_output_dut, add_option_list=test_output_options ) # Decode reference - dut_decoder_frontend.run( + ref_decoder_frontend.run( output_mode, out_fs, - output_bitstream, + output_bitstream_ref, dec_output_ref, add_option_list=ref_output_options ) # Compare audio outputs - cmp_result, reason = cmp_pcm(dec_output_ref, dec_output_test, output_mode, out_fs_hz) + cmp_result, reason = cmp_pcm(dec_output_ref, dec_output_dut, output_mode, out_fs_hz) # Report compare result assert cmp_result == 0, reason -- GitLab From 7694079c728b9e553253ccca0c71e7eed60ef58a Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Mon, 8 May 2023 01:13:39 +0200 Subject: [PATCH 026/381] Algorithmic tuning and optimisation. --- lib_com/fft.c | 10 + lib_com/ivas_cnst.h | 15 ++ lib_enc/ivas_stat_enc.h | 24 +- lib_enc/ivas_stereo_dmx_evs.c | 468 +++++++++++++++++++++------------- 4 files changed, 333 insertions(+), 184 deletions(-) diff --git a/lib_com/fft.c b/lib_com/fft.c index e6121e818a..d8493b8726 100644 --- a/lib_com/fft.c +++ b/lib_com/fft.c @@ -6251,10 +6251,20 @@ void fft( { case 20: fft_len20( re, im, s ); +#ifdef ENHANCED_STEREO_DMX + case 16: + fft_lenN( re, im, FFT_RotVector_256, 256, 1, 16, s, 64, 64 ); + break; + case 32: + fft_lenN( re, im, FFT_RotVector_256, 256, 1, 32, s, 64, 64 ); break; +#endif case 40: fft_lenN( re, im, FFT_RotVector_640, 640, 5, 8, s, 8, 40 ); break; + case 50: + fft_lenN( re, im, FFT_RotVector_400, 400, 5, 10, s, 4, 40 ); + break; case 64: fft_lenN( re, im, FFT_RotVector_256, 256, 8, 8, s, 8, 64 ); break; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 582a52d513..e94cb926a6 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1660,6 +1660,21 @@ typedef enum * Stereo downmix EVS constants *----------------------------------------------------------------------------------*/ +#define STEREO_DMX_EVS_PHA_LEN_16 48 +#define STEREO_DMX_EVS_FAD_LEN_16 160 +#define STEREO_DMX_EVS_PHA_LEN_32 96 +#define STEREO_DMX_EVS_FAD_LEN_32 320 +#define STEREO_DMX_EVS_PHA_LEN_48 96 +#define STEREO_DMX_EVS_FAD_LEN_48 480 + +#define STEREO_DMX_EVS_SUBBAND_SIZE 2 +#define STEREO_DMX_EVS_NB_SUBBAND_MAX (L_FRAME48k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE)) + +#define STEREO_DMX_EVS_PHA_LEN_MAX 96 /* Max of PHA_LEN */ +#define STEREO_DMX_EVS_FAD_LEN_MAX 480 /* Max of FAD_LEN */ + +#define STEREO_DMX_EVS_DATA_LEN_MAX (STEREO_DMX_EVS_PHA_LEN_MAX + L_FRAME48k) + typedef enum { STEREO_DMX_EVS_PHA_IPD, diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 6cfbf5c365..a31d35e014 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -970,19 +970,21 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure #ifdef ENHANCED_STEREO_DMX typedef struct stereo_dmx_evs_correlation_filter_structure { - float ipd_ff[L_FRAME48k / 2 + 1]; - float Pr[L_FRAME48k / 2 + 1]; - float Pi[L_FRAME48k / 2 + 1]; + int16_t init_frmCntr; + float ipd_ff[STEREO_DMX_EVS_NB_SUBBAND_MAX]; + float Pr[STEREO_DMX_EVS_NB_SUBBAND_MAX]; + float Pi[STEREO_DMX_EVS_NB_SUBBAND_MAX]; + float rfft_ipd_coef[L_FRAME48k/2 + 1]; int16_t pha_len; int16_t fad_len; - float win[L_FRAME48k]; - float fad_g[L_FRAME48k]; - float *p_prev_taps[CPE_CHANNELS], prev_taps[CPE_CHANNELS][L_FRAME48k]; - float *p_curr_taps[CPE_CHANNELS], curr_taps[CPE_CHANNELS][L_FRAME48k]; + float win[STEREO_DMX_EVS_PHA_LEN_MAX]; + float fad_g[STEREO_DMX_EVS_FAD_LEN_MAX]; + float *p_prev_taps[CPE_CHANNELS], prev_taps[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; + float *p_curr_taps[CPE_CHANNELS], curr_taps[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; - float data_mem[CPE_CHANNELS][L_FRAME48k * 2]; + float data_mem[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; STEREO_DMX_EVS_PHA curr_pha; STEREO_DMX_EVS_PHA prev_pha; @@ -997,9 +999,11 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float dmx_pha_ener; float dmx_poc_ener; - float dmx_old_gain; + float dmx_pha_old_gain; + float dmx_poc_old_gain; - float aux_energy[CPE_CHANNELS]; + float trns_aux_energy[CPE_CHANNELS]; + float crst_fctr; } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 0d7e4134bf..91ab419af8 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -67,25 +67,27 @@ #ifdef ENHANCED_STEREO_DMX -#define STEREO_DMX_EVS_PHA_LEN_16 240 /* 15 */ -#define STEREO_DMX_EVS_FAD_LEN_16 160 /* 10 */ -#define STEREO_DMX_EVS_PHA_LEN_32 160 /* 5 */ -#define STEREO_DMX_EVS_FAD_LEN_32 320 /* 10 */ -#define STEREO_DMX_EVS_PHA_LEN_48 240 /* 5 */ -#define STEREO_DMX_EVS_FAD_LEN_48 240 /* 5 */ - -#define STEREO_DMX_EVS_ISD_THRES 1.3f -#define STEREO_DMX_EVS_ISD_DIST_THRES 0.42f -#define STEREO_DMX_EVS_SWTCH_HYS_THRES 1 - -#define STEREO_DMX_EVS_SWTCH_PRC_THRES 0.6f +#define STEREO_DMX_EVS_ISD_THRES 1.3f +#define STEREO_DMX_EVS_ISD_DIST_THRES_PHA 0.42f +#define STEREO_DMX_EVS_SWTCH_HYS_THRES 1 +#define STEREO_DMX_EVS_LR_EGY 100.0f +#define STEREO_DMX_EVS_ILDS_EGY 10000.0f + +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_16 55 +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_32 19 +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 + #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 #define STEREO_DMX_EVS_FADE_LEN_PRC 20.0f #define STEREO_DMX_EVS_NB_SBFRM 5 -#define STEREO_DMX_EVS_TRNS_DTC_INST 30.0f -#define STEREO_DMX_EVS_CRST_FCTR 25.0f -#define STEREO_DMX_EVS_EGY_FORGETTING 0.75f +#define STEREO_DMX_EVS_TRNS_DTC_INST 75.0f +#define STEREO_DMX_EVS_CRST_FCTR_16 80.0f +#define STEREO_DMX_EVS_CRST_FCTR_32 40.0f +#define STEREO_DMX_EVS_CRST_FCTR_48 35.0f + +#define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f +#define STEREO_DMX_EVS_PHA_EGY_FORGETTING 0.79f #endif @@ -200,31 +202,32 @@ static void calc_poc( float eps_cos, eps_sin, EPS; #ifdef ENHANCED_STEREO_DMX - float Nr, Ni, Dr, Di, ISD, isd_rate; - int16_t isd_cnt, n, end8; - float *Pr, *Pi, *ipd_ff; - float tPr, tPi, Pn; - float *p_curr_taps, *p_curr_taps_l2r; - float energy; + + int16_t isd_cnt, n, freq8k, nsbd, input_frame_pha; + float Nr, Ni, Dr, Di, ISD, tPr, tPi, Pn, energy, isd_rate; + float *Pr, *Pi, *ipd_ff, *p_curr_taps; + float rfft_pha_buf[L_FRAME48k], tEr[STEREO_DMX_EVS_NB_SUBBAND_MAX], tEl[STEREO_DMX_EVS_NB_SUBBAND_MAX]; #endif /* Initialization */ iN = 1.0f / (float) input_frame; + s = hPOC->sin; + P = hPOC->P; + n0 = input_frame / 2; + itdLR = hPOC->itdLR; #ifdef ENHANCED_STEREO_DMX Pr = hPHA->Pr; Pi = hPHA->Pi; + nsbd = n0 / STEREO_DMX_EVS_SUBBAND_SIZE; + input_frame_pha = input_frame / STEREO_DMX_EVS_SUBBAND_SIZE; + input_frame_pha = (input_frame_pha == 192) ? 200 : input_frame_pha; // Handle FFT 192 + input_frame_pha = (input_frame_pha == 96) ? 100 : input_frame_pha; // Handle FFT 96 #endif - s = hPOC->sin; - P = hPOC->P; - n0 = input_frame / 2; - itdLR = hPOC->itdLR; - igamma = STEREO_DMX_EVS_POC_GAMMA * iN; gamma = 1.0f - igamma; - step = 1; bias = 0; cos_step = 2; @@ -385,7 +388,12 @@ static void calc_poc( #ifdef ENHANCED_STEREO_DMX - end8 = L_FRAME16k / 2; + hPHA->init_frmCntr--; + if (hPHA->init_frmCntr<0) + { + hPHA->init_frmCntr=0; + } + freq8k = L_FRAME16k / 2; // Memorize the filters N-1 for ( n = 0; n < CPE_CHANNELS; n++ ) @@ -405,7 +413,7 @@ static void calc_poc( // ISD isd_cnt = 0; - for ( i = 1; i <= end8 ; i++ ) + for ( i = 1; i <= freq8k ; i++ ) { Nr = ( specLr[i] - specRr[i] ); Ni = ( specLi[i] - specRi[i] ); @@ -417,9 +425,10 @@ static void calc_poc( isd_cnt++; } } - isd_rate = (float)isd_cnt / (float)end8; + + isd_rate = (float)isd_cnt / (float)freq8k; - if (isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES) + if (isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_PHA) { if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD ) { @@ -460,97 +469,163 @@ static void calc_poc( hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD2; } - if (hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD) - { - ipd_ff = hPHA->ipd_ff; - for ( i = 0; i < ( end8 + 1 ); i++ ) - { - tPr = ( specLr[i] * specRr[i] + specLi[i] * specRi[i] ); - tPi = ( specLi[i] * specRr[i] - specLr[i] * specRi[i] ); - Pn = sqrtf( tPr * tPr + tPi * tPi ); - tPr /= (Pn+EPSILON); - tPi /= (Pn+EPSILON); + if (hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD) + { + ipd_ff = hPHA->ipd_ff; - if (fabs((double)tPr* (double)tPi) < EPSILON) - { - tPr = 1.; - tPi = 0.; - } + for (n = 1, i = 1; n < nsbd; n++) + { + tPr = 0.0f; + tPi = 0.0f; + tEr[n] = 0.0f; + tEl[n] = 0.0f; - Pr[i] = ipd_ff[i]*Pr[i] + (1.0f - ipd_ff[i])*tPr; - Pi[i] = ipd_ff[i]*Pi[i] + (1.0f - ipd_ff[i])*tPi; + for (j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++) + { + tPr += specLr[i] * specRr[i] + specLi[i] * specRi[i]; + tPi += specLi[i] * specRr[i] - specLr[i] * specRi[i]; + tEl[n] += specLr[i] * specLr[i] + specLi[i] * specLi[i]; + tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i]; } - for ( ; i < ( n0 + 1 ); i++ ) + + Pn = 1.0 / (sqrtf(tPr * tPr + tPi * tPi ) + EPSILON); + tPr *= Pn; + tPi *= Pn; + if (hPHA->init_frmCntr == 0) + { + Pr[n] = ipd_ff[n]*Pr[n] + (1.0f - ipd_ff[n])*tPr; + Pi[n] = ipd_ff[n]*Pi[n] + (1.0f - ipd_ff[n])*tPi; + Pn = 1.0 / (sqrtf(Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON); + Pr[n] *= Pn; + Pi[n] *= Pn; + } + else { - Pr[i] = 1.0; - Pi[i] = 0.0; + Pr[n] = tPr; + Pi[n] = tPi; } - - // PHA R2L - hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; + } + + hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; - p_curr_taps = hPHA->p_curr_taps[1]; + rfft_pha_buf[0] = 1.; + rfft_pha_buf[1] = 1.; - p_curr_taps[0] = Pr[0]; - p_curr_taps[1] = Pr[n0]; - for ( i = 1; i < n0+1; i++ ) + for ( i = 1; i < nsbd; i++ ) + { + if ((tEr[i] > STEREO_DMX_EVS_LR_EGY*tEl[i]) || (tEl[i] > STEREO_DMX_EVS_LR_EGY*tEr[i])) { - p_curr_taps[i * 2] = Pr[i]; - p_curr_taps[i * 2 + 1] = Pi[i]; + rfft_pha_buf[i * 2] = 1.; + rfft_pha_buf[i * 2 + 1] = 0.; } - rfft( p_curr_taps, rfft_coef, input_frame, +1 ); + else { + rfft_pha_buf[i * 2] = Pr[i]; + rfft_pha_buf[i * 2 + 1] = Pi[i]; + } + } - else + + // Handle FFT 192/96 + if ((input_frame_pha == 200) || (input_frame_pha == 100)) { - ipd_ff = hPHA->ipd_ff; - for ( i = 0; i < ( n0 + 1 ); i++ ) + tPr = rfft_pha_buf[2*nsbd-2]; + tPi = rfft_pha_buf[2*nsbd-1]; + for (i = 2*nsbd; i < input_frame_pha; i+=2) { - tPr = ( specLr[i] * specRr[i] + specLi[i] * specRi[i] ); - tPi = ( specLi[i] * specRr[i] - specLr[i] * specRi[i] ); - Pn = sqrtf( tPr * tPr + tPi * tPi ); - tPr /= (Pn+EPSILON); - tPi /= (Pn+EPSILON); + rfft_pha_buf[i] = tPr; + rfft_pha_buf[i+1] = tPi; + } + } - if (fabs((double)tPr* (double)tPi) < EPSILON) - { - tPr = 1.; - tPi = 0.; - } + rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); + mvr2r(rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len); + } + else + { + ipd_ff = hPHA->ipd_ff; + + for (n = 1, i = 1; n < nsbd; n++) + { + tPr = 0.0f; + tPi = 0.0f; + tEr[n] = 0.0f; + tEl[n] = 0.0f; - Pr[i] = ipd_ff[i]*Pr[i] + (1.0f - ipd_ff[i])*tPr; - Pi[i] = ipd_ff[i]*Pi[i] + (1.0f - ipd_ff[i])*tPi; + for (j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++) + { + tPr += specLr[i] * specRr[i] + specLi[i] * specRi[i]; + tPi += specLi[i] * specRr[i] - specLr[i] * specRi[i]; + tEl[n] += specLr[i] * specLr[i] + specLi[i] * specLi[i]; + tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i]; } - // PHA R2L - hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; - - p_curr_taps = hPHA->p_curr_taps[1]; + Pn = 1.0 / (sqrtf(tPr * tPr + tPi * tPi ) + EPSILON); + tPr *= Pn; + tPi *= Pn; - for ( i = 1; i < n0+1; i++ ) + if (hPHA->init_frmCntr == 0) { - Pn = sqrtf(Pr[i] * Pr[i] + Pi[i] * Pi[i] ); - tPr = Pr[i]/(Pn+EPSILON); - p_curr_taps[i * 2] = sqrtf((1.0f+tPr)/2.0f); - p_curr_taps[i * 2 + 1] = sqrtf((1.0f-tPr)/2.0f)*sign(Pi[i]); - + Pr[n] = ipd_ff[n]*Pr[n] + (1.0f - ipd_ff[n])*tPr; + Pi[n] = ipd_ff[n]*Pi[n] + (1.0f - ipd_ff[n])*tPi; + Pn = 1.0 / (sqrtf(Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON); + Pr[n] *= Pn; + Pi[n] *= Pn; + } + else + { + Pr[n] = tPr; + Pi[n] = tPi; } - p_curr_taps[0] = 1; - p_curr_taps[1] = 1; + } - rfft( p_curr_taps, rfft_coef, input_frame, +1 ); + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; + } - // PHA L2R - hPHA->p_curr_taps[0] = hPHA->curr_taps[0]; - - p_curr_taps_l2r = hPHA->p_curr_taps[0]; + rfft_pha_buf[0] = 1.; + rfft_pha_buf[1] = 1.; - p_curr_taps_l2r[0] = p_curr_taps[0]; - for ( i = 1; i < hPHA->pha_len; i++ ) + for ( i = 1; i < nsbd; i++ ) + { + if ((tEr[i] > STEREO_DMX_EVS_LR_EGY*tEl[i]) || (tEl[i] > STEREO_DMX_EVS_LR_EGY*tEr[i])) + { + rfft_pha_buf[i * 2] = 1.; + rfft_pha_buf[i * 2 + 1] = 0.; + } + else + { + rfft_pha_buf[i * 2] = sqrtf((1.0f+Pr[i])/2.0f); + rfft_pha_buf[i * 2 + 1] = sqrtf((1.0f-Pr[i])/2.0f)*sign(Pi[i]); + rfft_pha_buf[i * 2 + 1] = sqrtf((1.0f-rfft_pha_buf[i * 2])/2.0f)*sign(rfft_pha_buf[i * 2 + 1]); + rfft_pha_buf[i * 2] = sqrtf((1.0f+rfft_pha_buf[i * 2])/2.0f); + } + } + + // Handle FFT 192 / 96 + if ((input_frame_pha == 200) || (input_frame_pha == 100)) + { + tPr = rfft_pha_buf[2*nsbd-2]; + tPi = rfft_pha_buf[2*nsbd-1]; + for (i = 2*nsbd; i < input_frame_pha; i+=2) { - p_curr_taps_l2r[i] = p_curr_taps[input_frame-i]; + rfft_pha_buf[i] = tPr; + rfft_pha_buf[i+1] = tPi; } } + rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); + mvr2r(rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len); + + // PHA L2R + p_curr_taps = hPHA->p_curr_taps[0]; + p_curr_taps[0] = rfft_pha_buf[0]; + for ( i = 1; i < hPHA->pha_len; i++ ) + { + p_curr_taps[i] = rfft_pha_buf[input_frame_pha-i]; + } + } + for ( n = 0; n < CPE_CHANNELS; n++ ) { if (hPHA->p_curr_taps[n]) @@ -565,7 +640,7 @@ static void calc_poc( { energy += hPHA->p_curr_taps[n][i] *hPHA->p_curr_taps[n][i]; } - energy = 1.0/sqrtf( energy ); + energy = 1.0 / sqrtf( energy + EPSILON ); for ( i = 0; i < hPHA->pha_len; i++ ) { hPHA->p_curr_taps[n][i] *= energy; @@ -1041,11 +1116,11 @@ void stereo_dmx_evs_enc( #ifdef ENHANCED_STEREO_DMX int16_t k, m, pha_len, fad_len; - float mem_prev[L_FRAME48k]; + float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, dmx_gain, ftmp; STEREO_DMX_EVS_PRC curr_prc; - int16_t is_transient, input_subframe; + int16_t input_subframe, is_transient; float *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; #else float dmx_data[L_FRAME48k]; @@ -1068,6 +1143,46 @@ void stereo_dmx_evs_enc( #ifdef ENHANCED_STEREO_DMX + input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; + is_transient = 0; + for ( k = 0; k < CPE_CHANNELS; k++ ) + { + ftmp = 0; + for (m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++) + { + p_sub_frame = &(data_f[k][m * input_subframe]); + subframe_energy[m] = 0; + for ( n=0 ; n < input_subframe; n++ ) + { + subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; + } + + if (subframe_energy[m] / (hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON) > hStereoDmxEVS->hPHA->crst_fctr) + { + is_transient = 1; + } + + if (hStereoDmxEVS->hPHA->init_frmCntr == 0) + { + hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + (1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING) * subframe_energy[m]; + } + else + { + hStereoDmxEVS->hPHA->trns_aux_energy[k] = 0.5 * hStereoDmxEVS->hPHA->trns_aux_energy[k] + 0.5 * subframe_energy[m]; + } + + ftmp += subframe_energy[m]; + } + + for (m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++) + { + if (subframe_energy[m]/(subframe_energy[m-1] + EPSILON) > STEREO_DMX_EVS_TRNS_DTC_INST) + { + is_transient = 1; + } + } + } + estimate_itd( &corr, hStereoDmxEVS->hPOC, hStereoDmxEVS->hPHA, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); // poc @@ -1084,22 +1199,28 @@ void stereo_dmx_evs_enc( create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); + calc_energy( dmx_poc_data, dmx_poc_data, &(hStereoDmxEVS->hPHA->dmx_poc_ener), n_samples, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + dmx_gain = INV_SQRT_2 * sqrtf((hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1]) / (hStereoDmxEVS->hPHA->dmx_poc_ener)); + adapt_gain(dmx_poc_data, dmx_poc_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_poc_old_gain, n_samples, hStereoDmxEVS->s_wnd); + hStereoDmxEVS->hPHA->dmx_poc_old_gain = dmx_gain; + // pha pha_len = hStereoDmxEVS->hPHA->pha_len; fad_len = hStereoDmxEVS->hPHA->fad_len; fad_g = hStereoDmxEVS->hPHA->fad_g; - set_zero(dmx_pha_data, input_frame); + set_zero(dmx_pha_data, n_samples); set_zero(mem_prev, fad_len); for ( k = 0; k < CPE_CHANNELS; k++ ) - { + { p_data = data_f[k]; - p_data_mem = hStereoDmxEVS->hPHA->data_mem[k]; - mvr2r( &( p_data_mem[input_frame] ), p_data_mem, pha_len ); - p_data_mem = &( p_data_mem[pha_len] ); - mvr2r( p_data, p_data_mem, input_frame ); + mvr2r( hStereoDmxEVS->hPHA->data_mem[k], data_mem, pha_len ); + mvr2r( &(p_data[n_samples - pha_len]), hStereoDmxEVS->hPHA->data_mem[k], pha_len ); + p_data_mem = &( data_mem[pha_len] ); + mvr2r( p_data, p_data_mem, n_samples ); + p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps[k]; if (p_prev_taps) @@ -1113,16 +1234,16 @@ void stereo_dmx_evs_enc( } } else + { + for (n = 0; n < fad_len; n++) { - for (n = 0; n < fad_len; n++) - { mem_prev[n] += p_data[n]; - } } + } p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps[k]; if (p_curr_taps) { - for (n = 0; n < input_frame; n++) + for (n = 0; n < n_samples; n++) { for (ftmp = 0, m = 0; m < pha_len; m++) { @@ -1130,26 +1251,25 @@ void stereo_dmx_evs_enc( } dmx_pha_data[n] += ftmp; } - } - else + } + else { - for (n = 0; n < input_frame; n++) - { + for (n = 0; n < n_samples; n++) + { dmx_pha_data[n] += p_data[n]; - } - } + } + } } - for ( n=0, m=(fad_len-1); n < fad_len; n++, m-- ) - { + for (n = 0, m = (fad_len - 1); n < fad_len; n++, m--) { dmx_pha_data[n] *= fad_g[n]; dmx_pha_data[n] += (mem_prev[n]) * fad_g[m]; } - calc_energy( dmx_pha_data, dmx_pha_data, &(hStereoDmxEVS->hPHA->dmx_pha_ener), input_frame, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + calc_energy( dmx_pha_data, dmx_pha_data, &(hStereoDmxEVS->hPHA->dmx_pha_ener), n_samples, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); dmx_gain = INV_SQRT_2 * sqrtf((hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1]) / (hStereoDmxEVS->hPHA->dmx_pha_ener)); - adapt_gain(dmx_pha_data, dmx_pha_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_old_gain, input_frame, hStereoDmxEVS->s_wnd); - hStereoDmxEVS->hPHA->dmx_old_gain = dmx_gain; + adapt_gain(dmx_pha_data, dmx_pha_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_pha_old_gain, n_samples, hStereoDmxEVS->s_wnd); + hStereoDmxEVS->hPHA->dmx_pha_old_gain = dmx_gain; // prc switch @@ -1194,38 +1314,10 @@ void stereo_dmx_evs_enc( } hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; } - - input_subframe = input_frame / STEREO_DMX_EVS_NB_SBFRM; - is_transient = 0; - for ( k = 0; k < CPE_CHANNELS; k++ ) - { - for (m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++) - { - p_sub_frame = &(data_f[k][m * input_subframe]); - subframe_energy[m] = 0; - for ( n=0 ; n < input_subframe; n++ ) - { - subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; - } - - if (subframe_energy[m] / (hStereoDmxEVS->hPHA->aux_energy[k] + EPSILON) > STEREO_DMX_EVS_CRST_FCTR) - { - is_transient = 1; - } - hStereoDmxEVS->hPHA->aux_energy[k] = STEREO_DMX_EVS_EGY_FORGETTING * hStereoDmxEVS->hPHA->aux_energy[k] + (1.0f - STEREO_DMX_EVS_EGY_FORGETTING) * subframe_energy[m]; - } - - for (m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++) - { - if (subframe_energy[m]/(subframe_energy[m-1] + EPSILON) > STEREO_DMX_EVS_TRNS_DTC_INST) - { - is_transient = 1; - } - } - } - - if (is_transient == 1) + if ( (is_transient == 1) + || (hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY*hStereoDmxEVS->aux_dmx_energy[1]) + || (hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY*hStereoDmxEVS->aux_dmx_energy[0]) ) { hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prc_hys_cnt = 0; @@ -1259,6 +1351,7 @@ void stereo_dmx_evs_enc( { p_dmx_data[n] *= fad_g[n]; p_dmx_data[n] += fad_g[m] * dmx_poc_data[n]; + } } } @@ -1304,12 +1397,9 @@ ivas_error stereo_dmx_evs_init_encoder( int16_t n, input_frame; #ifdef ENHANCED_STEREO_DMX - int16_t m, f_len, pha_len, fad_len, fad_len2, trans_len; - float *win, *fad_g, fad_r, tmp_r; - - float a_min, a_max, a_step, n0, itrh; - float *ipd_ff; - + int16_t m, len, pha_len, fad_len, fad_len2, trans_len, itrh, rfft_ipd_coef_step, n0, input_frame_pha; + float *win, *fad_g, fad_r, tmp_r, a_min, a_max, a_step, *ipd_ff; + const float *p_ipd_w; #endif input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); @@ -1414,31 +1504,38 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->p_curr_taps[n] = NULL; hStereoDmxEVS->hPHA->p_prev_taps[n] = NULL; - set_zero( hStereoDmxEVS->hPHA->data_mem[n], L_FRAME48k * 2 ); - set_zero( hStereoDmxEVS->hPHA->curr_taps[n], L_FRAME48k ); + set_zero( hStereoDmxEVS->hPHA->data_mem[n], STEREO_DMX_EVS_PHA_LEN_MAX ); + set_zero( hStereoDmxEVS->hPHA->curr_taps[n], STEREO_DMX_EVS_PHA_LEN_MAX ); } if ( input_Fs == 16000 ) { - f_len = STEREO_DMX_EVS_PHA_LEN_16; + len = STEREO_DMX_EVS_PHA_LEN_16; hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_16; + hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_16; + hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_16; } else if ( input_Fs == 32000 ) { - f_len = STEREO_DMX_EVS_PHA_LEN_32; + len = STEREO_DMX_EVS_PHA_LEN_32; hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_32; + hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_32; + hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_32; } - else if ( input_Fs == 48000 ) + else if (input_Fs == 48000) { - f_len = STEREO_DMX_EVS_PHA_LEN_48; + len = STEREO_DMX_EVS_PHA_LEN_48; hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48; + hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_48; + hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_48; } - else + else { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" ); } - hStereoDmxEVS->hPHA->pha_len = f_len/2; + hStereoDmxEVS->hPHA->pha_len = len/2; + hStereoDmxEVS->hPHA->init_frmCntr = (int16_t)FRAMES_PER_SEC*0.2; pha_len = hStereoDmxEVS->hPHA->pha_len; fad_len = hStereoDmxEVS->hPHA->fad_len; @@ -1467,26 +1564,48 @@ ivas_error stereo_dmx_evs_init_encoder( // Compute the forgetting factor a_min = 0.8576958985908941f; a_max = 0.9440608762859234f; - itrh = 60; - n0 = L_FRAME16k / 2; + itrh = (3000 * input_frame) / (input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE); // 3kHz + n0 = L_FRAME16k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE); a_step = ( a_min - a_max ) / (n0+1-itrh); ipd_ff = hStereoDmxEVS->hPHA->ipd_ff; for ( n = 0; n < itrh; n++ ) { ipd_ff[n] = a_max; } - for ( ; n < ( n0 + 1 ); n++ ) + for ( ; n < ( n0 + 1 ); n++ ) // 8kHz { ipd_ff[n] = a_max + (n-itrh) * a_step; } - for ( ; n < L_FRAME48k/2+1; n++ ) + for ( ; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++ ) { ipd_ff[n] = a_min; } - set_f( hStereoDmxEVS->hPHA->Pr, 1.0, L_FRAME48k / 2 + 1 ); - set_zero( hStereoDmxEVS->hPHA->Pi, L_FRAME48k / 2 + 1 ); + set_f( hStereoDmxEVS->hPHA->Pr, 1.0, STEREO_DMX_EVS_NB_SUBBAND_MAX ); + set_zero( hStereoDmxEVS->hPHA->Pi, STEREO_DMX_EVS_NB_SUBBAND_MAX ); + + n0 = input_frame / (4 * STEREO_DMX_EVS_SUBBAND_SIZE); + input_frame_pha = input_frame / (2*STEREO_DMX_EVS_SUBBAND_SIZE); + + if (input_frame == L_FRAME16k) { + p_ipd_w = dft_trigo_32k; + rfft_ipd_coef_step = 4; + } else if (input_frame == L_FRAME32k) { + p_ipd_w = dft_trigo_32k; + rfft_ipd_coef_step = 2; + } else if (input_frame == L_FRAME48k) { + p_ipd_w = dft_trigo_48k; + rfft_ipd_coef_step = 2; + } else { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" ); + } - hStereoDmxEVS->hPHA->prc_thres = (int16_t)(STEREO_DMX_EVS_SWTCH_PRC_THRES * (float)input_Fs / 1000.0); + win = hStereoDmxEVS->hPHA->rfft_ipd_coef; + len = rfft_ipd_coef_step * STEREO_DMX_EVS_SUBBAND_SIZE; + for (n = 0; n < n0; n++) { + win[n] = p_ipd_w[n * len]; + win[input_frame_pha - n] = p_ipd_w[n * len]; + } + win[n0] = p_ipd_w[n0 * len]; hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; @@ -1504,11 +1623,12 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->dmx_pha_ener = 0; hStereoDmxEVS->hPHA->dmx_poc_ener = 0; - hStereoDmxEVS->hPHA->dmx_old_gain = 1.; + hStereoDmxEVS->hPHA->dmx_pha_old_gain = 1.; + hStereoDmxEVS->hPHA->dmx_poc_old_gain = 1.; for ( n = 0; n < CPE_CHANNELS; n++ ) { - hStereoDmxEVS->hPHA->aux_energy[n] = 0.0f; + hStereoDmxEVS->hPHA->trns_aux_energy[n] = 0.0f; } #endif -- GitLab From 3071b455f8f2009dd05be236dd016906cb85823e Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Mon, 8 May 2023 13:27:30 +0530 Subject: [PATCH 027/381] Added clean up changes for VLBR --- lib_com/bitstream.c | 2 + lib_com/ivas_dirac_com.c | 45 ++++++++-- lib_com/ivas_fb_mixer.c | 7 +- lib_com/ivas_prot.h | 49 +++++++--- lib_com/ivas_sba_config.c | 3 +- lib_com/ivas_spar_com.c | 2 + lib_com/options.h | 2 + lib_dec/ivas_corecoder_dec_reconfig.c | 6 +- lib_dec/ivas_dec.c | 32 ++++++- lib_dec/ivas_dirac_dec.c | 95 +++++++++++++++++--- lib_dec/ivas_init_dec.c | 50 ++++++++++- lib_dec/ivas_masa_dec.c | 9 +- lib_dec/ivas_output_config.c | 6 +- lib_dec/ivas_qmetadata_dec.c | 22 ++++- lib_dec/ivas_sba_dec.c | 9 +- lib_dec/ivas_sba_dirac_stereo_dec.c | 32 ++++++- lib_dec/ivas_sba_rendering_internal.c | 11 ++- lib_dec/ivas_sce_dec.c | 9 ++ lib_dec/ivas_spar_decoder.c | 5 ++ lib_dec/ivas_stat_dec.h | 2 + lib_dec/lib_dec.c | 2 + lib_enc/ivas_cpe_enc.c | 10 ++- lib_enc/ivas_dirac_enc.c | 52 +++++++++-- lib_enc/ivas_enc.c | 17 +++- lib_enc/ivas_init_enc.c | 16 +++- lib_enc/ivas_ism_param_enc.c | 5 ++ lib_enc/ivas_masa_enc.c | 6 +- lib_enc/ivas_mc_param_enc.c | 4 + lib_enc/ivas_mcmasa_enc.c | 15 +++- lib_enc/ivas_mct_enc.c | 19 +++- lib_enc/ivas_qmetadata_enc.c | 36 +++++++- lib_enc/ivas_sce_enc.c | 5 +- lib_enc/ivas_spar_encoder.c | 17 +++- lib_enc/ivas_stat_enc.h | 2 + lib_enc/lib_enc.c | 6 ++ lib_rend/ivas_dirac_dec_binaural_functions.c | 9 +- lib_rend/lib_rend.c | 6 ++ 37 files changed, 545 insertions(+), 80 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 0a206fcdb5..ee80be77ac 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -1801,7 +1801,9 @@ ivas_error preview_indices( if ( bit_stream[2] == 0 ) { st_ivas->ivas_format = SBA_FORMAT; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = ivas_sba_mode_select(); +#endif } else { diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index e4bea78e79..c3a141b67e 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -70,7 +70,9 @@ ivas_error ivas_dirac_config( ivas_error error; int16_t spar_dirac_split_band; IVAS_FB_MIXER_HANDLE hFbMdft; +#ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode; +#endif int16_t *dirac_to_spar_md_bands; error = IVAS_ERR_OK; @@ -88,7 +90,9 @@ ivas_error ivas_dirac_config( band_grouping = ( (Encoder_Struct *) st_ivas )->hDirAC->band_grouping; hConfig = ( (Encoder_Struct *) st_ivas )->hDirAC->hConfig; hQMetaData = ( (Encoder_Struct *) st_ivas )->hQMetaData; +#ifndef SBA_MODE_CLEAN_UP sba_mode = ( (Encoder_Struct *) st_ivas )->sba_mode; +#endif if ( ( (Encoder_Struct *) st_ivas )->hSpar != NULL ) { hFbMdft = ( (Encoder_Struct *) st_ivas )->hSpar->hFbMixer; @@ -112,7 +116,9 @@ ivas_error ivas_dirac_config( band_grouping = ( (Decoder_Struct *) st_ivas )->hDirAC->band_grouping; hConfig = ( (Decoder_Struct *) st_ivas )->hDirAC->hConfig; hQMetaData = ( (Decoder_Struct *) st_ivas )->hQMetaData; +#ifndef SBA_MODE_CLEAN_UP sba_mode = ( (Decoder_Struct *) st_ivas )->sba_mode; +#endif if ( ( (Decoder_Struct *) st_ivas )->hSpar != NULL ) { hFbMdft = ( (Decoder_Struct *) st_ivas )->hSpar->hFbMixer; @@ -124,8 +130,11 @@ ivas_error ivas_dirac_config( ( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft; dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands; } - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { hConfig->nbands = IVAS_MAX_NUM_BANDS; spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); @@ -142,28 +151,38 @@ ivas_error ivas_dirac_config( #endif if ( ivas_format == SBA_FORMAT ) /* skip for MASA decoder */ { +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_dirac_sba_config( hQMetaData, nchan_transport, nSCE, nCPE, element_mode, ivas_total_brate, sba_order, sba_mode, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_dirac_sba_config( hQMetaData, element_mode, ivas_total_brate, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) +#endif { return error; } if ( hQMetaData != NULL ) { +#ifndef SBA_MODE_CLEAN_UP if ( enc_dec == ENC || sba_mode != SBA_MODE_SPAR ) +#else + if ( enc_dec == ENC || ivas_format != SBA_FORMAT ) +#endif { hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands; } hConfig->enc_param_start_band = hQMetaData->q_direction[0].cfg.start_band + spar_dirac_split_band; } - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif hConfig->dec_param_estim = TRUE; if ( hConfig->dec_param_estim == TRUE ) { hConfig->enc_param_start_band = spar_dirac_split_band; } +#ifndef SBA_MODE_CLEAN_UP } else { @@ -172,9 +191,13 @@ ivas_error ivas_dirac_config( hConfig->dec_param_estim = TRUE; } } +#endif } - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); @@ -301,26 +324,33 @@ void ivas_dirac_config_bands( ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ +#ifndef SBA_MODE_CLEAN_UP int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ int16_t *nSCE, /* o : number of SCEs */ int16_t *nCPE, /* o : number of CPEs */ +#endif int16_t *element_mode, /* i/o: element mode of the core coder */ int32_t sba_total_brate, /* i : SBA total bitrate */ +#ifndef SBA_MODE_CLEAN_UP const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t nbands /* i : number of frequency bands */ + const SBA_MODE sba_mode, /* i : SBA mode */ +#endif + const int16_t nbands /* i : number of frequency bands */ ) { +#ifndef SBA_MODE_CLEAN_UP int16_t i; int16_t nbands_wb; +#endif int16_t nbands_coded; ivas_error error; error = IVAS_ERR_OK; hQMetaData->is_masa_ivas_format = 0; - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif /* map the bitrate for SID frame */ if ( sba_total_brate == IVAS_SID_5k2 ) { @@ -417,6 +447,7 @@ ivas_error ivas_dirac_sba_config( hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; return error; +#ifndef SBA_MODE_CLEAN_UP } if ( sba_total_brate > IVAS_SID_5k2 ) @@ -558,8 +589,8 @@ ivas_error ivas_dirac_sba_config( assert( !"SBA number of transport channels must be 8 or lower" ); } } - return error; +#endif } diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index f42e8bde74..9dd511d80b 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -101,7 +101,9 @@ static int16_t ivas_get_num_bands( ivas_error ivas_fb_set_cfg( IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ const int16_t ivas_format, /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#endif const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels*/ const int16_t active_w_mixing, /* i : active_w_mixing flag */ @@ -131,12 +133,14 @@ ivas_error ivas_fb_set_cfg( else if ( ivas_format == SBA_FORMAT ) { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); pFb_cfg->prior_input_length = NS2SA( sampling_rate, FRAME_SIZE_NS ); pFb_cfg->windowed_fr_offset = (int16_t) ( (float) ( sampling_rate / FRAMES_PER_SEC ) * 3.0f / 4.0f ) - NS2SA( sampling_rate, DELAY_DIRAC_SPAR_ENC_CMP_NS ); +#ifndef SBA_MODE_CLEAN_UP } else /* SBA_MODE_DIRAC */ { @@ -145,6 +149,7 @@ ivas_error ivas_fb_set_cfg( /* extra SPAR/DirAC synchro delay */ pFb_cfg->prior_input_length += NS2SA( sampling_rate, DELAY_FB_1_NS ); } +#endif } else if ( ivas_format == MASA_FORMAT ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 890390309f..19b6f515fe 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2938,8 +2938,11 @@ void reset_metadata_spatial( const int32_t element_brate, /* i : element bitrate */ int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata, /* i : number of meatdata bits */ + const int16_t nb_bits_metadata /* i : number of meatdata bits */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ); /*! r: number of bits written */ @@ -2947,8 +2950,11 @@ void ivas_qmetadata_enc_sid_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure*/ - const int16_t ivas_format, /* i : ivas format */ + const int16_t ivas_format /* i : ivas format */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ); /*! r: number of bits read */ @@ -2965,8 +2971,11 @@ int16_t ivas_qmetadata_dec_sid_decode( int16_t *index, /* i/o: bitstream position */ const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ - const int16_t ivas_format, /* i : IVAS format */ + const int16_t ivas_format /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ); void ivas_qmetadata_to_dirac( @@ -2974,7 +2983,11 @@ void ivas_qmetadata_to_dirac( DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */ MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format, /* i : IVAS format */ +#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3170,10 +3183,14 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, - const SBA_MODE sba_mode +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode +#else + const IVAS_FORMAT ivas_format +#endif ); - +#ifndef SBA_MODE_CLEAN_UP /*----------------------------------------------------------------------------------* * SBA format prototypes *----------------------------------------------------------------------------------*/ @@ -3182,7 +3199,7 @@ void ivas_dirac_param_est_enc( SBA_MODE ivas_sba_mode_select( void ); - +#endif void ivas_sba_config( const int32_t sba_total_brate, /* i : SBA total bitrate */ int16_t sba_order, /* i : Ambisonic (SBA) order */ @@ -3311,7 +3328,7 @@ void ivas_dirac_enc_close( DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ const int32_t input_Fs /* i : input sampling_rate */ ); - +#ifndef SBA_MODE_CLEAN_UP void ivas_dirac_enc( DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -3322,7 +3339,7 @@ void ivas_dirac_enc( const int16_t input_frame, /* i : input frame length */ const int16_t sba_planar /* i : SBA planar flag */ ); - +#endif ivas_error ivas_dirac_config( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ const int16_t enc_dec /* i : encoder or decoder flag */ @@ -3340,13 +3357,17 @@ void ivas_dirac_config_bands( ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ +#ifndef SBA_MODE_CLEAN_UP int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ int16_t *nSCE, /* o : number of SCEs */ int16_t *nCPE, /* o : number of CPEs */ +#endif int16_t *element_mode, /* o : element mode of the core coder */ int32_t sba_total_brate, /* i : SBA total bitrate */ +#ifndef SBA_MODE_CLEAN_UP const int16_t sba_order, /* i : Ambisonic (SBA) order */ const SBA_MODE sba_mode, /* i : SBA mode */ +#endif const int16_t nbands /* i : number of frequency bands */ ); @@ -3369,7 +3390,9 @@ void ivas_dirac_dec_read_BS( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ int16_t *nb_bits, /* o : number of bits read */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -4904,7 +4927,11 @@ void computeReferencePower_enc( float *reference_power, /* o : Estimated power */ const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format /* i : ivas_format */ +#endif ); ivas_error ivas_mono_dmx_renderer_open( @@ -5024,7 +5051,9 @@ ivas_error ivas_td_binaural_renderer( ivas_error ivas_fb_set_cfg( IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ const int16_t ivas_format, /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#endif const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ @@ -5050,13 +5079,13 @@ void ivas_fb_mixer_pcm_ingest( float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_length /* i : frame length */ ); - +#ifndef SBA_MODE_CLEAN_UP void ivas_dirac_enc_spar_delay_synchro( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const int16_t input_frame, /* i : input frame length */ float data_f[][L_FRAME48k] /* i/o: SBA channels (ACN / SN3D) */ ); - +#endif void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index d307e3e9ac..22ff1b21b2 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -46,7 +46,7 @@ #endif #include "wmc_auto.h" - +#ifndef SBA_MODE_CLEAN_UP /*-------------------------------------------------------------------* * ivas_sba_mode_select() * @@ -58,6 +58,7 @@ SBA_MODE ivas_sba_mode_select() { return SBA_MODE_SPAR; } +#endif /*-------------------------------------------------------------------* * ivas_sba_config() * diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 481812d22d..30420879b1 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -435,10 +435,12 @@ int16_t ivas_get_sba_num_TCs( { nchan_transport = 1; } +#ifndef SBA_MODE_CLEAN_UP else if ( ivas_sba_mode_select() == SBA_MODE_DIRAC ) { nchan_transport = 1; } +#endif else { table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); diff --git a/lib_com/options.h b/lib_com/options.h index 1728371c0f..9ec91435ba 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,6 +166,8 @@ #define FIX_391_SBA /* Dlb: Fix for issue 391 for SBA */ #define EUALER2QUAT_FIX /*Dlb :fix for issue 430 issue in euler2quat, sign of quat y is inverted*/ +#define SBA_MODE_CLEAN_UP /* Dlb: Cean up SBA mode references */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ + #endif diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index 9d15f1bdfc..86aee2d164 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -510,9 +510,13 @@ ivas_error ivas_cldfb_dec_reconfig( } } } - +#ifndef SBA_MODE_CLEAN_UP /* CLDFB Interpolation weights */ if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) +#else + /* CLDFB Interpolation weights */ + if ( st_ivas->ivas_format == SBA_FORMAT && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) +#endif { ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 11cc33af48..30f4b6d360 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -253,28 +253,43 @@ ivas_error ivas_dec( set_s( nb_bits_metadata, 0, MAX_SCE ); /* read parameters from the bitstream */ +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT ) +#endif { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) { ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, 0 ); } else { +#endif if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { return error; } +#ifndef SBA_MODE_CLEAN_UP } +#endif } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; +#ifndef SBA_MODE_CLEAN_UP ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, st_ivas->hSpar->dirac_to_spar_md_bands ); +#else + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->hSpar->dirac_to_spar_md_bands ); +#endif } if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) @@ -330,8 +345,11 @@ ivas_error ivas_dec( if ( st_ivas->sba_dirac_stereo_flag ) { nchan_remapped = nchan_out; - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); @@ -360,8 +378,12 @@ ivas_error ivas_dec( if ( st_ivas->ivas_format == SBA_FORMAT ) { nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame ); - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) +#else + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + +#endif { ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); } @@ -386,7 +408,11 @@ ivas_error ivas_dec( { ivas_dirac_dec_binaural( st_ivas, output, nchan_remapped ); } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT ) +#else + else if ( st_ivas->ivas_format == MASA_FORMAT ) +#endif { if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 446ed23bb3..5bba194c41 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -170,7 +170,11 @@ ivas_error ivas_dirac_dec_config( num_protos_diff_old = 0; nchan_transport_orig = st_ivas->nchan_transport; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) +#endif { st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); } @@ -256,7 +260,11 @@ ivas_error ivas_dirac_dec_config( } /* band config needed only for SPAR with FOA output */ +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->ivas_format == SBA_FORMAT ) +#endif { return IVAS_ERR_OK; } @@ -509,8 +517,11 @@ ivas_error ivas_dirac_dec_config( { hDirAC->num_protos_diff = 1; hDirAC->num_protos_dir = nchan_transport; - +#ifndef SBA_MODE_CLEAN_UP if ( ( st_ivas->sba_planar ) && ( !( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) ) ) +#else + if ( ( st_ivas->sba_planar ) && ( !( st_ivas->ivas_format == SBA_FORMAT ) ) ) +#endif { hDirAC->num_protos_dir++; } @@ -620,7 +631,11 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { hDirAC->hoa_decoder = NULL; +#ifndef SBA_MODE_CLEAN_UP if ( ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->sba_mode == SBA_MODE_SPAR || ( nchan_transport > 2 ) ) +#else + if ( ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->ivas_format == SBA_FORMAT || ( nchan_transport > 2 ) ) +#endif { if ( hDirAC->hOutSetup.is_loudspeaker_setup ) { @@ -836,7 +851,7 @@ ivas_error ivas_dirac_dec_config( { int16_t num_slots_in_subfr; num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES * num_slots_in_subfr; @@ -847,12 +862,15 @@ ivas_error ivas_dirac_dec_config( } else { +#endif hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; hDirAC->dirac_read_idx = 0; hDirAC->dirac_estimator_idx = 0; +#ifndef SBA_MODE_CLEAN_UP } +#endif } if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) @@ -991,7 +1009,11 @@ ivas_error ivas_dirac_dec_config( { int16_t num_slots_in_subfr; num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { if ( ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) ) { @@ -1652,7 +1674,9 @@ void ivas_dirac_dec_read_BS( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ int16_t *nb_bits, /* o : number of bits read */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { @@ -1668,14 +1692,15 @@ void ivas_dirac_dec_read_BS( /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) { assert( ( b == 0 ) || ( hQMetaData->q_direction[0].cfg.start_band > 0 ) ); } - +#endif if ( b == 1 ) /* WB 4TCs condition, no other metadata to read*/ { +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) { if ( hDirAC != NULL ) @@ -1700,6 +1725,7 @@ void ivas_dirac_dec_read_BS( } else { +#endif orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; hQMetaData->sba_inactive_mode = 1; @@ -1713,9 +1739,11 @@ void ivas_dirac_dec_read_BS( set_zero( hQMetaData->q_direction[0].band_data[b].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); } } - +#ifndef SBA_MODE_CLEAN_UP *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); - +#else + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT); +#endif for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; @@ -1733,7 +1761,9 @@ void ivas_dirac_dec_read_BS( } hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; +#ifndef SBA_MODE_CLEAN_UP } +#endif } else { @@ -1781,11 +1811,15 @@ void ivas_dirac_dec_read_BS( } } } - +#ifndef SBA_MODE_CLEAN_UP *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); - +#else + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); +#endif +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; @@ -1803,19 +1837,25 @@ void ivas_dirac_dec_read_BS( } hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; +#ifndef SBA_MODE_CLEAN_UP } else { *nb_bits += SID_FORMAT_NBITS; } - +#endif st->next_bit_pos = next_bit_pos_orig; } if ( hDirAC != NULL ) { +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode, dirac_to_spar_md_bands ); +#else + ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, SBA_FORMAT, dirac_to_spar_md_bands ); + +#endif } return; @@ -1833,7 +1873,11 @@ void ivas_qmetadata_to_dirac( DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */ MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format, /* i : IVAS format */ +#endif int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { @@ -1946,8 +1990,11 @@ void ivas_qmetadata_to_dirac( nblocks = q_direction->cfg.nblocks; nbands = hDirAC->band_grouping[hDirAC->hConfig->nbands]; band_grouping = hDirAC->band_grouping; - +#ifndef SBA_MODE_CLEAN_UP if ( ivas_total_brate <= IVAS_SID_5k2 && sba_mode != SBA_MODE_SPAR ) +#else + if ( ivas_total_brate <= IVAS_SID_5k2 && ivas_format != SBA_FORMAT ) +#endif { /* SID/zero-frame: 1 direction, 5 bands, nblocks re-generated out of SID decoder*/ start_band = 0; @@ -1959,8 +2006,11 @@ void ivas_qmetadata_to_dirac( { assert( ( hQMetaData->no_directions == 1 ) && "Only 1 direction supported in SBA mode!" ); start_band = hDirAC->hConfig->enc_param_start_band; - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { hDirAC->hConfig->nbands = IVAS_MAX_NUM_BANDS; } @@ -2002,8 +2052,11 @@ void ivas_qmetadata_to_dirac( band_start = band_grouping[band]; band_end = band_grouping[band + 1]; tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { qBand_idx = dirac_to_spar_md_bands[band] - start_band; } @@ -2197,8 +2250,11 @@ void ivas_dirac_dec( reference_power_smooth = DirAC_mem.reference_power + hDirAC->num_freq_bands; onset_filter = DirAC_mem.onset_filter; onset_filter_subframe = DirAC_mem.onset_filter + hDirAC->num_freq_bands; - +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT ) +#else if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) +#endif { coherence_flag = st_ivas->hQMetaData->coherence_flag; } @@ -2343,8 +2399,11 @@ void ivas_dirac_dec( for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) { index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; - +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif { for ( ch = 0; ch < nchan_transport; ch++ ) { @@ -2366,7 +2425,11 @@ void ivas_dirac_dec( } /* CNG in DirAC, extra CLDFB ana for CNA*/ +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) +#else if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) +#endif { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; @@ -2721,7 +2784,11 @@ void ivas_dirac_dec( st_ivas->cldfbSynDec[ch] ); } } +#ifdef SBA_MODE_CLEAN_UP + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#else else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif { for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ ) { diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index a193ac2823..5ca78b3ffa 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -257,12 +257,17 @@ ivas_error ivas_dec_setup( if ( st_ivas->ini_frame > 0 && st_ivas->ivas_format == SBA_FORMAT ) { int16_t nchan_transport_old, nchan_transport; +#ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode_old; sba_mode_old = ivas_sba_mode_select(); +#endif nchan_transport_old = st_ivas->nchan_transport; nchan_transport = ( st_ivas->sid_format == SID_SBA_2TC ) ? 2 : 1; - +#ifdef SBA_MODE_CLEAN_UP + if ( ( nchan_transport_old != nchan_transport ) ) +#else if ( ( nchan_transport_old != nchan_transport ) || ( sba_mode_old != st_ivas->sba_mode ) ) +#endif { /*Setting the default bitrate for the reconfig function*/ if ( st_ivas->sid_format == SID_SBA_2TC ) @@ -271,7 +276,12 @@ ivas_error ivas_dec_setup( } else { +#ifdef SBA_MODE_CLEAN_UP + st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; +#else st_ivas->hDecoderConfig->ivas_total_brate = ( st_ivas->sba_mode == SBA_MODE_SPAR ) ? IVAS_24k4 : IVAS_13k2; + +#endif } if ( ( error = ivas_sba_dec_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) @@ -380,7 +390,9 @@ static ivas_error ivas_read_format( else { st_ivas->ivas_format = SBA_FORMAT; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = ivas_sba_mode_select(); +#endif } ( *num_bits_read )++; break; @@ -448,6 +460,7 @@ static ivas_error ivas_read_format( { st_ivas->sba_analysis_order = SBA_FOA_ORDER; } +#ifndef SBA_MODE_CLEAN_UP if ( idx == 1 ) { st_ivas->sba_mode = SBA_MODE_SPAR; @@ -456,6 +469,7 @@ static ivas_error ivas_read_format( { st_ivas->sba_mode = SBA_MODE_DIRAC; } +#endif } /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ @@ -550,8 +564,9 @@ ivas_error ivas_init_decoder_front( st_ivas->ism_mode = ISM_MODE_NONE; st_ivas->mc_mode = MC_MODE_NONE; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; - +#endif st_ivas->sba_dirac_stereo_flag = 0; /* HRTF binauralization latency in ns */ @@ -886,8 +901,10 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { +#endif if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) { return error; @@ -900,8 +917,11 @@ ivas_error ivas_init_decoder( return error; } } - +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -929,6 +949,7 @@ ivas_error ivas_init_decoder( st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); +#ifndef SBA_MODE_CLEAN_UP } else /* SBA_MODE_DIRAC */ { @@ -939,10 +960,15 @@ ivas_error ivas_init_decoder( st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); } +#endif } - +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && + st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->ivas_format != SBA_FORMAT ) +#else if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode != SBA_MODE_SPAR ) +#endif { if ( ( error = ivas_dirac_dec_open( st_ivas ) ) != IVAS_ERR_OK ) { @@ -1343,7 +1369,11 @@ ivas_error ivas_init_decoder( } /* CLDFB Interpolation weights */ +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) +#else if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) +#endif { ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } @@ -1816,7 +1846,11 @@ void ivas_init_dec_get_num_cldfb_instances( } break; case RENDERER_DIRAC: +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif { *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; @@ -1833,7 +1867,11 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; } } +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format != SBA_FORMAT ) +#else if ( st_ivas->sba_mode != SBA_MODE_SPAR ) +#endif { if ( st_ivas->nchan_transport > 2 && st_ivas->sba_planar ) { @@ -1874,7 +1912,11 @@ void ivas_init_dec_get_num_cldfb_instances( case RENDERER_BINAURAL_MIXER_CONV_ROOM: case RENDERER_BINAURAL_FASTCONV: case RENDERER_BINAURAL_FASTCONV_ROOM: +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif { if ( st_ivas->sba_dirac_stereo_flag ) { diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2c87109f6e..7b08e9fd94 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -254,8 +254,11 @@ ivas_error ivas_masa_decode( } tmp_elem_mode = -1; +#ifndef SBA_MODE_CLEAN_UP *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format, SBA_MODE_NONE ); - +#else + *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format ); +#endif if ( st_ivas->nchan_transport == 2 ) { assert( st_ivas->nCPE > 0 ); @@ -275,7 +278,11 @@ ivas_error ivas_masa_decode( } if ( st_ivas->hDirAC != NULL ) { +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, SBA_MODE_NONE, 0 ); +#else + ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, 0, 0 ); +#endif } st->next_bit_pos = next_bit_pos_orig; diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index ff73e6aa49..023f1f2012 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -301,9 +301,13 @@ void ivas_renderer_select( else if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) { *renderer_type = RENDERER_DIRAC; - +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && + ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) ) +#else if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) ) +#endif { if ( output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_FOA ) { diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 9c6597fdcb..6b6aeb1605 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -687,8 +687,11 @@ int16_t ivas_qmetadata_dec_sid_decode( int16_t *index, /* i/o: bitstream position */ const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ - const int16_t ivas_format, /* i : IVAS format */ + const int16_t ivas_format /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ) { int16_t b, m, i; @@ -719,10 +722,13 @@ int16_t ivas_qmetadata_dec_sid_decode( if ( ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ +#ifndef SBA_MODE_CLEAN_UP } else { @@ -730,6 +736,7 @@ int16_t ivas_qmetadata_dec_sid_decode( /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } +#endif } else { @@ -755,8 +762,11 @@ int16_t ivas_qmetadata_dec_sid_decode( /* Fix configuration for SID */ q_direction = &hQMetaData->q_direction[0]; /* only 1 direction */ - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { nbands = DIRAC_DTX_BANDS; /* only 2 bands transmitted */ } @@ -769,7 +779,11 @@ int16_t ivas_qmetadata_dec_sid_decode( start_band = 0; /* start from band 0 */ /* Read 2D signaling*/ +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) +#else + if ( ivas_format != SBA_FORMAT ) +#endif { q_direction->not_in_2D = bitstream[( *index )--]; } @@ -854,6 +868,7 @@ int16_t ivas_qmetadata_dec_sid_decode( } } /* TODO: temporary hack to keep BE */ +#ifndef SBA_MODE_CLEAN_UP if ( ivas_format == SBA_FORMAT ) { if ( sba_mode != SBA_MODE_SPAR ) @@ -862,6 +877,9 @@ int16_t ivas_qmetadata_dec_sid_decode( } } else +#else + if ( ivas_format != SBA_FORMAT ) +#endif { metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index ec47273c64..cab57ef808 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -58,8 +58,11 @@ void ivas_sba_set_cna_cng_flag( ) { int16_t n, cpe_id; - +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 1 ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 ) +#endif { /* skip as done in init function */ /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */ /* Todo: Check if these can be enabled */ @@ -247,7 +250,11 @@ ivas_error ivas_sba_dec_reconfigure( return error; } } +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->element_mode_init, ivas_total_brate, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 0894920480..bac500e80d 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -63,7 +63,11 @@ int16_t ivas_get_sba_dirac_stereo_flag( if ( st_ivas->ivas_format == SBA_FORMAT || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) { +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif { if ( output_config == AUDIO_CONFIG_STEREO || ( output_config == AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) ) { @@ -844,8 +848,12 @@ void ivas_sba_dirac_stereo_dec( memOffset = NS2SA( output_frame * FRAMES_PER_SEC, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); ivas_sba_dirac_stereo_config( hStereoDft->hConfig ); +#ifdef SBA_MODE_CLEAN_UP + hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) ); +#else hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) ); +#endif stereo_dft_dec_update( hStereoDft, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); if ( st_ivas->nchan_transport > 1 ) { @@ -867,12 +875,22 @@ void ivas_sba_dirac_stereo_dec( } /* mapping of DirAC parameters (azimuth, elevation, diffuseness) to DFT Stereo parameters (side gain, prediction gain) */ +#ifdef SBA_MODE_CLEAN_UP + map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0], + st_ivas->ivas_format == MC_FORMAT, + ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame, + ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ) ); +#else map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0], st_ivas->ivas_format == MC_FORMAT, ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame, ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ) ); - +#endif +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) +#endif { set_f( hStereoDft->res_pred_gain, 1.f, 3 * STEREO_DFT_BAND_MAX ); } @@ -912,10 +930,13 @@ void ivas_sba_dirac_stereo_dec( { /* upmix ACELP BWE */ ivas_sba_dirac_stereo_compute_hb_gain( hStereoDft, hb_gain ); - +#ifdef SBA_MODE_CLEAN_UP + ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, + ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); +#else ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); - +#endif /* add HB to ACELP core */ v_add( output[0], hb_synth_stereo[0], output[0], output_frame ); @@ -924,7 +945,12 @@ void ivas_sba_dirac_stereo_dec( v_add( output[1], hb_synth_stereo[1], output[1], output_frame ); /* apply TD Stereo Filling as is done in ICBWE */ +#ifdef SBA_MODE_CLEAN_UP + ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) ); +#else ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) ); + +#endif } } diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index a80986b39e..1cc8ca229c 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -228,16 +228,21 @@ int16_t ivas_sba_remapTCs( #endif nchan_remapped = st_ivas->nchan_transport; +#ifdef SBA_MODE_CLEAN_UP + if ( nchan_remapped == 3 ) +#else if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && nchan_remapped >= 3 ) || ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && nchan_remapped == 3 ) ) +#endif { nchan_remapped++; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode != SBA_MODE_SPAR ) { assert( ( ( st_ivas->nchan_transport == 3 ) || ( st_ivas->nchan_transport == 5 ) || ( st_ivas->nchan_transport == 7 ) ) && "Number of channels must be odd for SBA planar!" ); } - +#endif if ( nchan_remapped == 4 ) { /*For planar A-format channel 2 and 3 are identical -> Z=0*/ @@ -262,12 +267,12 @@ int16_t ivas_sba_remapTCs( } } } - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode != SBA_MODE_SPAR ) { ivas_sba_zero_vert_comp( sba_data, st_ivas->sba_analysis_order, st_ivas->sba_planar, output_frame ); } - +#endif return ( nchan_remapped ); } diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 9a940b9b6d..d64bbf705f 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -155,8 +155,13 @@ ivas_error ivas_sce_dec( st->codec_mode = MODE1; /* set "bits_frame_nominal" */ +#ifndef SBA_MODE_CLEAN_UP if ( ( st_ivas->hQMetaData != NULL ) && ( st_ivas->sba_mode != SBA_MODE_SPAR ) ) +#else + if ( ( st_ivas->hQMetaData != NULL ) && + ( st_ivas->ivas_format != SBA_FORMAT) ) +#endif { if ( st_ivas->mc_mode == MC_MODE_MCMASA && ivas_total_brate >= MCMASA_SEPARATE_BRATE ) { @@ -167,7 +172,11 @@ ivas_error ivas_sce_dec( st->bits_frame_nominal = st_ivas->hQMetaData->bits_frame_nominal; } } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { st->bits_frame_nominal = (int16_t) ( st_ivas->hSpar->core_nominal_brate / FRAMES_PER_SEC ); } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index f0588ae303..142961c285 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -105,7 +105,12 @@ ivas_error ivas_spar_dec_open( /* set FB config. */ active_w_mixing = -1; +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs ) ) != IVAS_ERR_OK ) + +#endif { return error; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ad453cd5bd..c4eab25b85 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1209,7 +1209,9 @@ typedef struct Decoder_Struct ISM_MODE ism_mode; /* ISM format mode */ int16_t nchan_ism; /* number of ISM channels */ +#ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode; /* SBA format mode */ +#endif MC_MODE mc_mode; /* MC format mode */ int16_t sba_order; /* Ambisonic (SBA) order */ int16_t sba_planar; /* Ambisonic (SBA) planar flag */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ee315bf399..f980a80dfe 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -192,7 +192,9 @@ ivas_error IVAS_DEC_Open( st_ivas->writeFECoffset = 0; st_ivas->ism_mode = ISM_MODE_NONE; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; +#endif st_ivas->mc_mode = MC_MODE_NONE; st_ivas->sba_order = 0; diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 72a737e64b..c84beba539 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -463,7 +463,11 @@ ivas_error ivas_cpe_enc( { if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) { +#ifndef SBA_MODE_CLEAN_UP reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode ); +#else + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); +#endif } } @@ -473,9 +477,13 @@ ivas_error ivas_cpe_enc( stereoFdCngCoherence( sts, hCPE->last_element_mode, fft_buff ); /* Reset metadata */ +#ifndef SBA_MODE_CLEAN_UP if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) ) +#else + if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT ) ) +#endif { - reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode ); + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); } } diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 45ce09bb15..35d3062126 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -64,7 +64,9 @@ ivas_error ivas_dirac_enc_open( int16_t i, j; int32_t input_Fs; DIRAC_ENC_HANDLE hDirAC; +#ifndef SBA_MODE_CLEAN_UP IVAS_FB_CFG *fb_cfg; +#endif int32_t dirac_slot_ns; ivas_error error; @@ -93,9 +95,12 @@ ivas_error ivas_dirac_enc_open( } /* set FB config. */ +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { +#endif hDirAC->hFbMixer = NULL; +#ifndef SBA_MODE_CLEAN_UP } else { @@ -109,7 +114,7 @@ ivas_error ivas_dirac_enc_open( return error; } } - +#endif for ( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ ) { @@ -119,6 +124,7 @@ ivas_error ivas_dirac_enc_open( dirac_slot_ns = DIRAC_SLOT_ENC_NS; /* initialize delay for SPAR/DirAC delay synchronization */ +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) { hDirAC->num_samples_synchro_delay = NS2SA( input_Fs, IVAS_FB_ENC_DELAY_NS ); @@ -134,14 +140,16 @@ ivas_error ivas_dirac_enc_open( } else { +#endif hDirAC->num_samples_synchro_delay = 0; for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) { hDirAC->sba_synchro_buffer[i] = NULL; } +#ifndef SBA_MODE_CLEAN_UP } - +#endif /* intensity 3-dim */ for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { @@ -196,13 +204,15 @@ ivas_error ivas_dirac_enc_open( hDirAC->index_buffer_intensity = 0; st_ivas->hDirAC = hDirAC; - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { +#endif mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; +#ifndef SBA_MODE_CLEAN_UP } - +#endif return error; } @@ -317,7 +327,7 @@ void ivas_dirac_enc_close( return; } - +#ifndef SBA_MODE_CLEAN_UP /*------------------------------------------------------------------------- * ivas_dirac_enc() * @@ -440,8 +450,12 @@ void ivas_dirac_enc( } /* encode SID parameters */ +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, SBA_MODE_DIRAC ); +#else + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); +#endif /* restore original metadata */ hDirAC->hConfig->nbands = nbands; hQMetaData->q_direction[0].cfg.nbands = nbands; @@ -459,7 +473,11 @@ void ivas_dirac_enc( push_next_indice( hMetaData, 0, 1 ); /* encode SID parameters */ +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, SBA_MODE_DIRAC ); +#else + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); +#endif } } } @@ -524,7 +542,7 @@ void ivas_dirac_enc_spar_delay_synchro( return; } - +#endif /*------------------------------------------------------------------------- * computeReferencePower_enc() @@ -539,7 +557,11 @@ void computeReferencePower_enc( float *reference_power, /* o : Estimated power */ const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format /* i : ivas_format */ +#endif ) { int16_t brange[2]; @@ -570,7 +592,11 @@ void computeReferencePower_enc( } v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { for ( i = 0; i < num_freq_bands; i++ ) { @@ -596,7 +622,12 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, - const SBA_MODE sba_mode ) +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode +#else + const IVAS_FORMAT ivas_format +#endif +) { int16_t i, d, ts, index, l_ts, num_freq_bands; int16_t band_m_idx, block_m_idx; @@ -695,7 +726,12 @@ void ivas_dirac_param_est_enc( reference_power[ts], hDirAC->hConfig->enc_param_start_band, num_freq_bands, - sba_mode ); +#ifndef SBA_MODE_CLEAN_UP + sba_mode +#else + ivas_format +#endif + ); computeIntensityVector_enc( hDirAC, diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index bc374f88e5..762522a8bf 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -132,7 +132,11 @@ ivas_error ivas_enc( /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) { +#ifndef SBA_MODE_CLEAN_UP if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } @@ -216,9 +220,13 @@ ivas_error ivas_enc( /* SBA/MASA metadata encoding and SBA/MASA metadata bitstream writing */ hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->hQMetaData != NULL && ivas_format != SBA_FORMAT) +#endif { +#ifndef SBA_MODE_CLEAN_UP if ( ivas_format == SBA_FORMAT ) { ivas_dirac_enc( st_ivas->hDirAC, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], hEncoderConfig->Opt_DTX_ON, data_f, input_frame, hEncoderConfig->sba_planar ); @@ -227,6 +235,7 @@ ivas_error ivas_enc( } else { +#endif ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { @@ -237,9 +246,15 @@ ivas_error ivas_enc( { return error; } +#ifndef SBA_MODE_CLEAN_UP } +#endif } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( ivas_format == SBA_FORMAT ) +#endif { if ( ( error = ivas_spar_enc( st_ivas, data_f, input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 36d476723c..b3d526c3ee 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -342,8 +342,9 @@ ivas_error ivas_init_encoder( hEncoderConfig->spar_reconfig_flag = 0; st_ivas->ism_mode = ISM_MODE_NONE; st_ivas->mc_mode = MC_MODE_NONE; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; - +#endif st_ivas->nchan_transport = -1; /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles @@ -448,17 +449,21 @@ ivas_error ivas_init_encoder( if ( ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = ivas_sba_mode_select(); +#endif st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { +#endif if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) { return error; } +#ifndef SBA_MODE_CLEAN_UP } - +#endif if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -486,8 +491,11 @@ ivas_error ivas_init_encoder( st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) +#else + if ( ivas_format == SBA_FORMAT && st_ivas->hEncoderConfig->Opt_DTX_ON ) +#endif { st_ivas->hSCE[sce_id]->hCoreCoder[0]->dtx_sce_sba = 1; } diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 32fb6af515..bed940b70c 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -273,7 +273,12 @@ ivas_error ivas_param_ism_enc_open( /* set FB config. */ +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) + +#endif { return error; } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 2a21a667e9..0f80b39659 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -367,9 +367,11 @@ ivas_error ivas_masa_encode( } free( h_orig_metadata ); - +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format, SBA_MODE_NONE ); - +#else + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format ); +#endif /* restore old values */ hMasa->config.numCodingBands = numCodingBands; hMasa->config.numTwoDirBands = numTwoDirBands; diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 14eca6afee..052b47ed40 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -140,7 +140,11 @@ ivas_error ivas_param_mc_enc_open( hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; /* set FB config. */ +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 8151b33c66..54c05fb888 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -188,7 +188,11 @@ ivas_error ivas_mcmasa_enc_open( } /* set FB config. */ +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, numAnalysisChannels, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -219,7 +223,11 @@ ivas_error ivas_mcmasa_enc_open( else { /* Allocate and initialize FB mixer handle for LFE channel */ +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, 1, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -973,7 +981,12 @@ void ivas_mcmasa_param_est_enc( reference_power[ts], 0, num_freq_bands, - SBA_MODE_NONE ); +#ifndef SBA_MODE_CLEAN_UP + SBA_MODE_NONE +#else + MC_FORMAT +#endif + ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % hMcMasa->no_col_avg_diff ) + 1; /* averaging_length = 32 */ diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index f2f5d23461..917aa73680 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -60,7 +60,11 @@ static ivas_error ivas_mc_enc_reconfig( Encoder_Struct *st_ivas, const int16_t l static void set_mct_enc_params( MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format, /* i : IVAS_FORMAT */ +#endif const uint16_t b_nchan_change /* i : flag indicating different channel count */ ) { @@ -82,7 +86,11 @@ static void set_mct_enc_params( } hMCT->hbr_mct = 0; +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR && ivas_total_brate >= IVAS_256k ) +#else + if ( ivas_format == SBA_FORMAT && ivas_total_brate >= IVAS_256k ) +#endif { hMCT->hbr_mct = 1; } @@ -377,8 +385,11 @@ ivas_error create_mct_enc( /*-----------------------------------------------------------------* * Initializations *-----------------------------------------------------------------*/ - +#ifndef SBA_MODE_CLEAN_UP set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, 1 ); +#else + set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, 1 ); +#endif st_ivas->hMCT = hMCT; @@ -535,9 +546,11 @@ ivas_error mct_enc_reconfigure( /*-----------------------------------------------------------------* * Initializations *-----------------------------------------------------------------*/ - +#ifndef SBA_MODE_CLEAN_UP set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, b_nchan_change ); - +#else + set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, b_nchan_change ); +#endif return IVAS_ERR_OK; } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index ac4f83a657..7aac2cc66e 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -665,8 +665,11 @@ void ivas_qmetadata_enc_sid_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure */ - const int16_t ivas_format, /* i : IVAS format */ + const int16_t ivas_format /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ) { int16_t b, m; @@ -682,10 +685,13 @@ void ivas_qmetadata_enc_sid_encode( if ( ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ +#ifndef SBA_MODE_CLEAN_UP } else { @@ -693,6 +699,7 @@ void ivas_qmetadata_enc_sid_encode( /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } +#endif } else { @@ -731,7 +738,11 @@ void ivas_qmetadata_enc_sid_encode( /* sanity checks*/ assert( q_metadata->no_directions == 1 && "Qmetadata SID: only one direction supported!" ); +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { assert( ( q_direction->cfg.nbands == DIRAC_DTX_BANDS ) && "Qmetadata SID: only 2 bands supported!" ); } @@ -739,8 +750,11 @@ void ivas_qmetadata_enc_sid_encode( { assert( ( q_direction->cfg.nbands == 5 ) && "Qmetadata SID: only 5 bands supported!" ); } - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) +#else + if ( ivas_format != SBA_FORMAT ) +#endif { /* Signalling 2D*/ push_next_indice( hMetaData, ( q_direction->not_in_2D > 0 ), 1 ); /*2D flag*/ @@ -877,6 +891,7 @@ void ivas_qmetadata_enc_sid_encode( #endif /* TODO: temporary to keep BE */ +#ifndef SBA_MODE_CLEAN_UP if ( ivas_format == SBA_FORMAT ) { if ( sba_mode != SBA_MODE_SPAR ) @@ -886,6 +901,9 @@ void ivas_qmetadata_enc_sid_encode( } } else +#else + if ( ivas_format != SBA_FORMAT ) +#endif { metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } @@ -912,8 +930,11 @@ void reset_metadata_spatial( const int32_t element_brate, /* i : element bitrate */ int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata, /* i : number of meatdata bits */ + const int16_t nb_bits_metadata /* i : number of meatdata bits */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ) { int16_t i, next_ind_sid, last_ind_sid; @@ -923,7 +944,11 @@ void reset_metadata_spatial( { if ( ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) && core_brate != FRAME_NO_DATA ) { +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { assert( hMetaData->ind_list[0].nb_bits == 1 ); hMetaData->ind_list[0].value = 1; @@ -978,7 +1003,11 @@ void reset_metadata_spatial( *total_brate = element_brate; } +#ifndef SBA_MODE_CLEAN_UP else if ( sba_mode != SBA_MODE_SPAR ) +#else + else if ( ivas_format != SBA_FORMAT ) +#endif { /* Reset SID metadata bits*/ while ( hMetaData->nb_bits_tot > nb_bits_metadata ) @@ -990,7 +1019,6 @@ void reset_metadata_spatial( assert( hMetaData->nb_bits_tot == nb_bits_metadata && "Problem in metadata for SCE" ); hMetaData->last_ind = hMetaData->next_ind; } - return; } diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index c8577a85ba..4e74fc6a1a 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -204,9 +204,12 @@ ivas_error ivas_sce_enc( /*----------------------------------------------------------------* * Reset metadata *----------------------------------------------------------------*/ - +#ifndef SBA_MODE_CLEAN_UP reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata, st_ivas->sba_mode ); +#else + reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata ); +#endif /*----------------------------------------------------------------* * Write IVAS format signaling in SID frames *----------------------------------------------------------------*/ diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 0484e2fb92..695988fcc0 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -103,7 +103,11 @@ ivas_error ivas_spar_enc_open( /* set FB config. */ active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; +#ifndef SBA_MODE_CLEAN_UP ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs ); +#else + ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, nchan_inp, nchan_transport, active_w_mixing, input_Fs ); +#endif fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; /* FB mixer handle */ @@ -319,6 +323,7 @@ ivas_error ivas_spar_enc( // VE2DB: can hFbMixer->ppFilterbank_prior_input be replaced by st->input ? /* check last sba_mode */ +#ifndef SBA_MODE_CLEAN_UP if ( ivas_sba_mode_select() == SBA_MODE_DIRAC ) { Encoder_State *sts[MCT_MAX_BLOCKS]; @@ -346,7 +351,7 @@ ivas_error ivas_spar_enc( ( st_ivas->hSpar->hFbMixer->ppFilterbank_prior_input[i] + st_ivas->hSpar->hFbMixer->fb_cfg->prior_input_length - input_frame ), input_frame ); } } - +#endif /* front VAD */ if ( ( error = front_vad_spar( st_ivas->hSpar, data_f[0], hEncoderConfig, input_frame ) ) != IVAS_ERR_OK ) { @@ -497,8 +502,12 @@ static ivas_error ivas_spar_enc_process( /*-----------------------------------------------------------------------------------------* * DirAC encoding *-----------------------------------------------------------------------------------------*/ - +#ifndef SBA_MODE_CLEAN_UP ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode ); +#else + ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, hEncoderConfig->ivas_format ); + +#endif if ( hQMetaData->q_direction->cfg.nbands > 0 ) { @@ -546,7 +555,11 @@ static ivas_error ivas_spar_enc_process( push_next_indice( hMetaData, 1, 1 ); /* encode SID parameters */ +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, st_ivas->sba_mode ); +#else + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); +#endif } for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 9dfafbbc04..708675506c 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1088,7 +1088,9 @@ typedef struct LFE_ENC_HANDLE hLFE; /* LFE data handle */ ISM_MODE ism_mode; /* ISM format mode */ +#ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode; /* SBA format mode */ +#endif MC_MODE mc_mode; /* MC format mode */ /* Stereo downmix for EVS module */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 45d4c85683..72334f288f 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -182,7 +182,9 @@ ivas_error IVAS_ENC_Open( /* set high-level parameters */ st_ivas->mc_mode = MC_MODE_NONE; st_ivas->ism_mode = ISM_MODE_NONE; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; +#endif st_ivas->sba_analysis_order = 0; return IVAS_ERR_OK; @@ -888,7 +890,11 @@ static ivas_error configureEncoder( } #ifdef DEBUG_AGC_ENCODER_CMD_OPTION +#ifndef SBA_MODE_CLEAN_UP if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_sba_mode_select() == SBA_MODE_SPAR ) ) +#else + if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT ) ) +#endif { return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "AGC supported in SBA format at bitrates >= 24.4 kbps only." ); } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 1fbcad6f68..495e6a1570 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -564,8 +564,11 @@ static void ivas_dirac_dec_binaural_internal( } } } - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { st_ivas->hDirAC->hDiffuseDist = &diffuseDistData; @@ -980,7 +983,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } else /* When rendering binaural, ambience has frequency dependent ICC. */ { +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) +#endif { float diffuseFieldCoherence; diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin]; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 7744a6582b..b090574f31 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2196,7 +2196,9 @@ static ivas_error initMasaDummyDecForMcOut( decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ +#ifndef SBA_MODE_CLEAN_UP decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ +#endif decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); @@ -2279,7 +2281,9 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ +#ifndef SBA_MODE_CLEAN_UP decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ +#endif decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); @@ -2349,7 +2353,9 @@ static ivas_error initMasaDummyDecForBinauralOut( output_config = decDummy->hDecoderConfig->output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ +#ifndef SBA_MODE_CLEAN_UP decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ +#endif decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); -- GitLab From 0aadfb1ba8648227d787fc7437e6394f263a9578 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Mon, 8 May 2023 18:29:17 +0530 Subject: [PATCH 028/381] One more minor clean up change. --- lib_com/ivas_cnst.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 0623cacb43..5b8b219e95 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -881,7 +881,7 @@ typedef enum { #define SBA_NHARM_HOA3 16 #define SBA_T_DESIGN_11_SIZE 70 #define SBA_DTX_BITRATE_THRESHOLD IVAS_80k - +#ifndef SBA_MODE_CLEAN_UP typedef enum { SBA_MODE_NONE, @@ -889,7 +889,7 @@ typedef enum SBA_MODE_SPAR, // VE: this is actually SBA_MODE_SPAR_DIRAC } SBA_MODE; - +#endif /*----------------------------------------------------------------------------------* * DirAC Constants *----------------------------------------------------------------------------------*/ -- GitLab From ee8912e3b814c690ef9ea59d99ba7184e87272c2 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Tue, 9 May 2023 10:43:40 +0530 Subject: [PATCH 029/381] Minor modification :clean up change --- lib_dec/ivas_masa_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 7b08e9fd94..288b781a75 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -281,7 +281,7 @@ ivas_error ivas_masa_decode( #ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, SBA_MODE_NONE, 0 ); #else - ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, 0, 0 ); + ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, ivas_format, 0 ); #endif } st->next_bit_pos = next_bit_pos_orig; -- GitLab From 2188b6a953ea9870e4fcd5fac4d05e0e653c4433 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Tue, 9 May 2023 12:17:46 +0530 Subject: [PATCH 030/381] Moved the spar reconfig flag to Spar structure --- lib_enc/ivas_init_enc.c | 2 ++ lib_enc/ivas_sba_enc.c | 4 ++++ lib_enc/ivas_spar_encoder.c | 8 +++++++- lib_enc/ivas_stat_enc.h | 6 +++++- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index b3d526c3ee..8ee6555990 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -339,7 +339,9 @@ ivas_error ivas_init_encoder( /* In IVAS, ensure that minimum coded bandwidth is WB */ hEncoderConfig->max_bwidth = max( hEncoderConfig->max_bwidth, WB ); } +#ifndef SBA_MODE_CLEAN_UP hEncoderConfig->spar_reconfig_flag = 0; +#endif st_ivas->ism_mode = ISM_MODE_NONE; st_ivas->mc_mode = MC_MODE_NONE; #ifndef SBA_MODE_CLEAN_UP diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index d9fb1fef83..51cd8b3b06 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -232,7 +232,11 @@ ivas_error ivas_sba_enc_reconfigure( return error; } } +#ifndef SBA_MODE_CLEAN_UP hEncoderConfig->spar_reconfig_flag = spar_reconfig_flag; +#else + st_ivas->hSpar->spar_reconfig_flag = spar_reconfig_flag; +#endif if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 695988fcc0..df5cf47fb4 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -82,7 +82,9 @@ ivas_error ivas_spar_enc_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder" ); } } - +#ifdef SBA_MODE_CLEAN_UP + hSpar->spar_reconfig_flag = 0; +#endif input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal ); @@ -603,7 +605,11 @@ static ivas_error ivas_spar_enc_process( if ( hSpar->hMdEnc->table_idx != table_idx ) { hSpar->hMdEnc->table_idx = table_idx; +#ifndef SBA_MODE_CLEAN_UP if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hEncoderConfig->spar_reconfig_flag ) ) +#else + if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hSpar->spar_reconfig_flag) ) +#endif { if ( ( error = ivas_spar_md_enc_init( hSpar->hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 708675506c..005d39ecbf 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -686,7 +686,9 @@ typedef struct ivas_spar_enc_lib_t int32_t core_nominal_brate; /* Nominal bitrate for core coding */ FRONT_VAD_ENC_HANDLE hFrontVad; /* front-VAD handle */ ENC_CORE_HANDLE hCoreCoderVAD; /* core-coder handle for front-VAD module */ - +#ifdef SBA_MODE_CLEAN_UP + int16_t spar_reconfig_flag; +#endif int16_t front_vad_flag; int16_t front_vad_dtx_flag; int16_t force_front_vad; @@ -1037,7 +1039,9 @@ typedef struct encoder_config_structure /* temp. development parameters */ int16_t Opt_PCA_ON; /* flag indicating PCA operation in SBA */ +#ifndef SBA_MODE_CLEAN_UP int16_t spar_reconfig_flag; + #endif #ifdef DEBUGGING /* debugging options */ int16_t stereo_mode_cmdl; /* stereo mode forced from the command-line */ -- GitLab From 98b77ad9cf15f843429bab2e9dd42a951995ab94 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 9 May 2023 13:19:15 +0200 Subject: [PATCH 031/381] Refactoring of binaural output configuration. BINAURAL_HRIR_REVERB as a separate output configuration. --- apps/decoder.c | 55 ++- apps/renderer.c | 64 +++ lib_com/ivas_cnst.h | 6 + lib_com/options.h | 1 + lib_dec/ivas_dec.c | 4 + lib_dec/ivas_init_dec.c | 16 + lib_dec/ivas_ism_dec.c | 16 + lib_dec/ivas_ism_param_dec.c | 16 + lib_dec/ivas_mct_dec.c | 4 + lib_dec/ivas_output_config.c | 37 +- lib_dec/ivas_spar_decoder.c | 4 + lib_dec/lib_dec.c | 38 +- lib_dec/lib_dec.h | 6 + lib_rend/ivas_crend.c | 8 + lib_rend/ivas_output_init.c | 12 + lib_rend/ivas_prot_rend.h | 4 + lib_rend/ivas_render_config.c | 12 +- lib_rend/lib_rend.c | 126 ++++++ lib_rend/lib_rend.h | 6 + lib_util/render_config_reader.c | 5 +- scripts/config/self_test.prm | 368 +++++++++--------- scripts/pyivastest/constants.py | 7 +- .../rend_config_hospital_patientroom.cfg | 2 - scripts/testv/rend_config_recreation.cfg | 2 - scripts/testv/rend_config_renderer.cfg | 2 - tests/renderer/constants.py | 4 - tests/renderer/test_renderer.py | 18 - 27 files changed, 614 insertions(+), 229 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 22dc235fff..46b037e15a 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -229,7 +229,11 @@ int main( if ( arg.hrtfReaderEnabled ) { /* sanity check */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) +#else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) +#endif { arg.hrtfReaderEnabled = false; fprintf( stderr, "\nError: HRTF binary file cannot be used in this output configuration.\n\n" ); @@ -251,7 +255,11 @@ int main( if ( arg.enableHeadRotation ) { /* sanity check */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) +#else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) +#endif { fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -271,7 +279,11 @@ int main( if ( arg.enableReferenceRotation ) { /* sanity check */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) +#else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) +#endif { fprintf( stderr, "\nError: Reference rotation file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -298,7 +310,11 @@ int main( if ( arg.enableReferenceVectorTracking ) { /* sanity check */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) +#else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) +#endif { fprintf( stderr, "\nError: Reference vector trajectory file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -338,7 +354,11 @@ int main( if ( arg.renderConfigEnabled ) { /* sanity check */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) +#else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) +#endif { fprintf( stderr, "\nError: Renderer configuration file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -461,9 +481,17 @@ int main( IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) +#else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL ) +#endif { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + fprintf( stderr, "\nExternal Renderer Config is supported only for binaural output configurations. Exiting. \n\n" ); +#else fprintf( stderr, "\nExternal Renderer Config is supported only for BINAURAL and BINAURAL_ROOM. Exiting. \n\n" ); +#endif goto cleanup; } @@ -713,6 +741,20 @@ static IVAS_DEC_AUDIO_CONFIG cmdline2config( { output_config = IVAS_DEC_OUTPUT_HOA3; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + else if ( strcmp( argv_to_upper, "BINAURAL_HRIR" ) == 0 ) + { + output_config = IVAS_DEC_OUTPUT_BINAURAL_HRIR; + } + else if ( strcmp( argv_to_upper, "BINAURAL_BRIR" ) == 0 ) + { + output_config = IVAS_DEC_OUTPUT_BINAURAL_BRIR; + } + else if ( strcmp( argv_to_upper, "BINAURAL_HRIR_REVERB" ) == 0 ) + { + output_config = IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB; + } +#else else if ( strcmp( argv_to_upper, "BINAURAL" ) == 0 ) { output_config = IVAS_DEC_OUTPUT_BINAURAL; @@ -721,10 +763,11 @@ static IVAS_DEC_AUDIO_CONFIG cmdline2config( { output_config = IVAS_DEC_OUTPUT_BINAURAL_ROOM; } - else - { - output_config = IVAS_DEC_OUTPUT_LS_CUSTOM; - } +#endif + else + { + output_config = IVAS_DEC_OUTPUT_LS_CUSTOM; + } return output_config; } @@ -1152,7 +1195,11 @@ static void usage_dec( void ) fprintf( stdout, "Mandatory parameters:\n" ); fprintf( stdout, "---------------------\n" ); fprintf( stdout, "OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA,\n" ); +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + fprintf( stdout, " HOA2, HOA3, BINAURAL_HRIR, BINAURAL_BRIR, BINAURAL_HRIR_REVERB, EXT\n" ); +#else fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM, EXT\n" ); +#endif fprintf( stdout, " By default, channel order and loudspeaker positions are equal to the\n" ); fprintf( stdout, " encoder. For loudspeaker outputs, OutputConf can be a custom loudspeaker\n" ); fprintf( stdout, " layout file. See readme.txt for details.\n" ); diff --git a/apps/renderer.c b/apps/renderer.c index be23df8b98..6bbfd2b783 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -213,25 +213,41 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_trajFile, .match = "trajectory_file", .matchShort = "tf", +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + .description = "Head rotation trajectory file for simulation of head tracking (only for binaural outputs)", +#else .description = "Head rotation trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", +#endif }, { .id = CmdLnOptionId_refRotFile, .match = "reference_rotation_file", .matchShort = "rf", +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + .description = "Reference rotation trajectory file for simulation of head tracking (only for binaural outputs)", +#else .description = "Reference rotation trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", +#endif }, { .id = CmdLnOptionId_customHrtfFile, .match = "custom_hrtf", .matchShort = "hrtf", +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + .description = "Custom HRTF file for binaural rendering (only for binaural outputs)", +#else .description = "Custom HRTF file for binaural rendering (only for BINAURAL and BINAURAL_ROOM outputs)", +#endif }, { .id = CmdLnOptionId_renderConfigFile, .match = "render_config", .matchShort = "rc", +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + .description = "Binaural renderer configuration file (only for binaural outputs)", +#else .description = "Binaural renderer configuration file (only for BINAURAL and BINAURAL_ROOM outputs)", +#endif }, { .id = CmdLnOptionId_noDiegeticPan, @@ -243,7 +259,11 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_orientationTracking, .match = "tracking_type", .matchShort = "otr", +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs)", +#else .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for BINAURAL and BINAURAL_ROOM)", +#endif }, { .id = CmdlnOptionId_lfePosition, @@ -283,7 +303,11 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_referenceVectorFile, .match = "reference_vector_file", .matchShort = "rvf", +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + .description = "Reference vector trajectory file for simulation of head tracking (only for binaural outputs)", +#else .description = "Reference vector trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", +#endif }, }; @@ -683,9 +707,17 @@ int main( IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) +#else if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) +#endif { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + fprintf( stderr, "\nExternal Renderer Config is only supported for binaural output configurations. Exiting. \n" ); +#else fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL or BINAURAL_ROOM is used as output. Exiting. \n" ); +#endif exit( -1 ); } @@ -701,6 +733,15 @@ int main( exit( -1 ); } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + { + renderConfig.room_acoustics.late_reverb_on = TRUE; + renderConfig.room_acoustics.override = TRUE; + renderConfig.room_acoustics.use_brir = FALSE; + } +#endif + if ( ( error = IVAS_REND_FeedRenderConfig( hIvasRend, renderConfig ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed\n" ); @@ -1404,8 +1445,13 @@ static bool parseOrientationTracking( static IVAS_REND_AudioConfig parseAudioConfig( const char *configString ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + char charBuf[21]; + charBuf[20] = '\0'; +#else char charBuf[14]; charBuf[13] = '\0'; +#endif strncpy( charBuf, configString, sizeof( charBuf ) - 1 ); charBuf[sizeof( charBuf ) - 1] = '\0'; @@ -1478,6 +1524,17 @@ static IVAS_REND_AudioConfig parseAudioConfig( return IVAS_REND_AUDIO_CONFIG_UNKNOWN; } } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( strcmp( charBuf, "BINAURAL_HRIR" ) == 0 ) + { + return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR; + } + if ( strcmp( charBuf, "BINAURAL_BRIR" ) == 0 ) + { + return IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR; + } + if ( strcmp( charBuf, "BINAURAL_HRIR_REVERB" ) == 0 ) +#else if ( strcmp( charBuf, "BINAURAL_ROOM" ) == 0 ) { return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM; @@ -1486,6 +1543,7 @@ static IVAS_REND_AudioConfig parseAudioConfig( { return IVAS_REND_AUDIO_CONFIG_BINAURAL; } +#endif return IVAS_REND_AUDIO_CONFIG_UNKNOWN; } @@ -2504,8 +2562,14 @@ static void printSupportedAudioConfigs() "HOA3", "ISMx (input only)", "MASAx (input only)", +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + "BINAURAL_HRIR (output only)", + "BINAURAL_BRIR (output only)", + "BINAURAL_HRIR_REVERB (output only)", +#else "BINAURAL (output only)", "BINAURAL_ROOM (output only)", +#endif }; fprintf( stdout, "Supported audio formats:\n" ); diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 263c5992b0..3df488b40f 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -100,8 +100,14 @@ typedef enum AUDIO_CONFIG_HOA2, /* ambisonics, order 2 */ AUDIO_CONFIG_HOA3, /* ambisonics, order 3 */ AUDIO_CONFIG_OBA, /* object based audio */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + AUDIO_CONFIG_BINAURAL_HRIR, /* binaural with HRIR */ + AUDIO_CONFIG_BINAURAL_BRIR, /* binaural with BRIR */ + AUDIO_CONFIG_BINAURAL_HRIR_REVERB, /* binaural with HRIR + reverb */ +#else AUDIO_CONFIG_BINAURAL, /* binaural with HRIR */ AUDIO_CONFIG_BINAURAL_ROOM, /* binaural with HRIR and BRIR */ +#endif AUDIO_CONFIG_ISM1, /* ISM1 */ AUDIO_CONFIG_ISM2, /* ISM2 */ AUDIO_CONFIG_ISM3, /* ISM3 */ diff --git a/lib_com/options.h b/lib_com/options.h index 1429f24a75..4a3cf5823a 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -177,6 +177,7 @@ #define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */ #define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ #define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ +#define FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* Phi: issue 196 - refactoring renderer output configuration */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 11cc33af48..4a0bbbe744 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -234,7 +234,11 @@ ivas_error ivas_dec( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_BRIR, NULL, NULL, NULL, NULL, output, output_Fs ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, output, output_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index a193ac2823..94361dd9f1 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -617,14 +617,22 @@ ivas_error ivas_init_decoder_front( * Allocate and initialize Binaural Renderer configuration handle *--------------------------------------------------------------------*/ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { if ( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ) != IVAS_ERR_OK ) { return error; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_config ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -2010,14 +2018,22 @@ static ivas_error doSanityChecks_IVAS( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( !( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) +#else if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) +#endif { return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); } } #ifdef DEBUGGING +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL_HRIR || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) +#else if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) +#endif { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration: Time Domain object renderer not supported in this configuration" ); } diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index dda939529d..8eef064e0b 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -125,7 +125,11 @@ static ivas_error ivas_ism_bitrate_switching( /* Deallocate the ParamISM struct */ ivas_param_ism_dec_close( &( st_ivas->hDirAC ), st_ivas->hDecoderConfig->output_config ); +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR ) +#else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) +#endif { /* close the parametric binaural renderer */ ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); @@ -151,7 +155,11 @@ static ivas_error ivas_ism_bitrate_switching( } } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { /* close the parametric binaural renderer */ ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); @@ -180,7 +188,11 @@ static ivas_error ivas_ism_bitrate_switching( return error; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR ) +#else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) +#endif { /* open the parametric binaural renderer */ if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) @@ -214,7 +226,11 @@ static ivas_error ivas_ism_bitrate_switching( } } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { /* open the parametric binaural renderer */ if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 244bf1f398..614988735e 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -340,7 +340,11 @@ static ivas_error ivas_param_ism_rendering_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for interpolator\n" ) ); } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) +#else if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) +#endif { /* computation of proto matrix */ ivas_ism_get_proto_matrix( hOutSetup, nchan_transport, hParamIsmRendering->proto_matrix ); @@ -474,7 +478,11 @@ ivas_error ivas_param_ism_dec_open( } } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) +#else if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) +#endif { /* Initialize efap handle */ if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), hOutSetup.ls_azimuth, hOutSetup.ls_elevation, hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) @@ -492,7 +500,11 @@ ivas_error ivas_param_ism_dec_open( hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) +#else if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) +#endif { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) @@ -635,7 +647,11 @@ void ivas_param_ism_dec_close( hDirAC->hParamIsm = NULL; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) +#else if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) +#endif { for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 4d6f834308..8c25cd8530 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1007,7 +1007,11 @@ static ivas_error ivas_mc_dec_reconfig( output_config = st_ivas->hDecoderConfig->output_config; /* binaural renderers*/ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { /* remove unneeded binaural renderers */ if ( st_ivas->hBinRenderer != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index ff73e6aa49..c89b6c959d 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -76,13 +76,21 @@ void ivas_renderer_select( st_ivas->hHeadTrackData->shd_rot_max_order = -1; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { if ( st_ivas->ivas_format == ISM_FORMAT ) { if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL ) +#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -93,7 +101,11 @@ void ivas_renderer_select( } else /* ISM_MODE_DISC */ { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) +#endif { #ifdef DEBUGGING if ( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) @@ -104,7 +116,11 @@ void ivas_renderer_select( else { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + *internal_config = AUDIO_CONFIG_BINAURAL_HRIR; +#else *internal_config = AUDIO_CONFIG_BINAURAL; +#endif } #else *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; @@ -127,7 +143,11 @@ void ivas_renderer_select( else if ( st_ivas->ivas_format == MASA_FORMAT || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport <= 2 ) ) { *internal_config = output_config; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL ) +#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -139,8 +159,11 @@ void ivas_renderer_select( else if ( st_ivas->ivas_format == SBA_FORMAT ) { *internal_config = AUDIO_CONFIG_HOA3; - +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL ) +#endif { *renderer_type = RENDERER_BINAURAL_FASTCONV; } @@ -176,7 +199,11 @@ void ivas_renderer_select( if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { *internal_config = output_config; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL ) +#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -188,7 +215,11 @@ void ivas_renderer_select( else { *internal_config = transport_config; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL ) +#endif { #ifdef DEBUGGING if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) @@ -226,7 +257,11 @@ void ivas_renderer_select( } } } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + else +#else else /* AUDIO_CONFIG_BINAURAL_ROOM */ +#endif { if ( st_ivas->mc_mode == MC_MODE_MCT ) { diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index f0588ae303..6f8f852ba7 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1274,7 +1274,11 @@ void ivas_spar_dec_upmixer( } else { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) +#else if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) +#endif { for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ee315bf399..8617d47464 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -326,6 +326,20 @@ static AUDIO_CONFIG mapOutputFormat( { output_config = AUDIO_CONFIG_HOA3; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_BRIR ) + { + output_config = AUDIO_CONFIG_BINAURAL_BRIR; + } + else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_HRIR ) + { + output_config = AUDIO_CONFIG_BINAURAL_HRIR; + } + else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + { + output_config = AUDIO_CONFIG_BINAURAL_HRIR_REVERB; + } +#else else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL ) { output_config = AUDIO_CONFIG_BINAURAL; @@ -334,10 +348,11 @@ static AUDIO_CONFIG mapOutputFormat( { output_config = AUDIO_CONFIG_BINAURAL_ROOM; } - else - { - output_config = AUDIO_CONFIG_INVALID; - } +#endif + else + { + output_config = AUDIO_CONFIG_INVALID; + } return output_config; } @@ -1851,6 +1866,20 @@ static ivas_error get_channel_config( { strcpy( str, "Ambisonics: Third Order (HOA3)" ); } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + else if ( config == AUDIO_CONFIG_BINAURAL_HRIR ) + { + strcpy( str, "Binaural: HRIR" ); + } + else if ( config == AUDIO_CONFIG_BINAURAL_BRIR ) + { + strcpy( str, "Binaural: BRIR" ); + } + else if ( config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + { + strcpy( str, "Binaural: HRIR with reverb" ); + } +#else else if ( config == AUDIO_CONFIG_BINAURAL ) { strcpy( str, "Binaural" ); @@ -1859,6 +1888,7 @@ static ivas_error get_channel_config( { strcpy( str, "Binaural_ROOM" ); } +#endif else if ( config == AUDIO_CONFIG_EXTERNAL ) { strcpy( str, "External renderer" ); diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 17af564295..ce30269277 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -55,8 +55,14 @@ typedef enum _IVAS_DEC_OUTPUT_CONFIG IVAS_DEC_OUTPUT_FOA, IVAS_DEC_OUTPUT_HOA2, IVAS_DEC_OUTPUT_HOA3, +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + IVAS_DEC_OUTPUT_BINAURAL_HRIR, + IVAS_DEC_OUTPUT_BINAURAL_BRIR, + IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB, +#else IVAS_DEC_OUTPUT_BINAURAL, IVAS_DEC_OUTPUT_BINAURAL_ROOM, +#endif IVAS_DEC_OUTPUT_EXT, IVAS_DEC_OUTPUT_UNKNOWN = 0xffff } IVAS_DEC_AUDIO_CONFIG; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index c05ae7c262..72ec04ca32 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -182,7 +182,11 @@ static ivas_error ivas_rend_initCrend( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Encountered unsupported input config in Crend" ); } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported output type in Crend" ); } @@ -197,7 +201,11 @@ static ivas_error ivas_rend_initCrend( /* set BRIR flag */ use_brir = false; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) ) ) +#else if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) ) +#endif { use_brir = true; } diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index 193e775f22..cfc9e9698f 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -90,8 +90,14 @@ int16_t audioCfg2channels( case AUDIO_CONFIG_OBA: nchan_out = 8; break; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case AUDIO_CONFIG_BINAURAL_HRIR: + case AUDIO_CONFIG_BINAURAL_BRIR: + case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case AUDIO_CONFIG_BINAURAL: case AUDIO_CONFIG_BINAURAL_ROOM: +#endif nchan_out = 2; break; case AUDIO_CONFIG_ISM1: @@ -216,8 +222,14 @@ void ivas_output_init( hOutSetup->ls_elevation = ls_elevation_CICP19; hOutSetup->is_planar_setup = 0; break; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case AUDIO_CONFIG_BINAURAL_HRIR: + case AUDIO_CONFIG_BINAURAL_BRIR: + case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case AUDIO_CONFIG_BINAURAL: case AUDIO_CONFIG_BINAURAL_ROOM: +#endif case AUDIO_CONFIG_ISM1: case AUDIO_CONFIG_ISM2: case AUDIO_CONFIG_ISM3: diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index efa2111243..821ba74706 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -859,7 +859,11 @@ void ivas_render_config_close( ivas_error ivas_render_config_init_from_rom( RENDER_CONFIG_HANDLE *hRenderConfig, /* i/o: Renderer config handle */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + const AUDIO_CONFIG output_config /* i : output audio configuration */ +#else const int16_t room_flag_on /* i : room effect on/off flag */ +#endif ); diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index efd866ccec..b55843b687 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -99,8 +99,12 @@ void ivas_render_config_close( *-------------------------------------------------------------------*/ ivas_error ivas_render_config_init_from_rom( - RENDER_CONFIG_HANDLE *hRenderConfig, /* i/o: Renderer config handle */ - const int16_t room_flag_on /* i : room effect on/off flag */ + RENDER_CONFIG_HANDLE *hRenderConfig, /* i/o: Renderer config handle */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + const AUDIO_CONFIG output_config /* i : output audio configuration */ +#else + const int16_t room_flag_on /* i : room effect on/off flag */ +#endif ) { @@ -113,8 +117,8 @@ ivas_error ivas_render_config_init_from_rom( ( *hRenderConfig )->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE; #endif ( *hRenderConfig )->roomAcoustics.override = FALSE; - ( *hRenderConfig )->roomAcoustics.use_brir = room_flag_on; - ( *hRenderConfig )->roomAcoustics.late_reverb_on = room_flag_on; + ( *hRenderConfig )->roomAcoustics.use_brir = output_config == AUDIO_CONFIG_BINAURAL_BRIR ? TRUE : FALSE; + ( *hRenderConfig )->roomAcoustics.late_reverb_on = output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ? TRUE : FALSE; ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_PRE_DELAY; ( *hRenderConfig )->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_INPUT_DELAY; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 7744a6582b..c31ca5b627 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -342,10 +342,19 @@ AUDIO_CONFIG getIvasAudioConfigFromRendAudioConfig( return AUDIO_CONFIG_HOA3; case IVAS_REND_AUDIO_CONFIG_OBJECT: return AUDIO_CONFIG_OBA; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: + return AUDIO_CONFIG_BINAURAL_HRIR; + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + return AUDIO_CONFIG_BINAURAL_BRIR; + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: + return AUDIO_CONFIG_BINAURAL_HRIR_REVERB; +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: return AUDIO_CONFIG_BINAURAL; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: return AUDIO_CONFIG_BINAURAL_ROOM; +#endif case IVAS_REND_AUDIO_CONFIG_MASA1: return AUDIO_CONFIG_MASA1; case IVAS_REND_AUDIO_CONFIG_MASA2: @@ -372,10 +381,19 @@ IVAS_REND_AudioConfig getRendAudioConfigFromIvasAudioConfig( return IVAS_REND_AUDIO_CONFIG_MONO; case AUDIO_CONFIG_STEREO: return IVAS_REND_AUDIO_CONFIG_STEREO; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case AUDIO_CONFIG_BINAURAL_HRIR: + return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR; + case AUDIO_CONFIG_BINAURAL_BRIR: + return IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR; + case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: + return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB; +#else case AUDIO_CONFIG_BINAURAL: return IVAS_REND_AUDIO_CONFIG_BINAURAL; case AUDIO_CONFIG_BINAURAL_ROOM: return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM; +#endif case AUDIO_CONFIG_5_1: return IVAS_REND_AUDIO_CONFIG_5_1; case AUDIO_CONFIG_7_1: @@ -420,8 +438,14 @@ static ivas_error validateOutputAudioConfig( case IVAS_REND_AUDIO_CONFIG_FOA: case IVAS_REND_AUDIO_CONFIG_HOA2: case IVAS_REND_AUDIO_CONFIG_HOA3: +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif return IVAS_ERR_OK; default: break; @@ -493,8 +517,14 @@ ivas_error getAudioConfigNumChannels( *numChannels = 1; break; case IVAS_REND_AUDIO_CONFIG_STEREO: +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif case IVAS_REND_AUDIO_CONFIG_MASA2: *numChannels = 2; break; @@ -783,7 +813,11 @@ static ivas_error initEfap( const float *elevations; int16_t numNonLfeChannels; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { pEfapWrapper->speakerConfig = IVAS_REND_AUDIO_CONFIG_7_1_4; } @@ -1100,14 +1134,22 @@ static ivas_error setRendInputActiveIsm( initRotMatrix( inputIsm->rot_mat_prev ); error = IVAS_ERR_OK; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) +#else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) +#endif { if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) { @@ -1734,9 +1776,18 @@ static ivas_error updateMcPanGains( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: +#endif break; /* Do nothing */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif /* Prepare rendering to intermediate format */ error = updateMcPanGainsForMcOut( inputMc, IVAS_REND_AUDIO_CONFIG_7_1_4 ); break; @@ -1801,7 +1852,11 @@ static ivas_error initMcBinauralRendering( /* TODO tmu : needs review allocate both renderers; needed if headrotation is toggled so the renderer can be switched */ // bool initTDRend; // initTDRend = false; + //#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + // if ( ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) && ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + //#else // if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) + //#endif // { // if ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) // { @@ -1937,7 +1992,11 @@ static ivas_error setRendInputActiveMc( initRotGains( inputMc->rot_gains_prev ); inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { if ( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) { @@ -2095,7 +2154,11 @@ static ivas_error updateSbaPanGains( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: +#endif error = ivas_rend_openCrend( &inputSba->crendWrapper, getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), @@ -2103,7 +2166,12 @@ static ivas_error updateSbaPanGains( NULL, *rendCtx.pOutSampleRate ); break; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif if ( ( error = initSbaPanGainsForMcOut( inputSba, IVAS_REND_AUDIO_CONFIG_7_1_4, NULL ) ) != IVAS_ERR_OK ) { return error; @@ -2353,7 +2421,11 @@ static ivas_error initMasaDummyDecForBinauralOut( decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL ) +#endif { decDummy->renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -2461,7 +2533,11 @@ static DecoderDummy *initDecoderDummy( decDummy->hDecoderConfig->output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); decDummy->nchan_transport = numTransChannels; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { decDummy->hHeadTrackData = malloc( sizeof( HEAD_TRACK_DATA ) ); /* Initialise Rmat_prev to I, Rmat will be computed later */ @@ -3193,7 +3269,11 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( return error; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) +#else if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) +#endif { if ( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) { @@ -3675,7 +3755,11 @@ ivas_error IVAS_REND_InitConfig( { return error; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4449,8 +4533,13 @@ static ivas_error renderIsmToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_BRIR, + NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4603,10 +4692,19 @@ static ivas_error renderInputIsm( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: +#endif error = renderIsmToBinaural( ismInput, outAudio ); break; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif error = renderIsmToBinauralRoom( ismInput, outAudio ); break; default: @@ -4995,10 +5093,19 @@ static ivas_error renderInputMc( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: +#endif error = renderMcToBinaural( mcInput, outConfig, outAudio ); break; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif if ( mcInput->base.inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { error = renderMcCustomLsToBinauralRoom( mcInput, outConfig, outAudio ); @@ -5245,10 +5352,19 @@ static ivas_error renderInputSba( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: +#endif error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); break; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif error = renderSbaToBinauralRoom( sbaInput, outConfig, outAudio ); break; default: @@ -5422,11 +5538,21 @@ static ivas_error renderInputMasa( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: +#endif renderMasaToBinaural( masaInput, outAudio ); break; /* ToDo */ + //#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + // case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: + // case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: + //#else // case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: + //#endif // renderMasaToBinauralRoom( masaInput, outConfig, outAudio ); // break; default: diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 1e9d41fd38..dcc67916f3 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -112,8 +112,14 @@ typedef enum IVAS_REND_AUDIO_CONFIG_OBJECT = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED << 8 | 0, +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, + IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, + IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, +#else IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, +#endif IVAS_REND_AUDIO_CONFIG_MASA1 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 0, IVAS_REND_AUDIO_CONFIG_MASA2 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 1, diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 54f2d012ce..86ca3301ab 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -422,6 +422,7 @@ ivas_error RenderConfigReader_read( #ifdef DEBUGGING fprintf( stderr, " PARAM: %s -> %s\n", item, pValue ); #endif +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( strcmp( item, "REVERB" ) == 0 ) { if ( read_bool( pValue, &hRenderConfig->room_acoustics.late_reverb_on ) ) @@ -436,7 +437,9 @@ ivas_error RenderConfigReader_read( errorHandler( item, ERROR_VALUE_INVALID ); } } - else if ( strcmp( item, "NBANDS" ) == 0 ) + else +#endif + if ( strcmp( item, "NBANDS" ) == 0 ) { if ( !sscanf( pValue, "%hd", &hRenderConfig->room_acoustics.nBands ) || hRenderConfig->room_acoustics.nBands > CLDFB_NO_CHANNELS_MAX ) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 91bca7eef2..d23bbc4c93 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -254,21 +254,21 @@ ../IVAS_cod -ism 1 testv/stvISM1.csv 13200 48 testv/stv1ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv1ISM48s.wav_13200_48-48_MONO.tst -// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out, random FEC at 5% +// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_HRIR out, random FEC at 5% ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 13200 48 testv/stv48n.wav bit -../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv48n.wav_13200_48-48_DTX_FEC5_BINAURAL.tst +../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv48n.wav_13200_48-48_DTX_FEC5_BINAURAL.tst // 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv2ISM48s.wav_16400_48-48_STEREO.tst -// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst -// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst // 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit @@ -278,9 +278,9 @@ ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit ../IVAS_dec -fec 5 MONO 48 bit testv/stv3ISM48s.wav_24400_48-48_MONO_FEC5.tst -// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst // 1 ISM with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 32000 32 testv/stv32n.wav bit @@ -294,13 +294,13 @@ ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_32000_48-48_STEREO.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_HRIR out ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst // 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, HOA2 out ../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stvST48c.wav bit @@ -310,37 +310,37 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FEC at 5% +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out, random FEC at 5% ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_BRIR 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst // 3 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst -// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL ROOM out, random FEC at 5% +// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_HRIR ROOM out, random FEC at 5% ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit -../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_BRIR 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst -// 2 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5% +// 2 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out, random FEC at 5% ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, random FEC at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out, head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst // 2 ISM with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst -// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out +// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst // 2 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, DTX on, stereo out ../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 80000 48 testv/stvST48c.wav bit @@ -350,49 +350,49 @@ ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 80000 48 testv/stv4ISM48s.wav bit ../IVAS_dec HOA2 48 bit testv/stv4ISM48s.wav_80000_48-48_HOA2.tst -// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, random FEC at 5% +// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL_HRIR out (Model from file), head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_FEC5.tst +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_HRIR 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_FEC5.tst // 4 ISM with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit ../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst -// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file) +// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, BINAURAL_HRIR out (Model from file) ../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_96000_48-16_binaural.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_HRIR 16 bit testv/stv2ISM48s.wav_96000_48-16_binaural.tst // 3 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, HOA3 out, random FEC at 5% ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stv3ISM48s.wav bit ../IVAS_dec -fec 5 HOA3 32 bit testv/stv3ISM48s.wav_128000_48-32_HOA3_FEC5.tst -// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation +// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL_HRIR out (Model from file), head rotation ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst +../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL_HRIR 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst // 4 ISM with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst -// 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL out +// 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL_HRIR out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL 32 bit testv/stv2ISM48s.wav_160000_48-32_binaural.tst +../IVAS_dec BINAURAL_HRIR 32 bit testv/stv2ISM48s.wav_160000_48-32_binaural.tst -// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out (Model from file) +// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out (Model from file) ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural)file.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_HRIR 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural)file.tst -// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, random FEC at 5% +// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out, head rotation, random FEC at 5% ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_FEC5.tst +../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL_HRIR 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_FEC5.tst -// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural.tst -// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation +// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out, head rotation ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR.tst +../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL_HRIR 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR.tst // 3 ISM with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 384000 48 testv/stv3ISM48s.wav bit @@ -402,30 +402,30 @@ ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stv4ISM48s.wav bit ../IVAS_dec 5_1 48 bit testv/stv4ISM48s.wav_512000_48-48_5_1.tst -// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, Orientation tracking +// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL_HRIR out, head rotation, Orientation tracking ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_HRIR 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_OtrAvg.tst // 1 ISM with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv32c.wav bit ../IVAS_dec MONO 32 bit testv/stv32c.wav_brate_sw_32-32_mono_dtx.tst -// 4 ISM with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out +// 4 ISM with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_binaural.tst // 4 ISm with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit ../IVAS_dec HOA3 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_DTX_hoa3.tst -// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, directivity configuration, random FEC at 5% +// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out, head rotation, directivity configuration, random FEC at 5% ../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -fec 5 -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv BINAURAL 48 bit testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FEC5.tst +../IVAS_dec -fec 5 -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv BINAURAL_HRIR 48 bit testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FEC5.tst -// 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out +// 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_HRIR out ../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s.wav_brate_sw_48-48_DTX_binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv+4ISM48s.wav_brate_sw_48-48_DTX_binaural.tst // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out @@ -440,49 +440,49 @@ ../IVAS_cod -sba 3 16400 32 testv/stv3OA32c.wav bit ../IVAS_dec 7_1_4 32 bit testv/stv3OA32c.wav_SBA_16400_32-32_7_1_4.tst -// SBA at 16.4 kbps, 32kHz in, 32kHz out, BINAURAL out +// SBA at 16.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out ../IVAS_cod -sba 3 16400 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL 32 bit testv/stv3OA32c.wav_SBA_16400_32-32_Binaural.tst +../IVAS_dec BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_16400_32-32_Binaural.tst // SBA at 24.4 kbps, 32kHz in, 32kHz out, STEREO out ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_stereo.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural.tst +../IVAS_dec BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, random FEC at 5% +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, random FEC at 5% ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Subframe_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Subframe_FEC5.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, Headrotation ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, Orientation tracking +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_HRIR 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_OtrAvg.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5% +// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out, random FEC at 5% ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_FEC5.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation +// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out, DTX on, Headrotation ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_Headrot.tst // SBA at 32 kbps, 32kHz in, 32kHz out, FOA out ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_FOA.tst -// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL out, 6% FEC pattern +// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, 6% FEC pattern ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit -../IVAS_dec -fec testv/FEC_6pct.bin BINAURAL 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_FEC6.tst +../IVAS_dec -fec testv/FEC_6pct.bin BINAURAL_HRIR 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_FEC6.tst -// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out +// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_BRIR 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst // SBA at 32 kbps, 48kHz in, 48kHz out, MONO out, DTX ../IVAS_cod -dtx -sba 1 32000 48 testv/stvFOA48c.wav bit @@ -496,37 +496,37 @@ ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_stereo.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst +../IVAS_dec BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst +../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking in level mode +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst +../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5% +// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out, random FEC at 5% ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_FEC5.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out, DTX on, Headrotation ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_Headrot.tst // SBA at 48 kbps, 48kHz in, 48kHz out, 5_1_2 out ../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit @@ -544,25 +544,25 @@ ../IVAS_cod -sba 1 64000 48 testv/stvFOA48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_7_1_4.tst -// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL out, DTX +// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_HRIR out, DTX ../IVAS_cod -dtx -sba 1 64000 48 testv/stvFOA48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL.tst -// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_ROOM out, DTX +// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_BRIR out, DTX ../IVAS_cod -dtx -sba 1 64000 48 testv/stvFOA48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL_ROOM.tst // SBA at 80 kbps, 32kHz in, 32kHz out, HOA3 out ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit ../IVAS_dec HOA3 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_HOA3.tst -// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, random FEC at 5% +// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, random FEC at 5% ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit -../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_FEC5.tst -// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation +// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, Headrotation ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_Headrot.tst // SBA at 96 kbps, 32kHz in, 32kHz out, STEREO out ../IVAS_cod -sba 1 96000 32 testv/stvFOA32c.wav bit @@ -572,13 +572,13 @@ ../IVAS_cod -sba 1 96000 48 testv/stvFOA48c.wav bit ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_SBA_96000_48-48_FOA.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst // SBA at 192 kbps, 48kHz in, 48kHz out, HOA2 out, random FEC at 5% ../IVAS_cod -sba 3 192000 48 testv/stv3OA48c.wav bit @@ -592,9 +592,9 @@ ../IVAS_cod -sba 1 160000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_160000_32-32_FOA.tst -// SBA at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, random FEC at 5% +// SBA at 160 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, random FEC at 5% ../IVAS_cod -sba 1 160000 48 testv/stvFOA48c.wav bit -../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stvFOA48c.wav_SBA_160000_48-48_BINAURAL_ROOM_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_BRIR 48 bit testv/stvFOA48c.wav_SBA_160000_48-48_BINAURAL_ROOM_FEC5.tst // SBA at 160 kbps, 48kHz in, 48kHz out, 5_1 out ../IVAS_cod -sba 1 160000 48 testv/stvFOA48c.wav bit @@ -608,9 +608,9 @@ ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_FOA.tst -// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out +// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_BRIR 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst // SBA at 256 kbps, 48kHz in, 48kHz out, 7_1 out, random FEC at 5% ../IVAS_cod -sba 1 256000 48 testv/stvFOA48c.wav bit @@ -620,13 +620,13 @@ ../IVAS_cod -sba 2 384000 32 testv/stv2OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv2OA32c.wav_SBA_384000_32-32_stereo.tst -// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out +// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit -../IVAS_dec binaural 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural.tst -// SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL out +// SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 48 testv/stvFOA48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_sw_48-48_BINAURAL.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stvFOA48c.wav_sw_48-48_BINAURAL.tst // SBA 2OA bitrate switching from 16.4 kbps to 512 kbps, 48kHz in, 48kHz out, FOA out ../IVAS_cod -sba 2 ../scripts/switchPaths/sw_16k4_512k_50fr.bin 48 testv/stv2OA48c.wav bit @@ -640,9 +640,9 @@ ../IVAS_cod -sba -3 ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv3OA48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stv3OA48c.wav_sw_48-48_7_1_4.tst -// SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out +// SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out ../IVAS_cod -dtx -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL 32 bit testv/stvFOA32c.wav_sw_32-32_DTX_BINAURAL.tst +../IVAS_dec BINAURAL_HRIR 32 bit testv/stvFOA32c.wav_sw_32-32_DTX_BINAURAL.tst // SBA 3OA bitrate switching from 13.2 kbps to 128 kbps, 32kHz in, 32kHz out, DTX on, HOA3 out ../IVAS_cod -dtx -sba 3 ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv3OA32c.wav bit @@ -650,25 +650,25 @@ -// MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out +// MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 13200 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv1MASA1TC48c.wav_13200_48-48_BINAURAL.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv1MASA1TC48c.wav_13200_48-48_BINAURAL.tst // MASA 1dir 1TC at 16.4 kbps, 48kHz in, 48kHz out, HOA3 out, random FEC at 5% ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 16400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -fec 5 HOA3 48 bit testv/stv1MASA1TC48c.wav_16400_48-48_HOA3_FEC5.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, Headrotation ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst // MASA 1dir 1TC at 32 kbps, 48kHz in, 48kHz out, 7_1_4, random FEC at 5% ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 32000 48 testv/stv1MASA1TC48c.wav bit @@ -682,17 +682,17 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 64000 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv1MASA1TC48c.wav_64000_48-48_STEREO.tst -// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, random FEC at 5% +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, random FEC at 5% ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit -../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_FEC5.tst -// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Subframe.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Subframe.tst -// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot.tst // MASA 1dir 2TC at 13.2 kbps, 48kHz in, 48kHz out, 5_1 out, random FEC at 5% ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 13200 48 testv/stv1MASA2TC48c.wav bit @@ -706,17 +706,17 @@ ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 24400 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv1MASA2TC48c.wav_24400_48-48_STEREO.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, Headrotation ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, Headrotation, Orientation tracking ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst // MASA 1dir 2TC at 48 kbps, 48kHz in, 48kHz out, 7_1_4 out, random FEC at 5% ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 48000 48 testv/stv1MASA2TC48c.wav bit @@ -746,9 +746,9 @@ ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 64000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -fec 5 EXT 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_external_FEC5.tst -// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 64000 48 testv/stv2MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_BINAURAL_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_BINAURAL_Headrot.tst // MASA 2dir 2TC at 128 kbps, 48kHz in, 48kHz out, FOA out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 128000 48 testv/stv2MASA2TC48c.wav bit @@ -758,13 +758,13 @@ ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 192000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -fec 5 5_1_4 48 bit testv/stv2MASA2TC48c.wav_192000_48-48_5_1_4_FEC5.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst // MASA 2dir 2TC at 512 kbps, 48kHz in, 48kHz out, 5_1 out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 512000 48 testv/stv2MASA2TC48c.wav bit @@ -790,9 +790,9 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48n.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/stv1MASA1TC48n.wav bit ../IVAS_dec 5_1 48 bit testv/stv1MASA1TC48n.wav_sw_48-48_5_1.tst -// MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out +// MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -masa 2 testv/stv1MASA2TC48n.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv1MASA2TC48n.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv1MASA2TC48n.wav_sw_48-48_BINAURAL.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv1MASA2TC48n.wav_sw_48-48_BINAURAL.tst @@ -800,73 +800,73 @@ ../IVAS_cod -mc 5_1 13200 48 testv/stv51MC48c.wav bit ../IVAS_dec 5_1 48 bit testv/stv51MC48c.wav_MC51_13200_48-48_5_1.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, random FEC at 5% +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, random FEC at 5% ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit -../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_FEC5.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Subframe.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Subframe.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Headrot.tst // Multi-channel 5_1 at 48 kbps, 48kHz in, 48kHz out, random FEC at 5% ../IVAS_cod -mc 5_1 48000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 5_1 48 bit testv/stv51MC48c.wav_MC51_48000_48-48_5_1_FEC5.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst // Multi-channel 5_1 at 96 kbps, 48kHz in, 48kHz out, random FEC at 5% ../IVAS_cod -mc 5_1 96000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 5_1 48 bit testv/stv51MC48c.wav_MC51_96000_48-48_5_1_FEC5.tst -// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out +// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural.tst -// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation +// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation ../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural_Headrot.tst // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, STEREO out, random FEC at 5% ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_stereo_FEC5.tst -// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out +// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out ../IVAS_cod -mc 5_1 192000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, MONO out ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec MONO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_mono.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, head rotation ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, Orientation tracking +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, head rotation, Orientation tracking ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit ../IVAS_dec 5_1 48 bit testv/stv51MC48c.wav_MC51_384000_48-48_5_1.tst -// Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out, BINAURAL out +// Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_384000_48-48_Binaural.tst +../IVAS_dec BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_384000_48-48_Binaural.tst // Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, STEREO out ../IVAS_cod -mc 5_1 192000 48 testv/stv51MC48c.wav bit @@ -916,49 +916,49 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_MC_custom_setup.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_HRIR_REVERB out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_HRIR_REVERB out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config hospital_patientroom +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config hospital_patientroom ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst +../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config recreation +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config recreation ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_recreation.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst +../IVAS_dec -render_config testv/rend_config_recreation.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst -// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config renderer ../IVAS_cod -mc 5_1_2 512000 48 testv/stv512MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config renderer ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config renderer ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst // Multi-channel 5_1 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, 7_1_4 out ../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv51MC48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stv51MC48c.wav_sw_48-48_7_1_4.tst -// Multi-channel 5_1 bitrate switching from 24.4 kbps to 256 kbps, 48kHz in, 48kHz out, BINAURAL out, FEC at 10% +// Multi-channel 5_1 bitrate switching from 24.4 kbps to 256 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, FEC at 10% ../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv51MC48c.wav bit -../IVAS_dec -fec 10 BINAURAL 48 bit testv/stv51MC48c.wav_sw_48-48_binaural_fec10.tst +../IVAS_dec -fec 10 BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_sw_48-48_binaural_fec10.tst -// Multi-channel 5_1_2 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out +// Multi-channel 5_1_2 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_BRIR out ../IVAS_cod -mc 5_1_2 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv512MC48c.wav bit -../IVAS_dec BINAURAL_ROOM 16 bit testv/stv512MC48c.wav_sw_48-16_Binaural_room.tst +../IVAS_dec BINAURAL_BRIR 16 bit testv/stv512MC48c.wav_sw_48-16_Binaural_room.tst // Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, HOA3 out ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv714MC48c.wav bit @@ -969,21 +969,21 @@ ../IVAS_dec -FEC 5 STEREO 32 bit testv/stv714MC48c.wav_sw_48-32_stereo.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out (Model from file) +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_BRIR out (Model from file) ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_ROOM 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_BRIR 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 32kHz out, BINAURAL out (Model from file) +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_HRIR out (Model from file) ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv714MC48c.wav_MC714_512000_48-32_MC_binaural.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL_HRIR 32 bit testv/stv714MC48c.wav_MC714_512000_48-32_MC_binaural.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out (Model from file) ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out (Model from file) +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out (Model from file) ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_BRIR 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst diff --git a/scripts/pyivastest/constants.py b/scripts/pyivastest/constants.py index f42796376a..03cb439901 100644 --- a/scripts/pyivastest/constants.py +++ b/scripts/pyivastest/constants.py @@ -46,8 +46,9 @@ SW_FILES_BASE_DIR = os.path.realpath( OC_TO_NCHANNELS = { "MONO": 1, "STEREO": 2, - "BINAURAL": 2, - "BINAURAL_ROOM": 2, + "BINAURAL_HRIR": 2, + "BINAURAL_BRIR": 2, + "BINAURAL_HRIR_REVERB": 2, "5_1": 6, "7_1": 8, "5_1_2": 8, @@ -64,7 +65,7 @@ OC_TO_NCHANNELS = { "MASA1TC": 1, "MASA2TC": 2, } -DECODER_OUTPUT_CONFIGS = {"MONO", "STEREO", "BINAURAL", "BINAURAL_ROOM", "5_1", "7_1", "5_1_4", "5_1_2", +DECODER_OUTPUT_CONFIGS = {"MONO", "STEREO", "BINAURAL_HRIR", "BINAURAL_BRIR", "BINAURAL_HRIR_REVERB", "5_1", "7_1", "5_1_4", "5_1_2", "7_1_4", "FOA", "HOA2", "HOA3", "EXT"} LOG_FILE_EXT = ".txt" LOG_FILE_DIR ="logs" diff --git a/scripts/testv/rend_config_hospital_patientroom.cfg b/scripts/testv/rend_config_hospital_patientroom.cfg index b68ac921f9..8b35e102ea 100644 --- a/scripts/testv/rend_config_hospital_patientroom.cfg +++ b/scripts/testv/rend_config_hospital_patientroom.cfg @@ -1,6 +1,4 @@ [roomAcoustics] -reverb = true; -brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, diff --git a/scripts/testv/rend_config_recreation.cfg b/scripts/testv/rend_config_recreation.cfg index afdc0f858b..85ca1ca76e 100644 --- a/scripts/testv/rend_config_recreation.cfg +++ b/scripts/testv/rend_config_recreation.cfg @@ -1,6 +1,4 @@ [roomAcoustics] -reverb = true; -brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, diff --git a/scripts/testv/rend_config_renderer.cfg b/scripts/testv/rend_config_renderer.cfg index 8aa9dec1b2..ef2257ab6c 100644 --- a/scripts/testv/rend_config_renderer.cfg +++ b/scripts/testv/rend_config_renderer.cfg @@ -1,6 +1,4 @@ [roomAcoustics] -reverb = true; # Reverb switch, in case BRIR is undefined or false, reverb flag is inherited from the room flag -brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py index c66f5e677c..60208150fe 100644 --- a/tests/renderer/constants.py +++ b/tests/renderer/constants.py @@ -193,10 +193,6 @@ HR_TRAJECTORIES_TO_TEST = [ "rotate_yaw_pitch_roll1", ] -CONFIG_FILES_TO_TEST = [ - "just_reverb" -] - """ Per-testcase xfail SNR thresholds (dB) """ pass_snr = dict() # not relevant for tests anymore, should be deprecated soon _pass_snr = { diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index d88d7a4a42..2693dcd5b8 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -56,24 +56,6 @@ def test_ambisonics_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file): ) -# Test compares rendering with render config file containing just reverb defaults against rendering without config file. -# These should be binary equivalent. -@pytest.mark.parametrize("config_file", CONFIG_FILES_TO_TEST) -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) -@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_ISM) -def test_ambisonics_binaural_headrotation_defaultrenderconfig(test_info, in_fmt, out_fmt, config_file): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "defaultrenderconfig" - }, - cut_kwargs={ - "config_file": TESTV_DIR.joinpath(f"{config_file}.cfg") - } - ) - # Test compares rendering with just a trajectory file against rendering with a trajectory file + a zero ref rotation. # These should be binary equivalent. @pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) -- GitLab From 3ee61d8c632fb01d4503dabab9b62c3671003e2a Mon Sep 17 00:00:00 2001 From: Fredrik Jansson Date: Wed, 10 May 2023 11:07:56 +0200 Subject: [PATCH 032/381] Fix updated, alternate fix removed --- lib_com/ivas_prot.h | 4 ++++ lib_com/options.h | 2 -- lib_enc/ivas_stereo_dft_enc.c | 21 +++++++++------------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 21ea995a84..1721d171f0 100755 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1063,7 +1063,11 @@ void stereo_enc_itd_init( void stereo_dft_enc_update( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ +#ifdef FIX_395_CNG_BW + const int16_t bwidth /* i : encoded bandwidth */ +#else const int16_t max_bwidth /* i : maximum encoded bandwidth */ +#endif ); void stereo_dft_enc_destroy( diff --git a/lib_com/options.h b/lib_com/options.h index ee0908cd84..238a1a9a04 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -168,8 +168,6 @@ #define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ -/*#define FIX_395_CNG_BW_ALT*/ /* Eri: Issue 395 - CNG bandwidth issue for unified stereo Alternate solution */ - /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 121064c95a..abb7efd642 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -587,7 +587,11 @@ void stereo_enc_itd_init( void stereo_dft_enc_update( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ +#ifdef FIX_395_CNG_BW + const int16_t bwidth /* i : encoded bandwidth */ +#else const int16_t max_bwidth /* i : maximum encoded bandwidth */ +#endif ) { int16_t i, k_offset; @@ -633,8 +637,13 @@ void stereo_dft_enc_update( hStereoDft->last_res_cod_mode_modify_flag = hStereoDft->res_cod_sw_flag; hStereoDft->res_cod_sw_flag = 0; +#ifdef FIX_395_CNG_BW + /* update band limits in case of rate switching */ + NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[bwidth] / L_FRAME48k; +#else /* update band limits in case of rate switching assuming max_bwidth as BWD output not yet know here */ NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k; +#endif hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC ); hStereoDft->nbands_dmx = stereo_dft_band_config( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC ); @@ -2172,18 +2181,7 @@ void stereo_dft_enc_write_BS( k_offset = STEREO_DFT_OFFSET; nbands_full = hStereoDft->nbands; -#ifdef FIX_395_CNG_BW_ALT - if ( core_brate == SID_2k40 ) - { - NFFT_inner = min( STEREO_DFT_N_32k_ENC,STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k ); - } - else - { - NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; - } - hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); -#else NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; if ( !( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) ) @@ -2191,7 +2189,6 @@ void stereo_dft_enc_write_BS( /* set number of bands according to bandwidth after BWD */ hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); } -#endif if ( core_brate == FRAME_NO_DATA ) { -- GitLab From eb9f15c70c0321f3731dab2c061767c439301626 Mon Sep 17 00:00:00 2001 From: Fredrik Jansson Date: Wed, 10 May 2023 12:23:05 +0200 Subject: [PATCH 033/381] fix for clang error --- lib_enc/ivas_stereo_dft_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 2342bc01f2..c5aa8ebb4f 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -573,7 +573,7 @@ void stereo_enc_itd_init( void stereo_dft_enc_update( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ #ifdef FIX_395_CNG_BW - const int16_t bwidth /* i : encoded bandwidth */ + const int16_t bwidth /* i : encoded bandwidth */ #else const int16_t max_bwidth /* i : maximum encoded bandwidth */ #endif -- GitLab From ef0c7c93234f234ff77730597ac4c724fa878fc6 Mon Sep 17 00:00:00 2001 From: Fredrik Jansson Date: Wed, 10 May 2023 13:55:06 +0200 Subject: [PATCH 034/381] Clang format error fixed --- lib_enc/ivas_stereo_dft_enc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index c5aa8ebb4f..dd07219780 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -573,9 +573,9 @@ void stereo_enc_itd_init( void stereo_dft_enc_update( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ #ifdef FIX_395_CNG_BW - const int16_t bwidth /* i : encoded bandwidth */ + const int16_t bwidth /* i : encoded bandwidth */ #else - const int16_t max_bwidth /* i : maximum encoded bandwidth */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ #endif ) { -- GitLab From 8b5159fb8f395fb8b31c55f0129032ef67570415 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 10 May 2023 15:37:39 +0200 Subject: [PATCH 035/381] remove outdated todos related to DTX thresholds --- lib_enc/lib_enc.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 45d4c85683..823a22c31b 100644 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -879,10 +879,9 @@ static ivas_error configureEncoder( } if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && - ( ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation - ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done - hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD - ) ) + ( ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation + ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || + hEncoderConfig->ivas_format == MC_FORMAT ) ) { return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); } -- GitLab From d55dc76f9b5c99c68d5e624cae791514dfd612ae Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 10 May 2023 17:15:03 +0200 Subject: [PATCH 036/381] revision of ToDo comments --- apps/encoder.c | 2 +- apps/renderer.c | 2 +- lib_com/bitstream.c | 3 --- lib_com/ivas_cnst.h | 6 +++--- lib_com/ivas_pca_tools.c | 2 +- lib_dec/ivas_dec.c | 1 - lib_dec/ivas_ism_dtx_dec.c | 2 +- lib_dec/ivas_pca_dec.c | 4 ++-- lib_dec/ivas_spar_md_dec.c | 4 ++-- lib_enc/init_enc.c | 2 +- lib_enc/ivas_front_vad.c | 4 ++-- lib_enc/ivas_ism_enc.c | 9 ++------- lib_enc/ivas_masa_enc.c | 2 +- lib_enc/ivas_spar_encoder.c | 3 +-- 14 files changed, 18 insertions(+), 28 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 7f6d6baa30..25a8b73107 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -1476,7 +1476,7 @@ static bool parseCmdlIVAS_enc( arg->inputFormatConfig.stereoToMonoDownmix = true; i++; } - else if ( strcmp( argv_to_upper, "-BYPASS" ) == 0 ) // VE: should be renamed to "-pca" + else if ( strcmp( argv_to_upper, "-BYPASS" ) == 0 ) // TODO: should be renamed to "-pca" { i++; if ( i < argc - 4 ) diff --git a/apps/renderer.c b/apps/renderer.c index 9045bbeaa0..24b5773493 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -965,7 +965,7 @@ int main( else { error = IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ); - if ( ( error != IVAS_ERR_OK ) && ( error != IVAS_ERR_INVALID_OUTPUT_FORMAT ) ) // VE: TBC + if ( error != IVAS_ERR_OK && error != IVAS_ERR_INVALID_OUTPUT_FORMAT ) { fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); exit( -1 ); diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 886509b5ac..1aae7c97ed 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -1839,9 +1839,6 @@ ivas_error preview_indices( break; case SID_ISM: st_ivas->ivas_format = ISM_FORMAT; - /* temporary hack to make mode signaling work with the current 1-object ISM DTX: read padding bits */ - /* Todo: how to apply this here? maybe pt_stream += ... would work? */ - /* st->bit_stream += ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; */ break; case SID_MULTICHANNEL: st_ivas->ivas_format = MC_FORMAT; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index c840fd3a83..8df7247021 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -865,7 +865,7 @@ typedef enum { /*----------------------------------------------------------------------------------* * General Parametric Coding Constants *----------------------------------------------------------------------------------*/ -// VE: this should be renamed to e.g. N_SPATIAL_SUBFRAMES + #define MAX_PARAM_SPATIAL_SUBFRAMES 4 /* Maximum number of subframes for parameteric spatial coding */ #define L_SPATIAL_SUBFR_48k (L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES) #ifdef FIX_355_REFACTOR_PARAMBIN_TO_5MS @@ -893,7 +893,7 @@ typedef enum { SBA_MODE_NONE, SBA_MODE_DIRAC, - SBA_MODE_SPAR, // VE: this is actually SBA_MODE_SPAR_DIRAC + SBA_MODE_SPAR, } SBA_MODE; @@ -1024,7 +1024,7 @@ typedef enum #define IVAS_SPAR_BR_TABLE_LEN 20 -/* TD decorr */ // VE: not all 16CH are currently supported -> t be revisited later +/* TD decorr */ // ToDo: not all 16CH are currently supported -> to be revisited later enum { IVAS_TD_DECORR_OUT_1CH = 1, diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 63285dabb1..40322727af 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -645,7 +645,7 @@ static void norm_quat( norm_q = dotp( q, q, IVAS_PCA_INTERP ); - norm_q = inv_sqrt( norm_q ); // VE: TBV: possible division by 0 + norm_q = inv_sqrt( norm_q ); // TBV: possible division by 0 for ( i = 0; i < IVAS_PCA_INTERP; i++ ) { diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 68ce3c75fe..c12cbb7c6c 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -149,7 +149,6 @@ ivas_error ivas_dec( } else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - // VE: call ivas_ism_metadata_dec() with 'st_ivas' - TBD if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index 935db95eea..58ee829b24 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -192,7 +192,7 @@ ivas_error ivas_ism_dtx_dec( st->cng_ism_flag = 1; st->L_frame = min( st->L_frame, L_FRAME16k ); /* note: needed for switching from active frame with L_frame=640 to CNG in object with no SID */ #else - ivas_ism_preprocessing( st_ivas, ch ); // VE: after the acceptance of switches, replace the function call by its content + ivas_ism_preprocessing( st_ivas, ch ); #endif } } diff --git a/lib_dec/ivas_pca_dec.c b/lib_dec/ivas_pca_dec.c index 4444a73cee..a64e72615c 100644 --- a/lib_dec/ivas_pca_dec.c +++ b/lib_dec/ivas_pca_dec.c @@ -232,7 +232,7 @@ void ivas_pca_dec( mvr2r( &hPCA->mem_eigVec_interp[IVAS_PCA_N_SLOTS * 16], hPCA->mem_eigVec_interp, IVAS_PCA_DELAY_CMP * 16 ); - /* @@@TODO: check how ivas_total_brate is set if bfi == 1 */ // VE: and what happens in DTX where "ivas_total_brate" can be close to zero? + /* @@@TODO: check how ivas_total_brate is set if bfi == 1 */ // ToDo: and what happens in DTX where "ivas_total_brate" can be close to zero? /* handle bit rate switching */ if ( ivas_total_brate != PCA_BRATE || ( ivas_total_brate == PCA_BRATE && n_channels > FOA_CHANNELS ) ) @@ -240,7 +240,7 @@ void ivas_pca_dec( /* set PCA by-pass mode in current frame and interpolate transform as previous frame used PCA */ pca_dec_reset_dquat( ql, qr ); - // VE: todo - rather call PCA resets in the first PCA frame + // todo - rather call PCA resets in the first PCA frame if ( ( last_ivas_total_brate != PCA_BRATE ) || ( last_ivas_total_brate == PCA_BRATE && hPCA->prev_pca_bypass > 1 ) ) { diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 1552734434..51e3d4c77c 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -584,10 +584,10 @@ static ivas_error ivas_spar_set_dec_config( case 4: /* FOA_CHANNELS */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_3CH; break; - case 9: /* IVAS_HOA_2_CH */ // VE: is this relevant? + case 9: /* IVAS_HOA_2_CH */ // ToDo: is this relevant? hMdDec->num_decorr = IVAS_TD_DECORR_OUT_5CH; break; - case 16: /* IVAS_HOA_3_CH */ // VE: is this relevant? + case 16: /* IVAS_HOA_3_CH */ // ToDo: is this relevant? hMdDec->num_decorr = IVAS_TD_DECORR_OUT_12CH; break; case 6: /* IVAS_HOA_2_CH */ diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 9efd3c7f16..1dd7fd88ed 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -692,7 +692,7 @@ ivas_error init_encoder( * TCX core *-----------------------------------------------------------------*/ - // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 + // ToDo: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 if ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) { if ( ( st->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL ) diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index 3810df1de9..9593f6682f 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -407,8 +407,8 @@ ivas_error front_vad_spar( mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); wsp = old_wsp + L_WSP_MEM; - st->core_brate = -1; /* updated in dtx() */ - st->input_bwidth = st->last_input_bwidth; // VE: TBD - this might be updated by actual detected BW + st->core_brate = -1; /* updated in dtx() */ + st->input_bwidth = st->last_input_bwidth; /*------------------------------------------------------------------* * compensate for SPAR filterbank delay diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 4a56252be8..55f63f89ab 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -222,16 +222,11 @@ ivas_error ivas_ism_enc( } else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - // VE: call ivas_ism_metadata_enc() with 'st_ivas' - TBD - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, - nchan_ism, - st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); } else /* ISM_MODE_DISC */ { - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, - nchan_ism, - st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); } update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 5b5363efb3..c582a91c19 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -2023,7 +2023,7 @@ static uint8_t are_masa_subframes_similar( } } - /* TODO: a nicer negation */ // VE: ?? + /* TODO: a nicer negation */ if ( sf_differ ) { return FALSE; diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index b13bb4f20d..894c10a1d0 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -316,7 +316,7 @@ ivas_error ivas_spar_enc( error = IVAS_ERR_OK; hEncoderConfig = st_ivas->hEncoderConfig; - // VE2DB: can hFbMixer->ppFilterbank_prior_input be replaced by st->input ? + // ToDo: can hFbMixer->ppFilterbank_prior_input be replaced by st->input ? /* check last sba_mode */ if ( ivas_sba_mode_select() == SBA_MODE_DIRAC ) @@ -339,7 +339,6 @@ ivas_error ivas_spar_enc( } /* update FB prior input */ - // VE: last 1ms of 'ppFilterbank_prior_input' is not correct for ( int16_t i = 0; i < st_ivas->nchan_transport; i++ ) { mvr2r( ( sts[i]->input_buff + NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ) ), -- GitLab From 3efd772543b198a565b10d1bfe416a62019def10 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 10 May 2023 17:50:51 +0200 Subject: [PATCH 037/381] revision of ToDo comments --- lib_com/bits_alloc.c | 4 ++-- lib_com/gs_bitallocation.c | 2 +- lib_com/ivas_cnst.h | 4 ++-- lib_com/ivas_pca_tools.c | 2 +- lib_dec/acelp_core_dec.c | 4 ++-- lib_dec/core_switching_dec.c | 2 +- lib_dec/dec_tcx.c | 4 ++-- lib_dec/gs_dec.c | 3 +-- lib_dec/ivas_binRenderer_internal.c | 2 +- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_stereo_icbwe_dec.c | 2 +- lib_dec/swb_bwe_dec.c | 6 +++--- lib_dec/swb_tbe_dec.c | 1 - lib_enc/core_switching_enc.c | 2 +- lib_enc/fd_cng_enc.c | 12 ++++++------ lib_enc/ivas_cpe_enc.c | 2 +- lib_rend/lib_rend.h | 2 +- lib_util/ism_file_writer.c | 1 - 18 files changed, 27 insertions(+), 30 deletions(-) diff --git a/lib_com/bits_alloc.c b/lib_com/bits_alloc.c index 5ae9cb84d0..56e523b392 100644 --- a/lib_com/bits_alloc.c +++ b/lib_com/bits_alloc.c @@ -737,7 +737,7 @@ ivas_error config_acelp1( } else /* L_frame == L_FRAME16k */ { - acelp_cfg->lsf_bits = 41; /* TBV: currently LSFQ @16kHz is not flexible (only 31/41 bits supported */ + acelp_cfg->lsf_bits = 41; } } @@ -1360,7 +1360,7 @@ ivas_error config_acelp1( acelp_cfg->ubits = acelp_cfg->lsf_bits - 46; acelp_cfg->lsf_bits = 46; } - else if ( acelp_cfg->lsf_bits > 42 && L_frame == L_FRAME ) /* TBV: verify maximum supported LSF Q bitbudget (for some reason 43 bits LSFQ decreases segSNR by 0.7 dB) */ + else if ( acelp_cfg->lsf_bits > 42 && L_frame == L_FRAME ) { acelp_cfg->ubits = acelp_cfg->lsf_bits - 42; acelp_cfg->lsf_bits = 42; diff --git a/lib_com/gs_bitallocation.c b/lib_com/gs_bitallocation.c index 7f7809428f..1e86ea04de 100644 --- a/lib_com/gs_bitallocation.c +++ b/lib_com/gs_bitallocation.c @@ -616,7 +616,7 @@ void bands_and_bit_alloc( * Complete the bit allocation per frequency band for 16kHz high brate mode *--------------------------------------------------------------------------*/ - if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) /* TBV if applicable */ + if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) /* TODO - TBV if applicable */ { for ( j = st_band; j < nb_bands; j++ ) { diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 8df7247021..650f30c929 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -110,8 +110,8 @@ typedef enum AUDIO_CONFIG_ISM2, /* ISM2 */ AUDIO_CONFIG_ISM3, /* ISM3 */ AUDIO_CONFIG_ISM4, /* ISM4 */ - AUDIO_CONFIG_MASA1, /* MASA1 */ // TBV: seems not to be used - AUDIO_CONFIG_MASA2, /* MASA2 */ // TBV: seems not to be used + AUDIO_CONFIG_MASA1, /* MASA1 */ // TODO: seems not to be used + AUDIO_CONFIG_MASA2, /* MASA2 */ // TODO: seems not to be used AUDIO_CONFIG_EXTERNAL /* external renderer */ } AUDIO_CONFIG; diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 40322727af..a1f8efd629 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -645,7 +645,7 @@ static void norm_quat( norm_q = dotp( q, q, IVAS_PCA_INTERP ); - norm_q = inv_sqrt( norm_q ); // TBV: possible division by 0 + norm_q = inv_sqrt( norm_q ); // TODO: possible division by 0 for ( i = 0; i < IVAS_PCA_INTERP; i++ ) { diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index f7b7465028..b31c50e66b 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -627,7 +627,7 @@ ivas_error acelp_core_dec( config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); - if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME ) /* ISfm: why is this called again after above */ + if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME ) { config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); } @@ -1090,7 +1090,7 @@ ivas_error acelp_core_dec( * Formant post-filter *-----------------------------------------------------------------*/ - if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) /* VE2TV: TBV for TD stereo */ + if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) /* TODO: TBV for TD stereo */ { mvr2r( syn, temp_buf + L_SYN_MEM, L_FRAME16k ); diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index 9ae8550e40..552f0ff988 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -374,7 +374,7 @@ ivas_error core_switching_pre_dec( st->gc_threshold = 0.0f; set_f( st->dispMem, 0, 8 ); - st->last_coder_type = GENERIC; /* fcs : this might be superfluous */ + st->last_coder_type = GENERIC; /* TODO - fcs : this might be superfluous */ fer_energy( output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 ); st->lp_gainp = 0.0f; diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c index 9896d1d8c0..8a574c95f6 100644 --- a/lib_dec/dec_tcx.c +++ b/lib_dec/dec_tcx.c @@ -1507,7 +1507,7 @@ void decoder_tcx_tns( if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly && isTCX5 ) { - if ( st->element_mode == EVS_MONO || L_spec < L_frameTCX ) /* TBC: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ + if ( st->element_mode == EVS_MONO || L_spec < L_frameTCX ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ { tcx5TnsUngrouping( L_frameTCX >> 1, hTcxCfg->tnsConfig[0][0].iFilterBorders[0] >> 1, x, DEC ); } @@ -1742,7 +1742,7 @@ void decoder_tcx_imdct( if ( st->element_mode > EVS_MONO ) { - st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; /* TBV - or maybe used min(L_frame_TCX,L_FRAME48k) ... */ + st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; /* TODO - or maybe used min(L_frame_TCX,L_FRAME48k) ... */ } else { diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c index 2e7fb267ab..ff684b47d3 100644 --- a/lib_dec/gs_dec.c +++ b/lib_dec/gs_dec.c @@ -541,8 +541,7 @@ void gsc_dec( i++; } - if ( st->element_mode > EVS_MONO && coder_type == AUDIO && - st->core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ + if ( st->element_mode > EVS_MONO && coder_type == AUDIO && st->core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation is mapped to 8 kb/s instead of 9.6 kb/s in this case */ { i--; } diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 63372cd5ba..bf28c314cc 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -446,7 +446,7 @@ static void ivas_binaural_obtain_DMX( { int16_t chIdx, bandIdx, k; - // ToDo: hBinRenderer->ivas_format is never set to ISM_FORMAT -> TBV + // ToDo: hBinRenderer->ivas_format is never set to ISM_FORMAT if ( hBinRenderer->ivas_format == MC_FORMAT || hBinRenderer->ivas_format == ISM_FORMAT ) { /* Obtain the downmix */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index a58220a9b7..45dff5da5d 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -459,7 +459,7 @@ static ivas_error ivas_read_format( int16_t tc_mode_offset; tc_mode_offset = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); idx = st_ivas->bit_stream[tc_mode_offset]; - // TBD: needs more work for HOA + // TODO: needs more work for HOA if ( st_ivas->sba_analysis_order == 0 ) { st_ivas->sba_analysis_order = SBA_FOA_ORDER; diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index 78196eaaa8..13722f2b2a 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -739,7 +739,7 @@ void stereo_icBWE_decproc( { if ( hCPE->element_mode == IVAS_CPE_TD ) { - /* QC: TBV */ + /* QC: TODO - TBV */ v_add( output[0], hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); v_add( output[1], hStereoICBWE->memOutHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); } diff --git a/lib_dec/swb_bwe_dec.c b/lib_dec/swb_bwe_dec.c index e7eda534ae..a89a17cca8 100644 --- a/lib_dec/swb_bwe_dec.c +++ b/lib_dec/swb_bwe_dec.c @@ -586,8 +586,8 @@ void swb_bwe_dec( if ( st->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft ) { - /* TBD - wtda() does not support L_FRAME length; thus temporarily resample the signal */ - /* TBV - delay output[] by 1.25ms ? */ + /* todo - wtda() does not support L_FRAME length; thus temporarily resample the signal */ + /* todo - delay output[] by 1.25ms ? */ lerp( output, ysynth, L_FRAME16k, st->L_frame ); /* windowing of the ACELP core synthesis */ @@ -734,7 +734,7 @@ void swb_bwe_dec( } else if ( frica_flag == 1 && hBWE_FD->prev_frica_flag == 0 ) { - /* IVAS_fmToDo: TBD - synth[] is @internal_Fs!!! */ + /* IVAS_fmToDo: synth[] is @internal_Fs!!! */ time_reduce_pre_echo( synth, hb_synth, hBWE_FD->prev_td_energy, l_subfr ); } else diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 79fe3b0e68..7ca3b64990 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -577,7 +577,6 @@ void swb_tbe_dec( set_f( GainShape, hBWE_TD->prev_GainShape, NUM_SHB_SUBFR ); } - /* this never happens */ mvr2r( hBWE_TD->lsp_prevfrm, lsf_shb, LPC_SHB_ORDER ); set_f( shb_res_gshape, 0.2f, NB_SUBFR16k ); } diff --git a/lib_enc/core_switching_enc.c b/lib_enc/core_switching_enc.c index ad52e197b9..2b16b49d46 100644 --- a/lib_enc/core_switching_enc.c +++ b/lib_enc/core_switching_enc.c @@ -258,7 +258,7 @@ void core_switching_pre_enc( /* reset BWE memories */ if ( st->hBWE_TD != NULL ) { - set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TBV: this might not be needed */ + set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TODO - TBV: this might not be needed */ } } diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index d71c24d45c..d7780d388c 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -1252,7 +1252,7 @@ void FdCngEncodeDiracMDCTStereoSID( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { E[ch] = 0.0f; - for ( p = 0; p < NPART; p++ ) /* TBD Note: NPART should likely be N[ch] if N[ch] may change */ + for ( p = 0; p < NPART; p++ ) /* TODO Note: NPART should likely be N[ch] if N[ch] may change */ { ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON ); E[ch] += ms_ptr[ch][p]; @@ -1260,9 +1260,9 @@ void FdCngEncodeDiracMDCTStereoSID( } /* M/S transform on log envelopes */ - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ - E[0] = sum_f( ms_ptr[0], NPART ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ + E[0] = sum_f( ms_ptr[0], NPART ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ /* Quantize M noise shape */ @@ -1298,7 +1298,7 @@ void FdCngEncodeDiracMDCTStereoSID( set_zero( ms_ptr[1], NPART ); /* compute M gain */ - gain[0] = sum_f( ms_ptr[0], NPART ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ + gain[0] = sum_f( ms_ptr[0], NPART ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ gain[0] = ( E[0] - gain[0] ) / (float) N[0]; apply_scale( &gain[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); @@ -1310,7 +1310,7 @@ void FdCngEncodeDiracMDCTStereoSID( gain[1] = gain[0]; /* undo M/S */ - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ /* restore channel noise envelopes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1318,7 +1318,7 @@ void FdCngEncodeDiracMDCTStereoSID( HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc; HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; - for ( p = 0; p < NPART; p++ ) /* TBD Note: NPART should likely be N[0] if N[0] may change */ + for ( p = 0; p < NPART; p++ ) /* TODO Note: NPART should likely be N[0] if N[0] may change */ { lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); } diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index b60f8be45b..cff9de4615 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -274,7 +274,7 @@ ivas_error ivas_cpe_enc( } else { - /* note; "bits_frame_nominal" needed in TD stereo as well */ /* IVAS_fmToDo: is "bits_frame_nominal" set optimaly in TD stereo? */ + /* note; "bits_frame_nominal" needed in TD stereo as well */ stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } } diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 1e9d41fd38..2089af8315 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -143,7 +143,7 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for renderer output */ ); -/* Support for custom HRTFs will be added in the future. */ +/* ToDo: Support for custom HRTFs will be added in the future. */ /* Note: this affects output delay */ ivas_error IVAS_REND_SetCustomHrtf( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c index b29386282b..5896a38aae 100644 --- a/lib_util/ism_file_writer.c +++ b/lib_util/ism_file_writer.c @@ -113,7 +113,6 @@ ivas_error IsmFileWriter_writeFrame( file = ismWriter->file; - /* IVAS_fmToDo: work in progress; currently position_azimuth, position_elevation, position_radius, spread, gain_factor */ #ifdef FIX_293_EXT_RENDERER_CLI sprintf( char_buff, "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch ); #endif -- GitLab From e628c75da32611147124e298e7e4e7af873cd456 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 11 May 2023 10:16:15 +0200 Subject: [PATCH 038/381] Refactoring of binaural output configuration (cont.) --- apps/renderer.c | 3 + lib_rend/ivas_crend.c | 2 +- lib_rend/lib_rend.c | 2 +- scripts/config/self_test.prm | 48 ++++++------ scripts/testv/just_reverb.cfg | 2 - tests/renderer/constants.py | 142 +++++++++++++++++----------------- 6 files changed, 100 insertions(+), 99 deletions(-) delete mode 100644 scripts/testv/just_reverb.cfg diff --git a/apps/renderer.c b/apps/renderer.c index 8ad33bea61..386b24a6e2 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1534,6 +1534,9 @@ static IVAS_REND_AudioConfig parseAudioConfig( return IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR; } if ( strcmp( charBuf, "BINAURAL_HRIR_REVERB" ) == 0 ) + { + return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB; + } #else if ( strcmp( charBuf, "BINAURAL_ROOM" ) == 0 ) { diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 72ec04ca32..4e217f888e 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -183,7 +183,7 @@ static ivas_error ivas_rend_initCrend( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index ba9301b92c..1fe410fe40 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1135,7 +1135,7 @@ static ivas_error setRendInputActiveIsm( error = IVAS_ERR_OK; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) #endif diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index d23bbc4c93..25ded8deda 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -266,7 +266,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL_HRIR 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst -// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out +// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out ../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit ../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst @@ -310,7 +310,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out, random FEC at 5% +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out, random FEC at 5% ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL_BRIR 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst @@ -318,7 +318,7 @@ ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst -// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_HRIR ROOM out, random FEC at 5% +// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_BRIR out, random FEC at 5% ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit ../IVAS_dec -fec 5 BINAURAL_BRIR 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst @@ -326,11 +326,11 @@ ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out, head rotation, random FEC at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out, head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit ../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out +// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL_BRIR 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst @@ -338,7 +338,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst -// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR ROOM out +// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit ../IVAS_dec BINAURAL_BRIR 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst @@ -496,27 +496,27 @@ ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_stereo.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation, Orientation tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation, reference vector tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation, reference vector tracking in level mode +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst @@ -572,11 +572,11 @@ ../IVAS_cod -sba 1 96000 48 testv/stvFOA48c.wav bit ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_SBA_96000_48-48_FOA.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR ROOM out, Headrotation, Orientation tracking +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst @@ -658,15 +658,15 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 16400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -fec 5 HOA3 48 bit testv/stv1MASA1TC48c.wav_16400_48-48_HOA3_FEC5.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, Headrotation +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, Headrotation ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst @@ -706,15 +706,15 @@ ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 24400 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv1MASA2TC48c.wav_24400_48-48_STEREO.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, Headrotation +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, Headrotation ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, Headrotation, Orientation tracking +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, Headrotation, Orientation tracking ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst @@ -824,7 +824,7 @@ ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst @@ -844,7 +844,7 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_stereo_FEC5.tst -// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out +// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out ../IVAS_cod -mc 5_1 192000 48 testv/stv51MC48c.wav bit ../IVAS_dec BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst @@ -852,11 +852,11 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec MONO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_mono.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, head rotation +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, head rotation ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR ROOM out, head rotation, Orientation tracking +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, head rotation, Orientation tracking ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst diff --git a/scripts/testv/just_reverb.cfg b/scripts/testv/just_reverb.cfg deleted file mode 100644 index 28acb76dc6..0000000000 --- a/scripts/testv/just_reverb.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[roomAcoustics] -reverb = true; # Reverb switch, in case BRIR is undefined or false, reverb flag is inherited from the room flag diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py index 60208150fe..c9c77b30ee 100644 --- a/tests/renderer/constants.py +++ b/tests/renderer/constants.py @@ -187,7 +187,7 @@ METADATA_SCENES_TO_TEST = ["mixed_scene", "mixed_scene_simple"] METADATA_SCENES_TO_TEST_NO_BE = ["masa_scene"] """ Binaural rendering """ -OUTPUT_FORMATS_BINAURAL = ["BINAURAL", "BINAURAL_ROOM"] +OUTPUT_FORMATS_BINAURAL = ["BINAURAL_HRIR", "BINAURAL_BRIR", "BINAURAL_HRIR_REVERB"] HR_TRAJECTORIES_TO_TEST = [ "full_circle_in_15s", "rotate_yaw_pitch_roll1", @@ -218,21 +218,21 @@ _pass_snr = { "test_ambisonics[HOA3-7_1]": 25, "test_ambisonics[HOA3-7_1_4]": 30, # TODO needs debugging - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL-full_circle_in_15s]": 18, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL-full_circle_in_15s]": 15, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_HRIR-full_circle_in_15s]": 18, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_HRIR-full_circle_in_15s]": 15, # Failure reason: Crend unit test does not support intermediate conversion to 7_1_4 or SHD BRIRs # Comparison with pyaudio3dtools results in bad SNR - "test_ambisonics_binaural_headrotation[FOA-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[FOA-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL-rotate_yaw_pitch_roll1]": 4, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL-rotate_yaw_pitch_roll1]": 3, - "test_ambisonics_binaural_static[FOA-BINAURAL_ROOM]": 0, - "test_ambisonics_binaural_static[HOA2-BINAURAL_ROOM]": 0, - "test_ambisonics_binaural_static[HOA3-BINAURAL_ROOM]": 0, + "test_ambisonics_binaural_headrotation[FOA-BINAURAL_BRIR-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[FOA-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_BRIR-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 4, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_BRIR-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 3, + "test_ambisonics_binaural_static[FOA-BINAURAL_BRIR]": 0, + "test_ambisonics_binaural_static[HOA2-BINAURAL_BRIR]": 0, + "test_ambisonics_binaural_static[HOA3-BINAURAL_BRIR]": 0, # Failure reason: Renderer uses getRSH() with int16_t vs float in python "test_custom_ls_input[t_design_4-FOA]": 43, "test_custom_ls_input[t_design_4-HOA2]": 39, @@ -251,47 +251,47 @@ _pass_snr = { "test_custom_ls_output[HOA3-t_design_4]": 32, # Failure reason: TD Object Renderer standalone does not support custom LS input # Comparison with pyaudio3dtools results in bad SNR - "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL]": 8, - "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL_ROOM]": 0, - "test_custom_ls_input_binaural[4d4-BINAURAL]": 6, - "test_custom_ls_input_binaural[4d4-BINAURAL_ROOM]": 0, - "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL]": 1, - "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL_ROOM]": 3, - "test_custom_ls_input_binaural[t_design_4-BINAURAL]": 5, - "test_custom_ls_input_binaural[t_design_4-BINAURAL_ROOM]": 0, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL-full_circle_in_15s]": 7, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL-rotate_yaw_pitch_roll1]": 6, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL-full_circle_in_15s]": 7, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL-rotate_yaw_pitch_roll1]": 5, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL-full_circle_in_15s]": 1, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL-rotate_yaw_pitch_roll1]": 1, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_ROOM-full_circle_in_15s]": 3, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 3, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL-full_circle_in_15s]": 4, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL-rotate_yaw_pitch_roll1]": 4, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL_HRIR]": 8, + "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL_BRIR]": 0, + "test_custom_ls_input_binaural[4d4-BINAURAL_HRIR]": 6, + "test_custom_ls_input_binaural[4d4-BINAURAL_BRIR]": 0, + "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL_HRIR]": 1, + "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL_BRIR]": 3, + "test_custom_ls_input_binaural[t_design_4-BINAURAL_HRIR]": 5, + "test_custom_ls_input_binaural[t_design_4-BINAURAL_BRIR]": 0, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_HRIR-full_circle_in_15s]": 7, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 6, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_BRIR-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_HRIR-full_circle_in_15s]": 7, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 5, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_BRIR-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_HRIR-full_circle_in_15s]": 1, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 1, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_BRIR-full_circle_in_15s]": 3, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 3, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_HRIR-full_circle_in_15s]": 4, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 4, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_BRIR-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, # TODO needs debugging - "test_ism_binaural_headrotation[ISM2-BINAURAL-rotate_yaw_pitch_roll1]": 34, - "test_ism_binaural_headrotation[ISM3-BINAURAL-rotate_yaw_pitch_roll1]": 34, - "test_ism_binaural_headrotation[ISM4-BINAURAL-rotate_yaw_pitch_roll1]": 33, + "test_ism_binaural_headrotation[ISM2-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 34, + "test_ism_binaural_headrotation[ISM3-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 34, + "test_ism_binaural_headrotation[ISM4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 33, # Failure reason: Crend unit test does not support intermediate conversion to 7_1_4 - "test_ism_binaural_headrotation[ISM1-BINAURAL_ROOM-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_headrotation[ISM2-BINAURAL_ROOM-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 3, - "test_ism_binaural_headrotation[ISM3-BINAURAL_ROOM-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM3-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_headrotation[ISM4-BINAURAL_ROOM-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_static[ISM1-BINAURAL_ROOM]": 23, - "test_ism_binaural_static[ISM2-BINAURAL_ROOM]": 21, - "test_ism_binaural_static[ISM3-BINAURAL_ROOM]": 21, - "test_ism_binaural_static[ISM4-BINAURAL_ROOM]": 21, + "test_ism_binaural_headrotation[ISM1-BINAURAL_BRIR-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM1-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_headrotation[ISM2-BINAURAL_BRIR-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM2-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 3, + "test_ism_binaural_headrotation[ISM3-BINAURAL_BRIR-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM3-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_headrotation[ISM4-BINAURAL_BRIR-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_static[ISM1-BINAURAL_BRIR]": 23, + "test_ism_binaural_static[ISM2-BINAURAL_BRIR]": 21, + "test_ism_binaural_static[ISM3-BINAURAL_BRIR]": 21, + "test_ism_binaural_static[ISM4-BINAURAL_BRIR]": 21, # Failure Reason: Tangent law panning missing in python scripts "test_ism[ISM1-STEREO]": 8, "test_ism[ISM2-STEREO]": 13, @@ -332,25 +332,25 @@ _pass_snr = { "test_ism[ISM4-HOA3]": 40, # TODO delay alignment of LFE in binaural output # Failure reason: bitexact except for delay alignment of LFE signal (Issue 59) - "test_multichannel_binaural_headrotation[5_1-BINAURAL-full_circle_in_15s]": 7, - "test_multichannel_binaural_headrotation[5_1-BINAURAL-rotate_yaw_pitch_roll1]": 6, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL-full_circle_in_15s]": 9, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL-rotate_yaw_pitch_roll1]": 1, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL-full_circle_in_15s]": 10, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL-rotate_yaw_pitch_roll1]": 1, - "test_multichannel_binaural_headrotation[7_1-BINAURAL-full_circle_in_15s]": 8, - "test_multichannel_binaural_headrotation[7_1-BINAURAL-rotate_yaw_pitch_roll1]": 8, - "test_multichannel_binaural_headrotation[7_1_4-BINAURAL-full_circle_in_15s]": 8, - "test_multichannel_binaural_headrotation[7_1_4-BINAURAL-rotate_yaw_pitch_roll1]": 1, + "test_multichannel_binaural_headrotation[5_1-BINAURAL_HRIR-full_circle_in_15s]": 7, + "test_multichannel_binaural_headrotation[5_1-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 6, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_HRIR-full_circle_in_15s]": 9, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 1, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_HRIR-full_circle_in_15s]": 10, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 1, + "test_multichannel_binaural_headrotation[7_1-BINAURAL_HRIR-full_circle_in_15s]": 8, + "test_multichannel_binaural_headrotation[7_1-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 8, + "test_multichannel_binaural_headrotation[7_1_4-BINAURAL_HRIR-full_circle_in_15s]": 8, + "test_multichannel_binaural_headrotation[7_1_4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 1, # Failure reason: differences in LFE alignment and possibly rotation - "test_multichannel_binaural_headrotation[5_1-BINAURAL_ROOM-full_circle_in_15s]": 14, - "test_multichannel_binaural_headrotation[5_1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 12, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_ROOM-full_circle_in_15s]": 8, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_ROOM-full_circle_in_15s]": 6, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 6, - "test_multichannel_binaural_headrotation[7_1-BINAURAL_ROOM-full_circle_in_15s]": 11, - "test_multichannel_binaural_headrotation[7_1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 9, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 6, + "test_multichannel_binaural_headrotation[5_1-BINAURAL_BRIR-full_circle_in_15s]": 14, + "test_multichannel_binaural_headrotation[5_1-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 12, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_BRIR-full_circle_in_15s]": 8, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_BRIR-full_circle_in_15s]": 6, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 6, + "test_multichannel_binaural_headrotation[7_1-BINAURAL_BRIR-full_circle_in_15s]": 11, + "test_multichannel_binaural_headrotation[7_1-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 9, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 6, # Failure reason: mixed format, see above "test_metadata[mixed_scene-5_1]": 47, "test_metadata[mixed_scene-5_1_2]": 47, -- GitLab From 32b5b982ddfe1ebc9913d14b0e93be548cd5d4e4 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 11 May 2023 16:47:53 +0200 Subject: [PATCH 039/381] Fix for assignment in renderer initialization from ROM --- lib_rend/ivas_render_config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index b55843b687..416e8e8c38 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -117,8 +117,13 @@ ivas_error ivas_render_config_init_from_rom( ( *hRenderConfig )->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE; #endif ( *hRenderConfig )->roomAcoustics.override = FALSE; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG ( *hRenderConfig )->roomAcoustics.use_brir = output_config == AUDIO_CONFIG_BINAURAL_BRIR ? TRUE : FALSE; ( *hRenderConfig )->roomAcoustics.late_reverb_on = output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ? TRUE : FALSE; +#else + ( *hRenderConfig )->roomAcoustics.use_brir = room_flag_on; + ( *hRenderConfig )->roomAcoustics.late_reverb_on = room_flag_on; +#endif ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_PRE_DELAY; ( *hRenderConfig )->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_INPUT_DELAY; -- GitLab From b701392c717554e8f259625308853dd7d74bdc99 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 12 May 2023 17:09:50 +0200 Subject: [PATCH 040/381] [wip] groundwork for issue 296 --- apps/renderer.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++ lib_com/options.h | 2 ++ 2 files changed, 89 insertions(+) diff --git a/apps/renderer.c b/apps/renderer.c index 9045bbeaa0..5128e3629c 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1624,8 +1624,13 @@ static CmdlnArgs defaultArgs( args.lfePanningEnabled = false; args.lfeConfigGain = 1.0f; +#ifdef FIX_296_CFG_LFE_SCENE_DESC + args.lfeConfigAzimuth = 0.f; + args.lfeConfigElevation = 0.f; +#else args.lfeConfigAzimuth = 0; args.lfeConfigElevation = 0; +#endif args.lfeCustomRoutingEnabled = false; clearString( args.inLfePanningMatrixFile ); @@ -2090,6 +2095,12 @@ static int8_t parseInt32( static void parseOptionalInputValues( char *line, +#ifdef FIX_296_CFG_LFE_SCENE_DESC + float *lfe_gain_dB, + float *lfe_pos_azi, + float *lfe_pos_ele, + char *lfe_pan_mtx_filename, +#endif float *gain_dB ) { char *parse_pos; @@ -2101,6 +2112,24 @@ static void parseOptionalInputValues( /* Set default values, in case some values are not specified */ *gain_dB = 0.f; +#ifdef FIX_296_CFG_LFE_SCENE_DESC + if ( lfe_gain_dB != NULL ) + { + *lfe_gain_dB = 0.f; + } + if ( lfe_pos_azi != NULL ) + { + *lfe_pos_azi = 0.f; + } + if ( lfe_pos_ele != NULL ) + { + *lfe_pos_ele = 0.f; + } + if ( lfe_pan_mtx_filename != NULL ) + { + *lfe_pan_mtx_filename = '\0'; + } +#endif /* Save parsing position - will have to be passed to strtok to resume parsing after using strtok with non-NULL value below */ parse_pos = readNextMetadataChunk( line, "\n" ); @@ -2117,10 +2146,50 @@ static void parseOptionalInputValues( if ( *endptr != '\0' ) { +#ifdef FIX_296_CFG_LFE_SCENE_DESC + fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); +#else fprintf( stderr, "Cannot parse string string \"%s\" as a float value\n", value ); +#endif + exit( -1 ); + } + } +#ifdef FIX_296_CFG_LFE_SCENE_DESC + else if ( ( strcmp( key, "lfe_gain_dB" ) == 0 ) && lfe_gain_dB != NULL ) + { + *lfe_gain_dB = (float) strtod( value, &endptr ); + + if ( *endptr != '\0' ) + { + fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); + exit( -1 ); + } + } + else if ( ( strcmp( key, "lfe_azi" ) == 0 ) && lfe_pos_azi != NULL ) + { + *lfe_pos_azi = (float) strtod( value, &endptr ); + + if ( *endptr != '\0' ) + { + fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); + exit( -1 ); + } + } + else if ( ( strcmp( key, "lfe_ele" ) == 0 ) && lfe_pos_ele != NULL ) + { + *lfe_pos_ele = (float) strtod( value, &endptr ); + + if ( *endptr != '\0' ) + { + fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); exit( -1 ); } } + else if ( strcmp( key, "lfe_matrix" ) == 0 ) + { + strncpy( lfe_pan_mtx_filename, value, FILENAME_MAX - 1 ); + } +#endif else { fprintf( stderr, "Unsupported optional key: %s\n", key ); @@ -2204,7 +2273,11 @@ static void parseIsm( } /* Read optional values */ +#ifdef FIX_296_CFG_LFE_SCENE_DESC + parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->audioObjects[idx].gain_dB ); +#else parseOptionalInputValues( line, &inConfig->audioObjects[idx].gain_dB ); +#endif return; } @@ -2225,7 +2298,11 @@ static void parseSba( inConfig->ambisonicsBuses[idx].audioConfig = ambisonicsOrderToEnum( ambiOrder ); /* Read optional values */ +#ifdef FIX_296_CFG_LFE_SCENE_DESC + parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->ambisonicsBuses[idx].gain_dB ); +#else parseOptionalInputValues( line, &inConfig->ambisonicsBuses[idx].gain_dB ); +#endif return; } @@ -2251,7 +2328,13 @@ static void parseMc( } /* Read optional values */ +#ifdef FIX_296_CFG_LFE_SCENE_DESC + float lg, la, le; + char tmpfile[FILENAME_MAX]; + parseOptionalInputValues( line, &lg, &la, &le, tmpfile, &inConfig->multiChannelBuses[idx].gain_dB ); +#else parseOptionalInputValues( line, &inConfig->multiChannelBuses[idx].gain_dB ); +#endif return; } @@ -2292,7 +2375,11 @@ static void parseMasa( } /* Read optional values */ +#ifdef FIX_296_CFG_LFE_SCENE_DESC + parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->masaBuses[idx].gain_dB ); +#else parseOptionalInputValues( line, &inConfig->masaBuses[idx].gain_dB ); +#endif return; } diff --git a/lib_com/options.h b/lib_com/options.h index dfe0f53d07..9401787863 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -213,6 +213,8 @@ //#define HODIRAC_READ_PARAMS #endif +#define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 10e3b1235dba3b2fed7716b47a0d419d194cd6a1 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Wed, 17 May 2023 12:13:24 +0530 Subject: [PATCH 041/381] Modified ivas_dirac_enc() [x] Moved the DiRAC encoding functions from ivas_spar_enc_process() --- lib_com/ivas_prot.h | 12 ++++ lib_enc/ivas_dirac_enc.c | 119 +++++++++++++++++++++++++++++++++++- lib_enc/ivas_spar_encoder.c | 18 +++--- 3 files changed, 137 insertions(+), 12 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 19b6f515fe..96a6302aaa 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3339,6 +3339,18 @@ void ivas_dirac_enc( const int16_t input_frame, /* i : input frame length */ const int16_t sba_planar /* i : SBA planar flag */ ); +#else +void ivas_dirac_enc( + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: SBA channels */ + float **ppIn_FR_real, /* o : real freq domain values */ + float **ppIn_FR_imag, /* o : imag freq domain values */ + const int16_t input_frame, /* i : input frame length */ + const int16_t dtx_vad, /* i : DTX vad flag */ + const IVAS_FORMAT ivas_format /* i : ivas format */ +); #endif ivas_error ivas_dirac_config( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 35d3062126..6af189eddb 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -542,6 +542,119 @@ void ivas_dirac_enc_spar_delay_synchro( return; } +#else +/*------------------------------------------------------------------------- + * ivas_dirac_enc() + * + * DirAC Encoder + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_enc( + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: SBA channels */ + float **ppIn_FR_real, /* o : real freq domain values */ + float **ppIn_FR_imag, /* o : imag freq domain values */ + const int16_t input_frame, /* i : input frame length */ + const int16_t dtx_vad, /* i : DTX vad flag */ + const IVAS_FORMAT ivas_format ) /* i : ivas format */ +{ + int16_t orig_dirac_bands; + float dir[3], avg_dir[3]; + float energySum, vecLen; + int16_t i, j, b, i_ts; + push_wmops( "ivas_dirac_enc" ); + + ivas_dirac_param_est_enc( hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, ivas_format ); + + + if ( hQMetaData->q_direction->cfg.nbands > 0 ) + { + orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; + + if ( dtx_vad == 1 ) + { + /* WB 4TC mode bit : disable for now*/ + push_next_indice( hMetaData, 0, 1 ); + ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); + } + else + { + hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; + + /* compute directions */ + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + set_zero( dir, 3 ); + set_zero( avg_dir, 3 ); + energySum = 0.0f; + + /* combine all DirAC bands except the last one, handle last band separately, last band covers BW above WB */ + for ( j = 0; j < orig_dirac_bands - 1; j++ ) + { + ivas_qmetadata_azimuth_elevation_to_direction_vector( hQMetaData->q_direction[0].band_data[j].azimuth[i], hQMetaData->q_direction[0].band_data[j].elevation[i], &dir[0] ); + vecLen = hQMetaData->q_direction[0].band_data[j].energy_ratio[i] * hDirAC->buffer_energy[i * orig_dirac_bands + j]; + + avg_dir[0] += dir[0] * vecLen; + avg_dir[1] += dir[1] * vecLen; + avg_dir[2] += dir[2] * vecLen; + + energySum += hDirAC->buffer_energy[i * orig_dirac_bands + j]; + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( &avg_dir[0], &hQMetaData->q_direction[0].band_data[0].azimuth[i], &hQMetaData->q_direction[0].band_data[0].elevation[i] ); + hQMetaData->q_direction[0].band_data[0].energy_ratio[i] = sqrtf( dotp( avg_dir, avg_dir, 3 ) ) / ( energySum + EPSILON ); + + hQMetaData->q_direction[0].band_data[1].azimuth[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i]; + hQMetaData->q_direction[0].band_data[1].elevation[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i]; + hQMetaData->q_direction[0].band_data[1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i]; + } + + /* 1 bit to indicate mode MD coding : temp solution*/ + push_next_indice( hMetaData, 1, 1 ); + + /* encode SID parameters */ + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); + } + + for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) + { + for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) + { + hQMetaData->q_direction->band_data[b].azimuth[i_ts] = hQMetaData->q_direction->band_data[b].q_azimuth[i_ts]; + hQMetaData->q_direction->band_data[b].elevation[i_ts] = hQMetaData->q_direction->band_data[b].q_elevation[i_ts]; + hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; + } + } + + if ( dtx_vad == 0 ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + } + + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = orig_dirac_bands - 2; j >= 0; j-- ) + { + hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; + hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; + } + } + + hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; + } + } + pop_wmops(); + + return; +} #endif /*------------------------------------------------------------------------- @@ -558,9 +671,9 @@ void computeReferencePower_enc( const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode /* i : SBA mode */ + const SBA_MODE sba_mode /* i : SBA mode */ #else - const IVAS_FORMAT ivas_format /* i : ivas_format */ + const IVAS_FORMAT ivas_format /* i : ivas_format */ #endif ) { @@ -623,7 +736,7 @@ void ivas_dirac_param_est_enc( float **pp_fr_imag, const int16_t input_frame, #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode + const SBA_MODE sba_mode #else const IVAS_FORMAT ivas_format #endif diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index df5cf47fb4..e1908a29d6 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -410,12 +410,17 @@ static ivas_error ivas_spar_enc_process( const int16_t *order; SPAR_ENC_HANDLE hSpar = st_ivas->hSpar; IVAS_QMETADATA_HANDLE hQMetaData = st_ivas->hQMetaData; +#ifndef SBA_MODE_CLEAN_UP int16_t ts, l_ts, orig_dirac_bands, num_del_samples; +#else + int16_t ts, l_ts, num_del_samples; +#endif float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH]; float w_del_buf[IVAS_FB_1MS_48K_SAMP]; +#ifndef SBA_MODE_CLEAN_UP float dir[3], avg_dir[3]; float energySum, vecLen; - +#endif push_wmops( "ivas_spar_enc_process" ); /*-----------------------------------------------------------------------------------------* @@ -505,12 +510,8 @@ static ivas_error ivas_spar_enc_process( * DirAC encoding *-----------------------------------------------------------------------------------------*/ #ifndef SBA_MODE_CLEAN_UP - ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode ); -#else ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, hEncoderConfig->ivas_format ); -#endif - if ( hQMetaData->q_direction->cfg.nbands > 0 ) { orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; @@ -557,11 +558,7 @@ static ivas_error ivas_spar_enc_process( push_next_indice( hMetaData, 1, 1 ); /* encode SID parameters */ -#ifndef SBA_MODE_CLEAN_UP - ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, st_ivas->sba_mode ); -#else ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); -#endif } for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) @@ -596,6 +593,9 @@ static ivas_error ivas_spar_enc_process( hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; } } +#else + ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format ); +#endif /*-----------------------------------------------------------------------------------------* * Set SPAR bitrates *-----------------------------------------------------------------------------------------*/ -- GitLab From fbd46975142e0a4e4e1c08f3dde8cb6be33a05a3 Mon Sep 17 00:00:00 2001 From: Jan Brouwer Date: Wed, 17 May 2023 13:44:22 +0200 Subject: [PATCH 042/381] support both current and new binaural output configurations to ease merging into main; after merging the old configurations can then be removed --- apps/decoder.c | 30 +- apps/renderer.c | 9 +- lib_com/ivas_cnst.h | 3 +- lib_dec/ivas_init_dec.c | 14 +- lib_dec/ivas_ism_dec.c | 12 +- lib_dec/ivas_ism_param_dec.c | 12 +- lib_dec/ivas_mct_dec.c | 3 +- lib_dec/ivas_output_config.c | 24 +- lib_dec/ivas_spar_decoder.c | 3 +- lib_dec/lib_dec.c | 14 +- lib_dec/lib_dec.h | 3 +- lib_rend/ivas_crend.c | 6 +- lib_rend/ivas_output_init.c | 6 +- lib_rend/ivas_prot_rend.h | 3 +- lib_rend/ivas_render_config.c | 9 +- lib_rend/lib_rend.c | 76 ++-- lib_rend/lib_rend.h | 11 +- lib_util/render_config_reader.c | 2 - scripts/config/self_test.prm | 368 +++++++++--------- scripts/pyivastest/constants.py | 7 +- .../rend_config_hospital_patientroom.cfg | 2 + scripts/testv/rend_config_recreation.cfg | 2 + scripts/testv/rend_config_renderer.cfg | 2 + tests/renderer/constants.py | 142 +++---- 24 files changed, 388 insertions(+), 375 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index ebc4e3ab7c..eb01cbecca 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -33,6 +33,7 @@ #include #include #include +#include "options.h" #include "lib_dec.h" #include "cmdl_tools.h" #include "audio_file_writer.h" @@ -270,7 +271,8 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && + arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -296,7 +298,8 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && + arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -320,7 +323,8 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && + arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -351,7 +355,8 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && + arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -395,7 +400,8 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && + arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -526,7 +532,8 @@ int main( /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && + arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL ) #endif @@ -816,7 +823,7 @@ static IVAS_DEC_AUDIO_CONFIG cmdline2config( { output_config = IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB; } -#else +#endif else if ( strcmp( argv_to_upper, "BINAURAL" ) == 0 ) { output_config = IVAS_DEC_OUTPUT_BINAURAL; @@ -825,11 +832,10 @@ static IVAS_DEC_AUDIO_CONFIG cmdline2config( { output_config = IVAS_DEC_OUTPUT_BINAURAL_ROOM; } -#endif - else - { - output_config = IVAS_DEC_OUTPUT_LS_CUSTOM; - } + else + { + output_config = IVAS_DEC_OUTPUT_LS_CUSTOM; + } return output_config; } diff --git a/apps/renderer.c b/apps/renderer.c index d05a007b67..ff37da957f 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -732,7 +732,8 @@ int main( /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) && + ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) #else if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) #endif @@ -1594,7 +1595,7 @@ static IVAS_REND_AudioConfig parseAudioConfig( { return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB; } -#else +#endif if ( strcmp( charBuf, "BINAURAL_ROOM" ) == 0 ) { return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM; @@ -1603,7 +1604,6 @@ static IVAS_REND_AudioConfig parseAudioConfig( { return IVAS_REND_AUDIO_CONFIG_BINAURAL; } -#endif return IVAS_REND_AUDIO_CONFIG_UNKNOWN; } @@ -2656,10 +2656,9 @@ static void printSupportedAudioConfigs() "BINAURAL_HRIR (output only)", "BINAURAL_BRIR (output only)", "BINAURAL_HRIR_REVERB (output only)", -#else +#endif "BINAURAL (output only)", "BINAURAL_ROOM (output only)", -#endif }; fprintf( stdout, "Supported audio formats:\n" ); diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 813e521cc5..f0bf87c446 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -108,10 +108,9 @@ typedef enum AUDIO_CONFIG_BINAURAL_HRIR, /* binaural with HRIR */ AUDIO_CONFIG_BINAURAL_BRIR, /* binaural with BRIR */ AUDIO_CONFIG_BINAURAL_HRIR_REVERB, /* binaural with HRIR + reverb */ -#else +#endif AUDIO_CONFIG_BINAURAL, /* binaural with HRIR */ AUDIO_CONFIG_BINAURAL_ROOM, /* binaural with HRIR and BRIR */ -#endif AUDIO_CONFIG_ISM1, /* ISM1 */ AUDIO_CONFIG_ISM2, /* ISM2 */ AUDIO_CONFIG_ISM3, /* ISM3 */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 9c3c61c98b..b923aa2288 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -651,7 +651,8 @@ ivas_error ivas_init_decoder_front( *--------------------------------------------------------------------*/ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || + st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -662,7 +663,9 @@ ivas_error ivas_init_decoder_front( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_config ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, + st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB, + st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) #endif @@ -2210,7 +2213,8 @@ static ivas_error doSanityChecks_IVAS( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( !( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || + output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB) ) #else if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif @@ -2222,9 +2226,9 @@ static ivas_error doSanityChecks_IVAS( #ifdef DEBUGGING #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG #ifdef MC_PARAMUPMIX_MODE - if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL_HRIR || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode != MC_MODE_MCT && st_ivas->mc_mode != MC_MODE_PARAMUPMIX ) ) ) ) + if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != AUDIO_CONFIG_BINAURAL && output_config != AUDIO_CONFIG_BINAURAL_HRIR ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode != MC_MODE_MCT && st_ivas->mc_mode != MC_MODE_PARAMUPMIX ) ) ) ) #else - if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL_HRIR || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) + if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != AUDIO_CONFIG_BINAURAL && output_config != AUDIO_CONFIG_BINAURAL_HRIR ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) #endif #else #ifdef MC_PARAMUPMIX_MODE diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 2bcabe0ec2..0c976cd219 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -189,7 +189,8 @@ static ivas_error ivas_ism_bitrate_switching( ivas_param_ism_dec_close( &( st_ivas->hDirAC ), st_ivas->hDecoderConfig->output_config ); #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || + st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -222,7 +223,8 @@ static ivas_error ivas_ism_bitrate_switching( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM || + st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -255,7 +257,8 @@ static ivas_error ivas_ism_bitrate_switching( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || + st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -296,7 +299,8 @@ static ivas_error ivas_ism_bitrate_switching( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM || + st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index e8821173e7..53393d751d 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -505,7 +505,8 @@ static ivas_error ivas_param_ism_rendering_init( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || + output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) #else if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif @@ -667,7 +668,8 @@ ivas_error ivas_param_ism_dec_open( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) + if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO || + output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) #else if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) #endif @@ -693,7 +695,8 @@ ivas_error ivas_param_ism_dec_open( hDirAC->spar_to_dirac_write_idx = 0; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || + output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif @@ -890,7 +893,8 @@ void ivas_param_ism_dec_close( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || + output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 089bd1aa27..19c8e697df 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1180,7 +1180,8 @@ static ivas_error ivas_mc_dec_reconfig( /* binaural renderers*/ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || + output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index c03c088317..45d854b8f4 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -77,7 +77,8 @@ void ivas_renderer_select( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || + output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -87,7 +88,8 @@ void ivas_renderer_select( if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + if ( output_config == AUDIO_CONFIG_BINAURAL || + output_config == AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -102,7 +104,7 @@ void ivas_renderer_select( else /* ISM_MODE_DISC */ { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) #else if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) #endif @@ -116,11 +118,7 @@ void ivas_renderer_select( else { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - *internal_config = AUDIO_CONFIG_BINAURAL_HRIR; -#else *internal_config = AUDIO_CONFIG_BINAURAL; -#endif } #else *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; @@ -144,7 +142,8 @@ void ivas_renderer_select( { *internal_config = output_config; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + if ( output_config == AUDIO_CONFIG_BINAURAL || + output_config == AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -160,7 +159,8 @@ void ivas_renderer_select( { *internal_config = AUDIO_CONFIG_HOA3; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + if ( output_config == AUDIO_CONFIG_BINAURAL || + output_config == AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -205,7 +205,8 @@ void ivas_renderer_select( { *internal_config = output_config; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + if ( output_config == AUDIO_CONFIG_BINAURAL || + output_config == AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -221,7 +222,8 @@ void ivas_renderer_select( { *internal_config = transport_config; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + if ( output_config == AUDIO_CONFIG_BINAURAL || + output_config == AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 620584c517..aef6d3fae7 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1891,7 +1891,8 @@ void ivas_spar_dec_upmixer( else { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM || + st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) #else if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 3e08ec7c07..71ab91ef8b 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -391,7 +391,7 @@ static AUDIO_CONFIG mapOutputFormat( { output_config = AUDIO_CONFIG_BINAURAL_HRIR_REVERB; } -#else +#endif else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL ) { output_config = AUDIO_CONFIG_BINAURAL; @@ -400,11 +400,10 @@ static AUDIO_CONFIG mapOutputFormat( { output_config = AUDIO_CONFIG_BINAURAL_ROOM; } -#endif - else - { - output_config = AUDIO_CONFIG_INVALID; - } + else + { + output_config = AUDIO_CONFIG_INVALID; + } return output_config; } @@ -2617,7 +2616,7 @@ static ivas_error get_channel_config( { strcpy( str, "Binaural: HRIR with reverb" ); } -#else +#endif else if ( config == AUDIO_CONFIG_BINAURAL ) { strcpy( str, "Binaural" ); @@ -2626,7 +2625,6 @@ static ivas_error get_channel_config( { strcpy( str, "Binaural_ROOM" ); } -#endif else if ( config == AUDIO_CONFIG_EXTERNAL ) { strcpy( str, "External renderer" ); diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 9018271ede..4c8baa8f1f 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -59,10 +59,9 @@ typedef enum _IVAS_DEC_OUTPUT_CONFIG IVAS_DEC_OUTPUT_BINAURAL_HRIR, IVAS_DEC_OUTPUT_BINAURAL_BRIR, IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB, -#else +#endif IVAS_DEC_OUTPUT_BINAURAL, IVAS_DEC_OUTPUT_BINAURAL_ROOM, -#endif IVAS_DEC_OUTPUT_EXT, IVAS_DEC_OUTPUT_UNKNOWN = 0xffff } IVAS_DEC_AUDIO_CONFIG; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 47b023af69..dd1a148f9d 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -183,7 +183,8 @@ static ivas_error ivas_rend_initCrend( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM && + outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -202,7 +203,8 @@ static ivas_error ivas_rend_initCrend( /* set BRIR flag */ use_brir = false; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) ) ) + if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || + outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) ) #else if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) ) #endif diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index cfc9e9698f..9794cf93d5 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -94,10 +94,9 @@ int16_t audioCfg2channels( case AUDIO_CONFIG_BINAURAL_HRIR: case AUDIO_CONFIG_BINAURAL_BRIR: case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else +#endif case AUDIO_CONFIG_BINAURAL: case AUDIO_CONFIG_BINAURAL_ROOM: -#endif nchan_out = 2; break; case AUDIO_CONFIG_ISM1: @@ -226,10 +225,9 @@ void ivas_output_init( case AUDIO_CONFIG_BINAURAL_HRIR: case AUDIO_CONFIG_BINAURAL_BRIR: case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else +#endif case AUDIO_CONFIG_BINAURAL: case AUDIO_CONFIG_BINAURAL_ROOM: -#endif case AUDIO_CONFIG_ISM1: case AUDIO_CONFIG_ISM2: case AUDIO_CONFIG_ISM3: diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 5da19f9461..72787ea3a3 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -941,7 +941,8 @@ void ivas_render_config_close( ivas_error ivas_render_config_init_from_rom( RENDER_CONFIG_HANDLE *hRenderConfig, /* i/o: Renderer config handle */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - const AUDIO_CONFIG output_config /* i : output audio configuration */ + const int16_t use_brir, /* i : use brir on/off flag */ + const int16_t late_reverb_on /* i : late reverb on/off flag */ #else const int16_t room_flag_on /* i : room effect on/off flag */ #endif diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index 416e8e8c38..c52d870f14 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -101,9 +101,10 @@ void ivas_render_config_close( ivas_error ivas_render_config_init_from_rom( RENDER_CONFIG_HANDLE *hRenderConfig, /* i/o: Renderer config handle */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - const AUDIO_CONFIG output_config /* i : output audio configuration */ + const int16_t use_brir, /* i : use brir on/off flag */ + const int16_t late_reverb_on /* i : late reverb on/off flag */ #else - const int16_t room_flag_on /* i : room effect on/off flag */ + const int16_t room_flag_on /* i : room effect on/off flag */ #endif ) { @@ -118,8 +119,8 @@ ivas_error ivas_render_config_init_from_rom( #endif ( *hRenderConfig )->roomAcoustics.override = FALSE; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - ( *hRenderConfig )->roomAcoustics.use_brir = output_config == AUDIO_CONFIG_BINAURAL_BRIR ? TRUE : FALSE; - ( *hRenderConfig )->roomAcoustics.late_reverb_on = output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ? TRUE : FALSE; + ( *hRenderConfig )->roomAcoustics.use_brir = use_brir; + ( *hRenderConfig )->roomAcoustics.late_reverb_on = late_reverb_on; #else ( *hRenderConfig )->roomAcoustics.use_brir = room_flag_on; ( *hRenderConfig )->roomAcoustics.late_reverb_on = room_flag_on; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 951ea95810..594124ad45 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -357,12 +357,11 @@ AUDIO_CONFIG getIvasAudioConfigFromRendAudioConfig( return AUDIO_CONFIG_BINAURAL_BRIR; case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: return AUDIO_CONFIG_BINAURAL_HRIR_REVERB; -#else +#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: return AUDIO_CONFIG_BINAURAL; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: return AUDIO_CONFIG_BINAURAL_ROOM; -#endif case IVAS_REND_AUDIO_CONFIG_MASA1: return AUDIO_CONFIG_MASA1; case IVAS_REND_AUDIO_CONFIG_MASA2: @@ -396,12 +395,11 @@ IVAS_REND_AudioConfig getRendAudioConfigFromIvasAudioConfig( return IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR; case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB; -#else +#endif case AUDIO_CONFIG_BINAURAL: return IVAS_REND_AUDIO_CONFIG_BINAURAL; case AUDIO_CONFIG_BINAURAL_ROOM: return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM; -#endif case AUDIO_CONFIG_5_1: return IVAS_REND_AUDIO_CONFIG_5_1; case AUDIO_CONFIG_7_1: @@ -450,10 +448,9 @@ static ivas_error validateOutputAudioConfig( case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else +#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#endif return IVAS_ERR_OK; default: break; @@ -529,10 +526,9 @@ ivas_error getAudioConfigNumChannels( case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else +#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#endif case IVAS_REND_AUDIO_CONFIG_MASA2: *numChannels = 2; break; @@ -822,7 +818,8 @@ static ivas_error initEfap( int16_t numNonLfeChannels; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || + outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -1146,7 +1143,8 @@ static ivas_error setRendInputActiveIsm( error = IVAS_ERR_OK; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR ) + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || + outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) #endif @@ -1157,7 +1155,8 @@ static ivas_error setRendInputActiveIsm( } } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || + outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -1800,16 +1799,14 @@ static ivas_error updateMcPanGains( { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: break; /* Do nothing */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: /* Prepare rendering to intermediate format */ error = updateMcPanGainsForMcOut( inputMc, IVAS_REND_AUDIO_CONFIG_7_1_4 ); break; @@ -1875,7 +1872,8 @@ static ivas_error initMcBinauralRendering( // bool initTDRend; // initTDRend = false; //#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - // if ( ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) && ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + // if ( ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && + // ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) && ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) //#else // if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) //#endif @@ -2015,7 +2013,8 @@ static ivas_error setRendInputActiveMc( inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || + outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -2178,9 +2177,8 @@ static ivas_error updateSbaPanGains( { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = ivas_rend_openCrend( &inputSba->crendWrapper, getIvasAudioConfigFromRendAudioConfig( inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), @@ -2191,9 +2189,8 @@ static ivas_error updateSbaPanGains( #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: if ( ( error = initSbaPanGainsForMcOut( inputSba, IVAS_REND_AUDIO_CONFIG_7_1_4, NULL ) ) != IVAS_ERR_OK ) { return error; @@ -2456,7 +2453,8 @@ static ivas_error initMasaDummyDecForBinauralOut( ivas_output_init( &( decDummy->hOutSetup ), output_config ); #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + if ( output_config == AUDIO_CONFIG_BINAURAL || + output_config == AUDIO_CONFIG_BINAURAL_HRIR ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -3331,7 +3329,8 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || + hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) #else if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -3817,7 +3816,9 @@ ivas_error IVAS_REND_InitConfig( return error; } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, + outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR | outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB, + outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR | outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) #endif @@ -4788,17 +4789,15 @@ static ivas_error renderInputIsm( { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderIsmToBinaural( ismInput, outAudio ); break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: error = renderIsmToBinauralRoom( ismInput, outAudio ); break; default: @@ -5233,17 +5232,15 @@ static ivas_error renderInputMc( { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderMcToBinaural( mcInput, outConfig, outAudio ); break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: if ( mcInput->base.inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { error = renderMcCustomLsToBinauralRoom( mcInput, outConfig, outAudio ); @@ -5525,17 +5522,15 @@ static ivas_error renderInputSba( { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: error = renderSbaToBinauralRoom( sbaInput, outConfig, outAudio ); break; default: @@ -5718,20 +5713,17 @@ static ivas_error renderInputMasa( switch ( outConfig ) { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: #endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: renderMasaToBinaural( masaInput, outAudio ); break; /* ToDo */ //#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG // case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: // case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: - //#else - // case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: //#endif + // case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: // renderMasaToBinauralRoom( masaInput, outConfig, outAudio ); // break; default: diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index c12e1e6b6e..37923eef38 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -113,13 +113,12 @@ typedef enum IVAS_REND_AUDIO_CONFIG_OBJECT = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED << 8 | 0, #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, - IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, - IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, -#else - IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, - IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, + IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 3, + IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 4, + IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 5, #endif + IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, + IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, IVAS_REND_AUDIO_CONFIG_MASA1 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 0, IVAS_REND_AUDIO_CONFIG_MASA2 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 1, diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 86ca3301ab..f2364f99a5 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -422,7 +422,6 @@ ivas_error RenderConfigReader_read( #ifdef DEBUGGING fprintf( stderr, " PARAM: %s -> %s\n", item, pValue ); #endif -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( strcmp( item, "REVERB" ) == 0 ) { if ( read_bool( pValue, &hRenderConfig->room_acoustics.late_reverb_on ) ) @@ -438,7 +437,6 @@ ivas_error RenderConfigReader_read( } } else -#endif if ( strcmp( item, "NBANDS" ) == 0 ) { if ( !sscanf( pValue, "%hd", &hRenderConfig->room_acoustics.nBands ) || diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 985138c8a1..c234ed91eb 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -254,21 +254,21 @@ ../IVAS_cod -ism 1 testv/stvISM1.csv 13200 48 testv/stv1ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv1ISM48s.wav_13200_48-48_MONO.tst -// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_HRIR out, random FEC at 5% +// 1 ISM with metadata at 13.2 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 13200 48 testv/stv48n.wav bit -../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv48n.wav_13200_48-48_DTX_FEC5_BINAURAL.tst +../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv48n.wav_13200_48-48_DTX_FEC5_BINAURAL.tst // 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv2ISM48s.wav_16400_48-48_STEREO.tst -// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out +// 2 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst -// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out +// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out ../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst // 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit @@ -278,9 +278,9 @@ ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit ../IVAS_dec -fec 5 MONO 48 bit testv/stv3ISM48s.wav_24400_48-48_MONO_FEC5.tst -// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out +// 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv3ISM48s.wav_24400_48-48_binaural.tst // 1 ISM with metadata at 32 kbps, 32 kHz in, 32 kHz out, DTX on, MONO out ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv 32000 32 testv/stv32n.wav bit @@ -294,13 +294,13 @@ ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_32000_48-48_STEREO.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_HRIR out +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst // 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, HOA2 out ../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stvST48c.wav bit @@ -310,37 +310,37 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out, random FEC at 5% +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out, random FEC at 5% ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -fec 5 BINAURAL_BRIR 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst // 3 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst -// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_BRIR out, random FEC at 5% +// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_ROOM out, random FEC at 5% ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit -../IVAS_dec -fec 5 BINAURAL_BRIR 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst -// 2 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out, random FEC at 5% +// 2 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5% ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out, head rotation, random FEC at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out, head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out +// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst // 2 ISM with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst -// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_BRIR out +// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst // 2 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, DTX on, stereo out ../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 80000 48 testv/stvST48c.wav bit @@ -350,49 +350,49 @@ ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 80000 48 testv/stv4ISM48s.wav bit ../IVAS_dec HOA2 48 bit testv/stv4ISM48s.wav_80000_48-48_HOA2.tst -// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL_HRIR out (Model from file), head rotation, random FEC at 5% +// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_HRIR 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_FEC5.tst +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_FEC5.tst // 4 ISM with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit ../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst -// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, BINAURAL_HRIR out (Model from file) +// 1 ISM with metadata at 96 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file) ../IVAS_cod -ism 1 testv/stvISM1.csv 96000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_HRIR 16 bit testv/stv2ISM48s.wav_96000_48-16_binaural.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_96000_48-16_binaural.tst // 3 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, HOA3 out, random FEC at 5% ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 128000 48 testv/stv3ISM48s.wav bit ../IVAS_dec -fec 5 HOA3 32 bit testv/stv3ISM48s.wav_128000_48-32_HOA3_FEC5.tst -// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL_HRIR out (Model from file), head rotation +// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit -../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL_HRIR 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst +../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst // 4 ISM with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst -// 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL_HRIR out +// 2 ISM with metadata at 160 kbps, 48 kHz in, 32 kHz out, BINAURAL out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 160000 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL_HRIR 32 bit testv/stv2ISM48s.wav_160000_48-32_binaural.tst +../IVAS_dec BINAURAL 32 bit testv/stv2ISM48s.wav_160000_48-32_binaural.tst -// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out (Model from file) +// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out (Model from file) ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_HRIR 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural)file.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural)file.tst -// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out, head rotation, random FEC at 5% +// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, random FEC at 5% ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL_HRIR 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_FEC5.tst +../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_FEC5.tst -// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out +// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural.tst -// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out, head rotation +// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL_HRIR 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR.tst +../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR.tst // 3 ISM with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 384000 48 testv/stv3ISM48s.wav bit @@ -402,30 +402,30 @@ ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stv4ISM48s.wav bit ../IVAS_dec 5_1 48 bit testv/stv4ISM48s.wav_512000_48-48_5_1.tst -// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL_HRIR out, head rotation, Orientation tracking +// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, Orientation tracking ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_HRIR 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_OtrAvg.tst // 1 ISM with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv32c.wav bit ../IVAS_dec MONO 32 bit testv/stv32c.wav_brate_sw_32-32_mono_dtx.tst -// 4 ISM with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out +// 4 ISM with metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_binaural.tst // 4 ISm with and without metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, HOA3 out ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv NULL NULL testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit ../IVAS_dec HOA3 48 bit testv/stv4ISM48s.wav_brate_sw_48-48_DTX_hoa3.tst -// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL_HRIR out, head rotation, directivity configuration, random FEC at 5% +// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, directivity configuration, random FEC at 5% ../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -fec 5 -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv BINAURAL_HRIR 48 bit testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FEC5.tst +../IVAS_dec -fec 5 -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv BINAURAL 48 bit testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FEC5.tst -// 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_HRIR out +// 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out ../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv+4ISM48s.wav_brate_sw_48-48_DTX_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s.wav_brate_sw_48-48_DTX_binaural.tst // SBA at 13.2 kbps, 32kHz in, 32kHz out, HOA3 out @@ -440,49 +440,49 @@ ../IVAS_cod -sba 3 16400 32 testv/stv3OA32c.wav bit ../IVAS_dec 7_1_4 32 bit testv/stv3OA32c.wav_SBA_16400_32-32_7_1_4.tst -// SBA at 16.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out +// SBA at 16.4 kbps, 32kHz in, 32kHz out, BINAURAL out ../IVAS_cod -sba 3 16400 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_16400_32-32_Binaural.tst +../IVAS_dec BINAURAL 32 bit testv/stv3OA32c.wav_SBA_16400_32-32_Binaural.tst // SBA at 24.4 kbps, 32kHz in, 32kHz out, STEREO out ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_stereo.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural.tst +../IVAS_dec BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, random FEC at 5% +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, random FEC at 5% ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -fec 5 BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Subframe_FEC5.tst +../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Subframe_FEC5.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, Headrotation +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, Headrotation, Orientation tracking +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_HRIR 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_OtrAvg.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out, random FEC at 5% +// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -fec 5 BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_FEC5.tst -// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out, DTX on, Headrotation +// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_Headrot.tst // SBA at 32 kbps, 32kHz in, 32kHz out, FOA out ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_FOA.tst -// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, 6% FEC pattern +// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL out, 6% FEC pattern ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit -../IVAS_dec -fec testv/FEC_6pct.bin BINAURAL_HRIR 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_FEC6.tst +../IVAS_dec -fec testv/FEC_6pct.bin BINAURAL 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_FEC6.tst -// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out +// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL_BRIR 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst // SBA at 32 kbps, 48kHz in, 48kHz out, MONO out, DTX ../IVAS_cod -dtx -sba 1 32000 48 testv/stvFOA48c.wav bit @@ -496,37 +496,37 @@ ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_stereo.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation, Orientation tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation, reference vector tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst +../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation, reference vector tracking in level mode +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst +../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out, random FEC at 5% +// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -fec 5 BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_FEC5.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out, DTX on, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_Headrot.tst // SBA at 48 kbps, 48kHz in, 48kHz out, 5_1_2 out ../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit @@ -544,25 +544,25 @@ ../IVAS_cod -sba 1 64000 48 testv/stvFOA48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_7_1_4.tst -// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_HRIR out, DTX +// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL out, DTX ../IVAS_cod -dtx -sba 1 64000 48 testv/stvFOA48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL.tst +../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL.tst -// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_BRIR out, DTX +// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_ROOM out, DTX ../IVAS_cod -dtx -sba 1 64000 48 testv/stvFOA48c.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL_ROOM.tst // SBA at 80 kbps, 32kHz in, 32kHz out, HOA3 out ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit ../IVAS_dec HOA3 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_HOA3.tst -// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, random FEC at 5% +// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, random FEC at 5% ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit -../IVAS_dec -fec 5 BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_FEC5.tst -// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL_HRIR out, Headrotation +// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_Headrot.tst // SBA at 96 kbps, 32kHz in, 32kHz out, STEREO out ../IVAS_cod -sba 1 96000 32 testv/stvFOA32c.wav bit @@ -572,13 +572,13 @@ ../IVAS_cod -sba 1 96000 48 testv/stvFOA48c.wav bit ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_SBA_96000_48-48_FOA.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out, Headrotation, Orientation tracking +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst // SBA at 192 kbps, 48kHz in, 48kHz out, HOA2 out, random FEC at 5% ../IVAS_cod -sba 3 192000 48 testv/stv3OA48c.wav bit @@ -592,9 +592,9 @@ ../IVAS_cod -sba 1 160000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_160000_32-32_FOA.tst -// SBA at 160 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, random FEC at 5% +// SBA at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, random FEC at 5% ../IVAS_cod -sba 1 160000 48 testv/stvFOA48c.wav bit -../IVAS_dec -fec 5 BINAURAL_BRIR 48 bit testv/stvFOA48c.wav_SBA_160000_48-48_BINAURAL_ROOM_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stvFOA48c.wav_SBA_160000_48-48_BINAURAL_ROOM_FEC5.tst // SBA at 160 kbps, 48kHz in, 48kHz out, 5_1 out ../IVAS_cod -sba 1 160000 48 testv/stvFOA48c.wav bit @@ -608,9 +608,9 @@ ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_FOA.tst -// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL_BRIR out +// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL_BRIR 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst // SBA at 256 kbps, 48kHz in, 48kHz out, 7_1 out, random FEC at 5% ../IVAS_cod -sba 1 256000 48 testv/stvFOA48c.wav bit @@ -620,13 +620,13 @@ ../IVAS_cod -sba 2 384000 32 testv/stv2OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv2OA32c.wav_SBA_384000_32-32_stereo.tst -// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural.tst -// SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 48 testv/stvFOA48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stvFOA48c.wav_sw_48-48_BINAURAL.tst +../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_sw_48-48_BINAURAL.tst // SBA 2OA bitrate switching from 16.4 kbps to 512 kbps, 48kHz in, 48kHz out, FOA out ../IVAS_cod -sba 2 ../scripts/switchPaths/sw_16k4_512k_50fr.bin 48 testv/stv2OA48c.wav bit @@ -640,9 +640,9 @@ ../IVAS_cod -sba -3 ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv3OA48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stv3OA48c.wav_sw_48-48_7_1_4.tst -// SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL_HRIR out +// SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out ../IVAS_cod -dtx -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL_HRIR 32 bit testv/stvFOA32c.wav_sw_32-32_DTX_BINAURAL.tst +../IVAS_dec BINAURAL 32 bit testv/stvFOA32c.wav_sw_32-32_DTX_BINAURAL.tst // SBA 3OA bitrate switching from 13.2 kbps to 128 kbps, 32kHz in, 32kHz out, DTX on, HOA3 out ../IVAS_cod -dtx -sba 3 ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv3OA32c.wav bit @@ -650,25 +650,25 @@ -// MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// MASA 1dir 1TC at 13.2 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 13200 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv1MASA1TC48c.wav_13200_48-48_BINAURAL.tst +../IVAS_dec BINAURAL 48 bit testv/stv1MASA1TC48c.wav_13200_48-48_BINAURAL.tst // MASA 1dir 1TC at 16.4 kbps, 48kHz in, 48kHz out, HOA3 out, random FEC at 5% ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 16400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -fec 5 HOA3 48 bit testv/stv1MASA1TC48c.wav_16400_48-48_HOA3_FEC5.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, Headrotation +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst // MASA 1dir 1TC at 32 kbps, 48kHz in, 48kHz out, 7_1_4, random FEC at 5% ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 32000 48 testv/stv1MASA1TC48c.wav bit @@ -682,17 +682,17 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 64000 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv1MASA1TC48c.wav_64000_48-48_STEREO.tst -// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, random FEC at 5% +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, random FEC at 5% ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit -../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_FEC5.tst +../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_FEC5.tst -// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Subframe.tst +../IVAS_dec BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Subframe.tst -// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot.tst // MASA 1dir 2TC at 13.2 kbps, 48kHz in, 48kHz out, 5_1 out, random FEC at 5% ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 13200 48 testv/stv1MASA2TC48c.wav bit @@ -706,17 +706,17 @@ ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 24400 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv1MASA2TC48c.wav_24400_48-48_STEREO.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, Headrotation +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_BRIR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, Headrotation, Orientation tracking +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst // MASA 1dir 2TC at 48 kbps, 48kHz in, 48kHz out, 7_1_4 out, random FEC at 5% ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 48000 48 testv/stv1MASA2TC48c.wav bit @@ -746,9 +746,9 @@ ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 64000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -fec 5 EXT 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_external_FEC5.tst -// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation +// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 64000 48 testv/stv2MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_BINAURAL_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_BINAURAL_Headrot.tst // MASA 2dir 2TC at 128 kbps, 48kHz in, 48kHz out, FOA out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 128000 48 testv/stv2MASA2TC48c.wav bit @@ -758,13 +758,13 @@ ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 192000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -fec 5 5_1_4 48 bit testv/stv2MASA2TC48c.wav_192000_48-48_5_1_4_FEC5.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst // MASA 2dir 2TC at 512 kbps, 48kHz in, 48kHz out, 5_1 out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 512000 48 testv/stv2MASA2TC48c.wav bit @@ -790,9 +790,9 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48n.met ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 48 testv/stv1MASA1TC48n.wav bit ../IVAS_dec 5_1 48 bit testv/stv1MASA1TC48n.wav_sw_48-48_5_1.tst -// MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// MASA 1dir 2TC bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -masa 2 testv/stv1MASA2TC48n.met ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv1MASA2TC48n.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv1MASA2TC48n.wav_sw_48-48_BINAURAL.tst +../IVAS_dec BINAURAL 48 bit testv/stv1MASA2TC48n.wav_sw_48-48_BINAURAL.tst @@ -800,73 +800,73 @@ ../IVAS_cod -mc 5_1 13200 48 testv/stv51MC48c.wav bit ../IVAS_dec 5_1 48 bit testv/stv51MC48c.wav_MC51_13200_48-48_5_1.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, random FEC at 5% +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, random FEC at 5% ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit -../IVAS_dec -fec 5 BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_FEC5.tst +../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_FEC5.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Subframe.tst +../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Subframe.tst -// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Headrot.tst // Multi-channel 5_1 at 48 kbps, 48kHz in, 48kHz out, random FEC at 5% ../IVAS_cod -mc 5_1 48000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 5_1 48 bit testv/stv51MC48c.wav_MC51_48000_48-48_5_1_FEC5.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst // Multi-channel 5_1 at 96 kbps, 48kHz in, 48kHz out, random FEC at 5% ../IVAS_cod -mc 5_1 96000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 5_1 48 bit testv/stv51MC48c.wav_MC51_96000_48-48_5_1_FEC5.tst -// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural.tst -// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, Headrotation +// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation ../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural_Headrot.tst // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, STEREO out, random FEC at 5% ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_stereo_FEC5.tst -// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out +// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -mc 5_1 192000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, MONO out ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec MONO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_mono.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, head rotation +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, head rotation ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_BRIR 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out, head rotation, Orientation tracking +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, head rotation, Orientation tracking ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_BRIR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit ../IVAS_dec 5_1 48 bit testv/stv51MC48c.wav_MC51_384000_48-48_5_1.tst -// Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out +// Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_384000_48-48_Binaural.tst +../IVAS_dec BINAURAL 48 bit testv/stv51MC48c.wav_MC51_384000_48-48_Binaural.tst // Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, STEREO out ../IVAS_cod -mc 5_1 192000 48 testv/stv51MC48c.wav bit @@ -924,49 +924,49 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_MC_custom_setup.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_HRIR_REVERB out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_HRIR_REVERB out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config hospital_patientroom +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config hospital_patientroom ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst +../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config recreation +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config recreation ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_recreation.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst +../IVAS_dec -render_config testv/rend_config_recreation.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst -// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config renderer +// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1_2 512000 48 testv/stv512MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config renderer +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR_REVERB out Config renderer +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_HRIR_REVERB 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst // Multi-channel 5_1 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, 7_1_4 out ../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv51MC48c.wav bit ../IVAS_dec 7_1_4 48 bit testv/stv51MC48c.wav_sw_48-48_7_1_4.tst -// Multi-channel 5_1 bitrate switching from 24.4 kbps to 256 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out, FEC at 10% +// Multi-channel 5_1 bitrate switching from 24.4 kbps to 256 kbps, 48kHz in, 48kHz out, BINAURAL out, FEC at 10% ../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv51MC48c.wav bit -../IVAS_dec -fec 10 BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_sw_48-48_binaural_fec10.tst +../IVAS_dec -fec 10 BINAURAL 48 bit testv/stv51MC48c.wav_sw_48-48_binaural_fec10.tst -// Multi-channel 5_1_2 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_BRIR out +// Multi-channel 5_1_2 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out ../IVAS_cod -mc 5_1_2 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv512MC48c.wav bit -../IVAS_dec BINAURAL_BRIR 16 bit testv/stv512MC48c.wav_sw_48-16_Binaural_room.tst +../IVAS_dec BINAURAL_ROOM 16 bit testv/stv512MC48c.wav_sw_48-16_Binaural_room.tst // Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, HOA3 out ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv714MC48c.wav bit @@ -977,21 +977,21 @@ ../IVAS_dec -FEC 5 STEREO 32 bit testv/stv714MC48c.wav_sw_48-32_stereo.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_BRIR out (Model from file) +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out (Model from file) ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_BRIR 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_ROOM 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_HRIR out (Model from file) +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 32kHz out, BINAURAL out (Model from file) ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL_HRIR 32 bit testv/stv714MC48c.wav_MC714_512000_48-32_MC_binaural.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv714MC48c.wav_MC714_512000_48-32_MC_binaural.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_HRIR out (Model from file) +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL out (Model from file) ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_HRIR 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_BRIR out (Model from file) +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out (Model from file) ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_BRIR 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst diff --git a/scripts/pyivastest/constants.py b/scripts/pyivastest/constants.py index 03cb439901..f42796376a 100644 --- a/scripts/pyivastest/constants.py +++ b/scripts/pyivastest/constants.py @@ -46,9 +46,8 @@ SW_FILES_BASE_DIR = os.path.realpath( OC_TO_NCHANNELS = { "MONO": 1, "STEREO": 2, - "BINAURAL_HRIR": 2, - "BINAURAL_BRIR": 2, - "BINAURAL_HRIR_REVERB": 2, + "BINAURAL": 2, + "BINAURAL_ROOM": 2, "5_1": 6, "7_1": 8, "5_1_2": 8, @@ -65,7 +64,7 @@ OC_TO_NCHANNELS = { "MASA1TC": 1, "MASA2TC": 2, } -DECODER_OUTPUT_CONFIGS = {"MONO", "STEREO", "BINAURAL_HRIR", "BINAURAL_BRIR", "BINAURAL_HRIR_REVERB", "5_1", "7_1", "5_1_4", "5_1_2", +DECODER_OUTPUT_CONFIGS = {"MONO", "STEREO", "BINAURAL", "BINAURAL_ROOM", "5_1", "7_1", "5_1_4", "5_1_2", "7_1_4", "FOA", "HOA2", "HOA3", "EXT"} LOG_FILE_EXT = ".txt" LOG_FILE_DIR ="logs" diff --git a/scripts/testv/rend_config_hospital_patientroom.cfg b/scripts/testv/rend_config_hospital_patientroom.cfg index 8b35e102ea..b68ac921f9 100644 --- a/scripts/testv/rend_config_hospital_patientroom.cfg +++ b/scripts/testv/rend_config_hospital_patientroom.cfg @@ -1,4 +1,6 @@ [roomAcoustics] +reverb = true; +brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, diff --git a/scripts/testv/rend_config_recreation.cfg b/scripts/testv/rend_config_recreation.cfg index 85ca1ca76e..afdc0f858b 100644 --- a/scripts/testv/rend_config_recreation.cfg +++ b/scripts/testv/rend_config_recreation.cfg @@ -1,4 +1,6 @@ [roomAcoustics] +reverb = true; +brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, diff --git a/scripts/testv/rend_config_renderer.cfg b/scripts/testv/rend_config_renderer.cfg index ef2257ab6c..8aa9dec1b2 100644 --- a/scripts/testv/rend_config_renderer.cfg +++ b/scripts/testv/rend_config_renderer.cfg @@ -1,4 +1,6 @@ [roomAcoustics] +reverb = true; # Reverb switch, in case BRIR is undefined or false, reverb flag is inherited from the room flag +brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py index 206a33cf32..6a8465781b 100644 --- a/tests/renderer/constants.py +++ b/tests/renderer/constants.py @@ -194,7 +194,7 @@ METADATA_SCENES_TO_TEST = ["mixed_scene", "mixed_scene_simple"] METADATA_SCENES_TO_TEST_NO_BE = ["masa_scene"] """ Binaural rendering """ -OUTPUT_FORMATS_BINAURAL = ["BINAURAL_HRIR", "BINAURAL_BRIR", "BINAURAL_HRIR_REVERB"] +OUTPUT_FORMATS_BINAURAL = ["BINAURAL", "BINAURAL_ROOM"] HR_TRAJECTORIES_TO_TEST = [ "full_circle_in_15s", "rotate_yaw_pitch_roll1", @@ -225,21 +225,21 @@ _pass_snr = { "test_ambisonics[HOA3-7_1]": 25, "test_ambisonics[HOA3-7_1_4]": 30, # TODO needs debugging - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_HRIR-full_circle_in_15s]": 18, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_HRIR-full_circle_in_15s]": 15, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL-full_circle_in_15s]": 18, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL-full_circle_in_15s]": 15, # Failure reason: Crend unit test does not support intermediate conversion to 7_1_4 or SHD BRIRs # Comparison with pyaudio3dtools results in bad SNR - "test_ambisonics_binaural_headrotation[FOA-BINAURAL_BRIR-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[FOA-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_BRIR-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 4, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_BRIR-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 3, - "test_ambisonics_binaural_static[FOA-BINAURAL_BRIR]": 0, - "test_ambisonics_binaural_static[HOA2-BINAURAL_BRIR]": 0, - "test_ambisonics_binaural_static[HOA3-BINAURAL_BRIR]": 0, + "test_ambisonics_binaural_headrotation[FOA-BINAURAL_ROOM-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[FOA-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_ROOM-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL-rotate_yaw_pitch_roll1]": 4, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_ROOM-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL-rotate_yaw_pitch_roll1]": 3, + "test_ambisonics_binaural_static[FOA-BINAURAL_ROOM]": 0, + "test_ambisonics_binaural_static[HOA2-BINAURAL_ROOM]": 0, + "test_ambisonics_binaural_static[HOA3-BINAURAL_ROOM]": 0, # Failure reason: Renderer uses getRSH() with int16_t vs float in python "test_custom_ls_input[t_design_4-FOA]": 43, "test_custom_ls_input[t_design_4-HOA2]": 39, @@ -258,47 +258,47 @@ _pass_snr = { "test_custom_ls_output[HOA3-t_design_4]": 32, # Failure reason: TD Object Renderer standalone does not support custom LS input # Comparison with pyaudio3dtools results in bad SNR - "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL_HRIR]": 8, - "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL_BRIR]": 0, - "test_custom_ls_input_binaural[4d4-BINAURAL_HRIR]": 6, - "test_custom_ls_input_binaural[4d4-BINAURAL_BRIR]": 0, - "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL_HRIR]": 1, - "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL_BRIR]": 3, - "test_custom_ls_input_binaural[t_design_4-BINAURAL_HRIR]": 5, - "test_custom_ls_input_binaural[t_design_4-BINAURAL_BRIR]": 0, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_HRIR-full_circle_in_15s]": 7, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 6, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_BRIR-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_HRIR-full_circle_in_15s]": 7, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 5, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_BRIR-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_HRIR-full_circle_in_15s]": 1, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 1, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_BRIR-full_circle_in_15s]": 3, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 3, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_HRIR-full_circle_in_15s]": 4, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 4, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_BRIR-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL]": 8, + "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL_ROOM]": 0, + "test_custom_ls_input_binaural[4d4-BINAURAL]": 6, + "test_custom_ls_input_binaural[4d4-BINAURAL_ROOM]": 0, + "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL]": 1, + "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL_ROOM]": 3, + "test_custom_ls_input_binaural[t_design_4-BINAURAL]": 5, + "test_custom_ls_input_binaural[t_design_4-BINAURAL_ROOM]": 0, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL-full_circle_in_15s]": 7, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL-rotate_yaw_pitch_roll1]": 6, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_ROOM-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL-full_circle_in_15s]": 7, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL-rotate_yaw_pitch_roll1]": 5, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_ROOM-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL-full_circle_in_15s]": 1, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL-rotate_yaw_pitch_roll1]": 1, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_ROOM-full_circle_in_15s]": 3, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 3, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL-full_circle_in_15s]": 4, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL-rotate_yaw_pitch_roll1]": 4, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_ROOM-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, # TODO needs debugging - "test_ism_binaural_headrotation[ISM2-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 34, - "test_ism_binaural_headrotation[ISM3-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 34, - "test_ism_binaural_headrotation[ISM4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 33, + "test_ism_binaural_headrotation[ISM2-BINAURAL-rotate_yaw_pitch_roll1]": 34, + "test_ism_binaural_headrotation[ISM3-BINAURAL-rotate_yaw_pitch_roll1]": 34, + "test_ism_binaural_headrotation[ISM4-BINAURAL-rotate_yaw_pitch_roll1]": 33, # Failure reason: Crend unit test does not support intermediate conversion to 7_1_4 - "test_ism_binaural_headrotation[ISM1-BINAURAL_BRIR-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM1-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_headrotation[ISM2-BINAURAL_BRIR-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM2-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 3, - "test_ism_binaural_headrotation[ISM3-BINAURAL_BRIR-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM3-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_headrotation[ISM4-BINAURAL_BRIR-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_static[ISM1-BINAURAL_BRIR]": 23, - "test_ism_binaural_static[ISM2-BINAURAL_BRIR]": 21, - "test_ism_binaural_static[ISM3-BINAURAL_BRIR]": 21, - "test_ism_binaural_static[ISM4-BINAURAL_BRIR]": 21, + "test_ism_binaural_headrotation[ISM1-BINAURAL_ROOM-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_headrotation[ISM2-BINAURAL_ROOM-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 3, + "test_ism_binaural_headrotation[ISM3-BINAURAL_ROOM-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM3-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_headrotation[ISM4-BINAURAL_ROOM-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_static[ISM1-BINAURAL_ROOM]": 23, + "test_ism_binaural_static[ISM2-BINAURAL_ROOM]": 21, + "test_ism_binaural_static[ISM3-BINAURAL_ROOM]": 21, + "test_ism_binaural_static[ISM4-BINAURAL_ROOM]": 21, # Failure Reason: Tangent law panning missing in python scripts "test_ism[ISM1-STEREO]": 8, "test_ism[ISM2-STEREO]": 13, @@ -339,25 +339,25 @@ _pass_snr = { "test_ism[ISM4-HOA3]": 40, # TODO delay alignment of LFE in binaural output # Failure reason: bitexact except for delay alignment of LFE signal (Issue 59) - "test_multichannel_binaural_headrotation[5_1-BINAURAL_HRIR-full_circle_in_15s]": 7, - "test_multichannel_binaural_headrotation[5_1-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 6, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_HRIR-full_circle_in_15s]": 9, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 1, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_HRIR-full_circle_in_15s]": 10, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 1, - "test_multichannel_binaural_headrotation[7_1-BINAURAL_HRIR-full_circle_in_15s]": 8, - "test_multichannel_binaural_headrotation[7_1-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 8, - "test_multichannel_binaural_headrotation[7_1_4-BINAURAL_HRIR-full_circle_in_15s]": 8, - "test_multichannel_binaural_headrotation[7_1_4-BINAURAL_HRIR-rotate_yaw_pitch_roll1]": 1, + "test_multichannel_binaural_headrotation[5_1-BINAURAL-full_circle_in_15s]": 7, + "test_multichannel_binaural_headrotation[5_1-BINAURAL-rotate_yaw_pitch_roll1]": 6, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL-full_circle_in_15s]": 9, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL-rotate_yaw_pitch_roll1]": 1, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL-full_circle_in_15s]": 10, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL-rotate_yaw_pitch_roll1]": 1, + "test_multichannel_binaural_headrotation[7_1-BINAURAL-full_circle_in_15s]": 8, + "test_multichannel_binaural_headrotation[7_1-BINAURAL-rotate_yaw_pitch_roll1]": 8, + "test_multichannel_binaural_headrotation[7_1_4-BINAURAL-full_circle_in_15s]": 8, + "test_multichannel_binaural_headrotation[7_1_4-BINAURAL-rotate_yaw_pitch_roll1]": 1, # Failure reason: differences in LFE alignment and possibly rotation - "test_multichannel_binaural_headrotation[5_1-BINAURAL_BRIR-full_circle_in_15s]": 14, - "test_multichannel_binaural_headrotation[5_1-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 12, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_BRIR-full_circle_in_15s]": 8, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_BRIR-full_circle_in_15s]": 6, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 6, - "test_multichannel_binaural_headrotation[7_1-BINAURAL_BRIR-full_circle_in_15s]": 11, - "test_multichannel_binaural_headrotation[7_1-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 9, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_BRIR-rotate_yaw_pitch_roll1]": 6, + "test_multichannel_binaural_headrotation[5_1-BINAURAL_ROOM-full_circle_in_15s]": 14, + "test_multichannel_binaural_headrotation[5_1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 12, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_ROOM-full_circle_in_15s]": 8, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_ROOM-full_circle_in_15s]": 6, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 6, + "test_multichannel_binaural_headrotation[7_1-BINAURAL_ROOM-full_circle_in_15s]": 11, + "test_multichannel_binaural_headrotation[7_1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 9, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 6, # Failure reason: mixed format, see above "test_metadata[mixed_scene-5_1]": 47, "test_metadata[mixed_scene-5_1_2]": 47, -- GitLab From 6e9a0fe6e0f87b777b8b58b4c4153594da8000da Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 17 May 2023 16:22:27 +0200 Subject: [PATCH 043/381] change starting bitrate of core-coder with 16kHz internal sampling rate from 17 kbps to 15.9 kbps; under ISM_16_KHZ_CORE --- lib_com/bits_alloc.c | 9 +++++++++ lib_com/ivas_cnst.h | 7 +++++++ lib_com/ivas_ism_com.c | 26 ++++++++++++++++++++++++++ lib_com/ivas_prot.h | 3 +++ lib_com/options.h | 4 ++++ lib_com/prot.h | 3 +++ lib_dec/evs_dec.c | 4 ++++ lib_dec/init_dec.c | 4 ++++ lib_dec/ivas_cpe_dec.c | 4 ++++ lib_dec/ivas_ism_dec.c | 4 ++++ lib_dec/ivas_ism_metadata_dec.c | 8 ++++++++ lib_dec/ivas_sce_dec.c | 4 ++++ lib_enc/evs_enc.c | 5 ++++- lib_enc/init_enc.c | 4 ++++ lib_enc/ivas_cpe_enc.c | 8 ++++++++ lib_enc/ivas_ism_enc.c | 12 ++++++++++++ lib_enc/ivas_ism_metadata_enc.c | 8 ++++++++ lib_enc/ivas_sce_enc.c | 8 ++++++++ 18 files changed, 124 insertions(+), 1 deletion(-) diff --git a/lib_com/bits_alloc.c b/lib_com/bits_alloc.c index 5ae9cb84d0..81bdd93bf8 100644 --- a/lib_com/bits_alloc.c +++ b/lib_com/bits_alloc.c @@ -1477,6 +1477,9 @@ static int16_t allocate_unused( /*! r: ACELP16k flag */ int16_t set_ACELP_flag( +#ifdef ISM_16_KHZ_CORE + const ISM_MODE ism_mode, /* i : ISM mode */ +#endif const int16_t element_mode, /* i : element mode */ const int32_t element_brate, /* i : element bitrate */ const int32_t total_brate, /* i : total bitrate per channel */ @@ -1515,6 +1518,12 @@ int16_t set_ACELP_flag( } else if ( element_mode == IVAS_SCE ) { +#ifdef ISM_16_KHZ_CORE + if ( ism_mode == ISM_MODE_DISC && element_brate >= SCE_CORE_16k_LOW_LIMIT_ISM ) + { + return 1; + } +#endif if ( element_brate >= SCE_CORE_16k_LOW_LIMIT ) { return 1; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index b5e3964319..c8eab50f29 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -294,6 +294,9 @@ typedef enum #define ACELP_12k8_HIGH_LIMIT 24350 /* max. per channel bitrate where the ACELP@12.8kHz is supported */ #define ACELP_16k_LOW_LIMIT 13250 /* min. per channel bitrate where the ACELP@16kHz is supported */ #define SCE_CORE_16k_LOW_LIMIT 17000 /* min. SCE bitrate where the ACELP@16kHz is supported; must be >= (ACELP_16k_LOW_LIMIT + SWB_TBE_1k6) */ +#ifdef ISM_16_KHZ_CORE +#define SCE_CORE_16k_LOW_LIMIT_ISM 15900 /* min. SCE bitrate where the ACELP@16kHz is supported; must be >= (ACELP_16k_LOW_LIMIT + SWB_TBE_1k6) */ +#endif #define MIN_BRATE_AVQ_EXC ACELP_29k00 /* min. per channel bitrate where the AVQ excitation stage is supported */ #define MAX_BRATE_AVQ_EXC_TD 40000 /* max. per channel bitrate where the AVQ excitation stage in time domain is supported */ @@ -331,7 +334,11 @@ typedef enum * ISM Constants *----------------------------------------------------------------------------------*/ +#ifdef ISM_16_KHZ_COREaa // VE: to be verified !!!!! +#define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT_ISM - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ +#else #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ +#endif #define ISM_METADATA_VAD_FLAG_BITS 1 #define ISM_METADATA_FLAG_BITS 2 diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index d14b252fd8..51c9f88cb1 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -92,6 +92,9 @@ ivas_error ivas_ism_config( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ +#ifdef ISM_16_KHZ_CORE + const ISM_MODE ism_mode, /* i : ISM mode */ +#endif #ifdef ISM_NON_DIEGETIC_PAN const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ #endif @@ -109,12 +112,23 @@ ivas_error ivas_ism_config( int16_t tmp; int16_t ism_metadata_flag_global; int16_t n_ISms; +#ifdef ISM_16_KHZ_CORE + int32_t sce_core_16k_limit; +#endif ivas_error error; error = IVAS_ERR_OK; n_ISms = nchan_transport; +#ifdef ISM_16_KHZ_CORE + sce_core_16k_limit = SCE_CORE_16k_LOW_LIMIT_ISM; + if ( ism_mode == ISM_MODE_PARAM || ism_extended_metadata_flag ) + { + sce_core_16k_limit = SCE_CORE_16k_LOW_LIMIT; + } +#endif + /* initialization */ ism_metadata_flag_global = 0; bits_side = 0; @@ -221,9 +235,17 @@ ivas_error ivas_ism_config( { limit = MIN_BRATE_WB_BWE / FRMS_PER_SECOND; } +#ifdef ISM_16_KHZ_CORE + else if ( element_brate[ch] >= sce_core_16k_limit ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ +#else else if ( element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ +#endif { +#ifdef ISM_16_KHZ_CORE + /*limit = sce_core_16k_limit;*/ +#else /*limit = SCE_CORE_16k_LOW_LIMIT;*/ +#endif limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRMS_PER_SECOND; } @@ -275,7 +297,11 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { limit_high = IVAS_512k / FRMS_PER_SECOND; +#ifdef ISM_16_KHZ_CORE + if ( element_brate[ch] < sce_core_16k_limit ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ +#else if ( element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ +#endif { limit_high = ACELP_12k8_HIGH_LIMIT / FRMS_PER_SECOND; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5d4faf0eb0..ace91a63eb 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -867,6 +867,9 @@ ivas_error ivas_ism_config( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ +#ifdef ISM_16_KHZ_CORE + const ISM_MODE ism_mode, /* i : ISM mode */ +#endif #ifdef ISM_NON_DIEGETIC_PAN const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ #endif diff --git a/lib_com/options.h b/lib_com/options.h index 4150e91a5d..240263cf77 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -221,6 +221,10 @@ #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ + +#define ISM_16_KHZ_CORE // change starting bitrate of core-coder with 16kHz internal sampling rate from 17 kbps to 15.9 kbps + // VE: 4ISM 64 kbps extend metadata cases might fail due to too high bitbudget for ext. MD + 4 x 16kHz core + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 8c6fdd674f..b290372d4f 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -9076,6 +9076,9 @@ ivas_error config_acelp1( /*! r: ACELP16k flag */ int16_t set_ACELP_flag( +#ifdef ISM_16_KHZ_CORE + const ISM_MODE ism_mode, /* i : ISM mode */ +#endif const int16_t element_mode, /* i : element mode */ const int32_t element_brate, /* i : element bitrate */ const int32_t total_brate, /* i : total bitrate per channel */ diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 8ea2d71159..0d55b54762 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -92,7 +92,11 @@ ivas_error evs_dec( *-----------------------------------------------------------------*/ st->idchan = 0; +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); +#endif tmps = 0; delay_tdbwe = 0; diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 173623db65..45030137c3 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -90,7 +90,11 @@ ivas_error init_decoder( st->last_core = -1; st->last_extl = st->extl; +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); +#endif /*-----------------------------------------------------------------* * ACELP core parameters diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 3717501c83..3b71a06569 100755 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -305,7 +305,11 @@ ivas_error ivas_cpe_dec( for ( n = 0; n < n_channels; n++ ) { /* set ACELP12k8 / ACELP16k flag for flexible ACELP core */ +#ifdef ISM_16_KHZ_CORE + sts[n]->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, ( hCPE->hStereoTD != NULL ? hCPE->hStereoTD->tdm_LRTD_flag : 0 ), sts[n]->bwidth, sts[n]->cng_type ); +#else sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, ( hCPE->hStereoTD != NULL ? hCPE->hStereoTD->tdm_LRTD_flag : 0 ), sts[n]->bwidth, sts[n]->cng_type ); +#endif } for ( n = 0; n < n_channels; n++ ) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 5706261093..aa0db9cb17 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -91,7 +91,11 @@ static ivas_error ivas_ism_bitrate_switching( #endif #ifdef ISM_NON_DIEGETIC_PAN +#ifdef ISM_16_KHZ_CORE + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, ism_mode, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif #else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) #endif diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index b7bf89e026..bc095ae8ad 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -500,7 +500,11 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { #ifdef ISM_NON_DIEGETIC_PAN +#ifdef ISM_16_KHZ_CORE + if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_mode, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#endif #else if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #endif @@ -614,7 +618,11 @@ ivas_error ivas_ism_metadata_dec_create( } #ifdef ISM_NON_DIEGETIC_PAN +#ifdef ISM_16_KHZ_CORE + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, st_ivas->ism_mode, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif #else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) #endif diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 9a940b9b6d..a9ae521f74 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -212,7 +212,11 @@ ivas_error ivas_sce_dec( } else { +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( st_ivas->ism_mode, IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); +#endif } if ( is_DTXrate( ivas_total_brate ) ) diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c index da0556dd72..d900090552 100644 --- a/lib_enc/evs_enc.c +++ b/lib_enc/evs_enc.c @@ -122,9 +122,12 @@ ivas_error evs_enc( st->mdct_sw = 0; st->rate_switching_reset = 0; - st->idchan = 0; +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); +#endif /*----------------------------------------------------------------* * set input samples buffer diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 9efd3c7f16..7b57389ad8 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -100,7 +100,11 @@ ivas_error init_encoder( st->coder_type_raw = VOICED; st->last_coder_type_raw = st->coder_type_raw; +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); +#endif /*-----------------------------------------------------------------* * Bitstream diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 522cfb885d..416614bf6e 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -513,11 +513,19 @@ ivas_error ivas_cpe_enc( { if ( ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) && hCPE->element_mode == IVAS_CPE_DFT ) { +#ifdef ISM_16_KHZ_CORE + sts[n]->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, hCPE->element_mode, hCPE->element_brate, sts[n]->core_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); +#else sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->core_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); +#endif } else { +#ifdef ISM_16_KHZ_CORE + sts[n]->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); +#else sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); +#endif } } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 5c310ac30f..b78f218811 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -268,7 +268,11 @@ ivas_error ivas_ism_enc( /* set ACELP@12k8 / ACELP@16k flag for flexible ACELP core */ if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) { +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( st_ivas->ism_mode, IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); +#endif } else if ( st->low_rate_mode ) { @@ -276,7 +280,11 @@ ivas_error ivas_ism_enc( } else { +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( st_ivas->ism_mode, IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); +#endif } /* modify the coder_type depending on the total_brate per channel */ @@ -403,7 +411,11 @@ ivas_error ivas_ism_enc_config( st_ivas->nCPE = 0; #ifdef ISM_NON_DIEGETIC_PAN +#ifdef ISM_16_KHZ_CORE + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, st_ivas->ism_mode, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif #else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) #endif diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 732ffec21b..3f9d5c959a 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -577,7 +577,11 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ #ifdef ISM_NON_DIEGETIC_PAN +#ifdef ISM_16_KHZ_CORE + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_mode, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#endif #else if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #endif @@ -699,7 +703,11 @@ ivas_error ivas_ism_metadata_enc_create( } #ifdef ISM_NON_DIEGETIC_PAN +#ifdef ISM_16_KHZ_CORE + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, st_ivas->ism_mode, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif #else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) #endif diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index c8577a85ba..df0faf71c0 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -223,11 +223,19 @@ ivas_error ivas_sce_enc( /* set ACELP@12k8 / ACELP@16k flag for flexible ACELP core */ if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) { +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); +#endif } else { +#ifdef ISM_16_KHZ_CORE + st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); +#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); +#endif } /* modify the coder_type depending on the total_brate per channel */ -- GitLab From 2020b7894e02c025f189cb3eff63e245ce6a3b50 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Thu, 18 May 2023 16:33:09 +0530 Subject: [PATCH 044/381] Resolving Linux warnings & Clang formatting --- lib_com/ivas_dirac_com.c | 24 ++++++++++++++++++------ lib_enc/ivas_dirac_enc.c | 5 ++++- lib_rend/lib_rend.c | 12 ++++++------ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index c3a141b67e..2c7907af1e 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -60,8 +60,12 @@ ivas_error ivas_dirac_config( ) { IVAS_FORMAT ivas_format; +#ifndef SBA_MODE_CLEAN_UP int16_t sba_order; int16_t *nSCE, *nCPE, *element_mode, *nchan_transport; +#else + int16_t *element_mode; +#endif int32_t ivas_total_brate; DIRAC_CONFIG_DATA_HANDLE hConfig; IVAS_QMETADATA_HANDLE hQMetaData; @@ -80,11 +84,15 @@ ivas_error ivas_dirac_config( if ( enc_dec == ENC ) { ivas_format = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_format; +#ifndef SBA_MODE_CLEAN_UP nSCE = &( ( (Encoder_Struct *) st_ivas )->nSCE ); nCPE = &( (Encoder_Struct *) st_ivas )->nCPE; +#endif element_mode = &( (Encoder_Struct *) st_ivas )->hEncoderConfig->element_mode_init; +#ifndef SBA_MODE_CLEAN_UP nchan_transport = &( (Encoder_Struct *) st_ivas )->nchan_transport; sba_order = ( (Encoder_Struct *) st_ivas )->sba_analysis_order; +#endif ivas_total_brate = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_total_brate; Fs = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->input_Fs; band_grouping = ( (Encoder_Struct *) st_ivas )->hDirAC->band_grouping; @@ -106,11 +114,15 @@ ivas_error ivas_dirac_config( else { ivas_format = ( (Decoder_Struct *) st_ivas )->ivas_format; +#ifndef SBA_MODE_CLEAN_UP nSCE = &( (Decoder_Struct *) st_ivas )->nSCE; nCPE = &( (Decoder_Struct *) st_ivas )->nCPE; +#endif element_mode = &( (Decoder_Struct *) st_ivas )->element_mode_init; +#ifndef SBA_MODE_CLEAN_UP nchan_transport = &( (Decoder_Struct *) st_ivas )->nchan_transport; sba_order = ( (Decoder_Struct *) st_ivas )->sba_analysis_order; +#endif ivas_total_brate = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->ivas_total_brate; Fs = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->output_Fs; band_grouping = ( (Decoder_Struct *) st_ivas )->hDirAC->band_grouping; @@ -325,14 +337,14 @@ void ivas_dirac_config_bands( ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ #ifndef SBA_MODE_CLEAN_UP - int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE, /* o : number of CPEs */ + int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ #endif - int16_t *element_mode, /* i/o: element mode of the core coder */ - int32_t sba_total_brate, /* i : SBA total bitrate */ + int16_t *element_mode, /* i/o: element mode of the core coder */ + int32_t sba_total_brate, /* i : SBA total bitrate */ #ifndef SBA_MODE_CLEAN_UP - const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ const SBA_MODE sba_mode, /* i : SBA mode */ #endif const int16_t nbands /* i : number of frequency bands */ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 6af189eddb..23035db988 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -62,7 +62,9 @@ ivas_error ivas_dirac_enc_open( ) { int16_t i, j; +#ifndef SBA_MODE_CLEAN_UP int32_t input_Fs; +#endif DIRAC_ENC_HANDLE hDirAC; #ifndef SBA_MODE_CLEAN_UP IVAS_FB_CFG *fb_cfg; @@ -87,8 +89,9 @@ ivas_error ivas_dirac_enc_open( *-----------------------------------------------------------------*/ st_ivas->hDirAC = hDirAC; +#ifndef SBA_MODE_CLEAN_UP input_Fs = st_ivas->hEncoderConfig->input_Fs; - +#endif if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index b090574f31..fa86fe8fc5 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2197,9 +2197,9 @@ static ivas_error initMasaDummyDecForMcOut( decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ #ifndef SBA_MODE_CLEAN_UP - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ + decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ #endif - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); ivas_output_init( &( decDummy->hIntSetup ), output_config ); @@ -2282,9 +2282,9 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ #ifndef SBA_MODE_CLEAN_UP - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ + decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ #endif - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); ivas_output_init( &( decDummy->hIntSetup ), output_config ); @@ -2354,9 +2354,9 @@ static ivas_error initMasaDummyDecForBinauralOut( decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ #ifndef SBA_MODE_CLEAN_UP - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ + decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ #endif - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); if ( output_config == AUDIO_CONFIG_BINAURAL ) -- GitLab From ae9a8e48ce3367693e28c18b51c68a33f3346c37 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 19 May 2023 11:09:39 +0200 Subject: [PATCH 045/381] change ISM_NB_BITS_METADATA_NOMINAL macro --- lib_com/ivas_cnst.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index c8eab50f29..f709195ad0 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -334,7 +334,7 @@ typedef enum * ISM Constants *----------------------------------------------------------------------------------*/ -#ifdef ISM_16_KHZ_COREaa // VE: to be verified !!!!! +#ifdef ISM_16_KHZ_CORE #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT_ISM - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ #else #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ -- GitLab From 988cc9040763c4e49d175960cab4a201957fe865 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Fri, 19 May 2023 16:51:43 +0530 Subject: [PATCH 046/381] Added flag for bitrate 512kbps and FOA out config check --- lib_com/ivas_fb_mixer.c | 7 +- lib_com/ivas_prot.h | 15 +++ lib_com/ivas_td_decorr.c | 43 ++++++- lib_com/options.h | 2 + lib_dec/ivas_init_dec.c | 19 +++- lib_dec/ivas_masa_dec.c | 8 +- lib_dec/ivas_mcmasa_dec.c | 7 +- lib_dec/ivas_mct_dec.c | 7 +- lib_dec/ivas_sba_dec.c | 24 +++- lib_dec/ivas_spar_decoder.c | 111 ++++++++++++++----- lib_dec/ivas_spar_md_dec.c | 12 +- lib_dec/ivas_stat_dec.h | 4 + lib_rend/ivas_dirac_dec_binaural_functions.c | 17 ++- lib_rend/ivas_reverb.c | 7 +- 14 files changed, 220 insertions(+), 63 deletions(-) diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index 2598a43d30..aae69cf7e4 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -589,14 +589,11 @@ void ivas_fb_mixer_update_prior_input( ) { int16_t i; - - for ( i = 0; i < #ifdef HODIRAC - nchan_fb_in; + for ( i = 0; i < nchan_fb_in; i++ ) #else - hFbMixer->fb_cfg->num_in_chans; + for ( i = 0; i < hFbMixer->fb_cfg->num_in_chans; i++ ) #endif - i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length ); mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5d4faf0eb0..2381913f70 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3741,6 +3741,10 @@ ivas_error ivas_td_decorr_reconfig_dec( const int32_t output_Fs, /* i : output sampling rate */ ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ +#ifdef TD_DECORR_DIS + , + int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ +#endif ); /*! r: Configured reqularization factor value */ @@ -4359,6 +4363,10 @@ void ivas_spar_dec_close( SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +#ifdef TD_DECORR_DIS + , + const int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ +#endif ); ivas_error ivas_spar_dec( @@ -5814,6 +5822,13 @@ int16_t ivas_get_num_bands_from_bw_idx( const int16_t bwidth /* i : audio bandwidth */ ); +#ifdef TD_DECORR_DIS +void ivas_td_decorr_bitrate_check( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + AUDIO_CONFIG output_config, /* i : output config. */ + Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ +); +#endif /* clang-format on */ diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 9a08c06f6a..c54c100385 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -115,6 +115,10 @@ ivas_error ivas_td_decorr_reconfig_dec( const int32_t output_Fs, /* i : output sampling rate */ ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ +#ifdef TD_DECORR_DIS + , + int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ +#endif ) { uint16_t useTdDecorr_new; @@ -151,13 +155,20 @@ ivas_error ivas_td_decorr_reconfig_dec( { if ( ivas_total_brate >= IVAS_13k2 && ivas_format == SBA_FORMAT ) { - if ( *hTdDecorr == NULL ) +#ifdef TD_DECORR_DIS + if ( !td_decorr_flag ) { - if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) +#endif + if ( *hTdDecorr == NULL ) { - return error; + if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } } +#ifdef TD_DECORR_DIS } +#endif if ( ivas_total_brate < IVAS_24k4 ) { @@ -215,7 +226,6 @@ ivas_error ivas_td_decorr_dec_open( num_out_chans = nchan_internal - 1; error = IVAS_ERR_OK; - if ( ( hTdDecorr_loc = (ivas_td_decorr_state_t *) malloc( sizeof( ivas_td_decorr_state_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); @@ -226,6 +236,7 @@ ivas_error ivas_td_decorr_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); } set_f( hTdDecorr_loc->look_ahead_buf, 0, (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ); + #ifdef JBM_TSM_ON_TCS hTdDecorr_loc->offset = (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); #endif @@ -539,3 +550,27 @@ void ivas_td_decorr_process( return; } + +/*-----------------------------------------------------------------------------------------* + * Function ivas_td_decorr_bitrate_check() + * + * TD decorr bitrate and outfit_config check call + *-----------------------------------------------------------------------------------------*/ + +#ifdef TD_DECORR_DIS +void ivas_td_decorr_bitrate_check( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + AUDIO_CONFIG output_config, /* i : output config. */ + Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ +) +{ + if ( ivas_total_brate == IVAS_512k && output_config == AUDIO_CONFIG_FOA ) + { + st_ivas->td_decorr_flag = 1; + } + else + { + st_ivas->td_decorr_flag = 0; + } +} +#endif \ No newline at end of file diff --git a/lib_com/options.h b/lib_com/options.h index be54df0c71..5d5fb6d896 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -223,6 +223,8 @@ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ +#define TD_DECORR_DIS /* Dlb : Issue 163 : Malloc of td_deccor structure at 512 kbps and output configuration FOA*/ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d5982c63a0..7606ea18fd 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -695,6 +695,9 @@ ivas_error ivas_init_decoder( hDecoderConfig->last_ivas_total_brate = ivas_total_brate; st_ivas->last_active_ivas_total_brate = ivas_total_brate; +#ifdef TD_DECORR_DIS + ivas_td_decorr_bitrate_check( ivas_total_brate, output_config, st_ivas ); +#endif if ( output_config == AUDIO_CONFIG_EXTERNAL ) { @@ -1840,7 +1843,12 @@ void ivas_destroy_dec( } /* SPAR handle */ - ivas_spar_dec_close( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); + ivas_spar_dec_close( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 +#ifdef TD_DECORR_DIS + , + st_ivas->td_decorr_flag +#endif + ); /* HOA decoder matrix */ if ( st_ivas->hoa_dec_mtx != NULL ) @@ -1863,7 +1871,14 @@ void ivas_destroy_dec( #ifdef MC_PARAMUPMIX_MODE /* Param-Upmix MC handle */ - ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) + { +#endif + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); +#ifdef TD_DECORR_DIS + } +#endif #endif /* Parametric MC handle */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 2c9fcbd008..aad2c5b24d 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1244,10 +1244,14 @@ ivas_error ivas_masa_dec_reconfigure( /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ - if ( st_ivas->hDiracDecBin != NULL ) { - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) +#ifdef TD_DECORR_DIS + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index 59d215e22c..4abf4cea34 100755 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -133,7 +133,12 @@ ivas_error ivas_mcmasa_dec_reconfig( { #ifdef FIX_417_TD_DECORR_BRATE_SW /* if necessary, close/open td-decorrs */ - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) +#ifdef TD_DECORR_DIS + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 19a0909461..519988b40c 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1311,7 +1311,12 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hDiracDecBin != NULL ) { - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) +#ifdef TD_DECORR_DIS + , + 0 +#endif + ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 0dcaec91da..ea105f5494 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -181,8 +181,12 @@ ivas_error ivas_sba_dec_reconfigure( ) { - ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); - + ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 +#ifdef TD_DECORR_DIS + , + st_ivas->td_decorr_flag +#endif + ); if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) { return error; @@ -359,7 +363,12 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hDiracDecBin != NULL ) { - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) +#ifdef TD_DECORR_DIS + , + st_ivas->td_decorr_flag +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -464,7 +473,14 @@ ivas_error ivas_sba_dec_digest_tc( while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); - ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) + { +#endif + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); +#ifdef TD_DECORR_DIS + } +#endif for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) { decorr_signal[ch_idx] += nSamplesToDecorr; diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index d1104594a1..b6b568ab5d 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -110,10 +110,17 @@ ivas_error ivas_spar_dec_open( #ifdef HODIRAC /* TD decorr. */ - if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) { - return error; +#endif + if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef TD_DECORR_DIS } +#endif #else /* TD decorr. */ if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_channels_internal, 1 ) ) != IVAS_ERR_OK ) @@ -265,6 +272,10 @@ void ivas_spar_dec_close( SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ +#ifdef TD_DECORR_DIS + , + const int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ +#endif ) { if ( *hSpar == NULL || hSpar == NULL ) @@ -276,8 +287,14 @@ void ivas_spar_dec_close( ivas_spar_md_dec_close( &( *hSpar )->hMdDec ); /* TD decorrelator handle */ - ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); - +#ifdef TD_DECORR_DIS + if ( !td_decorr_flag ) + { +#endif + ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); +#ifdef TD_DECORR_DIS + } +#endif /* FB mixer handle */ ivas_FB_mixer_close( &( *hSpar )->hFbMixer, output_Fs, spar_reconfig_flag ); @@ -757,8 +774,14 @@ static void ivas_spar_dec_MD( if ( hSpar->hMdDec->table_idx != table_idx ) { hSpar->hMdDec->table_idx = table_idx; - hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; - +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) + { +#endif + hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; +#ifdef TD_DECORR_DIS + } +#endif ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); } } @@ -1271,26 +1294,40 @@ void ivas_spar_dec_digest_tc( while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); - ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); -#ifdef HODIRAC - if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) { - for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); - } +#endif + ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); +#ifdef TD_DECORR_DIS } - else +#endif +#ifdef HODIRAC +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) { - for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) +#endif + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { - set_zero( p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } } - for ( ch = 0; ch < hSpar->hTdDecorr->num_apd_outputs; ch++ ) + else { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) + { + set_zero( p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } + for ( ch = 0; ch < hSpar->hTdDecorr->num_apd_outputs; ch++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } } +#ifdef TD_DECORR_DIS } +#endif #else for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) { @@ -1348,26 +1385,40 @@ void ivas_spar_dec_upmixer( } if ( hSpar->hMdDec->td_decorr_flag ) { - ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); -#ifdef HODIRAC - if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) { - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); - } +#endif + ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); +#ifdef TD_DECORR_DIS } - else +#endif +#ifdef HODIRAC +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) { - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) +#endif + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { - set_zero( st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } } - for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) + else { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + set_zero( st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } + for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } } +#ifdef TD_DECORR_DIS } +#endif #else for ( i = 0; i < nchan_internal - nchan_transport; i++ ) { diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index bfca6c6280..1889cbacf6 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1064,18 +1064,10 @@ void ivas_spar_md_dec_process( } #ifdef HODIRAC - ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, + ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, num_md_chs, active_w_vlbr ); #else - ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, + ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, sba_order, active_w_vlbr ); #endif -#ifdef HODIRAC - num_md_chs, -#else - sba_order, -#endif - active_w_vlbr - - ); #ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 727b01c0ed..c13874aa00 100755 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1365,6 +1365,10 @@ typedef struct Decoder_Struct #ifdef JBM_TSM_ON_TCS DECODER_TC_BUFFER_HANDLE hTcBuffer; #endif + +#ifdef TD_DECORR_DIS + int16_t td_decorr_flag; /* Disable malloc for td_decorr structure flag */ +#endif } Decoder_Struct; /* clang-format on */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 06fd160bb2..aa7902ffcf 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -358,7 +358,12 @@ ivas_error ivas_dirac_dec_init_binaural_data( hBinaural->useTdDecorr = 0; } - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hBinaural->hTdDecorr ), &( hBinaural->useTdDecorr ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hBinaural->hTdDecorr ), &( hBinaural->useTdDecorr ) +#ifdef TD_DECORR_DIS + , + st_ivas->td_decorr_flag +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -383,6 +388,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( } else { + ivas_td_decorr_dec_open( &( hBinaural->hTdDecorr ), output_Fs, 3, 0 ); } } @@ -614,7 +620,14 @@ void ivas_dirac_dec_binaural( output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); #ifdef JBM_TSM_ON_TCS { - ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); +#ifdef TD_DECORR_DIS + if ( !st_ivas->td_decorr_flag ) + { +#endif + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); +#ifdef TD_DECORR_DIS + } +#endif } #else ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame ); diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 12a8b55ddb..3db8e0990b 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1770,9 +1770,9 @@ void ivas_binaural_reverb_processFrame( /* Add from temporally decaying sparse tap locations the audio to the output. */ for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) { +#ifdef JBM_TSM_ON_TCS switch ( phaseShiftTypePr[tapIdx] ) { -#ifdef JBM_TSM_ON_TCS case 0: /* 0 degrees phase */ v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); @@ -1789,7 +1789,10 @@ void ivas_binaural_reverb_processFrame( v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); break; + } #else + switch ( phaseShiftTypePr[tapIdx] ) + { case 0: /* 0 degrees phase */ v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); @@ -1806,8 +1809,8 @@ void ivas_binaural_reverb_processFrame( v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); break; -#endif } +#endif } } -- GitLab From 4c636c532ed92875308b4ca4b1b0e6955dcafd8e Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Fri, 19 May 2023 17:06:20 +0530 Subject: [PATCH 047/381] clang-format-fix --- lib_com/ivas_td_decorr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index c54c100385..5617702958 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -573,4 +573,4 @@ void ivas_td_decorr_bitrate_check( st_ivas->td_decorr_flag = 0; } } -#endif \ No newline at end of file +#endif -- GitLab From f55fd4653d9cd90bcbd4cc54496898d1dd3aaf9b Mon Sep 17 00:00:00 2001 From: Fredrik Jansson Date: Mon, 22 May 2023 10:09:27 +0200 Subject: [PATCH 048/381] Fix changed to not run stereo_dft_enc_update --- lib_com/ivas_prot.h | 4 ---- lib_com/options.h | 2 +- lib_enc/ivas_cpe_enc.c | 4 +--- lib_enc/ivas_stereo_dft_enc.c | 27 ++++++++++++++++++--------- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 8e739a5c00..d3a1eda3cc 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1165,11 +1165,7 @@ void stereo_enc_itd_init( void stereo_dft_enc_update( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder DFT stereo handle */ -#ifdef FIX_395_CNG_BW - const int16_t bwidth /* i : encoded bandwidth */ -#else const int16_t max_bwidth /* i : maximum encoded bandwidth */ -#endif ); void stereo_dft_enc_destroy( diff --git a/lib_com/options.h b/lib_com/options.h index 1fe68fdd85..2e4f792aa1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,7 @@ #define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ #define FIX_MDCT_ST_PLC_FADEOUT_DELAY #define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ -#define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ +#define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ #define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 268ad20de7..03c3f1e0a1 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -578,9 +578,7 @@ ivas_error ivas_cpe_enc( #ifdef DEBUG_MODE_DFT hCPE->hStereoDft->res_cod_bits = 0; #endif -#ifdef FIX_395_CNG_BW - stereo_dft_enc_update( hCPE->hStereoDft, min( SWB, sts[0]->bwidth ) ); -#else +#ifndef FIX_395_CNG_BW stereo_dft_enc_update( hCPE->hStereoDft, min( SWB, sts[0]->max_bwidth ) ); #endif } diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index be4e0c0631..202d202965 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -582,11 +582,7 @@ void stereo_enc_itd_init( void stereo_dft_enc_update( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ -#ifdef FIX_395_CNG_BW - const int16_t bwidth /* i : encoded bandwidth */ -#else const int16_t max_bwidth /* i : maximum encoded bandwidth */ -#endif ) { int16_t i, k_offset; @@ -632,13 +628,9 @@ void stereo_dft_enc_update( hStereoDft->last_res_cod_mode_modify_flag = hStereoDft->res_cod_sw_flag; hStereoDft->res_cod_sw_flag = 0; -#ifdef FIX_395_CNG_BW - /* update band limits in case of rate switching */ - NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[bwidth] / L_FRAME48k; -#else /* update band limits in case of rate switching assuming max_bwidth as BWD output not yet know here */ NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[max_bwidth] / L_FRAME48k; -#endif + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->hConfig->band_res, NFFT_inner, ENC ); hStereoDft->nbands_dmx = stereo_dft_band_config( hStereoDft->band_limits_dmx, 1, NFFT_inner, ENC ); @@ -2177,6 +2169,22 @@ void stereo_dft_enc_write_BS( nbands_full = hStereoDft->nbands; +#ifdef FIX_395_CNG_BW + if ( core_brate == FRAME_NO_DATA || core_brate == SID_2k40 ) + { + NFFT_inner = min( STEREO_DFT_N_32k_ENC, STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k ); + hStereoDft->band_res[k_offset] = hStereoDft->hConfig->band_res; + hStereoDft->res_pred_mode[k_offset] = 0; + hStereoDft->res_cod_mode[k_offset] = 0; + } + else + { + NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; + } + + /* set number of bands according to bandwidth after BWD */ + hStereoDft->nbands = stereo_dft_band_config(hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC); +#else NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; if ( !( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) ) @@ -2184,6 +2192,7 @@ void stereo_dft_enc_write_BS( /* set number of bands according to bandwidth after BWD */ hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); } +#endif if ( core_brate == FRAME_NO_DATA ) { -- GitLab From 09a3295e5c70d1d72838a829abf990a16bc166c2 Mon Sep 17 00:00:00 2001 From: Fredrik Jansson Date: Mon, 22 May 2023 10:21:19 +0200 Subject: [PATCH 049/381] clang format fixed --- lib_enc/ivas_stereo_dft_enc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 202d202965..65e193cdcd 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -582,7 +582,7 @@ void stereo_enc_itd_init( void stereo_dft_enc_update( STEREO_DFT_ENC_DATA_HANDLE hStereoDft, /* i/o: encoder stereo handle */ - const int16_t max_bwidth /* i : maximum encoded bandwidth */ + const int16_t max_bwidth /* i : maximum encoded bandwidth */ ) { int16_t i, k_offset; @@ -2183,7 +2183,7 @@ void stereo_dft_enc_write_BS( } /* set number of bands according to bandwidth after BWD */ - hStereoDft->nbands = stereo_dft_band_config(hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC); + hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); #else NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; -- GitLab From 990860594ddda904b5a26401745197596ba1ecc8 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Mon, 22 May 2023 14:53:10 +0200 Subject: [PATCH 050/381] Fix #393, #459. #460, #494, all related to the DirAC metadata buffers and the read index used to access them. Non-BE, under define FIX_393_459_460_SBA_MD, active --- lib_com/ivas_dirac_com.c | 2 + lib_com/ivas_prot.h | 10 +- lib_com/ivas_stat_com.h | 2 + lib_com/options.h | 1 + lib_dec/ivas_dirac_dec.c | 177 ++++++++++++++++++++-- lib_dec/ivas_dirac_output_synthesis_dec.c | 18 ++- 6 files changed, 194 insertions(+), 16 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index d0b4c5a4db..60269cf841 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -173,8 +173,10 @@ ivas_error ivas_dirac_config( } hConfig->enc_param_start_band = 0; hConfig->dec_param_estim = FALSE; +#ifndef FIX_393_459_460_SBA_MD #ifdef FIX_391_SBA hConfig->dec_param_estim_old = hConfig->dec_param_estim; +#endif #endif if ( ivas_format == SBA_FORMAT ) /* skip for MASA decoder */ { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 672b5a7441..228f5d4252 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3878,8 +3878,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const float *onset_filter #ifdef HODIRAC , +#ifdef FIX_393_459_460_SBA_MD + float *diffuseness, +#else #ifdef JBM_TSM_ON_TCS const int16_t md_idx, +#endif #endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif @@ -3891,7 +3895,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ #ifdef JBM_TSM_ON_TCS const int16_t nbslots, /* i : number of slots to process */ - const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ +#ifdef FIX_393_459_460_SBA_MD + float *diffuseness_vector, /* i : diffuseness (needed for direction smoothing)*/ +#else + const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ +#endif #endif float *reference_power_smooth, float qualityBasedSmFactor diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index e2f2e0f1f2..e4070f9419 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -185,8 +185,10 @@ typedef struct ivas_dirac_config_data_struct { int16_t enc_param_start_band; int16_t dec_param_estim; +#ifndef FIX_393_459_460_SBA_MD #ifdef FIX_391_SBA int16_t dec_param_estim_old; +#endif #endif int16_t nbands; diff --git a/lib_com/options.h b/lib_com/options.h index de0967fc1a..26680b3fd9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -210,6 +210,7 @@ #define JBM_TSM_ON_TCS /* FhG: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ #define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ +#define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index c5485119ba..8bad981b06 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1123,8 +1123,10 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_bs_md_write_idx = 0; hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; +#ifndef FIX_393_459_460_SBA_MD #ifdef FIX_391_SBA hDirAC->hConfig->dec_param_estim_old = hDirAC->hConfig->dec_param_estim; +#endif #endif if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { @@ -1162,7 +1164,11 @@ ivas_error ivas_dirac_dec_config( if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) { +#ifdef FIX_393_459_460_SBA_MD + hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; +#else hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES * num_slots_in_subfr; +#endif hDirAC->dirac_bs_md_write_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; hDirAC->dirac_read_idx = 0; @@ -1170,9 +1176,15 @@ ivas_error ivas_dirac_dec_config( } else { +#ifdef FIX_393_459_460_SBA_MD + hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ); + hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; + hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; +#else hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; +#endif hDirAC->dirac_read_idx = 0; hDirAC->dirac_estimator_idx = 0; } @@ -1180,9 +1192,17 @@ ivas_error ivas_dirac_dec_config( { int16_t map_idx; set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); +#ifdef FIX_393_459_460_SBA_MD + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS * num_slots_in_subfr; map_idx++ ) +#else for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) +#endif { +#ifdef FIX_393_459_460_SBA_MD + hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx / num_slots_in_subfr; +#else hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; +#endif } } #endif @@ -1337,6 +1357,7 @@ ivas_error ivas_dirac_dec_config( hDirAC->dithering_seed = DIRAC_DITH_SEED; st_ivas->hDirAC = hDirAC; } +#ifndef FIX_393_459_460_SBA_MD #ifdef FIX_391_SBA else if ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) { @@ -1497,6 +1518,7 @@ ivas_error ivas_dirac_dec_config( } } #endif +#endif #ifdef JBM_TSM_ON_TCS /* allocate transport channels*/ if ( flag_config == DIRAC_OPEN ) @@ -2462,7 +2484,11 @@ void ivas_qmetadata_to_dirac( int16_t *seed_ptr; int16_t band_start, band_end, diff_idx; float diffuseness; - int16_t ts_start, ts_end, ts, b, ele, azi; +#ifndef FIX_393_459_460_SBA_MD + int16_t ts_start, ts_end, ts; +#else + int16_t b, ele, azi; +#endif float azimuth, elevation; IVAS_QDIRECTION *q_direction; int16_t *band_mapping; @@ -2561,15 +2587,18 @@ void ivas_qmetadata_to_dirac( } else /* SBA mode/SID/Zero frame*/ { +#ifndef FIX_393_459_460_SBA_MD int16_t num_slots_in_subfr; +#endif int16_t tmp_write_idx_param_band; int16_t tmp_write_idx_band; #ifdef HODIRAC float diffuseness_sec = 0.f; #endif +#ifndef FIX_393_459_460_SBA_MD num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; - +#endif /* ungroup */ seed_ptr = &hDirAC->dithering_seed; nblocks = q_direction->cfg.nblocks; @@ -2624,8 +2653,10 @@ void ivas_qmetadata_to_dirac( #endif { #ifdef JBM_TSM_ON_TCS +#ifndef FIX_393_459_460_SBA_MD ts_start = hDirAC->block_grouping[block]; ts_end = hDirAC->block_grouping[block + 1]; +#endif #endif for ( b = band_start; b < band_end; b++ ) { @@ -2635,8 +2666,10 @@ void ivas_qmetadata_to_dirac( hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; #ifdef JBM_TSM_ON_TCS +#ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { +#endif hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; @@ -2645,6 +2678,7 @@ void ivas_qmetadata_to_dirac( hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; +#ifndef FIX_393_459_460_SBA_MD } else { @@ -2661,6 +2695,7 @@ void ivas_qmetadata_to_dirac( tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } +#endif #endif } } @@ -2704,8 +2739,10 @@ void ivas_qmetadata_to_dirac( { int16_t block_qmetadata; +#ifndef FIX_393_459_460_SBA_MD ts_start = hDirAC->block_grouping[block]; ts_end = hDirAC->block_grouping[block + 1]; +#endif block_qmetadata = min( block, nblocks - 1 ); block_qmetadata = max( block_qmetadata, 0 ); @@ -2779,8 +2816,10 @@ void ivas_qmetadata_to_dirac( hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0]; +#ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { +#endif hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; @@ -2807,6 +2846,7 @@ void ivas_qmetadata_to_dirac( hDirAC->elevation[tmp_write_idx_band][b] = ele; hDirAC->azimuth[tmp_write_idx_band][b] = azi; } +#ifndef FIX_393_459_460_SBA_MD } else { @@ -2818,9 +2858,13 @@ void ivas_qmetadata_to_dirac( tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } +#endif } - +#ifdef FIX_393_459_460_SBA_MD + tmp_write_idx_param_band = ( tmp_write_idx_param_band + 1 ) % hDirAC->dirac_md_buffer_length; +#else tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hDirAC->dirac_md_buffer_length; +#endif } /* for ( block =...) */ } /* for ( band = ...) */ @@ -2836,15 +2880,19 @@ void ivas_qmetadata_to_dirac( for ( block = 0; block < hDirAC->nb_subframes; block++ ) #endif { +#ifndef FIX_393_459_460_SBA_MD ts_start = hDirAC->block_grouping[block]; ts_end = hDirAC->block_grouping[block + 1]; +#endif hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; hDirAC->energy_ratio1[block][b] = 0; +#ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { +#endif hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; @@ -2854,6 +2902,7 @@ void ivas_qmetadata_to_dirac( hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; #endif tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; +#ifndef FIX_393_459_460_SBA_MD } else { @@ -2870,20 +2919,24 @@ void ivas_qmetadata_to_dirac( tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } +#endif } } } - /* update buffer write index */ +/* update buffer write index */ +#ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { +#endif hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length; +#ifndef FIX_393_459_460_SBA_MD } else { hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + CLDFB_NO_COL_MAX ) % hDirAC->dirac_md_buffer_length; } - +#endif return; } @@ -2909,14 +2962,18 @@ void ivas_dirac_dec_set_md_map( /* adapt subframes */ hDirAC->num_slots = nCldfbTs; hDirAC->slots_rendered = 0; +#ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hParamIsm != NULL || hDirAC->hConfig->dec_param_estim == 0 ) { +#endif num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; +#ifndef FIX_393_459_460_SBA_MD } else { num_slots_in_subfr = 1; } +#endif hDirAC->subframes_rendered = 0; ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hDirAC->subframe_nbslots, &hDirAC->nb_subframes ); @@ -3090,9 +3147,9 @@ void ivas_dirac_dec( #else void ivas_dirac_dec_render_sf( #endif - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef JBM_TSM_ON_TCS - float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ #else float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ #endif @@ -3132,9 +3189,15 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS /* local copies of azi, ele, diffuseness */ +#ifdef FIX_393_459_460_SBA_MD + int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; + int16_t elevation[CLDFB_NO_CHANNELS_MAX]; + float diffuseness_vector[CLDFB_NO_CHANNELS_MAX]; +#else int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float diffuseness_vector[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; +#endif #endif DIRAC_DEC_STACK_MEM DirAC_mem; @@ -3249,7 +3312,18 @@ void ivas_dirac_dec_render_sf( #endif /* copy parameters into local buffers*/ - +#ifdef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth, hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation, hDirAC->num_freq_bands ); + mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector, hDirAC->num_freq_bands ); + } + else + { + set_zero( diffuseness_vector, hDirAC->num_freq_bands ); + } +#else if ( hDirAC->hConfig->dec_param_estim == TRUE ) { for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) @@ -3268,7 +3342,7 @@ void ivas_dirac_dec_render_sf( mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); } } - +#endif #endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) @@ -3297,21 +3371,28 @@ void ivas_dirac_dec_render_sf( if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; +#ifdef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + } +#else #ifdef JBM_TSM_ON_TCS - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) #else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) #endif - { + { #ifdef JBM_TSM_ON_TCS - rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); #else /* note, this seems wrong since it does not take the dirac read ptr into account */ index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); #endif - } + } +#endif } } #if defined( JBM_TSM_ON_TCS ) & !defined( FIX_642 ) @@ -3331,7 +3412,11 @@ void ivas_dirac_dec_render_sf( { ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands, #ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + diffuseness_vector, +#else diffuseness_vector[0], +#endif #else hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], #endif @@ -3396,8 +3481,13 @@ void ivas_dirac_dec_render_sf( st_ivas->hVBAPdata, st_ivas->hMasa, #ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation, +#else hDirAC->azimuth[md_idx], hDirAC->elevation[md_idx], +#endif md_idx, #endif surCohRatio, @@ -3415,8 +3505,13 @@ void ivas_dirac_dec_render_sf( st_ivas->hVBAPdata, st_ivas->hMasa, #ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation, +#else hDirAC->azimuth[md_idx], hDirAC->elevation[md_idx], +#endif md_idx, #endif surCohRatio, @@ -3623,6 +3718,18 @@ void ivas_dirac_dec_render_sf( if ( hDirAC->hConfig->dec_param_estim == TRUE ) { +#ifdef FIX_393_459_460_SBA_MD + mvs2s( &hDirAC->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); + mvs2s( &hDirAC->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); +#ifdef FIX_393_459_460_SBA_MD + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + } +#endif +#endif + hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ index = hDirAC->index_buffer_intensity; @@ -3640,8 +3747,13 @@ void ivas_dirac_dec_render_sf( hDirAC->buffer_intensity_real[2][index - 1], num_freq_bands, #ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation +#else azimuth[slot_idx], elevation[slot_idx] +#endif #else hDirAC->azimuth[hDirAC->dirac_estimator_idx], hDirAC->elevation[hDirAC->dirac_estimator_idx] @@ -3654,12 +3766,17 @@ void ivas_dirac_dec_render_sf( hDirAC->buffer_energy, num_freq_bands, #ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + hDirAC->diffuseness_vector[md_idx] +#else diffuseness_vector[slot_idx] +#endif #else hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] #endif ); + #ifndef JBM_TSM_ON_TCS hDirAC->dirac_estimator_idx = ( hDirAC->dirac_estimator_idx + 1 ) % hDirAC->dirac_md_buffer_length; #endif @@ -3831,9 +3948,15 @@ void ivas_dirac_dec_render_sf( { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation, + hDirAC->diffuseness_vector[md_idx], +#else azimuth[slot_idx], elevation[slot_idx], diffuseness_vector[slot_idx], +#endif hDirAC, st_ivas->hHeadTrackData->shd_rot_max_order, p_Rmat, @@ -3851,9 +3974,15 @@ void ivas_dirac_dec_render_sf( { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation, + hDirAC->diffuseness_vector[md_idx], +#else azimuth[slot_idx], elevation[slot_idx], diffuseness_vector[slot_idx], +#endif hDirAC, 0, 0, @@ -3868,6 +3997,13 @@ void ivas_dirac_dec_render_sf( } #endif +#ifdef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim ) + { + v_multc_acc( hDirAC->diffuseness_vector[md_idx], 0.25f, diffuseness_vector, hDirAC->num_freq_bands ); + } +#endif + if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands ); @@ -3889,6 +4025,7 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); +#ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { md_idx = hDirAC->render_to_md_map[subframe_idx]; @@ -3897,7 +4034,9 @@ void ivas_dirac_dec_render_sf( { md_idx = hDirAC->render_to_md_map[slot_idx_start]; } +#endif +#ifndef FIX_393_459_460_SBA_MD /* Workaround for BE (should be gone when #393 is adressed and diffuseness index in the gain SHD renderer with HO-DirAC is fixed) */ /* :TODO: remove */ /* get the correct md index for the diffuseness in direction smoothing and HO-DirAC, it is always the first slot of the next subframe*/ @@ -3924,6 +4063,7 @@ void ivas_dirac_dec_render_sf( md_idx = hDirAC->render_to_md_map[subframe_idx + 1]; } } +#endif #endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) @@ -3938,8 +4078,12 @@ void ivas_dirac_dec_render_sf( p_onset_filter #ifdef HODIRAC , +#ifdef FIX_393_459_460_SBA_MD + diffuseness_vector, +#else #ifdef JBM_TSM_ON_TCS md_idx, +#endif #endif hodirac_flag #endif @@ -3956,6 +4100,7 @@ void ivas_dirac_dec_render_sf( qualityBasedSmFactor *= qualityBasedSmFactor; } #ifdef JBM_TSM_ON_TCS +#ifndef FIX_393_459_460_SBA_MD /* Workaround for BE (should be gone when #393 is adressed) */ if ( hDirAC->hConfig->dec_param_estim == 1 ) { @@ -3967,7 +4112,7 @@ void ivas_dirac_dec_render_sf( mvr2r( diffuseness_vector[slot_idx], hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); } } - +#endif #endif ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, @@ -3975,7 +4120,11 @@ void ivas_dirac_dec_render_sf( hDirAC, #ifdef JBM_TSM_ON_TCS hDirAC->subframe_nbslots[subframe_idx], +#ifdef FIX_393_459_460_SBA_MD + diffuseness_vector, +#else md_idx, +#endif #endif reference_power_smooth, qualityBasedSmFactor ); diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index f88b5f5f3a..7b11b7dcac 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -875,8 +875,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const float *onset_filter #ifdef HODIRAC , +#ifdef FIX_393_459_460_SBA_MD + float *diffuseness, +#else #ifdef JBM_TSM_ON_TCS const int16_t md_idx, +#endif #endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ #endif @@ -902,7 +906,9 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( #ifdef HODIRAC float aux_buf[CLDFB_NO_CHANNELS_MAX]; float ratio[DIRAC_HO_NUMSECTORS * CLDFB_NO_CHANNELS_MAX]; +#ifndef FIX_393_459_460_SBA_MD const float *diffuseness; +#endif #endif /* collect some often used parameters */ @@ -918,11 +924,13 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( nchan_transport_foa = min( 4, nchan_transport ); #ifdef HODIRAC +#ifndef FIX_393_459_460_SBA_MD #ifdef JBM_TSM_ON_TCS diffuseness = hDirAC->diffuseness_vector[md_idx]; #else diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; #endif +#endif #endif /*-----------------------------------------------------------------* @@ -1356,8 +1364,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ #ifdef JBM_TSM_ON_TCS - const int16_t nbslots, /* i : number of slots to process */ + const int16_t nbslots, /* i : number of slots to process */ +#ifdef FIX_393_459_460_SBA_MD + float *diffuseness_vector, +#else const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ +#endif #endif float *reference_power_smooth, float qualityBasedSmFactor ) @@ -1487,8 +1499,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /* TODO: check this, seems buggy in the case of parame estim on the decoder side, because the pointer here points already to the following subframe, ist this intended?*/ #ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + instDirectionSmoothness = 1.0f - diffuseness_vector[l]; +#else /* Workaround for BE */ instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[diff_md_idx][l]; /* Currently, all subframes have same energy ratio value. */ +#endif #else instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx][l]; /* Currently, all subframes have same energy ratio value. */ #endif -- GitLab From 874d1940d6136fba2e766aad2b57c274196e2fe1 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 23 May 2023 08:22:00 +0200 Subject: [PATCH 051/381] ISM_FB - 1ISM 32 kbps: change SWB to FB coding ISM_25k6_HZ_CORE - 1ISM 48 kbps: change ACELP/TCX 16 kHz core to TCX only 25.6 kHz core --- lib_com/core_com_config.c | 41 ++++++++++++++++++++++++++++++ lib_com/ivas_cnst.h | 6 +++++ lib_com/ivas_prot.h | 7 +++++ lib_com/options.h | 7 +++-- lib_com/prot.h | 12 +++++++++ lib_dec/core_dec_init.c | 15 +++++++++-- lib_dec/core_dec_switch.c | 7 ++++- lib_dec/evs_dec.c | 7 ++++- lib_dec/init_dec.c | 3 ++- lib_dec/ivas_sce_dec.c | 11 ++++++++ lib_dec/ivas_tcx_core_dec.c | 14 ++++++++-- lib_enc/bw_detect.c | 15 ++++++++++- lib_enc/core_enc_init.c | 14 ++++++++-- lib_enc/core_enc_switch.c | 21 ++++++++++++--- lib_enc/init_enc.c | 8 ++++++ lib_enc/ivas_core_enc.c | 7 ++++- lib_enc/ivas_core_pre_proc.c | 14 +++++++++- lib_enc/ivas_core_pre_proc_front.c | 11 +++++++- lib_enc/ivas_cpe_enc.c | 17 +++++++++++-- lib_enc/ivas_decision_matrix_enc.c | 15 +++++++++++ lib_enc/ivas_ism_dtx_enc.c | 7 ++++- lib_enc/ivas_ism_enc.c | 8 +++++- lib_enc/ivas_sce_enc.c | 7 ++++- lib_enc/ivas_tcx_core_enc.c | 7 ++++- lib_enc/pre_proc.c | 7 ++++- lib_enc/stat_enc.h | 4 +++ lib_enc/updt_enc.c | 7 ++++- 27 files changed, 273 insertions(+), 26 deletions(-) diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index 7f9b385c3f..3d37fb03b6 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -166,6 +166,10 @@ int16_t getTcxonly( const int16_t element_mode, /* i : IVAS element mode */ const int32_t total_brate, /* i : total bitrate */ const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ +#ifdef ISM_25k6_HZ_CORE + , + const int16_t is_ism_format +#endif ) { int16_t tcxonly = 0; @@ -179,6 +183,24 @@ int16_t getTcxonly( } break; case IVAS_SCE: +#ifdef ISM_25k6_HZ_CORE + if ( is_ism_format ) + { + if ( total_brate > MAX_ACELP_BRATE_ISM ) + { + tcxonly = 1; + } + } + else + { + if ( total_brate > MAX_ACELP_BRATE ) + { + tcxonly = 1; + } + } + break; + +#endif case IVAS_CPE_DFT: case IVAS_CPE_TD: if ( total_brate > MAX_ACELP_BRATE ) @@ -341,6 +363,10 @@ int32_t getCoreSamplerateMode2( const int16_t bwidth, /* i : audio bandwidth */ const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ const int16_t rf_mode /* i : flag to signal the RF mode */ +#ifdef ISM_25k6_HZ_CORE + , + const IVAS_FORMAT is_ism_format +#endif ) { int32_t sr_core = 0; @@ -361,10 +387,25 @@ int32_t getCoreSamplerateMode2( { sr_core = INT_FS_16k; } +#ifdef ISM_25k6_HZ_CORE + else if ( ( bwidth == SWB || bwidth == FB ) && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && !is_ism_format ) + { + sr_core = INT_FS_16k; + } + else if ( ( bwidth == SWB || bwidth == FB ) && total_brate <= MAX_ACELP_BRATE_ISM && element_mode == IVAS_SCE && is_ism_format ) + { + sr_core = INT_FS_16k; + } + else if ( ( bwidth == SWB || bwidth == FB ) && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && is_ism_format ) + { + sr_core = 25600; + } +#else else if ( ( bwidth == SWB && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE ) || ( bwidth == FB && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE ) ) { sr_core = INT_FS_16k; } +#endif else if ( ( ( bwidth == SWB || bwidth == FB ) && element_mode == EVS_MONO && total_brate <= HQ_64k ) || ( element_mode > IVAS_SCE && ( ( bwidth == SWB && total_brate <= IVAS_96k ) || ( bwidth == FB && total_brate <= IVAS_96k ) ) ) ) { sr_core = 25600; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index f709195ad0..38cbd94a72 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -290,6 +290,9 @@ typedef enum #define MAX_VOICED_BRATE ACELP_13k20 /* max. per channel bitrate where VOICED is supported */ #define MIN_TC_BRATE 6450 /* min. per channel bitrate where TRANSITION is supported */ #define MAX_ACELP_BRATE 48000 /* max. per channel bitrate where ACELP core is supported */ +#ifdef ISM_25k6_HZ_CORE +#define MAX_ACELP_BRATE_ISM 40000 /* max. per channel bitrate where ACELP core is supported in ISM format */ +#endif #define ACELP_12k8_HIGH_LIMIT 24350 /* max. per channel bitrate where the ACELP@12.8kHz is supported */ #define ACELP_16k_LOW_LIMIT 13250 /* min. per channel bitrate where the ACELP@16kHz is supported */ @@ -317,6 +320,9 @@ typedef enum #define MIN_BRATE_SWB_SCE ACELP_9k60 /* min. SCE bitrate where SWB is supported */ #define MIN_BRATE_SWB_STEREO IVAS_13k2 /* min. stereo bitrate where SWB is supported */ #define MIN_BRATE_FB_STEREO IVAS_32k /* min. SCE and stereo bitrate where FB is supported */ +#ifdef ISM_FB +#define MIN_BRATE_FB_STEREO_ISM 24000 /* min. SCE bitrate where FB is supported in ISM format */ +#endif #define MIN_TDM_BRATE_WB_TBE_1k05 12000 /* min. per channel bitrate where WB TBE @1.05 kbps is supported (0.35kbs at lower bitrates) */ #define MIN_BRATE_WB_TBE_1k05 9650 /* min. per channel bitrate where WB TBE @1.05 kbps is supported (0.35kbs at lower bitrates) */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index ace91a63eb..44962f68e3 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -203,6 +203,9 @@ ivas_error pre_proc_front_ivas( const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ const int32_t ivas_total_brate /* i : IVAS total bitrate */ +#ifdef ISM_FB + ,const ISM_MODE ism_mode +#endif ); ivas_error pre_proc_ivas( @@ -584,6 +587,10 @@ void ivas_signaling_enc( const int32_t element_brate, /* i : element bitrate */ const int16_t tdm_SM_flag, /* i : channel combination scheme flag in TD stereo */ const int16_t tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo*/ +#ifdef ISM_FB + , + const ISM_MODE ism_mode +#endif ); void ivas_decision_matrix_dec( diff --git a/lib_com/options.h b/lib_com/options.h index 240263cf77..53a524d740 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -222,8 +222,11 @@ -#define ISM_16_KHZ_CORE // change starting bitrate of core-coder with 16kHz internal sampling rate from 17 kbps to 15.9 kbps - // VE: 4ISM 64 kbps extend metadata cases might fail due to too high bitbudget for ext. MD + 4 x 16kHz core +#define ISM_16_KHZ_CORE // 1ISM 16.4 kbps: change starting bitrate of core-coder with 16kHz internal sampling rate from 17 kbps to 15.9 kbps +#define ISM_FB // 1ISM 32 kbps: change SWB to FB coding +#define ISM_25k6_HZ_CORE // 1ISM 48 kbps: change ACELP/TCX 16 kHz core to TCX only 25.6 kHz core + + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/prot.h b/lib_com/prot.h index b290372d4f..dee228e4c4 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -3834,6 +3834,10 @@ void set_bw( const int32_t element_brate, /* i : element bitrate */ Encoder_State *st, /* i/o: Encoder State */ const int16_t codec_mode /* i : codec mode */ +#ifdef ISM_FB + , + const ISM_MODE ism_mode +#endif ); float gaus_encode( @@ -9712,6 +9716,10 @@ int16_t getTcxonly( const int16_t element_mode, /* i : IVAS element mode */ const int32_t total_brate, /* i : total bitrate */ const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ +#ifdef ISM_25k6_HZ_CORE + , + const int16_t is_ism_format +#endif ); int16_t getTnsAllowed( @@ -9749,6 +9757,10 @@ int32_t getCoreSamplerateMode2( const int16_t bwidth, /* i : audio bandwidth */ const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ const int16_t rf_mode /* i : flag to signal the RF mode */ +#ifdef ISM_25k6_HZ_CORE + , + const IVAS_FORMAT is_ism_format +#endif ); float getTcxBandwidth( diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index aa8f576cec..d54ffe330e 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -73,7 +73,13 @@ void open_decoder_LPD( { st->fscale_old = st->fscale; } - st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag ); + + st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); st->fscale = sr2fscale( st->sr_core ); fscaleFB = sr2fscale( st->output_Fs ); @@ -92,7 +98,12 @@ void open_decoder_LPD( } } - st->tcxonly = getTcxonly( st->element_mode, total_brate, MCT_flag ); + st->tcxonly = getTcxonly( st->element_mode, total_brate, MCT_flag +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); /* the TD TCX PLC in MODE1 still runs with 80ms subframes */ if ( ( st->element_mode == EVS_MONO && st->L_frame == L_FRAME16k && total_brate <= ACELP_32k ) || ( st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k && total_brate <= MAX_ACELP_BRATE ) || ( st->tcxonly && ( st->sr_core == 32000 || st->sr_core == 16000 ) ) ) diff --git a/lib_dec/core_dec_switch.c b/lib_dec/core_dec_switch.c index ef0a12696f..3a5f163343 100644 --- a/lib_dec/core_dec_switch.c +++ b/lib_dec/core_dec_switch.c @@ -72,7 +72,12 @@ void mode_switch_decoder_LPD( { bSwitchFromAmrwbIO = 1; } - sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag ); + sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); fscale = sr2fscale( sr_core ); /* set number of coded lines */ diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 0d55b54762..74454a4676 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -187,7 +187,12 @@ ivas_error evs_dec( } /* if previous frame was HQ Core/TCX10/TCX20 (high bitrate), drop partial copy info and continue HQ Core/TCX10/TCX20 concealment */ - if ( st->use_partial_copy && ( st->last_core == HQ_CORE || st->last_core == TCX_10_CORE || ( st->last_core == TCX_20_CORE && getTcxonly( EVS_MONO, st->last_total_brate, 0 ) ) ) ) + if ( st->use_partial_copy && ( st->last_core == HQ_CORE || st->last_core == TCX_10_CORE || ( st->last_core == TCX_20_CORE && getTcxonly( EVS_MONO, st->last_total_brate, 0 +#ifdef ISM_25k6_HZ_CORE + , + 0 +#endif + ) ) ) ) { st->bfi = 1; st->codec_mode = st->last_codec_mode; diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 45030137c3..c90672a29a 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -743,8 +743,9 @@ ivas_error init_decoder( #ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT st->read_sid_info = 1; /* by default read the sid info from bitstream */ #endif +#ifndef ISM_25k6_HZ_CORE st->is_ism_format = 0; - +#endif return error; } diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index a9ae521f74..b27fc9de88 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -129,7 +129,11 @@ ivas_error ivas_sce_dec( /* only WB is supported */ st->bwidth = WB; } +#ifdef ISM_FB + else if ( ( hSCE->element_brate < MIN_BRATE_FB_STEREO_ISM && st_ivas->ism_mode != ISM_MODE_NONE ) || ( hSCE->element_brate < MIN_BRATE_FB_STEREO && st_ivas->ism_mode == ISM_MODE_NONE ) ) +#else else if ( hSCE->element_brate < MIN_BRATE_FB_STEREO ) +#endif { /* WB and SWB are supported */ st->bwidth = get_next_indice( st, 1 ) + WB; @@ -370,6 +374,13 @@ ivas_error create_sce_dec( st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; +#ifdef ISM_25k6_HZ_CORE + st->is_ism_format = 0; + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + st->is_ism_format = 1; + } +#endif if ( ( error = init_decoder( st, 0, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index ab82fb4e07..20811618bd 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -75,7 +75,12 @@ void stereo_tcx_init_dec( st->core_brate = st->total_brate; /*sampling rate*/ - st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_flag ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_flag +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); st->fscale = sr2fscale( st->sr_core ); /*frame size*/ @@ -109,7 +114,12 @@ void stereo_tcx_init_dec( if ( st->element_mode == IVAS_SCE ) { - st->tcxonly = getTcxonly( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, MCT_flag ); + st->tcxonly = getTcxonly( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, MCT_flag +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); /* LPC quantization */ if ( st->sr_core <= INT_FS_16k && st->tcxonly == 0 ) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 6de35a211a..2c92fe5a59 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -512,7 +512,12 @@ void bw_detect( if ( st->element_mode == EVS_MONO ) { - set_bw( -1, -1, st, st->codec_mode ); + set_bw( -1, -1, st, st->codec_mode +#ifdef ISM_FB + , + ISM_MODE_NONE +#endif + ); } return; @@ -529,6 +534,10 @@ void set_bw( const int32_t element_brate, /* i : element bitrate */ Encoder_State *st, /* i/o: Encoder State */ const int16_t codec_mode /* i : codec mode */ +#ifdef ISM_FB + , + const ISM_MODE ism_mode +#endif ) { /* initialization */ @@ -573,7 +582,11 @@ void set_bw( { st->bwidth = WB; } +#ifdef ISM_FB + else if ( ( ( element_brate < MIN_BRATE_FB_STEREO_ISM && ism_mode != ISM_MODE_NONE ) || ( element_brate < MIN_BRATE_FB_STEREO && ism_mode == ISM_MODE_NONE ) ) && st->bwidth > SWB ) +#else else if ( element_brate < MIN_BRATE_FB_STEREO && st->bwidth > SWB ) +#endif { st->bwidth = SWB; } diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c index 774b1398c5..65190ce992 100644 --- a/lib_enc/core_enc_init.c +++ b/lib_enc/core_enc_init.c @@ -72,10 +72,20 @@ void init_coder_ace_plus( int16_t L_subfr; /* Bitrate */ - st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag ); + st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); /* Core Sampling Rate */ - st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); st->fscale = sr2fscale( st->sr_core ); /* Narrowband? */ diff --git a/lib_enc/core_enc_switch.c b/lib_enc/core_enc_switch.c index d6c866d4c5..4ccf86eb21 100644 --- a/lib_enc/core_enc_switch.c +++ b/lib_enc/core_enc_switch.c @@ -69,7 +69,12 @@ void core_coder_mode_switch( } /* force active frame for the first frame when switching from high bitrates when DTX is enabled*/ - sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode ); + sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); fscale = sr2fscale( sr_core ); @@ -79,7 +84,12 @@ void core_coder_mode_switch( switchWB = 1; /*force init when coming from MODE1*/ } - tcxonly_tmp = getTcxonly( st->element_mode, st->total_brate, MCT_flag ); + tcxonly_tmp = getTcxonly( st->element_mode, st->total_brate, MCT_flag +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); if ( tcxonly_tmp != st->tcxonly ) { @@ -91,7 +101,12 @@ void core_coder_mode_switch( st->sr_core = sr_core; st->L_frame = (int16_t) ( sr_core / FRAMES_PER_SEC ); - st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag ); + st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); st->bits_frame_nominal = (int16_t) ( (float) st->L_frame / (float) st->fscale * (float) FSCALE_DENOM / 128.0f * (float) st->total_brate / 100.0f + 0.49f ); diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 7b57389ad8..c80f06f732 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -106,6 +106,14 @@ ivas_error init_encoder( st->flag_ACELP16k = set_ACELP_flag( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); #endif +#ifdef ISM_25k6_HZ_CORE + st->is_ism_format = 0; + if ( ism_mode != ISM_MODE_NONE ) + { + st->is_ism_format = 1; + } +#endif + /*-----------------------------------------------------------------* * Bitstream *-----------------------------------------------------------------*/ diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index c2627b923b..ab730db9f1 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -201,7 +201,12 @@ ivas_error ivas_core_enc( if ( !MCT_flag || ( MCT_flag && cpe_id == 0 ) ) { - ivas_signaling_enc( st, MCT_flag, element_brate, tdm_SM_or_LRTD_Pri, tdm_Pitch_reuse_flag ); + ivas_signaling_enc( st, MCT_flag, element_brate, tdm_SM_or_LRTD_Pri, tdm_Pitch_reuse_flag +#ifdef ISM_FB + , + ivas_format == ISM_FORMAT ? ISM_MODE_DISC : ISM_MODE_NONE +#endif + ); } /*---------------------------------------------------------------------* diff --git a/lib_enc/ivas_core_pre_proc.c b/lib_enc/ivas_core_pre_proc.c index 7a0d25ddfa..ef6465162d 100644 --- a/lib_enc/ivas_core_pre_proc.c +++ b/lib_enc/ivas_core_pre_proc.c @@ -129,6 +129,12 @@ ivas_error pre_proc_ivas( { st->L_frame = L_FRAME32k; } +#ifdef ISM_25k6_HZ_CORE + else if ( st->bwidth >= FB && st->total_brate > MAX_ACELP_BRATE_ISM && st->total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && st->is_ism_format && st->tcxonly ) + { + st->L_frame = L_FRAME25_6k; + } +#endif else if ( st->flag_ACELP16k ) { st->L_frame = L_FRAME16k; @@ -236,7 +242,13 @@ ivas_error pre_proc_ivas( total_brate_tmp = st->total_brate; st->total_brate = st->bits_frame_nominal * FRAMES_PER_SEC; SetModeIndex( st, st->last_bits_frame_nominal * FRAMES_PER_SEC, last_element_mode, MCT_flag ); - st->sr_core = getCoreSamplerateMode2( element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode ); + + st->sr_core = getCoreSamplerateMode2( element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); st->total_brate = total_brate_tmp; st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 5f775d2403..acfb27da72 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -108,6 +108,10 @@ ivas_error pre_proc_front_ivas( const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ +#ifdef ISM_FB + , + const ISM_MODE ism_mode +#endif ) { @@ -485,7 +489,12 @@ ivas_error pre_proc_front_ivas( if ( element_mode != IVAS_CPE_MDCT ) /* in MDCT stereo, set_bw_stereo() is used instead */ { - set_bw( element_mode, element_brate, st, MODE1 ); + set_bw( element_mode, element_brate, st, MODE1 +#ifdef ISM_FB + , + ism_mode +#endif + ); } /* set the BW of the TD secondary channel in LRTD mode same as BW of the primary channel (only at higher bitrates) */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 416614bf6e..d45e6f6af6 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -392,7 +392,14 @@ ivas_error ivas_cpe_enc( { int32_t internal_Fs; - internal_Fs = getTcxonly( IVAS_CPE_MDCT, sts[0]->bits_frame_nominal * FRAMES_PER_SEC, 0 ) == 0 ? INT_FS_16k : max( INT_FS_16k, sts[0]->sr_core ); + internal_Fs = getTcxonly( IVAS_CPE_MDCT, sts[0]->bits_frame_nominal * FRAMES_PER_SEC, 0 +#ifdef ISM_25k6_HZ_CORE + , + sts[0]->is_ism_format +#endif + ) == 0 + ? INT_FS_16k + : max( INT_FS_16k, sts[0]->sr_core ); /* iDFT at input sampling rate */ stereo_dft_enc_synthesize( hCPE->hStereoDft, sts[0]->input, 0, input_Fs, input_Fs, 0 ); @@ -442,7 +449,13 @@ ivas_error ivas_cpe_enc( &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, - ivas_total_brate ); + ivas_total_brate +#ifdef ISM_FB + , + ISM_MODE_NONE +#endif + + ); if ( error != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_decision_matrix_enc.c b/lib_enc/ivas_decision_matrix_enc.c index b894932958..2f5f9e0201 100644 --- a/lib_enc/ivas_decision_matrix_enc.c +++ b/lib_enc/ivas_decision_matrix_enc.c @@ -179,6 +179,13 @@ void ivas_decision_matrix_enc( st->core = ACELP_CORE; } +#ifdef ISM_25k6_HZ_CORE + if ( st->is_ism_format && st->tcxonly ) + { + st->core = TCX_20_CORE; + } +#endif + #ifdef DEBUGGING if ( st->idchan == 0 ) { @@ -379,6 +386,10 @@ void ivas_signaling_enc( const int32_t element_brate, /* i : element bitrate */ const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ const int16_t tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo */ +#ifdef ISM_FB + , + const ISM_MODE ism_mode +#endif ) { int16_t ind; @@ -420,7 +431,11 @@ void ivas_signaling_enc( { /* only WB is supported */ } +#ifdef ISM_FB + else if ( ( element_brate < MIN_BRATE_FB_STEREO_ISM && ism_mode != ISM_MODE_NONE ) || ( element_brate < MIN_BRATE_FB_STEREO && ism_mode == ISM_MODE_NONE ) ) +#else else if ( element_brate < MIN_BRATE_FB_STEREO ) +#endif { /* WB and SWB are supported */ ind = st->bwidth - WB; diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index 3a216b6164..a99c00128a 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -242,7 +242,12 @@ int16_t ivas_ism_dtx_enc( for ( ch = 0; ch < nchan_transport; ch++ ) { hSCE[ch]->hCoreCoder[0]->core_brate = -1; - set_bw( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 ); + set_bw( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 +#ifdef ISM_FB + , + -1 // VE: not really correct !!!!! +#endif + ); } hISMDTX->cnt_SID_ISM = -1; diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index b78f218811..307c4161cc 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -162,7 +162,13 @@ ivas_error ivas_ism_enc( &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, - st_ivas->hEncoderConfig->ivas_total_brate ); + st_ivas->hEncoderConfig->ivas_total_brate +#ifdef ISM_FB + , + st_ivas->ism_mode +#endif + + ); if ( error != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index df0faf71c0..abe12d41bd 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -185,7 +185,12 @@ ivas_error ivas_sce_enc( &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, - st_ivas->hEncoderConfig->ivas_total_brate ); + st_ivas->hEncoderConfig->ivas_total_brate +#ifdef ISM_FB + , + ISM_MODE_NONE +#endif + ); if ( error != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index e334f4d029..b57ab9a649 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -79,7 +79,12 @@ void stereo_tcx_init_enc( } /*sampling rate*/ - st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_mode ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_mode +#ifdef ISM_25k6_HZ_CORE + , + st->is_ism_format +#endif + ); st->fscale = sr2fscale( st->sr_core ); /*frame size*/ diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c index 82436a7dfc..e3f672c101 100644 --- a/lib_enc/pre_proc.c +++ b/lib_enc/pre_proc.c @@ -600,7 +600,12 @@ void pre_proc( else { SetModeIndex( st, st->last_total_brate, EVS_MONO, 0 ); - st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode ); + st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode +#ifdef ISM_25k6_HZ_CORE + , + 0 +#endif + ); st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); st->encoderLookahead_enc = NS2SA( st->sr_core, ACELP_LOOK_NS ); st->encoderPastSamples_enc = ( st->L_frame * 9 ) >> 4; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index ec7fb594d1..928f883c0a 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -1550,6 +1550,10 @@ typedef struct enc_core_structure /* MCT Channel mode indication: LFE, ignore channel? */ MCT_CHAN_MODE mct_chan_mode; +#ifdef ISM_25k6_HZ_CORE + int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ +#endif + int16_t dtx_sce_sba; /* enable use of FD CNG with transform domain cores in SCE SBA */ } Encoder_State, *ENC_CORE_HANDLE; diff --git a/lib_enc/updt_enc.c b/lib_enc/updt_enc.c index 6b8c595f5e..ecfd51b659 100644 --- a/lib_enc/updt_enc.c +++ b/lib_enc/updt_enc.c @@ -393,7 +393,12 @@ void updt_enc_common( { st->codec_mode = MODE2; - st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode ); + st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode +#ifdef ISM_25k6_HZ_CORE + , + 0 +#endif + ); st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); -- GitLab From 8fa7546eb4346e25e3e57ae1eff08ecb25ef1f96 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 23 May 2023 09:11:12 +0200 Subject: [PATCH 052/381] remove double define, fix diffuseness averaging --- lib_dec/ivas_dirac_dec.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 79d5d5373b..7db7286f2f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -3115,13 +3115,11 @@ void ivas_dirac_dec_render_sf( #ifdef FIX_393_459_460_SBA_MD mvs2s( &hDirAC->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); mvs2s( &hDirAC->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); -#ifdef FIX_393_459_460_SBA_MD if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } -#endif #endif hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ @@ -3374,7 +3372,8 @@ void ivas_dirac_dec_render_sf( #ifdef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim ) { - v_multc_acc( hDirAC->diffuseness_vector[md_idx], 0.25f, diffuseness_vector, hDirAC->num_freq_bands ); + float fac = 1.0f / (float) hDirAC->subframe_nbslots[subframe_idx]; + v_multc_acc( hDirAC->diffuseness_vector[md_idx], fac, diffuseness_vector, hDirAC->num_freq_bands ); } #endif -- GitLab From 74dbc0128620340c22c036ae632fe51ff0d0da50 Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Tue, 23 May 2023 14:09:25 +0530 Subject: [PATCH 053/381] Added condition for not allocating when output config is MONO or STEREO and for the case when bitrate is not less than 256kbps and output config is FOA. --- lib_com/ivas_td_decorr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 7fb5905eba..3b1d8faf47 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -556,7 +556,7 @@ void ivas_td_decorr_bitrate_check( Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ ) { - if ( ivas_total_brate == IVAS_512k && output_config == AUDIO_CONFIG_FOA ) + if ( ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) || ( ivas_total_brate >= IVAS_256k && output_config == AUDIO_CONFIG_FOA ) ) { st_ivas->td_decorr_flag = 1; } -- GitLab From ca3351757352760113bc33cddef31182b9d08740 Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Tue, 23 May 2023 15:42:46 +0530 Subject: [PATCH 054/381] Added check for SBA format --- lib_com/ivas_td_decorr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 3b1d8faf47..d0d15086e4 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -556,7 +556,7 @@ void ivas_td_decorr_bitrate_check( Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ ) { - if ( ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) || ( ivas_total_brate >= IVAS_256k && output_config == AUDIO_CONFIG_FOA ) ) + if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) || ( ivas_total_brate >= IVAS_256k && output_config == AUDIO_CONFIG_FOA ) ) ) { st_ivas->td_decorr_flag = 1; } -- GitLab From 45269717dee8e963810536bb10f5e0503adfeaf7 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 23 May 2023 14:38:46 +0200 Subject: [PATCH 055/381] fix compile problem with wrong bracketing of a FIX_393_459_460_SBA_MD occurence when it is inactive --- lib_dec/ivas_dirac_dec.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 7db7286f2f..1126311cee 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1937,9 +1937,8 @@ void ivas_qmetadata_to_dirac( float diffuseness; #ifndef FIX_393_459_460_SBA_MD int16_t ts_start, ts_end, ts; -#else - int16_t b, ele, azi; #endif + int16_t b, ele, azi; float azimuth, elevation; IVAS_QDIRECTION *q_direction; int16_t *band_mapping; -- GitLab From 8d6b7f3106e6d2ae9adb20c0657e5cebf4bec414 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 23 May 2023 18:25:54 +0200 Subject: [PATCH 056/381] Addressing clang formatting --- lib_dec/ivas_init_dec.c | 6 +++--- lib_dec/ivas_spar_decoder.c | 2 +- lib_rend/ivas_crend.c | 3 ++- lib_rend/lib_rend.c | 4 ++-- lib_util/render_config_reader.c | 3 +-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index c8f1f90e04..b754543375 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -660,8 +660,8 @@ ivas_error ivas_init_decoder_front( #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, - st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB, - st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) != IVAS_ERR_OK ) + st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB, + st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) #endif @@ -2190,7 +2190,7 @@ static ivas_error doSanityChecks_IVAS( { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || - output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB) ) + output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) #else if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 5017581e9a..0c926aeab0 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1748,7 +1748,7 @@ void ivas_spar_dec_upmixer( { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM || - st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) #else if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 55fda1c1cc..a3bec19faf 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -204,7 +204,8 @@ static ivas_error ivas_rend_initCrend( use_brir = false; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || - outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) ) + outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || + outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) ) #else if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) ) #endif diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 5873bfdb94..8ee530d1b7 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3812,8 +3812,8 @@ ivas_error IVAS_REND_InitConfig( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, - outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB, - outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) != IVAS_ERR_OK ) + outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB, + outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) #endif diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index f2364f99a5..54f2d012ce 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -436,8 +436,7 @@ ivas_error RenderConfigReader_read( errorHandler( item, ERROR_VALUE_INVALID ); } } - else - if ( strcmp( item, "NBANDS" ) == 0 ) + else if ( strcmp( item, "NBANDS" ) == 0 ) { if ( !sscanf( pValue, "%hd", &hRenderConfig->room_acoustics.nBands ) || hRenderConfig->room_acoustics.nBands > CLDFB_NO_CHANNELS_MAX ) -- GitLab From 5b2a4411e7fe71833fa0b6abe847b541bdd508b6 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 23 May 2023 18:36:30 +0200 Subject: [PATCH 057/381] Addressing clang formatting --- lib_dec/ivas_spar_decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 0c926aeab0..c2c9778b4d 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1750,7 +1750,7 @@ void ivas_spar_dec_upmixer( if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) #else - if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) + if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif { #ifdef JBM_TSM_ON_TCS -- GitLab From 8f248a4ea1a6132af8c7961735ff556736b25bb5 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Wed, 24 May 2023 01:55:48 +0200 Subject: [PATCH 058/381] Corrections of phase compensation filters and algorithmic enhancements. --- lib_com/ivas_cnst.h | 11 +- lib_enc/ivas_stat_enc.h | 3 +- lib_enc/ivas_stereo_dmx_evs.c | 469 +++++++++++++++++++--------------- 3 files changed, 276 insertions(+), 207 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e94cb926a6..696b5cc35b 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1660,20 +1660,21 @@ typedef enum * Stereo downmix EVS constants *----------------------------------------------------------------------------------*/ -#define STEREO_DMX_EVS_PHA_LEN_16 48 +#define STEREO_DMX_EVS_PHA_LEN_16 24 #define STEREO_DMX_EVS_FAD_LEN_16 160 -#define STEREO_DMX_EVS_PHA_LEN_32 96 +#define STEREO_DMX_EVS_PHA_LEN_32 48 #define STEREO_DMX_EVS_FAD_LEN_32 320 -#define STEREO_DMX_EVS_PHA_LEN_48 96 +#define STEREO_DMX_EVS_PHA_LEN_48 48 #define STEREO_DMX_EVS_FAD_LEN_48 480 #define STEREO_DMX_EVS_SUBBAND_SIZE 2 #define STEREO_DMX_EVS_NB_SUBBAND_MAX (L_FRAME48k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE)) -#define STEREO_DMX_EVS_PHA_LEN_MAX 96 /* Max of PHA_LEN */ +#define STEREO_DMX_EVS_PHA_LEN_MAX 48 /* Max of PHA_LEN */ #define STEREO_DMX_EVS_FAD_LEN_MAX 480 /* Max of FAD_LEN */ -#define STEREO_DMX_EVS_DATA_LEN_MAX (STEREO_DMX_EVS_PHA_LEN_MAX + L_FRAME48k) +#define STEREO_DMX_EVS_DATA_LEN_MAX (L_FRAME48k + STEREO_DMX_EVS_PHA_LEN_MAX) +#define STEREO_DMX_EVS_DATA_LEN2_MAX (L_FRAME48k + STEREO_DMX_EVS_PHA_LEN_MAX/2) typedef enum { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index a31d35e014..e9b19b2259 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -974,7 +974,7 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float ipd_ff[STEREO_DMX_EVS_NB_SUBBAND_MAX]; float Pr[STEREO_DMX_EVS_NB_SUBBAND_MAX]; float Pi[STEREO_DMX_EVS_NB_SUBBAND_MAX]; - float rfft_ipd_coef[L_FRAME48k/2 + 1]; + float rfft_ipd_coef[L_FRAME48k / 2 + 1]; int16_t pha_len; int16_t fad_len; @@ -985,6 +985,7 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float *p_curr_taps[CPE_CHANNELS], curr_taps[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; float data_mem[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; + float poc_sync_mem[STEREO_DMX_EVS_PHA_LEN_MAX / 2]; STEREO_DMX_EVS_PHA curr_pha; STEREO_DMX_EVS_PHA prev_pha; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 91ab419af8..1805750062 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -67,24 +67,25 @@ #ifdef ENHANCED_STEREO_DMX -#define STEREO_DMX_EVS_ISD_THRES 1.3f -#define STEREO_DMX_EVS_ISD_DIST_THRES_PHA 0.42f -#define STEREO_DMX_EVS_SWTCH_HYS_THRES 1 -#define STEREO_DMX_EVS_LR_EGY 100.0f -#define STEREO_DMX_EVS_ILDS_EGY 10000.0f +#define STEREO_DMX_EVS_ISD_THRES 1.3f -#define STEREO_DMX_EVS_SWTCH_PRC_THRES_16 55 -#define STEREO_DMX_EVS_SWTCH_PRC_THRES_32 19 -#define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 +#define STEREO_DMX_EVS_SWTCH_HYS_THRES 1 +#define STEREO_DMX_EVS_LR_EGY 100.0f +#define STEREO_DMX_EVS_ILDS_EGY 10000.0f +#define STEREO_DMX_EVS_ILD_PRC 0.3f + +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_16 55 +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_32 19 +#define STEREO_DMX_EVS_SWTCH_PRC_THRES_48 29 #define STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES 1 #define STEREO_DMX_EVS_FADE_LEN_PRC 20.0f -#define STEREO_DMX_EVS_NB_SBFRM 5 -#define STEREO_DMX_EVS_TRNS_DTC_INST 75.0f -#define STEREO_DMX_EVS_CRST_FCTR_16 80.0f -#define STEREO_DMX_EVS_CRST_FCTR_32 40.0f -#define STEREO_DMX_EVS_CRST_FCTR_48 35.0f +#define STEREO_DMX_EVS_NB_SBFRM 5 +#define STEREO_DMX_EVS_TRNS_DTC_INST 75.0f +#define STEREO_DMX_EVS_CRST_FCTR_16 80.0f +#define STEREO_DMX_EVS_CRST_FCTR_32 40.0f +#define STEREO_DMX_EVS_CRST_FCTR_48 35.0f #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f #define STEREO_DMX_EVS_PHA_EGY_FORGETTING 0.79f @@ -99,10 +100,10 @@ static void estimate_itd_wnd_fft( const float *input, float *specr, float *speci #ifdef ENHANCED_STEREO_DMX static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame ); static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float srcL[], const float srcR[], float itd[], const int16_t input_frame ); -# else +#else static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame ); static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, const float srcL[], const float srcR[], float itd[], const int16_t input_frame ); -#endif +#endif static void weighted_ave( const float src1[], const float src2[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] ); static void adapt_gain( const float src[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] ); static void create_M_signal( const float srcL[], const float srcR[], float dmx[], const float w_curr, const int16_t input_frame, const float wnd[], float *w_prev, float *dmx_energy, float *src_energy ); @@ -174,14 +175,14 @@ static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ #ifdef ENHANCED_STEREO_DMX STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */ -#endif - const float wnd[], /* i : window coef */ - const float rfft_coef[], /* i : RFFT coef */ - const float specLr[], /* i : Lch real-part spectra */ - const float specLi[], /* i : Lch imaginary-part input signal */ - const float specRr[], /* i : Rch real-part spectra */ - const float specRi[], /* i : Rch imaginary-part input signal */ - const int16_t input_frame /* i : input frame length per channel */ +#endif + const float wnd[], /* i : window coef */ + const float rfft_coef[], /* i : RFFT coef */ + const float specLr[], /* i : Lch real-part spectra */ + const float specLi[], /* i : Lch imaginary-part input signal */ + const float specRr[], /* i : Rch real-part spectra */ + const float specRi[], /* i : Rch imaginary-part input signal */ + const int16_t input_frame /* i : input frame length per channel */ ) { int16_t i, n1, n2; @@ -203,11 +204,13 @@ static void calc_poc( #ifdef ENHANCED_STEREO_DMX - int16_t isd_cnt, n, freq8k, nsbd, input_frame_pha; - float Nr, Ni, Dr, Di, ISD, tPr, tPi, Pn, energy, isd_rate; - float *Pr, *Pi, *ipd_ff, *p_curr_taps; + int16_t isd_cnt, n, freq8k, nsbd, input_frame_pha, pha_len2; + float Nr, Ni, Dr, Di, tPr, tPi, Pn, energy, isd_band; + + float *Pr, *Pi, *ipd_ff, *p_taps_0, *p_taps_1; float rfft_pha_buf[L_FRAME48k], tEr[STEREO_DMX_EVS_NB_SUBBAND_MAX], tEl[STEREO_DMX_EVS_NB_SUBBAND_MAX]; -#endif + +#endif /* Initialization */ iN = 1.0f / (float) input_frame; @@ -221,8 +224,6 @@ static void calc_poc( Pi = hPHA->Pi; nsbd = n0 / STEREO_DMX_EVS_SUBBAND_SIZE; input_frame_pha = input_frame / STEREO_DMX_EVS_SUBBAND_SIZE; - input_frame_pha = (input_frame_pha == 192) ? 200 : input_frame_pha; // Handle FFT 192 - input_frame_pha = (input_frame_pha == 96) ? 100 : input_frame_pha; // Handle FFT 96 #endif igamma = STEREO_DMX_EVS_POC_GAMMA * iN; @@ -389,16 +390,16 @@ static void calc_poc( #ifdef ENHANCED_STEREO_DMX hPHA->init_frmCntr--; - if (hPHA->init_frmCntr<0) + if ( hPHA->init_frmCntr < 0 ) { - hPHA->init_frmCntr=0; + hPHA->init_frmCntr = 0; } freq8k = L_FRAME16k / 2; // Memorize the filters N-1 for ( n = 0; n < CPE_CHANNELS; n++ ) { - if (hPHA->p_curr_taps[n]) + if ( hPHA->p_curr_taps[n] ) { hPHA->p_prev_taps[n] = hPHA->prev_taps[n]; mvr2r( hPHA->p_curr_taps[n], hPHA->p_prev_taps[n], hPHA->pha_len ); @@ -412,27 +413,22 @@ static void calc_poc( } // ISD - isd_cnt = 0; - for ( i = 1; i <= freq8k ; i++ ) + isd_band = 0.0f; + for ( i = 1; i <= freq8k; i++ ) { Nr = ( specLr[i] - specRr[i] ); Ni = ( specLi[i] - specRi[i] ); Dr = ( specLr[i] + specRr[i] ); Di = ( specLi[i] + specRi[i] ); - ISD = sqrtf( (Nr*Nr + Ni*Ni) / (Dr*Dr + Di*Di) ); - if (ISD > STEREO_DMX_EVS_ISD_THRES) - { - isd_cnt++; - } + isd_band += (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( Dr * Dr + Di * Di ) ); } - - isd_rate = (float)isd_cnt / (float)freq8k; - if (isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_PHA) + isd_band /= freq8k; + if ( isd_band > STEREO_DMX_EVS_ISD_THRES ) { if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD ) { - if (hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD) + if ( hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD ) { hPHA->pha_hys_cnt += 1; } @@ -441,7 +437,7 @@ static void calc_poc( hPHA->pha_hys_cnt = 0; } - if (hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES) + if ( hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES ) { hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD; } @@ -450,9 +446,9 @@ static void calc_poc( } else { - if (hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD2) + if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD2 ) { - if (hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD2) + if ( hPHA->prev_pha == STEREO_DMX_EVS_PHA_IPD2 ) { hPHA->pha_hys_cnt += 1; } @@ -461,7 +457,7 @@ static void calc_poc( hPHA->pha_hys_cnt = 0; } - if (hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES) + if ( hPHA->pha_hys_cnt >= STEREO_DMX_EVS_SWTCH_HYS_THRES ) { hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD2; } @@ -469,18 +465,18 @@ static void calc_poc( hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD2; } - if (hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD) + if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD ) { ipd_ff = hPHA->ipd_ff; - for (n = 1, i = 1; n < nsbd; n++) + for ( n = 1, i = 1; n < nsbd; n++ ) { tPr = 0.0f; tPi = 0.0f; tEr[n] = 0.0f; tEl[n] = 0.0f; - for (j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++) + for ( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++ ) { tPr += specLr[i] * specRr[i] + specLi[i] * specRi[i]; tPi += specLi[i] * specRr[i] - specLr[i] * specRi[i]; @@ -488,70 +484,95 @@ static void calc_poc( tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i]; } - Pn = 1.0 / (sqrtf(tPr * tPr + tPi * tPi ) + EPSILON); + Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON ); tPr *= Pn; tPi *= Pn; - if (hPHA->init_frmCntr == 0) + + if ( hPHA->init_frmCntr == 0 ) { - Pr[n] = ipd_ff[n]*Pr[n] + (1.0f - ipd_ff[n])*tPr; - Pi[n] = ipd_ff[n]*Pi[n] + (1.0f - ipd_ff[n])*tPi; - Pn = 1.0 / (sqrtf(Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON); + Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; + Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; + Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); Pr[n] *= Pn; Pi[n] *= Pn; - } + } else { - Pr[n] = tPr; - Pi[n] = tPi; + Pr[n] = tPr; + Pi[n] = tPi; } } - hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; + } rfft_pha_buf[0] = 1.; rfft_pha_buf[1] = 1.; + isd_cnt = 0; for ( i = 1; i < nsbd; i++ ) { - if ((tEr[i] > STEREO_DMX_EVS_LR_EGY*tEl[i]) || (tEl[i] > STEREO_DMX_EVS_LR_EGY*tEr[i])) + rfft_pha_buf[i * 2] = Pr[i]; + rfft_pha_buf[i * 2 + 1] = Pi[i]; + + if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) { - rfft_pha_buf[i * 2] = 1.; - rfft_pha_buf[i * 2 + 1] = 0.; + isd_cnt++; + tEr[i] = 1; } - else { - rfft_pha_buf[i * 2] = Pr[i]; - rfft_pha_buf[i * 2 + 1] = Pi[i]; + else + { + tEr[i] = -1; } - } - // Handle FFT 192/96 - if ((input_frame_pha == 200) || (input_frame_pha == 100)) + if ( isd_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) { - tPr = rfft_pha_buf[2*nsbd-2]; - tPi = rfft_pha_buf[2*nsbd-1]; - for (i = 2*nsbd; i < input_frame_pha; i+=2) + for ( i = 1; i < nsbd; i++ ) { - rfft_pha_buf[i] = tPr; - rfft_pha_buf[i+1] = tPi; + if ( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = 1.; + rfft_pha_buf[i * 2 + 1] = 0.; + } } } rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); - mvr2r(rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len); - } - else + + pha_len2 = hPHA->pha_len / 2; + + p_taps_1 = hPHA->p_curr_taps[1]; + p_taps_0 = &( rfft_pha_buf[input_frame_pha - pha_len2] ); + for ( i = 0; i < pha_len2; i++ ) + { + p_taps_1[i] = p_taps_0[i]; + } + + p_taps_1 = &( hPHA->p_curr_taps[1][pha_len2] ); + for ( i = 0; i < pha_len2; i++ ) + { + p_taps_1[i] = rfft_pha_buf[i]; + } + + p_taps_0 = hPHA->p_curr_taps[0]; + set_zero( p_taps_0, hPHA->pha_len ); + p_taps_0[pha_len2] = 1.0f; + } + else { ipd_ff = hPHA->ipd_ff; - for (n = 1, i = 1; n < nsbd; n++) + for ( n = 1, i = 1; n < nsbd; n++ ) { tPr = 0.0f; tPi = 0.0f; tEr[n] = 0.0f; tEl[n] = 0.0f; - for (j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++) + for ( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++ ) { tPr += specLr[i] * specRr[i] + specLi[i] * specRi[i]; tPi += specLi[i] * specRr[i] - specLr[i] * specRi[i]; @@ -559,96 +580,121 @@ static void calc_poc( tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i]; } - Pn = 1.0 / (sqrtf(tPr * tPr + tPi * tPi ) + EPSILON); + Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON ); tPr *= Pn; tPi *= Pn; - if (hPHA->init_frmCntr == 0) + if ( hPHA->init_frmCntr == 0 ) { - Pr[n] = ipd_ff[n]*Pr[n] + (1.0f - ipd_ff[n])*tPr; - Pi[n] = ipd_ff[n]*Pi[n] + (1.0f - ipd_ff[n])*tPi; - Pn = 1.0 / (sqrtf(Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON); + Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; + Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; + Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); Pr[n] *= Pn; Pi[n] *= Pn; } else { - Pr[n] = tPr; - Pi[n] = tPi; + Pr[n] = tPr; + Pi[n] = tPi; } + + Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; + Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; } for ( n = 0; n < CPE_CHANNELS; n++ ) { - hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; + hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; } rfft_pha_buf[0] = 1.; rfft_pha_buf[1] = 1.; + isd_cnt = 0; for ( i = 1; i < nsbd; i++ ) - { - if ((tEr[i] > STEREO_DMX_EVS_LR_EGY*tEl[i]) || (tEl[i] > STEREO_DMX_EVS_LR_EGY*tEr[i])) + { + rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); + rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); + rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); + rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); + + + if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) { - rfft_pha_buf[i * 2] = 1.; - rfft_pha_buf[i * 2 + 1] = 0.; + isd_cnt++; + tEr[i] = 1; } - else + else { - rfft_pha_buf[i * 2] = sqrtf((1.0f+Pr[i])/2.0f); - rfft_pha_buf[i * 2 + 1] = sqrtf((1.0f-Pr[i])/2.0f)*sign(Pi[i]); - rfft_pha_buf[i * 2 + 1] = sqrtf((1.0f-rfft_pha_buf[i * 2])/2.0f)*sign(rfft_pha_buf[i * 2 + 1]); - rfft_pha_buf[i * 2] = sqrtf((1.0f+rfft_pha_buf[i * 2])/2.0f); + tEr[i] = -1; } } - // Handle FFT 192 / 96 - if ((input_frame_pha == 200) || (input_frame_pha == 100)) + if ( isd_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) { - tPr = rfft_pha_buf[2*nsbd-2]; - tPi = rfft_pha_buf[2*nsbd-1]; - for (i = 2*nsbd; i < input_frame_pha; i+=2) + for ( i = 1; i < nsbd; i++ ) { - rfft_pha_buf[i] = tPr; - rfft_pha_buf[i+1] = tPi; + if ( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = 1.; + rfft_pha_buf[i * 2 + 1] = 0.; + } } } rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); - mvr2r(rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len); + + pha_len2 = hPHA->pha_len / 2; + + p_taps_1 = hPHA->p_curr_taps[1]; + p_taps_0 = &( rfft_pha_buf[input_frame_pha - pha_len2] ); + for ( i = 0; i < pha_len2; i++ ) + { + p_taps_1[i] = p_taps_0[i]; + } + + p_taps_1 = &( hPHA->p_curr_taps[1][pha_len2] ); + for ( i = 0; i < pha_len2; i++ ) + { + p_taps_1[i] = rfft_pha_buf[i]; + } // PHA L2R - p_curr_taps = hPHA->p_curr_taps[0]; - p_curr_taps[0] = rfft_pha_buf[0]; - for ( i = 1; i < hPHA->pha_len; i++ ) + + p_taps_0 = hPHA->p_curr_taps[0]; + p_taps_1 = hPHA->p_curr_taps[1]; + for ( i = 0, j = ( hPHA->pha_len - 1 ); i < ( hPHA->pha_len - 1 ); i++, j-- ) { - p_curr_taps[i] = rfft_pha_buf[input_frame_pha-i]; + p_taps_0[i + 1] = p_taps_1[j]; } + p_taps_0[0] = rfft_pha_buf[pha_len2]; } for ( n = 0; n < CPE_CHANNELS; n++ ) { - if (hPHA->p_curr_taps[n]) + if ( hPHA->p_curr_taps[n] ) { + p_taps_0 = hPHA->p_curr_taps[n]; + for ( i = 0; i < hPHA->pha_len; i++ ) { - hPHA->p_curr_taps[n][i] *= hPHA->win[i]; + p_taps_0[i] *= hPHA->win[i]; } energy = 0.; for ( i = 0; i < hPHA->pha_len; i++ ) { - energy += hPHA->p_curr_taps[n][i] *hPHA->p_curr_taps[n][i]; + energy += p_taps_0[i] * p_taps_0[i]; } - energy = 1.0 / sqrtf( energy + EPSILON ); + energy = (float) inv_sqrt( energy + EPSILON ); for ( i = 0; i < hPHA->pha_len; i++ ) { - hPHA->p_curr_taps[n][i] *= energy; + p_taps_0[i] *= energy; } } } -#endif +#endif rfft_buf[0] = specPOr[0]; rfft_buf[1] = specPOr[n0]; @@ -864,11 +910,11 @@ static ivas_error estimate_itd( STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ #ifdef ENHANCED_STEREO_DMX STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */ -#endif - const float srcL[], /* i : Lch input signal */ - const float srcR[], /* i : Rch input signal */ - float itd[], /* o : estimated itd */ - const int16_t input_frame /* i : input frame length per channel */ +#endif + const float srcL[], /* i : Lch input signal */ + const float srcR[], /* i : Rch input signal */ + float itd[], /* o : estimated itd */ + const int16_t input_frame /* i : input frame length per channel */ ) { float specLr[L_FRAME48k / 2 + 1], specLi[L_FRAME48k / 2 + 1], specRr[L_FRAME48k / 2 + 1], specRi[L_FRAME48k / 2 + 1]; @@ -1115,10 +1161,10 @@ void stereo_dmx_evs_enc( float data_f[CPE_CHANNELS][L_FRAME48k]; #ifdef ENHANCED_STEREO_DMX - int16_t k, m, pha_len, fad_len; + int16_t k, m, pha_len, pha_len2, fad_len; float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; - float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, dmx_gain, ftmp; + float *dmx_poc_data, dmx_poc_data_sync[STEREO_DMX_EVS_DATA_LEN2_MAX], dmx_pha_data[L_FRAME48k], *p_dmx_data, dmx_gain, ftmp; STEREO_DMX_EVS_PRC curr_prc; int16_t input_subframe, is_transient; float *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; @@ -1142,41 +1188,41 @@ void stereo_dmx_evs_enc( } #ifdef ENHANCED_STEREO_DMX - + input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; is_transient = 0; for ( k = 0; k < CPE_CHANNELS; k++ ) { ftmp = 0; - for (m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++) + for ( m = 0; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) { - p_sub_frame = &(data_f[k][m * input_subframe]); + p_sub_frame = &( data_f[k][m * input_subframe] ); subframe_energy[m] = 0; - for ( n=0 ; n < input_subframe; n++ ) + for ( n = 0; n < input_subframe; n++ ) { subframe_energy[m] += p_sub_frame[n] * p_sub_frame[n]; } - if (subframe_energy[m] / (hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON) > hStereoDmxEVS->hPHA->crst_fctr) + if ( subframe_energy[m] / ( hStereoDmxEVS->hPHA->trns_aux_energy[k] + EPSILON ) > hStereoDmxEVS->hPHA->crst_fctr ) { is_transient = 1; } - if (hStereoDmxEVS->hPHA->init_frmCntr == 0) + if ( hStereoDmxEVS->hPHA->init_frmCntr == 0 ) { - hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + (1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING) * subframe_energy[m]; + hStereoDmxEVS->hPHA->trns_aux_energy[k] = STEREO_DMX_EVS_TRNS_EGY_FORGETTING * hStereoDmxEVS->hPHA->trns_aux_energy[k] + ( 1.0f - STEREO_DMX_EVS_TRNS_EGY_FORGETTING ) * subframe_energy[m]; } else { - hStereoDmxEVS->hPHA->trns_aux_energy[k] = 0.5 * hStereoDmxEVS->hPHA->trns_aux_energy[k] + 0.5 * subframe_energy[m]; + hStereoDmxEVS->hPHA->trns_aux_energy[k] = 0.5f * hStereoDmxEVS->hPHA->trns_aux_energy[k] + 0.5f * subframe_energy[m]; } ftmp += subframe_energy[m]; } - for (m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++) + for ( m = 1; m < STEREO_DMX_EVS_NB_SBFRM; m++ ) { - if (subframe_energy[m]/(subframe_energy[m-1] + EPSILON) > STEREO_DMX_EVS_TRNS_DTC_INST) + if ( subframe_energy[m] / ( subframe_energy[m - 1] + EPSILON ) > STEREO_DMX_EVS_TRNS_DTC_INST ) { is_transient = 1; } @@ -1196,38 +1242,45 @@ void stereo_dmx_evs_enc( dmx_weight = 0.5f; } + pha_len2 = hStereoDmxEVS->hPHA->pha_len / 2; + + mvr2r( hStereoDmxEVS->hPHA->poc_sync_mem, dmx_poc_data_sync, pha_len2 ); + dmx_poc_data = &( dmx_poc_data_sync[pha_len2] ); + create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); - calc_energy( dmx_poc_data, dmx_poc_data, &(hStereoDmxEVS->hPHA->dmx_poc_ener), n_samples, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); - dmx_gain = INV_SQRT_2 * sqrtf((hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1]) / (hStereoDmxEVS->hPHA->dmx_poc_ener)); - adapt_gain(dmx_poc_data, dmx_poc_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_poc_old_gain, n_samples, hStereoDmxEVS->s_wnd); + calc_energy( dmx_poc_data, dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener ), n_samples, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + dmx_gain = INV_SQRT_2 * (float) sqrt( ( hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1] ) / ( hStereoDmxEVS->hPHA->dmx_poc_ener ) ); + adapt_gain( dmx_poc_data, dmx_poc_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_poc_old_gain, n_samples, hStereoDmxEVS->s_wnd ); hStereoDmxEVS->hPHA->dmx_poc_old_gain = dmx_gain; + mvr2r( &( dmx_poc_data[n_samples - pha_len2] ), hStereoDmxEVS->hPHA->poc_sync_mem, pha_len2 ); + // pha pha_len = hStereoDmxEVS->hPHA->pha_len; fad_len = hStereoDmxEVS->hPHA->fad_len; fad_g = hStereoDmxEVS->hPHA->fad_g; - set_zero(dmx_pha_data, n_samples); - set_zero(mem_prev, fad_len); + set_zero( dmx_pha_data, n_samples ); + set_zero( mem_prev, fad_len ); for ( k = 0; k < CPE_CHANNELS; k++ ) - { + { p_data = data_f[k]; mvr2r( hStereoDmxEVS->hPHA->data_mem[k], data_mem, pha_len ); - mvr2r( &(p_data[n_samples - pha_len]), hStereoDmxEVS->hPHA->data_mem[k], pha_len ); + mvr2r( &( p_data[n_samples - pha_len] ), hStereoDmxEVS->hPHA->data_mem[k], pha_len ); p_data_mem = &( data_mem[pha_len] ); mvr2r( p_data, p_data_mem, n_samples ); - p_prev_taps = hStereoDmxEVS->hPHA->p_prev_taps[k]; - if (p_prev_taps) + if ( p_prev_taps ) { - for (n = 0; n < fad_len; n++) + for ( n = 0; n < fad_len; n++ ) { - for (ftmp = 0, m = 0; m < pha_len; m++) { + for ( ftmp = 0, m = 0; m < pha_len; m++ ) + { ftmp += p_data_mem[n - m] * p_prev_taps[m]; } mem_prev[n] += ftmp; @@ -1235,50 +1288,52 @@ void stereo_dmx_evs_enc( } else { - for (n = 0; n < fad_len; n++) + for ( n = 0; n < fad_len; n++ ) { mem_prev[n] += p_data[n]; } } p_curr_taps = hStereoDmxEVS->hPHA->p_curr_taps[k]; - if (p_curr_taps) { - for (n = 0; n < n_samples; n++) + if ( p_curr_taps ) + { + for ( n = 0; n < n_samples; n++ ) { - for (ftmp = 0, m = 0; m < pha_len; m++) + for ( ftmp = 0, m = 0; m < pha_len; m++ ) { ftmp += p_data_mem[n - m] * p_curr_taps[m]; } dmx_pha_data[n] += ftmp; } - } - else + } + else { - for (n = 0; n < n_samples; n++) + for ( n = 0; n < n_samples; n++ ) { dmx_pha_data[n] += p_data[n]; } } } - for (n = 0, m = (fad_len - 1); n < fad_len; n++, m--) { + for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) + { dmx_pha_data[n] *= fad_g[n]; - dmx_pha_data[n] += (mem_prev[n]) * fad_g[m]; + dmx_pha_data[n] += ( mem_prev[n] ) * fad_g[m]; } - calc_energy( dmx_pha_data, dmx_pha_data, &(hStereoDmxEVS->hPHA->dmx_pha_ener), n_samples, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); - dmx_gain = INV_SQRT_2 * sqrtf((hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1]) / (hStereoDmxEVS->hPHA->dmx_pha_ener)); - adapt_gain(dmx_pha_data, dmx_pha_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_pha_old_gain, n_samples, hStereoDmxEVS->s_wnd); + calc_energy( dmx_pha_data, dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener ), n_samples, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); + dmx_gain = INV_SQRT_2 * (float) sqrt( ( hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1] ) / ( hStereoDmxEVS->hPHA->dmx_pha_ener + EPSILON ) ); + adapt_gain( dmx_pha_data, dmx_pha_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_pha_old_gain, n_samples, hStereoDmxEVS->s_wnd ); hStereoDmxEVS->hPHA->dmx_pha_old_gain = dmx_gain; // prc switch curr_prc = hStereoDmxEVS->hPHA->curr_prc; - if (abs((int16_t)hStereoDmxEVS->itd) > hStereoDmxEVS->hPHA->prc_thres) + if ( abs( (int16_t) hStereoDmxEVS->itd ) > hStereoDmxEVS->hPHA->prc_thres ) { if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_POC ) { - if (hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_POC) + if ( hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_POC ) { hStereoDmxEVS->hPHA->prc_hys_cnt += 1; } @@ -1287,7 +1342,7 @@ void stereo_dmx_evs_enc( hStereoDmxEVS->hPHA->prc_hys_cnt = 0; } - if (hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES) + if ( hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) { hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; } @@ -1298,7 +1353,7 @@ void stereo_dmx_evs_enc( { if ( hStereoDmxEVS->hPHA->curr_prc != STEREO_DMX_EVS_PRC_PHA ) { - if (hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_PHA) + if ( hStereoDmxEVS->hPHA->prev_prc == STEREO_DMX_EVS_PRC_PHA ) { hStereoDmxEVS->hPHA->prc_hys_cnt += 1; } @@ -1307,7 +1362,7 @@ void stereo_dmx_evs_enc( hStereoDmxEVS->hPHA->prc_hys_cnt = 0; } - if (hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES) + if ( hStereoDmxEVS->hPHA->prc_hys_cnt >= STEREO_DMX_EVS_SWTCH_PRC_HYS_THRES ) { hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_PHA; } @@ -1315,23 +1370,22 @@ void stereo_dmx_evs_enc( hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; } - if ( (is_transient == 1) - || (hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY*hStereoDmxEVS->aux_dmx_energy[1]) - || (hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY*hStereoDmxEVS->aux_dmx_energy[0]) ) + if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) ) { hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prc_hys_cnt = 0; } - if (hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC) { - p_dmx_data = dmx_poc_data; + if ( hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC ) + { + p_dmx_data = dmx_poc_data_sync; - if (curr_prc != hStereoDmxEVS->hPHA->curr_prc) + if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc ) { fad_len = hStereoDmxEVS->hPHA->fad_len_prc; fad_g = hStereoDmxEVS->hPHA->fad_g_prc; - for (n = 0, m=(fad_len-1); n < fad_len; n++, m--) + for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) { p_dmx_data[n] *= fad_g[n]; p_dmx_data[n] += fad_g[m] * dmx_pha_data[n]; @@ -1342,16 +1396,15 @@ void stereo_dmx_evs_enc( { p_dmx_data = dmx_pha_data; - if (curr_prc != hStereoDmxEVS->hPHA->curr_prc) + if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc ) { fad_len = hStereoDmxEVS->hPHA->fad_len_prc; fad_g = hStereoDmxEVS->hPHA->fad_g_prc; - for (n = 0, m=(fad_len-1); n < fad_len; n++, m--) + for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) { p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += fad_g[m] * dmx_poc_data[n]; - + p_dmx_data[n] += fad_g[m] * dmx_poc_data_sync[n]; } } } @@ -1375,7 +1428,7 @@ void stereo_dmx_evs_enc( hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); mvr2s( dmx_data, data, n_samples ); - + #endif return; @@ -1508,6 +1561,8 @@ ivas_error stereo_dmx_evs_init_encoder( set_zero( hStereoDmxEVS->hPHA->curr_taps[n], STEREO_DMX_EVS_PHA_LEN_MAX ); } + set_zero( hStereoDmxEVS->hPHA->poc_sync_mem, STEREO_DMX_EVS_PHA_LEN_MAX / 2 ); + if ( input_Fs == 16000 ) { len = STEREO_DMX_EVS_PHA_LEN_16; @@ -1522,38 +1577,41 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_32; hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_32; } - else if (input_Fs == 48000) + else if ( input_Fs == 48000 ) { len = STEREO_DMX_EVS_PHA_LEN_48; hStereoDmxEVS->hPHA->fad_len = STEREO_DMX_EVS_FAD_LEN_48; hStereoDmxEVS->hPHA->prc_thres = STEREO_DMX_EVS_SWTCH_PRC_THRES_48; hStereoDmxEVS->hPHA->crst_fctr = STEREO_DMX_EVS_CRST_FCTR_48; } - else + else { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" ); } - hStereoDmxEVS->hPHA->pha_len = len/2; - hStereoDmxEVS->hPHA->init_frmCntr = (int16_t)FRAMES_PER_SEC*0.2; + hStereoDmxEVS->hPHA->pha_len = len; + hStereoDmxEVS->hPHA->init_frmCntr = (int16_t) ( FRAMES_PER_SEC * 0.2f ); pha_len = hStereoDmxEVS->hPHA->pha_len; fad_len = hStereoDmxEVS->hPHA->fad_len; - trans_len = (int16_t)((float)pha_len / 20.0f); - set_f(hStereoDmxEVS->hPHA->win, 1.8f, pha_len - trans_len); - hStereoDmxEVS->hPHA->win[0] = 1.0f; - tmp_r = 1.0f / ((trans_len * 2) + 1); - win = &(hStereoDmxEVS->hPHA->win[pha_len - trans_len]); - for (n = 0; n < trans_len; n++) { - win[n] = (0.5f * (1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ))*1.8; + trans_len = (int16_t) ( (float) pha_len / 20.0f ); + set_f( hStereoDmxEVS->hPHA->win, 1.0f, pha_len ); + tmp_r = 1.0f / ( ( trans_len * 2 ) + 1 ); + win = hStereoDmxEVS->hPHA->win; + for ( n = 0, m = ( trans_len - 1 ); n < trans_len; n++, m-- ) + { + itrh = pha_len - trans_len + n; + win[itrh] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ); + win[m] = win[itrh]; } fad_g = hStereoDmxEVS->hPHA->fad_g; - fad_r = 1.0f / (float)(fad_len + 1); + fad_r = 1.0f / (float) ( fad_len + 1 ); fad_len2 = fad_len / 2; - for (n = 0, m=(fad_len-1); n < fad_len2; n++, m--) { - fad_g[n] = (float)(n+1) * fad_r; + for ( n = 0, m = ( fad_len - 1 ); n < fad_len2; n++, m-- ) + { + fad_g[n] = (float) ( n + 1 ) * fad_r; fad_g[m] = 1.0f - fad_g[n]; } @@ -1564,9 +1622,9 @@ ivas_error stereo_dmx_evs_init_encoder( // Compute the forgetting factor a_min = 0.8576958985908941f; a_max = 0.9440608762859234f; - itrh = (3000 * input_frame) / (input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE); // 3kHz - n0 = L_FRAME16k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE); - a_step = ( a_min - a_max ) / (n0+1-itrh); + itrh = (int16_t) ( ( 3000 * input_frame ) / ( input_Fs * STEREO_DMX_EVS_SUBBAND_SIZE ) ); // 3kHz + n0 = L_FRAME16k / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE ); + a_step = ( a_min - a_max ) / ( n0 + 1 - itrh ); ipd_ff = hStereoDmxEVS->hPHA->ipd_ff; for ( n = 0; n < itrh; n++ ) { @@ -1574,7 +1632,7 @@ ivas_error stereo_dmx_evs_init_encoder( } for ( ; n < ( n0 + 1 ); n++ ) // 8kHz { - ipd_ff[n] = a_max + (n-itrh) * a_step; + ipd_ff[n] = a_max + ( n - itrh ) * a_step; } for ( ; n < STEREO_DMX_EVS_NB_SUBBAND_MAX; n++ ) { @@ -1583,25 +1641,33 @@ ivas_error stereo_dmx_evs_init_encoder( set_f( hStereoDmxEVS->hPHA->Pr, 1.0, STEREO_DMX_EVS_NB_SUBBAND_MAX ); set_zero( hStereoDmxEVS->hPHA->Pi, STEREO_DMX_EVS_NB_SUBBAND_MAX ); - n0 = input_frame / (4 * STEREO_DMX_EVS_SUBBAND_SIZE); - input_frame_pha = input_frame / (2*STEREO_DMX_EVS_SUBBAND_SIZE); + n0 = input_frame / ( 4 * STEREO_DMX_EVS_SUBBAND_SIZE ); + input_frame_pha = input_frame / ( 2 * STEREO_DMX_EVS_SUBBAND_SIZE ); - if (input_frame == L_FRAME16k) { + if ( input_frame == L_FRAME16k ) + { p_ipd_w = dft_trigo_32k; rfft_ipd_coef_step = 4; - } else if (input_frame == L_FRAME32k) { + } + else if ( input_frame == L_FRAME32k ) + { p_ipd_w = dft_trigo_32k; rfft_ipd_coef_step = 2; - } else if (input_frame == L_FRAME48k) { + } + else if ( input_frame == L_FRAME48k ) + { p_ipd_w = dft_trigo_48k; rfft_ipd_coef_step = 2; - } else { + } + else + { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" ); } win = hStereoDmxEVS->hPHA->rfft_ipd_coef; len = rfft_ipd_coef_step * STEREO_DMX_EVS_SUBBAND_SIZE; - for (n = 0; n < n0; n++) { + for ( n = 0; n < n0; n++ ) + { win[n] = p_ipd_w[n * len]; win[input_frame_pha - n] = p_ipd_w[n * len]; } @@ -1611,13 +1677,14 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - hStereoDmxEVS->hPHA->fad_len_prc = (int16_t)(STEREO_DMX_EVS_FADE_LEN_PRC * (float)input_Fs / 1000.0); + hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0 ); fad_len = hStereoDmxEVS->hPHA->fad_len_prc; fad_g = hStereoDmxEVS->hPHA->fad_g_prc; - fad_r = 1.0f / (float)(fad_len + 1); + fad_r = 1.0f / (float) ( fad_len + 1 ); fad_len2 = fad_len / 2; - for (n = 0, m=(fad_len-1); n < fad_len2; n++, m--) { - fad_g[n] = (float)(n+1) * fad_r; + for ( n = 0, m = ( fad_len - 1 ); n < fad_len2; n++, m-- ) + { + fad_g[n] = (float) ( n + 1 ) * fad_r; fad_g[m] = 1.0f - fad_g[n]; } @@ -1631,7 +1698,7 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->trns_aux_energy[n] = 0.0f; } -#endif +#endif *hStereoDmxEVS_out = hStereoDmxEVS; @@ -1666,7 +1733,7 @@ void stereo_dmx_evs_close_encoder( free( ( *hStereoDmxEVS )->hPHA ); ( *hStereoDmxEVS )->hPHA = NULL; } -#endif +#endif free( ( *hStereoDmxEVS ) ); ( *hStereoDmxEVS ) = NULL; -- GitLab From dca794ccda5e821838567f8b0fcad711cfa7fb8b Mon Sep 17 00:00:00 2001 From: Jan Brouwer Date: Wed, 24 May 2023 12:00:15 +0200 Subject: [PATCH 059/381] moved changes to IVAS_REND_AUDIO_CONFIG_BINAURAL* inside #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG --- lib_rend/lib_rend.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 8238e40bfb..c50868c7fb 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -112,13 +112,13 @@ typedef enum IVAS_REND_AUDIO_CONFIG_OBJECT = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED << 8 | 0, + IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, + IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 3, - IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 4, - IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 5, + IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, + IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 3, + IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 4, #endif - IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, - IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, IVAS_REND_AUDIO_CONFIG_MASA1 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 0, IVAS_REND_AUDIO_CONFIG_MASA2 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 1, -- GitLab From 7b2af10911288c0bc7d9f376cf1696dff9392149 Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Wed, 24 May 2023 19:38:00 +0530 Subject: [PATCH 060/381] Build fixes for macro disabled cases --- lib_dec/ivas_jbm_dec.c | 40 ++++++++++++++++++++++++++++++++ lib_enc/ivas_mc_paramupmix_enc.c | 5 ++++ lib_enc/ivas_sba_enc.c | 4 ++++ 3 files changed, 49 insertions(+) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 2ecbc9b382..c502d152bb 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -181,13 +181,21 @@ ivas_error ivas_jbm_dec_tc( set_s( nb_bits_metadata, 0, MAX_SCE ); /* read parameters from the bitstream */ +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT ) +#endif { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; if ( st_ivas->ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, hodirac_flag, 0 ); +#else + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, 0 ); +#endif } else { @@ -197,12 +205,20 @@ ivas_error ivas_jbm_dec_tc( } } } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; +#ifndef SBA_MODE_CLEAN_UP ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands ); +#else + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands ); +#endif } if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) @@ -249,7 +265,11 @@ ivas_error ivas_jbm_dec_tc( { nchan_remapped = nchan_out; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); @@ -280,11 +300,19 @@ ivas_error ivas_jbm_dec_tc( { nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame ); +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) +#else + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) +#endif { ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else +#endif { ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); } @@ -735,7 +763,11 @@ ivas_error ivas_jbm_dec_render( { ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT ) +#else + else if ( st_ivas->ivas_format == MASA_FORMAT ) +#endif { if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { @@ -1241,8 +1273,12 @@ int16_t ivas_jbm_dec_get_num_tc_channels( Decoder_Struct *st_ivas ) /* i : IVAS } if ( st_ivas->ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && num_tc >= 3 ) || ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && num_tc == 3 ) ) +#else + if ( ( st_ivas->sba_planar && num_tc >= 3 ) || ( num_tc == 3 ) ) +#endif { num_tc++; } @@ -1684,7 +1720,11 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( Decoder_Struct *st_ivas ) } break; case RENDERER_SBA_LINEAR_DEC: +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) +#endif { buffer_mode = TC_BUFFER_MODE_BUFFER; } diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 997b0043ac..562a75320a 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -184,8 +184,13 @@ ivas_error ivas_mc_paramupmix_enc_open( /* set FB config. */ /* need to set num output channels to a value > 0 to get pFb != NULL */ +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index ebd9f74ebb..632fd041de 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -297,7 +297,11 @@ int16_t ivas_sba_get_max_md_bits( max_bits = 500; } max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, max_bits ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) +#endif { max_md_bits += st_ivas->hSpar->hMdEnc->spar_md_cfg.max_md_bits_spar; } -- GitLab From 6f0157914df7cf772288eafb4bcdc00cd6b073c7 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Fri, 26 May 2023 02:22:18 +0200 Subject: [PATCH 061/381] Final Update 2. --- lib_com/ivas_cnst.h | 11 +- lib_enc/ivas_stat_enc.h | 8 +- lib_enc/ivas_stereo_dmx_evs.c | 375 +++++++++++++++------------------- 3 files changed, 175 insertions(+), 219 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 696b5cc35b..e94cb926a6 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1660,21 +1660,20 @@ typedef enum * Stereo downmix EVS constants *----------------------------------------------------------------------------------*/ -#define STEREO_DMX_EVS_PHA_LEN_16 24 +#define STEREO_DMX_EVS_PHA_LEN_16 48 #define STEREO_DMX_EVS_FAD_LEN_16 160 -#define STEREO_DMX_EVS_PHA_LEN_32 48 +#define STEREO_DMX_EVS_PHA_LEN_32 96 #define STEREO_DMX_EVS_FAD_LEN_32 320 -#define STEREO_DMX_EVS_PHA_LEN_48 48 +#define STEREO_DMX_EVS_PHA_LEN_48 96 #define STEREO_DMX_EVS_FAD_LEN_48 480 #define STEREO_DMX_EVS_SUBBAND_SIZE 2 #define STEREO_DMX_EVS_NB_SUBBAND_MAX (L_FRAME48k / (2 * STEREO_DMX_EVS_SUBBAND_SIZE)) -#define STEREO_DMX_EVS_PHA_LEN_MAX 48 /* Max of PHA_LEN */ +#define STEREO_DMX_EVS_PHA_LEN_MAX 96 /* Max of PHA_LEN */ #define STEREO_DMX_EVS_FAD_LEN_MAX 480 /* Max of FAD_LEN */ -#define STEREO_DMX_EVS_DATA_LEN_MAX (L_FRAME48k + STEREO_DMX_EVS_PHA_LEN_MAX) -#define STEREO_DMX_EVS_DATA_LEN2_MAX (L_FRAME48k + STEREO_DMX_EVS_PHA_LEN_MAX/2) +#define STEREO_DMX_EVS_DATA_LEN_MAX (STEREO_DMX_EVS_PHA_LEN_MAX + L_FRAME48k) typedef enum { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index e9b19b2259..362cd57588 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -971,6 +971,8 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure typedef struct stereo_dmx_evs_correlation_filter_structure { int16_t init_frmCntr; + float isd_rate_s; + float iccr_s; float ipd_ff[STEREO_DMX_EVS_NB_SUBBAND_MAX]; float Pr[STEREO_DMX_EVS_NB_SUBBAND_MAX]; float Pi[STEREO_DMX_EVS_NB_SUBBAND_MAX]; @@ -985,7 +987,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float *p_curr_taps[CPE_CHANNELS], curr_taps[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; float data_mem[CPE_CHANNELS][STEREO_DMX_EVS_PHA_LEN_MAX]; - float poc_sync_mem[STEREO_DMX_EVS_PHA_LEN_MAX / 2]; STEREO_DMX_EVS_PHA curr_pha; STEREO_DMX_EVS_PHA prev_pha; @@ -998,11 +999,6 @@ typedef struct stereo_dmx_evs_correlation_filter_structure float fad_g_prc[L_FRAME48k]; int16_t fad_len_prc; - float dmx_pha_ener; - float dmx_poc_ener; - float dmx_pha_old_gain; - float dmx_poc_old_gain; - float trns_aux_energy[CPE_CHANNELS]; float crst_fctr; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 1805750062..90af69e871 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -67,12 +67,22 @@ #ifdef ENHANCED_STEREO_DMX -#define STEREO_DMX_EVS_ISD_THRES 1.3f +#define STEREO_DMX_EVS_ISD_FORGETTING 0.95f +#define STEREO_DMX_EVS_ISD_THRES_H 1.69f +#define STEREO_DMX_EVS_ISD_THRES_L 0.9f +#define STEREO_DMX_EVS_ISD_DIST_THRES_IPD 0.5f + +#define STEREO_DMX_EVS_ISD_DIST_HYST_L 0.36f +#define STEREO_DMX_EVS_ISD_DIST_HYST_H 0.43f + +#define STEREO_DMX_EVS_ICCR_FORGETTING 0.7f +#define STEREO_DMX_EVS_ICCR_HYST_L 0.75f +#define STEREO_DMX_EVS_ICCR_HYST_H 0.85f #define STEREO_DMX_EVS_SWTCH_HYS_THRES 1 -#define STEREO_DMX_EVS_LR_EGY 100.0f +#define STEREO_DMX_EVS_LR_EGY 15.0f #define STEREO_DMX_EVS_ILDS_EGY 10000.0f -#define STEREO_DMX_EVS_ILD_PRC 0.3f +#define STEREO_DMX_EVS_ILD_PRC 0.1f #define STEREO_DMX_EVS_SWTCH_PRC_THRES_16 55 #define STEREO_DMX_EVS_SWTCH_PRC_THRES_32 19 @@ -88,7 +98,6 @@ #define STEREO_DMX_EVS_CRST_FCTR_48 35.0f #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f -#define STEREO_DMX_EVS_PHA_EGY_FORGETTING 0.79f #endif @@ -203,13 +212,11 @@ static void calc_poc( float eps_cos, eps_sin, EPS; #ifdef ENHANCED_STEREO_DMX - - int16_t isd_cnt, n, freq8k, nsbd, input_frame_pha, pha_len2; - float Nr, Ni, Dr, Di, tPr, tPi, Pn, energy, isd_band; - - float *Pr, *Pi, *ipd_ff, *p_taps_0, *p_taps_1; + int16_t isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha; + float Nr, Ni, Dr, Di, tPr, tPi, Pn, energy, isd_rate; + float eneL, eneR, IPDr, IPDi, tIPDr, tIPDi, ICCr; + float *Pr, *Pi, *ipd_ff, *p_curr_taps; float rfft_pha_buf[L_FRAME48k], tEr[STEREO_DMX_EVS_NB_SUBBAND_MAX], tEl[STEREO_DMX_EVS_NB_SUBBAND_MAX]; - #endif /* Initialization */ @@ -394,7 +401,8 @@ static void calc_poc( { hPHA->init_frmCntr = 0; } - freq8k = L_FRAME16k / 2; + freq_8k = L_FRAME16k / 2; + freq_ipd_max = (int16_t) ( freq_8k * 5000. / ( 8000 * STEREO_DMX_EVS_SUBBAND_SIZE ) ); // Memorize the filters N-1 for ( n = 0; n < CPE_CHANNELS; n++ ) @@ -408,23 +416,31 @@ static void calc_poc( { hPHA->p_prev_taps[n] = NULL; } - - hPHA->p_curr_taps[n] = NULL; } // ISD - isd_band = 0.0f; - for ( i = 1; i <= freq8k; i++ ) + isd_cnt_l = 0; + isd_cnt_h = 0; + for ( i = 1; i <= freq_8k; i++ ) { Nr = ( specLr[i] - specRr[i] ); Ni = ( specLi[i] - specRi[i] ); Dr = ( specLr[i] + specRr[i] ); Di = ( specLi[i] + specRi[i] ); - isd_band += (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( Dr * Dr + Di * Di ) ); + if ( ( Nr * Nr + Ni * Ni ) > STEREO_DMX_EVS_ISD_THRES_H * ( Dr * Dr + Di * Di ) ) + { + isd_cnt_h++; + } + if ( ( Nr * Nr + Ni * Ni ) < STEREO_DMX_EVS_ISD_THRES_L * ( Dr * Dr + Di * Di ) ) + { + isd_cnt_l++; + } } - isd_band /= freq8k; - if ( isd_band > STEREO_DMX_EVS_ISD_THRES ) + isd_rate = (float) isd_cnt_h / (float) freq_8k; + hPHA->isd_rate_s = STEREO_DMX_EVS_ISD_FORGETTING * hPHA->isd_rate_s + ( 1.0f - STEREO_DMX_EVS_ISD_FORGETTING ) * isd_rate; + + if ( hPHA->isd_rate_s > STEREO_DMX_EVS_ISD_DIST_HYST_H ) { if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD ) { @@ -442,9 +458,10 @@ static void calc_poc( hPHA->curr_pha = STEREO_DMX_EVS_PHA_IPD; } } + hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD; } - else + else if ( hPHA->isd_rate_s < STEREO_DMX_EVS_ISD_DIST_HYST_L ) { if ( hPHA->curr_pha != STEREO_DMX_EVS_PHA_IPD2 ) { @@ -465,61 +482,87 @@ static void calc_poc( hPHA->prev_pha = STEREO_DMX_EVS_PHA_IPD2; } - if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD ) + ipd_ff = hPHA->ipd_ff; + + Nr = 0; + Ni = 0; + eneL = 0; + eneR = 0; + + for ( n = 1, i = 1; n < nsbd; n++ ) { - ipd_ff = hPHA->ipd_ff; + tPr = 0.0f; + tPi = 0.0f; + tEr[n] = 0.0f; + tEl[n] = 0.0f; - for ( n = 1, i = 1; n < nsbd; n++ ) + for ( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++ ) { - tPr = 0.0f; - tPi = 0.0f; - tEr[n] = 0.0f; - tEl[n] = 0.0f; + // Energy + tEl[n] += specLr[i] * specLr[i] + specLi[i] * specLi[i]; + tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i]; - for ( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++ ) - { - tPr += specLr[i] * specRr[i] + specLi[i] * specRi[i]; - tPi += specLi[i] * specRr[i] - specLr[i] * specRi[i]; - tEl[n] += specLr[i] * specLr[i] + specLi[i] * specLi[i]; - tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i]; - } + // IPD + IPDr = specLr[i] * specRr[i] + specLi[i] * specRi[i]; + IPDi = specLi[i] * specRr[i] - specLr[i] * specRi[i]; + tPr += IPDr; + tPi += IPDi; - Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON ); - tPr *= Pn; - tPi *= Pn; + // ICCr + Pn = (float) inv_sqrt( ( IPDr * IPDr + IPDi * IPDi ) + EPSILON ); + IPDr *= Pn; + IPDi *= Pn; - if ( hPHA->init_frmCntr == 0 ) - { - Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; - Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; - Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); - Pr[n] *= Pn; - Pi[n] *= Pn; - } - else - { - Pr[n] = tPr; - Pi[n] = tPi; - } + tIPDr = ( specRr[i] * IPDr - specRi[i] * IPDi ); + tIPDi = ( specRr[i] * IPDi + specRi[i] * IPDr ); + + Nr += ( specLr[i] * tIPDr + specLi[i] * tIPDi ); + Ni += ( specLi[i] * tIPDr - specLr[i] * tIPDi ); + + eneL += ( specLr[i] * specLr[i] + specLi[i] * specLi[i] ); + eneR += ( specRr[i] * specRr[i] + specRi[i] * specRi[i] ); } - for ( n = 0; n < CPE_CHANNELS; n++ ) + Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON ); + tPr *= Pn; + tPi *= Pn; + + if ( hPHA->init_frmCntr == 0 ) { - hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; + Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; + Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; + Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); + Pr[n] *= Pn; + Pi[n] *= Pn; + } + else + { + Pr[n] = tPr; + Pi[n] = tPi; } + Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; + Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; + } + ICCr = sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); + hPHA->iccr_s = STEREO_DMX_EVS_ICCR_FORGETTING * hPHA->iccr_s + ( 1.0f - STEREO_DMX_EVS_ICCR_FORGETTING ) * ICCr; + + if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD ) + { + hPHA->p_curr_taps[0] = NULL; + hPHA->p_curr_taps[1] = hPHA->curr_taps[1]; + rfft_pha_buf[0] = 1.; rfft_pha_buf[1] = 1.; - isd_cnt = 0; + ild_cnt = 0; for ( i = 1; i < nsbd; i++ ) { rfft_pha_buf[i * 2] = Pr[i]; rfft_pha_buf[i * 2 + 1] = Pi[i]; - if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) { - isd_cnt++; + ild_cnt++; tEr[i] = 1; } else @@ -527,8 +570,7 @@ static void calc_poc( tEr[i] = -1; } } - - if ( isd_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) + if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) { for ( i = 1; i < nsbd; i++ ) { @@ -541,155 +583,97 @@ static void calc_poc( } rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); - - pha_len2 = hPHA->pha_len / 2; - - p_taps_1 = hPHA->p_curr_taps[1]; - p_taps_0 = &( rfft_pha_buf[input_frame_pha - pha_len2] ); - for ( i = 0; i < pha_len2; i++ ) - { - p_taps_1[i] = p_taps_0[i]; - } - - p_taps_1 = &( hPHA->p_curr_taps[1][pha_len2] ); - for ( i = 0; i < pha_len2; i++ ) - { - p_taps_1[i] = rfft_pha_buf[i]; - } - - p_taps_0 = hPHA->p_curr_taps[0]; - set_zero( p_taps_0, hPHA->pha_len ); - p_taps_0[pha_len2] = 1.0f; + mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); } else { - ipd_ff = hPHA->ipd_ff; - - for ( n = 1, i = 1; n < nsbd; n++ ) + if ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_L ) || ( ( hPHA->iccr_s < STEREO_DMX_EVS_ICCR_HYST_H ) && ( hPHA->p_curr_taps[0] != NULL ) ) ) { - tPr = 0.0f; - tPi = 0.0f; - tEr[n] = 0.0f; - tEl[n] = 0.0f; + // IPDn + + set_f( &( Pr[freq_ipd_max] ), 1.0f, ( nsbd - freq_ipd_max ) ); + set_f( &( Pi[freq_ipd_max] ), 0.0f, ( nsbd - freq_ipd_max ) ); - for ( j = 0; j < STEREO_DMX_EVS_SUBBAND_SIZE; j++, i++ ) + for ( n = 0; n < CPE_CHANNELS; n++ ) { - tPr += specLr[i] * specRr[i] + specLi[i] * specRi[i]; - tPi += specLi[i] * specRr[i] - specLr[i] * specRi[i]; - tEl[n] += specLr[i] * specLr[i] + specLi[i] * specLi[i]; - tEr[n] += specRr[i] * specRr[i] + specRi[i] * specRi[i]; + hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; } - Pn = (float) inv_sqrt( ( tPr * tPr + tPi * tPi ) + EPSILON ); - tPr *= Pn; - tPi *= Pn; + rfft_pha_buf[0] = 1.; + rfft_pha_buf[1] = 1.; - if ( hPHA->init_frmCntr == 0 ) + ild_cnt = 0; + isd_rate = (float) isd_cnt_l / freq_8k; + for ( i = 1; i < nsbd; i++ ) { - Pr[n] = ipd_ff[n] * Pr[n] + ( 1.0f - ipd_ff[n] ) * tPr; - Pi[n] = ipd_ff[n] * Pi[n] + ( 1.0f - ipd_ff[n] ) * tPi; - Pn = (float) inv_sqrt( ( Pr[n] * Pr[n] + Pi[n] * Pi[n] ) + EPSILON ); - Pr[n] *= Pn; - Pi[n] *= Pn; + rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); + rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); + if ( isd_rate > STEREO_DMX_EVS_ISD_DIST_THRES_IPD ) + { + rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); + rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); + } + + if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + { + ild_cnt++; + tEr[i] = 1; + } + else + { + tEr[i] = -1; + } } - else + if ( ild_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) { - Pr[n] = tPr; - Pi[n] = tPi; + for ( i = 1; i < nsbd; i++ ) + { + if ( tEr[i] > 0 ) + { + rfft_pha_buf[i * 2] = 1.; + rfft_pha_buf[i * 2 + 1] = 0.; + } + } } - Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; - Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; - } - - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - hPHA->p_curr_taps[n] = hPHA->curr_taps[n]; - } - - rfft_pha_buf[0] = 1.; - rfft_pha_buf[1] = 1.; - - isd_cnt = 0; - for ( i = 1; i < nsbd; i++ ) - { - rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + Pr[i] ) / 2.0f ); - rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - Pr[i] ) / 2.0f ) * sign( Pi[i] ); - rfft_pha_buf[i * 2 + 1] = (float) sqrt( ( 1.0f - rfft_pha_buf[i * 2] ) / 2.0f ) * sign( rfft_pha_buf[i * 2 + 1] ); - rfft_pha_buf[i * 2] = (float) sqrt( ( 1.0f + rfft_pha_buf[i * 2] ) / 2.0f ); + rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); + mvr2r( rfft_pha_buf, hPHA->p_curr_taps[1], hPHA->pha_len ); - - if ( ( tEr[i] > STEREO_DMX_EVS_LR_EGY * tEl[i] ) || ( tEl[i] > STEREO_DMX_EVS_LR_EGY * tEr[i] ) ) + // PHA L2R + p_curr_taps = hPHA->p_curr_taps[0]; + p_curr_taps[0] = rfft_pha_buf[0]; + for ( i = 1; i < hPHA->pha_len; i++ ) { - isd_cnt++; - tEr[i] = 1; - } - else - { - tEr[i] = -1; + p_curr_taps[i] = rfft_pha_buf[input_frame_pha - i]; } } - - if ( isd_cnt > nsbd * STEREO_DMX_EVS_ILD_PRC ) + else { - for ( i = 1; i < nsbd; i++ ) + for ( n = 0; n < CPE_CHANNELS; n++ ) { - if ( tEr[i] > 0 ) - { - rfft_pha_buf[i * 2] = 1.; - rfft_pha_buf[i * 2 + 1] = 0.; - } + hPHA->p_curr_taps[n] = NULL; } } - - rfft( rfft_pha_buf, hPHA->rfft_ipd_coef, input_frame_pha, +1 ); - - pha_len2 = hPHA->pha_len / 2; - - p_taps_1 = hPHA->p_curr_taps[1]; - p_taps_0 = &( rfft_pha_buf[input_frame_pha - pha_len2] ); - for ( i = 0; i < pha_len2; i++ ) - { - p_taps_1[i] = p_taps_0[i]; - } - - p_taps_1 = &( hPHA->p_curr_taps[1][pha_len2] ); - for ( i = 0; i < pha_len2; i++ ) - { - p_taps_1[i] = rfft_pha_buf[i]; - } - - // PHA L2R - - p_taps_0 = hPHA->p_curr_taps[0]; - p_taps_1 = hPHA->p_curr_taps[1]; - for ( i = 0, j = ( hPHA->pha_len - 1 ); i < ( hPHA->pha_len - 1 ); i++, j-- ) - { - p_taps_0[i + 1] = p_taps_1[j]; - } - p_taps_0[0] = rfft_pha_buf[pha_len2]; } for ( n = 0; n < CPE_CHANNELS; n++ ) { if ( hPHA->p_curr_taps[n] ) { - p_taps_0 = hPHA->p_curr_taps[n]; - for ( i = 0; i < hPHA->pha_len; i++ ) { - p_taps_0[i] *= hPHA->win[i]; + hPHA->p_curr_taps[n][i] *= hPHA->win[i]; } energy = 0.; for ( i = 0; i < hPHA->pha_len; i++ ) { - energy += p_taps_0[i] * p_taps_0[i]; + energy += hPHA->p_curr_taps[n][i] * hPHA->p_curr_taps[n][i]; } energy = (float) inv_sqrt( energy + EPSILON ); for ( i = 0; i < hPHA->pha_len; i++ ) { - p_taps_0[i] *= energy; + hPHA->p_curr_taps[n][i] *= energy; } } } @@ -1161,10 +1145,10 @@ void stereo_dmx_evs_enc( float data_f[CPE_CHANNELS][L_FRAME48k]; #ifdef ENHANCED_STEREO_DMX - int16_t k, m, pha_len, pha_len2, fad_len; + int16_t k, m, pha_len, fad_len; float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; - float *dmx_poc_data, dmx_poc_data_sync[STEREO_DMX_EVS_DATA_LEN2_MAX], dmx_pha_data[L_FRAME48k], *p_dmx_data, dmx_gain, ftmp; + float dmx_poc_data[L_FRAME48k], dmx_pha_data[L_FRAME48k], *p_dmx_data, ftmp; STEREO_DMX_EVS_PRC curr_prc; int16_t input_subframe, is_transient; float *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; @@ -1242,21 +1226,9 @@ void stereo_dmx_evs_enc( dmx_weight = 0.5f; } - pha_len2 = hStereoDmxEVS->hPHA->pha_len / 2; - - mvr2r( hStereoDmxEVS->hPHA->poc_sync_mem, dmx_poc_data_sync, pha_len2 ); - dmx_poc_data = &( dmx_poc_data_sync[pha_len2] ); - create_M_signal( data_f[0], data_f[1], dmx_poc_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); - calc_energy( dmx_poc_data, dmx_poc_data, &( hStereoDmxEVS->hPHA->dmx_poc_ener ), n_samples, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); - dmx_gain = INV_SQRT_2 * (float) sqrt( ( hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1] ) / ( hStereoDmxEVS->hPHA->dmx_poc_ener ) ); - adapt_gain( dmx_poc_data, dmx_poc_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_poc_old_gain, n_samples, hStereoDmxEVS->s_wnd ); - hStereoDmxEVS->hPHA->dmx_poc_old_gain = dmx_gain; - - mvr2r( &( dmx_poc_data[n_samples - pha_len2] ), hStereoDmxEVS->hPHA->poc_sync_mem, pha_len2 ); - // pha pha_len = hStereoDmxEVS->hPHA->pha_len; @@ -1283,14 +1255,14 @@ void stereo_dmx_evs_enc( { ftmp += p_data_mem[n - m] * p_prev_taps[m]; } - mem_prev[n] += ftmp; + mem_prev[n] += ftmp * INV_SQRT_2; } } else { for ( n = 0; n < fad_len; n++ ) { - mem_prev[n] += p_data[n]; + mem_prev[n] += p_data[n] * INV_SQRT_2; } } @@ -1303,14 +1275,14 @@ void stereo_dmx_evs_enc( { ftmp += p_data_mem[n - m] * p_curr_taps[m]; } - dmx_pha_data[n] += ftmp; + dmx_pha_data[n] += ftmp * INV_SQRT_2; } } else { for ( n = 0; n < n_samples; n++ ) { - dmx_pha_data[n] += p_data[n]; + dmx_pha_data[n] += p_data[n] * INV_SQRT_2; } } } @@ -1321,11 +1293,6 @@ void stereo_dmx_evs_enc( dmx_pha_data[n] += ( mem_prev[n] ) * fad_g[m]; } - calc_energy( dmx_pha_data, dmx_pha_data, &( hStereoDmxEVS->hPHA->dmx_pha_ener ), n_samples, STEREO_DMX_EVS_DMX_EGY_FORGETTING ); - dmx_gain = INV_SQRT_2 * (float) sqrt( ( hStereoDmxEVS->aux_dmx_energy[0] + hStereoDmxEVS->aux_dmx_energy[1] ) / ( hStereoDmxEVS->hPHA->dmx_pha_ener + EPSILON ) ); - adapt_gain( dmx_pha_data, dmx_pha_data, dmx_gain, hStereoDmxEVS->hPHA->dmx_pha_old_gain, n_samples, hStereoDmxEVS->s_wnd ); - hStereoDmxEVS->hPHA->dmx_pha_old_gain = dmx_gain; - // prc switch curr_prc = hStereoDmxEVS->hPHA->curr_prc; @@ -1370,7 +1337,7 @@ void stereo_dmx_evs_enc( hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_PHA; } - if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) ) + if ( ( is_transient == 1 ) || ( hStereoDmxEVS->aux_dmx_energy[0] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[1] ) || ( hStereoDmxEVS->aux_dmx_energy[1] > STEREO_DMX_EVS_ILDS_EGY * hStereoDmxEVS->aux_dmx_energy[0] ) || ( ( hStereoDmxEVS->hPHA->p_curr_taps[0] == NULL ) && ( hStereoDmxEVS->hPHA->p_curr_taps[1] == NULL ) ) ) { hStereoDmxEVS->hPHA->curr_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prc_hys_cnt = 0; @@ -1378,7 +1345,7 @@ void stereo_dmx_evs_enc( if ( hStereoDmxEVS->hPHA->curr_prc == STEREO_DMX_EVS_PRC_POC ) { - p_dmx_data = dmx_poc_data_sync; + p_dmx_data = dmx_poc_data; if ( curr_prc != hStereoDmxEVS->hPHA->curr_prc ) { @@ -1404,7 +1371,7 @@ void stereo_dmx_evs_enc( for ( n = 0, m = ( fad_len - 1 ); n < fad_len; n++, m-- ) { p_dmx_data[n] *= fad_g[n]; - p_dmx_data[n] += fad_g[m] * dmx_poc_data_sync[n]; + p_dmx_data[n] += fad_g[m] * dmx_poc_data[n]; } } } @@ -1561,8 +1528,6 @@ ivas_error stereo_dmx_evs_init_encoder( set_zero( hStereoDmxEVS->hPHA->curr_taps[n], STEREO_DMX_EVS_PHA_LEN_MAX ); } - set_zero( hStereoDmxEVS->hPHA->poc_sync_mem, STEREO_DMX_EVS_PHA_LEN_MAX / 2 ); - if ( input_Fs == 16000 ) { len = STEREO_DMX_EVS_PHA_LEN_16; @@ -1589,21 +1554,22 @@ ivas_error stereo_dmx_evs_init_encoder( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sampling frequency\n" ); } - hStereoDmxEVS->hPHA->pha_len = len; - hStereoDmxEVS->hPHA->init_frmCntr = (int16_t) ( FRAMES_PER_SEC * 0.2f ); + hStereoDmxEVS->hPHA->pha_len = len / 2; + hStereoDmxEVS->hPHA->init_frmCntr = (int16_t) FRAMES_PER_SEC * 0.2f; + hStereoDmxEVS->hPHA->isd_rate_s = 0.0f; + hStereoDmxEVS->hPHA->iccr_s = 0.0f; pha_len = hStereoDmxEVS->hPHA->pha_len; fad_len = hStereoDmxEVS->hPHA->fad_len; trans_len = (int16_t) ( (float) pha_len / 20.0f ); - set_f( hStereoDmxEVS->hPHA->win, 1.0f, pha_len ); + set_f( hStereoDmxEVS->hPHA->win, 1.8f, pha_len - trans_len ); + hStereoDmxEVS->hPHA->win[0] = 1.0f; tmp_r = 1.0f / ( ( trans_len * 2 ) + 1 ); - win = hStereoDmxEVS->hPHA->win; - for ( n = 0, m = ( trans_len - 1 ); n < trans_len; n++, m-- ) + win = &( hStereoDmxEVS->hPHA->win[pha_len - trans_len] ); + for ( n = 0; n < trans_len; n++ ) { - itrh = pha_len - trans_len + n; - win[itrh] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ); - win[m] = win[itrh]; + win[n] = ( 0.5f * ( 1.0f + cosf( ( PI2 * ( n + 1 ) ) * tmp_r ) ) ) * 1.8f; } fad_g = hStereoDmxEVS->hPHA->fad_g; @@ -1688,11 +1654,6 @@ ivas_error stereo_dmx_evs_init_encoder( fad_g[m] = 1.0f - fad_g[n]; } - hStereoDmxEVS->hPHA->dmx_pha_ener = 0; - hStereoDmxEVS->hPHA->dmx_poc_ener = 0; - hStereoDmxEVS->hPHA->dmx_pha_old_gain = 1.; - hStereoDmxEVS->hPHA->dmx_poc_old_gain = 1.; - for ( n = 0; n < CPE_CHANNELS; n++ ) { hStereoDmxEVS->hPHA->trns_aux_energy[n] = 0.0f; -- GitLab From 3c8a15b942054b9520c659c6060a747ccaaf1ef2 Mon Sep 17 00:00:00 2001 From: torresjua <259-jtorr@users.noreply.gitlab.example.com> Date: Fri, 26 May 2023 03:37:55 +0000 Subject: [PATCH 062/381] Update lib_dec/ivas_stat_dec.h, lib_dec/ivas_init_dec.c, lib_dec/ivas_sba_dec.c, lib_dec/ivas_spar_md_dec.c, lib_enc/ivas_agc_enc.c, lib_enc/ivas_dirac_enc.c, lib_enc/ivas_lfe_enc.c, lib_enc/ivas_spar_encoder.c, lib_enc/ivas_spar_md_enc.c --- lib_dec/ivas_init_dec.c | 3 +-- lib_dec/ivas_sba_dec.c | 10 ++-------- lib_dec/ivas_spar_md_dec.c | 3 +-- lib_dec/ivas_stat_dec.h | 1 - lib_enc/ivas_agc_enc.c | 6 ++---- lib_enc/ivas_dirac_enc.c | 7 +------ lib_enc/ivas_lfe_enc.c | 1 - lib_enc/ivas_spar_encoder.c | 2 -- lib_enc/ivas_spar_md_enc.c | 2 +- 9 files changed, 8 insertions(+), 27 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 45dff5da5d..6661d1d4c4 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -458,8 +458,7 @@ static ivas_error ivas_read_format( { int16_t tc_mode_offset; tc_mode_offset = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); - idx = st_ivas->bit_stream[tc_mode_offset]; - // TODO: needs more work for HOA + idx = st_ivas->bit_stream[tc_mode_offset]; if ( st_ivas->sba_analysis_order == 0 ) { st_ivas->sba_analysis_order = SBA_FOA_ORDER; diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index ec47273c64..c822560b9d 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -59,13 +59,7 @@ void ivas_sba_set_cna_cng_flag( { int16_t n, cpe_id; - if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 ) - { - /* skip as done in init function */ - /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */ /* Todo: Check if these can be enabled */ - /* st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 0; */ - } - else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) ) + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; @@ -74,7 +68,7 @@ void ivas_sba_set_cna_cng_flag( { for ( n = 0; n < CPE_CHANNELS; n++ ) { - st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; /* Todo: Check if these can be enabled */ + st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1; } } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 51e3d4c77c..1922387011 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -43,7 +43,6 @@ #include "wmc_auto.h" #include "ivas_stat_dec.h" -/*#define ENABLE_DITHER */ /* IVAS_fmToDo: development switch */ /*------------------------------------------------------------------------------------------* * Local constants @@ -584,7 +583,7 @@ static ivas_error ivas_spar_set_dec_config( case 4: /* FOA_CHANNELS */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_3CH; break; - case 9: /* IVAS_HOA_2_CH */ // ToDo: is this relevant? + case 9: /* IVAS_HOA_2_CH */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_5CH; break; case 16: /* IVAS_HOA_3_CH */ // ToDo: is this relevant? diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index ad453cd5bd..f661903c26 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -798,7 +798,6 @@ typedef struct ivas_spar_md_dec_state_t int16_t td_decorr_flag; int16_t spar_plc_enable_fadeout_flag; float ***mixer_mat; - /*TODO : reuse hFbMixer->prior_mixer for this as that buffer is unused in decoder with FB_HARMONIZATION*/ float mixer_mat_prev[MAX_PARAM_SPATIAL_SUBFRAMES + 1][IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; ivas_spar_md_com_cfg spar_md_cfg; ivas_arith_coeffs_t arith_coeffs; diff --git a/lib_enc/ivas_agc_enc.c b/lib_enc/ivas_agc_enc.c index 83dbdad1e1..641965e90a 100644 --- a/lib_enc/ivas_agc_enc.c +++ b/lib_enc/ivas_agc_enc.c @@ -454,8 +454,7 @@ void ivas_agc_enc_process( #ifdef DEBUG_AGC /* writing to a temporary bitstream file */ if ( ivas_agc_writeBits( agcOut, n_channels, pState ) ) - { - /* TODO: return error once error codes are harmonized */ + { IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "SPAR ENC AGC Failed to open agcOut\n " ); } #endif @@ -476,8 +475,7 @@ static int16_t ivas_agc_writeBits( FILE *stream, const int16_t n_channels, ivas_ { if ( pState->gain_data[i].absGainExpCurr < 0 || pState->gain_data[i].absGainExpCurr >= (int16_t) pow( 2, pState->agc_com.betaE ) ) - { - /* TODO: return error once error codes are harmonized */ + { IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error Gain values to write!!\n\n" ); } diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 45ce09bb15..158b2afdb2 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -381,12 +381,7 @@ void ivas_dirac_enc( *nb_bits_metadata = hMetaData->nb_bits_tot; if ( Opt_DTX_ON ) - { - /* ToDo: If DIRAC_MIN_BITRATE_4_TRANS_CHAN is reached with DTX on (possible only with bitrate switching) - metadata is not quantized since it can be deduced at the decoder from transmitted TCs. - The solution would be to switch to active-only/ignore and resume DTX operation when switching back to a supported bitrate. - */ - + { if ( !( hQMetaData->no_directions == 1 && hQMetaData->numCodingBands == 5 ) ) { float orig_azi[DIRAC_MAX_NBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index a14424774f..8faa4b1340 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -297,7 +297,6 @@ static void ivas_lfe_enc_quant( { if ( quant_strategy < ( num_quant_strategies - 1 ) ) { - /* reset all indices that were already written - TODO: maybe better store them temporarily first and write at the very end? */ for ( j = hBstr->next_ind - 1; j >= next_ind_pos; j-- ) { hBstr->ind_list[j].nb_bits = -1; diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 894c10a1d0..e8e562c086 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -316,8 +316,6 @@ ivas_error ivas_spar_enc( error = IVAS_ERR_OK; hEncoderConfig = st_ivas->hEncoderConfig; - // ToDo: can hFbMixer->ppFilterbank_prior_input be replaced by st->input ? - /* check last sba_mode */ if ( ivas_sba_mode_select() == SBA_MODE_DIRAC ) { diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index cdfd6050ba..9373dcc342 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -560,7 +560,7 @@ ivas_error ivas_spar_md_enc_process( int16_t code_strat; int16_t bit_pos_start, next_ind_start, last_ind_start; BSTR_ENC_DATA hMetaData_tmp; - Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized + Indice ind_list_tmp[MAX_BITS_METADATA]; float Wscale[IVAS_MAX_NUM_BANDS]; num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; -- GitLab From 6572cd316b1af89c3085a18da76343fe16439689 Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Fri, 26 May 2023 10:10:45 +0530 Subject: [PATCH 063/381] Fix for BE failure fixes observed for 384 and 512 kbps cases --- lib_com/ivas_prot.h | 3 ++- lib_enc/ivas_dirac_enc.c | 6 ++++-- lib_enc/ivas_mcmasa_enc.c | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 03cb1010f3..0dfb1b3b42 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5554,7 +5554,8 @@ void computeReferencePower_enc( #ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode /* i : SBA mode */ #else - const IVAS_FORMAT ivas_format /* i : ivas_format */ + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + int16_t ref_power_w /* i : use 0 if hodirac is enabled */ #endif , const int16_t nchan_ana /* i : number of analysis channels */ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 11b861350e..9d070a549d 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -699,7 +699,8 @@ void computeReferencePower_enc( #ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode /* i : SBA mode */ #else - const IVAS_FORMAT ivas_format /* i : ivas_format */ + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + int16_t ref_power_w /* i : use 0 if hodirac is enabled */ #endif , const int16_t nchan_ana /* i : number of analysis channels */ @@ -737,7 +738,7 @@ void computeReferencePower_enc( #ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) #else - if ( ivas_format == SBA_FORMAT ) + if ( ivas_format == SBA_FORMAT && ref_power_w == 1 ) #endif { for ( i = 0; i < num_freq_bands; i++ ) @@ -881,6 +882,7 @@ void ivas_dirac_param_est_enc( hodirac_flag ? SBA_MODE_DIRAC : sba_mode, #else ivas_format, + hodirac_flag ? 0 : 1, #endif FOA_CHANNELS ); diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 508b13209e..ee7dd02d42 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -991,6 +991,7 @@ void ivas_mcmasa_param_est_enc( SBA_MODE_NONE, #else MC_FORMAT, + 0, #endif FOA_CHANNELS ); -- GitLab From 20d8a9355d796966c7a5b257201164e3d672e24c Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Fri, 26 May 2023 12:05:33 +0530 Subject: [PATCH 064/381] Crash fix in decoder --- lib_dec/ivas_sba_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 9606bc073e..c978db9b61 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -446,7 +446,7 @@ ivas_error ivas_sba_dec_digest_tc( #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hDirAC && !( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode == SBA_MODE_DIRAC ) ) #else - if ( st_ivas->hDirAC && !( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->ivas_format == SBA_FORMAT ) ) + if ( st_ivas->hDirAC ) #endif { ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); -- GitLab From 103a056f02493a4068da6cfb1bd1cda49f30af32 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Fri, 26 May 2023 13:05:59 +0530 Subject: [PATCH 065/381] Fix for the issue# 501 --- lib_com/options.h | 2 ++ lib_dec/ivas_spar_decoder.c | 30 ++++++++++++++++++++++++++++++ lib_dec/ivas_spar_md_dec.c | 28 +++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 33b25d459c..c31f056010 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -206,6 +206,8 @@ #define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ #define FIX_499_DFT_STEREO_PLC /* Eri: Fix for issue 499: Wrong past memory addressed for computing energy of DFT stereo residual ECU frame */ #define FIX_489_COV_SMOOTHING /* Dlb: Fix covariance smoothing for ParamUpmix */ +#define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ + #define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ #define FIX_I503_ASAN_ERROR_IND_LIST /* VA: fix issue #503: address sanitizer error with IND_LIST_DYN */ #define FIX_473_JITTER_NONDIEGETIC_PANNING /* FhG,Orange: add missing non-diegetic panning to JITTER */ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 7609099b5f..b509203c2a 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -736,7 +736,37 @@ static void ivas_spar_dec_MD( ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); } } +#ifdef FIX_501_TABLE_IDX_INIT + else if ( st_ivas->ini_frame == 0 ) + { + if ( st_ivas->sid_format == SID_SBA_2TC ) + { + table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + else + { + table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + + hSpar->hMdDec->table_idx = table_idx; + if ( hSpar->hMdDec->spar_hoa_md_flag ) + { + hSpar->hMdDec->spar_md.num_bands = IVAS_MAX_NUM_BANDS; + } + else + { + hSpar->hMdDec->spar_md.num_bands = min( SPAR_DIRAC_SPLIT_START_BAND, IVAS_MAX_NUM_BANDS ); + } + + if ( hSpar->hMdDec->table_idx != table_idx ) + { + hSpar->hMdDec->table_idx = table_idx; + hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; + ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); + } + } +#endif /*---------------------------------------------------------------------* * Decode MD *---------------------------------------------------------------------*/ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index f9d34970c2..9a47a3562a 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -84,9 +84,11 @@ static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, co static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st, const int16_t bw, const int16_t num_bands, int16_t *num_dmx_per_band, int16_t *num_dec_per_band ); static ivas_error ivas_deindex_real_index( const int16_t *index, const int16_t q_levels, const float min_value, const float max_value, float *quant, const int16_t num_ch_dim2 ); - +#ifdef FIX_501_TABLE_IDX_INIT +static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode, const int32_t last_active_brate ); +#else static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode ); - +#endif /*------------------------------------------------------------------------- * ivas_spar_md_dec_matrix_open() @@ -672,7 +674,12 @@ void ivas_spar_md_dec_process( ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, - ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode ); + ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode +#ifdef FIX_501_TABLE_IDX_INIT + , + st_ivas->last_active_ivas_total_brate +#endif + ); #if 0 { @@ -1708,7 +1715,12 @@ static void ivas_spar_dec_parse_md_bs( int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, - const int16_t sba_inactive_mode ) + const int16_t sba_inactive_mode +#ifdef FIX_501_TABLE_IDX_INIT + , + const int32_t last_active_brate +#endif +) { int16_t i, j, k, num_bands; int16_t ii, jj, ndec, ndm, b, idx; @@ -1812,7 +1824,13 @@ static void ivas_spar_dec_parse_md_bs( *nB = num_bands; *bands_bw = 1; - +#ifdef FIX_501_TABLE_IDX_INIT + if ( ( ivas_total_brate < IVAS_24k4 ) && ( last_active_brate < IVAS_24k4 ) ) + { + *bands_bw = 2; + *nB = num_bands / *bands_bw; + } +#endif return; } -- GitLab From 0197b5b9a8f92a95152546a7f100e4bc8a5b0950 Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Fri, 26 May 2023 13:20:01 +0530 Subject: [PATCH 066/381] Clang format fixes --- lib_com/ivas_dirac_com.c | 104 +++++++++++++------------- lib_com/ivas_fb_mixer.c | 6 +- lib_dec/ivas_dirac_dec.c | 22 +++--- lib_dec/ivas_qmetadata_dec.c | 4 +- lib_dec/ivas_sba_rendering_internal.c | 2 +- lib_dec/ivas_sce_dec.c | 2 +- lib_enc/ivas_dirac_enc.c | 2 +- lib_enc/ivas_enc.c | 2 +- lib_enc/ivas_mcmasa_enc.c | 2 +- lib_enc/ivas_mct_enc.c | 6 +- lib_enc/ivas_qmetadata_enc.c | 18 ++--- lib_enc/ivas_spar_encoder.c | 2 +- 12 files changed, 86 insertions(+), 86 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index dcd5f0bef7..ac7ccc3182 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -541,59 +541,59 @@ ivas_error ivas_dirac_sba_config( &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands ); #else - if ( sba_total_brate <= IVAS_13k2 ) - { - hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 70; - } - else if ( sba_total_brate <= IVAS_16k4 ) - { - hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 80; - } - else if ( sba_total_brate <= IVAS_24k4 ) - { - hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 103; - } - else if ( sba_total_brate <= IVAS_32k ) - { - hQMetaData->bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 214; - } - else if ( sba_total_brate <= IVAS_48k ) - { - hQMetaData->bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 240; - } - else if ( sba_total_brate <= IVAS_64k ) - { - hQMetaData->bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_80k ) - { - hQMetaData->bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_96k ) - { - hQMetaData->bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_128k ) - { - hQMetaData->bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 250; - } - else - { - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); - hQMetaData->metadata_max_bits = MAX16B; /* no limit */ - } + if ( sba_total_brate <= IVAS_13k2 ) + { + hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 70; + } + else if ( sba_total_brate <= IVAS_16k4 ) + { + hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 80; + } + else if ( sba_total_brate <= IVAS_24k4 ) + { + hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 103; + } + else if ( sba_total_brate <= IVAS_32k ) + { + hQMetaData->bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 214; + } + else if ( sba_total_brate <= IVAS_48k ) + { + hQMetaData->bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 240; + } + else if ( sba_total_brate <= IVAS_64k ) + { + hQMetaData->bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_80k ) + { + hQMetaData->bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_96k ) + { + hQMetaData->bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_128k ) + { + hQMetaData->bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 250; + } + else + { + hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->metadata_max_bits = MAX16B; /* no limit */ + } - hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); - hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; + hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); + hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; #endif return error; diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index ec19099524..d9010b5c69 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -99,10 +99,10 @@ static int16_t ivas_get_num_bands( *---------------------------------------------------------------------*/ ivas_error ivas_fb_set_cfg( - IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ - const int16_t ivas_format, /* i : IVAS format */ + IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ + const int16_t ivas_format, /* i : IVAS format */ #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ + const SBA_MODE sba_mode, /* i : SBA mode */ #endif const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index d047c58eda..f25356eaca 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1744,10 +1744,10 @@ void ivas_dirac_dec_read_BS( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ int16_t *nb_bits, /* o : number of bits read */ #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ + const SBA_MODE sba_mode, /* i : SBA mode */ #endif - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; @@ -1811,7 +1811,7 @@ void ivas_dirac_dec_read_BS( #ifndef SBA_MODE_CLEAN_UP *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); #else - *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT); + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); #endif for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { @@ -1947,12 +1947,12 @@ void ivas_qmetadata_to_dirac( MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ + const SBA_MODE sba_mode, /* i : SBA mode */ #else - const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ #endif - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t block, band; @@ -2965,7 +2965,7 @@ void ivas_dirac_dec_render_sf( #ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) #else - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) #endif { for ( ch = 0; ch < nchan_transport; ch++ ) @@ -2999,7 +2999,7 @@ void ivas_dirac_dec_render_sf( #ifdef SBA_MODE_CLEAN_UP if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) #else - if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) #endif { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; @@ -3513,7 +3513,7 @@ void ivas_dirac_dec_render_sf( #ifdef SBA_MODE_CLEAN_UP else if ( st_ivas->ivas_format == SBA_FORMAT ) #else - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) #endif { for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ ) diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 951feaf8c7..9ae1e8a281 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -1202,10 +1202,10 @@ int16_t ivas_qmetadata_dec_sid_decode( int16_t *index, /* i/o: bitstream position */ const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ - const int16_t ivas_format /* i : IVAS format */ + const int16_t ivas_format /* i : IVAS format */ #ifndef SBA_MODE_CLEAN_UP , - const SBA_MODE sba_mode /* i : SBA mode */ + const SBA_MODE sba_mode /* i : SBA mode */ #endif ) { diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index a5aa73e004..03569eed8a 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -255,7 +255,7 @@ int16_t ivas_sba_remapTCs( nchan_remapped = st_ivas->nchan_transport; #ifdef SBA_MODE_CLEAN_UP - if ( nchan_remapped == 3 ) + if ( nchan_remapped == 3 ) #else if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && nchan_remapped >= 3 ) || ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && nchan_remapped == 3 ) ) diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index ac52b56e1e..f405f50c04 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -154,7 +154,7 @@ ivas_error ivas_sce_dec( ( st_ivas->sba_mode != SBA_MODE_SPAR ) ) #else if ( ( st_ivas->hQMetaData != NULL ) && - ( st_ivas->ivas_format != SBA_FORMAT) ) + ( st_ivas->ivas_format != SBA_FORMAT ) ) #endif { if ( st_ivas->mc_mode == MC_MODE_MCMASA && ivas_total_brate >= MCMASA_SEPARATE_BRATE ) diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 9d070a549d..774b995e9a 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -700,7 +700,7 @@ void computeReferencePower_enc( const SBA_MODE sba_mode /* i : SBA mode */ #else const IVAS_FORMAT ivas_format, /* i : ivas_format */ - int16_t ref_power_w /* i : use 0 if hodirac is enabled */ + int16_t ref_power_w /* i : use 0 if hodirac is enabled */ #endif , const int16_t nchan_ana /* i : number of analysis channels */ diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index b5090a2732..5d53a12c17 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -223,7 +223,7 @@ ivas_error ivas_enc( #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) #else - if ( st_ivas->hQMetaData != NULL && ivas_format != SBA_FORMAT) + if ( st_ivas->hQMetaData != NULL && ivas_format != SBA_FORMAT ) #endif { #ifndef SBA_MODE_CLEAN_UP diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index ee7dd02d42..0c158afbb7 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -988,7 +988,7 @@ void ivas_mcmasa_param_est_enc( 0, num_freq_bands, #ifndef SBA_MODE_CLEAN_UP - SBA_MODE_NONE, + SBA_MODE_NONE, #else MC_FORMAT, 0, diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index eee20e403e..185d9b483e 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -61,11 +61,11 @@ static void set_mct_enc_params( MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ + const SBA_MODE sba_mode, /* i : SBA mode */ #else - const IVAS_FORMAT ivas_format, /* i : IVAS_FORMAT */ + const IVAS_FORMAT ivas_format, /* i : IVAS_FORMAT */ #endif - const uint16_t b_nchan_change /* i : flag indicating different channel count */ + const uint16_t b_nchan_change /* i : flag indicating different channel count */ ) { int16_t n; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 0f3d67a476..53cc475927 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -1007,7 +1007,7 @@ void ivas_qmetadata_enc_sid_encode( const int16_t ivas_format /* i : IVAS format */ #ifndef SBA_MODE_CLEAN_UP , - const SBA_MODE sba_mode /* i : SBA mode */ + const SBA_MODE sba_mode /* i : SBA mode */ #endif ) { @@ -1079,7 +1079,7 @@ void ivas_qmetadata_enc_sid_encode( assert( q_metadata->no_directions == 1 && "Qmetadata SID: only one direction supported!" ); #ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) -#else +#else if ( ivas_format == SBA_FORMAT ) #endif { @@ -1264,15 +1264,15 @@ void ivas_qmetadata_enc_sid_encode( *------------------------------------------------------------------------*/ void reset_metadata_spatial( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - const int32_t element_brate, /* i : element bitrate */ - int32_t *total_brate, /* o : total bitrate */ - const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata /* i : number of meatdata bits */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + const int32_t element_brate, /* i : element bitrate */ + int32_t *total_brate, /* o : total bitrate */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t nb_bits_metadata /* i : number of meatdata bits */ #ifndef SBA_MODE_CLEAN_UP , - const SBA_MODE sba_mode /* i : SBA mode */ + const SBA_MODE sba_mode /* i : SBA mode */ #endif ) { diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 854888d7b1..0d21477259 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -670,7 +670,7 @@ static ivas_error ivas_spar_enc_process( #ifndef SBA_MODE_CLEAN_UP if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hEncoderConfig->spar_reconfig_flag ) ) #else - if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hSpar->spar_reconfig_flag) ) + if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hSpar->spar_reconfig_flag ) ) #endif { if ( ( error = ivas_spar_md_enc_init( hSpar->hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK ) -- GitLab From dc1ecdb5fd5d0ec9e0267c63e366ddd232e1fd13 Mon Sep 17 00:00:00 2001 From: "@ragot" Date: Fri, 26 May 2023 12:14:33 +0200 Subject: [PATCH 067/381] initial support of -binaural command line option --- apps/encoder.c | 32 ++++++++++++++++++++++++++++++++ lib_com/options.h | 1 + lib_enc/ivas_stat_enc.h | 3 +++ lib_enc/lib_enc.c | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index df7c0915d4..332d7f8c27 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -98,6 +98,9 @@ typedef struct char *outputBitstreamFilename; int32_t inputFs; IVAS_ENC_INPUT_FORMAT inputFormat; +#ifdef BINAURAL_AUDIO_CMDLINE + bool is_binaural; +#endif EncInputFormatConfig inputFormatConfig; bool max_bwidth_user; IVAS_ENC_BANDWIDTH maxBandwidth; @@ -362,17 +365,29 @@ int main( switch ( arg.inputFormat ) { case IVAS_ENC_INPUT_MONO: +#ifdef BINAURAL_AUDIO_CMDLINE + if ( ( error = IVAS_ENC_ConfigureForMono( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, caConfig, arg.inputFormatConfig.stereoToMonoDownmix, arg.is_binaural ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_ENC_ConfigureForMono( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, caConfig, arg.inputFormatConfig.stereoToMonoDownmix ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nIVAS_ENC_ConfigureForMono failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); goto cleanup; } break; case IVAS_ENC_INPUT_STEREO: +#ifdef BINAURAL_AUDIO_CMDLINE +#ifdef DEBUGGING + if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural, arg.inputFormatConfig.stereoMode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural ) ) != IVAS_ERR_OK ) +#endif +#else #ifdef DEBUGGING if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.stereoMode ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig ) ) != IVAS_ERR_OK ) +#endif #endif { fprintf( stderr, "\nIVAS_ENC_ConfigureForStereo failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); @@ -865,6 +880,9 @@ static void initArgStruct( EncArguments *arg ) arg->outputBitstreamFilename = NULL; arg->inputFs = 0; arg->inputFormat = IVAS_ENC_INPUT_MONO; +#ifdef BINAURAL_AUDIO_CMDLINE + arg->is_binaural = false; +#endif arg->inputFormatConfig.stereoToMonoDownmix = false; arg->max_bwidth_user = false; arg->maxBandwidth = IVAS_ENC_BANDWIDTH_UNDEFINED; @@ -1207,6 +1225,16 @@ static bool parseCmdlIVAS_enc( * IVAS Formats *-----------------------------------------------------------------*/ +#ifdef BINAURAL_AUDIO_CMDLINE + else if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 ) + { + i++; + if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 ) + { + arg->is_binaural = true; + } + } +#endif else if ( strcmp( argv_to_upper, "-STEREO" ) == 0 ) { i++; @@ -1487,6 +1515,7 @@ static bool parseCmdlIVAS_enc( { arg->inputFormat = IVAS_ENC_INPUT_MONO; arg->inputFormatConfig.stereoToMonoDownmix = true; + i++; } else if ( strcmp( argv_to_upper, "-BYPASS" ) == 0 ) // VE: should be renamed to "-pca" @@ -1674,6 +1703,9 @@ static void usage_enc( void ) fprintf( stdout, "Options:\n" ); fprintf( stdout, "--------\n" ); fprintf( stdout, "EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc\n" ); +#ifdef BINAURAL_AUDIO_CMDLINE + fprintf( stdout, "-binaural : Optional indication that input is binaural audio (to be used with -stereo or -stereo_dmx_evs)\n" ); +#endif fprintf( stdout, "-stereo : Stereo format \n" ); fprintf( stdout, "-ism (+)Ch Files : ISM format \n" ); fprintf( stdout, " where Ch specifies the number of ISMs (1-4)\n" ); diff --git a/lib_com/options.h b/lib_com/options.h index 72332841b3..afaf5e1cd3 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -218,6 +218,7 @@ #define FIX_481_UNUSED_VARIABLES /* Nokia: Fix issue #481: Unused debug variables */ +#define BINAURAL_AUDIO_CMDLINE /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 806899c343..71e4c85c27 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1048,6 +1048,9 @@ typedef struct encoder_config_structure int16_t nchan_inp; /* number of input audio channels */ int16_t max_bwidth; /* maximum encoded bandwidth */ IVAS_FORMAT ivas_format; /* IVAS format */ +#ifdef BINAURAL_AUDIO_CMDLINE + bool is_binaural; /* flag indicating if input is binaural audio */ +#endif int16_t element_mode_init; /* element mode used at initialization */ int16_t stereo_dmx_evs; /* flag to indicate that stereo downmix for EVS encoder */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 2e56f384ec..fa801f67ad 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -267,7 +267,12 @@ ivas_error IVAS_ENC_ConfigureForMono( const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */ - const bool downmixFromStereo /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ +#ifdef BINAURAL_AUDIO_CMDLINE + const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ + const bool is_binaural /* i : if true, the input is binaural audio */ +#else + const bool downmixFromStereo /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ +#endif ) { ivas_error error; @@ -280,6 +285,9 @@ ivas_error IVAS_ENC_ConfigureForMono( } hIvasEnc->st_ivas->hEncoderConfig->ivas_format = MONO_FORMAT; +#ifdef BINAURAL_AUDIO_CMDLINE + hIvasEnc->st_ivas->hEncoderConfig->is_binaural = is_binaural; +#endif if ( downmixFromStereo ) { @@ -305,7 +313,12 @@ ivas_error IVAS_ENC_ConfigureForStereo( const int32_t bitrate, /* i : requested bitrate of the output bitstream */ const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ - const IVAS_ENC_DTX_CONFIG dtxConfig /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ +#ifdef BINAURAL_AUDIO_CMDLINE + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const bool is_binaural /* i : flag indicating if input is binaural audio */ +#else + const IVAS_ENC_DTX_CONFIG dtxConfig /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ +#endif #ifdef DEBUGGING , const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */ @@ -326,6 +339,9 @@ ivas_error IVAS_ENC_ConfigureForStereo( hEncoderConfig = st_ivas->hEncoderConfig; hEncoderConfig->nchan_inp = 2; hEncoderConfig->ivas_format = STEREO_FORMAT; +#ifdef BINAURAL_AUDIO_CMDLINE + hEncoderConfig->is_binaural = is_binaural; +#endif #ifdef DEBUGGING switch ( stereoMode ) @@ -1528,6 +1544,12 @@ static ivas_error printConfigInfo_enc( if ( hEncoderConfig->stereo_dmx_evs ) { fprintf( stdout, "IVAS format: stereo downmix to bit-exact EVS mono\n" ); +#ifdef BINAURAL_AUDIO_CMDLINE + if ( hEncoderConfig->is_binaural ) + { + fprintf( stdout, "Optional indication: binaural audio\n" ); + } +#endif } else { @@ -1562,6 +1584,12 @@ static ivas_error printConfigInfo_enc( { fprintf( stdout, "IVAS format: stereo - MDCT stereo\n" ); } +#endif +#ifdef BINAURAL_AUDIO_CMDLINE + if ( hEncoderConfig->is_binaural ) + { + fprintf( stdout, "Optional indication: binaural audio\n" ); + } #endif } else if ( hEncoderConfig->ivas_format == ISM_FORMAT ) -- GitLab From 688c8e1ea1bdd0da87a46c28ec2710f88f0682ef Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Fri, 26 May 2023 15:57:26 +0530 Subject: [PATCH 068/381] Review comment changes --- lib_com/ivas_prot.h | 10 ++--- lib_com/ivas_td_decorr.c | 27 ++++------- lib_com/options.h | 2 +- lib_dec/ivas_init_dec.c | 14 +++--- lib_dec/ivas_masa_dec.c | 8 +--- lib_dec/ivas_mcmasa_dec.c | 7 +-- lib_dec/ivas_mct_dec.c | 7 +-- lib_dec/ivas_sba_dec.c | 17 +++---- lib_dec/ivas_spar_decoder.c | 47 +++++++------------- lib_dec/ivas_stat_dec.h | 7 ++- lib_rend/ivas_dirac_dec_binaural_functions.c | 13 ++---- 11 files changed, 53 insertions(+), 106 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 51fbcd7fa6..cb39e2ffdd 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3715,10 +3715,6 @@ ivas_error ivas_td_decorr_reconfig_dec( const int32_t output_Fs, /* i : output sampling rate */ ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ -#ifdef TD_DECORR_DIS - , - int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ -#endif ); /*! r: Configured reqularization factor value */ @@ -4317,7 +4313,7 @@ void ivas_spar_dec_close( SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT , const int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ #endif @@ -5747,8 +5743,8 @@ int16_t ivas_get_num_bands_from_bw_idx( const int16_t bwidth /* i : audio bandwidth */ ); -#ifdef TD_DECORR_DIS -void ivas_td_decorr_bitrate_check( +#ifdef FIX_163_SBA_TD_DECORR_OPT +void ivas_get_td_decorr_flag( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ AUDIO_CONFIG output_config, /* i : output config. */ Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index d0d15086e4..dbe4422103 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -112,10 +112,6 @@ ivas_error ivas_td_decorr_reconfig_dec( const int32_t output_Fs, /* i : output sampling rate */ ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ -#ifdef TD_DECORR_DIS - , - int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ -#endif ) { uint16_t useTdDecorr_new; @@ -152,20 +148,13 @@ ivas_error ivas_td_decorr_reconfig_dec( { if ( ivas_total_brate >= IVAS_13k2 && ivas_format == SBA_FORMAT ) { -#ifdef TD_DECORR_DIS - if ( !td_decorr_flag ) + if ( *hTdDecorr == NULL ) { -#endif - if ( *hTdDecorr == NULL ) + if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) { - if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) - { - return error; - } + return error; } -#ifdef TD_DECORR_DIS } -#endif if ( ivas_total_brate < IVAS_24k4 ) { @@ -544,13 +533,13 @@ void ivas_td_decorr_process( } /*-----------------------------------------------------------------------------------------* - * Function ivas_td_decorr_bitrate_check() + * Function ivas_get_td_decorr_flag() * * TD decorr bitrate and outfit_config check call *-----------------------------------------------------------------------------------------*/ -#ifdef TD_DECORR_DIS -void ivas_td_decorr_bitrate_check( +#ifdef FIX_163_SBA_TD_DECORR_OPT +void ivas_get_td_decorr_flag( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ AUDIO_CONFIG output_config, /* i : output config. */ Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ @@ -558,11 +547,11 @@ void ivas_td_decorr_bitrate_check( { if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) || ( ivas_total_brate >= IVAS_256k && output_config == AUDIO_CONFIG_FOA ) ) ) { - st_ivas->td_decorr_flag = 1; + st_ivas->hSpar->td_decorr_flag = 0; } else { - st_ivas->td_decorr_flag = 0; + st_ivas->hSpar->td_decorr_flag = 1; } } #endif diff --git a/lib_com/options.h b/lib_com/options.h index 10374b0ab7..4a5e3a112e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -164,7 +164,7 @@ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ #define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ -#define TD_DECORR_DIS /* Dlb : Issue 163 : Malloc of td_deccor structure at 512 kbps and output configuration FOA*/ +#define FIX_163_SBA_TD_DECORR_OPT /* Dlb : Issue 163 : Malloc of td_deccor structure at 512 kbps and output configuration FOA*/ #define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ #define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 20e5ab0777..13662e542e 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -691,8 +691,8 @@ ivas_error ivas_init_decoder( hDecoderConfig->last_ivas_total_brate = ivas_total_brate; st_ivas->last_active_ivas_total_brate = ivas_total_brate; -#ifdef TD_DECORR_DIS - ivas_td_decorr_bitrate_check( ivas_total_brate, output_config, st_ivas ); +#ifdef FIX_163_SBA_TD_DECORR_OPT + ivas_get_td_decorr_flag( ivas_total_brate, output_config, st_ivas ); #endif if ( output_config == AUDIO_CONFIG_EXTERNAL ) @@ -1821,9 +1821,9 @@ void ivas_destroy_dec( /* SPAR handle */ ivas_spar_dec_close( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT , - st_ivas->td_decorr_flag + st_ivas->hSpar->td_decorr_flag #endif ); @@ -1847,12 +1847,12 @@ void ivas_destroy_dec( ivas_lfe_dec_close( &( st_ivas->hLFE ) ); /* Param-Upmix MC handle */ -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( st_ivas->hSpar->td_decorr_flag ) { #endif ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT } #endif diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 8f332e5b4f..7445bfb489 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -1266,14 +1266,10 @@ ivas_error ivas_masa_dec_reconfigure( /*-----------------------------------------------------------------* * TD Decorrelator *-----------------------------------------------------------------*/ + if ( st_ivas->hDiracDecBin != NULL ) { - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) -#ifdef TD_DECORR_DIS - , - 0 -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index a70f98506d..99b3ff6874 100755 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -132,12 +132,7 @@ ivas_error ivas_mcmasa_dec_reconfig( else { /* if necessary, close/open td-decorrs */ - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) -#ifdef TD_DECORR_DIS - , - 0 -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 9f3e809a59..6eada0e18b 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1276,12 +1276,7 @@ static ivas_error ivas_mc_dec_reconfig( if ( st_ivas->hDiracDecBin != NULL ) { - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) -#ifdef TD_DECORR_DIS - , - 0 -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 70508a34fb..f9e035028c 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -174,9 +174,9 @@ ivas_error ivas_sba_dec_reconfigure( { ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT , - st_ivas->td_decorr_flag + st_ivas->hSpar->td_decorr_flag #endif ); if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) @@ -346,12 +346,7 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hDiracDecBin != NULL ) { - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) -#ifdef TD_DECORR_DIS - , - st_ivas->td_decorr_flag -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) { return error; } @@ -451,12 +446,12 @@ ivas_error ivas_sba_dec_digest_tc( while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( st_ivas->hSpar->td_decorr_flag ) { #endif ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT } #endif for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index b5462fb692..0b0bd73d20 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -101,15 +101,16 @@ ivas_error ivas_spar_dec_open( } /* TD decorr. */ -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( st_ivas->hSpar->td_decorr_flag ) { #endif if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) { + hSpar->hTdDecorr = NULL; return error; } -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT } #endif @@ -252,7 +253,7 @@ void ivas_spar_dec_close( SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT , const int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ #endif @@ -267,12 +268,12 @@ void ivas_spar_dec_close( ivas_spar_md_dec_close( &( *hSpar )->hMdDec ); /* TD decorrelator handle */ -#ifdef TD_DECORR_DIS - if ( !td_decorr_flag ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( td_decorr_flag && &( *hSpar )->hTdDecorr != NULL ) { #endif ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT } #endif /* FB mixer handle */ @@ -746,12 +747,12 @@ static void ivas_spar_dec_MD( if ( hSpar->hMdDec->table_idx != table_idx ) { hSpar->hMdDec->table_idx = table_idx; -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( st_ivas->hSpar->td_decorr_flag ) { #endif hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT } #endif ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); @@ -1222,18 +1223,11 @@ void ivas_spar_dec_digest_tc( while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( st_ivas->hSpar->td_decorr_flag ) { #endif ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); -#ifdef TD_DECORR_DIS - } -#endif -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) - { -#endif if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) @@ -1252,7 +1246,7 @@ void ivas_spar_dec_digest_tc( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); } } -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT } #endif for ( ch = 0; ch < nchan_internal; ch++ ) @@ -1306,18 +1300,11 @@ void ivas_spar_dec_upmixer( } if ( hSpar->hMdDec->td_decorr_flag ) { -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( st_ivas->hSpar->td_decorr_flag ) { #endif ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); -#ifdef TD_DECORR_DIS - } -#endif -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) - { -#endif if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { for ( i = 0; i < nchan_internal - nchan_transport; i++ ) @@ -1336,7 +1323,7 @@ void ivas_spar_dec_upmixer( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); } } -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT } #endif } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 29e5665329..cdbab23260 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -921,6 +921,9 @@ typedef struct ivas_spar_dec_lib_t int16_t slots_rendered; int16_t num_slots; #endif +#ifdef FIX_163_SBA_TD_DECORR_OPT + int16_t td_decorr_flag; /* Disable malloc for td_decorr structure flag */ +#endif } SPAR_DEC_DATA, *SPAR_DEC_HANDLE; @@ -1348,10 +1351,6 @@ typedef struct Decoder_Struct #ifdef JBM_TSM_ON_TCS DECODER_TC_BUFFER_HANDLE hTcBuffer; #endif - -#ifdef TD_DECORR_DIS - int16_t td_decorr_flag; /* Disable malloc for td_decorr structure flag */ -#endif } Decoder_Struct; /* clang-format on */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 8668efcc08..c2370bfff3 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -228,12 +228,7 @@ ivas_error ivas_dirac_dec_init_binaural_data( hBinaural->useTdDecorr = 0; } - if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hBinaural->hTdDecorr ), &( hBinaural->useTdDecorr ) -#ifdef TD_DECORR_DIS - , - st_ivas->td_decorr_flag -#endif - ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hBinaural->hTdDecorr ), &( hBinaural->useTdDecorr ) ) ) != IVAS_ERR_OK ) { return error; } @@ -454,12 +449,12 @@ void ivas_dirac_dec_binaural( output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); #ifdef JBM_TSM_ON_TCS { -#ifdef TD_DECORR_DIS - if ( !st_ivas->td_decorr_flag ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( st_ivas->hSpar->td_decorr_flag ) { #endif ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); -#ifdef TD_DECORR_DIS +#ifdef FIX_163_SBA_TD_DECORR_OPT } #endif } -- GitLab From 28d098455a2456bd847111cc512b1a7bf05f9196 Mon Sep 17 00:00:00 2001 From: "@ragot" Date: Fri, 26 May 2023 12:49:32 +0200 Subject: [PATCH 069/381] propagating is_binaural as extra information for stereo dmx; for stereo is_binaural is available in st_ivas->hEncoderConfig so no extra change required --- lib_com/ivas_prot.h | 5 +++++ lib_enc/ivas_stereo_dmx_evs.c | 7 ++++++- lib_enc/lib_enc.c | 4 ++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 556daf327b..c5c5138a83 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -61,7 +61,12 @@ void stereo_dmx_evs_enc( STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ const int32_t input_Fs, /* i : input sampling rate */ int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */ +#ifdef BINAURAL_AUDIO_CMDLINE + const int16_t n_samples, /* i : number of input samples */ + const bool is_binaural /* i : indication that input is binaural audio */ +#else const int16_t n_samples /* i : number of input samples */ +#endif ); /*! r: number of channels to be analysed */ diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index a5c0fe147f..e772365a8c 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -788,7 +788,12 @@ void stereo_dmx_evs_enc( STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ const int32_t input_Fs, /* i : input sampling rate */ int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */ - const int16_t n_samples /* i : number of input samples */ +#ifdef BINAURAL_AUDIO_CMDLINE + const int16_t n_samples, /* i : number of input samples */ + const bool is_binaural /* i : indication that input is binaural audio */ +#else + const int16_t n_samples /* i : number of input samples */ +#endif ) { int16_t n; diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index fa801f67ad..9d381913ad 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1261,7 +1261,11 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( if ( hEncoderConfig->stereo_dmx_evs == 1 ) { inputBufferSize /= 2; +#ifdef BINAURAL_AUDIO_CMDLINE + stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize, hEncoderConfig->is_binaural); +#else stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize ); +#endif } if ( hEncoderConfig->Opt_AMR_WB ) -- GitLab From 892759fb1607d50b686423d14a9bcac88f2f2a1f Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Fri, 26 May 2023 15:15:07 +0530 Subject: [PATCH 070/381] Addressing review comments: set 1 --- lib_com/ivas_cnst.h | 1 + lib_com/ivas_dirac_com.c | 4 ++++ lib_com/ivas_fb_mixer.c | 1 + lib_com/ivas_prot.h | 3 +++ lib_com/ivas_sba_config.c | 1 + lib_dec/ivas_corecoder_dec_reconfig.c | 1 + lib_dec/ivas_dec.c | 6 +++++- lib_dec/ivas_dirac_dec.c | 5 +++++ lib_dec/ivas_init_dec.c | 3 +++ lib_dec/ivas_sba_dec.c | 1 + lib_dec/ivas_sba_dirac_stereo_dec.c | 1 + lib_dec/ivas_sba_rendering_internal.c | 2 ++ lib_enc/ivas_dirac_enc.c | 8 ++++---- lib_enc/ivas_enc.c | 1 + lib_enc/ivas_init_enc.c | 3 +++ lib_enc/ivas_masa_enc.c | 2 ++ lib_enc/ivas_mct_enc.c | 2 ++ lib_enc/ivas_qmetadata_enc.c | 2 ++ lib_enc/ivas_sba_enc.c | 3 ++- lib_enc/ivas_sce_enc.c | 1 + lib_enc/ivas_spar_encoder.c | 2 ++ lib_enc/ivas_stat_enc.h | 3 +++ lib_rend/ivas_dirac_dec_binaural_functions.c | 1 + 23 files changed, 51 insertions(+), 6 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 256e7b7d8f..1e7ca7ae8e 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -928,6 +928,7 @@ typedef enum } SBA_MODE; #endif + /*----------------------------------------------------------------------------------* * DirAC Constants *----------------------------------------------------------------------------------*/ diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index ac7ccc3182..e4bbe4e1c7 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -101,6 +101,7 @@ ivas_error ivas_dirac_config( #ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode; #endif + int16_t *dirac_to_spar_md_bands; @@ -167,6 +168,7 @@ ivas_error ivas_dirac_config( ( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft; dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands; } + #ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) #else @@ -214,6 +216,7 @@ ivas_error ivas_dirac_config( hConfig->enc_param_start_band = hQMetaData->q_direction[0].cfg.start_band + spar_dirac_split_band; } + #ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { @@ -243,6 +246,7 @@ ivas_error ivas_dirac_config( } #endif } + #ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) #else diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index d9010b5c69..dbbce9afe4 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -136,6 +136,7 @@ ivas_error ivas_fb_set_cfg( else if ( ivas_format == SBA_FORMAT ) { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); + #ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2c06fb6870..669aff0912 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3413,6 +3413,7 @@ void ivas_dirac_param_est_enc( const int16_t nchan_fb_in ); + #ifndef SBA_MODE_CLEAN_UP /*----------------------------------------------------------------------------------* * SBA format prototypes @@ -3584,6 +3585,7 @@ void ivas_dirac_enc_close( DIRAC_ENC_HANDLE *hDirAC, /* i/o: encoder DirAC handle */ const int32_t input_Fs /* i : input sampling_rate */ ); + #ifndef SBA_MODE_CLEAN_UP void ivas_dirac_enc( DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ @@ -5730,6 +5732,7 @@ void ivas_fb_mixer_pcm_ingest( , const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); + #ifndef SBA_MODE_CLEAN_UP void ivas_dirac_enc_spar_delay_synchro( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 9668331dce..450ebef791 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -46,6 +46,7 @@ #endif #include "wmc_auto.h" + #ifndef SBA_MODE_CLEAN_UP /*-------------------------------------------------------------------* * ivas_sba_mode_select() diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index 86aee2d164..e112a8ec04 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -510,6 +510,7 @@ ivas_error ivas_cldfb_dec_reconfig( } } } + #ifndef SBA_MODE_CLEAN_UP /* CLDFB Interpolation weights */ if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 070f8f1d09..3826d7d0bb 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -316,10 +316,11 @@ ivas_error ivas_dec( #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) #else - if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT ) + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL ) #endif { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) { @@ -347,6 +348,7 @@ ivas_error ivas_dec( if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + #ifndef SBA_MODE_CLEAN_UP ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), @@ -412,6 +414,7 @@ ivas_error ivas_dec( if ( st_ivas->sba_dirac_stereo_flag ) { nchan_remapped = nchan_out; + #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) #else @@ -446,6 +449,7 @@ ivas_error ivas_dec( if ( st_ivas->ivas_format == SBA_FORMAT ) { nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame ); + #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) #else diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index f25356eaca..01ed888fb4 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1761,6 +1761,7 @@ void ivas_dirac_dec_read_BS( /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; + #ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) { @@ -1808,6 +1809,7 @@ void ivas_dirac_dec_read_BS( set_zero( hQMetaData->q_direction[0].band_data[b].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); } } + #ifndef SBA_MODE_CLEAN_UP *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); #else @@ -1881,6 +1883,7 @@ void ivas_dirac_dec_read_BS( } } } + #ifndef SBA_MODE_CLEAN_UP *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); #else @@ -1915,6 +1918,7 @@ void ivas_dirac_dec_read_BS( } #endif + st->next_bit_pos = next_bit_pos_orig; } @@ -2068,6 +2072,7 @@ void ivas_qmetadata_to_dirac( nblocks = q_direction->cfg.nblocks; nbands = hDirAC->band_grouping[hDirAC->hConfig->nbands]; band_grouping = hDirAC->band_grouping; + #ifndef SBA_MODE_CLEAN_UP if ( ivas_total_brate <= IVAS_SID_5k2 && sba_mode != SBA_MODE_SPAR ) #else diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 22b5cc3e3f..63ee9368d3 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -279,6 +279,7 @@ ivas_error ivas_dec_setup( #endif nchan_transport_old = st_ivas->nchan_transport; nchan_transport = ( st_ivas->sid_format == SID_SBA_2TC ) ? 2 : 1; + #ifdef SBA_MODE_CLEAN_UP if ( ( nchan_transport_old != nchan_transport ) ) #else @@ -596,6 +597,7 @@ ivas_error ivas_init_decoder_front( #ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; #endif + st_ivas->sba_dirac_stereo_flag = 0; /* HRTF binauralization latency in ns */ @@ -1016,6 +1018,7 @@ ivas_error ivas_init_decoder( } #endif } + #ifdef SBA_MODE_CLEAN_UP if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->ivas_format != SBA_FORMAT ) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index c978db9b61..a742a8f5a3 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -58,6 +58,7 @@ void ivas_sba_set_cna_cng_flag( ) { int16_t n, cpe_id; + #ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 1 ) #else diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 430e9de655..13f1401f8e 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -951,6 +951,7 @@ void ivas_sba_dirac_stereo_dec( { /* upmix ACELP BWE */ ivas_sba_dirac_stereo_compute_hb_gain( hStereoDft, hb_gain ); + #ifdef SBA_MODE_CLEAN_UP ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 03569eed8a..dd4af01ccf 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -269,6 +269,7 @@ int16_t ivas_sba_remapTCs( assert( ( ( st_ivas->nchan_transport == 3 ) || ( st_ivas->nchan_transport == 5 ) || ( st_ivas->nchan_transport == 7 ) ) && "Number of channels must be odd for SBA planar!" ); } #endif + if ( nchan_remapped == 4 ) { /*For planar A-format channel 2 and 3 are identical -> Z=0*/ @@ -293,6 +294,7 @@ int16_t ivas_sba_remapTCs( } } } + #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode != SBA_MODE_SPAR ) { diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 774b995e9a..d0df7a0084 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -100,6 +100,7 @@ ivas_error ivas_dirac_enc_open( #ifndef SBA_MODE_CLEAN_UP input_Fs = st_ivas->hEncoderConfig->input_Fs; #endif + if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) { return error; @@ -154,16 +155,15 @@ ivas_error ivas_dirac_enc_open( } else { -#endif hDirAC->num_samples_synchro_delay = 0; for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) { hDirAC->sba_synchro_buffer[i] = NULL; } -#ifndef SBA_MODE_CLEAN_UP } #endif + /* intensity 3-dim */ for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { @@ -299,7 +299,7 @@ void ivas_dirac_enc_close( { ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); } - +#ifndef SBA_MODE_CLEAN_UP for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) { if ( hDirAC->sba_synchro_buffer[i] != NULL ) @@ -308,7 +308,7 @@ void ivas_dirac_enc_close( hDirAC->sba_synchro_buffer[i] = NULL; } } - +#endif /* intensity 3-dim */ for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 5d53a12c17..64ed5c9c02 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -220,6 +220,7 @@ ivas_error ivas_enc( /* SBA/MASA metadata encoding and SBA/MASA metadata bitstream writing */ hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; + #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) #else diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index e2cbc9ff7f..006fb176fb 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -365,6 +365,7 @@ ivas_error ivas_init_encoder( #ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; #endif + st_ivas->nchan_transport = -1; #ifdef IND_LIST_DYN @@ -521,6 +522,7 @@ ivas_error ivas_init_encoder( #ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = ivas_sba_mode_select(); #endif + st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) @@ -530,6 +532,7 @@ ivas_error ivas_init_encoder( { return error; } + #ifndef SBA_MODE_CLEAN_UP } #endif diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index ab5e0f4708..492b0dbe14 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -401,11 +401,13 @@ ivas_error ivas_masa_encode( } free( h_orig_metadata ); + #ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format, SBA_MODE_NONE ); #else ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format ); #endif + /* restore old values */ hMasa->config.numCodingBands = numCodingBands; hMasa->config.numTwoDirBands = numTwoDirBands; diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index 185d9b483e..55da6495f8 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -394,6 +394,7 @@ ivas_error create_mct_enc( /*-----------------------------------------------------------------* * Initializations *-----------------------------------------------------------------*/ + #ifndef SBA_MODE_CLEAN_UP set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, 1 ); #else @@ -559,6 +560,7 @@ ivas_error mct_enc_reconfigure( /*-----------------------------------------------------------------* * Initializations *-----------------------------------------------------------------*/ + #ifndef SBA_MODE_CLEAN_UP set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, b_nchan_change ); #else diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 9067fd5a49..a9cb5c7631 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -1114,6 +1114,7 @@ void ivas_qmetadata_enc_sid_encode( { assert( ( q_direction->cfg.nbands == 5 ) && "Qmetadata SID: only 5 bands supported!" ); } + #ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) #else @@ -1425,6 +1426,7 @@ void reset_metadata_spatial( hMetaData->last_ind = hMetaData->next_ind; #endif } + return; } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index 632fd041de..c6ff188c23 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -204,7 +204,7 @@ ivas_error ivas_sba_enc_reconfigure( } ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); - +#ifndef SBA_MODE_CLEAN_UP for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) { if ( hDirAC->sba_synchro_buffer[n] != NULL ) @@ -214,6 +214,7 @@ ivas_error ivas_sba_enc_reconfigure( } } hDirAC->num_samples_synchro_delay = 0; +#endif hSpar = st_ivas->hSpar; if ( st_ivas->nchan_transport == 1 ) diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index be46ae8b62..87c0e8e9d3 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -204,6 +204,7 @@ ivas_error ivas_sce_enc( /*----------------------------------------------------------------* * Reset metadata *----------------------------------------------------------------*/ + #ifndef SBA_MODE_CLEAN_UP reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata, st_ivas->sba_mode ); #else diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 0d21477259..57e6ce003e 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -83,6 +83,7 @@ ivas_error ivas_spar_enc_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR encoder" ); } } + #ifdef SBA_MODE_CLEAN_UP hSpar->spar_reconfig_flag = 0; #endif @@ -384,6 +385,7 @@ ivas_error ivas_spar_enc( } } #endif + /* front VAD */ if ( ( error = front_vad_spar( st_ivas->hSpar, data_f[0], hEncoderConfig, input_frame ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 3456df0eef..803613e7e7 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -591,8 +591,10 @@ typedef struct ivas_dirac_enc_data_structure PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM handle */ IVAS_FB_MIXER_HANDLE hFbMixer; +#ifndef SBA_MODE_CLEAN_UP float *sba_synchro_buffer[DIRAC_MAX_ANA_CHANS]; int16_t num_samples_synchro_delay; +#endif /* DirAC parameter estimation */ float **direction_vector[DIRAC_NUM_DIMS]; @@ -710,6 +712,7 @@ typedef struct ivas_spar_enc_lib_t int32_t core_nominal_brate; /* Nominal bitrate for core coding */ FRONT_VAD_ENC_HANDLE hFrontVad; /* front-VAD handle */ ENC_CORE_HANDLE hCoreCoderVAD; /* core-coder handle for front-VAD module */ + #ifdef SBA_MODE_CLEAN_UP int16_t spar_reconfig_flag; #endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 3caff4abd9..c3e76e7306 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -674,6 +674,7 @@ static void ivas_dirac_dec_binaural_internal( } } } + #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) #else -- GitLab From 6e55737eb8e75a9e0dde6fdbe74e35384a40b830 Mon Sep 17 00:00:00 2001 From: Vidhya V P <100825@ittiam.com> Date: Fri, 26 May 2023 17:24:37 +0530 Subject: [PATCH 071/381] Clang format fix --- lib_enc/ivas_masa_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 492b0dbe14..cfed98617a 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -407,7 +407,7 @@ ivas_error ivas_masa_encode( #else ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format ); #endif - + /* restore old values */ hMasa->config.numCodingBands = numCodingBands; hMasa->config.numTwoDirBands = numTwoDirBands; -- GitLab From f43119fc21858bdf90881f3bde6d12bd1ac5eeba Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Fri, 26 May 2023 18:14:52 +0530 Subject: [PATCH 072/381] Failure fixes --- lib_com/ivas_prot.h | 9 ++---- lib_com/ivas_td_decorr.c | 14 +++++---- lib_dec/ivas_init_dec.c | 19 ++----------- lib_dec/ivas_sba_dec.c | 8 ++---- lib_dec/ivas_spar_decoder.c | 30 +++++++++----------- lib_dec/ivas_stat_dec.h | 2 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 19 ++----------- 7 files changed, 32 insertions(+), 69 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 1c36956f77..4eb6a15c13 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4307,10 +4307,6 @@ void ivas_spar_dec_close( SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#ifdef FIX_163_SBA_TD_DECORR_OPT - , - const int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ -#endif ); ivas_error ivas_spar_dec( @@ -5740,9 +5736,8 @@ int16_t ivas_get_num_bands_from_bw_idx( #ifdef FIX_163_SBA_TD_DECORR_OPT void ivas_get_td_decorr_flag( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - AUDIO_CONFIG output_config, /* i : output config. */ - Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ + SPAR_DEC_HANDLE hSpar, /* i/o : IVAS SPAR handle structure */ + Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ ); #endif diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 0f2bca77eb..c5731176f4 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -532,26 +532,30 @@ void ivas_td_decorr_process( return; } +#ifdef FIX_163_SBA_TD_DECORR_OPT /*-----------------------------------------------------------------------------------------* * Function ivas_get_td_decorr_flag() * * TD decorr bitrate and outfit_config check call *-----------------------------------------------------------------------------------------*/ -#ifdef FIX_163_SBA_TD_DECORR_OPT void ivas_get_td_decorr_flag( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - AUDIO_CONFIG output_config, /* i : output config. */ + SPAR_DEC_HANDLE hSpar, /* i/o : IVAS SPAR handle structure */ Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ ) { + int32_t ivas_total_brate; + AUDIO_CONFIG output_config; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + output_config = st_ivas->hDecoderConfig->output_config; if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) || ( ivas_total_brate >= IVAS_256k && output_config == AUDIO_CONFIG_FOA ) ) ) { - st_ivas->hSpar->td_decorr_flag = 0; + hSpar->td_decorr_flag = 0; } else { - st_ivas->hSpar->td_decorr_flag = 1; + hSpar->td_decorr_flag = 1; } } #endif diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 5ecdeb81c7..ddb6496fce 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -694,9 +694,6 @@ ivas_error ivas_init_decoder( hDecoderConfig->last_ivas_total_brate = ivas_total_brate; st_ivas->last_active_ivas_total_brate = ivas_total_brate; -#ifdef FIX_163_SBA_TD_DECORR_OPT - ivas_get_td_decorr_flag( ivas_total_brate, output_config, st_ivas ); -#endif if ( output_config == AUDIO_CONFIG_EXTERNAL ) { @@ -1827,12 +1824,7 @@ void ivas_destroy_dec( } /* SPAR handle */ - ivas_spar_dec_close( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 -#ifdef FIX_163_SBA_TD_DECORR_OPT - , - st_ivas->hSpar->td_decorr_flag -#endif - ); + ivas_spar_dec_close( &( st_ivas->hSpar ), st_ivas->hDecoderConfig->output_Fs, 0 ); /* HOA decoder matrix */ if ( st_ivas->hoa_dec_mtx != NULL ) @@ -1854,14 +1846,7 @@ void ivas_destroy_dec( ivas_lfe_dec_close( &( st_ivas->hLFE ) ); /* Param-Upmix MC handle */ -#ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->hSpar->td_decorr_flag ) - { -#endif - ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); -#ifdef FIX_163_SBA_TD_DECORR_OPT - } -#endif + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); /* Parametric MC handle */ ivas_param_mc_dec_close( &st_ivas->hParamMC ); diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 5e5eaa4e22..9e5017c83d 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -175,12 +175,8 @@ ivas_error ivas_sba_dec_reconfigure( if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) ) { - ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 -#ifdef FIX_163_SBA_TD_DECORR_OPT - , - st_ivas->hSpar->td_decorr_flag -#endif - ); + ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); + if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 9906b45507..a036ad0d8e 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -88,6 +88,9 @@ ivas_error ivas_spar_dec_open( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR decoder" ); } +#ifdef FIX_163_SBA_TD_DECORR_OPT + ivas_get_td_decorr_flag( hSpar, st_ivas ); +#endif } output_Fs = st_ivas->hDecoderConfig->output_Fs; @@ -102,16 +105,19 @@ ivas_error ivas_spar_dec_open( /* TD decorr. */ #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->hSpar->td_decorr_flag ) + if ( hSpar->td_decorr_flag ) { #endif if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) { - hSpar->hTdDecorr = NULL; return error; } #ifdef FIX_163_SBA_TD_DECORR_OPT } + else + { + hSpar->hTdDecorr = NULL; + } #endif /* MD handle */ @@ -255,10 +261,6 @@ void ivas_spar_dec_close( SPAR_DEC_HANDLE *hSpar, /* i/o: SPAR decoder handle */ const int32_t output_Fs, /* i : output sampling rate */ const int16_t spar_reconfig_flag /* i : SPAR reconfiguration flag */ -#ifdef FIX_163_SBA_TD_DECORR_OPT - , - const int16_t td_decorr_flag /* i : Disable malloc for td_decorr structure flag */ -#endif ) { if ( *hSpar == NULL || hSpar == NULL ) @@ -270,14 +272,8 @@ void ivas_spar_dec_close( ivas_spar_md_dec_close( &( *hSpar )->hMdDec ); /* TD decorrelator handle */ -#ifdef FIX_163_SBA_TD_DECORR_OPT - if ( td_decorr_flag && &( *hSpar )->hTdDecorr != NULL ) - { -#endif - ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); -#ifdef FIX_163_SBA_TD_DECORR_OPT - } -#endif + ivas_td_decorr_dec_close( &( *hSpar )->hTdDecorr ); + /* FB mixer handle */ ivas_FB_mixer_close( &( *hSpar )->hFbMixer, output_Fs, spar_reconfig_flag ); @@ -750,7 +746,7 @@ static void ivas_spar_dec_MD( { hSpar->hMdDec->table_idx = table_idx; #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->hSpar->td_decorr_flag ) + if ( hSpar->td_decorr_flag ) { #endif hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; @@ -1255,7 +1251,7 @@ void ivas_spar_dec_digest_tc( { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->hSpar->td_decorr_flag ) + if ( hSpar->td_decorr_flag ) { #endif ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); @@ -1343,7 +1339,7 @@ void ivas_spar_dec_upmixer( if ( hSpar->hMdDec->td_decorr_flag ) { #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->hSpar->td_decorr_flag ) + if ( hSpar->td_decorr_flag ) { #endif ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 79dfa4727a..50a759b0b2 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -923,7 +923,7 @@ typedef struct ivas_spar_dec_lib_t int16_t num_slots; #endif #ifdef FIX_163_SBA_TD_DECORR_OPT - int16_t td_decorr_flag; /* Disable malloc for td_decorr structure flag */ + int16_t td_decorr_flag; /* Disable malloc for td_decorr structure flag */ #endif } SPAR_DEC_DATA, *SPAR_DEC_HANDLE; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 27514511b9..525935ffbf 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -457,23 +457,10 @@ void ivas_dirac_dec_binaural( output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); #ifdef JBM_TSM_ON_TCS -#ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->hSpar->td_decorr_flag ) - { -#endif - ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); -#ifdef FIX_163_SBA_TD_DECORR_OPT - } -#endif + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); + #else -#ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->hSpar->td_decorr_flag ) - { -#endif - ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame ); -#ifdef FIX_163_SBA_TD_DECORR_OPT - } -#endif + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame ); #endif } -- GitLab From 33776920370e9e60283de1fd391c77d558f44ec7 Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Fri, 26 May 2023 20:01:06 +0530 Subject: [PATCH 073/381] Moved get decorr flag outside reconfig flag condition --- lib_com/ivas_td_decorr.c | 5 +++-- lib_dec/ivas_spar_decoder.c | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index c5731176f4..4886f6bf02 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -540,8 +540,8 @@ void ivas_td_decorr_process( *-----------------------------------------------------------------------------------------*/ void ivas_get_td_decorr_flag( - SPAR_DEC_HANDLE hSpar, /* i/o : IVAS SPAR handle structure */ - Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ + SPAR_DEC_HANDLE hSpar, /* i/o : IVAS SPAR handle structure */ + Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ ) { int32_t ivas_total_brate; @@ -549,6 +549,7 @@ void ivas_get_td_decorr_flag( ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; output_config = st_ivas->hDecoderConfig->output_config; + if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) || ( ivas_total_brate >= IVAS_256k && output_config == AUDIO_CONFIG_FOA ) ) ) { hSpar->td_decorr_flag = 0; diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index a036ad0d8e..c8185c0501 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -88,9 +88,6 @@ ivas_error ivas_spar_dec_open( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR decoder" ); } -#ifdef FIX_163_SBA_TD_DECORR_OPT - ivas_get_td_decorr_flag( hSpar, st_ivas ); -#endif } output_Fs = st_ivas->hDecoderConfig->output_Fs; @@ -105,6 +102,7 @@ ivas_error ivas_spar_dec_open( /* TD decorr. */ #ifdef FIX_163_SBA_TD_DECORR_OPT + ivas_get_td_decorr_flag( hSpar, st_ivas ); if ( hSpar->td_decorr_flag ) { #endif -- GitLab From c01a90003e4d137e85de8eb49fe429926d4f3bf4 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Sat, 27 May 2023 21:54:22 +0300 Subject: [PATCH 074/381] Fix issue 170 by removing DTX limitation for MASA. --- lib_com/options.h | 1 + lib_enc/lib_enc.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index dccc11cf17..31ece548c6 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -220,6 +220,7 @@ #define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ #define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ +#define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 2e56f384ec..62610838a5 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -895,11 +895,18 @@ static ivas_error configureEncoder( return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." ); } +#ifdef FIX_170_DTX_MASA + if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && + ( ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done + hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD + ) ) +#else if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && ( ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD ) ) +#endif { return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); } -- GitLab From 37b015f56058e61bdd2554d8f82e14f054f1be0d Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Sun, 28 May 2023 18:02:10 +0530 Subject: [PATCH 075/381] Fix for smoke test failure --- lib_dec/ivas_sba_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 9e5017c83d..5dfef59118 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -461,7 +461,7 @@ ivas_error ivas_sba_dec_digest_tc( { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->hSpar->td_decorr_flag ) + if ( st_ivas->ivas_format != SBA_FORMAT || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hSpar->td_decorr_flag ) ) { #endif ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); -- GitLab From f467bbdda0a828040001528cb76753aa4eb6715e Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Mon, 29 May 2023 10:06:53 +0530 Subject: [PATCH 076/381] Review comment changes - Part 2 --- lib_com/ivas_td_decorr.c | 2 +- lib_com/options.h | 2 +- lib_rend/ivas_reverb.c | 7 ++----- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 4886f6bf02..7883c13083 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -536,7 +536,7 @@ void ivas_td_decorr_process( /*-----------------------------------------------------------------------------------------* * Function ivas_get_td_decorr_flag() * - * TD decorr bitrate and outfit_config check call + * TD decorr bitrate and output_config check call *-----------------------------------------------------------------------------------------*/ void ivas_get_td_decorr_flag( diff --git a/lib_com/options.h b/lib_com/options.h index 789ba31834..1aede066d7 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -201,7 +201,7 @@ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ #define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ -#define FIX_163_SBA_TD_DECORR_OPT /* Dlb : Issue 163 : Malloc of td_deccor structure at 512 kbps and output configuration FOA*/ +#define FIX_163_SBA_TD_DECORR_OPT /* Dlb : Issue 163 : TD decorr state optimization in SBA for certain output formats */ #define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ #define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index b5b1a20053..baa83fad0e 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1736,9 +1736,9 @@ void ivas_binaural_reverb_processSubframe( /* Add from temporally decaying sparse tap locations the audio to the output. */ for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) { -#ifdef JBM_TSM_ON_TCS switch ( phaseShiftTypePr[tapIdx] ) { +#ifdef JBM_TSM_ON_TCS case 0: /* 0 degrees phase */ v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); @@ -1755,10 +1755,7 @@ void ivas_binaural_reverb_processSubframe( v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); break; - } #else - switch ( phaseShiftTypePr[tapIdx] ) - { case 0: /* 0 degrees phase */ v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); @@ -1775,8 +1772,8 @@ void ivas_binaural_reverb_processSubframe( v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); break; - } #endif + } } } -- GitLab From b2ba1e64b2a7fe83319029fe0f785f883ec9bdb3 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 29 May 2023 08:32:38 +0200 Subject: [PATCH 077/381] Fixes under FIX_507_WARNINGS --- lib_com/fine_gain_bits.c | 6 ++++++ lib_com/hq_tools.c | 4 ++++ lib_com/options.h | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib_com/fine_gain_bits.c b/lib_com/fine_gain_bits.c index c4c5ce3fca..bc4eb47902 100644 --- a/lib_com/fine_gain_bits.c +++ b/lib_com/fine_gain_bits.c @@ -101,7 +101,9 @@ int16_t assign_gain_bits( int16_t *Rcalc /* o : Bit budget for shape quantizer (Q3) */ ) { +#ifndef FIX_507_WARNINGS int16_t subband_cnt; +#endif int16_t gain_bits_tot; int16_t i; @@ -116,14 +118,18 @@ int16_t assign_gain_bits( } /* Re-adjust bit budget for gain quantization */ +#ifndef FIX_507_WARNINGS subband_cnt = 0; +#endif gain_bits_tot = 0; *Rcalc = 0; for ( i = 0; i < BANDS; i++ ) { if ( Rk[i] > 0 ) { +#ifndef FIX_507_WARNINGS subband_cnt++; +#endif Rk[i] -= gain_bits_array[i] * 8; gain_bits_tot += gain_bits_array[i]; *Rcalc += Rk[i]; diff --git a/lib_com/hq_tools.c b/lib_com/hq_tools.c index 0008cb957c..2364d8179c 100644 --- a/lib_com/hq_tools.c +++ b/lib_com/hq_tools.c @@ -1228,7 +1228,9 @@ int16_t calc_nor_delta_hf( int16_t i; int16_t ynrm_t[44], normqlg2_t[44]; int16_t delta, max_delta, min_delta, bitsforDelta, add_bits_denv; +#ifndef FIX_507_WARNINGS int16_t temp_num = 0; +#endif max_delta = -100; calc_norm( t_audio, ynrm_t, normqlg2_t, 0, nb_sfm, sfmsize, sfm_start ); @@ -1290,7 +1292,9 @@ int16_t calc_nor_delta_hf( ynrm[i] += delta; add_bits_denv += bitsforDelta; +#ifndef FIX_507_WARNINGS temp_num++; +#endif } } diff --git a/lib_com/options.h b/lib_com/options.h index dccc11cf17..eb348c7364 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -220,7 +220,7 @@ #define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ #define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ - +#define FIX_507_WARNINGS /* FhG/Eri/Dlb/VA: Issue 507, Warnings on MacOS */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 57b457c22f28775270ee8e79df1b5a79d816ea81 Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Mon, 29 May 2023 08:54:42 +0200 Subject: [PATCH 078/381] Renamed FIX_507_WARNINGS to FIX_506_WARNINGS --- lib_com/fine_gain_bits.c | 6 +++--- lib_com/hq_tools.c | 4 ++-- lib_com/options.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_com/fine_gain_bits.c b/lib_com/fine_gain_bits.c index bc4eb47902..b87de6d4d4 100644 --- a/lib_com/fine_gain_bits.c +++ b/lib_com/fine_gain_bits.c @@ -101,7 +101,7 @@ int16_t assign_gain_bits( int16_t *Rcalc /* o : Bit budget for shape quantizer (Q3) */ ) { -#ifndef FIX_507_WARNINGS +#ifndef FIX_506_WARNINGS int16_t subband_cnt; #endif int16_t gain_bits_tot; @@ -118,7 +118,7 @@ int16_t assign_gain_bits( } /* Re-adjust bit budget for gain quantization */ -#ifndef FIX_507_WARNINGS +#ifndef FIX_506_WARNINGS subband_cnt = 0; #endif gain_bits_tot = 0; @@ -127,7 +127,7 @@ int16_t assign_gain_bits( { if ( Rk[i] > 0 ) { -#ifndef FIX_507_WARNINGS +#ifndef FIX_506_WARNINGS subband_cnt++; #endif Rk[i] -= gain_bits_array[i] * 8; diff --git a/lib_com/hq_tools.c b/lib_com/hq_tools.c index 2364d8179c..f7fef380d7 100644 --- a/lib_com/hq_tools.c +++ b/lib_com/hq_tools.c @@ -1228,7 +1228,7 @@ int16_t calc_nor_delta_hf( int16_t i; int16_t ynrm_t[44], normqlg2_t[44]; int16_t delta, max_delta, min_delta, bitsforDelta, add_bits_denv; -#ifndef FIX_507_WARNINGS +#ifndef FIX_506_WARNINGS int16_t temp_num = 0; #endif @@ -1292,7 +1292,7 @@ int16_t calc_nor_delta_hf( ynrm[i] += delta; add_bits_denv += bitsforDelta; -#ifndef FIX_507_WARNINGS +#ifndef FIX_506_WARNINGS temp_num++; #endif } diff --git a/lib_com/options.h b/lib_com/options.h index eb348c7364..5843723247 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -220,7 +220,7 @@ #define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ #define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ -#define FIX_507_WARNINGS /* FhG/Eri/Dlb/VA: Issue 507, Warnings on MacOS */ +#define FIX_506_WARNINGS /* FhG/Eri/Dlb/VA: Issue 508, Warnings on MacOS */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 31ca5a7993e92d4d13539e119db3a3edc4021358 Mon Sep 17 00:00:00 2001 From: Fredrik Jansson Date: Mon, 29 May 2023 09:55:54 +0200 Subject: [PATCH 079/381] clang format fix --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9ec1af822e..7024723e97 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -37,7 +37,7 @@ #ifndef OPTIONS_H #define OPTIONS_H - /* clang-format off */ +/* clang-format off */ /* ################### Start compiler switches ######################## */ #define SUPPORT_JBM_TRACEFILE /* support for JBM tracefile, which is needed for 3GPP objective/subjective testing, but not relevant for real-world implementations */ -- GitLab From c033e0d1ca713d1116ecd4eee4bd44d0ec3ce9ce Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Mon, 29 May 2023 15:43:34 +0530 Subject: [PATCH 080/381] Review comment changes --- lib_dec/ivas_spar_decoder.c | 62 ++++++++++++++++++------------------- lib_dec/ivas_spar_md_dec.c | 37 ++++++++++++---------- 2 files changed, 52 insertions(+), 47 deletions(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index b509203c2a..4956ef820b 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -73,6 +73,9 @@ ivas_error ivas_spar_dec_open( int16_t i, j, b, active_w_mixing; int32_t output_Fs; int16_t num_decor_chs; +#ifdef FIX_501_TABLE_IDX_INIT + int16_t table_idx; +#endif error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); @@ -112,7 +115,34 @@ ivas_error ivas_spar_dec_open( return error; } hSpar->hMdDec->td_decorr_flag = 1; - hSpar->hMdDec->table_idx = -1; +#ifdef FIX_501_TABLE_IDX_INIT + + if ( st_ivas->ini_frame == 0 && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + if ( st_ivas->sid_format == SID_SBA_2TC ) + { + table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order_internal, SPAR_CONFIG_BW, NULL, NULL ); + } + else + { + table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order_internal, SPAR_CONFIG_BW, NULL, NULL ); + } + + if ( hSpar->hMdDec->table_idx != table_idx ) + { + hSpar->hMdDec->table_idx = table_idx; + hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; + + ivas_spar_md_dec_init( hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal ); + } + } + else + { +#endif + hSpar->hMdDec->table_idx = -1; +#ifdef FIX_501_TABLE_IDX_INIT + } +#endif /* set FB config. */ active_w_mixing = -1; @@ -736,37 +766,7 @@ static void ivas_spar_dec_MD( ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); } } -#ifdef FIX_501_TABLE_IDX_INIT - else if ( st_ivas->ini_frame == 0 ) - { - if ( st_ivas->sid_format == SID_SBA_2TC ) - { - table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - } - else - { - table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - } - - hSpar->hMdDec->table_idx = table_idx; - if ( hSpar->hMdDec->spar_hoa_md_flag ) - { - hSpar->hMdDec->spar_md.num_bands = IVAS_MAX_NUM_BANDS; - } - else - { - hSpar->hMdDec->spar_md.num_bands = min( SPAR_DIRAC_SPLIT_START_BAND, IVAS_MAX_NUM_BANDS ); - } - - if ( hSpar->hMdDec->table_idx != table_idx ) - { - hSpar->hMdDec->table_idx = table_idx; - hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; - ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); - } - } -#endif /*---------------------------------------------------------------------* * Decode MD *---------------------------------------------------------------------*/ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 9a47a3562a..a10834ad81 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1803,29 +1803,34 @@ static void ivas_spar_dec_parse_md_bs( ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band ); - for ( i = *nB - 1; i >= 0; i-- ) +#ifdef FIX_501_TABLE_IDX_INIT + if ( last_active_brate >= IVAS_24k4 ) { - ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * i]; - - for ( b = *bands_bw - 1; b >= 0; b-- ) +#endif + for ( i = *nB - 1; i >= 0; i-- ) { - idx = i * *bands_bw + b; - for ( j = 0; j < FOA_CHANNELS - 1; j++ ) - { - hMdDec->spar_md.band_coeffs[idx].pred_re[j] = hMdDec->spar_md.band_coeffs[i].pred_re[j]; - } - for ( j = 0; j < ndec; j++ ) + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * i]; + + for ( b = *bands_bw - 1; b >= 0; b-- ) { - hMdDec->spar_md.band_coeffs[idx].P_re[j] = hMdDec->spar_md.band_coeffs[i].P_re[j]; + idx = i * *bands_bw + b; + for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + { + hMdDec->spar_md.band_coeffs[idx].pred_re[j] = hMdDec->spar_md.band_coeffs[i].pred_re[j]; + } + for ( j = 0; j < ndec; j++ ) + { + hMdDec->spar_md.band_coeffs[idx].P_re[j] = hMdDec->spar_md.band_coeffs[i].P_re[j]; + } + hMdDec->valid_bands[idx] = 1; } - hMdDec->valid_bands[idx] = 1; } - } - *nB = num_bands; - *bands_bw = 1; + *nB = num_bands; + *bands_bw = 1; #ifdef FIX_501_TABLE_IDX_INIT - if ( ( ivas_total_brate < IVAS_24k4 ) && ( last_active_brate < IVAS_24k4 ) ) + } + else { *bands_bw = 2; *nB = num_bands / *bands_bw; -- GitLab From 237fc9fb1dd3bfbba28a84ec606af2befb0cbc30 Mon Sep 17 00:00:00 2001 From: Simon Plain Date: Tue, 30 May 2023 06:49:49 +0200 Subject: [PATCH 081/381] 506 Warning fixes --- lib_com/ivas_prot.h | 6 ++++++ lib_dec/ivas_mc_paramupmix_dec.c | 25 ++++++++++++++++++++++++- lib_enc/ivas_mc_paramupmix_enc.c | 4 ++++ lib_enc/ivas_mct_enc.c | 8 ++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 556daf327b..f0ffc94679 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3948,9 +3948,15 @@ void ivas_mc_paramupmix_dec( float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ ); +#ifdef FIX_506_WARNINGS +int16_t ivas_mc_paramupmix_enc_getNumTransportChannels( + void +); +#else int16_t ivas_mc_paramupmix_getNumTransportChannels( void ); +#endif ivas_error ivas_mc_paramupmix_dec_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 346868ab6a..c53fb5280c 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -66,6 +66,10 @@ static void dequant_beta( int16_t nv, int16_t ivStart, QUANT_TYPE quant_type, in static void get_ec_data( Decoder_State *st, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t nParBand, int16_t parBandStart, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS] ); +#ifdef FIX_506_WARNINGS +static int16_t ivas_mc_paramupmix_dec_getNumTransportChannels( void ); +#endif + /*------------------------------------------------------------------------- * ivas_mc_paramupmix_dec_read_BS() * @@ -288,6 +292,7 @@ void ivas_mc_paramupmix_dec( return; } +#ifndef FIX_506_WARNINGS /*------------------------------------------------------------------------- * ivas_mc_paramupmix_getNumTransportChannels() * @@ -299,6 +304,7 @@ int16_t ivas_mc_paramupmix_getNumTransportChannels() nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; /* 5.1.2 */ return nchan_transport; } +#endif /*------------------------------------------------------------------------- * ivas_mc_paramupmix_dec_open() @@ -328,8 +334,11 @@ ivas_error ivas_mc_paramupmix_dec_open( } output_Fs = st_ivas->hDecoderConfig->output_Fs; hMCParamUpmix->first_frame = 1; - +#ifdef FIX_506_WARNINGS + st_ivas->nchan_transport = ivas_mc_paramupmix_dec_getNumTransportChannels(); +#else st_ivas->nchan_transport = ivas_mc_paramupmix_getNumTransportChannels(); +#endif nchan_transport = st_ivas->nchan_transport; switch ( nchan_transport ) @@ -691,3 +700,17 @@ static void get_ec_data( dequant_beta( nParBand, parBandStart, quant_type, alphaQEnv, parQ, ab ); } } + +#ifdef FIX_506_WARNINGS +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_getNumTransportChannels() + * + * + *------------------------------------------------------------------------*/ +static int16_t ivas_mc_paramupmix_dec_getNumTransportChannels( void ) +{ + int16_t nchan_transport; + nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; /* 5.1.2 */ + return nchan_transport; +} +#endif diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 0d5f69d800..657f210d3b 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -359,7 +359,11 @@ void ivas_mc_paramupmix_enc_close( *------------------------------------------------------------------------*/ /* r : number of IVAS transport channels */ +#ifdef FIX_506_WARNINGS +int16_t ivas_mc_paramupmix_enc_getNumTransportChannels( void ) +#else int16_t ivas_mc_paramupmix_getNumTransportChannels() +#endif { int16_t nchan_transport; diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index af743deaa1..4fdbabc570 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -317,7 +317,11 @@ ivas_error create_mct_enc( } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { +#ifdef FIX_506_WARNINGS + hMCT->nchan_out_woLFE = ivas_mc_paramupmix_enc_getNumTransportChannels(); +#else hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels(); +#endif } else if ( ivas_format == SBA_FORMAT ) { @@ -429,7 +433,11 @@ ivas_error mct_enc_reconfigure( } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { +#ifdef FIX_506_WARNINGS + hMCT->nchan_out_woLFE = ivas_mc_paramupmix_enc_getNumTransportChannels(); +#else hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels(); +#endif } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) { -- GitLab From 0a678819869a24fac1e3de1b329ae9db9d24fda5 Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Tue, 30 May 2023 11:09:25 +0530 Subject: [PATCH 082/381] Review comment changes - Part 3 --- lib_com/ivas_prot.h | 6 ------ lib_com/ivas_td_decorr.c | 31 +------------------------------ lib_dec/ivas_sba_dec.c | 2 +- lib_dec/ivas_spar_decoder.c | 19 ++++++++++--------- lib_dec/ivas_stat_dec.h | 3 --- 5 files changed, 12 insertions(+), 49 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 4eb6a15c13..556daf327b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5734,12 +5734,6 @@ int16_t ivas_get_num_bands_from_bw_idx( const int16_t bwidth /* i : audio bandwidth */ ); -#ifdef FIX_163_SBA_TD_DECORR_OPT -void ivas_get_td_decorr_flag( - SPAR_DEC_HANDLE hSpar, /* i/o : IVAS SPAR handle structure */ - Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ -); -#endif /* clang-format on */ diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 7883c13083..f2dd0871dc 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -211,6 +211,7 @@ ivas_error ivas_td_decorr_dec_open( num_out_chans = nchan_internal - 1; error = IVAS_ERR_OK; + if ( ( hTdDecorr_loc = (ivas_td_decorr_state_t *) malloc( sizeof( ivas_td_decorr_state_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); @@ -221,7 +222,6 @@ ivas_error ivas_td_decorr_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); } set_f( hTdDecorr_loc->look_ahead_buf, 0, (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ); - #ifdef JBM_TSM_ON_TCS hTdDecorr_loc->offset = (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); #endif @@ -531,32 +531,3 @@ void ivas_td_decorr_process( return; } - -#ifdef FIX_163_SBA_TD_DECORR_OPT -/*-----------------------------------------------------------------------------------------* - * Function ivas_get_td_decorr_flag() - * - * TD decorr bitrate and output_config check call - *-----------------------------------------------------------------------------------------*/ - -void ivas_get_td_decorr_flag( - SPAR_DEC_HANDLE hSpar, /* i/o : IVAS SPAR handle structure */ - Decoder_Struct *st_ivas /* i/o : IVAS decoder structure */ -) -{ - int32_t ivas_total_brate; - AUDIO_CONFIG output_config; - - ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - output_config = st_ivas->hDecoderConfig->output_config; - - if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) || ( ivas_total_brate >= IVAS_256k && output_config == AUDIO_CONFIG_FOA ) ) ) - { - hSpar->td_decorr_flag = 0; - } - else - { - hSpar->td_decorr_flag = 1; - } -} -#endif diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 5dfef59118..dd7174eae0 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -461,7 +461,7 @@ ivas_error ivas_sba_dec_digest_tc( { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( st_ivas->ivas_format != SBA_FORMAT || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hSpar->td_decorr_flag ) ) + if ( st_ivas->hDiracDecBin->hTdDecorr ) { #endif ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index c8185c0501..a2cdfe1562 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -102,8 +102,11 @@ ivas_error ivas_spar_dec_open( /* TD decorr. */ #ifdef FIX_163_SBA_TD_DECORR_OPT - ivas_get_td_decorr_flag( hSpar, st_ivas ); - if ( hSpar->td_decorr_flag ) + if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA ) ) ) + { + hSpar->hTdDecorr = NULL; + } + else { #endif if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) @@ -112,10 +115,6 @@ ivas_error ivas_spar_dec_open( } #ifdef FIX_163_SBA_TD_DECORR_OPT } - else - { - hSpar->hTdDecorr = NULL; - } #endif /* MD handle */ @@ -744,12 +743,13 @@ static void ivas_spar_dec_MD( { hSpar->hMdDec->table_idx = table_idx; #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( hSpar->td_decorr_flag ) + if ( hSpar->hTdDecorr ) { #endif hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; #ifdef FIX_163_SBA_TD_DECORR_OPT } + #endif ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); } @@ -1248,8 +1248,9 @@ void ivas_spar_dec_digest_tc( while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( hSpar->td_decorr_flag ) + if ( hSpar->hTdDecorr ) { #endif ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); @@ -1337,7 +1338,7 @@ void ivas_spar_dec_upmixer( if ( hSpar->hMdDec->td_decorr_flag ) { #ifdef FIX_163_SBA_TD_DECORR_OPT - if ( hSpar->td_decorr_flag ) + if ( hSpar->hTdDecorr ) { #endif ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 50a759b0b2..834ce32ab5 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -922,9 +922,6 @@ typedef struct ivas_spar_dec_lib_t int16_t slots_rendered; int16_t num_slots; #endif -#ifdef FIX_163_SBA_TD_DECORR_OPT - int16_t td_decorr_flag; /* Disable malloc for td_decorr structure flag */ -#endif } SPAR_DEC_DATA, *SPAR_DEC_HANDLE; -- GitLab From 166cce22385d27c83d5e9f1fad776f8e58237519 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Tue, 30 May 2023 10:18:34 +0200 Subject: [PATCH 083/381] remove unnecessary TODO from ivas_masa_enc.c --- lib_enc/ivas_masa_enc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index e4972dd3a0..465468fdec 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -2100,7 +2100,6 @@ static uint8_t are_masa_subframes_similar( } } - /* TODO: a nicer negation */ if ( sf_differ ) { return FALSE; -- GitLab From 2bc386f71c87f8267f1fa250f2dbc2f10fcc72f7 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Tue, 30 May 2023 10:29:31 +0200 Subject: [PATCH 084/381] remove unnecessary TODO from ivas_mcmasa_enc.c --- lib_enc/ivas_mcmasa_enc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index ec3a49956b..8fac2f323d 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -1240,10 +1240,10 @@ void ivas_mcmasa_param_est_enc( *--------------------------------------------------------------------------*/ void ivas_mcmasa_dmx_modify( - const int16_t n_samples, /* i : input frame length in samples */ - float dmx[][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )], /* i/o: downmix signal to be transformed into another format. TODO: buffer size into define? */ - const int16_t n_chnls_dmx_old, /* i : number of downmix channels in the old format */ - const int16_t n_chnls_dmx_new ) /* i : number of downmix channels in the target format */ + const int16_t n_samples, /* i : input frame length in samples */ + float dmx[][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )], /* i/o: downmix signal to be transformed into another format */ + const int16_t n_chnls_dmx_old, /* i : number of downmix channels in the old format */ + const int16_t n_chnls_dmx_new ) /* i : number of downmix channels in the target format */ { /* assumed data ordering in **dmx: [sce][cpe_chnl0][cpe_chnl1], i.e., [c][l][r] */ int16_t i; -- GitLab From dabc98186fe4d7d8e620a24fed0863fa6efd4a41 Mon Sep 17 00:00:00 2001 From: Jouni Paulus Date: Tue, 30 May 2023 10:52:34 +0200 Subject: [PATCH 085/381] added a better comment to the functionality and removed a TODO from ivas_vbap.c --- lib_dec/ivas_vbap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_vbap.c b/lib_dec/ivas_vbap.c index cda52c1aec..841f3df132 100644 --- a/lib_dec/ivas_vbap.c +++ b/lib_dec/ivas_vbap.c @@ -178,11 +178,13 @@ ivas_error vbap_init_data( push_wmops( "vbap_init" ); /* Basic init checks */ + /* If the requested layout is invalid, hVBAPdata is set to NULL and the signal will + * be distributed with an equal gain into all output channels. + * The surrounding code needs to handle the NULL pointer properly. */ if ( num_speaker_nodes > VBAP_MAX_NUM_SPEAKER_NODES || num_speaker_nodes < 3 ) { hVBAPdata = NULL; pop_wmops(); - /* TODO: are these two paths correct behaviour or should and error be returned ? */ return IVAS_ERR_OK; } -- GitLab From 66a31275972e25d659714d0a210e414bfeb13aee Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Tue, 30 May 2023 18:26:26 +0530 Subject: [PATCH 086/381] Review comment changes - Part 2 --- lib_dec/ivas_spar_decoder.c | 31 ++++--------------------------- lib_dec/ivas_spar_md_dec.c | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 4956ef820b..8f781e4703 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -73,9 +73,6 @@ ivas_error ivas_spar_dec_open( int16_t i, j, b, active_w_mixing; int32_t output_Fs; int16_t num_decor_chs; -#ifdef FIX_501_TABLE_IDX_INIT - int16_t table_idx; -#endif error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); @@ -116,32 +113,12 @@ ivas_error ivas_spar_dec_open( } hSpar->hMdDec->td_decorr_flag = 1; #ifdef FIX_501_TABLE_IDX_INIT - - if ( st_ivas->ini_frame == 0 && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) - { - if ( st_ivas->sid_format == SID_SBA_2TC ) - { - table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order_internal, SPAR_CONFIG_BW, NULL, NULL ); - } - else - { - table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order_internal, SPAR_CONFIG_BW, NULL, NULL ); - } - - if ( hSpar->hMdDec->table_idx != table_idx ) - { - hSpar->hMdDec->table_idx = table_idx; - hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; - - ivas_spar_md_dec_init( hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal ); - } - } - else + if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) { -#endif - hSpar->hMdDec->table_idx = -1; -#ifdef FIX_501_TABLE_IDX_INIT + hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; } +#else + hSpar->hMdDec->table_idx = -1; #endif /* set FB config. */ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index a10834ad81..62f419de67 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -292,11 +292,29 @@ ivas_error ivas_spar_md_dec_open( return error; } +#ifdef FIX_501_TABLE_IDX_INIT + if ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + if ( sid_format == SID_SBA_2TC ) + { + hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + else + { + hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_24k4, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } + } + else + { + hMdDec->table_idx = ivas_get_spar_table_idx( hDecoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); + } +#else hMdDec->table_idx = 0; /* just to initialize state variables*/ if ( ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) && ( sid_format == SID_SBA_2TC ) ) { hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); } +#endif if ( ( error = ivas_spar_md_dec_init( hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK ) { return error; @@ -1836,6 +1854,7 @@ static void ivas_spar_dec_parse_md_bs( *nB = num_bands / *bands_bw; } #endif + return; } -- GitLab From 4368f53e6341c4cce29d5396db80df88af838cbc Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Tue, 30 May 2023 18:55:15 +0530 Subject: [PATCH 087/381] Crash fix --- lib_dec/ivas_spar_decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 72d208806d..1df642906c 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -124,7 +124,7 @@ ivas_error ivas_spar_dec_open( } hSpar->hMdDec->td_decorr_flag = 1; #ifdef FIX_501_TABLE_IDX_INIT - if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) + if ( hSpar->hTdDecorr && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) { hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; } -- GitLab From d24d913eb3f0074d1757ff0f67cb4f659f8e7eac Mon Sep 17 00:00:00 2001 From: Dominik Weckbecker Date: Tue, 30 May 2023 15:30:35 +0200 Subject: [PATCH 088/381] increase maximum number of metadata indices for SBA at 384 and 512 kbps --- lib_com/bitstream.c | 8 ++++++++ lib_com/options.h | 3 +++ 2 files changed, 11 insertions(+) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index dcd1b71684..c07282dbe3 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -780,11 +780,19 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_384k ) { +#ifdef FIX_509 + return 2000; +#else return 1500; +#endif } else { +#ifdef FIX_509 + return 2500; +#else return 2000; +#endif } } else if ( ivas_format == MASA_FORMAT ) diff --git a/lib_com/options.h b/lib_com/options.h index 3c714b64e0..1d40994974 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -224,6 +224,9 @@ #define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ #define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ +#define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ + + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From c4b6cdd1f2f0dfbc900eeddf75510479d95c822e Mon Sep 17 00:00:00 2001 From: rhb Date: Tue, 30 May 2023 16:37:14 +0200 Subject: [PATCH 089/381] amend FIX_483b to resolve another floating point exception --- lib_enc/ivas_stereo_mdct_stereo_enc.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index 138c9436d6..f8e2ca05ae 100755 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -563,7 +563,12 @@ void ms_inv_mask_processing( { int16_t sfb; STEREO_MDCT_BAND_PARAMETERS *sfbConf; +#ifdef FIX_483b + int16_t nSubframes, L_subframeTCX; + nSubframes = (sts[0]->hTcxEnc->tcxMode == TCX_20) ? 1 : NB_DIV; + L_subframeTCX = sts[0]->hTcxEnc->L_frameTCX / nSubframes; +#endif sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; if ( sts[0]->last_core == ACELP_CORE ) @@ -588,6 +593,15 @@ void ms_inv_mask_processing( } } +#ifdef FIX_483b + /* set rest of inverse spectrum to zero */ + if ( L_subframeTCX > sfbConf->sfbOffset[maxSfb] ) + { + set_zero( &x_inv_0[sfbConf->sfbOffset[maxSfb]], L_subframeTCX - sfbConf->sfbOffset[maxSfb] ); + set_zero( &x_inv_1[sfbConf->sfbOffset[maxSfb]], L_subframeTCX - sfbConf->sfbOffset[maxSfb] ); + } +#endif + return; } -- GitLab From e2326bb1da50db940ebc41790a6bee2abdfbf5d4 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 30 May 2023 16:50:47 +0200 Subject: [PATCH 090/381] finish implementation for FIX_296_CFG_LFE_SCENE_DESC + remove two TODOs; needs testing --- apps/renderer.c | 155 +++++++++++++++++- .../data/renderer_config_format_readme.txt | 4 + 2 files changed, 153 insertions(+), 6 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index edafa29db8..853ae31dd9 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -88,6 +88,15 @@ typedef struct uint16_t durationCounters[RENDERER_MAX_ISM_INPUTS]; /* Number of frames spent at current position */ } IsmPositionProvider; +#ifdef FIX_296_CFG_LFE_SCENE_DESC +typedef struct +{ + float lfe_azi; + float lfe_ele; + float lfe_gain_dB; + char lfe_pan_mtx[FILENAME_MAX]; +} LfeRoutingConfig; +#endif typedef struct { IVAS_REND_AudioConfig audioConfig; @@ -301,7 +310,11 @@ static const int32_t numCliOptions = sizeof( cliOptions ) / sizeof( CmdLnParser_ static IVAS_REND_AudioConfig ambisonicsOrderToEnum( const int16_t order ); +#ifdef FIX_296_CFG_LFE_SCENE_DESC +static void parseSceneDescriptionFile( char *path, char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); +#else static void parseSceneDescriptionFile( char *path, char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders ); +#endif static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ); @@ -313,6 +326,11 @@ static void IsmPositionProvider_getNextFrame( IsmPositionProvider *positionProvi static void IsmPositionProvider_close( IsmPositionProvider *positionProvider ); +#ifdef FIX_296_CFG_LFE_SCENE_DESC +static LfeRoutingConfig *LfeRoutingConfig_open( void ); +static void LfeRoutingConfig_close( LfeRoutingConfig *lfeRoutingCfg ); +#endif + static void readFromShorthandMetadata( IsmPositionProvider *positionProvider, ObjectPositionBuffer *objectMetadataBuffer, const uint32_t objIdx ); void getMetadataFromFileReader( IsmFileReader *ismReader, ObjectPositionBuffer *objectMetadataBuffer, const uint32_t objIdx ); @@ -331,7 +349,11 @@ static int8_t parseInt32( const char *line, int32_t *ret ); static void parseObjectPosition( char *line, IVAS_REND_AudioObjectPosition *position, uint16_t *positionDuration ); +#ifdef FIX_296_CFG_LFE_SCENE_DESC +static void parseMetadata( char *metadataString, char *inDir, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); +#else static void parseMetadata( char *metadataString, char *inDir, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders ); +#endif static ivas_error parseLfePanMtxFile( const char *lfeRoutingMatrixFilePath, IVAS_REND_LfePanMtx *lfePanMtx ); @@ -520,6 +542,9 @@ int main( HeadRotFileReader *referenceRotReader = NULL; hrtfFileReader *hrtfFileReader = NULL; IsmPositionProvider *positionProvider; +#ifdef FIX_296_CFG_LFE_SCENE_DESC + LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; +#endif RenderConfigReader *renderConfigReader = NULL; MasaFileReader *masaReaders[RENDERER_MAX_MASA_INPUTS]; IVAS_MASA_METADATA_HANDLE hMasaMetadata[RENDERER_MAX_MASA_INPUTS]; @@ -554,6 +579,13 @@ int main( hMasaMetadata[i] = NULL; } +#ifdef FIX_296_CFG_LFE_SCENE_DESC + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + lfeRoutingConfigs[i] = NULL; + } +#endif + CmdlnArgs args = parseCmdlnArgs( argc, argv ); if ( args.nonDiegeticPan && !( ( args.inConfig.numAudioObjects == 0 && args.inConfig.multiChannelBuses[0].audioConfig == IVAS_REND_AUDIO_CONFIG_MONO ) || @@ -626,7 +658,16 @@ int main( if ( args.sceneDescriptionInput ) { /* With scene description input, inputFilePath is the path to the scene description file. Parse it. */ +#ifdef FIX_296_CFG_LFE_SCENE_DESC + parseSceneDescriptionFile( args.inputFilePath, + audioFilePath, + &args.inConfig, + positionProvider, + masaReaders, + lfeRoutingConfigs ); +#else parseSceneDescriptionFile( args.inputFilePath, audioFilePath, &args.inConfig, positionProvider, masaReaders ); +#endif } else { @@ -749,7 +790,6 @@ int main( /* parse input LFE panning matrix */ if ( args.lfeCustomRoutingEnabled && !isEmptyString( args.inLfePanningMatrixFile ) ) { - /* TODO tmu: how should we handle this on CLI for multiple MC inputs? */ if ( ( error = parseLfePanMtxFile( args.inLfePanningMatrixFile, &lfePanMatrix ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); @@ -771,7 +811,6 @@ int main( exit( -1 ); } - /* TODO(sgi): Command line only supports one custom LS input for now, extend */ if ( args.inConfig.multiChannelBuses[i].audioConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { if ( ( error = IVAS_REND_ConfigureCustomInputLoudspeakerLayout( hIvasRend, mcIds[i], args.inConfig.inSetupCustom ) ) != IVAS_ERR_OK ) @@ -804,6 +843,39 @@ int main( exit( -1 ); } } +#ifdef FIX_296_CFG_LFE_SCENE_DESC + else + { + /* check for configuration from scene description file */ + if ( lfeRoutingConfigs[i] != NULL ) + { + /* prioritise panning matrix if configured */ + if ( lfeRoutingConfigs[i]->lfe_pan_mtx[0] != '\0' ) + { + if ( ( error = parseLfePanMtxFile( lfeRoutingConfigs[i]->lfe_pan_mtx, &lfePanMatrix ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + + if ( ( error = IVAS_REND_SetInputLfeMtx( hIvasRend, mcIds[i], (const IVAS_REND_LfePanMtx *) &lfePanMatrix ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + /* set position based gains */ + else + { + if ( ( error = IVAS_REND_SetInputLfePos( hIvasRend, mcIds[i], lfeRoutingConfigs[i]->lfe_gain_dB, lfeRoutingConfigs[i]->lfe_azi, lfeRoutingConfigs[i]->lfe_ele ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } + } + } +#endif } for ( i = 0; i < args.inConfig.numAudioObjects; ++i ) @@ -1164,6 +1236,12 @@ int main( { MasaFileReader_close( &masaReaders[i] ); } +#ifdef FIX_296_CFG_LFE_SCENE_DESC + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) + { + LfeRoutingConfig_close( lfeRoutingConfigs[i] ); + } +#endif AudioFileReader_close( &audioReader ); AudioFileWriter_close( &audioWriter ); HeadRotationFileReader_close( &headRotReader ); @@ -1864,6 +1942,35 @@ IsmPositionProvider *IsmPositionProvider_open( return ipp; } +#ifdef FIX_296_CFG_LFE_SCENE_DESC +LfeRoutingConfig *LfeRoutingConfig_open( + void ) +{ + LfeRoutingConfig *lrc; + + lrc = (LfeRoutingConfig *) malloc( sizeof( LfeRoutingConfig ) ); + lrc->lfe_azi = 0; + lrc->lfe_ele = 0; + lrc->lfe_gain_dB = 0; + lrc->lfe_pan_mtx[0] = '\0'; + + return lrc; +} + +void LfeRoutingConfig_close( + LfeRoutingConfig *lfeRoutingCfg ) +{ + if ( lfeRoutingCfg == NULL ) + { + assert( !"Can't close LfeRoutingConfig - pointer is NULL" ); + } + + free( lfeRoutingCfg ); + + return; +} +#endif + void getMetadataFromFileReader( IsmFileReader *ismReader, ObjectPositionBuffer *objectMetadataBuffer, @@ -2370,6 +2477,9 @@ static void parseSba( static void parseMc( char *line, InputConfig *inConfig, +#ifdef FIX_296_CFG_LFE_SCENE_DESC + LfeRoutingConfig **lfeRoutingConfigs, +#endif const int32_t idx ) { readNextMetadataChunk( line, "\n" ); @@ -2378,7 +2488,7 @@ static void parseMc( readNextMetadataChunk( line, "\n" ); IVAS_REND_AudioConfig cfg = parseAudioConfig( line ); - if ( cfg == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) + if ( cfg == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) // TODO tmu : cfg is never parsed as custom LS? { parseCustomLayoutFile( line, &inConfig->inSetupCustom ); } @@ -2389,9 +2499,24 @@ static void parseMc( /* Read optional values */ #ifdef FIX_296_CFG_LFE_SCENE_DESC - float lg, la, le; - char tmpfile[FILENAME_MAX]; - parseOptionalInputValues( line, &lg, &la, &le, tmpfile, &inConfig->multiChannelBuses[idx].gain_dB ); + float lfe_gain_dB, lfe_azi, lfe_ele; + char lfe_pan_mtx[FILENAME_MAX]; + + parseOptionalInputValues( line, &lfe_gain_dB, &lfe_azi, &lfe_ele, lfe_pan_mtx, &inConfig->multiChannelBuses[idx].gain_dB ); + + if ( ( lfe_gain_dB != 0.f || lfe_azi != 0.f || lfe_ele != 0.f ) || + ( lfe_pan_mtx[0] != '\0' ) ) + { + /* a configuration was specified, set the values */ + lfeRoutingConfigs[idx] = LfeRoutingConfig_open(); + + lfeRoutingConfigs[idx]->lfe_gain_dB = lfe_gain_dB; + lfeRoutingConfigs[idx]->lfe_azi = lfe_azi; + lfeRoutingConfigs[idx]->lfe_ele = lfe_ele; + + strncpy( lfeRoutingConfigs[idx]->lfe_pan_mtx, lfe_pan_mtx, FILENAME_MAX ); + convert_backslash( lfeRoutingConfigs[idx]->lfe_pan_mtx ); + } #else parseOptionalInputValues( line, &inConfig->multiChannelBuses[idx].gain_dB ); #endif @@ -2480,7 +2605,12 @@ static void parseMetadata( char *inDir, InputConfig *inConfig, IsmPositionProvider *positionProvider, +#ifdef FIX_296_CFG_LFE_SCENE_DESC + MasaFileReader **masaReaders, + LfeRoutingConfig **lfeRoutingConfigs ) +#else MasaFileReader **masaReaders ) +#endif { char line[RENDERER_MAX_METADATA_LINE_LENGTH]; char *delimiter; @@ -2532,7 +2662,11 @@ static void parseMetadata( fprintf( stderr, "Metadata exceeds the supported number of MC inputs\n" ); exit( -1 ); } +#ifdef FIX_296_CFG_LFE_SCENE_DESC + parseMc( line, inConfig, lfeRoutingConfigs, counterChannelAudioObjects - 1 ); +#else parseMc( line, inConfig, counterChannelAudioObjects - 1 ); +#endif } else if ( strcmp( line, "SBA" ) == 0 ) { @@ -2600,7 +2734,12 @@ static void parseSceneDescriptionFile( char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, +#ifdef FIX_296_CFG_LFE_SCENE_DESC + MasaFileReader **masaReaders, + LfeRoutingConfig **lfeRoutingConfigs ) +#else MasaFileReader **masaReaders ) +#endif { uint32_t inAudioFilePathLen; char inAudioFilePath[FILENAME_MAX]; @@ -2629,7 +2768,11 @@ static void parseSceneDescriptionFile( strcpy( audioFilePath, inDir ); strncat( audioFilePath, inAudioFilePath, inAudioFilePathLen ); +#ifdef FIX_296_CFG_LFE_SCENE_DESC + parseMetadata( mtdStr, inDir, inConfig, positionProvider, masaReaders, lfeRoutingConfigs ); +#else parseMetadata( mtdStr, inDir, inConfig, positionProvider, masaReaders ); +#endif return; } diff --git a/tests/renderer/data/renderer_config_format_readme.txt b/tests/renderer/data/renderer_config_format_readme.txt index 1fe493b279..dffb6c6317 100644 --- a/tests/renderer/data/renderer_config_format_readme.txt +++ b/tests/renderer/data/renderer_config_format_readme.txt @@ -109,6 +109,10 @@ Currently the following key-value pairs are supported: | key | value type | |---------------------|--------------------------------------| | gain_dB | float | +| lfe_matrix | str | +| lfe_gain_dB | float | +| lfe_azi | float | +| lfe_ele | float | ================================ Example config ================================= -- GitLab From f6d3e3e644b9ed0fd1c88378e011aa34ce1a271a Mon Sep 17 00:00:00 2001 From: rhb Date: Tue, 30 May 2023 16:59:03 +0200 Subject: [PATCH 091/381] clang format --- lib_enc/ivas_stereo_mdct_stereo_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 lib_enc/ivas_stereo_mdct_stereo_enc.c diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c old mode 100755 new mode 100644 index f8e2ca05ae..97c9ebe7ff --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -566,7 +566,7 @@ void ms_inv_mask_processing( #ifdef FIX_483b int16_t nSubframes, L_subframeTCX; - nSubframes = (sts[0]->hTcxEnc->tcxMode == TCX_20) ? 1 : NB_DIV; + nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; L_subframeTCX = sts[0]->hTcxEnc->L_frameTCX / nSubframes; #endif sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; -- GitLab From 71161f8c9d9aaeff4d2352e5dc009f73fd36bbb4 Mon Sep 17 00:00:00 2001 From: Rivukanta Bhattacharya <100792@ittiam.com> Date: Tue, 30 May 2023 21:26:59 +0530 Subject: [PATCH 092/381] Addressing review comments: set 2 --- lib_com/ivas_dirac_com.c | 8 ++++++++ lib_dec/ivas_dec.c | 2 ++ lib_dec/ivas_init_dec.c | 6 ++++++ lib_dec/ivas_jbm_dec.c | 2 ++ lib_dec/ivas_sba_dec.c | 2 ++ lib_dec/ivas_spar_decoder.c | 10 ++++++++++ lib_dec/ivas_stat_dec.h | 2 ++ lib_enc/ivas_dirac_enc.c | 2 +- lib_enc/ivas_sba_enc.c | 2 ++ lib_enc/ivas_stat_enc.h | 2 ++ 10 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index e4bbe4e1c7..721a6befdb 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -135,7 +135,11 @@ ivas_error ivas_dirac_config( { hFbMdft = NULL; } +#ifndef SBA_MODE_CLEAN_UP dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands; +#else + dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands; +#endif } else { @@ -166,7 +170,11 @@ ivas_error ivas_dirac_config( hFbMdft = NULL; } ( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft; +#ifndef SBA_MODE_CLEAN_UP dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands; +#else + dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands; +#endif } #ifndef SBA_MODE_CLEAN_UP diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 3826d7d0bb..587f3c34fc 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -345,6 +345,7 @@ ivas_error ivas_dec( else if ( st_ivas->ivas_format == SBA_FORMAT ) #endif { +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; @@ -359,6 +360,7 @@ ivas_error ivas_dec( st_ivas->hSpar->dirac_to_spar_md_bands ); #endif } +#endif if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 63ee9368d3..b232078417 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -690,7 +690,11 @@ ivas_error ivas_init_decoder( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { +#ifndef SBA_MODE_CLEAN_UP int16_t i, k, n; +#else + int16_t i, n; +#endif int16_t sce_id, cpe_id; int16_t numCldfbAnalyses, numCldfbSyntheses; #ifdef JBM_TSM_ON_TCS @@ -982,10 +986,12 @@ ivas_error ivas_init_decoder( return error; } +#ifndef SBA_MODE_CLEAN_UP for ( k = 0; k < DIRAC_MAX_NBANDS; k++ ) { st_ivas->hSpar->dirac_to_spar_md_bands[k] = st_ivas->hDirAC->dirac_to_spar_md_bands[k]; } +#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; } else diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 37f4870960..987c55f221 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -214,6 +214,7 @@ ivas_error ivas_jbm_dec_tc( else if ( st_ivas->ivas_format == SBA_FORMAT ) #endif { +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; @@ -223,6 +224,7 @@ ivas_error ivas_jbm_dec_tc( ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands ); #endif } +#endif if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 33465bb459..2d4c4cb2ab 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -327,7 +327,9 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hDirAC != NULL ) { +#ifndef SBA_MODE_CLEAN_UP mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); +#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 3c95d4cd3b..0d028b2359 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -326,6 +326,16 @@ ivas_error ivas_spar_dec( bit_stream_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; +#ifdef SBA_MODE_CLEAN_UP + /* read DirAC bitstream */ + if ( st_ivas->hQMetaData != NULL ) + { + ivas_dirac_dec_read_BS( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hQMetaData, nb_bits_read, + ivas_get_hodirac_flag( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), + st_ivas->hSpar->dirac_to_spar_md_bands ); + } +#endif + last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) { diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 7b39ca36a7..aacaa7aa0f 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -732,7 +732,9 @@ typedef struct ivas_dirac_dec_data_structure float power_ratios[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS][MAX_PARAM_ISM_WAVE]; PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; IVAS_FB_MIXER_HANDLE hFbMdft; +#ifndef SBA_MODE_CLEAN_UP int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; +#endif const int16_t *sba_map_tc; } DIRAC_DEC_DATA, *DIRAC_DEC_HANDLE; diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index d0df7a0084..de15725b65 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -221,8 +221,8 @@ ivas_error ivas_dirac_enc_open( #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { -#endif mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); +#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; #ifndef SBA_MODE_CLEAN_UP } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index c6ff188c23..e01de98741 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -268,7 +268,9 @@ ivas_error ivas_sba_enc_reconfigure( } } #endif +#ifndef SBA_MODE_CLEAN_UP mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); +#endif hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; /*-----------------------------------------------------------------* * Allocate, initialize, and configure SCE/CPE/MCT handles diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 803613e7e7..7690ac5b30 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -614,7 +614,9 @@ typedef struct ivas_dirac_enc_data_structure float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; #endif +#ifndef SBA_MODE_CLEAN_UP int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; +#endif /* diffuseness */ int16_t index_buffer_intensity; -- GitLab From 3c89c7fe609ad96242d35bdcc7d013795b09290b Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 30 May 2023 18:50:05 +0200 Subject: [PATCH 093/381] [fix] bug with LFE pan matrix file reading --- apps/renderer.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/renderer.c b/apps/renderer.c index 853ae31dd9..5407eb6c33 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -2835,8 +2835,16 @@ static ivas_error parseLfePanMtxFile( set_zero( ( *lfePanMtx )[lfe_in], IVAS_MAX_OUTPUT_CHANNELS ); } +#ifdef FIX_296_CFG_LFE_SCENE_DESC + for ( lfe_in = 0; lfe_in < IVAS_MAX_INPUT_LFE_CHANNELS; lfe_in++ ) +#else for ( lfe_in = 0, ch_out = 0; lfe_in < IVAS_MAX_INPUT_LFE_CHANNELS; lfe_in++ ) +#endif { +#ifdef FIX_296_CFG_LFE_SCENE_DESC + ch_out = 0; + +#endif /* if EOF or a blank line is encountered, simply return */ if ( ( fgets( line, 200, mtxFile ) == NULL ) && ( strcmp( line, "\n" ) == 0 ) && ( strcmp( line, "\r\n" ) == 0 ) ) { -- GitLab From 8591a629a6e06b3cb54ba9b9ec0a1afdd6f4a090 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 30 May 2023 19:17:14 +0200 Subject: [PATCH 094/381] [fix] bug with parsing custom layout files specified in the scene description file (addresses TODO added in e2326bb1) --- apps/renderer.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 5407eb6c33..17087227a8 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1960,12 +1960,11 @@ LfeRoutingConfig *LfeRoutingConfig_open( void LfeRoutingConfig_close( LfeRoutingConfig *lfeRoutingCfg ) { - if ( lfeRoutingCfg == NULL ) + if ( lfeRoutingCfg != NULL ) { - assert( !"Can't close LfeRoutingConfig - pointer is NULL" ); - } - free( lfeRoutingCfg ); + free( lfeRoutingCfg ); + } return; } @@ -2488,10 +2487,28 @@ static void parseMc( readNextMetadataChunk( line, "\n" ); IVAS_REND_AudioConfig cfg = parseAudioConfig( line ); - if ( cfg == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) // TODO tmu : cfg is never parsed as custom LS? +#ifdef FIX_296_CFG_LFE_SCENE_DESC + /* Try to use the given string as a path to a custom loudspeaker layout file. */ + if ( cfg == IVAS_REND_AUDIO_CONFIG_UNKNOWN ) + { + ivas_error error = parseCustomLayoutFile( line, &inConfig->inSetupCustom ); + + if ( error != IVAS_ERR_OK ) + { + fprintf( stderr, "Error while parsing input format %s\n", line ); + exit( -1 ); + } + inConfig->numMultiChannelBuses = 1; + inConfig->multiChannelBuses[idx].audioConfig = IVAS_REND_AUDIO_CONFIG_LS_CUSTOM; + inConfig->multiChannelBuses[idx].inputChannelIndex = 0; + inConfig->multiChannelBuses[idx].gain_dB = 0.0f; + } +#else + if ( cfg == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { parseCustomLayoutFile( line, &inConfig->inSetupCustom ); } +#endif else { inConfig->multiChannelBuses[idx].audioConfig = cfg; -- GitLab From 47ea410206b5ba00ac0817014ee274ab4410a20c Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 30 May 2023 19:22:16 +0200 Subject: [PATCH 095/381] [fix] update error message and change one return value in lib_dec::input_format_API_to_internal() --- lib_com/ivas_error.h | 4 ++++ lib_com/options.h | 3 ++- lib_dec/lib_dec.c | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index e1ba2c2912..56e09c558d 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -235,7 +235,11 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) case IVAS_ERR_INVALID_HRTF: return "Unsupported HRTF filter set"; case IVAS_ERR_INVALID_INPUT_FORMAT: +#ifdef FIX_510 + return "Invalid input format"; +#else return "Invalid format of input bitstream"; +#endif case IVAS_ERR_INVALID_INDEX: return "Invalid index"; default: diff --git a/lib_com/options.h b/lib_com/options.h index 3c714b64e0..c266e9ad83 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -222,7 +222,8 @@ #define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ #define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ -#define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ +#define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ +#define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 95fd02a0c1..47797f658b 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -3209,7 +3209,11 @@ static ivas_error input_format_API_to_internal( *sdp_hf_only = 1; break; default: +#ifdef FIX_510 + return IVAS_ERR_INVALID_BITSTREAM; +#else return IVAS_ERR_INVALID_INPUT_FORMAT; +#endif break; } -- GitLab From 0b3c48347ce92e733949daade8144b637f03071e Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 30 May 2023 19:23:09 +0200 Subject: [PATCH 096/381] [fix] whitespace in options.h --- lib_com/options.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index c266e9ad83..718e124e09 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -188,7 +188,7 @@ #define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ #define FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Eri: Remove unintentional reset of directivity pattern */ -#define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ +#define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ #define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */ #define VARIABLE_SPEED_DECODING /* FhG: Contribution 37: variable speed decoding employing the JBM functioniality */ #define JBM_TSM_ON_TCS /* FhG: Contribution 37: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ @@ -222,10 +222,10 @@ #define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ #define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ -#define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ +#define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ #define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */ - /* ################## End DEVELOPMENT switches ######################### */ +/* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ #endif -- GitLab From a6b814903593d2470eac886d108245de6f087098 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 31 May 2023 08:33:24 +0200 Subject: [PATCH 097/381] edit comments --- lib_dec/ivas_dirac_decorr_dec.c | 2 +- lib_dec/ivas_qmetadata_dec.c | 2 +- lib_enc/ivas_qmetadata_enc.c | 4 ++-- lib_enc/ivas_stereo_dft_enc.c | 2 +- lib_util/tinywaveout_c.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_dirac_decorr_dec.c b/lib_dec/ivas_dirac_decorr_dec.c index bcaa6cf2a1..8c19d9698b 100644 --- a/lib_dec/ivas_dirac_decorr_dec.c +++ b/lib_dec/ivas_dirac_decorr_dec.c @@ -156,7 +156,7 @@ ivas_error ivas_dirac_dec_decorr_open( freq_domain_decorr_ap_params->max_frequency = ( DIRAC_MAX_DECORR_CLDFB_BANDS * 24000 ) / CLDFB_NO_CHANNELS_MAX; } - freq_domain_decorr_ap_params->use_ducker = 1; /* fcs: fixed for now but can be adaptive in an extended version */ + freq_domain_decorr_ap_params->use_ducker = 1; /* ToDo: fcs: fixed for now but can be adaptive in an extended version */ assert( ( freq_domain_decorr_ap_params->max_frequency >= 0 ) && ( freq_domain_decorr_ap_params->max_frequency <= output_Fs / 2 ) && "Error: max_frequency invalid!" ); diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index cc7335c221..f6333ca944 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -2388,7 +2388,7 @@ static uint16_t ivas_qmetadata_DecodeQuasiUniform( uint16_t tresh, value; #ifdef DEBUGGING - assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ + assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ #endif bits = 30 - norm_l( alphabet_size ); /* bits = floor(log2(alphabet_size)) */ diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 17ddbe3676..9a1b0c8625 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -2284,7 +2284,7 @@ static void ivas_qmetadata_encode_quasi_uniform( int16_t bits; uint16_t tresh; #ifdef DEBUGGING - assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ + assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ assert( value < alphabet_size ); #endif @@ -2523,7 +2523,7 @@ static int16_t ivas_qmetadata_encode_quasi_uniform_length( int16_t bits; uint16_t tresh; #ifdef DEBUGGING - assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ + assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ assert( value < alphabet_size ); #endif diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index dbc0662255..36e577b482 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -767,7 +767,7 @@ void stereo_dft_enc_analyze( { int16_t tmp[1024]; - /*fcs: stereo side info is only simulated */ + /* stereo side info is only simulated */ for ( i = 0; i < input_frame; i++ ) { tmp[i] = (int16_t) ( input[0][i] + 0.5f ); diff --git a/lib_util/tinywaveout_c.h b/lib_util/tinywaveout_c.h index b82c0cd131..393633a745 100644 --- a/lib_util/tinywaveout_c.h +++ b/lib_util/tinywaveout_c.h @@ -205,7 +205,7 @@ static WAVEFILEOUT *CreateBWF( wfch.blockAlignment = LittleEndian16( (int16_t) blockAlignment ); wfch.sampleRate = LittleEndian32( sampleRate ); wfch.bytesPerSecond = LittleEndian32( sampleRate * blockAlignment ); - /* tbd: wavfmt ext hdr here */ + /* ToDo: tbd: wavfmt ext hdr here */ /* write to file */ self->fmtChunkOffset = ByteCnt; ByteCnt += (uint32_t) fwrite( &wfch, 1, sizeof( wfch ), self->theFile ); -- GitLab From e58803b4dff819c807ff4a5275bf5543851c868e Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 31 May 2023 09:01:29 +0200 Subject: [PATCH 098/381] Remove TODOs that are no longer relevant --- lib_com/bitstream.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 37bdcd1626..b6b68cf02b 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -3067,7 +3067,7 @@ ivas_error read_indices( file_read_FECpattern( &st_ivas->bfi ); st_ivas->bfi |= bfi; - if ( bfi == FRAMEMODE_MISSING ) /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */ + if ( bfi == FRAMEMODE_MISSING ) { for ( k = 0; k < num_bits; k++ ) { @@ -3233,7 +3233,7 @@ ivas_error read_indices( /* handle bad/lost speech frame(and CS bad SID frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ if ( ( - bfi != FRAMEMODE_FUTURE && /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */ + bfi != FRAMEMODE_FUTURE && ( *CNG != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ { @@ -3277,7 +3277,7 @@ ivas_error read_indices( } /* GOOD frame */ - if ( st_ivas->bfi == 0 || st_ivas->bfi == FRAMEMODE_FUTURE /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */ + if ( st_ivas->bfi == 0 || st_ivas->bfi == FRAMEMODE_FUTURE ) { /* GOOD frame - convert ITU-T G.192 words to short values */ -- GitLab From 8a5ed092bf11b5322ee7c2d0566cfb1d31811efd Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 31 May 2023 10:04:14 +0300 Subject: [PATCH 099/381] Issue 511: Optimizes parametric binauralizer gain fetch. --- lib_com/options.h | 2 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 147 ++++++++++++++++++- 2 files changed, 147 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index c0f9011de9..a7d711b6be 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -226,7 +226,7 @@ #define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ #define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ - +#define FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH /* Nokia: Issue 511, significant optimization of parametric binauralizer gain fetching. */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index c3e76e7306..b8bf08d372 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -64,6 +64,19 @@ #define ADAPT_HTPROTO_ROT_LIM_0 0.4f #define ADAPT_HTPROTO_ROT_LIM_1 0.8f +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH +#define MAX_GAIN_CACHE_SIZE 6 + +typedef struct hrtfGainCache +{ + int16_t azi; + int16_t ele; + + float shVec[HRTF_SH_CHANNELS]; +} PARAMBIN_HRTF_GAIN_CACHE; +#endif + + /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ @@ -75,9 +88,15 @@ static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float out #endif static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe, const int16_t isHeadtracked ); + +static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3], const int16_t isHeadtracked ); +#else static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe ); static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3] ); +#endif #ifdef JBM_TSM_ON_TCS static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); @@ -94,10 +113,15 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEA #endif static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH +static void hrtfShGetHrtf( const int16_t bin, const int16_t aziDeg, const int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t useCachedValue ); +static void getDirectPartGains( const int16_t bin, int16_t aziDeg, int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, const uint8_t stereoMode, float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t isHeadtracked ); +#else static void hrtfShGetHrtf( const int16_t bin, const int16_t aziDeg, const int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp ); static void getDirectPartGains( const int16_t bin, int16_t aziDeg, int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, const uint8_t stereoMode, float Rmat[3][3] ); +#endif static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); @@ -706,7 +730,11 @@ static void ivas_dirac_dec_binaural_internal( } } +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe, st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); +#else ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe ); +#endif if ( st_ivas->ivas_format == ISM_FORMAT ) { @@ -721,8 +749,11 @@ static void ivas_dirac_dec_binaural_internal( max_band_decorr = st_ivas->hDirAC->h_freq_domain_decorr_ap_params->max_band_decorr; } +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat, st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); +#else ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat ); - +#endif ivas_dirac_dec_binaural_process_output( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, subframe ); st_ivas->hDirAC->hDiffuseDist = NULL; @@ -799,7 +830,12 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + const int16_t subframe, + const int16_t isHeadtracked ) +#else const int16_t subframe ) +#endif { int16_t ch, slot, bin; uint8_t separateCenterChannelRendering; @@ -813,6 +849,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric uint8_t applyLowBitRateEQ; int16_t dirac_read_idx; float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_GAIN_CACHE_SIZE]; +#endif hDirAC = st_ivas->hDirAC; h = st_ivas->hDiracDecBin; @@ -832,6 +871,13 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric set_zero( frameMeanDiffusenessEneWeight, CLDFB_NO_CHANNELS_MAX ); +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + for ( idx = 0; idx < MAX_GAIN_CACHE_SIZE; idx++ ) + { + gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ + } +#endif + /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ applyLowBitRateEQ = 0; if ( ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MC_FORMAT ) && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) @@ -975,7 +1021,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric spreadCoh = max( spreadCoh, altSpreadCoh ); } +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[(dirIndex * 3)], isHeadtracked ); +#else getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); +#endif if ( h->renderStereoOutputInsteadOfBinaural ) { @@ -1018,7 +1068,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric rImagp *= centerMul; /* Apply the gain for the left source of the three coherent sources */ +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[(dirIndex * 3 + 1)], isHeadtracked ); +#else getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); +#endif hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); lRealp += sidesMul * lRealpTmp; @@ -1028,7 +1082,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Apply the gain for the right source of the three coherent sources. * -30 degrees to 330 wrapping due to internal functions. */ +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[(dirIndex * 3 + 2)], isHeadtracked ); +#else getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); +#endif hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); lRealp += sidesMul * lRealpTmp; @@ -1215,16 +1273,29 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + float Rmat[3][3], + const int16_t isHeadtracked ) +#else float Rmat[3][3] ) +#endif { int16_t chA, chB, bin; uint8_t separateCenterChannelRendering; int16_t nBins; DIRAC_DEC_BIN_HANDLE h; +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + PARAMBIN_HRTF_GAIN_CACHE gainCache; +#endif + h = st_ivas->hDiracDecBin; separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; nBins = st_ivas->hDirAC->num_freq_bands; /* Actually bins */ +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + gainCache.azi = -1000; /* Use -1000 as value for uninitialized cache. */ +#endif + for ( bin = 0; bin < nBins; bin++ ) { float tmpMtxRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], tmpMtxIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS], resultMtxRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], resultMtxIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS], gain; @@ -1367,7 +1438,11 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( h->processMtxImPrev[chA][2][bin] = h->processMtxIm[chA][2][bin]; } +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache, isHeadtracked ); +#else getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); +#endif h->processMtxRe[0][2][bin] = lRealp * gainFactor; h->processMtxIm[0][2][bin] = lImagp * gainFactor; @@ -2108,7 +2183,13 @@ static void getDirectPartGains( float *rRealp, float *rImagp, const uint8_t renderStereoOutputInsteadOfBinaural, +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + float Rmat[3][3], + PARAMBIN_HRTF_GAIN_CACHE *gainCache, + const int16_t isHeadtracked ) +#else float Rmat[3][3] ) +#endif { float aziRad, eleRad; float y, mappedX, aziRadMapped, A, A2, A3; @@ -2151,8 +2232,25 @@ static void getDirectPartGains( } else /* In regular binaural rendering mode */ { +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + if ( aziDeg == gainCache->azi && eleDeg == gainCache->ele ) + { + hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE ); + } + else + { + gainCache->azi = aziDeg; + gainCache->ele = eleDeg; + if ( isHeadtracked ) + { + rotateAziEle( (float) aziDeg, (float) eleDeg, &aziDeg, &eleDeg, Rmat, 0 ); + } + hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE ); + } +#else rotateAziEle( (float) aziDeg, (float) eleDeg, &aziDeg, &eleDeg, Rmat, 0 ); hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp ); +#endif } return; @@ -2166,9 +2264,55 @@ static void hrtfShGetHrtf( float *lRealp, float *lImagp, float *rRealp, +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + float *rImagp, + PARAMBIN_HRTF_GAIN_CACHE *gainCache, + const int16_t useCachedValue ) +#else float *rImagp ) +#endif { int16_t k; +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + + *lRealp = 0.0f; + *lImagp = 0.0f; + *rRealp = 0.0f; + *rImagp = 0.0f; + + if ( useCachedValue ) + { + float *shVec; + shVec = gainCache->shVec; + + for ( k = 0; k < HRTF_SH_CHANNELS; k++ ) + { + *lRealp += hrtfShCoeffsRe[0][k][bin] * shVec[k]; + *lImagp += hrtfShCoeffsIm[0][k][bin] * shVec[k]; + *rRealp += hrtfShCoeffsRe[1][k][bin] * shVec[k]; + *rImagp += hrtfShCoeffsIm[1][k][bin] * shVec[k]; + } + } + else + { + float shVec[HRTF_SH_CHANNELS]; + + ivas_dirac_dec_get_response( aziDeg, + eleDeg, + shVec, + HRTF_SH_ORDER ); + + for ( k = 0; k < HRTF_SH_CHANNELS; k++ ) + { + *lRealp += hrtfShCoeffsRe[0][k][bin] * shVec[k]; + *lImagp += hrtfShCoeffsIm[0][k][bin] * shVec[k]; + *rRealp += hrtfShCoeffsRe[1][k][bin] * shVec[k]; + *rImagp += hrtfShCoeffsIm[1][k][bin] * shVec[k]; + + gainCache->shVec[k] = shVec[k]; + } + } +#else float shVec[HRTF_SH_CHANNELS]; ivas_dirac_dec_get_response( aziDeg, @@ -2187,6 +2331,7 @@ static void hrtfShGetHrtf( *rRealp += hrtfShCoeffsRe[1][k][bin] * shVec[k]; *rImagp += hrtfShCoeffsIm[1][k][bin] * shVec[k]; } +#endif return; } -- GitLab From 716cbe90ceb7bc6d634ba62c91028c9f226aef7a Mon Sep 17 00:00:00 2001 From: emerit Date: Wed, 31 May 2023 09:23:08 +0200 Subject: [PATCH 100/381] FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER --- apps/renderer.c | 6 +++++- lib_com/options.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/renderer.c b/apps/renderer.c index 10a5bc38bb..5270931a51 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -147,7 +147,7 @@ typedef struct bool sceneDescriptionInput; float inputGainGlobal; /* Linear gain (not in dB) */ bool lfePanningEnabled; - float lfeConfigGain; /* Linear gain (not in dB) */ + float lfeConfigGain; /* Linear gain (not in dB) */ float lfeConfigAzimuth; float lfeConfigElevation; bool lfeCustomRoutingEnabled; @@ -242,7 +242,11 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_nonDiegeticPan, .match = "non_diegetic_pan", .matchShort = "ndp", +#ifdef FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER + .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", +#else .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(todo: implementation)", +#endif }, { .id = CmdLnOptionId_orientationTracking, diff --git a/lib_com/options.h b/lib_com/options.h index c0f9011de9..0a0d354242 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -227,6 +227,7 @@ #define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ +#define FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER /* ..\apps\renderer.c(240): .... (todo: implementation)",*/ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 2194644a0c0a9495138ffdabf44ecd427723730d Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 31 May 2023 10:45:41 +0300 Subject: [PATCH 101/381] Apply clang format. --- lib_rend/ivas_dirac_dec_binaural_functions.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index b8bf08d372..7a5a8d6dd1 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -1022,7 +1022,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[(dirIndex * 3)], isHeadtracked ); + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 )], isHeadtracked ); #else getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); #endif @@ -1069,7 +1069,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Apply the gain for the left source of the three coherent sources */ #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH - getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[(dirIndex * 3 + 1)], isHeadtracked ); + getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 + 1 )], isHeadtracked ); #else getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); #endif @@ -1083,7 +1083,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Apply the gain for the right source of the three coherent sources. * -30 degrees to 330 wrapping due to internal functions. */ #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH - getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[(dirIndex * 3 + 2)], isHeadtracked ); + getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 + 2 )], isHeadtracked ); #else getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); #endif -- GitLab From 96ec6b8f79f26e0da91f6a3c2ee5bba025761f49 Mon Sep 17 00:00:00 2001 From: Kacper Sagnowski Date: Wed, 31 May 2023 10:05:47 +0200 Subject: [PATCH 102/381] Remove irrelevant TODO comment --- lib_rend/lib_rend.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index cd4f16aaa7..a96715277f 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5509,7 +5509,6 @@ static void renderMasaToMc( copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC ); - /* TODO(sgi): Remove code duplication w.r.t. MASA rendering to other output configs */ if ( masaInput->decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC ) { ivas_dirac_dec_binaural( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); -- GitLab From 3e9efdf6a58e48f0715e67aeff2915dd57656526 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 31 May 2023 10:06:32 +0200 Subject: [PATCH 103/381] remove variable that is set but never read to fix warning --- lib_enc/ivas_mdct_core_enc.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index edc9ea1e50..58034e349f 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -581,7 +581,6 @@ void ivas_mdct_core_whitening_enc( int16_t n, ch, nSubframes, L_subframe, L_subframeTCX, tcx_subframe_coded_lines; float A_q[CPE_CHANNELS][NB_DIV][M + 1]; int16_t sns_vq_indices[CPE_CHANNELS * NB_DIV * SNS_MSVQ_NSTAGES_TCX10]; - int16_t nbits_sns; int16_t sns_stereo_mode[NB_DIV]; int16_t idx; int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; @@ -908,7 +907,7 @@ void ivas_mdct_core_whitening_enc( if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) { - nbits_sns = quantize_sns( scf, scf_q, sts, sns_vq_indices, zero_side_flag, sns_stereo_mode ); + quantize_sns( scf, scf_q, sts, sns_vq_indices, zero_side_flag, sns_stereo_mode ); } else { @@ -1091,7 +1090,6 @@ void ivas_mdct_core_whitening_enc( *--------------------------------------------------------------------------------*/ if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) { - nbits_sns = 0; idx = 0; if ( sts[0]->core == sts[1]->core ) @@ -1102,7 +1100,6 @@ void ivas_mdct_core_whitening_enc( for ( n = 0; n < nSubframes; ++n ) { push_next_indice( hBstr, sns_stereo_mode[n], 1 ); - nbits_sns++; sts[0]->side_bits_frame_channel++; } @@ -1112,7 +1109,6 @@ void ivas_mdct_core_whitening_enc( if ( sns_stereo_mode[n] == SNS_STEREO_MODE_MS ) { push_next_indice( hBstr, zero_side_flag[n], 1 ); - nbits_sns++; sts[0]->side_bits_frame_channel++; } } -- GitLab From 398f61004ed6a0ffd6826a489eaee362dcd5035d Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Wed, 31 May 2023 10:46:01 +0200 Subject: [PATCH 104/381] Removed obsolete todo comment --- lib_rend/ivas_objectRenderer_hrFilt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index 6a2bf00278..6463261ec4 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -79,7 +79,7 @@ ivas_error TDREND_REND_RenderSourceHRFilt( v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length ); v_add( RightOutputFrame, output_buf[1], output_buf[1], subframe_length ); - Src_p->InputFrame_p += subframe_length; /* Increment input pointer -- todo: should we remove this and input the current subframe instead? */ + Src_p->InputFrame_p += subframe_length; /* Increment input pointer */ return IVAS_ERR_OK; -- GitLab From 59d35498f326d40f52d834d4cd64a390b253f970 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 31 May 2023 12:36:06 +0300 Subject: [PATCH 105/381] Adds one more optimization into issue 511 by checking if second direction for MASA has very low direct-to-total ratio and skipping if it does. --- lib_rend/ivas_dirac_dec_binaural_functions.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 7a5a8d6dd1..650d5c2ef4 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -1000,6 +1000,16 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } else /* For second of the two simultaneous directions */ { +#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH + if ( ( ratio = hDirAC->energy_ratio2[dirac_read_idx][bin] ) < 0.001 ) + { + /* This touches only MASA path where second direction always has smaller ratio and + * for non-2dir it is zero. As the whole direction contribution is multiplied with + * the ratio, a very small ratio does not contribute any energy to output. Thus, + * it is better to save complexity. */ + continue; + } +#endif aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; ratio = hDirAC->energy_ratio2[dirac_read_idx][bin]; -- GitLab From f642891df75e6b0acca7b67776391e084d7267d4 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 31 May 2023 11:53:37 +0200 Subject: [PATCH 106/381] reintroduce code lost during merging --- lib_dec/ivas_sba_dec.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index f07ae40d90..478749ddc0 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -64,6 +64,12 @@ void ivas_sba_set_cna_cng_flag( #else if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 ) #endif + { + /* skip as done in init function */ + /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */ + /* st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 0; */ + } + else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) ) { st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; -- GitLab From 03baeb88bc8d7f5efc112367568e0d2119f6e05b Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 31 May 2023 12:04:42 +0200 Subject: [PATCH 107/381] address MC binaural renderer allocation related comment --- lib_rend/lib_rend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index a96715277f..dea8b48d75 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1812,7 +1812,7 @@ static ivas_error initMcBinauralRendering( outSampleRate = *inputMc->base.ctx.pOutSampleRate; - /* TODO tmu : needs review allocate both renderers; needed if headrotation is toggled so the renderer can be switched */ + /* Needs optimization, see issue 513 */ // bool initTDRend; // initTDRend = false; // if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) -- GitLab From dc7e1a3a51ae4d5267ad37fa762e42b393745c3d Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 31 May 2023 12:20:07 +0200 Subject: [PATCH 108/381] remove comments that are outdated or handled in tickets --- lib_com/stl.h | 2 +- lib_dec/ivas_dec.c | 4 ++-- lib_dec/ivas_ism_dtx_dec.c | 1 - lib_dec/ivas_ism_metadata_dec.c | 1 - lib_dec/ivas_jbm_dec.c | 6 +++--- lib_dec/ivas_pca_dec.c | 2 -- lib_dec/ivas_stat_dec.h | 2 +- lib_enc/evs_enc.c | 3 +-- lib_enc/ivas_enc.c | 2 +- lib_enc/lib_enc.c | 1 - 10 files changed, 9 insertions(+), 15 deletions(-) diff --git a/lib_com/stl.h b/lib_com/stl.h index 234aec9e16..c9ca422806 100644 --- a/lib_com/stl.h +++ b/lib_com/stl.h @@ -57,7 +57,7 @@ #ifndef _STL_H #define _STL_H -#include "options.h" /* TODO: TEMPORARY during BASOP development - to be removed */ +#include "options.h" /* note: needed until BASOP_NOGLOB is accepted */ #include "typedef.h" #include "basop32.h" #include "move.h" diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 59856cfb8e..82f03fdb3b 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -57,8 +57,8 @@ ivas_error ivas_dec( ) { int16_t n, output_frame, nchan_out; - Decoder_State *st; /* used for bitstream handling */ - float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ + Decoder_State *st; /* used for bitstream handling */ + float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ int16_t nchan_remapped; float output_lfe_ch[L_FRAME48k]; int16_t nb_bits_metadata[MAX_SCE]; diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index 6dd301f161..054603a15e 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -80,7 +80,6 @@ ivas_error ivas_ism_dtx_dec( if ( nchan_ism != nchan_ism_prev ) { - /* IVAS_fmToDo: more work needed when the number of transported objects is not constant */ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index e269d1e604..a39c496ab6 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -219,7 +219,6 @@ ivas_error ivas_ism_metadata_dec( if ( *nchan_transport != nchan_transport_prev ) { - /* IVAS_fmToDo: more work needed when the number of transported objects is not constant */ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 987c55f221..04ae490414 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -69,8 +69,8 @@ ivas_error ivas_jbm_dec_tc( ) { int16_t n, output_frame, nchan_out; - Decoder_State *st; /* used for bitstream handling */ - float output[MAX_TRANSPORT_CHANNELS][L_FRAME48k]; /* 'float' buffer for transport channels, MAX_TRANSPORT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ + Decoder_State *st; /* used for bitstream handling */ + float output[MAX_TRANSPORT_CHANNELS][L_FRAME48k]; /* 'float' buffer for transport channels, MAX_TRANSPORT_CHANNELS channels */ int16_t nchan_remapped, hodirac_flag; float output_lfe_ch[L_FRAME48k]; int16_t nb_bits_metadata[MAX_SCE]; @@ -641,7 +641,7 @@ ivas_error ivas_jbm_dec_render( { int16_t n, nchan_out; int16_t nchan_transport; - float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ + float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ int16_t nchan_remapped; int32_t output_Fs; AUDIO_CONFIG output_config; diff --git a/lib_dec/ivas_pca_dec.c b/lib_dec/ivas_pca_dec.c index a64e72615c..e73b3aa1d6 100644 --- a/lib_dec/ivas_pca_dec.c +++ b/lib_dec/ivas_pca_dec.c @@ -240,8 +240,6 @@ void ivas_pca_dec( /* set PCA by-pass mode in current frame and interpolate transform as previous frame used PCA */ pca_dec_reset_dquat( ql, qr ); - // todo - rather call PCA resets in the first PCA frame - if ( ( last_ivas_total_brate != PCA_BRATE ) || ( last_ivas_total_brate == PCA_BRATE && hPCA->prev_pca_bypass > 1 ) ) { pca_dec_reset_mem_eigvec( hPCA ); diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 7c6a452fcd..cd565f3eae 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1285,7 +1285,7 @@ typedef struct Decoder_Struct int16_t ini_active_frame; /* initialization active frames counter */ int16_t bfi; /* FEC - bad frame indicator */ - int16_t BER_detect; /* BER detect flag */ /* IVAS_fmToDo: eventually replace hCoreCoder->BER_detect by a pointer to ease the updating of this main parameter */ + int16_t BER_detect; /* BER detect flag */ uint16_t *bit_stream; /* Pointer to bitstream buffer */ int16_t writeFECoffset; /* parameter for debugging JBM stuff */ diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c index c45bb444f3..8a0a92c76a 100644 --- a/lib_enc/evs_enc.c +++ b/lib_enc/evs_enc.c @@ -264,8 +264,7 @@ ivas_error evs_enc( core_switching_post_enc( st, old_inp_12k8, old_inp_16k, A ); -#if !defined( FIX_I4_OL_PITCH ) - /* ToDo: this is a hack to keep bitexactness wrt. EVS but the logic is wrong */ +#ifndef FIX_I4_OL_PITCH if ( st->core == HQ_CORE ) { mvs2s( pitch_orig, st->pitch, 3 ); /* original open-loop pitch values might be altered in core_acelp_tcx20_switching() */ diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 64ed5c9c02..89a97ea0b0 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -62,7 +62,7 @@ ivas_error ivas_enc( BSTR_ENC_HANDLE hMetaData; Encoder_State *st; /* used for bitstream handling */ int16_t nb_bits_metadata[MAX_SCE]; - float data_f[MAX_INPUT_CHANNELS][L_FRAME48k]; /* IVAS_fmToDo: buffer can be allocated dynamically based on the number of analysed channels */ + float data_f[MAX_INPUT_CHANNELS][L_FRAME48k]; int32_t ivas_total_brate; ivas_error error; error = IVAS_ERR_OK; diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 4f0eefeb51..37c3e57ab5 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1296,7 +1296,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( * Main function to encode one frame to a compact bitstream (bytestream) *---------------------------------------------------------------------*/ -/* IVAS_fmToDo: Currently unused and untested */ ivas_error IVAS_ENC_EncodeFrameToCompact( IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ int16_t *inputBuffer, /* i : PCM input */ -- GitLab From 68dc3a8237c540c26d440a829ee17112e3166da3 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 31 May 2023 13:21:04 +0300 Subject: [PATCH 109/381] Remove duplicate assignment --- lib_rend/ivas_dirac_dec_binaural_functions.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 650d5c2ef4..a561f2ecd0 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -1012,7 +1012,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric #endif aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; +#ifndef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH ratio = hDirAC->energy_ratio2[dirac_read_idx][bin]; +#endif spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin]; } diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ -- GitLab From 1050d2a911f85f7dcfbf7364cfdd13fef5f8cb54 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 31 May 2023 12:21:39 +0200 Subject: [PATCH 110/381] remove comments related to existing issue #194 --- lib_rend/lib_rend.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index dea8b48d75..a85e4be3f1 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4871,7 +4871,6 @@ static ivas_error renderMcToBinaural( accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); - /* TODO tmu : needs delay compensation */ if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) { return error; @@ -4955,7 +4954,6 @@ static ivas_error renderMcToBinauralRoom( accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); - /* TODO tmu : needs delay compensation */ if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) { return error; @@ -5042,7 +5040,6 @@ static ivas_error renderMcCustomLsToBinauralRoom( accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); - /* TODO tmu : needs delay compensation */ if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) { return error; -- GitLab From f316ee0405278d11e0d7017ffe8b5fc947fb4b46 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 31 May 2023 12:23:03 +0200 Subject: [PATCH 111/381] remove comment related to existing issue #314 --- lib_rend/lib_rend.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index be52e7a7f1..33cbd78f56 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -145,7 +145,6 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for renderer output */ ); -/* ToDo: Support for custom HRTFs will be added in the future. */ /* Note: this affects output delay */ ivas_error IVAS_REND_SetCustomHrtf( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -- GitLab From 80849a0ca6b3f0c0eb04653a1d8f57a37a690d2b Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Wed, 31 May 2023 12:34:41 +0200 Subject: [PATCH 112/381] remove TODO comment that does not need to be addressed --- lib_dec/core_switching_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index 552f0ff988..e70b1d59d7 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -374,7 +374,7 @@ ivas_error core_switching_pre_dec( st->gc_threshold = 0.0f; set_f( st->dispMem, 0, 8 ); - st->last_coder_type = GENERIC; /* TODO - fcs : this might be superfluous */ + st->last_coder_type = GENERIC; fer_energy( output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 ); st->lp_gainp = 0.0f; -- GitLab From 9f85f1e1562511a54a1b2245f6ddc42b8988b176 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 31 May 2023 13:22:10 +0200 Subject: [PATCH 113/381] remove redundant comment for Crend refactoring --- lib_rend/ivas_crend.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 76af4a17c8..8a013bc715 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1090,7 +1090,6 @@ ivas_error ivas_rend_openCrend( HRTFS_CREND_HANDLE hSetOfHRTF, const int32_t output_Fs ) { - /* TODO tmu : Based on ivas_crend_open() - could be harmonized / refactored */ int16_t i, subframe_length; int16_t max_total_ir_len; HRTFS_HANDLE hHrtf; -- GitLab From dc11428561aaff2da47c9d86be32911ae003c890 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 31 May 2023 13:26:48 +0200 Subject: [PATCH 114/381] [cleanup] remove some function prototypes which no longer have definitions and update comments to reflect the updated function names --- .gitignore | 4 ---- lib_rend/ivas_crend.c | 4 ++-- lib_rend/ivas_prot_rend.h | 18 ------------------ 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 52512506d7..b2a82f06bb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ IVAS_cod IVAS_dec IVAS_rend -IVAS_crend_unit_test obj/ *.a *.o @@ -17,7 +16,6 @@ build*/**/* IVAS_cod.exe IVAS_dec.exe IVAS_rend.exe -IVAS_crend_unit_test.exe *.user .vs/ Debug_*/ @@ -26,8 +24,6 @@ Release_*/ *.pdb # Unittests -scripts/ivas_pytests/tests/unit_tests/crend/IVAS_crend_unit_test -scripts/ivas_pytests/tests/unit_tests/crend/IVAS_crend_unit_test.exe scripts/ivas_pytests/tests/unit_tests/crend/Debug_*/ scripts/ivas_pytests/tests/unit_tests/crend/Release_*/ diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 76af4a17c8..77d8097a5f 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1202,7 +1202,7 @@ ivas_error ivas_rend_openCrend( /*------------------------------------------------------------------------- - * ivas_crend_close() + * ivas_rend_closeCrend() * * Deallocate Crend renderer handle *------------------------------------------------------------------------*/ @@ -1284,7 +1284,7 @@ void ivas_rend_closeCrend( /*-----------------------------------------------------------------------------------------* - * Function ivas_crend_convolver() + * Function ivas_rend_crendConvolver() * * Convolver block *-----------------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index d87324cca3..ac9e765abe 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -563,24 +563,6 @@ ivas_error ivas_rend_crendProcessSubframe( ); #endif - -ivas_error ivas_crend_init_from_rom( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_crend_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_crend_close( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_crend_process( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float output[][L_FRAME48k] /* i/o: input/output audio channels */ -); - /*----------------------------------------------------------------------------------* * Reverberator *----------------------------------------------------------------------------------*/ -- GitLab From ccf5d2e67bbf8cfdc8c4468a00de99e070c56f64 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 31 May 2023 13:33:47 +0200 Subject: [PATCH 115/381] change a TODO to a note about multiple LFE support --- lib_dec/ivas_binRenderer_internal.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 33be8bf7db..d4bd43f544 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -151,14 +151,15 @@ static ivas_error ivas_binRenderer_convModuleOpen( if ( !isLoudspeaker ) { #ifdef UPDATE_SBA_FILTER - hBinRenderer->nInChannels = audioCfg2channels( input_config ); // TODO maybe an audioCfg2channels_woLFE() function? Works as long as only 1 LFE is present + hBinRenderer->nInChannels = audioCfg2channels( input_config ); #else hBinRenderer->nInChannels = 16; #endif } else { - hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker ); // TODO maybe an audioCfg2channels_woLFE() function? Works as long as only 1 LFE is present + /* Note: needs to be revisited if multiple LFE support is required */ + hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker ); } if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && hRenderConfig->roomAcoustics.use_brir ) -- GitLab From 6265f1126ed6ba5899b6f72bc246d462ef42d9ce Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 31 May 2023 13:26:48 +0200 Subject: [PATCH 116/381] [cleanup] remove some function prototypes which no longer have definitions and update comments to reflect the updated function names --- .gitignore | 8 -------- lib_rend/ivas_crend.c | 4 ++-- lib_rend/ivas_prot_rend.h | 18 ------------------ 3 files changed, 2 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 52512506d7..a2f6a6b95f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ IVAS_cod IVAS_dec IVAS_rend -IVAS_crend_unit_test obj/ *.a *.o @@ -17,7 +16,6 @@ build*/**/* IVAS_cod.exe IVAS_dec.exe IVAS_rend.exe -IVAS_crend_unit_test.exe *.user .vs/ Debug_*/ @@ -25,12 +23,6 @@ Release_*/ *.obj *.pdb -# Unittests -scripts/ivas_pytests/tests/unit_tests/crend/IVAS_crend_unit_test -scripts/ivas_pytests/tests/unit_tests/crend/IVAS_crend_unit_test.exe -scripts/ivas_pytests/tests/unit_tests/crend/Debug_*/ -scripts/ivas_pytests/tests/unit_tests/crend/Release_*/ - # Standalone TD object renderer scripts/td_object_renderer/object_renderer_standalone/renderer_standalone scripts/td_object_renderer/object_renderer_standalone/renderer_standalone.exe diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 76af4a17c8..77d8097a5f 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1202,7 +1202,7 @@ ivas_error ivas_rend_openCrend( /*------------------------------------------------------------------------- - * ivas_crend_close() + * ivas_rend_closeCrend() * * Deallocate Crend renderer handle *------------------------------------------------------------------------*/ @@ -1284,7 +1284,7 @@ void ivas_rend_closeCrend( /*-----------------------------------------------------------------------------------------* - * Function ivas_crend_convolver() + * Function ivas_rend_crendConvolver() * * Convolver block *-----------------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index d87324cca3..ac9e765abe 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -563,24 +563,6 @@ ivas_error ivas_rend_crendProcessSubframe( ); #endif - -ivas_error ivas_crend_init_from_rom( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_crend_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_crend_close( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -); - -ivas_error ivas_crend_process( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float output[][L_FRAME48k] /* i/o: input/output audio channels */ -); - /*----------------------------------------------------------------------------------* * Reverberator *----------------------------------------------------------------------------------*/ -- GitLab From 2702bcb66cfa5bf9b55bba20086cef0e818e2317 Mon Sep 17 00:00:00 2001 From: rhb Date: Wed, 31 May 2023 13:42:58 +0200 Subject: [PATCH 117/381] fix more problems with calculations on uninitialized values --- lib_enc/ivas_mct_core_enc.c | 24 ++++++++++++++---------- lib_enc/ivas_mct_enc_mct.c | 3 +++ lib_enc/ivas_stereo_mdct_core_enc.c | 25 +++++++++++++++++++------ lib_enc/ivas_stereo_mdct_stereo_enc.c | 0 4 files changed, 36 insertions(+), 16 deletions(-) mode change 100644 => 100755 lib_enc/ivas_mct_enc_mct.c mode change 100644 => 100755 lib_enc/ivas_stereo_mdct_core_enc.c mode change 100644 => 100755 lib_enc/ivas_stereo_mdct_stereo_enc.c diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index 48a7abc42f..40153a3c69 100755 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -334,8 +334,7 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) { - if ( - sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } @@ -359,16 +358,21 @@ void ivas_mct_core_enc( } else { - /* power spectrum: MDCT^2 + MDST^2 */ - powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; - - for ( i = 1; i < L_subframeTCX - 1; i++ ) +#ifdef FIX_483b + if ( hMCT->currBlockDataCnt > 0 ) +#endif { - mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ - powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; - } + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; + + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } - powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; + powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; + } /* power spectrum: MDCT^2 + MDST^2 */ powerSpec[ch][n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][0] * sts[ch]->hTcxEnc->spectrum[n][0]; diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c old mode 100644 new mode 100755 index 228f48b305..50982e2e52 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -700,6 +700,9 @@ void apply_MCT_enc( { v_multc( sts[ch]->hTcxEnc->spectrum[k], qratio, sts[ch]->hTcxEnc->spectrum[k], L_subframeTCX ); v_multc( mdst_spectrum[ch][k], qratio, mdst_spectrum[ch][k], L_subframeTCX ); +#ifdef FIX_483b + set_zero( inv_spectrum[ch][k], L_subframeTCX ); +#endif } hMCT->mc_global_ild[ch] = 0; } diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c old mode 100644 new mode 100755 index 03fcad485a..c8e3dcfcd4 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -223,6 +223,10 @@ void stereo_mdct_core_enc( inv_spectrum[ch][1] = quantized_spectrum[ch][1]; mdst_spectrum[ch][0] = mdst_spectrum_long[ch]; mdst_spectrum[ch][1] = mdst_spectrum_long[ch] + N_TCX10_MAX; +#ifdef FIX_483b + sts[ch]->hTcxEnc->tns_ms_flag[0] = 0; + sts[ch]->hTcxEnc->tns_ms_flag[1] = 0; +#endif } @@ -275,7 +279,11 @@ void stereo_mdct_core_enc( for ( n = 0; n < nSubframes; n++ ) { +#ifdef FIX_483b + if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) +#else if ( !sts[ch]->hTcxEnc->fUseTns[n] ) +#endif { /* power spectrum: MDCT^2 + MDST^2 */ for ( i = 0; i < L_subframeTCX; i++ ) @@ -286,14 +294,19 @@ void stereo_mdct_core_enc( } else { - /* power spectrum: MDCT^2 + MDST^2 */ - powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; - for ( i = 1; i < L_subframeTCX - 1; i++ ) +#ifdef FIX_483b + if ( hStereoMdct->mdct_stereo_mode[n] != SMDCT_DUAL_MONO ) +#endif { - float mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ - powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + float mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } + powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; } - powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; /* power spectrum: MDCT^2 + MDST^2 */ powerSpec[ch][n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][0] * sts[ch]->hTcxEnc->spectrum[n][0]; diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c old mode 100644 new mode 100755 -- GitLab From b130f851abca50d3fbeba8bb1f958e32a64ec4cd Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Wed, 31 May 2023 13:54:01 +0200 Subject: [PATCH 118/381] remove comment as no action will be taken for it --- lib_dec/ivas_stereo_switching_dec.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 88d82ac17b..013cc24660 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -1545,7 +1545,6 @@ void stereo_switching_dec( mvr2r( sts[0]->hHQ_core->old_out, sts[1]->hHQ_core->old_out, L_FRAME48k ); mvr2r( sts[0]->delay_buf_out, sts[1]->delay_buf_out, HQ_DELTA_MAX * HQ_DELAY_COMP ); mvr2r( sts[0]->hTcxDec->old_syn_Overl, sts[1]->hTcxDec->old_syn_Overl, 256 ); - /* Todo: apply panning to buffers instead of simply using dmx in left and right channel */ } } else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_MDCT ) -- GitLab From 3b377404722d29ba5a6d61c97d51ee7c59efa59b Mon Sep 17 00:00:00 2001 From: Jonas Sv Date: Wed, 31 May 2023 15:12:13 +0200 Subject: [PATCH 119/381] removed irrelevant PVQ getK() comments --- lib_com/rom_com.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index e4b8ec9db9..800362b576 100755 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -15684,11 +15684,7 @@ const float finegain_4[16] = {-1.3234321f, -1.1164439f, -0.9153915f, -0.7248241f const float finegain_5[32] = {-1.3099370f, -1.1532731f, -0.9939113f, -0.8627403f, -0.7693628f, -0.6901322f, -0.6188556f, -0.5438313f, -0.4899869f, -0.4145289f, -0.3440915f, -0.2936875f, -0.2241453f, -0.1636186f, -0.1052746f, -0.0292431f, 0.0273763f, 0.0848355f, 0.1443042f, 0.2095194f, 0.2794882f, 0.3366661f, 0.4131591f, 0.4740591f, 0.5545165f, 0.6196313f, 0.6719442f, 0.7650533f, 0.9012053f, 1.0432675f, 1.2264170f, 1.5085750f}; const float * const finegain[5] = { finegain_1, finegain_2, finegain_3, finegain_4, finegain_5 }; -/* getk(16,8)+ maxqKIind=40 --> KMAX=127 needs support , 32bit- saturates at dim=6 - getK(21,9)+ maxqKInd=64 --> KMAX=512, needs support , 32bit saturates at dim=5 - getK(TBD,TBD)+ maxqKInd=TBD --> KMAX=1024, needs support , 32bit saturates at dim~=4 - getK(TBD,TBD)+ maxqKInd=TBD --> KMAX=32767, needs support, 32bit saturates at dim =3 -*/ + const uint8_t hBitsMinus1_N01[2] = {1, 7}; const uint8_t hBitsMinus1_N02[65]= -- GitLab From 211a4e298d7aae8e997606c32b251d74da30a604 Mon Sep 17 00:00:00 2001 From: malenov Date: Wed, 31 May 2023 15:17:37 +0200 Subject: [PATCH 120/381] remove obsolete comments that were inserted when debugging the SWB_TBE@1k75 --- lib_dec/swb_tbe_dec.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 7ca3b64990..e4f211b2aa 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -1863,19 +1863,16 @@ static void dequantizeSHBparams( lsf_q[LATTICE_DIM + 1] = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * Idx_pred + LATTICE_DIM + 1], LATTICE_DIM ); } - /* !!! TODO: read empty bits - should be removed */ if ( nbits < NUM_BITS_SHB_MSLVQ ) { Idx_pred = get_next_indice( st, NUM_BITS_SHB_MSLVQ - nbits ); } - /* !!! end empty bits */ v_add( SHB_LSF_mean, lsf_q, lsf_q, LPC_SHB_ORDER ); v_sort( lsf_q, 0, LPC_SHB_ORDER - 1 ); } else { - /* !!!! this purposely reverts the inclusion of extl_brate == SWB_TBE_1k75 into the logic - remove this comment when this macro is deleted !!!!! */ if ( extl_brate == SWB_TBE_1k6 || extl_brate == FB_TBE_1k8 || extl_brate == SWB_TBE_2k8 || extl_brate == FB_TBE_3k0 ) { for ( i = 0; i < NUM_Q_LSF; i++ ) -- GitLab From 1f28fbecd46ecf989bf7ab2d69ebefa352789e77 Mon Sep 17 00:00:00 2001 From: malenov Date: Wed, 31 May 2023 15:24:10 +0200 Subject: [PATCH 121/381] remove obsolete comment - the deallocation of all PPP structures is properly done at the end of ppp_voiced_encoder() --- lib_enc/voiced_enc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_enc/voiced_enc.c b/lib_enc/voiced_enc.c index b32692b983..18a3305902 100644 --- a/lib_enc/voiced_enc.c +++ b/lib_enc/voiced_enc.c @@ -498,7 +498,6 @@ ivas_error ppp_voiced_encoder( error = IVAS_ERR_OK; - /* TODO: deallocation missing */ if ( ( error = DTFS_new( &CURRP_NQ ) ) != IVAS_ERR_OK ) { IVAS_ERROR( error, "Error creating DTFS structure" ); -- GitLab From 42507cb244f8af9b534ab059d86d70c73b892040 Mon Sep 17 00:00:00 2001 From: Auto Commit Date: Wed, 31 May 2023 09:38:47 -0400 Subject: [PATCH 122/381] remove obselete comment --- lib_dec/acelp_core_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index 0904e75116..187f82a0cd 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -1079,7 +1079,7 @@ ivas_error acelp_core_dec( * Formant post-filter *-----------------------------------------------------------------*/ - if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) /* TODO: TBV for TD stereo */ + if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) { mvr2r( syn, temp_buf + L_SYN_MEM, L_FRAME16k ); -- GitLab From c6928e948b5827557de38b827a9101524b2fd3be Mon Sep 17 00:00:00 2001 From: Auto Commit Date: Wed, 31 May 2023 09:40:54 -0400 Subject: [PATCH 123/381] remove obselete comment, for TD it is better the way it is now --- lib_dec/ivas_cpe_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 3717501c83..437f2b6f1a 100755 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -292,7 +292,7 @@ ivas_error ivas_cpe_dec( } else { - /* subtract metadata bitbudget */ /* IVAS_fmToDo: TBC whether it is not better to distribute the metadata bits equally between 2 channels */ + /* subtract metadata bitbudget */ sts[0]->bits_frame_channel -= nb_bits_metadata; } } -- GitLab From 3ff1a0b499db8b5fba0ad2586829721f19b6ca21 Mon Sep 17 00:00:00 2001 From: Auto Commit Date: Wed, 31 May 2023 09:49:32 -0400 Subject: [PATCH 124/381] remove obselete comment, keep the code as a safety if someone changes the behavior in a later stage --- lib_com/gs_bitallocation.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/gs_bitallocation.c b/lib_com/gs_bitallocation.c index 1e86ea04de..d099c2200c 100644 --- a/lib_com/gs_bitallocation.c +++ b/lib_com/gs_bitallocation.c @@ -616,7 +616,7 @@ void bands_and_bit_alloc( * Complete the bit allocation per frequency band for 16kHz high brate mode *--------------------------------------------------------------------------*/ - if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) /* TODO - TBV if applicable */ + if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) { for ( j = st_band; j < nb_bands; j++ ) { -- GitLab From 193049140c1211b6af79dad57c7255a552276abe Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 16:03:59 +0200 Subject: [PATCH 125/381] Updates reflecting the discussion on issue #196 --- apps/decoder.c | 35 ++-- apps/renderer.c | 30 ++-- lib_com/ivas_cnst.h | 9 +- lib_dec/ivas_dec.c | 2 +- lib_dec/ivas_init_dec.c | 12 +- lib_dec/ivas_ism_dec.c | 10 +- lib_dec/ivas_ism_param_dec.c | 13 +- lib_dec/ivas_jbm_dec.c | 4 +- lib_dec/ivas_mct_dec.c | 3 +- lib_dec/ivas_output_config.c | 18 +- lib_dec/ivas_spar_decoder.c | 3 +- lib_dec/lib_dec.c | 30 ++-- lib_dec/lib_dec.h | 9 +- lib_rend/ivas_crend.c | 7 +- lib_rend/ivas_output_init.c | 18 +- lib_rend/lib_rend.c | 137 +++++++-------- lib_rend/lib_rend.h | 9 +- scripts/config/self_test.prm | 164 +++++++++--------- .../rend_config_hospital_patientroom.cfg | 2 - scripts/testv/rend_config_recreation.cfg | 2 - scripts/testv/rend_config_renderer.cfg | 2 - 21 files changed, 239 insertions(+), 280 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 1a3fce9b1c..057bd4de40 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -263,8 +263,7 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && - arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -290,8 +289,7 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && - arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -315,8 +313,7 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && - arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -347,8 +344,7 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && - arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -392,8 +388,7 @@ int main( { /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && - arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) #endif @@ -575,8 +570,7 @@ int main( /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && - arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_BRIR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) #else if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL ) #endif @@ -872,19 +866,19 @@ static IVAS_DEC_AUDIO_CONFIG cmdline2config( output_config = IVAS_DEC_OUTPUT_HOA3; } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - else if ( strcmp( argv_to_upper, "BINAURAL_HRIR" ) == 0 ) + else if ( strcmp( argv_to_upper, "BINAURAL" ) == 0 ) { - output_config = IVAS_DEC_OUTPUT_BINAURAL_HRIR; + output_config = IVAS_DEC_OUTPUT_BINAURAL; } - else if ( strcmp( argv_to_upper, "BINAURAL_BRIR" ) == 0 ) + else if ( strcmp( argv_to_upper, "BINAURAL_ROOM_IR" ) == 0 ) { - output_config = IVAS_DEC_OUTPUT_BINAURAL_BRIR; + output_config = IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR; } - else if ( strcmp( argv_to_upper, "BINAURAL_HRIR_REVERB" ) == 0 ) + else if ( strcmp( argv_to_upper, "BINAURAL_ROOM_REVERB" ) == 0 ) { - output_config = IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB; + output_config = IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB; } -#endif +#else else if ( strcmp( argv_to_upper, "BINAURAL" ) == 0 ) { output_config = IVAS_DEC_OUTPUT_BINAURAL; @@ -893,6 +887,7 @@ static IVAS_DEC_AUDIO_CONFIG cmdline2config( { output_config = IVAS_DEC_OUTPUT_BINAURAL_ROOM; } +#endif else { output_config = IVAS_DEC_OUTPUT_LS_CUSTOM; @@ -1426,7 +1421,7 @@ static void usage_dec( void ) fprintf( stdout, "---------------------\n" ); fprintf( stdout, "OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA,\n" ); #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - fprintf( stdout, " HOA2, HOA3, BINAURAL_HRIR, BINAURAL_BRIR, BINAURAL_HRIR_REVERB, EXT\n" ); + fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, EXT\n" ); #else fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM, EXT\n" ); #endif diff --git a/apps/renderer.c b/apps/renderer.c index bb1001c722..1628ede45c 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -726,8 +726,7 @@ int main( /* sanity check */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) && - ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #else if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) #endif @@ -753,7 +752,7 @@ int main( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { renderConfig.room_acoustics.late_reverb_on = TRUE; renderConfig.room_acoustics.override = TRUE; @@ -1572,19 +1571,19 @@ static IVAS_REND_AudioConfig parseAudioConfig( } } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( strcmp( charBuf, "BINAURAL_HRIR" ) == 0 ) + if ( strcmp( charBuf, "BINAURAL" ) == 0 ) { - return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR; + return IVAS_REND_AUDIO_CONFIG_BINAURAL; } - if ( strcmp( charBuf, "BINAURAL_BRIR" ) == 0 ) + if ( strcmp( charBuf, "BINAURAL_ROOM_IR" ) == 0 ) { - return IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR; + return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR; } - if ( strcmp( charBuf, "BINAURAL_HRIR_REVERB" ) == 0 ) + if ( strcmp( charBuf, "BINAURAL_ROOM_REVERB" ) == 0 ) { - return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB; + return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB; } -#endif +#else if ( strcmp( charBuf, "BINAURAL_ROOM" ) == 0 ) { return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM; @@ -1593,7 +1592,7 @@ static IVAS_REND_AudioConfig parseAudioConfig( { return IVAS_REND_AUDIO_CONFIG_BINAURAL; } - +#endif return IVAS_REND_AUDIO_CONFIG_UNKNOWN; } @@ -2626,12 +2625,13 @@ static void printSupportedAudioConfigs() "ISMx (input only)", "MASAx (input only)", #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - "BINAURAL_HRIR (output only)", - "BINAURAL_BRIR (output only)", - "BINAURAL_HRIR_REVERB (output only)", -#endif + "BINAURAL (output only)", + "BINAURAL_ROOM_IR (output only)", + "BINAURAL_ROOM_REVERB (output only)", +#else "BINAURAL (output only)", "BINAURAL_ROOM (output only)", +#endif }; fprintf( stdout, "Supported audio formats:\n" ); diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 8a4f9136ab..4be90b4614 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -101,12 +101,13 @@ typedef enum AUDIO_CONFIG_HOA3, /* ambisonics, order 3 */ AUDIO_CONFIG_OBA, /* object based audio */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - AUDIO_CONFIG_BINAURAL_HRIR, /* binaural with HRIR */ - AUDIO_CONFIG_BINAURAL_BRIR, /* binaural with BRIR */ - AUDIO_CONFIG_BINAURAL_HRIR_REVERB, /* binaural with HRIR + reverb */ -#endif + AUDIO_CONFIG_BINAURAL, /* binaural with HRIR */ + AUDIO_CONFIG_BINAURAL_ROOM_IR, /* binaural with BRIR */ + AUDIO_CONFIG_BINAURAL_ROOM_REVERB, /* binaural with HRIR + reverb */ +#else AUDIO_CONFIG_BINAURAL, /* binaural with HRIR */ AUDIO_CONFIG_BINAURAL_ROOM, /* binaural with HRIR and BRIR */ +#endif AUDIO_CONFIG_ISM1, /* ISM1 */ AUDIO_CONFIG_ISM2, /* ISM2 */ AUDIO_CONFIG_ISM3, /* ISM3 */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 733564a98c..6b86829e4b 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -283,7 +283,7 @@ ivas_error ivas_dec( if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - AUDIO_CONFIG_BINAURAL_BRIR, + AUDIO_CONFIG_BINAURAL_ROOM_IR, #else AUDIO_CONFIG_BINAURAL_ROOM, #endif diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index c02eb3a4e9..84ec9ab85e 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -664,8 +664,7 @@ ivas_error ivas_init_decoder_front( *--------------------------------------------------------------------*/ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || - st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -677,8 +676,8 @@ ivas_error ivas_init_decoder_front( #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, - st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB, - st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) != IVAS_ERR_OK ) + st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR, + st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) #endif @@ -2248,8 +2247,7 @@ static ivas_error doSanityChecks_IVAS( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || - output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #else if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif @@ -2260,7 +2258,7 @@ static ivas_error doSanityChecks_IVAS( #ifdef DEBUGGING #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != AUDIO_CONFIG_BINAURAL && output_config != AUDIO_CONFIG_BINAURAL_HRIR ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) + if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != AUDIO_CONFIG_BINAURAL && output_config != AUDIO_CONFIG_BINAURAL ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) #else if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode != MC_MODE_MCT && st_ivas->mc_mode != MC_MODE_PARAMUPMIX ) ) ) ) #endif diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 91f1ee4130..b9bd1eedef 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -182,7 +182,7 @@ static ivas_error ivas_ism_bitrate_switching( #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || - st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) #else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -225,8 +225,7 @@ static ivas_error ivas_ism_bitrate_switching( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM || - st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -260,7 +259,7 @@ static ivas_error ivas_ism_bitrate_switching( #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || - st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) #else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -316,8 +315,7 @@ static ivas_error ivas_ism_bitrate_switching( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM || - st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 592b45b7b1..d04b9a9eb8 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -510,8 +510,7 @@ static ivas_error ivas_param_ism_rendering_init( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || - output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #else if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif @@ -673,8 +672,8 @@ ivas_error ivas_param_ism_dec_open( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO || - output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB || + output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) #else if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) #endif @@ -700,8 +699,7 @@ ivas_error ivas_param_ism_dec_open( hDirAC->spar_to_dirac_write_idx = 0; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || - output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif @@ -813,8 +811,7 @@ void ivas_param_ism_dec_close( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || - output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 987c55f221..ac560a2750 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -763,7 +763,7 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) { return error; @@ -1032,7 +1032,7 @@ ivas_error ivas_jbm_dec_flush_renderer( ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index da2c881b58..efbd4c335a 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1154,8 +1154,7 @@ static ivas_error ivas_mc_dec_reconfig( /* binaural renderers*/ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || - output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 25f9056e3b..171aa2421a 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -77,8 +77,7 @@ void ivas_renderer_select( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || - output_config == AUDIO_CONFIG_BINAURAL_HRIR || output_config == AUDIO_CONFIG_BINAURAL_BRIR || output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -87,12 +86,7 @@ void ivas_renderer_select( { if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL_HRIR ) -#else if ( output_config == AUDIO_CONFIG_BINAURAL ) -#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -104,7 +98,7 @@ void ivas_renderer_select( else /* ISM_MODE_DISC */ { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) + if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) #else if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) #endif @@ -143,7 +137,7 @@ void ivas_renderer_select( *internal_config = output_config; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + output_config == AUDIO_CONFIG_BINAURAL ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -160,7 +154,7 @@ void ivas_renderer_select( *internal_config = AUDIO_CONFIG_HOA3; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + output_config == AUDIO_CONFIG_BINAURAL ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -202,7 +196,7 @@ void ivas_renderer_select( *internal_config = output_config; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + output_config == AUDIO_CONFIG_BINAURAL ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -219,7 +213,7 @@ void ivas_renderer_select( *internal_config = transport_config; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL_HRIR ) + output_config == AUDIO_CONFIG_BINAURAL ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 2466928337..c48db9aea6 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1841,8 +1841,7 @@ void ivas_spar_dec_upmixer( else { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM || - st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_BRIR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) #else if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 8bb9032344..f83b36ff3c 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -384,19 +384,19 @@ static AUDIO_CONFIG mapOutputFormat( output_config = AUDIO_CONFIG_HOA3; } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_BRIR ) + else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL ) { - output_config = AUDIO_CONFIG_BINAURAL_BRIR; + output_config = AUDIO_CONFIG_BINAURAL; } - else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_HRIR ) + else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR ) { - output_config = AUDIO_CONFIG_BINAURAL_HRIR; + output_config = AUDIO_CONFIG_BINAURAL_ROOM_IR; } - else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB ) + else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) { - output_config = AUDIO_CONFIG_BINAURAL_HRIR_REVERB; + output_config = AUDIO_CONFIG_BINAURAL_ROOM_REVERB; } -#endif +#else else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL ) { output_config = AUDIO_CONFIG_BINAURAL; @@ -405,6 +405,7 @@ static AUDIO_CONFIG mapOutputFormat( { output_config = AUDIO_CONFIG_BINAURAL_ROOM; } +#endif else { output_config = AUDIO_CONFIG_INVALID; @@ -2629,19 +2630,19 @@ static ivas_error get_channel_config( strcpy( str, "Ambisonics: Third Order (HOA3)" ); } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - else if ( config == AUDIO_CONFIG_BINAURAL_HRIR ) + else if ( config == AUDIO_CONFIG_BINAURAL ) { - strcpy( str, "Binaural: HRIR" ); + strcpy( str, "Binaural: no room" ); } - else if ( config == AUDIO_CONFIG_BINAURAL_BRIR ) + else if ( config == AUDIO_CONFIG_BINAURAL_ROOM_IR ) { - strcpy( str, "Binaural: BRIR" ); + strcpy( str, "Binaural: room with impulse responses" ); } - else if ( config == AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + else if ( config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - strcpy( str, "Binaural: HRIR with reverb" ); + strcpy( str, "Binaural: room with reverb" ); } -#endif +#else else if ( config == AUDIO_CONFIG_BINAURAL ) { strcpy( str, "Binaural" ); @@ -2650,6 +2651,7 @@ static ivas_error get_channel_config( { strcpy( str, "Binaural_ROOM" ); } +#endif else if ( config == AUDIO_CONFIG_EXTERNAL ) { strcpy( str, "External renderer" ); diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index afd001d2e2..6f0e9c6fd1 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -55,12 +55,13 @@ typedef enum _IVAS_DEC_OUTPUT_CONFIG IVAS_DEC_OUTPUT_HOA2, IVAS_DEC_OUTPUT_HOA3, #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - IVAS_DEC_OUTPUT_BINAURAL_HRIR, - IVAS_DEC_OUTPUT_BINAURAL_BRIR, - IVAS_DEC_OUTPUT_BINAURAL_HRIR_REVERB, -#endif + IVAS_DEC_OUTPUT_BINAURAL, + IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR, + IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB, +#else IVAS_DEC_OUTPUT_BINAURAL, IVAS_DEC_OUTPUT_BINAURAL_ROOM, +#endif IVAS_DEC_OUTPUT_EXT, IVAS_DEC_OUTPUT_UNKNOWN = 0xffff } IVAS_DEC_AUDIO_CONFIG; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 91f079254f..1bc3fc450a 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -183,8 +183,7 @@ static ivas_error ivas_rend_initCrend( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM && - outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -203,9 +202,7 @@ static ivas_error ivas_rend_initCrend( /* set BRIR flag */ use_brir = false; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || - outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || - outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) ) + if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) ) #else if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) ) #endif diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index 9794cf93d5..32177b90a9 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -91,12 +91,13 @@ int16_t audioCfg2channels( nchan_out = 8; break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case AUDIO_CONFIG_BINAURAL_HRIR: - case AUDIO_CONFIG_BINAURAL_BRIR: - case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case AUDIO_CONFIG_BINAURAL: + case AUDIO_CONFIG_BINAURAL_ROOM_IR: + case AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case AUDIO_CONFIG_BINAURAL: case AUDIO_CONFIG_BINAURAL_ROOM: +#endif nchan_out = 2; break; case AUDIO_CONFIG_ISM1: @@ -222,12 +223,13 @@ void ivas_output_init( hOutSetup->is_planar_setup = 0; break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case AUDIO_CONFIG_BINAURAL_HRIR: - case AUDIO_CONFIG_BINAURAL_BRIR: - case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case AUDIO_CONFIG_BINAURAL: + case AUDIO_CONFIG_BINAURAL_ROOM_IR: + case AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case AUDIO_CONFIG_BINAURAL: case AUDIO_CONFIG_BINAURAL_ROOM: +#endif case AUDIO_CONFIG_ISM1: case AUDIO_CONFIG_ISM2: case AUDIO_CONFIG_ISM3: diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 4c407f8abe..916dde2d15 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -347,17 +347,18 @@ AUDIO_CONFIG getIvasAudioConfigFromRendAudioConfig( case IVAS_REND_AUDIO_CONFIG_OBJECT: return AUDIO_CONFIG_OBA; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: - return AUDIO_CONFIG_BINAURAL_HRIR; - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - return AUDIO_CONFIG_BINAURAL_BRIR; - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: - return AUDIO_CONFIG_BINAURAL_HRIR_REVERB; -#endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: + return AUDIO_CONFIG_BINAURAL; + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + return AUDIO_CONFIG_BINAURAL_ROOM_IR; + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + return AUDIO_CONFIG_BINAURAL_ROOM_REVERB; +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: return AUDIO_CONFIG_BINAURAL; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: return AUDIO_CONFIG_BINAURAL_ROOM; +#endif case IVAS_REND_AUDIO_CONFIG_MASA1: return AUDIO_CONFIG_MASA1; case IVAS_REND_AUDIO_CONFIG_MASA2: @@ -385,17 +386,18 @@ IVAS_REND_AudioConfig getRendAudioConfigFromIvasAudioConfig( case AUDIO_CONFIG_STEREO: return IVAS_REND_AUDIO_CONFIG_STEREO; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case AUDIO_CONFIG_BINAURAL_HRIR: - return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR; - case AUDIO_CONFIG_BINAURAL_BRIR: - return IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR; - case AUDIO_CONFIG_BINAURAL_HRIR_REVERB: - return IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB; -#endif + case AUDIO_CONFIG_BINAURAL: + return IVAS_REND_AUDIO_CONFIG_BINAURAL; + case AUDIO_CONFIG_BINAURAL_ROOM_IR: + return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR; + case AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB; +#else case AUDIO_CONFIG_BINAURAL: return IVAS_REND_AUDIO_CONFIG_BINAURAL; case AUDIO_CONFIG_BINAURAL_ROOM: return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM; +#endif case AUDIO_CONFIG_5_1: return IVAS_REND_AUDIO_CONFIG_5_1; case AUDIO_CONFIG_7_1: @@ -441,12 +443,13 @@ static ivas_error validateOutputAudioConfig( case IVAS_REND_AUDIO_CONFIG_HOA2: case IVAS_REND_AUDIO_CONFIG_HOA3: #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif return IVAS_ERR_OK; default: break; @@ -519,12 +522,13 @@ ivas_error getAudioConfigNumChannels( break; case IVAS_REND_AUDIO_CONFIG_STEREO: #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif case IVAS_REND_AUDIO_CONFIG_MASA2: *numChannels = 2; break; @@ -814,8 +818,7 @@ static ivas_error initEfap( int16_t numNonLfeChannels; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || - outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -1138,7 +1141,7 @@ static ivas_error setRendInputActiveIsm( error = IVAS_ERR_OK; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || - outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR ) + outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) #else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) #endif @@ -1149,8 +1152,7 @@ static ivas_error setRendInputActiveIsm( } } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || - outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -1789,16 +1791,14 @@ static ivas_error updateMcPanGains( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: break; /* Do nothing */ #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif /* Prepare rendering to intermediate format */ error = updateMcPanGainsForMcOut( inputMc, IVAS_REND_AUDIO_CONFIG_7_1_4 ); break; @@ -1865,7 +1865,7 @@ static ivas_error initMcBinauralRendering( // initTDRend = false; //#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG // if ( ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && - // ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR ) && ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) + // ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) //#else // if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) //#endif @@ -2005,8 +2005,7 @@ static ivas_error setRendInputActiveMc( inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || - outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -2167,9 +2166,6 @@ static ivas_error updateSbaPanGains( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = ivas_rend_openCrend( &inputSba->crendWrapper, getIvasAudioConfigFromRendAudioConfig( inConfig ), @@ -2179,10 +2175,11 @@ static ivas_error updateSbaPanGains( *rendCtx.pOutSampleRate ); break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif if ( ( error = initSbaPanGainsForMcOut( inputSba, IVAS_REND_AUDIO_CONFIG_7_1_4, NULL ) ) != IVAS_ERR_OK ) { return error; @@ -2444,12 +2441,7 @@ static ivas_error initMasaDummyDecForBinauralOut( decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL_HRIR ) -#else if ( output_config == AUDIO_CONFIG_BINAURAL ) -#endif { decDummy->renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -3330,8 +3322,7 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || - hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) + if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) #endif @@ -3817,9 +3808,7 @@ ivas_error IVAS_REND_InitConfig( return error; } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, - outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB, - outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR || outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) #endif @@ -4617,7 +4606,7 @@ static ivas_error renderIsmToBinauralRoom( #ifdef JBM_TSM_ON_TCS #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_BRIR, + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, @@ -4625,7 +4614,7 @@ static ivas_error renderIsmToBinauralRoom( #endif #else #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_BRIR, + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, @@ -4793,17 +4782,15 @@ static ivas_error renderInputIsm( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderIsmToBinaural( ismInput, outAudio ); break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif error = renderIsmToBinauralRoom( ismInput, outAudio ); break; default: @@ -5235,17 +5222,15 @@ static ivas_error renderInputMc( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderMcToBinaural( mcInput, outConfig, outAudio ); break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif if ( mcInput->base.inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { error = renderMcCustomLsToBinauralRoom( mcInput, outConfig, outAudio ); @@ -5522,17 +5507,15 @@ static ivas_error renderInputSba( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: -#endif + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: +#else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: +#endif error = renderSbaToBinauralRoom( sbaInput, outConfig, outAudio ); break; default: @@ -5714,18 +5697,16 @@ static ivas_error renderInputMasa( case IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL: switch ( outConfig ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR: -#endif case IVAS_REND_AUDIO_CONFIG_BINAURAL: renderMasaToBinaural( masaInput, outAudio ); break; /* ToDo */ //#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - // case IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR: - // case IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB: - //#endif + // case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + // case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + //#else // case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: + //#endif // renderMasaToBinauralRoom( masaInput, outConfig, outAudio ); // break; default: diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index c50868c7fb..2c93ef4d27 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -112,12 +112,13 @@ typedef enum IVAS_REND_AUDIO_CONFIG_OBJECT = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED << 8 | 0, +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 9, + IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, + IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, +#else IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, - IVAS_REND_AUDIO_CONFIG_BINAURAL_BRIR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 3, - IVAS_REND_AUDIO_CONFIG_BINAURAL_HRIR_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 4, #endif IVAS_REND_AUDIO_CONFIG_MASA1 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 0, diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index a8255cb583..9d593143f2 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -266,9 +266,9 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst -// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out +// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst // 3 ISM with metadata at 24.4 kbps, 48 kHz in, 48 kHz out, 7_1 out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 24400 48 testv/stv3ISM48s.wav bit @@ -310,37 +310,37 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out, random FEC at 5% +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out, random FEC at 5% ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit -../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_ROOM_IR 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst // 3 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, MONO out ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst -// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_ROOM out, random FEC at 5% +// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_ROOM_IR out, random FEC at 5% ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit -../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_ROOM_IR 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst // 2 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL out, random FEC at 5% ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out, head rotation, random FEC at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out, head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out +// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst // 2 ISM with metadata at 64 kbps, 48 kHz in, 32 kHz out, 5_1 out ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst -// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out +// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst // 2 ISM with metadata at 80 kbps, 48 kHz in, 48 kHz out, DTX on, stereo out ../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 80000 48 testv/stvST48c.wav bit @@ -480,9 +480,9 @@ ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit ../IVAS_dec -fec testv/FEC_6pct.bin BINAURAL 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_FEC6.tst -// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out +// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst // SBA at 32 kbps, 48kHz in, 48kHz out, MONO out, DTX ../IVAS_cod -dtx -sba 1 32000 48 testv/stvFOA48c.wav bit @@ -496,29 +496,29 @@ ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_stereo.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, reference vector tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst +../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, reference vector tracking in level mode +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst +../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst // SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit @@ -548,9 +548,9 @@ ../IVAS_cod -dtx -sba 1 64000 48 testv/stvFOA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL.tst -// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_ROOM out, DTX +// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, DTX ../IVAS_cod -dtx -sba 1 64000 48 testv/stvFOA48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL_ROOM.tst // SBA at 80 kbps, 32kHz in, 32kHz out, HOA3 out ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit @@ -572,13 +572,13 @@ ../IVAS_cod -sba 1 96000 48 testv/stvFOA48c.wav bit ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_SBA_96000_48-48_FOA.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst // SBA at 192 kbps, 48kHz in, 48kHz out, HOA2 out, random FEC at 5% ../IVAS_cod -sba 3 192000 48 testv/stv3OA48c.wav bit @@ -592,9 +592,9 @@ ../IVAS_cod -sba 1 160000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_160000_32-32_FOA.tst -// SBA at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, random FEC at 5% +// SBA at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, random FEC at 5% ../IVAS_cod -sba 1 160000 48 testv/stvFOA48c.wav bit -../IVAS_dec -fec 5 BINAURAL_ROOM 48 bit testv/stvFOA48c.wav_SBA_160000_48-48_BINAURAL_ROOM_FEC5.tst +../IVAS_dec -fec 5 BINAURAL_ROOM_IR 48 bit testv/stvFOA48c.wav_SBA_160000_48-48_BINAURAL_ROOM_FEC5.tst // SBA at 160 kbps, 48kHz in, 48kHz out, 5_1 out ../IVAS_cod -sba 1 160000 48 testv/stvFOA48c.wav bit @@ -608,9 +608,9 @@ ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_FOA.tst -// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out +// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit -../IVAS_dec BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst +../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst // SBA at 256 kbps, 48kHz in, 48kHz out, 7_1 out, random FEC at 5% ../IVAS_cod -sba 1 256000 48 testv/stvFOA48c.wav bit @@ -658,17 +658,17 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 16400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -fec 5 HOA3 48 bit testv/stv1MASA1TC48c.wav_16400_48-48_HOA3_FEC5.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, Headrotation ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst // MASA 1dir 1TC at 32 kbps, 48kHz in, 48kHz out, 7_1_4, random FEC at 5% ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 32000 48 testv/stv1MASA1TC48c.wav bit @@ -706,17 +706,17 @@ ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 24400 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv1MASA2TC48c.wav_24400_48-48_STEREO.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, Headrotation ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, Headrotation, Orientation tracking ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst // MASA 1dir 2TC at 48 kbps, 48kHz in, 48kHz out, 7_1_4 out, random FEC at 5% ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 48000 48 testv/stv1MASA2TC48c.wav bit @@ -758,13 +758,13 @@ ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 192000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -fec 5 5_1_4 48 bit testv/stv2MASA2TC48c.wav_192000_48-48_5_1_4_FEC5.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst // MASA 2dir 2TC at 512 kbps, 48kHz in, 48kHz out, 5_1 out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 512000 48 testv/stv2MASA2TC48c.wav bit @@ -824,9 +824,9 @@ ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst // Multi-channel 5_1 at 96 kbps, 48kHz in, 48kHz out, random FEC at 5% ../IVAS_cod -mc 5_1 96000 48 testv/stv51MC48c.wav bit @@ -844,21 +844,21 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_stereo_FEC5.tst -// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -mc 5_1 192000 48 testv/stv51MC48c.wav bit -../IVAS_dec BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst +../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, MONO out ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec MONO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_mono.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, head rotation +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, head rotation ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, head rotation, Orientation tracking +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, head rotation, Orientation tracking ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit @@ -924,37 +924,37 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_MC_custom_setup.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_ROOM_REVERB out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM_REVERB out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config hospital_patientroom +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config hospital_patientroom ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst +../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config recreation +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config recreation ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_recreation.cfg BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst +../IVAS_dec -render_config testv/rend_config_recreation.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst -// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config renderer ../IVAS_cod -mc 5_1_2 512000 48 testv/stv512MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config renderer ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config renderer ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst +../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst // Multi-channel 5_1 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, 7_1_4 out ../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv51MC48c.wav bit @@ -964,9 +964,9 @@ ../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 10 BINAURAL 48 bit testv/stv51MC48c.wav_sw_48-48_binaural_fec10.tst -// Multi-channel 5_1_2 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out +// Multi-channel 5_1_2 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM_IR out ../IVAS_cod -mc 5_1_2 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv512MC48c.wav bit -../IVAS_dec BINAURAL_ROOM 16 bit testv/stv512MC48c.wav_sw_48-16_Binaural_room.tst +../IVAS_dec BINAURAL_ROOM_IR 16 bit testv/stv512MC48c.wav_sw_48-16_Binaural_room.tst // Multi-channel 7_1_4 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, HOA3 out ../IVAS_cod -mc 7_1_4 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv714MC48c.wav bit @@ -977,9 +977,9 @@ ../IVAS_dec -FEC 5 STEREO 32 bit testv/stv714MC48c.wav_sw_48-32_stereo.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out (Model from file) +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM_IR out (Model from file) ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_ROOM 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_ROOM_IR 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst // Multi-channel 7_1_4 at 512 kbps, 48kHz in, 32kHz out, BINAURAL out (Model from file) ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit @@ -989,9 +989,9 @@ ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out (Model from file) +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out (Model from file) ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit -../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst +../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_IR 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst diff --git a/scripts/testv/rend_config_hospital_patientroom.cfg b/scripts/testv/rend_config_hospital_patientroom.cfg index b68ac921f9..8b35e102ea 100644 --- a/scripts/testv/rend_config_hospital_patientroom.cfg +++ b/scripts/testv/rend_config_hospital_patientroom.cfg @@ -1,6 +1,4 @@ [roomAcoustics] -reverb = true; -brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, diff --git a/scripts/testv/rend_config_recreation.cfg b/scripts/testv/rend_config_recreation.cfg index afdc0f858b..85ca1ca76e 100644 --- a/scripts/testv/rend_config_recreation.cfg +++ b/scripts/testv/rend_config_recreation.cfg @@ -1,6 +1,4 @@ [roomAcoustics] -reverb = true; -brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, diff --git a/scripts/testv/rend_config_renderer.cfg b/scripts/testv/rend_config_renderer.cfg index 8aa9dec1b2..ef2257ab6c 100644 --- a/scripts/testv/rend_config_renderer.cfg +++ b/scripts/testv/rend_config_renderer.cfg @@ -1,6 +1,4 @@ [roomAcoustics] -reverb = true; # Reverb switch, in case BRIR is undefined or false, reverb flag is inherited from the room flag -brir = false; nBands = 31; fc = [20.0, 25.0, 31.5, 40.0, -- GitLab From 22f8f1f91a78d8772d08ba960b3bf410ee0930af Mon Sep 17 00:00:00 2001 From: Auto Commit Date: Wed, 31 May 2023 10:10:07 -0400 Subject: [PATCH 126/381] fix clang --- lib_dec/acelp_core_dec.c | 2 +- lib_dec/ivas_cpe_dec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index 187f82a0cd..eb2e84f598 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -1079,7 +1079,7 @@ ivas_error acelp_core_dec( * Formant post-filter *-----------------------------------------------------------------*/ - if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) + if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) { mvr2r( syn, temp_buf + L_SYN_MEM, L_FRAME16k ); diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 437f2b6f1a..6511bb1181 100755 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -292,7 +292,7 @@ ivas_error ivas_cpe_dec( } else { - /* subtract metadata bitbudget */ + /* subtract metadata bitbudget */ sts[0]->bits_frame_channel -= nb_bits_metadata; } } -- GitLab From 03ac848501db8ef8ffccdd0ade9b11ed6ce8bfc9 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 16:52:21 +0200 Subject: [PATCH 127/381] Updates reflecting the discussion on issue #196 --- ci/smoke_test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 1e758b6263..9f0aaef7a9 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -92,11 +92,11 @@ modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM' | grep -v I echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" ./scripts/runIvasCodec.py -m $modes_with_no_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile | tee smoke_test_output_jbm_noEXT.txt echo "\n======================= 5. JBM, modes with EXT =======================\n\n" -./scripts/runIvasCodec.py -m $modes_with_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt +./scripts/runIvasCodec.py -m $modes_with_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM_IR mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt # run all modes with binaural output using external files modes_with_bin_out="SBA PlanarSBA MASA MC ISM1 ISM2 ISM3 ISM4" -bin_out_modes="BINAURAL BINAURAL_ROOM" +bin_out_modes="BINAURAL BINAURAL_ROOM_IR" echo "\n======================= 6. binaural out with HRTF files - WB =======================\n\n" wb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _wb_) -- GitLab From 305f1331637e53a6fb208f66f7647cb29987819b Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 17:05:39 +0200 Subject: [PATCH 128/381] Updates reflecting the discussion on issue #196 --- scripts/reverb/generate_scene_metadata.py | 399 ++++++++++++++++++++++ tests/test_param_file.py | 2 +- 2 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 scripts/reverb/generate_scene_metadata.py diff --git a/scripts/reverb/generate_scene_metadata.py b/scripts/reverb/generate_scene_metadata.py new file mode 100644 index 0000000000..5e1df7334b --- /dev/null +++ b/scripts/reverb/generate_scene_metadata.py @@ -0,0 +1,399 @@ +#!/usr/bin/env python3 + +""" + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" + +# +# Generate binary render configuration output files for testing purposes +# The binary code generation is based on the MPEG-I audio standard +# which defines functions to decode raw bitstream into internal parameters +# + + +from bitarray import bitarray, test as bitarray_test +import math +from enum import Enum +import numpy as np + + +# Set to True to print values suitable for inclusion into .cfg configuration files +print_cfg = False + +def get_id_code(id): + code = format(id % 128, '07b') + '0' + id //= 128 + while id > 0: + code = format(id % 128, '07b') + '1' + code + id = id // 128 + return code + + +def get_count_or_index_code(n): + # 0, 1, ... 63 + countOrIndexLoCodes = [ + '0111', '100', '01100', '01101', '01010', '01011', '01000', '01001', '001111', '001110', + '001101', '001100', '001011', '001010', '001001', '001000', '000111', '000110', '000101', '000100', + '000011', '000010', '000001', '000000', '111111', '111110', '111101', '111100', '111011', '111010', + '111001', '111000', '1101111', '1101110', '1101101', '1101100', '1101011', '1101010', '1101001', '1101000', + '1100111', '1100110', '1100101', '1100100', '1100011', '1100010', '1100001', '1100000', '1011111', '1011110', + '1011101', '1011100', '1011011', '1011010', '1011001', '1011000', '1010111', '1010110', '1010101', '1010100', + '1010011', '1010010', '1010001', '1010000'] + + # 1, 2, ... 15 + countOrIndexHiCode = [ + '001', '000', '110', '101', '100', '0111', '0101', '1111', '1110', '01101', + '01001', '01000', '011001', '0110001', '0110000'] + + assert 0 <= n < 16 * 64 + code = countOrIndexLoCodes[n % 64] + if n < 64: + code += '0' + else: + code += '1' + countOrIndexHiCode[n // 64 - 1] + return code + + +def get_duration_code(duration): + # 1, 2, ... 30 + secondsCode = [ + '0011', '0001', '0000', '1111', '1101', '1100', '1011', '1001', '1000', '01110', + '01101', '01100', '01011', '01001', '01000', '00101', '11101', '11100', '10101', '011111', + '011110', '010101', '001001', '001000', '101001', '0101001', '0101000', '1010001', '10100001', '10100000' ] + + # 0, 0.1, ... 1.0 + deciSecondsCode = [ + '110', '100', '101', '0110', '0111', '111', '0100', '0101', '0010', '0011', '000' ] + + # 0, 1, ..., 99 + millisecondsCode = [ + '1111010', '1111011', '1111000', '1111001', '1111110', '1111111', '1111100', '1111101', '1110010', '1110011', + '11001', '1110000', '1110001', '1110110', '1110111', '1110100', '1110101', '0101010', '0101011', '0101000', + '10010', '0101001', '0101110', '0101111', '0101100', '0101101', '0100010', '0100011', '0100000', '0100001', + '10011', '0100110', '0100111', '0100100', '0100101', '0111010', '0111011', '0111000', '0111001', '0111110', + '10000', '0111111', '0111100', '0111101', '0110010', '0110011', '0110000', '0110001', '0110110', '0110111', + '10001', '0110100', '0110101', '0001010', '0001011', '0001000', '0001001', '0001110', '0001111', '0001100', + '10110', '0001101', '0000010', '0000011', '0000000', '0000001', '0000110', '0000111', '0000100', '0000101', + '10111', '0011010', '0011011', '0011000', '0011001', '0011110', '0011111', '0011100', '0011101', '0010010', + '10100', '0010011', '0010000', '0010001', '0010110', '0010111', '0010100', '0010101', '1101010', '1101011', + '10101', '1101000', '1101001', '1101110', '1101111', '1101100', '1101101', '1100010', '1100011', '110000' ] + + # 10, 20, ... 990 + microsecondsCode = [ + '110111100', '10010', '110111101', '10011', '1101111110', '10000', '1101111111', '10001', '1101111100', '10110', + '1101111101', '10111', '110110010', '10100', '110110011', '10101', '110110000', '001010', '110110001', '001011', + '110110110', '001000', '110110111', '001001', '110110100', '001110', '110110101', '001111', '110011010', '001100', + '110011011', '001101', '110011000', '000010', '110011001', '000011', '110011110', '000000', '110011111', '000001', + '110011100', '000110', '110011101', '000111', '110010010', '000100', '110010011', '000101', '110010000', '011010', + '110010001', '011011', '110010110', '011000', '110010111', '011001', '110010100', '011110', '110010101', '011111', + '110101010', '011100', '110101011', '011101', '110101000', '010010', '110101001', '010011', '110101110', '010000', + '110101111', '010001', '110101100', '010110', '110101101', '010111', '110100010', '010100', '110100011', '010101', + '110100000', '111010', '110100001', '111011', '110100110', '111000', '110100111', '111001', '110100100', '111110', + '110100101', '111111', '110111010', '111100', '110111011', '111101', '110111000', '11000', '110111001' ] + + duration_dus = int(round(np.float32(duration) * np.float32(100000))) # [deca us] + if print_cfg: + print('duration: ', duration_dus) + + dus = duration_dus # [deca us] + s = dus // 100000 # 0, 1, ... 30 [s] + ms = (dus % 100000) // 100 # 0, 1, ... 999 [ms] + dus = (dus % 100) # 0, 1, ... 99 [deca us] + ds = ms // 100 # 0, 1, ... 9 [deci s] + ms = ms % 100 # 0, 1, ... 99 [ms] + if s >= 1 and ds == 0: + s -= 1 + ds = 10 # 0, 1, ... 10 [deci s] + + assert 0 <= s <= 30 + assert 0 <= ds <= 10 + assert 0 <= ms <= 99 + assert 0 <= dus <= 99 + assert duration_dus == s * 100000 + ds * 10000 + ms * 100 + dus + + code = deciSecondsCode[ds] + if ms > 0 or dus > 0: + code += '1' + millisecondsCode[ms] + if dus > 0: + code += '1' + microsecondsCode[dus - 1] + else: + code += '0' + else: + code += '0' + if s > 0: + # long range mode not implemented + code += '1' + secondsCode[s - 1] + else: + code += '0' + + return code + + +def get_frequency_code(f): + frequencyCode = { + 16 : '100011', 20 : '001110', 25 : '001111', 31.5 : '1001', 40 : '001100', + 50 : '001101', 63 : '0000', 80 : '011010', 100 : '011011', 125 : '0001', + 160 : '011000', 200 : '011001', 250 : '1110', 315 : '011110', 400 : '011111', + 500 : '1111', 630 : '011100', 800 : '011101', 1000 : '1100', 1250 : '010010', + 1600 : '010011', 2000 : '1101', 2500 : '010000', 3150 : '010001', 4000 : '1010', + 5000 : '010110', 6300 : '010111', 8000 : '1011', 10000: '010100', 12500: '010101', + 16000: '0010', 20000: '10000', 25000: '10001010', 31500: '10001011', 40000: '1000100', } + + assert 16 <= f <= 40000 + if f in frequencyCode.keys(): + if print_cfg: + print('frequency:', f) + return frequencyCode[f] + '0' + else: + # exact frequency not found, use frequency refinement to aproximate + # (largest relative deviation seen for range(16, 40000) was 0.006818) + # find frequencies enveloping f + f_low = 16 + f_high = 40000 + for key in frequencyCode.keys(): + if key < f: + f_low = max(f_low, key) + else: + f_high = min(f_high, key) + refinement = round(51 * math.log(f / f_low, 2)) - 1 + if refinement >= 16: + # choose next higer frequency + if print_cfg: + print('frequency:', list(frequencyCode)[f_high]) + return frequencyCode[f_high] + '0' + else: + if print_cfg: + print('frequency:', list(frequencyCode)[f_low], ', refined: ', f_low * 2 ** ((refinement + 1) / 51)) + return frequencyCode[f_low] + '1' + format(refinement, '04b') + + +def get_frequency_hop_code(index): + assert 0 <= index < 9 + return [ + '1100', # 2^(1/8) + '1101', # 2^(1/7) + '0010', # 2^(1/6) + '0011', # 2^(1/5) + '0000', # 2^(1/4) + '01', # 2^(1/3) + '0001', # 2^(1/2) + '10', # 2^1 + '111'][index] # 2^2 + + +def get_dsr_code(dsr): + # -150.0, -149.0, ... -10.0 + dsrCode = [ + '10001100', '10001101', '100011110', '100011111', '100011100', '100011101', '10000010', '10000011', '10000000', '10000001', + '10000110', '10000111', '10000100', '10000101', '011101010', '011101011', '011101000', '011101001', '011101110', '011101111', + '011101100', '011101101', '011100010', '011100011', '011100000', '011100001', '011100110', '011100111', '011100100', '011100101', + '011111010', '011111011', '011111000', '011111001', '011111110', '011111111', '011111100', '011111101', '011110010', '011110011', + '011110000', '011110001', '011110110', '011110111', '011110100', '011110101', '011001010', '011001011', '011001000', '011001001', + '011001110', '011001111', '011001100', '011001101', '011000010', '011000011', '011000000', '011000001', '011000110', '011000111', + '011000100', '011000101', '011011010', '011011011', '011011000', '011011001', '011011110', '011011111', '011011100', '011011101', + '010100', '010101', '100110', '100111', '100100', '100101', '111010', '111011', '111000', '111001', + '111110', '111111', '111100', '111101', '110010', '110011', '110000', '110001', '110110', '110111', + '110100', '110101', '001010', '001011', '001000', '001001', '001110', '001111', '001100', '001101', + '000010', '000011', '000000', '000001', '000110', '000111', '000100', '000101', '101010', '101011', + '101000', '101001', '101110', '101111', '101100', '101101', '010010', '010011', '010000', '010001', + '010110', '011010010', '011010011', '011010000', '011010001', '011010110', '011010111', '011010100', '011010101', '010111010', + '010111011', '010111000', '010111001', '010111110', '010111111', '010111100', '010111101', '10001010', '10001011', '10001000', + '10001001' ] + + d = math.log10(dsr) * 10 + d = round(d + 150) + assert 0 <= d <= 140 + if print_cfg: + print('dsr:', np.float32(np.power(np.float32(10), np.float32(d - 150) / np.float32(10)))) # C decoder uses float precision math + return dsrCode[d] + + +class fgdMethod(Enum): + Individual_Frequencies = '00' + Start_Hop_Amount = '01' + Default_Banding = '10' + + +# apply function to elements of list and concatenate the resulting strings +def concatenate(function, data): + return ''.join([function(d) for d in data]) + + +def test(): + # generate binary output which can be compared with the Matlab implementation output + string = '' + + # count or index encoding + string += concatenate(get_count_or_index_code, [n for n in range(0, 16 * 64)]) + + # duration encoding + string += concatenate(get_duration_code, [d / 1000 for d in range(0, 30 * 1000)]) + string += concatenate(get_duration_code, [d / 10000 for d in range(0, 30 * 1000)]) + string += concatenate(get_duration_code, [d / 100000 for d in range(0, 30 * 1000)]) + + # frequency encoding + string += concatenate(get_frequency_code, + [16 , 20 , 25 , 31.5 , 40 , 50 , 63 , 80 , 100 , 125 , + 160 , 200 , 250 , 315 , 400 , 500 , 630 , 800 , 1000 , 1250 , + 1600 , 2000 , 2500 , 3150 , 4000 , 5000 , 6300 , 8000, 10000, 12500, + 16000, 20000, 25000, 31500, 40000]) + + # frequency hop encoding + string += concatenate(get_frequency_hop_code, [index for index in range(0, 9)]) + + # DSR encoding + string += concatenate(get_dsr_code, [math.pow(10, dsr / 10) for dsr in range(-150, -10 + 1)]) + + data = bitarray(string, endian='big') + + file = open('test_python.dat', 'wb') + data.tofile(file) + file.close() + + +def generate_reverb_payload_equivalent_to_rend_config_renderer_cfg(): + # based on config_renderer.cfg + # note that because of encoding, resolution is lost and behaviour may not be bit-exact compared to .cfg file based values + data = bitarray( + get_count_or_index_code(1) # fgdNrGrids + + fgdMethod.Individual_Frequencies.value # fgdMethod + + get_count_or_index_code(31) # fgdNrBands + + + concatenate(get_frequency_code, # fgdCenterFreq + [ 20.0, 25.0, 31.5, 40.0, 50.0, 63.0, 80.0, 100.0, 125.0, 160.0, + 200.0, 250.0, 315.0, 400.0, 500.0, 630.0, 800.0, 1000.0, 1250.0, 1600.0, + 2000.0, 2500.0, 3150.0, 4000.0, 5000.0, 6300.0, 8000.0, 10000.0, 12500.0, 16000.0, + 20000.0 ]) + + + get_count_or_index_code(1) # AcousticEnvCount + + get_id_code(0) # ID + + get_count_or_index_code(0) # FreqGridID + + get_duration_code(0.1) # (input)Predelay + + + concatenate(get_duration_code, # RT60 + [ 1.3622, 1.4486, 1.3168, 1.5787, 1.4766, 1.3954, 1.2889, 1.3462, 1.0759, 1.0401, + 1.0970, 1.0850, 1.0910, 1.0404, 1.0499, 1.0699, 1.1028, 1.1714, 1.1027, 1.0666, + 1.0550, 1.0553, 1.0521, 1.0569, 1.0421, 0.97822, 0.80487, 0.75944, 0.71945, 0.61682, + 0.60031 ]) + + + concatenate(get_dsr_code, # DSR + [ 1.8811e-08, 2.1428e-08, 1.3972e-08, 1.51e-08, 1.287e-08, 1.8747e-08, 2.413e-08, 3.9927e-08, 8.9719e-08, 1.902e-07, + 3.702e-07, 6.1341e-07, 7.1432e-07, 6.5331e-07, 4.6094e-07, 5.4683e-07, 7.0134e-07, 6.856e-07, 7.114e-07, 6.9604e-07, + 5.2939e-07, 5.699e-07, 6.1773e-07, 5.7488e-07, 4.7748e-07, 2.7213e-07, 1.3681e-07, 1.0941e-07, 6.2001e-08, 2.8483e-08, + 2.6267e-08 ]) + + , endian='big') + + file = open('rend_config_renderer.dat', 'wb') + data.tofile(file) + file.close() + + +def generate_reverb_payload_equivalent_to_rend_config_hospital_patientroom_cfg(): + # based on config_hospital_patientroom.cfg + # note that because of encoding, resolution is lost and behaviour may not be bit-exact compared to .cfg file based values + data = bitarray( + get_count_or_index_code(1) # fgdNrGrids + + fgdMethod.Individual_Frequencies.value # fgdMethod + + get_count_or_index_code(31) # fgdNrBands + + + + concatenate(get_frequency_code, # fgdCenterFreq + [ 20.0, 25.0, 31.5, 40.0, 50.0, 63.0, 80.0, 100.0, 125.0, 160.0, + 200.0, 250.0, 315.0, 400.0, 500.0, 630.0, 800.0, 1000.0, 1250.0, 1600.0, + 2000.0, 2500.0, 3150.0, 4000.0, 5000.0, 6300.0, 8000.0, 10000.0, 12500.0, 16000.0, + 20000.0 ]) + + + get_count_or_index_code(1) # AcousticEnvCount + + get_id_code(0) # ID + + get_count_or_index_code(0) # FreqGridID + + get_duration_code(0.08163) # (input)Predelay + + + concatenate(get_duration_code, # RT60 + [ 0.81275, 0.61888, 0.45111, 0.34672, 0.46683, 0.53987, 0.61874, 0.70291, 0.66657, 0.73037, + 0.75090, 0.72470, 0.75486, 0.75857, 0.76844, 0.74999, 0.77622, 0.78227, 0.77441, 0.74688, + 0.73521, 0.73782, 0.71928, 0.71708, 0.71465, 0.60592, 0.52031, 0.51768, 0.52102, 0.37956, + 0.30786 ]) + + + concatenate(get_dsr_code, # DSR + [ 0.000219780698, 0.000205275364, 7.18711e-05, 4.5745977e-05, 8.381106e-06, 6.884964e-06, 6.532765e-06, 8.296928e-06, 1.0005793e-05, 9.191127e-06, + 8.635287e-06, 9.627704e-06, 1.0806965e-05, 1.0041916e-05, 7.77047e-06, 9.695803e-06, 9.594324e-06, 8.32215e-06, 7.564813e-06, 6.215871e-06, + 6.379496e-06, 6.358105e-06, 6.6696e-06, 6.369334e-06, 6.378474e-06, 3.339913e-06, 3.129318e-06, 2.892564e-06, 6.00202e-07, 3.40124e-07, + 3.37705e-07 ]) + + , endian='big') + + file = open('rend_config_hospital_patientroom.dat', 'wb') + data.tofile(file) + file.close() + + +def generate_reverb_payload_equivalent_to_rend_config_recreation_cfg(): + # based on config_recreation.cfg + # note that because of encoding, resolution is lost and behaviour may not be bit-exact compared to .cfg file based values + data = bitarray( + get_count_or_index_code(1) # fgdNrGrids + + fgdMethod.Individual_Frequencies.value # fgdMethod + + get_count_or_index_code(31) # fgdNrBands + + + + concatenate(get_frequency_code, # fgdCenterFreq + [ 20.0, 25.0, 31.5, 40.0, 50.0, 63.0, 80.0, 100.0, 125.0, 160.0, + 200.0, 250.0, 315.0, 400.0, 500.0, 630.0, 800.0, 1000.0, 1250.0, 1600.0, + 2000.0, 2500.0, 3150.0, 4000.0, 5000.0, 6300.0, 8000.0, 10000.0, 12500.0, 16000.0, + 20000.0 ]) + + + get_count_or_index_code(1) # AcousticEnvCount + + get_id_code(0) # ID + + get_count_or_index_code(0) # FreqGridID + + get_duration_code(0.43031) # (input)Predelay + + + concatenate(get_duration_code, # RT60 + [ 4.51916, 4.89553, 4.83276, 5.00198, 5.34468, 5.76026, 6.36818, 6.95503, 7.27557, 7.62559, + 8.08892, 8.16002, 8.13900, 8.17919, 8.16280, 8.46226, 9.61806, 9.93048, 9.81353, 8.59340, + 8.38885, 8.36823, 6.51845, 3.76089, 3.75374, 3.57451, 1.28724, 1.22174, 1.22448, 1.71631, + 2.14343 ]) + + + concatenate(get_dsr_code, # DSR + [ 9.18578e-07, 7.63803e-07, 9.23183e-07, 1.048656e-06, 1.61449e-06, 2.13745e-06, 2.854805e-06, 3.979651e-06, 6.229977e-06, 7.782421e-06, + 9.091754e-06, 8.545798e-06, 7.482083e-06, 7.351071e-06, 7.947039e-06, 8.152676e-06, 5.201189e-06, 4.744103e-06, 4.397069e-06, 3.017449e-06, + 2.958383e-06, 2.725911e-06, 7.94912e-07, 6.20198e-07, 5.71181e-07, 5.5546e-08, 1.3987e-08, 1.338e-08, 1.322e-09, 1.3e-11, + 4e-12 ]) + + , endian='big') + + file = open('rend_config_recreation.dat', 'wb') + data.tofile(file) + file.close() + + +#test() +generate_reverb_payload_equivalent_to_rend_config_renderer_cfg() +generate_reverb_payload_equivalent_to_rend_config_hospital_patientroom_cfg() +generate_reverb_payload_equivalent_to_rend_config_recreation_cfg() diff --git a/tests/test_param_file.py b/tests/test_param_file.py index 7774d59403..0059a22408 100644 --- a/tests/test_param_file.py +++ b/tests/test_param_file.py @@ -57,7 +57,7 @@ VALID_DEC_OUTPUT_CONF = [ "HOA2", "HOA3", "BINAURAL", - "BINAURAL_ROOM", + "BINAURAL_ROOM_IR", "EXT", ] -- GitLab From fc2b98989a665401563083317fcf7194bf3f916f Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 31 May 2023 17:10:27 +0200 Subject: [PATCH 129/381] address comments related to 5ms rendering in external renderer --- lib_rend/lib_rend.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index a85e4be3f1..41f68b6520 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4390,7 +4390,6 @@ static ivas_error renderIsmToBinaural( copyBufferTo2dArray( ismInput->base.inputBuffer, tmpTDRendBuffer ); - /* TODO tmu : missing: interpolation between positions, 5ms rendering */ if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, @@ -4445,7 +4444,6 @@ static ivas_error renderIsmToBinauralRoom( { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); - /* TODO tmu : missing: interpolation between positions, 5ms rendering */ if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, @@ -4478,9 +4476,9 @@ static ivas_error renderIsmToBinauralRoom( (void) subframe_len; // avoid warning } - /* TODO tmu : missing: interpolation between positions, 5ms rendering */ - /* TODO(sgi): Possible optimization: less processing needed if position didn't change */ - /* TODO tmu2sgi: needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ + /* TODO tmu : see issue #518 */ + /* Possible optimization: less processing needed if position didn't change + * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ /* previous position gains */ if ( headRotData->headRotEnabled ) { -- GitLab From fdc022c44a5bfab62287b61ab0fa06ab0f559211 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 17:19:52 +0200 Subject: [PATCH 130/381] Updates reflecting the discussion on issue #196 --- lib_dec/ivas_ism_dec.c | 10 ---------- lib_dec/ivas_output_config.c | 24 ------------------------ 2 files changed, 34 deletions(-) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index b9bd1eedef..9f95455fde 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -180,12 +180,7 @@ static ivas_error ivas_ism_bitrate_switching( /* Deallocate the ParamISM struct */ ivas_param_ism_dec_close( &( st_ivas->hDirAC ), st_ivas->hDecoderConfig->output_config ); -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || - st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) -#else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) -#endif { /* close the parametric binaural renderer */ ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); @@ -257,12 +252,7 @@ static ivas_error ivas_ism_bitrate_switching( return error; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || - st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) -#else if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL ) -#endif { /* open the parametric binaural renderer */ if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 171aa2421a..6cc176d099 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -97,11 +97,7 @@ void ivas_renderer_select( } else /* ISM_MODE_DISC */ { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) -#else if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) -#endif { #ifdef DEBUGGING if ( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) @@ -135,12 +131,7 @@ void ivas_renderer_select( else if ( st_ivas->ivas_format == MASA_FORMAT || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport <= 2 ) ) { *internal_config = output_config; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL ) -#else if ( output_config == AUDIO_CONFIG_BINAURAL ) -#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -152,12 +143,7 @@ void ivas_renderer_select( else if ( st_ivas->ivas_format == SBA_FORMAT ) { *internal_config = AUDIO_CONFIG_HOA3; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL ) -#else if ( output_config == AUDIO_CONFIG_BINAURAL ) -#endif { *renderer_type = RENDERER_BINAURAL_FASTCONV; } @@ -194,12 +180,7 @@ void ivas_renderer_select( if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { *internal_config = output_config; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL ) -#else if ( output_config == AUDIO_CONFIG_BINAURAL ) -#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -211,12 +192,7 @@ void ivas_renderer_select( else { *internal_config = transport_config; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || - output_config == AUDIO_CONFIG_BINAURAL ) -#else if ( output_config == AUDIO_CONFIG_BINAURAL ) -#endif { #ifdef DEBUGGING if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) -- GitLab From b1801cb3500751255d4f6f4d9961a7bc92e94bce Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 17:23:30 +0200 Subject: [PATCH 131/381] Updates reflecting the discussion on issue #196 --- lib_rend/lib_rend.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 916dde2d15..b1afd725d9 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1139,12 +1139,7 @@ static ivas_error setRendInputActiveIsm( initRotMatrix( inputIsm->rot_mat_prev ); error = IVAS_ERR_OK; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || - outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) -#else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) -#endif { if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { -- GitLab From 5b75b753cf5424cd4a1b594dd1f1b703917dd434 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 17:24:30 +0200 Subject: [PATCH 132/381] Updates reflecting the discussion on issue #196 --- lib_rend/lib_rend.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 2c93ef4d27..a9c6cccfa5 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -113,7 +113,7 @@ typedef enum IVAS_REND_AUDIO_CONFIG_OBJECT = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED << 8 | 0, #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 9, + IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, #else -- GitLab From ef8cad2b22baacd6871cebcdbcd4b749ee845f6a Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 17:35:27 +0200 Subject: [PATCH 133/381] Updates reflecting the discussion on issue #196 --- scripts/pyivastest/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/pyivastest/constants.py b/scripts/pyivastest/constants.py index f42796376a..46648658c9 100644 --- a/scripts/pyivastest/constants.py +++ b/scripts/pyivastest/constants.py @@ -47,7 +47,7 @@ OC_TO_NCHANNELS = { "MONO": 1, "STEREO": 2, "BINAURAL": 2, - "BINAURAL_ROOM": 2, + "BINAURAL_ROOM_IR": 2, "5_1": 6, "7_1": 8, "5_1_2": 8, @@ -64,7 +64,7 @@ OC_TO_NCHANNELS = { "MASA1TC": 1, "MASA2TC": 2, } -DECODER_OUTPUT_CONFIGS = {"MONO", "STEREO", "BINAURAL", "BINAURAL_ROOM", "5_1", "7_1", "5_1_4", "5_1_2", +DECODER_OUTPUT_CONFIGS = {"MONO", "STEREO", "BINAURAL", "BINAURAL_ROOM_IR", "5_1", "7_1", "5_1_4", "5_1_2", "7_1_4", "FOA", "HOA2", "HOA3", "EXT"} LOG_FILE_EXT = ".txt" LOG_FILE_DIR ="logs" -- GitLab From 4b27b36aeb59ac3d6b6b5b6d38cecb956a770567 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 17:42:46 +0200 Subject: [PATCH 134/381] Updates reflecting the discussion on issue #196 --- tests/renderer/constants.py | 84 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py index 6a8465781b..1a9b16531a 100644 --- a/tests/renderer/constants.py +++ b/tests/renderer/constants.py @@ -194,7 +194,7 @@ METADATA_SCENES_TO_TEST = ["mixed_scene", "mixed_scene_simple"] METADATA_SCENES_TO_TEST_NO_BE = ["masa_scene"] """ Binaural rendering """ -OUTPUT_FORMATS_BINAURAL = ["BINAURAL", "BINAURAL_ROOM"] +OUTPUT_FORMATS_BINAURAL = ["BINAURAL", "BINAURAL_ROOM_IR"] HR_TRAJECTORIES_TO_TEST = [ "full_circle_in_15s", "rotate_yaw_pitch_roll1", @@ -229,17 +229,17 @@ _pass_snr = { "test_ambisonics_binaural_headrotation[HOA3-BINAURAL-full_circle_in_15s]": 15, # Failure reason: Crend unit test does not support intermediate conversion to 7_1_4 or SHD BRIRs # Comparison with pyaudio3dtools results in bad SNR - "test_ambisonics_binaural_headrotation[FOA-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[FOA-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[FOA-BINAURAL_ROOM_IR-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[FOA-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_ROOM_IR-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[HOA2-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 0, "test_ambisonics_binaural_headrotation[HOA2-BINAURAL-rotate_yaw_pitch_roll1]": 4, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_ROOM_IR-full_circle_in_15s]": 0, + "test_ambisonics_binaural_headrotation[HOA3-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 0, "test_ambisonics_binaural_headrotation[HOA3-BINAURAL-rotate_yaw_pitch_roll1]": 3, - "test_ambisonics_binaural_static[FOA-BINAURAL_ROOM]": 0, - "test_ambisonics_binaural_static[HOA2-BINAURAL_ROOM]": 0, - "test_ambisonics_binaural_static[HOA3-BINAURAL_ROOM]": 0, + "test_ambisonics_binaural_static[FOA-BINAURAL_ROOM_IR]": 0, + "test_ambisonics_binaural_static[HOA2-BINAURAL_ROOM_IR]": 0, + "test_ambisonics_binaural_static[HOA3-BINAURAL_ROOM_IR]": 0, # Failure reason: Renderer uses getRSH() with int16_t vs float in python "test_custom_ls_input[t_design_4-FOA]": 43, "test_custom_ls_input[t_design_4-HOA2]": 39, @@ -259,46 +259,46 @@ _pass_snr = { # Failure reason: TD Object Renderer standalone does not support custom LS input # Comparison with pyaudio3dtools results in bad SNR "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL]": 8, - "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL_ROOM]": 0, + "test_custom_ls_input_binaural[16ch_8+4+4-BINAURAL_ROOM_IR]": 0, "test_custom_ls_input_binaural[4d4-BINAURAL]": 6, - "test_custom_ls_input_binaural[4d4-BINAURAL_ROOM]": 0, + "test_custom_ls_input_binaural[4d4-BINAURAL_ROOM_IR]": 0, "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL]": 1, - "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL_ROOM]": 3, + "test_custom_ls_input_binaural[itu_4+5+1-BINAURAL_ROOM_IR]": 3, "test_custom_ls_input_binaural[t_design_4-BINAURAL]": 5, - "test_custom_ls_input_binaural[t_design_4-BINAURAL_ROOM]": 0, + "test_custom_ls_input_binaural[t_design_4-BINAURAL_ROOM_IR]": 0, "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL-full_circle_in_15s]": 7, "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL-rotate_yaw_pitch_roll1]": 6, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_ROOM_IR-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[16ch_8+4+4-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 0, "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL-full_circle_in_15s]": 7, "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL-rotate_yaw_pitch_roll1]": 5, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_ROOM_IR-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[4d4-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 0, "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL-full_circle_in_15s]": 1, "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL-rotate_yaw_pitch_roll1]": 1, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_ROOM-full_circle_in_15s]": 3, - "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 3, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_ROOM_IR-full_circle_in_15s]": 3, + "test_custom_ls_input_binaural_headrotation[itu_4+5+1-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 3, "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL-full_circle_in_15s]": 4, "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL-rotate_yaw_pitch_roll1]": 4, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_ROOM-full_circle_in_15s]": 0, - "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 0, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_ROOM_IR-full_circle_in_15s]": 0, + "test_custom_ls_input_binaural_headrotation[t_design_4-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 0, # TODO needs debugging "test_ism_binaural_headrotation[ISM2-BINAURAL-rotate_yaw_pitch_roll1]": 34, "test_ism_binaural_headrotation[ISM3-BINAURAL-rotate_yaw_pitch_roll1]": 34, "test_ism_binaural_headrotation[ISM4-BINAURAL-rotate_yaw_pitch_roll1]": 33, # Failure reason: Crend unit test does not support intermediate conversion to 7_1_4 - "test_ism_binaural_headrotation[ISM1-BINAURAL_ROOM-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_headrotation[ISM2-BINAURAL_ROOM-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 3, - "test_ism_binaural_headrotation[ISM3-BINAURAL_ROOM-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM3-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_headrotation[ISM4-BINAURAL_ROOM-full_circle_in_15s]": 10, - "test_ism_binaural_headrotation[ISM4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 4, - "test_ism_binaural_static[ISM1-BINAURAL_ROOM]": 23, - "test_ism_binaural_static[ISM2-BINAURAL_ROOM]": 21, - "test_ism_binaural_static[ISM3-BINAURAL_ROOM]": 21, - "test_ism_binaural_static[ISM4-BINAURAL_ROOM]": 21, + "test_ism_binaural_headrotation[ISM1-BINAURAL_ROOM_IR-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM1-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_headrotation[ISM2-BINAURAL_ROOM_IR-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM2-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 3, + "test_ism_binaural_headrotation[ISM3-BINAURAL_ROOM_IR-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM3-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_headrotation[ISM4-BINAURAL_ROOM_IR-full_circle_in_15s]": 10, + "test_ism_binaural_headrotation[ISM4-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 4, + "test_ism_binaural_static[ISM1-BINAURAL_ROOM_IR]": 23, + "test_ism_binaural_static[ISM2-BINAURAL_ROOM_IR]": 21, + "test_ism_binaural_static[ISM3-BINAURAL_ROOM_IR]": 21, + "test_ism_binaural_static[ISM4-BINAURAL_ROOM_IR]": 21, # Failure Reason: Tangent law panning missing in python scripts "test_ism[ISM1-STEREO]": 8, "test_ism[ISM2-STEREO]": 13, @@ -350,14 +350,14 @@ _pass_snr = { "test_multichannel_binaural_headrotation[7_1_4-BINAURAL-full_circle_in_15s]": 8, "test_multichannel_binaural_headrotation[7_1_4-BINAURAL-rotate_yaw_pitch_roll1]": 1, # Failure reason: differences in LFE alignment and possibly rotation - "test_multichannel_binaural_headrotation[5_1-BINAURAL_ROOM-full_circle_in_15s]": 14, - "test_multichannel_binaural_headrotation[5_1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 12, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_ROOM-full_circle_in_15s]": 8, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_ROOM-full_circle_in_15s]": 6, - "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 6, - "test_multichannel_binaural_headrotation[7_1-BINAURAL_ROOM-full_circle_in_15s]": 11, - "test_multichannel_binaural_headrotation[7_1-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 9, - "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_ROOM-rotate_yaw_pitch_roll1]": 6, + "test_multichannel_binaural_headrotation[5_1-BINAURAL_ROOM_IR-full_circle_in_15s]": 14, + "test_multichannel_binaural_headrotation[5_1-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 12, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_ROOM_IR-full_circle_in_15s]": 8, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_ROOM_IR-full_circle_in_15s]": 6, + "test_multichannel_binaural_headrotation[5_1_4-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 6, + "test_multichannel_binaural_headrotation[7_1-BINAURAL_ROOM_IR-full_circle_in_15s]": 11, + "test_multichannel_binaural_headrotation[7_1-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 9, + "test_multichannel_binaural_headrotation[5_1_2-BINAURAL_ROOM_IR-rotate_yaw_pitch_roll1]": 6, # Failure reason: mixed format, see above "test_metadata[mixed_scene-5_1]": 47, "test_metadata[mixed_scene-5_1_2]": 47, -- GitLab From d7282b9250ff3fa5ac401ffca8e7ee24e3e00c46 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Wed, 31 May 2023 21:19:05 +0200 Subject: [PATCH 135/381] Updates reflecting the discussion on issue #196 --- scripts/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/README.md b/scripts/README.md index 4e8a9b3664..f547c7e80f 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -356,11 +356,11 @@ items for encoding the selected modes. Example for checking BE between some local code and the trunk for SBA modes and binaural output formats ``` -./testBitexact.py -p user_linux -C SBA --oc BINAURAL BINAURAL_ROOM -srcdirtest /some/local/src/dir/ -srcdirref /home/user/ivas/automated_tests/ --svnref https://INSERT_SVN_REPO/trunk/ --svnuser user --srin 48 --srout 48 +./testBitexact.py -p user_linux -C SBA --oc BINAURAL BINAURAL_ROOM_IR -srcdirtest /some/local/src/dir/ -srcdirref /home/user/ivas/automated_tests/ --svnref https://INSERT_SVN_REPO/trunk/ --svnuser user --srin 48 --srout 48 ``` Example for checking BE between the head of a dev branch and a specific version of the trunk, all MC, SBA, MASA modes and all output formats, limit to 10 seconds input signal length for the sake of run time. ``` -./testBitexact.py -p user_linux -C SBA PlanarSBA MC MASA --oc BINAURAL BINAURAL_ROOM MONO STEREO FOA HOA2 HOA3 CICP6 CICP12 CICP16 CICP19 -srcdirtest /home/user/ivas/automated_tests/ --svntest https://INSERT_SVN_REPO/B20290120_some_dev_branch/ -srcdirref /home/user/ivas/automated_tests/ --svnref https://INSERT_SVN_REPO/trunk/ --rref 4000 --svnuser user --srin 48 --srout 48 -U 10 +./testBitexact.py -p user_linux -C SBA PlanarSBA MC MASA --oc BINAURAL BINAURAL_ROOM_IR MONO STEREO FOA HOA2 HOA3 CICP6 CICP12 CICP16 CICP19 -srcdirtest /home/user/ivas/automated_tests/ --svntest https://INSERT_SVN_REPO/B20290120_some_dev_branch/ -srcdirref /home/user/ivas/automated_tests/ --svnref https://INSERT_SVN_REPO/trunk/ --rref 4000 --svnuser user --srin 48 --srout 48 -U 10 ``` --- -- GitLab From 33b43ebdd0f4085edff63ba6f0b3e570103227ec Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Thu, 1 Jun 2023 00:31:45 +0200 Subject: [PATCH 136/381] fix compilation without FIX_196_... --- lib_dec/ivas_jbm_dec.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index ac560a2750..b4f5040495 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -763,8 +763,13 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, + NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1031,9 +1036,13 @@ ivas_error ivas_jbm_dec_flush_renderer( set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity ); ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); - +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, + NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } -- GitLab From 42d4e1d1e6bac59711370bdb9aa389fa4150cfdc Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 1 Jun 2023 16:36:34 +1000 Subject: [PATCH 137/381] SPAR MD dec DTX fix for 16_4 and 13_2 kbps --- lib_dec/ivas_spar_md_dec.c | 58 ++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 62f419de67..7d33073f11 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1749,6 +1749,9 @@ static void ivas_spar_dec_parse_md_bs( int16_t planarCP; float quant[IVAS_SPAR_MAX_C_COEFF]; int16_t do_repeat[IVAS_MAX_NUM_BANDS]; +#ifdef FIX_501_TABLE_IDX_INIT + int16_t bw_final, bw_fact; +#endif *dtx_vad = 1; *bands_bw = 1; @@ -1821,38 +1824,51 @@ static void ivas_spar_dec_parse_md_bs( ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band ); + #ifdef FIX_501_TABLE_IDX_INIT if ( last_active_brate >= IVAS_24k4 ) { + bw_final = 1; + } + else + { + bw_final = 2; + } + bw_fact = *bands_bw / bw_final; #endif - for ( i = *nB - 1; i >= 0; i-- ) + for ( i = *nB - 1; i >= 0; i-- ) + { +#ifdef FIX_501_TABLE_IDX_INIT + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bw_fact * i]; + + for ( b = bw_fact - 1; b >= 0; b-- ) { - ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * i]; + idx = i * bw_fact + b; +#else + ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * i]; - for ( b = *bands_bw - 1; b >= 0; b-- ) + for ( b = *bands_bw - 1; b >= 0; b-- ) + { + idx = i * *bands_bw + b; +#endif + for ( j = 0; j < FOA_CHANNELS - 1; j++ ) { - idx = i * *bands_bw + b; - for ( j = 0; j < FOA_CHANNELS - 1; j++ ) - { - hMdDec->spar_md.band_coeffs[idx].pred_re[j] = hMdDec->spar_md.band_coeffs[i].pred_re[j]; - } - for ( j = 0; j < ndec; j++ ) - { - hMdDec->spar_md.band_coeffs[idx].P_re[j] = hMdDec->spar_md.band_coeffs[i].P_re[j]; - } - hMdDec->valid_bands[idx] = 1; + hMdDec->spar_md.band_coeffs[idx].pred_re[j] = hMdDec->spar_md.band_coeffs[i].pred_re[j]; } + for ( j = 0; j < ndec; j++ ) + { + hMdDec->spar_md.band_coeffs[idx].P_re[j] = hMdDec->spar_md.band_coeffs[i].P_re[j]; + } + hMdDec->valid_bands[idx] = 1; } + } - *nB = num_bands; - *bands_bw = 1; #ifdef FIX_501_TABLE_IDX_INIT - } - else - { - *bands_bw = 2; - *nB = num_bands / *bands_bw; - } + *bands_bw = bw_final; + *nB = num_bands / bw_final; +#else + *nB = num_bands; + *bands_bw = 1; #endif return; -- GitLab From df3e7add2611087b9fc22e6a8481111da0056fec Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 1 Jun 2023 08:50:59 +0200 Subject: [PATCH 138/381] remove comment - the for loop updating st->prev_tilt_code_dec can be run either with NB_SUBFR or NB_SUBFR16k depending on core Fs but it would hardly have any impact on quality. --- lib_dec/updt_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/updt_dec.c b/lib_dec/updt_dec.c index 81f4027221..b4bea68b3f 100644 --- a/lib_dec/updt_dec.c +++ b/lib_dec/updt_dec.c @@ -550,7 +550,7 @@ void updt_dec_common( st->prev_use_partial_copy = st->use_partial_copy; st->prev_tilt_code_dec = 0.0f; - for ( i = 0; i < NB_SUBFR; i++ ) /* ToDo: why it supposes 12.8 kHz only and not 16kHz core? */ + for ( i = 0; i < NB_SUBFR; i++ ) { st->prev_tilt_code_dec += st->tilt_code_dec[i] * 0.25f; } -- GitLab From b43760e8ea9389a133c1419ed160b2dfc8465b98 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 1 Jun 2023 09:28:28 +0200 Subject: [PATCH 139/381] fix infinte loop caused by the previous merge from main --- lib_dec/ivas_dirac_dec.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index ba3874ddd3..502420781f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1094,21 +1094,17 @@ ivas_error ivas_dirac_dec_config( #ifdef JBM_TSM_ON_TCS set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); - for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) - { - set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); #ifdef FIX_393_459_460_SBA_MD - for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS * num_slots_in_subfr; map_idx++ ) + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS * num_slots_in_subfr; map_idx++ ) #else - for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) #endif - { + { #ifdef FIX_393_459_460_SBA_MD - hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx / num_slots_in_subfr; + hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx / num_slots_in_subfr; #else - hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; + hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; #endif - } } #endif } -- GitLab From 3bd6412a23ac1dc7e728415c133e5cc78e1670a9 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 1 Jun 2023 09:43:47 +0200 Subject: [PATCH 140/381] Updates reflecting the discussion on issue #196 --- scripts/config/self_test.prm | 84 ++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 9d593143f2..b971bd06fc 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -266,7 +266,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst -// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out +// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out ../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst @@ -310,7 +310,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out, random FEC at 5% +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out, random FEC at 5% ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL_ROOM_IR 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst @@ -318,7 +318,7 @@ ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst -// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_ROOM_IR out, random FEC at 5% +// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_ROOM out, random FEC at 5% ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit ../IVAS_dec -fec 5 BINAURAL_ROOM_IR 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst @@ -326,11 +326,11 @@ ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out, head rotation, random FEC at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out, head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit ../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out +// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst @@ -338,7 +338,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst -// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM_IR out +// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst @@ -480,7 +480,7 @@ ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit ../IVAS_dec -fec testv/FEC_6pct.bin BINAURAL 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_FEC6.tst -// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out +// SBA at 32 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_BINAURAL_ROOM.tst @@ -496,27 +496,27 @@ ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_stereo.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation, Orientation tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation, reference vector tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation, reference vector tracking in level mode +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst @@ -548,7 +548,7 @@ ../IVAS_cod -dtx -sba 1 64000 48 testv/stvFOA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL.tst -// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, DTX +// SBA at 64 kpbs, 48kHz in, 48kHz out, BINAURAL_ROOM out, DTX ../IVAS_cod -dtx -sba 1 64000 48 testv/stvFOA48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stvFOA48c.wav_SBA_64000_48-48_DTX_BINAURAL_ROOM.tst @@ -572,11 +572,11 @@ ../IVAS_cod -sba 1 96000 48 testv/stvFOA48c.wav bit ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_SBA_96000_48-48_FOA.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out, Headrotation, Orientation tracking +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst @@ -592,7 +592,7 @@ ../IVAS_cod -sba 1 160000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_160000_32-32_FOA.tst -// SBA at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, random FEC at 5% +// SBA at 160 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, random FEC at 5% ../IVAS_cod -sba 1 160000 48 testv/stvFOA48c.wav bit ../IVAS_dec -fec 5 BINAURAL_ROOM_IR 48 bit testv/stvFOA48c.wav_SBA_160000_48-48_BINAURAL_ROOM_FEC5.tst @@ -608,7 +608,7 @@ ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_FOA.tst -// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM_IR out +// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst @@ -658,15 +658,15 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 16400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -fec 5 HOA3 48 bit testv/stv1MASA1TC48c.wav_16400_48-48_HOA3_FEC5.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, Headrotation +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst @@ -706,15 +706,15 @@ ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 24400 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv1MASA2TC48c.wav_24400_48-48_STEREO.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, Headrotation +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, Headrotation, Orientation tracking +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst @@ -758,11 +758,11 @@ ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 192000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -fec 5 5_1_4 48 bit testv/stv2MASA2TC48c.wav_192000_48-48_5_1_4_FEC5.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom.tst -// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out +// MASA 2dir 2TC at 384 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 384000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2MASA2TC48c.wav_384000_48-48_BinauralRoom_Subframe.tst @@ -824,7 +824,7 @@ ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst @@ -844,7 +844,7 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_stereo_FEC5.tst -// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out +// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out ../IVAS_cod -mc 5_1 192000 48 testv/stv51MC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst @@ -852,11 +852,11 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec MONO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_mono.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, head rotation +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, head rotation ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out, head rotation, Orientation tracking +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, head rotation, Orientation tracking ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst @@ -924,35 +924,35 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_MC_custom_setup.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_ROOM_REVERB out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM_REVERB out Config renderer +// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config hospital_patientroom +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config hospital_patientroom ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst -// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config recreation +// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config recreation ../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_recreation.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst -// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config renderer +// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1_2 512000 48 testv/stv512MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config renderer +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out Config renderer +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out Config renderer ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit ../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_ROOM_REVERB 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst @@ -964,7 +964,7 @@ ../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 10 BINAURAL 48 bit testv/stv51MC48c.wav_sw_48-48_binaural_fec10.tst -// Multi-channel 5_1_2 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM_IR out +// Multi-channel 5_1_2 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out ../IVAS_cod -mc 5_1_2 ../scripts/switchPaths/sw_13k2_512k.bin 48 testv/stv512MC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 16 bit testv/stv512MC48c.wav_sw_48-16_Binaural_room.tst @@ -977,7 +977,7 @@ ../IVAS_dec -FEC 5 STEREO 32 bit testv/stv714MC48c.wav_sw_48-32_stereo.tst -// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM_IR out (Model from file) +// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_ROOM out (Model from file) ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL_ROOM_IR 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_binaural_room.tst @@ -989,7 +989,7 @@ ../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_binaural.tst -// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_IR out (Model from file) +// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out (Model from file) ../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit ../IVAS_dec -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin BINAURAL_ROOM_IR 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_binaural_room.tst -- GitLab From 8804a81d158b45b967f225d4b3477515ab4e1363 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 1 Jun 2023 10:20:38 +0200 Subject: [PATCH 141/381] add excluded SBA mode back --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e462809b3e..c92459d239 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -674,8 +674,7 @@ check-first-frame-is-sid: - make -j # TODO: for some MASA modes, we currently do not have testvectors that actually trigger DTX - # TODO: add SBA 24.4 kbps back once #185 is fixed - - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v "SBA_b24_4" | grep -v MASA) + - modes=$(scripts/runIvasCodec.py -l | grep dtx | grep -v MASA) - echo $modes - scripts/runIvasCodec.py -p scripts/config/ci_linux_sidstart_test.json -m $modes -s --bs_length 500 artifacts: -- GitLab From 7ad68e7c24069474f952cc0da3ce9714c6581c70 Mon Sep 17 00:00:00 2001 From: Jan Brouwer Date: Thu, 1 Jun 2023 10:24:13 +0200 Subject: [PATCH 142/381] added BINAURAL_ROOM_REVERB to OUTPUT_FORMATS_BINAURAL --- tests/renderer/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py index 1a9b16531a..877a1454c2 100644 --- a/tests/renderer/constants.py +++ b/tests/renderer/constants.py @@ -194,7 +194,7 @@ METADATA_SCENES_TO_TEST = ["mixed_scene", "mixed_scene_simple"] METADATA_SCENES_TO_TEST_NO_BE = ["masa_scene"] """ Binaural rendering """ -OUTPUT_FORMATS_BINAURAL = ["BINAURAL", "BINAURAL_ROOM_IR"] +OUTPUT_FORMATS_BINAURAL = ["BINAURAL", "BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB"] HR_TRAJECTORIES_TO_TEST = [ "full_circle_in_15s", "rotate_yaw_pitch_roll1", -- GitLab From 40a11f3a3ffc3d93824500652ab7a31c53154441 Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Thu, 1 Jun 2023 10:25:26 +0200 Subject: [PATCH 143/381] remove obsolete code in cpe deallocation function, since LFE not part of CPE anymore (to do in issue 451) --- lib_com/options.h | 2 +- lib_dec/ivas_cpe_dec.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 011611ea16..47a2bbdad2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -228,7 +228,7 @@ #define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ #define FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER /* ..\apps\renderer.c(240): .... (todo: implementation)",*/ - +#define REMOVE_OBS_CODE /* FhG: Remove unnecessary assignement after LFE cleanup (Issue #451)*/ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 6511bb1181..a19fb21dc2 100755 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -832,11 +832,13 @@ void destroy_cpe_dec( int16_t n; Decoder_State *st; +#ifndef REMOVE_OBS_CODE /* make sure we deallocate a potential distinct hTcxCfg for a MCT LFE channel (can only happen in rs) */ /*TODO Check this again with LFE clean up!*/ if ( hCPE->hCoreCoder[1] != NULL && hCPE->hCoreCoder[1]->hTcxCfg != hCPE->hCoreCoder[0]->hTcxCfg ) { hCPE->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; } +#endif for ( n = 0; n < CPE_CHANNELS; n++ ) { -- GitLab From 67dcf84abfb4784c3f176f9deb1f6c0ffb4e9ae5 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 1 Jun 2023 11:08:14 +0200 Subject: [PATCH 144/381] increase timeout for instrumented build job --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d1a34b194a..43c9f6d5c9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -266,6 +266,7 @@ build-codec-instrumented-linux: extends: - .build-job-linux - .rules-basis + timeout: "6 minutes" script: - *print-common-info - bash ci/build_codec_instrumented_linux.sh -- GitLab From 611eec135f100ac48a10423d3ee50068f61d87d9 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Thu, 1 Jun 2023 11:16:28 +0200 Subject: [PATCH 145/381] fix for #519, make sure to not access an not yet initialized transport channel buffer handle --- lib_com/options.h | 1 + lib_dec/lib_dec.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 42d6a6a471..19ca63f927 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -227,6 +227,7 @@ #define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ #define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */ #define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ +#define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 69b6e127fd..fd33c41101 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1084,8 +1084,15 @@ ivas_error IVAS_DEC_GetBufferedNumberOfSamples( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - - *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered; +#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER + /* check if the TC buffer already exists, otherweise nothing is buffered anyway */ + if ( hIvasDec->st_ivas->hTcBuffer != NULL ) + { +#endif + *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered; +#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER + } +#endif return error; } @@ -1945,7 +1952,11 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { int16_t nSamplesBuffered; nSamplesBuffered = 0; +#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER + if ( hIvasDec->hasDecodedFirstGoodFrame ) +#else if ( hIvasDec->hasBeenFedFirstGoodFrame ) +#endif { IVAS_DEC_GetBufferedNumberOfSamples( hIvasDec, &nSamplesBuffered ); } -- GitLab From 03b8d839360c93e555b611ea9d720353b9c2b801 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 1 Jun 2023 12:10:19 +0200 Subject: [PATCH 146/381] address todo comments in fd_cng_enc --- lib_com/options.h | 2 ++ lib_enc/fd_cng_enc.c | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 42d6a6a471..636ec0192a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -228,6 +228,8 @@ #define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */ #define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ +#define FIX_TODO_FD_CNG_SBA_CLEANUP + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 3ac5b8d690..8d89d3fa5b 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -1275,12 +1275,19 @@ void FdCngEncodeDiracMDCTStereoSID( lr_out_ptr[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0]; } set_f( weights, 1.f, NPART ); +#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP + assert ( N[0] == N[1] ); +#endif /* apply log and save energy of original left and right channels */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { E[ch] = 0.0f; - for ( p = 0; p < NPART; p++ ) /* TBD Note: NPART should likely be N[ch] if N[ch] may change */ +#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP + for ( p = 0; p < N[ch]; p++ ) +#else + for ( p = 0; p < NPART; p++ ) +#endif { ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON ); E[ch] += ms_ptr[ch][p]; @@ -1288,10 +1295,15 @@ void FdCngEncodeDiracMDCTStereoSID( } /* M/S transform on log envelopes */ - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ +#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP + convertToMS( N[0], ms_ptr[0], ms_ptr[1], 0.5f ); - E[0] = sum_f( ms_ptr[0], NPART ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ + E[0] = sum_f( ms_ptr[0], N[0] ); +#else + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); + E[0] = sum_f( ms_ptr[0], NPART ); +#endif /* Quantize M noise shape */ /* Normalize MSVQ input */ @@ -1326,7 +1338,11 @@ void FdCngEncodeDiracMDCTStereoSID( set_zero( ms_ptr[1], NPART ); /* compute M gain */ - gain[0] = sum_f( ms_ptr[0], NPART ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ +#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP + gain[0] = sum_f( ms_ptr[0], N[0] ); +#else + gain[0] = sum_f( ms_ptr[0], NPART ); +#endif gain[0] = ( E[0] - gain[0] ) / (float) N[0]; apply_scale( &gain[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); @@ -1338,7 +1354,11 @@ void FdCngEncodeDiracMDCTStereoSID( gain[1] = gain[0]; /* undo M/S */ - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ +#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); +#else + convertToMS( N[0], ms_ptr[0], ms_ptr[1], 1.0f ); +#endif /* restore channel noise envelopes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1346,7 +1366,11 @@ void FdCngEncodeDiracMDCTStereoSID( HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc; HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; - for ( p = 0; p < NPART; p++ ) /* TBD Note: NPART should likely be N[0] if N[0] may change */ +#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP + for ( p = 0; p < N[0]; p++ ) +#else + for ( p = 0; p < NPART; p++ ) +#endif { lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); } -- GitLab From b533ea3d5d7be23a7a17dc71735f853f630d0e3f Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 1 Jun 2023 12:37:35 +0200 Subject: [PATCH 147/381] fix merge artifact caused by git mistake --- lib_enc/fd_cng_enc.c | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index db90e65b20..8d89d3fa5b 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -1283,15 +1283,11 @@ void FdCngEncodeDiracMDCTStereoSID( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { E[ch] = 0.0f; -<<<<<<< HEAD #ifdef FIX_TODO_FD_CNG_SBA_CLEANUP for ( p = 0; p < N[ch]; p++ ) #else for ( p = 0; p < NPART; p++ ) #endif -======= - for ( p = 0; p < NPART; p++ ) /* TODO Note: NPART should likely be N[ch] if N[ch] may change */ ->>>>>>> main { ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON ); E[ch] += ms_ptr[ch][p]; @@ -1299,18 +1295,12 @@ void FdCngEncodeDiracMDCTStereoSID( } /* M/S transform on log envelopes */ -<<<<<<< HEAD #ifdef FIX_TODO_FD_CNG_SBA_CLEANUP convertToMS( N[0], ms_ptr[0], ms_ptr[1], 0.5f ); E[0] = sum_f( ms_ptr[0], N[0] ); #else convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); -======= - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ - - E[0] = sum_f( ms_ptr[0], NPART ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ ->>>>>>> main E[0] = sum_f( ms_ptr[0], NPART ); #endif @@ -1348,15 +1338,11 @@ void FdCngEncodeDiracMDCTStereoSID( set_zero( ms_ptr[1], NPART ); /* compute M gain */ -<<<<<<< HEAD #ifdef FIX_TODO_FD_CNG_SBA_CLEANUP gain[0] = sum_f( ms_ptr[0], N[0] ); #else gain[0] = sum_f( ms_ptr[0], NPART ); #endif -======= - gain[0] = sum_f( ms_ptr[0], NPART ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ ->>>>>>> main gain[0] = ( E[0] - gain[0] ) / (float) N[0]; apply_scale( &gain[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); @@ -1368,15 +1354,11 @@ void FdCngEncodeDiracMDCTStereoSID( gain[1] = gain[0]; /* undo M/S */ -<<<<<<< HEAD #ifdef FIX_TODO_FD_CNG_SBA_CLEANUP convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); #else convertToMS( N[0], ms_ptr[0], ms_ptr[1], 1.0f ); #endif -======= - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ ->>>>>>> main /* restore channel noise envelopes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1384,15 +1366,11 @@ void FdCngEncodeDiracMDCTStereoSID( HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc; HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; -<<<<<<< HEAD #ifdef FIX_TODO_FD_CNG_SBA_CLEANUP for ( p = 0; p < N[0]; p++ ) #else for ( p = 0; p < NPART; p++ ) #endif -======= - for ( p = 0; p < NPART; p++ ) /* TODO Note: NPART should likely be N[0] if N[0] may change */ ->>>>>>> main { lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); } -- GitLab From e4bcc03e839684e709a4bb278261c1144c99e854 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 1 Jun 2023 12:42:37 +0200 Subject: [PATCH 148/381] wrap asserts in DEBUGGING --- lib_enc/fd_cng_enc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 8d89d3fa5b..5adab25943 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -1034,7 +1034,9 @@ void FdCngEncodeMDCTStereoSID( ms_ptr[ch] = &logNoiseEst[ch][0]; lr_out_ptr[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0]; } +#ifdef DEBUGGING assert( sts[0]->hFdCngEnc->npartDec == sts[1]->hFdCngEnc->npartDec ); +#endif N = sts[0]->hFdCngEnc->npartDec; set_f( weights, 1.f, NPART ); @@ -1276,7 +1278,9 @@ void FdCngEncodeDiracMDCTStereoSID( } set_f( weights, 1.f, NPART ); #ifdef FIX_TODO_FD_CNG_SBA_CLEANUP +#ifdef DEBUGGING assert ( N[0] == N[1] ); +#endif #endif /* apply log and save energy of original left and right channels */ -- GitLab From b33a0ac28670d8c8b78d580107cc550f3d376228 Mon Sep 17 00:00:00 2001 From: Jan Brouwer Date: Thu, 1 Jun 2023 14:20:20 +0200 Subject: [PATCH 149/381] add BINAURAL_ROOM_REVERB to scripts\pyivastest\constants.py --- scripts/pyivastest/constants.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/pyivastest/constants.py b/scripts/pyivastest/constants.py index 46648658c9..55f468d502 100644 --- a/scripts/pyivastest/constants.py +++ b/scripts/pyivastest/constants.py @@ -48,6 +48,7 @@ OC_TO_NCHANNELS = { "STEREO": 2, "BINAURAL": 2, "BINAURAL_ROOM_IR": 2, + "BINAURAL_ROOM_REVERB": 2, "5_1": 6, "7_1": 8, "5_1_2": 8, @@ -64,7 +65,7 @@ OC_TO_NCHANNELS = { "MASA1TC": 1, "MASA2TC": 2, } -DECODER_OUTPUT_CONFIGS = {"MONO", "STEREO", "BINAURAL", "BINAURAL_ROOM_IR", "5_1", "7_1", "5_1_4", "5_1_2", +DECODER_OUTPUT_CONFIGS = {"MONO", "STEREO", "BINAURAL", "BINAURAL_ROOM_IR", "BINAURAL_ROOM_REVERB", "5_1", "7_1", "5_1_4", "5_1_2", "7_1_4", "FOA", "HOA2", "HOA3", "EXT"} LOG_FILE_EXT = ".txt" LOG_FILE_DIR ="logs" -- GitLab From 730325703d932fd045a5780faf76209a096d21bc Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 1 Jun 2023 14:57:16 +0200 Subject: [PATCH 150/381] start at 1s offset in smoke test --- ci/smoke_test.sh | 17 +++++++++-------- scripts/pyivastest/IvasModeRunner.py | 20 ++++++++++++-------- scripts/pyivastest/IvasScriptsCommon.py | 22 +++++++++++++++++++--- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 1e758b6263..e6ccc1ffa5 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -56,6 +56,7 @@ fi cfg=./scripts/config/ci_linux.json dly_profile=./scripts/dly_error_profiles/dly_error_profile_10.dat ism_md_cmd="--metadata_files /usr/local/ltv/ltvISM1.csv /usr/local/ltv/ltvISM2.csv /usr/local/ltv/ltvISM3.csv /usr/local/ltv/ltvISM4.csv" +duration_arg="-U 1:2" if [ $BUILD -eq 1 ];then # Enable memory macros to find unbalanced memory allocations/deallocations @@ -79,20 +80,20 @@ fi ism_modes=$(./scripts/runIvasCodec.py -l | grep ISM) non_ism_modes=$(./scripts/runIvasCodec.py -l | grep -v ISM) echo "\n======================= 1. non-ism modes no FEC =======================\n\n" -./scripts/runIvasCodec.py -m $non_ism_modes -p $cfg -U 1 $WORKERS | tee smoke_test_output.txt +./scripts/runIvasCodec.py -m $non_ism_modes -p $cfg $duration_arg $WORKERS | tee smoke_test_output.txt echo "\n======================= 2. ism modes no FEC =======================\n\n" -./scripts/runIvasCodec.py -m $ism_modes -p $cfg -U 1 $WORKERS $ism_md_cmd | tee smoke_test_output.txt +./scripts/runIvasCodec.py -m $ism_modes -p $cfg $duration_arg $WORKERS $ism_md_cmd | tee smoke_test_output.txt # run the decoding again, but with 15% frame loss echo "\n======================= 3. all modes with FEC =======================\n\n" -./scripts/runIvasCodec.py -p $cfg -U 1 $WORKERS -D="-fec 15" --decoder_only | tee smoke_test_output_plc.txt +./scripts/runIvasCodec.py -p $cfg $duration_arg $WORKERS -D="-fec 15" --decoder_only | tee smoke_test_output_plc.txt # run JBM modes - EXT is excluded as not supported yet modes_with_no_ext_out=$(./scripts/runIvasCodec.py -l | grep -v MASA | grep -v ISM) modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM' | grep -v ISM+) echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" -./scripts/runIvasCodec.py -m $modes_with_no_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile | tee smoke_test_output_jbm_noEXT.txt +./scripts/runIvasCodec.py -m $modes_with_no_ext_out -p $cfg $duration_arg $WORKERS --decoder_only --jbm_file $dly_profile | tee smoke_test_output_jbm_noEXT.txt echo "\n======================= 5. JBM, modes with EXT =======================\n\n" -./scripts/runIvasCodec.py -m $modes_with_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt +./scripts/runIvasCodec.py -m $modes_with_ext_out -p $cfg $duration_arg $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt # run all modes with binaural output using external files modes_with_bin_out="SBA PlanarSBA MASA MC ISM1 ISM2 ISM3 ISM4" @@ -101,14 +102,14 @@ bin_out_modes="BINAURAL BINAURAL_ROOM" echo "\n======================= 6. binaural out with HRTF files - WB =======================\n\n" wb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _wb_) hrtf_wb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin" -./scripts/runIvasCodec.py -p $cfg -m $wb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_wb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt +./scripts/runIvasCodec.py -p $cfg -m $wb_modes $duration_arg $WORKERS -D="-hrtf ${hrtf_wb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt echo "\n======================= 7. binaural out with HRTF files - SWB =======================\n\n" swb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _swb_) hrtf_swb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin" -./scripts/runIvasCodec.py -p $cfg -m $swb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_swb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt +./scripts/runIvasCodec.py -p $cfg -m $swb_modes $duration_arg $WORKERS -D="-hrtf ${hrtf_swb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt echo "\n======================= 8. binaural out with HRTF files - FB =======================\n\n" fb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _fb_) hrtf_fb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin" -./scripts/runIvasCodec.py -p $cfg -m $fb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_fb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt +./scripts/runIvasCodec.py -p $cfg -m $fb_modes $duration_arg $WORKERS -D="-hrtf ${hrtf_fb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt diff --git a/scripts/pyivastest/IvasModeRunner.py b/scripts/pyivastest/IvasModeRunner.py index 114991c374..cabf7d424b 100644 --- a/scripts/pyivastest/IvasModeRunner.py +++ b/scripts/pyivastest/IvasModeRunner.py @@ -183,6 +183,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): self.flat_output_structure = flat_output_structure self.limit_duration = False self.max_duration = 0.0 + self.start_time = 0.0 self.encoder_cmdline_options = [] self.decoder_cmdline_options = [] self.run_encoder = True @@ -541,7 +542,7 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): str(sample_rate_in), "_", config["cmd"]["in_config"].upper(), - "_L{}s".format("_".join(str(self.max_duration).split("."))), + "_L{}-{}s".format("_".join(str(self.start_time).split(".")), "_".join(str(self.max_duration).split("."))), ".pcm", ] ) @@ -606,16 +607,19 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): # check if the given length with -U is longer than the file itself and avoid cutting then if do_limit_duration: - cut_len_samples = int(float(self.max_duration) * fs) - in_len = sig.shape[0] + # first check if start time exceeds signal length + start_time_samples = int(float(self.start_time) * fs) + if start_time_samples >= in_len: + raise RuntimeError("Signal is shorter than given start time") + + cut_len_samples = int(float(self.max_duration) * fs) - # no need to cut anything if given length is bigger than signal length - if cut_len_samples < in_len: - out_len = int(float(self.max_duration) * fs) - sig = ar.cut(sig, (0, out_len)) + if cut_len_samples + start_time_samples < in_len or start_time_samples > 0: + out_len = min(cut_len_samples, in_len - start_time_samples) + sig = ar.cut(sig, (start_time_samples, out_len)) - pcm_log.write("Limit signal length to {} samples".format(out_len)) + pcm_log.write("Limit signal length to {}:{} samples".format(start_time_samples, out_len)) af.writefile(pcm_name_cpy_transformed, sig, fs) resamp_in_path = pcm_name_cpy_transformed diff --git a/scripts/pyivastest/IvasScriptsCommon.py b/scripts/pyivastest/IvasScriptsCommon.py index a3876a2b4e..ec501d0154 100644 --- a/scripts/pyivastest/IvasScriptsCommon.py +++ b/scripts/pyivastest/IvasScriptsCommon.py @@ -242,8 +242,8 @@ class IvasScriptArgParser(argparse.ArgumentParser): "-U", "--limit_duration", default=None, - help="limit dUration of input file to X seconds", - type=float, + help="limit dUration by specifying start and end of input signal in seconds. Can be either a single float value (will be interpreted as length), or by giving as start: (will be interpreted as start), or by giving as start:end", + type=str, ) self.add_argument( "-f", "--fer_file", default="", help="frame error pattern file" @@ -548,7 +548,23 @@ def runner_setup(runner, args): if args["limit_duration"]: runner.limit_duration = True - runner.max_duration = args["limit_duration"] + + # parse given argument + arg = args["limit_duration"] + start = 0 + + try: + end = float(arg) + except ValueError: + try: + start, end = arg.split(':') + start = float(start) + end = float(end) + except ValueError: + raise ValueError(f"Given duration string {arg} is invalid") + + runner.max_duration = end + runner.start_time = start if "fer_file" in args.keys() or "ber_file" in args.keys(): # assert that the eid-xor tool is there -- GitLab From 2f37c2290f697c0aaebd26d87198302c190f5a80 Mon Sep 17 00:00:00 2001 From: kiene Date: Thu, 1 Jun 2023 16:23:20 +0200 Subject: [PATCH 151/381] use correct files in config for sidstart test --- scripts/config/ci_linux_sidstart_test.json | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/scripts/config/ci_linux_sidstart_test.json b/scripts/config/ci_linux_sidstart_test.json index 3436d9eaea..be3915efd8 100644 --- a/scripts/config/ci_linux_sidstart_test.json +++ b/scripts/config/ci_linux_sidstart_test.json @@ -2,24 +2,24 @@ "afspPath": "not_needed", "utilPath": "/tools", "inpaths": { - "MONO": "/usr/local/testv/test_mono.wav", - "STEREO": "/usr/local/testv/test_stereo.wav", + "MONO": "/usr/local/testv/stv48n.wav", + "STEREO": "/usr/local/testv/stvST48n.wav", "FOA": "/usr/local/ltv/ltv48_FOA.wav", "HOA2": "/usr/local/ltv/ltv48_HOA2.wav", "HOA3": "/usr/local/ltv/ltv48_HOA3.wav", "SBA": "/usr/local/ltv/ltv48_HOA3.wav", - "MASA1TC1DIR": "/usr/local/testv/test_MASA_1dir1TC.wav", - "MASA1TC2DIR": "/usr/local/testv/test_MASA_2dir1TC.wav", - "MASA2TC1DIR": "/usr/local/testv/test_MASA_1dir2TC.wav", - "MASA2TC2DIR": "/usr/local/testv/test_MASA_2dir2TC.wav", - "5_1": "/usr/local/testv/test_MC51.wav", - "5_1_2": "/usr/local/testv/test_MC51p2.wav", - "5_1_4": "/usr/local/testv/test_MC51p4.wav", - "7_1": "/usr/local/testv/test_MC71.wav", - "7_1_4": "/usr/local/testv/test_MC71p4.wav", - "ISM1": "/usr/local/testv/test_mono.wav", - "ISM2": "/usr/local/testv/test_ISM_2obj.wav", - "ISM3": "/usr/local/testv/test_ISM_3obj.wav", - "ISM4": "/usr/local/testv/test_ISM_4obj.wav" + "MASA1TC1DIR": "/usr/local/testv/stv1MASA1TC48n.wav", + "MASA1TC2DIR": "/usr/local/testv/stv2MASA1TC48c.wav", + "MASA2TC1DIR": "/usr/local/testv/stv1MASA2TC48n.wav", + "MASA2TC2DIR": "/usr/local/testv/stv2MASA2TC48c.wav", + "5_1": "/usr/local/testv/stv51MC48c.wav", + "5_1_2": "/usr/local/testv/stv512MC48c.wav", + "5_1_4": "/usr/local/testv/stv514MC48c.wav", + "7_1": "/usr/local/testv/stv71MC48c.wav", + "7_1_4": "/usr/local/testv/stv714MC48c.wav", + "ISM1": "/usr/local/testv/stv1ISM48s.wav", + "ISM2": "/usr/local/testv/stv2ISM48s.wav", + "ISM3": "/usr/local/testv/stv3ISM48s.wav", + "ISM4": "/usr/local/testv/stv4ISM48s.wav" } } -- GitLab From 0d5e80413e050938b4c6a7c217b84273c5562be6 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Thu, 1 Jun 2023 16:29:56 +0200 Subject: [PATCH 152/381] Updates reflecting the discussion on issue #196 --- lib_dec/ivas_output_config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 6cc176d099..a904145688 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -86,7 +86,11 @@ void ivas_renderer_select( { if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB) +#else if ( output_config == AUDIO_CONFIG_BINAURAL ) +#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; } -- GitLab From 52ac081159252e6a84f4baacf3c00baf055139e1 Mon Sep 17 00:00:00 2001 From: malenov Date: Thu, 1 Jun 2023 16:58:44 +0200 Subject: [PATCH 153/381] - replace assert() with warning message when hitting memory limit in the buffer of indices - improve error handling --- lib_com/bitstream.c | 81 ++++++++++++++++++++++++++++++++++++++++- lib_com/options.h | 3 ++ lib_com/prot.h | 12 ++++++ lib_enc/ivas_init_enc.c | 2 - lib_enc/lib_enc.c | 4 -- 5 files changed, 95 insertions(+), 7 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index c9571d41c1..a7f6c896bb 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -907,16 +907,22 @@ int16_t get_ivas_max_num_indices_metadata( /* o * Move indices inside the buffer or among two buffers *-------------------------------------------------------------------*/ +#ifdef FIX_545_ASSERT +void move_indices( +#else ivas_error move_indices( +#endif INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ const int16_t nb_indices /* i : number of moved indices */ ) { int16_t i; +#ifndef FIX_545_ASSERT ivas_error error; error = IVAS_ERR_OK; +#endif if ( new_ind_list < old_ind_list ) { @@ -941,7 +947,11 @@ ivas_error move_indices( } } +#ifdef FIX_545_ASSERT + return; +#else return error; +#endif } #endif @@ -969,13 +979,24 @@ ivas_error check_ind_list_limits( if ( ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ) >= *( hBstr->ivas_max_num_indices ) ) { #ifdef DEBUGGING +#ifdef FIX_545_ASSERT + fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); +#else /* TODO: replace with the warning message below before the finalization of the IVAS codec */ /* fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); */ assert( 0 && "The maximum number of indices has been exceeded! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata()." ); +#endif #endif /* reallocate the buffer of indices with increased limit */ +#ifdef FIX_545_ASSERT + if ( ( error = ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ) ) != IVAS_ERR_OK ) + { + return error; + } +#else ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ); +#endif } /* check, if we will not overwrite an existing indice */ @@ -996,13 +1017,24 @@ ivas_error check_ind_list_limits( if ( hBstr->ind_list >= ivas_ind_list_last ) { #ifdef DEBUGGING +#ifdef FIX_545_ASSERT + fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); +#else /* TODO: replace with the warning message below before the finalization of the IVAS codec */ /* fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); */ assert( 0 && "The maximum number of indices has been exceeded! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata()." ); +#endif #endif /* no available empty slot -> need to re-allocate the buffer */ +#ifdef FIX_545_ASSERT + if ( ( error = ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ) ) != IVAS_ERR_OK ) + { + return error; + } +#else ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ); +#endif } } else @@ -1080,8 +1112,15 @@ ivas_error push_indice( #ifdef IND_LIST_DYN /* check the limits of the list of indices */ +#ifdef FIX_545_ASSERT + if ( ( error = check_ind_list_limits( hBstr )) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n", frame ); + } +#else error = check_ind_list_limits( hBstr ); #endif +#endif #ifdef IND_LIST_DYN /* find the location in the list of indices based on ID */ @@ -1203,8 +1242,15 @@ ivas_error push_next_indice( #ifdef IND_LIST_DYN /* check the limits of the list of indices */ +#ifdef FIX_545_ASSERT + if ( ( error = check_ind_list_limits( hBstr )) != IVAS_ERR_OK ) + { + return error; + } +#else error = check_ind_list_limits( hBstr ); #endif +#endif #ifdef IND_LIST_DYN /* get the id of the previous indice -> it will be re-used */ @@ -1246,9 +1292,17 @@ ivas_error push_next_indice( *-------------------------------------------------------------------*/ #ifdef DEBUG_BS_READ_WRITE +#ifdef FIX_545_ASSERT +ivas_error push_next_bits_( +#else void push_next_bits_( +#endif +#else +#ifdef FIX_545_ASSERT +ivas_error push_next_bits( #else void push_next_bits( +#endif #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const uint16_t bits[], /* i : bit buffer to pack, sequence of single bits */ @@ -1265,6 +1319,11 @@ void push_next_bits( Indice *ptr; #ifdef IND_LIST_DYN int16_t prev_id; +#ifdef FIX_545_ASSERT + ivas_error error; + + error = IVAS_ERR_OK; +#endif #endif #ifdef DEBUG_BS_READ_WRITE printf( "%s: %d: %d\n", func, line, nb_bits ); @@ -1293,7 +1352,14 @@ void push_next_bits( #ifdef IND_LIST_DYN /* check the limits of the list of indices */ +#ifdef FIX_545_ASSERT + if ( ( error = check_ind_list_limits( hBstr )) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); + } +#else check_ind_list_limits( hBstr ); +#endif ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; #endif @@ -1313,7 +1379,14 @@ void push_next_bits( { #ifdef IND_LIST_DYN /* check the limits of the list of indices */ +#ifdef FIX_545_ASSERT + if ( ( error = check_ind_list_limits( hBstr )) != IVAS_ERR_OK ) + { + return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); + } +#else check_ind_list_limits( hBstr ); +#endif ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; #endif @@ -1334,7 +1407,11 @@ void push_next_bits( #endif hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; +#ifdef FIX_545_ASSERT + return error; +#else return; +#endif } @@ -1535,10 +1612,12 @@ uint16_t get_indice( { uint16_t value; int16_t i; + int32_t nbits_total; assert( nb_bits <= 16 ); - int32_t nbits_total; + nbits_total = st->total_brate / FRAMES_PER_SEC; + /* detect corrupted bitstream */ if ( pos + nb_bits > nbits_total ) { diff --git a/lib_com/options.h b/lib_com/options.h index 8a491e2499..fabf8f14c3 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -228,6 +228,9 @@ #define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */ #define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ #define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ +#ifdef IND_LIST_DYN +#define FIX_545_ASSERT /* VA: fix issue 545, replace assert() with warning message when hitting memory limit in the buffer of indices */ +#endif #define FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER /* ..\apps\renderer.c(240): .... (todo: implementation)",*/ #define REMOVE_OBS_CODE /* FhG: Remove unnecessary assignement after LFE cleanup (Issue #451)*/ diff --git a/lib_com/prot.h b/lib_com/prot.h index e6f371c468..23c3b98756 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -505,9 +505,17 @@ ivas_error push_next_indice( #ifdef DEBUG_BS_READ_WRITE #define push_next_bits( ... ) push_next_bits_( __VA_ARGS__, __LINE__, __func__ ) +#ifdef FIX_545_ASSERT +ivas_error push_next_bits_( +#else void push_next_bits_( +#endif +#else +#ifdef FIX_545_ASSERT +ivas_error push_next_bits( #else void push_next_bits( +#endif #endif BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const uint16_t bits[], /* i : bit buffer to pack, sequence of single bits */ @@ -548,7 +556,11 @@ ivas_error check_ind_list_limits( BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ ); +#ifdef FIX_545_ASSERT +void move_indices( +#else ivas_error move_indices( +#endif INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ const int16_t nb_indices /* i : number of moved indices */ diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 006fb176fb..5591b12f40 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -329,8 +329,6 @@ ivas_error ivas_init_encoder( #ifndef IND_LIST_DYN , Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */ -#endif -#ifndef IND_LIST_DYN , Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ #endif diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 37c3e57ab5..453d74ea03 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -52,8 +52,6 @@ struct IVAS_ENC Encoder_Struct *st_ivas; #ifndef IND_LIST_DYN Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ -#endif -#ifndef IND_LIST_DYN Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ #endif ENC_CORE_HANDLE hCoreCoder; @@ -941,8 +939,6 @@ static ivas_error configureEncoder( #ifndef IND_LIST_DYN , hIvasEnc->ind_list -#endif -#ifndef IND_LIST_DYN , hIvasEnc->ind_list_metadata #endif -- GitLab From 4c11b96727b40cc67ad1a10991c4d42d13f866b8 Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Thu, 1 Jun 2023 17:04:07 +0200 Subject: [PATCH 154/381] Updated from main [59b30768]. --- Workspace_msvc/lib_dec.vcxproj | 2 + Workspace_msvc/lib_dec.vcxproj.filters | 6 + Workspace_msvc/lib_enc.vcxproj | 1 + Workspace_msvc/lib_enc.vcxproj.filters | 3 + Workspace_msvc/lib_util.vcxproj | 2 + apps/decoder.c | 919 ++- apps/encoder.c | 47 +- apps/renderer.c | 112 +- ci/run_evs_be_win_test.py | 149 + ci/smoke_test.sh | 15 +- lib_com/bits_alloc.c | 78 +- lib_com/bitstream.c | 1278 ++- lib_com/cnst.h | 22 +- lib_com/common_api_types.h | 12 + lib_com/delay_comp.c | 1 - lib_com/disclaimer.c | 2 + lib_com/fd_cng_com.c | 69 + lib_com/fft.c | 10 - lib_com/gs_bitallocation.c | 2 +- lib_com/hq_tools.c | 1 - lib_com/ivas_cnst.h | 189 +- lib_com/ivas_cov_smooth.c | 64 +- lib_com/ivas_dirac_com.c | 599 +- lib_com/ivas_error.h | 73 +- lib_com/ivas_fb_mixer.c | 71 +- lib_com/ivas_ism_com.c | 32 +- lib_com/ivas_masa_com.c | 401 +- lib_com/ivas_mc_com.c | 6 +- lib_com/ivas_mdft_imdft.c | 2 - lib_com/ivas_pca_tools.c | 2 +- lib_com/ivas_prot.h | 864 +- lib_com/ivas_qmetadata_com.c | 60 +- lib_com/ivas_qspherical_com.c | 8 +- lib_com/ivas_rom_com.c | 1455 ++-- lib_com/ivas_rom_com.h | 40 +- lib_com/ivas_sba_config.c | 84 +- lib_com/ivas_sns_com.c | 37 +- lib_com/ivas_spar_com.c | 237 +- lib_com/ivas_stat_com.h | 39 +- lib_com/ivas_stereo_td_bit_alloc.c | 6 - lib_com/ivas_td_decorr.c | 126 +- lib_com/ivas_tools.c | 56 +- lib_com/lsf_tools.c | 44 +- lib_com/options.h | 114 +- lib_com/prot.h | 204 +- lib_com/rom_com.c | 214 +- lib_com/rom_com.h | 5 - lib_com/stl.h | 2 +- lib_com/tools.c | 9 + lib_debug/debug.c | 1 + lib_debug/sba_debug.c | 26 +- lib_debug/sba_debug.h | 3 +- lib_dec/acelp_core_dec.c | 34 +- lib_dec/acelp_core_switch_dec.c | 4 - lib_dec/cng_dec.c | 5 - lib_dec/core_switching_dec.c | 2 +- lib_dec/dec_tcx.c | 4 +- lib_dec/dlpc_stoch.c | 14 - lib_dec/er_dec_tcx.c | 21 +- lib_dec/evs_dec.c | 4 - lib_dec/fd_cng_dec.c | 195 +- lib_dec/gs_dec.c | 7 +- lib_dec/init_dec.c | 5 +- lib_dec/ivas_binRenderer_internal.c | 289 +- lib_dec/ivas_core_dec.c | 10 - lib_dec/ivas_corecoder_dec_reconfig.c | 5 + lib_dec/ivas_cpe_dec.c | 11 +- lib_dec/ivas_dec.c | 320 +- lib_dec/ivas_dirac_dec.c | 2692 +++++-- lib_dec/ivas_dirac_decorr_dec.c | 2 +- lib_dec/ivas_dirac_output_synthesis_cov.c | 121 +- lib_dec/ivas_dirac_output_synthesis_dec.c | 661 +- lib_dec/ivas_init_dec.c | 247 +- lib_dec/ivas_ism_dec.c | 165 +- lib_dec/ivas_ism_dtx_dec.c | 48 +- lib_dec/ivas_ism_metadata_dec.c | 192 +- lib_dec/ivas_ism_param_dec.c | 993 ++- lib_dec/ivas_ism_renderer.c | 127 +- lib_dec/ivas_jbm_dec.c | 1867 +++++ lib_dec/ivas_masa_dec.c | 489 +- lib_dec/ivas_mc_param_dec.c | 646 +- lib_dec/ivas_mc_paramupmix_dec.c | 693 ++ lib_dec/ivas_mcmasa_dec.c | 14 +- lib_dec/ivas_mct_dec.c | 249 +- lib_dec/ivas_mdct_core_dec.c | 74 +- lib_dec/ivas_objectRenderer_internal.c | 169 +- lib_dec/ivas_out_setup_conversion.c | 64 +- lib_dec/ivas_output_config.c | 96 +- lib_dec/ivas_pca_dec.c | 4 +- lib_dec/ivas_qmetadata_dec.c | 1394 +++- lib_dec/ivas_rom_dec.c | 297 +- lib_dec/ivas_rom_dec.h | 28 +- lib_dec/ivas_sba_dec.c | 396 +- lib_dec/ivas_sba_dirac_stereo_dec.c | 56 +- lib_dec/ivas_sba_rendering_internal.c | 142 +- lib_dec/ivas_sce_dec.c | 21 +- lib_dec/ivas_sns_dec.c | 114 +- lib_dec/ivas_spar_decoder.c | 802 +- lib_dec/ivas_spar_md_dec.c | 513 +- lib_dec/ivas_stat_dec.h | 128 +- lib_dec/ivas_stereo_cng_dec.c | 8 - lib_dec/ivas_stereo_dft_dec.c | 18 +- lib_dec/ivas_stereo_icbwe_dec.c | 2 +- lib_dec/ivas_stereo_mdct_stereo_dec.c | 3 + lib_dec/ivas_stereo_switching_dec.c | 3 +- lib_dec/ivas_vbap.c | 4 +- lib_dec/jbm_jb4sb.h | 8 + lib_dec/jbm_pcmdsp_apa.c | 264 +- lib_dec/jbm_pcmdsp_apa.h | 14 + lib_dec/jbm_pcmdsp_fifo.c | 54 + lib_dec/jbm_pcmdsp_fifo.h | 6 + lib_dec/jbm_pcmdsp_similarityestimation.c | 42 + lib_dec/jbm_pcmdsp_similarityestimation.h | 42 +- lib_dec/jbm_pcmdsp_window.c | 65 +- lib_dec/jbm_pcmdsp_window.h | 6 +- lib_dec/lib_dec.c | 1357 +++- lib_dec/lib_dec.h | 69 +- lib_dec/lsf_dec.c | 37 +- lib_dec/lsf_msvq_ma_dec.c | 12 - lib_dec/stat_dec.h | 36 +- lib_dec/swb_bwe_dec.c | 6 +- lib_dec/swb_tbe_dec.c | 4 - lib_enc/acelp_core_enc.c | 35 +- lib_enc/acelp_core_switch_enc.c | 21 +- lib_enc/cng_enc.c | 12 +- lib_enc/core_switching_enc.c | 2 +- lib_enc/dtx.c | 16 +- lib_enc/enc_ppp.c | 9 +- lib_enc/eval_pit_contr.c | 8 + lib_enc/evs_enc.c | 8 +- lib_enc/ext_sig_ana.c | 8 +- lib_enc/fd_cng_enc.c | 105 +- lib_enc/igf_enc.c | 82 + lib_enc/init_enc.c | 16 +- lib_enc/ivas_agc_enc.c | 2 - lib_enc/ivas_core_enc.c | 25 +- lib_enc/ivas_core_pre_proc_front.c | 7 + lib_enc/ivas_corecoder_enc_reconfig.c | 180 +- lib_enc/ivas_cpe_enc.c | 36 +- lib_enc/ivas_dirac_enc.c | 380 +- lib_enc/ivas_enc.c | 41 +- lib_enc/ivas_enc_cov_handler.c | 48 +- lib_enc/ivas_entropy_coder.c | 165 +- lib_enc/ivas_front_vad.c | 6 +- lib_enc/ivas_init_enc.c | 198 +- lib_enc/ivas_ism_dtx_enc.c | 19 +- lib_enc/ivas_ism_enc.c | 26 +- lib_enc/ivas_ism_metadata_enc.c | 364 +- lib_enc/ivas_ism_param_enc.c | 85 +- lib_enc/ivas_lfe_enc.c | 32 +- lib_enc/ivas_masa_enc.c | 184 +- lib_enc/ivas_mc_param_enc.c | 30 +- lib_enc/ivas_mc_paramupmix_enc.c | 858 ++ lib_enc/ivas_mcmasa_enc.c | 52 +- lib_enc/ivas_mct_core_enc.c | 21 +- lib_enc/ivas_mct_enc.c | 109 +- lib_enc/ivas_mct_enc_mct.c | 19 + lib_enc/ivas_mdct_core_enc.c | 91 +- lib_enc/ivas_qmetadata_enc.c | 1529 +++- lib_enc/ivas_qspherical_enc.c | 85 +- lib_enc/ivas_rom_enc.c | 115 + lib_enc/ivas_rom_enc.h | 3 + lib_enc/ivas_sba_enc.c | 171 +- lib_enc/ivas_sce_enc.c | 18 +- lib_enc/ivas_sns_enc.c | 229 +- lib_enc/ivas_spar_encoder.c | 301 +- lib_enc/ivas_spar_md_enc.c | 594 +- lib_enc/ivas_stat_enc.h | 68 +- lib_enc/ivas_stereo_cng_enc.c | 8 - lib_enc/ivas_stereo_dft_enc.c | 14 +- lib_enc/ivas_stereo_dft_enc_itd.c | 44 +- lib_enc/ivas_stereo_dft_td_itd.c | 9 +- lib_enc/ivas_stereo_mdct_core_enc.c | 15 +- lib_enc/ivas_stereo_mdct_stereo_enc.c | 4 + lib_enc/ivas_stereo_td_enc.c | 54 + lib_enc/lib_enc.c | 203 +- lib_enc/lib_enc.h | 7 + lib_enc/lsf_enc.c | 42 +- lib_enc/lsf_msvq_ma_enc.c | 686 +- lib_enc/nois_est.c | 15 + lib_enc/pre_proc.c | 1 - lib_enc/qlpc_stoch.c | 8 - lib_enc/speech_music_classif.c | 12 +- lib_enc/stat_enc.h | 27 +- lib_enc/tcx_utils_enc.c | 23 +- lib_enc/transition_enc.c | 8 - lib_enc/voiced_enc.c | 1 - lib_rend/ivas_crend.c | 530 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 1128 +-- lib_rend/ivas_hrtf.c | 4 + lib_rend/ivas_limiter.c | 12 +- lib_rend/ivas_objectRenderer.c | 168 +- lib_rend/ivas_objectRenderer_hrFilt.c | 12 +- lib_rend/ivas_objectRenderer_sfx.c | 14 +- lib_rend/ivas_objectRenderer_sources.c | 13 +- lib_rend/ivas_orient_trk.c | 67 +- lib_rend/ivas_prot_rend.h | 133 +- lib_rend/ivas_reverb.c | 118 +- lib_rend/ivas_rom_binauralRenderer.c | 7068 +++++++++++++++++ lib_rend/ivas_rom_binauralRenderer.h | 14 + lib_rend/ivas_rom_binaural_crend_head.c | 1247 ++- lib_rend/ivas_rom_binaural_crend_head.h | 161 + lib_rend/ivas_rotation.c | 59 +- lib_rend/ivas_sba_rendering.c | 74 +- lib_rend/ivas_stat_rend.h | 36 +- lib_rend/lib_rend.c | 242 +- lib_rend/lib_rend.h | 17 +- lib_util/audio_file_writer.c | 1 - lib_util/cmdln_parser.c | 7 +- lib_util/hrtf_file_reader.c | 160 + lib_util/ism_file_reader.c | 14 +- lib_util/ism_file_writer.c | 9 +- lib_util/masa_file_reader.c | 11 +- lib_util/tinywaveout_c.h | 45 +- lib_util/tsm_scale_file_reader.c | 148 + lib_util/tsm_scale_file_reader.h | 67 + readme.txt | 113 +- scripts/README.md | 224 - scripts/batch_comp_audio.py | 13 +- .../HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa | 3 + .../HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa | 3 + .../HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa | 3 + .../generate_tables_from_rom_to_bin.c | 284 +- .../tables_format_converter_readme.txt | 60 + .../ivas_binaural_16kHz.bin | 4 +- .../ivas_binaural_32kHz.bin | 4 +- .../ivas_binaural_48kHz.bin | 4 +- .../generate_crend_ivas_tables_from_sofa.c | 49 +- scripts/config/ci_linux_sidstart_test.json | 25 + scripts/config/ivas_modes.json | 706 ++ scripts/config/self_test.prm | 19 + scripts/cut_bs.py | 51 +- scripts/prepare_instrumentation.sh | 3 +- scripts/prepare_mem_dryrun.py | 3 +- scripts/pyaudio3dtools/__init__.py | 5 - scripts/pyaudio3dtools/audio3dtools.py | 241 +- scripts/pyaudio3dtools/audioarray.py | 10 +- scripts/pyaudio3dtools/audiofile.py | 24 +- scripts/pyivastest/IvasModeAnalyzer.py | 3 +- scripts/pyivastest/IvasScriptsCommon.py | 18 + scripts/runIvasCodec.py | 21 +- scripts/switchPaths/sw_13k2_128k.bin | 3 + scripts/switchPaths/sw_13k2_256k.bin | 3 + scripts/switchPaths/sw_16k4_128k.bin | 3 + scripts/switchPaths/sw_16k4_256k.bin | 3 + scripts/switchPaths/sw_24k4_256k_1.bin | 3 + scripts/switchPaths/sw_24k4_384k.bin | 3 + scripts/switchPaths/sw_24k4_512k.bin | 3 + scripts/switchPaths/sw_32k_128k.bin | 3 + scripts/switchPaths/sw_32k_256k.bin | 3 + scripts/switchPaths/sw_32k_384k.bin | 3 + scripts/switchPaths/sw_32k_512k.bin | 3 + scripts/testv/stvISM1.csv | 3000 +++---- scripts/testv/stvISM2.csv | 3000 +++---- scripts/testv/stvISM3.csv | 3000 +++---- scripts/testv/stvISM4.csv | 3000 +++---- .../testv/stvISM_with_no_diegetic_switch.csv | 1500 ++++ tests/conftest.py | 4 - tests/renderer/README.md | 4 + tests/renderer/__init__.py | 2 +- tests/renderer/compare_audio.py | 2 +- tests/renderer/constants.py | 9 +- tests/renderer/data/ism_0a_0e.csv | 1499 ++-- tests/renderer/test_renderer.py | 19 +- tests/renderer/test_renderer_be_comparison.py | 21 +- tests/renderer/utils.py | 61 +- tests/test_sba_bs_dec_plc.py | 32 +- tests/test_sba_bs_enc.py | 131 +- 268 files changed, 46988 insertions(+), 13693 deletions(-) create mode 100644 ci/run_evs_be_win_test.py mode change 100644 => 100755 lib_com/bitstream.c mode change 100755 => 100644 lib_com/ivas_prot.h mode change 100644 => 100755 lib_com/rom_com.c mode change 100644 => 100755 lib_dec/ivas_cpe_dec.c mode change 100644 => 100755 lib_dec/ivas_dirac_output_synthesis_dec.c create mode 100644 lib_dec/ivas_jbm_dec.c create mode 100644 lib_dec/ivas_mc_paramupmix_dec.c mode change 100644 => 100755 lib_dec/ivas_mct_dec.c mode change 100644 => 100755 lib_dec/ivas_spar_decoder.c mode change 100644 => 100755 lib_dec/ivas_spar_md_dec.c create mode 100644 lib_enc/ivas_mc_paramupmix_enc.c mode change 100644 => 100755 lib_enc/ivas_mct_core_enc.c mode change 100644 => 100755 lib_enc/ivas_stereo_mdct_stereo_enc.c mode change 100644 => 100755 lib_enc/lib_enc.c mode change 100644 => 100755 lib_enc/stat_enc.h create mode 100644 lib_util/tsm_scale_file_reader.c create mode 100644 lib_util/tsm_scale_file_reader.h create mode 100644 scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa create mode 100644 scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa create mode 100644 scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa create mode 100644 scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt create mode 100644 scripts/config/ci_linux_sidstart_test.json mode change 100644 => 100755 scripts/prepare_mem_dryrun.py create mode 100644 scripts/switchPaths/sw_13k2_128k.bin create mode 100644 scripts/switchPaths/sw_13k2_256k.bin create mode 100644 scripts/switchPaths/sw_16k4_128k.bin create mode 100644 scripts/switchPaths/sw_16k4_256k.bin create mode 100644 scripts/switchPaths/sw_24k4_256k_1.bin create mode 100644 scripts/switchPaths/sw_24k4_384k.bin create mode 100644 scripts/switchPaths/sw_24k4_512k.bin create mode 100644 scripts/switchPaths/sw_32k_128k.bin create mode 100644 scripts/switchPaths/sw_32k_256k.bin create mode 100644 scripts/switchPaths/sw_32k_384k.bin create mode 100644 scripts/switchPaths/sw_32k_512k.bin create mode 100644 scripts/testv/stvISM_with_no_diegetic_switch.csv diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index e1c0f9ead1..80910aa5e7 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -282,6 +282,7 @@ + @@ -290,6 +291,7 @@ + diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index d1dedc413c..6284884920 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -518,6 +518,12 @@ dec_ivas_c + + dec_ivas_c + + + dec_ivas_c + diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 15f0d53574..3378ac10f0 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -213,6 +213,7 @@ + diff --git a/Workspace_msvc/lib_enc.vcxproj.filters b/Workspace_msvc/lib_enc.vcxproj.filters index 21941038ec..b3970764c0 100644 --- a/Workspace_msvc/lib_enc.vcxproj.filters +++ b/Workspace_msvc/lib_enc.vcxproj.filters @@ -587,6 +587,9 @@ enc_ivas_c + + enc_ivas_c + diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 5b5e5f30cc..72ff2dfe61 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -158,6 +158,7 @@ + @@ -183,6 +184,7 @@ + diff --git a/apps/decoder.c b/apps/decoder.c index 22dc235fff..7ceda8f6f3 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -45,6 +45,9 @@ #include "vector3_pair_file_reader.h" #include "jbm_file_writer.h" #include "evs_rtp_payload.h" +#ifdef VARIABLE_SPEED_DECODING +#include "tsm_scale_file_reader.h" +#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -76,6 +79,13 @@ static #define IVAS_PUBLIC_ORIENT_TRK_REF_VEC ( 3 ) #define IVAS_PUBLIC_ORIENT_TRK_REF_VEC_LEV ( 4 ) +#ifdef VARIABLE_SPEED_DECODING +#define VARIABLE_SPEED_FETCH_FRAMESIZE_MS 20 +#endif +#ifdef JBM_TSM_ON_TCS +#define JBM_FRONTEND_FETCH_FRAMESIZE_MS 20 +#endif + typedef struct { char *inputBitstreamFilename; @@ -106,16 +116,31 @@ typedef struct bool customLsOutputEnabled; char *customLsSetupFilename; int16_t orientation_tracking; - float no_diegetic_pan; + int16_t Opt_non_diegetic_pan; + float non_diegetic_pan_gain; bool renderConfigEnabled; char *renderConfigFilename; + IVAS_DEC_COMPLEXITY_LEVEL complexityLevel; #ifdef DEBUGGING IVAS_DEC_FORCED_REND_MODE forcedRendMode; #ifdef DEBUG_FOA_AGC FILE *agcBitstream; /* temporary */ #endif - +#ifdef DEBUG_JBM_CMD_OPTION + bool noBadFrameDelay; +#endif +#ifdef VARIABLE_SPEED_DECODING + bool variableSpeedMode; + bool tsmScaleFileEnabled; + char *tsmScaleFileName; + uint16_t tsmScale; +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + uint16_t frontendFetchSizeMs; +#endif +#endif #endif } DecArguments; @@ -130,6 +155,9 @@ static void usage_dec( void ); static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); #ifdef DEBUGGING +#ifdef VARIABLE_SPEED_DECODING +static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); +#endif static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); static int16_t app_own_random( int16_t *seed ); static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( char *forcedRendModeChar ); @@ -190,7 +218,11 @@ int main( * Open decoder handle *------------------------------------------------------------------------------------------*/ - if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.orientation_tracking, arg.no_diegetic_pan ) ) != IVAS_ERR_OK ) +#ifdef FIX_439_OTR_PARAMS + if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.orientation_tracking ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "Open failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -354,13 +386,52 @@ int main( /*------------------------------------------------------------------------------------------* * Configure the decoder *------------------------------------------------------------------------------------------*/ +#ifdef FIX_356_ISM_METADATA_SYNC +#ifdef FIX_439_OTR_PARAMS + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) +#endif +#else +#ifdef FIX_439_OTR_PARAMS + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK ) +#endif +#endif - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } +#ifdef JBM_TSM_ON_TCS + /*------------------------------------------------------------------------------------------* + * Configure VoIP mode + *------------------------------------------------------------------------------------------*/ + + if ( arg.voipMode ) + { + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING + else if ( arg.variableSpeedMode ) + { + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VARIABLE_SPEED, arg.tsmScale, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nCould not enable Variable Play Speed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif +#endif +#endif + #ifdef DEBUGGING /*-----------------------------------------------------------------* * Preview bitstream and print config information @@ -391,6 +462,22 @@ int main( BS_Reader_Rewind( hBsReader ); IVAS_DEC_PrintConfigWithBitstream( hIvasDec, arg.quietModeEnabled, bit_stream, num_bits ); + +#ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING + if ( arg.variableSpeedMode ) + { + if ( arg.tsmScaleFileEnabled ) + { + fprintf( stdout, "Variable speed file: %s\n", arg.tsmScaleFileName ); + } + else + { + fprintf( stdout, "Variable speed factor: %i\n", arg.tsmScale ); + } + } +#endif +#endif } /*------------------------------------------------------------------------------------------* @@ -514,7 +601,11 @@ int main( if ( arg.hrtfReaderEnabled ) { +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; +#else IVAS_DEC_HRTF_HANDLE hHrtfTD; +#endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); @@ -525,7 +616,11 @@ int main( } +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; +#else IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; +#endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) @@ -533,14 +628,22 @@ int main( fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfCRendFileName ); goto cleanup; } +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL; +#else IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; +#endif IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv ); if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfCRendFileName ); } +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL; +#else IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; +#endif IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin ); if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) @@ -555,15 +658,27 @@ int main( if ( arg.voipMode ) { - +#ifndef JBM_TSM_ON_TCS +#ifdef VARIABLE_SPEED_DECODING + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } - +#endif error = decodeVoIP( arg, hBsReader, hIvasDec ); } +#ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING + else if ( arg.variableSpeedMode ) + { + error = decodeVariableSpeed( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec ); + } +#endif +#endif else { error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); @@ -611,10 +726,18 @@ cleanup: if ( arg.hrtfReaderEnabled ) { +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; +#else IVAS_DEC_HRTF_HANDLE hHrtfTD; +#endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); dealloc_HRTF_binary( hHrtfTD ); +#ifdef UPDATE_SBA_FILTER + IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; +#else IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; +#endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); destroy_SetOfHRTF( hSetOfHRTF ); } @@ -757,6 +880,7 @@ static bool parseCmdlIVAS_dec( arg->quietModeEnabled = false; arg->delayCompensationEnabled = true; arg->voipMode = false; + arg->complexityLevel = IVAS_DEC_COMPLEXITY_LEVEL_THREE; arg->enableHeadRotation = false; arg->headrotTrajFileName = NULL; @@ -787,7 +911,25 @@ static bool parseCmdlIVAS_dec( arg->renderConfigFilename = NULL; arg->inputFormat = IVAS_DEC_INPUT_FORMAT_G192; - arg->no_diegetic_pan = 0.f; + arg->Opt_non_diegetic_pan = 0; + arg->non_diegetic_pan_gain = 0.f; + +#ifdef DEBUGGING +#ifdef VARIABLE_SPEED_DECODING + arg->variableSpeedMode = false; + arg->tsmScale = 100; + arg->tsmScaleFileEnabled = false; + arg->tsmScaleFileName = NULL; +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + arg->frontendFetchSizeMs = JBM_FRONTEND_FETCH_FRAMESIZE_MS; +#endif +#endif +#ifdef DEBUG_JBM_CMD_OPTION + arg->noBadFrameDelay = false; +#endif +#endif /*-----------------------------------------------------------------* * Initialization @@ -913,6 +1055,67 @@ static bool parseCmdlIVAS_dec( } #endif /* #ifdef DEBUG_MODE_INFO_TWEAK */ #endif /* #ifdef DEBUG_MODE_INFO */ +#ifdef DEBUG_JBM_CMD_OPTION + else if ( strcmp( argv_to_upper, "-VOIP_NO_BAD_FRAME" ) == 0 ) + { + arg->noBadFrameDelay = true; + i++; + } +#endif +#ifdef VARIABLE_SPEED_DECODING + else if ( strcmp( argv_to_upper, "-VS" ) == 0 ) + { + i++; + int32_t tmp = 100; + arg->variableSpeedMode = true; + if ( i < argc - 3 ) + { + if ( !is_digits_only( argv[i] ) ) + { + arg->tsmScaleFileEnabled = true; + arg->tsmScaleFileName = argv[i]; + i++; + } + else + { + if ( ( sscanf( argv[i], "%d", &tmp ) > 0 ) ) + { + i++; + } + } + arg->tsmScale = (uint16_t) tmp; + + if ( arg->tsmScale < 50 || arg->tsmScale > 150 ) + { + fprintf( stderr, "Error: Scaling factor value must be 50 <= fac <= 150!\n\n" ); + usage_dec(); + return false; + } + } + } +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + else if ( strcmp( argv_to_upper, "-VOIP_FRAMESIZE" ) == 0 ) + { + i++; + int32_t tmp; + if ( i < argc - 3 ) + { + if ( !is_digits_only( argv[i] ) ) + { + return false; + } + + if ( sscanf( argv[i], "%d", &tmp ) > 0 ) + { + i++; + } + arg->frontendFetchSizeMs = (uint16_t) tmp; + } + } +#endif +#endif #endif /* #ifdef DEBUGGING */ else if ( strcmp( argv_to_upper, "-MIME" ) == 0 ) @@ -1013,44 +1216,55 @@ static bool parseCmdlIVAS_dec( } i += 2; } - else if ( strcmp( argv_to_upper, "-NO_DIEGETIC_PAN" ) == 0 ) + else if ( strcmp( argv_to_upper, "-NON_DIEGETIC_PAN" ) == 0 ) { i++; - - if ( argc - i <= 4 || argv[i][0] == '-' ) - { - fprintf( stderr, "Error: Argument for panning option not specified!\n\n" ); - usage_dec(); - return false; - } - + arg->Opt_non_diegetic_pan = 1; strncpy( argv_to_upper, argv[i], sizeof( argv_to_upper ) - 1 ); argv_to_upper[sizeof( argv_to_upper ) - 1] = '\0'; + to_upper( argv_to_upper ); if ( ( strcmp( argv_to_upper, "CENTER" ) == 0 ) || ( strchr( argv_to_upper, 'C' ) != NULL ) ) { - arg->no_diegetic_pan = 0.f; + arg->non_diegetic_pan_gain = 0.f; } else if ( ( strcmp( argv_to_upper, "LEFT" ) == 0 ) || ( strchr( argv_to_upper, 'L' ) != NULL ) ) { - arg->no_diegetic_pan = -1.f; + arg->non_diegetic_pan_gain = 1.f; } else if ( ( strcmp( argv_to_upper, "RIGHT" ) == 0 ) || ( strchr( argv_to_upper, 'R' ) != NULL ) ) { - arg->no_diegetic_pan = 1.f; + arg->non_diegetic_pan_gain = -1.f; } else { - arg->no_diegetic_pan = (float) atof( argv_to_upper ); + arg->non_diegetic_pan_gain = (float) atof( argv_to_upper ) / 90.f; - if ( arg->no_diegetic_pan > 1.0f || arg->no_diegetic_pan < -1.0f ) + if ( arg->non_diegetic_pan_gain > 1.0f || arg->non_diegetic_pan_gain < -1.0f ) { - fprintf( stderr, "Error: Incorrect value for panning option argument specified: %s\n\n", argv[i] ); + fprintf( stderr, "Error: Incorrect value for panning gain value specified: %s\n\n", argv[i] ); usage_dec(); return false; } } i++; } + else if ( strcmp( argv_to_upper, "-LEVEL" ) == 0 ) + { + int16_t level; + + ++i; + level = (int16_t) atoi( argv[i++] ); + if ( level < IVAS_DEC_COMPLEXITY_LEVEL_ONE || level > IVAS_DEC_COMPLEXITY_LEVEL_THREE ) + { + fprintf( stdout, "Invalid complexity level specified.\n" ); + usage_dec(); + return false; + } + else if ( level == IVAS_DEC_COMPLEXITY_LEVEL_ONE || level == IVAS_DEC_COMPLEXITY_LEVEL_TWO ) + { + fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); + } + } /*-----------------------------------------------------------------* * Option not recognized @@ -1079,11 +1293,21 @@ static bool parseCmdlIVAS_dec( arg->customLsSetupFilename = argv[i]; } i++; + if ( ( arg->Opt_non_diegetic_pan ) && ( arg->outputFormat != IVAS_DEC_OUTPUT_STEREO ) ) + { + fprintf( stderr, "Error: non-diegetic panning is supported in stereo only\n\n" ); + usage_dec(); + return false; + } } else { arg->outputFormat = IVAS_DEC_OUTPUT_MONO; arg->decMode = IVAS_DEC_MODE_EVS; + if ( ( arg->Opt_non_diegetic_pan ) ) + { + arg->outputFormat = IVAS_DEC_OUTPUT_STEREO; + } } /*-----------------------------------------------------------------* @@ -1166,11 +1390,25 @@ static void usage_dec( void ) fprintf( stdout, "-VOIP : VoIP mode: RTP in G192\n" ); fprintf( stdout, "-VOIP_hf_only=0 : VoIP mode: EVS RTP Payload Format hf_only=0 in rtpdump\n" ); fprintf( stdout, "-VOIP_hf_only=1 : VoIP mode: EVS RTP Payload Format hf_only=1 in rtpdump\n" ); +#ifdef DEBUG_JBM_CMD_OPTION + fprintf( stdout, "-VOIP_no_bad_frame : VoIP mode: do not put out bad frames in the beginning as silence \n" ); +#endif fprintf( stdout, " The decoder may read rtpdump files containing TS26.445 Annex A.2.2\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" ); #ifdef SUPPORT_JBM_TRACEFILE fprintf( stdout, "-Tracefile TF : VoIP mode: Generate trace file named TF\n" ); +#endif +#ifdef DEBUGGING +#ifdef VARIABLE_SPEED_DECODING + fprintf( stdout, "-VS fac : Variable Speed mode: change speed of playout fac as integer in percent.\n" ); + fprintf( stdout, " 50 <= fac <= 150; fac<100 faster, fac>100 slower\n" ); +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + fprintf( stdout, "-VOIP_framesize : VoIP mode: acoustic frontend fetch frame size (must be multiples of 5!)\n" ); +#endif +#endif #endif fprintf( stdout, "-fec_cfg_file : Optimal channel aware configuration computed by the JBM \n" ); fprintf( stdout, " as described in Section 6.3.1 of TS26.448. The output is \n" ); @@ -1191,8 +1429,8 @@ static void usage_dec( void ) fprintf( stdout, "-rvf File : Reference vector specified by external trajectory file\n" ); fprintf( stdout, " works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes\n" ); fprintf( stdout, "-render_config File : Renderer configuration File\n" ); - fprintf( stdout, "-no_diegetic_pan : panning mono non-diegetic sound to stereo -1<= pan <=1,\n" ); - fprintf( stdout, " left or l or 1->left, right or r or -1->right, center or c or 0->middle\n" ); + fprintf( stdout, "-non_diegetic_pan P : panning mono non-diegetic sound to stereo with paning P, -90<= P <=90,\n" ); + fprintf( stdout, " left or l or 90->left, right or r or -90->right, center or c or 0->middle\n" ); fprintf( stdout, "-q : Quiet mode, no frame counter\n" ); fprintf( stdout, " default is deactivated\n" ); #ifdef DEBUGGING @@ -1202,6 +1440,8 @@ static void usage_dec( void ) fprintf( stdout, " containing FEC pattern (short values of 0 (good) or 1 (bad))\n" ); fprintf( stdout, " default is OFF, if this option is not used\n" ); fprintf( stdout, "-force R : Force specific binaural rendering mode, R = (TDREND, CLDFBREND),\n" ); + fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" ); + fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" ); #endif #ifdef DEBUG_MODE_INFO #ifdef DEBUG_MODE_INFO_TWEAK @@ -1580,7 +1820,6 @@ static ivas_error decodeG192( } } - /* Write current frame */ if ( decodedGoodFrame ) { @@ -1666,6 +1905,7 @@ static ivas_error decodeG192( *------------------------------------------------------------------------------------------*/ memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); @@ -1853,8 +2093,13 @@ static ivas_error decodeVoIP( uint32_t nextPacketRcvTime_ms = 0; uint32_t systemTime_ms = 0; +#ifdef JBM_TSM_ON_TCS + uint32_t systemTimeInc_ms = (uint32_t) JBM_FRONTEND_FETCH_FRAMESIZE_MS; + int32_t nFramesWritten = 0; +#endif int32_t nFramesFed = 0; + uint8_t au[( IVAS_MAX_BITS_PER_FRAME + 7 ) >> 3]; int16_t auSize; uint16_t rtpSequenceNumber; @@ -1987,10 +2232,27 @@ static ivas_error decodeVoIP( * Main receiving/decoding loop *------------------------------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + systemTimeInc_ms = arg.frontendFetchSizeMs; +#endif +#endif + while ( 1 ) { int16_t nOutSamples = 0; - +#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) + uint16_t nSamplesAvailableNext = 0; +#endif +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUG_JBM_CMD_OPTION + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * arg.frontendFetchSizeMs ); +#else + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * JBM_FRONTEND_FETCH_FRAMESIZE_MS ); +#endif +#else + nOutSamples = (int16_t) ( arg.output_Fs / 50 ); +#endif /* read all packets with a receive time smaller than the system time */ while ( nextPacketRcvTime_ms <= systemTime_ms ) { @@ -2034,15 +2296,23 @@ static ivas_error decodeVoIP( /* we are finished when all packets have been received and jitter buffer is empty */ /* also stop when the input file contains less than two frames, because JBM cannot calculate a delay value and won't start decoding */ +#ifdef JBM_TSM_ON_TCS + /* last clause should make sure that for BE tests we end up with the same number of samples...*/ + if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples ) || nFramesFed < 2 ) ) +#else if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec ) || nFramesFed < 2 ) ) +#endif { break; } - nOutSamples = (int16_t) ( arg.output_Fs / 50 ); /* decode and get samples */ if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms +#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) + , + &nSamplesAvailableNext +#endif #ifdef SUPPORT_JBM_TRACEFILE , writeJbmTraceFileFrameWrapper, @@ -2104,7 +2374,11 @@ static ivas_error decodeVoIP( goto cleanup; } } +#ifdef DEBUG_JBM_CMD_OPTION + else if ( arg.noBadFrameDelay == false ) +#else else +#endif { ++numInitialBadFrames; } @@ -2127,6 +2401,55 @@ static ivas_error decodeVoIP( { delayNumSamples -= nOutSamples; } + +#ifdef JBM_TSM_ON_TCS + /* Write ISM metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) + { + int16_t i; + + if ( bsFormat == IVAS_DEC_BS_OBJ ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + else if ( bsFormat == IVAS_DEC_BS_MASA ) + { + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } +#endif } if ( !arg.quietModeEnabled ) @@ -2135,7 +2458,12 @@ static ivas_error decodeVoIP( } frame++; +#ifdef JBM_TSM_ON_TCS + systemTime_ms += systemTimeInc_ms; + nFramesWritten++; +#else systemTime_ms += 20; +#endif #ifdef WMOPS update_mem(); @@ -2194,6 +2522,543 @@ cleanup: #ifdef DEBUGGING +#ifdef VARIABLE_SPEED_DECODING +/*---------------------------------------------------------------------* + * decodeVariableSpeed() + * + * Read G.192 or decode with variable Speed + *---------------------------------------------------------------------*/ + +static ivas_error decodeVariableSpeed( + DecArguments arg, + BS_READER_HANDLE hBsReader, + HeadRotFileReader *headRotReader, + HeadRotFileReader *refRotReader, + Vector3PairFileReader *referenceVectorReader, + IVAS_DEC_HANDLE hIvasDec ) + +{ + bool decodingFailed = true; /* Assume failure until cleanup is reached without errors */ + uint16_t bit_stream[IVAS_MAX_BITS_PER_FRAME + 4 * 8]; + int16_t i, num_bits; + int16_t bfi = 0; +#ifdef DEBUGGING + int16_t fec_seed = 12558; /* FEC_SEED */ +#endif + AudioFileWriter *afWriter = NULL; + MasaFileWriter *masaWriter = NULL; + bool decodedGoodFrame = false; + int16_t numInitialBadFrames = 0; /* Number of bad frames received until first good frame is decoded */ + int16_t nOutChannels = 0; + int16_t delayNumSamples = -1; + int16_t delayNumSamples_orig[3]; + int16_t nOutSamples = 0; + int32_t delayTimeScale = 0; + ivas_error error = IVAS_ERR_UNKNOWN; + uint16_t numObj = 0; + IVAS_DEC_BS_FORMAT bsFormat = IVAS_DEC_BS_UNKOWN; + uint16_t nSamplesAvailableNext; + int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; +#ifdef SUPPORT_JBM_TRACEFILE + JbmTraceFileWriter *jbmTraceWriter = NULL; +#endif + TsmScaleFileReader *tsmScaleFileReader = NULL; + IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS]; + IVAS_VECTOR3 Pos[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t scale; + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; ++i ) + { + ismWriters[i] = NULL; + } + + /*------------------------------------------------------------------------------------------* + * Open TSM scale file + *------------------------------------------------------------------------------------------*/ + + if ( arg.tsmScaleFileEnabled ) + { + if ( ( tsmScaleFileReader = TsmScaleFileReader_open( arg.tsmScaleFileName ) ) == NULL ) + { + fprintf( stderr, "\nError: Can't open TSM scale file %s \n\n", arg.tsmScaleFileName ); + goto cleanup; + } + } + + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "\n------ Running the decoder ------\n\n" ); + fprintf( stdout, "Frames processed: " ); + } + else + { + fprintf( stdout, "\n-- Start the decoder (quiet mode) --\n\n" ); + } + + delayNumSamples_orig[0] = -1; + +#ifdef WMOPS + reset_stack(); + reset_wmops(); +#endif + nSamplesAvailableNext = 0; + nOutSamples = (int16_t) ( arg.output_Fs / 1000 * VARIABLE_SPEED_FETCH_FRAMESIZE_MS ); + + /*------------------------------------------------------------------------------------------* + * Loop for every packet (frame) of bitstream data + * - Read the bitstream packet + * - Run the decoder + * - Write the synthesized signal into output file + *------------------------------------------------------------------------------------------*/ + + while ( 1 ) + { + /* Read next frame if not enough samples availble */ + + /* reference vector */ + if ( arg.enableReferenceVectorTracking ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Reference rotation */ + if ( arg.enableReferenceRotation ) + { + IVAS_QUATERNION quaternion; + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* Head-tracking input simulation */ + if ( arg.enableHeadRotation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions, Pos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* decode and get samples */ + do + { + error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, 0, &nSamplesAvailableNext +#ifdef SUPPORT_JBM_TRACEFILE + , + writeJbmTraceFileFrameWrapper, jbmTraceWriter +#endif + ); + + if ( error != IVAS_ERR_OK && error != IVAS_ERR_VS_FRAME_NEEDED ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_GetSamples: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( error == IVAS_ERR_VS_FRAME_NEEDED ) + { + if ( arg.tsmScaleFileEnabled ) + { + if ( ( error = TsmScaleFileReader_readScale( tsmScaleFileReader, &scale ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename ); + goto cleanup; + } + IVAS_DEC_VoIP_SetScale( hIvasDec, scale ); + } + + if ( ( error = BS_Reader_ReadFrame_short( hBsReader, bit_stream, &num_bits, &bfi ) ) != IVAS_ERR_OK ) + { + if ( error == IVAS_ERR_END_OF_FILE ) + { + break; + } + fprintf( stderr, "\nError: input bitstream file couldn't be read: %s \n\n", arg.inputBitstreamFilename ); + goto cleanup; + } + +#ifdef DEBUGGING + /* Random FEC simulation */ + if ( arg.FER > 0.0f ) + { + float ftmp = (float) app_own_random( &fec_seed ) + 32768.0f; + if ( ftmp <= arg.FER / 100.0f * 65535.0f ) + { + bfi = 1; + } + else + { + bfi = 0; + } + } +#endif + + /* Feed into decoder */ + if ( ( error = IVAS_DEC_FeedFrame_Serial( hIvasDec, bit_stream, num_bits, bfi ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not feed frame to decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + error = IVAS_ERR_VS_FRAME_NEEDED; + } + } while ( error != IVAS_ERR_OK ); + + if ( error == IVAS_ERR_END_OF_FILE ) + { + break; + } + + /* Continue checking for first good frame until it is found */ + if ( !decodedGoodFrame ) + { + if ( ( error = IVAS_DEC_HasDecodedFirstGoodFrame( hIvasDec, &decodedGoodFrame ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_HasDecodedFirstGoodFrame, code: %d\n", error ); + goto cleanup; + } + + /* Once good frame decoded, catch up */ + if ( decodedGoodFrame ) + { + error = initOnFirstGoodFrame( + hIvasDec, + arg, + numInitialBadFrames, + nOutSamples, + delayNumSamples_orig, + &delayNumSamples, + &delayTimeScale, + &bsFormat, + &afWriter, + &masaWriter, + ismWriters, + &nOutChannels, + &numObj ); + if ( error != IVAS_ERR_OK ) + { + goto cleanup; + } + } + else + { + ++numInitialBadFrames; + } + } + + /* Write current frame */ + if ( decodedGoodFrame ) + { + if ( delayNumSamples < nOutSamples ) + { + if ( ( error = AudioFileWriter_write( afWriter, &pcmBuf[delayNumSamples * nOutChannels], nOutSamples * nOutChannels - ( delayNumSamples * nOutChannels ) ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + delayNumSamples = 0; + } + else + { + delayNumSamples -= nOutSamples; + } + } + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + else if ( bsFormat == IVAS_DEC_BS_MASA ) + { + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); +#ifdef DEBUGGING + if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) ) + { + fprintf( stdout, "\n Decoding error: BER detected in frame %d !!!!!\n", frame - 1 ); + } +#endif + } +#ifdef WMOPS + update_wmops(); +#ifdef MEM_COUNT_DETAILS + export_mem( "mem_analysis.csv" ); +#endif +#endif + } + + + /*------------------------------------------------------------------------------------------* + * Flush what is still left in the VoIP Buffers.... + *------------------------------------------------------------------------------------------*/ + + while ( nSamplesAvailableNext > 0 ) + { + int16_t nSamplesFlushed; + + /* Feed into decoder */ + + /* reference vector */ + if ( arg.enableReferenceVectorTracking ) + { + IVAS_VECTOR3 listenerPosition, referencePosition; + if ( ( error = Vector3PairFileReader_read( referenceVectorReader, &listenerPosition, &referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading listener and reference positions from %s\n", IVAS_DEC_GetErrorMessage( error ), Vector3PairFileReader_getFilePath( referenceVectorReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefVectorData( hIvasDec, listenerPosition, referencePosition ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefVectorData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + /* Reference rotation */ + if ( arg.enableReferenceRotation ) + { + IVAS_QUATERNION quaternion; + if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) ); + goto cleanup; + } + + if ( ( error = IVAS_DEC_FeedRefRotData( hIvasDec, quaternion ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedRefRotData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + /* Head-tracking input simulation */ + if ( arg.enableHeadRotation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_FeedHeadTrackData( hIvasDec, Quaternions, Pos ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedHeadTrackData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } + + /* decode and get samples */ + if ( ( error = IVAS_DEC_VoIP_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesAvailableNext, &nSamplesFlushed ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_VoIP_Flush: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + /* Write current frame */ + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, nSamplesFlushed * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nOutput audio file writer error\n" ); + goto cleanup; + } + + /* Write ISm metadata to external file(s) */ + if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ ) + { + if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, &numObj ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + for ( i = 0; i < numObj; ++i ) + { + IVAS_ISM_METADATA IsmMetadata; + + if ( ( error = IVAS_DEC_GetObjectMetadata( hIvasDec, &IsmMetadata, 0, i ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetObjectMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( IsmFileWriter_writeFrame( IsmMetadata, ismWriters[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing ISM metadata to file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) ); + goto cleanup; + } + } + } + else if ( bsFormat == IVAS_DEC_BS_MASA ) + { + MASA_DECODER_EXT_OUT_META_HANDLE hMasaExtOutMeta; + if ( ( error = IVAS_DEC_GetMasaMetadata( hIvasDec, &hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError in IVAS_DEC_GetMasaMetadata: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + + if ( ( error = MasaFileWriter_writeFrame( masaWriter, hMasaExtOutMeta ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + goto cleanup; + } + } + } + + frame++; + if ( !arg.quietModeEnabled ) + { + fprintf( stdout, "%-8d\b\b\b\b\b\b\b\b", frame ); +#ifdef DEBUGGING + if ( IVAS_DEC_GetBerDetectFlag( hIvasDec ) ) + { + fprintf( stdout, "\n Decoding error: BER detected in frame %d !!!!!\n", frame - 1 ); + } +#endif + } + } + + /*------------------------------------------------------------------------------------------* + * Printouts after decoding has finished + *------------------------------------------------------------------------------------------*/ + + if ( !arg.quietModeEnabled ) + { + printf( "\n\nDecoder+renderer delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[1] / (float) delayTimeScale, delayNumSamples_orig[1], delayTimeScale ); + + if ( delayNumSamples_orig[2] > 0 ) + { + printf( "HRIR/BRIR delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * delayNumSamples_orig[2] / (float) delayTimeScale, delayNumSamples_orig[2], delayTimeScale ); + printf( "Total delay: %4.2f ms (%3u samples at timescale %5u)\n", 1000.f * ( delayNumSamples_orig[1] + delayNumSamples_orig[2] ) / (float) delayTimeScale, delayNumSamples_orig[1] + delayNumSamples_orig[2], delayTimeScale ); + } + } + + /* Print output metadata file name(s) */ + if ( arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) + { + if ( bsFormat == IVAS_DEC_BS_OBJ ) + { + for ( i = 0; i < numObj; i++ ) + { + fprintf( stdout, "\nOutput metadata file: %s", IsmFileWriter_getFilePath( ismWriters[i] ) ); + } + fprintf( stdout, "\n" ); + } + else if ( bsFormat == IVAS_DEC_BS_MASA ) + { + fprintf( stdout, "\nOutput metadata file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); + } + } + + /* add zeros at the end to have equal length of synthesized signals */ + memset( pcmBuf, 0, delayNumSamples_orig[0] * nOutChannels * sizeof( int16_t ) ); + if ( ( error = AudioFileWriter_write( afWriter, pcmBuf, delayNumSamples_orig[0] * nOutChannels ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing output file: %s\n", ivas_error_to_string( error ) ); + goto cleanup; + } + + /*------------------------------------------------------------------------------------------* + * Close files and deallocate resources + *------------------------------------------------------------------------------------------*/ + + decodingFailed = false; /* This will stay set to true if cleanup is reached via a goto due to an error */ + +cleanup: + + AudioFileWriter_close( &afWriter ); + MasaFileWriter_close( &masaWriter ); + TsmScaleFileReader_close( &tsmScaleFileReader ); + for ( i = 0; i < IVAS_MAX_NUM_OBJECTS; i++ ) + { + IsmFileWriter_close( &ismWriters[i] ); + } + + if ( decodingFailed && error == IVAS_ERR_OK ) + { + return IVAS_ERR_UNKNOWN; + } + + return error; +} +#endif + + /*---------------------------------------------------------------------* * parseForcedRendModeDec() * diff --git a/apps/encoder.c b/apps/encoder.c index aae2e1e88e..dc97a1acfd 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -111,6 +111,7 @@ typedef struct IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig; const char *ca_config_file; bool mimeOutput; + IVAS_ENC_COMPLEXITY_LEVEL complexityLevel; #ifdef DEBUGGING IVAS_ENC_FORCED_MODE forcedMode; @@ -878,6 +879,7 @@ static void initArgStruct( EncArguments *arg ) arg->ca_config_file = NULL; arg->mimeOutput = false; arg->ism_extended_metadata = false; + arg->complexityLevel = IVAS_ENC_COMPLEXITY_LEVEL_THREE; #ifdef DEBUGGING arg->forcedMode = IVAS_ENC_FORCE_UNFORCED; @@ -1130,18 +1132,18 @@ static bool parseCmdlIVAS_enc( { strncpy( stmp, argv[i], sizeof( stmp ) ); stmp[sizeof( stmp ) - 1] = '\0'; - to_upper( argv[i] ); - if ( strcmp( argv[i], "LO" ) == 0 ) + to_upper( stmp ); + if ( strcmp( stmp, "LO" ) == 0 ) { arg->caConfig.fec_indicator = IVAS_ENC_FEC_LO; } - else if ( strcmp( argv[i], "HI" ) == 0 ) + else if ( strcmp( stmp, "HI" ) == 0 ) { arg->caConfig.fec_indicator = IVAS_ENC_FEC_HI; } else { - arg->ca_config_file = stmp; + arg->ca_config_file = argv[i]; } i++; @@ -1177,6 +1179,30 @@ static bool parseCmdlIVAS_enc( ++i; } + + /*-----------------------------------------------------------------* + * Complexity Level + *-----------------------------------------------------------------*/ + + /* actual parsing of level will be implemented after characterization */ + else if ( strcmp( argv_to_upper, "-LEVEL" ) == 0 ) + { + int16_t level; + + ++i; + level = (int16_t) atoi( argv[i++] ); + if ( level < IVAS_ENC_COMPLEXITY_LEVEL_ONE || level > IVAS_ENC_COMPLEXITY_LEVEL_THREE ) + { + fprintf( stdout, "Invalid complexity level specified.\n" ); + usage_enc(); + return false; + } + else if ( level == IVAS_ENC_COMPLEXITY_LEVEL_ONE || level == IVAS_ENC_COMPLEXITY_LEVEL_TWO ) + { + fprintf( stdout, "Complexity levels 1 and 2 will be defined after characterisation - default to level 3 (full functionality).\n" ); + } + } + /*-----------------------------------------------------------------* * IVAS Formats *-----------------------------------------------------------------*/ @@ -1463,7 +1489,7 @@ static bool parseCmdlIVAS_enc( arg->inputFormatConfig.stereoToMonoDownmix = true; i++; } - else if ( strcmp( argv_to_upper, "-BYPASS" ) == 0 ) // VE: should be renamed to "-pca" + else if ( strcmp( argv_to_upper, "-BYPASS" ) == 0 ) // TODO: should be renamed to "-pca" { i++; if ( i < argc - 4 ) @@ -1648,18 +1674,17 @@ static void usage_enc( void ) fprintf( stdout, "Options:\n" ); fprintf( stdout, "--------\n" ); fprintf( stdout, "EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc\n" ); - fprintf( stdout, "-stereo [Mode] : Stereo format, default is unified stereo \n" ); - fprintf( stdout, " optional for Mode: 1: DFT Stereo, 2: TD Stereo, 3: MDCT Stereo\n" ); + fprintf( stdout, "-stereo : Stereo format \n" ); fprintf( stdout, "-ism (+)Ch Files : ISM format \n" ); fprintf( stdout, " where Ch specifies the number of ISMs (1-4)\n" ); - fprintf( stdout, " where positive (+) means extended metadata format is used (including orientation and radius) \n" ); + fprintf( stdout, " where positive (+) indicates extended metadata (only 64 kbps and up) \n" ); fprintf( stdout, " and Files specify input files containing metadata, one file per object\n" ); fprintf( stdout, " (use NULL for no input metadata)\n" ); fprintf( stdout, "-sba +/-Order : Scene Based Audio input format (Ambisonics ACN/SN3D),\n" ); fprintf( stdout, " where Order specifies the Ambisionics order (1-3),\n" ); fprintf( stdout, " where positive (+) means full 3D and negative (-) only 2D/planar components to be coded\n" ); - fprintf( stdout, "-masa Channels File : MASA format \n" ); - fprintf( stdout, " where Channels specifies the number of input/transport channels (1 or 2): \n" ); + fprintf( stdout, "-masa Ch File : MASA format \n" ); + fprintf( stdout, " where Ch specifies the number of input/transport channels (1 or 2): \n" ); fprintf( stdout, " and File specifies input file containing parametric MASA metadata \n" ); fprintf( stdout, "-mc InputConf : Multi-channel format\n" ); fprintf( stdout, " where InputConf specifies the channel configuration: 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4\n" ); @@ -1685,6 +1710,8 @@ static void usage_enc( void ) fprintf( stdout, " default output bitstream file format is G.192\n" ); fprintf( stdout, "-bypass mode : SBA PCA by-pass, mode = (1, 2), 1 = PCA off, 2 = signal adaptive, default is 1\n" ); + fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" ); + fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" ); #ifdef DEBUGGING fprintf( stdout, "-force T : Force specific mode, T = (speech, music, ACELP, GSC, TCX, HQ),\n" ); fprintf( stdout, " alternatively, T can be a text file where each line contains \"nb_frames T\"\n" ); diff --git a/apps/renderer.c b/apps/renderer.c index be23df8b98..c02785a616 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -135,8 +135,13 @@ typedef struct char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; +#ifdef FIX_439_OTR_PARAMS + int8_t orientation_tracking; +#else int8_t orientationTracking; - float noDiegeticPan; +#endif + int16_t nonDiegeticPan; + float nonDiegeticPanGain; bool delayCompensationEnabled; bool quietModeEnabled; bool sceneDescriptionInput; @@ -160,7 +165,7 @@ typedef enum CmdLnOptionId_refRotFile, CmdLnOptionId_customHrtfFile, CmdLnOptionId_renderConfigFile, - CmdLnOptionId_noDiegeticPan, + CmdLnOptionId_nonDiegeticPan, CmdLnOptionId_orientationTracking, CmdlnOptionId_lfePosition, CmdlnOptionId_lfeMatrix, @@ -234,10 +239,14 @@ static const CmdLnParser_Option cliOptions[] = { .description = "Binaural renderer configuration file (only for BINAURAL and BINAURAL_ROOM outputs)", }, { - .id = CmdLnOptionId_noDiegeticPan, - .match = "no_diegetic_pan", + .id = CmdLnOptionId_nonDiegeticPan, + .match = "non_diegetic_pan", .matchShort = "ndp", - .description = "Panning mono no diegetic sound to stereo -1<= pan <= 1\nleft or l or 1->left, right or r or -1->right, center or c or 0 ->middle\n(todo: implementation)", +#ifdef FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER + .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", +#else + .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(todo: implementation)", +#endif }, { .id = CmdLnOptionId_orientationTracking, @@ -551,6 +560,19 @@ int main( CmdlnArgs args = parseCmdlnArgs( argc, argv ); + if ( args.nonDiegeticPan && !( ( args.inConfig.numAudioObjects == 0 && args.inConfig.multiChannelBuses[0].audioConfig == IVAS_REND_AUDIO_CONFIG_MONO ) || + ( args.inConfig.numAudioObjects > 0 && args.inConfig.audioObjects[0].audioConfig == IVAS_REND_AUDIO_CONFIG_OBJECT && args.inConfig.numAudioObjects == 1 ) ) ) + { + fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires mono or ISM1 input\n" ); + exit( -1 ); + } + + if ( args.nonDiegeticPan && args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_STEREO ) + { + fprintf( stderr, "\ninvalid configuration - non-diegetic panning requires stereo output\n" ); + exit( -1 ); + } + positionProvider = IsmPositionProvider_open(); convert_backslash( args.inputFilePath ); @@ -665,7 +687,7 @@ int main( IVAS_REND_InputId sbaIds[RENDERER_MAX_SBA_INPUTS] = { 0 }; IVAS_REND_InputId masaIds[RENDERER_MAX_MASA_INPUTS] = { 0 }; - if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig ) ) != IVAS_ERR_OK ) + if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -708,7 +730,11 @@ int main( } } +#ifdef FIX_439_OTR_PARAMS + if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientation_tracking ) ) != IVAS_ERR_OK ) +#else if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientationTracking ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -965,7 +991,7 @@ int main( else { error = IVAS_REND_SetHeadRotation( hIvasRend, NULL, NULL ); - if ( ( error != IVAS_ERR_OK ) && ( error != IVAS_ERR_INVALID_OUTPUT_FORMAT ) ) // VE: TBC + if ( error != IVAS_ERR_OK && error != IVAS_ERR_INVALID_OUTPUT_FORMAT ) { fprintf( stderr, "Error setting Head Rotation: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1336,61 +1362,85 @@ static bool parseOutConfig( static bool parseDiegeticPan( char *value, - float *noDiegeticPan ) + float *nonDiegeticPan ) { to_upper( value ); if ( ( strcmp( value, "CENTER" ) == 0 ) || ( strchr( value, 'C' ) != NULL ) ) { - *noDiegeticPan = 0.f; + *nonDiegeticPan = 0.f; } else if ( ( strcmp( value, "LEFT" ) == 0 ) || ( strchr( value, 'L' ) != NULL ) ) { - *noDiegeticPan = -1.f; + *nonDiegeticPan = 1.f; } else if ( ( strcmp( value, "RIGHT" ) == 0 ) || ( strchr( value, 'R' ) != NULL ) ) { - *noDiegeticPan = 1.f; + *nonDiegeticPan = -1.f; } else { - *noDiegeticPan = (float) atof( value ); + *nonDiegeticPan = (float) atof( value ) / 90.f; - if ( *noDiegeticPan > 1.0f || *noDiegeticPan < -1.0f ) + if ( *nonDiegeticPan > 1.0f || *nonDiegeticPan < -1.0f ) { fprintf( stderr, "Error: Incorrect value for panning option argument specified!\n\n" ); return false; } } - return false; + return true; } static bool parseOrientationTracking( char *value, - int8_t *tracking_type ) +#ifdef FIX_439_OTR_PARAMS + int8_t *orientation_tracking +#else + int8_t *tracking_type +#endif +) { - to_upper( value ); if ( strcmp( value, "NONE" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *orientation_tracking = HEAD_ORIENT_TRK_NONE; +#else *tracking_type = IVAS_ORIENT_TRK_NONE; +#endif } else if ( strcmp( value, "REF" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *orientation_tracking = HEAD_ORIENT_TRK_REF; +#else *tracking_type = IVAS_ORIENT_TRK_REF; +#endif } else if ( strcmp( value, "AVG" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *orientation_tracking = HEAD_ORIENT_TRK_AVG; +#else *tracking_type = IVAS_ORIENT_TRK_AVG; +#endif } else if ( strcmp( value, "REF_VEC" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *orientation_tracking = HEAD_ORIENT_TRK_REF_VEC; +#else *tracking_type = IVAS_ORIENT_TRK_REF_VEC; +#endif } else if ( strcmp( value, "REF_VEC_LEV" ) == 0 ) { +#ifdef FIX_439_OTR_PARAMS + *orientation_tracking = HEAD_ORIENT_TRK_REF_VEC_LEV; +#else *tracking_type = IVAS_ORIENT_TRK_REF_VEC_LEV; +#endif } else { @@ -1614,8 +1664,13 @@ static CmdlnArgs defaultArgs( clearString( args.customHrtfFilePath ); clearString( args.renderConfigFilePath ); +#ifdef FIX_439_OTR_PARAMS + args.orientation_tracking = HEAD_ORIENT_TRK_NONE; +#else args.orientationTracking = IVAS_ORIENT_TRK_NONE; - args.noDiegeticPan = 0.0f; +#endif + args.nonDiegeticPan = 0; + args.nonDiegeticPanGain = 0.f; args.delayCompensationEnabled = true; args.quietModeEnabled = false; @@ -1705,17 +1760,22 @@ static void parseOption( assert( numOptionValues == 1 ); strncpy( args->renderConfigFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; - case CmdLnOptionId_noDiegeticPan: + case CmdLnOptionId_nonDiegeticPan: assert( numOptionValues == 1 ); - if ( !parseDiegeticPan( optionValues[0], &args->noDiegeticPan ) ) + if ( !parseDiegeticPan( optionValues[0], &args->nonDiegeticPanGain ) ) { fprintf( stderr, "Unknown option for diegetic panning: %s\n", optionValues[0] ); exit( -1 ); } + args->nonDiegeticPan = 1; break; case CmdLnOptionId_orientationTracking: assert( numOptionValues == 1 ); +#ifdef FIX_439_OTR_PARAMS + if ( !parseOrientationTracking( optionValues[0], &args->orientation_tracking ) ) +#else if ( !parseOrientationTracking( optionValues[0], &args->orientationTracking ) ) +#endif { fprintf( stderr, "Unknown option for orientation tracking: %s\n", optionValues[0] ); exit( -1 ); @@ -1787,7 +1847,7 @@ IsmPositionProvider *IsmPositionProvider_open( IsmPositionProvider *ipp; uint16_t i; - ipp = (IsmPositionProvider *) malloc_( sizeof( IsmPositionProvider ) ); + ipp = (IsmPositionProvider *) malloc( sizeof( IsmPositionProvider ) ); ipp->frameCounter = 0; ipp->numObjects = 0; @@ -1822,6 +1882,7 @@ void getMetadataFromFileReader( objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius; objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw; objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch; + objectMetadataBuffer->positions[objIdx].non_diegetic_flag = ismMetadata.non_diegetic_flag; return; } @@ -1879,6 +1940,7 @@ static void IsmPositionProvider_getNextFrame( objectMetadataBuffer->positions[objIdx].radius = 1.0f; objectMetadataBuffer->positions[objIdx].yaw = 0.0f; objectMetadataBuffer->positions[objIdx].pitch = 0.0f; + objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; } /* Wrap azimuth to lie within (-180, 180] range */ @@ -2140,13 +2202,14 @@ static void parseObjectPosition( { char *endptr; int16_t read_values; - float meta_prm[7] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f }; + float meta_prm[8] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }; + readNextMetadataChunk( line, "," ); *positionDuration = (uint16_t) strtol( line, &endptr, 10 ); readNextMetadataChunk( line, "\n" ); - read_values = (int16_t) sscanf( line, "%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] ); + 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 ) { @@ -2159,6 +2222,7 @@ static void parseObjectPosition( position->radius = meta_prm[2]; position->yaw = meta_prm[5]; position->pitch = meta_prm[6]; + position->non_diegetic_flag = (int16_t) meta_prm[7]; return; } @@ -2182,8 +2246,8 @@ static void parseIsm( if ( parseUint32( line, &numberOfObjectPositionsToRead ) == 0 ) { positionProvider->numPositions[idx] = numberOfObjectPositionsToRead; - positionProvider->positions[idx] = malloc_( numberOfObjectPositionsToRead * sizeof( IVAS_REND_AudioObjectPosition ) ); - positionProvider->positionDurations[idx] = malloc_( numberOfObjectPositionsToRead * sizeof( uint16_t ) ); + positionProvider->positions[idx] = malloc( numberOfObjectPositionsToRead * sizeof( IVAS_REND_AudioObjectPosition ) ); + positionProvider->positionDurations[idx] = malloc( numberOfObjectPositionsToRead * sizeof( uint16_t ) ); for ( i = 0; i < numberOfObjectPositionsToRead; ++i ) { diff --git a/ci/run_evs_be_win_test.py b/ci/run_evs_be_win_test.py new file mode 100644 index 0000000000..f1bcd7f3a4 --- /dev/null +++ b/ci/run_evs_be_win_test.py @@ -0,0 +1,149 @@ +""" + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" + +from multiprocessing import Pool +import argparse +import subprocess +import os +import shutil +import sys + + +def run_condition(eval_cmd, diff_cmd, id_count): + """ Run ENC or DEC command string and compare output with EVS test vectors. """ + + cmd = subprocess.run(eval_cmd.split(), capture_output=True, text=True, check=True) + + # diff + diff_success = 1 + if ';' in diff_cmd: + diff_cmd1, diff_cmd2 = diff_cmd.split(';') + cmd1 = subprocess.run(diff_cmd1.split(), capture_output=True, text=True, check=True) + cmd2 = subprocess.run(diff_cmd2.split(), capture_output=True, text=True, check=True) + diff_success = cmd1.returncode + cmd2.returncode + else: + cmd = subprocess.run(diff_cmd.split(), capture_output=True, text=True, check=True) + diff_success = cmd.returncode + if diff_success == 0: + return None + else: + return f'[{str(id_count).rjust(3)}] FAIL: {" ".join(eval_cmd)}\n {diff_cmd}\n' + + +def environment_is_correct(paths): + """ + Check that the folder with the test resources is set up correctly: + - all Readme files there + - EVS binaries available in bin/ + - testv and switchPaths folder exist - Content is not checked, though + """ + ret = True + + for pth in paths: + if not os.path.exists(pth): + print(f"Environment setup is incorrect - {pth} not found.") + ret = False + + return ret + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='Run 26.444 test with parallel processes ') + parser.add_argument('-p', type=int, default=os.cpu_count(), + help='Number of processes (default cpu_count)') + parser.add_argument('-test_dir', type=str, default='./', + help='testvec directory from 26.444)') + parser.add_argument('-enc_bin', type=str, default='./bin/IVAS_cod.exe', + help='Encoder binary (default ./bin/IVAS_cod.exe)') + parser.add_argument('-dec_bin', type=str, default='./bin/IVAS_dec.exe', + help='Decoder binary (default ./bin/IVAS_dec.exe)') + + args = parser.parse_args() + test_vec_dir = args.test_dir + processes = args.p + enc_bin = args.enc_bin + dec_bin = args.dec_bin + + README_FILES = ['Readme_AMRWB_IO_dec.txt', 'Readme_AMRWB_IO_enc.txt', 'Readme_EVS_dec.txt', + 'Readme_EVS_enc.txt', 'Readme_JBM_dec.txt'] + + scripts = [os.path.join(test_vec_dir, script) for script in README_FILES] + + if not environment_is_correct([f'{test_vec_dir}/testv'] + scripts + [enc_bin, dec_bin]): + sys.exit(1) + + pool = Pool(processes) + results = [] + id_count = 0 + + for script in scripts: + with open(script) as file: + tmp_dir = None + eval_cmd = None + diff_cmd = '' + for line in file: + if line.startswith('TMP='): + assert tmp_dir is None + tmp_dir = line.split('"')[1] + if os.path.exists(tmp_dir): + shutil.rmtree(tmp_dir) + os.makedirs(tmp_dir) + line = line if tmp_dir is None else line.replace( + '$TMP/', f'{tmp_dir}/') + if '$CUT_DEC_BIN' in line: + eval_cmd = dec_bin + ' -q ' + ' '.join(line.split()[1:]) + if '$CUT_ENC_BIN' in line: + eval_cmd = enc_bin + ' -q ' + ' '.join(line.split()[1:]) + if '$DIFF_BIN' in line: + if 'Readme_JBM_dec.txt' in script: + if '-w' not in line.split()[1]: + diff_cmd = 'FC.exe ' + ' '.join(line.split()[1:]).replace('/', '\\').replace('\n', '/n') + continue + diff_cmd += '; FC.exe ' + ' '.join(line.split()[1:]).replace('/', '\\').replace('\n', '/n').replace('-w', '/W') + else: + diff_cmd = 'FC.exe ' + ' '.join(line.split()[1:]).replace('/', '\\').replace('\n', '/n') + results.append(pool.apply_async( + run_condition, args=(eval_cmd, diff_cmd, id_count))) + id_count = id_count + 1 + print('Total number of conditions for', '"' + + os.path.basename(script) + '": ' + str(id_count - 1)) + + results = [r.get() for r in results if r.get()] + if results: + print(f'\n{len(results)} test conditions failed:') + print('\n'.join(results)) + with open('failed.txt', 'w') as f: + print(f'\n{len(results)} test conditions failed:', file=f) + print('\n'.join(results), file=f) + sys.exit(1) + else: + print('\n *** All tests passed! ***') + sys.exit(0) diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index 852b74fe47..1e758b6263 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -55,7 +55,7 @@ fi cfg=./scripts/config/ci_linux.json dly_profile=./scripts/dly_error_profiles/dly_error_profile_10.dat -ism_md_cmd="--metadata_files /usr/local/testv/stvISM1.csv /usr/local/testv/stvISM2.csv /usr/local/testv/stvISM3.csv /usr/local/testv/stvISM4.csv" +ism_md_cmd="--metadata_files /usr/local/ltv/ltvISM1.csv /usr/local/ltv/ltvISM2.csv /usr/local/ltv/ltvISM3.csv /usr/local/ltv/ltvISM4.csv" if [ $BUILD -eq 1 ];then # Enable memory macros to find unbalanced memory allocations/deallocations @@ -63,7 +63,7 @@ if [ $BUILD -eq 1 ];then make clean # Replace free -> free_, malloc -> malloc_, calloc -> calloc_ - ./scripts/prepare_mem_dryrun.py + python3 ./scripts/prepare_mem_dryrun.py # Enable WMOPS and disable DEBUGGING sed -i.bak -e "s/\/\*\s*\(#define\s*WMOPS\)\s*\*\//\1/g" lib_com/options.h @@ -78,28 +78,37 @@ fi # treat ISM modes separately because passing the metadata files to MASA modes causes crashes ism_modes=$(./scripts/runIvasCodec.py -l | grep ISM) non_ism_modes=$(./scripts/runIvasCodec.py -l | grep -v ISM) +echo "\n======================= 1. non-ism modes no FEC =======================\n\n" ./scripts/runIvasCodec.py -m $non_ism_modes -p $cfg -U 1 $WORKERS | tee smoke_test_output.txt +echo "\n======================= 2. ism modes no FEC =======================\n\n" ./scripts/runIvasCodec.py -m $ism_modes -p $cfg -U 1 $WORKERS $ism_md_cmd | tee smoke_test_output.txt # run the decoding again, but with 15% frame loss +echo "\n======================= 3. all modes with FEC =======================\n\n" ./scripts/runIvasCodec.py -p $cfg -U 1 $WORKERS -D="-fec 15" --decoder_only | tee smoke_test_output_plc.txt # run JBM modes - EXT is excluded as not supported yet modes_with_no_ext_out=$(./scripts/runIvasCodec.py -l | grep -v MASA | grep -v ISM) +modes_with_ext_out=$(./scripts/runIvasCodec.py -l | grep 'MASA\|ISM' | grep -v ISM+) +echo "\n======================= 4. JBM, modes with no EXT =======================\n\n" ./scripts/runIvasCodec.py -m $modes_with_no_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile | tee smoke_test_output_jbm_noEXT.txt -./scripts/runIvasCodec.py -C MASA ISM1 ISM2 ISM3 ISM4 -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt +echo "\n======================= 5. JBM, modes with EXT =======================\n\n" +./scripts/runIvasCodec.py -m $modes_with_ext_out -p $cfg -U 1 $WORKERS --decoder_only --jbm_file $dly_profile --oc BINAURAL BINAURAL_ROOM mono stereo FOA HOA3 5_1 7_1_4 | tee -a smoke_test_output_jbm_noEXT.txt # run all modes with binaural output using external files modes_with_bin_out="SBA PlanarSBA MASA MC ISM1 ISM2 ISM3 ISM4" bin_out_modes="BINAURAL BINAURAL_ROOM" +echo "\n======================= 6. binaural out with HRTF files - WB =======================\n\n" wb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _wb_) hrtf_wb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin" ./scripts/runIvasCodec.py -p $cfg -m $wb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_wb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt +echo "\n======================= 7. binaural out with HRTF files - SWB =======================\n\n" swb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _swb_) hrtf_swb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin" ./scripts/runIvasCodec.py -p $cfg -m $swb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_swb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt +echo "\n======================= 8. binaural out with HRTF files - FB =======================\n\n" fb_modes=$(./scripts/runIvasCodec.py -l -C $modes_with_bin_out | grep _fb_) hrtf_fb="../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin" ./scripts/runIvasCodec.py -p $cfg -m $fb_modes -U 1 $WORKERS -D="-hrtf ${hrtf_fb}" --decoder_only --oc $bin_out_modes | tee -a smoke_test_output_hrtf.txt diff --git a/lib_com/bits_alloc.c b/lib_com/bits_alloc.c index a162e40be3..56e523b392 100644 --- a/lib_com/bits_alloc.c +++ b/lib_com/bits_alloc.c @@ -516,29 +516,27 @@ static ivas_error acelp_FCB_allocator( *--------------------------------------------------------------------*/ ivas_error config_acelp1( - const int16_t enc_dec, /* i : encoder/decoder flag */ - const int32_t total_brate, /* i : total bitrate */ - const int32_t core_brate_inp, /* i : core bitrate */ - const int16_t core, /* i : core */ - const int16_t extl, /* i : extension layer */ - const int32_t extl_brate, /* i : extension layer bitrate */ - const int16_t L_frame, /* i : frame length at internal Fs */ - const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const int16_t signaling_bits, /* i : number of signaling bits */ - const int16_t coder_type, /* i : coder type */ - const int16_t tc_subfr, /* i : TC subfr ID */ - const int16_t tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ - int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - int16_t *unbits, /* o : number of unused bits */ - const int16_t element_mode, /* i : element mode */ - int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - 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 idchan, /* i : stereo channel ID */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE - const int16_t active_cnt, /* i : Active frame counter */ -#endif + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t core_brate_inp, /* i : core bitrate */ + const int16_t core, /* i : core */ + const int16_t extl, /* i : extension layer */ + const int32_t extl_brate, /* i : extension layer bitrate */ + const int16_t L_frame, /* i : frame length at internal Fs */ + const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ + ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ + const int16_t signaling_bits, /* i : number of signaling bits */ + const int16_t coder_type, /* i : coder type */ + const int16_t tc_subfr, /* i : TC subfr ID */ + const int16_t tc_call, /* i : TC call number (0,1,2,3,5(DEC)) */ + int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ + int16_t *unbits, /* o : number of unused bits */ + const int16_t element_mode, /* i : element mode */ + int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ + 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 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_LRTD_flag, /* i : LRTD stereo mode flag */ const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ @@ -739,7 +737,7 @@ ivas_error config_acelp1( } else /* L_frame == L_FRAME16k */ { - acelp_cfg->lsf_bits = 41; /* TBV: currently LSFQ @16kHz is not flexible (only 31/41 bits supported */ + acelp_cfg->lsf_bits = 41; } } @@ -756,12 +754,10 @@ ivas_error config_acelp1( bits -= acelp_cfg->mid_lsf_bits; } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE else if ( tdm_lp_reuse_flag == 1 && idchan == 1 && active_cnt != 1 ) { bits -= TDM_IC_LSF_PRED_BITS; } -#endif /* gain Q bit-budget - part 1 */ if ( ( coder_type != UNVOICED && coder_type != AUDIO && coder_type != INACTIVE && !( core_brate <= ACELP_8k00 && coder_type != TRANSITION ) ) || ( coder_type == INACTIVE && total_brate > MAX_GSC_INACTIVE_BRATE ) ) @@ -1318,7 +1314,6 @@ ivas_error config_acelp1( { if ( idchan > 0 && element_mode == IVAS_CPE_TD ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( !tdm_lp_reuse_flag ) { acelp_cfg->lsf_bits += bits; /* increase LSF Q bits */ @@ -1348,33 +1343,6 @@ ivas_error config_acelp1( bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits ); } } -#else - int16_t nb_prm = 4; - - if ( tdm_low_rate_mode == 1 ) - { - nb_prm = 2; - } - - /* First add remaining bits on gains */ - if ( !( *uc_two_stage_flag ) ) - { - bits -= allocate_unused( core_brate, coder_type, bits, nb_prm, 0, GAINSPRM, acelp_cfg->gains_mode ); - } - - /* Then, Increase pitch bit budget */ - if ( tdm_Pitch_reuse_flag == 0 && bits > 0 ) - { - bits -= allocate_unused( core_brate, coder_type, bits, nb_prm, 0, PITCHPRM, acelp_cfg->pitch_bits ); - } - - /* Increase mid-lsf bit budget */ - if ( tdm_lp_reuse_flag == 0 && bits > 0 ) - { - bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, MID_LSFSPRM, &acelp_cfg->mid_lsf_bits ); - bits -= allocate_unused( core_brate, coder_type, bits, 1, 0, LSFPRM, &acelp_cfg->lsf_bits ); - } -#endif #ifdef DEBUGGING if ( idchan > 0 && bits > 0 && ( coder_type > UNVOICED || tdm_low_rate_mode == 0 ) ) { @@ -1392,7 +1360,7 @@ ivas_error config_acelp1( acelp_cfg->ubits = acelp_cfg->lsf_bits - 46; acelp_cfg->lsf_bits = 46; } - else if ( acelp_cfg->lsf_bits > 42 && L_frame == L_FRAME ) /* TBV: verify maximum supported LSF Q bitbudget (for some reason 43 bits LSFQ decreases segSNR by 0.7 dB) */ + else if ( acelp_cfg->lsf_bits > 42 && L_frame == L_FRAME ) { acelp_cfg->ubits = acelp_cfg->lsf_bits - 42; acelp_cfg->lsf_bits = 42; diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c old mode 100644 new mode 100755 index 446cf8ca85..c9571d41c1 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -62,6 +62,11 @@ FILE *FEC_pattern = NULL; /* FEC pattern file (for simulation of FEC) */ #endif +#ifdef IND_LIST_DYN +#define STEP_MAX_NUM_INDICES 100 /* increase the maximum number of allowed indices in the list by this amount */ +#endif + +#ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * pack_bit() * @@ -113,106 +118,903 @@ static Word16 unpack_bit( ( *pt )++; } - return bit; + return bit; +} +#endif + +/*-------------------------------------------------------------------* + * rate2AMRWB_IOmode() + * + * lookup AMRWB IO mode + *-------------------------------------------------------------------*/ + +static Word16 rate2AMRWB_IOmode( + Word32 brate /* i : bitrate */ +) +{ + switch ( brate ) + { + /* EVS AMR-WB IO modes */ + case SID_1k75: + return AMRWB_IO_SID; + case ACELP_6k60: + return AMRWB_IO_6600; + case ACELP_8k85: + return AMRWB_IO_8850; + case ACELP_12k65: + return AMRWB_IO_1265; + case ACELP_14k25: + return AMRWB_IO_1425; + case ACELP_15k85: + return AMRWB_IO_1585; + case ACELP_18k25: + return AMRWB_IO_1825; + case ACELP_19k85: + return AMRWB_IO_1985; + case ACELP_23k05: + return AMRWB_IO_2305; + case ACELP_23k85: + return AMRWB_IO_2385; + default: + break; + } + + return -1; +} + +/*-------------------------------------------------------------------* + * rate2EVSmode() + * + * lookup EVS mode + *-------------------------------------------------------------------*/ +Word16 rate2EVSmode( + const Word32 brate, /* i : bitrate */ + int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ +) +{ + if ( is_amr_wb != NULL ) + { + *is_amr_wb = 0; + } + + switch ( brate ) + { + /* EVS Primary modes */ + case FRAME_NO_DATA: + return NO_DATA_RECEIVED; + case SID_2k40: + return PRIMARY_SID; + case PPP_NELP_2k80: + return PRIMARY_2800; + case ACELP_7k20: + return PRIMARY_7200; + case ACELP_8k00: + return PRIMARY_8000; + case ACELP_9k60: + return PRIMARY_9600; + case ACELP_13k20: + return PRIMARY_13200; + case ACELP_16k40: + return PRIMARY_16400; + case ACELP_24k40: + return PRIMARY_24400; + case ACELP_32k: + return PRIMARY_32000; + case ACELP_48k: + return PRIMARY_48000; + case ACELP_64k: + return PRIMARY_64000; + case HQ_96k: + return PRIMARY_96000; + case HQ_128k: + return PRIMARY_128000; + default: + break; + } + + if ( is_amr_wb != NULL ) + { + *is_amr_wb = 1; + } + + return rate2AMRWB_IOmode( brate ); +} + +#ifdef IND_LIST_DYN +/*-------------------------------------------------------------------* + * ind_list_realloc() + * + * Re-allocate the list of indices + *-------------------------------------------------------------------*/ + +ivas_error ind_list_realloc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ +) +{ + int16_t i, ind_list_pos; + INDICE_HANDLE new_ind_list; + + /* allocate new buffer of indices */ + if ( ( new_ind_list = (INDICE_HANDLE) malloc( max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* move indices from the old list to the new list */ + for ( i = 0; i < min( max_num_indices, *( hBstr->ivas_max_num_indices ) ); i++ ) + { + if ( ( *hBstr->ivas_ind_list_zero )[i].nb_bits > -1 ) + { + new_ind_list[i].id = ( *hBstr->ivas_ind_list_zero )[i].id; + new_ind_list[i].value = ( *hBstr->ivas_ind_list_zero )[i].value; + } + new_ind_list[i].nb_bits = ( *hBstr->ivas_ind_list_zero )[i].nb_bits; + } + + /* reset nb_bits of all other indices to -1 */ + for ( ; i < max_num_indices; i++ ) + { + new_ind_list[i].nb_bits = -1; + } + + /* get the current position inside the old list */ + ind_list_pos = (int16_t) ( hBstr->ind_list - ( *hBstr->ivas_ind_list_zero ) ); + + /* free the old list */ + free( ( *hBstr->ivas_ind_list_zero ) ); + + /* set pointers in the new list */ + hBstr->ind_list = &new_ind_list[ind_list_pos]; + *( hBstr->ivas_ind_list_zero ) = new_ind_list; + + /* set the new maximum number of indices */ + *( hBstr->ivas_max_num_indices ) = max_num_indices; + + return IVAS_ERR_OK; +} + + +/*-----------------------------------------------------------------------* + * get_ivas_max_num_indices() + * + * Get the maximum allowed number of indices in the encoder + *-----------------------------------------------------------------------*/ + +int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + if ( ivas_format == STEREO_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 450; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1350; + } + else + { + return 1650; + } + } + else if ( ivas_format == ISM_FORMAT || ivas_format == MONO_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 250; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 450; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 550; + } + else if ( ivas_total_brate <= IVAS_64k ) + { + return 620; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 670; + } + else if ( ivas_total_brate <= IVAS_96k ) + { + return 780; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 880; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1100; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1300; + } + else + { + return 1650; + } + } + else if ( ivas_format == SBA_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 250; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 1020; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 1160; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 1220; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1300; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1720; + } + else + { + return 2000; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 950; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 1150; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1450; + } + else + { + return 1650; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 250; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 350; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 400; + } + else if ( ivas_total_brate <= IVAS_48k ) + { + return 650; + } + else if ( ivas_total_brate <= IVAS_64k ) + { + return 750; + } + else if ( ivas_total_brate <= IVAS_80k ) + { + return 850; + } + else if ( ivas_total_brate <= IVAS_128k ) + { + return 1150; + } + else if ( ivas_total_brate <= IVAS_160k ) + { + return 1420; + } + else if ( ivas_total_brate <= IVAS_256k ) + { + return 2120; + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 2250; + } + else + { + return 2450; + } + } + + return 2450; +} + +/*-----------------------------------------------------------------------* + * get_core_max_num_indices() + * + * Get the maximum allowed number of indices in the core coder + *-----------------------------------------------------------------------*/ + +int16_t get_core_max_num_indices( /* o : maximum number of indices */ + const int16_t core, /* i : core */ + const int32_t total_brate /* i : total bitrate */ +) +{ + /* set the maximum number of indices in the core coder */ + if ( core == ACELP_CORE || core == AMR_WB_CORE ) + { + if ( total_brate <= 9600 ) + { + return 60; + } + else if ( total_brate <= IVAS_13k2 ) + { + return 70; + } + else if ( total_brate <= IVAS_16k4 ) + { + return 80; + } + else if ( total_brate <= IVAS_24k4 ) + { + return 100; + } + else if ( total_brate <= IVAS_32k ) + { + return 180; + } + else if ( total_brate <= IVAS_48k ) + { + return 340; + } + else if ( total_brate <= IVAS_80k ) + { + return 450; + } + else if ( total_brate <= IVAS_96k ) + { + return 500; + } + else if ( total_brate <= IVAS_128k ) + { + return 550; + } + else if ( total_brate <= IVAS_160k ) + { + return 600; + } + else if ( total_brate <= IVAS_192k ) + { + return 650; + } + else if ( total_brate <= IVAS_256k ) + { + return 700; + } + else + { + return 800; + } + } + else if ( core == TCX_20_CORE || core == TCX_10_CORE ) + { + if ( total_brate <= 9600 ) + { + return 100; + } + else if ( total_brate <= IVAS_13k2 ) + { + return 150; + } + else if ( total_brate <= IVAS_16k4 ) + { + return 200; + } + else if ( total_brate <= IVAS_24k4 ) + { + return 310; + } + else if ( total_brate <= IVAS_32k ) + { + return 330; + } + else if ( total_brate <= IVAS_48k ) + { + return 340; + } + else if ( total_brate <= IVAS_80k ) + { + return 380; + } + else if ( total_brate <= IVAS_96k ) + { + return 400; + } + else if ( total_brate <= IVAS_128k ) + { + return 460; + } + else if ( total_brate <= IVAS_160k ) + { + return 470; + } + else if ( total_brate <= IVAS_192k ) + { + return 570; + } + else if ( total_brate <= IVAS_256k ) + { + return 680; + } + else + { + return 800; + } + } + else if ( core == HQ_CORE ) + { + if ( total_brate <= 9600 ) + { + return 100; + } + else if ( total_brate <= IVAS_16k4 ) + { + return 200; + } + else if ( total_brate <= IVAS_24k4 ) + { + return 240; + } + else if ( total_brate <= IVAS_32k ) + { + return 300; + } + else if ( total_brate <= IVAS_48k ) + { + return 380; + } + else if ( total_brate <= IVAS_96k ) + { + return 400; + } + else if ( total_brate <= IVAS_128k ) + { + return 450; + } + else if ( total_brate <= IVAS_160k ) + { + return 550; + } + else if ( total_brate <= IVAS_192k ) + { + return 600; + } + else if ( total_brate <= IVAS_256k ) + { + return 700; + } + else + { + return 800; + } + } + else + { + return 50; + } +} + +/*-----------------------------------------------------------------------* + * get_BWE_max_num_indices() + * + * Get the maximum number of indices in the BWE + *-----------------------------------------------------------------------*/ + +int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ + const int32_t extl_brate /* i : extensiona layer bitrate */ +) +{ + /* set the maximum number of indices in the BWE */ + if ( extl_brate < SWB_BWE_16k ) + { + return 30; + } + else + { + return 150; + } +} + + +/*-----------------------------------------------------------------------* + * get_ivas_max_num_indices_metadata() + * + * Set the maximum allowed number of metadata indices in the list + *-----------------------------------------------------------------------*/ + +int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) +{ + /* set the maximum required number of metadata indices */ + if ( ivas_format == MONO_FORMAT ) + { + return 0; + } + else if ( ivas_format == STEREO_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 60; + } + else + { + return 80; + } + } + else if ( ivas_format == ISM_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 20; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 65; + } + else + { + return 80; + } + } + else if ( ivas_format == SBA_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 100; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 200; + } + else if ( ivas_total_brate <= IVAS_32k ) + { + return 300; + } + else if ( ivas_total_brate <= IVAS_192k ) + { + return 500; + } + else if ( ivas_total_brate <= IVAS_256k ) + { +#ifdef FIX_483b + return 1050; +#else + return 1000; +#endif + } + else if ( ivas_total_brate <= IVAS_384k ) + { +#ifdef FIX_509 + return 2000; +#else + return 1500; +#endif + } + else + { +#ifdef FIX_509 + return 2500; +#else + return 2000; +#endif + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( ivas_total_brate <= IVAS_16k4 ) + { + return 80; + } + else if ( ivas_total_brate <= IVAS_32k ) + { +#ifdef FIX_502_IND_LIST_SIZE + return 125; +#else + return 110; +#endif + } + else if ( ivas_total_brate <= IVAS_48k ) + { +#ifdef FIX_502_IND_LIST_SIZE + return 205; +#else + return 180; +#endif + } + else if ( ivas_total_brate <= IVAS_96k ) + { +#ifdef FIX_502_IND_LIST_SIZE + return 240; +#else + return 200; +#endif + } + else if ( ivas_total_brate <= IVAS_128k ) + { +#ifdef FIX_502_IND_LIST_SIZE + return 305; +#else + return 250; +#endif + } + else if ( ivas_total_brate <= IVAS_160k ) + { +#ifdef FIX_502_IND_LIST_SIZE + return 425; +#else + return 320; +#endif + } + else if ( ivas_total_brate <= IVAS_192k ) + { +#ifdef FIX_502_IND_LIST_SIZE + return 630; +#else + return 430; +#endif + } + else if ( ivas_total_brate <= IVAS_256k ) + { +#ifdef FIX_502_IND_LIST_SIZE + return 850; +#else + return 600; +#endif + } + else if ( ivas_total_brate <= IVAS_384k ) + { + return 1000; + } + else + { +#ifdef FIX_502_IND_LIST_SIZE + return 1750; +#else + return 1500; +#endif + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate <= IVAS_13k2 ) + { + return 80; + } + else if ( ivas_total_brate <= IVAS_24k4 ) + { + return 100; + } + else if ( ivas_total_brate <= IVAS_64k ) + { +#ifdef FIX_502_IND_LIST_SIZE + return 210; +#else + return 200; +#endif + } + else if ( ivas_total_brate <= IVAS_96k ) + { + return 220; + } + else + { + return 300; + } + } + + return 50; } /*-------------------------------------------------------------------* - * rate2AMRWB_IOmode() + * move_indices() * - * lookup AMRWB IO mode + * Move indices inside the buffer or among two buffers *-------------------------------------------------------------------*/ -static Word16 rate2AMRWB_IOmode( - Word32 brate /* i : bitrate */ +ivas_error move_indices( + INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ + INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ + const int16_t nb_indices /* i : number of moved indices */ ) { - switch ( brate ) + int16_t i; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( new_ind_list < old_ind_list ) { - /* EVS AMR-WB IO modes */ - case SID_1k75: - return AMRWB_IO_SID; - case ACELP_6k60: - return AMRWB_IO_6600; - case ACELP_8k85: - return AMRWB_IO_8850; - case ACELP_12k65: - return AMRWB_IO_1265; - case ACELP_14k25: - return AMRWB_IO_1425; - case ACELP_15k85: - return AMRWB_IO_1585; - case ACELP_18k25: - return AMRWB_IO_1825; - case ACELP_19k85: - return AMRWB_IO_1985; - case ACELP_23k05: - return AMRWB_IO_2305; - case ACELP_23k85: - return AMRWB_IO_2385; - default: - break; + for ( i = 0; i < nb_indices; i++ ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + + old_ind_list[i].nb_bits = -1; + } + } + else if ( new_ind_list > old_ind_list ) + { + for ( i = nb_indices - 1; i >= 0; i-- ) + { + new_ind_list[i].id = old_ind_list[i].id; + new_ind_list[i].value = old_ind_list[i].value; + new_ind_list[i].nb_bits = old_ind_list[i].nb_bits; + + old_ind_list[i].nb_bits = -1; + } } - return -1; + return error; } +#endif + +#ifdef IND_LIST_DYN /*-------------------------------------------------------------------* - * rate2EVSmode() + * check_ind_list_limits() * - * lookup EVS mode + * Check, if the maximum number of indices has been reached -> reallocate + * Check, if we will not overwrite an existing indice -> adjust the location *-------------------------------------------------------------------*/ -Word16 rate2EVSmode( - const Word32 brate, /* i : bitrate */ - int16_t *is_amr_wb /* o : (flag) does the bitrate belong to AMR-WB? Can be NULL */ + +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ ) { - if ( is_amr_wb != NULL ) - { - *is_amr_wb = 0; - } + Indice *ivas_ind_list_zero, *ivas_ind_list_last; + ivas_error error; - switch ( brate ) + error = IVAS_ERR_OK; + ivas_ind_list_zero = *( hBstr->ivas_ind_list_zero ); + + /* check, if the maximum number of indices has been reached and re-allocate the buffer */ + /* the re-allocation can be avoided by increasing the limits in get_ivas_max_num_indices() or get_ivas_max_num_indices_metadata() */ + if ( ( &hBstr->ind_list[hBstr->nb_ind_tot] - ivas_ind_list_zero ) >= *( hBstr->ivas_max_num_indices ) ) { - /* EVS Primary modes */ - case FRAME_NO_DATA: - return NO_DATA_RECEIVED; - case SID_2k40: - return PRIMARY_SID; - case PPP_NELP_2k80: - return PRIMARY_2800; - case ACELP_7k20: - return PRIMARY_7200; - case ACELP_8k00: - return PRIMARY_8000; - case ACELP_9k60: - return PRIMARY_9600; - case ACELP_13k20: - return PRIMARY_13200; - case ACELP_16k40: - return PRIMARY_16400; - case ACELP_24k40: - return PRIMARY_24400; - case ACELP_32k: - return PRIMARY_32000; - case ACELP_48k: - return PRIMARY_48000; - case ACELP_64k: - return PRIMARY_64000; - case HQ_96k: - return PRIMARY_96000; - case HQ_128k: - return PRIMARY_128000; - default: - break; +#ifdef DEBUGGING + /* TODO: replace with the warning message below before the finalization of the IVAS codec */ + /* fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); */ + assert( 0 && "The maximum number of indices has been exceeded! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata()." ); +#endif + + /* reallocate the buffer of indices with increased limit */ + ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ); } - if ( is_amr_wb != NULL ) + /* check, if we will not overwrite an existing indice */ + if ( hBstr->ind_list[hBstr->nb_ind_tot].nb_bits > 0 ) { - *is_amr_wb = 1; + if ( hBstr->nb_ind_tot == 0 ) + { +#ifdef DEBUGGING + fprintf( stderr, "Warning: Trying to overwrite an existing indice ID = %d in frame %d!\n", hBstr->ind_list[hBstr->nb_ind_tot].id, frame ); +#endif + /* move the pointer to the next available empty slot */ + ivas_ind_list_last = &ivas_ind_list_zero[*( hBstr->ivas_max_num_indices )]; + while ( hBstr->ind_list[0].nb_bits > 0 && hBstr->ind_list < ivas_ind_list_last ) + { + hBstr->ind_list++; + } + + if ( hBstr->ind_list >= ivas_ind_list_last ) + { +#ifdef DEBUGGING + /* TODO: replace with the warning message below before the finalization of the IVAS codec */ + /* fprintf( stderr, "Warning: The maximum number of indices %d has been exceeded in frame %d! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata().\n", *( hBstr->ivas_max_num_indices ), frame ); */ + assert( 0 && "The maximum number of indices has been exceeded! Increase the limits in get_ivas_max_num_indices() or get_max_num_indices_metadata()." ); +#endif + + /* no available empty slot -> need to re-allocate the buffer */ + ind_list_realloc( hBstr, *( hBstr->ivas_max_num_indices ) + STEP_MAX_NUM_INDICES ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Buffer of indices corrupted in frame %d! Attempt to overwrite indice ID = %d (value: %d, bits: %d)!\n", frame, hBstr->ind_list[hBstr->nb_ind_tot].id, hBstr->ind_list[hBstr->nb_ind_tot].value, hBstr->ind_list[hBstr->nb_ind_tot].nb_bits ); + } } - return rate2AMRWB_IOmode( brate ); + return error; } +#endif + /*-------------------------------------------------------------------* * push_indice() @@ -237,6 +1039,9 @@ ivas_error push_indice( ) { int16_t i; +#ifdef IND_LIST_DYN + int16_t j; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -250,6 +1055,7 @@ ivas_error push_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d exceeds the range of %d bits (frame %d) !\n", id, value, nb_bits, frame ); } +#ifndef IND_LIST_DYN #if 0 /* mul, 2020-11-19: to be de-activated until proper solution found */ if ( nb_bits < 1 ) @@ -257,18 +1063,45 @@ ivas_error push_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, " Trying to push indice ID = %d with value %d that has %d bits (frame %d) !\n", id, value, nb_bits, frame ); } else +#endif #endif if ( nb_bits > 16 ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to allocate %d bits which exceeds 16 bits (frame %d) !\n", id, value, nb_bits, frame ); } +#ifndef IND_LIST_DYN if ( id >= MAX_NUM_INDICES ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d exceeds the total number of indices: %d (frame %d) !\n", id, MAX_NUM_INDICES, frame ); } #endif +#endif + +#ifdef IND_LIST_DYN + /* check the limits of the list of indices */ + error = check_ind_list_limits( hBstr ); +#endif + +#ifdef IND_LIST_DYN + /* find the location in the list of indices based on ID */ + i = hBstr->nb_ind_tot; + while ( i > 0 && id < hBstr->ind_list[i - 1].id ) + { + i--; + } + /* shift indices, if the new ID is to be written somewhere inside the list */ + if ( i < hBstr->nb_ind_tot ) + { + for ( j = hBstr->nb_ind_tot; j > i; j-- ) + { + 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].value = hBstr->ind_list[j - 1].value; + } + } +#else if ( hBstr->last_ind == id ) { /* indice with the same name as the previous one */ @@ -283,21 +1116,31 @@ ivas_error push_indice( i++; } } +#endif +#ifndef IND_LIST_DYN #ifdef DEBUGGING if ( hBstr->ind_list[i].nb_bits > 0 ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice ID = %d with value %d is trying to re-write an existing indice (frame %d) !\n", id, value, frame ); } +#endif #endif /* store the new indice in the list */ +#ifdef IND_LIST_DYN + hBstr->ind_list[i].id = id; +#endif hBstr->ind_list[i].value = value; hBstr->ind_list[i].nb_bits = nb_bits; /* updates */ +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot++; +#else hBstr->next_ind = i + 1; hBstr->last_ind = id; +#endif hBstr->nb_bits_tot += nb_bits; return error; @@ -324,6 +1167,9 @@ ivas_error push_next_indice( #endif ) { +#ifdef IND_LIST_DYN + int16_t prev_id; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -342,6 +1188,7 @@ ivas_error push_next_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to allocate %d bits which exceeds 16 bits !\n", value, nb_bits ); } +#ifndef IND_LIST_DYN if ( hBstr->next_ind >= MAX_NUM_INDICES ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Total number of indices exceeded: %d !\n", MAX_NUM_INDICES ); @@ -352,16 +1199,43 @@ ivas_error push_next_indice( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Indice with value %d is trying to re-write an existing indice (frame %d) !\n", value, frame ); } #endif +#endif + +#ifdef IND_LIST_DYN + /* check the limits of the list of indices */ + error = check_ind_list_limits( hBstr ); +#endif + +#ifdef IND_LIST_DYN + /* get the id of the previous indice -> it will be re-used */ + if ( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + else + { + prev_id = 0; + } +#endif /* store the values in the list */ +#ifdef IND_LIST_DYN + 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].nb_bits = nb_bits; +#else hBstr->ind_list[hBstr->next_ind].value = value; hBstr->ind_list[hBstr->next_ind].nb_bits = nb_bits; - hBstr->next_ind++; +#endif - /* update the total number of bits already written */ + /* updates */ +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot++; +#else + hBstr->next_ind++; +#endif hBstr->nb_bits_tot += nb_bits; - return error; } @@ -389,39 +1263,161 @@ void push_next_bits( uint16_t code; int16_t i, nb_bits_m15; Indice *ptr; +#ifdef IND_LIST_DYN + int16_t prev_id; +#endif #ifdef DEBUG_BS_READ_WRITE printf( "%s: %d: %d\n", func, line, nb_bits ); #endif + +#ifdef IND_LIST_DYN + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; + + /* get the id of the previous indice -> will be re-used */ + if ( hBstr->nb_ind_tot > 0 ) + { + prev_id = hBstr->ind_list[hBstr->nb_ind_tot - 1].id; + } + else + { + prev_id = 0; + } +#else ptr = &hBstr->ind_list[hBstr->next_ind]; +#endif nb_bits_m15 = nb_bits - 15; for ( i = 0; i < nb_bits_m15; i += 16 ) { code = (uint16_t) ( ( bits[i] << 15 ) | ( ( bits[i + 1] << 14 ) | ( ( bits[i + 2] << 13 ) | ( ( bits[i + 3] << 12 ) | ( ( bits[i + 4] << 11 ) | ( ( bits[i + 5] << 10 ) | ( ( bits[i + 6] << 9 ) | ( ( bits[i + 7] << 8 ) | ( ( bits[i + 8] << 7 ) | ( ( bits[i + 9] << 6 ) | ( ( bits[i + 10] << 5 ) | ( ( bits[i + 11] << 4 ) | ( ( bits[i + 12] << 3 ) | ( ( bits[i + 13] << 2 ) | ( ( bits[i + 14] << 1 ) | bits[i + 15] ) ) ) ) ) ) ) ) ) ) ) ) ) ) ); +#ifdef IND_LIST_DYN + /* check the limits of the list of indices */ + check_ind_list_limits( hBstr ); + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; +#endif + ptr->value = code; #ifdef DEBUG_BS_READ_WRITE printf( "code: %d\n", code ); #endif ptr->nb_bits = 16; +#ifdef IND_LIST_DYN + ptr->id = prev_id; + hBstr->nb_ind_tot++; +#endif ++ptr; } + for ( ; i < nb_bits; ++i ) { +#ifdef IND_LIST_DYN + /* check the limits of the list of indices */ + check_ind_list_limits( hBstr ); + ptr = &hBstr->ind_list[hBstr->nb_ind_tot]; +#endif + ptr->value = bits[i]; #ifdef DEBUG_BS_READ_WRITE printf( "value: %d\n", ptr->value ); #endif ptr->nb_bits = 1; +#ifdef IND_LIST_DYN + ptr->id = prev_id; + hBstr->nb_ind_tot++; +#endif ++ptr; } + +#ifndef IND_LIST_DYN hBstr->next_ind = (int16_t) ( ptr - hBstr->ind_list ); +#endif hBstr->nb_bits_tot = hBstr->nb_bits_tot + nb_bits; return; } +#ifdef IND_LIST_DYN +/*-------------------------------------------------------------------* + * find_indice() + * + * Find indice based on its id + *-------------------------------------------------------------------*/ + +/*! r: result: index of the indice in the list, -1 if not found */ +int16_t find_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ +) +{ + int16_t i; + + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id && hBstr->ind_list[i].nb_bits > 0 ) + { + *value = hBstr->ind_list[i].value; + *nb_bits = hBstr->ind_list[i].nb_bits; + return i; + } + } + + return -1; +} + +/*-------------------------------------------------------------------* + * delete_indice() + * + * Delete indice based on its id (note, that nb_ind_tot and nb_bits_tot are updated) + *-------------------------------------------------------------------*/ + +/*! r: number of deleted indices */ +uint16_t delete_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id /* i : ID of the indice */ +) +{ + int16_t i, j; + + j = 0; + for ( i = 0; i < hBstr->nb_ind_tot; i++ ) + { + if ( hBstr->ind_list[i].id == id ) + { + hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; + continue; + } + + if ( j < i ) + { + /* shift the indice left */ + hBstr->ind_list[j].id = hBstr->ind_list[i].id; + hBstr->ind_list[j].value = hBstr->ind_list[i].value; + hBstr->ind_list[j].nb_bits = hBstr->ind_list[i].nb_bits; + } + + j++; + } + + hBstr->nb_ind_tot = j; +#ifndef IND_LIST_DYN + hBstr->next_ind = j; +#endif + + for ( ; j < i; j++ ) + { + /* reset the shifted indices at the end of the list */ + hBstr->ind_list[j].nb_bits = -1; + } + + return i - j; +} +#endif + + /*-------------------------------------------------------------------* * get_next_indice() * @@ -638,8 +1634,12 @@ void reset_indices_enc( int16_t i; hBstr->nb_bits_tot = 0; +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot = 0; +#else hBstr->next_ind = 0; hBstr->last_ind = -1; +#endif for ( i = 0; i < max_num_indices; i++ ) { @@ -670,7 +1670,11 @@ void reset_indices_dec( *-------------------------------------------------------------------*/ static int16_t write_indices_to_stream( +#ifdef IND_LIST_DYN + Indice *ind_list, +#else Indice *ind_list_metadata, +#endif uint16_t **pt_stream, const int16_t inc, const int16_t num_indices ) @@ -684,8 +1688,13 @@ static int16_t write_indices_to_stream( for ( i = 0; i < num_indices; i++ ) { +#ifdef IND_LIST_DYN + value = ind_list[i].value; + nb_bits = ind_list[i].nb_bits; +#else value = ind_list_metadata[i].value; nb_bits = ind_list_metadata[i].nb_bits; +#endif if ( nb_bits > 0 ) { @@ -717,6 +1726,10 @@ static int16_t write_indices_to_stream( { /* fprintf( stderr, "Warning: %s: nb_bits == 0!\n", __func__ ); */ } + else + { + /* fprintf( stderr, "Warning: %s: nb_bits == %d!\n", __func__, nb_bits ); */ + } #endif } #ifdef ENABLE_BITRATE_VERIFICATION @@ -745,6 +1758,10 @@ static ivas_error write_indices_element( uint16_t *pt_stream_backup; uint16_t *pt_stream_end; int16_t nb_bits_tot_metadata; +#ifdef IND_LIST_DYN + int16_t nb_ind_tot_metadata; +#endif + Indice *ind_list_metadata; int16_t n, n_channels; #ifdef ENABLE_BITRATE_VERIFICATION @@ -755,6 +1772,9 @@ static ivas_error write_indices_element( error = IVAS_ERR_OK; ind_list_metadata = NULL; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = 0; +#endif if ( st_ivas->hEncoderConfig->ivas_format == MONO_FORMAT ) { @@ -772,6 +1792,9 @@ static ivas_error write_indices_element( { nb_bits_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_bits_tot; ind_list_metadata = st_ivas->hSCE[element_id]->hMetaData->ind_list; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot; +#endif } } else if ( !is_SCE && st_ivas->hCPE[element_id] != NULL ) @@ -782,6 +1805,9 @@ static ivas_error write_indices_element( { nb_bits_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_bits_tot; ind_list_metadata = st_ivas->hCPE[element_id]->hMetaData->ind_list; +#ifdef IND_LIST_DYN + nb_ind_tot_metadata = st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot; +#endif } } #ifdef DEBUGGING @@ -822,7 +1848,13 @@ static ivas_error write_indices_element( #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif - write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, MAX_BITS_METADATA ); + write_indices_to_stream( ind_list_metadata, &pt_stream_loc, -1, +#ifdef IND_LIST_DYN + nb_ind_tot_metadata +#else + MAX_BITS_METADATA +#endif + ); #ifdef ENABLE_BITRATE_VERIFICATION if ( total_nb_bits != nb_bits_tot_metadata ) @@ -836,7 +1868,13 @@ static ivas_error write_indices_element( #ifdef ENABLE_BITRATE_VERIFICATION total_nb_bits = #endif - write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, MAX_NUM_INDICES ); + write_indices_to_stream( sts[n]->hBstr->ind_list, &pt_stream_loc, 1, +#ifdef IND_LIST_DYN + sts[n]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); #ifdef ENABLE_BITRATE_VERIFICATION if ( total_nb_bits != sts[n]->hBstr->nb_bits_tot ) @@ -859,21 +1897,41 @@ static ivas_error write_indices_element( { if ( st_ivas->hSCE[element_id]->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, st_ivas->hSCE[element_id]->hMetaData->nb_ind_tot ); +#else reset_indices_enc( st_ivas->hSCE[element_id]->hMetaData, MAX_BITS_METADATA ); +#endif } - reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( sts[0]->hBstr, +#ifdef IND_LIST_DYN + sts[0]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); } else { if ( st_ivas->hCPE[element_id]->hMetaData != NULL ) { +#ifdef IND_LIST_DYN + reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, st_ivas->hCPE[element_id]->hMetaData->nb_ind_tot ); +#else reset_indices_enc( st_ivas->hCPE[element_id]->hMetaData, MAX_BITS_METADATA ); +#endif } for ( n = 0; n < n_channels; n++ ) { - reset_indices_enc( sts[n]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( sts[n]->hBstr, +#ifdef IND_LIST_DYN + sts[n]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); } } @@ -920,6 +1978,7 @@ ivas_error write_indices_ivas( { sts = st_ivas->hSCE[n]->hCoreCoder; i += sts[0]->hBstr->nb_bits_tot; + if ( st_ivas->hSCE[n]->hMetaData != NULL ) { i += st_ivas->hSCE[n]->hMetaData->nb_bits_tot; @@ -933,6 +1992,7 @@ ivas_error write_indices_ivas( { i += sts[ch]->hBstr->nb_bits_tot; } + if ( st_ivas->hCPE[n]->hMetaData != NULL ) { i += st_ivas->hCPE[n]->hMetaData->nb_bits_tot; @@ -950,6 +2010,7 @@ ivas_error write_indices_ivas( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Bitstream write size mismatch! Actual bitrate: %ld vs. Reference bitrate: %d\n", i * 50L, ivas_total_brate ); } #endif + /*-----------------------------------------------------------------* * Encode Payload *-----------------------------------------------------------------*/ @@ -969,7 +2030,7 @@ ivas_error write_indices_ivas( return error; } - +#ifndef IND_LIST_DYN /*-------------------------------------------------------------------* * indices_to_serial_generic() * @@ -1019,6 +2080,7 @@ void indices_to_serial_generic( return; } +#endif /*---------------------------------------------------------------------* * convertSerialToBytestream( ) @@ -1801,7 +2863,9 @@ ivas_error preview_indices( if ( bit_stream[2] == 0 ) { st_ivas->ivas_format = SBA_FORMAT; - st_ivas->sba_mode = ivas_sba_mode_select( total_brate ); +#ifndef SBA_MODE_CLEAN_UP + st_ivas->sba_mode = ivas_sba_mode_select(); +#endif } else { @@ -1839,9 +2903,6 @@ ivas_error preview_indices( break; case SID_ISM: st_ivas->ivas_format = ISM_FORMAT; - /* temporary hack to make mode signaling work with the current 1-object ISM DTX: read padding bits */ - /* Todo: how to apply this here? maybe pt_stream += ... would work? */ - /* st->bit_stream += ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; */ break; case SID_MULTICHANNEL: st_ivas->ivas_format = MC_FORMAT; @@ -1914,7 +2975,7 @@ ivas_error preview_indices( k = IVAS_FORMAT_SIGNALING_NBITS; if ( st_ivas->ivas_format == MASA_FORMAT ) { - k = IVAS_FORMAT_SIGNALING_NBITS_SBA; + k = IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; } if ( total_brate < MIN_BRATE_MDCT_STEREO ) @@ -1954,9 +3015,9 @@ ivas_error preview_indices( else if ( st_ivas->ivas_format == SBA_FORMAT ) { /* Read SBA planar flag and SBA order */ - st_ivas->sba_planar = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA] == 1 ); - st_ivas->sba_order = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA + 2] == 1 ); - st_ivas->sba_order += 2 * ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_SBA + 1] == 1 ); + st_ivas->sba_planar = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED] == 1 ); + st_ivas->sba_order = ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + 2] == 1 ); + st_ivas->sba_order += 2 * ( bit_stream[IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + 1] == 1 ); st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( total_brate, st_ivas->sba_order ); @@ -2006,7 +3067,7 @@ ivas_error read_indices( file_read_FECpattern( &st_ivas->bfi ); st_ivas->bfi |= bfi; - if ( bfi == FRAMEMODE_MISSING ) /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */ + if ( bfi == FRAMEMODE_MISSING ) { for ( k = 0; k < num_bits; k++ ) { @@ -2106,12 +3167,12 @@ ivas_error read_indices( } /* AMRWB 26.173 G.192 file reader (read_serial) does not declare/use SID_BAD ft, - it declares every bad synch marked frame initially as a lost_speech frame, - and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH. - While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD. + it declares every bad synch marked frame initially as a lost_speech frame, + and then the RXDTX handler CNG state decides the decoding mode CNG/SPEECH. + While In the AMRWB ETSI/3GPP format eid a CRC error in a detected SID_UPDATE frames triggers SID_BAD. - Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR . - */ + Here we inhibit use of the SID-length info, even though it is available in the G.192 file format after STL/EID-XOR . + */ if ( sid_upd_bad ) { sid_upd_bad = 0; @@ -2123,10 +3184,10 @@ ivas_error read_indices( { g192_sid_first = 1; /* SID_FIRST detected for previous AMRWB/AMRWBIO active frames only */ /* It is not possible to perfectly simulate rate switching conditions EVS->AMRWBIO where: - the very first SID_FIRST detection is based on a past EVS active frame - and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO, - due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding - */ + the very first SID_FIRST detection is based on a past EVS active frame + and a good length 0 "SID_FIRST"(NO_DATA) frame is sent in AMRWBIO, + due to the one frame state memory in the AMRWB legacy G.192 SID_FIRST encoding + */ } speech_bad = 0; @@ -2142,7 +3203,7 @@ ivas_error read_indices( } /* Do not allow decoder to enter CNG-synthesis for any instantly received GOOD+LENGTH==0 frame - as this frame was never transmitted, one can not know it is good and has a a length of zero ) */ + as this frame was never transmitted, one can not know it is good and has a a length of zero ) */ if ( *CNG != 0 ) { /* We were in CNG synthesis */ @@ -2172,7 +3233,7 @@ ivas_error read_indices( /* handle bad/lost speech frame(and CS bad SID frame) in the decoders CNG synthesis settings pair (total_brate, bfi) */ if ( ( - bfi != FRAMEMODE_FUTURE && /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */ + bfi != FRAMEMODE_FUTURE && ( *CNG != 0 ) && ( ( speech_bad != 0 ) || ( speech_lost != 0 ) ) ) || /* SP_BAD or SPEECH_LOST) --> stay in CNG */ ( sid_upd_bad != 0 ) ) /* SID_UPD_BAD --> start CNG */ { @@ -2216,8 +3277,7 @@ ivas_error read_indices( } /* GOOD frame */ - if ( st_ivas->bfi == 0 || st_ivas->bfi == FRAMEMODE_FUTURE /* TODO(mcjbm): This fixes channel-aware mode BE. Still requires review from a bitstream reading expert */ - ) + if ( st_ivas->bfi == 0 || st_ivas->bfi == FRAMEMODE_FUTURE ) { /* GOOD frame - convert ITU-T G.192 words to short values */ st_ivas->hDecoderConfig->ivas_total_brate = total_brate; @@ -2340,7 +3400,7 @@ static Word32 read_indices_mime_handle_dtx( /* Now modify bfi flag for the decoder's SPEECH/CNG synthesis logic */ /* in SPEECH synthesis, make sure to activate speech PLC for a received NO_DATA frame, - no_data frames may be injected by the network or by the dejitter buffer */ + no_data frames may be injected by the network or by the dejitter buffer */ /* modify bfi_flag to stay/move into the correct decoder PLC section */ if ( ( *CNG == 0 ) && ( no_data != 0 ) ) { @@ -2360,10 +3420,10 @@ static Word32 read_indices_mime_handle_dtx( /* now bfi, total_brate are set by RX-DTX handler:: - bfi==0, total_brate!=0 CNG or speech pending bitrate - bfi==0, total_brate==0 CNG will continue or start(sid_first, sid_bad) - bfi==1, total_brate!=0 speech PLC - bfi==1, total_brate==0 , speech PLC */ + bfi==0, total_brate!=0 CNG or speech pending bitrate + bfi==0, total_brate==0 CNG will continue or start(sid_first, sid_bad) + bfi==1, total_brate!=0 speech PLC + bfi==1, total_brate==0 , speech PLC */ /* handle available AMRWB/AMRWBIO MIME header ToC rate-info at startup */ if ( ( st->bfi == 1 && st->ini_frame == 0 ) && ( ( amrwb_rfc4867_flag != 0 ) || ( amrwb_rfc4867_flag == 0 && isAMRWB_IOmode != 0 ) ) ) /*AMRWB ToC */ diff --git a/lib_com/cnst.h b/lib_com/cnst.h index 7b359e2f40..a35f5280c2 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -294,9 +294,7 @@ enum IND_ISF_1_2, IND_ISF_1_3, IND_ISF_1_4, -#ifdef LSF_RE_USE_SECONDARY_CHANNEL IND_IC_LSF_PRED, -#endif IND_GSC_ATTACK, IND_GSC_SWB_SPEECH, IND_NOISE_LEVEL, @@ -449,7 +447,9 @@ enum IND_STEREO_2ND_CODER_T, IND_UNUSED, +#ifndef IND_LIST_DYN MAX_NUM_INDICES = IND_UNUSED + 772 /* Total 2640 in line with MAX_BITS_METADATA */ +#endif }; /*----------------------------------------------------------------------------------* @@ -1391,7 +1391,6 @@ enum #define NPARTCLDFB 10 #define NPART_SHAPING 62 -#ifdef ERI_FDCNGVQ_LOW_ROM #define FDCNG_VQ_MAX_LEN FD_CNG_maxN_37bits #define FDCNG_VQ_DCT_NSEGM 4 #define FDCNG_VQ_DCT_MINTRUNC 8 @@ -1408,7 +1407,6 @@ typedef enum _DCTTYPE IDCT_T2_XX_21 = 3 } DCTTYPE; -#endif #define MSSUBFRLEN 12 #define MSNUMSUBFR 6 @@ -1434,7 +1432,8 @@ typedef enum _DCTTYPE #define CHEAP_NORM_SIZE 161 #define CNA_MAX_BRATE ACELP_13k20 -#define MAX_CNA_NBANDS 12 + +#define CNA_INIT_NBANDS 6 #define GAIN_Q_OFFSET_EVS 60.f #define GAIN_Q_OFFSET_IVAS 45.f @@ -1532,7 +1531,8 @@ typedef enum _DCTTYPE #define TOD_NSPEC 80 /* number of spectral bins of the tonal detector */ #define TOD_THR_MASS 0.86f /* initial value for the adaptive threshold of the tonal detector */ #define P2A_FACT 0.9f /* long-term averaging factor for peak-to-average ratio */ -#define THR_P2A 80.0f /* threshold to detect strongly peaky signals */ +#define THR_P2A_HIGH 95.0f /* higher threshold to detect strongly peaky signals at low bitrates*/ +#define THR_P2A 80.0f /* lower threshold to detect strongly peaky signals at higher bitrates */ /*----------------------------------------------------------------------------------* * LD music post-filter constants @@ -2138,7 +2138,7 @@ enum #define IGF_GRID_LB_SHORT 2 /* constants for IGFSCFDecoder and IGFSCFEncoder */ -#define IGF_CTX_OFFSET 3 /* offset added to make the context values nonnegative, for array indexing */ +#define IGF_CTX_OFFSET 3 /* offset added to make the context values non negative, for array indexing */ #define IGF_CTX_COUNT ( 2 * IGF_CTX_OFFSET + 1 ) /* number of contexts for the AC statistical model */ #define IGF_MIN_ENC_SEPARATE -12 /* minimum residual value coded separately, without escape coding */ #define IGF_MAX_ENC_SEPARATE +12 /* maximum residual value coded separately, without escape coding */ @@ -2240,5 +2240,13 @@ enum VOIP_RTPDUMP }; +#ifdef FIX_489_COV_SMOOTHING +typedef enum _COV_SMOOTHING_TYPE +{ + COV_SMOOTH_SPAR, + COV_SMOOTH_MC +} COV_SMOOTHING_TYPE; +#endif + /* clang-format on */ #endif /* CNST_H */ diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 61c68eae5d..33ddc9e881 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -80,6 +80,7 @@ typedef struct _IVAS_ISM_METADATA float gainFactor; float yaw; float pitch; + int16_t non_diegetic_flag; } IVAS_ISM_METADATA; typedef struct @@ -93,6 +94,16 @@ typedef struct float x, y, z; } IVAS_VECTOR3; +#ifdef FIX_439_OTR_PARAMS +typedef enum +{ + HEAD_ORIENT_TRK_NONE, + HEAD_ORIENT_TRK_REF, + HEAD_ORIENT_TRK_AVG, + HEAD_ORIENT_TRK_REF_VEC, + HEAD_ORIENT_TRK_REF_VEC_LEV +} HEAD_ORIENT_TRK_T; +#endif typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE; typedef struct ivas_masa_decoder_ext_out_meta_struct *MASA_DECODER_EXT_OUT_META_HANDLE; @@ -118,6 +129,7 @@ typedef struct float radius; float yaw; float pitch; + int16_t non_diegetic_flag; } IVAS_REND_AudioObjectPosition; typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG diff --git a/lib_com/delay_comp.c b/lib_com/delay_comp.c index 5557a88606..003d942245 100644 --- a/lib_com/delay_comp.c +++ b/lib_com/delay_comp.c @@ -104,7 +104,6 @@ int32_t get_delay( delay += IVAS_FB_DEC_DELAY_NS; } - if ( ivas_format == MASA_FORMAT ) { delay += IVAS_ENC_DELAY_NS; /* Compensate also the encoder delay in the decoder with MASA */ diff --git a/lib_com/disclaimer.c b/lib_com/disclaimer.c index ed55a45b06..10a31d94c0 100644 --- a/lib_com/disclaimer.c +++ b/lib_com/disclaimer.c @@ -55,3 +55,5 @@ int16_t print_disclaimer( FILE *fPtr ) return 0; } + +#undef WMC_TOOL_SKIP diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index f2dbf746b6..f0408ea3dd 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -941,6 +941,75 @@ void SynthesisSTFT( } +#ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------- + * SynthesisSTFT_dirac() + * + * STFT synthesis filterbank + *-------------------------------------------------------------------*/ + +void SynthesisSTFT_dirac( + float *fftBuffer, /* i : FFT bins */ + float *timeDomainOutput, + float *olapBuffer, + const float *olapWin, + const int16_t samples_out, + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +) +{ + int16_t i; + float buf[M + 1 + 320], tmp; + + /* Perform IFFT */ + RFFTN( fftBuffer, hFdCngCom->fftSineTab, hFdCngCom->fftlen, 1 ); + + /* Handle overlap in P/S domain for stereo */ + mvr2r( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); + set_f( olapBuffer + hFdCngCom->frameSize, 0.0f, hFdCngCom->frameSize ); /*olapBuffer, fftBuffer, olapWin*/ + + for ( i = hFdCngCom->frameSize / 4; i < 3 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] += fftBuffer[i] * olapWin[i - hFdCngCom->frameSize / 4]; + } + for ( ; i < 5 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i]; + } + + for ( ; i < 7 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] = fftBuffer[i]; + } + + for ( ; i < hFdCngCom->fftlen; i++ ) + { + olapBuffer[i] = 0; + } + + /* Get time-domain signal */ + v_multc( olapBuffer + hFdCngCom->frameSize / 4, (float) ( hFdCngCom->fftlen / 2 ), timeDomainOutput, samples_out ); + + /* Get excitation */ + v_multc( olapBuffer + hFdCngCom->frameSize / 4 - ( M + 1 ), (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); + tmp = buf[0]; + preemph( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); + residu( hFdCngCom->A_cng, M, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize ); + + /* update and window olapBuf if we have a output frame that is shorter than the default frame size...*/ + if ( samples_out < hFdCngCom->frameSize ) + { + mvr2r( olapBuffer + samples_out, olapBuffer + hFdCngCom->frameSize, 3 * hFdCngCom->frameSize / 4 ); + } + for ( i = 5 * hFdCngCom->frameSize / 4; i < 7 * hFdCngCom->frameSize / 4; i++ ) + { + olapBuffer[i] *= olapWin[i - 3 * hFdCngCom->frameSize / 4]; + } + + return; +} +#endif + + /*------------------------------------------------------------------- * mhvals() * diff --git a/lib_com/fft.c b/lib_com/fft.c index d8493b8726..e6121e818a 100644 --- a/lib_com/fft.c +++ b/lib_com/fft.c @@ -6251,20 +6251,10 @@ void fft( { case 20: fft_len20( re, im, s ); -#ifdef ENHANCED_STEREO_DMX - case 16: - fft_lenN( re, im, FFT_RotVector_256, 256, 1, 16, s, 64, 64 ); - break; - case 32: - fft_lenN( re, im, FFT_RotVector_256, 256, 1, 32, s, 64, 64 ); break; -#endif case 40: fft_lenN( re, im, FFT_RotVector_640, 640, 5, 8, s, 8, 40 ); break; - case 50: - fft_lenN( re, im, FFT_RotVector_400, 400, 5, 10, s, 4, 40 ); - break; case 64: fft_lenN( re, im, FFT_RotVector_256, 256, 8, 8, s, 8, 64 ); break; diff --git a/lib_com/gs_bitallocation.c b/lib_com/gs_bitallocation.c index 7f7809428f..d099c2200c 100644 --- a/lib_com/gs_bitallocation.c +++ b/lib_com/gs_bitallocation.c @@ -616,7 +616,7 @@ void bands_and_bit_alloc( * Complete the bit allocation per frequency band for 16kHz high brate mode *--------------------------------------------------------------------------*/ - if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) /* TBV if applicable */ + if ( L_frame == L_FRAME16k && core_brate > ACELP_32k ) { for ( j = st_band; j < nb_bands; j++ ) { diff --git a/lib_com/hq_tools.c b/lib_com/hq_tools.c index 1d89d03145..0008cb957c 100644 --- a/lib_com/hq_tools.c +++ b/lib_com/hq_tools.c @@ -1290,7 +1290,6 @@ int16_t calc_nor_delta_hf( ynrm[i] += delta; add_bits_denv += bitsforDelta; - temp_num++; } } diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index e94cb926a6..9557f7aef1 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -78,7 +78,7 @@ typedef enum *----------------------------------------------------------------------------------*/ #define IVAS_FORMAT_SIGNALING_NBITS 2 /* number of bits for signaling the IVAS format */ -#define IVAS_FORMAT_SIGNALING_NBITS_SBA ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) +#define IVAS_FORMAT_SIGNALING_NBITS_EXTENDED ( IVAS_FORMAT_SIGNALING_NBITS + 1 ) /*----------------------------------------------------------------------------------* @@ -106,8 +106,8 @@ typedef enum AUDIO_CONFIG_ISM2, /* ISM2 */ AUDIO_CONFIG_ISM3, /* ISM3 */ AUDIO_CONFIG_ISM4, /* ISM4 */ - AUDIO_CONFIG_MASA1, /* MASA1 */ // TBV: seems not to be used - AUDIO_CONFIG_MASA2, /* MASA2 */ // TBV: seems not to be used + AUDIO_CONFIG_MASA1, /* MASA1 */ // TODO: seems not to be used + AUDIO_CONFIG_MASA2, /* MASA2 */ // TODO: seems not to be used AUDIO_CONFIG_EXTERNAL /* external renderer */ } AUDIO_CONFIG; @@ -152,7 +152,8 @@ typedef enum RENDERER_MCMASA_MONO_STEREO, RENDERER_PARAM_ISM, RENDERER_BINAURAL_MIXER_CONV, - RENDERER_BINAURAL_MIXER_CONV_ROOM + RENDERER_BINAURAL_MIXER_CONV_ROOM, + RENDERER_NON_DIEGETIC_DOWNMIX } RENDERER_TYPE; @@ -166,18 +167,28 @@ typedef enum #define HEAD_ROTATION_HOA_ORDER 3 /* HOA 3rd order */ #define MAX_CICP_CHANNELS 16 /* max channels for loudspeaker layouts (16 for custom layouts)*/ #define MAX_OUTPUT_CHANNELS 16 /* Maximum number of output channels (HOA 3rd order) */ +#define MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN 2 /* Maximum number of output channels with non diegetic panning */ #define BINAURAL_CHANNELS 2 /* number of channels for binaural output configuration */ #define CPE_CHANNELS 2 /* number of CPE (stereo) channels */ #define FOA_CHANNELS 4 /* number of FOA channels */ +#define HOA2_CHANNELS 9 + #define MAX_NUM_OBJECTS 4 /* max. number of audio objects */ #define MAX_SCE MAX_NUM_OBJECTS /* max. number of SCEs */ #define MAX_CPE ( MAX_TRANSPORT_CHANNELS / CPE_CHANNELS ) /* max. number of CPEs */ #define MAX_BITS_METADATA 2640 /* max. bit-budget of metadata, one channel */ /* IVAS_fmToDo: to be confirmed for final value once mature */ +#ifndef IND_LIST_DYN #define MAX_NUM_METADATA max( 2, MAX_NUM_OBJECTS ) /* number of max. metadata (now only 2 for DirAC) */ - +#endif +#ifdef IND_LIST_DYN +#define MIN_NUM_IND 10 /* minimum number of indices in the core coder */ +#define MAX_NUM_IND_LFE 100 /* maximum number of indices in the LFE encoder */ +#define MAX_NUM_IND_TEMP_LIST 10 /* maximum number of indices in the temporary list */ +#define MAX_IND_TDM_TMP 10 /* maximum number of indices in the temporary list of TD stereo spatial parameters */ +#endif #define IVAS_ENC_DELAY_NS ACELP_LOOK_NS #define IVAS_DEC_DELAY_NS 3250000L /* 3.25 ms: IVAS decoder delay (without renderer delay) */ @@ -192,6 +203,26 @@ typedef enum #define IVAS_NUM_SUPPORTED_FS 3 /* number of supported sampling-rates in IVAS */ +#ifdef JBM_TSM_ON_TCS +#define CLDFB_SLOT_NS 1250000L /* 1.25ms: CLDFB slot length */ +#define MAX_JBM_SUBFRAMES_5MS 8 +#define DEFAULT_JBM_SUBFRAMES_5MS 4 +#define JBM_CLDFB_SLOTS_IN_SUBFRAME 4 +#define MAX_JBM_CLDFB_TIMESLOTS 32 +#define DEFAULT_JBM_CLDFB_TIMESLOTS 16 +#define MAX_JBM_L_FRAME48k 1920 +#define MAX_JBM_L_FRAME_NS 40000000L +#define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH +#define MAX_CLDFB_DIGEST_CHANNELS 4 + +typedef enum +{ + TC_BUFFER_MODE_NONE = 0, + TC_BUFFER_MODE_RENDERER, + TC_BUFFER_MODE_BUFFER +} TC_BUFFER_MODE; +#endif + /*----------------------------------------------------------------------------------* * IVAS Bitrates *----------------------------------------------------------------------------------*/ @@ -324,6 +355,7 @@ typedef enum #define ISM_RADIUS_MIN 0.0f #define ISM_RADIUS_DELTA 0.25f /* Max radius = (2^ISM_RADIUS_NBITS-1)*0.25 = 15.75 */ #define ISM_EXTENDED_METADATA_BRATE IVAS_64k +#define ISM_METADATA_IS_NDP_BITS 1 #define ISM_EXTENDED_METADATA_BITS 1 #define ISM_METADATA_RS_MAX_FRAMES 5 /* Number of frames with opposite extended metadata flags before switching */ @@ -365,6 +397,7 @@ enum { IND_ISM_NUM_OBJECTS, IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS, + IND_ISM_EXTENDED_NDP_FLAG, IND_ISM_METADATA_FLAG, IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, @@ -373,6 +406,7 @@ enum /* ------------- loop for objects -------------- */ TAG_ISM_LOOP_START = IND_ISM_DTX_COH_SCA + MAX_NUM_OBJECTS, + IND_ISM_NDP_FLAG = TAG_ISM_LOOP_START, IND_ISM_AZIMUTH_DIFF_FLAG = TAG_ISM_LOOP_START, IND_ISM_AZIMUTH = TAG_ISM_LOOP_START, IND_ISM_ELEVATION_DIFF_FLAG = TAG_ISM_LOOP_START, @@ -791,11 +825,7 @@ enum fea_names #define TDM_LP_REUSE_BITS 1 /* number of bits to code LP reuse flag for secondary channel */ #define TDM_LR_CONTENT_BITS 1 /* number of bits to code flag when the content is LR or not */ #define TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ( TDM_SECONDARY_SIGNALLING + TDM_RATIO_BITS + TDM_LP_REUSE_BITS + TDM_LR_CONTENT_BITS + STEREO_BITS_TCA ) -#ifdef LSF_RE_USE_SECONDARY_CHANNEL -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE #define TDM_IC_LSF_PRED_BITS 1 /* number of bits to code the inter channel LSF prediction mode */ -#endif -#endif /*----------------------------------------------------------------------------------* @@ -829,18 +859,21 @@ enum fea_names #define SNS_LOW_BR_MODE -1 #define SNS_NPTS 16 /* Number of downsampled SNS parameters */ -#ifdef SNS_MSVQ #define SNS_STEREO_MODE_LR 0 #define SNS_STEREO_MODE_MS 1 #define SNS_STEREO_MODE_OFFSET_INDICES 4 #define SNS_MSVQ_NSTAGES_TCX20 4 #define SNS_MSVQ_NSTAGES_TCX10 3 #define SNS_MSVQ_NSTAGES_SIDE 2 -#endif +#define SNS_CDBKS_BITS_4_FRAC 12 +#define SNS_MEANS_BITS_4_FRAC 14 #define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f #define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC #define MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN 20 +#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY +#define MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE 3 +#endif typedef enum { EQUAL_CORES, @@ -865,9 +898,10 @@ typedef enum { /*----------------------------------------------------------------------------------* * General Parametric Coding Constants *----------------------------------------------------------------------------------*/ -// VE: this should be renamed to e.g. N_SPATIAL_SUBFRAMES + #define MAX_PARAM_SPATIAL_SUBFRAMES 4 /* Maximum number of subframes for parameteric spatial coding */ #define L_SPATIAL_SUBFR_48k (L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES) +#define CLDFB_SLOTS_PER_SUBFRAME ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) /* Number of CLDFB slots per subframe */ /*----------------------------------------------------------------------------------* @@ -885,20 +919,21 @@ typedef enum { #define SBA_NHARM_HOA3 16 #define SBA_T_DESIGN_11_SIZE 70 #define SBA_DTX_BITRATE_THRESHOLD IVAS_80k - +#ifndef SBA_MODE_CLEAN_UP typedef enum { SBA_MODE_NONE, SBA_MODE_DIRAC, - SBA_MODE_SPAR, // VE: this is actually SBA_MODE_SPAR_DIRAC + SBA_MODE_SPAR, } SBA_MODE; +#endif /*----------------------------------------------------------------------------------* * DirAC Constants *----------------------------------------------------------------------------------*/ -#define DIRAC_MAX_ANA_CHANS FOA_CHANNELS /* Maximum number of channels for DirAC analysis */ +#define DIRAC_MAX_ANA_CHANS 11 /* Maximum number of channels for DirAC analysis */ #define DIRAC_NUM_DIMS 3 /* number of directions to estimate (X,Y,Z) */ #define DIRAC_MAX_NBANDS 12 /* Maximum number of frequency bands for the DirAC Side Parameter decoding */ @@ -912,6 +947,9 @@ typedef enum #define DIRAC_NO_FB_BANDS_MAX MDFT_FB_BANDS_240 #define DELAY_DIRAC_ENC_CMP_NS_PARAM_ISM ( IVAS_ENC_DELAY_NS + IVAS_DEC_DELAY_NS ) /* == 12 ms */ +#define DIRAC_HO_NUMSECTORS 2 +#define NUM_ANA_SECTORS 2 + /* DirAC renderer setup */ typedef enum @@ -970,7 +1008,10 @@ typedef enum #define SPAR_CONFIG_BW FB -#define IVAS_SPAR_MAX_CH (FOA_CHANNELS + 2 * ( IVAS_MAX_SBA_ORDER - 1 )) /* FOA + planar HOA */ +#define IVAS_SPAR_MAX_CH ((( IVAS_MAX_SBA_ORDER ) * ( IVAS_MAX_SBA_ORDER )) + 2) /* HOA2 + pHOA3*/ +#define IVAS_HBR_MAX_DECOR_CHS (2) + +#define IVAS_SPAR_MAX_FB_IN_CHAN 11 #define IVAS_SPAR_P_LOWERTRI ((IVAS_SPAR_MAX_CH - 1) * (IVAS_SPAR_MAX_CH - 2)) >> 1 #define IVAS_SPAR_MAX_C_COEFF (IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS) * ( IVAS_SPAR_MAX_DMX_CHS - 1) @@ -982,10 +1023,15 @@ typedef enum /* AGC constants */ #define AGC_BITS_PER_CH 3 #define AGC_EMAX 0 +#ifdef ARITH_HUFF_CODER_CHANGES +#define AGC_SIGNALLING_BITS 1 +#define IVAS_SPAR_ARITH_OVERSHOOT_BITS (16) +#endif /* Common SPAR metadata constants */ #define IVAS_ACTIVEW_DM_F_SCALE 0.5f #define IVAS_ACTIVEW_DM_F_SCALE_DTX 0.25f +#define IVAS_ACTIVEW_DM_F_SCALE_VLBR 0.25f #define IVAS_SPAR_FOA_DFLT_FREQ_PER_CHAN 24000 #define MAX_QUANT_STRATS 3 @@ -1018,9 +1064,9 @@ typedef enum DECX_COEFF } ivas_coeffs_type_t; -#define IVAS_SPAR_BR_TABLE_LEN 18 +#define IVAS_SPAR_BR_TABLE_LEN 20 -/* TD decorr */ // VE: not all 16CH are currently supported -> t be revisited later +/* TD decorr */ // ToDo: not all 16CH are currently supported -> to be revisited later enum { IVAS_TD_DECORR_OUT_1CH = 1, @@ -1140,6 +1186,9 @@ enum #define MASA_DIRECTION_MAX_BITS 11 #define MASA_NO_INDEX 32767 #define MASA_BITS_ER 3 +#ifdef HR_METADATA +#define MASA_BITS_ER_HR 4 +#endif #define MASA_MIN_BITS_TF 4 #define MASA_LIMIT_2D 2 #define MASA_NO_CV_COH 8 @@ -1158,6 +1207,15 @@ enum #define MASA_COH_LIMIT_2IDX 144 /* limit for sum of values across components for having two joint indexes */ #define QMETADATA_MAX_NO_DIRECTIONS 2 #define MASA_MAX_BITS 1300 /* max. bit-budget for MASA metadata */ + +#ifdef HR_METADATA +#define MASA_MAX_BITS_HR 2000 /* max. bit-budget for MASA metadata in HR mode*/ +#define HR_MASA_ER_LEVELS 16 +#endif +#ifdef FIX_HBR_MASAMETA +#define MAX_REDUCED_NBANDS 18 /* max number of subbands that is less than the default value 24 */ +#endif + #define LIMIT_ER_ELEVATION_ENC 4 #define LIMIT_ER_SIMPLE_ENC 6 #define LIMIT_USE_COMMON 3 @@ -1169,7 +1227,9 @@ enum #define MASA_ANGLE_TOLERANCE 0.5f #define MASA_LIMIT_NO_BANDS_SUR_COH 8 #define MINIMUM_BIT_BUDGET_NORMAL_META 100 +#define DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC 4 #define DIFF_DFRATIO_2BIT_LIMIT_IDX 3 + #define DIFF_DFRATIO_1BIT_LIMIT_IDX 6 #define DIFF_EC_HUFF_BAND_LIMIT 8 #define DIFF_EC_HUFF_GR0_LIMIT 8 @@ -1186,7 +1246,12 @@ enum #define MASA_STEREO_MIN_BITRATE IVAS_24k4 #define MASA_BIT_REDUCT_PARAM 10 -#define MASA_MAXIMUM_TWO_DIR_BANDS 18 +#ifdef HR_METADATA +#define MASA_MAXIMUM_TWO_DIR_BANDS 24 +#define NBITS_HR_COH 4 +#else +#define MASA_MAXIMUM_TWO_DIR_BANDS 18 +#endif typedef enum { MASA_STEREO_NOT_DEFINED, @@ -1212,7 +1277,8 @@ typedef enum MC_MODE_NONE, MC_MODE_MCT, MC_MODE_PARAMMC, - MC_MODE_MCMASA + MC_MODE_MCMASA, + MC_MODE_PARAMUPMIX } MC_MODE; typedef enum @@ -1272,6 +1338,55 @@ typedef enum MCT_CHAN_MODE_IGNORE } MCT_CHAN_MODE; +/*----------------------------------------------------------------------------------* + * MC Param-Upmix Mode Constants + *----------------------------------------------------------------------------------*/ +#define MC_PARAMUPMIX_MAX_TRANSPORT_CHANS 8 +#define MC_PARAMUPMIX_MAX_INPUT_CHANS 12 +#define MC_PARAMUPMIX_MAX_BITS 1024 /* Maximum number of bits for the MC Param-Upmix metadata */ +#define MC_PARAMUPMIX_COMBINATIONS 4 /* number of sets of 2 channels combined */ +#define MC_PARAMUPMIX_NCH 2 /* number of channels to combine into 1 */ +#define MC_PARAMUPMIX_MIN_CLDFB 8 + +typedef struct { + const int32_t *value; + const uint16_t *length; +} HUFF_TAB; + +typedef struct { + int32_t value[81]; + unsigned short length[81]; +} HUFF_ELEMENTS; + +typedef struct { + HUFF_ELEMENTS df0; + HUFF_ELEMENTS df; + HUFF_ELEMENTS dt; +} HUFF_TABLE; + +typedef enum { + ALPHA, + BETA +} PAR_TYPE; + +typedef enum { + FINE, + COARSE +} QUANT_TYPE; + +typedef struct { + int16_t nquant; + int16_t offset; + float data[35]; +} ACPL_QUANT_TABLE; + +typedef struct +{ + const int16_t (*alpha[2])[2]; + const int16_t (*beta[2])[2]; +} HUFF_NODE_TABLE; + + /*----------------------------------------------------------------------------------* * Parametric MC Constants *----------------------------------------------------------------------------------*/ @@ -1288,7 +1403,11 @@ typedef enum #define PARAM_MC_REG_GHAT (0.001f) /* Regularization factor for mixing matrix calculation */ #define PARAM_MC_MAX_PARAMETER_BANDS 20 /* Maximum number of parameter bands */ #define PARAM_MC_MAX_PARAMETER_BANDS_RES 14 /* Maximum number of parameter bands with decorrelation */ +#ifdef JBM_TSM_ON_TCS +#define PARAM_MC_MAX_NSLOTS MAX_JBM_CLDFB_TIMESLOTS /* Maximum number of CLDFB slots in a frame */ +#else #define PARAM_MC_MAX_NSLOTS 16 /* Maximum number of CLDFB slots in a frame */ +#endif #define PARAM_MC_MAX_NSLOTS_IN_SUBFRAME 4 /* Maximum number of CLDFB slots in a subframe */ #define PARAM_MC_NSUBFRAMES_DEC 4 /* Number of subframes for the synthesis in the decoder */ #define PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND 30 /* Maximum number of CLDFB frequency bands within a parameter band */ @@ -1319,9 +1438,7 @@ typedef enum #define PARAM_MC_BAND_TO_MDCT_BAND_RATIO 16 /* Ratio of resolution of CLDFB Bands to MDCT Bands */ #define PARAM_MC_SLOT_ENC_NS 2500000L #define PARAM_MC_MDFT_NO_SLOTS 8 -#ifdef PARAMMC_SHORT_ENC_MDFT #define PARAM_MC_CLDFB_TO_MDFT_FAC 2 -#endif /*----------------------------------------------------------------------------------* * LFE Coding Constants @@ -1397,7 +1514,11 @@ typedef enum #define BINAURAL_MAXBANDS 60 /* Max number of bands */ #define BINAURAL_CONVBANDS 50 /* Bands upto which convolution is performed */ +#ifdef UPDATE_SBA_FILTER +#define BINAURAL_NTAPS 5 +#else #define BINAURAL_NTAPS 7 +#endif #define BINAURAL_NTAPS_MAX 96 #define HRTF_SH_ORDER 3 @@ -1415,7 +1536,13 @@ typedef enum { BINAURAL_INPUT_AUDIO_CONFIG_INVALID, BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */ +#ifdef UPDATE_SBA_FILTER + BINAURAL_INPUT_AUDIO_CONFIG_HOA3, /* HOA3 */ + BINAURAL_INPUT_AUDIO_CONFIG_HOA2, /* HOA2 */ + BINAURAL_INPUT_AUDIO_CONFIG_FOA, /* FOA */ +#else BINAURAL_INPUT_AUDIO_CONFIG_HOA, /* FOA, HOA2, HOA3 */ +#endif BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED /* Not used */ } BINAURAL_INPUT_AUDIO_CONFIG; @@ -1442,11 +1569,7 @@ typedef enum #define SFX_SPAT_BIN_NUM_SUBSAMPLES 64 #define ITD_MEM_LEN (MAX_ITD + SFX_SPAT_BIN_SINC_M) #define L_SUBFRAME5MS_48k (L_FRAME48k/4) -#ifdef FIX_421_TD_INT_TUNE #define MAX_ANGULAR_STEP (0.01f) -#else -#define MAX_ANGULAR_STEP (1.0f) -#endif #define MAX_ANGULAR_STEP_INV ( 1.0f / MAX_ANGULAR_STEP ) #define MAX_INTERPOLATION_STEPS 12 @@ -1467,7 +1590,8 @@ typedef enum typedef enum { TDREND_PLAYSTATUS_INITIAL, - TDREND_PLAYSTATUS_PLAYING + TDREND_PLAYSTATUS_PLAYING, + TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC } TDREND_PlayStatus_t; typedef enum @@ -1490,6 +1614,7 @@ typedef enum } SFX_OpMode_t; +#ifndef FIX_439_OTR_PARAMS /*----------------------------------------------------------------------------------* * Orientation tracking constants *----------------------------------------------------------------------------------*/ @@ -1510,7 +1635,7 @@ typedef enum OTR_TRACKING_REF_VEC = IVAS_ORIENT_TRK_REF_VEC, /* track orientation relative to external reference vector */ OTR_TRACKING_REF_VEC_LEV = IVAS_ORIENT_TRK_REF_VEC_LEV /* track orientation relative to level component of external reference vector */ } OTR_TRACKING_T; - +#endif /*----------------------------------------------------------------------------------* * Reverberator constants @@ -1536,9 +1661,7 @@ typedef enum #define IVAS_320_PT_LEN 320 #define IVAS_240_PT_LEN 240 #define IVAS_160_PT_LEN 160 -#ifdef PARAMMC_SHORT_ENC_MDFT #define IVAS_120_PT_LEN 120 -#endif #define IVAS_80_PT_LEN 80 #define IVAS_40_PT_LEN 40 @@ -1642,11 +1765,17 @@ typedef enum #define IVAS_16K_12BANDS_ACTIVE_BANDS 10 #define SPAR_DIRAC_SPLIT_START_BAND 8 +#define DIRAC_TO_SPAR_HBR_PRED_CHS (FOA_CHANNELS - 1) #define SPAR_DTX_BANDS 2 #define DIRAC_DTX_BANDS 2 #define SPAR_DIRAC_DTX_BANDS ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS ) #define CLDFB_PAR_WEIGHT_START_BAND 7 +#ifdef ARITH_HUFF_CODER_CHANGES +#define QUANT_STRAT_0 0 +#define QUANT_STRAT_2 2 +#endif + /*----------------------------------------------------------------------------------* * Limiter constants diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 35ce6b8546..e407bccc6c 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -35,6 +35,9 @@ #ifdef DEBUGGING #include "debug.h" #endif +#ifdef FIX_489_COV_SMOOTHING +#include "cnst.h" +#endif #include "ivas_prot.h" #include "wmc_auto.h" #include "prot.h" @@ -50,13 +53,51 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, const float max_update_rate, - const int16_t min_pool_size, - const int16_t nchan_inp /* i : number of input channels */ -) + const int16_t min_pool_size +#ifdef FIX_489_COV_SMOOTHING + , + const COV_SMOOTHING_TYPE smooth_mode /* i : flag multichannel vs SPAR */ +#endif + , + const int32_t ivas_total_brate ) { int16_t j, k; + if ( ivas_total_brate < IVAS_24k4 ) + { + for ( j = 0; j < pFb->filterbank_num_bands; j++ ) + { + float update_factor; + float *p_bin_to_band; + update_factor = 0.0f; + p_bin_to_band = pFb->fb_bin_to_band.pp_short_stride_bin_to_band[j]; + int16_t active_bins; + active_bins = pFb->fb_bin_to_band.p_short_stride_num_bins_per_band[j]; + + for ( k = 0; k < active_bins; k++ ) + { + update_factor += p_bin_to_band[k]; + } - if ( nchan_inp <= FOA_CHANNELS ) + hCovState->pSmoothing_factor[j] = update_factor / min_pool_size; + float smooth_fact; + if ( ivas_total_brate < IVAS_24k4 ) + { + smooth_fact = 0.5f; + } + else + { + smooth_fact = 0.75; + } + hCovState->pSmoothing_factor[j] *= ( j + 1 ) * smooth_fact; + + if ( hCovState->pSmoothing_factor[j] > max_update_rate ) + { + hCovState->pSmoothing_factor[j] = max_update_rate; + } + } + } +#ifdef FIX_489_COV_SMOOTHING + else if ( smooth_mode == COV_SMOOTH_MC ) { for ( j = 0; j < pFb->filterbank_num_bands; j++ ) { @@ -76,6 +117,7 @@ static void ivas_set_up_cov_smoothing( } } } +#endif else { for ( j = 0; j < pFb->filterbank_num_bands; j++ ) @@ -98,6 +140,7 @@ static void ivas_set_up_cov_smoothing( } } } + hCovState->prior_bank_idx = -1; return; @@ -115,6 +158,11 @@ ivas_error ivas_spar_covar_smooth_enc_open( const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ const int16_t nchan_inp /* i : number of input channels */ + , +#ifdef FIX_489_COV_SMOOTHING + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ +#endif + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { ivas_cov_smooth_state_t *hCovState; @@ -142,8 +190,12 @@ ivas_error ivas_spar_covar_smooth_enc_open( } } - ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, - nchan_inp ); + +#ifdef FIX_489_COV_SMOOTHING + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate ); +#else + ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate ); +#endif *hCovState_out = hCovState; diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 01f133a3b7..091215ac63 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -48,6 +48,30 @@ static uint16_t deindex_sph_idx_general( const int16_t idx_sph, const int16_t no_bits, float *theta_dec, float *phi_dec, uint16_t *p_id_phi, const MC_LS_SETUP mc_format ); + +/*------------------------------------------------------------------------- + * ivas_get_hodirac_flag() + * + * Return flag for HO-DirAC method at high bitrates + *------------------------------------------------------------------------*/ + +/*! r: HO-DirAC flag */ +int16_t ivas_get_hodirac_flag( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + if ( sba_order > 1 && ivas_total_brate > IVAS_256k ) + { + return 1; + } + else + { + return 0; + } +} + + /*------------------------------------------------------------------------- * ivas_dirac_sba_config() * @@ -61,7 +85,11 @@ ivas_error ivas_dirac_config( { IVAS_FORMAT ivas_format; int16_t sba_order; +#ifndef SBA_MODE_CLEAN_UP int16_t *nSCE, *nCPE, *element_mode, *nchan_transport; +#else + int16_t *element_mode; +#endif int32_t ivas_total_brate; DIRAC_CONFIG_DATA_HANDLE hConfig; IVAS_QMETADATA_HANDLE hQMetaData; @@ -70,25 +98,35 @@ ivas_error ivas_dirac_config( ivas_error error; int16_t spar_dirac_split_band; IVAS_FB_MIXER_HANDLE hFbMdft; +#ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode; +#endif + int16_t *dirac_to_spar_md_bands; + error = IVAS_ERR_OK; if ( enc_dec == ENC ) { ivas_format = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_format; +#ifndef SBA_MODE_CLEAN_UP nSCE = &( ( (Encoder_Struct *) st_ivas )->nSCE ); nCPE = &( (Encoder_Struct *) st_ivas )->nCPE; +#endif element_mode = &( (Encoder_Struct *) st_ivas )->hEncoderConfig->element_mode_init; +#ifndef SBA_MODE_CLEAN_UP nchan_transport = &( (Encoder_Struct *) st_ivas )->nchan_transport; +#endif sba_order = ( (Encoder_Struct *) st_ivas )->sba_analysis_order; ivas_total_brate = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_total_brate; Fs = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->input_Fs; band_grouping = ( (Encoder_Struct *) st_ivas )->hDirAC->band_grouping; hConfig = ( (Encoder_Struct *) st_ivas )->hDirAC->hConfig; hQMetaData = ( (Encoder_Struct *) st_ivas )->hQMetaData; +#ifndef SBA_MODE_CLEAN_UP sba_mode = ( (Encoder_Struct *) st_ivas )->sba_mode; +#endif if ( ( (Encoder_Struct *) st_ivas )->hSpar != NULL ) { hFbMdft = ( (Encoder_Struct *) st_ivas )->hSpar->hFbMixer; @@ -97,22 +135,32 @@ ivas_error ivas_dirac_config( { hFbMdft = NULL; } +#ifndef SBA_MODE_CLEAN_UP dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands; +#else + dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands; +#endif } else { ivas_format = ( (Decoder_Struct *) st_ivas )->ivas_format; +#ifndef SBA_MODE_CLEAN_UP nSCE = &( (Decoder_Struct *) st_ivas )->nSCE; nCPE = &( (Decoder_Struct *) st_ivas )->nCPE; +#endif element_mode = &( (Decoder_Struct *) st_ivas )->element_mode_init; +#ifndef SBA_MODE_CLEAN_UP nchan_transport = &( (Decoder_Struct *) st_ivas )->nchan_transport; +#endif sba_order = ( (Decoder_Struct *) st_ivas )->sba_analysis_order; ivas_total_brate = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->ivas_total_brate; Fs = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->output_Fs; band_grouping = ( (Decoder_Struct *) st_ivas )->hDirAC->band_grouping; hConfig = ( (Decoder_Struct *) st_ivas )->hDirAC->hConfig; hQMetaData = ( (Decoder_Struct *) st_ivas )->hQMetaData; +#ifndef SBA_MODE_CLEAN_UP sba_mode = ( (Decoder_Struct *) st_ivas )->sba_mode; +#endif if ( ( (Decoder_Struct *) st_ivas )->hSpar != NULL ) { hFbMdft = ( (Decoder_Struct *) st_ivas )->hSpar->hFbMixer; @@ -122,13 +170,27 @@ ivas_error ivas_dirac_config( hFbMdft = NULL; } ( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft; +#ifndef SBA_MODE_CLEAN_UP dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands; +#else + dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands; +#endif } +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { hConfig->nbands = IVAS_MAX_NUM_BANDS; + spar_dirac_split_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + + if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) + { + spar_dirac_split_band = 0; + } } else { @@ -137,17 +199,27 @@ ivas_error ivas_dirac_config( } hConfig->enc_param_start_band = 0; hConfig->dec_param_estim = FALSE; - +#ifndef FIX_393_459_460_SBA_MD + hConfig->dec_param_estim_old = hConfig->dec_param_estim; +#endif if ( ivas_format == SBA_FORMAT ) /* skip for MASA decoder */ { +#ifndef SBA_MODE_CLEAN_UP if ( ( error = ivas_dirac_sba_config( hQMetaData, nchan_transport, nSCE, nCPE, element_mode, ivas_total_brate, sba_order, sba_mode, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_dirac_sba_config( hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) +#endif { return error; } if ( hQMetaData != NULL ) { +#ifndef SBA_MODE_CLEAN_UP if ( enc_dec == ENC || sba_mode != SBA_MODE_SPAR ) +#else + if ( enc_dec == ENC || ivas_format != SBA_FORMAT ) +#endif { hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands; } @@ -155,13 +227,25 @@ ivas_error ivas_dirac_config( } +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif hConfig->dec_param_estim = TRUE; if ( hConfig->dec_param_estim == TRUE ) { hConfig->enc_param_start_band = spar_dirac_split_band; } + + if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) + { + hConfig->dec_param_estim = FALSE; + hConfig->enc_param_start_band = 0; + + set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); + hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; + } +#ifndef SBA_MODE_CLEAN_UP } else { @@ -170,17 +254,20 @@ ivas_error ivas_dirac_config( hConfig->dec_param_estim = TRUE; } } +#endif } +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), - dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } else { - ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), - NULL, 0, 0, hFbMdft ); + ivas_dirac_config_bands( band_grouping, hConfig->nbands, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); } return error; @@ -259,9 +346,10 @@ void ivas_dirac_config_bands( { band_grouping[reduced_band] = max_band; } - for ( band = enc_param_start_band + 1; band < DIRAC_MAX_NBANDS; band++ ) + for ( band = enc_param_start_band + ( DIRAC_MAX_NBANDS - enc_param_start_band ) / 2 - 1, reduced_band = DIRAC_MAX_NBANDS - 1; band >= enc_param_start_band; band--, reduced_band -= step ) { - dirac_to_spar_md_bands[band] = dirac_to_spar_md_bands[band - 1]; + dirac_to_spar_md_bands[reduced_band] = dirac_to_spar_md_bands[band]; + dirac_to_spar_md_bands[reduced_band - 1] = dirac_to_spar_md_bands[band]; } } else @@ -289,6 +377,70 @@ void ivas_dirac_config_bands( return; } +#ifdef ARITH_HUFF_CODER_CHANGES +void ivas_get_dirac_sba_max_md_bits( + const int32_t sba_total_brate, + int16_t *bits_frame_nominal, + int16_t *metadata_max_bits, + int16_t *qmetadata_max_bit_req, + int16_t nbands ) +{ + if ( sba_total_brate <= IVAS_13k2 ) + { + *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; + *metadata_max_bits = 70; + } + else if ( sba_total_brate <= IVAS_16k4 ) + { + *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; + *metadata_max_bits = 80; + } + else if ( sba_total_brate <= IVAS_24k4 ) + { + *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; + *metadata_max_bits = 103; + } + else if ( sba_total_brate <= IVAS_32k ) + { + *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; + *metadata_max_bits = 214; + } + else if ( sba_total_brate <= IVAS_48k ) + { + *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; + *metadata_max_bits = 240; + } + else if ( sba_total_brate <= IVAS_64k ) + { + *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_80k ) + { + *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_96k ) + { + *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; + *metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_128k ) + { + *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; + *metadata_max_bits = 250; + } + else + { + *bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + *metadata_max_bits = MAX16B; /* no limit */ + } + *metadata_max_bits = (int16_t) ceilf( (float) *metadata_max_bits * nbands / 5 ); + *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; + + return; +} +#endif /*------------------------------------------------------------------------- * ivas_dirac_sba_config() @@ -298,26 +450,36 @@ void ivas_dirac_config_bands( ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE, /* o : number of CPEs */ - int16_t *element_mode, /* i/o: element mode of the core coder */ - int32_t sba_total_brate, /* i : SBA total bitrate */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t nbands /* i : number of frequency bands */ +#ifndef SBA_MODE_CLEAN_UP + int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ + int16_t *nSCE, /* o : number of SCEs */ + int16_t *nCPE, /* o : number of CPEs */ +#endif + int16_t *element_mode, /* i/o: element mode of the core coder */ + int32_t sba_total_brate, /* i : SBA total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode, /* i : SBA mode */ +#endif + const int16_t nbands /* i : number of frequency bands */ ) { +#ifndef SBA_MODE_CLEAN_UP int16_t i; int16_t nbands_wb; +#endif int16_t nbands_coded; + int16_t hodirac_flag; ivas_error error; error = IVAS_ERR_OK; hQMetaData->is_masa_ivas_format = 0; + hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order ); +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif /* map the bitrate for SID frame */ if ( sba_total_brate == IVAS_SID_5k2 ) { @@ -351,69 +513,105 @@ ivas_error ivas_dirac_sba_config( else { hQMetaData->useLowerBandRes = 0; - nbands_coded = nbands - 1; /* always combine the last two bands */ + if ( hodirac_flag == 0 ) + { + nbands_coded = nbands - 1; /* always combine the last two bands */ + } } - if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, 1, 0 ) ) != IVAS_ERR_OK ) { - return error; - } + int16_t no_dirs = 1; + if ( hodirac_flag ) + { + no_dirs = 2; + } - if ( sba_total_brate <= IVAS_13k2 ) - { - hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 70; - } - else if ( sba_total_brate <= IVAS_16k4 ) - { - hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 80; - } - else if ( sba_total_brate <= IVAS_24k4 ) - { - hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 103; - } - else if ( sba_total_brate <= IVAS_32k ) - { - hQMetaData->bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 214; - } - else if ( sba_total_brate <= IVAS_48k ) - { - hQMetaData->bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 240; - } - else if ( sba_total_brate <= IVAS_64k ) - { - hQMetaData->bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_80k ) - { - hQMetaData->bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_96k ) - { - hQMetaData->bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_128k ) - { - hQMetaData->bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 250; - } - else - { - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); - hQMetaData->metadata_max_bits = MAX16B; /* no limit */ + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } +#if !defined( FIX_DTX_428 ) + { + int16_t dir, j; + for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) + { + for ( j = 0; j < nbands_coded; j++ ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[dir].band_data[j].energy_ratio_index[i] = 0; + hQMetaData->q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; + } + } + } + } +#endif } +#ifdef ARITH_HUFF_CODER_CHANGES + ivas_get_dirac_sba_max_md_bits( + sba_total_brate, + &hQMetaData->bits_frame_nominal, + &hQMetaData->metadata_max_bits, + &hQMetaData->qmetadata_max_bit_req, + hQMetaData->q_direction[0].cfg.nbands ); +#else + if ( sba_total_brate <= IVAS_13k2 ) + { + hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 70; + } + else if ( sba_total_brate <= IVAS_16k4 ) + { + hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 80; + } + else if ( sba_total_brate <= IVAS_24k4 ) + { + hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 103; + } + else if ( sba_total_brate <= IVAS_32k ) + { + hQMetaData->bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 214; + } + else if ( sba_total_brate <= IVAS_48k ) + { + hQMetaData->bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 240; + } + else if ( sba_total_brate <= IVAS_64k ) + { + hQMetaData->bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_80k ) + { + hQMetaData->bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_96k ) + { + hQMetaData->bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 200; + } + else if ( sba_total_brate <= IVAS_128k ) + { + hQMetaData->bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; + hQMetaData->metadata_max_bits = 250; + } + else + { + hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); + hQMetaData->metadata_max_bits = MAX16B; /* no limit */ + } - hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); - hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; + hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); + hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; +#endif return error; +#ifndef SBA_MODE_CLEAN_UP } if ( sba_total_brate > IVAS_SID_5k2 ) @@ -449,11 +647,17 @@ ivas_error ivas_dirac_sba_config( } if ( sba_total_brate >= IVAS_96k ) { - if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, 1, 0 ) ) != IVAS_ERR_OK ) { - return error; + int16_t no_dirs = 1; + if ( hodirac_flag ) + { + no_dirs = 2; + } + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } } - nbands_wb = 4; } else @@ -481,7 +685,15 @@ ivas_error ivas_dirac_sba_config( for ( i = 0; i < hQMetaData->no_directions; i++ ) { hQMetaData->q_direction[i].cfg.search_effort = 1; - hQMetaData->q_direction[i].cfg.start_band = nbands_wb; + + if ( hodirac_flag ) + { + hQMetaData->q_direction[i].cfg.start_band = 0; + } + else + { + hQMetaData->q_direction[i].cfg.start_band = nbands_wb; + } } *element_mode = IVAS_CPE_MDCT; @@ -555,8 +767,8 @@ ivas_error ivas_dirac_sba_config( assert( !"SBA number of transport channels must be 8 or lower" ); } } - return error; +#endif } @@ -785,6 +997,241 @@ void deindex_spherical_component( } +/*---------------------------------------------------------------- + * calculate_hodirac_sector_parameters() + * + * + *-----------------------------------------------------------------*/ + +void calculate_hodirac_sector_parameters( +#ifdef FIX_485_STATIC_BUFFERS + DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ +#endif + float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ + float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ + const float beta, /* i : forgetting factor for average filtering */ + const int16_t *band_grouping, /* i : indices of band groups */ + const int16_t N_bands, /* i : number of bands (groups) */ + const int16_t enc_param_start_band, /* i : first band to process */ + float *azi, /* o : array of sector azimuth angles, flat */ + float *ele, /* o : array of sector elevation angles, flat */ + float *diff, /* o : array of sector diffuseness values, flat */ + float *ene /* o : array of sector energy values, flat */ +) +{ + int16_t i_sec, i_bin, i_band; + float p_real, p_imag, normI, energy, tmp_diff; + float sec_I_vec_x[NUM_ANA_SECTORS]; + float sec_I_vec_y[NUM_ANA_SECTORS]; + float sec_I_vec_z[NUM_ANA_SECTORS]; + +#ifndef FIX_485_STATIC_BUFFERS + static int16_t firstrun_sector_params = 1; + + static float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + static float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + static float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + + static float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; + static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; +#endif + + for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) + { + + float *p_sec_I_vec_x = &sec_I_vec_x[i_sec]; + float *p_sec_I_vec_y = &sec_I_vec_y[i_sec]; + float *p_sec_I_vec_z = &sec_I_vec_z[i_sec]; + + const float *p_c_weights = c_weights; + + float *p_ImagBuffer_0 = ImagBuffer[0]; + float *p_ImagBuffer_1 = ImagBuffer[1]; + float *p_ImagBuffer_2 = ImagBuffer[2]; + float *p_ImagBuffer_3 = ImagBuffer[3]; + float *p_ImagBuffer_4 = ImagBuffer[4]; + float *p_ImagBuffer_5 = ImagBuffer[5]; + float *p_ImagBuffer_6 = ImagBuffer[6]; + float *p_ImagBuffer_8 = ImagBuffer[8]; + + float *p_RealBuffer_0 = RealBuffer[0]; + float *p_RealBuffer_1 = RealBuffer[1]; + float *p_RealBuffer_2 = RealBuffer[2]; + float *p_RealBuffer_3 = RealBuffer[3]; + float *p_RealBuffer_4 = RealBuffer[4]; + float *p_RealBuffer_5 = RealBuffer[5]; + float *p_RealBuffer_6 = RealBuffer[6]; + float *p_RealBuffer_8 = RealBuffer[8]; + + for ( i_band = enc_param_start_band; i_band < N_bands; i_band++ ) + { + float *p_azi = &azi[i_sec * N_bands + i_band]; + float *p_ele = &ele[i_sec * N_bands + i_band]; + float *p_ene = &ene[i_sec * N_bands + i_band]; + + float *p_diff = &diff[i_sec * N_bands + i_band]; +#ifdef FIX_485_STATIC_BUFFERS + float *p_azi_prev = &hDirAC->azi_prev[i_sec * N_bands + i_band]; + float *p_ele_prev = &hDirAC->ele_prev[i_sec * N_bands + i_band]; + + float *p_energy_smth = &hDirAC->energy_smth[i_sec][i_band]; + float *p_sec_I_vec_smth_x = &hDirAC->sec_I_vec_smth_x[i_sec][i_band]; + float *p_sec_I_vec_smth_y = &hDirAC->sec_I_vec_smth_y[i_sec][i_band]; + float *p_sec_I_vec_smth_z = &hDirAC->sec_I_vec_smth_z[i_sec][i_band]; +#else + float *p_azi_prev = &azi_prev[i_sec * N_bands + i_band]; + float *p_ele_prev = &ele_prev[i_sec * N_bands + i_band]; + + float *p_energy_smth = &energy_smth[i_sec][i_band]; + float *p_sec_I_vec_smth_x = &sec_I_vec_smth_x[i_sec][i_band]; + float *p_sec_I_vec_smth_y = &sec_I_vec_smth_y[i_sec][i_band]; + float *p_sec_I_vec_smth_z = &sec_I_vec_smth_z[i_sec][i_band]; +#endif + *p_sec_I_vec_x = 0.f; + *p_sec_I_vec_y = 0.f; + *p_sec_I_vec_z = 0.f; + energy = 0.f; + + if ( i_sec == 0 ) + { + for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) + { + float w = *( p_c_weights++ ); + float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag; + float sec_w_real, sec_x_real, sec_y_real, sec_z_real; + + sec_w_imag = 1.772454f * *( p_ImagBuffer_0 ) + 1.772454f * *( p_ImagBuffer_1 ); + sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) + 1.023326f * *( p_ImagBuffer_4++ ); + sec_y_imag = 0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) - 0.590817f * *( p_ImagBuffer_6++ ) - 1.023326f * *( p_ImagBuffer_8++ ); + sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) + 1.023326f * *( p_ImagBuffer_5++ ); + + sec_w_real = 1.772454f * *( p_RealBuffer_0 ) + 1.772454f * *( p_RealBuffer_1 ); + sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) + 1.023326f * *( p_RealBuffer_4++ ); + sec_y_real = 0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) - 0.590817f * *( p_RealBuffer_6++ ) - 1.023326f * *( p_RealBuffer_8++ ); + sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) + 1.023326f * *( p_RealBuffer_5++ ); + + p_real = sec_w_real * w; + p_imag = sec_w_imag * w; + + *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag; + *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag; + *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag; + + energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag + + sec_y_real * sec_y_real + sec_y_imag * sec_y_imag + + sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); + } + } + else + { + for ( i_bin = band_grouping[i_band]; i_bin < band_grouping[i_band + 1]; i_bin++ ) + { + float w = *( p_c_weights++ ); + float sec_w_imag, sec_x_imag, sec_y_imag, sec_z_imag; + float sec_w_real, sec_x_real, sec_y_real, sec_z_real; + + sec_w_imag = 1.772454f * *(p_ImagBuffer_0) -1.772454f * *( p_ImagBuffer_1 ); + sec_x_imag = 1.772454f * *( p_ImagBuffer_3++ ) - 1.023326f * *( p_ImagBuffer_4++ ); + sec_y_imag = -0.590818f * *( p_ImagBuffer_0++ ) + 1.772454f * *( p_ImagBuffer_1++ ) + 0.590817f * *( p_ImagBuffer_6++ ) + 1.023326f * *( p_ImagBuffer_8++ ); + sec_z_imag = 1.772454f * *( p_ImagBuffer_2++ ) - 1.023326f * *( p_ImagBuffer_5++ ); + + sec_w_real = 1.772454f * *(p_RealBuffer_0) -1.772454f * *( p_RealBuffer_1 ); + sec_x_real = 1.772454f * *( p_RealBuffer_3++ ) - 1.023326f * *( p_RealBuffer_4++ ); + sec_y_real = -0.590818f * *( p_RealBuffer_0++ ) + 1.772454f * *( p_RealBuffer_1++ ) + 0.590817f * *( p_RealBuffer_6++ ) + 1.023326f * *( p_RealBuffer_8++ ); + sec_z_real = 1.772454f * *( p_RealBuffer_2++ ) - 1.023326f * *( p_RealBuffer_5++ ); + + p_real = sec_w_real * w; + p_imag = sec_w_imag * w; + + *p_sec_I_vec_x += p_real * sec_x_real + p_imag * sec_x_imag; + *p_sec_I_vec_y += p_real * sec_y_real + p_imag * sec_y_imag; + *p_sec_I_vec_z += p_real * sec_z_real + p_imag * sec_z_imag; + + energy += 0.5f * ( p_real * p_real + p_imag * p_imag + sec_x_real * sec_x_real + sec_x_imag * sec_x_imag + + sec_y_real * sec_y_real + sec_y_imag * sec_y_imag + + sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); + } + } +#ifdef FIX_485_STATIC_BUFFERS + if ( hDirAC->firstrun_sector_params ) +#else + if ( firstrun_sector_params ) +#endif + { + *p_sec_I_vec_smth_x = *p_sec_I_vec_x; + *p_sec_I_vec_smth_y = *p_sec_I_vec_y; + *p_sec_I_vec_smth_z = *p_sec_I_vec_z; + *p_energy_smth = energy; + } + else + { + float w = ( 1.0f - beta ); + *p_sec_I_vec_smth_x = w * *p_sec_I_vec_x + beta * *p_sec_I_vec_smth_x; + *p_sec_I_vec_smth_y = w * *p_sec_I_vec_y + beta * *p_sec_I_vec_smth_y; + *p_sec_I_vec_smth_z = w * *p_sec_I_vec_z + beta * *p_sec_I_vec_smth_z; + *p_energy_smth = w * energy + beta * *p_energy_smth; + } + + if ( energy < EPSILON ) + { + *p_azi = 0.f; + *p_ele = 0.f; + *p_ene = 0.f; + *p_diff = 1.f; + } + else + { + normI = sqrtf( *p_sec_I_vec_smth_x * *p_sec_I_vec_smth_x + + *p_sec_I_vec_smth_y * *p_sec_I_vec_smth_y + + *p_sec_I_vec_smth_z * *p_sec_I_vec_smth_z ); + *p_azi = atan2f( *p_sec_I_vec_smth_y, *p_sec_I_vec_smth_x ) * _180_OVER_PI; + *p_ele = asinf( *p_sec_I_vec_smth_z / ( normI + EPSILON ) ) * _180_OVER_PI; + *p_ene = *p_energy_smth; + *p_diff = 1.f - normI / ( *p_energy_smth + EPSILON ); + } + + tmp_diff = *p_diff; + + if ( tmp_diff < 0.0f ) + { + *p_diff = 0.f; + } + if ( tmp_diff > 0.5f ) + { +#ifdef FIX_485_STATIC_BUFFERS + if ( hDirAC->firstrun_sector_params ) +#else + if ( firstrun_sector_params ) +#endif + { + *p_azi = 0.f; + *p_ele = 0.f; + } + else + { + *p_azi = 2.f * ( 1.f - tmp_diff ) * *p_azi + ( 2.f * tmp_diff - 1.f ) * *p_azi_prev; + *p_ele = 2.f * ( 1.f - tmp_diff ) * *p_ele + ( 2.f * tmp_diff - 1.f ) * *p_ele_prev; + } + } + else + { + *p_azi_prev = *p_azi; + *p_ele_prev = *p_ele; + } + } + } + +#ifdef FIX_485_STATIC_BUFFERS + hDirAC->firstrun_sector_params = 0; +#else + firstrun_sector_params = 0; +#endif + + return; +} + + /*-----------------------------------------------------------------------* * Local functions *-----------------------------------------------------------------------*/ @@ -796,7 +1243,7 @@ void deindex_spherical_component( * deindex the spherical index for more than 2 bits for the spherical grid *----------------------------------------------------------------------*/ -/* !r: decoded elevation index */ +/*! r: decoded elevation index */ static uint16_t deindex_sph_idx_general( const int16_t idx_sph, /* i : spherical index */ const int16_t no_bits, /* i : number of bits in the spherical grid*/ diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 9438ad44a1..56e09c558d 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -56,7 +56,7 @@ typedef enum IVAS_ERR_INVALID_SAMPLING_RATE, IVAS_ERR_NOT_CONFIGURED, IVAS_ERR_INVALID_STEREO_MODE, - IVAS_ERR_INVALID_CICP_INDEX, + IVAS_ERR_INVALID_CICP_INDEX, /* ToDo: rename, CICP not used in IVAS anymore */ IVAS_ERR_INVALID_BITRATE, IVAS_ERR_INVALID_MASA_CONFIG, IVAS_ERR_TOO_MANY_INPUTS, @@ -72,17 +72,15 @@ typedef enum IVAS_ERR_INVALID_SPAR_CONFIG, IVAS_ERR_WRONG_PARAMS, IVAS_ERR_INIT_ERROR, - IVAS_ERR_DECODER_ERROR, IVAS_ERR_WRONG_MODE, IVAS_ERR_INVALID_OUTPUT_FORMAT, IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, IVAS_ERR_INVALID_HRTF, IVAS_ERR_INVALID_INPUT_FORMAT, - IVAS_ERR_INVALID_INDEX, + IVAS_ERR_INVALID_INDEX, /* ToDo: should be merged with IVAS_ERR_INDEX_OUT_OF_BOUNDS */ IVAS_ERR_NOT_SUPPORTED_OPTION, IVAS_ERR_NOT_IMPLEMENTED, IVAS_ERR_WAITING_FOR_BITSTREAM, - IVAS_ERR_FILE_READER_TIMESTAMP_MISMATCH, IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT, IVAS_ERR_ISM_INVALID_METADATA_VALUE, IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE, @@ -92,6 +90,9 @@ typedef enum #ifdef DEBUG_AGC_ENCODER_CMD_OPTION IVAS_ERR_INVALID_AGC, #endif +#ifdef VARIABLE_SPEED_DECODING + IVAS_ERR_VS_FRAME_NEEDED, +#endif #endif /*----------------------------------------* @@ -128,7 +129,7 @@ typedef enum * renderer (lib_rend only) * *----------------------------------------*/ - IVAS_ERR_NUM_CHANNELS_UNKNOWN, + IVAS_ERR_NUM_CHANNELS_UNKNOWN = 0x6000, IVAS_ERR_INVALID_CUSTOM_LS_LAYOUT, IVAS_ERR_INVALID_INPUT_ID, IVAS_ERR_WRONG_NUM_CHANNELS, @@ -179,6 +180,68 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Parse error"; case IVAS_ERR_END_OF_FILE: return "End of file"; + case IVAS_ERR_WRONG_PARAMS: + return "Wrong function parameters"; + case IVAS_ERR_INVALID_BANDWIDTH: + return "Invalid bandwidth"; + case IVAS_ERR_INVALID_DTX_UPDATE_RATE: + return "Invalid DTX update rate"; + case IVAS_ERR_NOT_CONFIGURED: + return "Handle has not been configured"; + case IVAS_ERR_INVALID_STEREO_MODE: + return "Invalid stereo mode"; + case IVAS_ERR_INVALID_CICP_INDEX: + return "Invalid speaker layout"; + case IVAS_ERR_INVALID_BITRATE: + return "Invalid bitrate"; + case IVAS_ERR_INVALID_MASA_CONFIG: + return "Invalid MASA config"; + case IVAS_ERR_TOO_MANY_INPUTS: + return "Too many object inputs provided"; + case IVAS_ERR_INDEX_OUT_OF_BOUNDS: + return "Index out of bounds"; + case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED: + return "Reconfigure not supported"; + case IVAS_ERR_INVALID_FEC_OFFSET: + return "Invalid FEC offset"; + case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE: + return "Invalid input buffer size"; + case IVAS_ERR_DTX_NOT_SUPPORTED: + return "DTX is not supported in this IVAS format and element mode"; + case IVAS_ERR_UNEXPECTED_NULL_POINTER: + return "Unexpected NULL pointer"; + case IVAS_ERR_METADATA_NOT_EXPECTED: + return "Metadata input not expected for current configuration"; +#ifdef DEBUGGING + case IVAS_ERR_INVALID_FORCE_MODE: + return "Invalid force mode"; +#endif + case IVAS_ERR_NOT_IMPLEMENTED: + return "Not implemented"; + case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT: + return "Invalid metadata file format"; + case IVAS_ERR_ISM_INVALID_METADATA_VALUE: + return "Invalid metadata value provided"; + case IVAS_ERR_NOT_SUPPORTED_OPTION: + return "Option not supported in this set-up"; + case IVAS_ERR_INIT_ERROR: + return "Initialization error"; + case IVAS_ERR_INVALID_BITSTREAM: + return "Invalid bitstream"; + case IVAS_ERR_WRONG_MODE: + return "Wrong mode"; + case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: + return "Head rotation not supported"; + case IVAS_ERR_INVALID_HRTF: + return "Unsupported HRTF filter set"; + case IVAS_ERR_INVALID_INPUT_FORMAT: +#ifdef FIX_510 + return "Invalid input format"; +#else + return "Invalid format of input bitstream"; +#endif + case IVAS_ERR_INVALID_INDEX: + return "Invalid index"; default: break; } diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index f42e8bde74..dbbce9afe4 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -99,13 +99,17 @@ static int16_t ivas_get_num_bands( *---------------------------------------------------------------------*/ ivas_error ivas_fb_set_cfg( - IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ - const int16_t ivas_format, /* i : IVAS format */ - const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t num_in_chans, /* i : number of FB input channels */ - const int16_t num_out_chans, /* i : number of FB output channels*/ - const int16_t active_w_mixing, /* i : active_w_mixing flag */ - const int32_t sampling_rate /* i : sampling rate */ + IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ + const int16_t ivas_format, /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode, /* i : SBA mode */ +#endif + const int16_t num_in_chans, /* i : number of FB input channels */ + const int16_t num_out_chans, /* i : number of FB output channels */ + const int16_t active_w_mixing, /* i : active_w_mixing flag */ + const int32_t sampling_rate /* i : sampling rate */ + , + const int16_t nchan_fb_in /* i : number of dirAC analysis channels*/ ) { IVAS_FB_CFG *pFb_cfg; @@ -117,6 +121,7 @@ ivas_error ivas_fb_set_cfg( pFb_cfg->num_in_chans = num_in_chans; pFb_cfg->num_out_chans = num_out_chans; + pFb_cfg->nchan_fb_in = nchan_fb_in; pFb_cfg->pcm_offset = 0; /* note: in SPAR decoder, this parameter is overwritten later */ pFb_cfg->active_w_mixing = active_w_mixing; @@ -132,11 +137,14 @@ ivas_error ivas_fb_set_cfg( { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); pFb_cfg->prior_input_length = NS2SA( sampling_rate, FRAME_SIZE_NS ); pFb_cfg->windowed_fr_offset = (int16_t) ( (float) ( sampling_rate / FRAMES_PER_SEC ) * 3.0f / 4.0f ) - NS2SA( sampling_rate, DELAY_DIRAC_SPAR_ENC_CMP_NS ); +#ifndef SBA_MODE_CLEAN_UP } else /* SBA_MODE_DIRAC */ { @@ -145,6 +153,7 @@ ivas_error ivas_fb_set_cfg( /* extra SPAR/DirAC synchro delay */ pFb_cfg->prior_input_length += NS2SA( sampling_rate, DELAY_FB_1_NS ); } +#endif } else if ( ivas_format == MASA_FORMAT ) { @@ -156,11 +165,7 @@ ivas_error ivas_fb_set_cfg( { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS ); -#ifdef PARAMMC_SHORT_ENC_MDFT pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS ); -#else - pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + 3 * NS2SA( sampling_rate, PARAM_MC_SLOT_ENC_NS ); -#endif } *pFb_cfg_out = pFb_cfg; @@ -219,11 +224,11 @@ ivas_error ivas_FB_mixer_open( } else if ( fb_cfg->active_w_mixing ) { - num_chs_alloc = fb_cfg->num_in_chans; + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); } else { - num_chs_alloc = fb_cfg->num_out_chans; + num_chs_alloc = 1; /* only W channel processed for predicting YZX */ } for ( i = 0; i < num_chs_alloc; i++ ) @@ -255,7 +260,7 @@ ivas_error ivas_FB_mixer_open( } else { - num_chs_alloc = fb_cfg->num_in_chans; + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); } for ( i = 0; i < num_chs_alloc; i++ ) @@ -270,8 +275,7 @@ ivas_error ivas_FB_mixer_open( if ( ( fb_cfg->active_w_mixing != -1 ) && ( fb_cfg->num_out_chans > 0 ) ) { float *pTemp_mem; - - if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * fb_cfg->num_in_chans * IVAS_MAX_NUM_BANDS ) ) == NULL ) + if ( ( pTemp_mem = (float *) malloc( sizeof( float ) * fb_cfg->num_out_chans * max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ) * IVAS_MAX_NUM_BANDS ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for FB mixer" ); } @@ -382,11 +386,11 @@ void ivas_FB_mixer_close( } else if ( fb_cfg->active_w_mixing ) { - num_chs_alloc = fb_cfg->num_in_chans; + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); } else { - num_chs_alloc = fb_cfg->num_out_chans; + num_chs_alloc = 1; /* only W channel processed for predicting YZX */ } if ( hFbMixer != NULL ) @@ -411,8 +415,10 @@ void ivas_FB_mixer_close( } else { - num_chs_alloc = fb_cfg->num_in_chans; + num_chs_alloc = max( fb_cfg->num_in_chans, fb_cfg->nchan_fb_in ); } + + for ( i = 0; i < num_chs_alloc; i++ ) { free( hFbMixer->ppFilterbank_prior_input[i] ); @@ -490,7 +496,8 @@ void ivas_fb_mixer_pcm_ingest( float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_len /* i : frame length */ -) + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) { int16_t i; int16_t num_chs_ingest; @@ -502,13 +509,13 @@ void ivas_fb_mixer_pcm_ingest( } else { - num_chs_ingest = fb_cfg->num_out_chans; + num_chs_ingest = 1; /* forward Filterbank MDFT only on W */ } for ( i = 0; i < fb_cfg->num_in_chans; i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][fb_cfg->prior_input_length - frame_len], ppOut_pcm[i], frame_len ); - mvr2r( pcm_in[i], &ppOut_pcm[i][frame_len], frame_len ); + mvr2r( pcm_in[HOA_md_ind[i]], &ppOut_pcm[i][frame_len], frame_len ); } for ( i = 0; i < num_chs_ingest; i++ ) @@ -527,14 +534,18 @@ void ivas_fb_mixer_pcm_ingest( *-----------------------------------------------------------------------------------------*/ void ivas_fb_mixer_update_prior_input( - IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ - float *pcm_in[], /* i : input audio channels */ - const int16_t length /* i : length of time slot */ + IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ + float *pcm_in[], /* i : input audio channels */ + const int16_t length /* i : length of time slot */ + , + const int16_t nchan_fb_in /* i : number of analysis channels */ ) { int16_t i; - for ( i = 0; i < hFbMixer->fb_cfg->num_in_chans; i++ ) + for ( i = 0; i < + nchan_fb_in; + i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length ); mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length ); @@ -557,6 +568,8 @@ void ivas_fb_mixer_get_windowed_fr( float *frame_f_imag[], /* o : imag freq domain values */ const int16_t length, /* i : number of new samples in time slot */ const int16_t mdft_len /* i : MDFT frame length */ + , + const int16_t nchan_fb_in /* i : number of analysis channels */ ) { int16_t ch_idx, j, offset, rev_offset; @@ -571,7 +584,9 @@ void ivas_fb_mixer_get_windowed_fr( rev_offset = (int16_t) ( 2 * mdft_len - hFbMixer->ana_window_offset ); set_zero( fr_in_block, offset ); - for ( ch_idx = 0; ch_idx < hFbMixer->fb_cfg->num_in_chans; ch_idx++ ) + for ( ch_idx = 0; ch_idx < + nchan_fb_in; + ch_idx++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[ch_idx][offset + hFbMixer->fb_cfg->windowed_fr_offset], &fr_in_block[offset], n_old_samples - offset ); mvr2r( pcm_in[ch_idx], &fr_in_block[n_old_samples], n_new_samples ); @@ -696,6 +711,7 @@ void ivas_fb_mixer_process( { int16_t start_offset = pFb->fb_consts.pFilterbank_bins_start_offset[i]; int16_t num_bins = pFb->fb_consts.pFilterbank_bins_per_band[i]; + float mixer_const = hFbMixer->prior_mixer[ch][j][i]; pFilterbank_bin_to_band_re = pFb->fb_consts.ppFilterbank_FRs[0][i]; @@ -768,7 +784,6 @@ void ivas_fb_mixer_get_in_out_mapping( for ( i = 1; i < fb_cfg->num_out_chans; i++ ) { in_out_mixer_map[i][0] = 1; - in_out_mixer_map[i][order[i]] = 1; } } } diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 38a34a15bd..a28fb77d20 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -88,15 +88,16 @@ static void bitbudget_to_brate( *-------------------------------------------------------------------*/ ivas_error ivas_ism_config( - const int32_t ism_total_brate, /* i : ISM total bitrate */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t nchan_ism, /* i : number of objects */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ - const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ - const int16_t ism_imp[], /* i : ISM importance flags */ - int32_t element_brate[], /* o : element bitrate per object */ - int32_t total_brate[], /* o : total bitrate per object */ - int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ + const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ + const int16_t ism_imp[], /* i : ISM importance flags */ + int32_t element_brate[], /* o : element bitrate per object */ + int32_t total_brate[], /* o : total bitrate per object */ + int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ ) { int16_t ch; @@ -135,6 +136,11 @@ ivas_error ivas_ism_config( if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) { nb_bits_metadata[0] += ISM_EXTENDED_METADATA_BITS; + + if ( ism_extended_metadata_flag ) + { + nb_bits_metadata[0] += ISM_METADATA_IS_NDP_BITS; + } } nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + nchan_ism; @@ -337,6 +343,8 @@ void ivas_ism_reset_metadata( hIsmMeta->yaw = 0.0f; hIsmMeta->pitch = 0.0f; hIsmMeta->radius = 1.0f; + hIsmMeta->ism_metadata_flag = 0; + hIsmMeta->non_diegetic_flag = 0; return; } @@ -352,7 +360,6 @@ void ivas_ism_reset_metadata_API( ISM_METADATA_HANDLE hIsmMeta /* i/o: ISM metadata handle */ ) { - hIsmMeta->ism_metadata_flag = 0; ivas_ism_reset_metadata( hIsmMeta ); return; @@ -454,9 +461,8 @@ float ism_dequant_meta( * ---------------------------------------------------------------*/ void ivas_param_ism_config( - PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: IVAS Param ISM Config Structure */ - , - const int16_t nchan_obj /* i : number of ISM channels */ + PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i/o: IVAS Param ISM Config Structure */ + const int16_t nchan_obj /* i : number of ISM channels */ ) { int16_t i; diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index e576c725b2..22caa5d2cf 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -49,7 +49,20 @@ *---------------------------------------------------------------*/ #define MASA_EXTRA_BAND_META_BITS 40 -#define MASA_SMALL_INC_META_BITS 10 + +#define MASA_SMALL_INC_META_BITS 10 + + +#ifdef HR_METADATA +/*--------------------------------------------------------------- + * Local prototypes + *---------------------------------------------------------------*/ + +static int16_t quantize_theta_masa( float x, const int16_t no_cb, float *xhat ); + +static int16_t quantize_phi_masa( float phi, const int16_t flag_delta, float *phi_hat, const int16_t n ); + +#endif /*--------------------------------------------------------------- @@ -313,20 +326,31 @@ void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ - const int32_t sampling_rate /* i : Sampling rate */ - , +#ifdef FIX_HBR_MASAMETA + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i: signals if called at encoder */ +#else + const int32_t sampling_rate, /* i : Sampling rate */ +#endif MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ) { uint8_t band, sf; +#ifdef FIX_HBR_MASAMETA + int16_t highBand; +#else int16_t maxBin, highBand, maxBand; +#endif uint8_t numBands48k; +#ifndef FIX_HBR_MASAMETA if ( sampling_rate == 48000 ) { return; } +#endif +#ifndef FIX_HBR_MASAMETA /* Find maximum band usable at this sample rate */ maxBin = (int16_t) ( CLDFB_NO_CHANNELS_MAX * sampling_rate / 48000 ); maxBand = 0; @@ -335,7 +359,7 @@ void masa_sample_rate_band_correction( maxBand++; } maxBand--; - +#endif numBands48k = config->numCodingBands; for ( band = 1; band < config->numCodingBands + 1; band++ ) @@ -346,6 +370,19 @@ void masa_sample_rate_band_correction( { config->numCodingBands = band; hQMetaData->numCodingBands = band; +#ifdef FIX_HBR_MASAMETA + if ( is_encoder ) + { + if ( hQMetaData->q_direction->cfg.nbands > band ) + { + hQMetaData->q_direction->cfg.nbands = band; + } + if ( hQMetaData->no_directions == 2 && hQMetaData->q_direction[1].cfg.nbands > band ) + { + hQMetaData->q_direction[1].cfg.nbands = band; + } + } +#endif band_mapping[band] = maxBand; break; } @@ -393,7 +430,11 @@ void masa_sample_rate_band_correction( /* in decoder, zero the EXT out MASA meta buffer */ for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { +#ifdef FIX_HBR_MASAMETA + for ( band = hQMetaData->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) +#else for ( band = config->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) +#endif { hExtOutMeta->directionIndex[0][sf][band] = SPH_IDX_FRONT; hExtOutMeta->directToTotalRatio[0][sf][band] = 0u; @@ -411,3 +452,355 @@ void masa_sample_rate_band_correction( return; } + + +#ifdef HR_METADATA +/*------------------------------------------------------------------------- + * index_theta_phi_16() + * + * + *------------------------------------------------------------------------*/ + +/*! r: output index for direction */ +uint16_t index_theta_phi_16( + float *p_theta, /* i/o: input elevation to be indexed */ + float *p_phi, /* i/o: input azimuth to be indexed */ + const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ +) +{ + float abs_theta; + int16_t sign_th, id_phi, id_th; + uint16_t idx_sph; + uint16_t cum_n; + float theta_hat, phi_hat; + float theta, phi; + + theta = *p_theta; + phi = *p_phi; + phi_hat = 0; + theta_hat = 0; + phi = phi + 180; + + if ( theta < 0 ) + { + abs_theta = -theta; + sign_th = -1; + } + else + { + abs_theta = theta; + sign_th = 1; + } + + id_th = quantize_theta_masa( abs_theta, gridData->no_theta, &theta_hat ); + if ( gridData->no_theta > 1 ) + { + if ( gridData->no_phi[id_th] > 1 ) + { + id_phi = quantize_phi_masa( phi, ( id_th % 2 == 1 ), &phi_hat, gridData->no_phi[id_th] ); + } + else + { + id_phi = 0; + phi_hat = 180; + } + } + else + { + id_phi = quantize_phi_masa( phi, ( id_th % 2 == 1 ), &phi_hat, gridData->no_phi[id_th] ); + } + *p_theta = sign_th * theta_hat; + *p_phi = phi_hat - 180; + + /* Starting from Equator, alternating positive and negative */ + if ( id_th == 0 ) + { + idx_sph = id_phi; + } + else + { + if ( id_th == gridData->no_theta - 1 ) + { + idx_sph = 65534 + ( sign_th < 0 ); + } + else + { + theta = MASA_ANGLE_AT_EQUATOR * (float) ( id_th + 0.5f ); + if ( id_th == 1 ) + { + cum_n = 2 * (uint16_t) ceilf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); + } + else + { + cum_n = 2 * (uint16_t) roundf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); + } + + cum_n += gridData->no_phi[0]; + + if ( sign_th > 0 ) + { + cum_n -= 2 * gridData->no_phi[id_th]; + } + else + { + cum_n -= gridData->no_phi[id_th]; + } + idx_sph = cum_n + id_phi; + } + } + + return idx_sph; +} + + +/*------------------------------------------------------------------------- + * quantize_phi_masa() + * + * + *------------------------------------------------------------------------*/ + +/*! r: output index */ +static int16_t quantize_theta_masa( + float x, /* i : theta value to be quantized */ + const int16_t no_cb, /* i : number of codewords */ + float *xhat /* o : quantized value */ +) +{ + int16_t imin; + float diff1, diff2; + + imin = (int16_t) ( x * MASA_INV_ANGLE_AT_EQUATOR_DEG + 0.5f ); + + if ( imin >= no_cb - 1 ) + { + imin = no_cb - 1; + diff1 = x - 90; + diff2 = x - MASA_ANGLE_AT_EQUATOR_DEG * ( imin - 1 ); + if ( fabsf( diff1 ) > fabsf( diff2 ) ) + { + imin--; + *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; + } + else + { + *xhat = 90; + } + } + else + { + *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; + } + + return imin; +} + + +/*------------------------------------------------------------------------- + * quantize_phi_masa() + * + * + *------------------------------------------------------------------------*/ + +/*! r: index azimuth */ +static int16_t quantize_phi_masa( + float phi, /* i : azimuth value */ + const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ + float *phi_hat, /* o : quantized azimuth */ + const int16_t n /* i : azimuth codebook size */ +) +{ + int16_t id_phi; + float dd; + float delta_phi; + + delta_phi = 360.0f / (float) n; + + if ( n == 1 ) + { + *phi_hat = 0; + + return 0; + } + + if ( flag_delta == 1 ) + { + dd = delta_phi / 2.0f; + } + else + { + dd = 0; + } + + id_phi = (int16_t) ( ( phi - dd + delta_phi / 2.0f ) / (float) delta_phi ); + + if ( id_phi == n ) + { + id_phi = 0; + } + + if ( id_phi == -1 ) + { + id_phi = n - 1; + } + + *phi_hat = id_phi * delta_phi + dd; + + return id_phi; +} + + +/*------------------------------------------------------------------------- + * deindex_sph_idx() + * + * deindex the MASA metadata from the input metadata file + *------------------------------------------------------------------------*/ + +void deindex_sph_idx( + const uint16_t sphIndex, /* i : Spherical index */ + const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ + float *theta, /* o : Elevation */ + float *phi /* o : Azimuth */ +) +{ + float ba_crt, del_crt, div_crt, a4_crt; + float estim; + int32_t base_low, base_up; + int16_t n_crt; + int16_t id_th; + int16_t sign_theta; + int16_t id_phi; + int16_t no_th = gridData->no_theta; + const int16_t *n = gridData->no_phi; + const float ba[3] = { + 2.137991118026424e+02f, + 1.244854404591542e+02f, + 1.228408647140870e+02f, + }; + const float del[3] = { 7.998262115303199e+05f, 1.300883976959332e+06f, 1.424072242426373e+06f }; + const float div[3] = { -0.237662341081474f, -0.100938185496887f, -0.092050209205032f }; + const float a4[3] = { -8.415300425381099f, -19.814106922515204f, -21.727272727270197f }; + const uint16_t limit_index1 = 64964, limit_index2 = 47870; + + if ( sphIndex >= limit_index1 ) + { + ba_crt = ba[2]; + div_crt = div[2]; + a4_crt = a4[2]; + del_crt = del[2]; + } + else if ( sphIndex >= limit_index2 ) + { + ba_crt = ba[1]; + div_crt = div[1]; + a4_crt = a4[1]; + del_crt = del[1]; + } + else + { + ba_crt = ba[0]; + div_crt = div[0]; + a4_crt = a4[0]; + del_crt = del[0]; + } + estim = ba_crt + div_crt * sqrtf( del_crt + a4_crt * sphIndex ); + + if ( estim > MASA_NO_CIRCLES ) + { + estim = MASA_NO_CIRCLES; + } + + assert( estim > 0 ); + id_th = (int16_t) roundf( estim ) - 1; + if ( id_th < 0 ) + { + id_th = 0; + } + + if ( id_th == 0 ) + { + base_low = 0; + base_up = n[0]; + } + else + { + estim = MASA_ANGLE_AT_EQUATOR * (float) ( id_th - 0.5f ); + base_low = n[0]; + if ( id_th >= 2 ) + { + if ( id_th == 2 ) + { + base_low += 2 * (int16_t) ceilf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) ); + } + else + { + base_low += 2 * (int16_t) roundf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) ); + } + } + base_up = base_low + 2 * n[id_th]; + } + + sign_theta = 1; + + n_crt = n[id_th]; + if ( sphIndex < base_low ) + { + id_th--; + n_crt = n[id_th]; + if ( id_th == 0 ) + { + base_low = 0; + base_up = n_crt; + } + else + { + base_up = base_low; + base_low -= 2 * n[id_th]; + } + assert( sphIndex >= base_low ); + } + else if ( sphIndex >= base_up ) + { + id_th++; + n_crt = n[id_th]; + base_low = base_up; + base_up += 2 * n_crt; + assert( sphIndex < base_up ); + } + + id_phi = (int16_t) ( sphIndex - base_low ); + if ( sphIndex - base_low >= n_crt ) + { + id_phi -= n_crt; + sign_theta = -1; + } + + if ( id_th == 0 ) + { + *theta = 0.f; + *phi = (float) sphIndex * 360 / (float) n_crt - 180; + } + else + { + if ( id_th == no_th - 1 ) + { + id_phi = 0; + *phi = -180; + *theta = 90 * (float) sign_theta; + } + else + { + *theta = id_th * MASA_ANGLE_AT_EQUATOR_DEG * (float) sign_theta; + if ( id_th % 2 == 0 ) + { + *phi = (float) id_phi * 360 / (float) n_crt - 180; + } + else + { + *phi = ( (float) id_phi + 0.5f ) * 360 / (float) n_crt - 180; + } + } + } + + return; +} +#endif diff --git a/lib_com/ivas_mc_com.c b/lib_com/ivas_mc_com.c index 027b687686..0001f39704 100644 --- a/lib_com/ivas_mc_com.c +++ b/lib_com/ivas_mc_com.c @@ -103,10 +103,14 @@ MC_MODE ivas_mc_mode_select( { mc_mode = MC_MODE_MCMASA; } - else if ( total_brate < IVAS_192k ) + else if ( total_brate < IVAS_160k ) { mc_mode = MC_MODE_PARAMMC; } + else if ( total_brate < IVAS_192k ) + { + mc_mode = MC_MODE_PARAMUPMIX; + } break; default: assert( 0 && "LS Setup not supported or defined for MC mode!\n" ); diff --git a/lib_com/ivas_mdft_imdft.c b/lib_com/ivas_mdft_imdft.c index a9f5bac532..ad9d19a910 100644 --- a/lib_com/ivas_mdft_imdft.c +++ b/lib_com/ivas_mdft_imdft.c @@ -82,11 +82,9 @@ static void ivas_get_mdft_twid_factors( case IVAS_160_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_160[0]; break; -#ifdef PARAMMC_SHORT_ENC_MDFT case IVAS_120_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_120[0]; break; -#endif case IVAS_80_PT_LEN: *ppTwid = &ivas_mdft_coeff_cos_twid_80[0]; break; diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 63285dabb1..a1f8efd629 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -645,7 +645,7 @@ static void norm_quat( norm_q = dotp( q, q, IVAS_PCA_INTERP ); - norm_q = inv_sqrt( norm_q ); // VE: TBV: possible division by 0 + norm_q = inv_sqrt( norm_q ); // TODO: possible division by 0 for ( i = 0; i < IVAS_PCA_INTERP; i++ ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h old mode 100755 new mode 100644 index 261b1d38a8..f455c552a5 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -114,6 +114,10 @@ ivas_error ivas_spar_md_enc_init ivas_error ivas_sba_enc_reconfigure( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); +#ifdef ARITH_HUFF_CODER_CHANGES +int16_t ivas_sba_get_max_md_bits( + Encoder_Struct *st_ivas ); +#endif void destroy_sce_enc( SCE_ENC_HANDLE hSCE /* i/o: SCE encoder structure */ @@ -251,20 +255,35 @@ ivas_error ivas_compute_core_buffers( /*! r: number of clipped samples */ uint32_t ivas_syn_output( - float synth[][L_FRAME48k], /* i/o: float synthesis signal */ +#ifdef JBM_TSM_ON_TCS + float *synth[], /* i/o: float synthesis signal */ +#else + float synth[][L_FRAME48k], /* i/o: float synthesis signal */ +#endif const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ int16_t *synth_out /* o : integer 16 bits synthesis signal */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_syn_output_f( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + float *synth_out /* o : integer 16 bits synthesis signal */ +); +#endif + void ivas_initialize_handles_enc( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Indice ind_list[][MAX_NUM_INDICES], /* i : indices list */ - Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +#ifndef IND_LIST_DYN + ,Indice ind_list[][MAX_NUM_INDICES] /* i : indices list */ + ,Indice ind_list_metadata[][MAX_BITS_METADATA] /* i : indices list metadata */ +#endif ); void destroy_core_enc( @@ -299,6 +318,11 @@ ivas_error ivas_dec( ivas_error ivas_dec_setup( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : flushed PCM samples */ +#endif ); ivas_error create_sce_dec( @@ -637,6 +661,11 @@ ivas_error ivas_mc_enc_config( ivas_error ivas_mc_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t idx /* i : LS config. index */ + #ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ + int16_t *data /* o : flushed samples (JBM) */ +#endif ); /*! r: MC format mode (MCT, McMASA, ParamMC) */ @@ -737,6 +766,110 @@ void dtx_read_padding_bits( ); +#ifdef JBM_TSM_ON_TCS +/*----------------------------------------------------------------------------------* + * JBM prototypes + *----------------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data /* o : output synthesis signals */ +); + +ivas_error ivas_jbm_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ +); + +ivas_error ivas_jbm_dec_flush_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t tc_granularity_new, /* i : new renderer granularity */ + const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ + const AUDIO_CONFIG intern_config_old, /* i : old internal config */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ + const MC_MODE mc_mode_old, /* i : old MC mode */ + const ISM_MODE ism_mode_old, /* i : old ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed */ + int16_t *data /* o : rendered samples */ +); + +ivas_error ivas_jbm_dec_feed_tc_to_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i/o: transport channels/output synthesis signal */ +); + +ivas_error ivas_jbm_dec_set_discard_samples( + Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ +); + +void ivas_jbm_dec_get_adapted_linear_interpolator( + const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ + const int16_t interp_length, /* i : length of the interpolator to be created */ + float *interpolator /* o : the interpolator */ +); + +void ivas_jbm_dec_get_adapted_subframes( + const int16_t nCldfbTs, /* i : number of time slots in the current frame */ + int16_t *subframe_nbslots, /* i/o: subframe grid */ + int16_t *nb_subframes /* i/o: number of subframes in the frame */ +); + +void ivas_jbm_dec_get_md_map( + const int16_t default_len, /* i : default frame length in metadata slots */ + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ +); + +int16_t ivas_jbm_dec_get_num_tc_channels( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +); + +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +); + +/*! r: render granularity */ +int16_t ivas_jbm_dec_get_render_granularity( + const RENDERER_TYPE rendererType, /* i : renderer type */ + const int32_t output_Fs /* i : sampling rate */ +); + +ivas_error ivas_jbm_dec_tc_buffer_open( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ + const int16_t nchan_transport_jbm, /* i : number of real transport channels */ + const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ + const int16_t nchan_full, /* i : number of channels to fully store */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +); + +ivas_error ivas_jbm_dec_tc_buffer_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ + const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ + const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ + const int16_t nchan_full, /* i : new number of channels to fully store */ + const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ +); + +void ivas_jbm_dec_tc_buffer_close( + DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ +); + +void ivas_jbm_dec_td_renderers_adapt_subframes( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); +#endif + + /*----------------------------------------------------------------------------------* * ISM prototypes *----------------------------------------------------------------------------------*/ @@ -746,6 +879,7 @@ ivas_error ivas_ism_config( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ + const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ const int16_t ism_imp[], /* i : ISM importance flags */ int32_t element_brate[], /* o : element bitrate per object */ @@ -786,7 +920,8 @@ ivas_error ivas_set_ism_metadata( const float elevation, /* i : elevation value */ const float radius_meta, /* i : radius */ const float yaw, /* i : yaw */ - const float pitch /* i : pitch */ + const float pitch, /* i : pitch */ + const int16_t non_diegetic_flag /* i : non-diegetic object flag */ ); ivas_error ivas_ism_metadata_enc_create( @@ -887,6 +1022,11 @@ ivas_error ivas_ism_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ , const ISM_MODE last_ism_mode /* i/o: last ISM mode */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed on renderer change*/ + int16_t *data /* o : flushed PCM samples */ +#endif ); ivas_error ivas_param_ism_dec_open( @@ -903,6 +1043,26 @@ void ivas_param_ism_dec( float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_ism_dec_digest_tc( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_param_ism_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +); + +void ivas_param_ism_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); +#endif + void ivas_param_ism_params_to_masa_param_mapping( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); @@ -1168,6 +1328,10 @@ void stereo_dft_dec( const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs, /* i : Fs for delay calculation */ const int16_t nchan_transport /* i : number of transpor channels */ +#ifdef FIX_STEREO_474 + , + const int16_t num_md_sub_frames /* i: number of MD subframes */ +#endif ); void stereo_dft_res_ecu( @@ -1401,6 +1565,10 @@ int16_t read_BS_adapt_GR_sg( void stereo_dft_hybrid_ITD_flag( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const int32_t input_Fs /* i : CPE element sampling rate */ +#ifdef HYBRID_ITD_MAX + , + const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ +#endif ); void stereo_dft_enc_compute_itd( @@ -1915,14 +2083,12 @@ void tdm_low_rate_dec( const float *lsf_new /* i : ISFs at the end of the frame */ ); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL void tdm_SCh_LSF_intra_pred( const int32_t element_brate, /* i : element bitrate */ const float *tdm_lsfQ_PCh, /* i : primary channel LSFs */ float *pred_lsf_SCh /* o : predicted secondary channel LSFs */ ); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE void tdm_SCh_lsf_reuse( const int16_t enc_dec, /* i : encoder/decoder flag */ const int32_t element_brate, /* i : element bitrate */ @@ -1932,8 +2098,6 @@ void tdm_SCh_lsf_reuse( const float lsf_wgts[M], /* i : LSF weights */ int16_t *beta_index /* i/o: quantization index */ ); -#endif -#endif void first_VQstages( const float *const *cb, @@ -2391,7 +2555,6 @@ void sns_shape_spectrum( const int16_t L_frame /* i : frame length */ ); -#ifdef SNS_MSVQ int16_t quantize_sns( float sns_in[CPE_CHANNELS][NB_DIV][M], float snsQ_out[CPE_CHANNELS][NB_DIV][M], @@ -2406,7 +2569,6 @@ void dequantize_sns( float snsQ_out[CPE_CHANNELS][NB_DIV][M], Decoder_State **sts ); -#endif void sns_avq_cod( const float *sns, /* i : Input sns vectors */ @@ -2415,12 +2577,14 @@ void sns_avq_cod( float *snsmid_q, /* o : Quantized mid-LFS vectors */ int16_t *index, /* o : Quantization indices */ const int16_t core, /* i : core */ + const int16_t L_frame, const int16_t low_brate_mode /* i : flag low bit operating mode */ ); void sns_avq_cod_stereo( const float *snsl, /* i : Input sns vector (left channel) */ const float *snsr, /* i : Input sns vector (right channel) */ + const int16_t L_frame, float *snsl_q, /* o : Quantized sns vector (left channel) */ float *snsr_q, /* o : Quantized sns vector (right channel) */ int16_t *indexl, /* o : Quantization indices (left channel) */ @@ -2429,17 +2593,15 @@ void sns_avq_cod_stereo( void sns_avq_dec( int16_t *index, /* i : Quantization indices */ -#ifdef SNS_MSVQ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ -#else - float *SNS_Q, /* o : Quantized SNS vectors */ -#endif + const int16_t L_frame, const int16_t numlpc /* i : Number of sets of lpc */ ); void sns_avq_dec_stereo( int16_t *indexl, /* i : Quantization indices (left channel) */ int16_t *indexr, /* i : Quantization indices (right channe) */ + const int16_t L_frame, float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ ); @@ -2643,7 +2805,11 @@ float sumAbs( void mvc2c( const uint8_t x[], /* i : input vector */ uint8_t y[], /* o : output vector */ +#ifdef FIX_XXX_JBM_FIFO_BUFFER + const int32_t n +#else const int16_t n /* i : vector size */ +#endif ); /*! r: the dot product x'*A*A'*x */ @@ -2934,7 +3100,32 @@ void mdct_read_IGF_bits( ivas_error ivas_qmetadata_enc_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *hQMetaData /* i/o: q_metadata handle */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +); + +#ifdef HR_METADATA +ivas_error ivas_qmetadata_enc_encode_hr_384_512( + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh +); + +void deindex_sph_idx( + const uint16_t sphIndex, /* i : Spherical index */ + const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ + float *theta, /* o : Elevation */ + float *phi /* o : Azimuth */ +); + +/*! r: output index for direction */ +uint16_t index_theta_phi_16( + float * p_theta, /* i/o: input elevation to be indexed */ + float * p_phi, /* i/o: input azimuth to be indexed */ + const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ ); +#endif void reset_metadata_spatial( const IVAS_FORMAT ivas_format, /* i : IVAS format */ @@ -2942,8 +3133,11 @@ void reset_metadata_spatial( const int32_t element_brate, /* i : element bitrate */ int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata, /* i : number of meatdata bits */ + const int16_t nb_bits_metadata /* i : number of meatdata bits */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ); /*! r: number of bits written */ @@ -2951,8 +3145,11 @@ void ivas_qmetadata_enc_sid_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure*/ - const int16_t ivas_format, /* i : ivas format */ + const int16_t ivas_format /* i : ivas format */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ); /*! r: number of bits read */ @@ -2960,8 +3157,26 @@ int16_t ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ uint16_t *bitstream, /* i : bitstream */ int16_t *index /* i/o: bitstream position */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); +#ifdef HR_METADATA +/*! r: number of bits read */ +int16_t ivas_qmetadata_dec_decode_hr_384_512( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh +#ifdef FIX_HBR_MASAMETA + , + uint8_t ncoding_bands_config +#endif +); +#endif + /*! r: number of bits read */ int16_t ivas_qmetadata_dec_sid_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -2969,8 +3184,11 @@ int16_t ivas_qmetadata_dec_sid_decode( int16_t *index, /* i/o: bitstream position */ const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ - const int16_t ivas_format, /* i : IVAS format */ + const int16_t ivas_format /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP + , const SBA_MODE sba_mode /* i : SBA mode */ +#endif ); void ivas_qmetadata_to_dirac( @@ -2978,7 +3196,12 @@ void ivas_qmetadata_to_dirac( DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */ MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format, /* i : IVAS format */ +#endif + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3000,11 +3223,13 @@ void ivas_qmetadata_close( void restore_metadata_buffer( BSTR_ENC_HANDLE hMetaData, const int16_t next_ind_start, +#ifndef IND_LIST_DYN const int16_t last_ind_start, +#endif const int16_t bit_pos_start ); -/* !r: codeword index */ +/*! r: codeword index */ int16_t masa_sq( const float in, /* i : input value */ const float *threshold, /* i : partition */ @@ -3036,9 +3261,13 @@ void quantize_direction_frame( IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +#endif ); -/* !r: quantized spherical index */ +/*! r: quantized spherical index */ uint16_t quantize_direction( const float theta, /* i : input elevation value */ float phi, /* i : input azimuth value */ @@ -3058,7 +3287,7 @@ int16_t quantize_direction2D( const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ); -/* !r :companded azimuth value */ +/*! r :companded azimuth value */ float companding_azimuth( const float azi, /* i : input azimuth value */ const MC_LS_SETUP mc_format, /* i : input channel format */ @@ -3066,14 +3295,14 @@ float companding_azimuth( const int16_t direction /* i : direction of companding (direct or inverse)*/ ); -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi_chan_lbr( const float phi, /* i : azimuth value */ float *phi_hat, /* o : quantized azimuth */ const int16_t n /* i : azimuth codebook size */ ); -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi_chan_compand( float phi, /* i : azimuth value */ float *phi_hat, /* o : quantized azimuth */ @@ -3097,7 +3326,7 @@ void small_requantize_direction_frame( int16_t *diff /* i/o: number of bits to be reduced */ ); -/*!r : index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi( float phi, /* i : azimuth value */ const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ @@ -3174,19 +3403,27 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, - const SBA_MODE sba_mode +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode +#else + const IVAS_FORMAT ivas_format +#endif + , + const int16_t hodirac_flag, + const int16_t nchan_fb_in ); +#ifndef SBA_MODE_CLEAN_UP /*----------------------------------------------------------------------------------* * SBA format prototypes *----------------------------------------------------------------------------------*/ /*! r: SBA format mode */ SBA_MODE ivas_sba_mode_select( - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + void ); - +#endif void ivas_sba_config( const int32_t sba_total_brate, /* i : SBA total bitrate */ int16_t sba_order, /* i : Ambisonic (SBA) order */ @@ -3206,6 +3443,16 @@ ivas_error ivas_sba_dec_reconfigure( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); +#ifdef JBM_TSM_ON_TCS +ivas_error ivas_sba_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering, /* i : number of samples provided */ + float *data[] /* i : transport channel samples */ +); +#endif + void ivas_init_dec_get_num_cldfb_instances( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ int16_t *numCldfbAnalyses, /* o : number of CLDFB analysis instances */ @@ -3240,12 +3487,22 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ + , + const int32_t ivas_total_brate +); + +void ivas_sba_get_spar_hoa_ch_ind( + const int16_t num_md_chs, /* i : number of MD channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); /*! r: flag indicating to code SPAR HOA MD for all bands */ -int16_t ivas_sba_get_spar_hoa_md_flag( +void ivas_sba_get_spar_hoa_md_flag( const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t *spar_hoa_md_flag, + int16_t *spar_hoa_dirac2spar_md_flag ); void ivas_sba_zero_vert_comp( @@ -3278,6 +3535,12 @@ void ivas_sba_dirac_stereo_config( STEREO_DFT_CONFIG_DATA_HANDLE hConfig /* o : DFT stereo configuration */ ); +/*! r: HO-DirAC flag */ +int16_t ivas_get_hodirac_flag( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); + int16_t ivas_get_sba_dirac_stereo_flag( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); @@ -3287,6 +3550,10 @@ void ivas_sba_dirac_stereo_smooth_parameters( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs /* i : Fs for delay calculation */ +#ifdef FIX_STEREO_474 + , + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ +#endif ); void ivas_sba2mc_cldfb( @@ -3295,6 +3562,9 @@ void ivas_sba2mc_cldfb( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ const int16_t nb_channels_out, /* i : nb of output channels */ const int16_t nb_bands, /* i : nb of CLDFB bands to process */ +#ifdef JBM_TSM_ON_TCS + const int16_t nb_timeslots, /* i : number of time slots to process */ +#endif const float *hoa_dec_mtx /* i : HOA decoding mtx */ ); @@ -3316,6 +3586,7 @@ void ivas_dirac_enc_close( const int32_t input_Fs /* i : input sampling_rate */ ); +#ifndef SBA_MODE_CLEAN_UP void ivas_dirac_enc( DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -3326,7 +3597,20 @@ void ivas_dirac_enc( const int16_t input_frame, /* i : input frame length */ const int16_t sba_planar /* i : SBA planar flag */ ); - +#else +void ivas_dirac_enc( + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: SBA channels */ + float **ppIn_FR_real, /* o : real freq domain values */ + float **ppIn_FR_imag, /* o : imag freq domain values */ + const int16_t input_frame, /* i : input frame length */ + const int16_t dtx_vad, /* i : DTX vad flag */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + int16_t hodirac_flag /* i : hodirac flag */ +); +#endif ivas_error ivas_dirac_config( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ const int16_t enc_dec /* i : encoder or decoder flag */ @@ -3342,15 +3626,28 @@ void ivas_dirac_config_bands( IVAS_FB_MIXER_HANDLE hFbMdft ); +#ifdef ARITH_HUFF_CODER_CHANGES +void ivas_get_dirac_sba_max_md_bits( + const int32_t sba_total_brate, + int16_t *bits_frame_nominal, + int16_t *metadata_max_bits, + int16_t *qmetadata_max_bit_req, + int16_t nbands ); +#endif + ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ +#ifndef SBA_MODE_CLEAN_UP int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ int16_t *nSCE, /* o : number of SCEs */ int16_t *nCPE, /* o : number of CPEs */ +#endif int16_t *element_mode, /* o : element mode of the core coder */ int32_t sba_total_brate, /* i : SBA total bitrate */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#endif const int16_t nbands /* i : number of frequency bands */ ); @@ -3358,6 +3655,11 @@ ivas_error ivas_dirac_dec_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); +ivas_error ivas_dirac_allocate_parameters( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t params_flag /* i : set of parameters flag */ +); + ivas_error ivas_dirac_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const DIRAC_CONFIG_FLAG flag_configopen /* i/ : Flag determining if we open or reconfigure the DirAC decoder */ @@ -3367,28 +3669,88 @@ void ivas_dirac_dec_close( DIRAC_DEC_HANDLE *hDirAC /* i/o: decoder DirAC handle */ ); +void ivas_dirac_deallocate_parameters( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t params_flag /* i : set of parameters flag */ +); + void ivas_dirac_dec_read_BS( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ Decoder_State *st, /* i/o: decoder Core state structure */ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ int16_t *nb_bits, /* o : number of bits read */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#endif + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); +#ifdef JBM_TSM_ON_TCS +void generate_masking_noise_lb_dirac( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ + const int16_t cna_flag /* i : CNA flag for LB and HB */ +); + +void ivas_dirac_dec_set_md_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +); + +void ivas_dirac_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport /* i : number of transport channels */ +); +#endif + +#ifdef JBM_TSM_ON_TCS +void ivas_dirac_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); +#endif + +#ifndef JBM_TSM_ON_TCS void ivas_dirac_dec( +#else +void ivas_dirac_dec_render_sf( +#endif Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif const int16_t nchan_transport, /* i : number of transport channels */ float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] +#ifndef JBM_TSM_ON_TCS + , const int16_t i_sf +#endif ); -ivas_error ivas_dirac_dec_init_binaural_data( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ +ivas_error ivas_td_decorr_reconfig_dec( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate, /* i : total IVAS bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs, /* i : output sampling rate */ + ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ + uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ +); + +/*! r: Configured reqularization factor value */ +float configure_reqularization_factor( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : total IVAS bitrate */ ); void computeDiffuseness_mdft( @@ -3465,17 +3827,20 @@ void ivas_dirac_dec_decorr_close( HANDLE_DIRAC_DECORR_STATE *ph_dirac_decorr_state ); - ivas_error ivas_dirac_dec_output_synthesis_open( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const RENDERER_TYPE renderer_type, /* i : renderer type */ const int16_t nchan_transport, /* i : number of transport channels */ const int32_t output_Fs /* i : output sampling rate */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); void ivas_dirac_dec_output_synthesis_init( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); void ivas_dirac_dec_output_synthesis_close( @@ -3485,11 +3850,25 @@ void ivas_dirac_dec_output_synthesis_close( void ivas_dirac_dec_output_synthesis_process_slot( const float *reference_power, /* i : Estimated power */ const float *onset, /* i : onset filter */ +#ifdef JBM_TSM_ON_TCS + const int16_t *azimuth, + const int16_t *elevation, + const float *diffuseness, +#endif DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t sh_rot_max_order, +#endif const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport /* i : number of transport channels */ + const int16_t nchan_transport /* i : number of transport channels */ +#if defined( JBM_TSM_ON_TCS ) + , + const int16_t index_slot +#endif + , + const int16_t hodirac_flag ); void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( @@ -3497,13 +3876,33 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ +#ifdef JBM_TSM_ON_TCS + const int16_t nbslots, /* i : number of slots to process */ +#endif const float *onset_filter + , +#ifdef FIX_393_459_460_SBA_MD + float *diffuseness, +#else +#ifdef JBM_TSM_ON_TCS + const int16_t md_idx, +#endif +#endif + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t nbslots, /* i : number of slots to process */ +#ifdef FIX_393_459_460_SBA_MD + float *diffuseness_vector, /* i : diffuseness (needed for direction smoothing)*/ +#else + const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ +#endif +#endif float *reference_power_smooth, float qualityBasedSmFactor ); @@ -3542,9 +3941,15 @@ void ivas_dirac_dec_compute_directional_responses( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ +#ifdef JBM_TSM_ON_TCS + const int16_t *azimuth, + const int16_t *elevation, + const int16_t md_idx, +#endif const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ - const float *p_Rmat /* i : rotation matrix */ + const float *p_Rmat, /* i : rotation matrix */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); void ivas_dirac_dec_get_frequency_axis( @@ -3552,6 +3957,63 @@ void ivas_dirac_dec_get_frequency_axis( const int32_t output_Fs, /* i : sampling frequency */ const int16_t num_freq_bands ); /* i : number of frequency bands */ +void calculate_hodirac_sector_parameters( +#ifdef FIX_485_STATIC_BUFFERS + DIRAC_ENC_HANDLE hDirAC, +#endif + float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector (L+1)^2 x N_bins, real part */ + float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector, imaginary part */ + const float beta, /* i : forgetting factor for average filtering */ + const int16_t *band_grouping, /* i : indices of band groups */ + const int16_t N_bands, /* i : number of bands (groups) */ + const int16_t enc_param_start_band, /* i : first band to process */ + float *azi, /* o : array of sector azimuth angles, flat */ + float *ele, /* o : array of sector elevation angles, flat */ + float *diff, /* o : array of sector diffuseness values, flat */ + float *ene /* o : array of sector energy values, flat */ +); + +void ivas_mc_paramupmix_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ + const int16_t input_frame /* i : input frame length */ +); + +ivas_error ivas_mc_paramupmix_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +); + +void ivas_mc_paramupmix_enc_close( + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + const int32_t sampling_rate +); + +void ivas_mc_paramupmix_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +); + +int16_t ivas_mc_paramupmix_getNumTransportChannels( + void +); + +ivas_error ivas_mc_paramupmix_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +); + +void ivas_mc_paramupmix_dec_close( + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ +); + +void ivas_mc_paramupmix_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ +); + void ivas_param_mc_metadata_open( const MC_LS_SETUP mc_ls_setup, /* i : MC ls setup */ const int16_t lfe_index, /* i : channel index of LFE */ @@ -3619,9 +4081,29 @@ void ivas_param_mc_dec_read_BS( int16_t *nb_bits /* o : number of bits written */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_param_mc_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +); + +void ivas_param_mc_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); +#endif + void ivas_param_mc_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ +#ifdef JBM_TSM_ON_TCS + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif ); void ivas_param_mc_default_icc_map( @@ -3730,7 +4212,7 @@ int16_t computeMixingMatricesResidual( float *mixing_matrix /* o : resulting residual mixing matrix */ ); -/* !r: error or success */ +/*! r: error or success */ int16_t svd( float InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ float singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ @@ -3752,6 +4234,13 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( const float *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_dirac_dec_output_synthesis_get_interpolator( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + const uint16_t interp_length /* i : interpolator length */ +); +#endif + void ivas_dirac_dec_output_synthesis_cov_init( DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */ const int16_t nchan_in, /* i : number of input (tranport) channels */ @@ -3766,27 +4255,45 @@ void ivas_dirac_dec_output_synthesis_cov_close( ); void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( - float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ - float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ - float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ - PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ - const int16_t nchan_in, /* i : number of input channels */ - const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ -); - +#ifdef JBM_TSM_ON_TCS + float *RealBuffer, /* i : input channel filter bank samples (real part) */ + float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ +#else + float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ + float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ +#endif + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ + PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ + const int16_t nchan_in /* i : number of input channels */ +#ifndef JBM_TSM_ON_TCS + , + const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ +#endif +); + void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( - float Cldfb_RealBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float Cldfb_ImagBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part) */ - float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ - float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ - const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ - const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ - const int16_t nX, /* i : number of input channels */ - const int16_t nY, /* i : number of output channels */ - PARAM_MC_DEC_HANDLE hMetadataPMC /* i : handle to the Parametric MC decoder state */ +#ifdef JBM_TSM_ON_TCS + float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ + float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ +#else + float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ + float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ +#endif + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ + float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ +#else + float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ + float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ +#endif + const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const int16_t nX, /* i : number of input channels */ + const int16_t nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ ); int16_t computeMixingMatricesISM( @@ -3870,7 +4377,11 @@ void ivas_sba_upmixer_renderer( ); ivas_error ivas_sba_linear_renderer( +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : number of input ambisonics channels */ const AUDIO_CONFIG output_config, /* i : output audio configuration */ @@ -3964,7 +4475,7 @@ int16_t ivas_get_bw_idx_from_sample_rate( const int32_t sampling_rate /* i : sampling rate */ ); -/* !r: config. table index */ +/*! r: config. table index */ int16_t ivas_get_spar_table_idx( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const int16_t sba_order, /* i : IVAS SBA order */ @@ -3983,6 +4494,13 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ +#ifdef ARITH_HUFF_CODER_CHANGES + , + const int16_t dirac2spar_md_flag, + const int16_t enc_flag, + const int16_t pca_flag, + const int16_t agc_flag +#endif ); void ivas_spar_bitrate_dist( @@ -4036,12 +4554,57 @@ void ivas_spar_get_cldfb_gains( const DECODER_CONFIG_HANDLE hDecoderConfig ); -/* !r: 1 if prediction residual channel */ +/*! r: 1 if prediction residual channel */ int16_t ivas_is_res_channel( const int16_t ch, /* i : ch index in WYZX ordering */ const int16_t nchan_transport /* i : number of transport channels (1-4) */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_spar_dec_agc_pca( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output[][L_FRAME48k], /* i/o: input/output audio channels */ + const int16_t output_frame /* i : output frame length */ +); + +void ivas_spar_dec_set_render_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +); + +void ivas_spar_dec_set_render_params( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ +); + +void ivas_spar_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +); + +ivas_error ivas_sba_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +); + +void ivas_sba_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +); + +void ivas_spar_dec_upmixer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output audio channels */ + const int16_t nchan_internal /* i : number of internal channels */ +); +#endif + void ivas_spar_dec_upmixer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output[][L_FRAME48k], /* i/o: input/output audio channels */ @@ -4069,6 +4632,8 @@ ivas_error ivas_spar_md_enc_process( const int16_t dtx_vad, const int16_t nchan_inp, const int16_t sba_order /* i : Ambisonic (SBA) order */ + , + float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i : prior mixer_matrix */ ); void ivas_compute_spar_params( @@ -4082,6 +4647,7 @@ void ivas_compute_spar_params( const int16_t num_ch, const int16_t bands_bw, const int16_t active_w, + const int16_t active_w_vlbr, ivas_spar_md_com_cfg *hSparCfg, ivas_spar_md_t *hSparMd, float *pWscale, @@ -4125,8 +4691,15 @@ void ivas_get_spar_md_from_dirac( const int16_t order, const int16_t dtx_vad, float Wscale_d[IVAS_MAX_NUM_BANDS] + , + const uint8_t useLowerRes, + const int16_t active_w_vlbr ); +int16_t ivas_get_spar_dec_md_num_subframes( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate ); + ivas_error ivas_spar_md_dec_open( ivas_spar_md_dec_state_t **hMdDec_out, /* i/o: SPAR MD decoder handle */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : configuration structure */ @@ -4168,6 +4741,8 @@ void ivas_spar_to_dirac( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t dtx_vad, /* i : DTX frame flag */ const int16_t num_bands_out /* i : number of output bands */ + , + const int16_t bw /* i : band joining factor */ ); void ivas_spar_update_md_hist( @@ -4177,11 +4752,15 @@ void ivas_spar_update_md_hist( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ + , + const int16_t num_md_sub_frames /* i : number of metadata subframes */ ); void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ + , + const int16_t num_md_sub_frames /* i : number of metadata subframes */ ); void ivas_spar_dec_gen_umx_mat( @@ -4189,6 +4768,8 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ + , + const int16_t num_md_sub_frames ); /* Covariance module */ @@ -4197,6 +4778,11 @@ ivas_error ivas_spar_covar_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp /* i : number of input channels */ + , +#ifdef FIX_489_COV_SMOOTHING + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ +#endif + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); void ivas_spar_covar_enc_close( @@ -4216,6 +4802,8 @@ void ivas_enc_cov_handler_process( const int16_t nchan_inp, const int16_t dtx_vad, const int16_t transient_det[2] + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); ivas_error ivas_spar_covar_smooth_enc_open( @@ -4223,6 +4811,11 @@ ivas_error ivas_spar_covar_smooth_enc_open( const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ const int16_t nchan_inp /* i : number of input channels */ + , +#ifdef FIX_489_COV_SMOOTHING + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ +#endif + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); void ivas_spar_covar_smooth_enc_close( @@ -4279,11 +4872,21 @@ void ivas_td_decorr_dec_close( void ivas_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], /* i : input audio channels */ +#else float pcm_in[][L_FRAME48k], /* i : input audio channels */ +#endif float **ppOut_pcm, /* o : output audio channels */ const int16_t output_frame /* i : output frame length */ ); +void ivas_td_decorr_APD_iir_filter( + ivas_td_decorr_APD_filt_state_t *filter_state, + float *pIn_out, + const int16_t num_APD_sections, + const int16_t length +); #define IVAS_CMULT_FLOAT( in1_re, in1_im, in2_re, in2_im, out1_re, out1_im ) \ out1_re = ( in1_re * in2_re ) - ( in1_im * in2_im ); MAC(1); MULT(1); \ @@ -4419,7 +5022,16 @@ int16_t ivas_get_bits_to_encode( void ivas_huffman_encode( ivas_huffman_cfg_t *huff_cfg, int16_t in, int16_t *hcode, int16_t *hlen ); void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); -void ivas_arith_encode_cmplx_cell_array(ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff); +#ifdef ARITH_HUFF_CODER_CHANGES +int16_t ivas_arith_encode_cmplx_cell_array( +#else +void ivas_arith_encode_cmplx_cell_array( +#endif +ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff +#ifdef ARITH_HUFF_CODER_CHANGES + , int32_t wc_strat_arith +#endif +); ivas_error ivas_huffman_decode( ivas_huffman_cfg_t *huff_cfg, Decoder_State *st0, int16_t *dec_out ); void ivas_arith_decode_cmplx_cell_array( ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, Decoder_State *st0, ivas_cell_dim_t *pCell_dims, int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_re_old ); @@ -4575,6 +5187,8 @@ void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); void ivas_set_qmetadata_maxbit_req( @@ -4582,17 +5196,27 @@ void ivas_set_qmetadata_maxbit_req( const IVAS_FORMAT ivas_format /* i : IVAS format */ ); +/*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ +int16_t ivas_get_df_ratio_bits_hodirac( + const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ +); + /*! r: Bits to be used for quantizing distribution ratio of direct-to-total ratios */ int16_t ivas_get_df_ratio_bits( - int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ + const int16_t index_diff /* i : Index of quantized diffuse-to-total ratio */ ); void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ - const int32_t sampling_rate /* i : sampling rate */ - , MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ +#ifdef FIX_HBR_MASAMETA + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i: signals if called at encoder */ +#else + const int32_t sampling_rate, /* i : sampling rate */ +#endif + MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ); void invdct4_transform( @@ -4614,12 +5238,14 @@ void ivas_masa_prerender( const int16_t output_frame /* i : output frame length per channel */ ); +#ifdef JBM_TSM_ON_TCS +#endif + void ivas_spar_param_to_masa_param_mapping( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t firstSubframe, /* i : First subframe to map */ - const int16_t nSubframes /* i : Number of subframes to map */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ + const int16_t subframe /* i : Subframe to map */ ); @@ -4638,12 +5264,29 @@ void ivas_binRenderer_close( #ifdef DEBUGGING void ivas_binaural_cldfb( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif +); + +#ifdef JBM_TSM_ON_TCS +void ivas_binaural_cldfb_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ + ); +#endif + #endif void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i: : number of time slots to process */ +#endif float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -4653,7 +5296,12 @@ void ivas_binRenderer( void ivas_binaural_add_LFE( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t output_frame, /* i : length of input frame */ +#ifdef JBM_TSM_ON_TCS + float *input_f[], /* i : transport channels */ + float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif ); @@ -4667,10 +5315,22 @@ ivas_error ivas_ism_renderer_open( void ivas_ism_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: core-coder transport channels/object output */ +#else float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */ +#endif const int16_t output_frame /* i : output frame length per channel */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_ism_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t n_samples_to_render /* i : output frame length per channel */ +); +#endif + void ivas_ism_get_stereo_gains( const float azimuth, /* i : object azimuth */ const float elevation, /* i : object elevation */ @@ -4680,14 +5340,23 @@ void ivas_ism_get_stereo_gains( void ivas_mc2sba( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ +#ifdef JBM_TSM_ON_TCS + float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + float *buffer_td[], /* o : MC signals (on input) and the HOA3 (on output) */ +#else float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t sba_order, /* i : SBA order */ const float gain_lfe /* i : gain for LFE, 0=ignore LFE */ ); void ivas_ism2sba( +#ifdef JBM_TSM_ON_TCS + float *buffer_td[], /* i/o: TD signal buffers */ +#else float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ +#endif ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ const int16_t nchan_ism, /* i : number of objects */ @@ -4695,6 +5364,18 @@ void ivas_ism2sba( const int16_t sba_order /* i : SBA order */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_ism2sba_sf( + float *buffer_in[], /* i : TC buffer */ + float *buffer_out[], /* o : TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const int16_t num_objects, /* i : number of objects */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int16_t offset, /* i : offset for the interpolatr */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +); +#endif + /*----------------------------------------------------------------------------------* * Amplitude Panning VBAP prototypes @@ -4743,10 +5424,17 @@ void ivas_ls_setup_conversion_close( LSSETUP_CONVERSION_HANDLE *hLsSetUpConversion /* i/o: LS converter handle */ ); + void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + const int16_t input_chans, /* i : number of input channels to the renderer */ const int16_t output_frame, /* i : frame length */ +#ifdef JBM_TSM_ON_TCS + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ +#else float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ +#endif ); void ivas_ls_setup_conversion_process_mdct( @@ -4760,7 +5448,10 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( ); void ivas_lssetupconversion_process_param_mc( - Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ + Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t num_timeslots, /* i : number of time slots to process */ +#endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ @@ -4879,7 +5570,14 @@ void computeReferencePower_enc( float *reference_power, /* o : Estimated power */ const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + int16_t ref_power_w /* i : use 0 if hodirac is enabled */ +#endif + , + const int16_t nchan_ana /* i : number of analysis channels */ ); ivas_error ivas_mono_dmx_renderer_open( @@ -4987,10 +5685,21 @@ ivas_error ivas_td_binaural_open( ivas_error ivas_td_binaural_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif const int16_t output_frame /* i : output frame length */ ); +#ifdef JBM_TSM_ON_TCS +ivas_error ivas_td_binaural_renderer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +); +#endif /*----------------------------------------------------------------------------------* * Filter-bank (FB) Mixer @@ -4999,11 +5708,15 @@ ivas_error ivas_td_binaural_renderer( ivas_error ivas_fb_set_cfg( IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ const int16_t ivas_format, /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP const SBA_MODE sba_mode, /* i : SBA mode */ +#endif const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ const int32_t sampling_Fs /* i : sampling rate */ + , + const int16_t nachan_dirac_ana /* i : number of DirAR analysis channels */ ); ivas_error ivas_FB_mixer_open( @@ -5024,18 +5737,23 @@ void ivas_fb_mixer_pcm_ingest( float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ const int16_t frame_length /* i : frame length */ + , + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); +#ifndef SBA_MODE_CLEAN_UP void ivas_dirac_enc_spar_delay_synchro( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const int16_t input_frame, /* i : input frame length */ float data_f[][L_FRAME48k] /* i/o: SBA channels (ACN / SN3D) */ ); - +#endif void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ const int16_t length /* i : length of time slot */ + , + const int16_t nchan_fb_in /* i : number of analysis channels */ ); void ivas_fb_mixer_get_windowed_fr( @@ -5045,6 +5763,8 @@ void ivas_fb_mixer_get_windowed_fr( float *frame_f_imag[], /* o : imag freq domain values */ const int16_t length, /* i : number of new samples in time slot */ const int16_t mdft_len /* i : MDFT frame length */ + , + const int16_t nchan_fb_in /* i : number of analysis channels */ ); void ivas_fb_mixer_process( @@ -5063,7 +5783,7 @@ void ivas_fb_mixer_get_in_out_mapping( int16_t in_out_mixer_map[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i/o: mixing mapping */ ); -/* !r: number of spectral bands */ +/*! r: number of spectral bands */ int16_t ivas_get_num_bands_from_bw_idx( const int16_t bwidth /* i : audio bandwidth */ ); diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 0f2491bad3..26dbb10df1 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -263,7 +263,7 @@ void ivas_qmetadata_close( * scalar quantization using partition *------------------------------------------------------------------------*/ -/* r: codeword index */ +/*! r: codeword index */ int16_t masa_sq( const float in, /* i : input value */ const float *threshold, /* i : partition */ @@ -508,24 +508,31 @@ void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { - float ratio1, ratio2, ratioSum; + float ratio1, ratio2; + float ratioSum; ratio1 = 1.0f - diffuseness_reconstructions[ratio_index_1]; ratio2 = 1.0f - diffuseness_reconstructions[ratio_index_2]; - ratioSum = ratio1 + ratio2; - if ( ratio1 >= ratio2 ) + if ( !hodirac_flag ) { - ratio2 = ratio2 / ratio1 * ratioSum; - ratio1 = ratioSum; - } - else - { - ratio1 = ratio1 / ratio2 * ratioSum; - ratio2 = ratioSum; + ratioSum = ratio1 + ratio2; + if ( ratio1 >= ratio2 ) + { + ratio2 = ratio2 / ratio1 * ratioSum; + ratio1 = ratioSum; + } + else + { + ratio1 = ratio1 / ratio2 * ratioSum; + ratio2 = ratioSum; + } } + *ratio_index_mod1 = masa_sq( 1.0f - ratio1, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); *ratio_index_mod2 = masa_sq( 1.0f - ratio2, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); @@ -610,6 +617,35 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation( } +/*------------------------------------------------------------------------- + * ivas_get_df_ratio_bits_hodirac() + * + * + *------------------------------------------------------------------------*/ + +/*! r: bits to be used for quantizing ratio of ratios */ +int16_t ivas_get_df_ratio_bits_hodirac( + const int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ +) +{ + int16_t dfRatio_bits; + + if ( index_diff >= DIFF_DFRATIO_1BIT_LIMIT_IDX ) + { + dfRatio_bits = 1; + } + else if ( index_diff >= DIFF_DFRATIO_2BIT_LIMIT_IDX_HODIRAC ) + { + dfRatio_bits = 2; + } + else + { + dfRatio_bits = 3; + } + + return dfRatio_bits; +} + /*--------------------------------------------------------------- * ivas_get_df_ratio_bits() * @@ -620,7 +656,7 @@ void ivas_qmetadata_direction_vector_to_azimuth_elevation( /*! r: bits to be used for quantizing ratio of ratios */ int16_t ivas_get_df_ratio_bits( - int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ + const int16_t index_diff /* i : index of quantized diffuse-to-total ratio */ ) { int16_t dfRatio_bits; diff --git a/lib_com/ivas_qspherical_com.c b/lib_com/ivas_qspherical_com.c index 039dea53eb..874f66d059 100644 --- a/lib_com/ivas_qspherical_com.c +++ b/lib_com/ivas_qspherical_com.c @@ -71,7 +71,7 @@ uint16_t ivas_qmetadata_reorder_generic( * Returns the original value of the array "folded" by ReorderGeneric *------------------------------------------------------------------------*/ -/* !r: "Unfolded" value, positive or negative depending on the value of the input */ +/*! r: "Unfolded" value, positive or negative depending on the value of the input */ int16_t ivas_qmetadata_dereorder_generic( const uint16_t uns_value /* i : unsigned value result of ReorderGeneric */ ) @@ -234,7 +234,7 @@ void small_reduction_direction( * Input phi expected to be an angle in degree between 0 and 360. *-----------------------------------------------------------------------*/ -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi( float phi, /* i : azimuth value */ const int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ @@ -401,7 +401,7 @@ float companding_azimuth( * Input phi expected to be an angle in degree between 0 and 360. *-----------------------------------------------------------------------*/ -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi_chan_lbr( const float phi, /* i : azimuth value */ float *phi_hat, /* o : quantized azimuth */ @@ -445,7 +445,7 @@ int16_t quantize_phi_chan_lbr( * Input phi expected to be an angle in degree between 0 and 360. *-----------------------------------------------------------------------*/ -/* !r: index azimuth */ +/*! r: index azimuth */ int16_t quantize_phi_chan_compand( float phi, /* i : azimuth value */ float *phi_hat, /* o : quantized azimuth */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 6677b53a9f..9f67c602f6 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -628,7 +628,6 @@ const float tdm_den_ratio_tabl[TDM_NQ+1] = /* 1.0f/(2*LR_ratio*LR_ratio-2*LR_ra 1.2088f, 1.1429f, 1.0902f, 1.0501f, 1.0221f, 1.0000f, 1.0000f, 1.0000f }; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL const int16_t tdm_bit_allc_tbl[5][6] = { /* IC -- UC -- GC -- TM --AC */ @@ -638,21 +637,8 @@ const int16_t tdm_bit_allc_tbl[5][6] = { 1650, 6050, 0, 10000, 0, 10000 }, /* IVAS_32k */ { 1650, 6050, 0, 13000, 0, 14000 } /* IVAS_48k */ }; -#else -const int16_t tdm_bit_allc_tbl[5][6] = -{ - /* IC -- UC -- GC -- TM --AC */ - { 1600, 3450, 0, 4400, 0, 5000 }, /* IVAS_13k2 */ - { 1600, 3450, 0, 5000, 0, 5000 }, /* IVAS_16k4 */ - { 1600, 3450, 0, 6000, 0, 5000 }, /* IVAS_24k4 */ - { 1600, 6000, 0, 10000, 0, 10000 }, /* IVAS_32k */ - { 1600, 6000, 0, 13000, 0, 14000 } /* IVAS_48k */ -}; -#endif -#ifdef LSF_RE_USE_SECONDARY_CHANNEL /* LSFs Intra-frame prediction tables */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE const float tdm_LSF_MEAN_RE_USE_OUT[M] = { 301.292f, 521.300f, 870.818f, 1340.278f, 1712.099f, 2091.456f, 2488.523f, 2841.096f, 3196.565f, 3593.040f, 3958.366f, 4293.334f, 4710.319f, 5118.806f, 5546.761f, 5918.579f, @@ -693,7 +679,6 @@ const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15] = 0.2043f, 0.6317f, 0.0543f, 0.1767f, 0.5396f, }; -#endif const float tdm_LSF_MEAN_PRED_QNT[M] = { @@ -729,7 +714,6 @@ const float tdm_PRED_QNT_fixed_beta_prd_diag_3[15 + 16 + 15] = 0.1709f, 0.6372f, 0.1060f, 0.1193f, 0.6574f, }; -#endif const int16_t fast_FCB_bits_2sfr[] = {8, 14, 18, 20, 24, 128/*stop value*/}; @@ -893,7 +877,7 @@ const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1] = 0, 1, 2, 3, 4 }; - +const float c_weights[DIRAC_NO_FB_BANDS_MAX] = { 9.962447e-02f, 9.627997e-01f, 9.926667e-01f, 9.981028e-01f, 9.996648e-01f, 1.000000e+00f, 9.997692e-01f, 9.992002e-01f, 9.983890e-01f, 9.973818e-01f, 9.962037e-01f, 9.948692e-01f, 9.933876e-01f, 9.917654e-01f, 9.900073e-01f, 9.881169e-01f, 9.860975e-01f, 9.839516e-01f, 9.816818e-01f, 9.792906e-01f, 9.767801e-01f, 9.741527e-01f, 9.714106e-01f, 9.685560e-01f, 9.655913e-01f, 9.625187e-01f, 9.593406e-01f, 9.560594e-01f, 9.526774e-01f, 9.491970e-01f, 9.456208e-01f, 9.419512e-01f, 9.381908e-01f, 9.343420e-01f, 9.304075e-01f, 9.263898e-01f, 9.222915e-01f, 9.181152e-01f, 9.138636e-01f, 9.095392e-01f, 9.051447e-01f, 9.006827e-01f, 8.961559e-01f, 8.915668e-01f, 8.869181e-01f, 8.822123e-01f, 8.774521e-01f, 8.726400e-01f, 8.677785e-01f, 8.628702e-01f, 8.579176e-01f, 8.529231e-01f, 8.478893e-01f, 8.428184e-01f, 8.377130e-01f, 8.325753e-01f, 8.274077e-01f, 8.222124e-01f, 8.169917e-01f, 8.117478e-01f, 8.064829e-01f, 8.011990e-01f, 7.958982e-01f, 7.905827e-01f, 7.852543e-01f, 7.799150e-01f, 7.745667e-01f, 7.692112e-01f, 7.638505e-01f, 7.584861e-01f, 7.531199e-01f, 7.477535e-01f, 7.423885e-01f, 7.370265e-01f, 7.316691e-01f, 7.263176e-01f, 7.209736e-01f, 7.156384e-01f, 7.103134e-01f, 7.049999e-01f, 6.996990e-01f, 6.944121e-01f, 6.891403e-01f, 6.838847e-01f, 6.786464e-01f, 6.734265e-01f, 6.682258e-01f, 6.630455e-01f, 6.578863e-01f, 6.527492e-01f, 6.476350e-01f, 6.425445e-01f, 6.374784e-01f, 6.324376e-01f, 6.274226e-01f, 6.224341e-01f, 6.174729e-01f, 6.125393e-01f, 6.076341e-01f, 6.027577e-01f, 5.979106e-01f, 5.930932e-01f, 5.883061e-01f, 5.835497e-01f, 5.788242e-01f, 5.741301e-01f, 5.694676e-01f, 5.648372e-01f, 5.602390e-01f, 5.556734e-01f, 5.511404e-01f, 5.466405e-01f, 5.421737e-01f, 5.377402e-01f, 5.333402e-01f, 5.289738e-01f, 5.246411e-01f, 5.203422e-01f, 5.160771e-01f, 5.118460e-01f, 5.076489e-01f, 5.034858e-01f, 4.993567e-01f, 4.952616e-01f, 4.912005e-01f, 4.871734e-01f, 4.831802e-01f, 4.792209e-01f, 4.752955e-01f, 4.714037e-01f, 4.675457e-01f, 4.637212e-01f, 4.599302e-01f, 4.561725e-01f, 4.524481e-01f, 4.487567e-01f, 4.450983e-01f, 4.414728e-01f, 4.378799e-01f, 4.343195e-01f, 4.307915e-01f, 4.272956e-01f, 4.238318e-01f, 4.203997e-01f, 4.169993e-01f, 4.136303e-01f, 4.102926e-01f, 4.069859e-01f, 4.037101e-01f, 4.004649e-01f, 3.972501e-01f, 3.940655e-01f, 3.909109e-01f, 3.877861e-01f, 3.846909e-01f, 3.816250e-01f, 3.785882e-01f, 3.755803e-01f, 3.726010e-01f, 3.696501e-01f, 3.667275e-01f, 3.638328e-01f, 3.609658e-01f, 3.581263e-01f, 3.553141e-01f, 3.525289e-01f, 3.497705e-01f, 3.470387e-01f, 3.443331e-01f, 3.416537e-01f, 3.390001e-01f, 3.363720e-01f, 3.337694e-01f, 3.311919e-01f, 3.286393e-01f, 3.261114e-01f, 3.236079e-01f, 3.211286e-01f, 3.186733e-01f, 3.162418e-01f, 3.138337e-01f, 3.114490e-01f, 3.090872e-01f, 3.067484e-01f, 3.044321e-01f, 3.021382e-01f, 2.998664e-01f, 2.976166e-01f, 2.953885e-01f, 2.931819e-01f, 2.909966e-01f, 2.888323e-01f, 2.866889e-01f, 2.845661e-01f, 2.824637e-01f, 2.803816e-01f, 2.783194e-01f, 2.762770e-01f, 2.742543e-01f, 2.722509e-01f, 2.702667e-01f, 2.683014e-01f, 2.663550e-01f, 2.644271e-01f, 2.625177e-01f, 2.606264e-01f, 2.587531e-01f, 2.568977e-01f, 2.550599e-01f, 2.532395e-01f, 2.514364e-01f, 2.496503e-01f, 2.478811e-01f, 2.461287e-01f, 2.443928e-01f, 2.426732e-01f, 2.409698e-01f, 2.392824e-01f, 2.376109e-01f, 2.359550e-01f, 2.343146e-01f, 2.326895e-01f, 2.310797e-01f, 2.294848e-01f, 2.279047e-01f, 2.263394e-01f, 2.247886e-01f, 2.232521e-01f, 2.217299e-01f, 2.202217e-01f, 2.187274e-01f, 2.172469e-01f, 2.157800e-01f, 2.143266e-01f, 2.128865e-01f, 2.114596e-01f, 2.100457e-01f, 2.086447e-01f, 2.072564e-01f, 2.058808e-01f }; /*----------------------------------------------------------------------* * SPAR ROM tables @@ -903,6 +887,21 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { /* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ + { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, +#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX + { { 10000, 8150, 13150 } }, +#else + { { 10000, 8300, 13150 } }, +#endif + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, + + { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, +#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX + { { 13200, 11350, 16350 } }, +#else + { { 13200, 11500, 16350 } }, +#endif + { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0,{ { 16400, 14850, 24350 } }, { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, @@ -936,7 +935,13 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, { 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } }, - { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 31, 1, 1, 1 } }, 1, 2, 0 }, + { { 31, 11, 11, 1 },{ 1, 1, 1, 1 }, +#ifdef ARITH_HUFF_CODER_CHANGES + { 1, 1, 1, 1 } +#else + { 31, 1, 1, 1 } +#endif + }, 1, 2, 0 }, { 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, // not yet optimized { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, @@ -950,10 +955,10 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { 512000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 }, {118450, 118450, 128000 } }, // not yet optimized { { 31, 1, 1, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 97700, 93300, 128000 } }, // not yet optimized + { 512000, 0, SBA_HOA2_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 124000, 124000, 128000 },{ 124000, 124000, 128000 },{ 125200, 118450, 128000 },{ 76300, 73000, 128000 } }, // not yet optimized { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, - { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 128000, 128000, 128000 },{ 127200, 122550, 128000 },{ 76300, 73550, 128000 } }, // not yet optimized + { 512000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 118000, 118000, 128000 },{ 118000, 118000, 128000 },{ 117200, 109250, 128000 },{ 72300, 69000, 128000 } }, // not yet optimized { { 31, 11, 11, 1 },{ 1, 1, 1, 1 },{ 1, 1, 1, 1 } }, 1, 2, 0 }, }; @@ -1471,11 +1476,13 @@ const int16_t dtx_pr_real_q_levels[3][3] = { { 9,9,9 },{ 9,7,9 },{ 9,5,7 } }; const int16_t pr_pr_idx_pairs[3][3][2] = { { { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 0, 0 },{ 0, 0 } },{ { 0, 0 },{ 1, 3 },{ 0, 0 } } }; const int16_t pr_pd_idx_pairs[3][3][2] = { { { 1, 1 },{ 2, 2 },{ 3, 3 } },{ { 1, 1 },{ 3, 2 },{ 2, 0 } },{ { 2, 1 },{ 0, 0 },{ 0, 0 } } }; -const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH] = { /* WYZX --> WYXZ... */ - { 0, 1, 3, 2, 4, 5, 6, 7} +const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS] = { /* WYZX --> WYXZ... */ + { 0, 1, 3, 2, 4, 5, 6, 7, 8, 9, 10 } }; -const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1 }; -const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 15}; +const int16_t keep_planar[IVAS_SPAR_MAX_CH - IVAS_SPAR_MAX_DMX_CHS] = { 1, 1, 1, 1, 1, 1 }; +const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15}; +const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 8, 9, 10, 10, 10, 10}; +const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; /*----------------------------------------------------------------------* @@ -2531,7 +2538,48 @@ const uint16_t ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_ /*----------------------------------------------------------------------------------* * MASA ROM tables *----------------------------------------------------------------------------------*/ - +#ifdef HR_METADATA + +const float diffuseness_reconstructions_hr[HR_MASA_ER_LEVELS] = +{ + 0.00f, + 0.0142822265625f, + 0.030029296875f, + 0.052001953125f, + 0.07708740234375f, + 0.10528564453125f, + 0.14483642578125f, + 0.19573974609375f, + 0.26568603515625f, + 0.35467529296875f, + 0.436279296875f, + 0.510498046875f, + 0.5943603515625f, + 0.6878662109375f, + 0.80096435546875f, + 0.93365478515625f +}; +const float diffuseness_thresholds_hr[HR_MASA_ER_LEVELS + 1] = +{ + 0.0f, + 0.009521484375f, + 0.01904296875f, + 0.0410156250f, + 0.06298828125f, + 0.0911865234375f, + 0.119384765625f, + 0.1702880859375f, + 0.22119140625f, + 0.3101806640625f, + 0.399169921875f, + 0.473388671875f, + 0.547607421875f, + 0.641113281250f, + 0.734619140625f, + 0.8673095703125f, + 2.0f /* out-of-range large value to make searching easier */ +}; +#endif const int16_t bits_direction_masa[DIRAC_DIFFUSE_LEVELS] = { 11, @@ -2544,6 +2592,7 @@ const int16_t bits_direction_masa[DIRAC_DIFFUSE_LEVELS] = 3 }; + const float coherence_cb0_masa[DIRAC_DIFFUSE_LEVELS * 2 * MASA_NO_CV_COH] = { /* this is the same */ @@ -2726,7 +2775,11 @@ const uint8_t masa_joined_nbands[IVAS_NUM_ACTIVE_BRATES] = const uint8_t masa_twodir_bands[IVAS_NUM_ACTIVE_BRATES] = { +#ifdef HR_METADATA + 0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 24 +#else 0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 12 +#endif }; const uint8_t masa_twodir_bands_joined[IVAS_NUM_ACTIVE_BRATES] = @@ -3980,7 +4033,6 @@ const float ivas_cos_twiddle_160[IVAS_160_PT_LEN >> 1] = 0.0760120586092433f, 0.0564205163668375f, 0.0368072229413588f, 0.0171797396307788f }; -#ifdef PARAMMC_SHORT_ENC_MDFT const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1] = { 1.0000000000f, 0.9999143276f, 0.9996573250f, 0.9992290362f, 0.9986295348f, 0.9978589232f, 0.9969173337f, @@ -4002,7 +4054,6 @@ const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1] = 0.1045284633f, 0.0915016187f, 0.0784590957f, 0.0654031292f, 0.0523359562f, 0.0392598158f, 0.0261769483f, 0.0130895956f, 0.0000000000f }; -#endif const float ivas_sin_twiddle_80[IVAS_80_PT_LEN >> 1] = { @@ -5554,611 +5605,843 @@ const int16_t ivas_num_active_bands[FB - WB + 1] = IVAS_16K_12BANDS_ACTIVE_BANDS, IVAS_FB_BANDS_12, IVAS_FB_BANDS_12 }; -#ifdef SNS_MSVQ const int16_t ivas_sns_cdbks_tcx20_levels[SNS_MSVQ_NSTAGES_TCX20] = { 128, 64, 32, 32 }; const int16_t ivas_sns_cdbks_tcx20_bits[SNS_MSVQ_NSTAGES_TCX20] = { 7, 6, 5, 5 }; -/* codebooks trained for no adaptive tilt */ +/* pre-rounded codebook vectors for singed Q4.12 represantation */ const float ivas_sns_cdbk_tcx20_stage1[ 128 * 16 ] = { - -3.24881770f, -1.99497051f, -0.04725080f, 1.02318508f, 1.51589220f, 1.44649178f, 1.27858728f, 1.15137095f, 0.98029724f, 0.69167126f, 0.33414576f, 0.11759238f, -0.27510520f, -0.63610342f, -1.05394049f, -1.28304590f, - -3.24340413f, -4.15075396f, -2.86242117f, -1.11561919f, 1.12899983f, 1.98341478f, 0.56638511f, -0.05841474f, -0.14875192f, 0.31098029f, 1.87121037f, 0.91347082f, 1.02548459f, 1.98227488f, 1.30278860f, 0.49435585f, - 1.23065598f, 0.87793778f, 0.28294330f, 0.02972172f, 0.42574775f, 0.83386805f, 0.95758438f, 1.21299710f, 1.15042593f, 1.00234403f, 0.60083169f, -0.06520030f, -1.53941239f, -2.26801783f, -2.42116011f, -2.31126766f, - 0.06088614f, 0.02623315f, -0.61781539f, -1.23181247f, -1.40815590f, -1.42831471f, -1.44033232f, -1.33353337f, -0.99555917f, -0.36554180f, 0.55314618f, 1.56114474f, 2.01339157f, 1.99106535f, 1.51097476f, 1.10422329f, - -0.46337128f, -1.76230281f, -2.14514561f, -1.74284853f, -0.74943182f, 0.04642704f, 0.99955801f, 1.04344919f, 1.33994604f, 1.17515394f, 1.38810800f, 1.59087304f, 0.68196542f, -0.13955087f, -0.49622391f, -0.76660607f, - -2.07291483f, -1.16133507f, -1.23972694f, -1.55319745f, -1.53709378f, -0.89687815f, -0.30493476f, 0.53566030f, 0.90463531f, 1.12789938f, 1.18233130f, 1.05231063f, 0.85029894f, 0.96079862f, 1.14041844f, 1.01172838f, - 2.12762247f, 0.85938708f, 0.01404337f, -0.21119526f, -0.23292897f, -0.20800178f, 0.17965021f, 0.51517794f, 0.58450068f, 0.57289696f, 0.08413189f, -0.34604446f, -0.63957268f, -0.82541169f, -1.16686648f, -1.30738935f, - 1.40474083f, 0.32307263f, 0.16419111f, 0.38346550f, 0.50108274f, 0.37590359f, 0.08846238f, -0.23008300f, -0.45942672f, -0.45977478f, -0.43670746f, -0.36727746f, -0.35363526f, -0.33341415f, -0.31539698f, -0.28520292f, - -1.63093109f, 0.32670603f, 1.08393314f, 0.58998372f, 0.53843053f, 0.88612683f, 0.92734321f, 0.85881168f, 0.60801083f, 0.37502839f, -0.29325438f, -0.61636624f, -0.51913318f, -0.70035895f, -0.99754553f, -1.43678500f, - -1.93833343f, -0.69005518f, -0.75170110f, -1.07591216f, -1.13136476f, -0.91057037f, -0.96360579f, -0.81544927f, -0.72636191f, -0.36468519f, 0.13935276f, 1.01589488f, 1.62003238f, 2.00743696f, 2.33078654f, 2.25453582f, - 0.79346182f, 0.75880356f, 0.99941121f, 1.41339988f, 1.42679902f, 1.10135650f, 0.67724856f, 0.16701926f, -0.44226147f, -0.83565024f, -0.96240506f, -0.97710726f, -1.05267194f, -1.07354671f, -1.04194230f, -0.95191489f, - 1.32136151f, -0.10247792f, -0.44723017f, -0.36075427f, -0.71183851f, -0.78401615f, 0.03854040f, 0.61579422f, 0.72990899f, 0.74660263f, 0.27260947f, -0.45511245f, -0.57501743f, -0.20707029f, -0.10728071f, 0.02598055f, - -2.38997175f, -0.94335853f, 0.22486968f, 0.68758389f, 0.77400708f, 0.48551812f, 0.16770824f, 0.18451833f, 0.33722182f, 0.44300618f, 0.45730356f, 0.25903292f, 0.07348018f, -0.18351294f, -0.34985810f, -0.22754861f, - -0.04011386f, -2.74627791f, -2.64617639f, -2.12344376f, -1.04417531f, -1.19773434f, -1.09890378f, -1.14847926f, -1.25163399f, -1.37182360f, -0.92453053f, 0.26852562f, 2.49004087f, 5.03865317f, 3.18845554f, 4.60761675f, - 1.14142799f, 2.34150710f, 1.12597821f, 0.18025034f, -0.06854703f, 0.11882225f, -0.04029384f, -0.10117108f, -1.28130702f, -1.15721800f, 0.11730029f, 0.68335719f, -0.86449861f, -0.91274565f, -0.63726145f, -0.64560064f, - 0.13591417f, 1.45701293f, 0.18328994f, -1.33736241f, -1.63073739f, -1.11748160f, 0.33426081f, 1.38341076f, 1.23963779f, 1.15857921f, -0.19884512f, -0.46649971f, -0.23043753f, -0.16721531f, -0.08938742f, -0.65413930f, - -3.20422583f, -2.18732518f, -1.06476764f, -0.35148934f, 0.10909386f, 0.39065642f, 0.55826648f, 0.44049157f, 0.21409388f, 0.73508456f, 0.80931151f, 0.46688874f, 0.41272044f, 0.76516296f, 1.00398863f, 0.90204888f, - -2.87971458f, -4.23728027f, -0.84454748f, -0.07411834f, 0.21882417f, -1.73386520f, 0.44502397f, -0.29845675f, 0.51877264f, 1.16767994f, -0.80604089f, 1.51749444f, 2.06387385f, 2.42941495f, 1.48054035f, 1.03239888f, - 0.41502416f, 1.92937242f, 2.34493885f, 2.24663449f, 1.97723622f, 1.21219002f, 0.63995779f, 0.11201995f, -0.55860561f, -1.24739776f, -1.54711086f, -1.65155024f, -1.60927011f, -1.56104438f, -1.42473910f, -1.27765585f, - 0.97567115f, -1.33363678f, -2.33351304f, -2.63770798f, -2.22869213f, -1.57504148f, -1.07402035f, -0.47932319f, 0.18065985f, 0.66105619f, 1.18623833f, 1.66207325f, 1.92650802f, 1.89672632f, 1.54070829f, 1.63229361f, - -1.83309029f, -1.12088085f, -0.69053368f, -0.04697322f, 0.16614312f, 0.20653379f, 0.18628141f, 0.29156151f, 0.23415032f, 0.18998435f, 0.46020416f, 0.73218863f, 0.60617333f, 0.33402310f, 0.20549266f, 0.07874144f, - 1.16879643f, -0.94945093f, -1.28153207f, -1.43119528f, -1.63599975f, -1.48906283f, -0.72189452f, 0.19212127f, 0.62604095f, 0.71399312f, 0.84540884f, 0.67919451f, 0.73724815f, 0.94849167f, 0.74181449f, 0.85602585f, - 3.95026110f, 1.56392643f, -0.09370037f, -1.55546296f, -0.28400433f, 2.65160213f, 1.72026891f, -1.03325487f, -2.07533128f, -1.61929448f, -0.37408941f, -0.62936182f, -0.97909452f, -0.16160269f, -0.16361090f, -0.91725088f, - 0.53671249f, -1.03786958f, -1.08801981f, -0.37356699f, -0.22489401f, 0.02309705f, 0.14784551f, 0.19793732f, 0.12472343f, 0.09506024f, 0.05869315f, 0.14383214f, 0.10038818f, 0.25076267f, 0.40789510f, 0.63740306f, - -1.95841389f, 0.03478956f, 1.04981544f, 1.45141888f, 1.01368780f, 1.76553008f, 0.97518033f, 0.87744500f, 1.11998177f, 1.49531245f, 0.43867723f, -1.39588091f, -2.49552623f, -2.06407734f, -1.18465117f, -1.12328885f, - -1.17302983f, 0.17875585f, 0.89193716f, 1.29461477f, 1.14616923f, 0.04577007f, -0.87252250f, -0.55960184f, -0.58720665f, -0.52949712f, -0.37526793f, 0.00605696f, -0.15490600f, 0.06404177f, 0.40280720f, 0.22187871f, - 0.64131376f, 1.75231910f, 2.22508888f, 1.98484418f, 0.78172753f, -0.67005650f, -0.79535378f, 0.16537851f, 0.46442966f, -0.37889506f, -1.24009244f, -0.92537177f, -0.87140953f, -1.04472250f, -1.06971265f, -1.01948730f, - 0.34969434f, 1.41127416f, 0.95134631f, -0.49521902f, -1.13459218f, -1.02414143f, -0.54470763f, 0.04902381f, -0.01765934f, -0.09518271f, -0.07199094f, -0.00398826f, 0.14565429f, 0.17470642f, 0.18302401f, 0.12275814f, - -0.44981302f, -0.20165042f, -0.00073479f, 0.26315901f, 0.44473473f, 0.36317865f, 0.17484972f, 0.03171990f, 0.07343634f, 0.04543774f, -0.09709362f, -0.05624873f, -0.00866747f, -0.02410679f, -0.21651202f, -0.34168925f, - -1.24451525f, -1.23251652f, -1.59614073f, -2.03789978f, -1.96213854f, -1.71444999f, -1.60613134f, -1.51978903f, -1.00014591f, 0.04117804f, 1.34166006f, 2.42925461f, 2.88303472f, 2.83027230f, 2.48737677f, 1.90095093f, - 1.96467234f, 1.49818482f, 0.23737321f, -0.11314831f, -0.14050512f, -0.25201114f, -0.17389748f, -0.07042668f, -0.18426976f, -0.34937744f, -0.42674607f, -0.50442879f, -0.58679768f, -0.52836378f, -0.35445903f, -0.01579900f, - -0.99933612f, 1.11819495f, 1.29449512f, -0.02576221f, -0.61170357f, 0.30864176f, 0.87998806f, 0.96699269f, 0.98082342f, 1.27485776f, 0.52941745f, -1.29529727f, -1.88922976f, -1.36858904f, -0.37094568f, -0.79254774f, - -2.00039877f, -0.30176543f, 0.62981832f, 1.66518235f, 1.71899440f, 1.30408052f, 0.82774193f, 1.00586191f, 0.86017140f, 0.54233910f, -0.13420070f, -0.66585251f, -0.96492148f, -1.18998336f, -1.56871158f, -1.72835605f, - -2.69937742f, -3.72437438f, -3.23623013f, -0.25624354f, 1.96357307f, 2.46814215f, 3.53069303f, -1.06174110f, -1.09336853f, -0.07686535f, 1.29279961f, 1.80354460f, 1.27988399f, -0.42606045f, -0.44754574f, 0.68316996f, - -0.09822772f, 1.26120245f, 1.70052823f, 1.56502837f, 1.15694639f, 0.88838189f, 0.57465867f, 0.31853596f, 0.03466567f, -0.25958767f, -0.49911919f, -0.76007985f, -1.16055649f, -1.53569625f, -1.61195549f, -1.57472513f, - -1.14376495f, -1.43799067f, -1.45325578f, -1.52444742f, -1.38528757f, -1.09797958f, -0.89118095f, -0.62608417f, -0.00250085f, 0.94458366f, 1.51363028f, 1.81223868f, 1.83008829f, 1.56737959f, 1.18148735f, 0.71308420f, - -0.16148812f, -2.04769833f, -2.09471486f, -1.43005703f, -0.50205979f, -0.54822778f, 1.68195446f, 4.00061129f, 1.03275735f, 0.41847912f, 0.66770340f, -0.11822564f, -0.63042447f, -0.32785779f, -0.23825248f, 0.29750055f, - -3.59916102f, -3.16769339f, -2.44843270f, -2.08077491f, -1.31387103f, -0.17348440f, 0.36398119f, 1.21172207f, 1.38864588f, 1.46347831f, 1.46684451f, 1.84157730f, 1.58044756f, 1.35394187f, 1.27155115f, 0.84122764f, - 1.12168796f, 1.77011301f, 0.80501182f, -0.65059510f, -0.86885740f, -0.21223750f, 0.66413611f, 0.77827963f, 0.37800197f, -0.26796888f, -0.97801860f, -0.64966444f, -0.50047252f, -0.44549810f, -0.47750530f, -0.46641261f, - 1.69417025f, 0.14170351f, -0.30309571f, -0.50074499f, -0.60597114f, -0.65756500f, -0.62775844f, -0.41013834f, -0.07761611f, 0.16510349f, 0.25158511f, 0.34758291f, 0.28289899f, 0.29273919f, 0.09829950f, -0.09119332f, - -0.86153928f, 1.09981825f, 0.79441249f, 0.41436072f, 0.25807562f, -0.33355863f, -0.51983659f, -0.25841284f, 0.00191053f, 0.13240503f, 0.19942573f, 0.24363814f, 0.08478089f, -0.15773770f, -0.37897853f, -0.71876393f, - -3.54840520f, -3.31670990f, -2.41138986f, -1.93012869f, -1.20864357f, -0.47291818f, -0.18678664f, 0.02177990f, 0.31458995f, 0.70059621f, 1.23845973f, 1.82707181f, 2.12918865f, 2.27071260f, 2.36659938f, 2.20598371f, - -1.13771731f, 0.39368618f, 0.69608234f, 1.45165188f, 1.41884327f, 1.47720631f, 0.71071536f, 0.51669579f, 0.07379070f, -0.91725636f, -1.46431524f, -2.01818354f, -0.45034354f, -0.20458063f, -0.61685389f, 0.07057863f, - 1.94180196f, -0.43938181f, -1.45235723f, -1.62714803f, -0.56602083f, 0.17861664f, -0.11574800f, -0.55042921f, -0.26385634f, 0.14973980f, 0.40358646f, 0.57744006f, 0.91363053f, 0.71399177f, -0.04044356f, 0.17657766f, - -2.29623160f, 0.37017475f, -0.14625619f, 1.40510672f, -0.18688173f, 0.98162341f, -0.08351923f, 0.30727120f, 0.21088276f, 0.00882905f, 0.20930156f, 0.07859582f, 0.11868622f, 0.19357924f, -0.59940040f, -0.57176126f, - 0.32770546f, -2.17703619f, -2.14694909f, -1.21327174f, -0.09787592f, -0.38390569f, -0.54684876f, -0.76275935f, -1.00614562f, -1.06555455f, -0.70232123f, -0.12667989f, 0.23719344f, 0.82854727f, 3.01646153f, 5.81943998f, - 1.74451794f, 2.61728252f, 2.50084081f, 2.14806463f, 1.03256213f, -0.14230845f, -0.89600957f, -1.26996454f, -1.47590648f, -1.42717085f, -1.20779572f, -0.98498624f, -0.82778555f, -0.73610012f, -0.59428320f, -0.48095729f, - -1.63200590f, 0.23028801f, -0.00907184f, -0.79978843f, -1.00748376f, -0.12526203f, 0.79168097f, 0.90826744f, 0.57548955f, 0.65151547f, 0.37307684f, -0.12047965f, -0.13538324f, 0.00756611f, 0.31705141f, -0.02546129f, - -2.96255244f, -1.89398578f, -1.11705055f, -0.49587679f, -0.64879460f, 0.52145289f, -0.11691144f, 1.02365070f, 0.12124424f, 1.06613244f, 2.03450026f, 1.32855094f, 0.54450823f, -0.09583278f, -0.09304639f, 0.78401059f, - -2.74846388f, -3.29381816f, -1.69589747f, 0.09992536f, 1.19730664f, -0.16362356f, -0.15703004f, 0.55042720f, 0.31568131f, 0.18156842f, 0.68590339f, 1.08986889f, 1.58662197f, 1.58930878f, 0.65286724f, 0.10935410f, - 2.40977200f, 1.75366309f, 0.74979137f, 0.75357579f, 0.58888421f, 0.34045829f, 0.41658500f, 0.41731179f, 0.35825939f, 0.03048901f, -0.69808452f, -1.34206657f, -1.51950247f, -1.45414323f, -1.40318331f, -1.40180996f, - -0.45462369f, -0.79464966f, -0.73449499f, -0.64030961f, -0.59804980f, -0.52688087f, -0.50966580f, -0.32241860f, -0.22751147f, -0.05981052f, 0.18569777f, 0.50293633f, 0.68570837f, 0.93799600f, 1.18364242f, 1.37243415f, - 0.71230959f, -0.15258830f, -0.30639043f, -0.10789426f, 0.13596677f, 0.06139692f, -0.05906250f, -0.09243858f, 0.16058801f, 0.19962984f, -0.02914953f, -0.05986174f, -0.00798730f, -0.03679071f, -0.19035654f, -0.22737122f, - 0.20985119f, 0.67531452f, -0.76482923f, -1.95548615f, -2.01335569f, -1.31859418f, -0.44117933f, 0.43598020f, 0.63898416f, 0.59260283f, 0.59660664f, 0.64364003f, 0.57962656f, 0.72198795f, 0.77431143f, 0.62453906f, - 3.37266827f, 1.16546541f, 0.15487771f, 0.57979973f, 1.63054771f, 1.04524609f, -0.13961184f, -0.53246008f, -0.51061506f, -0.83238697f, -1.04232388f, -0.96061103f, -0.90339873f, -0.99671658f, -1.06027762f, -0.97020325f, - -2.45339028f, 0.22870307f, 0.50079654f, 0.82545821f, -0.45080889f, -0.16537387f, -0.25306064f, -0.33349906f, 0.26143456f, 0.09313222f, 0.86160665f, 0.75164534f, -1.22179547f, -0.18801375f, 1.02457992f, 0.51858541f, - -1.46171297f, 0.63898461f, 2.15634917f, 1.94818588f, 2.12627540f, 1.70759626f, 1.43815259f, 0.82410049f, 0.20479176f, -0.43378728f, -0.89783731f, -1.30555797f, -1.66597981f, -1.80440934f, -1.79291067f, -1.68224086f, - -0.10170911f, 1.63842605f, 2.05629785f, 1.72760611f, 0.13751598f, -1.26847816f, -1.58069540f, -1.04510855f, -0.88231099f, -0.68616151f, -0.59891556f, -0.49054331f, -0.18451655f, 0.19151542f, 0.64619056f, 0.44088718f, - -0.86655238f, 0.59030963f, 1.14256838f, 1.66795450f, 1.50058628f, 1.34944192f, 0.08257813f, 0.24901720f, -0.18852178f, -0.03650931f, -0.27994508f, -1.06110568f, -2.06900429f, -1.73358377f, -0.24057835f, -0.10665549f, - 1.50872779f, 1.31070374f, 0.39357214f, -0.46407462f, -0.92397447f, -1.13436545f, -1.23237146f, -1.13209159f, -1.03095318f, -0.62563255f, -0.17705075f, 0.30244717f, 0.51989500f, 0.80258928f, 0.87034201f, 1.01223693f, - -0.30437289f, -0.88801487f, -0.86107707f, -0.28285107f, 0.28699382f, 0.45911485f, 0.48852566f, 0.45550239f, 0.58082722f, 0.55866427f, 0.31299044f, 0.14102370f, 0.07480087f, -0.08720185f, -0.35323153f, -0.58169395f, - -2.81842263f, -2.50111842f, -2.46829445f, -2.46942172f, -2.16241013f, -1.43881623f, -1.42903221f, -0.83291045f, 0.08734224f, 1.62875243f, 2.38321450f, 2.57841755f, 2.43444406f, 2.45552669f, 2.52427006f, 2.02845861f, - 3.37066045f, 1.49218725f, 0.55470586f, 0.13748306f, -0.13402053f, -0.39589325f, -0.44410867f, -0.48568748f, -0.51085663f, -0.42397560f, -0.53871831f, -0.60800303f, -0.57632384f, -0.50071998f, -0.46558245f, -0.47114696f, - -0.62183100f, 1.32484675f, 1.39280525f, 0.63916764f, 0.07573329f, 0.57096453f, 0.11014546f, -0.13955579f, -0.60839590f, -0.77966466f, -1.07179154f, -1.77671234f, -0.71411508f, 0.13441149f, 0.72184010f, 0.74215154f, - -2.90081845f, -3.29359883f, -1.89249569f, 2.35796037f, 2.47210792f, 0.89083303f, 1.25230145f, 1.03281210f, 1.34506489f, 0.48347288f, -0.08158884f, 0.21388757f, 0.05047384f, -0.37546417f, -0.70672331f, -0.84822525f, - -0.68878586f, -3.17765901f, -2.72677654f, -0.83696096f, 1.93901658f, 2.45806994f, 0.77003930f, 0.58220309f, 0.28500621f, -0.15305225f, 0.53711675f, 0.20321993f, 0.20435459f, 0.27124049f, 0.02126411f, 0.31170327f, - 1.03813940f, 1.60082720f, 1.24608760f, 0.78739775f, 0.96747591f, 1.10068123f, 1.15134869f, 0.74915981f, 0.42167811f, 0.15553718f, -0.33259317f, -0.97385519f, -1.61082594f, -2.05590168f, -2.15737100f, -2.08778582f, - -0.64496025f, 0.35212582f, -0.04908282f, -1.05504457f, -1.19731005f, -0.73315350f, -0.66929749f, -0.60130627f, -0.33236585f, 0.23014025f, 0.69893111f, 1.09565077f, 1.08466375f, 0.94366305f, 0.65639554f, 0.22095053f, - 0.48358349f, -0.37847120f, -1.02753771f, -0.73518795f, -0.11326269f, 0.53003780f, 0.88038488f, 0.88882395f, 0.97329253f, 0.69212641f, 0.87373175f, 0.80871682f, -0.03656343f, -0.94980974f, -1.26081773f, -1.62904720f, - -2.23244251f, -1.79490434f, -1.96001543f, -2.27380061f, -2.07255037f, -1.46415033f, -1.04393033f, 0.20282312f, 1.57244767f, 1.97591827f, 1.77648956f, 1.75160994f, 1.62357252f, 1.47414518f, 1.35930993f, 1.10547779f, - 0.79628045f, 0.95200921f, 0.49234542f, 0.09199320f, -0.05724590f, -0.07118046f, -0.04634766f, -0.00096416f, -0.17970825f, -0.09563800f, -0.01779017f, 0.13120319f, -0.03610489f, -0.35895498f, -0.62415601f, -0.97574095f, - 1.23786391f, -0.05332070f, 0.12142715f, 0.41317442f, 0.15674045f, -0.23609842f, -0.45604039f, -0.60612644f, -0.72063869f, -0.65773356f, -0.45446098f, -0.19856125f, -0.01567566f, 0.31093945f, 0.48567017f, 0.67284050f, - -0.38959317f, 0.48417975f, 0.67846195f, 0.96883427f, 0.97152360f, 0.77479838f, 0.58711345f, 0.71066957f, 0.54730033f, 0.30078955f, -0.00792413f, -0.23889729f, -0.71320215f, -1.17067509f, -1.60334166f, -1.90003738f, - -0.58748774f, -1.47663922f, -1.69196885f, -1.58982061f, -1.20534794f, -0.84425696f, -0.58959522f, -0.30927859f, 0.05320947f, 0.43265601f, 0.78002809f, 1.13478063f, 1.29240277f, 1.39914925f, 1.52607187f, 1.67609674f, - 0.21900175f, 0.90198746f, 1.47152638f, 1.60585024f, 1.28627552f, 0.62955762f, -0.10179136f, -0.53979665f, -0.95849172f, -1.05549774f, -0.93249423f, -0.63224235f, -0.54606380f, -0.47048197f, -0.44721628f, -0.43012290f, - 1.16598857f, -0.44883323f, -0.35990019f, 0.55867022f, 0.76350144f, 0.40336553f, -0.17899520f, -0.32789312f, 0.39266043f, 1.31706823f, 0.14239671f, -1.37351682f, -1.43994906f, -0.44961849f, 0.22694761f, -0.39189263f, - -2.38540927f, -1.62852954f, -0.88269400f, -0.07377225f, 0.58356450f, 0.88990527f, 0.91596948f, 0.64591793f, 0.36616944f, 0.38677852f, 0.46220080f, 0.31194777f, 0.22940934f, 0.16539664f, 0.07914516f, -0.06599966f, - 0.72463355f, -0.52958069f, -1.48068920f, -1.78301927f, -1.84235585f, -1.64970240f, -1.53867955f, -1.38956832f, -1.22397576f, -0.84685537f, -0.05213558f, 1.07240247f, 1.81984926f, 2.69693629f, 2.99963897f, 3.02310102f, - 1.19409909f, 2.68519772f, 1.98964488f, 0.67968388f, -0.01774621f, -0.15701839f, -0.09104235f, 0.24620030f, -0.83163859f, -1.22467182f, -1.23467957f, -1.15083406f, -0.63344301f, -0.72619249f, -0.46989224f, -0.25766714f, - -0.36982280f, 1.17012486f, 0.65527007f, -0.63203416f, -0.41714099f, 0.81639854f, 0.54164978f, 0.77650051f, 0.59880614f, 0.82660687f, -1.04749065f, -0.62911908f, -0.34368981f, -0.45351210f, -0.51314098f, -0.97940604f, - -2.68285677f, -0.85691687f, -0.20235026f, -0.01759520f, -0.00179021f, 0.11451343f, 0.27056934f, 0.20577824f, -0.23029364f, 0.11388472f, -0.05166620f, 0.07283122f, 0.56553984f, 0.81068091f, 1.04931803f, 0.84035365f, - -1.52932955f, -1.34785922f, -0.57071683f, -0.20686289f, 0.08155976f, -0.47381873f, -0.77622457f, -0.57310159f, -0.22137986f, 0.13834100f, 0.49481460f, 0.80177416f, 0.88568748f, 1.02957744f, 1.20356068f, 1.06397834f, - 0.85311314f, 1.33739225f, 1.91363915f, 1.93231248f, 2.08304754f, 1.71778606f, 0.86773094f, 0.43475180f, 0.03661492f, -0.61728713f, -1.15699401f, -1.66982248f, -1.98244609f, -2.00151078f, -1.93416224f, -1.81416574f, - 1.60126279f, -0.81833805f, -1.38880039f, -1.40634796f, -1.32149763f, -1.28036492f, -1.07256373f, -0.72500244f, -0.46550137f, -0.10403512f, 0.28677127f, 0.67644278f, 1.00944110f, 1.34460513f, 1.63359356f, 2.03033498f, - -1.12256198f, -1.95155583f, -1.32316561f, -0.63266570f, -0.15627220f, 0.07123786f, 0.13550620f, 0.25890778f, 0.47783453f, 0.57057758f, 0.68332609f, 0.73453078f, 0.66233264f, 0.62861164f, 0.56744294f, 0.39591321f, - 0.06875844f, -0.77557401f, -1.05293353f, -1.03197877f, -0.85111938f, -0.61756528f, -0.16943921f, 0.22208891f, 0.49771452f, 0.66450860f, 0.73241467f, 0.72611275f, 0.63156506f, 0.52604468f, 0.30774149f, 0.12166125f, - 3.80400584f, 1.75988157f, 0.24665703f, -1.24851564f, -1.25633571f, 0.32422259f, 2.13094918f, 0.70439664f, -1.53713254f, -1.71622823f, -1.08819715f, -0.50716458f, -0.74087437f, -0.99402032f, -0.10491345f, 0.22326928f, - -0.65058475f, -0.32678303f, -0.20547132f, -0.11041511f, -0.11848885f, -0.20790889f, -0.31102714f, -0.27474061f, -0.20625644f, -0.08260245f, 0.09887987f, 0.33251986f, 0.41319745f, 0.49892877f, 0.56061378f, 0.59013885f, - -2.39642240f, -0.73872271f, 0.49057636f, 1.16325658f, 0.79747808f, 1.34021740f, 0.82073194f, 1.17831994f, 1.25881141f, 0.84489551f, -0.77511278f, -1.30893620f, -1.25529283f, -0.65601516f, -0.34679935f, -0.41698601f, - -0.54371008f, 0.45990001f, 0.73230478f, 1.41706822f, 1.07142705f, 0.82233755f, -0.15928811f, -0.34139895f, -0.08643862f, -0.24274513f, -0.48172279f, -0.46452865f, -0.44837803f, -0.43356299f, -0.59008965f, -0.71117480f, - -0.36854343f, 1.40608712f, 2.13291678f, 1.80061219f, 1.15989238f, -0.32896337f, -0.86683083f, -0.45937605f, -0.17796119f, -0.40226921f, -0.30363529f, -1.08494615f, -0.97269428f, -0.91102639f, -0.31526836f, -0.30799363f, - 0.16771127f, 1.28284008f, 0.25724837f, -1.11750032f, -1.04368583f, 0.13121741f, 0.10609539f, 0.02437401f, -0.56098948f, -0.38744327f, 0.07855531f, 0.20548373f, 0.06560664f, 0.24342662f, 0.39885137f, 0.14820870f, - 0.20792769f, -0.15663987f, -0.04445993f, 0.27319064f, 0.51281629f, 0.57962552f, 0.54535177f, 0.41567183f, 0.41718141f, 0.20916435f, -0.10574785f, -0.26957618f, -0.44861183f, -0.55143961f, -0.71969549f, -0.86475851f, - -2.53854175f, -2.10301056f, -1.97482174f, -2.12277877f, -1.80824545f, -1.32660134f, -1.25816793f, -0.90711327f, -0.59056817f, -0.05426883f, 0.60446374f, 1.61001048f, 2.40601840f, 3.00689095f, 3.60110855f, 3.45562566f, - 1.07778822f, 2.19172459f, 1.44013405f, 0.27222350f, 0.03173527f, -0.04691321f, 0.06376916f, 0.63907484f, -0.17949007f, 0.10010871f, -0.52495472f, -0.90729516f, -0.89428983f, -1.02410889f, -1.09546364f, -1.14404292f, - 0.76276530f, 1.59524592f, 1.47474021f, 0.18145014f, 0.13550913f, 0.88510912f, 1.03412929f, 1.01111065f, 0.77539585f, 0.20329499f, -1.35508663f, -1.83340559f, -1.40465488f, -1.14514789f, -1.16420913f, -1.15624650f, - -2.56605999f, -0.69575164f, 0.80693890f, 1.72778867f, 2.34339014f, 2.09042055f, 1.74382199f, 1.18476481f, 0.71416221f, 0.16808900f, -0.19808303f, -0.77842890f, -1.40866559f, -1.73499872f, -1.76586854f, -1.63151971f, - -0.32618212f, -2.76955063f, -2.78043449f, 0.51956703f, 4.34383806f, 1.88716237f, 4.47289205f, -0.68129863f, -1.52511041f, -1.32636741f, 0.65997777f, -0.52682311f, -0.69581956f, -0.43799624f, -0.50098243f, -0.31287245f, - 1.11744895f, 0.76474262f, 0.68913317f, 0.77356058f, 0.73021025f, 0.55480731f, 0.41334472f, 0.23384124f, 0.00040865f, -0.18384701f, -0.30336471f, -0.46628578f, -0.73968976f, -1.02792872f, -1.19473003f, -1.36165137f, - -1.09856438f, -2.65937422f, -2.23447552f, -2.36127808f, -1.92601400f, -1.29606162f, -0.86847602f, -0.41112389f, 0.27059515f, 0.62653494f, 1.25539083f, 2.16718498f, 2.40401093f, 1.97246907f, 1.87623832f, 2.28294385f, - -2.23812017f, -3.37112518f, -3.06489410f, -2.44639779f, -1.77205118f, -0.96847500f, 3.20788062f, 2.74986128f, 2.48376367f, 3.58855607f, 1.46558359f, 0.58208141f, 0.58647621f, -0.03336968f, -0.01161197f, -0.75815742f, - -3.34068874f, -3.31330139f, -3.27624195f, -3.18776773f, -2.60176738f, -1.35466356f, -0.47112724f, 0.80847853f, 1.80958348f, 2.21285031f, 2.26554713f, 2.76880679f, 2.60017886f, 2.04062204f, 1.67575322f, 1.36373732f, - 0.04677635f, 1.13691098f, 1.30914680f, 0.25672818f, 0.15799852f, 0.60568291f, 0.31771628f, 0.07597951f, -0.26589647f, -0.54972118f, -0.86844552f, -0.61094603f, -0.47072310f, -0.40511943f, -0.38309528f, -0.35299238f, - 0.22528620f, 0.31743905f, 0.31483553f, 0.17720192f, 0.16231355f, -0.06831057f, -0.29693139f, -0.45560458f, -0.21127731f, -0.08624191f, -0.20781580f, -0.12232125f, 0.08133224f, 0.09984234f, 0.03187445f, 0.03837752f, - 0.45404525f, 1.31244734f, 1.09193858f, 0.46595512f, 0.31516414f, -0.08250116f, -0.64154502f, -0.86897307f, -0.92275973f, -0.84086567f, -0.63886704f, -0.14652849f, 0.08165072f, 0.18249933f, 0.18288233f, 0.05545734f, - -2.78701578f, -2.31409561f, -1.68556203f, -1.40144529f, -0.74842449f, -0.07375189f, -0.20211385f, 0.09260002f, 0.29898930f, 0.66465229f, 0.75558861f, 0.96729187f, 1.14177838f, 1.55174084f, 1.99705535f, 1.74271247f, - -0.10464683f, -0.94242352f, -0.57955843f, 1.29762166f, 1.68516688f, 1.09852539f, 0.72099378f, 0.51323036f, -0.24285175f, -0.55888513f, -0.50577021f, -0.46366004f, -0.55836815f, -0.58550721f, -0.50078205f, -0.27308479f, - 3.45286440f, 0.59611628f, -0.69351346f, -1.14674518f, -1.07854543f, -0.89938730f, -0.76263547f, -0.52068670f, -0.36216337f, -0.17157688f, -0.01447939f, 0.15778389f, 0.27944020f, 0.35739675f, 0.34083744f, 0.46529411f, - -1.28927442f, 0.10726691f, 0.86158650f, 0.06273348f, -0.04085696f, 1.13928101f, 0.37886132f, 0.13576595f, -0.53530704f, -0.37566277f, -0.10613359f, -0.03059598f, -0.04857175f, -0.00612681f, 0.00516239f, -0.25812835f, - 2.89076531f, -0.04664344f, -1.93237643f, -2.19996964f, -1.86412035f, -1.18315371f, -1.10120931f, -1.31680378f, -1.30399765f, -1.28669610f, -0.94489947f, -0.60614659f, 1.58599312f, 0.95842154f, 2.94815038f, 5.40268579f, - 3.83455417f, 3.13869337f, 1.72510455f, 1.17236146f, 0.33356711f, 0.11348813f, -0.29704182f, -1.13829975f, -1.48383443f, -1.43388842f, -1.35163818f, -1.16938088f, -1.02627819f, -0.92590386f, -0.82058768f, -0.67091549f, - -0.93172509f, 0.85237993f, 1.34276319f, 0.25174685f, -0.79705618f, -0.63895111f, 0.21118680f, 0.97143052f, 0.70458966f, -0.18635616f, -0.52911893f, -1.85150883f, -0.43982599f, 0.04075634f, 0.50586277f, 0.49382650f, - -3.79516923f, -3.31533743f, -1.55672619f, 0.02918112f, 0.69887327f, 0.58481500f, 1.07030510f, 1.26562384f, 1.20349632f, 1.07269840f, 0.89773042f, 0.88137053f, 0.60964812f, 0.28884498f, 0.12262285f, -0.05797732f, - -0.08660073f, -3.36745835f, -3.82012977f, -2.75147711f, -0.36352096f, 0.85747874f, 1.11140604f, 0.65593665f, 0.35792228f, 0.54619342f, 0.99489751f, 1.28924616f, 0.96663509f, 1.40602119f, 1.12645860f, 1.07699149f, - 1.92634136f, 2.07569243f, 1.90024169f, 1.55333140f, 1.00662166f, 0.59662392f, 0.41735113f, 0.03712017f, -0.30033462f, -0.70147399f, -1.26150322f, -1.36946469f, -1.49306813f, -1.53593901f, -1.47859712f, -1.37294294f, - 0.41088895f, -0.68758389f, -0.85837881f, -0.86844724f, -0.85475992f, -0.88373397f, -0.82636157f, -0.54233624f, -0.33497780f, -0.06884329f, 0.24209832f, 0.60199869f, 0.83678079f, 1.05727685f, 1.27867768f, 1.49770152f, - -0.45442780f, -0.39381771f, -0.35575987f, -0.28279611f, -0.03460671f, 0.02188475f, -0.06207990f, -0.02068513f, 0.24104453f, 0.35743869f, 0.26392307f, 0.33209979f, 0.34550175f, 0.24362296f, 0.00439669f, -0.20573886f, - -1.38047831f, 0.78167658f, 0.42055729f, -0.93786054f, -1.72548724f, -1.52410071f, -0.47028251f, 0.81491117f, 0.82382622f, 0.46806997f, 0.95867097f, 0.52433344f, -0.02522016f, 0.39885676f, 0.61128096f, 0.26124617f, - 1.92925285f, 1.70790963f, 1.15526536f, 0.66461298f, 0.67490541f, 0.23892474f, -0.12861693f, -0.33635752f, -0.52286346f, -0.56868795f, -0.86695874f, -0.88842939f, -0.86631615f, -0.80495760f, -0.73812023f, -0.64956301f, - -0.46329214f, 0.55823622f, 0.34966614f, -0.14855330f, -0.35757896f, -0.52459469f, -0.85251369f, -0.95064429f, -0.99468342f, -0.76192580f, -0.41419015f, 0.12436151f, 0.64925405f, 1.13684199f, 1.33630964f, 1.31330685f, - 0.86356450f, 0.34381018f, -0.02085849f, 1.83539444f, 2.32518759f, 1.67398143f, 1.25867313f, 1.20615444f, 0.52697956f, -0.09144588f, -0.76159106f, -1.51187022f, -1.92351238f, -1.95050372f, -1.91438733f, -1.85957587f, - 1.24350337f, 2.40332737f, 1.88241131f, 1.35749721f, -0.42200494f, -1.44428015f, -1.39178301f, -0.93577948f, -0.61036359f, -0.51298915f, -0.79745508f, 0.00259692f, 0.20231677f, -0.31281818f, -0.31072767f, -0.35345154f, - -1.27391584f, 0.23665237f, 1.44085187f, 2.06602253f, 1.71605896f, 0.13376293f, -0.37509412f, 0.40922525f, 0.84118074f, 0.94717998f, -0.77859633f, -1.07717911f, -1.15385313f, -1.14774662f, -0.82654451f, -1.15800495f, - 1.30848084f, 0.08937934f, -0.37852967f, -0.65194579f, -0.75067573f, -0.79649158f, -0.77379985f, -0.60797455f, -0.51295495f, -0.32714998f, -0.08812522f, 0.24492207f, 0.48331843f, 0.72894883f, 0.89967800f, 1.13292004f, - -1.59837663f, -0.80221740f, -0.23176726f, 0.53351299f, 0.66646844f, 0.70631763f, 0.72180374f, 0.68847102f, 0.63073539f, 0.46683184f, 0.29870291f, 0.24285644f, -0.04345483f, -0.36903735f, -0.77735195f, -1.13349493f, - -3.27008180f, -3.34427840f, -3.19628867f, -2.98677397f, -2.40944350f, -1.63513906f, -1.40569428f, -0.88190894f, -0.25273952f, 0.84351501f, 1.96278949f, 2.92570176f, 3.17223429f, 3.47899460f, 3.70716828f, 3.29194486f, - 2.58466208f, 2.01534437f, 1.28252767f, 0.44865967f, -0.33100837f, -0.81011259f, -1.06701187f, -1.12743988f, -1.21505758f, -0.99337144f, -0.66853937f, -0.46093443f, -0.22132067f, 0.00996599f, 0.24481197f, 0.30882455f, - -0.62864502f, 1.04984327f, 1.56877053f, 0.77975000f, 0.01037804f, 0.92352492f, 1.12297462f, 0.76284403f, -0.16106015f, -0.21398417f, -0.62673537f, -1.68917053f, -1.60748063f, -0.79116243f, -0.06290217f, -0.43694470f + -1.8305664f, -2.0878906f, -0.9638672f, 2.8059082f, 2.668213f, 1.1638184f, 1.390625f, 1.217041f, 1.3850098f, 0.44555664f, -0.47045898f, -0.5307617f, -0.810791f, -1.1647949f, -1.4560547f, -1.7612305f, + -2.5979004f, -3.3308105f, -1.8554688f, -0.3605957f, 1.6828613f, 2.5871582f, 0.98168945f, 0.22436523f, -0.13110352f, 0.16699219f, 1.5004883f, 0.3293457f, 0.33569336f, 1.1591797f, 0.1796875f, -0.8718262f, + 1.982666f, 2.2011719f, 1.1525879f, 0.8093262f, 0.86499023f, 1.1618652f, 1.2888184f, 1.3618164f, 1.0827637f, 0.83251953f, 0.12011719f, -0.7182617f, -2.1948242f, -3.0500488f, -3.3571777f, -3.53833f, + 0.15771484f, 1.1040039f, 0.39282227f, -0.6479492f, -1.0939941f, -1.0437012f, -1.2055664f, -1.1469727f, -0.998291f, -0.37768555f, 0.3486328f, 1.081543f, 1.2700195f, 1.2143555f, 0.8371582f, 0.107666016f, + 0.24438477f, -0.70751953f, -1.1660156f, -1.1777344f, -0.24536133f, 0.39624023f, 1.112793f, 1.232666f, 1.3540039f, 1.088623f, 0.9001465f, 0.9003906f, -0.030761719f, -0.83740234f, -1.2800293f, -1.7849121f, + -0.91918945f, -0.18603516f, -0.7397461f, -1.5285645f, -1.7453613f, -1.2680664f, -0.9445801f, 0.2434082f, 1.3000488f, 1.6604004f, 1.2814941f, 1.0026855f, 0.71484375f, 0.56347656f, 0.47509766f, 0.09008789f, + 2.4824219f, 1.4541016f, 0.91064453f, 0.6765137f, 0.5678711f, 0.6965332f, 0.7609863f, 0.70410156f, 0.36108398f, -0.032470703f, -0.69140625f, -1.1281738f, -1.4833984f, -1.5556641f, -1.7043457f, -2.0187988f, + 2.41333f, 1.4936523f, 0.9902344f, 0.9104004f, 0.7211914f, 0.5522461f, 0.09326172f, -0.21655273f, -0.49560547f, -0.4873047f, -0.7363281f, -0.9211426f, -1.0041504f, -0.9875488f, -1.0681152f, -1.2578125f, + -0.814209f, 1.2546387f, 1.6965332f, 1.420166f, 0.99560547f, 1.1420898f, 1.0039062f, 0.9289551f, 0.6604004f, 0.22485352f, -0.6530762f, -1.2009277f, -1.2949219f, -1.3759766f, -1.7175293f, -2.2705078f, + -1.3979492f, 0.18896484f, 0.34814453f, -0.052001953f, -0.38623047f, -0.25878906f, -0.3371582f, -0.109375f, -0.08227539f, 0.07495117f, -0.019042969f, 0.1184082f, 0.30566406f, 0.5102539f, 0.6755371f, 0.4206543f, + 1.0683594f, 1.9543457f, 2.1296387f, 2.071045f, 1.5754395f, 1.1333008f, 0.4248047f, -0.19799805f, -0.84350586f, -1.079834f, -1.3415527f, -1.3908691f, -1.3967285f, -1.3078613f, -1.3322754f, -1.4663086f, + 2.3891602f, 2.5097656f, 1.144043f, 0.36572266f, -0.16894531f, -0.23388672f, 0.26879883f, 0.7692871f, 0.54589844f, 0.5180664f, -0.26879883f, -0.92211914f, -1.2089844f, -1.4658203f, -1.9033203f, -2.338623f, + -1.3549805f, 1.3427734f, 1.5871582f, 1.9365234f, 0.58935547f, 0.4892578f, -0.17675781f, -0.19458008f, 0.11352539f, 0.01928711f, 0.30419922f, -0.23291016f, -2.1499023f, -1.2368164f, -0.20922852f, -0.8269043f, + 0.8769531f, -1.5319824f, -1.6025391f, -1.3833008f, -0.57299805f, -0.8847656f, -0.90600586f, -0.986084f, -1.1860352f, -1.3520508f, -1.2216797f, -0.49902344f, 1.5070801f, 4.0805664f, 2.208496f, 3.4538574f, + 4.114258f, 3.3249512f, 2.2033691f, 1.0500488f, 0.14770508f, -0.36547852f, -0.748291f, -0.8503418f, -1.0917969f, -1.0305176f, -1.1955566f, -1.2768555f, -1.1767578f, -1.0061035f, -0.9506836f, -1.1477051f, + 0.7878418f, 2.513916f, 1.0112305f, -0.767334f, -1.3525391f, -0.86865234f, 0.42456055f, 1.4470215f, 1.2680664f, 1.1574707f, -0.41333008f, -0.92993164f, -0.9226074f, -0.92285156f, -0.80859375f, -1.6242676f, + -2.2216797f, -1.2346191f, -0.4008789f, 0.59765625f, -0.49389648f, 1.1911621f, 0.032470703f, 1.3654785f, 0.43139648f, 1.2021484f, 1.6652832f, 0.58862305f, -0.29541016f, -0.99560547f, -1.0366211f, -0.39526367f, + -1.8601074f, -2.9248047f, 0.14648438f, 0.61157227f, 0.6274414f, -1.3579102f, 0.48095703f, -0.4399414f, 0.57006836f, 1.1831055f, -1.1950684f, 0.828125f, 1.2575684f, 1.5888672f, 0.5510254f, -0.06762695f, + 2.1816406f, 2.8918457f, 2.9243164f, 2.5839844f, 2.2548828f, 1.7543945f, 0.92626953f, 0.45751953f, -0.17285156f, -0.9650879f, -1.7875977f, -2.3608398f, -2.6245117f, -2.6313477f, -2.6652832f, -2.767334f, + 2.0964355f, 0.20458984f, -1.2553711f, -2.0012207f, -1.9951172f, -1.407959f, -1.0788574f, -0.47460938f, -0.01928711f, 0.45239258f, 0.73779297f, 0.9333496f, 1.0112305f, 1.1274414f, 0.90893555f, 0.7597656f, + -1.2897949f, 0.13867188f, 0.4831543f, 0.6274414f, 0.5175781f, 0.54541016f, 0.46826172f, 0.548584f, 0.39135742f, 0.4975586f, 0.38671875f, -0.022705078f, -0.36083984f, -0.8190918f, -1.0593262f, -1.0527344f, + 0.80029297f, 0.57250977f, 0.068359375f, -0.70996094f, -1.0571289f, -0.92041016f, -0.74121094f, -0.3017578f, 0.1850586f, 0.7922363f, 0.76171875f, 0.55859375f, 0.39135742f, 0.22363281f, -0.09790039f, -0.5253906f, + 4.5966797f, 2.5993652f, 0.8737793f, -0.9536133f, -0.07006836f, 2.6501465f, 1.3757324f, -0.8967285f, -1.6777344f, -1.2912598f, -0.5917969f, -1.3334961f, -1.4775391f, -0.6760254f, -1.0019531f, -2.1257324f, + -1.0061035f, 0.67407227f, 0.9157715f, 0.9851074f, 0.78564453f, -0.009277344f, -0.40039062f, -0.12524414f, -0.18310547f, -0.0029296875f, -0.38989258f, -0.40820312f, -0.37158203f, -0.15551758f, 0.010253906f, -0.3178711f, + -1.3325195f, 0.7138672f, 1.6359863f, 2.2177734f, 1.659668f, 1.9414062f, 1.0874023f, 1.3305664f, 1.4523926f, 1.2883301f, -0.56225586f, -2.0280762f, -2.8566895f, -2.5690918f, -2.1638184f, -1.8144531f, + 0.0925293f, 1.5366211f, 2.095459f, 1.9145508f, 1.4782715f, 0.8676758f, -0.34643555f, -0.21826172f, -1.1254883f, -1.1550293f, -0.92211914f, -0.5473633f, -0.89868164f, -0.77441406f, -0.8112793f, -1.1855469f, + 2.2070312f, 3.5219727f, 1.9643555f, 0.5649414f, -0.021728516f, 0.14941406f, 0.15991211f, 0.21850586f, -1.1708984f, -1.1306152f, -0.32299805f, -0.064453125f, -1.4772949f, -1.6064453f, -1.3984375f, -1.5932617f, + 2.5195312f, 2.3515625f, 1.3063965f, 0.20825195f, -0.609375f, -1.088623f, -1.3623047f, -1.2600098f, -1.3369141f, -1.0693359f, -0.8010254f, -0.42773438f, -0.15234375f, 0.44799805f, 0.5998535f, 0.6743164f, + 1.5209961f, 1.0463867f, 0.74560547f, 0.51342773f, 0.34448242f, 0.21533203f, -0.028320312f, -0.084228516f, 0.08618164f, 0.12475586f, -0.3557129f, -0.5698242f, -0.63012695f, -0.6933594f, -0.9638672f, -1.2717285f, + -0.5739746f, -0.20629883f, -0.9890137f, -1.8708496f, -1.9855957f, -1.6159668f, -1.6103516f, -1.3623047f, -0.9399414f, -0.067871094f, 0.9128418f, 1.7995605f, 2.1074219f, 2.2941895f, 2.331787f, 1.7766113f, + 3.6323242f, 1.9743652f, 0.3935547f, -0.6862793f, -1.1130371f, -1.0187988f, -0.8935547f, -0.5998535f, -0.4345703f, -0.2290039f, -0.26416016f, -0.21484375f, -0.13208008f, 0.009765625f, -0.16601562f, -0.2578125f, + -0.0871582f, 1.651123f, 1.8327637f, 0.54125977f, 0.23999023f, 1.421875f, 0.79663086f, 1.309082f, 0.98217773f, 1.2548828f, -1.8842773f, -1.8806152f, -1.5390625f, -1.3496094f, -1.2785645f, -2.0100098f, + -2.2109375f, -0.70288086f, 1.1103516f, 2.2207031f, 2.3356934f, 2.010498f, 1.638916f, 1.4345703f, 1.0351562f, 0.5690918f, -0.11035156f, -0.88256836f, -1.5859375f, -2.0117188f, -2.31958f, -2.5310059f, + -1.6091309f, -2.519287f, -2.4504395f, 0.26660156f, 2.321289f, 2.5898438f, 3.5390625f, -1.0505371f, -1.2543945f, -0.27734375f, 0.94873047f, 1.3859863f, 0.7109375f, -1.0185547f, -1.2666016f, -0.31689453f, + 0.94433594f, 2.465332f, 2.668457f, 1.9997559f, 1.2949219f, 1.0178223f, 0.888916f, 0.7038574f, 0.29248047f, -0.050048828f, -0.77001953f, -1.4472656f, -2.0839844f, -2.5202637f, -2.6381836f, -2.7663574f, + -0.14160156f, -0.3083496f, -0.5864258f, -1.2387695f, -1.4682617f, -1.1057129f, -0.7817383f, -0.5292969f, -0.06323242f, 0.54003906f, 0.8947754f, 1.3034668f, 1.3681641f, 1.1462402f, 0.7866211f, 0.18408203f, + 0.40478516f, -0.94018555f, -1.2241211f, -1.1057129f, -0.43066406f, -0.07324219f, 2.0061035f, 4.0029297f, 0.48828125f, 0.20117188f, 0.16235352f, -0.4182129f, -0.7751465f, -0.74072266f, -0.7463379f, -0.81152344f, + -2.7770996f, -2.1079102f, -1.5097656f, -1.515625f, -1.0080566f, -0.036621094f, 0.3708496f, 1.060791f, 1.3742676f, 1.2963867f, 0.9782715f, 1.0876465f, 0.9584961f, 0.8691406f, 0.7578125f, 0.20092773f, + 1.8244629f, 2.9589844f, 2.7573242f, 1.1542969f, 0.87109375f, 1.3430176f, 0.9003906f, 0.8564453f, 0.41308594f, -0.40551758f, -2.0913086f, -2.3833008f, -2.1589355f, -1.9533691f, -1.9741211f, -2.1125488f, + 2.1027832f, 1.2624512f, 1.0627441f, 0.8051758f, 0.22583008f, -0.12939453f, -0.3996582f, -0.54052734f, -0.74975586f, -0.7180176f, -0.7895508f, -0.7229004f, -0.6113281f, -0.2956543f, -0.21484375f, -0.28710938f, + 0.15161133f, 2.585205f, 1.7568359f, 0.9177246f, 0.37329102f, -0.16088867f, -0.4633789f, -0.21801758f, -0.09277344f, -0.021484375f, -0.22631836f, -0.42382812f, -0.66625977f, -0.8803711f, -1.0666504f, -1.5649414f, + -2.6091309f, -1.9162598f, -1.4050293f, -1.5510254f, -1.4436035f, -0.76904297f, -0.6994629f, -0.28881836f, -0.09326172f, 0.4140625f, 0.6401367f, 1.267334f, 1.7597656f, 2.1586914f, 2.4848633f, 2.0510254f, + -0.08935547f, 1.982666f, 2.4018555f, 1.3012695f, 0.122802734f, 0.8886719f, 1.3410645f, 1.0705566f, 0.115234375f, -0.2043457f, -0.97094727f, -2.4370117f, -2.147705f, -1.3283691f, -0.74731445f, -1.298584f, + 2.5476074f, 0.140625f, -0.8376465f, -1.244873f, -1.2324219f, -0.7644043f, -0.34521484f, 0.3581543f, 0.60839844f, 0.5698242f, 0.3034668f, 0.06274414f, 0.27563477f, 0.35498047f, -0.28588867f, -0.5109863f, + -0.5878906f, 1.0141602f, 1.5241699f, 1.2287598f, 0.76123047f, 0.6047363f, 0.2199707f, 0.21044922f, 0.15185547f, 0.15307617f, -0.115478516f, -0.46313477f, -0.689209f, -0.9284668f, -1.3129883f, -1.770752f, + 1.4040527f, -0.9628906f, -1.3322754f, -0.79785156f, 0.06591797f, -0.045166016f, -0.33520508f, -0.6257324f, -0.91748047f, -0.9824219f, -0.9892578f, -0.84472656f, -0.66137695f, -0.057861328f, 2.248291f, 4.8339844f, + 2.727539f, 3.736084f, 3.4023438f, 2.6699219f, 1.3686523f, 0.091308594f, -0.7897949f, -1.1069336f, -1.4260254f, -1.4335938f, -1.5388184f, -1.5930176f, -1.5603027f, -1.5078125f, -1.473877f, -1.565918f, + 1.2629395f, 2.5461426f, 1.8774414f, -0.051513672f, -1.0480957f, -0.94873047f, -0.40551758f, 0.21875f, 0.01977539f, -0.1484375f, -0.44140625f, -0.5810547f, -0.5349121f, -0.4650879f, -0.51831055f, -0.7819824f, + -2.1455078f, -0.25683594f, 1.3151855f, 1.635498f, 1.4401855f, 0.89624023f, 0.8405762f, 0.9350586f, 0.9802246f, 0.67041016f, -0.13085938f, -0.59521484f, -0.9729004f, -1.145752f, -1.4951172f, -1.9714355f, + -2.1291504f, -2.1418457f, -0.46704102f, 0.73291016f, 1.2219238f, -0.27856445f, -0.30517578f, 1.1865234f, 0.87231445f, -0.060791016f, 0.060058594f, 0.43701172f, 0.79174805f, 0.9128418f, -0.046142578f, -0.7866211f, + 3.130127f, 2.7661133f, 1.8110352f, 1.4995117f, 1.095459f, 0.8935547f, 0.8383789f, 0.5913086f, 0.21923828f, -0.1965332f, -0.982666f, -1.7121582f, -2.2011719f, -2.409912f, -2.5390625f, -2.803711f, + 1.5769043f, 0.34960938f, -0.17211914f, -0.4428711f, -0.62597656f, -0.57055664f, -0.6516113f, -0.43676758f, -0.38208008f, -0.18725586f, -0.16992188f, -0.0034179688f, 0.15356445f, 0.39404297f, 0.56396484f, 0.60424805f, + 0.12768555f, 0.2109375f, 0.16137695f, 0.063964844f, 0.13012695f, 0.39526367f, 0.5834961f, 0.62353516f, 0.50683594f, 0.37402344f, 0.060546875f, -0.13232422f, -0.37719727f, -0.6010742f, -0.8376465f, -1.2895508f, + 0.6723633f, 1.9140625f, 0.3737793f, -1.2988281f, -1.7912598f, -1.2351074f, -0.44628906f, 0.5895996f, 0.6838379f, 0.58935547f, 0.22460938f, -0.013183594f, -0.16479492f, 0.072021484f, 0.14501953f, -0.3149414f, + 4.0183105f, 2.2834473f, 1.317627f, 1.2583008f, 1.5627441f, 0.9851074f, 0.12817383f, -0.2944336f, -0.65527344f, -0.9675293f, -1.3979492f, -1.5356445f, -1.5737305f, -1.5908203f, -1.6887207f, -1.8493652f, + 0.8132324f, 0.6748047f, 0.44433594f, 0.35375977f, 0.09863281f, 0.048095703f, -0.15063477f, -0.12646484f, -0.18432617f, -0.15258789f, -0.30517578f, -0.29101562f, -0.31201172f, -0.23876953f, -0.26635742f, -0.40551758f, + 0.29345703f, 2.6530762f, 3.4177246f, 2.5812988f, 2.1159668f, 1.3947754f, 0.9523926f, 0.41479492f, -0.15844727f, -0.9025879f, -1.5444336f, -1.9780273f, -2.2106934f, -2.2788086f, -2.3234863f, -2.4267578f, + 0.75805664f, 2.5563965f, 2.8410645f, 2.2597656f, 0.3876953f, -1.067627f, -1.425293f, -0.795166f, -0.6105957f, -0.66381836f, -0.9675293f, -1.0371094f, -0.88916016f, -0.5444336f, -0.19042969f, -0.6118164f, + 1.7177734f, 3.0668945f, 3.2519531f, 2.4799805f, 0.7363281f, -0.8156738f, -0.8125f, 0.1430664f, 0.34375f, -0.27563477f, -1.4462891f, -1.4350586f, -1.4143066f, -1.6706543f, -1.8481445f, -2.0212402f, + 2.756836f, 1.090332f, 0.61572266f, 0.1928711f, -0.34521484f, -0.47509766f, -0.36767578f, -0.0637207f, 0.14233398f, 0.19580078f, -0.16015625f, -0.43286133f, -0.6472168f, -0.5493164f, -0.80737305f, -1.1452637f, + 1.0544434f, 1.0671387f, 1.1149902f, 1.1230469f, 0.78637695f, 0.64282227f, 0.4868164f, 0.3413086f, 0.13769531f, -0.13085938f, -0.64990234f, -0.89453125f, -1.074707f, -1.114502f, -1.3056641f, -1.5842285f, + -1.8156738f, -1.3222656f, -1.4528809f, -1.8908691f, -1.8740234f, -1.1118164f, -1.1750488f, -0.5734863f, 0.16308594f, 1.5822754f, 2.0114746f, 1.8625488f, 1.6049805f, 1.5942383f, 1.5368652f, 0.8605957f, + 3.2451172f, 2.7807617f, 1.2692871f, 0.5222168f, 0.119384766f, -0.06616211f, -0.15722656f, -0.10424805f, -0.27197266f, -0.45263672f, -0.83618164f, -1.1611328f, -1.333252f, -1.2722168f, -1.2016602f, -1.0800781f, + 0.17333984f, 2.4299316f, 2.3254395f, 1.3701172f, 0.47509766f, 0.72216797f, 0.072753906f, -0.037597656f, -0.41845703f, -0.8137207f, -1.5649414f, -2.4125977f, -1.3486328f, -0.53027344f, -0.10546875f, -0.33740234f, + -2.5983887f, -1.9645996f, -0.5678711f, 0.48999023f, 0.86743164f, 0.62158203f, 1.189209f, 1.3269043f, 1.182373f, 1.0024414f, 0.54785156f, 0.25634766f, -0.12133789f, -0.44140625f, -0.7026367f, -1.0881348f, + 0.071777344f, -2.279541f, -2.057373f, -0.25512695f, 2.2199707f, 2.541748f, 0.8342285f, 0.7907715f, 0.5048828f, -0.1303711f, 0.2631836f, -0.37036133f, -0.5187988f, -0.42285156f, -0.66845703f, -0.52368164f, + 1.3261719f, 3.1193848f, 2.583496f, 0.6767578f, -0.022460938f, 0.5214844f, 0.6105957f, 1.0021973f, 0.66845703f, 0.8640137f, -0.37353516f, -2.0703125f, -2.3225098f, -2.136963f, -2.057129f, -2.3894043f, + 1.4580078f, 2.0153809f, 1.0583496f, -0.12792969f, -0.6064453f, -0.7011719f, -0.96118164f, -0.8588867f, -0.7414551f, -0.18896484f, 0.1550293f, 0.46166992f, 0.3881836f, 0.16113281f, -0.37109375f, -1.140625f, + 1.6044922f, 0.8898926f, -0.053222656f, -0.26611328f, 0.084228516f, 0.5666504f, 0.9013672f, 1.1362305f, 1.1520996f, 0.74243164f, 0.5168457f, 0.11206055f, -0.8305664f, -1.7199707f, -2.109375f, -2.7270508f, + -1.3208008f, -0.083984375f, -0.24169922f, -0.95043945f, -1.2331543f, -0.564209f, -0.018798828f, 0.95654297f, 1.142334f, 1.1772461f, 0.8063965f, 0.43359375f, 0.08227539f, 0.07446289f, 0.099853516f, -0.359375f, + 2.0480957f, 2.739746f, 2.1257324f, 1.1525879f, 0.7644043f, 0.5031738f, 0.2758789f, 0.19311523f, -0.08642578f, -0.15893555f, -0.89990234f, -1.2700195f, -1.5583496f, -1.791748f, -1.9023438f, -2.135254f, + 2.2700195f, 2.2856445f, 1.5393066f, 0.77563477f, 0.23632812f, -0.017578125f, -0.23071289f, -0.19995117f, -0.26342773f, -0.17700195f, -0.5046387f, -0.6687012f, -0.8383789f, -1.057373f, -1.3330078f, -1.8166504f, + 0.66015625f, 1.6772461f, 1.604248f, 1.5366211f, 1.1013184f, 0.8173828f, 0.5605469f, 0.7155762f, 0.5270996f, 0.23291016f, -0.37719727f, -0.8352051f, -1.3342285f, -1.7580566f, -2.2695312f, -2.8588867f, + 0.21484375f, -0.44580078f, -0.85253906f, -1.0334473f, -0.95043945f, -0.592041f, -0.47558594f, -0.20092773f, -0.06323242f, 0.16040039f, 0.24414062f, 0.5144043f, 0.70947266f, 0.8796387f, 0.9663086f, 0.92529297f, + -0.047851562f, 1.6748047f, 2.0949707f, 2.3344727f, 1.7766113f, 1.7685547f, 0.35913086f, 0.47509766f, -0.055664062f, -0.08251953f, -0.76049805f, -1.8425293f, -2.8457031f, -2.4018555f, -1.144043f, -1.3034668f, + 2.0942383f, 1.1809082f, 0.54345703f, 0.18408203f, -0.44360352f, -0.5373535f, 0.12182617f, 0.7114258f, 0.8088379f, 0.7709961f, -0.12866211f, -1.1555176f, -1.4138184f, -1.0009766f, -0.83081055f, -0.90478516f, + -1.0332031f, 1.6005859f, 0.46875f, 1.6149902f, -0.23095703f, 1.0908203f, 0.068359375f, 0.5266113f, 0.18701172f, -0.12792969f, -0.22509766f, -0.4819336f, -0.5058594f, -0.390625f, -1.2128906f, -1.3486328f, + 1.7792969f, 0.7167969f, -0.40039062f, -1.1201172f, -1.5458984f, -1.5344238f, -1.5107422f, -1.3601074f, -1.2751465f, -0.93847656f, -0.40795898f, 0.49145508f, 1.2475586f, 2.0236816f, 2.0373535f, 1.7973633f, + 2.8059082f, 2.769043f, 1.6977539f, 0.44458008f, -0.41308594f, -0.6376953f, -0.80566406f, -0.81030273f, -0.93115234f, -0.66845703f, -0.7155762f, -0.6870117f, -0.6052246f, -0.46142578f, -0.41967773f, -0.56225586f, + 1.9963379f, 2.9060059f, 1.5930176f, -0.34716797f, -0.7993164f, 0.061279297f, 1.0302734f, 1.1359863f, 0.7434082f, -0.07397461f, -1.3549805f, -1.2399902f, -1.2802734f, -1.2973633f, -1.4362793f, -1.6364746f, + -2.3041992f, -0.73999023f, 0.11791992f, 0.3215332f, 0.45092773f, 0.45751953f, 0.7368164f, 0.7216797f, 0.19238281f, 0.75439453f, 0.17822266f, -0.46679688f, -0.41210938f, 0.029785156f, 0.20996094f, -0.24829102f, + -0.9016113f, -1.2150879f, -0.13208008f, 0.7023926f, 0.81225586f, -0.57055664f, -1.0405273f, -0.5344238f, 0.1706543f, 0.579834f, 0.80810547f, 0.4790039f, 0.3671875f, 0.24829102f, 0.32202148f, -0.095214844f, + 1.4807129f, 1.8234863f, 1.7661133f, 2.5449219f, 2.6020508f, 1.9316406f, 1.3154297f, 1.1328125f, 0.5263672f, -0.17895508f, -1.1706543f, -2.199707f, -2.7531738f, -2.8725586f, -2.9294434f, -3.0187988f, + 2.6689453f, 0.5949707f, -0.45043945f, -0.7963867f, -0.91625977f, -0.90722656f, -0.98413086f, -0.8354492f, -0.6953125f, -0.3955078f, -0.2849121f, 0.04296875f, 0.43066406f, 0.7241211f, 0.81591797f, 0.9880371f, + -0.15112305f, -0.33618164f, -0.3256836f, -0.111083984f, -0.048339844f, 0.08129883f, 0.068115234f, 0.17138672f, 0.20385742f, 0.2590332f, 0.123291016f, 0.11621094f, 0.03100586f, 0.06201172f, 0.06591797f, -0.2097168f, + 1.2731934f, 0.29223633f, -0.14038086f, -0.29956055f, -0.6376953f, -0.56762695f, -0.15844727f, 0.46020508f, 0.6569824f, 0.68188477f, 0.28393555f, -0.18676758f, -0.43164062f, -0.3347168f, -0.38256836f, -0.5083008f, + 4.678711f, 2.80542f, 1.126709f, -0.48461914f, -0.8273926f, 0.7895508f, 2.3266602f, 0.4375f, -1.6252441f, -1.8422852f, -1.4978027f, -0.8730469f, -1.3171387f, -1.671875f, -1.0270996f, -0.998291f, + -1.3620605f, 0.63916016f, 1.1337891f, 0.3178711f, 0.06591797f, 1.0673828f, 0.91503906f, 0.4387207f, -0.18359375f, -0.22875977f, -0.6660156f, -0.69799805f, -0.17236328f, -0.21118164f, -0.24951172f, -0.8066406f, + -0.44873047f, 1.4709473f, 2.5039062f, 2.7050781f, 1.9462891f, 0.3642578f, -0.30078125f, 0.6467285f, 0.9680176f, 0.9716797f, -1.498291f, -1.8183594f, -1.8544922f, -1.847168f, -1.605957f, -2.2028809f, + 0.47460938f, 1.574707f, 1.7148438f, 2.1083984f, 1.7241211f, 0.44189453f, -0.40551758f, -0.18847656f, 0.13232422f, -0.0031738281f, -0.79467773f, -1.1843262f, -1.2902832f, -1.2416992f, -1.3430176f, -1.7194824f, + 1.9831543f, 3.927246f, 2.9868164f, 1.2749023f, 0.265625f, 0.02734375f, 0.079833984f, 0.47070312f, -0.7956543f, -1.2663574f, -1.638916f, -1.8222656f, -1.3908691f, -1.4194336f, -1.3027344f, -1.3791504f, + 0.2097168f, 1.8005371f, 1.479248f, 0.62109375f, 0.091552734f, -0.38549805f, -0.93530273f, -0.923584f, -0.91259766f, -0.6557617f, -0.5842285f, -0.27563477f, 0.007080078f, 0.25585938f, 0.25219727f, -0.044677734f, + 0.51293945f, 1.0280762f, 0.84033203f, 0.62841797f, 0.5317383f, 0.5251465f, 0.26953125f, 0.09423828f, 0.032958984f, -0.052734375f, -0.48999023f, -0.6513672f, -0.6411133f, -0.6369629f, -0.84375f, -1.1477051f, + -1.2319336f, -0.08203125f, -0.23632812f, -0.8339844f, -1.0866699f, -0.88793945f, -1.0917969f, -0.83251953f, -0.79467773f, -0.45751953f, -0.25830078f, 0.43041992f, 1.1853027f, 1.7946777f, 2.3452148f, 2.0378418f, + 4.881592f, 2.1987305f, 0.6430664f, -0.15478516f, -0.36206055f, -0.4753418f, -0.5410156f, -0.1965332f, -0.072753906f, -0.10888672f, -0.5263672f, -0.8588867f, -0.94506836f, -0.99487305f, -1.1523438f, -1.3347168f, + -0.5546875f, 2.1118164f, 2.2026367f, 0.70703125f, -0.21142578f, 0.8679199f, 1.1367188f, 1.012207f, 0.9904785f, 1.2463379f, 0.21801758f, -1.9433594f, -2.9155273f, -2.2661133f, -0.97631836f, -1.6257324f, + -0.80908203f, 1.0163574f, 1.546875f, 2.0847168f, 1.9309082f, 1.6364746f, 1.057373f, 1.1618652f, 0.76049805f, 0.29858398f, -0.46484375f, -1.0957031f, -1.6264648f, -2.0043945f, -2.5080566f, -2.9853516f, + -0.29760742f, -1.7080078f, -1.5229492f, 1.3574219f, 4.701172f, 1.6962891f, 4.1030273f, -0.4194336f, -1.0739746f, -1.0820312f, 0.4255371f, -1.0825195f, -1.3613281f, -1.1777344f, -1.3232422f, -1.2341309f, + 1.7912598f, 1.7314453f, 1.8457031f, 2.1989746f, 1.9145508f, 1.0024414f, 0.51538086f, 0.44506836f, -0.075683594f, -0.5439453f, -1.1616211f, -1.5820312f, -1.8642578f, -1.9123535f, -2.0385742f, -2.2666016f, + -0.03100586f, -1.7485352f, -1.767334f, -1.9833984f, -1.4570312f, -0.84716797f, -0.50390625f, 0.040771484f, 0.43554688f, 0.62402344f, 0.9133301f, 1.4772949f, 1.7192383f, 1.2922363f, 0.80029297f, 1.0356445f, + -1.1809082f, -2.032959f, -2.0617676f, -1.9443359f, -1.6447754f, -0.8874512f, 3.0722656f, 2.6242676f, 2.3166504f, 3.4455566f, 1.090332f, -0.19970703f, -0.23510742f, -0.6906738f, -0.40576172f, -1.2653809f, + -2.2512207f, -1.9179688f, -2.1035156f, -2.3461914f, -2.14917f, -1.1347656f, -0.56689453f, 0.8166504f, 1.857666f, 2.114502f, 1.755127f, 1.9160156f, 1.6611328f, 1.1904297f, 0.8239746f, 0.33398438f, + 0.8227539f, 2.0544434f, 2.3171387f, 0.90234375f, 0.515625f, 1.0241699f, 0.6188965f, 0.296875f, -0.171875f, -0.6345215f, -1.2004395f, -1.1652832f, -1.1635742f, -1.2021484f, -1.3903809f, -1.6240234f, + 1.2287598f, 1.5820312f, 1.2756348f, 0.6843262f, 0.33911133f, 0.09472656f, -0.26733398f, -0.4711914f, -0.3137207f, -0.19116211f, -0.56884766f, -0.67944336f, -0.5612793f, -0.55444336f, -0.69506836f, -0.90234375f, + 1.5776367f, 2.6791992f, 2.3059082f, 1.375f, 0.7619629f, 0.08251953f, -0.6166992f, -0.8574219f, -1.0148926f, -1.0390625f, -1.0976562f, -0.8730469f, -0.7844238f, -0.7331543f, -0.7426758f, -1.0231934f, + -2.173584f, -1.3400879f, -0.8208008f, -0.95996094f, -0.6999512f, -0.010253906f, -0.19384766f, 0.25561523f, 0.3786621f, 0.72998047f, 0.4699707f, 0.4416504f, 0.49975586f, 0.9416504f, 1.4606934f, 1.0205078f, + -0.2631836f, 1.3510742f, 1.3837891f, 2.0864258f, 1.8503418f, 1.8864746f, 0.8581543f, 0.5866699f, 0.103759766f, -0.9616699f, -1.8740234f, -2.5600586f, -1.1362305f, -0.9301758f, -1.4404297f, -0.94091797f, + 2.7443848f, 0.5695801f, -0.21679688f, -0.6513672f, -0.14672852f, 0.5019531f, 0.23754883f, -0.19091797f, -0.27685547f, -0.15332031f, -0.31201172f, -0.35742188f, -0.2529297f, -0.25024414f, -0.62646484f, -0.61816406f, + 0.045898438f, 0.24243164f, 0.36865234f, 0.9145508f, 0.96777344f, 1.0041504f, 0.9550781f, 0.9213867f, 0.7089844f, 0.4296875f, -0.1328125f, -0.5522461f, -0.9333496f, -1.2285156f, -1.607666f, -2.1037598f, + 4.209961f, 1.2607422f, -0.85791016f, -1.416748f, -1.4013672f, -0.8574219f, -1.0410156f, -1.4523926f, -1.7346191f, -1.7731934f, -1.5373535f, -1.026123f, 0.8515625f, 0.21533203f, 2.2263184f, 4.3342285f, + 4.5341797f, 4.130371f, 2.7658691f, 2.1801758f, 0.90478516f, 0.5617676f, -0.1303711f, -1.1745605f, -1.5371094f, -1.5292969f, -1.6901855f, -1.7126465f, -1.7119141f, -1.7536621f, -1.8623047f, -1.9750977f, + 0.6777344f, 2.2624512f, 1.1889648f, -0.5876465f, -0.81347656f, 0.38916016f, 0.11694336f, 0.15283203f, -0.5698242f, -0.5168457f, -0.41845703f, -0.3544922f, -0.46191406f, -0.24804688f, -0.14038086f, -0.6772461f, + -1.3227539f, -0.38085938f, 0.23852539f, 0.76123047f, 1.0078125f, 1.1433105f, 0.9753418f, 0.7734375f, 0.32373047f, 0.08959961f, -0.19482422f, -0.43603516f, -0.5715332f, -0.6135254f, -0.7351074f, -1.0581055f, + -1.3225098f, -1.4675293f, -1.3000488f, -0.59375f, 0.022705078f, 0.57299805f, 0.5710449f, 0.36547852f, 0.5119629f, 0.77685547f, 0.623291f, 0.43408203f, 0.41210938f, 0.5258789f, 0.2434082f, -0.37597656f, + 2.3742676f, 3.3117676f, 3.0449219f, 2.4208984f, 1.2329102f, 0.63793945f, 0.32666016f, 0.15161133f, -0.25610352f, -1.0283203f, -1.7250977f, -1.9707031f, -2.0761719f, -2.1174316f, -2.1105957f, -2.2165527f, + 0.87109375f, 0.5085449f, 0.19018555f, -0.10913086f, -0.36328125f, -0.3725586f, -0.4946289f, -0.38671875f, -0.38183594f, -0.21801758f, -0.2331543f, -0.088378906f, 0.0234375f, 0.24194336f, 0.40649414f, 0.40600586f, + 1.0517578f, 0.5126953f, 0.23608398f, 0.31835938f, 0.3605957f, 0.39941406f, 0.38012695f, 0.50390625f, 0.54541016f, 0.37329102f, -0.24731445f, -0.5891113f, -0.6791992f, -0.7324219f, -1.0258789f, -1.407959f, + -0.66625977f, 1.7709961f, 1.2971191f, 0.15283203f, -1.0664062f, -0.7583008f, 0.16821289f, 0.5007324f, 0.35058594f, 0.14086914f, 0.5217285f, -0.13452148f, -1.2158203f, -0.34375f, 0.033447266f, -0.751709f, + 3.684082f, 3.3139648f, 2.0878906f, 1.1911621f, 0.607666f, 0.1472168f, 0.15258789f, 0.10083008f, -0.2355957f, -0.45239258f, -1.2746582f, -1.7348633f, -1.8305664f, -1.8266602f, -1.8925781f, -2.03833f, + 0.5786133f, 0.7692871f, 0.4777832f, 0.05493164f, -0.12597656f, -0.08227539f, -0.095703125f, 0.05444336f, 0.19848633f, 0.3190918f, 0.030273438f, -0.06738281f, -0.17138672f, -0.2854004f, -0.59375f, -1.0615234f, + -0.98413086f, 1.059082f, 2.3671875f, 2.3381348f, 2.529541f, 2.1052246f, 1.887207f, 1.2434082f, 0.54956055f, -0.12646484f, -0.9199219f, -1.6921387f, -2.3168945f, -2.5715332f, -2.6733398f, -2.7949219f, + 2.5153809f, 3.854248f, 2.8759766f, 1.9558105f, -0.30126953f, -1.3845215f, -1.4958496f, -1.2636719f, -1.1201172f, -0.84887695f, -1.1677246f, -0.63061523f, -0.4970703f, -0.76904297f, -0.72998047f, -0.9926758f, + 0.4025879f, 2.572998f, 3.1643066f, 2.5009766f, 1.3688965f, -0.08691406f, -0.63500977f, -0.119140625f, 0.0073242188f, -0.5070801f, -0.7023926f, -2.0339355f, -2.0788574f, -1.8864746f, -0.9301758f, -1.0368652f, + 2.1965332f, 1.2878418f, 0.50878906f, -0.119140625f, -0.49267578f, -0.6008301f, -0.75219727f, -0.56518555f, -0.5427246f, -0.4038086f, -0.43408203f, -0.28198242f, -0.13745117f, 0.06958008f, 0.14331055f, 0.1237793f, + 0.5012207f, 2.1748047f, 1.7189941f, 0.1274414f, -0.2644043f, 0.46875f, 0.37963867f, 0.7302246f, 0.23413086f, 0.41845703f, -0.7944336f, -0.8984375f, -0.6816406f, -1.0744629f, -1.190918f, -1.8496094f, + -2.3083496f, -2.19458f, -2.2111816f, -2.4804688f, -2.3293457f, -1.651123f, -1.3820801f, -0.78125f, -0.14477539f, 0.8547363f, 1.6848145f, 2.4699707f, 2.5429688f, 2.793457f, 2.9118652f, 2.2253418f, + 1.7553711f, 2.8996582f, 1.9260254f, 0.40551758f, -0.0234375f, 0.44506836f, 0.31152344f, 0.1809082f, -0.47607422f, -0.4807129f, -1.204834f, -1.3293457f, -1.2412109f, -1.0134277f, -0.89501953f, -1.2602539f, + 0.2253418f, 2.2539062f, 2.265625f, 0.57128906f, -0.7661133f, -0.6245117f, 0.21313477f, 1.2248535f, 0.8737793f, -0.12524414f, -0.9609375f, -2.416504f, -1.1223145f, -0.70532227f, -0.31469727f, -0.592041f, }; const float ivas_sns_cdbk_tcx20_stage2[ 64 * 16 ] = { - -0.14487037f, 0.32346300f, 0.29798679f, -0.52393127f, -0.25671033f, 0.85717754f, -0.09030235f, -0.41110330f, -0.32938564f, -0.36580017f, -0.13142117f, -0.06404494f, 0.10671000f, 0.18731030f, 0.26606878f, 0.27885301f, - 0.52707061f, 0.35016312f, 0.54090507f, 0.82023896f, 0.46675870f, -0.60012182f, -0.76783382f, -0.39198749f, -0.17916696f, -0.17307722f, -0.10507731f, -0.09327542f, -0.12176361f, -0.12715624f, -0.11980175f, -0.02587481f, - -0.71420988f, -0.65927011f, -0.35007906f, -0.01478187f, 0.15375095f, 0.11149616f, 0.08819131f, 0.11537168f, 0.18041243f, 0.28846009f, 0.61920238f, 0.78709602f, 0.49945852f, -0.03863360f, -0.42339912f, -0.64306599f, - -0.81717379f, 0.06122156f, 0.05823003f, 0.10166328f, 0.27940347f, 0.24198679f, 0.13036228f, 0.07594383f, 0.21865219f, 0.19571948f, 0.11860502f, 0.04836758f, -0.03211315f, -0.14926357f, -0.23274285f, -0.29886216f, - -0.68529960f, -0.60305257f, -0.55080408f, -0.31252031f, 0.02732556f, 0.58303818f, 0.67638004f, 0.45008305f, 0.44400610f, 0.24064307f, 0.01598330f, -0.02342002f, -0.05864021f, -0.08903495f, -0.06326312f, -0.05142446f, - 0.89939472f, 0.31232066f, -0.27153630f, -0.52911639f, -0.58173141f, -0.63610440f, -0.61689761f, -0.43424024f, -0.23705022f, -0.00031150f, 0.15363335f, 0.19705513f, 0.25413198f, 0.35648787f, 0.53897823f, 0.59498626f, - 0.29798691f, 0.08114488f, 0.25286730f, -0.14155021f, -0.55163298f, -0.91534601f, -0.57551866f, 0.56064647f, 0.80731933f, -0.19474923f, -0.20126966f, 0.06517040f, 0.06866947f, 0.09059095f, 0.13444783f, 0.22122305f, - -0.19554741f, -1.08027678f, -0.01182563f, 0.56474090f, 0.41996725f, 0.08237738f, 0.08022205f, 0.10168343f, 0.06794579f, -0.08037661f, -0.20594204f, -0.13493371f, -0.05614077f, 0.03317273f, 0.14216415f, 0.27276933f, - -0.23050462f, -0.75246507f, -0.69868854f, -0.48346371f, -0.40917848f, -0.36594095f, -0.07600729f, 0.12198463f, 0.35806061f, 0.42664099f, 0.36253664f, 0.28721164f, 0.28501428f, 0.31580309f, 0.39290382f, 0.46609294f, - -0.67820482f, -0.00872112f, 0.40025028f, 0.70327670f, 0.42493234f, -0.57698003f, -0.97061329f, -0.62910745f, -0.24969320f, -0.09521511f, 0.04433478f, 0.16549806f, 0.17050527f, 0.26401941f, 0.52200672f, 0.51371134f, - 1.15515222f, -0.29885937f, -0.45759359f, -0.16519237f, -0.04117621f, -0.07252194f, -0.02430911f, -0.04766781f, -0.02328497f, -0.05048145f, -0.05153410f, -0.06528098f, -0.04522347f, -0.01163017f, 0.03517569f, 0.16442759f, - 1.26308471f, 0.47631737f, 0.20702857f, 0.04885555f, 0.01820924f, -0.04929548f, -0.00848071f, -0.02414509f, -0.04549576f, -0.16589601f, -0.22069993f, -0.30533811f, -0.30611208f, -0.31300078f, -0.32636395f, -0.24866742f, - -0.64451248f, -0.26649107f, 0.11640199f, 0.09050698f, -0.25875099f, -0.58989672f, -0.18201608f, 0.56293201f, 0.69520096f, 0.55973258f, 0.03137457f, -0.53909145f, -0.42689946f, 0.14106379f, 0.40632407f, 0.30412130f, - 0.15140746f, 0.14125954f, -0.08456824f, -0.13219101f, 0.06042009f, 0.33575532f, 0.35779441f, 0.19239547f, -0.11511443f, -0.41291307f, -0.06796502f, 0.62883409f, 0.54647417f, -0.03056743f, -0.64102233f, -0.92999908f, - -0.20214866f, 0.33358969f, 0.69126333f, 0.34454972f, 0.05105591f, 0.16949466f, 0.15791728f, -0.06633089f, -0.02155995f, 0.20242418f, 0.31712646f, 0.04823767f, -0.30694375f, -0.55917643f, -0.61612875f, -0.54337052f, - 0.11822897f, -0.04039421f, 0.70914148f, 0.55687588f, 0.06691609f, -0.01671241f, 0.38831368f, 0.48498674f, 0.23982281f, -0.11333950f, -0.44950589f, -0.59143612f, -0.55439378f, -0.42178388f, -0.28206333f, -0.09465644f, - -0.14336086f, 0.05638831f, -0.01441642f, -0.42382782f, -0.38698654f, 0.24817171f, 0.77752198f, 0.25906019f, -0.48986881f, -0.97798705f, -0.62796677f, 0.10790457f, 0.39301453f, 0.49075265f, 0.45648021f, 0.27511976f, - 0.57860103f, -0.01948333f, -0.01550826f, 0.52219942f, 0.68939814f, 0.35139876f, -0.01666617f, -0.21673535f, -0.47658403f, -0.68042929f, -0.65034996f, -0.34910948f, -0.19976833f, -0.03318456f, 0.13815711f, 0.37806438f, - 0.37246276f, -0.08878862f, -0.58662283f, -0.58539914f, -0.25552364f, 0.03268078f, 0.23525090f, 0.52779846f, 0.89804404f, 0.85582758f, 0.41881201f, -0.00512611f, -0.24135956f, -0.44973199f, -0.57601809f, -0.55230687f, - -0.32189259f, -0.20721675f, -0.09742343f, -0.05501794f, -0.02597120f, -0.10341441f, -0.07152803f, 0.00321003f, 0.14348106f, 0.13459909f, 0.13417173f, 0.08360042f, 0.09862647f, 0.09372765f, 0.07551569f, 0.11553216f, - 0.23782332f, 0.49257946f, 0.16314649f, -0.21082378f, -0.15908458f, 0.19948076f, 0.80829724f, 0.74048420f, 0.31470714f, -0.11736674f, -0.41702302f, -0.38958905f, -0.30642209f, -0.41287171f, -0.48993898f, -0.45339847f, - -0.64636094f, -0.04385833f, 0.14399510f, -0.43842603f, -0.73607781f, -0.26594508f, 0.62882301f, 0.35001150f, 0.28828962f, 0.02070640f, 0.04274640f, 0.10066767f, 0.01277906f, 0.02855391f, 0.23224313f, 0.28185233f, - 0.47046627f, 0.94887935f, 0.24713839f, -0.23737461f, -0.23876072f, -0.07439994f, -0.09495447f, -0.13384673f, -0.10919962f, 0.11561096f, 0.34750397f, 0.22863541f, -0.07880257f, -0.39830725f, -0.49574485f, -0.49684374f, - -0.40909559f, -0.18655327f, 0.13106838f, 0.38799987f, 0.49861722f, 0.83281701f, 0.69114756f, 0.20069371f, -0.12792677f, -0.35587040f, -0.42614275f, -0.34440943f, -0.28876141f, -0.27425834f, -0.22103645f, -0.10828931f, - -1.18999475f, -0.19958884f, -0.14983643f, 0.01470880f, -0.02795637f, -0.14641321f, -0.31784893f, -0.46245588f, -0.18208072f, 0.19701783f, 0.59261157f, 0.51921614f, 0.35016513f, 0.38054069f, 0.38692917f, 0.23498570f, - 0.09958109f, -0.26177154f, -0.09010091f, 0.31898761f, 0.75461690f, 0.12276914f, -0.81281416f, -0.78184322f, -0.24358470f, 0.82758568f, 0.36579631f, -0.14176577f, -0.08975069f, -0.12652615f, 0.12350150f, -0.06468093f, - 0.08899403f, -0.19355344f, -0.19424186f, -0.07670148f, -0.01129831f, -0.12185644f, -0.22497393f, -0.43014230f, -0.38336267f, -0.26093033f, -0.06975312f, 0.14762185f, 0.34014822f, 0.41134546f, 0.45027987f, 0.52842445f, - 0.21499436f, 0.50168679f, 0.45504898f, 0.25411634f, -0.47901658f, -0.45717782f, -0.14093183f, 0.17265389f, 0.11115764f, -0.41915721f, -0.31922857f, 0.22345448f, 0.48226916f, 0.07143490f, -0.26830399f, -0.40300051f, - 0.12687524f, 0.05171471f, -0.07690770f, 0.26252085f, 0.27712144f, 0.23952572f, 0.03309903f, 0.01500629f, 0.06484326f, 0.06571283f, -0.16817282f, -0.63246792f, -0.98935090f, -0.44804742f, 0.39837118f, 0.78015619f, - -0.27518648f, -0.48420415f, -0.24141667f, 0.57134912f, 0.65714603f, 0.42293616f, -0.10408493f, -0.38791089f, -0.61076554f, -0.57292363f, -0.09457207f, 0.54285737f, 0.61562883f, 0.23132651f, -0.13569709f, -0.13448269f, - -0.44830103f, 0.90540056f, 0.00072142f, -0.39226111f, -0.46186317f, -0.43645456f, -0.37826714f, -0.24360826f, -0.04123674f, 0.14260549f, 0.22801709f, 0.22668095f, 0.21516528f, 0.17002730f, 0.24853909f, 0.26483493f, - 0.82582984f, -0.18396730f, -0.69977925f, -0.51672827f, 0.33935958f, 1.15275754f, 0.74107352f, 0.01951258f, -0.25558033f, -0.43304939f, -0.34099848f, -0.20947442f, -0.14398117f, -0.10182217f, -0.18238069f, -0.01077166f, - -0.05956926f, -0.06776164f, 0.03443600f, -0.24779379f, -0.39446507f, 0.19355305f, 0.85153169f, -0.02976018f, -0.70253585f, 0.23290277f, 0.42513902f, -0.02301892f, -0.00892405f, -0.00056059f, -0.02586520f, -0.17730813f, - -0.10475355f, -0.12240226f, 0.23596905f, 0.84034179f, 1.10352903f, -0.04380181f, -0.55005573f, -0.07517667f, 0.38548284f, 0.23177362f, -0.44010180f, -0.37858708f, -0.16160512f, -0.18482124f, -0.37409253f, -0.36169852f, - -0.66969186f, 0.05371874f, -0.03936352f, -0.29928720f, -0.41624260f, -0.41299981f, -0.08577629f, 0.31675281f, 0.52331795f, 0.62411866f, 0.60734652f, 0.31853824f, 0.22382100f, -0.00426635f, -0.24809569f, -0.49189053f, - 0.42558925f, -0.08740923f, -0.12413315f, 0.07160194f, 0.21621681f, 0.18737853f, 0.20692231f, 0.06594840f, 0.06316038f, -0.01455973f, -0.09736051f, -0.19278266f, -0.20576965f, -0.20479396f, -0.19511934f, -0.11488934f, - 0.36293062f, -0.57831316f, -0.52476107f, -0.18291608f, 0.05956296f, 0.17827873f, 0.56052629f, 0.90619512f, 0.33375509f, -0.31016948f, -0.35518802f, -0.18057272f, -0.07051228f, -0.11858827f, -0.10671145f, 0.02648366f, - -0.47233802f, -0.10696118f, -0.17385597f, -0.31283671f, -0.54242892f, -0.48720345f, -0.41705631f, -0.17742297f, 0.04283104f, -0.05195671f, -0.10468624f, -0.03852503f, 0.06812391f, 0.59475499f, 1.17499043f, 1.00457125f, - 0.33658160f, 0.35011487f, 0.45187233f, -0.02492518f, -0.55350758f, -0.59303580f, -0.31109052f, 0.13779098f, 0.55888251f, 0.84708841f, 0.47270673f, -0.43127783f, -0.54032183f, -0.34904867f, -0.17752966f, -0.17430036f, - 0.44845114f, -0.49717161f, -0.47780018f, 0.51116217f, 0.25239415f, -0.46774617f, -0.37660723f, -0.11699702f, 0.09542037f, -0.01250943f, 0.20050057f, 0.40176439f, 0.32380431f, 0.15297561f, -0.14232876f, -0.29531216f, - 0.58997624f, 0.33423174f, -0.49272429f, -0.77991590f, -0.63691990f, -0.16375248f, 0.20892044f, 0.18843065f, 0.17599488f, 0.14061586f, 0.15322675f, 0.18367503f, 0.13457790f, 0.01264192f, -0.03498125f, -0.01399761f, - 0.11883889f, -0.17653462f, -0.07102121f, -0.16170325f, -0.31396815f, -0.45007863f, -0.66549732f, -0.56194237f, -0.04368741f, 0.74826150f, 1.05944395f, 0.45896665f, 0.13555009f, 0.05510292f, 0.02009383f, -0.15182464f, - 0.07240272f, -0.58533213f, -0.60637060f, -0.30890106f, -0.02128210f, 0.09681284f, 0.16938452f, 0.09862013f, 0.19046479f, 0.19100352f, 0.26416808f, 0.26993362f, 0.23648423f, 0.09763257f, -0.04637479f, -0.11864633f, - 1.00841842f, 0.48487093f, -0.06341281f, -0.08270476f, 0.05744570f, 0.01750478f, -0.34725114f, -0.56805040f, -0.46574885f, -0.30005483f, -0.09520550f, 0.06924440f, 0.18895007f, 0.12019539f, -0.01497133f, -0.00923003f, - -0.11951983f, -0.09981565f, -0.02725746f, -0.30082482f, 0.20230754f, 0.13666509f, -0.43246623f, 0.35244293f, 0.18119722f, 1.02992782f, -0.88125774f, 0.02331986f, 0.31122766f, -0.27229286f, 0.03194423f, -0.13559793f, - 0.30038871f, 0.08947897f, -0.39317595f, -0.46247446f, -0.42411556f, -0.42404287f, -0.31600225f, -0.23970776f, -0.22563637f, -0.14999339f, 0.24040805f, 0.88216954f, 0.90562440f, 0.49896646f, -0.00532430f, -0.27656328f, - -1.03852817f, -0.43685628f, 0.97570249f, 0.40073542f, -0.16567993f, -0.21536660f, 0.12504130f, 0.05185039f, 0.10097880f, 0.11493671f, 0.11604106f, 0.09278894f, 0.06924125f, -0.04393053f, -0.08352009f, -0.06343456f, - 0.63612744f, 0.65518210f, 0.45922163f, 0.32046049f, 0.42927283f, 0.43905062f, 0.21015594f, -0.14220340f, -0.37678678f, -0.46507109f, -0.45569496f, -0.37686899f, -0.32849396f, -0.33044372f, -0.35635326f, -0.31755504f, - 0.41636915f, 0.62005731f, 0.06636205f, -0.59228655f, 0.33311937f, 0.75787668f, 0.00941011f, -0.45161756f, -0.65103077f, -1.10958672f, -1.02188609f, -0.67703448f, 0.33622739f, 1.61684726f, 0.14432118f, 0.20285196f, - -0.54161629f, 0.29651460f, 0.48390239f, 0.54479388f, 0.45539891f, 0.27213590f, -0.06343843f, -0.24873747f, -0.31972562f, -0.38332671f, -0.30589718f, -0.21560606f, -0.11351916f, -0.04853252f, 0.04142231f, 0.14623145f, - -0.21538006f, -0.50670918f, -0.02385513f, 0.35315677f, 0.10824776f, 0.03860134f, 0.48712274f, 0.49283326f, 0.39503514f, 0.30292369f, 0.35920722f, 0.11075640f, -0.28306221f, -0.52442456f, -0.56662428f, -0.52782887f, - 0.24246654f, 0.15496835f, 0.07742345f, -0.00816546f, -0.02214009f, -0.12207666f, -0.09321134f, -0.14020839f, -0.02096415f, 0.02403039f, -0.00227972f, -0.07257466f, -0.06385085f, -0.03120190f, -0.01017645f, 0.08796095f, - 0.55718201f, 0.39817200f, 0.01585643f, -0.42726280f, -0.49946467f, -0.23926890f, 0.12647764f, 0.16539668f, -0.09322228f, -0.28903514f, -0.36248464f, -0.37621498f, -0.21830881f, 0.12546719f, 0.47757747f, 0.63913280f, - 0.07202509f, -0.30917825f, 0.26796130f, 0.18122649f, -0.74238320f, -0.65070972f, 0.20487278f, -0.03910861f, -0.13788223f, -0.13927704f, 0.30951126f, 0.22564689f, 0.18217460f, 0.23128586f, 0.20552209f, 0.13831273f, - 0.81154454f, 0.16848402f, -0.17973760f, -0.10712113f, -0.08562767f, -0.33154566f, -0.24733460f, -0.19259111f, 0.09705231f, 0.36926093f, 0.39058223f, 0.34681425f, 0.16685070f, -0.13716590f, -0.45775544f, -0.61170978f, - -1.33280729f, -0.16122649f, -0.09275794f, 0.58345947f, 0.61239977f, 0.50766167f, 0.06032890f, 0.13414746f, 0.18885722f, 0.13865434f, 0.23772269f, -0.25267260f, -0.54709895f, -0.31230173f, 0.07737009f, 0.15826345f, - -1.08561454f, -0.71787872f, -0.33522393f, 0.09636394f, 0.26521236f, 0.37639836f, 0.31311513f, 0.09537412f, -0.07885832f, -0.23990515f, -0.16502660f, 0.10895014f, 0.26463981f, 0.29732376f, 0.35578048f, 0.44934924f, - -0.29274363f, 0.08361693f, 0.01766194f, -0.22807328f, -0.16950675f, 0.28608384f, 0.00299181f, 0.07025513f, -0.20633117f, 0.48438844f, 0.91263549f, 0.04231580f, -0.66916627f, -0.44689801f, 0.06041835f, 0.05235140f, - 0.18067823f, -0.43833102f, -0.91255750f, -0.38799121f, 0.28155095f, 0.40506215f, 0.07352559f, -0.10582149f, -0.13688260f, -0.20626464f, -0.13280234f, -0.02533342f, 0.03247104f, 0.20876704f, 0.46466759f, 0.69926172f, - 0.51511088f, 0.81421556f, 0.82445640f, 0.01131859f, -0.32041051f, -0.39839079f, -0.43152495f, -0.42594915f, -0.41684800f, -0.38010709f, -0.25091606f, -0.15334343f, -0.03594408f, 0.06862608f, 0.21814936f, 0.36155722f, - -0.74835512f, -0.03907167f, -0.02730968f, 0.01017743f, 0.06598847f, 0.36210429f, 0.29611340f, 0.34006521f, 0.09628113f, -0.15142368f, -0.62878543f, -0.79996695f, -0.45331571f, 0.20593004f, 0.80186308f, 0.66970511f, - -0.25432502f, 0.38418428f, 0.43145928f, 0.30498956f, 0.19189249f, -0.25021553f, -0.53882666f, -0.61584834f, -0.43654724f, -0.03402395f, 0.45760398f, 0.60327277f, 0.53610474f, 0.16098234f, -0.30297334f, -0.63772932f, - -0.42321919f, 0.85086362f, 0.60159420f, 0.08633772f, -0.28445894f, -0.22512885f, 0.23909004f, 0.20046697f, 0.01484137f, -0.11652413f, -0.12017169f, -0.26922922f, -0.26311675f, -0.18921524f, -0.06712212f, -0.03500777f, - 0.58209071f, -0.26533411f, -0.20240535f, 0.27577532f, 0.65478295f, 0.66491349f, 0.41026256f, 0.22123940f, 0.15813271f, 0.07048989f, -0.03133192f, -0.19389440f, -0.34519672f, -0.53017394f, -0.73238212f, -0.73696843f + -1.1569824f, -0.4765625f, 0.008056641f, 0.47802734f, 0.38330078f, -0.075683594f, -0.3737793f, -0.29516602f, -0.1352539f, 0.012939453f, 0.22241211f, 0.375f, 0.31689453f, 0.20874023f, 0.2541504f, 0.25439453f, + -0.40600586f, -0.22070312f, -0.04272461f, 0.15893555f, -0.25195312f, -0.6623535f, -0.27172852f, 0.28735352f, 0.35742188f, 0.20166016f, 0.052246094f, -0.3647461f, -0.4506836f, 0.1862793f, 0.66796875f, 0.7585449f, + 0.02734375f, -0.2097168f, -0.39819336f, -0.54296875f, -0.46850586f, -0.25146484f, -0.26953125f, -0.07495117f, 0.375f, 0.9343262f, 0.91625977f, 0.4267578f, 0.026123047f, -0.15576172f, -0.11425781f, -0.22021484f, + 0.011230469f, 0.37573242f, 0.8432617f, 0.7006836f, 0.5830078f, -0.49658203f, -0.84155273f, -0.46069336f, -0.16894531f, -0.006591797f, -0.075683594f, -0.2253418f, -0.2097168f, -0.12719727f, 0.006591797f, 0.092041016f, + 0.42382812f, 0.19360352f, 0.076171875f, 0.44091797f, 0.11401367f, -0.39819336f, -0.12207031f, 0.34960938f, 0.51660156f, -0.024902344f, -0.5324707f, -0.068359375f, 0.5083008f, -0.06591797f, -0.68359375f, -0.7277832f, + -0.12182617f, 0.15332031f, 0.3022461f, 0.23754883f, 0.2722168f, 0.8046875f, 0.76831055f, 0.28808594f, -0.05493164f, -0.29711914f, -0.45629883f, -0.42944336f, -0.42871094f, -0.4416504f, -0.35107422f, -0.24536133f, + -0.19873047f, -0.010253906f, -0.030517578f, -0.041748047f, 0.052490234f, 0.07446289f, 0.026123047f, -0.026611328f, 0.18579102f, 0.22485352f, 0.1965332f, 0.1538086f, 0.044677734f, -0.111328125f, -0.24853516f, -0.29052734f, + 0.7648926f, 0.47973633f, 0.31347656f, 0.1496582f, 0.23242188f, 0.16918945f, 0.05859375f, -0.12548828f, -0.18017578f, -0.19555664f, -0.17138672f, -0.19165039f, -0.23510742f, -0.3330078f, -0.37939453f, -0.3564453f, + -0.6201172f, -0.2915039f, -0.15234375f, 0.15966797f, 0.41430664f, 0.61206055f, 0.4453125f, 0.19360352f, -0.107666016f, -0.40429688f, -0.10424805f, 0.40649414f, 0.37817383f, -0.012939453f, -0.3857422f, -0.53100586f, + -0.6376953f, -0.01953125f, 0.32958984f, -0.27905273f, -0.21191406f, 0.8327637f, 0.28515625f, -0.31225586f, -0.4375f, -0.34204102f, -0.010498047f, 0.0546875f, 0.099365234f, 0.114746094f, 0.22973633f, 0.30444336f, + -0.76538086f, -0.5390625f, -0.38330078f, -0.39501953f, -0.21923828f, 0.19311523f, 0.1899414f, -0.08642578f, -0.044921875f, 0.13500977f, 0.4543457f, 0.6777344f, 0.5891113f, 0.30078125f, 0.04321289f, -0.14990234f, + 0.34838867f, -0.21826172f, 0.018066406f, 0.06689453f, 0.40063477f, 0.34570312f, -0.548584f, -0.86035156f, -0.24023438f, 0.60668945f, 0.22363281f, -0.05053711f, 0.13916016f, 0.02709961f, -0.07470703f, -0.18383789f, + 0.13842773f, 0.05444336f, 0.20629883f, -0.11450195f, -0.77563477f, -0.57543945f, 0.7011719f, 0.20117188f, -0.33984375f, 0.18481445f, 0.38232422f, -0.2097168f, -0.040771484f, 0.13476562f, 0.0769043f, -0.024658203f, + -0.24829102f, -0.47998047f, -0.7248535f, -0.64575195f, -0.2529297f, 0.43725586f, 0.6335449f, 0.6464844f, 0.53930664f, 0.33398438f, 0.13891602f, 0.30639648f, 0.3293457f, -0.07446289f, -0.3918457f, -0.54711914f, + -0.043945312f, -0.5168457f, -0.3779297f, 0.67089844f, 0.2548828f, -0.4663086f, -0.5402832f, -0.22338867f, 0.092285156f, 0.016845703f, 0.24780273f, 0.46850586f, 0.49902344f, 0.2734375f, -0.0925293f, -0.26245117f, + 0.014892578f, 0.3540039f, 0.35229492f, -0.13085938f, -0.49829102f, -0.52563477f, -0.05883789f, 0.024658203f, -0.29492188f, -0.4638672f, -0.17333984f, 0.3791504f, 0.47314453f, 0.29516602f, 0.19165039f, 0.060791016f, + -0.21264648f, -0.875f, -0.82958984f, -0.5048828f, -0.31835938f, -0.1430664f, 0.19580078f, 0.29174805f, 0.28637695f, 0.15356445f, 0.16894531f, 0.2241211f, 0.27734375f, 0.31835938f, 0.4091797f, 0.55810547f, + -1.2670898f, 0.016845703f, 0.36254883f, 0.65893555f, 0.59814453f, 0.49389648f, 0.18041992f, 0.1821289f, 0.15942383f, -0.016357422f, -0.18847656f, -0.36547852f, -0.3413086f, -0.2553711f, -0.14868164f, -0.06958008f, + 0.10644531f, 0.7878418f, 0.09643555f, -0.5786133f, -0.40966797f, 0.07055664f, 0.39819336f, 0.31030273f, 0.10986328f, 0.14013672f, 0.2680664f, 0.32861328f, 0.04296875f, -0.39648438f, -0.6052246f, -0.66967773f, + -0.49658203f, 0.26416016f, 0.657959f, 0.41137695f, 0.28881836f, 0.22338867f, 0.15527344f, -0.08325195f, -0.118652344f, 0.08544922f, 0.2841797f, 0.15258789f, -0.18554688f, -0.48388672f, -0.5810547f, -0.5734863f, + 0.22314453f, 0.37402344f, 0.2163086f, -0.5078125f, -0.95703125f, -1.1442871f, -0.35302734f, 0.68359375f, 0.67089844f, 0.31811523f, 0.12792969f, -0.15478516f, -0.0026855469f, 0.18237305f, 0.16870117f, 0.15429688f, + 0.26464844f, -0.11401367f, -0.106933594f, 0.26538086f, 0.51660156f, 0.5373535f, 0.35888672f, 0.16870117f, 0.20825195f, 0.2409668f, 0.14013672f, -0.0546875f, -0.3334961f, -0.58691406f, -0.74243164f, -0.7624512f, + 0.73779297f, -0.14477539f, -0.37646484f, -0.1003418f, 0.1027832f, 0.14160156f, 0.06738281f, -0.05444336f, -0.016357422f, -0.0234375f, -0.022216797f, -0.049316406f, -0.061035156f, -0.10864258f, -0.09057617f, -0.0017089844f, + 1.0466309f, 0.6826172f, 0.1315918f, -0.21020508f, -0.104003906f, -0.21191406f, -0.3256836f, -0.4729004f, -0.59765625f, -0.50805664f, -0.2043457f, 0.033935547f, 0.115722656f, 0.09423828f, 0.18017578f, 0.34960938f, + -0.9074707f, -0.25634766f, 0.14331055f, 0.03515625f, -0.076171875f, -0.1340332f, -0.0073242188f, 0.20922852f, 0.40063477f, 0.5883789f, 0.64868164f, 0.50024414f, 0.19238281f, -0.22338867f, -0.47998047f, -0.6333008f, + 0.40429688f, 0.021972656f, 0.059814453f, 0.5866699f, 1.2155762f, 0.35351562f, -0.17480469f, -0.0703125f, -0.09448242f, -0.24975586f, -0.39672852f, -0.3347168f, -0.3479004f, -0.38671875f, -0.36743164f, -0.21948242f, + 0.71850586f, -0.052246094f, -0.3918457f, -0.13745117f, 0.13793945f, 0.20458984f, 0.13623047f, -0.15039062f, -0.22436523f, -0.2446289f, 0.12158203f, 0.58496094f, 0.5527344f, -0.028320312f, -0.60180664f, -0.6254883f, + 0.007080078f, 0.32910156f, 0.41210938f, 0.033203125f, -0.2097168f, -0.06665039f, -0.15307617f, 0.020507812f, 0.33203125f, 0.8874512f, 0.7089844f, -0.4128418f, -0.71484375f, -0.4958496f, -0.29223633f, -0.38476562f, + -0.84765625f, 0.3466797f, 0.107910156f, -0.3659668f, -0.48583984f, -0.41552734f, -0.38232422f, -0.26953125f, 0.019042969f, 0.25219727f, 0.40039062f, 0.3984375f, 0.38427734f, 0.29785156f, 0.29589844f, 0.26391602f, + 0.47680664f, -0.0056152344f, -0.15307617f, -0.33764648f, -0.30737305f, 0.24511719f, 0.8847656f, 0.61035156f, -0.32861328f, -0.6430664f, -0.43823242f, -0.1899414f, -0.12475586f, -0.084228516f, 0.111328125f, 0.28393555f, + 1.0576172f, -0.23535156f, -0.9638672f, -0.84716797f, 0.3137207f, 1.1804199f, 0.7871094f, 0.14257812f, -0.018798828f, -0.21801758f, -0.20703125f, -0.11816406f, -0.10449219f, -0.16210938f, -0.3491211f, -0.25708008f, + -0.028564453f, -0.43652344f, -0.20336914f, 0.13623047f, 0.17822266f, 0.2175293f, -0.026367188f, -0.4050293f, -0.6472168f, -0.670166f, -0.26391602f, 0.3864746f, 0.685791f, 0.53808594f, 0.29077148f, 0.24853516f, + -0.32836914f, -0.09106445f, -0.11254883f, -0.34277344f, -0.5786133f, -0.5319824f, -0.45410156f, -0.34716797f, -0.2163086f, -0.1862793f, -0.09448242f, 0.14550781f, 0.32739258f, 0.6513672f, 1.0861816f, 1.0732422f, + 0.17163086f, 0.26391602f, 0.19165039f, 0.028320312f, -0.05517578f, 0.14355469f, 0.09057617f, 0.03125f, -0.20532227f, -0.36889648f, -0.58569336f, -0.7468262f, -0.75634766f, -0.04272461f, 0.84814453f, 0.9921875f, + 0.61376953f, -0.18969727f, -0.4868164f, -0.45410156f, -0.42089844f, -0.39868164f, -0.34399414f, -0.25610352f, -0.104003906f, 0.11791992f, 0.3408203f, 0.4416504f, 0.40942383f, 0.31689453f, 0.22802734f, 0.18603516f, + -0.5876465f, 0.19213867f, 0.30737305f, 0.46264648f, 0.37817383f, 0.08276367f, -0.36279297f, -0.51904297f, -0.53125f, -0.42382812f, -0.27075195f, -0.15063477f, -0.026611328f, 0.21655273f, 0.5439453f, 0.6879883f, + -0.5786133f, -0.046875f, 0.0390625f, -0.026123047f, 0.034423828f, -0.28442383f, -0.5217285f, 0.07299805f, 0.7167969f, 0.84106445f, -0.34570312f, -0.3466797f, 0.25512695f, 0.31958008f, 0.12207031f, -0.2512207f, + -0.19604492f, 0.11645508f, 0.17895508f, 0.2697754f, 0.4050293f, 0.2927246f, 0.09667969f, -0.12817383f, -0.14550781f, -0.1706543f, -0.16308594f, -0.13354492f, -0.11376953f, -0.14282227f, -0.12866211f, -0.037353516f, + -0.2084961f, -0.2878418f, -0.23657227f, -0.11816406f, 0.016357422f, 0.059326172f, 0.067871094f, -0.033447266f, -0.013427734f, 0.0029296875f, 0.068603516f, 0.12548828f, 0.14624023f, 0.11279297f, 0.11254883f, 0.18530273f, + -0.13549805f, 1.1516113f, 0.5197754f, -0.064453125f, -0.2409668f, -0.1274414f, -0.021484375f, -0.07104492f, -0.095458984f, -0.11987305f, -0.12573242f, -0.18701172f, -0.20874023f, -0.21459961f, -0.08081055f, 0.021484375f, + -0.33520508f, -0.6520996f, -0.2927246f, 0.8496094f, 0.6022949f, 0.35229492f, 0.1484375f, 0.06347656f, -0.13232422f, -0.390625f, -0.41137695f, -0.27294922f, -0.1694336f, -0.027832031f, 0.18310547f, 0.48510742f, + 0.22802734f, 0.8112793f, 0.25610352f, -0.5793457f, 0.18774414f, 0.74902344f, 0.122802734f, -0.38842773f, -0.57714844f, -0.842041f, -0.97314453f, -0.74975586f, 0.20605469f, 1.4348145f, 0.22973633f, -0.115722656f, + -0.103759766f, 0.055664062f, -0.29663086f, -0.3864746f, -0.36743164f, -0.38549805f, -0.22802734f, -0.19311523f, -0.11816406f, -0.11645508f, 0.2578125f, 1.0197754f, 1.0957031f, 0.7624512f, -0.19189453f, -0.8034668f, + 0.31860352f, -0.32495117f, -0.25756836f, 0.4501953f, 0.74731445f, 0.26293945f, -0.5578613f, -0.6347656f, 0.056152344f, 1.1223145f, 0.27783203f, -0.8347168f, -0.96850586f, -0.2019043f, 0.5266113f, 0.018798828f, + 0.2434082f, 0.05126953f, -0.16088867f, -0.2434082f, -0.15234375f, 0.037353516f, 0.06982422f, -0.015136719f, -0.607666f, 0.14428711f, 0.94433594f, 0.37109375f, -0.3083496f, -0.34765625f, -0.12060547f, 0.09448242f, + 0.13427734f, 0.47021484f, -0.4387207f, -0.8562012f, -0.6101074f, -0.10913086f, 0.1430664f, 0.18334961f, 0.103759766f, -0.034423828f, -0.06738281f, 0.036376953f, 0.12670898f, 0.18603516f, 0.33496094f, 0.39697266f, + 1.0314941f, -0.5073242f, 0.050048828f, 0.31860352f, -0.055908203f, -0.6105957f, -0.31860352f, -0.056396484f, 0.072753906f, 0.056884766f, -0.053466797f, -0.06933594f, -0.08666992f, -0.038330078f, 0.047851562f, 0.21875f, + 0.47192383f, 0.58447266f, 0.6154785f, -0.078125f, -0.6315918f, -0.92626953f, -0.89501953f, -0.46069336f, -0.14819336f, -0.03125f, 0.046142578f, 0.14086914f, 0.12646484f, 0.25390625f, 0.47753906f, 0.4543457f, + -1.1186523f, -0.5427246f, -0.36108398f, -0.13378906f, -0.0048828125f, 0.2939453f, 0.45581055f, 0.3972168f, 0.2421875f, -0.18725586f, -0.576416f, -0.25805664f, 0.115722656f, 0.517334f, 0.6699219f, 0.4909668f, + -0.8635254f, -0.1977539f, -0.067871094f, -0.060058594f, 0.08251953f, 0.5378418f, 0.0007324219f, -0.067871094f, -0.0053710938f, 0.513916f, 0.42993164f, -0.3544922f, -0.6711426f, -0.15454102f, 0.5522461f, 0.3256836f, + 0.62231445f, 0.44702148f, 0.3725586f, 0.15454102f, -0.13916016f, -0.40576172f, -0.49829102f, -0.3881836f, -0.13867188f, 0.2355957f, 0.5095215f, 0.3972168f, 0.0793457f, -0.22802734f, -0.44213867f, -0.5776367f, + -0.64086914f, 0.17944336f, 1.0073242f, 0.46972656f, -0.33007812f, -0.33569336f, -0.016357422f, -0.064208984f, -0.08105469f, -0.14916992f, -0.05444336f, 0.016845703f, -0.010009766f, -0.08911133f, -0.012207031f, 0.10961914f, + 0.47485352f, -0.13232422f, 0.21044922f, 0.36645508f, -0.11303711f, -0.8552246f, -0.7819824f, 0.8149414f, 1.0595703f, -0.46044922f, -0.359375f, -0.04296875f, -0.21948242f, -0.24584961f, 0.037353516f, 0.24707031f, + 0.28710938f, -0.68530273f, 0.22631836f, 0.119384766f, -0.17114258f, -0.29833984f, 0.33618164f, 0.49438477f, 0.4248047f, 0.171875f, 0.20385742f, 0.08935547f, -0.20922852f, -0.38671875f, -0.3569336f, -0.24584961f, + 0.33544922f, 0.27172852f, 0.040283203f, -0.072509766f, -0.008544922f, -0.095458984f, -0.19897461f, -0.2980957f, -0.17480469f, -0.12133789f, -0.060791016f, 0.012451172f, 0.087890625f, 0.059814453f, 0.068115234f, 0.1550293f, + 1.1574707f, 0.5593262f, -0.16137695f, -0.44140625f, -0.38305664f, -0.24731445f, -0.0056152344f, 0.10961914f, 0.21948242f, 0.22314453f, -0.0036621094f, -0.20166016f, -0.27416992f, -0.28295898f, -0.21240234f, -0.055419922f, + -0.75561523f, -0.84399414f, -0.079589844f, 0.29614258f, 0.24389648f, 0.3671875f, 0.5605469f, 0.3630371f, 0.26220703f, 0.17895508f, 0.06274414f, -0.052734375f, -0.14526367f, -0.21069336f, -0.1550293f, -0.091796875f, + 0.32055664f, 0.47436523f, 0.56640625f, 0.517334f, 0.42260742f, 0.2890625f, 0.12719727f, -0.23291016f, -0.5283203f, -0.7036133f, -0.6333008f, -0.40454102f, -0.23364258f, -0.1628418f, -0.011962891f, 0.19335938f, + -0.05493164f, 0.5136719f, 0.30395508f, 0.49072266f, 0.3581543f, -0.09301758f, -0.38183594f, -0.4338379f, -0.57299805f, -0.4794922f, -0.17651367f, 0.42651367f, 0.56103516f, 0.28149414f, -0.22875977f, -0.51416016f, + 0.2709961f, -0.26635742f, -0.44995117f, -0.079589844f, 0.21728516f, 0.43017578f, 0.4206543f, 0.47827148f, 0.58691406f, 0.27612305f, -0.26391602f, -0.65771484f, -0.67944336f, -0.3935547f, -0.11791992f, 0.2277832f, + -0.80078125f, 0.18066406f, 0.12036133f, -0.39575195f, -0.60009766f, -0.13134766f, 0.77685547f, 0.5834961f, 0.4248047f, 0.15820312f, 0.08520508f, -0.060058594f, -0.1652832f, -0.17700195f, -0.0234375f, 0.023925781f, + 0.28100586f, 0.4013672f, 0.5695801f, 0.1394043f, -0.20532227f, -0.18286133f, 0.40698242f, 0.703125f, 0.54907227f, 0.09301758f, -0.47631836f, -0.62597656f, -0.4975586f, -0.39160156f, -0.41259766f, -0.3515625f, + 0.3227539f, -1.0678711f, -1.1435547f, 0.068603516f, 0.7546387f, 0.38745117f, 0.09008789f, -0.0007324219f, -0.12792969f, 0.076416016f, 0.24853516f, 0.28735352f, 0.076660156f, -0.041748047f, -0.01977539f, 0.08911133f, + 0.6101074f, -0.22070312f, -0.5324707f, -0.119384766f, 0.10473633f, 0.16333008f, -0.15112305f, -0.34472656f, -0.39746094f, -0.43652344f, -0.23876953f, 0.0017089844f, 0.056152344f, 0.22973633f, 0.50024414f, 0.7751465f, }; const float ivas_sns_cdbk_tcx20_stage3[ 32 * 16 ] = { - -0.08443224f, -0.18703635f, -0.02297765f, 0.35108322f, -0.47365404f, 0.60080101f, -0.14560352f, 0.01413276f, 0.01222370f, 0.01369841f, 0.05509108f, 0.03233707f, 0.01187713f, -0.08225931f, -0.08910713f, -0.00617424f, - -0.45134081f, -0.18205893f, -0.21886586f, -0.27082278f, -0.18872267f, -0.08438255f, 0.11808124f, 0.11472340f, 0.08049694f, 0.05868671f, 0.08856118f, 0.10686811f, 0.14792971f, 0.16522330f, 0.21823435f, 0.29738868f, - -0.11328915f, 0.10130429f, -0.14943437f, 0.15645630f, 0.63935450f, 0.37821704f, -0.21310801f, -0.24867988f, -0.01659672f, 0.03328198f, -0.08180066f, -0.05657044f, 0.10906149f, 0.03196869f, -0.22137928f, -0.34878580f, - 0.05458665f, -0.05919364f, -0.13460386f, 0.10683925f, 0.02486665f, -0.03996090f, -0.07800776f, -0.00646458f, -0.21155480f, -0.27387617f, 0.02240932f, 0.70908553f, -0.66258796f, -0.11916859f, 0.46104817f, 0.20658280f, - -0.18236160f, -0.42556974f, -0.01518583f, 0.40249814f, 0.16028064f, -0.31751965f, -0.32775039f, -0.07115151f, 0.14131570f, 0.25092515f, 0.30150209f, 0.11921413f, 0.03049898f, 0.00963513f, -0.00838672f, -0.06794450f, - 0.43233298f, 0.11411029f, -0.14415844f, -0.34176452f, -0.41588457f, -0.29962161f, 0.10637969f, 0.23407196f, 0.10305969f, -0.00062410f, 0.02900924f, 0.03866877f, 0.08640844f, 0.05154612f, 0.00161694f, 0.00484903f, - -0.21512794f, 0.25425865f, 0.27105566f, -0.05213586f, -0.05906940f, -0.26548344f, -0.44413633f, 0.03920286f, 0.46845996f, 0.41236263f, -0.31903770f, -0.32961136f, 0.22647316f, 0.19335126f, -0.03700087f, -0.14356117f, - 0.21924285f, -0.02083234f, -0.21264229f, -0.32008443f, 0.85787441f, -0.31109029f, -0.11710511f, 0.15258065f, -0.05422604f, 0.04703640f, 0.03138786f, 0.00284139f, -0.14128648f, -0.12246651f, -0.12553053f, 0.11430042f, - -0.06983219f, 0.15566395f, 0.00257636f, -0.43107600f, -0.19146497f, 0.19866667f, 0.23130140f, -0.15042179f, -0.31509935f, -0.19492938f, 0.13173040f, 0.34976123f, 0.35522809f, 0.15128504f, -0.03897684f, -0.18441264f, - 0.03835343f, -0.41781092f, -0.09130119f, 0.23649600f, 0.31864720f, 0.31965077f, 0.31997092f, 0.09379415f, -0.07805132f, -0.17350540f, -0.16066354f, -0.15534991f, -0.10595695f, -0.07769963f, -0.06267573f, -0.00389790f, - -0.06072967f, -0.08529762f, -0.25895528f, -0.11410745f, -0.03994694f, 0.00520744f, 0.13029546f, 0.20924505f, 0.20033325f, 0.00128218f, -0.48912530f, -0.29001748f, 0.59798769f, 0.57708579f, -0.00334114f, -0.37991599f, - 0.67709987f, 0.24479940f, 0.09839041f, 0.09240624f, 0.04874621f, -0.07903978f, -0.10677716f, -0.20070119f, -0.12618873f, -0.06680438f, -0.05551493f, -0.11559282f, -0.11011740f, -0.12021879f, -0.12904082f, -0.05144612f, - -0.24390844f, -0.02971498f, 0.26491058f, 0.32477805f, 0.15268137f, -0.03230336f, -0.09305650f, -0.07114758f, -0.26964124f, -0.44939594f, -0.31245133f, 0.05828219f, 0.30712838f, 0.31280972f, 0.10713241f, -0.02610336f, - 0.19735739f, -0.09060264f, 0.00825537f, -0.36599055f, 0.05585799f, 0.37908316f, -0.38413173f, 0.35027949f, 0.34555851f, -0.34241207f, -0.18091006f, 0.16295794f, 0.08399265f, -0.12258257f, -0.08886776f, -0.00784505f, - 0.18552089f, -0.05448505f, -0.06090343f, 0.28995307f, -0.00222442f, -0.38233148f, -0.18031475f, 0.21268787f, 0.02073848f, -0.18932508f, -0.18523794f, -0.18812600f, -0.12671694f, 0.01228197f, 0.22055935f, 0.42792350f, - 0.12799222f, 0.22968936f, 0.03802711f, -0.14099927f, -0.08635323f, 0.16987494f, 0.35348472f, 0.04505467f, -0.26388915f, -0.34916901f, -0.22942166f, -0.17684250f, -0.08724829f, -0.00054213f, 0.12610262f, 0.24423959f, - -0.08038187f, -0.16879152f, -0.00176772f, 0.35376535f, -0.37011098f, -0.36320739f, 0.66636341f, -0.06773157f, -0.07814045f, -0.04765960f, -0.03365673f, 0.02181851f, 0.03254002f, 0.03483427f, 0.02717800f, 0.07494827f, - -0.34868864f, 0.17040333f, 0.25260784f, 0.10076787f, 0.06839398f, -0.02800665f, -0.06848675f, -0.16826923f, -0.07268923f, 0.01087754f, 0.05460110f, 0.00431011f, 0.03885215f, 0.00975901f, -0.01527130f, -0.00916121f, - 0.18571700f, 0.08336153f, 0.02979922f, -0.39409904f, -0.12098272f, 0.43026379f, -0.26722488f, -0.41282119f, 0.02970150f, 0.49897713f, 0.10843837f, -0.24094187f, -0.08115504f, 0.00006204f, 0.10433840f, 0.04656578f, - 0.00538329f, -0.07750994f, -0.10910098f, 0.04048538f, 0.03334399f, 0.28342260f, 0.14581840f, -0.24746813f, -0.34416074f, 0.06151045f, 0.68745611f, 0.19063398f, -0.23771814f, -0.28316033f, -0.12688702f, -0.02204889f, - -0.60521242f, -0.06124017f, 0.11564466f, 0.07475615f, 0.11824730f, 0.14189819f, 0.27204580f, 0.27978428f, 0.25196977f, 0.13866750f, 0.00205101f, -0.10150602f, -0.11644945f, -0.18929950f, -0.17648802f, -0.14486907f, - 0.06856566f, -0.13844197f, -0.26691240f, -0.18845012f, -0.05126065f, 0.00304429f, 0.11414309f, 0.06950182f, 0.19286717f, 0.29037166f, 0.27053650f, 0.17652627f, 0.09171994f, -0.09001258f, -0.24528745f, -0.29691120f, - -0.13004111f, 0.35130055f, 0.29363124f, -0.18853208f, -0.39468716f, -0.19791109f, -0.04383464f, 0.00894901f, 0.12616722f, 0.23070746f, 0.26441755f, 0.01948829f, -0.23089364f, -0.30363455f, -0.02382649f, 0.21869951f, - 0.11164215f, 0.03116967f, -0.06353187f, 0.16924336f, -0.01461062f, -0.19152070f, 0.03686445f, 0.20477538f, -0.03967336f, -0.32744743f, -0.17088429f, 0.63829176f, 0.35280729f, -0.43549735f, -0.27277762f, -0.02885087f, - -0.30725406f, 0.74701729f, -0.39274145f, 0.04302180f, 0.07483049f, -0.03413902f, 0.09344659f, 0.09169015f, 0.04345559f, -0.04477331f, -0.00176985f, -0.03585142f, -0.03405962f, -0.07575575f, -0.09739054f, -0.06972689f, - 0.28265268f, -0.39222951f, -0.42695953f, -0.10897533f, 0.07424889f, 0.08797478f, 0.00908971f, -0.13637855f, -0.12075776f, -0.04977985f, 0.06395383f, 0.09442120f, 0.15174794f, 0.13939497f, 0.13041070f, 0.20118587f, - -0.06637296f, 0.10778732f, -0.07433513f, -0.03524749f, -0.17212396f, -0.11995773f, 0.04291853f, -0.06480863f, -0.07793575f, 0.16559639f, 0.16476497f, -0.45667097f, -0.18714125f, 0.71725922f, 0.42534599f, -0.36907862f, - 0.15419735f, 0.13519411f, 0.37767798f, 0.23431801f, -0.02281061f, -0.05079690f, 0.14170781f, 0.09854410f, 0.01337290f, -0.01979078f, -0.01296254f, -0.03126860f, -0.07566643f, -0.16863998f, -0.32784959f, -0.44522679f, - -0.24074183f, 0.08320241f, 0.21818929f, 0.23760260f, 0.19352113f, 0.17458723f, -0.14563963f, -0.24861723f, -0.22656746f, -0.05362363f, 0.00368164f, -0.25389215f, -0.34172497f, -0.16702059f, 0.23332537f, 0.53371777f, - 0.03933551f, -0.61436501f, 0.74997308f, -0.14605678f, -0.06355008f, -0.07845237f, 0.03677743f, -0.01381658f, 0.03542562f, 0.01940321f, 0.04277388f, 0.01439240f, 0.05417023f, -0.03165523f, -0.04388511f, -0.00047013f, - 0.19660049f, -0.03582845f, -0.21224511f, -0.09633821f, 0.02140122f, 0.06690902f, 0.14753796f, 0.23491232f, 0.40075372f, 0.33318442f, -0.21453422f, -0.44835823f, -0.31995723f, -0.14770359f, -0.02720588f, 0.10087175f, - 0.22313452f, 0.23174662f, 0.13588360f, -0.01979092f, -0.17483898f, -0.36387601f, -0.35104947f, -0.34545228f, -0.17072761f, 0.01654692f, 0.12560464f, 0.14070090f, 0.18025650f, 0.13082045f, 0.10588357f, 0.13515746f + -0.12109375f, -0.32348633f, -0.25976562f, 0.21435547f, 0.4814453f, 0.14819336f, -0.22363281f, -0.31030273f, -0.13256836f, 0.10107422f, 0.33276367f, 0.32495117f, 0.16577148f, -0.079833984f, -0.16210938f, -0.15527344f, + 0.088378906f, -0.0146484375f, -0.13378906f, -0.29003906f, 0.873291f, -0.3125f, -0.19384766f, 0.19311523f, -0.09863281f, 0.052734375f, -0.13110352f, -0.021972656f, -0.07861328f, -0.01977539f, -0.07373047f, 0.1616211f, + -0.115722656f, 0.28100586f, 0.2697754f, -0.10522461f, -0.107910156f, -0.2866211f, -0.36694336f, -0.33862305f, -0.15844727f, 0.01928711f, 0.17382812f, 0.21118164f, 0.2697754f, 0.17260742f, 0.07299805f, 0.009033203f, + 0.08154297f, 0.037841797f, -0.25878906f, -0.30444336f, -0.064208984f, 0.1303711f, 0.36669922f, 0.39916992f, 0.3400879f, 0.14331055f, -0.01171875f, -0.12060547f, -0.17041016f, -0.23071289f, -0.20825195f, -0.13012695f, + -0.024902344f, -0.6298828f, 0.7861328f, -0.010986328f, -0.12695312f, -0.08618164f, 0.022705078f, 0.049316406f, 0.004638672f, -0.13647461f, -0.09863281f, 0.0f, 0.06518555f, 0.014404297f, 0.060546875f, 0.111083984f, + -0.39404297f, 0.16821289f, 0.28564453f, -0.08666992f, -0.16088867f, 0.052246094f, 0.26000977f, 0.057128906f, -0.050048828f, -0.07836914f, 0.016601562f, 0.05883789f, 0.07373047f, -0.03955078f, -0.08520508f, -0.07763672f, + 0.011962891f, -0.114990234f, -0.10229492f, -0.07080078f, 0.009765625f, -0.03125f, -0.15600586f, -0.014892578f, 0.10546875f, -0.040283203f, -0.48095703f, -0.2783203f, 0.5905762f, 0.66137695f, 0.13842773f, -0.22802734f, + 0.48706055f, 0.18286133f, -0.20678711f, -0.17651367f, -0.19750977f, -0.3178711f, -0.2524414f, 0.0087890625f, 0.2866211f, 0.25708008f, 0.18969727f, 0.11694336f, 0.049316406f, -0.05517578f, -0.17700195f, -0.19482422f, + 0.122802734f, -0.09667969f, 0.05444336f, 0.17358398f, 0.22924805f, 0.35229492f, 0.40307617f, 0.031982422f, -0.16064453f, -0.14819336f, -0.103027344f, -0.088134766f, -0.13623047f, -0.23510742f, -0.2434082f, -0.15600586f, + -0.5810547f, -0.0146484375f, -0.43432617f, -0.07397461f, 0.30444336f, 0.36035156f, 0.19213867f, 0.12890625f, 0.13061523f, 0.031982422f, -0.024902344f, -0.059326172f, -0.048583984f, -0.030517578f, 0.03149414f, 0.087646484f, + -0.1171875f, 0.016357422f, 0.15234375f, 0.38916016f, 0.2783203f, -0.007080078f, -0.07373047f, -0.2055664f, -0.30004883f, -0.35839844f, -0.23388672f, -0.033935547f, 0.08520508f, 0.10913086f, 0.125f, 0.17480469f, + -0.107666016f, 0.06274414f, -0.0048828125f, 0.12792969f, -0.023925781f, -0.2199707f, -0.084228516f, 0.34399414f, 0.22753906f, -0.39697266f, -0.32421875f, 0.48779297f, 0.43554688f, -0.15429688f, -0.22436523f, -0.14550781f, + 0.0031738281f, -0.03955078f, 0.06738281f, -0.017822266f, -0.2644043f, 0.30493164f, 0.30200195f, -0.32495117f, -0.5007324f, 0.15478516f, 0.60961914f, 0.15527344f, -0.1899414f, -0.14526367f, 0.017822266f, -0.1315918f, + 0.036621094f, -0.11669922f, -0.33691406f, -0.5373535f, -0.13598633f, 0.3046875f, 0.3215332f, -0.10620117f, -0.1640625f, -0.08569336f, 0.012451172f, 0.10839844f, 0.20117188f, 0.17553711f, 0.15258789f, 0.16967773f, + -0.4362793f, -0.47265625f, -0.16870117f, -0.111083984f, -0.1772461f, -0.1430664f, 0.015136719f, 0.12719727f, 0.13647461f, 0.12988281f, 0.19238281f, 0.22827148f, 0.23266602f, 0.17504883f, 0.14453125f, 0.12768555f, + -0.07495117f, 0.19604492f, 0.13110352f, -0.10131836f, -0.0078125f, -0.18847656f, -0.048828125f, 0.33862305f, 0.2578125f, -0.17089844f, -0.40698242f, -0.28857422f, -0.048339844f, 0.048828125f, 0.14916992f, 0.21459961f, + -0.27734375f, -0.072509766f, 0.26049805f, 0.39038086f, 0.2277832f, 0.020751953f, -0.12109375f, -0.080322266f, 0.171875f, 0.36743164f, 0.107421875f, -0.19311523f, -0.22607422f, -0.20654297f, -0.19799805f, -0.17041016f, + 0.1352539f, 0.40039062f, -0.15649414f, -0.25341797f, 0.31054688f, 0.5410156f, -0.32958984f, -0.42871094f, 0.14794922f, 0.17333984f, -0.17871094f, -0.23730469f, -0.026611328f, -0.013427734f, -0.046142578f, -0.037841797f, + -0.30395508f, 0.12841797f, 0.20825195f, -0.119628906f, -0.3317871f, -0.3190918f, -0.11206055f, 0.10205078f, 0.32470703f, 0.36254883f, 0.2626953f, 0.016113281f, -0.12890625f, -0.16479492f, -0.005126953f, 0.080566406f, + 0.34375f, 0.35888672f, 0.4765625f, 0.13623047f, -0.115722656f, -0.053222656f, 0.080566406f, -0.012207031f, -0.022216797f, -0.09863281f, -0.080566406f, -0.13574219f, -0.18383789f, -0.26123047f, -0.2578125f, -0.17504883f, + 0.01171875f, -0.015625f, 0.2680664f, -0.23461914f, -0.35717773f, 0.6381836f, -0.30664062f, 0.08129883f, -0.05493164f, 0.10058594f, -0.026855469f, -0.10180664f, -0.013671875f, -0.06347656f, 0.00048828125f, 0.07446289f, + -0.1015625f, 0.05053711f, 0.092285156f, 0.038330078f, -0.03491211f, 0.16479492f, 0.0859375f, 0.0036621094f, -0.15454102f, -0.09106445f, 0.026367188f, -0.23950195f, -0.43676758f, -0.27783203f, 0.21850586f, 0.6555176f, + -0.16064453f, 0.032958984f, 0.08325195f, 0.052978516f, -0.041748047f, 0.08959961f, 0.16552734f, 0.057373047f, -0.08154297f, 0.21362305f, 0.048583984f, -0.7026367f, -0.27685547f, 0.51000977f, 0.27197266f, -0.26245117f, + 0.62109375f, 0.00390625f, 0.08081055f, 0.16748047f, 0.08276367f, -0.11254883f, -0.20825195f, -0.3076172f, -0.24926758f, -0.15332031f, 0.0007324219f, 0.087646484f, 0.11303711f, 0.022705078f, -0.068847656f, -0.080322266f, + 0.40844727f, -0.390625f, -0.35473633f, 0.21777344f, 0.21972656f, -0.0107421875f, 0.111328125f, 0.21459961f, 0.1430664f, -0.08935547f, -0.19165039f, -0.2368164f, -0.1340332f, -0.034179688f, 0.030761719f, 0.09667969f, + -0.2199707f, 0.8208008f, -0.32104492f, 0.118896484f, -0.006591797f, -0.1328125f, 0.0078125f, -0.013183594f, -0.05493164f, -0.024414062f, 0.06542969f, -0.0014648438f, -0.055664062f, -0.06762695f, -0.07055664f, -0.044677734f, + -0.14770508f, -0.16967773f, -0.1105957f, 0.6333008f, -0.4025879f, -0.3515625f, 0.29736328f, 0.0859375f, 0.024414062f, -0.07128906f, 0.010253906f, 0.0007324219f, -0.021728516f, 0.01977539f, 0.083496094f, 0.12060547f, + -0.06738281f, 0.030517578f, 0.019042969f, 0.16308594f, 0.16796875f, 0.037109375f, 0.059326172f, 0.07397461f, 0.03540039f, 0.05517578f, 0.06982422f, 0.061523438f, 0.1940918f, 0.20605469f, -0.3178711f, -0.7878418f, + 0.1274414f, -0.040771484f, -0.21704102f, -0.025634766f, 0.012451172f, -0.033203125f, -0.15771484f, 0.052001953f, -0.19165039f, -0.26342773f, 0.032226562f, 0.7976074f, -0.4807129f, -0.21582031f, 0.36499023f, 0.2397461f, + 0.46044922f, 0.21435547f, 0.0847168f, -0.24414062f, -0.49902344f, -0.16577148f, 0.30151367f, 0.049560547f, -0.07470703f, -0.21459961f, -0.13256836f, -0.009277344f, 0.06665039f, 0.029052734f, 0.0390625f, 0.095214844f, + 0.17895508f, -0.31396484f, -0.033203125f, -0.02734375f, -0.0637207f, -0.11791992f, -0.03466797f, 0.0061035156f, 0.07324219f, 0.072753906f, 0.14916992f, 0.13671875f, 0.12524414f, 0.017333984f, -0.08178711f, -0.08618164f, + 0.13330078f, -0.15893555f, -0.22045898f, -0.032226562f, -0.07739258f, -0.25463867f, -0.32299805f, -0.2614746f, 0.039794922f, 0.18554688f, 0.1262207f, -0.04321289f, -0.010498047f, 0.13330078f, 0.31860352f, 0.44506836f, }; const float ivas_sns_cdbk_tcx20_stage4[ 32 * 16 ] = { - -0.01178932f, -0.08216325f, 0.00009975f, 0.07861932f, 0.10639093f, 0.10607783f, -0.11972309f, 0.01910820f, -0.05635505f, 0.02765448f, -0.08840101f, -0.09623400f, 0.34917350f, -0.19835894f, -0.46938213f, 0.43528268f, - -0.08636054f, 0.13923351f, -0.15932705f, -0.10849641f, -0.02303533f, -0.23968519f, -0.02192257f, 0.50128910f, 0.27139459f, -0.07262939f, -0.06622134f, -0.01073419f, -0.04308095f, -0.05629457f, -0.03175020f, 0.00762044f, - 0.24815560f, 0.14657944f, 0.07172491f, 0.02302382f, 0.01991109f, -0.10204469f, -0.24960876f, -0.07085594f, 0.12223419f, 0.06999865f, 0.10986748f, 0.13492392f, 0.05865008f, -0.10366906f, -0.23987720f, -0.23901358f, - -0.15438243f, -0.04559005f, 0.16760111f, 0.26289859f, 0.24002732f, 0.06333052f, -0.04293731f, 0.16191749f, 0.12993586f, -0.15916904f, -0.24049436f, -0.13688115f, -0.13764233f, -0.11140102f, -0.01899323f, 0.02178000f, - -0.09362153f, -0.06475772f, -0.01949932f, -0.04249530f, -0.05109865f, 0.07410551f, -0.01006480f, 0.04753318f, -0.02781557f, 0.07745214f, 0.06146913f, -0.16546467f, -0.41512457f, 0.10097607f, 0.66727071f, -0.13886467f, - -0.07368760f, 0.36035427f, 0.21605884f, -0.01438276f, -0.11360433f, -0.05644934f, 0.03063785f, -0.05006328f, -0.07521149f, -0.13595728f, -0.01277458f, 0.04492285f, 0.01200858f, -0.04176021f, -0.04570247f, -0.04438907f, - 0.09516185f, -0.01929782f, 0.00494854f, -0.09763747f, -0.07344490f, 0.12994610f, 0.48094184f, -0.48192847f, -0.05573409f, 0.26426544f, -0.27655157f, -0.08642901f, 0.08435032f, 0.13304512f, -0.05782422f, -0.04381160f, - -0.09313450f, 0.05540574f, 0.01201341f, -0.06726039f, -0.10451812f, 0.02669040f, -0.05484815f, 0.07449424f, -0.34344135f, 0.56109258f, -0.27428709f, -0.09301413f, 0.41965904f, -0.13902794f, 0.18473846f, -0.16456202f, - 0.08693855f, 0.01453042f, -0.11107078f, 0.06241724f, 0.10204906f, -0.07064796f, -0.13846291f, 0.08293345f, -0.10757619f, -0.22863306f, 0.03213009f, 0.19644778f, 0.16452805f, 0.34110370f, 0.09006750f, -0.51675482f, - -0.18423905f, 0.01384230f, 0.26714303f, -0.40934167f, 0.39275996f, -0.01237613f, -0.25919307f, -0.08619564f, -0.04046283f, -0.01126873f, -0.01664395f, 0.01744563f, 0.10282249f, 0.09607820f, 0.04998616f, 0.07964328f, - -0.02274322f, 0.17908332f, -0.02788687f, 0.00807798f, -0.14435131f, -0.02676761f, 0.10369709f, -0.23851723f, 0.57714821f, -0.24897036f, -0.18048434f, 0.02001729f, -0.12740088f, -0.09982727f, 0.00840552f, 0.22051971f, - 0.13771932f, -0.17471600f, 0.18563016f, 0.18284665f, 0.11307352f, 0.20075992f, -0.03584593f, -0.25044388f, -0.20529947f, -0.11730357f, 0.05388263f, 0.08544750f, 0.04416102f, -0.02585125f, -0.09278592f, -0.10127474f, - 0.08834726f, 0.11313223f, -0.16483942f, -0.28318232f, -0.23943962f, -0.10440104f, -0.03978272f, -0.07375089f, -0.00562577f, 0.02329676f, 0.14600550f, 0.17681015f, 0.14410817f, 0.09264978f, 0.05695417f, 0.06971767f, - 0.14265864f, -0.42999794f, -0.17884255f, -0.08097949f, -0.04680661f, -0.04620171f, 0.02411542f, 0.04266824f, 0.15894248f, 0.24773695f, 0.15192868f, -0.01414995f, -0.13102813f, -0.07567236f, 0.04332535f, 0.19230306f, - -0.21142675f, -0.18455704f, -0.13706857f, -0.09760966f, -0.00844340f, 0.14865602f, 0.20607338f, 0.12012844f, -0.00914924f, -0.14368559f, -0.00265126f, 0.10043210f, 0.09154737f, 0.03443178f, 0.02422327f, 0.06909914f, - 0.18450361f, 0.00435351f, 0.27864126f, 0.17704943f, -0.20479796f, -0.29862599f, -0.17089168f, -0.09881143f, 0.04783000f, 0.14260548f, -0.02349078f, -0.20487241f, -0.13745683f, 0.05546335f, 0.10019847f, 0.14830206f, - 0.10317471f, -0.16998911f, 0.09734737f, 0.06796242f, -0.01161580f, -0.18371589f, -0.08936939f, 0.07107444f, -0.09565406f, -0.23557438f, 0.42834066f, 0.31175412f, -0.11511657f, -0.28572113f, -0.06889545f, 0.17599802f, - 0.11312034f, 0.08666296f, 0.02086535f, 0.12656018f, -0.12520471f, 0.04702581f, 0.39113807f, 0.09775371f, -0.00094471f, 0.08191930f, 0.07626151f, -0.13554986f, -0.29383511f, -0.25857022f, -0.15738811f, -0.06981449f, - 0.07590872f, 0.10290609f, -0.14618577f, 0.13491216f, 0.33869686f, -0.04072549f, -0.30046897f, -0.07243681f, 0.07180300f, 0.23060158f, 0.21642544f, -0.13575731f, -0.31781641f, -0.19431392f, -0.02233810f, 0.05878895f, - -0.11105764f, -0.05437616f, -0.00379085f, 0.08951467f, 0.39169243f, -0.38233560f, 0.34492699f, -0.09947370f, -0.08648526f, -0.03340088f, -0.02593483f, 0.11572014f, 0.01899877f, -0.03965890f, -0.06421047f, -0.06012863f, - -0.01630162f, 0.17784241f, -0.29989778f, 0.10469439f, 0.14861228f, -0.00722859f, -0.10711587f, -0.18435390f, -0.22539717f, -0.21441284f, 0.00336383f, 0.04362196f, 0.03914130f, 0.10650815f, 0.16959322f, 0.26133027f, - -0.45700261f, 0.07282251f, 0.00944859f, 0.03968330f, -0.02457975f, 0.11148291f, -0.02109853f, -0.18417192f, 0.02503845f, 0.10733751f, 0.21565042f, 0.09727523f, 0.00466877f, -0.01572810f, -0.00245341f, 0.02162664f, - 0.01471341f, -0.09796256f, 0.37685840f, -0.27373841f, -0.22809280f, 0.20207443f, 0.12508033f, 0.16172866f, 0.15442152f, -0.03971152f, -0.03731565f, 0.04320052f, -0.02493079f, -0.08894232f, -0.13155708f, -0.15582618f, - -0.04063466f, 0.14873431f, 0.10076527f, -0.09442471f, 0.02133939f, -0.04747602f, 0.02176493f, 0.52606315f, -0.60183613f, -0.05056878f, 0.18858100f, -0.00936749f, -0.17007143f, -0.00822640f, 0.01473704f, 0.00062041f, - -0.01851982f, 0.07661957f, -0.30452796f, 0.64817852f, -0.21819667f, -0.15094971f, -0.02014064f, 0.04976562f, 0.03988913f, 0.00229505f, -0.01596447f, -0.00497683f, 0.01888521f, 0.00912230f, -0.04741494f, -0.06406442f, - -0.18646693f, -0.25658854f, 0.20567339f, 0.06671960f, -0.24836724f, -0.23737029f, 0.03275858f, 0.09293590f, 0.06861982f, 0.01487215f, 0.10808605f, 0.17546010f, 0.16832370f, 0.12557457f, -0.00949461f, -0.12073619f, - -0.08559046f, -0.16350668f, -0.28729498f, 0.01179878f, 0.06195939f, 0.06121501f, -0.29667937f, -0.19145944f, 0.41150010f, 0.18707789f, -0.21406932f, 0.19248440f, 0.16889573f, 0.10825101f, 0.07412737f, -0.03870938f, - 0.00652202f, -0.15316918f, 0.25343593f, -0.09299964f, -0.22861167f, 0.06865193f, 0.02064443f, -0.10488496f, -0.18017250f, -0.21898191f, -0.08742146f, 0.02608617f, 0.05046582f, 0.08687786f, 0.21515984f, 0.33839723f, - 0.12533507f, 0.27191291f, 0.06056226f, -0.10872799f, 0.01799135f, 0.17589055f, -0.05514906f, -0.01148984f, 0.01373578f, -0.08944541f, -0.35717808f, -0.38014180f, 0.05531840f, 0.30742910f, 0.08016039f, -0.10620357f, - -0.01190022f, -0.24441497f, -0.07461266f, 0.02317252f, 0.05704737f, 0.16442883f, 0.06955004f, 0.05748732f, 0.05251523f, 0.22879327f, 0.21860705f, -0.37376474f, 0.03987437f, 0.33071525f, -0.23228300f, -0.30521565f, - -0.00581916f, 0.24592784f, -0.27266538f, -0.28914327f, 0.09129356f, 0.42079957f, 0.05815983f, 0.01136363f, 0.03980200f, -0.04215296f, 0.01465284f, 0.03859289f, -0.13354970f, -0.16935580f, -0.05814064f, 0.05023468f, - 0.44241891f, -0.06885632f, -0.14130761f, -0.04771012f, -0.00863562f, 0.00586591f, 0.12381405f, 0.08059256f, -0.06764947f, -0.22513354f, -0.10536820f, 0.02669478f, 0.01147300f, -0.01584685f, -0.02845628f, 0.01810479f + -0.0056152344f, -0.03955078f, 0.071777344f, 0.26879883f, 0.44140625f, -0.08203125f, -0.20092773f, -0.009277344f, 0.05810547f, -0.06347656f, -0.07910156f, -0.05126953f, -0.07006836f, -0.068847656f, -0.07885742f, -0.09082031f, + -0.011962891f, -0.060302734f, 0.011962891f, 0.049804688f, -0.044677734f, 0.037841797f, 0.099121094f, 0.06274414f, 0.022216797f, -0.09057617f, 0.00390625f, 0.38452148f, 0.1027832f, -0.5292969f, -0.3269043f, 0.28881836f, + -0.3557129f, 0.3815918f, 0.10839844f, 0.08203125f, 0.03149414f, -0.0024414062f, -0.0036621094f, -0.02758789f, -0.03125f, -0.096191406f, -0.09326172f, -0.103515625f, -0.07006836f, 0.008056641f, 0.06616211f, 0.10644531f, + 0.038330078f, 0.022460938f, -0.22070312f, 0.529541f, -0.3540039f, 0.29907227f, -0.16235352f, -0.03955078f, 0.053222656f, -0.07348633f, -0.051513672f, 0.021484375f, 0.04638672f, 0.029541016f, -0.052001953f, -0.08618164f, + 0.075927734f, -0.19604492f, 0.046875f, -0.00048828125f, -0.052978516f, -0.03491211f, 0.19067383f, 0.08520508f, -0.16113281f, -0.29785156f, -0.22558594f, -0.07006836f, 0.053955078f, 0.1550293f, 0.19042969f, 0.2409668f, + 0.08227539f, 0.26464844f, -0.15332031f, -0.140625f, -0.0068359375f, 0.060302734f, -0.05126953f, -0.23339844f, -0.28442383f, -0.14160156f, 0.0793457f, 0.23828125f, 0.20678711f, 0.09716797f, 0.014892578f, -0.032470703f, + 0.20581055f, -0.19702148f, 0.053466797f, 0.026855469f, -0.011962891f, -0.04663086f, -0.11254883f, 0.060058594f, 0.33984375f, 0.33447266f, -0.14257812f, -0.37719727f, -0.21850586f, 0.016845703f, 0.08325195f, -0.013916016f, + 0.34375f, -0.38623047f, -0.06542969f, -0.07348633f, -0.107421875f, 0.037353516f, 0.14477539f, 0.01586914f, 0.0026855469f, 0.08959961f, 0.19433594f, 0.1027832f, -0.03149414f, -0.060058594f, -0.1003418f, -0.10668945f, + 0.12841797f, 0.01953125f, 0.16333008f, 0.22827148f, -0.16015625f, -0.42016602f, -0.19067383f, 0.08642578f, 0.08520508f, -0.022705078f, 0.011230469f, 0.013671875f, -0.0034179688f, 0.019042969f, -0.005859375f, 0.047851562f, + 0.02734375f, 0.008056641f, -0.07470703f, 0.114990234f, 0.0021972656f, -0.41796875f, 0.5605469f, -0.28735352f, 0.022949219f, -0.07739258f, -0.028808594f, 0.1928711f, 0.056152344f, 0.0053710938f, -0.048583984f, -0.055419922f, + -0.037109375f, 0.12939453f, -0.38671875f, -0.095214844f, 0.0021972656f, -0.012451172f, 0.19677734f, 0.2578125f, 0.12670898f, -0.10180664f, -0.087890625f, 0.009521484f, 0.1418457f, 0.14526367f, -0.076660156f, -0.21166992f, + 0.29711914f, 0.06616211f, -0.375f, -0.080566406f, 0.1484375f, -0.0007324219f, -0.020996094f, 0.013427734f, -0.014160156f, -0.11279297f, -0.08081055f, -0.056152344f, -0.13769531f, -0.060546875f, 0.10595703f, 0.30810547f, + -0.025146484f, 0.023925781f, -0.02758789f, -0.0009765625f, 0.08178711f, -0.13452148f, -0.022949219f, 0.6875f, -0.39794922f, -0.123046875f, 0.06738281f, 0.04345703f, -0.053955078f, -0.0146484375f, -0.045410156f, -0.05810547f, + 0.0146484375f, 0.041748047f, -0.024902344f, 0.005126953f, -0.079589844f, -0.04638672f, -0.028320312f, 0.021972656f, -0.11450195f, -0.118896484f, -0.041748047f, -0.001953125f, -0.2783203f, 0.33154297f, 0.64575195f, -0.32543945f, + -0.13989258f, -0.020019531f, 0.3137207f, -0.53271484f, 0.3154297f, 0.037353516f, -0.04272461f, -0.059326172f, -0.05444336f, -0.009765625f, -0.0073242188f, 0.015380859f, 0.0769043f, 0.08251953f, 0.01171875f, 0.013427734f, + -0.049804688f, 0.022949219f, -0.08227539f, -0.08544922f, 0.012451172f, 0.015380859f, -0.2241211f, 0.15625f, -0.19750977f, 0.5703125f, -0.3684082f, 0.072753906f, 0.4711914f, -0.35888672f, 0.14697266f, -0.10205078f, + -0.17138672f, -0.19067383f, -0.21411133f, -0.030517578f, 0.09667969f, -0.087402344f, -0.09643555f, 0.017089844f, 0.08666992f, 0.041503906f, 0.05908203f, 0.034179688f, 0.08129883f, 0.12841797f, 0.12011719f, 0.12548828f, + -0.044921875f, 0.0061035156f, 0.037841797f, 0.017089844f, 0.064453125f, 0.008300781f, -0.20532227f, -0.025146484f, 0.07397461f, 0.06225586f, -0.15991211f, -0.27612305f, 0.44873047f, 0.14111328f, -0.40893555f, 0.26049805f, + -0.14941406f, 0.17773438f, 0.022949219f, -0.125f, 0.00048828125f, 0.19018555f, 0.03857422f, -0.039794922f, 0.09448242f, 0.20214844f, 0.22436523f, 0.111572266f, -0.08081055f, -0.16992188f, -0.25146484f, -0.24633789f, + -0.09350586f, 0.028076172f, -0.04272461f, 0.05419922f, 0.01586914f, -0.16870117f, -0.30395508f, -0.17285156f, 0.0690918f, 0.30541992f, 0.23266602f, -0.09082031f, 0.1340332f, 0.3449707f, 0.036621094f, -0.3486328f, + -0.20019531f, -0.10449219f, 0.041992188f, 0.09350586f, 0.010253906f, 0.04711914f, 0.26342773f, 0.23852539f, 0.13598633f, -0.04296875f, -0.063964844f, -0.13769531f, -0.18164062f, -0.10083008f, -0.033691406f, 0.03491211f, + 0.14648438f, 0.02758789f, 0.33984375f, -0.005126953f, -0.09887695f, 0.04272461f, -0.18652344f, -0.33129883f, -0.14208984f, 0.040039062f, 0.036376953f, -0.072509766f, -0.119628906f, -0.0017089844f, 0.09448242f, 0.23046875f, + 0.23852539f, 0.26513672f, 0.034179688f, 0.04272461f, 0.05053711f, 0.03466797f, 0.12182617f, 0.03930664f, -0.018066406f, -0.095947266f, -0.107666016f, -0.16040039f, -0.17211914f, -0.12524414f, -0.09716797f, -0.05078125f, + -0.08178711f, -0.05126953f, -0.20507812f, 0.115478516f, 0.14453125f, -0.010986328f, -0.16357422f, -0.05102539f, 0.037597656f, 0.24365234f, 0.38452148f, 0.05444336f, -0.40283203f, -0.21972656f, 0.0793457f, 0.12695312f, + -0.2548828f, -0.28222656f, 0.19628906f, 0.2890625f, 0.047851562f, -0.034179688f, 0.012451172f, -0.1159668f, -0.20947266f, -0.08154297f, 0.13427734f, 0.16333008f, 0.07885742f, 0.05078125f, 0.013427734f, -0.0078125f, + -0.067871094f, 0.02368164f, -0.010986328f, -0.037109375f, -0.19140625f, 0.118896484f, -0.020019531f, -0.3955078f, 0.5673828f, -0.02758789f, -0.23950195f, 0.103759766f, -0.04736328f, 0.029785156f, 0.07495117f, 0.118896484f, + 0.095214844f, -0.0078125f, 0.36035156f, -0.075927734f, -0.20385742f, 0.0625f, 0.15332031f, 0.044921875f, 0.0041503906f, -0.13793945f, -0.1472168f, 0.015136719f, 0.17504883f, 0.1105957f, -0.14648438f, -0.30151367f, + 0.063964844f, -0.0234375f, 0.07739258f, -0.24169922f, 0.041015625f, 0.18823242f, -0.43701172f, 0.25976562f, 0.25097656f, -0.37182617f, 0.040771484f, 0.2590332f, 0.0036621094f, -0.044677734f, -0.03173828f, -0.03466797f, + 0.025390625f, 0.09301758f, 0.11328125f, -0.027832031f, -0.0087890625f, -0.0703125f, 0.028320312f, -0.052734375f, -0.1953125f, -0.32617188f, 0.67871094f, -0.07397461f, -0.15039062f, -0.0703125f, -0.02758789f, 0.064697266f, + -0.049560547f, 0.15551758f, -0.016113281f, -0.27661133f, -0.30371094f, -0.13427734f, 0.08203125f, 0.09814453f, 0.07495117f, 0.038330078f, 0.055664062f, -0.00390625f, -0.018554688f, 0.0390625f, 0.10620117f, 0.15283203f, + -0.04321289f, -0.18408203f, -0.045654297f, -0.05029297f, 0.21191406f, 0.5300293f, 0.09716797f, -0.12866211f, -0.09423828f, -0.08666992f, -0.087890625f, -0.09643555f, -0.045166016f, 0.021972656f, -0.013183594f, 0.014160156f, + -0.0017089844f, -0.014160156f, -0.048339844f, -0.037109375f, -0.0949707f, -0.005859375f, 0.48388672f, -0.17480469f, -0.19140625f, 0.5727539f, -0.18920898f, -0.26391602f, 0.0048828125f, 0.067871094f, -0.045654297f, -0.06201172f, }; const float *const ivas_sns_cdbks_tcx20[SNS_MSVQ_NSTAGES_TCX20] = { ivas_sns_cdbk_tcx20_stage1, ivas_sns_cdbk_tcx20_stage2, ivas_sns_cdbk_tcx20_stage3, ivas_sns_cdbk_tcx20_stage4 }; -const float ivas_sns_means_tcx20[M] = { - 0.9155f , 1.2408f , 1.0050f , 0.5846f, - 0.2472f , 0.1902f , 0.0984f , 0.1039f, - -0.0139f , -0.0856f , -0.4157f , -0.6148f, - -0.7026f , -0.7216f , -0.8052f , -1.0262f -}; - const int16_t ivas_sns_cdbks_tcx10_levels[SNS_MSVQ_NSTAGES_TCX10] = { 128, 32, 8 }; const int16_t ivas_sns_cdbks_tcx10_bits[SNS_MSVQ_NSTAGES_TCX10] = { 7, 5, 3 }; const float ivas_sns_cdbk_tcx10_stage1[ 128 * 16 ] = { - 0.06343891f, -0.00651786f, -0.56994713f, -0.98772396f, -1.35099293f, -1.24848646f, -1.20301995f, -0.81089507f, -0.06563095f, 1.11147581f, 1.73933309f, 1.65859611f, 1.26237806f, 0.68028141f, 0.12449909f, -0.39678907f, - -1.34007175f, -1.50272189f, -2.07958791f, -2.38322761f, -2.22156614f, -1.96435669f, -1.68760863f, -1.23664935f, -0.28772180f, 0.87765579f, 1.83822720f, 1.95281398f, 2.33671266f, 2.76119687f, 2.75790597f, 2.17899850f, - -0.51450332f, 0.69692757f, 1.90898730f, 1.89179379f, 1.41350404f, 0.03604267f, 0.02251128f, -1.04270018f, -0.97981089f, -0.36225564f, 0.14171617f, -0.32050715f, -0.56272675f, -0.38710633f, -0.74842203f, -1.19345103f, - 0.61027733f, -0.25705654f, -0.30960961f, 0.11651829f, 0.08424358f, -0.04474594f, -0.21961636f, -0.26522327f, -0.31681379f, -0.23903185f, -0.07879718f, 0.00383111f, 0.09522293f, 0.15157026f, 0.24747985f, 0.42175137f, - 0.06215930f, 0.74417332f, -0.05737044f, -0.84302341f, -0.79474372f, -0.48758880f, 0.00597663f, 0.39113473f, 0.94133689f, 1.03804127f, 0.53832521f, -0.22235026f, -0.44306288f, -0.22065599f, -0.22880587f, -0.42354568f, - -1.79298887f, -1.27561542f, -0.40453013f, 0.23597108f, 1.02842032f, 1.26211371f, 0.67302878f, 0.34945977f, 0.47749022f, 0.37809966f, 0.32913783f, 0.24544337f, -0.10938763f, -0.26555659f, -0.53889493f, -0.59219154f, - 1.13009762f, 0.63132036f, 0.20308733f, 0.12539517f, -0.05215684f, -0.59255734f, -0.72324525f, -0.47416068f, -0.34730473f, -0.17547668f, -0.01869868f, -0.01336213f, -0.03177292f, -0.01470495f, 0.12726970f, 0.22627027f, - 0.77990892f, 0.11720033f, -0.36217078f, -0.11533103f, -0.09211988f, -0.10379850f, 0.04466728f, 0.23851356f, 0.32838480f, 0.57072608f, 0.78005115f, 0.64032724f, 0.04609407f, -0.53665387f, -1.07338898f, -1.26240993f, - 0.71007500f, 1.67092184f, 0.87004285f, -0.47652190f, -0.41457815f, 1.09228787f, 1.43629613f, 1.29941339f, 0.74914490f, -0.87973861f, -1.00898687f, -0.76690679f, -0.87310138f, -0.89762148f, -1.11083002f, -1.39989674f, - 0.93106313f, -0.58060200f, -1.42018765f, -1.93078113f, -1.40332079f, -1.01406592f, -0.68270775f, -0.12421160f, -0.12818640f, 0.46306788f, 0.74384671f, 1.78170251f, 1.49298768f, 0.36128067f, 0.32905160f, 1.18106291f, - -0.34612942f, -0.05241863f, 0.63278953f, 1.64696186f, 1.83789559f, 1.82381570f, 1.71656555f, 1.45437140f, 1.06980287f, 0.39137818f, -0.16457688f, -0.79497784f, -1.78896933f, -2.38820658f, -2.55386733f, -2.48443600f, - -1.86975241f, -1.08195483f, -0.57202727f, -0.39808906f, -0.40936508f, 0.09703771f, 0.81017115f, 0.38629167f, 0.19481800f, 0.19706778f, -0.03872708f, -0.18683058f, 0.37148725f, 0.91055817f, 0.85929760f, 0.73001606f, - 0.13134993f, -0.43834896f, -0.42233235f, -0.34270675f, -0.42348478f, -0.62064185f, -0.67185252f, -0.57602218f, -0.46183286f, -0.05757593f, 0.38429775f, 0.63679540f, 0.59933007f, 0.44800121f, 0.69922041f, 1.11580320f, - -3.26282616f, -2.43458949f, -1.60312382f, -1.18490625f, -0.63841390f, -0.06739227f, 0.57790279f, 1.01010243f, 0.95682720f, 0.75035821f, 0.76084039f, 0.55166704f, 0.83933875f, 1.36392702f, 1.32925064f, 1.05103737f, - 2.94202112f, 3.01169534f, 2.23272878f, 2.33910012f, 1.97620433f, 1.92572769f, -0.00413067f, -1.30712114f, -1.48714461f, -1.62849896f, -1.56921600f, -1.60110814f, -1.73339679f, -1.81275951f, -1.69381023f, -1.59029306f, - -2.29630904f, -1.61967905f, -0.50968315f, 0.70826746f, 1.31943393f, 1.58078613f, 1.31857322f, 0.52237224f, 0.09330352f, 0.13994471f, 0.02623813f, -0.21467602f, -0.33140340f, -0.32793129f, -0.24016399f, -0.16907333f, - 1.17007844f, 1.46542856f, 1.12327460f, 0.78468376f, 0.28858044f, -0.24345469f, -0.36619581f, -0.30604001f, -0.24486928f, -0.39076408f, -0.42628982f, -0.47126418f, -0.48974406f, -0.58899141f, -0.61209496f, -0.69233731f, - 1.07869290f, -1.09624499f, -1.92296142f, -2.03260639f, -0.72727691f, 0.59938120f, 1.09296276f, -0.23244761f, -0.74213456f, -0.00394467f, 0.65433789f, 0.15922442f, 0.10516506f, 0.08483738f, 1.10833114f, 1.87468404f, - -0.45930662f, 0.49568081f, 0.92195224f, 1.70200988f, 1.24720421f, 1.19845895f, 0.75959352f, 0.23323360f, -0.27099240f, -1.38259199f, -2.25979609f, -0.92875900f, -0.06647214f, -0.58552485f, -0.33254823f, -0.27214292f, - -0.34979667f, 0.75395625f, 0.28769469f, -0.85592098f, -0.65167816f, 0.61099639f, 0.60402617f, 0.14561560f, -0.35073645f, -0.56010271f, -0.46661447f, -0.33527423f, -0.00166125f, 0.46634881f, 0.62977271f, 0.07337395f, - -0.41325825f, -0.71696540f, -0.72218212f, -0.64886200f, -0.33204525f, -0.13777071f, -0.05902665f, 0.08826462f, 0.09668422f, 0.34870144f, 0.76742933f, 1.02820877f, 0.66254418f, 0.26837143f, -0.04920095f, -0.18089312f, - -3.00863529f, -3.40420466f, -1.94263495f, -0.42577604f, 1.34874808f, 1.22039392f, -0.16945247f, -0.55999693f, 0.06330206f, 1.23795253f, 0.30477631f, 0.53425336f, 1.62154688f, 1.44462099f, 0.96061888f, 0.77448714f, - 1.81574209f, 1.72942805f, 0.78817895f, 0.12550764f, -0.50423190f, -0.81032090f, -0.83940826f, -0.95575724f, -0.70482913f, -0.32127670f, -0.08073867f, -0.13170408f, -0.16649118f, -0.08610719f, -0.03381103f, 0.17581953f, - -0.84693001f, -0.20800644f, 0.25371425f, 0.56604831f, 0.68467374f, 0.74501557f, 0.69436428f, 0.53975035f, 0.44393852f, 0.30580817f, 0.06566139f, -0.27742827f, -0.57148395f, -0.67328070f, -0.81658998f, -0.90525565f, - -0.44018762f, 0.22712975f, 1.11402502f, 1.98499541f, 1.52065113f, 0.79057891f, 0.55313940f, 0.32776632f, 0.39113088f, 0.10707747f, -0.20138118f, -0.67412788f, -1.34113027f, -1.39661518f, -1.43118002f, -1.53187281f, - -0.71632657f, -0.79492959f, -1.11328698f, -1.41494496f, -1.48929785f, -1.40383584f, -1.26657215f, -1.11367689f, -0.76426307f, 0.01056535f, 0.85354567f, 1.27473730f, 1.64108006f, 2.08311127f, 2.27822947f, 1.93586484f, - 2.05008554f, 2.18328135f, 1.98567996f, 2.35703511f, 2.27653310f, 2.41056123f, 1.36801069f, 0.12761937f, -0.59913124f, -1.45799255f, -1.89092221f, -1.99613693f, -2.20251841f, -2.33272106f, -2.21702011f, -2.06236397f, - -0.88997509f, -0.45675689f, 0.38059457f, 0.51582524f, 0.11775375f, -0.01509768f, -0.18542670f, -0.33776632f, -0.39018689f, -0.33129536f, -0.13149667f, 0.00113524f, 0.03060501f, 0.32190251f, 0.62848970f, 0.74169479f, - 1.19033790f, 0.59193623f, -0.18758267f, -0.71960274f, -0.81756997f, -0.65024529f, -0.64463404f, -0.82612299f, -0.84513928f, -0.45206413f, -0.04059069f, 0.00434486f, 0.50165507f, 1.00958611f, 0.97568033f, 0.91001135f, - -2.25864394f, -2.18529992f, -1.67272884f, -1.18053068f, -0.96703519f, -0.83661833f, -0.59641534f, -0.08623307f, 0.57868270f, 1.39398557f, 2.00205076f, 1.91429603f, 1.37348845f, 1.02732012f, 0.88340938f, 0.61027091f, - 1.13384373f, 2.01444926f, 1.64076134f, 0.39967630f, 0.11211256f, 0.60599786f, 0.41069653f, -0.08528479f, -0.18299306f, -0.80418851f, -1.03743576f, -1.04941914f, -0.88831874f, -0.76292972f, -0.67716107f, -0.82980704f, - -1.17168042f, -0.44794963f, 0.01219570f, -0.09679638f, 0.01681223f, 0.42983884f, 0.69873962f, 1.14025903f, 1.28455301f, 0.60046712f, -0.18327995f, -0.56883208f, -0.60793720f, -0.38487681f, -0.31833900f, -0.40317432f, - 0.85846316f, 0.89573242f, -0.03759975f, -0.56845446f, -0.63431292f, -0.69230128f, -0.59890012f, -0.27699442f, -0.10781577f, 0.38926803f, 0.44176667f, 0.74409936f, 0.51508281f, -0.44324047f, -0.56579214f, 0.08099815f, - -3.15663729f, -3.79941004f, -3.31993311f, -2.54887019f, -1.08297819f, 1.57490155f, 2.29511481f, 2.21386433f, 2.04448334f, 1.39028095f, 1.22351492f, 1.20294900f, 1.33557966f, 1.22044095f, 0.22504752f, -0.81835038f, - 2.10765319f, 2.66375515f, 1.73697111f, 0.50664812f, -0.22472176f, -0.63409486f, -0.65405139f, -0.71248479f, -0.73053296f, -0.87990271f, -0.82710167f, -0.73244187f, -0.64629112f, -0.47294253f, -0.23431056f, -0.26615160f, - -0.03257826f, 0.53214066f, -0.00109639f, -0.42211164f, -0.51464982f, -0.59747387f, -0.63145473f, -0.49761105f, -0.36163571f, 0.00923799f, 0.32394200f, 0.34648466f, 0.32420111f, 0.44177392f, 0.52684150f, 0.55398991f, - 0.38342101f, 0.05503415f, -0.69210895f, -1.40291256f, -1.20627913f, -0.22810180f, 0.91689677f, 1.67212414f, 1.26349034f, 0.48698570f, 0.10567292f, 0.13423949f, -0.02515828f, -0.41152165f, -0.51320898f, -0.53857267f, - -2.82653388f, -3.73292024f, -3.01554952f, 0.33800837f, 1.63071077f, 3.70049918f, 1.52548217f, -0.51327972f, -0.09119392f, 0.92240352f, 2.33190356f, 1.84268123f, -0.37179294f, -0.94969237f, -1.13179438f, 0.34106773f, - 1.56686851f, 0.88339322f, 0.31264631f, -0.04528796f, -0.42838354f, -0.20342114f, 0.40102389f, 0.54537791f, 0.35383369f, -0.18334298f, -0.75234358f, -0.76217615f, -0.36188398f, -0.46147282f, -0.54662536f, -0.31820590f, - 1.24862641f, 0.57117898f, 0.32856394f, 0.39564440f, 0.31824468f, 0.20893064f, 0.02628416f, -0.15359328f, -0.37616872f, -0.26748355f, -0.12954661f, -0.12215355f, -0.31835718f, -0.55834118f, -0.61233860f, -0.55948996f, - -0.59446013f, 0.48100057f, 1.20941553f, 0.41887505f, 0.63264306f, 1.37297652f, 1.40760513f, 0.91551762f, 0.67322895f, -0.90761879f, -1.23123057f, -0.97622159f, -0.96118737f, -0.53857839f, -0.69473239f, -1.20723297f, - -0.59728936f, -1.63533369f, -2.00769344f, -1.93041740f, -1.52949359f, -0.77428525f, -0.21146300f, 0.18478098f, 0.44962772f, 0.95017605f, 1.24326918f, 1.36658626f, 1.25105966f, 1.00442735f, 1.03660313f, 1.19944572f, - 0.32910504f, 1.16199966f, 2.05499236f, 2.56854877f, 2.45081012f, 1.66017811f, 1.01838813f, 0.51773322f, -0.06505376f, -1.14261830f, -1.77930778f, -1.94467446f, -1.83142606f, -1.76577923f, -1.67433287f, -1.55856482f, - -2.64386625f, -1.44973884f, -0.70503582f, -0.39387129f, -0.07345342f, 0.04530383f, 0.12054861f, 0.18110856f, 0.21747675f, 0.44785123f, 0.60100453f, 0.60149054f, 0.48165166f, 0.67654040f, 0.91879547f, 0.97419414f, - 0.52841759f, -0.23803980f, -0.77847320f, -1.06415798f, -1.29095335f, -0.94613842f, 0.01856631f, 0.57516289f, 0.58685158f, 0.24351075f, -0.23807950f, -0.16772309f, 0.27674343f, 0.40698887f, 0.73162063f, 1.35570347f, - -2.57939825f, -1.65066455f, -0.80960514f, -0.40285025f, -0.02550543f, 0.48071345f, 0.90391140f, 1.61193038f, 1.46090124f, 0.72305123f, 0.34664153f, 0.08297581f, -0.07460306f, 0.06306698f, -0.00946438f, -0.12110157f, - 1.93616583f, 2.87229439f, 2.28910932f, 1.18636717f, 0.28185288f, 0.08337698f, 0.52019726f, -0.70876138f, -1.13139506f, -1.42927692f, -1.07719650f, -0.84569529f, -1.10761102f, -1.14612879f, -0.78606400f, -0.93723475f, - -0.83260061f, -1.02726632f, -0.72610655f, 0.18186308f, 0.34897446f, 0.12845730f, 0.04139028f, 0.52688618f, 0.69166145f, 0.76853602f, 0.83316573f, 0.74702270f, 0.29499833f, -0.33104569f, -0.74851736f, -0.89741947f, - 2.77837874f, 1.31099865f, 0.62870774f, 0.35471489f, 0.05642577f, -0.02869061f, 0.19231930f, 0.50340721f, 0.36258783f, -0.06924684f, -0.52796695f, -0.75396481f, -0.89969036f, -1.23296254f, -1.40215690f, -1.27286039f, - -2.03034497f, -1.73876167f, -1.42952672f, -1.24259095f, -0.92252541f, -0.61137126f, -0.50926746f, -0.37515247f, -0.01804868f, 0.44616051f, 0.86247078f, 1.09558380f, 1.34244283f, 1.77606518f, 1.80302809f, 1.55183866f, - -0.13073542f, 0.74480506f, 1.75612393f, 1.94677409f, 1.45854395f, 0.14973385f, 0.41257896f, 0.78276795f, 0.53033406f, -0.97322979f, -1.31039960f, -1.18457724f, -1.39195239f, -0.74765434f, -0.89874803f, -1.14436551f, - -0.34864040f, 0.37594126f, 1.12760599f, 0.69668388f, 0.42042319f, 0.18779444f, -0.10969643f, -0.21695083f, -0.15889803f, -0.31866683f, -0.31049579f, -0.24646351f, -0.37724204f, -0.33366480f, -0.20076896f, -0.18696143f, - -0.21183487f, 0.60232151f, 0.88716970f, 0.69703105f, 0.10878166f, -0.60737034f, -0.81172315f, -0.92047926f, -0.64811892f, -0.24324457f, 0.15840527f, 0.21438269f, 0.31129327f, 0.53391758f, 0.13740501f, -0.20793704f, - -4.29885487f, -4.07150539f, -2.63799263f, -0.36599561f, 1.44131158f, 1.45858072f, -0.19422385f, -1.06386090f, -0.33862479f, 1.91691551f, 0.64172657f, 0.73115700f, 2.00475202f, 1.65789788f, 1.59229150f, 1.52642575f, - 2.70538594f, 1.21062684f, 0.58857880f, 0.37060452f, 0.32021415f, 0.15108056f, -0.18531087f, -0.47434646f, -0.64590620f, -0.70151444f, -0.68058335f, -0.63299041f, -0.53628956f, -0.62363375f, -0.52279857f, -0.34311771f, - -1.21504940f, -0.39554896f, 0.66755826f, 1.39859234f, 1.07486796f, 1.12290637f, 1.04295204f, 1.14165077f, 1.23441664f, 0.53720217f, -1.08842200f, -1.71470800f, -1.43192570f, -1.01274229f, -0.48508172f, -0.87666906f, - 0.79744189f, 0.76166108f, 0.24454768f, -0.10831092f, 0.07052421f, 0.61249105f, 1.01239329f, 0.92265182f, 0.79053239f, 0.48135056f, 0.14383439f, -0.46575922f, -0.96925167f, -1.31622221f, -1.46252773f, -1.51535724f, - 0.81612871f, -1.33697557f, -1.87521893f, -0.34596308f, 1.89973642f, 0.17905631f, -0.58156390f, -1.21825474f, -1.35128034f, -0.86896364f, -0.55987250f, -0.57592082f, -0.20226923f, 0.35191711f, 1.77194975f, 3.89749413f, - 1.63600586f, 1.88172004f, 2.47282363f, 2.31646225f, 1.68082996f, 0.43732883f, 0.54619537f, 0.53604274f, -0.42499034f, -1.38097531f, -1.67316581f, -1.66333999f, -1.66730967f, -1.61301407f, -1.62366867f, -1.46094527f, - -1.13086259f, -0.59286092f, -0.77851750f, -1.03233519f, -1.00728739f, -0.89574050f, -0.77142682f, -0.49554543f, -0.07881573f, 0.54315382f, 0.97530238f, 1.12272839f, 0.97460042f, 0.97504778f, 1.10466703f, 1.08789246f, - 2.01814493f, 0.44413768f, -0.35041288f, -0.98686383f, -1.26200527f, -1.52732432f, -1.48571248f, -1.19925108f, -0.92116223f, -0.35166881f, 0.13444272f, 0.18334560f, 0.92894956f, 1.08294765f, 1.35106569f, 1.94136698f, - -1.70233870f, -1.07878027f, -0.41699769f, -0.44160483f, -0.44460656f, -0.07853597f, -0.00754784f, 0.33653711f, 1.01426686f, 1.48915964f, 0.89682530f, 0.27439080f, 0.11875833f, 0.11843921f, 0.03694301f, -0.11490828f, - 2.92061289f, 2.48313078f, 1.67219449f, 1.01289511f, 0.89753859f, 0.94593326f, 0.70215728f, 0.23868842f, -0.29061326f, -1.00973596f, -1.40595256f, -1.63034802f, -1.68974684f, -1.71427450f, -1.62221007f, -1.51026992f, - -0.53491548f, -0.78055602f, -0.76775254f, 0.10333314f, 0.89464100f, 1.39260245f, 1.42278905f, 1.08133696f, 0.66191720f, 0.26667076f, 0.06990779f, -0.05792125f, -0.54825802f, -0.97098851f, -1.11014442f, -1.12266153f, - 0.08434699f, -0.45396949f, -0.94011771f, -1.20989965f, -1.27570370f, -1.00735662f, -0.43812010f, 0.32116477f, 0.90682311f, 1.07490930f, 1.04265682f, 0.83531254f, 0.64508330f, 0.31821119f, 0.09966431f, -0.00300507f, - -3.45239663f, -3.47846075f, -3.31323927f, -2.90259299f, -2.36355887f, -1.50192157f, -0.92288952f, -0.22530010f, 0.43258717f, 1.44935400f, 2.42148671f, 2.40769873f, 2.68306011f, 3.17878912f, 2.96783805f, 2.61954501f, - 0.48284645f, 1.41799541f, 1.97243102f, 1.59009976f, 1.22294070f, 0.43320660f, -0.04294311f, -0.31344005f, -0.66525145f, -1.13038241f, -1.07639821f, -0.88736938f, -0.84264379f, -0.79497080f, -0.64026957f, -0.72585115f, - -0.53516472f, -0.76920408f, -0.88526173f, -0.38845075f, -0.11227754f, 0.13805981f, 0.30967527f, 0.39937585f, 0.29135651f, 0.31552367f, 0.32154879f, 0.11114380f, 0.10183365f, 0.23587895f, 0.26513073f, 0.20083182f, - -0.82074713f, 0.00036242f, 0.05382877f, -0.93967714f, -1.34393534f, -0.63769734f, 0.72309703f, 0.71909478f, 0.67996995f, 0.71025231f, 0.03684615f, -0.42385779f, 0.20909277f, 0.74865506f, 0.36478854f, -0.08007303f, - -3.48156475f, -2.62401860f, -1.04625145f, 0.48561624f, 1.08462887f, 1.17430353f, 0.89095108f, 0.61098007f, 0.50455996f, 0.68603781f, 0.79217569f, 0.58623668f, 0.26474313f, 0.08681209f, -0.00104191f, -0.01416800f, - 0.84688039f, 0.96543736f, 0.75181222f, 0.42822852f, 0.24904957f, 0.14177234f, -0.40028407f, -0.85658294f, -0.99971434f, -0.98122097f, -0.75656716f, -0.49934498f, -0.24276416f, 0.09868884f, 0.51868958f, 0.73591908f, - -0.06813618f, -0.46119843f, -0.30096714f, 0.02701580f, 0.39106072f, 0.62007470f, 0.37968778f, 0.26617731f, 0.19689970f, 0.13864013f, 0.13523990f, 0.07059597f, -0.06298216f, -0.21734863f, -0.46878891f, -0.64597009f, - 0.51769554f, 1.42736951f, 1.88530137f, 0.81872770f, 0.32102451f, 1.12825115f, 1.21494458f, 1.01472394f, 0.70810844f, -0.50467729f, -1.98880367f, -2.08711611f, -1.72264586f, -0.93580475f, -0.50571272f, -1.29138527f, - 0.60536537f, -0.70354528f, -1.21617652f, -1.24262631f, -1.19828977f, -1.12565262f, -1.02203112f, -0.75894521f, -0.36826442f, 0.22795933f, 0.70544758f, 0.89015550f, 1.16228260f, 1.29703247f, 1.33542695f, 1.41186140f, - 1.04571798f, 1.61006483f, 1.19302962f, 0.57809989f, 0.71546259f, 1.30149630f, 1.62036473f, 1.44726990f, 1.32882491f, 0.70680094f, -0.39181833f, -1.57019972f, -2.33882246f, -2.53038720f, -2.43836110f, -2.27754281f, - -1.70543716f, -1.02771491f, -0.55943640f, -0.54366014f, 0.38503076f, 1.17876631f, 0.37193454f, -0.12189347f, 0.01303672f, -0.31900986f, -0.63608524f, -0.16956145f, 0.42659413f, 0.80300802f, 1.20767125f, 0.69675704f, - 1.23368326f, -0.17372473f, -0.75359852f, -0.99565343f, -0.84904797f, -0.66289765f, -0.45993622f, -0.17721316f, 0.04972474f, 0.35539595f, 0.55580381f, 0.47907626f, 0.35782172f, 0.37623101f, 0.34327632f, 0.32105845f, - -2.18352213f, -1.61901373f, -1.19957932f, -1.19527760f, -1.04950866f, -0.80750101f, -0.01092868f, 0.85242547f, 1.12490981f, 0.83609667f, 0.69994996f, 0.68985497f, 0.89390672f, 1.14712210f, 1.06776086f, 0.75330468f, - 2.33432113f, 2.91068592f, 2.96537876f, 2.14989074f, 1.35332201f, -0.15166191f, -0.61009155f, -1.11607408f, -1.38841709f, -1.32795548f, -1.18652766f, -1.19841345f, -1.27066378f, -1.28720326f, -1.20653804f, -0.97005218f, - -1.23488338f, -0.82668707f, -0.18190692f, 0.80577567f, 1.40765006f, 1.57572199f, 0.77649472f, 0.06817818f, -0.35316133f, -0.31163295f, -0.22814807f, -0.08516639f, -0.14974413f, -0.40747307f, -0.44196718f, -0.41305033f, - 1.49614141f, 2.17073361f, 1.21828130f, 0.24082715f, -0.04653730f, -0.02674890f, 0.07730547f, -0.75552212f, -0.53247648f, 0.68923075f, 0.51413502f, -1.15304142f, -1.36047405f, -1.08476009f, -0.71333064f, -0.73376398f, - -0.89704242f, -1.73833976f, -1.54624918f, -0.75197415f, -0.28436966f, -0.17513881f, -0.18327761f, -0.08090335f, 0.17526730f, 0.62711579f, 0.87938919f, 0.73687059f, 0.73766468f, 0.77613800f, 0.76077200f, 0.96407748f, - -0.74442989f, 0.06393849f, 0.79593747f, 2.27945407f, 2.65112193f, 2.16937280f, 1.04534068f, 0.40390110f, -0.66651353f, -1.35166042f, -1.46612345f, -0.64581600f, -0.65681647f, -1.60629861f, -1.31557834f, -0.95583049f, - 1.36402643f, 1.80223774f, 0.69837068f, -0.49496040f, -0.78242114f, -0.27168915f, 0.02445085f, -0.20866271f, -0.30035706f, -0.41170635f, -0.35841577f, -0.34242299f, -0.28692410f, -0.02094657f, -0.05934480f, -0.35123483f, - -1.08520561f, -0.84120058f, -0.40604501f, -0.30838475f, -0.39817946f, -0.45244145f, -0.46460261f, -0.31407296f, -0.03689281f, 0.38084328f, 0.75874597f, 0.64589942f, 0.68713572f, 0.85059140f, 0.70295555f, 0.28085506f, - -3.41901495f, -4.05624120f, -2.77833774f, -0.25403214f, 1.87889428f, 1.49402114f, -0.04104013f, -0.12322346f, 0.66403332f, 2.05218773f, 0.76725378f, 0.75987949f, 1.64445951f, 1.18046450f, 0.23904189f, -0.00834539f, - 2.34563559f, 1.85433514f, 0.92188091f, 0.00938003f, -0.66632165f, -1.24128642f, -1.45925477f, -1.45794931f, -1.45009658f, -1.08637380f, -0.53948104f, -0.13215543f, 0.79501605f, 0.54741060f, 0.55538134f, 1.00387907f, - 0.18830608f, 0.82743615f, 0.71353361f, 0.08375013f, 0.72945362f, 1.56781385f, 0.82203061f, -0.15761113f, -1.14514559f, -0.94404839f, -0.45524505f, -0.03539938f, -0.38522988f, -0.55123197f, -0.43254198f, -0.82587158f, - 0.28717168f, 1.26620628f, 1.79284485f, 0.74811924f, 0.75340319f, 0.55244948f, 0.46108770f, 0.62189892f, 0.63524206f, -0.36020964f, -0.49840190f, -0.49783437f, -1.24630499f, -1.48121128f, -1.52882801f, -1.50563245f, - 0.77651863f, -0.09801613f, -0.65368548f, -1.42314584f, -1.95826046f, -2.20248886f, -1.97940063f, -1.63600078f, -1.05805019f, -0.03308653f, 1.18890487f, 1.59425997f, 1.56951997f, 1.72023665f, 1.99206238f, 2.20063258f, - 1.86036810f, 1.95524352f, 1.65802754f, 0.51762484f, 0.32278641f, 1.41534130f, 1.58480385f, 1.00644422f, -0.43304110f, -1.52615221f, -1.54409319f, -1.50951389f, -1.44095494f, -1.33336688f, -1.41459830f, -1.11891940f, - -0.48994782f, -0.25738925f, -0.03744629f, -0.08936731f, -0.21819055f, -0.21749988f, -0.57009207f, -0.68163031f, -0.77904329f, -0.92638722f, -0.49253451f, -0.11015934f, 0.49328977f, 1.25069491f, 1.61419932f, 1.51150480f, - 2.17925129f, 0.65744215f, -0.14102877f, -0.68226531f, -0.86240255f, -0.96233313f, -0.77240075f, -0.60150667f, -0.43620670f, -0.12974041f, 0.06940761f, 0.29313968f, 0.32005914f, 0.04484663f, 0.20342365f, 0.82031433f, - -2.73276927f, -1.95293295f, -1.25302447f, -1.26607638f, -1.03464322f, -0.41097672f, 0.11299908f, 0.61306244f, 1.35234054f, 1.98785456f, 1.65758988f, 0.94482039f, 0.67093436f, 0.60201696f, 0.38959545f, 0.31920903f, - 1.99599002f, 1.78113188f, 1.60094449f, 1.49585133f, 1.05949606f, 0.38027999f, -0.00956917f, -0.37696778f, -0.58734884f, -0.88374264f, -1.14734587f, -1.24114441f, -1.17843206f, -1.09199503f, -0.92371805f, -0.87342960f, - -1.37903570f, -0.79248227f, 0.13536234f, 0.47656459f, 0.43589978f, 0.88461367f, 1.02738581f, 0.55354663f, 0.25049941f, -0.28501314f, -0.80941419f, -0.81019030f, -0.45648923f, 0.11389766f, 0.39621982f, 0.25863532f, - 2.10361489f, 0.37593562f, -0.16944555f, -0.32212923f, -0.22241176f, -0.24351656f, -0.27375398f, 0.02762124f, 0.11073362f, 0.23273069f, 0.27063497f, 0.08607178f, -0.19792432f, -0.48410706f, -0.59195084f, -0.70210352f, - -3.28081022f, -2.84286219f, -2.41405615f, -2.18965898f, -1.85813828f, -1.04835079f, -0.44771380f, 0.59206456f, 1.50301948f, 2.07448941f, 2.16550955f, 1.89856464f, 1.75678779f, 1.60095964f, 1.36941840f, 1.12077632f, - 1.20650745f, 1.87107653f, 1.86883453f, 1.42456949f, 0.48789223f, -0.72412798f, -1.11112426f, -1.49029508f, -1.30798779f, -1.39394685f, -1.21186297f, -0.51923241f, 0.01995250f, 0.34176002f, 0.40195072f, 0.13603383f, - 1.27785134f, 0.88553037f, 0.16900733f, -0.27809430f, -1.01525323f, -1.49395836f, -1.43232130f, -1.19784251f, -0.74210861f, -0.08619940f, 0.47709237f, 0.55331864f, 0.84110624f, 0.88279667f, 0.58250791f, 0.57656718f, - 0.33221429f, 1.11386403f, 0.75316099f, -0.54031614f, -1.07863165f, -0.21932249f, 1.22065947f, 1.15034668f, 1.03141160f, -0.31201434f, -1.38480174f, -0.81360834f, -0.27523041f, 0.24071536f, -0.19254386f, -1.02590322f, - -1.49213877f, -2.62687029f, -1.76800978f, 0.37484393f, 2.24342021f, 1.70797214f, 0.00785579f, -0.16576749f, 0.40170467f, 1.53774796f, 0.29192482f, 0.32972463f, 0.96040034f, 0.07052406f, -0.75744205f, -1.11588939f, - 1.68310221f, 0.62723214f, -0.21848789f, -0.50907306f, -0.77679516f, -0.86027718f, -0.37120564f, 0.20445818f, 0.27312526f, -0.13982446f, -0.56141448f, -0.66669228f, 0.06397763f, 0.19621457f, 0.32877219f, 0.72688794f, - 0.71839263f, 0.21641507f, 0.34358239f, 1.05799089f, 1.05814284f, 0.52787967f, 0.14046002f, 0.11966559f, 0.07361240f, -0.17447064f, -0.37909417f, -0.61722985f, -0.71730019f, -0.79744166f, -0.77133987f, -0.79926472f, - -0.02890014f, 0.92802997f, 1.03744813f, 0.32870919f, 0.07886022f, 0.63362031f, 0.46497182f, 0.14157700f, -0.03057580f, -0.54785692f, -1.11970728f, -1.36023434f, -0.91731394f, 0.07493639f, 0.47210281f, -0.15566707f, - -0.69638941f, -0.91666102f, -1.56178072f, -1.95501706f, -1.82786692f, -1.74880889f, -1.34684465f, 0.11048340f, 1.37545972f, 1.36714659f, 1.44286472f, 1.29857548f, 1.10826459f, 1.56371080f, 1.18624590f, 0.60061806f, - -0.68066861f, 0.38195183f, 1.51822296f, 2.21510524f, 2.33189221f, 1.97513513f, 1.15635207f, 1.51498823f, 1.49065161f, -0.27868821f, -1.78208773f, -2.20070549f, -2.26038069f, -2.05737950f, -1.59696081f, -1.72742716f, - -2.17324712f, -1.42748120f, -0.47105336f, 0.06399853f, -0.10139724f, -0.33208523f, -0.36226578f, -0.45684329f, -0.45421750f, -0.02950979f, 0.57908509f, 0.82823657f, 0.84044612f, 0.96336259f, 1.18058199f, 1.35238916f, - 0.30637595f, -0.07750454f, -0.01603143f, -0.03845729f, -0.46768884f, -0.33028351f, 0.33893858f, 0.66006523f, 0.64603598f, 0.25681503f, -0.24604284f, -0.37133227f, -0.20588021f, -0.28072164f, -0.22555667f, 0.05126849f, - -1.81904207f, -1.97008939f, -1.38138723f, -0.56721565f, 0.08439254f, 0.50012417f, 0.41461731f, 0.70946239f, 0.65844196f, 0.50418711f, 0.67016347f, 0.85608609f, 0.63818532f, 0.38340644f, 0.22816114f, 0.09050718f, - 3.82551321f, 3.02994002f, 1.79732057f, 1.05862951f, 0.33021546f, 0.01969982f, -0.57482284f, -1.10367492f, -1.21202781f, -1.06293594f, -0.97966329f, -1.01767532f, -1.10340104f, -1.13918652f, -1.02503523f, -0.84289579f, - -2.06530906f, -1.02138773f, 0.19121847f, 0.64135688f, 0.47353945f, 0.29125589f, 0.17346435f, 0.09846354f, 0.14173379f, 0.44108119f, 0.42909595f, 0.13671490f, -0.09429711f, 0.06651142f, 0.02429001f, 0.07226851f, - 1.63249192f, 0.94436017f, 0.65530634f, 0.76476367f, 1.10302458f, 1.20701875f, 0.88073298f, 0.43640158f, -0.07220279f, -0.39214092f, -0.60759685f, -0.87296187f, -1.13810886f, -1.40490240f, -1.54422408f, -1.59196182f, - -2.96354446f, -2.66922503f, -2.35080143f, -1.84250497f, -1.24255764f, -0.53451683f, -0.22318900f, 0.15923121f, 0.44185767f, 0.90571587f, 1.20883041f, 1.21786822f, 1.54160670f, 2.22751201f, 2.21090650f, 1.91281110f, - -0.09062710f, 0.80687377f, 1.69510603f, 2.38364009f, 2.08626387f, 1.00304738f, 0.66997543f, 0.04541459f, -0.35848319f, -0.80600051f, -1.65487629f, -2.04562701f, -2.03869244f, -1.11898388f, 0.04427361f, -0.62130392f, - -0.99015493f, -0.47096904f, 0.39660329f, 1.29486538f, 1.58962509f, 0.33608325f, -0.41798602f, -0.54749259f, -0.00991716f, -0.02240745f, -0.93933104f, -0.69735917f, -0.17095973f, 0.19272004f, 0.29655039f, 0.16013060f, - -0.50032252f, -0.00936927f, 0.13895740f, 0.11955067f, -0.00882381f, -0.31634261f, -0.30280409f, -0.10222302f, -0.04951847f, 0.13870349f, 0.43344396f, 0.56559398f, 0.24092822f, -0.05903140f, -0.12616386f, -0.16257807f, - -4.66891396f, -4.62476618f, -2.72504562f, -0.11626174f, 1.38983931f, 1.37676145f, 0.15183709f, -0.07491020f, 0.54070200f, 1.84266982f, 0.65624201f, 0.70100510f, 1.81013255f, 1.75739872f, 0.97189375f, 1.01141647f, - 3.82513926f, 1.74864093f, 0.71663856f, -0.06702053f, -0.46144066f, -0.68679697f, -0.83513366f, -0.69088271f, -0.63484378f, -0.48492965f, -0.30596681f, -0.27767202f, -0.29901877f, -0.55135905f, -0.55561568f, -0.43973879f, - -1.83506374f, -1.72166910f, -0.66010462f, 1.71984506f, 2.40983158f, 1.81667012f, 1.44944523f, 1.31000271f, 0.86661928f, 0.58345030f, -0.05866711f, -0.37487717f, -0.74598532f, -1.38021702f, -1.58454113f, -1.79473786f, - 0.16939787f, 1.05222199f, 0.60925979f, -0.08245082f, -0.05127361f, -0.01958411f, -0.04649851f, 0.11008216f, 0.21213694f, -0.02520358f, -0.00574917f, -0.04591061f, -0.24174211f, -0.38605009f, -0.52417208f, -0.72446423f, - -0.07063893f, -1.74970518f, -1.79098807f, -1.50819293f, -1.06029380f, -1.44474701f, -1.24662095f, -1.20341521f, -1.18506899f, -0.88327503f, -0.47818767f, 0.53478172f, 1.99588317f, 2.01785324f, 2.86156101f, 5.21105441f, - 1.18577996f, 1.82923029f, 2.00218590f, 1.75897045f, 1.55666666f, 1.15213194f, 1.02264996f, 0.58845201f, 0.39345304f, -0.25590088f, -1.11168611f, -1.75581078f, -2.05745836f, -2.20440070f, -2.14031291f, -1.96395016f, - -0.49703383f, -0.62650520f, -0.98853522f, -1.16849765f, -1.02786508f, -0.51447634f, -0.02538523f, 0.08704333f, 0.03359763f, 0.17774887f, 0.30484412f, 0.32520735f, 0.62948522f, 1.14552041f, 1.22336987f, 0.92148234f, - -0.07188198f, 0.18500810f, -0.22096354f, -0.56851679f, -0.98832362f, -1.20304996f, -1.11943691f, -1.09383807f, -0.85446062f, -0.29360582f, 0.44439822f, 0.64306330f, 1.09971537f, 1.50142342f, 1.36382024f, 1.17664847f, - -1.21730935f, -1.48884440f, -1.78500620f, -1.57607634f, -0.82775565f, -0.09612994f, 0.49933981f, 1.06136160f, 1.31463011f, 1.46090638f, 1.14896512f, 0.64320117f, 0.39111587f, 0.36061229f, 0.18325675f, -0.07226660f, - 2.30575156f, 2.37005513f, 1.37776397f, 0.78509487f, 0.18022242f, -0.13093354f, 0.22126477f, -0.11444642f, -0.35716968f, -0.59492665f, -0.35765935f, -0.44655201f, -1.03213345f, -1.27074059f, -1.44000075f, -1.49558947f, - -1.00874079f, -1.64011865f, -1.86084729f, -1.06805908f, 0.07222945f, 1.36179475f, 1.87160360f, 1.76248472f, 1.52374330f, 1.04119855f, 0.73448166f, 0.13768018f, -0.49711929f, -0.73696841f, -0.89885406f, -0.79450886f + 1.0144043f, 1.1826172f, 0.3269043f, -0.6411133f, -1.2163086f, -1.1411133f, -1.1525879f, -0.8898926f, -0.19604492f, 0.7402344f, 1.1782227f, 1.0830078f, 0.78222656f, 0.26953125f, -0.33203125f, -1.0080566f, + -0.38916016f, -0.31347656f, -1.1826172f, -2.036621f, -2.086914f, -1.8569336f, -1.637207f, -1.3156738f, -0.4182129f, 0.50634766f, 1.2770996f, 1.3771973f, 1.8566895f, 2.3503418f, 2.3015137f, 1.5678711f, + 0.43652344f, 1.8859863f, 2.8059082f, 2.2385254f, 1.5480957f, 0.14331055f, 0.07299805f, -1.1218262f, -1.1103516f, -0.7336426f, -0.4194336f, -0.89624023f, -1.0429688f, -0.79785156f, -1.204834f, -1.8046875f, + 1.5612793f, 0.9321289f, 0.58740234f, 0.46313477f, 0.21899414f, 0.0625f, -0.16918945f, -0.34423828f, -0.44726562f, -0.61035156f, -0.6398926f, -0.57177734f, -0.38500977f, -0.25927734f, -0.20898438f, -0.18945312f, + 1.0131836f, 1.9333496f, 0.8395996f, -0.4963379f, -0.66015625f, -0.38012695f, 0.056396484f, 0.31201172f, 0.810791f, 0.66674805f, -0.022705078f, -0.7980957f, -0.9230957f, -0.63134766f, -0.68530273f, -1.034668f, + -0.842041f, -0.08642578f, 0.49243164f, 0.5827637f, 1.1630859f, 1.3693848f, 0.7233887f, 0.2705078f, 0.34692383f, 0.0068359375f, -0.2319336f, -0.33032227f, -0.5895996f, -0.67626953f, -0.9953613f, -1.2033691f, + 2.0810547f, 1.8205566f, 1.1000977f, 0.47216797f, 0.08251953f, -0.48510742f, -0.67285156f, -0.55322266f, -0.4777832f, -0.546875f, -0.579834f, -0.5891113f, -0.5119629f, -0.4255371f, -0.32910156f, -0.38500977f, + 1.730957f, 1.3063965f, 0.53466797f, 0.23144531f, 0.04248047f, 0.0036621094f, 0.0949707f, 0.15942383f, 0.1977539f, 0.19946289f, 0.21899414f, 0.064697266f, -0.43408203f, -0.94750977f, -1.5297852f, -1.8735352f, + 1.6611328f, 2.8601074f, 1.7668457f, -0.12988281f, -0.27978516f, 1.199707f, 1.4865723f, 1.220459f, 0.61865234f, -1.2509766f, -1.5700684f, -1.3425293f, -1.3532715f, -1.3083496f, -1.5671387f, -2.0112305f, + 1.8820801f, 0.6086426f, -0.52319336f, -1.5842285f, -1.2685547f, -0.9067383f, -0.6323242f, -0.203125f, -0.25878906f, 0.091796875f, 0.18286133f, 1.2060547f, 1.0129395f, -0.049560547f, -0.1274414f, 0.5698242f, + 0.60498047f, 1.1367188f, 1.5297852f, 1.9936523f, 1.9726562f, 1.9311523f, 1.7668457f, 1.3752441f, 0.939209f, 0.020019531f, -0.72558594f, -1.3706055f, -2.269043f, -2.7990723f, -3.010254f, -3.0957031f, + -0.9187012f, 0.107177734f, 0.32495117f, -0.051513672f, -0.2746582f, 0.2043457f, 0.8605957f, 0.30737305f, 0.064208984f, -0.1743164f, -0.5998535f, -0.7624512f, -0.10864258f, 0.49975586f, 0.40283203f, 0.118896484f, + 1.0822754f, 0.7507324f, 0.47460938f, 0.00390625f, -0.28881836f, -0.5131836f, -0.62158203f, -0.6550293f, -0.59228516f, -0.42895508f, -0.17675781f, 0.061035156f, 0.119140625f, 0.037109375f, 0.24267578f, 0.5046387f, + -2.3117676f, -1.2453613f, -0.7062988f, -0.83813477f, -0.5036621f, 0.040039062f, 0.6281738f, 0.93115234f, 0.826416f, 0.3791504f, 0.19970703f, -0.023925781f, 0.35913086f, 0.953125f, 0.87280273f, 0.43969727f, + 3.8930664f, 4.2009277f, 3.1296387f, 2.685791f, 2.1108398f, 2.032959f, 0.046142578f, -1.3862305f, -1.6176758f, -1.9997559f, -2.130371f, -2.1767578f, -2.213623f, -2.2236328f, -2.1501465f, -2.201416f, + -1.3452148f, -0.43041992f, 0.38720703f, 1.0549316f, 1.4541016f, 1.6882324f, 1.3688965f, 0.44335938f, -0.037109375f, -0.23144531f, -0.5349121f, -0.7902832f, -0.81152344f, -0.73876953f, -0.6965332f, -0.78027344f, + 2.1210938f, 2.654541f, 2.0202637f, 1.1313477f, 0.42333984f, -0.13598633f, -0.31591797f, -0.38500977f, -0.37548828f, -0.7619629f, -0.9873047f, -1.046875f, -0.9699707f, -0.99975586f, -1.0686035f, -1.3034668f, + 2.0297852f, 0.09301758f, -1.026123f, -1.6860352f, -0.5925293f, 0.7067871f, 1.1433105f, -0.31152344f, -0.8725586f, -0.37524414f, 0.09326172f, -0.4165039f, -0.375f, -0.32592773f, 0.65185547f, 1.2634277f, + 0.49169922f, 1.6848145f, 1.8188477f, 2.048584f, 1.3818359f, 1.3059082f, 0.8100586f, 0.15429688f, -0.40161133f, -1.7539062f, -2.8208008f, -1.5043945f, -0.54663086f, -0.9963379f, -0.7890625f, -0.8833008f, + 0.60131836f, 1.9431152f, 1.1845703f, -0.50927734f, -0.51708984f, 0.7182617f, 0.6542969f, 0.06665039f, -0.48120117f, -0.9313965f, -1.0275879f, -0.9108887f, -0.48168945f, 0.055664062f, 0.17333984f, -0.5378418f, + 0.5378418f, 0.47216797f, 0.17480469f, -0.3022461f, -0.19726562f, -0.030517578f, -0.008544922f, 0.009277344f, -0.033935547f, -0.022705078f, 0.20629883f, 0.45239258f, 0.18237305f, -0.14233398f, -0.50561523f, -0.7922363f, + -2.0576172f, -2.215088f, -1.0456543f, -0.07910156f, 1.4833984f, 1.3276367f, -0.119140625f, -0.638916f, -0.06713867f, 0.8666992f, -0.25634766f, -0.041503906f, 1.1413574f, 1.0339355f, 0.5041504f, 0.16333008f, + 2.7668457f, 2.9187012f, 1.6850586f, 0.47216797f, -0.3696289f, -0.70288086f, -0.7890625f, -1.034668f, -0.8354492f, -0.69262695f, -0.6418457f, -0.70751953f, -0.6467285f, -0.49682617f, -0.49023438f, -0.43530273f, + 0.104003906f, 0.9812012f, 1.1506348f, 0.9128418f, 0.81933594f, 0.8522949f, 0.7446289f, 0.46069336f, 0.31347656f, -0.06542969f, -0.49536133f, -0.85302734f, -1.0515137f, -1.0839844f, -1.2729492f, -1.5166016f, + 0.5107422f, 1.4162598f, 2.0109863f, 2.331787f, 1.6552734f, 0.8979492f, 0.6035156f, 0.2487793f, 0.26049805f, -0.26416016f, -0.7624512f, -1.2497559f, -1.8212891f, -1.807373f, -1.8876953f, -2.1430664f, + 0.23461914f, 0.3942871f, -0.2163086f, -1.0683594f, -1.3544922f, -1.2963867f, -1.2163086f, -1.192627f, -0.8947754f, -0.36083984f, 0.29248047f, 0.6989746f, 1.1608887f, 1.6723633f, 1.8217773f, 1.324707f, + 3.0012207f, 3.3725586f, 2.8825684f, 2.7036133f, 2.4111328f, 2.5178223f, 1.418457f, 0.048583984f, -0.7297363f, -1.8293457f, -2.4519043f, -2.5717773f, -2.6826172f, -2.7434082f, -2.6733398f, -2.673584f, + 0.061035156f, 0.7324219f, 1.2775879f, 0.8625488f, 0.2524414f, 0.092285156f, -0.13500977f, -0.41674805f, -0.52075195f, -0.7026367f, -0.69262695f, -0.5744629f, -0.4494629f, -0.08886719f, 0.17211914f, 0.1303711f, + 2.1413574f, 1.7810059f, 0.7092285f, -0.37304688f, -0.6828613f, -0.54296875f, -0.5942383f, -0.9050293f, -0.97558594f, -0.8232422f, -0.6015625f, -0.57128906f, 0.021484375f, 0.59887695f, 0.5192871f, 0.29882812f, + -1.3076172f, -0.99609375f, -0.7758789f, -0.83374023f, -0.8322754f, -0.72924805f, -0.5461426f, -0.1652832f, 0.4482422f, 1.0227051f, 1.440918f, 1.338623f, 0.89331055f, 0.6164551f, 0.42700195f, -0.0009765625f, + 2.084961f, 3.2036133f, 2.5375977f, 0.7463379f, 0.24682617f, 0.7133789f, 0.46118164f, -0.16430664f, -0.31347656f, -1.1755371f, -1.5986328f, -1.6252441f, -1.3684082f, -1.1738281f, -1.1335449f, -1.440918f, + -0.22070312f, 0.74121094f, 0.9091797f, 0.25f, 0.15161133f, 0.5371094f, 0.74902344f, 1.0612793f, 1.1540527f, 0.22924805f, -0.74438477f, -1.1445312f, -1.0881348f, -0.7956543f, -0.7746582f, -1.0144043f, + 1.8095703f, 2.084961f, 0.859375f, -0.22167969f, -0.49951172f, -0.58496094f, -0.548584f, -0.35595703f, -0.23828125f, 0.018066406f, -0.119384766f, 0.16845703f, 0.03491211f, -0.8540039f, -1.0222168f, -0.53027344f, + -2.2055664f, -2.6103516f, -2.4230957f, -2.2021484f, -0.9482422f, 1.682373f, 2.345459f, 2.1347656f, 1.9140625f, 1.019043f, 0.6623535f, 0.62719727f, 0.85546875f, 0.8095703f, -0.23144531f, -1.4296875f, + 3.0585938f, 3.8530273f, 2.633789f, 0.8532715f, -0.09008789f, -0.52685547f, -0.60375977f, -0.7915039f, -0.861084f, -1.2512207f, -1.3881836f, -1.3081055f, -1.1264648f, -0.88378906f, -0.6906738f, -0.8774414f, + 0.91845703f, 1.7211914f, 0.89575195f, -0.07543945f, -0.3798828f, -0.49023438f, -0.5810547f, -0.57666016f, -0.4921875f, -0.36206055f, -0.23706055f, -0.22924805f, -0.15600586f, 0.03100586f, 0.0703125f, -0.057128906f, + 1.3344727f, 1.2441406f, 0.20483398f, -1.0561523f, -1.0715332f, -0.12084961f, 0.96728516f, 1.5930176f, 1.1330566f, 0.115722656f, -0.45532227f, -0.44140625f, -0.5053711f, -0.8222656f, -0.96972656f, -1.1499023f, + -1.8754883f, -2.5437012f, -2.1186523f, 0.6845703f, 1.7653809f, 3.8078613f, 1.5759277f, -0.59228516f, -0.22167969f, 0.5510254f, 1.770752f, 1.2670898f, -0.85180664f, -1.3605957f, -1.5881348f, -0.27026367f, + 2.5178223f, 2.0725098f, 1.2094727f, 0.30126953f, -0.29370117f, -0.095947266f, 0.45141602f, 0.4663086f, 0.22338867f, -0.5546875f, -1.3134766f, -1.3378906f, -0.842041f, -0.87231445f, -1.0029297f, -0.92944336f, + 2.199707f, 1.7602539f, 1.2255859f, 0.74243164f, 0.45288086f, 0.3161621f, 0.076660156f, -0.23266602f, -0.5065918f, -0.6386719f, -0.6906738f, -0.6977539f, -0.798584f, -0.9692383f, -1.0688477f, -1.1706543f, + 0.3564453f, 1.670166f, 2.1064453f, 0.765625f, 0.767334f, 1.4802246f, 1.4580078f, 0.8364258f, 0.5427246f, -1.2788086f, -1.7922363f, -1.552002f, -1.4414062f, -0.9494629f, -1.151123f, -1.8183594f, + 0.35375977f, -0.44604492f, -1.1108398f, -1.5837402f, -1.3947754f, -0.6669922f, -0.16113281f, 0.10571289f, 0.3190918f, 0.5788574f, 0.6821289f, 0.7907715f, 0.7709961f, 0.59375f, 0.5800781f, 0.58813477f, + 1.2800293f, 2.3510742f, 2.9519043f, 2.9152832f, 2.5854492f, 1.7675781f, 1.0688477f, 0.4387207f, -0.19555664f, -1.513916f, -2.340332f, -2.5202637f, -2.3115234f, -2.1765137f, -2.1308594f, -2.1696777f, + -1.6928711f, -0.26049805f, 0.19189453f, -0.04711914f, 0.061279297f, 0.15258789f, 0.17089844f, 0.10205078f, 0.08691406f, 0.076660156f, 0.039794922f, 0.025878906f, 0.0014648438f, 0.265625f, 0.46240234f, 0.3630371f, + 1.4794922f, 0.9511719f, 0.1184082f, -0.7175293f, -1.15625f, -0.8388672f, 0.068847656f, 0.49609375f, 0.45629883f, -0.12768555f, -0.79907227f, -0.7434082f, -0.20336914f, -0.00390625f, 0.27514648f, 0.74438477f, + -1.628418f, -0.46142578f, 0.087402344f, -0.056152344f, 0.10913086f, 0.58813477f, 0.9543457f, 1.532959f, 1.3303223f, 0.35180664f, -0.21435547f, -0.49267578f, -0.5546875f, -0.34765625f, -0.4658203f, -0.7324219f, + 2.887207f, 4.0615234f, 3.1860352f, 1.532959f, 0.4165039f, 0.19067383f, 0.57055664f, -0.7878418f, -1.2619629f, -1.8005371f, -1.6381836f, -1.4213867f, -1.5876465f, -1.5568848f, -1.2424316f, -1.548584f, + 0.1184082f, 0.16186523f, 0.17089844f, 0.52856445f, 0.48364258f, 0.23583984f, 0.091796875f, 0.4477539f, 0.56103516f, 0.3972168f, 0.27197266f, 0.17138672f, -0.1850586f, -0.74194336f, -1.204834f, -1.5085449f, + 3.7294922f, 2.5002441f, 1.5256348f, 0.701416f, 0.19116211f, 0.07861328f, 0.24267578f, 0.4243164f, 0.23217773f, -0.4404297f, -1.0891113f, -1.3295898f, -1.3798828f, -1.6437988f, -1.8586426f, -1.8840332f, + -1.0793457f, -0.54956055f, -0.53271484f, -0.8959961f, -0.7878418f, -0.50390625f, -0.45898438f, -0.45410156f, -0.14868164f, 0.07495117f, 0.30126953f, 0.5197754f, 0.8623047f, 1.3652344f, 1.3466797f, 0.9406738f, + 0.8203125f, 1.934082f, 2.6530762f, 2.293457f, 1.5932617f, 0.25708008f, 0.46289062f, 0.7038574f, 0.39990234f, -1.3444824f, -1.871582f, -1.7602539f, -1.8720703f, -1.1584473f, -1.3552246f, -1.7556152f, + 0.6022949f, 1.5651855f, 2.024414f, 1.043457f, 0.5551758f, 0.29516602f, -0.059326172f, -0.29589844f, -0.28930664f, -0.6899414f, -0.87158203f, -0.8222656f, -0.8574219f, -0.74438477f, -0.65722656f, -0.7980957f, + 0.7392578f, 1.7915039f, 1.7841797f, 1.0437012f, 0.2434082f, -0.5f, -0.76123047f, -0.9995117f, -0.77856445f, -0.61450195f, -0.4025879f, -0.36132812f, -0.16894531f, 0.123046875f, -0.3190918f, -0.8190918f, + -3.3479004f, -2.8823242f, -1.7409668f, -0.01928711f, 1.5759277f, 1.565918f, -0.14379883f, -1.1428223f, -0.46923828f, 1.5456543f, 0.080566406f, 0.15551758f, 1.5246582f, 1.2470703f, 1.1359863f, 0.9152832f, + 3.6564941f, 2.3999023f, 1.4855957f, 0.71728516f, 0.45483398f, 0.25854492f, -0.13500977f, -0.5534668f, -0.7763672f, -1.0727539f, -1.2416992f, -1.2087402f, -1.0163574f, -1.0344238f, -0.97924805f, -0.9543457f, + -0.26391602f, 0.7937012f, 1.5644531f, 1.7453613f, 1.2094727f, 1.2302246f, 1.0932617f, 1.0627441f, 1.1040039f, 0.16601562f, -1.6494141f, -2.2905273f, -1.9121094f, -1.423584f, -0.94140625f, -1.487793f, + 1.7485352f, 1.9509277f, 1.1413574f, 0.23828125f, 0.20532227f, 0.71972656f, 1.0627441f, 0.84375f, 0.6599121f, 0.11010742f, -0.41723633f, -1.0415039f, -1.4494629f, -1.7270508f, -1.9189453f, -2.126709f, + 1.7670898f, -0.14770508f, -0.9782715f, 0.0007324219f, 2.0344238f, 0.28637695f, -0.53125f, -1.2973633f, -1.4816895f, -1.2402344f, -1.1208496f, -1.1516113f, -0.68237305f, -0.05883789f, 1.3154297f, 3.286377f, + 2.586914f, 3.0708008f, 3.369629f, 2.663086f, 1.8154297f, 0.54467773f, 0.5966797f, 0.45703125f, -0.5554199f, -1.7521973f, -2.234375f, -2.2390137f, -2.147461f, -2.0239258f, -2.0800781f, -2.0722656f, + -0.17993164f, 0.5961914f, 0.1184082f, -0.6855469f, -0.8725586f, -0.7883301f, -0.72094727f, -0.5744629f, -0.20922852f, 0.171875f, 0.41430664f, 0.54711914f, 0.49438477f, 0.564209f, 0.64819336f, 0.4765625f, + 2.9692383f, 1.6333008f, 0.5463867f, -0.6401367f, -1.1271973f, -1.4199219f, -1.4353027f, -1.2783203f, -1.0517578f, -0.7229004f, -0.4267578f, -0.39233398f, 0.44873047f, 0.67211914f, 0.89453125f, 1.3300781f, + -0.7512207f, 0.11035156f, 0.47998047f, -0.0949707f, -0.30981445f, 0.028808594f, 0.04272461f, 0.25756836f, 0.88378906f, 1.1179199f, 0.33569336f, -0.30126953f, -0.36132812f, -0.29223633f, -0.4194336f, -0.7260742f, + 3.871582f, 3.6723633f, 2.5690918f, 1.3596191f, 1.0322266f, 1.0532227f, 0.7524414f, 0.15966797f, -0.42114258f, -1.3811035f, -1.967041f, -2.2060547f, -2.1699219f, -2.125f, -2.0786133f, -2.121582f, + 0.41601562f, 0.4086914f, 0.12915039f, 0.44995117f, 1.0292969f, 1.5f, 1.4731445f, 1.0021973f, 0.53149414f, -0.10473633f, -0.49121094f, -0.6335449f, -1.0283203f, -1.3818359f, -1.5666504f, -1.7338867f, + 1.0354004f, 0.7351074f, -0.04321289f, -0.86328125f, -1.1411133f, -0.89990234f, -0.3876953f, 0.2421875f, 0.7763672f, 0.7036133f, 0.4814453f, 0.25952148f, 0.16503906f, -0.0925293f, -0.35668945f, -0.6142578f, + -2.5014648f, -2.2893066f, -2.4162598f, -2.5559082f, -2.2287598f, -1.3945312f, -0.8725586f, -0.30419922f, 0.30200195f, 1.078125f, 1.8603516f, 1.8320312f, 2.2028809f, 2.7680664f, 2.5114746f, 2.0083008f, + 1.4338379f, 2.6071777f, 2.8693848f, 1.9367676f, 1.357666f, 0.54052734f, 0.0073242188f, -0.39257812f, -0.7956543f, -1.501709f, -1.6374512f, -1.4631348f, -1.3227539f, -1.2058105f, -1.0966797f, -1.3371582f, + 0.41577148f, 0.41992188f, 0.01171875f, -0.041748047f, 0.022460938f, 0.24536133f, 0.36010742f, 0.3203125f, 0.16088867f, -0.055664062f, -0.23950195f, -0.4645996f, -0.37817383f, -0.17480469f, -0.19140625f, -0.4104004f, + 0.1303711f, 1.1894531f, 0.9506836f, -0.5930176f, -1.2092285f, -0.53027344f, 0.7734375f, 0.6401367f, 0.54956055f, 0.3388672f, -0.5241699f, -0.9995117f, -0.2709961f, 0.33789062f, -0.091552734f, -0.69140625f, + -2.5305176f, -1.4348145f, -0.14941406f, 0.8322754f, 1.2192383f, 1.2817383f, 0.94140625f, 0.5319824f, 0.37402344f, 0.31469727f, 0.23120117f, 0.010498047f, -0.21533203f, -0.3239746f, -0.45751953f, -0.6254883f, + 1.7978516f, 2.154541f, 1.6486816f, 0.77490234f, 0.38378906f, 0.24902344f, -0.34985352f, -0.9355469f, -1.130127f, -1.3525391f, -1.317627f, -1.0749512f, -0.7229004f, -0.31201172f, 0.06225586f, 0.12475586f, + 0.8828125f, 0.72802734f, 0.59594727f, 0.3737793f, 0.5258789f, 0.72753906f, 0.43017578f, 0.18725586f, 0.06640625f, -0.23266602f, -0.42578125f, -0.50512695f, -0.5432129f, -0.6281738f, -0.92529297f, -1.2570801f, + 1.46875f, 2.616455f, 2.7822266f, 1.1652832f, 0.45581055f, 1.2355957f, 1.2653809f, 0.935791f, 0.5776367f, -0.87597656f, -2.5498047f, -2.6628418f, -2.2028809f, -1.3466797f, -0.9621582f, -1.9025879f, + 1.5563965f, 0.4855957f, -0.31933594f, -0.8959961f, -1.0634766f, -1.0183105f, -0.9716797f, -0.8378906f, -0.4987793f, -0.14331055f, 0.14428711f, 0.31445312f, 0.6821289f, 0.88623047f, 0.87890625f, 0.8005371f, + 1.9968262f, 2.7993164f, 2.0898438f, 0.9248047f, 0.85009766f, 1.4089355f, 1.6706543f, 1.3681641f, 1.1982422f, 0.33544922f, -0.95288086f, -2.145996f, -2.8188477f, -2.941162f, -2.8947754f, -2.8886719f, + -0.75439453f, 0.16137695f, 0.33740234f, -0.19702148f, 0.5197754f, 1.2861328f, 0.42236328f, -0.20092773f, -0.11743164f, -0.69018555f, -1.1972656f, -0.7453613f, -0.053466797f, 0.39208984f, 0.7512207f, 0.08544922f, + 2.1848145f, 1.0153809f, 0.14331055f, -0.6489258f, -0.71435547f, -0.55566406f, -0.40966797f, -0.25634766f, -0.08081055f, -0.01586914f, -0.0053710938f, -0.09667969f, -0.12231445f, -0.03466797f, -0.11303711f, -0.2902832f, + -1.2324219f, -0.42993164f, -0.30273438f, -0.8486328f, -0.9147949f, -0.7001953f, 0.03955078f, 0.7734375f, 0.99438477f, 0.46484375f, 0.13891602f, 0.11425781f, 0.41381836f, 0.7363281f, 0.6113281f, 0.14208984f, + 3.2854004f, 4.0998535f, 3.8623047f, 2.496582f, 1.4880371f, -0.044189453f, -0.55981445f, -1.1950684f, -1.519043f, -1.6992188f, -1.7475586f, -1.7741699f, -1.7507324f, -1.697998f, -1.6628418f, -1.5812988f, + -0.28393555f, 0.36254883f, 0.7150879f, 1.1523438f, 1.5422363f, 1.6831055f, 0.8269043f, -0.0107421875f, -0.48364258f, -0.6828613f, -0.78930664f, -0.6608887f, -0.6298828f, -0.8183594f, -0.8984375f, -1.0241699f, + 2.4472656f, 3.3598633f, 2.1152344f, 0.58740234f, 0.088134766f, 0.080566406f, 0.12768555f, -0.83447266f, -0.66308594f, 0.3178711f, -0.046875f, -1.7287598f, -1.8405762f, -1.4956055f, -1.1696777f, -1.3449707f, + 0.053955078f, -0.54907227f, -0.64941406f, -0.40527344f, -0.1496582f, -0.067871094f, -0.1328125f, -0.15991211f, 0.044677734f, 0.25585938f, 0.31835938f, 0.16113281f, 0.25756836f, 0.36523438f, 0.30444336f, 0.3527832f, + 0.20654297f, 1.2531738f, 1.6928711f, 2.6262207f, 2.7858887f, 2.2766113f, 1.0957031f, 0.32495117f, -0.79711914f, -1.7229004f, -2.0270996f, -1.2214355f, -1.1369629f, -2.0170898f, -1.7719727f, -1.5671387f, + 2.3149414f, 2.991455f, 1.5952148f, -0.14819336f, -0.6477051f, -0.16430664f, 0.07470703f, -0.28759766f, -0.4309082f, -0.782959f, -0.9194336f, -0.9182129f, -0.76708984f, -0.43164062f, -0.51586914f, -0.96240234f, + -0.13427734f, 0.3479004f, 0.4909668f, 0.038330078f, -0.26342773f, -0.3449707f, -0.41430664f, -0.3930664f, -0.16748047f, 0.009521484f, 0.1977539f, 0.0703125f, 0.20703125f, 0.43969727f, 0.24658203f, -0.33032227f, + -2.4680176f, -2.8671875f, -1.8813477f, 0.0925293f, 2.0136719f, 1.6013184f, 0.009277344f, -0.20214844f, 0.53344727f, 1.6809082f, 0.20605469f, 0.18408203f, 1.1643066f, 0.7697754f, -0.21728516f, -0.6196289f, + 3.2966309f, 3.043457f, 1.8188477f, 0.35595703f, -0.5317383f, -1.1340332f, -1.4089355f, -1.5368652f, -1.5805664f, -1.4577637f, -1.1005859f, -0.7077637f, 0.3149414f, 0.13671875f, 0.09887695f, 0.39257812f, + 1.1394043f, 2.0166016f, 1.6103516f, 0.43041992f, 0.8642578f, 1.6750488f, 0.87231445f, -0.23657227f, -1.2756348f, -1.3154297f, -1.0163574f, -0.611084f, -0.8654785f, -0.96191406f, -0.888916f, -1.4370117f, + 1.2382812f, 2.4553223f, 2.6896973f, 1.0947266f, 0.8881836f, 0.6599121f, 0.5114746f, 0.54296875f, 0.5046387f, -0.7314453f, -1.0595703f, -1.0734863f, -1.7263184f, -1.8920898f, -1.9853516f, -2.1169434f, + 1.7275391f, 1.0910645f, 0.24316406f, -1.076416f, -1.8234863f, -2.0952148f, -1.9289551f, -1.7150879f, -1.1884766f, -0.40429688f, 0.6279297f, 1.0185547f, 1.0893555f, 1.3093262f, 1.5356445f, 1.5893555f, + 2.8112793f, 3.1445312f, 2.5549316f, 0.8642578f, 0.45751953f, 1.5227051f, 1.6352539f, 0.92749023f, -0.56347656f, -1.8974609f, -2.1052246f, -2.085205f, -1.9211426f, -1.7441406f, -1.8710938f, -1.7302246f, + 0.46118164f, 0.93188477f, 0.859375f, 0.25732422f, -0.083496094f, -0.11010742f, -0.5197754f, -0.7607422f, -0.90966797f, -1.2976074f, -1.0537109f, -0.685791f, 0.013183594f, 0.83984375f, 1.1577148f, 0.9003906f, + 3.130371f, 1.8466797f, 0.7558594f, -0.33569336f, -0.7277832f, -0.85498047f, -0.7219238f, -0.6804199f, -0.5666504f, -0.50097656f, -0.49169922f, -0.2824707f, -0.16015625f, -0.3659668f, -0.2529297f, 0.20898438f, + -1.7817383f, -0.7636719f, -0.35620117f, -0.9194336f, -0.89990234f, -0.30371094f, 0.16333008f, 0.53393555f, 1.2219238f, 1.6164551f, 1.0964355f, 0.36914062f, 0.19091797f, 0.19116211f, -0.06689453f, -0.2919922f, + 2.9470215f, 2.9702148f, 2.4978027f, 1.8425293f, 1.1940918f, 0.48754883f, 0.040771484f, -0.4560547f, -0.71777344f, -1.255127f, -1.7084961f, -1.8168945f, -1.6584473f, -1.5026855f, -1.380127f, -1.4846191f, + -0.42797852f, 0.39672852f, 1.0322266f, 0.8232422f, 0.57055664f, 0.99194336f, 1.0778809f, 0.47460938f, 0.11987305f, -0.65625f, -1.3706055f, -1.3859863f, -0.93652344f, -0.296875f, -0.060302734f, -0.35253906f, + 3.0546875f, 1.5651855f, 0.72753906f, 0.024658203f, -0.087646484f, -0.13623047f, -0.22338867f, -0.051513672f, -0.01977539f, -0.13867188f, -0.29052734f, -0.4897461f, -0.6779785f, -0.89501953f, -1.0483398f, -1.3132324f, + -2.329834f, -1.6538086f, -1.5170898f, -1.8430176f, -1.7233887f, -0.94091797f, -0.39746094f, 0.51293945f, 1.3725586f, 1.703125f, 1.6044922f, 1.3227539f, 1.2766113f, 1.1901855f, 0.91308594f, 0.5095215f, + 2.1574707f, 3.0603027f, 2.765625f, 1.7712402f, 0.6225586f, -0.6166992f, -1.060791f, -1.5693359f, -1.4384766f, -1.7651367f, -1.7729492f, -1.0949707f, -0.46020508f, -0.0690918f, -0.05444336f, -0.47509766f, + 2.2287598f, 2.074707f, 1.065918f, 0.068603516f, -0.88061523f, -1.3867188f, -1.3818359f, -1.2768555f, -0.8725586f, -0.45751953f, -0.083984375f, -0.022460938f, 0.36108398f, 0.47192383f, 0.12597656f, -0.03466797f, + 1.2832031f, 2.3029785f, 1.6501465f, -0.19360352f, -0.94384766f, -0.11206055f, 1.2709961f, 1.0712891f, 0.9008789f, -0.6833496f, -1.9458008f, -1.3894043f, -0.7553711f, -0.17016602f, -0.6489258f, -1.637207f, + -0.5410156f, -1.4377441f, -0.87109375f, 0.72143555f, 2.3781738f, 1.8154297f, 0.05834961f, -0.24487305f, 0.27124023f, 1.1665039f, -0.2692871f, -0.24609375f, 0.4802246f, -0.34033203f, -1.2138672f, -1.7270508f, + 2.6340332f, 1.8164062f, 0.6784668f, -0.16235352f, -0.64208984f, -0.7529297f, -0.32080078f, 0.12548828f, 0.14257812f, -0.51123047f, -1.1225586f, -1.2424316f, -0.41625977f, -0.21459961f, -0.12768555f, 0.115722656f, + 1.6694336f, 1.4055176f, 1.2404785f, 1.4047852f, 1.1928711f, 0.6352539f, 0.19091797f, 0.040527344f, -0.056884766f, -0.5456543f, -0.94018555f, -1.1928711f, -1.1975098f, -1.208252f, -1.2277832f, -1.4104004f, + 0.92211914f, 2.1171875f, 1.9343262f, 0.67529297f, 0.21362305f, 0.7409668f, 0.51538086f, 0.0625f, -0.16113281f, -0.91918945f, -1.6809082f, -1.9360352f, -1.3974609f, -0.3359375f, 0.015625f, -0.7668457f, + 0.25463867f, 0.27246094f, -0.6647949f, -1.6083984f, -1.6931152f, -1.6413574f, -1.2963867f, 0.03149414f, 1.244873f, 0.9958496f, 0.88183594f, 0.7229004f, 0.6281738f, 1.152832f, 0.7297363f, -0.010498047f, + 0.27026367f, 1.5710449f, 2.415039f, 2.5617676f, 2.4665527f, 2.0825195f, 1.2067871f, 1.4360352f, 1.3601074f, -0.64990234f, -2.3432617f, -2.7763672f, -2.7404785f, -2.4682617f, -2.0534668f, -2.338623f, + -1.222168f, -0.23828125f, 0.42578125f, 0.41064453f, 0.033203125f, -0.22485352f, -0.31201172f, -0.5358887f, -0.5847168f, -0.4008789f, 0.018066406f, 0.2524414f, 0.36035156f, 0.55249023f, 0.7241211f, 0.74121094f, + 1.2573242f, 1.1115723f, 0.8808594f, 0.30810547f, -0.3330078f, -0.22290039f, 0.3894043f, 0.5810547f, 0.515625f, -0.11450195f, -0.8071289f, -0.9470215f, -0.68603516f, -0.69140625f, -0.68188477f, -0.5600586f, + -0.8679199f, -0.78100586f, -0.484375f, -0.22045898f, 0.21899414f, 0.6074219f, 0.4650879f, 0.6303711f, 0.52783203f, 0.1328125f, 0.10913086f, 0.28027344f, 0.15795898f, -0.02734375f, -0.22827148f, -0.52075195f, + 4.7766113f, 4.218994f, 2.694336f, 1.4052734f, 0.46484375f, 0.12695312f, -0.52441406f, -1.1826172f, -1.3425293f, -1.4343262f, -1.5407715f, -1.5932617f, -1.5834961f, -1.5500488f, -1.4814453f, -1.4541016f, + -1.1142578f, 0.16772461f, 1.0881348f, 0.9880371f, 0.6081543f, 0.39868164f, 0.22387695f, 0.01953125f, 0.011230469f, 0.06982422f, -0.13208008f, -0.43896484f, -0.5744629f, -0.34423828f, -0.4321289f, -0.5390625f, + 2.583496f, 2.133545f, 1.5522461f, 1.1113281f, 1.237793f, 1.3144531f, 0.93115234f, 0.35742188f, -0.20263672f, -0.76342773f, -1.1687012f, -1.4487305f, -1.6181641f, -1.8156738f, -2.0007324f, -2.203125f, + -2.0124512f, -1.4799805f, -1.4538574f, -1.4958496f, -1.1079102f, -0.4272461f, -0.17285156f, 0.080322266f, 0.3112793f, 0.5344238f, 0.6477051f, 0.64208984f, 1.0615234f, 1.8166504f, 1.7543945f, 1.3015137f, + 0.86035156f, 1.9960938f, 2.592041f, 2.7302246f, 2.2209473f, 1.1103516f, 0.720459f, -0.033691406f, -0.48901367f, -1.1772461f, -2.2160645f, -2.621338f, -2.5187988f, -1.5297852f, -0.41210938f, -1.2324219f, + -0.0390625f, 0.7182617f, 1.293457f, 1.6416016f, 1.7243652f, 0.44335938f, -0.36767578f, -0.62646484f, -0.14038086f, -0.39379883f, -1.5004883f, -1.2729492f, -0.65112305f, -0.21801758f, -0.15991211f, -0.45117188f, + 0.4506836f, 1.1796875f, 1.0358887f, 0.4663086f, 0.12597656f, -0.20898438f, -0.2524414f, -0.18115234f, -0.17993164f, -0.23266602f, -0.12768555f, -0.010009766f, -0.23925781f, -0.46972656f, -0.58251953f, -0.7739258f, + -3.7177734f, -3.4355469f, -1.828125f, 0.23046875f, 1.5246582f, 1.4841309f, 0.20214844f, -0.1538086f, 0.41015625f, 1.4714355f, 0.095214844f, 0.12524414f, 1.3300781f, 1.3466797f, 0.51538086f, 0.40014648f, + 4.776123f, 2.9377441f, 1.6135254f, 0.27954102f, -0.32666016f, -0.5793457f, -0.78466797f, -0.77001953f, -0.76538086f, -0.8562012f, -0.86694336f, -0.8532715f, -0.77905273f, -0.9621582f, -1.0119629f, -1.0510254f, + -0.8840332f, -0.5324707f, 0.2368164f, 2.0664062f, 2.5444336f, 1.9240723f, 1.4997559f, 1.230957f, 0.736084f, 0.2121582f, -0.61987305f, -0.9506836f, -1.2260742f, -1.7910156f, -2.0410156f, -2.4060059f, + 1.1203613f, 2.241455f, 1.5061035f, 0.26416016f, 0.083496094f, 0.087646484f, 0.00390625f, 0.03100586f, 0.08154297f, -0.39648438f, -0.56689453f, -0.62158203f, -0.7219238f, -0.796875f, -0.9807129f, -1.3356934f, + 0.8803711f, -0.5605469f, -0.89404297f, -1.1616211f, -0.9255371f, -1.3374023f, -1.1962891f, -1.2824707f, -1.3156738f, -1.2546387f, -1.0393066f, -0.041015625f, 1.5158691f, 1.6071777f, 2.4050293f, 4.5998535f, + 2.1367188f, 3.0183105f, 2.89917f, 2.105713f, 1.6914062f, 1.2595215f, 1.072998f, 0.5095215f, 0.26293945f, -0.62719727f, -1.6728516f, -2.331543f, -2.5375977f, -2.6152344f, -2.5966797f, -2.5751953f, + 0.45410156f, 0.56274414f, -0.091552734f, -0.82177734f, -0.8930664f, -0.40722656f, 0.024902344f, 0.008056641f, -0.09692383f, -0.19360352f, -0.25634766f, -0.25048828f, 0.14941406f, 0.73461914f, 0.7668457f, 0.31030273f, + 0.8791504f, 1.3742676f, 0.6760254f, -0.22192383f, -0.8535156f, -1.0957031f, -1.0690918f, -1.1728516f, -0.9848633f, -0.6647949f, -0.11669922f, 0.06738281f, 0.6196289f, 1.0905762f, 0.9074707f, 0.5654297f, + -0.26635742f, -0.29956055f, -0.8881836f, -1.2294922f, -0.69311523f, 0.011230469f, 0.5498047f, 0.9824219f, 1.184082f, 1.0895996f, 0.5878906f, 0.06738281f, -0.08911133f, -0.05029297f, -0.27319336f, -0.68359375f, + 3.256836f, 3.5593262f, 2.2746582f, 1.1318359f, 0.3149414f, -0.02368164f, 0.27172852f, -0.19335938f, -0.48779297f, -0.9663086f, -0.9187012f, -1.0222168f, -1.512207f, -1.6816406f, -1.8964844f, -2.1069336f, + -0.057617188f, -0.45092773f, -0.9638672f, -0.72143555f, 0.20703125f, 1.4692383f, 1.921875f, 1.6833496f, 1.3933105f, 0.6699219f, 0.17333984f, -0.43798828f, -0.9772949f, -1.1477051f, -1.3552246f, -1.4057617f, }; const float ivas_sns_cdbk_tcx10_stage2[ 32 * 16 ] = { - 0.30627323f, 0.48836579f, -0.02716944f, -0.47680077f, -0.52992614f, -0.25467720f, -0.13298242f, -0.14929291f, -0.14808149f, 0.08665801f, 0.28830653f, 0.27526330f, 0.09942358f, -0.01755061f, 0.03315580f, 0.15903469f, - 0.40931263f, -0.04412117f, -0.08826419f, 0.38716891f, 0.51515595f, 0.42227845f, 0.34963425f, 0.26800736f, 0.03770000f, -0.19967080f, -0.31044249f, -0.32623294f, -0.38445978f, -0.38085950f, -0.38590829f, -0.26929836f, - -0.16037262f, -0.37557223f, -0.41481262f, -0.12384627f, 0.25702942f, 0.29593484f, 0.04534352f, -0.04349856f, -0.11439445f, -0.20184919f, 0.03250628f, 0.58473249f, 1.07468564f, 0.31789485f, -0.43837532f, -0.73540590f, - -0.72021067f, 0.08601834f, 0.36444345f, 0.07734969f, -0.03855524f, -0.02016363f, 0.22787880f, 0.23660595f, -0.06162934f, -0.60111840f, -0.53416841f, -0.01411490f, 0.31545914f, 0.35328934f, 0.27371155f, 0.05520477f, - 0.17033204f, -0.13395098f, -0.17486207f, -0.16431307f, -0.15028250f, -0.16217158f, 0.20788205f, 0.78892741f, 0.82887028f, 0.27828798f, -0.09961411f, -0.26525390f, -0.29531330f, -0.31862369f, -0.30357092f, -0.20634333f, - 0.66971623f, 0.62862982f, 0.51073654f, 0.36780819f, 0.09494981f, -0.26895298f, -0.43607248f, -0.52929484f, -0.50226353f, -0.28888748f, -0.08077826f, 0.07870787f, -0.04066089f, -0.15014043f, -0.07631337f, 0.02281584f, - -0.14637266f, -0.46934298f, -0.43556714f, -0.11250329f, 0.02177593f, -0.06273200f, -0.10608254f, -0.23883852f, -0.34273025f, -0.21064510f, 0.01000878f, 0.26290329f, 0.36940740f, 0.45606583f, 0.50057089f, 0.50408231f, - -0.63822919f, -0.37848043f, -0.12025765f, 0.46869706f, 0.60287599f, 0.40487467f, 0.32284423f, 0.21760285f, 0.02923608f, 0.00961581f, 0.09146575f, 0.01422525f, -0.19921025f, -0.27268562f, -0.30705403f, -0.24552069f, - 1.00438179f, 0.03452909f, -0.36528888f, -0.16282387f, -0.17507552f, -0.16366972f, 0.01988929f, 0.04208138f, -0.09195065f, -0.12550201f, -0.13827904f, -0.15519976f, -0.13718296f, -0.04187317f, 0.11795197f, 0.33801187f, - -0.29872646f, -0.05673935f, 0.22627715f, 0.35384240f, 0.40583411f, 0.05342130f, -0.33165017f, -0.58372192f, -0.59880799f, -0.13860904f, 0.35292935f, 0.42680564f, 0.12541820f, -0.05244271f, 0.02304693f, 0.09312233f, - -0.62056798f, -0.65569894f, -0.39193684f, -0.23470135f, -0.10487732f, -0.02415277f, 0.10485475f, 0.27475842f, 0.33639795f, 0.28659695f, 0.29816270f, 0.35486347f, 0.22178257f, 0.06294332f, 0.00371302f, 0.08786182f, - -0.24167361f, 0.39335919f, 0.45401345f, -0.01359878f, -0.02799250f, 0.03219280f, -0.03498926f, 0.13917253f, 0.56998817f, 0.30076805f, -0.02861530f, -0.08301223f, -0.23268793f, -0.25582563f, -0.40349390f, -0.56760551f, - -0.25453749f, 0.20141031f, 0.13622118f, 0.02192458f, 0.01884274f, 0.35426017f, 0.30533029f, -0.04383371f, -0.03213904f, 0.48723585f, 0.26916690f, -0.57914714f, -0.86274497f, -0.46431975f, 0.21456299f, 0.22776732f, - 0.10091242f, -0.00486621f, 0.15438553f, 0.58933636f, 0.58327809f, 0.15020643f, -0.13942120f, -0.30560120f, -0.39802935f, -0.42014770f, -0.43506227f, -0.49122908f, -0.24162334f, 0.07789107f, 0.33589368f, 0.44407700f, - -0.86901291f, -0.12649490f, 0.37769660f, 0.32335451f, -0.09778731f, -0.30169760f, -0.11330902f, 0.06975956f, 0.10852794f, 0.10187023f, 0.01908335f, -0.02063501f, -0.02583787f, 0.01976747f, 0.15814638f, 0.37656868f, - 0.04263499f, 0.02090495f, 0.31860242f, 0.23302977f, -0.33090591f, -0.80333458f, -0.73651770f, -0.34102413f, 0.01204330f, 0.27818705f, 0.45925162f, 0.49138398f, 0.30213637f, 0.14165342f, -0.01743260f, -0.07061291f, - -0.33546750f, 0.07559517f, -0.29917689f, -0.73625773f, -0.65250278f, -0.17791468f, 0.36283358f, 0.41870726f, 0.25167625f, 0.10475438f, 0.03036614f, -0.11264997f, 0.02694511f, 0.35023967f, 0.42385566f, 0.26899640f, - 0.35439950f, 0.67540976f, 0.38662754f, 0.00957348f, -0.04081569f, 0.08980026f, 0.24456400f, 0.16454453f, -0.17326799f, -0.44054817f, -0.46528410f, -0.40046956f, -0.28220380f, -0.18741583f, -0.03688613f, 0.10197206f, - 0.42543134f, 0.16124378f, -0.11664388f, -0.16052109f, -0.14380996f, -0.20548992f, -0.07681681f, -0.05550879f, -0.19682147f, -0.44926335f, -0.31008693f, 0.10843293f, 0.56978845f, 0.55547148f, 0.11319503f, -0.21860065f, - -0.29805544f, -0.51653600f, -0.50993841f, -0.23042275f, 0.24667415f, 0.49673729f, 0.44572321f, 0.45012593f, 0.15926189f, -0.25316153f, -0.34302757f, -0.25146569f, -0.04585493f, 0.07882198f, 0.19017230f, 0.38094576f, - 0.32844224f, 0.41193928f, 0.40958218f, 0.23076367f, -0.27298459f, -0.73724149f, -0.33139249f, 0.20850941f, 0.29246785f, 0.02387269f, -0.22298162f, -0.22401730f, -0.10602946f, -0.10948655f, -0.04914188f, 0.14769834f, - -0.17579666f, 0.35780877f, 0.71235588f, 0.55448086f, 0.37958752f, 0.25325181f, 0.00067976f, -0.17449727f, -0.19933258f, -0.18272217f, -0.13825657f, -0.13482936f, -0.26973501f, -0.36527057f, -0.38046021f, -0.23726392f, - 0.18763378f, -0.33806505f, -0.40345471f, -0.16420458f, -0.35258917f, -0.57440801f, -0.40444473f, 0.03937379f, 0.28301143f, 0.24202773f, 0.11450746f, -0.01201630f, 0.15584175f, 0.29186178f, 0.39454798f, 0.54037647f, - 0.22483690f, -0.44980090f, -0.04869487f, 0.59069175f, 0.53952189f, -0.08294351f, -0.50222392f, -0.24118691f, 0.23316504f, 0.15935219f, -0.04441873f, 0.04368785f, -0.01936622f, -0.19829407f, -0.17269697f, -0.03162974f, - 0.86145933f, 0.21872440f, 0.03989593f, 0.02383014f, -0.09253274f, -0.16857595f, -0.11671737f, 0.08021353f, 0.06125647f, 0.12344152f, 0.23383136f, 0.23023986f, 0.00554465f, -0.33666994f, -0.57850362f, -0.58543742f, - 0.51765053f, 0.14453794f, -0.21849231f, -0.46766148f, 0.28518641f, 0.98554209f, 0.04290847f, -0.60417524f, -0.40619174f, 0.07096948f, -0.07934046f, -0.11108689f, 0.01736604f, 0.02182622f, -0.13816306f, -0.06087569f, - 0.48940455f, -0.48846716f, -0.76449136f, -0.43167975f, -0.08214146f, 0.11409731f, 0.23323066f, 0.14717357f, 0.03539665f, 0.18939153f, 0.30742449f, 0.25985980f, 0.09542412f, -0.02333196f, -0.07732568f, -0.00396539f, - -0.11187535f, 0.22479868f, 0.00043228f, -0.32181417f, -0.15096473f, 0.43016822f, 0.70121781f, 0.35219596f, -0.12050155f, -0.23287073f, 0.15265180f, 0.19690580f, -0.06424055f, -0.21596133f, -0.38579166f, -0.45435087f, - -0.22289529f, -0.33733328f, 0.06840735f, 0.09280703f, 0.04636627f, 0.21910935f, -0.03558133f, 0.03650325f, 0.61258277f, 0.50575298f, -0.41287364f, -0.69151766f, -0.55346043f, 0.16231747f, 0.54407303f, -0.03425754f, - -0.01396139f, 0.41256481f, 0.28386076f, -0.13079544f, -0.35049882f, -0.37139357f, -0.26190236f, -0.28543916f, -0.36404168f, -0.41216213f, -0.30446824f, -0.16554805f, 0.07635435f, 0.40718475f, 0.72148357f, 0.75876291f, - -0.78143464f, 0.05520810f, 0.09851993f, -0.35088396f, -0.29183273f, 0.13535467f, 0.10630173f, -0.35151176f, -0.27502696f, 0.15923208f, 0.34325564f, 0.26263384f, 0.39924614f, 0.42088604f, 0.20935571f, -0.13930422f, - -0.20363163f, -0.21557857f, -0.16300691f, -0.04183005f, -0.11100316f, -0.05771045f, 0.03898740f, 0.01316220f, 0.17362802f, 0.74914331f, 0.94477958f, 0.44778038f, -0.09421183f, -0.32736334f, -0.50631884f, -0.64682642f + 0.30615234f, 0.48828125f, -0.02709961f, -0.47680664f, -0.5300293f, -0.25463867f, -0.13305664f, -0.14941406f, -0.14819336f, 0.08666992f, 0.28833008f, 0.27514648f, 0.099365234f, -0.017578125f, 0.033203125f, 0.15893555f, + 0.40942383f, -0.044189453f, -0.088378906f, 0.38720703f, 0.5151367f, 0.42236328f, 0.34960938f, 0.2680664f, 0.037597656f, -0.19970703f, -0.31054688f, -0.32617188f, -0.38452148f, -0.38085938f, -0.38598633f, -0.2692871f, + -0.16040039f, -0.37548828f, -0.41479492f, -0.1237793f, 0.25708008f, 0.29589844f, 0.045410156f, -0.04345703f, -0.11450195f, -0.2019043f, 0.032470703f, 0.5847168f, 1.074707f, 0.3178711f, -0.43847656f, -0.73535156f, + -0.72021484f, 0.0859375f, 0.36450195f, 0.07739258f, -0.03857422f, -0.020263672f, 0.2277832f, 0.23657227f, -0.061523438f, -0.6010742f, -0.5341797f, -0.014160156f, 0.3154297f, 0.35327148f, 0.27368164f, 0.05517578f, + 0.17041016f, -0.1340332f, -0.17480469f, -0.16430664f, -0.15039062f, -0.16210938f, 0.20776367f, 0.78881836f, 0.8288574f, 0.2783203f, -0.099609375f, -0.26513672f, -0.29541016f, -0.31860352f, -0.3034668f, -0.20629883f, + 0.66967773f, 0.6286621f, 0.5107422f, 0.36791992f, 0.0949707f, -0.26904297f, -0.43603516f, -0.5292969f, -0.50219727f, -0.28881836f, -0.08081055f, 0.07861328f, -0.040771484f, -0.15014648f, -0.076416016f, 0.022705078f, + -0.14648438f, -0.46923828f, -0.43554688f, -0.11254883f, 0.021728516f, -0.06274414f, -0.10620117f, -0.23876953f, -0.34277344f, -0.21069336f, 0.010009766f, 0.26293945f, 0.36938477f, 0.4560547f, 0.5004883f, 0.5041504f, + -0.6381836f, -0.37841797f, -0.12036133f, 0.46875f, 0.6027832f, 0.40478516f, 0.3227539f, 0.2175293f, 0.029296875f, 0.009521484f, 0.091552734f, 0.014160156f, -0.19921875f, -0.27270508f, -0.3071289f, -0.24560547f, + 1.0043945f, 0.034423828f, -0.36523438f, -0.1628418f, -0.17504883f, -0.16357422f, 0.01977539f, 0.041992188f, -0.092041016f, -0.12548828f, -0.1381836f, -0.15527344f, -0.13720703f, -0.041992188f, 0.11791992f, 0.33789062f, + -0.29882812f, -0.056640625f, 0.22631836f, 0.35375977f, 0.40576172f, 0.053466797f, -0.33154297f, -0.58374023f, -0.59887695f, -0.13867188f, 0.35302734f, 0.4267578f, 0.12548828f, -0.052490234f, 0.022949219f, 0.09301758f, + -0.62060547f, -0.6557617f, -0.3918457f, -0.23461914f, -0.10498047f, -0.024169922f, 0.10473633f, 0.2746582f, 0.33642578f, 0.2866211f, 0.2980957f, 0.35498047f, 0.22167969f, 0.06298828f, 0.0036621094f, 0.087890625f, + -0.24169922f, 0.39331055f, 0.45410156f, -0.013671875f, -0.028076172f, 0.032226562f, -0.03491211f, 0.13916016f, 0.57006836f, 0.30078125f, -0.028564453f, -0.08300781f, -0.23266602f, -0.25585938f, -0.40356445f, -0.56762695f, + -0.25463867f, 0.20141602f, 0.13623047f, 0.021972656f, 0.018798828f, 0.35424805f, 0.30541992f, -0.043945312f, -0.032226562f, 0.4873047f, 0.2692871f, -0.57910156f, -0.86279297f, -0.46435547f, 0.21459961f, 0.2277832f, + 0.10083008f, -0.0048828125f, 0.15429688f, 0.58935547f, 0.58325195f, 0.15014648f, -0.1394043f, -0.30566406f, -0.39794922f, -0.42016602f, -0.4350586f, -0.49121094f, -0.24169922f, 0.07788086f, 0.3359375f, 0.4440918f, + -0.8688965f, -0.12646484f, 0.37768555f, 0.3232422f, -0.09790039f, -0.3017578f, -0.11328125f, 0.06982422f, 0.10864258f, 0.10180664f, 0.019042969f, -0.020751953f, -0.025878906f, 0.01977539f, 0.15820312f, 0.37646484f, + 0.04272461f, 0.020996094f, 0.31860352f, 0.23291016f, -0.33081055f, -0.80322266f, -0.73657227f, -0.34106445f, 0.011962891f, 0.27807617f, 0.45922852f, 0.49145508f, 0.3022461f, 0.14160156f, -0.017333984f, -0.07055664f, + -0.33544922f, 0.075683594f, -0.29907227f, -0.7363281f, -0.6525879f, -0.17797852f, 0.36279297f, 0.41870117f, 0.25170898f, 0.10473633f, 0.030273438f, -0.11254883f, 0.026855469f, 0.3503418f, 0.42382812f, 0.26904297f, + 0.3544922f, 0.67529297f, 0.38671875f, 0.009521484f, -0.040771484f, 0.08984375f, 0.2446289f, 0.16455078f, -0.17333984f, -0.4404297f, -0.46533203f, -0.40039062f, -0.28222656f, -0.1875f, -0.036865234f, 0.10205078f, + 0.4255371f, 0.16113281f, -0.11669922f, -0.16040039f, -0.14379883f, -0.2055664f, -0.0769043f, -0.055419922f, -0.19677734f, -0.44921875f, -0.3100586f, 0.10839844f, 0.5698242f, 0.5554199f, 0.11328125f, -0.21850586f, + -0.2980957f, -0.51660156f, -0.51000977f, -0.23046875f, 0.24658203f, 0.49682617f, 0.44580078f, 0.4501953f, 0.15917969f, -0.25317383f, -0.34301758f, -0.25146484f, -0.045898438f, 0.07885742f, 0.19018555f, 0.38085938f, + 0.32836914f, 0.41186523f, 0.40966797f, 0.23071289f, -0.27294922f, -0.7373047f, -0.33129883f, 0.2084961f, 0.29248047f, 0.023925781f, -0.22290039f, -0.2241211f, -0.10595703f, -0.109375f, -0.049072266f, 0.14770508f, + -0.17578125f, 0.35791016f, 0.71240234f, 0.55444336f, 0.37963867f, 0.25317383f, 0.0007324219f, -0.17456055f, -0.19921875f, -0.18261719f, -0.1381836f, -0.13476562f, -0.2697754f, -0.36523438f, -0.3803711f, -0.23730469f, + 0.18774414f, -0.33813477f, -0.40356445f, -0.16430664f, -0.35253906f, -0.5744629f, -0.40454102f, 0.03930664f, 0.28295898f, 0.24194336f, 0.11450195f, -0.011962891f, 0.15576172f, 0.29174805f, 0.39453125f, 0.5402832f, + 0.22485352f, -0.44970703f, -0.048583984f, 0.5905762f, 0.5395508f, -0.08300781f, -0.50219727f, -0.24121094f, 0.2331543f, 0.15942383f, -0.044433594f, 0.043701172f, -0.01928711f, -0.19824219f, -0.17260742f, -0.03173828f, + 0.86157227f, 0.21875f, 0.039794922f, 0.023925781f, -0.0925293f, -0.16845703f, -0.11669922f, 0.080322266f, 0.061279297f, 0.123535156f, 0.23388672f, 0.23022461f, 0.0056152344f, -0.33666992f, -0.5786133f, -0.5854492f, + 0.5175781f, 0.14453125f, -0.21850586f, -0.46777344f, 0.28515625f, 0.9855957f, 0.04296875f, -0.60424805f, -0.40625f, 0.07104492f, -0.0793457f, -0.111083984f, 0.017333984f, 0.021728516f, -0.1381836f, -0.060791016f, + 0.48950195f, -0.4885254f, -0.7644043f, -0.43164062f, -0.08203125f, 0.11401367f, 0.2331543f, 0.1472168f, 0.03540039f, 0.18945312f, 0.30737305f, 0.25976562f, 0.095458984f, -0.0234375f, -0.07739258f, -0.00390625f, + -0.111816406f, 0.22485352f, 0.00048828125f, -0.32177734f, -0.1508789f, 0.43017578f, 0.7011719f, 0.35229492f, -0.12060547f, -0.23291016f, 0.15258789f, 0.19702148f, -0.064208984f, -0.21606445f, -0.3857422f, -0.4543457f, + -0.22290039f, -0.33740234f, 0.068359375f, 0.09277344f, 0.04638672f, 0.21899414f, -0.03564453f, 0.036621094f, 0.6125488f, 0.5058594f, -0.4128418f, -0.69140625f, -0.5534668f, 0.16235352f, 0.54418945f, -0.034179688f, + -0.013916016f, 0.41259766f, 0.28393555f, -0.13085938f, -0.35058594f, -0.3713379f, -0.2619629f, -0.2854004f, -0.36401367f, -0.41210938f, -0.30444336f, -0.16552734f, 0.076416016f, 0.40722656f, 0.72143555f, 0.75878906f, + -0.78149414f, 0.05517578f, 0.09863281f, -0.35083008f, -0.29174805f, 0.1352539f, 0.10620117f, -0.3515625f, -0.27514648f, 0.15917969f, 0.34326172f, 0.2626953f, 0.39916992f, 0.42089844f, 0.20947266f, -0.1394043f, + -0.20361328f, -0.21557617f, -0.16308594f, -0.041748047f, -0.111083984f, -0.057617188f, 0.0390625f, 0.013183594f, 0.17358398f, 0.74902344f, 0.9448242f, 0.4477539f, -0.09423828f, -0.32739258f, -0.50634766f, -0.6467285f, }; const float ivas_sns_cdbk_tcx10_stage3[ 8 * 16 ] = { - 0.15213764f, -0.12778955f, 0.09362990f, -0.08343056f, -0.25379718f, 0.12518895f, 0.29943288f, -0.09857322f, -0.34816031f, -0.24349585f, -0.11266650f, -0.05996015f, 0.03254247f, 0.15532134f, 0.23410563f, 0.23551447f, - -0.16242282f, -0.11097776f, -0.31747514f, -0.25628076f, 0.13836003f, 0.29861681f, 0.10506779f, 0.11734717f, 0.26608658f, 0.05454060f, -0.14603348f, -0.19239843f, 0.04173306f, 0.20966631f, 0.07432020f, -0.12015035f, - -0.05086737f, 0.14763099f, -0.10027459f, -0.32093478f, -0.17515530f, -0.18641303f, -0.27141947f, -0.07787662f, 0.00378069f, -0.04285463f, 0.10140687f, 0.34974771f, 0.30832793f, 0.10107726f, 0.07691200f, 0.13691240f, - -0.19149570f, -0.03034820f, 0.22501633f, 0.07949802f, -0.27147765f, -0.19613243f, 0.27922429f, 0.35035416f, 0.10414276f, 0.00614821f, 0.06550601f, 0.11675054f, 0.03695278f, -0.13039057f, -0.22716902f, -0.21657951f, - 0.26536712f, -0.20814302f, -0.25065997f, 0.11971631f, 0.27275427f, 0.17786545f, -0.00254739f, -0.12770659f, -0.22797897f, 0.00768447f, 0.21340357f, 0.19482691f, 0.04586545f, -0.11847485f, -0.17809566f, -0.18387694f, - 0.25667429f, 0.24654641f, 0.10151031f, -0.02938848f, -0.14360442f, -0.13987667f, -0.20754252f, -0.19670735f, 0.17496815f, 0.41594389f, 0.13093074f, -0.20541061f, -0.16236246f, 0.04068170f, -0.03728146f, -0.24508149f, - -0.08722397f, 0.02295918f, 0.00051204f, 0.07408103f, 0.14389321f, 0.06786859f, 0.00359252f, 0.11717038f, 0.08740562f, 0.00119184f, -0.07592203f, -0.11362449f, -0.31422561f, -0.38910675f, -0.02291088f, 0.48433932f, - -0.18216919f, 0.06012195f, 0.24774113f, 0.41673922f, 0.28902704f, -0.14711768f, -0.20580810f, -0.08400793f, -0.06024452f, -0.19915854f, -0.17662518f, -0.08993148f, 0.01116638f, 0.13122555f, 0.08011919f, -0.09107791f + 0.15209961f, -0.12768555f, 0.09375f, -0.083496094f, -0.25390625f, 0.12524414f, 0.2993164f, -0.09863281f, -0.34814453f, -0.2434082f, -0.11254883f, -0.060058594f, 0.032470703f, 0.15527344f, 0.23413086f, 0.2355957f, + -0.16235352f, -0.111083984f, -0.3173828f, -0.25634766f, 0.13842773f, 0.29858398f, 0.10498047f, 0.11743164f, 0.26611328f, 0.05444336f, -0.1459961f, -0.19238281f, 0.041748047f, 0.2097168f, 0.07421875f, -0.12011719f, + -0.05078125f, 0.14770508f, -0.1003418f, -0.32104492f, -0.17504883f, -0.18652344f, -0.27148438f, -0.07788086f, 0.0036621094f, -0.04296875f, 0.10131836f, 0.34985352f, 0.3083496f, 0.10107422f, 0.0769043f, 0.13696289f, + -0.19140625f, -0.030273438f, 0.22509766f, 0.079589844f, -0.27148438f, -0.19604492f, 0.27929688f, 0.3503418f, 0.10424805f, 0.0061035156f, 0.06542969f, 0.11669922f, 0.036865234f, -0.1303711f, -0.22705078f, -0.21655273f, + 0.26538086f, -0.20825195f, -0.25073242f, 0.119628906f, 0.27270508f, 0.17797852f, -0.0024414062f, -0.12768555f, -0.22802734f, 0.0075683594f, 0.2133789f, 0.19482422f, 0.045898438f, -0.1184082f, -0.17797852f, -0.18383789f, + 0.2565918f, 0.24658203f, 0.1015625f, -0.029296875f, -0.14355469f, -0.13989258f, -0.20751953f, -0.19677734f, 0.17504883f, 0.41601562f, 0.13085938f, -0.20532227f, -0.16235352f, 0.040771484f, -0.037353516f, -0.24511719f, + -0.0871582f, 0.022949219f, 0.00048828125f, 0.07397461f, 0.14379883f, 0.067871094f, 0.0036621094f, 0.1171875f, 0.087402344f, 0.0012207031f, -0.075927734f, -0.11352539f, -0.31420898f, -0.38916016f, -0.022949219f, 0.484375f, + -0.1821289f, 0.060058594f, 0.24780273f, 0.41674805f, 0.2890625f, -0.1472168f, -0.20581055f, -0.083984375f, -0.060302734f, -0.19921875f, -0.17651367f, -0.08984375f, 0.011230469f, 0.13110352f, 0.080078125f, -0.09106445f, }; const float *const ivas_sns_cdbks_tcx10[SNS_MSVQ_NSTAGES_TCX10] = { ivas_sns_cdbk_tcx10_stage1, ivas_sns_cdbk_tcx10_stage2, ivas_sns_cdbk_tcx10_stage3}; -const float ivas_sns_means_tcx10[M] = { - 0.9510f , 1.1892f , 0.8969f , 0.3467f, - 0.1347f , 0.1074f , 0.0504f , -0.0790f, - -0.1305f , -0.3713f , -0.5611f , -0.5757f, - -0.4801f , -0.4108f , -0.4564f , -0.6112f -}; - const int16_t ivas_sns_cdbks_side_tcx20_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 32 }; const int16_t ivas_sns_cdbks_side_tcx20_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 5 }; const int16_t ivas_sns_cdbks_side_tcx10_levels[SNS_MSVQ_NSTAGES_SIDE] = { 32, 8 }; const int16_t ivas_sns_cdbks_side_tcx10_bits[SNS_MSVQ_NSTAGES_SIDE] = { 5, 3 }; -const float ivas_sns_means_side_tcx20[M] = { - -0.0181f , 0.0044f , 0.0133f , 0.0096f, - 0.0073f , 0.0038f , 0.0058f , 0.0015f, - -0.0046f , -0.0096f , -0.0099f , -0.0173f, - -0.0075f , 0.0049f , 0.0023f , 0.0141f -}; - const float ivas_sns_cdbks_side_tcx20_stage1[ 32 * 16 ] = { - -0.09561560f, -0.07036320f, 0.02878750f, 0.03511974f, 0.17132389f, -0.03138941f, -0.33178799f, -0.21216198f, -0.04445341f, 0.02221417f, 0.02283919f, 0.03233147f, 0.08941267f, 0.12190493f, 0.12476806f, 0.13706984f, - 0.00109929f, 0.08875231f, 0.22238215f, 0.21457590f, 0.10015343f, 0.04638508f, 0.03393346f, -0.00874452f, -0.04376851f, -0.07742100f, -0.07534945f, -0.10337673f, -0.10407952f, -0.11112585f, -0.09133646f, -0.09207950f, - -0.24818594f, 0.26921203f, 0.44107852f, 0.17248048f, 0.64417785f, 0.17680036f, 0.13990282f, -0.00956079f, 0.26766161f, -0.03617849f, -0.51006953f, -0.14559280f, 0.04585566f, -0.32296828f, -0.43440915f, -0.45020472f, - -0.02603883f, -0.10893371f, -0.10500311f, -0.11573136f, -0.10145701f, 0.08950274f, 0.26393655f, 0.16421642f, 0.06653788f, 0.02055681f, 0.03165200f, -0.00660730f, -0.02920382f, -0.04413712f, -0.04586630f, -0.05342379f, - 0.42792206f, 0.05873236f, -0.03519993f, -0.02404930f, -0.02129021f, -0.02228539f, -0.05794333f, -0.05329147f, -0.02713142f, -0.02536622f, -0.01781476f, -0.04129741f, -0.03786846f, -0.04699464f, -0.04049980f, -0.03562223f, - 0.02055988f, 0.02639971f, 0.00689886f, 0.00418128f, -0.01634280f, 0.00921734f, 0.00364626f, -0.03176210f, -0.04382792f, -0.01247039f, 0.02183370f, -0.00002241f, -0.00402301f, -0.00566646f, 0.00978385f, 0.01159419f, - 0.19157117f, 0.21950742f, 0.18377101f, -0.02875442f, -0.28243126f, -0.54171973f, -0.31264637f, -0.03676636f, 0.00528891f, -0.04001921f, 0.08505054f, 0.06946939f, 0.13428842f, 0.15810925f, 0.11903950f, 0.07624180f, - -0.30190937f, -0.29575446f, -0.26060885f, -0.18754051f, -0.14798754f, -0.10966049f, -0.13245975f, -0.11017279f, -0.08153340f, -0.06447313f, 0.04034392f, 0.17641778f, 0.25731939f, 0.31027339f, 0.40673221f, 0.50101364f, - -0.47842978f, -0.03818905f, 0.07056377f, 0.03300345f, 0.02730699f, 0.05007915f, 0.02893237f, 0.02226785f, 0.04222222f, 0.04128904f, 0.03830734f, 0.01743857f, 0.03607951f, 0.02582752f, 0.04198512f, 0.04131589f, - -0.02242885f, 0.01802990f, -0.00361209f, 0.02714255f, 0.04843318f, 0.04306928f, 0.02675985f, 0.07964815f, 0.10019006f, 0.05262710f, 0.00113825f, -0.04747375f, -0.04988074f, -0.05204562f, -0.09989329f, -0.12170389f, - 0.28967652f, 0.36512749f, 0.38343313f, 0.37459919f, 0.29419461f, 0.21272806f, 0.14963422f, 0.11987446f, -0.00354946f, -0.11817788f, -0.21991893f, -0.37389500f, -0.43897693f, -0.47312318f, -0.36222971f, -0.19939667f, - -0.29847367f, -0.28024953f, -0.23616334f, -0.19456539f, -0.16497910f, -0.12215408f, -0.05213406f, 0.03088777f, 0.11427925f, 0.17777695f, 0.21315635f, 0.18382103f, 0.20758797f, 0.19478448f, 0.14014366f, 0.08628162f, - -0.01005369f, -0.03186180f, -0.07995901f, -0.10893772f, -0.11257191f, -0.10933952f, -0.06260446f, 0.01592879f, 0.06618622f, 0.08792663f, 0.09779631f, 0.06871009f, 0.06158038f, 0.04699408f, 0.04045205f, 0.02975352f, - -0.12591171f, -0.31330699f, -0.09207505f, 0.04353844f, 0.05691547f, 0.02830292f, 0.05190188f, 0.05663181f, 0.05579546f, 0.05136184f, 0.06373287f, 0.03243363f, 0.03631576f, 0.02886726f, 0.02108611f, 0.00441022f, - 0.51424359f, 0.44825357f, 0.27826391f, 0.14692419f, 0.04486213f, 0.01374316f, -0.05577450f, -0.06790050f, -0.10394906f, -0.14111342f, -0.16141165f, -0.18795338f, -0.17689540f, -0.18030471f, -0.19451666f, -0.17647134f, - 0.01250082f, -0.03513855f, -0.10558904f, -0.13589106f, -0.16642959f, -0.12403555f, -0.11639493f, -0.13504470f, -0.12448111f, -0.08902796f, 0.02742439f, 0.14597597f, 0.22586358f, 0.24372767f, 0.18517594f, 0.19136417f, - 0.00690369f, -0.06536790f, -0.04560492f, 0.17183296f, 0.06108150f, -0.14297504f, -0.10743566f, 0.00028842f, -0.00000737f, 0.01948888f, 0.04144583f, 0.01034213f, 0.01186359f, 0.01904016f, 0.01513936f, 0.00396440f, - -0.02696488f, -0.05930555f, -0.05635944f, 0.04417762f, 0.20483421f, 0.24818872f, 0.08337011f, -0.03555721f, -0.04496794f, -0.05268211f, -0.05177582f, -0.06105043f, -0.04493356f, -0.04903822f, -0.04844764f, -0.04948792f, - 0.09934599f, 0.20097988f, 0.02959104f, 0.10059414f, 0.36489123f, 0.42345991f, 0.31306867f, 0.19189664f, 0.02025838f, -0.16920767f, -0.19221388f, -0.36590851f, -0.24124038f, -0.21069901f, -0.24782116f, -0.31699542f, - -0.38302159f, -0.20867958f, -0.06199247f, 0.00929974f, -0.08763027f, 0.01230753f, 0.12845035f, 0.27194101f, 0.35480151f, 0.36726532f, 0.20142240f, -0.03957218f, -0.10891503f, -0.16235951f, -0.15207841f, -0.14123875f, - 0.29448433f, 0.27467021f, 0.21093907f, 0.02636253f, -0.10971996f, -0.06520899f, -0.09114815f, -0.19988466f, -0.25173695f, -0.21777001f, -0.19036007f, -0.10825290f, 0.00468462f, 0.07695453f, 0.14592570f, 0.20006079f, - -0.09613522f, -0.07305197f, 0.23140183f, -0.01276782f, -0.05046178f, -0.03690868f, 0.01854782f, -0.00516658f, -0.01794740f, 0.01127293f, 0.02845775f, 0.00246563f, -0.00285605f, -0.00274282f, 0.00447526f, 0.00141708f, - 0.09853152f, 0.23398475f, 0.15560679f, 0.01939291f, -0.05095939f, -0.10951335f, -0.08366621f, -0.03852663f, -0.00171258f, -0.01619636f, -0.02703945f, -0.04625883f, -0.03573599f, -0.03656223f, -0.03486191f, -0.02648302f, - -0.05407938f, -0.18042914f, -0.31075117f, -0.36223570f, -0.35545274f, -0.26114190f, -0.21540173f, -0.18652814f, -0.10764184f, -0.04326102f, 0.10627938f, 0.32432791f, 0.40043785f, 0.56193174f, 0.40395999f, 0.27998606f, - -0.22375901f, -0.11453094f, -0.06437672f, 0.02966050f, -0.06882505f, -0.02229970f, 0.00519106f, 0.04139490f, -0.21099529f, -0.00965469f, 0.01906172f, 0.06535794f, 0.27085374f, 0.36298568f, 0.13009871f, -0.21016295f, - 0.18023915f, 0.15936182f, 0.13064987f, 0.09848966f, 0.08230524f, 0.11068418f, 0.11168088f, 0.11505046f, 0.13567778f, 0.12259236f, 0.03115883f, -0.14115321f, -0.20420262f, -0.27855554f, -0.34034745f, -0.31363132f, - -0.12817652f, 0.06412346f, 0.23407500f, 0.37946648f, 0.31127015f, 0.27044470f, 0.18591463f, 0.13643852f, 0.07403884f, -0.00928348f, -0.10609226f, -0.26765738f, -0.35056732f, -0.38530570f, -0.26185421f, -0.14683496f, - -0.63004591f, -0.58451443f, -0.16857245f, -0.08058005f, -0.09034904f, 0.00601978f, 0.10036174f, 0.10417477f, 0.14447621f, 0.13945086f, 0.18409447f, 0.20139949f, 0.10118410f, 0.12033491f, 0.20454736f, 0.24801829f, - 0.09650912f, 0.15979369f, -0.02778062f, -0.21860304f, -0.09723043f, 0.03923136f, 0.06141602f, 0.00600025f, -0.03251321f, -0.01956117f, -0.01004770f, -0.01435564f, 0.01114831f, 0.01113413f, 0.01304939f, 0.02180959f, - -0.00555466f, -0.14717213f, -0.37968771f, -0.12250216f, 0.03497204f, 0.13708345f, 0.03564652f, 0.00785509f, 0.04438533f, 0.06495152f, 0.07142555f, 0.05800545f, 0.06370878f, 0.05930816f, 0.05015268f, 0.02742217f, - 0.24931986f, 0.21084678f, 0.15421842f, 0.14679305f, 0.11899038f, 0.10112391f, 0.08120544f, 0.01848917f, -0.03021656f, -0.11872087f, -0.17582510f, -0.27756371f, -0.26300284f, -0.17730239f, -0.07164775f, 0.03329224f, - -0.17764482f, -0.15058551f, -0.12627503f, -0.06547272f, -0.05935809f, -0.01277874f, 0.01723090f, -0.00829920f, -0.02788840f, 0.01142219f, 0.05531784f, 0.04254613f, 0.04730144f, 0.07050022f, 0.15526930f, 0.22871460f + -0.11376953f, -0.06591797f, 0.041992188f, 0.044677734f, 0.17871094f, -0.02758789f, -0.32592773f, -0.21069336f, -0.049072266f, 0.0126953125f, 0.012939453f, 0.015136719f, 0.08203125f, 0.12670898f, 0.12695312f, 0.15112305f, + -0.017089844f, 0.09326172f, 0.2355957f, 0.2241211f, 0.107421875f, 0.05029297f, 0.039794922f, -0.0073242188f, -0.048339844f, -0.0871582f, -0.08520508f, -0.12060547f, -0.111572266f, -0.10620117f, -0.08911133f, -0.078125f, + -0.26635742f, 0.27368164f, 0.4543457f, 0.1821289f, 0.6513672f, 0.18066406f, 0.14575195f, -0.008056641f, 0.2631836f, -0.045898438f, -0.52001953f, -0.1628418f, 0.038330078f, -0.31811523f, -0.4321289f, -0.43603516f, + -0.044189453f, -0.10449219f, -0.091796875f, -0.10620117f, -0.09423828f, 0.09326172f, 0.2697754f, 0.16577148f, 0.06201172f, 0.010986328f, 0.021728516f, -0.023925781f, -0.036621094f, -0.03930664f, -0.04345703f, -0.03930664f, + 0.4099121f, 0.06323242f, -0.021972656f, -0.014404297f, -0.013916016f, -0.018554688f, -0.052246094f, -0.051757812f, -0.03173828f, -0.03491211f, -0.02758789f, -0.05859375f, -0.045410156f, -0.042236328f, -0.038085938f, -0.021484375f, + 0.0024414062f, 0.030761719f, 0.020263672f, 0.013671875f, -0.009033203f, 0.012939453f, 0.009521484f, -0.030273438f, -0.048339844f, -0.022216797f, 0.011962891f, -0.017333984f, -0.011474609f, -0.0007324219f, 0.011962891f, 0.025634766f, + 0.17358398f, 0.22387695f, 0.19702148f, -0.019042969f, -0.27514648f, -0.5378418f, -0.30688477f, -0.03540039f, 0.0007324219f, -0.049560547f, 0.07519531f, 0.052246094f, 0.12670898f, 0.16308594f, 0.12133789f, 0.09033203f, + -0.32006836f, -0.29125977f, -0.24731445f, -0.17797852f, -0.140625f, -0.10595703f, -0.12670898f, -0.10864258f, -0.08618164f, -0.07421875f, 0.030517578f, 0.15917969f, 0.24975586f, 0.31518555f, 0.40893555f, 0.5151367f, + -0.49658203f, -0.033691406f, 0.083740234f, 0.04272461f, 0.03466797f, 0.053955078f, 0.03466797f, 0.02368164f, 0.037597656f, 0.03173828f, 0.028320312f, 0.00024414062f, 0.028564453f, 0.030761719f, 0.044189453f, 0.055419922f, + -0.040527344f, 0.022460938f, 0.009765625f, 0.036865234f, 0.055664062f, 0.046875f, 0.032470703f, 0.08105469f, 0.095703125f, 0.04296875f, -0.0087890625f, -0.064697266f, -0.057373047f, -0.04711914f, -0.09765625f, -0.107666016f, + 0.27148438f, 0.3696289f, 0.39672852f, 0.38427734f, 0.30151367f, 0.21655273f, 0.15551758f, 0.12133789f, -0.008056641f, -0.12792969f, -0.22973633f, -0.39111328f, -0.4465332f, -0.46826172f, -0.35986328f, -0.18530273f, + -0.3166504f, -0.2758789f, -0.22290039f, -0.1850586f, -0.15771484f, -0.1184082f, -0.04638672f, 0.032470703f, 0.10961914f, 0.16821289f, 0.20336914f, 0.1665039f, 0.20019531f, 0.19970703f, 0.14233398f, 0.1003418f, + -0.028076172f, -0.02734375f, -0.06665039f, -0.099365234f, -0.10522461f, -0.10546875f, -0.056884766f, 0.017333984f, 0.061523438f, 0.07836914f, 0.087890625f, 0.051513672f, 0.05419922f, 0.051757812f, 0.04272461f, 0.043945312f, + -0.14404297f, -0.3088379f, -0.07885742f, 0.053222656f, 0.064208984f, 0.032226562f, 0.057617188f, 0.05810547f, 0.05126953f, 0.041748047f, 0.053955078f, 0.015136719f, 0.028808594f, 0.033691406f, 0.0234375f, 0.018554688f, + 0.49609375f, 0.45263672f, 0.2915039f, 0.15649414f, 0.052246094f, 0.017578125f, -0.050048828f, -0.06640625f, -0.10839844f, -0.15063477f, -0.17138672f, -0.20532227f, -0.18432617f, -0.17553711f, -0.19213867f, -0.16235352f, + -0.0056152344f, -0.030761719f, -0.092285156f, -0.1262207f, -0.15917969f, -0.12011719f, -0.1105957f, -0.13354492f, -0.12915039f, -0.09863281f, 0.017578125f, 0.12866211f, 0.21850586f, 0.24853516f, 0.1875f, 0.20532227f, + -0.011230469f, -0.061035156f, -0.032226562f, 0.18139648f, 0.068359375f, -0.13916016f, -0.1015625f, 0.0017089844f, -0.004638672f, 0.009765625f, 0.03149414f, -0.0068359375f, 0.0043945312f, 0.023925781f, 0.017333984f, 0.018066406f, + -0.045166016f, -0.05493164f, -0.04296875f, 0.053710938f, 0.2121582f, 0.25195312f, 0.08911133f, -0.034179688f, -0.049560547f, -0.06225586f, -0.061523438f, -0.07836914f, -0.052490234f, -0.044189453f, -0.046142578f, -0.03540039f, + 0.08129883f, 0.20532227f, 0.04296875f, 0.11010742f, 0.3720703f, 0.4272461f, 0.31884766f, 0.19335938f, 0.015625f, -0.17895508f, -0.20214844f, -0.38330078f, -0.2487793f, -0.20581055f, -0.24560547f, -0.30297852f, + -0.40112305f, -0.2043457f, -0.048828125f, 0.018798828f, -0.080322266f, 0.016113281f, 0.13427734f, 0.2734375f, 0.3503418f, 0.35766602f, 0.19165039f, -0.056884766f, -0.11645508f, -0.1574707f, -0.14990234f, -0.12719727f, + 0.2763672f, 0.27905273f, 0.2241211f, 0.035888672f, -0.10253906f, -0.061523438f, -0.08544922f, -0.19848633f, -0.25634766f, -0.22729492f, -0.20019531f, -0.12548828f, -0.0026855469f, 0.08178711f, 0.14819336f, 0.21411133f, + -0.11425781f, -0.068603516f, 0.2446289f, -0.0031738281f, -0.04321289f, -0.033203125f, 0.024414062f, -0.0036621094f, -0.022460938f, 0.0017089844f, 0.018554688f, -0.014892578f, -0.010253906f, 0.0021972656f, 0.0068359375f, 0.015380859f, + 0.080322266f, 0.23852539f, 0.16894531f, 0.029052734f, -0.043701172f, -0.10571289f, -0.07788086f, -0.037109375f, -0.0063476562f, -0.025878906f, -0.036865234f, -0.06347656f, -0.04321289f, -0.03173828f, -0.032470703f, -0.012451172f, + -0.072265625f, -0.17602539f, -0.29736328f, -0.35253906f, -0.34814453f, -0.25732422f, -0.2097168f, -0.1850586f, -0.11230469f, -0.052978516f, 0.09643555f, 0.3071289f, 0.3930664f, 0.56689453f, 0.40625f, 0.2939453f, + -0.24194336f, -0.11010742f, -0.05102539f, 0.03930664f, -0.061523438f, -0.018554688f, 0.010986328f, 0.04296875f, -0.21557617f, -0.01928711f, 0.009277344f, 0.048095703f, 0.26342773f, 0.36791992f, 0.13232422f, -0.19604492f, + 0.16210938f, 0.16381836f, 0.14404297f, 0.1081543f, 0.08959961f, 0.11450195f, 0.11743164f, 0.11645508f, 0.13110352f, 0.11303711f, 0.021240234f, -0.15844727f, -0.21166992f, -0.27368164f, -0.33813477f, -0.29956055f, + -0.14624023f, 0.068603516f, 0.24731445f, 0.38916016f, 0.31860352f, 0.27416992f, 0.19165039f, 0.13793945f, 0.06958008f, -0.018798828f, -0.1159668f, -0.2849121f, -0.3581543f, -0.3803711f, -0.25952148f, -0.1328125f, + -0.64819336f, -0.5800781f, -0.15527344f, -0.07104492f, -0.08300781f, 0.009765625f, 0.10620117f, 0.10571289f, 0.13989258f, 0.12988281f, 0.1743164f, 0.18408203f, 0.09375f, 0.12524414f, 0.20678711f, 0.26220703f, + 0.07836914f, 0.16430664f, -0.014404297f, -0.20898438f, -0.08984375f, 0.04296875f, 0.06713867f, 0.0075683594f, -0.037109375f, -0.029296875f, -0.020019531f, -0.03173828f, 0.0036621094f, 0.016113281f, 0.015380859f, 0.035888672f, + -0.02368164f, -0.14282227f, -0.36645508f, -0.11279297f, 0.042236328f, 0.14086914f, 0.041503906f, 0.009277344f, 0.039794922f, 0.055419922f, 0.061523438f, 0.040771484f, 0.056152344f, 0.064208984f, 0.052490234f, 0.041503906f, + 0.23120117f, 0.21533203f, 0.16748047f, 0.15649414f, 0.1262207f, 0.10498047f, 0.08691406f, 0.020019531f, -0.03466797f, -0.12841797f, -0.18579102f, -0.29492188f, -0.2705078f, -0.17236328f, -0.06933594f, 0.04736328f, + -0.19580078f, -0.14624023f, -0.11303711f, -0.055908203f, -0.052001953f, -0.009033203f, 0.022949219f, -0.0068359375f, -0.032470703f, 0.0017089844f, 0.045410156f, 0.025146484f, 0.039794922f, 0.07543945f, 0.1574707f, 0.24267578f, }; const float ivas_sns_cdbks_side_tcx20_stage2[ 32 * 16 ] = { - -0.01387178f, 0.00066194f, 0.01705500f, 0.00585076f, 0.05625865f, -0.08189174f, -0.29272907f, 0.00394582f, 0.14068978f, 0.03888049f, 0.01046905f, 0.03828706f, 0.04214951f, 0.02083198f, 0.00583650f, 0.00757601f, - -0.07101791f, -0.10250166f, 0.03818920f, 0.09162373f, 0.11895681f, 0.13465195f, 0.05088923f, -0.11144198f, -0.13846971f, -0.20720284f, -0.25737659f, -0.15071919f, 0.03249921f, 0.08124332f, 0.17587328f, 0.31480317f, - 0.07163217f, 0.02904662f, 0.01959293f, 0.00805967f, 0.02343380f, 0.02069451f, 0.03232257f, 0.02206815f, 0.03462995f, 0.01790113f, -0.03778174f, -0.14048245f, -0.21681559f, -0.11035045f, 0.05755451f, 0.16849432f, - -0.10816723f, -0.02739052f, -0.08241511f, -0.08220118f, -0.07911491f, 0.04976754f, 0.10255540f, 0.23875558f, 0.25687913f, 0.03165525f, -0.15819986f, -0.14652796f, -0.00803674f, -0.00055281f, -0.01439374f, 0.02738701f, - -0.02270156f, 0.02799492f, 0.14119353f, -0.06753253f, -0.07348415f, 0.16270911f, -0.00726861f, -0.06576199f, -0.02852827f, -0.01072544f, -0.02385080f, 0.01259492f, -0.00575096f, -0.00670975f, -0.01412345f, -0.01805497f, - -0.09730804f, -0.09207854f, -0.06155676f, -0.01193574f, 0.00669004f, 0.04165295f, 0.00840306f, -0.01763756f, -0.08511468f, -0.12564582f, -0.06302424f, 0.13694410f, 0.25188182f, 0.15335399f, 0.00198570f, -0.04661036f, - -0.20229607f, 0.27055253f, 0.05937269f, 0.00423687f, 0.02212468f, -0.00979552f, -0.02654450f, -0.02737173f, -0.03263414f, -0.01695365f, -0.02587673f, -0.00157241f, -0.00766337f, -0.00946241f, 0.00474761f, -0.00086382f, - 0.06446543f, -0.26714355f, 0.12269745f, 0.02565502f, -0.00628892f, 0.00430942f, 0.00862473f, -0.00170779f, 0.00617105f, -0.00718104f, -0.01871731f, 0.01193483f, 0.00860795f, 0.00997801f, 0.02026700f, 0.01832765f, - -0.00061741f, -0.03771131f, -0.03643531f, -0.01560727f, 0.00567664f, -0.00566226f, -0.00287572f, 0.03281006f, 0.04750282f, 0.01895354f, -0.01051254f, 0.01765380f, 0.01259038f, 0.00436097f, -0.01332776f, -0.01679868f, - 0.06930783f, 0.05302917f, 0.06102093f, 0.13367091f, 0.13415662f, 0.00542245f, -0.09926086f, -0.18333294f, -0.21849319f, -0.08349384f, 0.02026711f, 0.05881583f, 0.01345789f, 0.01158885f, 0.01962784f, 0.00421544f, - 0.00361302f, -0.05045316f, -0.00509374f, 0.19082766f, -0.18804365f, -0.05470887f, 0.00052718f, -0.02162397f, -0.00194290f, 0.00166374f, 0.00419055f, 0.02490528f, 0.02211515f, 0.02768455f, 0.02704636f, 0.01929285f, - 0.02476472f, -0.00405085f, -0.02659682f, -0.08596413f, -0.06315428f, -0.06855039f, -0.07500519f, -0.05011866f, -0.06108486f, -0.00618761f, 0.05634272f, 0.08835189f, 0.05894742f, 0.06729406f, 0.07762828f, 0.06738369f, - 0.13702164f, 0.08497052f, 0.07105828f, 0.04681336f, 0.02464482f, 0.00482884f, -0.01068152f, -0.00650854f, 0.01424842f, -0.00735400f, -0.04158832f, -0.02704081f, -0.04141575f, -0.06089035f, -0.09289456f, -0.09521199f, - -0.16780678f, 0.06667456f, 0.18201515f, 0.07399154f, -0.01999438f, 0.05535422f, 0.03900328f, -0.12016656f, -0.10793461f, 0.12328733f, 0.37944090f, 0.03265145f, -0.16138072f, -0.15224770f, -0.10548425f, -0.11740339f, - -0.01321210f, -0.01125461f, -0.03726540f, 0.00275729f, -0.04632781f, -0.24449670f, 0.09996640f, 0.11060024f, 0.00843480f, 0.01020953f, 0.01323100f, 0.03866782f, 0.01652133f, 0.01477176f, 0.01931947f, 0.01807687f, - 0.04427139f, 0.07762448f, -0.03500615f, -0.18353333f, 0.15726631f, 0.06121580f, -0.02944487f, -0.01882019f, -0.02386520f, 0.00077271f, -0.01038885f, 0.00869168f, -0.00564164f, -0.00937383f, -0.01500538f, -0.01876296f, - 0.13690793f, 0.01111401f, -0.03351651f, -0.01725554f, -0.07761571f, -0.12250939f, -0.07631311f, -0.01738486f, 0.14254332f, 0.21322328f, 0.14586930f, 0.03233900f, -0.08363281f, -0.12036013f, -0.07612890f, -0.05727984f, - 0.02949784f, -0.12225020f, -0.24763790f, 0.09504104f, 0.18885156f, 0.02619185f, 0.01292378f, 0.03000215f, 0.00909582f, -0.00936785f, -0.02571287f, 0.00889712f, -0.00234566f, -0.00169068f, 0.00871879f, -0.00021486f, - -0.03852054f, -0.03889437f, -0.08884280f, -0.06896184f, 0.02214326f, 0.10225505f, 0.12832898f, 0.08401269f, 0.06576567f, 0.08182152f, 0.07603111f, 0.04006712f, -0.04791395f, -0.09454805f, -0.10354215f, -0.11920167f, - 0.00938218f, 0.04681937f, 0.08173506f, 0.03766262f, 0.00645705f, -0.03830769f, -0.01180921f, 0.28211251f, 0.02788724f, -0.25197511f, -0.12812732f, 0.01575526f, 0.01158131f, -0.01435589f, -0.04416799f, -0.03064940f, - 0.06374854f, 0.12417689f, 0.09544838f, -0.13379816f, -0.26304159f, -0.06323982f, 0.03308697f, 0.06602140f, 0.04869582f, 0.02626429f, 0.00579212f, 0.01966626f, -0.00288156f, -0.00594553f, -0.00083407f, -0.01315989f, - -0.01689007f, -0.05224654f, -0.05732359f, 0.00797541f, -0.01178359f, -0.06878838f, -0.08592686f, -0.01631491f, -0.01215461f, 0.04690048f, 0.18175850f, 0.26923595f, 0.13470179f, -0.02451530f, -0.12744548f, -0.16718270f, - -0.02187075f, -0.05395855f, -0.02263713f, -0.00045869f, 0.07200871f, 0.08343703f, 0.05673476f, -0.01486174f, 0.02824052f, 0.09407959f, 0.06117651f, -0.48782246f, -0.01849447f, 0.15501071f, 0.05869060f, 0.01072538f, - 0.38479396f, -0.04937867f, -0.07935772f, -0.02506650f, -0.02316760f, -0.02067798f, 0.02695150f, -0.00054291f, -0.05256493f, -0.03399701f, -0.04629317f, -0.01085654f, -0.01817534f, -0.02213798f, -0.01605045f, -0.01347864f, - -0.23847427f, -0.06501920f, -0.01803515f, -0.00348509f, 0.04039109f, 0.01940591f, 0.01835329f, 0.03075053f, 0.03001602f, 0.02853897f, 0.01016726f, 0.03707260f, 0.02160199f, 0.03493100f, 0.03506401f, 0.01872098f, - 0.03862266f, 0.02890076f, 0.02592629f, 0.04317070f, 0.03495444f, -0.02192080f, -0.03469867f, -0.01962511f, -0.02362473f, -0.09521267f, -0.13881717f, -0.03271523f, 0.01372571f, 0.05875682f, 0.06459397f, 0.05796305f, - -0.01487374f, 0.01485744f, 0.01264233f, 0.04546350f, 0.00733058f, 0.08289797f, 0.17793293f, 0.03071348f, -0.11739129f, -0.07170388f, -0.04800450f, -0.00719781f, -0.01613242f, -0.02445791f, -0.03329781f, -0.03877884f, - 0.06919396f, -0.04913878f, -0.23414589f, -0.32278902f, -0.15262688f, -0.02830432f, 0.05881428f, 0.05602689f, 0.08630162f, 0.08206753f, 0.05235369f, 0.05459854f, 0.02224523f, 0.07894449f, 0.13055514f, 0.09590365f, - -0.13456165f, -0.02675728f, 0.10718846f, 0.16038985f, 0.13314470f, 0.04370885f, 0.00879630f, 0.02004215f, 0.04004457f, 0.01767300f, -0.03006764f, -0.02489721f, -0.06793547f, -0.08666415f, -0.07647774f, -0.08362676f, - -0.01963376f, -0.05985601f, -0.06123515f, 0.00802984f, 0.03197310f, 0.08198580f, -0.04518129f, -0.25550460f, -0.02763673f, 0.10534295f, 0.06276998f, 0.04687612f, 0.02909544f, 0.03184387f, 0.04253063f, 0.02859974f, - -0.05005194f, 0.08455623f, 0.27160784f, 0.05333258f, -0.06395559f, -0.12989814f, -0.07303311f, -0.05166257f, -0.03661287f, -0.00149673f, -0.00090933f, 0.02163393f, 0.00899793f, -0.00065646f, -0.01328460f, -0.01856715f, - 0.08465235f, 0.18910437f, -0.17964239f, -0.01596332f, -0.01786381f, -0.02173723f, 0.00655794f, -0.00747303f, -0.01909382f, -0.01073786f, -0.01461080f, 0.01419150f, 0.00349640f, -0.00567498f, -0.00358136f, -0.00162392f + -0.013916016f, 0.0007324219f, 0.017089844f, 0.005859375f, 0.056152344f, -0.08178711f, -0.2927246f, 0.00390625f, 0.140625f, 0.03881836f, 0.010498047f, 0.038330078f, 0.042236328f, 0.020751953f, 0.005859375f, 0.0075683594f, + -0.07104492f, -0.10253906f, 0.038085938f, 0.091552734f, 0.118896484f, 0.13476562f, 0.05078125f, -0.111328125f, -0.13842773f, -0.20727539f, -0.25732422f, -0.15063477f, 0.032470703f, 0.08129883f, 0.17578125f, 0.31469727f, + 0.0715332f, 0.029052734f, 0.01953125f, 0.008056641f, 0.0234375f, 0.020751953f, 0.032226562f, 0.021972656f, 0.03466797f, 0.017822266f, -0.037841797f, -0.14038086f, -0.21679688f, -0.11035156f, 0.057617188f, 0.16845703f, + -0.1081543f, -0.02734375f, -0.08251953f, -0.08227539f, -0.07910156f, 0.049804688f, 0.10253906f, 0.23876953f, 0.25683594f, 0.03173828f, -0.15820312f, -0.14648438f, -0.008056641f, -0.00048828125f, -0.014404297f, 0.02734375f, + -0.022705078f, 0.028076172f, 0.14111328f, -0.06762695f, -0.07348633f, 0.16259766f, -0.0073242188f, -0.06567383f, -0.028564453f, -0.0107421875f, -0.023925781f, 0.0126953125f, -0.005859375f, -0.006591797f, -0.014160156f, -0.018066406f, + -0.09741211f, -0.092041016f, -0.061523438f, -0.011962891f, 0.006591797f, 0.041748047f, 0.008300781f, -0.017578125f, -0.08520508f, -0.12573242f, -0.06298828f, 0.13696289f, 0.25195312f, 0.15332031f, 0.001953125f, -0.04663086f, + -0.20239258f, 0.2705078f, 0.059326172f, 0.0041503906f, 0.022216797f, -0.009765625f, -0.026611328f, -0.02734375f, -0.032714844f, -0.016845703f, -0.025878906f, -0.0014648438f, -0.0075683594f, -0.009521484f, 0.004638672f, -0.0009765625f, + 0.064453125f, -0.26708984f, 0.122802734f, 0.025634766f, -0.0063476562f, 0.0043945312f, 0.008544922f, -0.0017089844f, 0.0061035156f, -0.007080078f, -0.018798828f, 0.011962891f, 0.008544922f, 0.010009766f, 0.020263672f, 0.018310547f, + -0.0007324219f, -0.037597656f, -0.036376953f, -0.015625f, 0.0056152344f, -0.0056152344f, -0.0029296875f, 0.032714844f, 0.047607422f, 0.019042969f, -0.010498047f, 0.017578125f, 0.0126953125f, 0.0043945312f, -0.013427734f, -0.016845703f, + 0.06933594f, 0.052978516f, 0.061035156f, 0.13378906f, 0.13427734f, 0.0053710938f, -0.099365234f, -0.18334961f, -0.21850586f, -0.083496094f, 0.020263672f, 0.05883789f, 0.013427734f, 0.011474609f, 0.01953125f, 0.0041503906f, + 0.0036621094f, -0.05053711f, -0.005126953f, 0.19091797f, -0.18798828f, -0.0546875f, 0.00048828125f, -0.021728516f, -0.001953125f, 0.0017089844f, 0.0041503906f, 0.024902344f, 0.022216797f, 0.02758789f, 0.02709961f, 0.01928711f, + 0.024658203f, -0.0041503906f, -0.026611328f, -0.0859375f, -0.06323242f, -0.068603516f, -0.07495117f, -0.050048828f, -0.061035156f, -0.0061035156f, 0.056396484f, 0.088378906f, 0.05883789f, 0.06738281f, 0.07763672f, 0.06738281f, + 0.13696289f, 0.08496094f, 0.07104492f, 0.046875f, 0.024658203f, 0.0048828125f, -0.0107421875f, -0.006591797f, 0.014160156f, -0.0073242188f, -0.041503906f, -0.02709961f, -0.041503906f, -0.060791016f, -0.09277344f, -0.095214844f, + -0.16772461f, 0.06665039f, 0.1821289f, 0.07397461f, -0.020019531f, 0.055419922f, 0.0390625f, -0.12011719f, -0.107910156f, 0.123291016f, 0.37939453f, 0.032714844f, -0.16137695f, -0.15234375f, -0.10546875f, -0.11743164f, + -0.013183594f, -0.011230469f, -0.037353516f, 0.0026855469f, -0.04638672f, -0.24438477f, 0.099853516f, 0.1105957f, 0.008544922f, 0.010253906f, 0.013183594f, 0.03857422f, 0.016601562f, 0.014892578f, 0.01928711f, 0.018066406f, + 0.044189453f, 0.07763672f, -0.03491211f, -0.18359375f, 0.15722656f, 0.061279297f, -0.029541016f, -0.018798828f, -0.023925781f, 0.0007324219f, -0.010498047f, 0.0087890625f, -0.0056152344f, -0.009277344f, -0.014892578f, -0.018798828f, + 0.13696289f, 0.011230469f, -0.033447266f, -0.017333984f, -0.07763672f, -0.122558594f, -0.076416016f, -0.017333984f, 0.14257812f, 0.21313477f, 0.14575195f, 0.032226562f, -0.083740234f, -0.12036133f, -0.076171875f, -0.057373047f, + 0.029541016f, -0.12231445f, -0.2475586f, 0.0949707f, 0.18896484f, 0.026123047f, 0.012939453f, 0.030029297f, 0.009033203f, -0.009277344f, -0.025634766f, 0.0087890625f, -0.0024414062f, -0.0017089844f, 0.0087890625f, -0.00024414062f, + -0.03857422f, -0.03881836f, -0.08886719f, -0.068847656f, 0.022216797f, 0.10229492f, 0.12841797f, 0.083984375f, 0.06567383f, 0.08178711f, 0.075927734f, 0.040039062f, -0.047851562f, -0.09448242f, -0.103515625f, -0.119140625f, + 0.009277344f, 0.046875f, 0.08178711f, 0.037597656f, 0.0063476562f, -0.038330078f, -0.01171875f, 0.28222656f, 0.027832031f, -0.25195312f, -0.12817383f, 0.01586914f, 0.011474609f, -0.014404297f, -0.044189453f, -0.030761719f, + 0.0637207f, 0.12426758f, 0.095458984f, -0.13378906f, -0.26293945f, -0.06323242f, 0.033203125f, 0.06591797f, 0.048583984f, 0.026367188f, 0.005859375f, 0.01977539f, -0.0029296875f, -0.005859375f, -0.0007324219f, -0.013183594f, + -0.016845703f, -0.052246094f, -0.057373047f, 0.008056641f, -0.01171875f, -0.068847656f, -0.0859375f, -0.016357422f, -0.012207031f, 0.046875f, 0.18164062f, 0.2692871f, 0.13476562f, -0.024414062f, -0.1274414f, -0.16723633f, + -0.021972656f, -0.053955078f, -0.022705078f, -0.00048828125f, 0.072021484f, 0.083496094f, 0.056640625f, -0.014892578f, 0.028320312f, 0.09399414f, 0.061279297f, -0.48779297f, -0.018554688f, 0.1550293f, 0.05859375f, 0.0107421875f, + 0.38476562f, -0.049316406f, -0.0793457f, -0.025146484f, -0.02319336f, -0.020751953f, 0.026855469f, -0.00048828125f, -0.052490234f, -0.033935547f, -0.04638672f, -0.0107421875f, -0.018066406f, -0.022216797f, -0.016113281f, -0.013427734f, + -0.23852539f, -0.064941406f, -0.018066406f, -0.0034179688f, 0.040283203f, 0.01928711f, 0.018310547f, 0.030761719f, 0.030029297f, 0.028564453f, 0.010253906f, 0.037109375f, 0.021484375f, 0.03491211f, 0.03515625f, 0.018798828f, + 0.03857422f, 0.028808594f, 0.025878906f, 0.04321289f, 0.03491211f, -0.021972656f, -0.03466797f, -0.01953125f, -0.02368164f, -0.095214844f, -0.13891602f, -0.032714844f, 0.013671875f, 0.05883789f, 0.064697266f, 0.057861328f, + -0.014892578f, 0.014892578f, 0.0126953125f, 0.045410156f, 0.0073242188f, 0.08300781f, 0.17797852f, 0.030761719f, -0.11743164f, -0.071777344f, -0.048095703f, -0.007080078f, -0.016113281f, -0.024414062f, -0.033203125f, -0.03881836f, + 0.0690918f, -0.049072266f, -0.23413086f, -0.3227539f, -0.15258789f, -0.028320312f, 0.05883789f, 0.055908203f, 0.08618164f, 0.08203125f, 0.052246094f, 0.0546875f, 0.022216797f, 0.07885742f, 0.13061523f, 0.095947266f, + -0.13452148f, -0.026855469f, 0.107177734f, 0.16040039f, 0.13305664f, 0.043701172f, 0.0087890625f, 0.020019531f, 0.040039062f, 0.017578125f, -0.030029297f, -0.024902344f, -0.067871094f, -0.08666992f, -0.076416016f, -0.083740234f, + -0.01953125f, -0.059814453f, -0.061279297f, 0.008056641f, 0.031982422f, 0.08203125f, -0.045166016f, -0.25561523f, -0.02758789f, 0.10522461f, 0.06274414f, 0.046875f, 0.029052734f, 0.03173828f, 0.04248047f, 0.028564453f, + -0.050048828f, 0.084472656f, 0.27172852f, 0.053222656f, -0.063964844f, -0.12988281f, -0.07299805f, -0.051757812f, -0.036621094f, -0.0014648438f, -0.0009765625f, 0.021728516f, 0.009033203f, -0.0007324219f, -0.013183594f, -0.018554688f, + 0.0847168f, 0.18920898f, -0.1796875f, -0.01586914f, -0.017822266f, -0.021728516f, 0.006591797f, -0.0075683594f, -0.019042969f, -0.0107421875f, -0.0146484375f, 0.014160156f, 0.0034179688f, -0.0056152344f, -0.0036621094f, -0.0017089844f, }; const float *const ivas_sns_cdbks_side_tcx20[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx20_stage1, ivas_sns_cdbks_side_tcx20_stage2 }; -const float ivas_sns_means_side_tcx10[M] = { - -0.0085f , 0.0070f , 0.0074f , 0.0045f, - -0.0038f , 0.0071f , 0.0040f , -0.0068f, - -0.0104f , -0.0095f , -0.0259f , -0.0163f, - 0.0127f , 0.0087f , 0.0036f , 0.0262f -}; - const float ivas_sns_cdbks_side_tcx10_stage1[ 32 * 16 ] = { - -0.23085418f, -0.21005449f, -0.18570241f, -0.13606880f, -0.11948469f, -0.10308038f, -0.11104958f, -0.15882089f, -0.13896854f, -0.06621316f, 0.05217852f, 0.11795393f, 0.15762859f, 0.26837024f, 0.37542593f, 0.48873907f, - 0.13745600f, 0.20131847f, 0.22182278f, 0.29526068f, 0.24656821f, 0.13757111f, 0.07460669f, 0.03134436f, -0.06561883f, -0.17480962f, -0.24070771f, -0.31627147f, -0.28865063f, -0.14849001f, -0.03399112f, -0.07740884f, - -0.13299250f, -0.14002491f, -0.11936499f, -0.04179630f, -0.03438902f, 0.04431344f, 0.06951552f, 0.01403797f, 0.05531963f, -0.01394528f, -0.09745552f, 0.00448586f, 0.26823524f, 0.23321159f, 0.06675539f, -0.17590634f, - 0.06191756f, 0.11582434f, 0.13192343f, 0.09527126f, 0.08193836f, 0.01139745f, 0.03044540f, 0.11065563f, 0.07578016f, -0.02083963f, -0.07297648f, -0.08340844f, -0.07282079f, -0.12840160f, -0.18605485f, -0.15065167f, - -0.03483375f, -0.04038755f, -0.07410056f, -0.06961358f, -0.04495163f, -0.12359739f, -0.20954724f, -0.19583867f, -0.14529606f, 0.00841374f, 0.12968518f, 0.22831580f, 0.23147392f, 0.13653895f, 0.09511995f, 0.10861877f, - 0.06658553f, 0.21860187f, 0.09436141f, -0.09071645f, -0.07082980f, 0.04518200f, 0.04859027f, -0.03547180f, -0.06006165f, -0.02756024f, 0.00158143f, -0.01511772f, -0.04477551f, -0.04937419f, -0.04159366f, -0.03940128f, - 0.02864506f, -0.04039106f, -0.15284948f, -0.42538299f, -0.19236357f, 0.03104685f, 0.02253710f, 0.02311004f, 0.04867318f, 0.06745871f, 0.09338212f, 0.09710035f, 0.07856015f, 0.09301454f, 0.11632315f, 0.11113598f, - 0.14528623f, 0.29868967f, 0.46429789f, 0.54323288f, 0.40204138f, 0.26355278f, 0.17207026f, 0.09889195f, -0.00279626f, -0.16206412f, -0.29083020f, -0.40501466f, -0.54537297f, -0.46768767f, -0.27766915f, -0.23662804f, - -0.38143153f, -0.38286102f, -0.37711911f, -0.29609917f, -0.25719669f, -0.20628984f, -0.15545466f, -0.08387721f, -0.03028209f, 0.14307072f, 0.32718172f, 0.40216059f, 0.39369890f, 0.30234268f, 0.29650354f, 0.30565312f, - 0.35958422f, 0.51604595f, 0.41116626f, 0.13914238f, -0.03378266f, -0.13855653f, -0.18788816f, -0.17389274f, -0.14739128f, -0.16521614f, -0.14451729f, -0.13567903f, -0.09514774f, -0.07488226f, -0.06811874f, -0.06086662f, - -0.66004345f, -0.31718869f, -0.22177390f, -0.12449418f, -0.09939825f, 0.07331022f, 0.21408044f, 0.21558931f, 0.11208625f, 0.04257974f, -0.01807639f, 0.09442548f, 0.06053141f, 0.06888331f, 0.20357028f, 0.35591847f, - -0.16304924f, -0.12420037f, -0.04222860f, 0.05588216f, 0.18467874f, 0.32957705f, 0.39156897f, 0.27848510f, 0.13897139f, -0.02741662f, -0.14580317f, -0.19651482f, -0.22072919f, -0.18213237f, -0.12846721f, -0.14862176f, - -0.17887269f, -0.40659902f, -0.02516902f, 0.09601495f, 0.06138763f, 0.02130781f, 0.05102018f, 0.04939750f, 0.05199909f, 0.05639114f, 0.06766195f, 0.07106289f, 0.04938017f, 0.02276475f, 0.00986626f, 0.00238653f, - 0.35668951f, 0.22742896f, -0.06232152f, -0.18667516f, -0.28394315f, -0.31893226f, -0.28501785f, -0.19154472f, -0.14625471f, -0.07293625f, 0.05620192f, 0.15269426f, 0.20840665f, 0.19892856f, 0.16095072f, 0.18632539f, - -0.04935166f, -0.11272268f, 0.08233717f, 0.29988006f, 0.19331526f, 0.14054174f, 0.08680898f, -0.01410902f, -0.04313985f, -0.03494681f, -0.04540697f, -0.07243925f, -0.09250963f, -0.09472804f, -0.10148439f, -0.14204503f, - 0.18485137f, 0.25341568f, 0.21009944f, 0.20568550f, 0.20518381f, 0.27019582f, 0.21216885f, 0.00546777f, -0.00044021f, -0.10735443f, -0.20735090f, -0.14224940f, -0.09351389f, -0.09761419f, -0.36078632f, -0.53775866f, - -0.37281135f, -0.49261999f, -0.36727842f, -0.16577288f, -0.02238290f, 0.00199674f, -0.01679564f, 0.04714198f, 0.10589472f, 0.16394573f, 0.18921056f, 0.20782063f, 0.19861654f, 0.19447370f, 0.17625681f, 0.15230414f, - 0.06686853f, 0.05611921f, 0.03365910f, 0.02756852f, 0.08295478f, 0.06008045f, -0.03273553f, -0.04364718f, -0.01449926f, -0.16865975f, -0.29690154f, -0.15022460f, -0.01812698f, 0.04654261f, 0.11587511f, 0.23512676f, - 0.05629958f, -0.04922929f, -0.24893641f, -0.04282766f, 0.05664299f, 0.06157661f, 0.05406340f, 0.01868661f, -0.00352496f, -0.00155314f, 0.04576544f, 0.04384907f, 0.01829060f, 0.01451148f, 0.01064548f, -0.03425997f, - 0.00489548f, -0.00560306f, 0.00615573f, -0.00441324f, 0.02514502f, 0.02634783f, 0.01098806f, 0.01133668f, 0.06739798f, 0.14368795f, 0.11283267f, 0.01118776f, -0.08555990f, -0.10393666f, -0.11315265f, -0.10730981f, - -0.15112519f, -0.11783557f, -0.13754019f, -0.07632290f, -0.06121828f, -0.06360113f, -0.05018035f, -0.00549590f, 0.05908192f, 0.04630727f, 0.02538631f, -0.00811102f, -0.02567731f, 0.08327373f, 0.21071206f, 0.27234661f, - 0.56834545f, 0.15133540f, -0.01992277f, -0.04770211f, -0.05432411f, -0.02191499f, -0.02550971f, -0.03144176f, -0.02317891f, -0.02811835f, -0.04327235f, -0.06018613f, -0.07647819f, -0.07349573f, -0.08821391f, -0.12592196f, - -0.03137272f, -0.03974785f, -0.03770784f, -0.05600026f, -0.03191645f, -0.04815164f, -0.04304812f, 0.02455638f, 0.06207261f, 0.02331568f, -0.01876696f, -0.04473163f, -0.02498340f, 0.06425271f, 0.11960865f, 0.08262092f, - 0.45973777f, 0.45999547f, 0.38173824f, 0.22785755f, 0.16821465f, 0.17382620f, 0.20517627f, 0.04061839f, -0.12685907f, -0.26643193f, -0.37356030f, -0.36765140f, -0.32336919f, -0.29335060f, -0.29318189f, -0.07275984f, - -0.07969188f, -0.23669686f, -0.42690692f, -0.49932686f, -0.40006183f, -0.28450852f, -0.22942850f, -0.12475617f, -0.03421007f, 0.12993786f, 0.27530393f, 0.32731838f, 0.50859567f, 0.47553443f, 0.32383390f, 0.27506335f, - 0.34046042f, 0.28909102f, 0.17226731f, 0.06244214f, 0.10377957f, 0.13146006f, 0.03081777f, -0.02599206f, -0.11020633f, -0.20031818f, -0.27040991f, -0.19266314f, -0.09502591f, -0.17705982f, -0.16383079f, 0.10518781f, - -0.43345226f, 0.01054419f, 0.06653837f, 0.02899912f, 0.04789640f, 0.03995846f, 0.02631173f, 0.04744618f, 0.05142942f, 0.03249742f, 0.03044055f, 0.03518159f, 0.01592359f, 0.00998224f, -0.00417209f, -0.00552518f, - -0.35779590f, -0.24084024f, -0.08920896f, -0.01964746f, -0.04518980f, 0.07193759f, 0.22722040f, 0.28999718f, 0.39417664f, 0.30171530f, 0.12526317f, 0.00759665f, -0.11081727f, -0.17325866f, -0.19301481f, -0.18813416f, - -0.16184582f, -0.19051919f, -0.19758934f, -0.16274525f, -0.19869541f, -0.22576659f, -0.13506612f, 0.01672518f, 0.13044875f, 0.26035967f, 0.27598891f, 0.22195891f, 0.13262193f, 0.13096192f, 0.10021772f, 0.00294471f, - 0.07825952f, 0.06525092f, 0.17527642f, 0.02096373f, -0.24373383f, -0.29324959f, -0.11558339f, -0.03040273f, 0.01406029f, 0.04150557f, 0.06984124f, 0.07372710f, 0.06551062f, 0.06332513f, 0.02509070f, -0.00984142f, - 0.08701726f, 0.12843394f, 0.16700094f, 0.15034452f, 0.12947411f, -0.01656238f, -0.15483649f, -0.18970569f, -0.18557831f, -0.09352705f, -0.01998975f, -0.00988876f, 0.00753489f, 0.01530672f, 0.00965047f, -0.02467425f, - 0.26197082f, 0.21849905f, 0.21673972f, 0.16654799f, 0.18547759f, 0.16177425f, 0.16111117f, 0.20927596f, 0.18073438f, 0.03535012f, -0.14032550f, -0.22486416f, -0.33259461f, -0.40957544f, -0.38613800f, -0.30398287f + -0.23950195f, -0.203125f, -0.17822266f, -0.1315918f, -0.123291016f, -0.095947266f, -0.106933594f, -0.16552734f, -0.14941406f, -0.075683594f, 0.026367188f, 0.1015625f, 0.17041016f, 0.2770996f, 0.37890625f, 0.5148926f, + 0.12890625f, 0.20825195f, 0.22924805f, 0.2998047f, 0.24267578f, 0.14477539f, 0.07861328f, 0.024658203f, -0.076171875f, -0.18432617f, -0.26660156f, -0.33251953f, -0.2758789f, -0.13964844f, -0.030517578f, -0.05126953f, + -0.14160156f, -0.13305664f, -0.111816406f, -0.037353516f, -0.038085938f, 0.051513672f, 0.07348633f, 0.0073242188f, 0.044921875f, -0.0234375f, -0.123291016f, -0.01171875f, 0.28100586f, 0.24194336f, 0.0703125f, -0.1496582f, + 0.053466797f, 0.122802734f, 0.1394043f, 0.099853516f, 0.078125f, 0.018554688f, 0.034423828f, 0.103759766f, 0.06542969f, -0.030273438f, -0.09887695f, -0.099609375f, -0.060058594f, -0.119628906f, -0.18237305f, -0.12451172f, + -0.04345703f, -0.033447266f, -0.06665039f, -0.06518555f, -0.048828125f, -0.11645508f, -0.2055664f, -0.20263672f, -0.15576172f, -0.0009765625f, 0.103759766f, 0.21191406f, 0.24414062f, 0.14526367f, 0.09863281f, 0.13476562f, + 0.05810547f, 0.22558594f, 0.10180664f, -0.08618164f, -0.07470703f, 0.052246094f, 0.052490234f, -0.042236328f, -0.07055664f, -0.037109375f, -0.024169922f, -0.03149414f, -0.031982422f, -0.040527344f, -0.038085938f, -0.013183594f, + 0.020019531f, -0.033447266f, -0.14550781f, -0.42089844f, -0.19604492f, 0.038085938f, 0.026611328f, 0.016357422f, 0.038330078f, 0.057861328f, 0.06762695f, 0.08081055f, 0.091308594f, 0.10180664f, 0.11987305f, 0.13720703f, + 0.13671875f, 0.30566406f, 0.4716797f, 0.54785156f, 0.39819336f, 0.27075195f, 0.17602539f, 0.092041016f, -0.013183594f, -0.17163086f, -0.3166504f, -0.42138672f, -0.53271484f, -0.45898438f, -0.27416992f, -0.21044922f, + -0.38989258f, -0.37597656f, -0.3696289f, -0.2915039f, -0.26098633f, -0.19921875f, -0.15136719f, -0.09057617f, -0.040771484f, 0.13354492f, 0.30126953f, 0.3857422f, 0.40649414f, 0.31103516f, 0.30004883f, 0.3317871f, + 0.35107422f, 0.5229492f, 0.41870117f, 0.14355469f, -0.037597656f, -0.13134766f, -0.18383789f, -0.18066406f, -0.15771484f, -0.17480469f, -0.17041016f, -0.15209961f, -0.08251953f, -0.06616211f, -0.064453125f, -0.03466797f, + -0.66845703f, -0.31030273f, -0.21435547f, -0.11987305f, -0.103271484f, 0.080322266f, 0.21801758f, 0.20874023f, 0.1015625f, 0.032958984f, -0.043945312f, 0.078125f, 0.07324219f, 0.07763672f, 0.20727539f, 0.38208008f, + -0.17163086f, -0.1171875f, -0.03491211f, 0.060302734f, 0.1809082f, 0.33666992f, 0.3955078f, 0.27172852f, 0.12841797f, -0.036865234f, -0.17163086f, -0.21289062f, -0.20800781f, -0.17333984f, -0.125f, -0.12231445f, + -0.1875f, -0.3996582f, -0.017822266f, 0.10058594f, 0.057617188f, 0.028320312f, 0.05493164f, 0.04272461f, 0.041503906f, 0.046875f, 0.041748047f, 0.0546875f, 0.06201172f, 0.03149414f, 0.013427734f, 0.028564453f, + 0.34814453f, 0.234375f, -0.05493164f, -0.1821289f, -0.2878418f, -0.31176758f, -0.28100586f, -0.19824219f, -0.15673828f, -0.08251953f, 0.030273438f, 0.13647461f, 0.2211914f, 0.20776367f, 0.16455078f, 0.21240234f, + -0.057861328f, -0.10571289f, 0.08984375f, 0.30444336f, 0.18945312f, 0.14770508f, 0.09082031f, -0.020996094f, -0.053466797f, -0.044433594f, -0.07128906f, -0.08886719f, -0.079833984f, -0.0859375f, -0.09790039f, -0.1159668f, + 0.17626953f, 0.26049805f, 0.2175293f, 0.21020508f, 0.20141602f, 0.27734375f, 0.21606445f, -0.0012207031f, -0.010986328f, -0.11694336f, -0.2331543f, -0.15844727f, -0.08081055f, -0.08886719f, -0.35717773f, -0.5114746f, + -0.38134766f, -0.4855957f, -0.35986328f, -0.16137695f, -0.026123047f, 0.009033203f, -0.0126953125f, 0.040283203f, 0.095458984f, 0.15454102f, 0.16333008f, 0.19140625f, 0.21142578f, 0.203125f, 0.17993164f, 0.1784668f, + 0.05834961f, 0.06298828f, 0.041015625f, 0.031982422f, 0.07910156f, 0.06713867f, -0.028808594f, -0.05053711f, -0.024902344f, -0.17822266f, -0.3227539f, -0.1665039f, -0.0053710938f, 0.05517578f, 0.119384766f, 0.26123047f, + 0.047851562f, -0.042236328f, -0.24145508f, -0.038330078f, 0.052734375f, 0.068603516f, 0.05810547f, 0.011962891f, -0.013916016f, -0.010986328f, 0.020019531f, 0.02758789f, 0.03100586f, 0.02319336f, 0.014160156f, -0.008056641f, + -0.0036621094f, 0.0014648438f, 0.013671875f, 0.0f, 0.021240234f, 0.033447266f, 0.014892578f, 0.004638672f, 0.056884766f, 0.13427734f, 0.08691406f, -0.005126953f, -0.072753906f, -0.095214844f, -0.10961914f, -0.08105469f, + -0.15966797f, -0.110839844f, -0.13012695f, -0.071777344f, -0.064941406f, -0.056396484f, -0.046142578f, -0.012207031f, 0.048583984f, 0.036865234f, -0.00048828125f, -0.024414062f, -0.012939453f, 0.092041016f, 0.21435547f, 0.29858398f, + 0.55981445f, 0.15820312f, -0.012451172f, -0.04321289f, -0.05810547f, -0.014892578f, -0.021484375f, -0.038330078f, -0.033691406f, -0.037597656f, -0.0690918f, -0.076416016f, -0.0637207f, -0.064697266f, -0.0847168f, -0.099853516f, + -0.039794922f, -0.032714844f, -0.030273438f, -0.051513672f, -0.03564453f, -0.041015625f, -0.0390625f, 0.017822266f, 0.051513672f, 0.013916016f, -0.044677734f, -0.061035156f, -0.012207031f, 0.07299805f, 0.123291016f, 0.10888672f, + 0.45117188f, 0.46704102f, 0.38916016f, 0.23242188f, 0.16430664f, 0.1809082f, 0.20922852f, 0.033935547f, -0.13720703f, -0.2758789f, -0.39941406f, -0.3840332f, -0.31054688f, -0.28466797f, -0.28955078f, -0.04663086f, + -0.088134766f, -0.22973633f, -0.4194336f, -0.49487305f, -0.4038086f, -0.27734375f, -0.2253418f, -0.1315918f, -0.044677734f, 0.12036133f, 0.24951172f, 0.31103516f, 0.52124023f, 0.484375f, 0.32739258f, 0.30126953f, + 0.33203125f, 0.29614258f, 0.1796875f, 0.06689453f, 0.100097656f, 0.13867188f, 0.03491211f, -0.032714844f, -0.12060547f, -0.2097168f, -0.29638672f, -0.20898438f, -0.08227539f, -0.16821289f, -0.16015625f, 0.13134766f, + -0.44189453f, 0.017578125f, 0.07397461f, 0.033447266f, 0.044189453f, 0.04711914f, 0.030273438f, 0.040771484f, 0.041015625f, 0.022949219f, 0.004638672f, 0.018798828f, 0.028564453f, 0.018798828f, -0.00048828125f, 0.020751953f, + -0.36621094f, -0.23388672f, -0.08178711f, -0.015136719f, -0.049072266f, 0.07910156f, 0.23120117f, 0.28320312f, 0.38378906f, 0.29223633f, 0.099365234f, -0.0087890625f, -0.09814453f, -0.16455078f, -0.18945312f, -0.16186523f, + -0.17041016f, -0.18359375f, -0.19018555f, -0.15820312f, -0.20239258f, -0.21875f, -0.13110352f, 0.010009766f, 0.12011719f, 0.25097656f, 0.25024414f, 0.2055664f, 0.14526367f, 0.13964844f, 0.103759766f, 0.029052734f, + 0.06982422f, 0.072265625f, 0.18261719f, 0.025390625f, -0.2475586f, -0.2861328f, -0.111572266f, -0.037109375f, 0.0036621094f, 0.031982422f, 0.043945312f, 0.057373047f, 0.078125f, 0.072021484f, 0.028564453f, 0.016357422f, + 0.07836914f, 0.13549805f, 0.1743164f, 0.15478516f, 0.12573242f, -0.009521484f, -0.1508789f, -0.1965332f, -0.19604492f, -0.103027344f, -0.045898438f, -0.026123047f, 0.020263672f, 0.023925781f, 0.013183594f, 0.0014648438f, + 0.25341797f, 0.22558594f, 0.2241211f, 0.17114258f, 0.18164062f, 0.16894531f, 0.16503906f, 0.20239258f, 0.17041016f, 0.025878906f, -0.16625977f, -0.24121094f, -0.31982422f, -0.4008789f, -0.38256836f, -0.27783203f, }; const float ivas_sns_cdbks_side_tcx10_stage2[ 8 * 16 ] = { - -0.13993218f, -0.02453874f, 0.12672628f, 0.02785695f, 0.06681568f, 0.12811808f, 0.07492973f, -0.01977524f, -0.05822869f, -0.07547464f, -0.06553072f, -0.05473233f, -0.04357434f, -0.00634272f, 0.03406826f, 0.02961442f, - -0.06711216f, -0.11444162f, -0.09789788f, -0.09123304f, -0.12190348f, -0.00995424f, 0.10989921f, 0.11555575f, 0.06002452f, 0.03801973f, 0.02047622f, 0.01721280f, 0.02414692f, 0.02829613f, 0.03827912f, 0.05063187f, - 0.05523005f, 0.03052467f, 0.03910551f, 0.05802321f, 0.02158461f, 0.03249705f, 0.04015871f, -0.00878163f, -0.05597684f, -0.02391125f, 0.03722223f, 0.06349026f, 0.02718346f, -0.07380323f, -0.12743287f, -0.11511406f, - 0.11202279f, 0.20074913f, 0.04546646f, -0.10844616f, -0.14193153f, -0.08529745f, -0.03252409f, 0.03394947f, 0.04414551f, 0.00658101f, -0.01249852f, -0.01845361f, -0.01335408f, -0.01042434f, -0.00769413f, -0.01229041f, - -0.04167890f, -0.07371348f, -0.14826543f, 0.02126701f, 0.16009313f, 0.11910639f, 0.05602141f, 0.08082496f, 0.12544839f, 0.05415940f, -0.03080142f, -0.04070302f, -0.06024186f, -0.07129750f, -0.07769974f, -0.07251926f, - -0.07457123f, -0.04115197f, -0.04049765f, -0.06857318f, -0.04225051f, -0.03861733f, -0.05120942f, -0.08876715f, -0.05537668f, 0.03678654f, 0.09038235f, 0.06681871f, 0.08915640f, 0.13108744f, 0.08129597f, 0.00548771f, - -0.05294641f, 0.03370244f, 0.16024587f, 0.17199155f, 0.02454307f, -0.13278320f, -0.13945295f, -0.04199699f, 0.00678627f, 0.02029543f, 0.00856028f, 0.00137417f, -0.01135502f, -0.03017687f, -0.02257884f, 0.00379131f, - 0.20898804f, -0.01113044f, -0.08488316f, -0.01088633f, 0.03304903f, -0.01306932f, -0.05782260f, -0.07100917f, -0.06682249f, -0.05645623f, -0.04781041f, -0.03500698f, -0.01196148f, 0.03266111f, 0.08176223f, 0.11039842f + -0.13989258f, -0.024658203f, 0.12670898f, 0.027832031f, 0.06689453f, 0.12817383f, 0.07495117f, -0.01977539f, -0.05834961f, -0.07543945f, -0.06542969f, -0.0546875f, -0.04345703f, -0.0063476562f, 0.034179688f, 0.029541016f, + -0.06713867f, -0.11450195f, -0.09790039f, -0.091308594f, -0.12182617f, -0.010009766f, 0.10986328f, 0.115478516f, 0.060058594f, 0.038085938f, 0.020507812f, 0.017333984f, 0.024169922f, 0.028320312f, 0.038330078f, 0.05053711f, + 0.05517578f, 0.030517578f, 0.0390625f, 0.05810547f, 0.021484375f, 0.032470703f, 0.040039062f, -0.0087890625f, -0.055908203f, -0.023925781f, 0.037109375f, 0.06347656f, 0.02709961f, -0.07373047f, -0.1274414f, -0.115234375f, + 0.11206055f, 0.2006836f, 0.045410156f, -0.10839844f, -0.1418457f, -0.08520508f, -0.032470703f, 0.033935547f, 0.044189453f, 0.006591797f, -0.012451172f, -0.018554688f, -0.013427734f, -0.010498047f, -0.0078125f, -0.012207031f, + -0.041748047f, -0.07373047f, -0.14819336f, 0.021240234f, 0.16015625f, 0.119140625f, 0.055908203f, 0.08081055f, 0.12548828f, 0.05419922f, -0.030761719f, -0.040771484f, -0.060302734f, -0.07128906f, -0.07763672f, -0.072509766f, + -0.07446289f, -0.041259766f, -0.040527344f, -0.068603516f, -0.042236328f, -0.03857422f, -0.05126953f, -0.08886719f, -0.055419922f, 0.036865234f, 0.09033203f, 0.06689453f, 0.08911133f, 0.13110352f, 0.08129883f, 0.0053710938f, + -0.052978516f, 0.033691406f, 0.16015625f, 0.171875f, 0.024658203f, -0.1328125f, -0.1394043f, -0.041992188f, 0.0068359375f, 0.020263672f, 0.008544922f, 0.0014648438f, -0.011474609f, -0.030273438f, -0.022460938f, 0.00390625f, + 0.20898438f, -0.011230469f, -0.08496094f, -0.010986328f, 0.032958984f, -0.013183594f, -0.057861328f, -0.07104492f, -0.06689453f, -0.056396484f, -0.047851562f, -0.03491211f, -0.011962891f, 0.032714844f, 0.08178711f, 0.11035156f, }; const float *const ivas_sns_cdbks_side_tcx10[SNS_MSVQ_NSTAGES_SIDE] = { ivas_sns_cdbks_side_tcx10_stage1, ivas_sns_cdbks_side_tcx10_stage2 }; -#endif // SNS_MSVQ +const int16_t sns_1st_cdbk[2][2][8 * 32] = { + { /* split 1 */ + { /* TCX 20 */ + -10900, -11064, -10637, -10471, -9051, -6381, -4688, -2438, + -2119, -5087, -6702, -8118, -7586, -6343, -4828, -3406, + 2004, -3443, -4289, -3757, -3234, -2952, -2313, -1781, + 1749, 5598, 3916, 732, -1472, -2964, -3275, -2332, + -11978, -14369, -5600, -545, 981, -929, -57, 1903, + 1745, 391, 202, 115, 256, -291, -862, -1637, + -4052, 2059, 4709, 6768, 5595, 1975, -1723, -1218, + 2093, 7263, 8679, 7576, 3701, -2438, -4389, -2686, + -7120, -6279, -5715, -5520, -4752, -3125, -1856, -438, + 8131, -2543, -6285, -6723, -5588, -4321, -3264, -2164, + -653, -1301, -660, 608, 1598, 1805, 1698, 760, + 4882, 9309, 6333, 1734, 284, 364, 560, 1015, + -7686, -5737, -3443, -1642, 245, 1531, 1827, 1769, + -1468, 3782, 144, -5130, -6883, -5165, -1497, 2072, + -12937, -8429, -2619, 2894, 5004, 4710, 4627, 3740, + 3198, 3928, 4358, 4554, 3887, 2844, 1299, 129, + -13828, -12296, -9364, -7918, -5571, -1909, 307, 2047, + -4314, -1211, -559, -1061, -1928, -2228, -2359, -1902, + -309, -3224, -3404, -1895, -743, -59, 757, 908, + 10914, 5865, 1599, -386, -1392, -2285, -2236, -2042, + -11825, -16241, -11402, -3627, 6556, 8953, 6421, 1546, + 6102, 777, -301, 536, 902, 541, 210, -429, + -3052, 3997, 5389, 1842, -344, 1556, 2667, 2428, + 11788, 10894, 7448, 5423, 2372, -677, -2385, -3839, + -45, -7602, -8923, -7179, -3273, 65, 4500, 6726, + 5895, 626, -1610, -2598, -3240, -3540, -2930, -2156, + -971, 461, 1494, 4907, 5859, 5199, 3678, 2502, + 10766, 5297, 1844, 1236, 2498, 3503, 2846, 838, + -7816, -1212, 891, 2387, 1317, 2225, 1859, 1602, + 2376, 5357, 2088, -2719, -3419, -420, 2431, 2943, + -8383, -795, 4351, 7026, 7460, 7191, 5262, 3796, + 1522, 6283, 8714, 8222, 7434, 5768, 3586, 1499, + }, + { /* TCX 10 */ + -15596, -16321, -10264, -1002, 5955, 5543, -29, -1688, + 17, -3794, -6207, -7356, -6998, -6081, -4453, -2448, + -12543, -11530, -10186, -8817, -7083, -4440, -1946, 892, + 5198, 2751, -274, -2574, -4561, -6087, -5944, -4600, + -683, -2640, -2753, -1195, -239, -217, -286, 90, + -1400, -1146, -1853, -2845, -3456, -3788, -3171, -1969, + -1835, 392, 1725, 1209, -392, -1640, -2001, -1608, + 5770, 7707, 5210, 2112, -382, -2088, -2634, -3007, + -10766, -8101, -5137, -3754, -1881, 331, 2339, 3679, + -2637, -4640, -5811, -5651, -3790, -1359, 913, 1893, + -7793, -4768, -1762, -545, -717, -837, -441, -75, + 4030, 1770, 467, 379, 10, -1330, -2398, -2290, + -9395, -6952, -2494, 2022, 4753, 5614, 4443, 2642, + -1486, 1748, 859, -2586, -3368, -638, 2761, 3269, + -2408, 306, 3633, 6567, 5950, 2474, -621, -1421, + 5478, 7986, 9498, 8165, 5477, 1244, -523, -1586, + -13564, -14673, -10597, -5504, 1575, 8248, 7662, 4025, + 4978, -682, -3586, -4305, -3703, -3001, -2227, -1278, + -8002, -6831, -5558, -4868, -4243, -3393, -2486, -1110, + 11485, 5472, 1645, -533, -1792, -2814, -3169, -2706, + 1617, 421, 232, 1382, 2162, 2017, 1318, 744, + 3677, 5212, 1990, -1514, -2894, -2441, -451, 592, + 731, 4295, 5860, 3756, 1991, 1437, 869, 127, + 12736, 11722, 7768, 4682, 1574, -744, -1989, -3131, + -3490, -4269, -3681, -1531, 1111, 3327, 4138, 3815, + 7344, 1400, -1302, -1502, -1015, 57, 1212, 1498, + -4836, -1881, 1071, 2055, 2114, 2465, 2093, 1458, + 8569, 5879, 3654, 2879, 2530, 1703, 781, -233, + -3709, -990, 2338, 6227, 7083, 7102, 5657, 3401, + 3389, 6392, 5267, 1011, 275, 3519, 5236, 4339, + 599, 3752, 6943, 9211, 8152, 5568, 3337, 1838, + 9885, 9591, 7905, 8068, 7929, 7421, 4234, 757, + } + }, + { /* split 2 */ + { /* TCX 20 */ + -178, -3476, -5982, -7081, -7548, -7440, -6859, -5798, + -3596, -3670, -1501, 770, 812, -286, -2001, -3377, + -3998, -5191, -4988, -4421, -3889, -3571, -2738, -1969, + -2981, -2687, -1501, -83, 1136, 2377, 3248, 4105, + 1842, -41, -1972, -4282, -6779, -8405, -8674, -7835, + -259, 571, 2124, 3344, 2959, 1407, -750, -2523, + -524, -1956, -2855, -3202, -3939, -4666, -4907, -4782, + -5110, -4768, -3017, -663, 4188, 9210, 16602, 21081, + 4373, 4846, -603, -6495, -7289, -5540, -4749, -5527, + -1448, -1043, -619, -105, 356, 362, 542, 857, + 1373, -752, -5334, -6244, -3001, -932, -1040, -3125, + -2403, -1397, 612, 2449, 3920, 5231, 6819, 8581, + 2183, 1211, -111, -1084, -2836, -4977, -6701, -7284, + -751, 1255, 3408, 6474, 7503, 7026, 5413, 4464, + 935, 850, 589, 353, 160, -434, -939, -931, + 268, 2284, 3884, 5423, 6680, 7996, 9244, 9472, + 1075, 113, -1289, -4457, -7512, -5930, -1799, -571, + -3689, -4254, -3755, -2995, -1581, -135, 1049, 1589, + -1166, -1752, -1790, -1897, -1927, -1831, -1359, -805, + -1494, -735, 635, 1993, 2909, 3546, 4226, 4956, + 4435, 4299, 4269, 1328, -3731, -7621, -9319, -9170, + 1358, 2227, 3873, 4469, 4692, 4057, 2601, 1608, + 813, 398, -499, -666, -1286, -2271, -3316, -4025, + -3300, -1255, 2181, 6431, 10002, 12760, 13549, 12584, + 3714, 4180, 484, -2905, -2864, -1359, -1256, -2477, + 308, 868, 1373, 1629, 1793, 1834, 1814, 1746, + 1472, 798, -282, -1935, -1818, 320, 2221, 2914, + 2281, 3240, 2988, 1400, 2383, 4072, 5667, 6675, + 2672, 2678, 2874, 2096, -226, -2301, -3861, -4534, + 4988, 7231, 7641, 7731, 7061, 6447, 5411, 3513, + 3978, 4156, 4126, 2896, 1469, 759, 368, -68, + -264, 4210, 8534, 11008, 11606, 11888, 11072, 8949, + }, + { /* TCX 10 */ + -2852, -6158, -7231, -7830, -8012, -7922, -7556, -6706, + -3911, -5340, -5053, -4741, -4805, -4484, -3727, -3037, + -966, -1461, -1694, -2427, -3081, -3037, -2547, -2230, + -3455, -3315, -2451, -836, 1383, 3196, 3720, 3379, + 3052, 281, -3351, -6866, -9051, -9586, -8983, -8236, + -748, -4465, -4314, -2251, 29, -40, -3963, -6195, + 200, 1293, 2535, 2803, 1603, -186, -1397, -1697, + -1707, -265, 2196, 5295, 5894, 4216, 3440, 3826, + -237, -2133, -2279, -3149, -4377, -5638, -6520, -6764, + -2407, -2049, -1246, -664, -521, -430, -349, -211, + 3874, 1335, -1501, -2055, -1268, -990, -1852, -2871, + -1883, -1845, -1681, -484, 384, 2035, 5839, 9597, + 275, 380, 1048, 424, -1146, -3012, -4431, -5104, + -1699, -484, 756, 1261, 1279, 1377, 1975, 2590, + 2139, 4502, 3645, 4975, 6491, 5972, 5012, 4346, + -3821, -2581, -433, 2667, 6436, 10038, 11311, 8783, + 2359, -2689, -6604, -7039, -5992, -4268, -3711, -4840, + -2776, -4251, -4539, -3672, -2494, -1055, 280, 695, + 491, 866, 822, -44, -1009, -1165, -831, -538, + -1024, 91, 786, 1295, 2433, 3910, 4975, 5403, + 3117, 2590, 2337, -667, -4580, -8147, -9400, -9523, + -103, -630, -831, 669, 3062, 3398, 549, -1690, + 2113, 3467, 4279, 5047, 5344, 3361, 127, -2313, + -1199, 1153, 2914, 3688, 4260, 5421, 7471, 8831, + 2815, 2184, 316, -3058, -5596, -5564, -4343, -3793, + 922, 126, -1414, -1731, -1007, 359, 2029, 3088, + 4889, 4619, 2537, 1114, 950, 946, 799, 419, + -4271, -3750, -3359, -484, 1448, 4106, 10487, 20479, + 3818, 4687, 4064, 2212, -172, -2287, -3535, -4041, + 884, 2456, 3394, 2925, 2182, 2323, 2583, 2507, + 4767, 8057, 8263, 6461, 5003, 4055, 2923, 1845, + 19, 3813, 6926, 8432, 10141, 10850, 9692, 8383, + } + } +}; +const int16_t sns_1st_means_16k[2][16] = { + { /* TCX 20 */ + 14210, 19017, 14362, 9309, 5385, 2674, 1055, -211, -1407, -3059, -4393, -8597, -11180, -11756, -12131, -13281, + }, + { /* TCX 10*/ + 12018, 15915, 11089, 6015, 847, -705, -539, -1548, -893, -2163, -1806, -4189, -7017, -8670, -8874, -9480, + } +}; +const int16_t sns_1st_means_25k6[2][16] = { + { /* TCX 20 */ + 14973, 20323, 16461, 9554, 4017, 3103, 1602, 1694, -221, -1401, -6817, -10071, -11503, -11805, -13158, -16749, + }, + { /* TCX 10 */ + 15560, 19489, 14623, 5595, 2084, 1699, 775, -1312, -2195, -6101, -9078, -9465, -7825, -6603, -7281, -9960, + } +}; +const int16_t sns_1st_means_32k[2][16] = { + { /* TCX 20 */ + 15041, 20603, 16969, 10289, 4973, 4283, 3003, 3316, 1684, -259, -6614, -9535, -10363, -11834, -16625, -24930, + }, + { /* TCX 10 */ + 16510, 20660, 16025, 7224, 3921, 3868, 2623, 742, -1316, -6269, -8284, -7288, -6380, -8410, -13351, -20277, + } +}; + +ACPL_QUANT_TABLE alpha_quant_table[] = +{ + { /* Alfa Fine */ + 33, /* nquant */ + 16, /* offset */ + { -2.000000e+000f, -1.809375e+000f, -1.637500e+000f, -1.484375e+000f, -1.350000e+000f, -1.234375e+000f, -1.137500e+000f, -1.059375e+000f, -1.000000e+000f, -9.406250e-001f, + -8.625000e-001f, -7.656250e-001f, -6.500000e-001f, -5.156250e-001f, -3.625000e-001f, -1.906250e-001f, +0.000000e+000f, +1.906250e-001f, +3.625000e-001f, +5.156250e-001f, + +6.500000e-001f, +7.656250e-001f, +8.625000e-001f, +9.406250e-001f, +1.000000e+000f, +1.059375e+000f, +1.137500e+000f, +1.234375e+000f, +1.350000e+000f, +1.484375e+000f, + +1.637500e+000f, +1.809375e+000f, +2.000000e+000f } /* data */ + }, /* End Alfa Fine */ + { /* Alfa Coarse */ + 17, /* nquant */ + 8, /* offset */ + { -2.000000e+000f, -1.637500e+000f, -1.350000e+000f, -1.137500e+000f, -1.000000e+000f, -8.625000e-001f, -6.500000e-001f, -3.625000e-001f, +0.000000e+000f, +3.625000e-001f, + +6.500000e-001f, +8.625000e-001f, +1.000000e+000f, +1.137500e+000f, +1.350000e+000f, +1.637500e+000f, +2.000000e+000f } /* data */ + } /* End Alfa Coarse */ +}; + +ACPL_QUANT_TABLE beta_quant_table[2][9] = +{ + { + { /* Beta Fine #1 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +2.375000e-001f, +5.500000e-001f, +9.375000e-001f, +1.400000e+000f, +1.937500e+000f, +2.550000e+000f, +3.237500e+000f, +4.000000e+000f } /* data */ + }, /* End Beta Fine #1 */ + { /* Beta Fine #2 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +2.035449e-001f, +4.713672e-001f, +8.034668e-001f, +1.199844e+000f, +1.660498e+000f, +2.185430e+000f, +2.774639e+000f, +3.428125e+000f } /* data */ + }, /* End Beta Fine #2 */ + { /* Beta Fine #3 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.729297e-001f, +4.004688e-001f, +6.826172e-001f, +1.019375e+000f, +1.410742e+000f, +1.856719e+000f, +2.357305e+000f, +2.912500e+000f } /* data */ + }, /* End Beta Fine #3 */ + { /* Beta Fine #4 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.456543e-001f, +3.373047e-001f, +5.749512e-001f, +8.585938e-001f, +1.188232e+000f, +1.563867e+000f, +1.985498e+000f, +2.453125e+000f } /* data */ + }, /* End Beta Fine #4 */ + { /* Beta Fine #5 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.217188e-001f, +2.818750e-001f, +4.804688e-001f, +7.175000e-001f, +9.929688e-001f, +1.306875e+000f, +1.659219e+000f, +2.050000e+000f } /* data */ + }, /* End Beta Fine #5 */ + { /* Beta Fine #6 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.011230e-001f, +2.341797e-001f, +3.991699e-001f, +5.960938e-001f, +8.249512e-001f, +1.085742e+000f, +1.378467e+000f, +1.703125e+000f } /* data */ + }, /* End Beta Fine #6 */ + { /* Beta Fine #7 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +8.386719e-002f, +1.942188e-001f, +3.310547e-001f, +4.943750e-001f, +6.841797e-001f, +9.004688e-001f, +1.143242e+000f, +1.412500e+000f } /* data */ + }, /* End Beta Fine #7 */ + { /* Beta Fine #8 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +6.995117e-002f, +1.619922e-001f, +2.761230e-001f, +4.123438e-001f, +5.706543e-001f, +7.510547e-001f, +9.535449e-001f, +1.178125e+000f } /* data */ + }, /* End Beta Fine #8 */ + { /* Beta Fine #9 */ + 9, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +5.937500e-002f, +1.375000e-001f, +2.343750e-001f, +3.500000e-001f, +4.843750e-001f, +6.375000e-001f, +8.093750e-001f, +1.000000e+000f } /* data */ + } /* End Beta Fine #9 */ + }, + { + { /* Beta Coarse #1 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +5.500000e-001f, +1.400000e+000f, +2.550000e+000f, +4.000000e+000f } /* data */ + }, /* End Beta Coarse #1 */ + { /* Beta Coarse #2 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +4.004688e-001f, +1.019375e+000f, +1.856719e+000f, +2.912500e+000f } /* data */ + }, /* End Beta Coarse #2 */ + { /* Beta Coarse #3 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +2.818750e-001f, +7.175000e-001f, +1.306875e+000f, +2.050000e+000f } /* data */ + }, /* End Beta Coarse #3 */ + { /* Beta Coarse #4 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.942188e-001f, +4.943750e-001f, +9.004688e-001f, +1.412500e+000f } /* data */ + }, /* End Beta Coarse #4 */ + { /* Beta Coarse #5 */ + 5, /* nquant */ + 0, /* offset */ + { +0.000000e+000f, +1.375000e-001f, +3.500000e-001f, +6.375000e-001f, +1.000000e+000f } /* data */ + } /* End Beta Coarse #5 */ + } +}; /* clang-format on */ diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 9e3c431e70..a6437565c9 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -108,9 +108,7 @@ extern const float tdm_ratio_tabl[]; extern const float tdm_den_ratio_tabl[]; extern const int16_t tdm_bit_allc_tbl[5][6]; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL /* LSFs Intra-frame prediction tables */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE extern const float tdm_LSF_MEAN_RE_USE_OUT[M]; extern const float tdm_LSF_MEAN_RE_USE_IN[M]; extern const float tdm_LSF_MEAN_RE_USE[M]; @@ -121,13 +119,11 @@ extern const float tdm_Beta_Q1bit_re_use_24k4_32k[2]; extern const float tdm_Beta_Q1bit_re_use_48k[2]; extern const float tdm_RE_USE_adaptive_beta_prd_diag_3[15 + 16 + 15]; -#endif extern const float tdm_LSF_MEAN_PRED_QNT_OUT[M]; extern const float tdm_LSF_MEAN_PRED_QNT_IN[M]; extern const float tdm_LSF_MEAN_PRED_QNT[M]; extern const float tdm_PRED_QNT_fixed_beta_prd_diag_3[15 + 16 + 15]; -#endif extern const int16_t fast_FCB_bits_2sfr[]; extern const int16_t fast_FCB_rates_2sfr[]; @@ -165,6 +161,13 @@ extern const int16_t DirAC_band_grouping_5[5 + 1]; extern const int16_t DirAC_block_grouping[MAX_PARAM_SPATIAL_SUBFRAMES + 1]; extern const int16_t DirAC_block_grouping_5ms_MDFT[MAX_PARAM_SPATIAL_SUBFRAMES + 1]; +extern const float c_weights[DIRAC_NO_FB_BANDS_MAX]; + +extern const float w_nm[NUM_ANA_SECTORS][9]; +extern const float x_nm[NUM_ANA_SECTORS][9]; +extern const float y_nm[NUM_ANA_SECTORS][9]; +extern const float z_nm[NUM_ANA_SECTORS][9]; + /*------------------------------------------------------------------------------------------* * SPAR ROM tables *------------------------------------------------------------------------------------------*/ @@ -176,9 +179,11 @@ extern const ivas_huff_models_t ivas_huff_pred_r_consts[TOTAL_PRED_QUANT_STRATS_ extern const ivas_huff_models_t ivas_huff_drct_r_consts[TOTAL_DRCT_QUANT_STRATS]; extern const ivas_huff_models_t ivas_huff_decd_r_consts[TOTAL_DECD_QUANT_STRATS]; extern const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN]; -extern const int16_t remix_order_set[1][IVAS_SPAR_MAX_CH]; +extern const int16_t remix_order_set[1][DIRAC_MAX_ANA_CHANS]; extern const int16_t keep_planar[IVAS_SPAR_MAX_CH - FOA_CHANNELS]; -extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_CH]; +extern const int16_t HOA_keep_ind[IVAS_SPAR_MAX_FB_IN_CHAN]; +extern const int16_t HOA_keep_ind_spar[IVAS_SPAR_MAX_CH]; +extern const int16_t HOA_keep_ind_spar512[IVAS_SPAR_MAX_CH]; extern const float dtx_pd_real_min_max[2]; extern const int16_t dtx_pd_real_q_levels[3][3]; @@ -293,6 +298,11 @@ extern const uint8_t masa_joined_nbands[]; extern const uint8_t masa_twodir_bands[]; extern const uint8_t masa_twodir_bands_joined[]; +#ifdef HR_METADATA +extern const float diffuseness_reconstructions_hr[HR_MASA_ER_LEVELS]; +extern const float diffuseness_thresholds_hr[HR_MASA_ER_LEVELS + 1]; +#endif + /* Multi-channel input and output setups */ extern const float ls_azimuth_CICP2[2]; extern const float ls_elevation_CICP2[2]; @@ -318,7 +328,6 @@ extern const float McMASA_LFEGain_vectors[64]; extern const float ism_azimuth_borders[4]; extern const float ism_elevation_borders[4]; - /*----------------------------------------------------------------------------------* * Param ISM ROM tables *----------------------------------------------------------------------------------*/ @@ -364,9 +373,7 @@ extern const float ivas_cos_twiddle_80[IVAS_80_PT_LEN >> 1]; extern const float ivas_mdft_coeff_cos_twid_240[IVAS_240_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_160[IVAS_160_PT_LEN + 1]; -#ifdef PARAMMC_SHORT_ENC_MDFT extern const float ivas_mdft_coeff_cos_twid_120[IVAS_120_PT_LEN + 1]; -#endif extern const float ivas_mdft_coeff_cos_twid_80[IVAS_80_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_40[IVAS_40_PT_LEN + 1]; extern const float ivas_mdft_coeff_cos_twid_960[IVAS_960_PT_LEN + 1]; @@ -403,7 +410,6 @@ extern const float ivas_fb_resp_cheby_ramp_16del[IVAS_FB_1MS_16K_SAMP + 1]; extern const int16_t ivas_num_active_bands[FB - WB + 1]; -#ifdef SNS_MSVQ /*------------------------------------------------------------------------------------------* * SNS MSVQ codebooks and means *------------------------------------------------------------------------------------------*/ @@ -416,19 +422,21 @@ extern const int16_t ivas_sns_cdbks_tcx10_bits[]; extern const float *const ivas_sns_cdbks_tcx20[]; extern const float *const ivas_sns_cdbks_tcx10[]; -extern const float ivas_sns_means_tcx20[]; -extern const float ivas_sns_means_tcx10[]; - extern const int16_t ivas_sns_cdbks_side_tcx20_levels[]; extern const int16_t ivas_sns_cdbks_side_tcx20_bits[]; extern const int16_t ivas_sns_cdbks_side_tcx10_levels[]; extern const int16_t ivas_sns_cdbks_side_tcx10_bits[]; extern const float *const ivas_sns_cdbks_side_tcx20[]; -extern const float ivas_sns_means_side_tcx20[]; extern const float *const ivas_sns_cdbks_side_tcx10[]; -extern const float ivas_sns_means_side_tcx10[]; -#endif +extern ACPL_QUANT_TABLE alpha_quant_table[]; +extern ACPL_QUANT_TABLE beta_quant_table[2][9]; + +/* means and codebooks for the split VQ in the 2-stage SNS VQ */ +extern const int16_t sns_1st_cdbk[2][2][8 * 32]; +extern const int16_t sns_1st_means_16k[2][16]; +extern const int16_t sns_1st_means_25k6[2][16]; +extern const int16_t sns_1st_means_32k[2][16]; /* IVAS_ROM_COM_H */ #endif diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 44131d5bd2..450ebef791 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -47,6 +47,7 @@ #include "wmc_auto.h" +#ifndef SBA_MODE_CLEAN_UP /*-------------------------------------------------------------------* * ivas_sba_mode_select() * @@ -54,23 +55,11 @@ *-------------------------------------------------------------------*/ /*! r: SBA format mode */ -SBA_MODE ivas_sba_mode_select( - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -) +SBA_MODE ivas_sba_mode_select() { - SBA_MODE sba_mode; - - if ( ivas_total_brate == IVAS_13k2 || ivas_total_brate == IVAS_16k4 ) - { - sba_mode = SBA_MODE_DIRAC; - } - else - { - sba_mode = SBA_MODE_SPAR; - } - - return sba_mode; + return SBA_MODE_SPAR; } +#endif /*-------------------------------------------------------------------* * ivas_sba_config() * @@ -235,7 +224,8 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order /* i : Ambisonic (SBA) order */ -) + , + const int32_t ivas_total_brate ) { int16_t nb_channels; @@ -245,8 +235,17 @@ int16_t ivas_sba_get_nchan_metadata( } else { - /* FOA + planar HOA */ - nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 ); + if ( ivas_total_brate >= IVAS_512k ) + { + nb_channels = ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ); + nb_channels += 2; + nb_channels = min( nb_channels, ( sba_order + 1 ) * ( sba_order + 1 ) ); + } + else + { + /* FOA + planar HOA */ + nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 ); + } } return ( nb_channels ); @@ -259,25 +258,58 @@ int16_t ivas_sba_get_nchan_metadata( *-------------------------------------------------------------------*/ /*! r: flag indicating to code SPAR HOA MD for all bands */ -int16_t ivas_sba_get_spar_hoa_md_flag( - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ -) +void ivas_sba_get_spar_hoa_ch_ind( + const int16_t num_md_chs, /* i : number of MD channels */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) { - int16_t spar_hoa_md_flag = 0; + int16_t ch; + const int16_t *hoa_ind; + + if ( ivas_total_brate >= IVAS_512k ) + { + hoa_ind = HOA_keep_ind_spar512; + } + else + { + hoa_ind = HOA_keep_ind_spar; + } + for ( ch = 0; ch < num_md_chs; ch++ ) + { + HOA_md_ind[ch] = hoa_ind[ch]; + } + + return; +} +void ivas_sba_get_spar_hoa_md_flag( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + int16_t *spar_hoa_md_flag, + int16_t *spar_hoa_dirac2spar_md_flag ) +{ if ( sba_order > 1 && ivas_total_brate >= IVAS_256k ) { - spar_hoa_md_flag = 1; + *spar_hoa_md_flag = 1; } else { - spar_hoa_md_flag = 0; + *spar_hoa_md_flag = 0; } - return spar_hoa_md_flag; + if ( sba_order > 1 && ivas_total_brate >= IVAS_512k ) + { + *spar_hoa_dirac2spar_md_flag = 0; + } + else + { + *spar_hoa_dirac2spar_md_flag = 1; + } + + return; } + /*-------------------------------------------------------------------* * ivas_sba_zero_vert_comp() * diff --git a/lib_com/ivas_sns_com.c b/lib_com/ivas_sns_com.c index e4515a9854..da7b37e8c5 100644 --- a/lib_com/ivas_sns_com.c +++ b/lib_com/ivas_sns_com.c @@ -36,6 +36,7 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" +#include "ivas_rom_com.h" #include #include #ifdef DEBUGGING @@ -118,30 +119,20 @@ void sns_compute_scf( xs[FDNS_NPTS - 1] = 0.75f * x[FDNS_NPTS - 1] + 0.25f * x[FDNS_NPTS - 2]; /* Pre-emphasis */ - if ( L_frame == L_FRAME16k ) + switch ( L_frame ) { - tilt = 18.f; - } - else if ( L_frame == L_SPEC16k_EXT ) - { - tilt = 20.f; - } - else if ( L_frame == L_FRAME25_6k ) - { - tilt = 22.f; - } - else if ( L_frame == L_FRAME32k ) - { - tilt = 26.f; - } - else if ( L_frame == L_SPEC32k_EXT ) - { - tilt = 30.f; - } - else - { - tilt = 0.f; - assert( 0 && "illegal frame length in sns_compute_scf" ); + case L_FRAME16k: + tilt = 19.f; + break; + case L_FRAME25_6k: + tilt = 22.f; + break; + case L_FRAME32k: + tilt = 23.5f; + break; + default: + tilt = 0.f; + assert( !"illegal frame length in sns_compute_scf" ); } for ( i = 0; i < FDNS_NPTS; i++ ) diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index cb6ff23fc0..8e7da38580 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -61,6 +61,7 @@ #define IVAS_ACTIVEW_DM_F ( 1.0f ) #define IVAS_ACTIVEW_DM_F_DTX ( 0.25f ) +#define IVAS_ACTIVEW_DM_F_VLBR ( 0.25f ) #define IVAS_LIN_ACTIVEW_QUAD_ACTIVEW_THRESH ( 3.0f ) #define IVAS_P_NORM_SCALING ( 1.0f ) @@ -76,11 +77,11 @@ *------------------------------------------------------------------------------------------*/ -static void ivas_get_pred_coeffs( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t start_band, const int16_t end_band, const int16_t active_w, const int16_t dtx_vad, const int16_t from_dirac ); +static void ivas_get_pred_coeffs( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ppPred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ppDM_Fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t start_band, const int16_t end_band, const int16_t active_w, const int16_t active_w_vlbr, const int16_t dtx_vad, const int16_t from_dirac ); static void ivas_reorder_array( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS], const int16_t in_chans, const int16_t order[IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t start_band, const int16_t end_band ); -static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, float *pWscale ); +static void ivas_get_Wscaling_factor( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS], float ***mixer_mat, const int16_t start_band, const int16_t end_band, const int16_t dtx_vad, const int16_t num_ch, const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, const int16_t active_w_vlbr, float *pWscale ); static void ivas_calc_post_pred_per_band( float *pppCov_mat_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], float ***mixer_mat, const int16_t num_ch, const int16_t num_dmx, const int16_t band_idx, float postpred_cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ); @@ -338,8 +339,7 @@ void ivas_spar_config( { ivas_total_brate = IVAS_32k; } - - assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 ); + assert( ivas_total_brate == IVAS_32k || ivas_total_brate == IVAS_24k4 || ivas_total_brate == IVAS_16k4 || ivas_total_brate == IVAS_13k2 ); if ( ivas_total_brate == IVAS_32k ) { *core_nominal_brate = ACELP_24k40; @@ -348,6 +348,14 @@ void ivas_spar_config( { *core_nominal_brate = ACELP_16k40; } + else if ( ivas_total_brate == IVAS_16k4 ) + { + *core_nominal_brate = ACELP_13k20; + } + else if ( ivas_total_brate == IVAS_13k2 ) + { + *core_nominal_brate = ACELP_9k60; + } } return; @@ -360,7 +368,7 @@ void ivas_spar_config( * Get SPAR table index *-----------------------------------------------------------------------------------------*/ -/* !r: config. table index */ +/*! r: config. table index */ int16_t ivas_get_spar_table_idx( const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ @@ -427,10 +435,12 @@ int16_t ivas_get_sba_num_TCs( { nchan_transport = 1; } - else if ( ivas_sba_mode_select( ivas_total_brate ) == SBA_MODE_DIRAC ) +#ifndef SBA_MODE_CLEAN_UP + else if ( ivas_sba_mode_select() == SBA_MODE_DIRAC ) { nchan_transport = 1; } +#endif else { table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); @@ -456,6 +466,7 @@ static void ivas_get_pred_coeffs( const int16_t start_band, const int16_t end_band, const int16_t active_w, + const int16_t active_w_vlbr, const int16_t dtx_vad, const int16_t from_dirac ) { @@ -546,7 +557,7 @@ static void ivas_get_pred_coeffs( } else { - dm_f_local = IVAS_ACTIVEW_DM_F; + dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_VLBR : IVAS_ACTIVEW_DM_F; } for ( b = start_band; b < end_band; b++ ) @@ -645,6 +656,7 @@ static void ivas_get_Wscaling_factor( const int16_t *pNum_dmx, const int16_t bands_bw, const int16_t active_w, + const int16_t active_w_vlbr, float *pWscale ) { int16_t b, ch; @@ -657,7 +669,7 @@ static void ivas_get_Wscaling_factor( } else { - dm_f_local = IVAS_ACTIVEW_DM_F_SCALE; + dm_f_local = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; } for ( b = start_band; b < end_band; b++ ) @@ -1538,6 +1550,7 @@ void ivas_compute_spar_params( const int16_t num_ch, const int16_t bands_bw, const int16_t active_w, + const int16_t active_w_vlbr, ivas_spar_md_com_cfg *hSparCfg, ivas_spar_md_t *hSparMd, float *pWscale, @@ -1546,7 +1559,9 @@ void ivas_compute_spar_params( float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; int16_t b, i, ndm; - ivas_get_pred_coeffs( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w, dtx_vad, from_dirac ); + ivas_get_pred_coeffs( cov_real, pred_coeffs_re, dm_fv_re, num_ch, start_band, end_band, active_w, + active_w_vlbr, + dtx_vad, from_dirac ); #ifdef SPAR_HOA_DBG /*fprintf(stderr, "\n\n Prediction Coefficients:\n"); @@ -1578,7 +1593,9 @@ void ivas_compute_spar_params( #endif ivas_get_Wscaling_factor( cov_real, pred_coeffs_re, mixer_mat, start_band, end_band, dtx_vad, num_ch, - hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, pWscale ); + hSparCfg->num_dmx_chans_per_band, bands_bw, active_w, + active_w_vlbr, + pWscale ); for ( b = start_band; b < end_band; b++ ) { @@ -1648,7 +1665,9 @@ void ivas_get_spar_md_from_dirac( const int16_t end_band, const int16_t order, const int16_t dtx_vad, - float Wscale_d[IVAS_MAX_NUM_BANDS] ) + float Wscale_d[IVAS_MAX_NUM_BANDS], + const uint8_t useLowerRes, + const int16_t active_w_vlbr ) { int16_t num_ch, band, i, j; int16_t block, ch; @@ -1662,14 +1681,21 @@ void ivas_get_spar_md_from_dirac( float **ppMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH]; float *pMixer_mat[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH]; float en_ratio_fac, diff_norm_order1, diff_norm_order2, diff_norm_order3; + int16_t ndm, foa_ch, hoa2_ch; float P_dir_fact[IVAS_SPAR_MAX_CH - 1]; const int16_t *remix_order; remix_order = remix_order_set[hSpar_md_cfg->remix_unmix_order]; - num_ch = ivas_sba_get_nchan_metadata( order ); - hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER ); + num_ch = ivas_sba_get_nchan_metadata( order, + IVAS_256k /*dummy value as order is always 1 in this function*/ + ); + + hoa2_ch = ivas_sba_get_nchan_metadata( SBA_HOA2_ORDER, + IVAS_256k /*dummy value as order is always 1 in this function*/ + ); + foa_ch = FOA_CHANNELS; diff_norm_order1 = 3.0f; diff_norm_order2 = 5.0f; @@ -1684,7 +1710,7 @@ void ivas_get_spar_md_from_dirac( ppMixer_mat[i] = pMixer_mat[i]; } - if ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) + if ( ( start_band >= 6 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) || ( useLowerRes && start_band >= 3 && hSpar_md_cfg->nchan_transport <= 2 && ( dtx_vad == 1 ) ) ) { float P_norm[3]; int16_t idx; @@ -1739,10 +1765,15 @@ void ivas_get_spar_md_from_dirac( /*SPAR from DirAC*/ set_f( response_avg, 0.0f, MAX_OUTPUT_CHANNELS ); + if ( n_ts > 1 ) { ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][i_ts], (int16_t) ele_dirac[band][i_ts], response_avg, order ); } + else if ( useLowerRes ) + { + ivas_dirac_dec_get_response( (int16_t) azi_dirac[band][0], (int16_t) ele_dirac[band][0], response_avg, order ); + } else { for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) @@ -1809,64 +1840,69 @@ void ivas_get_spar_md_from_dirac( { response_avg[i] = response_avg[HOA_keep_ind[i]]; } + en_ratio_fac = ( 1.0f - diffuseness[band] ); - for ( i = 0; i < num_ch; i++ ) { - for ( j = 0; j < num_ch; j++ ) + for ( i = 0; i < num_ch; i++ ) { - if ( i == j ) + for ( j = 0; j < num_ch; j++ ) { - if ( i == 0 ) + if ( i == j ) { - cov_real_dirac[i][i][band] = 1.0f; - } - else - { - cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; - if ( hSpar_md_cfg->nchan_transport <= 2 ) + if ( i == 0 ) { - cov_real_dirac[i][j][band] *= en_ratio_fac; - if ( ( i >= ndm ) && ( dtx_vad == 1 ) ) + cov_real_dirac[i][i][band] = 1.0f; + } + else + { + cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; + + if ( hSpar_md_cfg->nchan_transport <= 2 ) { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm]; + + cov_real_dirac[i][j][band] *= en_ratio_fac; + if ( ( i >= ndm ) && ( dtx_vad == 1 ) ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) * P_dir_fact[i - ndm]; + } + else + { + if ( i < foa_ch ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1; + } + else if ( i < hoa2_ch ) + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2; + } + else + { + cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3; + } + } } else { if ( i < foa_ch ) { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order1; + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1; } else if ( i < hoa2_ch ) { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order2; + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2; } else { - cov_real_dirac[i][j][band] += ( 1.0f - ( en_ratio_fac * en_ratio_fac ) ) / diff_norm_order3; + cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3; } } } - else - { - if ( i < foa_ch ) - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order1; - } - else if ( i < hoa2_ch ) - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order2; - } - else - { - cov_real_dirac[i][j][band] += ( 1.0f - en_ratio_fac ) / diff_norm_order3; - } - } } - } - else - { - cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; + else + { + cov_real_dirac[i][j][band] = en_ratio_fac * response_avg[i] * response_avg[j]; + } } } } @@ -1880,7 +1916,7 @@ void ivas_get_spar_md_from_dirac( } } -#ifdef DEBUG_SPAR_WRITE_OUT_COV +#ifdef DEBUG_SBA_MD_DUMP { static FILE *fid = 0; int16_t k = 0; @@ -1905,7 +1941,9 @@ void ivas_get_spar_md_from_dirac( #endif ivas_compute_spar_params( pCov_real, dm_fv_re, i_ts, ppMixer_mat, start_band, end_band, dtx_vad, - num_ch, 1, hSpar_md_cfg->active_w, hSpar_md_cfg, hSpar_md, Wscale, 1 ); + num_ch, 1, hSpar_md_cfg->active_w, + active_w_vlbr, + hSpar_md_cfg, hSpar_md, Wscale, 1 ); if ( mixer_mat != NULL ) { @@ -2094,12 +2132,27 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ +#ifdef ARITH_HUFF_CODER_CHANGES + , + const int16_t dirac2spar_md_flag, + const int16_t enc_flag, + const int16_t pca_flag, + const int16_t agc_flag +#endif ) { int32_t ivas_total_brate; int16_t i, total_bits, max_bits, code, length; int16_t sba_order; int16_t md_coding_bits_header; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t agc_bits, pca_bits, num_PR_bits_dirac_bands; + int16_t bits_PR, bits_C, bits_P; + int16_t wc_coarse_strat; + int16_t n_input, n_dmx, n_dec; + int16_t quant_strat; + int16_t bands_bw; +#endif pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) @@ -2131,13 +2184,23 @@ void ivas_spar_set_bitrate_config( max_bits += (int16_t) ( ivas_spar_br_table_consts[table_idx].core_brs[i][1] / FRAMES_PER_SEC ); } - pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_SBA - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - total_bits; - pSpar_md_cfg->max_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_SBA - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - max_bits; + pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - total_bits; + pSpar_md_cfg->max_bits_per_blk = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ) - IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - SBA_PLANAR_BITS - SBA_ORDER_BITS - length - max_bits; md_coding_bits_header = SPAR_NUM_CODING_STRAT_BITS + pSpar_md_cfg->quant_strat_bits; pSpar_md_cfg->tgt_bits_per_blk -= md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk -= md_coding_bits_header; +#ifdef ARITH_HUFF_CODER_CHANGES + if ( ivas_total_brate < IVAS_24k4 ) + { + bands_bw = 2; + } + else + { + bands_bw = 1; + } +#endif pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); @@ -2145,6 +2208,74 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->tgt_bits_per_blk += md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header; +#ifdef ARITH_HUFF_CODER_CHANGES + if ( enc_flag ) + { + /*calculate the actual worst case bits*/ + if ( ivas_total_brate >= BRATE_SPAR_Q_STRAT ) + { + quant_strat = QUANT_STRAT_0; + } + else + { + quant_strat = QUANT_STRAT_2; + } + + num_PR_bits_dirac_bands = ( dirac2spar_md_flag == 1 ) ? num_bands - SPAR_DIRAC_SPLIT_START_BAND : 0; + num_PR_bits_dirac_bands /= bands_bw; + num_PR_bits_dirac_bands = max( 0, num_PR_bits_dirac_bands ); + num_PR_bits_dirac_bands *= DIRAC_TO_SPAR_HBR_PRED_CHS; + + n_input = ivas_sba_get_nchan_metadata( sba_order, ivas_total_brate ); + n_dmx = ivas_spar_br_table_consts[table_idx].nchan_transport; + n_dec = n_input - n_dmx; + bits_PR = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][0] ) ); + num_PR_bits_dirac_bands *= bits_PR; + bits_PR = bits_PR * ( n_input - 1 ); + bits_C = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][1] ) ) * ( ( n_dmx - 1 ) * n_dec ); + bits_P = (int16_t) ceilf( log2f( ivas_spar_br_table_consts[table_idx].q_lvls[quant_strat][2] ) ) * ( n_dec ); + wc_coarse_strat = bits_PR + bits_C + bits_P; + wc_coarse_strat *= num_bands; + wc_coarse_strat /= bands_bw; + wc_coarse_strat -= num_PR_bits_dirac_bands; + wc_coarse_strat += md_coding_bits_header; + + if ( pSpar_md_cfg->max_bits_per_blk < wc_coarse_strat ) + { + assert( 0 ); + } + + if ( agc_flag ) + { + if ( pSpar_md_cfg->nchan_transport == 1 ) + { + agc_bits = AGC_BITS_PER_CH; + } + else + { + agc_bits = AGC_BITS_PER_CH * pSpar_md_cfg->nchan_transport + AGC_SIGNALLING_BITS; + } + } + else + { + agc_bits = AGC_SIGNALLING_BITS; + } + + if ( ivas_total_brate == PCA_BRATE && sba_order == SBA_FOA_ORDER ) + { + pca_bits = 1; + if ( pca_flag ) + { + pca_bits += IVAS_PCA_QBITS + IVAS_PCA_QBITS - 1; + } + } + else + { + pca_bits = 0; + } + pSpar_md_cfg->max_md_bits_spar = pSpar_md_cfg->max_bits_per_blk + agc_bits + pca_bits; + } +#endif return; } diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 7fceb7941f..cc0fbf89b3 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -43,13 +43,16 @@ /*----------------------------------------------------------------------------------* * Declaration of ISM common (encoder & decoder) structure *----------------------------------------------------------------------------------*/ + typedef struct { int16_t last_angle1_idx; /* last frame index of coded azimuth/yaw */ int16_t angle1_diff_cnt; /* FEC counter of consecutive differentially azimuth/yaw coded frames */ int16_t last_angle2_idx; /* last frame index of coded elevation/pitch */ int16_t angle2_diff_cnt; /* FEC counter of consecutive differentially elevation/pitch coded frames */ + } ISM_METADATA_ANGLE, *ISM_METADATA_ANGLE_HANDLE; + /* ISM metadata handle (storage for one frame of read ISM metadata) */ typedef struct { @@ -57,10 +60,13 @@ typedef struct int16_t last_ism_metadata_flag; /* last frame ism_metadata_flag */ float azimuth; /* azimuth value read from the input metadata file */ - float elevation; /* azimuth value read from the input metadata file */ - float radius; - float yaw; /* azimuth orientation value read from the input metadata file */ - float pitch; /* elevation orientation value read from the input metadata file */ + float elevation; /* elevation value read from the input metadata file */ + float radius; /* radius value read from the input metadata file */ + float yaw; /* yaw value read from the input metadata file */ + float pitch; /* pitch value read from the input metadata file */ + + int16_t non_diegetic_flag; /* Non-diegetic (non-headtracked) object flag */ + ISM_METADATA_ANGLE position_angle; /* Angle structs for azimuth and elevation */ ISM_METADATA_ANGLE orientation_angle; /* Angle structs for yaw and pitch */ int16_t last_radius_idx; /* last frame index of coded radius */ @@ -71,6 +77,10 @@ typedef struct float last_true_azimuth; /* MD smoothing in DTX- last true Q azimuth value */ float last_true_elevation; /* MD smoothing in DTX- last true Q elevation value */ + int16_t ism_md_fec_cnt_enc; /* counter of continuous frames where MD are not transmitted */ + int16_t ism_md_inc_diff_cnt; /* counter of continuous frames where MD are transmitted in inactive segments when MD significantly changes */ + float last_true_radius; /* last true Q radius value */ + } ISM_METADATA_FRAME, *ISM_METADATA_HANDLE; @@ -157,6 +167,7 @@ typedef struct ivas_param_ism_data_structure int16_t flag_noisy_speech; int16_t noisy_speech_buffer[PARAM_ISM_HYS_BUF_SIZE]; + int16_t flag_equal_energy; } PARAM_ISM_CONFIG_DATA, *PARAM_ISM_CONFIG_HANDLE; @@ -169,6 +180,9 @@ typedef struct ivas_dirac_config_data_struct { int16_t enc_param_start_band; int16_t dec_param_estim; +#ifndef FIX_393_459_460_SBA_MD + int16_t dec_param_estim_old; +#endif int16_t nbands; } DIRAC_CONFIG_DATA, *DIRAC_CONFIG_DATA_HANDLE; @@ -251,6 +265,9 @@ typedef struct ivas_spar_md_com_cfg int16_t agc_bits_ch_idx; int16_t planarCP; int16_t num_umx_chs; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t max_md_bits_spar; +#endif } ivas_spar_md_com_cfg; @@ -335,7 +352,7 @@ typedef struct ivas_agc_chan_data_t typedef struct ivas_agc_com_state_t { float *winFunc; - int16_t in_delay; + int16_t in_delay; /* TODO: JBM check if this needs to be adjusted in the dec */ uint16_t absEmin; uint16_t betaE; uint16_t maxAttExp; @@ -415,6 +432,9 @@ typedef struct ivas_masa_directional_spatial_meta_struct float elevation[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float spread_coherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; +#ifdef HR_METADATA + uint16_t spherical_index[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; +#endif } MASA_DIRECTIONAL_SPATIAL_META; @@ -459,6 +479,9 @@ typedef struct int16_t nbands; int16_t nblocks; int16_t start_band; +#ifdef FIX_HBR_MASAMETA + uint8_t inactiveBands; +#endif int16_t search_effort; MC_LS_SETUP mc_ls_setup; @@ -490,7 +513,6 @@ typedef struct ivas_qdirection_band_coherence_data_struct uint8_t spread_coherence[MAX_PARAM_SPATIAL_SUBFRAMES]; uint16_t spread_coherence_dct0_index; uint16_t spread_coherence_dct1_index; - } IVAS_QDIRECTION_BAND_COHERENCE_DATA; typedef struct ivas_surround_coherence_band_data_struct @@ -690,6 +712,10 @@ typedef struct ivas_td_decorr_state_t int16_t num_apd_sections; int16_t ducking_flag; +#ifdef JBM_TSM_ON_TCS + int16_t offset; +#endif + } ivas_td_decorr_state_t; @@ -702,6 +728,7 @@ typedef struct ivas_fb_mixer_cfg_t int16_t fb_latency; int16_t num_in_chans; int16_t num_out_chans; + int16_t nchan_fb_in; int16_t pcm_offset; int16_t fade_len; /* this sets the stride length; no delay is introduced */ int16_t prior_input_length; diff --git a/lib_com/ivas_stereo_td_bit_alloc.c b/lib_com/ivas_stereo_td_bit_alloc.c index b1fa0a49c8..dee56c5dff 100644 --- a/lib_com/ivas_stereo_td_bit_alloc.c +++ b/lib_com/ivas_stereo_td_bit_alloc.c @@ -478,7 +478,6 @@ void td_stereo_param_updt( } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL /*-------------------------------------------------------------------* * tdm_SCh_LSF_intra_pred_zero_bits() * @@ -597,8 +596,6 @@ void tdm_SCh_LSF_intra_pred( } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE - /*-------------------------------------------------------------------* * tdm_SCh_LSF_intra_pred_one_bit_dec() * @@ -728,6 +725,3 @@ void tdm_SCh_lsf_reuse( return; } -#endif - -#endif diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index 23620b3b2d..f2dd0871dc 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -87,12 +87,107 @@ static const float ivas_three_pow_frac[IVAS_MAX_DECORR_APD_SECTIONS] = { }; +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) + /*------------------------------------------------------------------------------------------* * Local functions declaration *------------------------------------------------------------------------------------------*/ static int16_t ivas_get_APD_filt_orders( const int16_t num_out_chans, const int32_t output_Fs, int16_t *APD_filt_orders ); -static ivas_error ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const int16_t num_out_chans, const int16_t ducking_flag ); + +static void ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const int16_t num_out_chans, const int16_t ducking_flag ); + + +/*------------------------------------------------------------------------- + * ivas_td_decorr_reconfig_dec() + * + * Allocate and initialize time domain decorrelator handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_td_decorr_reconfig_dec( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate, /* i : total IVAS bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs, /* i : output sampling rate */ + ivas_td_decorr_state_t **hTdDecorr, /* i/o: TD decorrelator handle */ + uint16_t *useTdDecorr /* i/o: TD decorrelator flag */ +) +{ + uint16_t useTdDecorr_new; + ivas_error error; + + useTdDecorr_new = 0; + if ( ivas_format == SBA_FORMAT ) + { + if ( nchan_transport == 1 ) + { + useTdDecorr_new = 1; + } + } + else if ( ivas_format == MASA_FORMAT ) + { + if ( ( ivas_total_brate < IVAS_48k && nchan_transport == 1 ) || ivas_total_brate < MASA_STEREO_MIN_BITRATE ) + { + useTdDecorr_new = 1; + } + } + else if ( ivas_format == MC_FORMAT ) + { + if ( ivas_total_brate < IVAS_48k && nchan_transport == 1 ) + { + useTdDecorr_new = 1; + } + } + + if ( *useTdDecorr != useTdDecorr_new ) + { + *useTdDecorr = useTdDecorr_new; + + if ( *useTdDecorr ) + { + if ( ivas_total_brate >= IVAS_13k2 && ivas_format == SBA_FORMAT ) + { + if ( *hTdDecorr == NULL ) + { + if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ivas_total_brate < IVAS_24k4 ) + { + ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR; + } + else + { + ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN; + } + } + else + { + if ( *hTdDecorr == NULL ) + { + if ( ( error = ivas_td_decorr_dec_open( hTdDecorr, output_Fs, 3, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + ivas_td_decorr_init( *hTdDecorr, 3, 0 ); + } + } + } + else + { + ivas_td_decorr_dec_close( hTdDecorr ); + } + } + + return IVAS_ERR_OK; +} /*------------------------------------------------------------------------- @@ -127,7 +222,9 @@ ivas_error ivas_td_decorr_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); } set_f( hTdDecorr_loc->look_ahead_buf, 0, (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ); - +#ifdef JBM_TSM_ON_TCS + hTdDecorr_loc->offset = (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); +#endif hTdDecorr_loc->num_apd_sections = ivas_get_APD_filt_orders( num_out_chans, output_Fs, hTdDecorr_loc->APD_filt_state[0].order ); for ( j = 0; j < num_out_chans; j++ ) @@ -275,7 +372,7 @@ static int16_t ivas_get_APD_filt_orders( * TD decorr Initialisation function *-----------------------------------------------------------------------------------------*/ -static ivas_error ivas_td_decorr_init( +static void ivas_td_decorr_init( ivas_td_decorr_state_t *hTdDecorr, const int16_t num_out_chans, const int16_t ducking_flag ) @@ -295,7 +392,7 @@ static ivas_error ivas_td_decorr_init( } } - return IVAS_ERR_OK; + return; } @@ -304,8 +401,7 @@ static ivas_error ivas_td_decorr_init( * * APD IIR filter *-----------------------------------------------------------------------------------------*/ - -static void ivas_td_decorr_APD_iir_filter( +void ivas_td_decorr_APD_iir_filter( ivas_td_decorr_APD_filt_state_t *filter_state, float *pIn_out, const int16_t num_APD_sections, @@ -375,20 +471,32 @@ static void ivas_td_decorr_APD_sections( void ivas_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ - float pcm_in[][L_FRAME48k], /* i : input audio channels */ - float **ppOut_pcm, /* o : output audio channels */ - const int16_t output_frame /* i : output frame length */ +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], /* i : input audio channels */ +#else + float pcm_in[][L_FRAME48k], /* i : input audio channels */ +#endif + float **ppOut_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ ) { int16_t i, j; +#ifndef JBM_TSM_ON_TCS int16_t offset; +#endif float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; +#ifndef JBM_TSM_ON_TCS offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); +#endif /* Look-ahead delay */ mvr2r( pcm_in[0], ppOut_pcm[0], output_frame ); +#ifdef JBM_TSM_ON_TCS + delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, hTdDecorr->offset ); +#else delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, offset ); +#endif /* In ducking gains */ if ( hTdDecorr->ducking_flag ) diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index b75c083791..cf59a751a6 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -75,10 +75,18 @@ float sumAbs( void mvc2c( const uint8_t x[], /* i : input vector */ uint8_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ +#ifdef FIX_XXX_JBM_FIFO_BUFFER + const int32_t n +#else + const int16_t n /* i : vector size */ +#endif ) { +#ifdef FIX_XXX_JBM_FIFO_BUFFER + int32_t i; +#else int16_t i; +#endif if ( n <= 0 ) { @@ -114,14 +122,22 @@ void mvc2c( /*! r: number of clipped samples */ uint32_t ivas_syn_output( - float synth[][L_FRAME48k], /* i/o: float synthesis signal */ +#ifdef JBM_TSM_ON_TCS + float *synth[], /* i/o: float synthesis signal */ +#else + float synth[][L_FRAME48k], /* i/o: float synthesis signal */ +#endif const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ int16_t *synth_out /* o : integer 16 bits synthesis signal */ ) { int16_t i, n; +#ifdef JBM_TSM_ON_TCS + int16_t synth_loc[MAX_JBM_L_FRAME48k]; +#else int16_t synth_loc[L_FRAME48k]; +#endif uint32_t noClipping = 0; /*-----------------------------------------------------------------* @@ -147,6 +163,42 @@ uint32_t ivas_syn_output( return noClipping; } + +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_syn_output_f() + * + * Output ivas synthesis signal with compensation for saturation + * returns number of clipped samples + *-------------------------------------------------------------------*/ + +/*! r: number of clipped samples */ +void ivas_syn_output_f( + float *synth[], /* i/o: float synthesis signal */ + const int16_t output_frame, /* i : output frame length (one channel) */ + const int16_t n_channels, /* i : number of output channels */ + float *synth_out /* o : integer 16 bits synthesis signal */ +) +{ + int16_t i, n; + + /*-----------------------------------------------------------------* + * float to integer conversion with saturation control + *-----------------------------------------------------------------*/ + + for ( n = 0; n < n_channels; n++ ) + { + for ( i = 0; i < output_frame; i++ ) + { + synth_out[i * n_channels + n] = synth[n][i]; + } + } + + return; +} +#endif + + /*-------------------------------------------------------------------* * mvr2r_inc() * diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c index 5f0916dbd1..02a735e80c 100644 --- a/lib_com/lsf_tools.c +++ b/lib_com/lsf_tools.c @@ -2027,7 +2027,6 @@ int16_t tcxlpc_get_cdk( return cdk; } -#ifdef ERI_FDCNGVQ_LOW_ROM void dec_FDCNG_MSVQ_stage1( int16_t j_full, /* i: index full range */ int16_t n, /* i: dimension to generate */ @@ -2067,7 +2066,7 @@ void dec_FDCNG_MSVQ_stage1( for ( col = 0; col < cdk1_ivas_cols_per_segment[segm_ind]; col++ ) { dct_vec[col] = (float) ( ( (Word16) cbpW8[col] ) << dct_col_shift_tab[col] ); - /* LOGIC( 1 );SHIFT( 1 ); ADD( 1 ); + /* LOGIC( 1 ); SHIFT( 1 ); ADD( 1 ); in BASOP: s_and(for W8->W16), shl(), sub() */ } @@ -2082,7 +2081,6 @@ void dec_FDCNG_MSVQ_stage1( v_add( idct_vec, cdk1r_tr_midQ_truncQ, uq, n ); assert( uq_ind == NULL ); } -#endif /*--------------------------------------------------------------------------* @@ -2093,19 +2091,17 @@ void dec_FDCNG_MSVQ_stage1( void msvq_dec( - const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ - const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ - const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ - const int16_t stages, /* i : Number of stages */ - const int16_t N, /* i : Vector dimension */ - const int16_t maxN, /* i : Codebook dimension */ - const int16_t Idx[], /* i : Indices */ -#ifdef ERI_FDCNGVQ_LOW_ROM + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const int16_t stages, /* i : Number of stages */ + const int16_t N, /* i : Vector dimension */ + const int16_t maxN, /* i : Codebook dimension */ + const int16_t Idx[], /* i : Indices */ const int16_t applyIDCT_flag, /* i : applyIDCT flag */ const float *invTrfMatrix, /* i: matrix for IDCT synthesis */ -#endif - float *uq, /* o : quantized vector */ - Word16 *uq_ind /* o : quantized vector (fixed point) */ + float *uq, /* o : quantized vector */ + Word16 *uq_ind /* o : quantized vector (fixed point) */ ) { int16_t i, n, maxn, start; @@ -2141,7 +2137,6 @@ void msvq_dec( start = 0; } -#ifdef ERI_FDCNGVQ_LOW_ROM if ( i == 0 && applyIDCT_flag != 0 ) { assert( start == 0 ); @@ -2162,21 +2157,6 @@ void msvq_dec( } } #undef WMC_TOOL_SKIP -#else - - v_add( uq + start, cb[i] + Idx[i] * maxn, uq + start, n ); - -#define WMC_TOOL_SKIP - IF( uq_ind != NULL ) - { - FOR( j = 0; j < n; ++j ) - { - move16(); - uq_ind[start + j] = add( uq_ind[start + j], (Word16) ( cb[i][Idx[i] * maxn + j] * 2.0f * 1.28f ) ); - } - } -#undef WMC_TOOL_SKIP -#endif } return; @@ -2445,7 +2425,6 @@ void a2isf( return; } -#ifdef ERI_FDCNGVQ_LOW_ROM /*-------------------------------------------------------------------* * dctT2_N_apply_matrix() * @@ -2635,6 +2614,3 @@ void create_IDCT_N_Matrix( float *inv_matrixFloatQ, const int16_t N, const int16 } } } - - -#endif diff --git a/lib_com/options.h b/lib_com/options.h index 18b77cd678..2921cadbdd 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -64,7 +64,7 @@ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_DFT*/ /* output most important DFT stereo parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TD*/ /* output most important TD stereo parameters to the subdirectory "res/ */ -//#define DEBUG_MODE_DIRAC /* output most important DIRAC parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_DIRAC*/ /* output most important DIRAC parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_MDCT*/ /* output most important MDCT parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_PARAM_MC */ /* output Parametric MC paramters to the subdirectory "res/" */ /*#define DEBUG_MODE_PARAM_ISM*/ /* output Parametric ISM paramters to the subdirectory "res/" */ @@ -114,6 +114,7 @@ /*#define DEBUG_SBA*/ /* debug DIRAC/SPAR in-out */ #ifdef DEBUG_SBA +/*#define DEBUG_LBR_SBA*/ /* debug low bitrate SBA (SPAR+DirAC) */ /*#define DEBUG_SBA_AUDIO_DUMP*/ /* SBA intermediate audio wav file dumping */ /*#define DEBUG_SBA_MD_DUMP*/ /* SBA metadata and variable file dumping */ /*#define DEBUG_SPAR_MD_TARGET_TUNING*/ /* SPAR MD target bitrate tuning debug code */ @@ -124,7 +125,8 @@ #endif /*#define SPAR_HOA_DBG*/ /* SPAR HOA debug statements */ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ -#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ +//#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ +#define DEBUG_JBM_CMD_OPTION /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ #endif /* #################### End DEBUGGING switches ############################ */ @@ -132,39 +134,107 @@ /* ################# Start DEVELOPMENT switches ######################## */ #define BASOP_NOGLOB /* Disable global symbols in BASOPs, Overflow/Carry in BASOPs disabled, additional BASOPs in case of Overflow */ -#define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ +#define IND_LIST_DYN /* VA: Issue 18: Dynamic allocation of ind_list[] and ind_list_metadata[] based on # of transport channels */ -#define LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo Secondary channel LSF Q improvement */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL -#define LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE /* switch to isolate the reuse mode case */ +#ifndef IND_LIST_DYN +#define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ #endif + #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_ISM_DTX_CNG_BWIDTH_ALT /* VA: issue 396 - alternative fix for bw changes on CNG frames in ISM DTX for objects that use the decoder-side noise estimation */ -#define FIX_398_MASA_DIRECTION_ALIGNMENT /* Nokia: Issue 398: in 2dir MASA, dynamically adjust directions to be consistent */ -#define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ -#define FIX_419_ISM_MD_FIX /* VA: Issue 419: fix the upper value limitation for parameter angle1_diff_cnt */ +#define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ +#define UPDATE_SBA_FILTER /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ + +/*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ +#define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ + +#define SBA_TD_RESIDUAL /* Dlb : Issue 426: SBA encoder complexity optimization */ + +#define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */ +#define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ +#define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ +#define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ +#define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ + +#define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ + +#define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ + +#define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */ + +#define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ + +#define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */ + +#define LBR_SBA_DIRAC_FIX /* DLB: Bug fix for DirAC at low bitrates */ -#define SNS_MSVQ /* FhG: contribution 33 - MSVQ for SNS parameters at stereo mid bitrates */ +#define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */ +#define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ +#define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ -#define FIX_379_GAININTP /* Eri: Adds a gain interpolation for directional/distance gain to handle abrupt changes in metadata (Non BE) */ +#define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ +#define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ +#define FIX_MASA_DELAY_PRINTOUT /* VA: issue 444: fix MASA decoder delay printout */ -#define FIX_418_SID_BITRATE /* Eri: Issue 418: Using the correct bitrate for unified stereo SID */ -#define PARAMMC_SHORT_ENC_MDFT /* FhG: Issue 410: complexity optimization for parametric Multichannel modes */ -#define FIX_421_TD_INT_TUNE /* Eri: Issue 421: Increase use of interpolation in TD renderer filter transition */ -#define FIX_419_ISM_BRATE_SW_DTX /* VA: issue 419: fix ISM Bitrate Switching with dtx */ -#define FIX_422 /* FhG: Issue 422: re-introduce fix for noisy speech buffer in ParamISM */ +#define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ +#define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ -#define ERI_FDCNGVQ_LOW_ROM /* Eri: Contribution #31 Table ROM saving for IVAS FDCNG-VQ modes */ -#define FIX_401_DIRAC_RENDERER_META_READ_INDICES /* Nokia: Issue 401: Fix metadata reading indices in DirAC renderer. */ -#define FIX_406_IVAS_POSITION /* Eri: Issue 406: Unify IVAS_POSITION to use IVAS_VECTOR3 instead */ -#define REND_DEBUGGING_REVISION /* VA: encapsulate rendering debugging options with DEBUGGING */ -#define FIX_416_ISM_BR_SWITCHING /* FhG: add missing CLDFB reconfig to ISM BR switching */ +#define COMPLEXITY_LEVEL_INDICATION + +#define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ + +#define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ + +#define FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Eri: Remove unintentional reset of directivity pattern */ +#define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ +#define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */ +#define VARIABLE_SPEED_DECODING /* FhG: Contribution 37: variable speed decoding employing the JBM functioniality */ +#define JBM_TSM_ON_TCS /* FhG: Contribution 37: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ +#define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ +#define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ +#define FIX_MDCT_ST_PLC_FADEOUT_DELAY +#define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ +#define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ +#define FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR /* Eri: Fix for issue 462: Use-of-uninitialized memory in external HRTF deallocation in decoder together with BR switching */ +#define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ +#define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ +#define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ + +#define FIX_163_SBA_TD_DECORR_OPT /* Dlb : Issue 163 : TD decorr state optimization in SBA for certain output formats */ + +#define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ +#define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ +#define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ +#define FIX_499_DFT_STEREO_PLC /* Eri: Fix for issue 499: Wrong past memory addressed for computing energy of DFT stereo residual ECU frame */ +#define FIX_489_COV_SMOOTHING /* Dlb: Fix covariance smoothing for ParamUpmix */ +#define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ +#define FIX_I503_ASAN_ERROR_IND_LIST /* VA: fix issue #503: address sanitizer error with IND_LIST_DYN */ +#define FIX_473_JITTER_NONDIEGETIC_PANNING /* FhG,Orange: add missing non-diegetic panning to JITTER */ + +#define SBA_MODE_CLEAN_UP /* Dlb: Cean up SBA mode references */ +#define FIX_502_IND_LIST_SIZE /* Fix issue #502: insufficient index buffer sizes */ + +#ifdef HR_METADATA +#define FIX_505_MASA_SPHGRID_REUSE /* Nokia: Fix issue #505: MASA spherical grid reuse fix */ +#endif + +#define FIX_481_UNUSED_VARIABLES /* Nokia: Fix issue #481: Unused debug variables */ + +#define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ +#define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ +#define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ +#define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */ +#define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ +#define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ + +#define FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER /* ..\apps\renderer.c(240): .... (todo: implementation)",*/ +#define REMOVE_OBS_CODE /* FhG: Remove unnecessary assignement after LFE cleanup (Issue #451)*/ #define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ + #endif diff --git a/lib_com/prot.h b/lib_com/prot.h index c63a8d93de..e6f371c468 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -177,7 +177,11 @@ float sum2_f( void set_c( int8_t y[], /* i/o: Vector to set */ const int8_t a, /* i : Value to set the vector to */ - const int16_t N /* i : Lenght of the vector */ +#ifdef JBM_TSM_ON_TCS + const int32_t N /* i : Length of the vector */ +#else + const int16_t N /* i : Length of the vector */ +#endif ); void set_s( @@ -515,6 +519,54 @@ void push_next_bits( #endif ); +#ifdef IND_LIST_DYN +int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +int16_t get_core_max_num_indices( /* o : maximum number of indices */ + const int16_t core, /* i : core */ + const int32_t total_brate /* i : total bitrate */ +); + +int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ + const int32_t extl_brate /* i : extensiona layer bitrate */ +); + +int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices for metadata */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +); + +ivas_error ind_list_realloc( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ +); + +ivas_error check_ind_list_limits( + BSTR_ENC_HANDLE hBstr /* i/o: encoder bitstream handle */ +); + +ivas_error move_indices( + INDICE_HANDLE old_ind_list, /* i/o: old location of indices */ + INDICE_HANDLE new_ind_list, /* i/o: new location of indices */ + const int16_t nb_indices /* i : number of moved indices */ +); + +int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ +); + +uint16_t delete_indice( /* o : number of deleted indices */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + int16_t id /* i : ID of the indice */ +); +#endif + /*! r: value of the indice */ #ifdef DEBUG_BS_READ_WRITE #define get_next_indice( ... ) get_next_indice_( __VA_ARGS__, __LINE__, __func__ ) @@ -613,12 +665,14 @@ Decoder_State **reset_elements( ); +#ifndef IND_LIST_DYN void indices_to_serial_generic( const Indice *ind_list, /* i : indices list */ const Word16 num_indices, /* i : number of indices to write */ UWord8 *pFrame, /* o : byte array with bit packet and byte aligned coded speech data */ Word16 *pFrame_size /* o : size of the binary encoded access unit [bits] */ ); +#endif void convertSerialToBytestream( const uint16_t *const serial, /* i : input serial bitstream with values 0 and 1 */ @@ -2219,8 +2273,12 @@ void read_next_force( int32_t *force_profile_cnt /* i/o: counter of frames for force switching profile file */ ); #endif + ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ +#ifdef IND_LIST_DYN + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ +#endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ @@ -2323,10 +2381,7 @@ ivas_error acelp_core_enc( float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ int16_t *unbits, /* o : number of unused bits */ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ -#ifndef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE - const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ -#endif - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); ivas_error acelp_core_switch_dec_bfi( @@ -3024,10 +3079,8 @@ void lsf_enc( float *Aq, /* o : quantized A(z) for 4 subframes */ const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL , const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ); void isf_enc_amr_wb( @@ -4502,10 +4555,8 @@ ivas_error acelp_core_dec( const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT , const int16_t read_sid_info /* i : read SID info flag */ -#endif ); void bass_psfilter_init( @@ -4586,10 +4637,8 @@ void lsf_dec( float *lsp_new, /* o : de-quantized LSP vector */ float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ const int16_t tdm_low_rate_mode /* i : secondary channel low rate mode flag */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL , const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ); void isf_dec_amr_wb( @@ -8060,34 +8109,30 @@ void msvq_enc( const int16_t *levels, /* i : Number of levels in each stage */ const int16_t maxC, /* i : Tree search size (number of candidates kept from */ /* one stage to the next == M-best) */ - const int16_t stages, /* i : Number of stages */ - const float w[], /* i : Weights */ - const int16_t N, /* i : Vector dimension */ - const int16_t maxN, /* i : Codebook dimension */ -#ifdef ERI_FDCNGVQ_LOW_ROM + const int16_t stages, /* i : Number of stages */ + const float w[], /* i : Weights */ + const int16_t N, /* i : Vector dimension */ + const int16_t maxN, /* i : Codebook dimension */ const int16_t applyDCT_flag, /* i : applyDCT flag */ float *invTrfMatrix, /* i:/o expanded synthesis matrix */ -#endif - int16_t Idx[] /* o : Indices */ + int16_t Idx[] /* o : Indices */ ); void msvq_dec( - const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ - const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ - const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ - const int16_t stages, /* i : Number of stages */ - const int16_t N, /* i : Vector dimension */ - const int16_t maxN, /* i : Codebook dimension */ - const int16_t Idx[], /* i : Indices */ -#ifdef ERI_FDCNGVQ_LOW_ROM + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const int16_t stages, /* i : Number of stages */ + const int16_t N, /* i : Vector dimension */ + const int16_t maxN, /* i : Codebook dimension */ + const int16_t Idx[], /* i : Indices */ const int16_t applyIDCT_flag, /* i : applyIDCT flag */ const float *invTrfMatrix, /* i: synthesis matrix */ -#endif - float *uq, /* o : quantized vector */ - Word16 *uq_ind /* o : quantized vector (fixed point) */ + float *uq, /* o : quantized vector */ + Word16 *uq_ind /* o : quantized vector (fixed point) */ ); -#ifdef ERI_FDCNGVQ_LOW_ROM + void dec_FDCNG_MSVQ_stage1( int16_t j_full, /* i: index full range */ int16_t n, /* i: dimension to generate */ @@ -8123,7 +8168,40 @@ void extend_dctN_input( float *matrix, /* i: idct matrix of size N rows , n_cols columns*/ const int16_t n_cols, /* i: number of columns == truncation length */ DCTTYPE dcttype ); /* i: matrix type */ -#endif + +int16_t msvq_stage1_dct_search( /* o : (p_max , best candidate sofar ) */ + const float *u, /* i : target */ + const int16_t N, /* i : target length and IDCT synthesis length */ + const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ + const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ + const int16_t max_dct_trunc, /* i: maximum of truncation lenghts */ + float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ + const float *midQ_truncQ, /* i: midQ vector */ + const float *dct_invScaleF, /* i: global inv scale factors*/ + const float *dct_scaleF, /* i: global scale factors*/ + const Word16 n_segm, /* i: number of segments */ + const Word16 *cols_per_segment, /* i: remaining length per segment */ + const Word16 *trunc_dct_cols_per_segment, /* i: trunc length per segment */ + const Word16 *entries_per_segment, /* i: number of rows per segment */ + const Word16 *cum_entries_per_segment, /* i: number of cumulative entries */ + const Word8 *const W8Qx_dct_sections[], /*i: Word8(byte) segment table ptrs */ + const Word16 *col_syn_shift[], /*i: columnwise syn shift tables */ + const Word8 *segm_neighbour_fwd, /*i: circular neighbour list fwd */ + const Word8 *segm_neighbour_rev, /*i: circular neighbour list reverse */ + const Word16 npost_check, /*i: number of neigbours to check , should be even */ + float *st1_mse_ptr, /*i: dynRAM buffer for MSEs */ + int16_t *indices_st1_local, /*o: selected cand indices */ + float *st1_syn_vec_ptr, /*i/o: buffer for IDCT24 synthesis */ + float *dist1_ptr /*o: resulting stage 1 MSEs in DCT-N domain */ +); + +int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( + /* o : (updated p_max) */ + const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */ + const float *u, /* i : target signal */ + const int16_t maxC_st1, /* i : number of candidates in stage1 */ + float *dist_ptr /* i/o: updated MSE vector for stage1 */ +); void PulseResynchronization( const float *src_exc, /* i : Input excitation buffer */ @@ -8254,11 +8332,8 @@ void lsf_end_enc( int16_t *lpc_param, int16_t *no_stages, int16_t *bits_param_lpc, - const int16_t coder_type_raw -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - , + const int16_t coder_type_raw, const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ); void lsf_end_dec( @@ -8270,10 +8345,8 @@ void lsf_end_dec( int16_t *lpc_param, /* i : LPC parameters */ int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ int16_t *nb_indices /* o : number of indices */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL , const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ); ivas_error find_pred_mode( @@ -8595,6 +8668,17 @@ void generate_masking_noise_mdct( HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ); +#ifdef JBM_TSM_ON_TCS +void SynthesisSTFT_dirac( + float *fftBuffer, /* i : FFT bins */ + float *timeDomainOutput, + float *olapBuffer, + const float *olapWin, + const int16_t samples_out, + HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ +); +#endif + void generate_masking_noise_dirac( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ HANDLE_CLDFB_FILTER_BANK h_cldfb, /* i : filterbank state */ @@ -9014,29 +9098,27 @@ int16_t BITS_ALLOC_config_acelp( ); ivas_error config_acelp1( - const int16_t enc_dec, /* i : encoder/decoder flag */ - const int32_t total_brate, /* i : total bitrate */ - const int32_t core_brate_inp, /* i : core bitrate */ - const int16_t core, /* i : core */ - const int16_t extl, /* i : extension layer */ - const int32_t extl_brate, /* i : extension layer bitrate */ - const int16_t L_frame, /* i : frame length at internal Fs */ - const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ - ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ - const int16_t signaling_bits, /* i : number of signaling bits */ - const int16_t coder_type, /* i : coder type */ - const int16_t tc_subfr, /* i : TC subfr ID */ - const int16_t tc_call, /* i : TC call number (0,1,2) */ - int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ - int16_t *unbits, /* o : number of unused bits */ - const int16_t element_mode, /* i : element mode */ - int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ - 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 idchan, /* i : channel id */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE - const int16_t active_cnt, /* i : Active frame counter */ -#endif + const int16_t enc_dec, /* i : encoder/decoder flag */ + const int32_t total_brate, /* i : total bitrate */ + const int32_t core_brate_inp, /* i : core bitrate */ + const int16_t core, /* i : core */ + const int16_t extl, /* i : extension layer */ + const int32_t extl_brate, /* i : extension layer bitrate */ + const int16_t L_frame, /* i : frame length at internal Fs */ + const int16_t GSC_noisy_speech, /* i : GSC on SWB noisy speech flag */ + ACELP_config *acelp_cfg, /* i : ACELP bit-allocation */ + const int16_t signaling_bits, /* i : number of signaling bits */ + const int16_t coder_type, /* i : coder type */ + const int16_t tc_subfr, /* i : TC subfr ID */ + const int16_t tc_call, /* i : TC call number (0,1,2) */ + int16_t *nBits_es_Pred, /* o : number of bits for Es_pred Q */ + int16_t *unbits, /* o : number of unused bits */ + const int16_t element_mode, /* i : element mode */ + int16_t *uc_two_stage_flag, /* o : flag undicating two-stage UC */ + 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 idchan, /* i : 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_LRTD_flag, /* i : LRTD stereo mode flag */ const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c old mode 100644 new mode 100755 index 6701d39534..800362b576 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -6036,7 +6036,6 @@ const FD_CNG_SETUP FdCngSetup_swb2 = { 640, 320, sizeof(sidPartitions_swb2)/size const int16_t levels_37bits[FD_CNG_stages_37bits] = { 128, 64, 64, 64, 64, 64 }; const int16_t bits_37bits[FD_CNG_stages_37bits] = { 7, 6, 6, 6, 6, 6 }; -#ifdef ERI_FDCNGVQ_LOW_ROM /* IDCT_MATRIX_ROM: 18*24 Word16 = 432 Word16 */ /* or compressed IDCT_MATRIX_ROM: 18*24 Word8 + 25 = 230 Word16 + WMOPS (INDIRECT(432) and STORE(432) ) */ @@ -6325,142 +6324,8 @@ const Word8 cdk1_ivas_segm_neighbour_rev[128] = { 106, 111, 110, 117, 120, 107, 37, 104, 122, 114, 121, 119, 42, 126, 41, 11 }; -#endif -#ifndef ERI_FDCNGVQ_LOW_ROM -const float cdk_37bits_1_ivas[3072] = -{ - 33.94763184f , 23.04196358f , 19.02036476f , 15.61426640f , 9.84622097f , 6.74968624f , 8.78495407f , 6.55844116f , 6.41478300f , 3.65438509f , 2.53205872f , 0.20947371f , -3.68736625f , -6.96642828f , -8.93218231f , -10.77195358f , -14.39207268f , -19.83006287f , -25.90260124f , -30.72169685f , -32.16821671f , -35.03061295f , -35.84580231f , -35.98442459f , - 23.05311012f , 15.34062386f , 11.67077923f , 9.03463936f , 7.33119154f , 6.01164532f , 4.86430264f , 3.36793089f , 2.00524712f , 1.02420747f , -0.28395364f , -1.14369977f , -2.29296756f , -3.49234462f , -4.55691099f , -5.82124615f , -7.01340151f , -8.19280529f , -9.51517677f , -11.88930511f , -12.41490746f , -13.91690540f , -15.41597271f , -17.46363640f , - 6.34591007f , 5.83291101f , 1.82374179f , 1.64918160f , 2.46284771f , 3.21434593f , 4.79773092f , 6.78620768f , 7.17590570f , 7.29561472f , 6.46074152f , 4.26570177f , 0.29191878f , -5.68994617f , -8.93541527f , -12.17100811f , -15.95464516f , -19.82475090f , -28.43348694f , -31.13560677f , -30.82723999f , -33.92724228f , -37.10982895f , -39.15046310f , - -1.97859216f , -1.29728901f , -0.68513793f , -0.59703761f , -0.19596121f , -0.48437589f , 0.41912374f , 0.32082281f , 0.42840490f , 0.33297276f , 0.00419650f , 0.25515109f , 0.07341246f , -0.05156118f , -0.17369615f , -0.39090252f , -0.53758574f , -0.97013980f , -1.37499487f , -2.59367585f , -2.67291665f , -3.56308174f , -5.09242105f , -7.33598137f , - 44.73780441f , 32.42730713f , 26.58676720f , 20.32800293f , 15.91747665f , 11.15012264f , 7.68650007f , 10.27048969f , 9.52919579f , 5.18821383f , 1.79746056f , -0.50318158f , -4.92894411f , -9.36254311f , -14.76678371f , -15.57420921f , -16.40379715f , -19.38558006f , -24.47130203f , -28.18117905f , -26.27810097f , -28.22804451f , -30.44338608f , -33.63451004f , - 27.92958260f , 17.48978424f , 9.02943993f , 2.00556946f , 0.77582097f , 1.75702107f , 2.96648121f , 4.17692900f , 5.20950508f , 4.89404440f , 3.14809656f , 2.02777839f , 0.06399647f , -2.44093847f , -5.23348236f , -7.73788691f , -9.60736561f , -11.49096489f , -12.88784599f , -14.62041187f , -14.05591011f , -13.97139835f , -13.55158806f , -12.38661575f , - 4.40041780f , 6.02715492f , 8.63421249f , 11.23643303f , 10.21946526f , 7.12535143f , 3.97593451f , 1.47885716f , -0.34547061f , -2.21350408f , -3.58581519f , -3.49226046f , 1.64697266f , -0.80884248f , -6.61078739f , -0.83386075f , -6.55604124f , -8.50729084f , -13.99620533f , -22.11815453f , -23.36925316f , -25.26130867f , -27.82377815f , -31.91535187f , - -0.31119800f , -0.22902243f , -0.18182723f , -0.17193857f , -0.22133952f , -0.25048682f , -0.19776741f , -0.20502391f , -0.15689729f , -0.08497809f , -0.04383328f , 0.10558389f , 0.22994623f , 0.27078405f , 0.26461646f , 0.21337126f , 0.07602444f , -0.07640435f , -0.08624625f , -0.01901877f , -0.37278932f , -0.55278486f , -0.50081939f , -0.57718313f , - 11.09673309f , 12.25163174f , 11.92947292f , 11.36766434f , 10.26155853f , 10.59420109f , 11.28228855f , 9.29032898f , 7.86474180f , 5.81516743f , 3.32581139f , 0.59270757f , -2.99105382f , -7.64252663f , -12.32353687f , -16.56275558f , -19.50693130f , -21.39342690f , -23.04017448f , -26.55841255f , -27.89498329f , -29.63920593f , -31.31513977f , -34.91411972f , - 14.63949299f , 9.97996807f , 7.52127123f , 6.06751871f , 4.64821386f , 3.74143553f , 3.04003358f , 2.11276221f , 1.27838099f , 0.61896890f , -0.12750353f , -0.75742245f , -1.50008225f , -2.24619722f , -2.86748576f , -3.65039921f , -4.29070568f , -5.12242794f , -6.06238365f , -7.87343836f , -7.91463709f , -9.02013016f , -10.03069305f , -11.15602875f , - 6.92497873f , 3.86428881f , 3.33403730f , 3.50285769f , 5.03133297f , 5.47784615f , 5.12933731f , 4.11465311f , 3.29701447f , 2.28059053f , 0.75228900f , -0.37691337f , -1.86169589f , -3.51180482f , -5.11985493f , -6.74894667f , -8.46384716f , -10.43132973f , -12.40718174f , -14.97575378f , -15.92234325f , -14.67680931f , -16.35786247f , -21.92259026f , - 9.03859520f , 6.23588181f , 4.69891214f , 3.76419306f , 2.91222286f , 2.25166726f , 2.02948308f , 1.35998511f , 0.74028724f , 0.50349784f , -0.12927644f , -0.45801210f , -0.88480383f , -1.52290273f , -1.84748936f , -2.22180009f , -2.73286033f , -3.21036029f , -3.73283100f , -5.33005810f , -4.96555710f , -5.72577906f , -6.40969419f , -7.14143419f , - 38.57890320f , 31.23274040f , 23.27908325f , 16.41319847f , 12.96908092f , 11.89987564f , 11.08193970f , 10.02814865f , 9.20901966f , 5.84658241f , 1.48919916f , -2.57032323f , -7.26163483f , -11.23550892f , -13.34285927f , -13.96859360f , -14.14492226f , -14.77427292f , -15.53306389f , -16.79932404f , -15.12855816f , -14.29256630f , -13.92473507f , -13.23437977f , - 23.30056572f , 13.31616783f , 10.53007698f , 7.97990513f , 7.58186388f , 6.05487776f , 6.38700247f , 4.46871328f , 3.73780274f , 1.15311646f , -0.16795112f , -1.00963080f , -2.99656630f , -4.04802418f , -5.87744474f , -7.26942492f , -8.01433468f , -8.85430908f , -8.93447399f , -10.80081940f , -10.03588772f , -9.56312180f , -9.49805927f , -9.08203316f , - 27.72716713f , 15.70166302f , 12.12497234f , 9.82916641f , 8.54480648f , 7.48498583f , 6.46852112f , 4.42398930f , 2.79946446f , 1.41388083f , -0.10821334f , -0.99111170f , -2.64519501f , -4.05361032f , -6.13559484f , -7.88495255f , -9.31697083f , -11.29918480f , -13.29217148f , -15.89776802f , -16.73270416f , -15.78193951f , -16.71963501f , -20.72499275f , - 0.09654448f , 0.05992651f , 0.07271793f , 0.06090590f , -0.01909172f , -0.02661837f , 0.00184859f , 0.00821958f , 0.01826876f , 0.00751956f , -0.02172063f , 0.03389538f , -0.00261579f , 0.00331171f , -0.00514964f , 0.00147764f , 0.00065488f , 0.01022588f , 0.00899184f , 0.02156001f , 0.01748813f , 0.01100880f , 0.01848303f , -0.00200717f , - 35.99007034f , 24.20862198f , 19.41031075f , 16.17420769f , 10.83719921f , 7.76013374f , 9.00250912f , 6.69725418f , 5.31352282f , 3.62490821f , 2.61681867f , 0.34085435f , -3.79527760f , -7.07614565f , -9.08049870f , -11.36665630f , -14.87462139f , -21.07974815f , -27.34793472f , -31.39986610f , -32.07981873f , -27.78803635f , -28.28388596f , -28.39242935f , - 13.10489750f , 20.89344025f , 21.64855194f , 15.43504715f , 10.25371075f , 3.34968066f , 1.78396285f , 0.43690255f , 0.33645880f , 2.18413949f , 0.30379224f , 2.14339352f , 2.11168623f , -3.22490501f , -5.35176468f , -6.71944952f , -7.60760832f , -7.25716639f , -9.25983143f , -10.88946342f , -12.36510563f , -14.32815361f , -16.37483597f , -19.41078377f , - 6.47920799f , 6.26157904f , 4.08267021f , 3.55930829f , 4.81190968f , 5.21526289f , 6.64490366f , 6.17979145f , 5.88209581f , 5.32573366f , 4.89284468f , 2.50707030f , -1.80236220f , -4.32998514f , -7.66879225f , -12.10674191f , -15.55172729f , -17.02550125f , -22.69219017f , -24.15981102f , -21.53298187f , -24.35451317f , -30.13893318f , -32.50536728f , - -1.27988362f , -1.28642356f , -0.84176970f , -0.75768483f , -0.62176520f , -0.62706548f , -0.67682666f , -0.86569685f , -0.75184637f , -0.68499511f , -0.73107177f , -0.44849658f , 0.61550426f , 3.18549967f , 2.15541792f , 0.41898161f , -0.96763957f , -2.28376174f , -2.21816230f , -1.44123793f , -1.10070240f , -1.48757422f , -1.94006848f , -2.04375577f , - 44.99568176f , 33.17905807f , 28.70528412f , 24.13981819f , 16.39375496f , 12.74631882f , 12.26308346f , 7.28386831f , 3.65083528f , 1.09594464f , -0.70640332f , -0.90420610f , -5.15652418f , -8.39927197f , -9.75838566f , -12.33563995f , -16.17337418f , -20.72145081f , -21.89005280f , -22.08177948f , -22.01576805f , -28.49225616f , -28.58443069f , -28.66851044f , - 27.27372360f , 16.82239342f , 9.52775478f , 4.54592752f , 2.38096476f , 1.92719686f , 2.83496809f , 3.88023591f , 4.84239244f , 4.33260632f , 2.40358329f , 1.26160026f , -0.59154904f , -2.84664989f , -5.20095921f , -7.12129021f , -8.10309982f , -9.32675076f , -10.37824821f , -12.16980839f , -11.58549690f , -11.62355518f , -11.35874844f , -10.43139648f , - 16.01709366f , 12.10370731f , 10.30418873f , 9.84315491f , 9.04705238f , 8.59515572f , 8.13945866f , 5.33055639f , 3.59784794f , 2.10469317f , 0.74735385f , -0.35173890f , -3.04881167f , -5.32683229f , -7.84610510f , -9.60193539f , -11.38669300f , -12.69159031f , -15.22157860f , -17.92496300f , -18.30335999f , -19.30245590f , -20.96332741f , -29.99128151f , - -1.49891376f , -0.94159925f , -1.59718812f , -2.73734355f , -4.95862293f , -5.62506247f , -3.84028316f , -1.86409163f , -1.10922730f , -0.37675977f , 0.54625863f , 1.08458769f , 2.59583378f , 4.74187803f , 4.85828352f , 2.72942448f , 1.21778154f , 0.61253220f , -0.12000842f , -0.42560402f , -0.47587356f , -0.59399730f , -0.54576296f , -0.64007539f , - 27.21817589f , 25.04722404f , 19.98665237f , 18.40707970f , 15.35737038f , 12.12910748f , 10.67379093f , 8.65770626f , 6.83053064f , 4.53696156f , 1.99311268f , -2.65666389f , -5.61365652f , -8.72017097f , -11.54872608f , -14.03052521f , -17.60883713f , -18.92860985f , -19.26733208f , -21.02047348f , -20.41023064f , -24.96704483f , -27.28151131f , -32.13149261f , - 16.58616257f , 6.07702732f , 3.20051527f , 2.19352865f , 1.25951850f , 0.52847487f , 0.36339840f , 1.22322381f , 1.40252435f , 0.78051162f , -0.14960484f , -0.19245568f , 0.80768329f , -0.03997936f , -0.45896211f , -1.94675004f , -3.57758331f , -4.74786758f , -6.30557394f , -7.96810246f , -7.85797882f , -8.40102768f , -8.70696068f , -14.50718975f , - 5.83877993f , 8.64909840f , 10.36191940f , 10.75121212f , 10.87299442f , 9.20523739f , 6.57943916f , 2.45789552f , 0.32793057f , -0.19492692f , -0.50667870f , -0.82865268f , -3.29967546f , -5.41881037f , -5.00245380f , -7.02534580f , -7.16695213f , -10.07062340f , -13.29201317f , -15.16228962f , -14.82801533f , -13.98322010f , -16.56229019f , -25.20559120f , - 6.31290579f , 4.29846334f , 3.09123778f , 2.35388660f , 2.08894801f , 1.51627553f , 1.61039710f , 1.01586986f , 0.50589812f , 0.34378609f , -0.11773424f , -0.29939151f , -0.59060657f , -1.10041618f , -1.30399191f , -1.66196144f , -2.00707245f , -2.30241942f , -2.72166705f , -4.15126562f , -3.61430144f , -4.17390060f , -4.64368582f , -5.19181061f , - 45.07491302f , 31.96612358f , 24.59359169f , 15.32010937f , 11.66156387f , 10.47190285f , 8.21482182f , 6.91866159f , 6.46052694f , 2.31078482f , -0.97819418f , -3.39280653f , -5.75906181f , -7.82967377f , -8.74781990f , -9.47419548f , -9.85650921f , -10.05874729f , -10.25747013f , -11.21096134f , -9.55652142f , -8.75567627f , -8.43642902f , -7.74934912f , - 29.56493187f , 22.29573250f , 13.46729183f , 9.18490410f , 7.02603865f , 5.38271475f , 3.58497858f , 2.35314894f , 2.17064548f , 0.43121719f , -0.60757560f , -1.00088501f , -1.82668996f , -2.00680733f , -4.21636438f , -5.02670193f , -6.26371956f , -6.65761995f , -7.37742567f , -9.00110912f , -9.04595757f , -10.59253120f , -12.24499798f , -13.79708004f , - 18.81605339f , 15.10544109f , 13.69033337f , 12.55228615f , 12.10694313f , 9.87893867f , 7.45830679f , 3.83573604f , 1.58222044f , 0.19975230f , -0.48743680f , -1.03465378f , -3.26008105f , -6.03337908f , -6.72951269f , -8.16258240f , -9.35424900f , -11.36496258f , -14.10615826f , -16.52154922f , -15.71789932f , -14.28701687f , -15.86503506f , -21.98985291f , - 0.58833683f , 1.93554544f , 1.01621759f , 0.17751050f , 1.44273913f , 1.63168383f , 0.87785423f , 0.63285774f , 0.44776136f , 0.05703505f , -0.13712768f , 0.28278413f , -0.80131322f , -0.86604142f , -1.59806752f , -0.93005019f , -1.04011548f , -0.89366192f , -0.64847207f , -0.61214101f , -0.55340266f , -0.16991313f , -0.15702423f , -0.17067310f , - 39.23077011f , 28.73466682f , 25.17003059f , 18.13150215f , 12.30397224f , 10.44106960f , 8.78819275f , 7.09760094f , 4.76503944f , 3.22303295f , 1.15491402f , -0.03009734f , -3.15244532f , -7.48607492f , -9.52877903f , -12.40654850f , -15.16987514f , -18.84217262f , -22.60379219f , -26.15986252f , -28.55947685f , -31.27477455f , -36.50263596f , -45.15930557f , - 17.17733002f , 11.81043625f , 8.99961948f , 7.02285528f , 5.70868826f , 4.43369055f , 3.63820124f , 2.49104285f , 1.49823487f , 0.74478340f , -0.16968371f , -0.91984361f , -1.82045591f , -2.59034872f , -3.43512726f , -4.35373259f , -5.22545052f , -6.16511250f , -7.18896103f , -9.18914032f , -9.45307922f , -10.67428303f , -11.84619045f , -13.22418404f , - -0.55165589f , 0.54447228f , -1.45378113f , 0.62164629f , 1.57039273f , 1.95998776f , 2.55171132f , 3.54153609f , 4.37655210f , 5.13829708f , 4.63276052f , 3.44003415f , 1.41755366f , -1.65012610f , -4.90518045f , -8.74811363f , -13.32540989f , -16.67502213f , -25.04341888f , -28.74816895f , -26.61729050f , -30.89074135f , -36.89068222f , -40.54713821f , - 0.52585047f , 0.25778684f , -0.68478346f , -0.63753521f , -0.85982674f , -0.45736870f , -0.39972550f , 0.19919159f , 0.21982291f , -0.21426015f , -0.17481731f , -0.30233619f , 0.35445356f , 0.53019482f , 0.62357306f , 0.10003661f , 0.38106197f , 0.59916449f , 0.29353949f , 0.19449981f , -2.91975641f , -2.99291539f , -3.24024558f , -3.85247374f , - 47.57529449f , 35.40103149f , 28.51466560f , 21.36822510f , 16.31501770f , 12.05416298f , 8.92814922f , 10.24798870f , 9.38683319f , 5.06438446f , 1.55697119f , -0.90166509f , -5.27530479f , -10.13637447f , -14.91060257f , -15.56597614f , -16.76358414f , -19.75214577f , -22.57003212f , -24.67880249f , -22.22905731f , -23.92941093f , -26.02715302f , -29.14421463f , - 32.45030594f , 18.47647858f , 10.55478764f , 2.66163707f , 0.48469192f , 0.89728785f , 2.66320086f , 4.46394491f , 5.75276375f , 5.15140963f , 3.30917573f , 2.07156634f , 0.32162985f , -2.37937927f , -5.25204325f , -7.75560665f , -9.72864151f , -11.49621296f , -12.90788174f , -14.53592110f , -14.00264931f , -13.90744686f , -13.50663280f , -12.31781673f , - 15.12892532f , 10.85012150f , 9.24257946f , 7.17304945f , 5.39838934f , 4.54048777f , 4.45172882f , 4.02888584f , 4.08525467f , 3.34242988f , 1.18552935f , 0.14054979f , -1.31041145f , -4.10797310f , -6.60405207f , -7.35080433f , -7.80001211f , -10.14729309f , -14.88454437f , -18.54398346f , -20.49944305f , -23.77704430f , -28.38242531f , -32.21464920f , - -0.70120311f , -0.36598748f , -0.27498749f , -0.18644568f , -0.13108316f , -0.05633634f , -0.12568842f , -0.05810567f , 0.00805399f , 0.04813070f , 0.01124786f , 0.06457995f , 0.05968979f , 0.04663355f , 0.04679099f , 0.04774757f , 0.03833918f , -0.06331048f , -0.10397947f , 0.00857244f , 0.29188818f , 0.54560822f , 0.49374610f , -0.00754885f , - 24.01022911f , 20.44940186f , 18.33339310f , 13.47519684f , 11.34601212f , 10.42150116f , 9.00321579f , 7.93997908f , 7.78757143f , 4.54246807f , 3.10096765f , -1.79380953f , -4.57441616f , -8.99514294f , -11.16653728f , -12.33127975f , -15.28052711f , -18.40486145f , -21.08405685f , -23.96353531f , -24.15535736f , -27.96574211f , -31.00701714f , -35.18267441f , - 10.95846939f , 7.75293112f , 5.94634438f , 4.67962313f , 3.86481786f , 3.06800008f , 2.68010044f , 1.77875984f , 1.08723342f , 0.60881591f , -0.11699903f , -0.66425866f , -1.27388847f , -1.93990111f , -2.43955994f , -3.04650831f , -3.60661364f , -4.21451235f , -4.87673521f , -6.57435703f , -6.46493149f , -7.41116762f , -8.24285698f , -8.84710217f , - 16.32924080f , 6.70306444f , 4.40889025f , 4.39005423f , 5.66961336f , 5.49213505f , 5.14747572f , 4.57054806f , 3.82850742f , 2.47304583f , 0.96936250f , -0.07546291f , -1.78923011f , -3.94788241f , -5.62404537f , -7.41395044f , -9.30011559f , -11.32884693f , -13.38846397f , -15.90376568f , -16.61722183f , -15.37379074f , -16.91991615f , -22.64369392f , - 20.29391861f , 10.14759159f , 7.41714382f , 5.43669033f , 4.22476673f , 3.05457902f , 2.12789893f , 1.46166980f , 0.68013304f , 0.10416872f , -0.62377477f , -0.69513589f , -1.11597610f , -1.73416364f , -2.00164723f , -2.48846936f , -2.99404836f , -3.36779451f , -4.50076723f , -6.23718977f , -6.32519245f , -7.00517225f , -7.63285732f , -8.34685898f , - 44.62683868f , 33.65060043f , 28.74439240f , 23.09117126f , 16.70447159f , 13.63468075f , 10.38835239f , 5.27151346f , 3.37364483f , 0.80086398f , -1.61115754f , -1.84962809f , -4.63047361f , -7.54744434f , -8.66370773f , -11.56917572f , -14.30193806f , -18.52358246f , -19.55438995f , -20.00398636f , -19.80403900f , -20.08826447f , -20.32636070f , -20.57789421f , - 25.43884087f , 14.71314049f , 10.84564495f , 7.29425287f , 5.99180174f , 4.52135897f , 4.43509150f , 2.96715736f , 2.20721149f , 0.85104460f , -0.42902783f , -1.01505911f , -1.67976689f , -3.03431702f , -4.04744673f , -5.05236149f , -5.71568680f , -7.14737368f , -7.96077490f , -9.41807270f , -8.88839054f , -8.62583065f , -8.43768692f , -8.79677773f , - 33.08629990f , 21.98393631f , 16.71452332f , 13.11685467f , 10.53023720f , 8.59362793f , 6.77428055f , 4.80111885f , 2.96947551f , 1.50105977f , -0.29485464f , -1.76483214f , -3.38473845f , -5.02232218f , -6.55174637f , -8.24214268f , -9.90916348f , -11.56876373f , -13.40682983f , -16.22795105f , -17.44435501f , -19.50963020f , -21.48133469f , -22.37619972f , - 0.14234349f , 0.00043129f , -0.46088508f , -0.47227818f , 0.19577537f , 0.57165289f , 0.14063163f , -0.08314086f , -0.17897955f , 0.26915708f , 0.29296365f , 0.25751004f , -0.29272652f , -0.35612249f , -0.45116535f , -0.22750567f , -0.13805020f , -0.08609761f , -0.08811182f , -0.00370739f , 0.04999773f , 0.10020024f , 0.12026346f , 0.12320870f , - 37.20217514f , 25.50048447f , 26.05090904f , 21.39400101f , 14.80546665f , 10.78633976f , 9.48393726f , 6.51000643f , 4.64587116f , 2.54244065f , 1.88398576f , -0.17826277f , -3.92847228f , -7.94585609f , -9.83112335f , -12.51981831f , -16.25451469f , -22.52105331f , -26.16354942f , -28.17800331f , -28.44519234f , -28.99005890f , -29.07491684f , -29.13504791f , - 22.87589455f , 20.69346428f , 16.08814049f , 12.09293556f , 8.58536339f , 6.12085295f , 5.03096294f , 2.46971536f , 1.38820446f , 0.41556263f , -0.71674269f , -1.87001503f , -1.97099841f , -3.12624931f , -4.61008024f , -5.90624523f , -5.81033182f , -7.63588858f , -9.32999802f , -11.98378181f , -13.66734123f , -15.22948647f , -17.72668266f , -22.15813255f , - 17.13776016f , 7.48015785f , 3.87183666f , 3.80275106f , 3.69309711f , 2.47135592f , 3.28866863f , 5.23638964f , 5.97343540f , 3.02334547f , 1.66290724f , 1.17763150f , 0.56503248f , -4.12660456f , -4.84892178f , -8.03931713f , -10.07701778f , -12.74638939f , -15.61114883f , -18.82812119f , -20.06874847f , -20.77385521f , -23.02597237f , -28.41068077f , - -0.68962491f , -0.67818958f , -0.47791985f , -0.18780768f , 0.07656835f , 0.29909450f , 0.36705506f , 0.60864949f , 0.66434783f , 0.54813319f , 0.31165063f , 0.41151917f , 0.27194378f , -0.09006688f , -0.59337950f , -1.27168393f , -1.60383165f , -2.03537226f , -1.01842117f , -1.12101495f , -2.20869303f , -2.13650179f , -1.40165854f , -1.00871158f , - 49.11537170f , 34.27339554f , 29.03029442f , 23.60639191f , 19.18561935f , 16.01621819f , 10.65990448f , 5.50423098f , 3.26754117f , 0.54238629f , -2.50046039f , -1.85086572f , -5.88433218f , -8.55415058f , -9.42830467f , -11.97149277f , -14.98629475f , -17.55759621f , -17.94509125f , -18.13786888f , -17.94290543f , -28.52441216f , -28.69857025f , -28.89863968f , - 32.58505249f , 18.45134735f , 10.62341118f , 4.82959938f , 2.78050184f , 2.30071044f , 2.89666629f , 3.55971622f , 4.36246777f , 3.80749893f , 2.22673583f , 1.03990865f , -0.54025501f , -2.73137355f , -4.92715406f , -6.82418060f , -7.95124388f , -9.07779884f , -9.96023846f , -11.46563911f , -10.75256252f , -10.58728790f , -10.22681522f , -9.05898476f , - 16.11109161f , 14.82219410f , 13.34882832f , 7.98469877f , 9.43520164f , 7.92174578f , 5.07156849f , 3.38034701f , 3.45362854f , 2.55894756f , 0.36423218f , -0.89059198f , -2.32811356f , -5.22609854f , -8.06139755f , -8.08888912f , -7.59058094f , -9.63050747f , -13.39019203f , -16.84990501f , -16.90269279f , -20.11418533f , -23.25974846f , -26.99926376f , - -1.15594578f , -1.16174018f , -1.02029443f , -0.85063583f , -0.73866522f , -0.75481141f , -0.86772621f , -1.00807703f , -1.13209546f , -1.11179471f , -1.20630574f , -1.01733243f , 0.24630366f , 3.09700346f , 3.12491417f , 1.54673541f , -0.17814836f , -1.87219131f , -0.85840708f , 1.11508834f , 1.62732244f , 0.97436380f , -0.19077510f , -0.80510545f , - 32.42321777f , 27.32720947f , 20.86049461f , 15.20588684f , 12.79125309f , 12.29267693f , 12.11658001f , 11.01210213f , 10.89878845f , 7.15270519f , 2.06876802f , -2.13045192f , -6.80808592f , -11.65817642f , -14.62570095f , -16.24762154f , -16.86284065f , -17.20292854f , -18.81791878f , -20.65732384f , -19.57567215f , -19.88597488f , -22.49367523f , -26.33296204f , - 25.36096573f , 13.31346798f , 8.91108418f , 5.01322508f , 3.48370409f , 2.18634796f , 2.12754703f , 1.25077868f , 0.72989434f , 0.29854974f , -0.73259068f , -0.59268522f , 0.14181496f , -0.68818730f , -1.80540454f , -2.34638786f , -4.05338144f , -5.46354723f , -7.10088396f , -9.38928127f , -8.44892311f , -9.48880005f , -9.86396503f , -10.07871723f , - 7.17678213f , 9.03277683f , 10.13266754f , 10.24296856f , 10.17098331f , 8.09959507f , 5.65843153f , 1.62803376f , -0.36960009f , -0.74838853f , -0.79447383f , -0.80214244f , -2.22858644f , -4.54312086f , -4.46352482f , -5.71911240f , -5.88809395f , -8.41744232f , -10.94176769f , -12.21683311f , -12.21341038f , -11.48782635f , -14.09292316f , -23.15090752f , - 18.21541405f , 14.70297527f , 14.13050365f , 12.94417000f , 11.81984806f , 9.76036167f , 6.53366423f , 4.50655460f , 0.83037621f , -0.42548206f , -1.35710704f , -2.34608483f , -3.56638503f , -5.17272615f , -5.63396835f , -7.03527308f , -7.91377544f , -8.77217388f , -10.20801735f , -12.21526527f , -12.12676907f , -11.62418461f , -12.46908951f , -15.99641514f , - 44.82578278f , 29.92639542f , 27.50827789f , 23.80286217f , 17.65353203f , 14.31119919f , 9.68513775f , 4.39934206f , 2.73908210f , 0.84895563f , -2.34653950f , -2.60779619f , -5.48460007f , -7.85637569f , -8.35718441f , -10.63293934f , -12.35181427f , -14.18777370f , -14.52088261f , -15.19802761f , -14.50250244f , -14.72802734f , -15.11614609f , -15.65816784f , - 22.81040764f , 18.14611626f , 15.16109562f , 7.86977768f , 8.17525578f , 4.43149519f , 3.84347200f , 1.57480264f , 0.94041783f , 0.21524446f , -0.86289990f , -1.21070933f , -2.15402818f , -2.98346281f , -3.67899656f , -4.07589436f , -4.21469736f , -4.80487633f , -5.08027840f , -6.07973146f , -5.15939760f , -4.76911354f , -4.57167721f , -4.45344400f , - 24.49489975f , 17.31044769f , 13.22760391f , 10.45895958f , 8.42623138f , 6.75540257f , 5.42271709f , 3.69801641f , 2.30738783f , 1.11391723f , -0.26593676f , -1.45248365f , -2.67149425f , -4.03488445f , -5.14615870f , -6.45010090f , -7.70261431f , -9.10985470f , -10.61737823f , -13.08172894f , -13.92179298f , -15.81127357f , -17.59627724f , -19.73897552f , - 8.98934364f , 4.76031303f , 2.62020183f , 1.48485959f , 0.28737816f , 0.05866807f , -0.01028116f , -0.07208341f , -0.13242376f , -0.04422715f , -0.09028641f , -0.04876806f , 0.10697100f , 0.04797191f , 0.01100808f , -0.07014611f , -0.04378227f , -0.04009765f , -0.17876917f , -0.72032106f , -0.11678807f , -0.05392319f , -0.07008670f , -0.21385938f , - 36.29371643f , 24.65291214f , 21.01904678f , 16.67200279f , 11.48446560f , 8.12246799f , 9.78220177f , 7.74590874f , 5.69669485f , 4.02027988f , 3.36120009f , 0.58418810f , -3.89836407f , -7.63864374f , -10.03672886f , -12.67631626f , -16.54735374f , -22.06600380f , -27.53655815f , -31.70346832f , -32.28223419f , -33.58357620f , -33.78388596f , -33.85955811f , - 20.20799255f , 13.75940609f , 10.45750713f , 8.23875809f , 6.45997095f , 5.16953897f , 4.34209776f , 2.95543051f , 1.74270713f , 0.87219697f , -0.25581297f , -1.09575856f , -2.07853103f , -3.06528211f , -3.94644260f , -5.01998711f , -6.08012724f , -7.13329268f , -8.25736523f , -10.45005131f , -10.79236698f , -12.32848263f , -13.70973110f , -15.25794792f , - 7.88285303f , 6.51488161f , 3.92537451f , 4.23367739f , 4.89059639f , 5.43539810f , 6.37946939f , 8.50651741f , 9.33964443f , 8.69559956f , 6.91200352f , 3.63401532f , -0.99519163f , -7.15117836f , -11.47043896f , -15.28446960f , -18.89196777f , -23.08573532f , -28.80813408f , -30.38180542f , -29.53565407f , -31.03279877f , -32.39319229f , -33.27596664f , - 0.40477216f , 0.24463084f , -0.76651365f , -0.71309596f , -0.87443089f , -0.30846810f , -0.39305758f , 0.23431541f , 0.22700633f , -0.23816873f , -0.20784868f , -0.32913551f , 0.34776384f , 0.50111002f , 0.59345955f , 0.10497253f , 0.34248179f , 0.54556167f , 0.25770640f , 0.16739839f , -4.25213432f , -4.33188486f , -4.59072590f , -5.18169022f , - 44.52682495f , 33.44413376f , 27.75477028f , 20.87782860f , 15.96038628f , 11.38267708f , 8.04888916f , 10.34346294f , 9.36942101f , 5.06397772f , 1.65765107f , -0.60627878f , -5.02781725f , -9.60684490f , -14.71248531f , -15.51352501f , -16.35951424f , -19.44139671f , -23.93828964f , -27.02204704f , -23.39621544f , -25.11229706f , -27.06189728f , -29.88434029f , - 30.53590775f , 18.24347496f , 10.48498344f , 3.34677172f , 1.29623032f , 1.39035857f , 2.45928121f , 3.70242572f , 4.65490055f , 4.28991556f , 2.71830440f , 1.69632769f , 0.22320883f , -2.12041640f , -4.55487108f , -6.90537930f , -8.85028553f , -10.44450092f , -11.88594723f , -13.62341404f , -13.19523811f , -13.18412113f , -12.81897163f , -11.68476582f , - 5.23515940f , 11.02192688f , 12.84599209f , 11.99070740f , 7.98806524f , 4.52272415f , 4.08583927f , 2.00564265f , -0.15996964f , -2.10115862f , -4.96646547f , -5.90554714f , 4.82052660f , 0.89168262f , -6.95808125f , 2.50679994f , -6.73005676f , -6.52649450f , -14.76829720f , -15.44077110f , -21.42759705f , -23.35196304f , -25.43357277f , -27.50794983f , - 1.84942830f , 0.77272046f , 0.24707772f , -0.08593588f , -0.23682129f , -0.24805132f , -0.09850720f , -0.04999159f , -0.00995130f , 0.02216339f , 0.08926903f , 0.20275106f , 0.22498472f , 0.26662621f , 0.16996276f , -0.06895026f , -0.26348418f , -0.41196167f , -0.47150335f , -0.43742141f , -0.53234649f , -0.56433624f , -0.59429443f , -0.65639752f , - 14.08870220f , 13.32911205f , 10.19654274f , 6.80626822f , 6.89704180f , 6.85630465f , 6.28267908f , 6.48725128f , 6.74154425f , 5.72381783f , 4.45444155f , 2.14331675f , -1.56116712f , -5.51466084f , -8.73317051f , -13.38193130f , -16.39547157f , -18.36110878f , -22.47372246f , -24.78481865f , -23.78740883f , -25.83082390f , -28.30295181f , -29.63710213f , - 12.11153984f , 11.18265629f , 8.56032085f , 6.07614088f , 4.32917595f , 3.62714767f , 2.88151503f , 0.00486909f , 0.16551718f , 0.11766627f , -1.01007175f , -1.58863187f , -0.66722620f , -1.26095092f , -2.03257895f , -2.68355250f , -1.88288093f , -2.89664102f , -3.82705688f , -5.15467978f , -5.96337652f , -7.68645287f , -9.75820160f , -14.60475540f , - 10.68691158f , 5.49249125f , 4.08632946f , 3.73180628f , 5.00127029f , 5.47980690f , 5.41938591f , 4.71624136f , 3.67419004f , 2.41826725f , 0.86259502f , -0.22994517f , -1.90842390f , -3.87555194f , -5.49712229f , -7.17735624f , -8.88335800f , -10.96466255f , -12.92337704f , -15.48291206f , -16.37232208f , -15.13042545f , -16.82096863f , -22.42011452f , - 15.85285378f , 10.13984489f , 8.02905941f , 4.50967121f , 2.95999980f , 2.60214114f , 0.53660029f , 0.86555701f , 0.22102003f , -0.33034071f , -0.07463158f , 0.21286504f , -0.93098062f , -1.75468397f , -1.58335686f , -1.24065292f , -1.48353171f , -1.76630950f , -2.04288220f , -3.12292504f , -2.45715189f , -2.74685717f , -3.16709018f , -5.91369343f , - 40.10007477f , 32.17766190f , 23.94418526f , 17.08811951f , 13.37568951f , 12.24086761f , 11.66988850f , 10.55005550f , 9.33296108f , 5.75441313f , 1.48114145f , -2.81252980f , -7.79981041f , -11.41279602f , -13.67298222f , -14.21839428f , -14.48849964f , -15.18556213f , -15.61604404f , -16.76811600f , -15.01851368f , -14.17923927f , -13.81790257f , -13.10479736f , - 24.85771179f , 14.51553345f , 11.72882080f , 8.90813828f , 8.43283081f , 6.32554102f , 6.22324610f , 3.79361701f , 4.27097321f , 0.56961524f , -1.24056125f , -1.41678429f , -3.11242867f , -4.09969568f , -5.68787241f , -6.75505066f , -7.30343008f , -8.00887489f , -7.82331944f , -9.66470909f , -8.76680851f , -8.39351845f , -8.12993431f , -7.16756201f , - 28.97707558f , 19.26215744f , 14.32650089f , 11.15691090f , 8.93038845f , 7.45748949f , 5.97504330f , 4.08204174f , 2.51096678f , 1.17593741f , -0.48250875f , -1.45828211f , -2.81734180f , -4.23465633f , -5.64280844f , -7.11844778f , -8.37782097f , -10.01226807f , -11.81233501f , -14.42724609f , -15.63475609f , -17.08984566f , -18.90253639f , -21.68543816f , - -0.37224483f , -0.21122639f , 0.15951714f , 0.02087032f , 1.22483158f , 0.00348772f , -0.18272802f , -0.44353136f , -0.08490600f , -0.11233181f , -0.16806731f , -0.22428627f , -0.01276036f , 0.06931113f , 0.01195190f , -0.11203818f , 0.03106703f , 0.26289529f , 0.23697743f , 0.22796448f , 0.04144126f , 0.09472501f , 0.14482924f , 0.17954086f , - 39.73665619f , 26.81943703f , 21.29967880f , 18.16204262f , 13.44168472f , 11.03711700f , 11.62625027f , 7.02647495f , 4.79233932f , 3.35499501f , 2.79116821f , -0.41337949f , -4.65079498f , -8.28630638f , -10.48777294f , -13.31785393f , -16.91392136f , -22.94918823f , -27.85824203f , -29.88930130f , -30.09802246f , -28.58382988f , -28.66120720f , -28.70516014f , - 19.10952950f , 22.74327850f , 23.97905540f , 21.18729591f , 11.64360809f , 6.94751596f , 4.65807104f , 0.78640783f , -0.24381419f , 1.02887869f , 0.82303244f , -0.54234630f , -0.94865251f , -1.77358091f , -5.30440760f , -8.68288422f , -8.39182663f , -8.75503826f , -11.02817535f , -13.34524441f , -13.31265545f , -13.47730160f , -16.70124626f , -23.44244576f , - 5.32545233f , 7.05786848f , 6.26387453f , 5.78526258f , 5.88421535f , 5.73053551f , 5.83421803f , 6.25754404f , 5.95633888f , 5.21652365f , 3.57697511f , 1.02363062f , -2.68831611f , -5.48803329f , -7.67456436f , -10.52217293f , -13.10689449f , -14.01679230f , -18.51670074f , -20.16453171f , -19.27928925f , -21.94375420f , -27.47334480f , -29.79807281f , - -2.60717487f , -1.83319664f , -1.31210554f , -0.76391363f , -0.20487705f , -0.30073228f , -0.07237651f , 0.09489144f , -0.11017539f , -0.08628271f , -0.06826403f , 0.06346101f , 0.18584041f , 0.16889001f , 0.13889854f , 0.14046463f , 0.05026200f , -0.19259109f , 0.12724322f , 0.05020098f , -0.06773847f , -0.35614878f , -0.63952541f , -0.86939591f , - 43.34894180f , 31.48630524f , 28.12536430f , 24.63106918f , 16.25746918f , 12.06399059f , 10.17741966f , 6.35993147f , 4.57542324f , 1.64055872f , 0.70682496f , -0.49986696f , -4.10422993f , -8.01978779f , -9.94273472f , -12.91026783f , -16.30473137f , -20.63467598f , -21.94548988f , -22.36483765f , -22.45355415f , -22.54744720f , -22.58737946f , -22.65038681f , - 30.95190620f , 18.16899109f , 9.72149658f , 4.10552931f , 2.30458689f , 2.12724614f , 2.85707808f , 4.13076019f , 5.31916714f , 4.81190920f , 3.00600863f , 1.67334628f , -0.53532135f , -3.10476613f , -5.73052549f , -7.79181433f , -9.06767464f , -10.22359562f , -11.19510365f , -12.66148758f , -12.00313091f , -11.91836929f , -11.49621868f , -10.27651405f , - 19.52749825f , 13.26932335f , 10.77497768f , 9.87707806f , 8.94397163f , 8.45470905f , 7.96926117f , 5.37859535f , 3.56771731f , 1.95985627f , 0.70804149f , -0.21590416f , -3.00161719f , -5.06863308f , -7.59307814f , -9.56244850f , -11.54047012f , -12.52976322f , -14.91271400f , -17.65096283f , -17.99032593f , -18.96465111f , -20.50286484f , -29.15997505f , - -0.41770393f , -0.57753342f , -1.20728409f , -2.88331747f , -5.34745789f , -6.08694220f , -3.71453929f , -2.12419772f , -1.18535638f , -0.59698033f , 0.42981535f , 1.32175910f , 2.83778572f , 4.84865475f , 5.04370260f , 3.07809186f , 1.49566460f , 0.65009278f , 0.04541466f , -0.15811041f , -0.29866409f , -0.41704908f , -0.46928179f , -0.48526672f , - 30.59598160f , 24.69124985f , 19.35356522f , 17.04518127f , 12.47758865f , 9.30305386f , 9.31541252f , 8.18128777f , 5.78386831f , 3.40561008f , 1.86525965f , -2.05713415f , -3.91759825f , -7.05117083f , -9.88467789f , -11.80012417f , -15.62137604f , -16.45769119f , -16.11259651f , -17.03925705f , -16.63202477f , -20.41814423f , -23.23829842f , -27.13690567f , - 22.04087639f , 9.82030296f , 6.62304544f , 3.54571700f , 2.28869224f , 1.43831360f , 1.01925826f , 0.60685647f , 0.52726758f , 0.28217983f , -0.60519862f , -0.40057555f , 0.33728161f , 0.16425660f , -0.30877599f , -1.72851086f , -3.62104511f , -5.35534239f , -7.36662674f , -9.61280251f , -9.84184837f , -9.76028061f , -10.30779839f , -12.96220016f , - 7.59925270f , 9.89327908f , 11.32660198f , 11.55432892f , 11.11032295f , 9.16942692f , 6.63248444f , 2.69755864f , 0.57976800f , 0.05171308f , -0.55509138f , -1.34203660f , -3.50475025f , -5.48786688f , -5.35051298f , -6.98438931f , -7.01662779f , -9.47507668f , -12.24847126f , -13.41042137f , -12.92720699f , -12.06966019f , -14.46927357f , -23.34392357f , - 6.96612597f , 5.00931787f , 3.76138091f , 3.18334484f , 2.03293252f , 1.34288895f , 1.58868873f , 1.00840783f , 0.40005356f , 0.06600340f , -0.13207078f , -0.20888096f , -0.49867839f , -0.91563702f , -1.39049554f , -1.52579367f , -1.76741624f , -2.06173539f , -2.48300815f , -3.86886954f , -3.38073707f , -3.92400837f , -4.47162819f , -5.09745169f , - 47.14703751f , 30.38273811f , 21.96264458f , 14.39871597f , 10.23386383f , 8.95710278f , 6.93860054f , 5.62253952f , 4.24646330f , 1.48851633f , -1.20669615f , -3.14844489f , -5.07624435f , -6.20617819f , -6.85559320f , -7.39740086f , -7.59652758f , -7.76342344f , -7.96090555f , -8.85080433f , -7.36783743f , -6.51624918f , -6.18211889f , -5.45559025f , - 33.12013626f , 16.84858894f , 12.65143013f , 8.74576950f , 7.71503162f , 5.75152826f , 5.57081461f , 3.33705091f , 2.19604564f , 0.46275416f , -1.08203483f , -1.74722302f , -2.23058796f , -3.73542142f , -4.79898882f , -5.51074600f , -5.92822361f , -7.29669523f , -7.87425613f , -9.19938278f , -8.26733780f , -7.79288721f , -7.17766953f , -6.91147518f , - 22.72534180f , 16.73917770f , 15.96501827f , 15.48456001f , 14.21817970f , 11.09321880f , 7.22196627f , 3.27875924f , 0.86349517f , -0.35276374f , -0.96022642f , -1.97590554f , -4.21987820f , -5.87952375f , -6.43021441f , -8.40103912f , -8.45606804f , -10.49744606f , -12.33858109f , -13.72036362f , -13.35521221f , -11.95208740f , -13.21454906f , -18.77292252f , - 0.89415503f , 2.55427527f , 2.19861484f , 1.76997423f , 1.68467879f , 1.11462021f , 0.72990263f , 0.68752390f , 0.55451417f , 0.46162665f , -0.10212867f , 0.08975709f , -1.02394462f , -0.74809217f , -1.54942429f , -0.89107299f , -1.00796068f , -0.70048058f , -0.53988647f , -0.51691598f , -0.45218167f , -0.00372395f , -0.01138951f , -0.04693869f , - 42.55582428f , 31.86493301f , 25.10536003f , 19.38906479f , 13.20624542f , 10.70058155f , 8.71647072f , 6.43070078f , 4.15740585f , 2.91404939f , 0.74730510f , -0.24514204f , -2.99233270f , -7.08516312f , -9.33087540f , -12.22711372f , -14.99213314f , -18.51732445f , -22.07689285f , -25.69321823f , -27.76980782f , -30.33328629f , -35.40525818f , -43.80059433f , - 17.17425156f , 15.04495525f , 13.74315548f , 9.50892258f , 6.63219738f , 3.98290706f , 2.99513650f , 0.72657228f , 0.40510508f , -0.37188929f , -0.42712122f , -0.44993770f , -0.85454285f , -2.16015244f , -2.33109641f , -3.77121162f , -4.37596750f , -5.36669207f , -5.62877464f , -7.46640444f , -6.83423185f , -7.70908165f , -7.39536428f , -11.27804089f , - 2.52714753f , 2.49289870f , -0.13784029f , -0.12163699f , 1.75517499f , 2.99553514f , 4.49444866f , 5.77764273f , 6.11328125f , 5.99628973f , 5.25506210f , 3.72307754f , 0.61337721f , -3.33252883f , -7.41996574f , -11.31843758f , -14.65295410f , -17.27932930f , -23.77917290f , -26.47192383f , -24.69055176f , -28.23755074f , -33.64114761f , -36.70846558f , - 0.26897269f , 0.29896018f , -0.59694219f , -0.58600718f , -0.59563857f , -0.14940611f , -0.22029303f , 0.11002608f , 0.09471268f , -0.08665721f , -0.04912328f , -0.19163008f , 0.17407294f , 0.29674888f , 0.32706621f , 0.06863109f , 0.22149041f , 0.41376126f , 0.17968638f , 0.12345629f , -1.91504288f , -1.83034718f , -1.79148746f , -2.04030466f , - 46.61645508f , 34.87612534f , 28.30528450f , 21.24158478f , 16.02840996f , 11.78007889f , 8.85846806f , 10.30448627f , 9.45803833f , 5.21806145f , 1.68192971f , -0.74372375f , -5.16118431f , -10.11946869f , -14.85457230f , -15.61676884f , -16.83375549f , -19.81565475f , -22.77931786f , -24.86022949f , -19.57012367f , -21.15659714f , -22.98768044f , -25.62114906f , - 33.50306320f , 20.94828606f , 11.29131508f , 3.76779723f , 1.88436973f , 2.24041677f , 3.07290483f , 3.88969660f , 4.82355642f , 4.29338741f , 2.81698418f , 1.50617039f , -0.22714122f , -2.44629383f , -5.18593407f , -7.46794319f , -9.20017433f , -10.38420296f , -11.62056923f , -13.33395100f , -12.78791428f , -12.68239403f , -12.26134491f , -11.07050896f , - 14.10636425f , 12.71654224f , 11.35340214f , 6.63278866f , 7.45038319f , 5.69565058f , 3.01491594f , 1.82628620f , 2.48782039f , 2.02510524f , 0.75415736f , -0.22476493f , -1.60228145f , -3.62377214f , -6.14920473f , -6.03494453f , -5.61935091f , -7.92571545f , -12.52105999f , -15.74191380f , -16.80817795f , -20.57492828f , -24.48945808f , -28.24258423f , - 0.19937749f , 0.12145615f , -0.77132010f , -0.71175891f , -0.93605912f , -0.31743777f , -0.29512858f , 0.09480342f , 0.14056028f , -0.12526789f , -0.09476471f , -0.30501965f , 0.25228870f , 0.52946067f , 0.56253082f , 0.14792542f , 0.34610838f , 0.49112254f , 0.26700655f , 0.18578406f , -0.02644314f , -0.05281431f , -0.03051598f , -0.05372978f , - 27.67247200f , 21.21397018f , 19.23110199f , 14.58107758f , 9.06582832f , 6.16479349f , 5.19902563f , 4.85638475f , 5.00597048f , 5.02013874f , 4.74315405f , 1.14152813f , -2.22816443f , -4.39935923f , -7.21801662f , -11.83607006f , -15.51521206f , -16.95382690f , -19.09778404f , -21.91887093f , -22.66965294f , -25.31122971f , -28.42613792f , -31.17256165f , - 11.87517643f , 8.35047531f , 6.28900909f , 4.94152260f , 3.84217644f , 2.98525238f , 2.59193397f , 1.77286649f , 1.13057005f , 0.57406390f , -0.14166087f , -0.61366737f , -1.26566494f , -1.89665902f , -2.40094352f , -3.00182557f , -3.57644248f , -4.17064571f , -4.82954073f , -6.52423048f , -6.40167952f , -7.34070396f , -8.16668510f , -8.83840561f , - 22.19146919f , 12.36240387f , 9.77023125f , 7.21114588f , 6.19833231f , 5.60523272f , 5.27842569f , 4.64398146f , 4.52219105f , 2.91414714f , 0.94011378f , 0.25184512f , -1.67108417f , -4.17819881f , -6.24735117f , -8.17109394f , -10.08654118f , -12.12491417f , -14.44429111f , -16.77396011f , -16.61188507f , -15.37945271f , -16.77342606f , -22.42259216f , - 24.26110077f , 14.98621845f , 11.37115288f , 7.53246927f , 5.87425423f , 4.31526375f , 3.63155198f , 2.21215534f , 1.20856023f , 0.27279723f , -0.83065307f , -1.13145101f , -1.61203635f , -2.64372611f , -3.19713020f , -3.79212451f , -4.30746126f , -5.19196177f , -6.05636358f , -7.64335585f , -7.13419104f , -7.34445190f , -7.59247351f , -8.24604034f , - 49.59980774f , 36.70146179f , 26.21045494f , 18.96593857f , 14.66215992f , 12.35246658f , 7.91571426f , 4.46859789f , 4.55067158f , 3.66973281f , -0.18894276f , -1.13036156f , -2.81119108f , -7.01159000f , -10.32988167f , -12.34438610f , -13.80298901f , -15.68917179f , -16.59648895f , -18.04370117f , -16.93032265f , -17.15782166f , -17.23012543f , -16.81400299f , - 26.24615288f , 16.32177734f , 12.63861752f , 8.90179348f , 7.98338699f , 5.88846350f , 5.62527227f , 3.35444164f , 2.27727008f , 0.38706595f , -1.15045261f , -1.47619927f , -2.39863658f , -3.88151002f , -5.00069237f , -5.60923672f , -5.99917269f , -7.16092062f , -7.55632973f , -8.88112926f , -7.98447180f , -7.57788992f , -7.00798178f , -6.71480894f , - 34.06352615f , 26.54057884f , 17.68980789f , 12.03931808f , 10.71124458f , 6.47080278f , 4.33683681f , 3.58446765f , 0.97453946f , 0.07721954f , -0.66921860f , -1.29634130f , -1.56973386f , -3.47828341f , -5.09566927f , -5.83764601f , -8.20822048f , -10.21011162f , -11.12835598f , -12.94603825f , -13.56561852f , -18.43250847f , -19.20955467f , -19.59786224f , - 0.95227748f , 0.58713847f , 0.31188840f , 0.27555063f , 0.34262455f , 0.30559424f , 0.15511483f , 0.24209952f , -0.01565590f , 0.27935538f , -0.07689041f , 0.16362046f , -0.12529252f , -0.41308093f , -0.45669210f , -0.33647329f , -0.06432384f , -0.04425672f , -0.05423176f , -0.09260799f , 1.18880558f , 1.71499527f , 1.66458070f , 1.84440422f , - 40.51910782f , 28.87430191f , 26.44847679f , 22.61171722f , 14.58166790f , 10.04493809f , 8.90122890f , 6.69188166f , 4.74618101f , 1.55060208f , 0.26953381f , -0.23009424f , -3.10289311f , -7.76883173f , -9.03342628f , -11.38734531f , -15.26344204f , -20.89108467f , -23.61590576f , -24.70707703f , -24.72460747f , -25.31776428f , -25.42388153f , -25.48863602f , - 21.86741066f , 19.33110237f , 16.09799957f , 12.12207603f , 7.65350389f , 5.31046820f , 4.50258398f , 3.46295428f , 1.98402655f , 0.36231637f , -0.75526041f , -2.47129464f , -1.34295225f , -2.90498233f , -4.77146578f , -5.83896399f , -5.19093323f , -5.94871426f , -6.67448521f , -9.30622387f , -10.69075203f , -13.05691051f , -14.45488358f , -18.82699394f , - 17.39302254f , 10.72895432f , 7.20909882f , 6.08006477f , 5.16837120f , 5.15259743f , 5.89495230f , 6.39498520f , 6.43017626f , 4.73164368f , 2.29907250f , 0.83655185f , -1.61507225f , -4.66745806f , -6.97347021f , -10.42446899f , -13.22788048f , -15.54260540f , -18.53327751f , -21.36825371f , -21.31904602f , -21.81181335f , -22.37908173f , -22.59859848f , - -0.01662111f , -0.25115231f , -0.21056390f , -0.29628995f , 0.14847504f , 0.01114315f , -0.00287740f , -0.02265828f , 0.20096491f , 0.01801417f , 0.01865144f , 0.08115936f , 0.06854093f , 0.03268814f , -0.06264148f , -0.19867666f , -0.29278329f , -0.48747075f , -0.51964116f , -0.52115518f , -0.62580901f , -0.67440128f , -0.64710861f , -0.70800090f , - 50.63159180f , 32.35544586f , 28.22938156f , 26.12494469f , 19.17036057f , 15.54605675f , 10.90270996f , 5.06216860f , 2.83115578f , 0.26169294f , -2.59751272f , -2.23182607f , -6.02089071f , -9.04337597f , -9.29519939f , -11.44281673f , -13.14252472f , -13.87999630f , -14.00658417f , -14.13973713f , -14.08796120f , -28.49422073f , -28.55380249f , -28.66899681f , - 32.93387222f , 21.26923561f , 12.45925331f , 7.33453608f , 4.77903414f , 2.72644329f , 2.77173924f , 3.24125862f , 4.11953831f , 3.23369288f , 1.40657330f , 0.18600486f , -0.99559313f , -2.52648664f , -4.61264372f , -6.59295559f , -7.73660517f , -8.74180222f , -9.62380314f , -10.94507694f , -10.15025043f , -10.08863640f , -9.69090939f , -8.64610767f , - 19.57560349f , 16.97666168f , 15.32033443f , 9.42695236f , 10.81062126f , 9.27347946f , 6.17076063f , 3.87660646f , 4.01463747f , 2.81778264f , -0.01208094f , -1.53821909f , -3.11120200f , -6.04038715f , -9.02472019f , -8.91995525f , -8.31732368f , -9.97514439f , -13.60401344f , -16.95523643f , -16.28038406f , -19.30029488f , -21.93006134f , -25.31139183f , - -0.42336991f , -0.69359350f , -0.79506743f , -0.19419681f , -0.43531519f , -0.60549897f , -0.57378924f , -0.71198583f , -0.67573565f , -0.92463225f , -0.75932795f , -0.88697869f , -0.09116954f , 0.78057998f , 1.43234348f , 2.25282049f , 1.19868934f , 0.34737879f , 0.56014186f , 0.85799438f , 3.28324819f , 3.73368144f , 2.45774937f , 1.97252631f , - 34.38531113f , 33.28102493f , 22.44291687f , 21.71539307f , 14.89051437f , 12.06779766f , 11.31605339f , 6.32059956f , 6.47309685f , 2.75739145f , -0.72276920f , -4.60511971f , -2.12165952f , -3.55129719f , -10.11487579f , -14.52775002f , -18.18198204f , -20.44789314f , -21.58519745f , -22.53190994f , -22.04618073f , -22.58295822f , -22.41326904f , -22.20569420f , - 28.00102234f , 14.65698147f , 10.06700230f , 6.12028360f , 4.52054358f , 2.66990614f , 2.51413369f , 1.24868000f , 1.04878569f , 0.22633910f , -1.12691772f , -1.15263200f , -0.74640560f , -1.10290110f , -2.06341290f , -2.48550367f , -3.55061507f , -4.52637577f , -6.00973654f , -8.38346672f , -7.37356853f , -8.63987446f , -9.06530762f , -8.95927715f , - 9.00067616f , 10.26587391f , 11.45584679f , 11.44188595f , 10.68400574f , 8.38729477f , 5.69343138f , 1.98902297f , 0.07958379f , -0.50896430f , -0.83697474f , -1.44278872f , -2.87292027f , -4.73982143f , -4.71389008f , -5.85515070f , -5.86282825f , -7.65532827f , -9.99789906f , -11.01864147f , -10.61325741f , -9.58348751f , -12.15856743f , -21.34374619f , - 21.37445641f , 22.85872078f , 20.62342262f , 13.71718597f , 8.38479900f , 4.66404533f , 2.74082160f , 0.35184097f , -0.49886125f , -0.66627383f , -0.80947453f , -1.35072243f , -1.72979438f , -2.81121135f , -2.55301118f , -3.12950158f , -2.59265637f , -3.53384900f , -4.62459230f , -8.21864986f , -9.64109135f , -9.61122894f , -11.18858528f , -17.21859741f , - 52.95914078f , 32.75603485f , 30.16634941f , 25.88944244f , 19.02377129f , 16.02350807f , 11.37754154f , 4.71347761f , 3.22399068f , 0.38588712f , -2.36943150f , -3.03161478f , -6.27093697f , -9.42517185f , -9.90064812f , -11.53384590f , -12.21652794f , -12.39763260f , -12.44114876f , -12.50287819f , -12.35077858f , -12.41636753f , -12.45803928f , -12.50715065f , - 28.04634666f , 16.86526871f , 13.82318878f , 9.40035915f , 8.49054623f , 4.69572687f , 4.31990623f , 2.24289536f , 1.52588129f , -0.15709598f , -1.59520829f , -0.06550518f , -1.94989491f , -3.66548038f , -4.27683449f , -4.56677961f , -4.99815702f , -5.49210978f , -5.61179161f , -6.72458935f , -5.75457907f , -5.41288614f , -5.03387022f , -3.80432510f , - 25.75157547f , 17.28746796f , 13.10127354f , 10.33002377f , 8.27671814f , 6.59895802f , 5.40835238f , 3.63577080f , 2.23206282f , 1.08383977f , -0.28453460f , -1.38477814f , -2.64369345f , -3.91356444f , -5.05506754f , -6.35320854f , -7.60085487f , -8.91501999f , -10.29950809f , -12.61900711f , -13.07838917f , -14.44057560f , -15.59240627f , -16.55293274f , - 24.60115242f , 11.35327435f , 6.30881643f , 4.50763512f , 0.50214702f , -0.71103203f , 2.54261613f , -0.67276359f , -1.09342635f , 1.93361044f , 1.37798584f , 1.15170944f , 1.77881491f , -0.16942300f , -3.11068201f , -2.93669724f , -0.59286201f , 1.04607284f , 4.16106987f , 6.48291349f , 11.32464409f , 15.29464436f , 15.33285236f , 7.41661787f , -}; -#endif const float cdk_37bits_1[3072] = { @@ -6936,11 +6801,7 @@ const float cdk_37bits_6[1536] = const float * const cdk_37bits[] = { cdk_37bits_1, cdk_37bits_2, cdk_37bits_3, cdk_37bits_4, cdk_37bits_5, cdk_37bits_6 }; -#ifdef ERI_FDCNGVQ_LOW_ROM const float * const cdk_37bits_ivas[] = { NULL, cdk_37bits_2, cdk_37bits_3, cdk_37bits_4, cdk_37bits_5, cdk_37bits_6 }; -#else -const float * const cdk_37bits_ivas[] = { cdk_37bits_1_ivas, cdk_37bits_2, cdk_37bits_3, cdk_37bits_4, cdk_37bits_5, cdk_37bits_6 }; -#endif @@ -15823,11 +15684,7 @@ const float finegain_4[16] = {-1.3234321f, -1.1164439f, -0.9153915f, -0.7248241f const float finegain_5[32] = {-1.3099370f, -1.1532731f, -0.9939113f, -0.8627403f, -0.7693628f, -0.6901322f, -0.6188556f, -0.5438313f, -0.4899869f, -0.4145289f, -0.3440915f, -0.2936875f, -0.2241453f, -0.1636186f, -0.1052746f, -0.0292431f, 0.0273763f, 0.0848355f, 0.1443042f, 0.2095194f, 0.2794882f, 0.3366661f, 0.4131591f, 0.4740591f, 0.5545165f, 0.6196313f, 0.6719442f, 0.7650533f, 0.9012053f, 1.0432675f, 1.2264170f, 1.5085750f}; const float * const finegain[5] = { finegain_1, finegain_2, finegain_3, finegain_4, finegain_5 }; -/* getk(16,8)+ maxqKIind=40 --> KMAX=127 needs support , 32bit- saturates at dim=6 - getK(21,9)+ maxqKInd=64 --> KMAX=512, needs support , 32bit saturates at dim=5 - getK(TBD,TBD)+ maxqKInd=TBD --> KMAX=1024, needs support , 32bit saturates at dim~=4 - getK(TBD,TBD)+ maxqKInd=TBD --> KMAX=32767, needs support, 32bit saturates at dim =3 -*/ + const uint8_t hBitsMinus1_N01[2] = {1, 7}; const uint8_t hBitsMinus1_N02[65]= @@ -22424,75 +22281,6 @@ const Word16 InvDiffTable[32] = /* Q20 */ 0x290F, 0x27A4, 0x264C, 0x2506, 0x23CF, 0x22A7, 0x218E, 0x2081 }; -const float sns_vq_cdk1[8*32] = { - -2.0529254143208289e+00f, -2.0105187772519200e+00f, -1.9181418840663027e+00f, -2.0529955931580051e+00f, -1.7965682581646625e+00f, -1.2350476819733338e+00f, -7.4106681145668685e-01f, -1.3500749433562539e-01f, - +6.8395648103934958e-01f, -5.6618076612019363e-01f, -1.1629656439143417e+00f, -1.6994296999691509e+00f, -1.7665333688662666e+00f, -1.4601240490692278e+00f, -1.0934184548732562e+00f, -5.8974136946769384e-01f, - -2.7268374190678193e+00f, -2.1818157040224055e+00f, -6.0427109270377999e-01f, +3.1651466770121833e-01f, +9.3430762386407940e-01f, +1.0478771837003078e+00f, +9.9559582196380947e-01f, +1.1082403839542609e+00f, - +2.4379206786519574e+00f, +1.9640422580297323e+00f, +9.2771600149270417e-01f, +9.4135273318020941e-03f, -6.4013168732630366e-01f, -1.0138049129223088e+00f, -1.0924849368417169e+00f, -9.1129148479978594e-01f, - +8.1762121316616565e-01f, -1.9433974959365836e-02f, -4.0054937117179751e-01f, -3.9231079150228149e-01f, -2.9970406532808125e-01f, -6.2996056616087495e-02f, +3.7544100964377108e-01f, +6.3685372354777436e-01f, - +1.4734834246724329e+00f, +2.3539621556904251e+00f, +9.7194661426112050e-01f, -5.4110096556162990e-01f, -9.8129311847374545e-01f, -6.1342289097457547e-01f, +3.7249272152905366e-01f, +8.1252213656497096e-01f, - -1.2496145961286331e+00f, -3.2376394756447752e-01f, +5.1439178441534027e-02f, +1.0005059991983459e-01f, +2.3749822119608346e-01f, +4.0542724931792579e-01f, +5.1033138353497232e-01f, +5.5694404671095077e-01f, - +7.7965743766052975e-01f, +2.1917885215778097e+00f, +1.7164750043876311e+00f, +5.7945306635665195e-01f, -1.0190291924038120e-01f, -4.0418854005812310e-01f, -4.7849155803986132e-01f, -3.4725769238259874e-01f, - +6.8865034807898129e-01f, +5.7566331510263680e-01f, -7.7725260497355977e-03f, -5.3794851427474544e-01f, -7.6313855691212973e-01f, -7.8413803908382473e-01f, -7.0161107722315574e-01f, -4.8903452069978415e-01f, - +1.6928828230225725e+00f, +9.3495589460148931e-01f, +3.5426821621575499e-01f, +3.9507891687964890e-02f, -7.9631988607824541e-02f, -1.6624589421972935e-01f, -1.6180598135213178e-01f, -1.2860376999895359e-01f, - -1.6962541680165768e+00f, +4.3456061122651995e-01f, +1.0710566866483171e+00f, +1.3249974344239270e+00f, +1.0825630027900910e+00f, +9.0621333090389167e-01f, +6.5428541538000140e-01f, +6.7283424156333382e-01f, - +4.5763916137396308e+00f, +4.0870427709381518e+00f, +2.6750799962096261e+00f, +1.4487891616901025e+00f, +2.4432209950451603e-01f, -5.4383244175422862e-01f, -9.4142251186129933e-01f, -1.0862058366913647e+00f, - +1.1883989487611160e+00f, +1.1685324900978113e+00f, +9.3045980943772877e-01f, +8.3738457417173884e-01f, +6.3496480700237246e-01f, +4.6405143429051326e-01f, +3.1705534227338888e-01f, +2.0799507760170197e-01f, - +2.8980578835865609e+00f, +3.0880495072396617e+00f, +1.8680019598806248e+00f, +7.0446466488259230e-01f, +1.0107302845552169e-01f, -2.8986489567349910e-01f, -4.1462748482286188e-01f, -3.6206036514823836e-01f, - -1.7524799389036466e-01f, +1.1936698995397648e+00f, +1.6088971749375909e+00f, +1.7111901074418125e+00f, +1.4837525009734551e+00f, +5.2536808756057463e-01f, -3.1226889149907566e-01f, -3.5746958704581933e-01f, - +9.0352696786286879e-01f, +2.4731406386331605e+00f, +2.9079925242729416e+00f, +2.7918041274045429e+00f, +2.2373843929092465e+00f, +8.5208847870338755e-01f, -7.6200320575426320e-02f, -2.5316053664429367e-01f, - -1.1865763437968528e+00f, -7.4234595628060440e-01f, -6.0141100860138463e-01f, -8.5065089175547848e-01f, -8.8329724313055402e-01f, -6.5351381126344021e-01f, -5.0230651881879618e-01f, -2.3359707426927168e-01f, - +2.7673589888377261e+00f, +6.6328569264593351e-01f, -4.1472488624881343e-01f, -9.3187436659797018e-01f, -1.0754140202622839e+00f, -1.0146723389090857e+00f, -8.7888946611264573e-01f, -6.0836606213569688e-01f, - -1.8124429341308173e+00f, -9.7828066142280434e-01f, +6.5968430845517978e-01f, +2.1854499449267628e+00f, +2.2517483941731826e+00f, +2.3821501109065295e+00f, +1.9235238012956650e+00f, +1.5065083288921912e+00f, - +4.9050283992558246e+00f, +2.4264119698434983e+00f, +8.3367299614637902e-01f, -4.3119484392510427e-02f, -5.8100382033177300e-01f, -7.7353747986816990e-01f, -8.7895223350767071e-01f, -8.6819816920933113e-01f, - +6.5228388674538984e-01f, +1.1174683594915380e-01f, +1.2383281142011383e-01f, +6.0151217547540869e-01f, +9.5444246174773772e-01f, +1.2805750123888453e+00f, +9.2140926443564275e-01f, +5.7786881373204924e-01f, - +1.9490989723028713e+00f, +2.8004262751807882e+00f, +1.9081816065970161e+00f, +3.7248785750983177e-01f, +1.3095620385608037e-01f, +7.9016424306166244e-01f, +1.1640502521465221e+00f, +1.0066783002173452e+00f, - -1.0171864644867654e-01f, +1.7954757784640871e+00f, +1.8915637038163424e+00f, +1.0909542570620605e+00f, +6.1888445783828194e-01f, +7.6574083569028828e-01f, +8.9561325653114987e-01f, +8.0797624213033170e-01f, - +1.9350543800926379e+00f, +3.2339385307849722e+00f, +3.0806729276317419e+00f, +2.1684844197871249e+00f, +7.8035951982399498e-01f, -6.7854327548476567e-01f, -9.6732224945258960e-01f, -5.8068474286758409e-01f, - -1.5383985945543574e-01f, +7.1583722374971992e-01f, +5.8674384505519706e-01f, +3.7092544478085621e-01f, +1.0970155384441491e-01f, -2.3854313229153577e-02f, -5.3508967318497622e-02f, +3.3979575877473786e-02f, - +2.7095625819635165e+00f, +1.7832208238203791e+00f, +9.6783753432609421e-01f, +5.8919108500645523e-01f, +4.1191953120474317e-01f, +1.9592175852184501e-01f, -1.0134844291353281e-02f, -1.6725603195278577e-01f, - -2.6560188981865329e-01f, +1.4059113655935889e+00f, +1.9844196049902063e+00f, +2.4291429998935334e+00f, +2.2837873843112892e+00f, +1.8570922995202830e+00f, +1.2056879204230433e+00f, +8.4717915626409468e-01f, - +3.1939221203717074e+00f, +3.7963726820313615e+00f, +3.2748823221663406e+00f, +2.4724357608035472e+00f, +1.6860933687497499e+00f, +6.4628696101838046e-01f, -7.8170867286998971e-02f, -6.1406792037327973e-01f, - +1.6686627356973500e+00f, +2.4375118241337517e+00f, +2.2118134266295129e+00f, +1.4754862720822910e+00f, +1.0100987843177478e+00f, +4.8216927165041135e-01f, +5.0597779432044222e-02f, -7.2090396257990311e-02f, - +3.4953550651375287e+00f, +3.2379627985821369e+00f, +2.1155532232841976e+00f, +1.3293556793682053e+00f, +1.0159800928862721e+00f, +6.8710150035919371e-01f, +5.0950588745743997e-01f, +2.0092204555514792e-01f, - +1.6537233329850265e+00f, +1.8429927128987775e+00f, +1.5795688890212489e+00f, +1.5313117335176101e+00f, +1.4688051742099697e+00f, +1.3047757088193301e+00f, +9.3703047481911916e-01f, +6.6034404507297240e-01f, - +1.9642176175501569e+00f, +2.9388625018759811e+00f, +2.9051270203314714e+00f, +2.2145871562616142e+00f, +1.8151504726187455e+00f, +1.4766756664819134e+00f, +1.0710276243190799e+00f, +6.1861320930710639e-01f -}; - -const float sns_vq_cdk2[8*32] = { - -5.9829995937529679e-01f, -1.6330921039310822e+00f, -2.2069628561771211e+00f, -2.3101968732645872e+00f, -2.2987624447001700e+00f, -2.2585659584659474e+00f, -2.2426863949716420e+00f, -2.2717425510152180e+00f, - -1.4313340820994043e+00f, -1.7500847356351696e+00f, -1.7795938232358199e+00f, -1.7213803415353539e+00f, -1.6610776464291162e+00f, -1.6069804294990451e+00f, -1.5625217472935489e+00f, -1.5641247494491251e+00f, - -4.2712987825717169e-01f, -8.1657540705874065e-01f, -1.1438786300941690e+00f, -1.5047514473946468e+00f, -1.8039927073343207e+00f, -1.9709309014182719e+00f, -2.0721822202754367e+00f, -2.2015067008471854e+00f, - -8.8390021618372749e-01f, -9.1027146153915306e-01f, -8.4148501893353445e-01f, -7.0803242455046478e-01f, -4.0873435152568971e-01f, -5.8364530253510127e-02f, +1.5450950372912373e-01f, +2.3879767518520115e-01f, - +2.2959495262308716e-01f, -4.5380527270641730e-01f, -1.2610303555144773e+00f, -1.9593984147017431e+00f, -2.5055916891711632e+00f, -2.7888667896972388e+00f, -2.9113125863020777e+00f, -2.9748256948291001e+00f, - -1.1488842521346578e+00f, -1.3517692148186562e+00f, -1.3594824205078988e+00f, -1.2204819600745185e+00f, -9.1363085887906581e-01f, -6.8205390481915806e-01f, -5.8474638022763137e-01f, -6.3572794299637214e-01f, - -7.7093095554781843e-01f, -9.4474580908674310e-01f, -9.4836193194533303e-01f, -9.4516185118638463e-01f, -1.0483710354237581e+00f, -1.1355351751536940e+00f, -1.2428754319298756e+00f, -1.3831917119547590e+00f, - -9.3476137541952931e-01f, -7.0790164340965811e-01f, -3.3885900459516044e-01f, +8.2267549037198462e-02f, +4.8079994558165973e-01f, +8.0682939355530092e-01f, +1.0305358697421620e+00f, +1.0235050392855534e+00f, - +1.0095585388252226e+00f, -1.5967777106488176e-01f, -2.2123760679560007e+00f, -2.4162196770688293e+00f, -2.1066059048135193e+00f, -1.8818990363917070e+00f, -1.9958495939733885e+00f, -2.3481921543456847e+00f, - +9.2392277358713179e-02f, -1.8364442239470730e-01f, -5.9563356599054251e-01f, -1.0147004796192145e+00f, -1.3476180323301636e+00f, -1.5136187252106814e+00f, -1.5799100551406959e+00f, -1.7192022915180234e+00f, - -1.4222957040291027e-02f, -1.7371797028437352e-01f, -3.0805783645739226e-01f, -4.0484411256102021e-01f, -6.6432144720337050e-01f, -1.0344124279519349e+00f, -1.6814321622332238e+00f, -2.5032237993558693e+00f, - +6.8743182828212471e-02f, +3.3095426522069737e-01f, +5.0002819580392865e-01f, +5.6165737804402860e-01f, +5.0172311732338448e-01f, +3.6961533646464034e-01f, +8.5026798082935839e-02f, -3.9473330479310409e-01f, - +1.0356440140522545e+00f, +7.8065342952998484e-01f, +6.7193695552111687e-02f, -9.5261546302001587e-01f, -2.0142463788396388e+00f, -2.7767542927506610e+00f, -3.1928041080758338e+00f, -3.4042594311363201e+00f, - -6.6289350610256359e-01f, -6.3896764348680091e-01f, -5.1207254963552118e-01f, -3.6335660396488040e-01f, -2.8247932520862895e-01f, -3.1477486911353381e-01f, -4.4809778805307687e-01f, -6.9186118822875298e-01f, - +7.9969719144308171e-02f, +2.1588869900646174e-01f, +3.0323707912603959e-01f, +2.6884673422742911e-01f, +5.9642290590166340e-02f, -2.8613663980468629e-01f, -7.9406912376026706e-01f, -1.4470063450324298e+00f, - -2.0240948732059452e-01f, +2.3334712655850515e-01f, +5.7657451283939798e-01f, +7.9742677228839842e-01f, +9.3220814515190065e-01f, +1.0323450144255806e+00f, +1.0118085786908606e+00f, +7.9014188629614879e-01f, - -7.1530830084194669e-02f, -1.2396351139455990e+00f, -2.0842499795217195e+00f, -1.3035503744881123e+00f, -8.3471992091295932e-01f, -1.1295869482135590e+00f, -1.7132725973269993e+00f, -2.1802158117711343e+00f, - -1.7835942638423960e-01f, -7.1247931965515532e-01f, -1.5124017210947220e+00f, -1.9967695368388680e+00f, -1.8783401399959028e+00f, -1.4021324347049549e+00f, -1.0637376079630234e+00f, -1.1080152582418752e+00f, - +1.0480932547841233e+00f, +2.7493060468886921e-01f, -1.1919132498368252e+00f, -1.2523434724836580e+00f, -7.8936067946054767e-01f, -8.2091162445205956e-01f, -1.3128033132740213e+00f, -1.9655091841161074e+00f, - -3.3232308742031469e-01f, -2.2713591199678415e-01f, -1.4351679017954885e-01f, -1.9801985565791998e-02f, +1.0057467598256911e-01f, +2.2696827939185557e-01f, +3.0695375436198624e-01f, +2.2875897090753330e-01f, - +3.4676185796153502e-01f, -1.0768837168056489e-01f, -6.9753922421077807e-01f, -1.0937050061788010e+00f, -1.5428629138891437e+00f, -2.0449896355500123e+00f, -2.4848880613940572e+00f, -2.8583647439574880e+00f, - -1.2173513563721174e-02f, -3.2908222329502096e-01f, -7.4562386900667521e-01f, -1.0159346083066496e+00f, -9.9134754982937601e-01f, -8.0708475073517449e-01f, -5.9033001697337439e-01f, -5.3497643414524321e-01f, - -1.0362333131951586e-01f, -2.6988877087476748e-01f, -3.8890071054155473e-01f, -4.9037107401879965e-01f, -5.6504591412573135e-01f, -7.3336953439609320e-01f, -9.9258959592254403e-01f, -1.3661070412637724e+00f, - -7.9157092539986307e-01f, -3.3641122720876027e-01f, +2.9168895215304702e-01f, +1.0181013149521261e+00f, +1.5982627043961528e+00f, +1.9868228787387316e+00f, +2.1282934389276504e+00f, +1.9646952813708398e+00f, - +8.5453347281306224e-01f, +8.1178943134578940e-01f, -4.8818346255935796e-01f, -2.1067304958054955e+00f, -2.5063149014598722e+00f, -2.0640557329267200e+00f, -1.6543474135830516e+00f, -1.7651753795641250e+00f, - +6.2358146522917657e-01f, +5.4834889364422190e-01f, +1.7179524311839983e-01f, -3.5307730840525375e-01f, -7.7064726884538126e-01f, -1.0122724639555478e+00f, -1.1610381095678584e+00f, -1.4059777048358271e+00f, - +7.4374029892860283e-01f, +9.2218263151186131e-01f, +7.8921361199673412e-01f, +5.4697537641890215e-01f, +3.4695498575470718e-02f, -6.0728616781597766e-01f, -1.5817464846714542e+00f, -2.9492076413515940e+00f, - +1.0792513778563164e+00f, +1.4361817236342909e+00f, +1.4897259644477068e+00f, +1.4980968655148907e+00f, +1.3061906859741226e+00f, +9.2722643966101292e-01f, +4.6901200392574449e-01f, -8.4108696494310742e-02f, - +8.5358364275519205e-01f, +6.0645747733831856e-01f, +2.0465300574744516e-01f, -3.7181339249044437e-01f, -1.0727735914037746e+00f, -1.6784774674483536e+00f, -2.1020318554063260e+00f, -2.5024013237162377e+00f, - +1.2794365477031622e-01f, +1.2747703630869173e-01f, -4.1758739312140455e-02f, -2.4311752788462185e-01f, -3.1778646043737568e-01f, -2.8915217065224763e-01f, -2.9094454849599488e-01f, -4.4820832489443191e-01f, - +1.2951853228518271e+00f, +9.5620359941142952e-01f, +5.3144852217798388e-01f, +2.1179514725221937e-01f, -6.5987484250824083e-02f, -3.2087563737255587e-01f, -5.4468525409236357e-01f, -8.8065574221328113e-01f, - -1.0568174530545921e-02f, +8.7151888563731761e-01f, +1.5660992592896033e+00f, +1.9198797896705255e+00f, +2.0755726094083351e+00f, +2.1798356493630360e+00f, +2.0711596722334082e+00f, +1.7022476043512389e+00f -}; const float tcx_mdct_window_48[420] = { diff --git a/lib_com/rom_com.h b/lib_com/rom_com.h index 477431c4d0..e6284ab417 100644 --- a/lib_com/rom_com.h +++ b/lib_com/rom_com.h @@ -1141,7 +1141,6 @@ extern const float olapWinSyn320[320]; extern const float *const cdk_37bits_ivas_orig[]; #endif -#ifdef ERI_FDCNGVQ_LOW_ROM extern const Word8 cdk1_ivas_dct_s0_W8[]; extern const Word8 cdk1_ivas_dct_s1_W8[]; extern const Word8 cdk1_ivas_dct_s2_W8[]; @@ -1173,7 +1172,6 @@ extern const Word16 cdk1_ivas_cum_entries_per_segment[]; /* circular mse ordered list fwd/rev directions for candidate evaluations */ extern const Word8 cdk1_ivas_segm_neighbour_fwd[]; extern const Word8 cdk1_ivas_segm_neighbour_rev[]; -#endif extern const float cdk_37bits_1[]; @@ -1343,9 +1341,6 @@ extern const Word16 invTable[INV_TABLE_SIZE + 1]; extern const Word16 sqrtTable[SQRT_TABLE_SIZE + 1]; extern const Word16 invSqrtTable[SQRT_TABLE_SIZE + 1]; -extern const float sns_vq_cdk1[8 * 32]; -extern const float sns_vq_cdk2[8 * 32]; - extern const float tcx_mdct_window_48[420]; extern const float tcx_mdct_window_half_48[180]; extern const float tcx_mdct_window_trans_48[60]; diff --git a/lib_com/stl.h b/lib_com/stl.h index 234aec9e16..c9ca422806 100644 --- a/lib_com/stl.h +++ b/lib_com/stl.h @@ -57,7 +57,7 @@ #ifndef _STL_H #define _STL_H -#include "options.h" /* TODO: TEMPORARY during BASOP development - to be removed */ +#include "options.h" /* note: needed until BASOP_NOGLOB is accepted */ #include "typedef.h" #include "basop32.h" #include "move.h" diff --git a/lib_com/tools.c b/lib_com/tools.c index db7c5a3f8e..ab688adbb9 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -210,7 +210,11 @@ float sum2_f( void set_c( int8_t y[], /* i/o: Vector to set */ const int8_t a, /* i : Value to set the vector to */ +#ifdef JBM_TSM_ON_TCS + const int32_t N /* i : Length of the vector */ +#else const int16_t N /* i : Length of the vector */ +#endif ) { int16_t i; @@ -387,7 +391,11 @@ uint32_t mvr2s( return 0; } +#ifdef JBM_TSM_ON_TCS + if ( (void *) y <= (const void *) x ) +#else if ( (void *) y < (const void *) x ) +#endif { for ( i = 0; i < n; i++ ) { @@ -553,6 +561,7 @@ int16_t maximum_s( { if ( vec[i] > tmp ) { + ind = i; tmp = vec[i]; } } diff --git a/lib_debug/debug.c b/lib_debug/debug.c index 85e48e8bae..ce10231876 100644 --- a/lib_debug/debug.c +++ b/lib_debug/debug.c @@ -201,6 +201,7 @@ int16_t dbgwrite( return 0; } + /*-------------------------------------------------------------------* * dbgwrite_mat_repeat() * diff --git a/lib_debug/sba_debug.c b/lib_debug/sba_debug.c index 040cadf887..73bb630b5f 100644 --- a/lib_debug/sba_debug.c +++ b/lib_debug/sba_debug.c @@ -51,11 +51,11 @@ #define MAX_IN_FILE_LEN ( 1000 ) #define MAX_PLUG_IN_FILE_LEN ( MAX_IN_FILE_LEN ) #define MAX_DEBUG_TAG_LEN ( 50 ) -#define NUM_DEBUG_FILES ( 4 ) +#define NUM_DEBUG_FILES ( 5 ) #define MAX_TAG_LEN ( 200 ) WAVEFILEOUT *spar_foa_enc_wav[3]; -WAVEFILEOUT *spar_foa_dec_wav[4]; +WAVEFILEOUT *spar_foa_dec_wav[NUM_DEBUG_FILES]; float max_diff = 0; int32_t dbg_frm_num; int32_t dbg_band; @@ -202,6 +202,7 @@ void ivas_spar_dump_signal_wav( { for ( i = 0; i < no_channel; i++, k++ ) { +#if 0 if ( ppPcm ) { tmp_value = roundf( ppPcm[i][j] * PCM16_TO_FLT_FAC ); @@ -210,6 +211,16 @@ void ivas_spar_dump_signal_wav( { tmp_value = roundf( pcm_array[i][j] * PCM16_TO_FLT_FAC ); } +#else + if ( ppPcm ) + { + tmp_value = roundf( ppPcm[i][j] ); + } + else + { + tmp_value = roundf( pcm_array[i][j] ); + } +#endif if ( tmp_value > MAX16B_FLT ) { largest_value = (float) fabs( tmp_value ) > largest_value ? (float) fabs( tmp_value ) : largest_value; @@ -272,6 +283,12 @@ void ivas_close_sba_decoder_debug_files( CloseWav( spar_foa_dec_wav[3] ); } + if ( spar_foa_dec_wav[4] != NULL ) + { + UpdateWave( fs, n_ch, 16, spar_foa_dec_wav[4] ); + CloseWav( spar_foa_dec_wav[4] ); + } + return; } @@ -315,7 +332,7 @@ void ivas_open_sba_decoder_debug_files( const int16_t n_ch, const int16_t n_transport ) { - int8_t fb_wav_dump_path[4][MAX_PLUG_IN_FILE_LEN] = { "", "", "", "" }; + int8_t fb_wav_dump_path[NUM_DEBUG_FILES][MAX_PLUG_IN_FILE_LEN] = { "", "", "", "", "" }; cstrcat( (char *) fb_wav_dump_path[0], sizeof( fb_wav_dump_path[0] ), "dec_out.wav" ); spar_foa_dec_wav[0] = CreateWav( (const char *) fb_wav_dump_path[0], fs, n_ch, 32 /* const uint32_t writeWaveExt */ ); @@ -329,6 +346,9 @@ void ivas_open_sba_decoder_debug_files( cstrcat( (char *) fb_wav_dump_path[3], sizeof( fb_wav_dump_path[3] ), "cldfbSynthesis.wav" ); spar_foa_dec_wav[3] = CreateWav( (const char *) fb_wav_dump_path[3], fs, n_transport, 16 /* const uint32_t writeWaveExt */ ); + cstrcat( (char *) fb_wav_dump_path[4], sizeof( fb_wav_dump_path[4] ), "cldfbAnalysis.wav" ); + spar_foa_dec_wav[4] = CreateWav( (const char *) fb_wav_dump_path[4], fs, n_transport, 16 /* const uint32_t writeWaveExt */ ); + return; } diff --git a/lib_debug/sba_debug.h b/lib_debug/sba_debug.h index cd4fd58c11..a314d1568c 100644 --- a/lib_debug/sba_debug.h +++ b/lib_debug/sba_debug.h @@ -41,9 +41,10 @@ #include "ivas_cnst.h" #include "tinywaveout_c.h" + #ifdef DEBUG_SBA_AUDIO_DUMP extern WAVEFILEOUT *spar_foa_enc_wav[3]; -extern WAVEFILEOUT *spar_foa_dec_wav[4]; +extern WAVEFILEOUT *spar_foa_dec_wav[5]; #endif #ifdef DEBUG_AGC diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index c89c5f53b0..eb2e84f598 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -45,9 +45,7 @@ #include "prot.h" #include "ivas_cnst.h" #include "ivas_prot.h" -#ifdef LSF_RE_USE_SECONDARY_CHANNEL #include "ivas_rom_com.h" -#endif #include "wmc_auto.h" /*-------------------------------------------------------------------* @@ -77,10 +75,8 @@ ivas_error acelp_core_dec( const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT , const int16_t read_sid_info /* i : read SID info flag */ -#endif ) { float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */ @@ -516,11 +512,7 @@ ivas_error acelp_core_dec( } else { -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT ) -#else - if ( st->core_brate == SID_2k40 && st->element_mode != IVAS_CPE_MDCT && st->read_sid_info ) -#endif { FdCng_decodeSID( st ); *sid_bw = 0; @@ -537,12 +529,7 @@ ivas_error acelp_core_dec( ApplyFdCng( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); } -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( !read_sid_info ) -#else - if ( !st->read_sid_info ) - // if (!st->read_sid_info && st->cng_ism_flag) /* read_sid_info can only be 0 in ParamISM mode */ -#endif { float noise_lvl_highest; @@ -627,19 +614,11 @@ ivas_error acelp_core_dec( nb_bits = -1; } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr_tmp, 1, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif - if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME ) /* ISfm: why is this called again after above */ + if ( st->coder_type == TRANSITION && tc_subfr < L_SUBFR && st->L_frame == L_FRAME ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, tc_subfr, 2, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif } } @@ -671,17 +650,12 @@ ivas_error acelp_core_dec( if ( !tdm_lp_reuse_flag ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode, tdm_lsfQ_PCh ); -#else - lsf_dec( st, tc_subfr, Aq, &LSF_Q_prediction, lsf_new, lsp_new, lsp_mid, tdm_low_rate_mode ); -#endif } else { const float *pt_interp_2; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE if ( st->active_cnt != 1 ) { int16_t beta_index; @@ -694,10 +668,6 @@ ivas_error acelp_core_dec( mvr2r( tdm_lspQ_PCh, lsp_new, M ); mvr2r( tdm_lsfQ_PCh, lsf_new, M ); } -#else - mvr2r( tdm_lspQ_PCh, lsp_new, M ); - mvr2r( tdm_lsfQ_PCh, lsf_new, M ); -#endif if ( st->rate_switching_reset ) { @@ -1109,7 +1079,7 @@ ivas_error acelp_core_dec( * Formant post-filter *-----------------------------------------------------------------*/ - if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) /* VE2TV: TBV for TD stereo */ + if ( st->hPFstat != NULL && st->last_bwidth >= WB && ( st->core_brate > ACELP_24k40 || st->element_mode > EVS_MONO ) && st->core_brate <= ACELP_32k ) { mvr2r( syn, temp_buf + L_SYN_MEM, L_FRAME16k ); diff --git a/lib_dec/acelp_core_switch_dec.c b/lib_dec/acelp_core_switch_dec.c index 4a49d6b2db..51d459b205 100644 --- a/lib_dec/acelp_core_switch_dec.c +++ b/lib_dec/acelp_core_switch_dec.c @@ -158,11 +158,7 @@ ivas_error acelp_core_switch_dec( * Excitation decoding *----------------------------------------------------------------*/ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( DEC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st->element_mode, &i /*dummy*/, 0, 0, st->idchan, st->active_cnt, 0, 0, 0 /*st->GSC_IVAS_mode*/ ); -#else - config_acelp1( DEC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), st->next_bit_pos, GENERIC, -1, -1, &decode_bwe /* dummy */, &i, st->element_mode, &i /*dummy*/, 0, 0, st->idchan, 0, 0, 0 /*st->GSC_IVAS_mode*/ ); -#endif decod_gen_voic_core_switch( st, L_frame_for_cs, 0, Aq, exc, cbrate ); diff --git a/lib_dec/cng_dec.c b/lib_dec/cng_dec.c index 6d02f18309..64403736c4 100644 --- a/lib_dec/cng_dec.c +++ b/lib_dec/cng_dec.c @@ -109,13 +109,8 @@ void CNG_dec( } else { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_dec( st, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0, NULL ); } -#else - lsf_dec( st, 0, Aq, &LSF_Q_prediction, lsf_new, lsp_new, 0, 0 ); - } -#endif } else { diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index 9ae8550e40..e70b1d59d7 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -374,7 +374,7 @@ ivas_error core_switching_pre_dec( st->gc_threshold = 0.0f; set_f( st->dispMem, 0, 8 ); - st->last_coder_type = GENERIC; /* fcs : this might be superfluous */ + st->last_coder_type = GENERIC; fer_energy( output_frame, UNVOICED_CLAS, st->previoussynth, -1, &st->enr_old, 1 ); st->lp_gainp = 0.0f; diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c index 9896d1d8c0..8a574c95f6 100644 --- a/lib_dec/dec_tcx.c +++ b/lib_dec/dec_tcx.c @@ -1507,7 +1507,7 @@ void decoder_tcx_tns( if ( ( L_frame == st->L_frame >> 1 ) && st->tcxonly && isTCX5 ) { - if ( st->element_mode == EVS_MONO || L_spec < L_frameTCX ) /* TBC: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ + if ( st->element_mode == EVS_MONO || L_spec < L_frameTCX ) /* todo: this is temporary to maintain EVS BE, this is a bug and should be fixed also for EVS (see issue 13) */ { tcx5TnsUngrouping( L_frameTCX >> 1, hTcxCfg->tnsConfig[0][0].iFilterBorders[0] >> 1, x, DEC ); } @@ -1742,7 +1742,7 @@ void decoder_tcx_imdct( if ( st->element_mode > EVS_MONO ) { - st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; /* TBV - or maybe used min(L_frame_TCX,L_FRAME48k) ... */ + st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; /* TODO - or maybe used min(L_frame_TCX,L_FRAME48k) ... */ } else { diff --git a/lib_dec/dlpc_stoch.c b/lib_dec/dlpc_stoch.c index 9a86d06224..22a1cda26c 100644 --- a/lib_dec/dlpc_stoch.c +++ b/lib_dec/dlpc_stoch.c @@ -81,31 +81,17 @@ void lpc_unquantize( { if ( st->sr_core == INT_FS_16k && coder_type == UNVOICED ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_end_dec( st, GENERIC, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); -#else - lsf_end_dec( st, GENERIC, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices ); -#endif } else { if ( st->core == TCX_20_CORE ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_end_dec( st, AUDIO, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); -#else - lsf_end_dec( st, AUDIO, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices ); -#endif } else { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_end_dec( st, coder_type, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices, NULL ); -#else - lsf_end_dec( st, coder_type, 1 - st->narrowBand /* st->bwidth */, ENDLSF_NBITS, &lsf[M], param_lpc, LSF_Q_prediction, &nb_indices - - ); -#endif } } diff --git a/lib_dec/er_dec_tcx.c b/lib_dec/er_dec_tcx.c index 1ce3bf2035..fb797f92c9 100644 --- a/lib_dec/er_dec_tcx.c +++ b/lib_dec/er_dec_tcx.c @@ -551,20 +551,39 @@ void con_tcx( mvr2r( synth - M, buf, M ); mvr2r( buf, mem_syn, M ); - if ( A_cng != NULL ) { +#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY + float alpha_delayed; + + alpha_delayed = 1.0f; + if ( st->nbLostCmpt > MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE ) + { + alpha_delayed = Damping_fact( st->core_ext_mode, st->nbLostCmpt - MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE, st->last_good, st->stab_fac, &( st->lp_gainp ), ACELP_CORE ); + } + + if ( st->plcBackgroundNoiseUpdated && alpha_delayed != 1.0f ) +#else if ( st->plcBackgroundNoiseUpdated && alpha != 1.0f ) +#endif { float lsp_local[M], lsp_fade[M], alpha_inv; +#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY + alpha_inv = 1.0f - alpha_delayed; +#else alpha_inv = 1.0f - alpha; +#endif a2lsp_stab( A_local, lsp_local, lsp_local ); for ( i = 0; i < M; i++ ) { +#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY + lsp_fade[i] = alpha_delayed * lsp_local[i] + alpha_inv * st->lspold_cng[i]; +#else lsp_fade[i] = alpha * lsp_local[i] + alpha_inv * st->lspold_cng[i]; +#endif } lsp2a_stab( lsp_fade, A_local, M ); diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 8ea2d71159..fcc1a5ec52 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -261,11 +261,7 @@ ivas_error evs_dec( if ( st->core == ACELP_CORE ) { /* ACELP core decoder */ -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL, 1 ) ) != IVAS_ERR_OK ) -#else - if ( ( error = acelp_core_dec( st, NULL, synth, NULL, bwe_exc_extended, voice_factors, old_syn_12k8_16k, sharpFlag, pitch_buf, &unbits, &sid_bw, NULL, NULL, NULL, 0, EVS_MONO, 0, 0, 1, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index cae9b6945f..db8b6a659f 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -158,8 +158,8 @@ void initFdCngDec( hFdCngDec->cna_ILD_LT = 0.0f; hFdCngDec->first_cna_noise_updated = 0; hFdCngDec->first_cna_noise_update_cnt = 0; - hFdCngDec->cna_nbands = 6; - mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, MAX_CNA_NBANDS + 1 ); + hFdCngDec->cna_nbands = CNA_INIT_NBANDS; + mvs2s( cna_init_bands, hFdCngDec->cna_band_limits, CNA_INIT_NBANDS + 1 ); hFdCngDec->cna_act_fact = 1.0f; hFdCngDec->cna_rescale_fact = 0.0f; hFdCngDec->cna_seed = 5687; @@ -966,19 +966,12 @@ void FdCng_decodeSID( float v[32]; int16_t indices[32]; HANDLE_FD_CNG_COM hFdCngCom; -#ifdef ERI_FDCNGVQ_LOW_ROM float *invTrfMatrix; float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; -#endif -#ifndef ERI_FDCNGVQ_LOW_ROM - const float *const *codebooks = ( st->element_mode == EVS_MONO ) ? cdk_37bits : cdk_37bits_ivas; -#endif const float gain_q_offset = ( st->element_mode == EVS_MONO ) ? GAIN_Q_OFFSET_EVS : GAIN_Q_OFFSET_IVAS; -#ifdef ERI_FDCNGVQ_LOW_ROM invTrfMatrix = (float *) tmpRAM; -#endif hFdCngCom = ( st->hFdCngDec )->hFdCngCom; @@ -998,7 +991,6 @@ void FdCng_decodeSID( /* MSVQ decoder */ -#ifdef ERI_FDCNGVQ_LOW_ROM if ( st->element_mode != EVS_MONO ) { create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); @@ -1009,9 +1001,6 @@ void FdCng_decodeSID( msvq_dec( cdk_37bits, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v, NULL ); } -#else - msvq_dec( codebooks, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, v, NULL ); -#endif /* Decode gain */ gain = ( (float) index - gain_q_offset ) / 1.5f; @@ -1805,6 +1794,161 @@ void generate_stereo_masking_noise( } +#ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------- + * generate_masking_noise_hf_cldfb() + * + * Generate additional comfort noise (kind of noise filling) + *-------------------------------------------------------------------*/ + +void generate_masking_noise_lb_dirac( + HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ + float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ + const int16_t nCldfbTs, /* i : number of CLDFB slots that will be rendered */ + const int16_t cna_flag /* i : CNA flag for LB and HB */ +) +{ + int16_t i; + float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; + float *fftBuffer = hFdCngCom->fftBuffer; + float *ptr_r; + float *ptr_i; + float *ptr_level; + int16_t *seed = &( hFdCngCom->seed ); + float scale; + int16_t n_samples_out, n_samples_start, n_samples_out_loop; + + push_wmops( "fd_cng_dirac" ); + + /* Init */ + scale = 0.f; + n_samples_out = hFdCngCom->frameSize / DEFAULT_JBM_CLDFB_TIMESLOTS * nCldfbTs; + n_samples_start = 0; + + /*LB CLDFB - CNA from STFT*/ +#ifdef DEBUG_MODE_DIRAC + { + int16_t tmp_s; + tmp_s = (int16_t) ( 32768.f * 0.5f * hFdCngCom->likelihood_noisy_speech * cna_flag + 0.5f ); + dbgwrite( &tmp_s, sizeof( int16_t ), 1, hFdCngCom->frameSize / 16, "./res/ivas_dirac_likelihood_noisy.pcm" ); + } +#endif + if ( cna_flag ) + { + /* skip noise generating if level is very low, to avoid problems with possibly running into denormals */ + if ( hFdCngCom->likelihood_noisy_speech > DELTA_MASKING_NOISE ) + { + /* Compute additional CN level */ + for ( i = 0; i < 15; i++ ) + { + if ( ( hFdCngCom->CngBandwidth == scaleTable_cn_dirac[i].bwmode ) && + ( hFdCngCom->CngBitrate >= scaleTable_cn_dirac[i].bitrateFrom ) && + ( hFdCngCom->CngBitrate < scaleTable_cn_dirac[i].bitrateTo ) ) + { + break; + } + } + + scale = (float) pow( 10.f, -scaleTable_cn_dirac[i].scale / 10.f ) - 1.f; + scale *= hFdCngCom->likelihood_noisy_speech; + } + } + + /* LB CLDFB - CNA from STFT: CNA applied only in channel 0*/ + if ( cna_flag && tdBuffer != NULL ) + { + while ( n_samples_out > 0 ) + { + n_samples_out_loop = min( hFdCngCom->frameSize, n_samples_out ); + if ( scale != 0 ) + { + /*Generate LF comfort noise only at first slot, for the whole frame*/ + ptr_level = cngNoiseLevel; + + /* Generate Gaussian random noise in real and imaginary parts of the FFT bins + Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin */ + if ( hFdCngCom->startBand == 0 ) + { + rand_gauss( &fftBuffer[0], seed ); + ptr_r = fftBuffer + 2; + fftBuffer[0] *= (float) sqrt( scale * *ptr_level ); /* DC component in FFT */ + ptr_level++; + } + else + { + fftBuffer[0] = 0.f; + set_f( fftBuffer + 2, 0.0f, 2 * ( hFdCngCom->startBand - 1 ) ); + ptr_r = fftBuffer + 2 * hFdCngCom->startBand; + } + ptr_i = ptr_r + 1; + + for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; ptr_level++ ) + { + /* Real part in FFT bins */ + rand_gauss( ptr_r, seed ); + ( *ptr_r ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_r += 2; + /* Imaginary part in FFT bins */ + rand_gauss( ptr_i, seed ); + ( *ptr_i ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); + ptr_i += 2; + } + + /* Remaining FFT bins are set to zero */ + set_f( fftBuffer + 2 * hFdCngCom->stopFFTbin, 0.0f, hFdCngCom->fftlen - 2 * hFdCngCom->stopFFTbin ); + /* Nyquist frequency is discarded */ + fftBuffer[1] = 0.f; + + /* Perform STFT synthesis */ + SynthesisSTFT_dirac( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom ); + +#ifdef DEBUG_MODE_DIRAC + { + int16_t tmp[1000]; + + for ( i = 0; i < hFdCngCom->frameSize; i++ ) + { + tmp[i] = (int16_t) ( tdBuffer[i] + 0.5f ); + } + dbgwrite( tmp, sizeof( int16_t ), hFdCngCom->frameSize, 1, "./res/ivas_dirac_cna_fft.pcm" ); + } +#endif + } + + else + { + /* very low level case - update random seeds */ + generate_masking_noise_update_seed( hFdCngCom ); + + set_f( fftBuffer, 0.f, hFdCngCom->fftlen ); + + /* Perform STFT synthesis */ + SynthesisSTFT_dirac( fftBuffer, tdBuffer + n_samples_start, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, n_samples_out_loop, hFdCngCom ); + +#ifdef DEBUG_MODE_DIRAC + { + int16_t tmp[1000]; + + for ( i = 0; i < hFdCngCom->frameSize; i++ ) + { + tmp[i] = (int16_t) ( tdBuffer[i] + 0.5f ); + } + dbgwrite( tmp, sizeof( int16_t ), hFdCngCom->frameSize, 1, "./res/ivas_dirac_cna_fft.pcm" ); + } +#endif + } + n_samples_out -= hFdCngCom->frameSize; + n_samples_start += hFdCngCom->frameSize; + } + } + + pop_wmops(); + + return; +} +#endif + + /*------------------------------------------------------------------- * generate_masking_noise_hf_cldfb() * @@ -1823,10 +1967,12 @@ void generate_masking_noise_dirac( ) { int16_t i; +#ifndef JBM_TSM_ON_TCS float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; float *fftBuffer = hFdCngCom->fftBuffer; float *ptr_r; float *ptr_i; +#endif float *ptr_level; int16_t *seed = &( hFdCngCom->seed ); float scale; @@ -1873,12 +2019,12 @@ void generate_masking_noise_dirac( scale *= hFdCngCom->likelihood_noisy_speech; } } - /* LB CLDFB - CNA from STFT: CNA applied only in channel 0*/ if ( cna_flag && tdBuffer != NULL ) { if ( scale != 0 ) { +#ifndef JBM_TSM_ON_TCS /*Generate LF comfort noise only at first slot, for the whole frame*/ if ( slot_index == 0 ) { @@ -1933,12 +2079,13 @@ void generate_masking_noise_dirac( } #endif } - +#endif /* LF CLDFB*/ cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb ); } else { +#ifndef JBM_TSM_ON_TCS if ( slot_index == 0 ) { /* very low level case - update random seeds */ @@ -1961,7 +2108,7 @@ void generate_masking_noise_dirac( } #endif } - +#endif /* LB ana CLDFB*/ cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb ); } @@ -2016,16 +2163,12 @@ void FdCngDecodeMDCTStereoSID( int16_t indices[FD_CNG_stages_37bits]; int16_t N, i, ch, p, stages; int16_t is_out_ms; -#ifdef ERI_FDCNGVQ_LOW_ROM float *invTrfMatrix; float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; -#endif -#ifdef ERI_FDCNGVQ_LOW_ROM invTrfMatrix = (float *) tmpRAM; create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); -#endif is_out_ms = 0; if ( hCPE->hCoreCoder[0]->cng_sba_flag ) @@ -2069,11 +2212,7 @@ void FdCngDecodeMDCTStereoSID( } /* MSVQ decoder */ -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, ms_ptr[ch], NULL ); -#else - msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices, ms_ptr[ch], NULL ); -#endif } dtx_read_padding_bits( sts[1], ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); @@ -2132,16 +2271,12 @@ void FdCngDecodeDiracMDCTStereoSID( float gain[CPE_CHANNELS]; int16_t indices[FD_CNG_stages_37bits]; int16_t N, i, ch, p; -#ifdef ERI_FDCNGVQ_LOW_ROM float *invTrfMatrix; float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; -#endif -#ifdef ERI_FDCNGVQ_LOW_ROM invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ create_IDCT_N_Matrix( invTrfMatrix, FDCNG_VQ_MAX_LEN, FDCNG_VQ_DCT_MAXTRUNC, sizeof( tmpRAM ) / ( sizeof( float ) ) ); -#endif for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -2164,11 +2299,7 @@ void FdCngDecodeDiracMDCTStereoSID( gain[1] = gain[0]; /* MSVQ decoder */ -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 1, invTrfMatrix, ms_ptr[0], NULL ); -#else - msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, ms_ptr[0], NULL ); -#endif mvr2r( ms_ptr[0], ms_ptr[1], N ); /*inverseMS( N, ms_ptr[0], ms_ptr[1], 1.f );*/ diff --git a/lib_dec/gs_dec.c b/lib_dec/gs_dec.c index 29e134db25..ff684b47d3 100644 --- a/lib_dec/gs_dec.c +++ b/lib_dec/gs_dec.c @@ -111,11 +111,7 @@ void decod_audio( } /* set bit-allocation */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, -1, 1, &nb_bits, NULL, st->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1( DEC, st->total_brate, st->core_brate, st->core, st->extl_orig, st->extl_brate_orig, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), st->next_bit_pos, st->coder_type, -1, 1, &nb_bits, NULL, st->element_mode, &nbits /*dummy*/, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif /*---------------------------------------------------------------* * Decode energy dynamics @@ -545,8 +541,7 @@ void gsc_dec( i++; } - if ( st->element_mode > EVS_MONO && coder_type == AUDIO && - st->core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation should be mapped to 8 kb/s instead of 9.6 kb/s in this case */ + if ( st->element_mode > EVS_MONO && coder_type == AUDIO && st->core_brate <= STEREO_GSC_BIT_RATE_ALLOC && brate_intermed_tbl[i] == ACELP_9k60 ) /* Bit allocation is mapped to 8 kb/s instead of 9.6 kb/s in this case */ { i--; } diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 20bc7a0b84..c9997f5782 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -702,7 +702,7 @@ ivas_error init_decoder( * FD-CNG decoder *-----------------------------------------------------------------*/ - if ( ( st->element_mode == IVAS_CPE_MDCT || idchan == 0 ) && mc_mode != MC_MODE_MCT ) + if ( ( st->element_mode == IVAS_CPE_MDCT || idchan == 0 ) && mc_mode != MC_MODE_MCT && mc_mode != MC_MODE_PARAMUPMIX ) { /* Create FD_CNG instance */ if ( ( error = createFdCngDec( &st->hFdCngDec ) ) != IVAS_ERR_OK ) @@ -732,9 +732,6 @@ ivas_error init_decoder( st->cna_dirac_flag = 0; st->cng_sba_flag = 0; st->cng_ism_flag = 0; -#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT - st->read_sid_info = 1; /* by default read the sid info from bitstream */ -#endif st->is_ism_format = 0; diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 2db5602519..d4bd43f544 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -59,7 +59,10 @@ static void ivas_binRenderer_filterModule( float out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals */ float CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals */ float CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals */ - BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif + BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ ) { int16_t bandIdx, k, chIdx, tapIdx; @@ -78,7 +81,11 @@ static void ivas_binRenderer_filterModule( filterTapsRightRealPtr = hBinRenderer->hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx]; filterTapsRightImagPtr = hBinRenderer->hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx]; +#ifdef JBM_TSM_ON_TCS + for ( k = 0; k < numTimeSlots; k++ ) +#else for ( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) +#endif { float outRealLeft = 0.0f, outRealRight = 0.0f, outImagLeft = 0.0f, outImagRight = 0.0f; @@ -143,11 +150,16 @@ static ivas_error ivas_binRenderer_convModuleOpen( if ( !isLoudspeaker ) { +#ifdef UPDATE_SBA_FILTER + hBinRenderer->nInChannels = audioCfg2channels( input_config ); +#else hBinRenderer->nInChannels = 16; +#endif } else { - hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker ); // TODO maybe an audioCfg2channels_woLFE() function? Works as long as only 1 LFE is present + /* Note: needs to be revisited if multiple LFE support is required */ + hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker ); } if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && hRenderConfig->roomAcoustics.use_brir ) @@ -179,7 +191,11 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else { +#ifdef UPDATE_SBA_FILTER + hBinRenConvModule->numTaps = BINAURAL_NTAPS; +#else hBinRenConvModule->numTaps = 7; +#endif /* Use fixed order filtering */ bandIdx = 0; @@ -342,11 +358,42 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else { +#ifdef UPDATE_SBA_FILTER + if ( input_config == AUDIO_CONFIG_HOA3 ) + { + /* HOA3 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; + } + else if ( input_config == AUDIO_CONFIG_HOA2 ) + { + /* HOA2 filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA2[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA2[bandIdx][chIdx]; + } + else if ( input_config == AUDIO_CONFIG_FOA ) + { + /* FOA filter coefficients */ + hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_FOA[bandIdx][chIdx]; + hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_FOA[bandIdx][chIdx]; + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } +#else /* HOA3 filter coefficients */ hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; +#endif } } } @@ -385,16 +432,28 @@ static ivas_error ivas_binaural_hrtf_open( HrtfFastConv->FASTCONV_HRIR_latency_s = FASTCONV_HRIR_latency_s; HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s; +#ifdef UPDATE_SBA_FILTER + HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s; + HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s; +#endif HrtfFastConv->FASTCONV_BRIR_latency_s = FASTCONV_BRIR_latency_s; for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) { for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) { +#ifdef UPDATE_SBA_FILTER + mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], BINAURAL_NTAPS ); +#else mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], 7 ); mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], 7 ); mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], 7 ); mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], 7 ); +#endif + mvr2r( leftBRIRReal[i][j], HrtfFastConv->leftBRIRReal[i][j], BINAURAL_NTAPS_MAX ); mvr2r( leftBRIRImag[i][j], HrtfFastConv->leftBRIRImag[i][j], BINAURAL_NTAPS_MAX ); @@ -402,6 +461,29 @@ static ivas_error ivas_binaural_hrtf_open( mvr2r( rightBRIRImag[i][j], HrtfFastConv->rightBRIRImag[i][j], BINAURAL_NTAPS_MAX ); } +#ifdef UPDATE_SBA_FILTER + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); + } + for ( j = 0; j < 9; j++ ) + { + mvr2r( leftHRIRReal_HOA2[i][j], HrtfFastConv->leftHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRImag_HOA2[i][j], HrtfFastConv->leftHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRReal_HOA2[i][j], HrtfFastConv->rightHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRImag_HOA2[i][j], HrtfFastConv->rightHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + } + for ( j = 0; j < 4; j++ ) + { + mvr2r( leftHRIRReal_FOA[i][j], HrtfFastConv->leftHRIRReal_FOA[i][j], BINAURAL_NTAPS ); + mvr2r( leftHRIRImag_FOA[i][j], HrtfFastConv->leftHRIRImag_FOA[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRReal_FOA[i][j], HrtfFastConv->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS ); + mvr2r( rightHRIRImag_FOA[i][j], HrtfFastConv->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS ); + } +#else for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) { mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], 7 ); @@ -409,6 +491,7 @@ static ivas_error ivas_binaural_hrtf_open( mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], 7 ); mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], 7 ); } +#endif } mvr2r( fastconvReverberationTimes, HrtfFastConv->fastconvReverberationTimes, CLDFB_NO_CHANNELS_MAX ); @@ -428,15 +511,15 @@ static ivas_error ivas_binaural_hrtf_open( static void ivas_binaural_obtain_DMX( const int16_t numTimeSlots, - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ - float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ - float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ - float realDMX[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float imagDMX[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX] ) + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ + float RealBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ + float ImagBuffer[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Contains the LS signals */ + float realDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float imagDMX[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] ) { int16_t chIdx, bandIdx, k; - // ToDo: hBinRenderer->ivas_format is never set to ISM_FORMAT -> TBV + // ToDo: hBinRenderer->ivas_format is never set to ISM_FORMAT if ( hBinRenderer->ivas_format == MC_FORMAT || hBinRenderer->ivas_format == ISM_FORMAT ) { /* Obtain the downmix */ @@ -658,7 +741,26 @@ ivas_error ivas_binRenderer_open( } else { +#ifdef UPDATE_SBA_FILTER + if ( hBinRenderer->nInChannels == 16 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); + } + else if ( hBinRenderer->nInChannels == 9 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA2_latency_s * 1000000000.f ); + } + else if ( hBinRenderer->nInChannels == 4 ) + { + st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_FOA_latency_s * 1000000000.f ); + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } +#else st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); +#endif } } else @@ -847,9 +949,14 @@ void ivas_binRenderer_close( *-------------------------------------------------------------------------*/ void ivas_binaural_add_LFE( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - int16_t output_frame, /* i : length of input frame */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + int16_t output_frame, /* i : length of input frame */ +#ifdef JBM_TSM_ON_TCS + float *input_f[], /* i : transport channels */ + float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif ) { int16_t render_lfe, idx_lfe; @@ -876,10 +983,17 @@ void ivas_binaural_add_LFE( } for ( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ ) { +#ifdef JBM_TSM_ON_TCS + v_multc( input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); + /* copy LFE to left and right channels */ + v_add( output_f[0], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame ); + v_add( output_f[1], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame ); +#else v_multc( output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); /* copy LFE to left and right channels */ v_add( output_f[0], output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame ); v_add( output_f[1], output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame ); +#endif } } @@ -895,8 +1009,12 @@ void ivas_binaural_add_LFE( *-------------------------------------------------------------------------*/ void ivas_binaural_cldfb( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +#else float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif ) { float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -939,8 +1057,11 @@ void ivas_binaural_cldfb( } /* Implement binaural rendering */ +#ifdef JBM_TSM_ON_TCS + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); - +#endif /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -961,6 +1082,106 @@ void ivas_binaural_cldfb( return; } + + +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------------* + * ivas_binaural_cldfb_sf() + * + * Perform CLDFB analysis, fastconv binaural rendering and CLDFB synthesis + *-------------------------------------------------------------------------*/ + +void ivas_binaural_cldfb_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +) +{ + float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; + int16_t slot_idx, subframeIdx, index_slot, idx_in, idx_lfe, maxBand, ch; + int16_t slot_size, slots_to_render, first_sf, last_sf; + int16_t slot_index_start, slot_index_start_cldfb; + + /* Implement a 5 msec loops */ + maxBand = (int16_t) ( ( CLDFB_NO_CHANNELS_MAX * st_ivas->hDecoderConfig->output_Fs ) / 48000 ); + slot_size = st_ivas->hTcBuffer->nb_subframes; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + slot_index_start = st_ivas->hTcBuffer->slots_rendered; + slot_index_start_cldfb = 0; + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + for ( subframeIdx = first_sf; subframeIdx < last_sf; subframeIdx++ ) + { + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) + { + index_slot = slot_index_start + slot_idx; + + /* Implement CLDFB analysis */ + idx_in = 0; + idx_lfe = 0; + + for ( ch = 0; ch < ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ); ch++ ) + { + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[idx_lfe] == ch ) ) + { + if ( idx_lfe < ( st_ivas->hIntSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[ch][maxBand * index_slot] ), + Cldfb_RealBuffer[idx_in][slot_idx], + Cldfb_ImagBuffer[idx_in][slot_idx], + maxBand, st_ivas->cldfbAnaDec[idx_in] ); + idx_in++; + } + } + } + + /* Implement binaural rendering */ +#ifdef JBM_TSM_ON_TCS + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#else + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#endif + + /* Implement CLDFB synthesis */ + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( slot_idx = 0; slot_idx < st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; slot_idx++ ) + { + RealBuffer[slot_idx] = Cldfb_RealBuffer_Binaural[ch][slot_idx]; + ImagBuffer[slot_idx] = Cldfb_ImagBuffer_Binaural[ch][slot_idx]; + } + + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_index_start_cldfb * maxBand] ), maxBand * st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], st_ivas->cldfbSynDec[ch] ); + } + slot_index_start += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; + slot_index_start_cldfb += st_ivas->hTcBuffer->subframe_nbslots[subframeIdx]; + } + + st_ivas->hTcBuffer->subframes_rendered = last_sf; + + return; +} +#endif #endif @@ -971,8 +1192,11 @@ void ivas_binaural_cldfb( *-------------------------------------------------------------------------*/ void ivas_binRenderer( - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to render*/ +#endif float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -980,7 +1204,9 @@ void ivas_binRenderer( ) { int16_t chIdx, k; +#ifndef JBM_TSM_ON_TCS int16_t numTimeSlots = MAX_PARAM_SPATIAL_SUBFRAMES; +#endif push_wmops( "fastconv_binaural_rendering" ); @@ -1004,36 +1230,55 @@ void ivas_binRenderer( if ( hHeadTrackData->shd_rot_max_order == -1 ) { QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); +#ifdef JBM_TSM_ON_TCS + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); +#else rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, 3 ); +#endif } else if ( hHeadTrackData->shd_rot_max_order > 0 ) { +#ifdef JBM_TSM_ON_TCS + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order ); +#else rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, hHeadTrackData->shd_rot_max_order ); +#endif } } else { /* Rotation in SD (CICPx) */ +#ifdef JBM_TSM_ON_TCS + rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); +#else rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band ); +#endif } } /* HOA decoding to CICP19 if needed*/ if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 ) { +#ifdef JBM_TSM_ON_TCS + ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); +#else ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, hBinRenderer->hoa_dec_mtx ); +#endif } +#ifdef JBM_TSM_ON_TCS + ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, numTimeSlots, hBinRenderer ); +#else ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, hBinRenderer ); +#endif /* Obtain the binaural dmx and compute the reverb */ if ( hBinRenderer->hReverb != NULL ) { - float reverbRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float reverbIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float inRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float inIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - + float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float inRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float inIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; ivas_binaural_obtain_DMX( numTimeSlots, hBinRenderer, RealBuffer, ImagBuffer, inRe, inIm ); for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) @@ -1045,7 +1290,11 @@ void ivas_binRenderer( } } - ivas_binaural_reverb_processFrame( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm, 0u ); +#ifdef JBM_TSM_ON_TCS + ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, numTimeSlots, inRe, inIm, reverbRe, reverbIm ); +#else + ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm ); +#endif /* Add the conv module and reverb module output */ for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 516e027f90..9d6211bf8f 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -90,9 +90,7 @@ ivas_error ivas_core_dec( int16_t use_cldfb_for_dft; float *p_output_mem; int16_t flag_sec_CNA; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT int16_t read_sid_info; -#endif int16_t last_element_mode; int16_t nchan_out; float *save_hb_synth; @@ -108,9 +106,7 @@ ivas_error ivas_core_dec( use_cldfb_for_dft = 0; tdm_LRTD_flag = -1; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT read_sid_info = 1; /* read SID by default */ -#endif if ( hSCE != NULL ) { @@ -122,7 +118,6 @@ ivas_error ivas_core_dec( hStereoTD = NULL; p_output_mem = NULL; nchan_out = 1; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( st_ivas != NULL && st_ivas->ivas_format == ISM_FORMAT ) { if ( st_ivas->hISMDTX.sce_id_dtx != hSCE->sce_id ) @@ -130,7 +125,6 @@ ivas_error ivas_core_dec( read_sid_info = 0; } } -#endif } else { @@ -347,11 +341,7 @@ ivas_error ivas_core_dec( if ( st->core == ACELP_CORE ) { /* ACELP core decoder */ -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng, read_sid_info ) ) != IVAS_ERR_OK ) -#else - if ( ( error = acelp_core_dec( st, output[n], synth[n], save_hb_synth, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], sharpFlag[n], pitch_buf[n], &unbits[n], &sid_bw[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh, use_cldfb_for_dft, last_element_mode, last_element_brate, flag_sec_CNA, nchan_out, hCPE == NULL ? NULL : hCPE->hStereoCng ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index 9d15f1bdfc..e112a8ec04 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -511,8 +511,13 @@ ivas_error ivas_cldfb_dec_reconfig( } } +#ifndef SBA_MODE_CLEAN_UP /* CLDFB Interpolation weights */ if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) +#else + /* CLDFB Interpolation weights */ + if ( st_ivas->ivas_format == SBA_FORMAT && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) +#endif { ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c old mode 100644 new mode 100755 index 186d1c4c7d..a19fb21dc2 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -292,7 +292,7 @@ ivas_error ivas_cpe_dec( } else { - /* subtract metadata bitbudget */ /* IVAS_fmToDo: TBC whether it is not better to distribute the metadata bits equally between 2 channels */ + /* subtract metadata bitbudget */ sts[0]->bits_frame_channel -= nb_bits_metadata; } } @@ -405,7 +405,12 @@ ivas_error ivas_cpe_dec( } else { - stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 ); + stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 +#ifdef FIX_STEREO_474 + , + MAX_PARAM_SPATIAL_SUBFRAMES +#endif + ); } /* synthesis iFFT */ @@ -827,11 +832,13 @@ void destroy_cpe_dec( int16_t n; Decoder_State *st; +#ifndef REMOVE_OBS_CODE /* make sure we deallocate a potential distinct hTcxCfg for a MCT LFE channel (can only happen in rs) */ /*TODO Check this again with LFE clean up!*/ if ( hCPE->hCoreCoder[1] != NULL && hCPE->hCoreCoder[1]->hTcxCfg != hCPE->hCoreCoder[0]->hTcxCfg ) { hCPE->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; } +#endif for ( n = 0; n < CPE_CHANNELS; n++ ) { diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 88e631908c..82f03fdb3b 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -57,14 +57,18 @@ ivas_error ivas_dec( ) { int16_t n, output_frame, nchan_out; - Decoder_State *st; /* used for bitstream handling */ - float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ /* IVAS_fmToDo: buffer can be allocated dynamically based on the actual number of output channels */ + Decoder_State *st; /* used for bitstream handling */ + float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ int16_t nchan_remapped; float output_lfe_ch[L_FRAME48k]; int16_t nb_bits_metadata[MAX_SCE]; int32_t output_Fs, ivas_total_brate; AUDIO_CONFIG output_config; + float pan_left, pan_right; ivas_error error; +#ifdef JBM_TSM_ON_TCS + float *p_output[MAX_OUTPUT_CHANNELS]; +#endif error = IVAS_ERR_OK; @@ -80,7 +84,11 @@ ivas_error ivas_dec( if ( st_ivas->bfi == 0 ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_dec_setup( st_ivas, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_dec_setup( st_ivas ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -97,6 +105,13 @@ ivas_error ivas_dec( output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); +#ifdef JBM_TSM_ON_TCS + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + p_output[n] = &output[n][0]; + } +#endif + /*----------------------------------------------------------------* * Decoding + Rendering *----------------------------------------------------------------*/ @@ -134,7 +149,11 @@ ivas_error ivas_dec( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_MC ) { - ivas_ls_setup_conversion( st_ivas, output_frame, output ); +#ifdef JBM_TSM_ON_TCS + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); +#else + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); +#endif } } else if ( st_ivas->ivas_format == ISM_FORMAT ) @@ -149,7 +168,6 @@ ivas_error ivas_dec( } else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - // VE: call ivas_ism_metadata_dec() with 'st_ivas' - TBD if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) { return error; @@ -187,6 +205,13 @@ ivas_error ivas_dec( { ivas_mono_downmix_render_passive( st_ivas, output, output_frame ); } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc( output[0], pan_right, output[1], output_frame ); + v_multc( output[0], pan_left, output[0], output_frame ); + } else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { ivas_param_ism_dec( st_ivas, output ); @@ -194,7 +219,11 @@ ivas_error ivas_dec( if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { /* Convert CICP19 -> Ambisonics */ +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#else ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif } } } @@ -205,45 +234,75 @@ ivas_error ivas_dec( { ivas_mono_downmix_render_passive( st_ivas, output, output_frame ); } + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc( output[0], pan_right, output[1], output_frame ); + v_multc( output[0], pan_left, output[0], output_frame ); + } else if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ +#ifdef JBM_TSM_ON_TCS + ivas_ism_render( st_ivas, p_output, output_frame ); +#else ivas_ism_render( st_ivas, output, output_frame ); +#endif } -#ifdef REND_DEBUGGING_REVISION #ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) #else else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) -#endif -#else - else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) #endif { /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ +#ifdef JBM_TSM_ON_TCS + ivas_ism2sba( p_output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); +#else ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); +#endif } /* Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { + +#ifdef JBM_TSM_ON_TCS + if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) +#else if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) +#endif { return error; } } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, output, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, +#ifdef JBM_TSM_ON_TCS + p_output, +#else + output, +#endif + output_Fs ) ) != IVAS_ERR_OK ) { return error; } +#ifdef JBM_TSM_ON_TCS + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); +#else ivas_binaural_add_LFE( st_ivas, output_frame, output ); +#endif } #ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { +#ifdef JBM_TSM_ON_TCS + ivas_binaural_cldfb( st_ivas, p_output ); +#else ivas_binaural_cldfb( st_ivas, output ); +#endif } #endif } @@ -253,29 +312,54 @@ ivas_error ivas_dec( set_s( nb_bits_metadata, 0, MAX_SCE ); /* read parameters from the bitstream */ +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL ) +#endif { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) { - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, 0 ); + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), + 0 ); } else { +#endif if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { return error; } +#ifndef SBA_MODE_CLEAN_UP } +#endif } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL ) { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, st_ivas->hSpar->dirac_to_spar_md_bands ); + +#ifndef SBA_MODE_CLEAN_UP + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), + st_ivas->hSpar->dirac_to_spar_md_bands ); +#else + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), + st_ivas->hSpar->dirac_to_spar_md_bands ); +#endif } +#endif if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) { @@ -310,18 +394,33 @@ ivas_error ivas_dec( return error; } } - +#ifdef DEBUG_LBR_SBA + /* SCE Decoder Output */ + for ( int t = 0; t < 960; t++ ) + { + for ( int c = 0; c < st_ivas->nchan_transport; c++ ) + { + float val = output[c][t] / MAX16B_FLT; + dbgwrite( &val, sizeof( float ), 1, 1, "int_dec_core_out.raw" ); + } + } +#endif #ifdef DEBUG_SBA_AUDIO_DUMP /* Dump audio signal after core-decoding */ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[0], "core-decoding" ); #endif + /* TCs remapping */ nchan_remapped = st_ivas->nchan_transport; if ( st_ivas->sba_dirac_stereo_flag ) { nchan_remapped = nchan_out; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); @@ -330,7 +429,8 @@ ivas_error ivas_dec( ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); } - ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi ); + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); } ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT ); @@ -351,10 +451,25 @@ ivas_error ivas_dec( { nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame ); +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) +#else + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) + +#endif { ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); } +#ifdef JBM_TSM_ON_TCS +#ifndef SBA_MODE_CLEAN_UP + else if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->renderer_type != RENDERER_DISABLE ) +#else + else if ( st_ivas->renderer_type != RENDERER_DISABLE ) +#endif + { + ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); + } +#endif } if ( st_ivas->ivas_format == MASA_FORMAT ) @@ -363,7 +478,16 @@ ivas_error ivas_dec( } else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { - float gain = 0.8414f; /* Todo: Temporary gain for roughly matching the loudness. To be tuned later together with other outputs. */ + float gain; + + if ( nchan_remapped == 1 ) + { + gain = 1.4454f; + } + else + { + gain = 1.3657f; + } for ( n = 0; n < nchan_remapped; n++ ) { @@ -376,18 +500,30 @@ ivas_error ivas_dec( { ivas_dirac_dec_binaural( st_ivas, output, nchan_remapped ); } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT ) +#else + else if ( st_ivas->ivas_format == MASA_FORMAT ) +#endif { if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_sba_linear_renderer( p_output, output_frame, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_sba_linear_renderer( output, output_frame, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK ) +#endif { return error; } } else if ( st_ivas->renderer_type == RENDERER_DIRAC ) { +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec( st_ivas, output, nchan_remapped ); +#else ivas_dirac_dec( st_ivas, output, nchan_remapped, NULL, NULL, -1 ); +#endif } } else if ( !st_ivas->sba_dirac_stereo_flag && nchan_out != 1 ) @@ -425,35 +561,162 @@ ivas_error ivas_dec( if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) { +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); +#else + ivas_mc2sba( st_ivas->hTransSetup, output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); +#endif + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, + st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, +#ifdef JBM_TSM_ON_TCS + p_output, +#else + output, +#endif + output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + +#ifdef JBM_TSM_ON_TCS + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); +#else + ivas_binaural_add_LFE( st_ivas, output_frame, output ); +#endif + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { +#ifdef JBM_TSM_ON_TCS + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); +#else + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); +#endif + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#else + ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { +#ifdef JBM_TSM_ON_TCS + if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); +#else + if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) + { + return error; + } + ivas_binaural_add_LFE( st_ivas, output_frame, output ); +#endif + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch ); + + ivas_mc_paramupmix_dec_read_BS( ivas_total_brate, st, st_ivas, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] ); + + if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + mvr2r( output_lfe_ch, output[LFE_CHANNEL], output_frame ); + + ivas_mc_paramupmix_dec( st_ivas, output ); + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( n != LFE_CHANNEL ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + } + + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) + { +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); +#else ivas_mc2sba( st_ivas->hTransSetup, output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); +#endif } /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, p_output, output_Fs ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } +#ifdef JBM_TSM_ON_TCS + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); +#else ivas_binaural_add_LFE( st_ivas, output_frame, output ); +#endif } else if ( st_ivas->renderer_type == RENDERER_MC ) { - ivas_ls_setup_conversion( st_ivas, output_frame, output ); + if ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) + { +#ifdef JBM_TSM_ON_TCS + ivas_ls_setup_conversion( st_ivas, audioCfg2channels( AUDIO_CONFIG_5_1_2 ), output_frame, p_output, p_output ); +#else + ivas_ls_setup_conversion( st_ivas, audioCfg2channels( AUDIO_CONFIG_5_1_2 ), output_frame, output ); +#endif + } + else + { +#ifdef JBM_TSM_ON_TCS + ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, output_frame, p_output, p_output ); +#else + ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, output_frame, output ); +#endif + } } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#else ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { +#ifdef JBM_TSM_ON_TCS + if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) +#else if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) +#endif { return error; } +#ifdef JBM_TSM_ON_TCS + ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); +#else ivas_binaural_add_LFE( st_ivas, output_frame, output ); +#endif } } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) @@ -485,11 +748,19 @@ ivas_error ivas_dec( /* Rendering */ if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) { - ivas_ls_setup_conversion( st_ivas, output_frame, output ); +#ifdef JBM_TSM_ON_TCS + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); +#else + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); +#endif } else { +#ifdef JBM_TSM_ON_TCS + ivas_param_mc_dec( st_ivas, p_output ); +#else ivas_param_mc_dec( st_ivas, output ); +#endif } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -571,11 +842,19 @@ ivas_error ivas_dec( } else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ { +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport ); +#else ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport, NULL, NULL, -1 ); +#endif if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { +#ifdef JBM_TSM_ON_TCS + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#else ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); +#endif } else if ( st_ivas->intern_config == AUDIO_CONFIG_5_1 && ( output_config == AUDIO_CONFIG_5_1_2 || output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1 ) ) { @@ -599,12 +878,21 @@ ivas_error ivas_dec( * - float to integer conversion *----------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS + ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, output_frame, st_ivas->BER_detect ); + +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + ivas_syn_output( p_output, output_frame, nchan_out, data ); +#else ivas_limiter_dec( st_ivas->hLimiter, output, nchan_out, output_frame, st_ivas->BER_detect ); #ifdef DEBUGGING st_ivas->noClipping += #endif ivas_syn_output( output, output_frame, nchan_out, data ); +#endif /*----------------------------------------------------------------* * Common updates diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index dfeb946a02..502420781f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -51,7 +51,7 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ); +static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, const int16_t hodirac_flag ); static void ivas_dirac_free_mem( DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ); @@ -65,7 +65,7 @@ static void protoSignalComputation1( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRA static void protoSignalComputation2( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t isloudspeaker, const int16_t slot_index, const int16_t num_freq_bands, MASA_STEREO_TYPE_DETECT *stereo_type_detect ); -static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport ); +static void protoSignalComputation4( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, float *proto_direct_buffer_f, float *reference_power, float *proto_power_smooth, const int16_t slot_index, const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, const int16_t nchan_transport, const int16_t *sba_map_tc_ind ); static void ivas_dirac_dec_compute_diffuse_proto( DIRAC_DEC_HANDLE hDirAC, const int16_t slot_idx ); @@ -103,6 +103,144 @@ ivas_error ivas_dirac_dec_open( } +/*------------------------------------------------------------------------- + * ivas_dirac_allocate_parameters() + * + * Allocate and initialize DirAC parameters + *-------------------------------------------------------------------------*/ + +ivas_error ivas_dirac_allocate_parameters( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t params_flag /* i : set of parameters flag */ +) +{ + int16_t i; + + if ( params_flag == 1 ) + { + if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->diffuseness_vector = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands ); + + if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands ); + + if ( ( hDirAC->diffuseness_vector[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->diffuseness_vector[i], 1.0f, hDirAC->num_freq_bands ); + + if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands ); + + if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands ); + + if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); + } + } + else if ( params_flag == 2 ) + { + if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); + + if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); + + if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); + + if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + } + set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); + } + } + + return IVAS_ERR_OK; +} + + /*------------------------------------------------------------------------- * ivas_dirac_dec_config() * @@ -130,6 +268,10 @@ ivas_error ivas_dirac_dec_config( int32_t output_Fs, ivas_total_brate; ivas_error error; int16_t nchan_transport_orig; + int16_t hodirac_flag; +#ifdef JBM_TSM_ON_TCS + int16_t map_idx; +#endif DIRAC_CONFIG_FLAG flag_config; flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; @@ -138,6 +280,7 @@ ivas_error ivas_dirac_dec_config( hDirAC = NULL; output_Fs = st_ivas->hDecoderConfig->output_Fs; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); if ( flag_config == DIRAC_RECONFIGURE ) { @@ -159,7 +302,10 @@ ivas_error ivas_dirac_dec_config( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); } nchan_transport_old = 0; - +#ifdef JBM_TSM_ON_TCS + hDirAC->hParamIsm = NULL; + hDirAC->hParamIsmRendering = NULL; +#endif st_ivas->hDirAC = hDirAC; } @@ -170,9 +316,14 @@ ivas_error ivas_dirac_dec_config( num_protos_diff_old = 0; nchan_transport_orig = st_ivas->nchan_transport; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) +#endif { - st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); } nchan_transport = st_ivas->nchan_transport; @@ -250,18 +401,51 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); +#ifdef JBM_TSM_ON_TCS + set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hDirAC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hDirAC->subframes_rendered = 0; + hDirAC->slots_rendered = 0; + hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; +#else hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); +#endif + } + + if ( st_ivas->ivas_format == SBA_FORMAT && flag_config == DIRAC_RECONFIGURE && ( ( ivas_total_brate > IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_256k ) || ( ivas_total_brate <= IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate > IVAS_256k ) ) ) + { + if ( st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k && hDirAC->azimuth2 == NULL ) + { + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->hDecoderConfig->ivas_total_brate <= IVAS_256k && hDirAC->azimuth2 != NULL ) + { + ivas_dirac_deallocate_parameters( hDirAC, 2 ); + } } /* band config needed only for SPAR with FOA output */ - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR ) +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR && !hodirac_flag ) +#else + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->ivas_format == SBA_FORMAT && !hodirac_flag ) +#endif { return IVAS_ERR_OK; } - if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC ) + + if ( nchan_transport_orig > 2 && hDirAC->hOutSetup.is_loudspeaker_setup && st_ivas->renderer_type == RENDERER_DIRAC +#ifdef FIX_DIRAC_LS_SYNTHESIS_CONFIG + && !hodirac_flag +#endif + ) { hDirAC->synthesisConf = DIRAC_SYNTHESIS_PSD_LS; hDirAC->panningConf = DIRAC_PANNING_VBAP; @@ -412,6 +596,19 @@ ivas_error ivas_dirac_dec_config( } set_s( hDirAC->proto_index_diff, 0, hDirAC->num_outputs_diff ); + hDirAC->sba_map_tc = sba_map_tc; +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif + { + if ( st_ivas->sba_order > SBA_FOA_ORDER && ivas_total_brate >= IVAS_512k ) + { + hDirAC->sba_map_tc = sba_map_tc_512; + } + } + if ( nchan_transport == 1 ) { hDirAC->num_protos_ambi = 1; @@ -509,17 +706,20 @@ ivas_error ivas_dirac_dec_config( { hDirAC->num_protos_diff = 1; hDirAC->num_protos_dir = nchan_transport; - +#ifndef SBA_MODE_CLEAN_UP if ( ( st_ivas->sba_planar ) && ( !( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) ) ) +#else + if ( ( st_ivas->sba_planar ) && ( !( st_ivas->ivas_format == SBA_FORMAT ) ) ) +#endif { hDirAC->num_protos_dir++; } for ( k = 0; k < min( hDirAC->num_outputs_dir, hDirAC->num_protos_dir ); k++ ) { - if ( sba_map_tc[k] < hDirAC->num_outputs_dir ) + if ( hDirAC->sba_map_tc[k] < hDirAC->num_outputs_dir ) { - hDirAC->proto_index_dir[sba_map_tc[k]] = k; + hDirAC->proto_index_dir[hDirAC->sba_map_tc[k]] = k; } } } @@ -620,7 +820,11 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { hDirAC->hoa_decoder = NULL; +#ifndef SBA_MODE_CLEAN_UP if ( ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->sba_mode == SBA_MODE_SPAR || ( nchan_transport > 2 ) ) +#else + if ( ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->ivas_format == SBA_FORMAT || ( nchan_transport > 2 ) ) +#endif { if ( hDirAC->hOutSetup.is_loudspeaker_setup ) { @@ -696,7 +900,8 @@ ivas_error ivas_dirac_dec_config( /* output synthesis */ if ( flag_config == DIRAC_OPEN ) { - if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs, + hodirac_flag ) ) != IVAS_ERR_OK ) { return error; } @@ -706,7 +911,8 @@ ivas_error ivas_dirac_dec_config( { ivas_dirac_dec_output_synthesis_close( hDirAC ); - if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( ivas_dirac_dec_output_synthesis_open( hDirAC, st_ivas->renderer_type, nchan_transport, output_Fs, + hodirac_flag ) ) != IVAS_ERR_OK ) { return error; } @@ -800,14 +1006,16 @@ ivas_error ivas_dirac_dec_config( } /* output synthesis */ - ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE ); + ivas_dirac_dec_output_synthesis_init( hDirAC, nchan_out_woLFE, + hodirac_flag ); /* Allocate stack memory */ if ( flag_config != DIRAC_OPEN ) { ivas_dirac_free_mem( &( hDirAC->stack_mem ) ); } - if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ) ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_alloc_mem( hDirAC, st_ivas->renderer_type, &( hDirAC->stack_mem ), + hodirac_flag ) ) != IVAS_ERR_OK ) { return error; } @@ -820,24 +1028,47 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_bs_md_write_idx = 0; hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; - +#ifndef FIX_393_459_460_SBA_MD + hDirAC->hConfig->dec_param_estim_old = hDirAC->hConfig->dec_param_estim; +#endif if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; + +#ifdef JBM_TSM_ON_TCS + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) + { + hDirAC->render_to_md_map[map_idx] = map_idx; + } + +#endif } else if ( st_ivas->ivas_format == MASA_FORMAT ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; hDirAC->dirac_bs_md_write_idx = DELAY_MASA_PARAM_DEC_SFR; + +#ifdef JBM_TSM_ON_TCS + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) + { + hDirAC->render_to_md_map[map_idx] = map_idx; + } +#endif } else { int16_t num_slots_in_subfr; num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) { +#ifdef FIX_393_459_460_SBA_MD + hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; +#else hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES * num_slots_in_subfr; +#endif hDirAC->dirac_bs_md_write_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; hDirAC->dirac_read_idx = 0; @@ -845,145 +1076,123 @@ ivas_error ivas_dirac_dec_config( } else { - hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; - hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; - hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; +#endif +#ifdef FIX_393_459_460_SBA_MD + hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ); + hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; + hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; +#else + hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; + hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; + hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; +#endif hDirAC->dirac_read_idx = 0; hDirAC->dirac_estimator_idx = 0; +#ifndef SBA_MODE_CLEAN_UP } - } - - if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } +#endif +#ifdef JBM_TSM_ON_TCS - if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); +#ifdef FIX_393_459_460_SBA_MD + for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS * num_slots_in_subfr; map_idx++ ) +#else + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) +#endif + { +#ifdef FIX_393_459_460_SBA_MD + hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx / num_slots_in_subfr; +#else + hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; +#endif + } +#endif } - if ( ( hDirAC->diffuseness_vector = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + return error; } - if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + if ( st_ivas->ivas_format == MASA_FORMAT || ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ) ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) + { + return error; + } } - - if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + else { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + hDirAC->azimuth2 = NULL; + hDirAC->elevation2 = NULL; + hDirAC->energy_ratio2 = NULL; + hDirAC->spreadCoherence2 = NULL; } - if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } + hDirAC->hDiffuseDist = NULL; /* Memory is allocated from stack during runtime when needed */ - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + hDirAC->dithering_seed = DIRAC_DITH_SEED; + st_ivas->hDirAC = hDirAC; + } +#ifndef FIX_393_459_460_SBA_MD + else if ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) + { + int16_t num_slots_in_subfr; + num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { - if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->diffuseness_vector[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->diffuseness_vector[i], 1.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + if ( ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + ivas_dirac_deallocate_parameters( hDirAC, 1 ); } - set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands ); + hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; + hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; + hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; + hDirAC->dirac_read_idx = 0; + hDirAC->dirac_estimator_idx = 0; - if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + return error; } - set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); } - - if ( st_ivas->ivas_format == MASA_FORMAT ) + } +#endif +#ifdef JBM_TSM_ON_TCS + /* allocate transport channels*/ + if ( flag_config == DIRAC_OPEN ) + { + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) { - if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } + int16_t nchan_to_allocate; - if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); + nchan_to_allocate = nchan_transport; + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + } + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_to_allocate, nchan_to_allocate, hDirAC->slot_size ) ) != IVAS_ERR_OK ) + { + return error; + } } - - if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); - } - } - else - { - hDirAC->azimuth2 = NULL; - hDirAC->elevation2 = NULL; - hDirAC->energy_ratio2 = NULL; - hDirAC->spreadCoherence2 = NULL; - } - - hDirAC->hDiffuseDist = NULL; /* Memory is allocated from stack during runtime when needed */ - - hDirAC->dithering_seed = DIRAC_DITH_SEED; - st_ivas->hDirAC = hDirAC; - } + } + } +#endif /* JBM_TMS_ON_TCS*/ return error; } @@ -1086,150 +1295,185 @@ void ivas_dirac_dec_close( hDirAC->buffer_energy = NULL; } - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + ivas_dirac_deallocate_parameters( hDirAC, 1 ); + ivas_dirac_deallocate_parameters( hDirAC, 2 ); + + if ( hDirAC->masa_stereo_type_detect != NULL ) + { + free( hDirAC->masa_stereo_type_detect ); + hDirAC->masa_stereo_type_detect = NULL; + } + + ivas_dirac_free_mem( &( hDirAC->stack_mem ) ); + + free( *hDirAC_out ); + *hDirAC_out = NULL; + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_deallocate_parameters() + * + * Deallocate DirAC parameters + *-------------------------------------------------------------------------*/ + +void ivas_dirac_deallocate_parameters( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t params_flag /* i : set of parameters flag */ +) +{ + int16_t i; + + if ( params_flag == 1 ) { - if ( hDirAC->azimuth[i] != NULL ) + if ( hDirAC->azimuth != NULL ) { - free( hDirAC->azimuth[i] ); - hDirAC->azimuth[i] = NULL; + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->azimuth[i] != NULL ) + { + free( hDirAC->azimuth[i] ); + hDirAC->azimuth[i] = NULL; + } + } + + free( hDirAC->azimuth ); + hDirAC->azimuth = NULL; } - if ( hDirAC->elevation[i] != NULL ) + if ( hDirAC->elevation != NULL ) { - free( hDirAC->elevation[i] ); - hDirAC->elevation[i] = NULL; + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->elevation[i] != NULL ) + { + free( hDirAC->elevation[i] ); + hDirAC->elevation[i] = NULL; + } + } + + free( hDirAC->elevation ); + hDirAC->elevation = NULL; } - if ( hDirAC->diffuseness_vector[i] != NULL ) + + if ( hDirAC->energy_ratio1 != NULL ) { - free( hDirAC->diffuseness_vector[i] ); - hDirAC->diffuseness_vector[i] = NULL; + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + { + if ( hDirAC->energy_ratio1[i] != NULL ) + { + free( hDirAC->energy_ratio1[i] ); + hDirAC->energy_ratio1[i] = NULL; + } + } + free( hDirAC->energy_ratio1 ); + hDirAC->energy_ratio1 = NULL; } - } - if ( hDirAC->azimuth != NULL ) - { - free( hDirAC->azimuth ); - hDirAC->azimuth = NULL; - } - if ( hDirAC->elevation != NULL ) - { - free( hDirAC->elevation ); - hDirAC->elevation = NULL; - } - if ( hDirAC->diffuseness_vector != NULL ) - { - free( hDirAC->diffuseness_vector ); - hDirAC->diffuseness_vector = NULL; - } - if ( hDirAC->azimuth2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + if ( hDirAC->diffuseness_vector != NULL ) { - if ( hDirAC->azimuth2[i] != NULL ) + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { - free( hDirAC->azimuth2[i] ); - hDirAC->azimuth2[i] = NULL; + if ( hDirAC->diffuseness_vector[i] != NULL ) + { + free( hDirAC->diffuseness_vector[i] ); + hDirAC->diffuseness_vector[i] = NULL; + } } + + free( hDirAC->diffuseness_vector ); + hDirAC->diffuseness_vector = NULL; } - free( hDirAC->azimuth2 ); - hDirAC->azimuth2 = NULL; - } - if ( hDirAC->elevation2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + if ( hDirAC->spreadCoherence != NULL ) { - if ( hDirAC->elevation2[i] != NULL ) + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { - free( hDirAC->elevation2[i] ); - hDirAC->elevation2[i] = NULL; + if ( hDirAC->spreadCoherence[i] != NULL ) + { + free( hDirAC->spreadCoherence[i] ); + hDirAC->spreadCoherence[i] = NULL; + } } + free( hDirAC->spreadCoherence ); + hDirAC->spreadCoherence = NULL; } - free( hDirAC->elevation2 ); - hDirAC->elevation2 = NULL; - } - if ( hDirAC->energy_ratio1 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + if ( hDirAC->surroundingCoherence != NULL ) { - if ( hDirAC->energy_ratio1[i] != NULL ) + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { - free( hDirAC->energy_ratio1[i] ); - hDirAC->energy_ratio1[i] = NULL; + if ( hDirAC->surroundingCoherence[i] != NULL ) + { + free( hDirAC->surroundingCoherence[i] ); + hDirAC->surroundingCoherence[i] = NULL; + } } + free( hDirAC->surroundingCoherence ); + hDirAC->surroundingCoherence = NULL; } - free( hDirAC->energy_ratio1 ); - hDirAC->energy_ratio1 = NULL; } - - if ( hDirAC->energy_ratio2 != NULL ) + else if ( params_flag == 2 ) { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + if ( hDirAC->azimuth2 != NULL ) { - if ( hDirAC->energy_ratio2[i] != NULL ) + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { - free( hDirAC->energy_ratio2[i] ); - hDirAC->energy_ratio2[i] = NULL; + if ( hDirAC->azimuth2[i] != NULL ) + { + free( hDirAC->azimuth2[i] ); + hDirAC->azimuth2[i] = NULL; + } } + free( hDirAC->azimuth2 ); + hDirAC->azimuth2 = NULL; } - free( hDirAC->energy_ratio2 ); - hDirAC->energy_ratio2 = NULL; - } - if ( hDirAC->spreadCoherence != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + if ( hDirAC->elevation2 != NULL ) { - if ( hDirAC->spreadCoherence[i] != NULL ) + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { - free( hDirAC->spreadCoherence[i] ); - hDirAC->spreadCoherence[i] = NULL; + if ( hDirAC->elevation2[i] != NULL ) + { + free( hDirAC->elevation2[i] ); + hDirAC->elevation2[i] = NULL; + } } + free( hDirAC->elevation2 ); + hDirAC->elevation2 = NULL; } - free( hDirAC->spreadCoherence ); - hDirAC->spreadCoherence = NULL; - } - if ( hDirAC->spreadCoherence2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + if ( hDirAC->energy_ratio2 != NULL ) { - if ( hDirAC->spreadCoherence2[i] != NULL ) + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { - free( hDirAC->spreadCoherence2[i] ); - hDirAC->spreadCoherence2[i] = NULL; + if ( hDirAC->energy_ratio2[i] != NULL ) + { + free( hDirAC->energy_ratio2[i] ); + hDirAC->energy_ratio2[i] = NULL; + } } + free( hDirAC->energy_ratio2 ); + hDirAC->energy_ratio2 = NULL; } - free( hDirAC->spreadCoherence2 ); - hDirAC->spreadCoherence2 = NULL; - } - if ( hDirAC->surroundingCoherence != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) + if ( hDirAC->spreadCoherence2 != NULL ) { - if ( hDirAC->surroundingCoherence[i] != NULL ) + for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) { - free( hDirAC->surroundingCoherence[i] ); - hDirAC->surroundingCoherence[i] = NULL; + if ( hDirAC->spreadCoherence2[i] != NULL ) + { + free( hDirAC->spreadCoherence2[i] ); + hDirAC->spreadCoherence2[i] = NULL; + } } + free( hDirAC->spreadCoherence2 ); + hDirAC->spreadCoherence2 = NULL; } - free( hDirAC->surroundingCoherence ); - hDirAC->surroundingCoherence = NULL; - } - - if ( hDirAC->masa_stereo_type_detect != NULL ) - { - free( hDirAC->masa_stereo_type_detect ); - hDirAC->masa_stereo_type_detect = NULL; } - ivas_dirac_free_mem( &( hDirAC->stack_mem ) ); - - free( *hDirAC_out ); - *hDirAC_out = NULL; - return; } @@ -1243,9 +1487,12 @@ void ivas_dirac_dec_close( static ivas_error ivas_dirac_alloc_mem( DIRAC_DEC_HANDLE hDirAC, const RENDERER_TYPE renderer_type, - DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem ) + DIRAC_DEC_STACK_MEM_HANDLE hDirAC_mem, + const int16_t hodirac_flag ) { int16_t num_freq_bands, num_freq_bands_diff, size; + int16_t size_ho; + int16_t size_pf; int16_t num_outputs_dir, num_outputs_diff; int16_t num_protos_dir; @@ -1258,6 +1505,16 @@ static ivas_error ivas_dirac_alloc_mem( num_outputs_diff = hDirAC->num_outputs_diff; size = num_freq_bands * num_outputs_dir; + if ( hodirac_flag ) + { + size_ho = size * DIRAC_HO_NUMSECTORS; + size_pf = num_freq_bands * DIRAC_HO_NUMSECTORS; + } + else + { + size_ho = size; + size_pf = num_freq_bands; + } /* PSD related buffers */ hDirAC_mem->cy_auto_dir_smooth = NULL; @@ -1304,7 +1561,7 @@ static ivas_error ivas_dirac_alloc_mem( hDirAC->h_output_synthesis_psd_state.direct_responses_square = hDirAC_mem->direct_responses_square; /* Target and smoothed nrg factors/gains */ - if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + if ( ( hDirAC_mem->cy_cross_dir_smooth = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } @@ -1330,11 +1587,13 @@ static ivas_error ivas_dirac_alloc_mem( hDirAC->h_output_synthesis_psd_state.cy_auto_diff_smooth = hDirAC_mem->cy_auto_diff_smooth; /*Responses (gains/factors)*/ - if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size ) ) == NULL ) + if ( ( hDirAC_mem->direct_responses = (float *) malloc( sizeof( float ) * size_ho ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } set_zero( hDirAC_mem->direct_responses, size ); + + hDirAC->h_output_synthesis_psd_state.direct_responses = hDirAC_mem->direct_responses; /* Prototypes */ @@ -1371,18 +1630,19 @@ static ivas_error ivas_dirac_alloc_mem( /* Gains/power factors*/ hDirAC_mem->direct_power_factor = NULL; hDirAC_mem->diffuse_power_factor = NULL; + if ( renderer_type != RENDERER_BINAURAL_PARAMETRIC && renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && renderer_type != RENDERER_STEREO_PARAMETRIC ) { - if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL ) + if ( ( hDirAC_mem->direct_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } - - if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * num_freq_bands ) ) == NULL ) + if ( ( hDirAC_mem->diffuse_power_factor = (float *) malloc( sizeof( float ) * size_pf ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate stack memory for DirAC\n" ) ); } } + hDirAC->h_output_synthesis_psd_state.direct_power_factor = hDirAC_mem->direct_power_factor; hDirAC->h_output_synthesis_psd_state.diffuse_power_factor = hDirAC_mem->diffuse_power_factor; @@ -1499,18 +1759,20 @@ static void ivas_dirac_free_mem( *------------------------------------------------------------------------*/ void ivas_dirac_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ - int16_t *nb_bits, /* o : number of bits read */ - const SBA_MODE sba_mode, /* i : SBA mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ + int16_t *nb_bits, /* o : number of bits read */ +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode, /* i : SBA mode */ +#endif + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; int16_t next_bit_pos_orig; - *nb_bits = 0; if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) { @@ -1521,13 +1783,15 @@ void ivas_dirac_dec_read_BS( b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) { assert( ( b == 0 ) || ( hQMetaData->q_direction[0].cfg.start_band > 0 ) ); } - +#endif if ( b == 1 ) /* WB 4TCs condition, no other metadata to read*/ { +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) { if ( hDirAC != NULL ) @@ -1552,6 +1816,7 @@ void ivas_dirac_dec_read_BS( } else { +#endif orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; hQMetaData->sba_inactive_mode = 1; @@ -1566,8 +1831,11 @@ void ivas_dirac_dec_read_BS( } } +#ifndef SBA_MODE_CLEAN_UP *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); - +#else + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); +#endif for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; @@ -1585,7 +1853,9 @@ void ivas_dirac_dec_read_BS( } hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; +#ifndef SBA_MODE_CLEAN_UP } +#endif } else { @@ -1600,7 +1870,8 @@ void ivas_dirac_dec_read_BS( hQMetaData->q_direction[0].cfg.nblocks = MAX_PARAM_SPATIAL_SUBFRAMES; } - *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ) ); + *nb_bits += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), + hodirac_flag ); } #ifdef DEBUGGING @@ -1634,10 +1905,15 @@ void ivas_dirac_dec_read_BS( } } +#ifndef SBA_MODE_CLEAN_UP *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); - +#else + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); +#endif +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; @@ -1655,19 +1931,29 @@ void ivas_dirac_dec_read_BS( } hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; +#ifndef SBA_MODE_CLEAN_UP } else { *nb_bits += SID_FORMAT_NBITS; } +#endif st->next_bit_pos = next_bit_pos_orig; } if ( hDirAC != NULL ) { - ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode, dirac_to_spar_md_bands ); +#ifndef SBA_MODE_CLEAN_UP + ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode, + hodirac_flag, + dirac_to_spar_md_bands ); +#else + ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, SBA_FORMAT, + hodirac_flag, + dirac_to_spar_md_bands ); +#endif } return; @@ -1685,23 +1971,33 @@ void ivas_qmetadata_to_dirac( DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */ MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const SBA_MODE sba_mode, /* i : SBA mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode, /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format, /* i : IVAS format */ +#endif + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t block, band; int16_t *seed_ptr; int16_t band_start, band_end, diff_idx; float diffuseness; - int16_t ts_start, ts_end, ts, b, ele, azi; +#ifndef FIX_393_459_460_SBA_MD + int16_t ts_start, ts_end, ts; +#endif + int16_t b, ele, azi; float azimuth, elevation; IVAS_QDIRECTION *q_direction; int16_t *band_mapping; int16_t *band_grouping; int16_t start_band; - int16_t nbands; - int16_t nblocks; + int16_t nbands = 0; + int16_t nblocks = 0; int16_t qBand_idx; + int16_t idx_sec = 0; + int16_t no_secs = 1; q_direction = &( hQMetaData->q_direction[0] ); hDirAC->numSimultaneousDirections = hQMetaData->no_directions; @@ -1788,18 +2084,27 @@ void ivas_qmetadata_to_dirac( } else /* SBA mode/SID/Zero frame*/ { +#ifndef FIX_393_459_460_SBA_MD int16_t num_slots_in_subfr; +#endif int16_t tmp_write_idx_param_band; int16_t tmp_write_idx_band; + float diffuseness_sec = 0.f; +#ifndef FIX_393_459_460_SBA_MD num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; +#endif /* ungroup */ seed_ptr = &hDirAC->dithering_seed; nblocks = q_direction->cfg.nblocks; nbands = hDirAC->band_grouping[hDirAC->hConfig->nbands]; band_grouping = hDirAC->band_grouping; +#ifndef SBA_MODE_CLEAN_UP if ( ivas_total_brate <= IVAS_SID_5k2 && sba_mode != SBA_MODE_SPAR ) +#else + if ( ivas_total_brate <= IVAS_SID_5k2 && ivas_format != SBA_FORMAT ) +#endif { /* SID/zero-frame: 1 direction, 5 bands, nblocks re-generated out of SID decoder*/ start_band = 0; @@ -1809,10 +2114,12 @@ void ivas_qmetadata_to_dirac( } else { - assert( ( hQMetaData->no_directions == 1 ) && "Only 1 direction supported in SBA mode!" ); start_band = hDirAC->hConfig->enc_param_start_band; - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { hDirAC->hConfig->nbands = IVAS_MAX_NUM_BANDS; } @@ -1837,142 +2144,256 @@ void ivas_qmetadata_to_dirac( { band_start = band_grouping[band]; band_end = band_grouping[band + 1]; +#ifdef JBM_TSM_ON_TCS + tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; + + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#else for ( block = 0; block < hDirAC->nb_subframes; block++ ) +#endif { +#ifdef JBM_TSM_ON_TCS +#ifndef FIX_393_459_460_SBA_MD + ts_start = hDirAC->block_grouping[block]; + ts_end = hDirAC->block_grouping[block + 1]; +#endif +#endif for ( b = band_start; b < band_end; b++ ) { +#ifdef JBM_TSM_ON_TCS + tmp_write_idx_band = tmp_write_idx_param_band; +#endif hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; + +#ifdef JBM_TSM_ON_TCS +#ifndef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { +#endif + hDirAC->elevation[tmp_write_idx_band][b] = 0; + hDirAC->azimuth[tmp_write_idx_band][b] = 0; + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; + + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; +#ifndef FIX_393_459_460_SBA_MD + } + else + { + for ( ts = ts_start; ts < ts_end; ts++ ) + { + hDirAC->elevation[tmp_write_idx_band][b] = 0; + hDirAC->azimuth[tmp_write_idx_band][b] = 0; +#if 0 + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; +#endif + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + } + } +#endif +#endif } } } /* Bands with spatial data transmitted */ - - for ( band = start_band; band < nbands; band++ ) + if ( hodirac_flag ) { - band_start = band_grouping[band]; - band_end = band_grouping[band + 1]; - tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; + no_secs = DIRAC_HO_NUMSECTORS; + } - if ( sba_mode == SBA_MODE_SPAR ) - { - qBand_idx = dirac_to_spar_md_bands[band] - start_band; - } - else + for ( idx_sec = 0; idx_sec < no_secs; idx_sec++ ) + { + for ( band = start_band; band < nbands; band++ ) { - qBand_idx = band; - } - diffuseness = 1.0f - q_direction->band_data[qBand_idx].energy_ratio[0]; -#ifdef DEBUG_MODE_DIRAC - dbgwrite( &diffuseness, sizeof( float ), 1, 1, "./res/dirac_dec_diffuseness.dat" ); + band_start = band_grouping[band]; + band_end = band_grouping[band + 1]; + tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; + +#ifndef SBA_MODE_CLEAN_UP + if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) #endif - diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0]; - - for ( block = 0; block < hDirAC->nb_subframes; block++ ) - { - int16_t block_qmetadata; - - ts_start = hDirAC->block_grouping[block]; - ts_end = hDirAC->block_grouping[block + 1]; - - block_qmetadata = min( block, nblocks - 1 ); - block_qmetadata = max( block_qmetadata, 0 ); - - if ( q_direction->band_data[qBand_idx].azimuth[block_qmetadata] < 0.f ) { - q_direction->band_data[qBand_idx].azimuth[block_qmetadata] += 360.f; + qBand_idx = dirac_to_spar_md_bands[band] - start_band; } - azimuth = q_direction->band_data[qBand_idx].azimuth[block_qmetadata]; - elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata]; + else + { + qBand_idx = band; + } + diffuseness = 1.0f - q_direction->band_data[qBand_idx].energy_ratio[0]; +#ifdef DEBUG_MODE_DIRAC + dbgwrite( &diffuseness, sizeof( float ), 1, 1, "./res/dirac_dec_diffuseness.dat" ); +#endif + diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0]; - for ( b = band_start; b < band_end; b++ ) +#ifdef JBM_TSM_ON_TCS + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#else + for ( block = 0; block < hDirAC->nb_subframes; block++ ) +#endif { - tmp_write_idx_band = tmp_write_idx_param_band; - azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); - ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); - /* limit the elevation to [-90, 90] */ - ele = min( 90, ele ); - ele = max( -90, ele ); + int16_t block_qmetadata; - if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) - { - hDirAC->spreadCoherence[tmp_write_idx_band][b] = q_direction->coherence_band_data[qBand_idx].spread_coherence[block] / 255.0f; - } - else +#ifndef FIX_393_459_460_SBA_MD + ts_start = hDirAC->block_grouping[block]; + ts_end = hDirAC->block_grouping[block + 1]; +#endif + + block_qmetadata = min( block, nblocks - 1 ); + block_qmetadata = max( block_qmetadata, 0 ); + + if ( q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] < 0.f ) { - hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata] += 360.f; } - if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) + if ( hMasa == NULL && hodirac_flag ) { - hDirAC->surroundingCoherence[tmp_write_idx_band][b] = hQMetaData->surcoh_band_data[qBand_idx].surround_coherence[0] / 255.0f; + azimuth = q_direction[idx_sec].band_data[qBand_idx].azimuth[block_qmetadata]; + elevation = q_direction[idx_sec].band_data[qBand_idx].elevation[block_qmetadata]; + diffuseness = 1.f - q_direction[0].band_data[qBand_idx].energy_ratio[block_qmetadata]; + diffuseness_sec = q_direction[1].band_data[qBand_idx].energy_ratio[block_qmetadata]; + assert( diffuseness_sec < 1.0001f && diffuseness_sec > -0.0001f ); } else { - hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + azimuth = q_direction->band_data[qBand_idx].azimuth[block_qmetadata]; + elevation = q_direction->band_data[qBand_idx].elevation[block_qmetadata]; } - hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0]; - - if ( hDirAC->hConfig->dec_param_estim == FALSE ) - { - hDirAC->elevation[tmp_write_idx_band][b] = ele; - hDirAC->azimuth[tmp_write_idx_band][b] = azi; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; - } - else + for ( b = band_start; b < band_end; b++ ) { - for ( ts = ts_start; ts < ts_end; ts++ ) + tmp_write_idx_band = tmp_write_idx_param_band; + + if ( hodirac_flag ) { - hDirAC->elevation[tmp_write_idx_band][b] = ele; - hDirAC->azimuth[tmp_write_idx_band][b] = azi; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + azi = (int16_t) ( azimuth + 0.5f ); + ele = (int16_t) ( elevation + 0.5f ); + } + else + { + azi = (int16_t) ( azimuth + rand_triangular_signed( seed_ptr ) * dirac_dithering_azi_scale[diff_idx] + 0.5f ); + ele = (int16_t) ( elevation + rand_triangular_signed( seed_ptr ) * dirac_dithering_ele_scale[diff_idx] + 0.5f ); + /* limit the elevation to [-90, 90] */ + ele = min( 90, ele ); + ele = max( -90, ele ); } - } - } /* for ( band = ...) */ - - tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hDirAC->dirac_md_buffer_length; - - } /* for ( block =...) */ - } -#ifdef DEBUG_MODE_DIRAC - { - for ( block = 0; block < hDirAC->nb_subframes; block++ ) - { - int16_t block_qmetadata; - block_qmetadata = min( block, nblocks - 1 ); - block_qmetadata = max( block_qmetadata, 0 ); - for ( band = start_band; band < nbands; band++ ) - { - dbgwrite( &q_direction->band_data[band].azimuth[block_qmetadata], sizeof( float ), 1, 1, "./res/dirac_dec_azi.dat" ); - dbgwrite( &q_direction->band_data[band].elevation[block_qmetadata], sizeof( float ), 1, 1, "./res/dirac_dec_ele.dat" ); - } - } - } + + if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) + { + hDirAC->spreadCoherence[tmp_write_idx_band][b] = q_direction->coherence_band_data[qBand_idx].spread_coherence[block] / 255.0f; + } + else + { + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + } + + if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) + { + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = hQMetaData->surcoh_band_data[qBand_idx].surround_coherence[0] / 255.0f; + } + else + { + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + } + + hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0]; + +#ifndef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { #endif + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; + + if ( hodirac_flag ) + { + if ( idx_sec == 0 ) + { + hDirAC->elevation[tmp_write_idx_band][b] = ele; + hDirAC->azimuth[tmp_write_idx_band][b] = azi; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0.f; // not in use + } + else + { + assert( idx_sec == 1 ); + hDirAC->elevation2[tmp_write_idx_band][b] = ele; + hDirAC->azimuth2[tmp_write_idx_band][b] = azi; + hDirAC->energy_ratio2[tmp_write_idx_band][b] = 1.f - diffuseness_sec; + } + } + else + { + hDirAC->elevation[tmp_write_idx_band][b] = ele; + hDirAC->azimuth[tmp_write_idx_band][b] = azi; + } +#ifndef FIX_393_459_460_SBA_MD + } + else + { + for ( ts = ts_start; ts < ts_end; ts++ ) + { + hDirAC->elevation[tmp_write_idx_band][b] = ele; + hDirAC->azimuth[tmp_write_idx_band][b] = azi; + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + } + } +#endif + } +#ifdef FIX_393_459_460_SBA_MD + tmp_write_idx_param_band = ( tmp_write_idx_param_band + 1 ) % hDirAC->dirac_md_buffer_length; +#else + tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hDirAC->dirac_md_buffer_length; +#endif + + } /* for ( block =...) */ + } /* for ( band = ...) */ + } /* for ( idx_sec = ...)*/ + /* Bands not transmitted -> zeroed*/ for ( b = band_grouping[band]; b < hDirAC->num_freq_bands; b++ ) { tmp_write_idx_band = hDirAC->dirac_bs_md_write_idx; + +#ifdef JBM_TSM_ON_TCS + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#else for ( block = 0; block < hDirAC->nb_subframes; block++ ) +#endif { +#ifndef FIX_393_459_460_SBA_MD ts_start = hDirAC->block_grouping[block]; ts_end = hDirAC->block_grouping[block + 1]; +#endif hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; hDirAC->energy_ratio1[block][b] = 0; +#ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { +#endif hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; +#ifdef JBM_TSM_ON_TCS + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; +#endif tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; +#ifndef FIX_393_459_460_SBA_MD } else { @@ -1981,22 +2402,107 @@ void ivas_qmetadata_to_dirac( hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; +#ifdef JBM_TSM_ON_TCS + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; +#endif tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } +#endif } } } - /* update buffer write index */ +/* update buffer write index */ +#ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { +#endif hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length; +#ifndef FIX_393_459_460_SBA_MD } else { hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + CLDFB_NO_COL_MAX ) % hDirAC->dirac_md_buffer_length; } +#endif + return; +} + + +#ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------------- + * ivas_dirac_dec_set_md_map() + * + * Set metadata index mapping for DirAC + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_set_md_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +) +{ + int16_t num_slots_in_subfr; + DIRAC_DEC_HANDLE hDirAC; + + hDirAC = st_ivas->hDirAC; +#ifdef DEBUGGING + assert( hDirAC ); +#endif + + /* adapt subframes */ + hDirAC->num_slots = nCldfbTs; + hDirAC->slots_rendered = 0; +#ifndef FIX_393_459_460_SBA_MD + if ( hDirAC->hParamIsm != NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { +#endif + num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; +#ifndef FIX_393_459_460_SBA_MD + } + else + { + num_slots_in_subfr = 1; + } +#endif + hDirAC->subframes_rendered = 0; + + ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hDirAC->subframe_nbslots, &hDirAC->nb_subframes ); + + /* set mapping according to dirac_read_idx */ + + set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + + if ( hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, 0, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_map ); + } + else + { + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hDirAC->dirac_read_idx, hDirAC->dirac_md_buffer_length, hDirAC->render_to_md_map ); + } + + if ( hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + float tmp; + int16_t sf_idx, slot_idx, slot_idx_abs; + + slot_idx_abs = 0; + for ( sf_idx = 0; sf_idx < hDirAC->nb_subframes; sf_idx++ ) + { + tmp = 0.0f; + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[sf_idx]; slot_idx++ ) + { + tmp += (float) hDirAC->render_to_md_map[slot_idx_abs]; + slot_idx_abs++; + } + hDirAC->render_to_md_map[sf_idx] = ( (int16_t) roundf( tmp / (float) hDirAC->subframe_nbslots[sf_idx] ) + hDirAC->dirac_read_idx ) % hDirAC->dirac_md_buffer_length; + } + + set_s( &hDirAC->render_to_md_map[hDirAC->nb_subframes], 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME - hDirAC->nb_subframes ); + } return; } @@ -2009,12 +2515,176 @@ void ivas_qmetadata_to_dirac( *------------------------------------------------------------------------*/ void ivas_dirac_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport /* i : number of transport channels */ +) +{ + int16_t subframe_idx; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + float cng_td_buffer[L_FRAME16k]; + int16_t nchan_out, n, n_samples_sf; + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + + n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * st_ivas->hDirAC->slot_size; + + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] = &output_f[n][0]; + } + + for ( n = 0; n < nchan_transport; n++ ) + { + st_ivas->hTcBuffer->tc[n] = output_f[n]; + } + +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) +#endif + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); + } + + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL ); + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] += n_samples_sf; + } + } + + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + for ( n = 0; n < nchan_transport; n++ ) + { + st_ivas->hTcBuffer->tc[n] = NULL; + } +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) +#endif + { + st_ivas->hTcBuffer->tc[nchan_transport] = NULL; + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec_render() + * + * DirAC decoding renderer process + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, n_samples_sf, ch, nchan_intern; + DIRAC_DEC_HANDLE hDirAC; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hDirAC = st_ivas->hDirAC; + + nchan_intern = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; +#ifdef DEBUGGING + assert( hDirAC ); +#endif + for ( ch = 0; ch < nchan_intern; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hDirAC->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hDirAC->subframe_nbslots[last_sf]; + last_sf++; + } + +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + ivas_dirac_dec_render_sf( st_ivas, output_f_local, nchan_transport, NULL, NULL ); + n_samples_sf = hDirAC->subframe_nbslots[subframe_idx] * st_ivas->hDirAC->slot_size; + for ( ch = 0; ch < nchan_intern; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + if ( hDirAC->slots_rendered == hDirAC->num_slots ) + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + } + + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; + + return; +} +#endif + + +/*------------------------------------------------------------------------- + * ivas_dirac_dec() + * + * DirAC decoding process + *------------------------------------------------------------------------*/ + +#ifndef JBM_TSM_ON_TCS +void ivas_dirac_dec( +#else +void ivas_dirac_dec_render_sf( +#endif + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif const int16_t nchan_transport, /* i : number of transport channels */ float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - const int16_t i_sf ) + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] +#ifndef JBM_TSM_ON_TCS + , + const int16_t i_sf +#endif +) { int16_t i, ch, idx_in, idx_lfe; DIRAC_DEC_HANDLE hDirAC; @@ -2022,9 +2692,15 @@ void ivas_dirac_dec( float surCohEner; float surCohRatio[CLDFB_NO_CHANNELS_MAX]; int16_t subframe_idx; +#ifndef JBM_TSM_ON_TCS int16_t sf1, sf2; +#endif int16_t slot_idx, index_slot; + int16_t hodirac_flag; float *p_Rmat; +#ifdef JBM_TSM_ON_TCS + int16_t slot_idx_start, slot_idx_start_cldfb_synth, md_idx; +#endif /*CLDFB: last output channels reserved to LFT for CICPx*/ float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -2033,12 +2709,29 @@ void ivas_dirac_dec( float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; int16_t index, num_freq_bands; +#ifdef JBM_TSM_ON_TCS + /* local copies of azi, ele, diffuseness */ +#ifdef FIX_393_459_460_SBA_MD + int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; + int16_t elevation[CLDFB_NO_CHANNELS_MAX]; + float diffuseness_vector[CLDFB_NO_CHANNELS_MAX]; +#else + int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float diffuseness_vector[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; +#endif +#endif + DIRAC_DEC_STACK_MEM DirAC_mem; float *reference_power, *reference_power_smooth; float *onset_filter, *onset_filter_subframe, *p_onset_filter = NULL; uint16_t coherence_flag; +#ifndef JBM_TSM_ON_TCS push_wmops( "ivas_dirac_dec" ); +#else + push_wmops( "ivas_dirac_dec_render" ); +#endif /* Initialize aux buffers */ hDirAC = st_ivas->hDirAC; @@ -2050,7 +2743,13 @@ void ivas_dirac_dec( onset_filter = DirAC_mem.onset_filter; onset_filter_subframe = DirAC_mem.onset_filter + hDirAC->num_freq_bands; + hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); + +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT ) +#else if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) +#endif { coherence_flag = st_ivas->hQMetaData->coherence_flag; } @@ -2078,7 +2777,7 @@ void ivas_dirac_dec( #endif /* Subframe loop */ - +#ifndef JBM_TSM_ON_TCS if ( i_sf == -1 ) { sf1 = 0; @@ -2089,624 +2788,1054 @@ void ivas_dirac_dec( sf1 = i_sf; sf2 = i_sf + 1; } +#endif +#ifdef JBM_TSM_ON_TCS + slot_idx_start = hDirAC->slots_rendered; + slot_idx_start_cldfb_synth = 0; +#endif +#ifdef JBM_TSM_ON_TCS + subframe_idx = hDirAC->subframes_rendered; +#else for ( subframe_idx = sf1; subframe_idx < sf2; subframe_idx++ ) { - if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) +#endif +#ifdef JBM_TSM_ON_TCS + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + md_idx = hDirAC->render_to_md_map[subframe_idx]; + } + else + { + md_idx = hDirAC->render_to_md_map[slot_idx_start]; + } +#endif +#ifdef JBM_TSM_ON_TCS + /* Another workaround for self test BE */ +#ifndef FIX_642 + if ( st_ivas->hHeadTrackData && st_ivas->hDecoderConfig->voip_active == 0 ) + { + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); + + p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; + + if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { - set_zero( reference_power_smooth, hDirAC->num_freq_bands ); + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + } } - else + } + else + { + p_Rmat = 0; + } +#endif + + /* copy parameters into local buffers*/ +#ifdef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth, hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation, hDirAC->num_freq_bands ); + mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector, hDirAC->num_freq_bands ); + } + else + { + set_zero( diffuseness_vector, hDirAC->num_freq_bands ); + } +#else + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) { - set_zero( onset_filter_subframe, hDirAC->num_freq_bands ); + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); } + } + else + { + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth[slot_idx], hDirAC->num_freq_bands ); + mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation[slot_idx], hDirAC->num_freq_bands ); + mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); + } + } +#endif +#endif + if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_zero( reference_power_smooth, hDirAC->num_freq_bands ); + } + else + { + set_zero( onset_filter_subframe, hDirAC->num_freq_bands ); + } + +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hHeadTrackData +#ifndef FIX_642 + && st_ivas->hDecoderConfig->voip_active == 1 +#endif + ) +#else if ( st_ivas->hHeadTrackData ) - { - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); +#endif + { + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); - p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; + p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; - if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) + if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; +#ifdef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim == FALSE ) { - num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + } +#else +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) +#endif { +#ifdef JBM_TSM_ON_TCS + rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); +#else + /* note, this seems wrong since it does not take the dirac read ptr into account */ index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); +#endif } - } +#endif } + } +#if defined( JBM_TSM_ON_TCS ) & !defined( FIX_642 ) + else if ( !st_ivas->hHeadTrackData ) +#else else - { - p_Rmat = 0; - } +#endif + { + p_Rmat = 0; + } - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + /* compute response */ + if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { - /* compute response */ - if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands, + ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands, +#ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + diffuseness_vector, +#else + diffuseness_vector[0], +#endif +#else hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], - hDirAC->h_output_synthesis_psd_params.max_band_decorr, - hDirAC->h_output_synthesis_psd_state.direct_power_factor, - hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); +#endif + hDirAC->h_output_synthesis_psd_params.max_band_decorr, + hDirAC->h_output_synthesis_psd_state.direct_power_factor, + hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); - if ( coherence_flag ) + if ( coherence_flag ) + { + for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { - for ( i = 0; i < hDirAC->num_freq_bands; i++ ) - { - dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; + dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; +#ifdef JBM_TSM_ON_TCS + surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[md_idx][i]; +#else surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; - hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; - hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; +#endif + hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; + hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; - surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner ); - } - } - else - { - set_zero( surCohRatio, hDirAC->num_freq_bands ); + surCohRatio[i] = surCohEner / ( 1e-12f + dirEne + surCohEner ); } } else { - ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands, + set_zero( surCohRatio, hDirAC->num_freq_bands ); + } + } + else + { + ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands, +#ifdef JBM_TSM_ON_TCS + hDirAC->diffuseness_vector[md_idx], +#else hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], - hDirAC->h_output_synthesis_psd_params.max_band_decorr, - hDirAC->h_output_synthesis_psd_state.direct_power_factor, - hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); +#endif + hDirAC->h_output_synthesis_psd_params.max_band_decorr, + hDirAC->h_output_synthesis_psd_state.direct_power_factor, + hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); - if ( coherence_flag ) + if ( coherence_flag ) + { + for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { - for ( i = 0; i < hDirAC->num_freq_bands; i++ ) - { +#ifdef JBM_TSM_ON_TCS + surCohRatio[i] = hDirAC->surroundingCoherence[md_idx][i]; +#else surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; - } - } - else - { - set_zero( surCohRatio, hDirAC->num_freq_bands ); +#endif } } - - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) - { - ivas_dirac_dec_compute_directional_responses( hDirAC, - st_ivas->hVBAPdata, - st_ivas->hMasa, - surCohRatio, - st_ivas->hHeadTrackData->shd_rot_max_order, - p_Rmat ); - } else { - ivas_dirac_dec_compute_directional_responses( hDirAC, - st_ivas->hVBAPdata, - st_ivas->hMasa, - surCohRatio, - 0, - 0 ); + set_zero( surCohRatio, hDirAC->num_freq_bands ); } } + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) + { + ivas_dirac_dec_compute_directional_responses( hDirAC, + st_ivas->hVBAPdata, + st_ivas->hMasa, +#ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation, +#else + hDirAC->azimuth[md_idx], + hDirAC->elevation[md_idx], +#endif + md_idx, +#endif + surCohRatio, + st_ivas->hHeadTrackData->shd_rot_max_order, + p_Rmat, + hodirac_flag ); + } + else + { + ivas_dirac_dec_compute_directional_responses( hDirAC, + st_ivas->hVBAPdata, + st_ivas->hMasa, +#ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation, +#else + hDirAC->azimuth[md_idx], + hDirAC->elevation[md_idx], +#endif + md_idx, +#endif + surCohRatio, + 0, + NULL, + hodirac_flag ); + } + } + +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) +#endif + { +#ifdef JBM_TSM_ON_TCS + index_slot = slot_idx_start + slot_idx; + if ( hDirAC->hConfig->dec_param_estim == TRUE ) { + md_idx = hDirAC->render_to_md_map[index_slot]; + } + else + { + md_idx = hDirAC->render_to_md_map[subframe_idx]; + } +#else index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; +#endif +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif + { + for ( ch = 0; ch < nchan_transport; ch++ ) { - for ( ch = 0; ch < nchan_transport; ch++ ) - { - mvr2r( pppQMfFrame_ts_re[ch][slot_idx], Cldfb_RealBuffer[ch][0], hDirAC->num_freq_bands ); - mvr2r( pppQMfFrame_ts_im[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands ); - } + mvr2r( pppQMfFrame_ts_re[ch][slot_idx], Cldfb_RealBuffer[ch][0], hDirAC->num_freq_bands ); + mvr2r( pppQMfFrame_ts_im[ch][slot_idx], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands ); } - else + } + else + { + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) { - /* CLDFB Analysis*/ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - cldfbAnalysis_ts( &( output_f[sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), +#ifdef JBM_TSM_ON_TCS + cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), + Cldfb_RealBuffer[ch][0], + Cldfb_ImagBuffer[ch][0], + hDirAC->num_freq_bands, + st_ivas->cldfbAnaDec[ch] ); +#else + cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); - } +#endif } + } - /* CNG in DirAC, extra CLDFB ana for CNA*/ + /* CNG in DirAC, extra CLDFB ana for CNA*/ +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) +#else if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) - { - Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; +#endif + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; - generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom, - st_ivas->cldfbAnaDec[1], + generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom, + st_ivas->cldfbAnaDec[1], +#ifdef JBM_TSM_ON_TCS + st_ivas->hTcBuffer->tc[1], +#else &( output_f[1][L_FRAME48k - L_FRAME16k] ), - Cldfb_RealBuffer[1][0], - Cldfb_ImagBuffer[1][0], - index_slot, - st->cna_dirac_flag && st->flag_cna, - ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == FD_CNG && st->cng_sba_flag ); - } - - /* LFE synthesis */ - if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled && !( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && hDirAC->hOutSetup.num_lfe == 0 ) ) - { - ivas_lfe_synth_with_cldfb( st_ivas->hMasa->hMasaLfeSynth, - Cldfb_RealBuffer, Cldfb_ImagBuffer, - Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], - slot_idx, +#endif + Cldfb_RealBuffer[1][0], + Cldfb_ImagBuffer[1][0], + index_slot, + st->cna_dirac_flag && st->flag_cna, + ( st->core_brate == FRAME_NO_DATA || st->core_brate == SID_2k40 ) && st->cng_type == FD_CNG && st->cng_sba_flag ); + } + + /* LFE synthesis */ + if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled && !( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && hDirAC->hOutSetup.num_lfe == 0 ) ) + { + ivas_lfe_synth_with_cldfb( st_ivas->hMasa->hMasaLfeSynth, + Cldfb_RealBuffer, Cldfb_ImagBuffer, + Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], + slot_idx, +#ifdef JBM_TSM_ON_TCS + md_idx, +#else subframe_idx, - nchan_transport ); - } +#endif + nchan_transport ); + } - /*-----------------------------------------------------------------* - * protoype signal computation - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) - { - protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f, - reference_power, slot_idx, nchan_transport, - hDirAC->num_outputs_diff, - hDirAC->num_freq_bands, - p_Rmat ); - } - else - { - protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f, - reference_power, slot_idx, nchan_transport, - hDirAC->num_outputs_diff, - hDirAC->num_freq_bands, - 0 ); - } + protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f, + reference_power, slot_idx, nchan_transport, + hDirAC->num_outputs_diff, + hDirAC->num_freq_bands, + p_Rmat ); + } + else + { + protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f, + reference_power, slot_idx, nchan_transport, + hDirAC->num_outputs_diff, + hDirAC->num_freq_bands, + 0 ); } - else if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) + } + else if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) + { + protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + 0, slot_idx, hDirAC->num_freq_bands, hDirAC->masa_stereo_type_detect ); + } + else + { + switch ( nchan_transport ) + { + case 11: + case 8: + case 6: + case 4: + protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, hDirAC->num_outputs_diff, + hDirAC->num_freq_bands, + hDirAC->hoa_decoder, + nchan_transport, + hDirAC->sba_map_tc ); + break; + case 2: + protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + hDirAC->hOutSetup.is_loudspeaker_setup, + slot_idx, + hDirAC->num_freq_bands, + hDirAC->masa_stereo_type_detect ); + break; + case 1: + protoSignalComputation1( Cldfb_RealBuffer, Cldfb_ImagBuffer, + hDirAC->proto_frame_f, + hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, + reference_power, + hDirAC->h_output_synthesis_psd_state.proto_power_smooth, + slot_idx, + hDirAC->num_protos_diff, + hDirAC->num_freq_bands ); + break; + default: + return; + } + } + + + /*-----------------------------------------------------------------* + * Compute DirAC parameters at decoder side + *-----------------------------------------------------------------*/ + + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { +#ifdef FIX_393_459_460_SBA_MD + mvs2s( &hDirAC->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); + mvs2s( &hDirAC->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) { - protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - 0, slot_idx, hDirAC->num_freq_bands, hDirAC->masa_stereo_type_detect ); + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } - else - { - switch ( nchan_transport ) - { - case 8: - case 6: - case 4: - protoSignalComputation4( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, - hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - slot_idx, hDirAC->num_outputs_diff, - hDirAC->num_freq_bands, - hDirAC->hoa_decoder, - nchan_transport ); - break; - case 2: - protoSignalComputation2( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, - hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - hDirAC->hOutSetup.is_loudspeaker_setup, - slot_idx, - hDirAC->num_freq_bands, - hDirAC->masa_stereo_type_detect ); - break; - case 1: - protoSignalComputation1( Cldfb_RealBuffer, Cldfb_ImagBuffer, - hDirAC->proto_frame_f, - hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, - reference_power, - hDirAC->h_output_synthesis_psd_state.proto_power_smooth, - slot_idx, - hDirAC->num_protos_diff, - hDirAC->num_freq_bands ); - break; - default: - return; - } - } - - /*-----------------------------------------------------------------* - * Compute DirAC parameters at decoder side - *-----------------------------------------------------------------*/ - - if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { - hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ - - index = hDirAC->index_buffer_intensity; +#endif - num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ - computeIntensityVector_dec( Cldfb_RealBuffer, - Cldfb_ImagBuffer, - num_freq_bands, - hDirAC->buffer_intensity_real[0][index - 1], - hDirAC->buffer_intensity_real[1][index - 1], - hDirAC->buffer_intensity_real[2][index - 1] ); + index = hDirAC->index_buffer_intensity; - computeDirectionAngles( hDirAC->buffer_intensity_real[0][index - 1], - hDirAC->buffer_intensity_real[1][index - 1], - hDirAC->buffer_intensity_real[2][index - 1], + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + + computeIntensityVector_dec( Cldfb_RealBuffer, + Cldfb_ImagBuffer, num_freq_bands, + hDirAC->buffer_intensity_real[0][index - 1], + hDirAC->buffer_intensity_real[1][index - 1], + hDirAC->buffer_intensity_real[2][index - 1] ); + computeDirectionAngles( hDirAC->buffer_intensity_real[0][index - 1], + hDirAC->buffer_intensity_real[1][index - 1], + hDirAC->buffer_intensity_real[2][index - 1], + num_freq_bands, +#ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation +#else + azimuth[slot_idx], + elevation[slot_idx] +#endif +#else hDirAC->azimuth[hDirAC->dirac_estimator_idx], - hDirAC->elevation[hDirAC->dirac_estimator_idx] ); - - mvr2r( reference_power, &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + hDirAC->elevation[hDirAC->dirac_estimator_idx] +#endif + ); + + mvr2r( reference_power, &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + + computeDiffuseness( hDirAC->buffer_intensity_real, + hDirAC->buffer_energy, + num_freq_bands, +#ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + hDirAC->diffuseness_vector[md_idx] +#else + diffuseness_vector[slot_idx] +#endif +#else + hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] +#endif + ); - computeDiffuseness( hDirAC->buffer_intensity_real, - hDirAC->buffer_energy, - num_freq_bands, - hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] ); - hDirAC->dirac_estimator_idx = ( hDirAC->dirac_estimator_idx + 1 ) % hDirAC->dirac_md_buffer_length; - } +#ifndef JBM_TSM_ON_TCS + hDirAC->dirac_estimator_idx = ( hDirAC->dirac_estimator_idx + 1 ) % hDirAC->dirac_md_buffer_length; +#endif + } #ifdef DEBUG_MODE_DIRAC - { - static FILE *fp_direction_vector = NULL, *fp_diffuseness = NULL, *fp_referencePower = NULL; + { + static FILE *fp_direction_vector = NULL, *fp_diffuseness = NULL, *fp_referencePower = NULL; - if ( fp_direction_vector == NULL ) - fp_direction_vector = fopen( "./res/dbg_direction_vector_C_dec.bin", "wb" ); - if ( fp_diffuseness == NULL ) - fp_diffuseness = fopen( "./res/dbg_diffuseness_C_dec.bin", "wb" ); - if ( fp_referencePower == NULL ) - fp_referencePower = fopen( "./res/dbg_reference_power_C_dec.bin", "wb" ); + if ( fp_direction_vector == NULL ) + fp_direction_vector = fopen( "./res/dbg_direction_vector_C_dec.bin", "wb" ); + if ( fp_diffuseness == NULL ) + fp_diffuseness = fopen( "./res/dbg_diffuseness_C_dec.bin", "wb" ); + if ( fp_referencePower == NULL ) + fp_referencePower = fopen( "./res/dbg_reference_power_C_dec.bin", "wb" ); - for ( i = 0; i < hDirAC->num_freq_bands; i++ ) - { - float radius_length; - float dv[3]; + for ( i = 0; i < hDirAC->num_freq_bands; i++ ) + { + float radius_length; + float dv[3]; - if ( hDirAC->hConfig->dec_param_estim == FALSE ) - { - radius_length = cos( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 ); - dv[0] = radius_length * cos( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 ); - dv[1] = radius_length * sin( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 ); - dv[2] = sin( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 ); - - fwrite( dv, sizeof( float ), 3, fp_direction_vector ); - fwrite( &( hDirAC->diffuseness_vector[0][i] ), sizeof( float ), 1, fp_diffuseness ); - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - reference_power[i] = Cldfb_RealBuffer[0][0][i] * Cldfb_RealBuffer[0][0][i] + Cldfb_ImagBuffer[0][0][i] * Cldfb_ImagBuffer[0][0][i]; - } - fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower ); - } - else + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + radius_length = cos( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 ); + dv[0] = radius_length * cos( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 ); + dv[1] = radius_length * sin( hDirAC->azimuth[subframe_idx][i] * PI_OVER_180 ); + dv[2] = sin( hDirAC->elevation[subframe_idx][i] * PI_OVER_180 ); + + fwrite( dv, sizeof( float ), 3, fp_direction_vector ); + fwrite( &( hDirAC->diffuseness_vector[0][i] ), sizeof( float ), 1, fp_diffuseness ); + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - radius_length = cos( hDirAC->elevation[index_slot][i] * PI_OVER_180 ); - dv[0] = radius_length * cos( hDirAC->azimuth[index_slot][i] * PI_OVER_180 ); - dv[1] = radius_length * sin( hDirAC->azimuth[index_slot][i] * PI_OVER_180 ); - dv[2] = sin( hDirAC->elevation[index_slot][i] * PI_OVER_180 ); - - fwrite( dv, sizeof( float ), 3, fp_direction_vector ); - fwrite( &( hDirAC->diffuseness_vector[index_slot][i] ), sizeof( float ), 1, fp_diffuseness ); - fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower ); + reference_power[i] = Cldfb_RealBuffer[0][0][i] * Cldfb_RealBuffer[0][0][i] + Cldfb_ImagBuffer[0][0][i] * Cldfb_ImagBuffer[0][0][i]; } + fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower ); + } + else + { + radius_length = cos( hDirAC->elevation[index_slot][i] * PI_OVER_180 ); + dv[0] = radius_length * cos( hDirAC->azimuth[index_slot][i] * PI_OVER_180 ); + dv[1] = radius_length * sin( hDirAC->azimuth[index_slot][i] * PI_OVER_180 ); + dv[2] = sin( hDirAC->elevation[index_slot][i] * PI_OVER_180 ); + + fwrite( dv, sizeof( float ), 3, fp_direction_vector ); + fwrite( &( hDirAC->diffuseness_vector[index_slot][i] ), sizeof( float ), 1, fp_diffuseness ); + fwrite( &( reference_power[i] ), sizeof( float ), 1, fp_referencePower ); } } + } #endif - /*-----------------------------------------------------------------* - * frequency domain decorrelation - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ - if ( hDirAC->proto_signal_decorr_on == 1 ) + if ( hDirAC->proto_signal_decorr_on == 1 ) + { + /* decorrelate prototype frame */ + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - /* decorrelate prototype frame */ - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, - hDirAC->num_outputs_diff, - hDirAC->num_protos_diff, - hDirAC->synthesisConf, - nchan_transport, - hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff, - hDirAC->num_protos_diff, - hDirAC->proto_index_diff, - hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff + 2 * hDirAC->num_freq_bands * min( 4, nchan_transport ), - onset_filter, - hDirAC->h_freq_domain_decorr_ap_params, - hDirAC->h_freq_domain_decorr_ap_state ); - - v_multc( onset_filter, 0.25f, onset_filter, hDirAC->num_freq_bands ); - v_add( onset_filter, onset_filter_subframe, onset_filter_subframe, hDirAC->num_freq_bands ); - p_onset_filter = onset_filter_subframe; - } - else - { - ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, - hDirAC->num_outputs_diff, - hDirAC->num_protos_diff, - hDirAC->synthesisConf, - nchan_transport, - hDirAC->proto_frame_f, - hDirAC->num_protos_diff, - hDirAC->proto_index_diff, - DirAC_mem.frame_dec_f, - onset_filter, - hDirAC->h_freq_domain_decorr_ap_params, - hDirAC->h_freq_domain_decorr_ap_state ); - - hDirAC->proto_frame_dec_f = DirAC_mem.frame_dec_f; - p_onset_filter = onset_filter; - } + ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, + hDirAC->num_outputs_diff, + hDirAC->num_protos_diff, + hDirAC->synthesisConf, + nchan_transport, + hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff, + hDirAC->num_protos_diff, + hDirAC->proto_index_diff, + hDirAC->h_output_synthesis_psd_state.proto_diffuse_buffer_f + slot_idx * 2 * hDirAC->num_freq_bands * hDirAC->num_outputs_diff + 2 * hDirAC->num_freq_bands * min( 4, nchan_transport ), + onset_filter, + hDirAC->h_freq_domain_decorr_ap_params, + hDirAC->h_freq_domain_decorr_ap_state ); + + v_multc( onset_filter, 0.25f, onset_filter, hDirAC->num_freq_bands ); + v_add( onset_filter, onset_filter_subframe, onset_filter_subframe, hDirAC->num_freq_bands ); + p_onset_filter = onset_filter_subframe; } else { - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - set_f( onset_filter_subframe, 1.f, hDirAC->num_freq_bands ); - p_onset_filter = onset_filter_subframe; - } - else - { - /* no frequency domain decorrelation: use prototype frame */ - hDirAC->proto_frame_dec_f = hDirAC->proto_frame_f; - p_onset_filter = NULL; - } + ivas_dirac_dec_decorr_process( hDirAC->num_freq_bands, + hDirAC->num_outputs_diff, + hDirAC->num_protos_diff, + hDirAC->synthesisConf, + nchan_transport, + hDirAC->proto_frame_f, + hDirAC->num_protos_diff, + hDirAC->proto_index_diff, + DirAC_mem.frame_dec_f, + onset_filter, + hDirAC->h_freq_domain_decorr_ap_params, + hDirAC->h_freq_domain_decorr_ap_state ); + + hDirAC->proto_frame_dec_f = DirAC_mem.frame_dec_f; + p_onset_filter = onset_filter; } - - /*-----------------------------------------------------------------* - * output synthesis - *-----------------------------------------------------------------*/ - - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + } + else + { + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + set_f( onset_filter_subframe, 1.f, hDirAC->num_freq_bands ); + p_onset_filter = onset_filter_subframe; + } + else { - /*Compute diffuse prototypes*/ - ivas_dirac_dec_compute_diffuse_proto( hDirAC, slot_idx ); + /* no frequency domain decorrelation: use prototype frame */ + hDirAC->proto_frame_dec_f = hDirAC->proto_frame_f; + p_onset_filter = NULL; } + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_LS || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD ) + { + /*Compute diffuse prototypes*/ + ivas_dirac_dec_compute_diffuse_proto( hDirAC, slot_idx ); + } - /*Compute PSDs*/ - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 2 ) + /*Compute PSDs*/ +#ifndef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 2 ) + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + hDirAC, + p_Rmat, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ); + } + else + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, + hDirAC, + 0, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + st_ivas->sba_analysis_order > 1 && + st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k + + ); + } +#else + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation, + hDirAC->diffuseness_vector[md_idx], +#else + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], +#endif hDirAC, + st_ivas->hHeadTrackData->shd_rot_max_order, p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport ); + nchan_transport, + md_idx, + hodirac_flag + + ); } else { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, +#ifdef FIX_393_459_460_SBA_MD + azimuth, + elevation, + hDirAC->diffuseness_vector[md_idx], +#else + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], +#endif hDirAC, 0, + 0, st_ivas->hVBAPdata, hDirAC->hOutSetup, - nchan_transport ); + nchan_transport, + md_idx, + hodirac_flag ); } +#endif - if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) - { - v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands ); - } +#ifdef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim ) + { + float fac = 1.0f / (float) hDirAC->subframe_nbslots[subframe_idx]; + v_multc_acc( hDirAC->diffuseness_vector[md_idx], fac, diffuseness_vector, hDirAC->num_freq_bands ); + } +#endif - if ( hDirAC->hConfig->dec_param_estim ) - { - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; - } + if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) + { + v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands ); } - if ( hDirAC->hConfig->dec_param_estim == 0 ) +#ifndef JBM_TSM_ON_TCS + if ( hDirAC->hConfig->dec_param_estim ) { hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; } +#endif + } - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) +#ifndef JBM_TSM_ON_TCS + if ( hDirAC->hConfig->dec_param_estim == 0 ) + { + hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; + } +#endif +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); + +#ifndef FIX_393_459_460_SBA_MD + if ( hDirAC->hConfig->dec_param_estim == FALSE ) + { + md_idx = hDirAC->render_to_md_map[subframe_idx]; + } + else + { + md_idx = hDirAC->render_to_md_map[slot_idx_start]; + } +#endif + +#ifndef FIX_393_459_460_SBA_MD + /* Workaround for BE (should be gone when #393 is adressed and diffuseness index in the gain SHD renderer with HO-DirAC is fixed) */ + /* :TODO: remove */ + /* get the correct md index for the diffuseness in direction smoothing and HO-DirAC, it is always the first slot of the next subframe*/ + if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) + { + /* we are at the end, get the next one using the normal dirac read idx...*/ + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; + } + else { - ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer, - Cldfb_ImagBuffer, - hDirAC, - nchan_transport, - p_onset_filter ); + md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; + } + } + else + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; } else { - /* Determine encoding quality based additional smoothing factor */ - float qualityBasedSmFactor = 1.0f; - if ( st_ivas->hMasa != NULL ) + md_idx = hDirAC->render_to_md_map[subframe_idx + 1]; + } + } +#endif + +#endif + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hDirAC, + nchan_transport, +#ifdef JBM_TSM_ON_TCS + hDirAC->subframe_nbslots[subframe_idx], +#endif + p_onset_filter, +#ifdef FIX_393_459_460_SBA_MD + diffuseness_vector, +#else +#ifdef JBM_TSM_ON_TCS + md_idx, +#endif +#endif + hodirac_flag ); + } + else + { + /* Determine encoding quality based additional smoothing factor */ + float qualityBasedSmFactor = 1.0f; + + if ( st_ivas->hMasa != NULL ) + { + qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; + qualityBasedSmFactor *= qualityBasedSmFactor; + } + +#ifdef JBM_TSM_ON_TCS +#ifndef FIX_393_459_460_SBA_MD + /* Workaround for BE (should be gone when #393 is adressed) */ + if ( hDirAC->hConfig->dec_param_estim == 1 ) + { + num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) { - qualityBasedSmFactor = st_ivas->hMasa->data.dir_decode_quality; - qualityBasedSmFactor *= qualityBasedSmFactor; + mvs2s( azimuth[slot_idx], hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); + mvs2s( elevation[slot_idx], hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); + mvr2r( diffuseness_vector[slot_idx], hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); } - - ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, - Cldfb_ImagBuffer, - hDirAC, - reference_power_smooth, - qualityBasedSmFactor ); } +#endif - /*-----------------------------------------------------------------* - * CLDFB synthesis (and binaural rendering) - *-----------------------------------------------------------------*/ +#endif + ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, + Cldfb_ImagBuffer, + hDirAC, +#ifdef JBM_TSM_ON_TCS + hDirAC->subframe_nbslots[subframe_idx], +#ifdef FIX_393_459_460_SBA_MD + diffuseness_vector, +#else + md_idx, +#endif +#endif + reference_power_smooth, + qualityBasedSmFactor ); + } + + /*-----------------------------------------------------------------* + * CLDFB synthesis (and binaural rendering) + *-----------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS + index_slot = slot_idx_start_cldfb_synth; +#else index_slot = subframe_idx * hDirAC->subframe_nbslots; +#endif - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - /* Perform binaural rendering */ - ivas_binRenderer( st_ivas->hBinRenderer, - st_ivas->hHeadTrackData, - Cldfb_RealBuffer_Binaural, - Cldfb_ImagBuffer_Binaural, - Cldfb_RealBuffer, - Cldfb_ImagBuffer ); + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* Perform binaural rendering */ + ivas_binRenderer( st_ivas->hBinRenderer, + st_ivas->hHeadTrackData, +#ifdef JBM_TSM_ON_TCS + hDirAC->subframe_nbslots[subframe_idx], +#endif + Cldfb_RealBuffer_Binaural, + Cldfb_ImagBuffer_Binaural, + Cldfb_RealBuffer, + Cldfb_ImagBuffer ); - /* Inverse CLDFB*/ - for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) - { - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ - float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + /* Inverse CLDFB*/ + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; - ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; - } +#endif + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } +#ifdef JBM_TSM_ON_TCS + cldfbSynthesis( RealBuffer, + ImagBuffer, + &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), + hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], + st_ivas->cldfbSynDec[ch] ); +#else cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[ch] ); - } +#endif } + } +#ifdef SBA_MODE_CLEAN_UP + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#else else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif + { + for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ ) { - for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ ) - { +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) - { - mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands ); - mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hDirAC->num_freq_bands ); - } +#endif + { + mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands ); + mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hDirAC->num_freq_bands ); } } - else - { - float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; - int16_t outchannels; + } + else + { + float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t outchannels; - idx_in = 0; - idx_lfe = 0; + idx_in = 0; + idx_lfe = 0; - outchannels = hDirAC->hOutSetup.nchan_out_woLFE + hDirAC->hOutSetup.num_lfe; - if ( hDirAC->hOutSetup.separateChannelEnabled && ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1 || - hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1 || - hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_2 || - hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_4 || - hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1_4 || - ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) ) - { - outchannels++; - } + outchannels = hDirAC->hOutSetup.nchan_out_woLFE + hDirAC->hOutSetup.num_lfe; + if ( hDirAC->hOutSetup.separateChannelEnabled && ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1 || + hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1 || + hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_2 || + hDirAC->hOutSetup.output_config == AUDIO_CONFIG_5_1_4 || + hDirAC->hOutSetup.output_config == AUDIO_CONFIG_7_1_4 || + ( hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hLsSetupCustom->separate_ch_found ) ) ) + { + outchannels++; + } - if ( hDirAC->hOutSetup.separateChannelEnabled && hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM ) - { - float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; - const int16_t subframe_start_sample = index_slot * hDirAC->num_freq_bands; + if ( hDirAC->hOutSetup.separateChannelEnabled && hDirAC->hOutSetup.output_config == AUDIO_CONFIG_LS_CUSTOM ) + { + float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + const int16_t subframe_start_sample = index_slot * hDirAC->num_freq_bands; +#ifdef JBM_TSM_ON_TCS + const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx]; +#else const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots; +#endif - /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ - mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe ); - mvr2r( &( output_f[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe, num_samples_subframe ); + /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ + mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe ); + mvr2r( &( output_f[LFE_CHANNEL][subframe_start_sample] ), tmp_lfe, num_samples_subframe ); - for ( ch = 0; ch < outchannels; ch++ ) + for ( ch = 0; ch < outchannels; ch++ ) + { + if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) ) { - if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) ) - { - /* Move the LFE channel to the correct place */ - mvr2r( tmp_lfe, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + /* Move the LFE channel to the correct place */ + mvr2r( tmp_lfe, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); - if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) - { - idx_lfe++; - } - } - else if ( ( st_ivas->hLsSetupCustom->separate_ch_found ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) ) + if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) { - /* Move the separated channel to the correct place. Thus, the separated channel is - * combined with the synthesized channels here when there is a matching channel. */ - mvr2r( tmp_separated, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + idx_lfe++; } - else - { - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + } + else if ( ( st_ivas->hLsSetupCustom->separate_ch_found ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) ) + { + /* Move the separated channel to the correct place. Thus, the separated channel is + * combined with the synthesized channels here when there is a matching channel. */ + mvr2r( tmp_separated, &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); + } + else + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; - } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] ); - - if ( !st_ivas->hLsSetupCustom->separate_ch_found ) - { - /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel - * is combined with the synthesized channels here when there is no matching channel. */ - v_multc_acc( tmp_separated, st_ivas->hLsSetupCustom->separate_ch_gains[idx_in], &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); - } +#endif + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][subframe_start_sample] ), num_samples_subframe, st_ivas->cldfbSynDec[idx_in] ); - idx_in++; + if ( !st_ivas->hLsSetupCustom->separate_ch_found ) + { + /* Pan the separated channel and mix with the synthesized channels. Thus, the separated channel + * is combined with the synthesized channels here when there is no matching channel. */ + v_multc_acc( tmp_separated, st_ivas->hLsSetupCustom->separate_ch_gains[idx_in], &( output_f[ch][subframe_start_sample] ), num_samples_subframe ); } + + idx_in++; } } - else + } + else + { + for ( ch = 0; ch < outchannels; ch++ ) { - for ( ch = 0; ch < outchannels; ch++ ) + if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) ) { - if ( ( hDirAC->hOutSetup.num_lfe > 0 ) && ( hDirAC->hOutSetup.index_lfe[idx_lfe] == ch ) ) + if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled ) { - if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled ) - { +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i]; - } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); - } - else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled ) - { - /* LFE has been synthesized in the time domain, do nothing. */ - } - else - { - set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); - } - - if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) +#endif { - idx_lfe++; + RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i]; } +#ifdef JBM_TSM_ON_TCS + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); +#else + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); +#endif } - else if ( ( hDirAC->hOutSetup.separateChannelEnabled ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) ) + else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled ) { - /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated - * channel is combined with the synthesized channels here. */ + /* LFE has been synthesized in the time domain, do nothing. */ } else { - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#ifdef JBM_TSM_ON_TCS + set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); +#else + set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); +#endif + } + + if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ( hDirAC->hOutSetup.separateChannelEnabled ) && ( hDirAC->hOutSetup.separateChannelIndex == ch ) ) + { + /* The separated channel is already set to output_f[hOutSetup.separateChannelIndex]. Thus, the separated + * channel is combined with the synthesized channels here. */ + } + else + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; - } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); - idx_in++; +#endif + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; } +#ifdef JBM_TSM_ON_TCS + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[idx_in] ); +#else + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); +#endif + idx_in++; } } } } +#ifdef JBM_TSM_ON_TCS + hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx]; + hDirAC->subframes_rendered++; +#endif +#ifndef JBM_TSM_ON_TCS +} +#endif - pop_wmops(); +pop_wmops(); - return; +return; } @@ -3394,7 +4523,8 @@ static void protoSignalComputation4( const int16_t num_outputs_diff, const int16_t num_freq_bands, const float *mtx_hoa_decoder, - const int16_t nchan_transport ) + const int16_t nchan_transport, + const int16_t *sba_map_tc_ind ) { int16_t k, l; int16_t n; @@ -3420,8 +4550,8 @@ static void protoSignalComputation4( proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] = 0.f; for ( n = 0; n < nchan_transport; n++ ) { - proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; - proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc[n]]; + proto_frame_f[2 * l * num_freq_bands + 2 * k] += RealBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; + proto_frame_f[2 * l * num_freq_bands + 2 * k + 1] += ImagBuffer[n][0][k] * mtx_hoa_decoder[l * 16 + sba_map_tc_ind[n]]; } } } diff --git a/lib_dec/ivas_dirac_decorr_dec.c b/lib_dec/ivas_dirac_decorr_dec.c index bcaa6cf2a1..8c19d9698b 100644 --- a/lib_dec/ivas_dirac_decorr_dec.c +++ b/lib_dec/ivas_dirac_decorr_dec.c @@ -156,7 +156,7 @@ ivas_error ivas_dirac_dec_decorr_open( freq_domain_decorr_ap_params->max_frequency = ( DIRAC_MAX_DECORR_CLDFB_BANDS * 24000 ) / CLDFB_NO_CHANNELS_MAX; } - freq_domain_decorr_ap_params->use_ducker = 1; /* fcs: fixed for now but can be adaptive in an extended version */ + freq_domain_decorr_ap_params->use_ducker = 1; /* ToDo: fcs: fixed for now but can be adaptive in an extended version */ assert( ( freq_domain_decorr_ap_params->max_frequency >= 0 ) && ( freq_domain_decorr_ap_params->max_frequency <= output_Fs / 2 ) && "Error: max_frequency invalid!" ); diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index a2fc9ee821..ffe6fea382 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -104,13 +104,25 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in ); set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); + +#ifdef JBM_TSM_ON_TCS + if ( ( h_dirac_output_synthesis_state->mixing_matrix[idx] = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) ); + } + set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); +#endif } for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { h_dirac_output_synthesis_state->cx_old[idx] = NULL; h_dirac_output_synthesis_state->cy_old[idx] = NULL; h_dirac_output_synthesis_state->mixing_matrix_old[idx] = NULL; +#ifdef JBM_TSM_ON_TCS + h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL; +#endif } + for ( idx = 0; idx < num_param_bands_residual; idx++ ) { if ( ( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL ) @@ -118,10 +130,21 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis covariance\n" ) ); } set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); + +#ifdef JBM_TSM_ON_TCS + if ( ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) ); + } + set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); +#endif } for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; +#ifdef JBM_TSM_ON_TCS + h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL; +#endif } /*-----------------------------------------------------------------* @@ -145,6 +168,30 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( } +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_dirac_dec_output_synthesis_get_interpolator() + * + * + *-------------------------------------------------------------------*/ + +void ivas_dirac_dec_output_synthesis_get_interpolator( + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ + const uint16_t interp_length /* i : interpolator length */ +) +{ + int16_t idx; + + for ( idx = 1; idx <= interp_length; ++idx ) + { + h_dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) interp_length; + } + + return; +} +#endif + + /*-------------------------------------------------------------------* * ivas_dirac_dec_output_synthesis_cov_init() * @@ -168,11 +215,17 @@ void ivas_dirac_dec_output_synthesis_cov_init( set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in ); set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); +#ifdef JBM_TSM_ON_TCS + set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); +#endif } for ( idx = 0; idx < n_param_bands_res; idx++ ) { set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); +#ifdef JBM_TSM_ON_TCS + set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); +#endif } return; @@ -243,6 +296,20 @@ void ivas_dirac_dec_output_synthesis_cov_close( free( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] ); h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; } + +#ifdef JBM_TSM_ON_TCS + if ( h_dirac_output_synthesis_state->mixing_matrix[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->mixing_matrix[idx] ); + h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL; + } + + if ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] != NULL ) + { + free( h_dirac_output_synthesis_state->mixing_matrix_res[idx] ); + h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL; + } +#endif } return; @@ -256,13 +323,21 @@ void ivas_dirac_dec_output_synthesis_cov_close( *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( - float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ +#ifdef JBM_TSM_ON_TCS + float *RealBuffer, /* i : input channel filter bank samples (real part) */ + float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ +#else + float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ + float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ +#endif float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ - const int16_t nchan_in, /* i : number of input channels */ - const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ + const int16_t nchan_in /* i : number of input channels */ +#ifndef JBM_TSM_ON_TCS + , + const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ +#endif ) { int16_t param_band, band_idx, ch_idx; @@ -288,8 +363,13 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( int16_t band = brange[0] + band_idx; for ( ch_idx = 0; ch_idx < nchan_in; ch_idx++ ) { +#ifdef JBM_TSM_ON_TCS + real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx * hParamMC->num_freq_bands + band]; + imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx * hParamMC->num_freq_bands + band]; +#else real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx][idx_slot][band]; imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx][idx_slot][band]; +#endif } } @@ -312,17 +392,27 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( - float Cldfb_RealBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float Cldfb_ImagBuffer_in[][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part) */ - float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ - float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ +#ifdef JBM_TSM_ON_TCS + float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ + float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ +#else + float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ + float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ +#endif + float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ + float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ + float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ +#else float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ - const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ - const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ - const int16_t nX, /* i : number of input channels */ - const int16_t nY, /* i : number of output channels */ - PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ +#endif + const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const int16_t nX, /* i : number of input channels */ + const int16_t nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ ) { int16_t param_band_idx, band, ch_idx; @@ -407,8 +497,13 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( /* collect input signals, still in cldfb buffers */ for ( ch_idx = 0; ch_idx < nX; ch_idx++ ) { +#ifdef JBM_TSM_ON_TCS + input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx * hParamMC->num_freq_bands + band]; + input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx * hParamMC->num_freq_bands + band]; +#else input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx][slot_idx_tot][band]; input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx][slot_idx_tot][band]; +#endif } /* apply mixing matrix */ diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c old mode 100644 new mode 100755 index 362b63c04b..33004c540c --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -87,13 +87,16 @@ static void normalizePanningGains( float *direct_response, const int16_t num_cha *------------------------------------------------------------------------*/ ivas_error ivas_dirac_dec_output_synthesis_open( - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ - RENDERER_TYPE renderer_type, /* i : renderer type */ - const int16_t nchan_transport, /* i : number of transport channels*/ - const int32_t output_Fs /* i : output sampling rate */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ + RENDERER_TYPE renderer_type, /* i : renderer type */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int32_t output_Fs /* i : output sampling rate */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { int16_t idx, ch_idx; + int16_t size; float tmp; uint16_t num_diffuse_responses; float temp_alpha_synthesis[CLDFB_NO_CHANNELS_MAX]; @@ -161,13 +164,25 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* buffer length and interpolator */ +#ifdef JBM_TSM_ON_TCS + if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( JBM_CLDFB_SLOTS_IN_SUBFRAME * sizeof( float ) ) ) == NULL ) +#else if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( hDirAC->subframe_nbslots * sizeof( float ) ) ) == NULL ) +#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } /* target PSD buffers */ - if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * sizeof( float ) ) ) == NULL ) + if ( hodirac_flag ) + { + size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS; + } + else + { + size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir; + } + if ( ( dirac_output_synthesis_state->cy_cross_dir_smooth_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } @@ -204,7 +219,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* direct and diffuse gain buffers */ - if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( hDirAC->num_freq_bands * hDirAC->num_outputs_dir * sizeof( float ) ) ) == NULL ) + if ( ( dirac_output_synthesis_state->gains_dir_prev = (float *) malloc( size * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } @@ -272,9 +287,17 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* compute interpolator */ +#ifdef JBM_TSM_ON_TCS + for ( idx = 1; idx <= JBM_CLDFB_SLOTS_IN_SUBFRAME; ++idx ) +#else for ( idx = 1; idx <= hDirAC->subframe_nbslots; ++idx ) +#endif { +#ifdef JBM_TSM_ON_TCS + dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) JBM_CLDFB_SLOTS_IN_SUBFRAME; +#else dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) hDirAC->subframe_nbslots; +#endif } /* prepare diffuse response function */ @@ -346,8 +369,12 @@ ivas_error ivas_dirac_dec_output_synthesis_open( void ivas_dirac_dec_output_synthesis_init( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { + int16_t size; + DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; @@ -364,7 +391,16 @@ void ivas_dirac_dec_output_synthesis_init( set_zero( h_dirac_output_synthesis_state->cy_auto_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); } - set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); + if ( hodirac_flag ) + { + size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir * DIRAC_HO_NUMSECTORS; + } + else + { + size = hDirAC->num_freq_bands * hDirAC->num_outputs_dir; + } + set_zero( h_dirac_output_synthesis_state->cy_cross_dir_smooth_prev, size ); + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { set_zero( h_dirac_output_synthesis_state->cy_auto_diff_smooth_prev, h_dirac_output_synthesis_params->max_band_decorr * hDirAC->num_outputs_diff ); @@ -382,8 +418,7 @@ void ivas_dirac_dec_output_synthesis_init( { set_zero( h_dirac_output_synthesis_state->proto_power_smooth_prev, hDirAC->num_freq_bands * hDirAC->num_protos_dir ); } - - set_zero( h_dirac_output_synthesis_state->gains_dir_prev, hDirAC->num_freq_bands * hDirAC->num_outputs_dir ); + set_zero( h_dirac_output_synthesis_state->gains_dir_prev, size ); if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -511,13 +546,27 @@ void ivas_dirac_dec_output_synthesis_close( *------------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_process_slot( - const float *reference_power, /* i : Estimated power */ - const float *onset, /* i : onset filter */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ + const float *reference_power, /* i : Estimated power */ + const float *onset, /* i : onset filter */ +#ifdef JBM_TSM_ON_TCS + const int16_t *azimuth, + const int16_t *elevation, + const float *diffuseness, +#endif + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t sh_rot_max_order, +#endif const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport /* i : number of transport channels*/ +#if defined( JBM_TSM_ON_TCS ) + , + const int16_t md_idx +#endif + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { int16_t num_freq_bands, num_channels_dir; @@ -525,11 +574,15 @@ void ivas_dirac_dec_output_synthesis_process_slot( int16_t ch_idx; float aux_buf[CLDFB_NO_CHANNELS_MAX]; int16_t diff_start_band; +#ifndef JBM_TSM_ON_TCS const float *diffuseness; +#endif DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; +#ifndef JBM_TSM_ON_TCS diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; +#endif h_dirac_output_synthesis_params = &( hDirAC->h_output_synthesis_psd_params ); h_dirac_output_synthesis_state = &( hDirAC->h_output_synthesis_psd_state ); @@ -550,112 +603,195 @@ void ivas_dirac_dec_output_synthesis_process_slot( num_channels_dir = hOutSetup.nchan_out_woLFE; } - if ( hDirAC->hConfig->dec_param_estim == TRUE ) + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD && hodirac_flag ) { - /* compute direct responses */ ivas_dirac_dec_compute_directional_responses( hDirAC, hVBAPdata, NULL, +#ifdef JBM_TSM_ON_TCS + azimuth, + elevation, + md_idx, +#endif NULL, 2, - p_Rmat ); + p_Rmat, + hodirac_flag ); + } + if ( hDirAC->hConfig->dec_param_estim == FALSE && hodirac_flag ) + { if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { +#ifdef JBM_TSM_ON_TCS + v_multc( hDirAC->energy_ratio1[md_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hDirAC->energy_ratio1[md_idx], + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + mvr2r( aux_buf, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + + v_multc( hDirAC->energy_ratio2[md_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hDirAC->energy_ratio2[md_idx], + &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands], + num_freq_bands ); + mvr2r( aux_buf, + &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], + num_freq_bands ); +#else + v_multc( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + mvr2r( aux_buf, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + + v_multc( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); + v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); + mvr2r( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], + &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands], + num_freq_bands ); + mvr2r( aux_buf, + &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], + num_freq_bands ); +#endif + } + else + { +#ifdef JBM_TSM_ON_TCS ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, + hDirAC->diffuseness_vector[md_idx], h_dirac_output_synthesis_params->max_band_decorr, h_dirac_output_synthesis_state->direct_power_factor, h_dirac_output_synthesis_state->diffuse_power_factor ); +#else + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); +#endif + } + } + else // ( hDirAC->hConfig->dec_param_estim == TRUE ) + if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); - + /* compute direct responses */ +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + NULL, + azimuth, + elevation, + md_idx, + NULL, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); +#endif - /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { - int16_t k; - if ( ch_idx != 0 ) - { - float a, b, c; + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) + + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + { + int16_t k; + if ( ch_idx != 0 ) { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + float a, b, c; + + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } } - for ( ; k < num_freq_bands; k++ ) + else { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } } } - else + + /*Directional gain (panning)*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); - } + v_mult( h_dirac_output_synthesis_state->direct_power_factor, + &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], + aux_buf, + num_freq_bands ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); } - } - /*Directional gain (panning)*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) - { - v_mult( h_dirac_output_synthesis_state->direct_power_factor, - &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], - aux_buf, - num_freq_bands ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - num_freq_bands ); - } - /*Diffuse gain*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + /*Diffuse gain*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + aux_buf, + num_freq_bands_diff ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } + + return; + } + else { - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - hDirAC->diffuse_response_function[ch_idx], - aux_buf, - num_freq_bands_diff ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - num_freq_bands_diff ); + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); } - - return; } - else - { - /* compute reference and diffuse power factor for this frame */ - - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); - } - } diff_start_band = 0; if ( h_dirac_output_synthesis_params->use_onset_filters ) @@ -695,7 +831,19 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ - const float *onset_filter ) +#ifdef JBM_TSM_ON_TCS + const int16_t nbslots, /* i : number of slots to process */ +#endif + const float *onset_filter, +#ifdef FIX_393_459_460_SBA_MD + float *diffuseness, +#else +#ifdef JBM_TSM_ON_TCS + const int16_t md_idx, +#endif +#endif + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ +) { int16_t buf_idx, ch_idx, i, l; int16_t num_freq_bands, num_freq_bands_diff; @@ -714,6 +862,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( DIRAC_OUTPUT_SYNTHESIS_STATE h_dirac_output_synthesis_state; int16_t nchan_transport_foa; int16_t ch_idx_diff; + float aux_buf[CLDFB_NO_CHANNELS_MAX]; + float ratio[DIRAC_HO_NUMSECTORS * CLDFB_NO_CHANNELS_MAX]; +#ifndef FIX_393_459_460_SBA_MD + const float *diffuseness; +#endif /* collect some often used parameters */ h_dirac_output_synthesis_params = hDirAC->h_output_synthesis_psd_params; @@ -727,11 +880,72 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( num_channels_diff = hDirAC->num_outputs_diff; nchan_transport_foa = min( 4, nchan_transport ); +#ifndef FIX_393_459_460_SBA_MD +#ifdef JBM_TSM_ON_TCS + diffuseness = hDirAC->diffuseness_vector[md_idx]; +#else + diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; +#endif +#endif + /*-----------------------------------------------------------------* * comput target Gains *-----------------------------------------------------------------*/ - if ( hDirAC->hConfig->dec_param_estim == FALSE ) + if ( hodirac_flag ) + { + assert( hDirAC->hConfig->dec_param_estim == FALSE ); + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + v_multc( diffuseness, + 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + v_multc( &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + h_dirac_output_synthesis_params.diffuse_compensation_factor - 1.f, + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + + for ( l = 0; l < num_freq_bands; l++ ) + { + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] = sqrtf( 1.f + h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + l] ); + } + } + + /*Directional gain*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + aux_buf[l] = 1.f - diffuseness[l]; + ratio[l] = 1.f - h_dirac_output_synthesis_state.direct_power_factor[hDirAC->num_freq_bands + l]; + ratio[l + num_freq_bands] = 1.f - ratio[l]; + } + + v_mult( aux_buf, ratio, ratio, num_freq_bands ); + v_mult( aux_buf, &ratio[num_freq_bands], &ratio[num_freq_bands], num_freq_bands ); + + v_mult( ratio, + &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); + v_mult( &ratio[num_freq_bands], + &h_dirac_output_synthesis_state.direct_responses[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], + &h_dirac_output_synthesis_state.cy_cross_dir_smooth[ch_idx * num_freq_bands + num_freq_bands * num_channels_dir], + num_freq_bands ); + } + + /*Diffuse gain*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state.diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + &h_dirac_output_synthesis_state.cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } + } + else if ( hDirAC->hConfig->dec_param_estim == FALSE ) { /*Direct gain*/ for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) @@ -777,17 +991,35 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth; p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev; - /*Direct gains*/ - for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + /* Direct gains */ + if ( hodirac_flag ) { - for ( l = 0; l < num_freq_bands; l++ ) + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) { - g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); - g2 = ( 1.f - g1 ) * *( p_gains_dir ); - g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); - g2 = max( g2, 0.85f ); - g2 = min( g2, 1.15f ); - *( p_gains_dir++ ) = g2; + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, 0.99f ); + g2 = min( g2, 2.0f ); + *( p_gains_dir++ ) = g2; + } + } + } + else + { + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, 0.85f ); + g2 = min( g2, 1.15f ); + *( p_gains_dir++ ) = g2; + } } } @@ -805,6 +1037,36 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( } } + if ( hodirac_flag ) + { + p_cy_cross_dir_smooth = h_dirac_output_synthesis_state.cy_cross_dir_smooth + num_freq_bands * num_channels_dir; + p_gains_dir = h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev + num_freq_bands * num_channels_dir; + + /*Direct gains*/ + for ( ch_idx = 0; ch_idx < nchan_transport_foa; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + p_cy_cross_dir_smooth++; + p_gains_dir++; + } + } + + /*Directional gains*/ + for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) + { + for ( l = 0; l < num_freq_bands; l++ ) + { + g1 = 0.3679f + onset_filter[l] * ( 0.1175f - 0.3679f ); + g2 = ( 1.f - g1 ) * *( p_gains_dir ); + g2 += g1 * ( *( p_cy_cross_dir_smooth++ ) ); + g2 = max( g2, -DIRAC_GAIN_LIMIT ); + g2 = min( g2, DIRAC_GAIN_LIMIT ); + *( p_gains_dir++ ) = g2; + } + } + } + /*Diffuse gains*/ p_cy_auto_diff_smooth = h_dirac_output_synthesis_state.cy_auto_diff_smooth + nchan_transport_foa * num_freq_bands_diff; p_gains_diff = h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev + nchan_transport_foa * num_freq_bands_diff; @@ -825,7 +1087,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( * gain interpolation and output streams *-----------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS + for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) +#else for ( buf_idx = 0; buf_idx < hDirAC->subframe_nbslots; ++buf_idx ) +#endif { g1 = h_dirac_output_synthesis_params.interpolator[buf_idx]; g2 = 1.f - g1; @@ -847,26 +1113,74 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( /*Directional stream*/ for ( ch_idx = nchan_transport_foa; ch_idx < num_channels_dir; ch_idx++ ) { - p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + - buf_idx * 2 * num_freq_bands * num_protos_dir + - proto_direct_index[ch_idx] * 2 * num_freq_bands; - if ( proto_direct_index[ch_idx] == 0 ) + if ( hodirac_flag ) { - for ( l = 0; l < num_freq_bands; l++ ) + if ( proto_direct_index[ch_idx] == 0 ) { - g = g1 * ( *( p_gains_dir++ ) ) + g2 * ( *( p_gains_dir_prev++ ) ); - output_real[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); - output_imag[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); + float *p_proto2; + float gs1, gs2; + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[0] * 2 * num_freq_bands; + p_proto2 = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[1] * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands; l++ ) + { + gs1 = g1 * ( *( p_gains_dir ) ) + g2 * ( *( p_gains_dir_prev ) ); + gs2 = g1 * ( *( p_gains_dir + num_freq_bands * num_channels_dir ) ) + g2 * ( *( p_gains_dir_prev + num_freq_bands * num_channels_dir ) ); + p_gains_dir++; + p_gains_dir_prev++; + + output_real[l * num_channels_dir + ch_idx] = 0.5f * gs1 * ( 1.772454e+00f * ( *p_proto ) + 1.023327e+00f * ( *p_proto2 ) ) + // s1 + 0.5f * gs2 * ( 1.772454e+00f * ( *p_proto ) - 1.023327e+00f * ( *p_proto2 ) ); // s2 + p_proto++; + p_proto2++; + output_imag[l * num_channels_dir + ch_idx] = 0.5f * gs1 * ( 1.772454e+00f * ( *p_proto ) + 1.023327e+00f * ( *p_proto2 ) ) + + 0.5f * gs2 * ( 1.772454e+00f * ( *p_proto ) - 1.023327e+00f * ( *p_proto2 ) ); + p_proto++; + p_proto2++; + } + } + else + { + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[ch_idx] * 2 * num_freq_bands; + for ( l = 0; l < num_freq_bands; l++ ) + { + p_gains_dir++; + p_gains_dir_prev++; + + + output_real[l * num_channels_dir + ch_idx] = *( p_proto++ ); + output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ ); + } } } else { - for ( l = 0; l < num_freq_bands; l++ ) + p_proto = h_dirac_output_synthesis_state.proto_direct_buffer_f + + buf_idx * 2 * num_freq_bands * num_protos_dir + + proto_direct_index[ch_idx] * 2 * num_freq_bands; + if ( proto_direct_index[ch_idx] == 0 ) { - p_gains_dir++; - p_gains_dir_prev++; - output_real[l * num_channels_dir + ch_idx] = *( p_proto++ ); - output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ ); + for ( l = 0; l < num_freq_bands; l++ ) + { + g = g1 * ( *( p_gains_dir++ ) ) + g2 * ( *( p_gains_dir_prev++ ) ); + output_real[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); + output_imag[l * num_channels_dir + ch_idx] = g * ( *( p_proto++ ) ); + } + } + else + { + for ( l = 0; l < num_freq_bands; l++ ) + { + p_gains_dir++; + p_gains_dir_prev++; + output_real[l * num_channels_dir + ch_idx] = *( p_proto++ ); + output_imag[l * num_channels_dir + ch_idx] = *( p_proto++ ); + } } } } @@ -884,8 +1198,8 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( for ( l = 0; l < num_freq_bands_diff; l++ ) { g = g1 * ( *( p_gains_diff++ ) ) + g2 * ( *( p_gains_diff_prev++ ) ); - output_real[l * num_channels_dir + sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ - output_imag[l * num_channels_dir + sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); + output_real[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); /* maps ch_idx 5 to 8 */ + output_imag[l * num_channels_dir + hDirAC->sba_map_tc[ch_idx]] += g * ( *( p_proto++ ) ); } } else @@ -949,11 +1263,27 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( *-----------------------------------------------------------------*/ /* store estimates for next synthesis block */ - mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir ); + if ( hodirac_flag ) + { + mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); + } + else + { + mvr2r( h_dirac_output_synthesis_state.cy_cross_dir_smooth_prev, h_dirac_output_synthesis_state.gains_dir_prev, num_freq_bands * num_channels_dir ); + } + mvr2r( h_dirac_output_synthesis_state.cy_auto_diff_smooth_prev, h_dirac_output_synthesis_state.gains_diff_prev, num_freq_bands_diff * num_channels_diff ); /* reset values */ - set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir ); + if ( hodirac_flag ) + { + set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir * DIRAC_HO_NUMSECTORS ); + } + else + { + set_zero( h_dirac_output_synthesis_state.cy_cross_dir_smooth, num_freq_bands * num_channels_dir ); + } + set_zero( h_dirac_output_synthesis_state.cy_auto_diff_smooth, num_freq_bands_diff * num_channels_diff ); return; @@ -970,10 +1300,19 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t nbslots, /* i : number of slots to process */ +#ifdef FIX_393_459_460_SBA_MD + float *diffuseness_vector, +#else + const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ +#endif +#endif float *reference_power_smooth, float qualityBasedSmFactor ) { - int16_t buf_idx, num_freq_bands, diff_start_band; + int16_t buf_idx, num_freq_bands; + int16_t diff_start_band; int16_t k, l; int16_t nchan_out_woLFE; float *p_power_smooth_prev, *p_power_diff_smooth_prev; @@ -1015,7 +1354,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /*-----------------------------------------------------------------* * compute target PSDs *-----------------------------------------------------------------*/ - if ( hDirAC->hConfig->enc_param_start_band == 0 ) { diff_start_band = h_dirac_output_synthesis_params->use_onset_filters == 1 ? h_dirac_output_synthesis_params->max_band_decorr : 0; @@ -1043,7 +1381,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( h_dirac_output_synthesis_state->diffuse_responses_square, h_dirac_output_synthesis_state->cy_auto_diff_smooth ); } - /*-----------------------------------------------------------------* * compute variables for stereo transport signal type detection *-----------------------------------------------------------------*/ @@ -1096,7 +1433,18 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( indexFast = min( l, alphaMaxBinFast ); /* Estimate the smoothness of the directions based on the diffuseness parameter */ + /* TODO: check this, seems buggy in the case of parame estim on the decoder side, + because the pointer here points already to the following subframe, ist this intended?*/ +#ifdef JBM_TSM_ON_TCS +#ifdef FIX_393_459_460_SBA_MD + instDirectionSmoothness = 1.0f - diffuseness_vector[l]; +#else + /* Workaround for BE */ + instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[diff_md_idx][l]; /* Currently, all subframes have same energy ratio value. */ +#endif +#else instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx][l]; /* Currently, all subframes have same energy ratio value. */ +#endif instDirectionSmoothness = min( max( instDirectionSmoothness, 0.0f ), 1.0f ); /* Average the direction smoothness parameter over time */ @@ -1240,8 +1588,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /*-----------------------------------------------------------------* * gain interpolation and output streams *-----------------------------------------------------------------*/ - +#ifdef JBM_TSM_ON_TCS + for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) +#else for ( buf_idx = 0; buf_idx < hDirAC->subframe_nbslots; ++buf_idx ) +#endif { g1 = h_dirac_output_synthesis_params->interpolator[buf_idx]; g2 = 1.f - g1; @@ -1483,9 +1834,16 @@ void ivas_dirac_dec_compute_directional_responses( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ +#ifdef JBM_TSM_ON_TCS + const int16_t *azimuth, + const int16_t *elevation, + const int16_t md_idx, +#endif const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { int16_t k, l; @@ -1494,7 +1852,9 @@ void ivas_dirac_dec_compute_directional_responses( float direct_response_ls[MAX_OUTPUT_CHANNELS]; float direct_response_square[MAX_OUTPUT_CHANNELS]; float *direct_response; +#ifndef JBM_TSM_ON_TCS const int16_t *azimuth, *elevation; +#endif const int16_t *azimuth2, *elevation2; float direct_response_dir2[MAX_OUTPUT_CHANNELS]; float directRatio[MASA_MAXIMUM_DIRECTIONS]; @@ -1515,6 +1875,13 @@ void ivas_dirac_dec_compute_directional_responses( } num_channels_dir = hDirAC->num_outputs_dir; +#ifdef JBM_TSM_ON_TCS + if ( hDirAC->numSimultaneousDirections == 2 ) + { + azimuth2 = hDirAC->azimuth2[md_idx]; + elevation2 = hDirAC->elevation2[md_idx]; + } +#else azimuth = hDirAC->azimuth[hDirAC->dirac_read_idx]; elevation = hDirAC->elevation[hDirAC->dirac_read_idx]; if ( hDirAC->numSimultaneousDirections == 2 ) @@ -1522,6 +1889,7 @@ void ivas_dirac_dec_compute_directional_responses( azimuth2 = hDirAC->azimuth2[hDirAC->dirac_read_idx]; elevation2 = hDirAC->elevation2[hDirAC->dirac_read_idx]; } +#endif codingBand = -1; assert( num_channels_dir <= MAX_OUTPUT_CHANNELS && "Number of channels is too high" ); @@ -1555,35 +1923,63 @@ void ivas_dirac_dec_compute_directional_responses( if ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) { set_f( direct_response_hoa, 1.0f, MAX_OUTPUT_CHANNELS ); + set_f( direct_response_dir2, 1.0f, MAX_OUTPUT_CHANNELS ); + if ( p_Rmat != 0 ) { ivas_dirac_dec_get_response_split_order( azimuth[k], elevation[k], direct_response_hoa, shd_rot_max_order, p_Rmat ); + + if ( hodirac_flag ) + { + ivas_dirac_dec_get_response_split_order( azimuth2[k], elevation2[k], direct_response_dir2, shd_rot_max_order, p_Rmat ); + } } else { ivas_dirac_dec_get_response( azimuth[k], elevation[k], direct_response_hoa, hDirAC->hOutSetup.ambisonics_order ); + + if ( hodirac_flag ) + { + ivas_dirac_dec_get_response( azimuth2[k], elevation2[k], direct_response_dir2, hDirAC->hOutSetup.ambisonics_order ); + } } if ( hMasa == NULL && hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { mvr2r_inc( direct_response_hoa, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k], hDirAC->num_freq_bands, num_channels_dir ); + + if ( hodirac_flag ) + { + mvr2r_inc( direct_response_dir2, 1, &hDirAC->h_output_synthesis_psd_state.direct_responses[k + hDirAC->num_freq_bands * num_channels_dir], hDirAC->num_freq_bands, num_channels_dir ); + } } else if ( ( ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) && ( hMasa != NULL ) ) || hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) { /* Synthesize the first direction */ +#ifdef JBM_TSM_ON_TCS + spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); +#else spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); - +#endif /* Synthesize the second direction and combine the gains */ if ( hDirAC->numSimultaneousDirections == 2 ) { +#ifdef JBM_TSM_ON_TCS + spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); +#else spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); - +#endif /* Combine gains from the two directions */ +#ifdef JBM_TSM_ON_TCS + totalDirect = hDirAC->energy_ratio1[md_idx][k] + hDirAC->energy_ratio2[md_idx][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect; +#else totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; - +#endif for ( l = 0; l < num_channels_dir; l++ ) { direct_response_hoa[l] *= directRatio[0]; @@ -1631,20 +2027,33 @@ void ivas_dirac_dec_compute_directional_responses( else if ( hDirAC->panningConf == DIRAC_PANNING_VBAP ) /*VBAP*/ { /* Synthesize the first direction */ +#ifdef JBM_TSM_ON_TCS + spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); +#else spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); +#endif normalizePanningGains( direct_response_ls, num_channels_dir ); /* Synthesize the second direction and combine the gains */ if ( hDirAC->numSimultaneousDirections == 2 ) { +#ifdef JBM_TSM_ON_TCS + spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); +#else spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); - +#endif normalizePanningGains( direct_response_dir2, num_channels_dir ); /* Combine gains from the two directions */ +#ifdef JBM_TSM_ON_TCS + totalDirect = hDirAC->energy_ratio1[md_idx][k] + hDirAC->energy_ratio2[md_idx][k] + EPSILON; + directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect; + directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect; +#else totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; +#endif for ( l = 0; l < num_channels_dir; l++ ) { direct_response_ls[l] *= directRatio[0]; diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 58c945b190..2452b34edb 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -63,6 +63,11 @@ static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); ivas_error ivas_dec_setup( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ + int16_t *data /* o : flushed PCM samples */ +#endif ) { int16_t k, idx, num_bits_read; @@ -112,10 +117,17 @@ ivas_error ivas_dec_setup( st_ivas->nchan_ism = nchan_ism; +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } +#endif } else if ( st_ivas->ivas_format == SBA_FORMAT ) { @@ -189,7 +201,11 @@ ivas_error ivas_dec_setup( num_bits_read += MC_LS_SETUP_BITS; /* select MC format mode; reconfigure the MC format decoder */ +#ifdef JBM_TSM_ON_TCS + ivas_mc_dec_config( st_ivas, idx, nSamplesRendered, data ); +#else ivas_mc_dec_config( st_ivas, idx ); +#endif } /*-------------------------------------------------------------------* @@ -257,15 +273,18 @@ ivas_error ivas_dec_setup( if ( st_ivas->ini_frame > 0 && st_ivas->ivas_format == SBA_FORMAT ) { int16_t nchan_transport_old, nchan_transport; +#ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode_old; - int32_t last_ivas_total_brate; - - last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; - sba_mode_old = ivas_sba_mode_select( last_ivas_total_brate ); + sba_mode_old = ivas_sba_mode_select(); +#endif nchan_transport_old = st_ivas->nchan_transport; nchan_transport = ( st_ivas->sid_format == SID_SBA_2TC ) ? 2 : 1; +#ifdef SBA_MODE_CLEAN_UP + if ( ( nchan_transport_old != nchan_transport ) ) +#else if ( ( nchan_transport_old != nchan_transport ) || ( sba_mode_old != st_ivas->sba_mode ) ) +#endif { /*Setting the default bitrate for the reconfig function*/ if ( st_ivas->sid_format == SID_SBA_2TC ) @@ -274,7 +293,12 @@ ivas_error ivas_dec_setup( } else { +#ifdef SBA_MODE_CLEAN_UP + st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; +#else st_ivas->hDecoderConfig->ivas_total_brate = ( st_ivas->sba_mode == SBA_MODE_SPAR ) ? IVAS_24k4 : IVAS_13k2; + +#endif } if ( ( error = ivas_sba_dec_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) @@ -374,6 +398,18 @@ static ivas_error ivas_read_format( case 2: st_ivas->ivas_format = ISM_FORMAT; + if ( ivas_total_brate >= IVAS_24k4 ) + { + if ( st_ivas->bit_stream[*num_bits_read] ) + { + /* placeholder for combined format signaling */ + + ( *num_bits_read )++; + } + + ( *num_bits_read )++; + } + break; case 3: if ( st_ivas->bit_stream[*num_bits_read] ) @@ -383,8 +419,9 @@ static ivas_error ivas_read_format( else { st_ivas->ivas_format = SBA_FORMAT; - - st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate ); +#ifndef SBA_MODE_CLEAN_UP + st_ivas->sba_mode = ivas_sba_mode_select(); +#endif } ( *num_bits_read )++; break; @@ -410,6 +447,7 @@ static ivas_error ivas_read_format( break; case SID_ISM: st_ivas->ivas_format = ISM_FORMAT; + break; case SID_MULTICHANNEL: st_ivas->ivas_format = MC_FORMAT; @@ -447,11 +485,11 @@ static ivas_error ivas_read_format( int16_t tc_mode_offset; tc_mode_offset = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); idx = st_ivas->bit_stream[tc_mode_offset]; - // TBD: needs more work for HOA if ( st_ivas->sba_analysis_order == 0 ) { st_ivas->sba_analysis_order = SBA_FOA_ORDER; } +#ifndef SBA_MODE_CLEAN_UP if ( idx == 1 ) { st_ivas->sba_mode = SBA_MODE_SPAR; @@ -460,6 +498,7 @@ static ivas_error ivas_read_format( { st_ivas->sba_mode = SBA_MODE_DIRAC; } +#endif } /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ @@ -554,7 +593,9 @@ ivas_error ivas_init_decoder_front( st_ivas->ism_mode = ISM_MODE_NONE; st_ivas->mc_mode = MC_MODE_NONE; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; +#endif st_ivas->sba_dirac_stereo_flag = 0; @@ -648,9 +689,16 @@ ivas_error ivas_init_decoder( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { +#ifndef SBA_MODE_CLEAN_UP int16_t i, k, n; +#else + int16_t i, n; +#endif int16_t sce_id, cpe_id; int16_t numCldfbAnalyses, numCldfbSyntheses; +#ifdef JBM_TSM_ON_TCS + int16_t granularity, n_channels_transport_jbm; +#endif int32_t output_Fs, ivas_total_brate; int32_t binauralization_delay_ns; AUDIO_CONFIG output_config; @@ -738,6 +786,12 @@ ivas_error ivas_init_decoder( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { +#ifdef FIX_439_OTR_PARAMS + if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_NONE ) { if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_NONE ) ) != IVAS_ERR_OK ) @@ -777,6 +831,7 @@ ivas_error ivas_init_decoder( { return IVAS_ERR_WRONG_MODE; } +#endif } /*-----------------------------------------------------------------* @@ -864,9 +919,7 @@ ivas_error ivas_init_decoder( st_ivas->hSCE[sce_id]->hCoreCoder[0]->is_ism_format = 1; } -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT st_ivas->hISMDTX.sce_id_dtx = 0; -#endif if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { @@ -890,8 +943,10 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { +#endif if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) { return error; @@ -905,7 +960,20 @@ ivas_error ivas_init_decoder( } } - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_dirac_sba_config( + st_ivas->hQMetaData, +#ifndef SBA_MODE_CLEAN_UP + &st_ivas->nchan_transport, + &st_ivas->nSCE, + &st_ivas->nCPE, +#endif + &st_ivas->element_mode_init, + ivas_total_brate, + st_ivas->sba_analysis_order, +#ifndef SBA_MODE_CLEAN_UP + st_ivas->sba_mode, +#endif + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) { return error; } @@ -917,10 +985,12 @@ ivas_error ivas_init_decoder( return error; } +#ifndef SBA_MODE_CLEAN_UP for ( k = 0; k < DIRAC_MAX_NBANDS; k++ ) { st_ivas->hSpar->dirac_to_spar_md_bands[k] = st_ivas->hDirAC->dirac_to_spar_md_bands[k]; } +#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; } else @@ -928,11 +998,19 @@ ivas_error ivas_init_decoder( int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + st_ivas->hSpar->enc_param_start_band = 0; + + set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; + } ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); +#ifndef SBA_MODE_CLEAN_UP } else /* SBA_MODE_DIRAC */ { @@ -943,10 +1021,16 @@ ivas_error ivas_init_decoder( st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); } +#endif } +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && + st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->ivas_format != SBA_FORMAT ) +#else if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode != SBA_MODE_SPAR ) +#endif { if ( ( error = ivas_dirac_dec_open( st_ivas ) ) != IVAS_ERR_OK ) { @@ -1037,6 +1121,46 @@ ivas_error ivas_init_decoder( return error; } } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + /* init EFAP for custom LS setup */ + if ( output_config == AUDIO_CONFIG_LS_CUSTOM ) + { + if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hLsSetupCustom->ls_azimuth, st_ivas->hLsSetupCustom->ls_elevation, st_ivas->hLsSetupCustom->num_spk, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + if ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + st_ivas->element_mode_init = IVAS_CPE_MDCT; + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_dec( st_ivas, cpe_id, ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) * CPE_CHANNELS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + reset_indices_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] ); + } + } + + if ( ( error = create_mct_dec( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { /* init EFAP for custom LS setup */ @@ -1227,6 +1351,7 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -1239,6 +1364,19 @@ ivas_error ivas_init_decoder( return error; } } + +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif } else if ( st_ivas->renderer_type == RENDERER_MC ) { @@ -1271,11 +1409,25 @@ ivas_error ivas_init_decoder( } st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; + +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif } if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_DISC && ( st_ivas->renderer_type == RENDERER_TD_PANNING || + st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || @@ -1291,7 +1443,7 @@ ivas_error ivas_init_decoder( * LFE handles for rendering after rendering to adjust LFE delay to binaural filter delay *-----------------------------------------------------------------*/ - if ( st_ivas->mc_mode == MC_MODE_MCT ) + if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { binauralization_delay_ns = st_ivas->binaural_latency_ns; if ( st_ivas->hBinRenderer != NULL ) @@ -1347,7 +1499,11 @@ ivas_error ivas_init_decoder( } /* CLDFB Interpolation weights */ +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) +#else if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) +#endif { ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } @@ -1361,6 +1517,32 @@ ivas_error ivas_init_decoder( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to open limiter handle" ); } +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * Allocate and initialize JBM struct + buffer + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->voip_active && st_ivas->hTcBuffer == NULL ) + { + /* no module has yet open the TC buffer, open a default one */ + n_channels_transport_jbm = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, ivas_jbm_dec_get_tc_buffer_mode( st_ivas ), n_channels_transport_jbm, n_channels_transport_jbm, n_channels_transport_jbm, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->hTcBuffer == NULL ) + { + /* we need the handle anyway, but without the buffer*/ + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + return error; } @@ -1557,6 +1739,7 @@ void ivas_initialize_handles_dec( st_ivas->hMasa = NULL; st_ivas->hQMetaData = NULL; st_ivas->hMCT = NULL; + st_ivas->hMCParamUpmix = NULL; st_ivas->hParamMC = NULL; st_ivas->hLFE = NULL; @@ -1581,6 +1764,10 @@ void ivas_initialize_handles_dec( st_ivas->hLsSetupCustom = NULL; st_ivas->hRenderConfig = NULL; +#ifdef JBM_TSM_ON_TCS + st_ivas->hTcBuffer = NULL; +#endif + return; } @@ -1658,6 +1845,9 @@ void ivas_destroy_dec( /* ISM renderer handle */ if ( st_ivas->hIsmRendererData != NULL ) { +#ifdef JBM_TSM_ON_TCS + free( st_ivas->hIsmRendererData->interpolator ); +#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -1694,6 +1884,9 @@ void ivas_destroy_dec( /* LFE handle */ ivas_lfe_dec_close( &( st_ivas->hLFE ) ); + /* Param-Upmix MC handle */ + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + /* Parametric MC handle */ ivas_param_mc_dec_close( &st_ivas->hParamMC ); @@ -1768,6 +1961,10 @@ void ivas_destroy_dec( st_ivas->hDecoderConfig = NULL; } +#ifdef JBM_TSM_ON_TCS + ivas_jbm_dec_tc_buffer_close( &st_ivas->hTcBuffer ); +#endif + /* main IVAS handle */ free( st_ivas ); @@ -1776,7 +1973,7 @@ void ivas_destroy_dec( /*-------------------------------------------------------------------* - * ivas_init_dec_get_num_cldfb_analyses() + * ivas_init_dec_get_num_cldfb_instances() * * Return number of CLDFB analysis & synthesis instances *-------------------------------------------------------------------*/ @@ -1811,6 +2008,7 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbAnalyses += 2; } break; + case RENDERER_NON_DIEGETIC_DOWNMIX: case RENDERER_MONO_DOWNMIX: if ( st_ivas->ivas_format == ISM_FORMAT ) { @@ -1820,7 +2018,11 @@ void ivas_init_dec_get_num_cldfb_instances( } break; case RENDERER_DIRAC: +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif { *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; @@ -1837,7 +2039,11 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; } } +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format != SBA_FORMAT ) +#else if ( st_ivas->sba_mode != SBA_MODE_SPAR ) +#endif { if ( st_ivas->nchan_transport > 2 && st_ivas->sba_planar ) { @@ -1878,7 +2084,11 @@ void ivas_init_dec_get_num_cldfb_instances( case RENDERER_BINAURAL_MIXER_CONV_ROOM: case RENDERER_BINAURAL_FASTCONV: case RENDERER_BINAURAL_FASTCONV_ROOM: +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif { if ( st_ivas->sba_dirac_stereo_flag ) { @@ -1938,6 +2148,11 @@ void ivas_init_dec_get_num_cldfb_instances( default: assert( 0 && "Renderer not handled for CLDFB reservation." ); } + if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) + { + *numCldfbAnalyses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbAnalyses ); + *numCldfbSyntheses = max( MC_PARAMUPMIX_MIN_CLDFB, *numCldfbSyntheses ); + } return; } @@ -1972,6 +2187,12 @@ static ivas_error doSanityChecks_IVAS( assert( st_ivas->ivas_format != UNDEFINED_FORMAT && "\n IVAS format undefined" ); assert( st_ivas->ivas_format != MONO_FORMAT && "\n Wrong IVAS format: MONO" ); + /* Verify output configuration compatible with non-diegetic panning */ + if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan && ( st_ivas->ivas_format != MONO_FORMAT ) && ( st_ivas->transport_config != AUDIO_CONFIG_ISM1 ) ) + { + return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Error: Non-diegetic panning not supported in this IVAS format" ); + } + /* Verify stereo output configuration */ if ( st_ivas->ivas_format == STEREO_FORMAT ) { @@ -2021,7 +2242,7 @@ static ivas_error doSanityChecks_IVAS( } #ifdef DEBUGGING - if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) + if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode != MC_MODE_MCT && st_ivas->mc_mode != MC_MODE_PARAMUPMIX ) ) ) ) { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration: Time Domain object renderer not supported in this configuration" ); } diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index e3efac13a1..fe98ca0dcb 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -32,6 +32,9 @@ #include #include "options.h" +#ifdef JBM_TSM_ON_TCS +#include "prot.h" +#endif #include "ivas_prot.h" #include "ivas_prot_rend.h" #ifdef DEBUGGING @@ -39,7 +42,6 @@ #endif #include "wmc_auto.h" - /*-------------------------------------------------------------------------* * ivas_ism_bitrate_switching() * @@ -50,13 +52,25 @@ static ivas_error ivas_ism_bitrate_switching( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nchan_transport_old, /* i : last number of transport channels */ const ISM_MODE last_ism_mode /* i : last ISM mode */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + int16_t *data /* o : rendered samples */ +#endif ) { ivas_error error; int32_t element_brate_tmp[MAX_NUM_OBJECTS]; int16_t nSCE_old, nCPE_old; -#ifdef FIX_416_ISM_BR_SWITCHING - int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old, ism_mode; +#ifdef JBM_TSM_ON_TCS + TC_BUFFER_MODE tc_buffer_mode_new; + int16_t tc_nchan_tc_new; + int16_t tc_nchan_allocate_new; + int16_t tc_granularity_new; + AUDIO_CONFIG intern_config_old; + IVAS_OUTPUT_SETUP hIntSetupOld; + RENDERER_TYPE renderer_type_old; #endif error = IVAS_ERR_OK; @@ -64,11 +78,13 @@ static ivas_error ivas_ism_bitrate_switching( nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; -#ifdef FIX_416_ISM_BR_SWITCHING + /* we have to temporarily set the ism mode back to the old one, otherwise this can give wrong results*/ + ism_mode = st_ivas->ism_mode; + st_ivas->ism_mode = last_ism_mode; ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); -#endif + st_ivas->ism_mode = ism_mode; - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) { return error; } @@ -93,6 +109,14 @@ static ivas_error ivas_ism_bitrate_switching( return error; } +#ifdef JBM_TSM_ON_TCS + /* save old IntSetup, might be needed for JBM flushing...*/ + intern_config_old = st_ivas->intern_config; + hIntSetupOld = st_ivas->hIntSetup; + tc_granularity_new = 1; + renderer_type_old = st_ivas->renderer_type; +#endif + /*-----------------------------------------------------------------* * Initialize the needed renderer struct and destroy the unnecessary renderer struct *-----------------------------------------------------------------*/ @@ -105,6 +129,41 @@ static ivas_error ivas_ism_bitrate_switching( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->hDecoderConfig->output_config ); } +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + if ( last_ism_mode == ISM_MODE_PARAM && st_ivas->hDirAC != NULL && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered; + mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + + /* JBM: when granularity goes down (e.g. Discrete ISM with TD Obj Renderer -> ParamISM with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->hDecoderConfig->output_Fs ); + + if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, MC_MODE_NONE, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ + else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif + if ( st_ivas->ism_mode != last_ism_mode ) { /* EFAP handle */ @@ -127,16 +186,29 @@ static ivas_error ivas_ism_bitrate_switching( ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); /* Open the TD Binaural renderer */ +#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR + if ( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL ) + { + if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#else if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } +#endif } else { /* close the ISM renderer and reinitialize */ if ( st_ivas->hIsmRendererData != NULL ) { +#ifdef JBM_TSM_ON_TCS + free( st_ivas->hIsmRendererData->interpolator ); +#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -190,6 +262,20 @@ static ivas_error ivas_ism_bitrate_switching( } /* Close the TD Binaural renderer */ +#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR + if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) + { + if ( st_ivas->hBinRendererTd != NULL ) + { + ivas_td_binaural_close( &st_ivas->hBinRendererTd ); + } + + if ( st_ivas->hHrtfTD != NULL ) + { + st_ivas->hHrtfTD = NULL; + } + } +#else if ( st_ivas->hBinRendererTd != NULL ) { ivas_td_binaural_close( &st_ivas->hBinRendererTd ); @@ -199,12 +285,16 @@ static ivas_error ivas_ism_bitrate_switching( { st_ivas->hHrtfTD = NULL; } +#endif } else { /* Close the ISM renderer */ if ( st_ivas->hIsmRendererData != NULL ) { +#ifdef JBM_TSM_ON_TCS + free( st_ivas->hIsmRendererData->interpolator ); +#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -228,7 +318,6 @@ static ivas_error ivas_ism_bitrate_switching( } } -#ifdef FIX_416_ISM_BR_SWITCHING /*-----------------------------------------------------------------* * CLDFB instances *-----------------------------------------------------------------*/ @@ -237,6 +326,55 @@ static ivas_error ivas_ism_bitrate_switching( { return error; } + +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * Reconfigure TC buffer + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->voip_active == 1 ) + { + int16_t tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_allocate_new = tc_nchan_tc_new; + tc_nchan_full_new = tc_nchan_tc_new; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + tc_nchan_full_new = tc_nchan_allocate_new; + } + + if ( st_ivas->ism_mode == ISM_MODE_PARAM && ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + tc_nchan_full_new = 0; + } + + /* reconfigure buffer */ + if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || + hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + if ( st_ivas->hDirAC != NULL ) + { + st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + } #endif return error; @@ -254,6 +392,11 @@ ivas_error ivas_ism_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ , const ISM_MODE last_ism_mode /* i/o: last ISM mode */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ + int16_t *data +#endif ) { int32_t ivas_total_brate; @@ -294,7 +437,11 @@ ivas_error ivas_ism_dec_config( { if ( ( st_ivas->ism_mode != last_ism_mode ) || ( st_ivas->hDecoderConfig->ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -317,7 +464,11 @@ ivas_error ivas_ism_dec_config( /* ISM mode switching */ if ( st_ivas->ism_mode != last_ism_mode ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index 7eb6c115ea..054603a15e 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -39,42 +39,6 @@ #endif #include "wmc_auto.h" -#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT -/*-------------------------------------------------------------------* - * ivas_ism_preprocessing() - * - * - *-------------------------------------------------------------------*/ - -static void ivas_ism_preprocessing( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - const int16_t sce_id /* i : SCE # identifier */ -) -{ - Decoder_State *st; - - st = st_ivas->hSCE[sce_id]->hCoreCoder[0]; - - { - /* reset the bitstream to at least read the cng type and bandwidth for non transmitted SCE */ - st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; - st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ - - if ( sce_id == st_ivas->hISMDTX.sce_id_dtx ) - { - st->read_sid_info = 1; /* read the sid info from bitstream */ - } - else - { - st->read_sid_info = 0; /* do not read the sid info from bitstream but use the estimated noise */ - } - - st->cng_ism_flag = 1; - } - - return; -} -#endif /*-------------------------------------------------------------------* * ivas_ism_dtx_dec() @@ -93,9 +57,7 @@ ivas_error ivas_ism_dtx_dec( int16_t idx, flag_noisy_speech, sce_id_dtx; ISM_MODE last_ism_mode, ism_mode_bstr; ivas_error error; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT Decoder_State *st; -#endif ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; @@ -118,7 +80,6 @@ ivas_error ivas_ism_dtx_dec( if ( nchan_ism != nchan_ism_prev ) { - /* IVAS_fmToDo: more work needed when the number of transported objects is not constant */ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } @@ -134,7 +95,11 @@ ivas_error ivas_ism_dtx_dec( st_ivas->ism_mode = ism_mode_bstr; } +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -185,14 +150,11 @@ ivas_error ivas_ism_dtx_dec( { for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) { -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT st = st_ivas->hSCE[ch]->hCoreCoder[0]; st->bit_stream = st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream; st->next_bit_pos = 0; /* note: needed in paramISM -> discISM switching */ st->cng_ism_flag = 1; -#else - ivas_ism_preprocessing( st_ivas, ch ); // VE: after the acceptance of switches, replace the function call by its content -#endif + st->L_frame = min( st->L_frame, L_FRAME16k ); /* note: needed for switching from active frame with L_frame=640 to CNG in object with no SID */ } } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 7a61424a1f..a39c496ab6 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -48,7 +48,8 @@ * Local functions *-----------------------------------------------------------------------*/ -static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, int16_t *flag_abs_azimuth ); +static void decode_angle_indices( DEC_CORE_HANDLE st0, ISM_METADATA_ANGLE_HANDLE angle, const int16_t non_diegetic_flag, int16_t *flag_abs_azimuth ); + static int16_t decode_radius( DEC_CORE_HANDLE st0, int16_t *last_radius_idx, int16_t *flag_abs_radius ); @@ -156,6 +157,7 @@ ivas_error ivas_ism_metadata_dec( int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; DEC_CORE_HANDLE st0; int16_t ism_extmeta_bitstream; + int16_t non_diegetic_flag_global; float yaw, pitch, radius; int16_t flag_abs_radius; int16_t flag_abs_orientation; @@ -185,6 +187,7 @@ ivas_error ivas_ism_metadata_dec( next_bit_pos_orig = st0->next_bit_pos; st0->next_bit_pos = 0; ism_extmeta_bitstream = 0; + non_diegetic_flag_global = 0; /* reverse the bitstream for easier reading of indices */ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) @@ -216,7 +219,6 @@ ivas_error ivas_ism_metadata_dec( if ( *nchan_transport != nchan_transport_prev ) { - /* IVAS_fmToDo: more work needed when the number of transported objects is not constant */ return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" ); } @@ -224,6 +226,12 @@ ivas_error ivas_ism_metadata_dec( if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) { ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS ); + + /* read global non-diegetic object flag */ + if ( ism_extmeta_bitstream ) + { + non_diegetic_flag_global = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS ); + } } /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */ if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */ @@ -304,53 +312,81 @@ ivas_error ivas_ism_metadata_dec( if ( hIsmMeta[ch]->ism_metadata_flag ) { - decode_angle_indices( st0, &( hIsmMetaData->position_angle ), &flag_abs_position ); - idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; - idx_angle2 = hIsmMetaData->position_angle.last_angle2_idx; - /* Azimuth/Elevation dequantization */ - if ( ism_mode == ISM_MODE_PARAM ) + if ( non_diegetic_flag_global ) { - hParamIsm->azi_index[ch] = idx_angle1; - hParamIsm->ele_index[ch] = idx_angle2; + /* read non-diegetic flag for each object */ + hIsmMetaData->non_diegetic_flag = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS ); } - else /* ISM_MODE_DISC */ + else + { + hIsmMetaData->non_diegetic_flag = 0; + } + + if ( hIsmMetaData->non_diegetic_flag ) { + /* Panning gain decoding */ + decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMetaData->non_diegetic_flag, &flag_abs_position ); + idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; + idx_angle2 = 1 << ( ISM_ELEVATION_NBITS - 1 ); + + /* Panning gain dequantization */ hIsmMetaData->azimuth = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - hIsmMetaData->elevation = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + hIsmMetaData->elevation = 0.0f; - /* radius/raw/pitch dequantization */ - if ( ism_extmeta_bitstream ) + /* save for smoothing metadata evolution */ + hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; + hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; + } + else + { + decode_angle_indices( st0, &( hIsmMetaData->position_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_position ); + idx_angle1 = hIsmMetaData->position_angle.last_angle1_idx; + idx_angle2 = hIsmMetaData->position_angle.last_angle2_idx; + + /* Azimuth/Elevation dequantization */ + if ( ism_mode == ISM_MODE_PARAM ) { - decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), &flag_abs_orientation ); - idx_angle1 = hIsmMetaData->orientation_angle.last_angle1_idx; - idx_angle2 = hIsmMetaData->orientation_angle.last_angle2_idx; - yaw = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - pitch = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); - - idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); - radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA ); - if ( *ism_extmeta_active == 1 ) - { - hIsmMetaData->yaw = yaw; - hIsmMetaData->pitch = pitch; - hIsmMetaData->radius = radius; - } + hParamIsm->azi_index[ch] = idx_angle1; + hParamIsm->ele_index[ch] = idx_angle2; } - else + else /* ISM_MODE_DISC */ { - if ( *ism_extmeta_active == 0 ) + hIsmMetaData->azimuth = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + hIsmMetaData->elevation = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + + /* radius/raw/pitch dequantization */ + if ( ism_extmeta_bitstream ) + { + decode_angle_indices( st0, &( hIsmMetaData->orientation_angle ), hIsmMeta[ch]->non_diegetic_flag, &flag_abs_orientation ); + idx_angle1 = hIsmMetaData->orientation_angle.last_angle1_idx; + idx_angle2 = hIsmMetaData->orientation_angle.last_angle2_idx; + yaw = ism_dequant_meta( idx_angle1, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + pitch = ism_dequant_meta( idx_angle2, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + + idx_radius = decode_radius( st0, &hIsmMetaData->last_radius_idx, &flag_abs_radius ); + radius = usdequant( idx_radius, ISM_RADIUS_MIN, ISM_RADIUS_DELTA ); + if ( *ism_extmeta_active == 1 ) + { + hIsmMetaData->yaw = yaw; + hIsmMetaData->pitch = pitch; + hIsmMetaData->radius = radius; + } + } + else { - hIsmMetaData->yaw = 0.0f; - hIsmMetaData->pitch = 0.0f; - hIsmMetaData->radius = 1.0f; + if ( *ism_extmeta_active == 0 ) + { + hIsmMetaData->yaw = 0.0f; + hIsmMetaData->pitch = 0.0f; + hIsmMetaData->radius = 1.0f; + } } } + /* save for smoothing metadata evolution */ + hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; + hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; } - /* save for smoothing metadata evolution */ - hIsmMetaData->last_true_azimuth = hIsmMetaData->azimuth; - hIsmMetaData->last_true_elevation = hIsmMetaData->elevation; } - /* save number of metadata bits read */ if ( ism_mode == ISM_MODE_DISC ) { @@ -442,7 +478,7 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { - if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) { return error; } @@ -451,14 +487,9 @@ ivas_error ivas_ism_metadata_dec( { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; -#ifdef FIX_419_ISM_BRATE_SW_DTX hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; -#endif if ( ism_mode == ISM_MODE_DISC ) { -#ifndef FIX_419_ISM_BRATE_SW_DTX - hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; -#endif if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; @@ -552,7 +583,7 @@ ivas_error ivas_ism_metadata_dec_create( ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) { return error; } @@ -572,6 +603,7 @@ ivas_error ivas_ism_metadata_dec_create( static void decode_angle_indices( DEC_CORE_HANDLE st0, /* i/o: bitstream handle */ ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ + const int16_t non_diegetic_flag, /* i : Non diegetic flag */ int16_t *flag_abs_angle1 /* o : Azimuth/yaw encoding mode */ ) { @@ -650,60 +682,67 @@ static void decode_angle_indices( * Elevation/pitch decoding and dequantization *----------------------------------------------------------------*/ - /* Decode elevation/pitch index */ - if ( *flag_abs_angle1 == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */ + if ( non_diegetic_flag == 0 ) { - idx_angle2 = get_next_indice( st0, ISM_ELEVATION_NBITS ); - } - else - { - diff = 0; - sgn = 1; - - if ( get_next_indice( st0, 1 ) == 0 ) + /* Decode elevation/pitch index */ + if ( *flag_abs_angle1 == 0 && get_next_indice( st0, 1 ) == 1 ) /* elevation_abs_flag */ { - nbits_diff_angle2 = 1; + idx_angle2 = get_next_indice( st0, ISM_ELEVATION_NBITS ); } else { - nbits_diff_angle2 = 1; + diff = 0; + sgn = 1; - if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ + if ( get_next_indice( st0, 1 ) == 0 ) { - sgn = -1; + nbits_diff_angle2 = 1; } + else + { + nbits_diff_angle2 = 1; - nbits_diff_angle2++; + if ( get_next_indice( st0, 1 ) == 1 ) /* negative sign */ + { + sgn = -1; + } - /* read until the stop bit */ - while ( ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) ) - { - diff++; nbits_diff_angle2++; - } - if ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) - { - /* count stop bit */ - nbits_diff_angle2++; + /* read until the stop bit */ + while ( ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) && ( get_next_indice( st0, 1 ) == 1 ) ) + { + diff++; + nbits_diff_angle2++; + } + + if ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) + { + /* count stop bit */ + nbits_diff_angle2++; + } } + + idx_angle2 = angle->last_angle2_idx + sgn * diff; } - idx_angle2 = angle->last_angle2_idx + sgn * diff; + /* sanity check in case of FER or BER */ + if ( idx_angle2 < 0 || idx_angle2 > ( 1 << ISM_ELEVATION_NBITS ) - 1 ) + { + idx_angle2 = angle->last_angle2_idx; + } } - - /* sanity check in case of FER or BER */ - if ( idx_angle2 < 0 || idx_angle2 > ( 1 << ISM_ELEVATION_NBITS ) - 1 ) + else { - idx_angle2 = angle->last_angle2_idx; + idx_angle2 = angle->last_angle2_idx; /* second MD parameter is not transmitted for non-diegetic object */ } /*----------------------------------------------------------------* * Final updates *----------------------------------------------------------------*/ - angle->last_angle1_idx = idx_angle1; angle->last_angle2_idx = idx_angle2; + angle->last_angle1_idx = idx_angle1; return; } @@ -893,12 +932,6 @@ void ivas_ism_metadata_sid_dec( hSCE[ch]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = (float) ( idx ) / (float) ( ( 1 << nBits_coh ) - 1 ); } } -#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT - else - { - *sce_id_dtx = 0; - } -#endif if ( ism_mode == ISM_MODE_PARAM ) { @@ -912,7 +945,6 @@ void ivas_ism_metadata_sid_dec( for ( ch = 0; ch < nchan_ism; ch++ ) { hIsmMetaData = hIsmMeta[ch]; - if ( md_diff_flag[ch] == 1 ) { /* Azimuth decoding */ diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 244bf1f398..da4ce92107 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -158,6 +158,135 @@ static void ivas_ism_get_proto_matrix( } +#ifdef JBM_TSM_ON_TCS +static void ivas_param_ism_collect_slot( + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + float *Cldfb_RealBuffer_in, + float *Cldfb_ImagBuffer_in, + const int16_t ch, + float ref_power[], + float cx_diag[][PARAM_ISM_MAX_DMX] ) +{ + + int16_t band_idx, bin_idx; + int16_t brange[2]; + float tmp; + + /* loop over parameter bands to collect transport channel energies */ + for ( band_idx = 0; band_idx < hDirAC->hParamIsm->nbands; band_idx++ ) + { + brange[0] = hDirAC->hParamIsm->band_grouping[band_idx]; + brange[1] = hDirAC->hParamIsm->band_grouping[band_idx + 1]; + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + tmp = 0.0f; + tmp += ( Cldfb_RealBuffer_in[bin_idx] * Cldfb_RealBuffer_in[bin_idx] ); + tmp += ( Cldfb_ImagBuffer_in[bin_idx] * Cldfb_ImagBuffer_in[bin_idx] ); + cx_diag[bin_idx][ch] += tmp; + ref_power[bin_idx] += tmp; + } + } + + return; +} + + +static void ivas_param_ism_compute_mixing_matrix( + const int16_t nchan_ism, /* i : number of ISM channels */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */ + float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN], + const int16_t nchan_transport, + const int16_t nchan_out_woLFE, + float cx_diag[][PARAM_ISM_MAX_DMX], + float ref_power[], + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX] ) +{ + int16_t band_idx, bin_idx; + int16_t i, w, obj_indx; + int16_t brange[2]; + float direct_power[MAX_NUM_OBJECTS]; + float cy_diag[PARAM_ISM_MAX_CHAN]; + float cy_diag_tmp[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; + float *dir_res_ptr; + float *proto_matrix; + float response_matrix[PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS]; + int16_t num_wave; + + proto_matrix = hDirAC->hParamIsmRendering->proto_matrix; + + assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) ); + assert( nchan_transport == 2 ); + + if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + num_wave = nchan_ism; + } + else + { + num_wave = MAX_PARAM_ISM_WAVE; + } + set_zero( response_matrix, PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS ); + + /* loop over parameter bands to compute the mixing matrix */ + for ( band_idx = 0; band_idx < hDirAC->hParamIsm->nbands; band_idx++ ) + { + brange[0] = hDirAC->hParamIsm->band_grouping[band_idx]; + brange[1] = hDirAC->hParamIsm->band_grouping[band_idx + 1]; + + /* Compute covaraince matrix from direct response*/ + for ( w = 0; w < num_wave; w++ ) + { + set_zero( cy_diag_tmp[w], nchan_out_woLFE ); + + if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + dir_res_ptr = direct_response[w]; + } + else + { + obj_indx = hDirAC->hParamIsm->obj_indices[band_idx][0][w]; + dir_res_ptr = direct_response[obj_indx]; + } + mvr2r( dir_res_ptr, response_matrix + w * nchan_out_woLFE, nchan_out_woLFE ); + /* we only need the diagonal of Cy*/ + matrix_product_diag( dir_res_ptr, nchan_out_woLFE, 1, 0, dir_res_ptr, 1, nchan_out_woLFE, 0, cy_diag_tmp[w] ); + } + + for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) + { + + set_zero( cy_diag, nchan_out_woLFE ); + for ( w = 0; w < num_wave; w++ ) + { + if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) + { + direct_power[w] = ( 1.0f / nchan_ism ) * ref_power[bin_idx]; + } + else + { + direct_power[w] = hDirAC->power_ratios[band_idx][0][w] * ref_power[bin_idx]; + } + + if ( direct_power[w] != 0.f ) + { + for ( i = 0; i < nchan_out_woLFE; i++ ) + { + cy_diag[i] += direct_power[w] * cy_diag_tmp[w][i]; + } + } + direct_power[w] = sqrtf( direct_power[w] ); + } + /* Compute mixing matrix */ + computeMixingMatricesISM( nchan_transport, num_wave, nchan_out_woLFE, response_matrix, direct_power, cx_diag[bin_idx], cy_diag, proto_matrix, 1, + PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix[bin_idx] ); + } + } + + return; +} + +#else static void ivas_param_ism_compute_mixing_matrix( const int16_t nchan_ism, /* i : number of ISM channels */ DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ @@ -276,6 +405,46 @@ static void ivas_param_ism_compute_mixing_matrix( return; } +#endif + + +#ifdef JBM_TSM_ON_TCS +static void ivas_param_ism_render_slot( + DIRAC_DEC_HANDLE hDirAC, + float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX], + float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX], + float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX], + const int16_t interpolator_idx, + const int16_t out_slot_idx, + const int16_t num_ch_LS, + const int16_t nchan_transport ) +{ + int16_t outchIdx, inchIdx, bin_idx; + float tmp_1, mixing_matrix_smooth; + + tmp_1 = hDirAC->hParamIsmRendering->interpolator[interpolator_idx]; + + for ( bin_idx = 0; bin_idx < hDirAC->num_freq_bands; bin_idx++ ) + { + /* smooth the mixing matrix */ + for ( outchIdx = 0; outchIdx < num_ch_LS; outchIdx++ ) + { + for ( inchIdx = 0; inchIdx < nchan_transport; inchIdx++ ) + { + mixing_matrix_smooth = tmp_1 * mixing_matrix[bin_idx][outchIdx + inchIdx * num_ch_LS] + + ( 1 - tmp_1 ) * hDirAC->hParamIsmRendering->mixing_matrix_lin_old[bin_idx][outchIdx + inchIdx * num_ch_LS]; + + Cldfb_RealBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_RealBuffer_in[inchIdx][bin_idx]; + Cldfb_ImagBuffer[outchIdx][out_slot_idx][bin_idx] += mixing_matrix_smooth * Cldfb_ImagBuffer_in[inchIdx][bin_idx]; + } + } + } + + return; +} +#endif static void ivas_param_ism_rendering( @@ -434,9 +603,19 @@ ivas_error ivas_param_ism_dec_open( *-----------------------------------------------------------------*/ hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); +#ifdef JBM_TSM_ON_TCS + hDirAC->hConfig = NULL; + set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hDirAC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hDirAC->subframes_rendered = 0; + hDirAC->slots_rendered = 0; + hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; +#else hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); +#endif hDirAC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hDirAC->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; @@ -468,10 +647,24 @@ ivas_error ivas_param_ism_dec_open( if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) { /* Initialize Param ISM Rendering handle */ - if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK ) +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) { - return error; + if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, MAX_JBM_CLDFB_TIMESLOTS, output_config ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { +#endif + if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef JBM_TSM_ON_TCS } +#endif } if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) @@ -487,120 +680,90 @@ ivas_error ivas_param_ism_dec_open( set_zero( hDirAC->azimuth_values, MAX_NUM_OBJECTS ); set_zero( hDirAC->elevation_values, MAX_NUM_OBJECTS ); +#ifdef JBM_TSM_ON_TCS + hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; +#else hDirAC->dirac_md_buffer_length = 0; +#endif hDirAC->dirac_bs_md_write_idx = 0; hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { +#ifndef JBM_TSM_ON_TCS hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; - if ( ( hDirAC->azimuth = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->elevation = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->azimuth2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->elevation2 = (int16_t **) malloc( hDirAC->dirac_md_buffer_length * sizeof( int16_t * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->energy_ratio1 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - - if ( ( hDirAC->spreadCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) +#endif + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); + return error; } - if ( ( hDirAC->energy_ratio2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) + if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 2 ) ) != IVAS_ERR_OK ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); + return error; } + } - if ( ( hDirAC->spreadCoherence2 = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } + st_ivas->hISMDTX.dtx_flag = 0; - if ( ( hDirAC->surroundingCoherence = (float **) malloc( hDirAC->dirac_md_buffer_length * sizeof( float * ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } + st_ivas->hDirAC = hDirAC; - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) { - if ( ( hDirAC->azimuth[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_s( hDirAC->azimuth[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_s( hDirAC->elevation[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->azimuth2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_s( hDirAC->azimuth2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->elevation2[i] = (int16_t *) malloc( hDirAC->num_freq_bands * sizeof( int16_t ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_s( hDirAC->elevation2[i], 0, hDirAC->num_freq_bands ); - - if ( ( hDirAC->energy_ratio1[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + int16_t nchan_transport = st_ivas->nchan_transport; + int16_t nchan_full = 0; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); + nchan_full = nchan_transport; + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; } - set_f( hDirAC->energy_ratio1[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + else { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); - } - set_f( hDirAC->spreadCoherence[i], 0.0f, hDirAC->num_freq_bands ); + if ( ( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) ); + } + set_zero( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); - if ( ( hDirAC->energy_ratio2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); + if ( ( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM JBM Rendering handle\n" ) ); + } + set_zero( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hDirAC->num_freq_bands ); } - set_f( hDirAC->energy_ratio2[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->spreadCoherence2[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + if ( st_ivas->hTcBuffer == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, nchan_full, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } } - set_f( hDirAC->spreadCoherence2[i], 0.0f, hDirAC->num_freq_bands ); - - if ( ( hDirAC->surroundingCoherence[i] = (float *) malloc( hDirAC->num_freq_bands * sizeof( float ) ) ) == NULL ) + } + else + { + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + if ( st_ivas->hTcBuffer == NULL ) { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param ISM Rendering handle\n" ) ); + int16_t nchan_to_allocate = st_ivas->hDecoderConfig->nchan_out; + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_BUFFER, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } } - set_f( hDirAC->surroundingCoherence[i], 0.0f, hDirAC->num_freq_bands ); } } - - st_ivas->hISMDTX.dtx_flag = 0; - - st_ivas->hDirAC = hDirAC; + else + { + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } +#endif pop_wmops(); return error; @@ -618,7 +781,6 @@ void ivas_param_ism_dec_close( AUDIO_CONFIG output_config /* i : output audio configuration */ ) { - int16_t i; DIRAC_DEC_HANDLE hDirAC; if ( hDirAC_out == NULL || *hDirAC_out == NULL ) @@ -637,151 +799,43 @@ void ivas_param_ism_dec_close( if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->azimuth[i] != NULL ) - { - free( hDirAC->azimuth[i] ); - hDirAC->azimuth[i] = NULL; - } - - if ( hDirAC->elevation[i] != NULL ) - { - free( hDirAC->elevation[i] ); - hDirAC->elevation[i] = NULL; - } - } + ivas_dirac_deallocate_parameters( hDirAC, 1 ); + ivas_dirac_deallocate_parameters( hDirAC, 2 ); + } - if ( hDirAC->azimuth != NULL ) + if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) + { + /* Param ISM Rendering */ + if ( hDirAC->hParamIsmRendering->interpolator != NULL ) { - free( hDirAC->azimuth ); - hDirAC->azimuth = NULL; + free( hDirAC->hParamIsmRendering->interpolator ); + hDirAC->hParamIsmRendering->interpolator = NULL; } - if ( hDirAC->elevation != NULL ) + if ( hDirAC->hParamIsmRendering->proto_matrix != NULL ) { - free( hDirAC->elevation ); - hDirAC->elevation = NULL; + free( hDirAC->hParamIsmRendering->proto_matrix ); + hDirAC->hParamIsmRendering->proto_matrix = NULL; } + } - if ( hDirAC->azimuth2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->azimuth2[i] != NULL ) - { - free( hDirAC->azimuth2[i] ); - hDirAC->azimuth2[i] = NULL; - } - } - free( hDirAC->azimuth2 ); - hDirAC->azimuth2 = NULL; - } +#ifdef JBM_TSM_ON_TCS + if ( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc != NULL ) + { + free( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc ); + hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; + } + if ( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc != NULL ) + { + free( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc ); + hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; + } +#endif - if ( hDirAC->elevation2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->elevation2[i] != NULL ) - { - free( hDirAC->elevation2[i] ); - hDirAC->elevation2[i] = NULL; - } - } - free( hDirAC->elevation2 ); - hDirAC->elevation2 = NULL; - } - - if ( hDirAC->energy_ratio1 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->energy_ratio1[i] != NULL ) - { - free( hDirAC->energy_ratio1[i] ); - hDirAC->energy_ratio1[i] = NULL; - } - } - free( hDirAC->energy_ratio1 ); - hDirAC->energy_ratio1 = NULL; - } - - if ( hDirAC->energy_ratio2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->energy_ratio2[i] != NULL ) - { - free( hDirAC->energy_ratio2[i] ); - hDirAC->energy_ratio2[i] = NULL; - } - } - free( hDirAC->energy_ratio2 ); - hDirAC->energy_ratio2 = NULL; - } - - if ( hDirAC->spreadCoherence != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->spreadCoherence[i] != NULL ) - { - free( hDirAC->spreadCoherence[i] ); - hDirAC->spreadCoherence[i] = NULL; - } - } - free( hDirAC->spreadCoherence ); - hDirAC->spreadCoherence = NULL; - } - - if ( hDirAC->spreadCoherence2 != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->spreadCoherence2[i] != NULL ) - { - free( hDirAC->spreadCoherence2[i] ); - hDirAC->spreadCoherence2[i] = NULL; - } - } - free( hDirAC->spreadCoherence2 ); - hDirAC->spreadCoherence2 = NULL; - } - - if ( hDirAC->surroundingCoherence != NULL ) - { - for ( i = 0; i < hDirAC->dirac_md_buffer_length; i++ ) - { - if ( hDirAC->surroundingCoherence[i] != NULL ) - { - free( hDirAC->surroundingCoherence[i] ); - hDirAC->surroundingCoherence[i] = NULL; - } - } - free( hDirAC->surroundingCoherence ); - hDirAC->surroundingCoherence = NULL; - } - } - - if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) - { - /* Param ISM Rendering */ - if ( hDirAC->hParamIsmRendering->interpolator != NULL ) - { - free( hDirAC->hParamIsmRendering->interpolator ); - hDirAC->hParamIsmRendering->interpolator = NULL; - } - if ( hDirAC->hParamIsmRendering->proto_matrix != NULL ) - { - free( hDirAC->hParamIsmRendering->proto_matrix ); - hDirAC->hParamIsmRendering->proto_matrix = NULL; - } - } - - if ( hDirAC->hParamIsmRendering != NULL ) - { - free( hDirAC->hParamIsmRendering ); - hDirAC->hParamIsmRendering = NULL; - } + if ( hDirAC->hParamIsmRendering != NULL ) + { + free( hDirAC->hParamIsmRendering ); + hDirAC->hParamIsmRendering = NULL; + } free( *hDirAC_out ); *hDirAC_out = NULL; @@ -804,7 +858,10 @@ void ivas_param_ism_dec( int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; int16_t subframe_idx, slot_idx, index_slot, bin_idx; int32_t ivas_total_brate; - +#ifdef JBM_TSM_ON_TCS + float ref_power[CLDFB_NO_CHANNELS_MAX]; + float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; +#endif /* CLDFB Input Buffers */ float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; @@ -846,6 +903,15 @@ void ivas_param_ism_dec( push_wmops( "ivas_param_ism_dec" ); +#ifdef JBM_TSM_ON_TCS + /* set buffers to zero */ + for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) + { + set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); + } + set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); +#endif + /* Frame-level Processing */ /* De-quantization */ if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) @@ -910,6 +976,10 @@ void ivas_param_ism_dec( for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) { cldfbAnalysis_ts( &( output_f[ch][hDirAC->num_freq_bands * slot_idx] ), Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + +#ifdef JBM_TSM_ON_TCS + ivas_param_ism_collect_slot( hDirAC, Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], ch, ref_power, cx_diag ); +#endif } } @@ -920,26 +990,41 @@ void ivas_param_ism_dec( } /* Compute mixing matrix */ +#ifdef JBM_TSM_ON_TCS + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, mixing_matrix ); +#else ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); - +#endif /* subframe loop for synthesis*/ for ( subframe_idx = 0; subframe_idx < hDirAC->nb_subframes; subframe_idx++ ) { +#ifdef JBM_TSM_ON_TCS + uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots[subframe_idx]; +#else uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots; +#endif uint16_t idx_in; uint16_t idx_lfe; /* Set some memories to zero */ for ( ch = 0; ch < nchan_out_woLFE; ch++ ) { +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) +#endif { set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); } } +#ifdef JBM_TSM_ON_TCS + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) +#else for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) +#endif { index_slot = slot_idx_start + slot_idx; @@ -957,8 +1042,11 @@ void ivas_param_ism_dec( { if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) { +#ifdef JBM_TSM_ON_TCS + set_zero( &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); +#else set_zero( &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); - +#endif if ( idx_lfe < ( hSetup.num_lfe - 1 ) ) { idx_lfe++; @@ -970,14 +1058,23 @@ void ivas_param_ism_dec( float *ImagBuffer[16]; /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) +#else for ( i = 0; i < hDirAC->subframe_nbslots; i++ ) +#endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; } +#ifdef JBM_TSM_ON_TCS + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), + hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); +#else cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[ch] ); +#endif idx_in++; } @@ -1008,6 +1105,439 @@ void ivas_param_ism_dec( return; } +#ifdef JBM_TSM_ON_TCS + +/*-------------------------------------------------------------------------* + * ivas_ism_dec_digest_tc() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_ism_dec_digest_tc( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || + st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || + st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM || + ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->hDecoderConfig->Opt_Headrotation == 0 ) ) + { + int16_t i, num_objects; + int16_t azimuth, elevation; + + /* we have a full frame interpolator, adapt it */ + /* for BE testing */ + if ( ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ) == st_ivas->hTcBuffer->n_samples_available ) + { + int16_t interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ); + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + st_ivas->hIsmRendererData->interpolator[0] = 0.0f; + for ( i = 1; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = st_ivas->hIsmRendererData->interpolator[i - 1] + 1.f / ( interpolator_length - 1 ); + } + } + else + { + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); + } + } + } + else + { + ivas_jbm_dec_get_adapted_linear_interpolator( (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ), + st_ivas->hTcBuffer->n_samples_available, + st_ivas->hIsmRendererData->interpolator ); + } + /* also get the gains here */ + num_objects = st_ivas->nchan_transport; + for ( i = 0; i < num_objects; i++ ) + { + mvr2r( st_ivas->hIsmRendererData->gains[i], st_ivas->hIsmRendererData->prev_gains[i], MAX_OUTPUT_CHANNELS ); + + if ( st_ivas->intern_config == AUDIO_CONFIG_STEREO ) + { + ivas_ism_get_stereo_gains( st_ivas->hIsmMetaData[i]->azimuth, + st_ivas->hIsmMetaData[i]->elevation, + &st_ivas->hIsmRendererData->gains[i][0], + &st_ivas->hIsmRendererData->gains[i][1] ); + } + else + { + // TODO tmu review when #215 is resolved + azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); + elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); + + if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && st_ivas->hHeadTrackData == NULL ) + { + if ( st_ivas->hIntSetup.is_planar_setup ) + { + /* If no elevation support in output format, then rendering should be done with zero elevation */ + elevation = 0; + } + + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + } + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /*get HOA gets for direction (ACN/SN3D)*/ + ivas_dirac_dec_get_response( azimuth, elevation, st_ivas->hIsmRendererData->gains[i], st_ivas->hIntSetup.ambisonics_order ); + } + } + } + } + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_digest_tc() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +) +{ + int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; + int16_t slot_idx, bin_idx; + int32_t ivas_total_brate; + float ref_power[CLDFB_NO_CHANNELS_MAX]; + float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; + /* Direct Response/EFAP Gains */ + float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; + DIRAC_DEC_HANDLE hDirAC; + + /* Initialization */ + hDirAC = st_ivas->hDirAC; + assert( hDirAC ); + + nchan_transport = st_ivas->nchan_transport; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { + nchan_out = st_ivas->nchan_ism; + nchan_out_woLFE = nchan_out; + st_ivas->hDecoderConfig->nchan_out = nchan_out; + } + else + { + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + } + + push_wmops( "ivas_param_ism_dec" ); + + /* general setup */ + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbSlots, hDirAC->hParamIsmRendering->interpolator ); + + ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); + + /* set buffers to zero */ + for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) + { + set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); + } + set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); + + /* Frame-level Processing */ + /* De-quantization */ + if ( !( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) ) + { + ivas_param_ism_dec_dequant_DOA( hDirAC, st_ivas->nchan_ism ); + ivas_param_ism_dec_dequant_powrat( hDirAC ); + st_ivas->hISMDTX.dtx_flag = 0; + } + else + { + st_ivas->hISMDTX.dtx_flag = 1; + } + + /* obtain the direct response using EFAP */ + if ( !( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) ) + { + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + efap_determine_gains( st_ivas->hEFAPdata, direct_response[i], hDirAC->azimuth_values[i], hDirAC->elevation_values[i], EFAP_MODE_EFAP ); + } + } + else + { + int16_t j; + + for ( i = 0; i < st_ivas->nchan_ism; i++ ) + { + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( i == j ) + { + direct_response[i][j] = 1.0f; + } + else + { + direct_response[i][j] = 0.0f; + } + } + } + + for ( i = 0; i < nchan_transport; i++ ) + { + for ( j = 0; j < nchan_out_woLFE; j++ ) + { + if ( i == j ) + { + hDirAC->hParamIsmRendering->proto_matrix[( i * nchan_out_woLFE ) + j] = 1.0f; + } + else + { + hDirAC->hParamIsmRendering->proto_matrix[( i * nchan_out_woLFE ) + j] = 0.0f; + } + } + } + } + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + /*-----------------------------------------------------------------* + * CLDFB Analysis + *-----------------------------------------------------------------*/ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + float RealBuffer[CLDFB_NO_CHANNELS_MAX]; + float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + + cldfbAnalysis_ts( &( transport_channels_f[ch][hDirAC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + mvr2r( RealBuffer, &hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc[slot_idx * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands], hDirAC->num_freq_bands ); + mvr2r( ImagBuffer, &hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc[slot_idx * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands], hDirAC->num_freq_bands ); + + ivas_param_ism_collect_slot( hDirAC, RealBuffer, ImagBuffer, ch, ref_power, cx_diag ); + } + } + + /* Obtain Mixing Matrix on a frame-level */ + for ( bin_idx = 0; bin_idx < hDirAC->num_freq_bands; bin_idx++ ) + { + set_f( hDirAC->hParamIsmRendering->mixing_matrix_lin[bin_idx], 0.0f, nchan_transport * nchan_out_woLFE ); + } + + /* Compute mixing matrix */ + ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, hDirAC->hParamIsmRendering->mixing_matrix_lin ); + + pop_wmops(); + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_ism_param_dec_render_sf() + * + * + *-------------------------------------------------------------------------*/ + +static void ivas_ism_param_dec_render_sf( + Decoder_Struct *st_ivas, + IVAS_OUTPUT_SETUP hSetup, + const int16_t nchan_transport, + const int16_t nchan_out, + const int16_t nchan_out_woLFE, + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t ch, slot_idx, i, index_slot; + /* CLDFB Output Buffers */ + float Cldfb_RealBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[PARAM_ISM_MAX_CHAN][JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX]; + float *Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX]; + DIRAC_DEC_HANDLE hDirAC; + + int16_t slot_idx_start; + int16_t idx_in; + int16_t idx_lfe; + int16_t subframe_idx; + + hDirAC = st_ivas->hDirAC; + slot_idx_start = hDirAC->slots_rendered; + subframe_idx = hDirAC->subframes_rendered; + + /* Set some memories to zero */ + for ( ch = 0; ch < nchan_out_woLFE; ch++ ) + { + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); + set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); + } + } + + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + index_slot = slot_idx_start + slot_idx; + + for ( ch = 0; ch < nchan_transport; ch++ ) + { + Cldfb_RealBuffer_in[ch] = &hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc[index_slot * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands]; + Cldfb_ImagBuffer_in[ch] = &hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc[index_slot * hDirAC->num_freq_bands * nchan_transport + ch * hDirAC->num_freq_bands]; + } + + /* Compute bandwise rendering to target LS using covariance rendering */ + ivas_param_ism_render_slot( hDirAC, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, + Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->hParamIsmRendering->mixing_matrix_lin, index_slot, slot_idx, + nchan_out_woLFE, nchan_transport ); + } + + /* CLDFB Synthesis */ + idx_in = 0; + idx_lfe = 0; + + for ( ch = 0; ch < nchan_out; ch++ ) + { + if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) + { + set_zero( output_f[ch], hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); + if ( idx_lfe < ( hSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) + { + RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; + } + cldfbSynthesis( RealBuffer, ImagBuffer, output_f[ch], + hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + idx_in++; + } + } + + hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx]; + hDirAC->subframes_rendered++; + + return; +} + + +/*-------------------------------------------------------------------------* + * ivas_param_ism_dec_render() + * + * + *-------------------------------------------------------------------------*/ + +void ivas_param_ism_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t ch, slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, n_samples_sf; + DIRAC_DEC_HANDLE hDirAC; + IVAS_OUTPUT_SETUP hSetup; + int16_t nchan_transport, nchan_out, nchan_out_woLFE; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hDirAC = st_ivas->hDirAC; + hSetup = st_ivas->hIntSetup; +#ifdef DEBUGGING + assert( hDirAC ); +#endif + nchan_transport = st_ivas->nchan_transport; + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { + nchan_out = st_ivas->nchan_ism; + nchan_out_woLFE = nchan_out; + st_ivas->hDecoderConfig->nchan_out = nchan_out; + } + else + { + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hDirAC->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hDirAC->subframe_nbslots[last_sf]; + last_sf++; + } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = &output_f[ch][0]; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + ivas_ism_param_dec_render_sf( st_ivas, hSetup, nchan_transport, nchan_out, nchan_out_woLFE, output_f_local ); + n_samples_sf = hDirAC->subframe_nbslots[subframe_idx] * st_ivas->hDirAC->slot_size; + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + if ( hDirAC->slots_rendered == hDirAC->num_slots ) + { + /* copy the memories */ + /* store mixing matrix for next subframe */ + ivas_param_ism_update_mixing_matrix( hDirAC, hDirAC->hParamIsmRendering->mixing_matrix_lin, nchan_transport, nchan_out_woLFE ); + + /* store MetaData parameters */ + for ( ch = 0; ch < st_ivas->nchan_ism; ch++ ) + { + if ( st_ivas->hDirAC->azimuth_values[ch] > 180.0f ) + { + st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hDirAC->azimuth_values[ch] - 360.0f; + } + else + { + st_ivas->hIsmMetaData[ch]->azimuth = st_ivas->hDirAC->azimuth_values[ch]; + } + + st_ivas->hIsmMetaData[ch]->elevation = st_ivas->hDirAC->elevation_values[ch]; + } + } + + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; + + return; +} +#endif + /*-------------------------------------------------------------------------* * ivas_param_ism_params_to_masa_param_mapping() @@ -1054,6 +1584,7 @@ void ivas_param_ism_params_to_masa_param_mapping( hDirAC->numSimultaneousDirections = 1; azimuth[0] = (int16_t) roundf( hDirAC->azimuth_values[0] ); elevation[0] = (int16_t) roundf( hDirAC->elevation_values[0] ); + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) @@ -1097,6 +1628,7 @@ void ivas_param_ism_params_to_masa_param_mapping( } } } + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) @@ -1113,6 +1645,7 @@ void ivas_param_ism_params_to_masa_param_mapping( hDirAC->numSimultaneousDirections = 1; azimuth[0] = (int16_t) roundf( hDirAC->azimuth_values[0] ); elevation[0] = (int16_t) roundf( hDirAC->elevation_values[0] ); + for ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) { for ( bin_idx = 0; bin_idx < nBins; bin_idx++ ) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 1e60143cb4..031c6cf18f 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -58,6 +58,9 @@ ivas_error ivas_ism_renderer_open( { int16_t i; uint16_t interpolator_length; +#ifdef JBM_TSM_ON_TCS + uint16_t init_interpolator_length; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -78,13 +81,34 @@ ivas_error ivas_ism_renderer_open( for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); +#ifdef JBM_TSM_ON_TCS + set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); +#endif } +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + init_interpolator_length = NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_CLDFB_TIMESLOTS * CLDFB_SLOT_NS ); + interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + } + else + { + init_interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + interpolator_length = init_interpolator_length; + } + st_ivas->hIsmRendererData->interpolator = (float *) malloc( sizeof( float ) * init_interpolator_length ); + for ( i = 0; i < interpolator_length; i++ ) + { + st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); + } +#else interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); for ( i = 0; i < interpolator_length; i++ ) { st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); } +#endif return error; } @@ -97,9 +121,13 @@ ivas_error ivas_ism_renderer_open( *-------------------------------------------------------------------------*/ void ivas_ism_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: core-coder transport channels/object output */ +#else float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */ - const int16_t output_frame /* i : output frame length per channel */ +#endif + const int16_t output_frame /* i : output frame length per channel */ ) { int16_t i, j, k, j2; @@ -149,7 +177,7 @@ void ivas_ism_render( else { /* Head rotation: rotate the object positions depending the head's orientation */ - if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); } @@ -201,6 +229,99 @@ void ivas_ism_render( return; } +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------------* + * ivas_ism_render_sf() + * + * Object rendering process + *-------------------------------------------------------------------------*/ + +void ivas_ism_render_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ + const int16_t n_samples_to_render /* i : output frame length per channel */ +) +{ + int16_t i, j, k, j2; + float *g1, g2, *tc; + int16_t num_objects, nchan_out_woLFE, lfe_index; + int16_t azimuth, elevation; + int16_t tc_offset; + int16_t interp_offset; + float Rmat[3][3]; + float gain, prev_gain; + + num_objects = st_ivas->nchan_transport; + nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; + + tc_offset = st_ivas->hTcBuffer->n_samples_rendered; + interp_offset = st_ivas->hTcBuffer->n_samples_rendered; + + for ( i = 0; i < nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; i++ ) + { + set_f( output_f[i], 0.0f, n_samples_to_render ); + } + + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) + { + /* Calculate rotation matrix from the quaternion */ + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat ); + + ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, + n_samples_to_render, + st_ivas->hIsmRendererData->interpolator ); + interp_offset = 0; + } + + for ( i = 0; i < num_objects; i++ ) + { + /* Head rotation: rotate the object positions depending the head's orientation */ +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) +#else + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) +#endif + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); + if ( st_ivas->hEFAPdata != NULL ) + { + efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); + } + } + + lfe_index = 0; + for ( j = 0, j2 = 0; j < nchan_out_woLFE; j++, j2++ ) + { + if ( ( st_ivas->hIntSetup.num_lfe > 0 ) && ( st_ivas->hIntSetup.index_lfe[lfe_index] == j ) ) + { + ( lfe_index < ( st_ivas->hIntSetup.num_lfe - 1 ) ) ? ( lfe_index++, j2++ ) : j2++; + } + + gain = st_ivas->hIsmRendererData->gains[i][j]; + prev_gain = st_ivas->hIsmRendererData->prev_gains[i][j]; + if ( fabsf( gain ) > 0.0f || fabsf( prev_gain ) > 0.0f ) + { + g1 = &st_ivas->hIsmRendererData->interpolator[interp_offset]; + tc = &st_ivas->hTcBuffer->tc[i][tc_offset]; + for ( k = 0; k < n_samples_to_render; k++ ) + { + g2 = 1.0f - *g1; + output_f[j2][k] += ( *( g1++ ) * gain + g2 * prev_gain ) * *( tc++ ); + } + } + + /* update here only in case of head rotation */ + if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) + { + st_ivas->hIsmRendererData->prev_gains[i][j] = gain; + } + } + } + + return; +} +#endif + /*-------------------------------------------------------------------------* * ivas_ism_get_stereo_gains() diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c new file mode 100644 index 0000000000..04ae490414 --- /dev/null +++ b/lib_dec/ivas_jbm_dec.c @@ -0,0 +1,1867 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include "cnst.h" +#include "ivas_cnst.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_prot_rend.h" +#include "ivas_rom_com.h" +#include +#ifdef DEBUGGING +#include "debug.h" +#endif +#include "wmc_auto.h" + + +#ifdef JBM_TSM_ON_TCS + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ + +static void ivas_jbm_dec_copy_tc( Decoder_Struct *st_ivas, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *data, float *tc_digest_f[] ); + +static void ivas_jbm_dec_tc_buffer_playout( Decoder_Struct *st_ivas, const uint16_t nSamplesAsked, uint16_t *nSamplesRendered, float *output[] ); + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc() + * + * Principal IVAS JBM decoder routine, decoding of metadata and transport channels + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *data /* o : transport channel signals */ +) +{ + int16_t n, output_frame, nchan_out; + Decoder_State *st; /* used for bitstream handling */ + float output[MAX_TRANSPORT_CHANNELS][L_FRAME48k]; /* 'float' buffer for transport channels, MAX_TRANSPORT_CHANNELS channels */ + int16_t nchan_remapped, hodirac_flag; + float output_lfe_ch[L_FRAME48k]; + int16_t nb_bits_metadata[MAX_SCE]; + int32_t output_Fs, ivas_total_brate; + AUDIO_CONFIG output_config; + ivas_error error; + float *p_output[MAX_TRANSPORT_CHANNELS]; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_jbm_dec_tc" ); + + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + for ( n = 0; n < MAX_TRANSPORT_CHANNELS; n++ ) + { + p_output[n] = &output[n][0]; + } + + /*----------------------------------------------------------------* + * Decoding + Rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->bfi && st_ivas->ini_frame == 0 ) + { + /* zero output when first frame(s) is lost */ + for ( n = 0; n < nchan_out; n++ ) + { + set_f( output[n], 0.0f, output_frame ); + } + +#ifdef DEBUG_MODE_INFO + create_sce_dec( st_ivas, 0, ivas_total_brate ); + output_debug_mode_info_dec( st_ivas->hSCE[0]->hCoreCoder, 1, output_frame, NULL ); + destroy_sce_dec( st_ivas->hSCE[0] ); + st_ivas->hSCE[0] = NULL; +#endif + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + for ( n = 0; n < min( nchan_out, st_ivas->nchan_transport ); n++ ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hDecoderConfig->nchan_out == 1 ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Metadata decoding and configuration */ + if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) + { + if ( ( error = ivas_ism_dtx_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, st_ivas->hDirAC->hParamIsm, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else /* ISM_MODE_DISC */ + { + if ( ( error = ivas_ism_metadata_dec( ivas_total_brate, st_ivas->nchan_ism, &( st_ivas->nchan_transport ), st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( ( error = ivas_sce_dec( st_ivas, n, &output[n], output_frame, nb_bits_metadata[n] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* HP filtering */ + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + ivas_mono_downmix_render_passive( st_ivas, output, output_frame ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + set_s( nb_bits_metadata, 0, MAX_SCE ); + + /* read parameters from the bitstream */ +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT ) +#endif + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + if ( st_ivas->ivas_format == SBA_FORMAT ) + { +#ifndef SBA_MODE_CLEAN_UP + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, hodirac_flag, 0 ); +#else + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, 0 ); +#endif + } + else + { + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#ifndef SBA_MODE_CLEAN_UP + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif + { +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->hQMetaData != NULL ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; +#ifndef SBA_MODE_CLEAN_UP + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands ); +#else + ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands ); +#endif + } +#endif + + if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( st_ivas->nchan_transport == CPE_CHANNELS && st_ivas->nCPE >= 1 ) + { + st_ivas->hCPE[0]->element_brate = ivas_total_brate; + } + + /* core-decoding of transport channels */ + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, &output[0], output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + +#ifdef DEBUG_SBA_AUDIO_DUMP + /* Dump audio signal after core-decoding */ + ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[0], "core-decoding" ); +#endif + /* TCs remapping */ + nchan_remapped = st_ivas->nchan_transport; + if ( st_ivas->sba_dirac_stereo_flag ) + { + nchan_remapped = nchan_out; + +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif + { + ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); + + if ( st_ivas->hSpar->hPCA != NULL ) + { + ivas_pca_dec( st_ivas->hSpar->hPCA, output_frame, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); + } + + ivas_spar_dec_gen_umx_mat( st_ivas->hSpar->hMdDec, st_ivas->nchan_transport, IVAS_MAX_NUM_BANDS, st_ivas->bfi, + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); + } + + ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, st_ivas->ivas_format == MC_FORMAT ); + } + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + nchan_remapped = 1; /* Only one channel transported */ + } + + /* HP filtering */ +#ifndef DEBUG_SPAR_BYPASS_EVS_CODEC + for ( n = 0; n < nchan_remapped; n++ ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } +#endif + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame ); + +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) +#else + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) +#endif + { + ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); + } +#ifndef SBA_MODE_CLEAN_UP + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else +#endif + { + ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); + } + } + + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_masa_prerender( st_ivas, output, output_frame ); + } + else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + float gain = 0.8414f; /* Todo: Temporary gain for roughly matching the loudness. To be tuned later together with other outputs. */ + + for ( n = 0; n < nchan_remapped; n++ ) + { + v_multc( output[n], gain, output[n], output_frame ); + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; + + /* LFE channel decoder */ + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + if ( st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg == NULL ) + { + st_ivas->hCPE[1]->hCoreCoder[1]->hTcxCfg = st_ivas->hCPE[1]->hCoreCoder[0]->hTcxCfg; + } + ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch ); + } + + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + mvr2r( output_lfe_ch, output[LFE_CHANNEL], output_frame ); + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + if ( n != LFE_CHANNEL ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + } + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) + { + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) <= ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + { + ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + } + if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + if ( st_ivas->renderer_type == RENDERER_MC ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + /* read Parametric MC parameters from the bitstream */ + ivas_param_mc_dec_read_BS( ivas_total_brate, st, st_ivas->hParamMC, &nb_bits_metadata[0] ); + + if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE > 1 ) + { + if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* HP filtering */ + for ( n = 0; n < st_ivas->nchan_transport; n++ ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + /* Rendering */ + if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) + { + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + st = st_ivas->hCPE[0]->hCoreCoder[0]; /* Metadata is always with CPE in the case of separated channel */ + } + + /* read McMASA parameters from the bitstream */ + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + /* Decode the transport audio signals */ + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Identify the index of the separated channel, always LFE_CHANNEL-1 here */ + n = LFE_CHANNEL - 1; + + /* Decode the separated channel to output[n] to be combined with the synthesized channels */ + if ( ( error = ivas_sce_dec( st_ivas, 0, &output[n], output_frame, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* Delay the separated channel to sync with CLDFB delay of the DirAC synthesis, and synthesize the LFE signal. */ + if ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 || + output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 || + output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) + { + ivas_lfe_synth_with_filters( st_ivas->hMasa->hMasaLfeSynth, output, output_frame, n, LFE_CHANNEL ); + } + else if ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + { + /* Delay the separated channel to sync with the DirAC rendering */ + delay_signal( output[n], output_frame, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC, st_ivas->hMasa->hMasaLfeSynth->delayBuffer_syncDirAC_size ); + } + } + else + { + if ( st_ivas->nSCE == 1 ) + { + if ( ( error = ivas_sce_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->nCPE == 1 ) + { + if ( ( error = ivas_cpe_dec( st_ivas, 0, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + + if ( st_ivas->sba_dirac_stereo_flag ) /* use the flag to trigger the DFT upmix */ + { + ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame, 1 ); + } + + /* HP filtering */ + for ( n = 0; n < getNumChanSynthesis( st_ivas ); n++ ) + { + hp20( output[n], output_frame, st_ivas->mem_hp20_out[n], output_Fs ); + } + + if ( st_ivas->renderer_type == RENDERER_MCMASA_MONO_STEREO ) + { + ivas_mono_stereo_downmix_mcmasa( st_ivas, output, output_frame ); + } + } + } + + + /*----------------------------------------------------------------* + * Write IVAS transport channels + *----------------------------------------------------------------*/ + + ivas_syn_output_f( p_output, output_frame, st_ivas->hTcBuffer->nchan_transport_jbm, data ); + + + /*----------------------------------------------------------------* + * Common updates + *----------------------------------------------------------------*/ + + if ( !st_ivas->bfi ) /* do not update if first frame(s) are lost or NO_DATA */ + { + st_ivas->hDecoderConfig->last_ivas_total_brate = ivas_total_brate; + st_ivas->last_active_ivas_total_brate = ( ivas_total_brate <= IVAS_SID_5k2 ) ? st_ivas->last_active_ivas_total_brate : ivas_total_brate; + } + + if ( st_ivas->ini_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) ) /* keep "st_ivas->ini_frame = 0" until first good received frame */ + { + st_ivas->ini_frame++; + } + + if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_5k2 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */ + { + st_ivas->ini_active_frame++; + } + +#ifdef DEBUG_MODE_INFO + dbgwrite( &st_ivas->bfi, sizeof( int16_t ), 1, output_frame, "res/bfi" ); + dbgwrite( &st_ivas->BER_detect, sizeof( int16_t ), 1, output_frame, "res/BER_detect" ); + { + float tmpF = ivas_total_brate / 1000.0f; + dbgwrite( &tmpF, sizeof( float ), 1, output_frame, "res/ivas_total_brate.dec" ); + } +#endif + + pop_wmops(); + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_feed_tc_to_renderer() + * + * Feed decoded transport channels and metadata to the IVAS JBM renderer routine + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_feed_tc_to_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of TC samples available for rendering */ + int16_t *nSamplesResidual, /* o : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *data /* i : transport channels */ +) +{ + + float data_f[MAX_CLDFB_DIGEST_CHANNELS][MAX_JBM_L_FRAME48k]; /* 'float' buffer for transport channels that will be directly converted with the CLDFB */ + float *p_data_f[MAX_CLDFB_DIGEST_CHANNELS]; + int16_t n_render_timeslots; + int16_t n; + ivas_error error; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_jbm_dec_feed_tc_to_rendererer" ); + + for ( n = 0; n < MAX_CLDFB_DIGEST_CHANNELS; n++ ) + { + p_data_f[n] = &data_f[n][0]; + } + ivas_jbm_dec_copy_tc( st_ivas, nSamplesForRendering, nSamplesResidual, data, p_data_f ); + n_render_timeslots = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + + if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_set_md_map( st_ivas, n_render_timeslots ); + ivas_param_ism_params_to_masa_param_mapping( st_ivas ); + } + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec_digest_tc( st_ivas, n_render_timeslots, p_data_f ); + } + } + else /* ISM_MODE_DISC */ + { + ivas_ism_dec_digest_tc( st_ivas ); + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + ivas_jbm_dec_td_renderers_adapt_subframes( st_ivas ); + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_digest_tc( st_ivas, (uint8_t) n_render_timeslots, p_data_f ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + ivas_sba_dec_digest_tc( st_ivas, n_render_timeslots, st_ivas->hTcBuffer->n_samples_available ); + } + } + + pop_wmops(); + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_dec_render() + * + * Principal IVAS JBM rendering routine + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const uint16_t nSamplesAsked, /* i : number of samples wanted */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the rendering pipeline */ + int16_t *data /* o : output synthesis signal */ +) +{ + int16_t n, nchan_out; + int16_t nchan_transport; + float output[MAX_OUTPUT_CHANNELS][L_FRAME48k]; /* 'float' buffer for output synthesis, MAX_OUTPUT_CHANNELS channels */ + int16_t nchan_remapped; + int32_t output_Fs; + AUDIO_CONFIG output_config; +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + float pan_left, pan_right; +#endif + int16_t nSamplesAskedLocal; + ivas_error error; + float *p_output[MAX_OUTPUT_CHANNELS]; + float *p_tc[MAX_TRANSPORT_CHANNELS]; + + error = IVAS_ERR_OK; + + push_wmops( "ivas_dec_render" ); + + /*----------------------------------------------------------------* + * Initialization of local vars after struct has been set + *----------------------------------------------------------------*/ + + output_Fs = st_ivas->hDecoderConfig->output_Fs; + nchan_out = st_ivas->hDecoderConfig->nchan_out; + nchan_transport = st_ivas->hTcBuffer->nchan_transport_jbm; + output_config = st_ivas->hDecoderConfig->output_config; + nSamplesAskedLocal = nSamplesAsked + st_ivas->hTcBuffer->n_samples_discard; + + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + p_output[n] = &output[n][0]; + } + + for ( n = 0; n < st_ivas->hTcBuffer->nchan_transport_internal; n++ ) + { + p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered]; + } + + /*----------------------------------------------------------------* + * Rendering + *----------------------------------------------------------------*/ + + if ( st_ivas->ivas_format == UNDEFINED_FORMAT ) + { + assert( 0 ); + } + else if ( st_ivas->hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_BUFFER ) + { + ivas_jbm_dec_tc_buffer_playout( st_ivas, nSamplesAskedLocal, nSamplesRendered, p_output ); + } + else if ( st_ivas->ivas_format == STEREO_FORMAT ) + { + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); + } + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + /* Rendering */ + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output ); + } +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc( st_ivas->hTcBuffer->tc[0], pan_right, output[1], *nSamplesRendered ); + v_multc( st_ivas->hTcBuffer->tc[0], pan_left, output[0], *nSamplesRendered ); + } +#endif + else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* Convert CICP19 -> Ambisonics */ + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + } + } + else /* ISM_MODE_DISC */ + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + + /* Loudspeaker or Ambisonics rendering */ + if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); + } +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc( st_ivas->hTcBuffer->tc[0], pan_right, output[1], *nSamplesRendered ); + v_multc( st_ivas->hTcBuffer->tc[0], pan_left, output[0], *nSamplesRendered ); + } +#endif + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ + ivas_ism2sba_sf( st_ivas->hTcBuffer->tc, p_output, st_ivas->hIsmRendererData, st_ivas->nchan_transport, *nSamplesRendered, st_ivas->hTcBuffer->n_samples_rendered, st_ivas->hIntSetup.ambisonics_order ); + } + + /* Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, + NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, p_output, p_output ); + } +#ifdef DEBUGGING + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + ivas_binaural_cldfb_sf( st_ivas, *nSamplesRendered, p_output ); + } +#endif + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + nchan_remapped = nchan_transport; + + /* Loudspeakers, Ambisonics or Binaural rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } +#ifndef SBA_MODE_CLEAN_UP + else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT ) +#else + else if ( st_ivas->ivas_format == MASA_FORMAT ) +#endif + { + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + for ( n = 0; n < nchan_remapped; n++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[n] + st_ivas->hTcBuffer->n_samples_rendered, p_output[n], *nSamplesRendered ); + } + + if ( ( error = ivas_sba_linear_renderer( p_output, *nSamplesRendered, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC ) + { + ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + } + else /* SBA_MODE_SPAR */ + { + ivas_sba_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) + { + ivas_mc2sba( st_ivas->hTransSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); + } + + /* Rendering */ + if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, + &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, p_tc, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_MC ) + { + *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); + ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, *nSamplesRendered, p_tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, p_tc, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, *nSamplesRendered ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, *nSamplesRendered, st_ivas->hTcBuffer->tc, p_output ); + } + } + else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) + { + ivas_param_mc_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + int16_t offset = st_ivas->hDirAC->slots_rendered * st_ivas->hDirAC->slot_size; + nchan_remapped = st_ivas->nchan_transport; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ + { + ivas_dirac_dec_render( st_ivas, nchan_remapped, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + /* we still need to copy the separate channel if available */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + + ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, *nSamplesRendered, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + else if ( st_ivas->intern_config == AUDIO_CONFIG_5_1 && ( output_config == AUDIO_CONFIG_5_1_2 || output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1 ) ) + { + for ( n = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; n < st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; n++ ) + { + set_zero( output[n], *nSamplesRendered ); + } + } + } + + /* copy discrete C and TD LFE from internal TC to output */ + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + if ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 || + output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 || + output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) + { + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL] + offset, output[LFE_CHANNEL], *nSamplesRendered ); + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + else if ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe == 0 ) + { + /* Delay the separated channel to sync with the DirAC rendering */ + mvr2r( st_ivas->hTcBuffer->tc[LFE_CHANNEL - 1] + offset, output[st_ivas->hOutSetup.separateChannelIndex], *nSamplesRendered ); + } + } + } + } + + /*----------------------------------------------------------------* + * Write IVAS output channels + * - compensation for saturation + * - float to integer conversion + *----------------------------------------------------------------*/ + + st_ivas->hTcBuffer->n_samples_available -= *nSamplesRendered; + st_ivas->hTcBuffer->n_samples_rendered += *nSamplesRendered; + + if ( st_ivas->hTcBuffer->n_samples_discard > 0 ) + { + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + p_output[n] += st_ivas->hTcBuffer->n_samples_discard; + } + *nSamplesRendered -= st_ivas->hTcBuffer->n_samples_discard; + st_ivas->hTcBuffer->n_samples_discard = 0; + } + + ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, *nSamplesRendered, st_ivas->BER_detect ); + +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + ivas_syn_output( p_output, *nSamplesRendered, nchan_out, data ); + + *nSamplesAvailableNext = st_ivas->hTcBuffer->n_samples_available; + + pop_wmops(); + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_dec_flush_renderer() + * + * Flush samples if renderer granularity changes on a bitrate change + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_flush_renderer( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t tc_granularity_new, /* i : new renderer granularity */ + const RENDERER_TYPE renderer_type_old, /* i : old renderer type */ + const AUDIO_CONFIG intern_config_old, /* i : old internal config */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetupOld, /* i : old internal output setup */ + const MC_MODE mc_mode_old, /* i : old MC mode */ + const ISM_MODE ism_mode_old, /* i : old ISM mode */ + uint16_t *nSamplesRendered, /* o : number of samples flushed */ + int16_t *data /* o : rendered samples */ +) +{ + ivas_error error; + int16_t n_samples_still_available; + int16_t n_slots_still_available; + int16_t n_samples_to_render; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + float output[MAX_CICP_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float *p_output[MAX_CICP_CHANNELS]; + + error = IVAS_ERR_OK; + + *nSamplesRendered = 0; + hTcBuffer = st_ivas->hTcBuffer; + + /* get number of possible slots in new granularity */ + n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; + n_slots_still_available = n_samples_still_available / tc_granularity_new; + *nSamplesRendered = n_slots_still_available * tc_granularity_new; + n_samples_to_render = *nSamplesRendered; + n_samples_still_available -= n_samples_to_render; + assert( n_samples_still_available < tc_granularity_new ); + + if ( n_slots_still_available ) + { + int16_t ch_idx; + + /* render what is still there with zero padding */ + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + /* move it at the beginning of the TC buffer with zero padding */ + mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch_idx], n_samples_to_render ); + set_zero( hTcBuffer->tc[ch_idx] + n_samples_to_render, hTcBuffer->n_samples_granularity - n_samples_to_render ); + mvr2r( hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_rendered + n_samples_to_render, hTcBuffer->tc[ch_idx] + hTcBuffer->n_samples_granularity, n_samples_still_available ); + } + + /* simple change of the slot info */ + hTcBuffer->num_slots = 1; + hTcBuffer->nb_subframes = 1; + hTcBuffer->subframes_rendered = 0; + hTcBuffer->slots_rendered = 0; + hTcBuffer->subframe_nbslots[0] = 1; + hTcBuffer->n_samples_buffered = hTcBuffer->n_samples_granularity + n_samples_still_available; + hTcBuffer->n_samples_available = 0; + hTcBuffer->n_samples_flushed = n_samples_to_render; + hTcBuffer->n_samples_rendered = hTcBuffer->n_samples_granularity; + + for ( ch_idx = 0; ch_idx < MAX_CICP_CHANNELS; ch_idx++ ) + { + p_output[ch_idx] = output[ch_idx]; + } + + if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( ism_mode_old == ISM_MODE_DISC ) + { + /* Binaural rendering */ + if ( renderer_type_old == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ + set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity ); + + ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); + + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, + NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, p_output, p_output ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong ISM_MODE in VoIP renderer flushing!" ); + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( mc_mode_old == MC_MODE_MCT ) + { + if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV || renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, hIntSetupOld, + st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) + { + if ( ( ivas_td_binaural_renderer_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ) ) != IVAS_ERR_OK ) + { + return error; + } + + + ivas_binaural_add_LFE( st_ivas, hTcBuffer->n_samples_granularity, st_ivas->hTcBuffer->tc, p_output ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong MC_MODE in VoIP renderer flushing!" ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_WRONG_MODE, "Wrong IVAS format in VoIP renderer flushing!" ); + } + } + + /* Only write out the valid data*/ + ivas_limiter_dec( st_ivas->hLimiter, p_output, st_ivas->hDecoderConfig->nchan_out, *nSamplesRendered, st_ivas->BER_detect ); + +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + ivas_syn_output( p_output, *nSamplesRendered, st_ivas->hDecoderConfig->nchan_out, data ); + + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_set_discard_samples() + * + * Set number of samples to discard in the first subframe if the renderer granularity changes on a bitrate change + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_set_discard_samples( + Decoder_Struct *st_ivas /* i/o: main IVAS decoder structre */ +) +{ + int16_t nMaxSlotsPerSubframe, nSlotsInFirstSubframe; + ivas_error error; + + error = IVAS_ERR_OK; + + /* render first frame with front zero padding and discarding those samples */ + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->n_samples_discard = ( nMaxSlotsPerSubframe - nSlotsInFirstSubframe ) * st_ivas->hTcBuffer->n_samples_granularity; + /* set last subframes number to max to ensure correct continuation */ + st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nMaxSlotsPerSubframe; + } + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_linear_interpolator() + * + * Get an interpolator that is adapted to time scale modified IVAS frame + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_get_adapted_linear_interpolator( + const int16_t default_interp_length, /* i : default length of the (full-frame) interpolator */ + const int16_t interp_length, /* i : length of the interpolator to be created */ + float *interpolator /* o : the interpolator */ +) +{ + int16_t jbm_segment_len, idx; + float dec; +#ifdef DEBUGGING + assert( default_interp_length % 2 == 0 ); +#endif + + jbm_segment_len = ( default_interp_length >> 1 ); + dec = 1.0f / default_interp_length; + + interpolator[interp_length - 1] = 1.0f; + for ( idx = interp_length - 2; idx >= jbm_segment_len; idx-- ) + { + interpolator[idx] = max( 0.0f, interpolator[idx + 1] - dec ); + } + + if ( interpolator[idx + 1] > 0.0f ) + { + dec = interpolator[idx + 1] / ( jbm_segment_len + 1 ); + for ( ; idx >= 0; idx-- ) + { + interpolator[idx] = interpolator[idx + 1] - dec; + } + } + else + { + set_f( interpolator, 0.0f, idx + 1 ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_subframes() + * + * Get an interpolator that is adapted to time scale modified IVAS frame + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_get_adapted_subframes( + const int16_t nCldfbTs, /* i : number of time slots in the current frame */ + int16_t *subframe_nbslots, /* i/o: subframe grid */ + int16_t *nb_subframes /* i/o: number of subframes in the frame */ +) +{ + uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe; + uint16_t nCldfbSlotsLocal = nCldfbTs; + + /* get last subframe size from previous frame, determine how many slots have to be processed + in the first subframe (i.e. potential leftover of a 5ms subframe) */ + nSlotsInFirstSubframe = ( PARAM_MC_MAX_NSLOTS_IN_SUBFRAME - subframe_nbslots[*nb_subframes - 1] ); + *nb_subframes = 0; + if ( nSlotsInFirstSubframe > 0 ) + { + *nb_subframes = 1; + nCldfbSlotsLocal -= nSlotsInFirstSubframe; + } + + *nb_subframes += (int16_t) ceilf( (float) nCldfbSlotsLocal / (float) PARAM_MC_MAX_NSLOTS_IN_SUBFRAME ); + nSlotsInLastSubframe = nCldfbSlotsLocal % PARAM_MC_MAX_NSLOTS_IN_SUBFRAME; + + set_s( subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, *nb_subframes ); + + if ( nSlotsInFirstSubframe > 0 ) + { + subframe_nbslots[0] = nSlotsInFirstSubframe; + } + + if ( nSlotsInLastSubframe > 0 ) + { + subframe_nbslots[*nb_subframes - 1] = nSlotsInLastSubframe; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_adapted_linear_interpolator() + * + * Get an meta data map adapted to a time scale modified IVAS frame + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_get_md_map( + const int16_t default_len, /* i : default frame length in metadata slots */ + const int16_t len, /* i : length of the modfied frames in metadata slots */ + const int16_t subframe_len, /* i : default length of a subframe */ + const int16_t offset, /* i : current read offset into the md buffer */ + const int16_t buf_len, /* i : length of the metadata buffer */ + int16_t *map /* o : metadata index map */ +) +{ + int16_t jbm_segment_len, map_idx, src_idx, src_idx_map; + float dec, src_idx_f; + +#ifdef DEBUGGING + assert( default_len % 2 == 0 ); +#endif + jbm_segment_len = ( default_len >> 1 ); + dec = 1.0f / default_len; + + for ( map_idx = len - 1, src_idx = default_len - 1; map_idx >= jbm_segment_len; map_idx--, src_idx-- ) + { + src_idx_map = max( 0, src_idx / subframe_len ); + map[map_idx] = ( offset + src_idx_map ) % buf_len; + } + + /* changed part (first segment), interpolate index to parameters + (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ + if ( src_idx >= 0 ) + { + dec = ( (float) ( src_idx + 1 ) ) / ( (float) jbm_segment_len ); + src_idx_f = (float) ( src_idx + 1 ) - dec; + for ( ; map_idx >= 0; map_idx-- ) + { + src_idx = max( 0, ( (int16_t) round_f( src_idx_f ) ) / subframe_len ); + map[map_idx] = ( offset + src_idx ) % buf_len; + src_idx_f -= dec; + } + } + else + { + set_s( map, offset, map_idx + 1 ); + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_num_tc_channels() + * + * Get the number of transport channels provided by the JBM transport channel decode function + *--------------------------------------------------------------------------*/ + +int16_t ivas_jbm_dec_get_num_tc_channels( + Decoder_Struct *st_ivas /* i : IVAS decoder handle */ +) +{ + int16_t num_tc; + int32_t ivas_total_brate; + AUDIO_CONFIG output_config; + + if ( st_ivas->renderer_type == RENDERER_DISABLE ) + { + num_tc = st_ivas->hDecoderConfig->nchan_out; + } + else + { + num_tc = st_ivas->nchan_transport; + } + output_config = st_ivas->hDecoderConfig->output_config; + + ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; + if ( st_ivas->ivas_format == STEREO_FORMAT && st_ivas->hDecoderConfig->nchan_out == 1 ) + { + num_tc = 1; + } + else if ( st_ivas->ivas_format == ISM_FORMAT ) + { + if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) + { + num_tc = 1; + } + } + else if ( st_ivas->ivas_format == SBA_FORMAT || st_ivas->ivas_format == MASA_FORMAT ) + { + if ( st_ivas->sba_dirac_stereo_flag ) + { + num_tc = CPE_CHANNELS; + } + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) + { + num_tc = 1; /* Only one channel transported */ + } + + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) + { + num_tc = CPE_CHANNELS; + } + if ( st_ivas->ivas_format == SBA_FORMAT ) + { +#ifndef SBA_MODE_CLEAN_UP + if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && num_tc >= 3 ) || + ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && num_tc == 3 ) ) +#else + if ( ( st_ivas->sba_planar && num_tc >= 3 ) || ( num_tc == 3 ) ) +#endif + { + num_tc++; + } + } + } + else if ( st_ivas->ivas_format == MC_FORMAT ) + { + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) + { + num_tc = 1; + } + else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) + { + num_tc = 2; + } + else if ( st_ivas->mc_mode == MC_MODE_MCT ) + { + /* do all static dmx already in the TC decoder if less channels than transported... */ + if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) + { + if ( ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) > ( st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe ) ) + { + num_tc = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + } + } + else if ( ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + num_tc = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + } + else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) + { + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + num_tc++; + } + if ( st_ivas->hOutSetup.separateChannelEnabled && ( output_config == AUDIO_CONFIG_5_1 || output_config == AUDIO_CONFIG_7_1 || + output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1_4 || + output_config == AUDIO_CONFIG_5_1_2 || ( output_config == AUDIO_CONFIG_LS_CUSTOM && st_ivas->hOutSetup.num_lfe > 0 ) ) ) + { + /* LFE is synthesized in TD with the TCs*/ + num_tc++; + } + } + } + + return num_tc; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_copy_tc() + * + * Copy interleaved transport chnannels to the correct buffers, update the TC + * buffer handle + *--------------------------------------------------------------------------*/ + +static void ivas_jbm_dec_copy_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nSamplesForRendering, /* i : number of samples to digest */ + int16_t *nSamplesResidual, /* o : number of samples that will be left for the next frame */ + float *data, /* i : (interleaved) transport channel samples */ + float *tc_digest_f[] /* o : samples that will be directly digested (e.g. by CLDFB) */ +) +{ + int16_t ch; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + int16_t n_samples_still_available, m; + int16_t n_ch_full_copy; + int16_t n_ch_res_copy; + + hTcBuffer = st_ivas->hTcBuffer; + n_samples_still_available = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered; + hTcBuffer->n_samples_buffered = n_samples_still_available + nSamplesForRendering + hTcBuffer->n_samples_discard; + hTcBuffer->n_samples_available = hTcBuffer->n_samples_granularity * ( hTcBuffer->n_samples_buffered / hTcBuffer->n_samples_granularity ); + *nSamplesResidual = hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_available; + n_ch_full_copy = min( hTcBuffer->nchan_transport_jbm, hTcBuffer->nchan_buffer_full ); + n_ch_res_copy = hTcBuffer->nchan_transport_jbm - hTcBuffer->nchan_buffer_full; + + for ( ch = 0; ch < n_ch_full_copy; ch++ ) + { + set_zero( hTcBuffer->tc[ch], hTcBuffer->n_samples_discard ); + mvr2r( hTcBuffer->tc[ch] + hTcBuffer->n_samples_rendered, hTcBuffer->tc[ch] + hTcBuffer->n_samples_discard, n_samples_still_available ); + for ( m = 0; m < nSamplesForRendering; m++ ) + { + hTcBuffer->tc[ch][n_samples_still_available + hTcBuffer->n_samples_discard + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; + } + } + + if ( n_ch_res_copy > 0 ) + { + for ( ; ch < hTcBuffer->nchan_transport_jbm; ch++ ) + { + mvr2r( hTcBuffer->tc[ch], tc_digest_f[ch], n_samples_still_available ); + for ( m = 0; m < nSamplesForRendering; m++ ) + { + tc_digest_f[ch][n_samples_still_available + m] = data[m * st_ivas->hTcBuffer->nchan_transport_jbm + ch]; + } + mvr2r( tc_digest_f[ch] + hTcBuffer->n_samples_available, hTcBuffer->tc[ch], *nSamplesResidual ); + } + } + + hTcBuffer->n_samples_rendered = 0; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_render_granularity() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: render granularity */ +int16_t ivas_jbm_dec_get_render_granularity( + const RENDERER_TYPE rendererType, /* i : renderer type */ + const int32_t output_Fs /* i : sampling rate */ +) +{ + int16_t render_granularity; + + if ( rendererType == RENDERER_BINAURAL_OBJECTS_TD || rendererType == RENDERER_BINAURAL_MIXER_CONV || rendererType == RENDERER_BINAURAL_MIXER_CONV_ROOM ) + { + render_granularity = NS2SA( output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); + } + else + { + render_granularity = NS2SA( output_Fs, CLDFB_SLOT_NS ); + } + + return render_granularity; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_open() + * + * open and initialize JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc_buffer_open( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : buffer mode */ + const int16_t nchan_transport_jbm, /* i : number of real transport channels */ + const int16_t nchan_transport_internal, /* i : number of totally buffered channels */ + const int16_t nchan_full, /* i : number of channels to fully store */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +) +{ + int16_t nsamp_to_allocate; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + ivas_error error; + int16_t nMaxSlotsPerSubframe; + int16_t nchan_residual; + int16_t ch_idx; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hTcBuffer = (DECODER_TC_BUFFER_HANDLE) malloc( sizeof( DECODER_TC_BUFFER ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + + hTcBuffer->tc_buffer_mode = tc_buffer_mode; + hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; + hTcBuffer->nchan_transport_internal = nchan_transport_internal; + hTcBuffer->nchan_buffer_full = nchan_full; + nchan_residual = nchan_transport_internal - nchan_full; + hTcBuffer->n_samples_granularity = n_samples_granularity; + hTcBuffer->n_samples_available = 0; + hTcBuffer->n_samples_buffered = 0; + hTcBuffer->n_samples_rendered = 0; + hTcBuffer->slots_rendered = 0; + hTcBuffer->subframes_rendered = 0; + hTcBuffer->n_samples_discard = 0; + hTcBuffer->n_samples_flushed = 0; + hTcBuffer->nb_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + nsamp_to_allocate = 0; + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / hTcBuffer->n_samples_granularity; + hTcBuffer->num_slots = nMaxSlotsPerSubframe * MAX_PARAM_SPATIAL_SUBFRAMES; + set_s( hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + + if ( hTcBuffer->tc_buffer_mode == TC_BUFFER_MODE_NONE ) + { + hTcBuffer->tc_buffer = NULL; + for ( ch_idx = 0; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + } + else + { + int16_t n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); + int16_t n_samp_residual = hTcBuffer->n_samples_granularity - 1; + int32_t offset; + + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; + nsamp_to_allocate += nchan_residual * n_samp_residual; + + if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); + + offset = 0; + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_full; + } + for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_residual; + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + } + + st_ivas->hTcBuffer = hTcBuffer; + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_reconfigure() + * + * open and initialize JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +ivas_error ivas_jbm_dec_tc_buffer_reconfigure( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const TC_BUFFER_MODE tc_buffer_mode, /* i : new buffer mode */ + const int16_t nchan_transport_jbm, /* i : new number of real transport channels */ + const int16_t nchan_transport_internal, /* i : new number of totally buffered channels */ + const int16_t nchan_full, /* i : new number of channels to fully store */ + const int16_t n_samples_granularity /* i : new granularity of the renderer/buffer */ +) +{ + ivas_error error; + int16_t nsamp_to_allocate, n_samp_full, n_samp_residual, offset, nchan_residual; + int16_t ch_idx; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + error = IVAS_ERR_OK; + + hTcBuffer = st_ivas->hTcBuffer; + + /* if granularity changes, adapt subframe_nb_slots */ + if ( n_samples_granularity != hTcBuffer->n_samples_granularity ) + { +#ifdef DEBUGGING + int16_t nMaxSlotsPerSubframeOld; +#endif + int16_t nMaxSlotsPerSubframeNew; + + nMaxSlotsPerSubframeNew = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / n_samples_granularity; +#ifdef DEBUGGING + nMaxSlotsPerSubframeOld = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + assert( hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] == nMaxSlotsPerSubframeOld ); + if ( n_samples_granularity < hTcBuffer->n_samples_granularity ) + { + assert( ( hTcBuffer->n_samples_granularity % n_samples_granularity ) == 0 ); + } + else + { + assert( ( n_samples_granularity % hTcBuffer->n_samples_granularity ) == 0 ); + } +#endif + /* if samples were flushed, take that into account here */ + if ( n_samples_granularity < hTcBuffer->n_samples_granularity && hTcBuffer->n_samples_flushed > 0 ) + { + hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = hTcBuffer->n_samples_flushed / n_samples_granularity; + hTcBuffer->n_samples_flushed = 0; + } + else + { + hTcBuffer->subframe_nbslots[hTcBuffer->subframes_rendered - 1] = nMaxSlotsPerSubframeNew; + } + } + + hTcBuffer->tc_buffer_mode = tc_buffer_mode; + hTcBuffer->nchan_transport_jbm = nchan_transport_jbm; + hTcBuffer->nchan_transport_internal = nchan_transport_internal; + hTcBuffer->nchan_buffer_full = nchan_full; + nchan_residual = nchan_transport_internal - nchan_full; + hTcBuffer->n_samples_granularity = n_samples_granularity; +#ifdef DEBUGGING + /* what is remaining from last frames needs always be smaller than n_samples_granularity */ + assert( ( hTcBuffer->n_samples_buffered - hTcBuffer->n_samples_rendered ) < n_samples_granularity ); +#endif + + /* realloc buffers */ + free( hTcBuffer->tc_buffer ); + n_samp_full = ( NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_L_FRAME_NS ) + hTcBuffer->n_samples_granularity - 1 ); + n_samp_residual = hTcBuffer->n_samples_granularity - 1; + nsamp_to_allocate = hTcBuffer->nchan_buffer_full * n_samp_full; + nsamp_to_allocate += nchan_residual * n_samp_residual; + + if ( ( hTcBuffer->tc_buffer = (float *) malloc( nsamp_to_allocate * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM TC Buffer\n" ) ); + } + set_zero( hTcBuffer->tc_buffer, nsamp_to_allocate ); + + offset = 0; + for ( ch_idx = 0; ch_idx < hTcBuffer->nchan_buffer_full; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_full; + } + for ( ; ch_idx < hTcBuffer->nchan_transport_internal; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = &hTcBuffer->tc_buffer[offset]; + offset += n_samp_residual; + } + for ( ; ch_idx < MAX_TRANSPORT_CHANNELS; ch_idx++ ) + { + hTcBuffer->tc[ch_idx] = NULL; + } + + return error; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_playout() + * + * + *--------------------------------------------------------------------------*/ + +static void ivas_jbm_dec_tc_buffer_playout( + Decoder_Struct *st_ivas, + const uint16_t nSamplesAsked, + uint16_t *nSamplesRendered, + float *output[] ) +{ + + int16_t ch_idx, slot_size, slots_to_render, first_sf, last_sf; + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, nSamplesAsked / slot_size ); + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + *nSamplesRendered = (uint16_t) slots_to_render * slot_size; + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( ch_idx = 0; ch_idx < st_ivas->hTcBuffer->nchan_transport_jbm; ch_idx++ ) + { + mvr2r( st_ivas->hTcBuffer->tc[ch_idx] + st_ivas->hTcBuffer->n_samples_rendered, output[ch_idx], *nSamplesRendered ); + } + + st_ivas->hTcBuffer->subframes_rendered = last_sf; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_tc_buffer_close() + * + * Close JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_tc_buffer_close( + DECODER_TC_BUFFER_HANDLE *phTcBuffer /* i/o: TC buffer handle */ +) +{ + int16_t i; + + if ( *phTcBuffer != NULL ) + { + for ( i = 0; i < MAX_TRANSPORT_CHANNELS; i++ ) + { + ( *phTcBuffer )->tc[i] = NULL; + } + if ( ( *phTcBuffer )->tc_buffer != NULL ) + { + free( ( *phTcBuffer )->tc_buffer ); + ( *phTcBuffer )->tc_buffer = NULL; + } + + free( *phTcBuffer ); + *phTcBuffer = NULL; + } + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_td_renderers_adapt_subframes() + * + * Close JBM transport channel buffer + *--------------------------------------------------------------------------*/ + +void ivas_jbm_dec_td_renderers_adapt_subframes( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + int16_t nMaxSlotsPerSubframe, nSlotsAvailable; + uint16_t nSlotsInLastSubframe, nSlotsInFirstSubframe; + + nMaxSlotsPerSubframe = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / ( FRAMES_PER_SEC * MAX_PARAM_SPATIAL_SUBFRAMES ) ) / st_ivas->hTcBuffer->n_samples_granularity; + nSlotsAvailable = st_ivas->hTcBuffer->n_samples_available / st_ivas->hTcBuffer->n_samples_granularity; + st_ivas->hTcBuffer->num_slots = nSlotsAvailable; + st_ivas->hTcBuffer->n_samples_available = nSlotsAvailable * st_ivas->hTcBuffer->n_samples_granularity; + nSlotsInFirstSubframe = nMaxSlotsPerSubframe - st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1]; + st_ivas->hTcBuffer->nb_subframes = 0; + + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->nb_subframes = 1; + nSlotsAvailable -= nSlotsInFirstSubframe; + } + st_ivas->hTcBuffer->nb_subframes += (int16_t) ceilf( (float) nSlotsAvailable / (float) nMaxSlotsPerSubframe ); + nSlotsInLastSubframe = nSlotsAvailable % nMaxSlotsPerSubframe; + set_s( st_ivas->hTcBuffer->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( st_ivas->hTcBuffer->subframe_nbslots, nMaxSlotsPerSubframe, st_ivas->hTcBuffer->nb_subframes ); + + if ( nSlotsInFirstSubframe > 0 ) + { + st_ivas->hTcBuffer->subframe_nbslots[0] = nSlotsInFirstSubframe; + } + + if ( nSlotsInLastSubframe > 0 ) + { + st_ivas->hTcBuffer->subframe_nbslots[st_ivas->hTcBuffer->nb_subframes - 1] = nSlotsInLastSubframe; + } + + st_ivas->hTcBuffer->slots_rendered = 0; + st_ivas->hTcBuffer->subframes_rendered = 0; + + return; +} + + +/*--------------------------------------------------------------------------* + * ivas_jbm_dec_get_tc_buffer_mode() + * + * + *--------------------------------------------------------------------------*/ + +TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + TC_BUFFER_MODE buffer_mode; + buffer_mode = TC_BUFFER_MODE_BUFFER; + + switch ( st_ivas->renderer_type ) + { + /* all renderers where we are done after TC decoding (might include DMX to mono/stereo */ + case RENDERER_DISABLE: + case RENDERER_MCMASA_MONO_STEREO: + case RENDERER_MONO_DOWNMIX: + buffer_mode = TC_BUFFER_MODE_BUFFER; + break; + case RENDERER_TD_PANNING: + case RENDERER_BINAURAL_OBJECTS_TD: + case RENDERER_BINAURAL_FASTCONV: + case RENDERER_BINAURAL_FASTCONV_ROOM: + case RENDERER_BINAURAL_PARAMETRIC: + case RENDERER_BINAURAL_PARAMETRIC_ROOM: + case RENDERER_STEREO_PARAMETRIC: + case RENDERER_DIRAC: + case RENDERER_PARAM_ISM: + case RENDERER_BINAURAL_MIXER_CONV: + case RENDERER_BINAURAL_MIXER_CONV_ROOM: +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + case RENDERER_NON_DIEGETIC_DOWNMIX: +#endif + buffer_mode = TC_BUFFER_MODE_RENDERER; + break; + case RENDERER_MC_PARAMMC: + if ( st_ivas->hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; /* TCs are already the DMX to mono or stereo */ + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_MC: + if ( ivas_jbm_dec_get_num_tc_channels( st_ivas ) != st_ivas->hDecoderConfig->nchan_out ) + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_SBA_LINEAR_ENC: + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT && ( st_ivas->renderer_type == RENDERER_MC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) && ( st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe ) >= ( st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe ) ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; + case RENDERER_SBA_LINEAR_DEC: +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) +#endif + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + else + { + buffer_mode = TC_BUFFER_MODE_RENDERER; + } + break; +#ifdef DEBUGGING + default: + assert( 0 ); +#endif + } + + return buffer_mode; +} +#endif diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 9cadbcc4fc..8d6cebe036 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -47,17 +47,22 @@ /*-----------------------------------------------------------------------* * Local constants *-----------------------------------------------------------------------*/ + #define SPAR_META_DELAY_SUBFRAMES 2 /* Number of subframes to delay the SPAR metadata */ #define SPH_IDX_FRONT ( MASA_NO_POINTS_EQUATOR / 2 ) /* Spherical index corresponding to front direction for setting as default value */ + /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ - +#ifndef HR_METADATA static int16_t quantize_theta( float x, int16_t no_cb, float *xhat ); static uint16_t index_theta_phi_16( float theta, float phi, SPHERICAL_GRID_DATA *Sph_Grid16 ); static int16_t quantize_phi_masa( float phi, int16_t flag_delta, float *phi_hat, const int16_t n ); +#endif + static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 ); + static void create_masa_ext_out_meta( MASA_DECODER *hMasa, IVAS_QMETADATA_HANDLE hQMetaData, const int16_t nchan_transport ); static void replicate_subframes( IVAS_QMETADATA_HANDLE hQMetaData ); @@ -191,8 +196,36 @@ ivas_error ivas_masa_decode( /* Remove already read bits from the bit budget */ hQMetaData->metadata_max_bits -= *nb_bits_read; - - *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos ); +#ifdef HR_METADATA + if ( ivas_total_brate >= IVAS_384k ) + { + if ( ivas_total_brate >= IVAS_512k ) + { + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 +#ifdef FIX_HBR_MASAMETA + , + hMasa->config.numCodingBands +#endif + ); + } + else + { + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 +#ifdef FIX_HBR_MASAMETA + , + hMasa->config.numCodingBands +#endif + ); + } + } + else + { +#endif + *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos, + 0 ); +#ifdef HR_METADATA + } +#endif /* Get direction decoding quality. EC 1 and 2 are handled by the default value. */ if ( hQMetaData->ec_flag == 2 ) @@ -254,8 +287,11 @@ ivas_error ivas_masa_decode( } tmp_elem_mode = -1; +#ifndef SBA_MODE_CLEAN_UP *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format, SBA_MODE_NONE ); - +#else + *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format ); +#endif if ( st_ivas->nchan_transport == 2 ) { assert( st_ivas->nCPE > 0 ); @@ -275,7 +311,14 @@ ivas_error ivas_masa_decode( } if ( st_ivas->hDirAC != NULL ) { - ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, SBA_MODE_NONE, 0 ); + ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, +#ifndef SBA_MODE_CLEAN_UP + SBA_MODE_NONE, +#else + ivas_format, +#endif + 0, + 0 ); } st->next_bit_pos = next_bit_pos_orig; @@ -371,6 +414,27 @@ ivas_error ivas_masa_dec_open( st_ivas->hMasa = hMasa; +#ifdef JBM_TSM_ON_TCS + /* allocate transport channels*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) + { + int16_t nchan_to_allocate; + TC_BUFFER_MODE buffer_mode; + + buffer_mode = TC_BUFFER_MODE_RENDERER; + if ( st_ivas->mc_mode == MC_MODE_MCMASA && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + } + + nchan_to_allocate = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_to_allocate, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif /* JBM_TMS_ON_TCS*/ + return error; } @@ -452,6 +516,10 @@ static ivas_error ivas_masa_dec_config( { int16_t i; MASA_DECODER_HANDLE hMasa; +#ifdef FIX_HBR_MASAMETA + uint8_t maxBand; + int16_t maxBin; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -460,6 +528,19 @@ static ivas_error ivas_masa_dec_config( ivas_masa_set_elements( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE ); ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ); + +#ifdef HR_METADATA + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_512k ) + { + hMasa->config.mergeRatiosOverSubframes = 0; + /* initialize spherical grid */ + if ( hMasa->data.sph_grid16 == NULL ) + { + hMasa->data.sph_grid16 = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ); + generate_gridEq( hMasa->data.sph_grid16 ); + } + } +#endif st_ivas->hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits; st_ivas->hQMetaData->bandMap = hMasa->data.band_mapping; st_ivas->hQMetaData->nchan_transport = st_ivas->nchan_transport; @@ -489,6 +570,26 @@ static ivas_error ivas_masa_dec_config( ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format ); +#ifdef FIX_HBR_MASAMETA + /* Find maximum band usable */ + maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH ); + maxBand = 0; + while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin ) + { + maxBand++; + } + maxBand--; + + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) + { + /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, hMasa->data.extOutMeta ); + } + else + { + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL ); + } +#else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ @@ -498,6 +599,7 @@ static ivas_error ivas_masa_dec_config( { masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, NULL ); } +#endif return error; } @@ -515,7 +617,11 @@ void ivas_masa_prerender( const int16_t output_frame /* i : output frame length per channel */ ) { +#ifdef FIX_490_MASA_2TC_LBR_DTX + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) +#else if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) +#endif { if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { @@ -537,7 +643,7 @@ void ivas_masa_prerender( /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ - +#ifndef HR_METADATA /* !r: index of quantized value */ static int16_t quantize_theta( float x, /* i : theta value to be quantized */ @@ -706,7 +812,7 @@ static uint16_t index_theta_phi_16( return idx_sph; } - +#endif static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, @@ -721,8 +827,8 @@ static void index_16bits( { for ( block = 0; block < hQMetaData->q_direction[0].cfg.nblocks; block++ ) { - hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( hQMetaData->q_direction[d].band_data[band].elevation[block], - hQMetaData->q_direction[d].band_data[band].azimuth[block], Sph_Grid16 ); + hQMetaData->q_direction[d].band_data[band].spherical_index[block] = index_theta_phi_16( &( hQMetaData->q_direction[d].band_data[band].elevation[block] ), + &( hQMetaData->q_direction[d].band_data[band].azimuth[block] ), Sph_Grid16 ); } } } @@ -1077,6 +1183,7 @@ ivas_error ivas_masa_dec_reconfigure( uint16_t *bit_stream; Decoder_State **sts; int32_t ivas_total_brate, last_ivas_total_brate; + int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; ivas_error error; error = IVAS_ERR_OK; @@ -1084,6 +1191,26 @@ ivas_error ivas_masa_dec_reconfigure( ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; last_ivas_total_brate = st_ivas->hDecoderConfig->last_ivas_total_brate; + ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); + + /* renderer might have changed, reselect */ + ivas_renderer_select( st_ivas ); + + if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->hDirAC == NULL ) + { + /* init a new DirAC dec */ + if ( ( error = ivas_dirac_dec_config( st_ivas, DIRAC_OPEN ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( st_ivas->renderer_type == RENDERER_DISABLE && st_ivas->hDirAC != NULL ) + { + /* close unnecessary DirAC dec */ + ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + } + /* possible reconfigure is done later */ + /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles *-----------------------------------------------------------------*/ @@ -1140,34 +1267,85 @@ ivas_error ivas_masa_dec_reconfigure( } } } + if ( st_ivas->hDiracDecBin != NULL ) + { + /* regularization factor is bitrate-dependent */ + st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); + } + /*-----------------------------------------------------------------* + * TD Decorrelator + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDiracDecBin != NULL ) + { + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, st_ivas->nchan_transport, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + + /*-----------------------------------------------------------------* + * Set-up MASA coding elements and bitrates + *-----------------------------------------------------------------*/ ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active == 1 ) + { + int16_t tc_nchan_to_allocate; + int16_t tc_nchan_transport; + TC_BUFFER_MODE buffer_mode_new; + + buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_transport = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + + tc_nchan_to_allocate = tc_nchan_transport; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + + if ( tc_nchan_transport != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || buffer_mode_new != st_ivas->hTcBuffer->tc_buffer_mode ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, buffer_mode_new, tc_nchan_transport, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif + return error; } -/*-------------------------------------------------------------------* - * ivas_spar_param_to_masa_param_mapping() - * - * Determine MASA metadata from the SPAR metadata - *-------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +#endif void ivas_spar_param_to_masa_param_mapping( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t firstSubframe, /* i : First subframe to map */ - const int16_t nSubframes /* i : Number of subframes to map */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ + const int16_t subframe /* i : Subframe to map */ ) { - int16_t i, j, sf, band, bin, slot, ch, nBins, nchan_transport; + int16_t i, j, band, bin, slot, ch, nBins, nchan_transport; int16_t mixer_mat_index; int16_t dirac_write_idx; DIRAC_DEC_HANDLE hDirAC; DIFFUSE_DISTRIBUTION_HANDLE hDiffuseDist; - float mixer_mat_sf_bands_real[MAX_PARAM_SPATIAL_SUBFRAMES][SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS]; - float mixer_mat_sf_bins_real[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS]; + float mixer_mat_sf_bands_real[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS][FOA_CHANNELS]; + float mixer_mat_sf_bins_real[CLDFB_NO_CHANNELS_MAX][FOA_CHANNELS][FOA_CHANNELS]; int16_t *band_grouping; int16_t band_start, band_end; float transportSignalEnergies[2][CLDFB_NO_CHANNELS_MAX]; @@ -1177,6 +1355,11 @@ void ivas_spar_param_to_masa_param_mapping( float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; float Iy, Iz, Ix, E, azi, ele, I, ratio; float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum; +#ifdef JBM_TSM_ON_TCS + int16_t slot_idx, slot_idx_start, sf; + SPAR_DEC_HANDLE hSpar; + float slot_fac; +#endif /* Set values */ hDirAC = st_ivas->hDirAC; @@ -1184,7 +1367,12 @@ void ivas_spar_param_to_masa_param_mapping( hDiffuseDist = st_ivas->hDirAC->hDiffuseDist; nchan_transport = st_ivas->nchan_transport; band_grouping = hDirAC->band_grouping; +#ifdef JBM_TSM_ON_TCS + hSpar = st_ivas->hSpar; + dirac_write_idx = hDirAC->render_to_md_map[subframe]; +#else dirac_write_idx = hDirAC->dirac_read_idx; /* Mixing matrices, from which MASA meta is determined, already have the delay compensation */ +#endif /* Init arrays */ for ( i = 0; i < FOA_CHANNELS; i++ ) @@ -1193,54 +1381,75 @@ void ivas_spar_param_to_masa_param_mapping( } /* Delay the SPAR mixing matrices to have them synced with the audio */ - for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ ) +#ifdef JBM_TSM_ON_TCS + slot_idx_start = hSpar->slots_rendered; + slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe]; + + for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ ) { - if ( sf < SPAR_META_DELAY_SUBFRAMES ) + sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME; +#endif + if ( subframe < SPAR_META_DELAY_SUBFRAMES ) { +#ifdef JBM_TSM_ON_TCS mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; +#else + mixer_mat_index = subframe + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; +#endif for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) { for ( i = 0; i < FOA_CHANNELS; i++ ) { for ( j = 0; j < FOA_CHANNELS; j++ ) { - mixer_mat_sf_bands_real[sf][band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; +#ifdef JBM_TSM_ON_TCS + mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; +#else + mixer_mat_sf_bands_real[band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; +#endif } } } } else { +#ifdef JBM_TSM_ON_TCS mixer_mat_index = sf - SPAR_META_DELAY_SUBFRAMES; +#else + mixer_mat_index = subframe - SPAR_META_DELAY_SUBFRAMES; +#endif for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) { for ( i = 0; i < FOA_CHANNELS; i++ ) { for ( j = 0; j < FOA_CHANNELS; j++ ) { - mixer_mat_sf_bands_real[sf][band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; +#ifdef JBM_TSM_ON_TCS + mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; +#else + mixer_mat_sf_bands_real[band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; +#endif } } } } +#ifdef JBM_TSM_ON_TCS } +#endif /* Map the mixing matrices from the frequency bands to frequency bins */ bin = 0; - for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ ) + for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) { - for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) + band_start = band_grouping[band]; + band_end = band_grouping[band + 1]; + for ( bin = band_start; bin < band_end; bin++ ) { - band_start = band_grouping[band]; - band_end = band_grouping[band + 1]; - for ( bin = band_start; bin < band_end; bin++ ) + for ( i = 0; i < FOA_CHANNELS; i++ ) { - for ( i = 0; i < FOA_CHANNELS; i++ ) + for ( j = 0; j < FOA_CHANNELS; j++ ) { - for ( j = 0; j < FOA_CHANNELS; j++ ) - { - mixer_mat_sf_bins_real[sf][bin][i][j] = mixer_mat_sf_bands_real[sf][band][i][j]; - } + mixer_mat_sf_bins_real[bin][i][j] = mixer_mat_sf_bands_real[band][i][j]; } } } @@ -1248,125 +1457,143 @@ void ivas_spar_param_to_masa_param_mapping( nBins = bin; /* Determine MASA metadata */ - for ( sf = firstSubframe; sf < ( firstSubframe + nSubframes ); sf++ ) + /* Determine transport signal energies and cross correlations when more than 1 TC */ + if ( nchan_transport == 2 ) { - /* Determine transport signal energies and cross correlations when more than 1 TC */ - if ( nchan_transport == 2 ) + set_zero( transportSignalEnergies[0], nBins ); + set_zero( transportSignalEnergies[1], nBins ); + set_zero( transportSignalCrossCorrelation, nBins ); + +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) +#else + for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) +#endif { - set_zero( transportSignalEnergies[0], nBins ); - set_zero( transportSignalEnergies[1], nBins ); - set_zero( transportSignalCrossCorrelation, nBins ); - - for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) + for ( bin = 0; bin < nBins; bin++ ) { - int16_t slotThis = slot + ( hDirAC->subframe_nbslots * sf ); - - for ( bin = 0; bin < nBins; bin++ ) + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - instEne = ( inRe[ch][slotThis][bin] * inRe[ch][slotThis][bin] ); - instEne += ( inIm[ch][slotThis][bin] * inIm[ch][slotThis][bin] ); - transportSignalEnergies[ch][bin] += instEne; - } - transportSignalCrossCorrelation[bin] += inRe[0][slotThis][bin] * inRe[1][slotThis][bin]; - transportSignalCrossCorrelation[bin] += inIm[0][slotThis][bin] * inIm[1][slotThis][bin]; + instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ); + instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + transportSignalEnergies[ch][bin] += instEne; } + transportSignalCrossCorrelation[bin] += inRe[0][slot][bin] * inRe[1][slot][bin]; + transportSignalCrossCorrelation[bin] += inIm[0][slot][bin] * inIm[1][slot][bin]; } } + } - if ( hDiffuseDist != NULL ) + if ( hDiffuseDist != NULL ) + { +#ifdef JBM_TSM_ON_TCS + set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX ); +#else + set_zero( hDiffuseDist->diffuseRatioX[subframe], CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioY[subframe], CLDFB_NO_CHANNELS_MAX ); + set_zero( hDiffuseDist->diffuseRatioZ[subframe], CLDFB_NO_CHANNELS_MAX ); +#endif + } + + for ( bin = 0; bin < nBins; bin++ ) + { + /* Set the energy of the first transport signal */ + if ( nchan_transport == 1 ) { - set_zero( hDiffuseDist->diffuseRatioX[sf], CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioY[sf], CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioZ[sf], CLDFB_NO_CHANNELS_MAX ); + inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */ } + else + { + inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */ + } + /* Decorrelated channels assumed to have the same energy as the source channel */ + inCovarianceMtx[1][1] = inCovarianceMtx[0][0]; + inCovarianceMtx[2][2] = inCovarianceMtx[0][0]; + inCovarianceMtx[3][3] = inCovarianceMtx[0][0]; - for ( bin = 0; bin < nBins; bin++ ) + /* In case residuals were transmitted, use their actual energies and cross correlations */ + if ( nchan_transport == 2 ) + { + inCovarianceMtx[1][1] = transportSignalEnergies[1][bin]; + inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin]; + inCovarianceMtx[1][0] = inCovarianceMtx[0][1]; + } + + compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[bin] ); + + /* Estimate MASA metadata */ + Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */ + Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */ + Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */ + I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */ + E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */ + azi = atan2f( Iy, Ix ); /* Azimuth */ + ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */ + ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */ + ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) ); + + hDirAC->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 ); + hDirAC->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 ); + hDirAC->energy_ratio1[dirac_write_idx][bin] = ratio; + hDirAC->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio; + + hDirAC->spreadCoherence[dirac_write_idx][bin] = 0.0f; + hDirAC->surroundingCoherence[dirac_write_idx][bin] = 0.0f; + + /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */ + if ( hDiffuseDist != NULL ) { - /* Set the energy of the first transport signal */ if ( nchan_transport == 1 ) { - inCovarianceMtx[0][0] = 1.0f; /* In case of 1TC, fixed value can be used */ + diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] ); + diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] ); + diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] ); + } + else if ( nchan_transport == 2 ) + { + diffuseGainY = fabsf( mixer_mat_sf_bins_real[bin][1][1] * transportSignalEnergies[1][bin] ); + diffuseGainX = fabsf( mixer_mat_sf_bins_real[bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][3][1] * transportSignalEnergies[1][bin] ); + diffuseGainZ = fabsf( mixer_mat_sf_bins_real[bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[bin][2][1] * transportSignalEnergies[1][bin] ); } else { - inCovarianceMtx[0][0] = transportSignalEnergies[0][bin]; /* In case of 2TC, use actual energies */ + diffuseGainY = 1.0f; + diffuseGainX = 1.0f; + diffuseGainZ = 1.0f; } - /* Decorrelated channels assumed to have the same energy as the source channel */ - inCovarianceMtx[1][1] = inCovarianceMtx[0][0]; - inCovarianceMtx[2][2] = inCovarianceMtx[0][0]; - inCovarianceMtx[3][3] = inCovarianceMtx[0][0]; - /* In case residuals were transmitted, use their actual energies and cross correlations */ - if ( nchan_transport == 2 ) + diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ; + +#ifdef JBM_TSM_ON_TCS + if ( diffuseGainSum == 0.0f ) { - inCovarianceMtx[1][1] = transportSignalEnergies[1][bin]; - inCovarianceMtx[0][1] = transportSignalCrossCorrelation[bin]; - inCovarianceMtx[1][0] = inCovarianceMtx[0][1]; + hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioY[bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioZ[bin] = 1.0f / 3.0f; } - - compute_foa_cov_matrix( foaCovarianceMtx, inCovarianceMtx, mixer_mat_sf_bins_real[sf][bin] ); - - /* Estimate MASA metadata */ - Iy = foaCovarianceMtx[0][1]; /* Intensity in Y direction */ - Iz = foaCovarianceMtx[0][2]; /* Intensity in Z direction */ - Ix = foaCovarianceMtx[0][3]; /* Intensity in X direction */ - I = sqrtf( Ix * Ix + Iy * Iy + Iz * Iz ); /* Intensity vector length */ - E = ( foaCovarianceMtx[0][0] + foaCovarianceMtx[1][1] + foaCovarianceMtx[2][2] + foaCovarianceMtx[3][3] ) / 2.0f; /* Overall energy */ - azi = atan2f( Iy, Ix ); /* Azimuth */ - ele = atan2f( Iz, sqrtf( Ix * Ix + Iy * Iy ) ); /* Elevation */ - ratio = I / fmaxf( 1e-12f, E ); /* Energy ratio */ - ratio = fmaxf( 0.0f, fminf( 1.0f, ratio ) ); - - hDirAC->azimuth[dirac_write_idx][bin] = (int16_t) roundf( azi / PI_OVER_180 ); - hDirAC->elevation[dirac_write_idx][bin] = (int16_t) roundf( ele / PI_OVER_180 ); - hDirAC->energy_ratio1[dirac_write_idx][bin] = ratio; - hDirAC->diffuseness_vector[dirac_write_idx][bin] = 1.0f - ratio; - - hDirAC->spreadCoherence[dirac_write_idx][bin] = 0.0f; - hDirAC->surroundingCoherence[dirac_write_idx][bin] = 0.0f; - - /* Determine directional distribution of the indirect audio based on the SPAR mixing matrices (and the transport audio signals when 2 TC) */ - if ( hDiffuseDist != NULL ) + else { - if ( nchan_transport == 1 ) - { - diffuseGainY = fabsf( mixer_mat_sf_bins_real[sf][bin][1][1] ); - diffuseGainX = fabsf( mixer_mat_sf_bins_real[sf][bin][3][2] ); - diffuseGainZ = fabsf( mixer_mat_sf_bins_real[sf][bin][2][3] ); - } - else if ( nchan_transport == 2 ) - { - diffuseGainY = fabsf( mixer_mat_sf_bins_real[sf][bin][1][1] * transportSignalEnergies[1][bin] ); - diffuseGainX = fabsf( mixer_mat_sf_bins_real[sf][bin][3][2] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[sf][bin][3][1] * transportSignalEnergies[1][bin] ); - diffuseGainZ = fabsf( mixer_mat_sf_bins_real[sf][bin][2][3] * transportSignalEnergies[0][bin] ) + fabsf( mixer_mat_sf_bins_real[sf][bin][2][1] * transportSignalEnergies[1][bin] ); - } - else - { - diffuseGainY = 1.0f; - diffuseGainX = 1.0f; - diffuseGainZ = 1.0f; - } - - diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ; - - if ( diffuseGainSum == 0.0f ) - { - hDiffuseDist->diffuseRatioX[sf][bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioY[sf][bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioZ[sf][bin] = 1.0f / 3.0f; - } - else - { - hDiffuseDist->diffuseRatioX[sf][bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioY[sf][bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioZ[sf][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); - } + hDiffuseDist->diffuseRatioX[bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); + } +#else + if ( diffuseGainSum == 0.0f ) + { + hDiffuseDist->diffuseRatioX[subframe][bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioY[subframe][bin] = 1.0f / 3.0f; + hDiffuseDist->diffuseRatioZ[subframe][bin] = 1.0f / 3.0f; } + else + { + hDiffuseDist->diffuseRatioX[subframe][bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioY[subframe][bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); + hDiffuseDist->diffuseRatioZ[subframe][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); + } +#endif } - - dirac_write_idx = ( dirac_write_idx + 1 ) % hDirAC->dirac_md_buffer_length; } return; diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index a6637ed1f2..4be35d188e 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -76,7 +76,11 @@ typedef struct parameter_band_mapping_struct static void ivas_param_mc_dec_init( PARAM_MC_DEC_HANDLE hParamMC, const int16_t nchan_in, const int16_t nchan_out ); +#ifdef JBM_TSM_ON_TCS +static void param_mc_protoSignalComputation( float *RealBuffer, float *ImagBuffer, float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t num_freq_bands ); +#else static void param_mc_protoSignalComputation( float RealBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t slot_index, const int16_t num_freq_bands ); +#endif static void ivas_param_mc_dec_copy_diffuse_proto( PARAM_MC_DEC_HANDLE hParamMC, float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nY, const int16_t slot_idx ); @@ -86,13 +90,23 @@ static int16_t ivas_param_mc_uniform_decoder( float *seq, const int16_t sz_seq, static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hDirAC, float *ild_q, float *icc_q, const int16_t param_band_index, const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nY, const int16_t nX, float *Cx_state, float *Cproto, float *Cy_state ); +#ifdef JBM_TSM_ON_TCS +static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); + +static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); +#else static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); +#endif +#ifdef JBM_TSM_ON_TCS +static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float *mixing_matrix[], float *mixing_matrix_res[], const uint16_t nX, const uint16_t nY ); +#else static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const uint16_t nX, const uint16_t nY ); +#endif -static void param_mc_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator ); +static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator ); static void param_mc_set_num_synth_bands( const int32_t output_Fs, PARAM_MC_DEC_HANDLE hParamMC ); @@ -224,7 +238,13 @@ ivas_error ivas_param_mc_dec_open( *-----------------------------------------------------------------*/ hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; +#ifdef JBM_TSM_ON_TCS + set_s( hParamMC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hParamMC->subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hParamMC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; +#else hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC; +#endif hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -420,6 +440,9 @@ ivas_error ivas_param_mc_dec_open( return error; } +#ifdef JBM_TSM_ON_TCS + ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#endif /* Head rotation */ if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && st_ivas->hDecoderConfig->Opt_Headrotation ) @@ -455,6 +478,39 @@ ivas_error ivas_param_mc_dec_open( ivas_param_mc_dec_init( hParamMC, nchan_transport, nchan_out_cov ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) + { + if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero( hParamMC->Cldfb_RealBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands ); + + if ( ( hParamMC->Cldfb_ImagBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Parametric MC JBM\n" ) ); + } + set_zero( hParamMC->Cldfb_ImagBuffer_tc, MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands ); + + if ( st_ivas->hTcBuffer == NULL ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, nchan_transport, nchan_transport, 0, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } + else + { + hParamMC->Cldfb_RealBuffer_tc = NULL; + hParamMC->Cldfb_ImagBuffer_tc = NULL; + } + + hParamMC->subframes_rendered = 0; + hParamMC->slots_rendered = 0; +#endif + st_ivas->hParamMC = hParamMC; return error; @@ -597,13 +653,14 @@ ivas_error ivas_param_mc_dec_reconfig( #endif } - /*-----------------------------------------------------------------* - * set input parameters - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ +#ifndef JBM_TSM_ON_TCS hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC; - +#endif hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -914,6 +971,10 @@ ivas_error ivas_param_mc_dec_reconfig( return error; } +#ifdef JBM_TSM_ON_TCS + ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#endif + ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); @@ -1124,6 +1185,19 @@ void ivas_param_mc_dec_close( hParamMC->hoa_encoder = NULL; } +#ifdef JBM_TSM_ON_TCS + if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_RealBuffer_tc ); + hParamMC->Cldfb_RealBuffer_tc = NULL; + } + if ( hParamMC->Cldfb_ImagBuffer_tc != NULL ) + { + free( hParamMC->Cldfb_ImagBuffer_tc ); + hParamMC->Cldfb_ImagBuffer_tc = NULL; + } +#endif + free( *hParamMC_out ); *hParamMC_out = NULL; @@ -1241,7 +1315,9 @@ void ivas_param_mc_dec_read_BS( num_lfe_bands = 0; } - param_mc_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#ifndef JBM_TSM_ON_TCS + ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#endif if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 ) { @@ -1328,12 +1404,448 @@ void ivas_param_mc_dec_read_BS( /* for PLC, use the saved ILDs and ICCs from the past and set the transient flag and transient position to zero */ hMetadataPMC->bAttackPresent = 0; hMetadataPMC->attackIndex = 0; +#ifndef JBM_TSM_ON_TCS + ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); +#endif + } + + pop_wmops(); + + return; +} + + +#ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------------- + * ivas_param_mc_dec_digest_tc() + * + * + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ + float *transport_channels_f[] /* i : synthesized core-coder transport channels/DirAC output */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t slot_idx, param_band_idx; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; + float real_part, imag_part; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_digest_tc" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hOutSetup; + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + hSynthesisOutputSetup = &st_ivas->hTransSetup; + } + + /* adapt transient position */ + if ( hParamMC->hMetadataPMC->bAttackPresent ) + { + hParamMC->hMetadataPMC->attackIndex = (int16_t) max( 0, hParamMC->hMetadataPMC->attackIndex + ( ( nCldfbSlots - DEFAULT_JBM_CLDFB_TIMESLOTS ) / 2 ) ); + } + /* adapt subframes */ + hParamMC->num_slots = nCldfbSlots; + hParamMC->slots_rendered = 0; + hParamMC->subframes_rendered = 0; + ivas_jbm_dec_get_adapted_subframes( nCldfbSlots, hParamMC->subframe_nbslots, &hParamMC->nb_subframes ); + + ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator ); + + for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) + { + set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); + } + + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ ) + { + float RealBuffer[CLDFB_NO_CHANNELS_MAX]; + float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; + + /* CLDFB Analysis*/ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + cldfbAnalysis_ts( &( transport_channels_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + + mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands ); + } + + if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) + { + ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport ); + } + } + + /* map from complex input covariance to real values */ + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) + { + /* Cx for transport channels */ + for ( i = 0; i < nchan_transport * nchan_transport; i++ ) + { + real_part = cx[param_band_idx][i]; + imag_part = cx_imag[param_band_idx][i]; + + /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ + if ( param_band_idx < hParamMC->max_param_band_abs_cov ) + { + cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); + } + else + { + cx[param_band_idx][i] = real_part; + } + } + } + + /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ + if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) ) + { + for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) + { + v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport ); + mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport ); + } + } + + + if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); + } + else + { + /* generate mixing matrices */ + ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); + } + + pop_wmops(); + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_param_mc_dec() + * + * Parametric MC decoding process + *------------------------------------------------------------------------*/ + +void ivas_param_mc_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + int16_t i, ch; + int16_t subframe_idx; + int16_t slot_idx, slot_idx_start, slot_idx_start_cldfb_synth, first_sf, last_sf, slots_to_render; + int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; + int16_t nchan_out_cov; + /*CLDFB*/ + float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + /*Decorrelator*/ + float onset_filter[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; + /* format converter */ + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + uint16_t nband_synth, nbands_to_zero; + uint16_t nchan_out_init; + uint32_t output_Fs; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + + push_wmops( "param_mc_dec_render" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_transport = st_ivas->nchan_transport; + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + nchan_out_init = nchan_out_transport; + output_Fs = st_ivas->hDecoderConfig->output_Fs; + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + nchan_out_cldfb = BINAURAL_CHANNELS; + set_s( channel_active, 1, nchan_out_cldfb ); + if ( st_ivas->hHeadTrackData ) + { + nchan_out_init = MAX_INTERN_CHANNELS; + } + nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) + { + nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + nchan_out_cldfb = nchan_out_cov; + set_s( channel_active, 1, nchan_out_cov ); + } + else + { + nchan_out_cov = nchan_out_transport; + nchan_out_cldfb = nchan_out_transport; + set_s( channel_active, 1, nchan_out_cov ); + } + + /* set everything to zero that will not be decoded */ + nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; + nbands_to_zero = hParamMC->num_freq_bands - nband_synth; + for ( ch = 0; ch < nchan_out_init; ch++ ) + { + for ( slot_idx = 0; slot_idx < JBM_CLDFB_SLOTS_IN_SUBFRAME; slot_idx++ ) + { + set_zero( &( Cldfb_RealBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); + set_zero( &( Cldfb_ImagBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); + } + } + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hParamMC->num_slots - hParamMC->slots_rendered, nSamplesAsked / NS2SA( output_Fs, CLDFB_SLOT_NS ) ); + *nSamplesRendered = slots_to_render * NS2SA( output_Fs, CLDFB_SLOT_NS ); + first_sf = hParamMC->subframes_rendered; + last_sf = first_sf; + while ( slots_to_render > 0 ) + { + slots_to_render -= hParamMC->subframe_nbslots[last_sf]; + last_sf++; + } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + slots_to_render += hParamMC->subframe_nbslots[subframe_idx]; + } + } + slot_idx_start = hParamMC->slots_rendered; + slot_idx_start_cldfb_synth = 0; + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots[subframe_idx]; slot_idx++, hParamMC->slots_rendered++ ) + { + + if ( hParamMC->max_band_decorr > 0 ) + { + /*-----------------------------------------------------------------* + * protoype signal computation + *-----------------------------------------------------------------*/ + + param_mc_protoSignalComputation( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + hParamMC->proto_frame_f, hParamMC->diff_proto_info, + hParamMC->num_freq_bands ); + + /*-----------------------------------------------------------------* + * frequency domain decorrelation + *-----------------------------------------------------------------*/ + + /* decorrelate prototype frame */ + ivas_dirac_dec_decorr_process( hParamMC->num_freq_bands, + hParamMC->num_outputs_diff, + hParamMC->diff_proto_info->num_protos_diff, + DIRAC_SYNTHESIS_COV_MC_LS, + nchan_transport, + hParamMC->proto_frame_f, + hParamMC->diff_proto_info->num_protos_diff, + hParamMC->diff_proto_info->proto_index_diff, + hParamMC->proto_frame_dec_f, + onset_filter, + hParamMC->h_freq_domain_decorr_ap_params, + hParamMC->h_freq_domain_decorr_ap_state ); + + /* copy decorrelated frame directly to output CLDFB buffer, acts also as intermediate */ + /* memory for the decorrelated signal */ + ivas_param_mc_dec_copy_diffuse_proto( hParamMC, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_out_cov, slot_idx ); + } + + /*-----------------------------------------------------------------* + * output synthesis + *-----------------------------------------------------------------*/ + + ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( &hParamMC->Cldfb_RealBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + &hParamMC->Cldfb_ImagBuffer_tc[hParamMC->slots_rendered * nchan_transport * hParamMC->num_freq_bands], + Cldfb_RealBuffer, Cldfb_ImagBuffer, + hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, slot_idx, slot_idx + slot_idx_start, + nchan_transport, nchan_out_cov, hParamMC ); + + if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) + { + if ( st_ivas->hHeadTrackData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + { + ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); + } + else + { + /* remove LFE */ + uint16_t idx_out; + uint16_t idx_lfe; + IVAS_OUTPUT_SETUP hLsSetup; + + hLsSetup = st_ivas->hTransSetup; + + /* If LFE should be rendered, add it to other channels before removing */ + if ( st_ivas->hBinRenderer->render_lfe ) + { + for ( idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++ ) + { + /* Copy just the first band of LFE*/ + v_multc( Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + v_multc( Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); + + for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) + { + if ( hLsSetup.index_lfe[idx_lfe] != ch ) + { + v_add( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer[ch][slot_idx], 1 ); + v_add( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], 1 ); + } + } + } + } + + idx_out = 0; + idx_lfe = 0; + + for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) + { + if ( ( hLsSetup.num_lfe > 0 ) && ( hLsSetup.index_lfe[idx_lfe] == ch ) ) + { + if ( idx_lfe < ( hLsSetup.num_lfe - 1 ) ) + { + idx_lfe++; + } + } + else if ( ch != idx_out ) + { + mvr2r( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[idx_out][slot_idx], nband_synth ); + mvr2r( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[idx_out][slot_idx], nband_synth ); + idx_out++; + } + else + { + idx_out++; + } + } + } + } + } + + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, hParamMC->subframe_nbslots[subframe_idx], + Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + } + else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) + { + /* format conversion*/ + ivas_lssetupconversion_process_param_mc( st_ivas, hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer, Cldfb_ImagBuffer, channel_active ); + } + + /* CLDFB synthesis */ + for ( ch = 0; ch < nchan_out_cldfb; ch++ ) + { + float *RealBuffer[16]; + float *ImagBuffer[16]; + + if ( channel_active[ch] ) + { + /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ + for ( i = 0; i < hParamMC->subframe_nbslots[subframe_idx]; i++ ) + { + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; + } + else + { + RealBuffer[i] = Cldfb_RealBuffer[ch][i]; + ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; + } + } + cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), + hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); + } + else + { + set_f( &( output_f[ch][slot_idx_start_cldfb_synth * hParamMC->num_freq_bands] ), 0.0f, hParamMC->num_freq_bands * hParamMC->subframe_nbslots[subframe_idx] ); + } + } + slot_idx_start += hParamMC->subframe_nbslots[subframe_idx]; + slot_idx_start_cldfb_synth += hParamMC->subframe_nbslots[subframe_idx]; } + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) + { + ivas_mc2sba( st_ivas->hIntSetup, output_f, output_f, hParamMC->num_freq_bands * slots_to_render, st_ivas->hOutSetup.ambisonics_order, 0.f ); + } + + /* update */ + if ( hParamMC->slots_rendered == hParamMC->num_slots ) + { + hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth; + param_mc_update_mixing_matrices( hParamMC, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_transport, nchan_out_cov ); + } + hParamMC->subframes_rendered = last_sf; + *nSamplesAvailable = ( hParamMC->num_slots - hParamMC->slots_rendered ) * NS2SA( output_Fs, CLDFB_SLOT_NS ); pop_wmops(); return; } +#endif /*------------------------------------------------------------------------- @@ -1342,6 +1854,41 @@ void ivas_param_mc_dec_read_BS( * Parametric MC decoding process *------------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +void ivas_param_mc_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ +) +{ + PARAM_MC_DEC_HANDLE hParamMC; + float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_NSLOTS * CLDFB_NO_CHANNELS_MAX]; + uint16_t nSamplesAsked, nSamplesAvailable, nSamplesRendered; + + hParamMC = st_ivas->hParamMC; + assert( hParamMC ); + push_wmops( "param_mc_dec" ); + + /* set some handle pointers to the stack buffers */ + hParamMC->Cldfb_RealBuffer_tc = Cldfb_RealBuffer_in; + hParamMC->Cldfb_ImagBuffer_tc = Cldfb_ImagBuffer_in; + + nSamplesAsked = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + ivas_param_mc_dec_digest_tc( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS, output_f ); + ivas_param_mc_dec_render( st_ivas, nSamplesAsked, &nSamplesRendered, &nSamplesAvailable, output_f ); +#ifdef DEBUGGING + assert( nSamplesRendered == nSamplesAsked ); + assert( nSamplesAvailable == 0 ); +#endif + + /* set handle pointers back to NULL */ + hParamMC->Cldfb_RealBuffer_tc = NULL; + hParamMC->Cldfb_ImagBuffer_tc = NULL; + + pop_wmops(); + return; +} +#else void ivas_param_mc_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ @@ -1349,7 +1896,8 @@ void ivas_param_mc_dec( { PARAM_MC_DEC_HANDLE hParamMC; int16_t i, ch; - int16_t subframe_idx, num_subframes; + int16_t subframe_idx; + int16_t nb_subframes; int16_t slot_idx, param_band_idx, slot_idx_start; int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; int16_t nchan_out_cov; @@ -1496,12 +2044,13 @@ void ivas_param_mc_dec( ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, mixing_matrix, mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); } + /*** split here... ***/ + /* subframe loop for synthesis*/ - num_subframes = CLDFB_NO_COL_MAX / hParamMC->subframe_nbslots; - for ( subframe_idx = 0; subframe_idx < num_subframes; subframe_idx++ ) + nb_subframes = CLDFB_NO_COL_MAX / hParamMC->subframe_nbslots; + for ( subframe_idx = 0; subframe_idx < nb_subframes; subframe_idx++ ) { slot_idx_start = subframe_idx * hParamMC->subframe_nbslots; - for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots; slot_idx++ ) { @@ -1640,7 +2189,6 @@ void ivas_param_mc_dec( ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; } } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hParamMC->num_freq_bands] ), hParamMC->num_freq_bands * hParamMC->subframe_nbslots, st_ivas->cldfbSynDec[ch] ); } @@ -1663,6 +2211,7 @@ void ivas_param_mc_dec( return; } +#endif /*------------------------------------------------------------------------- @@ -1737,12 +2286,19 @@ static void ivas_param_mc_dec_init( *------------------------------------------------------------------------*/ static void param_mc_protoSignalComputation( +#ifdef JBM_TSM_ON_TCS + float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */ + float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */ +#else float RealBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ float ImagBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ - float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ - const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ - const int16_t slot_index, /* i : current slot index */ - const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ +#endif + float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ + const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ +#ifndef JBM_TSM_ON_TCS + const int16_t slot_index, /* i : current slot index */ +#endif + const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ ) { int16_t band; @@ -1763,8 +2319,13 @@ static void param_mc_protoSignalComputation( int16_t source_ch_idx = diff_proto_info->source_chan_idx[proto_ch_idx][source_ch_cnt]; p_proto_frame = &proto_frame_f[proto_ch_idx * num_freq_bands * 2]; +#ifdef JBM_TSM_ON_TCS + p_real_buffer = &RealBuffer[source_ch_idx * num_freq_bands]; + p_imag_buffer = &ImagBuffer[source_ch_idx * num_freq_bands]; +#else p_real_buffer = &RealBuffer[source_ch_idx][slot_index][0]; p_imag_buffer = &ImagBuffer[source_ch_idx][slot_index][0]; +#endif for ( band = 0; band < num_freq_bands; band++ ) { @@ -1936,15 +2497,18 @@ static int16_t ivas_param_mc_range_decoder_LC( * * compute the interpolator used in the final synthesis *------------------------------------------------------------------------*/ - -static void param_mc_compute_interpolator( +static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, /* i : flag indicating if we have a transient in the current frame */ const uint16_t attackPos, /* i : position of the transient */ const uint16_t interp_length, /* i : number of interpolation values to be calculated */ float *interpolator /* o : interpolator */ ) { +#ifdef JBM_TSM_ON_TCS + int16_t idx; +#else uint16_t idx; +#endif if ( bAttackPresent ) { @@ -1959,10 +2523,14 @@ static void param_mc_compute_interpolator( } else { +#ifdef JBM_TSM_ON_TCS + ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); +#else for ( idx = 1; idx <= interp_length; ++idx ) { interpolator[idx - 1] = (float) idx / (float) interp_length; } +#endif } return; @@ -2022,12 +2590,17 @@ static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrices for all parameter bands */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrices for all parameter bands */ - const int16_t nY_intern, /* i : number of channels in the transported format */ - const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ - const int16_t nX, /* i : number of transport channels */ - const int16_t nY_cov /* i : number of covariance synthesis output channels */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ +#else + float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrices for all parameter bands */ + float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrices for all parameter bands */ +#endif + const int16_t nY_intern, /* i : number of channels in the transported format */ + const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov /* i : number of covariance synthesis output channels */ ) { int16_t param_band_idx; @@ -2276,11 +2849,16 @@ static void ivas_param_mc_get_mixing_matrices( static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : transport channel covariance for all parameter bands */ - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrix */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrix (set to zero) */ - const int16_t nY_intern, /* i : number of channels of the transport format */ - const int16_t nX, /* i : number of transport channels */ - const int16_t nY_cov ) /* i : number of output channels */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ +#else + float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrix */ + float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrix (set to zero) */ +#endif + const int16_t nY_intern, /* i : number of channels of the transport format */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov ) /* i : number of output channels */ { int16_t param_band_idx; float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -2395,17 +2973,21 @@ static void ivas_param_mc_get_mono_stereo_mixing_matrices( *------------------------------------------------------------------------*/ static void param_mc_update_mixing_matrices( - PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */ + PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */ +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[], /* i : direct mixing matrices for the frame just processed */ + float *mixing_matrix_res[], /* i : residual mixing matrices for the frame just processed */ +#else float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : direct mixing matrices for the frame just processed */ float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : residual mixing matrices for the frame just processed */ - const uint16_t nX, /* i : number of transport channels */ - const uint16_t nY ) /* i : number of synthesis channels */ +#endif + const uint16_t nX, /* i : number of transport channels */ + const uint16_t nY ) /* i : number of synthesis channels */ { uint16_t param_band_idx; for ( param_band_idx = 0; param_band_idx < hParamMC->hMetadataPMC->nbands_coded; param_band_idx++ ) { - /* final mixing */ int16_t brange[2]; brange[0] = hParamMC->band_grouping[param_band_idx]; diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c new file mode 100644 index 0000000000..346868ab6a --- /dev/null +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -0,0 +1,693 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include "options.h" +#include +#include "cnst.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_dec.h" +#include "math.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#ifdef DEBUG_PLOT +#include "deb_out.h" +#endif +#include "wmc_auto.h" +#include "rom_dec.h" + +/*-----------------------------------------------------------------------* + * Local function prototypes + *-----------------------------------------------------------------------*/ +static void ps_pred_process( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, float qmf_mod_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], int16_t ch ); + +static void paramupmix_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr[], float pcm_in[][L_FRAME48k], float **pp_out_pcm, const int16_t output_frame ); + +static int huff_read( Decoder_State *st, const int16_t ( *ht )[2] ); + +static void huffman_decode( Decoder_State *st, int16_t nv, int16_t ivStart, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t bNoDt, int32_t *vq ); + +static void dequant_alpha( int16_t nv, int16_t ivStart, QUANT_TYPE quant_type, int32_t *vq, float *v ); + +static void dequant_beta( int16_t nv, int16_t ivStart, QUANT_TYPE quant_type, int32_t *aq, int32_t *bq, float *beta ); + +static void get_ec_data( Decoder_State *st, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t nParBand, int16_t parBandStart, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS] ); + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_read_BS() + * + * Read the ParamUpmix MC metadata + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_read_BS( + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + Decoder_State *st, /* i/o: decoder state structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ +) +{ + int16_t i, k; + int32_t alpha_quant[IVAS_MAX_NUM_BANDS]; + int16_t nb_bits_read_orig; + int16_t next_bit_pos_orig, last_bit_pos; + uint16_t bstr_meta[MAX_BITS_METADATA], *bit_stream_orig; + + push_wmops( "mc_paramupmix_read_bs" ); + *nb_bits = 0; + + if ( st->bfi ) + { + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + for ( k = 0; k < IVAS_MAX_NUM_BANDS; k++ ) + { + hMCParamUpmix->alphas[i][k] = hMCParamUpmix->alpha_prev[i][k]; + hMCParamUpmix->betas[i][k] = hMCParamUpmix->beta_prev[i][k]; + } + } + hMCParamUpmix->first_frame = 1; + } + else /* if (!st->bfi) */ + { + bit_stream_orig = st->bit_stream; + next_bit_pos_orig = st->next_bit_pos; + last_bit_pos = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + nb_bits_read_orig = 0; + last_bit_pos -= nb_bits_read_orig; /* reverse the bitstream for easier reading of indices */ + for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) + { + bstr_meta[i] = st_ivas->bit_stream[last_bit_pos - i]; + } + st->bit_stream = bstr_meta; + st->next_bit_pos = 0; + st->bits_frame = min( MAX_BITS_METADATA, last_bit_pos + 1 ); + st->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + get_ec_data( st, ALPHA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/, + 0 /*parBandStart*/, hMCParamUpmix->alpha_quant[i], alpha_quant, hMCParamUpmix->alphas[i] ); + + get_ec_data( st, BETA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/, + 0 /*parBandStart*/, hMCParamUpmix->beta_quant[i], alpha_quant, hMCParamUpmix->betas[i] ); + } + *nb_bits += st->next_bit_pos; + st->bit_stream = bit_stream_orig; + st->next_bit_pos = next_bit_pos_orig; + + if ( hMCParamUpmix->first_frame ) + { + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + mvr2r( hMCParamUpmix->alphas[i], hMCParamUpmix->alpha_prev[i], IVAS_MAX_NUM_BANDS ); + mvr2r( hMCParamUpmix->betas[i], hMCParamUpmix->beta_prev[i], IVAS_MAX_NUM_BANDS ); + } + hMCParamUpmix->first_frame = 0; + } + } + + pop_wmops(); + + return; +} + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec() + * + * MC ParamUpmix decoding process + *------------------------------------------------------------------------*/ +void ivas_mc_paramupmix_dec( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels */ +) +{ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + int16_t i, k, ch; + int16_t slot_idx; + int16_t first_empty_channel; + int16_t nchan_out_transport; + /*CLDFB*/ + float Cldfb_RealBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t channel_active[MAX_OUTPUT_CHANNELS]; + int32_t output_Fs; + int16_t output_frame; + float Pcm_decorr[MC_PARAMUPMIX_COMBINATIONS][L_FRAME48k]; /* decorrelated channels */ + float *pPcm_temp[MC_PARAMUPMIX_COMBINATIONS * 2]; /* decorrelated and undecorrelated*/ + int16_t noparamupmix_delay; + AUDIO_CONFIG output_config; + + hMCParamUpmix = st_ivas->hMCParamUpmix; + assert( hMCParamUpmix ); + + push_wmops( "mc_paramupmix_dec" ); + + set_s( channel_active, 0, MAX_CICP_CHANNELS ); + nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + set_s( channel_active, 1, nchan_out_transport ); /* change to nchan_out_transport */ + output_Fs = st_ivas->hDecoderConfig->output_Fs; + output_config = st_ivas->hDecoderConfig->output_config; + output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); + + if ( ( output_config == AUDIO_CONFIG_STEREO ) || ( output_config == AUDIO_CONFIG_MONO ) ) + { + first_empty_channel = 8; /* Don't upmix */ + } + else + { + first_empty_channel = 12; + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + pPcm_temp[i] = Pcm_decorr[i]; /* decorrelated */ + } + + paramupmix_td_decorr_process( hMCParamUpmix->hTdDecorr, &( output_f[4] ), pPcm_temp, output_frame ); + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + pPcm_temp[2 * i] = output_f[i + 4]; /* un-decorrelated */ + pPcm_temp[2 * i + 1] = Pcm_decorr[i]; /* decorrelated */ + } + + /* CLDFB Analysis*/ + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ ) + { + /* slot loop for gathering the input data */ + for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) + { + cldfbAnalysis_ts( &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), Cldfb_RealBuffer[ch][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], hMCParamUpmix->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); + } + } + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + ps_pred_process( hMCParamUpmix, + Cldfb_RealBuffer[2 * ch], /* in/out */ + Cldfb_ImagBuffer[2 * ch], + Cldfb_RealBuffer[2 * ch + 1], /* in/out decorr */ + Cldfb_ImagBuffer[2 * ch + 1], + ch ); + + /*-- m, s -> l, r ----------------------------*/ + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + for ( k = 0; k < CLDFB_NO_CHANNELS_MAX; k++ ) + { + float qlre = Cldfb_RealBuffer[2 * ch][i][k]; + float qlim = Cldfb_ImagBuffer[2 * ch][i][k]; + float qrre = Cldfb_RealBuffer[2 * ch + 1][i][k]; + float qrim = Cldfb_ImagBuffer[2 * ch + 1][i][k]; + + Cldfb_RealBuffer[2 * ch][i][k] = qlre + qrre; + Cldfb_ImagBuffer[2 * ch][i][k] = qlim + qrim; + Cldfb_RealBuffer[2 * ch + 1][i][k] = qlre - qrre; + Cldfb_ImagBuffer[2 * ch + 1][i][k] = qlim - qrim; + } + } + + mvr2r( hMCParamUpmix->alphas[ch], hMCParamUpmix->alpha_prev[ch], IVAS_MAX_NUM_BANDS ); + mvr2r( hMCParamUpmix->betas[ch], hMCParamUpmix->beta_prev[ch], IVAS_MAX_NUM_BANDS ); + } + + /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ + pPcm_temp[0] = output_f[4]; + pPcm_temp[1] = output_f[6]; + pPcm_temp[2] = output_f[5]; + pPcm_temp[3] = output_f[7]; + pPcm_temp[4] = output_f[8]; + pPcm_temp[5] = output_f[10]; + pPcm_temp[6] = output_f[9]; + pPcm_temp[7] = output_f[11]; + + /* CLDFB synthesis */ + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS * 2; ch++ ) + { + for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) + { + float *ptr_im[1], *ptr_re[1]; + ptr_re[0] = Cldfb_RealBuffer[ch][slot_idx]; + ptr_im[0] = Cldfb_ImagBuffer[ch][slot_idx]; + + cldfbSynthesis( ptr_re, ptr_im, &( pPcm_temp[ch][hMCParamUpmix->num_freq_bands * slot_idx] ), + hMCParamUpmix->num_freq_bands, st_ivas->cldfbSynDec[ch] ); + } + } + + /* adjust delay of other channels */ + noparamupmix_delay = NS2SA( output_Fs, IVAS_FB_DEC_DELAY_NS ); + for ( ch = 0; ch < MC_PARAMUPMIX_COMBINATIONS; ch++ ) + { + float tmp_buf[L_SUBFRAME5MS_48k]; + mvr2r( &output_f[ch][output_frame - noparamupmix_delay], tmp_buf, noparamupmix_delay ); + mvr2r( output_f[ch], &output_f[ch][noparamupmix_delay], output_frame - noparamupmix_delay ); + mvr2r( hMCParamUpmix->pcm_delay[ch], output_f[ch], noparamupmix_delay ); + mvr2r( tmp_buf, hMCParamUpmix->pcm_delay[ch], noparamupmix_delay ); + } + } + + for ( ch = first_empty_channel; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + set_f( output_f[ch], 0.0, L_FRAME48k ); + } + pop_wmops(); + + return; +} + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_getNumTransportChannels() + * + * + *------------------------------------------------------------------------*/ +int16_t ivas_mc_paramupmix_getNumTransportChannels() +{ + int16_t nchan_transport; + nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; /* 5.1.2 */ + return nchan_transport; +} + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_open() + * + * Open Parametric MC decoder handle + *-------------------------------------------------------------------------*/ + +ivas_error ivas_mc_paramupmix_dec_open( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; + int32_t output_Fs; + int16_t nchan_transport; + uint16_t i; + ivas_error error; + + error = IVAS_ERR_OK; + + /*-----------------------------------------------------------------* + * prepare library opening + *-----------------------------------------------------------------*/ + + if ( ( hMCParamUpmix = (MC_PARAMUPMIX_DEC_HANDLE) malloc( sizeof( MC_PARAMUPMIX_DEC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Param-Upmix MC\n" ) ); + } + output_Fs = st_ivas->hDecoderConfig->output_Fs; + hMCParamUpmix->first_frame = 1; + + st_ivas->nchan_transport = ivas_mc_paramupmix_getNumTransportChannels(); + nchan_transport = st_ivas->nchan_transport; + + switch ( nchan_transport ) + { + case 8: + st_ivas->nCPE = 4; + st_ivas->nSCE = 0; + st_ivas->element_mode_init = IVAS_CPE_MDCT; + break; +#ifdef DEBUGGING + default: + assert( 0 && "Number of TC not supported for MC ParamUpmix!" ); +#endif + } + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ + + hMCParamUpmix->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + ivas_td_decorr_dec_open( &( hMCParamUpmix->hTdDecorr[i] ), output_Fs, 2, 1 ); + } + + for ( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ ) + { + if ( ( hMCParamUpmix->pcm_delay[i] = (float *) malloc( 240 * sizeof( float ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for delay buffer\n" ) ); + } + set_zero( hMCParamUpmix->pcm_delay[i], 240 ); + } + + st_ivas->hMCParamUpmix = hMCParamUpmix; + + return error; +} + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dec_close() + * + * Close ParamUpmix MC memories + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_dec_close( + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix /* i/o: Parametric MC decoder handle */ +) +{ + int16_t i; + + if ( hMCParamUpmix == NULL || *hMCParamUpmix == NULL ) + { + return; + } + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + ivas_td_decorr_dec_close( &( ( *hMCParamUpmix )->hTdDecorr[i] ) ); + } + for ( i = 0; i < MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; i++ ) + { + if ( ( *hMCParamUpmix )->pcm_delay[i] != NULL ) + { + free( ( *hMCParamUpmix )->pcm_delay[i] ); + } + } + free( *hMCParamUpmix ); + + *hMCParamUpmix = NULL; + + return; +} + +/*****************************************************************************************/ +/* local functions */ +/*****************************************************************************************/ + +static void ps_pred_process( + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, + float qmf_mod_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* in/out */ + float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* in/out */ + float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + int16_t ch ) +{ + float vmre, vmim, vsre, vsim; + int16_t iqmf, ipar, ismp, iismp; + float alpha_smp, dalpha, beta_smp, dbeta; + float *alpha1, *alpha2; + float *beta1, *beta2; + float *alpha_prev = hMCParamUpmix->alpha_prev[ch]; + float *beta_prev = hMCParamUpmix->beta_prev[ch]; + + int16_t qmf_to_par_band[] = { + 0, 1, 2, 3, 4, 5, 5, 6, 6, 7, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11 + }; + + for ( iqmf = 0; iqmf < CLDFB_NO_CHANNELS_MAX; iqmf++ ) + { + /* For changing no of parameter bands (ipar1 != ipar2), TIGGER_FRAMING assumed */ + ipar = qmf_to_par_band[iqmf]; + alpha1 = alpha_prev; + beta1 = beta_prev; + + ismp = 0; + alpha2 = hMCParamUpmix->alphas[ch]; + beta2 = hMCParamUpmix->betas[ch]; + alpha_smp = alpha1[ipar]; + beta_smp = beta1[ipar]; + dalpha = ( alpha2[ipar] - alpha1[ipar] ) / CLDFB_NO_COL_MAX; + dbeta = ( beta2[ipar] - beta1[ipar] ) / CLDFB_NO_COL_MAX; + + for ( iismp = 0; iismp < CLDFB_NO_COL_MAX; iismp++ ) + { + alpha_smp += dalpha; + beta_smp += dbeta; + + vmre = qmf_mod_re[ismp][iqmf]; + vmim = qmf_mod_im[ismp][iqmf]; + vsre = qmf_side_re[ismp][iqmf]; + vsim = qmf_side_im[ismp][iqmf]; + + qmf_side_re[ismp][iqmf] = alpha_smp * vmre + beta_smp * vsre; + qmf_side_im[ismp][iqmf] = alpha_smp * vmim + beta_smp * vsim; + + ismp++; + } + + alpha1 = alpha2; + beta1 = beta2; + } +} + +static void paramupmix_td_decorr_process( + ivas_td_decorr_state_t *hTdDecorr[], /* i/o: SPAR Covar. decoder handle */ + float pcm_in[][L_FRAME48k], /* i : input audio channels */ + float **pp_out_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t j, k; + int16_t offset; + float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; + + offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); + + /* Look-ahead delay */ + for ( k = 0; k < MC_PARAMUPMIX_COMBINATIONS; k++ ) + { + mvr2r( pcm_in[k], pp_out_pcm[k], output_frame ); + delay_signal( pp_out_pcm[k], output_frame, hTdDecorr[k]->look_ahead_buf, offset ); + + /* In ducking gains */ + if ( hTdDecorr[k]->ducking_flag ) + { + ivas_td_decorr_get_ducking_gains( hTdDecorr[k]->pTrans_det, pcm_in[k], in_duck_gain, out_duck_gain, output_frame, 0 ); + + for ( j = 0; j < output_frame; j++ ) + { + pp_out_pcm[k][j] = pp_out_pcm[k][j] * in_duck_gain[j]; + } + } + + /* All pass delay section */ + ivas_td_decorr_APD_iir_filter( &hTdDecorr[k]->APD_filt_state[0], pp_out_pcm[k], hTdDecorr[k]->num_apd_sections, output_frame ); + + /* Out ducking gains */ + if ( hTdDecorr[k]->ducking_flag ) + { + for ( j = 0; j < output_frame; j++ ) + { + pp_out_pcm[k][j] = pp_out_pcm[k][j] * out_duck_gain[j]; + } + } + } + + return; +} + +static int huff_read( + Decoder_State *st, + const int16_t ( *ht )[2] ) +{ + int16_t node = 0; + uint16_t next_bit = 0; + + do + { + next_bit = st->bit_stream[st->next_bit_pos]; + st->next_bit_pos++; + node = ht[node][next_bit]; + } while ( node > 0 ); + + return -( node + 1 ); +} + +static void huffman_decode( + Decoder_State *st, + int16_t nv, + int16_t ivStart, + PAR_TYPE parType, + QUANT_TYPE quant_type, + int16_t bNoDt, + int32_t *vq ) +{ + const int16_t( *huff_node_table )[2]; + int16_t iv, bdt, nquant, offset; + + + nquant = 0; + switch ( parType ) + { + case ALPHA: + nquant = alpha_quant_table[quant_type].nquant; + break; + case BETA: + nquant = beta_quant_table[quant_type][0].nquant; + break; + default: + assert( 0 ); + } + + offset = nquant - 1; /* range of df/dt [-(nquant - 1), nquant - 1] */ + + if ( bNoDt ) + { + bdt = 0; + } + else + { + bdt = st->bit_stream[st->next_bit_pos]; + st->next_bit_pos++; + } + if ( bdt ) + { /* Get dt */ + switch ( parType ) + { + case ALPHA: + huff_node_table = huff_nodes_dt.alpha[quant_type]; + break; + case BETA: + huff_node_table = huff_nodes_dt.beta[quant_type]; + break; + default: + huff_node_table = NULL; + assert( 0 ); + } + for ( iv = ivStart; iv < nv; iv++ ) + { + vq[iv] = huff_read( st, huff_node_table ) + vq[iv] - offset; + } + } + else /* Get f0, df */ + { + switch ( parType ) + { + case ALPHA: + huff_node_table = huff_nodes_df0.alpha[quant_type]; + break; + case BETA: + huff_node_table = huff_nodes_df0.beta[quant_type]; + break; + default: + huff_node_table = NULL; + assert( 0 ); + } + vq[ivStart] = huff_read( st, huff_node_table ); + + switch ( parType ) + { + case ALPHA: + huff_node_table = huff_nodes_df.alpha[quant_type]; + break; + case BETA: + huff_node_table = huff_nodes_df.beta[quant_type]; + break; + default: + assert( 0 ); + } + + for ( iv = ivStart + 1; iv < nv; iv++ ) + { + vq[iv] = huff_read( st, huff_node_table ) + vq[iv - 1] - offset; + } + } +} + +static void dequant_alpha( + int16_t nv, + int16_t ivStart, + QUANT_TYPE quant_type, + int32_t *vq, + float *v ) +{ + int16_t iv; + ACPL_QUANT_TABLE *quant_table = &alpha_quant_table[quant_type]; + + for ( iv = 0; iv < ivStart; iv++ ) + { + v[iv] = 0; + } + + for ( iv = ivStart; iv < nv; iv++ ) + { + v[iv] = quant_table->data[vq[iv]]; + } +} + +static void dequant_beta( + int16_t nv, + int16_t ivStart, + QUANT_TYPE quant_type, + int32_t *aq, + int32_t *bq, + float *beta ) +{ + int16_t iv; + ACPL_QUANT_TABLE *quant_table; + const int16_t qmap[2][33] = { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 } + }; + + for ( iv = 0; iv < ivStart; iv++ ) + { + beta[iv] = 0; + } + + for ( iv = ivStart; iv < nv; iv++ ) + { + quant_table = &beta_quant_table[quant_type][qmap[quant_type][aq[iv]]]; + beta[iv] = quant_table->data[bq[iv]]; + } +} + +static void get_ec_data( + Decoder_State *st, + PAR_TYPE parType, + QUANT_TYPE quant_type, + int16_t nParBand, + int16_t parBandStart, + int32_t *parQ, + int32_t *alphaQEnv, + float ab[IVAS_MAX_NUM_BANDS] ) +{ + huffman_decode( st, nParBand, parBandStart, parType, quant_type, 0, parQ ); + if ( parType == ALPHA ) + { + dequant_alpha( nParBand, parBandStart, quant_type, parQ, ab ); + mvl2l( parQ, alphaQEnv, (int16_t) nParBand ); + } + else + { + dequant_beta( nParBand, parBandStart, quant_type, alphaQEnv, parQ, ab ); + } +} diff --git a/lib_dec/ivas_mcmasa_dec.c b/lib_dec/ivas_mcmasa_dec.c index 0b375d4031..99b3ff6874 100755 --- a/lib_dec/ivas_mcmasa_dec.c +++ b/lib_dec/ivas_mcmasa_dec.c @@ -131,16 +131,14 @@ ivas_error ivas_mcmasa_dec_reconfig( } else { - /* the decision for useTdDecorr is done in ivas_dirac_dec_init_binaural_data(). here, comparing against the same condition. */ - if ( st_ivas->hDiracDecBin->useTdDecorr != ( ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) ) + /* if necessary, close/open td-decorrs */ + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) { - /* st_ivas->hDiracDecBin->useTdDecorr will change => close and re-open. */ - ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); - if ( ( error = ivas_dirac_dec_init_binaural_data( st_ivas, st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) - { - return error; - } + return error; } + + /* regularization factor is bitrate-dependent */ + st_ivas->hDiracDecBin->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); } } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c old mode 100644 new mode 100755 index 1ad01239cb..46c4343800 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -54,8 +54,11 @@ * Local function prototypes *-----------------------------------------------------------------------*/ +#ifdef JBM_TSM_ON_TCS +static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas, uint16_t *nSamplesRendered, int16_t *data ); +#else static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas ); - +#endif /*--------------------------------------------------------------------------* * ivas_mct_dec() @@ -195,6 +198,7 @@ ivas_error ivas_mct_dec( /* Equalization in MDCT Domain */ ivas_ls_setup_conversion_process_mdct( st_ivas, output ); } + else if ( st_ivas->renderer_type == RENDERER_MC_PARAMMC && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) { float *x_all[MAX_CICP_CHANNELS][NB_DIV]; @@ -273,7 +277,7 @@ ivas_error ivas_mct_dec( #endif } /* move channels after LFE to correct output for multi-channel MCT */ - if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) + if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) { float tmp[L_FRAME48k]; @@ -344,6 +348,10 @@ ivas_error create_mct_dec( { hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; } + else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } else { assert( !"IVAS format currently not supported for MCT" ); @@ -449,6 +457,10 @@ ivas_error mct_dec_reconfigure( { hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; } + else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = st_ivas->nchan_transport - st_ivas->hTransSetup.num_lfe; + } else { assert( !"IVAS format currently not supported for MCT" ); @@ -613,6 +625,11 @@ void ivas_mct_dec_close( ivas_error ivas_mc_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t idx /* i : LS config. index */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ + int16_t *data /* o : flushed samples (JBM) */ +#endif ) { AUDIO_CONFIG signaled_config; @@ -642,7 +659,11 @@ ivas_error ivas_mc_dec_config( { if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || st_ivas->transport_config != signaled_config || last_mc_mode != st_ivas->mc_mode ) { +#ifdef JBM_TSM_ON_TCS + ivas_mc_dec_reconfig( st_ivas, nSamplesRendered, data ); +#else ivas_mc_dec_reconfig( st_ivas ); +#endif } } @@ -661,6 +682,11 @@ ivas_error ivas_mc_dec_config( static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + , + uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame (JBM) */ + int16_t *data /* o : flushed samples (JBM) */ +#endif ) { int16_t nchan_transport_old, nSCE_old, nCPE_old, sba_dirac_stereo_flag_old, nchan_hp20_old; @@ -670,6 +696,14 @@ static ivas_error ivas_mc_dec_reconfig( Decoder_State *st; ivas_error error; MC_MODE mc_mode, last_mc_mode; +#ifdef JBM_TSM_ON_TCS + TC_BUFFER_MODE tc_buffer_mode_new; + int16_t tc_nchan_tc_new; + int16_t tc_nchan_allocate_new; + int16_t tc_granularity_new; + AUDIO_CONFIG intern_config_old; + IVAS_OUTPUT_SETUP hIntSetupOld; +#endif error = IVAS_ERR_OK; @@ -700,13 +734,63 @@ static ivas_error ivas_mc_dec_reconfig( } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); +#ifdef JBM_TSM_ON_TCS + /* save old IntSetup, might be needed for JBM flushing...*/ + intern_config_old = st_ivas->intern_config; + hIntSetupOld = st_ivas->hIntSetup; + tc_granularity_new = 1; +#endif + /* renderer might have changed, reselect */ renderer_type_old = st_ivas->renderer_type; ivas_renderer_select( st_ivas ); + /* side effect of the renderer selection can be a changed internal config */ ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDecoderConfig->voip_active ) + { + /* transfer subframe info from DirAC or ParamMC to central tc buffer */ + if ( last_mc_mode == MC_MODE_PARAMMC ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hParamMC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hParamMC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hParamMC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hParamMC->slots_rendered; + mvs2s( st_ivas->hParamMC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->hDirAC != NULL ) + { + st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; + st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered; + mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + /* JBM: when granularity goes down (e.g. MCT with CREND -> ParamMC with binaural fastconv + render what still fits in the new granularity */ + tc_granularity_new = ivas_jbm_dec_get_render_granularity( st_ivas->renderer_type, st_ivas->hDecoderConfig->output_Fs ); + if ( tc_granularity_new < st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_flush_renderer( st_ivas, tc_granularity_new, renderer_type_old, intern_config_old, &hIntSetupOld, last_mc_mode, ISM_MODE_NONE, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /* JBM: when granularity goes up set samples to discard at the beginning of the frame */ + else if ( tc_granularity_new > st_ivas->hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_set_discard_samples( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif + + if ( st_ivas->mc_mode == MC_MODE_MCT ) { st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( ivas_mc_map_output_config_to_mc_ls_setup( st_ivas->transport_config ) ); @@ -724,10 +808,23 @@ static ivas_error ivas_mc_dec_reconfig( ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); } + if ( last_mc_mode == MC_MODE_PARAMUPMIX ) + { + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + ivas_ls_setup_conversion_close( &( st_ivas->hLsSetUpConversion ) ); + } /* De-allocate McMasa-related handles */ ivas_masa_dec_close( &( st_ivas->hMasa ) ); ivas_qmetadata_close( &st_ivas->hQMetaData ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDirAC != NULL ) + { + ivas_dirac_dec_close( &st_ivas->hDirAC ); + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } +#endif + /* init LS conversion if the renderer type asks for it */ if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL ) { @@ -738,6 +835,46 @@ static ivas_error ivas_mc_dec_reconfig( } } } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + if ( last_mc_mode != MC_MODE_PARAMUPMIX ) + /* This should always be the case, only supporting one bitrate currently */ + { + /*De-allocate handles for other MC modes*/ + if ( st_ivas->hParamMC != NULL ) + { + ivas_param_mc_dec_close( &st_ivas->hParamMC ); + + /* remove ls conversion if it was allocated by ParamMC */ + ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); + } + + ivas_masa_dec_close( &( st_ivas->hMasa ) ); + ivas_qmetadata_close( &st_ivas->hQMetaData ); + + /* init LS conversion if the renderer type asks for it */ + if ( ( st_ivas->renderer_type == RENDERER_MC ) && st_ivas->hLsSetUpConversion == NULL ) + { + if ( ( error = ivas_ls_setup_conversion_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( ( error = ivas_mc_paramupmix_dec_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + assert( 0 ); + } + } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { if ( last_mc_mode != MC_MODE_PARAMMC ) @@ -765,6 +902,15 @@ static ivas_error ivas_mc_dec_reconfig( ivas_masa_dec_close( &( st_ivas->hMasa ) ); ivas_qmetadata_close( &st_ivas->hQMetaData ); +#ifdef JBM_TSM_ON_TCS + if ( st_ivas->hDirAC != NULL ) + { + ivas_dirac_dec_close( &st_ivas->hDirAC ); + + vbap_free_data( &( st_ivas->hVBAPdata ) ); + } +#endif + if ( last_mc_mode == MC_MODE_MCT ) { if ( st_ivas->hMCT != NULL && st_ivas->nchan_transport <= CPE_CHANNELS ) @@ -799,6 +945,8 @@ static ivas_error ivas_mc_dec_reconfig( ivas_ls_setup_conversion_close( &st_ivas->hLsSetUpConversion ); } + ivas_mc_paramupmix_dec_close( &( st_ivas->hMCParamUpmix ) ); + if ( st_ivas->hParamMC != NULL ) { ivas_param_mc_dec_close( &st_ivas->hParamMC ); @@ -892,6 +1040,11 @@ static ivas_error ivas_mc_dec_reconfig( new_brate_SCE = 0; new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + new_brate_SCE = 0; + new_brate_CPE = ( ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; + } else { new_brate_SCE = 0; /* ivas_total_brate / st_ivas->nchan_transport;*/ @@ -928,20 +1081,11 @@ static ivas_error ivas_mc_dec_reconfig( return error; } - /*-----------------------------------------------------------------* - * CLDFB instances - *-----------------------------------------------------------------*/ - - if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) - { - return error; - } /*-----------------------------------------------------------------* * Allocate the LFE handle that is coded seperately after the allocation of the core coders *-----------------------------------------------------------------*/ - - if ( st_ivas->mc_mode == MC_MODE_MCT && st_ivas->hLFE == NULL ) + if ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hLFE == NULL ) { int32_t binauralization_delay_ns = st_ivas->binaural_latency_ns; if ( st_ivas->hBinRenderer != NULL ) @@ -995,6 +1139,10 @@ static ivas_error ivas_mc_dec_reconfig( else if ( st_ivas->renderer_type == RENDERER_DISABLE && st_ivas->hDirAC != NULL ) { ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); + +#ifdef JBM_TSM_ON_TCS + vbap_free_data( &( st_ivas->hVBAPdata ) ); +#endif } } @@ -1121,5 +1269,82 @@ static ivas_error ivas_mc_dec_reconfig( #endif } + /*-----------------------------------------------------------------* + * TD Decorrelator + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDiracDecBin != NULL ) + { + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /*-----------------------------------------------------------------* + * CLDFB instances + *-----------------------------------------------------------------*/ + + if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, nchan_transport_old, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) + { + return error; + } + +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * Reconfigure TC buffer + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->voip_active == 1 ) + { + int16_t tc_nchan_full_new; + DECODER_TC_BUFFER_HANDLE hTcBuffer; + + hTcBuffer = st_ivas->hTcBuffer; + tc_buffer_mode_new = ivas_jbm_dec_get_tc_buffer_mode( st_ivas ); + tc_nchan_tc_new = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_allocate_new = tc_nchan_tc_new; + tc_nchan_full_new = tc_nchan_tc_new; + if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_allocate_new = 2 * BINAURAL_CHANNELS; + tc_nchan_full_new = tc_nchan_allocate_new; + } + if ( st_ivas->mc_mode == MC_MODE_PARAMMC && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) + { + tc_nchan_full_new = 0; + } + + /* reconfigure buffer */ + if ( hTcBuffer->tc_buffer_mode != tc_buffer_mode_new || hTcBuffer->nchan_transport_jbm != tc_nchan_tc_new || + hTcBuffer->nchan_buffer_full != tc_nchan_full_new || hTcBuffer->nchan_transport_internal != tc_nchan_allocate_new || + tc_granularity_new != hTcBuffer->n_samples_granularity ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode_new, tc_nchan_tc_new, tc_nchan_allocate_new, tc_nchan_full_new, tc_granularity_new ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* transfer subframe info from central tc buffer to ParamMC or McMASA (DirAC) */ + if ( st_ivas->hDirAC != NULL ) + { + st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( st_ivas->hParamMC != NULL ) + { + st_ivas->hParamMC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hParamMC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + st_ivas->hParamMC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hParamMC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + } +#endif + return error; } diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 843c739fbc..becf11e070 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -35,9 +35,7 @@ #include "options.h" #include "prot.h" #include "rom_com.h" -#ifdef SNS_MSVQ #include "ivas_rom_com.h" -#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -371,7 +369,6 @@ void ivas_mdct_dec_side_bits_frame_channel( * SNS parameters *--------------------------------------------------------------------------------*/ -#ifdef SNS_MSVQ sns_low_br_mode = 0; skipped_first_channel = 0; if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) @@ -470,44 +467,6 @@ void ivas_mdct_dec_side_bits_frame_channel( st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; } } -#else - skipped_first_channel = 0; - sns_low_br_mode = 0; - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - skipped_first_channel = 1; - continue; - } - - start_bit_pos_sns = st0->next_bit_pos; - - if ( ch == 0 || skipped_first_channel ) - { - /* read SNS stereo mode */ - param_lpc[0][0] = get_next_indice( st0, 1 ) << 1; - - /* read low br mode flag (if it is possible to be non-zero) */ - if ( sts[0]->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) - { - sns_low_br_mode = get_next_indice( st0, 1 ); - } - } - - tmp = ch; - if ( ch == 1 && param_lpc[0][0] == 2 ) - { - tmp = 3; - } - - getLPCparam( st, ¶m_lpc[ch][0], st0, tmp, sns_low_br_mode && !( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ); - - st->side_bits_frame_channel += st0->next_bit_pos - start_bit_pos_sns; - } -#endif // SNS_MSVQ } return; @@ -543,11 +502,7 @@ void ivas_mdct_core_invQ( int16_t *prm[CPE_CHANNELS]; /* LPC */ Word16 Aind[CPE_CHANNELS][M + 1]; -#ifdef SNS_MSVQ float sns[CPE_CHANNELS][NB_DIV][M]; -#else - float lsf[CPE_CHANNELS][( NB_DIV + 1 ) * M]; -#endif /* TCX */ float xn_buf[L_MDCT_OVLP_MAX + L_FRAME_PLUS + L_MDCT_OVLP_MAX]; int16_t tcx_offset[CPE_CHANNELS]; @@ -714,7 +669,6 @@ void ivas_mdct_core_invQ( * LPC PARAMETERS *--------------------------------------------------------------------------------*/ -#ifdef SNS_MSVQ if ( bfi == 0 ) { if ( !MCT_flag && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) @@ -725,7 +679,7 @@ void ivas_mdct_core_invQ( { if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { - sns_avq_dec_stereo( param_lpc[0], param_lpc[1], &sns[0][0][0], &sns[1][0][0] ); + sns_avq_dec_stereo( param_lpc[0], param_lpc[1], sts[0]->L_frame, &sns[0][0][0], &sns[1][0][0] ); } else { @@ -734,32 +688,12 @@ void ivas_mdct_core_invQ( st = sts[ch]; if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) { - sns_avq_dec( param_lpc[ch], sns[ch], st->numlpc ); + sns_avq_dec( param_lpc[ch], sns[ch], st->L_frame, st->numlpc ); } } } } } -#else - if ( bfi == 0 ) - { - if ( sts[0]->core == TCX_20_CORE && sts[1]->core == TCX_20_CORE && sts[0]->mct_chan_mode != MCT_CHAN_MODE_IGNORE && sts[1]->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) - { - sns_avq_dec_stereo( param_lpc[0], param_lpc[1], &lsf[0][M], &lsf[1][M] ); - } - else - { - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - if ( st->mct_chan_mode != MCT_CHAN_MODE_IGNORE ) - { - sns_avq_dec( param_lpc[ch], &lsf[ch][M], st->numlpc ); - } - } - } - } -#endif /*--------------------------------------------------------------* @@ -804,11 +738,7 @@ void ivas_mdct_core_invQ( /* Stability Factor */ if ( !bfi ) { -#ifdef SNS_MSVQ mvr2r( sns[ch][k], &Aq[ch][k * M], M ); -#else - mvr2r( &lsf[ch][( k + 1 ) * M], &Aq[ch][k * M], M ); -#endif } else { diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index f1c1fc04f2..ba14104ed9 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -66,15 +66,180 @@ ivas_error ivas_td_binaural_open( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ +#endif + const int16_t output_frame /* i : output frame length */ ) { +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t ism_md_subframe_update; + + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) + { + ism_md_subframe_update = 1; + } + else + { + ism_md_subframe_update = 2; + } + return ivas_td_binaural_renderer_unwrap( + st_ivas->hReverb, + st_ivas->transport_config, + st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, + st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, + ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, ism_md_subframe_update, output, output_frame ); +#else return ivas_td_binaural_renderer_unwrap( st_ivas->hReverb, st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); +#endif +} + + +#ifdef JBM_TSM_ON_TCS +/*---------------------------------------------------------------------* + * ivas_td_binaural_renderer_sf() + * + * Receives the current frames for the object streams, updates metadata + * and renders the current frame. + *---------------------------------------------------------------------*/ + +ivas_error ivas_td_binaural_renderer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ +) +{ + int16_t first_sf, last_sf, subframe_idx; + float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; + float *p_reverb_signal[BINAURAL_CHANNELS]; + float *output_f_local[BINAURAL_CHANNELS]; + float *tc_local[MAX_TRANSPORT_CHANNELS]; + int16_t ch, slot_size, slots_to_render, output_frame; + ivas_error error; + +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t ism_md_subframe_update_jbm; + int16_t c_indx, nS; + + /* Number of subframes to delay metadata to sync with audio */ + if ( st_ivas->hDecoderConfig->Opt_delay_comp ) + { + ism_md_subframe_update_jbm = max( 0, st_ivas->hTcBuffer->nb_subframes - 3 ); + } + else + { + ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; + } + +#endif + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } + + for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) + { + tc_local[ch] = st_ivas->hTcBuffer->tc[ch] + st_ivas->hTcBuffer->n_samples_rendered; + } + + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + output_f_local[ch] = output[ch]; + } + + slot_size = st_ivas->hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( st_ivas->hTcBuffer->num_slots - st_ivas->hTcBuffer->slots_rendered, n_samples_granularity / slot_size ); + first_sf = st_ivas->hTcBuffer->subframes_rendered; + last_sf = first_sf; + st_ivas->hTcBuffer->slots_rendered += slots_to_render; + + while ( slots_to_render > 0 ) + { + slots_to_render -= st_ivas->hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity; + + /* Update object position(s) */ +#ifdef FIX_356_ISM_METADATA_SYNC + c_indx = 0; + + for ( nS = 0; nS < st_ivas->nchan_transport; nS++ ) + { + if ( !( st_ivas->ivas_format == MC_FORMAT && nS == LFE_CHANNEL ) ) /* Skip LFE for MC */ + { + st_ivas->hBinRendererTd->Sources[c_indx]->InputFrame_p = tc_local[nS]; + st_ivas->hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } + if ( subframe_idx == ism_md_subframe_update_jbm ) + { + TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->hIsmMetaData ); + } +#else + TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, tc_local ); +#endif + + /* Update the listener's location/orientation */ + TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, st_ivas->hDecoderConfig->Opt_Headrotation, + ( st_ivas->hHeadTrackData != NULL ) ? &st_ivas->hHeadTrackData->Quaternions[0] : NULL, + ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL ); + + if ( ( st_ivas->hRenderConfig != NULL ) && ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) + { + if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* Render subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update_jbm ) ) != IVAS_ERR_OK ) +#else + if ( ( error = TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + + if ( st_ivas->hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */ + { + if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame ); + v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); + } + } + + for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) + { + tc_local[ch] += output_frame; + } + + for ( ch = 0; ch < st_ivas->hDecoderConfig->nchan_out; ch++ ) + { + output_f_local[ch] += output_frame; + } + } + + st_ivas->hTcBuffer->subframes_rendered = last_sf; + + return IVAS_ERR_OK; } +#endif diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 2fb04af8d7..7d14ee5041 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -312,7 +312,16 @@ ivas_error ivas_ls_setup_conversion_open( int16_t output_frame; int32_t output_Fs; int16_t nchan_out; + int16_t paramUpmixMonoStereo; + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) + { + paramUpmixMonoStereo = TRUE; + } + else + { + paramUpmixMonoStereo = FALSE; + } output_Fs = st_ivas->hDecoderConfig->output_Fs; nchan_out = st_ivas->hDecoderConfig->nchan_out; output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); @@ -351,7 +360,22 @@ ivas_error ivas_ls_setup_conversion_open( } else { - inChannels = st_ivas->nchan_transport; + if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + if ( paramUpmixMonoStereo == TRUE ) + { + inChannels = audioCfg2channels( AUDIO_CONFIG_5_1_2 ); + } + else + { + inChannels = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; + } + } + else + { + inChannels = st_ivas->nchan_transport; + } + /*Initialization of MDCT bands with TCX20 resolution */ ivas_lssetupconversion_mdct_init_bands( output_frame, TCX_20_CORE, &hLsSetUpConversion->sfbOffset[0], &hLsSetUpConversion->sfbCnt ); if ( ( hLsSetUpConversion->targetEnergyPrev[0] = (float *) malloc( ( MAX_SFB + 2 ) * sizeof( float ) ) ) == NULL ) @@ -397,7 +421,14 @@ ivas_error ivas_ls_setup_conversion_open( { if ( st_ivas->transport_config != AUDIO_CONFIG_INVALID ) { - get_ls_conversion_matrix( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config ); + if ( paramUpmixMonoStereo == TRUE ) + { + get_ls_conversion_matrix( hLsSetUpConversion, AUDIO_CONFIG_5_1_2, st_ivas->hDecoderConfig->output_config ); + } + else + { + get_ls_conversion_matrix( hLsSetUpConversion, st_ivas->transport_config, st_ivas->hDecoderConfig->output_config ); + } } else { @@ -465,8 +496,14 @@ void ivas_ls_setup_conversion_close( void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ + const int16_t input_chans, /* i : number of input channels to the renderer */ const int16_t output_frame, /* i : frame length */ - float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ +#ifdef JBM_TSM_ON_TCS + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ +#else + float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ +#endif ) { int16_t chInIdx, chOutIdx, idx; @@ -481,7 +518,7 @@ void ivas_ls_setup_conversion( for ( chOutIdx = 0; chOutIdx < st_ivas->hDecoderConfig->nchan_out; chOutIdx++ ) { set_zero( output_tmp[chOutIdx], output_frame ); - for ( chInIdx = 0; chInIdx < st_ivas->nchan_transport; chInIdx++ ) + for ( chInIdx = 0; chInIdx < input_chans; chInIdx++ ) { dmxCoeff = hLsSetUpConversion->dmxMtx[chInIdx][chOutIdx]; @@ -493,14 +530,22 @@ void ivas_ls_setup_conversion( { for ( idx = 0; idx < output_frame; idx++ ) { +#ifdef JBM_TSM_ON_TCS + output_tmp[chOutIdx][idx] += input[chInIdx][idx]; +#else output_tmp[chOutIdx][idx] += output[chInIdx][idx]; +#endif } } else { for ( idx = 0; idx < output_frame; idx++ ) { +#ifdef JBM_TSM_ON_TCS + tmpVal = dmxCoeff * input[chInIdx][idx]; +#else tmpVal = dmxCoeff * output[chInIdx][idx]; +#endif output_tmp[chOutIdx][idx] += tmpVal; } } @@ -1098,7 +1143,10 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( *-------------------------------------------------------------------------*/ void ivas_lssetupconversion_process_param_mc( - Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ + Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ +#ifdef JBM_TSM_ON_TCS + const int16_t num_timeslots, +#endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ @@ -1125,8 +1173,12 @@ void ivas_lssetupconversion_process_param_mc( set_s( channel_active, 0, outChannels ); - /* Loop over each time slots and compute dmx for each time slot */ +/* Loop over each time slots and compute dmx for each time slot */ +#ifdef JBM_TSM_ON_TCS + for ( slotIdx = 0; slotIdx < num_timeslots; slotIdx++ ) +#else for ( slotIdx = 0; slotIdx < st_ivas->hParamMC->subframe_nbslots; slotIdx++ ) +#endif { /* copy buffers */ for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index ff73e6aa49..52891aaf87 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -152,7 +152,8 @@ void ivas_renderer_select( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); if ( nchan_internal == 2 ) { st_ivas->hHeadTrackData->shd_rot_max_order = 1; @@ -191,16 +192,16 @@ void ivas_renderer_select( if ( output_config == AUDIO_CONFIG_BINAURAL ) { #ifdef DEBUGGING - if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) + if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) #else - if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT ) ) + if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) #endif { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; } else { - if ( st_ivas->mc_mode == MC_MODE_MCT ) + if ( ( st_ivas->mc_mode == MC_MODE_MCT ) || ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) { *renderer_type = RENDERER_BINAURAL_MIXER_CONV; } @@ -228,7 +229,7 @@ void ivas_renderer_select( } else /* AUDIO_CONFIG_BINAURAL_ROOM */ { - if ( st_ivas->mc_mode == MC_MODE_MCT ) + if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { *renderer_type = RENDERER_BINAURAL_MIXER_CONV_ROOM; } @@ -255,6 +256,13 @@ void ivas_renderer_select( * Non-binaural rendering configurations *-----------------------------------------------------------------*/ + else if ( st_ivas->ivas_format == MONO_FORMAT ) + { + if ( output_config == AUDIO_CONFIG_STEREO ) + { + *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; + } + } else if ( st_ivas->ivas_format == STEREO_FORMAT ) { if ( output_config != AUDIO_CONFIG_STEREO && output_config != AUDIO_CONFIG_MONO ) @@ -264,46 +272,57 @@ void ivas_renderer_select( } else if ( st_ivas->ivas_format == ISM_FORMAT ) { - if ( st_ivas->ism_mode == ISM_MODE_PARAM ) + if ( ( output_config == AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) { - *renderer_type = RENDERER_PARAM_ISM; - if ( output_config == AUDIO_CONFIG_MONO ) - { - *renderer_type = RENDERER_MONO_DOWNMIX; - } - else if ( output_config == AUDIO_CONFIG_STEREO ) - { - *renderer_type = RENDERER_DISABLE; - } - else if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 ) - { - *renderer_type = RENDERER_SBA_LINEAR_ENC; - *internal_config = AUDIO_CONFIG_7_1_4; - } + *renderer_type = RENDERER_NON_DIEGETIC_DOWNMIX; } - else /* ISM_MODE_DISC */ + else { - *renderer_type = RENDERER_TD_PANNING; - if ( output_config == AUDIO_CONFIG_MONO ) - { - *renderer_type = RENDERER_MONO_DOWNMIX; - } - else if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 ) + if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - *renderer_type = RENDERER_SBA_LINEAR_ENC; + *renderer_type = RENDERER_PARAM_ISM; + if ( output_config == AUDIO_CONFIG_MONO ) + { + *renderer_type = RENDERER_MONO_DOWNMIX; + } + else if ( output_config == AUDIO_CONFIG_STEREO ) + { + *renderer_type = RENDERER_DISABLE; + } + else if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + *internal_config = AUDIO_CONFIG_7_1_4; + } } - else if ( output_config == AUDIO_CONFIG_EXTERNAL ) + else /* ISM_MODE_DISC */ { - *renderer_type = RENDERER_DISABLE; + *renderer_type = RENDERER_TD_PANNING; + if ( output_config == AUDIO_CONFIG_MONO ) + { + *renderer_type = RENDERER_MONO_DOWNMIX; + } + else if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + } + else if ( output_config == AUDIO_CONFIG_EXTERNAL ) + { + *renderer_type = RENDERER_DISABLE; + } } } } else if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) { *renderer_type = RENDERER_DIRAC; - +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && + ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) ) +#else if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) ) +#endif { if ( output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_FOA ) { @@ -355,6 +374,21 @@ void ivas_renderer_select( *renderer_type = RENDERER_SBA_LINEAR_ENC; } } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + *internal_config = transport_config; + if ( *internal_config != output_config ) + { + if ( output_config != AUDIO_CONFIG_FOA && output_config != AUDIO_CONFIG_HOA2 && output_config != AUDIO_CONFIG_HOA3 ) + { + *renderer_type = RENDERER_MC; + } + else + { + *renderer_type = RENDERER_SBA_LINEAR_ENC; + } + } + } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { if ( output_config == AUDIO_CONFIG_FOA || output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_HOA3 ) diff --git a/lib_dec/ivas_pca_dec.c b/lib_dec/ivas_pca_dec.c index 4444a73cee..e73b3aa1d6 100644 --- a/lib_dec/ivas_pca_dec.c +++ b/lib_dec/ivas_pca_dec.c @@ -232,7 +232,7 @@ void ivas_pca_dec( mvr2r( &hPCA->mem_eigVec_interp[IVAS_PCA_N_SLOTS * 16], hPCA->mem_eigVec_interp, IVAS_PCA_DELAY_CMP * 16 ); - /* @@@TODO: check how ivas_total_brate is set if bfi == 1 */ // VE: and what happens in DTX where "ivas_total_brate" can be close to zero? + /* @@@TODO: check how ivas_total_brate is set if bfi == 1 */ // ToDo: and what happens in DTX where "ivas_total_brate" can be close to zero? /* handle bit rate switching */ if ( ivas_total_brate != PCA_BRATE || ( ivas_total_brate == PCA_BRATE && n_channels > FOA_CHANNELS ) ) @@ -240,8 +240,6 @@ void ivas_pca_dec( /* set PCA by-pass mode in current frame and interpolate transform as previous frame used PCA */ pca_dec_reset_dquat( ql, qr ); - // VE: todo - rather call PCA resets in the first PCA frame - if ( ( last_ivas_total_brate != PCA_BRATE ) || ( last_ivas_total_brate == PCA_BRATE && hPCA->prev_pca_bypass > 1 ) ) { pca_dec_reset_mem_eigvec( hPCA ); diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 9c6597fdcb..cfd748afde 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -49,9 +49,19 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness( uint16_t *bitstream, i static int16_t ivas_qmetadata_entropy_decode_df_ratio( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, int16_t *dfRatio_bits ); -static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band ); +static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band +#ifdef HR_METADATA + , + const int16_t hrmasa_flag +#endif +); -static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band ); +static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band +#ifdef HR_METADATA + , + const int16_t hrmasa_flag +#endif +); static uint16_t ivas_qmetadata_DecodeQuasiUniform( const uint16_t *bitstream, int16_t *index, const uint16_t alphabet_size ); @@ -77,11 +87,21 @@ static int16_t read_truncGR_azimuth( uint16_t *bitstream, IVAS_QDIRECTION *q_dir static ivas_error read_huf( int16_t *num_bits_read, const uint16_t *bitstream, uint16_t *out, const int16_t start_pos, const int16_t len, const int16_t *huff_code, const int16_t max_len ); -static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir ); +static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir +#ifdef HR_METADATA + , + const int16_t hrmasa_flag +#endif +); static int16_t read_surround_coherence( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData ); -static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames ); +static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames +#ifdef HR_METADATA + , + const int16_t hrmasa_flag +#endif +); static void decode_combined_index( uint64_t comb_index, const int16_t *no_cv_vec, uint16_t *index, const int16_t len ); @@ -91,6 +111,19 @@ static int16_t read_GR_min_removed_data( uint16_t *bitstream, int16_t *p_bit_pos static int16_t decode_fixed_rate_composed_index_coherence( uint16_t *bitstream, int16_t *p_bit_pos, const int16_t no_bands, int16_t *no_cv_vec, uint16_t *decoded_index, const int16_t no_symb ); +#ifdef HR_METADATA +static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); + +static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction ); + +static int16_t ivas_qmetadata_raw_decode_dir_512( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band, const SPHERICAL_GRID_DATA *sph_grid16 ); + +static int16_t read_surround_coherence_hr( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData ); + +static int16_t read_coherence_data_hr_512( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir, const int16_t nbits_coh ); +#endif + + /*-----------------------------------------------------------------------* * Global function definitions *-----------------------------------------------------------------------*/ @@ -103,9 +136,11 @@ static int16_t decode_fixed_rate_composed_index_coherence( uint16_t *bitstream, /*! r: number of bits read */ int16_t ivas_qmetadata_dec_decode( - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ - uint16_t *bitstream, /* i : bitstream */ - int16_t *index /* i/o: bitstream position */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index /* i/o: bitstream position */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { int16_t d, b, m; @@ -135,7 +170,6 @@ int16_t ivas_qmetadata_dec_decode( int16_t reduce_bits; int16_t ind_order[MASA_MAXIMUM_CODING_SUBBANDS]; - #ifdef DEBUG_MODE_QMETADATA static FILE *pF = NULL; static FILE *pF_azi = NULL; @@ -192,23 +226,43 @@ int16_t ivas_qmetadata_dec_decode( } bits_diff_sum = 0; - bits_diff_sum += ivas_qmetadata_entropy_decode_diffuseness( bitstream, index, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); - if ( hQMetaData->no_directions == 2 ) + if ( hodirac_flag ) { - /* Calculate bits for dfRatio */ - dir2band = 0; - for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + if ( hQMetaData->no_directions == 2 ) { - if ( hQMetaData->twoDirBands[b] == 1 ) + /* Calculate bits for dfRatio */ + dir2band = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { - dfRatio_bits[dir2band] = ivas_get_df_ratio_bits( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] ); - dir2band++; + if ( hQMetaData->twoDirBands[b] == 1 ) + { + dfRatio_bits[dir2band] = ivas_get_df_ratio_bits_hodirac( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] ); + dir2band++; + } } + + bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits ); } + } + else + { + if ( hQMetaData->no_directions == 2 ) + { + /* Calculate bits for dfRatio */ + dir2band = 0; + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + dfRatio_bits[dir2band] = ivas_get_df_ratio_bits( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] ); + dir2band++; + } + } - bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits ); + bits_diff_sum += ivas_qmetadata_entropy_decode_df_ratio( bitstream, index, &( hQMetaData->q_direction[1] ), dfRatio_bits ); + } } /* Calculate direct-to-total energy ratios for both directions from diffuse-to-total ratio and distribution factor of direct-to-total ratios */ @@ -224,14 +278,33 @@ int16_t ivas_qmetadata_dec_decode( diffRatio = diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; dfRatio_qsteps = 1 << dfRatio_bits[dir2band]; - dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.5f, 0.5f / ( dfRatio_qsteps - 1 ) ); + /* already encoded as total and ratios in HO-DirAC */ + if ( hodirac_flag ) + { + dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.0f, 1.f / ( dfRatio_qsteps - 1 ) ); + dir1ratio = 1.f - diffRatio; + dir2ratio = dfRatio; + } + else + { + dfRatio = usdequant( hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0], 0.5f, 0.5f / ( dfRatio_qsteps - 1 ) ); + + dir1ratio = dfRatio * ( 1.0f - diffRatio ); + dir2ratio = ( 1.0f - diffRatio ) - dir1ratio; + } - dir1ratio = dfRatio * ( 1.0f - diffRatio ); - dir2ratio = ( 1.0f - diffRatio ) - dir1ratio; /* Requantize the 1 - dirRatio separately for each direction to obtain inverted dirRatio index. These are used in further decoding. */ hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] = masa_sq( 1.0f - dir1ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); - hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = masa_sq( 1.0f - dir2ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + if ( hodirac_flag ) + { + float tmp; + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = usquant( dir2ratio, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); + } + else + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0] = masa_sq( 1.0f - dir2ratio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + } for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) { @@ -287,7 +360,8 @@ int16_t ivas_qmetadata_dec_decode( index_dirRatio1Inv = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; index_dirRatio2Inv = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[0]; - masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod ); + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod, + hodirac_flag ); for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) { @@ -385,9 +459,15 @@ int16_t ivas_qmetadata_dec_decode( /* Read coherence, if any */ bits_coherence = 0; + if ( all_coherence_zero == 0 ) { - bits_coherence = read_coherence_data( bitstream, index, hQMetaData, d ); + bits_coherence = read_coherence_data( bitstream, index, hQMetaData, d +#ifdef HR_METADATA + , + 0 +#endif + ); } else { @@ -435,11 +515,21 @@ int16_t ivas_qmetadata_dec_decode( if ( raw_flag[0] == 0 ) { - bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, nbands, start_band ); + bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, nbands, start_band +#ifdef HR_METADATA + , + 0 +#endif + ); } else { - bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, nbands, start_band ); + bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, nbands, start_band +#ifdef HR_METADATA + , + 0 +#endif + ); } } /* Decode quantized directions band-wise */ @@ -459,7 +549,12 @@ int16_t ivas_qmetadata_dec_decode( { if ( raw_flag[b] == 0 ) { - bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, b + 1, b ); + bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, b + 1, b +#ifdef HR_METADATA + , + 0 +#endif + ); } else { @@ -503,7 +598,12 @@ int16_t ivas_qmetadata_dec_decode( { if ( raw_flag[b] ) { - bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, b + 1, b ); + bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, b + 1, b +#ifdef HR_METADATA + , + 0 +#endif + ); } } } @@ -537,7 +637,12 @@ int16_t ivas_qmetadata_dec_decode( { if ( nblocks > 1 ) { - decode_spread_coherence( hQMetaData, d, nblocks ); + decode_spread_coherence( hQMetaData, d, nblocks +#ifdef HR_METADATA + , + 0 +#endif + ); } } else @@ -575,72 +680,500 @@ int16_t ivas_qmetadata_dec_decode( { fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); - fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] ); + fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] ); + if ( q_direction->coherence_band_data != NULL ) + { + fprintf( pF_spcoh, " %d ", q_direction->coherence_band_data[b].spread_coherence[m] ); + } + if ( d == 0 && hQMetaData->surcoh_band_data != NULL ) + { + fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[b].surround_coherence[m] ); + } + } + } + fprintf( pF_azi, "\n" ); + fprintf( pF_ele, "\n" ); + fprintf( pF_ratio, "\n" ); + fprintf( pF_spcoh, "\n" ); + if ( d == 0 ) + { + fprintf( pF_surcoh, "\n" ); + } +#endif + } + + /* move 2 dir data to its correct subband */ + if ( hQMetaData->no_directions == 2 ) + { + d = hQMetaData->q_direction[1].cfg.nbands - 1; + nblocks = hQMetaData->q_direction[0].cfg.nblocks; + + for ( b = hQMetaData->q_direction[0].cfg.nbands - 1; b >= 0; b-- ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) + { + mvr2r( hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].band_data[b].azimuth, nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].band_data[b].elevation, nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio, nblocks ); + + if ( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] < 7 ) + { + for ( m = 0; m < nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] += hQMetaData->q_direction[0].band_data[b].azimuth[m] - 180; + if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] >= 180 ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] -= 360; + } + if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] < -180 ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] += 360; + } + } + } + + if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + mvc2c( hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, nblocks ); + } + d--; + } + else + { + set_f( hQMetaData->q_direction[1].band_data[b].azimuth, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].elevation, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, 0.0f, nblocks ); + + if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, 0, nblocks ); + } + } + } + + /* Scale energy ratios that sum to over one */ + if ( !hodirac_flag ) + { + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + float ratioSum; + + ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[0] + hQMetaData->q_direction[1].band_data[b].energy_ratio[0]; + + if ( ratioSum > 1.0f ) + { + set_f( hQMetaData->q_direction[0].band_data[b].energy_ratio, hQMetaData->q_direction[0].band_data[b].energy_ratio[0] / ratioSum, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio[0] / ratioSum, nblocks ); + } + } + } + } + + /* Store status information for renderer use */ + hQMetaData->ec_flag = ec_flag; + + hQMetaData->dir_comp_ratio = (float) bits_dir_used / (float) bits_dir_target; + + if ( hQMetaData->dir_comp_ratio > 1.0f ) + { + hQMetaData->dir_comp_ratio = 1.0f; + } + + return ( start_index_0 - *index ); +} + + +#ifdef HR_METADATA +/*-----------------------------------------------------------------------* + * ivas_qmetadata_dec_decode_hr_384_512() + * + * Main function for decoding Spatial Metadata at HRs + *-----------------------------------------------------------------------*/ + +/*! r: number of bits read */ +int16_t ivas_qmetadata_dec_decode_hr_384_512( + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, /* i/o: bitstream position */ + const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh +#ifdef FIX_HBR_MASAMETA + , + uint8_t ncoding_bands_config +#endif +) +{ + int16_t d, b, m; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + int16_t bits_diff_sum; +#endif +#else + int16_t bits_diff_sum; +#endif + int16_t nbands, start_band; + IVAS_QDIRECTION *q_direction; + int16_t start_index_0; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + int16_t bits_no_dirs_coh, bits_sur_coherence; +#endif +#else + int16_t bits_no_dirs_coh, bits_sur_coherence; +#endif + uint16_t all_coherence_zero; + int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; +#ifdef FIX_HBR_MASAMETA + int16_t codedBands, sf_nbands0, sf_nbands1; + sf_nbands1 = 1; +#endif + +#ifdef DEBUG_MODE_QMETADATA + static FILE *pF = NULL; + static FILE *pF_azi = NULL; + static FILE *pF_ele = NULL; + static FILE *pF_ratio = NULL; + static FILE *pF_spcoh = NULL; + static FILE *pF_surcoh = NULL; + + if ( pF == NULL ) + pF = fopen( "./res/qmetadata_dec.txt", "w" ); + if ( pF_azi == NULL ) + pF_azi = fopen( "./res/qmetadata_azi_dec.txt", "w" ); + if ( pF_ele == NULL ) + pF_ele = fopen( "./res/qmetadata_ele_dec.txt", "w" ); + if ( pF_ratio == NULL ) + pF_ratio = fopen( "./res/qmetadata_ratio_dec.txt", "w" ); + if ( pF_spcoh == NULL ) + pF_spcoh = fopen( "./res/qmetadata_spcoh_dec.txt", "w" ); + if ( pF_surcoh == NULL ) + pF_surcoh = fopen( "./res/qmetadata_surcoh_dec.txt", "w" ); +#endif + + start_index_0 = *index; +#ifdef FIX_HBR_MASAMETA + /* read number of higher inactive/not encoded bands */ + if ( bitstream[( *index )--] ) + { + codedBands = MASA_MAXIMUM_CODING_SUBBANDS - ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 1 ) - 1; + } + else + { + codedBands = MASA_MAXIMUM_CODING_SUBBANDS; + } + for ( b = codedBands; b < ncoding_bands_config; b++ ) + { + for ( m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES; m++ ) + { + hQMetaData->q_direction[0].band_data[b].azimuth[m] = 0.0f; + hQMetaData->q_direction[0].band_data[b].elevation[m] = 0.0f; + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[0].coherence_band_data != NULL ) + { + hQMetaData->q_direction[0].coherence_band_data[b].spread_coherence[m] = 0u; + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].band_data[b].azimuth[m] = 0.0f; + hQMetaData->q_direction[1].band_data[b].elevation[m] = 0.0f; + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 0.0f; + + if ( hQMetaData->coherence_flag && hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence[m] = 0u; + } + } + + if ( hQMetaData->coherence_flag && hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[b].surround_coherence[m] = 0u; + } + } + + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->twoDirBands[b] = 0; + } + } + sf_nbands0 = hQMetaData->q_direction[0].cfg.nbands; + + hQMetaData->q_direction[0].cfg.nbands = codedBands; + +#endif + /*Coherence flag decoding*/ +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh = 0; +#endif +#else + bits_no_dirs_coh = 0; +#endif + all_coherence_zero = 1; + if ( hQMetaData->coherence_flag ) + { + /* read if coherence is zero */ + all_coherence_zero = bitstream[( *index )--]; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh += 1; +#endif +#else + bits_no_dirs_coh += 1; +#endif + } + + hQMetaData->all_coherence_zero = (uint8_t) all_coherence_zero; + + if ( hQMetaData->no_directions == 2 ) + { + set_c( (int8_t *) hQMetaData->twoDirBands, 1, hQMetaData->q_direction[0].cfg.nbands ); + } + + if ( bits_sph_idx == 11 && hQMetaData->no_directions == 2 ) + { + /* Read which bands have 2 directions */ + hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; +#ifdef FIX_HBR_MASAMETA + sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; + if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) + { + hQMetaData->q_direction[1].cfg.nbands = codedBands; + } +#endif + set_c( (int8_t *) hQMetaData->twoDirBands, 0, hQMetaData->q_direction[0].cfg.nbands ); + d = *index; + dif_p[0] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); + p[0] = dif_p[0]; + hQMetaData->twoDirBands[p[0]] = 1; +#ifdef FIX_HBR_MASAMETA + for ( b = 1; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) +#else + for ( b = 1; b < hQMetaData->numTwoDirBands; b++ ) +#endif + { + dif_p[b] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); + p[b] = p[b - 1] + dif_p[b] + 1; + hQMetaData->twoDirBands[p[b]] = 1; + } +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh += ( d - *index ); +#endif +#else + bits_no_dirs_coh += ( d - *index ); +#endif + } + +#ifdef FIX_HBR_MASAMETA + if ( bits_sph_idx == 16 && hQMetaData->no_directions == 2 ) + { + sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; + if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) + { + hQMetaData->q_direction[1].cfg.nbands = codedBands; + } + } +#endif +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_diff_sum = +#endif +#else + bits_diff_sum = +#endif + ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); + + if ( hQMetaData->no_directions == 2 ) + { +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_diff_sum += +#endif +#else + bits_diff_sum += +#endif + ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[1] ) ); + } + + + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = 1.0f - diffuseness_reconstructions_hr[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[m]]; + } + } + if ( hQMetaData->no_directions == 2 ) + { + for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 1.0f - diffuseness_reconstructions_hr[hQMetaData->q_direction[1].band_data[b].energy_ratio_index[m]]; + if ( hQMetaData->q_direction[1].band_data[b].energy_ratio[m] > 1.0f - hQMetaData->q_direction[0].band_data[b].energy_ratio[m] ) + { + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = 1.0f - hQMetaData->q_direction[0].band_data[b].energy_ratio[m]; + } + } + } + } + + if ( hQMetaData->no_directions == 2 ) + { + for ( b = hQMetaData->q_direction[1].cfg.start_band; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[1].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[1].band_data[b].energy_ratio_index_mod[m] = hQMetaData->q_direction[1].band_data[b].energy_ratio_index[m]; + hQMetaData->q_direction[1].band_data[b].bits_sph_idx[m] = bits_sph_idx; + } + } + } + + for ( b = hQMetaData->q_direction[0].cfg.start_band; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio_index_mod[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]; + hQMetaData->q_direction[0].band_data[b].bits_sph_idx[m] = bits_sph_idx; + } + } + + if ( all_coherence_zero == 0 ) + { +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_sur_coherence = +#endif +#else + bits_sur_coherence = +#endif + read_surround_coherence_hr( bitstream, index, hQMetaData ); + } + else + { +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_sur_coherence = 0; +#endif +#else + bits_sur_coherence = 0; +#endif + /*Surround coherence*/ + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh += bits_sur_coherence; +#endif +#else + bits_no_dirs_coh += bits_sur_coherence; +#endif + + for ( d = 0; d < hQMetaData->no_directions; d++ ) + { + q_direction = &hQMetaData->q_direction[d]; + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + /* Read coherence, if any */ + if ( all_coherence_zero == 0 ) + { + read_coherence_data_hr_512( bitstream, index, hQMetaData, d, bits_sp_coh ); + } + else + { + /*Surround coherence*/ + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[b].surround_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + + if ( hQMetaData->q_direction[d].coherence_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->q_direction[d].coherence_band_data[b].spread_coherence, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } + } + + /* Decode quantized directions frame-wise */ + ivas_qmetadata_raw_decode_dir_512( q_direction, bitstream, index, nbands, start_band, sph_grid16 ); + +#ifdef DEBUG_MODE_QMETADATA + fprintf( pF, "frame %d: diff %d surcoh %d ", frame, bits_diff_sum, bits_sur_coherence ); + fprintf( pF, "dir %d\n", start_index_0 - *index ); + fprintf( pF_azi, "frame %d/dir/ec %d: ", frame, d ); + fprintf( pF_ele, "frame %d/dir/ec %d: ", frame, d ); + fprintf( pF_spcoh, "frame %d/dir %d: ", frame, d ); + fprintf( pF_ratio, "frame %d/dir %d: ", frame, d ); + + for ( b = start_band; b < nbands; b++ ) + { + for ( m = 0; m < q_direction->cfg.nblocks; m++ ) + { + + fprintf( pF_ratio, " %1.3f ", q_direction->band_data[b].energy_ratio[m] ); + fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].azimuth[m] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[b].elevation[m] ) / 100.f ); if ( q_direction->coherence_band_data != NULL ) { fprintf( pF_spcoh, " %d ", q_direction->coherence_band_data[b].spread_coherence[m] ); } - if ( d == 0 && hQMetaData->surcoh_band_data != NULL ) - { - fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[b].surround_coherence[m] ); - } } } + fprintf( pF_ratio, "\n" ); fprintf( pF_azi, "\n" ); fprintf( pF_ele, "\n" ); - fprintf( pF_ratio, "\n" ); fprintf( pF_spcoh, "\n" ); - if ( d == 0 ) - { - fprintf( pF_surcoh, "\n" ); - } #endif } - /* move 2 dir data to its correct subband */ + if ( hQMetaData->no_directions == 2 ) { - d = hQMetaData->q_direction[1].cfg.nbands - 1; - nblocks = hQMetaData->q_direction[0].cfg.nblocks; - - for ( b = hQMetaData->q_direction[0].cfg.nbands - 1; b >= 0; b-- ) + /* move 2 dir data to its correct subband */ + if ( bits_sph_idx == 11 ) { - if ( hQMetaData->twoDirBands[b] == 1 ) - { - mvr2r( hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].band_data[b].azimuth, nblocks ); - mvr2r( hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].band_data[b].elevation, nblocks ); - mvr2r( hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio, nblocks ); - if ( hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0] < 7 ) + int16_t nblocks; + d = hQMetaData->q_direction[1].cfg.nbands - 1; + nblocks = hQMetaData->q_direction[0].cfg.nblocks; + + for ( b = hQMetaData->q_direction[0].cfg.nbands - 1; b >= 0; b-- ) + { + if ( hQMetaData->twoDirBands[b] == 1 ) { - for ( m = 0; m < nblocks; m++ ) + mvr2r( hQMetaData->q_direction[1].band_data[d].azimuth, hQMetaData->q_direction[1].band_data[b].azimuth, nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[d].elevation, hQMetaData->q_direction[1].band_data[b].elevation, nblocks ); + mvr2r( hQMetaData->q_direction[1].band_data[d].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio, nblocks ); + + + if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) { - hQMetaData->q_direction[1].band_data[b].azimuth[m] += hQMetaData->q_direction[0].band_data[b].azimuth[m] - 180; - if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] >= 180 ) - { - hQMetaData->q_direction[1].band_data[b].azimuth[m] -= 360; - } - if ( hQMetaData->q_direction[1].band_data[b].azimuth[m] < -180 ) - { - hQMetaData->q_direction[1].band_data[b].azimuth[m] += 360; - } + mvc2c( hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, nblocks ); } + d--; } - - if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) + else { - mvc2c( hQMetaData->q_direction[1].coherence_band_data[d].spread_coherence, hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, nblocks ); - } - d--; - } - else - { - set_f( hQMetaData->q_direction[1].band_data[b].azimuth, 0.0f, nblocks ); - set_f( hQMetaData->q_direction[1].band_data[b].elevation, 0.0f, nblocks ); - set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].azimuth, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].elevation, 0.0f, nblocks ); + set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, 0.0f, nblocks ); - if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) - { - set_c( (int8_t *) hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, 0, nblocks ); + if ( hQMetaData->q_direction[1].coherence_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->q_direction[1].coherence_band_data[b].spread_coherence, 0, nblocks ); + } } } } @@ -649,30 +1182,74 @@ int16_t ivas_qmetadata_dec_decode( for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { float ratioSum; + for ( m = 0; m < hQMetaData->q_direction[0].cfg.nblocks; m++ ) + { + ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[m] + hQMetaData->q_direction[1].band_data[b].energy_ratio[m]; + + if ( ratioSum > 1.0f ) + { + hQMetaData->q_direction[0].band_data[b].energy_ratio[m] = hQMetaData->q_direction[0].band_data[b].energy_ratio[m] / ratioSum; + hQMetaData->q_direction[1].band_data[b].energy_ratio[m] = hQMetaData->q_direction[1].band_data[b].energy_ratio[m] / ratioSum; + } + } + } + } - ratioSum = hQMetaData->q_direction[0].band_data[b].energy_ratio[0] + hQMetaData->q_direction[1].band_data[b].energy_ratio[0]; +#ifdef DEBUG_MODE_QMETADATA + for ( d = 0; d < hQMetaData->no_directions; d++ ) + { + q_direction = &hQMetaData->q_direction[d]; + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; - if ( ratioSum > 1.0f ) + + if ( d == 0 ) + { + fprintf( pF_surcoh, "frame %d/dir %d: ", frame, d ); + } + for ( b = start_band; b < nbands; b++ ) + { + for ( m = 0; m < q_direction->cfg.nblocks; m++ ) { - set_f( hQMetaData->q_direction[0].band_data[b].energy_ratio, hQMetaData->q_direction[0].band_data[b].energy_ratio[0] / ratioSum, nblocks ); - set_f( hQMetaData->q_direction[1].band_data[b].energy_ratio, hQMetaData->q_direction[1].band_data[b].energy_ratio[0] / ratioSum, nblocks ); + + + if ( d == 0 && hQMetaData->surcoh_band_data != NULL ) + { + fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[b].surround_coherence[m] ); + } } } - } + + if ( d == 0 ) + { + fprintf( pF_surcoh, "\n" ); + } + } +#endif /* Store status information for renderer use */ - hQMetaData->ec_flag = ec_flag; + hQMetaData->ec_flag = 0; - hQMetaData->dir_comp_ratio = (float) bits_dir_used / (float) bits_dir_target; + hQMetaData->dir_comp_ratio = 1.0f; if ( hQMetaData->dir_comp_ratio > 1.0f ) { hQMetaData->dir_comp_ratio = 1.0f; } +#ifdef FIX_HBR_MASAMETA + hQMetaData->q_direction[0].cfg.nbands = sf_nbands0; + if ( hQMetaData->no_directions == 2 ) + { + hQMetaData->q_direction[1].cfg.nbands = sf_nbands1; + } +#endif + return ( start_index_0 - *index ); } +#endif + /*-----------------------------------------------------------------------* * ivas_qmetadata_dec_sid_decode() @@ -687,8 +1264,11 @@ int16_t ivas_qmetadata_dec_sid_decode( int16_t *index, /* i/o: bitstream position */ const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ - const int16_t ivas_format, /* i : IVAS format */ - const SBA_MODE sba_mode /* i : SBA mode */ + const int16_t ivas_format /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP + , + const SBA_MODE sba_mode /* i : SBA mode */ +#endif ) { int16_t b, m, i; @@ -719,10 +1299,13 @@ int16_t ivas_qmetadata_dec_sid_decode( if ( ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ +#ifndef SBA_MODE_CLEAN_UP } else { @@ -730,6 +1313,7 @@ int16_t ivas_qmetadata_dec_sid_decode( /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } +#endif } else { @@ -755,8 +1339,11 @@ int16_t ivas_qmetadata_dec_sid_decode( /* Fix configuration for SID */ q_direction = &hQMetaData->q_direction[0]; /* only 1 direction */ - +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { nbands = DIRAC_DTX_BANDS; /* only 2 bands transmitted */ } @@ -769,7 +1356,11 @@ int16_t ivas_qmetadata_dec_sid_decode( start_band = 0; /* start from band 0 */ /* Read 2D signaling*/ +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) +#else + if ( ivas_format != SBA_FORMAT ) +#endif { q_direction->not_in_2D = bitstream[( *index )--]; } @@ -854,6 +1445,7 @@ int16_t ivas_qmetadata_dec_sid_decode( } } /* TODO: temporary hack to keep BE */ +#ifndef SBA_MODE_CLEAN_UP if ( ivas_format == SBA_FORMAT ) { if ( sba_mode != SBA_MODE_SPAR ) @@ -862,6 +1454,9 @@ int16_t ivas_qmetadata_dec_sid_decode( } } else +#else + if ( ivas_format != SBA_FORMAT ) +#endif { metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } @@ -940,6 +1535,12 @@ static int16_t ivas_diffuseness_huff_ec_decode( } +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_diffuseness() + * + * + *-------------------------------------------------------------------*/ + static int16_t ivas_qmetadata_entropy_decode_diffuseness( uint16_t *bitstream, /* i : bitstream */ int16_t *index, @@ -1036,6 +1637,142 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness( } +#ifdef HR_METADATA +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_diffuseness_hr() + * + * + *-------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr( + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, + IVAS_QDIRECTION *q_direction, + uint16_t *diffuseness_index_max_ec_frame ) +{ + int16_t b; + uint16_t dif_min; + int16_t index_start; + int16_t nbands; + int16_t start_band; + + index_start = *index; + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + /* diffuseness decoding */ + /* Handle one band as special case*/ + if ( nbands == 1 ) + { + q_direction->band_data[0].energy_ratio_index[0] = 0; + for ( b = 0; b < MASA_BITS_ER_HR; b++ ) + { + q_direction->band_data[0].energy_ratio_index[0] = ( q_direction->band_data[0].energy_ratio_index[0] << 1 ) + bitstream[( *index )--]; + } + *diffuseness_index_max_ec_frame = 5; + + return MASA_BITS_ER_HR; + } + + if ( bitstream[( *index )--] == 0 ) /* dif_use_raw_coding */ + { + /* Decode with similarity strategy with low band count. On higher band counts, decode with Huffman-coding strategy. */ + + if ( bitstream[( *index )--] != 0 ) /* dif_have_unique_value */ + { + dif_min = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS ); /* dif_unique_value */ + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = dif_min; + } + } + else /* all diffuseness values are dif_min_value or dif_min_value + 1 */ + { + dif_min = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS - 1 ); /* dif_min_value */ + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = dif_min + bitstream[( *index )--]; /* dif_bit_offset_values */ + } + } + } + else /* different values for diffuseness */ + { + dif_min = HR_MASA_ER_LEVELS; + + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS ); + dif_min = min( dif_min, q_direction->band_data[b].energy_ratio_index[0] ); + } + } + + *diffuseness_index_max_ec_frame = 10; + /* adaptively select the diffuseness_index_max_ec threshold */ + if ( dif_min > 10 ) + { + *diffuseness_index_max_ec_frame = HR_MASA_ER_LEVELS - 1; + } + + return ( index_start - *index ); +} + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_diffuseness_hr_512() + * + * + *-------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, + IVAS_QDIRECTION *q_direction ) +{ + int16_t b, k; + + int16_t index_start; + int16_t nbands, nblocks; + int16_t start_band; + + index_start = *index; + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + start_band = q_direction->cfg.start_band; + + /* diffuseness decoding */ + /* Handle one band as special case*/ + if ( nbands == 1 ) + { + q_direction->band_data[0].energy_ratio_index[0] = 0; + for ( b = 0; b < MASA_BITS_ER_HR; b++ ) + { + q_direction->band_data[0].energy_ratio_index[0] = ( q_direction->band_data[0].energy_ratio_index[0] << 1 ) + bitstream[( *index )--]; + } + + return MASA_BITS_ER_HR; + } + + for ( b = start_band; b < nbands; b++ ) + { + for ( k = 0; k < nblocks; k++ ) + { + q_direction->band_data[b].energy_ratio_index[k] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, HR_MASA_ER_LEVELS ); + } + } + + return ( index_start - *index ); +} +#endif + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_entropy_decode_df_ratio() + * + * + *-------------------------------------------------------------------*/ + static int16_t ivas_qmetadata_entropy_decode_df_ratio( uint16_t *bitstream, int16_t *index, @@ -1161,7 +1898,12 @@ static int16_t ivas_qmetadata_entropy_decode_dir( int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, - const int16_t start_band ) + const int16_t start_band +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +#endif +) { int16_t b, m; int16_t diff_idx; @@ -1188,7 +1930,19 @@ static int16_t ivas_qmetadata_entropy_decode_dir( /*Raw coding for high diffuseness*/ for ( b = start_band; b < nbands; b++ ) { - diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { +#endif + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + } +#endif + diff_idx_min = min( diff_idx_min, diff_idx ); if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { @@ -1199,7 +1953,11 @@ static int16_t ivas_qmetadata_entropy_decode_dir( elev_alph[b] = no_theta_masa[bits_direction_masa[diff_idx] - 3] * 2 - 1; } +#ifdef HR_METADATA + if ( q_direction->band_data[b].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame ) +#else if ( diff_idx > diffuseness_index_max_ec_frame ) +#endif { bands_entropic[b] = 0; @@ -1252,7 +2010,18 @@ static int16_t ivas_qmetadata_entropy_decode_dir( if ( bands_entropic[b] ) { int16_t tmp_index; - diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { +#endif + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + } +#endif if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { @@ -1261,6 +2030,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( else { avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] ); + /*reorder elevation indexing*/ tmp_index = avg_elevation_index_projected - ( elev_alph[b] >> 1 ); if ( tmp_index < 0 ) @@ -1277,6 +2047,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( for ( m = 0; m < nblocks; m++ ) { q_direction->band_data[b].elevation_index[m] = avg_elevation_index_projected; + /*deduce aplhabet for azimuth*/ if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { @@ -1300,7 +2071,19 @@ static int16_t ivas_qmetadata_entropy_decode_dir( { if ( bands_entropic[b] ) { - diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { +#endif + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + } +#endif + for ( m = 0; m < nblocks; m++ ) { int16_t tmp_index; @@ -1323,7 +2106,6 @@ static int16_t ivas_qmetadata_entropy_decode_dir( } else { - avg_elevation_index_projected = ivas_dirac_project_elevation_index( avg_elevation_idx, avg_elevation_alphabet, elev_alph[b] ); tmp_index = ivas_qmetadata_DecodeExtendedGR( bitstream, index, elev_alph[b], gr_param_elev ); @@ -1359,7 +2141,19 @@ static int16_t ivas_qmetadata_entropy_decode_dir( { if ( bands_entropic[b] ) { - diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { +#endif + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + } +#endif + for ( m = 0; m < nblocks; m++ ) { q_direction->band_data[b].elevation_index[m] = 0; @@ -1419,6 +2213,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( set_zero( avg_direction_vector, 3 ); use_adapt_avg = 0; idx = 0; + for ( b = start_band; b < nbands; b++ ) { if ( bands_entropic[b] ) @@ -1478,6 +2273,59 @@ static int16_t ivas_qmetadata_entropy_decode_dir( } +#ifdef HR_METADATA +/*------------------------------------------------------------------------- + * ivas_qmetadata_raw_decode_dir() + * + * Main function for raw decoding of the directions + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_raw_decode_dir_512( + IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ + uint16_t *bitstream, /* i : bitstream */ + int16_t *index, + const int16_t nbands, + const int16_t start_band, + const SPHERICAL_GRID_DATA *sph_grid16 /* i : spherical grid for deindexing */ +) +{ + int16_t b, m, i; + int16_t nblocks; + int16_t index_start; + uint16_t value; + + index_start = *index; + nblocks = q_direction->cfg.nblocks; + + for ( b = start_band; b < nbands; b++ ) + { + for ( m = 0; m < nblocks; m++ ) + { + value = 0; + for ( i = 0; i < q_direction->band_data[b].bits_sph_idx[m]; i++ ) + { + value = ( value << 1 ) + bitstream[( *index )--]; + } + q_direction->band_data[b].spherical_index[m] = value; + + if ( q_direction->band_data[b].bits_sph_idx[m] == 16 ) + { + deindex_sph_idx( value, sph_grid16, &( q_direction->band_data[b].elevation[m] ), &( q_direction->band_data[b].azimuth[m] ) ); + } + else + { + deindex_spherical_component( q_direction->band_data[b].spherical_index[m], &q_direction->band_data[b].azimuth[m], &q_direction->band_data[b].elevation[m], + &q_direction->band_data[b].azimuth_index[m], &q_direction->band_data[b].elevation_index[m], q_direction->band_data[b].bits_sph_idx[m], + q_direction->cfg.mc_ls_setup ); + } + } + } + + return ( index_start - *index ); +} + +#endif + /*------------------------------------------------------------------------- * ivas_qmetadata_raw_decode_dir() * @@ -1489,7 +2337,12 @@ static int16_t ivas_qmetadata_raw_decode_dir( uint16_t *bitstream, /* i : bitstream */ int16_t *index, const int16_t nbands, - const int16_t start_band ) + const int16_t start_band +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +#endif +) { int16_t b, m, azith_alph; int16_t diff_idx; @@ -1507,7 +2360,18 @@ static int16_t ivas_qmetadata_raw_decode_dir( } else { - diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + diff_idx = 0; + } + else + { +#endif + diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; +#ifdef HR_METADATA + } +#endif for ( m = 0; m < nblocks; m++ ) { @@ -1531,7 +2395,7 @@ static int16_t ivas_qmetadata_raw_decode_dir( * Read the bitstream following the encoding scheme of EncodeQuasiUniform *------------------------------------------------------------------------*/ -/* !r: Value read from the bitstream */ +/*! r: Value read from the bitstream */ static uint16_t ivas_qmetadata_DecodeQuasiUniform( const uint16_t *bitstream, /* i : pointer to the bitstream to read */ int16_t *index, /* i : position in the bitstream to start reading (gets updated with reading) */ @@ -1542,7 +2406,7 @@ static uint16_t ivas_qmetadata_DecodeQuasiUniform( uint16_t tresh, value; #ifdef DEBUGGING - assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ + assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ #endif bits = 30 - norm_l( alphabet_size ); /* bits = floor(log2(alphabet_size)) */ @@ -1572,7 +2436,7 @@ static uint16_t ivas_qmetadata_DecodeQuasiUniform( * Reads the bitstream and decodes the value using the ExtendedGR algorithm *------------------------------------------------------------------------*/ -/* !r: Value decoded from the bitstream */ +/*! r: Value decoded from the bitstream */ static int16_t ivas_qmetadata_DecodeExtendedGR( uint16_t *bitstream, /* i : pointer to the bitstream to read */ int16_t *index, /* i/o: position in the bitstream to start reading (gets updated with reading) */ @@ -1631,7 +2495,7 @@ static int16_t ivas_qmetadata_DecodeExtendedGR( * Calculates the correct elevation index from the decoded data *------------------------------------------------------------------------*/ -/* !r: Elevation index as it will be read by the dequantizer */ +/*! r: Elevation index as it will be read by the dequantizer */ static int16_t ivas_qmetadata_ReorderElevationDecoded( const int16_t elev_dist, /* i : Distance to the average extracted from the bitstream */ const int16_t elev_avg, /* i : Average value over time-blocks extracted from the bitstream */ @@ -1661,7 +2525,7 @@ static int16_t ivas_qmetadata_ReorderElevationDecoded( * Local functions: requentizeEC3 *-----------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t read_directions( IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ const uint8_t coding_subbands, /* i : number of directions */ @@ -1713,6 +2577,7 @@ static int16_t read_directions( max_nb_idx = k; } } + if ( q_direction->cfg.nblocks == 1 ) { byteBuffer = 0; @@ -1892,7 +2757,7 @@ static int16_t read_directions( * read and decode the azimuth indexes for one subband *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t decode_azimuth( IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ uint16_t *bitstream, /* i : bitstream to be read */ @@ -2061,7 +2926,7 @@ static int16_t decode_azimuth( * Reads the bitstream and decode the elevation index *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t decode_elevation( IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ uint16_t *bitstream, /* i : input bitstream */ @@ -2189,7 +3054,7 @@ static int16_t decode_elevation( * decoding in fixed rate case, i.e. when using the spherical indexes *-----------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t decode_fixed_rate( IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata */ const uint16_t *bitstream, /* i : bitstream to be read */ @@ -2229,7 +3094,7 @@ static int16_t decode_fixed_rate( * Azimuth bitstream reading and decoding in 2D case *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t decode_azimuth2D( IVAS_QDIRECTION *q_direction, /* i/o: quantized metadata structure */ uint16_t *bitstream, /* i : bitstream to be read */ @@ -2423,7 +3288,7 @@ static int16_t read_truncGR_azimuth( * *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t read_common_direction( uint16_t *bitstream, /* i : bitstream to be read */ IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ @@ -2548,6 +3413,10 @@ static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: quantized metadata structure */ int16_t idx_d, /* i : direction index */ const int16_t no_frames /* i : number of time subframes */ +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +#endif ) { int16_t i, j; @@ -2557,6 +3426,9 @@ static void decode_spread_coherence( int16_t MASA_grouping[MASA_MAXIMUM_CODING_SUBBANDS]; IVAS_QDIRECTION *q_direction; int16_t coding_subbands, coding_subbands_0, d, two_dir_band[MASA_MAXIMUM_CODING_SUBBANDS]; +#ifdef HR_METADATA + int16_t min_index; +#endif coding_subbands_0 = hQMetaData->q_direction[0].cfg.nbands; coding_subbands = hQMetaData->q_direction[idx_d].cfg.nbands; @@ -2613,6 +3485,26 @@ static void decode_spread_coherence( { var_azi = var( q_direction->band_data[i].azimuth, no_frames ); +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + minimum_s( (int16_t *) ( q_direction->band_data[i].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); + min_index = min_index >> 1; + } + else + { + min_index = q_direction->band_data[i].energy_ratio_index[0]; + } + + if ( var_azi < MASA_DELTA_AZI_DCT0 ) + { + idx_sub_cb = MASA_NO_CV_COH * min_index; + } + else + { + idx_sub_cb = MASA_NO_CV_COH * ( min_index + DIRAC_DIFFUSE_LEVELS ); /* NO_CV_COH = 8 */ + } +#else if ( var_azi < MASA_DELTA_AZI_DCT0 ) { idx_sub_cb = MASA_NO_CV_COH * q_direction->band_data[i].energy_ratio_index[0]; @@ -2621,8 +3513,10 @@ static void decode_spread_coherence( { idx_sub_cb = MASA_NO_CV_COH * ( q_direction->band_data[i].energy_ratio_index[0] + DIRAC_DIFFUSE_LEVELS ); /* NO_CV_COH = 8 */ } +#endif dct_coh[i][0] = coherence_cb0_masa[idx_sub_cb + q_direction->coherence_band_data[i].spread_coherence_dct0_index]; + if ( coding_subbands < coding_subbands_0 ) { assert( idx_d == 1 ); @@ -2651,7 +3545,7 @@ static void decode_spread_coherence( * Read Hufman code *-------------------------------------------------------------------*/ -/* !r: number of bits read */ +/*! r: number of bits read */ static ivas_error read_huf( int16_t *num_bits_read, const uint16_t *bitstream, /* i : bitstream to be read */ @@ -2880,18 +3774,103 @@ static int16_t decode_fixed_rate_composed_index_coherence( } -/*------------------------------------------------------------------ - * +#ifdef HR_METADATA +/*-------------------------------------------------------------------* + * read_coherence_data_hr_512() + * + * + *-------------------------------------------------------------------*/ + +/*! r: number of bits read */ +static int16_t read_coherence_data_hr_512( + uint16_t *bitstream, /* i : bitstream */ + int16_t *p_bit_pos, /* i : position in the bitstream */ + IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */ + const int16_t idx_dir, /* i : direction index */ + const int16_t nbits_coh ) +{ + int16_t j, k, i; + int16_t nbands, nblocks; + int16_t min_index, GR_param; + int16_t cb_size, nbits; + int16_t decoded_idx; + float delta; + + nbands = hQMetaData->q_direction[idx_dir].cfg.nbands; + nblocks = hQMetaData->q_direction[idx_dir].cfg.nblocks; + + + cb_size = 1 << nbits_coh; + delta = 256.0f / cb_size; + nbits = *p_bit_pos; + for ( k = 0; k < nblocks; k++ ) + { + /* read method */ + if ( bitstream[( *p_bit_pos )--] == 1 ) + { + /* average removed */ + /* read average index */ + min_index = 0; + for ( i = 0; i < nbits_coh; i++ ) + { + min_index = ( min_index << 1 ) + bitstream[( *p_bit_pos )--]; + } + /* read GR param */ + GR_param = bitstream[( *p_bit_pos )--]; + for ( j = 0; j < nbands; j++ ) + { + decoded_idx = ivas_qmetadata_DecodeExtendedGR( bitstream, p_bit_pos, 2 * cb_size, GR_param ); + if ( decoded_idx % 2 ) + { + decoded_idx = ( ( decoded_idx + 1 ) >> 1 ) + min_index; + } + else + { + decoded_idx = -( decoded_idx >> 1 ) + min_index; + } + hQMetaData->q_direction[idx_dir].coherence_band_data[j].spread_coherence[k] = (uint8_t) ( decoded_idx * delta + delta / 2.0f ); + } + } + else + { + + /* read min_index */ + min_index = 0; + for ( i = 0; i < nbits_coh; i++ ) + { + min_index = ( min_index << 1 ) + bitstream[( *p_bit_pos )--]; + } + /* read GR param */ + GR_param = bitstream[( *p_bit_pos )--]; + for ( j = 0; j < nbands; j++ ) + { + decoded_idx = ivas_qmetadata_DecodeExtendedGR( bitstream, p_bit_pos, cb_size - min_index, GR_param ) + min_index; + hQMetaData->q_direction[idx_dir].coherence_band_data[j].spread_coherence[k] = (uint8_t) ( decoded_idx * delta + delta / 2.0f ); + } + } + } + nbits = nbits - *p_bit_pos; + return nbits; +} +#endif + + +/*------------------------------------------------------------------- * * read_coherence_data() * * Read coherence data - *------------------------------------------------------------------ - */ + *------------------------------------------------------------------- */ -/* !r: number of bits read */ +/*! r: number of bits read */ static int16_t read_coherence_data( uint16_t *bitstream, /* i : bitstream */ int16_t *p_bit_pos, /* i : position in the bitstream */ IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */ const int16_t idx_dir /* i : direction index */ +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +#endif ) { int16_t j; @@ -2909,6 +3888,10 @@ static int16_t read_coherence_data( int16_t decoded_idx[MASA_MAXIMUM_CODING_SUBBANDS]; uint16_t byteBuffer; int16_t idx_ER; +#ifdef HR_METADATA + int16_t min_index; +#endif + coding_subbands = hQMetaData->q_direction[idx_dir].cfg.nbands; q_direction = &( hQMetaData->q_direction[idx_dir] ); @@ -2919,7 +3902,19 @@ static int16_t read_coherence_data( { for ( j = 0; j < coding_subbands; j++ ) { - idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH; +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + coding_subbands / MASA_FACTOR_CV_COH; + } + else + { + +#endif + idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH; +#ifdef HR_METADATA + } +#endif no_cv_vec[j] = idx_ER + 1; } @@ -2943,7 +3938,11 @@ static int16_t read_coherence_data( { if ( no_cv_vec[j] > 1 ) { +#ifdef HR_METADATA + q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); +#else q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH ) ) ); +#endif } else { @@ -2960,7 +3959,11 @@ static int16_t read_coherence_data( { if ( no_cv_vec[j] > 1 ) { +#ifdef HR_METADATA + q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); +#else q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH ) ) ); +#endif } else { @@ -2973,7 +3976,19 @@ static int16_t read_coherence_data( { for ( j = 0; j < coding_subbands; j++ ) { - no_cv_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; /* spread coherence DCT0*/ +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); + no_cv_vec[j] = len_cb_dct0_masa[min_index >> 1]; /* spread coherence DCT0*/ + } + else + { +#endif + no_cv_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; /* spread coherence DCT0*/ +#ifdef HR_METADATA + } +#endif } if ( sum_s( no_cv_vec, coding_subbands ) > MASA_COH_LIMIT_2IDX ) @@ -3096,13 +4111,14 @@ static int16_t read_coherence_data( return nbits; } + /*-------------------------------------------------------------------* * read_surround_coherence() * * *-------------------------------------------------------------------*/ -int16_t read_surround_coherence( +static int16_t read_surround_coherence( uint16_t *bitstream, /* i : bitstream */ int16_t *p_bit_pos, /* i : position in the bitstream */ IVAS_QMETADATA *hQMetaData /* i/o: quantized metadata structure */ @@ -3258,6 +4274,168 @@ int16_t read_surround_coherence( } +#ifdef HR_METADATA +/*-------------------------------------------------------------------* + * read_surround_coherence_hr() + * + * + *-------------------------------------------------------------------*/ + +static int16_t read_surround_coherence_hr( + uint16_t *bitstream, /* i : bitstream */ + int16_t *p_bit_pos, /* i : position in the bitstream */ + IVAS_QMETADATA *hQMetaData /* i/o: quantized metadata structure */ +) +{ + int16_t coding_subbands; + int16_t no_cv_vec[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bit_pos; + float error_ratio_surr; + int16_t idx_ER[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t bits_sur_coherence, bits_GR; + int16_t j, k, sf; + uint16_t byteBuffer; + uint16_t idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + IVAS_QDIRECTION *q_direction; + int16_t min_index; + int16_t d, idx; + coding_subbands = hQMetaData->q_direction[0].cfg.nbands; + q_direction = hQMetaData->q_direction; + + bits_sur_coherence = 0; + bit_pos = *p_bit_pos; + + for ( sf = 0; sf < hQMetaData->q_direction[0].cfg.nblocks; sf++ ) + { + d = 0; + for ( j = 0; j < coding_subbands; j++ ) + { + error_ratio_surr = 1.0f; + if ( hQMetaData->no_directions == 2 ) + { + d += hQMetaData->twoDirBands[j]; + idx = max( d - 1, 0 ); + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf] - q_direction[1].band_data[idx].energy_ratio[sf] * hQMetaData->twoDirBands[j]; + } + else + { + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf]; + } + + + if ( error_ratio_surr <= 0 ) + { + error_ratio_surr = 0; + no_cv_vec[j] = 1; + idx_ER[j] = 0; + } + else + { + idx_ER[j] = 7; // masa_sq( error_ratio_surr, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + no_cv_vec[j] = idx_cb_sur_coh_masa[idx_ER[j]] + 2; + } + } + + if ( sum_s( no_cv_vec, coding_subbands ) == coding_subbands ) + { + /* surround coherence is zero */ + for ( j = 0; j < coding_subbands; j++ ) + { + for ( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[k] = 0; + } + } + } + } + else + { + /* read how the surround coherence is encoded */ + byteBuffer = bitstream[bit_pos--]; + bits_sur_coherence += 1; + + if ( byteBuffer & 1 ) + { + /* GR decoding */ + /* read GR order */ + byteBuffer = bitstream[bit_pos--]; + bits_sur_coherence += 1; + + /* read min index */ + bits_GR = bit_pos; + min_index = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, MASA_MAX_NO_CV_SUR_COH, 0 ); + bits_sur_coherence += bits_GR - bit_pos; + + /* read GR data */ + for ( j = 0; j < coding_subbands; j++ ) + { + bits_GR = bit_pos; + /* decoding for min removed */ + if ( no_cv_vec[j] > 1 ) + { + idx_sur_coh[j] = ivas_qmetadata_DecodeExtendedGR( bitstream, &bit_pos, no_cv_vec[j] - min_index, ( byteBuffer & 1 ) ); + bits_sur_coherence += bits_GR - bit_pos; + } + else + { + idx_sur_coh[j] = 0; + } + } + + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j] + min_index; + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index]; + } + else + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = idx_sur_coh[j]; + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; + } + } + } + else + { + /* fixed rate */ + uint16_t sur_coh_temp_index[MASA_MAXIMUM_CODING_SUBBANDS]; + set_s( (int16_t *) sur_coh_temp_index, 0, MASA_MAXIMUM_CODING_SUBBANDS ); + + decode_fixed_rate_composed_index_coherence( bitstream, &bit_pos, coding_subbands, no_cv_vec, sur_coh_temp_index, MASA_MAX_NO_CV_SUR_COH ); + + for ( j = 0; j < coding_subbands; j++ ) + { + hQMetaData->surcoh_band_data[j].sur_coherence_index = sur_coh_temp_index[j]; + } + + /* deindex surround coherence */ + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv_vec[j] > 1 ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = sur_coherence_cb_masa[idx_cb_sur_coh_masa[idx_ER[j]] * MASA_MAX_NO_CV_SUR_COH + hQMetaData->surcoh_band_data[j].sur_coherence_index]; + } + else + { + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; + } + } + } + } + } + + /* Replace return value with the actual read bits. bits_sur_coherence might show wrong count at this point. */ + bits_sur_coherence = *p_bit_pos - bit_pos; + *p_bit_pos = bit_pos; + + return bits_sur_coherence; +} + +#endif + /*-------------------------------------------------------------------* * decode_combined_index() * diff --git a/lib_dec/ivas_rom_dec.c b/lib_dec/ivas_rom_dec.c index 78d4eafea1..6a33a36aaa 100644 --- a/lib_dec/ivas_rom_dec.c +++ b/lib_dec/ivas_rom_dec.c @@ -226,7 +226,7 @@ const float dft_win_8k[70] = * stereo CNA tables *------------------------------------------------------------------------*/ -const int16_t cna_init_bands[MAX_CNA_NBANDS + 1] = +const int16_t cna_init_bands[CNA_INIT_NBANDS + 1] = { 1, 4, 14, 33, 67, 171, 320 }; @@ -520,9 +520,13 @@ const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1] = 0.0f, 0.125f, 0.375f, 1.0f }; -const int16_t sba_map_tc[8] = +const int16_t sba_map_tc[11] = { - 0, 1, 2, 3, 4, 8, 9, 15 + 0, 1, 2, 3, 4, 8, 9, 15, 5, 6, 7 +}; +const int16_t sba_map_tc_512[11] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 15 }; @@ -538,3 +542,290 @@ const float dmxmtx_table[BINAURAL_CHANNELS][11] = /* clang-format on */ + + +const int16_t huff_nodes_first_band_alpha[32][2] = { /* Alpha Fine Huffman table df0 */ + { -17, 1 }, + { 3, 2 }, + { -16, -18 }, + { 5, 4 }, + { -15, 6 }, + { -19, 7 }, + { 9, 8 }, + { 11, 10 }, + { -14, -20 }, + { 13, 12 }, + { -21, 14 }, + { -13, 15 }, + { 17, 16 }, + { -22, 18 }, + { -12, 19 }, + { -9, -10 }, + { -11, 20 }, + { -23, 21 }, + { -8, 22 }, + { -24, 23 }, + { -25, 24 }, + { -7, 25 }, + { -26, 26 }, + { 28, 27 }, + { -6, -27 }, + { -33, 29 }, + { -1, -28 }, + { -5, 30 }, + { -29, -30 }, + { -4, 31 }, + { -3, -31 }, + { -2, -32 } +}; +const int16_t huff_nodes_first_band_alpha_coarse[16][2] = { /* Alpha Coarse Huffman table df0 */ + { -9, 1 }, + { -8, 2 }, + { -10, 3 }, + { 5, 4 }, + { -7, 6 }, + { -11, 7 }, + { -5, 8 }, + { -6, 9 }, + { -12, 10 }, + { -13, 11 }, + { -4, 12 }, + { -14, 13 }, + { -3, 14 }, + { -15, 15 }, + { -2, -16 }, + { -1, -17 } +}; + + +const int16_t huff_nodes_alpha_1D_DF[64][2] = { /* Alpha Fine Huffman table df */ + { -33, 1 }, + { 3, 2 }, + { -32, -34 }, + { 5, 4 }, + { -31, -35 }, + { 7, 6 }, + { -30, 8 }, + { -36, 9 }, + { 11, 10 }, + { -37, 12 }, + { -29, 13 }, + { -28, 14 }, + { -38, 15 }, + { 17, 16 }, + { -27, -39 }, + { 19, 18 }, + { -26, 20 }, + { -40, 21 }, + { 23, 22 }, + { -41, 24 }, + { -25, 25 }, + { -24, 26 }, + { -42, 27 }, + { -43, 28 }, + { -23, 29 }, + { -44, 30 }, + { -22, 31 }, + { -45, 32 }, + { -21, 33 }, + { -20, 34 }, + { -46, 35 }, + { -19, 36 }, + { -47, 37 }, + { -18, -48 }, + { 39, 38 }, + { -17, -49 }, + { 41, 40 }, + { -16, 42 }, + { -1, -50 }, + { -65, 43 }, + { 45, 44 }, + { -51, 46 }, + { -15, 47 }, + { 49, 48 }, + { -52, 50 }, + { -14, 51 }, + { 53, 52 }, + { -13, 54 }, + { -53, 55 }, + { 57, 56 }, + { -12, 58 }, + { -54, 59 }, + { 61, 60 }, + { -55, 62 }, + { -11, 63 }, + { -10, -61 }, + { -5, -57 }, + { -58, -60 }, + { -56, -59 }, + { -4, -6 }, + { -7, -64 }, + { -9, -63 }, + { -3, -8 }, + { -2, -62 } +}; +const int16_t huff_nodes_alpha_1D_DF_coarse[32][2] = { /* Alpha Coarse Huffman table df */ + { -17, 1 }, + { -18, 2 }, + { -16, 3 }, + { -15, 4 }, + { -19, 5 }, + { 7, 6 }, + { -14, -20 }, + { 9, 8 }, + { -13, -21 }, + { 11, 10 }, + { -22, 12 }, + { -12, 13 }, + { -23, 14 }, + { -11, 15 }, + { -10, 16 }, + { -24, 17 }, + { -9, -25 }, + { 19, 18 }, + { -26, 20 }, + { -8, 21 }, + { 23, 22 }, + { 25, 24 }, + { -27, 26 }, + { -7, 27 }, + { -1, -33 }, + { -6, 28 }, + { -28, 29 }, + { -29, 30 }, + { -5, -31 }, + { -30, 31 }, + { -3, -4 }, + { -2, -32 } +}; + +const int16_t huff_nodes_alpha_1D_DT[64][2] = { /* Alpha Fine Huffman table dt */ + { -33, 1 }, + { -34, 2 }, + { -32, 3 }, + { 5, 4 }, + { -31, -35 }, + { 7, 6 }, + { -36, 8 }, + { -30, 9 }, + { 11, 10 }, + { -29, -37 }, + { 13, 12 }, + { 15, 14 }, + { -28, -38 }, + { 17, 16 }, + { -27, -39 }, + { 19, 18 }, + { -40, 20 }, + { -26, 21 }, + { 23, 22 }, + { -25, -41 }, + { 25, 24 }, + { -24, -42 }, + { 27, 26 }, + { -23, -43 }, + { 29, 28 }, + { -22, -44 }, + { 31, 30 }, + { -45, 32 }, + { -21, 33 }, + { -20, 34 }, + { -46, 35 }, + { -47, 36 }, + { -19, 37 }, + { -48, 38 }, + { -18, 39 }, + { 41, 40 }, + { -17, -49 }, + { 43, 42 }, + { -50, 44 }, + { -16, 45 }, + { 47, 46 }, + { -51, 48 }, + { -15, 49 }, + { 51, 50 }, + { -52, -65 }, + { -1, -14 }, + { 53, 52 }, + { -53, 54 }, + { -13, 55 }, + { 57, 56 }, + { -12, 58 }, + { -54, 59 }, + { 61, 60 }, + { -11, -55 }, + { -56, 62 }, + { -10, 63 }, + { -9, -57 }, + { -5, -6 }, + { -58, -61 }, + { -7, -59 }, + { -8, -62 }, + { -4, -60 }, + { -3, -64 }, + { -2, -63 } +}; +const int16_t huff_nodes_alpha_1D_DT_coarse[32][2] = { /* Alpha Coarse Huffman table dt */ + { -17, 1 }, + { -18, 2 }, + { -16, 3 }, + { -19, 4 }, + { -15, 5 }, + { 7, 6 }, + { -14, -20 }, + { 9, 8 }, + { -21, 10 }, + { -13, 11 }, + { 13, 12 }, + { -12, -22 }, + { 15, 14 }, + { -11, -23 }, + { 17, 16 }, + { -24, 18 }, + { -10, 19 }, + { -25, 20 }, + { -9, 21 }, + { 23, 22 }, + { -26, 24 }, + { -8, 25 }, + { 27, 26 }, + { -1, -33 }, + { -7, -27 }, + { 29, 28 }, + { -28, 30 }, + { -6, 31 }, + { -5, -29 }, + { -3, -31 }, + { -4, -30 }, + { -2, -32 } +}; + +const int16_t huff_nodes_first_band_beta[8][2] = /* Beta Fine Huffman table df0 */ + { { -1, 1 }, { -2, 2 }, { -3, 3 }, { -4, 4 }, { -5, 5 }, { -6, 6 }, { -7, 7 }, { -8, -9 } }; +const int16_t huff_nodes_first_band_beta_coarse[4][2] = /* Beta Coarse Huffman table df0 */ + { { -1, 1 }, { -2, 2 }, { -3, 3 }, { -4, -5 } }; + +const int16_t huff_nodes_beta_1D_DF[16][2] = /* Beta Fine Huffman table df */ + { { -9, 1 }, { -10, 2 }, { -8, 3 }, { -11, 4 }, { -7, 5 }, { 7, 6 }, { -6, -12 }, { 9, 8 }, { -5, -13 }, { 11, 10 }, { -4, -14 }, { -15, 12 }, { -3, 13 }, { -16, 14 }, { -2, 15 }, { -1, -17 } }; +const int16_t huff_nodes_beta_1D_DF_coarse[8][2] = /* Beta Coarse Huffman table df */ + { { -5, 1 }, { -6, 2 }, { -4, 3 }, { -3, 4 }, { -7, 5 }, { -2, 6 }, { -8, 7 }, { -1, -9 } }; + +const int16_t huff_nodes_beta_1D_DT[16][2] = /* Beta Fine Huffman table dt */ + { { -9, 1 }, { -10, 2 }, { -8, 3 }, { -11, 4 }, { -7, 5 }, { 7, 6 }, { -6, -12 }, { -13, 8 }, { -5, 9 }, { -14, 10 }, { -4, 11 }, { -15, 12 }, { -3, 13 }, { -16, 14 }, { -2, 15 }, { -1, -17 } }; +const int16_t huff_nodes_beta_1D_DT_coarse[8][2] = /* Beta Coarse Huffman table dt */ + { { -5, 1 }, { -6, 2 }, { -4, 3 }, { -7, 4 }, { -3, 5 }, { -8, 6 }, { -2, 7 }, { -1, -9 } }; + +HUFF_NODE_TABLE huff_nodes_df0 = { + { huff_nodes_first_band_alpha, huff_nodes_first_band_alpha_coarse }, + { huff_nodes_first_band_beta, huff_nodes_first_band_beta_coarse } +}; + +HUFF_NODE_TABLE huff_nodes_df = { + { huff_nodes_alpha_1D_DF, huff_nodes_alpha_1D_DF_coarse }, + { huff_nodes_beta_1D_DF, huff_nodes_beta_1D_DF_coarse } +}; + +HUFF_NODE_TABLE huff_nodes_dt = { + { huff_nodes_alpha_1D_DT, huff_nodes_alpha_1D_DT_coarse }, + { huff_nodes_beta_1D_DT, huff_nodes_beta_1D_DT_coarse } +}; diff --git a/lib_dec/ivas_rom_dec.h b/lib_dec/ivas_rom_dec.h index 4366077bbb..7a19f170c0 100644 --- a/lib_dec/ivas_rom_dec.h +++ b/lib_dec/ivas_rom_dec.h @@ -68,7 +68,7 @@ extern const float dft_win232ms_48k[450]; extern const float dft_win_8k[70]; -extern const int16_t cna_init_bands[MAX_CNA_NBANDS + 1]; +extern const int16_t cna_init_bands[CNA_INIT_NBANDS + 1]; extern const float min_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS]; extern const float max_smooth_gains1[SBA_DIRAC_STEREO_NUM_BANDS]; @@ -111,8 +111,8 @@ extern const float ap_lattice_coeffs_3[DIRAC_DECORR_FILTER_LEN_3 * DIRAC_MAX_NUM extern const float *const ap_lattice_coeffs[DIRAC_DECORR_NUM_SPLIT_BANDS]; extern const float ap_split_frequencies[DIRAC_DECORR_NUM_SPLIT_BANDS + 1]; -extern const int16_t sba_map_tc[8]; - +extern const int16_t sba_map_tc[11]; +extern const int16_t sba_map_tc_512[11]; /*----------------------------------------------------------------------------------* * FASTCONV and PARAMETRIC binaural renderer ROM tables @@ -121,4 +121,26 @@ extern const int16_t sba_map_tc[8]; extern const float dmxmtx_table[BINAURAL_CHANNELS][11]; +extern const int16_t huff_nodes_first_band_alpha[32][2]; +extern const int16_t huff_nodes_first_band_alpha_coarse[16][2]; + + +extern const int16_t huff_nodes_alpha_1D_DF[64][2]; +extern const int16_t huff_nodes_alpha_1D_DF_coarse[32][2]; + +extern const int16_t huff_nodes_alpha_1D_DT[64][2]; +extern const int16_t huff_nodes_alpha_1D_DT_coarse[32][2]; + +extern const int16_t huff_nodes_first_band_beta[8][2]; +extern const int16_t huff_nodes_first_band_beta_coarse[4][2]; + +extern const int16_t huff_nodes_beta_1D_DF[16][2]; +extern const int16_t huff_nodes_beta_1D_DF_coarse[8][2]; + +extern const int16_t huff_nodes_beta_1D_DT[16][2]; +extern const int16_t huff_nodes_beta_1D_DT_coarse[8][2]; +extern const HUFF_NODE_TABLE huff_nodes_df0; +extern const HUFF_NODE_TABLE huff_nodes_df; +extern const HUFF_NODE_TABLE huff_nodes_dt; + #endif diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index af7281a578..478749ddc0 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -59,10 +59,14 @@ void ivas_sba_set_cna_cng_flag( { int16_t n, cpe_id; +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 1 ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 ) +#endif { /* skip as done in init function */ - /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */ /* Todo: Check if these can be enabled */ + /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */ /* st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 0; */ } else if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) ) @@ -74,7 +78,7 @@ void ivas_sba_set_cna_cng_flag( { for ( n = 0; n < CPE_CHANNELS; n++ ) { - st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; /* Todo: Check if these can be enabled */ + st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1; } } @@ -108,22 +112,19 @@ ivas_error ivas_sba_dec_reconfigure( AUDIO_CONFIG intern_config_old; int16_t numCldfbAnalyses_old, numCldfbSyntheses_old; int16_t sba_dirac_stereo_flag_old; - SBA_MODE sba_mode_old; - int32_t ivas_total_brate, last_ivas_total_brate; + int32_t ivas_total_brate; + int32_t last_ivas_total_brate; + RENDERER_TYPE old_renderer_type; + DECODER_CONFIG_HANDLE hDecoderConfig; ivas_error error; - int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; - error = IVAS_ERR_OK; hDecoderConfig = st_ivas->hDecoderConfig; ivas_total_brate = hDecoderConfig->ivas_total_brate; last_ivas_total_brate = st_ivas->last_active_ivas_total_brate; - sba_mode_old = ivas_sba_mode_select( last_ivas_total_brate ); - st_ivas->sba_mode = sba_mode_old; - /*-----------------------------------------------------------------* * Set SBA high-level parameters * Save old SBA high-level parameters @@ -137,63 +138,77 @@ ivas_error ivas_sba_dec_reconfigure( sba_dirac_stereo_flag_old = st_ivas->sba_dirac_stereo_flag; st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); - st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate ); + +#ifdef JBM_TSM_ON_TCS + /* save old */ + if ( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) + { + st_ivas->hTcBuffer->num_slots = st_ivas->hSpar->num_slots; + st_ivas->hTcBuffer->nb_subframes = st_ivas->hSpar->nb_subframes; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hSpar->slots_rendered; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hSpar->subframes_rendered; + mvs2s( st_ivas->hSpar->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } + else if ( st_ivas->hDirAC != NULL ) + { + st_ivas->hTcBuffer->num_slots = st_ivas->hDirAC->num_slots; + st_ivas->hTcBuffer->nb_subframes = st_ivas->hDirAC->nb_subframes; + st_ivas->hTcBuffer->slots_rendered = st_ivas->hDirAC->slots_rendered; + st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; + mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); + } +#endif /*-----------------------------------------------------------------* * Allocate, initialize, and configure SBA handles *-----------------------------------------------------------------*/ + int16_t sba_order_internal; + SPAR_DEC_HANDLE hSpar; + hSpar = st_ivas->hSpar; - if ( st_ivas->sba_mode != SBA_MODE_SPAR ) - { - ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 0 ); + sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, -1 ) ) != IVAS_ERR_OK ) + if ( hSpar != NULL ) + { + if ( ( hSpar->hPCA != NULL ) && ( ( hDecoderConfig->ivas_total_brate != PCA_BRATE ) || ( sba_order_internal != 1 ) ) ) { - return error; + free( st_ivas->hSpar->hPCA ); + hSpar->hPCA = NULL; } - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - } - else - { - int16_t sba_order_internal; - SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; - - sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - - if ( hSpar != NULL ) + if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) || ( last_ivas_total_brate >= IVAS_512k && ivas_total_brate < IVAS_512k ) || ( last_ivas_total_brate < IVAS_512k && ivas_total_brate >= IVAS_512k ) ) { - if ( ( hSpar->hPCA != NULL ) && ( ( hDecoderConfig->ivas_total_brate != PCA_BRATE ) || ( sba_order_internal != 1 ) ) ) - { - free( st_ivas->hSpar->hPCA ); - hSpar->hPCA = NULL; - } - - if ( nchan_transport_old != ivas_get_sba_num_TCs( ivas_total_brate, sba_order_internal ) ) - { - ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); + ivas_spar_dec_close( &( st_ivas->hSpar ), hDecoderConfig->output_Fs, 1 ); - if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); - } - else - { - if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_spar_dec_open( st_ivas, 1 ) ) != IVAS_ERR_OK ) { return error; } } - hSpar = st_ivas->hSpar; - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + ivas_spar_config( ivas_total_brate, sba_order_internal, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &hSpar->core_nominal_brate, st_ivas->sid_format ); + } + else + { + if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } } + hSpar = st_ivas->hSpar; + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + +#ifdef JBM_TSM_ON_TCS + /* synchronize subframe info */ + st_ivas->hSpar->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hSpar->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hSpar->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + st_ivas->hSpar->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpar->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); +#endif + if ( st_ivas->nchan_transport == 1 ) { st_ivas->element_mode_init = IVAS_SCE; @@ -258,7 +273,7 @@ ivas_error ivas_sba_dec_reconfigure( ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); } - if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( sba_mode_old != st_ivas->sba_mode ) || ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) ) ) + if ( ( ( st_ivas->renderer_type != RENDERER_DISABLE ) && ( st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC ) ) || ( ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO ) && ( st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) ) || ( last_ivas_total_brate > IVAS_256k && ivas_total_brate <= IVAS_256k ) || ( last_ivas_total_brate <= IVAS_256k && ivas_total_brate > IVAS_256k ) ) { DIRAC_CONFIG_FLAG flag_config; @@ -266,46 +281,55 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hDirAC != NULL ) { flag_config = DIRAC_RECONFIGURE_MODE; - if ( ( sba_mode_old == st_ivas->sba_mode ) && ( st_ivas->sba_mode != SBA_MODE_SPAR ) ) - { - flag_config = DIRAC_RECONFIGURE; - } } if ( ( error = ivas_dirac_dec_config( st_ivas, flag_config ) ) != IVAS_ERR_OK ) { return error; } - } - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) - { - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) != IVAS_ERR_OK ) - { - return error; - } +#ifdef JBM_TSM_ON_TCS + /* synchronize subframe info */ + st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; + st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; + st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; + st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; + mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); +#endif } - if ( ( ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) ) && ( ( sba_mode_old != st_ivas->sba_mode ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) ) ) - { - ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); - - st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + if ( ( error = ivas_dirac_sba_config( + st_ivas->hQMetaData, +#ifndef SBA_MODE_CLEAN_UP + &st_ivas->nchan_transport, + &st_ivas->nSCE, + &st_ivas->nCPE, +#endif + &st_ivas->element_mode_init, + ivas_total_brate, + st_ivas->sba_analysis_order, +#ifndef SBA_MODE_CLEAN_UP + st_ivas->sba_mode, +#endif + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + ) ) != IVAS_ERR_OK ) + { + return error; } - else if ( st_ivas->renderer_type == RENDERER_DISABLE || ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode != SBA_MODE_SPAR ) ) + if ( st_ivas->renderer_type == RENDERER_DISABLE ) { ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); vbap_free_data( &( st_ivas->hVBAPdata ) ); } - if ( st_ivas->hDirAC != NULL && st_ivas->sba_mode == SBA_MODE_SPAR ) + if ( st_ivas->hDirAC != NULL ) { +#ifndef SBA_MODE_CLEAN_UP mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); +#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; } @@ -327,6 +351,18 @@ ivas_error ivas_sba_dec_reconfigure( return error; } + /*-----------------------------------------------------------------* + * TD Decorrelator + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDiracDecBin != NULL ) + { + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( st_ivas->hDiracDecBin->hTdDecorr ), &( st_ivas->hDiracDecBin->useTdDecorr ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + /*-----------------------------------------------------------------* * CLDFB instances *-----------------------------------------------------------------*/ @@ -336,5 +372,229 @@ ivas_error ivas_sba_dec_reconfigure( return error; } +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * JBM TC buffer + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->voip_active == 1 ) + { + int16_t tc_nchan_to_allocate; + int16_t tc_nchan_tc; + TC_BUFFER_MODE tc_buffer_mode; + + tc_buffer_mode = TC_BUFFER_MODE_RENDERER; + tc_nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + tc_nchan_to_allocate = tc_nchan_tc; + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) + { + tc_buffer_mode = TC_BUFFER_MODE_BUFFER; + tc_nchan_tc = st_ivas->hDecoderConfig->nchan_out; + tc_nchan_to_allocate = tc_nchan_tc; + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } +#ifndef SBA_MODE_CLEAN_UP + else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif + { + tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); + } + else + { + if ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) ) + { + tc_nchan_to_allocate++; /* we need a channel for the CNG in this case*/ + } + } + + if ( tc_nchan_tc != st_ivas->hTcBuffer->nchan_transport_jbm || tc_nchan_to_allocate != st_ivas->hTcBuffer->nchan_transport_internal || tc_buffer_mode != st_ivas->hTcBuffer->tc_buffer_mode ) + { + if ( ( error = ivas_jbm_dec_tc_buffer_reconfigure( st_ivas, tc_buffer_mode, tc_nchan_tc, tc_nchan_to_allocate, tc_nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } + } +#endif + + return error; +} + +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_sba_dec_digest_tc() + * + * + *-------------------------------------------------------------------*/ + +ivas_error ivas_sba_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +) +{ + + int16_t ch_idx; + ivas_error error; + + error = IVAS_ERR_OK; + + /* set the md map */ +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->hDirAC && !( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode == SBA_MODE_DIRAC ) ) +#else + if ( st_ivas->hDirAC ) +#endif + { + ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); + } + +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif + { + ivas_spar_dec_digest_tc( st_ivas, st_ivas->nchan_transport, nCldfbSlots, nSamplesForRendering ); + } + + if ( st_ivas->hDiracDecBin != NULL && ( st_ivas->hDiracDecBin->useTdDecorr ) ) + { + int16_t nSamplesLeftForTD, default_frame; + float *decorr_signal[BINAURAL_CHANNELS]; + float *p_tc[2 * BINAURAL_CHANNELS]; + + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + + for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + decorr_signal[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx + BINAURAL_CHANNELS]; + p_tc[ch_idx] = st_ivas->hTcBuffer->tc[ch_idx]; + } + + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( st_ivas->hDiracDecBin->hTdDecorr ) + { +#endif + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); +#ifdef FIX_163_SBA_TD_DECORR_OPT + } +#endif + for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) + { + decorr_signal[ch_idx] += nSamplesToDecorr; + p_tc[ch_idx] += nSamplesToDecorr; + } + nSamplesLeftForTD -= nSamplesToDecorr; + } + } + + /* if we have a late CNG generation, do it here */ +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format == SBA_FORMAT ) +#endif + { + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); + } + return error; } + + +/*-------------------------------------------------------------------* + * ivas_sba_dec_render() + * + * + *-------------------------------------------------------------------*/ + +void ivas_sba_dec_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, ch; + uint16_t nchan_internal, nchan_out; + SPAR_DEC_HANDLE hSpar; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hSpar = st_ivas->hSpar; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); + + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + +#ifdef DEBUGGING + assert( hSpar ); +#endif + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hSpar->num_slots - hSpar->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hSpar->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hSpar->subframe_nbslots[last_sf]; + last_sf++; + } +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + int16_t n_samples_sf = slot_size * hSpar->subframe_nbslots[subframe_idx]; + + ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) + { + ivas_sba_linear_renderer( output_f, *nSamplesRendered, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); + } + + if ( st_ivas->hDirAC != NULL && hSpar->slots_rendered == hSpar->num_slots ) + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + } + + *nSamplesAvailable = ( hSpar->num_slots - hSpar->slots_rendered ) * slot_size; + + return; +} +#endif diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 644a3dc523..13f1401f8e 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -63,7 +63,11 @@ int16_t ivas_get_sba_dirac_stereo_flag( if ( st_ivas->ivas_format == SBA_FORMAT || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) { +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#endif { if ( output_config == AUDIO_CONFIG_STEREO || ( output_config == AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) ) { @@ -693,6 +697,10 @@ void ivas_sba_dirac_stereo_smooth_parameters( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs /* i : Fs for delay calculation */ +#ifdef FIX_STEREO_474 + , + const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ +#endif ) { int16_t i, j, k, i_sf; @@ -732,6 +740,9 @@ void ivas_sba_dirac_stereo_smooth_parameters( float xfade_start_ns; int16_t xfade_delay_subframes; int16_t i_hist; +#ifdef FIX_STEREO_474 + int16_t md_sf; +#endif xfade_start_ns = cross_fade_start_offset / (float) output_Fs * 1000000000.f - IVAS_FB_ENC_DELAY_NS; xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); @@ -742,6 +753,11 @@ void ivas_sba_dirac_stereo_smooth_parameters( { for ( i_sf = k * 2; i_sf < ( k + 1 ) * 2; i_sf++ ) { + +#ifdef FIX_STEREO_474 + md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; +#endif + if ( hStereoDft->first_frame ) { for ( i = 0; i < 2; i++ ) @@ -786,7 +802,11 @@ void ivas_sba_dirac_stereo_smooth_parameters( { for ( b = 0; b < hStereoDft->nbands; b++ ) { +#ifdef FIX_STEREO_474 + hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + md_sf * IVAS_MAX_NUM_BANDS]; +#else hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + i_sf * IVAS_MAX_NUM_BANDS]; +#endif } } } @@ -844,8 +864,12 @@ void ivas_sba_dirac_stereo_dec( memOffset = NS2SA( output_frame * FRAMES_PER_SEC, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); ivas_sba_dirac_stereo_config( hStereoDft->hConfig ); +#ifdef SBA_MODE_CLEAN_UP + hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) ); +#else hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) ); +#endif stereo_dft_dec_update( hStereoDft, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); if ( st_ivas->nchan_transport > 1 ) { @@ -867,21 +891,36 @@ void ivas_sba_dirac_stereo_dec( } /* mapping of DirAC parameters (azimuth, elevation, diffuseness) to DFT Stereo parameters (side gain, prediction gain) */ +#ifdef SBA_MODE_CLEAN_UP + map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0], + st_ivas->ivas_format == MC_FORMAT, + ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame, + ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ) ); +#else map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0], st_ivas->ivas_format == MC_FORMAT, ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame, ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ) ); - +#endif +#ifdef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) +#else if ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) +#endif { set_f( hStereoDft->res_pred_gain, 1.f, 3 * STEREO_DFT_BAND_MAX ); } /* DFT Stereo upmix */ stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1 /*st_ivas->sba_dirac_stereo_flag*/, sba_mono_flag, - ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : 0, + ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : NULL, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hFbMixer->cross_fade_start_offset : 0, - st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport ); + st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport +#ifdef FIX_STEREO_474 + , + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) +#endif + ); /* DFT synthesis */ stereo_dft_dec_synthesize( hCPE, DFT, 0, output[0], output_frame ); @@ -913,9 +952,13 @@ void ivas_sba_dirac_stereo_dec( /* upmix ACELP BWE */ ivas_sba_dirac_stereo_compute_hb_gain( hStereoDft, hb_gain ); +#ifdef SBA_MODE_CLEAN_UP + ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, + ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); +#else ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); - +#endif /* add HB to ACELP core */ v_add( output[0], hb_synth_stereo[0], output[0], output_frame ); @@ -924,7 +967,12 @@ void ivas_sba_dirac_stereo_dec( v_add( output[1], hb_synth_stereo[1], output[1], output_frame ); /* apply TD Stereo Filling as is done in ICBWE */ +#ifdef SBA_MODE_CLEAN_UP + ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) ); +#else ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) ); + +#endif } } diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index a80986b39e..dd4af01ccf 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -65,7 +65,10 @@ void ivas_sba2mc_cldfb( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ const int16_t nb_channels_out, /* i : nb of output channels */ const int16_t nb_bands, /* i : nb of CLDFB bands to process */ - const float *hoa_dec_mtx /* i : HOA decoding mtx */ +#ifdef JBM_TSM_ON_TCS + const int16_t nb_timeslots, /* i : number of time slots to process */ +#endif + const float *hoa_dec_mtx /* i : HOA decoding mtx */ ) { int16_t iBlock, iBand, n, m; @@ -89,7 +92,12 @@ void ivas_sba2mc_cldfb( g = hoa_dec_mtx[SBA_NHARM_HOA3 * n + m]; p_realOut = realOut[n]; p_imagOut = imagOut[n]; + +#ifdef JBM_TSM_ON_TCS + for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) +#else for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) +#endif { p_real = RealBuffer[m][iBlock]; p_imag = ImagBuffer[m][iBlock]; @@ -108,7 +116,12 @@ void ivas_sba2mc_cldfb( { p_realOut = realOut[n]; p_imagOut = imagOut[n]; + +#ifdef JBM_TSM_ON_TCS + for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) +#else for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) +#endif { p_real = RealBuffer[n][iBlock]; p_imag = ImagBuffer[n][iBlock]; @@ -133,11 +146,16 @@ void ivas_sba2mc_cldfb( *-------------------------------------------------------------------------*/ void ivas_mc2sba( - IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ + IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ +#ifdef JBM_TSM_ON_TCS + float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + float *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ +#else float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ +#endif + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ ) { int16_t i, j, k; @@ -168,7 +186,11 @@ void ivas_mc2sba( /* Add LFE to omni W with gain*/ for ( k = 0; k < output_frame; k++ ) { +#ifdef JBM_TSM_ON_TCS + buffer_tmp[0][k] += gain_lfe * in_buffer_td[i][k]; +#else buffer_tmp[0][k] += gain_lfe * buffer_td[i][k]; +#endif } } @@ -194,7 +216,11 @@ void ivas_mc2sba( { for ( k = 0; k < output_frame; k++ ) { +#ifdef JBM_TSM_ON_TCS + buffer_tmp[j][k] += gains[j] * in_buffer_td[i][k]; +#else buffer_tmp[j][k] += gains[j] * buffer_td[i][k]; +#endif } } } @@ -228,15 +254,21 @@ int16_t ivas_sba_remapTCs( #endif nchan_remapped = st_ivas->nchan_transport; +#ifdef SBA_MODE_CLEAN_UP + if ( nchan_remapped == 3 ) +#else if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && nchan_remapped >= 3 ) || ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && nchan_remapped == 3 ) ) +#endif { nchan_remapped++; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode != SBA_MODE_SPAR ) { assert( ( ( st_ivas->nchan_transport == 3 ) || ( st_ivas->nchan_transport == 5 ) || ( st_ivas->nchan_transport == 7 ) ) && "Number of channels must be odd for SBA planar!" ); } +#endif if ( nchan_remapped == 4 ) { @@ -263,11 +295,12 @@ int16_t ivas_sba_remapTCs( } } +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode != SBA_MODE_SPAR ) { ivas_sba_zero_vert_comp( sba_data, st_ivas->sba_analysis_order, st_ivas->sba_planar, output_frame ); } - +#endif return ( nchan_remapped ); } @@ -279,7 +312,11 @@ int16_t ivas_sba_remapTCs( *-------------------------------------------------------------------------*/ void ivas_ism2sba( - float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ +#ifdef JBM_TSM_ON_TCS + float *buffer_td[], /* i/o: TD signal buffers */ +#else + float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ +#endif ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ const int16_t nchan_ism, /* i : number of objects */ @@ -335,6 +372,59 @@ void ivas_ism2sba( return; } +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------------* + * ivas_ism2sba() + * + * ISM transformed into SBA in TD domain. + *-------------------------------------------------------------------------*/ + +void ivas_ism2sba_sf( + float *buffer_in[], /* i : TC buffer */ + float *buffer_out[], /* o : TD signal buffers */ + ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ + const int16_t num_objects, /* i : number of objects */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int16_t offset, /* i : offset for the interpolatr */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ +) +{ + int16_t i, j, k; + float g1, *g2, *tc, *out, gain, prev_gain; + int16_t sba_num_chans; + + assert( ( sba_order <= 3 ) && "Only order up to 3 is supported!" ); + assert( hIsmRendererData != NULL && "hIsmRendererData not allocated!" ); + + + /* Init*/ + sba_num_chans = ( sba_order + 1 ) * ( sba_order + 1 ); + for ( j = 0; j < sba_num_chans; j++ ) + { + set_zero( buffer_out[j], n_samples_to_render ); + } + + for ( i = 0; i < num_objects; i++ ) + { + for ( j = 0; j < sba_num_chans; j++ ) + { + g2 = hIsmRendererData->interpolator + offset; + g1 = 1 - *g2; + tc = buffer_in[i] + offset; + out = buffer_out[j]; + gain = hIsmRendererData->gains[i][j]; + prev_gain = hIsmRendererData->prev_gains[i][j]; + for ( k = 0; k < n_samples_to_render; k++ ) + { + *( out++ ) += ( ( *( g2++ ) ) * gain + g1 * prev_gain ) * ( *( tc++ ) ); + g1 = 1.0f - *g2; + } + } + } + + return; +} +#endif /*-------------------------------------------------------------------* * ivas_sba_upmixer_renderer() @@ -348,13 +438,18 @@ void ivas_sba_upmixer_renderer( const int16_t output_frame /* i : output frame length */ ) { - int16_t i, nchan_internal; + int16_t nchan_internal; +#ifndef JBM_TSM_ON_TCS + int16_t i; float temp; +#endif push_wmops( "ivas_sba_upmixer_renderer" ); - nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); +#ifndef JBM_TSM_ON_TCS if ( st_ivas->nchan_transport >= 3 ) { /*convert WYZX downmix to WYXZ*/ @@ -365,15 +460,27 @@ void ivas_sba_upmixer_renderer( output[3][i] = temp; } } +#endif /* Upmixer + Renderer */ ivas_spar_dec_upmixer( st_ivas, output, nchan_internal, output_frame ); if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { +#ifdef JBM_TSM_ON_TCS + float *output_f[MAX_OUTPUT_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + output_f[ch] = output[ch]; + } + + ivas_sba_linear_renderer( output_f, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); +#else ivas_sba_linear_renderer( output, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); +#endif } - pop_wmops(); return; @@ -387,7 +494,11 @@ void ivas_sba_upmixer_renderer( *-------------------------------------------------------------------*/ static void ivas_sba_mtx_mult( - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-corder transport channels/DirAC output */ +#else + float output_f[][L_FRAME48k], /* i/o: synthesized core-corder transport channels/DirAC output */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : Number of ambisonic channels */ const IVAS_OUTPUT_SETUP output_setup, /* i : Output configuration */ @@ -447,7 +558,11 @@ static void ivas_sba_mtx_mult( *-------------------------------------------------------------------*/ ivas_error ivas_sba_linear_renderer( - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#ifdef JBM_TSM_ON_TCS + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ +#else + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ +#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : number of input ambisonics channels */ const AUDIO_CONFIG output_config, /* i : output audio configuration */ @@ -581,7 +696,8 @@ void ivas_sba_mix_matrix_determiner( /* Mixing matrix determiner */ num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; - ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi ); + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, bfi, + MAX_PARAM_SPATIAL_SUBFRAMES ); return; } diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 9a940b9b6d..f405f50c04 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -92,18 +92,12 @@ ivas_error ivas_sce_dec( st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; assert( st->total_brate == SID_2k40 && "SCE SID must be 2.4kbps!" ); -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id ) { st->total_brate = FRAME_NO_DATA; } -#endif } -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA ) -#else - else if ( !st_ivas->bfi && ivas_total_brate <= SID_2k40 ) -#endif { st->total_brate = FRAME_NO_DATA; } @@ -155,8 +149,13 @@ ivas_error ivas_sce_dec( st->codec_mode = MODE1; /* set "bits_frame_nominal" */ +#ifndef SBA_MODE_CLEAN_UP if ( ( st_ivas->hQMetaData != NULL ) && ( st_ivas->sba_mode != SBA_MODE_SPAR ) ) +#else + if ( ( st_ivas->hQMetaData != NULL ) && + ( st_ivas->ivas_format != SBA_FORMAT ) ) +#endif { if ( st_ivas->mc_mode == MC_MODE_MCMASA && ivas_total_brate >= MCMASA_SEPARATE_BRATE ) { @@ -167,7 +166,11 @@ ivas_error ivas_sce_dec( st->bits_frame_nominal = st_ivas->hQMetaData->bits_frame_nominal; } } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { st->bits_frame_nominal = (int16_t) ( st_ivas->hSpar->core_nominal_brate / FRAMES_PER_SEC ); } @@ -181,18 +184,12 @@ ivas_error ivas_sce_dec( { st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT if ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->hISMDTX.sce_id_dtx != sce_id ) { st->total_brate = FRAME_NO_DATA; } -#endif } -#ifdef FIX_ISM_DTX_CNG_BWIDTH_ALT else if ( !st_ivas->bfi && ivas_total_brate == FRAME_NO_DATA ) -#else - else if ( !st_ivas->bfi && ivas_total_brate <= SID_2k40 ) -#endif { st->total_brate = ivas_total_brate; } diff --git a/lib_dec/ivas_sns_dec.c b/lib_dec/ivas_sns_dec.c index 6cf80ec0d1..e11551d2a6 100644 --- a/lib_dec/ivas_sns_dec.c +++ b/lib_dec/ivas_sns_dec.c @@ -35,10 +35,9 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" -#ifdef SNS_MSVQ #include "ivas_rom_com.h" #include "ivas_cnst.h" -#endif +#include #include "wmc_auto.h" /*------------------------------------------------------------------- @@ -49,24 +48,45 @@ static void sns_1st_dec( const int16_t index, /* i : codebook index */ - float *snsq /* i/o: i:prediction o:quantized sns */ + const int16_t core, + const int16_t L_frame, + float *snsq /* i/o: i:prediction o:quantized sns */ ) { int16_t i; - const float *p_dico; + const int16_t *p_dico, *means; + const float cdbk_fix2float = 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ); + const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC ); + + means = NULL; + switch ( L_frame ) + { + case L_FRAME16k: + means = &sns_1st_means_16k[core - 1][0]; + break; + case L_FRAME25_6k: + means = &sns_1st_means_25k6[core - 1][0]; + break; + case L_FRAME32k: + means = &sns_1st_means_32k[core - 1][0]; + break; + default: + assert( !"illegal frame length in sns_1st_cod" ); + } - p_dico = &sns_vq_cdk1[( index % 32 ) * ( M / 2 )]; + + p_dico = &sns_1st_cdbk[0][core - 1][0] + ( index % 32 ) * ( M / 2 ); for ( i = 0; i < M / 2; i++ ) { - snsq[i] = *p_dico++; + snsq[i] = ( *p_dico++ ) * cdbk_fix2float + means[i] * means_fix2float; } - p_dico = &sns_vq_cdk2[( index >> 5 ) * ( M / 2 )]; + p_dico = &sns_1st_cdbk[1][core - 1][0] + ( index >> 5 ) * ( M / 2 ); for ( i = M / 2; i < M; i++ ) { - snsq[i] = *p_dico++; + snsq[i] = ( *p_dico++ ) * cdbk_fix2float + means[i] * means_fix2float; } return; @@ -107,43 +127,23 @@ static void sns_2st_dec( *-------------------------------------------------------------------*/ void sns_avq_dec( - int16_t *index, /* i : Quantization indices */ -#ifdef SNS_MSVQ + int16_t *index, /* i : Quantization indices */ float SNS_Q[NB_DIV][M], /* o : Quantized SNS vectors */ -#else - float *SNS_Q, /* o : Quantized SNS vectors */ -#endif + const int16_t L_frame, const int16_t numlpc /* i : Number of sets of lpc */ ) { int16_t i, nbi, last; int16_t q_type; -#ifdef SNS_MSVQ /* go from one-based indexing to zero-based indexing */ last = numlpc - 1; -#else - /* Last LPC index */ - if ( numlpc == 1 ) - { - last = 0; - } - else - { - last = M; - } -#endif index++; /* Decode last LPC */ -#ifdef SNS_MSVQ - sns_1st_dec( *index++, SNS_Q[last] ); + sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[last] ); sns_2st_dec( SNS_Q[last], index ); -#else - sns_1st_dec( *index++, &SNS_Q[last] ); - sns_2st_dec( &SNS_Q[last], index ); -#endif nbi = 2 + index[0] + index[1]; index += nbi; @@ -154,29 +154,16 @@ void sns_avq_dec( if ( q_type == 0 ) { -#ifdef SNS_MSVQ - sns_1st_dec( *index++, SNS_Q[0] ); + sns_1st_dec( *index++, numlpc, L_frame, SNS_Q[0] ); sns_2st_dec( SNS_Q[0], index ); -#else - sns_1st_dec( *index++, &SNS_Q[0] ); - sns_2st_dec( &SNS_Q[0], index ); -#endif } else if ( q_type == 1 ) { for ( i = 0; i < M; i++ ) { -#ifdef SNS_MSVQ SNS_Q[0][i] = SNS_Q[0][M + i]; -#else - SNS_Q[i] = SNS_Q[M + i]; -#endif } -#ifdef SNS_MSVQ sns_2st_dec( SNS_Q[0], index ); -#else - sns_2st_dec( &SNS_Q[0], index ); -#endif } } @@ -193,8 +180,9 @@ void sns_avq_dec( void sns_avq_dec_stereo( int16_t *indexl, /* i : Quantization indices (left channel) */ int16_t *indexr, /* i : Quantization indices (right channe) */ - float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ - float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ + const int16_t L_frame, + float *SNS_Ql, /* o : Quantized SNS vectors (left channel) */ + float *SNS_Qr /* o : Quantized SNS vectors (right channe) */ ) { int16_t i, stereo_mode; @@ -207,7 +195,7 @@ void sns_avq_dec_stereo( { /* MS coding */ - sns_1st_dec( *indexl++, mid_q ); + sns_1st_dec( *indexl++, TCX_20_CORE, L_frame, mid_q ); sns_2st_dec( mid_q, indexl ); for ( i = 0; i < M; i++ ) @@ -230,24 +218,22 @@ void sns_avq_dec_stereo( { /* LR decoding */ - sns_1st_dec( *indexl++, SNS_Ql ); + sns_1st_dec( *indexl++, TCX_20_CORE, L_frame, SNS_Ql ); sns_2st_dec( SNS_Ql, indexl ); - sns_1st_dec( *indexr++, SNS_Qr ); + sns_1st_dec( *indexr++, TCX_20_CORE, L_frame, SNS_Qr ); sns_2st_dec( SNS_Qr, indexr ); } return; } -#ifdef SNS_MSVQ void dequantize_sns( int16_t indices[CPE_CHANNELS][NPRM_LPC_NEW], float snsQ_out[CPE_CHANNELS][NB_DIV][M], Decoder_State **sts ) { int16_t nSubframes, k, ch; - const float *means; int16_t sns_stereo_mode[NB_DIV]; int16_t zero_side_flag[NB_DIV]; Decoder_State *st; @@ -282,22 +268,11 @@ void dequantize_sns( } nStages = SNS_MSVQ_NSTAGES_SIDE; - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_side_tcx20 : ivas_sns_means_side_tcx10; -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL ); -#else - msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], snsQ, NULL ); -#endif - - v_add( snsQ, means, snsQ, M ); } else { -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], 0, NULL, snsQ, NULL ); -#else - msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[ch][idxIndices + SNS_STEREO_MODE_OFFSET_INDICES], snsQ, NULL ); -#endif } idxIndices += nStages; } @@ -314,17 +289,4 @@ void dequantize_sns( } } } - - /* add means back */ - for ( ch = 0; ch < CPE_CHANNELS; ++ch ) - { - st = sts[ch]; - nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; - for ( k = 0; k < nSubframes; ++k ) - { - v_add( snsQ_out[ch][k], means, snsQ_out[ch][k], M ); - } - } } -#endif // SNS_MSVQ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c old mode 100644 new mode 100755 index 01e4db2ed4..0d028b2359 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -41,6 +41,7 @@ #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_rom_com.h" +#include "ivas_rom_dec.h" #include "ivas_stat_com.h" #include #include @@ -71,10 +72,13 @@ ivas_error ivas_spar_dec_open( IVAS_FB_CFG *fb_cfg; int16_t i, j, b, active_w_mixing; int32_t output_Fs; + int16_t num_decor_chs; error = IVAS_ERR_OK; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal ); + + num_channels_internal = ivas_sba_get_nchan_metadata( sba_order_internal, st_ivas->hDecoderConfig->ivas_total_brate ); + hSpar = st_ivas->hSpar; if ( !spar_reconfig_flag ) @@ -87,12 +91,31 @@ ivas_error ivas_spar_dec_open( } output_Fs = st_ivas->hDecoderConfig->output_Fs; + if ( num_channels_internal > ( SBA_HOA2_ORDER + 1 ) * ( SBA_HOA2_ORDER + 1 ) ) + { + num_decor_chs = IVAS_HBR_MAX_DECOR_CHS; + } + else + { + num_decor_chs = num_channels_internal - 1; + } /* TD decorr. */ - if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_channels_internal, 1 ) ) != IVAS_ERR_OK ) +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA ) ) ) { - return error; + hSpar->hTdDecorr = NULL; } + else + { +#endif + if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) + { + return error; + } +#ifdef FIX_163_SBA_TD_DECORR_OPT + } +#endif /* MD handle */ if ( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal, st_ivas->sid_format ) ) != IVAS_ERR_OK ) @@ -104,7 +127,13 @@ ivas_error ivas_spar_dec_open( /* set FB config. */ active_w_mixing = -1; - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs ) ) != IVAS_ERR_OK ) +#ifndef SBA_MODE_CLEAN_UP + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs, + 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs, + 0 ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -173,6 +202,51 @@ ivas_error ivas_spar_dec_open( ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); +#ifdef JBM_TSM_ON_TCS + set_s( hSpar->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( hSpar->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); + hSpar->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; + hSpar->subframes_rendered = 0; + hSpar->slots_rendered = 0; + hSpar->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; + + /* init render timeslot mapping */ + { + int16_t map_idx; + set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) + { + hSpar->render_to_md_map[map_idx] = map_idx; + } + } + + /* allocate transport channels*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate; + int16_t nchan_tc; + TC_BUFFER_MODE buffer_mode; + + buffer_mode = TC_BUFFER_MODE_RENDERER; + nchan_tc = ivas_jbm_dec_get_num_tc_channels( st_ivas ); + nchan_to_allocate = num_channels_internal; + if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) + { + buffer_mode = TC_BUFFER_MODE_BUFFER; + nchan_tc = st_ivas->hDecoderConfig->nchan_out; + nchan_to_allocate = nchan_tc; + } + else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) + { + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + } + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, buffer_mode, nchan_tc, nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + st_ivas->hSpar = hSpar; return error; @@ -252,6 +326,16 @@ ivas_error ivas_spar_dec( bit_stream_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; +#ifdef SBA_MODE_CLEAN_UP + /* read DirAC bitstream */ + if ( st_ivas->hQMetaData != NULL ) + { + ivas_dirac_dec_read_BS( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hQMetaData, nb_bits_read, + ivas_get_hodirac_flag( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), + st_ivas->hSpar->dirac_to_spar_md_bands ); + } +#endif + last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) { @@ -598,7 +682,7 @@ void ivas_spar_get_cldfb_gains( * determines if an FOA input channel is transmitted as residual channel. *---------------------------------------------------------------------*/ -/* !r: 1 if prediction residual channel */ +/*! r: 1 if prediction residual channel */ int16_t ivas_is_res_channel( const int16_t ch, /* i : ch index in WYZX ordering */ const int16_t nchan_transport /* i : number of transport channels (1-4) */ @@ -635,6 +719,7 @@ static void ivas_spar_dec_MD( { int16_t num_channels, table_idx, num_bands_out, bfi, sba_order; int32_t ivas_total_brate; + int16_t num_md_sub_frames; DECODER_CONFIG_HANDLE hDecoderConfig = st_ivas->hDecoderConfig; SPAR_DEC_HANDLE hSpar = st_ivas->hSpar; @@ -647,7 +732,11 @@ static void ivas_spar_dec_MD( sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); bfi = st_ivas->bfi; ivas_total_brate = st_ivas->hDecoderConfig->ivas_total_brate; - num_channels = ivas_sba_get_nchan_metadata( sba_order ); + num_channels = ivas_sba_get_nchan_metadata( sba_order, + ivas_total_brate ); + + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; if ( ivas_total_brate > FRAME_NO_DATA && !bfi ) @@ -668,8 +757,15 @@ static void ivas_spar_dec_MD( if ( hSpar->hMdDec->table_idx != table_idx ) { hSpar->hMdDec->table_idx = table_idx; - hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( hSpar->hTdDecorr ) + { +#endif + hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; +#ifdef FIX_163_SBA_TD_DECORR_OPT + } +#endif ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); } } @@ -706,7 +802,10 @@ static void ivas_spar_dec_MD( if ( st0->m_old_frame_type == ZERO_FRAME && ivas_total_brate == IVAS_SID_5k2 && st0->prev_bfi == 0 && hSpar->hMdDec->spar_md_cfg.nchan_transport == 1 ) { - ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out ); + ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out + + , + num_md_sub_frames ); } else { @@ -717,7 +816,8 @@ static void ivas_spar_dec_MD( { if ( !bfi ) { - ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out ); + ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out, + num_md_sub_frames ); } set_s( hSpar->hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); @@ -856,7 +956,8 @@ static void ivas_spar_get_skip_mat( const int16_t num_ch_out, const int16_t num_ch_in, const int16_t num_spar_bands, - int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ) + int16_t skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t num_md_sub_frames ) { int16_t spar_band, out_ch, in_ch; int16_t i_ts, skip_flag; @@ -867,12 +968,11 @@ static void ivas_spar_get_skip_mat( { skip_mat[out_ch][in_ch] = 1; skip_flag = 1; - for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) { for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { - if ( hSpar->hMdDec->mixer_mat_prev[1 + i_ts][out_ch][in_ch][spar_band] != 0.0f || hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band + i_ts * MAX_PARAM_SPATIAL_SUBFRAMES] != 0.0f ) + if ( hSpar->hMdDec->mixer_mat_prev[1 + i_ts][out_ch][in_ch][spar_band] != 0.0f ) { skip_flag = 0; break; @@ -885,9 +985,209 @@ static void ivas_spar_get_skip_mat( break; } } + if ( skip_mat[out_ch][in_ch] == 1 ) + { + for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + if ( hSpar->hMdDec->mixer_mat[out_ch][in_ch][spar_band + i_ts * MAX_PARAM_SPATIAL_SUBFRAMES] != 0.0f ) + { + skip_flag = 0; + break; + } + } + + if ( skip_flag == 0 ) + { + skip_mat[out_ch][in_ch] = 0; + break; + } + } + } + } + } + + return; +} + + +static void ivas_spar_calc_smooth_facs( + float *cldfb_in_ts_re[CLDFB_NO_COL_MAX], + float *cldfb_in_ts_im[CLDFB_NO_COL_MAX], + int16_t nbands_spar, + ivas_fb_bin_to_band_data_t *bin2band, + float *smooth_fac, + float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1] ) +{ + int16_t b, bin, i, ts; + float subframe_band_nrg[IVAS_MAX_NUM_BANDS]; + float smooth_long_avg[IVAS_MAX_NUM_BANDS]; + float smooth_short_avg[IVAS_MAX_NUM_BANDS]; + + bin = 0; + for ( b = 0; b < nbands_spar; b++ ) + { + if ( b > 0 && bin2band->p_cldfb_map_to_spar_band[bin] < bin2band->p_cldfb_map_to_spar_band[bin - 1] ) + { + break; + } + /* calculate band-wise subframe energies */ + subframe_band_nrg[b] = 0.f; + while ( b == bin2band->p_cldfb_map_to_spar_band[bin] ) + { + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + { + subframe_band_nrg[b] += cldfb_in_ts_re[ts][bin] * cldfb_in_ts_re[ts][bin] + cldfb_in_ts_im[ts][bin] * cldfb_in_ts_im[ts][bin]; + } + bin++; + } + subframe_band_nrg[b] = sqrtf( subframe_band_nrg[b] ); + smooth_buf[b][0] = subframe_band_nrg[b]; + + /* calculate short and long energy averages */ + smooth_short_avg[b] = EPSILON; + for ( i = 0; i < 2 * SBA_DIRAC_NRG_SMOOTH_SHORT; i++ ) + { + smooth_short_avg[b] += smooth_buf[b][i]; + } + + smooth_long_avg[b] = smooth_short_avg[b]; + for ( i = 2 * SBA_DIRAC_NRG_SMOOTH_SHORT; i < 2 * SBA_DIRAC_NRG_SMOOTH_LONG; i++ ) + { + smooth_long_avg[b] += smooth_buf[b][i]; + } + smooth_short_avg[b] /= ( 2 * SBA_DIRAC_NRG_SMOOTH_SHORT ); + smooth_long_avg[b] /= ( 2 * SBA_DIRAC_NRG_SMOOTH_LONG ); + + /* calculate smoothing factor based on energy averages */ + /* reduce factor for higher short-term energy */ + smooth_fac[b] = min( 1.f, smooth_long_avg[b] / smooth_short_avg[b] ); + /* map factor to range [0;1] */ + smooth_fac[b] = max( 0.f, smooth_fac[b] - (float) SBA_DIRAC_NRG_SMOOTH_SHORT / SBA_DIRAC_NRG_SMOOTH_LONG ) * ( (float) SBA_DIRAC_NRG_SMOOTH_LONG / ( SBA_DIRAC_NRG_SMOOTH_LONG - SBA_DIRAC_NRG_SMOOTH_SHORT ) ); + /* compress factor (higher compression in lowest bands) */ + if ( b < 2 ) + { + smooth_fac[b] = powf( smooth_fac[b], 0.25f ); + } + else + { + smooth_fac[b] = powf( smooth_fac[b], 0.5f ); + } + + /* apply upper bounds depending on band */ + smooth_fac[b] = max( min_smooth_gains1[b], min( max_smooth_gains2[b], smooth_fac[b] ) ); + } + + for ( b = 0; b < nbands_spar; b++ ) + { + for ( i = 2 * SBA_DIRAC_NRG_SMOOTH_LONG; i > 0; i-- ) + { + smooth_buf[b][i] = smooth_buf[b][i - 1]; + } + } + + return; +} + + +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_spar_dec_agc_pca() + * + * + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_agc_pca( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output[][L_FRAME48k], /* i/o: input/output audio channels */ + const int16_t output_frame /* i : output frame length */ +) +{ + int16_t nchan_transport; + int16_t num_in_ingest; + DECODER_CONFIG_HANDLE hDecoderConfig; + SPAR_DEC_HANDLE hSpar; + + push_wmops( "ivas_spar_dec_agc_pca" ); + + hSpar = st_ivas->hSpar; + hDecoderConfig = st_ivas->hDecoderConfig; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + + if ( st_ivas->nchan_transport >= 3 ) + { + float temp; + int16_t i; + /*convert WYZX downmix to WYXZ*/ + for ( i = 0; i < output_frame; i++ ) + { + temp = output[2][i]; + output[2][i] = output[3][i]; + output[3][i] = temp; } } + if ( hSpar->hMdDec->td_decorr_flag ) + { + num_in_ingest = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); + } + else + { + num_in_ingest = nchan_transport; + } + + /*---------------------------------------------------------------------* + * AGC + *---------------------------------------------------------------------*/ + + ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame ); +#ifdef DEBUG_SBA_AUDIO_DUMP + /* Dump audio signal after ivas_agc_dec_process */ + ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" ); +#endif + + if ( hSpar->hPCA != NULL ) + { + ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); +#ifdef DEBUG_SBA_AUDIO_DUMP + /* Dump audio signal after ivas_pca_dec */ + ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" ); +#endif + } + pop_wmops(); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_set_render_map() + * + * + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_set_render_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const int16_t nCldfbTs /* i : number of CLDFB time slots */ +) +{ + SPAR_DEC_HANDLE hSpar; + + hSpar = st_ivas->hSpar; +#ifdef DEBUGGING + assert( hSpar ); +#endif + + /* adapt subframes */ + hSpar->num_slots = nCldfbTs; + hSpar->slots_rendered = 0; + hSpar->subframes_rendered = 0; + set_s( hSpar->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hSpar->subframe_nbslots, &hSpar->nb_subframes ); + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, 1, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hSpar->render_to_md_map ); + return; } @@ -898,38 +1198,302 @@ static void ivas_spar_get_skip_mat( * IVAS SPAR upmixer *-------------------------------------------------------------------*/ +void ivas_spar_dec_set_render_params( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t n_cldfb_slots /* i : number of cldfb slots in this frame */ +) +{ + SPAR_DEC_HANDLE hSpar; + int16_t nchan_transport; + int16_t num_bands_out; + + hSpar = st_ivas->hSpar; + + /*---------------------------------------------------------------------* + * Gen umx mat + *---------------------------------------------------------------------*/ + + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi, + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); + + ivas_spar_dec_set_render_map( st_ivas, n_cldfb_slots ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_digest_tc() + * + * + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_digest_tc( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nCldfbSlots, /* i : number of CLDFB slots */ + const int16_t nSamplesForRendering /* i : number of samples provided */ +) +{ + SPAR_DEC_HANDLE hSpar; + + hSpar = st_ivas->hSpar; + if ( hSpar->hMdDec->td_decorr_flag && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) + { + float Pcm_tmp[MAX_SPAR_INTERNAL_CHANNELS][L_FRAME48k]; + float *pPcm_tmp[MAX_SPAR_INTERNAL_CHANNELS]; + float *p_tc[MAX_SPAR_INTERNAL_CHANNELS]; + int16_t nchan_internal, ch; + int16_t nSamplesLeftForTD, default_frame; + + /* TD decorrelator */ + default_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + nSamplesLeftForTD = nSamplesForRendering; + nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, + st_ivas->hDecoderConfig->ivas_total_brate ); + + for ( ch = 0; ch < nchan_internal; ch++ ) + { + pPcm_tmp[ch] = Pcm_tmp[ch]; + p_tc[ch] = st_ivas->hTcBuffer->tc[ch]; + } + + while ( nSamplesLeftForTD ) + { + int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); + +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( hSpar->hTdDecorr ) + { +#endif + ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) + { + for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } + } + else + { + for ( ch = 0; ch < nchan_internal - nchan_transport; ch++ ) + { + set_zero( p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } + for ( ch = 0; ch < hSpar->hTdDecorr->num_apd_outputs; ch++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); + } + } +#ifdef FIX_163_SBA_TD_DECORR_OPT + } +#endif + for ( ch = 0; ch < nchan_internal; ch++ ) + { + p_tc[ch] += nSamplesToDecorr; + } + + nSamplesLeftForTD -= nSamplesToDecorr; + } + } + + ivas_spar_dec_set_render_params( st_ivas, nCldfbSlots ); + + return; +} + + +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer() + * + * + *-------------------------------------------------------------------*/ + void ivas_spar_dec_upmixer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output[][L_FRAME48k], /* i/o: input/output audio channels */ const int16_t nchan_internal, /* i : number of internal channels */ const int16_t output_frame /* i : output frame length */ ) +{ + SPAR_DEC_HANDLE hSpar; + int16_t nchan_transport, nchan_out; + int16_t subframe_idx, n, i; + int16_t n_samples_sf; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + float *pPcm_tmp[MAX_OUTPUT_CHANNELS]; + + hSpar = st_ivas->hSpar; + nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; + nchan_out = st_ivas->hIntSetup.nchan_out_woLFE + st_ivas->hIntSetup.num_lfe; + n_samples_sf = JBM_CLDFB_SLOTS_IN_SUBFRAME * NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) + { + output_f_local[n] = &output[n][0]; + } + + for ( n = 0; n < nchan_internal; n++ ) + { + st_ivas->hTcBuffer->tc[n] = output[n]; + } + + /*---------------------------------------------------------------------* + * TD decorrelation + *---------------------------------------------------------------------*/ + + for ( i = 0; i < nchan_internal; i++ ) + { + pPcm_tmp[i] = Pcm_tmp[i]; + } + + if ( hSpar->hMdDec->td_decorr_flag ) + { +#ifdef FIX_163_SBA_TD_DECORR_OPT + if ( hSpar->hTdDecorr ) + { +#endif + ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } + } + else + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + set_zero( st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } + for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); + } + } +#ifdef FIX_163_SBA_TD_DECORR_OPT + } +#endif + } + + ivas_spar_dec_set_render_params( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + + if ( st_ivas->hDirAC != 0 ) + { + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + } + + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + ivas_spar_dec_upmixer_sf( st_ivas, output_f_local, nchan_internal ); + for ( n = 0; n < nchan_out; n++ ) + { + output_f_local[n] += n_samples_sf; + } + } + + for ( n = 0; n < nchan_internal; n++ ) + { + st_ivas->hTcBuffer->tc[n] = NULL; + } + + if ( st_ivas->hDirAC != 0 ) + { + if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + else + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + } + + return; +} +#endif + + +#ifdef JBM_TSM_ON_TCS +/*-------------------------------------------------------------------* + * ivas_spar_dec_upmixer_sf() + * + * IVAS SPAR upmixer + *-------------------------------------------------------------------*/ + +void ivas_spar_dec_upmixer_sf( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float *output[], /* o : output audio channels */ + const int16_t nchan_internal /* i : number of internal channels */ +) +#else +void ivas_spar_dec_upmixer( + + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output[][L_FRAME48k], /* i/o: input/output audio channels */ + const int16_t nchan_internal, /* i : number of internal channels */ + const int16_t output_frame /* i : output frame length */ +) +#endif { int16_t cldfb_band, num_cldfb_bands, numch_in, numch_out; float *cldfb_in_ts_re[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX]; float *cldfb_in_ts_im[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX]; int16_t i, b, ts, out_ch, in_ch; int16_t num_spar_bands, spar_band, nchan_transport; - int16_t num_in_ingest, num_bands_out, split_band; + int16_t num_in_ingest, split_band; +#ifdef JBM_TSM_ON_TCS + int16_t slot_size, slot_idx_start; + float *p_tc[MAX_OUTPUT_CHANNELS]; + int16_t md_idx; +#endif float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; int16_t numch_out_dirac; +#ifndef JBM_TSM_ON_TCS float *pPcm_tmp[MAX_OUTPUT_CHANNELS]; + int16_t num_bands_out; +#endif float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; DECODER_CONFIG_HANDLE hDecoderConfig; SPAR_DEC_HANDLE hSpar; + int16_t num_md_sub_frames; +#ifndef JBM_TSM_ON_TCS + int16_t md_sf_idx; +#endif +#ifdef JBM_TSM_ON_TCS + push_wmops( "ivas_spar_dec_upmixer_sf" ); +#else push_wmops( "ivas_spar_dec_upmixer" ); +#endif hSpar = st_ivas->hSpar; hDecoderConfig = st_ivas->hDecoderConfig; +#ifndef JBM_TSM_ON_TCS num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; +#endif nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate ); + +#ifdef JBM_TSM_ON_TCS + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + slot_idx_start = hSpar->slots_rendered; + for ( i = 0; i < nchan_internal; i++ ) + { + p_tc[i] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size; + } +#endif + #ifdef DEBUG_SPAR_BYPASS_EVS_CODEC /* by-pass core-coder */ /*write the core coder output to a file for debugging*/ @@ -967,17 +1531,19 @@ void ivas_spar_dec_upmixer( } #endif +#ifndef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * AGC *---------------------------------------------------------------------*/ ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame ); + #ifdef DEBUG_SBA_AUDIO_DUMP /* Dump audio signal after ivas_agc_dec_process */ ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" ); #endif - +#endif /*---------------------------------------------------------------------* * TD Decorr and pcm ingest *---------------------------------------------------------------------*/ @@ -991,11 +1557,12 @@ void ivas_spar_dec_upmixer( num_in_ingest = nchan_transport; } +#ifndef JBM_TSM_ON_TCS for ( i = 0; i < nchan_internal; i++ ) { pPcm_tmp[i] = Pcm_tmp[i]; } - +#endif /*---------------------------------------------------------------------* * PCA decoder *---------------------------------------------------------------------*/ @@ -1003,6 +1570,7 @@ void ivas_spar_dec_upmixer( hSpar->pca_ingest_channels = num_in_ingest; #endif +#ifndef JBM_TSM_ON_TCS /* will already happen in the TC decoding */ if ( hSpar->hPCA != NULL ) { ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); @@ -1011,22 +1579,37 @@ void ivas_spar_dec_upmixer( ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" ); #endif } +#endif - +#ifndef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * TD decorrelation *---------------------------------------------------------------------*/ if ( hSpar->hMdDec->td_decorr_flag ) { - ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); + if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); + } + } + else + { + for ( i = 0; i < nchan_internal - nchan_transport; i++ ) + { + set_zero( output[nchan_internal - 1 - i], output_frame ); + } + for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) + { + mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); + } } } - +#endif hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; @@ -1059,12 +1642,14 @@ void ivas_spar_dec_upmixer( } } +#ifndef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * Gen umx mat *---------------------------------------------------------------------*/ - ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi ); - + ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi, + num_md_sub_frames ); +#endif /*---------------------------------------------------------------------* * CLDFB Processing and Synthesis @@ -1074,19 +1659,39 @@ void ivas_spar_dec_upmixer( /* apply parameters */ /* determine if we can skip certain data */ - ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat ); /* this can be precomputed based on bitrate and format*/ + ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat, + num_md_sub_frames ); /* this can be precomputed based on bitrate and format*/ numch_out_dirac = hDecoderConfig->nchan_out; +#ifdef DEBUG_SBA_AUDIO_DUMP + /* Dump audio signal after ivas_agc_dec_process */ +#ifdef JBM_TSM_ON_TCS + ivas_spar_dump_signal_wav( output_frame, p_tc, NULL, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" ); +#else + ivas_spar_dump_signal_wav( output_frame, NULL, output, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" ); +#endif +#endif + +#ifndef JBM_TSM_ON_TCS for ( int16_t i_sf = 0; i_sf < MAX_PARAM_SPATIAL_SUBFRAMES; i_sf++ ) { +#endif /* CLDFB analysis of incoming frame */ for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#endif { cldfbAnalysis_ts( - &output[in_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#ifdef JBM_TSM_ON_TCS + &p_tc[in_ch][ts * num_cldfb_bands], +#else + &output[in_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#endif cldfb_in_ts_re[in_ch][ts], cldfb_in_ts_im[in_ch][ts], num_cldfb_bands, @@ -1094,10 +1699,38 @@ void ivas_spar_dec_upmixer( } } - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) ) { - /* determine SPAR parameters for this time slots */ - ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES, numch_out, numch_in, num_spar_bands, mixer_mat ); + ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf ); + } + +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#endif + { +#ifdef JBM_TSM_ON_TCS + md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; + ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); +#else + /* determine SPAR parameters for this time slots */ + ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES, numch_out, numch_in, num_spar_bands, mixer_mat ); +#endif + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) ) + { + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; + hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band] = mixer_mat[out_ch][in_ch][spar_band]; + } + } + } + } for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) { @@ -1113,27 +1746,26 @@ void ivas_spar_dec_upmixer( for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - if ( b_skip_mat[out_ch][in_ch] ) - { - continue; - } - else if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ - { - spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; - cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; - } - else + if ( b_skip_mat[out_ch][in_ch] == 0 ) { - cldfb_par = 0.0f; - for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) + if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ { - /* accumulate contributions from all SPAR bands */ - cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; + spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; + cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; + } + else + { + cldfb_par = 0.0f; + for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) + { + /* accumulate contributions from all SPAR bands */ + cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; + } } - } - out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; - out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; + out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; + out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; + } } } @@ -1144,11 +1776,45 @@ void ivas_spar_dec_upmixer( cldfb_in_ts_im[out_ch][ts][cldfb_band] = out_im[out_ch]; } } + +#ifdef JBM_TSM_ON_TCS + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + { + /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ + int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + split_band = SPAR_DIRAC_SPLIT_START_BAND; + md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0; + if ( split_band < IVAS_MAX_NUM_BANDS ) + { + mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( b = 0; b < num_spar_bands; b++ ) + { + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; + } + } + } + hSpar->i_subframe++; + hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + } + } +#endif } if ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA && hDecoderConfig->output_config != AUDIO_CONFIG_STEREO && hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) { - ivas_dirac_dec( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im, i_sf ); +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec_render_sf( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); +#else + ivas_dirac_dec( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im, i_sf ); +#endif } if ( st_ivas->hDirAC != NULL ) @@ -1162,8 +1828,11 @@ void ivas_spar_dec_upmixer( { if ( ( st_ivas->hOutSetup.num_lfe > 0 ) && ( st_ivas->hOutSetup.index_lfe[idx_lfe] == ch ) ) { - set_zero( &( output[ch][i_sf * MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands] ), MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands ); - +#ifdef JBM_TSM_ON_TCS + set_zero( output[ch], hSpar->subframe_nbslots[hSpar->subframes_rendered] * num_cldfb_bands ); +#else + set_zero( &( output[ch][i_sf * MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands] ), MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands ); +#endif if ( idx_lfe < ( st_ivas->hDirAC->hOutSetup.num_lfe - 1 ) ) { idx_lfe++; @@ -1173,12 +1842,20 @@ void ivas_spar_dec_upmixer( { if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#endif { cldfbSynthesis( &cldfb_in_ts_re[idx_in][ts], &cldfb_in_ts_im[idx_in][ts], - &output[ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#ifdef JBM_TSM_ON_TCS + &output[ch][ts * num_cldfb_bands], +#else + &output[ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#endif num_cldfb_bands, st_ivas->cldfbSynDec[idx_in] ); } @@ -1195,12 +1872,20 @@ void ivas_spar_dec_upmixer( /* CLDFB to time synthesis (overwrite mixer output) */ for ( out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) { - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) +#endif { cldfbSynthesis( &cldfb_in_ts_re[out_ch][ts], &cldfb_in_ts_im[out_ch][ts], - &output[out_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#ifdef JBM_TSM_ON_TCS + &output[out_ch][ts * num_cldfb_bands], +#else + &output[out_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], +#endif num_cldfb_bands, st_ivas->cldfbSynDec[out_ch] ); } @@ -1214,6 +1899,9 @@ void ivas_spar_dec_upmixer( ivas_spar_dump_signal_wav( output_frame, NULL, output, hSpar->numOutChannels, spar_foa_dec_wav[3], "cldfbSynthesis()" ); #endif + +#ifndef JBM_TSM_ON_TCS + md_sf_idx = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; split_band = SPAR_DIRAC_SPLIT_START_BAND; if ( split_band < IVAS_MAX_NUM_BANDS ) { @@ -1230,12 +1918,20 @@ void ivas_spar_dec_upmixer( { for ( b = 0; b < num_spar_bands; b++ ) { - hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + i_sf * IVAS_MAX_NUM_BANDS]; + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf_idx * IVAS_MAX_NUM_BANDS]; } } } } +#endif +#ifndef JBM_TSM_ON_TCS } +#endif + +#ifdef JBM_TSM_ON_TCS + hSpar->slots_rendered += hSpar->subframe_nbslots[hSpar->subframes_rendered]; + hSpar->subframes_rendered++; +#endif pop_wmops(); diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c old mode 100644 new mode 100755 index 3b47d6500e..cf03e7b9d8 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -43,7 +43,6 @@ #include "wmc_auto.h" #include "ivas_stat_dec.h" -/*#define ENABLE_DITHER */ /* IVAS_fmToDo: development switch */ /*------------------------------------------------------------------------------------------* * Local constants @@ -63,9 +62,9 @@ static const int16_t ivas_spar_dec_plc_spatial_target[IVAS_SPAR_MAX_CH] = { 1, 0 * Static functions declaration *------------------------------------------------------------------------------------------*/ -static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t sba_order ); +static void ivas_get_spar_matrices( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, const int16_t n_ts, const int16_t bw, const int16_t dtx_vad, const int16_t nB, const int16_t numch_out, const int16_t active_w_vlbr ); -static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP ); +static void ivas_decode_arith_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); static void ivas_decode_huffman_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, const uint16_t qsi, const int16_t nB, const int16_t bands_bw, const int16_t planarCP ); @@ -75,9 +74,9 @@ static void ivas_get_band_idx_from_differential( ivas_spar_md_t *pSpar_md, const static void ivas_mat_col_rearrange( float in_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t order[IVAS_SPAR_MAX_CH], const int16_t i_ts, float ***mixer_mat, const int16_t bands, const int16_t num_ch ); -static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi ); +static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands, const int16_t bfi, const int16_t num_md_sub_frames ); -static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t sba_order ); +static void ivas_spar_md_fill_invalid_bands( ivas_spar_dec_matrices_t *pSpar_coeffs, ivas_spar_dec_matrices_t *pSpar_coeffs_prev, const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, const int16_t numch_out, const int16_t num_md_sub_frames ); static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, const int16_t nchan_transport, float *pFC ); @@ -97,11 +96,12 @@ static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder static ivas_error ivas_spar_md_dec_matrix_open( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_channels /* i : number of internal channels */ -) + , + const int16_t num_md_sub_frames ) { int16_t i, j; - if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * MAX_PARAM_SPATIAL_SUBFRAMES * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) + if ( ( hMdDec->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * num_md_sub_frames * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for band_coeffs in SPAR MD" ); } @@ -117,7 +117,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->mixer_mat[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -136,7 +136,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs.C_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -155,7 +155,7 @@ static ivas_error ivas_spar_md_dec_matrix_open( } for ( j = 0; j < num_channels; j++ ) { - if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( MAX_PARAM_SPATIAL_SUBFRAMES * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + if ( ( hMdDec->spar_coeffs.P_re[i][j] = (float *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); } @@ -241,6 +241,21 @@ static ivas_error ivas_spar_md_dec_matrix_open( return IVAS_ERR_OK; } +int16_t ivas_get_spar_dec_md_num_subframes( + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate ) +{ + int16_t num_subframes; + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( sba_order > SBA_FOA_ORDER ) + { + if ( ivas_total_brate >= IVAS_512k ) + { + num_subframes = 1; + } + } + return ( num_subframes ); +} /*------------------------------------------------------------------------- * ivas_spar_md_dec_open() @@ -258,6 +273,7 @@ ivas_error ivas_spar_md_dec_open( { ivas_spar_md_dec_state_t *hMdDec; ivas_error error; + int16_t num_md_sub_frames; error = IVAS_ERR_OK; @@ -266,7 +282,9 @@ ivas_error ivas_spar_md_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD decoder" ); } - if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels ) ) != IVAS_ERR_OK ) + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, hDecoderConfig->ivas_total_brate ); + if ( ( error = ivas_spar_md_dec_matrix_open( hMdDec, num_channels, + num_md_sub_frames ) ) != IVAS_ERR_OK ) { return error; } @@ -443,10 +461,18 @@ ivas_error ivas_spar_md_dec_init( int16_t nchan_transport; float pFC[IVAS_MAX_NUM_BANDS], PR_minmax[2]; - hMdDec->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate ); - hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + ivas_sba_get_spar_hoa_md_flag( sba_order, hDecoderConfig->ivas_total_brate, &hMdDec->spar_hoa_md_flag, &hMdDec->spar_hoa_dirac2spar_md_flag ); - ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands ); + ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); + + hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands +#ifdef ARITH_HUFF_CODER_CHANGES + , + hMdDec->spar_hoa_dirac2spar_md_flag, + 0, 0, 0 +#endif + ); nchan_transport = hMdDec->spar_md_cfg.nchan_transport; @@ -536,6 +562,19 @@ ivas_error ivas_spar_md_dec_init( set_f( hMdDec->spar_md.en_ratio_slow, 0.0f, IVAS_MAX_NUM_BANDS ); set_f( hMdDec->spar_md.ref_pow_slow, 0.0f, IVAS_MAX_NUM_BANDS ); + set_zero( hMdDec->smooth_fac, IVAS_MAX_NUM_BANDS ); + for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) + { + set_zero( hMdDec->smooth_buf[i], 2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1 ); + } + for ( i = 0; i < IVAS_SPAR_MAX_CH; i++ ) + { + for ( j = 0; j < IVAS_SPAR_MAX_CH; j++ ) + { + set_zero( hMdDec->mixer_mat_prev2[i][j], IVAS_MAX_NUM_BANDS ); + } + } + return IVAS_ERR_OK; } @@ -558,17 +597,18 @@ static ivas_error ivas_spar_set_dec_config( hMdDec->spar_md_cfg.max_freq_per_chan[i] = ivas_spar_br_table_consts[hMdDec->table_idx].fpcs; } - nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order ); + nchan = ivas_sba_get_nchan_metadata( ivas_spar_br_table_consts[hMdDec->table_idx].sba_order, + ivas_spar_br_table_consts[hMdDec->table_idx].ivas_total_brate ); switch ( nchan ) { case 4: /* FOA_CHANNELS */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_3CH; break; - case 9: /* IVAS_HOA_2_CH */ // VE: is this relevant? + case 9: /* IVAS_HOA_2_CH */ hMdDec->num_decorr = IVAS_TD_DECORR_OUT_5CH; break; - case 16: /* IVAS_HOA_3_CH */ // VE: is this relevant? + case 16: /* IVAS_HOA_3_CH */ // ToDo: is this relevant? hMdDec->num_decorr = IVAS_TD_DECORR_OUT_12CH; break; case 6: /* IVAS_HOA_2_CH */ @@ -618,9 +658,18 @@ void ivas_spar_md_dec_process( { int16_t j, k, b, bw, dtx_vad, nB, i_ts; ivas_spar_md_dec_state_t *hMdDec; + int16_t num_md_chs; + int16_t num_md_sub_frames; hMdDec = st_ivas->hSpar->hMdDec; + int16_t active_w_vlbr; + active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; + + num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); + + ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode ); @@ -629,7 +678,10 @@ void ivas_spar_md_dec_process( char f_name[100]; int16_t num_bands = nB; int16_t num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( float ); - int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order ); + int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order + , + st_ivas->hDecoderConfig->ivas_total_brate + ); for ( b = 0; b < num_bands; b++ ) { sprintf( f_name, "spar_band_pred_coeffs_dec.bin" ); @@ -671,9 +723,101 @@ void ivas_spar_md_dec_process( } } #endif +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR HOA Coefficients */ + /*char f_name[100]; + int16_t nbands = 12; + int16_t num_subframes = 1; + int16_t num_elements = 7; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values_dec_PR.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[3], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[4], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[5], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[6], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } + nbands = 12; // 6 total, just looking at SPAR + num_subframes = 1; + num_elements = 12; + num_block_group = 1; + byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values_dec_C.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + for ( int16_t p = 0; p < 4; p++ ) + { + for ( int16_t r = 0; r < 3; r++ ) + { + dbgwrite( &hMdDec->spar_md.band_coeffs[b].C_re[p][r], byte_size, 1, 1, f_name ); + } + } + } + } + } + nbands = 12; // 6 total, just looking at SPAR + num_subframes = 1; + num_elements = 4; + num_block_group = 1; + byte_size = sizeof( float ); + sprintf( f_name, "SBA_MD_values_dec_P.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[3], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + }*/ +#endif /* SPAR to DirAC conversion */ - ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out ); + if ( hMdDec->spar_hoa_dirac2spar_md_flag == 1 ) + { + ivas_spar_to_dirac( st_ivas, hMdDec, dtx_vad, num_bands_out, bw ); + } /* set correct number of bands*/ nB = IVAS_MAX_NUM_BANDS; @@ -681,9 +825,131 @@ void ivas_spar_md_dec_process( { nB = nB >> 1; } +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR Coefficients */ + char f_name[100]; + int16_t nbands = 4; // 6 total, just looking at SPAR + int16_t num_subframes = 1; + int16_t num_elements = 6; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values_dec.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR HOA Coefficients */ + /*char f_name[100]; + int16_t nbands = 12; + int16_t num_subframes = 1; + int16_t num_elements = 7; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values_dec_PR.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[3], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[4], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[5], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].pred_re[6], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } + nbands = 12; // 6 total, just looking at SPAR + num_subframes = 1; + num_elements = 12; + num_block_group = 1; + byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values_dec_C.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + for ( int16_t p = 0; p < 4; p++ ) + { + for ( int16_t r = 0; r < 3; r++ ) + { + dbgwrite( &hMdDec->spar_md.band_coeffs[b].C_re[p][r], byte_size, 1, 1, f_name ); + } + } + } + } + } + nbands = 12; // 6 total, just looking at SPAR + num_subframes = 1; + num_elements = 4; + num_block_group = 1; + byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values_dec_P.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &hMdDec->spar_md.band_coeffs[b].P_re[3], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + }*/ +#endif /* expand DirAC MD to all time slots */ - for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) { for ( b = 0; b < hMdDec->spar_md.num_bands; b++ ) { @@ -707,7 +973,11 @@ void ivas_spar_md_dec_process( } } - ivas_get_spar_matrices( hMdDec, num_bands_out, MAX_PARAM_SPATIAL_SUBFRAMES, bw, dtx_vad, nB, sba_order ); + ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, + num_md_chs, + active_w_vlbr + + ); #ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS { @@ -720,13 +990,18 @@ void ivas_spar_md_dec_process( fprintf( fid, "%.6f\n", hMdDec->mixer_mat[1][0][band] ); } #endif - + if ( bw == IVAS_RED_BAND_FACT ) + { + nB = nB << 1; + } for ( b = nB; b < num_bands_out; b++ ) { hMdDec->valid_bands[b] = 1; } - ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, sba_order ); + ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, + num_md_chs, + num_md_sub_frames ); hMdDec->dtx_md_smoothing_cntr = 1; @@ -746,6 +1021,8 @@ void ivas_spar_md_dec_process( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ + , + const int16_t num_md_sub_frames /* i : number of metadata subframes */ ) { int16_t j, k, b, dmx_ch; @@ -781,7 +1058,7 @@ void ivas_spar_smooth_md_dtx( } /* expand MD to all time slots */ - for ( int16_t i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + for ( int16_t i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) { for ( b = 0; b < num_bands_out; b++ ) { @@ -821,6 +1098,8 @@ void ivas_spar_smooth_md_dtx( void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t num_bands_out /* i : number of output bands */ + , + const int16_t num_md_sub_frames /* i : number of metadata subframes */ ) { /* copy the coeffs */ @@ -872,7 +1151,8 @@ void ivas_spar_setup_md_smoothing( } } - ivas_spar_smooth_md_dtx( hMdDec, num_bands_out ); + ivas_spar_smooth_md_dtx( hMdDec, num_bands_out, + num_md_sub_frames ); return; } @@ -952,14 +1232,14 @@ static void ivas_get_spar_matrices( const int16_t bw, const int16_t dtx_vad, const int16_t nB, - const int16_t sba_order ) + const int16_t numch_out, + const int16_t active_w_vlbr ) { - int16_t numch_out, num_bands, dmx_ch, split_band; + int16_t num_bands, dmx_ch, split_band; int16_t i, j, k, m, b, i_ts, active_w; const int16_t *order; float active_w_dm_fac, re; - numch_out = ivas_sba_get_nchan_metadata( sba_order ); num_bands = num_bands_out; order = remix_order_set[hMdDec->spar_md_cfg.remix_unmix_order]; @@ -994,10 +1274,12 @@ static void ivas_get_spar_matrices( } }*/ #endif - + if ( bw == IVAS_RED_BAND_FACT ) + { + num_bands = num_bands >> 1; + } active_w = hMdDec->spar_md_cfg.active_w; - active_w_dm_fac = ( dtx_vad == 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX : IVAS_ACTIVEW_DM_F_SCALE; - + active_w_dm_fac = ( dtx_vad == 0 ) ? IVAS_ACTIVEW_DM_F_SCALE_DTX : ( ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE ); for ( i_ts = 0; i_ts < n_ts; i_ts++ ) { for ( i = 0; i < numch_out; i++ ) @@ -1008,12 +1290,6 @@ static void ivas_get_spar_matrices( set_zero( &hMdDec->spar_coeffs.P_re[i][j][i_ts * IVAS_MAX_NUM_BANDS], IVAS_MAX_NUM_BANDS ); } } - - if ( bw == IVAS_RED_BAND_FACT ) - { - num_bands = num_bands >> 1; - } - num_bands = min( num_bands, nB ); for ( b = 0; b < num_bands; b++ ) @@ -1342,13 +1618,14 @@ void ivas_spar_dec_gen_umx_mat( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ const int16_t bfi /* i : bad frame indicator */ -) + , + const int16_t num_md_sub_frames ) { int16_t i, j, b, i_ts, num_out_ch; num_out_ch = hMdDec->spar_md_cfg.num_umx_chs; - for ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + for ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) { if ( hMdDec->td_decorr_flag == 1 ) { @@ -1409,7 +1686,8 @@ void ivas_spar_dec_gen_umx_mat( #endif } - ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi ); + ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi, + num_md_sub_frames ); return; } @@ -1439,6 +1717,7 @@ static void ivas_spar_dec_parse_md_bs( int16_t do_diff[IVAS_MAX_NUM_BANDS]; int16_t planarCP; float quant[IVAS_SPAR_MAX_C_COEFF]; + int16_t do_repeat[IVAS_MAX_NUM_BANDS]; *dtx_vad = 1; *bands_bw = 1; @@ -1561,6 +1840,7 @@ static void ivas_spar_dec_parse_md_bs( for ( i = 0; i < *nB; i++ ) { do_diff[i] = 0; + do_repeat[i] = 0; } } else if ( strat < 4 ) @@ -1570,9 +1850,21 @@ static void ivas_spar_dec_parse_md_bs( for ( i = 0; i < *nB; i++ ) { do_diff[i] = 0; + do_repeat[i] = 0; } no_ec = 1; } + else if ( ivas_total_brate < IVAS_24k4 ) + { + *bands_bw = 2; + *nB = num_bands / *bands_bw; + + for ( i = 0; i < *nB; i++ ) + { + do_diff[i] = 0; + do_repeat[i] = ( ( strat % 2 ) == ( ( i + 1 ) % 2 ) ); + } + } else { *bands_bw = 1; @@ -1581,6 +1873,7 @@ static void ivas_spar_dec_parse_md_bs( for ( i = 0; i < *nB; i++ ) { do_diff[i] = ( ( ( i + 1 ) & 3 ) != strat - 4 ); + do_repeat[i] = 0; } ivas_map_prior_coeffs_quant( &hMdDec->spar_md_prev, &hMdDec->spar_md_cfg, qsi, *nB ); @@ -1592,7 +1885,8 @@ static void ivas_spar_dec_parse_md_bs( if ( no_ec == 0 ) { - ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, freq_diff, planarCP ); + ivas_decode_arith_bs( hMdDec, st0, qsi, *nB, *bands_bw, do_diff, freq_diff, planarCP, + strat, ivas_total_brate ); } else { @@ -1643,9 +1937,12 @@ static void ivas_spar_dec_parse_md_bs( { hMdDec->spar_md_prev.band_coeffs_idx[i].decd_index_re[j] = hMdDec->spar_md.band_coeffs_idx[i].decd_index_re[j]; } - hMdDec->valid_bands[i] |= ( do_diff[i] == 0 ) ? 1 : 0; + hMdDec->valid_bands[*bands_bw * i] |= ( do_diff[i] == 0 && do_repeat[i] == 0 ) ? 1 : 0; + for ( j = 1; j < *bands_bw; j++ ) + { + hMdDec->valid_bands[*bands_bw * i + j] = hMdDec->valid_bands[*bands_bw * i]; + } } - #ifdef SPAR_HOA_DBG int16_t b; b = 0; @@ -1736,9 +2033,12 @@ static void ivas_decode_arith_bs( const int16_t bands_bw, int16_t *pDo_diff, const int16_t freq_diff, - const int16_t planarCP ) + const int16_t planarCP, + const int16_t strat, + const int32_t ivas_total_brate ) { - int16_t i, j, ndm, ndec; + int16_t i, ndm, ndec; + int16_t j; ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; @@ -1751,22 +2051,35 @@ static void ivas_decode_arith_bs( { ndm = hMdDec->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bands_bw * i]; - - pred_cell_dims[i].dim1 = ndm + ndec - 1; - if ( hMdDec->spar_hoa_md_flag ) + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) { - if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + pred_cell_dims[i].dim1 = 0; + pred_cell_dims[i].dim2 = 0; + drct_cell_dims[i].dim1 = 0; + drct_cell_dims[i].dim2 = 0; + decd_cell_dims[i].dim1 = 0; + decd_cell_dims[i].dim2 = 0; + decx_cell_dims[i].dim1 = 0; + decx_cell_dims[i].dim2 = 0; + } + else + { + pred_cell_dims[i].dim1 = ndm + ndec - 1; + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) { - pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + } } + pred_cell_dims[i].dim2 = 1; + drct_cell_dims[i].dim1 = ndec; + drct_cell_dims[i].dim2 = ndm - 1; + decd_cell_dims[i].dim1 = ndec; + decd_cell_dims[i].dim2 = 1; + decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; + decx_cell_dims[i].dim2 = 1; } - pred_cell_dims[i].dim2 = 1; - drct_cell_dims[i].dim1 = ndec; - drct_cell_dims[i].dim2 = ndm - 1; - decd_cell_dims[i].dim1 = ndec; - decd_cell_dims[i].dim2 = 1; - decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; - decx_cell_dims[i].dim2 = 1; } any_diff = 0; @@ -1781,7 +2094,7 @@ static void ivas_decode_arith_bs( if ( any_diff == 1 ) { - if ( hMdDec->spar_hoa_md_flag ) + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) { for ( i = 0; i < nB; i++ ) { @@ -1803,7 +2116,7 @@ static void ivas_decode_arith_bs( ivas_fill_band_coeffs_idx( hMdDec->spar_md.band_coeffs_idx, nB, symbol_arr_re, pred_cell_dims, PRED_COEFF, planarCP ); - if ( hMdDec->spar_hoa_md_flag ) + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) { for ( i = 0; i < nB; i++ ) { @@ -1875,7 +2188,6 @@ static void ivas_decode_arith_bs( ivas_get_band_idx_from_differential( &hMdDec->spar_md, hMdDec->spar_md_cfg.quant_strat->P_r.q_levels, 1, nB, DECD_COEFF ); ivas_get_band_idx_from_differential( &hMdDec->spar_md, hMdDec->spar_md_cfg.quant_strat->P_c.q_levels, 0, nB, DECX_COEFF ); } - return; } @@ -2069,7 +2381,7 @@ static void ivas_decode_huffman_bs( drct_dim = ndec * ( ndm - 1 ); decd_dim = ndec; pred_offset = 0; - if ( hMdDec->spar_hoa_md_flag ) + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -2079,10 +2391,11 @@ static void ivas_decode_huffman_bs( for ( j = pred_offset; j < pred_dim; j++ ) { - ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0, &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] ); + ivas_huffman_decode( &hMdDec->huff_coeffs.pred_huff_re[qsi], st0, + &hMdDec->spar_md.band_coeffs_idx[i].pred_index_re[j] ); } - if ( hMdDec->spar_hoa_md_flag ) + if ( hMdDec->spar_hoa_md_flag && hMdDec->spar_hoa_dirac2spar_md_flag ) { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { @@ -2135,16 +2448,13 @@ static void ivas_spar_md_fill_invalid_bands( const int16_t *valid_bands, int16_t *base_band_age, const int16_t num_bands, - const int16_t sba_order /* i : SBA order */ -) + const int16_t num_channels, + const int16_t num_md_sub_frames ) { int16_t i, j, b, all_valid; int16_t valid_band_idx[IVAS_MAX_NUM_BANDS], idx = -1; int16_t last_valid_band_idx[IVAS_MAX_NUM_BANDS]; float w = 0; - int16_t num_channels; - - num_channels = ivas_sba_get_nchan_metadata( sba_order ); set_s( valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); set_s( last_valid_band_idx, 0, IVAS_MAX_NUM_BANDS ); @@ -2231,7 +2541,7 @@ static void ivas_spar_md_fill_invalid_bands( { for ( j = 0; j < num_channels; j++ ) { - for ( i_ts = 1; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + for ( i_ts = 1; i_ts < num_md_sub_frames; i_ts++ ) { pSpar_coeffs->C_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->C_re[i][j][b]; pSpar_coeffs->P_re[i][j][b + i_ts * IVAS_MAX_NUM_BANDS] = pSpar_coeffs->P_re[i][j][b]; @@ -2255,7 +2565,8 @@ static void ivas_spar_md_fill_invalid_bands( static void ivas_spar_dec_compute_ramp_down_post_matrix( ivas_spar_md_dec_state_t *hMdDec, const int16_t num_bands_out, - const int16_t bfi ) + const int16_t bfi, + const int16_t num_md_sub_frames ) { int16_t num_in_ch, num_out_ch, i, j, b; @@ -2294,7 +2605,7 @@ static void ivas_spar_dec_compute_ramp_down_post_matrix( } /* apply the post matrix */ - for ( int16_t i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + for ( int16_t i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) { for ( i = 0; i < num_out_ch; i++ ) { @@ -2531,6 +2842,8 @@ void ivas_spar_to_dirac( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t dtx_vad, /* i : DTX frame flag */ const int16_t num_bands_out /* i : number of output bands */ + , + const int16_t bw /* i : band joining factor */ ) { DIRAC_DEC_HANDLE hDirAC; @@ -2556,16 +2869,18 @@ void ivas_spar_to_dirac( int16_t pred_idx; int16_t *dirac_to_spar_md_bands; int16_t enc_param_start_band; + int16_t active_w_vlbr; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); start_band = 0; - end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ); + end_band = min( num_bands_out, SPAR_DIRAC_SPLIT_START_BAND ) / bw; hDirAC = st_ivas->hDirAC; dirac_to_spar_md_bands = st_ivas->hSpar->dirac_to_spar_md_bands; - enc_param_start_band = st_ivas->hSpar->enc_param_start_band; + enc_param_start_band = st_ivas->hSpar->enc_param_start_band / bw; + active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; - if ( hDirAC != NULL ) + if ( hDirAC != NULL && ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) == 0 ) { band_grouping = hDirAC->band_grouping; #ifdef ENABLE_DITHER @@ -2612,7 +2927,7 @@ void ivas_spar_to_dirac( } else { - f_scale = IVAS_ACTIVEW_DM_F_SCALE; + f_scale = ( active_w_vlbr ) ? IVAS_ACTIVEW_DM_F_SCALE_VLBR : IVAS_ACTIVEW_DM_F_SCALE; } } else @@ -2661,7 +2976,11 @@ void ivas_spar_to_dirac( qmf_band_start = band_grouping[band]; qmf_band_end = band_grouping[band + 1]; +#ifdef JBM_TSM_ON_TCS + for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) +#else for ( block = 0; block < hDirAC->nb_subframes; block++ ) +#endif { int16_t ts_start, ts_end, ts; @@ -2683,6 +3002,7 @@ void ivas_spar_to_dirac( hDirAC->energy_ratio1[block][b] = en_ratio; tmp_write_idx_band = tmp_write_idx_param_band; + if ( hDirAC->hConfig->dec_param_estim == FALSE ) { hDirAC->elevation[tmp_write_idx_band][b] = ele_dith; @@ -2720,13 +3040,20 @@ void ivas_spar_to_dirac( } /*read DirAC metadata, convert DirAC to SPAR*/ - for ( ; band < num_bands_out; band++ ) + for ( ; band < num_bands_out / bw; band++ ) { int16_t dirac_band_idx; dirac_band_idx = dirac_to_spar_md_bands[band] - enc_param_start_band; - for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + int16_t num_subframes; + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( st_ivas->hQMetaData->useLowerRes ) + { + num_subframes = 1; + } + + for ( block = 0; block < num_subframes; block++ ) { if ( st_ivas->hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[block] < 0.f ) { @@ -2742,7 +3069,8 @@ void ivas_spar_to_dirac( /* DirAC MD averaged over 4 subframes and converted to SPAR format similar to encoder processing */ if ( hMdDec->spar_md_cfg.nchan_transport > 1 ) { - ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL ); + ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, + st_ivas->hQMetaData->useLowerRes, active_w_vlbr ); /* temporarily copy frame-wise prediction coefficients in DirAC bands*/ for ( pred_idx = 0; pred_idx < FOA_CHANNELS - 1; pred_idx++ ) @@ -2753,9 +3081,32 @@ void ivas_spar_to_dirac( } } } + int16_t num_subframes; + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + if ( st_ivas->hQMetaData->useLowerRes ) + { + num_subframes = 1; + } + ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, num_subframes, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, + end_band, num_bands_out / bw, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL, st_ivas->hQMetaData->useLowerRes, active_w_vlbr ); - ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, MAX_PARAM_SPATIAL_SUBFRAMES, NULL, &hMdDec->spar_md, &hMdDec->spar_md_cfg, end_band, num_bands_out, ( hMdDec->spar_hoa_md_flag ) ? 1 : sba_order_internal, dtx_vad, NULL ); - + if ( st_ivas->hQMetaData->useLowerRes && dtx_vad ) + { + for ( band = SPAR_DIRAC_SPLIT_START_BAND; band < IVAS_MAX_NUM_BANDS; band++ ) + { + for ( block = 1; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) + { + for ( int16_t i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + { + hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].pred_re[i] = hMdDec->spar_md.band_coeffs[band].pred_re[i]; + } + for ( int16_t i = 0; i < FOA_CHANNELS - 1; i++ ) /* pred coefficient index (index 0, 1, 2 predicts Y, Z, X respectively) */ + { + hMdDec->spar_md.band_coeffs[band + block * IVAS_MAX_NUM_BANDS].P_re[i] = hMdDec->spar_md.band_coeffs[band].P_re[i]; + } + } + } + } /* expand DirAC TC 20ms MD for residual channels to all subframes*/ for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { @@ -2772,7 +3123,7 @@ void ivas_spar_to_dirac( } } - for ( b = end_band; b < num_bands_out; b++ ) + for ( b = end_band * bw; b < num_bands_out; b++ ) { hMdDec->valid_bands[b] = 1; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4a17c75dda..cd565f3eae 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -435,6 +435,11 @@ typedef struct param_ism_rendering float *proto_matrix; float *interpolator; float mixing_matrix_lin_old[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; +#ifdef JBM_TSM_ON_TCS + float mixing_matrix_lin[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; + float *Cldfb_RealBuffer_tc; + float *Cldfb_ImagBuffer_tc; +#endif } PARAM_ISM_RENDERING_DATA, *PARAM_ISM_RENDERING_HANDLE; @@ -571,10 +576,13 @@ typedef struct dirac_output_synthesis_cov_state_structure float *cy_old[CLDFB_NO_CHANNELS_MAX]; float *mixing_matrix_old[CLDFB_NO_CHANNELS_MAX]; float *mixing_matrix_res_old[CLDFB_NO_CHANNELS_MAX]; +#ifdef JBM_TSM_ON_TCS + float *mixing_matrix[CLDFB_NO_CHANNELS_MAX]; + float *mixing_matrix_res[CLDFB_NO_CHANNELS_MAX]; +#endif } DIRAC_OUTPUT_SYNTHESIS_COV_STATE; - /* MASA stereo transport signal type detection structure */ typedef struct { @@ -612,9 +620,15 @@ typedef struct /* Diffuse sound directional distribution data structure */ typedef struct ivas_diffuse_distribution_data_structure { +#ifdef JBM_TSM_ON_TCS + float diffuseRatioX[CLDFB_NO_CHANNELS_MAX]; + float diffuseRatioY[CLDFB_NO_CHANNELS_MAX]; + float diffuseRatioZ[CLDFB_NO_CHANNELS_MAX]; +#else float diffuseRatioX[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float diffuseRatioY[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; float diffuseRatioZ[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; +#endif } DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE; @@ -626,7 +640,15 @@ typedef struct ivas_dirac_dec_data_structure IVAS_OUTPUT_SETUP hOutSetup; int16_t slot_size; +#ifdef JBM_TSM_ON_TCS + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; + int16_t render_to_md_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; +#else int16_t subframe_nbslots; +#endif int16_t nb_subframes; int16_t num_freq_bands; @@ -710,7 +732,10 @@ typedef struct ivas_dirac_dec_data_structure float power_ratios[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS][MAX_PARAM_ISM_WAVE]; PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; IVAS_FB_MIXER_HANDLE hFbMdft; +#ifndef SBA_MODE_CLEAN_UP int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; +#endif + const int16_t *sba_map_tc; } DIRAC_DEC_DATA, *DIRAC_DEC_HANDLE; @@ -734,7 +759,17 @@ typedef struct ivas_param_mc_dec_data_structure { int16_t slot_size; +#ifdef JBM_TSM_ON_TCS + float *Cldfb_RealBuffer_tc; + float *Cldfb_ImagBuffer_tc; + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; +#else int16_t subframe_nbslots; +#endif int16_t num_freq_bands; int16_t num_param_bands_synth; @@ -771,7 +806,25 @@ typedef struct ivas_param_mc_dec_data_structure } PARAM_MC_DEC_DATA, *PARAM_MC_DEC_HANDLE; +/*----------------------------------------------------------------------------------* + * MC Param-Upmix Mode structures + *----------------------------------------------------------------------------------*/ +/* ===== MC Param-Upmix Mode main structure ===== */ +typedef struct ivas_mc_paramupmix_dec_data_structure +{ + int16_t num_freq_bands; + ivas_td_decorr_state_t *hTdDecorr[MC_PARAMUPMIX_COMBINATIONS]; + float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float alpha_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float beta_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int32_t alpha_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int32_t beta_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + bool first_frame; + float *pcm_delay[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS]; + +} MC_PARAMUPMIX_DEC_DATA, *MC_PARAMUPMIX_DEC_HANDLE; /*------------------------------------------------------------------------------------------* * SPAR decoder structures *------------------------------------------------------------------------------------------*/ @@ -799,7 +852,6 @@ typedef struct ivas_spar_md_dec_state_t int16_t td_decorr_flag; int16_t spar_plc_enable_fadeout_flag; float ***mixer_mat; - /*TODO : reuse hFbMixer->prior_mixer for this as that buffer is unused in decoder with FB_HARMONIZATION*/ float mixer_mat_prev[MAX_PARAM_SPATIAL_SUBFRAMES + 1][IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; ivas_spar_md_com_cfg spar_md_cfg; ivas_arith_coeffs_t arith_coeffs; @@ -807,6 +859,11 @@ typedef struct ivas_spar_md_dec_state_t int16_t table_idx; int16_t dtx_vad; int16_t spar_hoa_md_flag; + int16_t spar_hoa_dirac2spar_md_flag; + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; + float smooth_buf[IVAS_MAX_NUM_BANDS][2 * SBA_DIRAC_NRG_SMOOTH_LONG + 1]; + float smooth_fac[IVAS_MAX_NUM_BANDS]; + float mixer_mat_prev2[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; } ivas_spar_md_dec_state_t; @@ -858,6 +915,14 @@ typedef struct ivas_spar_dec_lib_t int16_t numOutChannels; int16_t pca_ingest_channels; #endif +#ifdef JBM_TSM_ON_TCS + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t render_to_md_map[MAX_JBM_CLDFB_TIMESLOTS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; +#endif } SPAR_DEC_DATA, *SPAR_DEC_HANDLE; @@ -1027,7 +1092,12 @@ typedef struct vbap_data_structure typedef struct renderer_struct { float prev_gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; +#ifdef JBM_TSM_ON_TCS + float *interpolator; + float gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; +#else float interpolator[L_FRAME48k]; +#endif } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; @@ -1140,17 +1210,53 @@ typedef struct decoder_config_structure int16_t Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ - int16_t orientation_tracking; /* indicates orientation tracking type */ - float no_diegetic_pan; - int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ +#else + int16_t orientation_tracking; /* indicates orientation tracking type */ +#endif + int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ + float non_diegetic_pan_gain; /* non diegetic panning gain*/ + int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ /* temp. development parameters */ #ifdef DEBUGGING int16_t force_rend; /* forced TD/CLDFB binaural renderer (for ISM and MC) */ #endif - +#ifdef JBM_TSM_ON_TCS + int16_t voip_active; +#endif +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t Opt_delay_comp; /* flag indicating delay compensation active */ +#endif } DECODER_CONFIG, *DECODER_CONFIG_HANDLE; + +#ifdef JBM_TSM_ON_TCS +typedef struct decoder_tc_buffer_structure +{ + float *tc_buffer; /* the buffer itself */ + float *tc[MAX_TRANSPORT_CHANNELS]; /* pointers into the buffer to the beginning of each tc */ + TC_BUFFER_MODE tc_buffer_mode; /* mode of the buffer (no buffering, render buffering, out buffering) */ + int16_t nchan_transport_jbm; /* number of TCs after TC decoding */ + int16_t nchan_transport_internal; /* total number of TC buffer channels, can include e.g. TD decorr data */ + int16_t nchan_buffer_full; /* number of channels to be fully buffered */ + int16_t n_samples_available; /* samples still available for rendering in the current frame */ + int16_t n_samples_buffered; /* full number of samples in the buffer (including spill to next frame) */ + int16_t n_samples_rendered; /* samples already rendered in the current frame */ + int16_t n_samples_granularity; /* render granularity */ + int16_t n_samples_flushed; + int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + int16_t nb_subframes; + int16_t subframes_rendered; + int16_t slots_rendered; + int16_t num_slots; + int16_t n_samples_discard; /* number of samples to discard from the beginning of the output */ + +} DECODER_TC_BUFFER, *DECODER_TC_BUFFER_HANDLE; +#endif + + /*----------------------------------------------------------------------------------* * * Main IVAS decoder structure @@ -1179,7 +1285,7 @@ typedef struct Decoder_Struct int16_t ini_active_frame; /* initialization active frames counter */ int16_t bfi; /* FEC - bad frame indicator */ - int16_t BER_detect; /* BER detect flag */ /* IVAS_fmToDo: eventually replace hCoreCoder->BER_detect by a pointer to ease the updating of this main parameter */ + int16_t BER_detect; /* BER detect flag */ uint16_t *bit_stream; /* Pointer to bitstream buffer */ int16_t writeFECoffset; /* parameter for debugging JBM stuff */ @@ -1202,12 +1308,15 @@ typedef struct Decoder_Struct IVAS_QMETADATA_HANDLE hQMetaData; /* q_metadata handle */ MCT_DEC_HANDLE hMCT; /* MCT handle */ PARAM_MC_DEC_HANDLE hParamMC; /* Parametric MC handle */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ MASA_DECODER_HANDLE hMasa; /* MASA handle */ LFE_DEC_HANDLE hLFE; /* LFE handle */ ISM_MODE ism_mode; /* ISM format mode */ int16_t nchan_ism; /* number of ISM channels */ +#ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode; /* SBA format mode */ +#endif MC_MODE mc_mode; /* MC format mode */ int16_t sba_order; /* Ambisonic (SBA) order */ int16_t sba_planar; /* Ambisonic (SBA) planar flag */ @@ -1237,6 +1346,11 @@ typedef struct Decoder_Struct RENDER_CONFIG_DATA *hRenderConfig; /* Renderer config pointer */ int32_t binaural_latency_ns; /* Binauralization latency in ns */ +#ifdef JBM_TSM_ON_TCS + /* JBM module */ + DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM structure */ +#endif + #ifdef DEBUGGING int32_t noClipping; /* number of clipped samples */ #endif diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 2e31375996..c12498c015 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -90,12 +90,7 @@ void stereo_dft_dec_sid_coh( int16_t bits_tmp; int16_t b; -#ifdef FIX_418_SID_BITRATE nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; -#else - /* TODO: still use old number of bits to keep bitexactness in output */ - nr_of_sid_stereo_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; -#endif /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */ /* from the previous frame is used. */ @@ -178,9 +173,6 @@ void stereo_dft_dec_sid_coh( ( *nb_bits )++; } -#ifndef FIX_418_SID_BITRATE - dtx_read_padding_bits( st, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); -#endif return; } diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 1fac575de9..5c2d0b37e6 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1131,6 +1131,10 @@ void stereo_dft_dec( const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs, /* i : Fs for delay calculation */ const int16_t nchan_transport /* i : number of transpor channels */ +#ifdef FIX_STEREO_474 + , + const int16_t num_md_sub_frames /* i: number of MD subframes */ +#endif ) { int16_t i, k, b, N_div, stop; @@ -1208,7 +1212,12 @@ void stereo_dft_dec( ivas_sba_dirac_stereo_smooth_parameters( hStereoDft, hMdDec, cross_fade_start_offset, - output_Fs ); + output_Fs +#ifdef FIX_STEREO_474 + , + num_md_sub_frames +#endif + ); } else { @@ -1340,6 +1349,7 @@ void stereo_dft_dec( { g = hStereoDft->g_state[b]; } + /* store side gains from inactive frames for later use by the stereo CNA */ if ( hStereoDft->band_limits[b] < L_FRAME16k && ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) ) { @@ -1595,7 +1605,7 @@ void stereo_dft_dec( if ( hStereoDft->frame_sid_nodata || st0->VAD == 0 ) { - hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; + hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; } if ( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) @@ -1728,7 +1738,11 @@ void stereo_dft_dec( if ( st0->bfi && !prev_bfi ) { +#ifdef FIX_499_DFT_STEREO_PLC + idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; +#else idx_k0 = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; +#endif idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX; /*dmx energy memory*/ hStereoDft->past_dmx_nrg = stereo_dft_dmx_swb_nrg( hStereoDft->DFT_past_DMX[idx_k0], hStereoDft->DFT_past_DMX[idx_k1], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index 78196eaaa8..13722f2b2a 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -739,7 +739,7 @@ void stereo_icBWE_decproc( { if ( hCPE->element_mode == IVAS_CPE_TD ) { - /* QC: TBV */ + /* QC: TODO - TBV */ v_add( output[0], hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); v_add( output[1], hStereoICBWE->memOutHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); } diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index cccef8ec84..efc9ebe845 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -468,6 +468,9 @@ ivas_error initMdctStereoDtxData( /* Init FD-CNG */ initFdCngDec( st ); + } + if ( st->first_CNG == 0 ) + { if ( ch == 1 && st->cng_sba_flag ) { st->hFdCngDec->hFdCngCom->seed += 3; diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index 0a436ec0d2..013cc24660 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -963,7 +963,7 @@ ivas_error stereo_memory_dec( if ( ivas_format == MC_FORMAT && hCPE->element_mode == IVAS_CPE_MDCT ) { - if ( mc_mode == MC_MODE_MCT ) + if ( mc_mode == MC_MODE_MCT || mc_mode == MC_MODE_PARAMUPMIX ) { /* deallocate the FdCNG handle */ for ( i = 0; i < CPE_CHANNELS; ++i ) @@ -1545,7 +1545,6 @@ void stereo_switching_dec( mvr2r( sts[0]->hHQ_core->old_out, sts[1]->hHQ_core->old_out, L_FRAME48k ); mvr2r( sts[0]->delay_buf_out, sts[1]->delay_buf_out, HQ_DELTA_MAX * HQ_DELAY_COMP ); mvr2r( sts[0]->hTcxDec->old_syn_Overl, sts[1]->hTcxDec->old_syn_Overl, 256 ); - /* Todo: apply panning to buffers instead of simply using dmx in left and right channel */ } } else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->last_element_mode == IVAS_CPE_MDCT ) diff --git a/lib_dec/ivas_vbap.c b/lib_dec/ivas_vbap.c index cda52c1aec..841f3df132 100644 --- a/lib_dec/ivas_vbap.c +++ b/lib_dec/ivas_vbap.c @@ -178,11 +178,13 @@ ivas_error vbap_init_data( push_wmops( "vbap_init" ); /* Basic init checks */ + /* If the requested layout is invalid, hVBAPdata is set to NULL and the signal will + * be distributed with an equal gain into all output channels. + * The surrounding code needs to handle the NULL pointer properly. */ if ( num_speaker_nodes > VBAP_MAX_NUM_SPEAKER_NODES || num_speaker_nodes < 3 ) { hVBAPdata = NULL; pop_wmops(); - /* TODO: are these two paths correct behaviour or should and error be returned ? */ return IVAS_ERR_OK; } diff --git a/lib_dec/jbm_jb4sb.h b/lib_dec/jbm_jb4sb.h index 54b873b006..7954358595 100644 --- a/lib_dec/jbm_jb4sb.h +++ b/lib_dec/jbm_jb4sb.h @@ -78,6 +78,14 @@ struct JB4_DATAUNIT int16_t nextCoderType; }; +#ifdef JBM_TSM_ON_TCS +typedef enum +{ + JBM_RENDERER_NONE, + JBM_RENDERER_IVAS, +} JBM_RENDERER_TYPE; +#endif + typedef struct JB4_DATAUNIT *JB4_DATAUNIT_HANDLE; diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index c816a9d9c8..9742a01183 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -66,7 +66,12 @@ struct apa_state_t { /* output buffer */ +#ifdef JBM_TSM_ON_TCS + bool evs_compat_mode; + float *buf_out; +#else int16_t *buf_out; +#endif uint16_t buf_out_capacity; uint16_t l_buf_out; @@ -86,6 +91,14 @@ struct apa_state_t /* total number of processed input samples since apa_reset() */ uint32_t l_in_total; +#ifdef JBM_TSM_ON_TCS + /* time resolution in samples of the IVAS renderer*/ + uint16_t l_ts; + + /* samples already available in the renderer buffer */ + uint16_t l_r_buf; +#endif + /* sum of inserted/removed samples since last apa_set_scale() */ int32_t diffSinceSetScale; /* number of input frames since last apa_set_scale() */ @@ -123,6 +136,17 @@ static float apa_corrEnergy2dB( float energy, uint16_t corr_len ); static float apa_getQualityIncreaseForLowEnergy( float energydB ); +#ifdef JBM_TSM_ON_TCS +static bool logarithmic_search( const apa_state_t *ps, const float *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos ); + +static bool find_synch( apa_state_t *ps, const float *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos ); + +static bool copy_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out ); + +static bool shrink_frm( apa_state_t *ps, const float frm_in[], uint16_t maxScaling, float frm_out[], uint16_t *l_frm_out ); + +static bool extend_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out ); +#else static bool logarithmic_search( const apa_state_t *ps, const int16_t *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos ); static bool find_synch( apa_state_t *ps, const int16_t *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos ); @@ -132,7 +156,7 @@ static bool copy_frm( apa_state_t *ps, const int16_t frm_in[], int16_t frm_out[] static bool shrink_frm( apa_state_t *ps, const int16_t frm_in[], uint16_t maxScaling, int16_t frm_out[], uint16_t *l_frm_out ); static bool extend_frm( apa_state_t *ps, const int16_t frm_in[], int16_t frm_out[], uint16_t *l_frm_out ); - +#endif /*---------------------------------------------------------------------* * Public functions @@ -164,6 +188,10 @@ ivas_error apa_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); } +#ifdef JBM_TSM_ON_TCS + ps->evs_compat_mode = false; +#endif + apa_reset( ps ); *pps = ps; @@ -196,9 +224,58 @@ void apa_reset( ps->bad_frame_count = 0; ps->good_frame_count = 0; +#ifdef JBM_TSM_ON_TCS + ps->l_ts = 1; + ps->l_r_buf = 0; +#endif return; } +#ifdef JBM_TSM_ON_TCS +uint8_t apa_reconfigure( + apa_state_t *ps, + uint16_t num_channels, + uint16_t l_ts ) +{ + + /* realloc buffer */ + free( ps->buf_out ); + ps->num_channels = (uint16_t) num_channels; + ps->buf_out_capacity = (uint16_t) ( APA_BUF_PER_CHANNEL * num_channels ); + ps->buf_out = (float *) malloc( sizeof( float ) * ps->buf_out_capacity ); + if ( !ps->buf_out ) + { + return 2; + } + ps->l_buf_out = 0; + ps->l_in_total = 0; + ps->l_ts = ps->num_channels * l_ts; + + /* set everything else dependent on the number of channels */ + /* set segment size */ + /* in the order of a pitch, set to 160 samples at 16 kHz */ + /* used for windowing and as the correlation length, i.e., */ + /* the size of the template segment. */ + ps->l_seg = ( ps->rate / 100 ) * ps->num_channels; + + /* set frame size */ + /* set to 320 samples at 16 kHz */ + ps->l_frm = ( ps->rate / FRAMES_PER_SEC ) * ps->num_channels; + + /* set minimum pitch */ + /* set to 40 samples at 16 kHz */ + /* (defines min change in number of samples, i.e., abs(l_in-l_out) >= p_min) */ + ps->p_min = ( ps->rate / 400 ) * ps->num_channels; + + /* set search length */ + /* must cover one pitch, set to 200 samples at 16 kHz */ + /* (the resulting maximum pitch is then p_min+l_search = 240 samples at 16 kHz) */ + ps->l_search = ( ps->rate / 80 ) * ps->num_channels; + + return 0; +} + +#endif /* Sets the audio configuration. */ bool apa_set_rate( @@ -302,6 +379,54 @@ bool apa_set_scale( return 0; } +#ifdef JBM_TSM_ON_TCS +bool apa_set_renderer_granularity( + apa_state_t *ps, + uint16_t l_ts ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + + /* copy to state struct */ + ps->l_ts = l_ts * ps->num_channels; + return 0; +} + +bool apa_set_renderer_residual_samples( + apa_state_t *ps, + uint16_t l_r_buf ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + + /* copy to state struct */ + ps->l_r_buf = l_r_buf * ps->num_channels; + return 0; +} + +bool apa_set_evs_compat_mode( + apa_state_t *ps, + bool mode ) +{ + /* make sure pointer is valid */ + if ( ps == NULL ) + { + return 1; + } + + ps->evs_compat_mode = mode; + + return 0; +} +#endif /* ******************************************************************************** @@ -454,16 +579,28 @@ bool apa_exit( ******************************************************************************** */ uint8_t apa_exec( - apa_state_t *ps, /* i/o: state struct */ - const int16_t a_in[], /* i : input samples */ - uint16_t l_in, /* i : number of input samples */ - uint16_t maxScaling, /* i : allowed number of inserted/removed samples */ - int16_t a_out[], /* o : output samples */ - uint16_t *l_out /* o : number of output samples */ + apa_state_t *ps, /* i/o: state struct */ +#ifdef JBM_TSM_ON_TCS + const float a_in[], /* i : input samples */ +#else + const int16_t a_in[], /* i : input samples */ +#endif + uint16_t l_in, /* i : number of input samples */ + uint16_t maxScaling, /* i : allowed number of inserted/removed samples */ +#ifdef JBM_TSM_ON_TCS + float a_out[], /* o : output samples */ +#else + int16_t a_out[], /* o : output samples */ +#endif + uint16_t *l_out /* o : number of output samples */ ) { uint16_t i; +#ifdef JBM_TSM_ON_TCS + float frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ +#else int16_t frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ +#endif uint16_t l_frm_out; int16_t l_rem; int32_t dl_scaled, dl_copied, l_frm_out_target; @@ -525,8 +662,13 @@ uint8_t apa_exec( } else { +#ifdef JBM_TSM_ON_TCS + float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] ); + float *frm_in_ptr = &( frm_in[ps->l_frm] ); +#else int16_t *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] ); int16_t *frm_in_ptr = &( frm_in[ps->l_frm] ); +#endif /* fill input frame */ /* 1st input frame: previous output samples */ @@ -581,8 +723,13 @@ uint8_t apa_exec( /* discard old samples; always keep at least most recent l_frm samples */ if ( ( ps->l_buf_out + l_frm_out ) > ps->buf_out_capacity ) { +#ifdef JBM_TSM_ON_TCS + float *buf_out_ptr1 = ps->buf_out; + float *buf_out_ptr2; +#else int16_t *buf_out_ptr1 = ps->buf_out; int16_t *buf_out_ptr2; +#endif l_rem = ( ps->l_frm - l_frm_out ); if ( l_rem < 0 ) @@ -602,7 +749,11 @@ uint8_t apa_exec( return 5; } { +#ifdef JBM_TSM_ON_TCS + float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] ); +#else int16_t *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] ); +#endif for ( i = 0; i < l_frm_out; i++ ) { buf_out_ptr[i] = a_out[i]; @@ -660,7 +811,11 @@ uint8_t apa_exec( */ static void get_scaling_quality( const apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint16_t s_len, uint16_t offset, uint16_t corr_len, @@ -813,7 +968,11 @@ static float apa_getQualityIncreaseForLowEnergy( */ static bool logarithmic_search( const apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif int16_t s_start, uint16_t inlen, uint16_t offset, @@ -926,7 +1085,11 @@ static bool logarithmic_search( */ static bool find_synch( apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float *in, +#else const int16_t *in, +#endif uint16_t l_in, int16_t s_start, uint16_t s_len, @@ -981,8 +1144,13 @@ static bool find_synch( */ static bool copy_frm( apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float frm_in[], + float frm_out[], +#else const int16_t frm_in[], int16_t frm_out[], +#endif uint16_t *l_frm_out ) { uint16_t i; @@ -1029,9 +1197,17 @@ static bool copy_frm( */ static bool shrink_frm( apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float frm_in[], +#else const int16_t frm_in[], +#endif uint16_t maxScaling, +#ifdef JBM_TSM_ON_TCS + float frm_out[], +#else int16_t frm_out[], +#endif uint16_t *l_frm_out ) { bool findSynchResult = 0; @@ -1062,7 +1238,28 @@ static bool shrink_frm( /* maximum scaling */ energy = -65; quality = 5; - if ( maxScaling != 0U && s_end > maxScaling + 1 ) +#ifdef JBM_TSM_ON_TCS + if ( ps->evs_compat_mode == false ) + { + + xtract = maxScaling; + /* take samples already in the renderer buf into account */ + xtract += ps->l_r_buf; + /* snap to renderer time slot borders */ + xtract -= ( ps->l_ts - ( l_frm - xtract + ps->l_r_buf ) % ps->l_ts ); + while ( xtract < 0 ) + { + xtract += ps->l_ts; + } + while ( xtract > ( s_end - ps->num_channels ) ) + { + /* exceeded the possible shrinking, go back one renderer ts*/ + xtract -= ps->l_ts; + } + } + else +#endif + if ( maxScaling != 0U && s_end > maxScaling + 1 ) { xtract = maxScaling; } @@ -1118,7 +1315,18 @@ static bool shrink_frm( { return 1; } - overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); +#ifdef JBM_TSM_ON_TCS + if ( ps->evs_compat_mode == true ) + { + overlapAddEvs( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + else + { +#endif + overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); +#ifdef JBM_TSM_ON_TCS + } +#endif } else { @@ -1165,8 +1373,13 @@ static bool shrink_frm( */ static bool extend_frm( apa_state_t *ps, +#ifdef JBM_TSM_ON_TCS + const float frm_in[], + float frm_out[], +#else const int16_t frm_in[], int16_t frm_out[], +#endif uint16_t *l_frm_out ) { bool findSynchResult = 0; @@ -1180,8 +1393,14 @@ static bool extend_frm( int16_t s_start = 0; float energy, quality = 0.0f; uint16_t l_frm, l_seg; +#ifdef JBM_TSM_ON_TCS + const float *fadeOut, *fadeIn; + float *out; +#else const int16_t *fadeOut, *fadeIn; int16_t *out; +#endif + l_frm = ps->l_frm; l_seg = ps->l_seg; @@ -1271,6 +1490,15 @@ static bool extend_frm( energy = -65; quality = 5; xtract[n] = s_start + ps->num_channels; +#ifdef JBM_TSM_ON_TCS + if ( ps->evs_compat_mode == false ) + { + /* take renderer buffer samples into accout */ + xtract[n] += ps->l_r_buf; + /* snap to next renderer time slot border to resynchronize */ + xtract[n] -= ( ( N - 1 ) * l_seg - xtract[n] + ps->l_r_buf ) % ps->l_ts; + } +#endif } else { @@ -1327,13 +1555,29 @@ static bool extend_frm( fadeOut = frm_in + l_frm + xtract[n - 1] + l_seg; fadeIn = frm_in + l_frm + xtract[n]; out = frm_out + ( n - 2 ) * l_seg; - overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); +#ifdef JBM_TSM_ON_TCS + if ( ps->evs_compat_mode == true ) + { + overlapAddEvs( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); + } + else + { +#endif + overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); +#ifdef JBM_TSM_ON_TCS + } +#endif } else { /* just copy down 1st half of current segment (= 2nd half of previous segment) */ +#ifdef JBM_TSM_ON_TCS + float *frm_out_ptr; + const float *frm_in_ptr; +#else int16_t *frm_out_ptr; const int16_t *frm_in_ptr; +#endif frm_out_ptr = &( frm_out[( n - 2 ) * l_seg] ); frm_in_ptr = &( frm_in[l_frm + xtract[n]] ); for ( i = 0; i < l_seg; i++ ) diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h index 543042f53b..a5e7cb7d61 100644 --- a/lib_dec/jbm_pcmdsp_apa.h +++ b/lib_dec/jbm_pcmdsp_apa.h @@ -114,12 +114,26 @@ bool apa_set_rate( apa_state_t *ps, const int32_t output_Fs ); * @return 0 on success, 1 on failure */ bool apa_set_scale( apa_state_t *s, uint16_t scale ); +#ifdef JBM_TSM_ON_TCS +bool apa_set_renderer_granularity( apa_state_t *ps, uint16_t l_ts ); + +bool apa_set_renderer_residual_samples( apa_state_t *ps, uint16_t l_r_buf ); + +bool apa_set_evs_compat_mode( apa_state_t *ps, bool mode ); + +uint8_t apa_reconfigure( apa_state_t *ps, uint16_t num_channels, uint16_t l_ts ); +#endif + bool apa_set_complexity_options( apa_state_t *s, uint16_t wss, uint16_t css ); bool apa_set_quality( apa_state_t *s, float quality, uint16_t qualityred, uint16_t qualityrise ); bool apa_exit( apa_state_t **s ); +#ifdef JBM_TSM_ON_TCS +uint8_t apa_exec( apa_state_t *s, const float a_in[], uint16_t l_in, uint16_t maxScaling, float a_out[], uint16_t *l_out ); +#else uint8_t apa_exec( apa_state_t *s, const int16_t a_in[], uint16_t l_in, uint16_t maxScaling, int16_t a_out[], uint16_t *l_out ); +#endif #endif /* JBM_PCMDSP_APA_H */ diff --git a/lib_dec/jbm_pcmdsp_fifo.c b/lib_dec/jbm_pcmdsp_fifo.c index 81e833e5e5..108b069402 100644 --- a/lib_dec/jbm_pcmdsp_fifo.c +++ b/lib_dec/jbm_pcmdsp_fifo.c @@ -116,6 +116,15 @@ ivas_error pcmdsp_fifo_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); } +#ifdef DEBUGGING + { + uint32_t i; + for ( i = 0; i < nDataBytes; i++ ) + { + h->dataBegin[i] = 0; + } + } +#endif h->dataEnd = h->dataBegin + nDataBytes; h->dataWriteIterator = h->dataBegin; h->dataReadIterator = h->dataBegin; @@ -166,6 +175,51 @@ int16_t pcmdsp_fifo_write( return 0; } +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUGGING +/* Writes the given audio data to the FIFO. */ +int16_t pcmdsp_fifo_write_zero( + PCMDSP_FIFO_HANDLE h, + uint16_t nSamplesPerChannel ) +{ + uint16_t nBytesToWrite; + + /* check for empty input buffer */ + if ( nSamplesPerChannel == 0U ) + { + return 0; + } + + /* check, if enough space left */ + if ( nSamplesPerChannel > h->capacity - h->size ) + { + return -1; + } + + nBytesToWrite = nSamplesPerChannel * h->nBytesPerSampleSet; + if ( h->dataWriteIterator + nBytesToWrite > h->dataEnd ) + { + /* wrap around: writing two parts */ + uint16_t bytesOfFirstPart, secondSize; + bytesOfFirstPart = (uint16_t) ( h->dataEnd - h->dataWriteIterator ); + secondSize = nBytesToWrite - bytesOfFirstPart; + set_c( (int8_t *) h->dataWriteIterator, 0, bytesOfFirstPart ); + set_c( (int8_t *) h->dataBegin, 0, secondSize ); + h->dataWriteIterator = h->dataBegin + secondSize; + } + else + { + /* no wrap around: simple write */ + set_c( (int8_t *) h->dataWriteIterator, 0, nBytesToWrite ); + h->dataWriteIterator += nBytesToWrite; + } + h->size += nSamplesPerChannel; + + return 0; +} +#endif +#endif + /* Reads the given number of audio samples from the FIFO. */ int16_t pcmdsp_fifo_read( PCMDSP_FIFO_HANDLE h, diff --git a/lib_dec/jbm_pcmdsp_fifo.h b/lib_dec/jbm_pcmdsp_fifo.h index 13ffd146f8..d16bd2b8d2 100644 --- a/lib_dec/jbm_pcmdsp_fifo.h +++ b/lib_dec/jbm_pcmdsp_fifo.h @@ -74,6 +74,12 @@ ivas_error pcmdsp_fifo_init( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, int16_t pcmdsp_fifo_write( PCMDSP_FIFO_HANDLE h, const uint8_t *samples, uint16_t nSamplesPerChannel ); +#ifdef JBM_TSM_ON_TCS +#ifdef DEBUGGING +int16_t pcmdsp_fifo_write_zero( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel ); +#endif +#endif + int16_t pcmdsp_fifo_read( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, uint8_t *samples ); uint16_t pcmdsp_fifo_nReadableSamplesPerChannel( const PCMDSP_FIFO_HANDLE h ); diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.c b/lib_dec/jbm_pcmdsp_similarityestimation.c index f575acc7ad..e83d1f7c37 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation.c @@ -52,7 +52,11 @@ /* Calculates cross correlation coefficient for template segment. */ float cross_correlation_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint16_t x, uint16_t y, uint16_t corr_len ) @@ -63,7 +67,11 @@ float cross_correlation_self( c_c = 0.0f; for ( j = 0; j < corr_len; j++ ) { +#ifdef JBM_TSM_ON_TCS + c_c += ( signal[j + x] * signal[j + y] ); +#else c_c += ( (float) signal[j + x] * (float) signal[j + y] ); +#endif } return c_c; @@ -71,7 +79,11 @@ float cross_correlation_self( /* Calculates cross correlation coefficient for template segment. */ float cross_correlation_subsampled_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint16_t x, uint16_t y, uint16_t corr_len, @@ -83,7 +95,11 @@ float cross_correlation_subsampled_self( c_c = 0.0f; for ( j = 0; j < corr_len; j += subsampling ) { +#ifdef JBM_TSM_ON_TCS + c_c += ( signal[j + x] * signal[j + y] ); +#else c_c += ( (float) signal[j + x] * (float) signal[j + y] ); +#endif } return c_c; @@ -92,7 +108,11 @@ float cross_correlation_subsampled_self( /* Calculates normalized cross correlation coefficient for template segment. */ float normalized_cross_correlation_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint16_t x, uint16_t y, uint16_t corr_len, @@ -102,7 +122,11 @@ float normalized_cross_correlation_self( float c_c; float energy_xy, energy_x, energy_y; uint16_t j; +#ifdef JBM_TSM_ON_TCS + const float *signal_a, *signal_b; +#else const int16_t *signal_a, *signal_b; +#endif c_c = 0.0f; energy_x = 0.0f; @@ -111,11 +135,21 @@ float normalized_cross_correlation_self( signal_b = &signal[y]; for ( j = 0; j < corr_len; j += subsampling ) { +#ifdef JBM_TSM_ON_TCS + c_c += ( signal_a[j] * signal_b[j] ); + energy_x += ( signal_a[j] ) * ( signal_a[j] ); + energy_y += ( signal_b[j] ) * ( signal_b[j] ); +#else c_c += ( (float) signal_a[j] * (float) signal_b[j] ); energy_x += ( (float) signal_a[j] ) * ( (float) signal_a[j] ); energy_y += ( (float) signal_b[j] ) * ( (float) signal_b[j] ); +#endif } +#ifdef JBM_TSM_ON_TCS + energy_xy = sqrtf( energy_x * energy_y ); +#else energy_xy = (float) sqrt( (float) energy_x * (float) energy_y ); +#endif if ( energy_xy < 1.0f ) { energy_xy = 1.0f; /* conceal silent frames */ @@ -130,7 +164,11 @@ float normalized_cross_correlation_self( /* Splits the signal into segments and checks if all of them have very low energy. */ bool isSilence( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else const int16_t *signal, +#endif uint32_t len, uint32_t segments ) { @@ -145,7 +183,11 @@ bool isSilence( if ( ( i != 0U && i % samplesPerSegment == 0U ) || i + 1 == len ) { /* check energy of current segment */ +#ifdef JBM_TSM_ON_TCS + energy = 10 * log10f( energy / (float) samplesPerSegment ); +#else energy = 10 * (float) log10( energy / samplesPerSegment ); +#endif if ( energy > -65 ) { return false; diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.h b/lib_dec/jbm_pcmdsp_similarityestimation.h index 4dc92f27b7..44b4fd246a 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.h +++ b/lib_dec/jbm_pcmdsp_similarityestimation.h @@ -67,7 +67,15 @@ * ******************************************************************************** */ -float cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len ); +float cross_correlation_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else + const int16_t *signal, +#endif + uint16_t x, + uint16_t y, + uint16_t corr_len ); /* ******************************************************************************** @@ -94,7 +102,16 @@ float cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uin * ******************************************************************************** */ -float cross_correlation_subsampled_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len, uint16_t subsampling ); +float cross_correlation_subsampled_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else + const int16_t *signal, +#endif + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling ); /* ******************************************************************************** @@ -132,9 +149,26 @@ float cross_correlation_subsampled_self( const int16_t *signal, uint16_t x, uint * ******************************************************************************** */ -float normalized_cross_correlation_self( const int16_t *signal, uint16_t x, uint16_t y, uint16_t corr_len, uint16_t subsampling, float *energy ); +float normalized_cross_correlation_self( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else + const int16_t *signal, +#endif + uint16_t x, + uint16_t y, + uint16_t corr_len, + uint16_t subsampling, + float *energy ); /* Splits the signal into segments and checks if all of them have very low energy. */ -bool isSilence( const int16_t *signal, uint32_t len, uint32_t segments ); +bool isSilence( +#ifdef JBM_TSM_ON_TCS + const float *signal, +#else + const int16_t *signal, +#endif + uint32_t len, + uint32_t segments ); #endif /* JBM_PCMDSP_SIMILARITYESTIMATION_H */ diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window.c index f9f71ac802..a31d368c91 100644 --- a/lib_dec/jbm_pcmdsp_window.c +++ b/lib_dec/jbm_pcmdsp_window.c @@ -80,9 +80,15 @@ void hannWindow( *-----------------------------------------------------------------------*/ void overlapAdd( +#ifdef JBM_TSM_ON_TCS + const float *fadeOut, + const float *fadeIn, + float *out, +#else const int16_t *fadeOut, const int16_t *fadeIn, int16_t *out, +#endif uint16_t n, uint16_t nChannels, const float *fadeOutWin, @@ -90,7 +96,11 @@ void overlapAdd( { float fdOutVal, fdInVal; int16_t i, j, hannIter; +#ifdef JBM_TSM_ON_TCS + float combinedVal; +#else int32_t combinedVal; +#endif for ( j = 0; j < nChannels; j++ ) { @@ -101,8 +111,11 @@ void overlapAdd( fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; fdInVal = fadeIn[i] * fadeInWin[hannIter]; /* round combinedVal value (taking care of sign) */ +#ifdef JBM_TSM_ON_TCS + combinedVal = fdInVal + fdOutVal; + out[i] = combinedVal; +#else combinedVal = (int32_t) ( ( fdInVal + fdOutVal ) + 0.5 ); - if ( fdInVal + fdOutVal < 0.0 ) { combinedVal = (int32_t) ( ( fdInVal + fdOutVal ) - 0.5 ); @@ -117,7 +130,57 @@ void overlapAdd( { combinedVal = MIN16B; } + out[i] = (int16_t) combinedVal; +#endif + hannIter++; + } + } + + return; +} + +void overlapAddEvs( + const float *fadeOut, + const float *fadeIn, + float *out, + uint16_t n, + uint16_t nChannels, + const float *fadeOutWin, + const float *fadeInWin ) +{ + float fdOutVal, fdInVal; + int16_t i, j, hannIter; + float combinedVal; + + for ( j = 0; j < nChannels; j++ ) + { + /* reset Hann window iterator to beginning (both channels use same window) */ + hannIter = 0; + for ( i = j; i < n; i += nChannels ) + { + fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; + fdInVal = fadeIn[i] * fadeInWin[hannIter]; + /* round combinedVal value (taking care of sign) */ + + combinedVal = floorf( ( fdInVal + fdOutVal ) + 0.5f ); + if ( fdInVal + fdOutVal < 0.0 ) + { + combinedVal = ceilf( ( fdInVal + fdOutVal ) - 0.5f ); + } + + /* saturate value */ + if ( combinedVal > MAX16B_FLT ) + { + combinedVal = MAX16B_FLT; + } + else if ( combinedVal < MIN16B_FLT ) + { + combinedVal = MIN16B_FLT; + } + + out[i] = combinedVal; + hannIter++; } } diff --git a/lib_dec/jbm_pcmdsp_window.h b/lib_dec/jbm_pcmdsp_window.h index 67759e9738..8c1823867a 100644 --- a/lib_dec/jbm_pcmdsp_window.h +++ b/lib_dec/jbm_pcmdsp_window.h @@ -61,6 +61,10 @@ void hannWindow( uint16_t n, float *w ); * @param[in] nChannels number of channels * @param[in] fadeOutWin window for fade out * @param[in] fadeInWin window for fade in */ +#ifdef JBM_TSM_ON_TCS +void overlapAdd( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); +void overlapAddEvs( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); +#else void overlapAdd( const int16_t *fadeOut, const int16_t *fadeIn, int16_t *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); - +#endif #endif /* JBM_PCMDSP_WINDOW_H */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index ee315bf399..fd33c41101 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -54,11 +54,27 @@ struct IVAS_DEC_VOIP uint16_t nSamplesFrame; /* Total number of samples in a frame (includes number of channels) */ JB4_HANDLE hJBM; PCMDSP_APA_HANDLE hTimeScaler; - PCMDSP_FIFO_HANDLE hFifoAfterTimeScaler; uint16_t lastDecodedWasActive; - int16_t *apaExecBuffer; /* Buffer for APA scaling */ +#ifdef JBM_TSM_ON_TCS + float *apaExecBuffer; /* Buffer for APA scaling */ +#else + int16_t *apaExecBuffer; /* Buffer for APA scaling */ +#endif JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ +#ifdef VARIABLE_SPEED_DECODING + IVAS_DEC_VOIP_MODE voipMode; + uint16_t speedFac; + bool needNewFrame; +#endif +#ifdef JBM_TSM_ON_TCS + JBM_RENDERER_TYPE rendererType; + PCMDSP_FIFO_HANDLE hFifoOut; + uint8_t nTransportChannelsOld; + uint16_t nSamplesAvailableNext; +#else + PCMDSP_FIFO_HANDLE hFifoAfterTimeScaler; +#endif #ifdef SUPPORT_JBM_TRACEFILE IVAS_JBM_TRACE_DATA JbmTraceData; #endif @@ -93,10 +109,27 @@ static void IVAS_DEC_Close_VoIP( IVAS_DEC_VOIP *hVoIP ); #ifdef SUPPORT_JBM_TRACEFILE static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, const uint32_t systemTimestamp_ms, const uint16_t extBufferedSamples, const int32_t output_Fs ); #endif +#ifdef JBM_TSM_ON_TCS +static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, float *floatBuf, int16_t *pcmBuf ); +#else static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, int16_t *pcmBuf ); +#endif static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); -static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking, const float no_diegetic_pan ); - +#ifdef FIX_439_OTR_PARAMS +static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); +#else +static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking ); +#endif +#ifdef JBM_TSM_ON_TCS +static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas ); +static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( IVAS_DEC_HANDLE hIvasDec ); +static ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t nTransportChannels, const uint16_t l_ts ); +static ivas_error IVAS_DEC_Setup( IVAS_DEC_HANDLE hIvasDec, uint16_t *nTcBufferGranularity, uint8_t *nTransportChannels, uint8_t *nOutChannels, uint16_t *nSamplesRendered, int16_t *data ); +static ivas_error IVAS_DEC_GetTcSamples( IVAS_DEC_HANDLE hIvasDec, float *pcmBuf, int16_t *nOutSamples ); +static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *pcmBuf ); +static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const uint16_t nSamplesForRendering, uint16_t *nSamplesRendered, uint16_t *nSamplesAvailableNext, int16_t *pcmBuf ); +static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, int16_t *nSamplesBuffered ); +#endif /*---------------------------------------------------------------------* * IVAS_DEC_Open() @@ -106,10 +139,13 @@ static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int /* may return an error but may still have allocated memory - thus run Close also in case of error to release memory */ ivas_error IVAS_DEC_Open( - IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ - const IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */ - const int16_t orientation_tracking, /* i : orientation tracking type */ - float no_diegetic_pan ) + IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ + const IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ +#ifndef FIX_439_OTR_PARAMS + , + const int16_t orientation_tracking /* i : orientation tracking type */ +#endif +) { IVAS_DEC_HANDLE hIvasDec; Decoder_Struct *st_ivas; @@ -162,8 +198,11 @@ ivas_error IVAS_DEC_Open( st_ivas = hIvasDec->st_ivas; /* initialize Decoder Config. handle */ - init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, orientation_tracking, no_diegetic_pan ); - +#ifdef FIX_439_OTR_PARAMS + init_decoder_config( hIvasDec->st_ivas->hDecoderConfig ); +#else + init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, orientation_tracking ); +#endif /* initialize pointers to handles to NULL */ ivas_initialize_handles_dec( st_ivas ); @@ -192,7 +231,9 @@ ivas_error IVAS_DEC_Open( st_ivas->writeFECoffset = 0; st_ivas->ism_mode = ISM_MODE_NONE; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; +#endif st_ivas->mc_mode = MC_MODE_NONE; st_ivas->sba_order = 0; @@ -213,9 +254,12 @@ ivas_error IVAS_DEC_Open( *---------------------------------------------------------------------*/ static void init_decoder_config( - DECODER_CONFIG_HANDLE hDecoderConfig, /* i/o: configuration structure */ - const int16_t orientation_tracking, - const float no_diegetic_pan ) + DECODER_CONFIG_HANDLE hDecoderConfig /* i/o: configuration structure */ +#ifndef FIX_439_OTR_PARAMS + , + const int16_t orientation_tracking +#endif +) { hDecoderConfig->Opt_AMR_WB = 0; hDecoderConfig->nchan_out = 1; @@ -224,8 +268,21 @@ static void init_decoder_config( hDecoderConfig->Opt_HRTF_binary = 0; hDecoderConfig->Opt_Headrotation = 0; hDecoderConfig->Opt_RendConfigCustom = 0; +#ifdef FIX_439_OTR_PARAMS + hDecoderConfig->orientation_tracking = HEAD_ORIENT_TRK_NONE; +#else hDecoderConfig->orientation_tracking = orientation_tracking; - hDecoderConfig->no_diegetic_pan = no_diegetic_pan; +#endif + hDecoderConfig->Opt_non_diegetic_pan = 0; + hDecoderConfig->non_diegetic_pan_gain = 0; + +#ifdef JBM_TSM_ON_TCS + hDecoderConfig->voip_active = 0; +#endif + +#ifdef FIX_356_ISM_METADATA_SYNC + hDecoderConfig->Opt_delay_comp = 0; +#endif return; } @@ -388,7 +445,17 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ - const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ +#ifdef FIX_439_OTR_PARAMS + const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ +#endif + const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ +#ifdef FIX_356_ISM_METADATA_SYNC + const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +#else + const float non_diegetic_pan_gain /* i : non diegetic panning gain */ +#endif ) { Decoder_Struct *st_ivas; @@ -406,7 +473,8 @@ ivas_error IVAS_DEC_Configure( return IVAS_ERR_WRONG_PARAMS; } - if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && outputFormat != IVAS_DEC_OUTPUT_MONO ) + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS && !( ( outputFormat == IVAS_DEC_OUTPUT_MONO && Opt_non_diegetic_pan == 0 ) || + ( outputFormat == IVAS_DEC_OUTPUT_STEREO && Opt_non_diegetic_pan == 1 ) ) ) { return IVAS_ERR_WRONG_MODE; } @@ -436,8 +504,16 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_LsCustom = customLsOutputEnabled; hDecoderConfig->Opt_Headrotation = enableHeadRotation; +#ifdef FIX_439_OTR_PARAMS + hDecoderConfig->orientation_tracking = orientation_tracking; +#endif hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; + hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan; + hDecoderConfig->non_diegetic_pan_gain = non_diegetic_pan_gain; +#ifdef FIX_356_ISM_METADATA_SYNC + hDecoderConfig->Opt_delay_comp = delayCompensationEnabled; +#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) @@ -463,7 +539,11 @@ ivas_error IVAS_DEC_Configure( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_EnableVoIP( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef VARIABLE_SPEED_DECODING + const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or variable speed */ + const uint16_t speedFac, /* i : speed factor for variable speed */ +#endif const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ ) @@ -473,21 +553,42 @@ ivas_error IVAS_DEC_EnableVoIP( error = IVAS_ERR_OK; +#ifndef JBM_TSM_ON_TCS /* initialize time scaler and FIFO after time scaler */ uint16_t wss, css; +#endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; hIvasDec->Opt_VOIP = 1; +#ifdef JBM_TSM_ON_TCS + hDecoderConfig->voip_active = 1; +#endif - hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); +#ifdef JBM_TSM_ON_TCS + if ( hDecoderConfig->output_config != AUDIO_CONFIG_EXTERNAL ) + { +#endif + hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); + +#ifdef JBM_TSM_ON_TCS + } +#ifdef VARIABLE_SPEED_DECODING + else + { + hDecoderConfig->nchan_out = 1; + } +#endif +#endif + +#ifndef JBM_TSM_ON_TCS assert( hDecoderConfig->nchan_out > 0 && "EXT output not yet supported in VoIP mode" ); +#endif if ( ( error = input_format_API_to_internal( inputFormat, &hIvasDec->bitstreamformat, &hIvasDec->sdp_hf_only, true ) ) != IVAS_ERR_OK ) { @@ -501,13 +602,32 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->lastDecodedWasActive = 0; hIvasDec->hVoIP->hCurrentDataUnit = NULL; +#ifdef VARIABLE_SPEED_DECODING + hIvasDec->hVoIP->voipMode = voipMode; + hIvasDec->hVoIP->speedFac = speedFac; + hIvasDec->hVoIP->needNewFrame = false; +#endif +#ifdef JBM_TSM_ON_TCS + hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + hIvasDec->hVoIP->nSamplesAvailableNext = 0; + hIvasDec->hVoIP->rendererType = JBM_RENDERER_NONE; + hIvasDec->hVoIP->hFifoOut = NULL; +#else hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs * hDecoderConfig->nchan_out / FRAMES_PER_SEC ); +#endif + +#ifdef JBM_TSM_ON_TCS + /* postpone init of the buffers until we know the real number of TCs*/ + hIvasDec->hVoIP->apaExecBuffer = NULL; + hIvasDec->hVoIP->nTransportChannelsOld = 0; +#else hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( int16_t ) * APA_BUF_PER_CHANNEL * hDecoderConfig->nchan_out ); if ( hIvasDec->hVoIP->apaExecBuffer == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); } +#endif #define WMC_TOOL_SKIP /* Bitstream conversion is not counted towards complexity and memory usage */ @@ -520,15 +640,23 @@ ivas_error IVAS_DEC_EnableVoIP( } /* initialize JBM */ - if ( ( error = JB4_Create( &hIvasDec->hVoIP->hJBM ) != IVAS_ERR_OK ) != IVAS_ERR_OK ) - { - return error; - } - if ( ( error = JB4_Init( hIvasDec->hVoIP->hJBM, jbmSafetyMargin ) ) != IVAS_ERR_OK ) +#ifdef VARIABLE_SPEED_DECODING + hIvasDec->hVoIP->hJBM = NULL; + if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP ) { - return error; +#endif + if ( ( error = JB4_Create( &hIvasDec->hVoIP->hJBM ) != IVAS_ERR_OK ) != IVAS_ERR_OK ) + { + return error; + } + if ( JB4_Init( hIvasDec->hVoIP->hJBM, jbmSafetyMargin ) != 0 ) + { + return IVAS_ERR_FAILED_ALLOC; + } +#ifdef VARIABLE_SPEED_DECODING } - +#endif +#ifndef JBM_TSM_ON_TCS if ( hDecoderConfig->output_Fs == 8000 ) { wss = 1; @@ -553,8 +681,37 @@ ivas_error IVAS_DEC_EnableVoIP( { return IVAS_ERR_INIT_ERROR; } +#endif - if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->nchan_out ) != IVAS_ERR_OK || +#ifdef JBM_TSM_ON_TCS + /* postpone init of time scaler and output FIFO until we know the real number of TCs */ + hIvasDec->hVoIP->hTimeScaler = NULL; +#ifdef VARIABLE_SPEED_DECODING + if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + hIvasDec->hVoIP->needNewFrame = true; + } +#endif +#else +#ifdef VARIABLE_SPEED_DECODING + { + float startQuality = hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f; + if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, + hDecoderConfig->nchan_out ) != IVAS_ERR_OK || + apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || + apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || + apa_set_quality( hIvasDec->hVoIP->hTimeScaler, startQuality, 4, 4 ) != 0 || + pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoAfterTimeScaler ) != 0 || + pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoAfterTimeScaler, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + /* we instantly need a new frame */ + hIvasDec->hVoIP->needNewFrame = true; + } +#else + if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, + hDecoderConfig->nchan_out ) != IVAS_ERR_OK || apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || apa_set_quality( hIvasDec->hVoIP->hTimeScaler, 1, 4, 4 ) != 0 || @@ -563,6 +720,8 @@ ivas_error IVAS_DEC_EnableVoIP( { return IVAS_ERR_INIT_ERROR; } +#endif +#endif return error; } @@ -651,6 +810,13 @@ ivas_error IVAS_DEC_FeedFrame_Serial( st->use_partial_copy = 1; } +#ifdef VARIABLE_SPEED_DECODING + if ( hIvasDec->hVoIP != NULL && hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + hIvasDec->hVoIP->needNewFrame = false; + } +#endif + return error; } @@ -683,7 +849,11 @@ ivas_error IVAS_DEC_GetSamples( if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = evs_dec_main( st_ivas, *nOutSamples, NULL, pcmBuf ) ) != IVAS_ERR_OK ) +#else if ( ( error = evs_dec_main( st_ivas, *nOutSamples, pcmBuf ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -708,6 +878,227 @@ ivas_error IVAS_DEC_GetSamples( } +#ifdef JBM_TSM_ON_TCS +/*---------------------------------------------------------------------* + * IVAS_DEC_Setup( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +static ivas_error IVAS_DEC_Setup( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + uint16_t *nTcBufferGranularity, /* o : granularity of the TC Buffer */ + uint8_t *nTransportChannels, /* o : number of decoded transport PCM channels */ + uint8_t *nOutChannels, /* o : number of decoded out channels (PCM or CLDFB) */ + uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame */ + int16_t *data /* o : flushed samples */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + *nSamplesRendered = 0; + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + if ( hIvasDec->st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + *nTransportChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + *nOutChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; + } + else + { +#endif + *nTransportChannels = 1; + *nOutChannels = 1; +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + } +#endif + } + else + { + Decoder_Struct *st_ivas; + + st_ivas = hIvasDec->st_ivas; + + /*----------------------------------------------------------------* + * IVAS decoder setup + * - read IVAS format signaling + * - read IVAS format specific signaling + * - initialize decoder in the first frame based on IVAS format and number of transport channels + * - reconfigure the decoder when the number of TC or IVAS total bitrate change + *----------------------------------------------------------------*/ + + if ( st_ivas->bfi == 0 ) + { + if ( ( error = ivas_dec_setup( st_ivas, nSamplesRendered, data ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + *nTransportChannels = (uint8_t) st_ivas->hTcBuffer->nchan_transport_jbm; + *nTcBufferGranularity = (uint16_t) st_ivas->hTcBuffer->n_samples_granularity; + *nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; + } + + return error; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetTcSamples( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetTcSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + float *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + int16_t *nOutSamples /* o : number of samples per channel written to output buffer */ +) +{ + Decoder_Struct *st_ivas; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + *nOutSamples = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( ( error = evs_dec_main( st_ivas, *nOutSamples, pcmBuf, NULL ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else if ( hIvasDec->mode == IVAS_DEC_MODE_IVAS ) + { + /* run the main IVAS decoding routine */ + if ( ( error = ivas_jbm_dec_tc( st_ivas, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + hIvasDec->isInitialized = true; /* Initialization done in ivas_dec() */ + } + + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { + hIvasDec->hasDecodedFirstGoodFrame = true; + } + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_Rendered_FeedTcSamples( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_RendererFeedTcSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */ + const int16_t nSamplesForRendering, /* i: : number of TC samples wanted from the renderer */ + int16_t *nSamplesResidual, /* o: : number of samples not fitting into the renderer grid and buffer for the next call*/ + float *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ +) +{ + Decoder_Struct *st_ivas; + + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + /* feed the TCs to the IVAS renderer */ + if ( ( error = ivas_jbm_dec_feed_tc_to_renderer( st_ivas, nSamplesForRendering, nSamplesResidual, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_GetRenderedSamples( ) + * + * Main function to decode to PCM data of the transport channels + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_GetRenderedSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */ + const uint16_t nSamplesForRendering, /* i: : number of TC samples wanted from the renderer */ + uint16_t *nSamplesRendered, /* o : number of samples rendered */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available in the renerer pipeline */ + int16_t *pcmBuf /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ +) +{ + Decoder_Struct *st_ivas; + ivas_error error; + + error = IVAS_ERR_OK; + + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + st_ivas = hIvasDec->st_ivas; + + /* run the main IVAS decoding routine */ + if ( ( error = ivas_jbm_dec_render( st_ivas, nSamplesForRendering, nSamplesRendered, nSamplesAvailableNext, pcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + + return error; +} + +ivas_error IVAS_DEC_GetBufferedNumberOfSamples( + IVAS_DEC_HANDLE hIvasDec, /* i/o : IVAS decoder handle */ + int16_t *nSamplesBuffered /* o : number of samples still buffered */ +) +{ + ivas_error error; + error = IVAS_ERR_OK; + + *nSamplesBuffered = 0; + if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } +#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER + /* check if the TC buffer already exists, otherweise nothing is buffered anyway */ + if ( hIvasDec->st_ivas->hTcBuffer != NULL ) + { +#endif + *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered; +#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER + } +#endif + + return error; +} +#endif + + /*---------------------------------------------------------------------* * IVAS_DEC_GetNumObjects( ) * @@ -830,6 +1221,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( metadata->gainFactor = 1.f; metadata->yaw = 0.f; metadata->pitch = 0.f; + metadata->non_diegetic_flag = 0; } else { @@ -840,6 +1232,7 @@ ivas_error IVAS_DEC_GetObjectMetadata( metadata->pitch = hIsmMeta->pitch; metadata->spread = 0.f; metadata->gainFactor = 1.f; + metadata->non_diegetic_flag = hIsmMeta->non_diegetic_flag; } return IVAS_ERR_OK; @@ -1238,6 +1631,14 @@ ivas_error IVAS_DEC_GetDelay( nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); nSamples[0] = nSamples[1] + nSamples[2]; +#ifdef FIX_MASA_DELAY_PRINTOUT + if ( st_ivas->ivas_format == MASA_FORMAT ) + { + /* note: in MASA, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ + nSamples[1] -= NS2SA( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS ); + } +#endif + *timeScale = hDecoderConfig->output_Fs; return IVAS_ERR_OK; @@ -1429,6 +1830,29 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( return IVAS_ERR_OK; } +#ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_SetScale( ) + * + * Set the TSM scale + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_SetScale( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t scale /* i : TSM scale to set */ +) +{ + ivas_error error; + + error = IVAS_ERR_OK; + + hIvasDec->hVoIP->speedFac = scale; + + return error; +} +#endif +#endif /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_GetSamples( ) @@ -1441,11 +1865,16 @@ ivas_error IVAS_DEC_VoIP_GetSamples( uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ +#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) + , + uint16_t *sampleAvailableNext /* o : samples available for the next call */ +#endif #ifdef SUPPORT_JBM_TRACEFILE , JbmTraceFileWriterFn jbmWriterFn, void *jbmWriter #endif + ) { Decoder_Struct *st_ivas; @@ -1459,6 +1888,12 @@ ivas_error IVAS_DEC_VoIP_GetSamples( int16_t timeScalingDone; int16_t result; ivas_error error; +#ifdef JBM_TSM_ON_TCS + int16_t nSamplesRendered; + uint16_t nSamplesTcsScaled; + uint8_t nTransportChannels; + uint8_t nOutChannels; +#endif error = IVAS_ERR_OK; @@ -1467,133 +1902,508 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hVoIP = hIvasDec->hVoIP; timeScalingDone = 0; - /* TODO(mcjbm): ringbuffer capacity should be configurable by user */ - if ( nSamplesPerChannel > hVoIP->hFifoAfterTimeScaler->capacity || nSamplesPerChannel == 0 ) - { +#ifdef JBM_TSM_ON_TCS + nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; + nTransportChannels = 0; + nSamplesTcsScaled = hVoIP->nSamplesFrame; + nSamplesRendered = 0; +#endif +#ifdef VARIABLE_SPEED_DECODING + scale = hVoIP->speedFac; + maxScaling = hVoIP->speedFac; +#endif + +#ifdef JBM_TSM_ON_TCS + if ( ( hVoIP->hFifoOut != NULL && nSamplesPerChannel > hVoIP->hFifoOut->capacity ) || nSamplesPerChannel == 0 ) +#else + if ( nSamplesPerChannel > hVoIP->hFifoAfterTimeScaler->capacity || nSamplesPerChannel == 0 ) +#endif + { return IVAS_ERR_WRONG_PARAMS; } /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ +#ifdef JBM_TSM_ON_TCS + while ( ( hVoIP->hFifoOut != NULL && pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) < nSamplesPerChannel ) || ( hVoIP->hFifoOut == NULL && nSamplesRendered < nSamplesPerChannel ) ) +#else while ( pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) < nSamplesPerChannel ) +#endif { - extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); - extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; - dataUnit = NULL; - /* pop one access unit from the jitter buffer */ - result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); - if ( result != 0 ) +#ifdef DEBUGGING +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->needNewFrame ) { - return IVAS_ERR_UNKNOWN; + /* we need another bs frame fed into the decoder...*/ + *sampleAvailableNext = 0; + return IVAS_ERR_VS_FRAME_NEEDED; } +#endif +#endif - maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000; - /* avoid time scaling multiple times in one sound card slot */ - if ( scale != 100U ) +#ifdef JBM_TSM_ON_TCS + if ( hVoIP->nSamplesAvailableNext == 0 ) { - if ( timeScalingDone ) + if ( hVoIP->hFifoOut ) { - scale = 100; + extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ); + nSamplesRendered = extBufferedSamples; } else { - timeScalingDone = 1; + int16_t nSamplesBuffered; + nSamplesBuffered = 0; +#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER + if ( hIvasDec->hasDecodedFirstGoodFrame ) +#else + if ( hIvasDec->hasBeenFedFirstGoodFrame ) +#endif + { + IVAS_DEC_GetBufferedNumberOfSamples( hIvasDec, &nSamplesBuffered ); + } + extBufferedSamples = nSamplesRendered + nSamplesBuffered; } - } +#else + extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); +#endif + extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; - /* copy bitstream into decoder state */ - if ( dataUnit ) - { - hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + dataUnit = NULL; - bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); - IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ); - } - else if ( hIvasDec->hasDecodedFirstGoodFrame ) - { - /* Decoder has been initialized with first good frame - do PLC */ - IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ); - } +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP ) + { +#endif + /* pop one access unit from the jitter buffer */ + result = JB4_PopDataUnit( hVoIP->hJBM, systemTimestamp_ms, extBufferedTime_ms, &dataUnit, &scale, &maxScaling ); + if ( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } +#ifdef VARIABLE_SPEED_DECODING + } + else if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + scale = hVoIP->speedFac; + maxScaling = hVoIP->speedFac; + } +#ifdef DEBUGGING + else + { + assert( "Wrong VoIP mode!\n" && 0 ); + } +#endif +#endif - /* decode */ - if ( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - /* codec mode to use not known yet - simply output silence */ + maxScaling = maxScaling * hDecoderConfig->output_Fs / 1000; + /* avoid time scaling multiple times in one sound card slot */ + if ( scale != 100U ) + { + if ( timeScalingDone ) + { + scale = 100; + } + else + { + timeScalingDone = 1; + } + } + +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP ) + { +#endif + /* copy bitstream into decoder state */ + if ( dataUnit ) + { + hIvasDec->hVoIP->hCurrentDataUnit = dataUnit; + + bsCompactToSerial( dataUnit->data, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize ); + IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, dataUnit->dataSize, 0 ); + } + else if ( hIvasDec->hasDecodedFirstGoodFrame ) + { + /* Decoder has been initialized with first good frame - do PLC */ + IVAS_DEC_FeedFrame_Serial( hIvasDec, hIvasDec->hVoIP->bs_conversion_buf, 0, 1 ); + } +#ifdef VARIABLE_SPEED_DECODING + } +#endif + + /* decode */ + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + /* codec mode to use not known yet - simply output silence */ +#ifdef JBM_TSM_ON_TCS + nSamplesTcsScaled = hVoIP->nSamplesFrame; + if ( hVoIP->hFifoOut != NULL ) + { +#ifdef DEBUGGING + /* feed zeros to FIFO */ + if ( pcmdsp_fifo_write_zero( hVoIP->hFifoOut, nSamplesTcsScaled ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } +#endif + } + else + { + /* directly set output zero */ + set_s( pcmBuf, 0, nSamplesPerChannel * nOutChannels ); + } + nSamplesRendered = nSamplesTcsScaled; +#else set_s( hVoIP->apaExecBuffer, 0, hVoIP->nSamplesFrame ); /* TODO(mcjbm): Could be optimized: just write directly to output buffer */ - } - else - { +#endif + } + else + { + +#ifdef JBM_TSM_ON_TCS + uint16_t l_ts = 1; + uint16_t nSamplesRendered_loop; + + /* setup ivas decoder and get the number of TCs */ + /* might render some remaining samples from the previous frame too if the renderer granularity changed */ + if ( hVoIP->hFifoOut ) + { + int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; + if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, rendererPcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesRendered_loop ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + else + { + if ( ( error = IVAS_DEC_Setup( hIvasDec, &l_ts, &nTransportChannels, &nOutChannels, &nSamplesRendered_loop, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + nSamplesRendered += nSamplesRendered_loop; + if ( nTransportChannels != hVoIP->nTransportChannelsOld ) + { + IVAS_DEC_VoIP_reconfigure( hIvasDec, nTransportChannels, l_ts ); + } + + /* decode TCs only */ + if ( ( error = IVAS_DEC_GetTcSamples( hIvasDec, hVoIP->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK ) + { + return error; + } +#else if ( ( error = IVAS_DEC_GetSamples( hIvasDec, hVoIP->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK ) { return error; } +#endif + } + +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VOIP ) + { +#endif + if ( dataUnit ) + { + if ( dataUnit->partial_frame != 0 ) + { + hVoIP->lastDecodedWasActive = 1; + } + else + { + hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + } + /* data unit memory is no longer used */ + JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); + } +#ifdef VARIABLE_SPEED_DECODING + } + else + { + hVoIP->lastDecodedWasActive = 1; + } +#endif + + /* limit scale to range supported by time scaler */ + if ( scale < APA_MIN_SCALE ) + { + scale = APA_MIN_SCALE; + } + else if ( scale > APA_MAX_SCALE ) + { + scale = APA_MAX_SCALE; + } + + /* apply time scaling on decoded/concealed samples */ +#ifdef JBM_TSM_ON_TCS + if ( hIvasDec->hasBeenFedFirstGoodFrame ) + { +#endif + if ( apa_set_scale( hVoIP->hTimeScaler, (uint16_t) scale ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } +#ifdef JBM_TSM_ON_TCS + result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame * nTransportChannels, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples ); +#else + result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples ); +#endif + if ( result != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + assert( nTimeScalerOutSamples <= APA_BUF ); + +#ifdef JBM_TSM_ON_TCS + nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; +#else + /* append scaled samples to FIFO */ + if ( pcmdsp_fifo_write( hVoIP->hFifoAfterTimeScaler, (uint8_t *) hVoIP->apaExecBuffer, (uint16_t) ( nTimeScalerOutSamples / hDecoderConfig->nchan_out ) ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + int16_t nSamplesAvailable = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); + if ( nSamplesAvailable < nSamplesPerChannel ) + { + hVoIP->needNewFrame = true; + } + } +#endif +#endif + +#ifdef JBM_TSM_ON_TCS + if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE ) + { + /* render IVAS frames */ + int16_t nResidualSamples; + + if ( ( error = IVAS_DEC_RendererFeedTcSamples( hIvasDec, nSamplesTcsScaled, &nResidualSamples, hVoIP->apaExecBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + + /* feed residual samples to TSM for the next call */ + if ( apa_set_renderer_residual_samples( hVoIP->hTimeScaler, (uint16_t) nResidualSamples ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + } + else + { + /* inplace float->int16_t conversion*/ +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + syn_output( hVoIP->apaExecBuffer, nTimeScalerOutSamples, (int16_t *) hVoIP->apaExecBuffer ); + + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) hVoIP->apaExecBuffer, nSamplesTcsScaled ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } + nSamplesRendered = nSamplesTcsScaled; + } + } +#endif +#ifdef SUPPORT_JBM_TRACEFILE + /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ + if ( jbmWriterFn != NULL && jbmWriter != NULL ) + { + /* write JBM trace data entry */ + store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); + if ( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError writing JBM Trace data to file\n" ); + return IVAS_ERR_UNKNOWN; + } + } +#endif +#ifdef JBM_TSM_ON_TCS } - if ( dataUnit ) + if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE ) { - if ( dataUnit->partial_frame != 0 ) + uint16_t nSamplesRendered_loop; + int16_t nSamplesToRender; + if ( hVoIP->hFifoOut ) { - hVoIP->lastDecodedWasActive = 1; + int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; + + nSamplesToRender = nSamplesPerChannel - pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ); + + /* render IVAS frames */ + if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hVoIP->nSamplesAvailableNext, rendererPcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesRendered_loop ) != 0 ) + { + return IVAS_ERR_UNKNOWN; + } } else { - hVoIP->lastDecodedWasActive = !dataUnit->silenceIndicator; + nSamplesToRender = nSamplesPerChannel - nSamplesRendered; + + /* render IVAS frames directly to the output buffer */ + if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesRendered_loop, &hVoIP->nSamplesAvailableNext, pcmBuf + nSamplesRendered * nOutChannels ) ) != IVAS_ERR_OK ) + { + return error; + } } - /* data unit memory is no longer used */ - JB4_FreeDataUnit( hVoIP->hJBM, dataUnit ); - } - /* limit scale to range supported by time scaler */ - if ( scale < APA_MIN_SCALE ) + nSamplesRendered += nSamplesRendered_loop; + +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext == 0 ) + { + hVoIP->needNewFrame = true; + } +#endif + } + else if ( !hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->hFifoOut == NULL ) { - scale = APA_MIN_SCALE; + hVoIP->nSamplesAvailableNext = 0; } - else if ( scale > APA_MAX_SCALE ) + else { - scale = APA_MAX_SCALE; + hVoIP->nSamplesAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) - nSamplesPerChannel ); + +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED && hVoIP->nSamplesAvailableNext < nSamplesPerChannel ) + { + hVoIP->needNewFrame = true; + } +#endif + + hVoIP->nSamplesAvailableNext = 0; } +#endif + } - /* apply time scaling on decoded/concealed samples */ - if ( apa_set_scale( hVoIP->hTimeScaler, (uint16_t) scale ) != 0 ) + /* fetch a user-specified number of samples from FIFO */ +#if defined( JBM_TSM_ON_TCS ) + if ( hVoIP->hFifoOut ) + { + if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) +#else + if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) +#endif { return IVAS_ERR_UNKNOWN; } - result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples ); - if ( result != 0 ) +#ifdef JBM_TSM_ON_TCS + } +#endif + +#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) +#ifdef JBM_TSM_ON_TCS + *sampleAvailableNext = hVoIP->nSamplesAvailableNext; +#else + *sampleAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) ); +#ifdef VARIABLE_SPEED_DECODING + if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + if ( *sampleAvailableNext < nSamplesPerChannel ) + { + hVoIP->needNewFrame = true; + } + } +#endif +#endif +#endif + + return error; +} + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_Flush( ) + * + * Function to flush remaining audio in VoIP + *---------------------------------------------------------------------*/ + +#if defined( VARIABLE_SPEED_DECODING ) || defined( JBM_TSM_ON_TCS ) +ivas_error IVAS_DEC_VoIP_Flush( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ + int16_t *nSamplesFlushed /* o : number of samples flushed */ +) +{ + ivas_error error; + IVAS_DEC_VOIP *hVoIP; +#ifdef JBM_TSM_ON_TCS + int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; + uint16_t nSamplesToRender; + uint16_t nSamplesFlushedLocal; +#endif + + error = IVAS_ERR_OK; + + hVoIP = hIvasDec->hVoIP; +#if defined( JBM_TSM_ON_TCS ) + *nSamplesFlushed = min( nSamplesPerChannel, hVoIP->nSamplesAvailableNext ); +#else + *nSamplesFlushed = min( nSamplesPerChannel, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) ); +#endif + +#ifdef JBM_TSM_ON_TCS + if ( hVoIP->rendererType == JBM_RENDERER_NONE ) + { +#endif + /* fetch a user-specified number of samples from FIFO */ +#if defined( JBM_TSM_ON_TCS ) + if ( pcmdsp_fifo_read( hVoIP->hFifoOut, *nSamplesFlushed, (uint8_t *) pcmBuf ) != 0 ) +#else + if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, *nSamplesFlushed, (uint8_t *) pcmBuf ) != 0 ) +#endif { return IVAS_ERR_UNKNOWN; } - assert( nTimeScalerOutSamples <= APA_BUF ); +#if defined( JBM_TSM_ON_TCS ) + hVoIP->nSamplesAvailableNext -= *nSamplesFlushed; + *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext; +#else + *nSamplesAvailableNext = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); +#endif +#ifdef JBM_TSM_ON_TCS + } + else + { + nSamplesToRender = (uint16_t) *nSamplesFlushed; + /* render IVAS frames */ + if ( ( error = IVAS_DEC_GetRenderedSamples( hIvasDec, nSamplesToRender, &nSamplesFlushedLocal, &hVoIP->nSamplesAvailableNext, rendererPcmBuf ) ) != IVAS_ERR_OK ) + { + return error; + } - /* append scaled samples to FIFO */ - if ( pcmdsp_fifo_write( hVoIP->hFifoAfterTimeScaler, (uint8_t *) hVoIP->apaExecBuffer, (uint16_t) ( nTimeScalerOutSamples / hDecoderConfig->nchan_out ) ) != 0 ) + if ( pcmdsp_fifo_write( hVoIP->hFifoOut, (uint8_t *) rendererPcmBuf, nSamplesFlushedLocal ) != 0 ) { return IVAS_ERR_UNKNOWN; } -#ifdef SUPPORT_JBM_TRACEFILE - /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ - if ( jbmWriterFn != NULL && jbmWriter != NULL ) + if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesFlushedLocal, (uint8_t *) pcmBuf ) != 0 ) { - /* write JBM trace data entry */ - store_JbmData( hVoIP, dataUnit, systemTimestamp_ms, extBufferedSamples, hDecoderConfig->output_Fs ); - if ( ( jbmWriterFn( &hVoIP->JbmTraceData, jbmWriter ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError writing JBM Trace data to file\n" ); - return IVAS_ERR_UNKNOWN; - } + return IVAS_ERR_UNKNOWN; } -#endif - } - /* fetch a user-specified number of samples from FIFO */ - if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) - { - return IVAS_ERR_UNKNOWN; + *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext; + *nSamplesFlushed = (int16_t) nSamplesFlushedLocal; } +#endif return error; } +#endif /*---------------------------------------------------------------------* @@ -1604,9 +2414,17 @@ ivas_error IVAS_DEC_VoIP_GetSamples( bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +#ifdef JBM_TSM_ON_TCS + , + const int16_t nSamplesAsked +#endif ) { +#ifdef JBM_TSM_ON_TCS + return ( ( JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0 ) && ( hIvasDec->hVoIP->nSamplesAvailableNext < nSamplesAsked ) ); +#else return JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0; +#endif } @@ -1647,7 +2465,11 @@ static void IVAS_DEC_Close_VoIP( apa_exit( &hVoIP->hTimeScaler ); +#ifdef JBM_TSM_ON_TCS + pcmdsp_fifo_destroy( &hVoIP->hFifoOut ); +#else pcmdsp_fifo_destroy( &hVoIP->hFifoAfterTimeScaler ); +#endif if ( hVoIP->apaExecBuffer != NULL ) { @@ -1744,55 +2566,7 @@ const char *IVAS_DEC_GetErrorMessage( ivas_error error /* i : decoder error code enum */ ) { - switch ( error ) - { - case IVAS_ERR_OK: - return "no error"; - case IVAS_ERR_FAILED_ALLOC: - return "Failed allocation error"; - case IVAS_ERR_WRONG_PARAMS: - return "wrong parameters"; - case IVAS_ERR_INIT_ERROR: - return "initialization error"; - case IVAS_ERR_INVALID_BITSTREAM: - return "Invalid bitstream"; - case IVAS_ERR_DECODER_ERROR: - return "decoder error"; - case IVAS_ERR_WRONG_MODE: - return "wrong mode"; - case IVAS_ERR_INVALID_OUTPUT_FORMAT: - return "invalid output format"; - case IVAS_ERR_INVALID_SAMPLING_RATE: - return "invalid sampling rate"; - case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: - return "head rotation not supported"; - case IVAS_ERR_INVALID_HRTF: - return "Not supported HRTF filter set"; - case IVAS_ERR_INVALID_INPUT_FORMAT: - return "invalid format of input bitstream"; - case IVAS_ERR_INVALID_INDEX: - return "invalid index"; - case IVAS_ERR_INTERNAL: - case IVAS_ERR_INTERNAL_FATAL: - return "internal error"; - case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED: - return "reconfigure not supported"; - case IVAS_ERR_UNEXPECTED_NULL_POINTER: - return "unexpected NULL pointer"; -#ifdef DEBUGGING - case IVAS_ERR_INVALID_FORCE_MODE: - return "invalid force mode"; -#endif - case IVAS_ERR_FAILED_FILE_READ: - return "could not read from file"; - case IVAS_ERR_NOT_IMPLEMENTED: - return "not implemented"; - case IVAS_ERR_UNKNOWN: - default: - break; - } - - return "unknown error"; + return ivas_error_to_string( error ); } @@ -1923,12 +2697,20 @@ static ivas_error printConfigInfo_dec( } /*-----------------------------------------------------------------* - * Print number of output configuration + * Print output configuration *-----------------------------------------------------------------*/ if ( st_ivas->ivas_format == MONO_FORMAT ) { - fprintf( stdout, "Output configuration: mono EVS bit-exact decoding\n" ); + if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + fprintf( stdout, "Output configuration: mono EVS bit-exact decoding to stereo\n" ); + fprintf( stdout, "Non-diegetic panning: %.2f\n", st_ivas->hDecoderConfig->non_diegetic_pan_gain * 90.f ); + } + else + { + fprintf( stdout, "Output configuration: mono EVS bit-exact decoding\n" ); + } } else { @@ -1967,6 +2749,7 @@ static ivas_error printConfigInfo_dec( fprintf( stdout, "Input configuration: %s\n", config_str ); } } + get_channel_config( st_ivas->hDecoderConfig->output_config, &config_str[0] ); fprintf( stdout, "Output configuration: %s\n", config_str ); @@ -1985,6 +2768,28 @@ static ivas_error printConfigInfo_dec( fprintf( stdout, "Head rotation: ON\n" ); } +#ifdef FIX_439_OTR_PARAMS + if ( st_ivas->hDecoderConfig->orientation_tracking != HEAD_ORIENT_TRK_NONE ) + { + switch ( st_ivas->hDecoderConfig->orientation_tracking ) + { + case HEAD_ORIENT_TRK_AVG: + fprintf( stdout, "Orientation tracking: AVG\n" ); + break; + case HEAD_ORIENT_TRK_REF: + fprintf( stdout, "Orientation tracking: REF\n" ); + break; + case HEAD_ORIENT_TRK_REF_VEC: + fprintf( stdout, "Orientation tracking: REF_VEC\n" ); + break; + case HEAD_ORIENT_TRK_REF_VEC_LEV: + fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" ); + break; + default: + break; + } + } +#else if ( st_ivas->hDecoderConfig->orientation_tracking != IVAS_ORIENT_TRK_NONE ) { switch ( st_ivas->hDecoderConfig->orientation_tracking ) @@ -2003,7 +2808,24 @@ static ivas_error printConfigInfo_dec( break; } } +#endif + + if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) + { + fprintf( stdout, "Non-diegetic panning: %.2f\n", st_ivas->hDecoderConfig->non_diegetic_pan_gain * 90.f ); + } + } + +#ifdef JBM_TSM_ON_TCS + /*-----------------------------------------------------------------* + * Print VoIP mode info + *-----------------------------------------------------------------*/ + + if ( st_ivas->hDecoderConfig->voip_active ) + { + fprintf( stdout, "VoIP mode: ON\n" ); } +#endif return IVAS_ERR_OK; } @@ -2103,10 +2925,18 @@ void IVAS_DEC_PrintDisclaimer( void ) static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, +#ifdef JBM_TSM_ON_TCS + float *floatBuf, +#endif int16_t *pcmBuf ) { DEC_CORE_HANDLE *hCoreCoder; - float output[L_FRAME48k]; + float output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN][L_FRAME48k]; + float mixer_left, mixer_rigth; +#ifdef JBM_TSM_ON_TCS + float *p_output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; + int16_t ch; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -2116,19 +2946,26 @@ static ivas_error evs_dec_main( mdct_switching_dec( hCoreCoder[0] ); +#ifdef JBM_TSM_ON_TCS + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; ch++ ) + { + p_output[ch] = output[ch]; + } +#endif + /* run the main EVS decoding routine */ if ( hCoreCoder[0]->codec_mode == MODE1 ) { if ( hCoreCoder[0]->Opt_AMR_WB ) { - if ( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output ) ) != IVAS_ERR_OK ) + if ( ( error = amr_wb_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0] ) ) != IVAS_ERR_OK ) { return error; } } else { - if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) { return error; } @@ -2138,21 +2975,21 @@ static ivas_error evs_dec_main( { if ( hCoreCoder[0]->bfi == 0 ) { - if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_NORMAL ) ) != IVAS_ERR_OK ) { return error; } } else if ( hCoreCoder[0]->bfi == 2 ) { - if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_FUTURE ) ) != IVAS_ERR_OK ) { return error; } } else { - if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output, FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) + if ( ( error = evs_dec( hCoreCoder[0], st_ivas->mem_hp20_out[0], output[0], FRAMEMODE_MISSING ) ) != IVAS_ERR_OK ) { return error; } @@ -2161,11 +2998,45 @@ static ivas_error evs_dec_main( st_ivas->BER_detect = hCoreCoder[0]->BER_detect; - /* convert 'float' output data to 'short' */ + if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) + { + mixer_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; + mixer_rigth = 1.f - mixer_left; + v_multc( output[0], mixer_rigth, output[1], nOutSamples ); + v_multc( output[0], mixer_left, output[0], nOutSamples ); + } + +#ifdef JBM_TSM_ON_TCS + if ( floatBuf != NULL ) + { + /* BE workaround */ +#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING + int16_t pcm_buf_local[L_FRAME48k * MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; +#else + int16_t pcm_buf_local[L_FRAME48k]; +#endif + + /* convert 'float' output data to 'short' */ +#ifdef DEBUGGING + st_ivas->noClipping += +#endif + ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcm_buf_local ); + mvs2r( pcm_buf_local, floatBuf, nOutSamples * st_ivas->hDecoderConfig->nchan_out ); + } + else + { +#endif #ifdef DEBUGGING - st_ivas->noClipping += + st_ivas->noClipping += +#endif +#ifdef JBM_TSM_ON_TCS + ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); +#else + ivas_syn_output( output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); +#endif +#ifdef JBM_TSM_ON_TCS + } #endif - syn_output( output, nOutSamples, pcmBuf ); return error; } @@ -2351,9 +3222,179 @@ static ivas_error input_format_API_to_internal( *sdp_hf_only = 1; break; default: +#ifdef FIX_510 + return IVAS_ERR_INVALID_BITSTREAM; +#else return IVAS_ERR_INVALID_INPUT_FORMAT; +#endif break; } return IVAS_ERR_OK; } + + +#ifdef JBM_TSM_ON_TCS +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetRenderGranularity() + * + * + *---------------------------------------------------------------------*/ + +static int16_t IVAS_DEC_VoIP_GetRenderGranularity( + Decoder_Struct *st_ivas ) +{ + + return st_ivas->hTcBuffer->n_samples_granularity; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_GetRendererConfig() + * + * + *---------------------------------------------------------------------*/ + +static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( + IVAS_DEC_HANDLE hIvasDec ) +{ + JBM_RENDERER_TYPE rendererType; + rendererType = JBM_RENDERER_NONE; + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + rendererType = JBM_RENDERER_NONE; + } + else + { + rendererType = JBM_RENDERER_IVAS; + } + + return rendererType; +} + + +/*---------------------------------------------------------------------* + * IVAS_DEC_VoIP_reconfigure() + * + * + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_VoIP_reconfigure( + IVAS_DEC_HANDLE hIvasDec, + const uint16_t nTransportChannels, + const uint16_t l_ts ) +{ + + IVAS_DEC_VOIP *hVoIP; + ivas_error error; + + hVoIP = hIvasDec->hVoIP; + + if ( hIvasDec->hVoIP->hTimeScaler == NULL ) + { + + uint16_t wss, css; + float startQuality; + DECODER_CONFIG_HANDLE hDecoderConfig; + +#ifdef VARIABLE_SPEED_DECODING + startQuality = hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f; +#else + startQuality = 1.0f; +#endif + + /* get current renderer type*/ + hVoIP->rendererType = IVAS_DEC_VoIP_GetRendererConfig( hIvasDec ); + hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; + if ( hDecoderConfig->output_Fs == 8000 ) + { + wss = 1; + css = 1; + } + else if ( hDecoderConfig->output_Fs == 16000 ) + { + wss = 2; + css = 1; + } + else if ( hDecoderConfig->output_Fs == 32000 ) + { + wss = 4; + css = 2; + } + else if ( hDecoderConfig->output_Fs == 48000 ) + { + wss = 6; + css = 3; + } + else + { + return IVAS_ERR_INIT_ERROR; + } + + if ( ( hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + } + set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels ); + + if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, + nTransportChannels ) != IVAS_ERR_OK || + apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || + apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || + apa_set_quality( hIvasDec->hVoIP->hTimeScaler, startQuality, 4, 4 ) != 0 || + apa_set_renderer_granularity( hIvasDec->hVoIP->hTimeScaler, l_ts ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + + if ( hVoIP->hFifoOut == NULL && hVoIP->rendererType == JBM_RENDERER_NONE ) + { + /* we still need the FIFO out buffer */ + if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 || + pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } +#ifdef VARIABLE_SPEED_DECODING + else if ( hIvasDec->hVoIP->voipMode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) + { + if ( pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoOut ) != 0 || + pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoOut, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } +#endif + + if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) + { + if ( apa_set_evs_compat_mode( hIvasDec->hVoIP->hTimeScaler, true ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + } + } + else + { + if ( apa_reconfigure( hVoIP->hTimeScaler, nTransportChannels, l_ts ) != 0 ) + { + return IVAS_ERR_INIT_ERROR; + } + + /* realloc apa_exe_buffer */ + free( hIvasDec->hVoIP->apaExecBuffer ); + if ( ( hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( float ) * APA_BUF_PER_CHANNEL * nTransportChannels ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); + } + set_zero( hIvasDec->hVoIP->apaExecBuffer, APA_BUF_PER_CHANNEL * nTransportChannels ); + } + hIvasDec->hVoIP->nTransportChannelsOld = (uint8_t) nTransportChannels; + + error = IVAS_ERR_OK; + + return error; +} +#endif diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 17af564295..0539d75188 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -36,7 +36,6 @@ #include "common_api_types.h" #include - /*---------------------------------------------------------------------* * Decoder enums *---------------------------------------------------------------------*/ @@ -77,6 +76,22 @@ typedef enum IVAS_DEC_INPUT_FORMAT_RTPDUMP_HF = 4, /* RTP payload: only Header-Full format without zero padding for size collision avoidance */ } IVAS_DEC_INPUT_FORMAT; +typedef enum _IVAS_DEC_COMPLEXITY_LEVEL +{ + IVAS_DEC_COMPLEXITY_LEVEL_ONE = 1, + IVAS_DEC_COMPLEXITY_LEVEL_TWO = 2, + IVAS_DEC_COMPLEXITY_LEVEL_THREE = 3 +} IVAS_DEC_COMPLEXITY_LEVEL; + + +#ifdef VARIABLE_SPEED_DECODING +typedef enum +{ + IVAS_DEC_VOIP_MODE_VOIP = 0, + IVAS_DEC_VOIP_MODE_VARIABLE_SPEED = 1 +} IVAS_DEC_VOIP_MODE; +#endif + #ifdef DEBUGGING typedef enum _IVAS_DEC_FORCED_REND_MODE { @@ -117,9 +132,11 @@ typedef ivas_error ( *JbmTraceFileWriterFn )( const void *data, void *writer ); /*! r: error code */ ivas_error IVAS_DEC_Open( IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ - IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */ - const int16_t orientation_tracking, /* i : orientation tracking type */ - float no_diegetic_pan + IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ +#ifndef FIX_439_OTR_PARAMS + , + const int16_t orientation_tracking /* i : orientation tracking type */ +#endif ); /*! r: error code */ @@ -130,7 +147,17 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ - const int16_t renderConfigEnabled /* i : enable Renderer config. file for binaural output */ +#ifdef FIX_439_OTR_PARAMS + const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ +#endif + const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ +#ifdef FIX_356_ISM_METADATA_SYNC + const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ + const int16_t delayCompensationEnabled /* i : enable delay compensation */ +#else + const float non_diegetic_pan_gain /* i : non diegetic panning gain */ +#endif ); void IVAS_DEC_Close( @@ -199,23 +226,51 @@ ivas_error IVAS_DEC_VoIP_FeedFrame( const bool qBit /* i : Q bit for AMR-WB IO */ ); +#ifdef VARIABLE_SPEED_DECODING +#ifdef DEBUGGING +/*! r: error code */ +ivas_error IVAS_DEC_VoIP_SetScale( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t scale /* i : TSM scale to set */ +); +#endif +#endif + /*! r: error code */ ivas_error IVAS_DEC_VoIP_GetSamples( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ +#if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING ) + , + uint16_t *sampleAvailableNext /* o : samples available for the next call */ +#endif #ifdef SUPPORT_JBM_TRACEFILE , JbmTraceFileWriterFn jbmWriterFn, void* jbmWriter #endif ); +#if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING ) +ivas_error IVAS_DEC_VoIP_Flush( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ + int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ + uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ + int16_t *nSamplesFlushed /* o : number of samples flushed */ +); +#endif + /* Setter functions - apply changes to decoder configuration */ /*! r: error code */ ivas_error IVAS_DEC_EnableVoIP( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ +#ifdef VARIABLE_SPEED_DECODING + const IVAS_DEC_VOIP_MODE voipMode, /* i : VoIP or variable speed */ + const uint16_t speedFac, /* i : speed factor for variable speed */ +#endif const int16_t jbmSafetyMargin, /* i : allowed delay reserve for JBM, in milliseconds */ const IVAS_DEC_INPUT_FORMAT inputFormat /* i : format of the input bitstream */ ); @@ -331,6 +386,10 @@ ivas_error IVAS_DEC_GetPcmFrameSize( /*! r: true if decoder has no data in VoIP jitter buffer */ bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ +#ifdef JBM_TSM_ON_TCS + , + const int16_t nSamplesAsked +#endif ); ivas_error IVAS_DEC_VoIP_Get_CA_offset( diff --git a/lib_dec/lsf_dec.c b/lib_dec/lsf_dec.c index 6aa31243af..73f8933daf 100644 --- a/lib_dec/lsf_dec.c +++ b/lib_dec/lsf_dec.c @@ -43,10 +43,8 @@ #include "rom_com.h" #include "prot.h" #include "basop_proto_func.h" -#ifdef LSF_RE_USE_SECONDARY_CHANNEL #include "ivas_prot.h" #include "ivas_rom_com.h" -#endif #include "wmc_auto.h" @@ -74,10 +72,8 @@ void lsf_dec( float *lsp_new, /* o : de-quantized LSP vector */ float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ const int16_t tdm_low_rate_mode /* i : secondary channel low rate mode flag */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL , const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ) { int16_t i, nBits, coder_type, no_param_lpc; @@ -132,12 +128,8 @@ void lsf_dec( } /* LSF de-quantization */ - lsf_end_dec( st, coder_type, st->bwidth, nBits, lsf_new, param_lpc, LSF_Q_prediction, &no_param_lpc -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - , - tdm_lsfQ_PCh -#endif - ); + lsf_end_dec( st, coder_type, st->bwidth, nBits, lsf_new, param_lpc, LSF_Q_prediction, &no_param_lpc, + tdm_lsfQ_PCh ); /* convert quantized LSFs to LSPs */ lsf2lsp( lsf_new, lsp_new, M, st->sr_core ); @@ -267,10 +259,8 @@ void lsf_end_dec( int16_t *lpc_param, /* i : LPC parameters */ int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ int16_t *nb_indices /* o : number of indices */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL , const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ) { float pred0[M]; /* Prediction for the safety-net quantizer (usually mean)*/ @@ -292,18 +282,13 @@ void lsf_end_dec( int16_t nBits; int16_t coder_type; int16_t flag_1bit_gran; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL float pred3[M]; -#endif flag_1bit_gran = ( st->element_mode > EVS_MONO ); nBits = nBits_in; *nb_indices = 0; - if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1 -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */ -#endif + if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1 && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */ ) { coder_type = get_next_indice( st, 1 ); @@ -346,13 +331,11 @@ void lsf_end_dec( p_lpc_param = lpc_param; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) { /* if secondary channel predmode is set to be > 2 */ predmode += 3; } -#endif if ( predmode == 0 ) { @@ -380,7 +363,6 @@ void lsf_end_dec( st->safety_net = safety_net; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL /* Make sure there are the correct bit allocations */ if ( st->idchan == 1 && predmode > 2 ) { @@ -390,7 +372,6 @@ void lsf_end_dec( mvs2s( levels1, levels0, stages0 ); mvs2s( bits1, bits0, stages0 ); } -#endif /*--------------------------------------------------------------------------* * Read indices from array @@ -535,18 +516,15 @@ void lsf_end_dec( pred1[i] = pred0[i] + MU_MA * st->mem_MA[i]; } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */ if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) { tdm_SCh_LSF_intra_pred( st->element_brate, tdm_lsfQ_PCh, pred3 ); } -#endif if ( safety_net ) { /* LVQ */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) { @@ -559,33 +537,24 @@ void lsf_end_dec( } else { -#endif st->BER_detect = st->BER_detect | vq_dec_lvq( 1, qlsf, &lindice[1], stages0, M, mode_lvq, levels0[stages0 - 1] ); v_add( qlsf, pred0, qlsf, M ); v_sub( qlsf, pred1, st->mem_MA, M ); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL } -#endif } else { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( predmode == 4 ) { mode_lvq_p = 9; predmode = 2; } -#endif st->BER_detect = st->BER_detect | vq_dec_lvq( 0, qlsf, &lindice[1], stages1, M, mode_lvq_p, levels1[stages1 - 1] ); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( predmode == 1 || ( predmode == 4 ) ) /* MA only */ -#else - if ( predmode == 1 ) /* MA only */ -#endif { mvr2r( qlsf, st->mem_MA, M ); v_add( qlsf, pred1, qlsf, M ); diff --git a/lib_dec/lsf_msvq_ma_dec.c b/lib_dec/lsf_msvq_ma_dec.c index ede93bb162..9c911ab5f6 100644 --- a/lib_dec/lsf_msvq_ma_dec.c +++ b/lib_dec/lsf_msvq_ma_dec.c @@ -187,11 +187,7 @@ int16_t D_lsf_tcxlpc( NumIndices = 1; -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_q, lsf_q_ind ); -#else - msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, indices + NumIndices, lsf_q, lsf_q_ind ); -#endif NumIndices += TCXLPC_NUMSTAGES; @@ -200,11 +196,7 @@ int16_t D_lsf_tcxlpc( /* Only add contribution if flag is enabled */ -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_dec( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, TCXLPC_IND_NUMSTAGES, M, M, indices + NumIndices, 0, NULL, lsf_rem_q, lsf_rem_q_ind ); -#else - msvq_dec( lsf_ind_codebook[narrowband][cdk], lsf_ind_dims, lsf_ind_offs, TCXLPC_IND_NUMSTAGES, M, M, indices + NumIndices, lsf_rem_q, lsf_rem_q_ind ); -#endif NumIndices += TCXLPC_IND_NUMSTAGES; /* Add to MA-removed vector */ @@ -273,11 +265,7 @@ int16_t dec_lsf_tcxlpc( } /* Decode independent lsf */ -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, flag + 1, 0, NULL, lsf_q_ignored, lsf_q_ind ); -#else - msvq_dec( lsf_codebook[narrowband][cdk], lsf_dims, lsf_offs, TCXLPC_NUMSTAGES, M, M, flag + 1, lsf_q_ignored, lsf_q_ind ); -#endif /* Update flag */ *flag = lsf_ind_is_active( lsf_q_ind, lsf_means[narrowband], narrowband, cdk ); diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 13fed9573b..c971cf0e21 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -98,21 +98,22 @@ typedef struct float bandNoiseShape[FFTLEN2]; /* CNG spectral shape computed at the decoder */ float partNoiseShape[NPART]; /* CNG spectral shape computed at the decoder */ - float smoothed_psd[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */ - float msPeriodog_ST[NPART_SHAPING]; /* stereo CNA - short-term periodogram */ - int16_t ms_last_inactive_bwidth; /* stereo CNA - bandwidth from the last inactive frame */ - int16_t ms_cnt_bw_up; /* stereo CNA - downward counter of frames since the last NB->WB switch */ - float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ - float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ - float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ - float cna_cm[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - coherence from the last inactive frame */ - int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */ - int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */ - int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ - int16_t cna_band_limits[MAX_CNA_NBANDS + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ - float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ - float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ - int16_t cna_seed; /* stereo CNA - seed for random CN generator */ + float smoothed_psd[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */ + float msPeriodog_ST[NPART_SHAPING]; /* stereo CNA - short-term periodogram */ + int16_t ms_last_inactive_bwidth; /* stereo CNA - bandwidth from the last inactive frame */ + int16_t ms_cnt_bw_up; /* stereo CNA - downward counter of frames since the last NB->WB switch */ + float cna_LR_LT; /* stereo CNA - long-term L/R correlation factor calculated on stereo upmix */ + float cna_ILD_LT; /* stereo CNA - long-term ILD factor calculated on stereo upmix */ + float cna_g_state[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ + float cna_cm[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ + int16_t first_cna_noise_updated; /* stereo CNA - flag indicating that comfort noise has been properly initialized during warmup */ + int16_t first_cna_noise_update_cnt; /* stereo CNA - counter of CN initialization frames */ + int16_t cna_nbands; /* stereo CNA - number of frequency bands used by the CNA in DFT stereo mode */ + + int16_t cna_band_limits[STEREO_DFT_BAND_MAX + 1]; /* stereo CNA - band limits used by the CNA in DFT stereo mode */ + float cna_act_fact; /* stereo CNA - long-term signal activity factor (0-1) */ + float cna_rescale_fact; /* stereo CNA - CN energy re-scaling factor to maintain decoded energy */ + int16_t cna_seed; /* stereo CNA - seed for random CN generator */ int16_t flag_dtx_mode; float lp_speech; @@ -1345,10 +1346,7 @@ typedef struct Decoder_State /* MCT Channel mode indication: LFE, ignore channel? */ MCT_CHAN_MODE mct_chan_mode; - int16_t cng_ism_flag; /* CNG in ISM format flag */ -#ifndef FIX_ISM_DTX_CNG_BWIDTH_ALT - int16_t read_sid_info; /* For ParamISM, use the transmitted noise */ -#endif + int16_t cng_ism_flag; /* CNG in ISM format flag */ int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ } Decoder_State, *DEC_CORE_HANDLE; diff --git a/lib_dec/swb_bwe_dec.c b/lib_dec/swb_bwe_dec.c index e7eda534ae..a89a17cca8 100644 --- a/lib_dec/swb_bwe_dec.c +++ b/lib_dec/swb_bwe_dec.c @@ -586,8 +586,8 @@ void swb_bwe_dec( if ( st->element_mode == IVAS_CPE_DFT && !use_cldfb_for_dft ) { - /* TBD - wtda() does not support L_FRAME length; thus temporarily resample the signal */ - /* TBV - delay output[] by 1.25ms ? */ + /* todo - wtda() does not support L_FRAME length; thus temporarily resample the signal */ + /* todo - delay output[] by 1.25ms ? */ lerp( output, ysynth, L_FRAME16k, st->L_frame ); /* windowing of the ACELP core synthesis */ @@ -734,7 +734,7 @@ void swb_bwe_dec( } else if ( frica_flag == 1 && hBWE_FD->prev_frica_flag == 0 ) { - /* IVAS_fmToDo: TBD - synth[] is @internal_Fs!!! */ + /* IVAS_fmToDo: synth[] is @internal_Fs!!! */ time_reduce_pre_echo( synth, hb_synth, hBWE_FD->prev_td_energy, l_subfr ); } else diff --git a/lib_dec/swb_tbe_dec.c b/lib_dec/swb_tbe_dec.c index 79fe3b0e68..e4f211b2aa 100644 --- a/lib_dec/swb_tbe_dec.c +++ b/lib_dec/swb_tbe_dec.c @@ -577,7 +577,6 @@ void swb_tbe_dec( set_f( GainShape, hBWE_TD->prev_GainShape, NUM_SHB_SUBFR ); } - /* this never happens */ mvr2r( hBWE_TD->lsp_prevfrm, lsf_shb, LPC_SHB_ORDER ); set_f( shb_res_gshape, 0.2f, NB_SUBFR16k ); } @@ -1864,19 +1863,16 @@ static void dequantizeSHBparams( lsf_q[LATTICE_DIM + 1] = dotp( lsf_q, &LastCoefPred_1bit[2 * ( LATTICE_DIM + 1 ) * Idx_pred + LATTICE_DIM + 1], LATTICE_DIM ); } - /* !!! TODO: read empty bits - should be removed */ if ( nbits < NUM_BITS_SHB_MSLVQ ) { Idx_pred = get_next_indice( st, NUM_BITS_SHB_MSLVQ - nbits ); } - /* !!! end empty bits */ v_add( SHB_LSF_mean, lsf_q, lsf_q, LPC_SHB_ORDER ); v_sort( lsf_q, 0, LPC_SHB_ORDER - 1 ); } else { - /* !!!! this purposely reverts the inclusion of extl_brate == SWB_TBE_1k75 into the logic - remove this comment when this macro is deleted !!!!! */ if ( extl_brate == SWB_TBE_1k6 || extl_brate == FB_TBE_1k8 || extl_brate == SWB_TBE_2k8 || extl_brate == FB_TBE_3k0 ) { for ( i = 0; i < NUM_Q_LSF; i++ ) diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 0310a713e3..d78f9bf258 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -47,9 +47,7 @@ #include "prot.h" #include "ivas_cnst.h" #include "ivas_prot.h" -#ifdef LSF_RE_USE_SECONDARY_CHANNEL #include "ivas_rom_com.h" -#endif #include "wmc_auto.h" /*-------------------------------------------------------------------* @@ -75,10 +73,7 @@ ivas_error acelp_core_enc( float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ int16_t *unbits, /* o : number of unused bits */ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ -#ifndef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE - const float tdm_lspQ_PCh[M], /* i : Q LSPs for primary channel */ -#endif - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ) { int16_t i, nBits; /* reserved bits */ @@ -377,11 +372,7 @@ ivas_error acelp_core_enc( if ( !nelp_mode && !ppp_mode ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, st->GSC_noisy_speech, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif } /*-----------------------------------------------------------------* @@ -417,17 +408,12 @@ ivas_error acelp_core_enc( if ( !tdm_lp_reuse_flag ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, st->GSC_IVAS_mode, tdm_lsfQ_PCh ); -#else - lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, st->GSC_IVAS_mode ); -#endif } else { const float *pt_interp_2; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE if ( st->active_cnt != 1 ) { int16_t beta_index; @@ -442,13 +428,6 @@ ivas_error acelp_core_enc( push_indice( hBstr, IND_IC_LSF_PRED, beta_index, TDM_IC_LSF_PRED_BITS ); } -#else - if ( st->active_cnt != 1 ) - { - mvr2r( tdm_lspQ_PCh, lsp_new, M ); - mvr2r( tdm_lsfQ_PCh, lsf_new, M ); - } -#endif pt_interp_2 = interpol_frac_12k8; if ( tdm_low_rate_mode == 1 && st->coder_type > UNVOICED ) @@ -506,11 +485,7 @@ ivas_error acelp_core_enc( { tc_classif_enc( st->L_frame, &tc_subfr, &position, attack_flag, st->pitch[0], res ); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 1, NULL, unbits, st->element_mode, &uc_two_stage_flag, tdm_lp_reuse_flag, tdm_low_rate_mode, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif } /*---------------------------------------------------------------* @@ -568,18 +543,10 @@ ivas_error acelp_core_enc( lsf_syn_mem_restore( st, tilt_code_bck, gc_threshold_bck, clip_var_bck, next_force_sf_bck, lsp_new, lsp_mid, clip_var, mem_AR, mem_MA, lsp_new_bck, lsp_mid_bck, Bin_E, Bin_E_old, mem_syn_bck, mem_w0_bck, streaklimit, pstreaklen ); /* Configure ACELP bit allocation */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, st->active_cnt, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#else - config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, st->coder_type, tc_subfr, 0, &nb_bits, unbits, 0, &uc_two_stage_flag, 0, 0, st->idchan, tdm_Pitch_reuse_flag, st->tdm_LRTD_flag, st->GSC_IVAS_mode ); -#endif /* redo LSF quantization */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0, NULL ); -#else - lsf_enc( st, lsf_new, lsp_new, lsp_mid, Aq, tdm_low_rate_mode, 0 ); -#endif /* recalculation of LP residual (filtering through A[z] filter) */ calc_residu( inp, res, Aq, st->L_frame ); diff --git a/lib_enc/acelp_core_switch_enc.c b/lib_enc/acelp_core_switch_enc.c index 5813968434..0fa3ba3130 100644 --- a/lib_enc/acelp_core_switch_enc.c +++ b/lib_enc/acelp_core_switch_enc.c @@ -73,6 +73,10 @@ void acelp_core_switch_enc( const float *inp; int32_t cbrate; float Aq[2 * ( M + 1 )]; +#ifdef IND_LIST_DYN + uint16_t value; + int16_t nb_bits; +#endif BSTR_ENC_HANDLE hBstr = st->hBstr; /* initializations */ @@ -151,11 +155,7 @@ void acelp_core_switch_enc( * Excitation encoding *----------------------------------------------------------------*/ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( ENC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); -#else - config_acelp1( ENC, st->total_brate, cbrate, st->core, -1, -1, st->last_L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, GENERIC, -1, -1, &j, &i, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, 0, 0 /*GSC_IVAS_mode*/ ); -#endif encod_gen_voic_core_switch( st, st->last_L_frame, inp, Aq, A, T_op, st->voicing, exc, cbrate ); @@ -163,12 +163,25 @@ void acelp_core_switch_enc( * Manipulate ACELP subframe indices (move them to their proper place) *----------------------------------------------------------------*/ +#ifdef IND_LIST_DYN + i = find_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START, &value, &nb_bits ); +#ifdef DEBUGGING + assert( i >= 0 && "Internal error in ACELP core switching - unable to find ACELP subframe indices!" ); +#endif + while ( hBstr->ind_list[i].id == TAG_ACELP_SUBFR_LOOP_START ) + { + push_indice( hBstr, IND_CORE_SWITCHING_CELP_SUBFRAME, hBstr->ind_list[i].value, hBstr->ind_list[i].nb_bits ); + i++; + } + delete_indice( hBstr, TAG_ACELP_SUBFR_LOOP_START ); +#else for ( i = 0; i < 20; i++ ) { hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].value = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].value; hBstr->ind_list[IND_CORE_SWITCHING_CELP_SUBFRAME + i].nb_bits = hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits; hBstr->ind_list[TAG_ACELP_SUBFR_LOOP_START + i].nb_bits = -1; } +#endif /*----------------------------------------------------------------* * BWE encoding diff --git a/lib_enc/cng_enc.c b/lib_enc/cng_enc.c index 04d9e41166..6d49d9c886 100644 --- a/lib_enc/cng_enc.c +++ b/lib_enc/cng_enc.c @@ -263,11 +263,7 @@ void CNG_enc( } else { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_enc( st, lsf_new, lsp_new, 0, 0, 0, 0, NULL ); -#else - lsf_enc( st, lsf_new, lsp_new, 0, 0, 0, 0 ); -#endif } /* Reset CNG history if CNG frame length is changed */ @@ -885,8 +881,12 @@ void swb_CNG_enc( else if ( st->element_mode == IVAS_CPE_DFT && st->core_brate == SID_2k40 ) { /* LF-boost not used in DFT-stereo, instead the bandwidth is transmitted */ +#ifdef IND_LIST_DYN + delete_indice( st->hBstr, IND_CNG_ENV1 ); +#else st->hBstr->nb_bits_tot = st->hBstr->nb_bits_tot - st->hBstr->ind_list[IND_CNG_ENV1].nb_bits; st->hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; +#endif push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); push_indice( st->hBstr, IND_UNUSED, 0, 4 ); push_indice( st->hBstr, IND_SID_BW, 1, 1 ); @@ -962,8 +962,12 @@ static void shb_CNG_encod( push_indice( hBstr, IND_SHB_CNG_GAIN, idx_ener, 4 ); push_indice( hBstr, IND_SID_BW, 1, 1 ); +#ifdef IND_LIST_DYN + delete_indice( hBstr, IND_CNG_ENV1 ); +#else hBstr->nb_bits_tot = hBstr->nb_bits_tot - hBstr->ind_list[IND_CNG_ENV1].nb_bits; hBstr->ind_list[IND_CNG_ENV1].nb_bits = -1; +#endif if ( st->element_mode == IVAS_CPE_DFT ) { push_indice( st->hBstr, IND_BWIDTH, st->bwidth, 2 ); diff --git a/lib_enc/core_switching_enc.c b/lib_enc/core_switching_enc.c index ad52e197b9..2b16b49d46 100644 --- a/lib_enc/core_switching_enc.c +++ b/lib_enc/core_switching_enc.c @@ -258,7 +258,7 @@ void core_switching_pre_enc( /* reset BWE memories */ if ( st->hBWE_TD != NULL ) { - set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TBV: this might not be needed */ + set_f( st->hBWE_FD->old_syn_12k8_16k, 0, NS2SA( 16000, DELAY_FD_BWE_ENC_NS ) ); /* TODO - TBV: this might not be needed */ } } diff --git a/lib_enc/dtx.c b/lib_enc/dtx.c index c99a8faf28..8357dd3a82 100644 --- a/lib_enc/dtx.c +++ b/lib_enc/dtx.c @@ -64,8 +64,7 @@ #define LTE_VAR -4.0f #define MAX_BRATE_DTX_EVS ACELP_24k40 /* maximum bitrate to which the default DTX is applied in EVS; otherwise DTX is applied only in silence */ -#define MAX_BRATE_DTX_IVAS IVAS_64k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ - +#define MAX_BRATE_DTX_IVAS IVAS_80k /* maximum bitrate to which the default DTX is applied in IVAS; otherwise DTX is applied only in silence */ /*-------------------------------------------------------------------* * Local function prototypes *-------------------------------------------------------------------*/ @@ -86,9 +85,7 @@ void dtx( ) { float alpha; - DTX_ENC_HANDLE hDtxEnc = st->hDtxEnc; - int16_t last_br_cng_flag, last_br_flag, br_dtx_flag; if ( st->dtx_sce_sba != 0 ) { @@ -99,7 +96,6 @@ void dtx( else { last_br_cng_flag = st->last_total_brate_cng <= MAX_BRATE_DTX_EVS || st->lp_noise < 15 || ( st->element_mode == IVAS_SCE && st->last_total_brate_cng <= MAX_BRATE_DTX_IVAS ); - last_br_flag = st->last_total_brate <= MAX_BRATE_DTX_EVS || st->lp_noise < 15 || ( st->element_mode == IVAS_SCE && st->last_total_brate <= MAX_BRATE_DTX_IVAS ); br_dtx_flag = 0; } @@ -238,7 +234,7 @@ void dtx( } else { - if ( ( st->cng_type == FD_CNG && ( st->total_brate <= MAX_BRATE_DTX_EVS || ( st->element_mode == IVAS_SCE && ivas_total_brate <= MAX_BRATE_DTX_IVAS ) ) ) || ( st->element_mode == IVAS_CPE_MDCT ) ) /* at highest bitrates, use exclusively LP_CNG */ + if ( ( st->cng_type == FD_CNG && ( st->total_brate <= MAX_BRATE_DTX_EVS || ( st->element_mode != EVS_MONO && ivas_total_brate <= MAX_BRATE_DTX_IVAS ) ) ) || ( st->element_mode == IVAS_CPE_MDCT ) ) /* at highest bitrates, use exclusively LP_CNG */ { if ( st->element_mode == EVS_MONO && ( st->total_brate == ACELP_9k60 || st->total_brate == ACELP_16k40 || st->total_brate == ACELP_24k40 ) ) { @@ -259,7 +255,13 @@ void dtx( /* reset the bitstream (IVAS format signaling was already written) */ if ( st->element_mode != IVAS_CPE_MDCT && st->hBstr != NULL ) { - reset_indices_enc( st->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st->hBstr, +#ifdef IND_LIST_DYN + st->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); } } diff --git a/lib_enc/enc_ppp.c b/lib_enc/enc_ppp.c index 823d6cf3cd..328c1d5b52 100644 --- a/lib_enc/enc_ppp.c +++ b/lib_enc/enc_ppp.c @@ -169,7 +169,14 @@ ivas_error encod_ppp( } /* delete previous indices */ - reset_indices_enc( hBstr, MAX_NUM_INDICES ); + reset_indices_enc( hBstr, +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); + /* signaling matrix (writing of signaling bits) */ signaling_enc( st ); diff --git a/lib_enc/eval_pit_contr.c b/lib_enc/eval_pit_contr.c index 5dd3101772..76bf54b025 100644 --- a/lib_enc/eval_pit_contr.c +++ b/lib_enc/eval_pit_contr.c @@ -326,18 +326,26 @@ int16_t Pit_exc_contribution_len( /* pitch contribution useless - delete all previously written indices belonging to pitch contribution */ for ( i = TAG_ACELP_SUBFR_LOOP_START; i < TAG_ACELP_SUBFR_LOOP_END; i++ ) { +#ifdef IND_LIST_DYN + delete_indice( hBstr, i ); +#else if ( hBstr->ind_list[i].nb_bits != -1 ) { hBstr->nb_bits_tot -= hBstr->ind_list[i].nb_bits; hBstr->ind_list[i].nb_bits = -1; } +#endif } +#ifdef IND_LIST_DYN + delete_indice( hBstr, IND_ES_PRED ); +#else if ( hBstr->ind_list[IND_ES_PRED].nb_bits != -1 ) { hBstr->nb_bits_tot -= hBstr->ind_list[IND_ES_PRED].nb_bits; hBstr->ind_list[IND_ES_PRED].nb_bits = -1; } +#endif } if ( st->core_brate < CFREQ_BITRATE ) diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c index 2e2a379ec9..8a0a92c76a 100644 --- a/lib_enc/evs_enc.c +++ b/lib_enc/evs_enc.c @@ -103,6 +103,7 @@ ivas_error evs_enc( error = IVAS_ERR_OK; push_wmops( "evs_enc" ); + /*------------------------------------------------------------------* * Initialization *-----------------------------------------------------------------*/ @@ -242,11 +243,7 @@ ivas_error evs_enc( if ( st->core == ACELP_CORE ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE if ( ( error = acelp_core_enc( st, inp, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = acelp_core_enc( st, inp, ener, A, Aw, epsP, lsp_new, lsp_mid, vad_hover_flag, attack_flag, bwe_exc_extended, voice_factors, old_syn_12k8_16k, pitch_buf, &unbits, NULL, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -267,8 +264,7 @@ ivas_error evs_enc( core_switching_post_enc( st, old_inp_12k8, old_inp_16k, A ); -#if !defined( FIX_I4_OL_PITCH ) - /* ToDo: this is a hack to keep bitexactness wrt. EVS but the logic is wrong */ +#ifndef FIX_I4_OL_PITCH if ( st->core == HQ_CORE ) { mvs2s( pitch_orig, st->pitch, 3 ); /* original open-loop pitch values might be altered in core_acelp_tcx20_switching() */ diff --git a/lib_enc/ext_sig_ana.c b/lib_enc/ext_sig_ana.c index 80e652cf07..e76457e61c 100644 --- a/lib_enc/ext_sig_ana.c +++ b/lib_enc/ext_sig_ana.c @@ -443,11 +443,13 @@ void core_signal_analysis_high_bitrate( { ProcessIGF( st, hTcxEnc->spectrum[frameno], hTcxEnc->spectrum[frameno], powerSpec, transform_type[frameno] == TCX_20, frameno, 0, vad_hover_flag ); } - - /* Copy memory */ - mvr2r( lsp_new, st->lspold_enc, M ); } } + if ( st->element_mode != IVAS_CPE_MDCT ) + { + /* Copy memory */ + mvr2r( lsp_new, st->lspold_enc, M ); + } return; } diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index a76b741ca4..99e0e9c8db 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -513,23 +513,17 @@ void FdCng_encodeSID( float w[32]; float preemph_fac = st->preemph_fac; -#ifdef ERI_FDCNGVQ_LOW_ROM float *invTrfMatrix; float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; float tot_sig_ext[FDCNG_VQ_MAX_LEN]; -#else - const float *const *codebooks = ( st->element_mode == EVS_MONO ) ? cdk_37bits : cdk_37bits_ivas; -#endif const float gain_q_offset = ( st->element_mode == EVS_MONO ) ? GAIN_Q_OFFSET_EVS : GAIN_Q_OFFSET_IVAS; /* Init */ N = hFdCngEnc->npartDec; -#ifdef ERI_FDCNGVQ_LOW_ROM invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ set_zero( v, FDCNG_VQ_MAX_LEN ); -#endif /* Convert to LOG */ e = 0.f; @@ -556,7 +550,6 @@ void FdCng_encodeSID( /* MSVQ encoder */ set_f( w, 1.0f, N ); -#ifdef ERI_FDCNGVQ_LOW_ROM if ( st->element_mode != EVS_MONO ) { /* DCT domain compressed/truncated indices used for first stage */ @@ -582,12 +575,6 @@ void FdCng_encodeSID( msvq_enc( cdk_37bits, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, 0, NULL, indices ); msvq_dec( cdk_37bits, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, 0, NULL, v, NULL ); } -#else - msvq_enc( codebooks, NULL, NULL, v, levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, w, N, FD_CNG_maxN_37bits, indices ); - - /* MSVQ decoder */ - msvq_dec( codebooks, NULL, NULL, FD_CNG_stages_37bits, N, FD_CNG_maxN_37bits, indices, v, NULL ); -#endif /* Compute gain */ @@ -936,8 +923,21 @@ void stereoFdCngCoherence( else if ( sts[0]->core_brate <= SID_2k40 && sts[1]->core_brate <= SID_2k40 ) { /* case: no VAD for both channels -> INACTIVE FRAME */ - reset_indices_enc( sts[0]->hBstr, MAX_NUM_INDICES ); - reset_indices_enc( sts[1]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( sts[0]->hBstr, +#ifdef IND_LIST_DYN + sts[0]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); + + reset_indices_enc( sts[1]->hBstr, +#ifdef IND_LIST_DYN + sts[1]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); /* synchronize SID sending for variable SID rate */ if ( sts[0]->core_brate != sts[1]->core_brate ) @@ -1014,12 +1014,10 @@ void FdCngEncodeMDCTStereoSID( int16_t no_side_flag; int16_t is_inp_ms; -#ifdef ERI_FDCNGVQ_LOW_ROM float tot_sig_ext[FDCNG_VQ_MAX_LEN], dct_target[CPE_CHANNELS][FDCNG_VQ_DCT_MAXTRUNC]; /* 24 +2*18*/ float *invTrfMatrix; float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; /*24*18*/ invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ -#endif is_inp_ms = 0; @@ -1072,11 +1070,7 @@ void FdCngEncodeMDCTStereoSID( /* Quantize noise shapes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { -#ifdef ERI_FDCNGVQ_LOW_ROM /* Normalize MSVQ input */ -#else - /* Normalize MSVW input */ -#endif gain[ch] = 0.f; for ( p = N_GAIN_MIN; p < N_GAIN_MAX; p++ ) { @@ -1088,8 +1082,6 @@ void FdCngEncodeMDCTStereoSID( { ms_ptr[ch][p] -= gain[ch]; } - -#ifdef ERI_FDCNGVQ_LOW_ROM } /* always split channel targetloop */ @@ -1121,7 +1113,6 @@ void FdCngEncodeMDCTStereoSID( /* end split */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { -#endif /* MSVQ */ if ( ch ) { @@ -1132,7 +1123,6 @@ void FdCngEncodeMDCTStereoSID( stages = FD_CNG_stages_37bits; } -#ifdef ERI_FDCNGVQ_LOW_ROM /* DCT24 domain compressed/truncated indices used for first stage */ /* mid channel quantization using stages 1 through 6 */ /* & side channel quantization using stages 1 through 4 */ @@ -1141,12 +1131,6 @@ void FdCngEncodeMDCTStereoSID( msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[ch], levels_37bits, FD_CNG_maxC_37bits, stages, weights, N, FD_CNG_maxN_37bits, 1, invTrfMatrix, indices[ch] ); msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], 1, invTrfMatrix, ms_ptr[ch], NULL ); } -#else - msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[ch], levels_37bits, FD_CNG_maxC_37bits, stages, weights, N, FD_CNG_maxN_37bits, indices[ch] ); - - msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices[ch], ms_ptr[ch], NULL ); - -#endif } if ( no_side_flag ) @@ -1203,12 +1187,14 @@ void FdCngEncodeMDCTStereoSID( /* ---- Write SID bitstream ---- */ +#ifndef IND_LIST_DYN /* side info */ push_indice( sts[0]->hBstr, IND_SID_TYPE, 1, 1 ); push_indice( sts[0]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 ); push_indice( sts[0]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 ); push_indice( sts[1]->hBstr, IND_SID_TYPE, coh_idx, 4 ); push_indice( sts[1]->hBstr, IND_SID_TYPE, no_side_flag, 1 ); +#endif /* noise shapes and channel gains */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1216,10 +1202,23 @@ void FdCngEncodeMDCTStereoSID( if ( ch ) { stages = FD_CNG_JOINT_stages_25bits; +#ifdef IND_LIST_DYN + sts[ch]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + + /* side info */ + push_indice( sts[ch]->hBstr, IND_SID_TYPE, coh_idx, 4 ); + push_indice( sts[ch]->hBstr, IND_SID_TYPE, no_side_flag, 1 ); +#endif } else { stages = FD_CNG_stages_37bits; +#ifdef IND_LIST_DYN + /* side info */ + push_indice( sts[ch]->hBstr, IND_SID_TYPE, 1, 1 ); + push_indice( sts[ch]->hBstr, IND_BWIDTH, sts[0]->bwidth, 2 ); + push_indice( sts[ch]->hBstr, IND_ACELP_16KHZ, sts[0]->L_frame == L_FRAME16k ? 1 : 0, 1 ); +#endif } for ( int16_t i = 0; i < stages; i++ ) @@ -1260,13 +1259,11 @@ void FdCngEncodeDiracMDCTStereoSID( int16_t indices[CPE_CHANNELS][FD_CNG_stages_37bits]; int16_t gain_idx[CPE_CHANNELS]; int16_t ch, p; -#ifdef ERI_FDCNGVQ_LOW_ROM float *invTrfMatrix; float tmpRAM[FDCNG_VQ_MAX_LEN][FDCNG_VQ_DCT_MAXTRUNC]; float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; float tot_sig_ext[FDCNG_VQ_MAX_LEN]; invTrfMatrix = (float *) tmpRAM; /* dynamically filled */ -#endif /* set pointers and initialize */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1283,11 +1280,7 @@ void FdCngEncodeDiracMDCTStereoSID( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { E[ch] = 0.0f; -#ifdef ERI_FDCNGVQ_LOW_ROM - for ( p = 0; p < NPART; p++ ) /* TBD Note: NPART should likely be N[ch] if N[ch] may change */ -#else - for ( p = 0; p < NPART; p++ ) -#endif + for ( p = 0; p < NPART; p++ ) /* TODO Note: NPART should likely be N[ch] if N[ch] may change */ { ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON ); E[ch] += ms_ptr[ch][p]; @@ -1295,22 +1288,13 @@ void FdCngEncodeDiracMDCTStereoSID( } /* M/S transform on log envelopes */ -#ifdef ERI_FDCNGVQ_LOW_ROM - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ - E[0] = sum_f( ms_ptr[0], NPART ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ -#else - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); + E[0] = sum_f( ms_ptr[0], NPART ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ - E[0] = sum_f( ms_ptr[0], NPART ); -#endif /* Quantize M noise shape */ -#ifdef ERI_FDCNGVQ_LOW_ROM /* Normalize MSVQ input */ -#else - /* Normalize MSVW input */ -#endif gain[0] = sum_f( ms_ptr[0] + N_GAIN_MIN, N_GAIN_MAX - N_GAIN_MIN ); gain[0] /= (float) ( N_GAIN_MAX - N_GAIN_MIN ); @@ -1320,7 +1304,6 @@ void FdCngEncodeDiracMDCTStereoSID( } /* MSVQ */ -#ifdef ERI_FDCNGVQ_LOW_ROM /* DCT domain compressed/truncated indices used for first stage */ /* mid quantization using stages #1 through 6 */ if ( N[0] == FDCNG_VQ_MAX_LEN_WB ) @@ -1338,20 +1321,12 @@ void FdCngEncodeDiracMDCTStereoSID( msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[0], levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights, N[0], FD_CNG_maxN_37bits, 1, invTrfMatrix, indices[0] ); msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], 1, invTrfMatrix, ms_ptr[0], NULL ); -#else - msvq_enc( cdk_37bits_ivas, NULL, NULL, ms_ptr[0], levels_37bits, FD_CNG_maxC_37bits, FD_CNG_stages_37bits, weights, N[0], FD_CNG_maxN_37bits, indices[0] ); - msvq_dec( cdk_37bits_ivas, NULL, NULL, FD_CNG_stages_37bits, N[0], FD_CNG_maxN_37bits, indices[0], ms_ptr[0], NULL ); -#endif /* set S to zero */ set_zero( ms_ptr[1], NPART ); /* compute M gain */ -#ifdef ERI_FDCNGVQ_LOW_ROM - gain[0] = sum_f( ms_ptr[0], NPART ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ -#else - gain[0] = sum_f( ms_ptr[0], NPART ); -#endif + gain[0] = sum_f( ms_ptr[0], NPART ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ gain[0] = ( E[0] - gain[0] ) / (float) N[0]; apply_scale( &gain[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); @@ -1363,11 +1338,7 @@ void FdCngEncodeDiracMDCTStereoSID( gain[1] = gain[0]; /* undo M/S */ -#ifdef ERI_FDCNGVQ_LOW_ROM - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); /* TBD Note: NPART should likely be N[0] if N[0] may change */ -#else - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); -#endif + convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); /* TODO Note: NPART should likely be N[0] if N[0] may change */ /* restore channel noise envelopes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1375,11 +1346,7 @@ void FdCngEncodeDiracMDCTStereoSID( HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc; HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; -#ifdef ERI_FDCNGVQ_LOW_ROM - for ( p = 0; p < NPART; p++ ) /* TBD Note: NPART should likely be N[0] if N[0] may change */ -#else - for ( p = 0; p < NPART; p++ ) -#endif + for ( p = 0; p < NPART; p++ ) /* TODO Note: NPART should likely be N[0] if N[0] may change */ { lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); } diff --git a/lib_enc/igf_enc.c b/lib_enc/igf_enc.c index 9c68e3fcc7..677bc1639e 100644 --- a/lib_enc/igf_enc.c +++ b/lib_enc/igf_enc.c @@ -1707,6 +1707,41 @@ void IGFEncSetMode( return; } +#ifdef IND_LIST_DYN + +/*-------------------------------------------------------------------* + * pack_bit() + * + * insert a bit into packed octet + *-------------------------------------------------------------------*/ + +static void pack_bit( + const int16_t bit, /* i : bit to be packed */ + uint8_t **pt, /* i/o: pointer to octet array into which bit will be placed */ + uint8_t *omask /* i/o: output mask to indicate where in the octet the bit is to be written */ +) +{ + if ( *omask == 0x80 ) + { + **pt = 0; + } + + if ( bit != 0 ) + { + **pt = **pt | *omask; + } + + *omask >>= 1; + if ( *omask == 0 ) + { + *omask = 0x80; + ( *pt )++; + } + + return; +} + +#endif /*-------------------------------------------------------------------* * IGFEncConcatenateBitstream() @@ -1722,10 +1757,56 @@ void IGFEncConcatenateBitstream( { int16_t i; IGF_ENC_PRIVATE_DATA_HANDLE hPrivateData; +#ifdef IND_LIST_DYN + Indice *ind_list; + uint8_t *pFrame; /* byte array with bit packet and byte aligned coded speech data */ + int16_t *pFrame_size; /* number of bits in the binary encoded access unit [bits] */ + int16_t k, nb_bits_written; + int32_t imask; + uint8_t omask; +#endif hPrivateData = &hIGFEnc->igfData; +#ifndef IND_LIST_DYN hBstr->next_ind -= bsBits; +#endif + +#ifdef IND_LIST_DYN + ind_list = &hBstr->ind_list[hBstr->nb_ind_tot - bsBits]; /* here, we assume that each bit has been written as a single indice */ + pFrame = hPrivateData->igfBitstream; + pFrame_size = &hPrivateData->igfBitstreamBits; + nb_bits_written = 0; + + omask = ( 0x80 >> ( *pFrame_size & 0x7 ) ); + pFrame += *pFrame_size >> 3; + + /* bitstream packing (conversion of individual indices into a serial stream) */ + for ( i = 0; i < bsBits; i++ ) + { + if ( ind_list[i].nb_bits > 0 ) + { + /* mask from MSB to LSB */ + imask = 1 << ( ind_list[i].nb_bits - 1 ); + /* write bit by bit */ + for ( k = 0; k < ind_list[i].nb_bits; k++ ) + { + pack_bit( ind_list[i].value & imask, &pFrame, &omask ); + imask >>= 1; + } + nb_bits_written += ind_list[i].nb_bits; + + /* delete the indice */ + ind_list[i].nb_bits = -1; + } + } + + *pFrame_size += nb_bits_written; + + /* update list of indices */ + hBstr->nb_ind_tot -= bsBits; + hBstr->nb_bits_tot -= nb_bits_written; +#else indices_to_serial_generic( &hBstr->ind_list[hBstr->next_ind], bsBits, hPrivateData->igfBitstream, &hPrivateData->igfBitstreamBits ); /* make sure there are no leftovers from the temporary bitstream writing */ @@ -1735,6 +1816,7 @@ void IGFEncConcatenateBitstream( } hBstr->nb_bits_tot -= hIGFEnc->infoTotalBitsPerFrameWritten; +#endif return; } diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 9efd3c7f16..1c10715701 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -54,7 +54,10 @@ *-----------------------------------------------------------------------*/ ivas_error init_encoder( - Encoder_State *st, /* i/o: state structure */ + Encoder_State *st, /* i/o: state structure */ +#ifdef IND_LIST_DYN + Encoder_Struct *st_ivas, /* i/o: encoder state structure */ +#endif const int16_t idchan, /* i : channel ID */ const int16_t var_SID_rate_flag, /* i : flag for variable SID update rate */ const int16_t interval_SID, /* i : interval for SID update */ @@ -112,6 +115,15 @@ ivas_error init_encoder( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Bitstream structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set pointer to the buffer of indices */ + st->hBstr->ind_list = st_ivas->ind_list; + st->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; + st->hBstr->ivas_max_num_indices = &st_ivas->ivas_max_num_indices; + st->hBstr->nb_ind_tot = 0; + st->hBstr->nb_bits_tot = 0; +#endif } else { @@ -692,7 +704,7 @@ ivas_error init_encoder( * TCX core *-----------------------------------------------------------------*/ - // VE: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 + // ToDo: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 if ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) { if ( ( st->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL ) diff --git a/lib_enc/ivas_agc_enc.c b/lib_enc/ivas_agc_enc.c index 83dbdad1e1..03cb2aa2ed 100644 --- a/lib_enc/ivas_agc_enc.c +++ b/lib_enc/ivas_agc_enc.c @@ -455,7 +455,6 @@ void ivas_agc_enc_process( /* writing to a temporary bitstream file */ if ( ivas_agc_writeBits( agcOut, n_channels, pState ) ) { - /* TODO: return error once error codes are harmonized */ IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "SPAR ENC AGC Failed to open agcOut\n " ); } #endif @@ -477,7 +476,6 @@ static int16_t ivas_agc_writeBits( FILE *stream, const int16_t n_channels, ivas_ if ( pState->gain_data[i].absGainExpCurr < 0 || pState->gain_data[i].absGainExpCurr >= (int16_t) pow( 2, pState->agc_com.betaE ) ) { - /* TODO: return error once error codes are harmonized */ IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error Gain values to write!!\n\n" ); } diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index a7c37a79af..6536ee333e 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -103,6 +103,9 @@ ivas_error ivas_core_enc( int16_t last_element_mode, tdm_Pitch_reuse_flag; int32_t element_brate, last_element_brate, input_Fs; ivas_error error; +#ifdef IND_LIST_DYN + int16_t max_num_indices_BWE; +#endif push_wmops( "ivas_core_enc" ); @@ -195,6 +198,23 @@ ivas_error ivas_core_enc( { st = sts[n]; +#ifdef IND_LIST_DYN + /* update pointer to the buffer of indices of the second channel */ + if ( n == 1 && st->element_mode == IVAS_CPE_TD ) + { + /* adjust the pointer to the buffer of indices of the secondary channel (make space for BWE indices) */ + max_num_indices_BWE = get_BWE_max_num_indices( sts[0]->extl_brate ); + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot + max_num_indices_BWE; + + /* write TD stereo spatial parameters */ + move_indices( hStereoTD->tdm_hBstr_tmp.ind_list, st->hBstr->ind_list, hStereoTD->tdm_hBstr_tmp.nb_ind_tot ); + st->hBstr->nb_ind_tot += hStereoTD->tdm_hBstr_tmp.nb_ind_tot; + st->hBstr->nb_bits_tot += hStereoTD->tdm_hBstr_tmp.nb_bits_tot; + + reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP ); + } +#endif + /*---------------------------------------------------------------------* * Write signaling info into the bitstream *---------------------------------------------------------------------*/ @@ -219,11 +239,7 @@ ivas_error ivas_core_enc( if ( st->core == ACELP_CORE ) { /* ACELP core encoder */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE if ( ( error = acelp_core_enc( st, inp[n], ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK ) -#else - if ( ( error = acelp_core_enc( st, inp[n], ener[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lspQ_PCh, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -410,7 +426,6 @@ ivas_error ivas_core_enc( } } - #ifdef DEBUG_MODE_INFO for ( n = 0; n < n_CoreChannels; n++ ) { diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index cf23ddef53..5f775d2403 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -563,7 +563,14 @@ ivas_error pre_proc_front_ivas( if ( st->hFdCngEnc != NULL && ( st->ini_frame == 0 || last_element_brate != element_brate || st->last_bwidth != st->bwidth ) ) { +#ifdef FIX_443_FD_CNG_INIT + int32_t total_brate; + + total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : st->bits_frame_nominal * FRAMES_PER_SEC; + configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), total_brate ); +#else configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), st->bits_frame_nominal * FRAMES_PER_SEC ); +#endif if ( hCPE != NULL ) { st->hFdCngEnc->hFdCngCom->CngBitrate = hCPE->element_brate - 1; diff --git a/lib_enc/ivas_corecoder_enc_reconfig.c b/lib_enc/ivas_corecoder_enc_reconfig.c index 080ecc2046..439a0f6c63 100644 --- a/lib_enc/ivas_corecoder_enc_reconfig.c +++ b/lib_enc/ivas_corecoder_enc_reconfig.c @@ -41,7 +41,6 @@ #endif #include "wmc_auto.h" - /*-------------------------------------------------------------------* * ivas_corecoder_enc_reconfig() * @@ -61,9 +60,24 @@ ivas_error ivas_corecoder_enc_reconfig( int16_t n, sce_id, cpe_id; int16_t len_inp_memory, n_CoreCoder_existing, nSCE_existing, nCPE_existing; float input_buff[MCT_MAX_BLOCKS][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )]; - BSTR_ENC_HANDLE hBstr, hMetaData; - Indice *ind_list, *ind_list_metadata; - int16_t nb_bits_tot, next_ind, last_ind; + BSTR_ENC_HANDLE hBstr; +#ifndef IND_LIST_DYN + Indice *ind_list; +#endif +#ifndef IND_LIST_DYN + Indice *ind_list_metadata; + BSTR_ENC_HANDLE hMetaData; +#endif +#ifdef IND_LIST_DYN + int16_t i, nb_bits; + Indice temp_ind_list[MAX_NUM_IND_TEMP_LIST]; +#endif + int16_t nb_bits_tot; +#ifndef IND_LIST_DYN + int16_t last_ind; + int16_t next_ind; +#endif + ENCODER_CONFIG_HANDLE hEncoderConfig; ivas_error error; @@ -133,21 +147,29 @@ ivas_error ivas_corecoder_enc_reconfig( } /* something in transport changes */ +#ifndef IND_LIST_DYN ind_list = NULL; ind_list_metadata = NULL; +#endif hBstr = NULL; +#ifndef IND_LIST_DYN hMetaData = NULL; +#endif /* get the index list pointers */ if ( nSCE_old ) { hBstr = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr; +#ifndef IND_LIST_DYN hMetaData = st_ivas->hSCE[0]->hMetaData; +#endif } else if ( nCPE_old ) { hBstr = st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; +#ifndef IND_LIST_DYN hMetaData = st_ivas->hCPE[nCPE_old - 1]->hMetaData; +#endif } #ifdef DEBUGGING else @@ -157,11 +179,45 @@ ivas_error ivas_corecoder_enc_reconfig( #endif /* save bitstream information */ - ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ nb_bits_tot = hBstr->nb_bits_tot; +#ifndef IND_LIST_DYN + ind_list = hBstr->ind_list; /* pointer to the beginning of the global list */ next_ind = hBstr->next_ind; last_ind = hBstr->last_ind; +#endif +#ifdef IND_LIST_DYN + i = 0; + nb_bits = 0; + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( hBstr->ind_list[i].nb_bits > 0 ) + { + temp_ind_list[i].id = hBstr->ind_list[i].id; + temp_ind_list[i].value = hBstr->ind_list[i].value; + temp_ind_list[i].nb_bits = hBstr->ind_list[i].nb_bits; + hBstr->ind_list[i].nb_bits = -1; + } + + hBstr->nb_bits_tot = 0; + hBstr->nb_ind_tot = 0; + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + + for ( ; i < MAX_NUM_IND_TEMP_LIST; i++ ) + { + /* reset nb_bits of all other indices to -1 */ + temp_ind_list[i].nb_bits = -1; + } + +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error saving bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif +#ifndef IND_LIST_DYN ind_list_metadata = hMetaData->ind_list; /* pointer to the beginning of the global list */ +#endif if ( hEncoderConfig->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) { @@ -256,23 +312,35 @@ ivas_error ivas_corecoder_enc_reconfig( mvr2r( input_buff[sce_id], st_ivas->hSCE[sce_id]->hCoreCoder[0]->input_buff, len_inp_memory ); } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list + sce_id * MAX_NUM_INDICES; +#endif /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( sce_id > 0 ) { - reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); } else { - st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; + st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->last_ind = last_ind; st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->next_ind = next_ind; +#endif } +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata + sce_id * MAX_BITS_METADATA; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#endif } } @@ -284,22 +352,32 @@ ivas_error ivas_corecoder_enc_reconfig( { st_ivas->hCPE[cpe_id]->element_brate = brate_CPE; - /* prepare bitstream buffers */ + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { copy_encoder_config( st_ivas, st_ivas->hCPE[cpe_id]->hCoreCoder[n], 0 ); st_ivas->hCPE[cpe_id]->hCoreCoder[n]->total_brate = st_ivas->hCPE[cpe_id]->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; +#endif if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; +#endif } } } @@ -321,23 +399,33 @@ ivas_error ivas_corecoder_enc_reconfig( { if ( n_CoreCoder_existing > cpe_id * CPE_CHANNELS + n ) { - mvr2r( input_buff[n], st_ivas->hCPE[cpe_id]->hCoreCoder[0]->input_buff, len_inp_memory ); /* TODO VoiceAge: Please check if this should be hCoreCoder[n] */ + mvr2r( input_buff[n], st_ivas->hCPE[cpe_id]->hCoreCoder[n]->input_buff, len_inp_memory ); } } - /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list + ( cpe_id * CPE_CHANNELS + n + st_ivas->nSCE ) * MAX_NUM_INDICES; +#endif + /* only reset indices if it is not the first index list, this already contains the IVAS format bits */ if ( cpe_id * CPE_CHANNELS + n > 0 || ( st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->nSCE > 0 ) ) { - reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, +#ifdef IND_LIST_DYN + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); } else { - st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->nb_bits_tot = nb_bits_tot; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->last_ind = last_ind; st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->next_ind = next_ind; +#endif } if ( hEncoderConfig->Opt_DTX_ON ) @@ -348,6 +436,51 @@ ivas_error ivas_corecoder_enc_reconfig( } } +#ifdef IND_LIST_DYN + /* restore bitstream - IVAS format bits should be written in the first core channel of the first SCE/CPE */ + i = 0; + nb_bits = 0; + if ( st_ivas->nSCE > 0 ) + { + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot = i; + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; + } + else if ( st_ivas->nCPE > 0 ) + { + while ( nb_bits < nb_bits_tot && i < MAX_NUM_IND_TEMP_LIST ) + { + if ( temp_ind_list[i].nb_bits > 0 ) + { + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].id = temp_ind_list[i].id; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].value = temp_ind_list[i].value; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list[i].nb_bits = temp_ind_list[i].nb_bits; + } + + nb_bits += temp_ind_list[i].nb_bits; + i++; + } + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_ind_tot = i; + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->nb_bits_tot = nb_bits_tot; + } + +#ifdef DEBUGGING + assert( ( nb_bits == nb_bits_tot ) && "Error restoring bitstream information during core-coder reconfiguration!\n" ); +#endif +#endif + + if ( last_mc_mode == MC_MODE_MCMASA && st_ivas->mc_mode == MC_MODE_MCMASA ) { /* restore modified transport signal */ @@ -372,7 +505,6 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, @@ -403,7 +535,7 @@ ivas_error ivas_corecoder_enc_reconfig( } } - /* metadata handling for CPEs */ + /* alllocate buffer for metadata indices */ if ( st_ivas->nCPE > 0 ) { if ( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData == NULL ) @@ -412,10 +544,23 @@ ivas_error ivas_corecoder_enc_reconfig( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set pointer to the buffer of metadata indices */ + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_ind_tot = 0; + st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_bits_tot = 0; +#endif } +#ifdef IND_LIST_DYN + reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->nb_ind_tot ); +#else st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData->ind_list = ind_list_metadata + st_ivas->nSCE * MAX_NUM_INDICES; reset_indices_enc( st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData, MAX_BITS_METADATA ); +#endif for ( cpe_id = 0; cpe_id < st_ivas->nCPE - 1; cpe_id++ ) { @@ -439,7 +584,6 @@ ivas_error ivas_corecoder_enc_reconfig( for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[0]->hCoreCoder[n]->total_brate = st_ivas->hCPE[0]->element_brate; - st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal = (int16_t) ( st_ivas->hCPE[0]->element_brate / FRAMES_PER_SEC ); st_ivas->hCPE[0]->hCoreCoder[n]->igf = getIgfPresent( st_ivas->hCPE[0]->hCoreCoder[n]->element_mode, st_ivas->hCPE[0]->hCoreCoder[n]->bits_frame_nominal * FRAMES_PER_SEC, diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 72a737e64b..5f19a5395a 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -109,7 +109,6 @@ ivas_error ivas_cpe_enc( hCPE = st_ivas->hCPE[cpe_id]; sts = hCPE->hCoreCoder; hEncoderConfig = st_ivas->hEncoderConfig; - max_bwidth = hEncoderConfig->max_bwidth; ivas_format = hEncoderConfig->ivas_format; input_Fs = hEncoderConfig->input_Fs; @@ -275,7 +274,7 @@ ivas_error ivas_cpe_enc( } else { - /* note; "bits_frame_nominal" needed in TD stereo as well */ /* IVAS_fmToDo: is "bits_frame_nominal" set optimaly in TD stereo? */ + /* note; "bits_frame_nominal" needed in TD stereo as well */ stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, hCPE->element_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } } @@ -334,7 +333,12 @@ ivas_error ivas_cpe_enc( if ( hCPE->element_mode == IVAS_CPE_DFT ) { - stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs ); + stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs +#ifdef HYBRID_ITD_MAX + , + hCPE->hStereoDft->hItd->hybrid_itd_max +#endif + ); /* Time Domain ITD compensation using extrapolation */ #ifdef DEBUG_MODE_DFT @@ -463,7 +467,11 @@ ivas_error ivas_cpe_enc( { if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) { +#ifndef SBA_MODE_CLEAN_UP reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode ); +#else + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); +#endif } } @@ -473,9 +481,17 @@ ivas_error ivas_cpe_enc( stereoFdCngCoherence( sts, hCPE->last_element_mode, fft_buff ); /* Reset metadata */ +#ifndef SBA_MODE_CLEAN_UP if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) ) +#else + if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT ) ) +#endif { +#ifndef SBA_MODE_CLEAN_UP reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode ); +#else + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); +#endif } } @@ -813,6 +829,14 @@ ivas_error create_cpe_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set pointer to the buffer of metadata indices */ + hCPE->hMetaData->ind_list = st_ivas->ind_list_metadata; + hCPE->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + hCPE->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; + reset_indices_enc( hCPE->hMetaData, st_ivas->ivas_max_num_indices_metadata ); +#endif } /*-----------------------------------------------------------------* @@ -829,7 +853,11 @@ ivas_error create_cpe_enc( copy_encoder_config( st_ivas, st, 1 ); st->total_brate = hCPE->element_brate / ( st_ivas->nCPE > 1 ? 1 : CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; - if ( ( error = init_encoder( st, n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( st, +#ifdef IND_LIST_DYN + st_ivas, +#endif + n, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 43bc94fb04..5aa872e434 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -62,9 +62,13 @@ ivas_error ivas_dirac_enc_open( ) { int16_t i, j; +#ifndef SBA_MODE_CLEAN_UP int32_t input_Fs; +#endif DIRAC_ENC_HANDLE hDirAC; +#ifndef SBA_MODE_CLEAN_UP IVAS_FB_CFG *fb_cfg; +#endif int32_t dirac_slot_ns; ivas_error error; @@ -79,13 +83,23 @@ ivas_error ivas_dirac_enc_open( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); } - +#ifdef FIX_485_STATIC_BUFFERS + hDirAC->firstrun_sector_params = 1; + set_zero( hDirAC->sec_I_vec_smth_x[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->sec_I_vec_smth_y[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->sec_I_vec_smth_z[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->azi_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->ele_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); + set_zero( hDirAC->energy_smth[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); +#endif /*-----------------------------------------------------------------* * DirAC main configuration *-----------------------------------------------------------------*/ st_ivas->hDirAC = hDirAC; +#ifndef SBA_MODE_CLEAN_UP input_Fs = st_ivas->hEncoderConfig->input_Fs; +#endif if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) { @@ -93,13 +107,19 @@ ivas_error ivas_dirac_enc_open( } /* set FB config. */ +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { +#endif hDirAC->hFbMixer = NULL; +#ifndef SBA_MODE_CLEAN_UP } else { - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, DIRAC_MAX_ANA_CHANS, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, + FOA_CHANNELS, + 0, 0, input_Fs, + FOA_CHANNELS ) ) != IVAS_ERR_OK ) { return error; } @@ -109,7 +129,7 @@ ivas_error ivas_dirac_enc_open( return error; } } - +#endif for ( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ ) { @@ -119,6 +139,7 @@ ivas_error ivas_dirac_enc_open( dirac_slot_ns = DIRAC_SLOT_ENC_NS; /* initialize delay for SPAR/DirAC delay synchronization */ +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) { hDirAC->num_samples_synchro_delay = NS2SA( input_Fs, IVAS_FB_ENC_DELAY_NS ); @@ -141,6 +162,7 @@ ivas_error ivas_dirac_enc_open( hDirAC->sba_synchro_buffer[i] = NULL; } } +#endif /* intensity 3-dim */ for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) @@ -196,13 +218,15 @@ ivas_error ivas_dirac_enc_open( hDirAC->index_buffer_intensity = 0; st_ivas->hDirAC = hDirAC; - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); +#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; +#ifndef SBA_MODE_CLEAN_UP } - +#endif return error; } @@ -236,7 +260,15 @@ ivas_error ivas_dirac_enc_reconfigure( /* :TODO: if the number of parameter bands change, do a meaningful mapping of parameter buffers from old to new band setting */ - mvs2s( DirAC_block_grouping, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + if ( st_ivas->hQMetaData->useLowerRes ) + { + hDirAC->block_grouping[0] = 0; + hDirAC->block_grouping[1] = MAX_PARAM_SPATIAL_SUBFRAMES; + } + else + { + mvs2s( DirAC_block_grouping_5ms_MDFT, hDirAC->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + } return error; } @@ -267,7 +299,7 @@ void ivas_dirac_enc_close( { ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); } - +#ifndef SBA_MODE_CLEAN_UP for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) { if ( hDirAC->sba_synchro_buffer[i] != NULL ) @@ -276,7 +308,7 @@ void ivas_dirac_enc_close( hDirAC->sba_synchro_buffer[i] = NULL; } } - +#endif /* intensity 3-dim */ for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { @@ -317,7 +349,7 @@ void ivas_dirac_enc_close( return; } - +#ifndef SBA_MODE_CLEAN_UP /*------------------------------------------------------------------------- * ivas_dirac_enc() * @@ -364,7 +396,9 @@ void ivas_dirac_enc( set_zero( data_f[2], input_frame ); } - ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC ); + ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC, + 0, + FOA_CHANNELS ); /* encode parameters */ if ( sba_planar || hQMetaData->useLowerRes ) @@ -376,17 +410,13 @@ void ivas_dirac_enc( } } - ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); + ivas_qmetadata_enc_encode( hMetaData, hQMetaData, + 0 ); *nb_bits_metadata = hMetaData->nb_bits_tot; if ( Opt_DTX_ON ) { - /* ToDo: If DIRAC_MIN_BITRATE_4_TRANS_CHAN is reached with DTX on (possible only with bitrate switching) - metadata is not quantized since it can be deduced at the decoder from transmitted TCs. - The solution would be to switch to active-only/ignore and resume DTX operation when switching back to a supported bitrate. - */ - if ( !( hQMetaData->no_directions == 1 && hQMetaData->numCodingBands == 5 ) ) { float orig_azi[DIRAC_MAX_NBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -440,8 +470,12 @@ void ivas_dirac_enc( } /* encode SID parameters */ +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, SBA_MODE_DIRAC ); +#else + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); +#endif /* restore original metadata */ hDirAC->hConfig->nbands = nbands; hQMetaData->q_direction[0].cfg.nbands = nbands; @@ -459,7 +493,11 @@ void ivas_dirac_enc( push_next_indice( hMetaData, 0, 1 ); /* encode SID parameters */ +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, SBA_MODE_DIRAC ); +#else + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); +#endif } } } @@ -488,7 +526,7 @@ void ivas_dirac_enc_spar_delay_synchro( int16_t sce_id, cpe_id, i_chan; /* check last sba_mode */ - if ( ivas_sba_mode_select( st_ivas->hEncoderConfig->last_ivas_total_brate ) == SBA_MODE_SPAR ) + if ( ivas_sba_mode_select() == SBA_MODE_SPAR ) { /* initializations */ i_chan = 0; @@ -524,7 +562,121 @@ void ivas_dirac_enc_spar_delay_synchro( return; } +#else +/*------------------------------------------------------------------------- + * ivas_dirac_enc() + * + * DirAC Encoder + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_enc( + DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: SBA channels */ + float **ppIn_FR_real, /* o : real freq domain values */ + float **ppIn_FR_imag, /* o : imag freq domain values */ + const int16_t input_frame, /* i : input frame length */ + const int16_t dtx_vad, /* i : DTX vad flag */ + const IVAS_FORMAT ivas_format, /* i : ivas format */ + int16_t hodirac_flag ) /* i : hodirac flag */ +{ + int16_t orig_dirac_bands; + float dir[3], avg_dir[3]; + float energySum, vecLen; + int16_t i, j, b, i_ts; + push_wmops( "ivas_dirac_enc" ); + + ivas_dirac_param_est_enc( hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, ivas_format, hodirac_flag, hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS ); + + if ( hQMetaData->q_direction->cfg.nbands > 0 ) + { + orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; + + if ( dtx_vad == 1 ) + { + /* WB 4TC mode bit : disable for now*/ + push_next_indice( hMetaData, 0, 1 ); + + ivas_qmetadata_enc_encode( hMetaData, hQMetaData, hodirac_flag ); + } + else + { + hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; + + /* compute directions */ + for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) + { + set_zero( dir, 3 ); + set_zero( avg_dir, 3 ); + energySum = 0.0f; + + /* combine all DirAC bands except the last one, handle last band separately, last band covers BW above WB */ + for ( j = 0; j < orig_dirac_bands - 1; j++ ) + { + ivas_qmetadata_azimuth_elevation_to_direction_vector( hQMetaData->q_direction[0].band_data[j].azimuth[i], hQMetaData->q_direction[0].band_data[j].elevation[i], &dir[0] ); + vecLen = hQMetaData->q_direction[0].band_data[j].energy_ratio[i] * hDirAC->buffer_energy[i * orig_dirac_bands + j]; + + avg_dir[0] += dir[0] * vecLen; + avg_dir[1] += dir[1] * vecLen; + avg_dir[2] += dir[2] * vecLen; + + energySum += hDirAC->buffer_energy[i * orig_dirac_bands + j]; + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( &avg_dir[0], &hQMetaData->q_direction[0].band_data[0].azimuth[i], &hQMetaData->q_direction[0].band_data[0].elevation[i] ); + hQMetaData->q_direction[0].band_data[0].energy_ratio[i] = sqrtf( dotp( avg_dir, avg_dir, 3 ) ) / ( energySum + EPSILON ); + + hQMetaData->q_direction[0].band_data[1].azimuth[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i]; + hQMetaData->q_direction[0].band_data[1].elevation[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i]; + hQMetaData->q_direction[0].band_data[1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i]; + } + + /* 1 bit to indicate mode MD coding : temp solution*/ + push_next_indice( hMetaData, 1, 1 ); + + /* encode SID parameters */ + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); + } + + for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) + { + for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) + { + hQMetaData->q_direction->band_data[b].azimuth[i_ts] = hQMetaData->q_direction->band_data[b].q_azimuth[i_ts]; + hQMetaData->q_direction->band_data[b].elevation[i_ts] = hQMetaData->q_direction->band_data[b].q_elevation[i_ts]; + hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; + } + } + if ( dtx_vad == 0 ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + } + + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = orig_dirac_bands - 2; j >= 0; j-- ) + { + hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; + hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; + } + } + + hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; + } + } + pop_wmops(); + + return; +} +#endif /*------------------------------------------------------------------------- * computeReferencePower_enc() @@ -539,7 +691,14 @@ void computeReferencePower_enc( float *reference_power, /* o : Estimated power */ const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ - const SBA_MODE sba_mode /* i : SBA mode */ +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + int16_t ref_power_w /* i : use 0 if hodirac is enabled */ +#endif + , + const int16_t nchan_ana /* i : number of analysis channels */ ) { int16_t brange[2]; @@ -559,7 +718,8 @@ void computeReferencePower_enc( reference_power_W[i] += ( Cldfb_RealBuffer[0][j] * Cldfb_RealBuffer[0][j] ) + ( Cldfb_ImagBuffer[0][j] * Cldfb_ImagBuffer[0][j] ); } reference_power[i] += reference_power_W[i]; - for ( ch_idx = 1; ch_idx < DIRAC_MAX_ANA_CHANS; ch_idx++ ) + + for ( ch_idx = 1; ch_idx < nchan_ana; ch_idx++ ) { /* abs()^2 */ for ( j = brange[0]; j < brange[1]; j++ ) @@ -570,7 +730,11 @@ void computeReferencePower_enc( } v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT && ref_power_w == 1 ) +#endif { for ( i = 0; i < num_freq_bands; i++ ) { @@ -596,7 +760,13 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, - const SBA_MODE sba_mode ) +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode, +#else + const IVAS_FORMAT ivas_format, +#endif + const int16_t hodirac_flag, + const int16_t nchan_fb_in ) { int16_t i, d, ts, index, l_ts, num_freq_bands; int16_t band_m_idx, block_m_idx; @@ -617,8 +787,15 @@ void ivas_dirac_param_est_enc( float reference_power[CLDFB_NO_COL_MAX][DIRAC_NO_FB_BANDS_MAX]; + float azi_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float ele_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float diff_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + float ene_secs[2 * DIRAC_MAX_ANA_CHANS * DIRAC_MAX_NBANDS] = { 0 }; + push_wmops( "dirac_enc_param_est" ); + num_freq_bands = hDirAC->hConfig->nbands; + /* Initialization */ l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; if ( useLowerRes ) @@ -640,7 +817,7 @@ void ivas_dirac_param_est_enc( } /* Copy current frame to memory for delay compensation */ - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) { pcm_in[i] = &data_f[i][0]; p_Cldfb_RealBuffer[i] = &Cldfb_RealBuffer[i][0]; @@ -665,10 +842,12 @@ void ivas_dirac_param_est_enc( { if ( hDirAC->hFbMixer ) { - ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts ); - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); + ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_Cldfb_RealBuffer, p_Cldfb_ImagBuffer, l_ts, l_ts, + hDirAC->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts, + hDirAC->hFbMixer->fb_cfg->num_in_chans ); - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) { pcm_in[i] += l_ts; } @@ -679,15 +858,14 @@ void ivas_dirac_param_est_enc( assert( pp_fr_real ); assert( pp_fr_imag ); #endif - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) + + for ( i = 0; i < nchan_fb_in; i++ ) { - mvr2r( &pp_fr_real[i][block_m_idx * l_ts], Cldfb_RealBuffer[i], l_ts ); - mvr2r( &pp_fr_imag[i][block_m_idx * l_ts], Cldfb_ImagBuffer[i], l_ts ); + mvr2r( &pp_fr_real[i][ts * l_ts], Cldfb_RealBuffer[i], l_ts ); + mvr2r( &pp_fr_imag[i][ts * l_ts], Cldfb_ImagBuffer[i], l_ts ); } } - num_freq_bands = hDirAC->hConfig->nbands; - computeReferencePower_enc( hDirAC->band_grouping, Cldfb_RealBuffer, @@ -695,7 +873,13 @@ void ivas_dirac_param_est_enc( reference_power[ts], hDirAC->hConfig->enc_param_start_band, num_freq_bands, - sba_mode ); +#ifndef SBA_MODE_CLEAN_UP + hodirac_flag ? SBA_MODE_DIRAC : sba_mode, +#else + ivas_format, + hodirac_flag ? 0 : 1, +#endif + FOA_CHANNELS ); computeIntensityVector_enc( hDirAC, @@ -705,15 +889,18 @@ void ivas_dirac_param_est_enc( num_freq_bands, intensity_real ); - computeDirectionVectors( - intensity_real[0], - intensity_real[1], - intensity_real[2], - hDirAC->hConfig->enc_param_start_band, - num_freq_bands, - direction_vector[0], - direction_vector[1], - direction_vector[2] ); + if ( !hodirac_flag ) + { + computeDirectionVectors( + intensity_real[0], + intensity_real[1], + intensity_real[2], + hDirAC->hConfig->enc_param_start_band, + num_freq_bands, + direction_vector[0], + direction_vector[1], + direction_vector[2] ); + } /* fill buffers of length "averaging_length" time slots for intensity and energy */ hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % hDirAC->no_col_avg_diff ) + 1; /* averaging_length = 32 */ @@ -727,49 +914,104 @@ void ivas_dirac_param_est_enc( computeDiffuseness_mdft( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, hDirAC->no_col_avg_diff, diffuseness_vector ); - for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + if ( hodirac_flag ) { - norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); +#ifdef DEBUGGING + assert( l_ts <= DIRAC_NO_FB_BANDS_MAX ); +#endif + calculate_hodirac_sector_parameters( +#ifdef FIX_485_STATIC_BUFFERS + hDirAC, +#endif + Cldfb_RealBuffer, + Cldfb_ImagBuffer, + 0.20f, + hDirAC->band_grouping, + hDirAC->hConfig->nbands, + hDirAC->hConfig->enc_param_start_band, + azi_secs, + ele_secs, + diff_secs, + ene_secs ); + } - hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; - hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; - hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; - renormalization_factor[band_m_idx] += norm_tmp; + if ( hodirac_flag ) + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } + } + else + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + { + norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; + renormalization_factor[band_m_idx] += norm_tmp; - hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; - renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + hDirAC->diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + } } } - for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) + if ( !hodirac_flag ) + { - renormalization_factor[band_m_idx] = EPSILON; - for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) - { - renormalization_factor[band_m_idx] += ( hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] * hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] ); - } - renormalization_factor[band_m_idx] = sqrtf( renormalization_factor[band_m_idx] ); - if ( renormalization_factor[band_m_idx] > EPSILON ) - { - hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; - hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; - hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; - } - else + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) { - hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 1; - hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0; - hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0; + renormalization_factor[band_m_idx] = EPSILON; + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + renormalization_factor[band_m_idx] += ( hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] * hDirAC->direction_vector_m[d][block_m_idx][band_m_idx] ); + } + renormalization_factor[band_m_idx] = sqrtf( renormalization_factor[band_m_idx] ); + + if ( renormalization_factor[band_m_idx] > EPSILON ) + { + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] /= renormalization_factor[band_m_idx]; + } + else + { + hDirAC->direction_vector_m[0][block_m_idx][band_m_idx] = 1; + hDirAC->direction_vector_m[1][block_m_idx][band_m_idx] = 0; + hDirAC->direction_vector_m[2][block_m_idx][band_m_idx] = 0; + } + + /* save the elevation and azimuth values to be used later by the ivas_dirac_QuantizeParameters function */ + for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + { + dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx]; + } + + ivas_qmetadata_direction_vector_to_azimuth_elevation( + dir_v, + &q_direction->band_data[band_m_idx].azimuth[block_m_idx], + &q_direction->band_data[band_m_idx].elevation[block_m_idx] ); } + } - /* save the elevation and azimuth values to be used later by the ivas_dirac_QuantizeParameters function */ - for ( d = 0; d < DIRAC_NUM_DIMS; d++ ) + /* Sectors */ + if ( hodirac_flag ) + { + for ( band_m_idx = 0; band_m_idx < hDirAC->hConfig->nbands; band_m_idx++ ) { - dir_v[d] = hDirAC->direction_vector_m[d][block_m_idx][band_m_idx]; - } + q_direction->band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[band_m_idx]; + q_direction->band_data[band_m_idx].elevation[block_m_idx] = ele_secs[band_m_idx]; + // q_direction->band_data[band_m_idx].energy_ratio[block_m_idx] = 1.f - diffuseness_vector[band_m_idx]; // set later - ivas_qmetadata_direction_vector_to_azimuth_elevation( dir_v, &q_direction->band_data[band_m_idx].azimuth[block_m_idx], &q_direction->band_data[band_m_idx].elevation[block_m_idx] ); + q_direction[1].band_data[band_m_idx].azimuth[block_m_idx] = azi_secs[num_freq_bands + band_m_idx]; + q_direction[1].band_data[band_m_idx].elevation[block_m_idx] = ele_secs[num_freq_bands + band_m_idx]; + q_direction[1].band_data[band_m_idx].energy_ratio[block_m_idx] = ( 1.f - diff_secs[band_m_idx] ) / ( ( 1.f - diff_secs[band_m_idx] ) + ( 1.f - diff_secs[num_freq_bands + band_m_idx] ) + EPSILON ); + } } } diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index bc374f88e5..89a97ea0b0 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -62,7 +62,7 @@ ivas_error ivas_enc( BSTR_ENC_HANDLE hMetaData; Encoder_State *st; /* used for bitstream handling */ int16_t nb_bits_metadata[MAX_SCE]; - float data_f[MAX_INPUT_CHANNELS][L_FRAME48k]; /* IVAS_fmToDo: buffer can be allocated dynamically based on the number of analysed channels */ + float data_f[MAX_INPUT_CHANNELS][L_FRAME48k]; int32_t ivas_total_brate; ivas_error error; error = IVAS_ERR_OK; @@ -132,9 +132,13 @@ ivas_error ivas_enc( /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) { - if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) ) +#ifndef SBA_MODE_CLEAN_UP + if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) && !( st_ivas->sba_analysis_order > 1 ) ) +#else + if ( ( ivas_format == SBA_FORMAT ) && !( st_ivas->sba_analysis_order > 1 ) ) +#endif { - hp20( data_f[HOA_keep_ind[i]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); + hp20( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } else if ( !( ivas_format == MC_FORMAT && i == LFE_CHANNEL ) ) /*TODO: is the HPF needed for LFE channel? */ { @@ -217,8 +221,13 @@ ivas_error ivas_enc( /* SBA/MASA metadata encoding and SBA/MASA metadata bitstream writing */ hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) +#else + if ( st_ivas->hQMetaData != NULL && ivas_format != SBA_FORMAT ) +#endif { +#ifndef SBA_MODE_CLEAN_UP if ( ivas_format == SBA_FORMAT ) { ivas_dirac_enc( st_ivas->hDirAC, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], hEncoderConfig->Opt_DTX_ON, data_f, input_frame, hEncoderConfig->sba_planar ); @@ -227,6 +236,7 @@ ivas_error ivas_enc( } else { +#endif ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { @@ -237,9 +247,15 @@ ivas_error ivas_enc( { return error; } +#ifndef SBA_MODE_CLEAN_UP } +#endif } +#ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + else if ( ivas_format == SBA_FORMAT ) +#endif { if ( ( error = ivas_spar_enc( st_ivas, data_f, input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) { @@ -289,6 +305,7 @@ ivas_error ivas_enc( if ( st_ivas->mc_mode == MC_MODE_MCT ) { st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); } @@ -299,6 +316,20 @@ ivas_error ivas_enc( return error; } } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + + /* encode MC ParamUpmix parameters and write bitstream */ + ivas_mc_paramupmix_enc( st_ivas, hMetaData, data_f, input_frame ); + + st_ivas->hLFE->hBstr = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0]->hBstr : st_ivas->hCPE[0]->hCoreCoder[0]->hBstr; + ivas_lfe_enc( st_ivas->hLFE, data_f[LFE_CHANNEL], input_frame, st_ivas->hLFE->hBstr ); + + if ( ( error = ivas_mct_enc( st_ivas, data_f, input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) + { + return error; + } + } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { /* encode Parametric MC parameters and write bitstream */ @@ -340,6 +371,10 @@ ivas_error ivas_enc( return error; } +#ifdef IND_LIST_DYN + st_ivas->hCPE[0]->hCoreCoder[0]->hBstr->ind_list = st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->ind_list + st_ivas->hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot; +#endif + if ( ( error = ivas_cpe_enc( st_ivas, 0, data_f[0], data_f[1], input_frame, hMetaData->nb_bits_tot ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index e117cfc5a5..61c4ccaef9 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -34,6 +34,7 @@ #include "options.h" #include "prot.h" #include "ivas_prot.h" +#include "ivas_rom_com.h" #ifdef DEBUGGING #include "debug.h" #endif @@ -53,7 +54,7 @@ * Local functions declarations *------------------------------------------------------------------------------------------*/ -static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ); +static void ivas_band_cov( float **ppIn_FR_real, float **ppIn_FR_imag, const int16_t num_chans, const int16_t num_bins, int16_t stride, float **pFb_bin_to_band, const int16_t *pFb_start_bin_per_band, const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); /*------------------------------------------------------------------------- * ivas_spar_covar_enc_open() @@ -66,6 +67,11 @@ ivas_error ivas_spar_covar_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp /* i : number of input channels */ + , +#ifdef FIX_489_COV_SMOOTHING + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ +#endif + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { ivas_enc_cov_handler_state_t *hCovState; @@ -82,8 +88,25 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; +#ifdef FIX_489_COV_SMOOTHING + if ( smooth_mode == COV_SMOOTH_MC ) + { + cov_smooth_cfg.max_update_rate = 1.0f; + cov_smooth_cfg.min_pool_size = 20; + } +#else + if ( nchan_inp == 3 ) /* to discriminate between SPAR and mc there could be a better solution */ + { + cov_smooth_cfg.max_update_rate = 1.0f; + cov_smooth_cfg.min_pool_size = 20; + } +#endif - if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp ) ) != IVAS_ERR_OK ) +#ifdef FIX_489_COV_SMOOTHING + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -91,7 +114,11 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX; - if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp ) ) != IVAS_ERR_OK ) +#ifdef FIX_489_COV_SMOOTHING + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -152,7 +179,8 @@ void ivas_enc_cov_handler_process( const int16_t end_band, const int16_t num_ch, const int16_t dtx_vad, - const int16_t transient_det[2] ) + const int16_t transient_det[2], + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) { int16_t i, j; int16_t dtx_cov_flag; @@ -165,7 +193,8 @@ void ivas_enc_cov_handler_process( pFb->fb_bin_to_band.p_short_stride_start_bin_per_band, pFb->fb_bin_to_band.p_short_stride_num_bins_per_band, start_band, end_band, - cov_real ); + cov_real, + HOA_md_ind ); #ifdef DEBUG_SPAR_WRITE_OUT_COV { @@ -257,7 +286,8 @@ static void ivas_band_cov( const int16_t *pFb_active_bins_per_band, const int16_t start_band, const int16_t end_band, - float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH] ) + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) { int16_t i, j, k; float pV_re[L_FRAME48k]; @@ -267,9 +297,13 @@ static void ivas_band_cov( { for ( j = i; j < num_chans; j++ ) { + + int16_t i1 = HOA_md_ind[i]; + int16_t j1 = HOA_md_ind[j]; + for ( k = 0; k < num_bins; k++ ) { - pV_re[k] = ppIn_FR_real[i][k] * ppIn_FR_real[j][k] + ppIn_FR_imag[i][k] * ppIn_FR_imag[j][k]; + pV_re[k] = ppIn_FR_real[i1][k] * ppIn_FR_real[j1][k] + ppIn_FR_imag[i1][k] * ppIn_FR_imag[j1][k]; } for ( k = start_band; k < end_band; k++ ) diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index a8f5219f2a..830a05e41a 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -128,12 +128,20 @@ static ivas_error ivas_get_dyn_freq_model( * * Arith encoding of an array of symbols *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_arith_encode_array( +#else static void ivas_arith_encode_array( +#endif int16_t *pInput, ivas_arith_t *pArith, BSTR_ENC_HANDLE hMetaData, - const int16_t in_len ) + const int16_t in_len +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t model_index, i, ind; int16_t *pCum_freq = NULL; @@ -144,6 +152,12 @@ static void ivas_arith_encode_array( if ( pArith->dyn_model_bits > 0 ) { ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( ( hMetaData->nb_bits_tot + pArith->dyn_model_bits ) > wc_strat_arith ) + { + return -1; + } +#endif push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); } else @@ -158,12 +172,27 @@ static void ivas_arith_encode_array( ind = pInput[i] - pArith->vals[0]; ivas_ari_encode_14bits_ext( hMetaData, &as, ind, (const uint16_t *) pCum_freq ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot > wc_strat_arith ) + { + return -1; + } +#endif } ivas_ari_done_encoding_14bits( hMetaData, &as ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( hMetaData->nb_bits_tot > wc_strat_arith ) + { + return -1; + } +#endif } - +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -172,15 +201,26 @@ static void ivas_arith_encode_array( * * Differential arith encoding *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_arithCoder_encode_array_diff( +#else static void ivas_arithCoder_encode_array_diff( +#endif ivas_arith_t *pArith_diff, int16_t *pIn_new, int16_t *pIn_old_scratch, const int16_t length, - BSTR_ENC_HANDLE hMetaData ) + BSTR_ENC_HANDLE hMetaData +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t n; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif if ( length > 0 ) { @@ -191,10 +231,22 @@ static void ivas_arithCoder_encode_array_diff( ivas_wrap_arround( pIn_old_scratch, pArith_diff->vals[0], pArith_diff->vals[pArith_diff->range - 1], length ); +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length ); +#endif } - +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -228,16 +280,27 @@ void ivas_huffman_encode( * * Arithmetic encode a cell array *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t arith_encode_cell_array( +#else static void arith_encode_cell_array( +#endif ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t nB, ivas_arith_t *pArith, - int16_t *pSymbol ) + int16_t *pSymbol +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t total_symbol_len = 0; int16_t i; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif for ( i = 0; i < nB; i++ ) { @@ -250,11 +313,24 @@ static void arith_encode_cell_array( { if ( pArith->range > 1 ) { +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len ); +#endif } } +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -263,16 +339,27 @@ static void arith_encode_cell_array( * * Arithmetic encode a cell array - differential *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t arith_encode_cell_array_diff( +#else static void arith_encode_cell_array_diff( +#endif const ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, int16_t nB, ivas_arith_t *pArith_diff, int16_t *pSymbol_old, - int16_t *pSymbol ) + int16_t *pSymbol +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t i, total_symbol_len; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif total_symbol_len = 0; for ( i = 0; i < nB; i++ ) @@ -286,11 +373,24 @@ static void arith_encode_cell_array_diff( { if ( pArith_diff->range > 1 ) { +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData ); +#endif } } +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -299,8 +399,11 @@ static void arith_encode_cell_array_diff( * * Arithmetic encode a cell array *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +int16_t ivas_arith_encode_cmplx_cell_array( +#else void ivas_arith_encode_cmplx_cell_array( +#endif ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, @@ -309,7 +412,12 @@ void ivas_arith_encode_cmplx_cell_array( int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, - const int16_t any_diff ) + const int16_t any_diff +#ifdef ARITH_HUFF_CODER_CHANGES + , + int32_t wc_strat_arith +#endif +) { int16_t input_old[IVAS_MAX_INPUT_LEN]; int16_t input_new[IVAS_MAX_INPUT_LEN]; @@ -317,6 +425,9 @@ void ivas_arith_encode_cmplx_cell_array( ivas_cell_dim_t cell_dim[IVAS_MAX_NUM_BANDS], cell_dim_diff[IVAS_MAX_NUM_BANDS]; int16_t len, idx, i, j, idx1; int16_t total_len; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif idx1 = 0; if ( any_diff == 1 ) @@ -382,14 +493,44 @@ void ivas_arith_encode_cmplx_cell_array( }*/ #endif +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } + + arith_result = arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input ); arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new ); +#endif } else { +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re, + wc_strat_arith ); + if ( arith_result < 0 ) + { + return -1; + } +#else arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re ); +#endif } + +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index be476b1244..9593f6682f 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -407,8 +407,8 @@ ivas_error front_vad_spar( mvr2r( st->old_wsp, old_wsp, L_WSP_MEM ); wsp = old_wsp + L_WSP_MEM; - st->core_brate = -1; /* updated in dtx() */ - st->input_bwidth = st->last_input_bwidth; // VE: TBD - this might be updated by actual detected BW + st->core_brate = -1; /* updated in dtx() */ + st->input_bwidth = st->last_input_bwidth; /*------------------------------------------------------------------* * compensate for SPAR filterbank delay @@ -430,9 +430,7 @@ ivas_error front_vad_spar( noise_est_down( fr_bands[0], hFrontVad->hNoiseEst->bckr, tmpN, tmpE, st->min_band, st->max_band, &hFrontVad->hNoiseEst->totalNoise, Etot[0], &hFrontVad->hNoiseEst->Etot_last, &hFrontVad->hNoiseEst->Etot_v_h2 ); corr_shift = correlation_shift( hFrontVad->hNoiseEst->totalNoise ); - dtx( st, hEncoderConfig->ivas_total_brate, vad_flag_dtx[0], inp_12k8 ); - /* linear prediction analysis */ alw_pitch_lag_12k8[0] = st->old_pitch_la; alw_pitch_lag_12k8[1] = st->old_pitch_la; diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index d6f23d1c9b..006fb176fb 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -57,7 +57,7 @@ void ivas_write_format( ind = 0; nBits = IVAS_FORMAT_SIGNALING_NBITS; - extra_bits = ( IVAS_FORMAT_SIGNALING_NBITS_SBA - IVAS_FORMAT_SIGNALING_NBITS ); + extra_bits = ( IVAS_FORMAT_SIGNALING_NBITS_EXTENDED - IVAS_FORMAT_SIGNALING_NBITS ); switch ( st_ivas->hEncoderConfig->ivas_format ) { @@ -66,6 +66,11 @@ void ivas_write_format( break; case ISM_FORMAT: ind = 2; + if ( st_ivas->hEncoderConfig->ivas_total_brate >= IVAS_24k4 ) + { + ind = 4; + nBits += extra_bits; + } break; case MC_FORMAT: ind = 1; @@ -184,12 +189,16 @@ int16_t getNumChanAnalysis( n = st_ivas->nSCE + CPE_CHANNELS * st_ivas->nCPE; if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) { - n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); } else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_PARAMMC || st_ivas->mc_mode == MC_MODE_MCMASA ) ) { n = st_ivas->hEncoderConfig->nchan_inp; } + else if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + n = st_ivas->hEncoderConfig->nchan_inp; + } else if ( st_ivas->hEncoderConfig->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) { n = st_ivas->hEncoderConfig->nchan_inp; @@ -290,6 +299,9 @@ void ivas_initialize_handles_enc( /* MCT handle */ st_ivas->hMCT = NULL; + /* MC Param-Upmix handle */ + st_ivas->hMCParamUpmix = NULL; + /* Parametric MC handle */ st_ivas->hParamMC = NULL; @@ -313,9 +325,15 @@ void ivas_initialize_handles_enc( *-------------------------------------------------------------------*/ ivas_error ivas_init_encoder( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - Indice ind_list[][MAX_NUM_INDICES], /* o : bitstream indices */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +#ifndef IND_LIST_DYN + , + Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */ +#endif +#ifndef IND_LIST_DYN + , Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ +#endif ) { int16_t i, n; @@ -339,12 +357,60 @@ ivas_error ivas_init_encoder( /* In IVAS, ensure that minimum coded bandwidth is WB */ hEncoderConfig->max_bwidth = max( hEncoderConfig->max_bwidth, WB ); } - +#ifndef SBA_MODE_CLEAN_UP + hEncoderConfig->spar_reconfig_flag = 0; +#endif st_ivas->ism_mode = ISM_MODE_NONE; st_ivas->mc_mode = MC_MODE_NONE; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; +#endif st_ivas->nchan_transport = -1; + +#ifdef IND_LIST_DYN + /*-----------------------------------------------------------------* + * Allocate and initialize buffer of indices + *-----------------------------------------------------------------*/ + + /* set the maximum allowed number of indices in the list */ + st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( ivas_format, ivas_total_brate ); + + /* allocate buffer of indices */ + if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* reset the list of indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + st_ivas->ind_list[i].nb_bits = -1; + } + + /* set the maximum allowed number of metadata indices in the list */ + st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( st_ivas->hEncoderConfig->ivas_format, st_ivas->hEncoderConfig->ivas_total_brate ); + + /* allocate buffer of metadata indices */ + if ( st_ivas->ivas_max_num_indices_metadata > 0 ) + { + if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } + + /* reset the list of metadata indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + st_ivas->ind_list_metadata[i].nb_bits = -1; + } + } + else + { + st_ivas->ind_list_metadata = NULL; + } +#endif + /*-----------------------------------------------------------------* * Allocate and initialize SCE/CPE and other handles *-----------------------------------------------------------------*/ @@ -361,9 +427,10 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); +#endif /* prepare stereo downmix for EVS */ if ( hEncoderConfig->stereo_dmx_evs == 1 ) @@ -386,7 +453,8 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[n]; @@ -396,6 +464,7 @@ ivas_error ivas_init_encoder( /* MetaData for DFT stereo */ st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); +#endif } else if ( ivas_format == ISM_FORMAT ) { @@ -415,12 +484,14 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* MetaData for ISMs */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#endif } if ( st_ivas->ism_mode == ISM_MODE_PARAM ) @@ -448,18 +519,23 @@ ivas_error ivas_init_encoder( if ( ivas_format == SBA_FORMAT ) { - st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate ); +#ifndef SBA_MODE_CLEAN_UP + st_ivas->sba_mode = ivas_sba_mode_select(); +#endif st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); - +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) { +#endif if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) { return error; } - } +#ifndef SBA_MODE_CLEAN_UP + } +#endif if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -481,14 +557,20 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* MetaData for SBA */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#endif +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) +#else + if ( ivas_format == SBA_FORMAT && st_ivas->hEncoderConfig->Opt_DTX_ON ) +#endif { st_ivas->hSCE[sce_id]->hCoreCoder[0]->dtx_sce_sba = 1; } @@ -501,11 +583,12 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ for ( n = 0; n < CPE_CHANNELS; n++ ) { +#ifndef IND_LIST_DYN st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); +#endif if ( hEncoderConfig->Opt_DTX_ON ) { @@ -513,12 +596,14 @@ ivas_error ivas_init_encoder( } } +#ifndef IND_LIST_DYN /* Metadata only initialized for the last CPE index */ if ( cpe_id == st_ivas->nCPE - 1 ) { st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } if ( st_ivas->nCPE > 1 ) @@ -547,6 +632,8 @@ ivas_error ivas_init_encoder( return error; } +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when @@ -561,6 +648,7 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) @@ -575,6 +663,51 @@ ivas_error ivas_init_encoder( st_ivas->nchan_transport = ivas_mc_ls_setup_get_num_channels( st_ivas->hEncoderConfig->mc_input_setup ); } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + if ( ( error = ivas_mc_paramupmix_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + if ( ( error = create_cpe_enc( st_ivas, cpe_id, ( ivas_total_brate / st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) + { + return error; + } + +#ifndef IND_LIST_DYN + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + /* we need the correct bitstream also for the LFE channel since it might become a proper coded channel when + switching to ParamMC and ind_list is only visible here, can't be done later */ + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; + reset_indices_enc( st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr, MAX_NUM_INDICES ); + } + /* Metadata only initialized for the last CPE index*/ + if ( cpe_id == st_ivas->nCPE - 1 ) + { + st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; + reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); + } +#endif + } + + if ( ( error = create_mct_enc( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { if ( ( error = ivas_param_mc_enc_open( st_ivas ) ) != IVAS_ERR_OK ) @@ -589,7 +722,8 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n]; @@ -602,6 +736,7 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } if ( st_ivas->nCPE > 1 ) @@ -642,12 +777,14 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr->ind_list = ind_list[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); st_ivas->hSCE[sce_id]->hMetaData->ind_list = ind_list_metadata[sce_id]; reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); +#endif } for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) @@ -659,7 +796,8 @@ ivas_error ivas_init_encoder( return error; } - /* prepare bitstream buffers */ +#ifndef IND_LIST_DYN + /* allocate buffer of indices */ for ( n = 0; n < CPE_CHANNELS; n++ ) { st_ivas->hCPE[cpe_id]->hCoreCoder[n]->hBstr->ind_list = ind_list[cpe_id * CPE_CHANNELS + n + st_ivas->nSCE]; @@ -672,6 +810,7 @@ ivas_error ivas_init_encoder( st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[st_ivas->nSCE]; reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA ); } +#endif } } } @@ -725,6 +864,10 @@ void destroy_core_enc( ENC_CORE_HANDLE hCoreCoder /* i/o: core encoder structure */ ) { +#ifdef IND_LIST_DYN + int16_t i; +#endif + destroy_cldfb_encoder( hCoreCoder ); if ( hCoreCoder->hSignalBuf != NULL ) @@ -735,6 +878,13 @@ void destroy_core_enc( if ( hCoreCoder->hBstr != NULL ) { +#ifdef IND_LIST_DYN + /* reset buffer of indices */ + for ( i = 0; i < hCoreCoder->hBstr->nb_ind_tot; i++ ) + { + hCoreCoder->hBstr->ind_list[i].nb_bits = -1; + } +#endif free( hCoreCoder->hBstr ); hCoreCoder->hBstr = NULL; } @@ -950,6 +1100,9 @@ void ivas_destroy_enc( /* LFE handle */ ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + /* Param-Upmix MC handle */ + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); + /* Parametric MC handle */ ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); @@ -966,6 +1119,19 @@ void ivas_destroy_enc( st_ivas->hEncoderConfig = NULL; } +#ifdef IND_LIST_DYN + /* Buffer of indices */ + if ( st_ivas->ind_list != NULL ) + { + free( st_ivas->ind_list ); + } + + if ( st_ivas->ind_list_metadata != NULL ) + { + free( st_ivas->ind_list_metadata ); + } +#endif + /* main IVAS handle */ free( st_ivas ); diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index aff8b9a0b6..907997cf98 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -167,7 +167,14 @@ int16_t ivas_ism_dtx_enc( if ( dtx_flag ) { /* reset the bitstream (IVAS format signaling was already written) */ - reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, MAX_NUM_INDICES ); + reset_indices_enc( hSCE[0]->hCoreCoder[0]->hBstr, + +#ifdef IND_LIST_DYN + hSCE[0]->hCoreCoder[0]->hBstr->nb_ind_tot +#else + MAX_NUM_INDICES +#endif + ); } /*------------------------------------------------------------------* @@ -251,7 +258,15 @@ int16_t ivas_ism_dtx_enc( if ( hSCE[0]->hCoreCoder[0]->hBstr->nb_bits_tot == 0 ) { /* replicate ivas_write_format() */ - push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, 2 /* == ISM format */, IVAS_FORMAT_SIGNALING_NBITS ); + int16_t ind = 2; + nBits = IVAS_FORMAT_SIGNALING_NBITS; + if ( ivas_total_brate >= IVAS_24k4 ) + { + ind = 4; + nBits = IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; + } + + push_indice( hSCE[0]->hCoreCoder[0]->hBstr, IND_IVAS_FORMAT, ind, nBits ); } } else /* ism_dtx_flag == 1 */ diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 4a56252be8..6c6a0c8837 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -87,6 +87,9 @@ ivas_error ivas_ism_enc( int16_t localVAD_HE_SAD[1]; /* local HE VAD */ int16_t nchan_ism, dtx_flag, sid_flag, flag_noisy_speech; int16_t md_diff_flag[MAX_NUM_OBJECTS]; +#ifdef IND_LIST_DYN + Encoder_State *prev_st = NULL; +#endif ivas_error error; push_wmops( "ivas_ism_enc" ); @@ -222,16 +225,11 @@ ivas_error ivas_ism_enc( } else if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { - // VE: call ivas_ism_metadata_enc() with 'st_ivas' - TBD - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, - nchan_ism, - st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, st_ivas->hDirAC->hParamIsm, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); } else /* ISM_MODE_DISC */ { - ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, - nchan_ism, - st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); + ivas_ism_metadata_enc( st_ivas->hEncoderConfig->ivas_total_brate, nchan_ism, st_ivas->nchan_transport, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData, nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag ); } update_last_metadata( nchan_ism, st_ivas->hIsmMetaData, md_diff_flag ); @@ -256,6 +254,14 @@ ivas_error ivas_ism_enc( hSCE = st_ivas->hSCE[sce_id]; st = hSCE->hCoreCoder[0]; +#ifdef IND_LIST_DYN + /* update pointer to the buffer of indices of the next channel */ + if ( sce_id > 0 ) + { + st->hBstr->ind_list = prev_st->hBstr->ind_list + prev_st->hBstr->nb_ind_tot; + } +#endif + if ( st->low_rate_mode ) { st->bwidth = WB; @@ -303,6 +309,10 @@ ivas_error ivas_ism_enc( /* Store previous attack detection flag */ st->hTranDet->transientDetector.prev_bIsAttackPresent = st->hTranDet->transientDetector.bIsAttackPresent; + +#ifdef IND_LIST_DYN + prev_st = st; +#endif } if ( dtx_flag ) @@ -402,7 +412,7 @@ ivas_error ivas_ism_enc_config( st_ivas->nSCE = st_ivas->nchan_transport; st_ivas->nCPE = 0; - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index e5e1e99156..a8c4982e4b 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -55,8 +55,11 @@ #define ISM_MAX_ELEVATION_DIFF_IDX ( ISM_ELEVATION_NBITS - 1 /*zero*/ - 1 /*sign*/ ) #define ISM_MAX_RADIUS_DIFF_IDX ( ISM_RADIUS_NBITS - 1 /*zero*/ - 1 /*sign*/ ) -#define ISM_FEC_MAX 10 - +#define ISM_FEC_MAX 10 +#define ISM_MD_FEC_DIFF 10 +#define ISM_MD_INC_DIFF_CNT_MAX 6 +#define ISM_MD_FEC_CNT_MAX 25 +#define ISM_MD_RAD_FEC_DIFF 1 #define INTER_OBJECT_PARAM_CHECK ( ( ISM_FEC_MAX / 2 ) - 2 ) /* note: constant must be less than (ISM_FEC_MAX / number of coded parameters) */ @@ -76,12 +79,13 @@ static void encode_radius( BSTR_ENC_HANDLE hBstr, int16_t *last_radius_idx, int1 *-------------------------------------------------------------------------*/ ivas_error ivas_set_ism_metadata( - ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ - const float azimuth, /* i : azimuth value */ - const float elevation, /* i : elevation */ - const float radius_meta, /* i : radius */ - const float yaw, /* i : yaw */ - const float pitch /* i : pitch */ + ISM_METADATA_HANDLE hIsmMeta, /* o : ISM metadata handle */ + const float azimuth, /* i : azimuth value */ + const float elevation, /* i : elevation */ + const float radius_meta, /* i : radius */ + const float yaw, /* i : yaw */ + const float pitch, /* i : pitch */ + const int16_t non_diegetic_flag /* i : non-diegetic object flag*/ ) { if ( hIsmMeta == NULL ) @@ -97,6 +101,7 @@ ivas_error ivas_set_ism_metadata( hIsmMeta->radius = radius_meta; hIsmMeta->yaw = yaw; hIsmMeta->pitch = pitch; + hIsmMeta->non_diegetic_flag = non_diegetic_flag; return IVAS_ERR_OK; } @@ -187,6 +192,7 @@ ivas_error ivas_ism_metadata_enc( ISM_METADATA_HANDLE hIsmMetaData; int32_t element_brate[MAX_NUM_OBJECTS], total_brate[MAX_NUM_OBJECTS]; int16_t ism_metadata_flag_global; + int16_t non_diegetic_flag_global; int16_t ism_imp[MAX_NUM_OBJECTS]; int16_t nbands, nblocks; ivas_error error; @@ -195,9 +201,9 @@ ivas_error ivas_ism_metadata_enc( push_wmops( "ism_meta_enc" ); - /* initialization */ ism_metadata_flag_global = 0; + non_diegetic_flag_global = 0; set_s( nb_bits_metadata, 0, nchan_transport ); set_s( flag_abs_azimuth, 0, nchan_ism ); set_s( flag_abs_elevation, 0, nchan_ism ); @@ -217,7 +223,39 @@ ivas_error ivas_ism_metadata_enc( } else if ( ism_mode == ISM_MODE_DISC ) { - hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10; + if ( hIsmMeta[ch]->ism_metadata_flag == 1 ) + { + /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ + hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly; + /* in inactive frames, send MD 1) in ISM_MD_INC_DIFF_CNT_MAX consecutive frames when MD significantly change, 2) at least every ISM_MD_FEC_DIFF frames */ + if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + { + if ( ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_true_azimuth ) > ISM_MD_FEC_DIFF ) || + ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) ) + { + hIsmMeta[ch]->ism_metadata_flag = 1; + hIsmMeta[ch]->ism_md_inc_diff_cnt = 0; + } + else if ( hIsmMeta[ch]->ism_md_inc_diff_cnt < ISM_MD_INC_DIFF_CNT_MAX ) + { + hIsmMeta[ch]->ism_metadata_flag = 1; + + if ( hIsmMeta[ch]->ism_md_inc_diff_cnt % 2 == 0 ) + { + hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + } + else + { + hIsmMeta[ch]->position_angle.angle2_diff_cnt = ISM_FEC_MAX; + } + } + else if ( hIsmMeta[ch]->ism_md_fec_cnt_enc == ISM_MD_FEC_CNT_MAX ) + { + hIsmMeta[ch]->ism_metadata_flag = 1; + hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; + } + } + } } } @@ -239,10 +277,22 @@ ivas_error ivas_ism_metadata_enc( } push_indice( hBstr, IND_ISM_NUM_OBJECTS, 0, 1 ); + for ( ch = 0; ch < nchan_ism; ch++ ) + { + ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; + non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag; + } + /* write extended metadata presence flag */ if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE ) { push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS ); + + /* Write global non-diegetic object flag */ + if ( ism_extended_metadata_flag ) + { + push_indice( hBstr, IND_ISM_EXTENDED_NDP_FLAG, non_diegetic_flag_global, ISM_EXTENDED_METADATA_BITS ); + } } /* write ISM metadata flag (one per object) */ @@ -251,11 +301,6 @@ ivas_error ivas_ism_metadata_enc( push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } - for ( ch = 0; ch < nchan_ism; ch++ ) - { - ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; - } - if ( ism_mode == ISM_MODE_DISC ) { /* write VAD flag */ @@ -297,28 +342,56 @@ ivas_error ivas_ism_metadata_enc( * Quantize and encode azimuth and elevation *----------------------------------------------------------------*/ - if ( ism_mode == ISM_MODE_DISC ) + if ( ism_extended_metadata_flag && non_diegetic_flag_global ) { - idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - idx_angle2_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + /* Write non-diegetic flag for each object */ + push_indice( hBstr, IND_ISM_NDP_FLAG, hIsmMeta[ch]->non_diegetic_flag, ISM_METADATA_IS_NDP_BITS ); } - else /* ISM_MODE_PARAM */ + + if ( hIsmMeta[ch]->non_diegetic_flag ) { - idx_angle1_abs = hParamIsm->azi_index[ch]; - idx_angle2_abs = hParamIsm->ele_index[ch]; - } - encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); - /*----------------------------------------------------------------* - * Quantize and encode radius, yaw, and pitch - *----------------------------------------------------------------*/ + /* Map azimuth to panning range [-90:90] */ + if ( hIsmMetaData->azimuth > 90.0f ) + { + hIsmMetaData->azimuth = 180.0f - hIsmMetaData->azimuth; + } + + if ( hIsmMetaData->azimuth < -90.0f ) + { + hIsmMetaData->azimuth = -180.0f - hIsmMetaData->azimuth; + } - if ( ism_mode == ISM_MODE_DISC && ism_extended_metadata_flag ) + idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, 0, &flag_abs_azimuth[ch], NULL ); + } + else { - idx_angle1_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); - idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); - idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); - encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); - encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); + if ( ism_mode == ISM_MODE_DISC ) + { + idx_angle1_abs = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + idx_angle2_abs = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + } + else /* ISM_MODE_PARAM */ + { + idx_angle1_abs = hParamIsm->azi_index[ch]; + idx_angle2_abs = hParamIsm->ele_index[ch]; + } + + encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); + + /*----------------------------------------------------------------* + * Quantize and encode radius, yaw, and pitch + *----------------------------------------------------------------*/ + + if ( ism_mode == ISM_MODE_DISC && ism_extended_metadata_flag ) + { + idx_angle1_abs = ism_quant_meta( hIsmMetaData->yaw, &valQ, ism_azimuth_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_AZIMUTH_NBITS ); + idx_angle2_abs = ism_quant_meta( hIsmMetaData->pitch, &valQ, ism_elevation_borders, ISM_Q_STEP, ISM_Q_STEP_BORDER, 1 << ISM_ELEVATION_NBITS ); + idx_radius_abs = usquant( hIsmMetaData->radius, &valQ, ISM_RADIUS_MIN, ISM_RADIUS_DELTA, 1 << ISM_RADIUS_NBITS ); + + encode_angle_indices( hBstr, &( hIsmMetaData->orientation_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_yaw[ch], &flag_abs_pitch[ch] ); + encode_radius( hBstr, &hIsmMetaData->last_radius_idx, &hIsmMetaData->radius_diff_cnt, hIsmMetaData->last_ism_metadata_flag, idx_radius_abs, &flag_abs_radius[ch] ); + } } /* save number of metadata bits written */ @@ -326,6 +399,11 @@ ivas_error ivas_ism_metadata_enc( { nb_bits_metadata[ch] = hBstr->nb_bits_tot - nb_bits_start; } + + /* Updates */ + hIsmMeta[ch]->last_true_azimuth = hIsmMeta[ch]->azimuth; + hIsmMeta[ch]->last_true_elevation = hIsmMeta[ch]->elevation; + hIsmMeta[ch]->last_true_radius = hIsmMeta[ch]->radius; } } @@ -454,7 +532,7 @@ ivas_error ivas_ism_metadata_enc( * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) { return error; } @@ -462,18 +540,24 @@ ivas_error ivas_ism_metadata_enc( for ( ch = 0; ch < nchan_ism; ch++ ) { hIsmMeta[ch]->last_ism_metadata_flag = hIsmMeta[ch]->ism_metadata_flag; + + if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + { + hIsmMeta[ch]->ism_md_fec_cnt_enc++; + } + else + { + hIsmMeta[ch]->ism_md_fec_cnt_enc = 0; + } + hIsmMeta[ch]->ism_md_inc_diff_cnt++; + hIsmMeta[ch]->ism_md_inc_diff_cnt = min( hIsmMeta[ch]->ism_md_inc_diff_cnt, ISM_MD_INC_DIFF_CNT_MAX ); } for ( ch = 0; ch < nchan_transport; ch++ ) { -#ifdef FIX_419_ISM_BRATE_SW_DTX hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; -#endif if ( ism_mode == ISM_MODE_DISC ) { -#ifndef FIX_419_ISM_BRATE_SW_DTX - hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; -#endif if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; @@ -486,7 +570,11 @@ ivas_error ivas_ism_metadata_enc( /* write metadata only in active frames */ if ( hSCE[0]->hCoreCoder[0]->core_brate > SID_2k40 ) { +#ifdef IND_LIST_DYN + reset_indices_enc( hSCE[ch]->hMetaData, hSCE[ch]->hMetaData->nb_ind_tot ); +#else reset_indices_enc( hSCE[ch]->hMetaData, MAX_BITS_METADATA ); +#endif } } @@ -547,9 +635,15 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_azimuth = 0.0f; st_ivas->hIsmMetaData[ch]->last_elevation = 0.0f; + + st_ivas->hIsmMetaData[ch]->last_true_azimuth = 0.0f; + st_ivas->hIsmMetaData[ch]->last_true_elevation = 0.0f; + st_ivas->hIsmMetaData[ch]->ism_md_fec_cnt_enc = 0; + st_ivas->hIsmMetaData[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; + st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; } - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) { return error; } @@ -667,14 +761,14 @@ static void encode_radius( * Encoding of an angle *----------------------------------------------------------------*/ static void encode_angle_indices( - BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ ISM_METADATA_ANGLE_HANDLE angle, /* i/o: angle handle */ - const int16_t last_ism_metadata_flag, /* i : last frame ism_metadata_flag */ - const int16_t ini_frame, /* i : initialization frames counter */ - const int16_t idx_angle1_abs, /* i : Azimuth index */ - const int16_t idx_angle2_abs, /* i : Elevation index */ - int16_t *flag_abs_angle1, /* o : Azimuth/yaw encoding mode */ - int16_t *flag_abs_angle2 /* o : Elevation/pitch encoding mode */ + const int16_t last_ism_metadata_flag, /* i : last frame ism_metadata_flag */ + const int16_t ini_frame, /* i : initialization frames counter */ + const int16_t idx_angle1_abs, /* i : Azimuth index */ + const int16_t idx_angle2_abs, /* i : Elevation index */ + int16_t *flag_abs_angle1, /* o : Azimuth/yaw encoding mode */ + int16_t *flag_abs_angle2 /* o : Elevation/pitch encoding mode */ ) { int16_t idx_angle1, nbits_diff_angle1, diff; @@ -758,11 +852,7 @@ static void encode_angle_indices( if ( *flag_abs_angle1 == 0 ) { angle->angle1_diff_cnt++; -#ifdef FIX_419_ISM_MD_FIX angle->angle1_diff_cnt = min( angle->angle1_diff_cnt, ISM_FEC_MAX ); -#else - angle->angle2_diff_cnt = min( angle->angle2_diff_cnt, ISM_FEC_MAX ); -#endif } else { @@ -785,115 +875,118 @@ static void encode_angle_indices( * Elevation/pitch index encoding *----------------------------------------------------------------*/ - idx_angle2 = idx_angle2_abs; - nbits_diff_angle2 = 0; - *flag_abs_angle2 = 0; /* differential coding by default */ - if ( angle->angle2_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ - || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ - ) - { - *flag_abs_angle2 = 1; - } - - /* note: elevation/pitch is coded starting from the second frame only (it is meaningless in the init_frame) */ - if ( ini_frame == 0 ) + if ( flag_abs_angle2 ) { - *flag_abs_angle2 = 1; - angle->last_angle2_idx = idx_angle2_abs; - } - - diff = idx_angle2_abs - angle->last_angle2_idx; - - /* avoid absolute coding of elevation/pitch if absolute coding was already used for azimuth/yaw */ - if ( *flag_abs_angle1 == 1 ) - { - int16_t diff_orig = diff; - - *flag_abs_angle2 = 0; - - - if ( diff >= 0 ) + idx_angle2 = idx_angle2_abs; + nbits_diff_angle2 = 0; + *flag_abs_angle2 = 0; /* differential coding by default */ + if ( angle->angle2_diff_cnt == ISM_FEC_MAX /* make differential encoding in ISM_FEC_MAX consecutive frames at maximum (in order to control the decoding in FEC) */ + || last_ism_metadata_flag == 0 /* If last frame had no metadata coded, do not use differential coding */ + ) { - diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX ); - } - else - { - diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX ); + *flag_abs_angle2 = 1; } - if ( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX ) + /* note: elevation/pitch is coded starting from the second frame only (it is meaningless in the init_frame) */ + if ( ini_frame == 0 ) { - angle->angle2_diff_cnt = ISM_FEC_MAX - 1; + *flag_abs_angle2 = 1; + angle->last_angle2_idx = idx_angle2_abs; } - } - /* try differential coding */ - if ( *flag_abs_angle2 == 0 ) - { - if ( diff == 0 ) - { - idx_angle2 = 0; - nbits_diff_angle2 = 1; - } - else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX ) + diff = idx_angle2_abs - angle->last_angle2_idx; + + /* avoid absolute coding of elevation/pitch if absolute coding was already used for azimuth/yaw */ + if ( *flag_abs_angle1 == 1 ) { - idx_angle2 = 1 << 1; - nbits_diff_angle2 = 1; + int16_t diff_orig = diff; - if ( diff < 0 ) + *flag_abs_angle2 = 0; + + + if ( diff >= 0 ) { - idx_angle2 += 1; /* negative sign */ - diff *= -1; + diff = min( diff, ISM_MAX_ELEVATION_DIFF_IDX ); } else { - idx_angle2 += 0; /* positive sign */ + diff = -1 * min( -diff, ISM_MAX_ELEVATION_DIFF_IDX ); } - idx_angle2 = idx_angle2 << diff; - nbits_diff_angle2++; - - /* unary coding of "diff */ - idx_angle2 += ( ( 1 << diff ) - 1 ); - nbits_diff_angle2 += diff; + if ( last_ism_metadata_flag == 0 || abs( diff_orig - diff ) > ISM_MAX_ELEVATION_DIFF_IDX ) + { + angle->angle2_diff_cnt = ISM_FEC_MAX - 1; + } + } - if ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) + /* try differential coding */ + if ( *flag_abs_angle2 == 0 ) + { + if ( diff == 0 ) { - /* add stop bit */ - idx_angle2 = idx_angle2 << 1; + idx_angle2 = 0; + nbits_diff_angle2 = 1; + } + else if ( ABSVAL( diff ) <= ISM_MAX_ELEVATION_DIFF_IDX ) + { + idx_angle2 = 1 << 1; + nbits_diff_angle2 = 1; + + if ( diff < 0 ) + { + idx_angle2 += 1; /* negative sign */ + diff *= -1; + } + else + { + idx_angle2 += 0; /* positive sign */ + } + + idx_angle2 = idx_angle2 << diff; nbits_diff_angle2++; + + /* unary coding of "diff */ + idx_angle2 += ( ( 1 << diff ) - 1 ); + nbits_diff_angle2 += diff; + + if ( nbits_diff_angle2 < ISM_ELEVATION_NBITS ) + { + /* add stop bit */ + idx_angle2 = idx_angle2 << 1; + nbits_diff_angle2++; + } + } + else + { + *flag_abs_angle2 = 1; } } + + /* update counter */ + if ( *flag_abs_angle2 == 0 ) + { + angle->angle2_diff_cnt++; + angle->angle2_diff_cnt = min( angle->angle2_diff_cnt, ISM_FEC_MAX ); + } else { - *flag_abs_angle2 = 1; + angle->angle2_diff_cnt = 0; } - } - /* update counter */ - if ( *flag_abs_angle2 == 0 ) - { - angle->angle2_diff_cnt++; - angle->angle2_diff_cnt = min( angle->angle2_diff_cnt, ISM_FEC_MAX ); - } - else - { - angle->angle2_diff_cnt = 0; - } - - /* Write elevation */ - if ( *flag_abs_angle1 == 0 ) /* do not write "flag_abs_elevation/pitch" if "flag_abs_azimuth/yaw == 1" */ - { - push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_angle2, 1 ); - } + /* Write elevation */ + if ( *flag_abs_angle1 == 0 ) /* do not write "flag_abs_elevation/pitch" if "flag_abs_azimuth/yaw == 1" */ + { + push_indice( hBstr, IND_ISM_ELEVATION_DIFF_FLAG, *flag_abs_angle2, 1 ); + } - if ( *flag_abs_angle2 ) - { - push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, ISM_ELEVATION_NBITS ); - } - else - { - push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, nbits_diff_angle2 ); + if ( *flag_abs_angle2 ) + { + push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, ISM_ELEVATION_NBITS ); + } + else + { + push_indice( hBstr, IND_ISM_ELEVATION, idx_angle2, nbits_diff_angle2 ); + } } /*----------------------------------------------------------------* @@ -1032,6 +1125,9 @@ void ivas_ism_metadata_sid_enc( hIsmMetaData->position_angle.last_angle1_idx = idx_azimuth << ( ISM_AZIMUTH_NBITS - nBits_azimuth ); hIsmMetaData->position_angle.last_angle2_idx = idx_elevation << ( ISM_ELEVATION_NBITS - nBits_elevation ); } + + hIsmMetaData->ism_md_fec_cnt_enc = 0; + hIsmMeta[ch]->ism_md_inc_diff_cnt = ISM_MD_INC_DIFF_CNT_MAX; } } diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 32fb6af515..24038448d9 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -55,6 +55,10 @@ static void ivas_param_ism_compute_obj_parameters( int16_t i, b, m, br, mr; int16_t brange_start, brange_end, mrange_start, mrange_end, time_merge_fac; float power_ratios_m[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS]; + float ref_power_local_frame[MAX_NUM_OBJECTS]; + float tmp_ratio; + + set_f( ref_power_local_frame, 0, MAX_NUM_OBJECTS ); assert( nchan_ism == 3 || nchan_ism == 4 ); @@ -90,6 +94,8 @@ static void ivas_param_ism_compute_obj_parameters( ref_power_local[i] += reference_power_obj[i][mr][br]; } } + /* Sum up T/F tiles per object */ + ref_power_local_frame[i] += ref_power_local[i]; } /* find two dominant objects and derive object indices for current T/F tile */ @@ -145,6 +151,26 @@ static void ivas_param_ism_compute_obj_parameters( } } + /* Check if objects have roughly equal power by comparing reference power of first object against all others*/ + hParamIsm->flag_equal_energy = 1; + for ( i = 1; i < nchan_ism; i++ ) + { + if ( ref_power_local_frame[i] != 0.0f ) + { + tmp_ratio = ref_power_local_frame[0] / ref_power_local_frame[i]; + + if ( ( tmp_ratio > 0.975f ) && ( tmp_ratio < 1.025f ) ) + { + hParamIsm->flag_equal_energy &= 1; + } + else + { + hParamIsm->flag_equal_energy &= 0; + break; + } + } + } + return; } @@ -273,7 +299,13 @@ ivas_error ivas_param_ism_enc_open( /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#ifndef SBA_MODE_CLEAN_UP + if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -383,9 +415,11 @@ void ivas_param_ism_enc( for ( ts = 0; ts < num_time_slots; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts ); + ivas_fb_mixer_get_windowed_fr( hDirAC->hFbMixer, pcm_in, p_fb_RealBuffer, p_fb_ImagBuffer, l_ts, l_ts, + hDirAC->hFbMixer->fb_cfg->num_in_chans ); - ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts ); + ivas_fb_mixer_update_prior_input( hDirAC->hFbMixer, pcm_in, l_ts, + hDirAC->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < nchan_ism; i++ ) { @@ -426,35 +460,38 @@ void ivas_param_ism_compute_noisy_speech_flag( st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i + 1]; } - /* For the current frame, make a decision based on some core-coder flags */ - if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) + /* Set flag_noisy_speech to 0 for cases where object energies are not roughly equal */ + if ( !st_ivas->hDirAC->hParamIsm->flag_equal_energy ) { -#ifdef FIX_422 - if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) -#else - if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag && st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) -#endif + st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; + st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 0; + } + else + { + /* For the current frame, make a decision based on some core-coder flags */ + if ( st_ivas->hSCE[0]->hCoreCoder[0]->flag_noisy_speech_snr && st_ivas->hSCE[1]->hCoreCoder[0]->flag_noisy_speech_snr ) { - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; + if ( st_ivas->hSCE[0]->hCoreCoder[0]->vad_flag || st_ivas->hSCE[1]->hCoreCoder[0]->vad_flag ) + { + st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; + } + else + { + st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 1; + } } else { - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 1; + st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; } - } - else - { - - st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i] = 0; - } - /* Do a decision based on hysterisis */ - st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 1; - for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) - { - st_ivas->hDirAC->hParamIsm->flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech && st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i]; + /* Do a decision based on hysteresis */ + st_ivas->hDirAC->hParamIsm->flag_noisy_speech = 1; + for ( i = 0; i < PARAM_ISM_HYS_BUF_SIZE; i++ ) + { + st_ivas->hDirAC->hParamIsm->flag_noisy_speech = st_ivas->hDirAC->hParamIsm->flag_noisy_speech && st_ivas->hDirAC->hParamIsm->noisy_speech_buffer[i]; + } } - return; } diff --git a/lib_enc/ivas_lfe_enc.c b/lib_enc/ivas_lfe_enc.c index a14424774f..a76c31cdc5 100644 --- a/lib_enc/ivas_lfe_enc.c +++ b/lib_enc/ivas_lfe_enc.c @@ -98,7 +98,11 @@ static void ivas_lfe_enc_quant( BSTR_ENC_HANDLE hBstr ) { int16_t bits_written; +#ifdef IND_LIST_DYN + int16_t nb_ind_tot; +#else int16_t next_ind_pos; +#endif uint16_t quant_strategy, write_bit; int16_t num_quant_strategies; int16_t shift_bits; @@ -117,7 +121,11 @@ static void ivas_lfe_enc_quant( num_quant_strategies = IVAS_MAX_NUM_QUANT_STRATS; shift_bits = IVAS_LFE_SHIFT_BITS; bits_written = hBstr->nb_bits_tot; +#ifdef IND_LIST_DYN + nb_ind_tot = hBstr->nb_ind_tot; +#else next_ind_pos = hBstr->next_ind; +#endif for ( quant_strategy = 0; quant_strategy < num_quant_strategies; quant_strategy++ ) @@ -243,7 +251,11 @@ static void ivas_lfe_enc_quant( } bits_written_arith_enc = hBstr->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_pos_arith_enc = hBstr->nb_ind_tot; +#else next_ind_pos_arith_enc = hBstr->next_ind; +#endif push_next_indice( hBstr, coding_strategy, 1 ); base2_num_bits_tot = hBstr->nb_bits_tot - bits_written; @@ -259,13 +271,24 @@ static void ivas_lfe_enc_quant( { if ( quant_strategy == ( num_quant_strategies - 1 ) || ( ( target_bits + IVAS_LFE_ID_BITS ) >= base2_num_bits_tot ) ) { +#ifdef IND_LIST_DYN + /* reset bits buffer and code the indices with base 2 coding */ + for ( j = hBstr->nb_ind_tot - 1; j >= next_ind_pos_arith_enc; j-- ) + { + hBstr->ind_list[j].nb_bits = -1; + } + hBstr->nb_ind_tot = next_ind_pos_arith_enc; +#else /* reset bits buffer and code the indices with base 2 coding */ for ( j = hBstr->next_ind - 1; j >= next_ind_pos_arith_enc; j-- ) { hBstr->ind_list[j].nb_bits = -1; } +#endif hBstr->nb_bits_tot = bits_written_arith_enc; +#ifndef IND_LIST_DYN hBstr->next_ind = next_ind_pos_arith_enc; +#endif coding_strategy = 1; push_next_indice( hBstr, coding_strategy, 1 ); @@ -297,14 +320,21 @@ static void ivas_lfe_enc_quant( { if ( quant_strategy < ( num_quant_strategies - 1 ) ) { - /* reset all indices that were already written - TODO: maybe better store them temporarily first and write at the very end? */ +#ifdef IND_LIST_DYN + for ( j = hBstr->nb_ind_tot - 1; j >= nb_ind_tot; j-- ) +#else for ( j = hBstr->next_ind - 1; j >= next_ind_pos; j-- ) +#endif { hBstr->ind_list[j].nb_bits = -1; } hBstr->nb_bits_tot = bits_written; +#ifdef IND_LIST_DYN + hBstr->nb_ind_tot = nb_ind_tot; +#else hBstr->next_ind = next_ind_pos; +#endif } } } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 2a21a667e9..707e1b3397 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -61,7 +61,16 @@ static int16_t encode_lfe_to_total_energy_ratio( MASA_ENCODER_HANDLE hMasa, BSTR static void reduce_metadata_further( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hqmetadata, const IVAS_FORMAT ivas_format ); -static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] ); +static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] +#ifdef HR_METADATA + , + const SPHERICAL_GRID_DATA *sphGrid +#ifdef FIX_505_MASA_SPHGRID_REUSE + , + const uint8_t useSphGrid +#endif +#endif +); static void copy_masa_metadata_subframe( const MASA_METADATA_HANDLE hMetaFrom, const uint8_t sfFrom, MASA_METADATA_HANDLE hMetaTo, const uint8_t sfTo ); @@ -71,9 +80,7 @@ static uint8_t are_masa_subframes_similar( const MASA_METADATA_HANDLE frame1, co static void detect_framing_async( MASA_ENCODER_HANDLE hMasa ); -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT static void masa_metadata_direction_alignment( MASA_ENCODER_HANDLE hMasa ); -#endif /*-----------------------------------------------------------------------* * Local constants @@ -145,12 +152,10 @@ ivas_error ivas_masa_enc_open( hMasa->data.sync_state.prev_offset = 0; hMasa->data.sync_state.frame_mode = MASA_FRAME_4SF; -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT set_zero( hMasa->data.dir_align_state.previous_azi_dir1, MASA_FREQUENCY_BANDS ); set_zero( hMasa->data.dir_align_state.previous_ele_dir1, MASA_FREQUENCY_BANDS ); set_zero( hMasa->data.dir_align_state.previous_azi_dir2, MASA_FREQUENCY_BANDS ); set_zero( hMasa->data.dir_align_state.previous_ele_dir2, MASA_FREQUENCY_BANDS ); -#endif st_ivas->hMasa = hMasa; @@ -245,10 +250,20 @@ ivas_error ivas_masa_encode( mvr2r( hMasa->masaMetadata.directional_meta[i].azimuth[j], h_orig_metadata[i].azimuth[j], MASA_FREQUENCY_BANDS ); mvr2r( hMasa->masaMetadata.directional_meta[i].elevation[j], h_orig_metadata[i].elevation[j], MASA_FREQUENCY_BANDS ); mvr2r( hMasa->masaMetadata.directional_meta[i].energy_ratio[j], h_orig_metadata[i].energy_ratio[j], MASA_FREQUENCY_BANDS ); +#ifdef HR_METADATA + mvs2s( (int16_t *) ( hMasa->masaMetadata.directional_meta[i].spherical_index[j] ), (int16_t *) ( h_orig_metadata[i].spherical_index[j] ), MASA_FREQUENCY_BANDS ); +#endif } } } +#ifdef HR_METADATA + if ( ivas_format == MASA_FORMAT && ivas_total_brate >= IVAS_384k ) + { + hMasa->config.mergeRatiosOverSubframes = 0; + } +#endif + /* Combine frequency bands and sub-frames */ combine_freqbands_and_subframes( hMasa ); } @@ -312,7 +327,26 @@ ivas_error ivas_masa_encode( } /* Encode metadata */ - ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); +#ifdef HR_METADATA + if ( ivas_total_brate >= IVAS_384k ) + { + if ( ivas_total_brate >= IVAS_512k ) + { + ivas_qmetadata_enc_encode_hr_384_512( hMetaData, hQMetaData, 16, 4 ); + } + else + { + ivas_qmetadata_enc_encode_hr_384_512( hMetaData, hQMetaData, 11, 3 ); + } + } + else + { +#endif + ivas_qmetadata_enc_encode( hMetaData, hQMetaData, + 0 ); +#ifdef HR_METADATA + } +#endif *nb_bits_metadata = hMetaData->nb_bits_tot; @@ -368,7 +402,11 @@ ivas_error ivas_masa_encode( free( h_orig_metadata ); +#ifndef SBA_MODE_CLEAN_UP ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format, SBA_MODE_NONE ); +#else + ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format ); +#endif /* restore old values */ hMasa->config.numCodingBands = numCodingBands; @@ -469,7 +507,16 @@ ivas_error ivas_masa_enc_config( uint8_t coherencePresent; uint8_t isActualTwoDir; /* Flag to tell that when there are two directions present in metadata, they both contain meaningful information. */ int32_t ivas_total_brate; +#ifdef FIX_HBR_MASAMETA + uint8_t maxBand; + int16_t maxBin, sf; +#endif ivas_error error; +#ifdef HR_METADATA +#ifndef FIX_505_MASA_SPHGRID_REUSE + SPHERICAL_GRID_DATA *sphGrid; +#endif +#endif error = IVAS_ERR_OK; @@ -484,16 +531,42 @@ ivas_error ivas_masa_enc_config( if ( ivas_format == MASA_FORMAT ) { -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT masa_metadata_direction_alignment( hMasa ); -#endif detect_framing_async( hMasa ); /* detect the offset, set 1sf/4sf mode based on this. potentially also shift the metadata using a history buffer */ if ( hMasa->data.sync_state.frame_mode == MASA_FRAME_1SF && hMasa->data.sync_state.prev_offset != 0 ) { +#ifdef HR_METADATA +#ifndef FIX_505_MASA_SPHGRID_REUSE + if ( ( sphGrid = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA spherical grid\n" ) ); + } + + if ( ivas_total_brate == IVAS_512k ) + { + generate_gridEq( sphGrid ); + } + else + { + sphGrid->no_theta = 0; + } +#endif +#endif + /* average over sub-frames */ - average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy ); + average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy +#ifdef HR_METADATA + , +#ifdef FIX_505_MASA_SPHGRID_REUSE + &( hMasa->data.Sph_Grid16 ), + ivas_total_brate == IVAS_512k ? TRUE : FALSE +#else + sphGrid +#endif +#endif + ); } /* Inspect metadata for parameter changes that affect coding. */ @@ -585,7 +658,57 @@ ivas_error ivas_masa_enc_config( ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format ); +#ifdef FIX_HBR_MASAMETA + /* Find maximum band usable */ + maxBin = (int16_t) ( st_ivas->hEncoderConfig->input_Fs * INV_CLDFB_BANDWIDTH ); + maxBand = 0; + while ( maxBand <= MASA_FREQUENCY_BANDS && MASA_band_grouping_24[maxBand] <= maxBin ) + { + maxBand++; + } + maxBand--; + + if ( ivas_total_brate > IVAS_256k ) + { + int16_t continueLoop; + continueLoop = 1; + while ( maxBand > 5 && continueLoop ) + { + for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) + { + if ( hMasa->data.energy[sf][maxBand - 1] > 100000 ) + { + continueLoop = 0; + break; + } + } + if ( continueLoop ) + { + maxBand--; + } + } + + if ( maxBand < MASA_MAXIMUM_CODING_SUBBANDS ) + { + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = MASA_MAXIMUM_CODING_SUBBANDS - maxBand; + } + else + { + st_ivas->hQMetaData->q_direction->cfg.inactiveBands = 0; + } + } + + masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, maxBand, ivas_total_brate > IVAS_256k, NULL ); + + if ( hMasa->config.numTwoDirBands >= hMasa->config.numCodingBands ) + { + hMasa->config.numTwoDirBands = hMasa->config.numCodingBands; + set_c( (int8_t *) hMasa->data.twoDirBands, 1, hMasa->config.numCodingBands ); + } + +#else masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL ); +#endif /* Transmit stereo signals using a mono downmix at lowest bitrates */ if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) @@ -692,8 +815,11 @@ static void combine_freqbands_and_subframes( } } } - +#ifdef FIX_HBR_MASAMETA + if ( numCodingBands <= MAX_REDUCED_NBANDS ) +#else if ( numCodingBands < MASA_FREQUENCY_BANDS ) +#endif { /* reduce metadata *frequency* resolution. time resolution is not touched */ for ( i = 0; i < numDirections; i++ ) @@ -1023,6 +1149,9 @@ static void move_metadata_to_qmetadata( hQMeta->q_direction[dir].band_data[band].azimuth[sf] = hMeta->directional_meta[dir].azimuth[sf][band]; hQMeta->q_direction[dir].band_data[band].elevation[sf] = hMeta->directional_meta[dir].elevation[sf][band]; hQMeta->q_direction[dir].band_data[band].energy_ratio[sf] = hMeta->directional_meta[dir].energy_ratio[sf][band]; +#ifdef HR_METADATA + hQMeta->q_direction[dir].band_data[band].spherical_index[sf] = hMeta->directional_meta[dir].spherical_index[sf][band]; +#endif if ( hQMeta->q_direction[dir].coherence_band_data != NULL ) { hQMeta->q_direction[dir].coherence_band_data[band].spread_coherence[sf] = (uint8_t) roundf( hMeta->directional_meta[dir].spread_coherence[sf][band] * UINT8_MAX ); @@ -1710,7 +1839,16 @@ void ivas_masa_enc_reconfigure( static void average_masa_metadata( MASA_METADATA_FRAME *hMeta, - float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] ) + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] +#ifdef HR_METADATA + , + const SPHERICAL_GRID_DATA *Sph_Grid16 +#ifdef FIX_505_MASA_SPHGRID_REUSE + , + const uint8_t useSphGrid +#endif +#endif +) { int16_t i, j, k; float azi_rad, ele_rad; @@ -1757,7 +1895,17 @@ static void average_masa_metadata( j = 0; hMeta->directional_meta[i].azimuth[j][k] = atan2f( y_sum, x_sum ) / EVS_PI * 180.0f; hMeta->directional_meta[i].elevation[j][k] = atan2f( z_sum, sqrtf( x_sum * x_sum + y_sum * y_sum ) ) / EVS_PI * 180.0f; - +#ifdef HR_METADATA +#ifdef FIX_505_MASA_SPHGRID_REUSE + if ( useSphGrid == TRUE ) +#else + if ( Sph_Grid16->no_theta > 0 ) +#endif + { + hMeta->directional_meta[i].spherical_index[j][k] = index_theta_phi_16( &( hMeta->directional_meta[i].elevation[j][k] ), + &( hMeta->directional_meta[i].azimuth[j][k] ), Sph_Grid16 ); + } +#endif vec_len = sqrtf( x_sum * x_sum + y_sum * y_sum + z_sum * z_sum ); hMeta->directional_meta[i].energy_ratio[j][k] = vec_len / ( energy_sum + EPSILON ); @@ -1956,7 +2104,6 @@ static uint8_t are_masa_subframes_similar( } } - /* TODO: a nicer negation */ // VE: ?? if ( sf_differ ) { return FALSE; @@ -2101,7 +2248,6 @@ static void detect_framing_async( } -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT /*-------------------------------------------------------------------* * masa_metadata_direction_alignment() * @@ -2216,6 +2362,9 @@ static void masa_metadata_direction_alignment( { /* swap the metadata of the two directions in this TF-tile */ float tmp_val; +#ifdef FIX_HBR_MASAMETA + uint16_t tmp_int_val; +#endif tmp_val = hMeta->directional_meta[0].azimuth[sf][band]; hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; hMeta->directional_meta[1].azimuth[sf][band] = tmp_val; @@ -2223,7 +2372,11 @@ static void masa_metadata_direction_alignment( tmp_val = hMeta->directional_meta[0].elevation[sf][band]; hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; hMeta->directional_meta[1].elevation[sf][band] = tmp_val; - +#ifdef FIX_HBR_MASAMETA + tmp_int_val = hMeta->directional_meta[0].spherical_index[sf][band]; + hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; + hMeta->directional_meta[1].spherical_index[sf][band] = tmp_int_val; +#endif tmp_val = hMeta->directional_meta[0].energy_ratio[sf][band]; hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; hMeta->directional_meta[1].energy_ratio[sf][band] = tmp_val; @@ -2263,4 +2416,3 @@ static void masa_metadata_direction_alignment( return; } -#endif diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 14eca6afee..ba746ff442 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -140,7 +140,13 @@ ivas_error ivas_param_mc_enc_open( hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#ifndef SBA_MODE_CLEAN_UP + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, nchan_inp, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -199,11 +205,7 @@ ivas_error ivas_param_mc_enc_open( /* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */ for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ ) { -#ifdef PARAMMC_SHORT_ENC_MDFT hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC; -#else - hParamMC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; -#endif } /* set correct coded band width */ @@ -339,11 +341,7 @@ ivas_error ivas_param_mc_enc_reconfig( /* parameter band grouping: 60 band CLDFB to 240 band MDFT resolution */ for ( i = 0; i < hParamMC->hMetadataPMC.num_parameter_bands + 1; i++ ) { -#ifdef PARAMMC_SHORT_ENC_MDFT hParamMC->band_grouping[i] *= PARAM_MC_CLDFB_TO_MDFT_FAC; -#else - hParamMC->band_grouping[i] *= CLDFB_TO_MDFT_FAC; -#endif } /* set correct coded band width */ @@ -681,7 +679,8 @@ static void ivas_param_mc_param_est_enc( for ( ts = 0; ts < start_ts; ts++ ) { - ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts ); + ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts, + hParamMC->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < nchan_input; i++ ) { pcm_in[i] += l_ts; @@ -690,12 +689,11 @@ static void ivas_param_mc_param_est_enc( for ( ts = start_ts; ts < num_time_slots; ts++ ) { -#ifdef PARAMMC_SHORT_ENC_MDFT - ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts ); -#else - ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, 2 * l_ts ); -#endif - ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts ); + ivas_fb_mixer_get_windowed_fr( hParamMC->hFbMixer, pcm_in, p_slot_frame_f_real, p_slot_frame_f_imag, l_ts, l_ts, + hParamMC->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hParamMC->hFbMixer, pcm_in, l_ts, + hParamMC->hFbMixer->fb_cfg->num_in_chans ); + for ( i = 0; i < nchan_input; i++ ) { pcm_in[i] += l_ts; diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c new file mode 100644 index 0000000000..c5ee2950db --- /dev/null +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -0,0 +1,858 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include "cnst.h" +#include "rom_enc.h" +#include "rom_com.h" +#include "prot.h" +#include "ivas_prot.h" +#include "ivas_cnst.h" +#include "ivas_rom_com.h" +#include "ivas_rom_enc.h" +#ifdef DEBUGGING +#include "debug.h" +#endif +#ifdef DEBUG_PLOT +#include "deb_out.h" +#endif +#include "wmc_auto.h" + +/*------------------------------------------------------------------------- + * Local function prototypes + *------------------------------------------------------------------------*/ + +static void ivas_mc_paramupmix_dmx( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float data_f[][L_FRAME48k], const int16_t input_frame ); + +static void ivas_mc_paramupmix_param_est_enc( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float input_frame_t[][L_FRAME48k], const int16_t input_frame, float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ); + +static void get_huff_table( PAR_TYPE par_type, QUANT_TYPE quant_type, HUFF_TAB *df0, HUFF_TAB *df, HUFF_TAB *dt ); + +static void write_huff_bits( int32_t value, uint16_t length, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); + +static void huffman_encode( int16_t bdfOnly, int16_t bdtAllowed, int16_t nv, int16_t ivStart, int32_t *vqPrev, int32_t *vq, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t nq, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); + +static void put_ec_data( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, int16_t ch, float pars[IVAS_MAX_NUM_BANDS], float alphas[IVAS_MAX_NUM_BANDS], PAR_TYPE parType, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); + +static void quantize_alpha( int16_t nv, const float *alpha, QUANT_TYPE quant_type, int16_t *pnq, int32_t aq[IVAS_MAX_NUM_BANDS], float *adeq ); + +static void quantize_pars( int16_t nv, const float *v, int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ); + +static void quantize_pars( int16_t nv, const float *v, int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ); + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_enc() + * + * MC ParamUpmix Encoder main encoding function + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_enc( + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hBStr, /* i/o: IVAS Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ + const int16_t input_frame /* i : input frame length */ +) +{ + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; + int16_t i; + float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS]; + int16_t bit_pos; + + push_wmops( "mc_paramupmix_enc" ); + + hMCParamUpmix = st_ivas->hMCParamUpmix; + bit_pos = 0; + + /* Parameter estimation */ + ivas_mc_paramupmix_param_est_enc( hMCParamUpmix, data_f, input_frame, alphas, betas ); + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + put_ec_data( hMCParamUpmix, i, alphas[i], NULL, ALPHA, bit_buffer, &bit_pos ); + put_ec_data( hMCParamUpmix, i, betas[i], alphas[i], BETA, bit_buffer, &bit_pos ); + } + + /* push the PARAM UPMIX MC side info from the temporary buffer into the medatdata bitstream*/ + push_next_bits( hBStr, bit_buffer, bit_pos ); + + /* DMX generation*/ + ivas_mc_paramupmix_dmx( hMCParamUpmix, data_f, input_frame ); + + pop_wmops(); + + return; +} + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_enc_open() + * + * Initialize MC ParamUpmix encoder handle + *------------------------------------------------------------------------*/ + +ivas_error ivas_mc_paramupmix_enc_open( + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ +) +{ + IVAS_FB_CFG *fb_cfg; + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; + int32_t input_Fs; + int32_t input_frame; + int16_t i, k, b, j; + ivas_error error; + + error = IVAS_ERR_OK; + input_Fs = st_ivas->hEncoderConfig->input_Fs; + input_frame = (int32_t) st_ivas->hEncoderConfig->input_Fs / FRAMES_PER_SEC; + + /* Sanity Checks */ + if ( ( hMCParamUpmix = (MC_PARAMUPMIX_ENC_HANDLE) malloc( sizeof( MC_PARAMUPMIX_ENC_DATA ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MC_MODE_PARAMUPMIX\n" ) ); + } + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + for ( k = 0; k < MC_PARAMUPMIX_NCH; k++ ) + { + if ( ( hMCParamUpmix->midside[i][k] = (float *) malloc( sizeof( float ) * input_frame ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MC_MODE_PARAMUPMIX\n" ) ); + } + set_zero( hMCParamUpmix->midside[i][k], (int16_t) input_frame ); + } + } + hMCParamUpmix->first_frame = 1; + + /* MC_LS_SETUP_5_1_2 is the only current configuration */ + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + /* set core coder dependent on the number of transport channels */ + switch ( st_ivas->nchan_transport ) + { + case 8: + st_ivas->nCPE = 4; + st_ivas->nSCE = 0; + st_ivas->hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; + break; +#ifdef DEBUGGING + default: + assert( 0 && "Number of transport channels not supported by MC PARAM UPMIX MODE!\n" ); +#endif + } + + + /* Transient Detector handle */ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( error = ivas_transient_det_open( &( hMCParamUpmix->hTranDet[i] ), input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + /* set FB config. */ + /* need to set num output channels to a value > 0 to get pFb != NULL */ +#ifndef SBA_MODE_CLEAN_UP + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + fb_cfg->remix_order = mc_paramupmix_fb_remix_order; + /* override latency, could be moved to ivas_fb_set_cfg */ + /* assuming parameters are calculated at end of frame, compensate for MCT delay and half of decoder fb */ + /* still 1.5ms off, since MCT delay is not large enough */ + /* param at end of frame */ + fb_cfg->prior_input_length = (int16_t) ( NS2SA( input_Fs, 12000000L ) + NS2SA( input_Fs, DELAY_FB_4_NS / 2 ) - input_frame / 2 - NS2SA( input_Fs, DELAY_FB_1_NS / 2 ) ); + fb_cfg->prior_input_length = (int16_t) max( fb_cfg->prior_input_length, input_frame / MAX_PARAM_SPATIAL_SUBFRAMES ); + + /* Allocate and initialize FB mixer handle */ + if ( ( error = ivas_FB_mixer_open( &( hMCParamUpmix->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + /* Covariance handle */ +#ifdef FIX_489_COV_SMOOTHING + if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, COV_SMOOTH_MC, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#endif + { + return error; + } + } + + + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + if ( ( hMCParamUpmix->cov_real[b] = (float ***) malloc( MC_PARAMUPMIX_NCH * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" ); + } + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( hMCParamUpmix->cov_real[b][i] = (float **) malloc( MC_PARAMUPMIX_NCH * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" ); + } + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + if ( ( hMCParamUpmix->cov_real[b][i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov real matrix" ); + } + } + } + + if ( ( hMCParamUpmix->cov_dtx_real[b] = (float ***) malloc( MC_PARAMUPMIX_NCH * sizeof( float ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" ); + } + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( hMCParamUpmix->cov_dtx_real[b][i] = (float **) malloc( MC_PARAMUPMIX_NCH * sizeof( float * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" ); + } + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + if ( ( hMCParamUpmix->cov_dtx_real[b][i][j] = (float *) malloc( IVAS_MAX_NUM_BANDS * sizeof( float ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR cov dtx real matrix" ); + } + } + } + } + + st_ivas->hMCParamUpmix = hMCParamUpmix; + + return error; +} + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_enc_close() + * + * Close MC Param-Upmix encoder handle + *------------------------------------------------------------------------*/ + +void ivas_mc_paramupmix_enc_close( + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + const int32_t sampling_rate ) +{ + int16_t i, k; + int16_t b, j; + + if ( hMCParamUpmix == NULL || *hMCParamUpmix == NULL ) + { + return; + } + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + if ( ( *hMCParamUpmix )->cov_real[b] != NULL ) + { + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( *hMCParamUpmix )->cov_real[b][i] != NULL ) + { + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + if ( ( *hMCParamUpmix )->cov_real[b][i][j] != NULL ) + { + free( ( *hMCParamUpmix )->cov_real[b][i][j] ); + } + } + free( ( *hMCParamUpmix )->cov_real[b][i] ); + } + } + free( ( *hMCParamUpmix )->cov_real[b] ); + } + if ( ( *hMCParamUpmix )->cov_dtx_real[b] != NULL ) + { + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + if ( ( *hMCParamUpmix )->cov_dtx_real[b][i] != NULL ) + { + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + if ( ( *hMCParamUpmix )->cov_dtx_real[b][i][j] != NULL ) + { + free( ( *hMCParamUpmix )->cov_dtx_real[b][i][j] ); + } + } + free( ( *hMCParamUpmix )->cov_dtx_real[b][i] ); + } + } + free( ( *hMCParamUpmix )->cov_dtx_real[b] ); + } + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + for ( k = 0; k < MC_PARAMUPMIX_NCH; k++ ) + { + free( ( *hMCParamUpmix )->midside[i][k] ); + } + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + ivas_transient_det_close( &( *hMCParamUpmix )->hTranDet[i] ); + } + + if ( ( *hMCParamUpmix )->hFbMixer != NULL ) + { + ivas_FB_mixer_close( &( *hMCParamUpmix )->hFbMixer, sampling_rate, 0 ); + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + /* Covariance handle */ + if ( ( *hMCParamUpmix )->hCovEnc[i] != NULL ) + { + ivas_spar_covar_enc_close( &( *hMCParamUpmix )->hCovEnc[i], ( MC_PARAMUPMIX_NCH + 1 ) ); + } + } + + free( *hMCParamUpmix ); + *hMCParamUpmix = NULL; + return; +} + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_getNumTransportChannels() + * + * + *------------------------------------------------------------------------*/ + +/* r : number of IVAS transport channels */ +int16_t ivas_mc_paramupmix_getNumTransportChannels() +{ + int16_t nchan_transport; + + /* LFE not included */ + nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS - 1; /*5_1_2*/ + + return nchan_transport; +} + + +/*****************************************************************************************/ +/* local functions */ +/*****************************************************************************************/ +static void get_huff_table( + PAR_TYPE par_type, + QUANT_TYPE quant_type, + HUFF_TAB *df0, + HUFF_TAB *df, + HUFF_TAB *dt ) +{ + switch ( par_type ) + { + case ALPHA: + df0->value = huff_alpha_table[quant_type].df0.value; + df0->length = huff_alpha_table[quant_type].df0.length; + df->value = huff_alpha_table[quant_type].df.value; + df->length = huff_alpha_table[quant_type].df.length; + dt->value = huff_alpha_table[quant_type].dt.value; + dt->length = huff_alpha_table[quant_type].dt.length; + break; + case BETA: + df0->value = huff_beta_table[quant_type].df0.value; + df0->length = huff_beta_table[quant_type].df0.length; + df->value = huff_beta_table[quant_type].df.value; + df->length = huff_beta_table[quant_type].df.length; + dt->value = huff_beta_table[quant_type].dt.value; + dt->length = huff_beta_table[quant_type].dt.length; + break; + } +} + +static void write_huff_bits( + int32_t value, + uint16_t length, + uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], + int16_t *bit_pos ) +{ + int16_t k; + for ( k = length - 1; k >= 0; k-- ) + { + bit_buffer[( *bit_pos )++] = (uint16_t) ( ( value >> k ) & 1 ); + } +} + +static void huffman_encode( + int16_t bdfOnly, + int16_t bdtAllowed, + int16_t nv, + int16_t ivStart, + int32_t *vqPrev, + int32_t *vq, + PAR_TYPE parType, + QUANT_TYPE quant_type, + int16_t nq, + uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], + int16_t *bit_pos ) +{ + int16_t iv, ndf, ndt; + int32_t icode; + int16_t offset; + HUFF_TAB df0, df, dt; + + get_huff_table( parType, quant_type, &df0, &df, &dt ); + + offset = nq - 1; /* range [-(nquant - 1), nquant - 1] */ + + /* Get code length for time and freq diff coding */ + ndf = 0; + ndt = 0; + for ( iv = ivStart; iv < nv; iv++ ) + { + if ( iv == ivStart ) + { + icode = vq[iv]; + ndf += df0.length[icode]; + } + else + { + icode = vq[iv] - vq[iv - 1] + offset; + ndf += df.length[icode]; + } + + icode = vq[iv] - vqPrev[iv] + offset; + ndt += dt.length[icode]; + } + + if ( !bdtAllowed ) /* Time diff not allowed due to conformance or other reason even if bdfOnly = 0 */ + { + ndt = ndf + 1; + } + + /* Write the bitstream */ + if ( bdfOnly || ndf < ndt ) + { + bit_buffer[( *bit_pos )++] = (uint16_t) 0 & 1; + for ( iv = ivStart; iv < nv; iv++ ) + { + if ( iv == ivStart ) + { + icode = vq[iv]; + write_huff_bits( df0.value[icode], df0.length[icode], bit_buffer, bit_pos ); + } + else + { + icode = vq[iv] - vq[iv - 1] + offset; + write_huff_bits( df.value[icode], df.length[icode], bit_buffer, bit_pos ); + } + } + } + else + { + bit_buffer[( *bit_pos )++] = (uint16_t) 1 & 1; + for ( iv = ivStart; iv < nv; iv++ ) + { + icode = vq[iv] - vqPrev[iv] + offset; + if ( icode < 0 || icode >= 2 * nq - 1 ) + { + assert( 0 ); + } + write_huff_bits( dt.value[icode], dt.length[icode], bit_buffer, bit_pos ); + } + } +} + +static void quantize_pars( + int16_t nv, + const float *v, + int16_t nq, + const float *data, + int32_t vq[IVAS_MAX_NUM_BANDS], + float *vdeq ) +{ + int16_t iv, iq, iq0, iq1; + + for ( iv = 0; iv < nv; iv++ ) + { + iq0 = 0; + iq1 = nq - 1; + + while ( iq1 - iq0 > 1 ) + { + iq = ( iq0 + iq1 ) / 2; + if ( v[iv] < data[iq] ) + { + iq1 = iq; + } + else + { + iq0 = iq; + } + } + + if ( fabs( v[iv] - data[iq0] ) < fabs( v[iv] - data[iq1] ) ) + { + vq[iv] = iq0; + vdeq[iv] = data[iq0]; + } + else + { + vq[iv] = iq1; + vdeq[iv] = data[iq1]; + } + } +} + +static void quantize_alpha( + int16_t nv, + const float *alpha, + QUANT_TYPE quant_type, + int16_t *pnq, + int32_t aq[IVAS_MAX_NUM_BANDS], + float *adeq ) +{ + int16_t nq; + const float *data; + + nq = alpha_quant_table[quant_type].nquant; + data = alpha_quant_table[quant_type].data; + + quantize_pars( nv, alpha, nq, data, aq, adeq ); + + *pnq = nq; +} + +static void quantize_beta( + int16_t nv, + const float *beta, + const int32_t aq[IVAS_MAX_NUM_BANDS], + QUANT_TYPE quant_type, + int16_t *pnq, + int32_t bq[IVAS_MAX_NUM_BANDS], + float *bdeq ) +{ + int16_t iv, iq, iq0, iq1; + ACPL_QUANT_TABLE *tables = beta_quant_table[quant_type]; + ACPL_QUANT_TABLE quant_table; + const int16_t qmap[2][33] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 } }; + for ( iv = 0; iv < nv; iv++ ) + { + quant_table = tables[qmap[quant_type][aq[iv]]]; + + iq0 = 0; + iq1 = quant_table.nquant - 1; + + while ( iq1 - iq0 > 1 ) + { + iq = ( iq0 + iq1 ) / 2; + if ( beta[iv] < quant_table.data[iq] ) + { + iq1 = iq; + } + else + { + iq0 = iq; + } + } + + if ( fabs( beta[iv] - quant_table.data[iq0] ) < fabs( beta[iv] - quant_table.data[iq1] ) ) + { + bq[iv] = iq0; + bdeq[iv] = quant_table.data[iq0]; + } + else + { + bq[iv] = iq1; + bdeq[iv] = quant_table.data[iq1]; + } + } + + *pnq = beta_quant_table[quant_type][0].nquant; +} + +static void put_ec_data( + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, + int16_t ch, + float pars[IVAS_MAX_NUM_BANDS], + float alphas[IVAS_MAX_NUM_BANDS], + PAR_TYPE parType, + uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], + int16_t *bit_pos ) +{ + int16_t npar = IVAS_MAX_NUM_BANDS; + int16_t onlyFreq = 1; + int16_t nq; + QUANT_TYPE quant_type = FINE; + int32_t alphaQuant[IVAS_MAX_NUM_BANDS]; + int32_t betaQuant[IVAS_MAX_NUM_BANDS]; + float alphaDequant[IVAS_MAX_NUM_BANDS]; + float betaDequant[IVAS_MAX_NUM_BANDS]; + + if ( parType == ALPHA ) + { + quantize_alpha( npar, pars, quant_type, &nq, alphaQuant, alphaDequant ); + } + else + { + quantize_alpha( npar, alphas, quant_type, &nq, alphaQuant, alphaDequant ); + quantize_beta( npar, pars, alphaQuant, quant_type, &nq, betaQuant, betaDequant ); + } + if ( hMCParamUpmix->first_frame ) + { + mvl2l( &( alphaQuant[0] ), &( hMCParamUpmix->alpha_quant_prev[ch][0] ), IVAS_MAX_NUM_BANDS ); + if ( parType == BETA ) + { + mvl2l( &( betaQuant[0] ), &( hMCParamUpmix->beta_quant_prev[ch][0] ), IVAS_MAX_NUM_BANDS ); + if ( ch == ( MC_PARAMUPMIX_COMBINATIONS - 1 ) ) + { + hMCParamUpmix->first_frame = 0; + } + } + } + + /* Always one parameter set per frame for transient frames. Original PS framing is used internally. */ + if ( parType == ALPHA ) + { + huffman_encode( onlyFreq, 1, npar, 0, hMCParamUpmix->alpha_quant_prev[ch], alphaQuant, ALPHA, quant_type, nq, bit_buffer, bit_pos ); + } + else + { + huffman_encode( onlyFreq, 1, npar, 0, hMCParamUpmix->beta_quant_prev[ch], betaQuant, BETA, quant_type, nq, bit_buffer, bit_pos ); + } + + if ( parType == ALPHA ) + { + mvl2l( alphaQuant, hMCParamUpmix->alpha_quant_prev[ch], IVAS_MAX_NUM_BANDS ); + } + else + { + mvl2l( betaQuant, hMCParamUpmix->beta_quant_prev[ch], IVAS_MAX_NUM_BANDS ); + } +} + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_dmx() + * + * Computes the time domain down mix signal + *------------------------------------------------------------------------*/ + +static void ivas_mc_paramupmix_dmx( + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC ParamUpmix encoder handle */ + float data_f[][L_FRAME48k], /* i/o : Input, downmix out */ + const int16_t input_frame /* i : Input frame length */ +) +{ + int16_t i, l; + int16_t chan1s[4] = { 4, 5, 8, 9 }; + int16_t chan2s[4] = { 6, 7, 10, 11 }; + int16_t chanOut[4] = { 4, 5, 6, 7 }; + int16_t chanZero[4] = { 8, 9, 10, 11 }; + + /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ + /* 9+11 -> 7 */ + /* 8+10 -> 6 */ + /* 5+7 -> 5 */ + /* 4+6 -> 4 */ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + for ( l = 0; l < input_frame; l++ ) + { + /* mid */ + hMCParamUpmix->midside[i][0][l] = ( data_f[chan1s[i]][l] + data_f[chan2s[i]][l] ) * (float) 0.5; + /* side */ + hMCParamUpmix->midside[i][1][l] = ( data_f[chan1s[i]][l] - data_f[chan2s[i]][l] ) * (float) 0.5; + data_f[chanOut[i]][l] = hMCParamUpmix->midside[i][0][l]; + } + } + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + set_zero( data_f[chanZero[i]], input_frame ); + } + return; +} + + +/*------------------------------------------------------------------------- + * ivas_mc_paramupmix_param_est_enc() + * + * run the CLDFB analysis on the input signal + * estimate the input and down mix covariances + *------------------------------------------------------------------------*/ + +static void ivas_mc_paramupmix_param_est_enc( + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + float input_frame_t[][L_FRAME48k], /* i : Input frame in the time domain */ + const int16_t input_frame, /* i : Input frame length */ + float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], + float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ) +{ + float *pcm_in[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float fr_realbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH][L_FRAME48k]; + float fr_imagbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH][L_FRAME48k]; + float FR_Real_Mid[L_FRAME48k], FR_Imag_Mid[L_FRAME48k]; + float *p_fr_realbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float *p_fr_imagbuffer[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float *pp_in_fr_real[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float *pp_in_fr_imag[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; + float rxx, rxy, ryy, cmat, rxxest, drxx, wetaux; + + int16_t l_ts; + int16_t b, i, j, ts, bnd; +#ifdef FIX_468_16KHZ_PUPMIX + int16_t maxbands; +#endif + + int16_t transient_det[MC_PARAMUPMIX_COMBINATIONS][2]; + int16_t transient_det_l[2], transient_det_r[2]; + int16_t chan1s[4] = { 4, 5, 8, 9 }; + int16_t chan2s[4] = { 6, 7, 10, 11 }; + + const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + pcm_in[2 * i] = input_frame_t[chan1s[i]]; + pcm_in[2 * i + 1] = input_frame_t[chan2s[i]]; + } + + /*-----------------------------------------------------------------------------------------* + * Transient detector + *-----------------------------------------------------------------------------------------*/ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) + { + ivas_transient_det_process( hMCParamUpmix->hTranDet[2 * i], pcm_in[2 * i], input_frame, transient_det_l ); + ivas_transient_det_process( hMCParamUpmix->hTranDet[2 * i + 1], pcm_in[2 * i + 1], input_frame, transient_det_r ); + transient_det[i][0] = transient_det_l[0] || transient_det_r[0]; + transient_det[i][1] = transient_det_l[0] || transient_det_r[0]; + /* should probably be transient_det_l[1] || transient_det_r[1] , but choosing 0 reproduces the before merge state */ + } + + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + p_fr_realbuffer[i] = fr_realbuffer[i]; + p_fr_imagbuffer[i] = fr_imagbuffer[i]; + } + + /* prepare Parameter MDFT analysis */ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + pp_in_fr_real[i] = p_fr_realbuffer[i]; + pp_in_fr_imag[i] = p_fr_imagbuffer[i]; + } + + l_ts = input_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) + { + ivas_fb_mixer_get_windowed_fr( hMCParamUpmix->hFbMixer, pcm_in, pp_in_fr_real, pp_in_fr_imag, l_ts, l_ts, + hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hMCParamUpmix->hFbMixer, pcm_in, l_ts, + hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) + { + pcm_in[i] += l_ts; + pp_in_fr_real[i] += l_ts; + pp_in_fr_imag[i] += l_ts; + } + } + + /*-----------------------------------------------------------------------------------------* + * Covariance process + *-----------------------------------------------------------------------------------------*/ + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + pp_in_fr_real[0] = p_fr_realbuffer[2 * b]; + pp_in_fr_imag[0] = p_fr_imagbuffer[2 * b]; + pp_in_fr_real[1] = FR_Real_Mid; + pp_in_fr_imag[1] = FR_Imag_Mid; + v_add( pp_in_fr_real[0], p_fr_realbuffer[2 * b + 1], pp_in_fr_real[1], L_FRAME48k ); + v_add( pp_in_fr_imag[0], p_fr_imagbuffer[2 * b + 1], pp_in_fr_imag[1], L_FRAME48k ); + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) + { + for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) + { + cov_real[i][j] = hMCParamUpmix->cov_real[b][i][j]; + cov_dtx_real[i][j] = hMCParamUpmix->cov_dtx_real[b][i][j]; + } + } + ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind ); + } +#ifdef FIX_468_16KHZ_PUPMIX + maxbands = hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands; + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + for ( bnd = 0; bnd < maxbands; bnd++ ) + { +#else + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + for ( bnd = 0; bnd < IVAS_MAX_NUM_BANDS; bnd++ ) + { +#endif + rxy = hMCParamUpmix->cov_real[b][1][0][bnd]; + ryy = hMCParamUpmix->cov_real[b][1][1][bnd]; + cmat = rxy / ( ryy + EPSILON ); + alphas[b][bnd] = (float) 2.0 * cmat - (float) 1.0; + + rxx = hMCParamUpmix->cov_real[b][0][0][bnd]; + rxxest = cmat * cmat * ryy; + drxx = rxx - rxxest; + drxx = (float) max( drxx, 0.0 ); + wetaux = (float) sqrt( drxx / ( ryy + EPSILON ) ); + betas[b][bnd] = (float) 2.0 * wetaux; + } + } +#ifdef FIX_468_16KHZ_PUPMIX + if ( maxbands < IVAS_MAX_NUM_BANDS ) + { + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) + { + for ( bnd = maxbands; bnd < IVAS_MAX_NUM_BANDS; bnd++ ) + { + alphas[b][bnd] = 0.0; + betas[b][bnd] = 0.0; + } + } + } +#endif + return; +} diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 8151b33c66..09fe5e3f40 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -188,7 +188,13 @@ ivas_error ivas_mcmasa_enc_open( } /* set FB config. */ - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#ifndef SBA_MODE_CLEAN_UP + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, numAnalysisChannels, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -219,7 +225,13 @@ ivas_error ivas_mcmasa_enc_open( else { /* Allocate and initialize FB mixer handle for LFE channel */ - if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs ) ) != IVAS_ERR_OK ) +#ifndef SBA_MODE_CLEAN_UP + if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, 1, 0, 0, input_Fs, + 0 ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -745,10 +757,10 @@ void ivas_mcmasa_param_est_enc( float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; float *p_Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS]; float *p_Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS]; - float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; - float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; - float FoaEven_RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; - float FoaEven_ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX]; + float Foa_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float FoaEven_RealBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; + float FoaEven_ImagBuffer[FOA_CHANNELS][DIRAC_NO_FB_BANDS_MAX]; float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float intensity_even_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; @@ -831,8 +843,10 @@ void ivas_mcmasa_param_est_enc( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts ); - ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts ); + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixer, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts, + hMcMasa->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixer, pcm_in, l_ts, + hMcMasa->hFbMixer->fb_cfg->num_in_chans ); for ( i = 0; i < numAnalysisChannels; i++ ) { pcm_in[i] += l_ts; @@ -973,7 +987,13 @@ void ivas_mcmasa_param_est_enc( reference_power[ts], 0, num_freq_bands, - SBA_MODE_NONE ); +#ifndef SBA_MODE_CLEAN_UP + SBA_MODE_NONE, +#else + MC_FORMAT, + 0, +#endif + FOA_CHANNELS ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % hMcMasa->no_col_avg_diff ) + 1; /* averaging_length = 32 */ @@ -1235,10 +1255,10 @@ void ivas_mcmasa_param_est_enc( *--------------------------------------------------------------------------*/ void ivas_mcmasa_dmx_modify( - const int16_t n_samples, /* i : input frame length in samples */ - float dmx[][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )], /* i/o: downmix signal to be transformed into another format. TODO: buffer size into define? */ - const int16_t n_chnls_dmx_old, /* i : number of downmix channels in the old format */ - const int16_t n_chnls_dmx_new ) /* i : number of downmix channels in the target format */ + const int16_t n_samples, /* i : input frame length in samples */ + float dmx[][L_FRAME48k + NS2SA( 48000, IVAS_FB_ENC_DELAY_NS )], /* i/o: downmix signal to be transformed into another format */ + const int16_t n_chnls_dmx_old, /* i : number of downmix channels in the old format */ + const int16_t n_chnls_dmx_new ) /* i : number of downmix channels in the target format */ { /* assumed data ordering in **dmx: [sce][cpe_chnl0][cpe_chnl1], i.e., [c][l][r] */ int16_t i; @@ -1702,8 +1722,10 @@ static void computeLfeEnergy( for ( ts = mrange[0]; ts < mrange[1]; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts ); - ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts ); + ivas_fb_mixer_get_windowed_fr( hMcMasa->hFbMixerLfe, pcm_in, p_Chnl_RealBuffer, p_Chnl_ImagBuffer, l_ts, l_ts, + hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hMcMasa->hFbMixerLfe, pcm_in, l_ts, + hMcMasa->hFbMixerLfe->fb_cfg->num_in_chans ); pcm_in[0] += l_ts; /* Compute low frequency energy for LFE, for other channels it is computed in ivas_chnl_param_est_enc() */ diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c old mode 100644 new mode 100755 index 900c5e1653..48a7abc42f --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -264,6 +264,11 @@ void ivas_mct_core_enc( sp_aud_decision0[i] = hCPE[cpe_id]->hCoreCoder[0]->sp_aud_decision0; +#ifdef FIX_483b + sts[i]->hTcxEnc->tns_ms_flag[0] = 0; + sts[i]->hTcxEnc->tns_ms_flag[1] = 0; +#endif + i++; } } @@ -339,7 +344,11 @@ void ivas_mct_core_enc( for ( n = 0; n < nSubframes; n++ ) { +#ifdef FIX_483b + if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) +#else if ( !sts[ch]->hTcxEnc->fUseTns[n] /*!sts[0]->fUseTns[n] && !sts[1]->fUseTns[n]*/ ) +#endif { /* power spectrum: MDCT^2 + MDST^2 */ for ( i = 0; i < L_subframeTCX; i++ ) @@ -410,6 +419,14 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) { st = sts[ch]; + +#ifdef IND_LIST_DYN + /* update the pointer to the buffer of indices of the second channel */ + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { @@ -476,7 +493,7 @@ void ivas_mct_core_enc( } else if ( ivas_format == SBA_FORMAT ) { - nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS_SBA; + nAvailBits -= IVAS_FORMAT_SIGNALING_NBITS_EXTENDED; nAvailBits -= SBA_ORDER_BITS + SBA_PLANAR_BITS; } @@ -551,7 +568,7 @@ void ivas_mct_core_enc( } #ifdef DEBUGGING - format_bits = ( ivas_format == MC_FORMAT ? IVAS_FORMAT_SIGNALING_NBITS + MC_LS_SETUP_BITS : IVAS_FORMAT_SIGNALING_NBITS_SBA + SBA_ORDER_BITS + SBA_PLANAR_BITS ); + format_bits = ( ivas_format == MC_FORMAT ? IVAS_FORMAT_SIGNALING_NBITS + MC_LS_SETUP_BITS : IVAS_FORMAT_SIGNALING_NBITS_EXTENDED + SBA_ORDER_BITS + SBA_PLANAR_BITS ); mct_bits += hMCT->nBitsMCT + hMCT->nchan_out_woLFE; assert( ( total_brate + ( NBITS_BWIDTH + format_bits + mct_bits + sba_meta + lfe_bits ) * FRAMES_PER_SEC ) == ivas_total_brate ); #endif diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index f2f5d23461..55da6495f8 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -60,8 +60,12 @@ static ivas_error ivas_mc_enc_reconfig( Encoder_Struct *st_ivas, const int16_t l static void set_mct_enc_params( MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const SBA_MODE sba_mode, /* i : SBA mode */ - const uint16_t b_nchan_change /* i : flag indicating different channel count */ +#ifndef SBA_MODE_CLEAN_UP + const SBA_MODE sba_mode, /* i : SBA mode */ +#else + const IVAS_FORMAT ivas_format, /* i : IVAS_FORMAT */ +#endif + const uint16_t b_nchan_change /* i : flag indicating different channel count */ ) { int16_t n; @@ -82,7 +86,11 @@ static void set_mct_enc_params( } hMCT->hbr_mct = 0; +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR && ivas_total_brate >= IVAS_256k ) +#else + if ( ivas_format == SBA_FORMAT && ivas_total_brate >= IVAS_256k ) +#endif { hMCT->hbr_mct = 1; } @@ -116,8 +124,7 @@ static void map_input_to_cpe_channels( pdata[i] = data[n]; i++; } - - if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) + if ( st_ivas->hEncoderConfig->ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) { for ( n = LFE_CHANNEL + 1; n < st_ivas->nchan_transport; n++ ) { @@ -136,7 +143,7 @@ static void map_input_to_cpe_channels( } /* odd channel CPE*/ - if ( ( st_ivas->nchan_transport < st_ivas->nCPE * CPE_CHANNELS ) || ( st_ivas->mc_mode == MC_MODE_MCT && st_ivas->hMCT->nchan_out_woLFE < st_ivas->nCPE * CPE_CHANNELS ) ) + if ( ( st_ivas->nchan_transport < st_ivas->nCPE * CPE_CHANNELS ) || ( ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && st_ivas->hMCT->nchan_out_woLFE < st_ivas->nCPE * CPE_CHANNELS ) ) { pdata[st_ivas->nCPE * CPE_CHANNELS - 1] = NULL; } @@ -237,7 +244,7 @@ ivas_error ivas_mct_enc( ivas_mct_core_enc( ivas_format, hMCT, st_ivas->hCPE, hMCT->nchan_out_woLFE, ivas_total_brate, switch_bw, - ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, + ( ivas_format == MC_FORMAT && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) ? (int16_t) st_ivas->hLFE->lfe_bits : 0, st_ivas->hEncoderConfig->sba_order ); /* Spectrum quantization and coding */ @@ -245,6 +252,12 @@ ivas_error ivas_mct_enc( { hCPE = st_ivas->hCPE[cpe_id]; +#ifdef IND_LIST_DYN + if ( cpe_id > 0 ) + { + hCPE->hCoreCoder[0]->hBstr->ind_list = st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->ind_list + st_ivas->hCPE[cpe_id - 1]->hCoreCoder[1]->hBstr->nb_ind_tot; + } +#endif ivas_mdct_quant_coder( hCPE, hMCT->tnsBits[cpe_id], hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], 1 ); @@ -310,6 +323,10 @@ ivas_error create_mct_enc( { hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup ); } + else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels(); + } else if ( ivas_format == SBA_FORMAT ) { hMCT->nchan_out_woLFE = ivas_sba_get_nchan( st_ivas->sba_analysis_order, st_ivas->hEncoderConfig->sba_planar ); @@ -378,7 +395,11 @@ ivas_error create_mct_enc( * Initializations *-----------------------------------------------------------------*/ +#ifndef SBA_MODE_CLEAN_UP set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, 1 ); +#else + set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, 1 ); +#endif st_ivas->hMCT = hMCT; @@ -418,6 +439,10 @@ ivas_error mct_enc_reconfigure( { hMCT->nchan_out_woLFE = st_ivas->hEncoderConfig->nchan_inp - 1; /* LFE channel is coded separately */ } + else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels(); + } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) { hMCT->nchan_out_woLFE = ivas_param_mc_getNumTransportChannels( ivas_total_brate, st_ivas->hEncoderConfig->mc_input_setup ); @@ -536,8 +561,11 @@ ivas_error mct_enc_reconfigure( * Initializations *-----------------------------------------------------------------*/ +#ifndef SBA_MODE_CLEAN_UP set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, b_nchan_change ); - +#else + set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, b_nchan_change ); +#endif return IVAS_ERR_OK; } @@ -657,6 +685,11 @@ static ivas_error ivas_mc_enc_reconfig( if ( last_mc_mode != MC_MODE_MCT ) { + if ( st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } /* create LFE handle */ if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) { @@ -666,6 +699,7 @@ static ivas_error ivas_mc_enc_reconfig( /*De-allocate handles for other MC modes*/ ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); /* De-allocate McMasa-related handles */ ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); @@ -674,6 +708,50 @@ static ivas_error ivas_mc_enc_reconfig( ivas_qmetadata_close( &st_ivas->hQMetaData ); } } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + st_ivas->nSCE = 0; + st_ivas->nCPE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS / 2; + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + + if ( last_mc_mode != MC_MODE_PARAMUPMIX ) + { + if ( st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } + + /* create LFE handle */ + if ( ( error = ivas_create_lfe_enc( &st_ivas->hLFE, st_ivas->hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) + { + return error; + } + } + + if ( last_mc_mode != MC_MODE_PARAMUPMIX ) + /* This should always be the case, only supporting one bitrate currently */ + { + if ( ( error = ivas_mc_paramupmix_enc_open( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else + { + assert( 0 ); + } + + /*De-allocate handles for other MC modes*/ + ivas_param_mc_enc_close( &st_ivas->hParamMC, st_ivas->hEncoderConfig->input_Fs ); + + /* De-allocate McMasa-related handles */ + ivas_mcmasa_enc_close( &( st_ivas->hMcMasa ), st_ivas->hEncoderConfig->input_Fs ); + + ivas_masa_enc_close( &( st_ivas->hMasa ) ); + + ivas_qmetadata_close( &st_ivas->hQMetaData ); + } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) { if ( last_mc_mode != MC_MODE_PARAMMC ) @@ -699,6 +777,12 @@ static ivas_error ivas_mc_enc_reconfig( ivas_masa_enc_close( &( st_ivas->hMasa ) ); st_ivas->hMasa = NULL; } + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); + if ( last_mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } ivas_qmetadata_close( &st_ivas->hQMetaData ); @@ -745,6 +829,12 @@ static ivas_error ivas_mc_enc_reconfig( } ivas_param_mc_enc_close( &( st_ivas->hParamMC ), st_ivas->hEncoderConfig->input_Fs ); + ivas_mc_paramupmix_enc_close( &( st_ivas->hMCParamUpmix ), st_ivas->hEncoderConfig->input_Fs ); + if ( last_mc_mode == MC_MODE_PARAMUPMIX && st_ivas->hLFE != NULL ) + { + /* LFE handle */ + ivas_lfe_enc_close( &( st_ivas->hLFE ) ); + } if ( last_mc_mode == MC_MODE_MCT ) { @@ -819,6 +909,11 @@ static ivas_error ivas_mc_enc_reconfig( new_brate_SCE = 0; new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; } + else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) + { + new_brate_SCE = 0; + new_brate_CPE = ( st_ivas->hEncoderConfig->ivas_total_brate / ( st_ivas->nchan_transport - 1 ) ) * CPE_CHANNELS; + } else { new_brate_SCE = 0; /*st_ivas->hEncoderConfig->ivas_total_brate / st_ivas->nchan_transport;*/ diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index 7ab6206a29..228f48b305 100644 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -851,6 +851,18 @@ void mctStereoIGF_enc( p_st[0] = sts[ch1]; p_st[1] = sts[ch2]; +#ifdef IND_LIST_DYN + if ( ch1 > 0 ) + { + sts[ch1]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } + + if ( ch2 > 0 ) + { + sts[ch2]->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif + p_powerSpec[0] = powerSpec[ch1]; p_powerSpec[1] = powerSpec[ch2]; @@ -900,6 +912,13 @@ void mctStereoIGF_enc( continue; } +#ifdef IND_LIST_DYN + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif + nSubframes = st->hTcxEnc->tcxMode == TCX_20 ? 1 : NB_DIV; for ( n = 0; n < nSubframes; n++ ) { diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index b1b9389c5e..edc9ea1e50 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -39,9 +39,7 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" -#ifdef SNS_MSVQ #include "ivas_rom_com.h" -#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -582,12 +580,10 @@ void ivas_mdct_core_whitening_enc( { int16_t n, ch, nSubframes, L_subframe, L_subframeTCX, tcx_subframe_coded_lines; float A_q[CPE_CHANNELS][NB_DIV][M + 1]; -#ifdef SNS_MSVQ int16_t sns_vq_indices[CPE_CHANNELS * NB_DIV * SNS_MSVQ_NSTAGES_TCX10]; int16_t nbits_sns; int16_t sns_stereo_mode[NB_DIV]; int16_t idx; -#endif int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; int16_t param_core[CPE_CHANNELS][2 * NPRM_DIV]; int16_t ltpBits[CPE_CHANNELS]; @@ -606,9 +602,7 @@ void ivas_mdct_core_whitening_enc( int16_t nbits_start_sns; int16_t num_sns; int8_t skipped_first_channel; -#ifdef SNS_MSVQ int16_t zero_side_flag[NB_DIV]; -#endif push_wmops( "mdct_core_whitening" ); @@ -881,7 +875,7 @@ void ivas_mdct_core_whitening_enc( chE[n] = sum_f( powerSpec, L_subframeTCX ); } - sns_compute_scf( powerSpec, st->hTcxCfg->psychParamsCurrent, st->last_core == ACELP_CORE ? L_subframe : st->L_frame, scf[ch][n] ); + sns_compute_scf( powerSpec, st->hTcxCfg->psychParamsCurrent, st->L_frame, scf[ch][n] ); } /* MCT: detect whether there are silent channels and set mct_chan_mode accordingly */ @@ -912,7 +906,6 @@ void ivas_mdct_core_whitening_enc( sns_low_br_mode = 0; } -#ifdef SNS_MSVQ if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) { nbits_sns = quantize_sns( scf, scf_q, sts, sns_vq_indices, zero_side_flag, sns_stereo_mode ); @@ -922,7 +915,7 @@ void ivas_mdct_core_whitening_enc( if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) { - sns_avq_cod_stereo( scf[0][0], scf[1][0], scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); + sns_avq_cod_stereo( scf[0][0], scf[1][0], sts[0]->L_frame, scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); } else { @@ -945,51 +938,15 @@ void ivas_mdct_core_whitening_enc( if ( st->hTcxEnc->tcxMode == TCX_20 ) { - sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); + sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); } else { - sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); + sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); } } } } -#else // else of SNS_MSVQ - if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && - sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) - { - sns_avq_cod_stereo( scf[0][0], scf[1][0], scf_q[0][0], scf_q[1][0], param_lpc[0], param_lpc[1] ); - } - else - { -#ifdef DEBUG_MODE_MDCT - { - float ener_side = 0; - float ener_mid = 0; - dbgwrite( &ener_side, sizeof( float ), 1, 1, "./res/ener_side" ); - dbgwrite( &ener_mid, sizeof( float ), 1, 1, "./res/ener_mid" ); - } -#endif - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - param_lpc[ch][0] = ch; - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - continue; - } - st = sts[ch]; - - if ( st->hTcxEnc->tcxMode == TCX_20 ) - { - sns_avq_cod( scf[ch][0], NULL, scf_q[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); - } - else - { - sns_avq_cod( scf[ch][1], scf[ch][0], scf_q[ch][1], scf_q[ch][0], ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, sns_low_br_mode ); - } - } - } -#endif // SNS_AVQ4TCX20_MSVQ4TCX10 for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { @@ -1132,7 +1089,6 @@ void ivas_mdct_core_whitening_enc( /*--------------------------------------------------------------------------------* * SNS parameters *--------------------------------------------------------------------------------*/ -#ifdef SNS_MSVQ if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) { nbits_sns = 0; @@ -1223,39 +1179,7 @@ void ivas_mdct_core_whitening_enc( st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; } } -#else // else of SNS_MSVQ - /* write SNS parameter separately since at the decoder, both channels' cores need to be decoded before, so the joint SNS decoding can be done */ - skipped_first_channel = 0; - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) - { - skipped_first_channel = 1; - continue; - } - - nbits_start_sns = hBstr->nb_bits_tot; - num_sns = ( st->core == TCX_20_CORE ) ? 1 : 2; - - if ( ch == 0 || skipped_first_channel ) - { - push_next_indice( hBstr, param_lpc[0][0] >> 1, 1 ); - - if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) - { - /* write classifier decision to signal low br mode for SNS encoding, for all other configs, low_br mode is not possible */ - push_next_indice( hBstr, sns_low_br_mode, 1 ); - } - } - encode_lpc_avq( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode ); - - st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; - } - -#endif // MSVQ_SNS /*update pitch buffer*/ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1393,6 +1317,13 @@ void ivas_mdct_quant_coder( { st = sts[ch]; +#ifdef IND_LIST_DYN + /* update the pointer to the buffer of indices of the second channel */ + if ( ch > 0 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { /*Enable appropriate upadte of tcx_curr_overlap_mode even for uncoded channel index 1*/ diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index ac4f83a657..213c0ce756 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -52,7 +52,7 @@ static float direction_distance( float elevation[DIRAC_MAX_NBANDS][MAX_PARAM_SPA #endif -static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits ); +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, const int16_t hodirac_flag ); static int16_t ivas_qmetadata_entropy_encode_diffuseness( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); @@ -60,7 +60,12 @@ static void ivas_qmetadata_reorder_2dir_bands( IVAS_QMETADATA_HANDLE hQMetaData static int16_t ivas_qmetadata_entropy_encode_df_ratio( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, int16_t *df_ratio_bits ); -static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits ); +static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits +#ifdef HR_METADATA + , + const int16_t hrmasa_flag +#endif +); static int16_t ivas_qmetadata_raw_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t nbands, const int16_t start_band ); @@ -88,13 +93,23 @@ static ivas_error write_ec_direction( int16_t *num_bits_written, BSTR_ENC_HANDLE static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t j_idx, const int16_t len ); -static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence ); +static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence +#ifdef HR_METADATA + , + const int16_t hrmasa_flag +#endif +); static void dct4_transform( uint8_t *v, float *dct_v ); -static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb ); +static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb +#ifdef HR_METADATA + , + const int16_t hrmasa_flag +#endif +); -static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ); +static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, const int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ); static int16_t encode_coherence_indexesDCT1( uint16_t *idx_dct, const int16_t len, BSTR_ENC_HANDLE hMetaData ); @@ -118,6 +133,21 @@ static void transform_azimuth_dir2( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *d static int16_t calc_var_azi( const IVAS_QDIRECTION *q_direction, const int16_t diffuseness_index_max_ec_frame, const float avg_azimuth, float *avg_azimuth_out ); +#ifdef HR_METADATA +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, const int16_t bits_dir_hr ); + +static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); + +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, const int16_t bits_dir_hr, BSTR_ENC_HANDLE hMetaData ); + +static int16_t encode_surround_coherence_hr( IVAS_QMETADATA *hQMetaData, BSTR_ENC_HANDLE hMetaData ); + +static void ivas_qmetadata_reorder_2dir_bands_hr( IVAS_QMETADATA_HANDLE hQMetaData ); + +static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t bits_coh ); +#endif + + /*-----------------------------------------------------------------------* * ivas_qmetadata_enc_encode() * @@ -125,12 +155,17 @@ static int16_t calc_var_azi( const IVAS_QDIRECTION *q_direction, const int16_t d *-----------------------------------------------------------------------*/ ivas_error ivas_qmetadata_enc_encode( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */ + , + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ ) { int16_t i, bit_pos_start, bit_pos_start_coh; - int16_t next_ind_start, last_ind_start; + int16_t next_ind_start; +#ifndef IND_LIST_DYN + int16_t last_ind_start; +#endif uint16_t diffuseness_index_max_ec_frame; uint16_t diffuseness_index_max_ec_frame_pre[QMETADATA_MAX_NO_DIRECTIONS]; int16_t bits_dir_raw_pre[QMETADATA_MAX_NO_DIRECTIONS]; @@ -185,6 +220,7 @@ ivas_error ivas_qmetadata_enc_encode( pF_surcoh = fopen( "./res/qmetadata_surcoh_enc.txt", "w" ); #endif + /* Save initial position in bitstream */ bit_pos_0 = hMetaData->nb_bits_tot; bit_pos_start = bit_pos_0; @@ -210,7 +246,10 @@ ivas_error ivas_qmetadata_enc_encode( assert( ndirections == 2 ); #endif /* Reorder 2dir bands for more efficient encoding. */ - ivas_qmetadata_reorder_2dir_bands( hQMetaData ); + if ( !hodirac_flag ) + { + ivas_qmetadata_reorder_2dir_bands( hQMetaData ); + } d = 0; for ( i = hQMetaData->q_direction[1].cfg.start_band; i < hQMetaData->q_direction[1].cfg.nbands; i++ ) { @@ -244,7 +283,8 @@ ivas_error ivas_qmetadata_enc_encode( } /*Quantization of the Diffuseness */ - ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits ); + ivas_qmetadata_quantize_diffuseness_nrg_ratios( hQMetaData, bits_dir_raw_pre, bits_diff, dfRatio_bits, + hodirac_flag ); bits_diff_sum = 0; bits_diff[0] = ivas_qmetadata_entropy_encode_diffuseness( hMetaData, &( hQMetaData->q_direction[0] ), &diffuseness_index_max_ec_frame_pre[0] ); @@ -380,9 +420,15 @@ ivas_error ivas_qmetadata_enc_encode( /*Coherence */ bits_coherence[d] = 0; bit_pos_start_coh = hMetaData->nb_bits_tot; + if ( all_coherence_zero == 0 ) { - bits_coherence[d] = ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 0, &indice_coherence ); + bits_coherence[d] = ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 0, &indice_coherence +#ifdef HR_METADATA + , + 0 +#endif + ); } if ( q_direction->cfg.mc_ls_setup == MC_LS_SETUP_5_1 || q_direction->cfg.mc_ls_setup == MC_LS_SETUP_7_1 ) @@ -394,7 +440,12 @@ ivas_error ivas_qmetadata_enc_encode( else { /* Quantize directions*/ - quantize_direction_frame( q_direction, azimuth_orig, elevation_orig ); + quantize_direction_frame( q_direction, azimuth_orig, elevation_orig +#ifdef HR_METADATA + , + 0 +#endif + ); } /* Signalling 2D*/ @@ -403,8 +454,12 @@ ivas_error ivas_qmetadata_enc_encode( /* Save state of metadata bitstream buffer after writing energy ratios, number of dirs and save space for coherence*/ bit_pos_start = hMetaData->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_start = hMetaData->nb_ind_tot; +#else next_ind_start = hMetaData->next_ind; last_ind_start = hMetaData->last_ind; +#endif /* Encode quantized directions with EC frame-wise*/ if ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) @@ -413,14 +468,23 @@ ivas_error ivas_qmetadata_enc_encode( bits_signaling[d]++; } +#ifdef IND_LIST_DYN + next_ind_raw_flag = hMetaData->nb_ind_tot; +#else next_ind_raw_flag = hMetaData->next_ind; +#endif push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ bits_dir_bands[0] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, q_direction->cfg.nbands, q_direction->cfg.start_band ); reduce_bits = hQMetaData->is_masa_ivas_format ? ( total_bits_1dir - ( bits_diff[d] + bits_coherence[d] + bits_signaling[d] ) - 1 ) : MASA_MAX_BITS; bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, - q_direction->cfg.nbands, q_direction->cfg.start_band, bits_dir_bands[0], reduce_bits ); + q_direction->cfg.nbands, q_direction->cfg.start_band, bits_dir_bands[0], reduce_bits +#ifdef HR_METADATA + , + 0 +#endif + ); if ( bits_ec < 0 ) { @@ -445,7 +509,11 @@ ivas_error ivas_qmetadata_enc_encode( /* Encode quantized directions with EC band-wise */ if ( ( total_bits_1dir + bits_surround_coh <= hQMetaData->qmetadata_max_bit_req ) && ( bits_dir[d] + bits_diff[d] + bits_coherence[d] + bits_signaling[d] > total_bits_1dir ) && q_direction->cfg.nblocks > 1 ) { - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); /* Write signaling */ push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ @@ -453,7 +521,11 @@ ivas_error ivas_qmetadata_enc_encode( bits_signaling[d] = 3; /* Write raw flags */ +#ifdef IND_LIST_DYN + next_ind_raw_flag = hMetaData->nb_ind_tot; +#else next_ind_raw_flag = hMetaData->next_ind; +#endif for ( i = start_band; i < nbands; i++ ) { push_next_indice( hMetaData, 0, 1 ); /* Raw coding flag*/ @@ -466,7 +538,12 @@ ivas_error ivas_qmetadata_enc_encode( bits_dir_bands[i] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, i + 1, i ); /* Write ec bits */ - bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, i + 1, i, bits_dir_bands[i], MASA_MAX_BITS ); + bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, i + 1, i, bits_dir_bands[i], MASA_MAX_BITS +#ifdef HR_METADATA + , + 0 +#endif + ); if ( bits_ec >= 0 ) { @@ -522,7 +599,11 @@ ivas_error ivas_qmetadata_enc_encode( /*Bit budget exceeded, bit reduction strategy?*/ extra_bits = 0; - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); push_next_indice( hMetaData, 1, 1 ); /*Write 1 bit to signal no EC frame-wise (EC1)*/ if ( nblocks > 1 ) @@ -565,7 +646,12 @@ ivas_error ivas_qmetadata_enc_encode( { bit_pos_start = hMetaData->nb_bits_tot; hMetaData->nb_bits_tot = bit_pos_start_coh; - ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 1, &indice_coherence ); + ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 1, &indice_coherence +#ifdef HR_METADATA + , + 0 +#endif + ); hMetaData->nb_bits_tot = bit_pos_start; } @@ -654,6 +740,284 @@ ivas_error ivas_qmetadata_enc_encode( } +#ifdef HR_METADATA +/*-----------------------------------------------------------------------* + * ivas_qmetadata_enc_encode_hr_384_512() + * + * Main function for quantizing and coding Spatial Metadata at HRs + *-----------------------------------------------------------------------*/ + +ivas_error ivas_qmetadata_enc_encode_hr_384_512( + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + const int16_t bits_sph_idx, + const int16_t bits_sp_coh ) +{ + int16_t i, j; + int16_t bits_diff[QMETADATA_MAX_NO_DIRECTIONS]; + IVAS_QDIRECTION *q_direction; + int16_t nbands, nblocks, start_band; + int16_t ndirections, d; + int16_t all_coherence_zero; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + int16_t bits_no_dirs_coh; +#endif +#else + int16_t bits_no_dirs_coh; +#endif + int16_t bits_ec; + float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; + ivas_error error; + + error = IVAS_ERR_OK; + +#ifdef DEBUG_MODE_QMETADATA + + static FILE *pF = NULL; + static FILE *pF_azi = NULL; + static FILE *pF_ele = NULL; + static FILE *pF_ratio = NULL; + static FILE *pF_spcoh = NULL; + static FILE *pF_spcoh_orig = NULL; + static FILE *pF_surcoh = NULL; + + if ( pF == NULL ) + pF = fopen( "./res/qmetadata_enc.txt", "w" ); + if ( pF_azi == NULL ) + pF_azi = fopen( "./res/qmetadata_azi_enc.txt", "w" ); + if ( pF_ele == NULL ) + pF_ele = fopen( "./res/qmetadata_ele_enc.txt", "w" ); + if ( pF_ratio == NULL ) + pF_ratio = fopen( "./res/qmetadata_ratio_enc.txt", "w" ); + if ( pF_spcoh == NULL ) + pF_spcoh = fopen( "./res/qmetadata_spcoh_enc.txt", "w" ); + if ( pF_spcoh_orig == NULL ) + pF_spcoh_orig = fopen( "./res/qmetadata_spcoh_orig.txt", "w" ); + if ( pF_surcoh == NULL ) + pF_surcoh = fopen( "./res/qmetadata_surcoh_enc.txt", "w" ); +#endif + + ndirections = hQMetaData->no_directions; + + /* Check if coherence should be encoded */ + all_coherence_zero = 1; +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh = 0; +#endif +#else + bits_no_dirs_coh = 0; +#endif +#ifdef FIX_HBR_MASAMETA + if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) + { + push_next_indice( hMetaData, 1, 1 ); + /* write the number of inactive higher bands */ + ivas_qmetadata_encode_extended_gr( hMetaData, hQMetaData->q_direction->cfg.inactiveBands - 1, MASA_MAXIMUM_CODING_SUBBANDS, 1 ); + } + else + { + /* no change */ + push_next_indice( hMetaData, 0, 1 ); + } +#endif + if ( hQMetaData->coherence_flag ) + { + all_coherence_zero = hQMetaData->all_coherence_zero; + push_next_indice( hMetaData, all_coherence_zero, 1 ); /* signal coherence */ +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh += 1; +#endif +#else + bits_no_dirs_coh += 1; +#endif + } + + /* encode 2 direction subbands position */ + if ( ndirections == 2 && bits_sph_idx == 11 ) + { +#ifdef FIX_481_UNUSED_VARIABLES +#ifdef DEBUG_MODE_QMETADATA + bits_no_dirs_coh += +#endif +#else + bits_no_dirs_coh += +#endif + write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands ); + + for ( i = hQMetaData->numTwoDirBands; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) + { + set_f( hQMetaData->q_direction[1].band_data[i].energy_ratio, 0.0f, hQMetaData->q_direction[1].cfg.nblocks ); + } + + hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; + } + + /*Quantization and encoding of the Diffuseness */ + ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( hQMetaData, bits_diff, bits_sph_idx, hMetaData ); + + /* Encode surround coherence */ + if ( all_coherence_zero == 0 ) + { + encode_surround_coherence_hr( hQMetaData, hMetaData ); + } + else + { + for ( i = 0; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) + { + if ( hQMetaData->surcoh_band_data != NULL ) + { + set_c( (int8_t *) hQMetaData->surcoh_band_data[i].surround_coherence, 0, hQMetaData->q_direction[0].cfg.nblocks ); + } + } + } + + /* Loop over number of directions*/ + for ( d = 0; d < ndirections; d++ ) + { + q_direction = &( hQMetaData->q_direction[d] ); + + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + start_band = q_direction->cfg.start_band; + +#ifdef DEBUG_MODE_QMETADATA + { + int16_t k; + k = 0; + fprintf( pF_spcoh_orig, "%d %d ", frame, k ); + + for ( i = start_band; i < nbands; i++ ) + { + for ( j = 0; j < nblocks; j++ ) + { + if ( q_direction->coherence_band_data != NULL ) + { + fprintf( pF_spcoh_orig, " %d ", q_direction->coherence_band_data[i].spread_coherence[j] ); + } + } + } + fprintf( pF_spcoh_orig, "\n" ); + } +#endif + + /*Coherence */ + if ( all_coherence_zero == 0 ) + { + ivas_qmetadata_quantize_coherence_hr_512( hQMetaData, d, all_coherence_zero, hMetaData, bits_sp_coh ); + } + + /* write the spherical indexes */ + bits_ec = hMetaData->nb_bits_tot; + if ( bits_sph_idx == 11 ) + { + /* do the quantization */ + quantize_direction_frame( q_direction, azimuth_orig, elevation_orig, 1 ); + } + for ( i = start_band; i < nbands; i++ ) + { + for ( j = 0; j < nblocks; j++ ) + { + push_next_indice( hMetaData, q_direction->band_data[i].spherical_index[j], bits_sph_idx ); + } + } + bits_ec = hMetaData->nb_bits_tot - bits_ec; + +#ifdef DEBUG_MODE_QMETADATA + { + float tmp_f; + fprintf( pF, "frame %d: diff %d ", frame, bits_diff[d] ); + fprintf( pF_azi, "frame %d/dir/ec %d: ", frame, d ); + fprintf( pF_ele, "frame %d/dir/ec %d: ", frame, d ); + fprintf( pF_ratio, "frame %d/dir %d: ", frame, d ); + /*fprintf( pF_spcoh, "frame %d/dir %d: ", frame, d ); */ + fprintf( pF_spcoh, " %d %d ", frame, d ); + + if ( d == 0 ) + { + fprintf( pF_surcoh, "frame %d/dir %d: ", frame, d ); + } + + /* direction_distance( elevation_orig, azimuth_orig, q_direction, nbands, nblocks, mat_dist );*/ + for ( i = start_band; i < nbands; i++ ) + { + for ( j = 0; j < nblocks; j++ ) + { + fprintf( pF_azi, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[i].azimuth[j] ) / 100.f ); + fprintf( pF_ele, " %+5.2f ", (int16_t) ( 100.f * q_direction->band_data[i].elevation[j] ) / 100.f ); + fprintf( pF_ratio, " %1.3f ", q_direction->band_data[i].energy_ratio[j] ); + if ( q_direction->coherence_band_data != NULL ) + { + fprintf( pF_spcoh, " %d ", q_direction->coherence_band_data[i].spread_coherence[j] ); + } + if ( d == 0 && hQMetaData->surcoh_band_data != NULL ) + { + fprintf( pF_surcoh, " %d ", hQMetaData->surcoh_band_data[i].surround_coherence[j] ); + } + } + } + fprintf( pF, "\n" ); + fprintf( pF_azi, "\n" ); + fprintf( pF_ele, "\n" ); + fprintf( pF_ratio, "\n" ); + fprintf( pF_spcoh, "\n" ); + if ( d == 0 ) + { + fprintf( pF_surcoh, "\n" ); + } + + for ( i = 0; i < nblocks; i++ ) + { + for ( j = 0; j < nbands; j++ ) + { + dbgwrite( &( q_direction->band_data[j].azimuth[i] ), sizeof( float ), 1, 1, "./res/IVAS_QMETADATA_azi.bin" ); + dbgwrite( &( q_direction->band_data[j].elevation[i] ), sizeof( float ), 1, 1, "./res/IVAS_QMETADATA_ele.bin" ); + dbgwrite( &( q_direction->band_data[j].energy_ratio_index[i] ), sizeof( uint16_t ), 1, 1, "./res/IVAS_QMETADATA_diffuseness_index.bin" ); + tmp_f = 1.f - q_direction->band_data[j].energy_ratio[i]; + dbgwrite( &tmp_f, sizeof( float ), 1, 1, "./res/IVAS_QMETADATA_diffuseness.bin" ); + } + } + + j = (int16_t) ( hMetaData->nb_bits_tot ); + dbgwrite( &j, sizeof( int16_t ), 1, 1, "./res/IVAS_QMETADATA_bits.bin" ); + } +#endif + + /* Save quantized DOAs */ + if ( bits_sph_idx == 11 ) + { + for ( i = start_band; i < nbands; i++ ) + { + mvr2r( azimuth_orig[i], q_direction->band_data[i].azimuth, nblocks ); + mvr2r( elevation_orig[i], q_direction->band_data[i].elevation, nblocks ); + } + } + else + { + for ( i = start_band; i < nbands; i++ ) + { + mvr2r( q_direction->band_data[i].azimuth, q_direction->band_data[i].q_azimuth, nblocks ); + mvr2r( q_direction->band_data[i].elevation, q_direction->band_data[i].q_elevation, nblocks ); + } + } + } +#ifdef FIX_HBR_MASAMETA + if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) + { + hQMetaData->q_direction[0].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; + if ( ndirections > 1 ) + { + hQMetaData->q_direction[1].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; + } + } +#endif + return error; +} +#endif + + /*-----------------------------------------------------------------------* * ivas_qmetadata_enc_sid_encode() * @@ -665,8 +1029,11 @@ void ivas_qmetadata_enc_sid_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure */ - const int16_t ivas_format, /* i : IVAS format */ - const SBA_MODE sba_mode /* i : SBA mode */ + const int16_t ivas_format /* i : IVAS format */ +#ifndef SBA_MODE_CLEAN_UP + , + const SBA_MODE sba_mode /* i : SBA mode */ +#endif ) { int16_t b, m; @@ -682,10 +1049,13 @@ void ivas_qmetadata_enc_sid_encode( if ( ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) { +#endif /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ +#ifndef SBA_MODE_CLEAN_UP } else { @@ -693,6 +1063,7 @@ void ivas_qmetadata_enc_sid_encode( /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } +#endif } else { @@ -731,7 +1102,11 @@ void ivas_qmetadata_enc_sid_encode( /* sanity checks*/ assert( q_metadata->no_directions == 1 && "Qmetadata SID: only one direction supported!" ); +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { assert( ( q_direction->cfg.nbands == DIRAC_DTX_BANDS ) && "Qmetadata SID: only 2 bands supported!" ); } @@ -740,7 +1115,11 @@ void ivas_qmetadata_enc_sid_encode( assert( ( q_direction->cfg.nbands == 5 ) && "Qmetadata SID: only 5 bands supported!" ); } +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode != SBA_MODE_SPAR ) +#else + if ( ivas_format != SBA_FORMAT ) +#endif { /* Signalling 2D*/ push_next_indice( hMetaData, ( q_direction->not_in_2D > 0 ), 1 ); /*2D flag*/ @@ -877,6 +1256,7 @@ void ivas_qmetadata_enc_sid_encode( #endif /* TODO: temporary to keep BE */ +#ifndef SBA_MODE_CLEAN_UP if ( ivas_format == SBA_FORMAT ) { if ( sba_mode != SBA_MODE_SPAR ) @@ -886,6 +1266,9 @@ void ivas_qmetadata_enc_sid_encode( } } else +#else + if ( ivas_format != SBA_FORMAT ) +#endif { metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } @@ -907,25 +1290,38 @@ void ivas_qmetadata_enc_sid_encode( *------------------------------------------------------------------------*/ void reset_metadata_spatial( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - const int32_t element_brate, /* i : element bitrate */ - int32_t *total_brate, /* o : total bitrate */ - const int32_t core_brate, /* i : core bitrate */ - const int16_t nb_bits_metadata, /* i : number of meatdata bits */ - const SBA_MODE sba_mode /* i : SBA mode */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + const int32_t element_brate, /* i : element bitrate */ + int32_t *total_brate, /* o : total bitrate */ + const int32_t core_brate, /* i : core bitrate */ + const int16_t nb_bits_metadata /* i : number of meatdata bits */ +#ifndef SBA_MODE_CLEAN_UP + , + const SBA_MODE sba_mode /* i : SBA mode */ +#endif ) { int16_t i, next_ind_sid, last_ind_sid; +#ifdef IND_LIST_DYN + int16_t j; +#endif + int16_t metadata_sid_bits; if ( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) { if ( ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) && core_brate != FRAME_NO_DATA ) { +#ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) +#else + if ( ivas_format == SBA_FORMAT ) +#endif { +#ifdef DEBUGGING assert( hMetaData->ind_list[0].nb_bits == 1 ); +#endif hMetaData->ind_list[0].value = 1; metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; while ( hMetaData->nb_bits_tot < metadata_sid_bits ) @@ -936,15 +1332,22 @@ void reset_metadata_spatial( else { /* Reset metadata and keep only SID metadata*/ +#ifdef IND_LIST_DYN + last_ind_sid = hMetaData->nb_ind_tot; + next_ind_sid = hMetaData->nb_ind_tot; +#else last_ind_sid = hMetaData->next_ind; next_ind_sid = hMetaData->next_ind; +#endif while ( hMetaData->nb_bits_tot > nb_bits_metadata ) { next_ind_sid--; hMetaData->nb_bits_tot -= hMetaData->ind_list[next_ind_sid].nb_bits; } +#ifndef IND_LIST_DYN hMetaData->next_ind = 0; +#endif hMetaData->nb_bits_tot = 0; for ( i = 0; i < next_ind_sid; i++ ) @@ -952,6 +1355,17 @@ void reset_metadata_spatial( hMetaData->ind_list[i].nb_bits = -1; } +#ifdef IND_LIST_DYN + for ( j = 0, i = next_ind_sid; i < last_ind_sid; i++, j++ ) + { + hMetaData->ind_list[j].value = hMetaData->ind_list[i].value; + hMetaData->ind_list[j].nb_bits = hMetaData->ind_list[i].nb_bits; + hMetaData->nb_bits_tot += hMetaData->ind_list[j].nb_bits; + hMetaData->ind_list[i].nb_bits = -1; + } + + hMetaData->nb_ind_tot = j; +#else for ( i = next_ind_sid; i < last_ind_sid; i++ ) { hMetaData->ind_list[hMetaData->next_ind].value = hMetaData->ind_list[i].value; @@ -960,13 +1374,20 @@ void reset_metadata_spatial( hMetaData->next_ind++; hMetaData->ind_list[i].nb_bits = -1; } + hMetaData->last_ind = hMetaData->next_ind; +#endif +#ifdef DEBUGGING assert( ( hMetaData->nb_bits_tot == ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) && "Problem of SID metadata in SCE" ); +#endif } } else { /*Reset metadata*/ +#ifdef IND_LIST_DYN + reset_indices_enc( hMetaData, hMetaData->nb_ind_tot ); +#else for ( i = 0; i < hMetaData->next_ind; i++ ) { hMetaData->ind_list[i].nb_bits = -1; @@ -974,21 +1395,36 @@ void reset_metadata_spatial( hMetaData->nb_bits_tot = 0; hMetaData->next_ind = 0; hMetaData->last_ind = 0; +#endif } *total_brate = element_brate; } +#ifndef SBA_MODE_CLEAN_UP else if ( sba_mode != SBA_MODE_SPAR ) +#else + else if ( ivas_format != SBA_FORMAT ) +#endif { /* Reset SID metadata bits*/ while ( hMetaData->nb_bits_tot > nb_bits_metadata ) { +#ifdef IND_LIST_DYN + hMetaData->nb_ind_tot--; + hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits; + hMetaData->ind_list[hMetaData->nb_ind_tot].nb_bits = -1; +#else hMetaData->next_ind--; hMetaData->nb_bits_tot -= hMetaData->ind_list[hMetaData->next_ind].nb_bits; hMetaData->ind_list[hMetaData->next_ind].nb_bits = -1; +#endif } +#ifdef DEBUGGING assert( hMetaData->nb_bits_tot == nb_bits_metadata && "Problem in metadata for SCE" ); +#endif +#ifndef IND_LIST_DYN hMetaData->last_ind = hMetaData->next_ind; +#endif } return; @@ -1001,13 +1437,13 @@ void reset_metadata_spatial( * *------------------------------------------------------------------------*/ -/* !r: quantized spherical index */ +/*! r: quantized spherical index */ int16_t quantize_direction2D( - float phi, /* i : input azimuth value */ - const int16_t no_cw, /* i : number of bits */ - float *phi_q, /* o : quantized azimuth value */ - uint16_t *index_phi, /* o : quantized azimuth index */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + float phi, /* i : input azimuth value */ + const int16_t no_cw, /* i : number of bits */ + float *phi_q, /* o : quantized azimuth value */ + uint16_t *index_phi, /* o : quantized azimuth index */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ) { int16_t idx_sph; @@ -1019,7 +1455,6 @@ int16_t quantize_direction2D( return 0; } - if ( mc_format != MC_LS_SETUP_INVALID ) { id_phi = quantize_phi_chan_compand( phi + 180, phi_q, no_cw, 0, mc_format ); @@ -1037,17 +1472,19 @@ int16_t quantize_direction2D( } +#ifdef HR_METADATA /*------------------------------------------------------------------------- * ivas_qmetadata_quantize_diffuseness_nrg_ratios() * * Quantize diffuseness *------------------------------------------------------------------------*/ -static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, - int16_t *dfRatioBits ) + int16_t *dfRatioBits, + const int16_t bits_dir_hr ) { int16_t j, k, dir2band; int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod; @@ -1076,10 +1513,10 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( diffRatio = 1.0f - sumRatio; dfRatio = sumRatio < EPSILON ? 0.5f : dirRatio1 / sumRatio; - index_diff = masa_sq( diffRatio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); - diffRatioQ = diffuseness_reconstructions[index_diff]; + index_diff = masa_sq( diffRatio, diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + diffRatioQ = diffuseness_reconstructions_hr[index_diff]; - dfRatio_bits = ivas_get_df_ratio_bits( index_diff ); + dfRatio_bits = ivas_get_df_ratio_bits( index_diff >> 1 ); dfRatioBits[dir2band] = dfRatio_bits; @@ -1090,6 +1527,327 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( dirRatio1Q = dfRatioQ * ( 1.0f - diffRatioQ ); dirRatio2Q = ( 1.0f - diffRatioQ ) - dirRatio1Q; + index_dirRatio1Inv = masa_sq( 1.0f - dirRatio1Q, diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + + /* Note: To save memory, we store temporarily index_diff and dfRatio_index into first and second direction + * energy ratio index variables until they have been encoded. index_dirRatio1Inv and index_dirRatio2Inv are + * then later retrieved for further use in encoding. */ + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index_diff; + hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = dirRatio1Q; + } + nbits_diff[0] += MASA_BITS_ER_HR; + + index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[k] = dfRatio_index; + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[k] = dirRatio2Q; + } + nbits_diff[1] += dfRatio_bits; + + /* Obtain compensated direct-to-total ratios for direction quantization. This compensates for the + * fact that with 2dir data, it is harder to achieve separate high direct-to-total ratio values + * which are assumed by the direction quantization system. In practice, this improves direction + * accuracy when it is perceptual meaningful. */ + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod, + 0 ); + + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index_dirRatio1Inv_mod; + + if ( bits_dir_hr > 0 ) + { + hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr; + } + else + { + + hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_direction_masa[index_dirRatio1Inv_mod]; + } + } + needed_bits[0] += hQMetaData->q_direction[0].cfg.nblocks * bits_direction_masa[index_dirRatio1Inv_mod]; + + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index_mod[k] = index_dirRatio2Inv_mod; + + if ( bits_dir_hr > 0 ) + { + hQMetaData->q_direction[1].band_data[dir2band].bits_sph_idx[k] = bits_dir_hr; + } + else + { + + hQMetaData->q_direction[1].band_data[dir2band].bits_sph_idx[k] = bits_direction_masa[index_dirRatio2Inv_mod]; + } + } + needed_bits[1] += hQMetaData->q_direction[1].cfg.nblocks * bits_direction_masa[index_dirRatio2Inv_mod]; + + dir2band++; + } + else + { + index_dirRatio1Inv = masa_sq( 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index_dirRatio1Inv; + hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index_dirRatio1Inv; + hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index_dirRatio1Inv]; + + if ( bits_dir_hr > 0 ) + { + hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr; + } + else + { + + hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_direction_masa[index_dirRatio1Inv]; + } + } + + nbits_diff[0] += MASA_BITS_ER_HR; + + needed_bits[0] += hQMetaData->q_direction[0].cfg.nblocks * bits_dir_hr; + } + } + + return; +} + + +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr_512( + IVAS_QMETADATA_HANDLE hQMetaData, + int16_t *needed_bits, + const int16_t bits_dir_hr, + BSTR_ENC_HANDLE hMetaData ) +{ + int16_t j, k; + int16_t index; + + needed_bits[0] = 0; + needed_bits[1] = 0; + + for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) + { + for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) + { + index = masa_sq( 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + push_next_indice( hMetaData, index, MASA_BITS_ER_HR ); + hQMetaData->q_direction[0].band_data[j].energy_ratio_index[k] = index; + hQMetaData->q_direction[0].band_data[j].energy_ratio_index_mod[k] = index; + hQMetaData->q_direction[0].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index]; + needed_bits[0] += MASA_BITS_ER_HR; + hQMetaData->q_direction[0].band_data[j].bits_sph_idx[k] = bits_dir_hr; + } + } + + if ( hQMetaData->no_directions == 2 ) + { + for ( j = hQMetaData->q_direction[1].cfg.start_band; j < hQMetaData->q_direction[1].cfg.nbands; ++j ) + { + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) + { + index = masa_sq( 1.0f - hQMetaData->q_direction[1].band_data[j].energy_ratio[k], diffuseness_thresholds_hr, HR_MASA_ER_LEVELS ); + push_next_indice( hMetaData, index, MASA_BITS_ER_HR ); + hQMetaData->q_direction[1].band_data[j].energy_ratio_index[k] = index; + hQMetaData->q_direction[1].band_data[j].energy_ratio[k] = 1.0f - diffuseness_reconstructions_hr[index]; + if ( hQMetaData->q_direction[1].band_data[j].energy_ratio[k] > 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k] ) + { + hQMetaData->q_direction[1].band_data[j].energy_ratio[k] = 1.0f - hQMetaData->q_direction[0].band_data[j].energy_ratio[k]; + } + needed_bits[1] += MASA_BITS_ER_HR; + hQMetaData->q_direction[1].band_data[j].bits_sph_idx[k] = bits_dir_hr; + } + } + } + + return; +} + + +/*------------------------------------------------------------------------- + * ivas_qmetadata_entropy_encode_diffuseness() + * + * encode diffuseness + *------------------------------------------------------------------------*/ + +static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( + BSTR_ENC_HANDLE hMetaData, + IVAS_QDIRECTION *q_direction, + uint16_t *diffuseness_index_max_ec_frame ) +{ + int16_t start_bit_pos; + int16_t diffuseness_bits_raw; + int16_t b; + int16_t min_diffuseness_m_index, max_diffuseness_m_index; + int16_t nbands; + int16_t start_band; + + nbands = q_direction->cfg.nbands; + start_band = q_direction->cfg.start_band; + + start_bit_pos = hMetaData->nb_bits_tot; + + if ( nbands == 1 ) + { + /* If there is only one band, diffuseness should be coded directly as raw with no signaling. */ + push_next_indice( hMetaData, q_direction->band_data[0].energy_ratio_index[0], MASA_BITS_ER_HR ); + *diffuseness_index_max_ec_frame = 10; + return ( hMetaData->nb_bits_tot - start_bit_pos ); + } + + /* compute the number of raw coding bits */ + diffuseness_bits_raw = 0; + for ( b = start_band; b < nbands; b++ ) + { + diffuseness_bits_raw += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0], HR_MASA_ER_LEVELS ); + } + + min_diffuseness_m_index = q_direction->band_data[start_band].energy_ratio_index[0]; + max_diffuseness_m_index = q_direction->band_data[start_band].energy_ratio_index[0]; + + for ( b = start_band; b < nbands; b++ ) + { + if ( q_direction->band_data[b].energy_ratio_index[0] < min_diffuseness_m_index ) + { + min_diffuseness_m_index = q_direction->band_data[b].energy_ratio_index[0]; + } + + if ( q_direction->band_data[b].energy_ratio_index[0] > max_diffuseness_m_index ) + { + max_diffuseness_m_index = q_direction->band_data[b].energy_ratio_index[0]; + } + } + + /* Use similarity coding approach or raw coding when there is a low number of bands. */ + /* one bit is used to indicate whether diffuseness values are entropy coded or coded raw */ + if ( min_diffuseness_m_index == max_diffuseness_m_index ) /* all values are equal */ + { + push_next_indice( hMetaData, 0, 1 ); /* dif_use_raw_coding */ + push_next_indice( hMetaData, 1, 1 ); /* dif_have_unique_value */ + ivas_qmetadata_encode_quasi_uniform( hMetaData, min_diffuseness_m_index, HR_MASA_ER_LEVELS ); /* dif_unique_value */ + } + else if ( min_diffuseness_m_index + 1 == max_diffuseness_m_index ) /* only two consecutive values are present */ + { + push_next_indice( hMetaData, 0, 1 ); /* dif_use_raw_coding */ + push_next_indice( hMetaData, 0, 1 ); /* dif_have_unique_value */ + ivas_qmetadata_encode_quasi_uniform( hMetaData, min_diffuseness_m_index, HR_MASA_ER_LEVELS - 1 ); /* dif_min_value */ + + for ( b = start_band; b < nbands; b++ ) + { + push_next_indice( hMetaData, q_direction->band_data[b].energy_ratio_index[0] - min_diffuseness_m_index, 1 ); /* dif_bit_offset_values */ + } + } + else /* raw coding */ + { + push_next_indice( hMetaData, 1, 1 ); /* dif_use_raw_coding */ + + for ( b = start_band; b < nbands; b++ ) + { + ivas_qmetadata_encode_quasi_uniform( hMetaData, q_direction->band_data[b].energy_ratio_index[0], HR_MASA_ER_LEVELS ); /* dif_values */ + } + } + + *diffuseness_index_max_ec_frame = 10; + /* adaptively select the diffuseness_index_max_ec threshold */ + if ( min_diffuseness_m_index > 10 ) + { + *diffuseness_index_max_ec_frame = HR_MASA_ER_LEVELS - 1; + } + +#ifdef DEBUGGING + assert( ( hMetaData->nb_bits_tot - start_bit_pos ) <= 1 + diffuseness_bits_raw ); +#endif + return ( hMetaData->nb_bits_tot - start_bit_pos ); +} + +#endif + +/*------------------------------------------------------------------------- + * ivas_qmetadata_quantize_diffuseness_nrg_ratios() + * + * Quantize diffuseness + *------------------------------------------------------------------------*/ + +static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( + IVAS_QMETADATA_HANDLE hQMetaData, + int16_t *needed_bits, + int16_t *nbits_diff, + int16_t *dfRatioBits, + const int16_t hodirac_flag ) +{ + int16_t j, k, dir2band; + int16_t index_dirRatio1Inv, index_dirRatio2Inv, index_dirRatio1Inv_mod, index_dirRatio2Inv_mod; + int16_t index_diff; + + nbits_diff[0] = 0; + nbits_diff[1] = 0; + needed_bits[0] = 0; + needed_bits[1] = 0; + dir2band = 0; + + for ( j = hQMetaData->q_direction[0].cfg.start_band; j < hQMetaData->q_direction[0].cfg.nbands; ++j ) + { + if ( hQMetaData->no_directions == 2 && hQMetaData->twoDirBands[j] == 1 ) + { + float diffRatio, dfRatio, dfRatioQ, diffRatioQ, dirRatio1Q, dirRatio2Q; + float dirRatio1, dirRatio2, sumRatio; + int16_t dfRatio_index, dfRatio_qsteps, dfRatio_bits; + + /* With 2dir metadata, we quantize and transmit diffuse-to-total ratio (diffRatio) and + * distribution factor of direct-to-total ratios (dFRatio). This is more efficient and + * accurate than simple separate quantization of each direct-to-total ratio or their + * separate inverses. */ + if ( hodirac_flag ) + { + /* already encoded as total and ratios in HO-DirAC */ + diffRatio = 1.f - hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; + dfRatio = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; + } + else + { + dirRatio1 = hQMetaData->q_direction[0].band_data[j].energy_ratio[0]; + dirRatio2 = hQMetaData->q_direction[1].band_data[dir2band].energy_ratio[0]; + sumRatio = dirRatio1 + dirRatio2; + diffRatio = 1.0f - sumRatio; + dfRatio = sumRatio < EPSILON ? 0.5f : dirRatio1 / sumRatio; + } + + + index_diff = masa_sq( diffRatio, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + diffRatioQ = diffuseness_reconstructions[index_diff]; + + if ( hodirac_flag ) + { + dfRatio_bits = ivas_get_df_ratio_bits_hodirac( index_diff ); + } + else + { + dfRatio_bits = ivas_get_df_ratio_bits( index_diff ); + } + + dfRatioBits[dir2band] = dfRatio_bits; + + dfRatio_qsteps = ( 1 << dfRatio_bits ); + if ( hodirac_flag ) + { + dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.0f, 1.f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); + dirRatio1Q = 1.f - diffRatioQ; + dirRatio2Q = dfRatioQ; + } + else + { + dfRatio_index = usquant( dfRatio, &dfRatioQ, 0.5f, 0.5f / ( dfRatio_qsteps - 1 ), dfRatio_qsteps ); + + /* Direction quantization requires also separately quantized direct-to-total ratios. Thus, we calculate them. */ + dirRatio1Q = dfRatioQ * ( 1.0f - diffRatioQ ); + dirRatio2Q = ( 1.0f - diffRatioQ ) - dirRatio1Q; + } + index_dirRatio1Inv = masa_sq( 1.0f - dirRatio1Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); /* Note: To save memory, we store temporarily index_diff and dfRatio_index into first and second direction @@ -1102,7 +1860,16 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( } nbits_diff[0] += MASA_BITS_ER; - index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + if ( hodirac_flag ) + { + float tmp; + index_dirRatio2Inv = usquant( dirRatio2Q, &tmp, 0.0f, 1.f / ( DIRAC_DIFFUSE_LEVELS - 1 ), DIRAC_DIFFUSE_LEVELS ); + } + else + { + index_dirRatio2Inv = masa_sq( 1.0f - dirRatio2Q, diffuseness_thresholds, DIRAC_DIFFUSE_LEVELS ); + } + for ( k = 0; k < hQMetaData->q_direction[1].cfg.nblocks; k++ ) { hQMetaData->q_direction[1].band_data[dir2band].energy_ratio_index[k] = dfRatio_index; @@ -1114,7 +1881,8 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( * fact that with 2dir data, it is harder to achieve separate high direct-to-total ratio values * which are assumed by the direction quantization system. In practice, this improves direction * accuracy when it is perceptual meaningful. */ - masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod ); + masa_compensate_two_dir_energy_ratio_index( index_dirRatio1Inv, index_dirRatio2Inv, &index_dirRatio1Inv_mod, &index_dirRatio2Inv_mod, + hodirac_flag ); for ( k = 0; k < hQMetaData->q_direction[0].cfg.nblocks; k++ ) { @@ -1145,6 +1913,7 @@ static void ivas_qmetadata_quantize_diffuseness_nrg_ratios( } nbits_diff[0] += MASA_BITS_ER; + needed_bits[0] += hQMetaData->q_direction[0].cfg.nblocks * bits_direction_masa[index_dirRatio1Inv]; } } @@ -1494,24 +2263,38 @@ static int16_t ivas_qmetadata_entropy_encode_df_ratio( /*------------------------------------------------------------------------- * restore_metadata_buffer() * - * Reset metadata buffer + * Restore metadata buffer *------------------------------------------------------------------------*/ void restore_metadata_buffer( BSTR_ENC_HANDLE hMetaData, const int16_t next_ind_start, +#ifndef IND_LIST_DYN const int16_t last_ind_start, +#endif const int16_t bit_pos_start ) { int16_t i; +#ifdef IND_LIST_DYN +#ifdef FIX_I503_ASAN_ERROR_IND_LIST + for ( i = next_ind_start; i < hMetaData->nb_ind_tot; i++ ) +#else + for ( i = next_ind_start; i <= hMetaData->nb_ind_tot; i++ ) +#endif +#else for ( i = next_ind_start; i <= hMetaData->next_ind; i++ ) +#endif { hMetaData->ind_list[i].nb_bits = -1; } hMetaData->nb_bits_tot = bit_pos_start; +#ifdef IND_LIST_DYN + hMetaData->nb_ind_tot = next_ind_start; +#else hMetaData->next_ind = next_ind_start; hMetaData->last_ind = last_ind_start; +#endif return; } @@ -1531,7 +2314,7 @@ static void ivas_qmetadata_encode_quasi_uniform( int16_t bits; uint16_t tresh; #ifdef DEBUGGING - assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ + assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ assert( value < alphabet_size ); #endif @@ -1560,7 +2343,7 @@ static void ivas_qmetadata_encode_quasi_uniform( * *------------------------------------------------------------------------*/ -/* !r: number of bits using Golomb Rice code */ +/*! r: number of bits using Golomb Rice code */ static int16_t GR_bits_new( uint16_t *data, /* i : data to encode with GR */ int16_t *no_symb, /* i : number of symbols for each component*/ @@ -1614,7 +2397,7 @@ static int16_t GR_bits_new( * Encoding azimuth indexes with GR code using context *------------------------------------------------------------------------*/ -/* !r: numer of bits used for coding */ +/*! r: numer of bits used for coding */ static int16_t GR_bits_azimuth_context( uint16_t *data_in, /* i : data to be encoded */ int16_t *no_symb, /* i : number of symbols for each component */ @@ -1712,7 +2495,7 @@ static int16_t GR_bits_azimuth_context( * Golomb Rice encoding with mean removing *------------------------------------------------------------------------*/ -/* !r: number of bits used */ +/*! r: number of bits used */ static int16_t mean_removed_GR_new( const uint16_t *idx, /* i : data to encode */ const int16_t max_no_symb, @@ -1770,7 +2553,7 @@ static int16_t ivas_qmetadata_encode_quasi_uniform_length( int16_t bits; uint16_t tresh; #ifdef DEBUGGING - assert( ( alphabet_size >= 1 ) ); /*fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ + assert( ( alphabet_size >= 1 ) ); /* ToDo: fcs: to check if this additional conditon is really needed: && (alphabet_size <= (1U << 31) - 1));*/ assert( value < alphabet_size ); #endif @@ -1799,7 +2582,12 @@ static int16_t ivas_qmetadata_entropy_encode_dir( const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, - int16_t max_bits ) + int16_t max_bits +#ifdef HR_METADATA + , + const int16_t hrmasa_flag +#endif +) { uint16_t diff_idx_min; int16_t i, j; @@ -1843,9 +2631,21 @@ static int16_t ivas_qmetadata_entropy_encode_dir( idx = 0; dist_count = 0; set_zero( avg_direction_vector, 3 ); + for ( i = start_band; i < nbands; i++ ) { - diff_idx_min = min( q_direction->band_data[i].energy_ratio_index_mod[0], diff_idx_min ); +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + diff_idx_min = 0; // min( q_direction->band_data[i].energy_ratio_index_mod[0]>>1, diff_idx_min ); + } + else + { +#endif + diff_idx_min = min( q_direction->band_data[i].energy_ratio_index_mod[0], diff_idx_min ); +#ifdef HR_METADATA + } +#endif if ( q_direction->band_data[i].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame ) { @@ -2046,6 +2846,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( } } } + direction_bits_ec += elevation_bits_ec_best; } @@ -2218,6 +3019,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( } } } + /* encode the ExtendedGR part for azimuth */ ivas_qmetadata_encode_quasi_uniform( hMetaData, ivas_qmetadata_reorder_generic( avg_azimuth_index_best - ( avg_azimuth_alphabet >> 1 ) ), avg_azimuth_alphabet ); @@ -2251,6 +3053,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( ivas_qmetadata_encode_extended_gr( hMetaData, dist_azimuth_indexes_best[idx], dist_azimuth_alphabets[idx], gr_param_azimuth_best ); } } + if ( dist_count > nblocks ) { if ( ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( nblocks > 1 ) ) @@ -2285,6 +3088,7 @@ static int16_t ivas_qmetadata_entropy_encode_dir( } } } + direction_bits_ec -= bits_gained; } else @@ -3438,7 +4242,7 @@ static ivas_error requantize_direction_EC_3( * writing of the spherical indexes *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, /* i : MASA metadata structure */ IVAS_QDIRECTION *qdirection, /* i/o: quantized directional parameters */ @@ -3700,7 +4504,7 @@ static void calculate_two_distances( * write metadata using entropy encoding *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static ivas_error write_ec_direction( int16_t *num_bits_written, /* o : Number of bits written */ BSTR_ENC_HANDLE hMetaData, /* i : MASA metadata structure */ @@ -3874,7 +4678,7 @@ static ivas_error write_ec_direction( * Local functions (coherence Q and coding) *-----------------------------------------------------------------------*/ -/* !r: index */ +/*! r: index */ static uint64_t create_combined_index( uint16_t *idx_dct, /* i : indexes to combine */ const int16_t len, /* i : number of indexes */ @@ -3900,13 +4704,13 @@ static uint64_t create_combined_index( * encoding DCT0 coeffs with joint index *-----------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, /* i : indexes to be encoded */ const int16_t len, /* i : number of indexes */ int16_t *no_cb_vec, /* i : number of codewords for each position */ BSTR_ENC_HANDLE hMetaData, - int16_t indice_coherence, + const int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ) { @@ -4001,9 +4805,7 @@ static int16_t coherence_coding_length( if ( sum_s( no_cv, coding_subbands ) > MASA_COH_LIMIT_2IDX ) { -#ifdef DEBUGGING - assert( coding_subbands % 2 == 0 ); -#endif + no_cb = 1; half_coding_subbands = coding_subbands / 2; for ( j = 0; j < half_coding_subbands; j++ ) @@ -4049,11 +4851,15 @@ static int16_t coherence_coding_length( * Encoding spread coherence for 1 subframe bands *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t encode_spread_coherence_1sf( - IVAS_QMETADATA *q_metadata, /* i : quantized metadata */ - const int16_t idx_d, /* i : current direction index */ - BSTR_ENC_HANDLE hMasaMetaData /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *q_metadata, /* i : quantized metadata */ + const int16_t idx_d, /* i : current direction index */ + BSTR_ENC_HANDLE hMasaMetaData /* i/o: metadata bitstream handle */ +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ +#endif ) { int16_t i, j, k; @@ -4079,11 +4885,24 @@ static int16_t encode_spread_coherence_1sf( GR_ord = 1; idx_shift = 0; + /* number of codevectors added dependent on number of subbands */ extra_cv = coding_subbands / MASA_FACTOR_CV_COH; for ( j = 0; j < coding_subbands; j++ ) { - idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + extra_cv; +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + extra_cv; + } + else + { +#endif + idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + extra_cv; +#ifdef HR_METADATA + } +#endif + if ( idx_ER > 0 ) { idx_sp_coh[j] = (uint16_t) roundf( q_direction->coherence_band_data[j].spread_coherence[0] / ( 255.0f / (float) idx_ER ) ); @@ -4228,7 +5047,7 @@ static int16_t encode_spread_coherence_1sf( * encoding surround coherence *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t encode_surround_coherence( IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */ BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ @@ -4366,72 +5185,276 @@ static int16_t encode_surround_coherence( push_next_indice( hMetaData, ( ( idx >> k ) & 65535 ), 16 ); /* 16 bits */ } - push_next_indice( hMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k ); - - if ( nbits_fr1 > 0 ) + push_next_indice( hMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k ); + + if ( nbits_fr1 > 0 ) + { + if ( nbits_fr1 % 16 == 0 ) + { + no_idx16 = nbits_fr1 / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) ); + } + + assert( no_idx16 <= 4 ); + + k = nbits_fr1; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */ + } + + push_next_indice( hMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k ); + } + } + else + { + /* write flag */ + nbits = 1; + + /* write flag*/ + push_next_indice( hMetaData, 1, 1 ); + + /* write GR_ord */ + push_next_indice( hMetaData, GR_ord, 1 ); + nbits += 1; + + /* write the min */ + bits_GR = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH, 0 ); + nbits += hMetaData->nb_bits_tot - bits_GR; + + /* write GR data */ + for ( j = 0; j < idx_shift; j++ ) + { + bits_GR = hMetaData->nb_bits_tot; + + ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_sur_coh[j], no_cv_shift[j], GR_ord ); + + nbits += hMetaData->nb_bits_tot - bits_GR; + } + } + } +#ifdef DEBUGGING + for ( i = 0; i < coding_subbands; i++ ) + { + for ( j = 1; j < q_direction->cfg.nblocks; j++ ) + { + hQMetaData->surcoh_band_data[i].surround_coherence[j] = hQMetaData->surcoh_band_data[i].surround_coherence[0]; + } + } +#endif + + return nbits; +} + + +#ifdef HR_METADATA +static int16_t encode_surround_coherence_hr( + IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */ + BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ +) +{ + int16_t i, j, k, sf; + int16_t nbits, nbits_fr, nbits_sf; + uint16_t idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + uint16_t mr_idx_sur_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + int16_t GR_ord, bits_GR; + uint64_t idx, idx1; + int16_t no_idx16; + int16_t no_cv[MASA_MAXIMUM_CODING_SUBBANDS]; + float error_ratio_surr; + IVAS_QDIRECTION *q_direction; + int16_t half_coding_subbands, nbits_fr1, coding_subbands; + int16_t all_coherence_zero; + uint16_t idx_sur_coh_shift[MASA_MAXIMUM_CODING_SUBBANDS]; + uint8_t idx_shift; + int16_t max_val = 0, nbits_max; + int16_t no_cv_shift[MASA_MAXIMUM_CODING_SUBBANDS], min_idx; + int16_t idx16; + + coding_subbands = hQMetaData->q_direction[0].cfg.nbands; + all_coherence_zero = hQMetaData->all_coherence_zero; + q_direction = &( hQMetaData->q_direction[0] ); + nbits = 0; + + if ( all_coherence_zero == 1 ) + { + nbits = 0; + } + else + { + for ( sf = 0; sf < hQMetaData->q_direction[0].cfg.nblocks; sf++ ) + { + GR_ord = 1; + k = 0; + idx_shift = 0; + for ( j = 0; j < coding_subbands; j++ ) + { + if ( hQMetaData->no_directions == 2 ) + { + k += hQMetaData->twoDirBands[j]; + idx16 = max( k - 1, 0 ); + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf] - q_direction[1].band_data[idx16].energy_ratio[sf] * hQMetaData->twoDirBands[j]; + } + else + { + error_ratio_surr = 1.0f - q_direction[0].band_data[j].energy_ratio[sf]; + } + + + if ( error_ratio_surr <= 0 ) + { + error_ratio_surr = 0; + idx_sur_coh[j] = 0; + no_cv[j] = 1; + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; /* sur_coherence_cb_masa[idx_cb_sur_coh_masa[DIRAC_DIFFUSE_LEVELS - 1] * MASA_MAX_NO_CV_SUR_COH]; */ + } + else + { + idx_sur_coh[j] = squant_int( hQMetaData->surcoh_band_data[j].surround_coherence[sf], &hQMetaData->surcoh_band_data[j].surround_coherence[sf], + &sur_coherence_cb_masa[idx_cb_sur_coh_masa[7] * MASA_MAX_NO_CV_SUR_COH], idx_cb_sur_coh_masa[7] + 2 ); + no_cv[j] = idx_cb_sur_coh_masa[7] + 2; + no_cv_shift[idx_shift] = no_cv[j]; + idx_sur_coh_shift[idx_shift++] = idx_sur_coh[j]; + } + } + + if ( sum_s( no_cv, coding_subbands ) != coding_subbands ) { - if ( nbits_fr1 % 16 == 0 ) + nbits_max = 0; + if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH ) { - no_idx16 = nbits_fr1 / 16; + j = maximum_s( (int16_t *) idx_sur_coh, coding_subbands, &max_val ); + for ( j = 0; j < coding_subbands; j++ ) + { + if ( no_cv[j] > max_val + 1 ) + { + no_cv[j] = max_val + 1; + } + } + nbits_max = MASA_MAX_NO_CV_SUR_COH - max_val; /* encoded with GR0 as max_no_vals - no_vals*/ } - else + if ( max_val == 0 ) { - no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) ); + for ( j = 0; j < coding_subbands; j++ ) + { + hQMetaData->surcoh_band_data[j].surround_coherence[sf] = 0; + } } + nbits_sf = coherence_coding_length( idx_sur_coh_shift, idx_shift, coding_subbands, no_cv, + mr_idx_sur_coh, no_cv_shift, &min_idx, &GR_ord, &nbits_fr, &nbits_fr1 ); + half_coding_subbands = coding_subbands / 2; + idx1 = 0; - assert( no_idx16 <= 4 ); - - k = nbits_fr1; - for ( i = 0; i < no_idx16 - 1; i++ ) + /* should check how to encode the average - check distribution */ + if ( nbits_fr + nbits_fr1 + nbits_max < nbits_sf ) { - k -= 16; - push_next_indice( hMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */ - } + /* write flag*/ + push_next_indice( hMetaData, 0, 1 ); - push_next_indice( hMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k ); - } - } - else - { - /* write flag */ - nbits = 1; + /* create combined index */ + nbits += nbits_fr + nbits_fr1 + 1; + if ( coding_subbands > MASA_LIMIT_NO_BANDS_SUR_COH ) + { + /* write max value*/ + bits_GR = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, MASA_MAX_NO_CV_SUR_COH - max_val - 1, MASA_MAX_NO_CV_SUR_COH, 0 ); + nbits += hMetaData->nb_bits_tot - bits_GR; + } - /* write flag*/ - push_next_indice( hMetaData, 1, 1 ); + if ( nbits_fr1 > 0 ) + { + idx = create_combined_index( idx_sur_coh, half_coding_subbands, no_cv ); + idx1 = create_combined_index( &idx_sur_coh[half_coding_subbands], half_coding_subbands, &no_cv[half_coding_subbands] ); + } + else + { + idx = create_combined_index( idx_sur_coh, coding_subbands, no_cv ); + } - /* write GR_ord */ - push_next_indice( hMetaData, GR_ord, 1 ); - nbits += 1; + if ( nbits_fr % 16 == 0 ) + { + no_idx16 = nbits_fr / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr / 16.0f + 0.5f ) ); + } - /* write the min */ - bits_GR = hMetaData->nb_bits_tot; - ivas_qmetadata_encode_extended_gr( hMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH, 0 ); - nbits += hMetaData->nb_bits_tot - bits_GR; + /* write combined index */ + k = nbits_fr; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMetaData, ( ( idx >> k ) & 65535 ), 16 ); /* 16 bits */ + } - /* write GR data */ - for ( j = 0; j < idx_shift; j++ ) - { - bits_GR = hMetaData->nb_bits_tot; + push_next_indice( hMetaData, ( idx & ( ( 1 << k ) - 1 ) ), k ); - ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_sur_coh[j], no_cv_shift[j], GR_ord ); + if ( nbits_fr1 > 0 ) + { + if ( nbits_fr1 % 16 == 0 ) + { + no_idx16 = nbits_fr1 / 16; + } + else + { + no_idx16 = (int16_t) round_f( ( nbits_fr1 / 16.0f + 0.5f ) ); + } - nbits += hMetaData->nb_bits_tot - bits_GR; + assert( no_idx16 <= 4 ); + + k = nbits_fr1; + for ( i = 0; i < no_idx16 - 1; i++ ) + { + k -= 16; + push_next_indice( hMetaData, ( ( idx1 >> k ) & 65535 ), 16 ); /* 16 bits */ + } + + push_next_indice( hMetaData, ( idx1 & ( ( 1 << k ) - 1 ) ), k ); + } + } + else + { + /* write flag */ + nbits += 1; + + /* write flag*/ + push_next_indice( hMetaData, 1, 1 ); + + /* write GR_ord */ + push_next_indice( hMetaData, GR_ord, 1 ); + nbits += 1; + + /* write the min */ + bits_GR = hMetaData->nb_bits_tot; + ivas_qmetadata_encode_extended_gr( hMetaData, min_idx, MASA_MAX_NO_CV_SUR_COH, 0 ); + nbits += hMetaData->nb_bits_tot - bits_GR; + + /* write GR data */ + for ( j = 0; j < idx_shift; j++ ) + { + bits_GR = hMetaData->nb_bits_tot; + + ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx_sur_coh[j], no_cv_shift[j], GR_ord ); + + nbits += hMetaData->nb_bits_tot - bits_GR; + } + } } } } -#ifdef DEBUGGING - for ( i = 0; i < coding_subbands; i++ ) - { - for ( j = 1; j < q_direction->cfg.nblocks; j++ ) - { - hQMetaData->surcoh_band_data[i].surround_coherence[j] = hQMetaData->surcoh_band_data[i].surround_coherence[0]; - } - } -#endif + return nbits; } +#endif + /*-------------------------------------------------------------------* * quantize_DCT_0_coh() @@ -4439,7 +5462,7 @@ static int16_t encode_surround_coherence( * quanization of DCT component of order zero for transformed coherence vector *-------------------------------------------------------------------*/ -/* !r: quantized value */ +/*! r: quantized value */ static float quantize_DCT_0_coh( const float x, /* i : input value */ const int16_t j, /* i : subband index */ @@ -4449,14 +5472,44 @@ static float quantize_DCT_0_coh( IVAS_QDIRECTION *q_direction, /* i : quantized metadata */ uint16_t *idx_x, /* o : codewords index */ int16_t *p_no_cb /* o : actual number of codewords dependent on energy ratio value */ +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ +#endif ) { float var_azi, xhat; int16_t idx_sub_cb, idx; - +#ifdef HR_METADATA + int16_t min_index; +#endif /* quantize first DCT component */ var_azi = var( q_direction->band_data[j].azimuth, q_direction->cfg.nblocks ); +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); + min_index = min_index >> 1; + } + else + { + min_index = q_direction->band_data[j].energy_ratio_index[0]; + } + + if ( var_azi < delta_var ) + { + idx_sub_cb = no_cb * min_index; + } + else + { + idx_sub_cb = no_cb * ( min_index + DIRAC_DIFFUSE_LEVELS ); + } + + idx = squant( x, &xhat, &coherence_cb[idx_sub_cb], len_cb_dct0_masa[min_index] ); + + *p_no_cb = len_cb_dct0_masa[min_index]; +#else if ( var_azi < delta_var ) { idx_sub_cb = no_cb * q_direction->band_data[j].energy_ratio_index[0]; @@ -4469,7 +5522,7 @@ static float quantize_DCT_0_coh( idx = squant( x, &xhat, &coherence_cb[idx_sub_cb], len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]] ); *p_no_cb = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; - +#endif *idx_x = idx; return xhat; @@ -4482,7 +5535,7 @@ static float quantize_DCT_0_coh( * Encoding DCT1 coeffs with joint index or EC *-------------------------------------------------------------------*/ -/* !r: number of bits written */ +/*! r: number of bits written */ static int16_t encode_coherence_indexesDCT1( uint16_t *idx_dct, /* i : data to be encoded */ const int16_t len, /* i : number of data */ @@ -4538,20 +5591,134 @@ static void dct4_transform( } +#ifdef HR_METADATA /*-------------------------------------------------------------------* - * ivas_qmetadata_quantize_coherence() + * ivas_qmetadata_quantize_coherence_hr_512() * * *-------------------------------------------------------------------*/ -/* !r: number of bits written */ -static int16_t ivas_qmetadata_quantize_coherence( +static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ const int16_t idx_d, /* i : current direction index */ const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ - const int16_t write_flag, /* i : flag to actually write the data or not */ - int16_t *indice_coherence ) + const int16_t bits_coh ) +{ + int16_t j, k; + int16_t nbands, nblocks; + int16_t nbits; + int16_t nbits1, nbits0, nbits_av; + uint16_t idx_coh[MASA_MAXIMUM_CODING_SUBBANDS]; + IVAS_QDIRECTION *q_direction; + int16_t cbsize; + float delta, tmp; + int16_t min_idx, GR_param, GR_param_av; + uint16_t av, mr_idx[MASA_MAXIMUM_CODING_SUBBANDS]; + + q_direction = &( hQMetaData->q_direction[idx_d] ); + nbands = q_direction->cfg.nbands; + nblocks = q_direction->cfg.nblocks; + nbits = 0; + + if ( all_coherence_zero == 1 ) + { + return nbits; + } + nbits = hMetaData->nb_bits_tot; + + cbsize = 1 << bits_coh; + delta = 256.0f / cbsize; + + for ( k = 0; k < nblocks; k++ ) + { + min_idx = 0; + for ( j = 0; j < nbands; j++ ) + { + idx_coh[j] = usquant( (float) ( q_direction->coherence_band_data[j].spread_coherence[k] ), &tmp, delta / 2.0f, delta, cbsize ); + q_direction->coherence_band_data[j].spread_coherence[k] = (uint8_t) ( idx_coh[j] * delta + delta / 2.0f ); + if ( idx_coh[j] < min_idx ) + { + min_idx = idx_coh[j]; + } + } + + + nbits0 = 0; + nbits1 = 0; + for ( j = 0; j < nbands; j++ ) + { + idx_coh[j] = idx_coh[j] - min_idx; + nbits0 += ivas_qmetadata_encode_extended_gr_length( idx_coh[j], cbsize - min_idx, 0 ); + nbits1 += ivas_qmetadata_encode_extended_gr_length( idx_coh[j], cbsize - min_idx, 1 ); + } + if ( nbits0 < nbits1 ) + { + GR_param = 0; + nbits1 = nbits0; + } + else + { + GR_param = 1; + } + GR_param_av = 1; + nbits_av = mean_removed_GR_new( idx_coh, cbsize, nbands, 1, &GR_param_av, &av, mr_idx ); + + if ( nbits_av < nbits1 ) + { + nbits1 = nbits_av; + GR_param = GR_param_av; + /* use average removed */ + push_next_indice( hMetaData, 1, 1 ); + /* write average */ + push_next_indice( hMetaData, av, bits_coh ); + /* write GR param */ + push_next_indice( hMetaData, GR_param, 1 ); + for ( j = 0; j < nbands; j++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, mr_idx[j], 2 * cbsize, GR_param ); + } + } + else + { + /* use min removed */ + push_next_indice( hMetaData, 0, 1 ); + /* write min index */ + push_next_indice( hMetaData, min_idx, bits_coh ); + /* write GR param */ + push_next_indice( hMetaData, GR_param, 1 ); + for ( j = 0; j < nbands; j++ ) + { + ivas_qmetadata_encode_extended_gr( hMetaData, idx_coh[j], cbsize - min_idx, GR_param ); + } + } + } + + nbits = hMetaData->nb_bits_tot - nbits; + return nbits; +} +#endif + + +/*-------------------------------------------------------------------* + * ivas_qmetadata_quantize_coherence() + * + * + *-------------------------------------------------------------------*/ + +/*! r: number of bits written */ +static int16_t ivas_qmetadata_quantize_coherence( + IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata */ + const int16_t idx_d, /* i : current direction index */ + const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ + BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ + const int16_t write_flag, /* i : flag to actually write the data or not */ + int16_t *indice_coherence +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ +#endif +) { int16_t j, k; float dct_coh[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -4565,7 +5732,10 @@ static int16_t ivas_qmetadata_quantize_coherence( int16_t two_dir_band[MASA_MAXIMUM_CODING_SUBBANDS]; int16_t no_cb_vec[MASA_MAXIMUM_CODING_SUBBANDS]; IVAS_QDIRECTION *q_direction; - +#ifdef HR_METADATA + int16_t min_index; + min_index = 0; +#endif q_direction = &( hQMetaData->q_direction[idx_d] ); coding_subbands = q_direction->cfg.nbands; nbits = 0; @@ -4577,7 +5747,12 @@ static int16_t ivas_qmetadata_quantize_coherence( if ( hQMetaData->q_direction[idx_d].cfg.nblocks == 1 ) { - nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData ); + nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData +#ifdef HR_METADATA + , + hrmasa_flag +#endif + ); return nbits; } @@ -4632,13 +5807,32 @@ static int16_t ivas_qmetadata_quantize_coherence( { /* DCT transform */ dct4_transform( hQMetaData->q_direction[idx_d].coherence_band_data[j].spread_coherence, dct_coh[j] ); - no_cb_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; + +#ifdef HR_METADATA + if ( hrmasa_flag ) + { + minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); + no_cb_vec[j] = len_cb_dct0_masa[min_index >> 1]; + } + else + { +#endif + no_cb_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; +#ifdef HR_METADATA + } +#endif if ( write_flag ) { /* quantize first DCT parameter */ - dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j] ); + dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j] +#ifdef HR_METADATA + , + hrmasa_flag +#endif + ); } + if ( coding_subbands < coding_subbands_0 ) { idx_dct[k + coding_subbands] = squant( dct_coh[j][1], &dct_coh[j][1], &coherence_cb1_masa[MASA_grouping[two_dir_band[j]] * MASA_NO_CV_COH1], MASA_NO_CV_COH1 ); @@ -4701,7 +5895,11 @@ static int16_t ivas_qmetadata_quantize_coherence( else { /* write dummy data now and save the position */ +#ifdef IND_LIST_DYN + *indice_coherence = hMetaData->nb_ind_tot; +#else *indice_coherence = hMetaData->next_ind; +#endif k = nbits; while ( k > 0 ) { @@ -4775,20 +5973,86 @@ static void ivas_qmetadata_reorder_2dir_bands( hQMetaData->q_direction[0].band_data[band].distance[sf] = hQMetaData->q_direction[1].band_data[band].distance[sf]; hQMetaData->q_direction[1].band_data[band].distance[sf] = uint8_tmp; + if ( hQMetaData->coherence_flag ) + { + uint8_tmp = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf]; + hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf]; + hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = uint8_tmp; + } + } + if ( hQMetaData->coherence_flag ) + { + flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[0]; + hQMetaData->q_direction[0].band_data[band].energy_ratio[0] = hQMetaData->q_direction[1].band_data[band].energy_ratio[0]; + hQMetaData->q_direction[1].band_data[band].energy_ratio[0] = flt_tmp; + } + } + } + } + + return; +} + + +#ifdef HR_METADATA +/*-------------------------------------------------------------------* + * ivas_qmetadata_reorder_2dir_bands_hr() + * + * + *-------------------------------------------------------------------*/ + +static void ivas_qmetadata_reorder_2dir_bands_hr( + IVAS_QMETADATA_HANDLE hQMetaData ) +{ + int16_t nbands, nsubframes; + int16_t band, sf; + uint16_t uint16_tmp; + float flt_tmp; + uint8_t uint8_tmp; + + nbands = hQMetaData->q_direction[0].cfg.nbands; + nsubframes = hQMetaData->q_direction[0].cfg.nblocks; + + for ( band = 0; band < nbands; band++ ) + { + if ( hQMetaData->twoDirBands[band] == 1 ) + { + for ( sf = 0; sf < nsubframes; sf++ ) + { + if ( hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] < hQMetaData->q_direction[1].band_data[band].energy_ratio[sf] ) + { + uint16_tmp = hQMetaData->q_direction[0].band_data[band].spherical_index[sf]; + hQMetaData->q_direction[0].band_data[band].spherical_index[sf] = hQMetaData->q_direction[1].band_data[band].spherical_index[sf]; + hQMetaData->q_direction[1].band_data[band].spherical_index[sf] = uint16_tmp; + + flt_tmp = hQMetaData->q_direction[0].band_data[band].azimuth[sf]; + hQMetaData->q_direction[0].band_data[band].azimuth[sf] = hQMetaData->q_direction[1].band_data[band].azimuth[sf]; + hQMetaData->q_direction[1].band_data[band].azimuth[sf] = flt_tmp; + + flt_tmp = hQMetaData->q_direction[0].band_data[band].elevation[sf]; + hQMetaData->q_direction[0].band_data[band].elevation[sf] = hQMetaData->q_direction[1].band_data[band].elevation[sf]; + hQMetaData->q_direction[1].band_data[band].elevation[sf] = flt_tmp; + + uint8_tmp = hQMetaData->q_direction[0].band_data[band].distance[sf]; + hQMetaData->q_direction[0].band_data[band].distance[sf] = hQMetaData->q_direction[1].band_data[band].distance[sf]; + hQMetaData->q_direction[1].band_data[band].distance[sf] = uint8_tmp; + uint8_tmp = hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf]; hQMetaData->q_direction[0].coherence_band_data[band].spread_coherence[sf] = hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf]; hQMetaData->q_direction[1].coherence_band_data[band].spread_coherence[sf] = uint8_tmp; - } - flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[0]; - hQMetaData->q_direction[0].band_data[band].energy_ratio[0] = hQMetaData->q_direction[1].band_data[band].energy_ratio[0]; - hQMetaData->q_direction[1].band_data[band].energy_ratio[0] = flt_tmp; + + flt_tmp = hQMetaData->q_direction[0].band_data[band].energy_ratio[sf]; + hQMetaData->q_direction[0].band_data[band].energy_ratio[sf] = hQMetaData->q_direction[1].band_data[band].energy_ratio[sf]; + hQMetaData->q_direction[1].band_data[band].energy_ratio[sf] = flt_tmp; + } } } } return; } +#endif /*-------------------------------------------------------------------* @@ -4807,7 +6071,9 @@ static int16_t write_2dir_info( int16_t p[MASA_MAXIMUM_CODING_SUBBANDS]; uint16_t dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; int16_t i, j; + j = 0; + p[0] = 0; for ( i = 0; i < n; i++ ) { if ( twoDirBands[i] == 1 ) @@ -4816,6 +6082,7 @@ static int16_t write_2dir_info( j++; } } + dif_p[0] = p[0]; for ( i = 1; i < j; i++ ) { @@ -4836,6 +6103,12 @@ static int16_t write_2dir_info( } +/*-------------------------------------------------------------------* + * transform_azimuth_dir2() + * + * + *-------------------------------------------------------------------*/ + static void transform_azimuth_dir2( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *dir2_bands ) @@ -4858,6 +6131,14 @@ static void transform_azimuth_dir2( { hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; } + if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] >= 180 ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] -= 360; + } + if ( hQMetaData->q_direction[1].band_data[i].azimuth[b] < -180 ) + { + hQMetaData->q_direction[1].band_data[i].azimuth[b] += 360; + } #ifdef DEBUGGING assert( hQMetaData->q_direction[1].band_data[i].azimuth[b] < 180 && hQMetaData->q_direction[1].band_data[i].azimuth[b] >= -180 ); #endif diff --git a/lib_enc/ivas_qspherical_enc.c b/lib_enc/ivas_qspherical_enc.c index 80a9d0064f..4c79b875b7 100644 --- a/lib_enc/ivas_qspherical_enc.c +++ b/lib_enc/ivas_qspherical_enc.c @@ -59,7 +59,12 @@ static float direction_distance_cp( float theta, float theta_hat, float theta_ha void quantize_direction_frame( IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] ) + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] +#ifdef HR_METADATA + , + const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ +#endif +) { int16_t i, j; int16_t idx; @@ -92,16 +97,36 @@ void quantize_direction_frame( q_direction->not_in_2D += q_direction->band_data[i].elevation_index[j]; - if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) +#ifdef HR_METADATA + if ( hrmasa_flag ) { - q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3]; - q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][q_direction->band_data[i].elevation_index[j]]; + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[0] - 3]; + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[0] - 1][q_direction->band_data[i].elevation_index[j]]; + } + else + { + q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[0] - 3] * 2 - 1; + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[0] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1]; + } } else { - q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3] * 2 - 1; - q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1]; +#endif + if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) + { + q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3]; + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][q_direction->band_data[i].elevation_index[j]]; + } + else + { + q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3] * 2 - 1; + q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1]; + } +#ifdef HR_METADATA } +#endif if ( q_direction->band_data[i].azimuth_index[j] == MASA_NO_INDEX ) { @@ -138,6 +163,7 @@ void quantize_direction_frame( return; } + /*-------------------------------------------------------------------* * quantize_direction_frame2D() * @@ -246,6 +272,7 @@ void small_requantize_direction_frame( return; } + /*-------------------------------------------------------------------* * quantize_direction() * @@ -327,7 +354,6 @@ uint16_t quantize_direction( return idx_sph; } - no_th = no_theta_masa[no_bits - 3]; for ( i = 0; i < no_th; i++ ) @@ -473,20 +499,21 @@ uint16_t quantize_direction( return idx_sph; } + /*-------------------------------------------------------------------* * direction_distance_cp() * * quantization distortion calculated on the sphere *----------------------------------------------------------------------*/ -/* !r: distortion value */ +/*! r: distortion value */ static float direction_distance_cp( - float theta, /* i : elevation absolute value */ - float theta_hat, /* i : quantized elevation value in absolute value */ - float theta_hat1, /* i : quantized elevation value in absolute value */ - const float phi, /* i : azimuth value */ - const float phi_hat, /* i : quantized azimuth value */ - const float phi_hat1, /* i : quantized azimuth value */ + float theta, /* i : elevation absolute value */ + float theta_hat, /* i : quantized elevation value in absolute value */ + float theta_hat1, /* i : quantized elevation value in absolute value */ + const float phi, /* i : azimuth value */ + const float phi_hat, /* i : quantized azimuth value */ + const float phi_hat1, /* i : quantized azimuth value */ float *d1 ) { float d, ct, st, st1, st2; @@ -512,28 +539,27 @@ static float direction_distance_cp( * joint quantization of elevation and azimuth *----------------------------------------------------------------------*/ -/* !r: quantized elevation value */ +/*! r: quantized elevation value */ static float quantize_theta_phi( - float *theta_cb, /* i : elevation codebook */ - const int16_t no_th, /* i : elevation codebook size */ - const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword */ - const float abs_theta, /* i : absolute value of elevation to be quantized */ - int16_t *id_phi, /* o : azimuth index */ - int16_t *id_phi_remap, /* o : remapped azimuth index */ - float *phi_hat, /* o : quantized azimuth value */ - const float phi, /* i : input azimuth value; to be quantized */ - const int16_t no_bits, /* i : number of bits used for quantization */ - int16_t *id_theta, /* o : elevation index */ - float *phi_q, /* o : rotated quantized azimuth */ - const int16_t remap, /* i : flag for remapping */ - const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ + float *theta_cb, /* i : elevation codebook */ + const int16_t no_th, /* i : elevation codebook size */ + const int16_t *no_phi_loc, /* i : number of azimuth values for each elevation codeword*/ + const float abs_theta, /* i : absolute value of elevation to be quantized */ + int16_t *id_phi, /* o : azimuth index */ + int16_t *id_phi_remap, /* o : remapped azimuth index */ + float *phi_hat, /* o : quantized azimuth value */ + const float phi, /* i : input azimuth value; to be quantized */ + const int16_t no_bits, /* i : number of bits used for quantization */ + int16_t *id_theta, /* o : elevation index */ + float *phi_q, /* o : rotated quantized azimuth */ + const int16_t remap, /* i : flag for remapping */ + const MC_LS_SETUP mc_format /* i : channel format if in MC-mode */ ) { float theta_hat, theta_hat1, phi_hat1; int16_t id_th, id_th1, id_th2, id_ph, id_ph1; float d, d1; - id_th = (int16_t) ( abs_theta / delta_theta_masa[no_bits - 3] ); if ( id_th >= no_th ) { @@ -549,7 +575,6 @@ static float quantize_theta_phi( { if ( ( no_th < 6 ) && mc_format == MC_LS_SETUP_INVALID ) { - if ( id_th == 0 ) { id_th1 = 1; diff --git a/lib_enc/ivas_rom_enc.c b/lib_enc/ivas_rom_enc.c index ae7cd2ee1a..4565100883 100644 --- a/lib_enc/ivas_rom_enc.c +++ b/lib_enc/ivas_rom_enc.c @@ -723,4 +723,119 @@ const float Stereo_dmx_wnd_coef_48k[L_FRAME48k] = { }; +const HUFF_TABLE huff_alpha_table[2] = +{ + { /* Alfa Fine */ + { /* df0 */ + { 0x0002ce, 0x000b5e, 0x0004fe, 0x0005ae, 0x00027e, 0x0002de, 0x00016a, 0x0000b2, 0x00004a, 0x00004b, + 0x0000b6, 0x00004e, 0x000024, 0x00002e, 0x00000a, 0x000006, 0x000000, 0x000007, 0x000008, 0x00002f, + 0x000026, 0x000058, 0x0000b4, 0x00009e, 0x00016e, 0x000166, 0x0002df, 0x0002cf, 0x00027c, 0x00027d, + 0x0004ff, 0x000b5f, 0x0002d6 }, + { 10, 12, 11, 11, 10, 10, 9, 8, 7, 7, + 8, 7, 6, 6, 4, 3, 1, 3, 4, 6, + 6, 7, 8, 8, 9, 9, 10, 10, 10, 10, + 11, 12, 10 } + }, + { /* df */ + { 0x0011de, 0x011ffe, 0x013dea, 0x013df6, 0x008eea, 0x013df7, 0x013dee, 0x013deb, 0x013dec, 0x008eee, + 0x008ffe, 0x009efe, 0x0047fe, 0x004f7c, 0x0023fe, 0x0011fe, 0x0013fe, 0x0008f6, 0x0009ee, 0x000476, + 0x00047a, 0x0004f6, 0x00023a, 0x00027a, 0x00027e, 0x00013e, 0x00009a, 0x00004c, 0x00004e, 0x000012, + 0x00000a, 0x000006, 0x000000, 0x000007, 0x00000b, 0x000010, 0x000022, 0x000046, 0x00009b, 0x00013c, + 0x00011c, 0x00023e, 0x00023c, 0x0004fe, 0x00047e, 0x0009fe, 0x0008fe, 0x0008f7, 0x0013ff, 0x0011df, + 0x0027bc, 0x004f7e, 0x004776, 0x009efa, 0x009ef4, 0x013dfe, 0x008eeb, 0x008ee8, 0x013dff, 0x008ee9, + 0x008eef, 0x011fff, 0x013ded, 0x013def, 0x0011dc }, + { 13, 17, 17, 17, 16, 17, 17, 17, 17, 16, + 16, 16, 15, 15, 14, 13, 13, 12, 12, 11, + 11, 11, 10, 10, 10, 9, 8, 7, 7, 5, + 4, 3, 1, 3, 4, 5, 6, 7, 8, 9, + 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, + 14, 15, 15, 16, 16, 17, 16, 16, 17, 16, + 16, 17, 17, 17, 13 } + }, + { /* dt */ + { 0x00eeee, 0x03b3ee, 0x03b3f6, 0x03b3fc, 0x01d9bc, 0x01d9bd, 0x01d9b2, 0x03b3fe, 0x01d9be, 0x01d9f6, + 0x01d9fc, 0x00ecda, 0x00ecfa, 0x00eeef, 0x00766e, 0x007776, 0x003b3a, 0x003bba, 0x001d9a, 0x001ddc, + 0x001dde, 0x000eec, 0x000764, 0x000772, 0x0003b0, 0x0003b8, 0x0001da, 0x0001de, 0x000072, 0x000038, + 0x00001e, 0x000006, 0x000000, 0x000002, 0x00001f, 0x00003a, 0x000073, 0x0001df, 0x0001db, 0x0003ba, + 0x0003b1, 0x000773, 0x000765, 0x000eed, 0x000ecc, 0x001d9e, 0x001d9c, 0x003bbe, 0x003b3b, 0x00777e, + 0x00767c, 0x00eefe, 0x00ecfc, 0x00ecd8, 0x01d9fd, 0x01d9fa, 0x01d9bf, 0x01d9b6, 0x01d9b3, 0x03b3fd, + 0x01d9b7, 0x03b3ff, 0x03b3ef, 0x03b3f7, 0x00eeff }, + { 16, 18, 18, 18, 17, 17, 17, 18, 17, 17, + 17, 16, 16, 16, 15, 15, 14, 14, 13, 13, + 13, 12, 11, 11, 10, 10, 9, 9, 7, 6, + 5, 3, 1, 2, 5, 6, 7, 9, 9, 10, + 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, + 15, 16, 16, 16, 17, 17, 17, 17, 17, 18, + 17, 18, 18, 18, 16 } + } + }, /* End Alfa Fine */ + { /* Alfa Coarse */ + { /* df0 */ + { 0x0003be, 0x0003fe, 0x0001fe, 0x0000fe, 0x00003e, 0x00003a, 0x00001e, 0x000002, 0x000000, 0x000006, + 0x00001c, 0x00007e, 0x000076, 0x0000ee, 0x0001de, 0x0003ff, 0x0003bf }, + { 10, 10, 9, 8, 6, 6, 5, 2, 1, 3, + 5, 7, 7, 8, 9, 10, 10 } + }, + { /* df */ + { 0x007c76, 0x03e3fe, 0x01f1f6, 0x01f1f7, 0x00f8ea, 0x007c74, 0x007c7c, 0x001f1c, 0x000f9e, 0x0007ce, + 0x0003e2, 0x0001f0, 0x0000fa, 0x00007e, 0x00000e, 0x000006, 0x000000, 0x000002, 0x00001e, 0x00007f, + 0x0000fb, 0x0001f2, 0x0003e6, 0x0007c6, 0x000f9f, 0x001f1e, 0x007c7e, 0x00f8fe, 0x00f8fa, 0x01f1fe, + 0x00f8eb, 0x03e3ff, 0x007c77 }, + { 15, 18, 17, 17, 16, 15, 15, 13, 12, 11, + 10, 9, 8, 7, 4, 3, 1, 2, 5, 7, + 8, 9, 10, 11, 12, 13, 15, 16, 16, 17, + 16, 18, 15 } + }, + { /* dt */ + { 0x003efc, 0x00fbfa, 0x007ddc, 0x00fbfe, 0x007dde, 0x007dfc, 0x003ef6, 0x001f76, 0x000fba, 0x000fbe, + 0x0003ec, 0x0001f2, 0x0000f8, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, 0x00000e, 0x00007f, + 0x0000fa, 0x0001f3, 0x0003ed, 0x0007dc, 0x000fbc, 0x001f7a, 0x003ef7, 0x007dfe, 0x007ddf, 0x00fbff, + 0x007ddd, 0x00fbfb, 0x003efd }, + { 14, 16, 15, 16, 15, 15, 14, 13, 12, 12, + 10, 9, 8, 7, 5, 3, 1, 2, 4, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, + 15, 16, 14 } + } + } /* End Alfa Coarse */ +}; + +const HUFF_TABLE huff_beta_table[2] = +{ + { /* Beta Fine */ + { /* df0 */ + { 0x000000, 0x000002, 0x000006, 0x00000e, 0x00001e, 0x00003e, 0x00007e, 0x0000fe, 0x0000ff }, + { 1, 2, 3, 4, 5, 6, 7, 8, 8 } + }, + { /* df */ + { 0x001f1e, 0x000f8e, 0x0003e2, 0x0001f2, 0x0000fa, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, + 0x00000e, 0x00007f, 0x0000fb, 0x0001f3, 0x0001f0, 0x0007c6, 0x001f1f }, + { 13, 12, 10, 9, 8, 7, 5, 3, 1, 2, + 4, 7, 8, 9, 9, 11, 13 } + }, + { /* dt */ + { 0x007dfe, 0x003efe, 0x000fbe, 0x0003ee, 0x0000fa, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, + 0x00000e, 0x00007f, 0x00007c, 0x0001f6, 0x0007de, 0x001f7e, 0x007dff }, + { 15, 14, 12, 10, 8, 7, 5, 3, 1, 2, + 4, 7, 7, 9, 11, 13, 15 } + } + }, /* End Beta Fine */ + { /* Beta Coarse */ + { /* df0 */ + { 0x000000, 0x000002, 0x000006, 0x00000e, 0x00000f }, + { 1, 2, 3, 4, 4 } + }, + { /* df */ + { 0x0000fe, 0x00003e, 0x00000e, 0x000006, 0x000000, 0x000002, 0x00001e, 0x00007e, 0x0000ff }, + { 8, 6, 4, 3, 1, 2, 5, 7, 8 } + }, + { /* dt */ + { 0x0000fe, 0x00007e, 0x00001e, 0x000006, 0x000000, 0x000002, 0x00000e, 0x00003e, 0x0000ff }, + { 8, 7, 5, 3, 1, 2, 4, 6, 8 } + } + } /* End Beta Coarse */ +}; + +const int16_t mc_paramupmix_fb_remix_order[4] = {0, 1, 2, 3}; + + /* clang-format on */ diff --git a/lib_enc/ivas_rom_enc.h b/lib_enc/ivas_rom_enc.h index d240fb6918..c208259ed6 100644 --- a/lib_enc/ivas_rom_enc.h +++ b/lib_enc/ivas_rom_enc.h @@ -126,5 +126,8 @@ extern const float Stereo_dmx_s_wnd_coef_48k[L_FRAME48k >> 4]; extern const float Stereo_dmx_wnd_coef_32k[L_FRAME32k]; extern const float Stereo_dmx_wnd_coef_48k[L_FRAME48k]; +extern const HUFF_TABLE huff_alpha_table[2]; +extern const HUFF_TABLE huff_beta_table[2]; +extern const int16_t mc_paramupmix_fb_remix_order[4]; #endif diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index d3aab0a6e8..e01de98741 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -119,28 +119,31 @@ ivas_error ivas_sba_enc_reconfigure( { DIRAC_ENC_HANDLE hDirAC = st_ivas->hDirAC; SPAR_ENC_HANDLE hSpar; - SBA_MODE sba_mode_old; int16_t analysis_order_old; int16_t spar_reconfig_flag; +#ifdef FIX_DTX_428 + int16_t nbands_old; + int16_t ndir_old; +#endif spar_reconfig_flag = 0; nchan_transport_old = st_ivas->nchan_transport; nCPE_old = st_ivas->nCPE; nSCE_old = st_ivas->nSCE; - sba_mode_old = st_ivas->sba_mode; - st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); - st_ivas->sba_mode = ivas_sba_mode_select( ivas_total_brate ); - analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); +#ifdef FIX_DTX_428 + nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; + ndir_old = st_ivas->hQMetaData->no_directions; +#endif if ( analysis_order_old != st_ivas->sba_analysis_order ) { int16_t i, n_old; float **old_mem_hp20_in; - n_old = ivas_sba_get_nchan_metadata( analysis_order_old ); - n = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order ); + n_old = ( analysis_order_old + 1 ) * ( analysis_order_old + 1 ); + n = ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 ); if ( n > n_old ) { @@ -199,35 +202,19 @@ ivas_error ivas_sba_enc_reconfigure( old_mem_hp20_in = NULL; } } - - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), + &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); +#ifndef SBA_MODE_CLEAN_UP + for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) { - if ( st_ivas->hSpar == NULL ) - { - if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), - &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); - - for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) + if ( hDirAC->sba_synchro_buffer[n] != NULL ) { - if ( hDirAC->sba_synchro_buffer[n] != NULL ) - { - free( hDirAC->sba_synchro_buffer[n] ); - hDirAC->sba_synchro_buffer[n] = NULL; - } + free( hDirAC->sba_synchro_buffer[n] ); + hDirAC->sba_synchro_buffer[n] = NULL; } - hDirAC->num_samples_synchro_delay = 0; } - else - { - ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); - } - + hDirAC->num_samples_synchro_delay = 0; +#endif hSpar = st_ivas->hSpar; if ( st_ivas->nchan_transport == 1 ) @@ -238,78 +225,53 @@ ivas_error ivas_sba_enc_reconfigure( { hEncoderConfig->element_mode_init = IVAS_CPE_MDCT; } - - if ( ( sba_mode_old != st_ivas->sba_mode ) || ( nchan_transport_old != st_ivas->nchan_transport ) ) + if ( nchan_transport_old != st_ivas->nchan_transport || ( ivas_total_brate < IVAS_512k && hEncoderConfig->last_ivas_total_brate >= IVAS_512k ) || ( ivas_total_brate >= IVAS_512k && hEncoderConfig->last_ivas_total_brate < IVAS_512k ) ) { /* FB mixer handle */ - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) + if ( hDirAC->hFbMixer != NULL ) { - if ( hDirAC->hFbMixer != NULL ) - { - ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 ); - hDirAC->hFbMixer = NULL; - } - - if ( sba_mode_old == SBA_MODE_SPAR ) - { - spar_reconfig_flag = 1; - ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); - - if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) - { - return error; - } - } + ivas_FB_mixer_close( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, 0 ); + hDirAC->hFbMixer = NULL; } - else - { - if ( hDirAC->hFbMixer == NULL ) - { - IVAS_FB_CFG *fb_cfg; - - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, DIRAC_MAX_ANA_CHANS, 0, 0, hEncoderConfig->input_Fs ) ) != IVAS_ERR_OK ) - { - return error; - } - - /* Allocate and initialize FB mixer handle */ - if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), hEncoderConfig->input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - } - - if ( hDirAC->num_samples_synchro_delay == 0 ) - { - hDirAC->num_samples_synchro_delay = NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ); + spar_reconfig_flag = 1; + ivas_spar_enc_close( &( st_ivas->hSpar ), hEncoderConfig->input_Fs, hEncoderConfig->nchan_inp, spar_reconfig_flag ); - for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) - { - if ( ( hDirAC->sba_synchro_buffer[n] = (float *) malloc( hDirAC->num_samples_synchro_delay * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hDirAC synchro buffer\n" ) ); - } - set_zero( hDirAC->sba_synchro_buffer[n], hDirAC->num_samples_synchro_delay ); - } - for ( ; n < DIRAC_MAX_ANA_CHANS; n++ ) - { - hDirAC->sba_synchro_buffer[n] = NULL; - } - } + if ( ( error = ivas_spar_enc_open( st_ivas, spar_reconfig_flag ) ) != IVAS_ERR_OK ) + { + return error; } } - +#ifndef SBA_MODE_CLEAN_UP + hEncoderConfig->spar_reconfig_flag = spar_reconfig_flag; +#else + st_ivas->hSpar->spar_reconfig_flag = spar_reconfig_flag; +#endif if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) { return error; } - - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#ifdef FIX_DTX_428 + if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old ) { - mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); - hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; + int16_t dir, j, i; + IVAS_QDIRECTION *q_direction = st_ivas->hQMetaData->q_direction; + for ( dir = 0; dir < st_ivas->hQMetaData->no_directions; dir++ ) + { + for ( j = 0; j < q_direction[dir].cfg.nbands; j++ ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + q_direction[dir].band_data[j].energy_ratio_index[i] = 0; + q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; + } + } + } } - +#endif +#ifndef SBA_MODE_CLEAN_UP + mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); +#endif + hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; /*-----------------------------------------------------------------* * Allocate, initialize, and configure SCE/CPE/MCT handles *-----------------------------------------------------------------*/ @@ -322,3 +284,30 @@ ivas_error ivas_sba_enc_reconfigure( return error; } + +#ifdef ARITH_HUFF_CODER_CHANGES +int16_t ivas_sba_get_max_md_bits( + Encoder_Struct *st_ivas ) +{ + int16_t max_md_bits; + int16_t max_bits; + if ( ivas_get_hodirac_flag( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) ) + { + max_bits = 2000; + } + else + { + max_bits = 500; + } + max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, max_bits ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) +#endif + { + max_md_bits += st_ivas->hSpar->hMdEnc->spar_md_cfg.max_md_bits_spar; + } + return max_md_bits; +} +#endif diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index c8577a85ba..87c0e8e9d3 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -205,8 +205,12 @@ ivas_error ivas_sce_enc( * Reset metadata *----------------------------------------------------------------*/ +#ifndef SBA_MODE_CLEAN_UP reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata, st_ivas->sba_mode ); +#else + reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata ); +#endif /*----------------------------------------------------------------* * Write IVAS format signaling in SID frames *----------------------------------------------------------------*/ @@ -312,6 +316,14 @@ ivas_error create_sce_enc( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MetaData structure\n" ) ); } + +#ifdef IND_LIST_DYN + /* set pointer to the buffer of metadata indices */ + hSCE->hMetaData->ind_list = st_ivas->ind_list_metadata; + hSCE->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + hSCE->hMetaData->ivas_max_num_indices = &st_ivas->ivas_max_num_indices_metadata; + reset_indices_enc( hSCE->hMetaData, st_ivas->ivas_max_num_indices_metadata ); +#endif } else { @@ -332,7 +344,11 @@ ivas_error create_sce_enc( st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; - if ( ( error = init_encoder( st, 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( st, +#ifdef IND_LIST_DYN + st_ivas, +#endif + 0, st_ivas->hEncoderConfig->var_SID_rate_flag, st_ivas->hEncoderConfig->interval_SID, 0, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_enc/ivas_sns_enc.c b/lib_enc/ivas_sns_enc.c index 762b0aeb0f..5197a260b9 100644 --- a/lib_enc/ivas_sns_enc.c +++ b/lib_enc/ivas_sns_enc.c @@ -38,10 +38,8 @@ #include "prot.h" #include "ivas_prot.h" #include "rom_com.h" -#ifdef SNS_MSVQ #include "ivas_rom_com.h" #include "ivas_cnst.h" -#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -57,78 +55,89 @@ /* r : codebook index */ static int16_t sns_1st_cod( const float *sns, /* i : vector to quantize */ - float *snsq /* i/o: i:prediction o:quantized sns */ + const int16_t L_frame, + const int16_t core, + float *snsq /* o : quantized sns */ ) { - int16_t i, j, index; - int16_t j0, j1, index0, index1; - float dist_min, dist, temp; - const float *p_dico; - - j0 = 0; - j1 = M / 2; - dist_min = 1.0e30f; - p_dico = sns_vq_cdk1; - index0 = 0; - - for ( i = 0; i < 32; i++ ) + int16_t index; + const int16_t split_len = M / 2; + const int16_t *means; + const float means_fix2float = 1.f / powf( 2, SNS_MEANS_BITS_4_FRAC ); + + /* remove means */ + means = NULL; + switch ( L_frame ) { - dist = 0.0; - - for ( j = j0; j < j1; j++ ) - { - temp = sns[j] - *p_dico++; - dist += temp * temp; - } - - if ( dist < dist_min ) - { - dist_min = dist; - index0 = i; - } + case L_FRAME16k: + means = &sns_1st_means_16k[core - 1][0]; + break; + case L_FRAME25_6k: + means = &sns_1st_means_25k6[core - 1][0]; + break; + case L_FRAME32k: + means = &sns_1st_means_32k[core - 1][0]; + break; + default: + assert( !"illegal frame length in sns_1st_cod" ); } - /* quantized vector */ - p_dico = &sns_vq_cdk1[index0 * ( M / 2 )]; - - for ( j = j0; j < j1; j++ ) + for ( int16_t i = 0; i < M; ++i ) { - snsq[j] = *p_dico++; /* += cause it's differential */ + snsq[i] = sns[i] - means[i] * means_fix2float; } - j0 = M / 2; - j1 = M; - dist_min = 1.0e30f; - p_dico = sns_vq_cdk2; - index1 = 0; - - for ( i = 0; i < 32; i++ ) + index = 0; + for ( int16_t split = 0; split < 2; ++split ) { - dist = 0.0; - - for ( j = j0; j < j1; j++ ) + const int16_t *cdbk_ptr; + int16_t j0, j1, index_split; + float dist_min; + const float cdbk_fix2float = 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ); + const int16_t *const cdbk = &sns_1st_cdbk[split][core - 1][0]; + + j0 = split * split_len; + j1 = j0 + split_len; + + cdbk_ptr = cdbk; + dist_min = 1.0e30f; + index_split = 0; + for ( int16_t i = 0; i < 32; ++i ) { - temp = sns[j] - *p_dico++; - dist += temp * temp; + float dist; + + dist = 0.f; + for ( int16_t j = j0; j < j1; ++j ) + { + float tmp; + + tmp = snsq[j] - ( *cdbk_ptr++ ) * cdbk_fix2float; + dist += tmp * tmp; + } + + if ( dist < dist_min ) + { + dist_min = dist; + index_split = i; + } } - if ( dist < dist_min ) + /* set quantized vector */ + cdbk_ptr = &cdbk[index_split * split_len]; + for ( int16_t j = j0; j < j1; ++j ) { - dist_min = dist; - index1 = i; + snsq[j] = ( *cdbk_ptr++ ) * cdbk_fix2float + means[j] * means_fix2float; } - } - /* quantized vector */ - p_dico = &sns_vq_cdk2[index1 * ( M / 2 )]; + /* for second split shift by five bits to store both indices as one 10 bit value */ + if ( split == 1 ) + { + index_split <<= 5; + } - for ( j = j0; j < j1; j++ ) - { - snsq[j] = *p_dico++; /* += cause it's differential */ + index += index_split; } - index = index0 + ( index1 << 5 ); - return index; } @@ -197,12 +206,13 @@ static int16_t sns_2st_cod( *-------------------------------------------------------------------*/ void sns_avq_cod( - const float *sns, /* i : Input sns vectors */ - const float *snsmid, /* i : Input mid-sns vectors */ - float *sns_q, /* o : Quantized LFS vectors */ - float *snsmid_q, /* o : Quantized mid-LFS vectors */ - int16_t *index, /* o : Quantization indices */ - const int16_t core, /* i : core */ + const float *sns, /* i : Input sns vectors */ + const float *snsmid, /* i : Input mid-sns vectors */ + float *sns_q, /* o : Quantized LFS vectors */ + float *snsmid_q, /* o : Quantized mid-LFS vectors */ + int16_t *index, /* o : Quantization indices */ + const int16_t core, /* i : core */ + const int16_t L_frame, const int16_t low_brate_mode /* i : flag low bit operating mode */ ) { @@ -210,7 +220,7 @@ void sns_avq_cod( float snsmid_q0[M]; int16_t indxt[256], nbits, nbt, nit; - index[0] = sns_1st_cod( sns, sns_q ); + index[0] = sns_1st_cod( sns, L_frame, core, sns_q ); nit = 1 + 2; if ( !low_brate_mode ) { @@ -231,7 +241,7 @@ void sns_avq_cod( { index++; - index[0] = sns_1st_cod( snsmid, snsmid_q ); + index[0] = sns_1st_cod( snsmid, L_frame, core, snsmid_q ); nit = 1 + 2; if ( !low_brate_mode ) { @@ -288,10 +298,11 @@ void sns_avq_cod( void sns_avq_cod_stereo( const float *snsl, /* i : Input sns vector (left channel) */ const float *snsr, /* i : Input sns vector (right channel) */ - float *snsl_q, /* o : Quantized sns vector (left channel) */ - float *snsr_q, /* o : Quantized sns vector (right channel) */ - int16_t *indexl, /* o : Quantization indices (left channel) */ - int16_t *indexr /* o : Quantization indices (right channel) */ + const int16_t L_frame, + float *snsl_q, /* o : Quantized sns vector (left channel) */ + float *snsr_q, /* o : Quantized sns vector (right channel) */ + int16_t *indexl, /* o : Quantization indices (left channel) */ + int16_t *indexr /* o : Quantization indices (right channel) */ ) { int16_t i, flag_zero; @@ -331,7 +342,7 @@ void sns_avq_cod_stereo( } /* Quantize mid */ - indexl[0] = sns_1st_cod( mid, mid_q ); + indexl[0] = sns_1st_cod( mid, L_frame, TCX_20_CORE, mid_q ); sns_2st_cod( mid, mid_q, &indexl[1] ); /* Quantize side */ @@ -371,18 +382,17 @@ void sns_avq_cod_stereo( *indexr++ = 1; /* Quantize left */ - indexl[0] = sns_1st_cod( snsl, snsl_q ); + indexl[0] = sns_1st_cod( snsl, L_frame, TCX_20_CORE, snsl_q ); sns_2st_cod( snsl, snsl_q, &indexl[1] ); /* Quantize right */ - indexr[0] = sns_1st_cod( snsr, snsr_q ); + indexr[0] = sns_1st_cod( snsr, L_frame, TCX_20_CORE, snsr_q ); sns_2st_cod( snsr, snsr_q, &indexr[1] ); } return; } -#ifdef SNS_MSVQ int16_t quantize_sns( float sns_in[CPE_CHANNELS][NB_DIV][M], float snsQ_out[CPE_CHANNELS][NB_DIV][M], @@ -395,8 +405,6 @@ int16_t quantize_sns( int16_t nbits, idxIndices; Encoder_State *st; float weights[M]; - const float *means; - float sns_buffer[CPE_CHANNELS][NB_DIV][M]; nbits = 0; idxIndices = 0; @@ -407,47 +415,50 @@ int16_t quantize_sns( sns_stereo_mode[1] = SNS_STEREO_MODE_LR; zero_side_flag[0] = 0; zero_side_flag[1] = 0; + + /* use snsQ_out as buffer, move input vectors */ + for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + { + nSubframes = ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; ++k ) + { + mvr2r( sns_in[ch][k], snsQ_out[ch][k], M ); + } + } + if ( sts[0]->core == sts[1]->core ) { nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; for ( k = 0; k < nSubframes; ++k ) { - float *side; + float side[M]; float ener_side; - side = &sns_buffer[1][k][0]; - v_sub( sns_in[0][k], sns_in[1][k], side, M ); + v_sub( snsQ_out[0][k], snsQ_out[1][k], side, M ); ener_side = dotp( side, side, M ); sns_stereo_mode[k] = ener_side < 12.f; zero_side_flag[k] = ener_side < 1.f; + + if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) + { + convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f ); + } } } /* prepare buffers depending on the chosen stereo mode */ - /* remove means of L/R SNS parameters */ - for ( ch = 0; ch < CPE_CHANNELS; ++ch ) - { - st = sts[ch]; - nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; - for ( k = 0; k < nSubframes; ++k ) - { - v_sub( sns_in[ch][k], means, sns_buffer[ch][k], M ); - } - } - if ( sns_stereo_mode[0] == SNS_STEREO_MODE_MS || sns_stereo_mode[1] == SNS_STEREO_MODE_MS ) + nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + for ( k = 0; k < nSubframes; ++k ) { - nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; - for ( k = 0; k < nSubframes; ++k ) + mvr2r( sns_in[0][k], snsQ_out[0][k], M ); + mvr2r( sns_in[1][k], snsQ_out[1][k], M ); + if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) { - if ( sns_stereo_mode[k] == SNS_STEREO_MODE_MS ) - { - convertToMS( M, sns_buffer[0][k], sns_buffer[1][k], 0.5f ); - } + convertToMS( M, snsQ_out[0][k], snsQ_out[1][k], 0.5f ); } } @@ -464,7 +475,7 @@ int16_t quantize_sns( const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); float *snsQ = snsQ_out[ch][k]; - const float *sns_ptr = sns_buffer[ch][k]; + const float *sns_ptr = snsQ_out[ch][k]; if ( is_side ) { @@ -479,27 +490,13 @@ int16_t quantize_sns( nStages = SNS_MSVQ_NSTAGES_SIDE; bits = ( st->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_side_tcx20 : ivas_sns_means_side_tcx10; - - v_sub( sns_ptr, means, snsQ, M ); -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_enc( side_cdbks, NULL, NULL, snsQ, side_levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] ); msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL ); -#else - msvq_enc( side_cdbks, NULL, NULL, snsQ, side_levels, 3, nStages, weights, M, M, &indices[idxIndices] ); - msvq_dec( side_cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], snsQ, NULL ); -#endif - v_add( snsQ, means, snsQ, M ); } else { -#ifdef ERI_FDCNGVQ_LOW_ROM msvq_enc( cdbks, NULL, NULL, sns_ptr, levels, 3, nStages, weights, M, M, 0, NULL, &indices[idxIndices] ); msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], 0, NULL, snsQ, NULL ); -#else - msvq_enc( cdbks, NULL, NULL, sns_ptr, levels, 3, nStages, weights, M, M, &indices[idxIndices] ); - msvq_dec( cdbks, NULL, NULL, nStages, M, M, &indices[idxIndices], snsQ, NULL ); -#endif } idxIndices += nStages; @@ -522,18 +519,6 @@ int16_t quantize_sns( } } - /* add means back */ - for ( ch = 0; ch < CPE_CHANNELS; ++ch ) - { - st = sts[ch]; - nSubframes = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; - means = ( st->core == TCX_20_CORE ) ? ivas_sns_means_tcx20 : ivas_sns_means_tcx10; - for ( k = 0; k < nSubframes; ++k ) - { - v_add( snsQ_out[ch][k], means, snsQ_out[ch][k], M ); - } - } return nbits; } -#endif // SNS_MSVQ diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index c659979d2b..5956ef03dd 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -66,6 +66,7 @@ ivas_error ivas_spar_enc_open( ENCODER_CONFIG_HANDLE hEncoderConfig; IVAS_FB_CFG *fb_cfg; int16_t nchan_inp, nchan_transport, sba_order_internal; + int16_t nchan_fb_in; int16_t table_idx, active_w_mixing; int32_t input_Fs, ivas_total_brate; ivas_error error; @@ -83,12 +84,34 @@ ivas_error ivas_spar_enc_open( } } +#ifdef SBA_MODE_CLEAN_UP + hSpar->spar_reconfig_flag = 0; +#endif input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal, + hEncoderConfig->ivas_total_brate ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); ivas_total_brate = hEncoderConfig->ivas_total_brate; + nchan_fb_in = 0; + if ( st_ivas->sba_analysis_order == 1 ) + { + nchan_fb_in = FOA_CHANNELS; + } + else if ( st_ivas->sba_analysis_order == 2 ) + { + nchan_fb_in = 9; + } + else if ( st_ivas->sba_analysis_order == 3 ) + { + nchan_fb_in = 11; + } + else + { + assert( 0 && "sba_order must be 1,2, or 3!" ); + } + nchan_transport = ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, sba_order_internal ); // bw = ivas_get_bw_idx_from_sample_rate(pCfg->input_Fs); @@ -103,7 +126,13 @@ ivas_error ivas_spar_enc_open( /* set FB config. */ active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; - ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs ); +#ifndef SBA_MODE_CLEAN_UP + ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs, + nchan_fb_in ); +#else + ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, nchan_inp, nchan_transport, active_w_mixing, input_Fs, + nchan_fb_in ); +#endif fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; /* FB mixer handle */ @@ -113,7 +142,11 @@ ivas_error ivas_spar_enc_open( } /* Covariance handle */ - if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp ) ) != IVAS_ERR_OK ) +#ifdef FIX_489_COV_SMOOTHING + if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -202,7 +235,11 @@ ivas_error ivas_spar_enc_open( hSpar->hCoreCoderVAD->total_brate = hEncoderConfig->ivas_total_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ hSpar->hCoreCoderVAD->mct_chan_mode = MCT_CHAN_MODE_IGNORE; - if ( ( error = init_encoder( hSpar->hCoreCoderVAD, 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) + if ( ( error = init_encoder( hSpar->hCoreCoderVAD, +#ifdef IND_LIST_DYN + st_ivas, +#endif + 0, hEncoderConfig->var_SID_rate_flag, hEncoderConfig->interval_SID, 1, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) { return error; } @@ -316,10 +353,9 @@ ivas_error ivas_spar_enc( error = IVAS_ERR_OK; hEncoderConfig = st_ivas->hEncoderConfig; - // VE2DB: can hFbMixer->ppFilterbank_prior_input be replaced by st->input ? - /* check last sba_mode */ - if ( ivas_sba_mode_select( st_ivas->hEncoderConfig->last_ivas_total_brate ) == SBA_MODE_DIRAC ) +#ifndef SBA_MODE_CLEAN_UP + if ( ivas_sba_mode_select() == SBA_MODE_DIRAC ) { Encoder_State *sts[MCT_MAX_BLOCKS]; @@ -339,13 +375,13 @@ ivas_error ivas_spar_enc( } /* update FB prior input */ - // VE: last 1ms of 'ppFilterbank_prior_input' is not correct for ( int16_t i = 0; i < st_ivas->nchan_transport; i++ ) { mvr2r( ( sts[i]->input_buff + NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ) ), ( st_ivas->hSpar->hFbMixer->ppFilterbank_prior_input[i] + st_ivas->hSpar->hFbMixer->fb_cfg->prior_input_length - input_frame ), input_frame ); } } +#endif /* front VAD */ if ( ( error = front_vad_spar( st_ivas->hSpar, data_f[0], hEncoderConfig, input_frame ) ) != IVAS_ERR_OK ) @@ -389,10 +425,11 @@ static ivas_error ivas_spar_enc_process( float data_f[][L_FRAME48k] /* i/o: input/transport audio channels */ ) { - float pcm_tmp[IVAS_SPAR_MAX_CH][L_FRAME48k * 2]; - float *p_pcm_tmp[IVAS_SPAR_MAX_CH]; + float pcm_tmp[DIRAC_MAX_ANA_CHANS][L_FRAME48k * 2]; + float *p_pcm_tmp[DIRAC_MAX_ANA_CHANS]; int16_t i, j, b, i_ts, input_frame, dtx_vad; int16_t transient_det[2]; + int16_t hodirac_flag; int32_t ivas_total_brate, input_Fs; float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; @@ -403,14 +440,32 @@ static ivas_error ivas_spar_enc_process( const int16_t *order; SPAR_ENC_HANDLE hSpar = st_ivas->hSpar; IVAS_QMETADATA_HANDLE hQMetaData = st_ivas->hQMetaData; +#ifndef SBA_MODE_CLEAN_UP int16_t ts, l_ts, orig_dirac_bands, num_del_samples; +#else + int16_t ts, l_ts, num_del_samples; +#endif + float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH]; - float w_del_buf[IVAS_FB_1MS_48K_SAMP]; + float wyzx_del_buf[FOA_CHANNELS][IVAS_FB_1MS_48K_SAMP]; +#ifndef SBA_MODE_CLEAN_UP float dir[3], avg_dir[3]; float energySum, vecLen; +#endif + int16_t nchan_fb_in; +#ifdef ARITH_HUFF_CODER_CHANGES + /*Commented for now*/ + /*int16_t start_nb_bits; + int16_t total_md_bits, total_sba_bits;*/ +#endif push_wmops( "ivas_spar_enc_process" ); +#ifdef ARITH_HUFF_CODER_CHANGES + /*Commented for now*/ + // start_nb_bits = hMetaData->nb_bits_tot; +#endif + /*-----------------------------------------------------------------------------------------* * Initialization *-----------------------------------------------------------------------------------------*/ @@ -423,10 +478,17 @@ static ivas_error ivas_spar_enc_process( input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - nchan_inp = ivas_sba_get_nchan_metadata( sba_order ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order, + hEncoderConfig->ivas_total_brate ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); - for ( i = FOA_CHANNELS + 1; i < nchan_inp; i++ ) + int16_t active_w_vlbr; + active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; + + nchan_fb_in = hSpar->hFbMixer->fb_cfg->nchan_fb_in; + nchan_transport = st_ivas->nchan_transport; + + for ( i = FOA_CHANNELS + 1; i < nchan_fb_in; i++ ) { mvr2r( data_f[HOA_keep_ind[i]], data_f[i], input_frame ); } @@ -436,29 +498,37 @@ static ivas_error ivas_spar_enc_process( *-----------------------------------------------------------------------------------------*/ ivas_transient_det_process( hSpar->hTranDet, data_f[0], input_frame, transient_det ); - if ( sba_order == 1 ) + if ( ivas_total_brate < IVAS_24k4 ) { - transient_det[1] = transient_det[0]; + transient_det[1] = 0; } - /* store previous input samples for W in local buffer */ assert( num_del_samples <= IVAS_FB_1MS_48K_SAMP ); - mvr2r( &hSpar->hFbMixer->ppFilterbank_prior_input[0][hSpar->hFbMixer->fb_cfg->prior_input_length - num_del_samples], w_del_buf, num_del_samples ); + if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) + { + /* fill delay (1 ms) buffer for all Transport channels */ + for ( i = 0; i < hSpar->hFbMixer->fb_cfg->num_out_chans; i++ ) + { + int idx = hSpar->hFbMixer->fb_cfg->remix_order[i]; + mvr2r( &hSpar->hFbMixer->ppFilterbank_prior_input[idx][hSpar->hFbMixer->fb_cfg->prior_input_length - num_del_samples], wyzx_del_buf[idx], num_del_samples ); + } + } /*-----------------------------------------------------------------------------------------* * FB mixer ingest *-----------------------------------------------------------------------------------------*/ - for ( i = 0; i < nchan_inp; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) { p_pcm_tmp[i] = pcm_tmp[i]; } /* run Filter Bank overlapping MDFT analysis first, then we can use the temporary buffer for Parameter MDFT analysis*/ - ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame ); + ivas_fb_mixer_pcm_ingest( hSpar->hFbMixer, data_f, p_pcm_tmp, input_frame, + hSpar->hMdEnc->HOA_md_ind ); /* prepare Parameter MDFT analysis */ - for ( i = 0; i < nchan_inp; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) { ppIn_FR_real[i] = p_pcm_tmp[i]; ppIn_FR_imag[i] = p_pcm_tmp[i] + input_frame; @@ -469,10 +539,13 @@ static ivas_error ivas_spar_enc_process( for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) { - ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts ); - ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts ); + ivas_fb_mixer_get_windowed_fr( hSpar->hFbMixer, p_pcm_tmp, ppIn_FR_real, ppIn_FR_imag, l_ts, l_ts, + nchan_fb_in ); + + ivas_fb_mixer_update_prior_input( hSpar->hFbMixer, p_pcm_tmp, l_ts, + nchan_fb_in ); - for ( i = 0; i < nchan_inp; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) { p_pcm_tmp[i] += l_ts; ppIn_FR_real[i] += l_ts; @@ -481,7 +554,7 @@ static ivas_error ivas_spar_enc_process( } /* turn pointers back to the local buffer, needed for the following processing */ - for ( i = 0; i < nchan_inp; i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) { ppIn_FR_real[i] = pcm_tmp[i]; ppIn_FR_imag[i] = pcm_tmp[i] + input_frame; @@ -494,7 +567,10 @@ static ivas_error ivas_spar_enc_process( * DirAC encoding *-----------------------------------------------------------------------------------------*/ - ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode ); + hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); + +#ifndef SBA_MODE_CLEAN_UP + ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode, hodirac_flag, hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS ); if ( hQMetaData->q_direction->cfg.nbands > 0 ) { @@ -504,14 +580,15 @@ static ivas_error ivas_spar_enc_process( { /* WB 4TC mode bit : disable for now*/ push_next_indice( hMetaData, 0, 1 ); - ivas_qmetadata_enc_encode( hMetaData, hQMetaData ); + + ivas_qmetadata_enc_encode( hMetaData, hQMetaData, hodirac_flag ); } else { hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; /* compute directions */ - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) { set_zero( dir, 3 ); set_zero( avg_dir, 3 ); @@ -577,6 +654,9 @@ static ivas_error ivas_spar_enc_process( hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; } } +#else + ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag ); +#endif /*-----------------------------------------------------------------------------------------* * Set SPAR bitrates *-----------------------------------------------------------------------------------------*/ @@ -586,7 +666,11 @@ static ivas_error ivas_spar_enc_process( if ( hSpar->hMdEnc->table_idx != table_idx ) { hSpar->hMdEnc->table_idx = table_idx; - if ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) +#ifndef SBA_MODE_CLEAN_UP + if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hEncoderConfig->spar_reconfig_flag ) ) +#else + if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hSpar->spar_reconfig_flag ) ) +#endif { if ( ( error = ivas_spar_md_enc_init( hSpar->hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK ) { @@ -595,7 +679,15 @@ static ivas_error ivas_spar_enc_process( } else { - ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND ); + ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, + ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND +#ifdef ARITH_HUFF_CODER_CHANGES + , + hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, + 1, hEncoderConfig->Opt_PCA_ON, + hSpar->AGC_Enable +#endif + ); } } /*-----------------------------------------------------------------------------------------* @@ -611,7 +703,19 @@ static ivas_error ivas_spar_enc_process( } } - ivas_enc_cov_handler_process( hSpar->hCovEnc, ppIn_FR_real, ppIn_FR_imag, cov_real, cov_dtx_real, hSpar->hFbMixer->pFb, 0, hSpar->hFbMixer->pFb->filterbank_num_bands, nchan_inp, dtx_vad, transient_det ); + ivas_enc_cov_handler_process( + hSpar->hCovEnc, + ppIn_FR_real, + ppIn_FR_imag, + cov_real, + cov_dtx_real, + hSpar->hFbMixer->pFb, + 0, + hSpar->hFbMixer->pFb->filterbank_num_bands, + nchan_inp, + dtx_vad, + transient_det, + hSpar->hMdEnc->HOA_md_ind ); nchan_transport = st_ivas->nchan_transport; /*-----------------------------------------------------------------------------------------* @@ -620,9 +724,10 @@ static ivas_error ivas_spar_enc_process( if ( hSpar->hMdEnc->spar_hoa_md_flag == 0 ) { - ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order ); + ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order, + hSpar->hFbMixer->prior_mixer ); } - + if ( hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag ) { float azi_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; float ele_dirac[IVAS_MAX_NUM_BANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -639,8 +744,8 @@ static ivas_error ivas_spar_enc_process( dirac_band_idx = hSpar->dirac_to_spar_md_bands[b] - d_start_band; for ( i_ts = 0; i_ts < hQMetaData->q_direction->cfg.nblocks; i_ts++ ) { - azi_dirac[b][i_ts] = hQMetaData->q_direction->band_data[dirac_band_idx].azimuth[i_ts]; - ele_dirac[b][i_ts] = hQMetaData->q_direction->band_data[dirac_band_idx].elevation[i_ts]; + azi_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].azimuth[i_ts]; + ele_dirac[b][i_ts] = hQMetaData->q_direction[0].band_data[dirac_band_idx].elevation[i_ts]; } diffuseness[b] = 1.0f - hQMetaData->q_direction->band_data[dirac_band_idx].energy_ratio[0]; } @@ -662,14 +767,80 @@ static ivas_error ivas_spar_enc_process( Wscale_d[b] = min( 2.0f, max( Wscale_d[b], 1.0f ) ); } - ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, hSpar->hMdEnc->mixer_mat, &hSpar->hMdEnc->spar_md, &hSpar->hMdEnc->spar_md_cfg, d_start_band, d_end_band, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d ); + ivas_get_spar_md_from_dirac( azi_dirac, ele_dirac, diffuseness, 1, hSpar->hMdEnc->mixer_mat, &hSpar->hMdEnc->spar_md, &hSpar->hMdEnc->spar_md_cfg, d_start_band, d_end_band, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? 1 : sba_order, dtx_vad, Wscale_d, + hQMetaData->useLowerRes, active_w_vlbr ); } if ( hSpar->hMdEnc->spar_hoa_md_flag ) { - ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order ); + ivas_spar_md_enc_process( hSpar->hMdEnc, hEncoderConfig, cov_real, cov_dtx_real, hMetaData, dtx_vad, nchan_inp, sba_order, + hSpar->hFbMixer->prior_mixer ); } - +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR Coefficients */ + char f_name[100]; + int16_t nbands = 6; + int16_t num_subframes = 1; + int16_t num_elements = 6; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_re[2], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif +#ifdef DEBUG_LBR_SBA + /* Dumping SPAR Coefficients */ + nbands = 6; + num_subframes = 1; + num_elements = 6; + num_block_group = 1; + byte_size = sizeof( float ); + + sprintf( f_name, "SBA_MD_values_quant.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].pred_quant_re[2], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_quant_re[0], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_quant_re[1], byte_size, 1, 1, f_name ); + dbgwrite( &hSpar->hMdEnc->spar_md.band_coeffs[b].P_quant_re[2], byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif /*-----------------------------------------------------------------------------------------* * FB mixer *-----------------------------------------------------------------------------------------*/ @@ -718,14 +889,44 @@ static ivas_error ivas_spar_enc_process( #ifdef DEBUG_SBA_AUDIO_DUMP ivas_spar_dump_signal_wav( input_frame, p_pcm_tmp, NULL, nchan_transport, spar_foa_enc_wav[1], "ivas_fb_mixer_process()" ); #endif - - /* move delayed W into output buffer unless activeW operation*/ if ( hSpar->hFbMixer->fb_cfg->active_w_mixing == 0 ) { - mvr2r( w_del_buf, p_pcm_tmp[0], num_del_samples ); + /* delayed W */ + mvr2r( wyzx_del_buf[0], p_pcm_tmp[0], num_del_samples ); mvr2r( data_f[0], p_pcm_tmp[0] + num_del_samples, input_frame - num_del_samples ); - } + for ( i = 1; i < hSpar->hFbMixer->fb_cfg->num_out_chans; i++ ) + { + int idx = hSpar->hFbMixer->fb_cfg->remix_order[i]; + + /* delayed, reorderd and accumulated with (negative) prediction from W */ + v_add( wyzx_del_buf[idx], p_pcm_tmp[i], p_pcm_tmp[i], num_del_samples ); + v_add( data_f[idx], p_pcm_tmp[i] + num_del_samples, p_pcm_tmp[i] + num_del_samples, input_frame - num_del_samples ); + } + } +#if 0 /* SBA_TD_RESIDUAL */ + { + static FILE *fid = 0; + static int samplesWritten = 0; + int s; + if (!fid) + { + fid = fopen("enc_pcm.txt", "wt"); + } + if (samplesWritten < 8 * 48000) + { + for (s = 0; s < input_frame; s++) + { + for (i = 0; i < hSpar->hFbMixer->fb_cfg->num_out_chans; i++) + { + fprintf(fid, "%.8f ", p_pcm_tmp[i][s]); + } + fprintf(fid, "\n"); + } + samplesWritten += input_frame; + } + } +#endif /*-----------------------------------------------------------------------------------------* * PCA encoder *-----------------------------------------------------------------------------------------*/ @@ -742,7 +943,16 @@ static ivas_error ivas_spar_enc_process( push_next_indice( hMetaData, PCA_MODE_INACTIVE, 1 ); } } - +#ifdef DEBUG_LBR_SBA + for ( int t = 0; t < 960; t++ ) + { + for ( int c = 0; c < hSpar->hFbMixer->fb_cfg->num_out_chans; c++ ) + { + float val = p_pcm_tmp[c][t]; // / MAX16B_FLT; + dbgwrite( &val, sizeof( float ), 1, 1, "int_enc_dmx.raw" ); + } + } +#endif #ifdef DEBUG_SBA_AUDIO_DUMP ivas_spar_dump_signal_wav( input_frame, p_pcm_tmp, NULL, nchan_transport, spar_foa_enc_wav[0], "ivas_pca_enc()" ); #endif @@ -838,5 +1048,12 @@ static ivas_error ivas_spar_enc_process( pop_wmops(); +#ifdef ARITH_HUFF_CODER_CHANGES + /*Commented for now*/ + /*total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; + total_sba_bits = ivas_sba_get_max_md_bits( st_ivas ); + assert( total_md_bits <= total_sba_bits );*/ +#endif + return error; } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 645f690ac0..50ef2f0348 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -42,7 +42,6 @@ #include #include "wmc_auto.h" - /*------------------------------------------------------------------------------------------* * PreProcessor *------------------------------------------------------------------------------------------*/ @@ -72,15 +71,22 @@ static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], static void ivas_get_band_differential_index( ivas_band_coeffs_ind_t *pBand_idx, const int16_t q_levels[2], const int16_t one_sided, const int16_t nB, const int16_t complex_cov, const int16_t dim, const ivas_coeffs_type_t coeff_type ); -static void ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP ); - -static void ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP ); +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t bands_bw ); +#else +static void ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t bands_bw ); +#endif +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); +#else +static void ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); +#endif static ivas_error ivas_spar_set_enc_config( ivas_spar_md_enc_state_t *hMdEnc, int16_t *max_freq_per_chan, const int16_t nchan_transport, float *pFC, const int16_t nchan_inp ); static void ivas_select_next_strat( ivas_strats_t prior_strat, ivas_strats_t cs[MAX_QUANT_STRATS], const int16_t dmx_switch, const int16_t dtx_vad ); -static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t bands_bw, const int16_t strat, const int16_t dtx_vad, const int16_t qsi ); +static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t strat, const int16_t dtx_vad, const int16_t qsi ); static void ivas_write_spar_md_bitstream( ivas_spar_md_enc_state_t *hMdEnc, const int16_t nB, const int16_t bands_bw, BSTR_ENC_HANDLE hMetaData, const int32_t ivas_total_brate, const int16_t strat, const int16_t qsi, const int16_t planarCP ); static void ivas_spar_quant_pred_coeffs_dtx( ivas_spar_md_t *pSpar_md, const float *pValues, const int16_t ndm, int16_t *pIndex, const int16_t dim1, float *pQuant ); @@ -111,7 +117,6 @@ ivas_error ivas_spar_md_enc_open( ivas_spar_md_enc_state_t *hMdEnc; ivas_error error; int16_t num_channels, i, j; - error = IVAS_ERR_OK; if ( ( hMdEnc = (ivas_spar_md_enc_state_t *) malloc( sizeof( ivas_spar_md_enc_state_t ) ) ) == NULL ) @@ -119,7 +124,8 @@ ivas_error ivas_spar_md_enc_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder" ); } - num_channels = ivas_sba_get_nchan_metadata( sba_order ); + num_channels = ivas_sba_get_nchan_metadata( sba_order, + hEncoderConfig->ivas_total_brate ); if ( ( hMdEnc->spar_md.band_coeffs = (ivas_band_coeffs_t *) malloc( IVAS_MAX_NUM_BANDS * sizeof( ivas_band_coeffs_t ) ) ) == NULL ) { @@ -314,12 +320,26 @@ ivas_error ivas_spar_md_enc_init( float PR_minmax[2]; int16_t num_channels, i, j, k; - hMdEnc->spar_hoa_md_flag = ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate ); - num_channels = ivas_sba_get_nchan_metadata( sba_order ); - + ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag ); + num_channels = ivas_sba_get_nchan_metadata( sba_order, + hEncoderConfig->ivas_total_brate ); + ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind ); table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND ); + ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, + ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND +#ifdef ARITH_HUFF_CODER_CHANGES + , + hMdEnc->spar_hoa_dirac2spar_md_flag, + 1, hEncoderConfig->Opt_PCA_ON, +#ifndef DEBUG_AGC_ENCODER_CMD_OPTION + ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) +#else + ivas_agc_enc_get_flag( hEncoderConfig->Opt_AGC_ON, ivas_spar_br_table_consts[table_idx].nchan_transport ) +#endif + +#endif + ); /* get FB coefficients */ for ( i = 0; i < IVAS_MAX_NUM_BANDS; i++ ) @@ -510,17 +530,29 @@ static void write_metadata_buffer( BSTR_ENC_HANDLE hMetaData_tmp, BSTR_ENC_HANDLE hMetaData, const int16_t bit_pos_start, - const int16_t next_ind_start, - const int16_t last_ind_start ) + const int16_t next_ind_start +#ifndef IND_LIST_DYN + , + const int16_t last_ind_start +#endif +) { int16_t i; if ( hMetaData->nb_bits_tot > 0 ) { - restore_metadata_buffer( hMetaData, next_ind_start, last_ind_start, bit_pos_start ); + restore_metadata_buffer( hMetaData, next_ind_start, +#ifndef IND_LIST_DYN + last_ind_start, +#endif + bit_pos_start ); } +#ifdef IND_LIST_DYN + for ( i = 0; i < hMetaData_tmp->nb_ind_tot; i++ ) +#else for ( i = 0; i < hMetaData_tmp->next_ind; i++ ) +#endif { push_next_indice( hMetaData, hMetaData_tmp->ind_list[i].value, hMetaData_tmp->ind_list[i].nb_bits ); } @@ -544,31 +576,52 @@ ivas_error ivas_spar_md_enc_process( const int16_t dtx_vad, const int16_t nchan_inp, const int16_t sba_order /* i : Ambisonic (SBA) order */ + , + float *prior_mixer[IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH] /* i : prior mixer_matrix */ ) { float pred_coeffs_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; float dm_fv_re[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; + int16_t i, j, b, qsi, ndm, ndec, num_ch, num_quant_strats; + int16_t planarCP; float pred_coeffs_re_local[IVAS_SPAR_MAX_CH - 1][IVAS_MAX_NUM_BANDS]; - int16_t i, b, qsi, ndm, ndec, num_ch, num_quant_strats; - int16_t j, planarCP; int16_t k, bwidth, num_bands, num_bands_full, num_bands_bw; int16_t active_w, nchan_transport, dmx_switch, strat; int16_t nB, bands_bw, packed_ok = 0; ivas_strats_t cs[MAX_CODING_STRATS]; int16_t code_strat; - int16_t bit_pos_start, next_ind_start, last_ind_start; + int16_t bit_pos_start, next_ind_start; +#ifndef IND_LIST_DYN + int16_t last_ind_start; +#endif BSTR_ENC_DATA hMetaData_tmp; +#ifdef ARITH_HUFF_CODER_CHANGES + Indice *ind_list_tmp; + int16_t md_indices_allocated; +#else Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized +#endif +#ifdef IND_LIST_DYN + int16_t max_num_indices_tmp; +#endif float Wscale[IVAS_MAX_NUM_BANDS]; +#ifdef ARITH_HUFF_CODER_CHANGES + /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ + md_indices_allocated = hMdEnc->spar_md_cfg.max_bits_per_blk + IVAS_SPAR_ARITH_OVERSHOOT_BITS; + ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ); +#endif + num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; - num_ch = ivas_sba_get_nchan_metadata( sba_order ); + num_ch = ivas_sba_get_nchan_metadata( sba_order, + hEncoderConfig->ivas_total_brate ); active_w = hMdEnc->spar_md_cfg.active_w; nchan_transport = hMdEnc->spar_md_cfg.nchan_transport; bwidth = ivas_get_bw_idx_from_sample_rate( hEncoderConfig->input_Fs ); bwidth = min( bwidth, hEncoderConfig->max_bwidth ); - + int16_t active_w_vlbr; + active_w_vlbr = ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; num_bands = ivas_get_num_bands_from_bw_idx( SPAR_CONFIG_BW ); if ( hMdEnc->spar_hoa_md_flag == 0 ) { @@ -606,11 +659,21 @@ ivas_error ivas_spar_md_enc_process( } hMetaData_tmp.ind_list = ind_list_tmp; + hMetaData_tmp.nb_bits_tot = 0; +#ifdef IND_LIST_DYN + max_num_indices_tmp = MAX_BITS_METADATA; + hMetaData_tmp.ivas_max_num_indices = &max_num_indices_tmp; + hMetaData_tmp.ivas_ind_list_zero = (Indice **) ( &hMetaData_tmp.ind_list ); +#endif /* Save state of metadata bitstream buffer */ bit_pos_start = hMetaData->nb_bits_tot; +#ifdef IND_LIST_DYN + next_ind_start = hMetaData->nb_ind_tot; +#else next_ind_start = hMetaData->next_ind; last_ind_start = hMetaData->last_ind; +#endif dmx_switch = 0; @@ -621,17 +684,23 @@ ivas_error ivas_spar_md_enc_process( ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw ); } + else if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + { + bands_bw = 2; + nB = num_bands / bands_bw; + + ivas_band_mixer( cov_real, num_ch, &num_bands, bands_bw ); + } else { nB = num_bands; bands_bw = 1; } - - if ( hMdEnc->spar_hoa_md_flag ) + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) + for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) { pred_coeffs_re_local[i][b] = hMdEnc->spar_md.band_coeffs[b].pred_re[i]; } @@ -639,7 +708,9 @@ ivas_error ivas_spar_md_enc_process( } ivas_compute_spar_params( cov_real, dm_fv_re, 0, hMdEnc->mixer_mat, 0, nB, dtx_vad, num_ch, - bands_bw, active_w, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale, 0 ); + bands_bw, active_w, + active_w_vlbr, + &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale, 0 ); for ( i = 0; i < num_ch; i++ ) { @@ -651,7 +722,9 @@ ivas_error ivas_spar_md_enc_process( } } } - +#ifdef DEBUG_LBR_SBA + float dirac_md_kbps = (float) ( hMetaData->nb_bits_tot ) * 50 / 1000; +#endif planarCP = 0; code_strat = 0; #ifdef DEBUG_SBA_MD_DUMP @@ -736,11 +809,46 @@ ivas_error ivas_spar_md_enc_process( fprintf(stderr, "\n\n"); */ #endif } - ivas_quant_p_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch ); } - ivas_quant_pred_coeffs_per_band( &hMdEnc->spar_md.band_coeffs[b], &hMdEnc->spar_md.band_coeffs_idx[b], &hMdEnc->spar_md_cfg.quant_strat[qsi], num_ch ); + if ( active_w_vlbr ) + { + for ( i = 0; i < 3; i++ ) + { + int16_t i2; + i2 = 0; + switch ( i ) /* PRED (Y,Z,X) and DECD (Y,X,Z) coeffs are in different orders */ + { + case 0: + i2 = 0; + break; + case 1: + i2 = 2; + break; + case 2: + i2 = 1; + break; + } + if ( ( hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] == 0 ) && ( hMdEnc->spar_md.band_coeffs_idx[b].decd_index_re[i2] == 0 ) && ( hMdEnc->spar_md.band_coeffs[b].pred_re[i] != 0.0f ) && ( cov_real[i + 1][i + 1][b] != 0.0f ) ) + { + /* bump up the Pred coeff */ + float PR_uq, PR_step; + ivas_quant_strat_t qs; + qs = hMdEnc->spar_md_cfg.quant_strat[qsi]; + PR_uq = hMdEnc->spar_md.band_coeffs[b].pred_re[i]; + PR_step = ( qs.PR.max - qs.PR.min ) / ( qs.PR.q_levels[0] - 1 ); + + int16_t PR_sign; + PR_sign = ( PR_uq > 0 ) - ( PR_uq < 0 ); + + hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re[i] = PR_sign; + + /* deindex the modified coefficient */ + hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = PR_sign * PR_step; + } + } + } } else { @@ -753,7 +861,6 @@ ivas_error ivas_spar_md_enc_process( { hMdEnc->spar_md.band_coeffs[b].pred_quant_re[i] = 0; } - ivas_spar_quant_pred_coeffs_dtx( &hMdEnc->spar_md, hMdEnc->spar_md.band_coeffs[b].pred_re, ndm, hMdEnc->spar_md.band_coeffs_idx[b].pred_index_re, num_ch - 1, hMdEnc->spar_md.band_coeffs[b].pred_quant_re ); } } @@ -766,11 +873,11 @@ ivas_error ivas_spar_md_enc_process( } } - if ( hMdEnc->spar_hoa_md_flag ) + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { for ( b = SPAR_DIRAC_SPLIT_START_BAND; b < num_bands; b++ ) { - for ( i = 0; i < FOA_CHANNELS - 1; i++ ) + for ( i = 0; i < DIRAC_TO_SPAR_HBR_PRED_CHS; i++ ) { /* Use the prediction coeffs computed based on DirAC MD to generate mixer matrix */ pred_coeffs_re[i][b] = pred_coeffs_re_local[i][b]; @@ -871,19 +978,35 @@ ivas_error ivas_spar_md_enc_process( strat = cs[i]; if ( strat != NO_STRAT ) { +#ifdef ARITH_HUFF_CODER_CHANGES + reset_indices_enc( &hMetaData_tmp, md_indices_allocated ); +#else reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); - +#endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); - - if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) +#ifdef ARITH_HUFF_CODER_CHANGES + /*write to main buffer if its a valid bitstream*/ + if ( hMetaData_tmp.nb_bits_tot > 0 ) { - write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start, last_ind_start ); - code_strat = strat; - } - if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) - { - packed_ok = 1; - break; +#endif + if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) + { + write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start +#ifndef IND_LIST_DYN + , + last_ind_start +#endif + ); + code_strat = strat; + } + if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.tgt_bits_per_blk ) + { + + { + packed_ok = 1; + break; + } + } } } } @@ -893,16 +1016,89 @@ ivas_error ivas_spar_md_enc_process( break; } - if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk ) +#ifdef ARITH_HUFF_CODER_CHANGES + /*only if valid bitstream was written to main buffer*/ + if ( hMetaData->nb_bits_tot > bit_pos_start ) +#endif { - break; + if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk ) + { +#ifdef ARITH_HUFF_CODER_CHANGES + packed_ok = 1; +#endif + break; + } } } +#ifdef ARITH_HUFF_CODER_CHANGES + if ( dtx_vad == 1 ) + { + assert( packed_ok == 1 ); + } +#endif if ( hEncoderConfig->ivas_total_brate >= IVAS_256k ) { assert( qsi == 0 ); } + /* Reuse mixer matrix values for unsent bands */ + if ( ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) && ( code_strat > 3 ) ) + { + for ( b = 0; b < num_bands * bands_bw; b += 2 * bands_bw ) + { + if ( ( b == 0 ) && ( code_strat % 2 == 0 ) ) + { + b += 2; + } + for ( i = 0; i < 1; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + hMdEnc->mixer_mat[i][j][b] = prior_mixer[i][j][b]; + hMdEnc->mixer_mat[i][j][b + 1] = prior_mixer[i][j][b + 1]; + } + } + } + } +#ifdef DEBUG_LBR_SBA + char f_name[100]; + int16_t nbands = 1; + int16_t num_subframes = 1; + int16_t num_elements = 6; + int16_t num_block_group = 1; + int16_t byte_size = sizeof( float ); + + float sba_md_kbps = (float) hMetaData->nb_bits_tot * 50 / 1000; + float spar_md_kbps = sba_md_kbps - dirac_md_kbps; + float corebr_kbps = (float) hEncoderConfig->ivas_total_brate / 1000 - sba_md_kbps; + + sprintf( f_name, "SBA_MD_bitrate.bin" ); + ( frame == 0 ) ? dbgwrite( &nbands, sizeof( nbands ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_elements, sizeof( num_elements ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_subframes, sizeof( num_subframes ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &num_block_group, sizeof( num_block_group ), 1, 1, f_name ) : false; + ( frame == 0 ) ? dbgwrite( &byte_size, sizeof( byte_size ), 1, 1, f_name ) : false; + + for ( b = 0; b < nbands; b++ ) + { + for ( int16_t sf = 0; sf < num_subframes; sf++ ) + { + for ( int16_t bl = 0; bl < num_block_group; bl++ ) + { + float fqsi = (float) qsi; + float fcode = (float) code_strat; + + dbgwrite( &dirac_md_kbps, byte_size, 1, 1, f_name ); + dbgwrite( &spar_md_kbps, byte_size, 1, 1, f_name ); + dbgwrite( &sba_md_kbps, byte_size, 1, 1, f_name ); + dbgwrite( &fqsi, byte_size, 1, 1, f_name ); + dbgwrite( &fcode, byte_size, 1, 1, f_name ); + dbgwrite( &corebr_kbps, byte_size, 1, 1, f_name ); + // fprintf(stdout, "%f\t%f\t%f\t%d\t%d\n", dirac_md_kbps, spar_md_kbps, sba_md_kbps, qsi, code_strat ); + } + } + } +#endif #ifdef SPAR_HOA_DBG /*if ( strat >= 4 ) { @@ -1078,11 +1274,15 @@ ivas_error ivas_spar_md_enc_process( fclose( fp ); #endif - ivas_store_prior_coeffs( hMdEnc, num_bands, bands_bw, code_strat, dtx_vad, qsi ); + ivas_store_prior_coeffs( hMdEnc, num_bands, code_strat, dtx_vad, qsi ); hMdEnc->spar_md.dtx_vad = dtx_vad; hMdEnc->spar_md.num_bands = num_bands; +#ifdef ARITH_HUFF_CODER_CHANGES + free( ind_list_tmp ); +#endif + return IVAS_ERR_OK; } @@ -1152,6 +1352,9 @@ static void ivas_write_spar_md_bitstream( { int16_t no_ec, i; int16_t do_diff[IVAS_MAX_NUM_BANDS]; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t entropy_coding_result; +#endif if ( strat == NO_STRAT ) { @@ -1170,55 +1373,82 @@ static void ivas_write_spar_md_bitstream( no_ec = 0; - switch ( strat ) + if ( ivas_total_brate < IVAS_24k4 ) { - case BASE: - push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = 0; - } - break; - case BASE_NOEC: - push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = 0; - } - no_ec = 1; - break; - case FOUR_A: - push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 ); - } - ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); - break; - case FOUR_B: - push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 ); - } - ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); - break; - case FOUR_C: - push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 ); - } - ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); - break; - case FOUR_D: - push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS ); - for ( i = 0; i < nB; i++ ) - { - do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 ); - } - ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); - break; + switch ( strat ) + { + case BASE: + push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS ); + break; + case BASE_NOEC: + push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS ); + no_ec = 1; + break; + case FOUR_A: + case FOUR_C: + case FOUR_B: + case FOUR_D: + push_next_indice( hMetaData, strat, SPAR_NUM_CODING_STRAT_BITS ); + break; + } + /* for LBR SBA 40MS MD never do time diff */ + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + } + else + { + switch ( strat ) + { + case BASE: + push_next_indice( hMetaData, bands_bw - 1, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + break; + case BASE_NOEC: + push_next_indice( hMetaData, bands_bw + 1, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = 0; + } + no_ec = 1; + break; + case FOUR_A: + push_next_indice( hMetaData, 4, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 0 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_B: + push_next_indice( hMetaData, 5, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 1 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_C: + push_next_indice( hMetaData, 6, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 2 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + case FOUR_D: + push_next_indice( hMetaData, 7, SPAR_NUM_CODING_STRAT_BITS ); + for ( i = 0; i < nB; i++ ) + { + do_diff[i] = ( ( ( i + 1 ) & 3 ) != 3 ); + } + ivas_map_prior_coeffs_quant( &hMdEnc->spar_md_prior, &hMdEnc->spar_md_cfg, qsi, nB ); + break; + } } #ifdef SPAR_HOA_DBG @@ -1229,13 +1459,29 @@ static void ivas_write_spar_md_bitstream( #endif if ( no_ec == 1 ) { - ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP ); +#ifdef ARITH_HUFF_CODER_CHANGES + entropy_coding_result = +#endif + ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP, + bands_bw ); } else { - ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP ); +#ifdef ARITH_HUFF_CODER_CHANGES + entropy_coding_result = +#endif + ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP, + strat, + ivas_total_brate ); } +#ifdef ARITH_HUFF_CODER_CHANGES + if ( entropy_coding_result < 0 ) + { + hMetaData->nb_bits_tot = 0; + } +#endif + return; } @@ -1245,13 +1491,17 @@ static void ivas_write_spar_md_bitstream( * * Generate huffman coded bitstream *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_get_huffman_coded_bs( +#else static void ivas_get_huffman_coded_bs( +#endif ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, - const int16_t planarCP ) + const int16_t planarCP, + const int16_t bands_bw ) { int16_t i, j; int16_t pred_coeff_dim, pred_offset; @@ -1259,16 +1509,17 @@ static void ivas_get_huffman_coded_bs( for ( i = 0; i < nB; i++ ) { int16_t code, len; - int16_t ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i]; - int16_t ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i]; + int16_t ndm, ndec; + ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[i * bands_bw]; + ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[i * bands_bw]; pred_coeff_dim = ndm + ndec - 1; pred_offset = 0; - if ( hMdEnc->spar_hoa_md_flag ) + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) { - pred_offset = FOA_CHANNELS - 1; + pred_offset = DIRAC_TO_SPAR_HBR_PRED_CHS; } } @@ -1277,6 +1528,12 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } +#endif push_next_indice( hMetaData, code, len ); } @@ -1285,6 +1542,12 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[(int16_t) floor( j / ( ndm - 1 ) )] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } +#endif push_next_indice( hMetaData, code, len ); } } @@ -1294,6 +1557,12 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[j] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } +#endif push_next_indice( hMetaData, code, len ); } } @@ -1303,24 +1572,46 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } +#endif push_next_indice( hMetaData, code, len ); } for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } +#endif push_next_indice( hMetaData, code, len ); } for ( j = 0; j < ndec; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); +#ifdef ARITH_HUFF_CODER_CHANGES + if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) + { + return -1; + } +#endif push_next_indice( hMetaData, code, len ); } } } +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -1329,44 +1620,68 @@ static void ivas_get_huffman_coded_bs( * * Generate arithmetic coded bitstream *-----------------------------------------------------------------------------------------*/ - +#ifdef ARITH_HUFF_CODER_CHANGES +static int16_t ivas_get_arith_coded_bs( +#else static void ivas_get_arith_coded_bs( +#endif ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, - const int16_t planarCP ) + const int16_t planarCP, + const int16_t strat, + const int32_t ivas_total_brate ) { - int16_t i, j, any_diff; + int16_t i, any_diff; + int16_t j; ivas_cell_dim_t pred_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t drct_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t decd_cell_dims[IVAS_MAX_NUM_BANDS]; ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; +#ifdef ARITH_HUFF_CODER_CHANGES + int16_t arith_result; +#endif for ( i = 0; i < nB; i++ ) { int16_t ndm, ndec; ndm = hMdEnc->spar_md_cfg.num_dmx_chans_per_band[bands_bw * i]; ndec = hMdEnc->spar_md_cfg.num_decorr_per_band[bands_bw * i]; - pred_cell_dims[i].dim1 = ndm + ndec - 1; - if ( hMdEnc->spar_hoa_md_flag ) + + if ( ( ivas_total_brate < IVAS_24k4 ) && ( strat > 3 ) && ( ( ( i % 2 == 1 ) && ( strat % 2 == 0 ) ) || ( ( i % 2 == 0 ) && ( strat % 2 == 1 ) ) ) ) { - if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + pred_cell_dims[i].dim1 = 0; + pred_cell_dims[i].dim2 = 0; + drct_cell_dims[i].dim1 = 0; + drct_cell_dims[i].dim2 = 0; + decd_cell_dims[i].dim1 = 0; + decd_cell_dims[i].dim2 = 0; + decx_cell_dims[i].dim1 = 0; + decx_cell_dims[i].dim2 = 0; + } + else + { + pred_cell_dims[i].dim1 = ndm + ndec - 1; + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { - pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + if ( i >= SPAR_DIRAC_SPLIT_START_BAND ) + { + pred_cell_dims[i].dim1 -= ( FOA_CHANNELS - 1 ); + } } + pred_cell_dims[i].dim2 = 1; + drct_cell_dims[i].dim1 = ndec; + drct_cell_dims[i].dim2 = ndm - 1; + decd_cell_dims[i].dim1 = ndec; + decd_cell_dims[i].dim2 = 1; + decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; + decx_cell_dims[i].dim2 = 1; } - pred_cell_dims[i].dim2 = 1; - drct_cell_dims[i].dim1 = ndec; - drct_cell_dims[i].dim2 = ndm - 1; - decd_cell_dims[i].dim1 = ndec; - decd_cell_dims[i].dim2 = 1; - decx_cell_dims[i].dim1 = ( ndec * ( ndec - 1 ) ) >> 1; - decx_cell_dims[i].dim2 = 1; } any_diff = 0; @@ -1378,7 +1693,7 @@ static void ivas_get_arith_coded_bs( break; } } - if ( hMdEnc->spar_hoa_md_flag ) + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { for ( i = 0; i < nB; i++ ) { @@ -1387,12 +1702,12 @@ static void ivas_get_arith_coded_bs( for ( j = 0; j < pred_cell_dims[i].dim1; j++ ) { hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = - hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; if ( any_diff == 1 ) { hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j] = - hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + ( FOA_CHANNELS - 1 )]; + hMdEnc->spar_md_prior.band_coeffs_idx_mapped[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS]; } } } @@ -1405,10 +1720,20 @@ static void ivas_get_arith_coded_bs( ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF, planarCP ); } +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, + hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } +#else ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff ); +#endif - if ( hMdEnc->spar_hoa_md_flag ) + if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { for ( i = 0; i < nB; i++ ) { @@ -1416,10 +1741,10 @@ static void ivas_get_arith_coded_bs( { for ( j = pred_cell_dims[i].dim1 - 1; j >= 0; j-- ) { - hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + ( FOA_CHANNELS - 1 )] = + hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j + DIRAC_TO_SPAR_HBR_PRED_CHS] = hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j]; } - for ( j = 0; j < FOA_CHANNELS - 1; j++ ) + for ( j = 0; j < DIRAC_TO_SPAR_HBR_PRED_CHS; j++ ) { hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j] = 0; } @@ -1448,8 +1773,19 @@ static void ivas_get_arith_coded_bs( } } +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, + hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } +#else ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff ); +#endif + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF, planarCP ); @@ -1465,9 +1801,19 @@ static void ivas_get_arith_coded_bs( decd_cell_dims[i].dim1 = decd_cell_dims[i].dim1 - IVAS_SPAR_HOA3_NP_CHS; } } - +#ifdef ARITH_HUFF_CODER_CHANGES + arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, + symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, + hMdEnc->spar_md_cfg.max_bits_per_blk ); + if ( arith_result < 0 ) + { + return -1; + } +#else ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff ); +#endif + ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF, planarCP ); @@ -1476,7 +1822,11 @@ static void ivas_get_arith_coded_bs( ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF, planarCP ); } +#ifdef ARITH_HUFF_CODER_CHANGES + return 0; +#else return; +#endif } @@ -1540,15 +1890,11 @@ static void ivas_select_next_strat( static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, - const int16_t bands_bw, const int16_t strat, const int16_t dtx_vad, const int16_t qsi ) { int16_t i, j, b; - - float one_by_bands_bw = ( 1.0f / bands_bw ); - if ( dtx_vad == 0 ) { hMdEnc->spar_md_cfg.prior_strat = START; @@ -1562,7 +1908,7 @@ static void ivas_store_prior_coeffs( for ( i = 0; i < num_bands; i++ ) { - b = (int16_t) floor( i * one_by_bands_bw ); + b = i; for ( j = 0; j < IVAS_SPAR_MAX_CH - 1; j++ ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 362cd57588..7caab6da6a 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -81,6 +81,10 @@ typedef struct stereo_itd_data_struct int16_t prev_itd1; int16_t prev_itd2; +#ifdef HYBRID_ITD_MAX + /*flag for hybrid ITD for very large ITDs*/ + int16_t hybrid_itd_max; +#endif } ITD_DATA, *ITD_DATA_HANDLE; typedef struct dft_ana_struct @@ -315,6 +319,12 @@ typedef struct stereo_mdct_enc_data_structure typedef struct stereo_td_enc_data_structure { +#ifdef IND_LIST_DYN + BSTR_ENC_DATA tdm_hBstr_tmp; /* temporary bitstream structure holding TD stereo spatial parameters */ + Indice tdm_ind_list_tmp[MAX_IND_TDM_TMP]; /* temporary list of indices holding TD stereo spatial parameters */ + int16_t max_ind_tdm_tmp; /* maximum number of indices in the temporary list of indices holding TD stereo spatial parameters */ +#endif + int16_t tdm_lp_reuse_flag; /* Flag that indicate if it is possible to reuse the LP coefficient from the primary channel or not */ int16_t tdm_low_rate_mode; /* secondary channel low rate mode flag */ float tdm_Pri_pitch_buf[NB_SUBFR]; @@ -581,8 +591,10 @@ typedef struct ivas_dirac_enc_data_structure PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM handle */ IVAS_FB_MIXER_HANDLE hFbMixer; +#ifndef SBA_MODE_CLEAN_UP float *sba_synchro_buffer[DIRAC_MAX_ANA_CHANS]; int16_t num_samples_synchro_delay; +#endif /* DirAC parameter estimation */ float **direction_vector[DIRAC_NUM_DIMS]; @@ -590,8 +602,21 @@ typedef struct ivas_dirac_enc_data_structure float diffuseness_m[DIRAC_MAX_NBANDS]; int16_t band_grouping[DIRAC_MAX_NBANDS + 1]; int16_t block_grouping[5]; +#ifdef FIX_485_STATIC_BUFFERS + int16_t firstrun_sector_params; + + float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; + float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; + float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; +#endif + +#ifndef SBA_MODE_CLEAN_UP int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; +#endif /* diffuseness */ int16_t index_buffer_intensity; @@ -599,6 +624,7 @@ typedef struct ivas_dirac_enc_data_structure float **buffer_intensity_real[DIRAC_NUM_DIMS]; float *buffer_energy; + } DIRAC_ENC_DATA, *DIRAC_ENC_HANDLE; /*----------------------------------------------------------------------------------* @@ -656,6 +682,8 @@ typedef struct ivas_spar_md_enc_state_t ivas_huff_coeffs_t huff_coeffs; int16_t table_idx; int16_t spar_hoa_md_flag; + int16_t spar_hoa_dirac2spar_md_flag; + int16_t HOA_md_ind[IVAS_SPAR_MAX_CH]; } ivas_spar_md_enc_state_t; /* PCA structure */ @@ -687,6 +715,9 @@ typedef struct ivas_spar_enc_lib_t FRONT_VAD_ENC_HANDLE hFrontVad; /* front-VAD handle */ ENC_CORE_HANDLE hCoreCoderVAD; /* core-coder handle for front-VAD module */ +#ifdef SBA_MODE_CLEAN_UP + int16_t spar_reconfig_flag; +#endif int16_t front_vad_flag; int16_t front_vad_dtx_flag; int16_t force_front_vad; @@ -715,12 +746,26 @@ typedef struct ivas_param_mc_enc_data_structure } PARAM_MC_ENC_DATA, *PARAM_MC_ENC_HANDLE; +/*----------------------------------------------------------------------------------* + * MC ParamUpmix Mode encoder structures + *----------------------------------------------------------------------------------*/ +typedef struct ivas_mc_paramupmix_enc_data_structure +{ + ivas_trans_det_state_t *hTranDet[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; + IVAS_FB_MIXER_HANDLE hFbMixer; + ivas_enc_cov_handler_state_t *hCovEnc[MC_PARAMUPMIX_COMBINATIONS]; + float ***cov_real[MC_PARAMUPMIX_COMBINATIONS]; + float ***cov_dtx_real[MC_PARAMUPMIX_COMBINATIONS]; + float *midside[MC_PARAMUPMIX_COMBINATIONS][MC_PARAMUPMIX_NCH]; /* hold PCM of mid-side data */ + int32_t alpha_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + int32_t beta_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; + bool first_frame; +} MC_PARAMUPMIX_ENC_DATA, *MC_PARAMUPMIX_ENC_HANDLE; /*----------------------------------------------------------------------------------* * MASA encoder structures *----------------------------------------------------------------------------------*/ -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT typedef struct ivas_masa_dir_align_struct { float previous_azi_dir1[MASA_FREQUENCY_BANDS]; @@ -730,7 +775,6 @@ typedef struct ivas_masa_dir_align_struct float previous_ele_dir2[MASA_FREQUENCY_BANDS]; } MASA_DIR_ALIGN_STATE, *MASA_DIR_ALIGN_HANDLE; -#endif /* structure storing MASA framing sync detection and compensation data */ typedef struct ivas_masa_sync_struct @@ -760,9 +804,7 @@ typedef struct ivas_masa_encoder_data_struct MASA_SYNC_STATE sync_state; -#ifdef FIX_398_MASA_DIRECTION_ALIGNMENT MASA_DIR_ALIGN_STATE dir_align_state; -#endif } MASA_ENCODER_DATA; @@ -806,8 +848,8 @@ typedef struct ivas_mcmasa_enc_data_structure float **buffer_intensity_real_vert; float *buffer_energy; - float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; - float chnlToFoaEvenMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaEvenMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; float ls_azimuth[MCMASA_MAX_ANA_CHANS]; int16_t leftNearest[MCMASA_MAX_ANA_CHANS]; int16_t rightNearest[MCMASA_MAX_ANA_CHANS]; @@ -1078,7 +1120,9 @@ typedef struct encoder_config_structure /* temp. development parameters */ int16_t Opt_PCA_ON; /* flag indicating PCA operation in SBA */ - +#ifndef SBA_MODE_CLEAN_UP + int16_t spar_reconfig_flag; + #endif #ifdef DEBUGGING /* debugging options */ int16_t stereo_mode_cmdl; /* stereo mode forced from the command-line */ @@ -1103,6 +1147,13 @@ typedef struct { ENCODER_CONFIG_HANDLE hEncoderConfig; /* Encoder configuration structure */ +#ifdef IND_LIST_DYN + Indice *ind_list; /* List of indices */ + int16_t ivas_max_num_indices; /* Maximum allowed number of indices in the list */ + Indice *ind_list_metadata; /* List of indices for metadata */ + int16_t ivas_max_num_indices_metadata; /* Maximum allowed number of indices in the list of metadata */ +#endif + /* high-level encoder parameters */ int16_t nchan_transport; /* number of transport channels */ int16_t sba_analysis_order; /* Ambisonic (SBA) order used for analysis and coding */ @@ -1125,11 +1176,14 @@ typedef struct IVAS_QMETADATA_HANDLE hQMetaData; /* Metadata handle for q_metadata parametric spatial coding DirAC/MASA*/ MCT_ENC_HANDLE hMCT; /* MCT handle */ PARAM_MC_ENC_HANDLE hParamMC; /* Parametric MC handle */ + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ MCMASA_ENC_HANDLE hMcMasa; /* Multi-channel MASA data handle */ LFE_ENC_HANDLE hLFE; /* LFE data handle */ ISM_MODE ism_mode; /* ISM format mode */ +#ifndef SBA_MODE_CLEAN_UP SBA_MODE sba_mode; /* SBA format mode */ +#endif MC_MODE mc_mode; /* MC format mode */ /* Stereo downmix for EVS module */ diff --git a/lib_enc/ivas_stereo_cng_enc.c b/lib_enc/ivas_stereo_cng_enc.c index 2eb838bf5c..76f56532dc 100644 --- a/lib_enc/ivas_stereo_cng_enc.c +++ b/lib_enc/ivas_stereo_cng_enc.c @@ -173,12 +173,7 @@ void stereo_dft_enc_sid_coh( int16_t alpha_level; int16_t n; -#ifdef FIX_418_SID_BITRATE nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; -#else - /* TODO: still use old number of bits to keep bitexactness in output */ - nr_of_sid_stereo_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; -#endif zeropad = 0; /* Encode coherence vector. Find best fixed predictor by minimizing prediction error on input vector. @@ -333,9 +328,6 @@ void stereo_dft_enc_sid_coh( ( *nb_bits )++; } -#ifndef FIX_418_SID_BITRATE - push_next_indice( hBstr, zeropad, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); -#endif return; } diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 43546261a4..36e577b482 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -294,9 +294,16 @@ ivas_error stereo_dft_enc_create( hStereoDft_loc->hConfig->force_mono_transmission = 0; stereo_dft_config( hStereoDft_loc->hConfig, IVAS_24k4, &tmpS, &tmpS ); - stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs ); + stereo_dft_enc_open( hStereoDft_loc, input_Fs, max_bwidth ); + stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs +#ifdef HYBRID_ITD_MAX + , + hStereoDft_loc->hItd->hybrid_itd_max +#endif + ); + *hStereoDft = hStereoDft_loc; return IVAS_ERR_OK; @@ -560,6 +567,9 @@ void stereo_enc_itd_init( hItd->prev_itd1 = 0; hItd->prev_itd2 = 0; +#ifdef HYBRID_ITD_MAX + hItd->hybrid_itd_max = 0; +#endif return; } @@ -757,7 +767,7 @@ void stereo_dft_enc_analyze( { int16_t tmp[1024]; - /*fcs: stereo side info is only simulated */ + /* stereo side info is only simulated */ for ( i = 0; i < input_frame; i++ ) { tmp[i] = (int16_t) ( input[0][i] + 0.5f ); diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c index d2c0bc7fe1..025729e0cd 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -115,11 +115,19 @@ static void set_band_limits( void stereo_dft_hybrid_ITD_flag( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const int32_t input_Fs /* i : CPE element sampling rate */ +#ifdef HYBRID_ITD_MAX + , + const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ +#endif ) { if ( hConfig != NULL ) { - if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) ) + if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) +#ifdef HYBRID_ITD_MAX + || ( hybrid_itd_max == 1 ) +#endif + ) { hConfig->hybrid_itd_flag = 1; } @@ -642,6 +650,11 @@ void stereo_dft_enc_compute_itd( float cng_xcorr_filt; +#ifdef HYBRID_ITD_MAX + int16_t prev_itd_max; + int16_t itd_max_flip; +#endif + if ( hCPE->element_mode == IVAS_CPE_DFT ) { hStereoDft = hCPE->hStereoDft; @@ -1328,7 +1341,12 @@ void stereo_dft_enc_compute_itd( hItd->prev_sum_nrg_L_lb = sum_nrg_L_lb; mvr2r( xcorr_lb, hItd->prev_xcorr_lb, STEREO_DFT_XCORR_LB_MAX ); } - +#ifdef HYBRID_ITD_MAX + /*save previous flag*/ + prev_itd_max = hItd->hybrid_itd_max; + /* enable hybrid ITD handling for very large ITDs*/ + hItd->hybrid_itd_max = ( abs( itd ) > STEREO_DFT_ITD_MAX && abs( itd ) < STEREO_DFT_ITD_MAX_ANA && !hCPE->hCoreCoder[0]->sp_aud_decision0 && hCPE->element_brate < IVAS_32k ); +#endif /* Update memory */ hItd->prev_itd = itd; @@ -1343,7 +1361,7 @@ void stereo_dft_enc_compute_itd( #ifdef DEBUG_STEREO_CLF dbgwrite( &hItd->itd[k_offset], sizeof( float ), 1, 1, "res/ITD.x" ); #endif - + /* limit ITD range for MDCT stereo even more */ if ( hCPE->element_mode == IVAS_CPE_MDCT && fabsf( hItd->itd[k_offset] ) > ITD_MAX_MDCT ) { itd = 0; @@ -1353,7 +1371,25 @@ void stereo_dft_enc_compute_itd( hItd->deltaItd[k_offset] = hItd->itd[k_offset] - hItd->td_itd[k_offset]; - /* limit ITD range for MDCT stereo even more */ +#ifdef HYBRID_ITD_MAX + if ( hItd->hybrid_itd_max ) + { + /*check if there is an ITD flip*/ + itd_max_flip = ( hItd->itd[k_offset] * hItd->itd[k_offset - 1] < 0 ); + + if ( hItd->deltaItd[k_offset - 1] != 0 && itd_max_flip == 0 ) + { + int16_t tmp_itd = (int16_t) floor( ( ( hItd->prev_itd ) * ( (float) input_frame / 640 ) ) + 0.5f ); + hItd->deltaItd[k_offset] = -1.0f * tmp_itd - hItd->td_itd[k_offset]; + } + } + /*signal change for next frame*/ + if ( prev_itd_max == 1 && hItd->hybrid_itd_max == 0 ) + { + hItd->hybrid_itd_max = -1; + } +#endif + #ifdef DEBUG_MODE_DFT { int16_t tmp; diff --git a/lib_enc/ivas_stereo_dft_td_itd.c b/lib_enc/ivas_stereo_dft_td_itd.c index b7fb95422f..27a71dfae4 100644 --- a/lib_enc/ivas_stereo_dft_td_itd.c +++ b/lib_enc/ivas_stereo_dft_td_itd.c @@ -271,11 +271,18 @@ void stereo_td_itd( hITD->td_itd_32k[i] = hITD->td_itd_32k[i + 1]; } } +#ifdef HYBRID_ITD_MAX + /*reset TD ITDs in case of hybrid itd_max change - turn hybrid ITD off*/ + if ( hITD->hybrid_itd_max == -1 && hybrid_itd_flag == 0 ) + { + hITD->td_itd[k_offset] = 0; + hITD->td_itd_32k[k_offset] = 0; + } +#endif if ( hybrid_itd_flag == 0 ) { return; } - stereo_td_get_td_itd( &( hITD->td_itd[k_offset] ), &( hITD->td_itd_32k[k_offset] ), hITD->itd[k_offset], sts[0]->input_Fs ); /* initializations*/ diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 2e739cc906..03fcad485a 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -362,7 +362,13 @@ void stereo_mdct_core_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - +#ifdef IND_LIST_DYN + /* update the pointer to the buffer of indices of the second channel */ + if ( ch == 1 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif ProcessIGF( st, st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], &powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); } } @@ -373,6 +379,13 @@ void stereo_mdct_core_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; +#ifdef IND_LIST_DYN + /* update the pointer to the buffer of indices of the second channel */ + if ( ch == 1 ) + { + st->hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; if ( st->igf ) { diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c old mode 100644 new mode 100755 index 4ef24de8a1..138c9436d6 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -430,6 +430,10 @@ void stereo_coder_tcx( if ( !sts[0]->hTcxEnc->fUseTns[k] && !sts[1]->hTcxEnc->fUseTns[k] ) { +#ifdef FIX_483b + sts[0]->hTcxEnc->tns_ms_flag[k] = 1; + sts[1]->hTcxEnc->tns_ms_flag[k] = 1; +#endif ms_inv_mask_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], inv_mdst_spectrum[0][k], inv_mdst_spectrum[1][k], -1 ); ms_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], sfbConf->sfbCnt ); } diff --git a/lib_enc/ivas_stereo_td_enc.c b/lib_enc/ivas_stereo_td_enc.c index 3857795dce..2357e307c5 100644 --- a/lib_enc/ivas_stereo_td_enc.c +++ b/lib_enc/ivas_stereo_td_enc.c @@ -124,6 +124,14 @@ void stereo_td_init_enc( hStereoTD->tdm_prev_desired_idx = LRTD_STEREO_LEFT_IS_PRIM; } +#ifdef IND_LIST_DYN + hStereoTD->tdm_hBstr_tmp.ind_list = hStereoTD->tdm_ind_list_tmp; + hStereoTD->tdm_hBstr_tmp.ivas_ind_list_zero = (Indice **) ( &hStereoTD->tdm_hBstr_tmp.ind_list ); + hStereoTD->max_ind_tdm_tmp = MAX_IND_TDM_TMP; + hStereoTD->tdm_hBstr_tmp.ivas_max_num_indices = &hStereoTD->max_ind_tdm_tmp; + reset_indices_enc( &hStereoTD->tdm_hBstr_tmp, MAX_IND_TDM_TMP ); +#endif + return; } @@ -314,12 +322,16 @@ void tdm_configure_enc( int16_t tdm_ratio_bit_alloc_idx, mod_ct; STEREO_TD_ENC_DATA_HANDLE hStereoTD; Encoder_State **sts; +#ifndef IND_LIST_DYN BSTR_ENC_HANDLE hBstr; +#endif int16_t loc_coder_tyape_raw0; hStereoTD = hCPE->hStereoTD; sts = hCPE->hCoreCoder; +#ifndef IND_LIST_DYN hBstr = sts[1]->hBstr; +#endif loc_coder_tyape_raw0 = sts[0]->coder_type_raw; /*----------------------------------------------------------------* @@ -475,6 +487,46 @@ void tdm_configure_enc( * Bitstream writing *----------------------------------------------------------------*/ +#ifdef IND_LIST_DYN + /* transmit the ratio index */ + if ( tdm_SM_or_LRTD_Pri && hStereoTD->tdm_LRTD_flag == 0 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, tdm_ratio_idx_SM, TDM_RATIO_BITS ); + } + else + { + if ( hStereoTD->tdm_LRTD_flag == 1 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, hStereoTD->tdm_inst_ratio_idx, TDM_RATIO_BITS ); + } + else + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_TD_ALPHA, tdm_ratio_idx, TDM_RATIO_BITS ); + } + } + + /* LPC reuse flag */ + if ( sts[1]->coder_type == INACTIVE && tdm_ratio_idx < 29 && tdm_ratio_idx > 1 ) + { + /* normal TD, tdm_lp_reuse_flag always on, tdm_use_IAWB_Ave_lpc varies tdm_ratio_idx<29 && tdm_ratio_idx> 1*/ + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LPC_REUSE, hStereoTD->tdm_use_IAWB_Ave_lpc, TDM_LP_REUSE_BITS ); + } + else + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LPC_REUSE, hStereoTD->tdm_lp_reuse_flag, TDM_LP_REUSE_BITS ); + } + + /* LRTD flag */ + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_LRTD_FLAG, hStereoTD->tdm_LRTD_flag, TDM_LR_CONTENT_BITS ); + + /* Stereo ICA parameters */ + if ( hStereoTD->tdm_LRTD_flag == 0 ) + { + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_REFCHAN, hCPE->hStereoTCA->refChanIndx, STEREO_BITS_TCA_CHAN ); + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_CORRSTATS, hCPE->hStereoTCA->indx_ica_NCShift, STEREO_BITS_TCA_CORRSTATS ); + push_indice( &hStereoTD->tdm_hBstr_tmp, IND_STEREO_GD, hCPE->hStereoTCA->indx_ica_gD, STEREO_BITS_TCA_GD ); + } +#else /* transmit the ratio index */ if ( tdm_SM_or_LRTD_Pri && hStereoTD->tdm_LRTD_flag == 0 ) { @@ -513,12 +565,14 @@ void tdm_configure_enc( push_indice( hBstr, IND_STEREO_CORRSTATS, hCPE->hStereoTCA->indx_ica_NCShift, STEREO_BITS_TCA_CORRSTATS ); push_indice( hBstr, IND_STEREO_GD, hCPE->hStereoTCA->indx_ica_gD, STEREO_BITS_TCA_GD ); } +#endif #ifdef DEBUG_MODE_TD dbgwrite( &hStereoTD->tdm_low_rate_mode, 2, 1, 320, "res/tdm_low_rate_mode" ); dbgwrite( &hStereoTD->tdm_lp_reuse_flag, 2, 1, 320, "res/tdm_lp_reuse_flag" ); dbgwrite( &mod_ct, 2, 1, 320, "res/mod_ct.enx" ); #endif + /*----------------------------------------------------------------* * Updates *----------------------------------------------------------------*/ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c old mode 100644 new mode 100755 index f9deb214e6..37c3e57ab5 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -35,11 +35,13 @@ #include "prot.h" #include #include +#include #include #ifdef DEBUGGING #include "debug.h" #endif #include "wmc_auto.h" +#include "options.h" /*---------------------------------------------------------------------* * Local struct @@ -48,8 +50,12 @@ struct IVAS_ENC { Encoder_Struct *st_ivas; - Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ +#ifndef IND_LIST_DYN + Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ +#endif +#ifndef IND_LIST_DYN Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ +#endif ENC_CORE_HANDLE hCoreCoder; bool isConfigured; #ifdef DEBUGGING @@ -100,7 +106,9 @@ ivas_error IVAS_ENC_Open( ) { Encoder_Struct *st_ivas; +#ifndef IND_LIST_DYN int16_t i, j; +#endif if ( phIvasEnc == NULL ) { @@ -135,6 +143,7 @@ ivas_error IVAS_ENC_Open( * Initialize indices *-----------------------------------------------------------------*/ +#ifndef IND_LIST_DYN for ( i = 0; i < MAX_NUM_DATA; ++i ) { for ( j = 0; j < MAX_NUM_INDICES; ++j ) @@ -143,7 +152,9 @@ ivas_error IVAS_ENC_Open( ( *phIvasEnc )->ind_list[i][j].value = 0; } } +#endif +#ifndef IND_LIST_DYN for ( i = 0; i < MAX_NUM_METADATA; ++i ) { for ( j = 0; j < MAX_BITS_METADATA; ++j ) @@ -152,6 +163,7 @@ ivas_error IVAS_ENC_Open( ( *phIvasEnc )->ind_list_metadata[i][j].value = 0; } } +#endif /*-----------------------------------------------------------------* * Allocate IVAS-codec encoder state @@ -179,10 +191,17 @@ ivas_error IVAS_ENC_Open( /* initialize pointers to handles to NULL */ ivas_initialize_handles_enc( st_ivas ); +#ifdef IND_LIST_DYN + st_ivas->ind_list = NULL; + st_ivas->ind_list_metadata = NULL; +#endif + /* set high-level parameters */ st_ivas->mc_mode = MC_MODE_NONE; st_ivas->ism_mode = ISM_MODE_NONE; +#ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode = SBA_MODE_NONE; +#endif st_ivas->sba_analysis_order = 0; return IVAS_ERR_OK; @@ -430,7 +449,7 @@ ivas_error IVAS_ENC_FeedObjectMetadata( return IVAS_ERR_INDEX_OUT_OF_BOUNDS; } - error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch ); + error = ivas_set_ism_metadata( hIvasEnc->st_ivas->hIsmMetaData[ismIndex], metadata.azimuth, metadata.elevation, metadata.radius, metadata.yaw, metadata.pitch, metadata.non_diegetic_flag ); if ( error != IVAS_ERR_OK ) { @@ -878,17 +897,27 @@ static ivas_error configureEncoder( return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." ); } +#ifdef FIX_170_DTX_MASA if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && - ( ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation - ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done + ( ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD ) ) +#else + if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && + ( ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation + ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || + hEncoderConfig->ivas_format == MC_FORMAT ) ) +#endif { return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); } #ifdef DEBUG_AGC_ENCODER_CMD_OPTION - if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_sba_mode_select( hEncoderConfig->ivas_total_brate ) == SBA_MODE_SPAR ) ) +#ifndef SBA_MODE_CLEAN_UP + if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_sba_mode_select() == SBA_MODE_SPAR ) ) +#else + if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT ) ) +#endif { return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "AGC supported in SBA format at bitrates >= 24.4 kbps only." ); } @@ -908,7 +937,16 @@ static ivas_error configureEncoder( * Finalize initialization *-----------------------------------------------------------------*/ - if ( ( error = ivas_init_encoder( st_ivas, hIvasEnc->ind_list, hIvasEnc->ind_list_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_init_encoder( st_ivas +#ifndef IND_LIST_DYN + , + hIvasEnc->ind_list +#endif +#ifndef IND_LIST_DYN + , + hIvasEnc->ind_list_metadata +#endif + ) ) != IVAS_ERR_OK ) { return error; } @@ -1049,6 +1087,9 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( ENCODER_CONFIG_HANDLE hEncoderConfig; ENC_CORE_HANDLE hCoreCoder; int16_t i; +#ifdef IND_LIST_DYN + int16_t n, ch; +#endif ivas_error error; error = IVAS_ERR_OK; @@ -1116,6 +1157,89 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( hIvasEnc->switchingActive = true; } +#ifdef IND_LIST_DYN + /*-----------------------------------------------------------------* + * Re-allocate and re-initialize buffer of indices if IVAS total bitrate has changed + *-----------------------------------------------------------------*/ + + if ( hEncoderConfig->ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) + { + /* de-allocate old buffer of indices */ + free( st_ivas->ind_list ); + + /* set the maximum allowed number of indices in the list */ + st_ivas->ivas_max_num_indices = get_ivas_max_num_indices( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + /* allocate new buffer of indices */ + if ( ( st_ivas->ind_list = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of indices!\n" ) ); + } + + /* reset the list of indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices; i++ ) + { + st_ivas->ind_list[i].nb_bits = -1; + } + + /* de-allocate old buffer of metadata indices */ + if ( st_ivas->ind_list_metadata != NULL ) + { + free( st_ivas->ind_list_metadata ); + } + + /* set the maximum allowed number of metadata indices in the list */ + st_ivas->ivas_max_num_indices_metadata = get_ivas_max_num_indices_metadata( hEncoderConfig->ivas_format, hEncoderConfig->ivas_total_brate ); + + if ( st_ivas->ivas_max_num_indices_metadata > 0 ) + { + /* allocate new buffer of metadata indices */ + if ( ( st_ivas->ind_list_metadata = (INDICE_HANDLE) malloc( st_ivas->ivas_max_num_indices_metadata * sizeof( Indice ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for buffer of metadata indices!\n" ) ); + } + + /* reset the list of metadata indices */ + for ( i = 0; i < st_ivas->ivas_max_num_indices_metadata; i++ ) + { + st_ivas->ind_list_metadata[i].nb_bits = -1; + } + } + else + { + st_ivas->ind_list_metadata = NULL; + } + + /* set pointers to the new buffers of indices in each element */ + for ( n = 0; n < st_ivas->nSCE; n++ ) + { + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ind_list = st_ivas->ind_list; + st_ivas->hSCE[n]->hCoreCoder[0]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; + + if ( st_ivas->hSCE[n]->hMetaData != NULL ) + { + st_ivas->hSCE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hSCE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + } + } + + for ( n = 0; n < st_ivas->nCPE; n++ ) + { + for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ind_list = st_ivas->ind_list; + st_ivas->hCPE[n]->hCoreCoder[ch]->hBstr->ivas_ind_list_zero = &st_ivas->ind_list; + } + + if ( st_ivas->hCPE[n]->hMetaData != NULL ) + { + st_ivas->hCPE[n]->hMetaData->ind_list = st_ivas->ind_list_metadata; + st_ivas->hCPE[n]->hMetaData->ivas_ind_list_zero = &st_ivas->ind_list_metadata; + } + } + } +#endif + if ( hIvasEnc->switchingActive && hEncoderConfig->ivas_format == MONO_FORMAT ) { copy_encoder_config( st_ivas, hCoreCoder, 0 ); @@ -1172,7 +1296,6 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( * Main function to encode one frame to a compact bitstream (bytestream) *---------------------------------------------------------------------*/ -/* IVAS_fmToDo: Currently unused and untested */ ivas_error IVAS_ENC_EncodeFrameToCompact( IVAS_ENC_HANDLE hIvasEnc, /* i/o: IVAS encoder handle */ int16_t *inputBuffer, /* i : PCM input */ @@ -1368,71 +1491,7 @@ const char *IVAS_ENC_GetErrorMessage( ivas_error error /* i : encoder error code enum */ ) { - switch ( error ) - { - case IVAS_ERR_OK: - return "no error"; - case IVAS_ERR_FAILED_ALLOC: - return "Failed allocation error"; - case IVAS_ERR_WRONG_PARAMS: - return "wrong parameters"; - case IVAS_ERR_INVALID_BANDWIDTH: - return "invalid bandwidth"; - case IVAS_ERR_INVALID_DTX_UPDATE_RATE: - return "invalid DTX update rate"; - case IVAS_ERR_INVALID_SAMPLING_RATE: - return "invalid sampling rate"; - case IVAS_ERR_NOT_CONFIGURED: - return "encoder has not been configured"; - case IVAS_ERR_INVALID_STEREO_MODE: - return "invalid stereo mode"; - case IVAS_ERR_INVALID_CICP_INDEX: - return "invalid CICP index"; - case IVAS_ERR_INVALID_BITRATE: - return "invalid bitrate"; - case IVAS_ERR_INVALID_MASA_CONFIG: - return "invalid MASA config"; - case IVAS_ERR_TOO_MANY_INPUTS: - return "too many object inputs provided"; - case IVAS_ERR_INDEX_OUT_OF_BOUNDS: - return "index out of bounds"; - case IVAS_ERR_INTERNAL: - case IVAS_ERR_INTERNAL_FATAL: - return "internal error"; - case IVAS_ERR_RECONFIGURE_NOT_SUPPORTED: - return "reconfigure not supported"; - case IVAS_ERR_INVALID_FEC_OFFSET: - return "invalid FEC offset"; - case IVAS_ERR_INVALID_INPUT_BUFFER_SIZE: - return "invalid input buffer size"; - case IVAS_ERR_DTX_NOT_SUPPORTED: - return "DTX is not supported in this IVAS format and element mode"; - case IVAS_ERR_UNEXPECTED_NULL_POINTER: - return "unexpected NULL pointer"; - case IVAS_ERR_METADATA_NOT_EXPECTED: - return "metadata input not expected for current configuration"; -#ifdef DEBUGGING - case IVAS_ERR_INVALID_FORCE_MODE: - return "invalid force mode"; -#endif - case IVAS_ERR_NOT_IMPLEMENTED: - return "not implemented"; - case IVAS_ERR_FILE_READER_TIMESTAMP_MISMATCH: - return "mismatched timestamp"; - case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT: - return "invalid metadata format"; - case IVAS_ERR_ISM_INVALID_METADATA_VALUE: - return "invalid metadata value provided"; - case IVAS_ERR_FAILED_FILE_READ: - return "could not read from file"; - case IVAS_ERR_NOT_SUPPORTED_OPTION: - return "option not supported in this set-up"; - case IVAS_ERR_UNKNOWN: - default: - break; - } - - return "unknown error"; + return ivas_error_to_string( error ); } diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 349c41ebef..a4a3726b45 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -94,6 +94,13 @@ typedef enum _IVAS_ENC_MASA_VARIANT IVAS_ENC_MASA_UNDEFINED = 0xffff } IVAS_ENC_MASA_VARIANT; +typedef enum _IVAS_ENC_COMPLEXITY_LEVEL +{ + IVAS_ENC_COMPLEXITY_LEVEL_ONE = 1, + IVAS_ENC_COMPLEXITY_LEVEL_TWO = 2, + IVAS_ENC_COMPLEXITY_LEVEL_THREE = 3 +} IVAS_ENC_COMPLEXITY_LEVEL; + #ifdef DEBUGGING typedef enum _IVAS_ENC_STEREO_MODE { diff --git a/lib_enc/lsf_enc.c b/lib_enc/lsf_enc.c index 62e93912ed..66f8847608 100644 --- a/lib_enc/lsf_enc.c +++ b/lib_enc/lsf_enc.c @@ -45,10 +45,8 @@ #include "rom_com.h" #include "prot.h" #include "basop_proto_func.h" -#ifdef LSF_RE_USE_SECONDARY_CHANNEL #include "ivas_prot.h" #include "ivas_rom_com.h" -#endif #include "wmc_auto.h" /*-----------------------------------------------------------------* @@ -85,10 +83,8 @@ void lsf_enc( float *Aq, /* o : quantized A(z) for 4 subframes */ const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL , const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ) { int16_t i, nBits, force_sf, no_param_lpc; @@ -184,11 +180,7 @@ void lsf_enc( * LSF quantization *-------------------------------------------------------------------------------------*/ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw, tdm_lsfQ_PCh ); -#else - lsf_end_enc( st, lsf_new, lsf_new, nBits, coder_type, force_sf, param_lpc, &no_param_lpc, NULL, st->coder_type_raw ); -#endif /* convert quantized LSFs back to LSPs */ lsf2lsp( lsf_new, lsp_new, M, st->sr_core ); @@ -449,11 +441,8 @@ void lsf_end_enc( int16_t *lpc_param, int16_t *no_indices, int16_t *bits_param_lpc, - const int16_t coder_type_raw -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - , + const int16_t coder_type_raw, const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -#endif ) { int16_t i; @@ -485,18 +474,13 @@ void lsf_end_enc( int16_t *TCQIdx; int16_t flag_1bit_gran; BSTR_ENC_HANDLE hBstr = st->hBstr; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL float pred3[M]; int16_t dummy, dummy_v[5]; -#endif flag_1bit_gran = ( st->element_mode > EVS_MONO ); nBits = nBits_in; - if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1 -#ifdef LSF_RE_USE_SECONDARY_CHANNEL - && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */ -#endif + if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->codec_mode == MODE1 && ( st->idchan == 0 ) /* this bit is used only for primary channel or mono */ ) { if ( coder_type_raw == VOICED ) @@ -570,7 +554,6 @@ void lsf_end_enc( pred1[i] = ModeMeans[mode_lvq][i] + MU_MA * st->mem_MA[i]; } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL /* TD stereo SCh: perform intra-frame prediction with pulling-to-mean */ if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) { @@ -579,7 +562,6 @@ void lsf_end_enc( tdm_SCh_LSF_intra_pred( st->element_brate, tdm_lsfQ_PCh, pred3 ); } -#endif if ( predmode == 0 ) /* Safety-net only */ { @@ -600,10 +582,8 @@ void lsf_end_enc( safety_net = 0; } else /* Switched Safety-Net/AR prediction */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL { if ( predmode == 2 ) -#endif { /* Subtract mean and AR prediction */ mvr2r( ModeMeans[mode_lvq], pred0, M ); @@ -683,7 +663,6 @@ void lsf_end_enc( } } } -#ifdef LSF_RE_USE_SECONDARY_CHANNEL else /* of "if (predmode==2)" */ { mvr2r( ModeMeans[mode_lvq], pred0, M ); @@ -748,7 +727,6 @@ void lsf_end_enc( } } } -#endif /*--------------------------------------------------------------------------* * Write indices to array @@ -757,24 +735,16 @@ void lsf_end_enc( if ( st->codec_mode == MODE1 && st->core == ACELP_CORE ) { /* write coder_type bit for VOICED@16kHz or GENERIC@16kHz */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k && st->idchan == 0 ) -#else - if ( coder_type_org == GENERIC && st->sr_core == INT_FS_16k ) -#endif { /* VOICED =2 and GENERIC=3, so "coder_type-2" means VOICED =0 and GENERIC=1*/ push_indice( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, coder_type - 2, 1 ); } /* write predictor selection bit */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( predmode >= 2 ) -#else - if ( predmode == 2 ) -#endif { push_indice( hBstr, IND_LSF_PREDICTOR_SELECT_BIT, safety_net, 1 ); } @@ -792,11 +762,7 @@ void lsf_end_enc( else { cumleft = nBits; -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( predmode >= 2 ) -#else - if ( predmode == 2 ) -#endif { /* subtract predictor selection bit */ cumleft = nBits - 1; @@ -925,7 +891,6 @@ void lsf_end_enc( } else { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL if ( st->tdm_LRTD_flag == 0 && st->idchan == 1 && tdm_lsfQ_PCh != NULL ) { /* intra mode*/ @@ -935,14 +900,11 @@ void lsf_end_enc( } else { -#endif vq_dec_lvq( 1, qlsf, &indice[0], stages0, M, mode_lvq, levels0[stages0 - 1] ); v_add( qlsf, pred0, qlsf, M ); v_sub( qlsf, pred1, st->mem_MA, M ); -#ifdef LSF_RE_USE_SECONDARY_CHANNEL } -#endif } } else diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c index 190f4e2a74..9c7bed7629 100644 --- a/lib_enc/lsf_msvq_ma_enc.c +++ b/lib_enc/lsf_msvq_ma_enc.c @@ -49,11 +49,260 @@ #define kMaxC 8 -#ifdef ERI_FDCNGVQ_LOW_ROM - #include "ivas_prot.h" -void dctT2_N_apply_matrix( const float *input, float *output, const int16_t dct_dim, int16_t fdcngvq_dim, const float *idctT2_24_X_matrixQ16, const int16_t matrix_1st_dim, DCTTYPE dcttype ); -#endif + +// void dctT2_N_apply_matrix( const float *input, float *output, const int16_t dct_dim, int16_t fdcngvq_dim, const float *idctT2_24_X_matrixQ16, const int16_t matrix_1st_dim, DCTTYPE dcttype ); + + +int16_t msvq_stage1_dct_search( + /* o : (p_max , best candidate sofar ) */ + const float *u, /* i : target */ + const int16_t N, /* i : target length and IDCT synthesis length */ + + /* parameterization of segmented DCT domain storage */ + const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ + + const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ + const int16_t max_dct_trunc, /* i: maximum of truncation lenghts */ + float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ + + const float *midQ_truncQ, /* i: midQ vector */ + const float *dct_invScaleF, /* i: global inv scale factors*/ + const float *dct_scaleF, /* i: global scale factors*/ + const Word16 n_segm, /* i: number of segments */ + const Word16 *cols_per_segment, /* i: remaining length per segment */ + const Word16 *trunc_dct_cols_per_segment, /* i: trunc length per segment */ + const Word16 *entries_per_segment, /* i: number of rows per segment */ + const Word16 *cum_entries_per_segment, /* i: number of cumulative entries */ + + const Word8 *const W8Qx_dct_sections[], /*i: Word8(byte) segment table ptrs */ + const Word16 *col_syn_shift[], /*i: columnwise syn shift tables */ + const Word8 *segm_neighbour_fwd, /*i: circular neighbour list fwd */ + const Word8 *segm_neighbour_rev, /*i: circular neighbour list reverse */ + const Word16 npost_check, /*i: number of neigbours to check , should be even */ + + float *st1_mse_ptr, /*i: dynRAM buffer for MSEs */ + int16_t *indices_st1_local, /*o: selected cand indices */ + float *st1_syn_vec_ptr, /*i/o: buffer for IDCT24 synthesis */ + float *dist1_ptr /*o: resulting stage 1 MSEs in DCT-N domain */ +) +{ /* stage1 search in a segmentwise truncated dct N domain without weights */ + + float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; + float u_mr[FDCNG_VQ_MAX_LEN]; + float u_mr_scaled[FDCNG_VQ_MAX_LEN]; + float mse_trunc_segm[FDCNG_VQ_DCT_NSEGM]; + float tmp, check_mse; + float mse; /* Word32 in BASOP */ + + int16_t p_max, c, c2, segm, j_full, j, i; + int16_t n_ana, p_mins[2], idx_min[2]; + + const Word8 *cbpW8; + const Word16 *dct_col_shift_tab; + + float *st1_mse_pair; + int16_t *st1_idx_pair; + + float tmp2; + int16_t check_ind[FDCNG_VQ_DCT_NPOST]; + assert( ( npost_check % 2 == 0 ) && ( npost_check <= FDCNG_VQ_DCT_NPOST ) ); + + assert( n_segm <= FDCNG_VQ_DCT_NSEGM ); + + n_ana = N; /* VQ stage#1 core is currently always using stored DCT N coeffs */ + assert( n_ana >= max_dct_trunc ); /* check for FDCNGVQ WB , SWB, FB operation */ + + /* remove mid stage#1 vector, in original input domain */ + v_sub( u, midQ_truncQ, u_mr, n_ana ); + + v_multc( u_mr, dct_invScaleF[1], u_mr_scaled, n_ana ); /* scale up target to upscaled W8x storage domain */ + /* 16.0-->scale up from Q0 to search domain in Q4, not really needed in BASOP , impl. by shifts */ + + dctT2_N_apply_matrix( (const float *) u_mr_scaled, dct_target, min( max_dct_trunc, n_ana ), n_ana, invTrfMatrix, max_dct_trunc, dcttype ); + + /* init search state ptr's at the top */ + set_f( dist1_ptr, FLT_MAX, maxC_st1 ); + st1_mse_pair = &( dist1_ptr[0] ); /* req. ptr post upd +=2 */ + st1_idx_pair = &( indices_st1_local[0] ); /* req. ptr post upd +=2 */ + set_f( mse_trunc_segm, 0.0f, n_segm ); + + for ( segm = 0; segm < n_segm; segm++ ) + { /* point to a new paired location for each segment */ + p_max = 0; /* req. to point to one of 1 or 0, this init can potentially be omitted here,as p_max is always 1 or 0 */ + + /* compute segment common trunction error in dctN domain */ + mse_trunc_segm[segm] += sum2_f( (const float *) ( &( dct_target[cols_per_segment[segm]] ) ), trunc_dct_cols_per_segment[segm] ); + + cbpW8 = W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage , table ptr init */ + + for ( j = 0; j < entries_per_segment[segm]; j++ ) + { + /* unweighted segmented search DCT domain loop */ + j_full = j + cum_entries_per_segment[segm]; /* or simply use j_full++ */ + + mse = mse_trunc_segm[segm]; /* init mse with with common mse truncation part, in BASOP a move32() */ + + dct_col_shift_tab = col_syn_shift[segm]; /* ptr init */ + + for ( c2 = 0; c2 < cols_per_segment[segm]; c2++ ) + { +#define WMC_TOOL_SKIP + tmp = dct_target[c2] - (float) ( ( (Word16) cbpW8[c2] ) << dct_col_shift_tab[c2] ); /* Word8 storage MSE inner loop */ + LOGIC( 1 ); + SHIFT( 1 ); + ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ +#undef WMC_TOOL_SKIP + mse += tmp * tmp; /* L_mac or L_mac0() square Word16 -> Word32*/ + } + st1_mse_ptr[j_full] = mse; /* save MSE in shared dynamic RAM, move32() in BASOP */ + +#define WMC_TOOL_SKIP + cbpW8 += cols_per_segment[segm]; /* fixed pointer increment for each segment */ +#undef WMC_TOOL_SKIP + + /* overwrite with a new worst index at p_max */ + + /* Note: The three inner loop if's below are not 100% properly instrumented by WMC tool */ + if ( mse < st1_mse_pair[p_max] ) /* L_sub */ + { + st1_idx_pair[p_max] = j_full; /* move16, single BASOP */ + } /* BASOP 2 ops */ + + if ( st1_idx_pair[p_max] == j_full ) + { /* idx updated --> also update mse */ + st1_mse_pair[p_max] = mse; /* move32(), single BASOP */ + } /* BASOP 3 ops */ + + /* avoid WC costly candidate list management by always updating p_max, + as we have only a pair in each segment to maintain */ + p_max = 0; /* move16() */ + if ( ( st1_mse_pair[0] - st1_mse_pair[1] ) < 0 ) /* L_sub()*/ + { + p_max = 1; /* move16() */ + } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ + + /* Note: logical shift right not available in ANSI-C */ + /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ + /* in java logical shift right is available as >>> , in BASOP it is available as L_lshr */ + + /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ + } /* j in section */ + + st1_mse_pair += 2; /* req. ptr init */ + st1_idx_pair += 2; /* req. ptr init */ + + } /* next segment */ + + for ( j = 0; j < maxC_st1; j++ ) + { + /* compute_full mse using stored DCT24 domain MSE's */ + /* calculate MSE from stage1 inner using existing inner DCT domain variables */ + dist1_ptr[j] *= dct_scaleF[2]; /* multiplication to get the DCT inner MSE scale to the correct input domain */ + } + + assert( ( maxC_st1 >= 3 ) ); + assert( ( maxC_st1 <= 8 ) ); + + p_max = maximum( dist1_ptr, maxC_st1, NULL ); /* establish current worst candidate for MSVQ stage#2 among all maxC_st1 candidates so far */ + + p_mins[0] = minimum( dist1_ptr, maxC_st1, NULL ); /* find best entry among all maxC_pre */ + tmp = dist1_ptr[p_mins[0]]; + dist1_ptr[p_mins[0]] = FLT_MAX; /* exclude 1st */ + + p_mins[1] = minimum( dist1_ptr, maxC_st1, NULL ); /* find 2nd best entry */ + tmp2 = dist1_ptr[p_mins[1]]; + dist1_ptr[p_mins[1]] = FLT_MAX; /* exclude 2nd */ + + dist1_ptr[p_mins[0]] = tmp; /* restore 1st */ + dist1_ptr[p_mins[1]] = tmp2; /* restore 2nd */ + + idx_min[0] = indices_st1_local[p_mins[0]]; + idx_min[1] = indices_st1_local[p_mins[1]]; + + + /* use global exclusion list to never reselect the two (best) global MSE values sofar */ + st1_mse_ptr[idx_min[0]] = FLT_MAX; /* move32() */ + st1_mse_ptr[idx_min[1]] = FLT_MAX; /* move32() */ + + /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ + /* using both 1st and 2nd best neighbours in fwd and rev directions */ + check_ind[0] = segm_neighbour_fwd[idx_min[0]]; + check_ind[1] = segm_neighbour_rev[idx_min[0]]; + + check_ind[2] = segm_neighbour_fwd[idx_min[1]]; + check_ind[3] = segm_neighbour_rev[idx_min[1]]; + + check_ind[4] = segm_neighbour_fwd[check_ind[0]]; + check_ind[5] = segm_neighbour_rev[check_ind[1]]; + + check_ind[6] = segm_neighbour_fwd[check_ind[2]]; + check_ind[FDCNG_VQ_DCT_NPOST - 1] = segm_neighbour_rev[check_ind[3]]; + + for ( i = 0; i < npost_check; i++ ) + { + /* move MSE from DCT-inner loop search to input synthesis domain */ + /* multiplication by fdcng_dct_scaleF[2] to get the float outer loop scale correct in IDCT synthesis domain */ + check_mse = st1_mse_ptr[check_ind[i]] * dct_scaleF[2]; + + if ( check_mse < dist1_ptr[p_max] ) + { /* new winner , replace worst */ + dist1_ptr[p_max] = check_mse; + indices_st1_local[p_max] = check_ind[i]; + st1_mse_ptr[check_ind[i]] = FLT_MAX; /* exclude, BASOP: move32() */ + p_max = maximum( dist1_ptr, maxC_st1, NULL ); /* establish a new current worst candidate among all maxC */ + } + } + + /* extract the selected stage one vectors in DCT_N domain , apply IDCT_N and scale up */ + /* always extract full length signal(e.g. 24) to be able to update WB(e.g. N_in==21) candidate MSE values */ + /* in the case that only a part of the IDCT N vector is in final use */ + + /* note: synthesis not yet fully parameterized/generalized for other IDCT lengths */ + assert( N == 24 ); + { + for ( c = 0; c < maxC_st1; c++ ) + { + dec_FDCNG_MSVQ_stage1( indices_st1_local[c], N, invTrfMatrix, dcttype + 1, &( st1_syn_vec_ptr[c * N] ), NULL ); + } + } + + return p_max; /*ptr to worst performing candidate */ +} + + +/* recalc MSE for fdcng WB(0..20) coeffs , + essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search, + excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep the WB MSEs update for the subsequent stages +*/ +int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( /* o : (updated p_max) */ + const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */ + const float *u, /* i : target signal */ + const int16_t maxC_st1, /* i : number of candidates in stage1 */ + float *dist_ptr /* i/o: updated MSE vector for stage1 */ +) +{ + int16_t p_max_local, c; + const float *p2; + float res24, high_diff[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; + + for ( c = 0; c < maxC_st1; c++ ) + { /* point to extended synthesis part */ + p2 = (const float *) &( st1_syn_vec_ptr[c * FDCNG_VQ_MAX_LEN + FDCNG_VQ_MAX_LEN_WB] ); /* ptr init to synthesis candidate c */ + /* for stage#1 use "u" instead of the shortened resid[0], to access the extended/extrapolated input target */ + v_sub( p2, &( u[FDCNG_VQ_MAX_LEN_WB] ), high_diff, FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB ); + res24 = dotp( high_diff, high_diff, FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB ); /* sum squared over top env. values above WB coeffs */ + + dist_ptr[c] -= res24; /* remove DCT24 high band error contribution */ + } + + /* finally update p_max, as it may potentially change, + due to the core DCT24 search originally optimizing over the longer basis vectors than DCT21 */ + p_max_local = maximum( dist_ptr, maxC_st1, NULL ); + + return p_max_local; +} + /*--------------------------------------------------------------------------* * msvq_enc() @@ -61,22 +310,20 @@ void dctT2_N_apply_matrix( const float *input, float *output, const int16_t dct_ * MSVQ encoder *--------------------------------------------------------------------------*/ void msvq_enc( - const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ - const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ - const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ - const float u[], /* i : Vector to be encoded (prediction and mean removed) */ - const int16_t *levels, /* i : Number of levels in each stage */ - const int16_t maxC, /* i : Tree search size (number of candidates kept from */ - /* one stage to the next == M-best) */ - const int16_t stages, /* i : Number of stages */ - const float w[], /* i : Weights */ - const int16_t N, /* i : Vector dimension */ - const int16_t maxN, /* i : Codebook dimension */ -#ifdef ERI_FDCNGVQ_LOW_ROM + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const float u[], /* i : Vector to be encoded (prediction and mean removed) */ + const int16_t *levels, /* i : Number of levels in each stage */ + const int16_t maxC, /* i : Tree search size (number of candidates kept from */ + /* one stage to the next == M-best) */ + const int16_t stages, /* i : Number of stages */ + const float w[], /* i : Weights */ + const int16_t N, /* i : Vector dimension */ + const int16_t maxN, /* i : Codebook dimension */ const int16_t applyDCT_flag, /* i : applyDCT flag */ float *invTrfMatrix, /*i/o : synthesis matrix */ -#endif - int16_t Idx[] /* o : Indices */ + int16_t Idx[] /* o : Indices */ ) { float *resid[2], *dist[2]; @@ -87,44 +334,17 @@ void msvq_enc( float resid_buf[2 * LSFMBEST_MAX * M_MAX], dist_buf[2 * LSFMBEST_MAX], Tmp[M_MAX]; int16_t idx_buf[2 * LSFMBEST_MAX * MAX_VQ_STAGES_USED], parents[LSFMBEST_MAX]; int16_t n, maxn, start; - - -#ifdef ERI_FDCNGVQ_LOW_ROM - /* buffers */ - float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; - float u_mr[FDCNG_VQ_MAX_LEN]; - float u_mr_scaled[FDCNG_VQ_MAX_LEN]; - float mse_trunc_all_segms; - float mse_trunc_segm[FDCNG_VQ_DCT_NSEGM]; - float mse; - - const Word8 *cbpW8; - const Word16 *dct_col_shift_tab; - - float *st1_mse_pair; - int16_t *st1_idx_pair; + float *st1_syn_vec_ptr; /* ptr to buffer in dynRAM */ + float *st1_mse_ptr; /* ptr to buffer in existing dRAM used for stage 1 candidate analysis */ int16_t indices_st1_local[FDCNG_VQ_DCT_NSEGM * 2]; /* after stage#1 DCT search this is copied to the global indices[1][s*stages] structure */ - int16_t n_ana, p_mins[2], idx_min[2]; - DCTTYPE dcttype = DCT_T2_24_XX; - float tmp2; - - int16_t check_ind[FDCNG_VQ_DCT_NPOST]; - int16_t segm, j_full, maxC_pre; - float *st1_syn_vec_ptr; /* 8* 24 floats in dynRAM */ - float *st1_mse_ptr; /* 2^¨7 == 128 floats in existing dRAM used for stage 1 candidate analysis, 128 Word32 in BASOP */ - float res24, high_diff[FDCNG_VQ_MAX_LEN - FDCNG_VQ_MAX_LEN_WB]; - - maxC_pre = ( FDCNG_VQ_DCT_NSEGM * 2 ); assert( maxC <= LSFMBEST_MAX ); assert( ( LSFMBEST_MAX * M_MAX ) > ( N * maxC ) ); /* top of resid_buf is resid[1] and used for stage#1 residuals (input target u), - we here reuse resid[0] part of the buffer for stage#1 DCT dynamic RAM needs - */ - st1_mse_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - ( levels[0] ); /* reuse top of residual resid[0] scratch RAM for stage1 MSEs */ + we here reuse resid[0] part of the buffer for stage#1 DCT dynamic RAM needs */ + st1_mse_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - ( levels[0] ); /* reuse top of residual resid[0] scratch RAM for stage1 MSEs */ + st1_syn_vec_ptr = &( resid_buf[1 * LSFMBEST_MAX * M_MAX] ) - FDCNG_VQ_MAX_LEN * maxC; /* reuse top of resid[0] scratch RAM for residual */ - dcttype = DCT_T2_24_XX; -#endif /*----------------------------------------------------------------* * Allocate memory for previous (parent) and current nodes. @@ -208,256 +428,72 @@ void msvq_enc( dist[1][j] = FLT_MAX; } -#ifdef ERI_FDCNGVQ_LOW_ROM if ( !s && applyDCT_flag != 0 ) /* means: m==1 */ - { /* stage 1 search in truncated dct domain without any weights */ - - n_ana = FDCNG_VQ_MAX_LEN; /* VQ stage#1 core is always using stored DCT24 coeffs */ - /*remove mean/mid fdcng stage#1 vector, in original subband domain */ - v_sub( u, cdk1r_tr_midQ_truncQ, u_mr, n_ana ); - - v_multc( u_mr, fdcng_dct_invScaleF[1], u_mr_scaled, n_ana ); /*scale up target to upscaled W8x storage domain */ - /* 16.0-->scale up from Q0 to search domain in Q4, not really needed in BASOP , impl. by shifts */ - - assert( n_ana >= FDCNG_VQ_DCT_MAXTRUNC ); /* check for WB , SWB, FB operation */ - - dctT2_N_apply_matrix( (const float *) u_mr_scaled, dct_target, min( FDCNG_VQ_DCT_MAXTRUNC, n_ana ), n_ana, invTrfMatrix, FDCNG_VQ_DCT_MAXTRUNC, dcttype ); - - mse_trunc_all_segms = 0; - mse = 0; - - /* init search state ptr's at the top */ - for ( segm = 0; segm < FDCNG_VQ_DCT_NSEGM; segm++ ) - { - /* point to a new paired location */ - st1_mse_pair = &( dist[1][2 * segm] ); /* req. ptr init +=2 */ - st1_mse_pair[0] = FLT_MAX; /* req */ - st1_mse_pair[1] = FLT_MAX; /* req */ - st1_idx_pair = &( indices_st1_local[2 * segm] ); /* +=2 */ - p_max = 0; /* req. to point to 1 or 0 */ - - /* compute segment common trunction error in dct domain */ - mse_trunc_segm[segm] = mse_trunc_all_segms; - mse_trunc_segm[segm] += sum2_f( (const float *) ( &( dct_target[cdk1_ivas_cols_per_segment[segm]] ) ), cdk1_ivas_trunc_dct_cols_per_segment[segm] ); - - cbpW8 = cdk_37bits_ivas_stage1_W8Qx_dct_sections[segm]; /* Word8 column variable Qx storage*/ - - for ( j = 0; j < cdk1_ivas_entries_per_segment[segm]; j++ ) - { - /* unweighted segmented search DCT domain loop */ - j_full = j + cdk1_ivas_cum_entries_per_segment[segm]; /* or simply use j_full++ */ - - mse = mse_trunc_segm[segm]; /* move32() init mse with with common mse truncation part */ - - dct_col_shift_tab = stage1_dct_col_syn_shift[segm]; /* ptr init */ - - for ( c2 = 0; c2 < cdk1_ivas_cols_per_segment[segm]; c2++ ) - { - -#define WMC_TOOL_SKIP - tmp = dct_target[c2] - (float) ( ( (Word16) cbpW8[c2] ) << dct_col_shift_tab[c2] ); /* Word8 storage MSE inner loop */ - LOGIC( 1 ); - SHIFT( 1 ); - ADD( 1 ); /* in BASOP: s_and(for W8->W16), shl(), sub()*/ -#undef WMC_TOOL_SKIP - - mse += tmp * tmp; /* L_mac or L_mac0() square Word16 -> Word32*/ - } - st1_mse_ptr[j_full] = mse; /* save MSE in shared dynamic 2^7=128 RAM, move32() in BASOP */ - -#define WMC_TOOL_SKIP - cbpW8 += cdk1_ivas_cols_per_segment[segm]; /* pointer increment */ -#undef WMC_TOOL_SKIP - /* overwrite with a new worst index at p_max */ - -#ifdef ERI_FDCNGVQ_LOW_ROM - /* The three inner loop if's below are not really properly instrumented by WMC tool */ - /* a ptr to worst index will be in use */ -#endif - if ( mse < st1_mse_pair[p_max] ) /* L_sub */ - { - st1_idx_pair[p_max] = j_full; /* simplified */ - } /* BASOP 2 ops */ - - if ( st1_idx_pair[p_max] == j_full ) /* simplified */ - { /*idx updated to j_full --> also update mse */ - st1_mse_pair[p_max] = mse; /* move32(), single BASOP */ - } /* BASOP 3 ops */ - /* avoid WC costly list management by always updating p_max, as we have only a pair to maintain */ - p_max = 0; /* move16() */ - if ( ( st1_mse_pair[0] - st1_mse_pair[1] ) < 0 ) /* L_sub()*/ - { - p_max = 1; /* move16() */ - } /* BASOP 3 ops ,Note 2 ops possible in BASOP with L_sub and L_lshr */ - - /* Note: logical shift right not available in ANSI-C */ - /* p_max = (st1_mse_pair[0] - st1_mse_pair[1]) ">>>" 31; */ - /* in java logical shift right is available as >>> , in BASOP it is L_lshr */ - - /* Cost: weighted sum with cond moves ('if') => 8 in float , 7 in BASOP with L_lshr */ - } /* j in section */ - - } /* next segment */ - - for ( j = 0; j < maxC_pre; j++ ) - { - /* compute_full mse using stored DCT24 domain MSE's */ - /* calculate MSE from stage1 inner using existing inner DCT domain variables */ - dist[1][j] *= fdcng_dct_scaleF[2]; /* single multiplication to get the MSE scale to the correct input domain */ - } - - p_max = maximum( dist[1], maxC_pre, NULL ); /* establish current worst candidate for stage#2 among all maxC_pre candidates */ - - p_mins[0] = minimum( dist[1], maxC_pre, NULL ); /* find best entry among all maxC_pre */ - tmp = dist[1][p_mins[0]]; - dist[1][p_mins[0]] = FLT_MAX; /* exclude 1st */ - - p_mins[1] = minimum( dist[1], maxC_pre, NULL ); /* find 2nd best entry */ - tmp2 = dist[1][p_mins[1]]; - dist[1][p_mins[1]] = FLT_MAX; /* exclude 2nd*/ - - dist[1][p_mins[0]] = tmp; /* restore 1st */ - dist[1][p_mins[1]] = tmp2; /* restore 2nd */ - - idx_min[0] = indices_st1_local[p_mins[0]]; - idx_min[1] = indices_st1_local[p_mins[1]]; - - - /* use global exclusion list to never reselect the two (best) mse values sofar */ - st1_mse_ptr[idx_min[0]] = FLT_MAX; /* move32() */ - st1_mse_ptr[idx_min[1]] = FLT_MAX; /* move32() */ - - /* circular MSE-neigbour list in use to potentially replace some segment search candidates */ - /* using both 1st and 2nd best neighbours in fwd and rev directions */ - check_ind[0] = cdk1_ivas_segm_neighbour_fwd[idx_min[0]]; - check_ind[1] = cdk1_ivas_segm_neighbour_rev[idx_min[0]]; - - check_ind[2] = cdk1_ivas_segm_neighbour_fwd[idx_min[1]]; - check_ind[3] = cdk1_ivas_segm_neighbour_rev[idx_min[1]]; - - check_ind[4] = cdk1_ivas_segm_neighbour_fwd[check_ind[0]]; - check_ind[5] = cdk1_ivas_segm_neighbour_rev[check_ind[1]]; - - check_ind[6] = cdk1_ivas_segm_neighbour_fwd[check_ind[2]]; - check_ind[7] = cdk1_ivas_segm_neighbour_rev[check_ind[3]]; - - for ( i = 0; i < FDCNG_VQ_DCT_NPOST; i++ ) - { - float check_mse = st1_mse_ptr[check_ind[i]] * fdcng_dct_scaleF[2]; - /* *= fdcng_dct_scaleF[2]; */ /* multiplication in use to get the float outer loop scale correct */ - - if ( check_mse < dist[1][p_max] ) - { - /* new winner , replace */ - dist[1][p_max] = check_mse; - indices_st1_local[p_max] = check_ind[i]; - st1_mse_ptr[check_ind[i]] = FLT_MAX; /* BASOP: move32() */ - p_max = maximum( dist[1], maxC_pre, NULL ); /* establish a new current worst candidate among all maxC */ - } - } - - for ( c = 0; c < maxC_pre; c++ ) - { - indices[1][c * stages] = indices_st1_local[c]; /* move established stage#1 indices to global MSVQ list structure */ - } - - /* extract the selected stage one vectors in DCT domain , apply IDCT_N and scale up */ - /*always extract full length signal(24) to be able to update WB( N==21) candidate MSE values */ - for ( c = 0; c < maxC_pre; c++ ) + { + /* stage 1 candidates search in truncated dct24 domain without any weights */ + assert( N == FDCNG_VQ_MAX_LEN || N == FDCNG_VQ_MAX_LEN_WB ); /* 21 and 24 allowed */ + assert( maxC == 2 * FDCNG_VQ_DCT_NSEGM ); + + p_max = msvq_stage1_dct_search( u, FDCNG_VQ_MAX_LEN, maxC, + DCT_T2_24_XX, + FDCNG_VQ_DCT_MAXTRUNC, + invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ + cdk1r_tr_midQ_truncQ, /* i: midQ vector */ + fdcng_dct_invScaleF, /* i: global inv scale factors*/ + fdcng_dct_scaleF, /* i: global scale factors*/ + FDCNG_VQ_DCT_NSEGM, /* i: number of segments */ + cdk1_ivas_cols_per_segment, /* i: remaining length per segment */ + cdk1_ivas_trunc_dct_cols_per_segment, /* i: trunc length per segment */ + cdk1_ivas_entries_per_segment, /* i: number of rows per segment */ + cdk1_ivas_cum_entries_per_segment, /* i: number of cumulative entries */ + cdk_37bits_ivas_stage1_W8Qx_dct_sections, /*i: Word8(byte) segment table ptrs */ + stage1_dct_col_syn_shift, /*i: columnwise syn shift tables */ + cdk1_ivas_segm_neighbour_fwd, /*i: circular neighbour list fwd */ + cdk1_ivas_segm_neighbour_rev, /*i: circular neighbour list reverse */ + FDCNG_VQ_DCT_NPOST, /*i: number of circ. neigbours to post check */ + st1_mse_ptr, indices_st1_local, st1_syn_vec_ptr, dist[1] ); + + + /* move established stage#1 indices to the global MSVQ list structure */ + for ( c = 0; c < maxC; c++ ) { - dec_FDCNG_MSVQ_stage1( indices_st1_local[c], FDCNG_VQ_MAX_LEN, invTrfMatrix, dcttype + 1, &( st1_syn_vec_ptr[c * FDCNG_VQ_MAX_LEN] ), NULL ); + indices[1][c * stages] = indices_st1_local[c]; } - - assert( maxC == maxC_pre ); } else - /* non-DCT Stage #1 code below */ -#endif + /* non-DCT Stage #1 code below */ if ( !s ) /* means: m==1 */ - { - /* This loop is identical to the one below, except, that the inner - loop over c=0..m is hardcoded to c=0, since m=1. */ - /* dist[0][0] */ - for ( j = 0; j < levels[s]; j++ ) { - en = 0.0f; - /* w,Tmp */ - /* Compute weighted codebook element and its energy */ - for ( c2 = 0; c2 < n; c2++ ) - { - Tmp[start + c2] = w[start + c2] * cbp[c2]; - en += cbp[c2] * Tmp[start + c2]; - } - cbp += maxn; /* pointer is incremented */ - - pTmp = &resid[0][0]; - /* Tmp */ - tmp = ( *pTmp++ ) * Tmp[0]; - for ( c2 = 1; c2 < N; c2++ ) - { - tmp += ( *pTmp++ ) * Tmp[c2]; - } - tmp = en - 2.0f * tmp; - tmp += dist[0][0]; - if ( tmp < dist[1][p_max] ) + /* This loop is identical to the one below, except, that the inner + loop over c=0..m is hardcoded to c=0, since m=1. */ + /* dist[0][0] */ + for ( j = 0; j < levels[s]; j++ ) { - /* Replace worst */ - dist[1][p_max] = tmp; - indices[1][p_max * stages] = j; - parents[p_max] = 0; - - p_max = 0; - for ( c2 = 1; c2 < maxC; c2++ ) + en = 0.0f; + /* w,Tmp */ + /* Compute weighted codebook element and its energy */ + for ( c2 = 0; c2 < n; c2++ ) { - if ( dist[1][c2] > dist[1][p_max] ) - { - p_max = c2; - } + Tmp[start + c2] = w[start + c2] * cbp[c2]; + en += cbp[c2] * Tmp[start + c2]; } - } /* if (tmp <= dist[1][p_max]) */ - } /* for (j=0; j dist[1][p_max] ) + { + p_max = c2; + } + } + } /* if (tmp <= dist[1][p_max]) */ + } /* for(c=0; chSpMusClas != NULL ) { +#ifdef FIX_483 + float E; + + E = mean( lf_E, 8 ); + if ( E < 1.0f ) + { + st->hSpMusClas->ener_RAT = 0.f; + } + else + { + st->hSpMusClas->ener_RAT = 10.0f * (float) log10( E ); + st->hSpMusClas->ener_RAT /= ( Etot + 0.01f ); + } +#else st->hSpMusClas->ener_RAT = 10.0f * (float) log10( mean( lf_E, 8 ) ); st->hSpMusClas->ener_RAT /= ( Etot + 0.01f ); @@ -385,6 +399,7 @@ void noise_est( { st->hSpMusClas->ener_RAT = 0.0f; } +#endif if ( st->hSpMusClas->ener_RAT > 1.0 ) { diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c index 4c4bf68674..82436a7dfc 100644 --- a/lib_enc/pre_proc.c +++ b/lib_enc/pre_proc.c @@ -254,7 +254,6 @@ void pre_proc( * Select SID or FRAME_NO_DATA frame if DTX enabled *-----------------------------------------------------------------*/ dtx( st, -1, vad_flag_dtx, inp_12k8 ); - /*----------------------------------------------------------------* * Adjust FD-CNG Noise Estimator *----------------------------------------------------------------*/ diff --git a/lib_enc/qlpc_stoch.c b/lib_enc/qlpc_stoch.c index b7103bc169..31021aee7f 100644 --- a/lib_enc/qlpc_stoch.c +++ b/lib_enc/qlpc_stoch.c @@ -121,21 +121,13 @@ void lpc_quantization( if ( st->sr_core == INT_FS_16k && coder_type == UNVOICED ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, GENERIC, force_sf, param_lpc, no_param_lpc, bits_param_lpc, GENERIC, NULL ); -#else - lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, GENERIC, force_sf, param_lpc, no_param_lpc, bits_param_lpc, GENERIC ); -#endif nb_indices = *no_param_lpc; } else { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, coder_type, force_sf, param_lpc, no_param_lpc, bits_param_lpc, coder_type, NULL ); -#else - lsf_end_enc( st, lsf, lsf_q, ENDLSF_NBITS, coder_type, force_sf, param_lpc, no_param_lpc, bits_param_lpc, coder_type ); -#endif nb_indices = *no_param_lpc; } diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index cf8568e649..fac0f01e4f 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -1828,6 +1828,7 @@ void ivas_smc_mode_selection( float ton; int16_t i; float S_p2a, S_max, S_ave; + float thr_sp2a; SP_MUS_CLAS_HANDLE hSpMusClas = st->hSpMusClas; @@ -1858,8 +1859,17 @@ void ivas_smc_mode_selection( S_ave = sum_f( st->hSpMusClas->tod_lt_Bin_E, TOD_NSPEC ) / TOD_NSPEC; S_p2a = S_max - S_ave; + if ( element_brate <= IVAS_16k4 ) + { + thr_sp2a = THR_P2A_HIGH; + } + else + { + thr_sp2a = THR_P2A; + } + /* initial 3-way selection of coding modes (ACELP/GSC/TCX) */ - if ( relE > -10.0f && ( S_p2a > THR_P2A || ton > hSpMusClas->tod_thr_lt ) ) + if ( relE > -10.0f && ( S_p2a > thr_sp2a || ton > hSpMusClas->tod_thr_lt ) ) { /* select TCX to encode extremely peaky signals or strongly tonal signals */ st->sp_aud_decision1 = 1; diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h old mode 100644 new mode 100755 index ec7fb594d1..1a5c893dbd --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -51,11 +51,20 @@ * Indice *------------------------------------------------------------------------------------------*/ +#ifdef IND_LIST_DYN +typedef struct +{ + int16_t id; /* id of the indice */ + uint16_t value; /* value of the quantized indice */ + int16_t nb_bits; /* number of bits used for the quantization of the indice */ +} Indice, *INDICE_HANDLE; +#else typedef struct { uint16_t value; /* value of the quantized indice */ int16_t nb_bits; /* number of bits used for the quantization of the indice */ } Indice; +#endif /*----------------------------------------------------------------------------------* * Bitstream structure @@ -63,11 +72,19 @@ typedef struct typedef struct bitstream_enc_data_structure { +#ifdef IND_LIST_DYN + int16_t nb_ind_tot; /* total number of indices already written */ +#endif int16_t nb_bits_tot; /* total number of bits already written */ Indice *ind_list; /* list of indices */ - int16_t next_ind; /* pointer to the next empty slot in the list of indices */ - int16_t last_ind; /* last written indice */ - +#ifndef IND_LIST_DYN + int16_t next_ind; /* pointer to the next empty slot in the list of indices */ + int16_t last_ind; /* last written indice */ +#endif +#ifdef IND_LIST_DYN + int16_t *ivas_max_num_indices; /* maximum total number of indices in the list */ + Indice **ivas_ind_list_zero; /* beginning of the buffer of indices */ +#endif } BSTR_ENC_DATA, *BSTR_ENC_HANDLE; /*----------------------------------------------------------------------------------* @@ -1104,6 +1121,10 @@ typedef struct tcx_enc_structure float *acelp_zir; float tcx_target_bits_fac; +#ifdef FIX_483b + int16_t tns_ms_flag[2]; +#endif + } TCX_ENC_DATA, *TCX_ENC_HANDLE; /*----------------------------------------------------------------------------------* * diff --git a/lib_enc/tcx_utils_enc.c b/lib_enc/tcx_utils_enc.c index ba709f0158..8099b8cb07 100644 --- a/lib_enc/tcx_utils_enc.c +++ b/lib_enc/tcx_utils_enc.c @@ -1486,11 +1486,19 @@ void ProcessIGF( } else { +#ifdef IND_LIST_DYN + pBsStart = hBstr->nb_ind_tot; +#else pBsStart = hBstr->next_ind; +#endif IGFEncWriteBitstream( hIGFEnc, hBstr, &hIGFEnc->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); +#ifdef IND_LIST_DYN + bsBits = hBstr->nb_ind_tot - pBsStart; +#else bsBits = hBstr->next_ind - pBsStart; +#endif IGFEncConcatenateBitstream( hIGFEnc, bsBits, hBstr ); } @@ -1570,11 +1578,24 @@ void ProcessStereoIGF( else { hBstr = sts[ch]->hBstr; +#ifdef IND_LIST_DYN + pBsStart = hBstr->nb_ind_tot; +#else pBsStart = hBstr->next_ind; - +#endif +#ifdef IND_LIST_DYN + if ( ch > 0 ) + { + hBstr->ind_list = sts[0]->hBstr->ind_list + sts[0]->hBstr->nb_ind_tot; + } +#endif IGFEncWriteBitstream( hIGFEnc[ch], hBstr, &hIGFEnc[ch]->infoTotalBitsPerFrameWritten, igfGridIdx, isIndepFlag ); +#ifdef IND_LIST_DYN + bsBits = hBstr->nb_ind_tot - pBsStart; +#else bsBits = hBstr->next_ind - pBsStart; +#endif IGFEncConcatenateBitstream( hIGFEnc[ch], bsBits, hBstr ); } } diff --git a/lib_enc/transition_enc.c b/lib_enc/transition_enc.c index 1ba6c37852..925a6f1c32 100644 --- a/lib_enc/transition_enc.c +++ b/lib_enc/transition_enc.c @@ -178,11 +178,7 @@ void transition_enc( if ( *tc_subfr == TC_0_0 ) { /* this is called only to compute unused bits */ -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, L_FRAME, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); -#else - config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, L_FRAME, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, TC_0_0, 3, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); -#endif } *clip_gain = gp_clip( st->element_mode, st->core_brate, st->voicing, i_subfr, TRANSITION, xn, gp_cl ); @@ -278,11 +274,7 @@ void transition_enc( if ( i_subfr - *tc_subfr <= L_SUBFR ) { -#ifdef LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, st->active_cnt, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); -#else - config_acelp1( ENC, st->total_brate, st->core_brate, st->core, st->extl, st->extl_brate, st->L_frame, -1, &( st->acelp_cfg ), hBstr->nb_bits_tot, TRANSITION, *tc_subfr, 2, NULL, unbits_ACELP, st->element_mode, &i /*dummy*/, 0 /*tdm_lp_reuse_flag*/, 0 /*tdm_low_rate_mode*/, st->idchan, 0 /*tdm_Pitch_reuse_flag*/, st->tdm_LRTD_flag, 0 /*GSC_IVAS_mode*/ ); -#endif } /*-----------------------------------------------------------------* diff --git a/lib_enc/voiced_enc.c b/lib_enc/voiced_enc.c index b32692b983..18a3305902 100644 --- a/lib_enc/voiced_enc.c +++ b/lib_enc/voiced_enc.c @@ -498,7 +498,6 @@ ivas_error ppp_voiced_encoder( error = IVAS_ERR_OK; - /* TODO: deallocation missing */ if ( ( error = DTFS_new( &CURRP_NQ ) ) != IVAS_ERR_OK ) { IVAS_ERROR( error, "Error creating DTFS structure" ); diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index c05ae7c262..8a013bc715 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -447,6 +447,273 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { +#ifdef UPDATE_SBA_FILTER + if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_HOA2_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_FOA ) + { + if ( output_Fs == 48000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[j]; + } + } + else if ( output_Fs == 32000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[j]; + } + } + else if ( output_Fs == 16000 ) + { + hHrtf->latency_s = CRendBin_FOA_HRIR_latency_s; + hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz; + hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; + hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; + hHrtf->pOut_to_bin_re[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz[i][j]; + hHrtf->pOut_to_bin_im[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz[i][j]; + } + } + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_FORMAT, "Encountered unsupported input config in Crend" ); + } +#else if ( output_Fs == 48000 ) { hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; @@ -531,6 +798,7 @@ static ivas_error ivas_rend_initCrend( { return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); } +#endif } else { @@ -632,6 +900,91 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { +#ifdef UPDATE_SBA_FILTER + if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im[j]; + } + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA2 ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa2->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa2->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_im[j]; + } + } + else if ( inConfig == IVAS_REND_AUDIO_CONFIG_FOA ) + { + hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_foa->latency_s; + hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations; + hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_foa->index_frequency_max_diffuse; + + for ( i = 0; i < hHrtf->max_num_ir; i++ ) + { + hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight[i]; + + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations[i][j]; + hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max[i][j]; + hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_re[i][j]; + hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_im[i][j]; + } + } + for ( j = 0; j < BINAURAL_CHANNELS; j++ ) + { + hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations_diffuse[j]; + hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max_diffuse[j]; + hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_re[j]; + hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_im[j]; + } + } + else + { + return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); + } + } +#else hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; @@ -660,6 +1013,7 @@ static ivas_error ivas_rend_initCrend( { return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); } +#endif } pCrend->hHrtfCrend = hHrtf; @@ -736,7 +1090,6 @@ ivas_error ivas_rend_openCrend( HRTFS_CREND_HANDLE hSetOfHRTF, const int32_t output_Fs ) { - /* TODO tmu : Based on ivas_crend_open() - could be harmonized / refactored */ int16_t i, subframe_length; int16_t max_total_ir_len; HRTFS_HANDLE hHrtf; @@ -939,8 +1292,13 @@ static ivas_error ivas_rend_crendConvolver( const CREND_WRAPPER *pCrend, IVAS_REND_AudioConfig inConfig, IVAS_REND_AudioConfig outConfig, +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], + float *pcm_out[], +#else float pcm_in[][L_FRAME48k], float pcm_out[][L_FRAME48k], +#endif const int32_t output_Fs, const int16_t i_ts ) { @@ -949,9 +1307,17 @@ static ivas_error ivas_rend_crendConvolver( int16_t lfe_idx_in; int16_t offset, offset_in, offset_diffuse; int16_t nchan_in, nchan_out; +#ifdef UPDATE_SBA_FILTER + const float *pIn; +#else float *pIn; +#endif float *pFreq_buf_re, *pFreq_buf_im; +#ifdef UPDATE_SBA_FILTER + const float *pFreq_filt_re, *pFreq_filt_im; +#else float *pFreq_filt_re, *pFreq_filt_im; +#endif float pOut[L_FRAME48k * 2]; float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k]; ivas_error error; @@ -1105,12 +1471,19 @@ ivas_error ivas_rend_crendProcess( HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: input/output audio channels */ +#else float output[][L_FRAME48k], /* i/o: input/output audio channels */ +#endif const int32_t output_Fs ) { int16_t i, subframe_idx, output_frame, subframe_len; int16_t nchan_out; float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; +#ifdef JBM_TSM_ON_TCS + float *p_pcm_tmp[BINAURAL_CHANNELS]; +#endif AUDIO_CONFIG in_config; IVAS_REND_AudioConfigType inConfigType; ivas_error error; @@ -1133,6 +1506,14 @@ ivas_error ivas_rend_crendProcess( output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; + +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < BINAURAL_CHANNELS; i++ ) + { + p_pcm_tmp[i] = pcm_tmp[i]; + } +#endif + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) @@ -1156,14 +1537,22 @@ ivas_error ivas_rend_crendProcess( if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, output, p_pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, output, pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } if ( pCrend->hCrend->hReverb != NULL ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, output, p_pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, output, pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1185,3 +1574,142 @@ ivas_error ivas_rend_crendProcess( return IVAS_ERR_OK; } + + +#ifdef JBM_TSM_ON_TCS +/*-----------------------------------------------------------------------------------------* + * Function ivas_rend_crendProcessSubframe() + * + * + *-----------------------------------------------------------------------------------------*/ + +ivas_error ivas_rend_crendProcessSubframe( + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + float *input_f[], /* i : transport channels */ + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int32_t output_Fs /* i : output sampling rate */ +) +{ + int16_t subframe_idx, subframe_len; + int16_t nchan_out, nchan_in, ch, first_sf, last_sf, slot_size, slots_to_render; + float *tc_local[MAX_TRANSPORT_CHANNELS]; + float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; + float *p_pcm_tmp[BINAURAL_CHANNELS]; + AUDIO_CONFIG in_config; + IVAS_REND_AudioConfigType inConfigType; + ivas_error error; + IVAS_REND_AudioConfig inRendConfig; + IVAS_REND_AudioConfig outRendConfig; + + push_wmops( "ivas_rend_crendProcessSubframe" ); + + inRendConfig = getRendAudioConfigFromIvasAudioConfig( inConfig ); + outRendConfig = getRendAudioConfigFromIvasAudioConfig( outConfig ); + + in_config = getIvasAudioConfigFromRendAudioConfig( inRendConfig ); + inConfigType = getAudioConfigType( inRendConfig ); + + if ( ( error = getAudioConfigNumChannels( outRendConfig, &nchan_out ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( ( error = getAudioConfigNumChannels( inRendConfig, &nchan_in ) ) != IVAS_ERR_OK ) + { + return error; + } + + for ( ch = 0; ch < nchan_in; ch++ ) + { + tc_local[ch] = input_f[ch]; + } + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_pcm_tmp[ch] = pcm_tmp[ch]; + } + + slot_size = hTcBuffer->n_samples_granularity; + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hTcBuffer->num_slots - hTcBuffer->slots_rendered, n_samples_to_render / slot_size ); + first_sf = hTcBuffer->subframes_rendered; + last_sf = first_sf; + hTcBuffer->slots_rendered += slots_to_render; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hTcBuffer->subframe_nbslots[last_sf]; + last_sf++; + } + + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + subframe_len = hTcBuffer->subframe_nbslots[subframe_idx] * hTcBuffer->n_samples_granularity; + + if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) + { + /* Rotation in SHD for: + MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL + SBA SPAR -> BINAURAL or BINAURAL_ROOM + */ + if ( in_config == AUDIO_CONFIG_FOA || in_config == AUDIO_CONFIG_HOA2 || in_config == AUDIO_CONFIG_HOA3 ) + { + rotateFrame_shd( hHeadTrackData, tc_local, subframe_len, *hIntSetup, 0 ); + } + /* Rotation in SD for MC -> BINAURAL_ROOM */ + else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) + { + rotateFrame_sd( hHeadTrackData, tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 ); + } + } + + if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) + { + if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, tc_local, p_pcm_tmp, output_Fs, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( pCrend->hCrend->hReverb != NULL ) + { + if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, tc_local, p_pcm_tmp, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + } + for ( ch = 0; ch < nchan_in; ch++ ) + { + tc_local[ch] += subframe_len; + } + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_pcm_tmp[ch] += subframe_len; + } + } + else + { + return IVAS_ERR_INVALID_INPUT_FORMAT; + } + } + + /* move to output */ + for ( ch = 0; ch < nchan_out; ch++ ) + { + mvr2r( pcm_tmp[ch], output[ch], n_samples_to_render ); + } + + hTcBuffer->subframes_rendered = last_sf; + pop_wmops(); + + return IVAS_ERR_OK; +} +#endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 35819cf8cb..c3e76e7306 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -68,19 +68,30 @@ * Local function prototypes *------------------------------------------------------------------------*/ -static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], const int16_t nchan_transport, const uint8_t firstSubframe, const uint8_t nSubframes ); - -static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int8_t slot, float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport, const int16_t subframe ); +#else +static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], const int16_t nchan_transport, const int16_t subframe ); +#endif +static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const uint8_t firstSubframe, const uint8_t nSubFrames ); +static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe ); static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3] ); -static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const uint8_t numInputChannels, const uint8_t firstSlot, const uint8_t slotEnd ); +#ifdef JBM_TSM_ON_TCS +static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); + +static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); -static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); +#else +static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); -static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const uint8_t firstSlot, const uint8_t slotEnd, const uint8_t nBins, float Rmat[3][3] ); +static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); + +static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); +#endif static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); @@ -92,7 +103,6 @@ static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Ai static void matrixTransp2Mul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); -static float configure_reqularization_factor( const IVAS_FORMAT ivas_format, const int32_t ivas_brate ); /*------------------------------------------------------------------------- * ivas_dirac_dec_init_binaural_data() @@ -152,30 +162,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( set_zero( hBinaural->ChCrossImOutPrev, nBins ); hBinaural->renderStereoOutputInsteadOfBinaural = 0; - hBinaural->useSubframeMode = 1; - - hBinaural->useTdDecorr = 0; - if ( st_ivas->ivas_format == SBA_FORMAT ) - { - if ( st_ivas->nchan_transport == 1 ) - { - hBinaural->useTdDecorr = 1; - } - } - else if ( st_ivas->ivas_format == MASA_FORMAT ) - { - if ( ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) || st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) - { - hBinaural->useTdDecorr = 1; - } - } - else if ( st_ivas->ivas_format == MC_FORMAT ) - { - if ( ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_48k && st_ivas->nchan_transport == 1 ) ) - { - hBinaural->useTdDecorr = 1; - } - } for ( bin = 0; bin < nBins; bin++ ) { @@ -203,42 +189,23 @@ ivas_error ivas_dirac_dec_init_binaural_data( /* reconfiguration needed when Reverb. parameters are changed -> close and open the handle again */ if ( hBinaural->hReverb != NULL && ( ( hBinaural->hReverb->numBins != nBins ) || - ( hBinaural->useSubframeMode && hBinaural->hReverb->blockSize != CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ) || - ( !hBinaural->useSubframeMode && hBinaural->hReverb->blockSize != CLDFB_NO_COL_MAX ) ) ) + ( hBinaural->hReverb->blockSize != CLDFB_SLOTS_PER_SUBFRAME ) ) ) { ivas_binaural_reverb_close( &( hBinaural->hReverb ) ); } if ( hBinaural->hReverb == NULL ) { - if ( hBinaural->useSubframeMode ) + if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, + nBins, + CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, + st_ivas->hIntSetup.output_config, + output_Fs, + RENDERER_BINAURAL_PARAMETRIC_ROOM, + st_ivas->hHrtfFastConv, + st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) { - if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, - nBins, - CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES, NULL, - st_ivas->hIntSetup.output_config, - output_Fs, - RENDERER_BINAURAL_PARAMETRIC_ROOM, - st_ivas->hHrtfFastConv, - st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - if ( ( error = ivas_binaural_reverb_open( &hBinaural->hReverb, - nBins, - CLDFB_NO_COL_MAX, - NULL, - st_ivas->hIntSetup.output_config, - output_Fs, - RENDERER_BINAURAL_PARAMETRIC_ROOM, - st_ivas->hHrtfFastConv, - st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) - { - return error; - } + return error; } } } @@ -253,38 +220,34 @@ ivas_error ivas_dirac_dec_init_binaural_data( assert( false ); } - if ( hBinaural->useTdDecorr ) + if ( hBinaural->hTdDecorr == NULL ) { - if ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_13k2 && st_ivas->ivas_format == SBA_FORMAT ) - { - if ( hBinaural->hTdDecorr == NULL ) - { - ivas_td_decorr_dec_open( &( hBinaural->hTdDecorr ), output_Fs, 3, 1 ); - } - - if ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) - { - hBinaural->hTdDecorr->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR; - } - else - { - hBinaural->hTdDecorr->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN; - } - } - else - { - ivas_td_decorr_dec_open( &( hBinaural->hTdDecorr ), output_Fs, 3, 0 ); - } + hBinaural->useTdDecorr = 0; } - else + + if ( ( error = ivas_td_decorr_reconfig_dec( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hDecoderConfig->output_Fs, &( hBinaural->hTdDecorr ), &( hBinaural->useTdDecorr ) ) ) != IVAS_ERR_OK ) { - ivas_td_decorr_dec_close( &( hBinaural->hTdDecorr ) ); + return error; } hBinaural->reqularizationFactor = configure_reqularization_factor( st_ivas->ivas_format, st_ivas->hDecoderConfig->ivas_total_brate ); st_ivas->hDiracDecBin = hBinaural; +#ifdef JBM_TSM_ON_TCS + /* allocate transport channels*/ + if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) + { + int16_t nchan_to_allocate; + + nchan_to_allocate = 2 * BINAURAL_CHANNELS; + if ( ( error = ivas_jbm_dec_tc_buffer_open( st_ivas, TC_BUFFER_MODE_RENDERER, ivas_jbm_dec_get_num_tc_channels( st_ivas ), nchan_to_allocate, nchan_to_allocate, NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ) ) ) != IVAS_ERR_OK ) + { + return error; + } + } +#endif + return IVAS_ERR_OK; } @@ -363,6 +326,77 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs( return IVAS_ERR_OK; } + +#ifdef JBM_TSM_ON_TCS +/*------------------------------------------------------------------------- + * void ivas_dirac_dec_binaural_render() + * + * + *------------------------------------------------------------------------*/ + +void ivas_dirac_dec_binaural_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ +) +{ + int16_t slots_to_render, first_sf, last_sf, subframe_idx; + uint16_t slot_size, ch; + uint16_t nchan_out; + DIRAC_DEC_HANDLE hDirAC; + float *output_f_local[MAX_OUTPUT_CHANNELS]; + + hDirAC = st_ivas->hDirAC; + nchan_out = BINAURAL_CHANNELS; +#ifdef DEBUGGING + assert( hDirAC ); +#endif + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] = output_f[ch]; + } + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + + /* loop for synthesis, assume we always have to render in multiples of 5ms subframes with spills */ + slots_to_render = min( hDirAC->num_slots - hDirAC->slots_rendered, nSamplesAsked / slot_size ); + *nSamplesRendered = slots_to_render * slot_size; + first_sf = hDirAC->subframes_rendered; + last_sf = first_sf; + + while ( slots_to_render > 0 ) + { + slots_to_render -= hDirAC->subframe_nbslots[last_sf]; + last_sf++; + } + +#ifdef DEBUGGING + assert( slots_to_render == 0 ); +#endif + for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) + { + int16_t n_samples_sf = slot_size * hDirAC->subframe_nbslots[subframe_idx]; + ivas_dirac_dec_binaural_internal( st_ivas, output_f_local, nchan_transport, subframe_idx ); + for ( ch = 0; ch < nchan_out; ch++ ) + { + output_f_local[ch] += n_samples_sf; + } + } + + if ( hDirAC->slots_rendered == hDirAC->num_slots ) + { + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % st_ivas->hDirAC->dirac_md_buffer_length; + } + + *nSamplesAvailable = ( hDirAC->num_slots - hDirAC->slots_rendered ) * slot_size; + + return; +} +#endif + + /*------------------------------------------------------------------------- * ivas_dirac_dec_binaural() * @@ -375,33 +409,97 @@ void ivas_dirac_dec_binaural( const int16_t nchan_transport /* i : number of transport channels */ ) { + int16_t subframe; +#ifdef JBM_TSM_ON_TCS + float cng_td_buffer[L_FRAME16k]; + float *p_output[MAX_OUTPUT_CHANNELS]; + int16_t ch; + int16_t slot_size; + int16_t numInChannels; + + slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) + { + p_output[ch] = &output_f[ch][0]; + } + numInChannels = nchan_transport; + if ( st_ivas->hOutSetup.separateChannelEnabled ) + { + numInChannels++; + } + for ( ch = 0; ch < numInChannels; ch++ ) + { + st_ivas->hTcBuffer->tc[ch] = &output_f[ch][0]; + } + + ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif + { + ivas_spar_dec_set_render_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); + } +#endif + if ( st_ivas->hDiracDecBin->useTdDecorr ) { float *decorr_signal[BINAURAL_CHANNELS]; +#ifndef JBM_TSM_ON_TCS int16_t ch; +#endif int16_t output_frame; for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { decorr_signal[ch] = (float *) &( output_f[ch + BINAURAL_CHANNELS][0] ); +#ifdef JBM_TSM_ON_TCS + st_ivas->hTcBuffer->tc[ch + BINAURAL_CHANNELS] = decorr_signal[ch]; +#endif } output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); +#ifdef JBM_TSM_ON_TCS + ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); + +#else ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame ); +#endif } - if ( st_ivas->hDiracDecBin->useSubframeMode ) +#ifdef JBM_TSM_ON_TCS + if ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) { - uint8_t subframe; - for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) + Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; + st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; + generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[nchan_transport], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); + } +#endif + + for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) + { +#ifdef JBM_TSM_ON_TCS + int16_t n_samples_sf = slot_size * st_ivas->hDirAC->subframe_nbslots[subframe]; + + ivas_dirac_dec_binaural_internal( st_ivas, p_output, nchan_transport, subframe ); + + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { - ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe, 1u ); + p_output[ch] += n_samples_sf; } + st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + 1 ) % st_ivas->hDirAC->dirac_md_buffer_length; +#else + ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe ); +#endif } - else + +#ifdef JBM_TSM_ON_TCS + for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { - ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, 0u, (uint8_t) MAX_PARAM_SPATIAL_SUBFRAMES ); + st_ivas->hTcBuffer->tc[ch] = NULL; } +#endif return; } @@ -411,27 +509,33 @@ void ivas_dirac_dec_binaural( * Local functions *------------------------------------------------------------------------*/ + static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, +#ifdef JBM_TSM_ON_TCS + float *output_f[], +#else float output_f[][L_FRAME48k], +#endif const int16_t nchan_transport, - const uint8_t firstSubframe, - const uint8_t nSubframes ) + const int16_t subframe ) { DIRAC_DEC_HANDLE hDirAC; - uint8_t slot, ch, nBins, numInChannels; - float Cldfb_RealBuffer_in[4][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_in[4][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + int16_t slot, ch, numInChannels; + float Cldfb_RealBuffer_in[4][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float Cldfb_ImagBuffer_in[4][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float Rmat[3][3]; - uint8_t firstSlot, slotEnd; int16_t max_band_decorr; DIFFUSE_DISTRIBUTION_DATA diffuseDistData; - - firstSlot = firstSubframe * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); - slotEnd = ( firstSubframe + nSubframes ) * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); + int16_t nBins, offsetSamples; hDirAC = st_ivas->hDirAC; - nBins = (uint8_t) hDirAC->num_freq_bands; + nBins = hDirAC->num_freq_bands; +#ifdef JBM_TSM_ON_TCS + offsetSamples = hDirAC->slots_rendered * nBins; +#else + offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins; +#endif /* The input channel number at this processing function (not nchan_transport) */ numInChannels = BINAURAL_CHANNELS; @@ -453,16 +557,25 @@ static void ivas_dirac_dec_binaural_internal( Rmat[2][2] = 1.0f; /* CLDFB Analysis of input */ - for ( slot = firstSlot; slot < slotEnd; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) +#else + for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { for ( ch = 0; ch < numInChannels; ch++ ) { if ( ch == 0 || nchan_transport == 2 ) { - cldfbAnalysis_ts( &( output_f[ch][nBins * slot] ), - Cldfb_RealBuffer_in[ch][slot], - Cldfb_ImagBuffer_in[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch] ); + cldfbAnalysis_ts( +#ifdef JBM_TSM_ON_TCS + &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ), +#else + &( output_f[ch][nBins * slot + offsetSamples] ), +#endif + Cldfb_RealBuffer_in[ch][slot], + Cldfb_ImagBuffer_in[ch][slot], + nBins, st_ivas->cldfbAnaDec[ch] ); } else if ( st_ivas->nchan_transport == 2 ) /* Stereo signal transmitted as mono with DFT stereo */ { @@ -476,14 +589,24 @@ static void ivas_dirac_dec_binaural_internal( if ( st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) { int16_t numCoreBands, b; + int16_t slotInFrame; numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; +#ifdef JBM_TSM_ON_TCS + slotInFrame = hDirAC->slots_rendered + slot; +#else + slotInFrame = subframe * CLDFB_SLOTS_PER_SUBFRAME + slot; +#endif generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], +#ifdef JBM_TSM_ON_TCS + st_ivas->hTcBuffer->tc[nchan_transport], +#else &( output_f[1][L_FRAME48k - L_FRAME16k] ), /*used as temporary static buffer for the whole frame*/ +#endif Cldfb_RealBuffer_in[2][slot], Cldfb_ImagBuffer_in[2][slot], - slot, + slotInFrame, st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); @@ -491,7 +614,7 @@ static void ivas_dirac_dec_binaural_internal( st_ivas->cldfbAnaDec[1], /*nothing will be analyzed, just get cnst*/ NULL, Cldfb_RealBuffer_in[1][slot], Cldfb_ImagBuffer_in[1][slot], - slot, + slotInFrame, st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, ( st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == FRAME_NO_DATA || st_ivas->hSCE[0]->hCoreCoder[0]->core_brate == SID_2k40 ) && ( st_ivas->hSCE[0]->hCoreCoder[0]->cng_type == FD_CNG ) && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ); @@ -533,10 +656,15 @@ static void ivas_dirac_dec_binaural_internal( { for ( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) { - cldfbAnalysis_ts( &( output_f[ch][nBins * slot] ), - Cldfb_RealBuffer_in[ch][slot], - Cldfb_ImagBuffer_in[ch][slot], - nBins, st_ivas->cldfbAnaDec[ch] ); + cldfbAnalysis_ts( +#ifdef JBM_TSM_ON_TCS + &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ), +#else + &( output_f[ch][nBins * slot + offsetSamples] ), +#endif + Cldfb_RealBuffer_in[ch][slot], + Cldfb_ImagBuffer_in[ch][slot], + nBins, st_ivas->cldfbAnaDec[ch] ); if ( st_ivas->nchan_transport == 1 && st_ivas->ivas_format == SBA_FORMAT ) { @@ -547,28 +675,38 @@ static void ivas_dirac_dec_binaural_internal( } } +#ifndef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT ) +#endif { st_ivas->hDirAC->hDiffuseDist = &diffuseDistData; - ivas_spar_param_to_masa_param_mapping( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSubframe, nSubframes ); + ivas_spar_param_to_masa_param_mapping( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe ); - ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSubframe, nSubframes ); + ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe ); } if ( st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) { - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[firstSubframe], Rmat ); + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[subframe], Rmat ); if ( nchan_transport == 2 ) { - adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, firstSlot, slotEnd, nBins, Rmat ); +#ifdef JBM_TSM_ON_TCS + adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); + + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); +#else + adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); - ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, firstSlot, slotEnd, nBins, Rmat ); + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); +#endif } } - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, firstSubframe, nSubframes ); + ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe ); if ( st_ivas->ivas_format == ISM_FORMAT ) { @@ -585,19 +723,27 @@ static void ivas_dirac_dec_binaural_internal( ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat ); - ivas_dirac_dec_binaural_process_output( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, firstSlot, slotEnd ); + ivas_dirac_dec_binaural_process_output( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, subframe ); st_ivas->hDirAC->hDiffuseDist = NULL; + +#ifdef JBM_TSM_ON_TCS + hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe]; + hDirAC->subframes_rendered++; +#else + hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; +#endif + return; } static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, - const int8_t slot, - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + const int16_t slot, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ) { @@ -644,16 +790,18 @@ static void ivas_dirac_dec_decorrelate_slot( return; } +#ifdef JBM_TSM_ON_TCS +#endif + static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], - const uint8_t firstSubframe, - const uint8_t nSubframes ) + const int16_t subframe ) { - uint8_t ch, slot, bin, subframe; + int16_t ch, slot, bin; uint8_t separateCenterChannelRendering; int16_t nBins, idx; float frameMeanDiffusenessEneWeight[CLDFB_NO_CHANNELS_MAX]; @@ -664,6 +812,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric float lowBitRateEQ[CLDFB_NO_CHANNELS_MAX]; uint8_t applyLowBitRateEQ; int16_t dirac_read_idx; + float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; hDirAC = st_ivas->hDirAC; h = st_ivas->hDiracDecBin; @@ -704,282 +853,291 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } } - /* Formulate input and target covariance matrices combining all subframes */ - for ( subframe = firstSubframe; subframe < ( firstSubframe + nSubframes ); subframe++ ) + /* Formulate input and target covariance matrices for this subframe */ + set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); +#ifdef JBM_TSM_ON_TCS + dirac_read_idx = hDirAC->render_to_md_map[subframe]; +#else + dirac_read_idx = hDirAC->dirac_read_idx; +#endif + + /* Calculate input covariance matrix */ +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) +#else + for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) +#endif + { + for ( bin = 0; bin < nBins; bin++ ) + { + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + float instEne; + + instEne = ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ); + instEne += ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); + h->ChEne[ch][bin] += instEne; + subFrameTotalEne[bin] += instEne; + } + h->ChCrossRe[bin] += inRe[0][slot][bin] * inRe[1][slot][bin]; + h->ChCrossRe[bin] += inIm[0][slot][bin] * inIm[1][slot][bin]; + h->ChCrossIm[bin] += inRe[0][slot][bin] * inIm[1][slot][bin]; + h->ChCrossIm[bin] -= inIm[0][slot][bin] * inRe[1][slot][bin]; + } + } + + /* Apply EQ at low bit rates */ + if ( applyLowBitRateEQ ) + { + int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; + + for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) + { + subFrameTotalEne[bin] *= lowBitRateEQ[bin]; + } + for ( ; bin < nBins; bin++ ) + { + subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin]; + } + } + + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 ) { - float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; + float tempRe, tempIm; set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); - dirac_read_idx = hDirAC->dirac_read_idx; - /* Calculate input covariance matrix */ - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) +#else + for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) +#endif { - int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe ); - for ( bin = 0; bin < nBins; bin++ ) { - for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) - { - float instEne; - - instEne = ( inRe[ch][slotThis][bin] * inRe[ch][slotThis][bin] ); - instEne += ( inIm[ch][slotThis][bin] * inIm[ch][slotThis][bin] ); - h->ChEne[ch][bin] += instEne; - subFrameTotalEne[bin] += instEne; - } - h->ChCrossRe[bin] += inRe[0][slotThis][bin] * inRe[1][slotThis][bin]; - h->ChCrossRe[bin] += inIm[0][slotThis][bin] * inIm[1][slotThis][bin]; - h->ChCrossIm[bin] += inRe[0][slotThis][bin] * inIm[1][slotThis][bin]; - h->ChCrossIm[bin] -= inIm[0][slotThis][bin] * inRe[1][slotThis][bin]; + tempRe = inRe[0][slot][bin] + inRe[1][slot][bin]; + tempIm = inIm[0][slot][bin] + inIm[1][slot][bin]; + subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm; } } + } - /* Apply EQ at low bit rates */ - if ( applyLowBitRateEQ ) + /* Determine target covariance matrix containing target binaural properties */ + for ( bin = 0; bin < nBins; bin++ ) + { + float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ + float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ + float diffEne, dirEne, meanEnePerCh; + int16_t dirIndex; + + /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. + * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the + * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match + * the early spectrum of the BRIR data, using the spectral correction data in + * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ + meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f; + + /* Determine direct part target covariance matrix (for 1 or 2 directions) */ + for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ ) { - int16_t lastEqBin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET + LOW_BIT_RATE_BINAURAL_EQ_BINS - 1; + int16_t aziDeg, eleDeg; + float lRealp, lImagp, rRealp, rImagp; + float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp; + float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio; - for ( bin = LOW_BIT_RATE_BINAURAL_EQ_OFFSET; bin < lastEqBin; bin++ ) + if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ { - subFrameTotalEne[bin] *= lowBitRateEQ[bin]; + aziDeg = hDirAC->azimuth[dirac_read_idx][bin]; + eleDeg = hDirAC->elevation[dirac_read_idx][bin]; + ratio = hDirAC->energy_ratio1[dirac_read_idx][bin]; + spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin]; } - for ( ; bin < nBins; bin++ ) + else /* For second of the two simultaneous directions */ { - subFrameTotalEne[bin] *= lowBitRateEQ[lastEqBin]; + aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; + eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; + ratio = hDirAC->energy_ratio2[dirac_read_idx][bin]; + spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin]; } - } - - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 2 ) - { - float tempRe, tempIm; - - set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); + diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ - for ( slot = 0; slot < (uint8_t) hDirAC->subframe_nbslots; slot++ ) + if ( separateCenterChannelRendering ) { - int16_t slotThis = slot + ( hDirAC->subframe_nbslots * subframe ); - - for ( bin = 0; bin < nBins; bin++ ) - { - tempRe = inRe[0][slotThis][bin] + inRe[1][slotThis][bin]; - tempIm = inIm[0][slotThis][bin] + inIm[1][slotThis][bin]; - subFrameTotalEne[bin] += tempRe * tempRe + tempIm * tempIm; - } + /* In masa + mono rendering mode, the center directions originate from phantom sources, so the + * spread coherence is increased */ + float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh; + + aziRad = (float) aziDeg * PI_OVER_180; + eleRad = (float) eleDeg * PI_OVER_180; + doaVectorX = cosf( aziRad ) * cosf( eleRad ); + spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI; + altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f ); + spreadCoh = max( spreadCoh, altSpreadCoh ); } - } - /* Determine target covariance matrix containing target binaural properties */ - for ( bin = 0; bin < nBins; bin++ ) - { - float diffuseness = 1.0f; /* ratio1 and ratio2 are subtracted from diffuseness further below */ - float surCoh = 0.0f, spreadCoh = 0.0f; /* Default values if spreadSurroundCoherenceApplied == false */ - float diffEne, dirEne, meanEnePerCh; - uint16_t dirIndex; - - /* When BINAURAL_ROOM is not indicated, hBinaural->earlyPartEneCorrection[bin] values are all 1.0f. - * When BINAURAL_ROOM is indicated, the binaural audio output is based on combined use of the - * HRTF data set and a BRIR-based data set. The HRTF data set is spectrally corrected to match - * the early spectrum of the BRIR data, using the spectral correction data in - * hBinaural->earlyPartEneCorrection[bin], based on the BRIR set. */ - meanEnePerCh = h->earlyPartEneCorrection[bin] * subFrameTotalEne[bin] / 2.0f; + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - /* Determine direct part target covariance matrix (for 1 or 2 directions) */ - for ( dirIndex = 0; dirIndex < hDirAC->numSimultaneousDirections; dirIndex++ ) + if ( h->renderStereoOutputInsteadOfBinaural ) { - int16_t aziDeg, eleDeg; - float lRealp, lImagp, rRealp, rImagp; - float lRealpTmp, lImagpTmp, rRealpTmp, rImagpTmp; - float hrtfEne[BINAURAL_CHANNELS], hrtfCrossRe, hrtfCrossIm, ratio; + /* Synthesizing spread coherence is not needed for stereo loudspeaker output, + * as directional sound is reproduced with two loudspeakers in any case */ + spreadCoh = 0.0f; + } - if ( dirIndex == 0 ) /* For first of the two simultaneous directions */ + if ( spreadCoh > 0.0f ) + { + float centerMul, sidesMul; + float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor; + float w1, w2, w3, eq; + + hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); + + /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. + * The following formulas determine the gains for these sources. + * spreadCoh = 0: Only panning + * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) + * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ + if ( spreadCoh < 0.5f ) { - aziDeg = hDirAC->azimuth[dirac_read_idx][bin]; - eleDeg = hDirAC->elevation[dirac_read_idx][bin]; - ratio = hDirAC->energy_ratio1[dirac_read_idx][bin]; - spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin]; + /* 0.0f < spreadCoh < 0.5f */ + sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */ + centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul; } - else /* For second of the two simultaneous directions */ + else { - aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; - eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; - ratio = hDirAC->energy_ratio2[dirac_read_idx][bin]; - spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin]; + /* 0.5f <= spreadCoh < 1.0f */ + centerMul = 2.0f - ( 2.0f * spreadCoh ); + sidesMul = inv_sqrt( centerMul + 2.0f ); + centerMul *= sidesMul; } - diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ - if ( separateCenterChannelRendering ) + /* Apply the gain for the center source of the three coherent sources */ + lRealp *= centerMul; + lImagp *= centerMul; + rRealp *= centerMul; + rImagp *= centerMul; + + /* Apply the gain for the left source of the three coherent sources */ + getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); + + hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); + lRealp += sidesMul * lRealpTmp; + lImagp += sidesMul * lImagpTmp; + rRealp += sidesMul * rRealpTmp; + rImagp += sidesMul * rImagpTmp; + + /* Apply the gain for the right source of the three coherent sources. + * -30 degrees to 330 wrapping due to internal functions. */ + getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); + + hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); + lRealp += sidesMul * lRealpTmp; + lImagp += sidesMul * lImagpTmp; + rRealp += sidesMul * rRealpTmp; + rImagp += sidesMul * rImagpTmp; + + /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ + hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); + eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) + + ( hrtfEneCenter * centerMul * centerMul ) ) / + max( 1e-12f, hrtfEneRealized ); + + /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ + if ( spreadCoh < 0.5 ) { - /* In masa + mono rendering mode, the center directions originate from phantom sources, so the - * spread coherence is increased */ - float aziRad, eleRad, doaVectorX, spatialAngleDeg, altSpreadCoh; - - aziRad = (float) aziDeg * PI_OVER_180; - eleRad = (float) eleDeg * PI_OVER_180; - doaVectorX = cosf( aziRad ) * cosf( eleRad ); - spatialAngleDeg = acosf( doaVectorX ) * _180_OVER_PI; - altSpreadCoh = 1.0f - ( spatialAngleDeg / 30.0f ); - spreadCoh = max( spreadCoh, altSpreadCoh ); + w1 = 1.0f - 2.0f * spreadCoh; + w2 = 2.0f * spreadCoh; + w3 = 0.0f; } - - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - if ( h->renderStereoOutputInsteadOfBinaural ) + else { - /* Synthesizing spread coherence is not needed for stereo loudspeaker output, - * as directional sound is reproduced with two loudspeakers in any case */ - spreadCoh = 0.0f; + w1 = 0.0f; + w2 = 2.0f - 2.0f * spreadCoh; + w3 = 2.0f * spreadCoh - 1.0f; } - if ( spreadCoh > 0.0f ) + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) { - float centerMul, sidesMul; - float hrtfEneCenter, hrtfEneSides, hrtfEneRealized, eneCorrectionFactor; - float w1, w2, w3, eq; - - hrtfEneCenter = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); - - /* Spread coherence is synthesized as coherent sources at 30 degree horizontal spacing. - * The following formulas determine the gains for these sources. - * spreadCoh = 0: Only panning - * spreadCoh = 0.5: Three sources coherent panning (e.g. 30 0 -30 deg azi) - * spreadCoh = 1.0: Two sources coherent panning with gap (as above, but center is silent) */ - if ( spreadCoh < 0.5f ) - { - /* 0.0f < spreadCoh < 0.5f */ - sidesMul = 0.5774f * spreadCoh * 2.0f; /* sqrt(1/3) = 0.5774f */ - centerMul = 1.0f - ( spreadCoh * 2.0f ) + sidesMul; - } - else - { - /* 0.5f <= spreadCoh < 1.0f */ - centerMul = 2.0f - ( 2.0f * spreadCoh ); - sidesMul = inv_sqrt( centerMul + 2.0f ); - centerMul *= sidesMul; - } + idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - /* Apply the gain for the center source of the three coherent sources */ - lRealp *= centerMul; - lImagp *= centerMul; - rRealp *= centerMul; - rImagp *= centerMul; - - /* Apply the gain for the left source of the three coherent sources */ - getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); - lRealp += sidesMul * lRealpTmp; - lImagp += sidesMul * lImagpTmp; - rRealp += sidesMul * rRealpTmp; - rImagp += sidesMul * rImagpTmp; - - /* Apply the gain for the right source of the three coherent sources. - * -30 degrees to 330 wrapping due to internal functions. */ - getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); - - hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); - lRealp += sidesMul * lRealpTmp; - lImagp += sidesMul * lImagpTmp; - rRealp += sidesMul * rRealpTmp; - rImagp += sidesMul * rImagpTmp; - - /* Formulate an eneCorrectionFactor that compensates for the coherent summation of the HRTFs */ - hrtfEneRealized = ( lRealp * lRealp ) + ( lImagp * lImagp ) + ( rRealp * rRealp ) + ( rImagp * rImagp ); - eneCorrectionFactor = ( ( hrtfEneSides * sidesMul * sidesMul ) + - ( hrtfEneCenter * centerMul * centerMul ) ) / - max( 1e-12f, hrtfEneRealized ); - - /* Weighting factors to determine appropriate target spectrum for spread coherent sound */ - if ( spreadCoh < 0.5 ) + /* Apply the target spectrum to the eneCorrectionFactor */ + if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ { - w1 = 1.0f - 2.0f * spreadCoh; - w2 = 2.0f * spreadCoh; - w3 = 0.0f; + eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx]; } else { - w1 = 0.0f; - w2 = 2.0f - 2.0f * spreadCoh; - w3 = 2.0f * spreadCoh - 1.0f; + eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx]; } - - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) - { - idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - - /* Apply the target spectrum to the eneCorrectionFactor */ - if ( separateCenterChannelRendering ) /* spreadCoh mostly originates from phantom sources in separate channel rendering mode */ - { - eneCorrectionFactor *= w1 * 1.0f + ( w2 + w3 ) * spreadCohEne1[idx]; - } - else - { - eneCorrectionFactor *= w1 * 1.0f + w2 * spreadCohEne05[idx] + w3 * spreadCohEne1[idx]; - } - } - - /* Equalize the spread coherent combined HRTFs */ - eq = min( 4.0f, sqrtf( eneCorrectionFactor ) ); - lRealp *= eq; - lImagp *= eq; - rRealp *= eq; - rImagp *= eq; } - hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp ); - hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp ); - hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp ); - hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp ); - - /* Add direct part (1 or 2) covariance matrix */ - dirEne = ratio * meanEnePerCh; - h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/ - h->ChEneOut[1][bin] += dirEne * hrtfEne[1]; - h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */ - h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */ + /* Equalize the spread coherent combined HRTFs */ + eq = min( 4.0f, sqrtf( eneCorrectionFactor ) ); + lRealp *= eq; + lImagp *= eq; + rRealp *= eq; + rImagp *= eq; } - /* Add diffuse / ambient part covariance matrix */ - diffuseness = max( 0.0f, diffuseness ); - diffEne = diffuseness * meanEnePerCh; - surCoh = hDirAC->surroundingCoherence[dirac_read_idx][bin]; - if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + hrtfEne[0] = ( lRealp * lRealp ) + ( lImagp * lImagp ); + hrtfEne[1] = ( rRealp * rRealp ) + ( rImagp * rImagp ); + hrtfCrossRe = ( lRealp * rRealp ) + ( lImagp * rImagp ); + hrtfCrossIm = ( -lImagp * rRealp ) + ( lRealp * rImagp ); + + /* Add direct part (1 or 2) covariance matrix */ + dirEne = ratio * meanEnePerCh; + h->ChEneOut[0][bin] += dirEne * hrtfEne[0]; /* Dir ene part*/ + h->ChEneOut[1][bin] += dirEne * hrtfEne[1]; + h->ChCrossReOut[bin] += dirEne * hrtfCrossRe; /* Dir cross re */ + h->ChCrossImOut[bin] += dirEne * hrtfCrossIm; /* Dir cross im */ + } + + /* Add diffuse / ambient part covariance matrix */ + diffuseness = max( 0.0f, diffuseness ); + diffEne = diffuseness * meanEnePerCh; + surCoh = hDirAC->surroundingCoherence[dirac_read_idx][bin]; + if ( ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) + { + if ( !h->renderStereoOutputInsteadOfBinaural ) { - if ( !h->renderStereoOutputInsteadOfBinaural ) - { - idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); - /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ - diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; - } + idx = min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); + /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ + diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; } - h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/ - h->ChEneOut[1][bin] += diffEne; + } + h->ChEneOut[0][bin] += diffEne; /* Diff ene part*/ + h->ChEneOut[1][bin] += diffEne; - if ( h->renderStereoOutputInsteadOfBinaural ) + if ( h->renderStereoOutputInsteadOfBinaural ) + { + /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ + h->ChCrossReOut[bin] += surCoh * diffEne; + } + else /* When rendering binaural, ambience has frequency dependent ICC. */ + { +#ifndef SBA_MODE_CLEAN_UP + if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) +#else + if ( st_ivas->ivas_format == SBA_FORMAT && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) +#endif { - /* When rendering stereo, ambience (except for surround coherent sound) has zero ICC. */ - h->ChCrossReOut[bin] += surCoh * diffEne; + float diffuseFieldCoherence; +#ifdef JBM_TSM_ON_TCS + diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[bin] * h->diffuseFieldCoherenceZ[bin]; +#else + diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin]; +#endif + h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; } - else /* When rendering binaural, ambience has frequency dependent ICC. */ + else { - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) - { - float diffuseFieldCoherence; - diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin]; - h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; - } - else - { - h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne; - } + h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * h->diffuseFieldCoherence[bin] + surCoh ) * diffEne; } - - /* Store parameters for formulating average diffuseness over frame */ - h->frameMeanDiffuseness[bin] += diffEne; - frameMeanDiffusenessEneWeight[bin] += meanEnePerCh; } - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; + /* Store parameters for formulating average diffuseness over frame */ + h->frameMeanDiffuseness[bin] += diffEne; + frameMeanDiffusenessEneWeight[bin] += meanEnePerCh; } /* Formulate average diffuseness over frame */ @@ -999,11 +1157,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Temporal IIR-type smoothing of covariance matrices */ if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) { - IIReneLimiterFactor = 16.0f / (float) nSubframes + ( 1.0f - qualityBasedSmFactor ); + IIReneLimiterFactor = 16.0f + ( 1.0f - qualityBasedSmFactor ); } else { - IIReneLimiterFactor = 8.0f / (float) nSubframes + ( 1.0f - qualityBasedSmFactor ); + IIReneLimiterFactor = 8.0f + ( 1.0f - qualityBasedSmFactor ); } for ( bin = 0; bin < nBins; bin++ ) { @@ -1059,7 +1217,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( const int16_t max_band_decorr, float Rmat[3][3] ) { - uint8_t chA, chB, bin; + int16_t chA, chB, bin; uint8_t separateCenterChannelRendering; int16_t nBins; DIRAC_DEC_BIN_HANDLE h; @@ -1224,40 +1382,63 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, +#ifdef JBM_TSM_ON_TCS + float *output_f[], +#else float output_f[][L_FRAME48k], - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], +#endif + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, - const uint8_t numInChannels, - const uint8_t firstSlot, - const uint8_t slotEnd ) + const int16_t numInChannels, + const int16_t subframe ) { - uint8_t slot, bin, chA, chB; + int16_t slot, bin, chA, chB; int16_t nBins; float outSlotRe[CLDFB_NO_CHANNELS_MAX], outSlotIm[CLDFB_NO_CHANNELS_MAX]; float decSlotRe[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX], decSlotIm[BINAURAL_CHANNELS][CLDFB_NO_CHANNELS_MAX]; - float reverbRe[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - float reverbIm[BINAURAL_CHANNELS][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; - uint8_t numSlots; + float reverbRe[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; + float reverbIm[BINAURAL_CHANNELS][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; DIRAC_DEC_BIN_HANDLE h; float interpVal; float *decSlotRePointer; float *decSlotImPointer; + int16_t offsetSamples; +#ifdef JBM_TSM_ON_TCS + int16_t nSlots; +#endif - numSlots = slotEnd - firstSlot; h = st_ivas->hDiracDecBin; nBins = st_ivas->hDirAC->num_freq_bands; +#ifdef JBM_TSM_ON_TCS + offsetSamples = 0; + nSlots = st_ivas->hDirAC->subframe_nbslots[subframe]; +#else + offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins; +#endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { /* Process second / room effect part of binaural output when needed */ - ivas_binaural_reverb_processFrame( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm, firstSlot ); +#ifdef JBM_TSM_ON_TCS + ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, nSlots, inRe, inIm, reverbRe, reverbIm ); +#else + ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm ); +#endif } interpVal = 0.0f; - for ( slot = firstSlot; slot < ( firstSlot + numSlots ); slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else + for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { - interpVal += 1.0f / (float) numSlots; +#ifdef JBM_TSM_ON_TCS + interpVal += 1.0f / (float) nSlots; +#else + interpVal += 1.0f / ( (float) CLDFB_SLOTS_PER_SUBFRAME ); +#endif if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) { ivas_dirac_dec_decorrelate_slot( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); @@ -1326,7 +1507,7 @@ static void ivas_dirac_dec_binaural_process_output( outSlotImPr = &( outSlotIm[0] ); /* Inverse filter bank */ - cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot] ), nBins, st_ivas->cldfbSynDec[chA] ); + cldfbSynthesis( &outSlotRePr, &outSlotImPr, &( output_f[chA][nBins * slot + offsetSamples] ), nBins, st_ivas->cldfbSynDec[chA] ); } } @@ -1336,17 +1517,19 @@ static void ivas_dirac_dec_binaural_process_output( static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const uint8_t firstSlot, - const uint8_t slotEnd, - const uint8_t nBins, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, +#ifdef JBM_TSM_ON_TCS + const int16_t nSlots, +#endif float Rmat[3][3] ) { int16_t slot, ch, bin, louderCh; float ILD, mono_factor_ILD, mono_factor_rotation, mono_factor, y_val, ene_proc, ene_target; - uint8_t n_slots_per_sf, sf_idx, n_sf; int16_t max_band; + float eqVal; + int16_t band_idx, bin_lo, bin_hi; /* Determine head-orientation-based mono factor. Rmat[1][1] entry informs how close the ears are aligned according to transport signals. */ @@ -1356,8 +1539,6 @@ static void adaptTransportSignalsHeadtracked( /* Adapt transport signals in frequency bands */ /* optimization grouping CLDFB bins into MASA bands (they are readily available in ROM and suitable for the task) AND group CLDFB slots into sub-frames */ - n_slots_per_sf = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; - n_sf = ( slotEnd - firstSlot ) / n_slots_per_sf; max_band = 0; while ( max_band < MASA_FREQUENCY_BANDS && MASA_band_grouping_24[max_band] < nBins ) @@ -1365,94 +1546,96 @@ static void adaptTransportSignalsHeadtracked( max_band++; } - for ( sf_idx = 0; sf_idx < n_sf; sf_idx++ ) + for ( band_idx = 0; band_idx < max_band; band_idx++ ) { - float eqVal; - uint8_t start_slot, stop_slot; - int16_t band_idx, bin_lo, bin_hi; - - start_slot = firstSlot + sf_idx * n_slots_per_sf; - stop_slot = start_slot + n_slots_per_sf; - - for ( band_idx = 0; band_idx < max_band; band_idx++ ) + float ch_nrg[2]; /* storage for input signal channel energies */ + bin_lo = MASA_band_grouping_24[band_idx]; + bin_hi = min( MASA_band_grouping_24[band_idx + 1], (int16_t) nBins ); + for ( ch = 0; ch < 2; ch++ ) { - float ch_nrg[2]; /* storage for input signal channel energies */ - bin_lo = MASA_band_grouping_24[band_idx]; - bin_hi = min( MASA_band_grouping_24[band_idx + 1], (int16_t) nBins ); - for ( ch = 0; ch < 2; ch++ ) + ch_nrg[ch] = 0.0f; +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else + for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { - ch_nrg[ch] = 0.0f; - for ( slot = start_slot; slot < stop_slot; slot++ ) + for ( bin = bin_lo; bin < bin_hi; bin++ ) { - for ( bin = bin_lo; bin < bin_hi; bin++ ) - { - ch_nrg[ch] += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); - } + ch_nrg[ch] += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); } - hHeadTrackData->chEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; - hHeadTrackData->chEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch]; } + hHeadTrackData->chEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; + hHeadTrackData->chEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch]; + } - /* Determine ILD */ - ILD = fabsf( 10.0f * log10f( fmaxf( 1e-12f, hHeadTrackData->chEneIIR[0][band_idx] ) / fmaxf( 1e-12f, hHeadTrackData->chEneIIR[1][band_idx] ) ) ); - if ( hHeadTrackData->chEneIIR[1][band_idx] > hHeadTrackData->chEneIIR[0][band_idx] ) - { - louderCh = 1; - } - else - { - louderCh = 0; - } + /* Determine ILD */ + ILD = fabsf( 10.0f * log10f( fmaxf( 1e-12f, hHeadTrackData->chEneIIR[0][band_idx] ) / fmaxf( 1e-12f, hHeadTrackData->chEneIIR[1][band_idx] ) ) ); + if ( hHeadTrackData->chEneIIR[1][band_idx] > hHeadTrackData->chEneIIR[0][band_idx] ) + { + louderCh = 1; + } + else + { + louderCh = 0; + } - /* Determine ILD-based mono factor */ - mono_factor_ILD = ( ILD - ADAPT_HTPROTO_ILD_LIM_DB0 ) / ( ADAPT_HTPROTO_ILD_LIM_DB1 - ADAPT_HTPROTO_ILD_LIM_DB0 ); - mono_factor_ILD = fmaxf( 0.0f, fminf( 1.0f, mono_factor_ILD ) ); + /* Determine ILD-based mono factor */ + mono_factor_ILD = ( ILD - ADAPT_HTPROTO_ILD_LIM_DB0 ) / ( ADAPT_HTPROTO_ILD_LIM_DB1 - ADAPT_HTPROTO_ILD_LIM_DB0 ); + mono_factor_ILD = fmaxf( 0.0f, fminf( 1.0f, mono_factor_ILD ) ); - /* Combine mono factors */ - mono_factor = mono_factor_ILD * mono_factor_rotation; + /* Combine mono factors */ + mono_factor = mono_factor_ILD * mono_factor_rotation; - /* Mix original audio and sum signal according to determined mono factor */ - for ( ch = 0; ch < 2; ch++ ) + /* Mix original audio and sum signal according to determined mono factor */ + for ( ch = 0; ch < 2; ch++ ) + { + if ( ch != louderCh ) { - if ( ch != louderCh ) - { - float band_nrg = 0.0f; + float band_nrg = 0.0f; - for ( slot = start_slot; slot < stop_slot; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else + for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif + { + for ( bin = bin_lo; bin < bin_hi; bin++ ) { - for ( bin = bin_lo; bin < bin_hi; bin++ ) - { - /* mono sum signal with the computed weight + rest from the original channel */ - inRe[ch][slot][bin] = mono_factor * ( inRe[0][slot][bin] + inRe[1][slot][bin] ) + ( 1.0f - mono_factor ) * inRe[ch][slot][bin]; - inIm[ch][slot][bin] = mono_factor * ( inIm[0][slot][bin] + inIm[1][slot][bin] ) + ( 1.0f - mono_factor ) * inIm[ch][slot][bin]; - band_nrg += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); - } + /* mono sum signal with the computed weight + rest from the original channel */ + inRe[ch][slot][bin] = mono_factor * ( inRe[0][slot][bin] + inRe[1][slot][bin] ) + ( 1.0f - mono_factor ) * inRe[ch][slot][bin]; + inIm[ch][slot][bin] = mono_factor * ( inIm[0][slot][bin] + inIm[1][slot][bin] ) + ( 1.0f - mono_factor ) * inIm[ch][slot][bin]; + band_nrg += ( inRe[ch][slot][bin] * inRe[ch][slot][bin] ) + ( inIm[ch][slot][bin] * inIm[ch][slot][bin] ); } - hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; - hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * band_nrg; - } - else - { - /* processed signal is input. use the original channel, so no need to compute new signals or signal energy */ - hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; - hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch]; } + hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; + hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * band_nrg; } + else + { + /* processed signal is input. use the original channel, so no need to compute new signals or signal energy */ + hHeadTrackData->procChEneIIR[ch][band_idx] *= ADAPT_HTPROTO_IIR_FAC; + hHeadTrackData->procChEneIIR[ch][band_idx] += ( 1.0f - ADAPT_HTPROTO_IIR_FAC ) * ch_nrg[ch]; + } + } - /* Equalize */ - ene_target = hHeadTrackData->chEneIIR[0][band_idx] + hHeadTrackData->chEneIIR[1][band_idx]; - ene_proc = hHeadTrackData->procChEneIIR[0][band_idx] + hHeadTrackData->procChEneIIR[1][band_idx]; - eqVal = fminf( 4.0f, sqrtf( ene_target / fmaxf( 1e-12f, ene_proc ) ) ); + /* Equalize */ + ene_target = hHeadTrackData->chEneIIR[0][band_idx] + hHeadTrackData->chEneIIR[1][band_idx]; + ene_proc = hHeadTrackData->procChEneIIR[0][band_idx] + hHeadTrackData->procChEneIIR[1][band_idx]; + eqVal = fminf( 4.0f, sqrtf( ene_target / fmaxf( 1e-12f, ene_proc ) ) ); - for ( slot = start_slot; slot < stop_slot; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else + for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif + { + for ( ch = 0; ch < 2; ch++ ) { - for ( ch = 0; ch < 2; ch++ ) + for ( bin = bin_lo; bin < bin_hi; bin++ ) { - for ( bin = bin_lo; bin < bin_hi; bin++ ) - { - inRe[ch][slot][bin] *= eqVal; - inIm[ch][slot][bin] *= eqVal; - } + inRe[ch][slot][bin] *= eqVal; + inIm[ch][slot][bin] *= eqVal; } } } @@ -1461,17 +1644,17 @@ static void adaptTransportSignalsHeadtracked( return; } - static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - const uint8_t firstSlot, - const uint8_t slotEnd, - const uint8_t nBins, + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, +#ifdef JBM_TSM_ON_TCS + const int16_t nSlots, +#endif float Rmat[3][3] ) { - uint8_t slot, bin, ch; + int16_t slot, bin, ch; float tmpVal; /* When not currently in prototype signal left-right switching procedure, check if such switching is needed */ @@ -1491,7 +1674,11 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( /* When currently in interpolation */ if ( hHeadTrackData->lrSwitchedNext != hHeadTrackData->lrSwitchedCurrent ) { - for ( slot = firstSlot; slot < slotEnd; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else + for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { float switchOrderFactor, origOrderFactor; @@ -1547,7 +1734,11 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( /* If not in interpolation, but in switched prototype situation, then switch left and right channels */ if ( hHeadTrackData->lrSwitchedCurrent == 1 ) { - for ( slot = firstSlot; slot < slotEnd; slot++ ) +#ifdef JBM_TSM_ON_TCS + for ( slot = 0; slot < nSlots; slot++ ) +#else + for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) +#endif { for ( bin = 0; bin < nBins; bin++ ) { @@ -2008,37 +2199,30 @@ static void hrtfShGetHrtf( * parametric binauralizer using IVAS codec format and current bitrate. *------------------------------------------------------------------------*/ -/*! r: Configured reqularization factor value to be set. */ -static float configure_reqularization_factor( - const IVAS_FORMAT ivas_format, /* i: IVAS codec format in use */ - const int32_t ivas_brate ) /* i: Current IVAS bitrate */ +/*! r: Configured reqularization factor value */ +float configure_reqularization_factor( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) { float reqularizationFactor; reqularizationFactor = 1.0f; /* Default value */ if ( ivas_format == MASA_FORMAT ) { - if ( ivas_brate >= IVAS_256k ) - { - reqularizationFactor = 0.2f; - } - else if ( ivas_brate == IVAS_192k ) - { - reqularizationFactor = 0.3f; - } - else if ( ivas_brate == IVAS_160k ) + if ( ivas_total_brate >= IVAS_160k ) { reqularizationFactor = 0.4f; } - else if ( ivas_brate == IVAS_128k ) + else if ( ivas_total_brate == IVAS_128k ) { reqularizationFactor = 0.5f; } - else if ( ivas_brate == IVAS_96k ) + else if ( ivas_total_brate == IVAS_96k ) { reqularizationFactor = 0.6f; } - else if ( ivas_brate >= IVAS_64k ) + else if ( ivas_total_brate >= IVAS_64k ) { reqularizationFactor = 0.8f; } @@ -2050,19 +2234,19 @@ static float configure_reqularization_factor( if ( ivas_format == MC_FORMAT ) /* This is always McMASA for parametric binauralizer. */ { - if ( ivas_brate >= IVAS_96k ) + if ( ivas_total_brate >= IVAS_96k ) { - reqularizationFactor = 0.3f; + reqularizationFactor = 0.4f; } - else if ( ivas_brate >= IVAS_80k ) + else if ( ivas_total_brate >= IVAS_80k ) { reqularizationFactor = 0.5f; } - else if ( ivas_brate >= IVAS_64k ) + else if ( ivas_total_brate >= IVAS_64k ) { reqularizationFactor = 0.7f; } - else if ( ivas_brate >= IVAS_48k ) + else if ( ivas_total_brate >= IVAS_48k ) { reqularizationFactor = 0.8f; } diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c index 2b1f16d025..3616bd6c93 100644 --- a/lib_rend/ivas_hrtf.c +++ b/lib_rend/ivas_hrtf.c @@ -96,6 +96,10 @@ ivas_error ivas_HRTF_CRend_binary_open( ( *hSetOfHRTF )->hHRTF_hrir_combined = NULL; ( *hSetOfHRTF )->hHRTF_hrir_hoa3 = NULL; +#ifdef UPDATE_SBA_FILTER + ( *hSetOfHRTF )->hHRTF_hrir_hoa2 = NULL; + ( *hSetOfHRTF )->hHRTF_hrir_foa = NULL; +#endif ( *hSetOfHRTF )->hHRTF_brir_combined = NULL; return IVAS_ERR_OK; diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index 28c272bc0c..7875165e51 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -171,11 +171,15 @@ void ivas_limiter_close( *-------------------------------------------------------------------*/ void ivas_limiter_dec( - IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ +#ifdef JBM_TSM_ON_TCS + float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ +#else float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */ - const int16_t num_channels, /* i : number of channels to be processed */ - const int16_t output_frame, /* i : number of samples per channel in the buffer */ - const int16_t BER_detect /* i : BER detect flag */ +#endif + const int16_t num_channels, /* i : number of channels to be processed */ + const int16_t output_frame, /* i : number of samples per channel in the buffer */ + const int16_t BER_detect /* i : BER detect flag */ ) { int16_t c; diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 0618534448..2f5b406c66 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -34,6 +34,7 @@ #include #include "options.h" #include "prot.h" +#include "ivas_prot.h" #include "ivas_prot_rend.h" #include #include "ivas_rom_com.h" @@ -47,9 +48,12 @@ * Local function prototypes *---------------------------------------------------------------------*/ + static void TDREND_Clear_Update_flags( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd ); + static void angles_to_vec( const float radius, const float azimuth, const float elevation, float *vec ); + /*---------------------------------------------------------------------* * ivas_td_binaural_open_unwrap() * @@ -259,41 +263,87 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ +#endif +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; int16_t subframe_idx; float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; ivas_error error; +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t c_indx, nS; +#endif +#ifdef JBM_TSM_ON_TCS + float *p_reverb_signal[BINAURAL_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) + { + p_reverb_signal[ch] = reverb_signal[ch]; + } +#endif subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; +#ifdef FIX_356_ISM_METADATA_SYNC + c_indx = 0; + for ( nS = 0; nS < num_src; nS++ ) + { + if ( !( ivas_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ + { + hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; + hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; + c_indx++; + } + } +#else /* Update object position(s) */ TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); +#endif for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { +#ifdef FIX_356_ISM_METADATA_SYNC + if ( subframe_idx == ism_md_subframe_update ) + { + /* Update object position(s) */ + TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); + } +#endif /* Update the listener's location/orientation */ TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) { +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } } /* Render subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, ism_md_subframe_update ) ) != IVAS_ERR_OK ) +#else if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) +#endif { return error; } } - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) { /* add reverb to rendered signals */ @@ -313,9 +363,18 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ +#else + float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ +#endif + const int16_t subframe_length, /* i/o: subframe length */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ + const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ +#else + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#endif ) { int16_t i; @@ -327,6 +386,13 @@ ivas_error TDREND_GetMix( float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; int16_t intp_count; + float pan_left, pan_right; +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t subframe_update_flag; + + subframe_update_flag = subframe_idx == ism_md_subframe_update; +#endif + error = IVAS_ERR_OK; /* Clear the output buffer to accumulate rendered sources */ @@ -347,10 +413,14 @@ ivas_error TDREND_GetMix( SrcRend_p = Src_p->SrcRend_p; /* Update rendering params if needed */ - if ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) + if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) { TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, +#ifdef FIX_356_ISM_METADATA_SYNC + Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_update_flag ); +#else Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); +#endif } /* Render source if needed */ @@ -358,6 +428,14 @@ ivas_error TDREND_GetMix( { error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length ); } + + if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) ) + { + pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f; + pan_right = 1.f - pan_left; + v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_left, output_buf[0], subframe_length ); + v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length ); + } } /* Populate output variable */ @@ -403,47 +481,75 @@ static void TDREND_Clear_Update_flags( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ const int16_t num_src, /* i : number of sources to render */ - const int16_t lfe_idx, /* i : Input LFE index */ - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +#ifndef FIX_356_ISM_METADATA_SYNC + const int16_t lfe_idx, /* i : Input LFE index */ +#endif + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ +#ifndef FIX_356_ISM_METADATA_SYNC + , +#ifdef JBM_TSM_ON_TCS + float *output[] /* i/o: SCE/MC channels */ +#else + float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +#endif +#endif ) { TDREND_DirAtten_t *DirAtten_p; int16_t nS; float Pos[3]; float Dir[3]; +#ifndef FIX_356_ISM_METADATA_SYNC int16_t c_indx; +#endif DirAtten_p = hBinRendererTd->DirAtten_p; /* For each source, write the frame data to the source object*/ +#ifndef FIX_356_ISM_METADATA_SYNC c_indx = 0; +#endif for ( nS = 0; nS < num_src; nS++ ) { +#ifndef FIX_356_ISM_METADATA_SYNC if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ { hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; c_indx++; } - +#endif if ( in_format == ISM_FORMAT ) { - /* Update the source positions */ /* Source position and direction */ angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); + +#ifndef FIX_463_TD_RENDERER_DIRECTIVITY_RESET + /* Source directivity info */ DirAtten_p->ConeInnerAngle = 360.0f; DirAtten_p->ConeOuterAngle = 360.0f; DirAtten_p->ConeOuterGain = 1.0f; +#endif TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); - TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); + if ( hIsmMetaData[nS]->non_diegetic_flag ) + { + Pos[0] = 0; + Pos[1] = hIsmMetaData[nS]->azimuth / 90.f; + Pos[2] = 0; + TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ); + } + else + { + TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING ); + } TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir ); } } @@ -583,12 +689,27 @@ ivas_error ivas_td_binaural_renderer_ext( IVAS_REND_AudioConfigType inConfigType; AUDIO_CONFIG transport_config; ivas_error error; +#ifdef FIX_356_ISM_METADATA_SYNC + int16_t ism_md_subframe_update_ext; +#endif +#ifdef JBM_TSM_ON_TCS + float *p_output[MAX_OUTPUT_CHANNELS]; + int16_t ch; + + for ( ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++ ) + { + p_output[ch] = output[ch]; + } +#endif push_wmops( "ivas_td_binaural_renderer_ext" ); inConfigType = getAudioConfigType( inConfig ); lfe_idx = LFE_CHANNEL; hIsmMetaData[0] = NULL; +#ifdef FIX_356_ISM_METADATA_SYNC + ism_md_subframe_update_ext = 0; +#endif if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { @@ -618,11 +739,30 @@ ivas_error ivas_td_binaural_renderer_ext( hIsmMetaData[0]->yaw = currentPos->yaw; hIsmMetaData[0]->pitch = currentPos->pitch; hIsmMetaData[0]->radius = currentPos->radius; + hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; } +#ifdef JBM_TSM_ON_TCS +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) +#endif +#else +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, + ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, output, output_frame ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) +#endif +#endif { return error; } diff --git a/lib_rend/ivas_objectRenderer_hrFilt.c b/lib_rend/ivas_objectRenderer_hrFilt.c index 97d0b68fb8..6463261ec4 100644 --- a/lib_rend/ivas_objectRenderer_hrFilt.c +++ b/lib_rend/ivas_objectRenderer_hrFilt.c @@ -69,27 +69,17 @@ ivas_error TDREND_REND_RenderSourceHRFilt( { float LeftOutputFrame[L_SPATIAL_SUBFR_48k]; float RightOutputFrame[L_SPATIAL_SUBFR_48k]; -#ifndef FIX_379_GAININTP - float Gain; - - Gain = ( *Src_p->SrcRend_p->DirGain_p ) * ( *Src_p->SrcRend_p->DistGain_p ); -#endif TDREND_Apply_ITD( Src_p->InputFrame_p, LeftOutputFrame, RightOutputFrame, &Src_p->previtd, Src_p->itd, Src_p->mem_itd, subframe_length ); -#ifdef FIX_379_GAININTP TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain ); TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Src_p->Gain, Src_p->prevGain ); Src_p->prevGain = Src_p->Gain; -#else - TDREND_firfilt( LeftOutputFrame, Src_p->hrf_left_prev, hrf_left_delta, intp_count, Src_p->mem_hrf_left, subframe_length, Src_p->filterlength, Gain ); - TDREND_firfilt( RightOutputFrame, Src_p->hrf_right_prev, hrf_right_delta, intp_count, Src_p->mem_hrf_right, subframe_length, Src_p->filterlength, Gain ); -#endif /* Copy to accumulative output frame */ v_add( LeftOutputFrame, output_buf[0], output_buf[0], subframe_length ); v_add( RightOutputFrame, output_buf[1], output_buf[1], subframe_length ); - Src_p->InputFrame_p += subframe_length; /* Increment input pointer -- todo: should we remove this and input the current subframe instead? */ + Src_p->InputFrame_p += subframe_length; /* Increment input pointer */ return IVAS_ERR_OK; diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index af3231df61..d988ad53d2 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -236,12 +236,8 @@ void TDREND_firfilt( float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ const int16_t filterlength, /* i : Filter length */ -#ifdef FIX_379_GAININTP - const float Gain, /* i : Gain */ - const float prevGain /* i : Previous gain */ -#else - const float Gain /* i : Gain */ -#endif + const float Gain, /* i : Gain */ + const float prevGain /* i : Previous gain */ ) { float buffer[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; @@ -250,13 +246,11 @@ void TDREND_firfilt( float *p_filter; float tmp; int16_t i, j; -#ifdef FIX_379_GAININTP float step, gain_tmp, gain_delta; gain_delta = ( Gain - prevGain ); step = gain_delta / ( subframe_length ); gain_tmp = prevGain; -#endif /* Handle memory */ p_signal = buffer + filterlength - 1; @@ -274,13 +268,9 @@ void TDREND_firfilt( { tmp += ( *p_filter++ ) * ( *p_tmp-- ); } -#ifdef FIX_379_GAININTP /* Apply linear gain interpolation in case of abrupt gain changes */ gain_tmp = gain_tmp + step; signal[i] = tmp * gain_tmp; -#else - signal[i] = tmp * Gain; -#endif if ( i < intp_count ) { diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 91253748b2..1468273572 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -219,7 +219,6 @@ static void TDREND_SRC_REND_Init( /* Internal state */ SrcRend_p->InputAvailable = FALSE; SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_INITIAL; - /* SrcGain */ for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { @@ -260,7 +259,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, /* i/o: Source pointer */ - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_update_flag +#else + const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#endif ) { TDREND_MIX_Listener_t *Listener_p; @@ -354,7 +357,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( azim_delta = ( azim_delta > 180.0f ) ? ( azim_delta - 360 ) : ( ( azim_delta < -180.0f ) ? ( azim_delta + 360 ) : ( azim_delta ) ); /* map to -180:180 range */ *intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) ); +#ifdef FIX_356_ISM_METADATA_SYNC + if ( ( *intp_count > 0 ) && subframe_update_flag ) +#else if ( ( *intp_count > 0 ) && subframe_idx == 0 ) +#endif { /* Set deltas for interpolation */ v_sub( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); @@ -687,9 +694,7 @@ void TDREND_SRC_Init( Src_p->hrf_right_prev[0] = 1; Src_p->azim_prev = 0.0f; Src_p->elev_prev = 0.0f; -#ifdef FIX_379_GAININTP Src_p->prevGain = 1.0f; -#endif return; } diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index 63d863c4b6..ae646b4d5c 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -406,7 +406,11 @@ ivas_error ivas_orient_trk_Init( pOTR->refRot = identity; /* set safe default tracking mode */ +#ifdef FIX_439_OTR_PARAMS + pOTR->orientation_tracking = HEAD_ORIENT_TRK_NONE; +#else pOTR->trackingType = OTR_TRACKING_NONE; +#endif return IVAS_ERR_OK; } @@ -419,15 +423,24 @@ ivas_error ivas_orient_trk_Init( *-------------------------------------------------------------------*/ ivas_error ivas_orient_trk_SetTrackingType( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ +#ifdef FIX_439_OTR_PARAMS + const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ +#else const OTR_TRACKING_T trackingType /* i/o: orientation tracking type */ +#endif ) { if ( pOTR == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } + +#ifdef FIX_439_OTR_PARAMS + pOTR->orientation_tracking = orientation_tracking; +#else pOTR->trackingType = trackingType; +#endif return IVAS_ERR_OK; } @@ -477,17 +490,36 @@ ivas_error ivas_orient_trk_GetMainOrientation( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } + +#ifdef FIX_439_OTR_PARAMS + switch ( pOTR->orientation_tracking ) +#else switch ( pOTR->trackingType ) +#endif { +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_NONE: +#else case OTR_TRACKING_NONE: +#endif *pOrientation = IdentityQuaternion(); break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_REF_VEC: + case HEAD_ORIENT_TRK_REF_VEC_LEV: + case HEAD_ORIENT_TRK_REF: +#else case OTR_TRACKING_REF_VEC: case OTR_TRACKING_REF_VEC_LEV: case OTR_TRACKING_REF_ORIENT: +#endif *pOrientation = pOTR->refRot; break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_AVG: +#else case OTR_TRACKING_AVG_ORIENT: +#endif *pOrientation = pOTR->absAvgRot; break; } @@ -539,15 +571,30 @@ ivas_error ivas_orient_trk_SetReferenceVector( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef FIX_439_OTR_PARAMS + switch ( pOTR->orientation_tracking ) +#else switch ( pOTR->trackingType ) +#endif { +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_NONE: + case HEAD_ORIENT_TRK_REF: + case HEAD_ORIENT_TRK_AVG: + case HEAD_ORIENT_TRK_REF_VEC: +#else case OTR_TRACKING_NONE: case OTR_TRACKING_REF_ORIENT: case OTR_TRACKING_AVG_ORIENT: case OTR_TRACKING_REF_VEC: +#endif acousticFrontVector = VectorSubtract( listenerPos, refPos ); break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_REF_VEC_LEV: +#else case OTR_TRACKING_REF_VEC_LEV: +#endif /* ignore the height difference between listener position and reference position */ listenerPosLevel.z = refPosLevel.z = listenerPos.z; listenerPosLevel.x = listenerPos.x; @@ -605,14 +652,28 @@ ivas_error ivas_orient_trk_Process( result = IVAS_ERR_OK; +#ifdef FIX_439_OTR_PARAMS + switch ( pOTR->orientation_tracking ) +#else switch ( pOTR->trackingType ) +#endif { +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_NONE: +#else case OTR_TRACKING_NONE: +#endif pOTR->trkRot = absRot; break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_REF: + case HEAD_ORIENT_TRK_REF_VEC: + case HEAD_ORIENT_TRK_REF_VEC_LEV: +#else case OTR_TRACKING_REF_VEC: case OTR_TRACKING_REF_VEC_LEV: case OTR_TRACKING_REF_ORIENT: +#endif /* Reset average orientation */ pOTR->absAvgRot = absRot; @@ -624,7 +685,11 @@ ivas_error ivas_orient_trk_Process( QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); break; +#ifdef FIX_439_OTR_PARAMS + case HEAD_ORIENT_TRK_AVG: +#else case OTR_TRACKING_AVG_ORIENT: +#endif /* Compute average (low-pass filtered) absolute orientation */ QuaternionSlerp( pOTR->absAvgRot, absRot, alpha, &pOTR->absAvgRot ); diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 7713dbe1a3..d87324cca3 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -92,7 +92,11 @@ void ivas_limiter_close( void ivas_limiter_dec ( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ +#ifdef JBM_TSM_ON_TCS + float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ +#else float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */ +#endif const int16_t num_channels, /* i : number of channels to be processed */ const int16_t output_frame, /* i : number of samples per channel in the buffer */ const int16_t BER_detect /* i : BER detect flag */ @@ -137,11 +141,10 @@ void efap_determine_gains( *----------------------------------------------------------------------------------*/ void ivas_sba_prototype_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t firstSubframe, /* i : First subframe to map */ - const int16_t nSubframes /* i : Number of subframes to map */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ + const int16_t subframe /* i : Subframe to render */ ); ivas_error ivas_sba_get_hoa_dec_matrix( @@ -156,6 +159,17 @@ void ivas_dirac_dec_binaural( const int16_t nchan_transport /* i : number of transport channels */ ); +#ifdef JBM_TSM_ON_TCS +void ivas_dirac_dec_binaural_render( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ + uint16_t *nSamplesRendered, /* o : number of CLDFB slots rendered */ + uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ + const int16_t nchan_transport, /* i : number of transport channels */ + float *output_f[] /* o : rendered time signal */ +); +#endif + ivas_error ivas_dirac_dec_init_binaural_data( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ HRTFS_PARAMBIN_HANDLE hHrtfParambin /* i : HRTF structure for rendering */ @@ -222,7 +236,14 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t ism_md_subframe_update, +#endif +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: SCE channels / Binaural synthesis */ +#else + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ +#endif const int16_t output_frame /* i : output frame length */ ); @@ -264,9 +285,18 @@ void ivas_td_binaural_close( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ +#else float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ +#endif const int16_t subframe_length, /* i/o: subframe length */ +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ + const int16_t ism_md_subframe_update /* Number of subframes to delay metadata to sync with audio */ +#else const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#endif ); void TDREND_Update_listener_orientation( @@ -279,10 +309,19 @@ void TDREND_Update_listener_orientation( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ const int16_t num_src, /* i : number of sources to render */ +#ifndef FIX_356_ISM_METADATA_SYNC const int16_t lfe_idx, /* i : Input LFE index */ +#endif const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData, /* i : Input metadata for ISM objects */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ +#ifndef FIX_356_ISM_METADATA_SYNC + , +#ifdef JBM_TSM_ON_TCS + float *output[] /* i/o: SCE/MC channels */ +#else float output[][L_FRAME48k] /* i/o: SCE/MC channels */ +#endif +#endif ); void BSplineModelEvalDealloc( @@ -353,7 +392,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, +#ifdef FIX_356_ISM_METADATA_SYNC + const int16_t subframe_update_flag /* i : Flag to determine update subframe idx */ +#else const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ +#endif ); ivas_error TDREND_SRC_Alloc( @@ -462,12 +505,8 @@ void TDREND_firfilt( float *mem, /* i/o: filter memory */ const int16_t subframe_length, /* i : Length of signal */ const int16_t filterlength, /* i : Filter length */ -#ifdef FIX_379_GAININTP const float Gain, /* i : Gain */ const float prevGain /* i : Previous gain */ -#else - const float Gain /* i : Gain */ -#endif ); @@ -488,7 +527,8 @@ void ivas_rend_closeCrend( CREND_WRAPPER_HANDLE *pCrend ); ivas_error ivas_rend_initCrendWrapper( - CREND_WRAPPER_HANDLE *pCrend ); + CREND_WRAPPER_HANDLE *pCrend +); ivas_error ivas_rend_crendProcess( const CREND_WRAPPER *pCrend, @@ -498,11 +538,30 @@ ivas_error ivas_rend_crendProcess( HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: input/output audio channels */ +#else float output[][L_FRAME48k], /* i/o: input/output audio channels */ +#endif const int32_t output_Fs ); - +#ifdef JBM_TSM_ON_TCS +ivas_error ivas_rend_crendProcessSubframe( + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + float *input_f[], /* i : transport channels */ + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int32_t output_Fs /* i : output sampling rate */ +); +#endif ivas_error ivas_crend_init_from_rom( @@ -542,16 +601,21 @@ void ivas_binaural_reverb_close( REVERB_STRUCT_HANDLE *hReverb /* i/o: binaural reverb handle */ ); -void ivas_binaural_reverb_processFrame( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const int16_t numInChannels, /* i : num input channels to be processed */ - float inReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real */ - float inImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ - float outReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ - float outImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */ - const uint8_t offsetSamplesIO /* i : number of offset samples */ +void ivas_binaural_reverb_processSubframe( + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t numInChannels, /* i : num input channels to be processed */ +#ifdef JBM_TSM_ON_TCS + const int16_t numSlots, /* i : number of slots to be processed */ +#endif + float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real */ + float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ + float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ + float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ ); +#ifdef JBM_TSM_ON_TCS +#endif + ivas_error ivas_reverb_open( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ @@ -568,8 +632,13 @@ ivas_error ivas_reverb_process( const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], /* i : the PCM audio to apply reverb on */ + float *pcm_out[], /* o : the PCM audio with reverb applied */ +#else float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ +#endif const int16_t i_ts /* i : subframe index */ ); @@ -792,7 +861,11 @@ void SHrotmatgen( void rotateFrame_shd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ +#else + float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ +#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const int16_t subframe_idx /* i : subframe index */ @@ -800,7 +873,11 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: unrotated SD signal buffer in TD */ +#else + float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ +#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ @@ -812,6 +889,9 @@ void rotateFrame_shd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif const int16_t shd_rot_max_order /* i : split-order rotation method */ ); @@ -821,6 +901,9 @@ void rotateFrame_sd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif const int16_t nb_band /* i : number of CLDFB bands to process */ ); @@ -853,7 +936,11 @@ ivas_error ivas_orient_trk_Init( ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ +#ifdef FIX_439_OTR_PARAMS + const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ +#else const OTR_TRACKING_T trackingType /* i : orientation tracking type */ +#endif ); ivas_error ivas_orient_trk_SetReferenceRotation( diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 65a7c60ed9..baa83fad0e 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1437,7 +1437,11 @@ static void reverb_block( static ivas_error downmix_input_block( const REVERB_HANDLE hReverb, +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], +#else float pcm_in[][L_FRAME48k], +#endif const AUDIO_CONFIG input_audio_config, float *pPcm_out, const int16_t input_offset ) @@ -1579,9 +1583,14 @@ ivas_error ivas_reverb_process( const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ - float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ - float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ - const int16_t i_ts /* i : subframe index */ +#ifdef JBM_TSM_ON_TCS + float *pcm_in[], /* i : the PCM audio to apply reverb on */ + float *pcm_out[], /* o : the PCM audio with reverb applied */ +#else + float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ + float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ +#endif + const int16_t i_ts /* i : subframe index */ ) { float tmp0[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -1616,25 +1625,39 @@ ivas_error ivas_reverb_process( * Compute the reverberation - room effect *------------------------------------------------------------------------*/ -void ivas_binaural_reverb_processFrame( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const int16_t numInChannels, /* i : num inputs to be processed */ - float inReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ - float inImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ - float outReal[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ - float outImag[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data imag */ - const uint8_t offsetSamplesIO /* i : number of offset samples */ +void ivas_binaural_reverb_processSubframe( + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t numInChannels, /* i : num inputs to be processed */ +#ifdef JBM_TSM_ON_TCS + const int16_t numSlots, /* i : number of slots to be processed */ +#endif + float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ + float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ + float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ + float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ ) { /* Declare the required variables */ int16_t idx, bin, ch, sample, invertSampleIndex, tapIdx, *phaseShiftTypePr; float **tapRealPr, **tapImagPr; + push_wmops( "binaural_reverb" ); /* 1) Rotate the data in the loop buffer of the reverberator. * Notice that the audio at the loop buffers is at time-inverted order * for convolution purposes later on. */ for ( bin = 0; bin < hReverb->numBins; bin++ ) { +#ifdef JBM_TSM_ON_TCS + /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ + mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + numSlots, hReverb->loopBufLength[bin] ); + mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + numSlots, hReverb->loopBufLength[bin] ); + + /* Add the data from the end of the loop to the beginning, with an attenuation factor + * according to RT60. This procedure generates an IIR decaying response. The response + * is decorrelated later on. */ + v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], numSlots ); + v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], numSlots ); +#else /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); @@ -1644,15 +1667,23 @@ void ivas_binaural_reverb_processFrame( * is decorrelated later on. */ v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], hReverb->blockSize ); v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], hReverb->blockSize ); +#endif } /* 2) Apply the determined pre-delay to the input audio, and add the delayed audio to the loop. */ idx = hReverb->preDelayBufferIndex; +#ifdef JBM_TSM_ON_TCS + for ( sample = 0; sample < numSlots; sample++ ) +#else for ( sample = 0; sample < hReverb->blockSize; sample++ ) +#endif { - uint16_t sampleWithOffset; - sampleWithOffset = sample + offsetSamplesIO; +#ifdef JBM_TSM_ON_TCS + invertSampleIndex = numSlots - sample - 1; +#else invertSampleIndex = hReverb->blockSize - sample - 1; +#endif + for ( bin = 0; bin < hReverb->numBins; bin++ ) { /* Add from pre-delay buffer a sample to the loop buffer, in a time-inverted order. @@ -1669,13 +1700,13 @@ void ivas_binaural_reverb_processFrame( { if ( ch % 2 ) { - v_add( hReverb->preDelayBufferReal[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins ); - v_add( hReverb->preDelayBufferImag[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins ); + v_add( hReverb->preDelayBufferReal[idx], inReal[ch][sample], hReverb->preDelayBufferReal[idx], hReverb->numBins ); + v_add( hReverb->preDelayBufferImag[idx], inImag[ch][sample], hReverb->preDelayBufferImag[idx], hReverb->numBins ); } else { - v_sub( hReverb->preDelayBufferReal[idx], inImag[ch][sampleWithOffset], hReverb->preDelayBufferReal[idx], hReverb->numBins ); - v_add( hReverb->preDelayBufferImag[idx], inReal[ch][sampleWithOffset], hReverb->preDelayBufferImag[idx], hReverb->numBins ); + v_sub( hReverb->preDelayBufferReal[idx], inImag[ch][sample], hReverb->preDelayBufferReal[idx], hReverb->numBins ); + v_add( hReverb->preDelayBufferImag[idx], inReal[ch][sample], hReverb->preDelayBufferImag[idx], hReverb->numBins ); } } idx = ( idx + 1 ) % hReverb->preDelayBufferLength; @@ -1690,17 +1721,41 @@ void ivas_binaural_reverb_processFrame( /* These tap pointers have been determined to point to the loop buffer at sparse locations */ tapRealPr = hReverb->tapPointersReal[bin][ch]; tapImagPr = hReverb->tapPointersImag[bin][ch]; + phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch]; /* Flush output */ +#ifdef JBM_TSM_ON_TCS + set_f( hReverb->outputBufferReal[bin][ch], 0.0f, numSlots ); + set_f( hReverb->outputBufferImag[bin][ch], 0.0f, numSlots ); +#else set_f( hReverb->outputBufferReal[bin][ch], 0.0f, hReverb->blockSize ); set_f( hReverb->outputBufferImag[bin][ch], 0.0f, hReverb->blockSize ); +#endif /* Add from temporally decaying sparse tap locations the audio to the output. */ for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) { switch ( phaseShiftTypePr[tapIdx] ) { +#ifdef JBM_TSM_ON_TCS + case 0: /* 0 degrees phase */ + v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + case 1: /* 90 degrees phase */ + v_sub( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_add( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + case 2: /* 180 degrees phase */ + v_sub( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_sub( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; + default: /* 270 degrees phase */ + v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); + v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); + break; +#else case 0: /* 0 degrees phase */ v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); @@ -1717,6 +1772,7 @@ void ivas_binaural_reverb_processFrame( v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); break; +#endif } } } @@ -1726,7 +1782,11 @@ void ivas_binaural_reverb_processFrame( { if ( hReverb->useBinauralCoherence ) { +#ifdef JBM_TSM_ON_TCS + for ( sample = 0; sample < numSlots; sample++ ) +#else for ( sample = 0; sample < hReverb->blockSize; sample++ ) +#endif { float leftRe, rightRe, leftIm, rightIm; @@ -1747,30 +1807,38 @@ void ivas_binaural_reverb_processFrame( /* 4) Write data to output */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { +#ifdef JBM_TSM_ON_TCS + for ( sample = 0; sample < numSlots; sample++ ) +#else for ( sample = 0; sample < hReverb->blockSize; sample++ ) +#endif { - uint16_t sampleWithOffset; - - sampleWithOffset = sample + offsetSamplesIO; - /* Audio was in the temporally inverted order for convolution, re-invert audio to output */ +/* Audio was in the temporally inverted order for convolution, re-invert audio to output */ +#ifdef JBM_TSM_ON_TCS + invertSampleIndex = numSlots - sample - 1; +#else invertSampleIndex = hReverb->blockSize - sample - 1; +#endif for ( bin = 0; bin < hReverb->numBins; bin++ ) { - outReal[ch][sampleWithOffset][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex]; - outImag[ch][sampleWithOffset][bin] = hReverb->outputBufferImag[bin][ch][invertSampleIndex]; + outReal[ch][sample][bin] = hReverb->outputBufferReal[bin][ch][invertSampleIndex]; + outImag[ch][sample][bin] = hReverb->outputBufferImag[bin][ch][invertSampleIndex]; } for ( ; bin < CLDFB_NO_CHANNELS_MAX; bin++ ) { - outReal[ch][sampleWithOffset][bin] = 0.0f; - outImag[ch][sampleWithOffset][bin] = 0.0f; + outReal[ch][sample][bin] = 0.0f; + outImag[ch][sample][bin] = 0.0f; } } } + pop_wmops(); return; } +#ifdef JBM_TSM_ON_TCS +#endif /*------------------------------------------------------------------------- * ivas_binaural_reverb_open() diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c index 9708bac83a..560a1382d4 100644 --- a/lib_rend/ivas_rom_binauralRenderer.c +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -53,6 +53,9 @@ /* * Generated with Matlab version 9.3.0.713579 (R2017b) by MUXE6256 */ + +#ifndef UPDATE_SBA_FILTER + const float FASTCONV_HOA3_latency_s = 0.001979167f; const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]= { @@ -3670,6 +3673,7071 @@ const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT } }; +#endif + +#ifdef UPDATE_SBA_FILTER + +const float FASTCONV_HOA3_latency_s = 0.000666667f; +const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= +{ + { + {+0.028305f, +0.686064f, +0.068005f, +0.008358f, +0.000134f}, + {+0.041076f, +0.081510f, -0.101574f, +0.012332f, +0.000133f}, + {+0.004694f, +0.091178f, -0.006019f, -0.000987f, -0.000100f}, + {+0.005000f, +0.062531f, -0.030068f, +0.002120f, -0.000090f}, + {+0.008304f, +0.004854f, +0.003618f, -0.000840f, -0.000150f}, + {+0.005344f, +0.010835f, +0.007864f, +0.004915f, -0.000112f}, + {-0.014194f, +0.005486f, -0.000750f, -0.002195f, +0.000158f}, + {+0.002251f, -0.002762f, +0.046227f, +0.004129f, +0.000004f}, + {-0.024537f, +0.046996f, -0.049712f, -0.006618f, +0.000145f}, + {+0.010068f, -0.052648f, +0.026763f, +0.010223f, +0.000366f}, + {+0.000943f, +0.017480f, -0.020482f, -0.001034f, -0.000058f}, + {+0.002377f, -0.034436f, -0.006489f, +0.012518f, +0.000220f}, + {-0.003606f, -0.027453f, +0.015178f, +0.001090f, -0.000006f}, + {-0.000854f, -0.033509f, +0.016348f, +0.002809f, +0.000078f}, + {+0.001127f, -0.002978f, +0.013287f, +0.005932f, -0.000006f}, + {-0.002728f, -0.006413f, +0.003444f, +0.002047f, +0.000053f} + }, + { + {-0.060981f, +0.539033f, -0.032927f, -0.008925f, -0.000158f}, + {-0.088569f, +0.331317f, +0.135589f, -0.009798f, -0.000139f}, + {-0.006979f, +0.010016f, -0.062582f, +0.002090f, +0.000127f}, + {-0.010389f, +0.024941f, -0.053685f, -0.002256f, +0.000117f}, + {-0.013525f, -0.047393f, -0.001706f, +0.001388f, +0.000191f}, + {-0.006413f, -0.030122f, -0.020701f, -0.011138f, +0.000148f}, + {+0.024834f, +0.109440f, +0.032236f, +0.002032f, -0.000215f}, + {-0.002223f, -0.102504f, -0.064424f, -0.005351f, -0.000007f}, + {+0.037480f, +0.308972f, +0.087606f, +0.006506f, -0.000210f}, + {-0.016939f, -0.106048f, -0.043760f, -0.005027f, -0.000470f}, + {-0.000739f, -0.002371f, -0.021897f, -0.001907f, +0.000076f}, + {-0.005038f, -0.073983f, -0.110448f, -0.018835f, -0.000283f}, + {+0.003491f, -0.004047f, +0.005200f, -0.002767f, +0.000014f}, + {+0.001174f, +0.011186f, +0.026019f, -0.003363f, -0.000098f}, + {-0.002185f, -0.029503f, -0.056810f, -0.012753f, +0.000001f}, + {+0.003633f, +0.007292f, -0.011811f, -0.003296f, -0.000071f} + }, + { + {+0.056640f, +0.424888f, -0.091068f, -0.008146f, -0.000105f}, + {+0.085624f, +0.535380f, -0.135686f, -0.024218f, -0.000137f}, + {+0.000837f, -0.039137f, -0.022512f, -0.003663f, +0.000063f}, + {+0.009275f, -0.013781f, -0.023629f, -0.005508f, +0.000051f}, + {+0.004547f, -0.088202f, +0.042587f, -0.003924f, +0.000093f}, + {-0.003101f, -0.099791f, +0.033209f, +0.007324f, +0.000060f}, + {-0.010598f, +0.183236f, -0.035352f, +0.008713f, -0.000074f}, + {-0.003128f, -0.087287f, -0.092687f, -0.003205f, -0.000001f}, + {-0.002915f, +0.422198f, -0.021401f, +0.017334f, -0.000046f}, + {+0.008367f, -0.030365f, -0.081942f, -0.019445f, -0.000222f}, + {-0.002027f, -0.059247f, +0.024597f, +0.009143f, +0.000033f}, + {+0.005485f, -0.016036f, -0.189920f, +0.005523f, -0.000134f}, + {+0.004590f, +0.043786f, -0.049890f, +0.002054f, -0.000006f}, + {+0.000794f, +0.086150f, -0.052409f, -0.001703f, -0.000051f}, + {+0.002015f, +0.016274f, -0.139462f, +0.010767f, +0.000013f}, + {+0.000980f, +0.021151f, -0.025610f, +0.002927f, -0.000028f} + }, + { + {-0.037044f, +0.299825f, +0.010626f, +0.009027f, +0.000178f}, + {-0.073631f, +0.563948f, +0.256507f, +0.030068f, +0.000165f}, + {+0.001394f, +0.007863f, +0.051772f, +0.005838f, -0.000136f}, + {-0.007311f, +0.033976f, +0.087547f, +0.012955f, -0.000125f}, + {-0.000742f, +0.006564f, +0.155719f, +0.010210f, -0.000207f}, + {+0.003772f, -0.011095f, +0.118202f, +0.002442f, -0.000158f}, + {-0.001621f, -0.014236f, -0.266669f, -0.019686f, +0.000230f}, + {+0.004592f, +0.006155f, +0.002774f, +0.008968f, +0.000009f}, + {-0.017921f, +0.015905f, -0.425734f, -0.038383f, +0.000222f}, + {-0.007216f, +0.258967f, +0.290441f, +0.007092f, +0.000519f}, + {+0.003522f, -0.023316f, +0.032467f, -0.009674f, -0.000084f}, + {-0.006507f, +0.177693f, +0.033997f, -0.006462f, +0.000311f}, + {-0.006842f, +0.024376f, -0.051686f, +0.001498f, -0.000018f}, + {-0.002603f, +0.039216f, -0.091765f, +0.003591f, +0.000108f}, + {-0.003570f, +0.063130f, -0.095408f, -0.005271f, -0.000002f}, + {-0.003443f, +0.045327f, +0.012038f, -0.006717f, +0.000078f} + }, + { + {+0.016927f, -0.038791f, +0.287896f, +0.014303f, +0.000072f}, + {+0.067605f, -0.097306f, +0.721167f, +0.014182f, +0.000134f}, + {+0.004523f, -0.006482f, +0.087578f, -0.003063f, -0.000024f}, + {+0.010963f, -0.024388f, +0.147380f, -0.008366f, -0.000010f}, + {+0.009045f, +0.033260f, +0.131601f, -0.010659f, -0.000033f}, + {+0.006391f, +0.001186f, +0.117010f, -0.003913f, -0.000007f}, + {-0.000206f, -0.124154f, -0.212720f, +0.011624f, -0.000013f}, + {+0.001006f, +0.018224f, +0.038185f, -0.004418f, -0.000004f}, + {+0.005972f, -0.280246f, -0.279425f, +0.024886f, -0.000056f}, + {+0.013866f, +0.056049f, +0.470046f, +0.033031f, +0.000066f}, + {-0.002003f, +0.013997f, -0.006699f, +0.002838f, -0.000007f}, + {+0.005432f, +0.012448f, +0.193385f, +0.021709f, +0.000041f}, + {+0.002080f, -0.035733f, +0.001464f, -0.003877f, +0.000020f}, + {+0.000948f, -0.008178f, -0.047042f, -0.001214f, +0.000022f}, + {+0.008010f, -0.037066f, -0.006003f, +0.001581f, -0.000020f}, + {+0.002016f, -0.033476f, +0.072960f, +0.011160f, +0.000001f} + }, + { + {-0.031783f, -0.056831f, +0.279059f, -0.028993f, -0.000193f}, + {-0.066811f, -0.547107f, +0.401585f, -0.049258f, -0.000209f}, + {-0.014835f, -0.045923f, +0.063394f, -0.003455f, +0.000127f}, + {-0.030703f, -0.186180f, +0.047058f, -0.002768f, +0.000115f}, + {-0.020147f, -0.183472f, -0.029803f, +0.002654f, +0.000199f}, + {-0.004470f, -0.071648f, +0.045482f, -0.003212f, +0.000142f}, + {+0.003858f, +0.057272f, -0.023397f, +0.006911f, -0.000202f}, + {-0.004365f, -0.021410f, +0.013528f, -0.002517f, -0.000010f}, + {-0.011844f, +0.030236f, +0.050498f, +0.004358f, -0.000183f}, + {-0.006262f, -0.197324f, +0.174496f, -0.041478f, -0.000509f}, + {-0.000909f, +0.022088f, -0.010300f, +0.001930f, +0.000082f}, + {+0.000576f, -0.053541f, +0.096593f, -0.021942f, -0.000302f}, + {-0.001649f, -0.054620f, +0.008127f, +0.002136f, +0.000016f}, + {+0.004848f, +0.029592f, +0.000282f, +0.000006f, -0.000106f}, + {-0.010837f, -0.090950f, -0.014402f, -0.000183f, +0.000006f}, + {+0.000125f, -0.021283f, +0.064876f, -0.009148f, -0.000073f} + }, + { + {+0.115524f, -0.001880f, -0.031709f, +0.016815f, -0.000032f}, + {+0.083119f, -0.442745f, -0.062014f, +0.030630f, -0.000109f}, + {+0.026381f, -0.044427f, -0.014701f, +0.004175f, -0.000007f}, + {+0.059970f, -0.279751f, -0.022479f, +0.004671f, -0.000021f}, + {+0.025539f, -0.285695f, -0.030687f, +0.001281f, -0.000018f}, + {-0.015563f, -0.014341f, -0.021407f, +0.004386f, -0.000034f}, + {-0.005271f, +0.080088f, +0.036839f, -0.008678f, +0.000080f}, + {-0.004239f, -0.044848f, +0.005762f, +0.002882f, +0.000009f}, + {+0.051110f, +0.084066f, +0.036589f, -0.007555f, +0.000131f}, + {-0.012587f, -0.147413f, -0.020658f, +0.013969f, +0.000077f}, + {+0.003103f, +0.017462f, -0.008157f, -0.001803f, -0.000018f}, + {-0.001965f, +0.006861f, -0.032042f, +0.005627f, +0.000042f}, + {+0.003954f, -0.069529f, +0.014309f, +0.000469f, -0.000034f}, + {-0.011351f, +0.041303f, +0.021348f, +0.000056f, +0.000005f}, + {+0.003411f, -0.131943f, -0.006306f, -0.000445f, +0.000025f}, + {-0.006265f, +0.023141f, +0.008583f, +0.003180f, +0.000023f} + }, + { + {-0.170064f, -0.305557f, -0.025217f, +0.001133f, +0.000198f}, + {-0.064730f, -0.498651f, -0.047336f, +0.004429f, +0.000255f}, + {-0.023390f, -0.090206f, -0.010300f, +0.000988f, -0.000108f}, + {-0.044740f, -0.402670f, -0.013847f, +0.001569f, -0.000092f}, + {-0.008298f, -0.311166f, -0.004422f, +0.002306f, -0.000173f}, + {+0.024372f, +0.077330f, -0.000442f, +0.001491f, -0.000110f}, + {+0.006327f, +0.051079f, +0.002801f, -0.003002f, +0.000146f}, + {+0.022671f, -0.029757f, -0.017304f, +0.000691f, +0.000009f}, + {-0.067089f, -0.067084f, +0.027632f, -0.007480f, +0.000108f}, + {+0.016067f, -0.071916f, -0.031764f, +0.005887f, +0.000449f}, + {-0.001118f, +0.007300f, -0.004732f, +0.000912f, -0.000072f}, + {-0.012764f, +0.015163f, -0.034285f, +0.004782f, +0.000265f}, + {+0.002476f, -0.078915f, +0.001493f, -0.000518f, -0.000008f}, + {+0.012009f, +0.058211f, +0.005130f, -0.001142f, +0.000096f}, + {+0.017876f, -0.124879f, -0.017363f, +0.001041f, -0.000014f}, + {+0.016489f, +0.044821f, -0.013683f, +0.000199f, +0.000060f} + }, + { + {+0.031523f, -0.568562f, -0.010165f, -0.004741f, -0.000011f}, + {-0.072210f, -0.453377f, -0.012668f, -0.009988f, +0.000056f}, + {-0.013073f, -0.089526f, -0.006790f, -0.002603f, +0.000024f}, + {-0.055858f, -0.385059f, +0.007901f, -0.002683f, +0.000038f}, + {-0.048389f, -0.243348f, +0.011742f, -0.002577f, +0.000053f}, + {-0.000883f, +0.129298f, +0.003415f, -0.002563f, +0.000054f}, + {+0.004842f, +0.028248f, -0.014727f, +0.004067f, -0.000113f}, + {-0.035207f, +0.044693f, -0.000317f, -0.001511f, -0.000014f}, + {+0.027873f, -0.208313f, -0.025747f, +0.006096f, -0.000162f}, + {-0.003882f, -0.022910f, +0.004172f, -0.004195f, -0.000185f}, + {-0.007316f, +0.007332f, +0.005614f, -0.000479f, +0.000037f}, + {+0.030651f, -0.049980f, +0.004306f, -0.003095f, -0.000103f}, + {-0.012670f, -0.046258f, -0.010787f, -0.000294f, +0.000044f}, + {-0.001544f, +0.071605f, -0.001508f, +0.001151f, -0.000025f}, + {-0.039147f, -0.057668f, +0.001114f, -0.001056f, -0.000026f}, + {-0.013243f, +0.076337f, -0.002755f, -0.000535f, -0.000039f} + }, + { + {+0.207932f, -0.287807f, +0.039075f, +0.000182f, -0.000191f}, + {+0.222358f, -0.019823f, +0.045919f, -0.001569f, -0.000284f}, + {+0.051902f, +0.024897f, +0.018540f, -0.000535f, +0.000087f}, + {+0.157008f, -0.084022f, +0.015927f, -0.001511f, +0.000065f}, + {+0.104303f, -0.038679f, +0.004300f, -0.001876f, +0.000138f}, + {-0.031107f, +0.090841f, +0.009802f, -0.001340f, +0.000075f}, + {-0.026573f, -0.012360f, -0.012445f, +0.003442f, -0.000083f}, + {+0.021614f, +0.128929f, +0.008965f, -0.000458f, -0.000006f}, + {+0.022498f, -0.192805f, -0.008217f, +0.005889f, -0.000025f}, + {+0.001966f, -0.020932f, +0.017205f, -0.001490f, -0.000358f}, + {+0.013558f, +0.031486f, +0.001450f, -0.000305f, +0.000057f}, + {-0.020576f, -0.126851f, +0.015311f, -0.000876f, -0.000211f}, + {+0.011427f, -0.005250f, -0.003401f, +0.000196f, -0.000006f}, + {-0.015857f, +0.049501f, -0.003717f, +0.000601f, -0.000080f}, + {+0.034004f, +0.039429f, +0.003524f, -0.000004f, +0.000023f}, + {-0.014818f, +0.079680f, +0.007758f, +0.000184f, -0.000042f} + }, + { + {-0.203020f, +0.343926f, -0.022319f, +0.001551f, +0.000052f}, + {-0.128697f, +0.502946f, -0.012208f, +0.003598f, +0.000018f}, + {-0.021293f, +0.148245f, -0.006309f, +0.001691f, -0.000030f}, + {-0.108184f, +0.296591f, -0.010288f, +0.001875f, -0.000040f}, + {-0.072445f, +0.199735f, -0.008865f, +0.001996f, -0.000070f}, + {+0.035970f, +0.000468f, -0.003327f, +0.001758f, -0.000054f}, + {+0.022536f, -0.076991f, +0.011763f, -0.002716f, +0.000111f}, + {+0.019549f, +0.129451f, +0.001977f, +0.001130f, +0.000018f}, + {-0.040267f, -0.070315f, +0.008077f, -0.004109f, +0.000149f}, + {-0.011400f, -0.010732f, -0.007406f, +0.002026f, +0.000250f}, + {-0.002851f, +0.052737f, -0.000419f, +0.000375f, -0.000049f}, + {-0.020950f, -0.124942f, -0.003929f, +0.001693f, +0.000137f}, + {-0.002830f, +0.012262f, +0.001345f, -0.000201f, -0.000049f}, + {+0.023252f, -0.010554f, +0.006382f, -0.000870f, +0.000037f}, + {+0.002904f, +0.073991f, +0.004806f, +0.000805f, +0.000022f}, + {+0.038844f, +0.012454f, +0.000939f, +0.000294f, +0.000047f} + }, + { + {-0.104978f, +0.491439f, -0.023130f, -0.000395f, +0.000170f}, + {-0.174716f, +0.431741f, -0.037189f, +0.000731f, +0.000283f}, + {-0.071508f, +0.077184f, -0.011405f, +0.000280f, -0.000069f}, + {-0.071830f, +0.341169f, -0.016908f, +0.001162f, -0.000044f}, + {-0.046880f, +0.228632f, -0.012580f, +0.001764f, -0.000105f}, + {-0.015443f, -0.068044f, -0.005570f, +0.000844f, -0.000048f}, + {+0.020736f, -0.083339f, +0.010949f, -0.002791f, +0.000031f}, + {-0.052065f, +0.019705f, -0.009215f, +0.000218f, +0.000001f}, + {+0.033356f, +0.036658f, +0.013911f, -0.004323f, -0.000040f}, + {+0.006601f, +0.021923f, -0.013349f, +0.000309f, +0.000258f}, + {-0.019016f, +0.023410f, -0.005296f, +0.000367f, -0.000039f}, + {+0.051437f, -0.010933f, -0.004546f, -0.000118f, +0.000155f}, + {+0.002536f, +0.019548f, +0.001804f, +0.000278f, +0.000021f}, + {-0.005862f, -0.062421f, -0.001401f, -0.000650f, +0.000064f}, + {-0.033799f, +0.010290f, -0.008108f, -0.000071f, -0.000030f}, + {-0.019280f, -0.065253f, -0.001294f, -0.000391f, +0.000024f} + }, + { + {+0.271163f, -0.091653f, +0.035807f, -0.000730f, -0.000085f}, + {+0.261169f, -0.235971f, +0.033757f, -0.001621f, -0.000093f}, + {+0.095839f, -0.182710f, +0.015397f, -0.001103f, +0.000028f}, + {+0.156712f, -0.007300f, +0.019789f, -0.001371f, +0.000033f}, + {+0.111926f, -0.011250f, +0.016908f, -0.001748f, +0.000072f}, + {-0.005469f, -0.082676f, +0.002169f, -0.001143f, +0.000043f}, + {-0.049695f, +0.016110f, -0.010723f, +0.002011f, -0.000086f}, + {+0.031235f, -0.105162f, +0.004404f, -0.000861f, -0.000020f}, + {-0.012529f, +0.088572f, -0.009833f, +0.002839f, -0.000106f}, + {+0.012620f, +0.018407f, +0.006593f, -0.002080f, -0.000273f}, + {+0.020511f, -0.042167f, +0.004809f, -0.000322f, +0.000054f}, + {-0.032247f, +0.119711f, -0.002446f, -0.001305f, -0.000148f}, + {-0.004589f, +0.033907f, -0.002233f, +0.000259f, +0.000047f}, + {-0.024243f, -0.043735f, -0.001053f, +0.000816f, -0.000043f}, + {+0.018051f, -0.070970f, +0.002759f, -0.000690f, -0.000016f}, + {-0.025928f, -0.049597f, -0.005106f, -0.000174f, -0.000047f} + }, + { + {-0.009292f, -0.523511f, +0.005609f, +0.000701f, -0.000140f}, + {+0.049598f, -0.562660f, +0.018307f, +0.000353f, -0.000250f}, + {+0.026674f, -0.300653f, +0.000453f, -0.000226f, +0.000059f}, + {-0.025200f, -0.281197f, +0.004191f, -0.000792f, +0.000032f}, + {-0.023452f, -0.216602f, +0.003361f, -0.001302f, +0.000079f}, + {+0.022798f, -0.048857f, +0.002028f, -0.000528f, +0.000034f}, + {+0.017850f, +0.123147f, -0.004163f, +0.001736f, -0.000002f}, + {+0.030232f, -0.106769f, +0.006484f, -0.000160f, +0.000004f}, + {-0.027081f, +0.068469f, -0.013975f, +0.002765f, +0.000074f}, + {-0.015824f, -0.032277f, +0.008777f, +0.000341f, -0.000168f}, + {+0.010909f, -0.060681f, +0.000865f, -0.000330f, +0.000023f}, + {-0.018513f, +0.140495f, +0.006788f, +0.000319f, -0.000106f}, + {-0.009128f, +0.032657f, +0.001038f, -0.000299f, -0.000035f}, + {+0.030409f, +0.035966f, +0.000871f, +0.000497f, -0.000049f}, + {+0.024037f, -0.062735f, +0.004854f, -0.000003f, +0.000033f}, + {+0.031906f, +0.040222f, +0.004969f, +0.000300f, -0.000009f} + }, + { + {-0.274242f, -0.111152f, -0.038437f, +0.000541f, +0.000106f}, + {-0.297362f, -0.028772f, -0.040257f, +0.001002f, +0.000153f}, + {-0.157861f, -0.028386f, -0.015885f, +0.000932f, -0.000023f}, + {-0.130190f, -0.116848f, -0.020017f, +0.001091f, -0.000023f}, + {-0.100486f, -0.097500f, -0.017137f, +0.001413f, -0.000066f}, + {-0.042930f, +0.041353f, -0.001818f, +0.000969f, -0.000030f}, + {+0.035539f, +0.107479f, +0.005226f, -0.001521f, +0.000054f}, + {-0.056245f, +0.022881f, -0.006748f, +0.000737f, +0.000020f}, + {+0.051781f, -0.041176f, +0.012387f, -0.002184f, +0.000054f}, + {-0.005351f, -0.056149f, -0.003091f, +0.002220f, +0.000265f}, + {-0.035484f, +0.008203f, -0.004198f, +0.000217f, -0.000054f}, + {+0.049383f, +0.039088f, +0.002024f, +0.001275f, +0.000143f}, + {+0.027963f, -0.019171f, +0.001212f, -0.000337f, -0.000040f}, + {+0.004231f, +0.075991f, +0.001119f, -0.000670f, +0.000043f}, + {-0.028326f, +0.016304f, -0.003947f, +0.000597f, +0.000009f}, + {+0.014165f, +0.065014f, +0.003473f, +0.000208f, +0.000042f} + }, + { + {+0.100761f, +0.468705f, +0.009523f, -0.000855f, +0.000106f}, + {+0.068322f, +0.534398f, -0.000794f, -0.001015f, +0.000195f}, + {+0.100085f, +0.366003f, +0.010962f, +0.000114f, -0.000054f}, + {+0.079789f, +0.208939f, +0.006983f, +0.000516f, -0.000029f}, + {+0.074868f, +0.177414f, +0.007217f, +0.000977f, -0.000063f}, + {+0.040080f, +0.169063f, +0.003424f, +0.000213f, -0.000031f}, + {-0.047852f, -0.014657f, +0.004244f, -0.000996f, -0.000005f}, + {+0.004688f, +0.112753f, -0.003849f, +0.000122f, -0.000008f}, + {-0.009956f, -0.138804f, +0.008769f, -0.001626f, -0.000077f}, + {+0.022634f, -0.009810f, -0.007400f, -0.000511f, +0.000099f}, + {+0.010732f, +0.077733f, +0.000399f, +0.000274f, -0.000009f}, + {-0.039390f, -0.089325f, -0.008313f, -0.000351f, +0.000070f}, + {-0.019067f, -0.090342f, -0.002768f, +0.000205f, +0.000044f}, + {-0.042005f, +0.002738f, -0.004159f, -0.000376f, +0.000037f}, + {-0.016073f, +0.032695f, -0.005232f, +0.000105f, -0.000033f}, + {-0.040117f, -0.022661f, -0.007858f, -0.000231f, -0.000002f} + }, + { + {+0.246756f, +0.241170f, +0.035479f, -0.000554f, -0.000114f}, + {+0.272424f, +0.216540f, +0.039997f, -0.001031f, -0.000186f}, + {+0.100824f, +0.372627f, +0.007492f, -0.000845f, +0.000020f}, + {+0.086728f, +0.200706f, +0.013419f, -0.000947f, +0.000014f}, + {+0.067471f, +0.194793f, +0.010208f, -0.001216f, +0.000058f}, + {+0.018637f, +0.214052f, -0.004837f, -0.000884f, +0.000020f}, + {+0.025584f, -0.127835f, -0.000911f, +0.001401f, -0.000028f}, + {+0.056339f, +0.027855f, +0.010673f, -0.000579f, -0.000019f}, + {-0.060859f, -0.070229f, -0.011217f, +0.002123f, -0.000013f}, + {-0.014798f, +0.052375f, +0.000623f, -0.002191f, -0.000241f}, + {+0.034285f, +0.039743f, +0.005351f, -0.000109f, +0.000050f}, + {+0.007201f, -0.159482f, +0.003886f, -0.001201f, -0.000130f}, + {-0.020187f, -0.092383f, +0.000382f, +0.000354f, +0.000030f}, + {+0.028788f, -0.109693f, +0.004153f, +0.000525f, -0.000041f}, + {+0.036625f, -0.054073f, +0.008577f, -0.000524f, -0.000003f}, + {-0.002610f, -0.084126f, +0.000986f, -0.000174f, -0.000035f} + }, + { + {-0.167535f, -0.399812f, -0.020854f, +0.000806f, -0.000074f}, + {-0.145635f, -0.430918f, -0.013134f, +0.001141f, -0.000134f}, + {-0.184602f, -0.052096f, -0.013909f, -0.000043f, +0.000053f}, + {-0.110131f, -0.103022f, -0.011251f, -0.000423f, +0.000031f}, + {-0.114138f, -0.085208f, -0.011213f, -0.000798f, +0.000055f}, + {-0.095938f, +0.054666f, -0.000697f, -0.000059f, +0.000033f}, + {-0.000204f, -0.169483f, -0.009146f, +0.000575f, -0.000003f}, + {-0.030090f, -0.112432f, -0.004382f, -0.000216f, +0.000011f}, + {+0.053018f, +0.105332f, -0.004066f, +0.000908f, +0.000060f}, + {-0.009119f, +0.057095f, +0.007675f, +0.000456f, -0.000052f}, + {-0.027961f, -0.057568f, -0.003773f, -0.000262f, -0.000002f}, + {+0.030433f, -0.136477f, +0.002756f, +0.000256f, -0.000046f}, + {+0.049955f, +0.009293f, +0.002856f, -0.000133f, -0.000047f}, + {+0.028171f, -0.112646f, +0.000816f, +0.000380f, -0.000028f}, + {+0.014607f, -0.096614f, -0.000430f, -0.000147f, +0.000031f}, + {+0.051182f, -0.003494f, +0.006796f, +0.000143f, +0.000008f} + }, + { + {-0.208650f, -0.335847f, -0.029770f, +0.000608f, +0.000111f}, + {-0.234234f, -0.291735f, -0.035875f, +0.001265f, +0.000192f}, + {+0.043525f, -0.386017f, -0.001141f, +0.000753f, -0.000019f}, + {-0.024332f, -0.238532f, -0.004594f, +0.000982f, -0.000011f}, + {-0.003204f, -0.260777f, -0.001135f, +0.001218f, -0.000051f}, + {+0.094495f, -0.222636f, +0.006686f, +0.000805f, -0.000016f}, + {-0.041620f, -0.113126f, +0.003804f, -0.001425f, +0.000014f}, + {-0.059468f, -0.070637f, -0.008480f, +0.000599f, +0.000018f}, + {+0.037218f, +0.133212f, +0.009087f, -0.002277f, -0.000009f}, + {+0.028004f, -0.004399f, +0.001485f, +0.002043f, +0.000214f}, + {-0.030214f, -0.052517f, -0.005355f, +0.000063f, -0.000045f}, + {-0.064016f, -0.008538f, -0.001790f, +0.001210f, +0.000117f}, + {-0.035765f, +0.136937f, -0.003958f, -0.000288f, -0.000023f}, + {-0.055646f, +0.013868f, -0.004689f, -0.000551f, +0.000038f}, + {-0.069712f, +0.026129f, -0.007603f, +0.000472f, -0.000000f}, + {-0.022298f, +0.108549f, -0.003048f, +0.000134f, +0.000029f} + }, + { + {+0.220027f, +0.326004f, +0.029195f, -0.000639f, +0.000050f}, + {+0.196112f, +0.377527f, +0.024063f, -0.000894f, +0.000082f}, + {+0.120792f, -0.254914f, +0.016146f, +0.000093f, -0.000054f}, + {+0.094942f, -0.058645f, +0.007709f, +0.000309f, -0.000035f}, + {+0.109837f, -0.090094f, +0.008580f, +0.000595f, -0.000051f}, + {+0.015004f, -0.336419f, -0.000747f, +0.000099f, -0.000037f}, + {+0.088851f, +0.073948f, +0.011663f, -0.000480f, +0.000014f}, + {+0.078671f, +0.147609f, +0.010996f, +0.000157f, -0.000013f}, + {-0.073075f, -0.041998f, -0.000840f, -0.000593f, -0.000038f}, + {-0.021795f, -0.078114f, -0.010687f, -0.000406f, +0.000022f}, + {+0.048839f, +0.075397f, +0.009105f, +0.000275f, +0.000010f}, + {+0.060558f, +0.174519f, +0.000133f, -0.000349f, +0.000030f}, + {-0.014867f, +0.171348f, +0.000948f, +0.000119f, +0.000048f}, + {+0.011606f, +0.111954f, +0.001552f, -0.000324f, +0.000023f}, + {+0.032653f, +0.181837f, +0.003210f, +0.000081f, -0.000029f}, + {-0.047749f, +0.068914f, -0.006585f, -0.000128f, -0.000011f} + }, + { + {+0.160319f, +0.417913f, +0.022833f, -0.000655f, -0.000102f}, + {+0.203183f, +0.369192f, +0.029570f, -0.001470f, -0.000179f}, + {-0.099428f, +0.084211f, -0.009701f, -0.000901f, +0.000019f}, + {-0.024797f, +0.121541f, +0.001449f, -0.000997f, +0.000010f}, + {-0.062623f, +0.173224f, -0.004907f, -0.001276f, +0.000047f}, + {-0.122967f, -0.126986f, -0.011441f, -0.000914f, +0.000015f}, + {-0.052738f, +0.283556f, -0.009426f, +0.001548f, -0.000011f}, + {+0.026749f, +0.238083f, -0.000760f, -0.000643f, -0.000018f}, + {-0.009777f, -0.145605f, -0.003329f, +0.002400f, +0.000014f}, + {-0.015861f, -0.086444f, +0.001699f, -0.001895f, -0.000191f}, + {+0.021170f, +0.125446f, -0.000128f, -0.000133f, +0.000040f}, + {+0.009541f, +0.253886f, -0.000901f, -0.000985f, -0.000105f}, + {+0.062589f, +0.060931f, +0.003167f, +0.000273f, +0.000019f}, + {+0.045937f, +0.052228f, +0.008096f, +0.000661f, -0.000035f}, + {+0.065525f, +0.132007f, +0.007909f, -0.000377f, +0.000001f}, + {+0.049219f, -0.081032f, +0.007172f, +0.000024f, -0.000024f} + }, + { + {-0.257389f, -0.225050f, -0.034043f, +0.000536f, -0.000034f}, + {-0.247632f, -0.326555f, -0.030602f, +0.000692f, -0.000048f}, + {-0.031117f, +0.179461f, -0.007189f, +0.000264f, +0.000055f}, + {-0.035804f, +0.099360f, -0.004701f, -0.000140f, +0.000038f}, + {-0.050312f, +0.188989f, -0.003722f, -0.000209f, +0.000050f}, + {+0.100154f, +0.206241f, +0.011197f, +0.000132f, +0.000040f}, + {-0.083770f, +0.242079f, -0.010883f, +0.000381f, -0.000023f}, + {-0.128871f, +0.005839f, -0.011060f, +0.000130f, +0.000016f}, + {+0.079686f, -0.004748f, +0.001794f, +0.000421f, +0.000023f}, + {+0.049708f, +0.006526f, +0.011594f, +0.000511f, -0.000001f}, + {-0.089665f, -0.042291f, -0.010250f, -0.000131f, -0.000016f}, + {-0.097341f, +0.094533f, -0.003394f, +0.000253f, -0.000020f}, + {-0.063601f, -0.124244f, -0.005358f, -0.000329f, -0.000050f}, + {-0.033103f, -0.074639f, -0.008297f, +0.000018f, -0.000018f}, + {-0.088809f, -0.106459f, -0.010306f, +0.000001f, +0.000028f}, + {+0.024983f, -0.120136f, +0.002311f, -0.000104f, +0.000013f} + }, + { + {-0.103698f, -0.459883f, -0.015029f, +0.000609f, +0.000094f}, + {-0.162130f, -0.457377f, -0.023723f, +0.001331f, +0.000162f}, + {+0.064814f, +0.022691f, +0.012901f, +0.000560f, -0.000021f}, + {+0.014719f, +0.018235f, +0.000043f, +0.000822f, -0.000013f}, + {+0.074601f, -0.003099f, +0.007367f, +0.000899f, -0.000047f}, + {+0.032786f, +0.305719f, +0.004336f, +0.000704f, -0.000017f}, + {+0.154173f, -0.111921f, +0.017036f, -0.001496f, +0.000014f}, + {+0.075072f, -0.308164f, +0.011544f, +0.000327f, +0.000019f}, + {-0.016061f, +0.143722f, +0.001013f, -0.002196f, -0.000011f}, + {-0.025959f, +0.115431f, -0.002496f, +0.001721f, +0.000173f}, + {+0.041136f, -0.248497f, +0.009339f, +0.000010f, -0.000035f}, + {+0.096543f, -0.197881f, +0.009153f, +0.000920f, +0.000096f}, + {+0.003482f, -0.225559f, +0.000330f, -0.000071f, -0.000017f}, + {-0.034753f, -0.075563f, -0.003521f, -0.000361f, +0.000033f}, + {-0.012501f, -0.228861f, +0.001789f, +0.000220f, -0.000002f}, + {-0.060118f, +0.006012f, -0.006537f, +0.000205f, +0.000020f} + }, + { + {+0.272901f, +0.120676f, +0.037748f, -0.000537f, +0.000024f}, + {+0.297115f, +0.254096f, +0.039956f, -0.000532f, +0.000029f}, + {+0.012561f, -0.060035f, +0.001952f, -0.000137f, -0.000057f}, + {-0.010704f, -0.021303f, -0.001694f, +0.000133f, -0.000041f}, + {-0.011296f, -0.129516f, -0.000519f, +0.000384f, -0.000049f}, + {-0.122480f, +0.073347f, -0.013051f, -0.000154f, -0.000043f}, + {-0.027641f, -0.385713f, +0.003287f, -0.000254f, +0.000026f}, + {+0.091871f, -0.289596f, +0.005177f, +0.000144f, -0.000020f}, + {-0.076925f, +0.038077f, -0.006550f, -0.000475f, -0.000017f}, + {-0.038364f, +0.096477f, -0.011620f, -0.000633f, -0.000016f}, + {+0.083812f, -0.194659f, +0.004197f, +0.000207f, +0.000021f}, + {+0.014333f, -0.322027f, -0.003857f, -0.000214f, +0.000012f}, + {+0.069724f, -0.130370f, +0.003481f, +0.000262f, +0.000055f}, + {+0.055755f, +0.063207f, +0.009924f, -0.000154f, +0.000014f}, + {+0.116659f, -0.036299f, +0.011120f, +0.000178f, -0.000028f}, + {+0.003252f, +0.097067f, -0.002843f, -0.000113f, -0.000015f} + }, + { + {+0.054050f, +0.455222f, +0.008683f, -0.000439f, -0.000087f}, + {+0.103203f, +0.556970f, +0.012926f, -0.001069f, -0.000150f}, + {-0.045598f, +0.034469f, -0.010843f, -0.000589f, +0.000024f}, + {+0.039968f, -0.100631f, +0.007931f, -0.000653f, +0.000016f}, + {-0.036140f, -0.084377f, -0.005388f, -0.000960f, +0.000048f}, + {+0.073377f, -0.218074f, +0.003890f, -0.000548f, +0.000019f}, + {-0.139694f, -0.217657f, -0.014427f, +0.001226f, -0.000017f}, + {-0.165152f, +0.096949f, -0.015920f, -0.000710f, -0.000018f}, + {+0.031303f, -0.142424f, +0.007473f, +0.002097f, +0.000008f}, + {+0.049659f, -0.036455f, +0.006360f, -0.001588f, -0.000158f}, + {-0.120231f, +0.105131f, -0.009262f, -0.000134f, +0.000029f}, + {-0.112765f, -0.136113f, -0.006454f, -0.000956f, -0.000090f}, + {-0.075212f, +0.079481f, -0.002605f, +0.000191f, +0.000013f}, + {+0.010244f, +0.133401f, +0.001533f, +0.000399f, -0.000031f}, + {-0.084844f, +0.273648f, -0.011540f, -0.000496f, +0.000003f}, + {+0.047604f, +0.022269f, +0.009154f, -0.000024f, -0.000017f} + }, + { + {-0.277495f, -0.057148f, -0.039168f, +0.000475f, -0.000017f}, + {-0.335782f, -0.115073f, -0.042124f, +0.000524f, -0.000017f}, + {-0.014669f, +0.088939f, +0.001371f, +0.000122f, +0.000060f}, + {+0.009872f, -0.151750f, -0.001271f, -0.000309f, +0.000043f}, + {+0.029086f, +0.017821f, +0.006048f, -0.000346f, +0.000049f}, + {+0.042390f, -0.261438f, +0.007011f, -0.000009f, +0.000045f}, + {+0.104924f, +0.146847f, +0.003710f, +0.000271f, -0.000026f}, + {+0.039062f, +0.403951f, +0.006577f, +0.000208f, +0.000025f}, + {+0.091871f, -0.050822f, +0.003447f, +0.000141f, +0.000018f}, + {+0.018408f, -0.085038f, +0.009119f, +0.000628f, +0.000033f}, + {+0.008166f, +0.290055f, -0.001289f, -0.000009f, -0.000025f}, + {+0.083446f, +0.145097f, +0.006817f, +0.000355f, -0.000005f}, + {+0.001946f, +0.186834f, -0.001987f, -0.000254f, -0.000062f}, + {-0.073121f, +0.003981f, -0.011768f, +0.000112f, -0.000011f}, + {-0.055297f, +0.324881f, -0.002032f, +0.000100f, +0.000030f}, + {-0.005812f, -0.063805f, -0.001869f, -0.000040f, +0.000017f} + }, + { + {-0.014583f, -0.461985f, -0.000589f, +0.000415f, +0.000084f}, + {-0.018754f, -0.598224f, -0.004168f, +0.000868f, +0.000145f}, + {+0.055019f, -0.010592f, +0.005290f, +0.000633f, -0.000030f}, + {-0.104242f, +0.017058f, -0.011823f, +0.000782f, -0.000020f}, + {-0.000800f, +0.063354f, -0.000572f, +0.000962f, -0.000051f}, + {-0.090619f, -0.057573f, -0.010215f, +0.000723f, -0.000024f}, + {+0.065017f, +0.191423f, +0.017537f, -0.001148f, +0.000017f}, + {+0.139685f, +0.247968f, +0.017011f, +0.000519f, +0.000015f}, + {-0.081755f, +0.219112f, -0.011774f, -0.001680f, -0.000011f}, + {-0.055793f, +0.030364f, -0.009245f, +0.001646f, +0.000143f}, + {+0.108310f, +0.127663f, +0.016687f, -0.000038f, -0.000024f}, + {+0.021618f, +0.220697f, +0.010039f, +0.000820f, +0.000085f}, + {+0.057142f, +0.095325f, +0.009328f, -0.000335f, -0.000006f}, + {+0.036537f, -0.167818f, +0.005791f, -0.000423f, +0.000028f}, + {+0.142336f, +0.030915f, +0.012827f, +0.000283f, -0.000005f}, + {-0.054469f, +0.008573f, -0.006883f, +0.000115f, +0.000013f} + }, + { + {+0.285346f, -0.000721f, +0.040577f, -0.000527f, +0.000010f}, + {+0.330415f, -0.056420f, +0.045563f, -0.000643f, +0.000004f}, + {-0.012995f, -0.109088f, -0.001469f, -0.000116f, -0.000061f}, + {+0.054559f, +0.256864f, +0.005920f, +0.000204f, -0.000044f}, + {-0.023615f, +0.028111f, -0.005911f, +0.000294f, -0.000047f}, + {+0.037741f, +0.135965f, -0.001385f, -0.000118f, -0.000047f}, + {-0.085123f, -0.059304f, -0.014815f, -0.000093f, +0.000026f}, + {-0.148478f, -0.190646f, -0.017151f, -0.000040f, -0.000030f}, + {-0.071070f, +0.234644f, +0.000090f, +0.000012f, -0.000018f}, + {-0.012169f, +0.103078f, -0.005526f, -0.000708f, -0.000048f}, + {-0.074830f, -0.156990f, -0.009538f, +0.000116f, +0.000028f}, + {-0.062857f, +0.082116f, -0.012816f, -0.000338f, -0.000001f}, + {-0.030566f, -0.039000f, -0.001188f, +0.000200f, +0.000068f}, + {+0.059034f, -0.139462f, +0.005767f, +0.000011f, +0.000009f}, + {-0.076286f, -0.295015f, -0.006131f, +0.000097f, -0.000032f}, + {+0.020240f, +0.124242f, +0.005046f, +0.000022f, -0.000019f} + }, + { + {-0.029891f, +0.483300f, -0.005377f, -0.000391f, -0.000081f}, + {-0.047047f, +0.524471f, -0.005924f, -0.000814f, -0.000145f}, + {-0.033704f, -0.078188f, -0.004373f, -0.000586f, +0.000038f}, + {+0.113469f, +0.163524f, +0.016393f, -0.000689f, +0.000025f}, + {+0.026484f, -0.050686f, +0.004980f, -0.000903f, +0.000054f}, + {+0.034959f, +0.130515f, +0.008100f, -0.000616f, +0.000030f}, + {-0.066335f, -0.098213f, -0.008880f, +0.001011f, -0.000017f}, + {-0.023755f, -0.374088f, -0.006475f, -0.000645f, -0.000010f}, + {+0.134342f, -0.080266f, +0.017137f, +0.001581f, +0.000017f}, + {+0.074905f, -0.029652f, +0.011288f, -0.001578f, -0.000126f}, + {-0.054496f, -0.184572f, -0.009789f, -0.000066f, +0.000019f}, + {+0.016479f, -0.037096f, -0.001911f, -0.000841f, -0.000081f}, + {-0.021095f, -0.045463f, -0.006941f, +0.000367f, -0.000005f}, + {-0.086237f, +0.078591f, -0.009216f, +0.000337f, -0.000026f}, + {-0.069456f, -0.298926f, -0.009331f, -0.000395f, +0.000009f}, + {+0.062149f, +0.062591f, +0.008033f, -0.000068f, -0.000009f} + }, + { + {-0.287720f, +0.086727f, -0.040473f, +0.000543f, -0.000002f}, + {-0.307994f, +0.118968f, -0.043852f, +0.000752f, +0.000013f}, + {+0.022546f, +0.002148f, +0.001070f, +0.000030f, +0.000061f}, + {-0.122549f, -0.198231f, -0.013063f, -0.000256f, +0.000044f}, + {+0.010325f, -0.076779f, +0.004480f, -0.000277f, +0.000045f}, + {-0.047884f, -0.004957f, -0.004446f, +0.000008f, +0.000047f}, + {+0.101276f, +0.163028f, +0.013822f, +0.000017f, -0.000028f}, + {+0.155414f, -0.094864f, +0.020739f, +0.000087f, +0.000033f}, + {+0.000170f, -0.277663f, -0.004084f, -0.000303f, +0.000013f}, + {-0.006631f, -0.159391f, +0.003115f, +0.000670f, +0.000060f}, + {+0.094163f, +0.047695f, +0.013081f, -0.000014f, -0.000031f}, + {+0.015662f, -0.033250f, +0.008826f, +0.000442f, +0.000008f}, + {+0.006909f, +0.002414f, +0.001228f, -0.000038f, -0.000070f}, + {+0.006389f, +0.219286f, -0.001425f, -0.000018f, -0.000007f}, + {+0.134427f, +0.013316f, +0.014160f, -0.000072f, +0.000032f}, + {-0.053148f, -0.113719f, -0.007802f, -0.000103f, +0.000020f} + }, + { + {+0.079885f, -0.476239f, +0.011873f, +0.000403f, +0.000078f}, + {+0.090327f, -0.495394f, +0.013216f, +0.000916f, +0.000142f}, + {+0.000547f, +0.029987f, +0.004365f, +0.000538f, -0.000045f}, + {-0.078456f, -0.260754f, -0.012403f, +0.000685f, -0.000030f}, + {-0.048231f, +0.015397f, -0.007225f, +0.000847f, -0.000058f}, + {+0.004788f, -0.088135f, +0.001735f, +0.000622f, -0.000036f}, + {+0.068597f, +0.218020f, +0.007943f, -0.001019f, +0.000017f}, + {-0.078771f, +0.264267f, -0.009097f, +0.000536f, +0.000005f}, + {-0.131816f, -0.067791f, -0.019315f, -0.001572f, -0.000023f}, + {-0.095197f, -0.024052f, -0.012511f, +0.001509f, +0.000110f}, + {+0.005662f, +0.184911f, +0.000567f, +0.000000f, -0.000014f}, + {+0.009469f, -0.021505f, +0.002081f, +0.000772f, +0.000077f}, + {+0.033042f, -0.040492f, +0.006178f, -0.000358f, +0.000017f}, + {+0.078726f, +0.109328f, +0.007889f, -0.000339f, +0.000024f}, + {-0.046322f, +0.287690f, -0.005571f, +0.000332f, -0.000013f}, + {-0.044568f, -0.127346f, -0.006458f, +0.000067f, +0.000005f} + }, + { + {+0.276202f, -0.173485f, +0.038792f, -0.000516f, -0.000006f}, + {+0.290883f, -0.185607f, +0.040080f, -0.000773f, -0.000032f}, + {+0.006320f, +0.034810f, -0.001793f, -0.000042f, -0.000058f}, + {+0.162615f, +0.113765f, +0.021156f, +0.000233f, -0.000044f}, + {+0.015723f, +0.117462f, +0.000807f, +0.000218f, -0.000042f}, + {+0.035133f, -0.040557f, +0.002714f, -0.000053f, -0.000045f}, + {-0.149176f, -0.117916f, -0.017638f, +0.000076f, +0.000032f}, + {-0.096551f, +0.235346f, -0.015008f, -0.000034f, -0.000033f}, + {+0.060894f, +0.224376f, +0.012831f, +0.000523f, -0.000005f}, + {+0.046438f, +0.197810f, +0.002809f, -0.000665f, -0.000069f}, + {-0.091389f, +0.035774f, -0.012879f, +0.000048f, +0.000034f}, + {-0.015830f, -0.061261f, -0.007852f, -0.000438f, -0.000014f}, + {+0.002026f, -0.092831f, -0.002527f, +0.000001f, +0.000068f}, + {-0.065981f, -0.109512f, -0.004136f, +0.000073f, +0.000006f}, + {-0.096454f, +0.210224f, -0.012022f, +0.000110f, -0.000032f}, + {+0.076635f, +0.057848f, +0.009841f, +0.000158f, -0.000021f} + }, + { + {-0.125058f, +0.440590f, -0.018260f, -0.000430f, -0.000074f}, + {-0.130636f, +0.461671f, -0.019013f, -0.001042f, -0.000135f}, + {-0.005358f, +0.049252f, -0.002302f, -0.000396f, +0.000051f}, + {+0.032652f, +0.314396f, +0.003878f, -0.000647f, +0.000035f}, + {+0.057782f, +0.056244f, +0.005456f, -0.000765f, +0.000061f}, + {-0.029537f, +0.058278f, -0.004239f, -0.000490f, +0.000041f}, + {-0.028429f, -0.304901f, -0.002344f, +0.001021f, -0.000019f}, + {+0.130605f, -0.114123f, +0.015550f, -0.000447f, -0.000002f}, + {+0.097618f, +0.163746f, +0.014826f, +0.001576f, +0.000024f}, + {+0.095269f, +0.125227f, +0.010570f, -0.001415f, -0.000094f}, + {+0.036826f, -0.161036f, +0.004519f, -0.000009f, +0.000008f}, + {-0.033206f, -0.037588f, -0.003181f, -0.000776f, -0.000072f}, + {-0.072280f, +0.019767f, -0.008230f, +0.000211f, -0.000025f}, + {-0.018897f, -0.179348f, -0.001641f, +0.000298f, -0.000022f}, + {+0.125361f, -0.129557f, +0.014806f, -0.000290f, +0.000016f}, + {+0.013372f, +0.152966f, +0.003485f, -0.000081f, -0.000000f} + }, + { + {-0.255232f, +0.238323f, -0.036506f, +0.000482f, +0.000012f}, + {-0.271075f, +0.243750f, -0.037165f, +0.000660f, +0.000051f}, + {-0.023107f, +0.018988f, -0.002567f, +0.000111f, +0.000056f}, + {-0.186496f, -0.022822f, -0.024016f, -0.000167f, +0.000044f}, + {-0.051695f, -0.108630f, -0.002988f, -0.000126f, +0.000040f}, + {-0.009503f, +0.085941f, -0.000815f, +0.000139f, +0.000044f}, + {+0.180203f, +0.018265f, +0.021900f, -0.000114f, -0.000036f}, + {+0.016842f, -0.287897f, +0.004711f, +0.000063f, +0.000033f}, + {-0.099412f, -0.136019f, -0.018932f, -0.000549f, -0.000004f}, + {-0.093434f, -0.165866f, -0.008284f, +0.000735f, +0.000077f}, + {+0.070607f, -0.107384f, +0.011250f, -0.000036f, -0.000037f}, + {+0.051205f, +0.088169f, +0.009120f, +0.000422f, +0.000021f}, + {+0.038077f, +0.190808f, +0.007278f, -0.000071f, -0.000066f}, + {+0.068484f, -0.044857f, +0.006706f, -0.000103f, -0.000005f}, + {+0.001471f, -0.319381f, +0.000965f, -0.000110f, +0.000032f}, + {-0.082910f, +0.001623f, -0.012705f, -0.000176f, +0.000021f} + }, + { + {+0.160937f, -0.399834f, +0.024221f, +0.000432f, +0.000069f}, + {+0.165837f, -0.426649f, +0.024449f, +0.001120f, +0.000123f}, + {+0.023251f, -0.053963f, +0.006296f, +0.000280f, -0.000056f}, + {+0.026012f, -0.349222f, +0.003958f, +0.000583f, -0.000040f}, + {-0.039815f, -0.122590f, -0.005933f, +0.000681f, -0.000065f}, + {+0.034180f, +0.017407f, +0.005868f, +0.000354f, -0.000044f}, + {-0.036119f, +0.354110f, -0.007651f, -0.001004f, +0.000024f}, + {-0.131608f, -0.060108f, -0.015438f, +0.000373f, +0.000002f}, + {-0.047240f, -0.215086f, -0.007922f, -0.001603f, -0.000021f}, + {-0.065165f, -0.208130f, -0.007649f, +0.001302f, +0.000078f}, + {-0.065730f, +0.103768f, -0.008899f, -0.000008f, -0.000000f}, + {+0.017223f, +0.140007f, +0.001227f, +0.000774f, +0.000066f}, + {+0.083700f, +0.123118f, +0.007692f, -0.000085f, +0.000029f}, + {-0.033766f, +0.111436f, -0.004405f, -0.000238f, +0.000019f}, + {-0.130713f, -0.118837f, -0.014005f, +0.000285f, -0.000018f}, + {+0.016465f, -0.154956f, +0.002867f, +0.000097f, -0.000004f} + }, + { + {+0.233948f, -0.286085f, +0.033289f, -0.000467f, -0.000018f}, + {+0.251749f, -0.291487f, +0.034882f, -0.000530f, -0.000064f}, + {+0.025018f, -0.051984f, +0.002062f, -0.000213f, -0.000058f}, + {+0.182278f, -0.109310f, +0.023310f, +0.000129f, -0.000046f}, + {+0.065186f, +0.041803f, +0.007285f, +0.000055f, -0.000040f}, + {-0.015347f, -0.057135f, -0.002287f, -0.000244f, -0.000046f}, + {-0.178612f, +0.136904f, -0.019882f, +0.000114f, +0.000039f}, + {+0.053858f, +0.222770f, +0.004143f, -0.000170f, -0.000036f}, + {+0.110687f, +0.021864f, +0.019313f, +0.000540f, +0.000009f}, + {+0.120059f, +0.080527f, +0.013286f, -0.000793f, -0.000086f}, + {-0.042102f, +0.139525f, -0.007143f, -0.000010f, +0.000040f}, + {-0.075712f, +0.002196f, -0.010631f, -0.000380f, -0.000025f}, + {-0.101650f, -0.158974f, -0.013076f, +0.000245f, +0.000069f}, + {-0.030059f, +0.115541f, -0.003547f, +0.000111f, +0.000004f}, + {+0.094721f, +0.222768f, +0.008889f, +0.000048f, -0.000033f}, + {+0.083573f, -0.053860f, +0.010877f, +0.000192f, -0.000022f} + }, + { + {-0.194975f, +0.371746f, -0.029687f, -0.000407f, -0.000065f}, + {-0.199395f, +0.402227f, -0.030381f, -0.001070f, -0.000111f}, + {-0.043558f, +0.051835f, -0.007510f, -0.000301f, +0.000063f}, + {-0.080069f, +0.290708f, -0.009721f, -0.000585f, +0.000048f}, + {+0.028118f, +0.096712f, +0.004235f, -0.000661f, +0.000071f}, + {-0.020670f, -0.048284f, -0.004447f, -0.000361f, +0.000049f}, + {+0.106751f, -0.298076f, +0.013906f, +0.000980f, -0.000031f}, + {+0.091450f, +0.162172f, +0.012475f, -0.000348f, -0.000002f}, + {-0.007498f, +0.199756f, +0.002586f, +0.001500f, +0.000016f}, + {+0.027250f, +0.222848f, +0.002393f, -0.001277f, -0.000059f}, + {+0.083457f, -0.055583f, +0.011895f, +0.000049f, -0.000010f}, + {+0.023912f, -0.145973f, +0.001523f, -0.000736f, -0.000060f}, + {-0.039347f, -0.252351f, -0.003368f, +0.000088f, -0.000034f}, + {+0.047081f, -0.002879f, +0.005773f, +0.000201f, -0.000016f}, + {+0.061353f, +0.270295f, +0.008425f, -0.000276f, +0.000021f}, + {-0.056743f, +0.162677f, -0.007387f, -0.000128f, +0.000010f} + }, + { + {-0.209644f, +0.348707f, -0.029121f, +0.000472f, +0.000023f}, + {-0.234739f, +0.346303f, -0.031613f, +0.000452f, +0.000075f}, + {-0.012221f, +0.097631f, -0.001448f, +0.000286f, +0.000064f}, + {-0.151155f, +0.176475f, -0.021969f, -0.000127f, +0.000048f}, + {-0.074908f, -0.067483f, -0.011111f, -0.000037f, +0.000040f}, + {+0.024868f, +0.020084f, +0.003583f, +0.000348f, +0.000052f}, + {+0.132213f, -0.252477f, +0.017287f, -0.000139f, -0.000041f}, + {-0.086895f, -0.114633f, -0.010835f, +0.000242f, +0.000044f}, + {-0.087061f, +0.080457f, -0.017193f, -0.000553f, -0.000009f}, + {-0.128529f, -0.021349f, -0.015609f, +0.000805f, +0.000095f}, + {+0.009730f, -0.170684f, +0.001530f, +0.000070f, -0.000041f}, + {+0.063989f, -0.082569f, +0.011861f, +0.000327f, +0.000027f}, + {+0.131743f, +0.010936f, +0.017709f, -0.000376f, -0.000079f}, + {-0.009127f, -0.086499f, -0.000601f, -0.000142f, -0.000005f}, + {-0.128048f, -0.022758f, -0.015753f, -0.000038f, +0.000035f}, + {-0.059404f, +0.160944f, -0.006871f, -0.000228f, +0.000022f} + }, + { + {+0.229440f, -0.322824f, +0.033988f, +0.000389f, +0.000061f}, + {+0.240846f, -0.383749f, +0.036120f, +0.000976f, +0.000103f}, + {+0.056585f, -0.008789f, +0.009971f, +0.000419f, -0.000080f}, + {+0.105118f, -0.219752f, +0.015610f, +0.000635f, -0.000061f}, + {-0.026805f, -0.145169f, -0.000897f, +0.000699f, -0.000083f}, + {+0.004898f, +0.050127f, +0.002984f, +0.000479f, -0.000062f}, + {-0.141946f, +0.172154f, -0.021221f, -0.000916f, +0.000039f}, + {-0.048244f, -0.174628f, -0.006354f, +0.000456f, -0.000003f}, + {+0.037664f, -0.109078f, +0.001169f, -0.001297f, -0.000015f}, + {+0.006723f, -0.230147f, +0.003197f, +0.001300f, +0.000034f}, + {-0.095384f, -0.009012f, -0.012879f, -0.000031f, +0.000023f}, + {-0.048765f, +0.092236f, -0.006693f, +0.000674f, +0.000056f}, + {-0.024712f, +0.249773f, -0.004585f, -0.000253f, +0.000048f}, + {-0.029610f, -0.053064f, -0.004978f, -0.000209f, +0.000011f}, + {+0.020111f, -0.251548f, +0.002558f, +0.000313f, -0.000027f}, + {+0.088864f, -0.064651f, +0.009687f, +0.000147f, -0.000018f} + }, + { + {+0.175493f, -0.403144f, +0.024964f, -0.000494f, -0.000029f}, + {+0.208289f, -0.431823f, +0.027399f, -0.000496f, -0.000086f}, + {-0.008906f, -0.108845f, -0.001685f, -0.000188f, -0.000067f}, + {+0.127825f, -0.183453f, +0.018081f, +0.000198f, -0.000048f}, + {+0.107325f, +0.060873f, +0.013159f, +0.000090f, -0.000038f}, + {-0.020607f, +0.012217f, -0.003265f, -0.000308f, -0.000058f}, + {-0.079060f, +0.266458f, -0.009775f, +0.000157f, +0.000041f}, + {+0.096681f, +0.050055f, +0.012663f, -0.000225f, -0.000055f}, + {+0.051411f, -0.089715f, +0.013539f, +0.000663f, +0.000008f}, + {+0.129678f, -0.037696f, +0.015815f, -0.000703f, -0.000099f}, + {+0.037248f, +0.197082f, +0.005086f, -0.000193f, +0.000037f}, + {-0.043816f, +0.101985f, -0.008254f, -0.000336f, -0.000028f}, + {-0.117065f, +0.106956f, -0.016478f, +0.000283f, +0.000091f}, + {+0.024549f, +0.029471f, +0.003315f, +0.000242f, +0.000008f}, + {+0.102968f, -0.125147f, +0.012245f, +0.000115f, -0.000038f}, + {+0.007500f, -0.187296f, +0.002430f, +0.000314f, -0.000019f} + }, + { + {-0.255049f, +0.256577f, -0.038217f, -0.000401f, -0.000056f}, + {-0.286340f, +0.326727f, -0.042071f, -0.000948f, -0.000098f}, + {-0.058758f, -0.032715f, -0.010103f, -0.000506f, +0.000109f}, + {-0.123738f, +0.204736f, -0.019030f, -0.000624f, +0.000081f}, + {-0.004658f, +0.232611f, -0.002627f, -0.000673f, +0.000101f}, + {+0.001246f, -0.020482f, -0.002726f, -0.000581f, +0.000087f}, + {+0.149860f, -0.087638f, +0.023219f, +0.000836f, -0.000049f}, + {+0.011705f, +0.182241f, +0.000824f, -0.000663f, +0.000015f}, + {-0.036322f, +0.046246f, -0.002434f, +0.001110f, +0.000020f}, + {-0.041445f, +0.225060f, -0.008066f, -0.001247f, -0.000002f}, + {+0.082241f, +0.130716f, +0.009581f, -0.000052f, -0.000037f}, + {+0.061982f, -0.060921f, +0.008434f, -0.000587f, -0.000055f}, + {+0.070313f, -0.179626f, +0.010580f, +0.000496f, -0.000079f}, + {+0.010271f, +0.049933f, +0.003107f, +0.000216f, -0.000007f}, + {-0.072320f, +0.142479f, -0.007956f, -0.000403f, +0.000037f}, + {-0.080097f, -0.050215f, -0.010237f, -0.000128f, +0.000027f} + }, + { + {-0.138659f, +0.433413f, -0.019489f, +0.000507f, +0.000036f}, + {-0.163451f, +0.512532f, -0.021259f, +0.000613f, +0.000105f}, + {+0.031656f, +0.104824f, +0.003994f, -0.000128f, +0.000059f}, + {-0.110770f, +0.224024f, -0.015294f, -0.000397f, +0.000039f}, + {-0.125629f, +0.045496f, -0.015544f, -0.000259f, +0.000027f}, + {+0.013056f, -0.002303f, +0.002874f, +0.000034f, +0.000053f}, + {+0.034706f, -0.263278f, +0.003483f, -0.000141f, -0.000039f}, + {-0.095465f, +0.017678f, -0.011595f, +0.000132f, +0.000064f}, + {-0.033817f, +0.054176f, -0.010428f, -0.000890f, -0.000012f}, + {-0.119869f, +0.100206f, -0.015399f, +0.000474f, +0.000091f}, + {-0.083578f, -0.121580f, -0.008601f, +0.000327f, -0.000026f}, + {+0.021962f, -0.124782f, +0.004983f, +0.000417f, +0.000031f}, + {+0.081591f, -0.160439f, +0.012843f, +0.000024f, -0.000092f}, + {-0.025765f, -0.006872f, -0.004893f, -0.000318f, -0.000015f}, + {-0.048404f, +0.176242f, -0.007439f, -0.000200f, +0.000038f}, + {+0.029349f, +0.118206f, +0.002646f, -0.000434f, +0.000011f} + }, + { + {+0.273332f, -0.197278f, +0.041000f, +0.000427f, +0.000049f}, + {+0.321458f, -0.231555f, +0.047137f, +0.001083f, +0.000091f}, + {+0.051312f, +0.073576f, +0.009852f, +0.000350f, -0.000146f}, + {+0.149316f, -0.177043f, +0.022631f, +0.000468f, -0.000104f}, + {+0.053207f, -0.228176f, +0.008455f, +0.000505f, -0.000122f}, + {+0.006068f, +0.008715f, +0.003223f, +0.000482f, -0.000122f}, + {-0.145901f, +0.015682f, -0.022924f, -0.000759f, +0.000061f}, + {+0.021739f, -0.160951f, +0.002760f, +0.000739f, -0.000036f}, + {+0.029254f, -0.044035f, +0.001822f, -0.001067f, -0.000028f}, + {+0.071428f, -0.194582f, +0.013164f, +0.000987f, -0.000034f}, + {-0.035270f, -0.192622f, -0.005952f, +0.000220f, +0.000050f}, + {-0.068773f, +0.014813f, -0.009109f, +0.000533f, +0.000056f}, + {-0.089870f, +0.103512f, -0.014502f, -0.000459f, +0.000122f}, + {+0.001775f, -0.051927f, +0.000206f, -0.000272f, +0.000005f}, + {+0.077868f, -0.020072f, +0.010512f, +0.000382f, -0.000051f}, + {+0.053027f, +0.078728f, +0.007627f, +0.000029f, -0.000036f} + }, + { + {+0.101834f, -0.458014f, +0.014426f, -0.000475f, -0.000042f}, + {+0.106819f, -0.558024f, +0.013421f, -0.000683f, -0.000132f}, + {-0.052912f, -0.088899f, -0.008225f, +0.000491f, -0.000027f}, + {+0.083094f, -0.280030f, +0.010300f, +0.000632f, -0.000016f}, + {+0.114197f, -0.131784f, +0.014954f, +0.000412f, -0.000002f}, + {-0.019246f, -0.031443f, -0.004356f, +0.000329f, -0.000027f}, + {+0.005316f, +0.248103f, +0.002960f, +0.000118f, +0.000033f}, + {+0.080531f, -0.067083f, +0.011460f, +0.000110f, -0.000064f}, + {+0.031144f, -0.046782f, +0.008670f, +0.001209f, +0.000024f}, + {+0.102756f, -0.143879f, +0.013003f, -0.000283f, -0.000065f}, + {+0.095015f, +0.011155f, +0.012207f, -0.000367f, +0.000008f}, + {+0.004913f, +0.131661f, -0.000343f, -0.000524f, -0.000039f}, + {-0.046459f, +0.170846f, -0.007777f, -0.000479f, +0.000069f}, + {+0.027234f, -0.016428f, +0.003165f, +0.000304f, +0.000026f}, + {+0.005481f, -0.131071f, +0.001565f, +0.000318f, -0.000030f}, + {-0.043474f, -0.073298f, -0.006440f, +0.000550f, +0.000003f} + }, + { + {-0.286640f, +0.137246f, -0.043420f, -0.000432f, -0.000040f}, + {-0.340199f, +0.128020f, -0.049926f, -0.001339f, -0.000072f}, + {-0.035997f, -0.119831f, -0.005662f, +0.000296f, +0.000179f}, + {-0.172429f, +0.110349f, -0.024201f, -0.000100f, +0.000122f}, + {-0.092373f, +0.185204f, -0.014035f, -0.000067f, +0.000138f}, + {-0.010912f, -0.048983f, -0.001816f, +0.000075f, +0.000154f}, + {+0.129079f, +0.059883f, +0.019833f, +0.000637f, -0.000073f}, + {-0.041407f, +0.122204f, -0.006834f, -0.000592f, +0.000062f}, + {-0.030715f, +0.048574f, -0.001376f, +0.001126f, +0.000032f}, + {-0.096213f, +0.160581f, -0.016571f, -0.000370f, +0.000063f}, + {-0.010051f, +0.173763f, -0.000750f, -0.000501f, -0.000056f}, + {+0.062657f, +0.045986f, +0.006800f, -0.000608f, -0.000057f}, + {+0.093242f, -0.041300f, +0.014445f, -0.000123f, -0.000165f}, + {-0.019827f, +0.053398f, -0.000412f, +0.000436f, -0.000009f}, + {-0.057687f, -0.032809f, -0.008352f, -0.000201f, +0.000065f}, + {-0.029198f, -0.096300f, -0.002960f, +0.000112f, +0.000041f} + }, + { + {-0.065817f, +0.474129f, -0.008963f, +0.000406f, +0.000046f}, + {-0.048357f, +0.572445f, -0.005311f, +0.000514f, +0.000163f}, + {+0.075398f, +0.048030f, +0.008271f, -0.000640f, -0.000031f}, + {-0.038405f, +0.313945f, -0.005856f, -0.000669f, -0.000022f}, + {-0.086028f, +0.192206f, -0.012072f, -0.000418f, -0.000038f}, + {+0.040227f, +0.025362f, +0.003912f, -0.000532f, -0.000024f}, + {-0.038209f, -0.193928f, -0.006045f, -0.000139f, -0.000021f}, + {-0.067018f, +0.081277f, -0.009330f, -0.000374f, +0.000051f}, + {-0.028904f, +0.056950f, -0.007486f, -0.001345f, -0.000045f}, + {-0.078983f, +0.183476f, -0.010913f, +0.000304f, +0.000020f}, + {-0.083563f, +0.058421f, -0.010558f, +0.000255f, +0.000015f}, + {-0.030882f, -0.097232f, -0.001515f, +0.000622f, +0.000053f}, + {+0.015685f, -0.158569f, +0.005189f, +0.000820f, -0.000018f}, + {-0.013899f, +0.061952f, -0.002806f, -0.000268f, -0.000038f}, + {+0.012586f, +0.075138f, +0.001144f, -0.000413f, +0.000015f}, + {+0.050911f, +0.027618f, +0.006661f, -0.000507f, -0.000023f} + }, + { + {+0.298262f, -0.083362f, +0.045235f, +0.000350f, +0.000028f}, + {+0.345899f, -0.033997f, +0.051595f, +0.001615f, +0.000035f}, + {-0.000119f, +0.165002f, +0.002953f, -0.001311f, -0.000187f}, + {+0.171388f, -0.008423f, +0.025114f, -0.000464f, -0.000125f}, + {+0.115274f, -0.117327f, +0.017963f, -0.000487f, -0.000138f}, + {-0.008614f, +0.100535f, +0.001469f, -0.001024f, -0.000165f}, + {-0.096130f, -0.104542f, -0.016843f, -0.000419f, +0.000082f}, + {+0.057723f, -0.112429f, +0.010191f, +0.000184f, -0.000084f}, + {+0.036341f, -0.043085f, +0.001450f, -0.001349f, -0.000025f}, + {+0.112953f, -0.110523f, +0.019836f, -0.000405f, -0.000071f}, + {+0.043415f, -0.138944f, +0.005951f, +0.000778f, +0.000051f}, + {-0.038181f, -0.085067f, -0.005138f, +0.000773f, +0.000051f}, + {-0.082623f, -0.007927f, -0.014925f, +0.001161f, +0.000188f}, + {+0.027034f, -0.000974f, +0.001645f, -0.000490f, +0.000020f}, + {+0.035360f, +0.038752f, +0.006345f, -0.000067f, -0.000073f}, + {+0.000083f, +0.105539f, -0.000772f, -0.000317f, -0.000036f} + }, + { + {+0.027126f, -0.497380f, +0.003317f, -0.000351f, -0.000045f}, + {-0.007859f, -0.574645f, -0.003243f, -0.000139f, -0.000188f}, + {-0.075777f, +0.049221f, -0.008353f, -0.000117f, +0.000106f}, + {-0.000094f, -0.270760f, +0.000675f, +0.000190f, +0.000068f}, + {+0.052764f, -0.211602f, +0.007618f, -0.000144f, +0.000084f}, + {-0.046479f, +0.043520f, -0.004619f, -0.000085f, +0.000093f}, + {+0.048000f, +0.115677f, +0.008039f, +0.000243f, +0.000005f}, + {+0.053119f, -0.119462f, +0.006689f, +0.000259f, -0.000024f}, + {+0.023530f, -0.067795f, +0.006354f, +0.001215f, +0.000069f}, + {+0.051960f, -0.201931f, +0.007334f, -0.001040f, +0.000035f}, + {+0.061094f, -0.110021f, +0.007462f, +0.000103f, -0.000039f}, + {+0.036876f, +0.032412f, +0.003266f, -0.000534f, -0.000070f}, + {+0.001902f, +0.122288f, -0.002472f, -0.000241f, -0.000056f}, + {-0.004270f, -0.048829f, +0.000734f, +0.000014f, +0.000048f}, + {-0.012745f, -0.036706f, -0.002273f, +0.000205f, +0.000006f}, + {-0.042314f, +0.038832f, -0.005804f, +0.000347f, +0.000043f} + }, + { + {-0.307088f, +0.013827f, -0.046648f, -0.000063f, -0.000017f}, + {-0.343985f, -0.057778f, -0.051999f, -0.001370f, +0.000021f}, + {+0.039378f, -0.130507f, -0.000123f, +0.002505f, +0.000156f}, + {-0.152973f, -0.035960f, -0.024197f, +0.000907f, +0.000105f}, + {-0.122328f, +0.057169f, -0.020503f, +0.000916f, +0.000113f}, + {+0.036115f, -0.084847f, -0.000437f, +0.002283f, +0.000139f}, + {+0.065884f, +0.089825f, +0.012704f, +0.000253f, -0.000086f}, + {-0.076176f, +0.079461f, -0.013926f, +0.000844f, +0.000095f}, + {-0.041886f, +0.032735f, -0.001798f, +0.001521f, +0.000002f}, + {-0.120605f, +0.060574f, -0.022209f, +0.000951f, +0.000049f}, + {-0.065666f, +0.088077f, -0.009755f, -0.000580f, -0.000035f}, + {+0.014536f, +0.066997f, +0.002290f, -0.001040f, -0.000035f}, + {+0.069578f, +0.020859f, +0.015775f, -0.002732f, -0.000173f}, + {-0.018357f, -0.025356f, -0.001559f, +0.000309f, -0.000039f}, + {-0.021973f, -0.023763f, -0.004557f, +0.000507f, +0.000072f}, + {+0.024594f, -0.064613f, +0.005019f, +0.000113f, +0.000019f} + }, + { + {+0.017452f, +0.509103f, +0.002330f, +0.000354f, +0.000040f}, + {+0.065401f, +0.568079f, +0.010528f, -0.000542f, +0.000194f}, + {+0.050175f, -0.114107f, +0.005162f, +0.003266f, -0.000174f}, + {+0.018374f, +0.227727f, +0.003630f, +0.001902f, -0.000110f}, + {-0.023543f, +0.209166f, -0.002096f, +0.002246f, -0.000125f}, + {+0.031298f, -0.092434f, +0.002541f, +0.002737f, -0.000158f}, + {-0.039294f, -0.069055f, -0.007101f, -0.000802f, +0.000015f}, + {-0.027981f, +0.151965f, -0.004965f, +0.000568f, -0.000008f}, + {-0.016092f, +0.076462f, -0.004970f, -0.000449f, -0.000085f}, + {-0.025683f, +0.205232f, -0.002533f, +0.003878f, -0.000082f}, + {-0.031489f, +0.139294f, -0.004565f, -0.001598f, +0.000056f}, + {-0.026207f, +0.002872f, -0.002107f, +0.000154f, +0.000084f}, + {-0.008497f, -0.098826f, +0.002487f, -0.002569f, +0.000130f}, + {+0.010858f, +0.022687f, +0.002492f, +0.000762f, -0.000051f}, + {+0.007112f, +0.019771f, +0.000809f, +0.000752f, -0.000028f}, + {+0.017429f, -0.074807f, +0.003855f, +0.000473f, -0.000058f} + } +}; + +const float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= +{ + { + {-0.132965f, +0.086484f, +0.111577f, -0.006297f, -0.000146f}, + {-0.159214f, +0.438495f, -0.131837f, -0.004567f, -0.000134f}, + {-0.006365f, -0.027154f, +0.040068f, -0.008136f, +0.000115f}, + {-0.012177f, +0.011068f, +0.006759f, -0.003623f, +0.000106f}, + {-0.003524f, +0.002365f, -0.008243f, +0.002720f, +0.000173f}, + {+0.001684f, -0.006593f, -0.024280f, +0.012226f, +0.000133f}, + {+0.003794f, -0.002370f, +0.013706f, -0.004985f, -0.000191f}, + {+0.009569f, -0.049227f, +0.045250f, -0.003942f, -0.000006f}, + {-0.015413f, +0.062027f, -0.005814f, -0.010696f, -0.000183f}, + {-0.012650f, +0.030376f, +0.022293f, -0.005058f, -0.000424f}, + {+0.003808f, -0.011707f, -0.008010f, +0.002270f, +0.000068f}, + {-0.003343f, +0.012704f, +0.014571f, -0.003409f, -0.000255f}, + {+0.000428f, +0.007434f, +0.003549f, -0.001445f, +0.000011f}, + {-0.006298f, +0.029469f, -0.007911f, +0.000838f, -0.000089f}, + {-0.003358f, +0.002973f, +0.012948f, -0.001507f, +0.000003f}, + {-0.000168f, +0.002647f, +0.005935f, -0.001295f, -0.000063f} + }, + { + {+0.075202f, +0.228858f, +0.021577f, -0.002573f, -0.000120f}, + {+0.061927f, +0.923113f, -0.018254f, -0.003553f, -0.000135f}, + {+0.002952f, -0.050194f, +0.020301f, -0.000013f, +0.000082f}, + {+0.008722f, +0.019708f, -0.013956f, +0.001282f, +0.000072f}, + {+0.001425f, +0.021365f, -0.019206f, -0.005433f, +0.000123f}, + {-0.004675f, -0.040742f, -0.087083f, -0.008021f, +0.000087f}, + {-0.001220f, -0.034662f, +0.025115f, +0.004561f, -0.000118f}, + {-0.004799f, -0.049232f, +0.074542f, +0.003362f, -0.000003f}, + {+0.011236f, +0.040604f, -0.010517f, +0.002046f, -0.000098f}, + {+0.006435f, +0.139253f, +0.070542f, -0.004148f, -0.000297f}, + {-0.001842f, -0.052892f, -0.056325f, -0.005942f, +0.000046f}, + {+0.004364f, +0.052115f, +0.019067f, -0.000398f, -0.000179f}, + {+0.003644f, +0.037489f, +0.030067f, +0.000286f, +0.000000f}, + {+0.000279f, +0.074681f, +0.035692f, +0.005433f, -0.000065f}, + {+0.001702f, +0.024063f, +0.022013f, +0.000449f, +0.000009f}, + {+0.001629f, +0.004730f, -0.001402f, -0.003756f, -0.000041f} + }, + { + {-0.022776f, +0.213361f, +0.033702f, +0.017530f, +0.000169f}, + {+0.017318f, +0.757708f, +0.032772f, +0.023486f, +0.000150f}, + {-0.000995f, +0.005778f, -0.039399f, +0.003826f, -0.000133f}, + {-0.001086f, +0.066855f, -0.049052f, -0.001880f, -0.000124f}, + {+0.003861f, +0.074613f, -0.059871f, +0.001275f, -0.000202f}, + {+0.004218f, -0.001879f, -0.134238f, -0.000831f, -0.000156f}, + {-0.007011f, -0.156373f, +0.120347f, +0.000348f, +0.000228f}, + {+0.001557f, +0.050757f, -0.023560f, -0.002558f, +0.000008f}, + {-0.014029f, -0.230152f, +0.192472f, +0.009207f, +0.000223f}, + {+0.003304f, +0.293531f, -0.162769f, +0.029563f, +0.000502f}, + {-0.000187f, -0.025533f, -0.089914f, +0.003071f, -0.000081f}, + {-0.001118f, +0.199397f, -0.178948f, +0.009074f, +0.000301f}, + {-0.002128f, +0.041497f, +0.024472f, -0.001412f, -0.000017f}, + {+0.001502f, +0.027123f, +0.081159f, -0.005992f, +0.000104f}, + {+0.000493f, +0.080670f, -0.051505f, -0.003323f, -0.000001f}, + {-0.001770f, +0.022371f, -0.053147f, +0.009257f, +0.000076f} + }, + { + {+0.009638f, -0.020599f, -0.278274f, -0.025390f, +0.000089f}, + {-0.019638f, +0.173586f, -0.454125f, -0.045073f, +0.000138f}, + {+0.001861f, +0.029237f, -0.038358f, -0.002128f, -0.000043f}, + {-0.006025f, +0.060820f, -0.033037f, +0.001020f, -0.000030f}, + {-0.010927f, +0.114232f, +0.022410f, +0.002610f, -0.000063f}, + {-0.001151f, +0.065308f, -0.047475f, +0.003953f, -0.000033f}, + {+0.017565f, -0.230160f, -0.003612f, +0.002199f, +0.000030f}, + {-0.002909f, +0.050062f, -0.035205f, +0.001706f, -0.000001f}, + {+0.028618f, -0.411400f, -0.073259f, -0.001960f, -0.000006f}, + {-0.012397f, +0.141388f, -0.368076f, -0.043941f, +0.000144f}, + {+0.000613f, +0.027917f, -0.038807f, +0.005057f, -0.000020f}, + {-0.005278f, +0.064856f, -0.339877f, -0.008614f, +0.000087f}, + {-0.003908f, -0.015797f, -0.023962f, +0.003729f, +0.000013f}, + {+0.002822f, -0.051424f, +0.011636f, +0.000447f, +0.000037f}, + {-0.001743f, -0.007517f, -0.130092f, +0.010670f, -0.000017f}, + {+0.001199f, -0.016221f, -0.122288f, -0.007685f, +0.000014f} + }, + { + {-0.029178f, -0.030294f, -0.242046f, +0.016235f, -0.000187f}, + {-0.008133f, -0.216891f, -0.173004f, +0.046339f, -0.000186f}, + {-0.004784f, +0.011306f, -0.001565f, +0.002974f, +0.000133f}, + {+0.001643f, -0.028149f, +0.058358f, +0.006461f, +0.000122f}, + {+0.012719f, -0.054617f, +0.162135f, +0.005430f, +0.000206f}, + {+0.004192f, -0.016864f, +0.049221f, +0.004060f, +0.000152f}, + {-0.017065f, +0.041944f, -0.209787f, -0.017496f, -0.000221f}, + {+0.005651f, -0.007117f, +0.010168f, -0.000370f, -0.000010f}, + {-0.040832f, +0.087605f, -0.438294f, -0.024557f, -0.000208f}, + {+0.015743f, -0.224869f, -0.116394f, +0.024045f, -0.000521f}, + {-0.000520f, +0.017676f, -0.001703f, -0.007076f, +0.000085f}, + {+0.005864f, -0.108940f, -0.176379f, -0.006190f, -0.000311f}, + {+0.004834f, -0.026630f, -0.021079f, -0.003057f, +0.000018f}, + {-0.003714f, -0.006337f, -0.039785f, +0.000713f, -0.000108f}, + {+0.003235f, -0.035740f, -0.081406f, -0.014616f, +0.000003f}, + {-0.000931f, -0.029194f, -0.104837f, -0.000498f, -0.000077f} + }, + { + {+0.064069f, +0.415122f, +0.053438f, -0.001987f, -0.000053f}, + {+0.009859f, +0.329919f, +0.267131f, -0.025972f, -0.000125f}, + {+0.007782f, +0.093625f, +0.062218f, -0.005519f, +0.000007f}, + {+0.006679f, +0.087174f, +0.140907f, -0.012343f, -0.000007f}, + {-0.009694f, -0.066480f, +0.161387f, -0.014778f, +0.000006f}, + {-0.011976f, -0.007185f, +0.079605f, -0.010521f, -0.000016f}, + {+0.000557f, +0.101449f, -0.157518f, +0.024682f, +0.000050f}, + {-0.008085f, -0.037335f, +0.019864f, -0.001614f, +0.000006f}, + {+0.030203f, +0.393848f, -0.238529f, +0.036570f, +0.000098f}, + {-0.011087f, -0.102790f, +0.079859f, -0.000351f, +0.000008f}, + {+0.001584f, +0.009914f, +0.007779f, +0.002067f, -0.000006f}, + {+0.003353f, -0.001777f, +0.008005f, +0.013355f, +0.000003f}, + {-0.003172f, -0.008210f, +0.010652f, +0.000223f, -0.000027f}, + {-0.001325f, -0.010307f, -0.051607f, +0.003067f, -0.000008f}, + {-0.010253f, -0.010690f, +0.002393f, +0.009426f, +0.000023f}, + {-0.002525f, +0.029747f, -0.022901f, +0.004832f, +0.000012f} + }, + { + {-0.046682f, +0.646468f, +0.038502f, -0.000394f, +0.000197f}, + {+0.044970f, +0.559290f, +0.057727f, +0.008886f, +0.000233f}, + {+0.000940f, +0.137203f, +0.026727f, +0.004536f, -0.000119f}, + {+0.021842f, +0.212599f, -0.004934f, +0.008826f, -0.000104f}, + {+0.023556f, +0.052508f, -0.021029f, +0.010719f, -0.000188f}, + {+0.008092f, -0.004951f, +0.027003f, +0.006766f, -0.000127f}, + {+0.010424f, -0.025150f, +0.006816f, -0.012676f, +0.000176f}, + {+0.012013f, -0.064462f, +0.013618f, +0.002713f, +0.000010f}, + {+0.003530f, +0.310311f, -0.011616f, -0.019741f, +0.000148f}, + {+0.004678f, -0.016958f, +0.018438f, +0.001910f, +0.000484f}, + {-0.001327f, +0.004928f, +0.011742f, +0.001214f, -0.000078f}, + {-0.013688f, +0.047967f, +0.031851f, -0.002524f, +0.000286f}, + {+0.008554f, -0.003502f, +0.000653f, +0.000953f, -0.000012f}, + {+0.001110f, -0.052143f, -0.004967f, -0.003628f, +0.000102f}, + {+0.024328f, -0.026559f, +0.000732f, -0.001055f, -0.000010f}, + {+0.007177f, -0.017435f, +0.026024f, -0.001281f, +0.000068f} + }, + { + {-0.091452f, +0.552905f, -0.002702f, -0.003959f, +0.000011f}, + {-0.151251f, +0.284723f, -0.015522f, -0.005073f, +0.000086f}, + {-0.028691f, +0.087255f, -0.003554f, -0.001461f, +0.000017f}, + {-0.098620f, +0.103367f, -0.000693f, -0.001510f, +0.000032f}, + {-0.064701f, +0.012013f, -0.004462f, -0.000173f, +0.000038f}, + {+0.014183f, -0.018557f, -0.019481f, -0.000708f, +0.000046f}, + {+0.006021f, -0.064708f, +0.035867f, -0.001201f, -0.000101f}, + {-0.011933f, -0.098741f, -0.004801f, -0.001237f, -0.000012f}, + {-0.036700f, +0.201775f, +0.040310f, -0.000652f, -0.000152f}, + {-0.005765f, +0.013682f, +0.000873f, -0.007110f, -0.000136f}, + {-0.003019f, -0.012643f, -0.006120f, -0.000396f, +0.000028f}, + {+0.011018f, +0.079111f, +0.001161f, -0.005334f, -0.000076f}, + {-0.015223f, -0.010103f, +0.018116f, -0.000552f, +0.000040f}, + {+0.010935f, -0.049744f, +0.004931f, +0.000250f, -0.000016f}, + {-0.032242f, -0.086323f, +0.005558f, -0.001593f, -0.000026f}, + {+0.000743f, -0.058299f, -0.001218f, -0.002067f, -0.000032f} + }, + { + {+0.231005f, +0.048404f, +0.009154f, +0.001498f, -0.000196f}, + {+0.192280f, -0.252895f, -0.010481f, +0.000333f, -0.000272f}, + {+0.043883f, -0.025510f, -0.003790f, -0.000402f, +0.000097f}, + {+0.135351f, -0.212029f, -0.009492f, -0.001960f, +0.000078f}, + {+0.084125f, -0.181115f, -0.006598f, -0.003510f, +0.000156f}, + {-0.033552f, +0.023473f, -0.003836f, -0.001049f, +0.000092f}, + {-0.027732f, +0.007669f, +0.004823f, +0.004147f, -0.000114f}, + {-0.005511f, -0.108447f, -0.007469f, -0.001175f, -0.000008f}, + {+0.049262f, +0.093379f, +0.014337f, +0.006176f, -0.000066f}, + {+0.011588f, -0.007485f, -0.021418f, -0.002195f, -0.000406f}, + {+0.004828f, -0.034802f, +0.002483f, -0.000357f, +0.000065f}, + {+0.010126f, +0.088145f, -0.024313f, -0.000561f, -0.000239f}, + {+0.009822f, -0.024986f, +0.000140f, +0.000383f, +0.000001f}, + {-0.022780f, -0.006413f, +0.006349f, +0.001513f, -0.000089f}, + {+0.014962f, -0.135165f, -0.012780f, -0.000522f, +0.000019f}, + {-0.023635f, -0.027393f, -0.008518f, +0.000542f, -0.000051f} + }, + { + {-0.129287f, -0.488427f, -0.015298f, +0.003330f, +0.000032f}, + {-0.025480f, -0.578744f, -0.004928f, +0.005728f, -0.000021f}, + {-0.001654f, -0.098586f, -0.003334f, +0.000763f, -0.000028f}, + {-0.033875f, -0.443496f, +0.008037f, +0.001296f, -0.000041f}, + {-0.018947f, -0.326335f, +0.012624f, +0.000806f, -0.000063f}, + {+0.025064f, +0.093936f, +0.002533f, +0.000591f, -0.000056f}, + {+0.010694f, +0.085378f, -0.009219f, -0.001445f, +0.000116f}, + {+0.036700f, -0.055426f, -0.001721f, +0.001199f, +0.000016f}, + {-0.043110f, -0.003684f, -0.012692f, -0.002555f, +0.000160f}, + {-0.008512f, -0.041967f, +0.005268f, +0.006560f, +0.000223f}, + {+0.005601f, -0.039303f, +0.001728f, -0.000112f, -0.000044f}, + {-0.035999f, +0.034895f, +0.002757f, +0.004270f, +0.000123f}, + {+0.002203f, -0.033200f, -0.001100f, -0.000045f, -0.000048f}, + {+0.016721f, +0.047214f, -0.004075f, -0.000550f, +0.000032f}, + {+0.021446f, -0.110159f, +0.004884f, +0.001124f, +0.000025f}, + {+0.032915f, +0.061006f, +0.000313f, +0.001075f, +0.000044f} + }, + { + {-0.165686f, -0.410109f, -0.015586f, -0.000896f, +0.000182f}, + {-0.225295f, -0.253817f, -0.010634f, -0.001216f, +0.000288f}, + {-0.066393f, -0.000376f, -0.002622f, -0.000038f, -0.000077f}, + {-0.130423f, -0.277756f, -0.010288f, +0.000606f, -0.000054f}, + {-0.089464f, -0.200814f, -0.007558f, +0.001360f, -0.000121f}, + {+0.004322f, +0.115904f, +0.010769f, +0.000324f, -0.000060f}, + {+0.034499f, +0.049740f, -0.008222f, -0.001335f, +0.000055f}, + {-0.046786f, +0.057680f, +0.004042f, +0.000640f, +0.000003f}, + {+0.024894f, -0.095189f, -0.014289f, -0.002426f, -0.000011f}, + {-0.005629f, -0.034211f, +0.013115f, +0.002185f, +0.000307f}, + {-0.019520f, -0.005119f, +0.001636f, +0.000261f, -0.000048f}, + {+0.038933f, -0.062477f, +0.011725f, +0.001017f, +0.000182f}, + {-0.005035f, -0.021514f, -0.003233f, -0.000466f, +0.000014f}, + {+0.007389f, +0.053217f, -0.000456f, -0.000398f, +0.000072f}, + {-0.037733f, -0.010531f, -0.003329f, +0.000340f, -0.000027f}, + {-0.003757f, +0.111811f, +0.004737f, -0.000075f, +0.000033f} + }, + { + {+0.245533f, +0.226873f, +0.035259f, -0.002770f, -0.000070f}, + {+0.206677f, +0.408421f, +0.026814f, -0.005082f, -0.000056f}, + {+0.053751f, +0.188303f, +0.009769f, -0.000688f, +0.000029f}, + {+0.149357f, +0.154463f, +0.013417f, -0.001098f, +0.000037f}, + {+0.105083f, +0.109018f, +0.007715f, -0.000799f, +0.000072f}, + {-0.025793f, +0.064751f, -0.005742f, -0.000924f, +0.000050f}, + {-0.041996f, -0.072003f, +0.001334f, +0.001959f, -0.000101f}, + {+0.008234f, +0.134619f, -0.001439f, -0.000932f, -0.000019f}, + {+0.007939f, -0.128639f, +0.012917f, +0.003363f, -0.000130f}, + {+0.013715f, +0.007050f, +0.000167f, -0.004932f, -0.000266f}, + {+0.012412f, +0.040469f, -0.000036f, -0.000063f, +0.000052f}, + {-0.005607f, -0.122490f, -0.001069f, -0.003166f, -0.000145f}, + {+0.002475f, -0.010103f, -0.001112f, +0.000172f, +0.000049f}, + {-0.026992f, -0.004924f, -0.001965f, +0.000301f, -0.000041f}, + {+0.008412f, +0.067378f, +0.003334f, -0.000633f, -0.000020f}, + {-0.034796f, +0.054935f, -0.005935f, -0.000590f, -0.000048f} + }, + { + {+0.049172f, +0.518027f, +0.003115f, +0.000335f, -0.000156f}, + {+0.120618f, +0.519623f, +0.008479f, +0.000432f, -0.000270f}, + {+0.062888f, +0.179664f, -0.000296f, +0.000157f, +0.000063f}, + {+0.019992f, +0.341262f, +0.002080f, -0.000355f, +0.000037f}, + {+0.012267f, +0.246756f, -0.001889f, -0.000730f, +0.000091f}, + {+0.028297f, -0.020937f, -0.002730f, -0.000026f, +0.000039f}, + {-0.008636f, -0.121054f, +0.007814f, +0.000720f, -0.000014f}, + {+0.046484f, +0.071961f, +0.002387f, -0.000455f, +0.000002f}, + {-0.042652f, -0.042219f, +0.005353f, +0.001621f, +0.000061f}, + {-0.003781f, +0.030870f, -0.013170f, -0.002144f, -0.000211f}, + {+0.016747f, +0.033277f, +0.000186f, -0.000012f, +0.000031f}, + {-0.038322f, -0.079239f, -0.009485f, -0.001067f, -0.000129f}, + {-0.009213f, +0.006178f, +0.001082f, +0.000202f, -0.000029f}, + {+0.017679f, -0.071909f, +0.003357f, +0.000147f, -0.000056f}, + {+0.031925f, +0.035422f, +0.000231f, -0.000251f, +0.000032f}, + {+0.027629f, -0.047451f, +0.003771f, -0.000092f, -0.000016f} + }, + { + {-0.277356f, +0.009713f, -0.040871f, +0.002128f, +0.000098f}, + {-0.288048f, -0.119309f, -0.040772f, +0.004167f, +0.000126f}, + {-0.135614f, -0.121199f, -0.015970f, +0.000584f, -0.000025f}, + {-0.147900f, +0.068278f, -0.021757f, +0.001011f, -0.000028f}, + {-0.111155f, +0.046512f, -0.012782f, +0.000892f, -0.000069f}, + {-0.020452f, -0.099912f, -0.003632f, +0.000896f, -0.000036f}, + {+0.051789f, -0.026841f, -0.000416f, -0.002061f, +0.000070f}, + {-0.048315f, -0.075067f, -0.004473f, +0.000718f, +0.000020f}, + {+0.038466f, +0.097321f, -0.002604f, -0.003632f, +0.000080f}, + {-0.012250f, +0.014195f, +0.001656f, +0.003568f, +0.000272f}, + {-0.029260f, -0.036443f, -0.002521f, +0.000109f, -0.000054f}, + {+0.049141f, +0.042766f, +0.002001f, +0.002307f, +0.000147f}, + {+0.016365f, +0.045379f, +0.003479f, +0.000052f, -0.000044f}, + {+0.016380f, -0.068248f, +0.002419f, -0.000284f, +0.000043f}, + {-0.026309f, -0.049393f, -0.000660f, +0.000389f, +0.000012f}, + {+0.020013f, -0.061398f, +0.001390f, +0.000285f, +0.000045f} + }, + { + {+0.056395f, -0.497410f, +0.010462f, +0.000112f, +0.000123f}, + {+0.008278f, -0.564708f, +0.007533f, +0.000534f, +0.000224f}, + {+0.029776f, -0.375504f, +0.009908f, -0.000167f, -0.000056f}, + {+0.053843f, -0.247636f, +0.011973f, +0.000305f, -0.000030f}, + {+0.047919f, -0.200610f, +0.011974f, +0.000485f, -0.000070f}, + {-0.001747f, -0.136529f, +0.008548f, -0.000030f, -0.000031f}, + {-0.034659f, +0.098248f, -0.009286f, -0.000733f, -0.000004f}, + {-0.013390f, -0.125590f, +0.000347f, +0.000408f, -0.000006f}, + {+0.018416f, +0.125823f, -0.010099f, -0.001587f, -0.000079f}, + {+0.015670f, -0.020509f, +0.010455f, +0.001886f, +0.000130f}, + {-0.001269f, -0.078191f, +0.000719f, -0.000060f, -0.000015f}, + {-0.015954f, +0.139586f, +0.005155f, +0.000966f, +0.000087f}, + {-0.000690f, +0.074979f, -0.002970f, -0.000046f, +0.000040f}, + {-0.036315f, +0.016998f, -0.007922f, -0.000063f, +0.000042f}, + {-0.017947f, -0.053543f, -0.003628f, +0.000169f, -0.000034f}, + {-0.036250f, +0.025051f, -0.004463f, +0.000134f, +0.000003f} + }, + { + {+0.261565f, -0.175456f, +0.039964f, -0.001605f, -0.000112f}, + {+0.289123f, -0.124032f, +0.042209f, -0.003292f, -0.000173f}, + {+0.147448f, -0.202794f, +0.013343f, -0.000451f, +0.000021f}, + {+0.111431f, -0.158046f, +0.014055f, -0.000866f, +0.000018f}, + {+0.088516f, -0.135597f, +0.008911f, -0.000941f, +0.000062f}, + {+0.046542f, -0.074771f, -0.001267f, -0.000681f, +0.000024f}, + {-0.008851f, +0.134457f, +0.003904f, +0.001907f, -0.000040f}, + {+0.057725f, -0.011782f, +0.007446f, -0.000690f, -0.000019f}, + {-0.064453f, -0.009485f, -0.001505f, +0.003482f, -0.000032f}, + {-0.003750f, -0.043297f, -0.001696f, -0.002710f, -0.000254f}, + {+0.036881f, -0.019154f, +0.003756f, -0.000164f, +0.000052f}, + {-0.028484f, +0.127049f, -0.000373f, -0.001785f, -0.000137f}, + {-0.030494f, +0.034591f, -0.002192f, -0.000165f, +0.000035f}, + {+0.009470f, +0.091778f, +0.004810f, +0.000325f, -0.000042f}, + {+0.029100f, +0.027840f, +0.006520f, -0.000311f, -0.000006f}, + {-0.009135f, +0.066628f, -0.000798f, -0.000116f, -0.000038f} + }, + { + {-0.134646f, +0.431836f, -0.022252f, -0.000261f, -0.000089f}, + {-0.108773f, +0.480556f, -0.020213f, -0.000915f, -0.000164f}, + {-0.157283f, +0.252511f, -0.017953f, +0.000158f, +0.000053f}, + {-0.096912f, +0.162399f, -0.016830f, -0.000259f, +0.000029f}, + {-0.094935f, +0.145981f, -0.017427f, -0.000284f, +0.000058f}, + {-0.078691f, +0.105220f, -0.009040f, -0.000009f, +0.000031f}, + {+0.032041f, +0.084421f, +0.004353f, +0.000773f, +0.000002f}, + {-0.016068f, +0.102075f, -0.005241f, -0.000269f, +0.000010f}, + {+0.027628f, -0.144744f, +0.013233f, +0.001492f, +0.000070f}, + {-0.013497f, -0.033838f, -0.009244f, -0.001447f, -0.000073f}, + {-0.020163f, +0.066780f, -0.002771f, +0.000069f, +0.000003f}, + {+0.051113f, +0.013125f, -0.004746f, -0.000733f, -0.000056f}, + {+0.038408f, -0.068407f, +0.004887f, -0.000113f, -0.000046f}, + {+0.039739f, +0.052992f, +0.003676f, -0.000005f, -0.000032f}, + {+0.019468f, +0.046585f, -0.000417f, -0.000092f, +0.000032f}, + {+0.046026f, -0.019351f, +0.006238f, -0.000147f, +0.000005f} + }, + { + {-0.227969f, +0.284525f, -0.035118f, +0.001170f, +0.000113f}, + {-0.251619f, +0.250783f, -0.039635f, +0.002380f, +0.000192f}, + {-0.028234f, +0.444181f, -0.004258f, +0.000378f, -0.000019f}, + {-0.057970f, +0.223549f, -0.006095f, +0.000655f, -0.000012f}, + {-0.039868f, +0.230386f, -0.002246f, +0.000818f, -0.000054f}, + {+0.036223f, +0.280336f, +0.007555f, +0.000539f, -0.000017f}, + {-0.045995f, -0.019070f, -0.002489f, -0.001639f, +0.000020f}, + {-0.058114f, +0.032997f, -0.008873f, +0.000662f, +0.000018f}, + {+0.053231f, -0.094713f, +0.003411f, -0.002983f, -0.000000f}, + {+0.022768f, +0.016336f, +0.003117f, +0.002216f, +0.000227f}, + {-0.031511f, +0.045619f, -0.004901f, +0.000227f, -0.000048f}, + {-0.045006f, -0.127523f, -0.002107f, +0.001382f, +0.000124f}, + {-0.004533f, -0.139114f, -0.003073f, +0.000203f, -0.000026f}, + {-0.046710f, -0.071863f, -0.004169f, -0.000343f, +0.000040f}, + {-0.053226f, -0.067429f, -0.008363f, +0.000293f, +0.000001f}, + {-0.008131f, -0.104415f, -0.002326f, +0.000063f, +0.000032f} + }, + { + {+0.193626f, -0.362707f, +0.031027f, +0.000215f, +0.000061f}, + {+0.168437f, -0.394610f, +0.030765f, +0.000832f, +0.000106f}, + {+0.166845f, +0.150839f, +0.019333f, -0.000239f, -0.000053f}, + {+0.108632f, -0.026149f, +0.014836f, +0.000210f, -0.000033f}, + {+0.117845f, -0.006812f, +0.017402f, +0.000161f, -0.000052f}, + {+0.070459f, +0.240877f, +0.004084f, -0.000089f, -0.000035f}, + {+0.051571f, -0.166446f, +0.000272f, -0.000594f, +0.000009f}, + {+0.048610f, -0.137567f, +0.012351f, +0.000122f, -0.000012f}, + {-0.060459f, +0.077161f, -0.017457f, -0.001202f, -0.000048f}, + {-0.008901f, +0.071218f, +0.004889f, +0.001056f, +0.000035f}, + {+0.035581f, -0.061262f, +0.007127f, -0.000111f, +0.000006f}, + {+0.009360f, -0.207644f, +0.007254f, +0.000645f, +0.000037f}, + {-0.043066f, -0.091054f, -0.000390f, +0.000159f, +0.000048f}, + {-0.006722f, -0.129159f, -0.003572f, +0.000128f, +0.000025f}, + {+0.002648f, -0.158951f, +0.005371f, +0.000083f, -0.000030f}, + {-0.052294f, -0.037930f, -0.006102f, +0.000171f, -0.000010f} + }, + { + {+0.185388f, -0.373945f, +0.028242f, -0.000870f, -0.000107f}, + {+0.218466f, -0.313607f, +0.033711f, -0.001650f, -0.000187f}, + {-0.089184f, -0.227856f, -0.003013f, -0.000234f, +0.000019f}, + {-0.005910f, -0.195725f, +0.001490f, -0.000426f, +0.000010f}, + {-0.033058f, -0.233100f, -0.003881f, -0.000583f, +0.000049f}, + {-0.128077f, -0.046310f, -0.008240f, -0.000349f, +0.000015f}, + {+0.004052f, -0.247839f, -0.003163f, +0.001295f, -0.000012f}, + {+0.052459f, -0.138631f, +0.002655f, -0.000517f, -0.000018f}, + {-0.024548f, +0.123596f, -0.001667f, +0.002422f, +0.000013f}, + {-0.026309f, +0.052058f, -0.001607f, -0.001982f, -0.000202f}, + {+0.029154f, -0.072410f, +0.002905f, -0.000210f, +0.000043f}, + {+0.051381f, -0.149021f, -0.000115f, -0.001232f, -0.000111f}, + {+0.060324f, +0.057180f, +0.002547f, -0.000144f, +0.000020f}, + {+0.052887f, -0.036634f, +0.006886f, +0.000170f, -0.000037f}, + {+0.075539f, -0.053066f, +0.006319f, -0.000332f, +0.000001f}, + {+0.036656f, +0.098177f, +0.004589f, -0.000133f, -0.000026f} + }, + { + {-0.239844f, +0.276952f, -0.036663f, -0.000075f, -0.000041f}, + {-0.218935f, +0.356480f, -0.037109f, -0.000536f, -0.000063f}, + {-0.067555f, -0.247328f, -0.016085f, +0.000198f, +0.000054f}, + {-0.065557f, -0.103844f, -0.011325f, -0.000270f, +0.000037f}, + {-0.082669f, -0.157628f, -0.013419f, -0.000257f, +0.000050f}, + {+0.051102f, -0.310690f, +0.001856f, +0.000105f, +0.000038f}, + {-0.105915f, -0.086143f, -0.002835f, +0.000369f, -0.000019f}, + {-0.108427f, +0.103999f, -0.015274f, -0.000237f, +0.000014f}, + {+0.072751f, -0.025221f, +0.019360f, +0.000835f, +0.000029f}, + {+0.042856f, -0.056448f, -0.001929f, -0.000741f, -0.000011f}, + {-0.068206f, +0.080584f, -0.011613f, +0.000093f, -0.000013f}, + {-0.091336f, +0.056612f, -0.010772f, -0.000543f, -0.000024f}, + {-0.026414f, +0.186526f, -0.002964f, -0.000133f, -0.000049f}, + {-0.024927f, +0.082144f, -0.001315f, +0.000035f, -0.000020f}, + {-0.062843f, +0.155369f, -0.009444f, -0.000091f, +0.000028f}, + {+0.038812f, +0.095103f, +0.003754f, -0.000076f, +0.000012f} + }, + { + {-0.131680f, +0.440943f, -0.020891f, +0.000627f, +0.000098f}, + {-0.183833f, +0.406966f, -0.027778f, +0.001207f, +0.000171f}, + {+0.086183f, -0.003067f, +0.012386f, +0.000168f, -0.000020f}, + {+0.026332f, +0.035398f, +0.002657f, +0.000383f, -0.000011f}, + {+0.076464f, +0.083380f, +0.010071f, +0.000597f, -0.000047f}, + {+0.086834f, -0.252931f, +0.010256f, +0.000250f, -0.000016f}, + {+0.112579f, +0.244861f, +0.011209f, -0.001100f, +0.000012f}, + {+0.018202f, +0.300605f, +0.006408f, +0.000602f, +0.000018f}, + {-0.003044f, -0.137405f, -0.002719f, -0.002137f, -0.000013f}, + {-0.003641f, -0.131818f, -0.001737f, +0.001737f, +0.000181f}, + {+0.001297f, +0.195950f, +0.005713f, +0.000204f, -0.000037f}, + {+0.045795f, +0.259231f, +0.005407f, +0.001178f, +0.000100f}, + {-0.039454f, +0.170156f, -0.000777f, +0.000115f, -0.000018f}, + {-0.040004f, +0.055755f, -0.008185f, -0.000317f, +0.000034f}, + {-0.043921f, +0.182226f, -0.005163f, +0.000395f, -0.000002f}, + {-0.058367f, -0.053246f, -0.007857f, +0.000065f, +0.000022f} + }, + { + {+0.266519f, -0.168414f, +0.039980f, +0.000112f, +0.000029f}, + {+0.270044f, -0.288912f, +0.044466f, +0.000374f, +0.000037f}, + {+0.013148f, +0.108379f, +0.008696f, -0.000082f, -0.000056f}, + {+0.007547f, +0.066767f, +0.004336f, +0.000293f, -0.000040f}, + {+0.013959f, +0.178267f, +0.007930f, +0.000231f, -0.000050f}, + {-0.126652f, +0.073753f, -0.010940f, -0.000032f, -0.000041f}, + {+0.037971f, +0.357198f, -0.003626f, -0.000116f, +0.000025f}, + {+0.123814f, +0.144678f, +0.015962f, +0.000194f, -0.000018f}, + {-0.073603f, -0.033162f, -0.018399f, -0.000381f, -0.000019f}, + {-0.052463f, -0.055986f, +0.001868f, +0.000682f, -0.000008f}, + {+0.099011f, +0.055743f, +0.009504f, -0.000033f, +0.000019f}, + {+0.066616f, +0.234328f, +0.006904f, +0.000399f, +0.000016f}, + {+0.081064f, -0.004874f, +0.003489f, +0.000036f, +0.000052f}, + {+0.044214f, -0.078007f, +0.004257f, +0.000035f, +0.000016f}, + {+0.107368f, -0.054956f, +0.018386f, -0.000009f, -0.000028f}, + {-0.008996f, -0.126597f, -0.002978f, +0.000081f, -0.000014f} + }, + { + {+0.076584f, -0.456777f, +0.013253f, -0.000677f, -0.000090f}, + {+0.135714f, -0.493797f, +0.019817f, -0.001205f, -0.000155f}, + {-0.049801f, +0.003798f, -0.009316f, -0.000287f, +0.000022f}, + {+0.008289f, +0.072460f, +0.002582f, -0.000487f, +0.000014f}, + {-0.058361f, +0.066933f, -0.007899f, -0.000705f, +0.000047f}, + {+0.024939f, +0.304082f, +0.002238f, -0.000320f, +0.000018f}, + {-0.164640f, +0.054259f, -0.014251f, +0.000972f, -0.000016f}, + {-0.129320f, -0.239583f, -0.014072f, -0.000614f, -0.000019f}, + {+0.023151f, +0.107790f, +0.002402f, +0.001999f, +0.000009f}, + {+0.042244f, +0.087154f, +0.004003f, -0.001651f, -0.000165f}, + {-0.087421f, -0.223827f, -0.009440f, -0.000302f, +0.000032f}, + {-0.123261f, -0.040927f, -0.008130f, -0.001094f, -0.000093f}, + {-0.047678f, -0.191325f, -0.003834f, -0.000119f, +0.000015f}, + {+0.025350f, -0.109559f, +0.002027f, +0.000400f, -0.000032f}, + {-0.031404f, -0.277712f, -0.007376f, -0.000280f, +0.000002f}, + {+0.054594f, -0.026570f, +0.007177f, +0.000010f, -0.000018f} + }, + { + {-0.274121f, +0.081952f, -0.043113f, -0.000004f, -0.000021f}, + {-0.317778f, +0.199223f, -0.049734f, -0.000202f, -0.000022f}, + {-0.015529f, -0.058172f, -0.001453f, +0.000253f, +0.000058f}, + {+0.020112f, +0.056461f, -0.003930f, -0.000113f, +0.000042f}, + {+0.027311f, -0.065956f, -0.001130f, +0.000048f, +0.000049f}, + {+0.092570f, +0.201332f, +0.007025f, +0.000092f, +0.000044f}, + {+0.078874f, -0.299423f, +0.007522f, +0.000058f, -0.000026f}, + {-0.031803f, -0.392121f, -0.002719f, +0.000010f, +0.000023f}, + {+0.078295f, +0.019932f, +0.020674f, +0.000126f, +0.000017f}, + {+0.029291f, +0.096155f, +0.000322f, -0.000490f, +0.000025f}, + {-0.042190f, -0.292546f, -0.004474f, +0.000130f, -0.000023f}, + {+0.047310f, -0.289378f, -0.003082f, -0.000264f, -0.000009f}, + {-0.036042f, -0.202365f, -0.005972f, -0.000021f, -0.000059f}, + {-0.067032f, +0.032496f, -0.007059f, -0.000199f, -0.000013f}, + {-0.101204f, -0.185795f, -0.005848f, +0.000042f, +0.000029f}, + {-0.006759f, +0.066549f, -0.000681f, -0.000136f, +0.000016f} + }, + { + {-0.033486f, +0.450867f, -0.006565f, +0.000576f, +0.000085f}, + {-0.061876f, +0.590080f, -0.009764f, +0.001166f, +0.000147f}, + {+0.051215f, +0.040728f, +0.006725f, +0.000135f, -0.000027f}, + {-0.075886f, -0.090288f, -0.009577f, +0.000383f, -0.000018f}, + {+0.015185f, -0.082124f, +0.005184f, +0.000502f, -0.000049f}, + {-0.096327f, -0.079550f, -0.006514f, +0.000328f, -0.000021f}, + {+0.097424f, -0.250345f, +0.019698f, -0.001078f, +0.000017f}, + {+0.169040f, -0.091237f, +0.017597f, +0.000283f, +0.000017f}, + {-0.049945f, -0.183685f, -0.013171f, -0.002034f, -0.000009f}, + {-0.051580f, -0.036720f, -0.010126f, +0.001380f, +0.000151f}, + {+0.125504f, -0.039269f, +0.013578f, +0.000208f, -0.000027f}, + {+0.070511f, -0.247836f, +0.009393f, +0.000912f, +0.000087f}, + {+0.075408f, -0.033832f, +0.006471f, +0.000223f, -0.000010f}, + {+0.010281f, +0.155017f, +0.004289f, -0.000279f, +0.000029f}, + {+0.128761f, +0.151968f, +0.010917f, +0.000111f, -0.000004f}, + {-0.047805f, -0.002840f, -0.010782f, -0.000029f, +0.000015f} + }, + { + {+0.280158f, -0.030000f, +0.043460f, +0.000075f, +0.000014f}, + {+0.336614f, -0.016258f, +0.050302f, +0.000297f, +0.000011f}, + {+0.002372f, +0.120514f, -0.000413f, -0.000319f, -0.000061f}, + {+0.016063f, -0.229902f, +0.006035f, +0.000097f, -0.000043f}, + {-0.028633f, -0.007390f, -0.002007f, -0.000039f, -0.000048f}, + {+0.005134f, -0.220494f, -0.003892f, -0.000252f, -0.000046f}, + {-0.096636f, +0.051599f, -0.015635f, +0.000127f, +0.000026f}, + {-0.105407f, +0.323356f, -0.007410f, +0.000133f, -0.000028f}, + {-0.087018f, -0.141885f, -0.014985f, +0.000005f, -0.000018f}, + {-0.018235f, -0.085003f, +0.002078f, +0.000390f, -0.000041f}, + {-0.049559f, +0.222425f, -0.001760f, -0.000043f, +0.000027f}, + {-0.087658f, -0.008493f, -0.002149f, +0.000327f, +0.000002f}, + {-0.025991f, +0.110117f, +0.002501f, +0.000106f, +0.000066f}, + {+0.073066f, +0.062410f, +0.006753f, +0.000139f, +0.000010f}, + {-0.012343f, +0.361812f, +0.000879f, +0.000019f, -0.000031f}, + {+0.008849f, -0.097553f, +0.003670f, +0.000140f, -0.000018f} + }, + { + {-0.006954f, -0.470379f, -0.000165f, -0.000551f, -0.000082f}, + {-0.019214f, -0.554319f, +0.001599f, -0.001129f, -0.000145f}, + {-0.050232f, +0.045555f, -0.004649f, -0.000015f, +0.000034f}, + {+0.117286f, -0.075343f, +0.011788f, -0.000390f, +0.000023f}, + {+0.013982f, +0.062149f, +0.000689f, -0.000526f, +0.000053f}, + {+0.064167f, -0.122065f, +0.007764f, -0.000174f, +0.000027f}, + {-0.057456f, +0.102739f, -0.012482f, +0.000929f, -0.000017f}, + {-0.086303f, +0.350740f, -0.008732f, -0.000319f, -0.000013f}, + {+0.114468f, +0.156124f, +0.012352f, +0.002008f, +0.000014f}, + {+0.063324f, +0.045704f, +0.011079f, -0.001189f, -0.000135f}, + {-0.081653f, +0.167815f, -0.010699f, -0.000264f, +0.000021f}, + {+0.009546f, +0.130825f, -0.003286f, -0.000952f, -0.000083f}, + {-0.034292f, +0.088622f, -0.006613f, -0.000382f, +0.000000f}, + {-0.064658f, -0.148003f, -0.007951f, +0.000319f, -0.000027f}, + {-0.118973f, +0.200930f, -0.010476f, -0.000078f, +0.000007f}, + {+0.061648f, -0.019855f, +0.007486f, +0.000045f, -0.000011f} + }, + { + {-0.287193f, -0.042900f, -0.042884f, -0.000074f, -0.000006f}, + {-0.316269f, -0.095647f, -0.050717f, -0.000419f, +0.000004f}, + {+0.024609f, -0.065464f, -0.001044f, +0.000352f, +0.000061f}, + {-0.090934f, +0.238549f, -0.014249f, -0.000001f, +0.000044f}, + {+0.019808f, +0.051257f, -0.001165f, +0.000156f, +0.000046f}, + {-0.048333f, +0.050030f, -0.007461f, +0.000269f, +0.000047f}, + {+0.082327f, -0.120302f, +0.020222f, -0.000034f, -0.000027f}, + {+0.165448f, -0.034472f, +0.017814f, +0.000021f, +0.000032f}, + {+0.033316f, +0.280356f, +0.011492f, -0.000020f, +0.000016f}, + {+0.008225f, +0.128802f, -0.005400f, -0.000223f, +0.000054f}, + {+0.088609f, -0.096391f, +0.012066f, +0.000087f, -0.000030f}, + {+0.036267f, +0.078389f, +0.005104f, -0.000176f, +0.000004f}, + {+0.020864f, +0.001946f, +0.003538f, -0.000159f, -0.000070f}, + {-0.031397f, -0.200648f, -0.000765f, -0.000186f, -0.000008f}, + {+0.119879f, -0.159775f, +0.011369f, +0.000002f, +0.000032f}, + {-0.036654f, +0.129414f, -0.004412f, -0.000114f, +0.000020f} + }, + { + {+0.055358f, +0.480776f, +0.007156f, +0.000440f, +0.000080f}, + {+0.069696f, +0.497403f, +0.009705f, +0.000945f, +0.000144f}, + {+0.014636f, -0.076742f, +0.003268f, +0.000063f, -0.000042f}, + {-0.098616f, +0.221987f, -0.012598f, +0.000348f, -0.000027f}, + {-0.038012f, -0.038810f, -0.004148f, +0.000514f, -0.000056f}, + {-0.010993f, +0.104517f, -0.004208f, +0.000219f, -0.000033f}, + {+0.073401f, -0.141057f, +0.006526f, -0.000916f, +0.000016f}, + {-0.033949f, -0.336614f, -0.001600f, +0.000255f, +0.000007f}, + {-0.139291f, +0.017101f, -0.017309f, -0.001860f, -0.000021f}, + {-0.085604f, -0.017452f, -0.013308f, +0.001048f, +0.000118f}, + {+0.029028f, -0.187952f, +0.005021f, +0.000216f, -0.000016f}, + {-0.006564f, +0.006493f, -0.001419f, +0.000780f, +0.000079f}, + {+0.020490f, +0.003411f, +0.006133f, +0.000307f, +0.000011f}, + {+0.091616f, -0.016927f, +0.008786f, -0.000287f, +0.000025f}, + {+0.009844f, -0.323610f, +0.003492f, +0.000078f, -0.000011f}, + {-0.056286f, +0.097814f, -0.006882f, -0.000079f, +0.000007f} + }, + { + {+0.282827f, +0.133300f, +0.042549f, +0.000086f, -0.000002f}, + {+0.297764f, +0.151816f, +0.046261f, +0.000499f, -0.000022f}, + {-0.010547f, -0.035236f, +0.000498f, -0.000494f, -0.000059f}, + {+0.144406f, -0.152441f, +0.023633f, -0.000028f, -0.000044f}, + {-0.000542f, -0.094714f, +0.004019f, -0.000229f, -0.000043f}, + {+0.041461f, +0.019853f, +0.008957f, -0.000418f, -0.000046f}, + {-0.123943f, +0.154058f, -0.020412f, +0.000069f, +0.000030f}, + {-0.130914f, -0.179670f, -0.017352f, -0.000111f, -0.000033f}, + {+0.036620f, -0.258117f, -0.000481f, +0.000034f, -0.000009f}, + {+0.021657f, -0.180451f, +0.009924f, +0.000053f, -0.000065f}, + {-0.095197f, +0.006584f, -0.013724f, -0.000061f, +0.000032f}, + {-0.011099f, +0.015338f, -0.000599f, +0.000168f, -0.000011f}, + {+0.002807f, +0.034719f, -0.003109f, +0.000353f, +0.000070f}, + {-0.041276f, +0.181885f, -0.005275f, +0.000201f, +0.000007f}, + {-0.125301f, -0.110921f, -0.015164f, -0.000039f, -0.000032f}, + {+0.066993f, -0.092159f, +0.009251f, +0.000136f, -0.000021f} + }, + { + {-0.104112f, -0.458657f, -0.013927f, -0.000353f, -0.000076f}, + {-0.111390f, -0.472799f, -0.015450f, -0.000704f, -0.000139f}, + {+0.000873f, -0.019121f, -0.001169f, -0.000093f, +0.000048f}, + {+0.056615f, -0.285336f, +0.007942f, -0.000391f, +0.000032f}, + {+0.055650f, -0.007065f, +0.007223f, -0.000546f, +0.000060f}, + {-0.018845f, -0.077039f, -0.001923f, -0.000256f, +0.000039f}, + {-0.051977f, +0.260211f, -0.006687f, +0.000819f, -0.000018f}, + {+0.110604f, +0.197201f, +0.015009f, -0.000259f, -0.000003f}, + {+0.118052f, -0.135388f, +0.015667f, +0.001612f, +0.000024f}, + {+0.098237f, -0.061993f, +0.014872f, -0.000974f, -0.000101f}, + {+0.016600f, +0.180900f, +0.001935f, -0.000217f, +0.000011f}, + {-0.024890f, -0.001895f, -0.000719f, -0.000667f, -0.000075f}, + {-0.052001f, -0.047705f, -0.008689f, -0.000203f, -0.000021f}, + {-0.051423f, +0.163687f, -0.007750f, +0.000277f, -0.000023f}, + {+0.092904f, +0.226447f, +0.010447f, -0.000087f, +0.000014f}, + {+0.029788f, -0.148840f, +0.003437f, +0.000063f, -0.000002f} + }, + { + {-0.265513f, -0.211642f, -0.040584f, -0.000055f, +0.000009f}, + {-0.279427f, -0.216928f, -0.044464f, -0.000461f, +0.000042f}, + {-0.017280f, +0.004077f, -0.001930f, +0.000533f, +0.000057f}, + {-0.175703f, +0.073912f, -0.028215f, +0.000106f, +0.000044f}, + {-0.032929f, +0.127864f, -0.007891f, +0.000307f, +0.000041f}, + {-0.023458f, -0.073855f, -0.003516f, +0.000521f, +0.000044f}, + {+0.165507f, -0.073413f, +0.027506f, -0.000119f, -0.000034f}, + {+0.058760f, +0.277549f, +0.005732f, +0.000115f, +0.000033f}, + {-0.086524f, +0.185360f, -0.006494f, -0.000114f, +0.000000f}, + {-0.068563f, +0.191058f, -0.014677f, +0.000094f, +0.000073f}, + {+0.083271f, +0.077777f, +0.010978f, +0.000035f, -0.000035f}, + {+0.032739f, -0.090968f, +0.003108f, -0.000130f, +0.000018f}, + {+0.012042f, -0.148829f, +0.005352f, -0.000453f, -0.000067f}, + {+0.074068f, -0.028523f, +0.009472f, -0.000233f, -0.000006f}, + {+0.054178f, +0.286348f, +0.004315f, +0.000011f, +0.000032f}, + {-0.081317f, +0.023039f, -0.011622f, -0.000155f, +0.000021f} + }, + { + {+0.144447f, +0.416258f, +0.019880f, +0.000298f, +0.000071f}, + {+0.149133f, +0.438088f, +0.020811f, +0.000535f, +0.000129f}, + {+0.015049f, +0.049287f, -0.000123f, +0.000146f, -0.000053f}, + {-0.004923f, +0.337598f, +0.000454f, +0.000368f, -0.000037f}, + {-0.051157f, +0.099533f, -0.006353f, +0.000530f, -0.000063f}, + {+0.036114f, +0.015276f, +0.002183f, +0.000257f, -0.000042f}, + {-0.001423f, -0.329473f, -0.000629f, -0.000758f, +0.000021f}, + {-0.137836f, -0.026570f, -0.019057f, +0.000357f, +0.000002f}, + {-0.074813f, +0.206610f, -0.009222f, -0.001398f, -0.000023f}, + {-0.082213f, +0.168162f, -0.013202f, +0.000891f, +0.000086f}, + {-0.053436f, -0.133406f, -0.007060f, +0.000274f, -0.000004f}, + {+0.031202f, -0.097339f, +0.000600f, +0.000565f, +0.000069f}, + {+0.084087f, -0.042545f, +0.010288f, +0.000114f, +0.000027f}, + {-0.011630f, -0.156396f, +0.002102f, -0.000281f, +0.000021f}, + {-0.139327f, -0.009640f, -0.015858f, +0.000166f, -0.000017f}, + {+0.001227f, +0.149601f, +0.000552f, -0.000041f, -0.000002f} + }, + { + {+0.243657f, +0.264257f, +0.037689f, -0.000001f, -0.000015f}, + {+0.259444f, +0.270037f, +0.041639f, +0.000297f, -0.000058f}, + {+0.024732f, +0.031819f, +0.004944f, -0.000508f, -0.000056f}, + {+0.188302f, +0.043036f, +0.027818f, -0.000121f, -0.000045f}, + {+0.061013f, -0.068025f, +0.009284f, -0.000332f, -0.000040f}, + {-0.005481f, +0.077635f, +0.001849f, -0.000481f, -0.000044f}, + {-0.183484f, -0.052352f, -0.028430f, +0.000255f, +0.000038f}, + {+0.021508f, -0.270954f, +0.003464f, -0.000123f, -0.000034f}, + {+0.112315f, -0.086235f, +0.009937f, +0.000307f, +0.000007f}, + {+0.107969f, -0.120398f, +0.018769f, -0.000181f, -0.000082f}, + {-0.056786f, -0.126822f, -0.007959f, -0.000033f, +0.000039f}, + {-0.069219f, +0.054400f, -0.005730f, +0.000053f, -0.000023f}, + {-0.070651f, +0.193415f, -0.010674f, +0.000389f, +0.000067f}, + {-0.051509f, -0.092171f, -0.007870f, +0.000294f, +0.000005f}, + {+0.051121f, -0.299571f, +0.006590f, -0.000024f, -0.000032f}, + {+0.084035f, +0.019475f, +0.012921f, +0.000164f, -0.000021f} + }, + { + {-0.178130f, -0.383088f, -0.025598f, -0.000261f, -0.000067f}, + {-0.182587f, -0.405974f, -0.025901f, -0.000462f, -0.000117f}, + {-0.033772f, -0.059691f, -0.003877f, -0.000106f, +0.000059f}, + {-0.056171f, -0.329183f, -0.006810f, -0.000311f, +0.000043f}, + {+0.030324f, -0.107424f, +0.007446f, -0.000469f, +0.000068f}, + {-0.029083f, +0.038828f, -0.003047f, -0.000232f, +0.000046f}, + {+0.074081f, +0.341332f, +0.009025f, +0.000675f, -0.000027f}, + {+0.114367f, -0.124510f, +0.017364f, -0.000363f, -0.000002f}, + {+0.019963f, -0.231444f, +0.001211f, +0.001284f, +0.000019f}, + {+0.044510f, -0.213643f, +0.009811f, -0.000749f, -0.000069f}, + {+0.075343f, +0.079800f, +0.011596f, -0.000341f, -0.000004f}, + {+0.002994f, +0.163592f, +0.001034f, -0.000473f, -0.000063f}, + {-0.066930f, +0.201208f, -0.008014f, -0.000114f, -0.000031f}, + {+0.046049f, +0.057169f, +0.003278f, +0.000251f, -0.000018f}, + {+0.102214f, -0.218411f, +0.013142f, -0.000169f, +0.000019f}, + {-0.034525f, -0.167091f, -0.007400f, +0.000056f, +0.000007f} + }, + { + {-0.222238f, -0.317392f, -0.033615f, +0.000033f, +0.000021f}, + {-0.241813f, -0.315693f, -0.038994f, -0.000147f, +0.000070f}, + {-0.020356f, -0.081902f, -0.002758f, +0.000479f, +0.000060f}, + {-0.167023f, -0.157180f, -0.026364f, +0.000127f, +0.000047f}, + {-0.066143f, +0.046203f, -0.014148f, +0.000357f, +0.000040f}, + {+0.022432f, -0.042335f, +0.001522f, +0.000437f, +0.000048f}, + {+0.157680f, +0.214692f, +0.024775f, -0.000379f, -0.000040f}, + {-0.074512f, +0.166548f, -0.010491f, +0.000080f, +0.000039f}, + {-0.105735f, -0.034968f, -0.008768f, -0.000539f, -0.000010f}, + {-0.123458f, +0.044963f, -0.022305f, +0.000260f, +0.000091f}, + {+0.027259f, +0.155333f, +0.002873f, +0.000021f, -0.000041f}, + {+0.074325f, +0.052152f, +0.007210f, +0.000007f, +0.000026f}, + {+0.123302f, -0.087187f, +0.015137f, -0.000263f, -0.000074f}, + {+0.007845f, +0.113256f, +0.003459f, -0.000313f, -0.000004f}, + {-0.120092f, +0.122041f, -0.014660f, +0.000024f, +0.000034f}, + {-0.076429f, -0.107035f, -0.008690f, -0.000173f, +0.000022f} + }, + { + {+0.213344f, +0.349398f, +0.030097f, +0.000237f, +0.000063f}, + {+0.219215f, +0.390772f, +0.031915f, +0.000487f, +0.000107f}, + {+0.052529f, +0.029499f, +0.005648f, -0.000100f, -0.000070f}, + {+0.095709f, +0.245511f, +0.012927f, +0.000199f, -0.000053f}, + {-0.028737f, +0.105483f, -0.003866f, +0.000348f, -0.000076f}, + {+0.013337f, -0.055289f, +0.001002f, +0.000053f, -0.000054f}, + {-0.130180f, -0.225228f, -0.015900f, -0.000591f, +0.000035f}, + {-0.068381f, +0.171403f, -0.012635f, +0.000260f, +0.000000f}, + {+0.025988f, +0.167605f, +0.004069f, -0.001280f, -0.000015f}, + {-0.008972f, +0.221115f, -0.003663f, +0.000531f, +0.000048f}, + {-0.090641f, -0.028424f, -0.013918f, +0.000378f, +0.000016f}, + {-0.038654f, -0.120101f, -0.004990f, +0.000461f, +0.000057f}, + {+0.005905f, -0.263875f, +0.003095f, +0.000269f, +0.000040f}, + {-0.040815f, +0.035273f, -0.004946f, -0.000197f, +0.000014f}, + {-0.018746f, +0.272655f, -0.004798f, +0.000121f, -0.000023f}, + {+0.076538f, +0.124942f, +0.010206f, -0.000084f, -0.000014f} + }, + { + {+0.192920f, +0.381741f, +0.029300f, -0.000048f, -0.000026f}, + {+0.222170f, +0.388402f, +0.034955f, +0.000099f, -0.000080f}, + {+0.001699f, +0.107240f, +0.000947f, -0.000519f, -0.000066f}, + {+0.136658f, +0.180309f, +0.023176f, -0.000174f, -0.000048f}, + {+0.088774f, -0.075575f, +0.016123f, -0.000436f, -0.000040f}, + {-0.024745f, +0.004479f, -0.001974f, -0.000454f, -0.000055f}, + {-0.102774f, -0.266722f, -0.019008f, +0.000449f, +0.000041f}, + {+0.092562f, -0.080882f, +0.015366f, -0.000075f, -0.000049f}, + {+0.070990f, +0.091884f, +0.006305f, +0.000702f, +0.000009f}, + {+0.128422f, +0.011753f, +0.022348f, -0.000409f, -0.000098f}, + {+0.011288f, -0.189192f, +0.003841f, +0.000041f, +0.000039f}, + {-0.054725f, -0.090752f, -0.006454f, -0.000058f, -0.000028f}, + {-0.128788f, -0.054495f, -0.017806f, +0.000292f, +0.000085f}, + {+0.020286f, -0.059861f, +0.001026f, +0.000246f, +0.000006f}, + {+0.120848f, +0.054441f, +0.017027f, -0.000075f, -0.000037f}, + {+0.034321f, +0.188962f, +0.004725f, +0.000162f, -0.000021f} + }, + { + {-0.244141f, -0.287056f, -0.034191f, -0.000192f, -0.000058f}, + {-0.264405f, -0.355877f, -0.037791f, -0.000515f, -0.000101f}, + {-0.059687f, +0.011038f, -0.007243f, +0.000348f, +0.000093f}, + {-0.113575f, -0.207201f, -0.018101f, -0.000078f, +0.000070f}, + {+0.015137f, -0.192002f, -0.000035f, -0.000213f, +0.000092f}, + {-0.000786f, +0.038825f, -0.000032f, +0.000190f, +0.000073f}, + {+0.148464f, +0.121467f, +0.020501f, +0.000551f, -0.000044f}, + {+0.029628f, -0.179066f, +0.005364f, -0.000049f, +0.000007f}, + {-0.038114f, -0.078616f, -0.007491f, +0.001320f, +0.000017f}, + {-0.025506f, -0.225558f, -0.001578f, -0.000313f, -0.000019f}, + {+0.093865f, -0.065189f, +0.011642f, -0.000361f, -0.000030f}, + {+0.055369f, +0.081537f, +0.009138f, -0.000492f, -0.000055f}, + {+0.051502f, +0.222620f, +0.004584f, -0.000598f, -0.000061f}, + {+0.019309f, -0.058544f, +0.003257f, +0.000181f, -0.000009f}, + {-0.051402f, -0.209177f, -0.004739f, -0.000005f, +0.000032f}, + {-0.088918f, +0.001217f, -0.011717f, +0.000085f, +0.000023f} + }, + { + {-0.156411f, -0.421444f, -0.024491f, +0.000067f, +0.000032f}, + {-0.186613f, -0.476552f, -0.029757f, -0.000163f, +0.000095f}, + {+0.020430f, -0.113691f, +0.002893f, +0.000775f, +0.000065f}, + {-0.119151f, -0.201740f, -0.018300f, +0.000297f, +0.000045f}, + {-0.119879f, +0.010231f, -0.016974f, +0.000596f, +0.000034f}, + {+0.016380f, +0.009027f, +0.002417f, +0.000683f, +0.000057f}, + {+0.054627f, +0.269651f, +0.010810f, -0.000526f, -0.000040f}, + {-0.097390f, +0.017005f, -0.015311f, +0.000161f, +0.000060f}, + {-0.042266f, -0.067204f, -0.002884f, -0.000753f, -0.000009f}, + {-0.124653f, -0.076460f, -0.020814f, +0.000683f, +0.000097f}, + {-0.063103f, +0.174209f, -0.008521f, -0.000147f, -0.000032f}, + {+0.034711f, +0.112933f, +0.002461f, +0.000059f, +0.000029f}, + {+0.100579f, +0.144714f, +0.014721f, -0.000551f, -0.000093f}, + {-0.025957f, +0.015194f, -0.003388f, -0.000192f, -0.000011f}, + {-0.076574f, -0.167585f, -0.012107f, +0.000148f, +0.000039f}, + {+0.014876f, -0.155274f, +0.000070f, -0.000119f, +0.000015f} + }, + { + {+0.265430f, +0.225416f, +0.037831f, +0.000115f, +0.000053f}, + {+0.306311f, +0.277325f, +0.043227f, +0.000433f, +0.000096f}, + {+0.056945f, -0.056467f, +0.006568f, -0.000476f, -0.000127f}, + {+0.136114f, +0.189590f, +0.020608f, +0.000082f, -0.000092f}, + {+0.029899f, +0.236698f, +0.003149f, +0.000187f, -0.000112f}, + {+0.002353f, -0.011865f, -0.000725f, -0.000346f, -0.000104f}, + {-0.149926f, -0.044328f, -0.020529f, -0.000533f, +0.000055f}, + {+0.006499f, +0.177667f, -0.000005f, -0.000147f, -0.000024f}, + {+0.030173f, +0.047667f, +0.008504f, -0.001253f, -0.000024f}, + {+0.058868f, +0.204995f, +0.005519f, +0.000216f, -0.000017f}, + {-0.060797f, +0.176638f, -0.008488f, +0.000290f, +0.000044f}, + {-0.066026f, -0.042360f, -0.010165f, +0.000503f, +0.000055f}, + {-0.083588f, -0.140991f, -0.010070f, +0.000860f, +0.000099f}, + {-0.004801f, +0.048462f, -0.000139f, -0.000150f, +0.000006f}, + {+0.080388f, +0.074103f, +0.009601f, -0.000068f, -0.000044f}, + {+0.065811f, -0.073786f, +0.011524f, -0.000018f, -0.000032f} + }, + { + {+0.119762f, +0.449669f, +0.018731f, -0.000115f, -0.000039f}, + {+0.134482f, +0.541069f, +0.022864f, +0.000250f, -0.000117f}, + {-0.042132f, +0.097515f, -0.006293f, -0.001210f, -0.000046f}, + {+0.098328f, +0.249713f, +0.014715f, -0.000530f, -0.000029f}, + {+0.121827f, +0.094517f, +0.018717f, -0.000823f, -0.000016f}, + {-0.013897f, +0.016128f, -0.002834f, -0.001121f, -0.000043f}, + {-0.013035f, -0.259005f, -0.004212f, +0.000650f, +0.000036f}, + {+0.088488f, +0.051805f, +0.014091f, -0.000366f, -0.000066f}, + {+0.034103f, +0.039837f, +0.000657f, +0.000674f, +0.000017f}, + {+0.110624f, +0.126988f, +0.019030f, -0.001012f, -0.000081f}, + {+0.093230f, -0.059767f, +0.012720f, +0.000213f, +0.000018f}, + {-0.010158f, -0.127393f, +0.000864f, +0.000011f, -0.000034f}, + {-0.063926f, -0.170726f, -0.009503f, +0.001011f, +0.000084f}, + {+0.027512f, -0.003892f, +0.003562f, +0.000233f, +0.000020f}, + {+0.023442f, +0.159229f, +0.006050f, -0.000235f, -0.000035f}, + {-0.037775f, +0.088532f, -0.005468f, +0.000062f, -0.000004f} + }, + { + {-0.281213f, -0.164420f, -0.039852f, -0.000042f, -0.000045f}, + {-0.333286f, -0.175696f, -0.047590f, -0.000222f, -0.000083f}, + {-0.046428f, +0.089416f, -0.005265f, +0.000281f, +0.000164f}, + {-0.162498f, -0.149672f, -0.023881f, -0.000229f, +0.000114f}, + {-0.075028f, -0.208672f, -0.010268f, -0.000343f, +0.000132f}, + {-0.011727f, +0.019516f, +0.000540f, +0.000212f, +0.000139f}, + {+0.140528f, -0.025264f, +0.018383f, +0.000497f, -0.000067f}, + {-0.033739f, -0.136327f, -0.003526f, +0.000118f, +0.000049f}, + {-0.027078f, -0.053959f, -0.007554f, +0.001057f, +0.000031f}, + {-0.086060f, -0.177107f, -0.010290f, -0.000364f, +0.000050f}, + {+0.010787f, -0.184727f, +0.002953f, -0.000174f, -0.000054f}, + {+0.067502f, -0.008050f, +0.010245f, -0.000436f, -0.000057f}, + {+0.094254f, +0.075792f, +0.012552f, -0.000706f, -0.000144f}, + {-0.009743f, -0.063892f, -0.003613f, +0.000014f, -0.000006f}, + {-0.069093f, +0.013884f, -0.010485f, -0.000027f, +0.000058f}, + {-0.040587f, +0.086338f, -0.006898f, -0.000093f, +0.000039f} + }, + { + {-0.083222f, -0.468035f, -0.013503f, +0.000232f, +0.000044f}, + {-0.075896f, -0.571385f, -0.014672f, -0.000160f, +0.000148f}, + {+0.064646f, -0.084083f, +0.009714f, +0.001578f, +0.000001f}, + {-0.061670f, -0.306739f, -0.009048f, +0.000650f, -0.000001f}, + {-0.101027f, -0.169945f, -0.015494f, +0.000962f, -0.000016f}, + {+0.029442f, -0.045651f, +0.004343f, +0.001546f, +0.000004f}, + {-0.024934f, +0.231230f, -0.000602f, -0.000728f, -0.000028f}, + {-0.072285f, -0.076179f, -0.012914f, +0.000746f, +0.000059f}, + {-0.032566f, -0.041990f, -0.000543f, -0.000656f, -0.000034f}, + {-0.090764f, -0.173219f, -0.015307f, +0.001207f, +0.000044f}, + {-0.090276f, -0.027741f, -0.013865f, -0.000091f, +0.000003f}, + {-0.018263f, +0.122358f, -0.003953f, -0.000094f, +0.000045f}, + {+0.030642f, +0.175289f, +0.004377f, -0.001562f, -0.000047f}, + {-0.023328f, -0.044760f, -0.001438f, -0.000338f, -0.000032f}, + {+0.006646f, -0.104149f, -0.000978f, +0.000365f, +0.000024f}, + {+0.048240f, -0.050757f, +0.006981f, -0.000141f, -0.000013f} + }, + { + {+0.293187f, +0.109518f, +0.041947f, +0.000007f, +0.000034f}, + {+0.344718f, +0.073613f, +0.049496f, -0.000072f, +0.000056f}, + {+0.021693f, -0.150854f, +0.000496f, +0.000303f, -0.000187f}, + {+0.175693f, +0.054150f, +0.024494f, +0.000572f, -0.000126f}, + {+0.106866f, +0.149507f, +0.014360f, +0.000666f, -0.000140f}, + {+0.005446f, -0.082692f, -0.002403f, +0.000314f, -0.000163f}, + {-0.114767f, +0.094767f, -0.014918f, -0.000548f, +0.000078f}, + {+0.049475f, +0.114052f, +0.007022f, +0.000118f, -0.000074f}, + {+0.031125f, +0.054985f, +0.008404f, -0.000705f, -0.000030f}, + {+0.107661f, +0.132716f, +0.012982f, +0.000706f, -0.000070f}, + {+0.028176f, +0.155327f, +0.002943f, +0.000018f, +0.000055f}, + {-0.051419f, +0.071483f, -0.007973f, +0.000234f, +0.000055f}, + {-0.090400f, -0.012443f, -0.011441f, +0.000118f, +0.000180f}, + {+0.025522f, +0.028081f, +0.003864f, +0.000120f, +0.000013f}, + {+0.045874f, -0.043114f, +0.007466f, +0.000223f, -0.000070f}, + {+0.014499f, -0.105809f, +0.003088f, +0.000276f, -0.000039f} + }, + { + {+0.046789f, +0.488561f, +0.007479f, -0.000388f, -0.000046f}, + {+0.018640f, +0.575973f, +0.005892f, -0.000203f, -0.000177f}, + {-0.079067f, +0.002856f, -0.010533f, -0.001448f, +0.000068f}, + {+0.016267f, +0.296423f, +0.004542f, -0.000403f, +0.000045f}, + {+0.068852f, +0.208415f, +0.010824f, -0.000748f, +0.000061f}, + {-0.046351f, -0.003708f, -0.005559f, -0.001546f, +0.000058f}, + {+0.047339f, -0.155305f, +0.003323f, +0.000760f, +0.000014f}, + {+0.060540f, +0.100086f, +0.009755f, -0.001008f, -0.000039f}, + {+0.028568f, +0.054083f, +0.000810f, +0.000898f, +0.000057f}, + {+0.065074f, +0.200619f, +0.010710f, -0.000928f, +0.000007f}, + {+0.072568f, +0.087920f, +0.011704f, -0.000262f, -0.000027f}, + {+0.035957f, -0.060576f, +0.005664f, +0.000112f, -0.000061f}, + {-0.005716f, -0.143119f, -0.000691f, +0.001673f, -0.000018f}, + {+0.004173f, +0.058408f, +0.000175f, +0.000594f, +0.000044f}, + {-0.014414f, +0.051132f, -0.000839f, -0.000345f, -0.000005f}, + {-0.049091f, -0.010855f, -0.005751f, +0.000426f, +0.000033f} + }, + { + {-0.304340f, -0.049256f, -0.042947f, -0.000088f, -0.000022f}, + {-0.346449f, +0.017003f, -0.049621f, +0.000139f, -0.000009f}, + {+0.019745f, +0.150866f, +0.002851f, -0.000874f, +0.000177f}, + {-0.162730f, +0.020120f, -0.025248f, -0.000808f, +0.000118f}, + {-0.121162f, -0.084738f, -0.017259f, -0.000808f, +0.000129f}, + {+0.021528f, +0.096693f, +0.003962f, -0.000943f, +0.000157f}, + {+0.080586f, -0.103642f, +0.011291f, +0.000589f, -0.000085f}, + {-0.068191f, -0.098030f, -0.009096f, -0.000708f, +0.000092f}, + {-0.036751f, -0.046076f, -0.010119f, +0.000284f, +0.000015f}, + {-0.119856f, -0.085575f, -0.015319f, -0.000749f, +0.000064f}, + {-0.056191f, -0.109851f, -0.006441f, -0.000263f, -0.000045f}, + {+0.024446f, -0.076942f, +0.005466f, +0.000057f, -0.000045f}, + {+0.077086f, -0.012676f, +0.010840f, +0.000676f, -0.000186f}, + {-0.022826f, +0.016537f, -0.004763f, -0.000058f, -0.000029f}, + {-0.027607f, +0.031101f, -0.005172f, -0.000482f, +0.000074f}, + {+0.014855f, +0.087430f, -0.000738f, -0.000308f, +0.000029f} + }, + { + {-0.005004f, -0.508800f, -0.001655f, +0.000570f, +0.000043f}, + {+0.037995f, -0.575156f, +0.001530f, +0.000956f, +0.000194f}, + {+0.063856f, +0.080957f, +0.012812f, -0.000366f, -0.000142f}, + {+0.010948f, -0.247204f, +0.002839f, -0.000988f, -0.000091f}, + {-0.037852f, -0.213873f, -0.003692f, -0.000614f, -0.000107f}, + {+0.039839f, +0.066118f, +0.007988f, +0.000076f, -0.000128f}, + {-0.045977f, +0.093672f, -0.005215f, -0.000506f, +0.000005f}, + {-0.041130f, -0.141991f, -0.007462f, +0.000858f, +0.000008f}, + {-0.021819f, -0.064730f, +0.000517f, -0.001640f, -0.000079f}, + {-0.039217f, -0.211900f, -0.002725f, -0.000921f, -0.000061f}, + {-0.045306f, -0.127706f, -0.011256f, +0.001493f, +0.000048f}, + {-0.032008f, +0.009436f, -0.005842f, +0.000094f, +0.000078f}, + {-0.004712f, +0.114810f, -0.003709f, -0.000227f, +0.000095f}, + {+0.008291f, -0.029832f, +0.002509f, -0.001272f, -0.000051f}, + {+0.010544f, -0.029052f, +0.001437f, -0.000138f, -0.000018f}, + {+0.030918f, +0.063638f, +0.005584f, -0.001227f, -0.000052f} + }, + { + {+0.309505f, -0.026680f, +0.043359f, +0.000419f, +0.000012f}, + {+0.340746f, -0.112091f, +0.048231f, +0.000694f, -0.000055f}, + {-0.050908f, -0.091302f, -0.002377f, +0.001134f, -0.000125f}, + {+0.144586f, -0.040667f, +0.026484f, +0.000403f, -0.000085f}, + {+0.123071f, +0.035557f, +0.020641f, +0.000216f, -0.000092f}, + {-0.043825f, -0.058128f, -0.002805f, +0.001548f, -0.000111f}, + {-0.057009f, +0.077140f, -0.008666f, -0.000464f, +0.000085f}, + {+0.083496f, +0.049994f, +0.012188f, +0.002184f, -0.000094f}, + {+0.041301f, +0.031775f, +0.012825f, +0.000028f, +0.000015f}, + {+0.123609f, +0.042304f, +0.020375f, -0.000225f, -0.000027f}, + {+0.072663f, +0.052460f, +0.006157f, +0.001671f, +0.000023f}, + {-0.007106f, +0.047603f, -0.003493f, -0.000487f, +0.000023f}, + {-0.066995f, +0.014584f, -0.013984f, -0.001717f, +0.000149f}, + {+0.012333f, -0.023056f, +0.004831f, -0.000535f, +0.000051f}, + {+0.018093f, -0.018206f, +0.005001f, +0.000871f, -0.000068f}, + {-0.032484f, -0.034633f, +0.000235f, -0.000375f, -0.000007f} + } +}; + +const float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= +{ + { + {+0.028305f, +0.686064f, +0.068005f, +0.008358f, +0.000134f}, + {-0.041076f, -0.081510f, +0.101574f, -0.012332f, -0.000133f}, + {+0.004694f, +0.091178f, -0.006019f, -0.000987f, -0.000100f}, + {+0.005000f, +0.062531f, -0.030068f, +0.002120f, -0.000090f}, + {-0.008304f, -0.004854f, -0.003618f, +0.000840f, +0.000150f}, + {-0.005344f, -0.010835f, -0.007864f, -0.004915f, +0.000112f}, + {-0.014194f, +0.005486f, -0.000750f, -0.002195f, +0.000158f}, + {+0.002251f, -0.002762f, +0.046227f, +0.004129f, +0.000004f}, + {-0.024537f, +0.046996f, -0.049712f, -0.006618f, +0.000145f}, + {-0.010068f, +0.052648f, -0.026763f, -0.010223f, -0.000366f}, + {-0.000943f, -0.017480f, +0.020482f, +0.001034f, +0.000058f}, + {-0.002377f, +0.034436f, +0.006489f, -0.012518f, -0.000220f}, + {-0.003606f, -0.027453f, +0.015178f, +0.001090f, -0.000006f}, + {-0.000854f, -0.033509f, +0.016348f, +0.002809f, +0.000078f}, + {+0.001127f, -0.002978f, +0.013287f, +0.005932f, -0.000006f}, + {-0.002728f, -0.006413f, +0.003444f, +0.002047f, +0.000053f} + }, + { + {-0.060981f, +0.539033f, -0.032927f, -0.008925f, -0.000158f}, + {+0.088569f, -0.331317f, -0.135589f, +0.009798f, +0.000139f}, + {-0.006979f, +0.010016f, -0.062582f, +0.002090f, +0.000127f}, + {-0.010389f, +0.024941f, -0.053685f, -0.002256f, +0.000117f}, + {+0.013525f, +0.047393f, +0.001706f, -0.001388f, -0.000191f}, + {+0.006413f, +0.030122f, +0.020701f, +0.011138f, -0.000148f}, + {+0.024834f, +0.109440f, +0.032236f, +0.002032f, -0.000215f}, + {-0.002223f, -0.102504f, -0.064424f, -0.005351f, -0.000007f}, + {+0.037480f, +0.308972f, +0.087606f, +0.006506f, -0.000210f}, + {+0.016939f, +0.106048f, +0.043760f, +0.005027f, +0.000470f}, + {+0.000739f, +0.002371f, +0.021897f, +0.001907f, -0.000076f}, + {+0.005038f, +0.073983f, +0.110448f, +0.018835f, +0.000283f}, + {+0.003491f, -0.004047f, +0.005200f, -0.002767f, +0.000014f}, + {+0.001174f, +0.011186f, +0.026019f, -0.003363f, -0.000098f}, + {-0.002185f, -0.029503f, -0.056810f, -0.012753f, +0.000001f}, + {+0.003633f, +0.007292f, -0.011811f, -0.003296f, -0.000071f} + }, + { + {+0.056640f, +0.424888f, -0.091068f, -0.008146f, -0.000105f}, + {-0.085624f, -0.535380f, +0.135686f, +0.024218f, +0.000137f}, + {+0.000837f, -0.039137f, -0.022512f, -0.003663f, +0.000063f}, + {+0.009275f, -0.013781f, -0.023629f, -0.005508f, +0.000051f}, + {-0.004547f, +0.088202f, -0.042587f, +0.003924f, -0.000093f}, + {+0.003101f, +0.099791f, -0.033209f, -0.007324f, -0.000060f}, + {-0.010598f, +0.183236f, -0.035352f, +0.008713f, -0.000074f}, + {-0.003128f, -0.087287f, -0.092687f, -0.003205f, -0.000001f}, + {-0.002915f, +0.422198f, -0.021401f, +0.017334f, -0.000046f}, + {-0.008367f, +0.030365f, +0.081942f, +0.019445f, +0.000222f}, + {+0.002027f, +0.059247f, -0.024597f, -0.009143f, -0.000033f}, + {-0.005485f, +0.016036f, +0.189920f, -0.005523f, +0.000134f}, + {+0.004590f, +0.043786f, -0.049890f, +0.002054f, -0.000006f}, + {+0.000794f, +0.086150f, -0.052409f, -0.001703f, -0.000051f}, + {+0.002015f, +0.016274f, -0.139462f, +0.010767f, +0.000013f}, + {+0.000980f, +0.021151f, -0.025610f, +0.002927f, -0.000028f} + }, + { + {-0.037044f, +0.299825f, +0.010626f, +0.009027f, +0.000178f}, + {+0.073631f, -0.563948f, -0.256507f, -0.030068f, -0.000165f}, + {+0.001394f, +0.007863f, +0.051772f, +0.005838f, -0.000136f}, + {-0.007311f, +0.033976f, +0.087547f, +0.012955f, -0.000125f}, + {+0.000742f, -0.006564f, -0.155719f, -0.010210f, +0.000207f}, + {-0.003772f, +0.011095f, -0.118202f, -0.002442f, +0.000158f}, + {-0.001621f, -0.014236f, -0.266669f, -0.019686f, +0.000230f}, + {+0.004592f, +0.006155f, +0.002774f, +0.008968f, +0.000009f}, + {-0.017921f, +0.015905f, -0.425734f, -0.038383f, +0.000222f}, + {+0.007216f, -0.258967f, -0.290441f, -0.007092f, -0.000519f}, + {-0.003522f, +0.023316f, -0.032467f, +0.009674f, +0.000084f}, + {+0.006507f, -0.177693f, -0.033997f, +0.006462f, -0.000311f}, + {-0.006842f, +0.024376f, -0.051686f, +0.001498f, -0.000018f}, + {-0.002603f, +0.039216f, -0.091765f, +0.003591f, +0.000108f}, + {-0.003570f, +0.063130f, -0.095408f, -0.005271f, -0.000002f}, + {-0.003443f, +0.045327f, +0.012038f, -0.006717f, +0.000078f} + }, + { + {+0.016927f, -0.038791f, +0.287896f, +0.014303f, +0.000072f}, + {-0.067605f, +0.097306f, -0.721167f, -0.014182f, -0.000134f}, + {+0.004523f, -0.006482f, +0.087578f, -0.003063f, -0.000024f}, + {+0.010963f, -0.024388f, +0.147380f, -0.008366f, -0.000010f}, + {-0.009045f, -0.033260f, -0.131601f, +0.010659f, +0.000033f}, + {-0.006391f, -0.001186f, -0.117010f, +0.003913f, +0.000007f}, + {-0.000206f, -0.124154f, -0.212720f, +0.011624f, -0.000013f}, + {+0.001006f, +0.018224f, +0.038185f, -0.004418f, -0.000004f}, + {+0.005972f, -0.280246f, -0.279425f, +0.024886f, -0.000056f}, + {-0.013866f, -0.056049f, -0.470046f, -0.033031f, -0.000066f}, + {+0.002003f, -0.013997f, +0.006699f, -0.002838f, +0.000007f}, + {-0.005432f, -0.012448f, -0.193385f, -0.021709f, -0.000041f}, + {+0.002080f, -0.035733f, +0.001464f, -0.003877f, +0.000020f}, + {+0.000948f, -0.008178f, -0.047042f, -0.001214f, +0.000022f}, + {+0.008010f, -0.037066f, -0.006003f, +0.001581f, -0.000020f}, + {+0.002016f, -0.033476f, +0.072960f, +0.011160f, +0.000001f} + }, + { + {-0.031783f, -0.056831f, +0.279059f, -0.028993f, -0.000193f}, + {+0.066811f, +0.547107f, -0.401585f, +0.049258f, +0.000209f}, + {-0.014835f, -0.045923f, +0.063394f, -0.003455f, +0.000127f}, + {-0.030703f, -0.186180f, +0.047058f, -0.002768f, +0.000115f}, + {+0.020147f, +0.183472f, +0.029803f, -0.002654f, -0.000199f}, + {+0.004470f, +0.071648f, -0.045482f, +0.003212f, -0.000142f}, + {+0.003858f, +0.057272f, -0.023397f, +0.006911f, -0.000202f}, + {-0.004365f, -0.021410f, +0.013528f, -0.002517f, -0.000010f}, + {-0.011844f, +0.030236f, +0.050498f, +0.004358f, -0.000183f}, + {+0.006262f, +0.197324f, -0.174496f, +0.041478f, +0.000509f}, + {+0.000909f, -0.022088f, +0.010300f, -0.001930f, -0.000082f}, + {-0.000576f, +0.053541f, -0.096593f, +0.021942f, +0.000302f}, + {-0.001649f, -0.054620f, +0.008127f, +0.002136f, +0.000016f}, + {+0.004848f, +0.029592f, +0.000282f, +0.000006f, -0.000106f}, + {-0.010837f, -0.090950f, -0.014402f, -0.000183f, +0.000006f}, + {+0.000125f, -0.021283f, +0.064876f, -0.009148f, -0.000073f} + }, + { + {+0.115524f, -0.001880f, -0.031709f, +0.016815f, -0.000032f}, + {-0.083119f, +0.442745f, +0.062014f, -0.030630f, +0.000109f}, + {+0.026381f, -0.044427f, -0.014701f, +0.004175f, -0.000007f}, + {+0.059970f, -0.279751f, -0.022479f, +0.004671f, -0.000021f}, + {-0.025539f, +0.285695f, +0.030687f, -0.001281f, +0.000018f}, + {+0.015563f, +0.014341f, +0.021407f, -0.004386f, +0.000034f}, + {-0.005271f, +0.080088f, +0.036839f, -0.008678f, +0.000080f}, + {-0.004239f, -0.044848f, +0.005762f, +0.002882f, +0.000009f}, + {+0.051110f, +0.084066f, +0.036589f, -0.007555f, +0.000131f}, + {+0.012587f, +0.147413f, +0.020658f, -0.013969f, -0.000077f}, + {-0.003103f, -0.017462f, +0.008157f, +0.001803f, +0.000018f}, + {+0.001965f, -0.006861f, +0.032042f, -0.005627f, -0.000042f}, + {+0.003954f, -0.069529f, +0.014309f, +0.000469f, -0.000034f}, + {-0.011351f, +0.041303f, +0.021348f, +0.000056f, +0.000005f}, + {+0.003411f, -0.131943f, -0.006306f, -0.000445f, +0.000025f}, + {-0.006265f, +0.023141f, +0.008583f, +0.003180f, +0.000023f} + }, + { + {-0.170064f, -0.305557f, -0.025217f, +0.001133f, +0.000198f}, + {+0.064730f, +0.498651f, +0.047336f, -0.004429f, -0.000255f}, + {-0.023390f, -0.090206f, -0.010300f, +0.000988f, -0.000108f}, + {-0.044740f, -0.402670f, -0.013847f, +0.001569f, -0.000092f}, + {+0.008298f, +0.311166f, +0.004422f, -0.002306f, +0.000173f}, + {-0.024372f, -0.077330f, +0.000442f, -0.001491f, +0.000110f}, + {+0.006327f, +0.051079f, +0.002801f, -0.003002f, +0.000146f}, + {+0.022671f, -0.029757f, -0.017304f, +0.000691f, +0.000009f}, + {-0.067089f, -0.067084f, +0.027632f, -0.007480f, +0.000108f}, + {-0.016067f, +0.071916f, +0.031764f, -0.005887f, -0.000449f}, + {+0.001118f, -0.007300f, +0.004732f, -0.000912f, +0.000072f}, + {+0.012764f, -0.015163f, +0.034285f, -0.004782f, -0.000265f}, + {+0.002476f, -0.078915f, +0.001493f, -0.000518f, -0.000008f}, + {+0.012009f, +0.058211f, +0.005130f, -0.001142f, +0.000096f}, + {+0.017876f, -0.124879f, -0.017363f, +0.001041f, -0.000014f}, + {+0.016489f, +0.044821f, -0.013683f, +0.000199f, +0.000060f} + }, + { + {+0.031523f, -0.568562f, -0.010165f, -0.004741f, -0.000011f}, + {+0.072210f, +0.453377f, +0.012668f, +0.009988f, -0.000056f}, + {-0.013073f, -0.089526f, -0.006790f, -0.002603f, +0.000024f}, + {-0.055858f, -0.385059f, +0.007901f, -0.002683f, +0.000038f}, + {+0.048389f, +0.243348f, -0.011742f, +0.002577f, -0.000053f}, + {+0.000883f, -0.129298f, -0.003415f, +0.002563f, -0.000054f}, + {+0.004842f, +0.028248f, -0.014727f, +0.004067f, -0.000113f}, + {-0.035207f, +0.044693f, -0.000317f, -0.001511f, -0.000014f}, + {+0.027873f, -0.208313f, -0.025747f, +0.006096f, -0.000162f}, + {+0.003882f, +0.022910f, -0.004172f, +0.004195f, +0.000185f}, + {+0.007316f, -0.007332f, -0.005614f, +0.000479f, -0.000037f}, + {-0.030651f, +0.049980f, -0.004306f, +0.003095f, +0.000103f}, + {-0.012670f, -0.046258f, -0.010787f, -0.000294f, +0.000044f}, + {-0.001544f, +0.071605f, -0.001508f, +0.001151f, -0.000025f}, + {-0.039147f, -0.057668f, +0.001114f, -0.001056f, -0.000026f}, + {-0.013243f, +0.076337f, -0.002755f, -0.000535f, -0.000039f} + }, + { + {+0.207932f, -0.287807f, +0.039075f, +0.000182f, -0.000191f}, + {-0.222358f, +0.019823f, -0.045919f, +0.001569f, +0.000284f}, + {+0.051902f, +0.024897f, +0.018540f, -0.000535f, +0.000087f}, + {+0.157008f, -0.084022f, +0.015927f, -0.001511f, +0.000065f}, + {-0.104303f, +0.038679f, -0.004300f, +0.001876f, -0.000138f}, + {+0.031107f, -0.090841f, -0.009802f, +0.001340f, -0.000075f}, + {-0.026573f, -0.012360f, -0.012445f, +0.003442f, -0.000083f}, + {+0.021614f, +0.128929f, +0.008965f, -0.000458f, -0.000006f}, + {+0.022498f, -0.192805f, -0.008217f, +0.005889f, -0.000025f}, + {-0.001966f, +0.020932f, -0.017205f, +0.001490f, +0.000358f}, + {-0.013558f, -0.031486f, -0.001450f, +0.000305f, -0.000057f}, + {+0.020576f, +0.126851f, -0.015311f, +0.000876f, +0.000211f}, + {+0.011427f, -0.005250f, -0.003401f, +0.000196f, -0.000006f}, + {-0.015857f, +0.049501f, -0.003717f, +0.000601f, -0.000080f}, + {+0.034004f, +0.039429f, +0.003524f, -0.000004f, +0.000023f}, + {-0.014818f, +0.079680f, +0.007758f, +0.000184f, -0.000042f} + }, + { + {-0.203020f, +0.343926f, -0.022319f, +0.001551f, +0.000052f}, + {+0.128697f, -0.502946f, +0.012208f, -0.003598f, -0.000018f}, + {-0.021293f, +0.148245f, -0.006309f, +0.001691f, -0.000030f}, + {-0.108184f, +0.296591f, -0.010288f, +0.001875f, -0.000040f}, + {+0.072445f, -0.199735f, +0.008865f, -0.001996f, +0.000070f}, + {-0.035970f, -0.000468f, +0.003327f, -0.001758f, +0.000054f}, + {+0.022536f, -0.076991f, +0.011763f, -0.002716f, +0.000111f}, + {+0.019549f, +0.129451f, +0.001977f, +0.001130f, +0.000018f}, + {-0.040267f, -0.070315f, +0.008077f, -0.004109f, +0.000149f}, + {+0.011400f, +0.010732f, +0.007406f, -0.002026f, -0.000250f}, + {+0.002851f, -0.052737f, +0.000419f, -0.000375f, +0.000049f}, + {+0.020950f, +0.124942f, +0.003929f, -0.001693f, -0.000137f}, + {-0.002830f, +0.012262f, +0.001345f, -0.000201f, -0.000049f}, + {+0.023252f, -0.010554f, +0.006382f, -0.000870f, +0.000037f}, + {+0.002904f, +0.073991f, +0.004806f, +0.000805f, +0.000022f}, + {+0.038844f, +0.012454f, +0.000939f, +0.000294f, +0.000047f} + }, + { + {-0.104978f, +0.491439f, -0.023130f, -0.000395f, +0.000170f}, + {+0.174716f, -0.431741f, +0.037189f, -0.000731f, -0.000283f}, + {-0.071508f, +0.077184f, -0.011405f, +0.000280f, -0.000069f}, + {-0.071830f, +0.341169f, -0.016908f, +0.001162f, -0.000044f}, + {+0.046880f, -0.228632f, +0.012580f, -0.001764f, +0.000105f}, + {+0.015443f, +0.068044f, +0.005570f, -0.000844f, +0.000048f}, + {+0.020736f, -0.083339f, +0.010949f, -0.002791f, +0.000031f}, + {-0.052065f, +0.019705f, -0.009215f, +0.000218f, +0.000001f}, + {+0.033356f, +0.036658f, +0.013911f, -0.004323f, -0.000040f}, + {-0.006601f, -0.021923f, +0.013349f, -0.000309f, -0.000258f}, + {+0.019016f, -0.023410f, +0.005296f, -0.000367f, +0.000039f}, + {-0.051437f, +0.010933f, +0.004546f, +0.000118f, -0.000155f}, + {+0.002536f, +0.019548f, +0.001804f, +0.000278f, +0.000021f}, + {-0.005862f, -0.062421f, -0.001401f, -0.000650f, +0.000064f}, + {-0.033799f, +0.010290f, -0.008108f, -0.000071f, -0.000030f}, + {-0.019280f, -0.065253f, -0.001294f, -0.000391f, +0.000024f} + }, + { + {+0.271163f, -0.091653f, +0.035807f, -0.000730f, -0.000085f}, + {-0.261169f, +0.235971f, -0.033757f, +0.001621f, +0.000093f}, + {+0.095839f, -0.182710f, +0.015397f, -0.001103f, +0.000028f}, + {+0.156712f, -0.007300f, +0.019789f, -0.001371f, +0.000033f}, + {-0.111926f, +0.011250f, -0.016908f, +0.001748f, -0.000072f}, + {+0.005469f, +0.082676f, -0.002169f, +0.001143f, -0.000043f}, + {-0.049695f, +0.016110f, -0.010723f, +0.002011f, -0.000086f}, + {+0.031235f, -0.105162f, +0.004404f, -0.000861f, -0.000020f}, + {-0.012529f, +0.088572f, -0.009833f, +0.002839f, -0.000106f}, + {-0.012620f, -0.018407f, -0.006593f, +0.002080f, +0.000273f}, + {-0.020511f, +0.042167f, -0.004809f, +0.000322f, -0.000054f}, + {+0.032247f, -0.119711f, +0.002446f, +0.001305f, +0.000148f}, + {-0.004589f, +0.033907f, -0.002233f, +0.000259f, +0.000047f}, + {-0.024243f, -0.043735f, -0.001053f, +0.000816f, -0.000043f}, + {+0.018051f, -0.070970f, +0.002759f, -0.000690f, -0.000016f}, + {-0.025928f, -0.049597f, -0.005106f, -0.000174f, -0.000047f} + }, + { + {-0.009292f, -0.523511f, +0.005609f, +0.000701f, -0.000140f}, + {-0.049598f, +0.562660f, -0.018307f, -0.000353f, +0.000250f}, + {+0.026674f, -0.300653f, +0.000453f, -0.000226f, +0.000059f}, + {-0.025200f, -0.281197f, +0.004191f, -0.000792f, +0.000032f}, + {+0.023452f, +0.216602f, -0.003361f, +0.001302f, -0.000079f}, + {-0.022798f, +0.048857f, -0.002028f, +0.000528f, -0.000034f}, + {+0.017850f, +0.123147f, -0.004163f, +0.001736f, -0.000002f}, + {+0.030232f, -0.106769f, +0.006484f, -0.000160f, +0.000004f}, + {-0.027081f, +0.068469f, -0.013975f, +0.002765f, +0.000074f}, + {+0.015824f, +0.032277f, -0.008777f, -0.000341f, +0.000168f}, + {-0.010909f, +0.060681f, -0.000865f, +0.000330f, -0.000023f}, + {+0.018513f, -0.140495f, -0.006788f, -0.000319f, +0.000106f}, + {-0.009128f, +0.032657f, +0.001038f, -0.000299f, -0.000035f}, + {+0.030409f, +0.035966f, +0.000871f, +0.000497f, -0.000049f}, + {+0.024037f, -0.062735f, +0.004854f, -0.000003f, +0.000033f}, + {+0.031906f, +0.040222f, +0.004969f, +0.000300f, -0.000009f} + }, + { + {-0.274242f, -0.111152f, -0.038437f, +0.000541f, +0.000106f}, + {+0.297362f, +0.028772f, +0.040257f, -0.001002f, -0.000153f}, + {-0.157861f, -0.028386f, -0.015885f, +0.000932f, -0.000023f}, + {-0.130190f, -0.116848f, -0.020017f, +0.001091f, -0.000023f}, + {+0.100486f, +0.097500f, +0.017137f, -0.001413f, +0.000066f}, + {+0.042930f, -0.041353f, +0.001818f, -0.000969f, +0.000030f}, + {+0.035539f, +0.107479f, +0.005226f, -0.001521f, +0.000054f}, + {-0.056245f, +0.022881f, -0.006748f, +0.000737f, +0.000020f}, + {+0.051781f, -0.041176f, +0.012387f, -0.002184f, +0.000054f}, + {+0.005351f, +0.056149f, +0.003091f, -0.002220f, -0.000265f}, + {+0.035484f, -0.008203f, +0.004198f, -0.000217f, +0.000054f}, + {-0.049383f, -0.039088f, -0.002024f, -0.001275f, -0.000143f}, + {+0.027963f, -0.019171f, +0.001212f, -0.000337f, -0.000040f}, + {+0.004231f, +0.075991f, +0.001119f, -0.000670f, +0.000043f}, + {-0.028326f, +0.016304f, -0.003947f, +0.000597f, +0.000009f}, + {+0.014165f, +0.065014f, +0.003473f, +0.000208f, +0.000042f} + }, + { + {+0.100761f, +0.468705f, +0.009523f, -0.000855f, +0.000106f}, + {-0.068322f, -0.534398f, +0.000794f, +0.001015f, -0.000195f}, + {+0.100085f, +0.366003f, +0.010962f, +0.000114f, -0.000054f}, + {+0.079789f, +0.208939f, +0.006983f, +0.000516f, -0.000029f}, + {-0.074868f, -0.177414f, -0.007217f, -0.000977f, +0.000063f}, + {-0.040080f, -0.169063f, -0.003424f, -0.000213f, +0.000031f}, + {-0.047852f, -0.014657f, +0.004244f, -0.000996f, -0.000005f}, + {+0.004688f, +0.112753f, -0.003849f, +0.000122f, -0.000008f}, + {-0.009956f, -0.138804f, +0.008769f, -0.001626f, -0.000077f}, + {-0.022634f, +0.009810f, +0.007400f, +0.000511f, -0.000099f}, + {-0.010732f, -0.077733f, -0.000399f, -0.000274f, +0.000009f}, + {+0.039390f, +0.089325f, +0.008313f, +0.000351f, -0.000070f}, + {-0.019067f, -0.090342f, -0.002768f, +0.000205f, +0.000044f}, + {-0.042005f, +0.002738f, -0.004159f, -0.000376f, +0.000037f}, + {-0.016073f, +0.032695f, -0.005232f, +0.000105f, -0.000033f}, + {-0.040117f, -0.022661f, -0.007858f, -0.000231f, -0.000002f} + }, + { + {+0.246756f, +0.241170f, +0.035479f, -0.000554f, -0.000114f}, + {-0.272424f, -0.216540f, -0.039997f, +0.001031f, +0.000186f}, + {+0.100824f, +0.372627f, +0.007492f, -0.000845f, +0.000020f}, + {+0.086728f, +0.200706f, +0.013419f, -0.000947f, +0.000014f}, + {-0.067471f, -0.194793f, -0.010208f, +0.001216f, -0.000058f}, + {-0.018637f, -0.214052f, +0.004837f, +0.000884f, -0.000020f}, + {+0.025584f, -0.127835f, -0.000911f, +0.001401f, -0.000028f}, + {+0.056339f, +0.027855f, +0.010673f, -0.000579f, -0.000019f}, + {-0.060859f, -0.070229f, -0.011217f, +0.002123f, -0.000013f}, + {+0.014798f, -0.052375f, -0.000623f, +0.002191f, +0.000241f}, + {-0.034285f, -0.039743f, -0.005351f, +0.000109f, -0.000050f}, + {-0.007201f, +0.159482f, -0.003886f, +0.001201f, +0.000130f}, + {-0.020187f, -0.092383f, +0.000382f, +0.000354f, +0.000030f}, + {+0.028788f, -0.109693f, +0.004153f, +0.000525f, -0.000041f}, + {+0.036625f, -0.054073f, +0.008577f, -0.000524f, -0.000003f}, + {-0.002610f, -0.084126f, +0.000986f, -0.000174f, -0.000035f} + }, + { + {-0.167535f, -0.399812f, -0.020854f, +0.000806f, -0.000074f}, + {+0.145635f, +0.430918f, +0.013134f, -0.001141f, +0.000134f}, + {-0.184602f, -0.052096f, -0.013909f, -0.000043f, +0.000053f}, + {-0.110131f, -0.103022f, -0.011251f, -0.000423f, +0.000031f}, + {+0.114138f, +0.085208f, +0.011213f, +0.000798f, -0.000055f}, + {+0.095938f, -0.054666f, +0.000697f, +0.000059f, -0.000033f}, + {-0.000204f, -0.169483f, -0.009146f, +0.000575f, -0.000003f}, + {-0.030090f, -0.112432f, -0.004382f, -0.000216f, +0.000011f}, + {+0.053018f, +0.105332f, -0.004066f, +0.000908f, +0.000060f}, + {+0.009119f, -0.057095f, -0.007675f, -0.000456f, +0.000052f}, + {+0.027961f, +0.057568f, +0.003773f, +0.000262f, +0.000002f}, + {-0.030433f, +0.136477f, -0.002756f, -0.000256f, +0.000046f}, + {+0.049955f, +0.009293f, +0.002856f, -0.000133f, -0.000047f}, + {+0.028171f, -0.112646f, +0.000816f, +0.000380f, -0.000028f}, + {+0.014607f, -0.096614f, -0.000430f, -0.000147f, +0.000031f}, + {+0.051182f, -0.003494f, +0.006796f, +0.000143f, +0.000008f} + }, + { + {-0.208650f, -0.335847f, -0.029770f, +0.000608f, +0.000111f}, + {+0.234234f, +0.291735f, +0.035875f, -0.001265f, -0.000192f}, + {+0.043525f, -0.386017f, -0.001141f, +0.000753f, -0.000019f}, + {-0.024332f, -0.238532f, -0.004594f, +0.000982f, -0.000011f}, + {+0.003204f, +0.260777f, +0.001135f, -0.001218f, +0.000051f}, + {-0.094495f, +0.222636f, -0.006686f, -0.000805f, +0.000016f}, + {-0.041620f, -0.113126f, +0.003804f, -0.001425f, +0.000014f}, + {-0.059468f, -0.070637f, -0.008480f, +0.000599f, +0.000018f}, + {+0.037218f, +0.133212f, +0.009087f, -0.002277f, -0.000009f}, + {-0.028004f, +0.004399f, -0.001485f, -0.002043f, -0.000214f}, + {+0.030214f, +0.052517f, +0.005355f, -0.000063f, +0.000045f}, + {+0.064016f, +0.008538f, +0.001790f, -0.001210f, -0.000117f}, + {-0.035765f, +0.136937f, -0.003958f, -0.000288f, -0.000023f}, + {-0.055646f, +0.013868f, -0.004689f, -0.000551f, +0.000038f}, + {-0.069712f, +0.026129f, -0.007603f, +0.000472f, -0.000000f}, + {-0.022298f, +0.108549f, -0.003048f, +0.000134f, +0.000029f} + }, + { + {+0.220027f, +0.326004f, +0.029195f, -0.000639f, +0.000050f}, + {-0.196112f, -0.377527f, -0.024063f, +0.000894f, -0.000082f}, + {+0.120792f, -0.254914f, +0.016146f, +0.000093f, -0.000054f}, + {+0.094942f, -0.058645f, +0.007709f, +0.000309f, -0.000035f}, + {-0.109837f, +0.090094f, -0.008580f, -0.000595f, +0.000051f}, + {-0.015004f, +0.336419f, +0.000747f, -0.000099f, +0.000037f}, + {+0.088851f, +0.073948f, +0.011663f, -0.000480f, +0.000014f}, + {+0.078671f, +0.147609f, +0.010996f, +0.000157f, -0.000013f}, + {-0.073075f, -0.041998f, -0.000840f, -0.000593f, -0.000038f}, + {+0.021795f, +0.078114f, +0.010687f, +0.000406f, -0.000022f}, + {-0.048839f, -0.075397f, -0.009105f, -0.000275f, -0.000010f}, + {-0.060558f, -0.174519f, -0.000133f, +0.000349f, -0.000030f}, + {-0.014867f, +0.171348f, +0.000948f, +0.000119f, +0.000048f}, + {+0.011606f, +0.111954f, +0.001552f, -0.000324f, +0.000023f}, + {+0.032653f, +0.181837f, +0.003210f, +0.000081f, -0.000029f}, + {-0.047749f, +0.068914f, -0.006585f, -0.000128f, -0.000011f} + }, + { + {+0.160319f, +0.417913f, +0.022833f, -0.000655f, -0.000102f}, + {-0.203183f, -0.369192f, -0.029570f, +0.001470f, +0.000179f}, + {-0.099428f, +0.084211f, -0.009701f, -0.000901f, +0.000019f}, + {-0.024797f, +0.121541f, +0.001449f, -0.000997f, +0.000010f}, + {+0.062623f, -0.173224f, +0.004907f, +0.001276f, -0.000047f}, + {+0.122967f, +0.126986f, +0.011441f, +0.000914f, -0.000015f}, + {-0.052738f, +0.283556f, -0.009426f, +0.001548f, -0.000011f}, + {+0.026749f, +0.238083f, -0.000760f, -0.000643f, -0.000018f}, + {-0.009777f, -0.145605f, -0.003329f, +0.002400f, +0.000014f}, + {+0.015861f, +0.086444f, -0.001699f, +0.001895f, +0.000191f}, + {-0.021170f, -0.125446f, +0.000128f, +0.000133f, -0.000040f}, + {-0.009541f, -0.253886f, +0.000901f, +0.000985f, +0.000105f}, + {+0.062589f, +0.060931f, +0.003167f, +0.000273f, +0.000019f}, + {+0.045937f, +0.052228f, +0.008096f, +0.000661f, -0.000035f}, + {+0.065525f, +0.132007f, +0.007909f, -0.000377f, +0.000001f}, + {+0.049219f, -0.081032f, +0.007172f, +0.000024f, -0.000024f} + }, + { + {-0.257389f, -0.225050f, -0.034043f, +0.000536f, -0.000034f}, + {+0.247632f, +0.326555f, +0.030602f, -0.000692f, +0.000048f}, + {-0.031117f, +0.179461f, -0.007189f, +0.000264f, +0.000055f}, + {-0.035804f, +0.099360f, -0.004701f, -0.000140f, +0.000038f}, + {+0.050312f, -0.188989f, +0.003722f, +0.000209f, -0.000050f}, + {-0.100154f, -0.206241f, -0.011197f, -0.000132f, -0.000040f}, + {-0.083770f, +0.242079f, -0.010883f, +0.000381f, -0.000023f}, + {-0.128871f, +0.005839f, -0.011060f, +0.000130f, +0.000016f}, + {+0.079686f, -0.004748f, +0.001794f, +0.000421f, +0.000023f}, + {-0.049708f, -0.006526f, -0.011594f, -0.000511f, +0.000001f}, + {+0.089665f, +0.042291f, +0.010250f, +0.000131f, +0.000016f}, + {+0.097341f, -0.094533f, +0.003394f, -0.000253f, +0.000020f}, + {-0.063601f, -0.124244f, -0.005358f, -0.000329f, -0.000050f}, + {-0.033103f, -0.074639f, -0.008297f, +0.000018f, -0.000018f}, + {-0.088809f, -0.106459f, -0.010306f, +0.000001f, +0.000028f}, + {+0.024983f, -0.120136f, +0.002311f, -0.000104f, +0.000013f} + }, + { + {-0.103698f, -0.459883f, -0.015029f, +0.000609f, +0.000094f}, + {+0.162130f, +0.457377f, +0.023723f, -0.001331f, -0.000162f}, + {+0.064814f, +0.022691f, +0.012901f, +0.000560f, -0.000021f}, + {+0.014719f, +0.018235f, +0.000043f, +0.000822f, -0.000013f}, + {-0.074601f, +0.003099f, -0.007367f, -0.000899f, +0.000047f}, + {-0.032786f, -0.305719f, -0.004336f, -0.000704f, +0.000017f}, + {+0.154173f, -0.111921f, +0.017036f, -0.001496f, +0.000014f}, + {+0.075072f, -0.308164f, +0.011544f, +0.000327f, +0.000019f}, + {-0.016061f, +0.143722f, +0.001013f, -0.002196f, -0.000011f}, + {+0.025959f, -0.115431f, +0.002496f, -0.001721f, -0.000173f}, + {-0.041136f, +0.248497f, -0.009339f, -0.000010f, +0.000035f}, + {-0.096543f, +0.197881f, -0.009153f, -0.000920f, -0.000096f}, + {+0.003482f, -0.225559f, +0.000330f, -0.000071f, -0.000017f}, + {-0.034753f, -0.075563f, -0.003521f, -0.000361f, +0.000033f}, + {-0.012501f, -0.228861f, +0.001789f, +0.000220f, -0.000002f}, + {-0.060118f, +0.006012f, -0.006537f, +0.000205f, +0.000020f} + }, + { + {+0.272901f, +0.120676f, +0.037748f, -0.000537f, +0.000024f}, + {-0.297115f, -0.254096f, -0.039956f, +0.000532f, -0.000029f}, + {+0.012561f, -0.060035f, +0.001952f, -0.000137f, -0.000057f}, + {-0.010704f, -0.021303f, -0.001694f, +0.000133f, -0.000041f}, + {+0.011296f, +0.129516f, +0.000519f, -0.000384f, +0.000049f}, + {+0.122480f, -0.073347f, +0.013051f, +0.000154f, +0.000043f}, + {-0.027641f, -0.385713f, +0.003287f, -0.000254f, +0.000026f}, + {+0.091871f, -0.289596f, +0.005177f, +0.000144f, -0.000020f}, + {-0.076925f, +0.038077f, -0.006550f, -0.000475f, -0.000017f}, + {+0.038364f, -0.096477f, +0.011620f, +0.000633f, +0.000016f}, + {-0.083812f, +0.194659f, -0.004197f, -0.000207f, -0.000021f}, + {-0.014333f, +0.322027f, +0.003857f, +0.000214f, -0.000012f}, + {+0.069724f, -0.130370f, +0.003481f, +0.000262f, +0.000055f}, + {+0.055755f, +0.063207f, +0.009924f, -0.000154f, +0.000014f}, + {+0.116659f, -0.036299f, +0.011120f, +0.000178f, -0.000028f}, + {+0.003252f, +0.097067f, -0.002843f, -0.000113f, -0.000015f} + }, + { + {+0.054050f, +0.455222f, +0.008683f, -0.000439f, -0.000087f}, + {-0.103203f, -0.556970f, -0.012926f, +0.001069f, +0.000150f}, + {-0.045598f, +0.034469f, -0.010843f, -0.000589f, +0.000024f}, + {+0.039968f, -0.100631f, +0.007931f, -0.000653f, +0.000016f}, + {+0.036140f, +0.084377f, +0.005388f, +0.000960f, -0.000048f}, + {-0.073377f, +0.218074f, -0.003890f, +0.000548f, -0.000019f}, + {-0.139694f, -0.217657f, -0.014427f, +0.001226f, -0.000017f}, + {-0.165152f, +0.096949f, -0.015920f, -0.000710f, -0.000018f}, + {+0.031303f, -0.142424f, +0.007473f, +0.002097f, +0.000008f}, + {-0.049659f, +0.036455f, -0.006360f, +0.001588f, +0.000158f}, + {+0.120231f, -0.105131f, +0.009262f, +0.000134f, -0.000029f}, + {+0.112765f, +0.136113f, +0.006454f, +0.000956f, +0.000090f}, + {-0.075212f, +0.079481f, -0.002605f, +0.000191f, +0.000013f}, + {+0.010244f, +0.133401f, +0.001533f, +0.000399f, -0.000031f}, + {-0.084844f, +0.273648f, -0.011540f, -0.000496f, +0.000003f}, + {+0.047604f, +0.022269f, +0.009154f, -0.000024f, -0.000017f} + }, + { + {-0.277495f, -0.057148f, -0.039168f, +0.000475f, -0.000017f}, + {+0.335782f, +0.115073f, +0.042124f, -0.000524f, +0.000017f}, + {-0.014669f, +0.088939f, +0.001371f, +0.000122f, +0.000060f}, + {+0.009872f, -0.151750f, -0.001271f, -0.000309f, +0.000043f}, + {-0.029086f, -0.017821f, -0.006048f, +0.000346f, -0.000049f}, + {-0.042390f, +0.261438f, -0.007011f, +0.000009f, -0.000045f}, + {+0.104924f, +0.146847f, +0.003710f, +0.000271f, -0.000026f}, + {+0.039062f, +0.403951f, +0.006577f, +0.000208f, +0.000025f}, + {+0.091871f, -0.050822f, +0.003447f, +0.000141f, +0.000018f}, + {-0.018408f, +0.085038f, -0.009119f, -0.000628f, -0.000033f}, + {-0.008166f, -0.290055f, +0.001289f, +0.000009f, +0.000025f}, + {-0.083446f, -0.145097f, -0.006817f, -0.000355f, +0.000005f}, + {+0.001946f, +0.186834f, -0.001987f, -0.000254f, -0.000062f}, + {-0.073121f, +0.003981f, -0.011768f, +0.000112f, -0.000011f}, + {-0.055297f, +0.324881f, -0.002032f, +0.000100f, +0.000030f}, + {-0.005812f, -0.063805f, -0.001869f, -0.000040f, +0.000017f} + }, + { + {-0.014583f, -0.461985f, -0.000589f, +0.000415f, +0.000084f}, + {+0.018754f, +0.598224f, +0.004168f, -0.000868f, -0.000145f}, + {+0.055019f, -0.010592f, +0.005290f, +0.000633f, -0.000030f}, + {-0.104242f, +0.017058f, -0.011823f, +0.000782f, -0.000020f}, + {+0.000800f, -0.063354f, +0.000572f, -0.000962f, +0.000051f}, + {+0.090619f, +0.057573f, +0.010215f, -0.000723f, +0.000024f}, + {+0.065017f, +0.191423f, +0.017537f, -0.001148f, +0.000017f}, + {+0.139685f, +0.247968f, +0.017011f, +0.000519f, +0.000015f}, + {-0.081755f, +0.219112f, -0.011774f, -0.001680f, -0.000011f}, + {+0.055793f, -0.030364f, +0.009245f, -0.001646f, -0.000143f}, + {-0.108310f, -0.127663f, -0.016687f, +0.000038f, +0.000024f}, + {-0.021618f, -0.220697f, -0.010039f, -0.000820f, -0.000085f}, + {+0.057142f, +0.095325f, +0.009328f, -0.000335f, -0.000006f}, + {+0.036537f, -0.167818f, +0.005791f, -0.000423f, +0.000028f}, + {+0.142336f, +0.030915f, +0.012827f, +0.000283f, -0.000005f}, + {-0.054469f, +0.008573f, -0.006883f, +0.000115f, +0.000013f} + }, + { + {+0.285346f, -0.000721f, +0.040577f, -0.000527f, +0.000010f}, + {-0.330415f, +0.056420f, -0.045563f, +0.000643f, -0.000004f}, + {-0.012995f, -0.109088f, -0.001469f, -0.000116f, -0.000061f}, + {+0.054559f, +0.256864f, +0.005920f, +0.000204f, -0.000044f}, + {+0.023615f, -0.028111f, +0.005911f, -0.000294f, +0.000047f}, + {-0.037741f, -0.135965f, +0.001385f, +0.000118f, +0.000047f}, + {-0.085123f, -0.059304f, -0.014815f, -0.000093f, +0.000026f}, + {-0.148478f, -0.190646f, -0.017151f, -0.000040f, -0.000030f}, + {-0.071070f, +0.234644f, +0.000090f, +0.000012f, -0.000018f}, + {+0.012169f, -0.103078f, +0.005526f, +0.000708f, +0.000048f}, + {+0.074830f, +0.156990f, +0.009538f, -0.000116f, -0.000028f}, + {+0.062857f, -0.082116f, +0.012816f, +0.000338f, +0.000001f}, + {-0.030566f, -0.039000f, -0.001188f, +0.000200f, +0.000068f}, + {+0.059034f, -0.139462f, +0.005767f, +0.000011f, +0.000009f}, + {-0.076286f, -0.295015f, -0.006131f, +0.000097f, -0.000032f}, + {+0.020240f, +0.124242f, +0.005046f, +0.000022f, -0.000019f} + }, + { + {-0.029891f, +0.483300f, -0.005377f, -0.000391f, -0.000081f}, + {+0.047047f, -0.524471f, +0.005924f, +0.000814f, +0.000145f}, + {-0.033704f, -0.078188f, -0.004373f, -0.000586f, +0.000038f}, + {+0.113469f, +0.163524f, +0.016393f, -0.000689f, +0.000025f}, + {-0.026484f, +0.050686f, -0.004980f, +0.000903f, -0.000054f}, + {-0.034959f, -0.130515f, -0.008100f, +0.000616f, -0.000030f}, + {-0.066335f, -0.098213f, -0.008880f, +0.001011f, -0.000017f}, + {-0.023755f, -0.374088f, -0.006475f, -0.000645f, -0.000010f}, + {+0.134342f, -0.080266f, +0.017137f, +0.001581f, +0.000017f}, + {-0.074905f, +0.029652f, -0.011288f, +0.001578f, +0.000126f}, + {+0.054496f, +0.184572f, +0.009789f, +0.000066f, -0.000019f}, + {-0.016479f, +0.037096f, +0.001911f, +0.000841f, +0.000081f}, + {-0.021095f, -0.045463f, -0.006941f, +0.000367f, -0.000005f}, + {-0.086237f, +0.078591f, -0.009216f, +0.000337f, -0.000026f}, + {-0.069456f, -0.298926f, -0.009331f, -0.000395f, +0.000009f}, + {+0.062149f, +0.062591f, +0.008033f, -0.000068f, -0.000009f} + }, + { + {-0.287720f, +0.086727f, -0.040473f, +0.000543f, -0.000002f}, + {+0.307994f, -0.118968f, +0.043852f, -0.000752f, -0.000013f}, + {+0.022546f, +0.002148f, +0.001070f, +0.000030f, +0.000061f}, + {-0.122549f, -0.198231f, -0.013063f, -0.000256f, +0.000044f}, + {-0.010325f, +0.076779f, -0.004480f, +0.000277f, -0.000045f}, + {+0.047884f, +0.004957f, +0.004446f, -0.000008f, -0.000047f}, + {+0.101276f, +0.163028f, +0.013822f, +0.000017f, -0.000028f}, + {+0.155414f, -0.094864f, +0.020739f, +0.000087f, +0.000033f}, + {+0.000170f, -0.277663f, -0.004084f, -0.000303f, +0.000013f}, + {+0.006631f, +0.159391f, -0.003115f, -0.000670f, -0.000060f}, + {-0.094163f, -0.047695f, -0.013081f, +0.000014f, +0.000031f}, + {-0.015662f, +0.033250f, -0.008826f, -0.000442f, -0.000008f}, + {+0.006909f, +0.002414f, +0.001228f, -0.000038f, -0.000070f}, + {+0.006389f, +0.219286f, -0.001425f, -0.000018f, -0.000007f}, + {+0.134427f, +0.013316f, +0.014160f, -0.000072f, +0.000032f}, + {-0.053148f, -0.113719f, -0.007802f, -0.000103f, +0.000020f} + }, + { + {+0.079885f, -0.476239f, +0.011873f, +0.000403f, +0.000078f}, + {-0.090327f, +0.495394f, -0.013216f, -0.000916f, -0.000142f}, + {+0.000547f, +0.029987f, +0.004365f, +0.000538f, -0.000045f}, + {-0.078456f, -0.260754f, -0.012403f, +0.000685f, -0.000030f}, + {+0.048231f, -0.015397f, +0.007225f, -0.000847f, +0.000058f}, + {-0.004788f, +0.088135f, -0.001735f, -0.000622f, +0.000036f}, + {+0.068597f, +0.218020f, +0.007943f, -0.001019f, +0.000017f}, + {-0.078771f, +0.264267f, -0.009097f, +0.000536f, +0.000005f}, + {-0.131816f, -0.067791f, -0.019315f, -0.001572f, -0.000023f}, + {+0.095197f, +0.024052f, +0.012511f, -0.001509f, -0.000110f}, + {-0.005662f, -0.184911f, -0.000567f, -0.000000f, +0.000014f}, + {-0.009469f, +0.021505f, -0.002081f, -0.000772f, -0.000077f}, + {+0.033042f, -0.040492f, +0.006178f, -0.000358f, +0.000017f}, + {+0.078726f, +0.109328f, +0.007889f, -0.000339f, +0.000024f}, + {-0.046322f, +0.287690f, -0.005571f, +0.000332f, -0.000013f}, + {-0.044568f, -0.127346f, -0.006458f, +0.000067f, +0.000005f} + }, + { + {+0.276202f, -0.173485f, +0.038792f, -0.000516f, -0.000006f}, + {-0.290883f, +0.185607f, -0.040080f, +0.000773f, +0.000032f}, + {+0.006320f, +0.034810f, -0.001793f, -0.000042f, -0.000058f}, + {+0.162615f, +0.113765f, +0.021156f, +0.000233f, -0.000044f}, + {-0.015723f, -0.117462f, -0.000807f, -0.000218f, +0.000042f}, + {-0.035133f, +0.040557f, -0.002714f, +0.000053f, +0.000045f}, + {-0.149176f, -0.117916f, -0.017638f, +0.000076f, +0.000032f}, + {-0.096551f, +0.235346f, -0.015008f, -0.000034f, -0.000033f}, + {+0.060894f, +0.224376f, +0.012831f, +0.000523f, -0.000005f}, + {-0.046438f, -0.197810f, -0.002809f, +0.000665f, +0.000069f}, + {+0.091389f, -0.035774f, +0.012879f, -0.000048f, -0.000034f}, + {+0.015830f, +0.061261f, +0.007852f, +0.000438f, +0.000014f}, + {+0.002026f, -0.092831f, -0.002527f, +0.000001f, +0.000068f}, + {-0.065981f, -0.109512f, -0.004136f, +0.000073f, +0.000006f}, + {-0.096454f, +0.210224f, -0.012022f, +0.000110f, -0.000032f}, + {+0.076635f, +0.057848f, +0.009841f, +0.000158f, -0.000021f} + }, + { + {-0.125058f, +0.440590f, -0.018260f, -0.000430f, -0.000074f}, + {+0.130636f, -0.461671f, +0.019013f, +0.001042f, +0.000135f}, + {-0.005358f, +0.049252f, -0.002302f, -0.000396f, +0.000051f}, + {+0.032652f, +0.314396f, +0.003878f, -0.000647f, +0.000035f}, + {-0.057782f, -0.056244f, -0.005456f, +0.000765f, -0.000061f}, + {+0.029537f, -0.058278f, +0.004239f, +0.000490f, -0.000041f}, + {-0.028429f, -0.304901f, -0.002344f, +0.001021f, -0.000019f}, + {+0.130605f, -0.114123f, +0.015550f, -0.000447f, -0.000002f}, + {+0.097618f, +0.163746f, +0.014826f, +0.001576f, +0.000024f}, + {-0.095269f, -0.125227f, -0.010570f, +0.001415f, +0.000094f}, + {-0.036826f, +0.161036f, -0.004519f, +0.000009f, -0.000008f}, + {+0.033206f, +0.037588f, +0.003181f, +0.000776f, +0.000072f}, + {-0.072280f, +0.019767f, -0.008230f, +0.000211f, -0.000025f}, + {-0.018897f, -0.179348f, -0.001641f, +0.000298f, -0.000022f}, + {+0.125361f, -0.129557f, +0.014806f, -0.000290f, +0.000016f}, + {+0.013372f, +0.152966f, +0.003485f, -0.000081f, -0.000000f} + }, + { + {-0.255232f, +0.238323f, -0.036506f, +0.000482f, +0.000012f}, + {+0.271075f, -0.243750f, +0.037165f, -0.000660f, -0.000051f}, + {-0.023107f, +0.018988f, -0.002567f, +0.000111f, +0.000056f}, + {-0.186496f, -0.022822f, -0.024016f, -0.000167f, +0.000044f}, + {+0.051695f, +0.108630f, +0.002988f, +0.000126f, -0.000040f}, + {+0.009503f, -0.085941f, +0.000815f, -0.000139f, -0.000044f}, + {+0.180203f, +0.018265f, +0.021900f, -0.000114f, -0.000036f}, + {+0.016842f, -0.287897f, +0.004711f, +0.000063f, +0.000033f}, + {-0.099412f, -0.136019f, -0.018932f, -0.000549f, -0.000004f}, + {+0.093434f, +0.165866f, +0.008284f, -0.000735f, -0.000077f}, + {-0.070607f, +0.107384f, -0.011250f, +0.000036f, +0.000037f}, + {-0.051205f, -0.088169f, -0.009120f, -0.000422f, -0.000021f}, + {+0.038077f, +0.190808f, +0.007278f, -0.000071f, -0.000066f}, + {+0.068484f, -0.044857f, +0.006706f, -0.000103f, -0.000005f}, + {+0.001471f, -0.319381f, +0.000965f, -0.000110f, +0.000032f}, + {-0.082910f, +0.001623f, -0.012705f, -0.000176f, +0.000021f} + }, + { + {+0.160937f, -0.399834f, +0.024221f, +0.000432f, +0.000069f}, + {-0.165837f, +0.426649f, -0.024449f, -0.001120f, -0.000123f}, + {+0.023251f, -0.053963f, +0.006296f, +0.000280f, -0.000056f}, + {+0.026012f, -0.349222f, +0.003958f, +0.000583f, -0.000040f}, + {+0.039815f, +0.122590f, +0.005933f, -0.000681f, +0.000065f}, + {-0.034180f, -0.017407f, -0.005868f, -0.000354f, +0.000044f}, + {-0.036119f, +0.354110f, -0.007651f, -0.001004f, +0.000024f}, + {-0.131608f, -0.060108f, -0.015438f, +0.000373f, +0.000002f}, + {-0.047240f, -0.215086f, -0.007922f, -0.001603f, -0.000021f}, + {+0.065165f, +0.208130f, +0.007649f, -0.001302f, -0.000078f}, + {+0.065730f, -0.103768f, +0.008899f, +0.000008f, +0.000000f}, + {-0.017223f, -0.140007f, -0.001227f, -0.000774f, -0.000066f}, + {+0.083700f, +0.123118f, +0.007692f, -0.000085f, +0.000029f}, + {-0.033766f, +0.111436f, -0.004405f, -0.000238f, +0.000019f}, + {-0.130713f, -0.118837f, -0.014005f, +0.000285f, -0.000018f}, + {+0.016465f, -0.154956f, +0.002867f, +0.000097f, -0.000004f} + }, + { + {+0.233948f, -0.286085f, +0.033289f, -0.000467f, -0.000018f}, + {-0.251749f, +0.291487f, -0.034882f, +0.000530f, +0.000064f}, + {+0.025018f, -0.051984f, +0.002062f, -0.000213f, -0.000058f}, + {+0.182278f, -0.109310f, +0.023310f, +0.000129f, -0.000046f}, + {-0.065186f, -0.041803f, -0.007285f, -0.000055f, +0.000040f}, + {+0.015347f, +0.057135f, +0.002287f, +0.000244f, +0.000046f}, + {-0.178612f, +0.136904f, -0.019882f, +0.000114f, +0.000039f}, + {+0.053858f, +0.222770f, +0.004143f, -0.000170f, -0.000036f}, + {+0.110687f, +0.021864f, +0.019313f, +0.000540f, +0.000009f}, + {-0.120059f, -0.080527f, -0.013286f, +0.000793f, +0.000086f}, + {+0.042102f, -0.139525f, +0.007143f, +0.000010f, -0.000040f}, + {+0.075712f, -0.002196f, +0.010631f, +0.000380f, +0.000025f}, + {-0.101650f, -0.158974f, -0.013076f, +0.000245f, +0.000069f}, + {-0.030059f, +0.115541f, -0.003547f, +0.000111f, +0.000004f}, + {+0.094721f, +0.222768f, +0.008889f, +0.000048f, -0.000033f}, + {+0.083573f, -0.053860f, +0.010877f, +0.000192f, -0.000022f} + }, + { + {-0.194975f, +0.371746f, -0.029687f, -0.000407f, -0.000065f}, + {+0.199395f, -0.402227f, +0.030381f, +0.001070f, +0.000111f}, + {-0.043558f, +0.051835f, -0.007510f, -0.000301f, +0.000063f}, + {-0.080069f, +0.290708f, -0.009721f, -0.000585f, +0.000048f}, + {-0.028118f, -0.096712f, -0.004235f, +0.000661f, -0.000071f}, + {+0.020670f, +0.048284f, +0.004447f, +0.000361f, -0.000049f}, + {+0.106751f, -0.298076f, +0.013906f, +0.000980f, -0.000031f}, + {+0.091450f, +0.162172f, +0.012475f, -0.000348f, -0.000002f}, + {-0.007498f, +0.199756f, +0.002586f, +0.001500f, +0.000016f}, + {-0.027250f, -0.222848f, -0.002393f, +0.001277f, +0.000059f}, + {-0.083457f, +0.055583f, -0.011895f, -0.000049f, +0.000010f}, + {-0.023912f, +0.145973f, -0.001523f, +0.000736f, +0.000060f}, + {-0.039347f, -0.252351f, -0.003368f, +0.000088f, -0.000034f}, + {+0.047081f, -0.002879f, +0.005773f, +0.000201f, -0.000016f}, + {+0.061353f, +0.270295f, +0.008425f, -0.000276f, +0.000021f}, + {-0.056743f, +0.162677f, -0.007387f, -0.000128f, +0.000010f} + }, + { + {-0.209644f, +0.348707f, -0.029121f, +0.000472f, +0.000023f}, + {+0.234739f, -0.346303f, +0.031613f, -0.000452f, -0.000075f}, + {-0.012221f, +0.097631f, -0.001448f, +0.000286f, +0.000064f}, + {-0.151155f, +0.176475f, -0.021969f, -0.000127f, +0.000048f}, + {+0.074908f, +0.067483f, +0.011111f, +0.000037f, -0.000040f}, + {-0.024868f, -0.020084f, -0.003583f, -0.000348f, -0.000052f}, + {+0.132213f, -0.252477f, +0.017287f, -0.000139f, -0.000041f}, + {-0.086895f, -0.114633f, -0.010835f, +0.000242f, +0.000044f}, + {-0.087061f, +0.080457f, -0.017193f, -0.000553f, -0.000009f}, + {+0.128529f, +0.021349f, +0.015609f, -0.000805f, -0.000095f}, + {-0.009730f, +0.170684f, -0.001530f, -0.000070f, +0.000041f}, + {-0.063989f, +0.082569f, -0.011861f, -0.000327f, -0.000027f}, + {+0.131743f, +0.010936f, +0.017709f, -0.000376f, -0.000079f}, + {-0.009127f, -0.086499f, -0.000601f, -0.000142f, -0.000005f}, + {-0.128048f, -0.022758f, -0.015753f, -0.000038f, +0.000035f}, + {-0.059404f, +0.160944f, -0.006871f, -0.000228f, +0.000022f} + }, + { + {+0.229440f, -0.322824f, +0.033988f, +0.000389f, +0.000061f}, + {-0.240846f, +0.383749f, -0.036120f, -0.000976f, -0.000103f}, + {+0.056585f, -0.008789f, +0.009971f, +0.000419f, -0.000080f}, + {+0.105118f, -0.219752f, +0.015610f, +0.000635f, -0.000061f}, + {+0.026805f, +0.145169f, +0.000897f, -0.000699f, +0.000083f}, + {-0.004898f, -0.050127f, -0.002984f, -0.000479f, +0.000062f}, + {-0.141946f, +0.172154f, -0.021221f, -0.000916f, +0.000039f}, + {-0.048244f, -0.174628f, -0.006354f, +0.000456f, -0.000003f}, + {+0.037664f, -0.109078f, +0.001169f, -0.001297f, -0.000015f}, + {-0.006723f, +0.230147f, -0.003197f, -0.001300f, -0.000034f}, + {+0.095384f, +0.009012f, +0.012879f, +0.000031f, -0.000023f}, + {+0.048765f, -0.092236f, +0.006693f, -0.000674f, -0.000056f}, + {-0.024712f, +0.249773f, -0.004585f, -0.000253f, +0.000048f}, + {-0.029610f, -0.053064f, -0.004978f, -0.000209f, +0.000011f}, + {+0.020111f, -0.251548f, +0.002558f, +0.000313f, -0.000027f}, + {+0.088864f, -0.064651f, +0.009687f, +0.000147f, -0.000018f} + }, + { + {+0.175493f, -0.403144f, +0.024964f, -0.000494f, -0.000029f}, + {-0.208289f, +0.431823f, -0.027399f, +0.000496f, +0.000086f}, + {-0.008906f, -0.108845f, -0.001685f, -0.000188f, -0.000067f}, + {+0.127825f, -0.183453f, +0.018081f, +0.000198f, -0.000048f}, + {-0.107325f, -0.060873f, -0.013159f, -0.000090f, +0.000038f}, + {+0.020607f, -0.012217f, +0.003265f, +0.000308f, +0.000058f}, + {-0.079060f, +0.266458f, -0.009775f, +0.000157f, +0.000041f}, + {+0.096681f, +0.050055f, +0.012663f, -0.000225f, -0.000055f}, + {+0.051411f, -0.089715f, +0.013539f, +0.000663f, +0.000008f}, + {-0.129678f, +0.037696f, -0.015815f, +0.000703f, +0.000099f}, + {-0.037248f, -0.197082f, -0.005086f, +0.000193f, -0.000037f}, + {+0.043816f, -0.101985f, +0.008254f, +0.000336f, +0.000028f}, + {-0.117065f, +0.106956f, -0.016478f, +0.000283f, +0.000091f}, + {+0.024549f, +0.029471f, +0.003315f, +0.000242f, +0.000008f}, + {+0.102968f, -0.125147f, +0.012245f, +0.000115f, -0.000038f}, + {+0.007500f, -0.187296f, +0.002430f, +0.000314f, -0.000019f} + }, + { + {-0.255049f, +0.256577f, -0.038217f, -0.000401f, -0.000056f}, + {+0.286340f, -0.326727f, +0.042071f, +0.000948f, +0.000098f}, + {-0.058758f, -0.032715f, -0.010103f, -0.000506f, +0.000109f}, + {-0.123738f, +0.204736f, -0.019030f, -0.000624f, +0.000081f}, + {+0.004658f, -0.232611f, +0.002627f, +0.000673f, -0.000101f}, + {-0.001246f, +0.020482f, +0.002726f, +0.000581f, -0.000087f}, + {+0.149860f, -0.087638f, +0.023219f, +0.000836f, -0.000049f}, + {+0.011705f, +0.182241f, +0.000824f, -0.000663f, +0.000015f}, + {-0.036322f, +0.046246f, -0.002434f, +0.001110f, +0.000020f}, + {+0.041445f, -0.225060f, +0.008066f, +0.001247f, +0.000002f}, + {-0.082241f, -0.130716f, -0.009581f, +0.000052f, +0.000037f}, + {-0.061982f, +0.060921f, -0.008434f, +0.000587f, +0.000055f}, + {+0.070313f, -0.179626f, +0.010580f, +0.000496f, -0.000079f}, + {+0.010271f, +0.049933f, +0.003107f, +0.000216f, -0.000007f}, + {-0.072320f, +0.142479f, -0.007956f, -0.000403f, +0.000037f}, + {-0.080097f, -0.050215f, -0.010237f, -0.000128f, +0.000027f} + }, + { + {-0.138659f, +0.433413f, -0.019489f, +0.000507f, +0.000036f}, + {+0.163451f, -0.512532f, +0.021259f, -0.000613f, -0.000105f}, + {+0.031656f, +0.104824f, +0.003994f, -0.000128f, +0.000059f}, + {-0.110770f, +0.224024f, -0.015294f, -0.000397f, +0.000039f}, + {+0.125629f, -0.045496f, +0.015544f, +0.000259f, -0.000027f}, + {-0.013056f, +0.002303f, -0.002874f, -0.000034f, -0.000053f}, + {+0.034706f, -0.263278f, +0.003483f, -0.000141f, -0.000039f}, + {-0.095465f, +0.017678f, -0.011595f, +0.000132f, +0.000064f}, + {-0.033817f, +0.054176f, -0.010428f, -0.000890f, -0.000012f}, + {+0.119869f, -0.100206f, +0.015399f, -0.000474f, -0.000091f}, + {+0.083578f, +0.121580f, +0.008601f, -0.000327f, +0.000026f}, + {-0.021962f, +0.124782f, -0.004983f, -0.000417f, -0.000031f}, + {+0.081591f, -0.160439f, +0.012843f, +0.000024f, -0.000092f}, + {-0.025765f, -0.006872f, -0.004893f, -0.000318f, -0.000015f}, + {-0.048404f, +0.176242f, -0.007439f, -0.000200f, +0.000038f}, + {+0.029349f, +0.118206f, +0.002646f, -0.000434f, +0.000011f} + }, + { + {+0.273332f, -0.197278f, +0.041000f, +0.000427f, +0.000049f}, + {-0.321458f, +0.231555f, -0.047137f, -0.001083f, -0.000091f}, + {+0.051312f, +0.073576f, +0.009852f, +0.000350f, -0.000146f}, + {+0.149316f, -0.177043f, +0.022631f, +0.000468f, -0.000104f}, + {-0.053207f, +0.228176f, -0.008455f, -0.000505f, +0.000122f}, + {-0.006068f, -0.008715f, -0.003223f, -0.000482f, +0.000122f}, + {-0.145901f, +0.015682f, -0.022924f, -0.000759f, +0.000061f}, + {+0.021739f, -0.160951f, +0.002760f, +0.000739f, -0.000036f}, + {+0.029254f, -0.044035f, +0.001822f, -0.001067f, -0.000028f}, + {-0.071428f, +0.194582f, -0.013164f, -0.000987f, +0.000034f}, + {+0.035270f, +0.192622f, +0.005952f, -0.000220f, -0.000050f}, + {+0.068773f, -0.014813f, +0.009109f, -0.000533f, -0.000056f}, + {-0.089870f, +0.103512f, -0.014502f, -0.000459f, +0.000122f}, + {+0.001775f, -0.051927f, +0.000206f, -0.000272f, +0.000005f}, + {+0.077868f, -0.020072f, +0.010512f, +0.000382f, -0.000051f}, + {+0.053027f, +0.078728f, +0.007627f, +0.000029f, -0.000036f} + }, + { + {+0.101834f, -0.458014f, +0.014426f, -0.000475f, -0.000042f}, + {-0.106819f, +0.558024f, -0.013421f, +0.000683f, +0.000132f}, + {-0.052912f, -0.088899f, -0.008225f, +0.000491f, -0.000027f}, + {+0.083094f, -0.280030f, +0.010300f, +0.000632f, -0.000016f}, + {-0.114197f, +0.131784f, -0.014954f, -0.000412f, +0.000002f}, + {+0.019246f, +0.031443f, +0.004356f, -0.000329f, +0.000027f}, + {+0.005316f, +0.248103f, +0.002960f, +0.000118f, +0.000033f}, + {+0.080531f, -0.067083f, +0.011460f, +0.000110f, -0.000064f}, + {+0.031144f, -0.046782f, +0.008670f, +0.001209f, +0.000024f}, + {-0.102756f, +0.143879f, -0.013003f, +0.000283f, +0.000065f}, + {-0.095015f, -0.011155f, -0.012207f, +0.000367f, -0.000008f}, + {-0.004913f, -0.131661f, +0.000343f, +0.000524f, +0.000039f}, + {-0.046459f, +0.170846f, -0.007777f, -0.000479f, +0.000069f}, + {+0.027234f, -0.016428f, +0.003165f, +0.000304f, +0.000026f}, + {+0.005481f, -0.131071f, +0.001565f, +0.000318f, -0.000030f}, + {-0.043474f, -0.073298f, -0.006440f, +0.000550f, +0.000003f} + }, + { + {-0.286640f, +0.137246f, -0.043420f, -0.000432f, -0.000040f}, + {+0.340199f, -0.128020f, +0.049926f, +0.001339f, +0.000072f}, + {-0.035997f, -0.119831f, -0.005662f, +0.000296f, +0.000179f}, + {-0.172429f, +0.110349f, -0.024201f, -0.000100f, +0.000122f}, + {+0.092373f, -0.185204f, +0.014035f, +0.000067f, -0.000138f}, + {+0.010912f, +0.048983f, +0.001816f, -0.000075f, -0.000154f}, + {+0.129079f, +0.059883f, +0.019833f, +0.000637f, -0.000073f}, + {-0.041407f, +0.122204f, -0.006834f, -0.000592f, +0.000062f}, + {-0.030715f, +0.048574f, -0.001376f, +0.001126f, +0.000032f}, + {+0.096213f, -0.160581f, +0.016571f, +0.000370f, -0.000063f}, + {+0.010051f, -0.173763f, +0.000750f, +0.000501f, +0.000056f}, + {-0.062657f, -0.045986f, -0.006800f, +0.000608f, +0.000057f}, + {+0.093242f, -0.041300f, +0.014445f, -0.000123f, -0.000165f}, + {-0.019827f, +0.053398f, -0.000412f, +0.000436f, -0.000009f}, + {-0.057687f, -0.032809f, -0.008352f, -0.000201f, +0.000065f}, + {-0.029198f, -0.096300f, -0.002960f, +0.000112f, +0.000041f} + }, + { + {-0.065817f, +0.474129f, -0.008963f, +0.000406f, +0.000046f}, + {+0.048357f, -0.572445f, +0.005311f, -0.000514f, -0.000163f}, + {+0.075398f, +0.048030f, +0.008271f, -0.000640f, -0.000031f}, + {-0.038405f, +0.313945f, -0.005856f, -0.000669f, -0.000022f}, + {+0.086028f, -0.192206f, +0.012072f, +0.000418f, +0.000038f}, + {-0.040227f, -0.025362f, -0.003912f, +0.000532f, +0.000024f}, + {-0.038209f, -0.193928f, -0.006045f, -0.000139f, -0.000021f}, + {-0.067018f, +0.081277f, -0.009330f, -0.000374f, +0.000051f}, + {-0.028904f, +0.056950f, -0.007486f, -0.001345f, -0.000045f}, + {+0.078983f, -0.183476f, +0.010913f, -0.000304f, -0.000020f}, + {+0.083563f, -0.058421f, +0.010558f, -0.000255f, -0.000015f}, + {+0.030882f, +0.097232f, +0.001515f, -0.000622f, -0.000053f}, + {+0.015685f, -0.158569f, +0.005189f, +0.000820f, -0.000018f}, + {-0.013899f, +0.061952f, -0.002806f, -0.000268f, -0.000038f}, + {+0.012586f, +0.075138f, +0.001144f, -0.000413f, +0.000015f}, + {+0.050911f, +0.027618f, +0.006661f, -0.000507f, -0.000023f} + }, + { + {+0.298262f, -0.083362f, +0.045235f, +0.000350f, +0.000028f}, + {-0.345899f, +0.033997f, -0.051595f, -0.001615f, -0.000035f}, + {-0.000119f, +0.165002f, +0.002953f, -0.001311f, -0.000187f}, + {+0.171388f, -0.008423f, +0.025114f, -0.000464f, -0.000125f}, + {-0.115274f, +0.117327f, -0.017963f, +0.000487f, +0.000138f}, + {+0.008614f, -0.100535f, -0.001469f, +0.001024f, +0.000165f}, + {-0.096130f, -0.104542f, -0.016843f, -0.000419f, +0.000082f}, + {+0.057723f, -0.112429f, +0.010191f, +0.000184f, -0.000084f}, + {+0.036341f, -0.043085f, +0.001450f, -0.001349f, -0.000025f}, + {-0.112953f, +0.110523f, -0.019836f, +0.000405f, +0.000071f}, + {-0.043415f, +0.138944f, -0.005951f, -0.000778f, -0.000051f}, + {+0.038181f, +0.085067f, +0.005138f, -0.000773f, -0.000051f}, + {-0.082623f, -0.007927f, -0.014925f, +0.001161f, +0.000188f}, + {+0.027034f, -0.000974f, +0.001645f, -0.000490f, +0.000020f}, + {+0.035360f, +0.038752f, +0.006345f, -0.000067f, -0.000073f}, + {+0.000083f, +0.105539f, -0.000772f, -0.000317f, -0.000036f} + }, + { + {+0.027126f, -0.497380f, +0.003317f, -0.000351f, -0.000045f}, + {+0.007859f, +0.574645f, +0.003243f, +0.000139f, +0.000188f}, + {-0.075777f, +0.049221f, -0.008353f, -0.000117f, +0.000106f}, + {-0.000094f, -0.270760f, +0.000675f, +0.000190f, +0.000068f}, + {-0.052764f, +0.211602f, -0.007618f, +0.000144f, -0.000084f}, + {+0.046479f, -0.043520f, +0.004619f, +0.000085f, -0.000093f}, + {+0.048000f, +0.115677f, +0.008039f, +0.000243f, +0.000005f}, + {+0.053119f, -0.119462f, +0.006689f, +0.000259f, -0.000024f}, + {+0.023530f, -0.067795f, +0.006354f, +0.001215f, +0.000069f}, + {-0.051960f, +0.201931f, -0.007334f, +0.001040f, -0.000035f}, + {-0.061094f, +0.110021f, -0.007462f, -0.000103f, +0.000039f}, + {-0.036876f, -0.032412f, -0.003266f, +0.000534f, +0.000070f}, + {+0.001902f, +0.122288f, -0.002472f, -0.000241f, -0.000056f}, + {-0.004270f, -0.048829f, +0.000734f, +0.000014f, +0.000048f}, + {-0.012745f, -0.036706f, -0.002273f, +0.000205f, +0.000006f}, + {-0.042314f, +0.038832f, -0.005804f, +0.000347f, +0.000043f} + }, + { + {-0.307088f, +0.013827f, -0.046648f, -0.000063f, -0.000017f}, + {+0.343985f, +0.057778f, +0.051999f, +0.001370f, -0.000021f}, + {+0.039378f, -0.130507f, -0.000123f, +0.002505f, +0.000156f}, + {-0.152973f, -0.035960f, -0.024197f, +0.000907f, +0.000105f}, + {+0.122328f, -0.057169f, +0.020503f, -0.000916f, -0.000113f}, + {-0.036115f, +0.084847f, +0.000437f, -0.002283f, -0.000139f}, + {+0.065884f, +0.089825f, +0.012704f, +0.000253f, -0.000086f}, + {-0.076176f, +0.079461f, -0.013926f, +0.000844f, +0.000095f}, + {-0.041886f, +0.032735f, -0.001798f, +0.001521f, +0.000002f}, + {+0.120605f, -0.060574f, +0.022209f, -0.000951f, -0.000049f}, + {+0.065666f, -0.088077f, +0.009755f, +0.000580f, +0.000035f}, + {-0.014536f, -0.066997f, -0.002290f, +0.001040f, +0.000035f}, + {+0.069578f, +0.020859f, +0.015775f, -0.002732f, -0.000173f}, + {-0.018357f, -0.025356f, -0.001559f, +0.000309f, -0.000039f}, + {-0.021973f, -0.023763f, -0.004557f, +0.000507f, +0.000072f}, + {+0.024594f, -0.064613f, +0.005019f, +0.000113f, +0.000019f} + }, + { + {+0.017452f, +0.509103f, +0.002330f, +0.000354f, +0.000040f}, + {-0.065401f, -0.568079f, -0.010528f, +0.000542f, -0.000194f}, + {+0.050175f, -0.114107f, +0.005162f, +0.003266f, -0.000174f}, + {+0.018374f, +0.227727f, +0.003630f, +0.001902f, -0.000110f}, + {+0.023543f, -0.209166f, +0.002096f, -0.002246f, +0.000125f}, + {-0.031298f, +0.092434f, -0.002541f, -0.002737f, +0.000158f}, + {-0.039294f, -0.069055f, -0.007101f, -0.000802f, +0.000015f}, + {-0.027981f, +0.151965f, -0.004965f, +0.000568f, -0.000008f}, + {-0.016092f, +0.076462f, -0.004970f, -0.000449f, -0.000085f}, + {+0.025683f, -0.205232f, +0.002533f, -0.003878f, +0.000082f}, + {+0.031489f, -0.139294f, +0.004565f, +0.001598f, -0.000056f}, + {+0.026207f, -0.002872f, +0.002107f, -0.000154f, -0.000084f}, + {-0.008497f, -0.098826f, +0.002487f, -0.002569f, +0.000130f}, + {+0.010858f, +0.022687f, +0.002492f, +0.000762f, -0.000051f}, + {+0.007112f, +0.019771f, +0.000809f, +0.000752f, -0.000028f}, + {+0.017429f, -0.074807f, +0.003855f, +0.000473f, -0.000058f} + } +}; + +const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= +{ + { + {-0.132965f, +0.086484f, +0.111577f, -0.006297f, -0.000146f}, + {+0.159214f, -0.438495f, +0.131837f, +0.004567f, +0.000134f}, + {-0.006365f, -0.027154f, +0.040068f, -0.008136f, +0.000115f}, + {-0.012177f, +0.011068f, +0.006759f, -0.003623f, +0.000106f}, + {+0.003524f, -0.002365f, +0.008243f, -0.002720f, -0.000173f}, + {-0.001684f, +0.006593f, +0.024280f, -0.012226f, -0.000133f}, + {+0.003794f, -0.002370f, +0.013706f, -0.004985f, -0.000191f}, + {+0.009569f, -0.049227f, +0.045250f, -0.003942f, -0.000006f}, + {-0.015413f, +0.062027f, -0.005814f, -0.010696f, -0.000183f}, + {+0.012650f, -0.030376f, -0.022293f, +0.005058f, +0.000424f}, + {-0.003808f, +0.011707f, +0.008010f, -0.002270f, -0.000068f}, + {+0.003343f, -0.012704f, -0.014571f, +0.003409f, +0.000255f}, + {+0.000428f, +0.007434f, +0.003549f, -0.001445f, +0.000011f}, + {-0.006298f, +0.029469f, -0.007911f, +0.000838f, -0.000089f}, + {-0.003358f, +0.002973f, +0.012948f, -0.001507f, +0.000003f}, + {-0.000168f, +0.002647f, +0.005935f, -0.001295f, -0.000063f} + }, + { + {+0.075202f, +0.228858f, +0.021577f, -0.002573f, -0.000120f}, + {-0.061927f, -0.923113f, +0.018254f, +0.003553f, +0.000135f}, + {+0.002952f, -0.050194f, +0.020301f, -0.000013f, +0.000082f}, + {+0.008722f, +0.019708f, -0.013956f, +0.001282f, +0.000072f}, + {-0.001425f, -0.021365f, +0.019206f, +0.005433f, -0.000123f}, + {+0.004675f, +0.040742f, +0.087083f, +0.008021f, -0.000087f}, + {-0.001220f, -0.034662f, +0.025115f, +0.004561f, -0.000118f}, + {-0.004799f, -0.049232f, +0.074542f, +0.003362f, -0.000003f}, + {+0.011236f, +0.040604f, -0.010517f, +0.002046f, -0.000098f}, + {-0.006435f, -0.139253f, -0.070542f, +0.004148f, +0.000297f}, + {+0.001842f, +0.052892f, +0.056325f, +0.005942f, -0.000046f}, + {-0.004364f, -0.052115f, -0.019067f, +0.000398f, +0.000179f}, + {+0.003644f, +0.037489f, +0.030067f, +0.000286f, +0.000000f}, + {+0.000279f, +0.074681f, +0.035692f, +0.005433f, -0.000065f}, + {+0.001702f, +0.024063f, +0.022013f, +0.000449f, +0.000009f}, + {+0.001629f, +0.004730f, -0.001402f, -0.003756f, -0.000041f} + }, + { + {-0.022776f, +0.213361f, +0.033702f, +0.017530f, +0.000169f}, + {-0.017318f, -0.757708f, -0.032772f, -0.023486f, -0.000150f}, + {-0.000995f, +0.005778f, -0.039399f, +0.003826f, -0.000133f}, + {-0.001086f, +0.066855f, -0.049052f, -0.001880f, -0.000124f}, + {-0.003861f, -0.074613f, +0.059871f, -0.001275f, +0.000202f}, + {-0.004218f, +0.001879f, +0.134238f, +0.000831f, +0.000156f}, + {-0.007011f, -0.156373f, +0.120347f, +0.000348f, +0.000228f}, + {+0.001557f, +0.050757f, -0.023560f, -0.002558f, +0.000008f}, + {-0.014029f, -0.230152f, +0.192472f, +0.009207f, +0.000223f}, + {-0.003304f, -0.293531f, +0.162769f, -0.029563f, -0.000502f}, + {+0.000187f, +0.025533f, +0.089914f, -0.003071f, +0.000081f}, + {+0.001118f, -0.199397f, +0.178948f, -0.009074f, -0.000301f}, + {-0.002128f, +0.041497f, +0.024472f, -0.001412f, -0.000017f}, + {+0.001502f, +0.027123f, +0.081159f, -0.005992f, +0.000104f}, + {+0.000493f, +0.080670f, -0.051505f, -0.003323f, -0.000001f}, + {-0.001770f, +0.022371f, -0.053147f, +0.009257f, +0.000076f} + }, + { + {+0.009638f, -0.020599f, -0.278274f, -0.025390f, +0.000089f}, + {+0.019638f, -0.173586f, +0.454125f, +0.045073f, -0.000138f}, + {+0.001861f, +0.029237f, -0.038358f, -0.002128f, -0.000043f}, + {-0.006025f, +0.060820f, -0.033037f, +0.001020f, -0.000030f}, + {+0.010927f, -0.114232f, -0.022410f, -0.002610f, +0.000063f}, + {+0.001151f, -0.065308f, +0.047475f, -0.003953f, +0.000033f}, + {+0.017565f, -0.230160f, -0.003612f, +0.002199f, +0.000030f}, + {-0.002909f, +0.050062f, -0.035205f, +0.001706f, -0.000001f}, + {+0.028618f, -0.411400f, -0.073259f, -0.001960f, -0.000006f}, + {+0.012397f, -0.141388f, +0.368076f, +0.043941f, -0.000144f}, + {-0.000613f, -0.027917f, +0.038807f, -0.005057f, +0.000020f}, + {+0.005278f, -0.064856f, +0.339877f, +0.008614f, -0.000087f}, + {-0.003908f, -0.015797f, -0.023962f, +0.003729f, +0.000013f}, + {+0.002822f, -0.051424f, +0.011636f, +0.000447f, +0.000037f}, + {-0.001743f, -0.007517f, -0.130092f, +0.010670f, -0.000017f}, + {+0.001199f, -0.016221f, -0.122288f, -0.007685f, +0.000014f} + }, + { + {-0.029178f, -0.030294f, -0.242046f, +0.016235f, -0.000187f}, + {+0.008133f, +0.216891f, +0.173004f, -0.046339f, +0.000186f}, + {-0.004784f, +0.011306f, -0.001565f, +0.002974f, +0.000133f}, + {+0.001643f, -0.028149f, +0.058358f, +0.006461f, +0.000122f}, + {-0.012719f, +0.054617f, -0.162135f, -0.005430f, -0.000206f}, + {-0.004192f, +0.016864f, -0.049221f, -0.004060f, -0.000152f}, + {-0.017065f, +0.041944f, -0.209787f, -0.017496f, -0.000221f}, + {+0.005651f, -0.007117f, +0.010168f, -0.000370f, -0.000010f}, + {-0.040832f, +0.087605f, -0.438294f, -0.024557f, -0.000208f}, + {-0.015743f, +0.224869f, +0.116394f, -0.024045f, +0.000521f}, + {+0.000520f, -0.017676f, +0.001703f, +0.007076f, -0.000085f}, + {-0.005864f, +0.108940f, +0.176379f, +0.006190f, +0.000311f}, + {+0.004834f, -0.026630f, -0.021079f, -0.003057f, +0.000018f}, + {-0.003714f, -0.006337f, -0.039785f, +0.000713f, -0.000108f}, + {+0.003235f, -0.035740f, -0.081406f, -0.014616f, +0.000003f}, + {-0.000931f, -0.029194f, -0.104837f, -0.000498f, -0.000077f} + }, + { + {+0.064069f, +0.415122f, +0.053438f, -0.001987f, -0.000053f}, + {-0.009859f, -0.329919f, -0.267131f, +0.025972f, +0.000125f}, + {+0.007782f, +0.093625f, +0.062218f, -0.005519f, +0.000007f}, + {+0.006679f, +0.087174f, +0.140907f, -0.012343f, -0.000007f}, + {+0.009694f, +0.066480f, -0.161387f, +0.014778f, -0.000006f}, + {+0.011976f, +0.007185f, -0.079605f, +0.010521f, +0.000016f}, + {+0.000557f, +0.101449f, -0.157518f, +0.024682f, +0.000050f}, + {-0.008085f, -0.037335f, +0.019864f, -0.001614f, +0.000006f}, + {+0.030203f, +0.393848f, -0.238529f, +0.036570f, +0.000098f}, + {+0.011087f, +0.102790f, -0.079859f, +0.000351f, -0.000008f}, + {-0.001584f, -0.009914f, -0.007779f, -0.002067f, +0.000006f}, + {-0.003353f, +0.001777f, -0.008005f, -0.013355f, -0.000003f}, + {-0.003172f, -0.008210f, +0.010652f, +0.000223f, -0.000027f}, + {-0.001325f, -0.010307f, -0.051607f, +0.003067f, -0.000008f}, + {-0.010253f, -0.010690f, +0.002393f, +0.009426f, +0.000023f}, + {-0.002525f, +0.029747f, -0.022901f, +0.004832f, +0.000012f} + }, + { + {-0.046682f, +0.646468f, +0.038502f, -0.000394f, +0.000197f}, + {-0.044970f, -0.559290f, -0.057727f, -0.008886f, -0.000233f}, + {+0.000940f, +0.137203f, +0.026727f, +0.004536f, -0.000119f}, + {+0.021842f, +0.212599f, -0.004934f, +0.008826f, -0.000104f}, + {-0.023556f, -0.052508f, +0.021029f, -0.010719f, +0.000188f}, + {-0.008092f, +0.004951f, -0.027003f, -0.006766f, +0.000127f}, + {+0.010424f, -0.025150f, +0.006816f, -0.012676f, +0.000176f}, + {+0.012013f, -0.064462f, +0.013618f, +0.002713f, +0.000010f}, + {+0.003530f, +0.310311f, -0.011616f, -0.019741f, +0.000148f}, + {-0.004678f, +0.016958f, -0.018438f, -0.001910f, -0.000484f}, + {+0.001327f, -0.004928f, -0.011742f, -0.001214f, +0.000078f}, + {+0.013688f, -0.047967f, -0.031851f, +0.002524f, -0.000286f}, + {+0.008554f, -0.003502f, +0.000653f, +0.000953f, -0.000012f}, + {+0.001110f, -0.052143f, -0.004967f, -0.003628f, +0.000102f}, + {+0.024328f, -0.026559f, +0.000732f, -0.001055f, -0.000010f}, + {+0.007177f, -0.017435f, +0.026024f, -0.001281f, +0.000068f} + }, + { + {-0.091452f, +0.552905f, -0.002702f, -0.003959f, +0.000011f}, + {+0.151251f, -0.284723f, +0.015522f, +0.005073f, -0.000086f}, + {-0.028691f, +0.087255f, -0.003554f, -0.001461f, +0.000017f}, + {-0.098620f, +0.103367f, -0.000693f, -0.001510f, +0.000032f}, + {+0.064701f, -0.012013f, +0.004462f, +0.000173f, -0.000038f}, + {-0.014183f, +0.018557f, +0.019481f, +0.000708f, -0.000046f}, + {+0.006021f, -0.064708f, +0.035867f, -0.001201f, -0.000101f}, + {-0.011933f, -0.098741f, -0.004801f, -0.001237f, -0.000012f}, + {-0.036700f, +0.201775f, +0.040310f, -0.000652f, -0.000152f}, + {+0.005765f, -0.013682f, -0.000873f, +0.007110f, +0.000136f}, + {+0.003019f, +0.012643f, +0.006120f, +0.000396f, -0.000028f}, + {-0.011018f, -0.079111f, -0.001161f, +0.005334f, +0.000076f}, + {-0.015223f, -0.010103f, +0.018116f, -0.000552f, +0.000040f}, + {+0.010935f, -0.049744f, +0.004931f, +0.000250f, -0.000016f}, + {-0.032242f, -0.086323f, +0.005558f, -0.001593f, -0.000026f}, + {+0.000743f, -0.058299f, -0.001218f, -0.002067f, -0.000032f} + }, + { + {+0.231005f, +0.048404f, +0.009154f, +0.001498f, -0.000196f}, + {-0.192280f, +0.252895f, +0.010481f, -0.000333f, +0.000272f}, + {+0.043883f, -0.025510f, -0.003790f, -0.000402f, +0.000097f}, + {+0.135351f, -0.212029f, -0.009492f, -0.001960f, +0.000078f}, + {-0.084125f, +0.181115f, +0.006598f, +0.003510f, -0.000156f}, + {+0.033552f, -0.023473f, +0.003836f, +0.001049f, -0.000092f}, + {-0.027732f, +0.007669f, +0.004823f, +0.004147f, -0.000114f}, + {-0.005511f, -0.108447f, -0.007469f, -0.001175f, -0.000008f}, + {+0.049262f, +0.093379f, +0.014337f, +0.006176f, -0.000066f}, + {-0.011588f, +0.007485f, +0.021418f, +0.002195f, +0.000406f}, + {-0.004828f, +0.034802f, -0.002483f, +0.000357f, -0.000065f}, + {-0.010126f, -0.088145f, +0.024313f, +0.000561f, +0.000239f}, + {+0.009822f, -0.024986f, +0.000140f, +0.000383f, +0.000001f}, + {-0.022780f, -0.006413f, +0.006349f, +0.001513f, -0.000089f}, + {+0.014962f, -0.135165f, -0.012780f, -0.000522f, +0.000019f}, + {-0.023635f, -0.027393f, -0.008518f, +0.000542f, -0.000051f} + }, + { + {-0.129287f, -0.488427f, -0.015298f, +0.003330f, +0.000032f}, + {+0.025480f, +0.578744f, +0.004928f, -0.005728f, +0.000021f}, + {-0.001654f, -0.098586f, -0.003334f, +0.000763f, -0.000028f}, + {-0.033875f, -0.443496f, +0.008037f, +0.001296f, -0.000041f}, + {+0.018947f, +0.326335f, -0.012624f, -0.000806f, +0.000063f}, + {-0.025064f, -0.093936f, -0.002533f, -0.000591f, +0.000056f}, + {+0.010694f, +0.085378f, -0.009219f, -0.001445f, +0.000116f}, + {+0.036700f, -0.055426f, -0.001721f, +0.001199f, +0.000016f}, + {-0.043110f, -0.003684f, -0.012692f, -0.002555f, +0.000160f}, + {+0.008512f, +0.041967f, -0.005268f, -0.006560f, -0.000223f}, + {-0.005601f, +0.039303f, -0.001728f, +0.000112f, +0.000044f}, + {+0.035999f, -0.034895f, -0.002757f, -0.004270f, -0.000123f}, + {+0.002203f, -0.033200f, -0.001100f, -0.000045f, -0.000048f}, + {+0.016721f, +0.047214f, -0.004075f, -0.000550f, +0.000032f}, + {+0.021446f, -0.110159f, +0.004884f, +0.001124f, +0.000025f}, + {+0.032915f, +0.061006f, +0.000313f, +0.001075f, +0.000044f} + }, + { + {-0.165686f, -0.410109f, -0.015586f, -0.000896f, +0.000182f}, + {+0.225295f, +0.253817f, +0.010634f, +0.001216f, -0.000288f}, + {-0.066393f, -0.000376f, -0.002622f, -0.000038f, -0.000077f}, + {-0.130423f, -0.277756f, -0.010288f, +0.000606f, -0.000054f}, + {+0.089464f, +0.200814f, +0.007558f, -0.001360f, +0.000121f}, + {-0.004322f, -0.115904f, -0.010769f, -0.000324f, +0.000060f}, + {+0.034499f, +0.049740f, -0.008222f, -0.001335f, +0.000055f}, + {-0.046786f, +0.057680f, +0.004042f, +0.000640f, +0.000003f}, + {+0.024894f, -0.095189f, -0.014289f, -0.002426f, -0.000011f}, + {+0.005629f, +0.034211f, -0.013115f, -0.002185f, -0.000307f}, + {+0.019520f, +0.005119f, -0.001636f, -0.000261f, +0.000048f}, + {-0.038933f, +0.062477f, -0.011725f, -0.001017f, -0.000182f}, + {-0.005035f, -0.021514f, -0.003233f, -0.000466f, +0.000014f}, + {+0.007389f, +0.053217f, -0.000456f, -0.000398f, +0.000072f}, + {-0.037733f, -0.010531f, -0.003329f, +0.000340f, -0.000027f}, + {-0.003757f, +0.111811f, +0.004737f, -0.000075f, +0.000033f} + }, + { + {+0.245533f, +0.226873f, +0.035259f, -0.002770f, -0.000070f}, + {-0.206677f, -0.408421f, -0.026814f, +0.005082f, +0.000056f}, + {+0.053751f, +0.188303f, +0.009769f, -0.000688f, +0.000029f}, + {+0.149357f, +0.154463f, +0.013417f, -0.001098f, +0.000037f}, + {-0.105083f, -0.109018f, -0.007715f, +0.000799f, -0.000072f}, + {+0.025793f, -0.064751f, +0.005742f, +0.000924f, -0.000050f}, + {-0.041996f, -0.072003f, +0.001334f, +0.001959f, -0.000101f}, + {+0.008234f, +0.134619f, -0.001439f, -0.000932f, -0.000019f}, + {+0.007939f, -0.128639f, +0.012917f, +0.003363f, -0.000130f}, + {-0.013715f, -0.007050f, -0.000167f, +0.004932f, +0.000266f}, + {-0.012412f, -0.040469f, +0.000036f, +0.000063f, -0.000052f}, + {+0.005607f, +0.122490f, +0.001069f, +0.003166f, +0.000145f}, + {+0.002475f, -0.010103f, -0.001112f, +0.000172f, +0.000049f}, + {-0.026992f, -0.004924f, -0.001965f, +0.000301f, -0.000041f}, + {+0.008412f, +0.067378f, +0.003334f, -0.000633f, -0.000020f}, + {-0.034796f, +0.054935f, -0.005935f, -0.000590f, -0.000048f} + }, + { + {+0.049172f, +0.518027f, +0.003115f, +0.000335f, -0.000156f}, + {-0.120618f, -0.519623f, -0.008479f, -0.000432f, +0.000270f}, + {+0.062888f, +0.179664f, -0.000296f, +0.000157f, +0.000063f}, + {+0.019992f, +0.341262f, +0.002080f, -0.000355f, +0.000037f}, + {-0.012267f, -0.246756f, +0.001889f, +0.000730f, -0.000091f}, + {-0.028297f, +0.020937f, +0.002730f, +0.000026f, -0.000039f}, + {-0.008636f, -0.121054f, +0.007814f, +0.000720f, -0.000014f}, + {+0.046484f, +0.071961f, +0.002387f, -0.000455f, +0.000002f}, + {-0.042652f, -0.042219f, +0.005353f, +0.001621f, +0.000061f}, + {+0.003781f, -0.030870f, +0.013170f, +0.002144f, +0.000211f}, + {-0.016747f, -0.033277f, -0.000186f, +0.000012f, -0.000031f}, + {+0.038322f, +0.079239f, +0.009485f, +0.001067f, +0.000129f}, + {-0.009213f, +0.006178f, +0.001082f, +0.000202f, -0.000029f}, + {+0.017679f, -0.071909f, +0.003357f, +0.000147f, -0.000056f}, + {+0.031925f, +0.035422f, +0.000231f, -0.000251f, +0.000032f}, + {+0.027629f, -0.047451f, +0.003771f, -0.000092f, -0.000016f} + }, + { + {-0.277356f, +0.009713f, -0.040871f, +0.002128f, +0.000098f}, + {+0.288048f, +0.119309f, +0.040772f, -0.004167f, -0.000126f}, + {-0.135614f, -0.121199f, -0.015970f, +0.000584f, -0.000025f}, + {-0.147900f, +0.068278f, -0.021757f, +0.001011f, -0.000028f}, + {+0.111155f, -0.046512f, +0.012782f, -0.000892f, +0.000069f}, + {+0.020452f, +0.099912f, +0.003632f, -0.000896f, +0.000036f}, + {+0.051789f, -0.026841f, -0.000416f, -0.002061f, +0.000070f}, + {-0.048315f, -0.075067f, -0.004473f, +0.000718f, +0.000020f}, + {+0.038466f, +0.097321f, -0.002604f, -0.003632f, +0.000080f}, + {+0.012250f, -0.014195f, -0.001656f, -0.003568f, -0.000272f}, + {+0.029260f, +0.036443f, +0.002521f, -0.000109f, +0.000054f}, + {-0.049141f, -0.042766f, -0.002001f, -0.002307f, -0.000147f}, + {+0.016365f, +0.045379f, +0.003479f, +0.000052f, -0.000044f}, + {+0.016380f, -0.068248f, +0.002419f, -0.000284f, +0.000043f}, + {-0.026309f, -0.049393f, -0.000660f, +0.000389f, +0.000012f}, + {+0.020013f, -0.061398f, +0.001390f, +0.000285f, +0.000045f} + }, + { + {+0.056395f, -0.497410f, +0.010462f, +0.000112f, +0.000123f}, + {-0.008278f, +0.564708f, -0.007533f, -0.000534f, -0.000224f}, + {+0.029776f, -0.375504f, +0.009908f, -0.000167f, -0.000056f}, + {+0.053843f, -0.247636f, +0.011973f, +0.000305f, -0.000030f}, + {-0.047919f, +0.200610f, -0.011974f, -0.000485f, +0.000070f}, + {+0.001747f, +0.136529f, -0.008548f, +0.000030f, +0.000031f}, + {-0.034659f, +0.098248f, -0.009286f, -0.000733f, -0.000004f}, + {-0.013390f, -0.125590f, +0.000347f, +0.000408f, -0.000006f}, + {+0.018416f, +0.125823f, -0.010099f, -0.001587f, -0.000079f}, + {-0.015670f, +0.020509f, -0.010455f, -0.001886f, -0.000130f}, + {+0.001269f, +0.078191f, -0.000719f, +0.000060f, +0.000015f}, + {+0.015954f, -0.139586f, -0.005155f, -0.000966f, -0.000087f}, + {-0.000690f, +0.074979f, -0.002970f, -0.000046f, +0.000040f}, + {-0.036315f, +0.016998f, -0.007922f, -0.000063f, +0.000042f}, + {-0.017947f, -0.053543f, -0.003628f, +0.000169f, -0.000034f}, + {-0.036250f, +0.025051f, -0.004463f, +0.000134f, +0.000003f} + }, + { + {+0.261565f, -0.175456f, +0.039964f, -0.001605f, -0.000112f}, + {-0.289123f, +0.124032f, -0.042209f, +0.003292f, +0.000173f}, + {+0.147448f, -0.202794f, +0.013343f, -0.000451f, +0.000021f}, + {+0.111431f, -0.158046f, +0.014055f, -0.000866f, +0.000018f}, + {-0.088516f, +0.135597f, -0.008911f, +0.000941f, -0.000062f}, + {-0.046542f, +0.074771f, +0.001267f, +0.000681f, -0.000024f}, + {-0.008851f, +0.134457f, +0.003904f, +0.001907f, -0.000040f}, + {+0.057725f, -0.011782f, +0.007446f, -0.000690f, -0.000019f}, + {-0.064453f, -0.009485f, -0.001505f, +0.003482f, -0.000032f}, + {+0.003750f, +0.043297f, +0.001696f, +0.002710f, +0.000254f}, + {-0.036881f, +0.019154f, -0.003756f, +0.000164f, -0.000052f}, + {+0.028484f, -0.127049f, +0.000373f, +0.001785f, +0.000137f}, + {-0.030494f, +0.034591f, -0.002192f, -0.000165f, +0.000035f}, + {+0.009470f, +0.091778f, +0.004810f, +0.000325f, -0.000042f}, + {+0.029100f, +0.027840f, +0.006520f, -0.000311f, -0.000006f}, + {-0.009135f, +0.066628f, -0.000798f, -0.000116f, -0.000038f} + }, + { + {-0.134646f, +0.431836f, -0.022252f, -0.000261f, -0.000089f}, + {+0.108773f, -0.480556f, +0.020213f, +0.000915f, +0.000164f}, + {-0.157283f, +0.252511f, -0.017953f, +0.000158f, +0.000053f}, + {-0.096912f, +0.162399f, -0.016830f, -0.000259f, +0.000029f}, + {+0.094935f, -0.145981f, +0.017427f, +0.000284f, -0.000058f}, + {+0.078691f, -0.105220f, +0.009040f, +0.000009f, -0.000031f}, + {+0.032041f, +0.084421f, +0.004353f, +0.000773f, +0.000002f}, + {-0.016068f, +0.102075f, -0.005241f, -0.000269f, +0.000010f}, + {+0.027628f, -0.144744f, +0.013233f, +0.001492f, +0.000070f}, + {+0.013497f, +0.033838f, +0.009244f, +0.001447f, +0.000073f}, + {+0.020163f, -0.066780f, +0.002771f, -0.000069f, -0.000003f}, + {-0.051113f, -0.013125f, +0.004746f, +0.000733f, +0.000056f}, + {+0.038408f, -0.068407f, +0.004887f, -0.000113f, -0.000046f}, + {+0.039739f, +0.052992f, +0.003676f, -0.000005f, -0.000032f}, + {+0.019468f, +0.046585f, -0.000417f, -0.000092f, +0.000032f}, + {+0.046026f, -0.019351f, +0.006238f, -0.000147f, +0.000005f} + }, + { + {-0.227969f, +0.284525f, -0.035118f, +0.001170f, +0.000113f}, + {+0.251619f, -0.250783f, +0.039635f, -0.002380f, -0.000192f}, + {-0.028234f, +0.444181f, -0.004258f, +0.000378f, -0.000019f}, + {-0.057970f, +0.223549f, -0.006095f, +0.000655f, -0.000012f}, + {+0.039868f, -0.230386f, +0.002246f, -0.000818f, +0.000054f}, + {-0.036223f, -0.280336f, -0.007555f, -0.000539f, +0.000017f}, + {-0.045995f, -0.019070f, -0.002489f, -0.001639f, +0.000020f}, + {-0.058114f, +0.032997f, -0.008873f, +0.000662f, +0.000018f}, + {+0.053231f, -0.094713f, +0.003411f, -0.002983f, -0.000000f}, + {-0.022768f, -0.016336f, -0.003117f, -0.002216f, -0.000227f}, + {+0.031511f, -0.045619f, +0.004901f, -0.000227f, +0.000048f}, + {+0.045006f, +0.127523f, +0.002107f, -0.001382f, -0.000124f}, + {-0.004533f, -0.139114f, -0.003073f, +0.000203f, -0.000026f}, + {-0.046710f, -0.071863f, -0.004169f, -0.000343f, +0.000040f}, + {-0.053226f, -0.067429f, -0.008363f, +0.000293f, +0.000001f}, + {-0.008131f, -0.104415f, -0.002326f, +0.000063f, +0.000032f} + }, + { + {+0.193626f, -0.362707f, +0.031027f, +0.000215f, +0.000061f}, + {-0.168437f, +0.394610f, -0.030765f, -0.000832f, -0.000106f}, + {+0.166845f, +0.150839f, +0.019333f, -0.000239f, -0.000053f}, + {+0.108632f, -0.026149f, +0.014836f, +0.000210f, -0.000033f}, + {-0.117845f, +0.006812f, -0.017402f, -0.000161f, +0.000052f}, + {-0.070459f, -0.240877f, -0.004084f, +0.000089f, +0.000035f}, + {+0.051571f, -0.166446f, +0.000272f, -0.000594f, +0.000009f}, + {+0.048610f, -0.137567f, +0.012351f, +0.000122f, -0.000012f}, + {-0.060459f, +0.077161f, -0.017457f, -0.001202f, -0.000048f}, + {+0.008901f, -0.071218f, -0.004889f, -0.001056f, -0.000035f}, + {-0.035581f, +0.061262f, -0.007127f, +0.000111f, -0.000006f}, + {-0.009360f, +0.207644f, -0.007254f, -0.000645f, -0.000037f}, + {-0.043066f, -0.091054f, -0.000390f, +0.000159f, +0.000048f}, + {-0.006722f, -0.129159f, -0.003572f, +0.000128f, +0.000025f}, + {+0.002648f, -0.158951f, +0.005371f, +0.000083f, -0.000030f}, + {-0.052294f, -0.037930f, -0.006102f, +0.000171f, -0.000010f} + }, + { + {+0.185388f, -0.373945f, +0.028242f, -0.000870f, -0.000107f}, + {-0.218466f, +0.313607f, -0.033711f, +0.001650f, +0.000187f}, + {-0.089184f, -0.227856f, -0.003013f, -0.000234f, +0.000019f}, + {-0.005910f, -0.195725f, +0.001490f, -0.000426f, +0.000010f}, + {+0.033058f, +0.233100f, +0.003881f, +0.000583f, -0.000049f}, + {+0.128077f, +0.046310f, +0.008240f, +0.000349f, -0.000015f}, + {+0.004052f, -0.247839f, -0.003163f, +0.001295f, -0.000012f}, + {+0.052459f, -0.138631f, +0.002655f, -0.000517f, -0.000018f}, + {-0.024548f, +0.123596f, -0.001667f, +0.002422f, +0.000013f}, + {+0.026309f, -0.052058f, +0.001607f, +0.001982f, +0.000202f}, + {-0.029154f, +0.072410f, -0.002905f, +0.000210f, -0.000043f}, + {-0.051381f, +0.149021f, +0.000115f, +0.001232f, +0.000111f}, + {+0.060324f, +0.057180f, +0.002547f, -0.000144f, +0.000020f}, + {+0.052887f, -0.036634f, +0.006886f, +0.000170f, -0.000037f}, + {+0.075539f, -0.053066f, +0.006319f, -0.000332f, +0.000001f}, + {+0.036656f, +0.098177f, +0.004589f, -0.000133f, -0.000026f} + }, + { + {-0.239844f, +0.276952f, -0.036663f, -0.000075f, -0.000041f}, + {+0.218935f, -0.356480f, +0.037109f, +0.000536f, +0.000063f}, + {-0.067555f, -0.247328f, -0.016085f, +0.000198f, +0.000054f}, + {-0.065557f, -0.103844f, -0.011325f, -0.000270f, +0.000037f}, + {+0.082669f, +0.157628f, +0.013419f, +0.000257f, -0.000050f}, + {-0.051102f, +0.310690f, -0.001856f, -0.000105f, -0.000038f}, + {-0.105915f, -0.086143f, -0.002835f, +0.000369f, -0.000019f}, + {-0.108427f, +0.103999f, -0.015274f, -0.000237f, +0.000014f}, + {+0.072751f, -0.025221f, +0.019360f, +0.000835f, +0.000029f}, + {-0.042856f, +0.056448f, +0.001929f, +0.000741f, +0.000011f}, + {+0.068206f, -0.080584f, +0.011613f, -0.000093f, +0.000013f}, + {+0.091336f, -0.056612f, +0.010772f, +0.000543f, +0.000024f}, + {-0.026414f, +0.186526f, -0.002964f, -0.000133f, -0.000049f}, + {-0.024927f, +0.082144f, -0.001315f, +0.000035f, -0.000020f}, + {-0.062843f, +0.155369f, -0.009444f, -0.000091f, +0.000028f}, + {+0.038812f, +0.095103f, +0.003754f, -0.000076f, +0.000012f} + }, + { + {-0.131680f, +0.440943f, -0.020891f, +0.000627f, +0.000098f}, + {+0.183833f, -0.406966f, +0.027778f, -0.001207f, -0.000171f}, + {+0.086183f, -0.003067f, +0.012386f, +0.000168f, -0.000020f}, + {+0.026332f, +0.035398f, +0.002657f, +0.000383f, -0.000011f}, + {-0.076464f, -0.083380f, -0.010071f, -0.000597f, +0.000047f}, + {-0.086834f, +0.252931f, -0.010256f, -0.000250f, +0.000016f}, + {+0.112579f, +0.244861f, +0.011209f, -0.001100f, +0.000012f}, + {+0.018202f, +0.300605f, +0.006408f, +0.000602f, +0.000018f}, + {-0.003044f, -0.137405f, -0.002719f, -0.002137f, -0.000013f}, + {+0.003641f, +0.131818f, +0.001737f, -0.001737f, -0.000181f}, + {-0.001297f, -0.195950f, -0.005713f, -0.000204f, +0.000037f}, + {-0.045795f, -0.259231f, -0.005407f, -0.001178f, -0.000100f}, + {-0.039454f, +0.170156f, -0.000777f, +0.000115f, -0.000018f}, + {-0.040004f, +0.055755f, -0.008185f, -0.000317f, +0.000034f}, + {-0.043921f, +0.182226f, -0.005163f, +0.000395f, -0.000002f}, + {-0.058367f, -0.053246f, -0.007857f, +0.000065f, +0.000022f} + }, + { + {+0.266519f, -0.168414f, +0.039980f, +0.000112f, +0.000029f}, + {-0.270044f, +0.288912f, -0.044466f, -0.000374f, -0.000037f}, + {+0.013148f, +0.108379f, +0.008696f, -0.000082f, -0.000056f}, + {+0.007547f, +0.066767f, +0.004336f, +0.000293f, -0.000040f}, + {-0.013959f, -0.178267f, -0.007930f, -0.000231f, +0.000050f}, + {+0.126652f, -0.073753f, +0.010940f, +0.000032f, +0.000041f}, + {+0.037971f, +0.357198f, -0.003626f, -0.000116f, +0.000025f}, + {+0.123814f, +0.144678f, +0.015962f, +0.000194f, -0.000018f}, + {-0.073603f, -0.033162f, -0.018399f, -0.000381f, -0.000019f}, + {+0.052463f, +0.055986f, -0.001868f, -0.000682f, +0.000008f}, + {-0.099011f, -0.055743f, -0.009504f, +0.000033f, -0.000019f}, + {-0.066616f, -0.234328f, -0.006904f, -0.000399f, -0.000016f}, + {+0.081064f, -0.004874f, +0.003489f, +0.000036f, +0.000052f}, + {+0.044214f, -0.078007f, +0.004257f, +0.000035f, +0.000016f}, + {+0.107368f, -0.054956f, +0.018386f, -0.000009f, -0.000028f}, + {-0.008996f, -0.126597f, -0.002978f, +0.000081f, -0.000014f} + }, + { + {+0.076584f, -0.456777f, +0.013253f, -0.000677f, -0.000090f}, + {-0.135714f, +0.493797f, -0.019817f, +0.001205f, +0.000155f}, + {-0.049801f, +0.003798f, -0.009316f, -0.000287f, +0.000022f}, + {+0.008289f, +0.072460f, +0.002582f, -0.000487f, +0.000014f}, + {+0.058361f, -0.066933f, +0.007899f, +0.000705f, -0.000047f}, + {-0.024939f, -0.304082f, -0.002238f, +0.000320f, -0.000018f}, + {-0.164640f, +0.054259f, -0.014251f, +0.000972f, -0.000016f}, + {-0.129320f, -0.239583f, -0.014072f, -0.000614f, -0.000019f}, + {+0.023151f, +0.107790f, +0.002402f, +0.001999f, +0.000009f}, + {-0.042244f, -0.087154f, -0.004003f, +0.001651f, +0.000165f}, + {+0.087421f, +0.223827f, +0.009440f, +0.000302f, -0.000032f}, + {+0.123261f, +0.040927f, +0.008130f, +0.001094f, +0.000093f}, + {-0.047678f, -0.191325f, -0.003834f, -0.000119f, +0.000015f}, + {+0.025350f, -0.109559f, +0.002027f, +0.000400f, -0.000032f}, + {-0.031404f, -0.277712f, -0.007376f, -0.000280f, +0.000002f}, + {+0.054594f, -0.026570f, +0.007177f, +0.000010f, -0.000018f} + }, + { + {-0.274121f, +0.081952f, -0.043113f, -0.000004f, -0.000021f}, + {+0.317778f, -0.199223f, +0.049734f, +0.000202f, +0.000022f}, + {-0.015529f, -0.058172f, -0.001453f, +0.000253f, +0.000058f}, + {+0.020112f, +0.056461f, -0.003930f, -0.000113f, +0.000042f}, + {-0.027311f, +0.065956f, +0.001130f, -0.000048f, -0.000049f}, + {-0.092570f, -0.201332f, -0.007025f, -0.000092f, -0.000044f}, + {+0.078874f, -0.299423f, +0.007522f, +0.000058f, -0.000026f}, + {-0.031803f, -0.392121f, -0.002719f, +0.000010f, +0.000023f}, + {+0.078295f, +0.019932f, +0.020674f, +0.000126f, +0.000017f}, + {-0.029291f, -0.096155f, -0.000322f, +0.000490f, -0.000025f}, + {+0.042190f, +0.292546f, +0.004474f, -0.000130f, +0.000023f}, + {-0.047310f, +0.289378f, +0.003082f, +0.000264f, +0.000009f}, + {-0.036042f, -0.202365f, -0.005972f, -0.000021f, -0.000059f}, + {-0.067032f, +0.032496f, -0.007059f, -0.000199f, -0.000013f}, + {-0.101204f, -0.185795f, -0.005848f, +0.000042f, +0.000029f}, + {-0.006759f, +0.066549f, -0.000681f, -0.000136f, +0.000016f} + }, + { + {-0.033486f, +0.450867f, -0.006565f, +0.000576f, +0.000085f}, + {+0.061876f, -0.590080f, +0.009764f, -0.001166f, -0.000147f}, + {+0.051215f, +0.040728f, +0.006725f, +0.000135f, -0.000027f}, + {-0.075886f, -0.090288f, -0.009577f, +0.000383f, -0.000018f}, + {-0.015185f, +0.082124f, -0.005184f, -0.000502f, +0.000049f}, + {+0.096327f, +0.079550f, +0.006514f, -0.000328f, +0.000021f}, + {+0.097424f, -0.250345f, +0.019698f, -0.001078f, +0.000017f}, + {+0.169040f, -0.091237f, +0.017597f, +0.000283f, +0.000017f}, + {-0.049945f, -0.183685f, -0.013171f, -0.002034f, -0.000009f}, + {+0.051580f, +0.036720f, +0.010126f, -0.001380f, -0.000151f}, + {-0.125504f, +0.039269f, -0.013578f, -0.000208f, +0.000027f}, + {-0.070511f, +0.247836f, -0.009393f, -0.000912f, -0.000087f}, + {+0.075408f, -0.033832f, +0.006471f, +0.000223f, -0.000010f}, + {+0.010281f, +0.155017f, +0.004289f, -0.000279f, +0.000029f}, + {+0.128761f, +0.151968f, +0.010917f, +0.000111f, -0.000004f}, + {-0.047805f, -0.002840f, -0.010782f, -0.000029f, +0.000015f} + }, + { + {+0.280158f, -0.030000f, +0.043460f, +0.000075f, +0.000014f}, + {-0.336614f, +0.016258f, -0.050302f, -0.000297f, -0.000011f}, + {+0.002372f, +0.120514f, -0.000413f, -0.000319f, -0.000061f}, + {+0.016063f, -0.229902f, +0.006035f, +0.000097f, -0.000043f}, + {+0.028633f, +0.007390f, +0.002007f, +0.000039f, +0.000048f}, + {-0.005134f, +0.220494f, +0.003892f, +0.000252f, +0.000046f}, + {-0.096636f, +0.051599f, -0.015635f, +0.000127f, +0.000026f}, + {-0.105407f, +0.323356f, -0.007410f, +0.000133f, -0.000028f}, + {-0.087018f, -0.141885f, -0.014985f, +0.000005f, -0.000018f}, + {+0.018235f, +0.085003f, -0.002078f, -0.000390f, +0.000041f}, + {+0.049559f, -0.222425f, +0.001760f, +0.000043f, -0.000027f}, + {+0.087658f, +0.008493f, +0.002149f, -0.000327f, -0.000002f}, + {-0.025991f, +0.110117f, +0.002501f, +0.000106f, +0.000066f}, + {+0.073066f, +0.062410f, +0.006753f, +0.000139f, +0.000010f}, + {-0.012343f, +0.361812f, +0.000879f, +0.000019f, -0.000031f}, + {+0.008849f, -0.097553f, +0.003670f, +0.000140f, -0.000018f} + }, + { + {-0.006954f, -0.470379f, -0.000165f, -0.000551f, -0.000082f}, + {+0.019214f, +0.554319f, -0.001599f, +0.001129f, +0.000145f}, + {-0.050232f, +0.045555f, -0.004649f, -0.000015f, +0.000034f}, + {+0.117286f, -0.075343f, +0.011788f, -0.000390f, +0.000023f}, + {-0.013982f, -0.062149f, -0.000689f, +0.000526f, -0.000053f}, + {-0.064167f, +0.122065f, -0.007764f, +0.000174f, -0.000027f}, + {-0.057456f, +0.102739f, -0.012482f, +0.000929f, -0.000017f}, + {-0.086303f, +0.350740f, -0.008732f, -0.000319f, -0.000013f}, + {+0.114468f, +0.156124f, +0.012352f, +0.002008f, +0.000014f}, + {-0.063324f, -0.045704f, -0.011079f, +0.001189f, +0.000135f}, + {+0.081653f, -0.167815f, +0.010699f, +0.000264f, -0.000021f}, + {-0.009546f, -0.130825f, +0.003286f, +0.000952f, +0.000083f}, + {-0.034292f, +0.088622f, -0.006613f, -0.000382f, +0.000000f}, + {-0.064658f, -0.148003f, -0.007951f, +0.000319f, -0.000027f}, + {-0.118973f, +0.200930f, -0.010476f, -0.000078f, +0.000007f}, + {+0.061648f, -0.019855f, +0.007486f, +0.000045f, -0.000011f} + }, + { + {-0.287193f, -0.042900f, -0.042884f, -0.000074f, -0.000006f}, + {+0.316269f, +0.095647f, +0.050717f, +0.000419f, -0.000004f}, + {+0.024609f, -0.065464f, -0.001044f, +0.000352f, +0.000061f}, + {-0.090934f, +0.238549f, -0.014249f, -0.000001f, +0.000044f}, + {-0.019808f, -0.051257f, +0.001165f, -0.000156f, -0.000046f}, + {+0.048333f, -0.050030f, +0.007461f, -0.000269f, -0.000047f}, + {+0.082327f, -0.120302f, +0.020222f, -0.000034f, -0.000027f}, + {+0.165448f, -0.034472f, +0.017814f, +0.000021f, +0.000032f}, + {+0.033316f, +0.280356f, +0.011492f, -0.000020f, +0.000016f}, + {-0.008225f, -0.128802f, +0.005400f, +0.000223f, -0.000054f}, + {-0.088609f, +0.096391f, -0.012066f, -0.000087f, +0.000030f}, + {-0.036267f, -0.078389f, -0.005104f, +0.000176f, -0.000004f}, + {+0.020864f, +0.001946f, +0.003538f, -0.000159f, -0.000070f}, + {-0.031397f, -0.200648f, -0.000765f, -0.000186f, -0.000008f}, + {+0.119879f, -0.159775f, +0.011369f, +0.000002f, +0.000032f}, + {-0.036654f, +0.129414f, -0.004412f, -0.000114f, +0.000020f} + }, + { + {+0.055358f, +0.480776f, +0.007156f, +0.000440f, +0.000080f}, + {-0.069696f, -0.497403f, -0.009705f, -0.000945f, -0.000144f}, + {+0.014636f, -0.076742f, +0.003268f, +0.000063f, -0.000042f}, + {-0.098616f, +0.221987f, -0.012598f, +0.000348f, -0.000027f}, + {+0.038012f, +0.038810f, +0.004148f, -0.000514f, +0.000056f}, + {+0.010993f, -0.104517f, +0.004208f, -0.000219f, +0.000033f}, + {+0.073401f, -0.141057f, +0.006526f, -0.000916f, +0.000016f}, + {-0.033949f, -0.336614f, -0.001600f, +0.000255f, +0.000007f}, + {-0.139291f, +0.017101f, -0.017309f, -0.001860f, -0.000021f}, + {+0.085604f, +0.017452f, +0.013308f, -0.001048f, -0.000118f}, + {-0.029028f, +0.187952f, -0.005021f, -0.000216f, +0.000016f}, + {+0.006564f, -0.006493f, +0.001419f, -0.000780f, -0.000079f}, + {+0.020490f, +0.003411f, +0.006133f, +0.000307f, +0.000011f}, + {+0.091616f, -0.016927f, +0.008786f, -0.000287f, +0.000025f}, + {+0.009844f, -0.323610f, +0.003492f, +0.000078f, -0.000011f}, + {-0.056286f, +0.097814f, -0.006882f, -0.000079f, +0.000007f} + }, + { + {+0.282827f, +0.133300f, +0.042549f, +0.000086f, -0.000002f}, + {-0.297764f, -0.151816f, -0.046261f, -0.000499f, +0.000022f}, + {-0.010547f, -0.035236f, +0.000498f, -0.000494f, -0.000059f}, + {+0.144406f, -0.152441f, +0.023633f, -0.000028f, -0.000044f}, + {+0.000542f, +0.094714f, -0.004019f, +0.000229f, +0.000043f}, + {-0.041461f, -0.019853f, -0.008957f, +0.000418f, +0.000046f}, + {-0.123943f, +0.154058f, -0.020412f, +0.000069f, +0.000030f}, + {-0.130914f, -0.179670f, -0.017352f, -0.000111f, -0.000033f}, + {+0.036620f, -0.258117f, -0.000481f, +0.000034f, -0.000009f}, + {-0.021657f, +0.180451f, -0.009924f, -0.000053f, +0.000065f}, + {+0.095197f, -0.006584f, +0.013724f, +0.000061f, -0.000032f}, + {+0.011099f, -0.015338f, +0.000599f, -0.000168f, +0.000011f}, + {+0.002807f, +0.034719f, -0.003109f, +0.000353f, +0.000070f}, + {-0.041276f, +0.181885f, -0.005275f, +0.000201f, +0.000007f}, + {-0.125301f, -0.110921f, -0.015164f, -0.000039f, -0.000032f}, + {+0.066993f, -0.092159f, +0.009251f, +0.000136f, -0.000021f} + }, + { + {-0.104112f, -0.458657f, -0.013927f, -0.000353f, -0.000076f}, + {+0.111390f, +0.472799f, +0.015450f, +0.000704f, +0.000139f}, + {+0.000873f, -0.019121f, -0.001169f, -0.000093f, +0.000048f}, + {+0.056615f, -0.285336f, +0.007942f, -0.000391f, +0.000032f}, + {-0.055650f, +0.007065f, -0.007223f, +0.000546f, -0.000060f}, + {+0.018845f, +0.077039f, +0.001923f, +0.000256f, -0.000039f}, + {-0.051977f, +0.260211f, -0.006687f, +0.000819f, -0.000018f}, + {+0.110604f, +0.197201f, +0.015009f, -0.000259f, -0.000003f}, + {+0.118052f, -0.135388f, +0.015667f, +0.001612f, +0.000024f}, + {-0.098237f, +0.061993f, -0.014872f, +0.000974f, +0.000101f}, + {-0.016600f, -0.180900f, -0.001935f, +0.000217f, -0.000011f}, + {+0.024890f, +0.001895f, +0.000719f, +0.000667f, +0.000075f}, + {-0.052001f, -0.047705f, -0.008689f, -0.000203f, -0.000021f}, + {-0.051423f, +0.163687f, -0.007750f, +0.000277f, -0.000023f}, + {+0.092904f, +0.226447f, +0.010447f, -0.000087f, +0.000014f}, + {+0.029788f, -0.148840f, +0.003437f, +0.000063f, -0.000002f} + }, + { + {-0.265513f, -0.211642f, -0.040584f, -0.000055f, +0.000009f}, + {+0.279427f, +0.216928f, +0.044464f, +0.000461f, -0.000042f}, + {-0.017280f, +0.004077f, -0.001930f, +0.000533f, +0.000057f}, + {-0.175703f, +0.073912f, -0.028215f, +0.000106f, +0.000044f}, + {+0.032929f, -0.127864f, +0.007891f, -0.000307f, -0.000041f}, + {+0.023458f, +0.073855f, +0.003516f, -0.000521f, -0.000044f}, + {+0.165507f, -0.073413f, +0.027506f, -0.000119f, -0.000034f}, + {+0.058760f, +0.277549f, +0.005732f, +0.000115f, +0.000033f}, + {-0.086524f, +0.185360f, -0.006494f, -0.000114f, +0.000000f}, + {+0.068563f, -0.191058f, +0.014677f, -0.000094f, -0.000073f}, + {-0.083271f, -0.077777f, -0.010978f, -0.000035f, +0.000035f}, + {-0.032739f, +0.090968f, -0.003108f, +0.000130f, -0.000018f}, + {+0.012042f, -0.148829f, +0.005352f, -0.000453f, -0.000067f}, + {+0.074068f, -0.028523f, +0.009472f, -0.000233f, -0.000006f}, + {+0.054178f, +0.286348f, +0.004315f, +0.000011f, +0.000032f}, + {-0.081317f, +0.023039f, -0.011622f, -0.000155f, +0.000021f} + }, + { + {+0.144447f, +0.416258f, +0.019880f, +0.000298f, +0.000071f}, + {-0.149133f, -0.438088f, -0.020811f, -0.000535f, -0.000129f}, + {+0.015049f, +0.049287f, -0.000123f, +0.000146f, -0.000053f}, + {-0.004923f, +0.337598f, +0.000454f, +0.000368f, -0.000037f}, + {+0.051157f, -0.099533f, +0.006353f, -0.000530f, +0.000063f}, + {-0.036114f, -0.015276f, -0.002183f, -0.000257f, +0.000042f}, + {-0.001423f, -0.329473f, -0.000629f, -0.000758f, +0.000021f}, + {-0.137836f, -0.026570f, -0.019057f, +0.000357f, +0.000002f}, + {-0.074813f, +0.206610f, -0.009222f, -0.001398f, -0.000023f}, + {+0.082213f, -0.168162f, +0.013202f, -0.000891f, -0.000086f}, + {+0.053436f, +0.133406f, +0.007060f, -0.000274f, +0.000004f}, + {-0.031202f, +0.097339f, -0.000600f, -0.000565f, -0.000069f}, + {+0.084087f, -0.042545f, +0.010288f, +0.000114f, +0.000027f}, + {-0.011630f, -0.156396f, +0.002102f, -0.000281f, +0.000021f}, + {-0.139327f, -0.009640f, -0.015858f, +0.000166f, -0.000017f}, + {+0.001227f, +0.149601f, +0.000552f, -0.000041f, -0.000002f} + }, + { + {+0.243657f, +0.264257f, +0.037689f, -0.000001f, -0.000015f}, + {-0.259444f, -0.270037f, -0.041639f, -0.000297f, +0.000058f}, + {+0.024732f, +0.031819f, +0.004944f, -0.000508f, -0.000056f}, + {+0.188302f, +0.043036f, +0.027818f, -0.000121f, -0.000045f}, + {-0.061013f, +0.068025f, -0.009284f, +0.000332f, +0.000040f}, + {+0.005481f, -0.077635f, -0.001849f, +0.000481f, +0.000044f}, + {-0.183484f, -0.052352f, -0.028430f, +0.000255f, +0.000038f}, + {+0.021508f, -0.270954f, +0.003464f, -0.000123f, -0.000034f}, + {+0.112315f, -0.086235f, +0.009937f, +0.000307f, +0.000007f}, + {-0.107969f, +0.120398f, -0.018769f, +0.000181f, +0.000082f}, + {+0.056786f, +0.126822f, +0.007959f, +0.000033f, -0.000039f}, + {+0.069219f, -0.054400f, +0.005730f, -0.000053f, +0.000023f}, + {-0.070651f, +0.193415f, -0.010674f, +0.000389f, +0.000067f}, + {-0.051509f, -0.092171f, -0.007870f, +0.000294f, +0.000005f}, + {+0.051121f, -0.299571f, +0.006590f, -0.000024f, -0.000032f}, + {+0.084035f, +0.019475f, +0.012921f, +0.000164f, -0.000021f} + }, + { + {-0.178130f, -0.383088f, -0.025598f, -0.000261f, -0.000067f}, + {+0.182587f, +0.405974f, +0.025901f, +0.000462f, +0.000117f}, + {-0.033772f, -0.059691f, -0.003877f, -0.000106f, +0.000059f}, + {-0.056171f, -0.329183f, -0.006810f, -0.000311f, +0.000043f}, + {-0.030324f, +0.107424f, -0.007446f, +0.000469f, -0.000068f}, + {+0.029083f, -0.038828f, +0.003047f, +0.000232f, -0.000046f}, + {+0.074081f, +0.341332f, +0.009025f, +0.000675f, -0.000027f}, + {+0.114367f, -0.124510f, +0.017364f, -0.000363f, -0.000002f}, + {+0.019963f, -0.231444f, +0.001211f, +0.001284f, +0.000019f}, + {-0.044510f, +0.213643f, -0.009811f, +0.000749f, +0.000069f}, + {-0.075343f, -0.079800f, -0.011596f, +0.000341f, +0.000004f}, + {-0.002994f, -0.163592f, -0.001034f, +0.000473f, +0.000063f}, + {-0.066930f, +0.201208f, -0.008014f, -0.000114f, -0.000031f}, + {+0.046049f, +0.057169f, +0.003278f, +0.000251f, -0.000018f}, + {+0.102214f, -0.218411f, +0.013142f, -0.000169f, +0.000019f}, + {-0.034525f, -0.167091f, -0.007400f, +0.000056f, +0.000007f} + }, + { + {-0.222238f, -0.317392f, -0.033615f, +0.000033f, +0.000021f}, + {+0.241813f, +0.315693f, +0.038994f, +0.000147f, -0.000070f}, + {-0.020356f, -0.081902f, -0.002758f, +0.000479f, +0.000060f}, + {-0.167023f, -0.157180f, -0.026364f, +0.000127f, +0.000047f}, + {+0.066143f, -0.046203f, +0.014148f, -0.000357f, -0.000040f}, + {-0.022432f, +0.042335f, -0.001522f, -0.000437f, -0.000048f}, + {+0.157680f, +0.214692f, +0.024775f, -0.000379f, -0.000040f}, + {-0.074512f, +0.166548f, -0.010491f, +0.000080f, +0.000039f}, + {-0.105735f, -0.034968f, -0.008768f, -0.000539f, -0.000010f}, + {+0.123458f, -0.044963f, +0.022305f, -0.000260f, -0.000091f}, + {-0.027259f, -0.155333f, -0.002873f, -0.000021f, +0.000041f}, + {-0.074325f, -0.052152f, -0.007210f, -0.000007f, -0.000026f}, + {+0.123302f, -0.087187f, +0.015137f, -0.000263f, -0.000074f}, + {+0.007845f, +0.113256f, +0.003459f, -0.000313f, -0.000004f}, + {-0.120092f, +0.122041f, -0.014660f, +0.000024f, +0.000034f}, + {-0.076429f, -0.107035f, -0.008690f, -0.000173f, +0.000022f} + }, + { + {+0.213344f, +0.349398f, +0.030097f, +0.000237f, +0.000063f}, + {-0.219215f, -0.390772f, -0.031915f, -0.000487f, -0.000107f}, + {+0.052529f, +0.029499f, +0.005648f, -0.000100f, -0.000070f}, + {+0.095709f, +0.245511f, +0.012927f, +0.000199f, -0.000053f}, + {+0.028737f, -0.105483f, +0.003866f, -0.000348f, +0.000076f}, + {-0.013337f, +0.055289f, -0.001002f, -0.000053f, +0.000054f}, + {-0.130180f, -0.225228f, -0.015900f, -0.000591f, +0.000035f}, + {-0.068381f, +0.171403f, -0.012635f, +0.000260f, +0.000000f}, + {+0.025988f, +0.167605f, +0.004069f, -0.001280f, -0.000015f}, + {+0.008972f, -0.221115f, +0.003663f, -0.000531f, -0.000048f}, + {+0.090641f, +0.028424f, +0.013918f, -0.000378f, -0.000016f}, + {+0.038654f, +0.120101f, +0.004990f, -0.000461f, -0.000057f}, + {+0.005905f, -0.263875f, +0.003095f, +0.000269f, +0.000040f}, + {-0.040815f, +0.035273f, -0.004946f, -0.000197f, +0.000014f}, + {-0.018746f, +0.272655f, -0.004798f, +0.000121f, -0.000023f}, + {+0.076538f, +0.124942f, +0.010206f, -0.000084f, -0.000014f} + }, + { + {+0.192920f, +0.381741f, +0.029300f, -0.000048f, -0.000026f}, + {-0.222170f, -0.388402f, -0.034955f, -0.000099f, +0.000080f}, + {+0.001699f, +0.107240f, +0.000947f, -0.000519f, -0.000066f}, + {+0.136658f, +0.180309f, +0.023176f, -0.000174f, -0.000048f}, + {-0.088774f, +0.075575f, -0.016123f, +0.000436f, +0.000040f}, + {+0.024745f, -0.004479f, +0.001974f, +0.000454f, +0.000055f}, + {-0.102774f, -0.266722f, -0.019008f, +0.000449f, +0.000041f}, + {+0.092562f, -0.080882f, +0.015366f, -0.000075f, -0.000049f}, + {+0.070990f, +0.091884f, +0.006305f, +0.000702f, +0.000009f}, + {-0.128422f, -0.011753f, -0.022348f, +0.000409f, +0.000098f}, + {-0.011288f, +0.189192f, -0.003841f, -0.000041f, -0.000039f}, + {+0.054725f, +0.090752f, +0.006454f, +0.000058f, +0.000028f}, + {-0.128788f, -0.054495f, -0.017806f, +0.000292f, +0.000085f}, + {+0.020286f, -0.059861f, +0.001026f, +0.000246f, +0.000006f}, + {+0.120848f, +0.054441f, +0.017027f, -0.000075f, -0.000037f}, + {+0.034321f, +0.188962f, +0.004725f, +0.000162f, -0.000021f} + }, + { + {-0.244141f, -0.287056f, -0.034191f, -0.000192f, -0.000058f}, + {+0.264405f, +0.355877f, +0.037791f, +0.000515f, +0.000101f}, + {-0.059687f, +0.011038f, -0.007243f, +0.000348f, +0.000093f}, + {-0.113575f, -0.207201f, -0.018101f, -0.000078f, +0.000070f}, + {-0.015137f, +0.192002f, +0.000035f, +0.000213f, -0.000092f}, + {+0.000786f, -0.038825f, +0.000032f, -0.000190f, -0.000073f}, + {+0.148464f, +0.121467f, +0.020501f, +0.000551f, -0.000044f}, + {+0.029628f, -0.179066f, +0.005364f, -0.000049f, +0.000007f}, + {-0.038114f, -0.078616f, -0.007491f, +0.001320f, +0.000017f}, + {+0.025506f, +0.225558f, +0.001578f, +0.000313f, +0.000019f}, + {-0.093865f, +0.065189f, -0.011642f, +0.000361f, +0.000030f}, + {-0.055369f, -0.081537f, -0.009138f, +0.000492f, +0.000055f}, + {+0.051502f, +0.222620f, +0.004584f, -0.000598f, -0.000061f}, + {+0.019309f, -0.058544f, +0.003257f, +0.000181f, -0.000009f}, + {-0.051402f, -0.209177f, -0.004739f, -0.000005f, +0.000032f}, + {-0.088918f, +0.001217f, -0.011717f, +0.000085f, +0.000023f} + }, + { + {-0.156411f, -0.421444f, -0.024491f, +0.000067f, +0.000032f}, + {+0.186613f, +0.476552f, +0.029757f, +0.000163f, -0.000095f}, + {+0.020430f, -0.113691f, +0.002893f, +0.000775f, +0.000065f}, + {-0.119151f, -0.201740f, -0.018300f, +0.000297f, +0.000045f}, + {+0.119879f, -0.010231f, +0.016974f, -0.000596f, -0.000034f}, + {-0.016380f, -0.009027f, -0.002417f, -0.000683f, -0.000057f}, + {+0.054627f, +0.269651f, +0.010810f, -0.000526f, -0.000040f}, + {-0.097390f, +0.017005f, -0.015311f, +0.000161f, +0.000060f}, + {-0.042266f, -0.067204f, -0.002884f, -0.000753f, -0.000009f}, + {+0.124653f, +0.076460f, +0.020814f, -0.000683f, -0.000097f}, + {+0.063103f, -0.174209f, +0.008521f, +0.000147f, +0.000032f}, + {-0.034711f, -0.112933f, -0.002461f, -0.000059f, -0.000029f}, + {+0.100579f, +0.144714f, +0.014721f, -0.000551f, -0.000093f}, + {-0.025957f, +0.015194f, -0.003388f, -0.000192f, -0.000011f}, + {-0.076574f, -0.167585f, -0.012107f, +0.000148f, +0.000039f}, + {+0.014876f, -0.155274f, +0.000070f, -0.000119f, +0.000015f} + }, + { + {+0.265430f, +0.225416f, +0.037831f, +0.000115f, +0.000053f}, + {-0.306311f, -0.277325f, -0.043227f, -0.000433f, -0.000096f}, + {+0.056945f, -0.056467f, +0.006568f, -0.000476f, -0.000127f}, + {+0.136114f, +0.189590f, +0.020608f, +0.000082f, -0.000092f}, + {-0.029899f, -0.236698f, -0.003149f, -0.000187f, +0.000112f}, + {-0.002353f, +0.011865f, +0.000725f, +0.000346f, +0.000104f}, + {-0.149926f, -0.044328f, -0.020529f, -0.000533f, +0.000055f}, + {+0.006499f, +0.177667f, -0.000005f, -0.000147f, -0.000024f}, + {+0.030173f, +0.047667f, +0.008504f, -0.001253f, -0.000024f}, + {-0.058868f, -0.204995f, -0.005519f, -0.000216f, +0.000017f}, + {+0.060797f, -0.176638f, +0.008488f, -0.000290f, -0.000044f}, + {+0.066026f, +0.042360f, +0.010165f, -0.000503f, -0.000055f}, + {-0.083588f, -0.140991f, -0.010070f, +0.000860f, +0.000099f}, + {-0.004801f, +0.048462f, -0.000139f, -0.000150f, +0.000006f}, + {+0.080388f, +0.074103f, +0.009601f, -0.000068f, -0.000044f}, + {+0.065811f, -0.073786f, +0.011524f, -0.000018f, -0.000032f} + }, + { + {+0.119762f, +0.449669f, +0.018731f, -0.000115f, -0.000039f}, + {-0.134482f, -0.541069f, -0.022864f, -0.000250f, +0.000117f}, + {-0.042132f, +0.097515f, -0.006293f, -0.001210f, -0.000046f}, + {+0.098328f, +0.249713f, +0.014715f, -0.000530f, -0.000029f}, + {-0.121827f, -0.094517f, -0.018717f, +0.000823f, +0.000016f}, + {+0.013897f, -0.016128f, +0.002834f, +0.001121f, +0.000043f}, + {-0.013035f, -0.259005f, -0.004212f, +0.000650f, +0.000036f}, + {+0.088488f, +0.051805f, +0.014091f, -0.000366f, -0.000066f}, + {+0.034103f, +0.039837f, +0.000657f, +0.000674f, +0.000017f}, + {-0.110624f, -0.126988f, -0.019030f, +0.001012f, +0.000081f}, + {-0.093230f, +0.059767f, -0.012720f, -0.000213f, -0.000018f}, + {+0.010158f, +0.127393f, -0.000864f, -0.000011f, +0.000034f}, + {-0.063926f, -0.170726f, -0.009503f, +0.001011f, +0.000084f}, + {+0.027512f, -0.003892f, +0.003562f, +0.000233f, +0.000020f}, + {+0.023442f, +0.159229f, +0.006050f, -0.000235f, -0.000035f}, + {-0.037775f, +0.088532f, -0.005468f, +0.000062f, -0.000004f} + }, + { + {-0.281213f, -0.164420f, -0.039852f, -0.000042f, -0.000045f}, + {+0.333286f, +0.175696f, +0.047590f, +0.000222f, +0.000083f}, + {-0.046428f, +0.089416f, -0.005265f, +0.000281f, +0.000164f}, + {-0.162498f, -0.149672f, -0.023881f, -0.000229f, +0.000114f}, + {+0.075028f, +0.208672f, +0.010268f, +0.000343f, -0.000132f}, + {+0.011727f, -0.019516f, -0.000540f, -0.000212f, -0.000139f}, + {+0.140528f, -0.025264f, +0.018383f, +0.000497f, -0.000067f}, + {-0.033739f, -0.136327f, -0.003526f, +0.000118f, +0.000049f}, + {-0.027078f, -0.053959f, -0.007554f, +0.001057f, +0.000031f}, + {+0.086060f, +0.177107f, +0.010290f, +0.000364f, -0.000050f}, + {-0.010787f, +0.184727f, -0.002953f, +0.000174f, +0.000054f}, + {-0.067502f, +0.008050f, -0.010245f, +0.000436f, +0.000057f}, + {+0.094254f, +0.075792f, +0.012552f, -0.000706f, -0.000144f}, + {-0.009743f, -0.063892f, -0.003613f, +0.000014f, -0.000006f}, + {-0.069093f, +0.013884f, -0.010485f, -0.000027f, +0.000058f}, + {-0.040587f, +0.086338f, -0.006898f, -0.000093f, +0.000039f} + }, + { + {-0.083222f, -0.468035f, -0.013503f, +0.000232f, +0.000044f}, + {+0.075896f, +0.571385f, +0.014672f, +0.000160f, -0.000148f}, + {+0.064646f, -0.084083f, +0.009714f, +0.001578f, +0.000001f}, + {-0.061670f, -0.306739f, -0.009048f, +0.000650f, -0.000001f}, + {+0.101027f, +0.169945f, +0.015494f, -0.000962f, +0.000016f}, + {-0.029442f, +0.045651f, -0.004343f, -0.001546f, -0.000004f}, + {-0.024934f, +0.231230f, -0.000602f, -0.000728f, -0.000028f}, + {-0.072285f, -0.076179f, -0.012914f, +0.000746f, +0.000059f}, + {-0.032566f, -0.041990f, -0.000543f, -0.000656f, -0.000034f}, + {+0.090764f, +0.173219f, +0.015307f, -0.001207f, -0.000044f}, + {+0.090276f, +0.027741f, +0.013865f, +0.000091f, -0.000003f}, + {+0.018263f, -0.122358f, +0.003953f, +0.000094f, -0.000045f}, + {+0.030642f, +0.175289f, +0.004377f, -0.001562f, -0.000047f}, + {-0.023328f, -0.044760f, -0.001438f, -0.000338f, -0.000032f}, + {+0.006646f, -0.104149f, -0.000978f, +0.000365f, +0.000024f}, + {+0.048240f, -0.050757f, +0.006981f, -0.000141f, -0.000013f} + }, + { + {+0.293187f, +0.109518f, +0.041947f, +0.000007f, +0.000034f}, + {-0.344718f, -0.073613f, -0.049496f, +0.000072f, -0.000056f}, + {+0.021693f, -0.150854f, +0.000496f, +0.000303f, -0.000187f}, + {+0.175693f, +0.054150f, +0.024494f, +0.000572f, -0.000126f}, + {-0.106866f, -0.149507f, -0.014360f, -0.000666f, +0.000140f}, + {-0.005446f, +0.082692f, +0.002403f, -0.000314f, +0.000163f}, + {-0.114767f, +0.094767f, -0.014918f, -0.000548f, +0.000078f}, + {+0.049475f, +0.114052f, +0.007022f, +0.000118f, -0.000074f}, + {+0.031125f, +0.054985f, +0.008404f, -0.000705f, -0.000030f}, + {-0.107661f, -0.132716f, -0.012982f, -0.000706f, +0.000070f}, + {-0.028176f, -0.155327f, -0.002943f, -0.000018f, -0.000055f}, + {+0.051419f, -0.071483f, +0.007973f, -0.000234f, -0.000055f}, + {-0.090400f, -0.012443f, -0.011441f, +0.000118f, +0.000180f}, + {+0.025522f, +0.028081f, +0.003864f, +0.000120f, +0.000013f}, + {+0.045874f, -0.043114f, +0.007466f, +0.000223f, -0.000070f}, + {+0.014499f, -0.105809f, +0.003088f, +0.000276f, -0.000039f} + }, + { + {+0.046789f, +0.488561f, +0.007479f, -0.000388f, -0.000046f}, + {-0.018640f, -0.575973f, -0.005892f, +0.000203f, +0.000177f}, + {-0.079067f, +0.002856f, -0.010533f, -0.001448f, +0.000068f}, + {+0.016267f, +0.296423f, +0.004542f, -0.000403f, +0.000045f}, + {-0.068852f, -0.208415f, -0.010824f, +0.000748f, -0.000061f}, + {+0.046351f, +0.003708f, +0.005559f, +0.001546f, -0.000058f}, + {+0.047339f, -0.155305f, +0.003323f, +0.000760f, +0.000014f}, + {+0.060540f, +0.100086f, +0.009755f, -0.001008f, -0.000039f}, + {+0.028568f, +0.054083f, +0.000810f, +0.000898f, +0.000057f}, + {-0.065074f, -0.200619f, -0.010710f, +0.000928f, -0.000007f}, + {-0.072568f, -0.087920f, -0.011704f, +0.000262f, +0.000027f}, + {-0.035957f, +0.060576f, -0.005664f, -0.000112f, +0.000061f}, + {-0.005716f, -0.143119f, -0.000691f, +0.001673f, -0.000018f}, + {+0.004173f, +0.058408f, +0.000175f, +0.000594f, +0.000044f}, + {-0.014414f, +0.051132f, -0.000839f, -0.000345f, -0.000005f}, + {-0.049091f, -0.010855f, -0.005751f, +0.000426f, +0.000033f} + }, + { + {-0.304340f, -0.049256f, -0.042947f, -0.000088f, -0.000022f}, + {+0.346449f, -0.017003f, +0.049621f, -0.000139f, +0.000009f}, + {+0.019745f, +0.150866f, +0.002851f, -0.000874f, +0.000177f}, + {-0.162730f, +0.020120f, -0.025248f, -0.000808f, +0.000118f}, + {+0.121162f, +0.084738f, +0.017259f, +0.000808f, -0.000129f}, + {-0.021528f, -0.096693f, -0.003962f, +0.000943f, -0.000157f}, + {+0.080586f, -0.103642f, +0.011291f, +0.000589f, -0.000085f}, + {-0.068191f, -0.098030f, -0.009096f, -0.000708f, +0.000092f}, + {-0.036751f, -0.046076f, -0.010119f, +0.000284f, +0.000015f}, + {+0.119856f, +0.085575f, +0.015319f, +0.000749f, -0.000064f}, + {+0.056191f, +0.109851f, +0.006441f, +0.000263f, +0.000045f}, + {-0.024446f, +0.076942f, -0.005466f, -0.000057f, +0.000045f}, + {+0.077086f, -0.012676f, +0.010840f, +0.000676f, -0.000186f}, + {-0.022826f, +0.016537f, -0.004763f, -0.000058f, -0.000029f}, + {-0.027607f, +0.031101f, -0.005172f, -0.000482f, +0.000074f}, + {+0.014855f, +0.087430f, -0.000738f, -0.000308f, +0.000029f} + }, + { + {-0.005004f, -0.508800f, -0.001655f, +0.000570f, +0.000043f}, + {-0.037995f, +0.575156f, -0.001530f, -0.000956f, -0.000194f}, + {+0.063856f, +0.080957f, +0.012812f, -0.000366f, -0.000142f}, + {+0.010948f, -0.247204f, +0.002839f, -0.000988f, -0.000091f}, + {+0.037852f, +0.213873f, +0.003692f, +0.000614f, +0.000107f}, + {-0.039839f, -0.066118f, -0.007988f, -0.000076f, +0.000128f}, + {-0.045977f, +0.093672f, -0.005215f, -0.000506f, +0.000005f}, + {-0.041130f, -0.141991f, -0.007462f, +0.000858f, +0.000008f}, + {-0.021819f, -0.064730f, +0.000517f, -0.001640f, -0.000079f}, + {+0.039217f, +0.211900f, +0.002725f, +0.000921f, +0.000061f}, + {+0.045306f, +0.127706f, +0.011256f, -0.001493f, -0.000048f}, + {+0.032008f, -0.009436f, +0.005842f, -0.000094f, -0.000078f}, + {-0.004712f, +0.114810f, -0.003709f, -0.000227f, +0.000095f}, + {+0.008291f, -0.029832f, +0.002509f, -0.001272f, -0.000051f}, + {+0.010544f, -0.029052f, +0.001437f, -0.000138f, -0.000018f}, + {+0.030918f, +0.063638f, +0.005584f, -0.001227f, -0.000052f} + }, + { + {+0.309505f, -0.026680f, +0.043359f, +0.000419f, +0.000012f}, + {-0.340746f, +0.112091f, -0.048231f, -0.000694f, +0.000055f}, + {-0.050908f, -0.091302f, -0.002377f, +0.001134f, -0.000125f}, + {+0.144586f, -0.040667f, +0.026484f, +0.000403f, -0.000085f}, + {-0.123071f, -0.035557f, -0.020641f, -0.000216f, +0.000092f}, + {+0.043825f, +0.058128f, +0.002805f, -0.001548f, +0.000111f}, + {-0.057009f, +0.077140f, -0.008666f, -0.000464f, +0.000085f}, + {+0.083496f, +0.049994f, +0.012188f, +0.002184f, -0.000094f}, + {+0.041301f, +0.031775f, +0.012825f, +0.000028f, +0.000015f}, + {-0.123609f, -0.042304f, -0.020375f, +0.000225f, +0.000027f}, + {-0.072663f, -0.052460f, -0.006157f, -0.001671f, -0.000023f}, + {+0.007106f, -0.047603f, +0.003493f, +0.000487f, -0.000023f}, + {-0.066995f, +0.014584f, -0.013984f, -0.001717f, +0.000149f}, + {+0.012333f, -0.023056f, +0.004831f, -0.000535f, +0.000051f}, + {+0.018093f, -0.018206f, +0.005001f, +0.000871f, -0.000068f}, + {-0.032484f, -0.034633f, +0.000235f, -0.000375f, -0.000007f} + } +}; + +#endif + +#ifdef UPDATE_SBA_FILTER + +const float FASTCONV_HOA2_latency_s = 0.000666667f; +const float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= +{ + { + {-0.005335f, +0.653226f, +0.143797f, +0.002456f, -0.000002f}, + {-0.013208f, +0.379140f, -0.322559f, -0.004978f, -0.000009f}, + {+0.001925f, +0.054222f, +0.043071f, -0.002449f, -0.000110f}, + {-0.000927f, +0.060176f, -0.015580f, -0.001281f, -0.000042f}, + {+0.003471f, +0.011471f, +0.002826f, +0.001074f, -0.000026f}, + {+0.003706f, -0.001098f, -0.005680f, +0.008863f, +0.000084f}, + {-0.005326f, -0.000766f, -0.002007f, -0.003072f, +0.000014f}, + {+0.001747f, -0.039662f, +0.085770f, +0.000859f, +0.000050f}, + {-0.009494f, +0.084274f, -0.084910f, -0.005996f, -0.000078f} + }, + { + {+0.020549f, +0.471556f, -0.054545f, -0.003976f, +0.000002f}, + {+0.031621f, +0.813566f, +0.056755f, +0.007166f, +0.000006f}, + {-0.002271f, -0.021372f, -0.026223f, +0.003087f, +0.000136f}, + {+0.000511f, +0.035700f, -0.040529f, +0.002564f, +0.000048f}, + {-0.007142f, -0.001751f, -0.001329f, -0.002743f, +0.000028f}, + {-0.006527f, -0.051957f, -0.070578f, -0.014200f, -0.000113f}, + {+0.014135f, +0.025109f, +0.015403f, +0.005652f, -0.000015f}, + {-0.003291f, -0.069019f, +0.036066f, +0.001141f, -0.000069f}, + {+0.028061f, +0.152663f, -0.025603f, +0.008277f, +0.000102f} + }, + { + {-0.039663f, +0.412008f, +0.017452f, +0.000445f, +0.000002f}, + {-0.026960f, +0.962971f, +0.087407f, +0.001953f, +0.000014f}, + {-0.001486f, -0.002955f, -0.054042f, +0.000085f, +0.000075f}, + {+0.003107f, +0.048844f, -0.051503f, -0.002108f, +0.000034f}, + {+0.009864f, -0.005169f, -0.019159f, +0.003128f, +0.000025f}, + {+0.004987f, -0.054770f, -0.099413f, +0.003316f, -0.000044f}, + {-0.024855f, +0.021795f, +0.065786f, -0.002538f, -0.000013f}, + {+0.003623f, +0.018186f, -0.058320f, -0.005763f, -0.000022f}, + {-0.055010f, +0.126807f, +0.109029f, +0.001546f, +0.000045f} + }, + { + {+0.043174f, +0.455537f, -0.027678f, +0.002529f, -0.000002f}, + {-0.025122f, +0.922813f, +0.028063f, -0.008613f, -0.000006f}, + {+0.002020f, +0.051124f, -0.010761f, +0.000153f, -0.000146f}, + {-0.010597f, +0.081732f, -0.001493f, +0.001479f, -0.000051f}, + {-0.024810f, +0.014152f, +0.030508f, -0.002185f, -0.000029f}, + {-0.011648f, +0.040215f, +0.008697f, +0.003893f, +0.000125f}, + {+0.043616f, -0.007408f, -0.035355f, -0.000987f, +0.000015f}, + {-0.007698f, +0.031375f, -0.028885f, +0.004919f, +0.000076f}, + {+0.093586f, +0.162669f, -0.029770f, -0.007128f, -0.000112f} + }, + { + {-0.001041f, +0.494032f, +0.005715f, -0.001108f, -0.000002f}, + {+0.143821f, +0.682007f, -0.029450f, +0.003481f, -0.000019f}, + {+0.006306f, +0.070613f, -0.011179f, -0.001860f, -0.000038f}, + {+0.031146f, +0.059515f, -0.014381f, -0.000905f, -0.000027f}, + {+0.052905f, -0.051459f, -0.001250f, +0.000868f, -0.000023f}, + {+0.029241f, +0.030800f, +0.000944f, -0.000488f, -0.000000f}, + {-0.055716f, +0.063529f, +0.002159f, +0.000641f, +0.000013f}, + {+0.013468f, -0.008041f, -0.000774f, +0.000134f, -0.000007f}, + {-0.101473f, +0.336570f, +0.012535f, +0.003233f, -0.000009f} + }, + { + {-0.092816f, +0.358882f, +0.002536f, -0.001449f, +0.000001f}, + {-0.262828f, +0.127251f, -0.020151f, +0.004341f, +0.000009f}, + {-0.022963f, +0.059857f, +0.016901f, +0.000212f, +0.000141f}, + {-0.064426f, -0.041934f, +0.012804f, -0.000049f, +0.000052f}, + {-0.064139f, -0.206373f, +0.000508f, -0.000138f, +0.000031f}, + {-0.035857f, -0.035091f, +0.016850f, -0.002300f, -0.000120f}, + {+0.032908f, +0.170386f, -0.004178f, +0.001249f, -0.000015f}, + {-0.010158f, -0.037569f, +0.007236f, -0.002146f, -0.000070f}, + {+0.021780f, +0.486360f, -0.004267f, +0.000644f, +0.000106f} + }, + { + {+0.166528f, -0.018320f, +0.002944f, +0.001057f, +0.000002f}, + {+0.217141f, -0.537828f, +0.015478f, -0.003353f, +0.000022f}, + {+0.036889f, -0.008294f, -0.001367f, +0.001254f, +0.000008f}, + {+0.069514f, -0.229400f, +0.010249f, +0.000566f, +0.000020f}, + {+0.019714f, -0.330742f, +0.003692f, -0.000002f, +0.000022f}, + {+0.010625f, -0.080582f, -0.010145f, +0.000258f, +0.000041f}, + {+0.022526f, +0.170893f, +0.014154f, -0.001025f, -0.000013f}, + {-0.007441f, -0.048091f, +0.004112f, +0.000974f, +0.000032f}, + {+0.115639f, +0.344255f, +0.014295f, -0.000177f, -0.000021f} + }, + { + {-0.099909f, -0.399087f, -0.008044f, +0.000848f, -0.000001f}, + {+0.054243f, -0.757012f, +0.020850f, -0.002283f, -0.000013f}, + {-0.025209f, -0.091980f, -0.004347f, +0.000486f, -0.000127f}, + {+0.003575f, -0.340857f, -0.007962f, -0.000163f, -0.000051f}, + {+0.071769f, -0.265803f, -0.002595f, +0.000097f, -0.000034f}, + {+0.026489f, -0.035458f, +0.005585f, +0.001110f, +0.000100f}, + {-0.060623f, +0.023422f, -0.010689f, -0.000403f, +0.000015f}, + {+0.027371f, -0.008448f, -0.007673f, -0.000192f, +0.000053f}, + {-0.176311f, -0.087697f, -0.004740f, -0.000958f, -0.000089f} + }, + { + {-0.098192f, -0.380559f, -0.012062f, -0.000872f, -0.000003f}, + {-0.307522f, -0.201411f, -0.041908f, +0.002386f, -0.000023f}, + {-0.016794f, -0.090327f, -0.008151f, -0.001481f, +0.000012f}, + {-0.117497f, -0.178818f, -0.001213f, -0.000161f, -0.000015f}, + {-0.130667f, +0.017905f, -0.002862f, -0.000224f, -0.000021f}, + {-0.026816f, +0.061563f, -0.002730f, -0.000500f, -0.000070f}, + {+0.035111f, -0.133808f, +0.000916f, +0.000421f, +0.000014f}, + {-0.028071f, +0.069426f, -0.005372f, -0.000149f, -0.000048f}, + {+0.069362f, -0.446237f, -0.000098f, +0.000728f, +0.000041f} + }, + { + {+0.200424f, +0.084933f, +0.029127f, -0.000528f, +0.000002f}, + {+0.208158f, +0.589613f, +0.015424f, +0.001691f, +0.000018f}, + {+0.041516f, +0.016661f, +0.015205f, -0.000153f, +0.000109f}, + {+0.138467f, +0.186187f, +0.007440f, -0.000185f, +0.000051f}, + {+0.077086f, +0.303705f, -0.003329f, +0.000036f, +0.000037f}, + {-0.020310f, +0.080808f, +0.007043f, -0.000054f, -0.000070f}, + {+0.031948f, -0.141008f, -0.000818f, +0.000548f, -0.000016f}, + {+0.000366f, +0.119534f, +0.006275f, +0.000355f, -0.000032f}, + {+0.109021f, -0.372983f, +0.009320f, +0.000129f, +0.000067f} + }, + { + {-0.031292f, +0.437887f, -0.005797f, +0.000706f, +0.000004f}, + {+0.174454f, +0.640794f, +0.027817f, -0.001980f, +0.000023f}, + {+0.003185f, +0.089160f, -0.003572f, +0.001064f, -0.000021f}, + {-0.004179f, +0.383165f, +0.003748f, +0.000389f, +0.000011f}, + {+0.056596f, +0.310132f, +0.010567f, +0.000223f, +0.000018f}, + {+0.057823f, -0.028077f, +0.000893f, +0.000451f, +0.000085f}, + {-0.063559f, +0.001711f, -0.003009f, -0.000543f, -0.000016f}, + {+0.035766f, +0.073579f, +0.002518f, +0.000224f, +0.000053f}, + {-0.161175f, +0.042780f, -0.016398f, -0.000634f, -0.000050f} + }, + { + {-0.205155f, +0.167329f, -0.030119f, +0.000379f, -0.000002f}, + {-0.339082f, -0.153701f, -0.034923f, -0.001267f, -0.000022f}, + {-0.072520f, -0.022480f, -0.011077f, +0.000072f, -0.000094f}, + {-0.141121f, +0.163887f, -0.018765f, +0.000088f, -0.000051f}, + {-0.127275f, +0.020840f, -0.015322f, +0.000034f, -0.000041f}, + {-0.027665f, -0.152414f, -0.006975f, -0.000222f, +0.000038f}, + {+0.020531f, +0.124947f, +0.003832f, -0.000374f, +0.000019f}, + {-0.042138f, -0.039811f, -0.003937f, -0.000440f, +0.000012f}, + {+0.031495f, +0.327305f, +0.001379f, +0.000105f, -0.000048f} + }, + { + {+0.145847f, -0.370580f, +0.020419f, -0.000633f, -0.000004f}, + {+0.026755f, -0.715695f, -0.002721f, +0.001713f, -0.000021f}, + {+0.048263f, -0.214620f, +0.011454f, -0.000799f, +0.000024f}, + {+0.105105f, -0.209642f, +0.009809f, -0.000393f, -0.000007f}, + {+0.046673f, -0.240709f, +0.003039f, -0.000354f, -0.000014f}, + {-0.046604f, -0.126235f, -0.001254f, -0.000637f, -0.000087f}, + {+0.040919f, +0.089993f, +0.004646f, +0.000614f, +0.000016f}, + {+0.003849f, -0.106327f, -0.000606f, -0.000255f, -0.000050f}, + {+0.114169f, +0.187796f, +0.016720f, +0.000604f, +0.000050f} + }, + { + {+0.151563f, -0.357850f, +0.023901f, -0.000267f, +0.000003f}, + {+0.329416f, -0.240852f, +0.037687f, +0.000972f, +0.000025f}, + {+0.079637f, -0.178703f, +0.006277f, -0.000085f, +0.000084f}, + {+0.067743f, -0.255542f, +0.013928f, -0.000093f, +0.000052f}, + {+0.085616f, -0.171409f, +0.015038f, -0.000016f, +0.000044f}, + {+0.080584f, +0.060419f, +0.009795f, +0.000260f, -0.000011f}, + {-0.039270f, -0.029107f, -0.004384f, +0.000149f, -0.000022f}, + {+0.040700f, -0.048532f, +0.005694f, +0.000308f, +0.000003f}, + {-0.100428f, -0.143102f, -0.013507f, -0.000175f, +0.000032f} + }, + { + {-0.221520f, +0.217382f, -0.031802f, +0.000571f, +0.000004f}, + {-0.191369f, +0.563524f, -0.020930f, -0.001563f, +0.000018f}, + {-0.142768f, +0.156236f, -0.016728f, +0.000768f, -0.000025f}, + {-0.131233f, +0.058224f, -0.018961f, +0.000413f, +0.000003f}, + {-0.094869f, +0.113180f, -0.014106f, +0.000387f, +0.000009f}, + {-0.032009f, +0.229593f, -0.004382f, +0.000814f, +0.000078f}, + {-0.014026f, -0.058166f, -0.005170f, -0.000559f, -0.000016f}, + {-0.035069f, +0.066238f, -0.003175f, +0.000270f, +0.000041f}, + {-0.032944f, -0.241581f, -0.006363f, -0.000531f, -0.000047f} + }, + { + {-0.072792f, +0.444420f, -0.012987f, +0.000205f, -0.000004f}, + {-0.237324f, +0.482374f, -0.029199f, -0.000704f, -0.000027f}, + {+0.015060f, +0.403253f, +0.004767f, +0.000016f, -0.000078f}, + {-0.002750f, +0.257555f, -0.001283f, +0.000101f, -0.000052f}, + {-0.029761f, +0.216925f, -0.003727f, +0.000037f, -0.000045f}, + {-0.050908f, +0.208738f, -0.003838f, -0.000287f, -0.000007f}, + {+0.026158f, +0.010072f, +0.007655f, -0.000049f, +0.000026f}, + {-0.018378f, +0.087639f, -0.004770f, -0.000153f, -0.000011f}, + {+0.100406f, -0.034654f, +0.015514f, +0.000140f, -0.000022f} + }, + { + {+0.257437f, -0.065717f, +0.037575f, -0.000530f, -0.000004f}, + {+0.281553f, -0.324420f, +0.036967f, +0.001412f, -0.000017f}, + {+0.165202f, +0.184739f, +0.014027f, -0.000709f, +0.000026f}, + {+0.125102f, +0.059915f, +0.017871f, -0.000393f, +0.000001f}, + {+0.112292f, -0.000623f, +0.014750f, -0.000389f, -0.000004f}, + {+0.090463f, +0.007129f, +0.003581f, -0.000747f, -0.000067f}, + {+0.027231f, +0.007327f, +0.004513f, +0.000487f, +0.000014f}, + {+0.046307f, -0.017672f, +0.008365f, -0.000175f, -0.000032f}, + {-0.028415f, +0.161325f, -0.001715f, +0.000514f, +0.000043f} + }, + { + {-0.007526f, -0.473436f, +0.001022f, -0.000153f, +0.000005f}, + {+0.129889f, -0.550582f, +0.015713f, +0.000496f, +0.000029f}, + {-0.152654f, -0.291103f, -0.013185f, -0.000005f, +0.000074f}, + {-0.054068f, -0.217748f, -0.007018f, -0.000142f, +0.000051f}, + {-0.037999f, -0.233960f, -0.005179f, -0.000063f, +0.000045f}, + {-0.058157f, -0.208550f, -0.000279f, +0.000232f, +0.000018f}, + {-0.043982f, -0.108725f, -0.011637f, +0.000065f, -0.000029f}, + {+0.000177f, -0.092885f, -0.000896f, -0.000064f, +0.000013f}, + {-0.062887f, +0.105831f, -0.012283f, -0.000152f, +0.000016f} + }, + { + {-0.267052f, -0.072481f, -0.039143f, +0.000481f, +0.000004f}, + {-0.316645f, +0.147998f, -0.045958f, -0.001265f, +0.000015f}, + {-0.048560f, -0.443085f, -0.007515f, +0.000666f, -0.000028f}, + {-0.086419f, -0.172339f, -0.010499f, +0.000432f, -0.000005f}, + {-0.085408f, -0.166595f, -0.008605f, +0.000440f, +0.000000f}, + {-0.015618f, -0.269874f, -0.001215f, +0.000625f, +0.000057f}, + {-0.041006f, -0.120930f, -0.000588f, -0.000488f, -0.000012f}, + {-0.062603f, +0.004952f, -0.009992f, +0.000232f, +0.000027f}, + {+0.049095f, -0.068280f, +0.006362f, -0.000520f, -0.000040f} + }, + { + {+0.085562f, +0.471449f, +0.011009f, +0.000129f, -0.000005f}, + {-0.040209f, +0.573378f, -0.000615f, -0.000315f, -0.000031f}, + {+0.171918f, -0.105151f, +0.017403f, +0.000004f, -0.000072f}, + {+0.084128f, +0.083375f, +0.007231f, +0.000038f, -0.000051f}, + {+0.092144f, +0.099172f, +0.007312f, -0.000077f, -0.000045f}, + {+0.077363f, -0.132678f, +0.001733f, -0.000235f, -0.000023f}, + {+0.111219f, +0.109132f, +0.015848f, -0.000079f, +0.000032f}, + {+0.040923f, +0.172426f, +0.008798f, -0.000008f, -0.000013f}, + {+0.029588f, -0.098729f, +0.007764f, +0.000221f, -0.000011f} + }, + { + {+0.254737f, +0.211411f, +0.036795f, -0.000484f, -0.000003f}, + {+0.338234f, -0.015114f, +0.048846f, +0.001053f, -0.000013f}, + {-0.069108f, +0.254859f, -0.003290f, -0.000753f, +0.000029f}, + {+0.023788f, +0.170361f, +0.006488f, -0.000354f, +0.000008f}, + {+0.008393f, +0.222503f, +0.002681f, -0.000354f, +0.000003f}, + {-0.081171f, +0.098496f, -0.004558f, -0.000585f, -0.000051f}, + {-0.022336f, +0.317809f, -0.007308f, +0.000546f, +0.000009f}, + {+0.059371f, +0.155239f, +0.002593f, -0.000198f, -0.000025f}, + {-0.050719f, +0.026919f, -0.006976f, +0.000534f, +0.000037f} + }, + { + {-0.158995f, -0.424829f, -0.020702f, -0.000042f, +0.000006f}, + {-0.052902f, -0.616966f, -0.013055f, +0.000306f, +0.000032f}, + {-0.087152f, +0.213242f, -0.015296f, +0.000352f, +0.000070f}, + {-0.054260f, +0.047270f, -0.008042f, +0.000061f, +0.000051f}, + {-0.073970f, +0.094701f, -0.008512f, +0.000228f, +0.000046f}, + {+0.017462f, +0.238223f, +0.000790f, +0.000485f, +0.000029f}, + {-0.138534f, +0.148762f, -0.014349f, -0.000008f, -0.000034f}, + {-0.109919f, -0.097327f, -0.010882f, +0.000233f, +0.000014f}, + {-0.006806f, +0.096529f, -0.003657f, -0.000365f, +0.000007f} + }, + { + {-0.218541f, -0.332409f, -0.031504f, +0.000445f, +0.000003f}, + {-0.344919f, -0.163301f, -0.048934f, -0.001021f, +0.000012f}, + {+0.081260f, -0.052733f, +0.012413f, +0.000334f, -0.000031f}, + {+0.001753f, -0.039186f, -0.002593f, +0.000192f, -0.000011f}, + {+0.044437f, -0.083315f, +0.002185f, +0.000075f, -0.000005f}, + {+0.063695f, +0.165969f, +0.005598f, +0.000350f, +0.000048f}, + {+0.133966f, -0.261153f, +0.015377f, -0.000538f, -0.000006f}, + {+0.023795f, -0.302979f, +0.005384f, -0.000124f, +0.000025f}, + {+0.048328f, +0.008375f, +0.007723f, -0.000384f, -0.000035f} + }, + { + {+0.215234f, +0.334693f, +0.029335f, -0.000032f, -0.000006f}, + {+0.163645f, +0.620258f, +0.029442f, -0.000199f, -0.000034f}, + {+0.033793f, -0.124345f, +0.006813f, -0.000105f, -0.000071f}, + {+0.000974f, -0.040313f, +0.001531f, +0.000006f, -0.000052f}, + {+0.011132f, -0.127973f, +0.004627f, +0.000028f, -0.000047f}, + {-0.084325f, -0.052788f, -0.007351f, -0.000453f, -0.000037f}, + {+0.056743f, -0.375950f, +0.009997f, +0.000141f, +0.000035f}, + {+0.111528f, -0.176673f, +0.008510f, +0.000146f, -0.000018f}, + {-0.011877f, -0.092945f, -0.003074f, +0.000266f, -0.000004f} + }, + { + {+0.170586f, +0.400778f, +0.026157f, -0.000380f, -0.000003f}, + {+0.309161f, +0.398764f, +0.040718f, +0.000943f, -0.000011f}, + {-0.062016f, +0.029728f, -0.012911f, -0.000459f, +0.000035f}, + {+0.031810f, -0.090010f, +0.007426f, -0.000129f, +0.000014f}, + {-0.032063f, -0.056196f, -0.004324f, -0.000244f, +0.000009f}, + {+0.022806f, -0.208884f, -0.000856f, -0.000371f, -0.000043f}, + {-0.165081f, -0.039385f, -0.016746f, +0.000367f, +0.000003f}, + {-0.128190f, +0.183103f, -0.012188f, -0.000425f, -0.000025f}, + {-0.049731f, -0.043210f, -0.002580f, +0.000500f, +0.000034f} + }, + { + {-0.253118f, -0.253855f, -0.036031f, +0.000022f, +0.000008f}, + {-0.270280f, -0.483591f, -0.039528f, +0.000153f, +0.000036f}, + {-0.018783f, +0.101617f, -0.001693f, +0.000100f, +0.000073f}, + {+0.020506f, -0.111990f, -0.001982f, -0.000215f, +0.000054f}, + {+0.026438f, +0.035500f, +0.002626f, -0.000034f, +0.000050f}, + {+0.052495f, -0.162509f, +0.005782f, +0.000307f, +0.000047f}, + {+0.034503f, +0.254582f, -0.002428f, -0.000029f, -0.000037f}, + {-0.007059f, +0.365527f, +0.000861f, +0.000308f, +0.000024f}, + {+0.051840f, +0.110577f, +0.004579f, -0.000471f, +0.000002f} + }, + { + {-0.123354f, -0.454617f, -0.017101f, +0.000408f, +0.000003f}, + {-0.216188f, -0.557670f, -0.033272f, -0.000921f, +0.000010f}, + {+0.060077f, -0.016368f, +0.008130f, +0.000544f, -0.000041f}, + {-0.097698f, +0.063611f, -0.011314f, +0.000334f, -0.000020f}, + {-0.004155f, +0.082194f, -0.000724f, +0.000315f, -0.000015f}, + {-0.061885f, +0.007918f, -0.004267f, +0.000661f, +0.000034f}, + {+0.120251f, +0.108336f, +0.021527f, -0.000454f, +0.000001f}, + {+0.138249f, +0.145446f, +0.014907f, +0.000187f, +0.000021f}, + {+0.010129f, +0.174821f, +0.000225f, -0.000291f, -0.000033f} + }, + { + {+0.286163f, +0.175080f, +0.040522f, -0.000072f, -0.000009f}, + {+0.316113f, +0.262138f, +0.049307f, -0.000066f, -0.000038f}, + {-0.006202f, -0.116156f, -0.000344f, -0.000116f, -0.000074f}, + {+0.026045f, +0.250354f, +0.005697f, +0.000168f, -0.000055f}, + {-0.033061f, +0.037487f, -0.003086f, +0.000057f, -0.000051f}, + {+0.009161f, +0.111428f, -0.002750f, -0.000407f, -0.000055f}, + {-0.050197f, -0.166126f, -0.010372f, +0.000135f, +0.000039f}, + {-0.108124f, -0.227657f, -0.011340f, -0.000057f, -0.000029f}, + {-0.062623f, +0.065189f, -0.003295f, +0.000387f, +0.000001f} + }, + { + {+0.066678f, +0.512159f, +0.009358f, -0.000375f, -0.000002f}, + {+0.128892f, +0.546911f, +0.020182f, +0.000837f, -0.000009f}, + {-0.041244f, -0.065432f, -0.004659f, -0.000466f, +0.000049f}, + {+0.124448f, +0.097696f, +0.018095f, -0.000283f, +0.000027f}, + {+0.039700f, -0.075487f, +0.006824f, -0.000303f, +0.000022f}, + {+0.033671f, +0.064807f, +0.008036f, -0.000540f, -0.000022f}, + {-0.115666f, -0.069551f, -0.016489f, +0.000343f, -0.000004f}, + {-0.044678f, -0.318287f, -0.008724f, -0.000374f, -0.000016f}, + {+0.045915f, -0.096744f, +0.005450f, +0.000336f, +0.000032f} + }, + { + {-0.306654f, -0.062299f, -0.043370f, +0.000070f, +0.000010f}, + {-0.327815f, -0.157084f, -0.053522f, +0.000024f, +0.000042f}, + {+0.020545f, +0.022620f, -0.000196f, -0.000030f, +0.000072f}, + {-0.093582f, -0.234733f, -0.010882f, -0.000285f, +0.000055f}, + {+0.018657f, -0.107686f, +0.002873f, -0.000136f, +0.000051f}, + {-0.022629f, -0.029525f, -0.002254f, +0.000156f, +0.000058f}, + {+0.080228f, +0.235900f, +0.013683f, -0.000069f, -0.000040f}, + {+0.131827f, -0.044535f, +0.015502f, +0.000103f, +0.000031f}, + {+0.019414f, -0.130958f, +0.003490f, -0.000488f, -0.000004f} + }, + { + {-0.003446f, -0.527577f, -0.000418f, +0.000351f, +0.000001f}, + {-0.063671f, -0.564794f, -0.009104f, -0.000762f, +0.000008f}, + {+0.005424f, +0.040112f, +0.004744f, +0.000443f, -0.000057f}, + {-0.104226f, -0.211764f, -0.016606f, +0.000287f, -0.000034f}, + {-0.067397f, +0.027841f, -0.010395f, +0.000286f, -0.000029f}, + {-0.014235f, -0.044128f, -0.001136f, +0.000560f, +0.000010f}, + {+0.112939f, +0.189986f, +0.013999f, -0.000350f, +0.000008f}, + {-0.051770f, +0.234766f, -0.004628f, +0.000261f, +0.000010f}, + {-0.057159f, -0.008653f, -0.009510f, -0.000310f, -0.000032f} + }, + { + {+0.309125f, -0.046398f, +0.043868f, -0.000070f, -0.000010f}, + {+0.337900f, +0.049301f, +0.053004f, +0.000032f, -0.000046f}, + {+0.006452f, +0.038403f, -0.000549f, +0.000028f, -0.000068f}, + {+0.142396f, +0.170693f, +0.019921f, +0.000322f, -0.000053f}, + {+0.012544f, +0.153200f, +0.002399f, +0.000157f, -0.000049f}, + {+0.026935f, +0.020769f, +0.002517f, -0.000142f, -0.000057f}, + {-0.135188f, -0.190554f, -0.017975f, +0.000073f, +0.000042f}, + {-0.083199f, +0.182605f, -0.012518f, -0.000033f, -0.000031f}, + {+0.022452f, +0.113080f, +0.002881f, +0.000561f, +0.000007f} + }, + { + {-0.056550f, +0.514353f, -0.008128f, -0.000326f, +0.000000f}, + {-0.002761f, +0.570850f, +0.000438f, +0.000698f, -0.000005f}, + {-0.005763f, +0.055193f, -0.003144f, -0.000303f, +0.000064f}, + {+0.066858f, +0.287146f, +0.008674f, -0.000271f, +0.000039f}, + {+0.079593f, +0.051699f, +0.009265f, -0.000243f, +0.000035f}, + {-0.004491f, +0.069814f, -0.001757f, -0.000412f, -0.000001f}, + {-0.070466f, -0.289680f, -0.008846f, +0.000325f, -0.000013f}, + {+0.096678f, -0.094366f, +0.010661f, -0.000155f, -0.000007f}, + {+0.041572f, +0.082696f, +0.006577f, +0.000266f, +0.000031f} + }, + { + {-0.298262f, +0.141215f, -0.042908f, +0.000091f, +0.000010f}, + {-0.335616f, +0.061120f, -0.052587f, -0.000136f, +0.000050f}, + {-0.028168f, +0.019948f, -0.003001f, +0.000044f, +0.000065f}, + {-0.179347f, -0.090626f, -0.024448f, -0.000251f, +0.000051f}, + {-0.055697f, -0.153136f, -0.006127f, -0.000099f, +0.000047f}, + {-0.022758f, +0.040841f, -0.001974f, +0.000245f, +0.000056f}, + {+0.171241f, +0.083402f, +0.023385f, -0.000076f, -0.000043f}, + {+0.018087f, -0.211528f, +0.004820f, +0.000028f, +0.000030f}, + {-0.051883f, -0.059963f, -0.007202f, -0.000532f, -0.000011f} + }, + { + {+0.109668f, -0.485328f, +0.016423f, +0.000299f, -0.000001f}, + {+0.064276f, -0.551492f, +0.008554f, -0.000611f, +0.000002f}, + {+0.027762f, -0.066226f, +0.006657f, +0.000180f, -0.000068f}, + {-0.008606f, -0.352413f, -0.000966f, +0.000207f, -0.000045f}, + {-0.061405f, -0.140795f, -0.008634f, +0.000186f, -0.000040f}, + {+0.022602f, -0.028596f, +0.003958f, +0.000252f, -0.000003f}, + {+0.006333f, +0.339254f, -0.001045f, -0.000313f, +0.000017f}, + {-0.095236f, -0.035271f, -0.011532f, +0.000098f, +0.000006f}, + {-0.006892f, -0.129936f, -0.001855f, -0.000288f, -0.000028f} + }, + { + {+0.280162f, -0.222327f, +0.040172f, -0.000132f, -0.000011f}, + {+0.325666f, -0.150573f, +0.051593f, +0.000209f, -0.000054f}, + {+0.028869f, -0.065199f, +0.002958f, -0.000146f, -0.000066f}, + {+0.187456f, -0.052621f, +0.025102f, +0.000202f, -0.000052f}, + {+0.080571f, +0.077938f, +0.010648f, +0.000040f, -0.000047f}, + {+0.004481f, -0.054774f, +0.000402f, -0.000382f, -0.000060f}, + {-0.176395f, +0.061006f, -0.022445f, +0.000083f, +0.000045f}, + {+0.032007f, +0.158843f, +0.002664f, -0.000125f, -0.000033f}, + {+0.057225f, -0.034866f, +0.006728f, +0.000520f, +0.000013f} + }, + { + {-0.158921f, +0.451848f, -0.023918f, -0.000281f, +0.000001f}, + {-0.121553f, +0.536831f, -0.017942f, +0.000578f, +0.000001f}, + {-0.050855f, +0.055529f, -0.008445f, -0.000215f, +0.000075f}, + {-0.052686f, +0.312195f, -0.005219f, -0.000224f, +0.000052f}, + {+0.037110f, +0.141320f, +0.006102f, -0.000195f, +0.000048f}, + {-0.024782f, -0.009783f, -0.004483f, -0.000288f, +0.000009f}, + {+0.063910f, -0.304697f, +0.007623f, +0.000328f, -0.000023f}, + {+0.068609f, +0.100384f, +0.009341f, -0.000091f, -0.000007f}, + {-0.033166f, +0.101342f, -0.001173f, +0.000251f, +0.000026f} + }, + { + {-0.254134f, +0.305063f, -0.036122f, +0.000175f, +0.000012f}, + {-0.313748f, +0.244268f, -0.048706f, -0.000275f, +0.000058f}, + {-0.012267f, +0.112660f, -0.001928f, +0.000238f, +0.000072f}, + {-0.161165f, +0.140763f, -0.024820f, -0.000200f, +0.000054f}, + {-0.090126f, -0.058592f, -0.014503f, -0.000035f, +0.000049f}, + {+0.010917f, +0.042825f, +0.001085f, +0.000524f, +0.000070f}, + {+0.139731f, -0.183781f, +0.020533f, -0.000104f, -0.000047f}, + {-0.056473f, -0.093013f, -0.007395f, +0.000190f, +0.000040f}, + {-0.028362f, +0.108300f, -0.004536f, -0.000507f, -0.000014f} + }, + { + {+0.204108f, -0.397468f, +0.030234f, +0.000284f, -0.000002f}, + {+0.186187f, -0.523327f, +0.027065f, -0.000548f, -0.000002f}, + {+0.063644f, -0.004588f, +0.010914f, +0.000342f, -0.000092f}, + {+0.084172f, -0.238464f, +0.012067f, +0.000307f, -0.000066f}, + {-0.023241f, -0.163547f, -0.001737f, +0.000268f, -0.000061f}, + {+0.017633f, +0.031273f, +0.004558f, +0.000453f, -0.000024f}, + {-0.103701f, +0.192462f, -0.015036f, -0.000326f, +0.000032f}, + {-0.040508f, -0.117502f, -0.005435f, +0.000218f, +0.000003f}, + {+0.044739f, -0.003358f, +0.002673f, -0.000166f, -0.000026f} + }, + { + {+0.217925f, -0.374764f, +0.031310f, -0.000194f, -0.000015f}, + {+0.287194f, -0.371793f, +0.043606f, +0.000298f, -0.000065f}, + {-0.012378f, -0.121133f, -0.001692f, -0.000139f, -0.000076f}, + {+0.138854f, -0.153518f, +0.021173f, +0.000296f, -0.000054f}, + {+0.110078f, +0.041091f, +0.015691f, +0.000117f, -0.000048f}, + {-0.016824f, -0.020994f, -0.002433f, -0.000470f, -0.000080f}, + {-0.093179f, +0.207425f, -0.014155f, +0.000078f, +0.000048f}, + {+0.066586f, +0.047692f, +0.008958f, -0.000170f, -0.000050f}, + {-0.006034f, -0.079321f, +0.001680f, +0.000546f, +0.000014f} + }, + { + {-0.239100f, +0.326388f, -0.035676f, -0.000310f, +0.000005f}, + {-0.254019f, +0.457019f, -0.035395f, +0.000472f, +0.000004f}, + {-0.063172f, -0.043743f, -0.010677f, -0.000446f, +0.000122f}, + {-0.106250f, +0.224976f, -0.016160f, -0.000331f, +0.000087f}, + {-0.006588f, +0.220018f, -0.002089f, -0.000280f, +0.000081f}, + {-0.012847f, -0.026665f, -0.004159f, -0.000613f, +0.000053f}, + {+0.116434f, -0.116659f, +0.017836f, +0.000308f, -0.000043f}, + {+0.014851f, +0.127471f, +0.001839f, -0.000426f, +0.000008f}, + {-0.024363f, -0.047415f, -0.002156f, +0.000076f, +0.000029f} + }, + { + {-0.177651f, +0.419626f, -0.025372f, +0.000189f, +0.000018f}, + {-0.234856f, +0.487730f, -0.036693f, -0.000275f, +0.000076f}, + {+0.036507f, +0.108100f, +0.004077f, -0.000196f, +0.000068f}, + {-0.123472f, +0.198845f, -0.018454f, -0.000539f, +0.000045f}, + {-0.120851f, +0.044023f, -0.017124f, -0.000326f, +0.000038f}, + {+0.019744f, +0.023127f, +0.003003f, +0.000144f, +0.000080f}, + {+0.054985f, -0.211321f, +0.008525f, +0.000002f, -0.000046f}, + {-0.067840f, +0.000644f, -0.008680f, +0.000062f, +0.000059f}, + {+0.013438f, +0.012637f, +0.000624f, -0.000676f, -0.000018f} + }, + { + {+0.265046f, -0.258984f, +0.039613f, +0.000315f, -0.000010f}, + {+0.305263f, -0.341002f, +0.042929f, -0.000320f, -0.000009f}, + {+0.052493f, +0.082191f, +0.010230f, +0.000306f, -0.000162f}, + {+0.135578f, -0.200816f, +0.020288f, +0.000195f, -0.000112f}, + {+0.047909f, -0.214878f, +0.007490f, +0.000138f, -0.000104f}, + {+0.013632f, +0.032324f, +0.004221f, +0.000548f, -0.000093f}, + {-0.118924f, +0.057091f, -0.018445f, -0.000261f, +0.000056f}, + {+0.008331f, -0.114878f, +0.000663f, +0.000507f, -0.000028f}, + {+0.005413f, +0.022808f, -0.000439f, -0.000059f, -0.000035f} + }, + { + {+0.136435f, -0.454829f, +0.019582f, -0.000149f, -0.000018f}, + {+0.168461f, -0.553033f, +0.027068f, +0.000281f, -0.000094f}, + {-0.056383f, -0.088168f, -0.008472f, +0.000590f, -0.000037f}, + {+0.096992f, -0.262712f, +0.013318f, +0.000816f, -0.000021f}, + {+0.110234f, -0.118824f, +0.015813f, +0.000528f, -0.000014f}, + {-0.029948f, -0.036351f, -0.005263f, +0.000282f, -0.000056f}, + {-0.020326f, +0.210405f, -0.002631f, -0.000079f, +0.000039f}, + {+0.060030f, -0.032820f, +0.009213f, +0.000193f, -0.000059f}, + {-0.003943f, +0.005977f, -0.000375f, +0.000898f, +0.000028f} + }, + { + {-0.284355f, +0.190433f, -0.042800f, -0.000266f, +0.000017f}, + {-0.335277f, +0.219226f, -0.046865f, +0.000105f, +0.000022f}, + {-0.036478f, -0.124061f, -0.005694f, +0.000344f, +0.000198f}, + {-0.163243f, +0.134561f, -0.022257f, +0.000183f, +0.000132f}, + {-0.083868f, +0.178051f, -0.011964f, +0.000280f, +0.000122f}, + {-0.010723f, -0.070555f, -0.001815f, +0.000022f, +0.000132f}, + {+0.111861f, +0.009495f, +0.016549f, +0.000135f, -0.000069f}, + {-0.022143f, +0.095016f, -0.003757f, -0.000379f, +0.000052f}, + {-0.000565f, +0.002446f, +0.001442f, +0.000102f, +0.000039f} + }, + { + {-0.095291f, +0.479278f, -0.013467f, +0.000098f, +0.000016f}, + {-0.099306f, +0.582261f, -0.017486f, -0.000468f, +0.000116f}, + {+0.078355f, +0.049439f, +0.008412f, -0.000772f, -0.000023f}, + {-0.051414f, +0.305039f, -0.008849f, -0.000882f, -0.000019f}, + {-0.082995f, +0.177822f, -0.013237f, -0.000567f, -0.000026f}, + {+0.049222f, +0.017872f, +0.004795f, -0.000539f, +0.000005f}, + {-0.011696f, -0.179076f, -0.000545f, +0.000092f, -0.000026f}, + {-0.054786f, +0.044185f, -0.008075f, -0.000456f, +0.000046f}, + {-0.005431f, -0.002236f, -0.000119f, -0.000987f, -0.000046f} + }, + { + {+0.300035f, -0.126686f, +0.045279f, +0.000141f, -0.000023f}, + {+0.347527f, -0.104803f, +0.049661f, +0.000162f, -0.000050f}, + {+0.000140f, +0.170954f, +0.002869f, -0.001398f, -0.000210f}, + {+0.165631f, -0.028348f, +0.023643f, -0.000777f, -0.000136f}, + {+0.103480f, -0.108513f, +0.015479f, -0.000834f, -0.000124f}, + {-0.013480f, +0.114650f, +0.000763f, -0.001025f, -0.000149f}, + {-0.089040f, -0.060481f, -0.014574f, +0.000082f, +0.000079f}, + {+0.036486f, -0.097396f, +0.006421f, +0.000002f, -0.000073f}, + {+0.003333f, -0.016091f, -0.002020f, -0.000329f, -0.000034f} + }, + { + {+0.051566f, -0.506796f, +0.007039f, -0.000099f, -0.000010f}, + {+0.033731f, -0.589122f, +0.007210f, +0.000795f, -0.000134f}, + {-0.079279f, +0.049325f, -0.008393f, +0.000023f, +0.000100f}, + {+0.010994f, -0.265800f, +0.003418f, +0.000397f, +0.000069f}, + {+0.052364f, -0.186418f, +0.009164f, +0.000026f, +0.000073f}, + {-0.052053f, +0.056265f, -0.005015f, -0.000066f, +0.000065f}, + {+0.026200f, +0.116741f, +0.002983f, +0.000008f, +0.000008f}, + {+0.048119f, -0.079713f, +0.006644f, +0.000374f, -0.000021f}, + {+0.010900f, -0.005754f, +0.000987f, +0.000869f, +0.000068f} + }, + { + {-0.311437f, +0.048951f, -0.046976f, +0.000118f, +0.000027f}, + {-0.349598f, -0.000051f, -0.050374f, -0.000038f, +0.000095f}, + {+0.040613f, -0.137831f, -0.000066f, +0.002700f, +0.000181f}, + {-0.149052f, -0.019968f, -0.023093f, +0.001262f, +0.000115f}, + {-0.107473f, +0.058841f, -0.017699f, +0.001256f, +0.000101f}, + {+0.043140f, -0.091871f, +0.000478f, +0.002412f, +0.000129f}, + {+0.064483f, +0.059569f, +0.011301f, -0.000210f, -0.000082f}, + {-0.054255f, +0.077805f, -0.009915f, +0.000915f, +0.000081f}, + {-0.008263f, +0.025078f, +0.001271f, +0.000578f, +0.000014f} + }, + { + {-0.002478f, +0.521278f, -0.000544f, +0.000189f, +0.000002f}, + {+0.031629f, +0.587979f, +0.001886f, -0.001424f, +0.000137f}, + {+0.053320f, -0.118505f, +0.004875f, +0.003174f, -0.000173f}, + {+0.008995f, +0.224389f, +0.001153f, +0.001756f, -0.000113f}, + {-0.029482f, +0.180110f, -0.004281f, +0.002087f, -0.000115f}, + {+0.033134f, -0.107741f, +0.001943f, +0.002753f, -0.000132f}, + {-0.023463f, -0.074570f, -0.002999f, -0.000562f, +0.000011f}, + {-0.031477f, +0.111590f, -0.005933f, +0.000350f, -0.000010f}, + {-0.015016f, +0.015277f, -0.001484f, -0.000128f, -0.000086f} + } +}; + +const float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= +{ + { + {-0.036807f, -0.174045f, +0.179146f, +0.002758f, +0.000002f}, + {-0.081675f, +0.202936f, -0.124120f, -0.000184f, +0.000007f}, + {-0.000843f, -0.038970f, +0.052716f, -0.008143f, +0.000125f}, + {-0.004478f, -0.013122f, +0.028558f, -0.008290f, +0.000045f}, + {-0.006316f, +0.012132f, -0.006515f, +0.002119f, +0.000027f}, + {+0.000794f, -0.004296f, -0.005127f, +0.004942f, -0.000100f}, + {+0.010293f, -0.025048f, +0.008939f, -0.001610f, -0.000015f}, + {-0.001111f, -0.008117f, +0.033872f, -0.002789f, -0.000061f}, + {+0.009292f, -0.031334f, +0.001941f, -0.005137f, +0.000092f} + }, + { + {+0.046648f, -0.328217f, -0.004769f, -0.004729f, +0.000002f}, + {+0.078219f, +0.186706f, -0.335495f, +0.010505f, +0.000011f}, + {+0.003389f, -0.028871f, +0.074809f, -0.001736f, +0.000093f}, + {+0.011160f, -0.006841f, +0.031676f, +0.003121f, +0.000038f}, + {+0.007422f, +0.043414f, -0.006982f, -0.001963f, +0.000025f}, + {+0.003254f, +0.003751f, -0.013792f, +0.005415f, -0.000065f}, + {-0.015187f, -0.099887f, -0.012484f, -0.000245f, -0.000014f}, + {-0.000628f, +0.067594f, +0.116266f, +0.000062f, -0.000037f}, + {-0.017876f, -0.212825f, -0.109502f, -0.000434f, +0.000062f} + }, + { + {-0.062391f, -0.298587f, +0.055506f, +0.004604f, -0.000002f}, + {-0.110139f, -0.008656f, +0.076872f, -0.013912f, -0.000006f}, + {-0.006661f, +0.041459f, +0.008680f, +0.005198f, -0.000143f}, + {-0.017346f, +0.064502f, -0.000311f, +0.000229f, -0.000050f}, + {-0.012574f, +0.112476f, -0.042863f, +0.000548f, -0.000028f}, + {-0.008554f, +0.117685f, -0.085746f, -0.010222f, +0.000121f}, + {+0.018386f, -0.231260f, +0.055470f, +0.002605f, +0.000015f}, + {-0.000043f, +0.098076f, +0.074022f, +0.004739f, +0.000074f}, + {+0.020228f, -0.438516f, +0.026318f, +0.002404f, -0.000109f} + }, + { + {+0.087093f, -0.185047f, -0.039795f, -0.001148f, -0.000002f}, + {+0.179442f, +0.138305f, -0.024941f, +0.004193f, -0.000016f}, + {+0.010153f, +0.053373f, -0.028050f, +0.000631f, -0.000056f}, + {+0.022351f, +0.115243f, -0.015706f, +0.000824f, -0.000030f}, + {+0.016881f, +0.188764f, -0.015179f, +0.001478f, -0.000024f}, + {+0.011436f, +0.169671f, -0.055918f, +0.006134f, +0.000022f}, + {-0.007516f, -0.296099f, +0.030173f, -0.003476f, +0.000013f}, + {+0.001835f, +0.047910f, -0.004611f, -0.005834f, +0.000008f}, + {+0.012183f, -0.522145f, -0.012957f, -0.000556f, -0.000026f} + }, + { + {-0.118429f, +0.036347f, +0.008994f, -0.001813f, +0.000002f}, + {-0.195669f, +0.557237f, +0.044782f, +0.005092f, +0.000007f}, + {-0.015263f, +0.077237f, -0.016810f, -0.004030f, +0.000145f}, + {-0.025184f, +0.187315f, -0.016739f, -0.002009f, +0.000052f}, + {-0.002368f, +0.225780f, -0.012360f, -0.001921f, +0.000030f}, + {-0.004974f, +0.160969f, -0.009969f, -0.002830f, -0.000125f}, + {-0.023306f, -0.243341f, -0.007075f, +0.002049f, -0.000015f}, + {+0.002539f, +0.043064f, -0.021665f, +0.000872f, -0.000074f}, + {-0.088704f, -0.392340f, -0.007003f, +0.000682f, +0.000110f} + }, + { + {+0.111405f, +0.324593f, -0.000106f, +0.001284f, +0.000002f}, + {+0.051589f, +0.868735f, -0.017996f, -0.003263f, +0.000021f}, + {+0.016644f, +0.116184f, -0.001320f, +0.001603f, +0.000021f}, + {+0.004222f, +0.242602f, +0.004139f, +0.000694f, +0.000023f}, + {-0.043767f, +0.191695f, +0.013679f, +0.000447f, +0.000023f}, + {-0.015164f, +0.134423f, +0.000808f, +0.001816f, +0.000022f}, + {+0.056350f, -0.114712f, -0.004403f, +0.000262f, -0.000013f}, + {-0.013985f, +0.017892f, -0.014819f, +0.002850f, +0.000020f}, + {+0.155162f, -0.041775f, -0.009744f, -0.001067f, -0.000007f} + }, + { + {-0.005031f, +0.479299f, +0.003719f, +0.000668f, -0.000001f}, + {+0.200078f, +0.617927f, +0.007665f, -0.002820f, -0.000011f}, + {-0.000023f, +0.128657f, +0.013087f, +0.000664f, -0.000135f}, + {+0.058851f, +0.171528f, +0.001838f, +0.000874f, -0.000052f}, + {+0.096474f, +0.013567f, +0.000492f, +0.000745f, -0.000033f}, + {+0.033027f, +0.054815f, +0.011873f, +0.000718f, +0.000112f}, + {-0.056173f, +0.039930f, +0.001299f, -0.001259f, +0.000015f}, + {+0.020372f, -0.043296f, +0.005705f, -0.001029f, +0.000062f}, + {-0.120615f, +0.346286f, -0.013057f, -0.000997f, -0.000098f} + }, + { + {-0.150793f, +0.255763f, -0.018096f, -0.000700f, -0.000003f}, + {-0.305707f, -0.158732f, -0.020717f, +0.002646f, -0.000023f}, + {-0.031522f, +0.078751f, +0.001465f, -0.000649f, +0.000004f}, + {-0.117107f, -0.077176f, -0.004724f, -0.000677f, -0.000018f}, + {-0.093448f, -0.250387f, -0.003900f, -0.000293f, -0.000021f}, + {-0.019351f, -0.028793f, -0.005286f, -0.001746f, -0.000057f}, + {+0.008202f, +0.128064f, +0.008788f, +0.000321f, +0.000014f}, + {-0.007910f, -0.090056f, -0.001122f, -0.000874f, -0.000041f}, + {-0.028598f, +0.475838f, +0.000814f, +0.001596f, +0.000033f} + }, + { + {+0.168446f, -0.229619f, +0.014684f, -0.000669f, +0.000001f}, + {+0.083028f, -0.735157f, +0.014942f, +0.001813f, +0.000016f}, + {+0.038009f, -0.019540f, -0.002379f, +0.000167f, +0.000118f}, + {+0.076227f, -0.357687f, +0.003886f, -0.000171f, +0.000051f}, + {+0.001844f, -0.389834f, +0.002086f, -0.000484f, +0.000036f}, + {-0.023047f, -0.027798f, -0.004234f, -0.000497f, -0.000086f}, + {+0.049557f, +0.071524f, +0.006302f, +0.000906f, -0.000015f}, + {-0.020459f, -0.071010f, -0.006011f, -0.000277f, -0.000043f}, + {+0.164709f, +0.192774f, +0.015494f, +0.000611f, +0.000078f} + }, + { + {+0.032104f, -0.431950f, +0.008160f, +0.000726f, +0.000004f}, + {+0.260971f, -0.444113f, +0.025794f, -0.002256f, +0.000023f}, + {+0.008385f, -0.056100f, +0.003103f, +0.000095f, -0.000018f}, + {+0.067113f, -0.367438f, +0.006254f, +0.000198f, +0.000013f}, + {+0.110994f, -0.232179f, +0.008226f, +0.000230f, +0.000019f}, + {+0.042146f, +0.074633f, +0.011186f, +0.001034f, +0.000080f}, + {-0.054919f, -0.080526f, -0.007215f, -0.000649f, -0.000015f}, + {+0.040307f, +0.016321f, -0.001764f, +0.000829f, +0.000052f}, + {-0.137526f, -0.246324f, -0.007988f, -0.001200f, -0.000047f} + }, + { + {-0.213011f, -0.046980f, -0.025382f, +0.000494f, -0.000002f}, + {-0.288608f, +0.395114f, -0.041290f, -0.001283f, -0.000020f}, + {-0.054132f, +0.049386f, -0.007328f, -0.000057f, -0.000101f}, + {-0.158872f, -0.025219f, -0.014949f, +0.000114f, -0.000051f}, + {-0.121403f, +0.113923f, -0.010204f, +0.000233f, -0.000039f}, + {-0.000083f, +0.147208f, +0.001729f, +0.000936f, +0.000054f}, + {-0.003048f, -0.154788f, -0.006001f, -0.000457f, +0.000017f}, + {-0.025771f, +0.106681f, +0.002198f, +0.000260f, +0.000022f}, + {-0.031294f, -0.392095f, -0.012018f, -0.000574f, -0.000057f} + }, + { + {+0.092561f, +0.424974f, +0.010810f, -0.000681f, -0.000004f}, + {-0.075902f, +0.706014f, -0.007828f, +0.002003f, -0.000022f}, + {+0.013154f, +0.161409f, +0.005603f, -0.000211f, +0.000023f}, + {+0.066254f, +0.312283f, +0.004744f, +0.000026f, -0.000009f}, + {+0.002036f, +0.295824f, -0.002824f, +0.000014f, -0.000016f}, + {-0.060712f, +0.057606f, -0.008012f, -0.000958f, -0.000087f}, + {+0.056082f, -0.061636f, +0.008052f, +0.000524f, +0.000016f}, + {-0.017683f, +0.111805f, -0.002642f, -0.000403f, -0.000052f}, + {+0.146777f, -0.113700f, +0.017959f, +0.001010f, +0.000051f} + }, + { + {+0.185320f, +0.277358f, +0.022712f, -0.000351f, +0.000003f}, + {+0.344646f, +0.053912f, +0.053141f, +0.000939f, +0.000024f}, + {+0.086838f, +0.051841f, +0.006637f, +0.000180f, +0.000089f}, + {+0.105953f, +0.243944f, +0.014187f, -0.000146f, +0.000052f}, + {+0.111669f, +0.123210f, +0.013173f, -0.000233f, +0.000042f}, + {+0.059758f, -0.131270f, +0.005702f, -0.000643f, -0.000024f}, + {-0.036902f, +0.080134f, -0.000673f, +0.000325f, -0.000020f}, + {+0.046052f, +0.010828f, +0.004846f, -0.000246f, -0.000004f}, + {-0.077354f, +0.231910f, -0.006126f, +0.000362f, +0.000039f} + }, + { + {-0.189874f, -0.302002f, -0.024437f, +0.000614f, +0.000004f}, + {-0.115695f, -0.648554f, -0.017187f, -0.001787f, +0.000020f}, + {-0.095557f, -0.230274f, -0.014609f, +0.000114f, -0.000025f}, + {-0.124579f, -0.115101f, -0.017138f, -0.000088f, +0.000005f}, + {-0.076830f, -0.166427f, -0.008366f, -0.000057f, +0.000012f}, + {+0.014099f, -0.211406f, -0.003003f, +0.000568f, +0.000083f}, + {-0.023815f, +0.096932f, -0.005676f, -0.000440f, -0.000016f}, + {-0.021782f, -0.093860f, -0.002871f, +0.000144f, +0.000046f}, + {-0.073734f, +0.238033f, -0.010094f, -0.000798f, -0.000049f} + }, + { + {-0.114426f, -0.412169f, -0.014852f, +0.000236f, -0.000004f}, + {-0.286060f, -0.383093f, -0.046192f, -0.000709f, -0.000026f}, + {-0.046449f, -0.312275f, +0.001217f, -0.000173f, -0.000081f}, + {-0.033813f, -0.256375f, -0.003843f, +0.000097f, -0.000052f}, + {-0.058368f, -0.191934f, -0.007694f, +0.000156f, -0.000044f}, + {-0.082552f, -0.075789f, -0.001514f, +0.000419f, +0.000001f}, + {+0.034473f, +0.003962f, +0.003250f, -0.000222f, +0.000024f}, + {-0.030695f, -0.079541f, -0.002956f, +0.000205f, -0.000008f}, + {+0.109333f, -0.044153f, +0.010252f, -0.000221f, -0.000027f} + }, + { + {+0.243812f, +0.144409f, +0.034010f, -0.000542f, -0.000004f}, + {+0.244934f, +0.430481f, +0.034506f, +0.001609f, -0.000017f}, + {+0.170812f, +0.012823f, +0.017960f, -0.000055f, +0.000026f}, + {+0.131633f, -0.001407f, +0.017629f, +0.000130f, -0.000001f}, + {+0.106876f, +0.065820f, +0.014688f, +0.000058f, -0.000007f}, + {+0.074279f, +0.153828f, +0.004932f, -0.000344f, -0.000072f}, + {+0.015569f, -0.022714f, +0.005207f, +0.000342f, +0.000015f}, + {+0.042274f, +0.032502f, +0.005140f, -0.000141f, -0.000036f}, + {-0.002837f, -0.214678f, +0.001786f, +0.000703f, +0.000045f} + }, + { + {+0.033445f, +0.465385f, +0.003356f, -0.000154f, +0.000005f}, + {+0.178742f, +0.528051f, +0.033152f, +0.000550f, +0.000028f}, + {-0.087971f, +0.405281f, -0.012908f, +0.000193f, +0.000076f}, + {-0.026721f, +0.243121f, -0.004203f, -0.000014f, +0.000052f}, + {-0.002076f, +0.236562f, -0.002162f, -0.000025f, +0.000045f}, + {-0.002032f, +0.267039f, -0.003164f, -0.000247f, +0.000013f}, + {-0.028517f, +0.053584f, -0.006240f, +0.000168f, -0.000027f}, + {+0.008947f, +0.081105f, +0.001162f, -0.000039f, +0.000013f}, + {-0.084445f, -0.084241f, -0.009779f, +0.000091f, +0.000019f} + }, + { + {-0.265151f, +0.001033f, -0.038066f, +0.000492f, +0.000004f}, + {-0.302075f, -0.213979f, -0.045228f, -0.001475f, +0.000016f}, + {-0.119858f, +0.361574f, -0.010750f, +0.000044f, -0.000027f}, + {-0.110652f, +0.115838f, -0.014030f, -0.000216f, -0.000003f}, + {-0.106693f, +0.078792f, -0.012412f, -0.000130f, +0.000002f}, + {-0.068216f, +0.174315f, -0.001858f, +0.000344f, +0.000061f}, + {-0.039397f, +0.042700f, -0.003620f, -0.000322f, -0.000013f}, + {-0.052577f, -0.019393f, -0.009859f, +0.000138f, +0.000029f}, + {+0.042907f, +0.113552f, +0.005000f, -0.000638f, -0.000041f} + }, + { + {+0.045692f, -0.476580f, +0.008546f, +0.000086f, -0.000005f}, + {-0.080587f, -0.555433f, -0.017854f, -0.000450f, -0.000030f}, + {+0.182440f, -0.087182f, +0.017382f, -0.000294f, -0.000073f}, + {+0.075234f, -0.167476f, +0.008676f, +0.000034f, -0.000051f}, + {+0.071029f, -0.192007f, +0.008454f, +0.000011f, -0.000045f}, + {+0.086510f, -0.044174f, +0.003825f, +0.000041f, -0.000021f}, + {+0.075632f, -0.138240f, +0.011735f, -0.000028f, +0.000030f}, + {+0.013949f, -0.129305f, +0.005892f, -0.000040f, -0.000013f}, + {+0.045386f, +0.105892f, +0.005725f, +0.000024f, -0.000013f} + }, + { + {+0.264038f, -0.137768f, +0.037820f, -0.000452f, -0.000003f}, + {+0.327432f, +0.075214f, +0.050477f, +0.001428f, -0.000014f}, + {-0.022770f, -0.385123f, +0.004729f, +0.000100f, +0.000029f}, + {+0.054670f, -0.198426f, +0.007785f, +0.000271f, +0.000006f}, + {+0.049580f, -0.225410f, +0.005863f, +0.000204f, +0.000001f}, + {-0.043237f, -0.226727f, +0.000581f, -0.000235f, -0.000054f}, + {+0.021121f, -0.232475f, -0.003318f, +0.000194f, +0.000010f}, + {+0.068959f, -0.050792f, +0.006419f, -0.000075f, -0.000026f}, + {-0.050269f, -0.045913f, -0.008553f, +0.000508f, +0.000038f} + }, + { + {-0.122605f, +0.455832f, -0.019204f, -0.000024f, +0.000005f}, + {-0.006912f, +0.595107f, +0.002722f, +0.000314f, +0.000031f}, + {-0.131648f, -0.207572f, -0.020072f, +0.000119f, +0.000071f}, + {-0.075587f, -0.001389f, -0.007880f, -0.000200f, +0.000051f}, + {-0.092628f, -0.010795f, -0.009442f, -0.000210f, +0.000045f}, + {-0.034470f, -0.235595f, -0.004153f, -0.000184f, +0.000026f}, + {-0.138101f, +0.003560f, -0.013139f, +0.000044f, -0.000033f}, + {-0.076887f, +0.172735f, -0.011353f, -0.000186f, +0.000014f}, + {-0.018601f, -0.096133f, -0.000488f, -0.000002f, +0.000009f} + }, + { + {-0.239360f, +0.273817f, -0.034391f, +0.000359f, +0.000003f}, + {-0.344438f, +0.077598f, -0.050391f, -0.001368f, +0.000013f}, + {+0.085915f, +0.127791f, +0.009171f, +0.000053f, -0.000030f}, + {-0.003884f, +0.104668f, -0.002926f, -0.000117f, -0.000009f}, + {+0.025938f, +0.166624f, +0.001223f, +0.000030f, -0.000004f}, + {+0.087357f, -0.053855f, +0.006567f, +0.000375f, +0.000050f}, + {+0.079989f, +0.335328f, +0.010537f, -0.000213f, -0.000007f}, + {-0.027119f, +0.254717f, +0.001273f, +0.000328f, +0.000025f}, + {+0.049245f, +0.007836f, +0.007008f, -0.000515f, -0.000036f} + }, + { + {+0.189098f, -0.383414f, +0.028124f, +0.000092f, -0.000006f}, + {+0.108559f, -0.623832f, +0.013156f, -0.000170f, -0.000033f}, + {+0.052357f, +0.172914f, +0.014590f, -0.000154f, -0.000071f}, + {+0.027066f, +0.057228f, +0.004014f, +0.000183f, -0.000051f}, + {+0.042915f, +0.138441f, +0.007131f, +0.000079f, -0.000046f}, + {-0.062416f, +0.169373f, -0.002459f, +0.000150f, -0.000033f}, + {+0.109725f, +0.292825f, +0.008449f, +0.000038f, +0.000034f}, + {+0.124357f, +0.027929f, +0.015491f, +0.000061f, -0.000016f}, + {-0.001095f, +0.082699f, -0.001391f, +0.000112f, -0.000006f} + }, + { + {+0.194740f, -0.370983f, +0.028830f, -0.000424f, -0.000003f}, + {+0.334444f, -0.280705f, +0.047056f, +0.001250f, -0.000011f}, + {-0.070560f, -0.024714f, -0.010185f, -0.000110f, +0.000033f}, + {+0.007889f, +0.031645f, +0.004166f, +0.000046f, +0.000012f}, + {-0.044996f, +0.004394f, -0.003024f, -0.000024f, +0.000007f}, + {-0.022525f, +0.227369f, -0.001642f, -0.000313f, -0.000046f}, + {-0.165185f, -0.117904f, -0.015701f, +0.000142f, +0.000004f}, + {-0.080987f, -0.285489f, -0.008434f, -0.000232f, -0.000025f}, + {-0.049085f, +0.003557f, -0.010651f, +0.000401f, +0.000034f} + }, + { + {-0.234674f, +0.289561f, -0.036001f, +0.000013f, +0.000007f}, + {-0.223672f, +0.578241f, -0.027233f, +0.000092f, +0.000035f}, + {-0.024623f, -0.100323f, -0.004564f, +0.000328f, +0.000072f}, + {+0.017801f, +0.020633f, -0.002076f, -0.000042f, +0.000053f}, + {+0.013115f, -0.081785f, -0.000959f, +0.000079f, +0.000049f}, + {+0.080738f, +0.072886f, +0.004201f, -0.000076f, +0.000042f}, + {-0.002607f, -0.352196f, -0.003911f, -0.000017f, -0.000036f}, + {-0.069172f, -0.307620f, -0.004866f, -0.000006f, +0.000021f}, + {+0.028180f, -0.122432f, +0.007621f, -0.000085f, +0.000003f} + }, + { + {-0.147199f, +0.422160f, -0.022071f, +0.000321f, +0.000003f}, + {-0.267023f, +0.513414f, -0.037707f, -0.001150f, +0.000010f}, + {+0.060495f, +0.031583f, +0.008763f, -0.000093f, -0.000037f}, + {-0.065578f, -0.105960f, -0.010002f, -0.000209f, -0.000017f}, + {+0.014195f, -0.075807f, +0.002631f, -0.000201f, -0.000012f}, + {-0.053647f, -0.122427f, -0.002638f, +0.000093f, +0.000039f}, + {+0.142781f, -0.115711f, +0.024592f, -0.000188f, -0.000001f}, + {+0.149590f, +0.020216f, +0.015264f, -0.000015f, +0.000023f}, + {+0.037239f, -0.118872f, +0.000382f, -0.000458f, -0.000033f} + }, + { + {+0.269441f, -0.218896f, +0.041241f, +0.000004f, -0.000008f}, + {+0.303693f, -0.362352f, +0.037014f, -0.000053f, -0.000037f}, + {+0.007833f, +0.119694f, -0.000960f, -0.000345f, -0.000073f}, + {-0.004355f, -0.200633f, +0.001490f, +0.000103f, -0.000055f}, + {-0.032562f, +0.000305f, -0.004514f, +0.000019f, -0.000051f}, + {-0.017941f, -0.163230f, -0.007036f, +0.000034f, -0.000051f}, + {-0.046904f, +0.177005f, -0.004300f, +0.000147f, +0.000038f}, + {-0.058069f, +0.331227f, -0.002327f, +0.000118f, -0.000026f}, + {-0.065673f, +0.027120f, -0.006378f, +0.000220f, -0.000001f} + }, + { + {+0.096520f, -0.484461f, +0.013741f, -0.000314f, -0.000002f}, + {+0.168182f, -0.564851f, +0.028399f, +0.001136f, -0.000010f}, + {-0.055680f, +0.028246f, -0.005855f, +0.000184f, +0.000045f}, + {+0.118738f, -0.014371f, +0.012220f, +0.000155f, +0.000023f}, + {+0.022063f, +0.085271f, +0.002211f, +0.000137f, +0.000019f}, + {+0.049978f, -0.052230f, +0.005756f, +0.000013f, -0.000028f}, + {-0.111748f, +0.067754f, -0.020811f, +0.000056f, -0.000003f}, + {-0.098929f, +0.266647f, -0.009254f, +0.000013f, -0.000019f}, + {+0.022954f, +0.155435f, -0.001383f, +0.000344f, +0.000033f} + }, + { + {-0.298102f, +0.119927f, -0.044074f, +0.000054f, +0.000009f}, + {-0.324241f, +0.201048f, -0.044886f, -0.000061f, +0.000040f}, + {+0.018875f, -0.083814f, -0.000418f, +0.000398f, +0.000073f}, + {-0.061162f, +0.256472f, -0.008387f, +0.000024f, +0.000055f}, + {+0.028563f, +0.073381f, +0.002819f, +0.000106f, +0.000051f}, + {-0.019828f, +0.052279f, -0.002320f, +0.000130f, +0.000057f}, + {+0.058477f, -0.203321f, +0.012650f, -0.000104f, -0.000040f}, + {+0.133242f, -0.084836f, +0.013242f, -0.000015f, +0.000030f}, + {+0.042678f, +0.121577f, +0.007398f, -0.000185f, -0.000002f} + }, + { + {-0.034897f, +0.521904f, -0.005636f, +0.000275f, +0.000001f}, + {-0.096022f, +0.555951f, -0.014099f, -0.001080f, +0.000009f}, + {+0.022232f, -0.076542f, +0.003659f, -0.000139f, -0.000053f}, + {-0.117964f, +0.166708f, -0.014124f, -0.000190f, -0.000030f}, + {-0.054876f, -0.054232f, -0.005942f, -0.000155f, -0.000026f}, + {-0.020865f, +0.046834f, -0.005114f, -0.000034f, +0.000016f}, + {+0.119090f, -0.116285f, +0.014688f, -0.000066f, +0.000006f}, + {-0.009162f, -0.296851f, +0.001585f, -0.000015f, +0.000013f}, + {-0.057034f, -0.032243f, -0.004358f, -0.000329f, -0.000032f} + }, + { + {+0.309227f, -0.006599f, +0.046261f, -0.000088f, -0.000010f}, + {+0.335689f, -0.108899f, +0.045170f, +0.000116f, -0.000044f}, + {-0.010768f, -0.025357f, +0.000938f, -0.000529f, -0.000070f}, + {+0.120101f, -0.199389f, +0.018645f, -0.000027f, -0.000054f}, + {-0.005167f, -0.128785f, +0.000940f, -0.000138f, -0.000050f}, + {+0.023264f, -0.025419f, +0.006527f, -0.000284f, -0.000058f}, + {-0.107846f, +0.228561f, -0.015701f, +0.000136f, +0.000041f}, + {-0.112356f, -0.131761f, -0.015190f, -0.000104f, -0.000031f}, + {+0.003668f, -0.126548f, +0.000034f, +0.000218f, +0.000005f} + }, + { + {-0.027502f, -0.522603f, -0.003411f, -0.000264f, -0.000000f}, + {+0.030738f, -0.578245f, +0.004213f, +0.001069f, -0.000007f}, + {-0.000609f, -0.013454f, -0.002363f, +0.000076f, +0.000061f}, + {+0.087398f, -0.248212f, +0.011938f, +0.000075f, +0.000037f}, + {+0.076224f, -0.003106f, +0.010057f, +0.000063f, +0.000032f}, + {+0.005937f, -0.057510f, +0.000360f, -0.000077f, -0.000005f}, + {-0.095342f, +0.246056f, -0.013136f, +0.000057f, -0.000011f}, + {+0.080706f, +0.167833f, +0.010054f, +0.000007f, -0.000008f}, + {+0.052615f, -0.051218f, +0.005205f, +0.000238f, +0.000032f} + }, + { + {-0.304352f, -0.097670f, -0.045722f, +0.000119f, +0.000010f}, + {-0.340086f, -0.006265f, -0.046602f, -0.000169f, +0.000048f}, + {-0.020424f, +0.011099f, -0.001667f, +0.000571f, +0.000066f}, + {-0.162423f, +0.138866f, -0.025027f, +0.000093f, +0.000052f}, + {-0.033809f, +0.166438f, -0.006399f, +0.000195f, +0.000048f}, + {-0.027146f, -0.011761f, -0.003177f, +0.000395f, +0.000056f}, + {+0.155957f, -0.140724f, +0.023139f, -0.000149f, -0.000042f}, + {+0.050658f, +0.213522f, +0.006115f, +0.000088f, +0.000030f}, + {-0.039762f, +0.093271f, -0.004720f, -0.000234f, -0.000009f} + }, + { + {+0.084174f, +0.498153f, +0.011738f, +0.000258f, -0.000001f}, + {+0.034060f, +0.568731f, +0.004971f, -0.001035f, +0.000004f}, + {+0.017008f, +0.063888f, +0.000389f, +0.000004f, -0.000066f}, + {-0.040634f, +0.328420f, -0.004057f, -0.000038f, -0.000042f}, + {-0.073934f, +0.106271f, -0.009079f, -0.000021f, -0.000038f}, + {+0.016227f, +0.051899f, -0.000373f, +0.000148f, -0.000001f}, + {+0.040260f, -0.318605f, +0.006025f, -0.000077f, +0.000015f}, + {-0.100959f, -0.021877f, -0.014425f, +0.000114f, +0.000006f}, + {-0.027106f, +0.113757f, -0.001462f, -0.000158f, -0.000030f} + }, + { + {+0.289347f, +0.183367f, +0.043677f, -0.000132f, -0.000010f}, + {+0.332610f, +0.106477f, +0.046382f, +0.000181f, -0.000052f}, + {+0.030172f, +0.040872f, +0.005239f, -0.000542f, -0.000065f}, + {+0.188712f, -0.022024f, +0.026128f, -0.000084f, -0.000051f}, + {+0.071871f, -0.114351f, +0.009162f, -0.000197f, -0.000047f}, + {+0.013433f, +0.054663f, +0.003535f, -0.000343f, -0.000057f}, + {-0.178475f, +0.017894f, -0.025738f, +0.000205f, +0.000044f}, + {+0.010117f, -0.193309f, +0.001195f, -0.000079f, -0.000031f}, + {+0.059297f, -0.019649f, +0.006335f, +0.000285f, +0.000013f} + }, + { + {-0.134846f, -0.467842f, -0.019524f, -0.000244f, +0.000001f}, + {-0.092222f, -0.547291f, -0.014252f, +0.000986f, -0.000001f}, + {-0.040107f, -0.068680f, -0.004663f, +0.000023f, +0.000071f}, + {-0.024493f, -0.346874f, -0.002774f, +0.000070f, +0.000048f}, + {+0.047272f, -0.147189f, +0.008626f, +0.000053f, +0.000044f}, + {-0.026008f, -0.007599f, -0.001975f, -0.000132f, +0.000005f}, + {+0.030534f, +0.339732f, +0.003406f, +0.000035f, -0.000020f}, + {+0.083347f, -0.077557f, +0.013266f, -0.000128f, -0.000007f}, + {-0.013672f, -0.131388f, -0.003403f, +0.000118f, +0.000027f} + }, + { + {-0.267902f, -0.264872f, -0.040046f, +0.000129f, +0.000011f}, + {-0.321912f, -0.191063f, -0.044992f, -0.000193f, +0.000056f}, + {-0.022572f, -0.096725f, -0.002705f, +0.000503f, +0.000069f}, + {-0.176343f, -0.111752f, -0.025706f, +0.000048f, +0.000053f}, + {-0.084811f, +0.059741f, -0.013684f, +0.000183f, +0.000048f}, + {+0.004452f, -0.055305f, -0.000514f, +0.000261f, +0.000064f}, + {+0.161895f, +0.139155f, +0.022695f, -0.000241f, -0.000046f}, + {-0.046966f, +0.125238f, -0.006695f, +0.000013f, +0.000036f}, + {-0.046666f, -0.080465f, -0.004500f, -0.000378f, -0.000014f} + }, + { + {+0.182763f, +0.425959f, +0.026111f, +0.000216f, -0.000001f}, + {+0.151967f, +0.538951f, +0.023953f, -0.000917f, -0.000002f}, + {+0.059967f, +0.029780f, +0.006750f, -0.000233f, -0.000082f}, + {+0.071926f, +0.268254f, +0.009365f, -0.000173f, -0.000058f}, + {-0.030147f, +0.144364f, -0.004637f, -0.000155f, -0.000054f}, + {+0.022610f, -0.026139f, +0.001896f, -0.000081f, -0.000015f}, + {-0.089140f, -0.244883f, -0.010242f, +0.000037f, +0.000027f}, + {-0.053982f, +0.112441f, -0.009466f, +0.000027f, +0.000006f}, + {+0.043125f, +0.054784f, +0.006054f, -0.000118f, -0.000026f} + }, + { + {+0.236555f, +0.344253f, +0.035451f, -0.000140f, -0.000014f}, + {+0.305017f, +0.302445f, +0.041503f, +0.000225f, -0.000061f}, + {+0.000099f, +0.121249f, +0.000347f, -0.000531f, -0.000075f}, + {+0.147839f, +0.147624f, +0.023593f, -0.000074f, -0.000055f}, + {+0.099074f, -0.056676f, +0.015836f, -0.000238f, -0.000049f}, + {-0.015365f, +0.033058f, -0.001023f, -0.000263f, -0.000075f}, + {-0.115117f, -0.202631f, -0.018500f, +0.000266f, +0.000048f}, + {+0.062522f, -0.070317f, +0.009998f, +0.000023f, -0.000045f}, + {+0.009357f, +0.103095f, +0.001665f, +0.000461f, +0.000014f} + }, + { + {-0.223414f, -0.360443f, -0.031653f, -0.000161f, +0.000003f}, + {-0.220330f, -0.504684f, -0.033230f, +0.000874f, +0.000003f}, + {-0.065668f, +0.018345f, -0.008069f, +0.000490f, +0.000105f}, + {-0.094224f, -0.228227f, -0.015610f, +0.000296f, +0.000075f}, + {+0.011044f, -0.195618f, -0.000221f, +0.000284f, +0.000070f}, + {-0.015206f, +0.030774f, -0.001584f, +0.000377f, +0.000037f}, + {+0.112319f, +0.149909f, +0.015570f, -0.000082f, -0.000037f}, + {+0.027593f, -0.125221f, +0.004605f, +0.000167f, +0.000001f}, + {-0.035657f, +0.033761f, -0.006506f, +0.000132f, +0.000027f} + }, + { + {-0.197435f, -0.400152f, -0.030189f, +0.000183f, +0.000017f}, + {-0.265346f, -0.433349f, -0.035911f, -0.000309f, +0.000070f}, + {+0.024825f, -0.121781f, +0.003662f, +0.000791f, +0.000075f}, + {-0.131639f, -0.172895f, -0.018896f, +0.000200f, +0.000051f}, + {-0.118431f, +0.000422f, -0.015867f, +0.000387f, +0.000045f}, + {+0.018068f, -0.023258f, +0.002724f, +0.000522f, +0.000082f}, + {+0.072974f, +0.212278f, +0.011511f, -0.000340f, -0.000047f}, + {-0.068530f, +0.023641f, -0.010358f, +0.000042f, +0.000055f}, + {+0.013236f, -0.038962f, +0.000910f, -0.000477f, -0.000015f} + }, + { + {+0.253363f, +0.291660f, +0.036499f, +0.000094f, -0.000007f}, + {+0.281798f, +0.406628f, +0.041589f, -0.000891f, -0.000005f}, + {+0.059479f, -0.066959f, +0.007177f, -0.000628f, -0.000142f}, + {+0.120109f, +0.213729f, +0.018705f, -0.000288f, -0.000099f}, + {+0.027666f, +0.223189f, +0.003521f, -0.000300f, -0.000093f}, + {+0.013844f, -0.028875f, +0.000557f, -0.000575f, -0.000072f}, + {-0.118976f, -0.083818f, -0.016708f, +0.000094f, +0.000049f}, + {-0.002209f, +0.126405f, -0.000845f, -0.000338f, -0.000017f}, + {+0.011760f, -0.039638f, +0.005259f, -0.000091f, -0.000032f} + }, + { + {+0.156753f, +0.440657f, +0.023910f, -0.000253f, -0.000018f}, + {+0.203795f, +0.522732f, +0.028158f, +0.000411f, -0.000085f}, + {-0.046218f, +0.097129f, -0.007205f, -0.001249f, -0.000056f}, + {+0.112467f, +0.226687f, +0.015571f, -0.000451f, -0.000035f}, + {+0.117838f, +0.083303f, +0.016703f, -0.000616f, -0.000028f}, + {-0.023412f, +0.030837f, -0.004021f, -0.001018f, -0.000071f}, + {-0.037437f, -0.211830f, -0.005723f, +0.000467f, +0.000043f}, + {+0.064323f, +0.023579f, +0.009934f, -0.000232f, -0.000060f}, + {-0.009156f, -0.006104f, -0.001969f, +0.000387f, +0.000022f} + }, + { + {-0.275944f, -0.222761f, -0.039627f, -0.000066f, +0.000013f}, + {-0.322019f, -0.286370f, -0.048482f, +0.000959f, +0.000014f}, + {-0.046923f, +0.094317f, -0.005599f, +0.000435f, +0.000182f}, + {-0.150750f, -0.177020f, -0.022662f, +0.000117f, +0.000123f}, + {-0.067347f, -0.202691f, -0.009894f, +0.000124f, +0.000115f}, + {-0.015081f, +0.042971f, -0.000082f, +0.000445f, +0.000114f}, + {+0.117640f, +0.025700f, +0.015946f, -0.000085f, -0.000063f}, + {-0.016418f, -0.100980f, -0.001676f, +0.000298f, +0.000040f}, + {-0.000250f, +0.010429f, -0.002435f, -0.000017f, +0.000037f} + }, + { + {-0.115447f, -0.469158f, -0.017950f, +0.000366f, +0.000017f}, + {-0.134884f, -0.571706f, -0.018454f, -0.000373f, +0.000105f}, + {+0.067420f, -0.084270f, +0.010575f, +0.001650f, +0.000010f}, + {-0.076003f, -0.293259f, -0.009993f, +0.000579f, +0.000003f}, + {-0.098520f, -0.155744f, -0.013412f, +0.000754f, -0.000004f}, + {+0.039536f, -0.043110f, +0.005899f, +0.001509f, +0.000034f}, + {+0.003041f, +0.203039f, +0.001212f, -0.000536f, -0.000033f}, + {-0.056528f, -0.038194f, -0.009590f, +0.000577f, +0.000054f}, + {-0.001245f, +0.013315f, +0.000319f, -0.000346f, -0.000036f} + }, + { + {+0.292999f, +0.157930f, +0.042403f, +0.000087f, -0.000020f}, + {+0.342354f, +0.162255f, +0.051635f, -0.001110f, -0.000034f}, + {+0.022156f, -0.154740f, +0.000608f, +0.000173f, -0.000208f}, + {+0.168151f, +0.078549f, +0.023857f, +0.000280f, -0.000137f}, + {+0.096594f, +0.143573f, +0.013193f, +0.000234f, -0.000126f}, + {+0.002506f, -0.100103f, -0.002757f, +0.000120f, -0.000144f}, + {-0.102496f, +0.041774f, -0.013753f, -0.000024f, +0.000074f}, + {+0.028733f, +0.095250f, +0.004398f, -0.000056f, -0.000064f}, + {-0.000053f, +0.012400f, +0.002539f, +0.000289f, -0.000038f} + }, + { + {+0.073802f, +0.495430f, +0.011185f, -0.000471f, -0.000013f}, + {+0.067107f, +0.583553f, +0.008494f, +0.000150f, -0.000126f}, + {-0.082122f, +0.004027f, -0.011237f, -0.001551f, +0.000060f}, + {+0.028928f, +0.288941f, +0.005398f, -0.000320f, +0.000043f}, + {+0.067365f, +0.187138f, +0.009613f, -0.000522f, +0.000049f}, + {-0.053548f, -0.014546f, -0.006738f, -0.001557f, +0.000028f}, + {+0.021691f, -0.148588f, +0.001549f, +0.000530f, +0.000018f}, + {+0.052283f, +0.060853f, +0.007887f, -0.000799f, -0.000034f}, + {+0.008489f, -0.003383f, +0.001566f, +0.000494f, +0.000057f} + }, + { + {-0.307330f, -0.088798f, -0.043952f, -0.000185f, +0.000025f}, + {-0.348741f, -0.055377f, -0.052852f, +0.001109f, +0.000070f}, + {+0.020133f, +0.157206f, +0.002804f, -0.000807f, +0.000201f}, + {-0.157718f, +0.000354f, -0.025108f, -0.000577f, +0.000129f}, + {-0.107002f, -0.082667f, -0.016074f, -0.000429f, +0.000116f}, + {+0.027699f, +0.106463f, +0.004855f, -0.000830f, +0.000144f}, + {+0.076446f, -0.063154f, +0.011339f, +0.000105f, -0.000081f}, + {-0.046001f, -0.090381f, -0.006439f, -0.000517f, +0.000079f}, + {-0.003916f, -0.020923f, -0.003928f, -0.000676f, +0.000026f} + }, + { + {-0.027283f, -0.518967f, -0.004482f, +0.000531f, +0.000006f}, + {-0.002104f, -0.586753f, +0.000310f, +0.000388f, +0.000138f}, + {+0.067195f, +0.083021f, +0.013467f, -0.000261f, -0.000139f}, + {+0.000203f, -0.242050f, +0.002218f, -0.001130f, -0.000092f}, + {-0.041057f, -0.183900f, -0.003084f, -0.000869f, -0.000096f}, + {+0.043480f, +0.079977f, +0.008525f, +0.000104f, -0.000100f}, + {-0.026266f, +0.096019f, -0.004003f, -0.000222f, +0.000001f}, + {-0.040550f, -0.099815f, -0.006813f, +0.000626f, +0.000005f}, + {-0.012858f, -0.005094f, -0.001938f, -0.001102f, -0.000079f} + }, + { + {+0.314481f, +0.005188f, +0.044811f, +0.000426f, -0.000028f}, + {+0.346528f, -0.051746f, +0.052277f, -0.000401f, -0.000122f}, + {-0.053118f, -0.097595f, -0.002410f, +0.001225f, -0.000151f}, + {+0.140849f, -0.024347f, +0.026727f, +0.000253f, -0.000095f}, + {+0.107847f, +0.047702f, +0.019644f, -0.000097f, -0.000079f}, + {-0.051228f, -0.061068f, -0.003689f, +0.001630f, -0.000102f}, + {-0.056164f, +0.049815f, -0.009319f, +0.000032f, +0.000080f}, + {+0.061891f, +0.058300f, +0.009871f, +0.001903f, -0.000079f}, + {+0.009880f, +0.028684f, +0.006879f, +0.001108f, +0.000001f} + } +}; + +const float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= +{ + { + {-0.005335f, +0.653226f, +0.143797f, +0.002456f, -0.000002f}, + {+0.013208f, -0.379140f, +0.322559f, +0.004978f, +0.000009f}, + {+0.001925f, +0.054222f, +0.043071f, -0.002449f, -0.000110f}, + {-0.000927f, +0.060176f, -0.015580f, -0.001281f, -0.000042f}, + {-0.003471f, -0.011471f, -0.002826f, -0.001074f, +0.000026f}, + {-0.003706f, +0.001098f, +0.005680f, -0.008863f, -0.000084f}, + {-0.005326f, -0.000766f, -0.002007f, -0.003072f, +0.000014f}, + {+0.001747f, -0.039662f, +0.085770f, +0.000859f, +0.000050f}, + {-0.009494f, +0.084274f, -0.084910f, -0.005996f, -0.000078f} + }, + { + {+0.020549f, +0.471556f, -0.054545f, -0.003976f, +0.000002f}, + {-0.031621f, -0.813566f, -0.056755f, -0.007166f, -0.000006f}, + {-0.002271f, -0.021372f, -0.026223f, +0.003087f, +0.000136f}, + {+0.000511f, +0.035700f, -0.040529f, +0.002564f, +0.000048f}, + {+0.007142f, +0.001751f, +0.001329f, +0.002743f, -0.000028f}, + {+0.006527f, +0.051957f, +0.070578f, +0.014200f, +0.000113f}, + {+0.014135f, +0.025109f, +0.015403f, +0.005652f, -0.000015f}, + {-0.003291f, -0.069019f, +0.036066f, +0.001141f, -0.000069f}, + {+0.028061f, +0.152663f, -0.025603f, +0.008277f, +0.000102f} + }, + { + {-0.039663f, +0.412008f, +0.017452f, +0.000445f, +0.000002f}, + {+0.026960f, -0.962971f, -0.087407f, -0.001953f, -0.000014f}, + {-0.001486f, -0.002955f, -0.054042f, +0.000085f, +0.000075f}, + {+0.003107f, +0.048844f, -0.051503f, -0.002108f, +0.000034f}, + {-0.009864f, +0.005169f, +0.019159f, -0.003128f, -0.000025f}, + {-0.004987f, +0.054770f, +0.099413f, -0.003316f, +0.000044f}, + {-0.024855f, +0.021795f, +0.065786f, -0.002538f, -0.000013f}, + {+0.003623f, +0.018186f, -0.058320f, -0.005763f, -0.000022f}, + {-0.055010f, +0.126807f, +0.109029f, +0.001546f, +0.000045f} + }, + { + {+0.043174f, +0.455537f, -0.027678f, +0.002529f, -0.000002f}, + {+0.025122f, -0.922813f, -0.028063f, +0.008613f, +0.000006f}, + {+0.002020f, +0.051124f, -0.010761f, +0.000153f, -0.000146f}, + {-0.010597f, +0.081732f, -0.001493f, +0.001479f, -0.000051f}, + {+0.024810f, -0.014152f, -0.030508f, +0.002185f, +0.000029f}, + {+0.011648f, -0.040215f, -0.008697f, -0.003893f, -0.000125f}, + {+0.043616f, -0.007408f, -0.035355f, -0.000987f, +0.000015f}, + {-0.007698f, +0.031375f, -0.028885f, +0.004919f, +0.000076f}, + {+0.093586f, +0.162669f, -0.029770f, -0.007128f, -0.000112f} + }, + { + {-0.001041f, +0.494032f, +0.005715f, -0.001108f, -0.000002f}, + {-0.143821f, -0.682007f, +0.029450f, -0.003481f, +0.000019f}, + {+0.006306f, +0.070613f, -0.011179f, -0.001860f, -0.000038f}, + {+0.031146f, +0.059515f, -0.014381f, -0.000905f, -0.000027f}, + {-0.052905f, +0.051459f, +0.001250f, -0.000868f, +0.000023f}, + {-0.029241f, -0.030800f, -0.000944f, +0.000488f, +0.000000f}, + {-0.055716f, +0.063529f, +0.002159f, +0.000641f, +0.000013f}, + {+0.013468f, -0.008041f, -0.000774f, +0.000134f, -0.000007f}, + {-0.101473f, +0.336570f, +0.012535f, +0.003233f, -0.000009f} + }, + { + {-0.092816f, +0.358882f, +0.002536f, -0.001449f, +0.000001f}, + {+0.262828f, -0.127251f, +0.020151f, -0.004341f, -0.000009f}, + {-0.022963f, +0.059857f, +0.016901f, +0.000212f, +0.000141f}, + {-0.064426f, -0.041934f, +0.012804f, -0.000049f, +0.000052f}, + {+0.064139f, +0.206373f, -0.000508f, +0.000138f, -0.000031f}, + {+0.035857f, +0.035091f, -0.016850f, +0.002300f, +0.000120f}, + {+0.032908f, +0.170386f, -0.004178f, +0.001249f, -0.000015f}, + {-0.010158f, -0.037569f, +0.007236f, -0.002146f, -0.000070f}, + {+0.021780f, +0.486360f, -0.004267f, +0.000644f, +0.000106f} + }, + { + {+0.166528f, -0.018320f, +0.002944f, +0.001057f, +0.000002f}, + {-0.217141f, +0.537828f, -0.015478f, +0.003353f, -0.000022f}, + {+0.036889f, -0.008294f, -0.001367f, +0.001254f, +0.000008f}, + {+0.069514f, -0.229400f, +0.010249f, +0.000566f, +0.000020f}, + {-0.019714f, +0.330742f, -0.003692f, +0.000002f, -0.000022f}, + {-0.010625f, +0.080582f, +0.010145f, -0.000258f, -0.000041f}, + {+0.022526f, +0.170893f, +0.014154f, -0.001025f, -0.000013f}, + {-0.007441f, -0.048091f, +0.004112f, +0.000974f, +0.000032f}, + {+0.115639f, +0.344255f, +0.014295f, -0.000177f, -0.000021f} + }, + { + {-0.099909f, -0.399087f, -0.008044f, +0.000848f, -0.000001f}, + {-0.054243f, +0.757012f, -0.020850f, +0.002283f, +0.000013f}, + {-0.025209f, -0.091980f, -0.004347f, +0.000486f, -0.000127f}, + {+0.003575f, -0.340857f, -0.007962f, -0.000163f, -0.000051f}, + {-0.071769f, +0.265803f, +0.002595f, -0.000097f, +0.000034f}, + {-0.026489f, +0.035458f, -0.005585f, -0.001110f, -0.000100f}, + {-0.060623f, +0.023422f, -0.010689f, -0.000403f, +0.000015f}, + {+0.027371f, -0.008448f, -0.007673f, -0.000192f, +0.000053f}, + {-0.176311f, -0.087697f, -0.004740f, -0.000958f, -0.000089f} + }, + { + {-0.098192f, -0.380559f, -0.012062f, -0.000872f, -0.000003f}, + {+0.307522f, +0.201411f, +0.041908f, -0.002386f, +0.000023f}, + {-0.016794f, -0.090327f, -0.008151f, -0.001481f, +0.000012f}, + {-0.117497f, -0.178818f, -0.001213f, -0.000161f, -0.000015f}, + {+0.130667f, -0.017905f, +0.002862f, +0.000224f, +0.000021f}, + {+0.026816f, -0.061563f, +0.002730f, +0.000500f, +0.000070f}, + {+0.035111f, -0.133808f, +0.000916f, +0.000421f, +0.000014f}, + {-0.028071f, +0.069426f, -0.005372f, -0.000149f, -0.000048f}, + {+0.069362f, -0.446237f, -0.000098f, +0.000728f, +0.000041f} + }, + { + {+0.200424f, +0.084933f, +0.029127f, -0.000528f, +0.000002f}, + {-0.208158f, -0.589613f, -0.015424f, -0.001691f, -0.000018f}, + {+0.041516f, +0.016661f, +0.015205f, -0.000153f, +0.000109f}, + {+0.138467f, +0.186187f, +0.007440f, -0.000185f, +0.000051f}, + {-0.077086f, -0.303705f, +0.003329f, -0.000036f, -0.000037f}, + {+0.020310f, -0.080808f, -0.007043f, +0.000054f, +0.000070f}, + {+0.031948f, -0.141008f, -0.000818f, +0.000548f, -0.000016f}, + {+0.000366f, +0.119534f, +0.006275f, +0.000355f, -0.000032f}, + {+0.109021f, -0.372983f, +0.009320f, +0.000129f, +0.000067f} + }, + { + {-0.031292f, +0.437887f, -0.005797f, +0.000706f, +0.000004f}, + {-0.174454f, -0.640794f, -0.027817f, +0.001980f, -0.000023f}, + {+0.003185f, +0.089160f, -0.003572f, +0.001064f, -0.000021f}, + {-0.004179f, +0.383165f, +0.003748f, +0.000389f, +0.000011f}, + {-0.056596f, -0.310132f, -0.010567f, -0.000223f, -0.000018f}, + {-0.057823f, +0.028077f, -0.000893f, -0.000451f, -0.000085f}, + {-0.063559f, +0.001711f, -0.003009f, -0.000543f, -0.000016f}, + {+0.035766f, +0.073579f, +0.002518f, +0.000224f, +0.000053f}, + {-0.161175f, +0.042780f, -0.016398f, -0.000634f, -0.000050f} + }, + { + {-0.205155f, +0.167329f, -0.030119f, +0.000379f, -0.000002f}, + {+0.339082f, +0.153701f, +0.034923f, +0.001267f, +0.000022f}, + {-0.072520f, -0.022480f, -0.011077f, +0.000072f, -0.000094f}, + {-0.141121f, +0.163887f, -0.018765f, +0.000088f, -0.000051f}, + {+0.127275f, -0.020840f, +0.015322f, -0.000034f, +0.000041f}, + {+0.027665f, +0.152414f, +0.006975f, +0.000222f, -0.000038f}, + {+0.020531f, +0.124947f, +0.003832f, -0.000374f, +0.000019f}, + {-0.042138f, -0.039811f, -0.003937f, -0.000440f, +0.000012f}, + {+0.031495f, +0.327305f, +0.001379f, +0.000105f, -0.000048f} + }, + { + {+0.145847f, -0.370580f, +0.020419f, -0.000633f, -0.000004f}, + {-0.026755f, +0.715695f, +0.002721f, -0.001713f, +0.000021f}, + {+0.048263f, -0.214620f, +0.011454f, -0.000799f, +0.000024f}, + {+0.105105f, -0.209642f, +0.009809f, -0.000393f, -0.000007f}, + {-0.046673f, +0.240709f, -0.003039f, +0.000354f, +0.000014f}, + {+0.046604f, +0.126235f, +0.001254f, +0.000637f, +0.000087f}, + {+0.040919f, +0.089993f, +0.004646f, +0.000614f, +0.000016f}, + {+0.003849f, -0.106327f, -0.000606f, -0.000255f, -0.000050f}, + {+0.114169f, +0.187796f, +0.016720f, +0.000604f, +0.000050f} + }, + { + {+0.151563f, -0.357850f, +0.023901f, -0.000267f, +0.000003f}, + {-0.329416f, +0.240852f, -0.037687f, -0.000972f, -0.000025f}, + {+0.079637f, -0.178703f, +0.006277f, -0.000085f, +0.000084f}, + {+0.067743f, -0.255542f, +0.013928f, -0.000093f, +0.000052f}, + {-0.085616f, +0.171409f, -0.015038f, +0.000016f, -0.000044f}, + {-0.080584f, -0.060419f, -0.009795f, -0.000260f, +0.000011f}, + {-0.039270f, -0.029107f, -0.004384f, +0.000149f, -0.000022f}, + {+0.040700f, -0.048532f, +0.005694f, +0.000308f, +0.000003f}, + {-0.100428f, -0.143102f, -0.013507f, -0.000175f, +0.000032f} + }, + { + {-0.221520f, +0.217382f, -0.031802f, +0.000571f, +0.000004f}, + {+0.191369f, -0.563524f, +0.020930f, +0.001563f, -0.000018f}, + {-0.142768f, +0.156236f, -0.016728f, +0.000768f, -0.000025f}, + {-0.131233f, +0.058224f, -0.018961f, +0.000413f, +0.000003f}, + {+0.094869f, -0.113180f, +0.014106f, -0.000387f, -0.000009f}, + {+0.032009f, -0.229593f, +0.004382f, -0.000814f, -0.000078f}, + {-0.014026f, -0.058166f, -0.005170f, -0.000559f, -0.000016f}, + {-0.035069f, +0.066238f, -0.003175f, +0.000270f, +0.000041f}, + {-0.032944f, -0.241581f, -0.006363f, -0.000531f, -0.000047f} + }, + { + {-0.072792f, +0.444420f, -0.012987f, +0.000205f, -0.000004f}, + {+0.237324f, -0.482374f, +0.029199f, +0.000704f, +0.000027f}, + {+0.015060f, +0.403253f, +0.004767f, +0.000016f, -0.000078f}, + {-0.002750f, +0.257555f, -0.001283f, +0.000101f, -0.000052f}, + {+0.029761f, -0.216925f, +0.003727f, -0.000037f, +0.000045f}, + {+0.050908f, -0.208738f, +0.003838f, +0.000287f, +0.000007f}, + {+0.026158f, +0.010072f, +0.007655f, -0.000049f, +0.000026f}, + {-0.018378f, +0.087639f, -0.004770f, -0.000153f, -0.000011f}, + {+0.100406f, -0.034654f, +0.015514f, +0.000140f, -0.000022f} + }, + { + {+0.257437f, -0.065717f, +0.037575f, -0.000530f, -0.000004f}, + {-0.281553f, +0.324420f, -0.036967f, -0.001412f, +0.000017f}, + {+0.165202f, +0.184739f, +0.014027f, -0.000709f, +0.000026f}, + {+0.125102f, +0.059915f, +0.017871f, -0.000393f, +0.000001f}, + {-0.112292f, +0.000623f, -0.014750f, +0.000389f, +0.000004f}, + {-0.090463f, -0.007129f, -0.003581f, +0.000747f, +0.000067f}, + {+0.027231f, +0.007327f, +0.004513f, +0.000487f, +0.000014f}, + {+0.046307f, -0.017672f, +0.008365f, -0.000175f, -0.000032f}, + {-0.028415f, +0.161325f, -0.001715f, +0.000514f, +0.000043f} + }, + { + {-0.007526f, -0.473436f, +0.001022f, -0.000153f, +0.000005f}, + {-0.129889f, +0.550582f, -0.015713f, -0.000496f, -0.000029f}, + {-0.152654f, -0.291103f, -0.013185f, -0.000005f, +0.000074f}, + {-0.054068f, -0.217748f, -0.007018f, -0.000142f, +0.000051f}, + {+0.037999f, +0.233960f, +0.005179f, +0.000063f, -0.000045f}, + {+0.058157f, +0.208550f, +0.000279f, -0.000232f, -0.000018f}, + {-0.043982f, -0.108725f, -0.011637f, +0.000065f, -0.000029f}, + {+0.000177f, -0.092885f, -0.000896f, -0.000064f, +0.000013f}, + {-0.062887f, +0.105831f, -0.012283f, -0.000152f, +0.000016f} + }, + { + {-0.267052f, -0.072481f, -0.039143f, +0.000481f, +0.000004f}, + {+0.316645f, -0.147998f, +0.045958f, +0.001265f, -0.000015f}, + {-0.048560f, -0.443085f, -0.007515f, +0.000666f, -0.000028f}, + {-0.086419f, -0.172339f, -0.010499f, +0.000432f, -0.000005f}, + {+0.085408f, +0.166595f, +0.008605f, -0.000440f, -0.000000f}, + {+0.015618f, +0.269874f, +0.001215f, -0.000625f, -0.000057f}, + {-0.041006f, -0.120930f, -0.000588f, -0.000488f, -0.000012f}, + {-0.062603f, +0.004952f, -0.009992f, +0.000232f, +0.000027f}, + {+0.049095f, -0.068280f, +0.006362f, -0.000520f, -0.000040f} + }, + { + {+0.085562f, +0.471449f, +0.011009f, +0.000129f, -0.000005f}, + {+0.040209f, -0.573378f, +0.000615f, +0.000315f, +0.000031f}, + {+0.171918f, -0.105151f, +0.017403f, +0.000004f, -0.000072f}, + {+0.084128f, +0.083375f, +0.007231f, +0.000038f, -0.000051f}, + {-0.092144f, -0.099172f, -0.007312f, +0.000077f, +0.000045f}, + {-0.077363f, +0.132678f, -0.001733f, +0.000235f, +0.000023f}, + {+0.111219f, +0.109132f, +0.015848f, -0.000079f, +0.000032f}, + {+0.040923f, +0.172426f, +0.008798f, -0.000008f, -0.000013f}, + {+0.029588f, -0.098729f, +0.007764f, +0.000221f, -0.000011f} + }, + { + {+0.254737f, +0.211411f, +0.036795f, -0.000484f, -0.000003f}, + {-0.338234f, +0.015114f, -0.048846f, -0.001053f, +0.000013f}, + {-0.069108f, +0.254859f, -0.003290f, -0.000753f, +0.000029f}, + {+0.023788f, +0.170361f, +0.006488f, -0.000354f, +0.000008f}, + {-0.008393f, -0.222503f, -0.002681f, +0.000354f, -0.000003f}, + {+0.081171f, -0.098496f, +0.004558f, +0.000585f, +0.000051f}, + {-0.022336f, +0.317809f, -0.007308f, +0.000546f, +0.000009f}, + {+0.059371f, +0.155239f, +0.002593f, -0.000198f, -0.000025f}, + {-0.050719f, +0.026919f, -0.006976f, +0.000534f, +0.000037f} + }, + { + {-0.158995f, -0.424829f, -0.020702f, -0.000042f, +0.000006f}, + {+0.052902f, +0.616966f, +0.013055f, -0.000306f, -0.000032f}, + {-0.087152f, +0.213242f, -0.015296f, +0.000352f, +0.000070f}, + {-0.054260f, +0.047270f, -0.008042f, +0.000061f, +0.000051f}, + {+0.073970f, -0.094701f, +0.008512f, -0.000228f, -0.000046f}, + {-0.017462f, -0.238223f, -0.000790f, -0.000485f, -0.000029f}, + {-0.138534f, +0.148762f, -0.014349f, -0.000008f, -0.000034f}, + {-0.109919f, -0.097327f, -0.010882f, +0.000233f, +0.000014f}, + {-0.006806f, +0.096529f, -0.003657f, -0.000365f, +0.000007f} + }, + { + {-0.218541f, -0.332409f, -0.031504f, +0.000445f, +0.000003f}, + {+0.344919f, +0.163301f, +0.048934f, +0.001021f, -0.000012f}, + {+0.081260f, -0.052733f, +0.012413f, +0.000334f, -0.000031f}, + {+0.001753f, -0.039186f, -0.002593f, +0.000192f, -0.000011f}, + {-0.044437f, +0.083315f, -0.002185f, -0.000075f, +0.000005f}, + {-0.063695f, -0.165969f, -0.005598f, -0.000350f, -0.000048f}, + {+0.133966f, -0.261153f, +0.015377f, -0.000538f, -0.000006f}, + {+0.023795f, -0.302979f, +0.005384f, -0.000124f, +0.000025f}, + {+0.048328f, +0.008375f, +0.007723f, -0.000384f, -0.000035f} + }, + { + {+0.215234f, +0.334693f, +0.029335f, -0.000032f, -0.000006f}, + {-0.163645f, -0.620258f, -0.029442f, +0.000199f, +0.000034f}, + {+0.033793f, -0.124345f, +0.006813f, -0.000105f, -0.000071f}, + {+0.000974f, -0.040313f, +0.001531f, +0.000006f, -0.000052f}, + {-0.011132f, +0.127973f, -0.004627f, -0.000028f, +0.000047f}, + {+0.084325f, +0.052788f, +0.007351f, +0.000453f, +0.000037f}, + {+0.056743f, -0.375950f, +0.009997f, +0.000141f, +0.000035f}, + {+0.111528f, -0.176673f, +0.008510f, +0.000146f, -0.000018f}, + {-0.011877f, -0.092945f, -0.003074f, +0.000266f, -0.000004f} + }, + { + {+0.170586f, +0.400778f, +0.026157f, -0.000380f, -0.000003f}, + {-0.309161f, -0.398764f, -0.040718f, -0.000943f, +0.000011f}, + {-0.062016f, +0.029728f, -0.012911f, -0.000459f, +0.000035f}, + {+0.031810f, -0.090010f, +0.007426f, -0.000129f, +0.000014f}, + {+0.032063f, +0.056196f, +0.004324f, +0.000244f, -0.000009f}, + {-0.022806f, +0.208884f, +0.000856f, +0.000371f, +0.000043f}, + {-0.165081f, -0.039385f, -0.016746f, +0.000367f, +0.000003f}, + {-0.128190f, +0.183103f, -0.012188f, -0.000425f, -0.000025f}, + {-0.049731f, -0.043210f, -0.002580f, +0.000500f, +0.000034f} + }, + { + {-0.253118f, -0.253855f, -0.036031f, +0.000022f, +0.000008f}, + {+0.270280f, +0.483591f, +0.039528f, -0.000153f, -0.000036f}, + {-0.018783f, +0.101617f, -0.001693f, +0.000100f, +0.000073f}, + {+0.020506f, -0.111990f, -0.001982f, -0.000215f, +0.000054f}, + {-0.026438f, -0.035500f, -0.002626f, +0.000034f, -0.000050f}, + {-0.052495f, +0.162509f, -0.005782f, -0.000307f, -0.000047f}, + {+0.034503f, +0.254582f, -0.002428f, -0.000029f, -0.000037f}, + {-0.007059f, +0.365527f, +0.000861f, +0.000308f, +0.000024f}, + {+0.051840f, +0.110577f, +0.004579f, -0.000471f, +0.000002f} + }, + { + {-0.123354f, -0.454617f, -0.017101f, +0.000408f, +0.000003f}, + {+0.216188f, +0.557670f, +0.033272f, +0.000921f, -0.000010f}, + {+0.060077f, -0.016368f, +0.008130f, +0.000544f, -0.000041f}, + {-0.097698f, +0.063611f, -0.011314f, +0.000334f, -0.000020f}, + {+0.004155f, -0.082194f, +0.000724f, -0.000315f, +0.000015f}, + {+0.061885f, -0.007918f, +0.004267f, -0.000661f, -0.000034f}, + {+0.120251f, +0.108336f, +0.021527f, -0.000454f, +0.000001f}, + {+0.138249f, +0.145446f, +0.014907f, +0.000187f, +0.000021f}, + {+0.010129f, +0.174821f, +0.000225f, -0.000291f, -0.000033f} + }, + { + {+0.286163f, +0.175080f, +0.040522f, -0.000072f, -0.000009f}, + {-0.316113f, -0.262138f, -0.049307f, +0.000066f, +0.000038f}, + {-0.006202f, -0.116156f, -0.000344f, -0.000116f, -0.000074f}, + {+0.026045f, +0.250354f, +0.005697f, +0.000168f, -0.000055f}, + {+0.033061f, -0.037487f, +0.003086f, -0.000057f, +0.000051f}, + {-0.009161f, -0.111428f, +0.002750f, +0.000407f, +0.000055f}, + {-0.050197f, -0.166126f, -0.010372f, +0.000135f, +0.000039f}, + {-0.108124f, -0.227657f, -0.011340f, -0.000057f, -0.000029f}, + {-0.062623f, +0.065189f, -0.003295f, +0.000387f, +0.000001f} + }, + { + {+0.066678f, +0.512159f, +0.009358f, -0.000375f, -0.000002f}, + {-0.128892f, -0.546911f, -0.020182f, -0.000837f, +0.000009f}, + {-0.041244f, -0.065432f, -0.004659f, -0.000466f, +0.000049f}, + {+0.124448f, +0.097696f, +0.018095f, -0.000283f, +0.000027f}, + {-0.039700f, +0.075487f, -0.006824f, +0.000303f, -0.000022f}, + {-0.033671f, -0.064807f, -0.008036f, +0.000540f, +0.000022f}, + {-0.115666f, -0.069551f, -0.016489f, +0.000343f, -0.000004f}, + {-0.044678f, -0.318287f, -0.008724f, -0.000374f, -0.000016f}, + {+0.045915f, -0.096744f, +0.005450f, +0.000336f, +0.000032f} + }, + { + {-0.306654f, -0.062299f, -0.043370f, +0.000070f, +0.000010f}, + {+0.327815f, +0.157084f, +0.053522f, -0.000024f, -0.000042f}, + {+0.020545f, +0.022620f, -0.000196f, -0.000030f, +0.000072f}, + {-0.093582f, -0.234733f, -0.010882f, -0.000285f, +0.000055f}, + {-0.018657f, +0.107686f, -0.002873f, +0.000136f, -0.000051f}, + {+0.022629f, +0.029525f, +0.002254f, -0.000156f, -0.000058f}, + {+0.080228f, +0.235900f, +0.013683f, -0.000069f, -0.000040f}, + {+0.131827f, -0.044535f, +0.015502f, +0.000103f, +0.000031f}, + {+0.019414f, -0.130958f, +0.003490f, -0.000488f, -0.000004f} + }, + { + {-0.003446f, -0.527577f, -0.000418f, +0.000351f, +0.000001f}, + {+0.063671f, +0.564794f, +0.009104f, +0.000762f, -0.000008f}, + {+0.005424f, +0.040112f, +0.004744f, +0.000443f, -0.000057f}, + {-0.104226f, -0.211764f, -0.016606f, +0.000287f, -0.000034f}, + {+0.067397f, -0.027841f, +0.010395f, -0.000286f, +0.000029f}, + {+0.014235f, +0.044128f, +0.001136f, -0.000560f, -0.000010f}, + {+0.112939f, +0.189986f, +0.013999f, -0.000350f, +0.000008f}, + {-0.051770f, +0.234766f, -0.004628f, +0.000261f, +0.000010f}, + {-0.057159f, -0.008653f, -0.009510f, -0.000310f, -0.000032f} + }, + { + {+0.309125f, -0.046398f, +0.043868f, -0.000070f, -0.000010f}, + {-0.337900f, -0.049301f, -0.053004f, -0.000032f, +0.000046f}, + {+0.006452f, +0.038403f, -0.000549f, +0.000028f, -0.000068f}, + {+0.142396f, +0.170693f, +0.019921f, +0.000322f, -0.000053f}, + {-0.012544f, -0.153200f, -0.002399f, -0.000157f, +0.000049f}, + {-0.026935f, -0.020769f, -0.002517f, +0.000142f, +0.000057f}, + {-0.135188f, -0.190554f, -0.017975f, +0.000073f, +0.000042f}, + {-0.083199f, +0.182605f, -0.012518f, -0.000033f, -0.000031f}, + {+0.022452f, +0.113080f, +0.002881f, +0.000561f, +0.000007f} + }, + { + {-0.056550f, +0.514353f, -0.008128f, -0.000326f, +0.000000f}, + {+0.002761f, -0.570850f, -0.000438f, -0.000698f, +0.000005f}, + {-0.005763f, +0.055193f, -0.003144f, -0.000303f, +0.000064f}, + {+0.066858f, +0.287146f, +0.008674f, -0.000271f, +0.000039f}, + {-0.079593f, -0.051699f, -0.009265f, +0.000243f, -0.000035f}, + {+0.004491f, -0.069814f, +0.001757f, +0.000412f, +0.000001f}, + {-0.070466f, -0.289680f, -0.008846f, +0.000325f, -0.000013f}, + {+0.096678f, -0.094366f, +0.010661f, -0.000155f, -0.000007f}, + {+0.041572f, +0.082696f, +0.006577f, +0.000266f, +0.000031f} + }, + { + {-0.298262f, +0.141215f, -0.042908f, +0.000091f, +0.000010f}, + {+0.335616f, -0.061120f, +0.052587f, +0.000136f, -0.000050f}, + {-0.028168f, +0.019948f, -0.003001f, +0.000044f, +0.000065f}, + {-0.179347f, -0.090626f, -0.024448f, -0.000251f, +0.000051f}, + {+0.055697f, +0.153136f, +0.006127f, +0.000099f, -0.000047f}, + {+0.022758f, -0.040841f, +0.001974f, -0.000245f, -0.000056f}, + {+0.171241f, +0.083402f, +0.023385f, -0.000076f, -0.000043f}, + {+0.018087f, -0.211528f, +0.004820f, +0.000028f, +0.000030f}, + {-0.051883f, -0.059963f, -0.007202f, -0.000532f, -0.000011f} + }, + { + {+0.109668f, -0.485328f, +0.016423f, +0.000299f, -0.000001f}, + {-0.064276f, +0.551492f, -0.008554f, +0.000611f, -0.000002f}, + {+0.027762f, -0.066226f, +0.006657f, +0.000180f, -0.000068f}, + {-0.008606f, -0.352413f, -0.000966f, +0.000207f, -0.000045f}, + {+0.061405f, +0.140795f, +0.008634f, -0.000186f, +0.000040f}, + {-0.022602f, +0.028596f, -0.003958f, -0.000252f, +0.000003f}, + {+0.006333f, +0.339254f, -0.001045f, -0.000313f, +0.000017f}, + {-0.095236f, -0.035271f, -0.011532f, +0.000098f, +0.000006f}, + {-0.006892f, -0.129936f, -0.001855f, -0.000288f, -0.000028f} + }, + { + {+0.280162f, -0.222327f, +0.040172f, -0.000132f, -0.000011f}, + {-0.325666f, +0.150573f, -0.051593f, -0.000209f, +0.000054f}, + {+0.028869f, -0.065199f, +0.002958f, -0.000146f, -0.000066f}, + {+0.187456f, -0.052621f, +0.025102f, +0.000202f, -0.000052f}, + {-0.080571f, -0.077938f, -0.010648f, -0.000040f, +0.000047f}, + {-0.004481f, +0.054774f, -0.000402f, +0.000382f, +0.000060f}, + {-0.176395f, +0.061006f, -0.022445f, +0.000083f, +0.000045f}, + {+0.032007f, +0.158843f, +0.002664f, -0.000125f, -0.000033f}, + {+0.057225f, -0.034866f, +0.006728f, +0.000520f, +0.000013f} + }, + { + {-0.158921f, +0.451848f, -0.023918f, -0.000281f, +0.000001f}, + {+0.121553f, -0.536831f, +0.017942f, -0.000578f, -0.000001f}, + {-0.050855f, +0.055529f, -0.008445f, -0.000215f, +0.000075f}, + {-0.052686f, +0.312195f, -0.005219f, -0.000224f, +0.000052f}, + {-0.037110f, -0.141320f, -0.006102f, +0.000195f, -0.000048f}, + {+0.024782f, +0.009783f, +0.004483f, +0.000288f, -0.000009f}, + {+0.063910f, -0.304697f, +0.007623f, +0.000328f, -0.000023f}, + {+0.068609f, +0.100384f, +0.009341f, -0.000091f, -0.000007f}, + {-0.033166f, +0.101342f, -0.001173f, +0.000251f, +0.000026f} + }, + { + {-0.254134f, +0.305063f, -0.036122f, +0.000175f, +0.000012f}, + {+0.313748f, -0.244268f, +0.048706f, +0.000275f, -0.000058f}, + {-0.012267f, +0.112660f, -0.001928f, +0.000238f, +0.000072f}, + {-0.161165f, +0.140763f, -0.024820f, -0.000200f, +0.000054f}, + {+0.090126f, +0.058592f, +0.014503f, +0.000035f, -0.000049f}, + {-0.010917f, -0.042825f, -0.001085f, -0.000524f, -0.000070f}, + {+0.139731f, -0.183781f, +0.020533f, -0.000104f, -0.000047f}, + {-0.056473f, -0.093013f, -0.007395f, +0.000190f, +0.000040f}, + {-0.028362f, +0.108300f, -0.004536f, -0.000507f, -0.000014f} + }, + { + {+0.204108f, -0.397468f, +0.030234f, +0.000284f, -0.000002f}, + {-0.186187f, +0.523327f, -0.027065f, +0.000548f, +0.000002f}, + {+0.063644f, -0.004588f, +0.010914f, +0.000342f, -0.000092f}, + {+0.084172f, -0.238464f, +0.012067f, +0.000307f, -0.000066f}, + {+0.023241f, +0.163547f, +0.001737f, -0.000268f, +0.000061f}, + {-0.017633f, -0.031273f, -0.004558f, -0.000453f, +0.000024f}, + {-0.103701f, +0.192462f, -0.015036f, -0.000326f, +0.000032f}, + {-0.040508f, -0.117502f, -0.005435f, +0.000218f, +0.000003f}, + {+0.044739f, -0.003358f, +0.002673f, -0.000166f, -0.000026f} + }, + { + {+0.217925f, -0.374764f, +0.031310f, -0.000194f, -0.000015f}, + {-0.287194f, +0.371793f, -0.043606f, -0.000298f, +0.000065f}, + {-0.012378f, -0.121133f, -0.001692f, -0.000139f, -0.000076f}, + {+0.138854f, -0.153518f, +0.021173f, +0.000296f, -0.000054f}, + {-0.110078f, -0.041091f, -0.015691f, -0.000117f, +0.000048f}, + {+0.016824f, +0.020994f, +0.002433f, +0.000470f, +0.000080f}, + {-0.093179f, +0.207425f, -0.014155f, +0.000078f, +0.000048f}, + {+0.066586f, +0.047692f, +0.008958f, -0.000170f, -0.000050f}, + {-0.006034f, -0.079321f, +0.001680f, +0.000546f, +0.000014f} + }, + { + {-0.239100f, +0.326388f, -0.035676f, -0.000310f, +0.000005f}, + {+0.254019f, -0.457019f, +0.035395f, -0.000472f, -0.000004f}, + {-0.063172f, -0.043743f, -0.010677f, -0.000446f, +0.000122f}, + {-0.106250f, +0.224976f, -0.016160f, -0.000331f, +0.000087f}, + {+0.006588f, -0.220018f, +0.002089f, +0.000280f, -0.000081f}, + {+0.012847f, +0.026665f, +0.004159f, +0.000613f, -0.000053f}, + {+0.116434f, -0.116659f, +0.017836f, +0.000308f, -0.000043f}, + {+0.014851f, +0.127471f, +0.001839f, -0.000426f, +0.000008f}, + {-0.024363f, -0.047415f, -0.002156f, +0.000076f, +0.000029f} + }, + { + {-0.177651f, +0.419626f, -0.025372f, +0.000189f, +0.000018f}, + {+0.234856f, -0.487730f, +0.036693f, +0.000275f, -0.000076f}, + {+0.036507f, +0.108100f, +0.004077f, -0.000196f, +0.000068f}, + {-0.123472f, +0.198845f, -0.018454f, -0.000539f, +0.000045f}, + {+0.120851f, -0.044023f, +0.017124f, +0.000326f, -0.000038f}, + {-0.019744f, -0.023127f, -0.003003f, -0.000144f, -0.000080f}, + {+0.054985f, -0.211321f, +0.008525f, +0.000002f, -0.000046f}, + {-0.067840f, +0.000644f, -0.008680f, +0.000062f, +0.000059f}, + {+0.013438f, +0.012637f, +0.000624f, -0.000676f, -0.000018f} + }, + { + {+0.265046f, -0.258984f, +0.039613f, +0.000315f, -0.000010f}, + {-0.305263f, +0.341002f, -0.042929f, +0.000320f, +0.000009f}, + {+0.052493f, +0.082191f, +0.010230f, +0.000306f, -0.000162f}, + {+0.135578f, -0.200816f, +0.020288f, +0.000195f, -0.000112f}, + {-0.047909f, +0.214878f, -0.007490f, -0.000138f, +0.000104f}, + {-0.013632f, -0.032324f, -0.004221f, -0.000548f, +0.000093f}, + {-0.118924f, +0.057091f, -0.018445f, -0.000261f, +0.000056f}, + {+0.008331f, -0.114878f, +0.000663f, +0.000507f, -0.000028f}, + {+0.005413f, +0.022808f, -0.000439f, -0.000059f, -0.000035f} + }, + { + {+0.136435f, -0.454829f, +0.019582f, -0.000149f, -0.000018f}, + {-0.168461f, +0.553033f, -0.027068f, -0.000281f, +0.000094f}, + {-0.056383f, -0.088168f, -0.008472f, +0.000590f, -0.000037f}, + {+0.096992f, -0.262712f, +0.013318f, +0.000816f, -0.000021f}, + {-0.110234f, +0.118824f, -0.015813f, -0.000528f, +0.000014f}, + {+0.029948f, +0.036351f, +0.005263f, -0.000282f, +0.000056f}, + {-0.020326f, +0.210405f, -0.002631f, -0.000079f, +0.000039f}, + {+0.060030f, -0.032820f, +0.009213f, +0.000193f, -0.000059f}, + {-0.003943f, +0.005977f, -0.000375f, +0.000898f, +0.000028f} + }, + { + {-0.284355f, +0.190433f, -0.042800f, -0.000266f, +0.000017f}, + {+0.335277f, -0.219226f, +0.046865f, -0.000105f, -0.000022f}, + {-0.036478f, -0.124061f, -0.005694f, +0.000344f, +0.000198f}, + {-0.163243f, +0.134561f, -0.022257f, +0.000183f, +0.000132f}, + {+0.083868f, -0.178051f, +0.011964f, -0.000280f, -0.000122f}, + {+0.010723f, +0.070555f, +0.001815f, -0.000022f, -0.000132f}, + {+0.111861f, +0.009495f, +0.016549f, +0.000135f, -0.000069f}, + {-0.022143f, +0.095016f, -0.003757f, -0.000379f, +0.000052f}, + {-0.000565f, +0.002446f, +0.001442f, +0.000102f, +0.000039f} + }, + { + {-0.095291f, +0.479278f, -0.013467f, +0.000098f, +0.000016f}, + {+0.099306f, -0.582261f, +0.017486f, +0.000468f, -0.000116f}, + {+0.078355f, +0.049439f, +0.008412f, -0.000772f, -0.000023f}, + {-0.051414f, +0.305039f, -0.008849f, -0.000882f, -0.000019f}, + {+0.082995f, -0.177822f, +0.013237f, +0.000567f, +0.000026f}, + {-0.049222f, -0.017872f, -0.004795f, +0.000539f, -0.000005f}, + {-0.011696f, -0.179076f, -0.000545f, +0.000092f, -0.000026f}, + {-0.054786f, +0.044185f, -0.008075f, -0.000456f, +0.000046f}, + {-0.005431f, -0.002236f, -0.000119f, -0.000987f, -0.000046f} + }, + { + {+0.300035f, -0.126686f, +0.045279f, +0.000141f, -0.000023f}, + {-0.347527f, +0.104803f, -0.049661f, -0.000162f, +0.000050f}, + {+0.000140f, +0.170954f, +0.002869f, -0.001398f, -0.000210f}, + {+0.165631f, -0.028348f, +0.023643f, -0.000777f, -0.000136f}, + {-0.103480f, +0.108513f, -0.015479f, +0.000834f, +0.000124f}, + {+0.013480f, -0.114650f, -0.000763f, +0.001025f, +0.000149f}, + {-0.089040f, -0.060481f, -0.014574f, +0.000082f, +0.000079f}, + {+0.036486f, -0.097396f, +0.006421f, +0.000002f, -0.000073f}, + {+0.003333f, -0.016091f, -0.002020f, -0.000329f, -0.000034f} + }, + { + {+0.051566f, -0.506796f, +0.007039f, -0.000099f, -0.000010f}, + {-0.033731f, +0.589122f, -0.007210f, -0.000795f, +0.000134f}, + {-0.079279f, +0.049325f, -0.008393f, +0.000023f, +0.000100f}, + {+0.010994f, -0.265800f, +0.003418f, +0.000397f, +0.000069f}, + {-0.052364f, +0.186418f, -0.009164f, -0.000026f, -0.000073f}, + {+0.052053f, -0.056265f, +0.005015f, +0.000066f, -0.000065f}, + {+0.026200f, +0.116741f, +0.002983f, +0.000008f, +0.000008f}, + {+0.048119f, -0.079713f, +0.006644f, +0.000374f, -0.000021f}, + {+0.010900f, -0.005754f, +0.000987f, +0.000869f, +0.000068f} + }, + { + {-0.311437f, +0.048951f, -0.046976f, +0.000118f, +0.000027f}, + {+0.349598f, +0.000051f, +0.050374f, +0.000038f, -0.000095f}, + {+0.040613f, -0.137831f, -0.000066f, +0.002700f, +0.000181f}, + {-0.149052f, -0.019968f, -0.023093f, +0.001262f, +0.000115f}, + {+0.107473f, -0.058841f, +0.017699f, -0.001256f, -0.000101f}, + {-0.043140f, +0.091871f, -0.000478f, -0.002412f, -0.000129f}, + {+0.064483f, +0.059569f, +0.011301f, -0.000210f, -0.000082f}, + {-0.054255f, +0.077805f, -0.009915f, +0.000915f, +0.000081f}, + {-0.008263f, +0.025078f, +0.001271f, +0.000578f, +0.000014f} + }, + { + {-0.002478f, +0.521278f, -0.000544f, +0.000189f, +0.000002f}, + {-0.031629f, -0.587979f, -0.001886f, +0.001424f, -0.000137f}, + {+0.053320f, -0.118505f, +0.004875f, +0.003174f, -0.000173f}, + {+0.008995f, +0.224389f, +0.001153f, +0.001756f, -0.000113f}, + {+0.029482f, -0.180110f, +0.004281f, -0.002087f, +0.000115f}, + {-0.033134f, +0.107741f, -0.001943f, -0.002753f, +0.000132f}, + {-0.023463f, -0.074570f, -0.002999f, -0.000562f, +0.000011f}, + {-0.031477f, +0.111590f, -0.005933f, +0.000350f, -0.000010f}, + {-0.015016f, +0.015277f, -0.001484f, -0.000128f, -0.000086f} + } +}; + +const float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= +{ + { + {-0.036807f, -0.174045f, +0.179146f, +0.002758f, +0.000002f}, + {+0.081675f, -0.202936f, +0.124120f, +0.000184f, -0.000007f}, + {-0.000843f, -0.038970f, +0.052716f, -0.008143f, +0.000125f}, + {-0.004478f, -0.013122f, +0.028558f, -0.008290f, +0.000045f}, + {+0.006316f, -0.012132f, +0.006515f, -0.002119f, -0.000027f}, + {-0.000794f, +0.004296f, +0.005127f, -0.004942f, +0.000100f}, + {+0.010293f, -0.025048f, +0.008939f, -0.001610f, -0.000015f}, + {-0.001111f, -0.008117f, +0.033872f, -0.002789f, -0.000061f}, + {+0.009292f, -0.031334f, +0.001941f, -0.005137f, +0.000092f} + }, + { + {+0.046648f, -0.328217f, -0.004769f, -0.004729f, +0.000002f}, + {-0.078219f, -0.186706f, +0.335495f, -0.010505f, -0.000011f}, + {+0.003389f, -0.028871f, +0.074809f, -0.001736f, +0.000093f}, + {+0.011160f, -0.006841f, +0.031676f, +0.003121f, +0.000038f}, + {-0.007422f, -0.043414f, +0.006982f, +0.001963f, -0.000025f}, + {-0.003254f, -0.003751f, +0.013792f, -0.005415f, +0.000065f}, + {-0.015187f, -0.099887f, -0.012484f, -0.000245f, -0.000014f}, + {-0.000628f, +0.067594f, +0.116266f, +0.000062f, -0.000037f}, + {-0.017876f, -0.212825f, -0.109502f, -0.000434f, +0.000062f} + }, + { + {-0.062391f, -0.298587f, +0.055506f, +0.004604f, -0.000002f}, + {+0.110139f, +0.008656f, -0.076872f, +0.013912f, +0.000006f}, + {-0.006661f, +0.041459f, +0.008680f, +0.005198f, -0.000143f}, + {-0.017346f, +0.064502f, -0.000311f, +0.000229f, -0.000050f}, + {+0.012574f, -0.112476f, +0.042863f, -0.000548f, +0.000028f}, + {+0.008554f, -0.117685f, +0.085746f, +0.010222f, -0.000121f}, + {+0.018386f, -0.231260f, +0.055470f, +0.002605f, +0.000015f}, + {-0.000043f, +0.098076f, +0.074022f, +0.004739f, +0.000074f}, + {+0.020228f, -0.438516f, +0.026318f, +0.002404f, -0.000109f} + }, + { + {+0.087093f, -0.185047f, -0.039795f, -0.001148f, -0.000002f}, + {-0.179442f, -0.138305f, +0.024941f, -0.004193f, +0.000016f}, + {+0.010153f, +0.053373f, -0.028050f, +0.000631f, -0.000056f}, + {+0.022351f, +0.115243f, -0.015706f, +0.000824f, -0.000030f}, + {-0.016881f, -0.188764f, +0.015179f, -0.001478f, +0.000024f}, + {-0.011436f, -0.169671f, +0.055918f, -0.006134f, -0.000022f}, + {-0.007516f, -0.296099f, +0.030173f, -0.003476f, +0.000013f}, + {+0.001835f, +0.047910f, -0.004611f, -0.005834f, +0.000008f}, + {+0.012183f, -0.522145f, -0.012957f, -0.000556f, -0.000026f} + }, + { + {-0.118429f, +0.036347f, +0.008994f, -0.001813f, +0.000002f}, + {+0.195669f, -0.557237f, -0.044782f, -0.005092f, -0.000007f}, + {-0.015263f, +0.077237f, -0.016810f, -0.004030f, +0.000145f}, + {-0.025184f, +0.187315f, -0.016739f, -0.002009f, +0.000052f}, + {+0.002368f, -0.225780f, +0.012360f, +0.001921f, -0.000030f}, + {+0.004974f, -0.160969f, +0.009969f, +0.002830f, +0.000125f}, + {-0.023306f, -0.243341f, -0.007075f, +0.002049f, -0.000015f}, + {+0.002539f, +0.043064f, -0.021665f, +0.000872f, -0.000074f}, + {-0.088704f, -0.392340f, -0.007003f, +0.000682f, +0.000110f} + }, + { + {+0.111405f, +0.324593f, -0.000106f, +0.001284f, +0.000002f}, + {-0.051589f, -0.868735f, +0.017996f, +0.003263f, -0.000021f}, + {+0.016644f, +0.116184f, -0.001320f, +0.001603f, +0.000021f}, + {+0.004222f, +0.242602f, +0.004139f, +0.000694f, +0.000023f}, + {+0.043767f, -0.191695f, -0.013679f, -0.000447f, -0.000023f}, + {+0.015164f, -0.134423f, -0.000808f, -0.001816f, -0.000022f}, + {+0.056350f, -0.114712f, -0.004403f, +0.000262f, -0.000013f}, + {-0.013985f, +0.017892f, -0.014819f, +0.002850f, +0.000020f}, + {+0.155162f, -0.041775f, -0.009744f, -0.001067f, -0.000007f} + }, + { + {-0.005031f, +0.479299f, +0.003719f, +0.000668f, -0.000001f}, + {-0.200078f, -0.617927f, -0.007665f, +0.002820f, +0.000011f}, + {-0.000023f, +0.128657f, +0.013087f, +0.000664f, -0.000135f}, + {+0.058851f, +0.171528f, +0.001838f, +0.000874f, -0.000052f}, + {-0.096474f, -0.013567f, -0.000492f, -0.000745f, +0.000033f}, + {-0.033027f, -0.054815f, -0.011873f, -0.000718f, -0.000112f}, + {-0.056173f, +0.039930f, +0.001299f, -0.001259f, +0.000015f}, + {+0.020372f, -0.043296f, +0.005705f, -0.001029f, +0.000062f}, + {-0.120615f, +0.346286f, -0.013057f, -0.000997f, -0.000098f} + }, + { + {-0.150793f, +0.255763f, -0.018096f, -0.000700f, -0.000003f}, + {+0.305707f, +0.158732f, +0.020717f, -0.002646f, +0.000023f}, + {-0.031522f, +0.078751f, +0.001465f, -0.000649f, +0.000004f}, + {-0.117107f, -0.077176f, -0.004724f, -0.000677f, -0.000018f}, + {+0.093448f, +0.250387f, +0.003900f, +0.000293f, +0.000021f}, + {+0.019351f, +0.028793f, +0.005286f, +0.001746f, +0.000057f}, + {+0.008202f, +0.128064f, +0.008788f, +0.000321f, +0.000014f}, + {-0.007910f, -0.090056f, -0.001122f, -0.000874f, -0.000041f}, + {-0.028598f, +0.475838f, +0.000814f, +0.001596f, +0.000033f} + }, + { + {+0.168446f, -0.229619f, +0.014684f, -0.000669f, +0.000001f}, + {-0.083028f, +0.735157f, -0.014942f, -0.001813f, -0.000016f}, + {+0.038009f, -0.019540f, -0.002379f, +0.000167f, +0.000118f}, + {+0.076227f, -0.357687f, +0.003886f, -0.000171f, +0.000051f}, + {-0.001844f, +0.389834f, -0.002086f, +0.000484f, -0.000036f}, + {+0.023047f, +0.027798f, +0.004234f, +0.000497f, +0.000086f}, + {+0.049557f, +0.071524f, +0.006302f, +0.000906f, -0.000015f}, + {-0.020459f, -0.071010f, -0.006011f, -0.000277f, -0.000043f}, + {+0.164709f, +0.192774f, +0.015494f, +0.000611f, +0.000078f} + }, + { + {+0.032104f, -0.431950f, +0.008160f, +0.000726f, +0.000004f}, + {-0.260971f, +0.444113f, -0.025794f, +0.002256f, -0.000023f}, + {+0.008385f, -0.056100f, +0.003103f, +0.000095f, -0.000018f}, + {+0.067113f, -0.367438f, +0.006254f, +0.000198f, +0.000013f}, + {-0.110994f, +0.232179f, -0.008226f, -0.000230f, -0.000019f}, + {-0.042146f, -0.074633f, -0.011186f, -0.001034f, -0.000080f}, + {-0.054919f, -0.080526f, -0.007215f, -0.000649f, -0.000015f}, + {+0.040307f, +0.016321f, -0.001764f, +0.000829f, +0.000052f}, + {-0.137526f, -0.246324f, -0.007988f, -0.001200f, -0.000047f} + }, + { + {-0.213011f, -0.046980f, -0.025382f, +0.000494f, -0.000002f}, + {+0.288608f, -0.395114f, +0.041290f, +0.001283f, +0.000020f}, + {-0.054132f, +0.049386f, -0.007328f, -0.000057f, -0.000101f}, + {-0.158872f, -0.025219f, -0.014949f, +0.000114f, -0.000051f}, + {+0.121403f, -0.113923f, +0.010204f, -0.000233f, +0.000039f}, + {+0.000083f, -0.147208f, -0.001729f, -0.000936f, -0.000054f}, + {-0.003048f, -0.154788f, -0.006001f, -0.000457f, +0.000017f}, + {-0.025771f, +0.106681f, +0.002198f, +0.000260f, +0.000022f}, + {-0.031294f, -0.392095f, -0.012018f, -0.000574f, -0.000057f} + }, + { + {+0.092561f, +0.424974f, +0.010810f, -0.000681f, -0.000004f}, + {+0.075902f, -0.706014f, +0.007828f, -0.002003f, +0.000022f}, + {+0.013154f, +0.161409f, +0.005603f, -0.000211f, +0.000023f}, + {+0.066254f, +0.312283f, +0.004744f, +0.000026f, -0.000009f}, + {-0.002036f, -0.295824f, +0.002824f, -0.000014f, +0.000016f}, + {+0.060712f, -0.057606f, +0.008012f, +0.000958f, +0.000087f}, + {+0.056082f, -0.061636f, +0.008052f, +0.000524f, +0.000016f}, + {-0.017683f, +0.111805f, -0.002642f, -0.000403f, -0.000052f}, + {+0.146777f, -0.113700f, +0.017959f, +0.001010f, +0.000051f} + }, + { + {+0.185320f, +0.277358f, +0.022712f, -0.000351f, +0.000003f}, + {-0.344646f, -0.053912f, -0.053141f, -0.000939f, -0.000024f}, + {+0.086838f, +0.051841f, +0.006637f, +0.000180f, +0.000089f}, + {+0.105953f, +0.243944f, +0.014187f, -0.000146f, +0.000052f}, + {-0.111669f, -0.123210f, -0.013173f, +0.000233f, -0.000042f}, + {-0.059758f, +0.131270f, -0.005702f, +0.000643f, +0.000024f}, + {-0.036902f, +0.080134f, -0.000673f, +0.000325f, -0.000020f}, + {+0.046052f, +0.010828f, +0.004846f, -0.000246f, -0.000004f}, + {-0.077354f, +0.231910f, -0.006126f, +0.000362f, +0.000039f} + }, + { + {-0.189874f, -0.302002f, -0.024437f, +0.000614f, +0.000004f}, + {+0.115695f, +0.648554f, +0.017187f, +0.001787f, -0.000020f}, + {-0.095557f, -0.230274f, -0.014609f, +0.000114f, -0.000025f}, + {-0.124579f, -0.115101f, -0.017138f, -0.000088f, +0.000005f}, + {+0.076830f, +0.166427f, +0.008366f, +0.000057f, -0.000012f}, + {-0.014099f, +0.211406f, +0.003003f, -0.000568f, -0.000083f}, + {-0.023815f, +0.096932f, -0.005676f, -0.000440f, -0.000016f}, + {-0.021782f, -0.093860f, -0.002871f, +0.000144f, +0.000046f}, + {-0.073734f, +0.238033f, -0.010094f, -0.000798f, -0.000049f} + }, + { + {-0.114426f, -0.412169f, -0.014852f, +0.000236f, -0.000004f}, + {+0.286060f, +0.383093f, +0.046192f, +0.000709f, +0.000026f}, + {-0.046449f, -0.312275f, +0.001217f, -0.000173f, -0.000081f}, + {-0.033813f, -0.256375f, -0.003843f, +0.000097f, -0.000052f}, + {+0.058368f, +0.191934f, +0.007694f, -0.000156f, +0.000044f}, + {+0.082552f, +0.075789f, +0.001514f, -0.000419f, -0.000001f}, + {+0.034473f, +0.003962f, +0.003250f, -0.000222f, +0.000024f}, + {-0.030695f, -0.079541f, -0.002956f, +0.000205f, -0.000008f}, + {+0.109333f, -0.044153f, +0.010252f, -0.000221f, -0.000027f} + }, + { + {+0.243812f, +0.144409f, +0.034010f, -0.000542f, -0.000004f}, + {-0.244934f, -0.430481f, -0.034506f, -0.001609f, +0.000017f}, + {+0.170812f, +0.012823f, +0.017960f, -0.000055f, +0.000026f}, + {+0.131633f, -0.001407f, +0.017629f, +0.000130f, -0.000001f}, + {-0.106876f, -0.065820f, -0.014688f, -0.000058f, +0.000007f}, + {-0.074279f, -0.153828f, -0.004932f, +0.000344f, +0.000072f}, + {+0.015569f, -0.022714f, +0.005207f, +0.000342f, +0.000015f}, + {+0.042274f, +0.032502f, +0.005140f, -0.000141f, -0.000036f}, + {-0.002837f, -0.214678f, +0.001786f, +0.000703f, +0.000045f} + }, + { + {+0.033445f, +0.465385f, +0.003356f, -0.000154f, +0.000005f}, + {-0.178742f, -0.528051f, -0.033152f, -0.000550f, -0.000028f}, + {-0.087971f, +0.405281f, -0.012908f, +0.000193f, +0.000076f}, + {-0.026721f, +0.243121f, -0.004203f, -0.000014f, +0.000052f}, + {+0.002076f, -0.236562f, +0.002162f, +0.000025f, -0.000045f}, + {+0.002032f, -0.267039f, +0.003164f, +0.000247f, -0.000013f}, + {-0.028517f, +0.053584f, -0.006240f, +0.000168f, -0.000027f}, + {+0.008947f, +0.081105f, +0.001162f, -0.000039f, +0.000013f}, + {-0.084445f, -0.084241f, -0.009779f, +0.000091f, +0.000019f} + }, + { + {-0.265151f, +0.001033f, -0.038066f, +0.000492f, +0.000004f}, + {+0.302075f, +0.213979f, +0.045228f, +0.001475f, -0.000016f}, + {-0.119858f, +0.361574f, -0.010750f, +0.000044f, -0.000027f}, + {-0.110652f, +0.115838f, -0.014030f, -0.000216f, -0.000003f}, + {+0.106693f, -0.078792f, +0.012412f, +0.000130f, -0.000002f}, + {+0.068216f, -0.174315f, +0.001858f, -0.000344f, -0.000061f}, + {-0.039397f, +0.042700f, -0.003620f, -0.000322f, -0.000013f}, + {-0.052577f, -0.019393f, -0.009859f, +0.000138f, +0.000029f}, + {+0.042907f, +0.113552f, +0.005000f, -0.000638f, -0.000041f} + }, + { + {+0.045692f, -0.476580f, +0.008546f, +0.000086f, -0.000005f}, + {+0.080587f, +0.555433f, +0.017854f, +0.000450f, +0.000030f}, + {+0.182440f, -0.087182f, +0.017382f, -0.000294f, -0.000073f}, + {+0.075234f, -0.167476f, +0.008676f, +0.000034f, -0.000051f}, + {-0.071029f, +0.192007f, -0.008454f, -0.000011f, +0.000045f}, + {-0.086510f, +0.044174f, -0.003825f, -0.000041f, +0.000021f}, + {+0.075632f, -0.138240f, +0.011735f, -0.000028f, +0.000030f}, + {+0.013949f, -0.129305f, +0.005892f, -0.000040f, -0.000013f}, + {+0.045386f, +0.105892f, +0.005725f, +0.000024f, -0.000013f} + }, + { + {+0.264038f, -0.137768f, +0.037820f, -0.000452f, -0.000003f}, + {-0.327432f, -0.075214f, -0.050477f, -0.001428f, +0.000014f}, + {-0.022770f, -0.385123f, +0.004729f, +0.000100f, +0.000029f}, + {+0.054670f, -0.198426f, +0.007785f, +0.000271f, +0.000006f}, + {-0.049580f, +0.225410f, -0.005863f, -0.000204f, -0.000001f}, + {+0.043237f, +0.226727f, -0.000581f, +0.000235f, +0.000054f}, + {+0.021121f, -0.232475f, -0.003318f, +0.000194f, +0.000010f}, + {+0.068959f, -0.050792f, +0.006419f, -0.000075f, -0.000026f}, + {-0.050269f, -0.045913f, -0.008553f, +0.000508f, +0.000038f} + }, + { + {-0.122605f, +0.455832f, -0.019204f, -0.000024f, +0.000005f}, + {+0.006912f, -0.595107f, -0.002722f, -0.000314f, -0.000031f}, + {-0.131648f, -0.207572f, -0.020072f, +0.000119f, +0.000071f}, + {-0.075587f, -0.001389f, -0.007880f, -0.000200f, +0.000051f}, + {+0.092628f, +0.010795f, +0.009442f, +0.000210f, -0.000045f}, + {+0.034470f, +0.235595f, +0.004153f, +0.000184f, -0.000026f}, + {-0.138101f, +0.003560f, -0.013139f, +0.000044f, -0.000033f}, + {-0.076887f, +0.172735f, -0.011353f, -0.000186f, +0.000014f}, + {-0.018601f, -0.096133f, -0.000488f, -0.000002f, +0.000009f} + }, + { + {-0.239360f, +0.273817f, -0.034391f, +0.000359f, +0.000003f}, + {+0.344438f, -0.077598f, +0.050391f, +0.001368f, -0.000013f}, + {+0.085915f, +0.127791f, +0.009171f, +0.000053f, -0.000030f}, + {-0.003884f, +0.104668f, -0.002926f, -0.000117f, -0.000009f}, + {-0.025938f, -0.166624f, -0.001223f, -0.000030f, +0.000004f}, + {-0.087357f, +0.053855f, -0.006567f, -0.000375f, -0.000050f}, + {+0.079989f, +0.335328f, +0.010537f, -0.000213f, -0.000007f}, + {-0.027119f, +0.254717f, +0.001273f, +0.000328f, +0.000025f}, + {+0.049245f, +0.007836f, +0.007008f, -0.000515f, -0.000036f} + }, + { + {+0.189098f, -0.383414f, +0.028124f, +0.000092f, -0.000006f}, + {-0.108559f, +0.623832f, -0.013156f, +0.000170f, +0.000033f}, + {+0.052357f, +0.172914f, +0.014590f, -0.000154f, -0.000071f}, + {+0.027066f, +0.057228f, +0.004014f, +0.000183f, -0.000051f}, + {-0.042915f, -0.138441f, -0.007131f, -0.000079f, +0.000046f}, + {+0.062416f, -0.169373f, +0.002459f, -0.000150f, +0.000033f}, + {+0.109725f, +0.292825f, +0.008449f, +0.000038f, +0.000034f}, + {+0.124357f, +0.027929f, +0.015491f, +0.000061f, -0.000016f}, + {-0.001095f, +0.082699f, -0.001391f, +0.000112f, -0.000006f} + }, + { + {+0.194740f, -0.370983f, +0.028830f, -0.000424f, -0.000003f}, + {-0.334444f, +0.280705f, -0.047056f, -0.001250f, +0.000011f}, + {-0.070560f, -0.024714f, -0.010185f, -0.000110f, +0.000033f}, + {+0.007889f, +0.031645f, +0.004166f, +0.000046f, +0.000012f}, + {+0.044996f, -0.004394f, +0.003024f, +0.000024f, -0.000007f}, + {+0.022525f, -0.227369f, +0.001642f, +0.000313f, +0.000046f}, + {-0.165185f, -0.117904f, -0.015701f, +0.000142f, +0.000004f}, + {-0.080987f, -0.285489f, -0.008434f, -0.000232f, -0.000025f}, + {-0.049085f, +0.003557f, -0.010651f, +0.000401f, +0.000034f} + }, + { + {-0.234674f, +0.289561f, -0.036001f, +0.000013f, +0.000007f}, + {+0.223672f, -0.578241f, +0.027233f, -0.000092f, -0.000035f}, + {-0.024623f, -0.100323f, -0.004564f, +0.000328f, +0.000072f}, + {+0.017801f, +0.020633f, -0.002076f, -0.000042f, +0.000053f}, + {-0.013115f, +0.081785f, +0.000959f, -0.000079f, -0.000049f}, + {-0.080738f, -0.072886f, -0.004201f, +0.000076f, -0.000042f}, + {-0.002607f, -0.352196f, -0.003911f, -0.000017f, -0.000036f}, + {-0.069172f, -0.307620f, -0.004866f, -0.000006f, +0.000021f}, + {+0.028180f, -0.122432f, +0.007621f, -0.000085f, +0.000003f} + }, + { + {-0.147199f, +0.422160f, -0.022071f, +0.000321f, +0.000003f}, + {+0.267023f, -0.513414f, +0.037707f, +0.001150f, -0.000010f}, + {+0.060495f, +0.031583f, +0.008763f, -0.000093f, -0.000037f}, + {-0.065578f, -0.105960f, -0.010002f, -0.000209f, -0.000017f}, + {-0.014195f, +0.075807f, -0.002631f, +0.000201f, +0.000012f}, + {+0.053647f, +0.122427f, +0.002638f, -0.000093f, -0.000039f}, + {+0.142781f, -0.115711f, +0.024592f, -0.000188f, -0.000001f}, + {+0.149590f, +0.020216f, +0.015264f, -0.000015f, +0.000023f}, + {+0.037239f, -0.118872f, +0.000382f, -0.000458f, -0.000033f} + }, + { + {+0.269441f, -0.218896f, +0.041241f, +0.000004f, -0.000008f}, + {-0.303693f, +0.362352f, -0.037014f, +0.000053f, +0.000037f}, + {+0.007833f, +0.119694f, -0.000960f, -0.000345f, -0.000073f}, + {-0.004355f, -0.200633f, +0.001490f, +0.000103f, -0.000055f}, + {+0.032562f, -0.000305f, +0.004514f, -0.000019f, +0.000051f}, + {+0.017941f, +0.163230f, +0.007036f, -0.000034f, +0.000051f}, + {-0.046904f, +0.177005f, -0.004300f, +0.000147f, +0.000038f}, + {-0.058069f, +0.331227f, -0.002327f, +0.000118f, -0.000026f}, + {-0.065673f, +0.027120f, -0.006378f, +0.000220f, -0.000001f} + }, + { + {+0.096520f, -0.484461f, +0.013741f, -0.000314f, -0.000002f}, + {-0.168182f, +0.564851f, -0.028399f, -0.001136f, +0.000010f}, + {-0.055680f, +0.028246f, -0.005855f, +0.000184f, +0.000045f}, + {+0.118738f, -0.014371f, +0.012220f, +0.000155f, +0.000023f}, + {-0.022063f, -0.085271f, -0.002211f, -0.000137f, -0.000019f}, + {-0.049978f, +0.052230f, -0.005756f, -0.000013f, +0.000028f}, + {-0.111748f, +0.067754f, -0.020811f, +0.000056f, -0.000003f}, + {-0.098929f, +0.266647f, -0.009254f, +0.000013f, -0.000019f}, + {+0.022954f, +0.155435f, -0.001383f, +0.000344f, +0.000033f} + }, + { + {-0.298102f, +0.119927f, -0.044074f, +0.000054f, +0.000009f}, + {+0.324241f, -0.201048f, +0.044886f, +0.000061f, -0.000040f}, + {+0.018875f, -0.083814f, -0.000418f, +0.000398f, +0.000073f}, + {-0.061162f, +0.256472f, -0.008387f, +0.000024f, +0.000055f}, + {-0.028563f, -0.073381f, -0.002819f, -0.000106f, -0.000051f}, + {+0.019828f, -0.052279f, +0.002320f, -0.000130f, -0.000057f}, + {+0.058477f, -0.203321f, +0.012650f, -0.000104f, -0.000040f}, + {+0.133242f, -0.084836f, +0.013242f, -0.000015f, +0.000030f}, + {+0.042678f, +0.121577f, +0.007398f, -0.000185f, -0.000002f} + }, + { + {-0.034897f, +0.521904f, -0.005636f, +0.000275f, +0.000001f}, + {+0.096022f, -0.555951f, +0.014099f, +0.001080f, -0.000009f}, + {+0.022232f, -0.076542f, +0.003659f, -0.000139f, -0.000053f}, + {-0.117964f, +0.166708f, -0.014124f, -0.000190f, -0.000030f}, + {+0.054876f, +0.054232f, +0.005942f, +0.000155f, +0.000026f}, + {+0.020865f, -0.046834f, +0.005114f, +0.000034f, -0.000016f}, + {+0.119090f, -0.116285f, +0.014688f, -0.000066f, +0.000006f}, + {-0.009162f, -0.296851f, +0.001585f, -0.000015f, +0.000013f}, + {-0.057034f, -0.032243f, -0.004358f, -0.000329f, -0.000032f} + }, + { + {+0.309227f, -0.006599f, +0.046261f, -0.000088f, -0.000010f}, + {-0.335689f, +0.108899f, -0.045170f, -0.000116f, +0.000044f}, + {-0.010768f, -0.025357f, +0.000938f, -0.000529f, -0.000070f}, + {+0.120101f, -0.199389f, +0.018645f, -0.000027f, -0.000054f}, + {+0.005167f, +0.128785f, -0.000940f, +0.000138f, +0.000050f}, + {-0.023264f, +0.025419f, -0.006527f, +0.000284f, +0.000058f}, + {-0.107846f, +0.228561f, -0.015701f, +0.000136f, +0.000041f}, + {-0.112356f, -0.131761f, -0.015190f, -0.000104f, -0.000031f}, + {+0.003668f, -0.126548f, +0.000034f, +0.000218f, +0.000005f} + }, + { + {-0.027502f, -0.522603f, -0.003411f, -0.000264f, -0.000000f}, + {-0.030738f, +0.578245f, -0.004213f, -0.001069f, +0.000007f}, + {-0.000609f, -0.013454f, -0.002363f, +0.000076f, +0.000061f}, + {+0.087398f, -0.248212f, +0.011938f, +0.000075f, +0.000037f}, + {-0.076224f, +0.003106f, -0.010057f, -0.000063f, -0.000032f}, + {-0.005937f, +0.057510f, -0.000360f, +0.000077f, +0.000005f}, + {-0.095342f, +0.246056f, -0.013136f, +0.000057f, -0.000011f}, + {+0.080706f, +0.167833f, +0.010054f, +0.000007f, -0.000008f}, + {+0.052615f, -0.051218f, +0.005205f, +0.000238f, +0.000032f} + }, + { + {-0.304352f, -0.097670f, -0.045722f, +0.000119f, +0.000010f}, + {+0.340086f, +0.006265f, +0.046602f, +0.000169f, -0.000048f}, + {-0.020424f, +0.011099f, -0.001667f, +0.000571f, +0.000066f}, + {-0.162423f, +0.138866f, -0.025027f, +0.000093f, +0.000052f}, + {+0.033809f, -0.166438f, +0.006399f, -0.000195f, -0.000048f}, + {+0.027146f, +0.011761f, +0.003177f, -0.000395f, -0.000056f}, + {+0.155957f, -0.140724f, +0.023139f, -0.000149f, -0.000042f}, + {+0.050658f, +0.213522f, +0.006115f, +0.000088f, +0.000030f}, + {-0.039762f, +0.093271f, -0.004720f, -0.000234f, -0.000009f} + }, + { + {+0.084174f, +0.498153f, +0.011738f, +0.000258f, -0.000001f}, + {-0.034060f, -0.568731f, -0.004971f, +0.001035f, -0.000004f}, + {+0.017008f, +0.063888f, +0.000389f, +0.000004f, -0.000066f}, + {-0.040634f, +0.328420f, -0.004057f, -0.000038f, -0.000042f}, + {+0.073934f, -0.106271f, +0.009079f, +0.000021f, +0.000038f}, + {-0.016227f, -0.051899f, +0.000373f, -0.000148f, +0.000001f}, + {+0.040260f, -0.318605f, +0.006025f, -0.000077f, +0.000015f}, + {-0.100959f, -0.021877f, -0.014425f, +0.000114f, +0.000006f}, + {-0.027106f, +0.113757f, -0.001462f, -0.000158f, -0.000030f} + }, + { + {+0.289347f, +0.183367f, +0.043677f, -0.000132f, -0.000010f}, + {-0.332610f, -0.106477f, -0.046382f, -0.000181f, +0.000052f}, + {+0.030172f, +0.040872f, +0.005239f, -0.000542f, -0.000065f}, + {+0.188712f, -0.022024f, +0.026128f, -0.000084f, -0.000051f}, + {-0.071871f, +0.114351f, -0.009162f, +0.000197f, +0.000047f}, + {-0.013433f, -0.054663f, -0.003535f, +0.000343f, +0.000057f}, + {-0.178475f, +0.017894f, -0.025738f, +0.000205f, +0.000044f}, + {+0.010117f, -0.193309f, +0.001195f, -0.000079f, -0.000031f}, + {+0.059297f, -0.019649f, +0.006335f, +0.000285f, +0.000013f} + }, + { + {-0.134846f, -0.467842f, -0.019524f, -0.000244f, +0.000001f}, + {+0.092222f, +0.547291f, +0.014252f, -0.000986f, +0.000001f}, + {-0.040107f, -0.068680f, -0.004663f, +0.000023f, +0.000071f}, + {-0.024493f, -0.346874f, -0.002774f, +0.000070f, +0.000048f}, + {-0.047272f, +0.147189f, -0.008626f, -0.000053f, -0.000044f}, + {+0.026008f, +0.007599f, +0.001975f, +0.000132f, -0.000005f}, + {+0.030534f, +0.339732f, +0.003406f, +0.000035f, -0.000020f}, + {+0.083347f, -0.077557f, +0.013266f, -0.000128f, -0.000007f}, + {-0.013672f, -0.131388f, -0.003403f, +0.000118f, +0.000027f} + }, + { + {-0.267902f, -0.264872f, -0.040046f, +0.000129f, +0.000011f}, + {+0.321912f, +0.191063f, +0.044992f, +0.000193f, -0.000056f}, + {-0.022572f, -0.096725f, -0.002705f, +0.000503f, +0.000069f}, + {-0.176343f, -0.111752f, -0.025706f, +0.000048f, +0.000053f}, + {+0.084811f, -0.059741f, +0.013684f, -0.000183f, -0.000048f}, + {-0.004452f, +0.055305f, +0.000514f, -0.000261f, -0.000064f}, + {+0.161895f, +0.139155f, +0.022695f, -0.000241f, -0.000046f}, + {-0.046966f, +0.125238f, -0.006695f, +0.000013f, +0.000036f}, + {-0.046666f, -0.080465f, -0.004500f, -0.000378f, -0.000014f} + }, + { + {+0.182763f, +0.425959f, +0.026111f, +0.000216f, -0.000001f}, + {-0.151967f, -0.538951f, -0.023953f, +0.000917f, +0.000002f}, + {+0.059967f, +0.029780f, +0.006750f, -0.000233f, -0.000082f}, + {+0.071926f, +0.268254f, +0.009365f, -0.000173f, -0.000058f}, + {+0.030147f, -0.144364f, +0.004637f, +0.000155f, +0.000054f}, + {-0.022610f, +0.026139f, -0.001896f, +0.000081f, +0.000015f}, + {-0.089140f, -0.244883f, -0.010242f, +0.000037f, +0.000027f}, + {-0.053982f, +0.112441f, -0.009466f, +0.000027f, +0.000006f}, + {+0.043125f, +0.054784f, +0.006054f, -0.000118f, -0.000026f} + }, + { + {+0.236555f, +0.344253f, +0.035451f, -0.000140f, -0.000014f}, + {-0.305017f, -0.302445f, -0.041503f, -0.000225f, +0.000061f}, + {+0.000099f, +0.121249f, +0.000347f, -0.000531f, -0.000075f}, + {+0.147839f, +0.147624f, +0.023593f, -0.000074f, -0.000055f}, + {-0.099074f, +0.056676f, -0.015836f, +0.000238f, +0.000049f}, + {+0.015365f, -0.033058f, +0.001023f, +0.000263f, +0.000075f}, + {-0.115117f, -0.202631f, -0.018500f, +0.000266f, +0.000048f}, + {+0.062522f, -0.070317f, +0.009998f, +0.000023f, -0.000045f}, + {+0.009357f, +0.103095f, +0.001665f, +0.000461f, +0.000014f} + }, + { + {-0.223414f, -0.360443f, -0.031653f, -0.000161f, +0.000003f}, + {+0.220330f, +0.504684f, +0.033230f, -0.000874f, -0.000003f}, + {-0.065668f, +0.018345f, -0.008069f, +0.000490f, +0.000105f}, + {-0.094224f, -0.228227f, -0.015610f, +0.000296f, +0.000075f}, + {-0.011044f, +0.195618f, +0.000221f, -0.000284f, -0.000070f}, + {+0.015206f, -0.030774f, +0.001584f, -0.000377f, -0.000037f}, + {+0.112319f, +0.149909f, +0.015570f, -0.000082f, -0.000037f}, + {+0.027593f, -0.125221f, +0.004605f, +0.000167f, +0.000001f}, + {-0.035657f, +0.033761f, -0.006506f, +0.000132f, +0.000027f} + }, + { + {-0.197435f, -0.400152f, -0.030189f, +0.000183f, +0.000017f}, + {+0.265346f, +0.433349f, +0.035911f, +0.000309f, -0.000070f}, + {+0.024825f, -0.121781f, +0.003662f, +0.000791f, +0.000075f}, + {-0.131639f, -0.172895f, -0.018896f, +0.000200f, +0.000051f}, + {+0.118431f, -0.000422f, +0.015867f, -0.000387f, -0.000045f}, + {-0.018068f, +0.023258f, -0.002724f, -0.000522f, -0.000082f}, + {+0.072974f, +0.212278f, +0.011511f, -0.000340f, -0.000047f}, + {-0.068530f, +0.023641f, -0.010358f, +0.000042f, +0.000055f}, + {+0.013236f, -0.038962f, +0.000910f, -0.000477f, -0.000015f} + }, + { + {+0.253363f, +0.291660f, +0.036499f, +0.000094f, -0.000007f}, + {-0.281798f, -0.406628f, -0.041589f, +0.000891f, +0.000005f}, + {+0.059479f, -0.066959f, +0.007177f, -0.000628f, -0.000142f}, + {+0.120109f, +0.213729f, +0.018705f, -0.000288f, -0.000099f}, + {-0.027666f, -0.223189f, -0.003521f, +0.000300f, +0.000093f}, + {-0.013844f, +0.028875f, -0.000557f, +0.000575f, +0.000072f}, + {-0.118976f, -0.083818f, -0.016708f, +0.000094f, +0.000049f}, + {-0.002209f, +0.126405f, -0.000845f, -0.000338f, -0.000017f}, + {+0.011760f, -0.039638f, +0.005259f, -0.000091f, -0.000032f} + }, + { + {+0.156753f, +0.440657f, +0.023910f, -0.000253f, -0.000018f}, + {-0.203795f, -0.522732f, -0.028158f, -0.000411f, +0.000085f}, + {-0.046218f, +0.097129f, -0.007205f, -0.001249f, -0.000056f}, + {+0.112467f, +0.226687f, +0.015571f, -0.000451f, -0.000035f}, + {-0.117838f, -0.083303f, -0.016703f, +0.000616f, +0.000028f}, + {+0.023412f, -0.030837f, +0.004021f, +0.001018f, +0.000071f}, + {-0.037437f, -0.211830f, -0.005723f, +0.000467f, +0.000043f}, + {+0.064323f, +0.023579f, +0.009934f, -0.000232f, -0.000060f}, + {-0.009156f, -0.006104f, -0.001969f, +0.000387f, +0.000022f} + }, + { + {-0.275944f, -0.222761f, -0.039627f, -0.000066f, +0.000013f}, + {+0.322019f, +0.286370f, +0.048482f, -0.000959f, -0.000014f}, + {-0.046923f, +0.094317f, -0.005599f, +0.000435f, +0.000182f}, + {-0.150750f, -0.177020f, -0.022662f, +0.000117f, +0.000123f}, + {+0.067347f, +0.202691f, +0.009894f, -0.000124f, -0.000115f}, + {+0.015081f, -0.042971f, +0.000082f, -0.000445f, -0.000114f}, + {+0.117640f, +0.025700f, +0.015946f, -0.000085f, -0.000063f}, + {-0.016418f, -0.100980f, -0.001676f, +0.000298f, +0.000040f}, + {-0.000250f, +0.010429f, -0.002435f, -0.000017f, +0.000037f} + }, + { + {-0.115447f, -0.469158f, -0.017950f, +0.000366f, +0.000017f}, + {+0.134884f, +0.571706f, +0.018454f, +0.000373f, -0.000105f}, + {+0.067420f, -0.084270f, +0.010575f, +0.001650f, +0.000010f}, + {-0.076003f, -0.293259f, -0.009993f, +0.000579f, +0.000003f}, + {+0.098520f, +0.155744f, +0.013412f, -0.000754f, +0.000004f}, + {-0.039536f, +0.043110f, -0.005899f, -0.001509f, -0.000034f}, + {+0.003041f, +0.203039f, +0.001212f, -0.000536f, -0.000033f}, + {-0.056528f, -0.038194f, -0.009590f, +0.000577f, +0.000054f}, + {-0.001245f, +0.013315f, +0.000319f, -0.000346f, -0.000036f} + }, + { + {+0.292999f, +0.157930f, +0.042403f, +0.000087f, -0.000020f}, + {-0.342354f, -0.162255f, -0.051635f, +0.001110f, +0.000034f}, + {+0.022156f, -0.154740f, +0.000608f, +0.000173f, -0.000208f}, + {+0.168151f, +0.078549f, +0.023857f, +0.000280f, -0.000137f}, + {-0.096594f, -0.143573f, -0.013193f, -0.000234f, +0.000126f}, + {-0.002506f, +0.100103f, +0.002757f, -0.000120f, +0.000144f}, + {-0.102496f, +0.041774f, -0.013753f, -0.000024f, +0.000074f}, + {+0.028733f, +0.095250f, +0.004398f, -0.000056f, -0.000064f}, + {-0.000053f, +0.012400f, +0.002539f, +0.000289f, -0.000038f} + }, + { + {+0.073802f, +0.495430f, +0.011185f, -0.000471f, -0.000013f}, + {-0.067107f, -0.583553f, -0.008494f, -0.000150f, +0.000126f}, + {-0.082122f, +0.004027f, -0.011237f, -0.001551f, +0.000060f}, + {+0.028928f, +0.288941f, +0.005398f, -0.000320f, +0.000043f}, + {-0.067365f, -0.187138f, -0.009613f, +0.000522f, -0.000049f}, + {+0.053548f, +0.014546f, +0.006738f, +0.001557f, -0.000028f}, + {+0.021691f, -0.148588f, +0.001549f, +0.000530f, +0.000018f}, + {+0.052283f, +0.060853f, +0.007887f, -0.000799f, -0.000034f}, + {+0.008489f, -0.003383f, +0.001566f, +0.000494f, +0.000057f} + }, + { + {-0.307330f, -0.088798f, -0.043952f, -0.000185f, +0.000025f}, + {+0.348741f, +0.055377f, +0.052852f, -0.001109f, -0.000070f}, + {+0.020133f, +0.157206f, +0.002804f, -0.000807f, +0.000201f}, + {-0.157718f, +0.000354f, -0.025108f, -0.000577f, +0.000129f}, + {+0.107002f, +0.082667f, +0.016074f, +0.000429f, -0.000116f}, + {-0.027699f, -0.106463f, -0.004855f, +0.000830f, -0.000144f}, + {+0.076446f, -0.063154f, +0.011339f, +0.000105f, -0.000081f}, + {-0.046001f, -0.090381f, -0.006439f, -0.000517f, +0.000079f}, + {-0.003916f, -0.020923f, -0.003928f, -0.000676f, +0.000026f} + }, + { + {-0.027283f, -0.518967f, -0.004482f, +0.000531f, +0.000006f}, + {+0.002104f, +0.586753f, -0.000310f, -0.000388f, -0.000138f}, + {+0.067195f, +0.083021f, +0.013467f, -0.000261f, -0.000139f}, + {+0.000203f, -0.242050f, +0.002218f, -0.001130f, -0.000092f}, + {+0.041057f, +0.183900f, +0.003084f, +0.000869f, +0.000096f}, + {-0.043480f, -0.079977f, -0.008525f, -0.000104f, +0.000100f}, + {-0.026266f, +0.096019f, -0.004003f, -0.000222f, +0.000001f}, + {-0.040550f, -0.099815f, -0.006813f, +0.000626f, +0.000005f}, + {-0.012858f, -0.005094f, -0.001938f, -0.001102f, -0.000079f} + }, + { + {+0.314481f, +0.005188f, +0.044811f, +0.000426f, -0.000028f}, + {-0.346528f, +0.051746f, -0.052277f, +0.000401f, +0.000122f}, + {-0.053118f, -0.097595f, -0.002410f, +0.001225f, -0.000151f}, + {+0.140849f, -0.024347f, +0.026727f, +0.000253f, -0.000095f}, + {-0.107847f, -0.047702f, -0.019644f, +0.000097f, +0.000079f}, + {+0.051228f, +0.061068f, +0.003689f, -0.001630f, +0.000102f}, + {-0.056164f, +0.049815f, -0.009319f, +0.000032f, +0.000080f}, + {+0.061891f, +0.058300f, +0.009871f, +0.001903f, -0.000079f}, + {+0.009880f, +0.028684f, +0.006879f, +0.001108f, +0.000001f} + } +}; + +#endif + +#ifdef UPDATE_SBA_FILTER + +const float FASTCONV_FOA_latency_s = 0.000666667f; +const float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= +{ + { + {+0.001139f, +0.701381f, +0.088362f, +0.001507f, +0.000002f}, + {+0.000414f, +0.262095f, -0.237214f, -0.003224f, +0.000036f}, + {+0.002081f, +0.073269f, +0.016442f, -0.002305f, -0.000016f}, + {+0.003374f, +0.067272f, -0.027345f, -0.000156f, +0.000027f} + }, + { + {-0.006858f, +0.573976f, -0.025590f, -0.002173f, -0.000001f}, + {-0.018683f, +0.673324f, +0.155049f, +0.004529f, -0.000042f}, + {-0.004167f, -0.005579f, -0.043222f, +0.004198f, +0.000026f}, + {-0.007696f, +0.026588f, -0.047141f, +0.000930f, -0.000031f} + }, + { + {+0.022690f, +0.504423f, -0.025668f, -0.000505f, -0.000002f}, + {+0.098922f, +0.785742f, +0.002391f, +0.001725f, -0.000029f}, + {+0.001996f, -0.028688f, -0.031830f, -0.002187f, +0.000003f}, + {+0.012563f, -0.012620f, -0.033386f, -0.001639f, -0.000022f} + }, + { + {-0.068470f, +0.403356f, +0.003719f, +0.002403f, +0.000001f}, + {-0.238766f, +0.395418f, +0.032160f, -0.006283f, +0.000045f}, + {-0.003715f, -0.000119f, +0.009760f, -0.000148f, -0.000031f}, + {-0.028559f, -0.040197f, +0.002155f, +0.000892f, +0.000033f} + }, + { + {+0.145134f, +0.119557f, +0.007639f, -0.000923f, +0.000003f}, + {+0.294065f, -0.334693f, -0.019103f, +0.002511f, +0.000020f}, + {+0.020226f, -0.024338f, +0.012605f, +0.001278f, +0.000012f}, + {+0.043958f, -0.145428f, +0.013697f, +0.000566f, +0.000018f} + }, + { + {-0.153301f, -0.308264f, -0.003171f, -0.001265f, -0.000001f}, + {-0.095935f, -0.863498f, -0.010369f, +0.003299f, -0.000045f}, + {-0.032438f, -0.100491f, +0.003144f, -0.001769f, +0.000029f}, + {-0.013113f, -0.237010f, +0.000894f, -0.000875f, -0.000033f} + }, + { + {-0.012428f, -0.509031f, -0.004688f, +0.000988f, -0.000003f}, + {-0.244664f, -0.595158f, -0.023888f, -0.002491f, -0.000012f}, + {+0.002609f, -0.144907f, -0.010043f, +0.000781f, -0.000027f}, + {-0.074154f, -0.145409f, -0.008757f, -0.000058f, -0.000014f} + }, + { + {+0.212788f, -0.155514f, +0.023333f, +0.000561f, +0.000002f}, + {+0.330585f, +0.291160f, +0.047010f, -0.002016f, +0.000043f}, + {+0.050155f, -0.068056f, -0.001580f, +0.001116f, -0.000021f}, + {+0.122861f, +0.153186f, +0.009329f, +0.000801f, +0.000032f} + }, + { + {-0.148866f, +0.399380f, -0.016077f, -0.000584f, +0.000004f}, + {+0.007222f, +0.769639f, -0.001057f, +0.002043f, +0.000007f}, + {-0.045137f, +0.068695f, +0.001800f, -0.000989f, +0.000039f}, + {-0.030243f, +0.388427f, -0.005358f, -0.000487f, +0.000012f} + }, + { + {-0.148858f, +0.389050f, -0.019934f, -0.000504f, -0.000003f}, + {-0.349211f, +0.214703f, -0.051501f, +0.001478f, -0.000039f}, + {-0.029971f, +0.074752f, -0.006844f, -0.000679f, +0.000009f}, + {-0.127591f, +0.245277f, -0.008622f, -0.000243f, -0.000032f} + }, + { + {+0.239012f, -0.214946f, +0.031611f, +0.000498f, -0.000004f}, + {+0.196316f, -0.613847f, +0.027133f, -0.001726f, -0.000004f}, + {+0.059322f, -0.077618f, +0.010338f, +0.000544f, -0.000046f}, + {+0.142102f, -0.158560f, +0.013819f, +0.000336f, -0.000011f} + }, + { + {+0.056721f, -0.491541f, +0.006821f, +0.000413f, +0.000004f}, + {+0.248916f, -0.524024f, +0.041690f, -0.001135f, +0.000035f}, + {+0.029432f, -0.129169f, -0.000386f, +0.000757f, +0.000007f}, + {+0.025409f, -0.327769f, +0.004549f, +0.000075f, +0.000034f} + }, + { + {-0.277481f, +0.028032f, -0.037920f, -0.000438f, +0.000003f}, + {-0.308141f, +0.332951f, -0.045686f, +0.001496f, +0.000003f}, + {-0.108659f, +0.087169f, -0.015132f, -0.000418f, +0.000046f}, + {-0.144191f, -0.063507f, -0.018317f, -0.000173f, +0.000009f} + }, + { + {+0.037467f, +0.509783f, +0.006165f, -0.000331f, -0.000005f}, + {-0.118379f, +0.623008f, -0.023288f, +0.000858f, -0.000032f}, + {+0.020828f, +0.293771f, +0.009322f, -0.000570f, -0.000020f}, + {+0.044708f, +0.223468f, +0.005411f, -0.000025f, -0.000036f} + }, + { + {+0.276681f, +0.136508f, +0.039053f, +0.000399f, -0.000002f}, + {+0.342800f, -0.086499f, +0.051427f, -0.001312f, -0.000004f}, + {+0.141529f, +0.115364f, +0.013240f, +0.000205f, -0.000040f}, + {+0.110040f, +0.119206f, +0.016186f, +0.000083f, -0.000006f} + }, + { + {-0.117783f, -0.468960f, -0.017913f, +0.000250f, +0.000005f}, + {+0.005671f, -0.604318f, +0.007143f, -0.000660f, +0.000031f}, + {-0.130049f, -0.297226f, -0.017966f, +0.000439f, +0.000030f}, + {-0.077788f, -0.170577f, -0.011766f, -0.000035f, +0.000037f} + }, + { + {-0.252966f, -0.256306f, -0.036605f, -0.000365f, +0.000002f}, + {-0.337478f, -0.074281f, -0.052432f, +0.001197f, +0.000005f}, + {-0.072906f, -0.386255f, -0.005369f, -0.000119f, +0.000033f}, + {-0.075520f, -0.174614f, -0.010607f, -0.000037f, +0.000003f} + }, + { + {+0.180447f, +0.410401f, +0.027706f, -0.000193f, -0.000005f}, + {+0.079743f, +0.570802f, +0.007521f, +0.000528f, -0.000032f}, + {+0.189755f, +0.008151f, +0.021117f, -0.000340f, -0.000036f}, + {+0.097648f, +0.090203f, +0.013931f, +0.000113f, -0.000038f} + }, + { + {+0.221150f, +0.344584f, +0.031954f, +0.000342f, -0.000001f}, + {+0.324392f, +0.195009f, +0.049761f, -0.001141f, -0.000005f}, + {-0.055564f, +0.372598f, -0.003229f, +0.000147f, -0.000026f}, + {+0.029197f, +0.196512f, +0.004268f, -0.000027f, +0.000001f} + }, + { + {-0.234543f, -0.356749f, -0.036109f, +0.000161f, +0.000005f}, + {-0.158828f, -0.551737f, -0.020300f, -0.000447f, +0.000034f}, + {-0.128996f, +0.253163f, -0.019502f, +0.000205f, +0.000038f}, + {-0.086326f, +0.024093f, -0.010653f, -0.000104f, +0.000038f} + }, + { + {-0.180736f, -0.438688f, -0.025011f, -0.000324f, +0.000001f}, + {-0.301948f, -0.334020f, -0.045105f, +0.001128f, +0.000004f}, + {+0.108851f, -0.109590f, +0.011684f, +0.000065f, +0.000022f}, + {+0.007794f, -0.114979f, -0.002557f, +0.000055f, -0.000004f} + }, + { + {+0.283619f, +0.272902f, +0.041849f, -0.000148f, -0.000005f}, + {+0.241474f, +0.503493f, +0.031717f, +0.000352f, -0.000035f}, + {+0.045390f, -0.198917f, +0.011556f, -0.000593f, -0.000041f}, + {+0.041019f, -0.061071f, +0.008824f, +0.000017f, -0.000039f} + }, + { + {+0.123506f, +0.516214f, +0.017365f, +0.000301f, -0.000001f}, + {+0.256327f, +0.482583f, +0.037542f, -0.001057f, -0.000002f}, + {-0.083839f, +0.008074f, -0.016916f, +0.000282f, -0.000018f}, + {+0.003422f, -0.003727f, +0.003177f, -0.000000f, +0.000006f} + }, + { + {-0.313797f, -0.154486f, -0.046391f, +0.000147f, +0.000005f}, + {-0.319981f, -0.404727f, -0.042569f, -0.000317f, +0.000036f}, + {-0.021107f, +0.110660f, -0.004978f, +0.000416f, +0.000047f}, + {-0.008153f, -0.022716f, -0.004670f, +0.000045f, +0.000040f} + }, + { + {-0.061089f, -0.539358f, -0.009248f, -0.000286f, +0.000001f}, + {-0.177073f, -0.627220f, -0.025260f, +0.001022f, +0.000001f}, + {+0.071424f, -0.032340f, +0.013321f, -0.000179f, +0.000014f}, + {-0.053388f, +0.046353f, -0.007111f, -0.000176f, -0.000010f} + }, + { + {+0.324287f, +0.053524f, +0.049068f, -0.000116f, -0.000006f}, + {+0.369344f, +0.211212f, +0.048775f, +0.000225f, -0.000037f}, + {+0.008002f, -0.135643f, +0.001207f, -0.000329f, -0.000053f}, + {+0.026056f, +0.169088f, +0.008645f, +0.000250f, -0.000042f} + }, + { + {+0.005776f, +0.541579f, +0.000581f, +0.000240f, -0.000000f}, + {+0.077934f, +0.656141f, +0.014760f, -0.000940f, -0.000001f}, + {-0.071537f, -0.021095f, -0.007901f, +0.000019f, -0.000006f}, + {+0.095328f, +0.067372f, +0.010448f, -0.000101f, +0.000015f} + }, + { + {-0.328162f, +0.029093f, -0.049230f, +0.000107f, +0.000007f}, + {-0.369662f, -0.037217f, -0.051825f, -0.000167f, +0.000038f}, + {+0.023527f, +0.120022f, -0.000102f, +0.000278f, +0.000058f}, + {-0.090284f, -0.212186f, -0.013169f, -0.000132f, +0.000043f} + }, + { + {+0.048978f, -0.548479f, +0.007485f, -0.000233f, -0.000001f}, + {-0.003228f, -0.602938f, -0.001617f, +0.000911f, +0.000001f}, + {+0.040104f, +0.095644f, +0.005888f, -0.000009f, -0.000005f}, + {-0.081710f, -0.220378f, -0.013048f, -0.000016f, -0.000021f} + }, + { + {+0.324250f, -0.126479f, +0.048291f, -0.000066f, -0.000007f}, + {+0.357292f, -0.046143f, +0.050921f, +0.000098f, -0.000041f}, + {-0.027149f, -0.003860f, +0.000272f, -0.000124f, -0.000060f}, + {+0.141329f, +0.121139f, +0.018219f, +0.000314f, -0.000043f} + }, + { + {-0.104734f, +0.530347f, -0.015582f, +0.000224f, +0.000002f}, + {-0.054628f, +0.590170f, -0.008056f, -0.000909f, +0.000000f}, + {-0.005584f, -0.032979f, -0.004816f, +0.000029f, +0.000015f}, + {+0.037866f, +0.274890f, +0.006759f, -0.000046f, +0.000027f} + }, + { + {-0.308177f, +0.218644f, -0.045991f, +0.000043f, +0.000007f}, + {-0.346201f, +0.142031f, -0.048180f, -0.000046f, +0.000045f}, + {-0.007019f, -0.030662f, -0.000480f, +0.000081f, +0.000058f}, + {-0.162861f, -0.035781f, -0.023778f, -0.000324f, +0.000041f} + }, + { + {+0.155747f, -0.491433f, +0.022764f, -0.000231f, -0.000003f}, + {+0.112390f, -0.563014f, +0.016093f, +0.000905f, -0.000002f}, + {+0.014636f, -0.060316f, +0.003797f, -0.000151f, -0.000023f}, + {+0.007188f, -0.297579f, +0.001361f, +0.000018f, -0.000032f} + }, + { + {+0.282333f, -0.296973f, +0.042631f, -0.000038f, -0.000007f}, + {+0.325943f, -0.233378f, +0.045604f, +0.000052f, -0.000049f}, + {+0.025539f, -0.043016f, +0.004050f, -0.000129f, -0.000057f}, + {+0.170600f, -0.047495f, +0.024487f, +0.000283f, -0.000040f} + }, + { + {-0.198966f, +0.440444f, -0.029339f, +0.000240f, +0.000003f}, + {-0.163937f, +0.519986f, -0.024102f, -0.000910f, +0.000006f}, + {-0.041643f, +0.059924f, -0.008056f, +0.000252f, +0.000028f}, + {-0.058279f, +0.303786f, -0.008000f, +0.000033f, +0.000037f} + }, + { + {-0.251233f, +0.360645f, -0.037855f, +0.000048f, +0.000007f}, + {-0.301209f, +0.307267f, -0.042244f, -0.000061f, +0.000052f}, + {-0.017898f, +0.097992f, -0.002832f, +0.000217f, +0.000060f}, + {-0.154977f, +0.157077f, -0.021873f, -0.000264f, +0.000040f} + }, + { + {+0.235922f, -0.385212f, +0.034692f, -0.000230f, -0.000003f}, + {+0.211902f, -0.482439f, +0.031812f, +0.000875f, -0.000009f}, + {+0.062526f, -0.022786f, +0.009165f, -0.000192f, -0.000037f}, + {+0.100642f, -0.232077f, +0.012026f, +0.000003f, -0.000044f} + }, + { + {+0.215580f, -0.416556f, +0.032649f, -0.000062f, -0.000008f}, + {+0.273278f, -0.387323f, +0.037577f, +0.000065f, -0.000055f}, + {-0.005939f, -0.125998f, +0.001105f, -0.000285f, -0.000067f}, + {+0.119018f, -0.200389f, +0.019595f, +0.000282f, -0.000042f} + }, + { + {-0.266556f, +0.321627f, -0.039270f, +0.000204f, +0.000005f}, + {-0.262381f, +0.436199f, -0.039035f, -0.000825f, +0.000011f}, + {-0.067202f, -0.031111f, -0.011093f, +0.000033f, +0.000054f}, + {-0.114634f, +0.160892f, -0.016486f, -0.000093f, +0.000057f} + }, + { + {-0.175988f, +0.460735f, -0.026828f, +0.000048f, +0.000010f}, + {-0.233172f, +0.480676f, -0.031122f, -0.000031f, +0.000060f}, + {+0.031548f, +0.122002f, +0.003267f, +0.000158f, +0.000072f}, + {-0.094567f, +0.192621f, -0.015001f, -0.000394f, +0.000041f} + }, + { + {+0.289864f, -0.252340f, +0.042717f, -0.000164f, -0.000008f}, + {+0.309890f, -0.352443f, +0.045041f, +0.000820f, -0.000012f}, + {+0.059594f, +0.080834f, +0.009319f, +0.000095f, -0.000085f}, + {+0.123492f, -0.142957f, +0.017979f, +0.000125f, -0.000076f} + }, + { + {+0.134575f, -0.490695f, +0.020657f, -0.000008f, -0.000011f}, + {+0.176248f, -0.555316f, +0.023664f, -0.000054f, -0.000070f}, + {-0.054408f, -0.093413f, -0.005141f, +0.000202f, -0.000064f}, + {+0.078026f, -0.213530f, +0.012432f, +0.000637f, -0.000030f} + }, + { + {-0.306423f, +0.183981f, -0.045149f, +0.000152f, +0.000012f}, + {-0.341487f, +0.240296f, -0.050133f, -0.000895f, +0.000016f}, + {-0.041086f, -0.112975f, -0.007981f, +0.000040f, +0.000125f}, + {-0.138721f, +0.120523f, -0.020161f, +0.000004f, +0.000099f} + }, + { + {-0.092719f, +0.511558f, -0.014604f, -0.000050f, +0.000009f}, + {-0.112835f, +0.589997f, -0.014321f, +0.000122f, +0.000086f}, + {+0.068469f, +0.059054f, +0.008838f, -0.000612f, +0.000032f}, + {-0.054382f, +0.253255f, -0.007586f, -0.000904f, +0.000005f} + }, + { + {+0.317269f, -0.115684f, +0.046850f, -0.000208f, -0.000018f}, + {+0.356933f, -0.130812f, +0.052103f, +0.001044f, -0.000027f}, + {+0.019507f, +0.139642f, +0.002950f, -0.000683f, -0.000159f}, + {+0.152449f, -0.061207f, +0.020045f, -0.000364f, -0.000115f} + }, + { + {+0.051096f, -0.523693f, +0.008474f, +0.000105f, -0.000004f}, + {+0.049349f, -0.600329f, +0.005605f, -0.000022f, -0.000106f}, + {-0.079985f, -0.011392f, -0.007657f, +0.000780f, +0.000028f}, + {+0.017397f, -0.267260f, +0.004496f, +0.000957f, +0.000035f} + }, + { + {-0.323905f, +0.049833f, -0.047865f, +0.000329f, +0.000021f}, + {-0.358893f, +0.027640f, -0.053272f, -0.001258f, +0.000053f}, + {+0.015053f, -0.158953f, -0.000193f, +0.001713f, +0.000167f}, + {-0.144359f, -0.018540f, -0.020249f, +0.000901f, +0.000114f} + }, + { + {-0.008373f, +0.533499f, -0.002225f, -0.000084f, -0.000004f}, + {+0.010355f, +0.593074f, +0.003536f, -0.000223f, +0.000122f}, + {+0.071969f, -0.070538f, +0.006817f, -0.000021f, -0.000104f}, + {+0.009075f, +0.217846f, -0.000438f, -0.000486f, -0.000083f} + }, + { + {+0.325536f, +0.023312f, +0.048108f, -0.000519f, -0.000020f}, + {+0.352731f, +0.066640f, +0.052836f, +0.001159f, -0.000094f}, + {-0.047485f, +0.116702f, -0.002224f, -0.002868f, -0.000134f}, + {+0.125804f, +0.038871f, +0.018687f, -0.001207f, -0.000088f} + }, + { + {-0.036324f, -0.531073f, -0.003989f, -0.000084f, +0.000013f}, + {-0.069318f, -0.580051f, -0.011694f, +0.000718f, -0.000126f}, + {-0.044835f, +0.120121f, -0.003388f, -0.003194f, +0.000173f}, + {-0.016464f, -0.181504f, -0.002802f, -0.001577f, +0.000124f} + } +}; + +const float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= +{ + { + {-0.075561f, -0.068517f, +0.140821f, -0.000006f, -0.000001f}, + {-0.113351f, +0.312423f, -0.154809f, +0.003274f, -0.000040f}, + {-0.002167f, -0.037131f, +0.050206f, -0.009097f, +0.000022f}, + {-0.008959f, -0.001538f, +0.017300f, -0.005827f, -0.000030f} + }, + { + {+0.088726f, -0.056723f, -0.005193f, -0.002691f, -0.000002f}, + {+0.119871f, +0.624601f, -0.192908f, +0.005870f, -0.000033f}, + {+0.004166f, -0.045506f, +0.052787f, -0.000546f, +0.000010f}, + {+0.009543f, +0.003765f, +0.008451f, +0.003327f, -0.000025f} + }, + { + {-0.102143f, +0.113338f, +0.041532f, +0.003556f, +0.000001f}, + {-0.144265f, +0.722990f, +0.063761f, -0.009098f, +0.000044f}, + {-0.005127f, +0.024047f, -0.013948f, +0.005687f, -0.000029f}, + {-0.011405f, +0.075487f, -0.028027f, -0.000790f, +0.000032f} + }, + { + {+0.102256f, +0.332031f, -0.028467f, -0.000969f, +0.000002f}, + {+0.105041f, +0.913298f, +0.007994f, +0.001561f, +0.000024f}, + {+0.007491f, +0.060974f, -0.023635f, -0.001357f, +0.000004f}, + {+0.005542f, +0.127425f, -0.011646f, +0.000496f, +0.000020f} + }, + { + {-0.044065f, +0.500826f, -0.002410f, -0.001370f, -0.000001f}, + {+0.092604f, +0.883373f, +0.024383f, +0.004737f, -0.000046f}, + {-0.004561f, +0.083819f, -0.019790f, -0.002951f, +0.000031f}, + {+0.027047f, +0.113206f, -0.016192f, -0.001506f, -0.000033f} + }, + { + {-0.101331f, +0.396216f, -0.004920f, +0.000653f, -0.000003f}, + {-0.315234f, +0.274804f, -0.039014f, -0.001908f, -0.000016f}, + {-0.020480f, +0.081227f, +0.012774f, +0.001524f, -0.000020f}, + {-0.075525f, -0.016066f, +0.005310f, +0.001230f, -0.000016f} + }, + { + {+0.205124f, -0.066361f, +0.022115f, +0.000986f, +0.000002f}, + {+0.252202f, -0.571430f, +0.010069f, -0.002911f, +0.000045f}, + {+0.049641f, -0.008053f, +0.006538f, +0.000795f, -0.000026f}, + {+0.069872f, -0.229431f, +0.016281f, +0.000270f, +0.000032f} + }, + { + {-0.075366f, -0.478001f, -0.007669f, -0.000701f, +0.000003f}, + {+0.124742f, -0.753308f, +0.025384f, +0.001863f, +0.000009f}, + {-0.028983f, -0.121665f, -0.007415f, -0.000267f, +0.000034f}, + {+0.036071f, -0.292663f, -0.003455f, -0.000819f, +0.000013f} + }, + { + {-0.186385f, -0.294120f, -0.028378f, -0.000604f, -0.000002f}, + {-0.364681f, +0.008978f, -0.038744f, +0.001757f, -0.000041f}, + {-0.036441f, -0.104767f, -0.010428f, -0.000824f, +0.000015f}, + {-0.145432f, -0.035047f, -0.010123f, +0.000064f, -0.000032f} + }, + { + {+0.200759f, +0.301898f, +0.028191f, +0.000609f, -0.000004f}, + {+0.106790f, +0.737079f, +0.007371f, -0.001552f, -0.000005f}, + {+0.050065f, +0.035831f, +0.013930f, +0.000498f, -0.000043f}, + {+0.098812f, +0.316605f, +0.005024f, +0.000388f, -0.000012f} + }, + { + {+0.102918f, +0.447646f, +0.016687f, +0.000392f, +0.000003f}, + {+0.311637f, +0.412036f, +0.037367f, -0.001208f, +0.000037f}, + {+0.029150f, +0.073712f, +0.005390f, +0.000373f, -0.000001f}, + {+0.078159f, +0.331302f, +0.015024f, +0.000096f, +0.000033f} + }, + { + {-0.263157f, -0.117240f, -0.038079f, -0.000498f, +0.000003f}, + {-0.266046f, -0.483755f, -0.030591f, +0.001325f, +0.000003f}, + {-0.079262f, -0.094840f, -0.015385f, -0.000509f, +0.000047f}, + {-0.153547f, -0.029982f, -0.019729f, -0.000450f, +0.000010f} + }, + { + {-0.007705f, -0.507985f, -0.003383f, -0.000318f, -0.000004f}, + {-0.186453f, -0.597236f, -0.023398f, +0.000963f, -0.000033f}, + {-0.013117f, -0.205170f, +0.001765f, -0.000228f, -0.000014f}, + {+0.017314f, -0.287283f, -0.002959f, -0.000038f, -0.000035f} + }, + { + {+0.280521f, -0.062761f, +0.041073f, +0.000449f, -0.000003f}, + {+0.334574f, +0.214167f, +0.043236f, -0.001215f, -0.000003f}, + {+0.133038f, +0.011844f, +0.017286f, +0.000551f, -0.000044f}, + {+0.127101f, -0.107475f, +0.022000f, +0.000440f, -0.000008f} + }, + { + {-0.080859f, +0.491833f, -0.009289f, +0.000270f, +0.000005f}, + {+0.060956f, +0.629530f, +0.006506f, -0.000817f, +0.000032f}, + {-0.073930f, +0.331264f, -0.010959f, +0.000254f, +0.000026f}, + {-0.063542f, +0.194964f, -0.009265f, +0.000065f, +0.000037f} + }, + { + {-0.266097f, +0.204693f, -0.039752f, -0.000407f, +0.000002f}, + {-0.343709f, -0.003857f, -0.048079f, +0.001153f, +0.000004f}, + {-0.120675f, +0.268205f, -0.012518f, -0.000600f, +0.000037f}, + {-0.094236f, +0.151237f, -0.013332f, -0.000477f, +0.000005f} + }, + { + {+0.151764f, -0.437914f, +0.020131f, -0.000242f, -0.000005f}, + {+0.036841f, -0.588874f, +0.009139f, +0.000664f, -0.000032f}, + {+0.174802f, -0.176925f, +0.017691f, -0.000280f, -0.000033f}, + {+0.090868f, -0.134423f, +0.011793f, -0.000076f, -0.000038f} + }, + { + {+0.237215f, -0.304481f, +0.035938f, +0.000373f, -0.000001f}, + {+0.332318f, -0.127083f, +0.047424f, -0.001052f, -0.000005f}, + {+0.006779f, -0.431468f, +0.002691f, +0.000532f, -0.000029f}, + {+0.053552f, -0.194194f, +0.007469f, +0.000494f, -0.000001f} + }, + { + {-0.208558f, +0.382505f, -0.029564f, +0.000207f, +0.000005f}, + {-0.116623f, +0.564310f, -0.021854f, -0.000528f, +0.000033f}, + {-0.172351f, -0.159278f, -0.018428f, +0.000360f, +0.000037f}, + {-0.097811f, +0.036173f, -0.011033f, +0.000077f, +0.000038f} + }, + { + {-0.202490f, +0.392017f, -0.029907f, -0.000333f, +0.000001f}, + {-0.316139f, +0.253384f, -0.044455f, +0.000945f, +0.000004f}, + {+0.097332f, +0.245644f, +0.004917f, -0.000556f, +0.000023f}, + {-0.006532f, +0.174857f, -0.002876f, -0.000550f, -0.000002f} + }, + { + {+0.261135f, -0.320885f, +0.037011f, -0.000181f, -0.000005f}, + {+0.197969f, -0.536807f, +0.033309f, +0.000398f, -0.000034f}, + {+0.081783f, +0.256891f, +0.014473f, -0.000242f, -0.000040f}, + {+0.065893f, +0.064104f, +0.007328f, +0.000082f, -0.000039f} + }, + { + {+0.153724f, -0.486020f, +0.022676f, +0.000325f, -0.000001f}, + {+0.283217f, -0.402227f, +0.039413f, -0.000851f, -0.000003f}, + {-0.100031f, -0.031468f, -0.013972f, +0.000537f, -0.000020f}, + {-0.008541f, -0.048318f, +0.000499f, +0.000444f, +0.000005f} + }, + { + {-0.302384f, +0.214214f, -0.042285f, +0.000129f, +0.000005f}, + {-0.280104f, +0.464455f, -0.045587f, -0.000282f, +0.000035f}, + {-0.027898f, -0.140901f, -0.007378f, +0.000003f, +0.000044f}, + {-0.020559f, -0.029800f, -0.003256f, -0.000145f, +0.000040f} + }, + { + {-0.091526f, +0.536382f, -0.014577f, -0.000305f, +0.000001f}, + {-0.221871f, +0.553999f, -0.029769f, +0.000764f, +0.000002f}, + {+0.073977f, +0.023109f, +0.011231f, -0.000304f, +0.000016f}, + {-0.025756f, -0.040011f, -0.004558f, -0.000368f, -0.000008f} + }, + { + {+0.321259f, -0.098962f, +0.045846f, -0.000108f, -0.000006f}, + {+0.348987f, -0.318713f, +0.051856f, +0.000239f, -0.000036f}, + {+0.017761f, +0.116280f, -0.000624f, -0.000200f, -0.000050f}, + {+0.009582f, -0.098230f, +0.005306f, +0.000144f, -0.000041f} + }, + { + {+0.032445f, -0.541906f, +0.005704f, +0.000315f, -0.000001f}, + {+0.127167f, -0.654253f, +0.018462f, -0.000765f, -0.000001f}, + {-0.073982f, -0.022018f, -0.008993f, +0.000517f, -0.000010f}, + {+0.079904f, +0.007744f, +0.010527f, +0.000350f, +0.000012f} + }, + { + {-0.327237f, +0.011995f, -0.047308f, +0.000087f, +0.000007f}, + {-0.372361f, +0.111338f, -0.055931f, -0.000147f, +0.000037f}, + {+0.006939f, -0.148510f, +0.003422f, +0.000212f, +0.000056f}, + {-0.056276f, +0.216052f, -0.007073f, -0.000104f, +0.000043f} + }, + { + {+0.021322f, +0.548401f, +0.003440f, -0.000317f, -0.000000f}, + {-0.036763f, +0.621232f, -0.007074f, +0.000670f, +0.000001f}, + {+0.060591f, -0.069431f, +0.006623f, -0.000636f, +0.000001f}, + {-0.095686f, +0.156364f, -0.008769f, -0.000353f, -0.000018f} + }, + { + {+0.328267f, +0.077867f, +0.046857f, -0.000082f, -0.000007f}, + {+0.361014f, +0.007604f, +0.057275f, +0.000179f, -0.000039f}, + {-0.031203f, +0.067398f, -0.002430f, -0.000232f, -0.000059f}, + {+0.120666f, -0.172404f, +0.015941f, +0.000046f, -0.000043f} + }, + { + {-0.077320f, -0.544064f, -0.010931f, +0.000301f, +0.000001f}, + {-0.025615f, -0.586847f, -0.004514f, -0.000654f, -0.000000f}, + {-0.019503f, +0.080767f, -0.004247f, +0.000554f, +0.000010f}, + {+0.060877f, -0.260909f, +0.007725f, +0.000342f, +0.000024f} + }, + { + {-0.318158f, -0.173881f, -0.045614f, +0.000092f, +0.000007f}, + {-0.350970f, -0.090433f, -0.053929f, -0.000134f, +0.000043f}, + {+0.011187f, +0.032303f, +0.001760f, +0.000373f, +0.000059f}, + {-0.154877f, +0.074143f, -0.023096f, -0.000037f, +0.000042f} + }, + { + {+0.131227f, +0.515417f, +0.018725f, -0.000280f, -0.000002f}, + {+0.083743f, +0.574149f, +0.012466f, +0.000576f, -0.000001f}, + {+0.005315f, +0.026215f, +0.002698f, -0.000477f, -0.000019f}, + {-0.015816f, +0.287949f, -0.001995f, -0.000235f, -0.000030f} + }, + { + {+0.296693f, +0.260934f, +0.042541f, -0.000091f, -0.000007f}, + {+0.335556f, +0.189122f, +0.052026f, +0.000094f, -0.000047f}, + {+0.020995f, +0.006183f, -0.000036f, -0.000396f, -0.000057f}, + {+0.168822f, +0.001307f, +0.024594f, -0.000017f, -0.000040f} + }, + { + {-0.178422f, -0.467768f, -0.025765f, +0.000259f, +0.000003f}, + {-0.138949f, -0.536439f, -0.020095f, -0.000522f, +0.000004f}, + {-0.028752f, -0.066596f, -0.002138f, +0.000378f, +0.000026f}, + {-0.031690f, -0.308623f, -0.005893f, +0.000213f, +0.000034f} + }, + { + {-0.267781f, -0.330036f, -0.038496f, +0.000071f, +0.000007f}, + {-0.312281f, -0.270728f, -0.048992f, -0.000017f, +0.000050f}, + {-0.024788f, -0.069674f, -0.002302f, +0.000335f, +0.000057f}, + {-0.167013f, -0.101727f, -0.022607f, -0.000026f, +0.000040f} + }, + { + {+0.218246f, +0.415608f, +0.031895f, -0.000250f, -0.000003f}, + {+0.187767f, +0.495269f, +0.027755f, +0.000490f, -0.000007f}, + {+0.054038f, +0.052249f, +0.006077f, -0.000385f, -0.000032f}, + {+0.082423f, +0.279154f, +0.011379f, -0.000228f, -0.000040f} + }, + { + {+0.234462f, +0.390517f, +0.033506f, -0.000040f, -0.000008f}, + {+0.286682f, +0.344540f, +0.044785f, -0.000053f, -0.000053f}, + {+0.007799f, +0.121924f, -0.000254f, -0.000274f, -0.000063f}, + {+0.137635f, +0.191812f, +0.020083f, +0.000078f, -0.000041f} + }, + { + {-0.252188f, -0.355561f, -0.036817f, +0.000259f, +0.000004f}, + {-0.236813f, -0.457491f, -0.035054f, -0.000497f, +0.000010f}, + {-0.067322f, +0.004912f, -0.008444f, +0.000591f, +0.000044f}, + {-0.110001f, -0.188497f, -0.016071f, +0.000306f, +0.000049f} + }, + { + {-0.196649f, -0.440315f, -0.028013f, +0.000028f, +0.000009f}, + {-0.254039f, -0.432758f, -0.039405f, +0.000094f, +0.000057f}, + {+0.018169f, -0.125990f, +0.003787f, +0.000283f, +0.000070f}, + {-0.104872f, -0.193750f, -0.016320f, -0.000067f, +0.000042f} + }, + { + {+0.279232f, +0.288906f, +0.040649f, -0.000288f, -0.000006f}, + {+0.287453f, +0.396154f, +0.041796f, +0.000496f, -0.000012f}, + {+0.065516f, -0.051533f, +0.008251f, -0.000833f, -0.000068f}, + {+0.117846f, +0.150938f, +0.019317f, -0.000398f, -0.000066f} + }, + { + {+0.155838f, +0.477142f, +0.022236f, -0.000054f, -0.000011f}, + {+0.205090f, +0.523697f, +0.032347f, -0.000074f, -0.000064f}, + {-0.043133f, +0.115358f, -0.007458f, -0.000536f, -0.000071f}, + {+0.086685f, +0.200152f, +0.011885f, -0.000042f, -0.000037f} + }, + { + {-0.298969f, -0.220193f, -0.043767f, +0.000325f, +0.000010f}, + {-0.328142f, -0.292452f, -0.047271f, -0.000442f, +0.000014f}, + {-0.051610f, +0.100445f, -0.006535f, +0.000948f, +0.000105f}, + {-0.130003f, -0.132255f, -0.020754f, +0.000362f, +0.000088f} + }, + { + {-0.114168f, -0.502804f, -0.016020f, +0.000104f, +0.000010f}, + {-0.143455f, -0.576024f, -0.024058f, +0.000023f, +0.000077f}, + {+0.061115f, -0.073546f, +0.010498f, +0.000984f, +0.000052f}, + {-0.068233f, -0.228084f, -0.008576f, +0.000257f, +0.000020f} + }, + { + {+0.312611f, +0.151372f, +0.045798f, -0.000314f, -0.000015f}, + {+0.351200f, +0.182575f, +0.051390f, +0.000326f, -0.000020f}, + {+0.031920f, -0.116916f, +0.003818f, -0.000728f, -0.000144f}, + {+0.146596f, +0.100142f, +0.022461f, -0.000165f, -0.000108f} + }, + { + {+0.072361f, +0.518728f, +0.009942f, -0.000175f, -0.000007f}, + {+0.079531f, +0.601014f, +0.014699f, -0.000081f, -0.000095f}, + {-0.074110f, +0.046958f, -0.012342f, -0.001344f, -0.000005f}, + {+0.036969f, +0.268420f, +0.004301f, -0.000333f, +0.000013f} + }, + { + {-0.321149f, -0.084827f, -0.047210f, +0.000251f, +0.000020f}, + {-0.359514f, -0.071785f, -0.052488f, -0.000127f, +0.000038f}, + {-0.004461f, +0.153778f, +0.000819f, +0.000092f, +0.000168f}, + {-0.150780f, -0.016846f, -0.022402f, -0.000246f, +0.000118f} + }, + { + {-0.030564f, -0.529872f, -0.003428f, +0.000214f, -0.000000f}, + {-0.017715f, -0.598148f, -0.005426f, +0.000313f, +0.000115f}, + {+0.077791f, +0.029195f, +0.012192f, +0.001184f, -0.000065f}, + {-0.001917f, -0.241534f, -0.000982f, +0.000017f, -0.000059f} + }, + { + {+0.325748f, +0.016029f, +0.047602f, -0.000149f, -0.000021f}, + {+0.356902f, -0.024523f, +0.052188f, +0.000031f, -0.000071f}, + {-0.031837f, -0.135684f, -0.003925f, +0.000518f, -0.000157f}, + {+0.134040f, -0.031563f, +0.022612f, +0.000523f, -0.000105f} + }, + { + {-0.013284f, +0.534819f, -0.003031f, -0.000141f, +0.000009f}, + {-0.041065f, +0.588511f, -0.002930f, -0.000807f, -0.000127f}, + {-0.057814f, -0.095156f, -0.013622f, +0.000710f, +0.000141f}, + {-0.013462f, +0.193769f, -0.004638f, +0.001465f, +0.000106f} + }, + { + {-0.323552f, +0.059375f, -0.047359f, +0.000017f, +0.000018f}, + {-0.347235f, +0.120486f, -0.050411f, -0.000521f, +0.000120f}, + {+0.056648f, +0.076781f, +0.002619f, -0.000739f, +0.000101f}, + {-0.118370f, +0.031720f, -0.024225f, -0.000048f, +0.000065f} + } +}; + +const float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= +{ + { + {+0.001139f, +0.701381f, +0.088362f, +0.001507f, +0.000002f}, + {-0.000414f, -0.262095f, +0.237214f, +0.003224f, -0.000036f}, + {+0.002081f, +0.073269f, +0.016442f, -0.002305f, -0.000016f}, + {+0.003374f, +0.067272f, -0.027345f, -0.000156f, +0.000027f} + }, + { + {-0.006858f, +0.573976f, -0.025590f, -0.002173f, -0.000001f}, + {+0.018683f, -0.673324f, -0.155049f, -0.004529f, +0.000042f}, + {-0.004167f, -0.005579f, -0.043222f, +0.004198f, +0.000026f}, + {-0.007696f, +0.026588f, -0.047141f, +0.000930f, -0.000031f} + }, + { + {+0.022690f, +0.504423f, -0.025668f, -0.000505f, -0.000002f}, + {-0.098922f, -0.785742f, -0.002391f, -0.001725f, +0.000029f}, + {+0.001996f, -0.028688f, -0.031830f, -0.002187f, +0.000003f}, + {+0.012563f, -0.012620f, -0.033386f, -0.001639f, -0.000022f} + }, + { + {-0.068470f, +0.403356f, +0.003719f, +0.002403f, +0.000001f}, + {+0.238766f, -0.395418f, -0.032160f, +0.006283f, -0.000045f}, + {-0.003715f, -0.000119f, +0.009760f, -0.000148f, -0.000031f}, + {-0.028559f, -0.040197f, +0.002155f, +0.000892f, +0.000033f} + }, + { + {+0.145134f, +0.119557f, +0.007639f, -0.000923f, +0.000003f}, + {-0.294065f, +0.334693f, +0.019103f, -0.002511f, -0.000020f}, + {+0.020226f, -0.024338f, +0.012605f, +0.001278f, +0.000012f}, + {+0.043958f, -0.145428f, +0.013697f, +0.000566f, +0.000018f} + }, + { + {-0.153301f, -0.308264f, -0.003171f, -0.001265f, -0.000001f}, + {+0.095935f, +0.863498f, +0.010369f, -0.003299f, +0.000045f}, + {-0.032438f, -0.100491f, +0.003144f, -0.001769f, +0.000029f}, + {-0.013113f, -0.237010f, +0.000894f, -0.000875f, -0.000033f} + }, + { + {-0.012428f, -0.509031f, -0.004688f, +0.000988f, -0.000003f}, + {+0.244664f, +0.595158f, +0.023888f, +0.002491f, +0.000012f}, + {+0.002609f, -0.144907f, -0.010043f, +0.000781f, -0.000027f}, + {-0.074154f, -0.145409f, -0.008757f, -0.000058f, -0.000014f} + }, + { + {+0.212788f, -0.155514f, +0.023333f, +0.000561f, +0.000002f}, + {-0.330585f, -0.291160f, -0.047010f, +0.002016f, -0.000043f}, + {+0.050155f, -0.068056f, -0.001580f, +0.001116f, -0.000021f}, + {+0.122861f, +0.153186f, +0.009329f, +0.000801f, +0.000032f} + }, + { + {-0.148866f, +0.399380f, -0.016077f, -0.000584f, +0.000004f}, + {-0.007222f, -0.769639f, +0.001057f, -0.002043f, -0.000007f}, + {-0.045137f, +0.068695f, +0.001800f, -0.000989f, +0.000039f}, + {-0.030243f, +0.388427f, -0.005358f, -0.000487f, +0.000012f} + }, + { + {-0.148858f, +0.389050f, -0.019934f, -0.000504f, -0.000003f}, + {+0.349211f, -0.214703f, +0.051501f, -0.001478f, +0.000039f}, + {-0.029971f, +0.074752f, -0.006844f, -0.000679f, +0.000009f}, + {-0.127591f, +0.245277f, -0.008622f, -0.000243f, -0.000032f} + }, + { + {+0.239012f, -0.214946f, +0.031611f, +0.000498f, -0.000004f}, + {-0.196316f, +0.613847f, -0.027133f, +0.001726f, +0.000004f}, + {+0.059322f, -0.077618f, +0.010338f, +0.000544f, -0.000046f}, + {+0.142102f, -0.158560f, +0.013819f, +0.000336f, -0.000011f} + }, + { + {+0.056721f, -0.491541f, +0.006821f, +0.000413f, +0.000004f}, + {-0.248916f, +0.524024f, -0.041690f, +0.001135f, -0.000035f}, + {+0.029432f, -0.129169f, -0.000386f, +0.000757f, +0.000007f}, + {+0.025409f, -0.327769f, +0.004549f, +0.000075f, +0.000034f} + }, + { + {-0.277481f, +0.028032f, -0.037920f, -0.000438f, +0.000003f}, + {+0.308141f, -0.332951f, +0.045686f, -0.001496f, -0.000003f}, + {-0.108659f, +0.087169f, -0.015132f, -0.000418f, +0.000046f}, + {-0.144191f, -0.063507f, -0.018317f, -0.000173f, +0.000009f} + }, + { + {+0.037467f, +0.509783f, +0.006165f, -0.000331f, -0.000005f}, + {+0.118379f, -0.623008f, +0.023288f, -0.000858f, +0.000032f}, + {+0.020828f, +0.293771f, +0.009322f, -0.000570f, -0.000020f}, + {+0.044708f, +0.223468f, +0.005411f, -0.000025f, -0.000036f} + }, + { + {+0.276681f, +0.136508f, +0.039053f, +0.000399f, -0.000002f}, + {-0.342800f, +0.086499f, -0.051427f, +0.001312f, +0.000004f}, + {+0.141529f, +0.115364f, +0.013240f, +0.000205f, -0.000040f}, + {+0.110040f, +0.119206f, +0.016186f, +0.000083f, -0.000006f} + }, + { + {-0.117783f, -0.468960f, -0.017913f, +0.000250f, +0.000005f}, + {-0.005671f, +0.604318f, -0.007143f, +0.000660f, -0.000031f}, + {-0.130049f, -0.297226f, -0.017966f, +0.000439f, +0.000030f}, + {-0.077788f, -0.170577f, -0.011766f, -0.000035f, +0.000037f} + }, + { + {-0.252966f, -0.256306f, -0.036605f, -0.000365f, +0.000002f}, + {+0.337478f, +0.074281f, +0.052432f, -0.001197f, -0.000005f}, + {-0.072906f, -0.386255f, -0.005369f, -0.000119f, +0.000033f}, + {-0.075520f, -0.174614f, -0.010607f, -0.000037f, +0.000003f} + }, + { + {+0.180447f, +0.410401f, +0.027706f, -0.000193f, -0.000005f}, + {-0.079743f, -0.570802f, -0.007521f, -0.000528f, +0.000032f}, + {+0.189755f, +0.008151f, +0.021117f, -0.000340f, -0.000036f}, + {+0.097648f, +0.090203f, +0.013931f, +0.000113f, -0.000038f} + }, + { + {+0.221150f, +0.344584f, +0.031954f, +0.000342f, -0.000001f}, + {-0.324392f, -0.195009f, -0.049761f, +0.001141f, +0.000005f}, + {-0.055564f, +0.372598f, -0.003229f, +0.000147f, -0.000026f}, + {+0.029197f, +0.196512f, +0.004268f, -0.000027f, +0.000001f} + }, + { + {-0.234543f, -0.356749f, -0.036109f, +0.000161f, +0.000005f}, + {+0.158828f, +0.551737f, +0.020300f, +0.000447f, -0.000034f}, + {-0.128996f, +0.253163f, -0.019502f, +0.000205f, +0.000038f}, + {-0.086326f, +0.024093f, -0.010653f, -0.000104f, +0.000038f} + }, + { + {-0.180736f, -0.438688f, -0.025011f, -0.000324f, +0.000001f}, + {+0.301948f, +0.334020f, +0.045105f, -0.001128f, -0.000004f}, + {+0.108851f, -0.109590f, +0.011684f, +0.000065f, +0.000022f}, + {+0.007794f, -0.114979f, -0.002557f, +0.000055f, -0.000004f} + }, + { + {+0.283619f, +0.272902f, +0.041849f, -0.000148f, -0.000005f}, + {-0.241474f, -0.503493f, -0.031717f, -0.000352f, +0.000035f}, + {+0.045390f, -0.198917f, +0.011556f, -0.000593f, -0.000041f}, + {+0.041019f, -0.061071f, +0.008824f, +0.000017f, -0.000039f} + }, + { + {+0.123506f, +0.516214f, +0.017365f, +0.000301f, -0.000001f}, + {-0.256327f, -0.482583f, -0.037542f, +0.001057f, +0.000002f}, + {-0.083839f, +0.008074f, -0.016916f, +0.000282f, -0.000018f}, + {+0.003422f, -0.003727f, +0.003177f, -0.000000f, +0.000006f} + }, + { + {-0.313797f, -0.154486f, -0.046391f, +0.000147f, +0.000005f}, + {+0.319981f, +0.404727f, +0.042569f, +0.000317f, -0.000036f}, + {-0.021107f, +0.110660f, -0.004978f, +0.000416f, +0.000047f}, + {-0.008153f, -0.022716f, -0.004670f, +0.000045f, +0.000040f} + }, + { + {-0.061089f, -0.539358f, -0.009248f, -0.000286f, +0.000001f}, + {+0.177073f, +0.627220f, +0.025260f, -0.001022f, -0.000001f}, + {+0.071424f, -0.032340f, +0.013321f, -0.000179f, +0.000014f}, + {-0.053388f, +0.046353f, -0.007111f, -0.000176f, -0.000010f} + }, + { + {+0.324287f, +0.053524f, +0.049068f, -0.000116f, -0.000006f}, + {-0.369344f, -0.211212f, -0.048775f, -0.000225f, +0.000037f}, + {+0.008002f, -0.135643f, +0.001207f, -0.000329f, -0.000053f}, + {+0.026056f, +0.169088f, +0.008645f, +0.000250f, -0.000042f} + }, + { + {+0.005776f, +0.541579f, +0.000581f, +0.000240f, -0.000000f}, + {-0.077934f, -0.656141f, -0.014760f, +0.000940f, +0.000001f}, + {-0.071537f, -0.021095f, -0.007901f, +0.000019f, -0.000006f}, + {+0.095328f, +0.067372f, +0.010448f, -0.000101f, +0.000015f} + }, + { + {-0.328162f, +0.029093f, -0.049230f, +0.000107f, +0.000007f}, + {+0.369662f, +0.037217f, +0.051825f, +0.000167f, -0.000038f}, + {+0.023527f, +0.120022f, -0.000102f, +0.000278f, +0.000058f}, + {-0.090284f, -0.212186f, -0.013169f, -0.000132f, +0.000043f} + }, + { + {+0.048978f, -0.548479f, +0.007485f, -0.000233f, -0.000001f}, + {+0.003228f, +0.602938f, +0.001617f, -0.000911f, -0.000001f}, + {+0.040104f, +0.095644f, +0.005888f, -0.000009f, -0.000005f}, + {-0.081710f, -0.220378f, -0.013048f, -0.000016f, -0.000021f} + }, + { + {+0.324250f, -0.126479f, +0.048291f, -0.000066f, -0.000007f}, + {-0.357292f, +0.046143f, -0.050921f, -0.000098f, +0.000041f}, + {-0.027149f, -0.003860f, +0.000272f, -0.000124f, -0.000060f}, + {+0.141329f, +0.121139f, +0.018219f, +0.000314f, -0.000043f} + }, + { + {-0.104734f, +0.530347f, -0.015582f, +0.000224f, +0.000002f}, + {+0.054628f, -0.590170f, +0.008056f, +0.000909f, -0.000000f}, + {-0.005584f, -0.032979f, -0.004816f, +0.000029f, +0.000015f}, + {+0.037866f, +0.274890f, +0.006759f, -0.000046f, +0.000027f} + }, + { + {-0.308177f, +0.218644f, -0.045991f, +0.000043f, +0.000007f}, + {+0.346201f, -0.142031f, +0.048180f, +0.000046f, -0.000045f}, + {-0.007019f, -0.030662f, -0.000480f, +0.000081f, +0.000058f}, + {-0.162861f, -0.035781f, -0.023778f, -0.000324f, +0.000041f} + }, + { + {+0.155747f, -0.491433f, +0.022764f, -0.000231f, -0.000003f}, + {-0.112390f, +0.563014f, -0.016093f, -0.000905f, +0.000002f}, + {+0.014636f, -0.060316f, +0.003797f, -0.000151f, -0.000023f}, + {+0.007188f, -0.297579f, +0.001361f, +0.000018f, -0.000032f} + }, + { + {+0.282333f, -0.296973f, +0.042631f, -0.000038f, -0.000007f}, + {-0.325943f, +0.233378f, -0.045604f, -0.000052f, +0.000049f}, + {+0.025539f, -0.043016f, +0.004050f, -0.000129f, -0.000057f}, + {+0.170600f, -0.047495f, +0.024487f, +0.000283f, -0.000040f} + }, + { + {-0.198966f, +0.440444f, -0.029339f, +0.000240f, +0.000003f}, + {+0.163937f, -0.519986f, +0.024102f, +0.000910f, -0.000006f}, + {-0.041643f, +0.059924f, -0.008056f, +0.000252f, +0.000028f}, + {-0.058279f, +0.303786f, -0.008000f, +0.000033f, +0.000037f} + }, + { + {-0.251233f, +0.360645f, -0.037855f, +0.000048f, +0.000007f}, + {+0.301209f, -0.307267f, +0.042244f, +0.000061f, -0.000052f}, + {-0.017898f, +0.097992f, -0.002832f, +0.000217f, +0.000060f}, + {-0.154977f, +0.157077f, -0.021873f, -0.000264f, +0.000040f} + }, + { + {+0.235922f, -0.385212f, +0.034692f, -0.000230f, -0.000003f}, + {-0.211902f, +0.482439f, -0.031812f, -0.000875f, +0.000009f}, + {+0.062526f, -0.022786f, +0.009165f, -0.000192f, -0.000037f}, + {+0.100642f, -0.232077f, +0.012026f, +0.000003f, -0.000044f} + }, + { + {+0.215580f, -0.416556f, +0.032649f, -0.000062f, -0.000008f}, + {-0.273278f, +0.387323f, -0.037577f, -0.000065f, +0.000055f}, + {-0.005939f, -0.125998f, +0.001105f, -0.000285f, -0.000067f}, + {+0.119018f, -0.200389f, +0.019595f, +0.000282f, -0.000042f} + }, + { + {-0.266556f, +0.321627f, -0.039270f, +0.000204f, +0.000005f}, + {+0.262381f, -0.436199f, +0.039035f, +0.000825f, -0.000011f}, + {-0.067202f, -0.031111f, -0.011093f, +0.000033f, +0.000054f}, + {-0.114634f, +0.160892f, -0.016486f, -0.000093f, +0.000057f} + }, + { + {-0.175988f, +0.460735f, -0.026828f, +0.000048f, +0.000010f}, + {+0.233172f, -0.480676f, +0.031122f, +0.000031f, -0.000060f}, + {+0.031548f, +0.122002f, +0.003267f, +0.000158f, +0.000072f}, + {-0.094567f, +0.192621f, -0.015001f, -0.000394f, +0.000041f} + }, + { + {+0.289864f, -0.252340f, +0.042717f, -0.000164f, -0.000008f}, + {-0.309890f, +0.352443f, -0.045041f, -0.000820f, +0.000012f}, + {+0.059594f, +0.080834f, +0.009319f, +0.000095f, -0.000085f}, + {+0.123492f, -0.142957f, +0.017979f, +0.000125f, -0.000076f} + }, + { + {+0.134575f, -0.490695f, +0.020657f, -0.000008f, -0.000011f}, + {-0.176248f, +0.555316f, -0.023664f, +0.000054f, +0.000070f}, + {-0.054408f, -0.093413f, -0.005141f, +0.000202f, -0.000064f}, + {+0.078026f, -0.213530f, +0.012432f, +0.000637f, -0.000030f} + }, + { + {-0.306423f, +0.183981f, -0.045149f, +0.000152f, +0.000012f}, + {+0.341487f, -0.240296f, +0.050133f, +0.000895f, -0.000016f}, + {-0.041086f, -0.112975f, -0.007981f, +0.000040f, +0.000125f}, + {-0.138721f, +0.120523f, -0.020161f, +0.000004f, +0.000099f} + }, + { + {-0.092719f, +0.511558f, -0.014604f, -0.000050f, +0.000009f}, + {+0.112835f, -0.589997f, +0.014321f, -0.000122f, -0.000086f}, + {+0.068469f, +0.059054f, +0.008838f, -0.000612f, +0.000032f}, + {-0.054382f, +0.253255f, -0.007586f, -0.000904f, +0.000005f} + }, + { + {+0.317269f, -0.115684f, +0.046850f, -0.000208f, -0.000018f}, + {-0.356933f, +0.130812f, -0.052103f, -0.001044f, +0.000027f}, + {+0.019507f, +0.139642f, +0.002950f, -0.000683f, -0.000159f}, + {+0.152449f, -0.061207f, +0.020045f, -0.000364f, -0.000115f} + }, + { + {+0.051096f, -0.523693f, +0.008474f, +0.000105f, -0.000004f}, + {-0.049349f, +0.600329f, -0.005605f, +0.000022f, +0.000106f}, + {-0.079985f, -0.011392f, -0.007657f, +0.000780f, +0.000028f}, + {+0.017397f, -0.267260f, +0.004496f, +0.000957f, +0.000035f} + }, + { + {-0.323905f, +0.049833f, -0.047865f, +0.000329f, +0.000021f}, + {+0.358893f, -0.027640f, +0.053272f, +0.001258f, -0.000053f}, + {+0.015053f, -0.158953f, -0.000193f, +0.001713f, +0.000167f}, + {-0.144359f, -0.018540f, -0.020249f, +0.000901f, +0.000114f} + }, + { + {-0.008373f, +0.533499f, -0.002225f, -0.000084f, -0.000004f}, + {-0.010355f, -0.593074f, -0.003536f, +0.000223f, -0.000122f}, + {+0.071969f, -0.070538f, +0.006817f, -0.000021f, -0.000104f}, + {+0.009075f, +0.217846f, -0.000438f, -0.000486f, -0.000083f} + }, + { + {+0.325536f, +0.023312f, +0.048108f, -0.000519f, -0.000020f}, + {-0.352731f, -0.066640f, -0.052836f, -0.001159f, +0.000094f}, + {-0.047485f, +0.116702f, -0.002224f, -0.002868f, -0.000134f}, + {+0.125804f, +0.038871f, +0.018687f, -0.001207f, -0.000088f} + }, + { + {-0.036324f, -0.531073f, -0.003989f, -0.000084f, +0.000013f}, + {+0.069318f, +0.580051f, +0.011694f, -0.000718f, +0.000126f}, + {-0.044835f, +0.120121f, -0.003388f, -0.003194f, +0.000173f}, + {-0.016464f, -0.181504f, -0.002802f, -0.001577f, +0.000124f} + } +}; + +const float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= +{ + { + {-0.075561f, -0.068517f, +0.140821f, -0.000006f, -0.000001f}, + {+0.113351f, -0.312423f, +0.154809f, -0.003274f, +0.000040f}, + {-0.002167f, -0.037131f, +0.050206f, -0.009097f, +0.000022f}, + {-0.008959f, -0.001538f, +0.017300f, -0.005827f, -0.000030f} + }, + { + {+0.088726f, -0.056723f, -0.005193f, -0.002691f, -0.000002f}, + {-0.119871f, -0.624601f, +0.192908f, -0.005870f, +0.000033f}, + {+0.004166f, -0.045506f, +0.052787f, -0.000546f, +0.000010f}, + {+0.009543f, +0.003765f, +0.008451f, +0.003327f, -0.000025f} + }, + { + {-0.102143f, +0.113338f, +0.041532f, +0.003556f, +0.000001f}, + {+0.144265f, -0.722990f, -0.063761f, +0.009098f, -0.000044f}, + {-0.005127f, +0.024047f, -0.013948f, +0.005687f, -0.000029f}, + {-0.011405f, +0.075487f, -0.028027f, -0.000790f, +0.000032f} + }, + { + {+0.102256f, +0.332031f, -0.028467f, -0.000969f, +0.000002f}, + {-0.105041f, -0.913298f, -0.007994f, -0.001561f, -0.000024f}, + {+0.007491f, +0.060974f, -0.023635f, -0.001357f, +0.000004f}, + {+0.005542f, +0.127425f, -0.011646f, +0.000496f, +0.000020f} + }, + { + {-0.044065f, +0.500826f, -0.002410f, -0.001370f, -0.000001f}, + {-0.092604f, -0.883373f, -0.024383f, -0.004737f, +0.000046f}, + {-0.004561f, +0.083819f, -0.019790f, -0.002951f, +0.000031f}, + {+0.027047f, +0.113206f, -0.016192f, -0.001506f, -0.000033f} + }, + { + {-0.101331f, +0.396216f, -0.004920f, +0.000653f, -0.000003f}, + {+0.315234f, -0.274804f, +0.039014f, +0.001908f, +0.000016f}, + {-0.020480f, +0.081227f, +0.012774f, +0.001524f, -0.000020f}, + {-0.075525f, -0.016066f, +0.005310f, +0.001230f, -0.000016f} + }, + { + {+0.205124f, -0.066361f, +0.022115f, +0.000986f, +0.000002f}, + {-0.252202f, +0.571430f, -0.010069f, +0.002911f, -0.000045f}, + {+0.049641f, -0.008053f, +0.006538f, +0.000795f, -0.000026f}, + {+0.069872f, -0.229431f, +0.016281f, +0.000270f, +0.000032f} + }, + { + {-0.075366f, -0.478001f, -0.007669f, -0.000701f, +0.000003f}, + {-0.124742f, +0.753308f, -0.025384f, -0.001863f, -0.000009f}, + {-0.028983f, -0.121665f, -0.007415f, -0.000267f, +0.000034f}, + {+0.036071f, -0.292663f, -0.003455f, -0.000819f, +0.000013f} + }, + { + {-0.186385f, -0.294120f, -0.028378f, -0.000604f, -0.000002f}, + {+0.364681f, -0.008978f, +0.038744f, -0.001757f, +0.000041f}, + {-0.036441f, -0.104767f, -0.010428f, -0.000824f, +0.000015f}, + {-0.145432f, -0.035047f, -0.010123f, +0.000064f, -0.000032f} + }, + { + {+0.200759f, +0.301898f, +0.028191f, +0.000609f, -0.000004f}, + {-0.106790f, -0.737079f, -0.007371f, +0.001552f, +0.000005f}, + {+0.050065f, +0.035831f, +0.013930f, +0.000498f, -0.000043f}, + {+0.098812f, +0.316605f, +0.005024f, +0.000388f, -0.000012f} + }, + { + {+0.102918f, +0.447646f, +0.016687f, +0.000392f, +0.000003f}, + {-0.311637f, -0.412036f, -0.037367f, +0.001208f, -0.000037f}, + {+0.029150f, +0.073712f, +0.005390f, +0.000373f, -0.000001f}, + {+0.078159f, +0.331302f, +0.015024f, +0.000096f, +0.000033f} + }, + { + {-0.263157f, -0.117240f, -0.038079f, -0.000498f, +0.000003f}, + {+0.266046f, +0.483755f, +0.030591f, -0.001325f, -0.000003f}, + {-0.079262f, -0.094840f, -0.015385f, -0.000509f, +0.000047f}, + {-0.153547f, -0.029982f, -0.019729f, -0.000450f, +0.000010f} + }, + { + {-0.007705f, -0.507985f, -0.003383f, -0.000318f, -0.000004f}, + {+0.186453f, +0.597236f, +0.023398f, -0.000963f, +0.000033f}, + {-0.013117f, -0.205170f, +0.001765f, -0.000228f, -0.000014f}, + {+0.017314f, -0.287283f, -0.002959f, -0.000038f, -0.000035f} + }, + { + {+0.280521f, -0.062761f, +0.041073f, +0.000449f, -0.000003f}, + {-0.334574f, -0.214167f, -0.043236f, +0.001215f, +0.000003f}, + {+0.133038f, +0.011844f, +0.017286f, +0.000551f, -0.000044f}, + {+0.127101f, -0.107475f, +0.022000f, +0.000440f, -0.000008f} + }, + { + {-0.080859f, +0.491833f, -0.009289f, +0.000270f, +0.000005f}, + {-0.060956f, -0.629530f, -0.006506f, +0.000817f, -0.000032f}, + {-0.073930f, +0.331264f, -0.010959f, +0.000254f, +0.000026f}, + {-0.063542f, +0.194964f, -0.009265f, +0.000065f, +0.000037f} + }, + { + {-0.266097f, +0.204693f, -0.039752f, -0.000407f, +0.000002f}, + {+0.343709f, +0.003857f, +0.048079f, -0.001153f, -0.000004f}, + {-0.120675f, +0.268205f, -0.012518f, -0.000600f, +0.000037f}, + {-0.094236f, +0.151237f, -0.013332f, -0.000477f, +0.000005f} + }, + { + {+0.151764f, -0.437914f, +0.020131f, -0.000242f, -0.000005f}, + {-0.036841f, +0.588874f, -0.009139f, -0.000664f, +0.000032f}, + {+0.174802f, -0.176925f, +0.017691f, -0.000280f, -0.000033f}, + {+0.090868f, -0.134423f, +0.011793f, -0.000076f, -0.000038f} + }, + { + {+0.237215f, -0.304481f, +0.035938f, +0.000373f, -0.000001f}, + {-0.332318f, +0.127083f, -0.047424f, +0.001052f, +0.000005f}, + {+0.006779f, -0.431468f, +0.002691f, +0.000532f, -0.000029f}, + {+0.053552f, -0.194194f, +0.007469f, +0.000494f, -0.000001f} + }, + { + {-0.208558f, +0.382505f, -0.029564f, +0.000207f, +0.000005f}, + {+0.116623f, -0.564310f, +0.021854f, +0.000528f, -0.000033f}, + {-0.172351f, -0.159278f, -0.018428f, +0.000360f, +0.000037f}, + {-0.097811f, +0.036173f, -0.011033f, +0.000077f, +0.000038f} + }, + { + {-0.202490f, +0.392017f, -0.029907f, -0.000333f, +0.000001f}, + {+0.316139f, -0.253384f, +0.044455f, -0.000945f, -0.000004f}, + {+0.097332f, +0.245644f, +0.004917f, -0.000556f, +0.000023f}, + {-0.006532f, +0.174857f, -0.002876f, -0.000550f, -0.000002f} + }, + { + {+0.261135f, -0.320885f, +0.037011f, -0.000181f, -0.000005f}, + {-0.197969f, +0.536807f, -0.033309f, -0.000398f, +0.000034f}, + {+0.081783f, +0.256891f, +0.014473f, -0.000242f, -0.000040f}, + {+0.065893f, +0.064104f, +0.007328f, +0.000082f, -0.000039f} + }, + { + {+0.153724f, -0.486020f, +0.022676f, +0.000325f, -0.000001f}, + {-0.283217f, +0.402227f, -0.039413f, +0.000851f, +0.000003f}, + {-0.100031f, -0.031468f, -0.013972f, +0.000537f, -0.000020f}, + {-0.008541f, -0.048318f, +0.000499f, +0.000444f, +0.000005f} + }, + { + {-0.302384f, +0.214214f, -0.042285f, +0.000129f, +0.000005f}, + {+0.280104f, -0.464455f, +0.045587f, +0.000282f, -0.000035f}, + {-0.027898f, -0.140901f, -0.007378f, +0.000003f, +0.000044f}, + {-0.020559f, -0.029800f, -0.003256f, -0.000145f, +0.000040f} + }, + { + {-0.091526f, +0.536382f, -0.014577f, -0.000305f, +0.000001f}, + {+0.221871f, -0.553999f, +0.029769f, -0.000764f, -0.000002f}, + {+0.073977f, +0.023109f, +0.011231f, -0.000304f, +0.000016f}, + {-0.025756f, -0.040011f, -0.004558f, -0.000368f, -0.000008f} + }, + { + {+0.321259f, -0.098962f, +0.045846f, -0.000108f, -0.000006f}, + {-0.348987f, +0.318713f, -0.051856f, -0.000239f, +0.000036f}, + {+0.017761f, +0.116280f, -0.000624f, -0.000200f, -0.000050f}, + {+0.009582f, -0.098230f, +0.005306f, +0.000144f, -0.000041f} + }, + { + {+0.032445f, -0.541906f, +0.005704f, +0.000315f, -0.000001f}, + {-0.127167f, +0.654253f, -0.018462f, +0.000765f, +0.000001f}, + {-0.073982f, -0.022018f, -0.008993f, +0.000517f, -0.000010f}, + {+0.079904f, +0.007744f, +0.010527f, +0.000350f, +0.000012f} + }, + { + {-0.327237f, +0.011995f, -0.047308f, +0.000087f, +0.000007f}, + {+0.372361f, -0.111338f, +0.055931f, +0.000147f, -0.000037f}, + {+0.006939f, -0.148510f, +0.003422f, +0.000212f, +0.000056f}, + {-0.056276f, +0.216052f, -0.007073f, -0.000104f, +0.000043f} + }, + { + {+0.021322f, +0.548401f, +0.003440f, -0.000317f, -0.000000f}, + {+0.036763f, -0.621232f, +0.007074f, -0.000670f, -0.000001f}, + {+0.060591f, -0.069431f, +0.006623f, -0.000636f, +0.000001f}, + {-0.095686f, +0.156364f, -0.008769f, -0.000353f, -0.000018f} + }, + { + {+0.328267f, +0.077867f, +0.046857f, -0.000082f, -0.000007f}, + {-0.361014f, -0.007604f, -0.057275f, -0.000179f, +0.000039f}, + {-0.031203f, +0.067398f, -0.002430f, -0.000232f, -0.000059f}, + {+0.120666f, -0.172404f, +0.015941f, +0.000046f, -0.000043f} + }, + { + {-0.077320f, -0.544064f, -0.010931f, +0.000301f, +0.000001f}, + {+0.025615f, +0.586847f, +0.004514f, +0.000654f, +0.000000f}, + {-0.019503f, +0.080767f, -0.004247f, +0.000554f, +0.000010f}, + {+0.060877f, -0.260909f, +0.007725f, +0.000342f, +0.000024f} + }, + { + {-0.318158f, -0.173881f, -0.045614f, +0.000092f, +0.000007f}, + {+0.350970f, +0.090433f, +0.053929f, +0.000134f, -0.000043f}, + {+0.011187f, +0.032303f, +0.001760f, +0.000373f, +0.000059f}, + {-0.154877f, +0.074143f, -0.023096f, -0.000037f, +0.000042f} + }, + { + {+0.131227f, +0.515417f, +0.018725f, -0.000280f, -0.000002f}, + {-0.083743f, -0.574149f, -0.012466f, -0.000576f, +0.000001f}, + {+0.005315f, +0.026215f, +0.002698f, -0.000477f, -0.000019f}, + {-0.015816f, +0.287949f, -0.001995f, -0.000235f, -0.000030f} + }, + { + {+0.296693f, +0.260934f, +0.042541f, -0.000091f, -0.000007f}, + {-0.335556f, -0.189122f, -0.052026f, -0.000094f, +0.000047f}, + {+0.020995f, +0.006183f, -0.000036f, -0.000396f, -0.000057f}, + {+0.168822f, +0.001307f, +0.024594f, -0.000017f, -0.000040f} + }, + { + {-0.178422f, -0.467768f, -0.025765f, +0.000259f, +0.000003f}, + {+0.138949f, +0.536439f, +0.020095f, +0.000522f, -0.000004f}, + {-0.028752f, -0.066596f, -0.002138f, +0.000378f, +0.000026f}, + {-0.031690f, -0.308623f, -0.005893f, +0.000213f, +0.000034f} + }, + { + {-0.267781f, -0.330036f, -0.038496f, +0.000071f, +0.000007f}, + {+0.312281f, +0.270728f, +0.048992f, +0.000017f, -0.000050f}, + {-0.024788f, -0.069674f, -0.002302f, +0.000335f, +0.000057f}, + {-0.167013f, -0.101727f, -0.022607f, -0.000026f, +0.000040f} + }, + { + {+0.218246f, +0.415608f, +0.031895f, -0.000250f, -0.000003f}, + {-0.187767f, -0.495269f, -0.027755f, -0.000490f, +0.000007f}, + {+0.054038f, +0.052249f, +0.006077f, -0.000385f, -0.000032f}, + {+0.082423f, +0.279154f, +0.011379f, -0.000228f, -0.000040f} + }, + { + {+0.234462f, +0.390517f, +0.033506f, -0.000040f, -0.000008f}, + {-0.286682f, -0.344540f, -0.044785f, +0.000053f, +0.000053f}, + {+0.007799f, +0.121924f, -0.000254f, -0.000274f, -0.000063f}, + {+0.137635f, +0.191812f, +0.020083f, +0.000078f, -0.000041f} + }, + { + {-0.252188f, -0.355561f, -0.036817f, +0.000259f, +0.000004f}, + {+0.236813f, +0.457491f, +0.035054f, +0.000497f, -0.000010f}, + {-0.067322f, +0.004912f, -0.008444f, +0.000591f, +0.000044f}, + {-0.110001f, -0.188497f, -0.016071f, +0.000306f, +0.000049f} + }, + { + {-0.196649f, -0.440315f, -0.028013f, +0.000028f, +0.000009f}, + {+0.254039f, +0.432758f, +0.039405f, -0.000094f, -0.000057f}, + {+0.018169f, -0.125990f, +0.003787f, +0.000283f, +0.000070f}, + {-0.104872f, -0.193750f, -0.016320f, -0.000067f, +0.000042f} + }, + { + {+0.279232f, +0.288906f, +0.040649f, -0.000288f, -0.000006f}, + {-0.287453f, -0.396154f, -0.041796f, -0.000496f, +0.000012f}, + {+0.065516f, -0.051533f, +0.008251f, -0.000833f, -0.000068f}, + {+0.117846f, +0.150938f, +0.019317f, -0.000398f, -0.000066f} + }, + { + {+0.155838f, +0.477142f, +0.022236f, -0.000054f, -0.000011f}, + {-0.205090f, -0.523697f, -0.032347f, +0.000074f, +0.000064f}, + {-0.043133f, +0.115358f, -0.007458f, -0.000536f, -0.000071f}, + {+0.086685f, +0.200152f, +0.011885f, -0.000042f, -0.000037f} + }, + { + {-0.298969f, -0.220193f, -0.043767f, +0.000325f, +0.000010f}, + {+0.328142f, +0.292452f, +0.047271f, +0.000442f, -0.000014f}, + {-0.051610f, +0.100445f, -0.006535f, +0.000948f, +0.000105f}, + {-0.130003f, -0.132255f, -0.020754f, +0.000362f, +0.000088f} + }, + { + {-0.114168f, -0.502804f, -0.016020f, +0.000104f, +0.000010f}, + {+0.143455f, +0.576024f, +0.024058f, -0.000023f, -0.000077f}, + {+0.061115f, -0.073546f, +0.010498f, +0.000984f, +0.000052f}, + {-0.068233f, -0.228084f, -0.008576f, +0.000257f, +0.000020f} + }, + { + {+0.312611f, +0.151372f, +0.045798f, -0.000314f, -0.000015f}, + {-0.351200f, -0.182575f, -0.051390f, -0.000326f, +0.000020f}, + {+0.031920f, -0.116916f, +0.003818f, -0.000728f, -0.000144f}, + {+0.146596f, +0.100142f, +0.022461f, -0.000165f, -0.000108f} + }, + { + {+0.072361f, +0.518728f, +0.009942f, -0.000175f, -0.000007f}, + {-0.079531f, -0.601014f, -0.014699f, +0.000081f, +0.000095f}, + {-0.074110f, +0.046958f, -0.012342f, -0.001344f, -0.000005f}, + {+0.036969f, +0.268420f, +0.004301f, -0.000333f, +0.000013f} + }, + { + {-0.321149f, -0.084827f, -0.047210f, +0.000251f, +0.000020f}, + {+0.359514f, +0.071785f, +0.052488f, +0.000127f, -0.000038f}, + {-0.004461f, +0.153778f, +0.000819f, +0.000092f, +0.000168f}, + {-0.150780f, -0.016846f, -0.022402f, -0.000246f, +0.000118f} + }, + { + {-0.030564f, -0.529872f, -0.003428f, +0.000214f, -0.000000f}, + {+0.017715f, +0.598148f, +0.005426f, -0.000313f, -0.000115f}, + {+0.077791f, +0.029195f, +0.012192f, +0.001184f, -0.000065f}, + {-0.001917f, -0.241534f, -0.000982f, +0.000017f, -0.000059f} + }, + { + {+0.325748f, +0.016029f, +0.047602f, -0.000149f, -0.000021f}, + {-0.356902f, +0.024523f, -0.052188f, -0.000031f, +0.000071f}, + {-0.031837f, -0.135684f, -0.003925f, +0.000518f, -0.000157f}, + {+0.134040f, -0.031563f, +0.022612f, +0.000523f, -0.000105f} + }, + { + {-0.013284f, +0.534819f, -0.003031f, -0.000141f, +0.000009f}, + {+0.041065f, -0.588511f, +0.002930f, +0.000807f, +0.000127f}, + {-0.057814f, -0.095156f, -0.013622f, +0.000710f, +0.000141f}, + {-0.013462f, +0.193769f, -0.004638f, +0.001465f, +0.000106f} + }, + { + {-0.323552f, +0.059375f, -0.047359f, +0.000017f, +0.000018f}, + {+0.347235f, -0.120486f, +0.050411f, +0.000521f, -0.000120f}, + {+0.056648f, +0.076781f, +0.002619f, -0.000739f, +0.000101f}, + {-0.118370f, +0.031720f, -0.024225f, -0.000048f, +0.000065f} + } +}; + +#endif + const float FASTCONV_HRIR_latency_s = 0.000666667f; const float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= { diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 939f6ef78f..26aae29319 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -48,6 +48,16 @@ extern float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT extern float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; extern float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; extern float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; +#ifdef UPDATE_SBA_FILTER +extern float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; +extern float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; +extern float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; +extern float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; +extern float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +extern float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +extern float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +extern float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +#endif extern float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; extern float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; @@ -55,6 +65,10 @@ extern float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS] extern float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; extern float FASTCONV_HOA3_latency_s; +#ifdef UPDATE_SBA_FILTER +extern float FASTCONV_HOA2_latency_s; +extern float FASTCONV_FOA_latency_s; +#endif extern float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; extern float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 56a9a9ef53..16289a832e 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -42,15 +42,25 @@ +#ifndef UPDATE_SBA_FILTER #include +#endif #include +#ifndef UPDATE_SBA_FILTER #include "cnst.h" +#endif #include "ivas_cnst.h" +/* clang-format off */ + #define WMC_TOOL_SKIP +#ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 + + /********************** CRendBin_Combined_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION + +#ifdef UPDATE_SBA_FILTER const float CRendBin_Combined_HRIR_latency_s = 0.000020834f; #else const float CRendBin_Combined_HRIR_latency_s = 0.000020833333110f; @@ -643,10 +653,14 @@ const float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ + +#ifndef UPDATE_SBA_FILTER + /********************** CRendBin_HOA3_HRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER const float CRendBin_HOA3_HRIR_latency_s = 0.001333334f; #else const float CRendBin_HOA3_HRIR_latency_s = 0.001333333319053f; @@ -1595,10 +1609,1237 @@ const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]={ }; const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* UPDATE_SBA_FILTER */ + +#ifdef UPDATE_SBA_FILTER + + +/********************** CRendBin_FOA_HRIR **********************/ + +#ifdef UPDATE_SBA_FILTER +const float CRendBin_FOA_HRIR_latency_s = 0.000020834f; +#else +const float CRendBin_FOA_HRIR_latency_s = 0.000020833333110f; +#endif + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]={ + { + {0.966218f, 0.733332f, 0.371154f, 0.013886f, -0.255271f, -0.429740f, -0.543550f, -0.621345f, -0.659916f, -0.644001f, -0.568080f, -0.442479f, -0.285885f, -0.117060f, 0.048289f, 0.198155f, 0.325513f, 0.429363f, 0.513050f, 0.580002f, 0.630568f, 0.663334f, 0.679201f, 0.682684f, 0.678369f, 0.667227f, 0.647704f, 0.619700f, 0.585896f, 0.549425f, 0.511893f, 0.474018f, 0.436790f, 0.401079f, 0.366792f, 0.333238f, 0.300207f, 0.268253f, 0.237980f, 0.209327f, 0.181631f, 0.154220f, 0.126862f, 0.099653f, 0.072728f, 0.046213f, 0.020311f, -0.004833f, -0.029303f, -0.053269f, -0.076722f, -0.099506f, -0.121536f, -0.142793f, -0.163190f, -0.182595f, -0.200971f, -0.218400f, -0.234976f, -0.250747f, -0.265719f, -0.279920f, -0.293435f, -0.306316f, -0.318471f, -0.329791f, -0.340363f, -0.350414f, -0.360064f, -0.369343f, -0.378409f, -0.387487f, -0.396622f, -0.405768f, -0.415062f, -0.424742f, -0.434871f, -0.445428f, -0.456546f, -0.468369f, -0.480767f, -0.493503f, -0.506517f, -0.519763f, -0.532917f, -0.545542f, -0.557444f, -0.568682f, -0.579373f, -0.589605f, -0.599351f, -0.608366f, -0.616332f, -0.623173f, -0.629056f, -0.634137f, + -0.638497f, -0.642283f, -0.645662f, -0.648684f, -0.651369f, -0.653856f, -0.656358f, -0.659052f, -0.662067f, -0.665441f, -0.669082f, -0.672962f, -0.677320f, -0.682427f, -0.688193f, -0.694213f, -0.700145f, -0.705838f, -0.711215f, -0.716271f, -0.721089f, -0.725695f, -0.730008f, -0.734025f, -0.737880f, -0.741661f, -0.745353f, -0.748949f, -0.752427f, -0.755642f, -0.758483f, -0.761036f, -0.763409f, -0.765535f, -0.767317f, -0.768797f, -0.770037f, -0.771055f, -0.771976f, -0.773014f, -0.774208f, -0.775426f, -0.776630f, -0.777879f, -0.779146f, -0.780393f, -0.781721f, -0.783183f, -0.784625f, -0.785917f, -0.787109f, -0.788195f, -0.789049f, -0.789723f, -0.790445f, -0.791250f, -0.791985f, -0.792673f, -0.793450f, -0.794206f, -0.794720f, -0.795007f, -0.795162f, -0.795109f, -0.794841f, -0.794586f, -0.794452f, -0.794311f, -0.794201f, -0.794328f, -0.794586f, -0.794650f, -0.794553f, -0.794548f, -0.794548f, -0.794345f, -0.794130f, -0.794134f, -0.794153f, -0.793993f, -0.793868f, -0.793862f, -0.793701f, -0.793441f, -0.793538f, -0.793995f, -0.794422f, -0.794952f, -0.795989f, -0.797227f, -0.798155f, -0.799084f, -0.800408f, -0.801603f, -0.802279f, -0.803069f, + -0.804253f, -0.805010f, -0.805191f, -0.805803f, -0.806764f, -0.806769f, -0.806120f, -0.806405f, -0.806891f, -0.805335f, -0.802611f, -0.801532f, -0.801187f, -0.798575f, -0.795591f, -0.796825f, -0.800459f, -0.800016f, -0.795129f, -0.790229f, -0.782215f, -0.762867f, -0.737407f, -0.726767f, -0.742649f, -0.769892f, -0.782797f, -0.773088f, -0.754154f, -0.741924f, -0.738734f, -0.735957f, -0.729899f, -0.733260f, -0.765228f, -0.825366f, -0.883849f, -0.908419f, -0.898347f, -0.880383f, -0.873387f, -0.871922f, -0.866468f, -0.862326f, -0.868453f, -0.880014f, -0.885448f, -0.884194f}, + {0.966218f, 0.733332f, 0.371154f, 0.013886f, -0.255271f, -0.429740f, -0.543550f, -0.621345f, -0.659916f, -0.644001f, -0.568080f, -0.442479f, -0.285885f, -0.117060f, 0.048289f, 0.198155f, 0.325513f, 0.429363f, 0.513050f, 0.580002f, 0.630568f, 0.663334f, 0.679201f, 0.682684f, 0.678369f, 0.667227f, 0.647704f, 0.619700f, 0.585896f, 0.549425f, 0.511893f, 0.474018f, 0.436790f, 0.401079f, 0.366792f, 0.333238f, 0.300207f, 0.268253f, 0.237980f, 0.209327f, 0.181631f, 0.154220f, 0.126862f, 0.099653f, 0.072728f, 0.046213f, 0.020311f, -0.004833f, -0.029303f, -0.053269f, -0.076722f, -0.099506f, -0.121536f, -0.142793f, -0.163190f, -0.182595f, -0.200971f, -0.218400f, -0.234976f, -0.250747f, -0.265719f, -0.279920f, -0.293435f, -0.306316f, -0.318471f, -0.329791f, -0.340363f, -0.350414f, -0.360064f, -0.369343f, -0.378409f, -0.387487f, -0.396622f, -0.405768f, -0.415062f, -0.424742f, -0.434871f, -0.445428f, -0.456546f, -0.468369f, -0.480767f, -0.493503f, -0.506517f, -0.519763f, -0.532917f, -0.545542f, -0.557444f, -0.568682f, -0.579373f, -0.589605f, -0.599351f, -0.608366f, -0.616332f, -0.623173f, -0.629056f, -0.634137f, + -0.638497f, -0.642283f, -0.645662f, -0.648684f, -0.651369f, -0.653856f, -0.656358f, -0.659052f, -0.662067f, -0.665441f, -0.669082f, -0.672962f, -0.677320f, -0.682427f, -0.688193f, -0.694213f, -0.700145f, -0.705838f, -0.711215f, -0.716271f, -0.721089f, -0.725695f, -0.730008f, -0.734025f, -0.737880f, -0.741661f, -0.745353f, -0.748949f, -0.752427f, -0.755642f, -0.758483f, -0.761036f, -0.763409f, -0.765535f, -0.767317f, -0.768797f, -0.770037f, -0.771055f, -0.771976f, -0.773014f, -0.774208f, -0.775426f, -0.776630f, -0.777879f, -0.779146f, -0.780393f, -0.781721f, -0.783183f, -0.784625f, -0.785917f, -0.787109f, -0.788195f, -0.789049f, -0.789723f, -0.790445f, -0.791250f, -0.791985f, -0.792673f, -0.793450f, -0.794206f, -0.794720f, -0.795007f, -0.795162f, -0.795109f, -0.794841f, -0.794586f, -0.794452f, -0.794311f, -0.794201f, -0.794328f, -0.794586f, -0.794650f, -0.794553f, -0.794548f, -0.794548f, -0.794345f, -0.794130f, -0.794134f, -0.794153f, -0.793993f, -0.793868f, -0.793862f, -0.793701f, -0.793441f, -0.793538f, -0.793995f, -0.794422f, -0.794952f, -0.795989f, -0.797227f, -0.798155f, -0.799084f, -0.800408f, -0.801603f, -0.802279f, -0.803069f, + -0.804253f, -0.805010f, -0.805191f, -0.805803f, -0.806764f, -0.806769f, -0.806120f, -0.806405f, -0.806891f, -0.805335f, -0.802611f, -0.801532f, -0.801187f, -0.798575f, -0.795591f, -0.796825f, -0.800459f, -0.800016f, -0.795129f, -0.790229f, -0.782215f, -0.762867f, -0.737407f, -0.726767f, -0.742649f, -0.769892f, -0.782797f, -0.773088f, -0.754154f, -0.741924f, -0.738734f, -0.735957f, -0.729899f, -0.733260f, -0.765228f, -0.825366f, -0.883849f, -0.908419f, -0.898347f, -0.880383f, -0.873387f, -0.871922f, -0.866468f, -0.862326f, -0.868453f, -0.880014f, -0.885448f, -0.884194f} + }, + { + {0.069530f, 0.352738f, 0.714280f, 0.885288f, 0.713446f, 0.249298f, -0.318649f, -0.806052f, -1.124658f, -1.273893f, -1.286408f, -1.194906f, -1.028517f, -0.813598f, -0.570832f, -0.316123f, -0.064436f, 0.170206f, 0.377639f, 0.553010f, 0.696908f, 0.814493f, 0.911484f, 0.989435f, 1.046484f, 1.082848f, 1.103173f, 1.113184f, 1.116310f, 1.113920f, 1.106470f, 1.093611f, 1.074757f, 1.050402f, 1.022191f, 0.991595f, 0.959051f, 0.924074f, 0.885689f, 0.843261f, 0.797446f, 0.750023f, 0.702554f, 0.655685f, 0.609659f, 0.564706f, 0.520834f, 0.477976f, 0.436490f, 0.396954f, 0.359480f, 0.323618f, 0.288809f, 0.254673f, 0.221164f, 0.188708f, 0.157916f, 0.129070f, 0.102244f, 0.077759f, 0.055883f, 0.036223f, 0.018124f, 0.001473f, -0.013588f, -0.027502f, -0.041003f, -0.054210f, -0.066807f, -0.078910f, -0.090976f, -0.103076f, -0.114988f, -0.126900f, -0.139348f, -0.152546f, -0.166308f, -0.180589f, -0.195635f, -0.211564f, -0.228146f, -0.245089f, -0.262373f, -0.280192f, -0.298603f, -0.317350f, -0.336088f, -0.354672f, -0.373219f, -0.392122f, -0.412082f, -0.433737f, -0.456989f, -0.480976f, -0.504974f, -0.528975f, + -0.553152f, -0.577124f, -0.600047f, -0.621125f, -0.639881f, -0.656290f, -0.670723f, -0.683391f, -0.693803f, -0.701164f, -0.705315f, -0.706891f, -0.706661f, -0.705140f, -0.702740f, -0.699905f, -0.697104f, -0.694822f, -0.693380f, -0.692694f, -0.692541f, -0.693119f, -0.694952f, -0.698257f, -0.702754f, -0.707981f, -0.713393f, -0.718373f, -0.722645f, -0.726500f, -0.730288f, -0.733956f, -0.737383f, -0.740707f, -0.744006f, -0.747044f, -0.749626f, -0.751802f, -0.753644f, -0.755218f, -0.756809f, -0.758751f, -0.761058f, -0.763556f, -0.766202f, -0.768999f, -0.771906f, -0.775076f, -0.778852f, -0.783366f, -0.788481f, -0.794119f, -0.800196f, -0.806401f, -0.812542f, -0.818875f, -0.825636f, -0.832649f, -0.839808f, -0.847342f, -0.855190f, -0.862784f, -0.869788f, -0.876325f, -0.882332f, -0.887508f, -0.891946f, -0.895972f, -0.899482f, -0.902212f, -0.904315f, -0.905931f, -0.906830f, -0.907099f, -0.907371f, -0.907866f, -0.908254f, -0.908692f, -0.909708f, -0.910961f, -0.911524f, -0.911241f, -0.910472f, -0.909066f, -0.906977f, -0.904953f, -0.903361f, -0.901613f, -0.899703f, -0.898494f, -0.897842f, -0.896702f, -0.895299f, -0.894642f, -0.894316f, -0.893517f, + -0.893003f, -0.893248f, -0.893094f, -0.892684f, -0.893769f, -0.895229f, -0.894416f, -0.893811f, -0.897241f, -0.900009f, -0.896265f, -0.894143f, -0.903468f, -0.910502f, -0.893479f, -0.864358f, -0.859282f, -0.881749f, -0.897594f, -0.897013f, -0.910837f, -0.943680f, -0.945397f, -0.885614f, -0.810842f, -0.785450f, -0.810782f, -0.840026f, -0.841958f, -0.818240f, -0.787351f, -0.773027f, -0.771807f, -0.719767f, -0.550609f, -0.313730f, -0.167709f, -0.207926f, -0.353731f, -0.457636f, -0.477010f, -0.476826f, -0.500626f, -0.512220f, -0.460719f, -0.349140f, -0.228045f, -0.152067f}, + {-0.069530f, -0.352738f, -0.714280f, -0.885288f, -0.713446f, -0.249298f, 0.318649f, 0.806052f, 1.124658f, 1.273893f, 1.286408f, 1.194906f, 1.028517f, 0.813598f, 0.570832f, 0.316123f, 0.064436f, -0.170206f, -0.377639f, -0.553010f, -0.696908f, -0.814493f, -0.911484f, -0.989435f, -1.046484f, -1.082848f, -1.103173f, -1.113184f, -1.116310f, -1.113920f, -1.106470f, -1.093611f, -1.074757f, -1.050402f, -1.022191f, -0.991595f, -0.959051f, -0.924074f, -0.885689f, -0.843261f, -0.797446f, -0.750023f, -0.702554f, -0.655685f, -0.609659f, -0.564706f, -0.520834f, -0.477976f, -0.436490f, -0.396954f, -0.359480f, -0.323618f, -0.288809f, -0.254673f, -0.221164f, -0.188708f, -0.157916f, -0.129070f, -0.102244f, -0.077759f, -0.055883f, -0.036223f, -0.018124f, -0.001473f, 0.013588f, 0.027502f, 0.041003f, 0.054210f, 0.066807f, 0.078910f, 0.090976f, 0.103076f, 0.114988f, 0.126900f, 0.139348f, 0.152546f, 0.166308f, 0.180589f, 0.195635f, 0.211564f, 0.228146f, 0.245089f, 0.262373f, 0.280192f, 0.298603f, 0.317350f, 0.336088f, 0.354672f, 0.373219f, 0.392122f, 0.412082f, 0.433737f, 0.456989f, 0.480976f, 0.504974f, 0.528975f, + 0.553152f, 0.577124f, 0.600047f, 0.621125f, 0.639881f, 0.656290f, 0.670723f, 0.683391f, 0.693803f, 0.701164f, 0.705315f, 0.706891f, 0.706661f, 0.705140f, 0.702740f, 0.699905f, 0.697104f, 0.694822f, 0.693380f, 0.692694f, 0.692541f, 0.693119f, 0.694952f, 0.698257f, 0.702754f, 0.707981f, 0.713393f, 0.718373f, 0.722645f, 0.726500f, 0.730288f, 0.733956f, 0.737383f, 0.740707f, 0.744006f, 0.747044f, 0.749626f, 0.751802f, 0.753644f, 0.755218f, 0.756809f, 0.758751f, 0.761058f, 0.763556f, 0.766202f, 0.768999f, 0.771906f, 0.775076f, 0.778852f, 0.783366f, 0.788481f, 0.794119f, 0.800196f, 0.806401f, 0.812542f, 0.818875f, 0.825636f, 0.832649f, 0.839808f, 0.847342f, 0.855190f, 0.862784f, 0.869788f, 0.876325f, 0.882332f, 0.887508f, 0.891946f, 0.895972f, 0.899482f, 0.902212f, 0.904315f, 0.905931f, 0.906830f, 0.907099f, 0.907371f, 0.907866f, 0.908254f, 0.908692f, 0.909708f, 0.910961f, 0.911524f, 0.911241f, 0.910472f, 0.909066f, 0.906977f, 0.904953f, 0.903361f, 0.901613f, 0.899703f, 0.898494f, 0.897842f, 0.896702f, 0.895299f, 0.894642f, 0.894316f, 0.893517f, + 0.893003f, 0.893248f, 0.893094f, 0.892684f, 0.893769f, 0.895229f, 0.894416f, 0.893811f, 0.897241f, 0.900009f, 0.896265f, 0.894143f, 0.903468f, 0.910502f, 0.893479f, 0.864358f, 0.859282f, 0.881749f, 0.897594f, 0.897013f, 0.910837f, 0.943680f, 0.945397f, 0.885614f, 0.810842f, 0.785450f, 0.810782f, 0.840026f, 0.841958f, 0.818240f, 0.787351f, 0.773027f, 0.771807f, 0.719767f, 0.550609f, 0.313730f, 0.167709f, 0.207926f, 0.353731f, 0.457636f, 0.477010f, 0.476826f, 0.500626f, 0.512220f, 0.460719f, 0.349140f, 0.228045f, 0.152067f} + }, + { + {0.111800f, 0.092661f, 0.019679f, -0.084828f, -0.131610f, -0.075720f, 0.020947f, 0.070804f, 0.057095f, 0.017174f, -0.024764f, -0.063473f, -0.081887f, -0.063680f, -0.026483f, -0.005095f, -0.004637f, 0.001937f, 0.032512f, 0.076614f, 0.117317f, 0.150397f, 0.176796f, 0.192008f, 0.191179f, 0.177643f, 0.160955f, 0.148604f, 0.140863f, 0.132054f, 0.116684f, 0.094872f, 0.071200f, 0.049422f, 0.031033f, 0.018196f, 0.014048f, 0.019156f, 0.030249f, 0.043163f, 0.055421f, 0.066053f, 0.074723f, 0.081336f, 0.085615f, 0.087194f, 0.086271f, 0.083351f, 0.078080f, 0.069159f, 0.055488f, 0.036660f, 0.012659f, -0.016143f, -0.049048f, -0.085606f, -0.125572f, -0.168143f, -0.212165f, -0.257142f, -0.302871f, -0.348257f, -0.391847f, -0.433166f, -0.472058f, -0.507229f, -0.537018f, -0.560983f, -0.579257f, -0.591157f, -0.595846f, -0.593435f, -0.584148f, -0.567609f, -0.544156f, -0.515516f, -0.482987f, -0.446431f, -0.406289f, -0.365128f, -0.325668f, -0.288357f, -0.252382f, -0.218489f, -0.189259f, -0.166273f, -0.148047f, -0.131878f, -0.117566f, -0.107866f, -0.104589f, -0.105701f, -0.107613f, -0.109110f, -0.111389f, -0.115264f, + -0.120183f, -0.125324f, -0.129915f, -0.132847f, -0.133281f, -0.131381f, -0.127775f, -0.122673f, -0.115742f, -0.106161f, -0.092976f, -0.076359f, -0.058245f, -0.040715f, -0.024211f, -0.008209f, 0.007258f, 0.021783f, 0.035256f, 0.047287f, 0.056855f, 0.063257f, 0.066479f, 0.066398f, 0.062795f, 0.056194f, 0.047396f, 0.036403f, 0.022988f, 0.007826f, -0.008088f, -0.024369f, -0.040627f, -0.056023f, -0.070170f, -0.083234f, -0.094733f, -0.103775f, -0.110653f, -0.116618f, -0.122314f, -0.128068f, -0.134857f, -0.143057f, -0.151192f, -0.157728f, -0.162866f, -0.167154f, -0.170084f, -0.171405f, -0.171850f, -0.171588f, -0.169994f, -0.167442f, -0.165063f, -0.162823f, -0.160119f, -0.157592f, -0.156017f, -0.154586f, -0.152457f, -0.150257f, -0.148223f, -0.145186f, -0.140883f, -0.136504f, -0.132024f, -0.126153f, -0.119172f, -0.112453f, -0.105722f, -0.098322f, -0.091699f, -0.087128f, -0.083245f, -0.079038f, -0.075972f, -0.074448f, -0.072364f, -0.069148f, -0.066198f, -0.062479f, -0.055594f, -0.046807f, -0.038577f, -0.029196f, -0.016675f, -0.003950f, 0.006731f, 0.018542f, 0.032724f, 0.044915f, 0.054264f, 0.065298f, 0.077171f, 0.084883f, + 0.091733f, 0.103322f, 0.113002f, 0.114742f, 0.120485f, 0.137595f, 0.147068f, 0.139282f, 0.143207f, 0.172839f, 0.184844f, 0.156538f, 0.155945f, 0.236396f, 0.307519f, 0.240925f, 0.079148f, -0.007414f, 0.032856f, 0.086859f, 0.091724f, 0.123044f, 0.215138f, 0.257298f, 0.162344f, 0.014559f, -0.050405f, -0.023988f, 0.006360f, -0.000879f, -0.010258f, 0.021849f, 0.100940f, 0.184008f, 0.193280f, 0.089909f, -0.050182f, -0.095653f, -0.016073f, 0.083366f, 0.106152f, 0.075547f, 0.065316f, 0.083957f, 0.084840f, 0.051826f, 0.014987f, -0.002403f}, + {0.111800f, 0.092661f, 0.019679f, -0.084828f, -0.131610f, -0.075720f, 0.020947f, 0.070804f, 0.057095f, 0.017174f, -0.024764f, -0.063473f, -0.081887f, -0.063680f, -0.026483f, -0.005095f, -0.004637f, 0.001937f, 0.032512f, 0.076614f, 0.117317f, 0.150397f, 0.176796f, 0.192008f, 0.191179f, 0.177643f, 0.160955f, 0.148604f, 0.140863f, 0.132054f, 0.116684f, 0.094872f, 0.071200f, 0.049422f, 0.031033f, 0.018196f, 0.014048f, 0.019156f, 0.030249f, 0.043163f, 0.055421f, 0.066053f, 0.074723f, 0.081336f, 0.085615f, 0.087194f, 0.086271f, 0.083351f, 0.078080f, 0.069159f, 0.055488f, 0.036660f, 0.012659f, -0.016143f, -0.049048f, -0.085606f, -0.125572f, -0.168143f, -0.212165f, -0.257142f, -0.302871f, -0.348257f, -0.391847f, -0.433166f, -0.472058f, -0.507229f, -0.537018f, -0.560983f, -0.579257f, -0.591157f, -0.595846f, -0.593435f, -0.584148f, -0.567609f, -0.544156f, -0.515516f, -0.482987f, -0.446431f, -0.406289f, -0.365128f, -0.325668f, -0.288357f, -0.252382f, -0.218489f, -0.189259f, -0.166273f, -0.148047f, -0.131878f, -0.117566f, -0.107866f, -0.104589f, -0.105701f, -0.107613f, -0.109110f, -0.111389f, -0.115264f, + -0.120183f, -0.125324f, -0.129915f, -0.132847f, -0.133281f, -0.131381f, -0.127775f, -0.122673f, -0.115742f, -0.106161f, -0.092976f, -0.076359f, -0.058245f, -0.040715f, -0.024211f, -0.008209f, 0.007258f, 0.021783f, 0.035256f, 0.047287f, 0.056855f, 0.063257f, 0.066479f, 0.066398f, 0.062795f, 0.056194f, 0.047396f, 0.036403f, 0.022988f, 0.007826f, -0.008088f, -0.024369f, -0.040627f, -0.056023f, -0.070170f, -0.083234f, -0.094733f, -0.103775f, -0.110653f, -0.116618f, -0.122314f, -0.128068f, -0.134857f, -0.143057f, -0.151192f, -0.157728f, -0.162866f, -0.167154f, -0.170084f, -0.171405f, -0.171850f, -0.171588f, -0.169994f, -0.167442f, -0.165063f, -0.162823f, -0.160119f, -0.157592f, -0.156017f, -0.154586f, -0.152457f, -0.150257f, -0.148223f, -0.145186f, -0.140883f, -0.136504f, -0.132024f, -0.126153f, -0.119172f, -0.112453f, -0.105722f, -0.098322f, -0.091699f, -0.087128f, -0.083245f, -0.079038f, -0.075972f, -0.074448f, -0.072364f, -0.069148f, -0.066198f, -0.062479f, -0.055594f, -0.046807f, -0.038577f, -0.029196f, -0.016675f, -0.003950f, 0.006731f, 0.018542f, 0.032724f, 0.044915f, 0.054264f, 0.065298f, 0.077171f, 0.084883f, + 0.091733f, 0.103322f, 0.113002f, 0.114742f, 0.120485f, 0.137595f, 0.147068f, 0.139282f, 0.143207f, 0.172839f, 0.184844f, 0.156538f, 0.155945f, 0.236396f, 0.307519f, 0.240925f, 0.079148f, -0.007414f, 0.032856f, 0.086859f, 0.091724f, 0.123044f, 0.215138f, 0.257298f, 0.162344f, 0.014559f, -0.050405f, -0.023988f, 0.006360f, -0.000879f, -0.010258f, 0.021849f, 0.100940f, 0.184008f, 0.193280f, 0.089909f, -0.050182f, -0.095653f, -0.016073f, 0.083366f, 0.106152f, 0.075547f, 0.065316f, 0.083957f, 0.084840f, 0.051826f, 0.014987f, -0.002403f} + }, + { + {0.059457f, 0.085936f, 0.085241f, 0.027833f, -0.043944f, -0.063521f, -0.019521f, 0.033320f, 0.036813f, -0.016068f, -0.088274f, -0.140585f, -0.158479f, -0.151114f, -0.137138f, -0.128832f, -0.122444f, -0.103537f, -0.063178f, -0.006147f, 0.056899f, 0.119000f, 0.175976f, 0.223007f, 0.258809f, 0.290082f, 0.325544f, 0.366060f, 0.404748f, 0.435940f, 0.459659f, 0.477057f, 0.485768f, 0.481949f, 0.464583f, 0.435511f, 0.396430f, 0.348217f, 0.293152f, 0.235872f, 0.181156f, 0.131462f, 0.086995f, 0.047291f, 0.011925f, -0.019860f, -0.049234f, -0.077087f, -0.103305f, -0.126782f, -0.146073f, -0.160114f, -0.168584f, -0.172163f, -0.172742f, -0.172926f, -0.174658f, -0.178393f, -0.183847f, -0.190894f, -0.199120f, -0.207336f, -0.214617f, -0.221287f, -0.227964f, -0.234364f, -0.240080f, -0.245597f, -0.251299f, -0.256363f, -0.259991f, -0.262809f, -0.265586f, -0.267476f, -0.267095f, -0.264473f, -0.260252f, -0.253718f, -0.243511f, -0.229851f, -0.214251f, -0.197126f, -0.177462f, -0.155123f, -0.131960f, -0.110023f, -0.089716f, -0.070352f, -0.051528f, -0.033035f, -0.014169f, 0.005575f, 0.025309f, 0.043447f, 0.059669f, 0.074999f, + 0.089633f, 0.101857f, 0.109868f, 0.113881f, 0.115686f, 0.116439f, 0.115296f, 0.110050f, 0.099149f, 0.083422f, 0.065582f, 0.047620f, 0.029031f, 0.008119f, -0.015408f, -0.039719f, -0.062334f, -0.081886f, -0.098915f, -0.115347f, -0.132714f, -0.150577f, -0.167011f, -0.180529f, -0.191095f, -0.199667f, -0.207607f, -0.216183f, -0.225727f, -0.235418f, -0.244418f, -0.252854f, -0.261300f, -0.270058f, -0.279398f, -0.289700f, -0.300910f, -0.312505f, -0.324199f, -0.335987f, -0.347581f, -0.358572f, -0.368949f, -0.378735f, -0.387465f, -0.394661f, -0.400258f, -0.404073f, -0.405616f, -0.404811f, -0.402129f, -0.397863f, -0.392175f, -0.385744f, -0.379333f, -0.373003f, -0.366685f, -0.360900f, -0.356011f, -0.351700f, -0.347985f, -0.345621f, -0.344803f, -0.344833f, -0.345464f, -0.347028f, -0.349093f, -0.350709f, -0.351891f, -0.353267f, -0.354902f, -0.356927f, -0.360197f, -0.364876f, -0.369876f, -0.374777f, -0.380264f, -0.386061f, -0.390973f, -0.395145f, -0.399381f, -0.402703f, -0.403726f, -0.403187f, -0.401906f, -0.398520f, -0.392428f, -0.385687f, -0.379088f, -0.370803f, -0.361132f, -0.352826f, -0.345523f, -0.336817f, -0.328347f, -0.322499f, + -0.316073f, -0.307037f, -0.300969f, -0.299317f, -0.292838f, -0.280644f, -0.277266f, -0.283217f, -0.276239f, -0.255690f, -0.255875f, -0.279115f, -0.268071f, -0.203008f, -0.169784f, -0.245698f, -0.365333f, -0.404529f, -0.361687f, -0.334923f, -0.343079f, -0.311549f, -0.240812f, -0.239266f, -0.346481f, -0.455499f, -0.471686f, -0.438424f, -0.438562f, -0.467601f, -0.476962f, -0.461364f, -0.428614f, -0.352244f, -0.233087f, -0.153489f, -0.187619f, -0.290385f, -0.350672f, -0.336184f, -0.314805f, -0.337205f, -0.368617f, -0.359721f, -0.333879f, -0.360020f, -0.453502f, -0.541952f}, + {0.059457f, 0.085936f, 0.085241f, 0.027833f, -0.043944f, -0.063521f, -0.019521f, 0.033320f, 0.036813f, -0.016068f, -0.088274f, -0.140585f, -0.158479f, -0.151114f, -0.137138f, -0.128832f, -0.122444f, -0.103537f, -0.063178f, -0.006147f, 0.056899f, 0.119000f, 0.175976f, 0.223007f, 0.258809f, 0.290082f, 0.325544f, 0.366060f, 0.404748f, 0.435940f, 0.459659f, 0.477057f, 0.485768f, 0.481949f, 0.464583f, 0.435511f, 0.396430f, 0.348217f, 0.293152f, 0.235872f, 0.181156f, 0.131462f, 0.086995f, 0.047291f, 0.011925f, -0.019860f, -0.049234f, -0.077087f, -0.103305f, -0.126782f, -0.146073f, -0.160114f, -0.168584f, -0.172163f, -0.172742f, -0.172926f, -0.174658f, -0.178393f, -0.183847f, -0.190894f, -0.199120f, -0.207336f, -0.214617f, -0.221287f, -0.227964f, -0.234364f, -0.240080f, -0.245597f, -0.251299f, -0.256363f, -0.259991f, -0.262809f, -0.265586f, -0.267476f, -0.267095f, -0.264473f, -0.260252f, -0.253718f, -0.243511f, -0.229851f, -0.214251f, -0.197126f, -0.177462f, -0.155123f, -0.131960f, -0.110023f, -0.089716f, -0.070352f, -0.051528f, -0.033035f, -0.014169f, 0.005575f, 0.025309f, 0.043447f, 0.059669f, 0.074999f, + 0.089633f, 0.101857f, 0.109868f, 0.113881f, 0.115686f, 0.116439f, 0.115296f, 0.110050f, 0.099149f, 0.083422f, 0.065582f, 0.047620f, 0.029031f, 0.008119f, -0.015408f, -0.039719f, -0.062334f, -0.081886f, -0.098915f, -0.115347f, -0.132714f, -0.150577f, -0.167011f, -0.180529f, -0.191095f, -0.199667f, -0.207607f, -0.216183f, -0.225727f, -0.235418f, -0.244418f, -0.252854f, -0.261300f, -0.270058f, -0.279398f, -0.289700f, -0.300910f, -0.312505f, -0.324199f, -0.335987f, -0.347581f, -0.358572f, -0.368949f, -0.378735f, -0.387465f, -0.394661f, -0.400258f, -0.404073f, -0.405616f, -0.404811f, -0.402129f, -0.397863f, -0.392175f, -0.385744f, -0.379333f, -0.373003f, -0.366685f, -0.360900f, -0.356011f, -0.351700f, -0.347985f, -0.345621f, -0.344803f, -0.344833f, -0.345464f, -0.347028f, -0.349093f, -0.350709f, -0.351891f, -0.353267f, -0.354902f, -0.356927f, -0.360197f, -0.364876f, -0.369876f, -0.374777f, -0.380264f, -0.386061f, -0.390973f, -0.395145f, -0.399381f, -0.402703f, -0.403726f, -0.403187f, -0.401906f, -0.398520f, -0.392428f, -0.385687f, -0.379088f, -0.370803f, -0.361132f, -0.352826f, -0.345523f, -0.336817f, -0.328347f, -0.322499f, + -0.316073f, -0.307037f, -0.300969f, -0.299317f, -0.292838f, -0.280644f, -0.277266f, -0.283217f, -0.276239f, -0.255690f, -0.255875f, -0.279115f, -0.268071f, -0.203008f, -0.169784f, -0.245698f, -0.365333f, -0.404529f, -0.361687f, -0.334923f, -0.343079f, -0.311549f, -0.240812f, -0.239266f, -0.346481f, -0.455499f, -0.471686f, -0.438424f, -0.438562f, -0.467601f, -0.476962f, -0.461364f, -0.428614f, -0.352244f, -0.233087f, -0.153489f, -0.187619f, -0.290385f, -0.350672f, -0.336184f, -0.314805f, -0.337205f, -0.368617f, -0.359721f, -0.333879f, -0.360020f, -0.453502f, -0.541952f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]={ + { + {-0.232642f, -0.619757f, -0.819335f, -0.824328f, -0.706584f, -0.546612f, -0.382357f, -0.211011f, -0.022767f, 0.174826f, 0.359188f, 0.508148f, 0.609626f, 0.661324f, 0.667146f, 0.635245f, 0.576667f, 0.502394f, 0.419701f, 0.331090f, 0.237324f, 0.141387f, 0.048569f, -0.037525f, -0.117560f, -0.193955f, -0.266698f, -0.333052f, -0.390834f, -0.440313f, -0.482842f, -0.519219f, -0.550026f, -0.576478f, -0.599941f, -0.620936f, -0.639198f, -0.654639f, -0.667907f, -0.679984f, -0.691454f, -0.702244f, -0.711985f, -0.720441f, -0.727553f, -0.733292f, -0.737699f, -0.740994f, -0.743411f, -0.744954f, -0.745498f, -0.745034f, -0.743668f, -0.741462f, -0.738438f, -0.734723f, -0.730530f, -0.726026f, -0.721284f, -0.716333f, -0.711223f, -0.706042f, -0.700845f, -0.695593f, -0.690269f, -0.685041f, -0.680161f, -0.675721f, -0.671676f, -0.668072f, -0.665011f, -0.662423f, -0.660150f, -0.658206f, -0.656688f, -0.655503f, -0.654437f, -0.653421f, -0.652408f, -0.651126f, -0.649247f, -0.646675f, -0.643399f, -0.639213f, -0.633903f, -0.627573f, -0.620560f, -0.613122f, -0.605346f, -0.597201f, -0.588552f, -0.579312f, -0.569672f, -0.560020f, -0.550630f, -0.541590f, + -0.532994f, -0.524947f, -0.517448f, -0.510454f, -0.504037f, -0.498304f, -0.493261f, -0.488818f, -0.484835f, -0.481127f, -0.477591f, -0.474316f, -0.471348f, -0.468385f, -0.464947f, -0.460801f, -0.456039f, -0.450823f, -0.445293f, -0.439599f, -0.433815f, -0.427903f, -0.421886f, -0.415901f, -0.410010f, -0.404135f, -0.398211f, -0.392213f, -0.386062f, -0.379728f, -0.373352f, -0.367079f, -0.360861f, -0.354623f, -0.348453f, -0.342474f, -0.336717f, -0.331241f, -0.326150f, -0.321375f, -0.316703f, -0.312055f, -0.307501f, -0.303027f, -0.298575f, -0.294194f, -0.289903f, -0.285550f, -0.281022f, -0.276422f, -0.271827f, -0.267178f, -0.262535f, -0.258098f, -0.253864f, -0.249627f, -0.245362f, -0.241189f, -0.237022f, -0.232677f, -0.228229f, -0.223866f, -0.219586f, -0.215378f, -0.211424f, -0.207793f, -0.204299f, -0.200877f, -0.197662f, -0.194546f, -0.191240f, -0.187807f, -0.184548f, -0.181425f, -0.178221f, -0.175084f, -0.172235f, -0.169471f, -0.166568f, -0.163737f, -0.161128f, -0.158515f, -0.155899f, -0.153649f, -0.151723f, -0.149662f, -0.147483f, -0.145537f, -0.143560f, -0.141061f, -0.138329f, -0.135814f, -0.133105f, -0.129813f, -0.126525f, -0.123593f, + -0.120298f, -0.116424f, -0.112883f, -0.109720f, -0.105787f, -0.101273f, -0.097619f, -0.094331f, -0.089558f, -0.084187f, -0.080833f, -0.078688f, -0.074889f, -0.070753f, -0.069809f, -0.069830f, -0.064961f, -0.055837f, -0.048252f, -0.041884f, -0.032181f, -0.025073f, -0.035481f, -0.064601f, -0.090757f, -0.092450f, -0.073213f, -0.055377f, -0.054369f, -0.066563f, -0.079976f, -0.091134f, -0.109543f, -0.143769f, -0.182405f, -0.196180f, -0.167685f, -0.114625f, -0.072411f, -0.055952f, -0.051237f, -0.043408f, -0.036029f, -0.036627f, -0.038865f, -0.031657f, -0.016835f, -0.004448f}, + {-0.232642f, -0.619757f, -0.819335f, -0.824328f, -0.706584f, -0.546612f, -0.382357f, -0.211011f, -0.022767f, 0.174826f, 0.359188f, 0.508148f, 0.609626f, 0.661324f, 0.667146f, 0.635245f, 0.576667f, 0.502394f, 0.419701f, 0.331090f, 0.237324f, 0.141387f, 0.048569f, -0.037525f, -0.117560f, -0.193955f, -0.266698f, -0.333052f, -0.390834f, -0.440313f, -0.482842f, -0.519219f, -0.550026f, -0.576478f, -0.599941f, -0.620936f, -0.639198f, -0.654639f, -0.667907f, -0.679984f, -0.691454f, -0.702244f, -0.711985f, -0.720441f, -0.727553f, -0.733292f, -0.737699f, -0.740994f, -0.743411f, -0.744954f, -0.745498f, -0.745034f, -0.743668f, -0.741462f, -0.738438f, -0.734723f, -0.730530f, -0.726026f, -0.721284f, -0.716333f, -0.711223f, -0.706042f, -0.700845f, -0.695593f, -0.690269f, -0.685041f, -0.680161f, -0.675721f, -0.671676f, -0.668072f, -0.665011f, -0.662423f, -0.660150f, -0.658206f, -0.656688f, -0.655503f, -0.654437f, -0.653421f, -0.652408f, -0.651126f, -0.649247f, -0.646675f, -0.643399f, -0.639213f, -0.633903f, -0.627573f, -0.620560f, -0.613122f, -0.605346f, -0.597201f, -0.588552f, -0.579312f, -0.569672f, -0.560020f, -0.550630f, -0.541590f, + -0.532994f, -0.524947f, -0.517448f, -0.510454f, -0.504037f, -0.498304f, -0.493261f, -0.488818f, -0.484835f, -0.481127f, -0.477591f, -0.474316f, -0.471348f, -0.468385f, -0.464947f, -0.460801f, -0.456039f, -0.450823f, -0.445293f, -0.439599f, -0.433815f, -0.427903f, -0.421886f, -0.415901f, -0.410010f, -0.404135f, -0.398211f, -0.392213f, -0.386062f, -0.379728f, -0.373352f, -0.367079f, -0.360861f, -0.354623f, -0.348453f, -0.342474f, -0.336717f, -0.331241f, -0.326150f, -0.321375f, -0.316703f, -0.312055f, -0.307501f, -0.303027f, -0.298575f, -0.294194f, -0.289903f, -0.285550f, -0.281022f, -0.276422f, -0.271827f, -0.267178f, -0.262535f, -0.258098f, -0.253864f, -0.249627f, -0.245362f, -0.241189f, -0.237022f, -0.232677f, -0.228229f, -0.223866f, -0.219586f, -0.215378f, -0.211424f, -0.207793f, -0.204299f, -0.200877f, -0.197662f, -0.194546f, -0.191240f, -0.187807f, -0.184548f, -0.181425f, -0.178221f, -0.175084f, -0.172235f, -0.169471f, -0.166568f, -0.163737f, -0.161128f, -0.158515f, -0.155899f, -0.153649f, -0.151723f, -0.149662f, -0.147483f, -0.145537f, -0.143560f, -0.141061f, -0.138329f, -0.135814f, -0.133105f, -0.129813f, -0.126525f, -0.123593f, + -0.120298f, -0.116424f, -0.112883f, -0.109720f, -0.105787f, -0.101273f, -0.097619f, -0.094331f, -0.089558f, -0.084187f, -0.080833f, -0.078688f, -0.074889f, -0.070753f, -0.069809f, -0.069830f, -0.064961f, -0.055837f, -0.048252f, -0.041884f, -0.032181f, -0.025073f, -0.035481f, -0.064601f, -0.090757f, -0.092450f, -0.073213f, -0.055377f, -0.054369f, -0.066563f, -0.079976f, -0.091134f, -0.109543f, -0.143769f, -0.182405f, -0.196180f, -0.167685f, -0.114625f, -0.072411f, -0.055952f, -0.051237f, -0.043408f, -0.036029f, -0.036627f, -0.038865f, -0.031657f, -0.016835f, -0.004448f} + }, + { + {0.140382f, 0.284796f, 0.113059f, -0.341301f, -0.862015f, -1.204634f, -1.248279f, -1.029758f, -0.664763f, -0.256066f, 0.137783f, 0.487211f, 0.775946f, 0.997771f, 1.153436f, 1.245420f, 1.277398f, 1.256961f, 1.195620f, 1.106451f, 1.001768f, 0.890131f, 0.774183f, 0.653473f, 0.530185f, 0.410173f, 0.298320f, 0.195312f, 0.099336f, 0.008646f, -0.078032f, -0.161428f, -0.241062f, -0.315649f, -0.384630f, -0.448733f, -0.509170f, -0.566793f, -0.621581f, -0.672385f, -0.717596f, -0.756520f, -0.789753f, -0.818228f, -0.842538f, -0.863181f, -0.880623f, -0.894965f, -0.906175f, -0.914704f, -0.921413f, -0.926918f, -0.931340f, -0.934448f, -0.935793f, -0.935022f, -0.932267f, -0.927970f, -0.922378f, -0.915726f, -0.908718f, -0.902136f, -0.896106f, -0.890432f, -0.885422f, -0.881597f, -0.878827f, -0.876579f, -0.874831f, -0.873952f, -0.873913f, -0.874370f, -0.875375f, -0.877274f, -0.880013f, -0.883133f, -0.886386f, -0.889857f, -0.893495f, -0.896943f, -0.899891f, -0.902370f, -0.904567f, -0.906469f, -0.907798f, -0.908330f, -0.908151f, -0.907581f, -0.906978f, -0.906626f, -0.906487f, -0.905858f, -0.903647f, -0.899249f, -0.892899f, -0.884927f, + -0.875053f, -0.862712f, -0.847727f, -0.830455f, -0.811563f, -0.791782f, -0.771500f, -0.750522f, -0.728617f, -0.706326f, -0.684815f, -0.664994f, -0.647154f, -0.631330f, -0.617578f, -0.605915f, -0.596270f, -0.588409f, -0.581848f, -0.576120f, -0.571189f, -0.567244f, -0.564062f, -0.560956f, -0.557300f, -0.552749f, -0.547149f, -0.540696f, -0.533982f, -0.527464f, -0.521067f, -0.514596f, -0.508155f, -0.501839f, -0.495465f, -0.488925f, -0.482422f, -0.476181f, -0.470299f, -0.464951f, -0.460286f, -0.456131f, -0.452168f, -0.448311f, -0.444625f, -0.441111f, -0.437847f, -0.435012f, -0.432529f, -0.430047f, -0.427337f, -0.424316f, -0.420805f, -0.416729f, -0.412382f, -0.407980f, -0.403285f, -0.398067f, -0.392448f, -0.386360f, -0.379335f, -0.371209f, -0.362359f, -0.353002f, -0.343026f, -0.332618f, -0.322186f, -0.311707f, -0.300948f, -0.290105f, -0.279460f, -0.268914f, -0.258530f, -0.248800f, -0.239810f, -0.231038f, -0.222364f, -0.214099f, -0.205871f, -0.196868f, -0.187179f, -0.177547f, -0.168128f, -0.158861f, -0.150296f, -0.142677f, -0.135313f, -0.127959f, -0.121270f, -0.115110f, -0.108460f, -0.101467f, -0.095154f, -0.089193f, -0.082636f, -0.076028f, + -0.070002f, -0.063579f, -0.056514f, -0.050189f, -0.043975f, -0.035661f, -0.026929f, -0.020905f, -0.014065f, -0.001634f, 0.010286f, 0.014441f, 0.021776f, 0.046877f, 0.075043f, 0.076336f, 0.055881f, 0.051243f, 0.071963f, 0.088061f, 0.093592f, 0.127625f, 0.202698f, 0.263860f, 0.260005f, 0.216330f, 0.195773f, 0.220955f, 0.268761f, 0.311828f, 0.337692f, 0.357947f, 0.413641f, 0.524316f, 0.615425f, 0.563270f, 0.351718f, 0.123833f, 0.026612f, 0.054001f, 0.097163f, 0.102905f, 0.112567f, 0.165999f, 0.234599f, 0.256682f, 0.199112f, 0.074735f}, + {-0.140382f, -0.284796f, -0.113059f, 0.341301f, 0.862015f, 1.204634f, 1.248279f, 1.029758f, 0.664763f, 0.256066f, -0.137783f, -0.487211f, -0.775946f, -0.997771f, -1.153436f, -1.245420f, -1.277398f, -1.256961f, -1.195620f, -1.106451f, -1.001768f, -0.890131f, -0.774183f, -0.653473f, -0.530185f, -0.410173f, -0.298320f, -0.195312f, -0.099336f, -0.008646f, 0.078032f, 0.161428f, 0.241062f, 0.315649f, 0.384630f, 0.448733f, 0.509170f, 0.566793f, 0.621581f, 0.672385f, 0.717596f, 0.756520f, 0.789753f, 0.818228f, 0.842538f, 0.863181f, 0.880623f, 0.894965f, 0.906175f, 0.914704f, 0.921413f, 0.926918f, 0.931340f, 0.934448f, 0.935793f, 0.935022f, 0.932267f, 0.927970f, 0.922378f, 0.915726f, 0.908718f, 0.902136f, 0.896106f, 0.890432f, 0.885422f, 0.881597f, 0.878827f, 0.876579f, 0.874831f, 0.873952f, 0.873913f, 0.874370f, 0.875375f, 0.877274f, 0.880013f, 0.883133f, 0.886386f, 0.889857f, 0.893495f, 0.896943f, 0.899891f, 0.902370f, 0.904567f, 0.906469f, 0.907798f, 0.908330f, 0.908151f, 0.907581f, 0.906978f, 0.906626f, 0.906487f, 0.905858f, 0.903647f, 0.899249f, 0.892899f, 0.884927f, + 0.875053f, 0.862712f, 0.847727f, 0.830455f, 0.811563f, 0.791782f, 0.771500f, 0.750522f, 0.728617f, 0.706326f, 0.684815f, 0.664994f, 0.647154f, 0.631330f, 0.617578f, 0.605915f, 0.596270f, 0.588409f, 0.581848f, 0.576120f, 0.571189f, 0.567244f, 0.564062f, 0.560956f, 0.557300f, 0.552749f, 0.547149f, 0.540696f, 0.533982f, 0.527464f, 0.521067f, 0.514596f, 0.508155f, 0.501839f, 0.495465f, 0.488925f, 0.482422f, 0.476181f, 0.470299f, 0.464951f, 0.460286f, 0.456131f, 0.452168f, 0.448311f, 0.444625f, 0.441111f, 0.437847f, 0.435012f, 0.432529f, 0.430047f, 0.427337f, 0.424316f, 0.420805f, 0.416729f, 0.412382f, 0.407980f, 0.403285f, 0.398067f, 0.392448f, 0.386360f, 0.379335f, 0.371209f, 0.362359f, 0.353002f, 0.343026f, 0.332618f, 0.322186f, 0.311707f, 0.300948f, 0.290105f, 0.279460f, 0.268914f, 0.258530f, 0.248800f, 0.239810f, 0.231038f, 0.222364f, 0.214099f, 0.205871f, 0.196868f, 0.187179f, 0.177547f, 0.168128f, 0.158861f, 0.150296f, 0.142677f, 0.135313f, 0.127959f, 0.121270f, 0.115110f, 0.108460f, 0.101467f, 0.095154f, 0.089193f, 0.082636f, 0.076028f, + 0.070002f, 0.063579f, 0.056514f, 0.050189f, 0.043975f, 0.035661f, 0.026929f, 0.020905f, 0.014065f, 0.001634f, -0.010286f, -0.014441f, -0.021776f, -0.046877f, -0.075043f, -0.076336f, -0.055881f, -0.051243f, -0.071963f, -0.088061f, -0.093592f, -0.127625f, -0.202698f, -0.263860f, -0.260005f, -0.216330f, -0.195773f, -0.220955f, -0.268761f, -0.311828f, -0.337692f, -0.357947f, -0.413641f, -0.524316f, -0.615425f, -0.563270f, -0.351718f, -0.123833f, -0.026612f, -0.054001f, -0.097163f, -0.102905f, -0.112567f, -0.165999f, -0.234599f, -0.256682f, -0.199112f, -0.074735f} + }, + { + {-0.025709f, -0.087852f, -0.139072f, -0.114670f, -0.010581f, 0.083762f, 0.089935f, 0.027679f, -0.033031f, -0.059926f, -0.060733f, -0.038043f, 0.008721f, 0.055627f, 0.072784f, 0.065756f, 0.067013f, 0.089127f, 0.112190f, 0.115989f, 0.101255f, 0.076571f, 0.043604f, 0.002504f, -0.039568f, -0.072838f, -0.093984f, -0.107885f, -0.122174f, -0.140465f, -0.159571f, -0.173362f, -0.178912f, -0.177313f, -0.169818f, -0.156888f, -0.141159f, -0.127823f, -0.120897f, -0.120944f, -0.126572f, -0.136377f, -0.149380f, -0.165024f, -0.183014f, -0.202776f, -0.223635f, -0.245715f, -0.269757f, -0.295840f, -0.323002f, -0.349990f, -0.375616f, -0.398737f, -0.418610f, -0.434862f, -0.446808f, -0.453571f, -0.454971f, -0.451233f, -0.441889f, -0.426235f, -0.404594f, -0.377728f, -0.345446f, -0.307343f, -0.264342f, -0.217973f, -0.168839f, -0.117241f, -0.064423f, -0.011833f, 0.039787f, 0.089385f, 0.134986f, 0.175305f, 0.210590f, 0.240697f, 0.263879f, 0.278867f, 0.286867f, 0.289982f, 0.288504f, 0.281317f, 0.268764f, 0.253745f, 0.239176f, 0.224979f, 0.208874f, 0.190415f, 0.172740f, 0.159261f, 0.149978f, 0.142540f, 0.135820f, 0.130669f, + 0.128026f, 0.128135f, 0.131114f, 0.136745f, 0.143982f, 0.151658f, 0.159406f, 0.167441f, 0.175977f, 0.184865f, 0.192984f, 0.198243f, 0.199231f, 0.196556f, 0.191632f, 0.184859f, 0.175906f, 0.164788f, 0.151549f, 0.135833f, 0.117715f, 0.098073f, 0.077678f, 0.056957f, 0.036748f, 0.018014f, 0.000872f, -0.014868f, -0.028575f, -0.039388f, -0.047290f, -0.052543f, -0.054987f, -0.054782f, -0.052664f, -0.048888f, -0.043302f, -0.036732f, -0.030687f, -0.025659f, -0.021283f, -0.017577f, -0.014246f, -0.009715f, -0.002804f, 0.005660f, 0.014470f, 0.023743f, 0.033647f, 0.043359f, 0.052494f, 0.061578f, 0.070378f, 0.077923f, 0.084389f, 0.090692f, 0.096591f, 0.101528f, 0.106380f, 0.112094f, 0.118037f, 0.123692f, 0.129929f, 0.136925f, 0.143401f, 0.149129f, 0.155244f, 0.161468f, 0.166321f, 0.169947f, 0.173303f, 0.175561f, 0.175884f, 0.175902f, 0.177023f, 0.178070f, 0.178540f, 0.180407f, 0.184301f, 0.188503f, 0.193141f, 0.199909f, 0.207375f, 0.212779f, 0.217314f, 0.222988f, 0.227302f, 0.227989f, 0.228035f, 0.229199f, 0.227725f, 0.222579f, 0.218340f, 0.215242f, 0.208655f, 0.200648f, + 0.196609f, 0.191792f, 0.180454f, 0.171665f, 0.171997f, 0.166224f, 0.145987f, 0.134797f, 0.144064f, 0.138339f, 0.100138f, 0.083322f, 0.120723f, 0.129214f, 0.021665f, -0.123541f, -0.144768f, -0.034350f, 0.057753f, 0.060616f, 0.056870f, 0.089515f, 0.067490f, -0.060009f, -0.181042f, -0.173043f, -0.072960f, -0.000831f, 0.008317f, 0.010713f, 0.046903f, 0.097902f, 0.114688f, 0.055575f, -0.066337f, -0.157373f, -0.122700f, 0.009537f, 0.105443f, 0.088390f, 0.020247f, -0.007578f, 0.004660f, 0.000024f, -0.033101f, -0.055003f, -0.043748f, -0.015207f}, + {-0.025709f, -0.087852f, -0.139072f, -0.114670f, -0.010581f, 0.083762f, 0.089935f, 0.027679f, -0.033031f, -0.059926f, -0.060733f, -0.038043f, 0.008721f, 0.055627f, 0.072784f, 0.065756f, 0.067013f, 0.089127f, 0.112190f, 0.115989f, 0.101255f, 0.076571f, 0.043604f, 0.002504f, -0.039568f, -0.072838f, -0.093984f, -0.107885f, -0.122174f, -0.140465f, -0.159571f, -0.173362f, -0.178912f, -0.177313f, -0.169818f, -0.156888f, -0.141159f, -0.127823f, -0.120897f, -0.120944f, -0.126572f, -0.136377f, -0.149380f, -0.165024f, -0.183014f, -0.202776f, -0.223635f, -0.245715f, -0.269757f, -0.295840f, -0.323002f, -0.349990f, -0.375616f, -0.398737f, -0.418610f, -0.434862f, -0.446808f, -0.453571f, -0.454971f, -0.451233f, -0.441889f, -0.426235f, -0.404594f, -0.377728f, -0.345446f, -0.307343f, -0.264342f, -0.217973f, -0.168839f, -0.117241f, -0.064423f, -0.011833f, 0.039787f, 0.089385f, 0.134986f, 0.175305f, 0.210590f, 0.240697f, 0.263879f, 0.278867f, 0.286867f, 0.289982f, 0.288504f, 0.281317f, 0.268764f, 0.253745f, 0.239176f, 0.224979f, 0.208874f, 0.190415f, 0.172740f, 0.159261f, 0.149978f, 0.142540f, 0.135820f, 0.130669f, + 0.128026f, 0.128135f, 0.131114f, 0.136745f, 0.143982f, 0.151658f, 0.159406f, 0.167441f, 0.175977f, 0.184865f, 0.192984f, 0.198243f, 0.199231f, 0.196556f, 0.191632f, 0.184859f, 0.175906f, 0.164788f, 0.151549f, 0.135833f, 0.117715f, 0.098073f, 0.077678f, 0.056957f, 0.036748f, 0.018014f, 0.000872f, -0.014868f, -0.028575f, -0.039388f, -0.047290f, -0.052543f, -0.054987f, -0.054782f, -0.052664f, -0.048888f, -0.043302f, -0.036732f, -0.030687f, -0.025659f, -0.021283f, -0.017577f, -0.014246f, -0.009715f, -0.002804f, 0.005660f, 0.014470f, 0.023743f, 0.033647f, 0.043359f, 0.052494f, 0.061578f, 0.070378f, 0.077923f, 0.084389f, 0.090692f, 0.096591f, 0.101528f, 0.106380f, 0.112094f, 0.118037f, 0.123692f, 0.129929f, 0.136925f, 0.143401f, 0.149129f, 0.155244f, 0.161468f, 0.166321f, 0.169947f, 0.173303f, 0.175561f, 0.175884f, 0.175902f, 0.177023f, 0.178070f, 0.178540f, 0.180407f, 0.184301f, 0.188503f, 0.193141f, 0.199909f, 0.207375f, 0.212779f, 0.217314f, 0.222988f, 0.227302f, 0.227989f, 0.228035f, 0.229199f, 0.227725f, 0.222579f, 0.218340f, 0.215242f, 0.208655f, 0.200648f, + 0.196609f, 0.191792f, 0.180454f, 0.171665f, 0.171997f, 0.166224f, 0.145987f, 0.134797f, 0.144064f, 0.138339f, 0.100138f, 0.083322f, 0.120723f, 0.129214f, 0.021665f, -0.123541f, -0.144768f, -0.034350f, 0.057753f, 0.060616f, 0.056870f, 0.089515f, 0.067490f, -0.060009f, -0.181042f, -0.173043f, -0.072960f, -0.000831f, 0.008317f, 0.010713f, 0.046903f, 0.097902f, 0.114688f, 0.055575f, -0.066337f, -0.157373f, -0.122700f, 0.009537f, 0.105443f, 0.088390f, 0.020247f, -0.007578f, 0.004660f, 0.000024f, -0.033101f, -0.055003f, -0.043748f, -0.015207f} + }, + { + {0.004301f, -0.013476f, -0.069855f, -0.112233f, -0.090233f, -0.023427f, 0.018901f, -0.004024f, -0.066053f, -0.110415f, -0.105009f, -0.058395f, 0.001235f, 0.050922f, 0.084875f, 0.113445f, 0.150612f, 0.198514f, 0.245067f, 0.276957f, 0.290295f, 0.287473f, 0.270798f, 0.244182f, 0.215808f, 0.191987f, 0.169678f, 0.140040f, 0.098790f, 0.049069f, -0.005223f, -0.064266f, -0.129212f, -0.197710f, -0.264893f, -0.327191f, -0.382959f, -0.430138f, -0.465663f, -0.487872f, -0.498285f, -0.500319f, -0.496901f, -0.489765f, -0.480177f, -0.469238f, -0.457371f, -0.444016f, -0.428168f, -0.409285f, -0.387825f, -0.365159f, -0.343191f, -0.324015f, -0.309255f, -0.299101f, -0.292156f, -0.286670f, -0.281620f, -0.276311f, -0.269794f, -0.261628f, -0.252562f, -0.243448f, -0.234059f, -0.223904f, -0.213327f, -0.202652f, -0.191162f, -0.178231f, -0.164569f, -0.150934f, -0.136555f, -0.120347f, -0.102808f, -0.085100f, -0.067101f, -0.048163f, -0.029184f, -0.012044f, 0.002742f, 0.016047f, 0.027774f, 0.036175f, 0.040005f, 0.040094f, 0.038140f, 0.034953f, 0.030572f, 0.025196f, 0.018816f, 0.010402f, -0.001256f, -0.015920f, -0.032251f, -0.049947f, + -0.070292f, -0.094062f, -0.119898f, -0.145560f, -0.170281f, -0.195266f, -0.222067f, -0.250644f, -0.278790f, -0.303633f, -0.324109f, -0.341676f, -0.358158f, -0.373323f, -0.385151f, -0.392113f, -0.394639f, -0.394771f, -0.394738f, -0.395368f, -0.395476f, -0.393190f, -0.388016f, -0.381245f, -0.374662f, -0.369480f, -0.366096f, -0.363936f, -0.361729f, -0.358693f, -0.355247f, -0.352152f, -0.349560f, -0.347298f, -0.345265f, -0.343082f, -0.340057f, -0.335871f, -0.330643f, -0.324295f, -0.316590f, -0.307660f, -0.297736f, -0.286624f, -0.274141f, -0.260611f, -0.246376f, -0.231487f, -0.216324f, -0.201731f, -0.188250f, -0.176027f, -0.165469f, -0.156991f, -0.150296f, -0.144906f, -0.140952f, -0.138536f, -0.137112f, -0.136366f, -0.136669f, -0.137907f, -0.139122f, -0.139867f, -0.140476f, -0.140741f, -0.139998f, -0.138538f, -0.137285f, -0.136389f, -0.135636f, -0.135341f, -0.135341f, -0.134436f, -0.132129f, -0.129168f, -0.125552f, -0.120298f, -0.113600f, -0.106478f, -0.098431f, -0.088467f, -0.077617f, -0.067238f, -0.056573f, -0.045203f, -0.035126f, -0.027288f, -0.019916f, -0.012845f, -0.008413f, -0.006290f, -0.003787f, -0.001744f, -0.002475f, -0.003553f, + -0.002665f, -0.004018f, -0.009329f, -0.011340f, -0.008882f, -0.013592f, -0.026133f, -0.028495f, -0.020197f, -0.028759f, -0.055232f, -0.055789f, -0.023439f, -0.031660f, -0.124564f, -0.217122f, -0.200917f, -0.107754f, -0.056107f, -0.066073f, -0.058846f, -0.027906f, -0.061373f, -0.169830f, -0.234929f, -0.183494f, -0.092827f, -0.059029f, -0.063888f, -0.041976f, 0.009389f, 0.060627f, 0.114330f, 0.163356f, 0.148189f, 0.037885f, -0.089951f, -0.129600f, -0.082891f, -0.043468f, -0.059765f, -0.084990f, -0.070715f, -0.045983f, -0.067518f, -0.125030f, -0.140466f, -0.062947f}, + {0.004301f, -0.013476f, -0.069855f, -0.112233f, -0.090233f, -0.023427f, 0.018901f, -0.004024f, -0.066053f, -0.110415f, -0.105009f, -0.058395f, 0.001235f, 0.050922f, 0.084875f, 0.113445f, 0.150612f, 0.198514f, 0.245067f, 0.276957f, 0.290295f, 0.287473f, 0.270798f, 0.244182f, 0.215808f, 0.191987f, 0.169678f, 0.140040f, 0.098790f, 0.049069f, -0.005223f, -0.064266f, -0.129212f, -0.197710f, -0.264893f, -0.327191f, -0.382959f, -0.430138f, -0.465663f, -0.487872f, -0.498285f, -0.500319f, -0.496901f, -0.489765f, -0.480177f, -0.469238f, -0.457371f, -0.444016f, -0.428168f, -0.409285f, -0.387825f, -0.365159f, -0.343191f, -0.324015f, -0.309255f, -0.299101f, -0.292156f, -0.286670f, -0.281620f, -0.276311f, -0.269794f, -0.261628f, -0.252562f, -0.243448f, -0.234059f, -0.223904f, -0.213327f, -0.202652f, -0.191162f, -0.178231f, -0.164569f, -0.150934f, -0.136555f, -0.120347f, -0.102808f, -0.085100f, -0.067101f, -0.048163f, -0.029184f, -0.012044f, 0.002742f, 0.016047f, 0.027774f, 0.036175f, 0.040005f, 0.040094f, 0.038140f, 0.034953f, 0.030572f, 0.025196f, 0.018816f, 0.010402f, -0.001256f, -0.015920f, -0.032251f, -0.049947f, + -0.070292f, -0.094062f, -0.119898f, -0.145560f, -0.170281f, -0.195266f, -0.222067f, -0.250644f, -0.278790f, -0.303633f, -0.324109f, -0.341676f, -0.358158f, -0.373323f, -0.385151f, -0.392113f, -0.394639f, -0.394771f, -0.394738f, -0.395368f, -0.395476f, -0.393190f, -0.388016f, -0.381245f, -0.374662f, -0.369480f, -0.366096f, -0.363936f, -0.361729f, -0.358693f, -0.355247f, -0.352152f, -0.349560f, -0.347298f, -0.345265f, -0.343082f, -0.340057f, -0.335871f, -0.330643f, -0.324295f, -0.316590f, -0.307660f, -0.297736f, -0.286624f, -0.274141f, -0.260611f, -0.246376f, -0.231487f, -0.216324f, -0.201731f, -0.188250f, -0.176027f, -0.165469f, -0.156991f, -0.150296f, -0.144906f, -0.140952f, -0.138536f, -0.137112f, -0.136366f, -0.136669f, -0.137907f, -0.139122f, -0.139867f, -0.140476f, -0.140741f, -0.139998f, -0.138538f, -0.137285f, -0.136389f, -0.135636f, -0.135341f, -0.135341f, -0.134436f, -0.132129f, -0.129168f, -0.125552f, -0.120298f, -0.113600f, -0.106478f, -0.098431f, -0.088467f, -0.077617f, -0.067238f, -0.056573f, -0.045203f, -0.035126f, -0.027288f, -0.019916f, -0.012845f, -0.008413f, -0.006290f, -0.003787f, -0.001744f, -0.002475f, -0.003553f, + -0.002665f, -0.004018f, -0.009329f, -0.011340f, -0.008882f, -0.013592f, -0.026133f, -0.028495f, -0.020197f, -0.028759f, -0.055232f, -0.055789f, -0.023439f, -0.031660f, -0.124564f, -0.217122f, -0.200917f, -0.107754f, -0.056107f, -0.066073f, -0.058846f, -0.027906f, -0.061373f, -0.169830f, -0.234929f, -0.183494f, -0.092827f, -0.059029f, -0.063888f, -0.041976f, 0.009389f, 0.060627f, 0.114330f, 0.163356f, 0.148189f, 0.037885f, -0.089951f, -0.129600f, -0.082891f, -0.043468f, -0.059765f, -0.084990f, -0.070715f, -0.045983f, -0.067518f, -0.125030f, -0.140466f, -0.062947f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]={ + { + {1.009979f, 0.777112f, 0.414923f, 0.057622f, -0.211538f, -0.386004f, -0.499848f, -0.577684f, -0.616265f, -0.600367f, -0.524501f, -0.398947f, -0.242372f, -0.073587f, 0.091690f, 0.241505f, 0.368831f, 0.472616f, 0.556219f, 0.623114f, 0.673631f, 0.706309f, 0.722082f, 0.725502f, 0.721116f, 0.709865f, 0.690241f, 0.662164f, 0.628264f, 0.591665f, 0.554026f, 0.516064f, 0.478714f, 0.442859f, 0.408459f, 0.374798f, 0.341619f, 0.309511f, 0.279115f, 0.250331f, 0.222462f, 0.194888f, 0.167394f, 0.140026f, 0.112906f, 0.086220f, 0.060166f, 0.034831f, 0.010148f, -0.013999f, -0.037628f, -0.060633f, -0.082892f, -0.104342f, -0.124944f, -0.144600f, -0.163218f, -0.180856f, -0.197673f, -0.213722f, -0.228947f, -0.243382f, -0.257175f, -0.270358f, -0.282781f, -0.294366f, -0.305254f, -0.315630f, -0.325566f, -0.335147f, -0.344568f, -0.353990f, -0.363436f, -0.372929f, -0.382614f, -0.392659f, -0.403132f, -0.414084f, -0.425629f, -0.437840f, -0.450624f, -0.463808f, -0.477282f, -0.490945f, -0.504537f, -0.517665f, -0.530059f, -0.541752f, -0.552944f, -0.563732f, -0.574004f, -0.583524f, -0.592061f, -0.599512f, -0.605962f, -0.611610f, + -0.616618f, -0.621070f, -0.625065f, -0.628734f, -0.632150f, -0.635359f, -0.638542f, -0.641977f, -0.645810f, -0.649971f, -0.654375f, -0.659108f, -0.664378f, -0.670346f, -0.676981f, -0.683983f, -0.690928f, -0.697577f, -0.703957f, -0.710141f, -0.716086f, -0.721769f, -0.727253f, -0.732564f, -0.737680f, -0.742698f, -0.747770f, -0.752853f, -0.757757f, -0.762422f, -0.766902f, -0.771169f, -0.775186f, -0.779046f, -0.782792f, -0.786271f, -0.789448f, -0.792589f, -0.795895f, -0.799306f, -0.802854f, -0.806744f, -0.810903f, -0.815048f, -0.819301f, -0.824043f, -0.829159f, -0.834320f, -0.839804f, -0.845960f, -0.852309f, -0.858549f, -0.865591f, -0.873918f, -0.882709f, -0.892835f, -0.906137f, -0.914609f, -0.894289f, -0.824242f, -0.716694f, -0.616066f, -0.558379f, -0.540483f}, + {1.009979f, 0.777112f, 0.414923f, 0.057622f, -0.211538f, -0.386004f, -0.499848f, -0.577684f, -0.616265f, -0.600367f, -0.524501f, -0.398947f, -0.242372f, -0.073587f, 0.091690f, 0.241505f, 0.368831f, 0.472616f, 0.556219f, 0.623114f, 0.673631f, 0.706309f, 0.722082f, 0.725502f, 0.721116f, 0.709865f, 0.690241f, 0.662164f, 0.628264f, 0.591665f, 0.554026f, 0.516064f, 0.478714f, 0.442859f, 0.408459f, 0.374798f, 0.341619f, 0.309511f, 0.279115f, 0.250331f, 0.222462f, 0.194888f, 0.167394f, 0.140026f, 0.112906f, 0.086220f, 0.060166f, 0.034831f, 0.010148f, -0.013999f, -0.037628f, -0.060633f, -0.082892f, -0.104342f, -0.124944f, -0.144600f, -0.163218f, -0.180856f, -0.197673f, -0.213722f, -0.228947f, -0.243382f, -0.257175f, -0.270358f, -0.282781f, -0.294366f, -0.305254f, -0.315630f, -0.325566f, -0.335147f, -0.344568f, -0.353990f, -0.363436f, -0.372929f, -0.382614f, -0.392659f, -0.403132f, -0.414084f, -0.425629f, -0.437840f, -0.450624f, -0.463808f, -0.477282f, -0.490945f, -0.504537f, -0.517665f, -0.530059f, -0.541752f, -0.552944f, -0.563732f, -0.574004f, -0.583524f, -0.592061f, -0.599512f, -0.605962f, -0.611610f, + -0.616618f, -0.621070f, -0.625065f, -0.628734f, -0.632150f, -0.635359f, -0.638542f, -0.641977f, -0.645810f, -0.649971f, -0.654375f, -0.659108f, -0.664378f, -0.670346f, -0.676981f, -0.683983f, -0.690928f, -0.697577f, -0.703957f, -0.710141f, -0.716086f, -0.721769f, -0.727253f, -0.732564f, -0.737680f, -0.742698f, -0.747770f, -0.752853f, -0.757757f, -0.762422f, -0.766902f, -0.771169f, -0.775186f, -0.779046f, -0.782792f, -0.786271f, -0.789448f, -0.792589f, -0.795895f, -0.799306f, -0.802854f, -0.806744f, -0.810903f, -0.815048f, -0.819301f, -0.824043f, -0.829159f, -0.834320f, -0.839804f, -0.845960f, -0.852309f, -0.858549f, -0.865591f, -0.873918f, -0.882709f, -0.892835f, -0.906137f, -0.914609f, -0.894289f, -0.824242f, -0.716694f, -0.616066f, -0.558379f, -0.540483f} + }, + { + {0.126193f, 0.409379f, 0.770915f, 0.941927f, 0.770060f, 0.305875f, -0.262088f, -0.749508f, -1.068164f, -1.217448f, -1.229991f, -1.138532f, -0.972214f, -0.757355f, -0.514633f, -0.259993f, -0.008395f, 0.226177f, 0.433546f, 0.608821f, 0.752615f, 0.870118f, 0.967021f, 1.044852f, 1.101784f, 1.138051f, 1.158261f, 1.168128f, 1.171126f, 1.168620f, 1.161027f, 1.148005f, 1.129009f, 1.104516f, 1.076132f, 1.045356f, 1.012656f, 0.977512f, 0.938926f, 0.896304f, 0.850314f, 0.802692f, 0.754998f, 0.707919f, 0.661694f, 0.616510f, 0.572388f, 0.529305f, 0.487590f, 0.447788f, 0.410045f, 0.373936f, 0.338864f, 0.304430f, 0.270631f, 0.237903f, 0.206810f, 0.177634f, 0.150497f, 0.125709f, 0.103489f, 0.083471f, 0.065037f, 0.048044f, 0.032597f, 0.018295f, 0.004431f, -0.009163f, -0.022189f, -0.034707f, -0.047174f, -0.059713f, -0.072094f, -0.084452f, -0.097346f, -0.111038f, -0.125310f, -0.140074f, -0.155621f, -0.172102f, -0.189235f, -0.206705f, -0.224555f, -0.242985f, -0.261989f, -0.281321f, -0.300697f, -0.319952f, -0.339143f, -0.358700f, -0.379378f, -0.401765f, -0.425720f, -0.450446f, -0.475248f, -0.500046f, + -0.525001f, -0.549812f, -0.573628f, -0.595576f, -0.615206f, -0.632568f, -0.647989f, -0.661616f, -0.673019f, -0.681460f, -0.686704f, -0.689348f, -0.690254f, -0.689954f, -0.688764f, -0.687137f, -0.685645f, -0.684742f, -0.684652f, -0.685353f, -0.686715f, -0.688850f, -0.692213f, -0.697136f, -0.703389f, -0.710382f, -0.717558f, -0.724449f, -0.730762f, -0.736643f, -0.742509f, -0.748462f, -0.754275f, -0.759964f, -0.765773f, -0.771574f, -0.776977f, -0.781995f, -0.786951f, -0.791913f, -0.796914f, -0.802402f, -0.808694f, -0.815443f, -0.822369f, -0.829834f, -0.838049f, -0.846765f, -0.856294f, -0.867454f, -0.880120f, -0.893624f, -0.908541f, -0.925665f, -0.944278f, -0.965081f, -0.991098f, -1.015883f, -1.012611f, -0.952141f, -0.840918f, -0.727278f, -0.656859f, -0.632381f}, + {-0.126193f, -0.409379f, -0.770915f, -0.941927f, -0.770060f, -0.305875f, 0.262088f, 0.749508f, 1.068164f, 1.217448f, 1.229991f, 1.138532f, 0.972214f, 0.757355f, 0.514633f, 0.259993f, 0.008395f, -0.226177f, -0.433546f, -0.608821f, -0.752615f, -0.870118f, -0.967021f, -1.044852f, -1.101784f, -1.138051f, -1.158261f, -1.168128f, -1.171126f, -1.168620f, -1.161027f, -1.148005f, -1.129009f, -1.104516f, -1.076132f, -1.045356f, -1.012656f, -0.977512f, -0.938926f, -0.896304f, -0.850314f, -0.802692f, -0.754998f, -0.707919f, -0.661694f, -0.616510f, -0.572388f, -0.529305f, -0.487590f, -0.447788f, -0.410045f, -0.373936f, -0.338864f, -0.304430f, -0.270631f, -0.237903f, -0.206810f, -0.177634f, -0.150497f, -0.125709f, -0.103489f, -0.083471f, -0.065037f, -0.048044f, -0.032597f, -0.018295f, -0.004431f, 0.009163f, 0.022189f, 0.034707f, 0.047174f, 0.059713f, 0.072094f, 0.084452f, 0.097346f, 0.111038f, 0.125310f, 0.140074f, 0.155621f, 0.172102f, 0.189235f, 0.206705f, 0.224555f, 0.242985f, 0.261989f, 0.281321f, 0.300697f, 0.319952f, 0.339143f, 0.358700f, 0.379378f, 0.401765f, 0.425720f, 0.450446f, 0.475248f, 0.500046f, + 0.525001f, 0.549812f, 0.573628f, 0.595576f, 0.615206f, 0.632568f, 0.647989f, 0.661616f, 0.673019f, 0.681460f, 0.686704f, 0.689348f, 0.690254f, 0.689954f, 0.688764f, 0.687137f, 0.685645f, 0.684742f, 0.684652f, 0.685353f, 0.686715f, 0.688850f, 0.692213f, 0.697136f, 0.703389f, 0.710382f, 0.717558f, 0.724449f, 0.730762f, 0.736643f, 0.742509f, 0.748462f, 0.754275f, 0.759964f, 0.765773f, 0.771574f, 0.776977f, 0.781995f, 0.786951f, 0.791913f, 0.796914f, 0.802402f, 0.808694f, 0.815443f, 0.822369f, 0.829834f, 0.838049f, 0.846765f, 0.856294f, 0.867454f, 0.880120f, 0.893624f, 0.908541f, 0.925665f, 0.944278f, 0.965081f, 0.991098f, 1.015883f, 1.012611f, 0.952141f, 0.840918f, 0.727278f, 0.656859f, 0.632381f} + }, + { + {0.100473f, 0.081403f, 0.008408f, -0.096160f, -0.142910f, -0.086957f, 0.009676f, 0.059490f, 0.045841f, 0.005967f, -0.036022f, -0.074745f, -0.093081f, -0.074850f, -0.037707f, -0.016301f, -0.015759f, -0.009186f, 0.021343f, 0.065496f, 0.106277f, 0.139333f, 0.165707f, 0.180998f, 0.180229f, 0.166656f, 0.149972f, 0.137718f, 0.130014f, 0.121165f, 0.105833f, 0.084123f, 0.060463f, 0.038655f, 0.020340f, 0.007598f, 0.003439f, 0.008540f, 0.019735f, 0.032727f, 0.044961f, 0.055618f, 0.064410f, 0.071075f, 0.075329f, 0.076972f, 0.076175f, 0.073282f, 0.067999f, 0.059179f, 0.045627f, 0.026803f, 0.002818f, -0.025852f, -0.058657f, -0.095222f, -0.135136f, -0.177554f, -0.221503f, -0.266485f, -0.312117f, -0.357344f, -0.400888f, -0.442195f, -0.480948f, -0.515968f, -0.545732f, -0.569651f, -0.587751f, -0.599520f, -0.604194f, -0.601692f, -0.592207f, -0.575564f, -0.552090f, -0.523307f, -0.490573f, -0.453940f, -0.413752f, -0.372396f, -0.332738f, -0.295372f, -0.259306f, -0.225175f, -0.195768f, -0.172732f, -0.154358f, -0.137922f, -0.123460f, -0.113695f, -0.110203f, -0.111037f, -0.112826f, -0.114219f, -0.116218f, -0.119819f, + -0.124632f, -0.129608f, -0.133861f, -0.136539f, -0.136862f, -0.134717f, -0.130731f, -0.125401f, -0.118326f, -0.108409f, -0.094822f, -0.077996f, -0.059675f, -0.041714f, -0.024804f, -0.008597f, 0.007173f, 0.022215f, 0.036085f, 0.048349f, 0.058347f, 0.065338f, 0.068946f, 0.069169f, 0.066144f, 0.060186f, 0.051779f, 0.041215f, 0.028539f, 0.014060f, -0.001423f, -0.017088f, -0.032440f, -0.047116f, -0.060725f, -0.072923f, -0.083344f, -0.091603f, -0.097740f, -0.102516f, -0.106948f, -0.111785f, -0.117487f, -0.124080f, -0.130710f, -0.136046f, -0.139531f, -0.141637f, -0.142666f, -0.142187f, -0.140003f, -0.136622f, -0.132265f, -0.126492f, -0.119386f, -0.111731f, -0.102678f, -0.088388f, -0.065422f, -0.036215f, -0.009683f, 0.005414f, 0.008111f, 0.005632f}, + {0.100473f, 0.081403f, 0.008408f, -0.096160f, -0.142910f, -0.086957f, 0.009676f, 0.059490f, 0.045841f, 0.005967f, -0.036022f, -0.074745f, -0.093081f, -0.074850f, -0.037707f, -0.016301f, -0.015759f, -0.009186f, 0.021343f, 0.065496f, 0.106277f, 0.139333f, 0.165707f, 0.180998f, 0.180229f, 0.166656f, 0.149972f, 0.137718f, 0.130014f, 0.121165f, 0.105833f, 0.084123f, 0.060463f, 0.038655f, 0.020340f, 0.007598f, 0.003439f, 0.008540f, 0.019735f, 0.032727f, 0.044961f, 0.055618f, 0.064410f, 0.071075f, 0.075329f, 0.076972f, 0.076175f, 0.073282f, 0.067999f, 0.059179f, 0.045627f, 0.026803f, 0.002818f, -0.025852f, -0.058657f, -0.095222f, -0.135136f, -0.177554f, -0.221503f, -0.266485f, -0.312117f, -0.357344f, -0.400888f, -0.442195f, -0.480948f, -0.515968f, -0.545732f, -0.569651f, -0.587751f, -0.599520f, -0.604194f, -0.601692f, -0.592207f, -0.575564f, -0.552090f, -0.523307f, -0.490573f, -0.453940f, -0.413752f, -0.372396f, -0.332738f, -0.295372f, -0.259306f, -0.225175f, -0.195768f, -0.172732f, -0.154358f, -0.137922f, -0.123460f, -0.113695f, -0.110203f, -0.111037f, -0.112826f, -0.114219f, -0.116218f, -0.119819f, + -0.124632f, -0.129608f, -0.133861f, -0.136539f, -0.136862f, -0.134717f, -0.130731f, -0.125401f, -0.118326f, -0.108409f, -0.094822f, -0.077996f, -0.059675f, -0.041714f, -0.024804f, -0.008597f, 0.007173f, 0.022215f, 0.036085f, 0.048349f, 0.058347f, 0.065338f, 0.068946f, 0.069169f, 0.066144f, 0.060186f, 0.051779f, 0.041215f, 0.028539f, 0.014060f, -0.001423f, -0.017088f, -0.032440f, -0.047116f, -0.060725f, -0.072923f, -0.083344f, -0.091603f, -0.097740f, -0.102516f, -0.106948f, -0.111785f, -0.117487f, -0.124080f, -0.130710f, -0.136046f, -0.139531f, -0.141637f, -0.142666f, -0.142187f, -0.140003f, -0.136622f, -0.132265f, -0.126492f, -0.119386f, -0.111731f, -0.102678f, -0.088388f, -0.065422f, -0.036215f, -0.009683f, 0.005414f, 0.008111f, 0.005632f} + }, + { + {0.084126f, 0.110632f, 0.109927f, 0.052485f, -0.019287f, -0.038848f, 0.005122f, 0.057928f, 0.061429f, 0.008547f, -0.063703f, -0.116047f, -0.133935f, -0.126590f, -0.112671f, -0.104392f, -0.098006f, -0.079140f, -0.038844f, 0.018165f, 0.081196f, 0.143237f, 0.200149f, 0.247159f, 0.282929f, 0.314126f, 0.349526f, 0.390018f, 0.428654f, 0.459758f, 0.483418f, 0.500784f, 0.509421f, 0.505506f, 0.488086f, 0.458967f, 0.419791f, 0.371480f, 0.316363f, 0.259016f, 0.204186f, 0.154396f, 0.109872f, 0.070078f, 0.034584f, 0.002707f, -0.026736f, -0.054704f, -0.081058f, -0.104625f, -0.124002f, -0.138182f, -0.146792f, -0.150463f, -0.151151f, -0.151495f, -0.153367f, -0.157201f, -0.162792f, -0.170016f, -0.178380f, -0.186711f, -0.194159f, -0.201018f, -0.207832f, -0.214370f, -0.220282f, -0.225993f, -0.231839f, -0.237070f, -0.240921f, -0.243936f, -0.246870f, -0.248962f, -0.248825f, -0.246404f, -0.242360f, -0.236067f, -0.226121f, -0.212667f, -0.197275f, -0.180428f, -0.161038f, -0.138916f, -0.116002f, -0.094379f, -0.074355f, -0.055230f, -0.036702f, -0.018555f, 0.000018f, 0.019490f, 0.038874f, 0.056640f, 0.072553f, 0.087565f, + 0.101794f, 0.113622f, 0.121301f, 0.124936f, 0.126283f, 0.126618f, 0.125103f, 0.119406f, 0.107998f, 0.091827f, 0.073557f, 0.055064f, 0.035918f, 0.014525f, -0.009510f, -0.034439f, -0.057660f, -0.077747f, -0.095384f, -0.112527f, -0.130553f, -0.149032f, -0.166196f, -0.180522f, -0.191817f, -0.201118f, -0.209934f, -0.219423f, -0.229793f, -0.240368f, -0.250415f, -0.259888f, -0.269297f, -0.279146f, -0.289735f, -0.301233f, -0.313608f, -0.326568f, -0.339762f, -0.352968f, -0.366026f, -0.378749f, -0.390962f, -0.402499f, -0.413143f, -0.422598f, -0.430524f, -0.436635f, -0.440820f, -0.443116f, -0.443609f, -0.442643f, -0.440995f, -0.439351f, -0.437985f, -0.437691f, -0.439475f, -0.440249f, -0.429869f, -0.398587f, -0.350485f, -0.304484f, -0.277094f, -0.267957f}, + {0.084126f, 0.110632f, 0.109927f, 0.052485f, -0.019287f, -0.038848f, 0.005122f, 0.057928f, 0.061429f, 0.008547f, -0.063703f, -0.116047f, -0.133935f, -0.126590f, -0.112671f, -0.104392f, -0.098006f, -0.079140f, -0.038844f, 0.018165f, 0.081196f, 0.143237f, 0.200149f, 0.247159f, 0.282929f, 0.314126f, 0.349526f, 0.390018f, 0.428654f, 0.459758f, 0.483418f, 0.500784f, 0.509421f, 0.505506f, 0.488086f, 0.458967f, 0.419791f, 0.371480f, 0.316363f, 0.259016f, 0.204186f, 0.154396f, 0.109872f, 0.070078f, 0.034584f, 0.002707f, -0.026736f, -0.054704f, -0.081058f, -0.104625f, -0.124002f, -0.138182f, -0.146792f, -0.150463f, -0.151151f, -0.151495f, -0.153367f, -0.157201f, -0.162792f, -0.170016f, -0.178380f, -0.186711f, -0.194159f, -0.201018f, -0.207832f, -0.214370f, -0.220282f, -0.225993f, -0.231839f, -0.237070f, -0.240921f, -0.243936f, -0.246870f, -0.248962f, -0.248825f, -0.246404f, -0.242360f, -0.236067f, -0.226121f, -0.212667f, -0.197275f, -0.180428f, -0.161038f, -0.138916f, -0.116002f, -0.094379f, -0.074355f, -0.055230f, -0.036702f, -0.018555f, 0.000018f, 0.019490f, 0.038874f, 0.056640f, 0.072553f, 0.087565f, + 0.101794f, 0.113622f, 0.121301f, 0.124936f, 0.126283f, 0.126618f, 0.125103f, 0.119406f, 0.107998f, 0.091827f, 0.073557f, 0.055064f, 0.035918f, 0.014525f, -0.009510f, -0.034439f, -0.057660f, -0.077747f, -0.095384f, -0.112527f, -0.130553f, -0.149032f, -0.166196f, -0.180522f, -0.191817f, -0.201118f, -0.209934f, -0.219423f, -0.229793f, -0.240368f, -0.250415f, -0.259888f, -0.269297f, -0.279146f, -0.289735f, -0.301233f, -0.313608f, -0.326568f, -0.339762f, -0.352968f, -0.366026f, -0.378749f, -0.390962f, -0.402499f, -0.413143f, -0.422598f, -0.430524f, -0.436635f, -0.440820f, -0.443116f, -0.443609f, -0.442643f, -0.440995f, -0.439351f, -0.437985f, -0.437691f, -0.439475f, -0.440249f, -0.429869f, -0.398587f, -0.350485f, -0.304484f, -0.277094f, -0.267957f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]={ + { + {-0.232358f, -0.618932f, -0.817988f, -0.822429f, -0.704120f, -0.543614f, -0.378833f, -0.206926f, -0.018121f, 0.180000f, 0.364897f, 0.514426f, 0.616459f, 0.668682f, 0.675051f, 0.643723f, 0.585693f, 0.511949f, 0.429816f, 0.341780f, 0.248555f, 0.153155f, 0.060910f, -0.024611f, -0.104107f, -0.179953f, -0.252112f, -0.317896f, -0.375138f, -0.424053f, -0.465990f, -0.501801f, -0.532062f, -0.557932f, -0.580799f, -0.601232f, -0.618935f, -0.633778f, -0.646448f, -0.657961f, -0.668856f, -0.679034f, -0.688176f, -0.696064f, -0.702581f, -0.707694f, -0.711504f, -0.714221f, -0.716020f, -0.716930f, -0.716876f, -0.715816f, -0.713811f, -0.710965f, -0.707339f, -0.703007f, -0.698153f, -0.693006f, -0.687652f, -0.682057f, -0.676269f, -0.670441f, -0.664614f, -0.658690f, -0.652674f, -0.646792f, -0.641260f, -0.636117f, -0.631369f, -0.627101f, -0.623357f, -0.620039f, -0.617052f, -0.614426f, -0.612191f, -0.610248f, -0.608457f, -0.606735f, -0.604964f, -0.602902f, -0.600284f, -0.596973f, -0.592896f, -0.587908f, -0.581839f, -0.574727f, -0.566872f, -0.558610f, -0.550047f, -0.541068f, -0.531535f, -0.521448f, -0.510981f, -0.500437f, -0.490122f, -0.480207f, + -0.470732f, -0.461729f, -0.453265f, -0.445358f, -0.437994f, -0.431236f, -0.425185f, -0.419778f, -0.414766f, -0.409960f, -0.405367f, -0.401056f, -0.396961f, -0.392823f, -0.388266f, -0.382991f, -0.376987f, -0.370509f, -0.363780f, -0.356832f, -0.349674f, -0.342400f, -0.335071f, -0.327671f, -0.320250f, -0.312889f, -0.305495f, -0.297875f, -0.290005f, -0.282015f, -0.273947f, -0.265780f, -0.257599f, -0.249466f, -0.241282f, -0.233043f, -0.224988f, -0.217256f, -0.209671f, -0.202109f, -0.194641f, -0.187154f, -0.179346f, -0.171265f, -0.163191f, -0.154940f, -0.146069f, -0.136661f, -0.126931f, -0.116365f, -0.104453f, -0.091629f, -0.077926f, -0.061879f, -0.042494f, -0.019328f, 0.013280f, 0.066673f, 0.141327f, 0.209865f, 0.231108f, 0.189731f, 0.112424f, 0.035208f}, + {-0.232358f, -0.618932f, -0.817988f, -0.822429f, -0.704120f, -0.543614f, -0.378833f, -0.206926f, -0.018121f, 0.180000f, 0.364897f, 0.514426f, 0.616459f, 0.668682f, 0.675051f, 0.643723f, 0.585693f, 0.511949f, 0.429816f, 0.341780f, 0.248555f, 0.153155f, 0.060910f, -0.024611f, -0.104107f, -0.179953f, -0.252112f, -0.317896f, -0.375138f, -0.424053f, -0.465990f, -0.501801f, -0.532062f, -0.557932f, -0.580799f, -0.601232f, -0.618935f, -0.633778f, -0.646448f, -0.657961f, -0.668856f, -0.679034f, -0.688176f, -0.696064f, -0.702581f, -0.707694f, -0.711504f, -0.714221f, -0.716020f, -0.716930f, -0.716876f, -0.715816f, -0.713811f, -0.710965f, -0.707339f, -0.703007f, -0.698153f, -0.693006f, -0.687652f, -0.682057f, -0.676269f, -0.670441f, -0.664614f, -0.658690f, -0.652674f, -0.646792f, -0.641260f, -0.636117f, -0.631369f, -0.627101f, -0.623357f, -0.620039f, -0.617052f, -0.614426f, -0.612191f, -0.610248f, -0.608457f, -0.606735f, -0.604964f, -0.602902f, -0.600284f, -0.596973f, -0.592896f, -0.587908f, -0.581839f, -0.574727f, -0.566872f, -0.558610f, -0.550047f, -0.541068f, -0.531535f, -0.521448f, -0.510981f, -0.500437f, -0.490122f, -0.480207f, + -0.470732f, -0.461729f, -0.453265f, -0.445358f, -0.437994f, -0.431236f, -0.425185f, -0.419778f, -0.414766f, -0.409960f, -0.405367f, -0.401056f, -0.396961f, -0.392823f, -0.388266f, -0.382991f, -0.376987f, -0.370509f, -0.363780f, -0.356832f, -0.349674f, -0.342400f, -0.335071f, -0.327671f, -0.320250f, -0.312889f, -0.305495f, -0.297875f, -0.290005f, -0.282015f, -0.273947f, -0.265780f, -0.257599f, -0.249466f, -0.241282f, -0.233043f, -0.224988f, -0.217256f, -0.209671f, -0.202109f, -0.194641f, -0.187154f, -0.179346f, -0.171265f, -0.163191f, -0.154940f, -0.146069f, -0.136661f, -0.126931f, -0.116365f, -0.104453f, -0.091629f, -0.077926f, -0.061879f, -0.042494f, -0.019328f, 0.013280f, 0.066673f, 0.141327f, 0.209865f, 0.231108f, 0.189731f, 0.112424f, 0.035208f} + }, + { + {0.140725f, 0.285846f, 0.114832f, -0.338829f, -0.858853f, -1.200757f, -1.243681f, -1.024467f, -0.658777f, -0.249357f, 0.145208f, 0.495328f, 0.784769f, 1.007322f, 1.163699f, 1.256377f, 1.289073f, 1.269367f, 1.208734f, 1.120266f, 1.016312f, 0.905408f, 0.790167f, 0.670170f, 0.547622f, 0.428343f, 0.317200f, 0.214919f, 0.119693f, 0.029734f, -0.056227f, -0.138879f, -0.217755f, -0.291611f, -0.359863f, -0.423205f, -0.482880f, -0.539767f, -0.593809f, -0.643836f, -0.688282f, -0.726462f, -0.758927f, -0.786612f, -0.810154f, -0.830039f, -0.846690f, -0.860232f, -0.870666f, -0.878418f, -0.884314f, -0.889009f, -0.892646f, -0.894952f, -0.895464f, -0.893873f, -0.890318f, -0.885190f, -0.878745f, -0.871264f, -0.863433f, -0.855991f, -0.849090f, -0.842574f, -0.836712f, -0.831995f, -0.828338f, -0.825230f, -0.822595f, -0.820794f, -0.819852f, -0.819422f, -0.819501f, -0.820450f, -0.822267f, -0.824464f, -0.826748f, -0.829242f, -0.831935f, -0.834417f, -0.836352f, -0.837828f, -0.839046f, -0.839930f, -0.840203f, -0.839703f, -0.838501f, -0.836856f, -0.835153f, -0.833735f, -0.832516f, -0.830749f, -0.827395f, -0.821885f, -0.814387f, -0.805210f, + -0.794148f, -0.780636f, -0.764422f, -0.745876f, -0.725740f, -0.704713f, -0.683108f, -0.660784f, -0.637569f, -0.613932f, -0.590994f, -0.569749f, -0.550511f, -0.533220f, -0.517926f, -0.504746f, -0.493587f, -0.484110f, -0.475879f, -0.468521f, -0.461919f, -0.456181f, -0.451182f, -0.446293f, -0.440761f, -0.434205f, -0.426610f, -0.418162f, -0.409301f, -0.400521f, -0.391893f, -0.383127f, -0.374182f, -0.365278f, -0.356340f, -0.347069f, -0.337579f, -0.328306f, -0.319353f, -0.310619f, -0.302285f, -0.294430f, -0.286564f, -0.278288f, -0.269879f, -0.261530f, -0.252867f, -0.243819f, -0.234732f, -0.225124f, -0.213896f, -0.200946f, -0.186484f, -0.169123f, -0.147421f, -0.120998f, -0.084260f, -0.023064f, 0.068036f, 0.162002f, 0.209461f, 0.185183f, 0.113708f, 0.036109f}, + {-0.140725f, -0.285846f, -0.114832f, 0.338829f, 0.858853f, 1.200757f, 1.243681f, 1.024467f, 0.658777f, 0.249357f, -0.145208f, -0.495328f, -0.784769f, -1.007322f, -1.163699f, -1.256377f, -1.289073f, -1.269367f, -1.208734f, -1.120266f, -1.016312f, -0.905408f, -0.790167f, -0.670170f, -0.547622f, -0.428343f, -0.317200f, -0.214919f, -0.119693f, -0.029734f, 0.056227f, 0.138879f, 0.217755f, 0.291611f, 0.359863f, 0.423205f, 0.482880f, 0.539767f, 0.593809f, 0.643836f, 0.688282f, 0.726462f, 0.758927f, 0.786612f, 0.810154f, 0.830039f, 0.846690f, 0.860232f, 0.870666f, 0.878418f, 0.884314f, 0.889009f, 0.892646f, 0.894952f, 0.895464f, 0.893873f, 0.890318f, 0.885190f, 0.878745f, 0.871264f, 0.863433f, 0.855991f, 0.849090f, 0.842574f, 0.836712f, 0.831995f, 0.828338f, 0.825230f, 0.822595f, 0.820794f, 0.819852f, 0.819422f, 0.819501f, 0.820450f, 0.822267f, 0.824464f, 0.826748f, 0.829242f, 0.831935f, 0.834417f, 0.836352f, 0.837828f, 0.839046f, 0.839930f, 0.840203f, 0.839703f, 0.838501f, 0.836856f, 0.835153f, 0.833735f, 0.832516f, 0.830749f, 0.827395f, 0.821885f, 0.814387f, 0.805210f, + 0.794148f, 0.780636f, 0.764422f, 0.745876f, 0.725740f, 0.704713f, 0.683108f, 0.660784f, 0.637569f, 0.613932f, 0.590994f, 0.569749f, 0.550511f, 0.533220f, 0.517926f, 0.504746f, 0.493587f, 0.484110f, 0.475879f, 0.468521f, 0.461919f, 0.456181f, 0.451182f, 0.446293f, 0.440761f, 0.434205f, 0.426610f, 0.418162f, 0.409301f, 0.400521f, 0.391893f, 0.383127f, 0.374182f, 0.365278f, 0.356340f, 0.347069f, 0.337579f, 0.328306f, 0.319353f, 0.310619f, 0.302285f, 0.294430f, 0.286564f, 0.278288f, 0.269879f, 0.261530f, 0.252867f, 0.243819f, 0.234732f, 0.225124f, 0.213896f, 0.200946f, 0.186484f, 0.169123f, 0.147421f, 0.120998f, 0.084260f, 0.023064f, -0.068036f, -0.162002f, -0.209461f, -0.185183f, -0.113708f, -0.036109f} + }, + { + {-0.025748f, -0.088043f, -0.139476f, -0.115197f, -0.011193f, 0.082969f, 0.088942f, 0.026588f, -0.034225f, -0.061322f, -0.062307f, -0.039701f, 0.006935f, 0.053627f, 0.070634f, 0.063527f, 0.064625f, 0.086525f, 0.109466f, 0.113177f, 0.098256f, 0.073370f, 0.040304f, -0.000903f, -0.043184f, -0.076634f, -0.097864f, -0.111901f, -0.126411f, -0.144854f, -0.164041f, -0.178000f, -0.183770f, -0.182295f, -0.174892f, -0.162161f, -0.146640f, -0.133405f, -0.126594f, -0.126862f, -0.132675f, -0.142567f, -0.155716f, -0.171595f, -0.189741f, -0.209590f, -0.230631f, -0.252944f, -0.277113f, -0.303296f, -0.330673f, -0.357881f, -0.383611f, -0.406858f, -0.426972f, -0.443418f, -0.455456f, -0.462382f, -0.464036f, -0.460461f, -0.451211f, -0.435760f, -0.414371f, -0.387638f, -0.355468f, -0.317605f, -0.274841f, -0.228581f, -0.179590f, -0.128261f, -0.075652f, -0.023161f, 0.028274f, 0.077590f, 0.123014f, 0.163229f, 0.198282f, 0.228110f, 0.251149f, 0.266010f, 0.273735f, 0.276588f, 0.274993f, 0.267638f, 0.254778f, 0.239529f, 0.224852f, 0.210436f, 0.194008f, 0.175358f, 0.157564f, 0.143811f, 0.134209f, 0.126617f, 0.119747f, 0.114269f, + 0.111331f, 0.111312f, 0.114089f, 0.119358f, 0.126337f, 0.133893f, 0.141375f, 0.149029f, 0.157354f, 0.166105f, 0.173888f, 0.178773f, 0.179595f, 0.176738f, 0.171416f, 0.164301f, 0.155212f, 0.143845f, 0.130161f, 0.114157f, 0.095909f, 0.075932f, 0.055076f, 0.034130f, 0.013765f, -0.005393f, -0.022978f, -0.038882f, -0.052804f, -0.064120f, -0.072409f, -0.077779f, -0.080530f, -0.080874f, -0.079051f, -0.075375f, -0.070202f, -0.064178f, -0.058307f, -0.053393f, -0.049529f, -0.046287f, -0.042980f, -0.038600f, -0.032246f, -0.024048f, -0.015064f, -0.005957f, 0.003498f, 0.013364f, 0.023023f, 0.032130f, 0.041053f, 0.049833f, 0.057916f, 0.065747f, 0.075176f, 0.086297f, 0.094235f, 0.091380f, 0.074398f, 0.048616f, 0.024108f, 0.006730f}, + {-0.025748f, -0.088043f, -0.139476f, -0.115197f, -0.011193f, 0.082969f, 0.088942f, 0.026588f, -0.034225f, -0.061322f, -0.062307f, -0.039701f, 0.006935f, 0.053627f, 0.070634f, 0.063527f, 0.064625f, 0.086525f, 0.109466f, 0.113177f, 0.098256f, 0.073370f, 0.040304f, -0.000903f, -0.043184f, -0.076634f, -0.097864f, -0.111901f, -0.126411f, -0.144854f, -0.164041f, -0.178000f, -0.183770f, -0.182295f, -0.174892f, -0.162161f, -0.146640f, -0.133405f, -0.126594f, -0.126862f, -0.132675f, -0.142567f, -0.155716f, -0.171595f, -0.189741f, -0.209590f, -0.230631f, -0.252944f, -0.277113f, -0.303296f, -0.330673f, -0.357881f, -0.383611f, -0.406858f, -0.426972f, -0.443418f, -0.455456f, -0.462382f, -0.464036f, -0.460461f, -0.451211f, -0.435760f, -0.414371f, -0.387638f, -0.355468f, -0.317605f, -0.274841f, -0.228581f, -0.179590f, -0.128261f, -0.075652f, -0.023161f, 0.028274f, 0.077590f, 0.123014f, 0.163229f, 0.198282f, 0.228110f, 0.251149f, 0.266010f, 0.273735f, 0.276588f, 0.274993f, 0.267638f, 0.254778f, 0.239529f, 0.224852f, 0.210436f, 0.194008f, 0.175358f, 0.157564f, 0.143811f, 0.134209f, 0.126617f, 0.119747f, 0.114269f, + 0.111331f, 0.111312f, 0.114089f, 0.119358f, 0.126337f, 0.133893f, 0.141375f, 0.149029f, 0.157354f, 0.166105f, 0.173888f, 0.178773f, 0.179595f, 0.176738f, 0.171416f, 0.164301f, 0.155212f, 0.143845f, 0.130161f, 0.114157f, 0.095909f, 0.075932f, 0.055076f, 0.034130f, 0.013765f, -0.005393f, -0.022978f, -0.038882f, -0.052804f, -0.064120f, -0.072409f, -0.077779f, -0.080530f, -0.080874f, -0.079051f, -0.075375f, -0.070202f, -0.064178f, -0.058307f, -0.053393f, -0.049529f, -0.046287f, -0.042980f, -0.038600f, -0.032246f, -0.024048f, -0.015064f, -0.005957f, 0.003498f, 0.013364f, 0.023023f, 0.032130f, 0.041053f, 0.049833f, 0.057916f, 0.065747f, 0.075176f, 0.086297f, 0.094235f, 0.091380f, 0.074398f, 0.048616f, 0.024108f, 0.006730f} + }, + { + {0.004469f, -0.013004f, -0.069105f, -0.111166f, -0.088832f, -0.021733f, 0.020879f, -0.001719f, -0.063420f, -0.107499f, -0.101798f, -0.054848f, 0.005100f, 0.055067f, 0.089328f, 0.118238f, 0.155712f, 0.203896f, 0.250771f, 0.283001f, 0.296634f, 0.294104f, 0.277764f, 0.251482f, 0.223398f, 0.199881f, 0.177918f, 0.148605f, 0.107643f, 0.058242f, 0.004301f, -0.054426f, -0.119079f, -0.187240f, -0.254072f, -0.316062f, -0.371526f, -0.418353f, -0.453530f, -0.475436f, -0.485529f, -0.487199f, -0.483439f, -0.475999f, -0.466072f, -0.454762f, -0.442562f, -0.428896f, -0.412688f, -0.393430f, -0.371644f, -0.348652f, -0.326306f, -0.306758f, -0.291674f, -0.281173f, -0.273835f, -0.267982f, -0.262603f, -0.256924f, -0.250004f, -0.241478f, -0.232071f, -0.222562f, -0.212764f, -0.202253f, -0.191316f, -0.180223f, -0.168324f, -0.155035f, -0.140988f, -0.126915f, -0.112130f, -0.095556f, -0.077601f, -0.059440f, -0.041038f, -0.021717f, -0.002289f, 0.015312f, 0.030501f, 0.044216f, 0.056422f, 0.065288f, 0.069528f, 0.070062f, 0.068614f, 0.065893f, 0.061937f, 0.057048f, 0.051195f, 0.043250f, 0.032044f, 0.017911f, 0.002122f, -0.015098f, + -0.034951f, -0.058147f, -0.083429f, -0.108599f, -0.132778f, -0.157148f, -0.183384f, -0.211440f, -0.238983f, -0.263177f, -0.283075f, -0.300073f, -0.315887f, -0.330370f, -0.341598f, -0.347926f, -0.349714f, -0.349134f, -0.348462f, -0.348374f, -0.347673f, -0.344642f, -0.338765f, -0.331173f, -0.323708f, -0.317734f, -0.313552f, -0.310449f, -0.307281f, -0.303381f, -0.299002f, -0.294820f, -0.291172f, -0.287927f, -0.284777f, -0.281331f, -0.277114f, -0.271760f, -0.265156f, -0.257312f, -0.248203f, -0.237804f, -0.226127f, -0.213169f, -0.198913f, -0.183401f, -0.166800f, -0.149450f, -0.131791f, -0.114224f, -0.097167f, -0.081134f, -0.066331f, -0.052328f, -0.038637f, -0.024717f, -0.007855f, 0.017147f, 0.051304f, 0.083630f, 0.096079f, 0.080803f, 0.048580f, 0.015325f}, + {0.004469f, -0.013004f, -0.069105f, -0.111166f, -0.088832f, -0.021733f, 0.020879f, -0.001719f, -0.063420f, -0.107499f, -0.101798f, -0.054848f, 0.005100f, 0.055067f, 0.089328f, 0.118238f, 0.155712f, 0.203896f, 0.250771f, 0.283001f, 0.296634f, 0.294104f, 0.277764f, 0.251482f, 0.223398f, 0.199881f, 0.177918f, 0.148605f, 0.107643f, 0.058242f, 0.004301f, -0.054426f, -0.119079f, -0.187240f, -0.254072f, -0.316062f, -0.371526f, -0.418353f, -0.453530f, -0.475436f, -0.485529f, -0.487199f, -0.483439f, -0.475999f, -0.466072f, -0.454762f, -0.442562f, -0.428896f, -0.412688f, -0.393430f, -0.371644f, -0.348652f, -0.326306f, -0.306758f, -0.291674f, -0.281173f, -0.273835f, -0.267982f, -0.262603f, -0.256924f, -0.250004f, -0.241478f, -0.232071f, -0.222562f, -0.212764f, -0.202253f, -0.191316f, -0.180223f, -0.168324f, -0.155035f, -0.140988f, -0.126915f, -0.112130f, -0.095556f, -0.077601f, -0.059440f, -0.041038f, -0.021717f, -0.002289f, 0.015312f, 0.030501f, 0.044216f, 0.056422f, 0.065288f, 0.069528f, 0.070062f, 0.068614f, 0.065893f, 0.061937f, 0.057048f, 0.051195f, 0.043250f, 0.032044f, 0.017911f, 0.002122f, -0.015098f, + -0.034951f, -0.058147f, -0.083429f, -0.108599f, -0.132778f, -0.157148f, -0.183384f, -0.211440f, -0.238983f, -0.263177f, -0.283075f, -0.300073f, -0.315887f, -0.330370f, -0.341598f, -0.347926f, -0.349714f, -0.349134f, -0.348462f, -0.348374f, -0.347673f, -0.344642f, -0.338765f, -0.331173f, -0.323708f, -0.317734f, -0.313552f, -0.310449f, -0.307281f, -0.303381f, -0.299002f, -0.294820f, -0.291172f, -0.287927f, -0.284777f, -0.281331f, -0.277114f, -0.271760f, -0.265156f, -0.257312f, -0.248203f, -0.237804f, -0.226127f, -0.213169f, -0.198913f, -0.183401f, -0.166800f, -0.149450f, -0.131791f, -0.114224f, -0.097167f, -0.081134f, -0.066331f, -0.052328f, -0.038637f, -0.024717f, -0.007855f, 0.017147f, 0.051304f, 0.083630f, 0.096079f, 0.080803f, 0.048580f, 0.015325f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]={0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]={ + { + { 1.066299f, 0.831753f, 0.469820f, 0.113997f, -0.155945f, -0.332046f, -0.445167f, -0.521969f, -0.562027f, -0.547501f, -0.470580f, -0.344643f, -0.190080f, -0.022238f, 0.144217f, 0.293618f, 0.418613f, 0.521970f, 0.606614f, 0.672232f, 0.720345f, 0.753099f, 0.769493f, 0.770796f, 0.764174f, 0.753391f, 0.733696f, 0.702773f, 0.667010f, 0.631061f, 0.592423f, 0.551074f, 0.512366f, 0.477047f, 0.440550f, 0.403206f, 0.369206f, 0.337153f, 0.303479f, 0.270983f, 0.242735f, 0.214328f, 0.182386f, 0.151528f, 0.124233f, 0.095401f, 0.063829f, 0.035419f, 0.010359f, -0.017668f, -0.047701f, -0.073299f, -0.096723f, -0.124198f, -0.151868f, -0.173748f, -0.195138f, -0.221363f, -0.245696f, -0.264016f, -0.284769f, -0.310840f, -0.332497f, -0.348925f, -0.371386f, -0.398406f, -0.417735f, -0.434354f, -0.462032f, -0.492418f, -0.512100f, -0.536134f, -0.579084f, -0.619428f, -0.648156f, -0.709398f, -0.814740f, -0.869114f, -0.792023f, -0.672661f}, + { 1.066299f, 0.831753f, 0.469820f, 0.113997f, -0.155945f, -0.332046f, -0.445167f, -0.521969f, -0.562027f, -0.547501f, -0.470580f, -0.344643f, -0.190080f, -0.022238f, 0.144217f, 0.293618f, 0.418613f, 0.521970f, 0.606614f, 0.672232f, 0.720345f, 0.753099f, 0.769493f, 0.770796f, 0.764174f, 0.753391f, 0.733696f, 0.702773f, 0.667010f, 0.631061f, 0.592423f, 0.551074f, 0.512366f, 0.477047f, 0.440550f, 0.403206f, 0.369206f, 0.337153f, 0.303479f, 0.270983f, 0.242735f, 0.214328f, 0.182386f, 0.151528f, 0.124233f, 0.095401f, 0.063829f, 0.035419f, 0.010359f, -0.017668f, -0.047701f, -0.073299f, -0.096723f, -0.124198f, -0.151868f, -0.173748f, -0.195138f, -0.221363f, -0.245696f, -0.264016f, -0.284769f, -0.310840f, -0.332497f, -0.348925f, -0.371386f, -0.398406f, -0.417735f, -0.434354f, -0.462032f, -0.492418f, -0.512100f, -0.536134f, -0.579084f, -0.619428f, -0.648156f, -0.709398f, -0.814740f, -0.869114f, -0.792023f, -0.672661f} + }, + { + { 0.198789f, 0.479449f, 0.841384f, 1.014645f, 0.841631f, 0.375013f, -0.191824f, -0.677633f, -0.998453f, -1.149750f, -1.160640f, -1.068514f, -0.905139f, -0.691625f, -0.447031f, -0.192888f, 0.055312f, 0.289339f, 0.498414f, 0.671927f, 0.812235f, 0.929986f, 1.028010f, 1.102848f, 1.156570f, 1.193717f, 1.214057f, 1.219865f, 1.220241f, 1.218942f, 1.210137f, 1.192271f, 1.171448f, 1.148056f, 1.116865f, 1.080826f, 1.047158f, 1.012474f, 0.969360f, 0.921459f, 0.875238f, 0.826839f, 0.772906f, 0.720924f, 0.674871f, 0.627049f, 0.575132f, 0.527820f, 0.486114f, 0.441193f, 0.394366f, 0.354847f, 0.318787f, 0.276146f, 0.232314f, 0.196874f, 0.162640f, 0.121555f, 0.083765f, 0.056442f, 0.027308f, -0.009054f, -0.038581f, -0.059134f, -0.087738f, -0.123968f, -0.149625f, -0.170423f, -0.207343f, -0.249859f, -0.276408f, -0.306618f, -0.365081f, -0.423301f, -0.461101f, -0.538219f, -0.693008f, -0.822733f, -0.808512f, -0.718004f}, + { -0.198789f, -0.479449f, -0.841384f, -1.014645f, -0.841631f, -0.375013f, 0.191824f, 0.677633f, 0.998453f, 1.149750f, 1.160640f, 1.068514f, 0.905139f, 0.691625f, 0.447031f, 0.192888f, -0.055312f, -0.289339f, -0.498414f, -0.671927f, -0.812235f, -0.929986f, -1.028010f, -1.102848f, -1.156570f, -1.193717f, -1.214057f, -1.219865f, -1.220241f, -1.218942f, -1.210137f, -1.192271f, -1.171448f, -1.148056f, -1.116865f, -1.080826f, -1.047158f, -1.012474f, -0.969360f, -0.921459f, -0.875238f, -0.826839f, -0.772906f, -0.720924f, -0.674871f, -0.627049f, -0.575132f, -0.527820f, -0.486114f, -0.441193f, -0.394366f, -0.354847f, -0.318787f, -0.276146f, -0.232314f, -0.196874f, -0.162640f, -0.121555f, -0.083765f, -0.056442f, -0.027308f, 0.009054f, 0.038581f, 0.059134f, 0.087738f, 0.123968f, 0.149625f, 0.170423f, 0.207343f, 0.249859f, 0.276408f, 0.306618f, 0.365081f, 0.423301f, 0.461101f, 0.538219f, 0.693008f, 0.822733f, 0.808512f, 0.718004f} + }, + { + { 0.103651f, 0.085763f, 0.012539f, -0.093163f, -0.139453f, -0.082442f, 0.013534f, 0.062431f, 0.049641f, 0.010543f, -0.032439f, -0.071721f, -0.088915f, -0.070311f, -0.034358f, -0.013054f, -0.011243f, -0.004768f, 0.024546f, 0.069095f, 0.111091f, 0.143571f, 0.168893f, 0.185054f, 0.185266f, 0.170698f, 0.153302f, 0.142305f, 0.135188f, 0.125048f, 0.109492f, 0.089281f, 0.065694f, 0.042479f, 0.024528f, 0.013336f, 0.008677f, 0.012472f, 0.024654f, 0.039032f, 0.050209f, 0.059898f, 0.070266f, 0.077933f, 0.080669f, 0.081921f, 0.083181f, 0.080706f, 0.073626f, 0.065218f, 0.054022f, 0.034879f, 0.009091f, -0.018174f, -0.048558f, -0.086265f, -0.127620f, -0.167472f, -0.209212f, -0.256149f, -0.302368f, -0.343698f, -0.385541f, -0.429466f, -0.467232f, -0.496747f, -0.525598f, -0.552414f, -0.566656f, -0.570548f, -0.575284f, -0.574945f, -0.555162f, -0.525091f, -0.502518f, -0.469417f, -0.387422f, -0.261252f, -0.144788f, -0.082088f}, + { 0.103651f, 0.085763f, 0.012539f, -0.093163f, -0.139453f, -0.082442f, 0.013534f, 0.062431f, 0.049641f, 0.010543f, -0.032439f, -0.071721f, -0.088915f, -0.070311f, -0.034358f, -0.013054f, -0.011243f, -0.004768f, 0.024546f, 0.069095f, 0.111091f, 0.143571f, 0.168893f, 0.185054f, 0.185266f, 0.170698f, 0.153302f, 0.142305f, 0.135188f, 0.125048f, 0.109492f, 0.089281f, 0.065694f, 0.042479f, 0.024528f, 0.013336f, 0.008677f, 0.012472f, 0.024654f, 0.039032f, 0.050209f, 0.059898f, 0.070266f, 0.077933f, 0.080669f, 0.081921f, 0.083181f, 0.080706f, 0.073626f, 0.065218f, 0.054022f, 0.034879f, 0.009091f, -0.018174f, -0.048558f, -0.086265f, -0.127620f, -0.167472f, -0.209212f, -0.256149f, -0.302368f, -0.343698f, -0.385541f, -0.429466f, -0.467232f, -0.496747f, -0.525598f, -0.552414f, -0.566656f, -0.570548f, -0.575284f, -0.574945f, -0.555162f, -0.525091f, -0.502518f, -0.469417f, -0.387422f, -0.261252f, -0.144788f, -0.082088f} + }, + { + { 0.083483f, 0.110085f, 0.109339f, 0.051764f, -0.020010f, -0.039528f, 0.004322f, 0.056971f, 0.060463f, 0.007557f, -0.064887f, -0.117401f, -0.135318f, -0.128075f, -0.114412f, -0.106312f, -0.099989f, -0.081312f, -0.041326f, 0.015498f, 0.078415f, 0.140173f, 0.196734f, 0.243546f, 0.279130f, 0.309950f, 0.344966f, 0.385237f, 0.423595f, 0.454230f, 0.477480f, 0.494581f, 0.502830f, 0.498359f, 0.480501f, 0.451053f, 0.411362f, 0.362412f, 0.306822f, 0.249052f, 0.193565f, 0.143055f, 0.098009f, 0.057666f, 0.021358f, -0.011323f, -0.041360f, -0.070040f, -0.097383f, -0.121846f, -0.141922f, -0.157021f, -0.166819f, -0.171494f, -0.173029f, -0.174559f, -0.177852f, -0.182824f, -0.189469f, -0.198225f, -0.208300f, -0.217936f, -0.226727f, -0.235597f, -0.244500f, -0.252545f, -0.260216f, -0.268673f, -0.277131f, -0.284050f, -0.290328f, -0.297485f, -0.303758f, -0.307256f, -0.311324f, -0.317826f, -0.314403f, -0.281644f, -0.222084f, -0.172483f}, + { 0.083483f, 0.110085f, 0.109339f, 0.051764f, -0.020010f, -0.039528f, 0.004322f, 0.056971f, 0.060463f, 0.007557f, -0.064887f, -0.117401f, -0.135318f, -0.128075f, -0.114412f, -0.106312f, -0.099989f, -0.081312f, -0.041326f, 0.015498f, 0.078415f, 0.140173f, 0.196734f, 0.243546f, 0.279130f, 0.309950f, 0.344966f, 0.385237f, 0.423595f, 0.454230f, 0.477480f, 0.494581f, 0.502830f, 0.498359f, 0.480501f, 0.451053f, 0.411362f, 0.362412f, 0.306822f, 0.249052f, 0.193565f, 0.143055f, 0.098009f, 0.057666f, 0.021358f, -0.011323f, -0.041360f, -0.070040f, -0.097383f, -0.121846f, -0.141922f, -0.157021f, -0.166819f, -0.171494f, -0.173029f, -0.174559f, -0.177852f, -0.182824f, -0.189469f, -0.198225f, -0.208300f, -0.217936f, -0.226727f, -0.235597f, -0.244500f, -0.252545f, -0.260216f, -0.268673f, -0.277131f, -0.284050f, -0.290328f, -0.297485f, -0.303758f, -0.307256f, -0.311324f, -0.317826f, -0.314403f, -0.281644f, -0.222084f, -0.172483f} + } +}; +const float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]={ + { + { -0.232163f, -0.616528f, -0.811918f, -0.814798f, -0.695968f, -0.532619f, -0.364404f, -0.191506f, -0.001808f, 0.199692f, 0.387587f, 0.537698f, 0.641196f, 0.697162f, 0.705949f, 0.675021f, 0.619155f, 0.549292f, 0.468934f, 0.381382f, 0.291066f, 0.199434f, 0.108353f, 0.023680f, -0.052215f, -0.124647f, -0.196123f, -0.260439f, -0.313530f, -0.359586f, -0.401100f, -0.434616f, -0.460396f, -0.484091f, -0.506500f, -0.523681f, -0.536851f, -0.550232f, -0.562059f, -0.569337f, -0.575950f, -0.585287f, -0.592832f, -0.595580f, -0.598359f, -0.603032f, -0.604124f, -0.600994f, -0.599842f, -0.600349f, -0.596133f, -0.588817f, -0.584797f, -0.581075f, -0.571581f, -0.560976f, -0.555050f, -0.547876f, -0.534759f, -0.523342f, -0.517217f, -0.507305f, -0.491703f, -0.480933f, -0.474754f, -0.461397f, -0.443990f, -0.435549f, -0.429457f, -0.411877f, -0.393966f, -0.389373f, -0.379526f, -0.350778f, -0.331174f, -0.325571f, -0.264083f, -0.109094f, 0.034816f, 0.040644f}, + { -0.232163f, -0.616528f, -0.811918f, -0.814798f, -0.695968f, -0.532619f, -0.364404f, -0.191506f, -0.001808f, 0.199692f, 0.387587f, 0.537698f, 0.641196f, 0.697162f, 0.705949f, 0.675021f, 0.619155f, 0.549292f, 0.468934f, 0.381382f, 0.291066f, 0.199434f, 0.108353f, 0.023680f, -0.052215f, -0.124647f, -0.196123f, -0.260439f, -0.313530f, -0.359586f, -0.401100f, -0.434616f, -0.460396f, -0.484091f, -0.506500f, -0.523681f, -0.536851f, -0.550232f, -0.562059f, -0.569337f, -0.575950f, -0.585287f, -0.592832f, -0.595580f, -0.598359f, -0.603032f, -0.604124f, -0.600994f, -0.599842f, -0.600349f, -0.596133f, -0.588817f, -0.584797f, -0.581075f, -0.571581f, -0.560976f, -0.555050f, -0.547876f, -0.534759f, -0.523342f, -0.517217f, -0.507305f, -0.491703f, -0.480933f, -0.474754f, -0.461397f, -0.443990f, -0.435549f, -0.429457f, -0.411877f, -0.393966f, -0.389373f, -0.379526f, -0.350778f, -0.331174f, -0.325571f, -0.264083f, -0.109094f, 0.034816f, 0.040644f} + }, + { + { 0.140804f, 0.288820f, 0.122901f, -0.328836f, -0.848509f, -1.186567f, -1.224746f, -1.004466f, -0.637872f, -0.223802f, 0.174851f, 0.525416f, 0.816608f, 1.044355f, 1.203947f, 1.296780f, 1.332269f, 1.317962f, 1.259572f, 1.171367f, 1.071313f, 0.965637f, 0.851706f, 0.732493f, 0.614874f, 0.500288f, 0.389707f, 0.289113f, 0.199637f, 0.113528f, 0.027703f, -0.052051f, -0.124690f, -0.195739f, -0.263851f, -0.322890f, -0.376254f, -0.431439f, -0.484825f, -0.529101f, -0.567623f, -0.605089f, -0.635842f, -0.656446f, -0.674899f, -0.694758f, -0.708108f, -0.713529f, -0.720098f, -0.728010f, -0.728543f, -0.724531f, -0.725793f, -0.727741f, -0.720454f, -0.710172f, -0.705821f, -0.698895f, -0.681963f, -0.666550f, -0.659346f, -0.647466f, -0.627275f, -0.614491f, -0.610170f, -0.596698f, -0.576958f, -0.570455f, -0.569107f, -0.551386f, -0.531742f, -0.532880f, -0.530696f, -0.501217f, -0.483082f, -0.497277f, -0.457348f, -0.288094f, -0.085091f, 0.000003f}, + { -0.140804f, -0.288820f, -0.122901f, 0.328836f, 0.848509f, 1.186567f, 1.224746f, 1.004466f, 0.637872f, 0.223802f, -0.174851f, -0.525416f, -0.816608f, -1.044355f, -1.203947f, -1.296780f, -1.332269f, -1.317962f, -1.259572f, -1.171367f, -1.071313f, -0.965637f, -0.851706f, -0.732493f, -0.614874f, -0.500288f, -0.389707f, -0.289113f, -0.199637f, -0.113528f, -0.027703f, 0.052051f, 0.124690f, 0.195739f, 0.263851f, 0.322890f, 0.376254f, 0.431439f, 0.484825f, 0.529101f, 0.567623f, 0.605089f, 0.635842f, 0.656446f, 0.674899f, 0.694758f, 0.708108f, 0.713529f, 0.720098f, 0.728010f, 0.728543f, 0.724531f, 0.725793f, 0.727741f, 0.720454f, 0.710172f, 0.705821f, 0.698895f, 0.681963f, 0.666550f, 0.659346f, 0.647466f, 0.627275f, 0.614491f, 0.610170f, 0.596698f, 0.576958f, 0.570455f, 0.569107f, 0.551386f, 0.531742f, 0.532880f, 0.530696f, 0.501217f, 0.483082f, 0.497277f, 0.457348f, 0.288094f, 0.085091f, -0.000003f} + }, + { + { -0.025177f, -0.087633f, -0.140274f, -0.115695f, -0.010636f, 0.082920f, 0.087853f, 0.026212f, -0.033798f, -0.061874f, -0.063579f, -0.039952f, 0.007102f, 0.052570f, 0.069283f, 0.063355f, 0.064400f, 0.084995f, 0.108122f, 0.112992f, 0.097520f, 0.071428f, 0.039020f, -0.001236f, -0.044527f, -0.078904f, -0.099083f, -0.112548f, -0.128423f, -0.147364f, -0.165244f, -0.179148f, -0.186479f, -0.184966f, -0.176189f, -0.164004f, -0.150041f, -0.136188f, -0.128157f, -0.129591f, -0.136736f, -0.145463f, -0.157784f, -0.175387f, -0.194418f, -0.212665f, -0.233498f, -0.257959f, -0.282364f, -0.306702f, -0.334694f, -0.364260f, -0.389417f, -0.410847f, -0.432554f, -0.451286f, -0.461837f, -0.467316f, -0.471644f, -0.469923f, -0.458220f, -0.442113f, -0.424518f, -0.398733f, -0.363110f, -0.325903f, -0.288018f, -0.241039f, -0.187411f, -0.138730f, -0.091862f, -0.035017f, 0.023593f, 0.067423f, 0.108501f, 0.170368f, 0.233774f, 0.244228f, 0.178383f, 0.063811f}, + { -0.025177f, -0.087633f, -0.140274f, -0.115695f, -0.010636f, 0.082920f, 0.087853f, 0.026212f, -0.033798f, -0.061874f, -0.063579f, -0.039952f, 0.007102f, 0.052570f, 0.069283f, 0.063355f, 0.064400f, 0.084995f, 0.108122f, 0.112992f, 0.097520f, 0.071428f, 0.039020f, -0.001236f, -0.044527f, -0.078904f, -0.099083f, -0.112548f, -0.128423f, -0.147364f, -0.165244f, -0.179148f, -0.186479f, -0.184966f, -0.176189f, -0.164004f, -0.150041f, -0.136188f, -0.128157f, -0.129591f, -0.136736f, -0.145463f, -0.157784f, -0.175387f, -0.194418f, -0.212665f, -0.233498f, -0.257959f, -0.282364f, -0.306702f, -0.334694f, -0.364260f, -0.389417f, -0.410847f, -0.432554f, -0.451286f, -0.461837f, -0.467316f, -0.471644f, -0.469923f, -0.458220f, -0.442113f, -0.424518f, -0.398733f, -0.363110f, -0.325903f, -0.288018f, -0.241039f, -0.187411f, -0.138730f, -0.091862f, -0.035017f, 0.023593f, 0.067423f, 0.108501f, 0.170368f, 0.233774f, 0.244228f, 0.178383f, 0.063811f} + }, + { + { 0.004703f, -0.012419f, -0.068264f, -0.109935f, -0.087140f, -0.019730f, 0.023154f, 0.000984f, -0.060278f, -0.104075f, -0.098075f, -0.050669f, 0.009688f, 0.059915f, 0.094514f, 0.123898f, 0.161742f, 0.210179f, 0.257436f, 0.290142f, 0.304107f, 0.301838f, 0.285923f, 0.260106f, 0.232315f, 0.209084f, 0.187584f, 0.158711f, 0.118014f, 0.068935f, 0.015486f, -0.042837f, -0.107244f, -0.175037f, -0.241360f, -0.302992f, -0.358214f, -0.404621f, -0.439290f, -0.460886f, -0.470726f, -0.471924f, -0.467673f, -0.459973f, -0.449766f, -0.437936f, -0.425279f, -0.411399f, -0.394870f, -0.375052f, -0.352862f, -0.329697f, -0.306974f, -0.286835f, -0.271419f, -0.260782f, -0.252993f, -0.246525f, -0.240909f, -0.235119f, -0.227642f, -0.218477f, -0.208956f, -0.199340f, -0.188795f, -0.177591f, -0.166699f, -0.155414f, -0.142302f, -0.128106f, -0.114274f, -0.099433f, -0.081705f, -0.063092f, -0.044843f, -0.019680f, 0.019853f, 0.060923f, 0.070962f, 0.031790f}, + { 0.004703f, -0.012419f, -0.068264f, -0.109935f, -0.087140f, -0.019730f, 0.023154f, 0.000984f, -0.060278f, -0.104075f, -0.098075f, -0.050669f, 0.009688f, 0.059915f, 0.094514f, 0.123898f, 0.161742f, 0.210179f, 0.257436f, 0.290142f, 0.304107f, 0.301838f, 0.285923f, 0.260106f, 0.232315f, 0.209084f, 0.187584f, 0.158711f, 0.118014f, 0.068935f, 0.015486f, -0.042837f, -0.107244f, -0.175037f, -0.241360f, -0.302992f, -0.358214f, -0.404621f, -0.439290f, -0.460886f, -0.470726f, -0.471924f, -0.467673f, -0.459973f, -0.449766f, -0.437936f, -0.425279f, -0.411399f, -0.394870f, -0.375052f, -0.352862f, -0.329697f, -0.306974f, -0.286835f, -0.271419f, -0.260782f, -0.252993f, -0.246525f, -0.240909f, -0.235119f, -0.227642f, -0.218477f, -0.208956f, -0.199340f, -0.188795f, -0.177591f, -0.166699f, -0.155414f, -0.142302f, -0.128106f, -0.114274f, -0.099433f, -0.081705f, -0.063092f, -0.044843f, -0.019680f, 0.019853f, 0.060923f, 0.070962f, 0.031790f} + } +}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* UPDATE_SBA_FILTER */ + +#ifdef UPDATE_SBA_FILTER + + +/********************** CRendBin_HOA2_HRIR **********************/ + +#ifdef UPDATE_SBA_FILTER +const float CRendBin_HOA2_HRIR_latency_s = 0.000020834f; +#else +const float CRendBin_HOA2_HRIR_latency_s = 0.000020833333110f; +#endif + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]={ + { + {0.955467f, 0.635681f, 0.166653f, -0.248686f, -0.508651f, -0.626077f, -0.650285f, -0.604530f, -0.488417f, -0.308510f, -0.090053f, 0.133390f, 0.331939f, 0.484574f, 0.581273f, 0.623235f, 0.619217f, 0.579562f, 0.512138f, 0.422298f, 0.315745f, 0.200824f, 0.086720f, -0.021278f, -0.123379f, -0.220908f, -0.311538f, -0.390400f, -0.454756f, -0.505495f, -0.544554f, -0.573087f, -0.592353f, -0.604514f, -0.611652f, -0.614839f, -0.614702f, -0.612258f, -0.608712f, -0.604725f, -0.600146f, -0.594359f, -0.586798f, -0.577264f, -0.565860f, -0.552745f, -0.538040f, -0.521885f, -0.504388f, -0.485535f, -0.465319f, -0.443966f, -0.421881f, -0.399382f, -0.376688f, -0.354132f, -0.332145f, -0.310934f, -0.290358f, -0.270218f, -0.250519f, -0.231307f, -0.212442f, -0.193768f, -0.175388f, -0.157519f, -0.140147f, -0.123115f, -0.106462f, -0.090326f, -0.074575f, -0.058912f, -0.043292f, -0.027843f, -0.012429f, 0.003258f, 0.019199f, 0.035158f, 0.051271f, 0.067966f, 0.085226f, 0.102477f, 0.119366f, 0.136149f, 0.153084f, 0.169846f, 0.185867f, 0.201051f, 0.215857f, 0.230656f, 0.245156f, 0.258620f, 0.270655f, 0.281594f, 0.291923f, 0.301545f, + 0.309937f, 0.316968f, 0.323239f, 0.329553f, 0.336281f, 0.343277f, 0.350289f, 0.357415f, 0.365174f, 0.374055f, 0.384018f, 0.394584f, 0.405384f, 0.416401f, 0.427714f, 0.439268f, 0.450898f, 0.462356f, 0.473320f, 0.483570f, 0.493122f, 0.502098f, 0.510577f, 0.518647f, 0.526423f, 0.533949f, 0.541211f, 0.548278f, 0.555224f, 0.561949f, 0.568280f, 0.574177f, 0.579652f, 0.584611f, 0.589021f, 0.593080f, 0.597009f, 0.600857f, 0.604651f, 0.608500f, 0.612417f, 0.616274f, 0.620049f, 0.623888f, 0.627902f, 0.632129f, 0.636648f, 0.641474f, 0.646442f, 0.651406f, 0.656384f, 0.661348f, 0.666127f, 0.670667f, 0.675091f, 0.679372f, 0.683315f, 0.686889f, 0.690210f, 0.693196f, 0.695655f, 0.697621f, 0.699235f, 0.700467f, 0.701329f, 0.702091f, 0.702934f, 0.703776f, 0.704674f, 0.705900f, 0.707411f, 0.708825f, 0.710050f, 0.711305f, 0.712526f, 0.713461f, 0.714246f, 0.715152f, 0.716020f, 0.716635f, 0.717247f, 0.718065f, 0.718834f, 0.719533f, 0.720673f, 0.722398f, 0.724272f, 0.726300f, 0.728964f, 0.732074f, 0.734989f, 0.737890f, 0.741305f, 0.744740f, 0.747549f, 0.750362f, + 0.753763f, 0.756792f, 0.758849f, 0.761249f, 0.764561f, 0.766959f, 0.767817f, 0.769595f, 0.772990f, 0.774514f, 0.772907f, 0.772944f, 0.777562f, 0.781372f, 0.778511f, 0.772279f, 0.769953f, 0.772161f, 0.774253f, 0.773522f, 0.767718f, 0.752282f, 0.729193f, 0.714109f, 0.722150f, 0.746693f, 0.763324f, 0.757243f, 0.738026f, 0.724006f, 0.720101f, 0.717852f, 0.714019f, 0.720891f, 0.753307f, 0.807040f, 0.856442f, 0.878090f, 0.873417f, 0.862096f, 0.856572f, 0.853129f, 0.847435f, 0.844863f, 0.848629f, 0.849468f, 0.838876f, 0.825576f}, + {0.955467f, 0.635681f, 0.166653f, -0.248686f, -0.508651f, -0.626077f, -0.650285f, -0.604530f, -0.488417f, -0.308510f, -0.090053f, 0.133390f, 0.331939f, 0.484574f, 0.581273f, 0.623235f, 0.619217f, 0.579562f, 0.512138f, 0.422298f, 0.315745f, 0.200824f, 0.086720f, -0.021278f, -0.123379f, -0.220908f, -0.311538f, -0.390400f, -0.454756f, -0.505495f, -0.544554f, -0.573087f, -0.592353f, -0.604514f, -0.611652f, -0.614839f, -0.614702f, -0.612258f, -0.608712f, -0.604725f, -0.600146f, -0.594359f, -0.586798f, -0.577264f, -0.565860f, -0.552745f, -0.538040f, -0.521885f, -0.504388f, -0.485535f, -0.465319f, -0.443966f, -0.421881f, -0.399382f, -0.376688f, -0.354132f, -0.332145f, -0.310934f, -0.290358f, -0.270218f, -0.250519f, -0.231307f, -0.212442f, -0.193768f, -0.175388f, -0.157519f, -0.140147f, -0.123115f, -0.106462f, -0.090326f, -0.074575f, -0.058912f, -0.043292f, -0.027843f, -0.012429f, 0.003258f, 0.019199f, 0.035158f, 0.051271f, 0.067966f, 0.085226f, 0.102477f, 0.119366f, 0.136149f, 0.153084f, 0.169846f, 0.185867f, 0.201051f, 0.215857f, 0.230656f, 0.245156f, 0.258620f, 0.270655f, 0.281594f, 0.291923f, 0.301545f, + 0.309937f, 0.316968f, 0.323239f, 0.329553f, 0.336281f, 0.343277f, 0.350289f, 0.357415f, 0.365174f, 0.374055f, 0.384018f, 0.394584f, 0.405384f, 0.416401f, 0.427714f, 0.439268f, 0.450898f, 0.462356f, 0.473320f, 0.483570f, 0.493122f, 0.502098f, 0.510577f, 0.518647f, 0.526423f, 0.533949f, 0.541211f, 0.548278f, 0.555224f, 0.561949f, 0.568280f, 0.574177f, 0.579652f, 0.584611f, 0.589021f, 0.593080f, 0.597009f, 0.600857f, 0.604651f, 0.608500f, 0.612417f, 0.616274f, 0.620049f, 0.623888f, 0.627902f, 0.632129f, 0.636648f, 0.641474f, 0.646442f, 0.651406f, 0.656384f, 0.661348f, 0.666127f, 0.670667f, 0.675091f, 0.679372f, 0.683315f, 0.686889f, 0.690210f, 0.693196f, 0.695655f, 0.697621f, 0.699235f, 0.700467f, 0.701329f, 0.702091f, 0.702934f, 0.703776f, 0.704674f, 0.705900f, 0.707411f, 0.708825f, 0.710050f, 0.711305f, 0.712526f, 0.713461f, 0.714246f, 0.715152f, 0.716020f, 0.716635f, 0.717247f, 0.718065f, 0.718834f, 0.719533f, 0.720673f, 0.722398f, 0.724272f, 0.726300f, 0.728964f, 0.732074f, 0.734989f, 0.737890f, 0.741305f, 0.744740f, 0.747549f, 0.750362f, + 0.753763f, 0.756792f, 0.758849f, 0.761249f, 0.764561f, 0.766959f, 0.767817f, 0.769595f, 0.772990f, 0.774514f, 0.772907f, 0.772944f, 0.777562f, 0.781372f, 0.778511f, 0.772279f, 0.769953f, 0.772161f, 0.774253f, 0.773522f, 0.767718f, 0.752282f, 0.729193f, 0.714109f, 0.722150f, 0.746693f, 0.763324f, 0.757243f, 0.738026f, 0.724006f, 0.720101f, 0.717852f, 0.714019f, 0.720891f, 0.753307f, 0.807040f, 0.856442f, 0.878090f, 0.873417f, 0.862096f, 0.856572f, 0.853129f, 0.847435f, 0.844863f, 0.848629f, 0.849468f, 0.838876f, 0.825576f} + }, + { + {0.097314f, 0.414173f, 0.747626f, 0.754590f, 0.330783f, -0.326705f, -0.901613f, -1.190599f, -1.185056f, -0.986921f, -0.692990f, -0.354873f, -0.002249f, 0.335288f, 0.631311f, 0.869888f, 1.042481f, 1.143077f, 1.170924f, 1.135842f, 1.056300f, 0.949835f, 0.825366f, 0.685238f, 0.533253f, 0.378103f, 0.228763f, 0.089252f, -0.040641f, -0.161495f, -0.272981f, -0.375031f, -0.468133f, -0.552605f, -0.628716f, -0.697354f, -0.759761f, -0.816645f, -0.867878f, -0.912811f, -0.950646f, -0.980831f, -1.003432f, -1.019091f, -1.028553f, -1.032320f, -1.030690f, -1.023992f, -1.012844f, -0.998265f, -0.981431f, -0.963113f, -0.943286f, -0.921325f, -0.896613f, -0.869049f, -0.839024f, -0.807064f, -0.773676f, -0.739520f, -0.705375f, -0.671722f, -0.638603f, -0.606135f, -0.574805f, -0.544984f, -0.516534f, -0.489311f, -0.463725f, -0.440280f, -0.418894f, -0.399253f, -0.381525f, -0.365999f, -0.352195f, -0.339137f, -0.326488f, -0.314596f, -0.303283f, -0.291474f, -0.278425f, -0.264548f, -0.250445f, -0.235726f, -0.219500f, -0.201656f, -0.182949f, -0.163967f, -0.144609f, -0.124484f, -0.103249f, -0.080535f, -0.055987f, -0.029425f, -0.000739f, 0.030319f, + 0.063929f, 0.099772f, 0.136966f, 0.174386f, 0.211037f, 0.246212f, 0.279379f, 0.309898f, 0.336976f, 0.360053f, 0.379082f, 0.394265f, 0.405690f, 0.413493f, 0.418257f, 0.421046f, 0.423069f, 0.425261f, 0.427920f, 0.430738f, 0.433463f, 0.436544f, 0.440906f, 0.447174f, 0.455301f, 0.464713f, 0.474496f, 0.483726f, 0.492054f, 0.499849f, 0.507562f, 0.515203f, 0.522591f, 0.529726f, 0.536646f, 0.543230f, 0.549348f, 0.554966f, 0.560050f, 0.564644f, 0.569000f, 0.573385f, 0.577839f, 0.582298f, 0.586765f, 0.591237f, 0.595738f, 0.600532f, 0.606012f, 0.612378f, 0.619693f, 0.628054f, 0.637369f, 0.647229f, 0.657409f, 0.668130f, 0.679533f, 0.691385f, 0.703604f, 0.716403f, 0.729644f, 0.742723f, 0.755282f, 0.767338f, 0.778713f, 0.789114f, 0.798667f, 0.807637f, 0.815884f, 0.823219f, 0.829774f, 0.835517f, 0.840126f, 0.843797f, 0.847226f, 0.850573f, 0.853543f, 0.856458f, 0.859889f, 0.863411f, 0.866099f, 0.867816f, 0.868779f, 0.868745f, 0.867866f, 0.867084f, 0.866670f, 0.865984f, 0.865256f, 0.865448f, 0.866168f, 0.866282f, 0.866234f, 0.866993f, 0.867839f, 0.868126f, + 0.868997f, 0.870630f, 0.871367f, 0.871898f, 0.874706f, 0.877884f, 0.877771f, 0.878026f, 0.884032f, 0.889476f, 0.886115f, 0.884433f, 0.898714f, 0.912808f, 0.896260f, 0.858730f, 0.845640f, 0.869140f, 0.891869f, 0.896006f, 0.911910f, 0.948673f, 0.954899f, 0.894533f, 0.814533f, 0.786292f, 0.814134f, 0.846554f, 0.848304f, 0.823226f, 0.793405f, 0.782599f, 0.785720f, 0.738162f, 0.572339f, 0.335226f, 0.185068f, 0.220164f, 0.362443f, 0.464261f, 0.482183f, 0.481394f, 0.504881f, 0.514608f, 0.459824f, 0.346966f, 0.228758f, 0.156688f}, + {-0.097314f, -0.414173f, -0.747626f, -0.754590f, -0.330783f, 0.326705f, 0.901613f, 1.190599f, 1.185056f, 0.986921f, 0.692990f, 0.354873f, 0.002249f, -0.335288f, -0.631311f, -0.869888f, -1.042481f, -1.143077f, -1.170924f, -1.135842f, -1.056300f, -0.949835f, -0.825366f, -0.685238f, -0.533253f, -0.378103f, -0.228763f, -0.089252f, 0.040641f, 0.161495f, 0.272981f, 0.375031f, 0.468133f, 0.552605f, 0.628716f, 0.697354f, 0.759761f, 0.816645f, 0.867878f, 0.912811f, 0.950646f, 0.980831f, 1.003432f, 1.019091f, 1.028553f, 1.032320f, 1.030690f, 1.023992f, 1.012844f, 0.998265f, 0.981431f, 0.963113f, 0.943286f, 0.921325f, 0.896613f, 0.869049f, 0.839024f, 0.807064f, 0.773676f, 0.739520f, 0.705375f, 0.671722f, 0.638603f, 0.606135f, 0.574805f, 0.544984f, 0.516534f, 0.489311f, 0.463725f, 0.440280f, 0.418894f, 0.399253f, 0.381525f, 0.365999f, 0.352195f, 0.339137f, 0.326488f, 0.314596f, 0.303283f, 0.291474f, 0.278425f, 0.264548f, 0.250445f, 0.235726f, 0.219500f, 0.201656f, 0.182949f, 0.163967f, 0.144609f, 0.124484f, 0.103249f, 0.080535f, 0.055987f, 0.029425f, 0.000739f, -0.030319f, + -0.063929f, -0.099772f, -0.136966f, -0.174386f, -0.211037f, -0.246212f, -0.279379f, -0.309898f, -0.336976f, -0.360053f, -0.379082f, -0.394265f, -0.405690f, -0.413493f, -0.418257f, -0.421046f, -0.423069f, -0.425261f, -0.427920f, -0.430738f, -0.433463f, -0.436544f, -0.440906f, -0.447174f, -0.455301f, -0.464713f, -0.474496f, -0.483726f, -0.492054f, -0.499849f, -0.507562f, -0.515203f, -0.522591f, -0.529726f, -0.536646f, -0.543230f, -0.549348f, -0.554966f, -0.560050f, -0.564644f, -0.569000f, -0.573385f, -0.577839f, -0.582298f, -0.586765f, -0.591237f, -0.595738f, -0.600532f, -0.606012f, -0.612378f, -0.619693f, -0.628054f, -0.637369f, -0.647229f, -0.657409f, -0.668130f, -0.679533f, -0.691385f, -0.703604f, -0.716403f, -0.729644f, -0.742723f, -0.755282f, -0.767338f, -0.778713f, -0.789114f, -0.798667f, -0.807637f, -0.815884f, -0.823219f, -0.829774f, -0.835517f, -0.840126f, -0.843797f, -0.847226f, -0.850573f, -0.853543f, -0.856458f, -0.859889f, -0.863411f, -0.866099f, -0.867816f, -0.868779f, -0.868745f, -0.867866f, -0.867084f, -0.866670f, -0.865984f, -0.865256f, -0.865448f, -0.866168f, -0.866282f, -0.866234f, -0.866993f, -0.867839f, -0.868126f, + -0.868997f, -0.870630f, -0.871367f, -0.871898f, -0.874706f, -0.877884f, -0.877771f, -0.878026f, -0.884032f, -0.889476f, -0.886115f, -0.884433f, -0.898714f, -0.912808f, -0.896260f, -0.858730f, -0.845640f, -0.869140f, -0.891869f, -0.896006f, -0.911910f, -0.948673f, -0.954899f, -0.894533f, -0.814533f, -0.786292f, -0.814134f, -0.846554f, -0.848304f, -0.823226f, -0.793405f, -0.782599f, -0.785720f, -0.738162f, -0.572339f, -0.335226f, -0.185068f, -0.220164f, -0.362443f, -0.464261f, -0.482183f, -0.481394f, -0.504881f, -0.514608f, -0.459824f, -0.346966f, -0.228758f, -0.156688f} + }, + { + {0.116713f, 0.072126f, -0.020631f, -0.112176f, -0.120235f, -0.031894f, 0.067439f, 0.091659f, 0.039310f, -0.034445f, -0.085235f, -0.095294f, -0.062685f, -0.007339f, 0.035234f, 0.050997f, 0.062562f, 0.092595f, 0.130453f, 0.149870f, 0.142288f, 0.116439f, 0.078486f, 0.030060f, -0.020701f, -0.060937f, -0.085675f, -0.101228f, -0.116230f, -0.133115f, -0.147632f, -0.154014f, -0.150236f, -0.138833f, -0.123518f, -0.107035f, -0.092734f, -0.085340f, -0.087853f, -0.099007f, -0.115280f, -0.134212f, -0.154704f, -0.175585f, -0.195498f, -0.213771f, -0.230537f, -0.246204f, -0.261004f, -0.274518f, -0.285368f, -0.291759f, -0.292561f, -0.287601f, -0.276917f, -0.260193f, -0.237217f, -0.208432f, -0.174533f, -0.135701f, -0.091811f, -0.043233f, 0.009243f, 0.065150f, 0.124187f, 0.185310f, 0.246775f, 0.307108f, 0.365223f, 0.419659f, 0.468551f, 0.510367f, 0.543904f, 0.567857f, 0.581410f, 0.585089f, 0.579988f, 0.566359f, 0.544196f, 0.515148f, 0.482355f, 0.447851f, 0.411415f, 0.372943f, 0.334830f, 0.300327f, 0.269892f, 0.241113f, 0.212758f, 0.187086f, 0.166978f, 0.152277f, 0.140516f, 0.130249f, 0.122026f, 0.116711f, + 0.114395f, 0.114642f, 0.116582f, 0.118903f, 0.120560f, 0.121397f, 0.121803f, 0.122096f, 0.122081f, 0.120568f, 0.115639f, 0.106376f, 0.094049f, 0.080746f, 0.067280f, 0.053238f, 0.038276f, 0.022433f, 0.005947f, -0.010351f, -0.025082f, -0.037294f, -0.046681f, -0.052842f, -0.055367f, -0.054587f, -0.051101f, -0.044816f, -0.035505f, -0.023804f, -0.010663f, 0.003451f, 0.018016f, 0.032133f, 0.045369f, 0.057764f, 0.068693f, 0.077173f, 0.083414f, 0.088574f, 0.093316f, 0.098141f, 0.104298f, 0.112463f, 0.121400f, 0.129615f, 0.137158f, 0.144434f, 0.150888f, 0.156189f, 0.160875f, 0.164864f, 0.167274f, 0.168212f, 0.168642f, 0.168568f, 0.167544f, 0.166341f, 0.165856f, 0.165449f, 0.164412f, 0.163410f, 0.162696f, 0.161164f, 0.158594f, 0.156177f, 0.153901f, 0.150467f, 0.146055f, 0.141871f, 0.137505f, 0.132216f, 0.127455f, 0.124584f, 0.122335f, 0.119725f, 0.118247f, 0.118393f, 0.118126f, 0.116848f, 0.115875f, 0.114029f, 0.108671f, 0.100879f, 0.093121f, 0.083708f, 0.070519f, 0.056452f, 0.043960f, 0.029990f, 0.013203f, -0.001963f, -0.014381f, -0.028555f, -0.043767f, -0.054771f, + -0.064616f, -0.079267f, -0.092295f, -0.096950f, -0.104863f, -0.124550f, -0.137426f, -0.132020f, -0.136512f, -0.167601f, -0.183275f, -0.156719f, -0.153305f, -0.232829f, -0.312161f, -0.256735f, -0.095012f, 0.003970f, -0.025692f, -0.079935f, -0.088484f, -0.118715f, -0.210193f, -0.259911f, -0.175437f, -0.030063f, 0.040705f, 0.019139f, -0.011331f, -0.004889f, 0.006382f, -0.022770f, -0.100066f, -0.183271f, -0.195497f, -0.097381f, 0.039125f, 0.086187f, 0.011399f, -0.085034f, -0.108289f, -0.079208f, -0.069267f, -0.087019f, -0.087070f, -0.054365f, -0.019140f, -0.003388f}, + {0.116713f, 0.072126f, -0.020631f, -0.112176f, -0.120235f, -0.031894f, 0.067439f, 0.091659f, 0.039310f, -0.034445f, -0.085235f, -0.095294f, -0.062685f, -0.007339f, 0.035234f, 0.050997f, 0.062562f, 0.092595f, 0.130453f, 0.149870f, 0.142288f, 0.116439f, 0.078486f, 0.030060f, -0.020701f, -0.060937f, -0.085675f, -0.101228f, -0.116230f, -0.133115f, -0.147632f, -0.154014f, -0.150236f, -0.138833f, -0.123518f, -0.107035f, -0.092734f, -0.085340f, -0.087853f, -0.099007f, -0.115280f, -0.134212f, -0.154704f, -0.175585f, -0.195498f, -0.213771f, -0.230537f, -0.246204f, -0.261004f, -0.274518f, -0.285368f, -0.291759f, -0.292561f, -0.287601f, -0.276917f, -0.260193f, -0.237217f, -0.208432f, -0.174533f, -0.135701f, -0.091811f, -0.043233f, 0.009243f, 0.065150f, 0.124187f, 0.185310f, 0.246775f, 0.307108f, 0.365223f, 0.419659f, 0.468551f, 0.510367f, 0.543904f, 0.567857f, 0.581410f, 0.585089f, 0.579988f, 0.566359f, 0.544196f, 0.515148f, 0.482355f, 0.447851f, 0.411415f, 0.372943f, 0.334830f, 0.300327f, 0.269892f, 0.241113f, 0.212758f, 0.187086f, 0.166978f, 0.152277f, 0.140516f, 0.130249f, 0.122026f, 0.116711f, + 0.114395f, 0.114642f, 0.116582f, 0.118903f, 0.120560f, 0.121397f, 0.121803f, 0.122096f, 0.122081f, 0.120568f, 0.115639f, 0.106376f, 0.094049f, 0.080746f, 0.067280f, 0.053238f, 0.038276f, 0.022433f, 0.005947f, -0.010351f, -0.025082f, -0.037294f, -0.046681f, -0.052842f, -0.055367f, -0.054587f, -0.051101f, -0.044816f, -0.035505f, -0.023804f, -0.010663f, 0.003451f, 0.018016f, 0.032133f, 0.045369f, 0.057764f, 0.068693f, 0.077173f, 0.083414f, 0.088574f, 0.093316f, 0.098141f, 0.104298f, 0.112463f, 0.121400f, 0.129615f, 0.137158f, 0.144434f, 0.150888f, 0.156189f, 0.160875f, 0.164864f, 0.167274f, 0.168212f, 0.168642f, 0.168568f, 0.167544f, 0.166341f, 0.165856f, 0.165449f, 0.164412f, 0.163410f, 0.162696f, 0.161164f, 0.158594f, 0.156177f, 0.153901f, 0.150467f, 0.146055f, 0.141871f, 0.137505f, 0.132216f, 0.127455f, 0.124584f, 0.122335f, 0.119725f, 0.118247f, 0.118393f, 0.118126f, 0.116848f, 0.115875f, 0.114029f, 0.108671f, 0.100879f, 0.093121f, 0.083708f, 0.070519f, 0.056452f, 0.043960f, 0.029990f, 0.013203f, -0.001963f, -0.014381f, -0.028555f, -0.043767f, -0.054771f, + -0.064616f, -0.079267f, -0.092295f, -0.096950f, -0.104863f, -0.124550f, -0.137426f, -0.132020f, -0.136512f, -0.167601f, -0.183275f, -0.156719f, -0.153305f, -0.232829f, -0.312161f, -0.256735f, -0.095012f, 0.003970f, -0.025692f, -0.079935f, -0.088484f, -0.118715f, -0.210193f, -0.259911f, -0.175437f, -0.030063f, 0.040705f, 0.019139f, -0.011331f, -0.004889f, 0.006382f, -0.022770f, -0.100066f, -0.183271f, -0.195497f, -0.097381f, 0.039125f, 0.086187f, 0.011399f, -0.085034f, -0.108289f, -0.079208f, -0.069267f, -0.087019f, -0.087070f, -0.054365f, -0.019140f, -0.003388f} + }, + { + {0.057716f, 0.076756f, 0.058868f, -0.013782f, -0.079436f, -0.074073f, -0.016187f, 0.017124f, -0.018250f, -0.093448f, -0.149405f, -0.153777f, -0.115034f, -0.060844f, -0.011733f, 0.031700f, 0.082185f, 0.146750f, 0.215597f, 0.270817f, 0.301494f, 0.306907f, 0.290675f, 0.258743f, 0.219989f, 0.180823f, 0.138641f, 0.085701f, 0.019654f, -0.054132f, -0.130307f, -0.208118f, -0.286879f, -0.361597f, -0.426062f, -0.477609f, -0.516371f, -0.541854f, -0.552928f, -0.550365f, -0.537270f, -0.517036f, -0.491948f, -0.463535f, -0.433204f, -0.402160f, -0.370923f, -0.339116f, -0.306013f, -0.271593f, -0.237008f, -0.204076f, -0.174628f, -0.150090f, -0.130726f, -0.115027f, -0.100582f, -0.085793f, -0.070243f, -0.053770f, -0.036295f, -0.018447f, -0.001151f, 0.015432f, 0.031657f, 0.047424f, 0.062600f, 0.078005f, 0.094600f, 0.112028f, 0.129305f, 0.146558f, 0.164522f, 0.182587f, 0.199005f, 0.212998f, 0.224982f, 0.234524f, 0.239833f, 0.239930f, 0.235886f, 0.228926f, 0.218536f, 0.203779f, 0.185737f, 0.167006f, 0.148890f, 0.130591f, 0.111280f, 0.091321f, 0.070885f, 0.048967f, 0.024866f, -0.000541f, -0.026100f, -0.051960f, + -0.078659f, -0.105381f, -0.130303f, -0.152361f, -0.171822f, -0.189236f, -0.204261f, -0.215422f, -0.221132f, -0.221347f, -0.217950f, -0.212885f, -0.206158f, -0.196258f, -0.182255f, -0.164983f, -0.146569f, -0.129160f, -0.113464f, -0.098109f, -0.081029f, -0.061799f, -0.042161f, -0.024344f, -0.009539f, 0.002365f, 0.012635f, 0.023134f, 0.034939f, 0.047539f, 0.059892f, 0.071761f, 0.083571f, 0.095796f, 0.109100f, 0.124264f, 0.141372f, 0.159700f, 0.178598f, 0.197760f, 0.216729f, 0.235064f, 0.252852f, 0.270238f, 0.286751f, 0.301767f, 0.315065f, 0.326358f, 0.335078f, 0.341096f, 0.344846f, 0.346536f, 0.346164f, 0.344265f, 0.341562f, 0.338166f, 0.334119f, 0.330115f, 0.326715f, 0.323760f, 0.321440f, 0.320712f, 0.321901f, 0.324294f, 0.327593f, 0.332127f, 0.337417f, 0.342367f, 0.346858f, 0.351462f, 0.356178f, 0.361075f, 0.367067f, 0.374444f, 0.382147f, 0.389740f, 0.397992f, 0.406725f, 0.414722f, 0.422146f, 0.429946f, 0.437160f, 0.442159f, 0.445488f, 0.447970f, 0.448137f, 0.445126f, 0.440944f, 0.436547f, 0.430064f, 0.421619f, 0.414105f, 0.407405f, 0.399002f, 0.390437f, 0.384435f, + 0.377920f, 0.368392f, 0.361461f, 0.359383f, 0.352793f, 0.339519f, 0.334298f, 0.339584f, 0.332793f, 0.310207f, 0.306283f, 0.327892f, 0.317434f, 0.246418f, 0.196934f, 0.258692f, 0.381164f, 0.436129f, 0.404093f, 0.376464f, 0.381882f, 0.351261f, 0.276746f, 0.261983f, 0.357657f, 0.468349f, 0.494143f, 0.465205f, 0.461850f, 0.487233f, 0.497133f, 0.484317f, 0.455264f, 0.383620f, 0.267215f, 0.184416f, 0.211056f, 0.308507f, 0.369236f, 0.358171f, 0.338304f, 0.358938f, 0.388546f, 0.381045f, 0.357053f, 0.377955f, 0.457097f, 0.532101f}, + {0.057716f, 0.076756f, 0.058868f, -0.013782f, -0.079436f, -0.074073f, -0.016187f, 0.017124f, -0.018250f, -0.093448f, -0.149405f, -0.153777f, -0.115034f, -0.060844f, -0.011733f, 0.031700f, 0.082185f, 0.146750f, 0.215597f, 0.270817f, 0.301494f, 0.306907f, 0.290675f, 0.258743f, 0.219989f, 0.180823f, 0.138641f, 0.085701f, 0.019654f, -0.054132f, -0.130307f, -0.208118f, -0.286879f, -0.361597f, -0.426062f, -0.477609f, -0.516371f, -0.541854f, -0.552928f, -0.550365f, -0.537270f, -0.517036f, -0.491948f, -0.463535f, -0.433204f, -0.402160f, -0.370923f, -0.339116f, -0.306013f, -0.271593f, -0.237008f, -0.204076f, -0.174628f, -0.150090f, -0.130726f, -0.115027f, -0.100582f, -0.085793f, -0.070243f, -0.053770f, -0.036295f, -0.018447f, -0.001151f, 0.015432f, 0.031657f, 0.047424f, 0.062600f, 0.078005f, 0.094600f, 0.112028f, 0.129305f, 0.146558f, 0.164522f, 0.182587f, 0.199005f, 0.212998f, 0.224982f, 0.234524f, 0.239833f, 0.239930f, 0.235886f, 0.228926f, 0.218536f, 0.203779f, 0.185737f, 0.167006f, 0.148890f, 0.130591f, 0.111280f, 0.091321f, 0.070885f, 0.048967f, 0.024866f, -0.000541f, -0.026100f, -0.051960f, + -0.078659f, -0.105381f, -0.130303f, -0.152361f, -0.171822f, -0.189236f, -0.204261f, -0.215422f, -0.221132f, -0.221347f, -0.217950f, -0.212885f, -0.206158f, -0.196258f, -0.182255f, -0.164983f, -0.146569f, -0.129160f, -0.113464f, -0.098109f, -0.081029f, -0.061799f, -0.042161f, -0.024344f, -0.009539f, 0.002365f, 0.012635f, 0.023134f, 0.034939f, 0.047539f, 0.059892f, 0.071761f, 0.083571f, 0.095796f, 0.109100f, 0.124264f, 0.141372f, 0.159700f, 0.178598f, 0.197760f, 0.216729f, 0.235064f, 0.252852f, 0.270238f, 0.286751f, 0.301767f, 0.315065f, 0.326358f, 0.335078f, 0.341096f, 0.344846f, 0.346536f, 0.346164f, 0.344265f, 0.341562f, 0.338166f, 0.334119f, 0.330115f, 0.326715f, 0.323760f, 0.321440f, 0.320712f, 0.321901f, 0.324294f, 0.327593f, 0.332127f, 0.337417f, 0.342367f, 0.346858f, 0.351462f, 0.356178f, 0.361075f, 0.367067f, 0.374444f, 0.382147f, 0.389740f, 0.397992f, 0.406725f, 0.414722f, 0.422146f, 0.429946f, 0.437160f, 0.442159f, 0.445488f, 0.447970f, 0.448137f, 0.445126f, 0.440944f, 0.436547f, 0.430064f, 0.421619f, 0.414105f, 0.407405f, 0.399002f, 0.390437f, 0.384435f, + 0.377920f, 0.368392f, 0.361461f, 0.359383f, 0.352793f, 0.339519f, 0.334298f, 0.339584f, 0.332793f, 0.310207f, 0.306283f, 0.327892f, 0.317434f, 0.246418f, 0.196934f, 0.258692f, 0.381164f, 0.436129f, 0.404093f, 0.376464f, 0.381882f, 0.351261f, 0.276746f, 0.261983f, 0.357657f, 0.468349f, 0.494143f, 0.465205f, 0.461850f, 0.487233f, 0.497133f, 0.484317f, 0.455264f, 0.383620f, 0.267215f, 0.184416f, 0.211056f, 0.308507f, 0.369236f, 0.358171f, 0.338304f, 0.358938f, 0.388546f, 0.381045f, 0.357053f, 0.377955f, 0.457097f, 0.532101f} + }, + { + {0.022217f, 0.015375f, 0.018397f, 0.035300f, 0.046690f, 0.037732f, 0.022017f, 0.019869f, 0.019459f, -0.017327f, -0.102816f, -0.194710f, -0.234177f, -0.204599f, -0.138417f, -0.071733f, -0.010515f, 0.056797f, 0.132305f, 0.206318f, 0.271841f, 0.327874f, 0.371103f, 0.395052f, 0.398096f, 0.384964f, 0.359169f, 0.319562f, 0.265403f, 0.199868f, 0.126987f, 0.048878f, -0.032648f, -0.114915f, -0.195782f, -0.273182f, -0.342322f, -0.396309f, -0.431191f, -0.448778f, -0.453935f, -0.450961f, -0.442889f, -0.431917f, -0.419114f, -0.404570f, -0.388255f, -0.370115f, -0.349678f, -0.326644f, -0.301721f, -0.276201f, -0.251220f, -0.227989f, -0.207822f, -0.191043f, -0.176530f, -0.162962f, -0.149778f, -0.136591f, -0.122722f, -0.107799f, -0.091935f, -0.075014f, -0.056648f, -0.036913f, -0.016138f, 0.005944f, 0.029814f, 0.055061f, 0.080836f, 0.107214f, 0.134806f, 0.163054f, 0.190286f, 0.215551f, 0.238967f, 0.259885f, 0.276238f, 0.286705f, 0.292383f, 0.294992f, 0.294208f, 0.288458f, 0.278037f, 0.265391f, 0.251792f, 0.235652f, 0.215265f, 0.191614f, 0.166954f, 0.141873f, 0.115571f, 0.088358f, 0.062140f, 0.038532f, + 0.017724f, -0.000836f, -0.017500f, -0.032211f, -0.044805f, -0.055481f, -0.064916f, -0.073629f, -0.081559f, -0.088826f, -0.096406f, -0.105164f, -0.114511f, -0.122871f, -0.129287f, -0.134060f, -0.138257f, -0.143042f, -0.148807f, -0.154441f, -0.158070f, -0.158906f, -0.157915f, -0.156673f, -0.156277f, -0.157153f, -0.158912f, -0.160379f, -0.160516f, -0.159249f, -0.156964f, -0.153673f, -0.149149f, -0.143200f, -0.135383f, -0.125140f, -0.112610f, -0.098657f, -0.084044f, -0.069283f, -0.055081f, -0.042021f, -0.030039f, -0.019014f, -0.009440f, -0.001841f, 0.003841f, 0.007710f, 0.009630f, 0.009945f, 0.009536f, 0.008864f, 0.007876f, 0.006845f, 0.006260f, 0.006131f, 0.006419f, 0.007674f, 0.010369f, 0.014373f, 0.019846f, 0.027504f, 0.037346f, 0.048440f, 0.060307f, 0.073056f, 0.086098f, 0.098456f, 0.110125f, 0.121485f, 0.132067f, 0.141513f, 0.150626f, 0.159945f, 0.168818f, 0.177104f, 0.185774f, 0.194992f, 0.203954f, 0.212873f, 0.222383f, 0.231384f, 0.238515f, 0.244594f, 0.250498f, 0.254857f, 0.256981f, 0.258841f, 0.261200f, 0.262096f, 0.261400f, 0.261397f, 0.261615f, 0.259828f, 0.257747f, 0.257682f, + 0.256474f, 0.252253f, 0.250769f, 0.253635f, 0.251629f, 0.243566f, 0.243777f, 0.253044f, 0.249024f, 0.229975f, 0.229614f, 0.251308f, 0.237376f, 0.164020f, 0.115660f, 0.179182f, 0.302935f, 0.361288f, 0.332595f, 0.300984f, 0.297187f, 0.266515f, 0.205485f, 0.199320f, 0.282776f, 0.373785f, 0.395770f, 0.375092f, 0.369258f, 0.379275f, 0.378846f, 0.358644f, 0.304226f, 0.203779f, 0.113276f, 0.133067f, 0.271506f, 0.405312f, 0.429713f, 0.382366f, 0.361258f, 0.383739f, 0.398504f, 0.388066f, 0.377952f, 0.369700f, 0.341555f, 0.307263f}, + {-0.022217f, -0.015375f, -0.018397f, -0.035300f, -0.046690f, -0.037732f, -0.022017f, -0.019869f, -0.019459f, 0.017327f, 0.102816f, 0.194710f, 0.234177f, 0.204599f, 0.138417f, 0.071733f, 0.010515f, -0.056797f, -0.132305f, -0.206318f, -0.271841f, -0.327874f, -0.371103f, -0.395052f, -0.398096f, -0.384964f, -0.359169f, -0.319562f, -0.265403f, -0.199868f, -0.126987f, -0.048878f, 0.032648f, 0.114915f, 0.195782f, 0.273182f, 0.342322f, 0.396309f, 0.431191f, 0.448778f, 0.453935f, 0.450961f, 0.442889f, 0.431917f, 0.419114f, 0.404570f, 0.388255f, 0.370115f, 0.349678f, 0.326644f, 0.301721f, 0.276201f, 0.251220f, 0.227989f, 0.207822f, 0.191043f, 0.176530f, 0.162962f, 0.149778f, 0.136591f, 0.122722f, 0.107799f, 0.091935f, 0.075014f, 0.056648f, 0.036913f, 0.016138f, -0.005944f, -0.029814f, -0.055061f, -0.080836f, -0.107214f, -0.134806f, -0.163054f, -0.190286f, -0.215551f, -0.238967f, -0.259885f, -0.276238f, -0.286705f, -0.292383f, -0.294992f, -0.294208f, -0.288458f, -0.278037f, -0.265391f, -0.251792f, -0.235652f, -0.215265f, -0.191614f, -0.166954f, -0.141873f, -0.115571f, -0.088358f, -0.062140f, -0.038532f, + -0.017724f, 0.000836f, 0.017500f, 0.032211f, 0.044805f, 0.055481f, 0.064916f, 0.073629f, 0.081559f, 0.088826f, 0.096406f, 0.105164f, 0.114511f, 0.122871f, 0.129287f, 0.134060f, 0.138257f, 0.143042f, 0.148807f, 0.154441f, 0.158070f, 0.158906f, 0.157915f, 0.156673f, 0.156277f, 0.157153f, 0.158912f, 0.160379f, 0.160516f, 0.159249f, 0.156964f, 0.153673f, 0.149149f, 0.143200f, 0.135383f, 0.125140f, 0.112610f, 0.098657f, 0.084044f, 0.069283f, 0.055081f, 0.042021f, 0.030039f, 0.019014f, 0.009440f, 0.001841f, -0.003841f, -0.007710f, -0.009630f, -0.009945f, -0.009536f, -0.008864f, -0.007876f, -0.006845f, -0.006260f, -0.006131f, -0.006419f, -0.007674f, -0.010369f, -0.014373f, -0.019846f, -0.027504f, -0.037346f, -0.048440f, -0.060307f, -0.073056f, -0.086098f, -0.098456f, -0.110125f, -0.121485f, -0.132067f, -0.141513f, -0.150626f, -0.159945f, -0.168818f, -0.177104f, -0.185774f, -0.194992f, -0.203954f, -0.212873f, -0.222383f, -0.231384f, -0.238515f, -0.244594f, -0.250498f, -0.254857f, -0.256981f, -0.258841f, -0.261200f, -0.262096f, -0.261400f, -0.261397f, -0.261615f, -0.259828f, -0.257747f, -0.257682f, + -0.256474f, -0.252253f, -0.250769f, -0.253635f, -0.251629f, -0.243566f, -0.243777f, -0.253044f, -0.249024f, -0.229975f, -0.229614f, -0.251308f, -0.237376f, -0.164020f, -0.115660f, -0.179182f, -0.302935f, -0.361288f, -0.332595f, -0.300984f, -0.297187f, -0.266515f, -0.205485f, -0.199320f, -0.282776f, -0.373785f, -0.395770f, -0.375092f, -0.369258f, -0.379275f, -0.378846f, -0.358644f, -0.304226f, -0.203779f, -0.113276f, -0.133067f, -0.271506f, -0.405312f, -0.429713f, -0.382366f, -0.361258f, -0.383739f, -0.398504f, -0.388066f, -0.377952f, -0.369700f, -0.341555f, -0.307263f} + }, + { + {0.003437f, -0.012198f, -0.001203f, 0.021097f, -0.002466f, -0.043512f, 0.000962f, 0.131262f, 0.193341f, 0.073245f, -0.141155f, -0.268143f, -0.241794f, -0.140847f, -0.054105f, 0.002619f, 0.050716f, 0.099528f, 0.145239f, 0.181794f, 0.200756f, 0.196431f, 0.173654f, 0.142090f, 0.107331f, 0.073891f, 0.048716f, 0.034602f, 0.027293f, 0.024058f, 0.027766f, 0.038832f, 0.050743f, 0.057603f, 0.060423f, 0.063103f, 0.066372f, 0.067205f, 0.061224f, 0.045463f, 0.021062f, -0.007194f, -0.035078f, -0.061177f, -0.084943f, -0.105741f, -0.124709f, -0.144522f, -0.166406f, -0.189512f, -0.213041f, -0.236632f, -0.259187f, -0.279363f, -0.296402f, -0.308917f, -0.314459f, -0.311746f, -0.301536f, -0.284320f, -0.259412f, -0.227155f, -0.189434f, -0.147199f, -0.099925f, -0.048097f, 0.006127f, 0.061017f, 0.115797f, 0.169006f, 0.218343f, 0.262025f, 0.298749f, 0.326845f, 0.345052f, 0.353588f, 0.353173f, 0.343709f, 0.325096f, 0.298746f, 0.267135f, 0.231913f, 0.193115f, 0.150515f, 0.105513f, 0.060953f, 0.018598f, -0.022322f, -0.063041f, -0.102759f, -0.139669f, -0.173357f, -0.204275f, -0.231780f, -0.254700f, -0.272996f, + -0.286913f, -0.295377f, -0.297011f, -0.291997f, -0.281495f, -0.266021f, -0.245380f, -0.219470f, -0.188934f, -0.156137f, -0.125122f, -0.098779f, -0.076246f, -0.054735f, -0.033488f, -0.014413f, 0.000330f, 0.009800f, 0.014374f, 0.015862f, 0.016591f, 0.017377f, 0.017391f, 0.016313f, 0.015068f, 0.014452f, 0.014844f, 0.017137f, 0.022089f, 0.029075f, 0.037043f, 0.045911f, 0.055611f, 0.064990f, 0.073012f, 0.079676f, 0.084818f, 0.087704f, 0.088459f, 0.088069f, 0.086787f, 0.084427f, 0.081841f, 0.080001f, 0.078313f, 0.075848f, 0.073092f, 0.070651f, 0.067838f, 0.064177f, 0.060367f, 0.056565f, 0.051968f, 0.046818f, 0.042330f, 0.038426f, 0.034201f, 0.030169f, 0.027300f, 0.024914f, 0.022225f, 0.020280f, 0.019900f, 0.019979f, 0.019917f, 0.020854f, 0.022870f, 0.024349f, 0.025106f, 0.026471f, 0.028137f, 0.028929f, 0.029895f, 0.032523f, 0.035592f, 0.037737f, 0.040348f, 0.044286f, 0.047546f, 0.049185f, 0.050714f, 0.051542f, 0.048951f, 0.043598f, 0.038299f, 0.031936f, 0.022010f, 0.010903f, 0.001637f, -0.008334f, -0.021151f, -0.033005f, -0.042008f, -0.052364f, -0.064471f, -0.073163f, + -0.079941f, -0.090963f, -0.101864f, -0.105166f, -0.109415f, -0.124289f, -0.135694f, -0.130563f, -0.130580f, -0.154548f, -0.170385f, -0.149105f, -0.139181f, -0.196892f, -0.261751f, -0.216013f, -0.071571f, 0.026285f, 0.005174f, -0.050751f, -0.064299f, -0.081628f, -0.152957f, -0.210051f, -0.161120f, -0.036845f, 0.049592f, 0.047608f, 0.003439f, -0.026155f, -0.042297f, -0.092917f, -0.208966f, -0.338758f, -0.363990f, -0.229119f, -0.040285f, 0.032605f, -0.046756f, -0.151981f, -0.170066f, -0.127443f, -0.110599f, -0.135320f, -0.151985f, -0.135982f, -0.110796f, -0.098463f}, + {-0.003437f, 0.012198f, 0.001203f, -0.021097f, 0.002466f, 0.043512f, -0.000962f, -0.131262f, -0.193341f, -0.073245f, 0.141155f, 0.268143f, 0.241794f, 0.140847f, 0.054105f, -0.002619f, -0.050716f, -0.099528f, -0.145239f, -0.181794f, -0.200756f, -0.196431f, -0.173654f, -0.142090f, -0.107331f, -0.073891f, -0.048716f, -0.034602f, -0.027293f, -0.024058f, -0.027766f, -0.038832f, -0.050743f, -0.057603f, -0.060423f, -0.063103f, -0.066372f, -0.067205f, -0.061224f, -0.045463f, -0.021062f, 0.007194f, 0.035078f, 0.061177f, 0.084943f, 0.105741f, 0.124709f, 0.144522f, 0.166406f, 0.189512f, 0.213041f, 0.236632f, 0.259187f, 0.279363f, 0.296402f, 0.308917f, 0.314459f, 0.311746f, 0.301536f, 0.284320f, 0.259412f, 0.227155f, 0.189434f, 0.147199f, 0.099925f, 0.048097f, -0.006127f, -0.061017f, -0.115797f, -0.169006f, -0.218343f, -0.262025f, -0.298749f, -0.326845f, -0.345052f, -0.353588f, -0.353173f, -0.343709f, -0.325096f, -0.298746f, -0.267135f, -0.231913f, -0.193115f, -0.150515f, -0.105513f, -0.060953f, -0.018598f, 0.022322f, 0.063041f, 0.102759f, 0.139669f, 0.173357f, 0.204275f, 0.231780f, 0.254700f, 0.272996f, + 0.286913f, 0.295377f, 0.297011f, 0.291997f, 0.281495f, 0.266021f, 0.245380f, 0.219470f, 0.188934f, 0.156137f, 0.125122f, 0.098779f, 0.076246f, 0.054735f, 0.033488f, 0.014413f, -0.000330f, -0.009800f, -0.014374f, -0.015862f, -0.016591f, -0.017377f, -0.017391f, -0.016313f, -0.015068f, -0.014452f, -0.014844f, -0.017137f, -0.022089f, -0.029075f, -0.037043f, -0.045911f, -0.055611f, -0.064990f, -0.073012f, -0.079676f, -0.084818f, -0.087704f, -0.088459f, -0.088069f, -0.086787f, -0.084427f, -0.081841f, -0.080001f, -0.078313f, -0.075848f, -0.073092f, -0.070651f, -0.067838f, -0.064177f, -0.060367f, -0.056565f, -0.051968f, -0.046818f, -0.042330f, -0.038426f, -0.034201f, -0.030169f, -0.027300f, -0.024914f, -0.022225f, -0.020280f, -0.019900f, -0.019979f, -0.019917f, -0.020854f, -0.022870f, -0.024349f, -0.025106f, -0.026471f, -0.028137f, -0.028929f, -0.029895f, -0.032523f, -0.035592f, -0.037737f, -0.040348f, -0.044286f, -0.047546f, -0.049185f, -0.050714f, -0.051542f, -0.048951f, -0.043598f, -0.038299f, -0.031936f, -0.022010f, -0.010903f, -0.001637f, 0.008334f, 0.021151f, 0.033005f, 0.042008f, 0.052364f, 0.064471f, 0.073163f, + 0.079941f, 0.090963f, 0.101864f, 0.105166f, 0.109415f, 0.124289f, 0.135694f, 0.130563f, 0.130580f, 0.154548f, 0.170385f, 0.149105f, 0.139181f, 0.196892f, 0.261751f, 0.216013f, 0.071571f, -0.026285f, -0.005174f, 0.050751f, 0.064299f, 0.081628f, 0.152957f, 0.210051f, 0.161120f, 0.036845f, -0.049592f, -0.047608f, -0.003439f, 0.026155f, 0.042297f, 0.092917f, 0.208966f, 0.338758f, 0.363990f, 0.229119f, 0.040285f, -0.032605f, 0.046756f, 0.151981f, 0.170066f, 0.127443f, 0.110599f, 0.135320f, 0.151985f, 0.135982f, 0.110796f, 0.098463f} + }, + { + {-0.013125f, -0.012286f, -0.029270f, -0.061330f, -0.081694f, -0.084134f, -0.091685f, -0.102795f, -0.065219f, 0.061788f, 0.237540f, 0.366702f, 0.391070f, 0.329203f, 0.231539f, 0.128665f, 0.030035f, -0.055797f, -0.120914f, -0.167779f, -0.204453f, -0.233321f, -0.251764f, -0.259124f, -0.256054f, -0.240951f, -0.214156f, -0.184034f, -0.162756f, -0.155363f, -0.156163f, -0.155957f, -0.150073f, -0.139152f, -0.125066f, -0.108295f, -0.088604f, -0.066285f, -0.041833f, -0.015371f, 0.012408f, 0.039073f, 0.061555f, 0.078734f, 0.092119f, 0.103815f, 0.114599f, 0.124104f, 0.131882f, 0.137736f, 0.141533f, 0.143131f, 0.142328f, 0.138733f, 0.131953f, 0.122040f, 0.109684f, 0.095975f, 0.082044f, 0.068749f, 0.056557f, 0.045720f, 0.036579f, 0.029561f, 0.024955f, 0.022883f, 0.023595f, 0.027669f, 0.035746f, 0.048030f, 0.064154f, 0.083701f, 0.106779f, 0.133727f, 0.164258f, 0.197388f, 0.232365f, 0.269041f, 0.306917f, 0.344448f, 0.379910f, 0.412508f, 0.441996f, 0.467563f, 0.487862f, 0.502016f, 0.509982f, 0.512033f, 0.508380f, 0.499122f, 0.483934f, 0.461848f, 0.432088f, 0.395456f, 0.354502f, 0.311899f, + 0.268761f, 0.224882f, 0.180662f, 0.138577f, 0.102422f, 0.074928f, 0.056036f, 0.043532f, 0.035361f, 0.031276f, 0.032342f, 0.039114f, 0.050516f, 0.064273f, 0.078040f, 0.090120f, 0.099605f, 0.106269f, 0.110292f, 0.111800f, 0.110505f, 0.105782f, 0.097125f, 0.084634f, 0.069175f, 0.052019f, 0.034230f, 0.016325f, -0.001585f, -0.019467f, -0.037208f, -0.054624f, -0.071625f, -0.088455f, -0.105611f, -0.123311f, -0.141167f, -0.158623f, -0.175578f, -0.192349f, -0.209294f, -0.226791f, -0.245271f, -0.264788f, -0.284670f, -0.303913f, -0.321795f, -0.337907f, -0.351875f, -0.363338f, -0.372063f, -0.377966f, -0.381198f, -0.382224f, -0.381582f, -0.379626f, -0.376697f, -0.373288f, -0.369744f, -0.366057f, -0.362215f, -0.358447f, -0.354924f, -0.351586f, -0.348440f, -0.345609f, -0.342984f, -0.340226f, -0.337164f, -0.333840f, -0.330365f, -0.327079f, -0.324467f, -0.322570f, -0.320900f, -0.319189f, -0.317555f, -0.315784f, -0.313305f, -0.309987f, -0.306067f, -0.301378f, -0.295609f, -0.289009f, -0.281841f, -0.273722f, -0.264499f, -0.254839f, -0.245040f, -0.234614f, -0.223819f, -0.213828f, -0.204802f, -0.195896f, -0.187327f, -0.179883f, + -0.172843f, -0.165369f, -0.158571f, -0.152828f, -0.145851f, -0.137397f, -0.131226f, -0.127613f, -0.121187f, -0.112221f, -0.109209f, -0.111868f, -0.106951f, -0.093814f, -0.094519f, -0.118779f, -0.140589f, -0.136582f, -0.124286f, -0.127257f, -0.127194f, -0.098697f, -0.071650f, -0.098895f, -0.168848f, -0.212657f, -0.201109f, -0.174379f, -0.169160f, -0.176945f, -0.183912f, -0.189724f, -0.175821f, -0.122967f, -0.075644f, -0.113343f, -0.231230f, -0.325873f, -0.333768f, -0.305146f, -0.299949f, -0.300130f, -0.283939f, -0.290832f, -0.324013f, -0.278523f, -0.090004f, 0.105839f}, + {-0.013125f, -0.012286f, -0.029270f, -0.061330f, -0.081694f, -0.084134f, -0.091685f, -0.102795f, -0.065219f, 0.061788f, 0.237540f, 0.366702f, 0.391070f, 0.329203f, 0.231539f, 0.128665f, 0.030035f, -0.055797f, -0.120914f, -0.167779f, -0.204453f, -0.233321f, -0.251764f, -0.259124f, -0.256054f, -0.240951f, -0.214156f, -0.184034f, -0.162756f, -0.155363f, -0.156163f, -0.155957f, -0.150073f, -0.139152f, -0.125066f, -0.108295f, -0.088604f, -0.066285f, -0.041833f, -0.015371f, 0.012408f, 0.039073f, 0.061555f, 0.078734f, 0.092119f, 0.103815f, 0.114599f, 0.124104f, 0.131882f, 0.137736f, 0.141533f, 0.143131f, 0.142328f, 0.138733f, 0.131953f, 0.122040f, 0.109684f, 0.095975f, 0.082044f, 0.068749f, 0.056557f, 0.045720f, 0.036579f, 0.029561f, 0.024955f, 0.022883f, 0.023595f, 0.027669f, 0.035746f, 0.048030f, 0.064154f, 0.083701f, 0.106779f, 0.133727f, 0.164258f, 0.197388f, 0.232365f, 0.269041f, 0.306917f, 0.344448f, 0.379910f, 0.412508f, 0.441996f, 0.467563f, 0.487862f, 0.502016f, 0.509982f, 0.512033f, 0.508380f, 0.499122f, 0.483934f, 0.461848f, 0.432088f, 0.395456f, 0.354502f, 0.311899f, + 0.268761f, 0.224882f, 0.180662f, 0.138577f, 0.102422f, 0.074928f, 0.056036f, 0.043532f, 0.035361f, 0.031276f, 0.032342f, 0.039114f, 0.050516f, 0.064273f, 0.078040f, 0.090120f, 0.099605f, 0.106269f, 0.110292f, 0.111800f, 0.110505f, 0.105782f, 0.097125f, 0.084634f, 0.069175f, 0.052019f, 0.034230f, 0.016325f, -0.001585f, -0.019467f, -0.037208f, -0.054624f, -0.071625f, -0.088455f, -0.105611f, -0.123311f, -0.141167f, -0.158623f, -0.175578f, -0.192349f, -0.209294f, -0.226791f, -0.245271f, -0.264788f, -0.284670f, -0.303913f, -0.321795f, -0.337907f, -0.351875f, -0.363338f, -0.372063f, -0.377966f, -0.381198f, -0.382224f, -0.381582f, -0.379626f, -0.376697f, -0.373288f, -0.369744f, -0.366057f, -0.362215f, -0.358447f, -0.354924f, -0.351586f, -0.348440f, -0.345609f, -0.342984f, -0.340226f, -0.337164f, -0.333840f, -0.330365f, -0.327079f, -0.324467f, -0.322570f, -0.320900f, -0.319189f, -0.317555f, -0.315784f, -0.313305f, -0.309987f, -0.306067f, -0.301378f, -0.295609f, -0.289009f, -0.281841f, -0.273722f, -0.264499f, -0.254839f, -0.245040f, -0.234614f, -0.223819f, -0.213828f, -0.204802f, -0.195896f, -0.187327f, -0.179883f, + -0.172843f, -0.165369f, -0.158571f, -0.152828f, -0.145851f, -0.137397f, -0.131226f, -0.127613f, -0.121187f, -0.112221f, -0.109209f, -0.111868f, -0.106951f, -0.093814f, -0.094519f, -0.118779f, -0.140589f, -0.136582f, -0.124286f, -0.127257f, -0.127194f, -0.098697f, -0.071650f, -0.098895f, -0.168848f, -0.212657f, -0.201109f, -0.174379f, -0.169160f, -0.176945f, -0.183912f, -0.189724f, -0.175821f, -0.122967f, -0.075644f, -0.113343f, -0.231230f, -0.325873f, -0.333768f, -0.305146f, -0.299949f, -0.300130f, -0.283939f, -0.290832f, -0.324013f, -0.278523f, -0.090004f, 0.105839f} + }, + { + {0.050610f, -0.021351f, -0.100660f, -0.104774f, -0.001476f, 0.148669f, 0.225308f, 0.152954f, -0.017164f, -0.150555f, -0.164165f, -0.095774f, -0.032833f, -0.010556f, -0.007376f, -0.005342f, -0.006979f, -0.005520f, 0.015106f, 0.047669f, 0.063520f, 0.053315f, 0.039601f, 0.043141f, 0.059336f, 0.074668f, 0.086926f, 0.099752f, 0.110453f, 0.112472f, 0.103586f, 0.087024f, 0.068584f, 0.053729f, 0.043401f, 0.032419f, 0.014740f, -0.010636f, -0.040573f, -0.071513f, -0.100005f, -0.122661f, -0.138393f, -0.148847f, -0.155444f, -0.158100f, -0.157286f, -0.154654f, -0.151141f, -0.146642f, -0.141589f, -0.136794f, -0.132018f, -0.126472f, -0.120197f, -0.113478f, -0.105693f, -0.096136f, -0.085272f, -0.074193f, -0.063578f, -0.053837f, -0.045575f, -0.039450f, -0.035848f, -0.034577f, -0.034666f, -0.035080f, -0.035819f, -0.037340f, -0.038869f, -0.038729f, -0.036395f, -0.032558f, -0.026954f, -0.017828f, -0.003894f, 0.014663f, 0.037307f, 0.063972f, 0.094584f, 0.128616f, 0.164960f, 0.201947f, 0.238243f, 0.273778f, 0.308471f, 0.340250f, 0.366585f, 0.388241f, 0.408822f, 0.429564f, 0.446929f, 0.456648f, 0.458222f, 0.454015f, + 0.445283f, 0.430644f, 0.408172f, 0.378082f, 0.342964f, 0.305191f, 0.264513f, 0.219134f, 0.169076f, 0.117258f, 0.067008f, 0.019484f, -0.026357f, -0.072188f, -0.118578f, -0.163875f, -0.204958f, -0.239778f, -0.268783f, -0.293465f, -0.314413f, -0.331340f, -0.343971f, -0.352262f, -0.356602f, -0.358148f, -0.358147f, -0.356868f, -0.354035f, -0.349981f, -0.345415f, -0.340428f, -0.334505f, -0.326935f, -0.316753f, -0.303400f, -0.288003f, -0.272824f, -0.259031f, -0.246114f, -0.233327f, -0.220114f, -0.205519f, -0.189122f, -0.172346f, -0.157167f, -0.143959f, -0.132013f, -0.121111f, -0.111003f, -0.100614f, -0.089445f, -0.078639f, -0.069419f, -0.061736f, -0.055228f, -0.049885f, -0.045103f, -0.039720f, -0.033390f, -0.026593f, -0.019544f, -0.012457f, -0.006080f, -0.000606f, 0.004882f, 0.010838f, 0.016694f, 0.022579f, 0.029413f, 0.036726f, 0.042841f, 0.047462f, 0.051547f, 0.054909f, 0.056743f, 0.057750f, 0.058983f, 0.059835f, 0.059730f, 0.059790f, 0.060557f, 0.060792f, 0.060463f, 0.061464f, 0.063958f, 0.066147f, 0.068356f, 0.072542f, 0.077895f, 0.082279f, 0.086766f, 0.093073f, 0.099166f, 0.103431f, 0.108681f, + 0.115924f, 0.120958f, 0.123369f, 0.129092f, 0.137670f, 0.140558f, 0.138996f, 0.145136f, 0.157044f, 0.157137f, 0.147369f, 0.154619f, 0.181695f, 0.189239f, 0.157222f, 0.128976f, 0.151684f, 0.202074f, 0.221839f, 0.206540f, 0.201774f, 0.218344f, 0.212651f, 0.164038f, 0.118748f, 0.127617f, 0.174253f, 0.199599f, 0.180895f, 0.151327f, 0.140967f, 0.129460f, 0.078567f, -0.000953f, -0.044718f, -0.008185f, 0.074463f, 0.126113f, 0.114079f, 0.078761f, 0.073555f, 0.099683f, 0.115917f, 0.100920f, 0.084812f, 0.112488f, 0.184986f, 0.249040f}, + {0.050610f, -0.021351f, -0.100660f, -0.104774f, -0.001476f, 0.148669f, 0.225308f, 0.152954f, -0.017164f, -0.150555f, -0.164165f, -0.095774f, -0.032833f, -0.010556f, -0.007376f, -0.005342f, -0.006979f, -0.005520f, 0.015106f, 0.047669f, 0.063520f, 0.053315f, 0.039601f, 0.043141f, 0.059336f, 0.074668f, 0.086926f, 0.099752f, 0.110453f, 0.112472f, 0.103586f, 0.087024f, 0.068584f, 0.053729f, 0.043401f, 0.032419f, 0.014740f, -0.010636f, -0.040573f, -0.071513f, -0.100005f, -0.122661f, -0.138393f, -0.148847f, -0.155444f, -0.158100f, -0.157286f, -0.154654f, -0.151141f, -0.146642f, -0.141589f, -0.136794f, -0.132018f, -0.126472f, -0.120197f, -0.113478f, -0.105693f, -0.096136f, -0.085272f, -0.074193f, -0.063578f, -0.053837f, -0.045575f, -0.039450f, -0.035848f, -0.034577f, -0.034666f, -0.035080f, -0.035819f, -0.037340f, -0.038869f, -0.038729f, -0.036395f, -0.032558f, -0.026954f, -0.017828f, -0.003894f, 0.014663f, 0.037307f, 0.063972f, 0.094584f, 0.128616f, 0.164960f, 0.201947f, 0.238243f, 0.273778f, 0.308471f, 0.340250f, 0.366585f, 0.388241f, 0.408822f, 0.429564f, 0.446929f, 0.456648f, 0.458222f, 0.454015f, + 0.445283f, 0.430644f, 0.408172f, 0.378082f, 0.342964f, 0.305191f, 0.264513f, 0.219134f, 0.169076f, 0.117258f, 0.067008f, 0.019484f, -0.026357f, -0.072188f, -0.118578f, -0.163875f, -0.204958f, -0.239778f, -0.268783f, -0.293465f, -0.314413f, -0.331340f, -0.343971f, -0.352262f, -0.356602f, -0.358148f, -0.358147f, -0.356868f, -0.354035f, -0.349981f, -0.345415f, -0.340428f, -0.334505f, -0.326935f, -0.316753f, -0.303400f, -0.288003f, -0.272824f, -0.259031f, -0.246114f, -0.233327f, -0.220114f, -0.205519f, -0.189122f, -0.172346f, -0.157167f, -0.143959f, -0.132013f, -0.121111f, -0.111003f, -0.100614f, -0.089445f, -0.078639f, -0.069419f, -0.061736f, -0.055228f, -0.049885f, -0.045103f, -0.039720f, -0.033390f, -0.026593f, -0.019544f, -0.012457f, -0.006080f, -0.000606f, 0.004882f, 0.010838f, 0.016694f, 0.022579f, 0.029413f, 0.036726f, 0.042841f, 0.047462f, 0.051547f, 0.054909f, 0.056743f, 0.057750f, 0.058983f, 0.059835f, 0.059730f, 0.059790f, 0.060557f, 0.060792f, 0.060463f, 0.061464f, 0.063958f, 0.066147f, 0.068356f, 0.072542f, 0.077895f, 0.082279f, 0.086766f, 0.093073f, 0.099166f, 0.103431f, 0.108681f, + 0.115924f, 0.120958f, 0.123369f, 0.129092f, 0.137670f, 0.140558f, 0.138996f, 0.145136f, 0.157044f, 0.157137f, 0.147369f, 0.154619f, 0.181695f, 0.189239f, 0.157222f, 0.128976f, 0.151684f, 0.202074f, 0.221839f, 0.206540f, 0.201774f, 0.218344f, 0.212651f, 0.164038f, 0.118748f, 0.127617f, 0.174253f, 0.199599f, 0.180895f, 0.151327f, 0.140967f, 0.129460f, 0.078567f, -0.000953f, -0.044718f, -0.008185f, 0.074463f, 0.126113f, 0.114079f, 0.078761f, 0.073555f, 0.099683f, 0.115917f, 0.100920f, 0.084812f, 0.112488f, 0.184986f, 0.249040f} + }, + { + {-0.007259f, 0.065962f, 0.096309f, 0.006203f, -0.159743f, -0.308935f, -0.381128f, -0.338419f, -0.157384f, 0.121690f, 0.390091f, 0.561354f, 0.636734f, 0.654536f, 0.616285f, 0.502886f, 0.333745f, 0.163082f, 0.024174f, -0.091879f, -0.205022f, -0.317570f, -0.417716f, -0.495244f, -0.549209f, -0.586773f, -0.616327f, -0.639690f, -0.652018f, -0.649196f, -0.631826f, -0.601837f, -0.559630f, -0.505851f, -0.442897f, -0.373591f, -0.300236f, -0.225238f, -0.151321f, -0.081172f, -0.017263f, 0.039030f, 0.088587f, 0.133536f, 0.174581f, 0.210389f, 0.239635f, 0.262423f, 0.279828f, 0.293433f, 0.305269f, 0.316863f, 0.328072f, 0.337528f, 0.344140f, 0.347611f, 0.347874f, 0.344828f, 0.338652f, 0.329942f, 0.319435f, 0.307658f, 0.294798f, 0.280926f, 0.266291f, 0.251209f, 0.235746f, 0.219931f, 0.204222f, 0.189273f, 0.175236f, 0.161855f, 0.149231f, 0.137841f, 0.127719f, 0.118342f, 0.109578f, 0.102141f, 0.096648f, 0.092633f, 0.088918f, 0.084709f, 0.079908f, 0.074514f, 0.068253f, 0.061036f, 0.053526f, 0.046953f, 0.042328f, 0.039859f, 0.039087f, 0.039576f, 0.041346f, 0.044345f, 0.047321f, 0.047623f, + 0.042687f, 0.031837f, 0.016339f, -0.002376f, -0.024180f, -0.049770f, -0.078870f, -0.109212f, -0.137584f, -0.161947f, -0.182317f, -0.199471f, -0.213209f, -0.222271f, -0.225693f, -0.223821f, -0.218155f, -0.210460f, -0.201796f, -0.192062f, -0.180645f, -0.167638f, -0.154215f, -0.141821f, -0.131276f, -0.122438f, -0.114188f, -0.104943f, -0.093887f, -0.081673f, -0.069541f, -0.058028f, -0.046937f, -0.035989f, -0.024863f, -0.013051f, -0.000327f, 0.012968f, 0.026458f, 0.040102f, 0.053835f, 0.067424f, 0.080870f, 0.094376f, 0.107841f, 0.120849f, 0.133049f, 0.144070f, 0.153324f, 0.160345f, 0.165072f, 0.167561f, 0.167875f, 0.166359f, 0.163402f, 0.158903f, 0.152585f, 0.144627f, 0.135297f, 0.124447f, 0.112145f, 0.099225f, 0.086451f, 0.073867f, 0.061586f, 0.050227f, 0.039978f, 0.030333f, 0.021214f, 0.013255f, 0.006789f, 0.001699f, -0.001887f, -0.003958f, -0.005254f, -0.006402f, -0.007235f, -0.007883f, -0.009180f, -0.011060f, -0.012189f, -0.011989f, -0.011177f, -0.009936f, -0.007788f, -0.005316f, -0.003617f, -0.002436f, -0.001133f, -0.000357f, -0.000436f, -0.000049f, 0.001324f, 0.002343f, 0.002892f, 0.004473f, + 0.006454f, 0.006882f, 0.007116f, 0.009391f, 0.011036f, 0.009231f, 0.008488f, 0.012900f, 0.016080f, 0.012730f, 0.012822f, 0.025048f, 0.034679f, 0.024410f, 0.011274f, 0.029631f, 0.076704f, 0.110326f, 0.108291f, 0.095726f, 0.100643f, 0.113980f, 0.112557f, 0.097168f, 0.087042f, 0.092041f, 0.107251f, 0.124685f, 0.138049f, 0.143937f, 0.145917f, 0.147885f, 0.136336f, 0.082786f, -0.018275f, -0.118932f, -0.151821f, -0.107798f, -0.055208f, -0.053504f, -0.072264f, -0.048152f, -0.003743f, -0.018576f, -0.062348f, 0.027201f, 0.312207f, 0.589094f}, + {-0.007259f, 0.065962f, 0.096309f, 0.006203f, -0.159743f, -0.308935f, -0.381128f, -0.338419f, -0.157384f, 0.121690f, 0.390091f, 0.561354f, 0.636734f, 0.654536f, 0.616285f, 0.502886f, 0.333745f, 0.163082f, 0.024174f, -0.091879f, -0.205022f, -0.317570f, -0.417716f, -0.495244f, -0.549209f, -0.586773f, -0.616327f, -0.639690f, -0.652018f, -0.649196f, -0.631826f, -0.601837f, -0.559630f, -0.505851f, -0.442897f, -0.373591f, -0.300236f, -0.225238f, -0.151321f, -0.081172f, -0.017263f, 0.039030f, 0.088587f, 0.133536f, 0.174581f, 0.210389f, 0.239635f, 0.262423f, 0.279828f, 0.293433f, 0.305269f, 0.316863f, 0.328072f, 0.337528f, 0.344140f, 0.347611f, 0.347874f, 0.344828f, 0.338652f, 0.329942f, 0.319435f, 0.307658f, 0.294798f, 0.280926f, 0.266291f, 0.251209f, 0.235746f, 0.219931f, 0.204222f, 0.189273f, 0.175236f, 0.161855f, 0.149231f, 0.137841f, 0.127719f, 0.118342f, 0.109578f, 0.102141f, 0.096648f, 0.092633f, 0.088918f, 0.084709f, 0.079908f, 0.074514f, 0.068253f, 0.061036f, 0.053526f, 0.046953f, 0.042328f, 0.039859f, 0.039087f, 0.039576f, 0.041346f, 0.044345f, 0.047321f, 0.047623f, + 0.042687f, 0.031837f, 0.016339f, -0.002376f, -0.024180f, -0.049770f, -0.078870f, -0.109212f, -0.137584f, -0.161947f, -0.182317f, -0.199471f, -0.213209f, -0.222271f, -0.225693f, -0.223821f, -0.218155f, -0.210460f, -0.201796f, -0.192062f, -0.180645f, -0.167638f, -0.154215f, -0.141821f, -0.131276f, -0.122438f, -0.114188f, -0.104943f, -0.093887f, -0.081673f, -0.069541f, -0.058028f, -0.046937f, -0.035989f, -0.024863f, -0.013051f, -0.000327f, 0.012968f, 0.026458f, 0.040102f, 0.053835f, 0.067424f, 0.080870f, 0.094376f, 0.107841f, 0.120849f, 0.133049f, 0.144070f, 0.153324f, 0.160345f, 0.165072f, 0.167561f, 0.167875f, 0.166359f, 0.163402f, 0.158903f, 0.152585f, 0.144627f, 0.135297f, 0.124447f, 0.112145f, 0.099225f, 0.086451f, 0.073867f, 0.061586f, 0.050227f, 0.039978f, 0.030333f, 0.021214f, 0.013255f, 0.006789f, 0.001699f, -0.001887f, -0.003958f, -0.005254f, -0.006402f, -0.007235f, -0.007883f, -0.009180f, -0.011060f, -0.012189f, -0.011989f, -0.011177f, -0.009936f, -0.007788f, -0.005316f, -0.003617f, -0.002436f, -0.001133f, -0.000357f, -0.000436f, -0.000049f, 0.001324f, 0.002343f, 0.002892f, 0.004473f, + 0.006454f, 0.006882f, 0.007116f, 0.009391f, 0.011036f, 0.009231f, 0.008488f, 0.012900f, 0.016080f, 0.012730f, 0.012822f, 0.025048f, 0.034679f, 0.024410f, 0.011274f, 0.029631f, 0.076704f, 0.110326f, 0.108291f, 0.095726f, 0.100643f, 0.113980f, 0.112557f, 0.097168f, 0.087042f, 0.092041f, 0.107251f, 0.124685f, 0.138049f, 0.143937f, 0.145917f, 0.147885f, 0.136336f, 0.082786f, -0.018275f, -0.118932f, -0.151821f, -0.107798f, -0.055208f, -0.053504f, -0.072264f, -0.048152f, -0.003743f, -0.018576f, -0.062348f, 0.027201f, 0.312207f, 0.589094f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]={ + { + {-0.279578f, -0.717721f, -0.877611f, -0.774906f, -0.535062f, -0.269989f, -0.021067f, 0.209874f, 0.413226f, 0.563225f, 0.637276f, 0.629373f, 0.548884f, 0.414833f, 0.250811f, 0.079096f, -0.084627f, -0.232375f, -0.360791f, -0.467119f, -0.547631f, -0.599855f, -0.625984f, -0.632346f, -0.624188f, -0.602062f, -0.564595f, -0.513530f, -0.454080f, -0.391123f, -0.327168f, -0.263808f, -0.202953f, -0.145944f, -0.092780f, -0.042980f, 0.003472f, 0.046452f, 0.086451f, 0.124553f, 0.161794f, 0.198667f, 0.235068f, 0.270617f, 0.305017f, 0.338134f, 0.369878f, 0.400174f, 0.429020f, 0.456378f, 0.482018f, 0.505631f, 0.527097f, 0.546486f, 0.563827f, 0.579121f, 0.592594f, 0.604726f, 0.615911f, 0.626238f, 0.635705f, 0.644462f, 0.652664f, 0.660229f, 0.667010f, 0.673113f, 0.678788f, 0.684082f, 0.688924f, 0.693472f, 0.698001f, 0.702510f, 0.706806f, 0.710936f, 0.715101f, 0.719195f, 0.722909f, 0.726269f, 0.729530f, 0.732512f, 0.734617f, 0.735606f, 0.735863f, 0.735678f, 0.734755f, 0.732698f, 0.729673f, 0.726255f, 0.722712f, 0.718664f, 0.713561f, 0.707417f, 0.700900f, 0.694611f, 0.688481f, 0.682146f, + 0.675755f, 0.670059f, 0.665672f, 0.662528f, 0.660105f, 0.658010f, 0.656294f, 0.655275f, 0.655042f, 0.655135f, 0.654860f, 0.653870f, 0.652278f, 0.650245f, 0.647706f, 0.644488f, 0.640451f, 0.635518f, 0.629758f, 0.623449f, 0.616889f, 0.610232f, 0.603544f, 0.596898f, 0.590297f, 0.583682f, 0.577056f, 0.570442f, 0.563736f, 0.556801f, 0.549678f, 0.542492f, 0.535279f, 0.528093f, 0.521154f, 0.514648f, 0.508527f, 0.502690f, 0.497140f, 0.491836f, 0.486633f, 0.481501f, 0.476572f, 0.471906f, 0.467418f, 0.463039f, 0.458686f, 0.454164f, 0.449331f, 0.444241f, 0.438935f, 0.433317f, 0.427381f, 0.421288f, 0.415067f, 0.408572f, 0.401819f, 0.394993f, 0.388100f, 0.381032f, 0.373904f, 0.366955f, 0.360223f, 0.353709f, 0.347609f, 0.342029f, 0.336786f, 0.331780f, 0.327133f, 0.322727f, 0.318173f, 0.313407f, 0.308724f, 0.304155f, 0.299488f, 0.294851f, 0.290528f, 0.286392f, 0.282213f, 0.278211f, 0.274620f, 0.271203f, 0.267853f, 0.264940f, 0.262515f, 0.260046f, 0.257391f, 0.254933f, 0.252512f, 0.249509f, 0.246067f, 0.242749f, 0.239216f, 0.234883f, 0.230316f, 0.226146f, + 0.221603f, 0.216109f, 0.210802f, 0.206272f, 0.200974f, 0.194324f, 0.188446f, 0.183987f, 0.178038f, 0.169726f, 0.163182f, 0.160324f, 0.155860f, 0.145447f, 0.133826f, 0.127980f, 0.126532f, 0.122924f, 0.114883f, 0.103866f, 0.090500f, 0.079053f, 0.080753f, 0.100935f, 0.125261f, 0.130967f, 0.113407f, 0.091776f, 0.085866f, 0.095550f, 0.107946f, 0.118310f, 0.135431f, 0.165381f, 0.195627f, 0.202054f, 0.174034f, 0.127848f, 0.089951f, 0.070123f, 0.058538f, 0.046398f, 0.036783f, 0.032164f, 0.024778f, 0.009249f, -0.004637f, -0.004463f}, + {-0.279578f, -0.717721f, -0.877611f, -0.774906f, -0.535062f, -0.269989f, -0.021067f, 0.209874f, 0.413226f, 0.563225f, 0.637276f, 0.629373f, 0.548884f, 0.414833f, 0.250811f, 0.079096f, -0.084627f, -0.232375f, -0.360791f, -0.467119f, -0.547631f, -0.599855f, -0.625984f, -0.632346f, -0.624188f, -0.602062f, -0.564595f, -0.513530f, -0.454080f, -0.391123f, -0.327168f, -0.263808f, -0.202953f, -0.145944f, -0.092780f, -0.042980f, 0.003472f, 0.046452f, 0.086451f, 0.124553f, 0.161794f, 0.198667f, 0.235068f, 0.270617f, 0.305017f, 0.338134f, 0.369878f, 0.400174f, 0.429020f, 0.456378f, 0.482018f, 0.505631f, 0.527097f, 0.546486f, 0.563827f, 0.579121f, 0.592594f, 0.604726f, 0.615911f, 0.626238f, 0.635705f, 0.644462f, 0.652664f, 0.660229f, 0.667010f, 0.673113f, 0.678788f, 0.684082f, 0.688924f, 0.693472f, 0.698001f, 0.702510f, 0.706806f, 0.710936f, 0.715101f, 0.719195f, 0.722909f, 0.726269f, 0.729530f, 0.732512f, 0.734617f, 0.735606f, 0.735863f, 0.735678f, 0.734755f, 0.732698f, 0.729673f, 0.726255f, 0.722712f, 0.718664f, 0.713561f, 0.707417f, 0.700900f, 0.694611f, 0.688481f, 0.682146f, + 0.675755f, 0.670059f, 0.665672f, 0.662528f, 0.660105f, 0.658010f, 0.656294f, 0.655275f, 0.655042f, 0.655135f, 0.654860f, 0.653870f, 0.652278f, 0.650245f, 0.647706f, 0.644488f, 0.640451f, 0.635518f, 0.629758f, 0.623449f, 0.616889f, 0.610232f, 0.603544f, 0.596898f, 0.590297f, 0.583682f, 0.577056f, 0.570442f, 0.563736f, 0.556801f, 0.549678f, 0.542492f, 0.535279f, 0.528093f, 0.521154f, 0.514648f, 0.508527f, 0.502690f, 0.497140f, 0.491836f, 0.486633f, 0.481501f, 0.476572f, 0.471906f, 0.467418f, 0.463039f, 0.458686f, 0.454164f, 0.449331f, 0.444241f, 0.438935f, 0.433317f, 0.427381f, 0.421288f, 0.415067f, 0.408572f, 0.401819f, 0.394993f, 0.388100f, 0.381032f, 0.373904f, 0.366955f, 0.360223f, 0.353709f, 0.347609f, 0.342029f, 0.336786f, 0.331780f, 0.327133f, 0.322727f, 0.318173f, 0.313407f, 0.308724f, 0.304155f, 0.299488f, 0.294851f, 0.290528f, 0.286392f, 0.282213f, 0.278211f, 0.274620f, 0.271203f, 0.267853f, 0.264940f, 0.262515f, 0.260046f, 0.257391f, 0.254933f, 0.252512f, 0.249509f, 0.246067f, 0.242749f, 0.239216f, 0.234883f, 0.230316f, 0.226146f, + 0.221603f, 0.216109f, 0.210802f, 0.206272f, 0.200974f, 0.194324f, 0.188446f, 0.183987f, 0.178038f, 0.169726f, 0.163182f, 0.160324f, 0.155860f, 0.145447f, 0.133826f, 0.127980f, 0.126532f, 0.122924f, 0.114883f, 0.103866f, 0.090500f, 0.079053f, 0.080753f, 0.100935f, 0.125261f, 0.130967f, 0.113407f, 0.091776f, 0.085866f, 0.095550f, 0.107946f, 0.118310f, 0.135431f, 0.165381f, 0.195627f, 0.202054f, 0.174034f, 0.127848f, 0.089951f, 0.070123f, 0.058538f, 0.046398f, 0.036783f, 0.032164f, 0.024778f, 0.009249f, -0.004637f, -0.004463f} + }, + { + {0.138076f, 0.232898f, -0.059293f, -0.612224f, -1.079196f, -1.174106f, -0.864429f, -0.332847f, 0.203546f, 0.626268f, 0.915930f, 1.086338f, 1.145817f, 1.101913f, 0.971577f, 0.776715f, 0.537327f, 0.273208f, 0.007437f, -0.237576f, -0.448750f, -0.625455f, -0.772863f, -0.892799f, -0.982209f, -1.039402f, -1.068583f, -1.077066f, -1.070181f, -1.050445f, -1.019817f, -0.980553f, -0.934407f, -0.882631f, -0.826646f, -0.767793f, -0.706548f, -0.642564f, -0.575417f, -0.505095f, -0.432158f, -0.357731f, -0.283190f, -0.209614f, -0.137562f, -0.067329f, 0.000718f, 0.066025f, 0.127937f, 0.186022f, 0.240454f, 0.292036f, 0.341688f, 0.389810f, 0.436063f, 0.479708f, 0.520133f, 0.557017f, 0.590135f, 0.619320f, 0.644743f, 0.666931f, 0.686264f, 0.702737f, 0.716446f, 0.727930f, 0.737674f, 0.745631f, 0.751724f, 0.756469f, 0.760579f, 0.764261f, 0.767563f, 0.771136f, 0.775889f, 0.781953f, 0.788798f, 0.796429f, 0.805575f, 0.816463f, 0.828227f, 0.840053f, 0.852209f, 0.865317f, 0.879077f, 0.892490f, 0.905078f, 0.917237f, 0.929509f, 0.942079f, 0.954921f, 0.967923f, 0.980775f, 0.993059f, 1.004433f, 1.014471f, + 1.022368f, 1.027077f, 1.027777f, 1.024171f, 1.016419f, 1.004875f, 0.989829f, 0.971522f, 0.950481f, 0.927664f, 0.904094f, 0.880496f, 0.857481f, 0.835889f, 0.816673f, 0.800449f, 0.787227f, 0.776425f, 0.767212f, 0.759123f, 0.752399f, 0.747484f, 0.744215f, 0.741719f, 0.738940f, 0.735065f, 0.729726f, 0.723226f, 0.716367f, 0.709723f, 0.703224f, 0.696593f, 0.689822f, 0.683015f, 0.676123f, 0.669098f, 0.662044f, 0.655092f, 0.648381f, 0.642144f, 0.636550f, 0.631509f, 0.626846f, 0.622532f, 0.618608f, 0.615118f, 0.612225f, 0.610115f, 0.608697f, 0.607677f, 0.606831f, 0.605900f, 0.604476f, 0.602385f, 0.599878f, 0.597091f, 0.593736f, 0.589617f, 0.584851f, 0.579299f, 0.572456f, 0.564168f, 0.554769f, 0.544430f, 0.533113f, 0.521100f, 0.508789f, 0.496142f, 0.483005f, 0.469593f, 0.456081f, 0.442365f, 0.428689f, 0.415677f, 0.403373f, 0.391276f, 0.379404f, 0.368075f, 0.356787f, 0.344691f, 0.331928f, 0.319178f, 0.306569f, 0.294254f, 0.282956f, 0.272791f, 0.262941f, 0.253310f, 0.244606f, 0.236417f, 0.227600f, 0.218521f, 0.210224f, 0.202126f, 0.193377f, 0.184872f, + 0.177026f, 0.168429f, 0.159251f, 0.151477f, 0.143811f, 0.133179f, 0.122218f, 0.115290f, 0.107467f, 0.092035f, 0.077002f, 0.072747f, 0.065602f, 0.034483f, -0.005140f, -0.013392f, 0.010536f, 0.022405f, 0.003341f, -0.016208f, -0.024400f, -0.060491f, -0.141552f, -0.211147f, -0.211352f, -0.166013f, -0.144212f, -0.172423f, -0.224227f, -0.268380f, -0.293530f, -0.314223f, -0.372350f, -0.487543f, -0.585910f, -0.542642f, -0.338207f, -0.113721f, -0.017641f, -0.045890f, -0.089863f, -0.096510f, -0.108175f, -0.164168f, -0.233196f, -0.252807f, -0.193549f, -0.071985f}, + {-0.138076f, -0.232898f, 0.059293f, 0.612224f, 1.079196f, 1.174106f, 0.864429f, 0.332847f, -0.203546f, -0.626268f, -0.915930f, -1.086338f, -1.145817f, -1.101913f, -0.971577f, -0.776715f, -0.537327f, -0.273208f, -0.007437f, 0.237576f, 0.448750f, 0.625455f, 0.772863f, 0.892799f, 0.982209f, 1.039402f, 1.068583f, 1.077066f, 1.070181f, 1.050445f, 1.019817f, 0.980553f, 0.934407f, 0.882631f, 0.826646f, 0.767793f, 0.706548f, 0.642564f, 0.575417f, 0.505095f, 0.432158f, 0.357731f, 0.283190f, 0.209614f, 0.137562f, 0.067329f, -0.000718f, -0.066025f, -0.127937f, -0.186022f, -0.240454f, -0.292036f, -0.341688f, -0.389810f, -0.436063f, -0.479708f, -0.520133f, -0.557017f, -0.590135f, -0.619320f, -0.644743f, -0.666931f, -0.686264f, -0.702737f, -0.716446f, -0.727930f, -0.737674f, -0.745631f, -0.751724f, -0.756469f, -0.760579f, -0.764261f, -0.767563f, -0.771136f, -0.775889f, -0.781953f, -0.788798f, -0.796429f, -0.805575f, -0.816463f, -0.828227f, -0.840053f, -0.852209f, -0.865317f, -0.879077f, -0.892490f, -0.905078f, -0.917237f, -0.929509f, -0.942079f, -0.954921f, -0.967923f, -0.980775f, -0.993059f, -1.004433f, -1.014471f, + -1.022368f, -1.027077f, -1.027777f, -1.024171f, -1.016419f, -1.004875f, -0.989829f, -0.971522f, -0.950481f, -0.927664f, -0.904094f, -0.880496f, -0.857481f, -0.835889f, -0.816673f, -0.800449f, -0.787227f, -0.776425f, -0.767212f, -0.759123f, -0.752399f, -0.747484f, -0.744215f, -0.741719f, -0.738940f, -0.735065f, -0.729726f, -0.723226f, -0.716367f, -0.709723f, -0.703224f, -0.696593f, -0.689822f, -0.683015f, -0.676123f, -0.669098f, -0.662044f, -0.655092f, -0.648381f, -0.642144f, -0.636550f, -0.631509f, -0.626846f, -0.622532f, -0.618608f, -0.615118f, -0.612225f, -0.610115f, -0.608697f, -0.607677f, -0.606831f, -0.605900f, -0.604476f, -0.602385f, -0.599878f, -0.597091f, -0.593736f, -0.589617f, -0.584851f, -0.579299f, -0.572456f, -0.564168f, -0.554769f, -0.544430f, -0.533113f, -0.521100f, -0.508789f, -0.496142f, -0.483005f, -0.469593f, -0.456081f, -0.442365f, -0.428689f, -0.415677f, -0.403373f, -0.391276f, -0.379404f, -0.368075f, -0.356787f, -0.344691f, -0.331928f, -0.319178f, -0.306569f, -0.294254f, -0.282956f, -0.272791f, -0.262941f, -0.253310f, -0.244606f, -0.236417f, -0.227600f, -0.218521f, -0.210224f, -0.202126f, -0.193377f, -0.184872f, + -0.177026f, -0.168429f, -0.159251f, -0.151477f, -0.143811f, -0.133179f, -0.122218f, -0.115290f, -0.107467f, -0.092035f, -0.077002f, -0.072747f, -0.065602f, -0.034483f, 0.005140f, 0.013392f, -0.010536f, -0.022405f, -0.003341f, 0.016208f, 0.024400f, 0.060491f, 0.141552f, 0.211147f, 0.211352f, 0.166013f, 0.144212f, 0.172423f, 0.224227f, 0.268380f, 0.293530f, 0.314223f, 0.372350f, 0.487543f, 0.585910f, 0.542642f, 0.338207f, 0.113721f, 0.017641f, 0.045890f, 0.089863f, 0.096510f, 0.108175f, 0.164168f, 0.233196f, 0.252807f, 0.193549f, 0.071985f} + }, + { + {-0.037543f, -0.106298f, -0.132530f, -0.073451f, 0.040855f, 0.110624f, 0.077156f, -0.013882f, -0.078578f, -0.081147f, -0.036444f, 0.028042f, 0.082921f, 0.101725f, 0.085482f, 0.065260f, 0.061559f, 0.057998f, 0.029356f, -0.022782f, -0.077787f, -0.123346f, -0.158215f, -0.178489f, -0.178126f, -0.160401f, -0.137683f, -0.119363f, -0.104942f, -0.088255f, -0.065195f, -0.037559f, -0.011105f, 0.009311f, 0.021969f, 0.026322f, 0.021717f, 0.009661f, -0.004873f, -0.016525f, -0.022987f, -0.024411f, -0.021007f, -0.012643f, 0.000208f, 0.016512f, 0.035490f, 0.057006f, 0.081545f, 0.110024f, 0.143089f, 0.180306f, 0.220287f, 0.261700f, 0.303801f, 0.345902f, 0.386845f, 0.425449f, 0.461174f, 0.493797f, 0.522610f, 0.546536f, 0.564888f, 0.577273f, 0.582799f, 0.580231f, 0.568985f, 0.549222f, 0.521000f, 0.484211f, 0.439353f, 0.387577f, 0.330111f, 0.268508f, 0.205168f, 0.142536f, 0.081907f, 0.024074f, -0.029079f, -0.075065f, -0.113125f, -0.144667f, -0.170681f, -0.189953f, -0.201133f, -0.205765f, -0.207348f, -0.207284f, -0.203651f, -0.194832f, -0.182670f, -0.170621f, -0.160017f, -0.149783f, -0.139015f, -0.128209f, + -0.118405f, -0.110532f, -0.105361f, -0.103080f, -0.102998f, -0.104199f, -0.106317f, -0.109616f, -0.114814f, -0.122543f, -0.132141f, -0.141277f, -0.147750f, -0.151340f, -0.153125f, -0.153636f, -0.152546f, -0.149354f, -0.143412f, -0.133993f, -0.121078f, -0.105467f, -0.087876f, -0.068787f, -0.049126f, -0.029929f, -0.011465f, 0.006234f, 0.022384f, 0.036020f, 0.046948f, 0.055235f, 0.060646f, 0.063321f, 0.063920f, 0.062627f, 0.059315f, 0.054877f, 0.050886f, 0.047979f, 0.046017f, 0.045215f, 0.045354f, 0.044782f, 0.042070f, 0.037698f, 0.032628f, 0.026663f, 0.019561f, 0.011982f, 0.004168f, -0.004450f, -0.013603f, -0.022173f, -0.030039f, -0.037798f, -0.045029f, -0.051093f, -0.056790f, -0.063043f, -0.069298f, -0.075124f, -0.081416f, -0.088384f, -0.094829f, -0.100596f, -0.106885f, -0.113537f, -0.119188f, -0.124015f, -0.128908f, -0.132920f, -0.135078f, -0.136917f, -0.139850f, -0.142734f, -0.145054f, -0.148801f, -0.154723f, -0.161242f, -0.168600f, -0.178599f, -0.189814f, -0.199312f, -0.208105f, -0.218177f, -0.226967f, -0.231947f, -0.235940f, -0.240788f, -0.242709f, -0.240449f, -0.238584f, -0.237547f, -0.232614f, -0.225682f, + -0.222453f, -0.218439f, -0.207392f, -0.198145f, -0.198203f, -0.192708f, -0.171847f, -0.158579f, -0.166585f, -0.161468f, -0.122471f, -0.101708f, -0.137293f, -0.150514f, -0.047189f, 0.105121f, 0.141538f, 0.038879f, -0.058972f, -0.070125f, -0.067759f, -0.100256f, -0.083756f, 0.038302f, 0.163436f, 0.166050f, 0.072134f, -0.001083f, -0.012004f, -0.012920f, -0.047149f, -0.098550f, -0.117690f, -0.061872f, 0.057074f, 0.148338f, 0.118443f, -0.008074f, -0.102218f, -0.087453f, -0.021704f, 0.005998f, -0.005131f, 0.000032f, 0.032495f, 0.053140f, 0.041387f, 0.014100f}, + {-0.037543f, -0.106298f, -0.132530f, -0.073451f, 0.040855f, 0.110624f, 0.077156f, -0.013882f, -0.078578f, -0.081147f, -0.036444f, 0.028042f, 0.082921f, 0.101725f, 0.085482f, 0.065260f, 0.061559f, 0.057998f, 0.029356f, -0.022782f, -0.077787f, -0.123346f, -0.158215f, -0.178489f, -0.178126f, -0.160401f, -0.137683f, -0.119363f, -0.104942f, -0.088255f, -0.065195f, -0.037559f, -0.011105f, 0.009311f, 0.021969f, 0.026322f, 0.021717f, 0.009661f, -0.004873f, -0.016525f, -0.022987f, -0.024411f, -0.021007f, -0.012643f, 0.000208f, 0.016512f, 0.035490f, 0.057006f, 0.081545f, 0.110024f, 0.143089f, 0.180306f, 0.220287f, 0.261700f, 0.303801f, 0.345902f, 0.386845f, 0.425449f, 0.461174f, 0.493797f, 0.522610f, 0.546536f, 0.564888f, 0.577273f, 0.582799f, 0.580231f, 0.568985f, 0.549222f, 0.521000f, 0.484211f, 0.439353f, 0.387577f, 0.330111f, 0.268508f, 0.205168f, 0.142536f, 0.081907f, 0.024074f, -0.029079f, -0.075065f, -0.113125f, -0.144667f, -0.170681f, -0.189953f, -0.201133f, -0.205765f, -0.207348f, -0.207284f, -0.203651f, -0.194832f, -0.182670f, -0.170621f, -0.160017f, -0.149783f, -0.139015f, -0.128209f, + -0.118405f, -0.110532f, -0.105361f, -0.103080f, -0.102998f, -0.104199f, -0.106317f, -0.109616f, -0.114814f, -0.122543f, -0.132141f, -0.141277f, -0.147750f, -0.151340f, -0.153125f, -0.153636f, -0.152546f, -0.149354f, -0.143412f, -0.133993f, -0.121078f, -0.105467f, -0.087876f, -0.068787f, -0.049126f, -0.029929f, -0.011465f, 0.006234f, 0.022384f, 0.036020f, 0.046948f, 0.055235f, 0.060646f, 0.063321f, 0.063920f, 0.062627f, 0.059315f, 0.054877f, 0.050886f, 0.047979f, 0.046017f, 0.045215f, 0.045354f, 0.044782f, 0.042070f, 0.037698f, 0.032628f, 0.026663f, 0.019561f, 0.011982f, 0.004168f, -0.004450f, -0.013603f, -0.022173f, -0.030039f, -0.037798f, -0.045029f, -0.051093f, -0.056790f, -0.063043f, -0.069298f, -0.075124f, -0.081416f, -0.088384f, -0.094829f, -0.100596f, -0.106885f, -0.113537f, -0.119188f, -0.124015f, -0.128908f, -0.132920f, -0.135078f, -0.136917f, -0.139850f, -0.142734f, -0.145054f, -0.148801f, -0.154723f, -0.161242f, -0.168600f, -0.178599f, -0.189814f, -0.199312f, -0.208105f, -0.218177f, -0.226967f, -0.231947f, -0.235940f, -0.240788f, -0.242709f, -0.240449f, -0.238584f, -0.237547f, -0.232614f, -0.225682f, + -0.222453f, -0.218439f, -0.207392f, -0.198145f, -0.198203f, -0.192708f, -0.171847f, -0.158579f, -0.166585f, -0.161468f, -0.122471f, -0.101708f, -0.137293f, -0.150514f, -0.047189f, 0.105121f, 0.141538f, 0.038879f, -0.058972f, -0.070125f, -0.067759f, -0.100256f, -0.083756f, 0.038302f, 0.163436f, 0.166050f, 0.072134f, -0.001083f, -0.012004f, -0.012920f, -0.047149f, -0.098550f, -0.117690f, -0.061872f, 0.057074f, 0.148338f, 0.118443f, -0.008074f, -0.102218f, -0.087453f, -0.021704f, 0.005998f, -0.005131f, 0.000032f, 0.032495f, 0.053140f, 0.041387f, 0.014100f} + }, + { + {-0.001106f, -0.029336f, -0.088077f, -0.114632f, -0.068558f, 0.003679f, 0.023786f, -0.022926f, -0.076983f, -0.077263f, -0.017663f, 0.063789f, 0.127856f, 0.160626f, 0.172314f, 0.179408f, 0.185660f, 0.178469f, 0.143908f, 0.081866f, 0.004191f, -0.076672f, -0.152185f, -0.216145f, -0.266904f, -0.310241f, -0.353459f, -0.395898f, -0.429566f, -0.448814f, -0.454423f, -0.447805f, -0.426583f, -0.388419f, -0.335647f, -0.273327f, -0.204930f, -0.132418f, -0.058962f, 0.011028f, 0.074401f, 0.130338f, 0.179186f, 0.221323f, 0.257177f, 0.287606f, 0.313805f, 0.336653f, 0.356005f, 0.370794f, 0.380013f, 0.383528f, 0.382178f, 0.377769f, 0.372920f, 0.369927f, 0.369378f, 0.370338f, 0.371805f, 0.373185f, 0.373702f, 0.372612f, 0.370075f, 0.366792f, 0.362926f, 0.358356f, 0.353579f, 0.349053f, 0.343991f, 0.337160f, 0.328527f, 0.318673f, 0.306976f, 0.292001f, 0.273582f, 0.252844f, 0.230152f, 0.204754f, 0.176888f, 0.148599f, 0.121626f, 0.095786f, 0.070566f, 0.047273f, 0.028034f, 0.013069f, 0.000532f, -0.010938f, -0.021026f, -0.029352f, -0.036545f, -0.042848f, -0.047044f, -0.047912f, -0.045699f, -0.041015f, + -0.033180f, -0.020912f, -0.004151f, 0.015844f, 0.037990f, 0.062328f, 0.089567f, 0.119856f, 0.151790f, 0.182876f, 0.211529f, 0.238379f, 0.264991f, 0.291575f, 0.316519f, 0.337842f, 0.354699f, 0.367998f, 0.379918f, 0.392155f, 0.404219f, 0.413945f, 0.419814f, 0.422264f, 0.423013f, 0.423999f, 0.426644f, 0.431049f, 0.435919f, 0.439985f, 0.443271f, 0.446555f, 0.450297f, 0.454641f, 0.459593f, 0.464544f, 0.468334f, 0.470226f, 0.470176f, 0.468166f, 0.464117f, 0.458340f, 0.451170f, 0.442355f, 0.431549f, 0.418970f, 0.404970f, 0.389655f, 0.373457f, 0.357280f, 0.341693f, 0.326836f, 0.313170f, 0.301285f, 0.291120f, 0.282416f, 0.275493f, 0.270594f, 0.267224f, 0.265075f, 0.264513f, 0.265346f, 0.266418f, 0.267094f, 0.267617f, 0.267704f, 0.266552f, 0.264373f, 0.262126f, 0.260015f, 0.257862f, 0.256090f, 0.254673f, 0.252424f, 0.248786f, 0.244534f, 0.239712f, 0.233258f, 0.225288f, 0.216847f, 0.207365f, 0.195576f, 0.182346f, 0.169120f, 0.155183f, 0.140015f, 0.125688f, 0.113431f, 0.101547f, 0.089772f, 0.080598f, 0.073961f, 0.067095f, 0.060688f, 0.057289f, 0.054588f, + 0.049873f, 0.047292f, 0.049167f, 0.048148f, 0.042023f, 0.042578f, 0.052039f, 0.052105f, 0.039829f, 0.042979f, 0.066307f, 0.065764f, 0.028206f, 0.026431f, 0.116043f, 0.221103f, 0.223358f, 0.136204f, 0.075662f, 0.075938f, 0.065554f, 0.030357f, 0.054492f, 0.158858f, 0.232985f, 0.194413f, 0.106812f, 0.067102f, 0.067912f, 0.048003f, 0.000150f, -0.049393f, -0.102920f, -0.154412f, -0.145923f, -0.043235f, 0.082041f, 0.125246f, 0.083044f, 0.044160f, 0.057384f, 0.079976f, 0.065854f, 0.041133f, 0.057617f, 0.106489f, 0.119625f, 0.053552f}, + {-0.001106f, -0.029336f, -0.088077f, -0.114632f, -0.068558f, 0.003679f, 0.023786f, -0.022926f, -0.076983f, -0.077263f, -0.017663f, 0.063789f, 0.127856f, 0.160626f, 0.172314f, 0.179408f, 0.185660f, 0.178469f, 0.143908f, 0.081866f, 0.004191f, -0.076672f, -0.152185f, -0.216145f, -0.266904f, -0.310241f, -0.353459f, -0.395898f, -0.429566f, -0.448814f, -0.454423f, -0.447805f, -0.426583f, -0.388419f, -0.335647f, -0.273327f, -0.204930f, -0.132418f, -0.058962f, 0.011028f, 0.074401f, 0.130338f, 0.179186f, 0.221323f, 0.257177f, 0.287606f, 0.313805f, 0.336653f, 0.356005f, 0.370794f, 0.380013f, 0.383528f, 0.382178f, 0.377769f, 0.372920f, 0.369927f, 0.369378f, 0.370338f, 0.371805f, 0.373185f, 0.373702f, 0.372612f, 0.370075f, 0.366792f, 0.362926f, 0.358356f, 0.353579f, 0.349053f, 0.343991f, 0.337160f, 0.328527f, 0.318673f, 0.306976f, 0.292001f, 0.273582f, 0.252844f, 0.230152f, 0.204754f, 0.176888f, 0.148599f, 0.121626f, 0.095786f, 0.070566f, 0.047273f, 0.028034f, 0.013069f, 0.000532f, -0.010938f, -0.021026f, -0.029352f, -0.036545f, -0.042848f, -0.047044f, -0.047912f, -0.045699f, -0.041015f, + -0.033180f, -0.020912f, -0.004151f, 0.015844f, 0.037990f, 0.062328f, 0.089567f, 0.119856f, 0.151790f, 0.182876f, 0.211529f, 0.238379f, 0.264991f, 0.291575f, 0.316519f, 0.337842f, 0.354699f, 0.367998f, 0.379918f, 0.392155f, 0.404219f, 0.413945f, 0.419814f, 0.422264f, 0.423013f, 0.423999f, 0.426644f, 0.431049f, 0.435919f, 0.439985f, 0.443271f, 0.446555f, 0.450297f, 0.454641f, 0.459593f, 0.464544f, 0.468334f, 0.470226f, 0.470176f, 0.468166f, 0.464117f, 0.458340f, 0.451170f, 0.442355f, 0.431549f, 0.418970f, 0.404970f, 0.389655f, 0.373457f, 0.357280f, 0.341693f, 0.326836f, 0.313170f, 0.301285f, 0.291120f, 0.282416f, 0.275493f, 0.270594f, 0.267224f, 0.265075f, 0.264513f, 0.265346f, 0.266418f, 0.267094f, 0.267617f, 0.267704f, 0.266552f, 0.264373f, 0.262126f, 0.260015f, 0.257862f, 0.256090f, 0.254673f, 0.252424f, 0.248786f, 0.244534f, 0.239712f, 0.233258f, 0.225288f, 0.216847f, 0.207365f, 0.195576f, 0.182346f, 0.169120f, 0.155183f, 0.140015f, 0.125688f, 0.113431f, 0.101547f, 0.089772f, 0.080598f, 0.073961f, 0.067095f, 0.060688f, 0.057289f, 0.054588f, + 0.049873f, 0.047292f, 0.049167f, 0.048148f, 0.042023f, 0.042578f, 0.052039f, 0.052105f, 0.039829f, 0.042979f, 0.066307f, 0.065764f, 0.028206f, 0.026431f, 0.116043f, 0.221103f, 0.223358f, 0.136204f, 0.075662f, 0.075938f, 0.065554f, 0.030357f, 0.054492f, 0.158858f, 0.232985f, 0.194413f, 0.106812f, 0.067102f, 0.067912f, 0.048003f, 0.000150f, -0.049393f, -0.102920f, -0.154412f, -0.145923f, -0.043235f, 0.082041f, 0.125246f, 0.083044f, 0.044160f, 0.057384f, 0.079976f, 0.065854f, 0.041133f, 0.057617f, 0.106489f, 0.119625f, 0.053552f} + }, + { + {-0.003789f, -0.003563f, 0.005390f, 0.004253f, -0.016392f, -0.039478f, -0.046987f, -0.050995f, -0.077966f, -0.121934f, -0.135164f, -0.078389f, 0.031562f, 0.138714f, 0.205564f, 0.238423f, 0.259289f, 0.272913f, 0.269301f, 0.243849f, 0.201082f, 0.144127f, 0.072703f, -0.009192f, -0.092622f, -0.171911f, -0.247325f, -0.318739f, -0.382003f, -0.432956f, -0.470676f, -0.495269f, -0.505851f, -0.501895f, -0.483566f, -0.449894f, -0.399742f, -0.335951f, -0.266183f, -0.198350f, -0.136588f, -0.081779f, -0.033568f, 0.009088f, 0.047647f, 0.083109f, 0.115870f, 0.146272f, 0.174342f, 0.199243f, 0.219907f, 0.235988f, 0.247660f, 0.255290f, 0.260042f, 0.263953f, 0.268571f, 0.274114f, 0.280349f, 0.287365f, 0.295056f, 0.302862f, 0.310459f, 0.317888f, 0.324842f, 0.330747f, 0.335542f, 0.339373f, 0.341625f, 0.341355f, 0.338531f, 0.333589f, 0.325911f, 0.314093f, 0.297767f, 0.277788f, 0.254435f, 0.226961f, 0.195597f, 0.162625f, 0.130256f, 0.098385f, 0.065891f, 0.033566f, 0.003825f, -0.022571f, -0.047471f, -0.072174f, -0.095089f, -0.113849f, -0.128315f, -0.139798f, -0.148327f, -0.152538f, -0.151922f, -0.147693f, + -0.141449f, -0.134009f, -0.125542f, -0.116170f, -0.106339f, -0.096745f, -0.087767f, -0.079178f, -0.070833f, -0.063188f, -0.056416f, -0.049448f, -0.040822f, -0.030317f, -0.019055f, -0.008311f, 0.001362f, 0.010417f, 0.020238f, 0.032100f, 0.045698f, 0.059224f, 0.071090f, 0.081057f, 0.089857f, 0.098613f, 0.108519f, 0.120125f, 0.132885f, 0.145947f, 0.159099f, 0.172520f, 0.186195f, 0.200063f, 0.214027f, 0.227406f, 0.239060f, 0.248310f, 0.255115f, 0.259453f, 0.261381f, 0.261468f, 0.260276f, 0.257747f, 0.253798f, 0.248995f, 0.243998f, 0.239084f, 0.234733f, 0.231749f, 0.230386f, 0.230266f, 0.231313f, 0.233779f, 0.237497f, 0.242150f, 0.247940f, 0.255021f, 0.262901f, 0.271206f, 0.280071f, 0.289077f, 0.297036f, 0.303388f, 0.308430f, 0.311992f, 0.313524f, 0.313400f, 0.312461f, 0.310668f, 0.307845f, 0.304798f, 0.302098f, 0.299086f, 0.295438f, 0.291960f, 0.288762f, 0.284855f, 0.280127f, 0.275167f, 0.269236f, 0.261328f, 0.252490f, 0.244013f, 0.235006f, 0.224872f, 0.215456f, 0.207625f, 0.199481f, 0.190596f, 0.183143f, 0.177022f, 0.169991f, 0.163109f, 0.158683f, 0.154359f, + 0.148010f, 0.143942f, 0.143859f, 0.140381f, 0.132047f, 0.130317f, 0.136071f, 0.131329f, 0.114971f, 0.114353f, 0.131726f, 0.123744f, 0.081739f, 0.079871f, 0.169779f, 0.273251f, 0.274171f, 0.185331f, 0.118375f, 0.110316f, 0.100500f, 0.075041f, 0.100840f, 0.188865f, 0.245753f, 0.209825f, 0.136354f, 0.098537f, 0.089245f, 0.068116f, 0.030138f, -0.014604f, -0.058375f, -0.058884f, 0.036565f, 0.189080f, 0.269087f, 0.211524f, 0.102010f, 0.054393f, 0.068058f, 0.069962f, 0.039279f, 0.011969f, -0.001065f, -0.019914f, -0.036169f, -0.019550f}, + {0.003789f, 0.003563f, -0.005390f, -0.004253f, 0.016392f, 0.039478f, 0.046987f, 0.050995f, 0.077966f, 0.121934f, 0.135164f, 0.078389f, -0.031562f, -0.138714f, -0.205564f, -0.238423f, -0.259289f, -0.272913f, -0.269301f, -0.243849f, -0.201082f, -0.144127f, -0.072703f, 0.009192f, 0.092622f, 0.171911f, 0.247325f, 0.318739f, 0.382003f, 0.432956f, 0.470676f, 0.495269f, 0.505851f, 0.501895f, 0.483566f, 0.449894f, 0.399742f, 0.335951f, 0.266183f, 0.198350f, 0.136588f, 0.081779f, 0.033568f, -0.009088f, -0.047647f, -0.083109f, -0.115870f, -0.146272f, -0.174342f, -0.199243f, -0.219907f, -0.235988f, -0.247660f, -0.255290f, -0.260042f, -0.263953f, -0.268571f, -0.274114f, -0.280349f, -0.287365f, -0.295056f, -0.302862f, -0.310459f, -0.317888f, -0.324842f, -0.330747f, -0.335542f, -0.339373f, -0.341625f, -0.341355f, -0.338531f, -0.333589f, -0.325911f, -0.314093f, -0.297767f, -0.277788f, -0.254435f, -0.226961f, -0.195597f, -0.162625f, -0.130256f, -0.098385f, -0.065891f, -0.033566f, -0.003825f, 0.022571f, 0.047471f, 0.072174f, 0.095089f, 0.113849f, 0.128315f, 0.139798f, 0.148327f, 0.152538f, 0.151922f, 0.147693f, + 0.141449f, 0.134009f, 0.125542f, 0.116170f, 0.106339f, 0.096745f, 0.087767f, 0.079178f, 0.070833f, 0.063188f, 0.056416f, 0.049448f, 0.040822f, 0.030317f, 0.019055f, 0.008311f, -0.001362f, -0.010417f, -0.020238f, -0.032100f, -0.045698f, -0.059224f, -0.071090f, -0.081057f, -0.089857f, -0.098613f, -0.108519f, -0.120125f, -0.132885f, -0.145947f, -0.159099f, -0.172520f, -0.186195f, -0.200063f, -0.214027f, -0.227406f, -0.239060f, -0.248310f, -0.255115f, -0.259453f, -0.261381f, -0.261468f, -0.260276f, -0.257747f, -0.253798f, -0.248995f, -0.243998f, -0.239084f, -0.234733f, -0.231749f, -0.230386f, -0.230266f, -0.231313f, -0.233779f, -0.237497f, -0.242150f, -0.247940f, -0.255021f, -0.262901f, -0.271206f, -0.280071f, -0.289077f, -0.297036f, -0.303388f, -0.308430f, -0.311992f, -0.313524f, -0.313400f, -0.312461f, -0.310668f, -0.307845f, -0.304798f, -0.302098f, -0.299086f, -0.295438f, -0.291960f, -0.288762f, -0.284855f, -0.280127f, -0.275167f, -0.269236f, -0.261328f, -0.252490f, -0.244013f, -0.235006f, -0.224872f, -0.215456f, -0.207625f, -0.199481f, -0.190596f, -0.183143f, -0.177022f, -0.169991f, -0.163109f, -0.158683f, -0.154359f, + -0.148010f, -0.143942f, -0.143859f, -0.140381f, -0.132047f, -0.130317f, -0.136071f, -0.131329f, -0.114971f, -0.114353f, -0.131726f, -0.123744f, -0.081739f, -0.079871f, -0.169779f, -0.273251f, -0.274171f, -0.185331f, -0.118375f, -0.110316f, -0.100500f, -0.075041f, -0.100840f, -0.188865f, -0.245753f, -0.209825f, -0.136354f, -0.098537f, -0.089245f, -0.068116f, -0.030138f, 0.014604f, 0.058375f, 0.058884f, -0.036565f, -0.189080f, -0.269087f, -0.211524f, -0.102010f, -0.054393f, -0.068058f, -0.069962f, -0.039279f, -0.011969f, 0.001065f, 0.019914f, 0.036169f, 0.019550f} + }, + { + {-0.006846f, -0.000152f, 0.019374f, 0.004568f, -0.021442f, 0.016645f, 0.094894f, 0.078760f, -0.081254f, -0.243610f, -0.240659f, -0.079782f, 0.093230f, 0.178154f, 0.191226f, 0.185348f, 0.178503f, 0.163321f, 0.134365f, 0.090634f, 0.035061f, -0.021392f, -0.066568f, -0.096797f, -0.113194f, -0.115470f, -0.106244f, -0.093474f, -0.082246f, -0.071041f, -0.059987f, -0.054977f, -0.059639f, -0.069988f, -0.080582f, -0.091156f, -0.105014f, -0.124424f, -0.148446f, -0.172697f, -0.191456f, -0.201829f, -0.205066f, -0.203411f, -0.198122f, -0.190935f, -0.184076f, -0.177679f, -0.169636f, -0.158353f, -0.143485f, -0.124415f, -0.100358f, -0.071388f, -0.037625f, 0.001321f, 0.044603f, 0.089548f, 0.134068f, 0.177680f, 0.219330f, 0.256720f, 0.288657f, 0.315550f, 0.336880f, 0.350608f, 0.355516f, 0.351864f, 0.339573f, 0.317907f, 0.287002f, 0.247963f, 0.201779f, 0.149696f, 0.094063f, 0.037338f, -0.019185f, -0.074517f, -0.126620f, -0.173157f, -0.213261f, -0.247652f, -0.276903f, -0.300055f, -0.315444f, -0.323001f, -0.324860f, -0.322914f, -0.316675f, -0.304809f, -0.287684f, -0.266683f, -0.242026f, -0.213279f, -0.181142f, -0.146760f, + -0.110142f, -0.071145f, -0.031211f, 0.007509f, 0.043988f, 0.078081f, 0.109247f, 0.136169f, 0.156829f, 0.169152f, 0.173118f, 0.171933f, 0.169302f, 0.165775f, 0.159289f, 0.148635f, 0.134827f, 0.119999f, 0.106488f, 0.096001f, 0.088379f, 0.082075f, 0.076456f, 0.072384f, 0.070438f, 0.070288f, 0.071753f, 0.074612f, 0.077583f, 0.079232f, 0.079389f, 0.078235f, 0.075055f, 0.069328f, 0.061745f, 0.052996f, 0.043060f, 0.032476f, 0.022488f, 0.013477f, 0.005059f, -0.002387f, -0.008316f, -0.013571f, -0.019235f, -0.024853f, -0.029688f, -0.034327f, -0.039294f, -0.043859f, -0.047636f, -0.051298f, -0.054721f, -0.056837f, -0.057796f, -0.058696f, -0.059300f, -0.058729f, -0.057642f, -0.056982f, -0.055954f, -0.053837f, -0.051823f, -0.050759f, -0.049643f, -0.048234f, -0.047974f, -0.049006f, -0.049803f, -0.050341f, -0.051811f, -0.053521f, -0.054180f, -0.055033f, -0.057656f, -0.060879f, -0.063704f, -0.067950f, -0.074626f, -0.081990f, -0.089761f, -0.099845f, -0.111314f, -0.121038f, -0.129556f, -0.139256f, -0.148166f, -0.153341f, -0.157148f, -0.162167f, -0.165226f, -0.164304f, -0.163483f, -0.164081f, -0.161527f, -0.156368f, + -0.154318f, -0.152643f, -0.144643f, -0.136635f, -0.137086f, -0.134879f, -0.118831f, -0.106512f, -0.113435f, -0.113117f, -0.082437f, -0.060570f, -0.086167f, -0.101264f, -0.021545f, 0.106592f, 0.140238f, 0.045381f, -0.056517f, -0.078374f, -0.074532f, -0.103109f, -0.107473f, -0.023777f, 0.086175f, 0.108098f, 0.028080f, -0.068297f, -0.117080f, -0.133674f, -0.164582f, -0.217773f, -0.236408f, -0.146856f, 0.037683f, 0.182002f, 0.158627f, 0.006930f, -0.106384f, -0.089821f, -0.015786f, 0.009329f, -0.016630f, -0.027747f, -0.002433f, 0.022946f, 0.022944f, 0.008213f}, + {0.006846f, 0.000152f, -0.019374f, -0.004568f, 0.021442f, -0.016645f, -0.094894f, -0.078760f, 0.081254f, 0.243610f, 0.240659f, 0.079782f, -0.093230f, -0.178154f, -0.191226f, -0.185348f, -0.178503f, -0.163321f, -0.134365f, -0.090634f, -0.035061f, 0.021392f, 0.066568f, 0.096797f, 0.113194f, 0.115470f, 0.106244f, 0.093474f, 0.082246f, 0.071041f, 0.059987f, 0.054977f, 0.059639f, 0.069988f, 0.080582f, 0.091156f, 0.105014f, 0.124424f, 0.148446f, 0.172697f, 0.191456f, 0.201829f, 0.205066f, 0.203411f, 0.198122f, 0.190935f, 0.184076f, 0.177679f, 0.169636f, 0.158353f, 0.143485f, 0.124415f, 0.100358f, 0.071388f, 0.037625f, -0.001321f, -0.044603f, -0.089548f, -0.134068f, -0.177680f, -0.219330f, -0.256720f, -0.288657f, -0.315550f, -0.336880f, -0.350608f, -0.355516f, -0.351864f, -0.339573f, -0.317907f, -0.287002f, -0.247963f, -0.201779f, -0.149696f, -0.094063f, -0.037338f, 0.019185f, 0.074517f, 0.126620f, 0.173157f, 0.213261f, 0.247652f, 0.276903f, 0.300055f, 0.315444f, 0.323001f, 0.324860f, 0.322914f, 0.316675f, 0.304809f, 0.287684f, 0.266683f, 0.242026f, 0.213279f, 0.181142f, 0.146760f, + 0.110142f, 0.071145f, 0.031211f, -0.007509f, -0.043988f, -0.078081f, -0.109247f, -0.136169f, -0.156829f, -0.169152f, -0.173118f, -0.171933f, -0.169302f, -0.165775f, -0.159289f, -0.148635f, -0.134827f, -0.119999f, -0.106488f, -0.096001f, -0.088379f, -0.082075f, -0.076456f, -0.072384f, -0.070438f, -0.070288f, -0.071753f, -0.074612f, -0.077583f, -0.079232f, -0.079389f, -0.078235f, -0.075055f, -0.069328f, -0.061745f, -0.052996f, -0.043060f, -0.032476f, -0.022488f, -0.013477f, -0.005059f, 0.002387f, 0.008316f, 0.013571f, 0.019235f, 0.024853f, 0.029688f, 0.034327f, 0.039294f, 0.043859f, 0.047636f, 0.051298f, 0.054721f, 0.056837f, 0.057796f, 0.058696f, 0.059300f, 0.058729f, 0.057642f, 0.056982f, 0.055954f, 0.053837f, 0.051823f, 0.050759f, 0.049643f, 0.048234f, 0.047974f, 0.049006f, 0.049803f, 0.050341f, 0.051811f, 0.053521f, 0.054180f, 0.055033f, 0.057656f, 0.060879f, 0.063704f, 0.067950f, 0.074626f, 0.081990f, 0.089761f, 0.099845f, 0.111314f, 0.121038f, 0.129556f, 0.139256f, 0.148166f, 0.153341f, 0.157148f, 0.162167f, 0.165226f, 0.164304f, 0.163483f, 0.164081f, 0.161527f, 0.156368f, + 0.154318f, 0.152643f, 0.144643f, 0.136635f, 0.137086f, 0.134879f, 0.118831f, 0.106512f, 0.113435f, 0.113117f, 0.082437f, 0.060570f, 0.086167f, 0.101264f, 0.021545f, -0.106592f, -0.140238f, -0.045381f, 0.056517f, 0.078374f, 0.074532f, 0.103109f, 0.107473f, 0.023777f, -0.086175f, -0.108098f, -0.028080f, 0.068297f, 0.117080f, 0.133674f, 0.164582f, 0.217773f, 0.236408f, 0.146856f, -0.037683f, -0.182002f, -0.158627f, -0.006930f, 0.106384f, 0.089821f, 0.015786f, -0.009329f, 0.016630f, 0.027747f, 0.002433f, -0.022946f, -0.022944f, -0.008213f} + }, + { + {-0.001420f, -0.012065f, -0.026492f, -0.020203f, 0.009739f, 0.039421f, 0.066264f, 0.123513f, 0.219923f, 0.294024f, 0.266235f, 0.127758f, -0.051262f, -0.196504f, -0.284732f, -0.327956f, -0.337211f, -0.317958f, -0.281436f, -0.240577f, -0.198997f, -0.153781f, -0.105052f, -0.056036f, -0.008353f, 0.035683f, 0.069060f, 0.085305f, 0.087456f, 0.087200f, 0.094464f, 0.110361f, 0.130021f, 0.149198f, 0.166810f, 0.183045f, 0.197421f, 0.209077f, 0.217550f, 0.222212f, 0.221593f, 0.214614f, 0.202528f, 0.188537f, 0.175138f, 0.162537f, 0.149700f, 0.136000f, 0.121499f, 0.106417f, 0.090943f, 0.075268f, 0.059568f, 0.044160f, 0.029790f, 0.017578f, 0.008567f, 0.003340f, 0.001927f, 0.003952f, 0.008947f, 0.016627f, 0.026844f, 0.039331f, 0.053686f, 0.069631f, 0.087084f, 0.105849f, 0.125258f, 0.144267f, 0.162023f, 0.178236f, 0.192755f, 0.204836f, 0.213266f, 0.217287f, 0.216843f, 0.211652f, 0.200710f, 0.183257f, 0.159710f, 0.131033f, 0.097576f, 0.059269f, 0.016690f, -0.028770f, -0.075739f, -0.123333f, -0.170970f, -0.218285f, -0.265068f, -0.310574f, -0.352756f, -0.388810f, -0.416934f, -0.437347f, + -0.451255f, -0.458880f, -0.458839f, -0.449713f, -0.432204f, -0.409619f, -0.386020f, -0.363800f, -0.342969f, -0.322690f, -0.303273f, -0.286626f, -0.275007f, -0.269641f, -0.270390f, -0.276241f, -0.285888f, -0.298144f, -0.312255f, -0.327971f, -0.345199f, -0.363508f, -0.381893f, -0.399002f, -0.413686f, -0.425507f, -0.434753f, -0.441996f, -0.447655f, -0.451917f, -0.454880f, -0.456722f, -0.457797f, -0.458478f, -0.458752f, -0.458121f, -0.456157f, -0.453025f, -0.449242f, -0.445115f, -0.440663f, -0.435765f, -0.429977f, -0.422410f, -0.412255f, -0.399353f, -0.384044f, -0.366690f, -0.347614f, -0.327259f, -0.306182f, -0.285019f, -0.264467f, -0.245070f, -0.227032f, -0.210404f, -0.195308f, -0.181726f, -0.169332f, -0.157853f, -0.147307f, -0.137689f, -0.128750f, -0.120299f, -0.112312f, -0.104627f, -0.096937f, -0.089190f, -0.081612f, -0.074406f, -0.067751f, -0.061796f, -0.056271f, -0.050527f, -0.044251f, -0.037633f, -0.030645f, -0.022940f, -0.014604f, -0.006131f, 0.002380f, 0.011084f, 0.019647f, 0.027656f, 0.035299f, 0.042653f, 0.049064f, 0.054179f, 0.058475f, 0.061913f, 0.063651f, 0.063792f, 0.063468f, 0.062805f, 0.061111f, 0.058940f, + 0.057196f, 0.055040f, 0.051853f, 0.049240f, 0.047435f, 0.043389f, 0.036776f, 0.032043f, 0.029194f, 0.021482f, 0.009242f, 0.002996f, 0.002545f, -0.009347f, -0.036379f, -0.052805f, -0.041320f, -0.024358f, -0.027246f, -0.034686f, -0.024798f, -0.022626f, -0.064861f, -0.125246f, -0.137627f, -0.092121f, -0.047334f, -0.041987f, -0.054463f, -0.057870f, -0.053789f, -0.041072f, -0.015593f, -0.013176f, -0.080518f, -0.182863f, -0.217493f, -0.150387f, -0.062968f, -0.026715f, -0.015171f, 0.011874f, 0.031103f, 0.034503f, 0.089489f, 0.214435f, 0.272951f, 0.129518f}, + {-0.001420f, -0.012065f, -0.026492f, -0.020203f, 0.009739f, 0.039421f, 0.066264f, 0.123513f, 0.219923f, 0.294024f, 0.266235f, 0.127758f, -0.051262f, -0.196504f, -0.284732f, -0.327956f, -0.337211f, -0.317958f, -0.281436f, -0.240577f, -0.198997f, -0.153781f, -0.105052f, -0.056036f, -0.008353f, 0.035683f, 0.069060f, 0.085305f, 0.087456f, 0.087200f, 0.094464f, 0.110361f, 0.130021f, 0.149198f, 0.166810f, 0.183045f, 0.197421f, 0.209077f, 0.217550f, 0.222212f, 0.221593f, 0.214614f, 0.202528f, 0.188537f, 0.175138f, 0.162537f, 0.149700f, 0.136000f, 0.121499f, 0.106417f, 0.090943f, 0.075268f, 0.059568f, 0.044160f, 0.029790f, 0.017578f, 0.008567f, 0.003340f, 0.001927f, 0.003952f, 0.008947f, 0.016627f, 0.026844f, 0.039331f, 0.053686f, 0.069631f, 0.087084f, 0.105849f, 0.125258f, 0.144267f, 0.162023f, 0.178236f, 0.192755f, 0.204836f, 0.213266f, 0.217287f, 0.216843f, 0.211652f, 0.200710f, 0.183257f, 0.159710f, 0.131033f, 0.097576f, 0.059269f, 0.016690f, -0.028770f, -0.075739f, -0.123333f, -0.170970f, -0.218285f, -0.265068f, -0.310574f, -0.352756f, -0.388810f, -0.416934f, -0.437347f, + -0.451255f, -0.458880f, -0.458839f, -0.449713f, -0.432204f, -0.409619f, -0.386020f, -0.363800f, -0.342969f, -0.322690f, -0.303273f, -0.286626f, -0.275007f, -0.269641f, -0.270390f, -0.276241f, -0.285888f, -0.298144f, -0.312255f, -0.327971f, -0.345199f, -0.363508f, -0.381893f, -0.399002f, -0.413686f, -0.425507f, -0.434753f, -0.441996f, -0.447655f, -0.451917f, -0.454880f, -0.456722f, -0.457797f, -0.458478f, -0.458752f, -0.458121f, -0.456157f, -0.453025f, -0.449242f, -0.445115f, -0.440663f, -0.435765f, -0.429977f, -0.422410f, -0.412255f, -0.399353f, -0.384044f, -0.366690f, -0.347614f, -0.327259f, -0.306182f, -0.285019f, -0.264467f, -0.245070f, -0.227032f, -0.210404f, -0.195308f, -0.181726f, -0.169332f, -0.157853f, -0.147307f, -0.137689f, -0.128750f, -0.120299f, -0.112312f, -0.104627f, -0.096937f, -0.089190f, -0.081612f, -0.074406f, -0.067751f, -0.061796f, -0.056271f, -0.050527f, -0.044251f, -0.037633f, -0.030645f, -0.022940f, -0.014604f, -0.006131f, 0.002380f, 0.011084f, 0.019647f, 0.027656f, 0.035299f, 0.042653f, 0.049064f, 0.054179f, 0.058475f, 0.061913f, 0.063651f, 0.063792f, 0.063468f, 0.062805f, 0.061111f, 0.058940f, + 0.057196f, 0.055040f, 0.051853f, 0.049240f, 0.047435f, 0.043389f, 0.036776f, 0.032043f, 0.029194f, 0.021482f, 0.009242f, 0.002996f, 0.002545f, -0.009347f, -0.036379f, -0.052805f, -0.041320f, -0.024358f, -0.027246f, -0.034686f, -0.024798f, -0.022626f, -0.064861f, -0.125246f, -0.137627f, -0.092121f, -0.047334f, -0.041987f, -0.054463f, -0.057870f, -0.053789f, -0.041072f, -0.015593f, -0.013176f, -0.080518f, -0.182863f, -0.217493f, -0.150387f, -0.062968f, -0.026715f, -0.015171f, 0.011874f, 0.031103f, 0.034503f, 0.089489f, 0.214435f, 0.272951f, 0.129518f} + }, + { + {-0.038036f, -0.074902f, -0.024728f, 0.087455f, 0.171578f, 0.138660f, -0.013344f, -0.177067f, -0.224993f, -0.133475f, 0.000768f, 0.073679f, 0.073125f, 0.051799f, 0.042554f, 0.040258f, 0.042095f, 0.055917f, 0.071808f, 0.065859f, 0.038024f, 0.016554f, 0.018640f, 0.030709f, 0.033652f, 0.026271f, 0.015742f, 0.001748f, -0.019927f, -0.047556f, -0.074394f, -0.094749f, -0.106738f, -0.113212f, -0.120520f, -0.132744f, -0.147313f, -0.158256f, -0.161754f, -0.156711f, -0.143250f, -0.123457f, -0.101193f, -0.079047f, -0.057237f, -0.036057f, -0.016869f, -0.000173f, 0.014829f, 0.028457f, 0.040426f, 0.051286f, 0.062027f, 0.072634f, 0.082611f, 0.092229f, 0.101796f, 0.110497f, 0.117155f, 0.121469f, 0.123745f, 0.124154f, 0.122894f, 0.120542f, 0.118067f, 0.116669f, 0.117188f, 0.119429f, 0.122852f, 0.127992f, 0.135991f, 0.146706f, 0.158839f, 0.172086f, 0.187416f, 0.204930f, 0.223054f, 0.240129f, 0.255405f, 0.268314f, 0.277870f, 0.282894f, 0.282322f, 0.275749f, 0.263854f, 0.247296f, 0.225295f, 0.197079f, 0.164656f, 0.131544f, 0.098081f, 0.060564f, 0.016252f, -0.032884f, -0.082704f, -0.131427f, + -0.180130f, -0.229646f, -0.278328f, -0.323025f, -0.361917f, -0.395929f, -0.426764f, -0.453823f, -0.474235f, -0.486045f, -0.490258f, -0.489520f, -0.485692f, -0.478679f, -0.466693f, -0.447817f, -0.422153f, -0.392219f, -0.360719f, -0.328559f, -0.295468f, -0.261492f, -0.227219f, -0.193485f, -0.161356f, -0.131578f, -0.103829f, -0.077323f, -0.051994f, -0.028199f, -0.005636f, 0.016498f, 0.038710f, 0.061118f, 0.083300f, 0.103747f, 0.120694f, 0.134062f, 0.145495f, 0.156353f, 0.166955f, 0.177434f, 0.187498f, 0.195642f, 0.200481f, 0.202621f, 0.203729f, 0.204510f, 0.205051f, 0.205904f, 0.207126f, 0.207456f, 0.205955f, 0.203314f, 0.200582f, 0.198064f, 0.196146f, 0.195517f, 0.195977f, 0.196494f, 0.196550f, 0.196111f, 0.194868f, 0.192897f, 0.191150f, 0.190037f, 0.188817f, 0.187238f, 0.185888f, 0.184302f, 0.181068f, 0.176285f, 0.171411f, 0.166717f, 0.161536f, 0.156496f, 0.152668f, 0.149485f, 0.146174f, 0.143623f, 0.142412f, 0.141376f, 0.140226f, 0.140504f, 0.142241f, 0.143471f, 0.144125f, 0.145942f, 0.148225f, 0.148788f, 0.148461f, 0.149129f, 0.149237f, 0.147094f, 0.145098f, 0.144601f, + 0.142172f, 0.137100f, 0.134404f, 0.134101f, 0.129092f, 0.120268f, 0.117850f, 0.120259f, 0.112981f, 0.098190f, 0.097531f, 0.110374f, 0.103615f, 0.067766f, 0.046475f, 0.073314f, 0.111894f, 0.105684f, 0.062494f, 0.035374f, 0.034378f, 0.017735f, -0.027142f, -0.052915f, -0.024407f, 0.022722f, 0.028116f, -0.013868f, -0.055362f, -0.066124f, -0.069119f, -0.094576f, -0.122680f, -0.100213f, -0.014486f, 0.075343f, 0.099155f, 0.055635f, 0.009056f, 0.009599f, 0.040799f, 0.054429f, 0.037946f, 0.027022f, 0.053523f, 0.098025f, 0.105408f, 0.046190f}, + {-0.038036f, -0.074902f, -0.024728f, 0.087455f, 0.171578f, 0.138660f, -0.013344f, -0.177067f, -0.224993f, -0.133475f, 0.000768f, 0.073679f, 0.073125f, 0.051799f, 0.042554f, 0.040258f, 0.042095f, 0.055917f, 0.071808f, 0.065859f, 0.038024f, 0.016554f, 0.018640f, 0.030709f, 0.033652f, 0.026271f, 0.015742f, 0.001748f, -0.019927f, -0.047556f, -0.074394f, -0.094749f, -0.106738f, -0.113212f, -0.120520f, -0.132744f, -0.147313f, -0.158256f, -0.161754f, -0.156711f, -0.143250f, -0.123457f, -0.101193f, -0.079047f, -0.057237f, -0.036057f, -0.016869f, -0.000173f, 0.014829f, 0.028457f, 0.040426f, 0.051286f, 0.062027f, 0.072634f, 0.082611f, 0.092229f, 0.101796f, 0.110497f, 0.117155f, 0.121469f, 0.123745f, 0.124154f, 0.122894f, 0.120542f, 0.118067f, 0.116669f, 0.117188f, 0.119429f, 0.122852f, 0.127992f, 0.135991f, 0.146706f, 0.158839f, 0.172086f, 0.187416f, 0.204930f, 0.223054f, 0.240129f, 0.255405f, 0.268314f, 0.277870f, 0.282894f, 0.282322f, 0.275749f, 0.263854f, 0.247296f, 0.225295f, 0.197079f, 0.164656f, 0.131544f, 0.098081f, 0.060564f, 0.016252f, -0.032884f, -0.082704f, -0.131427f, + -0.180130f, -0.229646f, -0.278328f, -0.323025f, -0.361917f, -0.395929f, -0.426764f, -0.453823f, -0.474235f, -0.486045f, -0.490258f, -0.489520f, -0.485692f, -0.478679f, -0.466693f, -0.447817f, -0.422153f, -0.392219f, -0.360719f, -0.328559f, -0.295468f, -0.261492f, -0.227219f, -0.193485f, -0.161356f, -0.131578f, -0.103829f, -0.077323f, -0.051994f, -0.028199f, -0.005636f, 0.016498f, 0.038710f, 0.061118f, 0.083300f, 0.103747f, 0.120694f, 0.134062f, 0.145495f, 0.156353f, 0.166955f, 0.177434f, 0.187498f, 0.195642f, 0.200481f, 0.202621f, 0.203729f, 0.204510f, 0.205051f, 0.205904f, 0.207126f, 0.207456f, 0.205955f, 0.203314f, 0.200582f, 0.198064f, 0.196146f, 0.195517f, 0.195977f, 0.196494f, 0.196550f, 0.196111f, 0.194868f, 0.192897f, 0.191150f, 0.190037f, 0.188817f, 0.187238f, 0.185888f, 0.184302f, 0.181068f, 0.176285f, 0.171411f, 0.166717f, 0.161536f, 0.156496f, 0.152668f, 0.149485f, 0.146174f, 0.143623f, 0.142412f, 0.141376f, 0.140226f, 0.140504f, 0.142241f, 0.143471f, 0.144125f, 0.145942f, 0.148225f, 0.148788f, 0.148461f, 0.149129f, 0.149237f, 0.147094f, 0.145098f, 0.144601f, + 0.142172f, 0.137100f, 0.134404f, 0.134101f, 0.129092f, 0.120268f, 0.117850f, 0.120259f, 0.112981f, 0.098190f, 0.097531f, 0.110374f, 0.103615f, 0.067766f, 0.046475f, 0.073314f, 0.111894f, 0.105684f, 0.062494f, 0.035374f, 0.034378f, 0.017735f, -0.027142f, -0.052915f, -0.024407f, 0.022722f, 0.028116f, -0.013868f, -0.055362f, -0.066124f, -0.069119f, -0.094576f, -0.122680f, -0.100213f, -0.014486f, 0.075343f, 0.099155f, 0.055635f, 0.009056f, 0.009599f, 0.040799f, 0.054429f, 0.037946f, 0.027022f, 0.053523f, 0.098025f, 0.105408f, 0.046190f} + }, + { + {0.027441f, 0.021679f, -0.082621f, -0.191948f, -0.202084f, -0.094108f, 0.096974f, 0.326618f, 0.521978f, 0.590057f, 0.497559f, 0.307017f, 0.099764f, -0.101988f, -0.307232f, -0.491820f, -0.609355f, -0.649595f, -0.646886f, -0.633907f, -0.612951f, -0.571444f, -0.505172f, -0.422223f, -0.334883f, -0.251121f, -0.170169f, -0.086087f, 0.003629f, 0.095234f, 0.184031f, 0.268139f, 0.346272f, 0.415753f, 0.474124f, 0.520403f, 0.554178f, 0.575097f, 0.583394f, 0.580090f, 0.567158f, 0.547787f, 0.525101f, 0.500036f, 0.471584f, 0.439385f, 0.404951f, 0.370416f, 0.337380f, 0.306853f, 0.278873f, 0.252040f, 0.224475f, 0.195404f, 0.165334f, 0.135006f, 0.104920f, 0.075648f, 0.047947f, 0.022412f, -0.000792f, -0.021853f, -0.040983f, -0.058167f, -0.073292f, -0.086448f, -0.097776f, -0.107101f, -0.114171f, -0.119257f, -0.122970f, -0.125515f, -0.126712f, -0.126774f, -0.126359f, -0.125690f, -0.124305f, -0.122054f, -0.119813f, -0.118756f, -0.119207f, -0.120613f, -0.122402f, -0.124386f, -0.126292f, -0.127367f, -0.126798f, -0.124468f, -0.121185f, -0.118139f, -0.116167f, -0.115553f, -0.116624f, -0.120458f, -0.128545f, -0.141294f, + -0.156980f, -0.172648f, -0.186184f, -0.197243f, -0.206090f, -0.211880f, -0.212427f, -0.205830f, -0.192230f, -0.173709f, -0.152371f, -0.128816f, -0.102692f, -0.074344f, -0.045427f, -0.018045f, 0.006404f, 0.027767f, 0.046885f, 0.064600f, 0.080777f, 0.094441f, 0.104938f, 0.112698f, 0.118996f, 0.125328f, 0.132751f, 0.141144f, 0.149168f, 0.155522f, 0.160126f, 0.163757f, 0.166992f, 0.170045f, 0.173074f, 0.175948f, 0.178087f, 0.179025f, 0.178790f, 0.177467f, 0.174929f, 0.171183f, 0.166401f, 0.160453f, 0.152932f, 0.143629f, 0.132548f, 0.119638f, 0.105028f, 0.089256f, 0.072911f, 0.056388f, 0.040116f, 0.024480f, 0.009419f, -0.005258f, -0.019264f, -0.032140f, -0.043833f, -0.054222f, -0.062625f, -0.068570f, -0.072428f, -0.074596f, -0.074922f, -0.073532f, -0.071151f, -0.068045f, -0.063754f, -0.058200f, -0.051948f, -0.045349f, -0.038611f, -0.032407f, -0.027221f, -0.022662f, -0.018431f, -0.014899f, -0.011798f, -0.007903f, -0.002918f, 0.002034f, 0.006392f, 0.010574f, 0.014257f, 0.016609f, 0.018102f, 0.019736f, 0.021213f, 0.022181f, 0.023713f, 0.026265f, 0.028470f, 0.029930f, 0.032014f, 0.034470f, + 0.035580f, 0.036329f, 0.038845f, 0.041238f, 0.041102f, 0.042047f, 0.047533f, 0.052212f, 0.051464f, 0.053228f, 0.064060f, 0.071678f, 0.064058f, 0.058056f, 0.078804f, 0.113563f, 0.120945f, 0.090397f, 0.057586f, 0.050567f, 0.053941f, 0.042361f, 0.020875f, 0.011317f, 0.018428f, 0.028794f, 0.030929f, 0.021922f, 0.003208f, -0.020240f, -0.044523f, -0.076714f, -0.128079f, -0.186110f, -0.204814f, -0.146629f, -0.038156f, 0.042081f, 0.052437f, 0.040839f, 0.071199f, 0.121547f, 0.126005f, 0.113437f, 0.196100f, 0.367783f, 0.422586f, 0.192647f}, + {0.027441f, 0.021679f, -0.082621f, -0.191948f, -0.202084f, -0.094108f, 0.096974f, 0.326618f, 0.521978f, 0.590057f, 0.497559f, 0.307017f, 0.099764f, -0.101988f, -0.307232f, -0.491820f, -0.609355f, -0.649595f, -0.646886f, -0.633907f, -0.612951f, -0.571444f, -0.505172f, -0.422223f, -0.334883f, -0.251121f, -0.170169f, -0.086087f, 0.003629f, 0.095234f, 0.184031f, 0.268139f, 0.346272f, 0.415753f, 0.474124f, 0.520403f, 0.554178f, 0.575097f, 0.583394f, 0.580090f, 0.567158f, 0.547787f, 0.525101f, 0.500036f, 0.471584f, 0.439385f, 0.404951f, 0.370416f, 0.337380f, 0.306853f, 0.278873f, 0.252040f, 0.224475f, 0.195404f, 0.165334f, 0.135006f, 0.104920f, 0.075648f, 0.047947f, 0.022412f, -0.000792f, -0.021853f, -0.040983f, -0.058167f, -0.073292f, -0.086448f, -0.097776f, -0.107101f, -0.114171f, -0.119257f, -0.122970f, -0.125515f, -0.126712f, -0.126774f, -0.126359f, -0.125690f, -0.124305f, -0.122054f, -0.119813f, -0.118756f, -0.119207f, -0.120613f, -0.122402f, -0.124386f, -0.126292f, -0.127367f, -0.126798f, -0.124468f, -0.121185f, -0.118139f, -0.116167f, -0.115553f, -0.116624f, -0.120458f, -0.128545f, -0.141294f, + -0.156980f, -0.172648f, -0.186184f, -0.197243f, -0.206090f, -0.211880f, -0.212427f, -0.205830f, -0.192230f, -0.173709f, -0.152371f, -0.128816f, -0.102692f, -0.074344f, -0.045427f, -0.018045f, 0.006404f, 0.027767f, 0.046885f, 0.064600f, 0.080777f, 0.094441f, 0.104938f, 0.112698f, 0.118996f, 0.125328f, 0.132751f, 0.141144f, 0.149168f, 0.155522f, 0.160126f, 0.163757f, 0.166992f, 0.170045f, 0.173074f, 0.175948f, 0.178087f, 0.179025f, 0.178790f, 0.177467f, 0.174929f, 0.171183f, 0.166401f, 0.160453f, 0.152932f, 0.143629f, 0.132548f, 0.119638f, 0.105028f, 0.089256f, 0.072911f, 0.056388f, 0.040116f, 0.024480f, 0.009419f, -0.005258f, -0.019264f, -0.032140f, -0.043833f, -0.054222f, -0.062625f, -0.068570f, -0.072428f, -0.074596f, -0.074922f, -0.073532f, -0.071151f, -0.068045f, -0.063754f, -0.058200f, -0.051948f, -0.045349f, -0.038611f, -0.032407f, -0.027221f, -0.022662f, -0.018431f, -0.014899f, -0.011798f, -0.007903f, -0.002918f, 0.002034f, 0.006392f, 0.010574f, 0.014257f, 0.016609f, 0.018102f, 0.019736f, 0.021213f, 0.022181f, 0.023713f, 0.026265f, 0.028470f, 0.029930f, 0.032014f, 0.034470f, + 0.035580f, 0.036329f, 0.038845f, 0.041238f, 0.041102f, 0.042047f, 0.047533f, 0.052212f, 0.051464f, 0.053228f, 0.064060f, 0.071678f, 0.064058f, 0.058056f, 0.078804f, 0.113563f, 0.120945f, 0.090397f, 0.057586f, 0.050567f, 0.053941f, 0.042361f, 0.020875f, 0.011317f, 0.018428f, 0.028794f, 0.030929f, 0.021922f, 0.003208f, -0.020240f, -0.044523f, -0.076714f, -0.128079f, -0.186110f, -0.204814f, -0.146629f, -0.038156f, 0.042081f, 0.052437f, 0.040839f, 0.071199f, 0.121547f, 0.126005f, 0.113437f, 0.196100f, 0.367783f, 0.422586f, 0.192647f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]={ + { + {0.897602f, 0.577826f, 0.108806f, -0.306523f, -0.566468f, -0.683867f, -0.708050f, -0.662267f, -0.546112f, -0.366162f, -0.147663f, 0.075830f, 0.274439f, 0.427135f, 0.523893f, 0.565927f, 0.561989f, 0.522411f, 0.455067f, 0.365320f, 0.258865f, 0.144039f, 0.030037f, -0.077847f, -0.179832f, -0.277247f, -0.367752f, -0.446478f, -0.510700f, -0.561304f, -0.600215f, -0.628591f, -0.647703f, -0.659706f, -0.666671f, -0.669681f, -0.669369f, -0.666740f, -0.662997f, -0.658812f, -0.654035f, -0.648036f, -0.640253f, -0.630498f, -0.618870f, -0.605516f, -0.590564f, -0.574163f, -0.556413f, -0.537291f, -0.516802f, -0.495178f, -0.472808f, -0.450009f, -0.427015f, -0.404157f, -0.381849f, -0.360307f, -0.339403f, -0.318926f, -0.298870f, -0.279294f, -0.260068f, -0.241018f, -0.222243f, -0.203976f, -0.186205f, -0.168754f, -0.151665f, -0.135094f, -0.118902f, -0.102773f, -0.086674f, -0.070750f, -0.054844f, -0.038640f, -0.022176f, -0.005693f, 0.010967f, 0.028233f, 0.046067f, 0.063897f, 0.081395f, 0.098808f, 0.116372f, 0.133779f, 0.150477f, 0.166354f, 0.181854f, 0.197372f, 0.212626f, 0.226853f, 0.239657f, 0.251401f, 0.262567f, 0.273031f, + 0.282281f, 0.290215f, 0.297417f, 0.304666f, 0.312357f, 0.320369f, 0.328416f, 0.336584f, 0.345432f, 0.355456f, 0.366574f, 0.378314f, 0.390352f, 0.402657f, 0.415266f, 0.428155f, 0.441199f, 0.454112f, 0.466543f, 0.478326f, 0.489500f, 0.500130f, 0.510290f, 0.520137f, 0.529784f, 0.539205f, 0.548418f, 0.557568f, 0.566687f, 0.575611f, 0.584243f, 0.592610f, 0.600634f, 0.608188f, 0.615368f, 0.622392f, 0.629357f, 0.636344f, 0.643544f, 0.651019f, 0.658638f, 0.666412f, 0.674501f, 0.682889f, 0.691585f, 0.700932f, 0.711138f, 0.721918f, 0.733181f, 0.745327f, 0.758323f, 0.771744f, 0.786076f, 0.802163f, 0.819709f, 0.839320f, 0.863573f, 0.887678f, 0.889456f, 0.843076f, 0.751715f, 0.655369f, 0.594023f, 0.571927f}, + {0.897602f, 0.577826f, 0.108806f, -0.306523f, -0.566468f, -0.683867f, -0.708050f, -0.662267f, -0.546112f, -0.366162f, -0.147663f, 0.075830f, 0.274439f, 0.427135f, 0.523893f, 0.565927f, 0.561989f, 0.522411f, 0.455067f, 0.365320f, 0.258865f, 0.144039f, 0.030037f, -0.077847f, -0.179832f, -0.277247f, -0.367752f, -0.446478f, -0.510700f, -0.561304f, -0.600215f, -0.628591f, -0.647703f, -0.659706f, -0.666671f, -0.669681f, -0.669369f, -0.666740f, -0.662997f, -0.658812f, -0.654035f, -0.648036f, -0.640253f, -0.630498f, -0.618870f, -0.605516f, -0.590564f, -0.574163f, -0.556413f, -0.537291f, -0.516802f, -0.495178f, -0.472808f, -0.450009f, -0.427015f, -0.404157f, -0.381849f, -0.360307f, -0.339403f, -0.318926f, -0.298870f, -0.279294f, -0.260068f, -0.241018f, -0.222243f, -0.203976f, -0.186205f, -0.168754f, -0.151665f, -0.135094f, -0.118902f, -0.102773f, -0.086674f, -0.070750f, -0.054844f, -0.038640f, -0.022176f, -0.005693f, 0.010967f, 0.028233f, 0.046067f, 0.063897f, 0.081395f, 0.098808f, 0.116372f, 0.133779f, 0.150477f, 0.166354f, 0.181854f, 0.197372f, 0.212626f, 0.226853f, 0.239657f, 0.251401f, 0.262567f, 0.273031f, + 0.282281f, 0.290215f, 0.297417f, 0.304666f, 0.312357f, 0.320369f, 0.328416f, 0.336584f, 0.345432f, 0.355456f, 0.366574f, 0.378314f, 0.390352f, 0.402657f, 0.415266f, 0.428155f, 0.441199f, 0.454112f, 0.466543f, 0.478326f, 0.489500f, 0.500130f, 0.510290f, 0.520137f, 0.529784f, 0.539205f, 0.548418f, 0.557568f, 0.566687f, 0.575611f, 0.584243f, 0.592610f, 0.600634f, 0.608188f, 0.615368f, 0.622392f, 0.629357f, 0.636344f, 0.643544f, 0.651019f, 0.658638f, 0.666412f, 0.674501f, 0.682889f, 0.691585f, 0.700932f, 0.711138f, 0.721918f, 0.733181f, 0.745327f, 0.758323f, 0.771744f, 0.786076f, 0.802163f, 0.819709f, 0.839320f, 0.863573f, 0.887678f, 0.889456f, 0.843076f, 0.751715f, 0.655369f, 0.594023f, 0.571927f} + }, + { + {0.025194f, 0.342112f, 0.675564f, 0.682494f, 0.258733f, -0.398681f, -0.973589f, -1.262576f, -1.256946f, -1.058731f, -0.764793f, -0.426634f, -0.073890f, 0.263727f, 0.559774f, 0.798438f, 0.971176f, 1.071852f, 1.099750f, 1.064803f, 0.985420f, 0.879037f, 0.754656f, 0.614706f, 0.462886f, 0.307828f, 0.158623f, 0.019325f, -0.110401f, -0.231143f, -0.342445f, -0.444256f, -0.537190f, -0.621517f, -0.697392f, -0.765776f, -0.828007f, -0.884703f, -0.935654f, -0.980323f, -1.017968f, -1.047912f, -1.070192f, -1.085582f, -1.094827f, -1.098295f, -1.096314f, -1.089341f, -1.077935f, -1.062999f, -1.045792f, -1.027186f, -1.007049f, -0.984675f, -0.959577f, -0.931701f, -0.901301f, -0.868883f, -0.835096f, -0.800590f, -0.766000f, -0.731849f, -0.698317f, -0.665445f, -0.633597f, -0.603249f, -0.574361f, -0.546664f, -0.520494f, -0.496496f, -0.474634f, -0.454436f, -0.436061f, -0.419958f, -0.405621f, -0.391915f, -0.378565f, -0.366066f, -0.354142f, -0.341591f, -0.327794f, -0.313265f, -0.298453f, -0.282899f, -0.265880f, -0.247319f, -0.227788f, -0.207881f, -0.187683f, -0.166750f, -0.144562f, -0.120841f, -0.095390f, -0.067900f, -0.038125f, -0.005978f, + 0.028618f, 0.065539f, 0.103963f, 0.142557f, 0.180312f, 0.216742f, 0.251282f, 0.283074f, 0.311414f, 0.335949f, 0.356498f, 0.373081f, 0.385974f, 0.395461f, 0.401900f, 0.406261f, 0.410013f, 0.414134f, 0.418648f, 0.423274f, 0.428046f, 0.433325f, 0.439768f, 0.448163f, 0.458716f, 0.470631f, 0.482794f, 0.494578f, 0.505783f, 0.516446f, 0.526959f, 0.537714f, 0.548520f, 0.558994f, 0.569308f, 0.579744f, 0.589954f, 0.599564f, 0.608906f, 0.618335f, 0.627675f, 0.637031f, 0.647025f, 0.657685f, 0.668438f, 0.679464f, 0.691511f, 0.704568f, 0.718501f, 0.734270f, 0.752608f, 0.772902f, 0.795176f, 0.820738f, 0.849727f, 0.882515f, 0.922967f, 0.969024f, 0.996502f, 0.969523f, 0.881689f, 0.774824f, 0.699914f, 0.669918f}, + {-0.025194f, -0.342112f, -0.675564f, -0.682494f, -0.258733f, 0.398681f, 0.973589f, 1.262576f, 1.256946f, 1.058731f, 0.764793f, 0.426634f, 0.073890f, -0.263727f, -0.559774f, -0.798438f, -0.971176f, -1.071852f, -1.099750f, -1.064803f, -0.985420f, -0.879037f, -0.754656f, -0.614706f, -0.462886f, -0.307828f, -0.158623f, -0.019325f, 0.110401f, 0.231143f, 0.342445f, 0.444256f, 0.537190f, 0.621517f, 0.697392f, 0.765776f, 0.828007f, 0.884703f, 0.935654f, 0.980323f, 1.017968f, 1.047912f, 1.070192f, 1.085582f, 1.094827f, 1.098295f, 1.096314f, 1.089341f, 1.077935f, 1.062999f, 1.045792f, 1.027186f, 1.007049f, 0.984675f, 0.959577f, 0.931701f, 0.901301f, 0.868883f, 0.835096f, 0.800590f, 0.766000f, 0.731849f, 0.698317f, 0.665445f, 0.633597f, 0.603249f, 0.574361f, 0.546664f, 0.520494f, 0.496496f, 0.474634f, 0.454436f, 0.436061f, 0.419958f, 0.405621f, 0.391915f, 0.378565f, 0.366066f, 0.354142f, 0.341591f, 0.327794f, 0.313265f, 0.298453f, 0.282899f, 0.265880f, 0.247319f, 0.227788f, 0.207881f, 0.187683f, 0.166750f, 0.144562f, 0.120841f, 0.095390f, 0.067900f, 0.038125f, 0.005978f, + -0.028618f, -0.065539f, -0.103963f, -0.142557f, -0.180312f, -0.216742f, -0.251282f, -0.283074f, -0.311414f, -0.335949f, -0.356498f, -0.373081f, -0.385974f, -0.395461f, -0.401900f, -0.406261f, -0.410013f, -0.414134f, -0.418648f, -0.423274f, -0.428046f, -0.433325f, -0.439768f, -0.448163f, -0.458716f, -0.470631f, -0.482794f, -0.494578f, -0.505783f, -0.516446f, -0.526959f, -0.537714f, -0.548520f, -0.558994f, -0.569308f, -0.579744f, -0.589954f, -0.599564f, -0.608906f, -0.618335f, -0.627675f, -0.637031f, -0.647025f, -0.657685f, -0.668438f, -0.679464f, -0.691511f, -0.704568f, -0.718501f, -0.734270f, -0.752608f, -0.772902f, -0.795176f, -0.820738f, -0.849727f, -0.882515f, -0.922967f, -0.969024f, -0.996502f, -0.969523f, -0.881689f, -0.774824f, -0.699914f, -0.669918f} + }, + { + {0.123783f, 0.079142f, -0.013604f, -0.105100f, -0.113185f, -0.024894f, 0.074468f, 0.098724f, 0.046327f, -0.027465f, -0.078213f, -0.088258f, -0.055710f, -0.000383f, 0.042236f, 0.057986f, 0.069486f, 0.099522f, 0.137420f, 0.156798f, 0.149156f, 0.123327f, 0.085399f, 0.036913f, -0.013895f, -0.054098f, -0.078834f, -0.094462f, -0.109491f, -0.126339f, -0.140883f, -0.147343f, -0.143570f, -0.132138f, -0.116877f, -0.100467f, -0.086153f, -0.078747f, -0.081336f, -0.092548f, -0.108797f, -0.127742f, -0.148326f, -0.169245f, -0.189131f, -0.207447f, -0.224308f, -0.239991f, -0.254774f, -0.268361f, -0.279300f, -0.285688f, -0.286493f, -0.281631f, -0.271021f, -0.254283f, -0.231338f, -0.202668f, -0.168822f, -0.129974f, -0.086151f, -0.037693f, 0.014755f, 0.070664f, 0.129601f, 0.190610f, 0.252066f, 0.312376f, 0.370362f, 0.424702f, 0.473595f, 0.515352f, 0.548741f, 0.572621f, 0.586173f, 0.589753f, 0.584497f, 0.570819f, 0.548637f, 0.519448f, 0.486508f, 0.451975f, 0.415486f, 0.376839f, 0.338596f, 0.304072f, 0.273539f, 0.244560f, 0.216101f, 0.190399f, 0.170141f, 0.155231f, 0.143391f, 0.133067f, 0.124640f, 0.119123f, + 0.116745f, 0.116888f, 0.118578f, 0.120715f, 0.122313f, 0.122982f, 0.123106f, 0.123239f, 0.123145f, 0.121392f, 0.116164f, 0.106765f, 0.094311f, 0.080694f, 0.066929f, 0.052762f, 0.037599f, 0.021374f, 0.004602f, -0.011834f, -0.026863f, -0.039513f, -0.049167f, -0.055515f, -0.058454f, -0.058150f, -0.054920f, -0.048913f, -0.040142f, -0.028937f, -0.016071f, -0.002374f, 0.011525f, 0.025132f, 0.038028f, 0.049816f, 0.059954f, 0.067900f, 0.073662f, 0.077971f, 0.081798f, 0.086018f, 0.091452f, 0.098460f, 0.106332f, 0.113772f, 0.120190f, 0.125901f, 0.131052f, 0.135199f, 0.138076f, 0.139868f, 0.140465f, 0.139339f, 0.136539f, 0.132830f, 0.127801f, 0.118282f, 0.100330f, 0.074236f, 0.047165f, 0.028710f, 0.022439f, 0.022954f}, + {0.123783f, 0.079142f, -0.013604f, -0.105100f, -0.113185f, -0.024894f, 0.074468f, 0.098724f, 0.046327f, -0.027465f, -0.078213f, -0.088258f, -0.055710f, -0.000383f, 0.042236f, 0.057986f, 0.069486f, 0.099522f, 0.137420f, 0.156798f, 0.149156f, 0.123327f, 0.085399f, 0.036913f, -0.013895f, -0.054098f, -0.078834f, -0.094462f, -0.109491f, -0.126339f, -0.140883f, -0.147343f, -0.143570f, -0.132138f, -0.116877f, -0.100467f, -0.086153f, -0.078747f, -0.081336f, -0.092548f, -0.108797f, -0.127742f, -0.148326f, -0.169245f, -0.189131f, -0.207447f, -0.224308f, -0.239991f, -0.254774f, -0.268361f, -0.279300f, -0.285688f, -0.286493f, -0.281631f, -0.271021f, -0.254283f, -0.231338f, -0.202668f, -0.168822f, -0.129974f, -0.086151f, -0.037693f, 0.014755f, 0.070664f, 0.129601f, 0.190610f, 0.252066f, 0.312376f, 0.370362f, 0.424702f, 0.473595f, 0.515352f, 0.548741f, 0.572621f, 0.586173f, 0.589753f, 0.584497f, 0.570819f, 0.548637f, 0.519448f, 0.486508f, 0.451975f, 0.415486f, 0.376839f, 0.338596f, 0.304072f, 0.273539f, 0.244560f, 0.216101f, 0.190399f, 0.170141f, 0.155231f, 0.143391f, 0.133067f, 0.124640f, 0.119123f, + 0.116745f, 0.116888f, 0.118578f, 0.120715f, 0.122313f, 0.122982f, 0.123106f, 0.123239f, 0.123145f, 0.121392f, 0.116164f, 0.106765f, 0.094311f, 0.080694f, 0.066929f, 0.052762f, 0.037599f, 0.021374f, 0.004602f, -0.011834f, -0.026863f, -0.039513f, -0.049167f, -0.055515f, -0.058454f, -0.058150f, -0.054920f, -0.048913f, -0.040142f, -0.028937f, -0.016071f, -0.002374f, 0.011525f, 0.025132f, 0.038028f, 0.049816f, 0.059954f, 0.067900f, 0.073662f, 0.077971f, 0.081798f, 0.086018f, 0.091452f, 0.098460f, 0.106332f, 0.113772f, 0.120190f, 0.125901f, 0.131052f, 0.135199f, 0.138076f, 0.139868f, 0.140465f, 0.139339f, 0.136539f, 0.132830f, 0.127801f, 0.118282f, 0.100330f, 0.074236f, 0.047165f, 0.028710f, 0.022439f, 0.022954f} + }, + { + {0.022041f, 0.041073f, 0.023192f, -0.049439f, -0.115087f, -0.109721f, -0.051812f, -0.018474f, -0.053835f, -0.129015f, -0.184936f, -0.189273f, -0.150509f, -0.096286f, -0.047125f, -0.003652f, 0.046865f, 0.111479f, 0.180387f, 0.235653f, 0.266376f, 0.271854f, 0.255690f, 0.223813f, 0.185119f, 0.146033f, 0.103929f, 0.051053f, -0.014916f, -0.088609f, -0.164699f, -0.242434f, -0.321099f, -0.395711f, -0.460083f, -0.511538f, -0.550187f, -0.575553f, -0.586525f, -0.583852f, -0.570627f, -0.550265f, -0.525062f, -0.496520f, -0.466042f, -0.434860f, -0.403494f, -0.371536f, -0.338271f, -0.303703f, -0.268969f, -0.235863f, -0.206239f, -0.181539f, -0.162004f, -0.146110f, -0.131475f, -0.116507f, -0.100761f, -0.084071f, -0.066392f, -0.048344f, -0.030824f, -0.014005f, 0.002442f, 0.018433f, 0.033863f, 0.049525f, 0.066361f, 0.084044f, 0.101603f, 0.119134f, 0.137365f, 0.155718f, 0.172448f, 0.186743f, 0.199023f, 0.208891f, 0.214543f, 0.214968f, 0.211256f, 0.204664f, 0.194649f, 0.180250f, 0.162586f, 0.144266f, 0.126558f, 0.108656f, 0.089774f, 0.070272f, 0.050282f, 0.028810f, 0.005195f, -0.019706f, -0.044775f, -0.070130f, + -0.096279f, -0.122442f, -0.146818f, -0.168301f, -0.187141f, -0.203936f, -0.218346f, -0.228848f, -0.233859f, -0.233385f, -0.229288f, -0.223466f, -0.215952f, -0.205276f, -0.190468f, -0.172326f, -0.153023f, -0.134730f, -0.118099f, -0.101742f, -0.083649f, -0.063397f, -0.042664f, -0.023688f, -0.007718f, 0.005386f, 0.016948f, 0.028798f, 0.041965f, 0.055994f, 0.069887f, 0.083350f, 0.096784f, 0.110737f, 0.125898f, 0.142980f, 0.162069f, 0.182529f, 0.203711f, 0.225239f, 0.246691f, 0.267725f, 0.288408f, 0.308817f, 0.328558f, 0.347128f, 0.364265f, 0.379624f, 0.392789f, 0.403810f, 0.413056f, 0.420712f, 0.427179f, 0.433354f, 0.439897f, 0.447590f, 0.458254f, 0.470968f, 0.475795f, 0.458226f, 0.416144f, 0.367510f, 0.333844f, 0.320329f}, + {0.022041f, 0.041073f, 0.023192f, -0.049439f, -0.115087f, -0.109721f, -0.051812f, -0.018474f, -0.053835f, -0.129015f, -0.184936f, -0.189273f, -0.150509f, -0.096286f, -0.047125f, -0.003652f, 0.046865f, 0.111479f, 0.180387f, 0.235653f, 0.266376f, 0.271854f, 0.255690f, 0.223813f, 0.185119f, 0.146033f, 0.103929f, 0.051053f, -0.014916f, -0.088609f, -0.164699f, -0.242434f, -0.321099f, -0.395711f, -0.460083f, -0.511538f, -0.550187f, -0.575553f, -0.586525f, -0.583852f, -0.570627f, -0.550265f, -0.525062f, -0.496520f, -0.466042f, -0.434860f, -0.403494f, -0.371536f, -0.338271f, -0.303703f, -0.268969f, -0.235863f, -0.206239f, -0.181539f, -0.162004f, -0.146110f, -0.131475f, -0.116507f, -0.100761f, -0.084071f, -0.066392f, -0.048344f, -0.030824f, -0.014005f, 0.002442f, 0.018433f, 0.033863f, 0.049525f, 0.066361f, 0.084044f, 0.101603f, 0.119134f, 0.137365f, 0.155718f, 0.172448f, 0.186743f, 0.199023f, 0.208891f, 0.214543f, 0.214968f, 0.211256f, 0.204664f, 0.194649f, 0.180250f, 0.162586f, 0.144266f, 0.126558f, 0.108656f, 0.089774f, 0.070272f, 0.050282f, 0.028810f, 0.005195f, -0.019706f, -0.044775f, -0.070130f, + -0.096279f, -0.122442f, -0.146818f, -0.168301f, -0.187141f, -0.203936f, -0.218346f, -0.228848f, -0.233859f, -0.233385f, -0.229288f, -0.223466f, -0.215952f, -0.205276f, -0.190468f, -0.172326f, -0.153023f, -0.134730f, -0.118099f, -0.101742f, -0.083649f, -0.063397f, -0.042664f, -0.023688f, -0.007718f, 0.005386f, 0.016948f, 0.028798f, 0.041965f, 0.055994f, 0.069887f, 0.083350f, 0.096784f, 0.110737f, 0.125898f, 0.142980f, 0.162069f, 0.182529f, 0.203711f, 0.225239f, 0.246691f, 0.267725f, 0.288408f, 0.308817f, 0.328558f, 0.347128f, 0.364265f, 0.379624f, 0.392789f, 0.403810f, 0.413056f, 0.420712f, 0.427179f, 0.433354f, 0.439897f, 0.447590f, 0.458254f, 0.470968f, 0.475795f, 0.458226f, 0.416144f, 0.367510f, 0.333844f, 0.320329f} + }, + { + {-0.005214f, -0.012035f, -0.009014f, 0.007877f, 0.019283f, 0.010352f, -0.005363f, -0.007510f, -0.007889f, -0.044647f, -0.130133f, -0.222011f, -0.261436f, -0.231829f, -0.165637f, -0.098922f, -0.037652f, 0.029690f, 0.105217f, 0.179277f, 0.244858f, 0.300922f, 0.344183f, 0.368195f, 0.371300f, 0.358203f, 0.332456f, 0.292925f, 0.238828f, 0.173336f, 0.100520f, 0.022498f, -0.058965f, -0.141179f, -0.221961f, -0.299269f, -0.368344f, -0.422261f, -0.457042f, -0.474532f, -0.479617f, -0.476556f, -0.468368f, -0.457295f, -0.444411f, -0.429759f, -0.413316f, -0.395072f, -0.374540f, -0.351376f, -0.326316f, -0.300687f, -0.275591f, -0.252211f, -0.231900f, -0.215002f, -0.200352f, -0.186616f, -0.173280f, -0.159962f, -0.145930f, -0.130822f, -0.114800f, -0.097728f, -0.079173f, -0.059239f, -0.038296f, -0.016038f, 0.008048f, 0.033506f, 0.059464f, 0.086049f, 0.113882f, 0.142353f, 0.169789f, 0.195294f, 0.218976f, 0.240131f, 0.256716f, 0.267460f, 0.273427f, 0.276291f, 0.275776f, 0.270341f, 0.260230f, 0.247866f, 0.234578f, 0.218792f, 0.198739f, 0.175404f, 0.151105f, 0.126417f, 0.100478f, 0.073625f, 0.047824f, 0.024650f, + 0.004240f, -0.013904f, -0.030088f, -0.044324f, -0.056473f, -0.066662f, -0.075552f, -0.083740f, -0.091164f, -0.097859f, -0.104823f, -0.112999f, -0.121758f, -0.129448f, -0.135168f, -0.139283f, -0.142788f, -0.146790f, -0.151766f, -0.156646f, -0.159449f, -0.159367f, -0.157478f, -0.155349f, -0.153958f, -0.153759f, -0.154479f, -0.154881f, -0.153809f, -0.151277f, -0.147765f, -0.143164f, -0.137159f, -0.129701f, -0.120395f, -0.108503f, -0.094137f, -0.078348f, -0.061862f, -0.044971f, -0.028452f, -0.013082f, 0.001363f, 0.015222f, 0.027814f, 0.038476f, 0.047586f, 0.055404f, 0.061486f, 0.066217f, 0.071000f, 0.076305f, 0.081762f, 0.088199f, 0.096942f, 0.108135f, 0.123108f, 0.145741f, 0.175423f, 0.200807f, 0.208485f, 0.197997f, 0.181833f, 0.171727f}, + {0.005214f, 0.012035f, 0.009014f, -0.007877f, -0.019283f, -0.010352f, 0.005363f, 0.007510f, 0.007889f, 0.044647f, 0.130133f, 0.222011f, 0.261436f, 0.231829f, 0.165637f, 0.098922f, 0.037652f, -0.029690f, -0.105217f, -0.179277f, -0.244858f, -0.300922f, -0.344183f, -0.368195f, -0.371300f, -0.358203f, -0.332456f, -0.292925f, -0.238828f, -0.173336f, -0.100520f, -0.022498f, 0.058965f, 0.141179f, 0.221961f, 0.299269f, 0.368344f, 0.422261f, 0.457042f, 0.474532f, 0.479617f, 0.476556f, 0.468368f, 0.457295f, 0.444411f, 0.429759f, 0.413316f, 0.395072f, 0.374540f, 0.351376f, 0.326316f, 0.300687f, 0.275591f, 0.252211f, 0.231900f, 0.215002f, 0.200352f, 0.186616f, 0.173280f, 0.159962f, 0.145930f, 0.130822f, 0.114800f, 0.097728f, 0.079173f, 0.059239f, 0.038296f, 0.016038f, -0.008048f, -0.033506f, -0.059464f, -0.086049f, -0.113882f, -0.142353f, -0.169789f, -0.195294f, -0.218976f, -0.240131f, -0.256716f, -0.267460f, -0.273427f, -0.276291f, -0.275776f, -0.270341f, -0.260230f, -0.247866f, -0.234578f, -0.218792f, -0.198739f, -0.175404f, -0.151105f, -0.126417f, -0.100478f, -0.073625f, -0.047824f, -0.024650f, + -0.004240f, 0.013904f, 0.030088f, 0.044324f, 0.056473f, 0.066662f, 0.075552f, 0.083740f, 0.091164f, 0.097859f, 0.104823f, 0.112999f, 0.121758f, 0.129448f, 0.135168f, 0.139283f, 0.142788f, 0.146790f, 0.151766f, 0.156646f, 0.159449f, 0.159367f, 0.157478f, 0.155349f, 0.153958f, 0.153759f, 0.154479f, 0.154881f, 0.153809f, 0.151277f, 0.147765f, 0.143164f, 0.137159f, 0.129701f, 0.120395f, 0.108503f, 0.094137f, 0.078348f, 0.061862f, 0.044971f, 0.028452f, 0.013082f, -0.001363f, -0.015222f, -0.027814f, -0.038476f, -0.047586f, -0.055404f, -0.061486f, -0.066217f, -0.071000f, -0.076305f, -0.081762f, -0.088199f, -0.096942f, -0.108135f, -0.123108f, -0.145741f, -0.175423f, -0.200807f, -0.208485f, -0.197997f, -0.181833f, -0.171727f} + }, + { + {0.008681f, -0.007006f, 0.004000f, 0.026347f, 0.002760f, -0.038331f, 0.006171f, 0.136506f, 0.198542f, 0.078413f, -0.135945f, -0.262918f, -0.236625f, -0.135691f, -0.048903f, 0.007812f, 0.055850f, 0.104669f, 0.150421f, 0.186943f, 0.205853f, 0.201553f, 0.178803f, 0.147187f, 0.112390f, 0.078987f, 0.053819f, 0.039640f, 0.032313f, 0.029119f, 0.032808f, 0.043807f, 0.055721f, 0.062616f, 0.065392f, 0.068013f, 0.071303f, 0.072155f, 0.066110f, 0.050305f, 0.025937f, -0.002323f, -0.030282f, -0.056406f, -0.080135f, -0.100964f, -0.120011f, -0.139825f, -0.161681f, -0.184845f, -0.208443f, -0.232018f, -0.254562f, -0.274818f, -0.291910f, -0.304396f, -0.309955f, -0.307333f, -0.297155f, -0.279908f, -0.255047f, -0.222884f, -0.185171f, -0.142916f, -0.095718f, -0.043976f, 0.010261f, 0.065148f, 0.119827f, 0.172971f, 0.222331f, 0.265979f, 0.302588f, 0.330642f, 0.348872f, 0.357338f, 0.356806f, 0.347327f, 0.328721f, 0.302266f, 0.270550f, 0.235332f, 0.196512f, 0.153780f, 0.108694f, 0.064148f, 0.021732f, -0.019338f, -0.060114f, -0.099823f, -0.136838f, -0.170677f, -0.201625f, -0.229144f, -0.252213f, -0.270647f, + -0.284574f, -0.293091f, -0.294909f, -0.290009f, -0.279511f, -0.264143f, -0.243706f, -0.217880f, -0.187362f, -0.154731f, -0.123924f, -0.097637f, -0.075158f, -0.053870f, -0.032820f, -0.013784f, 0.000845f, 0.010043f, 0.014447f, 0.015892f, 0.016428f, 0.016909f, 0.016785f, 0.015629f, 0.014101f, 0.013167f, 0.013445f, 0.015591f, 0.020168f, 0.026843f, 0.034697f, 0.043310f, 0.052551f, 0.061637f, 0.069506f, 0.075771f, 0.080384f, 0.082989f, 0.083492f, 0.082527f, 0.080660f, 0.077997f, 0.074980f, 0.072358f, 0.070026f, 0.067161f, 0.063681f, 0.060202f, 0.056641f, 0.052323f, 0.047305f, 0.042095f, 0.036453f, 0.029989f, 0.023331f, 0.017095f, 0.010304f, 0.001573f, -0.008448f, -0.017114f, -0.022058f, -0.022784f, -0.020762f, -0.018652f}, + {-0.008681f, 0.007006f, -0.004000f, -0.026347f, -0.002760f, 0.038331f, -0.006171f, -0.136506f, -0.198542f, -0.078413f, 0.135945f, 0.262918f, 0.236625f, 0.135691f, 0.048903f, -0.007812f, -0.055850f, -0.104669f, -0.150421f, -0.186943f, -0.205853f, -0.201553f, -0.178803f, -0.147187f, -0.112390f, -0.078987f, -0.053819f, -0.039640f, -0.032313f, -0.029119f, -0.032808f, -0.043807f, -0.055721f, -0.062616f, -0.065392f, -0.068013f, -0.071303f, -0.072155f, -0.066110f, -0.050305f, -0.025937f, 0.002323f, 0.030282f, 0.056406f, 0.080135f, 0.100964f, 0.120011f, 0.139825f, 0.161681f, 0.184845f, 0.208443f, 0.232018f, 0.254562f, 0.274818f, 0.291910f, 0.304396f, 0.309955f, 0.307333f, 0.297155f, 0.279908f, 0.255047f, 0.222884f, 0.185171f, 0.142916f, 0.095718f, 0.043976f, -0.010261f, -0.065148f, -0.119827f, -0.172971f, -0.222331f, -0.265979f, -0.302588f, -0.330642f, -0.348872f, -0.357338f, -0.356806f, -0.347327f, -0.328721f, -0.302266f, -0.270550f, -0.235332f, -0.196512f, -0.153780f, -0.108694f, -0.064148f, -0.021732f, 0.019338f, 0.060114f, 0.099823f, 0.136838f, 0.170677f, 0.201625f, 0.229144f, 0.252213f, 0.270647f, + 0.284574f, 0.293091f, 0.294909f, 0.290009f, 0.279511f, 0.264143f, 0.243706f, 0.217880f, 0.187362f, 0.154731f, 0.123924f, 0.097637f, 0.075158f, 0.053870f, 0.032820f, 0.013784f, -0.000845f, -0.010043f, -0.014447f, -0.015892f, -0.016428f, -0.016909f, -0.016785f, -0.015629f, -0.014101f, -0.013167f, -0.013445f, -0.015591f, -0.020168f, -0.026843f, -0.034697f, -0.043310f, -0.052551f, -0.061637f, -0.069506f, -0.075771f, -0.080384f, -0.082989f, -0.083492f, -0.082527f, -0.080660f, -0.077997f, -0.074980f, -0.072358f, -0.070026f, -0.067161f, -0.063681f, -0.060202f, -0.056641f, -0.052323f, -0.047305f, -0.042095f, -0.036453f, -0.029989f, -0.023331f, -0.017095f, -0.010304f, -0.001573f, 0.008448f, 0.017114f, 0.022058f, 0.022784f, 0.020762f, 0.018652f} + }, + { + {0.010401f, 0.011253f, -0.005738f, -0.037817f, -0.058181f, -0.060618f, -0.068188f, -0.079320f, -0.041748f, 0.085251f, 0.260974f, 0.390110f, 0.414471f, 0.352584f, 0.254882f, 0.151981f, 0.053337f, -0.032528f, -0.097690f, -0.144583f, -0.181281f, -0.210195f, -0.228688f, -0.236078f, -0.233043f, -0.217999f, -0.191257f, -0.161169f, -0.139941f, -0.132615f, -0.133470f, -0.133307f, -0.127486f, -0.116641f, -0.102612f, -0.085894f, -0.066281f, -0.044043f, -0.019652f, 0.006743f, 0.034431f, 0.061010f, 0.083425f, 0.100521f, 0.113804f, 0.125411f, 0.136119f, 0.145525f, 0.153189f, 0.158951f, 0.162658f, 0.164140f, 0.163216f, 0.159523f, 0.152636f, 0.142591f, 0.130108f, 0.116292f, 0.102235f, 0.088793f, 0.076467f, 0.065511f, 0.056223f, 0.049044f, 0.044299f, 0.042089f, 0.042633f, 0.046534f, 0.054462f, 0.066587f, 0.082521f, 0.101885f, 0.124801f, 0.151564f, 0.181885f, 0.214821f, 0.249618f, 0.286081f, 0.323727f, 0.361053f, 0.396309f, 0.428665f, 0.457905f, 0.483250f, 0.503314f, 0.517194f, 0.524894f, 0.526702f, 0.522777f, 0.513215f, 0.497742f, 0.475384f, 0.445311f, 0.408344f, 0.367083f, 0.324169f, + 0.280673f, 0.236428f, 0.191872f, 0.149429f, 0.112868f, 0.084975f, 0.065708f, 0.052790f, 0.044161f, 0.039640f, 0.040280f, 0.046572f, 0.057462f, 0.070737f, 0.084014f, 0.095537f, 0.104450f, 0.110574f, 0.114025f, 0.114888f, 0.112953f, 0.107615f, 0.098282f, 0.085047f, 0.068865f, 0.050993f, 0.032402f, 0.013636f, -0.005100f, -0.023831f, -0.042533f, -0.060949f, -0.078915f, -0.096773f, -0.115088f, -0.133965f, -0.152974f, -0.171700f, -0.190072f, -0.208255f, -0.226621f, -0.245729f, -0.265976f, -0.287239f, -0.308946f, -0.330305f, -0.350469f, -0.368845f, -0.385301f, -0.399717f, -0.411580f, -0.420680f, -0.427727f, -0.433416f, -0.437771f, -0.441680f, -0.446803f, -0.450047f, -0.439787f, -0.404903f, -0.350495f, -0.298509f, -0.267685f, -0.257452f}, + {0.010401f, 0.011253f, -0.005738f, -0.037817f, -0.058181f, -0.060618f, -0.068188f, -0.079320f, -0.041748f, 0.085251f, 0.260974f, 0.390110f, 0.414471f, 0.352584f, 0.254882f, 0.151981f, 0.053337f, -0.032528f, -0.097690f, -0.144583f, -0.181281f, -0.210195f, -0.228688f, -0.236078f, -0.233043f, -0.217999f, -0.191257f, -0.161169f, -0.139941f, -0.132615f, -0.133470f, -0.133307f, -0.127486f, -0.116641f, -0.102612f, -0.085894f, -0.066281f, -0.044043f, -0.019652f, 0.006743f, 0.034431f, 0.061010f, 0.083425f, 0.100521f, 0.113804f, 0.125411f, 0.136119f, 0.145525f, 0.153189f, 0.158951f, 0.162658f, 0.164140f, 0.163216f, 0.159523f, 0.152636f, 0.142591f, 0.130108f, 0.116292f, 0.102235f, 0.088793f, 0.076467f, 0.065511f, 0.056223f, 0.049044f, 0.044299f, 0.042089f, 0.042633f, 0.046534f, 0.054462f, 0.066587f, 0.082521f, 0.101885f, 0.124801f, 0.151564f, 0.181885f, 0.214821f, 0.249618f, 0.286081f, 0.323727f, 0.361053f, 0.396309f, 0.428665f, 0.457905f, 0.483250f, 0.503314f, 0.517194f, 0.524894f, 0.526702f, 0.522777f, 0.513215f, 0.497742f, 0.475384f, 0.445311f, 0.408344f, 0.367083f, 0.324169f, + 0.280673f, 0.236428f, 0.191872f, 0.149429f, 0.112868f, 0.084975f, 0.065708f, 0.052790f, 0.044161f, 0.039640f, 0.040280f, 0.046572f, 0.057462f, 0.070737f, 0.084014f, 0.095537f, 0.104450f, 0.110574f, 0.114025f, 0.114888f, 0.112953f, 0.107615f, 0.098282f, 0.085047f, 0.068865f, 0.050993f, 0.032402f, 0.013636f, -0.005100f, -0.023831f, -0.042533f, -0.060949f, -0.078915f, -0.096773f, -0.115088f, -0.133965f, -0.152974f, -0.171700f, -0.190072f, -0.208255f, -0.226621f, -0.245729f, -0.265976f, -0.287239f, -0.308946f, -0.330305f, -0.350469f, -0.368845f, -0.385301f, -0.399717f, -0.411580f, -0.420680f, -0.427727f, -0.433416f, -0.437771f, -0.441680f, -0.446803f, -0.450047f, -0.439787f, -0.404903f, -0.350495f, -0.298509f, -0.267685f, -0.257452f} + }, + { + {0.036665f, -0.035275f, -0.114586f, -0.118718f, -0.015407f, 0.134760f, 0.211391f, 0.139028f, -0.031067f, -0.164438f, -0.178059f, -0.109666f, -0.046695f, -0.024403f, -0.021231f, -0.019183f, -0.020786f, -0.019318f, 0.001305f, 0.033895f, 0.049781f, 0.039580f, 0.025871f, 0.029449f, 0.045676f, 0.061011f, 0.073286f, 0.086158f, 0.096886f, 0.098911f, 0.090055f, 0.073542f, 0.055125f, 0.040281f, 0.029997f, 0.019065f, 0.001405f, -0.023950f, -0.053831f, -0.084724f, -0.113197f, -0.135819f, -0.151486f, -0.161898f, -0.168472f, -0.171078f, -0.170195f, -0.167525f, -0.163981f, -0.159417f, -0.154294f, -0.149463f, -0.144644f, -0.139019f, -0.132677f, -0.125920f, -0.118076f, -0.108431f, -0.097501f, -0.086377f, -0.075686f, -0.065850f, -0.057526f, -0.051345f, -0.047649f, -0.046281f, -0.046306f, -0.046648f, -0.047277f, -0.048699f, -0.050162f, -0.049930f, -0.047471f, -0.043537f, -0.037855f, -0.028614f, -0.014546f, 0.004109f, 0.026848f, 0.053650f, 0.084403f, 0.118539f, 0.154999f, 0.192146f, 0.228589f, 0.264237f, 0.299074f, 0.331034f, 0.357520f, 0.379308f, 0.400066f, 0.421005f, 0.438529f, 0.448405f, 0.450190f, 0.446198f, + 0.437637f, 0.423191f, 0.400965f, 0.371104f, 0.336181f, 0.298645f, 0.258247f, 0.213115f, 0.163286f, 0.111757f, 0.061822f, 0.014570f, -0.030995f, -0.076478f, -0.122515f, -0.167505f, -0.208248f, -0.242655f, -0.271265f, -0.295587f, -0.316112f, -0.332553f, -0.344736f, -0.352592f, -0.356405f, -0.357380f, -0.356859f, -0.355036f, -0.351548f, -0.346820f, -0.341632f, -0.335951f, -0.329211f, -0.320835f, -0.309876f, -0.295618f, -0.279195f, -0.263025f, -0.248221f, -0.234100f, -0.220000f, -0.205518f, -0.189543f, -0.171498f, -0.152987f, -0.136079f, -0.120874f, -0.106575f, -0.093232f, -0.080535f, -0.067000f, -0.052177f, -0.037476f, -0.023661f, -0.010075f, 0.003625f, 0.018537f, 0.038226f, 0.063691f, 0.087121f, 0.097456f, 0.092996f, 0.082823f, 0.076118f}, + {0.036665f, -0.035275f, -0.114586f, -0.118718f, -0.015407f, 0.134760f, 0.211391f, 0.139028f, -0.031067f, -0.164438f, -0.178059f, -0.109666f, -0.046695f, -0.024403f, -0.021231f, -0.019183f, -0.020786f, -0.019318f, 0.001305f, 0.033895f, 0.049781f, 0.039580f, 0.025871f, 0.029449f, 0.045676f, 0.061011f, 0.073286f, 0.086158f, 0.096886f, 0.098911f, 0.090055f, 0.073542f, 0.055125f, 0.040281f, 0.029997f, 0.019065f, 0.001405f, -0.023950f, -0.053831f, -0.084724f, -0.113197f, -0.135819f, -0.151486f, -0.161898f, -0.168472f, -0.171078f, -0.170195f, -0.167525f, -0.163981f, -0.159417f, -0.154294f, -0.149463f, -0.144644f, -0.139019f, -0.132677f, -0.125920f, -0.118076f, -0.108431f, -0.097501f, -0.086377f, -0.075686f, -0.065850f, -0.057526f, -0.051345f, -0.047649f, -0.046281f, -0.046306f, -0.046648f, -0.047277f, -0.048699f, -0.050162f, -0.049930f, -0.047471f, -0.043537f, -0.037855f, -0.028614f, -0.014546f, 0.004109f, 0.026848f, 0.053650f, 0.084403f, 0.118539f, 0.154999f, 0.192146f, 0.228589f, 0.264237f, 0.299074f, 0.331034f, 0.357520f, 0.379308f, 0.400066f, 0.421005f, 0.438529f, 0.448405f, 0.450190f, 0.446198f, + 0.437637f, 0.423191f, 0.400965f, 0.371104f, 0.336181f, 0.298645f, 0.258247f, 0.213115f, 0.163286f, 0.111757f, 0.061822f, 0.014570f, -0.030995f, -0.076478f, -0.122515f, -0.167505f, -0.208248f, -0.242655f, -0.271265f, -0.295587f, -0.316112f, -0.332553f, -0.344736f, -0.352592f, -0.356405f, -0.357380f, -0.356859f, -0.355036f, -0.351548f, -0.346820f, -0.341632f, -0.335951f, -0.329211f, -0.320835f, -0.309876f, -0.295618f, -0.279195f, -0.263025f, -0.248221f, -0.234100f, -0.220000f, -0.205518f, -0.189543f, -0.171498f, -0.152987f, -0.136079f, -0.120874f, -0.106575f, -0.093232f, -0.080535f, -0.067000f, -0.052177f, -0.037476f, -0.023661f, -0.010075f, 0.003625f, 0.018537f, 0.038226f, 0.063691f, 0.087121f, 0.097456f, 0.092996f, 0.082823f, 0.076118f} + }, + { + {-0.008953f, 0.064232f, 0.094587f, 0.004517f, -0.161443f, -0.310666f, -0.382836f, -0.340098f, -0.159090f, 0.119965f, 0.388400f, 0.559679f, 0.635026f, 0.652824f, 0.614612f, 0.501215f, 0.332040f, 0.161390f, 0.022521f, -0.093546f, -0.206716f, -0.319236f, -0.419351f, -0.496904f, -0.550885f, -0.588411f, -0.617946f, -0.641341f, -0.653668f, -0.650802f, -0.633429f, -0.603472f, -0.561247f, -0.507426f, -0.444484f, -0.375202f, -0.301814f, -0.226782f, -0.152889f, -0.082752f, -0.018798f, 0.037516f, 0.087042f, 0.131996f, 0.173092f, 0.208904f, 0.238119f, 0.260931f, 0.278385f, 0.291978f, 0.303791f, 0.315427f, 0.326675f, 0.336106f, 0.342711f, 0.346235f, 0.346522f, 0.343445f, 0.337281f, 0.328630f, 0.318130f, 0.306322f, 0.293494f, 0.279679f, 0.265033f, 0.249931f, 0.234518f, 0.218749f, 0.203017f, 0.188064f, 0.174092f, 0.160740f, 0.148084f, 0.136713f, 0.126662f, 0.117293f, 0.108500f, 0.101106f, 0.095680f, 0.091654f, 0.087922f, 0.083778f, 0.079032f, 0.073611f, 0.067353f, 0.060218f, 0.052743f, 0.046136f, 0.041541f, 0.039159f, 0.038398f, 0.038857f, 0.040687f, 0.043768f, 0.046732f, 0.047020f, + 0.042169f, 0.031387f, 0.015858f, -0.002845f, -0.024544f, -0.050092f, -0.079230f, -0.109526f, -0.137786f, -0.162138f, -0.182539f, -0.199609f, -0.213243f, -0.222324f, -0.225756f, -0.223768f, -0.218019f, -0.210365f, -0.201676f, -0.191803f, -0.180339f, -0.167382f, -0.153889f, -0.141348f, -0.130799f, -0.122005f, -0.113636f, -0.104260f, -0.093244f, -0.081045f, -0.068752f, -0.057146f, -0.046134f, -0.035156f, -0.023843f, -0.012002f, 0.000616f, 0.014000f, 0.027669f, 0.041253f, 0.054871f, 0.068605f, 0.082172f, 0.095499f, 0.108853f, 0.122030f, 0.134208f, 0.144885f, 0.154018f, 0.161135f, 0.165524f, 0.167382f, 0.167449f, 0.165627f, 0.161493f, 0.155562f, 0.147668f, 0.134574f, 0.112712f, 0.084430f, 0.058667f, 0.043534f, 0.039424f, 0.040242f}, + {-0.008953f, 0.064232f, 0.094587f, 0.004517f, -0.161443f, -0.310666f, -0.382836f, -0.340098f, -0.159090f, 0.119965f, 0.388400f, 0.559679f, 0.635026f, 0.652824f, 0.614612f, 0.501215f, 0.332040f, 0.161390f, 0.022521f, -0.093546f, -0.206716f, -0.319236f, -0.419351f, -0.496904f, -0.550885f, -0.588411f, -0.617946f, -0.641341f, -0.653668f, -0.650802f, -0.633429f, -0.603472f, -0.561247f, -0.507426f, -0.444484f, -0.375202f, -0.301814f, -0.226782f, -0.152889f, -0.082752f, -0.018798f, 0.037516f, 0.087042f, 0.131996f, 0.173092f, 0.208904f, 0.238119f, 0.260931f, 0.278385f, 0.291978f, 0.303791f, 0.315427f, 0.326675f, 0.336106f, 0.342711f, 0.346235f, 0.346522f, 0.343445f, 0.337281f, 0.328630f, 0.318130f, 0.306322f, 0.293494f, 0.279679f, 0.265033f, 0.249931f, 0.234518f, 0.218749f, 0.203017f, 0.188064f, 0.174092f, 0.160740f, 0.148084f, 0.136713f, 0.126662f, 0.117293f, 0.108500f, 0.101106f, 0.095680f, 0.091654f, 0.087922f, 0.083778f, 0.079032f, 0.073611f, 0.067353f, 0.060218f, 0.052743f, 0.046136f, 0.041541f, 0.039159f, 0.038398f, 0.038857f, 0.040687f, 0.043768f, 0.046732f, 0.047020f, + 0.042169f, 0.031387f, 0.015858f, -0.002845f, -0.024544f, -0.050092f, -0.079230f, -0.109526f, -0.137786f, -0.162138f, -0.182539f, -0.199609f, -0.213243f, -0.222324f, -0.225756f, -0.223768f, -0.218019f, -0.210365f, -0.201676f, -0.191803f, -0.180339f, -0.167382f, -0.153889f, -0.141348f, -0.130799f, -0.122005f, -0.113636f, -0.104260f, -0.093244f, -0.081045f, -0.068752f, -0.057146f, -0.046134f, -0.035156f, -0.023843f, -0.012002f, 0.000616f, 0.014000f, 0.027669f, 0.041253f, 0.054871f, 0.068605f, 0.082172f, 0.095499f, 0.108853f, 0.122030f, 0.134208f, 0.144885f, 0.154018f, 0.161135f, 0.165524f, 0.167382f, 0.167449f, 0.165627f, 0.161493f, 0.155562f, 0.147668f, 0.134574f, 0.112712f, 0.084430f, 0.058667f, 0.043534f, 0.039424f, 0.040242f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]={ + { + {-0.279937f, -0.718806f, -0.879425f, -0.777443f, -0.538320f, -0.273976f, -0.025783f, 0.204435f, 0.407063f, 0.556330f, 0.629651f, 0.621025f, 0.539807f, 0.405020f, 0.240268f, 0.067825f, -0.096633f, -0.245120f, -0.374269f, -0.481330f, -0.562584f, -0.615551f, -0.642416f, -0.649519f, -0.642111f, -0.620732f, -0.584007f, -0.533693f, -0.475001f, -0.412795f, -0.349591f, -0.286993f, -0.226903f, -0.170652f, -0.118251f, -0.069223f, -0.023545f, 0.018667f, 0.057892f, 0.095208f, 0.131668f, 0.167761f, 0.203372f, 0.238124f, 0.271732f, 0.304055f, 0.334993f, 0.364479f, 0.392521f, 0.419068f, 0.443884f, 0.466673f, 0.487320f, 0.505877f, 0.522377f, 0.536834f, 0.549468f, 0.560746f, 0.571072f, 0.580544f, 0.589150f, 0.597030f, 0.604353f, 0.611043f, 0.616937f, 0.622138f, 0.626912f, 0.631307f, 0.635234f, 0.638853f, 0.642459f, 0.646040f, 0.649387f, 0.652562f, 0.655777f, 0.658908f, 0.661640f, 0.664015f, 0.666294f, 0.668275f, 0.669360f, 0.669333f, 0.668569f, 0.667339f, 0.665357f, 0.662247f, 0.658157f, 0.653645f, 0.649002f, 0.643858f, 0.637637f, 0.630346f, 0.622683f, 0.615246f, 0.607937f, 0.600397f, + 0.592808f, 0.585902f, 0.580266f, 0.575856f, 0.572174f, 0.568794f, 0.565750f, 0.563397f, 0.561829f, 0.560549f, 0.558858f, 0.556454f, 0.553437f, 0.549923f, 0.545870f, 0.541143f, 0.535568f, 0.529029f, 0.521642f, 0.513706f, 0.505466f, 0.497055f, 0.488604f, 0.480183f, 0.471722f, 0.463177f, 0.454619f, 0.446034f, 0.437240f, 0.428157f, 0.418884f, 0.409461f, 0.399865f, 0.390252f, 0.380863f, 0.371747f, 0.362849f, 0.354203f, 0.345760f, 0.337306f, 0.328769f, 0.320260f, 0.311738f, 0.303082f, 0.294401f, 0.285697f, 0.276522f, 0.266569f, 0.256016f, 0.244725f, 0.232076f, 0.218041f, 0.202877f, 0.185600f, 0.164906f, 0.140260f, 0.107084f, 0.053389f, -0.026623f, -0.111560f, -0.159294f, -0.146202f, -0.091208f, -0.029119f}, + {-0.279937f, -0.718806f, -0.879425f, -0.777443f, -0.538320f, -0.273976f, -0.025783f, 0.204435f, 0.407063f, 0.556330f, 0.629651f, 0.621025f, 0.539807f, 0.405020f, 0.240268f, 0.067825f, -0.096633f, -0.245120f, -0.374269f, -0.481330f, -0.562584f, -0.615551f, -0.642416f, -0.649519f, -0.642111f, -0.620732f, -0.584007f, -0.533693f, -0.475001f, -0.412795f, -0.349591f, -0.286993f, -0.226903f, -0.170652f, -0.118251f, -0.069223f, -0.023545f, 0.018667f, 0.057892f, 0.095208f, 0.131668f, 0.167761f, 0.203372f, 0.238124f, 0.271732f, 0.304055f, 0.334993f, 0.364479f, 0.392521f, 0.419068f, 0.443884f, 0.466673f, 0.487320f, 0.505877f, 0.522377f, 0.536834f, 0.549468f, 0.560746f, 0.571072f, 0.580544f, 0.589150f, 0.597030f, 0.604353f, 0.611043f, 0.616937f, 0.622138f, 0.626912f, 0.631307f, 0.635234f, 0.638853f, 0.642459f, 0.646040f, 0.649387f, 0.652562f, 0.655777f, 0.658908f, 0.661640f, 0.664015f, 0.666294f, 0.668275f, 0.669360f, 0.669333f, 0.668569f, 0.667339f, 0.665357f, 0.662247f, 0.658157f, 0.653645f, 0.649002f, 0.643858f, 0.637637f, 0.630346f, 0.622683f, 0.615246f, 0.607937f, 0.600397f, + 0.592808f, 0.585902f, 0.580266f, 0.575856f, 0.572174f, 0.568794f, 0.565750f, 0.563397f, 0.561829f, 0.560549f, 0.558858f, 0.556454f, 0.553437f, 0.549923f, 0.545870f, 0.541143f, 0.535568f, 0.529029f, 0.521642f, 0.513706f, 0.505466f, 0.497055f, 0.488604f, 0.480183f, 0.471722f, 0.463177f, 0.454619f, 0.446034f, 0.437240f, 0.428157f, 0.418884f, 0.409461f, 0.399865f, 0.390252f, 0.380863f, 0.371747f, 0.362849f, 0.354203f, 0.345760f, 0.337306f, 0.328769f, 0.320260f, 0.311738f, 0.303082f, 0.294401f, 0.285697f, 0.276522f, 0.266569f, 0.256016f, 0.244725f, 0.232076f, 0.218041f, 0.202877f, 0.185600f, 0.164906f, 0.140260f, 0.107084f, 0.053389f, -0.026623f, -0.111560f, -0.159294f, -0.146202f, -0.091208f, -0.029119f} + }, + { + {0.137655f, 0.231573f, -0.061569f, -0.615380f, -1.083201f, -1.179039f, -0.870305f, -0.339584f, 0.195943f, 0.617719f, 0.906453f, 1.076009f, 1.134598f, 1.089734f, 0.958490f, 0.762775f, 0.522469f, 0.257386f, -0.009275f, -0.255153f, -0.467276f, -0.644940f, -0.793225f, -0.914050f, -1.004432f, -1.062573f, -1.092628f, -1.102031f, -1.096136f, -1.077334f, -1.047589f, -1.009280f, -0.964133f, -0.913278f, -0.858195f, -0.800334f, -0.740087f, -0.677018f, -0.610805f, -0.541506f, -0.469560f, -0.396052f, -0.322485f, -0.249955f, -0.178885f, -0.109588f, -0.042559f, 0.021688f, 0.082623f, 0.139743f, 0.193113f, 0.243630f, 0.292304f, 0.339419f, 0.384570f, 0.427151f, 0.466585f, 0.502409f, 0.534395f, 0.562517f, 0.586922f, 0.607994f, 0.626173f, 0.641582f, 0.654228f, 0.664541f, 0.673117f, 0.679999f, 0.684972f, 0.688494f, 0.691429f, 0.694010f, 0.696123f, 0.698431f, 0.702002f, 0.706919f, 0.712502f, 0.718834f, 0.726783f, 0.736462f, 0.746890f, 0.757392f, 0.768323f, 0.780141f, 0.792495f, 0.804563f, 0.815877f, 0.826652f, 0.837457f, 0.848656f, 0.860155f, 0.871670f, 0.883000f, 0.893877f, 0.903812f, 0.912257f, + 0.918585f, 0.921831f, 0.920971f, 0.915668f, 0.906299f, 0.893208f, 0.876460f, 0.856357f, 0.833641f, 0.809154f, 0.783725f, 0.758238f, 0.733466f, 0.710044f, 0.688800f, 0.670590f, 0.655493f, 0.642657f, 0.631241f, 0.621055f, 0.612285f, 0.605091f, 0.599433f, 0.594697f, 0.589631f, 0.583188f, 0.575258f, 0.566315f, 0.556840f, 0.547295f, 0.537964f, 0.528587f, 0.518763f, 0.508660f, 0.498613f, 0.488388f, 0.477700f, 0.466959f, 0.456614f, 0.446483f, 0.436467f, 0.426959f, 0.417879f, 0.408578f, 0.399091f, 0.390055f, 0.381339f, 0.372396f, 0.363526f, 0.354887f, 0.345302f, 0.333890f, 0.320994f, 0.305859f, 0.286532f, 0.262266f, 0.228831f, 0.171282f, 0.076774f, -0.036269f, -0.117427f, -0.129893f, -0.087208f, -0.028616f}, + {-0.137655f, -0.231573f, 0.061569f, 0.615380f, 1.083201f, 1.179039f, 0.870305f, 0.339584f, -0.195943f, -0.617719f, -0.906453f, -1.076009f, -1.134598f, -1.089734f, -0.958490f, -0.762775f, -0.522469f, -0.257386f, 0.009275f, 0.255153f, 0.467276f, 0.644940f, 0.793225f, 0.914050f, 1.004432f, 1.062573f, 1.092628f, 1.102031f, 1.096136f, 1.077334f, 1.047589f, 1.009280f, 0.964133f, 0.913278f, 0.858195f, 0.800334f, 0.740087f, 0.677018f, 0.610805f, 0.541506f, 0.469560f, 0.396052f, 0.322485f, 0.249955f, 0.178885f, 0.109588f, 0.042559f, -0.021688f, -0.082623f, -0.139743f, -0.193113f, -0.243630f, -0.292304f, -0.339419f, -0.384570f, -0.427151f, -0.466585f, -0.502409f, -0.534395f, -0.562517f, -0.586922f, -0.607994f, -0.626173f, -0.641582f, -0.654228f, -0.664541f, -0.673117f, -0.679999f, -0.684972f, -0.688494f, -0.691429f, -0.694010f, -0.696123f, -0.698431f, -0.702002f, -0.706919f, -0.712502f, -0.718834f, -0.726783f, -0.736462f, -0.746890f, -0.757392f, -0.768323f, -0.780141f, -0.792495f, -0.804563f, -0.815877f, -0.826652f, -0.837457f, -0.848656f, -0.860155f, -0.871670f, -0.883000f, -0.893877f, -0.903812f, -0.912257f, + -0.918585f, -0.921831f, -0.920971f, -0.915668f, -0.906299f, -0.893208f, -0.876460f, -0.856357f, -0.833641f, -0.809154f, -0.783725f, -0.758238f, -0.733466f, -0.710044f, -0.688800f, -0.670590f, -0.655493f, -0.642657f, -0.631241f, -0.621055f, -0.612285f, -0.605091f, -0.599433f, -0.594697f, -0.589631f, -0.583188f, -0.575258f, -0.566315f, -0.556840f, -0.547295f, -0.537964f, -0.528587f, -0.518763f, -0.508660f, -0.498613f, -0.488388f, -0.477700f, -0.466959f, -0.456614f, -0.446483f, -0.436467f, -0.426959f, -0.417879f, -0.408578f, -0.399091f, -0.390055f, -0.381339f, -0.372396f, -0.363526f, -0.354887f, -0.345302f, -0.333890f, -0.320994f, -0.305859f, -0.286532f, -0.262266f, -0.228831f, -0.171282f, -0.076774f, 0.036269f, 0.117427f, 0.129893f, 0.087208f, 0.028616f} + }, + { + {-0.037524f, -0.106181f, -0.132266f, -0.073112f, 0.041237f, 0.111128f, 0.077796f, -0.013186f, -0.077825f, -0.080256f, -0.035434f, 0.029096f, 0.084053f, 0.103004f, 0.086859f, 0.066675f, 0.063076f, 0.059663f, 0.031095f, -0.020998f, -0.075878f, -0.121299f, -0.156113f, -0.176326f, -0.175820f, -0.157975f, -0.135214f, -0.116812f, -0.102238f, -0.085453f, -0.062353f, -0.034609f, -0.008002f, 0.012488f, 0.025194f, 0.029679f, 0.025216f, 0.013215f, -0.001254f, -0.012755f, -0.019093f, -0.020474f, -0.016980f, -0.008454f, 0.004498f, 0.020843f, 0.039938f, 0.061615f, 0.086231f, 0.114761f, 0.147970f, 0.185336f, 0.225373f, 0.266858f, 0.309124f, 0.351354f, 0.392341f, 0.431045f, 0.466945f, 0.499672f, 0.528530f, 0.552586f, 0.571112f, 0.583575f, 0.589158f, 0.586750f, 0.575666f, 0.555960f, 0.527818f, 0.491213f, 0.446493f, 0.394762f, 0.337410f, 0.276002f, 0.212771f, 0.150186f, 0.089707f, 0.032067f, -0.021005f, -0.066929f, -0.104805f, -0.136170f, -0.162127f, -0.181305f, -0.192276f, -0.196759f, -0.198297f, -0.198100f, -0.194244f, -0.185310f, -0.173099f, -0.160874f, -0.150052f, -0.139737f, -0.128898f, -0.117875f, + -0.107875f, -0.099948f, -0.094668f, -0.092141f, -0.091897f, -0.093057f, -0.095016f, -0.098057f, -0.103137f, -0.110818f, -0.120204f, -0.129091f, -0.135491f, -0.139004f, -0.140529f, -0.140823f, -0.139694f, -0.136376f, -0.130141f, -0.120557f, -0.107620f, -0.091821f, -0.073930f, -0.054741f, -0.035051f, -0.015600f, 0.003138f, 0.020870f, 0.037083f, 0.051025f, 0.062165f, 0.070424f, 0.075956f, 0.078959f, 0.079669f, 0.078304f, 0.075176f, 0.071037f, 0.067021f, 0.064014f, 0.062283f, 0.061670f, 0.061603f, 0.060906f, 0.058404f, 0.053985f, 0.048455f, 0.042281f, 0.035195f, 0.027085f, 0.018350f, 0.009174f, -0.000669f, -0.010994f, -0.021132f, -0.031283f, -0.043062f, -0.057197f, -0.070252f, -0.074970f, -0.065974f, -0.045809f, -0.023709f, -0.006772f}, + {-0.037524f, -0.106181f, -0.132266f, -0.073112f, 0.041237f, 0.111128f, 0.077796f, -0.013186f, -0.077825f, -0.080256f, -0.035434f, 0.029096f, 0.084053f, 0.103004f, 0.086859f, 0.066675f, 0.063076f, 0.059663f, 0.031095f, -0.020998f, -0.075878f, -0.121299f, -0.156113f, -0.176326f, -0.175820f, -0.157975f, -0.135214f, -0.116812f, -0.102238f, -0.085453f, -0.062353f, -0.034609f, -0.008002f, 0.012488f, 0.025194f, 0.029679f, 0.025216f, 0.013215f, -0.001254f, -0.012755f, -0.019093f, -0.020474f, -0.016980f, -0.008454f, 0.004498f, 0.020843f, 0.039938f, 0.061615f, 0.086231f, 0.114761f, 0.147970f, 0.185336f, 0.225373f, 0.266858f, 0.309124f, 0.351354f, 0.392341f, 0.431045f, 0.466945f, 0.499672f, 0.528530f, 0.552586f, 0.571112f, 0.583575f, 0.589158f, 0.586750f, 0.575666f, 0.555960f, 0.527818f, 0.491213f, 0.446493f, 0.394762f, 0.337410f, 0.276002f, 0.212771f, 0.150186f, 0.089707f, 0.032067f, -0.021005f, -0.066929f, -0.104805f, -0.136170f, -0.162127f, -0.181305f, -0.192276f, -0.196759f, -0.198297f, -0.198100f, -0.194244f, -0.185310f, -0.173099f, -0.160874f, -0.150052f, -0.139737f, -0.128898f, -0.117875f, + -0.107875f, -0.099948f, -0.094668f, -0.092141f, -0.091897f, -0.093057f, -0.095016f, -0.098057f, -0.103137f, -0.110818f, -0.120204f, -0.129091f, -0.135491f, -0.139004f, -0.140529f, -0.140823f, -0.139694f, -0.136376f, -0.130141f, -0.120557f, -0.107620f, -0.091821f, -0.073930f, -0.054741f, -0.035051f, -0.015600f, 0.003138f, 0.020870f, 0.037083f, 0.051025f, 0.062165f, 0.070424f, 0.075956f, 0.078959f, 0.079669f, 0.078304f, 0.075176f, 0.071037f, 0.067021f, 0.064014f, 0.062283f, 0.061670f, 0.061603f, 0.060906f, 0.058404f, 0.053985f, 0.048455f, 0.042281f, 0.035195f, 0.027085f, 0.018350f, 0.009174f, -0.000669f, -0.010994f, -0.021132f, -0.031283f, -0.043062f, -0.057197f, -0.070252f, -0.074970f, -0.065974f, -0.045809f, -0.023709f, -0.006772f} + }, + { + {-0.001333f, -0.030005f, -0.089178f, -0.116179f, -0.070558f, 0.001241f, 0.020913f, -0.026250f, -0.080759f, -0.081475f, -0.022314f, 0.058682f, 0.122300f, 0.154634f, 0.165876f, 0.172510f, 0.178315f, 0.170686f, 0.135671f, 0.073168f, -0.004954f, -0.086261f, -0.162235f, -0.226658f, -0.277864f, -0.321652f, -0.365340f, -0.408241f, -0.442359f, -0.462069f, -0.468153f, -0.461999f, -0.441233f, -0.403541f, -0.351250f, -0.289395f, -0.221463f, -0.149435f, -0.076464f, -0.006943f, 0.055954f, 0.111395f, 0.159755f, 0.201416f, 0.236781f, 0.266704f, 0.292410f, 0.314773f, 0.333620f, 0.347895f, 0.356616f, 0.359633f, 0.357762f, 0.352831f, 0.347475f, 0.343968f, 0.342881f, 0.343312f, 0.344262f, 0.345108f, 0.345073f, 0.343446f, 0.340377f, 0.336539f, 0.332107f, 0.326988f, 0.321660f, 0.316556f, 0.310916f, 0.303524f, 0.294315f, 0.283862f, 0.271573f, 0.256019f, 0.236997f, 0.215638f, 0.192339f, 0.166339f, 0.137841f, 0.108908f, 0.081311f, 0.054840f, 0.028956f, 0.004999f, -0.014887f, -0.030518f, -0.043751f, -0.055909f, -0.066672f, -0.075704f, -0.083627f, -0.090643f, -0.095550f, -0.097168f, -0.095719f, -0.091778f, + -0.084700f, -0.073230f, -0.057268f, -0.038056f, -0.016721f, 0.006768f, 0.033168f, 0.062626f, 0.093687f, 0.123868f, 0.151635f, 0.177592f, 0.203260f, 0.228881f, 0.252880f, 0.273234f, 0.289066f, 0.301335f, 0.312237f, 0.323412f, 0.334360f, 0.342975f, 0.347732f, 0.349006f, 0.348534f, 0.348309f, 0.349721f, 0.352813f, 0.356335f, 0.359060f, 0.360956f, 0.362759f, 0.364992f, 0.367821f, 0.371174f, 0.374427f, 0.376493f, 0.376627f, 0.374696f, 0.370693f, 0.364611f, 0.356723f, 0.347263f, 0.336013f, 0.322697f, 0.307449f, 0.290502f, 0.272009f, 0.252471f, 0.232612f, 0.212802f, 0.193266f, 0.174453f, 0.156397f, 0.138549f, 0.120439f, 0.099951f, 0.070805f, 0.027885f, -0.020982f, -0.054876f, -0.058831f, -0.039154f, -0.012828f}, + {-0.001333f, -0.030005f, -0.089178f, -0.116179f, -0.070558f, 0.001241f, 0.020913f, -0.026250f, -0.080759f, -0.081475f, -0.022314f, 0.058682f, 0.122300f, 0.154634f, 0.165876f, 0.172510f, 0.178315f, 0.170686f, 0.135671f, 0.073168f, -0.004954f, -0.086261f, -0.162235f, -0.226658f, -0.277864f, -0.321652f, -0.365340f, -0.408241f, -0.442359f, -0.462069f, -0.468153f, -0.461999f, -0.441233f, -0.403541f, -0.351250f, -0.289395f, -0.221463f, -0.149435f, -0.076464f, -0.006943f, 0.055954f, 0.111395f, 0.159755f, 0.201416f, 0.236781f, 0.266704f, 0.292410f, 0.314773f, 0.333620f, 0.347895f, 0.356616f, 0.359633f, 0.357762f, 0.352831f, 0.347475f, 0.343968f, 0.342881f, 0.343312f, 0.344262f, 0.345108f, 0.345073f, 0.343446f, 0.340377f, 0.336539f, 0.332107f, 0.326988f, 0.321660f, 0.316556f, 0.310916f, 0.303524f, 0.294315f, 0.283862f, 0.271573f, 0.256019f, 0.236997f, 0.215638f, 0.192339f, 0.166339f, 0.137841f, 0.108908f, 0.081311f, 0.054840f, 0.028956f, 0.004999f, -0.014887f, -0.030518f, -0.043751f, -0.055909f, -0.066672f, -0.075704f, -0.083627f, -0.090643f, -0.095550f, -0.097168f, -0.095719f, -0.091778f, + -0.084700f, -0.073230f, -0.057268f, -0.038056f, -0.016721f, 0.006768f, 0.033168f, 0.062626f, 0.093687f, 0.123868f, 0.151635f, 0.177592f, 0.203260f, 0.228881f, 0.252880f, 0.273234f, 0.289066f, 0.301335f, 0.312237f, 0.323412f, 0.334360f, 0.342975f, 0.347732f, 0.349006f, 0.348534f, 0.348309f, 0.349721f, 0.352813f, 0.356335f, 0.359060f, 0.360956f, 0.362759f, 0.364992f, 0.367821f, 0.371174f, 0.374427f, 0.376493f, 0.376627f, 0.374696f, 0.370693f, 0.364611f, 0.356723f, 0.347263f, 0.336013f, 0.322697f, 0.307449f, 0.290502f, 0.272009f, 0.252471f, 0.232612f, 0.212802f, 0.193266f, 0.174453f, 0.156397f, 0.138549f, 0.120439f, 0.099951f, 0.070805f, 0.027885f, -0.020982f, -0.054876f, -0.058831f, -0.039154f, -0.012828f} + }, + { + {-0.003949f, -0.004065f, 0.004529f, 0.003058f, -0.017910f, -0.041346f, -0.049210f, -0.053546f, -0.080846f, -0.125171f, -0.138752f, -0.082301f, 0.027313f, 0.134102f, 0.200608f, 0.233142f, 0.253660f, 0.266920f, 0.262970f, 0.237188f, 0.194063f, 0.136745f, 0.064986f, -0.017247f, -0.101044f, -0.180693f, -0.256442f, -0.328205f, -0.391843f, -0.443152f, -0.481210f, -0.506165f, -0.517126f, -0.513522f, -0.495538f, -0.462242f, -0.412470f, -0.349030f, -0.279619f, -0.212173f, -0.150791f, -0.096336f, -0.048496f, -0.006238f, 0.031944f, 0.067046f, 0.099419f, 0.129417f, 0.157110f, 0.181639f, 0.201899f, 0.217571f, 0.228864f, 0.236108f, 0.240440f, 0.243939f, 0.248173f, 0.253310f, 0.259111f, 0.265714f, 0.273010f, 0.280389f, 0.287541f, 0.294554f, 0.301097f, 0.306552f, 0.310894f, 0.314304f, 0.316123f, 0.315383f, 0.312099f, 0.306725f, 0.298589f, 0.286282f, 0.269490f, 0.249062f, 0.225223f, 0.197242f, 0.165404f, 0.131961f, 0.099076f, 0.066683f, 0.033703f, 0.000877f, -0.029410f, -0.056340f, -0.081745f, -0.106984f, -0.130473f, -0.149782f, -0.164778f, -0.176837f, -0.185968f, -0.190743f, -0.190692f, -0.187082f, + -0.181465f, -0.174611f, -0.166752f, -0.158044f, -0.148865f, -0.139889f, -0.131570f, -0.123691f, -0.116025f, -0.109038f, -0.102988f, -0.096774f, -0.088859f, -0.079067f, -0.068595f, -0.058652f, -0.049731f, -0.041459f, -0.032502f, -0.021490f, -0.008698f, 0.003957f, 0.014879f, 0.023943f, 0.031863f, 0.039641f, 0.048517f, 0.059156f, 0.070934f, 0.082892f, 0.094921f, 0.107290f, 0.119849f, 0.132466f, 0.145202f, 0.157413f, 0.167770f, 0.175597f, 0.181049f, 0.184050f, 0.184444f, 0.182904f, 0.180196f, 0.176079f, 0.170279f, 0.163603f, 0.156847f, 0.149956f, 0.143323f, 0.138140f, 0.134607f, 0.131865f, 0.130015f, 0.129755f, 0.130428f, 0.131261f, 0.132652f, 0.131757f, 0.119661f, 0.090367f, 0.051746f, 0.020184f, 0.004349f, 0.000237f}, + {0.003949f, 0.004065f, -0.004529f, -0.003058f, 0.017910f, 0.041346f, 0.049210f, 0.053546f, 0.080846f, 0.125171f, 0.138752f, 0.082301f, -0.027313f, -0.134102f, -0.200608f, -0.233142f, -0.253660f, -0.266920f, -0.262970f, -0.237188f, -0.194063f, -0.136745f, -0.064986f, 0.017247f, 0.101044f, 0.180693f, 0.256442f, 0.328205f, 0.391843f, 0.443152f, 0.481210f, 0.506165f, 0.517126f, 0.513522f, 0.495538f, 0.462242f, 0.412470f, 0.349030f, 0.279619f, 0.212173f, 0.150791f, 0.096336f, 0.048496f, 0.006238f, -0.031944f, -0.067046f, -0.099419f, -0.129417f, -0.157110f, -0.181639f, -0.201899f, -0.217571f, -0.228864f, -0.236108f, -0.240440f, -0.243939f, -0.248173f, -0.253310f, -0.259111f, -0.265714f, -0.273010f, -0.280389f, -0.287541f, -0.294554f, -0.301097f, -0.306552f, -0.310894f, -0.314304f, -0.316123f, -0.315383f, -0.312099f, -0.306725f, -0.298589f, -0.286282f, -0.269490f, -0.249062f, -0.225223f, -0.197242f, -0.165404f, -0.131961f, -0.099076f, -0.066683f, -0.033703f, -0.000877f, 0.029410f, 0.056340f, 0.081745f, 0.106984f, 0.130473f, 0.149782f, 0.164778f, 0.176837f, 0.185968f, 0.190743f, 0.190692f, 0.187082f, + 0.181465f, 0.174611f, 0.166752f, 0.158044f, 0.148865f, 0.139889f, 0.131570f, 0.123691f, 0.116025f, 0.109038f, 0.102988f, 0.096774f, 0.088859f, 0.079067f, 0.068595f, 0.058652f, 0.049731f, 0.041459f, 0.032502f, 0.021490f, 0.008698f, -0.003957f, -0.014879f, -0.023943f, -0.031863f, -0.039641f, -0.048517f, -0.059156f, -0.070934f, -0.082892f, -0.094921f, -0.107290f, -0.119849f, -0.132466f, -0.145202f, -0.157413f, -0.167770f, -0.175597f, -0.181049f, -0.184050f, -0.184444f, -0.182904f, -0.180196f, -0.176079f, -0.170279f, -0.163603f, -0.156847f, -0.149956f, -0.143323f, -0.138140f, -0.134607f, -0.131865f, -0.130015f, -0.129755f, -0.130428f, -0.131261f, -0.132652f, -0.131757f, -0.119661f, -0.090367f, -0.051746f, -0.020184f, -0.004349f, -0.000237f} + }, + { + {-0.006838f, -0.000073f, 0.019569f, 0.004812f, -0.021179f, 0.017001f, 0.095357f, 0.079254f, -0.080727f, -0.242975f, -0.239933f, -0.079038f, 0.094027f, 0.179068f, 0.192210f, 0.186347f, 0.179576f, 0.164512f, 0.135604f, 0.091894f, 0.036418f, -0.019928f, -0.065074f, -0.095268f, -0.111552f, -0.113737f, -0.104494f, -0.091666f, -0.080317f, -0.069042f, -0.057974f, -0.052882f, -0.057423f, -0.067725f, -0.078296f, -0.088767f, -0.102514f, -0.121895f, -0.145878f, -0.170008f, -0.188674f, -0.199029f, -0.202203f, -0.200419f, -0.195060f, -0.187856f, -0.180908f, -0.174383f, -0.166293f, -0.154984f, -0.140002f, -0.120815f, -0.096730f, -0.067714f, -0.033820f, 0.005223f, 0.048523f, 0.093540f, 0.138202f, 0.181886f, 0.223555f, 0.261046f, 0.293122f, 0.320062f, 0.341424f, 0.355281f, 0.360314f, 0.356691f, 0.344454f, 0.322937f, 0.292135f, 0.253115f, 0.207016f, 0.155091f, 0.099534f, 0.042831f, -0.013572f, -0.068750f, -0.120804f, -0.167303f, -0.207256f, -0.241508f, -0.270731f, -0.293815f, -0.309031f, -0.316475f, -0.318315f, -0.316263f, -0.309841f, -0.297894f, -0.280743f, -0.259596f, -0.234760f, -0.205963f, -0.173776f, -0.139211f, + -0.102436f, -0.063409f, -0.023388f, 0.015541f, 0.052145f, 0.086261f, 0.117562f, 0.144705f, 0.165452f, 0.177810f, 0.181963f, 0.180989f, 0.178411f, 0.174952f, 0.168699f, 0.158230f, 0.144450f, 0.129742f, 0.116497f, 0.106152f, 0.098556f, 0.092438f, 0.087095f, 0.083117f, 0.081219f, 0.081325f, 0.083051f, 0.085959f, 0.089030f, 0.090997f, 0.091374f, 0.090241f, 0.087241f, 0.081872f, 0.074446f, 0.065721f, 0.056063f, 0.045844f, 0.035939f, 0.026995f, 0.018956f, 0.011839f, 0.005924f, 0.000823f, -0.004378f, -0.009757f, -0.014627f, -0.018984f, -0.023457f, -0.027936f, -0.031769f, -0.035015f, -0.038036f, -0.040342f, -0.041399f, -0.041932f, -0.042717f, -0.042585f, -0.039224f, -0.031819f, -0.021956f, -0.012357f, -0.005285f, -0.001296f}, + {0.006838f, 0.000073f, -0.019569f, -0.004812f, 0.021179f, -0.017001f, -0.095357f, -0.079254f, 0.080727f, 0.242975f, 0.239933f, 0.079038f, -0.094027f, -0.179068f, -0.192210f, -0.186347f, -0.179576f, -0.164512f, -0.135604f, -0.091894f, -0.036418f, 0.019928f, 0.065074f, 0.095268f, 0.111552f, 0.113737f, 0.104494f, 0.091666f, 0.080317f, 0.069042f, 0.057974f, 0.052882f, 0.057423f, 0.067725f, 0.078296f, 0.088767f, 0.102514f, 0.121895f, 0.145878f, 0.170008f, 0.188674f, 0.199029f, 0.202203f, 0.200419f, 0.195060f, 0.187856f, 0.180908f, 0.174383f, 0.166293f, 0.154984f, 0.140002f, 0.120815f, 0.096730f, 0.067714f, 0.033820f, -0.005223f, -0.048523f, -0.093540f, -0.138202f, -0.181886f, -0.223555f, -0.261046f, -0.293122f, -0.320062f, -0.341424f, -0.355281f, -0.360314f, -0.356691f, -0.344454f, -0.322937f, -0.292135f, -0.253115f, -0.207016f, -0.155091f, -0.099534f, -0.042831f, 0.013572f, 0.068750f, 0.120804f, 0.167303f, 0.207256f, 0.241508f, 0.270731f, 0.293815f, 0.309031f, 0.316475f, 0.318315f, 0.316263f, 0.309841f, 0.297894f, 0.280743f, 0.259596f, 0.234760f, 0.205963f, 0.173776f, 0.139211f, + 0.102436f, 0.063409f, 0.023388f, -0.015541f, -0.052145f, -0.086261f, -0.117562f, -0.144705f, -0.165452f, -0.177810f, -0.181963f, -0.180989f, -0.178411f, -0.174952f, -0.168699f, -0.158230f, -0.144450f, -0.129742f, -0.116497f, -0.106152f, -0.098556f, -0.092438f, -0.087095f, -0.083117f, -0.081219f, -0.081325f, -0.083051f, -0.085959f, -0.089030f, -0.090997f, -0.091374f, -0.090241f, -0.087241f, -0.081872f, -0.074446f, -0.065721f, -0.056063f, -0.045844f, -0.035939f, -0.026995f, -0.018956f, -0.011839f, -0.005924f, -0.000823f, 0.004378f, 0.009757f, 0.014627f, 0.018984f, 0.023457f, 0.027936f, 0.031769f, 0.035015f, 0.038036f, 0.040342f, 0.041399f, 0.041932f, 0.042717f, 0.042585f, 0.039224f, 0.031819f, 0.021956f, 0.012357f, 0.005285f, 0.001296f} + }, + { + {-0.001268f, -0.011623f, -0.025773f, -0.019189f, 0.011057f, 0.041023f, 0.068146f, 0.125696f, 0.222407f, 0.296789f, 0.269284f, 0.131113f, -0.047610f, -0.192572f, -0.280508f, -0.323423f, -0.332386f, -0.312852f, -0.276029f, -0.234862f, -0.192992f, -0.147490f, -0.098453f, -0.049129f, -0.001158f, 0.043170f, 0.076863f, 0.093414f, 0.095853f, 0.095899f, 0.103483f, 0.119683f, 0.139635f, 0.159125f, 0.177059f, 0.193595f, 0.208271f, 0.220249f, 0.229045f, 0.234009f, 0.233700f, 0.227053f, 0.215289f, 0.201603f, 0.188525f, 0.176263f, 0.163748f, 0.150359f, 0.136192f, 0.121455f, 0.106303f, 0.090949f, 0.075597f, 0.060536f, 0.046491f, 0.034613f, 0.025962f, 0.021084f, 0.020003f, 0.022378f, 0.027742f, 0.035774f, 0.046332f, 0.059186f, 0.073920f, 0.090220f, 0.108028f, 0.127179f, 0.146973f, 0.166342f, 0.184471f, 0.201087f, 0.215996f, 0.228448f, 0.237272f, 0.241711f, 0.241663f, 0.236858f, 0.226335f, 0.209312f, 0.186169f, 0.157898f, 0.124884f, 0.087019f, 0.044857f, -0.000171f, -0.046674f, -0.093813f, -0.141018f, -0.187871f, -0.234164f, -0.279203f, -0.320929f, -0.356487f, -0.384099f, -0.404029f, + -0.417450f, -0.424542f, -0.423967f, -0.414337f, -0.396303f, -0.373146f, -0.348990f, -0.326237f, -0.304833f, -0.283944f, -0.263944f, -0.246725f, -0.234478f, -0.228461f, -0.228593f, -0.233819f, -0.242777f, -0.254337f, -0.267790f, -0.282812f, -0.299281f, -0.316843f, -0.334511f, -0.350840f, -0.364685f, -0.375697f, -0.384143f, -0.390499f, -0.395225f, -0.398596f, -0.400645f, -0.401464f, -0.401489f, -0.401163f, -0.400362f, -0.398530f, -0.395360f, -0.391048f, -0.385958f, -0.380382f, -0.374495f, -0.368144f, -0.360693f, -0.351302f, -0.339340f, -0.324513f, -0.306932f, -0.287105f, -0.265519f, -0.242294f, -0.217711f, -0.192689f, -0.167920f, -0.143119f, -0.118052f, -0.092771f, -0.064621f, -0.027534f, 0.019774f, 0.064488f, 0.085852f, 0.075236f, 0.045270f, 0.014113f}, + {-0.001268f, -0.011623f, -0.025773f, -0.019189f, 0.011057f, 0.041023f, 0.068146f, 0.125696f, 0.222407f, 0.296789f, 0.269284f, 0.131113f, -0.047610f, -0.192572f, -0.280508f, -0.323423f, -0.332386f, -0.312852f, -0.276029f, -0.234862f, -0.192992f, -0.147490f, -0.098453f, -0.049129f, -0.001158f, 0.043170f, 0.076863f, 0.093414f, 0.095853f, 0.095899f, 0.103483f, 0.119683f, 0.139635f, 0.159125f, 0.177059f, 0.193595f, 0.208271f, 0.220249f, 0.229045f, 0.234009f, 0.233700f, 0.227053f, 0.215289f, 0.201603f, 0.188525f, 0.176263f, 0.163748f, 0.150359f, 0.136192f, 0.121455f, 0.106303f, 0.090949f, 0.075597f, 0.060536f, 0.046491f, 0.034613f, 0.025962f, 0.021084f, 0.020003f, 0.022378f, 0.027742f, 0.035774f, 0.046332f, 0.059186f, 0.073920f, 0.090220f, 0.108028f, 0.127179f, 0.146973f, 0.166342f, 0.184471f, 0.201087f, 0.215996f, 0.228448f, 0.237272f, 0.241711f, 0.241663f, 0.236858f, 0.226335f, 0.209312f, 0.186169f, 0.157898f, 0.124884f, 0.087019f, 0.044857f, -0.000171f, -0.046674f, -0.093813f, -0.141018f, -0.187871f, -0.234164f, -0.279203f, -0.320929f, -0.356487f, -0.384099f, -0.404029f, + -0.417450f, -0.424542f, -0.423967f, -0.414337f, -0.396303f, -0.373146f, -0.348990f, -0.326237f, -0.304833f, -0.283944f, -0.263944f, -0.246725f, -0.234478f, -0.228461f, -0.228593f, -0.233819f, -0.242777f, -0.254337f, -0.267790f, -0.282812f, -0.299281f, -0.316843f, -0.334511f, -0.350840f, -0.364685f, -0.375697f, -0.384143f, -0.390499f, -0.395225f, -0.398596f, -0.400645f, -0.401464f, -0.401489f, -0.401163f, -0.400362f, -0.398530f, -0.395360f, -0.391048f, -0.385958f, -0.380382f, -0.374495f, -0.368144f, -0.360693f, -0.351302f, -0.339340f, -0.324513f, -0.306932f, -0.287105f, -0.265519f, -0.242294f, -0.217711f, -0.192689f, -0.167920f, -0.143119f, -0.118052f, -0.092771f, -0.064621f, -0.027534f, 0.019774f, 0.064488f, 0.085852f, 0.075236f, 0.045270f, 0.014113f} + }, + { + {-0.038110f, -0.075146f, -0.025161f, 0.086861f, 0.170835f, 0.137738f, -0.014451f, -0.178329f, -0.226409f, -0.135078f, -0.001014f, 0.071747f, 0.071029f, 0.049512f, 0.040096f, 0.037651f, 0.039313f, 0.052944f, 0.068671f, 0.062568f, 0.034549f, 0.012890f, 0.014819f, 0.026726f, 0.029476f, 0.021912f, 0.011228f, -0.002938f, -0.024811f, -0.052618f, -0.079613f, -0.100151f, -0.112340f, -0.118985f, -0.126456f, -0.138876f, -0.153643f, -0.164753f, -0.168424f, -0.163586f, -0.150319f, -0.130693f, -0.108614f, -0.086681f, -0.065059f, -0.044049f, -0.025062f, -0.008581f, 0.006237f, 0.019687f, 0.031442f, 0.042086f, 0.052645f, 0.063061f, 0.072813f, 0.082218f, 0.091601f, 0.100095f, 0.106517f, 0.110624f, 0.112708f, 0.112893f, 0.111393f, 0.108835f, 0.106157f, 0.104517f, 0.104794f, 0.106828f, 0.110032f, 0.114914f, 0.122673f, 0.133176f, 0.145069f, 0.158047f, 0.173137f, 0.190427f, 0.208289f, 0.225087f, 0.240122f, 0.252791f, 0.262062f, 0.266804f, 0.265987f, 0.259150f, 0.246951f, 0.230107f, 0.207850f, 0.179343f, 0.146598f, 0.113197f, 0.079461f, 0.041623f, -0.003026f, -0.052458f, -0.102576f, -0.151651f, + -0.200702f, -0.250524f, -0.299538f, -0.344617f, -0.383867f, -0.418204f, -0.449410f, -0.476879f, -0.497661f, -0.509826f, -0.514454f, -0.514151f, -0.510709f, -0.504091f, -0.492568f, -0.474151f, -0.448897f, -0.419410f, -0.388422f, -0.356746f, -0.324102f, -0.290635f, -0.256925f, -0.223703f, -0.192072f, -0.162880f, -0.135745f, -0.109787f, -0.085028f, -0.061904f, -0.040007f, -0.018473f, 0.003074f, 0.024714f, 0.046173f, 0.065944f, 0.082103f, 0.094598f, 0.105239f, 0.115311f, 0.124969f, 0.134460f, 0.143642f, 0.150842f, 0.154541f, 0.155566f, 0.155668f, 0.155273f, 0.154440f, 0.154045f, 0.154074f, 0.152898f, 0.149782f, 0.145794f, 0.141598f, 0.137270f, 0.133687f, 0.129549f, 0.118095f, 0.093347f, 0.059954f, 0.030500f, 0.012452f, 0.003233f}, + {-0.038110f, -0.075146f, -0.025161f, 0.086861f, 0.170835f, 0.137738f, -0.014451f, -0.178329f, -0.226409f, -0.135078f, -0.001014f, 0.071747f, 0.071029f, 0.049512f, 0.040096f, 0.037651f, 0.039313f, 0.052944f, 0.068671f, 0.062568f, 0.034549f, 0.012890f, 0.014819f, 0.026726f, 0.029476f, 0.021912f, 0.011228f, -0.002938f, -0.024811f, -0.052618f, -0.079613f, -0.100151f, -0.112340f, -0.118985f, -0.126456f, -0.138876f, -0.153643f, -0.164753f, -0.168424f, -0.163586f, -0.150319f, -0.130693f, -0.108614f, -0.086681f, -0.065059f, -0.044049f, -0.025062f, -0.008581f, 0.006237f, 0.019687f, 0.031442f, 0.042086f, 0.052645f, 0.063061f, 0.072813f, 0.082218f, 0.091601f, 0.100095f, 0.106517f, 0.110624f, 0.112708f, 0.112893f, 0.111393f, 0.108835f, 0.106157f, 0.104517f, 0.104794f, 0.106828f, 0.110032f, 0.114914f, 0.122673f, 0.133176f, 0.145069f, 0.158047f, 0.173137f, 0.190427f, 0.208289f, 0.225087f, 0.240122f, 0.252791f, 0.262062f, 0.266804f, 0.265987f, 0.259150f, 0.246951f, 0.230107f, 0.207850f, 0.179343f, 0.146598f, 0.113197f, 0.079461f, 0.041623f, -0.003026f, -0.052458f, -0.102576f, -0.151651f, + -0.200702f, -0.250524f, -0.299538f, -0.344617f, -0.383867f, -0.418204f, -0.449410f, -0.476879f, -0.497661f, -0.509826f, -0.514454f, -0.514151f, -0.510709f, -0.504091f, -0.492568f, -0.474151f, -0.448897f, -0.419410f, -0.388422f, -0.356746f, -0.324102f, -0.290635f, -0.256925f, -0.223703f, -0.192072f, -0.162880f, -0.135745f, -0.109787f, -0.085028f, -0.061904f, -0.040007f, -0.018473f, 0.003074f, 0.024714f, 0.046173f, 0.065944f, 0.082103f, 0.094598f, 0.105239f, 0.115311f, 0.124969f, 0.134460f, 0.143642f, 0.150842f, 0.154541f, 0.155566f, 0.155668f, 0.155273f, 0.154440f, 0.154045f, 0.154074f, 0.152898f, 0.149782f, 0.145794f, 0.141598f, 0.137270f, 0.133687f, 0.129549f, 0.118095f, 0.093347f, 0.059954f, 0.030500f, 0.012452f, 0.003233f} + }, + { + {0.027412f, 0.021630f, -0.082657f, -0.192018f, -0.202211f, -0.094239f, 0.096849f, 0.326445f, 0.521758f, 0.589844f, 0.497341f, 0.306742f, 0.099455f, -0.102283f, -0.307547f, -0.492196f, -0.609749f, -0.649976f, -0.647303f, -0.634380f, -0.613427f, -0.571915f, -0.505693f, -0.422791f, -0.335442f, -0.251686f, -0.170793f, -0.086744f, 0.002987f, 0.094569f, 0.183305f, 0.267395f, 0.345542f, 0.414985f, 0.473298f, 0.519576f, 0.553356f, 0.574222f, 0.582473f, 0.579178f, 0.566240f, 0.546806f, 0.524087f, 0.499039f, 0.470563f, 0.438298f, 0.403850f, 0.369330f, 0.336252f, 0.305665f, 0.277686f, 0.250860f, 0.223237f, 0.194118f, 0.164061f, 0.133725f, 0.103572f, 0.074268f, 0.046587f, 0.021025f, -0.002250f, -0.023323f, -0.042436f, -0.059666f, -0.074855f, -0.088006f, -0.099327f, -0.108715f, -0.115836f, -0.120903f, -0.124625f, -0.127245f, -0.128473f, -0.128509f, -0.128126f, -0.127534f, -0.126157f, -0.123884f, -0.121697f, -0.120709f, -0.121149f, -0.122545f, -0.124406f, -0.126443f, -0.128321f, -0.129408f, -0.128923f, -0.126622f, -0.123305f, -0.120296f, -0.118410f, -0.117799f, -0.118840f, -0.122736f, -0.130899f, -0.143626f, + -0.159298f, -0.175051f, -0.188642f, -0.199660f, -0.208519f, -0.214407f, -0.214978f, -0.208332f, -0.194776f, -0.176354f, -0.155006f, -0.131408f, -0.105361f, -0.077096f, -0.048137f, -0.020733f, 0.003611f, 0.024921f, 0.044105f, 0.061808f, 0.077866f, 0.091518f, 0.102092f, 0.109797f, 0.115978f, 0.122346f, 0.129837f, 0.138130f, 0.146061f, 0.152497f, 0.157139f, 0.160632f, 0.163819f, 0.166991f, 0.170004f, 0.172717f, 0.174872f, 0.175941f, 0.175619f, 0.174137f, 0.171689f, 0.168049f, 0.163091f, 0.157009f, 0.149642f, 0.140361f, 0.128990f, 0.115985f, 0.101537f, 0.085578f, 0.068755f, 0.052109f, 0.035768f, 0.019324f, 0.003160f, -0.012450f, -0.028834f, -0.046486f, -0.060943f, -0.064580f, -0.054322f, -0.035670f, -0.017673f, -0.004951f}, + {0.027412f, 0.021630f, -0.082657f, -0.192018f, -0.202211f, -0.094239f, 0.096849f, 0.326445f, 0.521758f, 0.589844f, 0.497341f, 0.306742f, 0.099455f, -0.102283f, -0.307547f, -0.492196f, -0.609749f, -0.649976f, -0.647303f, -0.634380f, -0.613427f, -0.571915f, -0.505693f, -0.422791f, -0.335442f, -0.251686f, -0.170793f, -0.086744f, 0.002987f, 0.094569f, 0.183305f, 0.267395f, 0.345542f, 0.414985f, 0.473298f, 0.519576f, 0.553356f, 0.574222f, 0.582473f, 0.579178f, 0.566240f, 0.546806f, 0.524087f, 0.499039f, 0.470563f, 0.438298f, 0.403850f, 0.369330f, 0.336252f, 0.305665f, 0.277686f, 0.250860f, 0.223237f, 0.194118f, 0.164061f, 0.133725f, 0.103572f, 0.074268f, 0.046587f, 0.021025f, -0.002250f, -0.023323f, -0.042436f, -0.059666f, -0.074855f, -0.088006f, -0.099327f, -0.108715f, -0.115836f, -0.120903f, -0.124625f, -0.127245f, -0.128473f, -0.128509f, -0.128126f, -0.127534f, -0.126157f, -0.123884f, -0.121697f, -0.120709f, -0.121149f, -0.122545f, -0.124406f, -0.126443f, -0.128321f, -0.129408f, -0.128923f, -0.126622f, -0.123305f, -0.120296f, -0.118410f, -0.117799f, -0.118840f, -0.122736f, -0.130899f, -0.143626f, + -0.159298f, -0.175051f, -0.188642f, -0.199660f, -0.208519f, -0.214407f, -0.214978f, -0.208332f, -0.194776f, -0.176354f, -0.155006f, -0.131408f, -0.105361f, -0.077096f, -0.048137f, -0.020733f, 0.003611f, 0.024921f, 0.044105f, 0.061808f, 0.077866f, 0.091518f, 0.102092f, 0.109797f, 0.115978f, 0.122346f, 0.129837f, 0.138130f, 0.146061f, 0.152497f, 0.157139f, 0.160632f, 0.163819f, 0.166991f, 0.170004f, 0.172717f, 0.174872f, 0.175941f, 0.175619f, 0.174137f, 0.171689f, 0.168049f, 0.163091f, 0.157009f, 0.149642f, 0.140361f, 0.128990f, 0.115985f, 0.101537f, 0.085578f, 0.068755f, 0.052109f, 0.035768f, 0.019324f, 0.003160f, -0.012450f, -0.028834f, -0.046486f, -0.060943f, -0.064580f, -0.054322f, -0.035670f, -0.017673f, -0.004951f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]={ + { + { 0.854113f, 0.536451f, 0.067092f, -0.350133f, -0.609131f, -0.724504f, -0.749647f, -0.705240f, -0.587299f, -0.405686f, -0.188603f, 0.034290f, 0.235326f, 0.389114f, 0.484257f, 0.526650f, 0.525509f, 0.486339f, 0.417501f, 0.329156f, 0.225561f, 0.110464f, -0.004565f, -0.110029f, -0.209397f, -0.307633f, -0.398358f, -0.473786f, -0.535896f, -0.587622f, -0.625653f, -0.650087f, -0.667773f, -0.680841f, -0.685616f, -0.684346f, -0.683354f, -0.681293f, -0.673940f, -0.665480f, -0.660678f, -0.654254f, -0.641454f, -0.627762f, -0.616498f, -0.601208f, -0.579959f, -0.560224f, -0.542768f, -0.519685f, -0.491848f, -0.467631f, -0.444806f, -0.415518f, -0.384419f, -0.359637f, -0.335182f, -0.304116f, -0.274642f, -0.252517f, -0.227297f, -0.194558f, -0.166484f, -0.145123f, -0.116152f, -0.080136f, -0.053083f, -0.030604f, 0.005387f, 0.046361f, 0.073460f, 0.102702f, 0.155814f, 0.209408f, 0.244378f, 0.309617f, 0.442675f, 0.565949f, 0.579052f, 0.523768f}, + { 0.854113f, 0.536451f, 0.067092f, -0.350133f, -0.609131f, -0.724504f, -0.749647f, -0.705240f, -0.587299f, -0.405686f, -0.188603f, 0.034290f, 0.235326f, 0.389114f, 0.484257f, 0.526650f, 0.525509f, 0.486339f, 0.417501f, 0.329156f, 0.225561f, 0.110464f, -0.004565f, -0.110029f, -0.209397f, -0.307633f, -0.398358f, -0.473786f, -0.535896f, -0.587622f, -0.625653f, -0.650087f, -0.667773f, -0.680841f, -0.685616f, -0.684346f, -0.683354f, -0.681293f, -0.673940f, -0.665480f, -0.660678f, -0.654254f, -0.641454f, -0.627762f, -0.616498f, -0.601208f, -0.579959f, -0.560224f, -0.542768f, -0.519685f, -0.491848f, -0.467631f, -0.444806f, -0.415518f, -0.384419f, -0.359637f, -0.335182f, -0.304116f, -0.274642f, -0.252517f, -0.227297f, -0.194558f, -0.166484f, -0.145123f, -0.116152f, -0.080136f, -0.053083f, -0.030604f, 0.005387f, 0.046361f, 0.073460f, 0.102702f, 0.155814f, 0.209408f, 0.244378f, 0.309617f, 0.442675f, 0.565949f, 0.579052f, 0.523768f} + }, + { + { -0.012443f, 0.306951f, 0.640002f, 0.644701f, 0.222035f, -0.433014f, -1.009059f, -1.299682f, -1.291983f, -1.091837f, -0.799579f, -0.462162f, -0.106609f, 0.232265f, 0.526384f, 0.765415f, 0.941389f, 1.042514f, 1.068606f, 1.035233f, 0.959157f, 0.852416f, 0.726756f, 0.589559f, 0.440759f, 0.284682f, 0.135118f, -0.000404f, -0.127707f, -0.249843f, -0.360240f, -0.457524f, -0.548845f, -0.634531f, -0.707989f, -0.771448f, -0.832955f, -0.890467f, -0.937355f, -0.977102f, -1.014815f, -1.044459f, -1.061037f, -1.071895f, -1.081707f, -1.083157f, -1.073972f, -1.063175f, -1.052317f, -1.033040f, -1.007384f, -0.985836f, -0.965459f, -0.935829f, -0.901362f, -0.871368f, -0.838870f, -0.795666f, -0.751917f, -0.715707f, -0.675655f, -0.626445f, -0.582556f, -0.547393f, -0.504423f, -0.453551f, -0.413720f, -0.380963f, -0.333822f, -0.281188f, -0.246458f, -0.212864f, -0.152864f, -0.091358f, -0.055541f, 0.008028f, 0.159750f, 0.338247f, 0.427051f, 0.426619f}, + { 0.012443f, -0.306951f, -0.640002f, -0.644701f, -0.222035f, 0.433014f, 1.009059f, 1.299682f, 1.291983f, 1.091837f, 0.799579f, 0.462162f, 0.106609f, -0.232265f, -0.526384f, -0.765415f, -0.941389f, -1.042514f, -1.068606f, -1.035233f, -0.959157f, -0.852416f, -0.726756f, -0.589559f, -0.440759f, -0.284682f, -0.135118f, 0.000404f, 0.127707f, 0.249843f, 0.360240f, 0.457524f, 0.548845f, 0.634531f, 0.707989f, 0.771448f, 0.832955f, 0.890467f, 0.937355f, 0.977102f, 1.014815f, 1.044459f, 1.061037f, 1.071895f, 1.081707f, 1.083157f, 1.073972f, 1.063175f, 1.052317f, 1.033040f, 1.007384f, 0.985836f, 0.965459f, 0.935829f, 0.901362f, 0.871368f, 0.838870f, 0.795666f, 0.751917f, 0.715707f, 0.675655f, 0.626445f, 0.582556f, 0.547393f, 0.504423f, 0.453551f, 0.413720f, 0.380963f, 0.333822f, 0.281188f, 0.246458f, 0.212864f, 0.152864f, 0.091358f, 0.055541f, -0.008028f, -0.159750f, -0.338247f, -0.427051f, -0.426619f} + }, + { + { 0.106040f, 0.060914f, -0.031732f, -0.122748f, -0.131004f, -0.043133f, 0.056519f, 0.081183f, 0.028467f, -0.045616f, -0.095920f, -0.105685f, -0.073558f, -0.018343f, 0.024819f, 0.040683f, 0.051725f, 0.081855f, 0.120329f, 0.139638f, 0.131573f, 0.106054f, 0.068663f, 0.019936f, -0.031186f, -0.070885f, -0.095191f, -0.111198f, -0.126364f, -0.142556f, -0.156831f, -0.163750f, -0.159885f, -0.147705f, -0.132376f, -0.116427f, -0.101758f, -0.093589f, -0.096321f, -0.107910f, -0.123532f, -0.141780f, -0.162704f, -0.183821f, -0.202825f, -0.220588f, -0.237945f, -0.253555f, -0.267240f, -0.280492f, -0.292011f, -0.297968f, -0.297520f, -0.292601f, -0.282562f, -0.264953f, -0.240677f, -0.212280f, -0.178881f, -0.138637f, -0.093494f, -0.045703f, 0.006560f, 0.064510f, 0.124631f, 0.184450f, 0.246159f, 0.309391f, 0.368198f, 0.420383f, 0.470265f, 0.516543f, 0.549526f, 0.568203f, 0.584977f, 0.598750f, 0.576096f, 0.483726f, 0.343185f, 0.235289f}, + { 0.106040f, 0.060914f, -0.031732f, -0.122748f, -0.131004f, -0.043133f, 0.056519f, 0.081183f, 0.028467f, -0.045616f, -0.095920f, -0.105685f, -0.073558f, -0.018343f, 0.024819f, 0.040683f, 0.051725f, 0.081855f, 0.120329f, 0.139638f, 0.131573f, 0.106054f, 0.068663f, 0.019936f, -0.031186f, -0.070885f, -0.095191f, -0.111198f, -0.126364f, -0.142556f, -0.156831f, -0.163750f, -0.159885f, -0.147705f, -0.132376f, -0.116427f, -0.101758f, -0.093589f, -0.096321f, -0.107910f, -0.123532f, -0.141780f, -0.162704f, -0.183821f, -0.202825f, -0.220588f, -0.237945f, -0.253555f, -0.267240f, -0.280492f, -0.292011f, -0.297968f, -0.297520f, -0.292601f, -0.282562f, -0.264953f, -0.240677f, -0.212280f, -0.178881f, -0.138637f, -0.093494f, -0.045703f, 0.006560f, 0.064510f, 0.124631f, 0.184450f, 0.246159f, 0.309391f, 0.368198f, 0.420383f, 0.470265f, 0.516543f, 0.549526f, 0.568203f, 0.584977f, 0.598750f, 0.576096f, 0.483726f, 0.343185f, 0.235289f} + }, + { + { 0.025607f, 0.045038f, 0.027103f, -0.045868f, -0.111319f, -0.105551f, -0.047795f, -0.014679f, -0.049667f, -0.124496f, -0.180635f, -0.185029f, -0.145752f, -0.091265f, -0.042340f, 0.001278f, 0.052398f, 0.117166f, 0.185884f, 0.241515f, 0.272871f, 0.278398f, 0.262158f, 0.230861f, 0.192777f, 0.153660f, 0.111660f, 0.059556f, -0.005878f, -0.079629f, -0.155374f, -0.232190f, -0.310424f, -0.385049f, -0.448791f, -0.499238f, -0.537567f, -0.562808f, -0.572842f, -0.569135f, -0.555677f, -0.534949f, -0.508499f, -0.478959f, -0.448272f, -0.416372f, -0.383474f, -0.350600f, -0.317045f, -0.281295f, -0.244792f, -0.210869f, -0.180716f, -0.154266f, -0.132786f, -0.116138f, -0.100516f, -0.083127f, -0.065324f, -0.047830f, -0.028398f, -0.007151f, 0.012489f, 0.030425f, 0.049855f, 0.069959f, 0.087587f, 0.105253f, 0.127127f, 0.150063f, 0.170135f, 0.192124f, 0.219421f, 0.244672f, 0.266012f, 0.295860f, 0.330524f, 0.332753f, 0.281342f, 0.221813f}, + { 0.025607f, 0.045038f, 0.027103f, -0.045868f, -0.111319f, -0.105551f, -0.047795f, -0.014679f, -0.049667f, -0.124496f, -0.180635f, -0.185029f, -0.145752f, -0.091265f, -0.042340f, 0.001278f, 0.052398f, 0.117166f, 0.185884f, 0.241515f, 0.272871f, 0.278398f, 0.262158f, 0.230861f, 0.192777f, 0.153660f, 0.111660f, 0.059556f, -0.005878f, -0.079629f, -0.155374f, -0.232190f, -0.310424f, -0.385049f, -0.448791f, -0.499238f, -0.537567f, -0.562808f, -0.572842f, -0.569135f, -0.555677f, -0.534949f, -0.508499f, -0.478959f, -0.448272f, -0.416372f, -0.383474f, -0.350600f, -0.317045f, -0.281295f, -0.244792f, -0.210869f, -0.180716f, -0.154266f, -0.132786f, -0.116138f, -0.100516f, -0.083127f, -0.065324f, -0.047830f, -0.028398f, -0.007151f, 0.012489f, 0.030425f, 0.049855f, 0.069959f, 0.087587f, 0.105253f, 0.127127f, 0.150063f, 0.170135f, 0.192124f, 0.219421f, 0.244672f, 0.266012f, 0.295860f, 0.330524f, 0.332753f, 0.281342f, 0.221813f} + }, + { + { 0.000686f, -0.005679f, -0.002736f, 0.013737f, 0.025339f, 0.016835f, 0.000897f, -0.001565f, -0.001575f, -0.037994f, -0.123814f, -0.215847f, -0.254773f, -0.224963f, -0.159158f, -0.092400f, -0.030561f, 0.036822f, 0.111977f, 0.186298f, 0.252449f, 0.308392f, 0.351372f, 0.375856f, 0.379463f, 0.366110f, 0.340246f, 0.301367f, 0.247642f, 0.181811f, 0.109110f, 0.031862f, -0.049402f, -0.131957f, -0.212350f, -0.288831f, -0.357898f, -0.412063f, -0.446158f, -0.462855f, -0.468107f, -0.465087f, -0.455925f, -0.444179f, -0.431579f, -0.416646f, -0.398983f, -0.380257f, -0.360020f, -0.336141f, -0.309688f, -0.283814f, -0.258868f, -0.234234f, -0.212458f, -0.195547f, -0.180677f, -0.165064f, -0.150310f, -0.137125f, -0.122189f, -0.104504f, -0.087232f, -0.070209f, -0.049591f, -0.026301f, -0.004365f, 0.018481f, 0.046634f, 0.076352f, 0.103125f, 0.132539f, 0.168518f, 0.202438f, 0.232093f, 0.272054f, 0.318122f, 0.326574f, 0.271717f, 0.205315f}, + { -0.000686f, 0.005679f, 0.002736f, -0.013737f, -0.025339f, -0.016835f, -0.000897f, 0.001565f, 0.001575f, 0.037994f, 0.123814f, 0.215847f, 0.254773f, 0.224963f, 0.159158f, 0.092400f, 0.030561f, -0.036822f, -0.111977f, -0.186298f, -0.252449f, -0.308392f, -0.351372f, -0.375856f, -0.379463f, -0.366110f, -0.340246f, -0.301367f, -0.247642f, -0.181811f, -0.109110f, -0.031862f, 0.049402f, 0.131957f, 0.212350f, 0.288831f, 0.357898f, 0.412063f, 0.446158f, 0.462855f, 0.468107f, 0.465087f, 0.455925f, 0.444179f, 0.431579f, 0.416646f, 0.398983f, 0.380257f, 0.360020f, 0.336141f, 0.309688f, 0.283814f, 0.258868f, 0.234234f, 0.212458f, 0.195547f, 0.180677f, 0.165064f, 0.150310f, 0.137125f, 0.122189f, 0.104504f, 0.087232f, 0.070209f, 0.049591f, 0.026301f, 0.004365f, -0.018481f, -0.046634f, -0.076352f, -0.103125f, -0.132539f, -0.168518f, -0.202438f, -0.232093f, -0.272054f, -0.318122f, -0.326574f, -0.271717f, -0.205315f} + }, + { + { 0.007904f, -0.008429f, 0.002701f, 0.025666f, 0.001826f, -0.039845f, 0.005012f, 0.135846f, 0.197408f, 0.076852f, -0.136969f, -0.263642f, -0.237977f, -0.137254f, -0.049823f, 0.006941f, 0.054280f, 0.103144f, 0.149549f, 0.185848f, 0.204085f, 0.200088f, 0.177900f, 0.145801f, 0.110457f, 0.077582f, 0.052788f, 0.037914f, 0.030252f, 0.027742f, 0.031540f, 0.041709f, 0.053562f, 0.061202f, 0.063767f, 0.065527f, 0.069061f, 0.070600f, 0.064006f, 0.047422f, 0.023594f, -0.004162f, -0.032992f, -0.059696f, -0.082643f, -0.103277f, -0.123459f, -0.143553f, -0.164480f, -0.187877f, -0.212785f, -0.236261f, -0.257871f, -0.278890f, -0.297353f, -0.309320f, -0.314125f, -0.312895f, -0.304021f, -0.285839f, -0.260655f, -0.230623f, -0.194026f, -0.150485f, -0.103758f, -0.055096f, -0.001701f, 0.054669f, 0.107407f, 0.155932f, 0.204710f, 0.249689f, 0.280936f, 0.300421f, 0.318178f, 0.326332f, 0.297895f, 0.222216f, 0.128176f, 0.064416f}, + { -0.007904f, 0.008429f, -0.002701f, -0.025666f, -0.001826f, 0.039845f, -0.005012f, -0.135846f, -0.197408f, -0.076852f, 0.136969f, 0.263642f, 0.237977f, 0.137254f, 0.049823f, -0.006941f, -0.054280f, -0.103144f, -0.149549f, -0.185848f, -0.204085f, -0.200088f, -0.177900f, -0.145801f, -0.110457f, -0.077582f, -0.052788f, -0.037914f, -0.030252f, -0.027742f, -0.031540f, -0.041709f, -0.053562f, -0.061202f, -0.063767f, -0.065527f, -0.069061f, -0.070600f, -0.064006f, -0.047422f, -0.023594f, 0.004162f, 0.032992f, 0.059696f, 0.082643f, 0.103277f, 0.123459f, 0.143553f, 0.164480f, 0.187877f, 0.212785f, 0.236261f, 0.257871f, 0.278890f, 0.297353f, 0.309320f, 0.314125f, 0.312895f, 0.304021f, 0.285839f, 0.260655f, 0.230623f, 0.194026f, 0.150485f, 0.103758f, 0.055096f, 0.001701f, -0.054669f, -0.107407f, -0.155932f, -0.204710f, -0.249689f, -0.280936f, -0.300421f, -0.318178f, -0.326332f, -0.297895f, -0.222216f, -0.128176f, -0.064416f} + }, + { + { -0.012716f, -0.011283f, -0.028399f, -0.061054f, -0.081205f, -0.083144f, -0.091074f, -0.102690f, -0.064724f, 0.062608f, 0.237783f, 0.366599f, 0.391473f, 0.329692f, 0.231326f, 0.128318f, 0.030222f, -0.055798f, -0.121650f, -0.168422f, -0.204629f, -0.233962f, -0.253078f, -0.260136f, -0.256765f, -0.242370f, -0.216094f, -0.185514f, -0.164188f, -0.157679f, -0.158772f, -0.158039f, -0.152420f, -0.142465f, -0.128405f, -0.111148f, -0.092065f, -0.070678f, -0.045979f, -0.019198f, 0.007643f, 0.033532f, 0.056493f, 0.073700f, 0.085876f, 0.097069f, 0.108478f, 0.117609f, 0.124012f, 0.129735f, 0.134173f, 0.134912f, 0.132726f, 0.129439f, 0.123146f, 0.111851f, 0.098311f, 0.085383f, 0.071577f, 0.056410f, 0.043514f, 0.033919f, 0.024302f, 0.015077f, 0.010656f, 0.010232f, 0.009612f, 0.011570f, 0.021452f, 0.035720f, 0.049452f, 0.068352f, 0.096786f, 0.126020f, 0.154079f, 0.197033f, 0.251253f, 0.270031f, 0.223100f, 0.160302f}, + { -0.012716f, -0.011283f, -0.028399f, -0.061054f, -0.081205f, -0.083144f, -0.091074f, -0.102690f, -0.064724f, 0.062608f, 0.237783f, 0.366599f, 0.391473f, 0.329692f, 0.231326f, 0.128318f, 0.030222f, -0.055798f, -0.121650f, -0.168422f, -0.204629f, -0.233962f, -0.253078f, -0.260136f, -0.256765f, -0.242370f, -0.216094f, -0.185514f, -0.164188f, -0.157679f, -0.158772f, -0.158039f, -0.152420f, -0.142465f, -0.128405f, -0.111148f, -0.092065f, -0.070678f, -0.045979f, -0.019198f, 0.007643f, 0.033532f, 0.056493f, 0.073700f, 0.085876f, 0.097069f, 0.108478f, 0.117609f, 0.124012f, 0.129735f, 0.134173f, 0.134912f, 0.132726f, 0.129439f, 0.123146f, 0.111851f, 0.098311f, 0.085383f, 0.071577f, 0.056410f, 0.043514f, 0.033919f, 0.024302f, 0.015077f, 0.010656f, 0.010232f, 0.009612f, 0.011570f, 0.021452f, 0.035720f, 0.049452f, 0.068352f, 0.096786f, 0.126020f, 0.154079f, 0.197033f, 0.251253f, 0.270031f, 0.223100f, 0.160302f} + }, + { + { 0.035859f, -0.035357f, -0.114806f, -0.119629f, -0.016035f, 0.134784f, 0.211022f, 0.138101f, -0.031463f, -0.164348f, -0.178566f, -0.110510f, -0.046828f, -0.024291f, -0.021836f, -0.019841f, -0.020649f, -0.019218f, 0.000673f, 0.033520f, 0.050179f, 0.039650f, 0.025311f, 0.029447f, 0.046313f, 0.061065f, 0.072923f, 0.086604f, 0.097738f, 0.098999f, 0.090037f, 0.074499f, 0.056179f, 0.040502f, 0.030491f, 0.020585f, 0.002674f, -0.023442f, -0.052639f, -0.082588f, -0.111653f, -0.134805f, -0.149388f, -0.159077f, -0.166519f, -0.169259f, -0.166952f, -0.163907f, -0.161378f, -0.156387f, -0.149606f, -0.144842f, -0.140986f, -0.134223f, -0.126134f, -0.119925f, -0.112707f, -0.101068f, -0.088476f, -0.078329f, -0.067520f, -0.054684f, -0.044956f, -0.039968f, -0.034783f, -0.029180f, -0.028179f, -0.029379f, -0.025982f, -0.021388f, -0.022077f, -0.020755f, -0.008615f, 0.005112f, 0.013009f, 0.034539f, 0.085352f, 0.136291f, 0.147338f, 0.130821f}, + { 0.035859f, -0.035357f, -0.114806f, -0.119629f, -0.016035f, 0.134784f, 0.211022f, 0.138101f, -0.031463f, -0.164348f, -0.178566f, -0.110510f, -0.046828f, -0.024291f, -0.021836f, -0.019841f, -0.020649f, -0.019218f, 0.000673f, 0.033520f, 0.050179f, 0.039650f, 0.025311f, 0.029447f, 0.046313f, 0.061065f, 0.072923f, 0.086604f, 0.097738f, 0.098999f, 0.090037f, 0.074499f, 0.056179f, 0.040502f, 0.030491f, 0.020585f, 0.002674f, -0.023442f, -0.052639f, -0.082588f, -0.111653f, -0.134805f, -0.149388f, -0.159077f, -0.166519f, -0.169259f, -0.166952f, -0.163907f, -0.161378f, -0.156387f, -0.149606f, -0.144842f, -0.140986f, -0.134223f, -0.126134f, -0.119925f, -0.112707f, -0.101068f, -0.088476f, -0.078329f, -0.067520f, -0.054684f, -0.044956f, -0.039968f, -0.034783f, -0.029180f, -0.028179f, -0.029379f, -0.025982f, -0.021388f, -0.022077f, -0.020755f, -0.008615f, 0.005112f, 0.013009f, 0.034539f, 0.085352f, 0.136291f, 0.147338f, 0.130821f} + }, + { + { -0.000277f, 0.072507f, 0.102938f, 0.013249f, -0.152871f, -0.302455f, -0.374408f, -0.331367f, -0.150657f, 0.128128f, 0.396891f, 0.568348f, 0.643297f, 0.660957f, 0.623136f, 0.509757f, 0.340137f, 0.169505f, 0.031029f, -0.085194f, -0.198795f, -0.311141f, -0.410925f, -0.488800f, -0.543139f, -0.580355f, -0.609683f, -0.633539f, -0.646097f, -0.642831f, -0.625426f, -0.596020f, -0.553861f, -0.499612f, -0.436850f, -0.368148f, -0.294645f, -0.219235f, -0.145750f, -0.076151f, -0.011910f, 0.044644f, 0.093543f, 0.138070f, 0.179584f, 0.215412f, 0.243810f, 0.266366f, 0.284297f, 0.297593f, 0.308450f, 0.320041f, 0.331716f, 0.340456f, 0.346032f, 0.349732f, 0.350243f, 0.345998f, 0.338804f, 0.330510f, 0.319816f, 0.306267f, 0.292468f, 0.279073f, 0.263490f, 0.245910f, 0.229601f, 0.214043f, 0.196022f, 0.177471f, 0.162554f, 0.148486f, 0.130576f, 0.113131f, 0.101342f, 0.086559f, 0.056990f, 0.019982f, -0.005018f, -0.012955f}, + { -0.000277f, 0.072507f, 0.102938f, 0.013249f, -0.152871f, -0.302455f, -0.374408f, -0.331367f, -0.150657f, 0.128128f, 0.396891f, 0.568348f, 0.643297f, 0.660957f, 0.623136f, 0.509757f, 0.340137f, 0.169505f, 0.031029f, -0.085194f, -0.198795f, -0.311141f, -0.410925f, -0.488800f, -0.543139f, -0.580355f, -0.609683f, -0.633539f, -0.646097f, -0.642831f, -0.625426f, -0.596020f, -0.553861f, -0.499612f, -0.436850f, -0.368148f, -0.294645f, -0.219235f, -0.145750f, -0.076151f, -0.011910f, 0.044644f, 0.093543f, 0.138070f, 0.179584f, 0.215412f, 0.243810f, 0.266366f, 0.284297f, 0.297593f, 0.308450f, 0.320041f, 0.331716f, 0.340456f, 0.346032f, 0.349732f, 0.350243f, 0.345998f, 0.338804f, 0.330510f, 0.319816f, 0.306267f, 0.292468f, 0.279073f, 0.263490f, 0.245910f, 0.229601f, 0.214043f, 0.196022f, 0.177471f, 0.162554f, 0.148486f, 0.130576f, 0.113131f, 0.101342f, 0.086559f, 0.056990f, 0.019982f, -0.005018f, -0.012955f} + } +}; +const float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]={ + { + { -0.279849f, -0.720835f, -0.885416f, -0.784738f, -0.545597f, -0.284166f, -0.039642f, 0.189992f, 0.392178f, 0.537862f, 0.608064f, 0.599378f, 0.517014f, 0.378190f, 0.211052f, 0.038799f, -0.127672f, -0.280366f, -0.411081f, -0.518033f, -0.602220f, -0.659249f, -0.686892f, -0.694308f, -0.690691f, -0.672923f, -0.636337f, -0.587078f, -0.532859f, -0.473554f, -0.410112f, -0.349570f, -0.294359f, -0.240124f, -0.187465f, -0.141656f, -0.100915f, -0.059776f, -0.020698f, 0.012198f, 0.044049f, 0.079925f, 0.114533f, 0.143760f, 0.173471f, 0.206190f, 0.234826f, 0.257923f, 0.283113f, 0.310262f, 0.331082f, 0.346996f, 0.366076f, 0.384865f, 0.395359f, 0.402963f, 0.415413f, 0.425799f, 0.427896f, 0.431174f, 0.440886f, 0.445771f, 0.442548f, 0.444490f, 0.452426f, 0.451179f, 0.443114f, 0.445296f, 0.451405f, 0.442876f, 0.431564f, 0.437517f, 0.441102f, 0.420868f, 0.408764f, 0.426165f, 0.404391f, 0.275313f, 0.105567f, 0.014714f}, + { -0.279849f, -0.720835f, -0.885416f, -0.784738f, -0.545597f, -0.284166f, -0.039642f, 0.189992f, 0.392178f, 0.537862f, 0.608064f, 0.599378f, 0.517014f, 0.378190f, 0.211052f, 0.038799f, -0.127672f, -0.280366f, -0.411081f, -0.518033f, -0.602220f, -0.659249f, -0.686892f, -0.694308f, -0.690691f, -0.672923f, -0.636337f, -0.587078f, -0.532859f, -0.473554f, -0.410112f, -0.349570f, -0.294359f, -0.240124f, -0.187465f, -0.141656f, -0.100915f, -0.059776f, -0.020698f, 0.012198f, 0.044049f, 0.079925f, 0.114533f, 0.143760f, 0.173471f, 0.206190f, 0.234826f, 0.257923f, 0.283113f, 0.310262f, 0.331082f, 0.346996f, 0.366076f, 0.384865f, 0.395359f, 0.402963f, 0.415413f, 0.425799f, 0.427896f, 0.431174f, 0.440886f, 0.445771f, 0.442548f, 0.444490f, 0.452426f, 0.451179f, 0.443114f, 0.445296f, 0.451405f, 0.442876f, 0.431564f, 0.437517f, 0.441102f, 0.420868f, 0.408764f, 0.426165f, 0.404391f, 0.275313f, 0.105567f, 0.014714f} + }, + { + { 0.137891f, 0.229594f, -0.067928f, -0.623005f, -1.090538f, -1.189519f, -0.884822f, -0.354524f, 0.180758f, 0.598608f, 0.883947f, 1.053700f, 1.111227f, 1.061907f, 0.928126f, 0.732907f, 0.490534f, 0.220795f, -0.047441f, -0.292902f, -0.508160f, -0.690313f, -0.839240f, -0.960125f, -1.054642f, -1.116743f, -1.146677f, -1.156988f, -1.156022f, -1.140346f, -1.110014f, -1.073762f, -1.034019f, -0.985244f, -0.929519f, -0.875052f, -0.820278f, -0.758166f, -0.691738f, -0.627222f, -0.560364f, -0.486773f, -0.413937f, -0.347468f, -0.280644f, -0.210486f, -0.145643f, -0.088457f, -0.030518f, 0.027797f, 0.077074f, 0.119974f, 0.167213f, 0.215231f, 0.254026f, 0.289039f, 0.328776f, 0.364400f, 0.387539f, 0.408919f, 0.435376f, 0.454122f, 0.460897f, 0.471406f, 0.487696f, 0.492222f, 0.486983f, 0.492364f, 0.502301f, 0.494577f, 0.481913f, 0.489869f, 0.498275f, 0.479752f, 0.470075f, 0.504969f, 0.517158f, 0.412306f, 0.223203f, 0.061484f}, + { -0.137891f, -0.229594f, 0.067928f, 0.623005f, 1.090538f, 1.189519f, 0.884822f, 0.354524f, -0.180758f, -0.598608f, -0.883947f, -1.053700f, -1.111227f, -1.061907f, -0.928126f, -0.732907f, -0.490534f, -0.220795f, 0.047441f, 0.292902f, 0.508160f, 0.690313f, 0.839240f, 0.960125f, 1.054642f, 1.116743f, 1.146677f, 1.156988f, 1.156022f, 1.140346f, 1.110014f, 1.073762f, 1.034019f, 0.985244f, 0.929519f, 0.875052f, 0.820278f, 0.758166f, 0.691738f, 0.627222f, 0.560364f, 0.486773f, 0.413937f, 0.347468f, 0.280644f, 0.210486f, 0.145643f, 0.088457f, 0.030518f, -0.027797f, -0.077074f, -0.119974f, -0.167213f, -0.215231f, -0.254026f, -0.289039f, -0.328776f, -0.364400f, -0.387539f, -0.408919f, -0.435376f, -0.454122f, -0.460897f, -0.471406f, -0.487696f, -0.492222f, -0.486983f, -0.492364f, -0.502301f, -0.494577f, -0.481913f, -0.489869f, -0.498275f, -0.479752f, -0.470075f, -0.504969f, -0.517158f, -0.412306f, -0.223203f, -0.061484f} + }, + { + { -0.037944f, -0.106904f, -0.132860f, -0.074197f, 0.039345f, 0.109112f, 0.075839f, -0.015806f, -0.081154f, -0.083561f, -0.038813f, 0.024921f, 0.079316f, 0.098387f, 0.081988f, 0.060932f, 0.056952f, 0.053685f, 0.024659f, -0.028315f, -0.083387f, -0.128710f, -0.164189f, -0.185222f, -0.184737f, -0.166916f, -0.145003f, -0.127294f, -0.112613f, -0.096040f, -0.073923f, -0.046696f, -0.019918f, 0.000121f, 0.011773f, 0.015947f, 0.011639f, -0.001080f, -0.016599f, -0.028201f, -0.034495f, -0.036865f, -0.034339f, -0.025728f, -0.012939f, 0.002163f, 0.020448f, 0.042341f, 0.066491f, 0.093562f, 0.126180f, 0.163808f, 0.202979f, 0.242843f, 0.284779f, 0.327198f, 0.366815f, 0.403787f, 0.439636f, 0.472316f, 0.499155f, 0.521398f, 0.540138f, 0.552065f, 0.554704f, 0.550353f, 0.539674f, 0.518421f, 0.485659f, 0.446647f, 0.402248f, 0.346247f, 0.279546f, 0.213387f, 0.148100f, 0.064032f, -0.046179f, -0.142400f, -0.158189f, -0.068950f}, + { -0.037944f, -0.106904f, -0.132860f, -0.074197f, 0.039345f, 0.109112f, 0.075839f, -0.015806f, -0.081154f, -0.083561f, -0.038813f, 0.024921f, 0.079316f, 0.098387f, 0.081988f, 0.060932f, 0.056952f, 0.053685f, 0.024659f, -0.028315f, -0.083387f, -0.128710f, -0.164189f, -0.185222f, -0.184737f, -0.166916f, -0.145003f, -0.127294f, -0.112613f, -0.096040f, -0.073923f, -0.046696f, -0.019918f, 0.000121f, 0.011773f, 0.015947f, 0.011639f, -0.001080f, -0.016599f, -0.028201f, -0.034495f, -0.036865f, -0.034339f, -0.025728f, -0.012939f, 0.002163f, 0.020448f, 0.042341f, 0.066491f, 0.093562f, 0.126180f, 0.163808f, 0.202979f, 0.242843f, 0.284779f, 0.327198f, 0.366815f, 0.403787f, 0.439636f, 0.472316f, 0.499155f, 0.521398f, 0.540138f, 0.552065f, 0.554704f, 0.550353f, 0.539674f, 0.518421f, 0.485659f, 0.446647f, 0.402248f, 0.346247f, 0.279546f, 0.213387f, 0.148100f, 0.064032f, -0.046179f, -0.142400f, -0.158189f, -0.068950f} + }, + { + { -0.001343f, -0.030465f, -0.090431f, -0.117729f, -0.072159f, -0.000959f, 0.017976f, -0.029349f, -0.083995f, -0.085435f, -0.026909f, 0.054025f, 0.117372f, 0.148897f, 0.159644f, 0.166262f, 0.171633f, 0.163163f, 0.127809f, 0.065274f, -0.013456f, -0.095573f, -0.171737f, -0.236275f, -0.288250f, -0.332759f, -0.376516f, -0.419675f, -0.454690f, -0.474981f, -0.481065f, -0.475362f, -0.455565f, -0.418282f, -0.365992f, -0.304811f, -0.237851f, -0.166048f, -0.093163f, -0.024547f, 0.037453f, 0.092832f, 0.140930f, 0.181479f, 0.216098f, 0.246070f, 0.271249f, 0.292345f, 0.310665f, 0.325008f, 0.332856f, 0.334536f, 0.332397f, 0.327422f, 0.320787f, 0.315984f, 0.314890f, 0.314985f, 0.314210f, 0.313937f, 0.314092f, 0.311588f, 0.306338f, 0.301707f, 0.297473f, 0.290554f, 0.282600f, 0.277168f, 0.271223f, 0.260355f, 0.248072f, 0.237680f, 0.222743f, 0.199693f, 0.176748f, 0.151965f, 0.102492f, 0.025265f, -0.032061f, -0.023375f}, + { -0.001343f, -0.030465f, -0.090431f, -0.117729f, -0.072159f, -0.000959f, 0.017976f, -0.029349f, -0.083995f, -0.085435f, -0.026909f, 0.054025f, 0.117372f, 0.148897f, 0.159644f, 0.166262f, 0.171633f, 0.163163f, 0.127809f, 0.065274f, -0.013456f, -0.095573f, -0.171737f, -0.236275f, -0.288250f, -0.332759f, -0.376516f, -0.419675f, -0.454690f, -0.474981f, -0.481065f, -0.475362f, -0.455565f, -0.418282f, -0.365992f, -0.304811f, -0.237851f, -0.166048f, -0.093163f, -0.024547f, 0.037453f, 0.092832f, 0.140930f, 0.181479f, 0.216098f, 0.246070f, 0.271249f, 0.292345f, 0.310665f, 0.325008f, 0.332856f, 0.334536f, 0.332397f, 0.327422f, 0.320787f, 0.315984f, 0.314890f, 0.314985f, 0.314210f, 0.313937f, 0.314092f, 0.311588f, 0.306338f, 0.301707f, 0.297473f, 0.290554f, 0.282600f, 0.277168f, 0.271223f, 0.260355f, 0.248072f, 0.237680f, 0.222743f, 0.199693f, 0.176748f, 0.151965f, 0.102492f, 0.025265f, -0.032061f, -0.023375f} + }, + { + { -0.003822f, -0.004182f, 0.003769f, 0.002231f, -0.018518f, -0.042371f, -0.050814f, -0.055060f, -0.082241f, -0.127129f, -0.141168f, -0.084513f, 0.025067f, 0.131195f, 0.197402f, 0.230196f, 0.250490f, 0.263052f, 0.258983f, 0.233443f, 0.189892f, 0.131909f, 0.060205f, -0.021879f, -0.106291f, -0.186505f, -0.262057f, -0.333838f, -0.398243f, -0.449958f, -0.487738f, -0.512937f, -0.524754f, -0.521358f, -0.503097f, -0.470311f, -0.421405f, -0.357963f, -0.288378f, -0.221718f, -0.161127f, -0.106483f, -0.058681f, -0.017466f, 0.020089f, 0.055500f, 0.087512f, 0.116263f, 0.143565f, 0.168412f, 0.187881f, 0.202191f, 0.213370f, 0.220775f, 0.223797f, 0.225934f, 0.230320f, 0.235230f, 0.239129f, 0.244505f, 0.252120f, 0.258553f, 0.263155f, 0.269212f, 0.275974f, 0.279247f, 0.280325f, 0.283134f, 0.284382f, 0.279208f, 0.271780f, 0.265915f, 0.254057f, 0.231999f, 0.209308f, 0.183649f, 0.128013f, 0.038161f, -0.030805f, -0.024799f}, + { 0.003822f, 0.004182f, -0.003769f, -0.002231f, 0.018518f, 0.042371f, 0.050814f, 0.055060f, 0.082241f, 0.127129f, 0.141168f, 0.084513f, -0.025067f, -0.131195f, -0.197402f, -0.230196f, -0.250490f, -0.263052f, -0.258983f, -0.233443f, -0.189892f, -0.131909f, -0.060205f, 0.021879f, 0.106291f, 0.186505f, 0.262057f, 0.333838f, 0.398243f, 0.449958f, 0.487738f, 0.512937f, 0.524754f, 0.521358f, 0.503097f, 0.470311f, 0.421405f, 0.357963f, 0.288378f, 0.221718f, 0.161127f, 0.106483f, 0.058681f, 0.017466f, -0.020089f, -0.055500f, -0.087512f, -0.116263f, -0.143565f, -0.168412f, -0.187881f, -0.202191f, -0.213370f, -0.220775f, -0.223797f, -0.225934f, -0.230320f, -0.235230f, -0.239129f, -0.244505f, -0.252120f, -0.258553f, -0.263155f, -0.269212f, -0.275974f, -0.279247f, -0.280325f, -0.283134f, -0.284382f, -0.279208f, -0.271780f, -0.265915f, -0.254057f, -0.231999f, -0.209308f, -0.183649f, -0.128013f, -0.038161f, 0.030805f, 0.024799f} + }, + { + { -0.007141f, -0.000269f, 0.020053f, 0.005151f, -0.021397f, 0.017134f, 0.096077f, 0.079602f, -0.080798f, -0.242492f, -0.239038f, -0.078682f, 0.094173f, 0.179901f, 0.193223f, 0.186734f, 0.180011f, 0.165677f, 0.136686f, 0.092362f, 0.037203f, -0.018468f, -0.063954f, -0.094649f, -0.110368f, -0.112031f, -0.103341f, -0.090810f, -0.078704f, -0.067141f, -0.056765f, -0.051692f, -0.055372f, -0.065676f, -0.076978f, -0.087145f, -0.100035f, -0.119731f, -0.144366f, -0.167862f, -0.185792f, -0.196760f, -0.200382f, -0.197667f, -0.191812f, -0.185459f, -0.178637f, -0.170957f, -0.162715f, -0.152400f, -0.137119f, -0.116662f, -0.092858f, -0.064845f, -0.030146f, 0.010135f, 0.052660f, 0.096829f, 0.142849f, 0.187559f, 0.227910f, 0.264896f, 0.298909f, 0.326420f, 0.345843f, 0.359746f, 0.367295f, 0.363369f, 0.348300f, 0.327585f, 0.299800f, 0.258398f, 0.207127f, 0.156648f, 0.103405f, 0.032624f, -0.049949f, -0.107648f, -0.105316f, -0.043186f}, + { 0.007141f, 0.000269f, -0.020053f, -0.005151f, 0.021397f, -0.017134f, -0.096077f, -0.079602f, 0.080798f, 0.242492f, 0.239038f, 0.078682f, -0.094173f, -0.179901f, -0.193223f, -0.186734f, -0.180011f, -0.165677f, -0.136686f, -0.092362f, -0.037203f, 0.018468f, 0.063954f, 0.094649f, 0.110368f, 0.112031f, 0.103341f, 0.090810f, 0.078704f, 0.067141f, 0.056765f, 0.051692f, 0.055372f, 0.065676f, 0.076978f, 0.087145f, 0.100035f, 0.119731f, 0.144366f, 0.167862f, 0.185792f, 0.196760f, 0.200382f, 0.197667f, 0.191812f, 0.185459f, 0.178637f, 0.170957f, 0.162715f, 0.152400f, 0.137119f, 0.116662f, 0.092858f, 0.064845f, 0.030146f, -0.010135f, -0.052660f, -0.096829f, -0.142849f, -0.187559f, -0.227910f, -0.264896f, -0.298909f, -0.326420f, -0.345843f, -0.359746f, -0.367295f, -0.363369f, -0.348300f, -0.327585f, -0.299800f, -0.258398f, -0.207127f, -0.156648f, -0.103405f, -0.032624f, 0.049949f, 0.107648f, 0.105316f, 0.043186f} + }, + { + { -0.001068f, -0.011669f, -0.026585f, -0.020015f, 0.010585f, 0.040078f, 0.066520f, 0.124261f, 0.221193f, 0.294911f, 0.266885f, 0.129051f, -0.049656f, -0.195409f, -0.283656f, -0.326169f, -0.335364f, -0.316666f, -0.279923f, -0.238383f, -0.197010f, -0.152299f, -0.103120f, -0.053556f, -0.006327f, 0.037345f, 0.071350f, 0.087916f, 0.089422f, 0.089013f, 0.097000f, 0.112917f, 0.131823f, 0.151104f, 0.169420f, 0.185327f, 0.198942f, 0.210964f, 0.219989f, 0.223967f, 0.222689f, 0.216294f, 0.204468f, 0.189464f, 0.175607f, 0.163713f, 0.150702f, 0.135728f, 0.121043f, 0.106637f, 0.090424f, 0.073312f, 0.057730f, 0.042745f, 0.026954f, 0.013259f, 0.004619f, -0.000739f, -0.004364f, -0.003750f, 0.001700f, 0.008264f, 0.015354f, 0.026579f, 0.041079f, 0.054236f, 0.067442f, 0.085032f, 0.103334f, 0.116515f, 0.128381f, 0.142875f, 0.152038f, 0.151164f, 0.149997f, 0.145519f, 0.107611f, 0.028941f, -0.034761f, -0.026006f}, + { -0.001068f, -0.011669f, -0.026585f, -0.020015f, 0.010585f, 0.040078f, 0.066520f, 0.124261f, 0.221193f, 0.294911f, 0.266885f, 0.129051f, -0.049656f, -0.195409f, -0.283656f, -0.326169f, -0.335364f, -0.316666f, -0.279923f, -0.238383f, -0.197010f, -0.152299f, -0.103120f, -0.053556f, -0.006327f, 0.037345f, 0.071350f, 0.087916f, 0.089422f, 0.089013f, 0.097000f, 0.112917f, 0.131823f, 0.151104f, 0.169420f, 0.185327f, 0.198942f, 0.210964f, 0.219989f, 0.223967f, 0.222689f, 0.216294f, 0.204468f, 0.189464f, 0.175607f, 0.163713f, 0.150702f, 0.135728f, 0.121043f, 0.106637f, 0.090424f, 0.073312f, 0.057730f, 0.042745f, 0.026954f, 0.013259f, 0.004619f, -0.000739f, -0.004364f, -0.003750f, 0.001700f, 0.008264f, 0.015354f, 0.026579f, 0.041079f, 0.054236f, 0.067442f, 0.085032f, 0.103334f, 0.116515f, 0.128381f, 0.142875f, 0.152038f, 0.151164f, 0.149997f, 0.145519f, 0.107611f, 0.028941f, -0.034761f, -0.026006f} + }, + { + { -0.037828f, -0.075096f, -0.025986f, 0.086083f, 0.170568f, 0.136964f, -0.015998f, -0.179579f, -0.227305f, -0.136711f, -0.003232f, 0.070010f, 0.069408f, 0.046996f, 0.037246f, 0.035376f, 0.036858f, 0.049531f, 0.065210f, 0.059663f, 0.031146f, 0.008574f, 0.010733f, 0.023060f, 0.025014f, 0.016687f, 0.006465f, -0.007530f, -0.030444f, -0.058769f, -0.085159f, -0.105870f, -0.119253f, -0.126108f, -0.132952f, -0.145953f, -0.161950f, -0.172937f, -0.176110f, -0.172287f, -0.160154f, -0.140096f, -0.117814f, -0.097309f, -0.076591f, -0.054926f, -0.036201f, -0.021493f, -0.007233f, 0.006947f, 0.017810f, 0.026450f, 0.036880f, 0.047880f, 0.055961f, 0.063286f, 0.072990f, 0.081618f, 0.085458f, 0.087597f, 0.090387f, 0.089833f, 0.084714f, 0.080517f, 0.078723f, 0.074845f, 0.070311f, 0.071284f, 0.075074f, 0.075104f, 0.076588f, 0.086990f, 0.097901f, 0.100583f, 0.107487f, 0.127031f, 0.132157f, 0.094602f, 0.037294f, 0.005325f}, + { -0.037828f, -0.075096f, -0.025986f, 0.086083f, 0.170568f, 0.136964f, -0.015998f, -0.179579f, -0.227305f, -0.136711f, -0.003232f, 0.070010f, 0.069408f, 0.046996f, 0.037246f, 0.035376f, 0.036858f, 0.049531f, 0.065210f, 0.059663f, 0.031146f, 0.008574f, 0.010733f, 0.023060f, 0.025014f, 0.016687f, 0.006465f, -0.007530f, -0.030444f, -0.058769f, -0.085159f, -0.105870f, -0.119253f, -0.126108f, -0.132952f, -0.145953f, -0.161950f, -0.172937f, -0.176110f, -0.172287f, -0.160154f, -0.140096f, -0.117814f, -0.097309f, -0.076591f, -0.054926f, -0.036201f, -0.021493f, -0.007233f, 0.006947f, 0.017810f, 0.026450f, 0.036880f, 0.047880f, 0.055961f, 0.063286f, 0.072990f, 0.081618f, 0.085458f, 0.087597f, 0.090387f, 0.089833f, 0.084714f, 0.080517f, 0.078723f, 0.074845f, 0.070311f, 0.071284f, 0.075074f, 0.075104f, 0.076588f, 0.086990f, 0.097901f, 0.100583f, 0.107487f, 0.127031f, 0.132157f, 0.094602f, 0.037294f, 0.005325f} + }, + { + { 0.027301f, 0.021738f, -0.081975f, -0.191273f, -0.201656f, -0.093313f, 0.098293f, 0.327814f, 0.523024f, 0.591610f, 0.499519f, 0.308744f, 0.101488f, -0.099663f, -0.304655f, -0.489528f, -0.606885f, -0.646492f, -0.643705f, -0.630992f, -0.609667f, -0.567561f, -0.501376f, -0.418604f, -0.330719f, -0.246456f, -0.165722f, -0.081663f, 0.008736f, 0.100691f, 0.189194f, 0.273485f, 0.352379f, 0.422027f, 0.480102f, 0.526801f, 0.561345f, 0.582237f, 0.590324f, 0.587683f, 0.575450f, 0.555880f, 0.533158f, 0.508979f, 0.481080f, 0.448562f, 0.414355f, 0.380878f, 0.348188f, 0.317304f, 0.289889f, 0.264214f, 0.236745f, 0.207390f, 0.178284f, 0.149119f, 0.118860f, 0.089518f, 0.063222f, 0.038738f, 0.015103f, -0.005639f, -0.022904f, -0.039298f, -0.055077f, -0.067305f, -0.076311f, -0.085345f, -0.093266f, -0.096501f, -0.097512f, -0.100870f, -0.103292f, -0.100064f, -0.097365f, -0.102461f, -0.105454f, -0.089136f, -0.054435f, -0.017187f}, + { 0.027301f, 0.021738f, -0.081975f, -0.191273f, -0.201656f, -0.093313f, 0.098293f, 0.327814f, 0.523024f, 0.591610f, 0.499519f, 0.308744f, 0.101488f, -0.099663f, -0.304655f, -0.489528f, -0.606885f, -0.646492f, -0.643705f, -0.630992f, -0.609667f, -0.567561f, -0.501376f, -0.418604f, -0.330719f, -0.246456f, -0.165722f, -0.081663f, 0.008736f, 0.100691f, 0.189194f, 0.273485f, 0.352379f, 0.422027f, 0.480102f, 0.526801f, 0.561345f, 0.582237f, 0.590324f, 0.587683f, 0.575450f, 0.555880f, 0.533158f, 0.508979f, 0.481080f, 0.448562f, 0.414355f, 0.380878f, 0.348188f, 0.317304f, 0.289889f, 0.264214f, 0.236745f, 0.207390f, 0.178284f, 0.149119f, 0.118860f, 0.089518f, 0.063222f, 0.038738f, 0.015103f, -0.005639f, -0.022904f, -0.039298f, -0.055077f, -0.067305f, -0.076311f, -0.085345f, -0.093266f, -0.096501f, -0.097512f, -0.100870f, -0.103292f, -0.100064f, -0.097365f, -0.102461f, -0.105454f, -0.089136f, -0.054435f, -0.017187f} + } +}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* UPDATE_SBA_FILTER */ + +#ifdef UPDATE_SBA_FILTER + + +/********************** CRendBin_HOA3_HRIR **********************/ + +#ifdef UPDATE_SBA_FILTER +const float CRendBin_HOA3_HRIR_latency_s = 0.000020834f; +#else +const float CRendBin_HOA3_HRIR_latency_s = 0.000020833333110f; +#endif + +/* Sample Rate = 48000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]={{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}},{{240},{240}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]={ + { + {0.975460f, 0.823508f, 0.578722f, 0.311394f, 0.071393f, -0.117298f, -0.265803f, -0.406443f, -0.536876f, -0.603591f, -0.568995f, -0.446021f, -0.232011f, 0.098533f, 0.446049f, 0.539124f, 0.219489f, -0.255318f, -0.399037f, -0.041354f, 0.472264f, 0.693368f, 0.533266f, 0.219305f, -0.059008f, -0.291241f, -0.505715f, -0.670083f, -0.755827f, -0.790827f, -0.808813f, -0.807132f, -0.777516f, -0.733727f, -0.690346f, -0.645074f, -0.594162f, -0.543258f, -0.496359f, -0.450603f, -0.404959f, -0.361817f, -0.320310f, -0.277796f, -0.235759f, -0.196817f, -0.159540f, -0.122007f, -0.085990f, -0.053099f, -0.021484f, 0.010278f, 0.040672f, 0.068775f, 0.095789f, 0.121856f, 0.145524f, 0.166807f, 0.187076f, 0.206251f, 0.223418f, 0.239269f, 0.254992f, 0.270072f, 0.283633f, 0.296367f, 0.309129f, 0.321380f, 0.332609f, 0.343518f, 0.354653f, 0.365577f, 0.376080f, 0.386687f, 0.397603f, 0.408487f, 0.419268f, 0.430118f, 0.440990f, 0.451887f, 0.462914f, 0.473622f, 0.483318f, 0.492236f, 0.501131f, 0.509707f, 0.516930f, 0.522835f, 0.528471f, 0.534052f, 0.538627f, 0.541575f, 0.543261f, 0.544286f, 0.544970f, 0.545324f, + 0.544992f, 0.543702f, 0.542083f, 0.541321f, 0.541767f, 0.542678f, 0.543474f, 0.544468f, 0.546285f, 0.549302f, 0.553570f, 0.558668f, 0.563836f, 0.568775f, 0.574014f, 0.580118f, 0.586957f, 0.594005f, 0.600840f, 0.607125f, 0.612700f, 0.617868f, 0.623088f, 0.628356f, 0.633282f, 0.637656f, 0.641523f, 0.644919f, 0.647931f, 0.650762f, 0.653419f, 0.655595f, 0.657072f, 0.657932f, 0.658320f, 0.658353f, 0.658263f, 0.658277f, 0.658369f, 0.658425f, 0.658492f, 0.658661f, 0.658936f, 0.659454f, 0.660549f, 0.662412f, 0.664935f, 0.667968f, 0.671455f, 0.675277f, 0.679269f, 0.683383f, 0.687622f, 0.691852f, 0.695884f, 0.699596f, 0.702892f, 0.705658f, 0.707869f, 0.709572f, 0.710785f, 0.711543f, 0.711953f, 0.712094f, 0.711995f, 0.711765f, 0.711575f, 0.711499f, 0.711595f, 0.712021f, 0.712800f, 0.713666f, 0.714410f, 0.715098f, 0.715743f, 0.716167f, 0.716376f, 0.716567f, 0.716703f, 0.716617f, 0.716501f, 0.716656f, 0.716977f, 0.717361f, 0.718171f, 0.719629f, 0.721375f, 0.723265f, 0.725713f, 0.728693f, 0.731584f, 0.734403f, 0.737690f, 0.741092f, 0.743862f, 0.746530f, + 0.749856f, 0.752896f, 0.754767f, 0.756924f, 0.760408f, 0.763073f, 0.763626f, 0.765163f, 0.769439f, 0.771950f, 0.769853f, 0.769580f, 0.776657f, 0.782626f, 0.774831f, 0.756861f, 0.745683f, 0.748813f, 0.757334f, 0.761317f, 0.758260f, 0.746087f, 0.724051f, 0.704063f, 0.704633f, 0.725907f, 0.744126f, 0.739878f, 0.720948f, 0.707668f, 0.705590f, 0.705432f, 0.704944f, 0.716791f, 0.751654f, 0.801379f, 0.844163f, 0.864649f, 0.865574f, 0.859719f, 0.854548f, 0.849005f, 0.842929f, 0.840816f, 0.842745f, 0.839787f, 0.826402f, 0.812303f}, + {0.975460f, 0.823508f, 0.578722f, 0.311394f, 0.071393f, -0.117298f, -0.265803f, -0.406443f, -0.536876f, -0.603591f, -0.568995f, -0.446021f, -0.232011f, 0.098533f, 0.446049f, 0.539124f, 0.219489f, -0.255318f, -0.399037f, -0.041354f, 0.472264f, 0.693368f, 0.533266f, 0.219305f, -0.059008f, -0.291241f, -0.505715f, -0.670083f, -0.755827f, -0.790827f, -0.808813f, -0.807132f, -0.777516f, -0.733727f, -0.690346f, -0.645074f, -0.594162f, -0.543258f, -0.496359f, -0.450603f, -0.404959f, -0.361817f, -0.320310f, -0.277796f, -0.235759f, -0.196817f, -0.159540f, -0.122007f, -0.085990f, -0.053099f, -0.021484f, 0.010278f, 0.040672f, 0.068775f, 0.095789f, 0.121856f, 0.145524f, 0.166807f, 0.187076f, 0.206251f, 0.223418f, 0.239269f, 0.254992f, 0.270072f, 0.283633f, 0.296367f, 0.309129f, 0.321380f, 0.332609f, 0.343518f, 0.354653f, 0.365577f, 0.376080f, 0.386687f, 0.397603f, 0.408487f, 0.419268f, 0.430118f, 0.440990f, 0.451887f, 0.462914f, 0.473622f, 0.483318f, 0.492236f, 0.501131f, 0.509707f, 0.516930f, 0.522835f, 0.528471f, 0.534052f, 0.538627f, 0.541575f, 0.543261f, 0.544286f, 0.544970f, 0.545324f, + 0.544992f, 0.543702f, 0.542083f, 0.541321f, 0.541767f, 0.542678f, 0.543474f, 0.544468f, 0.546285f, 0.549302f, 0.553570f, 0.558668f, 0.563836f, 0.568775f, 0.574014f, 0.580118f, 0.586957f, 0.594005f, 0.600840f, 0.607125f, 0.612700f, 0.617868f, 0.623088f, 0.628356f, 0.633282f, 0.637656f, 0.641523f, 0.644919f, 0.647931f, 0.650762f, 0.653419f, 0.655595f, 0.657072f, 0.657932f, 0.658320f, 0.658353f, 0.658263f, 0.658277f, 0.658369f, 0.658425f, 0.658492f, 0.658661f, 0.658936f, 0.659454f, 0.660549f, 0.662412f, 0.664935f, 0.667968f, 0.671455f, 0.675277f, 0.679269f, 0.683383f, 0.687622f, 0.691852f, 0.695884f, 0.699596f, 0.702892f, 0.705658f, 0.707869f, 0.709572f, 0.710785f, 0.711543f, 0.711953f, 0.712094f, 0.711995f, 0.711765f, 0.711575f, 0.711499f, 0.711595f, 0.712021f, 0.712800f, 0.713666f, 0.714410f, 0.715098f, 0.715743f, 0.716167f, 0.716376f, 0.716567f, 0.716703f, 0.716617f, 0.716501f, 0.716656f, 0.716977f, 0.717361f, 0.718171f, 0.719629f, 0.721375f, 0.723265f, 0.725713f, 0.728693f, 0.731584f, 0.734403f, 0.737690f, 0.741092f, 0.743862f, 0.746530f, + 0.749856f, 0.752896f, 0.754767f, 0.756924f, 0.760408f, 0.763073f, 0.763626f, 0.765163f, 0.769439f, 0.771950f, 0.769853f, 0.769580f, 0.776657f, 0.782626f, 0.774831f, 0.756861f, 0.745683f, 0.748813f, 0.757334f, 0.761317f, 0.758260f, 0.746087f, 0.724051f, 0.704063f, 0.704633f, 0.725907f, 0.744126f, 0.739878f, 0.720948f, 0.707668f, 0.705590f, 0.705432f, 0.704944f, 0.716791f, 0.751654f, 0.801379f, 0.844163f, 0.864649f, 0.865574f, 0.859719f, 0.854548f, 0.849005f, 0.842929f, 0.840816f, 0.842745f, 0.839787f, 0.826402f, 0.812303f} + }, + { + {0.073227f, 0.301823f, 0.659487f, 0.955673f, 1.013690f, 0.793634f, 0.374105f, -0.142456f, -0.636566f, -0.963913f, -1.063402f, -1.003613f, -0.793969f, -0.284345f, 0.500040f, 1.037338f, 0.731315f, -0.256929f, -0.976234f, -0.710231f, 0.228481f, 0.963086f, 1.064126f, 0.788617f, 0.498005f, 0.250379f, -0.019938f, -0.265502f, -0.411395f, -0.490847f, -0.571594f, -0.649046f, -0.690175f, -0.706288f, -0.723736f, -0.737713f, -0.735526f, -0.724667f, -0.712804f, -0.692713f, -0.661167f, -0.626102f, -0.589545f, -0.546090f, -0.498002f, -0.452447f, -0.407806f, -0.359001f, -0.309737f, -0.266056f, -0.225762f, -0.184774f, -0.145070f, -0.108495f, -0.071916f, -0.033988f, 0.002132f, 0.035682f, 0.069246f, 0.102139f, 0.131153f, 0.156988f, 0.182356f, 0.205965f, 0.225206f, 0.241562f, 0.257404f, 0.271324f, 0.281570f, 0.289838f, 0.297808f, 0.304325f, 0.308777f, 0.312991f, 0.318081f, 0.323338f, 0.328814f, 0.335493f, 0.343315f, 0.351924f, 0.361990f, 0.373445f, 0.384675f, 0.395327f, 0.406987f, 0.419758f, 0.431579f, 0.441848f, 0.452193f, 0.463217f, 0.473985f, 0.484732f, 0.496782f, 0.510255f, 0.524670f, 0.540714f, + 0.558946f, 0.578263f, 0.597653f, 0.617532f, 0.637778f, 0.656691f, 0.673126f, 0.687434f, 0.699645f, 0.708958f, 0.715168f, 0.718470f, 0.718323f, 0.714568f, 0.708854f, 0.703133f, 0.697784f, 0.692574f, 0.687835f, 0.683584f, 0.679336f, 0.675668f, 0.674108f, 0.674971f, 0.677066f, 0.679457f, 0.681721f, 0.683072f, 0.683153f, 0.682996f, 0.683558f, 0.684336f, 0.684660f, 0.684936f, 0.685504f, 0.685877f, 0.685935f, 0.686278f, 0.686908f, 0.687209f, 0.687279f, 0.687704f, 0.688320f, 0.688672f, 0.689087f, 0.689985f, 0.691034f, 0.692103f, 0.693870f, 0.696717f, 0.700287f, 0.704592f, 0.710078f, 0.716487f, 0.723147f, 0.730171f, 0.737961f, 0.746101f, 0.754088f, 0.762266f, 0.770876f, 0.779330f, 0.787325f, 0.795322f, 0.803321f, 0.810685f, 0.817438f, 0.824131f, 0.830559f, 0.836142f, 0.841071f, 0.845643f, 0.849388f, 0.852128f, 0.854615f, 0.857157f, 0.859203f, 0.860848f, 0.862840f, 0.864890f, 0.866029f, 0.866351f, 0.866455f, 0.866032f, 0.864930f, 0.864120f, 0.863977f, 0.863628f, 0.863131f, 0.863615f, 0.864728f, 0.865122f, 0.865257f, 0.866254f, 0.867273f, 0.867579f, + 0.868533f, 0.870222f, 0.870634f, 0.870784f, 0.873682f, 0.876733f, 0.875499f, 0.874870f, 0.881460f, 0.887147f, 0.882040f, 0.879821f, 0.897958f, 0.915002f, 0.891682f, 0.839628f, 0.817204f, 0.843673f, 0.874820f, 0.884019f, 0.901906f, 0.940936f, 0.947666f, 0.883159f, 0.797756f, 0.768151f, 0.798253f, 0.832623f, 0.835284f, 0.812421f, 0.787095f, 0.782104f, 0.791333f, 0.748682f, 0.584396f, 0.345257f, 0.192332f, 0.226244f, 0.368019f, 0.468300f, 0.484212f, 0.482396f, 0.505439f, 0.513973f, 0.457796f, 0.345461f, 0.230189f, 0.161014f}, + {-0.073227f, -0.301823f, -0.659487f, -0.955673f, -1.013690f, -0.793634f, -0.374105f, 0.142456f, 0.636566f, 0.963913f, 1.063402f, 1.003613f, 0.793969f, 0.284345f, -0.500040f, -1.037338f, -0.731315f, 0.256929f, 0.976234f, 0.710231f, -0.228481f, -0.963086f, -1.064126f, -0.788617f, -0.498005f, -0.250379f, 0.019938f, 0.265502f, 0.411395f, 0.490847f, 0.571594f, 0.649046f, 0.690175f, 0.706288f, 0.723736f, 0.737713f, 0.735526f, 0.724667f, 0.712804f, 0.692713f, 0.661167f, 0.626102f, 0.589545f, 0.546090f, 0.498002f, 0.452447f, 0.407806f, 0.359001f, 0.309737f, 0.266056f, 0.225762f, 0.184774f, 0.145070f, 0.108495f, 0.071916f, 0.033988f, -0.002132f, -0.035682f, -0.069246f, -0.102139f, -0.131153f, -0.156988f, -0.182356f, -0.205965f, -0.225206f, -0.241562f, -0.257404f, -0.271324f, -0.281570f, -0.289838f, -0.297808f, -0.304325f, -0.308777f, -0.312991f, -0.318081f, -0.323338f, -0.328814f, -0.335493f, -0.343315f, -0.351924f, -0.361990f, -0.373445f, -0.384675f, -0.395327f, -0.406987f, -0.419758f, -0.431579f, -0.441848f, -0.452193f, -0.463217f, -0.473985f, -0.484732f, -0.496782f, -0.510255f, -0.524670f, -0.540714f, + -0.558946f, -0.578263f, -0.597653f, -0.617532f, -0.637778f, -0.656691f, -0.673126f, -0.687434f, -0.699645f, -0.708958f, -0.715168f, -0.718470f, -0.718323f, -0.714568f, -0.708854f, -0.703133f, -0.697784f, -0.692574f, -0.687835f, -0.683584f, -0.679336f, -0.675668f, -0.674108f, -0.674971f, -0.677066f, -0.679457f, -0.681721f, -0.683072f, -0.683153f, -0.682996f, -0.683558f, -0.684336f, -0.684660f, -0.684936f, -0.685504f, -0.685877f, -0.685935f, -0.686278f, -0.686908f, -0.687209f, -0.687279f, -0.687704f, -0.688320f, -0.688672f, -0.689087f, -0.689985f, -0.691034f, -0.692103f, -0.693870f, -0.696717f, -0.700287f, -0.704592f, -0.710078f, -0.716487f, -0.723147f, -0.730171f, -0.737961f, -0.746101f, -0.754088f, -0.762266f, -0.770876f, -0.779330f, -0.787325f, -0.795322f, -0.803321f, -0.810685f, -0.817438f, -0.824131f, -0.830559f, -0.836142f, -0.841071f, -0.845643f, -0.849388f, -0.852128f, -0.854615f, -0.857157f, -0.859203f, -0.860848f, -0.862840f, -0.864890f, -0.866029f, -0.866351f, -0.866455f, -0.866032f, -0.864930f, -0.864120f, -0.863977f, -0.863628f, -0.863131f, -0.863615f, -0.864728f, -0.865122f, -0.865257f, -0.866254f, -0.867273f, -0.867579f, + -0.868533f, -0.870222f, -0.870634f, -0.870784f, -0.873682f, -0.876733f, -0.875499f, -0.874870f, -0.881460f, -0.887147f, -0.882040f, -0.879821f, -0.897958f, -0.915002f, -0.891682f, -0.839628f, -0.817204f, -0.843673f, -0.874820f, -0.884019f, -0.901906f, -0.940936f, -0.947666f, -0.883159f, -0.797756f, -0.768151f, -0.798253f, -0.832623f, -0.835284f, -0.812421f, -0.787095f, -0.782104f, -0.791333f, -0.748682f, -0.584396f, -0.345257f, -0.192332f, -0.226244f, -0.368019f, -0.468300f, -0.484212f, -0.482396f, -0.505439f, -0.513973f, -0.457796f, -0.345461f, -0.230189f, -0.161014f} + }, + { + {0.113201f, 0.111255f, 0.062496f, -0.036435f, -0.115479f, -0.108810f, -0.030648f, 0.049302f, 0.081380f, 0.064091f, 0.017171f, -0.040018f, -0.081158f, -0.072117f, -0.003900f, 0.074532f, 0.085464f, 0.008934f, -0.074247f, -0.059957f, 0.058118f, 0.176907f, 0.199559f, 0.129266f, 0.036145f, -0.031274f, -0.072728f, -0.101353f, -0.120897f, -0.133619f, -0.144152f, -0.151623f, -0.151014f, -0.142713f, -0.132576f, -0.124993f, -0.122480f, -0.128384f, -0.143590f, -0.163192f, -0.181024f, -0.195180f, -0.206462f, -0.214744f, -0.219693f, -0.222384f, -0.223825f, -0.223517f, -0.220501f, -0.214073f, -0.202961f, -0.185599f, -0.161639f, -0.131885f, -0.096760f, -0.056217f, -0.010994f, 0.037427f, 0.088132f, 0.140996f, 0.195587f, 0.250830f, 0.305827f, 0.360100f, 0.412716f, 0.461882f, 0.505735f, 0.543017f, 0.572658f, 0.593353f, 0.604059f, 0.604476f, 0.594671f, 0.574892f, 0.546245f, 0.510837f, 0.470526f, 0.426227f, 0.379201f, 0.332145f, 0.287708f, 0.246390f, 0.207286f, 0.170835f, 0.139340f, 0.114215f, 0.093949f, 0.075976f, 0.060036f, 0.048360f, 0.042554f, 0.041557f, 0.043175f, 0.046486f, 0.051934f, 0.059907f, + 0.070097f, 0.081683f, 0.093339f, 0.103485f, 0.111132f, 0.116280f, 0.119264f, 0.120059f, 0.118158f, 0.112647f, 0.102730f, 0.088852f, 0.072929f, 0.056776f, 0.040720f, 0.024308f, 0.007601f, -0.008889f, -0.024661f, -0.038942f, -0.050666f, -0.059218f, -0.064521f, -0.066366f, -0.064544f, -0.059537f, -0.052086f, -0.042363f, -0.030480f, -0.017295f, -0.003822f, 0.009499f, 0.022278f, 0.033878f, 0.044118f, 0.053185f, 0.060622f, 0.065726f, 0.068967f, 0.071661f, 0.074575f, 0.078214f, 0.083614f, 0.091159f, 0.099538f, 0.107386f, 0.114815f, 0.122154f, 0.128784f, 0.134356f, 0.139373f, 0.143742f, 0.146631f, 0.148142f, 0.149165f, 0.149684f, 0.149308f, 0.148792f, 0.148973f, 0.149269f, 0.149092f, 0.149111f, 0.149527f, 0.149268f, 0.148148f, 0.147256f, 0.146477f, 0.144536f, 0.141617f, 0.138828f, 0.135709f, 0.131550f, 0.127734f, 0.125499f, 0.123615f, 0.121214f, 0.119758f, 0.119680f, 0.119076f, 0.117474f, 0.116107f, 0.113750f, 0.107932f, 0.099801f, 0.091667f, 0.081824f, 0.068369f, 0.054219f, 0.041640f, 0.027646f, 0.011112f, -0.003667f, -0.015819f, -0.029675f, -0.044315f, -0.054790f, + -0.064326f, -0.078448f, -0.090599f, -0.094677f, -0.102373f, -0.121236f, -0.132668f, -0.126597f, -0.131229f, -0.161295f, -0.174763f, -0.147871f, -0.146506f, -0.225759f, -0.299779f, -0.239299f, -0.079199f, 0.013784f, -0.018892f, -0.072010f, -0.080447f, -0.112933f, -0.204539f, -0.250865f, -0.164556f, -0.022383f, 0.043514f, 0.019856f, -0.010446f, -0.004334f, 0.005958f, -0.023233f, -0.099252f, -0.180595f, -0.191231f, -0.093061f, 0.041294f, 0.085841f, 0.010948f, -0.083414f, -0.105347f, -0.076840f, -0.067493f, -0.084603f, -0.084004f, -0.051805f, -0.017571f, -0.002347f}, + {0.113201f, 0.111255f, 0.062496f, -0.036435f, -0.115479f, -0.108810f, -0.030648f, 0.049302f, 0.081380f, 0.064091f, 0.017171f, -0.040018f, -0.081158f, -0.072117f, -0.003900f, 0.074532f, 0.085464f, 0.008934f, -0.074247f, -0.059957f, 0.058118f, 0.176907f, 0.199559f, 0.129266f, 0.036145f, -0.031274f, -0.072728f, -0.101353f, -0.120897f, -0.133619f, -0.144152f, -0.151623f, -0.151014f, -0.142713f, -0.132576f, -0.124993f, -0.122480f, -0.128384f, -0.143590f, -0.163192f, -0.181024f, -0.195180f, -0.206462f, -0.214744f, -0.219693f, -0.222384f, -0.223825f, -0.223517f, -0.220501f, -0.214073f, -0.202961f, -0.185599f, -0.161639f, -0.131885f, -0.096760f, -0.056217f, -0.010994f, 0.037427f, 0.088132f, 0.140996f, 0.195587f, 0.250830f, 0.305827f, 0.360100f, 0.412716f, 0.461882f, 0.505735f, 0.543017f, 0.572658f, 0.593353f, 0.604059f, 0.604476f, 0.594671f, 0.574892f, 0.546245f, 0.510837f, 0.470526f, 0.426227f, 0.379201f, 0.332145f, 0.287708f, 0.246390f, 0.207286f, 0.170835f, 0.139340f, 0.114215f, 0.093949f, 0.075976f, 0.060036f, 0.048360f, 0.042554f, 0.041557f, 0.043175f, 0.046486f, 0.051934f, 0.059907f, + 0.070097f, 0.081683f, 0.093339f, 0.103485f, 0.111132f, 0.116280f, 0.119264f, 0.120059f, 0.118158f, 0.112647f, 0.102730f, 0.088852f, 0.072929f, 0.056776f, 0.040720f, 0.024308f, 0.007601f, -0.008889f, -0.024661f, -0.038942f, -0.050666f, -0.059218f, -0.064521f, -0.066366f, -0.064544f, -0.059537f, -0.052086f, -0.042363f, -0.030480f, -0.017295f, -0.003822f, 0.009499f, 0.022278f, 0.033878f, 0.044118f, 0.053185f, 0.060622f, 0.065726f, 0.068967f, 0.071661f, 0.074575f, 0.078214f, 0.083614f, 0.091159f, 0.099538f, 0.107386f, 0.114815f, 0.122154f, 0.128784f, 0.134356f, 0.139373f, 0.143742f, 0.146631f, 0.148142f, 0.149165f, 0.149684f, 0.149308f, 0.148792f, 0.148973f, 0.149269f, 0.149092f, 0.149111f, 0.149527f, 0.149268f, 0.148148f, 0.147256f, 0.146477f, 0.144536f, 0.141617f, 0.138828f, 0.135709f, 0.131550f, 0.127734f, 0.125499f, 0.123615f, 0.121214f, 0.119758f, 0.119680f, 0.119076f, 0.117474f, 0.116107f, 0.113750f, 0.107932f, 0.099801f, 0.091667f, 0.081824f, 0.068369f, 0.054219f, 0.041640f, 0.027646f, 0.011112f, -0.003667f, -0.015819f, -0.029675f, -0.044315f, -0.054790f, + -0.064326f, -0.078448f, -0.090599f, -0.094677f, -0.102373f, -0.121236f, -0.132668f, -0.126597f, -0.131229f, -0.161295f, -0.174763f, -0.147871f, -0.146506f, -0.225759f, -0.299779f, -0.239299f, -0.079199f, 0.013784f, -0.018892f, -0.072010f, -0.080447f, -0.112933f, -0.204539f, -0.250865f, -0.164556f, -0.022383f, 0.043514f, 0.019856f, -0.010446f, -0.004334f, 0.005958f, -0.023233f, -0.099252f, -0.180595f, -0.191231f, -0.093061f, 0.041294f, 0.085841f, 0.010948f, -0.083414f, -0.105347f, -0.076840f, -0.067493f, -0.084603f, -0.084004f, -0.051805f, -0.017571f, -0.002347f} + }, + { + {0.054055f, 0.080144f, 0.095193f, 0.063102f, -0.005644f, -0.052793f, -0.033146f, 0.026919f, 0.054914f, 0.016920f, -0.052950f, -0.110724f, -0.143661f, -0.134100f, -0.045681f, 0.095928f, 0.160690f, 0.047402f, -0.151768f, -0.216602f, -0.050846f, 0.209112f, 0.366520f, 0.368777f, 0.294144f, 0.206763f, 0.103814f, -0.023703f, -0.154443f, -0.267781f, -0.365935f, -0.454372f, -0.526514f, -0.574683f, -0.599022f, -0.601726f, -0.583803f, -0.549027f, -0.503573f, -0.451857f, -0.396930f, -0.342314f, -0.289887f, -0.238831f, -0.188998f, -0.142181f, -0.098840f, -0.057157f, -0.016442f, 0.021589f, 0.055280f, 0.083963f, 0.106624f, 0.122561f, 0.133456f, 0.142639f, 0.152376f, 0.163270f, 0.175500f, 0.188983f, 0.202812f, 0.215870f, 0.227814f, 0.238821f, 0.248889f, 0.258049f, 0.266875f, 0.276085f, 0.285672f, 0.294836f, 0.302892f, 0.309831f, 0.315582f, 0.319103f, 0.319043f, 0.315165f, 0.308042f, 0.297413f, 0.282312f, 0.263067f, 0.241504f, 0.218613f, 0.193711f, 0.166772f, 0.139868f, 0.115038f, 0.092093f, 0.069831f, 0.048202f, 0.027768f, 0.007904f, -0.012801f, -0.034642f, -0.056589f, -0.077960f, -0.099200f, + -0.120729f, -0.141741f, -0.160599f, -0.176129f, -0.188274f, -0.197469f, -0.203521f, -0.205315f, -0.201874f, -0.193589f, -0.181986f, -0.168217f, -0.152170f, -0.133210f, -0.111470f, -0.088281f, -0.065547f, -0.044626f, -0.025388f, -0.006381f, 0.013678f, 0.034496f, 0.054455f, 0.072021f, 0.086678f, 0.098972f, 0.110224f, 0.121865f, 0.134429f, 0.147294f, 0.159646f, 0.171334f, 0.182686f, 0.194160f, 0.206441f, 0.220224f, 0.235532f, 0.251719f, 0.268159f, 0.284460f, 0.300193f, 0.315099f, 0.329380f, 0.343193f, 0.356104f, 0.367475f, 0.376942f, 0.384199f, 0.388905f, 0.391168f, 0.391540f, 0.390411f, 0.388001f, 0.384777f, 0.381131f, 0.376983f, 0.372381f, 0.367930f, 0.364049f, 0.360653f, 0.358088f, 0.357239f, 0.358255f, 0.360393f, 0.363365f, 0.367396f, 0.371992f, 0.376223f, 0.380072f, 0.384061f, 0.388180f, 0.392520f, 0.397869f, 0.404370f, 0.411044f, 0.417566f, 0.424627f, 0.431988f, 0.438611f, 0.444798f, 0.451419f, 0.457489f, 0.461517f, 0.464027f, 0.465670f, 0.465002f, 0.461321f, 0.456568f, 0.451550f, 0.444528f, 0.435774f, 0.428002f, 0.420951f, 0.412298f, 0.403657f, 0.397481f, + 0.390665f, 0.381040f, 0.374155f, 0.371854f, 0.364940f, 0.351783f, 0.346842f, 0.351883f, 0.344736f, 0.322593f, 0.319327f, 0.340524f, 0.329255f, 0.258906f, 0.211144f, 0.273202f, 0.394219f, 0.448480f, 0.417577f, 0.391001f, 0.396218f, 0.365475f, 0.291216f, 0.274724f, 0.365856f, 0.472436f, 0.497448f, 0.469302f, 0.464924f, 0.487653f, 0.496252f, 0.484901f, 0.459066f, 0.391143f, 0.277817f, 0.195678f, 0.219900f, 0.314264f, 0.374360f, 0.364906f, 0.345945f, 0.365513f, 0.393896f, 0.386513f, 0.362639f, 0.381476f, 0.456585f, 0.528305f}, + {0.054055f, 0.080144f, 0.095193f, 0.063102f, -0.005644f, -0.052793f, -0.033146f, 0.026919f, 0.054914f, 0.016920f, -0.052950f, -0.110724f, -0.143661f, -0.134100f, -0.045681f, 0.095928f, 0.160690f, 0.047402f, -0.151768f, -0.216602f, -0.050846f, 0.209112f, 0.366520f, 0.368777f, 0.294144f, 0.206763f, 0.103814f, -0.023703f, -0.154443f, -0.267781f, -0.365935f, -0.454372f, -0.526514f, -0.574683f, -0.599022f, -0.601726f, -0.583803f, -0.549027f, -0.503573f, -0.451857f, -0.396930f, -0.342314f, -0.289887f, -0.238831f, -0.188998f, -0.142181f, -0.098840f, -0.057157f, -0.016442f, 0.021589f, 0.055280f, 0.083963f, 0.106624f, 0.122561f, 0.133456f, 0.142639f, 0.152376f, 0.163270f, 0.175500f, 0.188983f, 0.202812f, 0.215870f, 0.227814f, 0.238821f, 0.248889f, 0.258049f, 0.266875f, 0.276085f, 0.285672f, 0.294836f, 0.302892f, 0.309831f, 0.315582f, 0.319103f, 0.319043f, 0.315165f, 0.308042f, 0.297413f, 0.282312f, 0.263067f, 0.241504f, 0.218613f, 0.193711f, 0.166772f, 0.139868f, 0.115038f, 0.092093f, 0.069831f, 0.048202f, 0.027768f, 0.007904f, -0.012801f, -0.034642f, -0.056589f, -0.077960f, -0.099200f, + -0.120729f, -0.141741f, -0.160599f, -0.176129f, -0.188274f, -0.197469f, -0.203521f, -0.205315f, -0.201874f, -0.193589f, -0.181986f, -0.168217f, -0.152170f, -0.133210f, -0.111470f, -0.088281f, -0.065547f, -0.044626f, -0.025388f, -0.006381f, 0.013678f, 0.034496f, 0.054455f, 0.072021f, 0.086678f, 0.098972f, 0.110224f, 0.121865f, 0.134429f, 0.147294f, 0.159646f, 0.171334f, 0.182686f, 0.194160f, 0.206441f, 0.220224f, 0.235532f, 0.251719f, 0.268159f, 0.284460f, 0.300193f, 0.315099f, 0.329380f, 0.343193f, 0.356104f, 0.367475f, 0.376942f, 0.384199f, 0.388905f, 0.391168f, 0.391540f, 0.390411f, 0.388001f, 0.384777f, 0.381131f, 0.376983f, 0.372381f, 0.367930f, 0.364049f, 0.360653f, 0.358088f, 0.357239f, 0.358255f, 0.360393f, 0.363365f, 0.367396f, 0.371992f, 0.376223f, 0.380072f, 0.384061f, 0.388180f, 0.392520f, 0.397869f, 0.404370f, 0.411044f, 0.417566f, 0.424627f, 0.431988f, 0.438611f, 0.444798f, 0.451419f, 0.457489f, 0.461517f, 0.464027f, 0.465670f, 0.465002f, 0.461321f, 0.456568f, 0.451550f, 0.444528f, 0.435774f, 0.428002f, 0.420951f, 0.412298f, 0.403657f, 0.397481f, + 0.390665f, 0.381040f, 0.374155f, 0.371854f, 0.364940f, 0.351783f, 0.346842f, 0.351883f, 0.344736f, 0.322593f, 0.319327f, 0.340524f, 0.329255f, 0.258906f, 0.211144f, 0.273202f, 0.394219f, 0.448480f, 0.417577f, 0.391001f, 0.396218f, 0.365475f, 0.291216f, 0.274724f, 0.365856f, 0.472436f, 0.497448f, 0.469302f, 0.464924f, 0.487653f, 0.496252f, 0.484901f, 0.459066f, 0.391143f, 0.277817f, 0.195678f, 0.219900f, 0.314264f, 0.374360f, 0.364906f, 0.345945f, 0.365513f, 0.393896f, 0.386513f, 0.362639f, 0.381476f, 0.456585f, 0.528305f} + }, + { + {0.017978f, 0.007378f, 0.003418f, 0.018456f, 0.041119f, 0.049699f, 0.045284f, 0.053666f, 0.084664f, 0.105401f, 0.067063f, -0.046619f, -0.190974f, -0.265169f, -0.173793f, 0.058765f, 0.244978f, 0.189686f, -0.078447f, -0.301201f, -0.263931f, -0.016751f, 0.224527f, 0.329934f, 0.329708f, 0.288913f, 0.216901f, 0.107803f, -0.012593f, -0.114794f, -0.198221f, -0.272534f, -0.334167f, -0.377176f, -0.406071f, -0.424824f, -0.427385f, -0.407924f, -0.370647f, -0.324637f, -0.276593f, -0.230996f, -0.190824f, -0.155968f, -0.124589f, -0.095978f, -0.069693f, -0.043868f, -0.017228f, 0.008963f, 0.032944f, 0.054527f, 0.073798f, 0.090002f, 0.103058f, 0.114400f, 0.125425f, 0.136553f, 0.148113f, 0.160641f, 0.174135f, 0.188230f, 0.203013f, 0.218608f, 0.234347f, 0.249425f, 0.264041f, 0.278849f, 0.293615f, 0.307424f, 0.320009f, 0.331840f, 0.342789f, 0.351655f, 0.357399f, 0.360118f, 0.360077f, 0.356398f, 0.347903f, 0.335144f, 0.320169f, 0.303908f, 0.285237f, 0.263508f, 0.240490f, 0.218250f, 0.196115f, 0.171654f, 0.144348f, 0.116453f, 0.090117f, 0.065280f, 0.040995f, 0.017579f, -0.003437f, -0.020932f, + -0.035118f, -0.047019f, -0.057328f, -0.065776f, -0.071630f, -0.074772f, -0.075997f, -0.076290f, -0.076370f, -0.076995f, -0.078917f, -0.082069f, -0.085393f, -0.087934f, -0.089781f, -0.091750f, -0.094623f, -0.098708f, -0.103476f, -0.107500f, -0.109441f, -0.109318f, -0.108409f, -0.108026f, -0.108758f, -0.110515f, -0.112612f, -0.114027f, -0.114146f, -0.113106f, -0.111149f, -0.108063f, -0.103456f, -0.097000f, -0.088276f, -0.077056f, -0.063885f, -0.049838f, -0.035764f, -0.022273f, -0.010091f, 0.000305f, 0.008995f, 0.015941f, 0.020499f, 0.022137f, 0.021019f, 0.017496f, 0.011856f, 0.004888f, -0.002191f, -0.008658f, -0.014359f, -0.019010f, -0.022276f, -0.024240f, -0.024935f, -0.023872f, -0.020695f, -0.015538f, -0.008189f, 0.002002f, 0.014912f, 0.029556f, 0.045382f, 0.062300f, 0.079546f, 0.096100f, 0.111896f, 0.127148f, 0.141252f, 0.153795f, 0.165494f, 0.176815f, 0.187180f, 0.196581f, 0.206032f, 0.215728f, 0.224988f, 0.234090f, 0.243604f, 0.252464f, 0.259543f, 0.265839f, 0.272231f, 0.277374f, 0.280682f, 0.284095f, 0.288228f, 0.291051f, 0.292390f, 0.294354f, 0.296334f, 0.296199f, 0.295740f, 0.297143f, + 0.297187f, 0.294165f, 0.293865f, 0.297697f, 0.296410f, 0.289007f, 0.289718f, 0.298972f, 0.294490f, 0.274911f, 0.273741f, 0.293559f, 0.276485f, 0.199476f, 0.147802f, 0.208854f, 0.331440f, 0.389914f, 0.361504f, 0.329091f, 0.323542f, 0.290902f, 0.227246f, 0.217065f, 0.296479f, 0.385838f, 0.408311f, 0.387215f, 0.378506f, 0.385103f, 0.382955f, 0.362880f, 0.310127f, 0.213082f, 0.126049f, 0.145716f, 0.279676f, 0.409157f, 0.433671f, 0.389293f, 0.369545f, 0.390925f, 0.404683f, 0.394197f, 0.383439f, 0.373704f, 0.344838f, 0.310855f}, + {-0.017978f, -0.007378f, -0.003418f, -0.018456f, -0.041119f, -0.049699f, -0.045284f, -0.053666f, -0.084664f, -0.105401f, -0.067063f, 0.046619f, 0.190974f, 0.265169f, 0.173793f, -0.058765f, -0.244978f, -0.189686f, 0.078447f, 0.301201f, 0.263931f, 0.016751f, -0.224527f, -0.329934f, -0.329708f, -0.288913f, -0.216901f, -0.107803f, 0.012593f, 0.114794f, 0.198221f, 0.272534f, 0.334167f, 0.377176f, 0.406071f, 0.424824f, 0.427385f, 0.407924f, 0.370647f, 0.324637f, 0.276593f, 0.230996f, 0.190824f, 0.155968f, 0.124589f, 0.095978f, 0.069693f, 0.043868f, 0.017228f, -0.008963f, -0.032944f, -0.054527f, -0.073798f, -0.090002f, -0.103058f, -0.114400f, -0.125425f, -0.136553f, -0.148113f, -0.160641f, -0.174135f, -0.188230f, -0.203013f, -0.218608f, -0.234347f, -0.249425f, -0.264041f, -0.278849f, -0.293615f, -0.307424f, -0.320009f, -0.331840f, -0.342789f, -0.351655f, -0.357399f, -0.360118f, -0.360077f, -0.356398f, -0.347903f, -0.335144f, -0.320169f, -0.303908f, -0.285237f, -0.263508f, -0.240490f, -0.218250f, -0.196115f, -0.171654f, -0.144348f, -0.116453f, -0.090117f, -0.065280f, -0.040995f, -0.017579f, 0.003437f, 0.020932f, + 0.035118f, 0.047019f, 0.057328f, 0.065776f, 0.071630f, 0.074772f, 0.075997f, 0.076290f, 0.076370f, 0.076995f, 0.078917f, 0.082069f, 0.085393f, 0.087934f, 0.089781f, 0.091750f, 0.094623f, 0.098708f, 0.103476f, 0.107500f, 0.109441f, 0.109318f, 0.108409f, 0.108026f, 0.108758f, 0.110515f, 0.112612f, 0.114027f, 0.114146f, 0.113106f, 0.111149f, 0.108063f, 0.103456f, 0.097000f, 0.088276f, 0.077056f, 0.063885f, 0.049838f, 0.035764f, 0.022273f, 0.010091f, -0.000305f, -0.008995f, -0.015941f, -0.020499f, -0.022137f, -0.021019f, -0.017496f, -0.011856f, -0.004888f, 0.002191f, 0.008658f, 0.014359f, 0.019010f, 0.022276f, 0.024240f, 0.024935f, 0.023872f, 0.020695f, 0.015538f, 0.008189f, -0.002002f, -0.014912f, -0.029556f, -0.045382f, -0.062300f, -0.079546f, -0.096100f, -0.111896f, -0.127148f, -0.141252f, -0.153795f, -0.165494f, -0.176815f, -0.187180f, -0.196581f, -0.206032f, -0.215728f, -0.224988f, -0.234090f, -0.243604f, -0.252464f, -0.259543f, -0.265839f, -0.272231f, -0.277374f, -0.280682f, -0.284095f, -0.288228f, -0.291051f, -0.292390f, -0.294354f, -0.296334f, -0.296199f, -0.295740f, -0.297143f, + -0.297187f, -0.294165f, -0.293865f, -0.297697f, -0.296410f, -0.289007f, -0.289718f, -0.298972f, -0.294490f, -0.274911f, -0.273741f, -0.293559f, -0.276485f, -0.199476f, -0.147802f, -0.208854f, -0.331440f, -0.389914f, -0.361504f, -0.329091f, -0.323542f, -0.290902f, -0.227246f, -0.217065f, -0.296479f, -0.385838f, -0.408311f, -0.387215f, -0.378506f, -0.385103f, -0.382955f, -0.362880f, -0.310127f, -0.213082f, -0.126049f, -0.145716f, -0.279676f, -0.409157f, -0.433671f, -0.389293f, -0.369545f, -0.390925f, -0.404683f, -0.394197f, -0.383439f, -0.373704f, -0.344838f, -0.310855f} + }, + { + {0.027544f, -0.017341f, -0.023513f, 0.026515f, 0.039947f, -0.034516f, -0.096596f, -0.020772f, 0.151935f, 0.242778f, 0.149801f, -0.044033f, -0.181114f, -0.177468f, -0.055862f, 0.090745f, 0.145910f, 0.053909f, -0.102523f, -0.163455f, -0.067881f, 0.078061f, 0.138424f, 0.098143f, 0.036791f, 0.006996f, 0.000119f, 0.002369f, 0.021565f, 0.059784f, 0.101198f, 0.132385f, 0.151843f, 0.159909f, 0.156211f, 0.145023f, 0.130647f, 0.110287f, 0.079835f, 0.042474f, 0.005390f, -0.027255f, -0.053608f, -0.071675f, -0.081807f, -0.087931f, -0.093657f, -0.099808f, -0.106220f, -0.112687f, -0.117932f, -0.120493f, -0.120521f, -0.118539f, -0.113168f, -0.102044f, -0.084258f, -0.060368f, -0.030901f, 0.003748f, 0.042511f, 0.083811f, 0.126393f, 0.169523f, 0.212498f, 0.254135f, 0.292796f, 0.326898f, 0.355155f, 0.376131f, 0.388053f, 0.389497f, 0.379942f, 0.359534f, 0.328997f, 0.289934f, 0.244331f, 0.193634f, 0.139228f, 0.083598f, 0.029408f, -0.022692f, -0.073695f, -0.123339f, -0.169305f, -0.209948f, -0.246184f, -0.279689f, -0.310546f, -0.337815f, -0.361405f, -0.381914f, -0.399020f, -0.411385f, -0.418144f, -0.419390f, + -0.415008f, -0.404128f, -0.386279f, -0.362312f, -0.333530f, -0.300394f, -0.262664f, -0.220761f, -0.176830f, -0.134417f, -0.096541f, -0.063537f, -0.033190f, -0.003613f, 0.024357f, 0.048059f, 0.065620f, 0.077181f, 0.084404f, 0.089492f, 0.093981f, 0.097804f, 0.099996f, 0.100408f, 0.100059f, 0.100044f, 0.101037f, 0.103570f, 0.107641f, 0.112334f, 0.116752f, 0.120810f, 0.124401f, 0.126672f, 0.126908f, 0.125168f, 0.121503f, 0.115724f, 0.108269f, 0.100065f, 0.091446f, 0.082435f, 0.073719f, 0.065954f, 0.058708f, 0.051452f, 0.044644f, 0.038636f, 0.032761f, 0.026588f, 0.020600f, 0.014885f, 0.008899f, 0.002909f, -0.002242f, -0.006808f, -0.011545f, -0.016005f, -0.019451f, -0.022427f, -0.025359f, -0.027161f, -0.027123f, -0.026184f, -0.024787f, -0.022001f, -0.017911f, -0.013971f, -0.010312f, -0.005846f, -0.000945f, 0.003364f, 0.007981f, 0.014043f, 0.020341f, 0.025721f, 0.031421f, 0.038054f, 0.043780f, 0.047857f, 0.051586f, 0.054231f, 0.053369f, 0.049784f, 0.045976f, 0.040764f, 0.032016f, 0.022151f, 0.013836f, 0.004597f, -0.007321f, -0.018275f, -0.026778f, -0.036758f, -0.048211f, -0.056341f, + -0.062971f, -0.073642f, -0.083668f, -0.086428f, -0.090734f, -0.105031f, -0.114994f, -0.109424f, -0.110454f, -0.134392f, -0.148541f, -0.127696f, -0.121882f, -0.181720f, -0.241824f, -0.189799f, -0.046739f, 0.042939f, 0.016342f, -0.039119f, -0.052732f, -0.073996f, -0.147151f, -0.199696f, -0.145744f, -0.023298f, 0.056543f, 0.050437f, 0.006574f, -0.021832f, -0.037988f, -0.088616f, -0.203471f, -0.330990f, -0.353783f, -0.218264f, -0.032140f, 0.036633f, -0.044084f, -0.147160f, -0.163258f, -0.121115f, -0.105238f, -0.129326f, -0.144788f, -0.128572f, -0.103746f, -0.091528f}, + {-0.027544f, 0.017341f, 0.023513f, -0.026515f, -0.039947f, 0.034516f, 0.096596f, 0.020772f, -0.151935f, -0.242778f, -0.149801f, 0.044033f, 0.181114f, 0.177468f, 0.055862f, -0.090745f, -0.145910f, -0.053909f, 0.102523f, 0.163455f, 0.067881f, -0.078061f, -0.138424f, -0.098143f, -0.036791f, -0.006996f, -0.000119f, -0.002369f, -0.021565f, -0.059784f, -0.101198f, -0.132385f, -0.151843f, -0.159909f, -0.156211f, -0.145023f, -0.130647f, -0.110287f, -0.079835f, -0.042474f, -0.005390f, 0.027255f, 0.053608f, 0.071675f, 0.081807f, 0.087931f, 0.093657f, 0.099808f, 0.106220f, 0.112687f, 0.117932f, 0.120493f, 0.120521f, 0.118539f, 0.113168f, 0.102044f, 0.084258f, 0.060368f, 0.030901f, -0.003748f, -0.042511f, -0.083811f, -0.126393f, -0.169523f, -0.212498f, -0.254135f, -0.292796f, -0.326898f, -0.355155f, -0.376131f, -0.388053f, -0.389497f, -0.379942f, -0.359534f, -0.328997f, -0.289934f, -0.244331f, -0.193634f, -0.139228f, -0.083598f, -0.029408f, 0.022692f, 0.073695f, 0.123339f, 0.169305f, 0.209948f, 0.246184f, 0.279689f, 0.310546f, 0.337815f, 0.361405f, 0.381914f, 0.399020f, 0.411385f, 0.418144f, 0.419390f, + 0.415008f, 0.404128f, 0.386279f, 0.362312f, 0.333530f, 0.300394f, 0.262664f, 0.220761f, 0.176830f, 0.134417f, 0.096541f, 0.063537f, 0.033190f, 0.003613f, -0.024357f, -0.048059f, -0.065620f, -0.077181f, -0.084404f, -0.089492f, -0.093981f, -0.097804f, -0.099996f, -0.100408f, -0.100059f, -0.100044f, -0.101037f, -0.103570f, -0.107641f, -0.112334f, -0.116752f, -0.120810f, -0.124401f, -0.126672f, -0.126908f, -0.125168f, -0.121503f, -0.115724f, -0.108269f, -0.100065f, -0.091446f, -0.082435f, -0.073719f, -0.065954f, -0.058708f, -0.051452f, -0.044644f, -0.038636f, -0.032761f, -0.026588f, -0.020600f, -0.014885f, -0.008899f, -0.002909f, 0.002242f, 0.006808f, 0.011545f, 0.016005f, 0.019451f, 0.022427f, 0.025359f, 0.027161f, 0.027123f, 0.026184f, 0.024787f, 0.022001f, 0.017911f, 0.013971f, 0.010312f, 0.005846f, 0.000945f, -0.003364f, -0.007981f, -0.014043f, -0.020341f, -0.025721f, -0.031421f, -0.038054f, -0.043780f, -0.047857f, -0.051586f, -0.054231f, -0.053369f, -0.049784f, -0.045976f, -0.040764f, -0.032016f, -0.022151f, -0.013836f, -0.004597f, 0.007321f, 0.018275f, 0.026778f, 0.036758f, 0.048211f, 0.056341f, + 0.062971f, 0.073642f, 0.083668f, 0.086428f, 0.090734f, 0.105031f, 0.114994f, 0.109424f, 0.110454f, 0.134392f, 0.148541f, 0.127696f, 0.121882f, 0.181720f, 0.241824f, 0.189799f, 0.046739f, -0.042939f, -0.016342f, 0.039119f, 0.052732f, 0.073996f, 0.147151f, 0.199696f, 0.145744f, 0.023298f, -0.056543f, -0.050437f, -0.006574f, 0.021832f, 0.037988f, 0.088616f, 0.203471f, 0.330990f, 0.353783f, 0.218264f, 0.032140f, -0.036633f, 0.044084f, 0.147160f, 0.163258f, 0.121115f, 0.105238f, 0.129326f, 0.144788f, 0.128572f, 0.103746f, 0.091528f} + }, + { + {-0.011223f, 0.003687f, -0.000414f, -0.031357f, -0.057663f, -0.067766f, -0.096325f, -0.163726f, -0.224966f, -0.208955f, -0.081157f, 0.143478f, 0.387596f, 0.486520f, 0.284836f, -0.140976f, -0.441017f, -0.327075f, 0.074175f, 0.349898f, 0.280575f, 0.038443f, -0.108886f, -0.113839f, -0.086300f, -0.070325f, -0.024649f, 0.049306f, 0.092524f, 0.083781f, 0.061156f, 0.054148f, 0.055920f, 0.058263f, 0.066644f, 0.080523f, 0.090464f, 0.094364f, 0.097422f, 0.100540f, 0.101437f, 0.100572f, 0.097579f, 0.089393f, 0.076799f, 0.064921f, 0.054954f, 0.043366f, 0.029470f, 0.015923f, 0.002488f, -0.013502f, -0.031896f, -0.050733f, -0.070213f, -0.091008f, -0.111378f, -0.129544f, -0.145955f, -0.160863f, -0.172868f, -0.181246f, -0.186438f, -0.187665f, -0.183178f, -0.172712f, -0.156892f, -0.135107f, -0.106648f, -0.072711f, -0.034981f, 0.006334f, 0.051208f, 0.098168f, 0.145386f, 0.191890f, 0.236833f, 0.278964f, 0.317170f, 0.350442f, 0.377669f, 0.398477f, 0.413442f, 0.422594f, 0.424961f, 0.420296f, 0.409675f, 0.393798f, 0.372388f, 0.345493f, 0.313465f, 0.275611f, 0.231027f, 0.180958f, 0.128479f, 0.075813f, + 0.023515f, -0.027844f, -0.076427f, -0.119258f, -0.152932f, -0.175194f, -0.186637f, -0.189934f, -0.186882f, -0.177217f, -0.160537f, -0.138059f, -0.112219f, -0.085735f, -0.061204f, -0.040465f, -0.024039f, -0.011686f, -0.003299f, 0.001080f, 0.001404f, -0.002708f, -0.011712f, -0.025056f, -0.041001f, -0.057813f, -0.074544f, -0.090766f, -0.106414f, -0.121885f, -0.137514f, -0.153038f, -0.168182f, -0.183440f, -0.199575f, -0.216690f, -0.234361f, -0.252307f, -0.270421f, -0.288580f, -0.306905f, -0.325883f, -0.345856f, -0.366553f, -0.387191f, -0.406764f, -0.424298f, -0.439192f, -0.451304f, -0.460581f, -0.466844f, -0.470145f, -0.470993f, -0.469950f, -0.467318f, -0.463413f, -0.458793f, -0.453934f, -0.448965f, -0.443919f, -0.438978f, -0.434313f, -0.429938f, -0.425843f, -0.422067f, -0.418527f, -0.414975f, -0.411168f, -0.406936f, -0.402186f, -0.397105f, -0.392257f, -0.388096f, -0.384459f, -0.380881f, -0.377213f, -0.373462f, -0.369262f, -0.364132f, -0.358049f, -0.351167f, -0.343304f, -0.334329f, -0.324576f, -0.314218f, -0.302915f, -0.290682f, -0.278196f, -0.265680f, -0.252744f, -0.239783f, -0.227924f, -0.217230f, -0.206891f, -0.197140f, -0.188670f, + -0.180713f, -0.172459f, -0.165010f, -0.158739f, -0.151375f, -0.142611f, -0.136204f, -0.132665f, -0.126667f, -0.118002f, -0.114967f, -0.118021f, -0.114254f, -0.101693f, -0.101321f, -0.124560f, -0.148010f, -0.147590f, -0.137378f, -0.139760f, -0.138747f, -0.110154f, -0.081767f, -0.105233f, -0.171870f, -0.215991f, -0.207009f, -0.181245f, -0.174445f, -0.180343f, -0.186444f, -0.191819f, -0.178097f, -0.127153f, -0.082373f, -0.120177f, -0.235388f, -0.328199f, -0.337442f, -0.311065f, -0.306275f, -0.305983f, -0.290025f, -0.296380f, -0.327277f, -0.281376f, -0.097597f, 0.092327f}, + {-0.011223f, 0.003687f, -0.000414f, -0.031357f, -0.057663f, -0.067766f, -0.096325f, -0.163726f, -0.224966f, -0.208955f, -0.081157f, 0.143478f, 0.387596f, 0.486520f, 0.284836f, -0.140976f, -0.441017f, -0.327075f, 0.074175f, 0.349898f, 0.280575f, 0.038443f, -0.108886f, -0.113839f, -0.086300f, -0.070325f, -0.024649f, 0.049306f, 0.092524f, 0.083781f, 0.061156f, 0.054148f, 0.055920f, 0.058263f, 0.066644f, 0.080523f, 0.090464f, 0.094364f, 0.097422f, 0.100540f, 0.101437f, 0.100572f, 0.097579f, 0.089393f, 0.076799f, 0.064921f, 0.054954f, 0.043366f, 0.029470f, 0.015923f, 0.002488f, -0.013502f, -0.031896f, -0.050733f, -0.070213f, -0.091008f, -0.111378f, -0.129544f, -0.145955f, -0.160863f, -0.172868f, -0.181246f, -0.186438f, -0.187665f, -0.183178f, -0.172712f, -0.156892f, -0.135107f, -0.106648f, -0.072711f, -0.034981f, 0.006334f, 0.051208f, 0.098168f, 0.145386f, 0.191890f, 0.236833f, 0.278964f, 0.317170f, 0.350442f, 0.377669f, 0.398477f, 0.413442f, 0.422594f, 0.424961f, 0.420296f, 0.409675f, 0.393798f, 0.372388f, 0.345493f, 0.313465f, 0.275611f, 0.231027f, 0.180958f, 0.128479f, 0.075813f, + 0.023515f, -0.027844f, -0.076427f, -0.119258f, -0.152932f, -0.175194f, -0.186637f, -0.189934f, -0.186882f, -0.177217f, -0.160537f, -0.138059f, -0.112219f, -0.085735f, -0.061204f, -0.040465f, -0.024039f, -0.011686f, -0.003299f, 0.001080f, 0.001404f, -0.002708f, -0.011712f, -0.025056f, -0.041001f, -0.057813f, -0.074544f, -0.090766f, -0.106414f, -0.121885f, -0.137514f, -0.153038f, -0.168182f, -0.183440f, -0.199575f, -0.216690f, -0.234361f, -0.252307f, -0.270421f, -0.288580f, -0.306905f, -0.325883f, -0.345856f, -0.366553f, -0.387191f, -0.406764f, -0.424298f, -0.439192f, -0.451304f, -0.460581f, -0.466844f, -0.470145f, -0.470993f, -0.469950f, -0.467318f, -0.463413f, -0.458793f, -0.453934f, -0.448965f, -0.443919f, -0.438978f, -0.434313f, -0.429938f, -0.425843f, -0.422067f, -0.418527f, -0.414975f, -0.411168f, -0.406936f, -0.402186f, -0.397105f, -0.392257f, -0.388096f, -0.384459f, -0.380881f, -0.377213f, -0.373462f, -0.369262f, -0.364132f, -0.358049f, -0.351167f, -0.343304f, -0.334329f, -0.324576f, -0.314218f, -0.302915f, -0.290682f, -0.278196f, -0.265680f, -0.252744f, -0.239783f, -0.227924f, -0.217230f, -0.206891f, -0.197140f, -0.188670f, + -0.180713f, -0.172459f, -0.165010f, -0.158739f, -0.151375f, -0.142611f, -0.136204f, -0.132665f, -0.126667f, -0.118002f, -0.114967f, -0.118021f, -0.114254f, -0.101693f, -0.101321f, -0.124560f, -0.148010f, -0.147590f, -0.137378f, -0.139760f, -0.138747f, -0.110154f, -0.081767f, -0.105233f, -0.171870f, -0.215991f, -0.207009f, -0.181245f, -0.174445f, -0.180343f, -0.186444f, -0.191819f, -0.178097f, -0.127153f, -0.082373f, -0.120177f, -0.235388f, -0.328199f, -0.337442f, -0.311065f, -0.306275f, -0.305983f, -0.290025f, -0.296380f, -0.327277f, -0.281376f, -0.097597f, 0.092327f} + }, + { + {0.054589f, -0.001637f, -0.079543f, -0.135743f, -0.131804f, -0.043458f, 0.104068f, 0.217533f, 0.204070f, 0.074239f, -0.060507f, -0.108806f, -0.081689f, -0.039379f, -0.004993f, 0.029597f, 0.049473f, 0.026070f, -0.027204f, -0.057970f, -0.040922f, -0.005408f, 0.012701f, 0.016342f, 0.029669f, 0.058829f, 0.089715f, 0.111195f, 0.121951f, 0.120092f, 0.101652f, 0.069740f, 0.035273f, 0.006521f, -0.017134f, -0.040773f, -0.067733f, -0.098260f, -0.130202f, -0.159125f, -0.179923f, -0.190245f, -0.191892f, -0.188409f, -0.182228f, -0.174485f, -0.166098f, -0.157672f, -0.148951f, -0.139390f, -0.129028f, -0.118145f, -0.106568f, -0.094035f, -0.080835f, -0.067363f, -0.053428f, -0.038739f, -0.023875f, -0.010097f, 0.001710f, 0.011389f, 0.018876f, 0.023826f, 0.026232f, 0.027134f, 0.028095f, 0.029852f, 0.032050f, 0.034619f, 0.038653f, 0.045252f, 0.054228f, 0.064975f, 0.078084f, 0.094927f, 0.115972f, 0.140559f, 0.168055f, 0.198238f, 0.230625f, 0.264146f, 0.297428f, 0.329230f, 0.359002f, 0.386873f, 0.412350f, 0.433497f, 0.448864f, 0.459882f, 0.469349f, 0.477249f, 0.480035f, 0.474609f, 0.461344f, 0.442380f, + 0.418375f, 0.388058f, 0.350422f, 0.306536f, 0.259028f, 0.209804f, 0.158634f, 0.104592f, 0.048670f, -0.006109f, -0.057348f, -0.105165f, -0.151294f, -0.197048f, -0.242030f, -0.284064f, -0.320505f, -0.350300f, -0.374580f, -0.394966f, -0.411917f, -0.425031f, -0.434070f, -0.439211f, -0.441124f, -0.441102f, -0.440376f, -0.439189f, -0.437206f, -0.434556f, -0.431640f, -0.428284f, -0.423789f, -0.417348f, -0.408064f, -0.395487f, -0.380583f, -0.365150f, -0.349938f, -0.334311f, -0.317544f, -0.299138f, -0.278349f, -0.255141f, -0.231262f, -0.208784f, -0.188088f, -0.168556f, -0.150109f, -0.132628f, -0.115237f, -0.097788f, -0.081784f, -0.068578f, -0.057918f, -0.049072f, -0.041700f, -0.034982f, -0.027605f, -0.019168f, -0.010254f, -0.001254f, 0.007586f, 0.015692f, 0.023079f, 0.030753f, 0.039150f, 0.047677f, 0.056423f, 0.066196f, 0.076374f, 0.085165f, 0.092238f, 0.098541f, 0.103858f, 0.107357f, 0.109771f, 0.112187f, 0.113992f, 0.114589f, 0.115084f, 0.115986f, 0.116053f, 0.115391f, 0.116090f, 0.118375f, 0.120418f, 0.122613f, 0.127014f, 0.132736f, 0.137519f, 0.142486f, 0.149375f, 0.155994f, 0.160690f, 0.166504f, + 0.174416f, 0.179864f, 0.182512f, 0.188824f, 0.198165f, 0.201158f, 0.199276f, 0.205855f, 0.218574f, 0.217938f, 0.206203f, 0.213074f, 0.240900f, 0.244438f, 0.200317f, 0.158123f, 0.174531f, 0.227413f, 0.251412f, 0.237058f, 0.230785f, 0.244489f, 0.233509f, 0.178591f, 0.130638f, 0.141894f, 0.191497f, 0.216461f, 0.195657f, 0.165578f, 0.156193f, 0.145395f, 0.095257f, 0.017498f, -0.024939f, 0.010288f, 0.089729f, 0.139320f, 0.127786f, 0.093936f, 0.089116f, 0.114421f, 0.129992f, 0.115341f, 0.099739f, 0.126419f, 0.196125f, 0.257597f}, + {0.054589f, -0.001637f, -0.079543f, -0.135743f, -0.131804f, -0.043458f, 0.104068f, 0.217533f, 0.204070f, 0.074239f, -0.060507f, -0.108806f, -0.081689f, -0.039379f, -0.004993f, 0.029597f, 0.049473f, 0.026070f, -0.027204f, -0.057970f, -0.040922f, -0.005408f, 0.012701f, 0.016342f, 0.029669f, 0.058829f, 0.089715f, 0.111195f, 0.121951f, 0.120092f, 0.101652f, 0.069740f, 0.035273f, 0.006521f, -0.017134f, -0.040773f, -0.067733f, -0.098260f, -0.130202f, -0.159125f, -0.179923f, -0.190245f, -0.191892f, -0.188409f, -0.182228f, -0.174485f, -0.166098f, -0.157672f, -0.148951f, -0.139390f, -0.129028f, -0.118145f, -0.106568f, -0.094035f, -0.080835f, -0.067363f, -0.053428f, -0.038739f, -0.023875f, -0.010097f, 0.001710f, 0.011389f, 0.018876f, 0.023826f, 0.026232f, 0.027134f, 0.028095f, 0.029852f, 0.032050f, 0.034619f, 0.038653f, 0.045252f, 0.054228f, 0.064975f, 0.078084f, 0.094927f, 0.115972f, 0.140559f, 0.168055f, 0.198238f, 0.230625f, 0.264146f, 0.297428f, 0.329230f, 0.359002f, 0.386873f, 0.412350f, 0.433497f, 0.448864f, 0.459882f, 0.469349f, 0.477249f, 0.480035f, 0.474609f, 0.461344f, 0.442380f, + 0.418375f, 0.388058f, 0.350422f, 0.306536f, 0.259028f, 0.209804f, 0.158634f, 0.104592f, 0.048670f, -0.006109f, -0.057348f, -0.105165f, -0.151294f, -0.197048f, -0.242030f, -0.284064f, -0.320505f, -0.350300f, -0.374580f, -0.394966f, -0.411917f, -0.425031f, -0.434070f, -0.439211f, -0.441124f, -0.441102f, -0.440376f, -0.439189f, -0.437206f, -0.434556f, -0.431640f, -0.428284f, -0.423789f, -0.417348f, -0.408064f, -0.395487f, -0.380583f, -0.365150f, -0.349938f, -0.334311f, -0.317544f, -0.299138f, -0.278349f, -0.255141f, -0.231262f, -0.208784f, -0.188088f, -0.168556f, -0.150109f, -0.132628f, -0.115237f, -0.097788f, -0.081784f, -0.068578f, -0.057918f, -0.049072f, -0.041700f, -0.034982f, -0.027605f, -0.019168f, -0.010254f, -0.001254f, 0.007586f, 0.015692f, 0.023079f, 0.030753f, 0.039150f, 0.047677f, 0.056423f, 0.066196f, 0.076374f, 0.085165f, 0.092238f, 0.098541f, 0.103858f, 0.107357f, 0.109771f, 0.112187f, 0.113992f, 0.114589f, 0.115084f, 0.115986f, 0.116053f, 0.115391f, 0.116090f, 0.118375f, 0.120418f, 0.122613f, 0.127014f, 0.132736f, 0.137519f, 0.142486f, 0.149375f, 0.155994f, 0.160690f, 0.166504f, + 0.174416f, 0.179864f, 0.182512f, 0.188824f, 0.198165f, 0.201158f, 0.199276f, 0.205855f, 0.218574f, 0.217938f, 0.206203f, 0.213074f, 0.240900f, 0.244438f, 0.200317f, 0.158123f, 0.174531f, 0.227413f, 0.251412f, 0.237058f, 0.230785f, 0.244489f, 0.233509f, 0.178591f, 0.130638f, 0.141894f, 0.191497f, 0.216461f, 0.195657f, 0.165578f, 0.156193f, 0.145395f, 0.095257f, 0.017498f, -0.024939f, 0.010288f, 0.089729f, 0.139320f, 0.127786f, 0.093936f, 0.089116f, 0.114421f, 0.129992f, 0.115341f, 0.099739f, 0.126419f, 0.196125f, 0.257597f} + }, + { + {-0.026157f, 0.068639f, 0.138852f, 0.116633f, 0.040871f, -0.066112f, -0.241888f, -0.457026f, -0.568605f, -0.471298f, -0.196549f, 0.181955f, 0.589203f, 0.816657f, 0.568697f, -0.134981f, -0.747445f, -0.685246f, -0.015441f, 0.605050f, 0.693322f, 0.391281f, 0.106693f, -0.011722f, -0.080268f, -0.174474f, -0.247103f, -0.273141f, -0.292930f, -0.320883f, -0.325188f, -0.295283f, -0.254575f, -0.212925f, -0.160163f, -0.098014f, -0.039915f, 0.010923f, 0.057040f, 0.092984f, 0.114618f, 0.128942f, 0.142270f, 0.151647f, 0.154912f, 0.155718f, 0.154665f, 0.148180f, 0.137772f, 0.129391f, 0.124178f, 0.118997f, 0.113394f, 0.108290f, 0.101692f, 0.091970f, 0.080942f, 0.069580f, 0.055904f, 0.039705f, 0.023561f, 0.007840f, -0.009525f, -0.028172f, -0.045799f, -0.062600f, -0.080032f, -0.096800f, -0.110687f, -0.122210f, -0.132699f, -0.141465f, -0.147899f, -0.153417f, -0.159057f, -0.164064f, -0.168042f, -0.171581f, -0.174482f, -0.176315f, -0.178283f, -0.181779f, -0.186166f, -0.190389f, -0.194992f, -0.200352f, -0.204977f, -0.207427f, -0.207840f, -0.206456f, -0.202971f, -0.197962f, -0.192616f, -0.187178f, -0.182088f, -0.179900f, + -0.183369f, -0.192384f, -0.205113f, -0.221034f, -0.240727f, -0.263826f, -0.288814f, -0.313701f, -0.336107f, -0.354222f, -0.368133f, -0.378639f, -0.385041f, -0.385850f, -0.381086f, -0.372078f, -0.359829f, -0.345156f, -0.329222f, -0.312415f, -0.294047f, -0.274257f, -0.254754f, -0.236913f, -0.220646f, -0.205336f, -0.190177f, -0.173810f, -0.155586f, -0.136859f, -0.119423f, -0.103382f, -0.087912f, -0.072828f, -0.057948f, -0.042443f, -0.026135f, -0.010040f, 0.005293f, 0.020416f, 0.035572f, 0.050402f, 0.065217f, 0.080748f, 0.096694f, 0.112113f, 0.126763f, 0.140626f, 0.152945f, 0.163087f, 0.171376f, 0.178108f, 0.182919f, 0.185770f, 0.187134f, 0.186908f, 0.184596f, 0.180511f, 0.175333f, 0.168990f, 0.161399f, 0.153419f, 0.145682f, 0.137689f, 0.129219f, 0.121085f, 0.113576f, 0.105961f, 0.098227f, 0.091437f, 0.086015f, 0.081580f, 0.078300f, 0.076492f, 0.075448f, 0.074428f, 0.073773f, 0.073571f, 0.072898f, 0.071705f, 0.071330f, 0.072161f, 0.073161f, 0.074179f, 0.076012f, 0.078167f, 0.079475f, 0.080318f, 0.081495f, 0.082291f, 0.082316f, 0.082970f, 0.084730f, 0.086114f, 0.087018f, 0.088948f, + 0.091133f, 0.091673f, 0.092125f, 0.094480f, 0.095720f, 0.093481f, 0.092767f, 0.096810f, 0.098287f, 0.092965f, 0.091911f, 0.101679f, 0.104826f, 0.086445f, 0.069405f, 0.089245f, 0.138069f, 0.169948f, 0.164683f, 0.150204f, 0.153627f, 0.164399f, 0.160775f, 0.145233f, 0.135702f, 0.139942f, 0.153308f, 0.169163f, 0.181118f, 0.185093f, 0.185347f, 0.187089f, 0.176933f, 0.125522f, 0.026481f, -0.073387f, -0.108076f, -0.068160f, -0.019136f, -0.018020f, -0.035753f, -0.012095f, 0.030752f, 0.016593f, -0.024770f, 0.062804f, 0.338438f, 0.605650f}, + {-0.026157f, 0.068639f, 0.138852f, 0.116633f, 0.040871f, -0.066112f, -0.241888f, -0.457026f, -0.568605f, -0.471298f, -0.196549f, 0.181955f, 0.589203f, 0.816657f, 0.568697f, -0.134981f, -0.747445f, -0.685246f, -0.015441f, 0.605050f, 0.693322f, 0.391281f, 0.106693f, -0.011722f, -0.080268f, -0.174474f, -0.247103f, -0.273141f, -0.292930f, -0.320883f, -0.325188f, -0.295283f, -0.254575f, -0.212925f, -0.160163f, -0.098014f, -0.039915f, 0.010923f, 0.057040f, 0.092984f, 0.114618f, 0.128942f, 0.142270f, 0.151647f, 0.154912f, 0.155718f, 0.154665f, 0.148180f, 0.137772f, 0.129391f, 0.124178f, 0.118997f, 0.113394f, 0.108290f, 0.101692f, 0.091970f, 0.080942f, 0.069580f, 0.055904f, 0.039705f, 0.023561f, 0.007840f, -0.009525f, -0.028172f, -0.045799f, -0.062600f, -0.080032f, -0.096800f, -0.110687f, -0.122210f, -0.132699f, -0.141465f, -0.147899f, -0.153417f, -0.159057f, -0.164064f, -0.168042f, -0.171581f, -0.174482f, -0.176315f, -0.178283f, -0.181779f, -0.186166f, -0.190389f, -0.194992f, -0.200352f, -0.204977f, -0.207427f, -0.207840f, -0.206456f, -0.202971f, -0.197962f, -0.192616f, -0.187178f, -0.182088f, -0.179900f, + -0.183369f, -0.192384f, -0.205113f, -0.221034f, -0.240727f, -0.263826f, -0.288814f, -0.313701f, -0.336107f, -0.354222f, -0.368133f, -0.378639f, -0.385041f, -0.385850f, -0.381086f, -0.372078f, -0.359829f, -0.345156f, -0.329222f, -0.312415f, -0.294047f, -0.274257f, -0.254754f, -0.236913f, -0.220646f, -0.205336f, -0.190177f, -0.173810f, -0.155586f, -0.136859f, -0.119423f, -0.103382f, -0.087912f, -0.072828f, -0.057948f, -0.042443f, -0.026135f, -0.010040f, 0.005293f, 0.020416f, 0.035572f, 0.050402f, 0.065217f, 0.080748f, 0.096694f, 0.112113f, 0.126763f, 0.140626f, 0.152945f, 0.163087f, 0.171376f, 0.178108f, 0.182919f, 0.185770f, 0.187134f, 0.186908f, 0.184596f, 0.180511f, 0.175333f, 0.168990f, 0.161399f, 0.153419f, 0.145682f, 0.137689f, 0.129219f, 0.121085f, 0.113576f, 0.105961f, 0.098227f, 0.091437f, 0.086015f, 0.081580f, 0.078300f, 0.076492f, 0.075448f, 0.074428f, 0.073773f, 0.073571f, 0.072898f, 0.071705f, 0.071330f, 0.072161f, 0.073161f, 0.074179f, 0.076012f, 0.078167f, 0.079475f, 0.080318f, 0.081495f, 0.082291f, 0.082316f, 0.082970f, 0.084730f, 0.086114f, 0.087018f, 0.088948f, + 0.091133f, 0.091673f, 0.092125f, 0.094480f, 0.095720f, 0.093481f, 0.092767f, 0.096810f, 0.098287f, 0.092965f, 0.091911f, 0.101679f, 0.104826f, 0.086445f, 0.069405f, 0.089245f, 0.138069f, 0.169948f, 0.164683f, 0.150204f, 0.153627f, 0.164399f, 0.160775f, 0.145233f, 0.135702f, 0.139942f, 0.153308f, 0.169163f, 0.181118f, 0.185093f, 0.185347f, 0.187089f, 0.176933f, 0.125522f, 0.026481f, -0.073387f, -0.108076f, -0.068160f, -0.019136f, -0.018020f, -0.035753f, -0.012095f, 0.030752f, 0.016593f, -0.024770f, 0.062804f, 0.338438f, 0.605650f} + }, + { + {-0.007369f, -0.009113f, -0.001099f, 0.022658f, 0.070924f, 0.152318f, 0.232129f, 0.241139f, 0.159597f, 0.019376f, -0.191743f, -0.478726f, -0.641786f, -0.366448f, 0.302362f, 0.784726f, 0.561501f, -0.152339f, -0.632004f, -0.504209f, -0.082826f, 0.166508f, 0.170061f, 0.132434f, 0.150576f, 0.156677f, 0.112765f, 0.064809f, 0.038940f, 0.011560f, -0.026185f, -0.052670f, -0.058435f, -0.055297f, -0.050368f, -0.042168f, -0.033153f, -0.026070f, -0.017664f, -0.007165f, -0.000019f, 0.002560f, 0.006005f, 0.011682f, 0.014961f, 0.014711f, 0.014629f, 0.015662f, 0.015718f, 0.015511f, 0.017772f, 0.022545f, 0.028288f, 0.035048f, 0.042950f, 0.050476f, 0.056636f, 0.061995f, 0.066457f, 0.069051f, 0.070123f, 0.070862f, 0.071035f, 0.069703f, 0.067216f, 0.064295f, 0.060502f, 0.055392f, 0.049663f, 0.043845f, 0.037475f, 0.030360f, 0.022950f, 0.015014f, 0.005606f, -0.005567f, -0.018119f, -0.031952f, -0.046962f, -0.062497f, -0.078234f, -0.094671f, -0.111772f, -0.128161f, -0.142543f, -0.154931f, -0.165841f, -0.175123f, -0.182010f, -0.185649f, -0.185515f, -0.181851f, -0.175561f, -0.167354f, -0.157511f, -0.146709f, + -0.136223f, -0.126946f, -0.118986f, -0.112528f, -0.108273f, -0.106653f, -0.107197f, -0.108900f, -0.110998f, -0.113479f, -0.117023f, -0.122152f, -0.128391f, -0.134603f, -0.140110f, -0.145050f, -0.149794f, -0.154521f, -0.159112f, -0.163000f, -0.165438f, -0.166306f, -0.166315f, -0.166210f, -0.166147f, -0.165802f, -0.164520f, -0.161506f, -0.156473f, -0.149994f, -0.142735f, -0.134670f, -0.125420f, -0.114771f, -0.102543f, -0.088669f, -0.073713f, -0.058625f, -0.043867f, -0.029420f, -0.015423f, -0.002012f, 0.011080f, 0.023915f, 0.035810f, 0.046102f, 0.054869f, 0.062393f, 0.068774f, 0.074464f, 0.080241f, 0.086360f, 0.092594f, 0.098983f, 0.105615f, 0.112093f, 0.118168f, 0.124284f, 0.130714f, 0.137142f, 0.143655f, 0.150871f, 0.158659f, 0.166225f, 0.173522f, 0.180945f, 0.187978f, 0.193921f, 0.199247f, 0.204493f, 0.209025f, 0.212545f, 0.216101f, 0.220182f, 0.223965f, 0.227482f, 0.231885f, 0.237074f, 0.242015f, 0.247127f, 0.253052f, 0.258300f, 0.261689f, 0.264868f, 0.268891f, 0.271822f, 0.273082f, 0.275283f, 0.278781f, 0.280657f, 0.281124f, 0.283268f, 0.285951f, 0.286133f, 0.286398f, 0.289463f, + 0.290488f, 0.287311f, 0.288136f, 0.294374f, 0.292805f, 0.282671f, 0.284319f, 0.297926f, 0.292144f, 0.265659f, 0.265620f, 0.295582f, 0.275872f, 0.176874f, 0.118624f, 0.219351f, 0.399705f, 0.477971f, 0.424361f, 0.364658f, 0.350250f, 0.304253f, 0.215924f, 0.205638f, 0.330161f, 0.473519f, 0.512784f, 0.473603f, 0.445373f, 0.445924f, 0.442945f, 0.420484f, 0.362318f, 0.253795f, 0.151402f, 0.158962f, 0.280224f, 0.386924f, 0.389886f, 0.347680f, 0.344603f, 0.363776f, 0.360809f, 0.360105f, 0.372309f, 0.308063f, 0.110063f, -0.088473f}, + {0.007369f, 0.009113f, 0.001099f, -0.022658f, -0.070924f, -0.152318f, -0.232129f, -0.241139f, -0.159597f, -0.019376f, 0.191743f, 0.478726f, 0.641786f, 0.366448f, -0.302362f, -0.784726f, -0.561501f, 0.152339f, 0.632004f, 0.504209f, 0.082826f, -0.166508f, -0.170061f, -0.132434f, -0.150576f, -0.156677f, -0.112765f, -0.064809f, -0.038940f, -0.011560f, 0.026185f, 0.052670f, 0.058435f, 0.055297f, 0.050368f, 0.042168f, 0.033153f, 0.026070f, 0.017664f, 0.007165f, 0.000019f, -0.002560f, -0.006005f, -0.011682f, -0.014961f, -0.014711f, -0.014629f, -0.015662f, -0.015718f, -0.015511f, -0.017772f, -0.022545f, -0.028288f, -0.035048f, -0.042950f, -0.050476f, -0.056636f, -0.061995f, -0.066457f, -0.069051f, -0.070123f, -0.070862f, -0.071035f, -0.069703f, -0.067216f, -0.064295f, -0.060502f, -0.055392f, -0.049663f, -0.043845f, -0.037475f, -0.030360f, -0.022950f, -0.015014f, -0.005606f, 0.005567f, 0.018119f, 0.031952f, 0.046962f, 0.062497f, 0.078234f, 0.094671f, 0.111772f, 0.128161f, 0.142543f, 0.154931f, 0.165841f, 0.175123f, 0.182010f, 0.185649f, 0.185515f, 0.181851f, 0.175561f, 0.167354f, 0.157511f, 0.146709f, + 0.136223f, 0.126946f, 0.118986f, 0.112528f, 0.108273f, 0.106653f, 0.107197f, 0.108900f, 0.110998f, 0.113479f, 0.117023f, 0.122152f, 0.128391f, 0.134603f, 0.140110f, 0.145050f, 0.149794f, 0.154521f, 0.159112f, 0.163000f, 0.165438f, 0.166306f, 0.166315f, 0.166210f, 0.166147f, 0.165802f, 0.164520f, 0.161506f, 0.156473f, 0.149994f, 0.142735f, 0.134670f, 0.125420f, 0.114771f, 0.102543f, 0.088669f, 0.073713f, 0.058625f, 0.043867f, 0.029420f, 0.015423f, 0.002012f, -0.011080f, -0.023915f, -0.035810f, -0.046102f, -0.054869f, -0.062393f, -0.068774f, -0.074464f, -0.080241f, -0.086360f, -0.092594f, -0.098983f, -0.105615f, -0.112093f, -0.118168f, -0.124284f, -0.130714f, -0.137142f, -0.143655f, -0.150871f, -0.158659f, -0.166225f, -0.173522f, -0.180945f, -0.187978f, -0.193921f, -0.199247f, -0.204493f, -0.209025f, -0.212545f, -0.216101f, -0.220182f, -0.223965f, -0.227482f, -0.231885f, -0.237074f, -0.242015f, -0.247127f, -0.253052f, -0.258300f, -0.261689f, -0.264868f, -0.268891f, -0.271822f, -0.273082f, -0.275283f, -0.278781f, -0.280657f, -0.281124f, -0.283268f, -0.285951f, -0.286133f, -0.286398f, -0.289463f, + -0.290488f, -0.287311f, -0.288136f, -0.294374f, -0.292805f, -0.282671f, -0.284319f, -0.297926f, -0.292144f, -0.265659f, -0.265620f, -0.295582f, -0.275872f, -0.176874f, -0.118624f, -0.219351f, -0.399705f, -0.477971f, -0.424361f, -0.364658f, -0.350250f, -0.304253f, -0.215924f, -0.205638f, -0.330161f, -0.473519f, -0.512784f, -0.473603f, -0.445373f, -0.445924f, -0.442945f, -0.420484f, -0.362318f, -0.253795f, -0.151402f, -0.158962f, -0.280224f, -0.386924f, -0.389886f, -0.347680f, -0.344603f, -0.363776f, -0.360809f, -0.360105f, -0.372309f, -0.308063f, -0.110063f, 0.088473f} + }, + { + {-0.002688f, 0.005432f, 0.012718f, 0.008286f, -0.018981f, -0.066947f, -0.093651f, -0.039678f, 0.084418f, 0.167639f, 0.115873f, -0.019344f, -0.096903f, -0.063275f, 0.000491f, 0.014385f, -0.000484f, 0.009731f, 0.035483f, 0.032840f, 0.004036f, -0.010890f, -0.002359f, 0.000339f, -0.017379f, -0.034722f, -0.031174f, -0.012598f, 0.004762f, 0.015141f, 0.020393f, 0.020069f, 0.012230f, -0.002097f, -0.019459f, -0.036054f, -0.048695f, -0.056607f, -0.062102f, -0.067345f, -0.071275f, -0.071399f, -0.067330f, -0.060925f, -0.054215f, -0.048750f, -0.045891f, -0.046130f, -0.048390f, -0.050799f, -0.051951f, -0.051168f, -0.048155f, -0.042971f, -0.036130f, -0.028335f, -0.020063f, -0.011496f, -0.002777f, 0.005857f, 0.014252f, 0.022441f, 0.030314f, 0.037365f, 0.043111f, 0.047651f, 0.051375f, 0.054291f, 0.056203f, 0.057437f, 0.058706f, 0.060226f, 0.061657f, 0.063036f, 0.065132f, 0.068679f, 0.073849f, 0.080769f, 0.090037f, 0.102333f, 0.117751f, 0.135818f, 0.156080f, 0.178486f, 0.203206f, 0.230031f, 0.257901f, 0.285243f, 0.310971f, 0.334898f, 0.356785f, 0.375158f, 0.387601f, 0.392296f, 0.388904f, 0.377910f, + 0.359590f, 0.333993f, 0.301815f, 0.264974f, 0.226129f, 0.187410f, 0.149597f, 0.112764f, 0.077779f, 0.046673f, 0.021036f, 0.000235f, -0.018297f, -0.036907f, -0.055957f, -0.073988f, -0.089329f, -0.101608f, -0.111952f, -0.121846f, -0.131868f, -0.141542f, -0.150198f, -0.157697f, -0.164481f, -0.171286f, -0.178744f, -0.186942f, -0.195343f, -0.203302f, -0.210537f, -0.217024f, -0.222694f, -0.227441f, -0.231177f, -0.233784f, -0.235253f, -0.235915f, -0.236263f, -0.236534f, -0.236669f, -0.236547f, -0.236024f, -0.235038f, -0.233954f, -0.233475f, -0.233944f, -0.235111f, -0.236668f, -0.238427f, -0.239938f, -0.240742f, -0.241159f, -0.242072f, -0.243807f, -0.245955f, -0.248133f, -0.250080f, -0.251134f, -0.250524f, -0.248011f, -0.243591f, -0.237000f, -0.228096f, -0.217152f, -0.204269f, -0.189244f, -0.172334f, -0.154244f, -0.135283f, -0.115616f, -0.096165f, -0.077963f, -0.060968f, -0.044792f, -0.029876f, -0.016585f, -0.004235f, 0.007671f, 0.018639f, 0.028667f, 0.038632f, 0.048378f, 0.056858f, 0.064590f, 0.073057f, 0.081754f, 0.089292f, 0.096631f, 0.105231f, 0.113645f, 0.120294f, 0.126811f, 0.134121f, 0.139781f, 0.143768f, + 0.149981f, 0.157487f, 0.160603f, 0.162003f, 0.170584f, 0.181780f, 0.181900f, 0.177636f, 0.189907f, 0.209624f, 0.204280f, 0.186664f, 0.216719f, 0.295365f, 0.323582f, 0.234869f, 0.109824f, 0.071288f, 0.113232f, 0.138910f, 0.132778f, 0.165020f, 0.231457f, 0.229499f, 0.127086f, 0.030054f, 0.024335f, 0.057848f, 0.047811f, 0.011116f, 0.005056f, 0.015613f, 0.000201f, -0.011538f, 0.040879f, 0.133184f, 0.174164f, 0.133872f, 0.077041f, 0.063200f, 0.079294f, 0.086196f, 0.077456f, 0.068117f, 0.062643f, 0.057750f, 0.055152f, 0.055779f}, + {0.002688f, -0.005432f, -0.012718f, -0.008286f, 0.018981f, 0.066947f, 0.093651f, 0.039678f, -0.084418f, -0.167639f, -0.115873f, 0.019344f, 0.096903f, 0.063275f, -0.000491f, -0.014385f, 0.000484f, -0.009731f, -0.035483f, -0.032840f, -0.004036f, 0.010890f, 0.002359f, -0.000339f, 0.017379f, 0.034722f, 0.031174f, 0.012598f, -0.004762f, -0.015141f, -0.020393f, -0.020069f, -0.012230f, 0.002097f, 0.019459f, 0.036054f, 0.048695f, 0.056607f, 0.062102f, 0.067345f, 0.071275f, 0.071399f, 0.067330f, 0.060925f, 0.054215f, 0.048750f, 0.045891f, 0.046130f, 0.048390f, 0.050799f, 0.051951f, 0.051168f, 0.048155f, 0.042971f, 0.036130f, 0.028335f, 0.020063f, 0.011496f, 0.002777f, -0.005857f, -0.014252f, -0.022441f, -0.030314f, -0.037365f, -0.043111f, -0.047651f, -0.051375f, -0.054291f, -0.056203f, -0.057437f, -0.058706f, -0.060226f, -0.061657f, -0.063036f, -0.065132f, -0.068679f, -0.073849f, -0.080769f, -0.090037f, -0.102333f, -0.117751f, -0.135818f, -0.156080f, -0.178486f, -0.203206f, -0.230031f, -0.257901f, -0.285243f, -0.310971f, -0.334898f, -0.356785f, -0.375158f, -0.387601f, -0.392296f, -0.388904f, -0.377910f, + -0.359590f, -0.333993f, -0.301815f, -0.264974f, -0.226129f, -0.187410f, -0.149597f, -0.112764f, -0.077779f, -0.046673f, -0.021036f, -0.000235f, 0.018297f, 0.036907f, 0.055957f, 0.073988f, 0.089329f, 0.101608f, 0.111952f, 0.121846f, 0.131868f, 0.141542f, 0.150198f, 0.157697f, 0.164481f, 0.171286f, 0.178744f, 0.186942f, 0.195343f, 0.203302f, 0.210537f, 0.217024f, 0.222694f, 0.227441f, 0.231177f, 0.233784f, 0.235253f, 0.235915f, 0.236263f, 0.236534f, 0.236669f, 0.236547f, 0.236024f, 0.235038f, 0.233954f, 0.233475f, 0.233944f, 0.235111f, 0.236668f, 0.238427f, 0.239938f, 0.240742f, 0.241159f, 0.242072f, 0.243807f, 0.245955f, 0.248133f, 0.250080f, 0.251134f, 0.250524f, 0.248011f, 0.243591f, 0.237000f, 0.228096f, 0.217152f, 0.204269f, 0.189244f, 0.172334f, 0.154244f, 0.135283f, 0.115616f, 0.096165f, 0.077963f, 0.060968f, 0.044792f, 0.029876f, 0.016585f, 0.004235f, -0.007671f, -0.018639f, -0.028667f, -0.038632f, -0.048378f, -0.056858f, -0.064590f, -0.073057f, -0.081754f, -0.089292f, -0.096631f, -0.105231f, -0.113645f, -0.120294f, -0.126811f, -0.134121f, -0.139781f, -0.143768f, + -0.149981f, -0.157487f, -0.160603f, -0.162003f, -0.170584f, -0.181780f, -0.181900f, -0.177636f, -0.189907f, -0.209624f, -0.204280f, -0.186664f, -0.216719f, -0.295365f, -0.323582f, -0.234869f, -0.109824f, -0.071288f, -0.113232f, -0.138910f, -0.132778f, -0.165020f, -0.231457f, -0.229499f, -0.127086f, -0.030054f, -0.024335f, -0.057848f, -0.047811f, -0.011116f, -0.005056f, -0.015613f, -0.000201f, 0.011538f, -0.040879f, -0.133184f, -0.174164f, -0.133872f, -0.077041f, -0.063200f, -0.079294f, -0.086196f, -0.077456f, -0.068117f, -0.062643f, -0.057750f, -0.055152f, -0.055779f} + }, + { + {-0.031395f, -0.017549f, 0.012545f, 0.027085f, -0.001298f, -0.019483f, 0.059019f, 0.208286f, 0.263492f, 0.087514f, -0.255313f, -0.510902f, -0.435627f, -0.033493f, 0.386939f, 0.463824f, 0.150130f, -0.224282f, -0.317692f, -0.133994f, 0.063533f, 0.108717f, 0.062538f, 0.027810f, 0.001853f, -0.049162f, -0.095299f, -0.093148f, -0.061382f, -0.047017f, -0.057265f, -0.066961f, -0.063290f, -0.049263f, -0.023679f, 0.015474f, 0.059281f, 0.096124f, 0.123579f, 0.144087f, 0.157932f, 0.165971f, 0.171378f, 0.175091f, 0.175299f, 0.172128f, 0.167569f, 0.161483f, 0.152440f, 0.141016f, 0.128172f, 0.112226f, 0.090989f, 0.065073f, 0.036626f, 0.006936f, -0.022810f, -0.050769f, -0.076246f, -0.100391f, -0.124040f, -0.146496f, -0.166945f, -0.185227f, -0.200710f, -0.211804f, -0.216957f, -0.215246f, -0.206186f, -0.189818f, -0.166688f, -0.137158f, -0.101286f, -0.059912f, -0.015051f, 0.031417f, 0.078741f, 0.126363f, 0.172683f, 0.215583f, 0.253881f, 0.287628f, 0.317019f, 0.341528f, 0.360300f, 0.373071f, 0.380303f, 0.382359f, 0.378941f, 0.369492f, 0.353667f, 0.331025f, 0.300798f, 0.262671f, 0.217574f, 0.167114f, + 0.112510f, 0.054898f, -0.003462f, -0.059139f, -0.109030f, -0.151676f, -0.187106f, -0.215626f, -0.236627f, -0.248501f, -0.250097f, -0.242458f, -0.228671f, -0.211714f, -0.192851f, -0.172157f, -0.149779f, -0.126242f, -0.102213f, -0.078565f, -0.056361f, -0.036419f, -0.019092f, -0.004417f, 0.008006f, 0.019186f, 0.030126f, 0.040878f, 0.050508f, 0.057885f, 0.062245f, 0.063363f, 0.061684f, 0.058047f, 0.052884f, 0.045898f, 0.036639f, 0.025030f, 0.011292f, -0.004121f, -0.020506f, -0.037329f, -0.054568f, -0.072173f, -0.089494f, -0.105753f, -0.120651f, -0.134025f, -0.145470f, -0.154818f, -0.162347f, -0.168112f, -0.171794f, -0.173503f, -0.173945f, -0.173633f, -0.172788f, -0.171982f, -0.171913f, -0.172586f, -0.173607f, -0.174969f, -0.176759f, -0.178632f, -0.180379f, -0.182333f, -0.184562f, -0.186478f, -0.187751f, -0.188632f, -0.189123f, -0.188994f, -0.188640f, -0.188675f, -0.188837f, -0.188578f, -0.188189f, -0.188042f, -0.187510f, -0.185863f, -0.183172f, -0.179315f, -0.173560f, -0.165995f, -0.157668f, -0.148777f, -0.138701f, -0.127933f, -0.117657f, -0.107677f, -0.097244f, -0.087142f, -0.078362f, -0.070096f, -0.061614f, -0.054068f, + -0.047958f, -0.041708f, -0.035013f, -0.029793f, -0.025876f, -0.020687f, -0.014884f, -0.012039f, -0.011329f, -0.008255f, -0.004063f, -0.005183f, -0.011321f, -0.014544f, -0.013137f, -0.015356f, -0.025141f, -0.034687f, -0.036741f, -0.035196f, -0.036780f, -0.038630f, -0.031709f, -0.015609f, -0.004294f, -0.011898f, -0.032698f, -0.044235f, -0.036962f, -0.028397f, -0.032322f, -0.028167f, 0.009611f, 0.057777f, 0.058012f, -0.006611f, -0.081631f, -0.103618f, -0.068370f, -0.022195f, -0.005259f, -0.017573f, -0.028765f, -0.015361f, 0.003597f, -0.022097f, -0.107014f, -0.188977f}, + {0.031395f, 0.017549f, -0.012545f, -0.027085f, 0.001298f, 0.019483f, -0.059019f, -0.208286f, -0.263492f, -0.087514f, 0.255313f, 0.510902f, 0.435627f, 0.033493f, -0.386939f, -0.463824f, -0.150130f, 0.224282f, 0.317692f, 0.133994f, -0.063533f, -0.108717f, -0.062538f, -0.027810f, -0.001853f, 0.049162f, 0.095299f, 0.093148f, 0.061382f, 0.047017f, 0.057265f, 0.066961f, 0.063290f, 0.049263f, 0.023679f, -0.015474f, -0.059281f, -0.096124f, -0.123579f, -0.144087f, -0.157932f, -0.165971f, -0.171378f, -0.175091f, -0.175299f, -0.172128f, -0.167569f, -0.161483f, -0.152440f, -0.141016f, -0.128172f, -0.112226f, -0.090989f, -0.065073f, -0.036626f, -0.006936f, 0.022810f, 0.050769f, 0.076246f, 0.100391f, 0.124040f, 0.146496f, 0.166945f, 0.185227f, 0.200710f, 0.211804f, 0.216957f, 0.215246f, 0.206186f, 0.189818f, 0.166688f, 0.137158f, 0.101286f, 0.059912f, 0.015051f, -0.031417f, -0.078741f, -0.126363f, -0.172683f, -0.215583f, -0.253881f, -0.287628f, -0.317019f, -0.341528f, -0.360300f, -0.373071f, -0.380303f, -0.382359f, -0.378941f, -0.369492f, -0.353667f, -0.331025f, -0.300798f, -0.262671f, -0.217574f, -0.167114f, + -0.112510f, -0.054898f, 0.003462f, 0.059139f, 0.109030f, 0.151676f, 0.187106f, 0.215626f, 0.236627f, 0.248501f, 0.250097f, 0.242458f, 0.228671f, 0.211714f, 0.192851f, 0.172157f, 0.149779f, 0.126242f, 0.102213f, 0.078565f, 0.056361f, 0.036419f, 0.019092f, 0.004417f, -0.008006f, -0.019186f, -0.030126f, -0.040878f, -0.050508f, -0.057885f, -0.062245f, -0.063363f, -0.061684f, -0.058047f, -0.052884f, -0.045898f, -0.036639f, -0.025030f, -0.011292f, 0.004121f, 0.020506f, 0.037329f, 0.054568f, 0.072173f, 0.089494f, 0.105753f, 0.120651f, 0.134025f, 0.145470f, 0.154818f, 0.162347f, 0.168112f, 0.171794f, 0.173503f, 0.173945f, 0.173633f, 0.172788f, 0.171982f, 0.171913f, 0.172586f, 0.173607f, 0.174969f, 0.176759f, 0.178632f, 0.180379f, 0.182333f, 0.184562f, 0.186478f, 0.187751f, 0.188632f, 0.189123f, 0.188994f, 0.188640f, 0.188675f, 0.188837f, 0.188578f, 0.188189f, 0.188042f, 0.187510f, 0.185863f, 0.183172f, 0.179315f, 0.173560f, 0.165995f, 0.157668f, 0.148777f, 0.138701f, 0.127933f, 0.117657f, 0.107677f, 0.097244f, 0.087142f, 0.078362f, 0.070096f, 0.061614f, 0.054068f, + 0.047958f, 0.041708f, 0.035013f, 0.029793f, 0.025876f, 0.020687f, 0.014884f, 0.012039f, 0.011329f, 0.008255f, 0.004063f, 0.005183f, 0.011321f, 0.014544f, 0.013137f, 0.015356f, 0.025141f, 0.034687f, 0.036741f, 0.035196f, 0.036780f, 0.038630f, 0.031709f, 0.015609f, 0.004294f, 0.011898f, 0.032698f, 0.044235f, 0.036962f, 0.028397f, 0.032322f, 0.028167f, -0.009611f, -0.057777f, -0.058012f, 0.006611f, 0.081631f, 0.103618f, 0.068370f, 0.022195f, 0.005259f, 0.017573f, 0.028765f, 0.015361f, -0.003597f, 0.022097f, 0.107014f, 0.188977f} + }, + { + {-0.019502f, -0.024108f, -0.023741f, -0.009796f, 0.015547f, 0.040200f, 0.049418f, 0.030039f, -0.022935f, -0.089805f, -0.122188f, -0.081481f, 0.009195f, 0.073870f, 0.061521f, -0.001319f, -0.051768f, -0.064073f, -0.056806f, -0.044490f, -0.019688f, 0.017657f, 0.047591f, 0.057938f, 0.061200f, 0.071250f, 0.079820f, 0.068542f, 0.033537f, -0.011849f, -0.051126f, -0.073885f, -0.077564f, -0.068013f, -0.056218f, -0.049942f, -0.048764f, -0.047509f, -0.042223f, -0.032636f, -0.021389f, -0.011717f, -0.004812f, 0.000602f, 0.006040f, 0.011907f, 0.018434f, 0.026017f, 0.034094f, 0.041240f, 0.046701f, 0.050589f, 0.052772f, 0.052796f, 0.050455f, 0.045432f, 0.037083f, 0.025409f, 0.011341f, -0.004349f, -0.021366f, -0.039047f, -0.056623f, -0.074233f, -0.092292f, -0.110264f, -0.127486f, -0.144411f, -0.161405f, -0.177189f, -0.189933f, -0.198872f, -0.203514f, -0.202567f, -0.195078f, -0.181502f, -0.162623f, -0.138623f, -0.110014f, -0.078167f, -0.044145f, -0.008062f, 0.029925f, 0.068792f, 0.107070f, 0.143639f, 0.178228f, 0.211182f, 0.242095f, 0.268826f, 0.288929f, 0.301918f, 0.308848f, 0.309956f, 0.304163f, 0.290661f, + 0.269776f, 0.242758f, 0.211892f, 0.180019f, 0.148692f, 0.117379f, 0.085253f, 0.053049f, 0.022899f, -0.002684f, -0.021788f, -0.034534f, -0.043357f, -0.050497f, -0.055571f, -0.056701f, -0.053111f, -0.045412f, -0.034615f, -0.022156f, -0.009575f, 0.002997f, 0.016842f, 0.032605f, 0.049621f, 0.067258f, 0.085130f, 0.102158f, 0.117320f, 0.130988f, 0.143895f, 0.155582f, 0.165326f, 0.173298f, 0.179406f, 0.182544f, 0.182218f, 0.179194f, 0.173800f, 0.165487f, 0.154409f, 0.141300f, 0.125879f, 0.107494f, 0.086830f, 0.064946f, 0.041711f, 0.017064f, -0.007788f, -0.032117f, -0.056536f, -0.080769f, -0.103025f, -0.122613f, -0.140519f, -0.156975f, -0.171383f, -0.184548f, -0.197943f, -0.211256f, -0.223337f, -0.234237f, -0.243922f, -0.251152f, -0.255800f, -0.259609f, -0.263111f, -0.265127f, -0.266052f, -0.267563f, -0.268996f, -0.268445f, -0.266765f, -0.265908f, -0.265057f, -0.262930f, -0.261168f, -0.261121f, -0.261008f, -0.259822f, -0.259144f, -0.258514f, -0.255135f, -0.249662f, -0.245226f, -0.240818f, -0.233602f, -0.225815f, -0.220718f, -0.215649f, -0.207922f, -0.201220f, -0.197675f, -0.192842f, -0.185897f, -0.182258f, + -0.180668f, -0.174392f, -0.167600f, -0.168651f, -0.169029f, -0.157694f, -0.148968f, -0.158093f, -0.162902f, -0.141194f, -0.125772f, -0.150997f, -0.167269f, -0.107757f, -0.029434f, -0.064168f, -0.214163f, -0.327492f, -0.315349f, -0.260318f, -0.248751f, -0.230395f, -0.140550f, -0.051921f, -0.083798f, -0.221304f, -0.333518f, -0.342531f, -0.290265f, -0.249776f, -0.232606f, -0.189157f, -0.077884f, 0.062184f, 0.117635f, 0.018087f, -0.157652f, -0.249383f, -0.198595f, -0.105435f, -0.085189f, -0.130387f, -0.154588f, -0.124714f, -0.094023f, -0.119576f, -0.192526f, -0.253906f}, + {-0.019502f, -0.024108f, -0.023741f, -0.009796f, 0.015547f, 0.040200f, 0.049418f, 0.030039f, -0.022935f, -0.089805f, -0.122188f, -0.081481f, 0.009195f, 0.073870f, 0.061521f, -0.001319f, -0.051768f, -0.064073f, -0.056806f, -0.044490f, -0.019688f, 0.017657f, 0.047591f, 0.057938f, 0.061200f, 0.071250f, 0.079820f, 0.068542f, 0.033537f, -0.011849f, -0.051126f, -0.073885f, -0.077564f, -0.068013f, -0.056218f, -0.049942f, -0.048764f, -0.047509f, -0.042223f, -0.032636f, -0.021389f, -0.011717f, -0.004812f, 0.000602f, 0.006040f, 0.011907f, 0.018434f, 0.026017f, 0.034094f, 0.041240f, 0.046701f, 0.050589f, 0.052772f, 0.052796f, 0.050455f, 0.045432f, 0.037083f, 0.025409f, 0.011341f, -0.004349f, -0.021366f, -0.039047f, -0.056623f, -0.074233f, -0.092292f, -0.110264f, -0.127486f, -0.144411f, -0.161405f, -0.177189f, -0.189933f, -0.198872f, -0.203514f, -0.202567f, -0.195078f, -0.181502f, -0.162623f, -0.138623f, -0.110014f, -0.078167f, -0.044145f, -0.008062f, 0.029925f, 0.068792f, 0.107070f, 0.143639f, 0.178228f, 0.211182f, 0.242095f, 0.268826f, 0.288929f, 0.301918f, 0.308848f, 0.309956f, 0.304163f, 0.290661f, + 0.269776f, 0.242758f, 0.211892f, 0.180019f, 0.148692f, 0.117379f, 0.085253f, 0.053049f, 0.022899f, -0.002684f, -0.021788f, -0.034534f, -0.043357f, -0.050497f, -0.055571f, -0.056701f, -0.053111f, -0.045412f, -0.034615f, -0.022156f, -0.009575f, 0.002997f, 0.016842f, 0.032605f, 0.049621f, 0.067258f, 0.085130f, 0.102158f, 0.117320f, 0.130988f, 0.143895f, 0.155582f, 0.165326f, 0.173298f, 0.179406f, 0.182544f, 0.182218f, 0.179194f, 0.173800f, 0.165487f, 0.154409f, 0.141300f, 0.125879f, 0.107494f, 0.086830f, 0.064946f, 0.041711f, 0.017064f, -0.007788f, -0.032117f, -0.056536f, -0.080769f, -0.103025f, -0.122613f, -0.140519f, -0.156975f, -0.171383f, -0.184548f, -0.197943f, -0.211256f, -0.223337f, -0.234237f, -0.243922f, -0.251152f, -0.255800f, -0.259609f, -0.263111f, -0.265127f, -0.266052f, -0.267563f, -0.268996f, -0.268445f, -0.266765f, -0.265908f, -0.265057f, -0.262930f, -0.261168f, -0.261121f, -0.261008f, -0.259822f, -0.259144f, -0.258514f, -0.255135f, -0.249662f, -0.245226f, -0.240818f, -0.233602f, -0.225815f, -0.220718f, -0.215649f, -0.207922f, -0.201220f, -0.197675f, -0.192842f, -0.185897f, -0.182258f, + -0.180668f, -0.174392f, -0.167600f, -0.168651f, -0.169029f, -0.157694f, -0.148968f, -0.158093f, -0.162902f, -0.141194f, -0.125772f, -0.150997f, -0.167269f, -0.107757f, -0.029434f, -0.064168f, -0.214163f, -0.327492f, -0.315349f, -0.260318f, -0.248751f, -0.230395f, -0.140550f, -0.051921f, -0.083798f, -0.221304f, -0.333518f, -0.342531f, -0.290265f, -0.249776f, -0.232606f, -0.189157f, -0.077884f, 0.062184f, 0.117635f, 0.018087f, -0.157652f, -0.249383f, -0.198595f, -0.105435f, -0.085189f, -0.130387f, -0.154588f, -0.124714f, -0.094023f, -0.119576f, -0.192526f, -0.253906f} + }, + { + {-0.020459f, -0.024226f, -0.007319f, 0.032932f, 0.070261f, 0.086507f, 0.075862f, 0.020380f, -0.084294f, -0.176022f, -0.160990f, -0.027778f, 0.117310f, 0.158297f, 0.084734f, -0.019435f, -0.070381f, -0.045836f, 0.018199f, 0.061503f, 0.043846f, -0.020982f, -0.078254f, -0.087465f, -0.055763f, -0.014491f, 0.018486f, 0.043047f, 0.061052f, 0.072989f, 0.082705f, 0.092874f, 0.099131f, 0.096147f, 0.085745f, 0.073416f, 0.060647f, 0.045821f, 0.029788f, 0.016090f, 0.007003f, 0.002079f, -0.000428f, -0.002439f, -0.005629f, -0.011124f, -0.019711f, -0.031936f, -0.047212f, -0.063304f, -0.077628f, -0.088759f, -0.096303f, -0.100279f, -0.101461f, -0.101586f, -0.102290f, -0.104165f, -0.107222f, -0.111679f, -0.117799f, -0.125379f, -0.133735f, -0.141832f, -0.148297f, -0.151761f, -0.151415f, -0.147006f, -0.138423f, -0.125892f, -0.110520f, -0.093878f, -0.076767f, -0.059088f, -0.041213f, -0.024578f, -0.010198f, 0.002580f, 0.014740f, 0.025521f, 0.033050f, 0.036977f, 0.039052f, 0.040734f, 0.041611f, 0.041098f, 0.040698f, 0.043240f, 0.050015f, 0.059556f, 0.069410f, 0.078511f, 0.087586f, 0.097736f, 0.109169f, 0.121258f, + 0.133264f, 0.144615f, 0.154849f, 0.163981f, 0.173051f, 0.183709f, 0.196801f, 0.211503f, 0.226081f, 0.239369f, 0.251298f, 0.262094f, 0.271304f, 0.277782f, 0.280558f, 0.279527f, 0.275234f, 0.268056f, 0.257727f, 0.243568f, 0.225141f, 0.202779f, 0.177630f, 0.151117f, 0.124165f, 0.096863f, 0.068855f, 0.040060f, 0.011112f, -0.016739f, -0.042197f, -0.064683f, -0.084716f, -0.103488f, -0.121850f, -0.139509f, -0.155119f, -0.167247f, -0.175419f, -0.180319f, -0.183098f, -0.184680f, -0.185579f, -0.185807f, -0.184744f, -0.181522f, -0.175876f, -0.168297f, -0.159258f, -0.148806f, -0.137132f, -0.124962f, -0.113038f, -0.101619f, -0.090702f, -0.080308f, -0.070353f, -0.060612f, -0.050949f, -0.041416f, -0.032282f, -0.024135f, -0.017602f, -0.012726f, -0.009002f, -0.006124f, -0.004067f, -0.002466f, -0.000761f, 0.000957f, 0.002161f, 0.002971f, 0.004124f, 0.006037f, 0.008815f, 0.012852f, 0.018515f, 0.025647f, 0.034053f, 0.043642f, 0.053522f, 0.062187f, 0.069139f, 0.074948f, 0.079527f, 0.082208f, 0.083470f, 0.084404f, 0.084728f, 0.083626f, 0.081696f, 0.079585f, 0.076316f, 0.071580f, 0.067155f, 0.063445f, + 0.058415f, 0.052516f, 0.049067f, 0.047225f, 0.042514f, 0.036817f, 0.036645f, 0.038671f, 0.032655f, 0.022831f, 0.024748f, 0.033033f, 0.020825f, -0.012684f, -0.026595f, 0.002934f, 0.039449f, 0.037888f, 0.011764f, 0.003902f, 0.012957f, 0.004264f, -0.017371f, -0.007040f, 0.042603f, 0.080439f, 0.072238f, 0.048300f, 0.049597f, 0.067279f, 0.069762f, 0.058815f, 0.056785f, 0.054038f, 0.014698f, -0.061189f, -0.119777f, -0.117042f, -0.074421f, -0.044738f, -0.040786f, -0.033880f, -0.015908f, -0.014212f, -0.029787f, -0.010524f, 0.073048f, 0.159587f}, + {-0.020459f, -0.024226f, -0.007319f, 0.032932f, 0.070261f, 0.086507f, 0.075862f, 0.020380f, -0.084294f, -0.176022f, -0.160990f, -0.027778f, 0.117310f, 0.158297f, 0.084734f, -0.019435f, -0.070381f, -0.045836f, 0.018199f, 0.061503f, 0.043846f, -0.020982f, -0.078254f, -0.087465f, -0.055763f, -0.014491f, 0.018486f, 0.043047f, 0.061052f, 0.072989f, 0.082705f, 0.092874f, 0.099131f, 0.096147f, 0.085745f, 0.073416f, 0.060647f, 0.045821f, 0.029788f, 0.016090f, 0.007003f, 0.002079f, -0.000428f, -0.002439f, -0.005629f, -0.011124f, -0.019711f, -0.031936f, -0.047212f, -0.063304f, -0.077628f, -0.088759f, -0.096303f, -0.100279f, -0.101461f, -0.101586f, -0.102290f, -0.104165f, -0.107222f, -0.111679f, -0.117799f, -0.125379f, -0.133735f, -0.141832f, -0.148297f, -0.151761f, -0.151415f, -0.147006f, -0.138423f, -0.125892f, -0.110520f, -0.093878f, -0.076767f, -0.059088f, -0.041213f, -0.024578f, -0.010198f, 0.002580f, 0.014740f, 0.025521f, 0.033050f, 0.036977f, 0.039052f, 0.040734f, 0.041611f, 0.041098f, 0.040698f, 0.043240f, 0.050015f, 0.059556f, 0.069410f, 0.078511f, 0.087586f, 0.097736f, 0.109169f, 0.121258f, + 0.133264f, 0.144615f, 0.154849f, 0.163981f, 0.173051f, 0.183709f, 0.196801f, 0.211503f, 0.226081f, 0.239369f, 0.251298f, 0.262094f, 0.271304f, 0.277782f, 0.280558f, 0.279527f, 0.275234f, 0.268056f, 0.257727f, 0.243568f, 0.225141f, 0.202779f, 0.177630f, 0.151117f, 0.124165f, 0.096863f, 0.068855f, 0.040060f, 0.011112f, -0.016739f, -0.042197f, -0.064683f, -0.084716f, -0.103488f, -0.121850f, -0.139509f, -0.155119f, -0.167247f, -0.175419f, -0.180319f, -0.183098f, -0.184680f, -0.185579f, -0.185807f, -0.184744f, -0.181522f, -0.175876f, -0.168297f, -0.159258f, -0.148806f, -0.137132f, -0.124962f, -0.113038f, -0.101619f, -0.090702f, -0.080308f, -0.070353f, -0.060612f, -0.050949f, -0.041416f, -0.032282f, -0.024135f, -0.017602f, -0.012726f, -0.009002f, -0.006124f, -0.004067f, -0.002466f, -0.000761f, 0.000957f, 0.002161f, 0.002971f, 0.004124f, 0.006037f, 0.008815f, 0.012852f, 0.018515f, 0.025647f, 0.034053f, 0.043642f, 0.053522f, 0.062187f, 0.069139f, 0.074948f, 0.079527f, 0.082208f, 0.083470f, 0.084404f, 0.084728f, 0.083626f, 0.081696f, 0.079585f, 0.076316f, 0.071580f, 0.067155f, 0.063445f, + 0.058415f, 0.052516f, 0.049067f, 0.047225f, 0.042514f, 0.036817f, 0.036645f, 0.038671f, 0.032655f, 0.022831f, 0.024748f, 0.033033f, 0.020825f, -0.012684f, -0.026595f, 0.002934f, 0.039449f, 0.037888f, 0.011764f, 0.003902f, 0.012957f, 0.004264f, -0.017371f, -0.007040f, 0.042603f, 0.080439f, 0.072238f, 0.048300f, 0.049597f, 0.067279f, 0.069762f, 0.058815f, 0.056785f, 0.054038f, 0.014698f, -0.061189f, -0.119777f, -0.117042f, -0.074421f, -0.044738f, -0.040786f, -0.033880f, -0.015908f, -0.014212f, -0.029787f, -0.010524f, 0.073048f, 0.159587f} + }, + { + {0.019230f, 0.005435f, -0.001670f, -0.001294f, -0.010487f, -0.014461f, 0.030667f, 0.113202f, 0.129777f, 0.000014f, -0.192920f, -0.252233f, -0.092604f, 0.136952f, 0.210772f, 0.080821f, -0.088991f, -0.135389f, -0.068588f, -0.005284f, 0.003323f, 0.008914f, 0.058759f, 0.125754f, 0.159400f, 0.154680f, 0.140967f, 0.131350f, 0.112781f, 0.074083f, 0.020441f, -0.036433f, -0.087254f, -0.125241f, -0.147468f, -0.156986f, -0.158982f, -0.155710f, -0.147485f, -0.135704f, -0.122237f, -0.108291f, -0.095850f, -0.087923f, -0.085775f, -0.087690f, -0.091184f, -0.094666f, -0.096753f, -0.096083f, -0.092338f, -0.086137f, -0.077823f, -0.067513f, -0.056131f, -0.045302f, -0.036332f, -0.029950f, -0.026691f, -0.026859f, -0.030291f, -0.036478f, -0.044739f, -0.054291f, -0.064399f, -0.074432f, -0.083671f, -0.091357f, -0.096998f, -0.100237f, -0.100391f, -0.096616f, -0.088516f, -0.076165f, -0.059741f, -0.039630f, -0.016638f, 0.008301f, 0.034252f, 0.059947f, 0.084149f, 0.106719f, 0.128442f, 0.149556f, 0.169460f, 0.188009f, 0.205788f, 0.222968f, 0.239578f, 0.257255f, 0.278793f, 0.304945f, 0.333017f, 0.359631f, 0.383799f, 0.406350f, + 0.427076f, 0.443453f, 0.452044f, 0.450717f, 0.439522f, 0.419637f, 0.391822f, 0.356313f, 0.314014f, 0.266992f, 0.217371f, 0.166115f, 0.113115f, 0.058318f, 0.002811f, -0.051061f, -0.100914f, -0.145969f, -0.187244f, -0.225959f, -0.262069f, -0.294432f, -0.321896f, -0.344122f, -0.361927f, -0.376984f, -0.390730f, -0.403348f, -0.414010f, -0.421940f, -0.426962f, -0.429318f, -0.429290f, -0.426748f, -0.420950f, -0.411152f, -0.397449f, -0.380556f, -0.360910f, -0.338489f, -0.313239f, -0.285005f, -0.253467f, -0.218939f, -0.182850f, -0.146776f, -0.111419f, -0.076975f, -0.043728f, -0.011673f, 0.019551f, 0.049686f, 0.077567f, 0.102298f, 0.124067f, 0.143556f, 0.161395f, 0.178368f, 0.195283f, 0.212309f, 0.228806f, 0.243707f, 0.255881f, 0.264647f, 0.270268f, 0.273474f, 0.274516f, 0.273393f, 0.270618f, 0.266694f, 0.261220f, 0.253687f, 0.244636f, 0.234924f, 0.224646f, 0.213843f, 0.203253f, 0.193378f, 0.183911f, 0.174737f, 0.166068f, 0.157360f, 0.147829f, 0.137984f, 0.128785f, 0.119872f, 0.110662f, 0.102037f, 0.094727f, 0.087797f, 0.080834f, 0.075139f, 0.070900f, 0.066532f, 0.062189f, 0.059562f, + 0.057528f, 0.053708f, 0.049943f, 0.048889f, 0.046992f, 0.040524f, 0.035070f, 0.036201f, 0.036089f, 0.026789f, 0.019854f, 0.028515f, 0.036415f, 0.016301f, -0.020707f, -0.031384f, -0.002200f, 0.032420f, 0.043959f, 0.043313f, 0.045513f, 0.041021f, 0.025268f, 0.020977f, 0.042917f, 0.069031f, 0.074200f, 0.068229f, 0.074435f, 0.093211f, 0.111764f, 0.127851f, 0.138412f, 0.126789f, 0.090350f, 0.062570f, 0.076196f, 0.116262f, 0.139539f, 0.132391f, 0.119607f, 0.119984f, 0.124718f, 0.125718f, 0.138639f, 0.182077f, 0.246020f, 0.293881f}, + {0.019230f, 0.005435f, -0.001670f, -0.001294f, -0.010487f, -0.014461f, 0.030667f, 0.113202f, 0.129777f, 0.000014f, -0.192920f, -0.252233f, -0.092604f, 0.136952f, 0.210772f, 0.080821f, -0.088991f, -0.135389f, -0.068588f, -0.005284f, 0.003323f, 0.008914f, 0.058759f, 0.125754f, 0.159400f, 0.154680f, 0.140967f, 0.131350f, 0.112781f, 0.074083f, 0.020441f, -0.036433f, -0.087254f, -0.125241f, -0.147468f, -0.156986f, -0.158982f, -0.155710f, -0.147485f, -0.135704f, -0.122237f, -0.108291f, -0.095850f, -0.087923f, -0.085775f, -0.087690f, -0.091184f, -0.094666f, -0.096753f, -0.096083f, -0.092338f, -0.086137f, -0.077823f, -0.067513f, -0.056131f, -0.045302f, -0.036332f, -0.029950f, -0.026691f, -0.026859f, -0.030291f, -0.036478f, -0.044739f, -0.054291f, -0.064399f, -0.074432f, -0.083671f, -0.091357f, -0.096998f, -0.100237f, -0.100391f, -0.096616f, -0.088516f, -0.076165f, -0.059741f, -0.039630f, -0.016638f, 0.008301f, 0.034252f, 0.059947f, 0.084149f, 0.106719f, 0.128442f, 0.149556f, 0.169460f, 0.188009f, 0.205788f, 0.222968f, 0.239578f, 0.257255f, 0.278793f, 0.304945f, 0.333017f, 0.359631f, 0.383799f, 0.406350f, + 0.427076f, 0.443453f, 0.452044f, 0.450717f, 0.439522f, 0.419637f, 0.391822f, 0.356313f, 0.314014f, 0.266992f, 0.217371f, 0.166115f, 0.113115f, 0.058318f, 0.002811f, -0.051061f, -0.100914f, -0.145969f, -0.187244f, -0.225959f, -0.262069f, -0.294432f, -0.321896f, -0.344122f, -0.361927f, -0.376984f, -0.390730f, -0.403348f, -0.414010f, -0.421940f, -0.426962f, -0.429318f, -0.429290f, -0.426748f, -0.420950f, -0.411152f, -0.397449f, -0.380556f, -0.360910f, -0.338489f, -0.313239f, -0.285005f, -0.253467f, -0.218939f, -0.182850f, -0.146776f, -0.111419f, -0.076975f, -0.043728f, -0.011673f, 0.019551f, 0.049686f, 0.077567f, 0.102298f, 0.124067f, 0.143556f, 0.161395f, 0.178368f, 0.195283f, 0.212309f, 0.228806f, 0.243707f, 0.255881f, 0.264647f, 0.270268f, 0.273474f, 0.274516f, 0.273393f, 0.270618f, 0.266694f, 0.261220f, 0.253687f, 0.244636f, 0.234924f, 0.224646f, 0.213843f, 0.203253f, 0.193378f, 0.183911f, 0.174737f, 0.166068f, 0.157360f, 0.147829f, 0.137984f, 0.128785f, 0.119872f, 0.110662f, 0.102037f, 0.094727f, 0.087797f, 0.080834f, 0.075139f, 0.070900f, 0.066532f, 0.062189f, 0.059562f, + 0.057528f, 0.053708f, 0.049943f, 0.048889f, 0.046992f, 0.040524f, 0.035070f, 0.036201f, 0.036089f, 0.026789f, 0.019854f, 0.028515f, 0.036415f, 0.016301f, -0.020707f, -0.031384f, -0.002200f, 0.032420f, 0.043959f, 0.043313f, 0.045513f, 0.041021f, 0.025268f, 0.020977f, 0.042917f, 0.069031f, 0.074200f, 0.068229f, 0.074435f, 0.093211f, 0.111764f, 0.127851f, 0.138412f, 0.126789f, 0.090350f, 0.062570f, 0.076196f, 0.116262f, 0.139539f, 0.132391f, 0.119607f, 0.119984f, 0.124718f, 0.125718f, 0.138639f, 0.182077f, 0.246020f, 0.293881f} + }, + { + {-0.004423f, -0.003680f, -0.002575f, -0.001704f, -0.003298f, -0.009990f, -0.016789f, -0.009381f, 0.013931f, 0.019772f, -0.029696f, -0.105359f, -0.108022f, 0.013139f, 0.158404f, 0.164232f, 0.005487f, -0.155136f, -0.155733f, -0.019301f, 0.099136f, 0.104894f, 0.038243f, -0.019329f, -0.038505f, -0.031569f, -0.007440f, 0.030512f, 0.068864f, 0.092556f, 0.099631f, 0.096497f, 0.087824f, 0.077833f, 0.072061f, 0.071039f, 0.067981f, 0.056527f, 0.036499f, 0.011015f, -0.016897f, -0.043579f, -0.064988f, -0.079286f, -0.087153f, -0.089777f, -0.088480f, -0.085494f, -0.082997f, -0.081746f, -0.081767f, -0.083418f, -0.086783f, -0.090960f, -0.094751f, -0.097418f, -0.098548f, -0.098108f, -0.096834f, -0.095829f, -0.095756f, -0.096938f, -0.099845f, -0.104733f, -0.111080f, -0.118033f, -0.125180f, -0.132437f, -0.139508f, -0.145970f, -0.151644f, -0.156453f, -0.160072f, -0.162123f, -0.162733f, -0.162527f, -0.161866f, -0.160437f, -0.157991f, -0.155238f, -0.153188f, -0.151562f, -0.148788f, -0.143986f, -0.138030f, -0.131928f, -0.124917f, -0.115172f, -0.102129f, -0.087299f, -0.072817f, -0.059768f, -0.048018f, -0.037364f, -0.028595f, -0.023189f, + -0.021839f, -0.023601f, -0.026896f, -0.031210f, -0.037395f, -0.046314f, -0.057460f, -0.068846f, -0.078064f, -0.083668f, -0.085857f, -0.085916f, -0.084872f, -0.082672f, -0.078518f, -0.071816f, -0.062803f, -0.052472f, -0.041961f, -0.031940f, -0.022440f, -0.013098f, -0.003491f, 0.006606f, 0.017075f, 0.027610f, 0.038115f, 0.048801f, 0.059796f, 0.070835f, 0.081425f, 0.091108f, 0.099513f, 0.106449f, 0.112073f, 0.116786f, 0.120921f, 0.124710f, 0.128466f, 0.132563f, 0.137299f, 0.142939f, 0.149802f, 0.158143f, 0.168056f, 0.179520f, 0.192346f, 0.206065f, 0.220068f, 0.233786f, 0.246615f, 0.257930f, 0.267420f, 0.275131f, 0.280999f, 0.284712f, 0.286146f, 0.285449f, 0.282583f, 0.277328f, 0.269804f, 0.260438f, 0.249489f, 0.237152f, 0.223959f, 0.210474f, 0.196856f, 0.183212f, 0.169971f, 0.157536f, 0.146111f, 0.136111f, 0.127934f, 0.121231f, 0.115268f, 0.109883f, 0.105097f, 0.100223f, 0.094576f, 0.088506f, 0.082554f, 0.076446f, 0.069926f, 0.063313f, 0.056344f, 0.048087f, 0.038644f, 0.028934f, 0.018687f, 0.007186f, -0.004414f, -0.014506f, -0.023733f, -0.033085f, -0.041408f, -0.048241f, + -0.055610f, -0.063517f, -0.069118f, -0.073690f, -0.081987f, -0.091437f, -0.094480f, -0.095028f, -0.104280f, -0.115905f, -0.112025f, -0.101605f, -0.115283f, -0.144765f, -0.134628f, -0.067980f, -0.010744f, -0.020992f, -0.061710f, -0.068485f, -0.059208f, -0.090471f, -0.135033f, -0.106671f, -0.005182f, 0.066546f, 0.051133f, 0.009516f, 0.011923f, 0.041853f, 0.055633f, 0.061571f, 0.078429f, 0.074336f, 0.017492f, -0.049276f, -0.053327f, 0.006541f, 0.062892f, 0.074902f, 0.066734f, 0.070182f, 0.080188f, 0.084197f, 0.098518f, 0.148064f, 0.224120f, 0.282366f}, + {-0.004423f, -0.003680f, -0.002575f, -0.001704f, -0.003298f, -0.009990f, -0.016789f, -0.009381f, 0.013931f, 0.019772f, -0.029696f, -0.105359f, -0.108022f, 0.013139f, 0.158404f, 0.164232f, 0.005487f, -0.155136f, -0.155733f, -0.019301f, 0.099136f, 0.104894f, 0.038243f, -0.019329f, -0.038505f, -0.031569f, -0.007440f, 0.030512f, 0.068864f, 0.092556f, 0.099631f, 0.096497f, 0.087824f, 0.077833f, 0.072061f, 0.071039f, 0.067981f, 0.056527f, 0.036499f, 0.011015f, -0.016897f, -0.043579f, -0.064988f, -0.079286f, -0.087153f, -0.089777f, -0.088480f, -0.085494f, -0.082997f, -0.081746f, -0.081767f, -0.083418f, -0.086783f, -0.090960f, -0.094751f, -0.097418f, -0.098548f, -0.098108f, -0.096834f, -0.095829f, -0.095756f, -0.096938f, -0.099845f, -0.104733f, -0.111080f, -0.118033f, -0.125180f, -0.132437f, -0.139508f, -0.145970f, -0.151644f, -0.156453f, -0.160072f, -0.162123f, -0.162733f, -0.162527f, -0.161866f, -0.160437f, -0.157991f, -0.155238f, -0.153188f, -0.151562f, -0.148788f, -0.143986f, -0.138030f, -0.131928f, -0.124917f, -0.115172f, -0.102129f, -0.087299f, -0.072817f, -0.059768f, -0.048018f, -0.037364f, -0.028595f, -0.023189f, + -0.021839f, -0.023601f, -0.026896f, -0.031210f, -0.037395f, -0.046314f, -0.057460f, -0.068846f, -0.078064f, -0.083668f, -0.085857f, -0.085916f, -0.084872f, -0.082672f, -0.078518f, -0.071816f, -0.062803f, -0.052472f, -0.041961f, -0.031940f, -0.022440f, -0.013098f, -0.003491f, 0.006606f, 0.017075f, 0.027610f, 0.038115f, 0.048801f, 0.059796f, 0.070835f, 0.081425f, 0.091108f, 0.099513f, 0.106449f, 0.112073f, 0.116786f, 0.120921f, 0.124710f, 0.128466f, 0.132563f, 0.137299f, 0.142939f, 0.149802f, 0.158143f, 0.168056f, 0.179520f, 0.192346f, 0.206065f, 0.220068f, 0.233786f, 0.246615f, 0.257930f, 0.267420f, 0.275131f, 0.280999f, 0.284712f, 0.286146f, 0.285449f, 0.282583f, 0.277328f, 0.269804f, 0.260438f, 0.249489f, 0.237152f, 0.223959f, 0.210474f, 0.196856f, 0.183212f, 0.169971f, 0.157536f, 0.146111f, 0.136111f, 0.127934f, 0.121231f, 0.115268f, 0.109883f, 0.105097f, 0.100223f, 0.094576f, 0.088506f, 0.082554f, 0.076446f, 0.069926f, 0.063313f, 0.056344f, 0.048087f, 0.038644f, 0.028934f, 0.018687f, 0.007186f, -0.004414f, -0.014506f, -0.023733f, -0.033085f, -0.041408f, -0.048241f, + -0.055610f, -0.063517f, -0.069118f, -0.073690f, -0.081987f, -0.091437f, -0.094480f, -0.095028f, -0.104280f, -0.115905f, -0.112025f, -0.101605f, -0.115283f, -0.144765f, -0.134628f, -0.067980f, -0.010744f, -0.020992f, -0.061710f, -0.068485f, -0.059208f, -0.090471f, -0.135033f, -0.106671f, -0.005182f, 0.066546f, 0.051133f, 0.009516f, 0.011923f, 0.041853f, 0.055633f, 0.061571f, 0.078429f, 0.074336f, 0.017492f, -0.049276f, -0.053327f, 0.006541f, 0.062892f, 0.074902f, 0.066734f, 0.070182f, 0.080188f, 0.084197f, 0.098518f, 0.148064f, 0.224120f, 0.282366f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]={ + { + {-0.176883f, -0.484101f, -0.681502f, -0.759839f, -0.743260f, -0.671712f, -0.583362f, -0.478304f, -0.318825f, -0.095272f, 0.143578f, 0.354065f, 0.522400f, 0.573653f, 0.367199f, -0.078420f, -0.434443f, -0.343870f, 0.124508f, 0.486226f, 0.372821f, -0.092766f, -0.525036f, -0.722391f, -0.754199f, -0.724386f, -0.637689f, -0.485195f, -0.312888f, -0.164002f, -0.032292f, 0.097628f, 0.214974f, 0.307441f, 0.382911f, 0.451049f, 0.508993f, 0.554173f, 0.591982f, 0.625936f, 0.654364f, 0.677958f, 0.699685f, 0.718618f, 0.732355f, 0.742627f, 0.751969f, 0.759034f, 0.762320f, 0.763889f, 0.765445f, 0.765427f, 0.762747f, 0.758848f, 0.754374f, 0.748173f, 0.740408f, 0.732723f, 0.725282f, 0.717124f, 0.708777f, 0.701375f, 0.694353f, 0.686709f, 0.679081f, 0.672366f, 0.665974f, 0.659245f, 0.652813f, 0.647208f, 0.641839f, 0.636297f, 0.631020f, 0.626150f, 0.621184f, 0.615916f, 0.610540f, 0.605002f, 0.599137f, 0.592942f, 0.586130f, 0.578295f, 0.569816f, 0.561467f, 0.553030f, 0.543661f, 0.533605f, 0.523989f, 0.514958f, 0.505546f, 0.495406f, 0.485340f, 0.476136f, 0.467922f, 0.460482f, 0.453537f, + 0.447032f, 0.441566f, 0.437916f, 0.435874f, 0.434316f, 0.432632f, 0.431274f, 0.430811f, 0.431194f, 0.431966f, 0.432511f, 0.432256f, 0.431201f, 0.430003f, 0.429097f, 0.428076f, 0.426269f, 0.423428f, 0.419640f, 0.415127f, 0.410339f, 0.405686f, 0.401048f, 0.395985f, 0.390391f, 0.384517f, 0.378555f, 0.372595f, 0.366765f, 0.361032f, 0.355147f, 0.349030f, 0.342953f, 0.337206f, 0.331908f, 0.327170f, 0.323068f, 0.319457f, 0.316138f, 0.313128f, 0.310528f, 0.308327f, 0.306547f, 0.305321f, 0.304600f, 0.304043f, 0.303340f, 0.302393f, 0.301119f, 0.299399f, 0.297227f, 0.294657f, 0.291623f, 0.288018f, 0.283862f, 0.279239f, 0.274219f, 0.268923f, 0.263528f, 0.258150f, 0.252868f, 0.247800f, 0.243031f, 0.238568f, 0.234457f, 0.230786f, 0.227529f, 0.224597f, 0.221967f, 0.219543f, 0.217037f, 0.214279f, 0.211416f, 0.208572f, 0.205658f, 0.202707f, 0.199947f, 0.197400f, 0.194917f, 0.192647f, 0.190846f, 0.189375f, 0.188016f, 0.186967f, 0.186341f, 0.185707f, 0.184804f, 0.183946f, 0.183129f, 0.181782f, 0.179880f, 0.177983f, 0.175907f, 0.173014f, 0.169749f, 0.166885f, + 0.163721f, 0.159457f, 0.155288f, 0.152176f, 0.148348f, 0.142651f, 0.137657f, 0.134832f, 0.130418f, 0.122200f, 0.115519f, 0.114151f, 0.110369f, 0.095566f, 0.077072f, 0.070974f, 0.079309f, 0.087709f, 0.085554f, 0.075310f, 0.062218f, 0.049806f, 0.047081f, 0.063318f, 0.089933f, 0.102721f, 0.090827f, 0.071653f, 0.068003f, 0.080960f, 0.096237f, 0.109049f, 0.128470f, 0.157990f, 0.183447f, 0.185496f, 0.159930f, 0.121484f, 0.088399f, 0.066734f, 0.051403f, 0.038568f, 0.029965f, 0.024659f, 0.015630f, 0.000683f, -0.009979f, -0.006119f}, + {-0.176883f, -0.484101f, -0.681502f, -0.759839f, -0.743260f, -0.671712f, -0.583362f, -0.478304f, -0.318825f, -0.095272f, 0.143578f, 0.354065f, 0.522400f, 0.573653f, 0.367199f, -0.078420f, -0.434443f, -0.343870f, 0.124508f, 0.486226f, 0.372821f, -0.092766f, -0.525036f, -0.722391f, -0.754199f, -0.724386f, -0.637689f, -0.485195f, -0.312888f, -0.164002f, -0.032292f, 0.097628f, 0.214974f, 0.307441f, 0.382911f, 0.451049f, 0.508993f, 0.554173f, 0.591982f, 0.625936f, 0.654364f, 0.677958f, 0.699685f, 0.718618f, 0.732355f, 0.742627f, 0.751969f, 0.759034f, 0.762320f, 0.763889f, 0.765445f, 0.765427f, 0.762747f, 0.758848f, 0.754374f, 0.748173f, 0.740408f, 0.732723f, 0.725282f, 0.717124f, 0.708777f, 0.701375f, 0.694353f, 0.686709f, 0.679081f, 0.672366f, 0.665974f, 0.659245f, 0.652813f, 0.647208f, 0.641839f, 0.636297f, 0.631020f, 0.626150f, 0.621184f, 0.615916f, 0.610540f, 0.605002f, 0.599137f, 0.592942f, 0.586130f, 0.578295f, 0.569816f, 0.561467f, 0.553030f, 0.543661f, 0.533605f, 0.523989f, 0.514958f, 0.505546f, 0.495406f, 0.485340f, 0.476136f, 0.467922f, 0.460482f, 0.453537f, + 0.447032f, 0.441566f, 0.437916f, 0.435874f, 0.434316f, 0.432632f, 0.431274f, 0.430811f, 0.431194f, 0.431966f, 0.432511f, 0.432256f, 0.431201f, 0.430003f, 0.429097f, 0.428076f, 0.426269f, 0.423428f, 0.419640f, 0.415127f, 0.410339f, 0.405686f, 0.401048f, 0.395985f, 0.390391f, 0.384517f, 0.378555f, 0.372595f, 0.366765f, 0.361032f, 0.355147f, 0.349030f, 0.342953f, 0.337206f, 0.331908f, 0.327170f, 0.323068f, 0.319457f, 0.316138f, 0.313128f, 0.310528f, 0.308327f, 0.306547f, 0.305321f, 0.304600f, 0.304043f, 0.303340f, 0.302393f, 0.301119f, 0.299399f, 0.297227f, 0.294657f, 0.291623f, 0.288018f, 0.283862f, 0.279239f, 0.274219f, 0.268923f, 0.263528f, 0.258150f, 0.252868f, 0.247800f, 0.243031f, 0.238568f, 0.234457f, 0.230786f, 0.227529f, 0.224597f, 0.221967f, 0.219543f, 0.217037f, 0.214279f, 0.211416f, 0.208572f, 0.205658f, 0.202707f, 0.199947f, 0.197400f, 0.194917f, 0.192647f, 0.190846f, 0.189375f, 0.188016f, 0.186967f, 0.186341f, 0.185707f, 0.184804f, 0.183946f, 0.183129f, 0.181782f, 0.179880f, 0.177983f, 0.175907f, 0.173014f, 0.169749f, 0.166885f, + 0.163721f, 0.159457f, 0.155288f, 0.152176f, 0.148348f, 0.142651f, 0.137657f, 0.134832f, 0.130418f, 0.122200f, 0.115519f, 0.114151f, 0.110369f, 0.095566f, 0.077072f, 0.070974f, 0.079309f, 0.087709f, 0.085554f, 0.075310f, 0.062218f, 0.049806f, 0.047081f, 0.063318f, 0.089933f, 0.102721f, 0.090827f, 0.071653f, 0.068003f, 0.080960f, 0.096237f, 0.109049f, 0.128470f, 0.157990f, 0.183447f, 0.185496f, 0.159930f, 0.121484f, 0.088399f, 0.066734f, 0.051403f, 0.038568f, 0.029965f, 0.024659f, 0.015630f, 0.000683f, -0.009979f, -0.006119f} + }, + { + {0.139811f, 0.337680f, 0.309928f, 0.007865f, -0.460052f, -0.904017f, -1.187273f, -1.245347f, -1.047341f, -0.642813f, -0.178251f, 0.255482f, 0.696327f, 1.065155f, 0.997728f, 0.263824f, -0.669296f, -0.911797f, -0.169209f, 0.827247f, 1.142336f, 0.643160f, -0.071883f, -0.512664f, -0.694340f, -0.796456f, -0.832000f, -0.752642f, -0.618206f, -0.514447f, -0.432971f, -0.329732f, -0.215270f, -0.120320f, -0.037944f, 0.050458f, 0.138590f, 0.216448f, 0.291141f, 0.367466f, 0.437249f, 0.497434f, 0.554267f, 0.607280f, 0.650114f, 0.684871f, 0.717859f, 0.746604f, 0.765897f, 0.779257f, 0.792413f, 0.803890f, 0.811171f, 0.817031f, 0.823086f, 0.826132f, 0.825083f, 0.822817f, 0.819425f, 0.812156f, 0.801947f, 0.792033f, 0.781683f, 0.768517f, 0.754237f, 0.741632f, 0.729521f, 0.716105f, 0.703200f, 0.692765f, 0.683590f, 0.674714f, 0.667761f, 0.663634f, 0.661007f, 0.659222f, 0.658950f, 0.659915f, 0.661194f, 0.662882f, 0.664859f, 0.665785f, 0.665416f, 0.665313f, 0.665679f, 0.664686f, 0.662061f, 0.659813f, 0.658729f, 0.657658f, 0.656469f, 0.656268f, 0.656891f, 0.657238f, 0.657303f, 0.657243f, + 0.655771f, 0.651744f, 0.645638f, 0.637693f, 0.626755f, 0.612363f, 0.595752f, 0.577822f, 0.558363f, 0.537653f, 0.516647f, 0.495719f, 0.475297f, 0.457049f, 0.442419f, 0.430883f, 0.421223f, 0.413188f, 0.406700f, 0.401222f, 0.396933f, 0.394659f, 0.393933f, 0.392945f, 0.390662f, 0.387246f, 0.382789f, 0.377529f, 0.372623f, 0.368899f, 0.365629f, 0.361963f, 0.358320f, 0.355195f, 0.352156f, 0.348998f, 0.346276f, 0.344053f, 0.341722f, 0.339344f, 0.337548f, 0.336220f, 0.334859f, 0.333734f, 0.333307f, 0.333272f, 0.333372f, 0.334113f, 0.335707f, 0.337542f, 0.339297f, 0.341219f, 0.343021f, 0.344012f, 0.344285f, 0.344318f, 0.343803f, 0.342252f, 0.340023f, 0.337478f, 0.334140f, 0.329736f, 0.324809f, 0.319534f, 0.313397f, 0.306449f, 0.299331f, 0.291965f, 0.283816f, 0.275134f, 0.266430f, 0.257468f, 0.248114f, 0.239081f, 0.230677f, 0.222271f, 0.213733f, 0.205671f, 0.197839f, 0.189344f, 0.180405f, 0.171906f, 0.163769f, 0.155721f, 0.148459f, 0.142253f, 0.136125f, 0.129829f, 0.124280f, 0.119189f, 0.113229f, 0.106765f, 0.101047f, 0.095433f, 0.088960f, 0.082699f, + 0.077090f, 0.070452f, 0.063164f, 0.057658f, 0.052165f, 0.042986f, 0.033716f, 0.029705f, 0.024528f, 0.010022f, -0.003487f, -0.003563f, -0.008281f, -0.044222f, -0.091161f, -0.097337f, -0.059345f, -0.032430f, -0.044938f, -0.063814f, -0.071121f, -0.106555f, -0.189396f, -0.259807f, -0.255503f, -0.202390f, -0.174583f, -0.199128f, -0.246722f, -0.285440f, -0.305850f, -0.323862f, -0.381849f, -0.499832f, -0.602701f, -0.562505f, -0.358033f, -0.132175f, -0.035515f, -0.063390f, -0.105690f, -0.109852f, -0.119592f, -0.173771f, -0.239521f, -0.254709f, -0.192460f, -0.071071f}, + {-0.139811f, -0.337680f, -0.309928f, -0.007865f, 0.460052f, 0.904017f, 1.187273f, 1.245347f, 1.047341f, 0.642813f, 0.178251f, -0.255482f, -0.696327f, -1.065155f, -0.997728f, -0.263824f, 0.669296f, 0.911797f, 0.169209f, -0.827247f, -1.142336f, -0.643160f, 0.071883f, 0.512664f, 0.694340f, 0.796456f, 0.832000f, 0.752642f, 0.618206f, 0.514447f, 0.432971f, 0.329732f, 0.215270f, 0.120320f, 0.037944f, -0.050458f, -0.138590f, -0.216448f, -0.291141f, -0.367466f, -0.437249f, -0.497434f, -0.554267f, -0.607280f, -0.650114f, -0.684871f, -0.717859f, -0.746604f, -0.765897f, -0.779257f, -0.792413f, -0.803890f, -0.811171f, -0.817031f, -0.823086f, -0.826132f, -0.825083f, -0.822817f, -0.819425f, -0.812156f, -0.801947f, -0.792033f, -0.781683f, -0.768517f, -0.754237f, -0.741632f, -0.729521f, -0.716105f, -0.703200f, -0.692765f, -0.683590f, -0.674714f, -0.667761f, -0.663634f, -0.661007f, -0.659222f, -0.658950f, -0.659915f, -0.661194f, -0.662882f, -0.664859f, -0.665785f, -0.665416f, -0.665313f, -0.665679f, -0.664686f, -0.662061f, -0.659813f, -0.658729f, -0.657658f, -0.656469f, -0.656268f, -0.656891f, -0.657238f, -0.657303f, -0.657243f, + -0.655771f, -0.651744f, -0.645638f, -0.637693f, -0.626755f, -0.612363f, -0.595752f, -0.577822f, -0.558363f, -0.537653f, -0.516647f, -0.495719f, -0.475297f, -0.457049f, -0.442419f, -0.430883f, -0.421223f, -0.413188f, -0.406700f, -0.401222f, -0.396933f, -0.394659f, -0.393933f, -0.392945f, -0.390662f, -0.387246f, -0.382789f, -0.377529f, -0.372623f, -0.368899f, -0.365629f, -0.361963f, -0.358320f, -0.355195f, -0.352156f, -0.348998f, -0.346276f, -0.344053f, -0.341722f, -0.339344f, -0.337548f, -0.336220f, -0.334859f, -0.333734f, -0.333307f, -0.333272f, -0.333372f, -0.334113f, -0.335707f, -0.337542f, -0.339297f, -0.341219f, -0.343021f, -0.344012f, -0.344285f, -0.344318f, -0.343803f, -0.342252f, -0.340023f, -0.337478f, -0.334140f, -0.329736f, -0.324809f, -0.319534f, -0.313397f, -0.306449f, -0.299331f, -0.291965f, -0.283816f, -0.275134f, -0.266430f, -0.257468f, -0.248114f, -0.239081f, -0.230677f, -0.222271f, -0.213733f, -0.205671f, -0.197839f, -0.189344f, -0.180405f, -0.171906f, -0.163769f, -0.155721f, -0.148459f, -0.142253f, -0.136125f, -0.129829f, -0.124280f, -0.119189f, -0.113229f, -0.106765f, -0.101047f, -0.095433f, -0.088960f, -0.082699f, + -0.077090f, -0.070452f, -0.063164f, -0.057658f, -0.052165f, -0.042986f, -0.033716f, -0.029705f, -0.024528f, -0.010022f, 0.003487f, 0.003563f, 0.008281f, 0.044222f, 0.091161f, 0.097337f, 0.059345f, 0.032430f, 0.044938f, 0.063814f, 0.071121f, 0.106555f, 0.189396f, 0.259807f, 0.255503f, 0.202390f, 0.174583f, 0.199128f, 0.246722f, 0.285440f, 0.305850f, 0.323862f, 0.381849f, 0.499832f, 0.602701f, 0.562505f, 0.358033f, 0.132175f, 0.035515f, 0.063390f, 0.105690f, 0.109852f, 0.119592f, 0.173771f, 0.239521f, 0.254709f, 0.192460f, 0.071071f} + }, + { + {-0.016781f, -0.068243f, -0.130746f, -0.141416f, -0.067559f, 0.038187f, 0.093997f, 0.073178f, 0.011465f, -0.045861f, -0.075899f, -0.068574f, -0.019327f, 0.052634f, 0.094768f, 0.060753f, -0.027027f, -0.077305f, -0.023530f, 0.088252f, 0.138743f, 0.067072f, -0.068421f, -0.168551f, -0.195815f, -0.179551f, -0.154143f, -0.128577f, -0.102726f, -0.079391f, -0.057784f, -0.033774f, -0.009097f, 0.009560f, 0.019329f, 0.021904f, 0.018986f, 0.013454f, 0.011658f, 0.018744f, 0.033844f, 0.053207f, 0.075186f, 0.099543f, 0.125114f, 0.150979f, 0.177911f, 0.206990f, 0.238370f, 0.272065f, 0.308056f, 0.345140f, 0.381215f, 0.414936f, 0.445808f, 0.472862f, 0.494658f, 0.510583f, 0.520909f, 0.525555f, 0.523765f, 0.515041f, 0.499435f, 0.476740f, 0.446232f, 0.407570f, 0.361399f, 0.308775f, 0.250601f, 0.188053f, 0.122990f, 0.057485f, -0.006595f, -0.067182f, -0.121979f, -0.169504f, -0.209530f, -0.241819f, -0.265268f, -0.279334f, -0.285567f, -0.286357f, -0.282397f, -0.272798f, -0.257898f, -0.240486f, -0.223313f, -0.206272f, -0.187317f, -0.165922f, -0.144335f, -0.125136f, -0.108811f, -0.094377f, -0.081395f, -0.070507f, + -0.062659f, -0.058663f, -0.058998f, -0.063313f, -0.070418f, -0.079177f, -0.089168f, -0.100422f, -0.112928f, -0.126214f, -0.138846f, -0.148727f, -0.154652f, -0.157196f, -0.157495f, -0.155734f, -0.151422f, -0.144279f, -0.134159f, -0.120888f, -0.104827f, -0.086912f, -0.067889f, -0.048281f, -0.029015f, -0.011094f, 0.005181f, 0.019751f, 0.031977f, 0.041217f, 0.047615f, 0.051560f, 0.053135f, 0.052694f, 0.050946f, 0.048096f, 0.044101f, 0.039876f, 0.036856f, 0.035478f, 0.035381f, 0.036484f, 0.038318f, 0.039253f, 0.038058f, 0.035282f, 0.031776f, 0.027264f, 0.021518f, 0.015211f, 0.008590f, 0.001128f, -0.006896f, -0.014429f, -0.021357f, -0.028208f, -0.034548f, -0.039784f, -0.044670f, -0.050039f, -0.055371f, -0.060341f, -0.065860f, -0.072126f, -0.078038f, -0.083530f, -0.089755f, -0.096500f, -0.102463f, -0.107840f, -0.113445f, -0.118322f, -0.121541f, -0.124548f, -0.128590f, -0.132518f, -0.135868f, -0.140523f, -0.147120f, -0.154177f, -0.162021f, -0.172330f, -0.183624f, -0.193140f, -0.201940f, -0.211830f, -0.220237f, -0.224852f, -0.228495f, -0.232832f, -0.234204f, -0.231610f, -0.229485f, -0.228034f, -0.222763f, -0.215763f, + -0.212373f, -0.207950f, -0.196785f, -0.187807f, -0.187735f, -0.181688f, -0.161030f, -0.148748f, -0.156874f, -0.151004f, -0.112810f, -0.094549f, -0.130495f, -0.140613f, -0.036068f, 0.110983f, 0.139885f, 0.034927f, -0.060252f, -0.070101f, -0.069384f, -0.102012f, -0.083008f, 0.039303f, 0.160141f, 0.158502f, 0.064730f, -0.005748f, -0.015098f, -0.015700f, -0.048894f, -0.098403f, -0.116107f, -0.060059f, 0.057678f, 0.146655f, 0.115290f, -0.010018f, -0.101454f, -0.085603f, -0.021018f, 0.005687f, -0.004967f, 0.000661f, 0.032397f, 0.052112f, 0.040359f, 0.013723f}, + {-0.016781f, -0.068243f, -0.130746f, -0.141416f, -0.067559f, 0.038187f, 0.093997f, 0.073178f, 0.011465f, -0.045861f, -0.075899f, -0.068574f, -0.019327f, 0.052634f, 0.094768f, 0.060753f, -0.027027f, -0.077305f, -0.023530f, 0.088252f, 0.138743f, 0.067072f, -0.068421f, -0.168551f, -0.195815f, -0.179551f, -0.154143f, -0.128577f, -0.102726f, -0.079391f, -0.057784f, -0.033774f, -0.009097f, 0.009560f, 0.019329f, 0.021904f, 0.018986f, 0.013454f, 0.011658f, 0.018744f, 0.033844f, 0.053207f, 0.075186f, 0.099543f, 0.125114f, 0.150979f, 0.177911f, 0.206990f, 0.238370f, 0.272065f, 0.308056f, 0.345140f, 0.381215f, 0.414936f, 0.445808f, 0.472862f, 0.494658f, 0.510583f, 0.520909f, 0.525555f, 0.523765f, 0.515041f, 0.499435f, 0.476740f, 0.446232f, 0.407570f, 0.361399f, 0.308775f, 0.250601f, 0.188053f, 0.122990f, 0.057485f, -0.006595f, -0.067182f, -0.121979f, -0.169504f, -0.209530f, -0.241819f, -0.265268f, -0.279334f, -0.285567f, -0.286357f, -0.282397f, -0.272798f, -0.257898f, -0.240486f, -0.223313f, -0.206272f, -0.187317f, -0.165922f, -0.144335f, -0.125136f, -0.108811f, -0.094377f, -0.081395f, -0.070507f, + -0.062659f, -0.058663f, -0.058998f, -0.063313f, -0.070418f, -0.079177f, -0.089168f, -0.100422f, -0.112928f, -0.126214f, -0.138846f, -0.148727f, -0.154652f, -0.157196f, -0.157495f, -0.155734f, -0.151422f, -0.144279f, -0.134159f, -0.120888f, -0.104827f, -0.086912f, -0.067889f, -0.048281f, -0.029015f, -0.011094f, 0.005181f, 0.019751f, 0.031977f, 0.041217f, 0.047615f, 0.051560f, 0.053135f, 0.052694f, 0.050946f, 0.048096f, 0.044101f, 0.039876f, 0.036856f, 0.035478f, 0.035381f, 0.036484f, 0.038318f, 0.039253f, 0.038058f, 0.035282f, 0.031776f, 0.027264f, 0.021518f, 0.015211f, 0.008590f, 0.001128f, -0.006896f, -0.014429f, -0.021357f, -0.028208f, -0.034548f, -0.039784f, -0.044670f, -0.050039f, -0.055371f, -0.060341f, -0.065860f, -0.072126f, -0.078038f, -0.083530f, -0.089755f, -0.096500f, -0.102463f, -0.107840f, -0.113445f, -0.118322f, -0.121541f, -0.124548f, -0.128590f, -0.132518f, -0.135868f, -0.140523f, -0.147120f, -0.154177f, -0.162021f, -0.172330f, -0.183624f, -0.193140f, -0.201940f, -0.211830f, -0.220237f, -0.224852f, -0.228495f, -0.232832f, -0.234204f, -0.231610f, -0.229485f, -0.228034f, -0.222763f, -0.215763f, + -0.212373f, -0.207950f, -0.196785f, -0.187807f, -0.187735f, -0.181688f, -0.161030f, -0.148748f, -0.156874f, -0.151004f, -0.112810f, -0.094549f, -0.130495f, -0.140613f, -0.036068f, 0.110983f, 0.139885f, 0.034927f, -0.060252f, -0.070101f, -0.069384f, -0.102012f, -0.083008f, 0.039303f, 0.160141f, 0.158502f, 0.064730f, -0.005748f, -0.015098f, -0.015700f, -0.048894f, -0.098403f, -0.116107f, -0.060059f, 0.057678f, 0.146655f, 0.115290f, -0.010018f, -0.101454f, -0.085603f, -0.021018f, 0.005687f, -0.004967f, 0.000661f, 0.032397f, 0.052112f, 0.040359f, 0.013723f} + }, + { + {0.006419f, -0.000380f, -0.044417f, -0.097071f, -0.106348f, -0.055854f, 0.004864f, 0.009382f, -0.047117f, -0.104090f, -0.111791f, -0.074420f, -0.009073f, 0.081673f, 0.159525f, 0.135409f, -0.015787f, -0.158879f, -0.117328f, 0.102390f, 0.292403f, 0.276855f, 0.089234f, -0.117191f, -0.257832f, -0.352481f, -0.428424f, -0.472227f, -0.470382f, -0.436585f, -0.386629f, -0.319685f, -0.232981f, -0.133703f, -0.030900f, 0.070632f, 0.166068f, 0.249726f, 0.319333f, 0.375582f, 0.418982f, 0.450841f, 0.474355f, 0.491560f, 0.502057f, 0.506326f, 0.506785f, 0.504408f, 0.497667f, 0.485632f, 0.469281f, 0.449749f, 0.428169f, 0.407143f, 0.389707f, 0.376669f, 0.366612f, 0.357997f, 0.349801f, 0.340868f, 0.330294f, 0.318219f, 0.305334f, 0.291955f, 0.278163f, 0.264312f, 0.250670f, 0.236749f, 0.221537f, 0.204458f, 0.185733f, 0.165583f, 0.143517f, 0.119055f, 0.092907f, 0.066472f, 0.040271f, 0.014131f, -0.011039f, -0.033282f, -0.051808f, -0.067531f, -0.080714f, -0.089863f, -0.094019f, -0.094607f, -0.093686f, -0.091642f, -0.087952f, -0.083101f, -0.078109f, -0.072686f, -0.065387f, -0.055476f, -0.043458f, -0.029662f, + -0.013257f, 0.006916f, 0.031000f, 0.057968f, 0.086658f, 0.116744f, 0.148568f, 0.181979f, 0.215566f, 0.247404f, 0.276573f, 0.303534f, 0.328908f, 0.352272f, 0.372331f, 0.388025f, 0.399465f, 0.408063f, 0.415676f, 0.423147f, 0.429593f, 0.433431f, 0.434049f, 0.432310f, 0.429814f, 0.428057f, 0.427836f, 0.428809f, 0.429787f, 0.429913f, 0.429361f, 0.428784f, 0.428608f, 0.429050f, 0.430098f, 0.431131f, 0.431113f, 0.429393f, 0.425893f, 0.420648f, 0.413761f, 0.405616f, 0.396473f, 0.386033f, 0.373928f, 0.360298f, 0.345527f, 0.329947f, 0.314161f, 0.299015f, 0.284997f, 0.272196f, 0.260812f, 0.251021f, 0.242599f, 0.235398f, 0.229778f, 0.225921f, 0.223433f, 0.222164f, 0.222404f, 0.223783f, 0.225163f, 0.226017f, 0.226580f, 0.226598f, 0.225440f, 0.223398f, 0.221323f, 0.219343f, 0.217296f, 0.215536f, 0.213959f, 0.211506f, 0.207783f, 0.203519f, 0.198702f, 0.192425f, 0.184911f, 0.177078f, 0.168256f, 0.157265f, 0.144949f, 0.132581f, 0.119457f, 0.105218f, 0.091890f, 0.080542f, 0.069569f, 0.058845f, 0.050696f, 0.044902f, 0.038873f, 0.033407f, 0.030820f, 0.028752f, + 0.024794f, 0.023084f, 0.025581f, 0.025045f, 0.019741f, 0.021233f, 0.031130f, 0.031471f, 0.020092f, 0.024258f, 0.047646f, 0.046851f, 0.010282f, 0.010120f, 0.099751f, 0.203325f, 0.205161f, 0.119406f, 0.059799f, 0.059279f, 0.047887f, 0.012235f, 0.034847f, 0.136400f, 0.209510f, 0.173631f, 0.089751f, 0.051420f, 0.052166f, 0.034003f, -0.009700f, -0.054980f, -0.105932f, -0.156941f, -0.150251f, -0.050937f, 0.072024f, 0.116139f, 0.076669f, 0.039024f, 0.051258f, 0.072987f, 0.059581f, 0.035660f, 0.051333f, 0.098827f, 0.112731f, 0.050734f}, + {0.006419f, -0.000380f, -0.044417f, -0.097071f, -0.106348f, -0.055854f, 0.004864f, 0.009382f, -0.047117f, -0.104090f, -0.111791f, -0.074420f, -0.009073f, 0.081673f, 0.159525f, 0.135409f, -0.015787f, -0.158879f, -0.117328f, 0.102390f, 0.292403f, 0.276855f, 0.089234f, -0.117191f, -0.257832f, -0.352481f, -0.428424f, -0.472227f, -0.470382f, -0.436585f, -0.386629f, -0.319685f, -0.232981f, -0.133703f, -0.030900f, 0.070632f, 0.166068f, 0.249726f, 0.319333f, 0.375582f, 0.418982f, 0.450841f, 0.474355f, 0.491560f, 0.502057f, 0.506326f, 0.506785f, 0.504408f, 0.497667f, 0.485632f, 0.469281f, 0.449749f, 0.428169f, 0.407143f, 0.389707f, 0.376669f, 0.366612f, 0.357997f, 0.349801f, 0.340868f, 0.330294f, 0.318219f, 0.305334f, 0.291955f, 0.278163f, 0.264312f, 0.250670f, 0.236749f, 0.221537f, 0.204458f, 0.185733f, 0.165583f, 0.143517f, 0.119055f, 0.092907f, 0.066472f, 0.040271f, 0.014131f, -0.011039f, -0.033282f, -0.051808f, -0.067531f, -0.080714f, -0.089863f, -0.094019f, -0.094607f, -0.093686f, -0.091642f, -0.087952f, -0.083101f, -0.078109f, -0.072686f, -0.065387f, -0.055476f, -0.043458f, -0.029662f, + -0.013257f, 0.006916f, 0.031000f, 0.057968f, 0.086658f, 0.116744f, 0.148568f, 0.181979f, 0.215566f, 0.247404f, 0.276573f, 0.303534f, 0.328908f, 0.352272f, 0.372331f, 0.388025f, 0.399465f, 0.408063f, 0.415676f, 0.423147f, 0.429593f, 0.433431f, 0.434049f, 0.432310f, 0.429814f, 0.428057f, 0.427836f, 0.428809f, 0.429787f, 0.429913f, 0.429361f, 0.428784f, 0.428608f, 0.429050f, 0.430098f, 0.431131f, 0.431113f, 0.429393f, 0.425893f, 0.420648f, 0.413761f, 0.405616f, 0.396473f, 0.386033f, 0.373928f, 0.360298f, 0.345527f, 0.329947f, 0.314161f, 0.299015f, 0.284997f, 0.272196f, 0.260812f, 0.251021f, 0.242599f, 0.235398f, 0.229778f, 0.225921f, 0.223433f, 0.222164f, 0.222404f, 0.223783f, 0.225163f, 0.226017f, 0.226580f, 0.226598f, 0.225440f, 0.223398f, 0.221323f, 0.219343f, 0.217296f, 0.215536f, 0.213959f, 0.211506f, 0.207783f, 0.203519f, 0.198702f, 0.192425f, 0.184911f, 0.177078f, 0.168256f, 0.157265f, 0.144949f, 0.132581f, 0.119457f, 0.105218f, 0.091890f, 0.080542f, 0.069569f, 0.058845f, 0.050696f, 0.044902f, 0.038873f, 0.033407f, 0.030820f, 0.028752f, + 0.024794f, 0.023084f, 0.025581f, 0.025045f, 0.019741f, 0.021233f, 0.031130f, 0.031471f, 0.020092f, 0.024258f, 0.047646f, 0.046851f, 0.010282f, 0.010120f, 0.099751f, 0.203325f, 0.205161f, 0.119406f, 0.059799f, 0.059279f, 0.047887f, 0.012235f, 0.034847f, 0.136400f, 0.209510f, 0.173631f, 0.089751f, 0.051420f, 0.052166f, 0.034003f, -0.009700f, -0.054980f, -0.105932f, -0.156941f, -0.150251f, -0.050937f, 0.072024f, 0.116139f, 0.076669f, 0.039024f, 0.051258f, 0.072987f, 0.059581f, 0.035660f, 0.051333f, 0.098827f, 0.112731f, 0.050734f} + }, + { + {-0.004145f, -0.003666f, 0.011472f, 0.025737f, 0.020888f, 0.002681f, -0.005708f, -0.001729f, -0.016346f, -0.075712f, -0.160203f, -0.207765f, -0.152869f, 0.017357f, 0.211441f, 0.262841f, 0.087261f, -0.176895f, -0.266228f, -0.075175f, 0.219293f, 0.361347f, 0.282230f, 0.104299f, -0.053635f, -0.176306f, -0.281631f, -0.353803f, -0.373719f, -0.355618f, -0.322626f, -0.277765f, -0.217383f, -0.148569f, -0.078599f, -0.004588f, 0.075448f, 0.153048f, 0.217527f, 0.265298f, 0.297854f, 0.317827f, 0.329255f, 0.336467f, 0.341363f, 0.344354f, 0.346614f, 0.348711f, 0.348971f, 0.345749f, 0.339625f, 0.331802f, 0.322488f, 0.312203f, 0.302613f, 0.294865f, 0.288630f, 0.283324f, 0.278784f, 0.274543f, 0.269837f, 0.264413f, 0.258247f, 0.250753f, 0.241341f, 0.230387f, 0.218578f, 0.205635f, 0.190698f, 0.173676f, 0.155193f, 0.135271f, 0.113074f, 0.088233f, 0.061586f, 0.034088f, 0.005671f, -0.023848f, -0.053155f, -0.080091f, -0.104054f, -0.126354f, -0.147577f, -0.166135f, -0.180635f, -0.192361f, -0.203590f, -0.214103f, -0.221263f, -0.223474f, -0.221824f, -0.217974f, -0.211925f, -0.202660f, -0.190084f, -0.175511f, + -0.160523f, -0.145801f, -0.131012f, -0.115698f, -0.100234f, -0.085751f, -0.073156f, -0.062624f, -0.054028f, -0.047150f, -0.041205f, -0.034932f, -0.027678f, -0.019998f, -0.012848f, -0.006575f, -0.000758f, 0.005551f, 0.013454f, 0.023353f, 0.034257f, 0.044468f, 0.053061f, 0.060377f, 0.067374f, 0.075053f, 0.084164f, 0.094773f, 0.106230f, 0.117963f, 0.129996f, 0.142510f, 0.155380f, 0.168334f, 0.180912f, 0.192154f, 0.200956f, 0.206850f, 0.209945f, 0.210369f, 0.208393f, 0.204697f, 0.199808f, 0.193700f, 0.186516f, 0.179137f, 0.172540f, 0.167322f, 0.164156f, 0.163805f, 0.166348f, 0.171193f, 0.177950f, 0.186502f, 0.196457f, 0.207441f, 0.219566f, 0.232839f, 0.246720f, 0.260848f, 0.275255f, 0.289353f, 0.301890f, 0.312265f, 0.320652f, 0.326802f, 0.330234f, 0.331393f, 0.331081f, 0.329265f, 0.325882f, 0.321843f, 0.317809f, 0.313301f, 0.308200f, 0.303376f, 0.298948f, 0.294010f, 0.288493f, 0.282922f, 0.276566f, 0.268585f, 0.260096f, 0.252244f, 0.244001f, 0.234745f, 0.226212f, 0.219060f, 0.211305f, 0.202525f, 0.194820f, 0.188050f, 0.180130f, 0.172258f, 0.166654f, 0.160911f, + 0.153056f, 0.147449f, 0.145612f, 0.140126f, 0.129723f, 0.125834f, 0.129084f, 0.121600f, 0.102649f, 0.099485f, 0.113861f, 0.102603f, 0.058029f, 0.054997f, 0.145041f, 0.249571f, 0.251898f, 0.163725f, 0.095922f, 0.086161f, 0.074951f, 0.048383f, 0.072896f, 0.160524f, 0.219423f, 0.186863f, 0.115135f, 0.076735f, 0.067205f, 0.048319f, 0.014202f, -0.026677f, -0.067100f, -0.065851f, 0.027911f, 0.176276f, 0.254369f, 0.199913f, 0.095255f, 0.049417f, 0.061851f, 0.063067f, 0.033342f, 0.006788f, -0.006173f, -0.024075f, -0.038289f, -0.020048f}, + {0.004145f, 0.003666f, -0.011472f, -0.025737f, -0.020888f, -0.002681f, 0.005708f, 0.001729f, 0.016346f, 0.075712f, 0.160203f, 0.207765f, 0.152869f, -0.017357f, -0.211441f, -0.262841f, -0.087261f, 0.176895f, 0.266228f, 0.075175f, -0.219293f, -0.361347f, -0.282230f, -0.104299f, 0.053635f, 0.176306f, 0.281631f, 0.353803f, 0.373719f, 0.355618f, 0.322626f, 0.277765f, 0.217383f, 0.148569f, 0.078599f, 0.004588f, -0.075448f, -0.153048f, -0.217527f, -0.265298f, -0.297854f, -0.317827f, -0.329255f, -0.336467f, -0.341363f, -0.344354f, -0.346614f, -0.348711f, -0.348971f, -0.345749f, -0.339625f, -0.331802f, -0.322488f, -0.312203f, -0.302613f, -0.294865f, -0.288630f, -0.283324f, -0.278784f, -0.274543f, -0.269837f, -0.264413f, -0.258247f, -0.250753f, -0.241341f, -0.230387f, -0.218578f, -0.205635f, -0.190698f, -0.173676f, -0.155193f, -0.135271f, -0.113074f, -0.088233f, -0.061586f, -0.034088f, -0.005671f, 0.023848f, 0.053155f, 0.080091f, 0.104054f, 0.126354f, 0.147577f, 0.166135f, 0.180635f, 0.192361f, 0.203590f, 0.214103f, 0.221263f, 0.223474f, 0.221824f, 0.217974f, 0.211925f, 0.202660f, 0.190084f, 0.175511f, + 0.160523f, 0.145801f, 0.131012f, 0.115698f, 0.100234f, 0.085751f, 0.073156f, 0.062624f, 0.054028f, 0.047150f, 0.041205f, 0.034932f, 0.027678f, 0.019998f, 0.012848f, 0.006575f, 0.000758f, -0.005551f, -0.013454f, -0.023353f, -0.034257f, -0.044468f, -0.053061f, -0.060377f, -0.067374f, -0.075053f, -0.084164f, -0.094773f, -0.106230f, -0.117963f, -0.129996f, -0.142510f, -0.155380f, -0.168334f, -0.180912f, -0.192154f, -0.200956f, -0.206850f, -0.209945f, -0.210369f, -0.208393f, -0.204697f, -0.199808f, -0.193700f, -0.186516f, -0.179137f, -0.172540f, -0.167322f, -0.164156f, -0.163805f, -0.166348f, -0.171193f, -0.177950f, -0.186502f, -0.196457f, -0.207441f, -0.219566f, -0.232839f, -0.246720f, -0.260848f, -0.275255f, -0.289353f, -0.301890f, -0.312265f, -0.320652f, -0.326802f, -0.330234f, -0.331393f, -0.331081f, -0.329265f, -0.325882f, -0.321843f, -0.317809f, -0.313301f, -0.308200f, -0.303376f, -0.298948f, -0.294010f, -0.288493f, -0.282922f, -0.276566f, -0.268585f, -0.260096f, -0.252244f, -0.244001f, -0.234745f, -0.226212f, -0.219060f, -0.211305f, -0.202525f, -0.194820f, -0.188050f, -0.180130f, -0.172258f, -0.166654f, -0.160911f, + -0.153056f, -0.147449f, -0.145612f, -0.140126f, -0.129723f, -0.125834f, -0.129084f, -0.121600f, -0.102649f, -0.099485f, -0.113861f, -0.102603f, -0.058029f, -0.054997f, -0.145041f, -0.249571f, -0.251898f, -0.163725f, -0.095922f, -0.086161f, -0.074951f, -0.048383f, -0.072896f, -0.160524f, -0.219423f, -0.186863f, -0.115135f, -0.076735f, -0.067205f, -0.048319f, -0.014202f, 0.026677f, 0.067100f, 0.065851f, -0.027911f, -0.176276f, -0.254369f, -0.199913f, -0.095255f, -0.049417f, -0.061851f, -0.063067f, -0.033342f, -0.006788f, 0.006173f, 0.024075f, 0.038289f, 0.020048f} + }, + { + {-0.021669f, -0.023685f, 0.023828f, 0.034018f, -0.023524f, -0.049286f, 0.040503f, 0.161875f, 0.150811f, -0.019734f, -0.197676f, -0.229030f, -0.106401f, 0.062770f, 0.162365f, 0.129952f, -0.007762f, -0.128175f, -0.106139f, 0.044971f, 0.173666f, 0.163889f, 0.058328f, -0.023611f, -0.033294f, -0.007600f, 0.017864f, 0.044155f, 0.072516f, 0.086941f, 0.077826f, 0.052501f, 0.019845f, -0.016546f, -0.051887f, -0.081943f, -0.109000f, -0.136036f, -0.158638f, -0.169848f, -0.168532f, -0.157762f, -0.140048f, -0.118475f, -0.097856f, -0.081023f, -0.066814f, -0.053083f, -0.038732f, -0.022657f, -0.003922f, 0.016835f, 0.038572f, 0.061908f, 0.087943f, 0.115804f, 0.143100f, 0.168000f, 0.189456f, 0.206191f, 0.216814f, 0.220647f, 0.217699f, 0.207967f, 0.191048f, 0.166404f, 0.133914f, 0.094053f, 0.047458f, -0.005253f, -0.062902f, -0.123378f, -0.184188f, -0.242930f, -0.297204f, -0.344947f, -0.385106f, -0.417196f, -0.440297f, -0.453766f, -0.458836f, -0.457795f, -0.451309f, -0.438205f, -0.418365f, -0.394081f, -0.367688f, -0.339298f, -0.307922f, -0.273643f, -0.237339f, -0.199024f, -0.157916f, -0.114031f, -0.068508f, -0.022295f, + 0.024378f, 0.070864f, 0.115420f, 0.156302f, 0.192913f, 0.225272f, 0.252645f, 0.273162f, 0.284913f, 0.287670f, 0.283774f, 0.276781f, 0.268540f, 0.257900f, 0.242812f, 0.223195f, 0.201277f, 0.179871f, 0.160911f, 0.144831f, 0.130605f, 0.116910f, 0.103678f, 0.091983f, 0.082527f, 0.075057f, 0.068993f, 0.063538f, 0.057488f, 0.050008f, 0.041284f, 0.031626f, 0.020682f, 0.008290f, -0.004841f, -0.017983f, -0.030869f, -0.042934f, -0.053314f, -0.061863f, -0.068957f, -0.074456f, -0.078162f, -0.080807f, -0.083164f, -0.084941f, -0.085810f, -0.086426f, -0.087233f, -0.087667f, -0.087431f, -0.086993f, -0.086222f, -0.084410f, -0.081830f, -0.079316f, -0.076543f, -0.072767f, -0.068486f, -0.064301f, -0.059443f, -0.053446f, -0.047480f, -0.042320f, -0.037216f, -0.032146f, -0.028420f, -0.026114f, -0.023941f, -0.021979f, -0.021258f, -0.021151f, -0.020625f, -0.020834f, -0.023040f, -0.026119f, -0.029262f, -0.034092f, -0.041349f, -0.049446f, -0.058245f, -0.069370f, -0.081739f, -0.092511f, -0.102306f, -0.113154f, -0.123020f, -0.129316f, -0.134387f, -0.140442f, -0.144425f, -0.144702f, -0.145130f, -0.146612f, -0.144890f, -0.140872f, + -0.139791f, -0.138608f, -0.131360f, -0.124680f, -0.126031f, -0.124079f, -0.109182f, -0.099237f, -0.107590f, -0.107222f, -0.078014f, -0.060004f, -0.087081f, -0.098386f, -0.015611f, 0.107616f, 0.131899f, 0.033279f, -0.065099f, -0.084123f, -0.081752f, -0.110294f, -0.109745f, -0.022550f, 0.083650f, 0.098982f, 0.017454f, -0.075044f, -0.120096f, -0.135564f, -0.165934f, -0.217688f, -0.234747f, -0.144650f, 0.038500f, 0.179477f, 0.153231f, 0.002298f, -0.107319f, -0.088405f, -0.015190f, 0.008703f, -0.016573f, -0.026527f, -0.001403f, 0.023135f, 0.022859f, 0.008202f}, + {0.021669f, 0.023685f, -0.023828f, -0.034018f, 0.023524f, 0.049286f, -0.040503f, -0.161875f, -0.150811f, 0.019734f, 0.197676f, 0.229030f, 0.106401f, -0.062770f, -0.162365f, -0.129952f, 0.007762f, 0.128175f, 0.106139f, -0.044971f, -0.173666f, -0.163889f, -0.058328f, 0.023611f, 0.033294f, 0.007600f, -0.017864f, -0.044155f, -0.072516f, -0.086941f, -0.077826f, -0.052501f, -0.019845f, 0.016546f, 0.051887f, 0.081943f, 0.109000f, 0.136036f, 0.158638f, 0.169848f, 0.168532f, 0.157762f, 0.140048f, 0.118475f, 0.097856f, 0.081023f, 0.066814f, 0.053083f, 0.038732f, 0.022657f, 0.003922f, -0.016835f, -0.038572f, -0.061908f, -0.087943f, -0.115804f, -0.143100f, -0.168000f, -0.189456f, -0.206191f, -0.216814f, -0.220647f, -0.217699f, -0.207967f, -0.191048f, -0.166404f, -0.133914f, -0.094053f, -0.047458f, 0.005253f, 0.062902f, 0.123378f, 0.184188f, 0.242930f, 0.297204f, 0.344947f, 0.385106f, 0.417196f, 0.440297f, 0.453766f, 0.458836f, 0.457795f, 0.451309f, 0.438205f, 0.418365f, 0.394081f, 0.367688f, 0.339298f, 0.307922f, 0.273643f, 0.237339f, 0.199024f, 0.157916f, 0.114031f, 0.068508f, 0.022295f, + -0.024378f, -0.070864f, -0.115420f, -0.156302f, -0.192913f, -0.225272f, -0.252645f, -0.273162f, -0.284913f, -0.287670f, -0.283774f, -0.276781f, -0.268540f, -0.257900f, -0.242812f, -0.223195f, -0.201277f, -0.179871f, -0.160911f, -0.144831f, -0.130605f, -0.116910f, -0.103678f, -0.091983f, -0.082527f, -0.075057f, -0.068993f, -0.063538f, -0.057488f, -0.050008f, -0.041284f, -0.031626f, -0.020682f, -0.008290f, 0.004841f, 0.017983f, 0.030869f, 0.042934f, 0.053314f, 0.061863f, 0.068957f, 0.074456f, 0.078162f, 0.080807f, 0.083164f, 0.084941f, 0.085810f, 0.086426f, 0.087233f, 0.087667f, 0.087431f, 0.086993f, 0.086222f, 0.084410f, 0.081830f, 0.079316f, 0.076543f, 0.072767f, 0.068486f, 0.064301f, 0.059443f, 0.053446f, 0.047480f, 0.042320f, 0.037216f, 0.032146f, 0.028420f, 0.026114f, 0.023941f, 0.021979f, 0.021258f, 0.021151f, 0.020625f, 0.020834f, 0.023040f, 0.026119f, 0.029262f, 0.034092f, 0.041349f, 0.049446f, 0.058245f, 0.069370f, 0.081739f, 0.092511f, 0.102306f, 0.113154f, 0.123020f, 0.129316f, 0.134387f, 0.140442f, 0.144425f, 0.144702f, 0.145130f, 0.146612f, 0.144890f, 0.140872f, + 0.139791f, 0.138608f, 0.131360f, 0.124680f, 0.126031f, 0.124079f, 0.109182f, 0.099237f, 0.107590f, 0.107222f, 0.078014f, 0.060004f, 0.087081f, 0.098386f, 0.015611f, -0.107616f, -0.131899f, -0.033279f, 0.065099f, 0.084123f, 0.081752f, 0.110294f, 0.109745f, 0.022550f, -0.083650f, -0.098982f, -0.017454f, 0.075044f, 0.120096f, 0.135564f, 0.165934f, 0.217688f, 0.234747f, 0.144650f, -0.038500f, -0.179477f, -0.153231f, -0.002298f, 0.107319f, 0.088405f, 0.015190f, -0.008703f, 0.016573f, 0.026527f, 0.001403f, -0.023135f, -0.022859f, -0.008202f} + }, + { + {0.003490f, -0.006226f, -0.035846f, -0.051515f, -0.041640f, -0.036076f, -0.045949f, -0.026763f, 0.066247f, 0.214586f, 0.349145f, 0.387379f, 0.248996f, -0.075217f, -0.411222f, -0.465190f, -0.135467f, 0.290951f, 0.408104f, 0.149776f, -0.165632f, -0.250425f, -0.140194f, -0.027408f, 0.020877f, 0.060945f, 0.105649f, 0.105114f, 0.053903f, 0.006713f, -0.005167f, -0.000920f, 0.000082f, 0.001162f, 0.003555f, -0.001284f, -0.014085f, -0.027073f, -0.038241f, -0.050923f, -0.065125f, -0.079722f, -0.096066f, -0.112906f, -0.125552f, -0.133576f, -0.141406f, -0.150172f, -0.156901f, -0.161372f, -0.166117f, -0.170690f, -0.172431f, -0.171130f, -0.167726f, -0.160965f, -0.149498f, -0.134444f, -0.116933f, -0.096204f, -0.071970f, -0.045391f, -0.016742f, 0.014649f, 0.047943f, 0.081229f, 0.113842f, 0.145533f, 0.174464f, 0.198570f, 0.217592f, 0.231713f, 0.239760f, 0.240421f, 0.233709f, 0.220058f, 0.199450f, 0.172046f, 0.138437f, 0.099252f, 0.055563f, 0.009024f, -0.039375f, -0.089650f, -0.141184f, -0.192202f, -0.241534f, -0.289259f, -0.335192f, -0.378497f, -0.418885f, -0.456107f, -0.488166f, -0.512093f, -0.526677f, -0.532781f, + -0.531064f, -0.520888f, -0.501308f, -0.472277f, -0.435515f, -0.394864f, -0.354737f, -0.317425f, -0.282773f, -0.250772f, -0.223195f, -0.202435f, -0.189950f, -0.186050f, -0.189968f, -0.199904f, -0.213864f, -0.230597f, -0.249442f, -0.269776f, -0.291088f, -0.312839f, -0.333762f, -0.352022f, -0.366526f, -0.377502f, -0.385752f, -0.392049f, -0.397160f, -0.401566f, -0.405131f, -0.407696f, -0.409744f, -0.411829f, -0.413700f, -0.414630f, -0.414284f, -0.412722f, -0.409992f, -0.406200f, -0.401590f, -0.396097f, -0.389065f, -0.379621f, -0.367177f, -0.351595f, -0.333246f, -0.312889f, -0.291241f, -0.268764f, -0.245990f, -0.223712f, -0.202570f, -0.182754f, -0.164339f, -0.147556f, -0.132499f, -0.118902f, -0.106443f, -0.095030f, -0.084602f, -0.074944f, -0.065829f, -0.057130f, -0.048678f, -0.040225f, -0.031636f, -0.022960f, -0.014347f, -0.006068f, 0.001494f, 0.008244f, 0.014668f, 0.021396f, 0.028573f, 0.036064f, 0.044011f, 0.052627f, 0.061660f, 0.070662f, 0.079560f, 0.088346f, 0.096620f, 0.104093f, 0.110970f, 0.117205f, 0.122169f, 0.125646f, 0.128091f, 0.129387f, 0.128805f, 0.126607f, 0.123922f, 0.120854f, 0.116797f, 0.112354f, + 0.108374f, 0.103999f, 0.098631f, 0.093863f, 0.089953f, 0.083871f, 0.075164f, 0.068279f, 0.063593f, 0.054484f, 0.040704f, 0.032538f, 0.030791f, 0.018823f, -0.008680f, -0.027757f, -0.019659f, -0.003550f, -0.004449f, -0.010080f, -0.000027f, 0.002567f, -0.038050f, -0.098261f, -0.113993f, -0.072907f, -0.029749f, -0.023328f, -0.035246f, -0.040054f, -0.038086f, -0.027498f, -0.004695f, -0.004589f, -0.071780f, -0.172134f, -0.206569f, -0.142510f, -0.058281f, -0.022574f, -0.010410f, 0.016164f, 0.034763f, 0.038405f, 0.092021f, 0.212278f, 0.267090f, 0.126265f}, + {0.003490f, -0.006226f, -0.035846f, -0.051515f, -0.041640f, -0.036076f, -0.045949f, -0.026763f, 0.066247f, 0.214586f, 0.349145f, 0.387379f, 0.248996f, -0.075217f, -0.411222f, -0.465190f, -0.135467f, 0.290951f, 0.408104f, 0.149776f, -0.165632f, -0.250425f, -0.140194f, -0.027408f, 0.020877f, 0.060945f, 0.105649f, 0.105114f, 0.053903f, 0.006713f, -0.005167f, -0.000920f, 0.000082f, 0.001162f, 0.003555f, -0.001284f, -0.014085f, -0.027073f, -0.038241f, -0.050923f, -0.065125f, -0.079722f, -0.096066f, -0.112906f, -0.125552f, -0.133576f, -0.141406f, -0.150172f, -0.156901f, -0.161372f, -0.166117f, -0.170690f, -0.172431f, -0.171130f, -0.167726f, -0.160965f, -0.149498f, -0.134444f, -0.116933f, -0.096204f, -0.071970f, -0.045391f, -0.016742f, 0.014649f, 0.047943f, 0.081229f, 0.113842f, 0.145533f, 0.174464f, 0.198570f, 0.217592f, 0.231713f, 0.239760f, 0.240421f, 0.233709f, 0.220058f, 0.199450f, 0.172046f, 0.138437f, 0.099252f, 0.055563f, 0.009024f, -0.039375f, -0.089650f, -0.141184f, -0.192202f, -0.241534f, -0.289259f, -0.335192f, -0.378497f, -0.418885f, -0.456107f, -0.488166f, -0.512093f, -0.526677f, -0.532781f, + -0.531064f, -0.520888f, -0.501308f, -0.472277f, -0.435515f, -0.394864f, -0.354737f, -0.317425f, -0.282773f, -0.250772f, -0.223195f, -0.202435f, -0.189950f, -0.186050f, -0.189968f, -0.199904f, -0.213864f, -0.230597f, -0.249442f, -0.269776f, -0.291088f, -0.312839f, -0.333762f, -0.352022f, -0.366526f, -0.377502f, -0.385752f, -0.392049f, -0.397160f, -0.401566f, -0.405131f, -0.407696f, -0.409744f, -0.411829f, -0.413700f, -0.414630f, -0.414284f, -0.412722f, -0.409992f, -0.406200f, -0.401590f, -0.396097f, -0.389065f, -0.379621f, -0.367177f, -0.351595f, -0.333246f, -0.312889f, -0.291241f, -0.268764f, -0.245990f, -0.223712f, -0.202570f, -0.182754f, -0.164339f, -0.147556f, -0.132499f, -0.118902f, -0.106443f, -0.095030f, -0.084602f, -0.074944f, -0.065829f, -0.057130f, -0.048678f, -0.040225f, -0.031636f, -0.022960f, -0.014347f, -0.006068f, 0.001494f, 0.008244f, 0.014668f, 0.021396f, 0.028573f, 0.036064f, 0.044011f, 0.052627f, 0.061660f, 0.070662f, 0.079560f, 0.088346f, 0.096620f, 0.104093f, 0.110970f, 0.117205f, 0.122169f, 0.125646f, 0.128091f, 0.129387f, 0.128805f, 0.126607f, 0.123922f, 0.120854f, 0.116797f, 0.112354f, + 0.108374f, 0.103999f, 0.098631f, 0.093863f, 0.089953f, 0.083871f, 0.075164f, 0.068279f, 0.063593f, 0.054484f, 0.040704f, 0.032538f, 0.030791f, 0.018823f, -0.008680f, -0.027757f, -0.019659f, -0.003550f, -0.004449f, -0.010080f, -0.000027f, 0.002567f, -0.038050f, -0.098261f, -0.113993f, -0.072907f, -0.029749f, -0.023328f, -0.035246f, -0.040054f, -0.038086f, -0.027498f, -0.004695f, -0.004589f, -0.071780f, -0.172134f, -0.206569f, -0.142510f, -0.058281f, -0.022574f, -0.010410f, 0.016164f, 0.034763f, 0.038405f, 0.092021f, 0.212278f, 0.267090f, 0.126265f} + }, + { + {-0.035472f, -0.081798f, -0.071269f, -0.002255f, 0.102860f, 0.192934f, 0.195307f, 0.077888f, -0.089815f, -0.183178f, -0.148660f, -0.050318f, 0.021927f, 0.047034f, 0.051279f, 0.039696f, 0.000788f, -0.043082f, -0.046115f, -0.002300f, 0.043120f, 0.054272f, 0.044462f, 0.043697f, 0.054210f, 0.056230f, 0.039591f, 0.010104f, -0.026057f, -0.066929f, -0.106323f, -0.133976f, -0.146070f, -0.148720f, -0.149808f, -0.151671f, -0.151914f, -0.146987f, -0.133736f, -0.110668f, -0.079889f, -0.046679f, -0.015936f, 0.010534f, 0.033170f, 0.052610f, 0.069360f, 0.084349f, 0.098446f, 0.111692f, 0.123760f, 0.134762f, 0.144930f, 0.153971f, 0.161484f, 0.167609f, 0.172556f, 0.175798f, 0.176488f, 0.174543f, 0.170771f, 0.166009f, 0.160711f, 0.155506f, 0.151631f, 0.150263f, 0.151447f, 0.154253f, 0.158209f, 0.163925f, 0.171822f, 0.181027f, 0.190414f, 0.200062f, 0.210583f, 0.221416f, 0.230907f, 0.237799f, 0.241620f, 0.241826f, 0.237494f, 0.227842f, 0.212650f, 0.192367f, 0.167818f, 0.139250f, 0.105981f, 0.068046f, 0.027691f, -0.012582f, -0.053404f, -0.097965f, -0.147589f, -0.199683f, -0.250713f, -0.299600f, + -0.347211f, -0.393568f, -0.436641f, -0.473794f, -0.504000f, -0.528334f, -0.547986f, -0.562129f, -0.568657f, -0.567015f, -0.559255f, -0.548048f, -0.534395f, -0.517300f, -0.494938f, -0.466303f, -0.432494f, -0.396273f, -0.359899f, -0.323754f, -0.287306f, -0.250581f, -0.214271f, -0.179261f, -0.146467f, -0.116331f, -0.088268f, -0.061282f, -0.035046f, -0.009658f, 0.015292f, 0.040570f, 0.066577f, 0.093272f, 0.120122f, 0.145742f, 0.168648f, 0.188835f, 0.207643f, 0.226003f, 0.243897f, 0.261131f, 0.277062f, 0.290013f, 0.298689f, 0.303838f, 0.307126f, 0.309188f, 0.310081f, 0.310329f, 0.309928f, 0.307653f, 0.302863f, 0.296760f, 0.290865f, 0.285707f, 0.281670f, 0.279350f, 0.278412f, 0.277635f, 0.276342f, 0.274531f, 0.272081f, 0.269199f, 0.266771f, 0.265042f, 0.263139f, 0.260717f, 0.258256f, 0.255195f, 0.250108f, 0.243164f, 0.235906f, 0.228645f, 0.220748f, 0.212913f, 0.206270f, 0.200266f, 0.194120f, 0.188745f, 0.184754f, 0.181033f, 0.177428f, 0.175609f, 0.175577f, 0.175232f, 0.174471f, 0.175053f, 0.176162f, 0.175457f, 0.173795f, 0.173114f, 0.171744f, 0.167956f, 0.164332f, 0.162227f, + 0.157916f, 0.150729f, 0.146110f, 0.143936f, 0.136426f, 0.124657f, 0.119818f, 0.119996f, 0.109141f, 0.089750f, 0.085717f, 0.095940f, 0.083230f, 0.037463f, 0.009372f, 0.039437f, 0.088203f, 0.089602f, 0.047152f, 0.017437f, 0.014054f, -0.004805f, -0.050861f, -0.073779f, -0.038800f, 0.013222f, 0.018847f, -0.024526f, -0.065147f, -0.073405f, -0.074806f, -0.099582f, -0.126782f, -0.104109f, -0.020258f, 0.067040f, 0.090571f, 0.049397f, 0.005260f, 0.006347f, 0.036806f, 0.050161f, 0.034434f, 0.024218f, 0.050191f, 0.093391f, 0.100755f, 0.044175f}, + {-0.035472f, -0.081798f, -0.071269f, -0.002255f, 0.102860f, 0.192934f, 0.195307f, 0.077888f, -0.089815f, -0.183178f, -0.148660f, -0.050318f, 0.021927f, 0.047034f, 0.051279f, 0.039696f, 0.000788f, -0.043082f, -0.046115f, -0.002300f, 0.043120f, 0.054272f, 0.044462f, 0.043697f, 0.054210f, 0.056230f, 0.039591f, 0.010104f, -0.026057f, -0.066929f, -0.106323f, -0.133976f, -0.146070f, -0.148720f, -0.149808f, -0.151671f, -0.151914f, -0.146987f, -0.133736f, -0.110668f, -0.079889f, -0.046679f, -0.015936f, 0.010534f, 0.033170f, 0.052610f, 0.069360f, 0.084349f, 0.098446f, 0.111692f, 0.123760f, 0.134762f, 0.144930f, 0.153971f, 0.161484f, 0.167609f, 0.172556f, 0.175798f, 0.176488f, 0.174543f, 0.170771f, 0.166009f, 0.160711f, 0.155506f, 0.151631f, 0.150263f, 0.151447f, 0.154253f, 0.158209f, 0.163925f, 0.171822f, 0.181027f, 0.190414f, 0.200062f, 0.210583f, 0.221416f, 0.230907f, 0.237799f, 0.241620f, 0.241826f, 0.237494f, 0.227842f, 0.212650f, 0.192367f, 0.167818f, 0.139250f, 0.105981f, 0.068046f, 0.027691f, -0.012582f, -0.053404f, -0.097965f, -0.147589f, -0.199683f, -0.250713f, -0.299600f, + -0.347211f, -0.393568f, -0.436641f, -0.473794f, -0.504000f, -0.528334f, -0.547986f, -0.562129f, -0.568657f, -0.567015f, -0.559255f, -0.548048f, -0.534395f, -0.517300f, -0.494938f, -0.466303f, -0.432494f, -0.396273f, -0.359899f, -0.323754f, -0.287306f, -0.250581f, -0.214271f, -0.179261f, -0.146467f, -0.116331f, -0.088268f, -0.061282f, -0.035046f, -0.009658f, 0.015292f, 0.040570f, 0.066577f, 0.093272f, 0.120122f, 0.145742f, 0.168648f, 0.188835f, 0.207643f, 0.226003f, 0.243897f, 0.261131f, 0.277062f, 0.290013f, 0.298689f, 0.303838f, 0.307126f, 0.309188f, 0.310081f, 0.310329f, 0.309928f, 0.307653f, 0.302863f, 0.296760f, 0.290865f, 0.285707f, 0.281670f, 0.279350f, 0.278412f, 0.277635f, 0.276342f, 0.274531f, 0.272081f, 0.269199f, 0.266771f, 0.265042f, 0.263139f, 0.260717f, 0.258256f, 0.255195f, 0.250108f, 0.243164f, 0.235906f, 0.228645f, 0.220748f, 0.212913f, 0.206270f, 0.200266f, 0.194120f, 0.188745f, 0.184754f, 0.181033f, 0.177428f, 0.175609f, 0.175577f, 0.175232f, 0.174471f, 0.175053f, 0.176162f, 0.175457f, 0.173795f, 0.173114f, 0.171744f, 0.167956f, 0.164332f, 0.162227f, + 0.157916f, 0.150729f, 0.146110f, 0.143936f, 0.136426f, 0.124657f, 0.119818f, 0.119996f, 0.109141f, 0.089750f, 0.085717f, 0.095940f, 0.083230f, 0.037463f, 0.009372f, 0.039437f, 0.088203f, 0.089602f, 0.047152f, 0.017437f, 0.014054f, -0.004805f, -0.050861f, -0.073779f, -0.038800f, 0.013222f, 0.018847f, -0.024526f, -0.065147f, -0.073405f, -0.074806f, -0.099582f, -0.126782f, -0.104109f, -0.020258f, 0.067040f, 0.090571f, 0.049397f, 0.005260f, 0.006347f, 0.036806f, 0.050161f, 0.034434f, 0.024218f, 0.050191f, 0.093391f, 0.100755f, 0.044175f} + }, + { + {0.042678f, 0.061622f, -0.028196f, -0.143885f, -0.224072f, -0.284508f, -0.302731f, -0.182658f, 0.099504f, 0.420275f, 0.638704f, 0.687316f, 0.489750f, -0.015410f, -0.622302f, -0.830198f, -0.349626f, 0.436547f, 0.802596f, 0.482187f, -0.101825f, -0.430320f, -0.436453f, -0.363990f, -0.342331f, -0.313261f, -0.238930f, -0.165973f, -0.115181f, -0.053004f, 0.030022f, 0.103505f, 0.154387f, 0.196765f, 0.232985f, 0.250719f, 0.249480f, 0.238127f, 0.217259f, 0.185995f, 0.153039f, 0.125445f, 0.099295f, 0.070881f, 0.043774f, 0.019636f, -0.004691f, -0.028215f, -0.045888f, -0.058070f, -0.069863f, -0.082739f, -0.095207f, -0.108273f, -0.123140f, -0.137644f, -0.150201f, -0.162441f, -0.174694f, -0.184462f, -0.191311f, -0.197478f, -0.202881f, -0.205254f, -0.204820f, -0.203437f, -0.200391f, -0.193986f, -0.185403f, -0.176781f, -0.167901f, -0.158151f, -0.148852f, -0.140977f, -0.133478f, -0.125631f, -0.118126f, -0.111133f, -0.104255f, -0.098270f, -0.094045f, -0.090471f, -0.086049f, -0.081094f, -0.076093f, -0.069893f, -0.061614f, -0.052313f, -0.043250f, -0.034722f, -0.027423f, -0.022573f, -0.020398f, -0.020777f, -0.024856f, -0.033392f, + -0.044257f, -0.054140f, -0.061819f, -0.067591f, -0.070708f, -0.069377f, -0.062218f, -0.048572f, -0.028734f, -0.004500f, 0.022107f, 0.050743f, 0.081816f, 0.114155f, 0.145494f, 0.174558f, 0.201036f, 0.224549f, 0.245211f, 0.263919f, 0.280758f, 0.294514f, 0.304706f, 0.312583f, 0.319626f, 0.326612f, 0.334080f, 0.341832f, 0.348235f, 0.351861f, 0.353358f, 0.354260f, 0.354991f, 0.355418f, 0.355888f, 0.356297f, 0.355581f, 0.353292f, 0.350219f, 0.346812f, 0.342664f, 0.337795f, 0.332648f, 0.326745f, 0.319058f, 0.309473f, 0.298401f, 0.285643f, 0.271046f, 0.255382f, 0.239371f, 0.222910f, 0.206045f, 0.189388f, 0.173090f, 0.156857f, 0.141104f, 0.126636f, 0.113452f, 0.101318f, 0.090789f, 0.082249f, 0.074992f, 0.068538f, 0.063491f, 0.060061f, 0.057439f, 0.055455f, 0.054981f, 0.056161f, 0.058110f, 0.060472f, 0.063342f, 0.066055f, 0.067915f, 0.069371f, 0.070847f, 0.071784f, 0.072212f, 0.073343f, 0.075403f, 0.077120f, 0.078098f, 0.079147f, 0.080031f, 0.079753f, 0.078802f, 0.078270f, 0.077725f, 0.076661f, 0.076178f, 0.076704f, 0.076726f, 0.075852f, 0.075519f, 0.075400f, + 0.073798f, 0.071864f, 0.071587f, 0.070807f, 0.067455f, 0.065540f, 0.067863f, 0.068385f, 0.063450f, 0.062038f, 0.069276f, 0.071356f, 0.058960f, 0.053379f, 0.078818f, 0.116438f, 0.121889f, 0.088110f, 0.054333f, 0.047493f, 0.050192f, 0.038198f, 0.017981f, 0.009829f, 0.016479f, 0.025304f, 0.026670f, 0.017667f, -0.001131f, -0.024314f, -0.047086f, -0.077035f, -0.126851f, -0.184821f, -0.205141f, -0.150219f, -0.045456f, 0.033147f, 0.045118f, 0.036078f, 0.066884f, 0.116177f, 0.121086f, 0.109949f, 0.190572f, 0.356239f, 0.408472f, 0.186052f}, + {0.042678f, 0.061622f, -0.028196f, -0.143885f, -0.224072f, -0.284508f, -0.302731f, -0.182658f, 0.099504f, 0.420275f, 0.638704f, 0.687316f, 0.489750f, -0.015410f, -0.622302f, -0.830198f, -0.349626f, 0.436547f, 0.802596f, 0.482187f, -0.101825f, -0.430320f, -0.436453f, -0.363990f, -0.342331f, -0.313261f, -0.238930f, -0.165973f, -0.115181f, -0.053004f, 0.030022f, 0.103505f, 0.154387f, 0.196765f, 0.232985f, 0.250719f, 0.249480f, 0.238127f, 0.217259f, 0.185995f, 0.153039f, 0.125445f, 0.099295f, 0.070881f, 0.043774f, 0.019636f, -0.004691f, -0.028215f, -0.045888f, -0.058070f, -0.069863f, -0.082739f, -0.095207f, -0.108273f, -0.123140f, -0.137644f, -0.150201f, -0.162441f, -0.174694f, -0.184462f, -0.191311f, -0.197478f, -0.202881f, -0.205254f, -0.204820f, -0.203437f, -0.200391f, -0.193986f, -0.185403f, -0.176781f, -0.167901f, -0.158151f, -0.148852f, -0.140977f, -0.133478f, -0.125631f, -0.118126f, -0.111133f, -0.104255f, -0.098270f, -0.094045f, -0.090471f, -0.086049f, -0.081094f, -0.076093f, -0.069893f, -0.061614f, -0.052313f, -0.043250f, -0.034722f, -0.027423f, -0.022573f, -0.020398f, -0.020777f, -0.024856f, -0.033392f, + -0.044257f, -0.054140f, -0.061819f, -0.067591f, -0.070708f, -0.069377f, -0.062218f, -0.048572f, -0.028734f, -0.004500f, 0.022107f, 0.050743f, 0.081816f, 0.114155f, 0.145494f, 0.174558f, 0.201036f, 0.224549f, 0.245211f, 0.263919f, 0.280758f, 0.294514f, 0.304706f, 0.312583f, 0.319626f, 0.326612f, 0.334080f, 0.341832f, 0.348235f, 0.351861f, 0.353358f, 0.354260f, 0.354991f, 0.355418f, 0.355888f, 0.356297f, 0.355581f, 0.353292f, 0.350219f, 0.346812f, 0.342664f, 0.337795f, 0.332648f, 0.326745f, 0.319058f, 0.309473f, 0.298401f, 0.285643f, 0.271046f, 0.255382f, 0.239371f, 0.222910f, 0.206045f, 0.189388f, 0.173090f, 0.156857f, 0.141104f, 0.126636f, 0.113452f, 0.101318f, 0.090789f, 0.082249f, 0.074992f, 0.068538f, 0.063491f, 0.060061f, 0.057439f, 0.055455f, 0.054981f, 0.056161f, 0.058110f, 0.060472f, 0.063342f, 0.066055f, 0.067915f, 0.069371f, 0.070847f, 0.071784f, 0.072212f, 0.073343f, 0.075403f, 0.077120f, 0.078098f, 0.079147f, 0.080031f, 0.079753f, 0.078802f, 0.078270f, 0.077725f, 0.076661f, 0.076178f, 0.076704f, 0.076726f, 0.075852f, 0.075519f, 0.075400f, + 0.073798f, 0.071864f, 0.071587f, 0.070807f, 0.067455f, 0.065540f, 0.067863f, 0.068385f, 0.063450f, 0.062038f, 0.069276f, 0.071356f, 0.058960f, 0.053379f, 0.078818f, 0.116438f, 0.121889f, 0.088110f, 0.054333f, 0.047493f, 0.050192f, 0.038198f, 0.017981f, 0.009829f, 0.016479f, 0.025304f, 0.026670f, 0.017667f, -0.001131f, -0.024314f, -0.047086f, -0.077035f, -0.126851f, -0.184821f, -0.205141f, -0.150219f, -0.045456f, 0.033147f, 0.045118f, 0.036078f, 0.066884f, 0.116177f, 0.121086f, 0.109949f, 0.190572f, 0.356239f, 0.408472f, 0.186052f} + }, + { + {0.005237f, 0.021703f, 0.045977f, 0.071806f, 0.092952f, 0.081260f, -0.003190f, -0.145310f, -0.275966f, -0.362527f, -0.395227f, -0.264156f, 0.150047f, 0.651732f, 0.736748f, 0.178493f, -0.546265f, -0.726461f, -0.253335f, 0.307326f, 0.460253f, 0.280757f, 0.110658f, 0.068622f, 0.044595f, -0.021458f, -0.074721f, -0.084225f, -0.083528f, -0.089857f, -0.082326f, -0.054179f, -0.024468f, -0.003872f, 0.012161f, 0.024961f, 0.032523f, 0.038120f, 0.043734f, 0.045226f, 0.042031f, 0.040072f, 0.040964f, 0.039871f, 0.035748f, 0.033014f, 0.032973f, 0.032945f, 0.032894f, 0.035106f, 0.038930f, 0.041809f, 0.043292f, 0.043813f, 0.042340f, 0.038269f, 0.032751f, 0.026426f, 0.018771f, 0.010266f, 0.002197f, -0.005598f, -0.014102f, -0.022944f, -0.031212f, -0.039210f, -0.047434f, -0.055236f, -0.062092f, -0.068591f, -0.075131f, -0.081310f, -0.087184f, -0.093424f, -0.099923f, -0.105783f, -0.110523f, -0.114008f, -0.115743f, -0.115455f, -0.113562f, -0.110039f, -0.103812f, -0.094238f, -0.082140f, -0.068646f, -0.053906f, -0.037508f, -0.019400f, -0.000138f, 0.019150f, 0.037116f, 0.052952f, 0.066525f, 0.077559f, 0.085419f, + 0.090024f, 0.092137f, 0.092407f, 0.090931f, 0.088051f, 0.084846f, 0.082459f, 0.081306f, 0.081002f, 0.080874f, 0.080752f, 0.081399f, 0.083837f, 0.088256f, 0.093970f, 0.100339f, 0.107259f, 0.114966f, 0.123841f, 0.134136f, 0.145461f, 0.156869f, 0.167780f, 0.178468f, 0.189584f, 0.201647f, 0.214894f, 0.228991f, 0.243006f, 0.256233f, 0.268833f, 0.281258f, 0.293527f, 0.305381f, 0.316502f, 0.326245f, 0.333893f, 0.339409f, 0.343323f, 0.345920f, 0.347256f, 0.347629f, 0.347192f, 0.345526f, 0.342384f, 0.338359f, 0.334213f, 0.330257f, 0.326814f, 0.324352f, 0.322779f, 0.321501f, 0.320285f, 0.319177f, 0.317892f, 0.316244f, 0.314676f, 0.313474f, 0.312258f, 0.310891f, 0.309761f, 0.308650f, 0.306736f, 0.303971f, 0.300919f, 0.297365f, 0.292823f, 0.287889f, 0.283309f, 0.278653f, 0.273613f, 0.269123f, 0.265633f, 0.262210f, 0.258582f, 0.255670f, 0.253312f, 0.250271f, 0.246652f, 0.243183f, 0.238876f, 0.232859f, 0.226812f, 0.222000f, 0.216739f, 0.210266f, 0.204891f, 0.201099f, 0.196094f, 0.189759f, 0.185117f, 0.181542f, 0.175943f, 0.170100f, 0.166931f, 0.162845f, + 0.155378f, 0.150889f, 0.151178f, 0.145769f, 0.133595f, 0.131101f, 0.138699f, 0.131114f, 0.107876f, 0.107399f, 0.131831f, 0.121095f, 0.065160f, 0.067368f, 0.195312f, 0.334380f, 0.321328f, 0.179544f, 0.074250f, 0.062451f, 0.055156f, 0.024988f, 0.064983f, 0.195879f, 0.284344f, 0.231376f, 0.110090f, 0.037519f, 0.019981f, -0.000182f, -0.041027f, -0.092433f, -0.145801f, -0.157474f, -0.070642f, 0.074676f, 0.146071f, 0.088851f, 0.000113f, -0.023302f, -0.011566f, -0.029134f, -0.060776f, -0.081612f, -0.140841f, -0.254957f, -0.296521f, -0.136956f}, + {-0.005237f, -0.021703f, -0.045977f, -0.071806f, -0.092952f, -0.081260f, 0.003190f, 0.145310f, 0.275966f, 0.362527f, 0.395227f, 0.264156f, -0.150047f, -0.651732f, -0.736748f, -0.178493f, 0.546265f, 0.726461f, 0.253335f, -0.307326f, -0.460253f, -0.280757f, -0.110658f, -0.068622f, -0.044595f, 0.021458f, 0.074721f, 0.084225f, 0.083528f, 0.089857f, 0.082326f, 0.054179f, 0.024468f, 0.003872f, -0.012161f, -0.024961f, -0.032523f, -0.038120f, -0.043734f, -0.045226f, -0.042031f, -0.040072f, -0.040964f, -0.039871f, -0.035748f, -0.033014f, -0.032973f, -0.032945f, -0.032894f, -0.035106f, -0.038930f, -0.041809f, -0.043292f, -0.043813f, -0.042340f, -0.038269f, -0.032751f, -0.026426f, -0.018771f, -0.010266f, -0.002197f, 0.005598f, 0.014102f, 0.022944f, 0.031212f, 0.039210f, 0.047434f, 0.055236f, 0.062092f, 0.068591f, 0.075131f, 0.081310f, 0.087184f, 0.093424f, 0.099923f, 0.105783f, 0.110523f, 0.114008f, 0.115743f, 0.115455f, 0.113562f, 0.110039f, 0.103812f, 0.094238f, 0.082140f, 0.068646f, 0.053906f, 0.037508f, 0.019400f, 0.000138f, -0.019150f, -0.037116f, -0.052952f, -0.066525f, -0.077559f, -0.085419f, + -0.090024f, -0.092137f, -0.092407f, -0.090931f, -0.088051f, -0.084846f, -0.082459f, -0.081306f, -0.081002f, -0.080874f, -0.080752f, -0.081399f, -0.083837f, -0.088256f, -0.093970f, -0.100339f, -0.107259f, -0.114966f, -0.123841f, -0.134136f, -0.145461f, -0.156869f, -0.167780f, -0.178468f, -0.189584f, -0.201647f, -0.214894f, -0.228991f, -0.243006f, -0.256233f, -0.268833f, -0.281258f, -0.293527f, -0.305381f, -0.316502f, -0.326245f, -0.333893f, -0.339409f, -0.343323f, -0.345920f, -0.347256f, -0.347629f, -0.347192f, -0.345526f, -0.342384f, -0.338359f, -0.334213f, -0.330257f, -0.326814f, -0.324352f, -0.322779f, -0.321501f, -0.320285f, -0.319177f, -0.317892f, -0.316244f, -0.314676f, -0.313474f, -0.312258f, -0.310891f, -0.309761f, -0.308650f, -0.306736f, -0.303971f, -0.300919f, -0.297365f, -0.292823f, -0.287889f, -0.283309f, -0.278653f, -0.273613f, -0.269123f, -0.265633f, -0.262210f, -0.258582f, -0.255670f, -0.253312f, -0.250271f, -0.246652f, -0.243183f, -0.238876f, -0.232859f, -0.226812f, -0.222000f, -0.216739f, -0.210266f, -0.204891f, -0.201099f, -0.196094f, -0.189759f, -0.185117f, -0.181542f, -0.175943f, -0.170100f, -0.166931f, -0.162845f, + -0.155378f, -0.150889f, -0.151178f, -0.145769f, -0.133595f, -0.131101f, -0.138699f, -0.131114f, -0.107876f, -0.107399f, -0.131831f, -0.121095f, -0.065160f, -0.067368f, -0.195312f, -0.334380f, -0.321328f, -0.179544f, -0.074250f, -0.062451f, -0.055156f, -0.024988f, -0.064983f, -0.195879f, -0.284344f, -0.231376f, -0.110090f, -0.037519f, -0.019981f, 0.000182f, 0.041027f, 0.092433f, 0.145801f, 0.157474f, 0.070642f, -0.074676f, -0.146071f, -0.088851f, -0.000113f, 0.023302f, 0.011566f, 0.029134f, 0.060776f, 0.081612f, 0.140841f, 0.254957f, 0.296521f, 0.136956f} + }, + { + {0.003290f, 0.004457f, -0.005528f, -0.024503f, -0.040658f, -0.025318f, 0.044206f, 0.129212f, 0.134877f, 0.022060f, -0.113425f, -0.138652f, -0.048257f, 0.038579f, 0.043176f, 0.010064f, 0.006812f, 0.021760f, 0.008859f, -0.024480f, -0.035157f, -0.018780f, -0.010069f, -0.021483f, -0.027992f, -0.012071f, 0.011813f, 0.022917f, 0.019094f, 0.008846f, -0.003933f, -0.019076f, -0.033862f, -0.044037f, -0.047229f, -0.043365f, -0.034518f, -0.024371f, -0.015194f, -0.005790f, 0.005807f, 0.018765f, 0.030239f, 0.038382f, 0.043045f, 0.044775f, 0.044750f, 0.045028f, 0.047510f, 0.052757f, 0.060176f, 0.068888f, 0.078026f, 0.086682f, 0.094135f, 0.100148f, 0.104865f, 0.108434f, 0.110857f, 0.112171f, 0.112552f, 0.112064f, 0.110518f, 0.107865f, 0.104605f, 0.101407f, 0.098467f, 0.095713f, 0.093491f, 0.092393f, 0.092459f, 0.093229f, 0.094672f, 0.097391f, 0.101744f, 0.107363f, 0.113784f, 0.120958f, 0.128800f, 0.136599f, 0.143271f, 0.148034f, 0.150614f, 0.150845f, 0.148141f, 0.141385f, 0.129494f, 0.112216f, 0.090156f, 0.063735f, 0.032399f, -0.004651f, -0.046969f, -0.092530f, -0.138942f, -0.184556f, + -0.228255f, -0.268567f, -0.303451f, -0.331114f, -0.351060f, -0.364229f, -0.371919f, -0.374505f, -0.371598f, -0.363669f, -0.353079f, -0.342887f, -0.334569f, -0.327154f, -0.318566f, -0.307656f, -0.295101f, -0.282663f, -0.271630f, -0.261889f, -0.252419f, -0.242495f, -0.232267f, -0.222371f, -0.213326f, -0.205197f, -0.197481f, -0.189342f, -0.180196f, -0.170060f, -0.159249f, -0.147949f, -0.136227f, -0.124196f, -0.111996f, -0.099831f, -0.088089f, -0.077140f, -0.066975f, -0.057295f, -0.047872f, -0.038650f, -0.029694f, -0.021309f, -0.013879f, -0.007297f, -0.000899f, 0.005873f, 0.013174f, 0.021158f, 0.029939f, 0.039052f, 0.047778f, 0.056179f, 0.065084f, 0.075097f, 0.086363f, 0.099143f, 0.113686f, 0.129646f, 0.146404f, 0.163684f, 0.181241f, 0.198487f, 0.214981f, 0.230647f, 0.245100f, 0.257590f, 0.267839f, 0.275939f, 0.281514f, 0.284182f, 0.284595f, 0.283723f, 0.281609f, 0.278146f, 0.274139f, 0.270221f, 0.265944f, 0.261144f, 0.256555f, 0.252147f, 0.247009f, 0.241520f, 0.236982f, 0.232888f, 0.227759f, 0.222258f, 0.217750f, 0.212978f, 0.206361f, 0.199432f, 0.193539f, 0.186770f, 0.178678f, 0.172413f, + 0.167586f, 0.159508f, 0.149897f, 0.145822f, 0.143645f, 0.132268f, 0.117259f, 0.115520f, 0.119222f, 0.102510f, 0.076298f, 0.083698f, 0.113656f, 0.084809f, -0.030790f, -0.132140f, -0.115897f, -0.025563f, 0.020739f, 0.007588f, 0.010784f, 0.033761f, -0.006155f, -0.114325f, -0.177032f, -0.130405f, -0.055807f, -0.044287f, -0.066534f, -0.052950f, -0.016133f, -0.003723f, 0.004837f, 0.055791f, 0.115431f, 0.104274f, 0.022364f, -0.044182f, -0.042903f, -0.010534f, 0.000271f, -0.011501f, -0.020234f, -0.019218f, -0.016156f, -0.012286f, -0.006242f, -0.001442f}, + {-0.003290f, -0.004457f, 0.005528f, 0.024503f, 0.040658f, 0.025318f, -0.044206f, -0.129212f, -0.134877f, -0.022060f, 0.113425f, 0.138652f, 0.048257f, -0.038579f, -0.043176f, -0.010064f, -0.006812f, -0.021760f, -0.008859f, 0.024480f, 0.035157f, 0.018780f, 0.010069f, 0.021483f, 0.027992f, 0.012071f, -0.011813f, -0.022917f, -0.019094f, -0.008846f, 0.003933f, 0.019076f, 0.033862f, 0.044037f, 0.047229f, 0.043365f, 0.034518f, 0.024371f, 0.015194f, 0.005790f, -0.005807f, -0.018765f, -0.030239f, -0.038382f, -0.043045f, -0.044775f, -0.044750f, -0.045028f, -0.047510f, -0.052757f, -0.060176f, -0.068888f, -0.078026f, -0.086682f, -0.094135f, -0.100148f, -0.104865f, -0.108434f, -0.110857f, -0.112171f, -0.112552f, -0.112064f, -0.110518f, -0.107865f, -0.104605f, -0.101407f, -0.098467f, -0.095713f, -0.093491f, -0.092393f, -0.092459f, -0.093229f, -0.094672f, -0.097391f, -0.101744f, -0.107363f, -0.113784f, -0.120958f, -0.128800f, -0.136599f, -0.143271f, -0.148034f, -0.150614f, -0.150845f, -0.148141f, -0.141385f, -0.129494f, -0.112216f, -0.090156f, -0.063735f, -0.032399f, 0.004651f, 0.046969f, 0.092530f, 0.138942f, 0.184556f, + 0.228255f, 0.268567f, 0.303451f, 0.331114f, 0.351060f, 0.364229f, 0.371919f, 0.374505f, 0.371598f, 0.363669f, 0.353079f, 0.342887f, 0.334569f, 0.327154f, 0.318566f, 0.307656f, 0.295101f, 0.282663f, 0.271630f, 0.261889f, 0.252419f, 0.242495f, 0.232267f, 0.222371f, 0.213326f, 0.205197f, 0.197481f, 0.189342f, 0.180196f, 0.170060f, 0.159249f, 0.147949f, 0.136227f, 0.124196f, 0.111996f, 0.099831f, 0.088089f, 0.077140f, 0.066975f, 0.057295f, 0.047872f, 0.038650f, 0.029694f, 0.021309f, 0.013879f, 0.007297f, 0.000899f, -0.005873f, -0.013174f, -0.021158f, -0.029939f, -0.039052f, -0.047778f, -0.056179f, -0.065084f, -0.075097f, -0.086363f, -0.099143f, -0.113686f, -0.129646f, -0.146404f, -0.163684f, -0.181241f, -0.198487f, -0.214981f, -0.230647f, -0.245100f, -0.257590f, -0.267839f, -0.275939f, -0.281514f, -0.284182f, -0.284595f, -0.283723f, -0.281609f, -0.278146f, -0.274139f, -0.270221f, -0.265944f, -0.261144f, -0.256555f, -0.252147f, -0.247009f, -0.241520f, -0.236982f, -0.232888f, -0.227759f, -0.222258f, -0.217750f, -0.212978f, -0.206361f, -0.199432f, -0.193539f, -0.186770f, -0.178678f, -0.172413f, + -0.167586f, -0.159508f, -0.149897f, -0.145822f, -0.143645f, -0.132268f, -0.117259f, -0.115520f, -0.119222f, -0.102510f, -0.076298f, -0.083698f, -0.113656f, -0.084809f, 0.030790f, 0.132140f, 0.115897f, 0.025563f, -0.020739f, -0.007588f, -0.010784f, -0.033761f, 0.006155f, 0.114325f, 0.177032f, 0.130405f, 0.055807f, 0.044287f, 0.066534f, 0.052950f, 0.016133f, 0.003723f, -0.004837f, -0.055791f, -0.115431f, -0.104274f, -0.022364f, 0.044182f, 0.042903f, 0.010534f, -0.000271f, 0.011501f, 0.020234f, 0.019218f, 0.016156f, 0.012286f, 0.006242f, 0.001442f} + }, + { + {0.011164f, 0.032836f, 0.036645f, 0.010266f, -0.002453f, 0.048984f, 0.112171f, 0.055369f, -0.161208f, -0.386598f, -0.393418f, -0.096523f, 0.327126f, 0.541470f, 0.342730f, -0.107176f, -0.401047f, -0.302387f, 0.016123f, 0.212089f, 0.167723f, 0.036742f, -0.030253f, -0.044201f, -0.062205f, -0.067661f, -0.027021f, 0.029533f, 0.052252f, 0.045066f, 0.045409f, 0.066031f, 0.094060f, 0.121955f, 0.148648f, 0.165808f, 0.164983f, 0.149562f, 0.128033f, 0.103839f, 0.078146f, 0.053697f, 0.031162f, 0.008320f, -0.015066f, -0.036973f, -0.057449f, -0.078140f, -0.098645f, -0.117711f, -0.136293f, -0.155534f, -0.173582f, -0.187426f, -0.195978f, -0.199282f, -0.197030f, -0.189763f, -0.179374f, -0.166925f, -0.151599f, -0.132527f, -0.109872f, -0.083662f, -0.053273f, -0.018574f, 0.019487f, 0.059494f, 0.099905f, 0.139081f, 0.175756f, 0.209103f, 0.237873f, 0.260210f, 0.274934f, 0.282259f, 0.282639f, 0.275632f, 0.260647f, 0.238307f, 0.210293f, 0.177967f, 0.141703f, 0.101603f, 0.058418f, 0.013424f, -0.032487f, -0.079182f, -0.126657f, -0.174435f, -0.221816f, -0.268160f, -0.312343f, -0.352314f, -0.385884f, -0.411766f, + -0.429215f, -0.436998f, -0.433649f, -0.418961f, -0.394679f, -0.363490f, -0.327514f, -0.287649f, -0.244197f, -0.198315f, -0.152926f, -0.111682f, -0.076694f, -0.047638f, -0.023186f, -0.002688f, 0.013718f, 0.025795f, 0.033396f, 0.036453f, 0.035301f, 0.030767f, 0.023826f, 0.015431f, 0.006538f, -0.002356f, -0.011778f, -0.022870f, -0.036327f, -0.051958f, -0.068973f, -0.086308f, -0.103002f, -0.118765f, -0.133990f, -0.148972f, -0.163394f, -0.176630f, -0.188097f, -0.197282f, -0.203969f, -0.208402f, -0.210775f, -0.210752f, -0.207996f, -0.202785f, -0.195626f, -0.186736f, -0.176426f, -0.165358f, -0.153969f, -0.142280f, -0.130641f, -0.119870f, -0.110421f, -0.102206f, -0.095291f, -0.089829f, -0.085360f, -0.081117f, -0.076882f, -0.072735f, -0.068397f, -0.063649f, -0.058777f, -0.053866f, -0.048414f, -0.042214f, -0.035732f, -0.029221f, -0.022534f, -0.015932f, -0.009843f, -0.003888f, 0.002599f, 0.009436f, 0.016248f, 0.023570f, 0.031998f, 0.041152f, 0.050592f, 0.060497f, 0.070490f, 0.079404f, 0.086950f, 0.093796f, 0.099686f, 0.103660f, 0.106051f, 0.107861f, 0.108670f, 0.107687f, 0.105806f, 0.104009f, 0.101428f, 0.097536f, + 0.093765f, 0.090589f, 0.086306f, 0.080851f, 0.076442f, 0.072650f, 0.066432f, 0.058555f, 0.053047f, 0.048898f, 0.040819f, 0.029903f, 0.023605f, 0.022728f, 0.019228f, 0.010531f, 0.005076f, 0.008678f, 0.015334f, 0.017655f, 0.018434f, 0.024584f, 0.033609f, 0.033286f, 0.017113f, -0.002988f, -0.006746f, 0.008393f, 0.021799f, 0.020507f, 0.021478f, 0.041101f, 0.054308f, 0.019430f, -0.054565f, -0.102615f, -0.079454f, -0.013054f, 0.033272f, 0.030133f, -0.000759f, -0.021432f, -0.017817f, -0.013999f, -0.044719f, -0.101574f, -0.121223f, -0.055701f}, + {-0.011164f, -0.032836f, -0.036645f, -0.010266f, 0.002453f, -0.048984f, -0.112171f, -0.055369f, 0.161208f, 0.386598f, 0.393418f, 0.096523f, -0.327126f, -0.541470f, -0.342730f, 0.107176f, 0.401047f, 0.302387f, -0.016123f, -0.212089f, -0.167723f, -0.036742f, 0.030253f, 0.044201f, 0.062205f, 0.067661f, 0.027021f, -0.029533f, -0.052252f, -0.045066f, -0.045409f, -0.066031f, -0.094060f, -0.121955f, -0.148648f, -0.165808f, -0.164983f, -0.149562f, -0.128033f, -0.103839f, -0.078146f, -0.053697f, -0.031162f, -0.008320f, 0.015066f, 0.036973f, 0.057449f, 0.078140f, 0.098645f, 0.117711f, 0.136293f, 0.155534f, 0.173582f, 0.187426f, 0.195978f, 0.199282f, 0.197030f, 0.189763f, 0.179374f, 0.166925f, 0.151599f, 0.132527f, 0.109872f, 0.083662f, 0.053273f, 0.018574f, -0.019487f, -0.059494f, -0.099905f, -0.139081f, -0.175756f, -0.209103f, -0.237873f, -0.260210f, -0.274934f, -0.282259f, -0.282639f, -0.275632f, -0.260647f, -0.238307f, -0.210293f, -0.177967f, -0.141703f, -0.101603f, -0.058418f, -0.013424f, 0.032487f, 0.079182f, 0.126657f, 0.174435f, 0.221816f, 0.268160f, 0.312343f, 0.352314f, 0.385884f, 0.411766f, + 0.429215f, 0.436998f, 0.433649f, 0.418961f, 0.394679f, 0.363490f, 0.327514f, 0.287649f, 0.244197f, 0.198315f, 0.152926f, 0.111682f, 0.076694f, 0.047638f, 0.023186f, 0.002688f, -0.013718f, -0.025795f, -0.033396f, -0.036453f, -0.035301f, -0.030767f, -0.023826f, -0.015431f, -0.006538f, 0.002356f, 0.011778f, 0.022870f, 0.036327f, 0.051958f, 0.068973f, 0.086308f, 0.103002f, 0.118765f, 0.133990f, 0.148972f, 0.163394f, 0.176630f, 0.188097f, 0.197282f, 0.203969f, 0.208402f, 0.210775f, 0.210752f, 0.207996f, 0.202785f, 0.195626f, 0.186736f, 0.176426f, 0.165358f, 0.153969f, 0.142280f, 0.130641f, 0.119870f, 0.110421f, 0.102206f, 0.095291f, 0.089829f, 0.085360f, 0.081117f, 0.076882f, 0.072735f, 0.068397f, 0.063649f, 0.058777f, 0.053866f, 0.048414f, 0.042214f, 0.035732f, 0.029221f, 0.022534f, 0.015932f, 0.009843f, 0.003888f, -0.002599f, -0.009436f, -0.016248f, -0.023570f, -0.031998f, -0.041152f, -0.050592f, -0.060497f, -0.070490f, -0.079404f, -0.086950f, -0.093796f, -0.099686f, -0.103660f, -0.106051f, -0.107861f, -0.108670f, -0.107687f, -0.105806f, -0.104009f, -0.101428f, -0.097536f, + -0.093765f, -0.090589f, -0.086306f, -0.080851f, -0.076442f, -0.072650f, -0.066432f, -0.058555f, -0.053047f, -0.048898f, -0.040819f, -0.029903f, -0.023605f, -0.022728f, -0.019228f, -0.010531f, -0.005076f, -0.008678f, -0.015334f, -0.017655f, -0.018434f, -0.024584f, -0.033609f, -0.033286f, -0.017113f, 0.002988f, 0.006746f, -0.008393f, -0.021799f, -0.020507f, -0.021478f, -0.041101f, -0.054308f, -0.019430f, 0.054565f, 0.102615f, 0.079454f, 0.013054f, -0.033272f, -0.030133f, 0.000759f, 0.021432f, 0.017817f, 0.013999f, 0.044719f, 0.101574f, 0.121223f, 0.055701f} + }, + { + {-0.000057f, 0.004618f, 0.017682f, 0.031128f, 0.031889f, 0.012604f, -0.024428f, -0.067381f, -0.092044f, -0.068699f, 0.006663f, 0.086585f, 0.103494f, 0.041969f, -0.038554f, -0.069591f, -0.044517f, -0.004822f, 0.023300f, 0.046137f, 0.066610f, 0.069547f, 0.049468f, 0.024226f, 0.008422f, -0.007184f, -0.037346f, -0.077238f, -0.107144f, -0.113458f, -0.096785f, -0.066490f, -0.035038f, -0.013153f, -0.003730f, -0.000878f, 0.003116f, 0.011034f, 0.020563f, 0.027847f, 0.030544f, 0.029277f, 0.026700f, 0.024711f, 0.023212f, 0.021560f, 0.019500f, 0.016290f, 0.010748f, 0.002681f, -0.007062f, -0.017978f, -0.030113f, -0.043238f, -0.056960f, -0.071085f, -0.084942f, -0.097195f, -0.106968f, -0.114229f, -0.118841f, -0.120501f, -0.119614f, -0.116789f, -0.111677f, -0.103680f, -0.093172f, -0.080489f, -0.064566f, -0.044178f, -0.019643f, 0.008060f, 0.038626f, 0.071500f, 0.104878f, 0.136913f, 0.166805f, 0.193866f, 0.216842f, 0.234966f, 0.248504f, 0.257609f, 0.261575f, 0.259590f, 0.251591f, 0.238272f, 0.220487f, 0.198276f, 0.170561f, 0.136698f, 0.098189f, 0.057682f, 0.016496f, -0.025495f, -0.067816f, -0.108621f, + -0.145658f, -0.176870f, -0.200772f, -0.217529f, -0.228950f, -0.236396f, -0.239262f, -0.236051f, -0.226084f, -0.210128f, -0.190544f, -0.170619f, -0.152249f, -0.134448f, -0.115361f, -0.095074f, -0.075354f, -0.057740f, -0.043170f, -0.032135f, -0.023928f, -0.016976f, -0.010829f, -0.006589f, -0.005154f, -0.006616f, -0.011291f, -0.019411f, -0.030043f, -0.042074f, -0.055747f, -0.071687f, -0.089493f, -0.108727f, -0.129821f, -0.152682f, -0.176004f, -0.198998f, -0.221985f, -0.244760f, -0.266417f, -0.286912f, -0.306659f, -0.324871f, -0.340388f, -0.353362f, -0.364168f, -0.372020f, -0.376464f, -0.378404f, -0.378114f, -0.374521f, -0.367666f, -0.359313f, -0.350349f, -0.340361f, -0.329902f, -0.320119f, -0.310406f, -0.299314f, -0.286923f, -0.273822f, -0.259542f, -0.244326f, -0.229980f, -0.217077f, -0.204279f, -0.191540f, -0.180261f, -0.169869f, -0.158554f, -0.147117f, -0.137572f, -0.129135f, -0.120174f, -0.111850f, -0.105358f, -0.098801f, -0.090788f, -0.082858f, -0.075269f, -0.065930f, -0.055595f, -0.047479f, -0.040967f, -0.033205f, -0.025890f, -0.022124f, -0.019442f, -0.014783f, -0.011252f, -0.011244f, -0.010626f, -0.007763f, -0.007496f, -0.009654f, + -0.008162f, -0.005566f, -0.009317f, -0.013253f, -0.007832f, -0.004274f, -0.015488f, -0.023533f, -0.010153f, -0.002382f, -0.027502f, -0.045274f, -0.009521f, 0.021910f, -0.048635f, -0.183515f, -0.228104f, -0.131244f, -0.015609f, 0.018983f, 0.026755f, 0.075115f, 0.100455f, 0.016691f, -0.118628f, -0.165113f, -0.084096f, 0.032836f, 0.098202f, 0.116964f, 0.144314f, 0.200805f, 0.235092f, 0.168366f, -0.003252f, -0.162099f, -0.176037f, -0.055350f, 0.054849f, 0.051827f, -0.015974f, -0.043441f, -0.012571f, 0.007826f, -0.027403f, -0.083452f, -0.095889f, -0.042074f}, + {-0.000057f, 0.004618f, 0.017682f, 0.031128f, 0.031889f, 0.012604f, -0.024428f, -0.067381f, -0.092044f, -0.068699f, 0.006663f, 0.086585f, 0.103494f, 0.041969f, -0.038554f, -0.069591f, -0.044517f, -0.004822f, 0.023300f, 0.046137f, 0.066610f, 0.069547f, 0.049468f, 0.024226f, 0.008422f, -0.007184f, -0.037346f, -0.077238f, -0.107144f, -0.113458f, -0.096785f, -0.066490f, -0.035038f, -0.013153f, -0.003730f, -0.000878f, 0.003116f, 0.011034f, 0.020563f, 0.027847f, 0.030544f, 0.029277f, 0.026700f, 0.024711f, 0.023212f, 0.021560f, 0.019500f, 0.016290f, 0.010748f, 0.002681f, -0.007062f, -0.017978f, -0.030113f, -0.043238f, -0.056960f, -0.071085f, -0.084942f, -0.097195f, -0.106968f, -0.114229f, -0.118841f, -0.120501f, -0.119614f, -0.116789f, -0.111677f, -0.103680f, -0.093172f, -0.080489f, -0.064566f, -0.044178f, -0.019643f, 0.008060f, 0.038626f, 0.071500f, 0.104878f, 0.136913f, 0.166805f, 0.193866f, 0.216842f, 0.234966f, 0.248504f, 0.257609f, 0.261575f, 0.259590f, 0.251591f, 0.238272f, 0.220487f, 0.198276f, 0.170561f, 0.136698f, 0.098189f, 0.057682f, 0.016496f, -0.025495f, -0.067816f, -0.108621f, + -0.145658f, -0.176870f, -0.200772f, -0.217529f, -0.228950f, -0.236396f, -0.239262f, -0.236051f, -0.226084f, -0.210128f, -0.190544f, -0.170619f, -0.152249f, -0.134448f, -0.115361f, -0.095074f, -0.075354f, -0.057740f, -0.043170f, -0.032135f, -0.023928f, -0.016976f, -0.010829f, -0.006589f, -0.005154f, -0.006616f, -0.011291f, -0.019411f, -0.030043f, -0.042074f, -0.055747f, -0.071687f, -0.089493f, -0.108727f, -0.129821f, -0.152682f, -0.176004f, -0.198998f, -0.221985f, -0.244760f, -0.266417f, -0.286912f, -0.306659f, -0.324871f, -0.340388f, -0.353362f, -0.364168f, -0.372020f, -0.376464f, -0.378404f, -0.378114f, -0.374521f, -0.367666f, -0.359313f, -0.350349f, -0.340361f, -0.329902f, -0.320119f, -0.310406f, -0.299314f, -0.286923f, -0.273822f, -0.259542f, -0.244326f, -0.229980f, -0.217077f, -0.204279f, -0.191540f, -0.180261f, -0.169869f, -0.158554f, -0.147117f, -0.137572f, -0.129135f, -0.120174f, -0.111850f, -0.105358f, -0.098801f, -0.090788f, -0.082858f, -0.075269f, -0.065930f, -0.055595f, -0.047479f, -0.040967f, -0.033205f, -0.025890f, -0.022124f, -0.019442f, -0.014783f, -0.011252f, -0.011244f, -0.010626f, -0.007763f, -0.007496f, -0.009654f, + -0.008162f, -0.005566f, -0.009317f, -0.013253f, -0.007832f, -0.004274f, -0.015488f, -0.023533f, -0.010153f, -0.002382f, -0.027502f, -0.045274f, -0.009521f, 0.021910f, -0.048635f, -0.183515f, -0.228104f, -0.131244f, -0.015609f, 0.018983f, 0.026755f, 0.075115f, 0.100455f, 0.016691f, -0.118628f, -0.165113f, -0.084096f, 0.032836f, 0.098202f, 0.116964f, 0.144314f, 0.200805f, 0.235092f, 0.168366f, -0.003252f, -0.162099f, -0.176037f, -0.055350f, 0.054849f, 0.051827f, -0.015974f, -0.043441f, -0.012571f, 0.007826f, -0.027403f, -0.083452f, -0.095889f, -0.042074f} + }, + { + {0.003286f, 0.020663f, 0.047015f, 0.053514f, 0.027668f, -0.018005f, -0.074845f, -0.129718f, -0.133764f, -0.040778f, 0.107952f, 0.192417f, 0.138911f, 0.002813f, -0.096900f, -0.097211f, -0.027296f, 0.041753f, 0.055973f, 0.009638f, -0.053234f, -0.074730f, -0.036276f, 0.028003f, 0.073968f, 0.088912f, 0.085590f, 0.075178f, 0.060843f, 0.045753f, 0.031933f, 0.015643f, -0.006543f, -0.030509f, -0.049634f, -0.063067f, -0.073747f, -0.081798f, -0.084797f, -0.082534f, -0.077869f, -0.073890f, -0.072300f, -0.073599f, -0.077378f, -0.082705f, -0.088483f, -0.093078f, -0.094258f, -0.090539f, -0.082362f, -0.071359f, -0.059106f, -0.047102f, -0.036931f, -0.029407f, -0.023973f, -0.019544f, -0.015494f, -0.011431f, -0.006598f, 0.000010f, 0.009248f, 0.021699f, 0.037488f, 0.055980f, 0.076003f, 0.096419f, 0.116146f, 0.133812f, 0.148176f, 0.159051f, 0.167129f, 0.172618f, 0.174876f, 0.173820f, 0.170796f, 0.167101f, 0.162315f, 0.155354f, 0.146888f, 0.139280f, 0.133952f, 0.130225f, 0.127363f, 0.126470f, 0.129155f, 0.134873f, 0.140780f, 0.144329f, 0.145336f, 0.145342f, 0.145533f, 0.145667f, 0.144745f, 0.142112f, + 0.137732f, 0.131877f, 0.125120f, 0.118473f, 0.112800f, 0.107738f, 0.101543f, 0.092388f, 0.079744f, 0.064329f, 0.046886f, 0.027329f, 0.005126f, -0.019726f, -0.046309f, -0.073397f, -0.100300f, -0.127038f, -0.153757f, -0.180066f, -0.204868f, -0.226760f, -0.244721f, -0.258627f, -0.269120f, -0.276888f, -0.282007f, -0.283898f, -0.281834f, -0.275598f, -0.265873f, -0.254057f, -0.241477f, -0.228516f, -0.214415f, -0.197989f, -0.178738f, -0.157442f, -0.135714f, -0.114934f, -0.095604f, -0.077515f, -0.060115f, -0.042690f, -0.024757f, -0.006617f, 0.010792f, 0.026792f, 0.041319f, 0.054297f, 0.065248f, 0.073855f, 0.080421f, 0.085476f, 0.089337f, 0.092227f, 0.094391f, 0.095900f, 0.096594f, 0.096231f, 0.094555f, 0.091499f, 0.087561f, 0.083596f, 0.080064f, 0.076942f, 0.074384f, 0.072705f, 0.071678f, 0.070768f, 0.070120f, 0.070423f, 0.071853f, 0.074033f, 0.076789f, 0.079999f, 0.083058f, 0.085305f, 0.086394f, 0.085686f, 0.082340f, 0.076614f, 0.069777f, 0.062351f, 0.054034f, 0.045374f, 0.037457f, 0.030035f, 0.022223f, 0.014513f, 0.007727f, 0.001194f, -0.005463f, -0.010784f, -0.014329f, -0.017958f, + -0.021688f, -0.022941f, -0.022426f, -0.024089f, -0.026735f, -0.025120f, -0.021928f, -0.025401f, -0.031768f, -0.028507f, -0.020527f, -0.027990f, -0.046743f, -0.042080f, -0.003396f, 0.027264f, 0.013170f, -0.020073f, -0.025760f, -0.008495f, -0.005552f, -0.014133f, 0.003435f, 0.044906f, 0.059066f, 0.024448f, -0.015911f, -0.021124f, -0.009130f, -0.017009f, -0.041372f, -0.056366f, -0.066541f, -0.097055f, -0.137463f, -0.138780f, -0.079675f, -0.003607f, 0.033428f, 0.030812f, 0.028961f, 0.041471f, 0.044399f, 0.035401f, 0.052169f, 0.103505f, 0.125865f, 0.058885f}, + {0.003286f, 0.020663f, 0.047015f, 0.053514f, 0.027668f, -0.018005f, -0.074845f, -0.129718f, -0.133764f, -0.040778f, 0.107952f, 0.192417f, 0.138911f, 0.002813f, -0.096900f, -0.097211f, -0.027296f, 0.041753f, 0.055973f, 0.009638f, -0.053234f, -0.074730f, -0.036276f, 0.028003f, 0.073968f, 0.088912f, 0.085590f, 0.075178f, 0.060843f, 0.045753f, 0.031933f, 0.015643f, -0.006543f, -0.030509f, -0.049634f, -0.063067f, -0.073747f, -0.081798f, -0.084797f, -0.082534f, -0.077869f, -0.073890f, -0.072300f, -0.073599f, -0.077378f, -0.082705f, -0.088483f, -0.093078f, -0.094258f, -0.090539f, -0.082362f, -0.071359f, -0.059106f, -0.047102f, -0.036931f, -0.029407f, -0.023973f, -0.019544f, -0.015494f, -0.011431f, -0.006598f, 0.000010f, 0.009248f, 0.021699f, 0.037488f, 0.055980f, 0.076003f, 0.096419f, 0.116146f, 0.133812f, 0.148176f, 0.159051f, 0.167129f, 0.172618f, 0.174876f, 0.173820f, 0.170796f, 0.167101f, 0.162315f, 0.155354f, 0.146888f, 0.139280f, 0.133952f, 0.130225f, 0.127363f, 0.126470f, 0.129155f, 0.134873f, 0.140780f, 0.144329f, 0.145336f, 0.145342f, 0.145533f, 0.145667f, 0.144745f, 0.142112f, + 0.137732f, 0.131877f, 0.125120f, 0.118473f, 0.112800f, 0.107738f, 0.101543f, 0.092388f, 0.079744f, 0.064329f, 0.046886f, 0.027329f, 0.005126f, -0.019726f, -0.046309f, -0.073397f, -0.100300f, -0.127038f, -0.153757f, -0.180066f, -0.204868f, -0.226760f, -0.244721f, -0.258627f, -0.269120f, -0.276888f, -0.282007f, -0.283898f, -0.281834f, -0.275598f, -0.265873f, -0.254057f, -0.241477f, -0.228516f, -0.214415f, -0.197989f, -0.178738f, -0.157442f, -0.135714f, -0.114934f, -0.095604f, -0.077515f, -0.060115f, -0.042690f, -0.024757f, -0.006617f, 0.010792f, 0.026792f, 0.041319f, 0.054297f, 0.065248f, 0.073855f, 0.080421f, 0.085476f, 0.089337f, 0.092227f, 0.094391f, 0.095900f, 0.096594f, 0.096231f, 0.094555f, 0.091499f, 0.087561f, 0.083596f, 0.080064f, 0.076942f, 0.074384f, 0.072705f, 0.071678f, 0.070768f, 0.070120f, 0.070423f, 0.071853f, 0.074033f, 0.076789f, 0.079999f, 0.083058f, 0.085305f, 0.086394f, 0.085686f, 0.082340f, 0.076614f, 0.069777f, 0.062351f, 0.054034f, 0.045374f, 0.037457f, 0.030035f, 0.022223f, 0.014513f, 0.007727f, 0.001194f, -0.005463f, -0.010784f, -0.014329f, -0.017958f, + -0.021688f, -0.022941f, -0.022426f, -0.024089f, -0.026735f, -0.025120f, -0.021928f, -0.025401f, -0.031768f, -0.028507f, -0.020527f, -0.027990f, -0.046743f, -0.042080f, -0.003396f, 0.027264f, 0.013170f, -0.020073f, -0.025760f, -0.008495f, -0.005552f, -0.014133f, 0.003435f, 0.044906f, 0.059066f, 0.024448f, -0.015911f, -0.021124f, -0.009130f, -0.017009f, -0.041372f, -0.056366f, -0.066541f, -0.097055f, -0.137463f, -0.138780f, -0.079675f, -0.003607f, 0.033428f, 0.030812f, 0.028961f, 0.041471f, 0.044399f, 0.035401f, 0.052169f, 0.103505f, 0.125865f, 0.058885f} + }, + { + {-0.008208f, -0.013688f, -0.006252f, -0.003509f, -0.000109f, 0.028292f, 0.061055f, 0.024138f, -0.104438f, -0.212259f, -0.151442f, 0.066373f, 0.240645f, 0.196077f, -0.011619f, -0.162771f, -0.129256f, 0.005131f, 0.087028f, 0.080806f, 0.064102f, 0.086674f, 0.110230f, 0.085283f, 0.023202f, -0.032808f, -0.069022f, -0.103127f, -0.145227f, -0.184194f, -0.205940f, -0.206303f, -0.187706f, -0.155585f, -0.118331f, -0.083351f, -0.052728f, -0.025564f, -0.002289f, 0.015831f, 0.028630f, 0.036097f, 0.037847f, 0.035268f, 0.032049f, 0.031340f, 0.033967f, 0.039715f, 0.048284f, 0.058597f, 0.068960f, 0.078321f, 0.086272f, 0.091981f, 0.094350f, 0.093104f, 0.088896f, 0.082572f, 0.074997f, 0.067252f, 0.060472f, 0.055558f, 0.053169f, 0.053701f, 0.057297f, 0.064029f, 0.073926f, 0.086744f, 0.102064f, 0.119670f, 0.139384f, 0.160516f, 0.181938f, 0.202628f, 0.221700f, 0.238171f, 0.251219f, 0.260419f, 0.265483f, 0.266392f, 0.264039f, 0.259842f, 0.254367f, 0.247216f, 0.238440f, 0.228874f, 0.218946f, 0.208612f, 0.198629f, 0.190002f, 0.181465f, 0.169225f, 0.150296f, 0.124983f, 0.095177f, 0.061211f, + 0.021451f, -0.025424f, -0.078440f, -0.134573f, -0.190595f, -0.244573f, -0.295574f, -0.342341f, -0.383017f, -0.416353f, -0.442566f, -0.462633f, -0.476956f, -0.484792f, -0.484883f, -0.476795f, -0.461886f, -0.442644f, -0.420810f, -0.396369f, -0.368491f, -0.337007f, -0.302883f, -0.267801f, -0.233394f, -0.200316f, -0.167839f, -0.134651f, -0.100107f, -0.064503f, -0.028445f, 0.007706f, 0.044017f, 0.080865f, 0.118334f, 0.155669f, 0.191736f, 0.225992f, 0.258520f, 0.289333f, 0.318229f, 0.344969f, 0.368855f, 0.388566f, 0.403168f, 0.412970f, 0.418830f, 0.421249f, 0.420617f, 0.417464f, 0.411799f, 0.403018f, 0.391082f, 0.377094f, 0.362346f, 0.347502f, 0.332870f, 0.318542f, 0.303993f, 0.288174f, 0.270212f, 0.249812f, 0.227373f, 0.204002f, 0.180881f, 0.158425f, 0.136570f, 0.115633f, 0.095977f, 0.077237f, 0.059024f, 0.041966f, 0.026915f, 0.013775f, 0.002182f, -0.007580f, -0.015397f, -0.021975f, -0.027835f, -0.032904f, -0.037503f, -0.042152f, -0.046265f, -0.048885f, -0.050394f, -0.051562f, -0.051807f, -0.050532f, -0.048722f, -0.047061f, -0.044541f, -0.040961f, -0.037883f, -0.035465f, -0.032172f, -0.028676f, + -0.027034f, -0.025811f, -0.022482f, -0.019608f, -0.020221f, -0.019720f, -0.013487f, -0.008119f, -0.010233f, -0.010395f, 0.001311f, 0.010757f, -0.000943f, -0.017589f, -0.002503f, 0.044026f, 0.079204f, 0.078273f, 0.062973f, 0.057328f, 0.054722f, 0.047981f, 0.053572f, 0.079412f, 0.100675f, 0.095962f, 0.081490f, 0.082712f, 0.095429f, 0.100415f, 0.094405f, 0.081773f, 0.057784f, 0.027126f, 0.018211f, 0.048214f, 0.088778f, 0.097349f, 0.072951f, 0.051550f, 0.052834f, 0.062422f, 0.067011f, 0.076631f, 0.100316f, 0.119769f, 0.103439f, 0.041360f}, + {-0.008208f, -0.013688f, -0.006252f, -0.003509f, -0.000109f, 0.028292f, 0.061055f, 0.024138f, -0.104438f, -0.212259f, -0.151442f, 0.066373f, 0.240645f, 0.196077f, -0.011619f, -0.162771f, -0.129256f, 0.005131f, 0.087028f, 0.080806f, 0.064102f, 0.086674f, 0.110230f, 0.085283f, 0.023202f, -0.032808f, -0.069022f, -0.103127f, -0.145227f, -0.184194f, -0.205940f, -0.206303f, -0.187706f, -0.155585f, -0.118331f, -0.083351f, -0.052728f, -0.025564f, -0.002289f, 0.015831f, 0.028630f, 0.036097f, 0.037847f, 0.035268f, 0.032049f, 0.031340f, 0.033967f, 0.039715f, 0.048284f, 0.058597f, 0.068960f, 0.078321f, 0.086272f, 0.091981f, 0.094350f, 0.093104f, 0.088896f, 0.082572f, 0.074997f, 0.067252f, 0.060472f, 0.055558f, 0.053169f, 0.053701f, 0.057297f, 0.064029f, 0.073926f, 0.086744f, 0.102064f, 0.119670f, 0.139384f, 0.160516f, 0.181938f, 0.202628f, 0.221700f, 0.238171f, 0.251219f, 0.260419f, 0.265483f, 0.266392f, 0.264039f, 0.259842f, 0.254367f, 0.247216f, 0.238440f, 0.228874f, 0.218946f, 0.208612f, 0.198629f, 0.190002f, 0.181465f, 0.169225f, 0.150296f, 0.124983f, 0.095177f, 0.061211f, + 0.021451f, -0.025424f, -0.078440f, -0.134573f, -0.190595f, -0.244573f, -0.295574f, -0.342341f, -0.383017f, -0.416353f, -0.442566f, -0.462633f, -0.476956f, -0.484792f, -0.484883f, -0.476795f, -0.461886f, -0.442644f, -0.420810f, -0.396369f, -0.368491f, -0.337007f, -0.302883f, -0.267801f, -0.233394f, -0.200316f, -0.167839f, -0.134651f, -0.100107f, -0.064503f, -0.028445f, 0.007706f, 0.044017f, 0.080865f, 0.118334f, 0.155669f, 0.191736f, 0.225992f, 0.258520f, 0.289333f, 0.318229f, 0.344969f, 0.368855f, 0.388566f, 0.403168f, 0.412970f, 0.418830f, 0.421249f, 0.420617f, 0.417464f, 0.411799f, 0.403018f, 0.391082f, 0.377094f, 0.362346f, 0.347502f, 0.332870f, 0.318542f, 0.303993f, 0.288174f, 0.270212f, 0.249812f, 0.227373f, 0.204002f, 0.180881f, 0.158425f, 0.136570f, 0.115633f, 0.095977f, 0.077237f, 0.059024f, 0.041966f, 0.026915f, 0.013775f, 0.002182f, -0.007580f, -0.015397f, -0.021975f, -0.027835f, -0.032904f, -0.037503f, -0.042152f, -0.046265f, -0.048885f, -0.050394f, -0.051562f, -0.051807f, -0.050532f, -0.048722f, -0.047061f, -0.044541f, -0.040961f, -0.037883f, -0.035465f, -0.032172f, -0.028676f, + -0.027034f, -0.025811f, -0.022482f, -0.019608f, -0.020221f, -0.019720f, -0.013487f, -0.008119f, -0.010233f, -0.010395f, 0.001311f, 0.010757f, -0.000943f, -0.017589f, -0.002503f, 0.044026f, 0.079204f, 0.078273f, 0.062973f, 0.057328f, 0.054722f, 0.047981f, 0.053572f, 0.079412f, 0.100675f, 0.095962f, 0.081490f, 0.082712f, 0.095429f, 0.100415f, 0.094405f, 0.081773f, 0.057784f, 0.027126f, 0.018211f, 0.048214f, 0.088778f, 0.097349f, 0.072951f, 0.051550f, 0.052834f, 0.062422f, 0.067011f, 0.076631f, 0.100316f, 0.119769f, 0.103439f, 0.041360f} + }, + { + {0.000219f, 0.000300f, -0.000470f, -0.002728f, -0.006703f, -0.008428f, -0.000706f, 0.012589f, 0.007717f, -0.030161f, -0.063150f, -0.022389f, 0.092419f, 0.167025f, 0.089527f, -0.089858f, -0.186663f, -0.096473f, 0.078276f, 0.157986f, 0.092888f, -0.015711f, -0.064513f, -0.046259f, -0.006048f, 0.029868f, 0.057048f, 0.067711f, 0.054805f, 0.025907f, -0.004867f, -0.030693f, -0.050327f, -0.062834f, -0.070993f, -0.082208f, -0.100409f, -0.121588f, -0.139387f, -0.150407f, -0.153184f, -0.147055f, -0.133768f, -0.117152f, -0.100383f, -0.085266f, -0.073367f, -0.065601f, -0.061218f, -0.058786f, -0.057561f, -0.056982f, -0.055899f, -0.053334f, -0.049279f, -0.044299f, -0.039109f, -0.034702f, -0.031969f, -0.031001f, -0.031321f, -0.032558f, -0.034285f, -0.035576f, -0.035504f, -0.033868f, -0.030920f, -0.026684f, -0.021019f, -0.014048f, -0.006042f, 0.002921f, 0.012786f, 0.023091f, 0.033121f, 0.042601f, 0.051888f, 0.061215f, 0.070060f, 0.077878f, 0.085314f, 0.093797f, 0.103649f, 0.113550f, 0.122419f, 0.130931f, 0.140271f, 0.149926f, 0.157672f, 0.161652f, 0.161819f, 0.159329f, 0.155027f, 0.148727f, 0.139965f, 0.129315f, + 0.118619f, 0.109608f, 0.102489f, 0.096346f, 0.090816f, 0.087026f, 0.086861f, 0.091494f, 0.100455f, 0.111859f, 0.123631f, 0.134788f, 0.145673f, 0.157015f, 0.168875f, 0.180410f, 0.190453f, 0.198281f, 0.203996f, 0.208295f, 0.211928f, 0.215320f, 0.218485f, 0.221142f, 0.222973f, 0.223938f, 0.224257f, 0.223992f, 0.222832f, 0.220406f, 0.216624f, 0.211660f, 0.205873f, 0.199818f, 0.194086f, 0.189011f, 0.184682f, 0.181185f, 0.178623f, 0.176955f, 0.176031f, 0.175702f, 0.175731f, 0.175711f, 0.175153f, 0.173544f, 0.170305f, 0.164929f, 0.157174f, 0.146976f, 0.134373f, 0.119682f, 0.103470f, 0.086119f, 0.067710f, 0.048467f, 0.028881f, 0.009271f, -0.010260f, -0.029330f, -0.047315f, -0.063863f, -0.078855f, -0.091983f, -0.102963f, -0.111948f, -0.119186f, -0.124595f, -0.128116f, -0.130005f, -0.130481f, -0.129750f, -0.128536f, -0.127737f, -0.127523f, -0.127680f, -0.128531f, -0.130397f, -0.132664f, -0.134604f, -0.136451f, -0.138583f, -0.140708f, -0.142803f, -0.145415f, -0.148218f, -0.150086f, -0.150982f, -0.151526f, -0.150868f, -0.147786f, -0.143240f, -0.138700f, -0.133465f, -0.126931f, -0.120761f, + -0.115292f, -0.108172f, -0.099972f, -0.094325f, -0.089251f, -0.078635f, -0.065607f, -0.059298f, -0.054658f, -0.037602f, -0.015717f, -0.011967f, -0.016342f, 0.013157f, 0.076563f, 0.108377f, 0.069685f, 0.015195f, 0.011815f, 0.037173f, 0.033724f, 0.024026f, 0.075469f, 0.166990f, 0.196872f, 0.134676f, 0.067436f, 0.066393f, 0.096537f, 0.098834f, 0.080944f, 0.071627f, 0.053354f, 0.007270f, -0.023186f, 0.015389f, 0.096957f, 0.143102f, 0.126994f, 0.094569f, 0.086781f, 0.093942f, 0.095842f, 0.101364f, 0.124293f, 0.145641f, 0.126044f, 0.050604f}, + {0.000219f, 0.000300f, -0.000470f, -0.002728f, -0.006703f, -0.008428f, -0.000706f, 0.012589f, 0.007717f, -0.030161f, -0.063150f, -0.022389f, 0.092419f, 0.167025f, 0.089527f, -0.089858f, -0.186663f, -0.096473f, 0.078276f, 0.157986f, 0.092888f, -0.015711f, -0.064513f, -0.046259f, -0.006048f, 0.029868f, 0.057048f, 0.067711f, 0.054805f, 0.025907f, -0.004867f, -0.030693f, -0.050327f, -0.062834f, -0.070993f, -0.082208f, -0.100409f, -0.121588f, -0.139387f, -0.150407f, -0.153184f, -0.147055f, -0.133768f, -0.117152f, -0.100383f, -0.085266f, -0.073367f, -0.065601f, -0.061218f, -0.058786f, -0.057561f, -0.056982f, -0.055899f, -0.053334f, -0.049279f, -0.044299f, -0.039109f, -0.034702f, -0.031969f, -0.031001f, -0.031321f, -0.032558f, -0.034285f, -0.035576f, -0.035504f, -0.033868f, -0.030920f, -0.026684f, -0.021019f, -0.014048f, -0.006042f, 0.002921f, 0.012786f, 0.023091f, 0.033121f, 0.042601f, 0.051888f, 0.061215f, 0.070060f, 0.077878f, 0.085314f, 0.093797f, 0.103649f, 0.113550f, 0.122419f, 0.130931f, 0.140271f, 0.149926f, 0.157672f, 0.161652f, 0.161819f, 0.159329f, 0.155027f, 0.148727f, 0.139965f, 0.129315f, + 0.118619f, 0.109608f, 0.102489f, 0.096346f, 0.090816f, 0.087026f, 0.086861f, 0.091494f, 0.100455f, 0.111859f, 0.123631f, 0.134788f, 0.145673f, 0.157015f, 0.168875f, 0.180410f, 0.190453f, 0.198281f, 0.203996f, 0.208295f, 0.211928f, 0.215320f, 0.218485f, 0.221142f, 0.222973f, 0.223938f, 0.224257f, 0.223992f, 0.222832f, 0.220406f, 0.216624f, 0.211660f, 0.205873f, 0.199818f, 0.194086f, 0.189011f, 0.184682f, 0.181185f, 0.178623f, 0.176955f, 0.176031f, 0.175702f, 0.175731f, 0.175711f, 0.175153f, 0.173544f, 0.170305f, 0.164929f, 0.157174f, 0.146976f, 0.134373f, 0.119682f, 0.103470f, 0.086119f, 0.067710f, 0.048467f, 0.028881f, 0.009271f, -0.010260f, -0.029330f, -0.047315f, -0.063863f, -0.078855f, -0.091983f, -0.102963f, -0.111948f, -0.119186f, -0.124595f, -0.128116f, -0.130005f, -0.130481f, -0.129750f, -0.128536f, -0.127737f, -0.127523f, -0.127680f, -0.128531f, -0.130397f, -0.132664f, -0.134604f, -0.136451f, -0.138583f, -0.140708f, -0.142803f, -0.145415f, -0.148218f, -0.150086f, -0.150982f, -0.151526f, -0.150868f, -0.147786f, -0.143240f, -0.138700f, -0.133465f, -0.126931f, -0.120761f, + -0.115292f, -0.108172f, -0.099972f, -0.094325f, -0.089251f, -0.078635f, -0.065607f, -0.059298f, -0.054658f, -0.037602f, -0.015717f, -0.011967f, -0.016342f, 0.013157f, 0.076563f, 0.108377f, 0.069685f, 0.015195f, 0.011815f, 0.037173f, 0.033724f, 0.024026f, 0.075469f, 0.166990f, 0.196872f, 0.134676f, 0.067436f, 0.066393f, 0.096537f, 0.098834f, 0.080944f, 0.071627f, 0.053354f, 0.007270f, -0.023186f, 0.015389f, 0.096957f, 0.143102f, 0.126994f, 0.094569f, 0.086781f, 0.093942f, 0.095842f, 0.101364f, 0.124293f, 0.145641f, 0.126044f, 0.050604f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 32000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]={{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}},{{160},{160}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]={ + { + {0.931532f, 0.779586f, 0.534806f, 0.267486f, 0.027500f, -0.161171f, -0.309658f, -0.450275f, -0.580679f, -0.647362f, -0.612734f, -0.489723f, -0.275668f, 0.054919f, 0.402480f, 0.495609f, 0.176032f, -0.298719f, -0.442377f, -0.084625f, 0.429064f, 0.650237f, 0.490213f, 0.176336f, -0.101893f, -0.334041f, -0.548421f, -0.712689f, -0.798336f, -0.833235f, -0.851109f, -0.849315f, -0.819587f, -0.775679f, -0.732168f, -0.686769f, -0.635729f, -0.584686f, -0.537641f, -0.491741f, -0.445951f, -0.402650f, -0.360980f, -0.318308f, -0.276103f, -0.236981f, -0.199525f, -0.161814f, -0.125607f, -0.092516f, -0.060704f, -0.028744f, 0.001865f, 0.030189f, 0.057418f, 0.083709f, 0.107616f, 0.129141f, 0.149647f, 0.169072f, 0.186505f, 0.202619f, 0.218604f, 0.233964f, 0.247817f, 0.260837f, 0.273890f, 0.286455f, 0.298003f, 0.309223f, 0.320684f, 0.331955f, 0.342805f, 0.353754f, 0.365034f, 0.376301f, 0.387457f, 0.398686f, 0.409965f, 0.421281f, 0.432717f, 0.443847f, 0.453997f, 0.463372f, 0.472714f, 0.481764f, 0.489489f, 0.495891f, 0.502022f, 0.508134f, 0.513263f, 0.516755f, 0.518993f, 0.520614f, 0.521907f, 0.522857f, + 0.523146f, 0.522523f, 0.521573f, 0.521473f, 0.522622f, 0.524278f, 0.525810f, 0.527544f, 0.530160f, 0.534008f, 0.539089f, 0.545026f, 0.551103f, 0.556966f, 0.563115f, 0.570181f, 0.578053f, 0.586133f, 0.593998f, 0.601393f, 0.608145f, 0.614471f, 0.620875f, 0.627436f, 0.633702f, 0.639394f, 0.644645f, 0.649553f, 0.654100f, 0.658455f, 0.662756f, 0.666713f, 0.669967f, 0.672628f, 0.675002f, 0.677150f, 0.679153f, 0.681355f, 0.683893f, 0.686498f, 0.689096f, 0.692014f, 0.695373f, 0.699038f, 0.703324f, 0.708802f, 0.715349f, 0.722435f, 0.730226f, 0.739134f, 0.748704f, 0.758497f, 0.769323f, 0.781691f, 0.794631f, 0.808625f, 0.825667f, 0.839224f, 0.827293f, 0.769028f, 0.673613f, 0.581351f, 0.526749f, 0.508903f}, + {0.931532f, 0.779586f, 0.534806f, 0.267486f, 0.027500f, -0.161171f, -0.309658f, -0.450275f, -0.580679f, -0.647362f, -0.612734f, -0.489723f, -0.275668f, 0.054919f, 0.402480f, 0.495609f, 0.176032f, -0.298719f, -0.442377f, -0.084625f, 0.429064f, 0.650237f, 0.490213f, 0.176336f, -0.101893f, -0.334041f, -0.548421f, -0.712689f, -0.798336f, -0.833235f, -0.851109f, -0.849315f, -0.819587f, -0.775679f, -0.732168f, -0.686769f, -0.635729f, -0.584686f, -0.537641f, -0.491741f, -0.445951f, -0.402650f, -0.360980f, -0.318308f, -0.276103f, -0.236981f, -0.199525f, -0.161814f, -0.125607f, -0.092516f, -0.060704f, -0.028744f, 0.001865f, 0.030189f, 0.057418f, 0.083709f, 0.107616f, 0.129141f, 0.149647f, 0.169072f, 0.186505f, 0.202619f, 0.218604f, 0.233964f, 0.247817f, 0.260837f, 0.273890f, 0.286455f, 0.298003f, 0.309223f, 0.320684f, 0.331955f, 0.342805f, 0.353754f, 0.365034f, 0.376301f, 0.387457f, 0.398686f, 0.409965f, 0.421281f, 0.432717f, 0.443847f, 0.453997f, 0.463372f, 0.472714f, 0.481764f, 0.489489f, 0.495891f, 0.502022f, 0.508134f, 0.513263f, 0.516755f, 0.518993f, 0.520614f, 0.521907f, 0.522857f, + 0.523146f, 0.522523f, 0.521573f, 0.521473f, 0.522622f, 0.524278f, 0.525810f, 0.527544f, 0.530160f, 0.534008f, 0.539089f, 0.545026f, 0.551103f, 0.556966f, 0.563115f, 0.570181f, 0.578053f, 0.586133f, 0.593998f, 0.601393f, 0.608145f, 0.614471f, 0.620875f, 0.627436f, 0.633702f, 0.639394f, 0.644645f, 0.649553f, 0.654100f, 0.658455f, 0.662756f, 0.666713f, 0.669967f, 0.672628f, 0.675002f, 0.677150f, 0.679153f, 0.681355f, 0.683893f, 0.686498f, 0.689096f, 0.692014f, 0.695373f, 0.699038f, 0.703324f, 0.708802f, 0.715349f, 0.722435f, 0.730226f, 0.739134f, 0.748704f, 0.758497f, 0.769323f, 0.781691f, 0.794631f, 0.808625f, 0.825667f, 0.839224f, 0.827293f, 0.769028f, 0.673613f, 0.581351f, 0.526749f, 0.508903f} + }, + { + {0.025824f, 0.254482f, 0.612140f, 0.908281f, 0.966338f, 0.746349f, 0.326804f, -0.189774f, -0.683810f, -1.011094f, -1.110601f, -1.050792f, -0.841050f, -0.331373f, 0.453002f, 0.990359f, 0.684451f, -0.303752f, -1.023046f, -0.756945f, 0.181886f, 0.916524f, 1.017605f, 0.742230f, 0.451730f, 0.204139f, -0.066098f, -0.311503f, -0.457293f, -0.536699f, -0.617322f, -0.694602f, -0.735639f, -0.751680f, -0.768963f, -0.782765f, -0.780489f, -0.769523f, -0.757459f, -0.737198f, -0.705559f, -0.670342f, -0.633558f, -0.589942f, -0.541742f, -0.495987f, -0.451106f, -0.402147f, -0.352739f, -0.308813f, -0.268274f, -0.227132f, -0.187240f, -0.150381f, -0.113561f, -0.075466f, -0.039106f, -0.005245f, 0.028554f, 0.061642f, 0.090951f, 0.117114f, 0.142717f, 0.166563f, 0.186151f, 0.202842f, 0.218927f, 0.233139f, 0.243777f, 0.252381f, 0.260617f, 0.267492f, 0.272370f, 0.276920f, 0.282318f, 0.288000f, 0.293924f, 0.300949f, 0.309137f, 0.318235f, 0.328763f, 0.340586f, 0.352257f, 0.363455f, 0.375587f, 0.388768f, 0.401116f, 0.411976f, 0.422808f, 0.434307f, 0.445690f, 0.457064f, 0.469628f, 0.483664f, 0.498780f, 0.515481f, + 0.534276f, 0.554263f, 0.574434f, 0.595002f, 0.615889f, 0.635594f, 0.652882f, 0.667922f, 0.680882f, 0.691118f, 0.698246f, 0.702348f, 0.703094f, 0.700394f, 0.695668f, 0.690852f, 0.686570f, 0.682549f, 0.678880f, 0.675687f, 0.672709f, 0.670365f, 0.669993f, 0.672124f, 0.675718f, 0.679580f, 0.683205f, 0.686101f, 0.687934f, 0.689429f, 0.691608f, 0.694284f, 0.696649f, 0.698823f, 0.701383f, 0.704096f, 0.706544f, 0.709152f, 0.712317f, 0.715522f, 0.718443f, 0.721714f, 0.725654f, 0.729661f, 0.733628f, 0.738335f, 0.743905f, 0.749740f, 0.756281f, 0.764683f, 0.774778f, 0.785838f, 0.798756f, 0.814520f, 0.832066f, 0.851590f, 0.875921f, 0.899332f, 0.897448f, 0.844156f, 0.745650f, 0.645128f, 0.582813f, 0.561026f}, + {-0.025824f, -0.254482f, -0.612140f, -0.908281f, -0.966338f, -0.746349f, -0.326804f, 0.189774f, 0.683810f, 1.011094f, 1.110601f, 1.050792f, 0.841050f, 0.331373f, -0.453002f, -0.990359f, -0.684451f, 0.303752f, 1.023046f, 0.756945f, -0.181886f, -0.916524f, -1.017605f, -0.742230f, -0.451730f, -0.204139f, 0.066098f, 0.311503f, 0.457293f, 0.536699f, 0.617322f, 0.694602f, 0.735639f, 0.751680f, 0.768963f, 0.782765f, 0.780489f, 0.769523f, 0.757459f, 0.737198f, 0.705559f, 0.670342f, 0.633558f, 0.589942f, 0.541742f, 0.495987f, 0.451106f, 0.402147f, 0.352739f, 0.308813f, 0.268274f, 0.227132f, 0.187240f, 0.150381f, 0.113561f, 0.075466f, 0.039106f, 0.005245f, -0.028554f, -0.061642f, -0.090951f, -0.117114f, -0.142717f, -0.166563f, -0.186151f, -0.202842f, -0.218927f, -0.233139f, -0.243777f, -0.252381f, -0.260617f, -0.267492f, -0.272370f, -0.276920f, -0.282318f, -0.288000f, -0.293924f, -0.300949f, -0.309137f, -0.318235f, -0.328763f, -0.340586f, -0.352257f, -0.363455f, -0.375587f, -0.388768f, -0.401116f, -0.411976f, -0.422808f, -0.434307f, -0.445690f, -0.457064f, -0.469628f, -0.483664f, -0.498780f, -0.515481f, + -0.534276f, -0.554263f, -0.574434f, -0.595002f, -0.615889f, -0.635594f, -0.652882f, -0.667922f, -0.680882f, -0.691118f, -0.698246f, -0.702348f, -0.703094f, -0.700394f, -0.695668f, -0.690852f, -0.686570f, -0.682549f, -0.678880f, -0.675687f, -0.672709f, -0.670365f, -0.669993f, -0.672124f, -0.675718f, -0.679580f, -0.683205f, -0.686101f, -0.687934f, -0.689429f, -0.691608f, -0.694284f, -0.696649f, -0.698823f, -0.701383f, -0.704096f, -0.706544f, -0.709152f, -0.712317f, -0.715522f, -0.718443f, -0.721714f, -0.725654f, -0.729661f, -0.733628f, -0.738335f, -0.743905f, -0.749740f, -0.756281f, -0.764683f, -0.774778f, -0.785838f, -0.798756f, -0.814520f, -0.832066f, -0.851590f, -0.875921f, -0.899332f, -0.897448f, -0.844156f, -0.745650f, -0.645128f, -0.582813f, -0.561026f} + }, + { + {0.119957f, 0.117962f, 0.069212f, -0.029675f, -0.108741f, -0.102118f, -0.023931f, 0.056050f, 0.088085f, 0.070763f, 0.023879f, -0.033299f, -0.074494f, -0.065471f, 0.002786f, 0.081205f, 0.092077f, 0.015549f, -0.067599f, -0.053344f, 0.064674f, 0.183481f, 0.206152f, 0.135803f, 0.042639f, -0.024752f, -0.066208f, -0.094901f, -0.114472f, -0.127164f, -0.137723f, -0.145267f, -0.144666f, -0.136342f, -0.126255f, -0.118741f, -0.116220f, -0.122116f, -0.137393f, -0.157052f, -0.174865f, -0.189037f, -0.200404f, -0.208724f, -0.213653f, -0.216386f, -0.217918f, -0.217629f, -0.214601f, -0.208243f, -0.197216f, -0.179855f, -0.155904f, -0.126242f, -0.091188f, -0.050638f, -0.005448f, 0.042864f, 0.093516f, 0.146388f, 0.200914f, 0.256043f, 0.311008f, 0.365277f, 0.417798f, 0.466855f, 0.510693f, 0.547948f, 0.577466f, 0.598067f, 0.608767f, 0.609124f, 0.599179f, 0.579326f, 0.550670f, 0.515166f, 0.474707f, 0.430356f, 0.383305f, 0.336114f, 0.291535f, 0.250182f, 0.211022f, 0.174404f, 0.142783f, 0.117629f, 0.097265f, 0.079103f, 0.063058f, 0.051346f, 0.045393f, 0.044197f, 0.045733f, 0.048982f, 0.054235f, 0.062014f, + 0.072137f, 0.083617f, 0.095036f, 0.105002f, 0.112583f, 0.117569f, 0.120284f, 0.120922f, 0.118935f, 0.113194f, 0.102993f, 0.088978f, 0.072927f, 0.056475f, 0.040135f, 0.023595f, 0.006691f, -0.010161f, -0.026205f, -0.040628f, -0.052638f, -0.061602f, -0.067163f, -0.069194f, -0.067764f, -0.063204f, -0.056002f, -0.046549f, -0.035172f, -0.022453f, -0.009246f, 0.003678f, 0.015836f, 0.026957f, 0.036871f, 0.045370f, 0.052074f, 0.056677f, 0.059467f, 0.061374f, 0.063445f, 0.066522f, 0.071251f, 0.077736f, 0.085143f, 0.092280f, 0.098682f, 0.104606f, 0.110061f, 0.114592f, 0.117985f, 0.120397f, 0.121682f, 0.121377f, 0.119567f, 0.116933f, 0.113144f, 0.105492f, 0.090436f, 0.067892f, 0.043890f, 0.027049f, 0.020974f, 0.021165f}, + {0.119957f, 0.117962f, 0.069212f, -0.029675f, -0.108741f, -0.102118f, -0.023931f, 0.056050f, 0.088085f, 0.070763f, 0.023879f, -0.033299f, -0.074494f, -0.065471f, 0.002786f, 0.081205f, 0.092077f, 0.015549f, -0.067599f, -0.053344f, 0.064674f, 0.183481f, 0.206152f, 0.135803f, 0.042639f, -0.024752f, -0.066208f, -0.094901f, -0.114472f, -0.127164f, -0.137723f, -0.145267f, -0.144666f, -0.136342f, -0.126255f, -0.118741f, -0.116220f, -0.122116f, -0.137393f, -0.157052f, -0.174865f, -0.189037f, -0.200404f, -0.208724f, -0.213653f, -0.216386f, -0.217918f, -0.217629f, -0.214601f, -0.208243f, -0.197216f, -0.179855f, -0.155904f, -0.126242f, -0.091188f, -0.050638f, -0.005448f, 0.042864f, 0.093516f, 0.146388f, 0.200914f, 0.256043f, 0.311008f, 0.365277f, 0.417798f, 0.466855f, 0.510693f, 0.547948f, 0.577466f, 0.598067f, 0.608767f, 0.609124f, 0.599179f, 0.579326f, 0.550670f, 0.515166f, 0.474707f, 0.430356f, 0.383305f, 0.336114f, 0.291535f, 0.250182f, 0.211022f, 0.174404f, 0.142783f, 0.117629f, 0.097265f, 0.079103f, 0.063058f, 0.051346f, 0.045393f, 0.044197f, 0.045733f, 0.048982f, 0.054235f, 0.062014f, + 0.072137f, 0.083617f, 0.095036f, 0.105002f, 0.112583f, 0.117569f, 0.120284f, 0.120922f, 0.118935f, 0.113194f, 0.102993f, 0.088978f, 0.072927f, 0.056475f, 0.040135f, 0.023595f, 0.006691f, -0.010161f, -0.026205f, -0.040628f, -0.052638f, -0.061602f, -0.067163f, -0.069194f, -0.067764f, -0.063204f, -0.056002f, -0.046549f, -0.035172f, -0.022453f, -0.009246f, 0.003678f, 0.015836f, 0.026957f, 0.036871f, 0.045370f, 0.052074f, 0.056677f, 0.059467f, 0.061374f, 0.063445f, 0.066522f, 0.071251f, 0.077736f, 0.085143f, 0.092280f, 0.098682f, 0.104606f, 0.110061f, 0.114592f, 0.117985f, 0.120397f, 0.121682f, 0.121377f, 0.119567f, 0.116933f, 0.113144f, 0.105492f, 0.090436f, 0.067892f, 0.043890f, 0.027049f, 0.020974f, 0.021165f} + }, + { + {0.021954f, 0.048037f, 0.063092f, 0.031017f, -0.037723f, -0.084868f, -0.065201f, -0.005112f, 0.022895f, -0.015083f, -0.084921f, -0.142665f, -0.175582f, -0.165991f, -0.077530f, 0.064116f, 0.128907f, 0.015662f, -0.183455f, -0.248246f, -0.082450f, 0.177565f, 0.335035f, 0.337341f, 0.262762f, 0.175451f, 0.072571f, -0.054887f, -0.185560f, -0.298815f, -0.396893f, -0.485261f, -0.557320f, -0.605394f, -0.629649f, -0.632272f, -0.614250f, -0.579369f, -0.533822f, -0.482010f, -0.426968f, -0.372237f, -0.319708f, -0.268539f, -0.218575f, -0.171634f, -0.128178f, -0.086363f, -0.045502f, -0.007338f, 0.026484f, 0.055319f, 0.078139f, 0.094220f, 0.105266f, 0.114621f, 0.124529f, 0.135582f, 0.147984f, 0.161659f, 0.175672f, 0.188906f, 0.201046f, 0.212265f, 0.222531f, 0.231889f, 0.240937f, 0.250378f, 0.260180f, 0.269567f, 0.277872f, 0.285061f, 0.291048f, 0.294821f, 0.295039f, 0.291430f, 0.284567f, 0.274225f, 0.259431f, 0.240476f, 0.219205f, 0.196639f, 0.172071f, 0.145449f, 0.118875f, 0.094409f, 0.071829f, 0.049916f, 0.028662f, 0.008634f, -0.010832f, -0.031148f, -0.052563f, -0.074059f, -0.094995f, -0.115796f, + -0.136840f, -0.157354f, -0.175731f, -0.190760f, -0.202356f, -0.211001f, -0.216517f, -0.217735f, -0.213675f, -0.204779f, -0.192568f, -0.178136f, -0.161391f, -0.141749f, -0.119310f, -0.095356f, -0.071835f, -0.050142f, -0.030092f, -0.010201f, 0.010750f, 0.032456f, 0.053367f, 0.071957f, 0.087636f, 0.100966f, 0.113346f, 0.126179f, 0.139929f, 0.154026f, 0.167726f, 0.180816f, 0.193572f, 0.206537f, 0.220447f, 0.235905f, 0.252915f, 0.270947f, 0.289388f, 0.307739f, 0.325599f, 0.342846f, 0.359653f, 0.376064f, 0.391737f, 0.406191f, 0.418988f, 0.429712f, 0.438219f, 0.444820f, 0.449911f, 0.453835f, 0.457284f, 0.461020f, 0.465212f, 0.470429f, 0.478257f, 0.486742f, 0.485064f, 0.459936f, 0.412181f, 0.361516f, 0.328482f, 0.316016f}, + {0.021954f, 0.048037f, 0.063092f, 0.031017f, -0.037723f, -0.084868f, -0.065201f, -0.005112f, 0.022895f, -0.015083f, -0.084921f, -0.142665f, -0.175582f, -0.165991f, -0.077530f, 0.064116f, 0.128907f, 0.015662f, -0.183455f, -0.248246f, -0.082450f, 0.177565f, 0.335035f, 0.337341f, 0.262762f, 0.175451f, 0.072571f, -0.054887f, -0.185560f, -0.298815f, -0.396893f, -0.485261f, -0.557320f, -0.605394f, -0.629649f, -0.632272f, -0.614250f, -0.579369f, -0.533822f, -0.482010f, -0.426968f, -0.372237f, -0.319708f, -0.268539f, -0.218575f, -0.171634f, -0.128178f, -0.086363f, -0.045502f, -0.007338f, 0.026484f, 0.055319f, 0.078139f, 0.094220f, 0.105266f, 0.114621f, 0.124529f, 0.135582f, 0.147984f, 0.161659f, 0.175672f, 0.188906f, 0.201046f, 0.212265f, 0.222531f, 0.231889f, 0.240937f, 0.250378f, 0.260180f, 0.269567f, 0.277872f, 0.285061f, 0.291048f, 0.294821f, 0.295039f, 0.291430f, 0.284567f, 0.274225f, 0.259431f, 0.240476f, 0.219205f, 0.196639f, 0.172071f, 0.145449f, 0.118875f, 0.094409f, 0.071829f, 0.049916f, 0.028662f, 0.008634f, -0.010832f, -0.031148f, -0.052563f, -0.074059f, -0.094995f, -0.115796f, + -0.136840f, -0.157354f, -0.175731f, -0.190760f, -0.202356f, -0.211001f, -0.216517f, -0.217735f, -0.213675f, -0.204779f, -0.192568f, -0.178136f, -0.161391f, -0.141749f, -0.119310f, -0.095356f, -0.071835f, -0.050142f, -0.030092f, -0.010201f, 0.010750f, 0.032456f, 0.053367f, 0.071957f, 0.087636f, 0.100966f, 0.113346f, 0.126179f, 0.139929f, 0.154026f, 0.167726f, 0.180816f, 0.193572f, 0.206537f, 0.220447f, 0.235905f, 0.252915f, 0.270947f, 0.289388f, 0.307739f, 0.325599f, 0.342846f, 0.359653f, 0.376064f, 0.391737f, 0.406191f, 0.418988f, 0.429712f, 0.438219f, 0.444820f, 0.449911f, 0.453835f, 0.457284f, 0.461020f, 0.465212f, 0.470429f, 0.478257f, 0.486742f, 0.485064f, 0.459936f, 0.412181f, 0.361516f, 0.328482f, 0.316016f} + }, + { + {-0.007503f, -0.018071f, -0.022034f, -0.007019f, 0.015663f, 0.024279f, 0.019856f, 0.028228f, 0.059265f, 0.080034f, 0.041688f, -0.071985f, -0.216288f, -0.290455f, -0.199084f, 0.033503f, 0.219776f, 0.164507f, -0.103621f, -0.326326f, -0.288993f, -0.041795f, 0.199504f, 0.304980f, 0.304814f, 0.264038f, 0.192066f, 0.083050f, -0.037289f, -0.139466f, -0.222831f, -0.297054f, -0.358635f, -0.401608f, -0.430419f, -0.449077f, -0.451590f, -0.432074f, -0.394694f, -0.348591f, -0.300496f, -0.254823f, -0.214532f, -0.179585f, -0.148147f, -0.119436f, -0.093021f, -0.067108f, -0.040394f, -0.014078f, 0.010038f, 0.031708f, 0.051075f, 0.067427f, 0.080619f, 0.092054f, 0.103201f, 0.114496f, 0.126191f, 0.138824f, 0.152470f, 0.166746f, 0.181664f, 0.197385f, 0.213306f, 0.228573f, 0.243329f, 0.258289f, 0.273266f, 0.287270f, 0.300006f, 0.312023f, 0.323208f, 0.332273f, 0.338187f, 0.341130f, 0.341345f, 0.337872f, 0.329576f, 0.317081f, 0.302379f, 0.286336f, 0.267902f, 0.246477f, 0.223744f, 0.201743f, 0.179892f, 0.155773f, 0.128766f, 0.101142f, 0.075145f, 0.050682f, 0.026716f, 0.003617f, -0.017003f, -0.034092f, + -0.047931f, -0.059456f, -0.069308f, -0.077317f, -0.082784f, -0.085477f, -0.086182f, -0.086000f, -0.085634f, -0.085723f, -0.087061f, -0.089692f, -0.092489f, -0.094395f, -0.095590f, -0.096974f, -0.099214f, -0.102553f, -0.106591f, -0.109940f, -0.111114f, -0.110117f, -0.108385f, -0.107202f, -0.106996f, -0.107734f, -0.108885f, -0.109325f, -0.108294f, -0.106062f, -0.102988f, -0.098685f, -0.092663f, -0.084794f, -0.074707f, -0.061933f, -0.047004f, -0.031245f, -0.015438f, 0.000083f, 0.014483f, 0.027034f, 0.038033f, 0.047706f, 0.055152f, 0.059661f, 0.061803f, 0.062109f, 0.060454f, 0.057667f, 0.055600f, 0.054965f, 0.055463f, 0.057980f, 0.063846f, 0.072975f, 0.086512f, 0.108858f, 0.140638f, 0.171127f, 0.185558f, 0.180720f, 0.167370f, 0.157904f}, + {0.007503f, 0.018071f, 0.022034f, 0.007019f, -0.015663f, -0.024279f, -0.019856f, -0.028228f, -0.059265f, -0.080034f, -0.041688f, 0.071985f, 0.216288f, 0.290455f, 0.199084f, -0.033503f, -0.219776f, -0.164507f, 0.103621f, 0.326326f, 0.288993f, 0.041795f, -0.199504f, -0.304980f, -0.304814f, -0.264038f, -0.192066f, -0.083050f, 0.037289f, 0.139466f, 0.222831f, 0.297054f, 0.358635f, 0.401608f, 0.430419f, 0.449077f, 0.451590f, 0.432074f, 0.394694f, 0.348591f, 0.300496f, 0.254823f, 0.214532f, 0.179585f, 0.148147f, 0.119436f, 0.093021f, 0.067108f, 0.040394f, 0.014078f, -0.010038f, -0.031708f, -0.051075f, -0.067427f, -0.080619f, -0.092054f, -0.103201f, -0.114496f, -0.126191f, -0.138824f, -0.152470f, -0.166746f, -0.181664f, -0.197385f, -0.213306f, -0.228573f, -0.243329f, -0.258289f, -0.273266f, -0.287270f, -0.300006f, -0.312023f, -0.323208f, -0.332273f, -0.338187f, -0.341130f, -0.341345f, -0.337872f, -0.329576f, -0.317081f, -0.302379f, -0.286336f, -0.267902f, -0.246477f, -0.223744f, -0.201743f, -0.179892f, -0.155773f, -0.128766f, -0.101142f, -0.075145f, -0.050682f, -0.026716f, -0.003617f, 0.017003f, 0.034092f, + 0.047931f, 0.059456f, 0.069308f, 0.077317f, 0.082784f, 0.085477f, 0.086182f, 0.086000f, 0.085634f, 0.085723f, 0.087061f, 0.089692f, 0.092489f, 0.094395f, 0.095590f, 0.096974f, 0.099214f, 0.102553f, 0.106591f, 0.109940f, 0.111114f, 0.110117f, 0.108385f, 0.107202f, 0.106996f, 0.107734f, 0.108885f, 0.109325f, 0.108294f, 0.106062f, 0.102988f, 0.098685f, 0.092663f, 0.084794f, 0.074707f, 0.061933f, 0.047004f, 0.031245f, 0.015438f, -0.000083f, -0.014483f, -0.027034f, -0.038033f, -0.047706f, -0.055152f, -0.059661f, -0.061803f, -0.062109f, -0.060454f, -0.057667f, -0.055600f, -0.054965f, -0.055463f, -0.057980f, -0.063846f, -0.072975f, -0.086512f, -0.108858f, -0.140638f, -0.171127f, -0.185558f, -0.180720f, -0.167370f, -0.157904f} + }, + { + {0.033462f, -0.011452f, -0.017620f, 0.032435f, 0.045854f, -0.028637f, -0.090702f, -0.014859f, 0.157822f, 0.248642f, 0.155687f, -0.038140f, -0.175256f, -0.171621f, -0.049992f, 0.096608f, 0.151735f, 0.059734f, -0.096679f, -0.157632f, -0.062095f, 0.083857f, 0.144231f, 0.103916f, 0.042535f, 0.012755f, 0.005878f, 0.008085f, 0.027262f, 0.065497f, 0.106896f, 0.138036f, 0.157486f, 0.165566f, 0.161837f, 0.150604f, 0.136230f, 0.115874f, 0.085377f, 0.047978f, 0.010903f, -0.021750f, -0.048159f, -0.066253f, -0.076374f, -0.082524f, -0.088309f, -0.094475f, -0.100881f, -0.107392f, -0.112694f, -0.115260f, -0.115292f, -0.113369f, -0.108048f, -0.096922f, -0.079156f, -0.055336f, -0.025908f, 0.008746f, 0.047468f, 0.088692f, 0.131249f, 0.174377f, 0.217290f, 0.258854f, 0.297502f, 0.331588f, 0.359765f, 0.380676f, 0.392592f, 0.393999f, 0.384351f, 0.363891f, 0.333348f, 0.294223f, 0.248522f, 0.197787f, 0.143366f, 0.087648f, 0.033362f, -0.018763f, -0.069801f, -0.119555f, -0.165608f, -0.206270f, -0.242567f, -0.276200f, -0.307129f, -0.334420f, -0.358104f, -0.378747f, -0.395911f, -0.408313f, -0.415200f, -0.416578f, + -0.412241f, -0.401426f, -0.383736f, -0.359890f, -0.331149f, -0.298118f, -0.260569f, -0.218772f, -0.174893f, -0.132630f, -0.094946f, -0.062032f, -0.031764f, -0.002387f, 0.025391f, 0.049012f, 0.066448f, 0.077765f, 0.084806f, 0.089808f, 0.094109f, 0.097653f, 0.099678f, 0.099974f, 0.099364f, 0.099047f, 0.099882f, 0.102244f, 0.105972f, 0.110354f, 0.114607f, 0.118404f, 0.121573f, 0.123531f, 0.123564f, 0.121439f, 0.117280f, 0.111181f, 0.103433f, 0.094690f, 0.085509f, 0.076144f, 0.066975f, 0.058481f, 0.050601f, 0.042886f, 0.035360f, 0.028387f, 0.021756f, 0.014870f, 0.007725f, 0.000696f, -0.006360f, -0.013704f, -0.020901f, -0.027694f, -0.035063f, -0.043655f, -0.051368f, -0.054456f, -0.051542f, -0.045299f, -0.039709f, -0.036841f}, + {-0.033462f, 0.011452f, 0.017620f, -0.032435f, -0.045854f, 0.028637f, 0.090702f, 0.014859f, -0.157822f, -0.248642f, -0.155687f, 0.038140f, 0.175256f, 0.171621f, 0.049992f, -0.096608f, -0.151735f, -0.059734f, 0.096679f, 0.157632f, 0.062095f, -0.083857f, -0.144231f, -0.103916f, -0.042535f, -0.012755f, -0.005878f, -0.008085f, -0.027262f, -0.065497f, -0.106896f, -0.138036f, -0.157486f, -0.165566f, -0.161837f, -0.150604f, -0.136230f, -0.115874f, -0.085377f, -0.047978f, -0.010903f, 0.021750f, 0.048159f, 0.066253f, 0.076374f, 0.082524f, 0.088309f, 0.094475f, 0.100881f, 0.107392f, 0.112694f, 0.115260f, 0.115292f, 0.113369f, 0.108048f, 0.096922f, 0.079156f, 0.055336f, 0.025908f, -0.008746f, -0.047468f, -0.088692f, -0.131249f, -0.174377f, -0.217290f, -0.258854f, -0.297502f, -0.331588f, -0.359765f, -0.380676f, -0.392592f, -0.393999f, -0.384351f, -0.363891f, -0.333348f, -0.294223f, -0.248522f, -0.197787f, -0.143366f, -0.087648f, -0.033362f, 0.018763f, 0.069801f, 0.119555f, 0.165608f, 0.206270f, 0.242567f, 0.276200f, 0.307129f, 0.334420f, 0.358104f, 0.378747f, 0.395911f, 0.408313f, 0.415200f, 0.416578f, + 0.412241f, 0.401426f, 0.383736f, 0.359890f, 0.331149f, 0.298118f, 0.260569f, 0.218772f, 0.174893f, 0.132630f, 0.094946f, 0.062032f, 0.031764f, 0.002387f, -0.025391f, -0.049012f, -0.066448f, -0.077765f, -0.084806f, -0.089808f, -0.094109f, -0.097653f, -0.099678f, -0.099974f, -0.099364f, -0.099047f, -0.099882f, -0.102244f, -0.105972f, -0.110354f, -0.114607f, -0.118404f, -0.121573f, -0.123531f, -0.123564f, -0.121439f, -0.117280f, -0.111181f, -0.103433f, -0.094690f, -0.085509f, -0.076144f, -0.066975f, -0.058481f, -0.050601f, -0.042886f, -0.035360f, -0.028387f, -0.021756f, -0.014870f, -0.007725f, -0.000696f, 0.006360f, 0.013704f, 0.020901f, 0.027694f, 0.035063f, 0.043655f, 0.051368f, 0.054456f, 0.051542f, 0.045299f, 0.039709f, 0.036841f} + }, + { + {0.007632f, 0.022548f, 0.018442f, -0.012511f, -0.038820f, -0.048924f, -0.077495f, -0.144911f, -0.206158f, -0.190155f, -0.062376f, 0.162240f, 0.406347f, 0.505256f, 0.303545f, -0.122289f, -0.422346f, -0.308428f, 0.092789f, 0.368487f, 0.299142f, 0.056978f, -0.090390f, -0.095371f, -0.067860f, -0.051927f, -0.006294f, 0.067628f, 0.110810f, 0.102017f, 0.079345f, 0.072300f, 0.074025f, 0.076311f, 0.084642f, 0.098477f, 0.108362f, 0.112197f, 0.115201f, 0.118268f, 0.119098f, 0.118162f, 0.115112f, 0.106864f, 0.094193f, 0.082239f, 0.072210f, 0.060549f, 0.046565f, 0.032938f, 0.019433f, 0.003358f, -0.015133f, -0.034053f, -0.053613f, -0.074508f, -0.094983f, -0.113236f, -0.129739f, -0.144761f, -0.156877f, -0.165350f, -0.170649f, -0.172003f, -0.167632f, -0.157270f, -0.141575f, -0.119930f, -0.091592f, -0.057772f, -0.020186f, 0.020979f, 0.065725f, 0.112552f, 0.159607f, 0.205951f, 0.250757f, 0.292733f, 0.330757f, 0.363863f, 0.390939f, 0.411566f, 0.426332f, 0.435310f, 0.437507f, 0.432635f, 0.421800f, 0.405738f, 0.384132f, 0.357002f, 0.324746f, 0.286692f, 0.241881f, 0.191549f, 0.138830f, 0.085942f, + 0.033379f, -0.018269f, -0.067107f, -0.110190f, -0.144170f, -0.166746f, -0.178462f, -0.182052f, -0.179351f, -0.170023f, -0.153643f, -0.131509f, -0.106065f, -0.079941f, -0.055749f, -0.035417f, -0.019431f, -0.007467f, 0.000527f, 0.004427f, 0.004267f, -0.000272f, -0.009744f, -0.023644f, -0.040120f, -0.057414f, -0.074708f, -0.091572f, -0.107804f, -0.123837f, -0.140150f, -0.156409f, -0.172204f, -0.188141f, -0.205108f, -0.223061f, -0.241479f, -0.260269f, -0.279397f, -0.298518f, -0.317733f, -0.337794f, -0.359009f, -0.380830f, -0.402589f, -0.423591f, -0.442671f, -0.458932f, -0.472565f, -0.483822f, -0.492080f, -0.497195f, -0.500388f, -0.502373f, -0.502625f, -0.501972f, -0.501991f, -0.497827f, -0.475773f, -0.426176f, -0.359349f, -0.301285f, -0.269949f, -0.260941f}, + {0.007632f, 0.022548f, 0.018442f, -0.012511f, -0.038820f, -0.048924f, -0.077495f, -0.144911f, -0.206158f, -0.190155f, -0.062376f, 0.162240f, 0.406347f, 0.505256f, 0.303545f, -0.122289f, -0.422346f, -0.308428f, 0.092789f, 0.368487f, 0.299142f, 0.056978f, -0.090390f, -0.095371f, -0.067860f, -0.051927f, -0.006294f, 0.067628f, 0.110810f, 0.102017f, 0.079345f, 0.072300f, 0.074025f, 0.076311f, 0.084642f, 0.098477f, 0.108362f, 0.112197f, 0.115201f, 0.118268f, 0.119098f, 0.118162f, 0.115112f, 0.106864f, 0.094193f, 0.082239f, 0.072210f, 0.060549f, 0.046565f, 0.032938f, 0.019433f, 0.003358f, -0.015133f, -0.034053f, -0.053613f, -0.074508f, -0.094983f, -0.113236f, -0.129739f, -0.144761f, -0.156877f, -0.165350f, -0.170649f, -0.172003f, -0.167632f, -0.157270f, -0.141575f, -0.119930f, -0.091592f, -0.057772f, -0.020186f, 0.020979f, 0.065725f, 0.112552f, 0.159607f, 0.205951f, 0.250757f, 0.292733f, 0.330757f, 0.363863f, 0.390939f, 0.411566f, 0.426332f, 0.435310f, 0.437507f, 0.432635f, 0.421800f, 0.405738f, 0.384132f, 0.357002f, 0.324746f, 0.286692f, 0.241881f, 0.191549f, 0.138830f, 0.085942f, + 0.033379f, -0.018269f, -0.067107f, -0.110190f, -0.144170f, -0.166746f, -0.178462f, -0.182052f, -0.179351f, -0.170023f, -0.153643f, -0.131509f, -0.106065f, -0.079941f, -0.055749f, -0.035417f, -0.019431f, -0.007467f, 0.000527f, 0.004427f, 0.004267f, -0.000272f, -0.009744f, -0.023644f, -0.040120f, -0.057414f, -0.074708f, -0.091572f, -0.107804f, -0.123837f, -0.140150f, -0.156409f, -0.172204f, -0.188141f, -0.205108f, -0.223061f, -0.241479f, -0.260269f, -0.279397f, -0.298518f, -0.317733f, -0.337794f, -0.359009f, -0.380830f, -0.402589f, -0.423591f, -0.442671f, -0.458932f, -0.472565f, -0.483822f, -0.492080f, -0.497195f, -0.500388f, -0.502373f, -0.502625f, -0.501972f, -0.501991f, -0.497827f, -0.475773f, -0.426176f, -0.359349f, -0.301285f, -0.269949f, -0.260941f} + }, + { + {0.034883f, -0.021304f, -0.099217f, -0.155447f, -0.151489f, -0.063105f, 0.084405f, 0.197852f, 0.184427f, 0.054626f, -0.080140f, -0.128439f, -0.101272f, -0.058942f, -0.024576f, 0.010034f, 0.029966f, 0.006574f, -0.046713f, -0.077438f, -0.060336f, -0.024821f, -0.006710f, -0.003011f, 0.010365f, 0.039520f, 0.070428f, 0.091979f, 0.102773f, 0.100912f, 0.082516f, 0.050679f, 0.016240f, -0.012503f, -0.036094f, -0.059657f, -0.086598f, -0.117101f, -0.148959f, -0.177814f, -0.198595f, -0.208869f, -0.210421f, -0.206878f, -0.200675f, -0.192862f, -0.184372f, -0.175896f, -0.167141f, -0.157485f, -0.147021f, -0.136095f, -0.124463f, -0.111814f, -0.098518f, -0.085003f, -0.070987f, -0.056168f, -0.041216f, -0.027385f, -0.015470f, -0.005652f, 0.001916f, 0.006935f, 0.009478f, 0.010521f, 0.011559f, 0.013411f, 0.015772f, 0.018478f, 0.022594f, 0.029321f, 0.038477f, 0.049356f, 0.062563f, 0.079569f, 0.100807f, 0.125523f, 0.153141f, 0.183523f, 0.216110f, 0.249764f, 0.283204f, 0.315238f, 0.345212f, 0.373228f, 0.398907f, 0.420315f, 0.435885f, 0.447075f, 0.456792f, 0.464976f, 0.467972f, 0.462757f, 0.449794f, 0.431130f, + 0.407351f, 0.377300f, 0.340016f, 0.296447f, 0.249195f, 0.200303f, 0.149534f, 0.095828f, 0.040211f, -0.014159f, -0.064951f, -0.112404f, -0.158156f, -0.203415f, -0.247903f, -0.289526f, -0.325496f, -0.354702f, -0.378437f, -0.398339f, -0.414695f, -0.427120f, -0.435547f, -0.440095f, -0.441262f, -0.440437f, -0.439004f, -0.437067f, -0.434155f, -0.430566f, -0.426801f, -0.422476f, -0.416824f, -0.409269f, -0.398920f, -0.385068f, -0.368719f, -0.351923f, -0.335312f, -0.317982f, -0.299378f, -0.279225f, -0.256508f, -0.230974f, -0.204681f, -0.179810f, -0.156306f, -0.133463f, -0.111629f, -0.090540f, -0.068716f, -0.046148f, -0.024726f, -0.005073f, 0.013889f, 0.032797f, 0.053548f, 0.080840f, 0.114841f, 0.143935f, 0.153768f, 0.143890f, 0.127871f, 0.117999f}, + {0.034883f, -0.021304f, -0.099217f, -0.155447f, -0.151489f, -0.063105f, 0.084405f, 0.197852f, 0.184427f, 0.054626f, -0.080140f, -0.128439f, -0.101272f, -0.058942f, -0.024576f, 0.010034f, 0.029966f, 0.006574f, -0.046713f, -0.077438f, -0.060336f, -0.024821f, -0.006710f, -0.003011f, 0.010365f, 0.039520f, 0.070428f, 0.091979f, 0.102773f, 0.100912f, 0.082516f, 0.050679f, 0.016240f, -0.012503f, -0.036094f, -0.059657f, -0.086598f, -0.117101f, -0.148959f, -0.177814f, -0.198595f, -0.208869f, -0.210421f, -0.206878f, -0.200675f, -0.192862f, -0.184372f, -0.175896f, -0.167141f, -0.157485f, -0.147021f, -0.136095f, -0.124463f, -0.111814f, -0.098518f, -0.085003f, -0.070987f, -0.056168f, -0.041216f, -0.027385f, -0.015470f, -0.005652f, 0.001916f, 0.006935f, 0.009478f, 0.010521f, 0.011559f, 0.013411f, 0.015772f, 0.018478f, 0.022594f, 0.029321f, 0.038477f, 0.049356f, 0.062563f, 0.079569f, 0.100807f, 0.125523f, 0.153141f, 0.183523f, 0.216110f, 0.249764f, 0.283204f, 0.315238f, 0.345212f, 0.373228f, 0.398907f, 0.420315f, 0.435885f, 0.447075f, 0.456792f, 0.464976f, 0.467972f, 0.462757f, 0.449794f, 0.431130f, + 0.407351f, 0.377300f, 0.340016f, 0.296447f, 0.249195f, 0.200303f, 0.149534f, 0.095828f, 0.040211f, -0.014159f, -0.064951f, -0.112404f, -0.158156f, -0.203415f, -0.247903f, -0.289526f, -0.325496f, -0.354702f, -0.378437f, -0.398339f, -0.414695f, -0.427120f, -0.435547f, -0.440095f, -0.441262f, -0.440437f, -0.439004f, -0.437067f, -0.434155f, -0.430566f, -0.426801f, -0.422476f, -0.416824f, -0.409269f, -0.398920f, -0.385068f, -0.368719f, -0.351923f, -0.335312f, -0.317982f, -0.299378f, -0.279225f, -0.256508f, -0.230974f, -0.204681f, -0.179810f, -0.156306f, -0.133463f, -0.111629f, -0.090540f, -0.068716f, -0.046148f, -0.024726f, -0.005073f, 0.013889f, 0.032797f, 0.053548f, 0.080840f, 0.114841f, 0.143935f, 0.153768f, 0.143890f, 0.127871f, 0.117999f} + }, + { + {-0.042332f, 0.052414f, 0.122641f, 0.100474f, 0.024695f, -0.082326f, -0.258062f, -0.473154f, -0.584763f, -0.487474f, -0.212666f, 0.165870f, 0.573082f, 0.800546f, 0.552655f, -0.151008f, -0.763503f, -0.701266f, -0.031392f, 0.589097f, 0.677353f, 0.375374f, 0.090848f, -0.027580f, -0.096120f, -0.190245f, -0.262825f, -0.288880f, -0.308636f, -0.336497f, -0.340771f, -0.310877f, -0.270106f, -0.228364f, -0.175587f, -0.113432f, -0.055244f, -0.004323f, 0.041799f, 0.077774f, 0.099516f, 0.113909f, 0.127241f, 0.136680f, 0.140063f, 0.140919f, 0.139881f, 0.133490f, 0.123199f, 0.114854f, 0.109677f, 0.104617f, 0.099122f, 0.094046f, 0.087514f, 0.077934f, 0.066999f, 0.055668f, 0.042091f, 0.026045f, 0.009978f, -0.005697f, -0.022928f, -0.041423f, -0.058984f, -0.075713f, -0.092979f, -0.109604f, -0.123430f, -0.134844f, -0.145145f, -0.153781f, -0.160146f, -0.165514f, -0.170954f, -0.175845f, -0.179731f, -0.183079f, -0.185777f, -0.187503f, -0.189345f, -0.192612f, -0.196803f, -0.200916f, -0.205347f, -0.210450f, -0.214889f, -0.217212f, -0.217402f, -0.215743f, -0.212081f, -0.206912f, -0.201289f, -0.195569f, -0.190303f, -0.187905f, + -0.191048f, -0.199781f, -0.212320f, -0.227968f, -0.247295f, -0.270114f, -0.294879f, -0.319422f, -0.341430f, -0.359264f, -0.372895f, -0.382982f, -0.388966f, -0.389475f, -0.384356f, -0.374855f, -0.362171f, -0.347161f, -0.330773f, -0.313405f, -0.294581f, -0.274385f, -0.254316f, -0.235851f, -0.219093f, -0.203275f, -0.187422f, -0.170370f, -0.151593f, -0.132216f, -0.113950f, -0.097152f, -0.081024f, -0.065106f, -0.049246f, -0.032888f, -0.015757f, 0.001405f, 0.017892f, 0.034016f, 0.050243f, 0.066435f, 0.082630f, 0.099397f, 0.116782f, 0.133961f, 0.150320f, 0.165818f, 0.180145f, 0.192646f, 0.203207f, 0.212303f, 0.220145f, 0.226503f, 0.231386f, 0.235453f, 0.239190f, 0.240731f, 0.234694f, 0.216060f, 0.187439f, 0.159993f, 0.143657f, 0.138274f}, + {-0.042332f, 0.052414f, 0.122641f, 0.100474f, 0.024695f, -0.082326f, -0.258062f, -0.473154f, -0.584763f, -0.487474f, -0.212666f, 0.165870f, 0.573082f, 0.800546f, 0.552655f, -0.151008f, -0.763503f, -0.701266f, -0.031392f, 0.589097f, 0.677353f, 0.375374f, 0.090848f, -0.027580f, -0.096120f, -0.190245f, -0.262825f, -0.288880f, -0.308636f, -0.336497f, -0.340771f, -0.310877f, -0.270106f, -0.228364f, -0.175587f, -0.113432f, -0.055244f, -0.004323f, 0.041799f, 0.077774f, 0.099516f, 0.113909f, 0.127241f, 0.136680f, 0.140063f, 0.140919f, 0.139881f, 0.133490f, 0.123199f, 0.114854f, 0.109677f, 0.104617f, 0.099122f, 0.094046f, 0.087514f, 0.077934f, 0.066999f, 0.055668f, 0.042091f, 0.026045f, 0.009978f, -0.005697f, -0.022928f, -0.041423f, -0.058984f, -0.075713f, -0.092979f, -0.109604f, -0.123430f, -0.134844f, -0.145145f, -0.153781f, -0.160146f, -0.165514f, -0.170954f, -0.175845f, -0.179731f, -0.183079f, -0.185777f, -0.187503f, -0.189345f, -0.192612f, -0.196803f, -0.200916f, -0.205347f, -0.210450f, -0.214889f, -0.217212f, -0.217402f, -0.215743f, -0.212081f, -0.206912f, -0.201289f, -0.195569f, -0.190303f, -0.187905f, + -0.191048f, -0.199781f, -0.212320f, -0.227968f, -0.247295f, -0.270114f, -0.294879f, -0.319422f, -0.341430f, -0.359264f, -0.372895f, -0.382982f, -0.388966f, -0.389475f, -0.384356f, -0.374855f, -0.362171f, -0.347161f, -0.330773f, -0.313405f, -0.294581f, -0.274385f, -0.254316f, -0.235851f, -0.219093f, -0.203275f, -0.187422f, -0.170370f, -0.151593f, -0.132216f, -0.113950f, -0.097152f, -0.081024f, -0.065106f, -0.049246f, -0.032888f, -0.015757f, 0.001405f, 0.017892f, 0.034016f, 0.050243f, 0.066435f, 0.082630f, 0.099397f, 0.116782f, 0.133961f, 0.150320f, 0.165818f, 0.180145f, 0.192646f, 0.203207f, 0.212303f, 0.220145f, 0.226503f, 0.231386f, 0.235453f, 0.239190f, 0.240731f, 0.234694f, 0.216060f, 0.187439f, 0.159993f, 0.143657f, 0.138274f} + }, + { + {-0.038707f, -0.040443f, -0.032425f, -0.008667f, 0.039610f, 0.121021f, 0.200841f, 0.209863f, 0.128343f, -0.011854f, -0.222956f, -0.509917f, -0.672944f, -0.397576f, 0.271260f, 0.753657f, 0.530475f, -0.183327f, -0.662957f, -0.535116f, -0.113682f, 0.135696f, 0.139296f, 0.101726f, 0.119927f, 0.126081f, 0.082228f, 0.034341f, 0.008539f, -0.018778f, -0.056453f, -0.082857f, -0.088546f, -0.085336f, -0.080321f, -0.072030f, -0.062931f, -0.055762f, -0.047257f, -0.036657f, -0.029416f, -0.026737f, -0.023178f, -0.017390f, -0.014005f, -0.014139f, -0.014094f, -0.012938f, -0.012763f, -0.012836f, -0.010434f, -0.005527f, 0.000352f, 0.007263f, 0.015320f, 0.022993f, 0.029308f, 0.034837f, 0.039468f, 0.042226f, 0.043473f, 0.044401f, 0.044758f, 0.043609f, 0.041320f, 0.038608f, 0.035016f, 0.030111f, 0.024605f, 0.019016f, 0.012867f, 0.005983f, -0.001177f, -0.008863f, -0.018026f, -0.028938f, -0.041213f, -0.054772f, -0.069509f, -0.084750f, -0.100179f, -0.116316f, -0.133109f, -0.149167f, -0.163209f, -0.175265f, -0.185829f, -0.194738f, -0.201250f, -0.204518f, -0.203992f, -0.199910f, -0.193205f, -0.184582f, -0.174292f, -0.163022f, + -0.152075f, -0.142325f, -0.133856f, -0.126875f, -0.122103f, -0.119943f, -0.119907f, -0.121022f, -0.122534f, -0.124394f, -0.127276f, -0.131743f, -0.137311f, -0.142802f, -0.147553f, -0.151741f, -0.155707f, -0.159595f, -0.163318f, -0.166341f, -0.167867f, -0.167752f, -0.166759f, -0.165644f, -0.164497f, -0.162993f, -0.160544f, -0.156329f, -0.149991f, -0.142138f, -0.133494f, -0.123973f, -0.113132f, -0.100831f, -0.086925f, -0.071241f, -0.054316f, -0.037204f, -0.020348f, -0.003592f, 0.012893f, 0.028859f, 0.044680f, 0.060561f, 0.075703f, 0.089381f, 0.101902f, 0.113636f, 0.124499f, 0.135054f, 0.146443f, 0.158891f, 0.172084f, 0.186647f, 0.203232f, 0.221745f, 0.243776f, 0.271628f, 0.299956f, 0.313432f, 0.301412f, 0.272461f, 0.246103f, 0.233169f}, + {0.038707f, 0.040443f, 0.032425f, 0.008667f, -0.039610f, -0.121021f, -0.200841f, -0.209863f, -0.128343f, 0.011854f, 0.222956f, 0.509917f, 0.672944f, 0.397576f, -0.271260f, -0.753657f, -0.530475f, 0.183327f, 0.662957f, 0.535116f, 0.113682f, -0.135696f, -0.139296f, -0.101726f, -0.119927f, -0.126081f, -0.082228f, -0.034341f, -0.008539f, 0.018778f, 0.056453f, 0.082857f, 0.088546f, 0.085336f, 0.080321f, 0.072030f, 0.062931f, 0.055762f, 0.047257f, 0.036657f, 0.029416f, 0.026737f, 0.023178f, 0.017390f, 0.014005f, 0.014139f, 0.014094f, 0.012938f, 0.012763f, 0.012836f, 0.010434f, 0.005527f, -0.000352f, -0.007263f, -0.015320f, -0.022993f, -0.029308f, -0.034837f, -0.039468f, -0.042226f, -0.043473f, -0.044401f, -0.044758f, -0.043609f, -0.041320f, -0.038608f, -0.035016f, -0.030111f, -0.024605f, -0.019016f, -0.012867f, -0.005983f, 0.001177f, 0.008863f, 0.018026f, 0.028938f, 0.041213f, 0.054772f, 0.069509f, 0.084750f, 0.100179f, 0.116316f, 0.133109f, 0.149167f, 0.163209f, 0.175265f, 0.185829f, 0.194738f, 0.201250f, 0.204518f, 0.203992f, 0.199910f, 0.193205f, 0.184582f, 0.174292f, 0.163022f, + 0.152075f, 0.142325f, 0.133856f, 0.126875f, 0.122103f, 0.119943f, 0.119907f, 0.121022f, 0.122534f, 0.124394f, 0.127276f, 0.131743f, 0.137311f, 0.142802f, 0.147553f, 0.151741f, 0.155707f, 0.159595f, 0.163318f, 0.166341f, 0.167867f, 0.167752f, 0.166759f, 0.165644f, 0.164497f, 0.162993f, 0.160544f, 0.156329f, 0.149991f, 0.142138f, 0.133494f, 0.123973f, 0.113132f, 0.100831f, 0.086925f, 0.071241f, 0.054316f, 0.037204f, 0.020348f, 0.003592f, -0.012893f, -0.028859f, -0.044680f, -0.060561f, -0.075703f, -0.089381f, -0.101902f, -0.113636f, -0.124499f, -0.135054f, -0.146443f, -0.158891f, -0.172084f, -0.186647f, -0.203232f, -0.221745f, -0.243776f, -0.271628f, -0.299956f, -0.313432f, -0.301412f, -0.272461f, -0.246103f, -0.233169f} + }, + { + {-0.011441f, -0.003265f, 0.004011f, -0.000472f, -0.027714f, -0.075629f, -0.102363f, -0.048427f, 0.075716f, 0.158973f, 0.107163f, -0.028068f, -0.105566f, -0.071921f, -0.008203f, 0.005703f, -0.009101f, 0.001108f, 0.026819f, 0.024213f, -0.004533f, -0.019483f, -0.010977f, -0.008220f, -0.025895f, -0.043275f, -0.039729f, -0.021081f, -0.003698f, 0.006641f, 0.011920f, 0.011671f, 0.003832f, -0.010526f, -0.027836f, -0.044363f, -0.057022f, -0.064947f, -0.070367f, -0.075558f, -0.079517f, -0.079629f, -0.075472f, -0.069036f, -0.062356f, -0.056849f, -0.053900f, -0.054130f, -0.056410f, -0.058748f, -0.059818f, -0.059044f, -0.056030f, -0.050751f, -0.043844f, -0.036068f, -0.027766f, -0.019090f, -0.010327f, -0.001711f, 0.006749f, 0.015049f, 0.022944f, 0.029990f, 0.035833f, 0.040478f, 0.044205f, 0.047143f, 0.049179f, 0.050500f, 0.051764f, 0.053342f, 0.054913f, 0.056356f, 0.058453f, 0.062098f, 0.067413f, 0.074374f, 0.083664f, 0.096097f, 0.111651f, 0.129744f, 0.150062f, 0.172637f, 0.197477f, 0.224325f, 0.252295f, 0.279828f, 0.305655f, 0.329617f, 0.351655f, 0.370228f, 0.382750f, 0.387511f, 0.384321f, 0.373523f, + 0.355270f, 0.329788f, 0.297855f, 0.261198f, 0.222427f, 0.183885f, 0.146353f, 0.109686f, 0.074803f, 0.043946f, 0.018611f, -0.002035f, -0.020413f, -0.038698f, -0.057436f, -0.075307f, -0.090415f, -0.102296f, -0.112325f, -0.122030f, -0.131716f, -0.140923f, -0.149260f, -0.156505f, -0.162826f, -0.169104f, -0.176221f, -0.184054f, -0.191847f, -0.199220f, -0.206057f, -0.212014f, -0.216913f, -0.221002f, -0.224224f, -0.226071f, -0.226577f, -0.226473f, -0.226101f, -0.225292f, -0.224225f, -0.223145f, -0.221549f, -0.219033f, -0.216406f, -0.214610f, -0.213404f, -0.212354f, -0.211792f, -0.211513f, -0.210235f, -0.207593f, -0.204699f, -0.201857f, -0.198207f, -0.193847f, -0.188118f, -0.174986f, -0.146065f, -0.102134f, -0.057750f, -0.029670f, -0.021689f, -0.023453f}, + {0.011441f, 0.003265f, -0.004011f, 0.000472f, 0.027714f, 0.075629f, 0.102363f, 0.048427f, -0.075716f, -0.158973f, -0.107163f, 0.028068f, 0.105566f, 0.071921f, 0.008203f, -0.005703f, 0.009101f, -0.001108f, -0.026819f, -0.024213f, 0.004533f, 0.019483f, 0.010977f, 0.008220f, 0.025895f, 0.043275f, 0.039729f, 0.021081f, 0.003698f, -0.006641f, -0.011920f, -0.011671f, -0.003832f, 0.010526f, 0.027836f, 0.044363f, 0.057022f, 0.064947f, 0.070367f, 0.075558f, 0.079517f, 0.079629f, 0.075472f, 0.069036f, 0.062356f, 0.056849f, 0.053900f, 0.054130f, 0.056410f, 0.058748f, 0.059818f, 0.059044f, 0.056030f, 0.050751f, 0.043844f, 0.036068f, 0.027766f, 0.019090f, 0.010327f, 0.001711f, -0.006749f, -0.015049f, -0.022944f, -0.029990f, -0.035833f, -0.040478f, -0.044205f, -0.047143f, -0.049179f, -0.050500f, -0.051764f, -0.053342f, -0.054913f, -0.056356f, -0.058453f, -0.062098f, -0.067413f, -0.074374f, -0.083664f, -0.096097f, -0.111651f, -0.129744f, -0.150062f, -0.172637f, -0.197477f, -0.224325f, -0.252295f, -0.279828f, -0.305655f, -0.329617f, -0.351655f, -0.370228f, -0.382750f, -0.387511f, -0.384321f, -0.373523f, + -0.355270f, -0.329788f, -0.297855f, -0.261198f, -0.222427f, -0.183885f, -0.146353f, -0.109686f, -0.074803f, -0.043946f, -0.018611f, 0.002035f, 0.020413f, 0.038698f, 0.057436f, 0.075307f, 0.090415f, 0.102296f, 0.112325f, 0.122030f, 0.131716f, 0.140923f, 0.149260f, 0.156505f, 0.162826f, 0.169104f, 0.176221f, 0.184054f, 0.191847f, 0.199220f, 0.206057f, 0.212014f, 0.216913f, 0.221002f, 0.224224f, 0.226071f, 0.226577f, 0.226473f, 0.226101f, 0.225292f, 0.224225f, 0.223145f, 0.221549f, 0.219033f, 0.216406f, 0.214610f, 0.213404f, 0.212354f, 0.211792f, 0.211513f, 0.210235f, 0.207593f, 0.204699f, 0.201857f, 0.198207f, 0.193847f, 0.188118f, 0.174986f, 0.146065f, 0.102134f, 0.057750f, 0.029670f, 0.021689f, 0.023453f} + }, + { + {-0.022899f, -0.009050f, 0.021042f, 0.035577f, 0.007193f, -0.010991f, 0.067505f, 0.216765f, 0.271970f, 0.095990f, -0.246846f, -0.502443f, -0.427170f, -0.025043f, 0.395378f, 0.472255f, 0.158557f, -0.215865f, -0.309289f, -0.125601f, 0.071920f, 0.117090f, 0.070896f, 0.036158f, 0.010191f, -0.040842f, -0.086996f, -0.084856f, -0.053104f, -0.038760f, -0.049026f, -0.058734f, -0.055081f, -0.041078f, -0.015513f, 0.023625f, 0.067409f, 0.104226f, 0.131662f, 0.152151f, 0.165968f, 0.173980f, 0.179366f, 0.183056f, 0.183232f, 0.180032f, 0.175450f, 0.169336f, 0.160257f, 0.148803f, 0.135933f, 0.119953f, 0.098677f, 0.072731f, 0.044254f, 0.014523f, -0.015264f, -0.043256f, -0.068768f, -0.092960f, -0.116651f, -0.139142f, -0.159634f, -0.177968f, -0.193495f, -0.204628f, -0.209832f, -0.208176f, -0.199162f, -0.182839f, -0.159769f, -0.130297f, -0.094474f, -0.053153f, -0.008358f, 0.038048f, 0.085319f, 0.132878f, 0.179125f, 0.221960f, 0.260199f, 0.293872f, 0.323183f, 0.347625f, 0.366329f, 0.379015f, 0.386161f, 0.388145f, 0.384647f, 0.375101f, 0.359186f, 0.336465f, 0.306144f, 0.267908f, 0.222716f, 0.172166f, + 0.117452f, 0.059721f, 0.001259f, -0.054522f, -0.104542f, -0.147316f, -0.182857f, -0.211501f, -0.232650f, -0.244662f, -0.246382f, -0.238892f, -0.225272f, -0.208463f, -0.189745f, -0.169228f, -0.147036f, -0.123663f, -0.099806f, -0.076368f, -0.054370f, -0.034613f, -0.017496f, -0.003066f, 0.009127f, 0.020090f, 0.030773f, 0.041240f, 0.050609f, 0.057724f, 0.061768f, 0.062553f, 0.060572f, 0.056607f, 0.051053f, 0.043676f, 0.034051f, 0.022022f, 0.007797f, -0.008087f, -0.024935f, -0.042312f, -0.060172f, -0.078368f, -0.096310f, -0.113326f, -0.129046f, -0.143214f, -0.155555f, -0.166012f, -0.174718f, -0.181676f, -0.186839f, -0.190425f, -0.192896f, -0.195026f, -0.197709f, -0.199950f, -0.196779f, -0.182409f, -0.157947f, -0.133337f, -0.118252f, -0.113142f}, + {0.022899f, 0.009050f, -0.021042f, -0.035577f, -0.007193f, 0.010991f, -0.067505f, -0.216765f, -0.271970f, -0.095990f, 0.246846f, 0.502443f, 0.427170f, 0.025043f, -0.395378f, -0.472255f, -0.158557f, 0.215865f, 0.309289f, 0.125601f, -0.071920f, -0.117090f, -0.070896f, -0.036158f, -0.010191f, 0.040842f, 0.086996f, 0.084856f, 0.053104f, 0.038760f, 0.049026f, 0.058734f, 0.055081f, 0.041078f, 0.015513f, -0.023625f, -0.067409f, -0.104226f, -0.131662f, -0.152151f, -0.165968f, -0.173980f, -0.179366f, -0.183056f, -0.183232f, -0.180032f, -0.175450f, -0.169336f, -0.160257f, -0.148803f, -0.135933f, -0.119953f, -0.098677f, -0.072731f, -0.044254f, -0.014523f, 0.015264f, 0.043256f, 0.068768f, 0.092960f, 0.116651f, 0.139142f, 0.159634f, 0.177968f, 0.193495f, 0.204628f, 0.209832f, 0.208176f, 0.199162f, 0.182839f, 0.159769f, 0.130297f, 0.094474f, 0.053153f, 0.008358f, -0.038048f, -0.085319f, -0.132878f, -0.179125f, -0.221960f, -0.260199f, -0.293872f, -0.323183f, -0.347625f, -0.366329f, -0.379015f, -0.386161f, -0.388145f, -0.384647f, -0.375101f, -0.359186f, -0.336465f, -0.306144f, -0.267908f, -0.222716f, -0.172166f, + -0.117452f, -0.059721f, -0.001259f, 0.054522f, 0.104542f, 0.147316f, 0.182857f, 0.211501f, 0.232650f, 0.244662f, 0.246382f, 0.238892f, 0.225272f, 0.208463f, 0.189745f, 0.169228f, 0.147036f, 0.123663f, 0.099806f, 0.076368f, 0.054370f, 0.034613f, 0.017496f, 0.003066f, -0.009127f, -0.020090f, -0.030773f, -0.041240f, -0.050609f, -0.057724f, -0.061768f, -0.062553f, -0.060572f, -0.056607f, -0.051053f, -0.043676f, -0.034051f, -0.022022f, -0.007797f, 0.008087f, 0.024935f, 0.042312f, 0.060172f, 0.078368f, 0.096310f, 0.113326f, 0.129046f, 0.143214f, 0.155555f, 0.166012f, 0.174718f, 0.181676f, 0.186839f, 0.190425f, 0.192896f, 0.195026f, 0.197709f, 0.199950f, 0.196779f, 0.182409f, 0.157947f, 0.133337f, 0.118252f, 0.113142f} + }, + { + {0.003690f, -0.000917f, -0.000552f, 0.013387f, 0.038725f, 0.063371f, 0.072581f, 0.053190f, 0.000206f, -0.066676f, -0.099074f, -0.058384f, 0.032276f, 0.096933f, 0.084562f, 0.021700f, -0.028770f, -0.041099f, -0.033861f, -0.021573f, 0.003202f, 0.040516f, 0.070416f, 0.080729f, 0.083957f, 0.093969f, 0.102499f, 0.091181f, 0.056136f, 0.010704f, -0.028621f, -0.051424f, -0.055151f, -0.045654f, -0.033912f, -0.027688f, -0.026567f, -0.025373f, -0.020147f, -0.010619f, 0.000563f, 0.010165f, 0.017004f, 0.022350f, 0.027713f, 0.033503f, 0.039956f, 0.047461f, 0.055453f, 0.062514f, 0.067893f, 0.071692f, 0.073779f, 0.073710f, 0.071278f, 0.066153f, 0.057699f, 0.045923f, 0.031751f, 0.015946f, -0.001187f, -0.018979f, -0.036673f, -0.054412f, -0.072597f, -0.090693f, -0.108050f, -0.125117f, -0.142249f, -0.158172f, -0.171068f, -0.180164f, -0.184957f, -0.184167f, -0.176848f, -0.163444f, -0.144732f, -0.120910f, -0.092493f, -0.060834f, -0.026998f, 0.008883f, 0.046658f, 0.085319f, 0.123386f, 0.159725f, 0.194080f, 0.226805f, 0.257478f, 0.283950f, 0.303794f, 0.316528f, 0.323183f, 0.324000f, 0.317919f, 0.304128f, + 0.282929f, 0.255584f, 0.224397f, 0.192192f, 0.160506f, 0.128826f, 0.096337f, 0.063750f, 0.033188f, 0.007192f, -0.012327f, -0.025520f, -0.034813f, -0.042423f, -0.047979f, -0.049630f, -0.046581f, -0.039422f, -0.029192f, -0.017343f, -0.005387f, 0.006553f, 0.019724f, 0.034769f, 0.051053f, 0.067938f, 0.085001f, 0.101175f, 0.115466f, 0.128221f, 0.140146f, 0.150803f, 0.159486f, 0.166332f, 0.171227f, 0.173096f, 0.171443f, 0.166998f, 0.160073f, 0.150144f, 0.137357f, 0.122400f, 0.104972f, 0.084444f, 0.061488f, 0.037087f, 0.011069f, -0.016587f, -0.044718f, -0.072768f, -0.101412f, -0.130304f, -0.157895f, -0.183977f, -0.209630f, -0.235539f, -0.263242f, -0.293940f, -0.320304f, -0.325486f, -0.300786f, -0.260681f, -0.229360f, -0.216143f}, + {0.003690f, -0.000917f, -0.000552f, 0.013387f, 0.038725f, 0.063371f, 0.072581f, 0.053190f, 0.000206f, -0.066676f, -0.099074f, -0.058384f, 0.032276f, 0.096933f, 0.084562f, 0.021700f, -0.028770f, -0.041099f, -0.033861f, -0.021573f, 0.003202f, 0.040516f, 0.070416f, 0.080729f, 0.083957f, 0.093969f, 0.102499f, 0.091181f, 0.056136f, 0.010704f, -0.028621f, -0.051424f, -0.055151f, -0.045654f, -0.033912f, -0.027688f, -0.026567f, -0.025373f, -0.020147f, -0.010619f, 0.000563f, 0.010165f, 0.017004f, 0.022350f, 0.027713f, 0.033503f, 0.039956f, 0.047461f, 0.055453f, 0.062514f, 0.067893f, 0.071692f, 0.073779f, 0.073710f, 0.071278f, 0.066153f, 0.057699f, 0.045923f, 0.031751f, 0.015946f, -0.001187f, -0.018979f, -0.036673f, -0.054412f, -0.072597f, -0.090693f, -0.108050f, -0.125117f, -0.142249f, -0.158172f, -0.171068f, -0.180164f, -0.184957f, -0.184167f, -0.176848f, -0.163444f, -0.144732f, -0.120910f, -0.092493f, -0.060834f, -0.026998f, 0.008883f, 0.046658f, 0.085319f, 0.123386f, 0.159725f, 0.194080f, 0.226805f, 0.257478f, 0.283950f, 0.303794f, 0.316528f, 0.323183f, 0.324000f, 0.317919f, 0.304128f, + 0.282929f, 0.255584f, 0.224397f, 0.192192f, 0.160506f, 0.128826f, 0.096337f, 0.063750f, 0.033188f, 0.007192f, -0.012327f, -0.025520f, -0.034813f, -0.042423f, -0.047979f, -0.049630f, -0.046581f, -0.039422f, -0.029192f, -0.017343f, -0.005387f, 0.006553f, 0.019724f, 0.034769f, 0.051053f, 0.067938f, 0.085001f, 0.101175f, 0.115466f, 0.128221f, 0.140146f, 0.150803f, 0.159486f, 0.166332f, 0.171227f, 0.173096f, 0.171443f, 0.166998f, 0.160073f, 0.150144f, 0.137357f, 0.122400f, 0.104972f, 0.084444f, 0.061488f, 0.037087f, 0.011069f, -0.016587f, -0.044718f, -0.072768f, -0.101412f, -0.130304f, -0.157895f, -0.183977f, -0.209630f, -0.235539f, -0.263242f, -0.293940f, -0.320304f, -0.325486f, -0.300786f, -0.260681f, -0.229360f, -0.216143f} + }, + { + {-0.023394f, -0.027147f, -0.010242f, 0.029995f, 0.067330f, 0.083589f, 0.072936f, 0.017445f, -0.087218f, -0.178937f, -0.163916f, -0.030708f, 0.114394f, 0.155385f, 0.081810f, -0.022358f, -0.073288f, -0.048744f, 0.015279f, 0.058591f, 0.040948f, -0.023886f, -0.081166f, -0.090364f, -0.058651f, -0.017390f, 0.015585f, 0.040163f, 0.058174f, 0.070098f, 0.079819f, 0.090006f, 0.096263f, 0.093268f, 0.082877f, 0.070565f, 0.057790f, 0.042958f, 0.026941f, 0.013256f, 0.004160f, -0.000764f, -0.003251f, -0.005255f, -0.008455f, -0.013944f, -0.022509f, -0.034733f, -0.050017f, -0.066095f, -0.080399f, -0.091534f, -0.099083f, -0.103038f, -0.104204f, -0.104337f, -0.105038f, -0.106888f, -0.109935f, -0.114401f, -0.120510f, -0.128064f, -0.136416f, -0.144519f, -0.150965f, -0.154404f, -0.154060f, -0.149652f, -0.141043f, -0.128490f, -0.113124f, -0.096475f, -0.079332f, -0.061637f, -0.043769f, -0.027117f, -0.012702f, 0.000084f, 0.012241f, 0.023050f, 0.030612f, 0.034541f, 0.036620f, 0.038340f, 0.039247f, 0.038732f, 0.038347f, 0.040934f, 0.047732f, 0.057272f, 0.067154f, 0.076305f, 0.085395f, 0.095550f, 0.107026f, 0.119165f, + 0.131180f, 0.142546f, 0.152838f, 0.162016f, 0.171094f, 0.181783f, 0.194944f, 0.209687f, 0.224276f, 0.237616f, 0.249622f, 0.260452f, 0.269684f, 0.276238f, 0.279096f, 0.278096f, 0.273844f, 0.266767f, 0.256520f, 0.242394f, 0.224039f, 0.201801f, 0.176733f, 0.150267f, 0.123426f, 0.096270f, 0.068346f, 0.039626f, 0.010838f, -0.016846f, -0.042211f, -0.064572f, -0.084386f, -0.102969f, -0.121208f, -0.138666f, -0.153987f, -0.165894f, -0.173880f, -0.178463f, -0.180864f, -0.182167f, -0.182758f, -0.182496f, -0.180928f, -0.177304f, -0.171116f, -0.162770f, -0.153009f, -0.141866f, -0.129175f, -0.115724f, -0.102570f, -0.089658f, -0.076512f, -0.063365f, -0.049691f, -0.033149f, -0.013162f, 0.005394f, 0.015746f, 0.016554f, 0.012768f, 0.009775f}, + {-0.023394f, -0.027147f, -0.010242f, 0.029995f, 0.067330f, 0.083589f, 0.072936f, 0.017445f, -0.087218f, -0.178937f, -0.163916f, -0.030708f, 0.114394f, 0.155385f, 0.081810f, -0.022358f, -0.073288f, -0.048744f, 0.015279f, 0.058591f, 0.040948f, -0.023886f, -0.081166f, -0.090364f, -0.058651f, -0.017390f, 0.015585f, 0.040163f, 0.058174f, 0.070098f, 0.079819f, 0.090006f, 0.096263f, 0.093268f, 0.082877f, 0.070565f, 0.057790f, 0.042958f, 0.026941f, 0.013256f, 0.004160f, -0.000764f, -0.003251f, -0.005255f, -0.008455f, -0.013944f, -0.022509f, -0.034733f, -0.050017f, -0.066095f, -0.080399f, -0.091534f, -0.099083f, -0.103038f, -0.104204f, -0.104337f, -0.105038f, -0.106888f, -0.109935f, -0.114401f, -0.120510f, -0.128064f, -0.136416f, -0.144519f, -0.150965f, -0.154404f, -0.154060f, -0.149652f, -0.141043f, -0.128490f, -0.113124f, -0.096475f, -0.079332f, -0.061637f, -0.043769f, -0.027117f, -0.012702f, 0.000084f, 0.012241f, 0.023050f, 0.030612f, 0.034541f, 0.036620f, 0.038340f, 0.039247f, 0.038732f, 0.038347f, 0.040934f, 0.047732f, 0.057272f, 0.067154f, 0.076305f, 0.085395f, 0.095550f, 0.107026f, 0.119165f, + 0.131180f, 0.142546f, 0.152838f, 0.162016f, 0.171094f, 0.181783f, 0.194944f, 0.209687f, 0.224276f, 0.237616f, 0.249622f, 0.260452f, 0.269684f, 0.276238f, 0.279096f, 0.278096f, 0.273844f, 0.266767f, 0.256520f, 0.242394f, 0.224039f, 0.201801f, 0.176733f, 0.150267f, 0.123426f, 0.096270f, 0.068346f, 0.039626f, 0.010838f, -0.016846f, -0.042211f, -0.064572f, -0.084386f, -0.102969f, -0.121208f, -0.138666f, -0.153987f, -0.165894f, -0.173880f, -0.178463f, -0.180864f, -0.182167f, -0.182758f, -0.182496f, -0.180928f, -0.177304f, -0.171116f, -0.162770f, -0.153009f, -0.141866f, -0.129175f, -0.115724f, -0.102570f, -0.089658f, -0.076512f, -0.063365f, -0.049691f, -0.033149f, -0.013162f, 0.005394f, 0.015746f, 0.016554f, 0.012768f, 0.009775f} + }, + { + {0.002536f, -0.011235f, -0.018343f, -0.017987f, -0.027166f, -0.031117f, 0.014002f, 0.096526f, 0.113126f, -0.016617f, -0.209563f, -0.268875f, -0.109214f, 0.120357f, 0.194165f, 0.064228f, -0.105548f, -0.151938f, -0.085143f, -0.021811f, -0.013168f, -0.007575f, 0.042273f, 0.109306f, 0.142985f, 0.138265f, 0.124567f, 0.114998f, 0.096455f, 0.057758f, 0.004146f, -0.052677f, -0.103477f, -0.141457f, -0.163639f, -0.173107f, -0.175086f, -0.171796f, -0.163515f, -0.151686f, -0.138206f, -0.124227f, -0.111720f, -0.103751f, -0.101586f, -0.103453f, -0.106877f, -0.110322f, -0.112385f, -0.111649f, -0.107834f, -0.101601f, -0.093248f, -0.082860f, -0.071411f, -0.060549f, -0.051523f, -0.045052f, -0.041731f, -0.041860f, -0.045219f, -0.051310f, -0.059514f, -0.069016f, -0.079031f, -0.088966f, -0.098149f, -0.105768f, -0.111299f, -0.114442f, -0.114537f, -0.110675f, -0.102450f, -0.090007f, -0.073514f, -0.053290f, -0.030165f, -0.005135f, 0.020901f, 0.046733f, 0.071073f, 0.093736f, 0.115568f, 0.136842f, 0.156886f, 0.175538f, 0.193455f, 0.210815f, 0.227567f, 0.245363f, 0.267074f, 0.293421f, 0.321639f, 0.348399f, 0.372776f, 0.395534f, + 0.416417f, 0.432977f, 0.441812f, 0.440703f, 0.429686f, 0.410030f, 0.382492f, 0.347214f, 0.305126f, 0.258387f, 0.209075f, 0.158069f, 0.105330f, 0.050877f, -0.004290f, -0.057880f, -0.107405f, -0.152051f, -0.192952f, -0.231334f, -0.267030f, -0.298914f, -0.325959f, -0.347776f, -0.365058f, -0.379559f, -0.392822f, -0.404916f, -0.414926f, -0.422209f, -0.426647f, -0.428320f, -0.427480f, -0.424173f, -0.417634f, -0.406929f, -0.392213f, -0.374383f, -0.353748f, -0.330107f, -0.303575f, -0.274126f, -0.241197f, -0.204995f, -0.167220f, -0.129445f, -0.092017f, -0.055184f, -0.019543f, 0.015178f, 0.049744f, 0.083605f, 0.115480f, 0.145267f, 0.173490f, 0.200772f, 0.229618f, 0.261633f, 0.288462f, 0.292554f, 0.266148f, 0.224956f, 0.193266f, 0.179939f}, + {0.002536f, -0.011235f, -0.018343f, -0.017987f, -0.027166f, -0.031117f, 0.014002f, 0.096526f, 0.113126f, -0.016617f, -0.209563f, -0.268875f, -0.109214f, 0.120357f, 0.194165f, 0.064228f, -0.105548f, -0.151938f, -0.085143f, -0.021811f, -0.013168f, -0.007575f, 0.042273f, 0.109306f, 0.142985f, 0.138265f, 0.124567f, 0.114998f, 0.096455f, 0.057758f, 0.004146f, -0.052677f, -0.103477f, -0.141457f, -0.163639f, -0.173107f, -0.175086f, -0.171796f, -0.163515f, -0.151686f, -0.138206f, -0.124227f, -0.111720f, -0.103751f, -0.101586f, -0.103453f, -0.106877f, -0.110322f, -0.112385f, -0.111649f, -0.107834f, -0.101601f, -0.093248f, -0.082860f, -0.071411f, -0.060549f, -0.051523f, -0.045052f, -0.041731f, -0.041860f, -0.045219f, -0.051310f, -0.059514f, -0.069016f, -0.079031f, -0.088966f, -0.098149f, -0.105768f, -0.111299f, -0.114442f, -0.114537f, -0.110675f, -0.102450f, -0.090007f, -0.073514f, -0.053290f, -0.030165f, -0.005135f, 0.020901f, 0.046733f, 0.071073f, 0.093736f, 0.115568f, 0.136842f, 0.156886f, 0.175538f, 0.193455f, 0.210815f, 0.227567f, 0.245363f, 0.267074f, 0.293421f, 0.321639f, 0.348399f, 0.372776f, 0.395534f, + 0.416417f, 0.432977f, 0.441812f, 0.440703f, 0.429686f, 0.410030f, 0.382492f, 0.347214f, 0.305126f, 0.258387f, 0.209075f, 0.158069f, 0.105330f, 0.050877f, -0.004290f, -0.057880f, -0.107405f, -0.152051f, -0.192952f, -0.231334f, -0.267030f, -0.298914f, -0.325959f, -0.347776f, -0.365058f, -0.379559f, -0.392822f, -0.404916f, -0.414926f, -0.422209f, -0.426647f, -0.428320f, -0.427480f, -0.424173f, -0.417634f, -0.406929f, -0.392213f, -0.374383f, -0.353748f, -0.330107f, -0.303575f, -0.274126f, -0.241197f, -0.204995f, -0.167220f, -0.129445f, -0.092017f, -0.055184f, -0.019543f, 0.015178f, 0.049744f, 0.083605f, 0.115480f, 0.145267f, 0.173490f, 0.200772f, 0.229618f, 0.261633f, 0.288462f, 0.292554f, 0.266148f, 0.224956f, 0.193266f, 0.179939f} + }, + { + {-0.007328f, -0.006633f, -0.005516f, -0.004599f, -0.006212f, -0.012944f, -0.019712f, -0.012267f, 0.011010f, 0.016826f, -0.032596f, -0.108239f, -0.110945f, 0.010212f, 0.155530f, 0.161358f, 0.002569f, -0.158036f, -0.158582f, -0.022168f, 0.096234f, 0.102029f, 0.035418f, -0.022187f, -0.041382f, -0.034394f, -0.010242f, 0.027669f, 0.066023f, 0.089774f, 0.096851f, 0.093676f, 0.085029f, 0.075093f, 0.069304f, 0.068251f, 0.065239f, 0.053828f, 0.033768f, 0.008271f, -0.019582f, -0.046238f, -0.067687f, -0.081975f, -0.089777f, -0.092397f, -0.091138f, -0.088118f, -0.085559f, -0.084325f, -0.084372f, -0.085968f, -0.089285f, -0.093494f, -0.097292f, -0.099890f, -0.100991f, -0.100590f, -0.099298f, -0.098219f, -0.098141f, -0.099359f, -0.102222f, -0.107041f, -0.113405f, -0.120380f, -0.127461f, -0.134664f, -0.141768f, -0.148230f, -0.153822f, -0.158600f, -0.162259f, -0.164282f, -0.164806f, -0.164594f, -0.163969f, -0.162482f, -0.159958f, -0.157223f, -0.155192f, -0.153484f, -0.150650f, -0.145885f, -0.139922f, -0.133722f, -0.126676f, -0.116974f, -0.103893f, -0.088961f, -0.074475f, -0.061464f, -0.049642f, -0.038896f, -0.030151f, -0.024762f, + -0.023313f, -0.025007f, -0.028346f, -0.032647f, -0.038714f, -0.047598f, -0.058798f, -0.070133f, -0.079232f, -0.084838f, -0.087074f, -0.087043f, -0.085895f, -0.083734f, -0.079604f, -0.072780f, -0.063696f, -0.053433f, -0.042909f, -0.032749f, -0.023224f, -0.013965f, -0.004302f, 0.005932f, 0.016369f, 0.026824f, 0.037430f, 0.048223f, 0.059127f, 0.070106f, 0.080829f, 0.090562f, 0.098820f, 0.105730f, 0.111496f, 0.116170f, 0.120110f, 0.123911f, 0.127778f, 0.131714f, 0.136211f, 0.141890f, 0.148771f, 0.156783f, 0.166411f, 0.177897f, 0.190546f, 0.203691f, 0.217322f, 0.230936f, 0.243185f, 0.253500f, 0.262398f, 0.269552f, 0.273836f, 0.275598f, 0.275116f, 0.267347f, 0.243149f, 0.200413f, 0.151683f, 0.115625f, 0.100371f, 0.098325f}, + {-0.007328f, -0.006633f, -0.005516f, -0.004599f, -0.006212f, -0.012944f, -0.019712f, -0.012267f, 0.011010f, 0.016826f, -0.032596f, -0.108239f, -0.110945f, 0.010212f, 0.155530f, 0.161358f, 0.002569f, -0.158036f, -0.158582f, -0.022168f, 0.096234f, 0.102029f, 0.035418f, -0.022187f, -0.041382f, -0.034394f, -0.010242f, 0.027669f, 0.066023f, 0.089774f, 0.096851f, 0.093676f, 0.085029f, 0.075093f, 0.069304f, 0.068251f, 0.065239f, 0.053828f, 0.033768f, 0.008271f, -0.019582f, -0.046238f, -0.067687f, -0.081975f, -0.089777f, -0.092397f, -0.091138f, -0.088118f, -0.085559f, -0.084325f, -0.084372f, -0.085968f, -0.089285f, -0.093494f, -0.097292f, -0.099890f, -0.100991f, -0.100590f, -0.099298f, -0.098219f, -0.098141f, -0.099359f, -0.102222f, -0.107041f, -0.113405f, -0.120380f, -0.127461f, -0.134664f, -0.141768f, -0.148230f, -0.153822f, -0.158600f, -0.162259f, -0.164282f, -0.164806f, -0.164594f, -0.163969f, -0.162482f, -0.159958f, -0.157223f, -0.155192f, -0.153484f, -0.150650f, -0.145885f, -0.139922f, -0.133722f, -0.126676f, -0.116974f, -0.103893f, -0.088961f, -0.074475f, -0.061464f, -0.049642f, -0.038896f, -0.030151f, -0.024762f, + -0.023313f, -0.025007f, -0.028346f, -0.032647f, -0.038714f, -0.047598f, -0.058798f, -0.070133f, -0.079232f, -0.084838f, -0.087074f, -0.087043f, -0.085895f, -0.083734f, -0.079604f, -0.072780f, -0.063696f, -0.053433f, -0.042909f, -0.032749f, -0.023224f, -0.013965f, -0.004302f, 0.005932f, 0.016369f, 0.026824f, 0.037430f, 0.048223f, 0.059127f, 0.070106f, 0.080829f, 0.090562f, 0.098820f, 0.105730f, 0.111496f, 0.116170f, 0.120110f, 0.123911f, 0.127778f, 0.131714f, 0.136211f, 0.141890f, 0.148771f, 0.156783f, 0.166411f, 0.177897f, 0.190546f, 0.203691f, 0.217322f, 0.230936f, 0.243185f, 0.253500f, 0.262398f, 0.269552f, 0.273836f, 0.275598f, 0.275116f, 0.267347f, 0.243149f, 0.200413f, 0.151683f, 0.115625f, 0.100371f, 0.098325f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]={ + { + {-0.177155f, -0.484920f, -0.682869f, -0.761752f, -0.745718f, -0.674718f, -0.586917f, -0.482404f, -0.323473f, -0.100471f, 0.137830f, 0.347770f, 0.515555f, 0.566254f, 0.359251f, -0.086918f, -0.443496f, -0.353479f, 0.114347f, 0.475511f, 0.361546f, -0.104600f, -0.537424f, -0.735340f, -0.767713f, -0.738461f, -0.652325f, -0.500399f, -0.328661f, -0.180340f, -0.049198f, 0.080145f, 0.196917f, 0.288813f, 0.363706f, 0.431260f, 0.488625f, 0.533226f, 0.570447f, 0.603809f, 0.631651f, 0.654656f, 0.675784f, 0.694117f, 0.707260f, 0.716931f, 0.725662f, 0.732120f, 0.734801f, 0.735754f, 0.736687f, 0.736053f, 0.732755f, 0.728224f, 0.723115f, 0.716287f, 0.707887f, 0.699554f, 0.691466f, 0.682668f, 0.673667f, 0.665599f, 0.657918f, 0.649616f, 0.641313f, 0.633915f, 0.626849f, 0.619441f, 0.612311f, 0.606005f, 0.599945f, 0.593699f, 0.587698f, 0.582110f, 0.576431f, 0.570429f, 0.564305f, 0.558028f, 0.551423f, 0.544461f, 0.536876f, 0.528280f, 0.519027f, 0.509876f, 0.500638f, 0.490479f, 0.479610f, 0.469155f, 0.459295f, 0.449057f, 0.438057f, 0.427113f, 0.417049f, 0.407963f, 0.399612f, 0.391749f, + 0.384343f, 0.377949f, 0.373333f, 0.370329f, 0.367819f, 0.365141f, 0.362755f, 0.361280f, 0.360647f, 0.360347f, 0.359797f, 0.358471f, 0.356317f, 0.353956f, 0.351882f, 0.349712f, 0.346702f, 0.342595f, 0.337552f, 0.331788f, 0.325668f, 0.319629f, 0.313630f, 0.307181f, 0.300093f, 0.292690f, 0.285228f, 0.277698f, 0.270172f, 0.262734f, 0.255155f, 0.247216f, 0.239186f, 0.231499f, 0.224227f, 0.217314f, 0.210913f, 0.205028f, 0.199309f, 0.193614f, 0.188221f, 0.183218f, 0.178349f, 0.173647f, 0.169348f, 0.165068f, 0.160062f, 0.154266f, 0.147958f, 0.140640f, 0.131659f, 0.121348f, 0.109799f, 0.095537f, 0.077450f, 0.055356f, 0.024498f, -0.025904f, -0.097692f, -0.166710f, -0.194224f, -0.163866f, -0.098435f, -0.031004f}, + {-0.177155f, -0.484920f, -0.682869f, -0.761752f, -0.745718f, -0.674718f, -0.586917f, -0.482404f, -0.323473f, -0.100471f, 0.137830f, 0.347770f, 0.515555f, 0.566254f, 0.359251f, -0.086918f, -0.443496f, -0.353479f, 0.114347f, 0.475511f, 0.361546f, -0.104600f, -0.537424f, -0.735340f, -0.767713f, -0.738461f, -0.652325f, -0.500399f, -0.328661f, -0.180340f, -0.049198f, 0.080145f, 0.196917f, 0.288813f, 0.363706f, 0.431260f, 0.488625f, 0.533226f, 0.570447f, 0.603809f, 0.631651f, 0.654656f, 0.675784f, 0.694117f, 0.707260f, 0.716931f, 0.725662f, 0.732120f, 0.734801f, 0.735754f, 0.736687f, 0.736053f, 0.732755f, 0.728224f, 0.723115f, 0.716287f, 0.707887f, 0.699554f, 0.691466f, 0.682668f, 0.673667f, 0.665599f, 0.657918f, 0.649616f, 0.641313f, 0.633915f, 0.626849f, 0.619441f, 0.612311f, 0.606005f, 0.599945f, 0.593699f, 0.587698f, 0.582110f, 0.576431f, 0.570429f, 0.564305f, 0.558028f, 0.551423f, 0.544461f, 0.536876f, 0.528280f, 0.519027f, 0.509876f, 0.500638f, 0.490479f, 0.479610f, 0.469155f, 0.459295f, 0.449057f, 0.438057f, 0.427113f, 0.417049f, 0.407963f, 0.399612f, 0.391749f, + 0.384343f, 0.377949f, 0.373333f, 0.370329f, 0.367819f, 0.365141f, 0.362755f, 0.361280f, 0.360647f, 0.360347f, 0.359797f, 0.358471f, 0.356317f, 0.353956f, 0.351882f, 0.349712f, 0.346702f, 0.342595f, 0.337552f, 0.331788f, 0.325668f, 0.319629f, 0.313630f, 0.307181f, 0.300093f, 0.292690f, 0.285228f, 0.277698f, 0.270172f, 0.262734f, 0.255155f, 0.247216f, 0.239186f, 0.231499f, 0.224227f, 0.217314f, 0.210913f, 0.205028f, 0.199309f, 0.193614f, 0.188221f, 0.183218f, 0.178349f, 0.173647f, 0.169348f, 0.165068f, 0.160062f, 0.154266f, 0.147958f, 0.140640f, 0.131659f, 0.121348f, 0.109799f, 0.095537f, 0.077450f, 0.055356f, 0.024498f, -0.025904f, -0.097692f, -0.166710f, -0.194224f, -0.163866f, -0.098435f, -0.031004f} + }, + { + {0.139549f, 0.336827f, 0.308435f, 0.005808f, -0.462640f, -0.907220f, -1.191107f, -1.249724f, -1.052267f, -0.648374f, -0.184425f, 0.248777f, 0.689047f, 1.057228f, 0.989213f, 0.254777f, -0.678946f, -0.922096f, -0.180074f, 0.815838f, 1.130295f, 0.630480f, -0.085113f, -0.526462f, -0.708792f, -0.811530f, -0.847619f, -0.768858f, -0.635090f, -0.531932f, -0.451007f, -0.348401f, -0.234607f, -0.140241f, -0.058435f, 0.029303f, 0.116774f, 0.194059f, 0.268152f, 0.343788f, 0.412925f, 0.472537f, 0.528731f, 0.581041f, 0.623246f, 0.657416f, 0.689726f, 0.717764f, 0.736441f, 0.749186f, 0.761628f, 0.772404f, 0.779073f, 0.784280f, 0.789592f, 0.791949f, 0.790280f, 0.787315f, 0.783161f, 0.775216f, 0.764362f, 0.753702f, 0.742584f, 0.728749f, 0.713786f, 0.700391f, 0.687515f, 0.673424f, 0.659785f, 0.648526f, 0.638593f, 0.629023f, 0.621278f, 0.616302f, 0.612923f, 0.610405f, 0.609282f, 0.609387f, 0.609910f, 0.610809f, 0.611881f, 0.611943f, 0.610799f, 0.609839f, 0.609254f, 0.607395f, 0.603956f, 0.600774f, 0.598705f, 0.596760f, 0.594697f, 0.593483f, 0.593097f, 0.592548f, 0.591657f, 0.590509f, + 0.588008f, 0.583041f, 0.575878f, 0.566779f, 0.554791f, 0.539385f, 0.521605f, 0.502464f, 0.481918f, 0.460090f, 0.437796f, 0.415604f, 0.394034f, 0.374531f, 0.358494f, 0.345637f, 0.334728f, 0.325270f, 0.317257f, 0.310383f, 0.304694f, 0.300804f, 0.298429f, 0.295932f, 0.292037f, 0.286783f, 0.280539f, 0.273591f, 0.266789f, 0.260976f, 0.255734f, 0.250105f, 0.244196f, 0.238683f, 0.233398f, 0.227855f, 0.222384f, 0.217379f, 0.212359f, 0.206958f, 0.201751f, 0.197057f, 0.192250f, 0.187098f, 0.182271f, 0.177860f, 0.173126f, 0.168131f, 0.163596f, 0.158984f, 0.153008f, 0.145729f, 0.137439f, 0.126380f, 0.110802f, 0.090574f, 0.060909f, 0.008923f, -0.070270f, -0.152060f, -0.192269f, -0.168828f, -0.103696f, -0.033024f}, + {-0.139549f, -0.336827f, -0.308435f, -0.005808f, 0.462640f, 0.907220f, 1.191107f, 1.249724f, 1.052267f, 0.648374f, 0.184425f, -0.248777f, -0.689047f, -1.057228f, -0.989213f, -0.254777f, 0.678946f, 0.922096f, 0.180074f, -0.815838f, -1.130295f, -0.630480f, 0.085113f, 0.526462f, 0.708792f, 0.811530f, 0.847619f, 0.768858f, 0.635090f, 0.531932f, 0.451007f, 0.348401f, 0.234607f, 0.140241f, 0.058435f, -0.029303f, -0.116774f, -0.194059f, -0.268152f, -0.343788f, -0.412925f, -0.472537f, -0.528731f, -0.581041f, -0.623246f, -0.657416f, -0.689726f, -0.717764f, -0.736441f, -0.749186f, -0.761628f, -0.772404f, -0.779073f, -0.784280f, -0.789592f, -0.791949f, -0.790280f, -0.787315f, -0.783161f, -0.775216f, -0.764362f, -0.753702f, -0.742584f, -0.728749f, -0.713786f, -0.700391f, -0.687515f, -0.673424f, -0.659785f, -0.648526f, -0.638593f, -0.629023f, -0.621278f, -0.616302f, -0.612923f, -0.610405f, -0.609282f, -0.609387f, -0.609910f, -0.610809f, -0.611881f, -0.611943f, -0.610799f, -0.609839f, -0.609254f, -0.607395f, -0.603956f, -0.600774f, -0.598705f, -0.596760f, -0.594697f, -0.593483f, -0.593097f, -0.592548f, -0.591657f, -0.590509f, + -0.588008f, -0.583041f, -0.575878f, -0.566779f, -0.554791f, -0.539385f, -0.521605f, -0.502464f, -0.481918f, -0.460090f, -0.437796f, -0.415604f, -0.394034f, -0.374531f, -0.358494f, -0.345637f, -0.334728f, -0.325270f, -0.317257f, -0.310383f, -0.304694f, -0.300804f, -0.298429f, -0.295932f, -0.292037f, -0.286783f, -0.280539f, -0.273591f, -0.266789f, -0.260976f, -0.255734f, -0.250105f, -0.244196f, -0.238683f, -0.233398f, -0.227855f, -0.222384f, -0.217379f, -0.212359f, -0.206958f, -0.201751f, -0.197057f, -0.192250f, -0.187098f, -0.182271f, -0.177860f, -0.173126f, -0.168131f, -0.163596f, -0.158984f, -0.153008f, -0.145729f, -0.137439f, -0.126380f, -0.110802f, -0.090574f, -0.060909f, -0.008923f, 0.070270f, 0.152060f, 0.192269f, 0.168828f, 0.103696f, 0.033024f} + }, + { + {-0.016760f, -0.068127f, -0.130493f, -0.141089f, -0.067185f, 0.038675f, 0.094614f, 0.073852f, 0.012198f, -0.044998f, -0.074922f, -0.067552f, -0.018229f, 0.053871f, 0.096099f, 0.062126f, -0.025556f, -0.075695f, -0.021847f, 0.089982f, 0.140592f, 0.069052f, -0.066385f, -0.166455f, -0.193584f, -0.177205f, -0.151753f, -0.126106f, -0.100111f, -0.076682f, -0.055033f, -0.030919f, -0.006099f, 0.012632f, 0.022449f, 0.025150f, 0.022366f, 0.016890f, 0.015159f, 0.022388f, 0.037604f, 0.057012f, 0.079078f, 0.103587f, 0.129254f, 0.155163f, 0.182207f, 0.211436f, 0.242891f, 0.276638f, 0.312764f, 0.349989f, 0.386121f, 0.419912f, 0.450938f, 0.478114f, 0.499957f, 0.515976f, 0.526465f, 0.531211f, 0.529467f, 0.520866f, 0.505422f, 0.482804f, 0.452352f, 0.413839f, 0.367819f, 0.315251f, 0.257155f, 0.194777f, 0.129844f, 0.064384f, 0.000411f, -0.059995f, -0.114688f, -0.162166f, -0.202053f, -0.234163f, -0.257536f, -0.271541f, -0.277603f, -0.278229f, -0.274214f, -0.264528f, -0.249435f, -0.231884f, -0.214667f, -0.197504f, -0.178344f, -0.156843f, -0.135208f, -0.115847f, -0.099323f, -0.084813f, -0.071766f, -0.060680f, + -0.052653f, -0.048607f, -0.048842f, -0.052934f, -0.059893f, -0.068614f, -0.078462f, -0.089482f, -0.101882f, -0.115125f, -0.127566f, -0.137225f, -0.143085f, -0.145562f, -0.145628f, -0.143674f, -0.139331f, -0.132079f, -0.121698f, -0.108283f, -0.092209f, -0.074130f, -0.054844f, -0.035153f, -0.015868f, 0.002272f, 0.018784f, 0.033372f, 0.045644f, 0.055147f, 0.061721f, 0.065625f, 0.067291f, 0.067129f, 0.065460f, 0.062524f, 0.058672f, 0.054690f, 0.051618f, 0.050121f, 0.050200f, 0.051436f, 0.053045f, 0.053826f, 0.052774f, 0.049901f, 0.045925f, 0.041164f, 0.035363f, 0.028499f, 0.020965f, 0.012908f, 0.004149f, -0.005086f, -0.014196f, -0.023368f, -0.034007f, -0.046830f, -0.059022f, -0.064250f, -0.057433f, -0.040349f, -0.021042f, -0.006032f}, + {-0.016760f, -0.068127f, -0.130493f, -0.141089f, -0.067185f, 0.038675f, 0.094614f, 0.073852f, 0.012198f, -0.044998f, -0.074922f, -0.067552f, -0.018229f, 0.053871f, 0.096099f, 0.062126f, -0.025556f, -0.075695f, -0.021847f, 0.089982f, 0.140592f, 0.069052f, -0.066385f, -0.166455f, -0.193584f, -0.177205f, -0.151753f, -0.126106f, -0.100111f, -0.076682f, -0.055033f, -0.030919f, -0.006099f, 0.012632f, 0.022449f, 0.025150f, 0.022366f, 0.016890f, 0.015159f, 0.022388f, 0.037604f, 0.057012f, 0.079078f, 0.103587f, 0.129254f, 0.155163f, 0.182207f, 0.211436f, 0.242891f, 0.276638f, 0.312764f, 0.349989f, 0.386121f, 0.419912f, 0.450938f, 0.478114f, 0.499957f, 0.515976f, 0.526465f, 0.531211f, 0.529467f, 0.520866f, 0.505422f, 0.482804f, 0.452352f, 0.413839f, 0.367819f, 0.315251f, 0.257155f, 0.194777f, 0.129844f, 0.064384f, 0.000411f, -0.059995f, -0.114688f, -0.162166f, -0.202053f, -0.234163f, -0.257536f, -0.271541f, -0.277603f, -0.278229f, -0.274214f, -0.264528f, -0.249435f, -0.231884f, -0.214667f, -0.197504f, -0.178344f, -0.156843f, -0.135208f, -0.115847f, -0.099323f, -0.084813f, -0.071766f, -0.060680f, + -0.052653f, -0.048607f, -0.048842f, -0.052934f, -0.059893f, -0.068614f, -0.078462f, -0.089482f, -0.101882f, -0.115125f, -0.127566f, -0.137225f, -0.143085f, -0.145562f, -0.145628f, -0.143674f, -0.139331f, -0.132079f, -0.121698f, -0.108283f, -0.092209f, -0.074130f, -0.054844f, -0.035153f, -0.015868f, 0.002272f, 0.018784f, 0.033372f, 0.045644f, 0.055147f, 0.061721f, 0.065625f, 0.067291f, 0.067129f, 0.065460f, 0.062524f, 0.058672f, 0.054690f, 0.051618f, 0.050121f, 0.050200f, 0.051436f, 0.053045f, 0.053826f, 0.052774f, 0.049901f, 0.045925f, 0.041164f, 0.035363f, 0.028499f, 0.020965f, 0.012908f, 0.004149f, -0.005086f, -0.014196f, -0.023368f, -0.034007f, -0.046830f, -0.059022f, -0.064250f, -0.057433f, -0.040349f, -0.021042f, -0.006032f} + }, + { + {0.006216f, -0.000979f, -0.045405f, -0.098459f, -0.108142f, -0.058042f, 0.002286f, 0.006399f, -0.050505f, -0.107869f, -0.115965f, -0.079002f, -0.014058f, 0.076297f, 0.153748f, 0.129221f, -0.022377f, -0.165863f, -0.124719f, 0.094586f, 0.284198f, 0.268252f, 0.080217f, -0.126623f, -0.267666f, -0.362720f, -0.439083f, -0.483302f, -0.481861f, -0.448478f, -0.398948f, -0.332421f, -0.246125f, -0.147271f, -0.044899f, 0.056214f, 0.151234f, 0.234458f, 0.303629f, 0.359457f, 0.402431f, 0.433847f, 0.456921f, 0.473698f, 0.483757f, 0.487573f, 0.487588f, 0.484776f, 0.477584f, 0.465086f, 0.448287f, 0.428309f, 0.406263f, 0.384767f, 0.366877f, 0.353378f, 0.342840f, 0.333747f, 0.325088f, 0.315678f, 0.304608f, 0.292048f, 0.278687f, 0.264811f, 0.250511f, 0.236166f, 0.222031f, 0.207593f, 0.191859f, 0.174275f, 0.155036f, 0.134348f, 0.111748f, 0.086766f, 0.060081f, 0.033085f, 0.006337f, -0.020341f, -0.046077f, -0.068901f, -0.087990f, -0.104276f, -0.118054f, -0.127804f, -0.132542f, -0.133724f, -0.133430f, -0.132008f, -0.128923f, -0.124704f, -0.120371f, -0.115592f, -0.108930f, -0.099692f, -0.088366f, -0.075241f, + -0.059512f, -0.040057f, -0.016699f, 0.009565f, 0.037530f, 0.066848f, 0.097910f, 0.130575f, 0.163378f, 0.194394f, 0.222759f, 0.248920f, 0.273442f, 0.295928f, 0.315131f, 0.329956f, 0.340466f, 0.348121f, 0.354815f, 0.361328f, 0.366754f, 0.369576f, 0.369190f, 0.366386f, 0.362766f, 0.359901f, 0.358565f, 0.358337f, 0.358068f, 0.356967f, 0.355150f, 0.353203f, 0.351625f, 0.350678f, 0.350257f, 0.349702f, 0.348075f, 0.344733f, 0.339480f, 0.332348f, 0.323551f, 0.313435f, 0.302117f, 0.289340f, 0.274852f, 0.258681f, 0.241042f, 0.222363f, 0.203342f, 0.184581f, 0.166338f, 0.148863f, 0.132320f, 0.116204f, 0.099819f, 0.082819f, 0.062865f, 0.033748f, -0.008051f, -0.052501f, -0.078525f, -0.073596f, -0.046585f, -0.015014f}, + {0.006216f, -0.000979f, -0.045405f, -0.098459f, -0.108142f, -0.058042f, 0.002286f, 0.006399f, -0.050505f, -0.107869f, -0.115965f, -0.079002f, -0.014058f, 0.076297f, 0.153748f, 0.129221f, -0.022377f, -0.165863f, -0.124719f, 0.094586f, 0.284198f, 0.268252f, 0.080217f, -0.126623f, -0.267666f, -0.362720f, -0.439083f, -0.483302f, -0.481861f, -0.448478f, -0.398948f, -0.332421f, -0.246125f, -0.147271f, -0.044899f, 0.056214f, 0.151234f, 0.234458f, 0.303629f, 0.359457f, 0.402431f, 0.433847f, 0.456921f, 0.473698f, 0.483757f, 0.487573f, 0.487588f, 0.484776f, 0.477584f, 0.465086f, 0.448287f, 0.428309f, 0.406263f, 0.384767f, 0.366877f, 0.353378f, 0.342840f, 0.333747f, 0.325088f, 0.315678f, 0.304608f, 0.292048f, 0.278687f, 0.264811f, 0.250511f, 0.236166f, 0.222031f, 0.207593f, 0.191859f, 0.174275f, 0.155036f, 0.134348f, 0.111748f, 0.086766f, 0.060081f, 0.033085f, 0.006337f, -0.020341f, -0.046077f, -0.068901f, -0.087990f, -0.104276f, -0.118054f, -0.127804f, -0.132542f, -0.133724f, -0.133430f, -0.132008f, -0.128923f, -0.124704f, -0.120371f, -0.115592f, -0.108930f, -0.099692f, -0.088366f, -0.075241f, + -0.059512f, -0.040057f, -0.016699f, 0.009565f, 0.037530f, 0.066848f, 0.097910f, 0.130575f, 0.163378f, 0.194394f, 0.222759f, 0.248920f, 0.273442f, 0.295928f, 0.315131f, 0.329956f, 0.340466f, 0.348121f, 0.354815f, 0.361328f, 0.366754f, 0.369576f, 0.369190f, 0.366386f, 0.362766f, 0.359901f, 0.358565f, 0.358337f, 0.358068f, 0.356967f, 0.355150f, 0.353203f, 0.351625f, 0.350678f, 0.350257f, 0.349702f, 0.348075f, 0.344733f, 0.339480f, 0.332348f, 0.323551f, 0.313435f, 0.302117f, 0.289340f, 0.274852f, 0.258681f, 0.241042f, 0.222363f, 0.203342f, 0.184581f, 0.166338f, 0.148863f, 0.132320f, 0.116204f, 0.099819f, 0.082819f, 0.062865f, 0.033748f, -0.008051f, -0.052501f, -0.078525f, -0.073596f, -0.046585f, -0.015014f} + }, + { + {-0.004287f, -0.004125f, 0.010669f, 0.024630f, 0.019494f, 0.000957f, -0.007771f, -0.004086f, -0.018999f, -0.078706f, -0.163526f, -0.211376f, -0.156788f, 0.013090f, 0.206855f, 0.257968f, 0.082065f, -0.182440f, -0.272081f, -0.081322f, 0.212807f, 0.354516f, 0.275100f, 0.096863f, -0.061422f, -0.184431f, -0.290052f, -0.362546f, -0.382821f, -0.365049f, -0.332356f, -0.287833f, -0.227815f, -0.159321f, -0.089659f, -0.016005f, 0.063671f, 0.140956f, 0.205111f, 0.252511f, 0.284711f, 0.304370f, 0.315455f, 0.322285f, 0.326832f, 0.329503f, 0.331399f, 0.333108f, 0.333026f, 0.329471f, 0.322961f, 0.314750f, 0.305096f, 0.294458f, 0.284464f, 0.276331f, 0.269753f, 0.264070f, 0.259113f, 0.254491f, 0.249431f, 0.243603f, 0.237011f, 0.229139f, 0.219355f, 0.207972f, 0.195732f, 0.182410f, 0.167075f, 0.149600f, 0.130686f, 0.110376f, 0.087751f, 0.062438f, 0.035361f, 0.007458f, -0.021421f, -0.051426f, -0.081166f, -0.108532f, -0.132991f, -0.155787f, -0.177450f, -0.196472f, -0.211501f, -0.223729f, -0.235413f, -0.246432f, -0.254147f, -0.256866f, -0.255699f, -0.252400f, -0.246930f, -0.238183f, -0.226128f, -0.212153f, + -0.197762f, -0.183576f, -0.169356f, -0.154687f, -0.139838f, -0.125919f, -0.113952f, -0.104109f, -0.096147f, -0.089874f, -0.084624f, -0.079081f, -0.072485f, -0.065470f, -0.059088f, -0.053584f, -0.048459f, -0.042892f, -0.035834f, -0.026742f, -0.016583f, -0.007210f, 0.000460f, 0.006925f, 0.013101f, 0.019829f, 0.027937f, 0.037640f, 0.048171f, 0.058820f, 0.069767f, 0.081298f, 0.093098f, 0.104818f, 0.116218f, 0.126365f, 0.133907f, 0.138397f, 0.140204f, 0.139366f, 0.135883f, 0.130589f, 0.124266f, 0.116642f, 0.107629f, 0.098425f, 0.090176f, 0.083055f, 0.077635f, 0.075176f, 0.075705f, 0.078026f, 0.081969f, 0.088024f, 0.095261f, 0.102733f, 0.111115f, 0.118029f, 0.114164f, 0.091680f, 0.056373f, 0.024417f, 0.006512f, 0.000770f}, + {0.004287f, 0.004125f, -0.010669f, -0.024630f, -0.019494f, -0.000957f, 0.007771f, 0.004086f, 0.018999f, 0.078706f, 0.163526f, 0.211376f, 0.156788f, -0.013090f, -0.206855f, -0.257968f, -0.082065f, 0.182440f, 0.272081f, 0.081322f, -0.212807f, -0.354516f, -0.275100f, -0.096863f, 0.061422f, 0.184431f, 0.290052f, 0.362546f, 0.382821f, 0.365049f, 0.332356f, 0.287833f, 0.227815f, 0.159321f, 0.089659f, 0.016005f, -0.063671f, -0.140956f, -0.205111f, -0.252511f, -0.284711f, -0.304370f, -0.315455f, -0.322285f, -0.326832f, -0.329503f, -0.331399f, -0.333108f, -0.333026f, -0.329471f, -0.322961f, -0.314750f, -0.305096f, -0.294458f, -0.284464f, -0.276331f, -0.269753f, -0.264070f, -0.259113f, -0.254491f, -0.249431f, -0.243603f, -0.237011f, -0.229139f, -0.219355f, -0.207972f, -0.195732f, -0.182410f, -0.167075f, -0.149600f, -0.130686f, -0.110376f, -0.087751f, -0.062438f, -0.035361f, -0.007458f, 0.021421f, 0.051426f, 0.081166f, 0.108532f, 0.132991f, 0.155787f, 0.177450f, 0.196472f, 0.211501f, 0.223729f, 0.235413f, 0.246432f, 0.254147f, 0.256866f, 0.255699f, 0.252400f, 0.246930f, 0.238183f, 0.226128f, 0.212153f, + 0.197762f, 0.183576f, 0.169356f, 0.154687f, 0.139838f, 0.125919f, 0.113952f, 0.104109f, 0.096147f, 0.089874f, 0.084624f, 0.079081f, 0.072485f, 0.065470f, 0.059088f, 0.053584f, 0.048459f, 0.042892f, 0.035834f, 0.026742f, 0.016583f, 0.007210f, -0.000460f, -0.006925f, -0.013101f, -0.019829f, -0.027937f, -0.037640f, -0.048171f, -0.058820f, -0.069767f, -0.081298f, -0.093098f, -0.104818f, -0.116218f, -0.126365f, -0.133907f, -0.138397f, -0.140204f, -0.139366f, -0.135883f, -0.130589f, -0.124266f, -0.116642f, -0.107629f, -0.098425f, -0.090176f, -0.083055f, -0.077635f, -0.075176f, -0.075705f, -0.078026f, -0.081969f, -0.088024f, -0.095261f, -0.102733f, -0.111115f, -0.118029f, -0.114164f, -0.091680f, -0.056373f, -0.024417f, -0.006512f, -0.000770f} + }, + { + {-0.021647f, -0.023586f, 0.024030f, 0.034286f, -0.023210f, -0.048883f, 0.041004f, 0.162430f, 0.151420f, -0.019026f, -0.196878f, -0.228185f, -0.105491f, 0.063785f, 0.163457f, 0.131089f, -0.006547f, -0.126856f, -0.104754f, 0.046404f, 0.175190f, 0.165514f, 0.060007f, -0.021876f, -0.031457f, -0.005672f, 0.019840f, 0.046199f, 0.074668f, 0.089172f, 0.080103f, 0.054860f, 0.022313f, -0.014010f, -0.049302f, -0.079262f, -0.106213f, -0.133194f, -0.155736f, -0.166838f, -0.165427f, -0.154608f, -0.136822f, -0.115133f, -0.094431f, -0.077550f, -0.063253f, -0.049405f, -0.034984f, -0.018856f, -0.000016f, 0.020853f, 0.042649f, 0.066048f, 0.092202f, 0.120165f, 0.147513f, 0.172493f, 0.194076f, 0.210899f, 0.221573f, 0.225505f, 0.222686f, 0.213027f, 0.196166f, 0.171640f, 0.139274f, 0.099475f, 0.052952f, 0.000374f, -0.057162f, -0.117584f, -0.178302f, -0.236900f, -0.291078f, -0.338764f, -0.378809f, -0.410753f, -0.433773f, -0.447178f, -0.452109f, -0.450928f, -0.444375f, -0.431188f, -0.411190f, -0.386779f, -0.360327f, -0.331827f, -0.300282f, -0.265894f, -0.229528f, -0.191072f, -0.149793f, -0.105819f, -0.060219f, -0.013836f, + 0.033000f, 0.079560f, 0.124221f, 0.165296f, 0.202053f, 0.234481f, 0.261993f, 0.282718f, 0.294593f, 0.297426f, 0.293710f, 0.286928f, 0.278788f, 0.268248f, 0.253380f, 0.233961f, 0.212129f, 0.190864f, 0.172155f, 0.156250f, 0.142108f, 0.128607f, 0.115645f, 0.104097f, 0.094743f, 0.087526f, 0.081734f, 0.076398f, 0.070494f, 0.063326f, 0.054855f, 0.045303f, 0.034575f, 0.022541f, 0.009630f, -0.003393f, -0.015973f, -0.027652f, -0.037849f, -0.046228f, -0.052913f, -0.058025f, -0.061573f, -0.063948f, -0.065787f, -0.067201f, -0.067897f, -0.068076f, -0.068265f, -0.068365f, -0.067848f, -0.066716f, -0.065221f, -0.063029f, -0.059813f, -0.056114f, -0.052102f, -0.046012f, -0.035782f, -0.022435f, -0.010202f, -0.002684f, 0.000040f, 0.000220f}, + {0.021647f, 0.023586f, -0.024030f, -0.034286f, 0.023210f, 0.048883f, -0.041004f, -0.162430f, -0.151420f, 0.019026f, 0.196878f, 0.228185f, 0.105491f, -0.063785f, -0.163457f, -0.131089f, 0.006547f, 0.126856f, 0.104754f, -0.046404f, -0.175190f, -0.165514f, -0.060007f, 0.021876f, 0.031457f, 0.005672f, -0.019840f, -0.046199f, -0.074668f, -0.089172f, -0.080103f, -0.054860f, -0.022313f, 0.014010f, 0.049302f, 0.079262f, 0.106213f, 0.133194f, 0.155736f, 0.166838f, 0.165427f, 0.154608f, 0.136822f, 0.115133f, 0.094431f, 0.077550f, 0.063253f, 0.049405f, 0.034984f, 0.018856f, 0.000016f, -0.020853f, -0.042649f, -0.066048f, -0.092202f, -0.120165f, -0.147513f, -0.172493f, -0.194076f, -0.210899f, -0.221573f, -0.225505f, -0.222686f, -0.213027f, -0.196166f, -0.171640f, -0.139274f, -0.099475f, -0.052952f, -0.000374f, 0.057162f, 0.117584f, 0.178302f, 0.236900f, 0.291078f, 0.338764f, 0.378809f, 0.410753f, 0.433773f, 0.447178f, 0.452109f, 0.450928f, 0.444375f, 0.431188f, 0.411190f, 0.386779f, 0.360327f, 0.331827f, 0.300282f, 0.265894f, 0.229528f, 0.191072f, 0.149793f, 0.105819f, 0.060219f, 0.013836f, + -0.033000f, -0.079560f, -0.124221f, -0.165296f, -0.202053f, -0.234481f, -0.261993f, -0.282718f, -0.294593f, -0.297426f, -0.293710f, -0.286928f, -0.278788f, -0.268248f, -0.253380f, -0.233961f, -0.212129f, -0.190864f, -0.172155f, -0.156250f, -0.142108f, -0.128607f, -0.115645f, -0.104097f, -0.094743f, -0.087526f, -0.081734f, -0.076398f, -0.070494f, -0.063326f, -0.054855f, -0.045303f, -0.034575f, -0.022541f, -0.009630f, 0.003393f, 0.015973f, 0.027652f, 0.037849f, 0.046228f, 0.052913f, 0.058025f, 0.061573f, 0.063948f, 0.065787f, 0.067201f, 0.067897f, 0.068076f, 0.068265f, 0.068365f, 0.067848f, 0.066716f, 0.065221f, 0.063029f, 0.059813f, 0.056114f, 0.052102f, 0.046012f, 0.035782f, 0.022435f, 0.010202f, 0.002684f, -0.000040f, -0.000220f} + }, + { + {0.003609f, -0.005875f, -0.035270f, -0.050705f, -0.040591f, -0.034798f, -0.044444f, -0.025022f, 0.068226f, 0.216792f, 0.351580f, 0.390054f, 0.251908f, -0.072078f, -0.407851f, -0.461577f, -0.131618f, 0.295028f, 0.412417f, 0.154332f, -0.160841f, -0.245404f, -0.134932f, -0.021902f, 0.026617f, 0.066919f, 0.111869f, 0.111579f, 0.060602f, 0.013650f, 0.002021f, 0.006513f, 0.007751f, 0.009075f, 0.011723f, 0.007129f, -0.005433f, -0.018170f, -0.029080f, -0.041517f, -0.055476f, -0.069814f, -0.085898f, -0.102492f, -0.114887f, -0.122644f, -0.130213f, -0.138731f, -0.145200f, -0.149398f, -0.153881f, -0.158200f, -0.159672f, -0.158092f, -0.154425f, -0.147404f, -0.135655f, -0.120319f, -0.102543f, -0.081543f, -0.057017f, -0.030152f, -0.001234f, 0.030441f, 0.064037f, 0.097610f, 0.130500f, 0.162490f, 0.191732f, 0.216128f, 0.235437f, 0.249873f, 0.258237f, 0.259193f, 0.252784f, 0.239464f, 0.219178f, 0.192076f, 0.158787f, 0.119949f, 0.076587f, 0.030361f, -0.017694f, -0.067610f, -0.118812f, -0.169500f, -0.218464f, -0.265819f, -0.311413f, -0.354364f, -0.394359f, -0.431201f, -0.462908f, -0.486452f, -0.500620f, -0.506335f, + -0.504246f, -0.493652f, -0.473634f, -0.444204f, -0.407040f, -0.365932f, -0.325349f, -0.287620f, -0.252527f, -0.220028f, -0.191976f, -0.170773f, -0.157796f, -0.153357f, -0.156778f, -0.166233f, -0.179639f, -0.195792f, -0.214111f, -0.233906f, -0.254592f, -0.275719f, -0.296074f, -0.313716f, -0.327512f, -0.337813f, -0.345431f, -0.351001f, -0.355309f, -0.358974f, -0.361805f, -0.363501f, -0.364630f, -0.365878f, -0.366858f, -0.366727f, -0.365312f, -0.362755f, -0.358891f, -0.353770f, -0.347869f, -0.341110f, -0.332548f, -0.321368f, -0.307255f, -0.289895f, -0.269324f, -0.246517f, -0.222440f, -0.197100f, -0.170673f, -0.144380f, -0.118840f, -0.093149f, -0.066936f, -0.040482f, -0.010543f, 0.029314f, 0.077898f, 0.118098f, 0.127883f, 0.102368f, 0.059162f, 0.018211f}, + {0.003609f, -0.005875f, -0.035270f, -0.050705f, -0.040591f, -0.034798f, -0.044444f, -0.025022f, 0.068226f, 0.216792f, 0.351580f, 0.390054f, 0.251908f, -0.072078f, -0.407851f, -0.461577f, -0.131618f, 0.295028f, 0.412417f, 0.154332f, -0.160841f, -0.245404f, -0.134932f, -0.021902f, 0.026617f, 0.066919f, 0.111869f, 0.111579f, 0.060602f, 0.013650f, 0.002021f, 0.006513f, 0.007751f, 0.009075f, 0.011723f, 0.007129f, -0.005433f, -0.018170f, -0.029080f, -0.041517f, -0.055476f, -0.069814f, -0.085898f, -0.102492f, -0.114887f, -0.122644f, -0.130213f, -0.138731f, -0.145200f, -0.149398f, -0.153881f, -0.158200f, -0.159672f, -0.158092f, -0.154425f, -0.147404f, -0.135655f, -0.120319f, -0.102543f, -0.081543f, -0.057017f, -0.030152f, -0.001234f, 0.030441f, 0.064037f, 0.097610f, 0.130500f, 0.162490f, 0.191732f, 0.216128f, 0.235437f, 0.249873f, 0.258237f, 0.259193f, 0.252784f, 0.239464f, 0.219178f, 0.192076f, 0.158787f, 0.119949f, 0.076587f, 0.030361f, -0.017694f, -0.067610f, -0.118812f, -0.169500f, -0.218464f, -0.265819f, -0.311413f, -0.354364f, -0.394359f, -0.431201f, -0.462908f, -0.486452f, -0.500620f, -0.506335f, + -0.504246f, -0.493652f, -0.473634f, -0.444204f, -0.407040f, -0.365932f, -0.325349f, -0.287620f, -0.252527f, -0.220028f, -0.191976f, -0.170773f, -0.157796f, -0.153357f, -0.156778f, -0.166233f, -0.179639f, -0.195792f, -0.214111f, -0.233906f, -0.254592f, -0.275719f, -0.296074f, -0.313716f, -0.327512f, -0.337813f, -0.345431f, -0.351001f, -0.355309f, -0.358974f, -0.361805f, -0.363501f, -0.364630f, -0.365878f, -0.366858f, -0.366727f, -0.365312f, -0.362755f, -0.358891f, -0.353770f, -0.347869f, -0.341110f, -0.332548f, -0.321368f, -0.307255f, -0.289895f, -0.269324f, -0.246517f, -0.222440f, -0.197100f, -0.170673f, -0.144380f, -0.118840f, -0.093149f, -0.066936f, -0.040482f, -0.010543f, 0.029314f, 0.077898f, 0.118098f, 0.127883f, 0.102368f, 0.059162f, 0.018211f} + }, + { + {-0.035571f, -0.082138f, -0.071881f, -0.003092f, 0.101819f, 0.191638f, 0.193745f, 0.076115f, -0.091802f, -0.185433f, -0.151170f, -0.053032f, 0.018984f, 0.043815f, 0.047820f, 0.036034f, -0.003122f, -0.047268f, -0.050528f, -0.006921f, 0.038234f, 0.049115f, 0.039088f, 0.038101f, 0.048336f, 0.050095f, 0.033245f, 0.003517f, -0.032931f, -0.074051f, -0.113659f, -0.141573f, -0.153955f, -0.156842f, -0.158152f, -0.160297f, -0.160824f, -0.156125f, -0.143114f, -0.120343f, -0.089839f, -0.056855f, -0.026374f, -0.000211f, 0.022161f, 0.041369f, 0.057834f, 0.072513f, 0.086354f, 0.099354f, 0.111114f, 0.121809f, 0.131727f, 0.140502f, 0.147687f, 0.153512f, 0.158207f, 0.161156f, 0.161507f, 0.159270f, 0.155236f, 0.150152f, 0.144509f, 0.139018f, 0.134862f, 0.133145f, 0.133984f, 0.136505f, 0.140154f, 0.145498f, 0.153052f, 0.161967f, 0.171013f, 0.180271f, 0.190456f, 0.200982f, 0.210096f, 0.216588f, 0.220074f, 0.219946f, 0.215202f, 0.205145f, 0.189615f, 0.168961f, 0.143969f, 0.114996f, 0.081374f, 0.043024f, 0.002201f, -0.038478f, -0.079680f, -0.124703f, -0.174812f, -0.227318f, -0.278767f, -0.328165f, + -0.376275f, -0.423057f, -0.466602f, -0.504310f, -0.535025f, -0.559812f, -0.579998f, -0.594737f, -0.601786f, -0.600642f, -0.593485f, -0.582907f, -0.569794f, -0.553260f, -0.531574f, -0.503599f, -0.470364f, -0.434785f, -0.399160f, -0.363704f, -0.327884f, -0.291902f, -0.256412f, -0.222128f, -0.190043f, -0.160765f, -0.133592f, -0.107383f, -0.081970f, -0.057569f, -0.033581f, -0.009158f, 0.015876f, 0.041442f, 0.067251f, 0.091897f, 0.113638f, 0.132541f, 0.150206f, 0.167416f, 0.183901f, 0.199680f, 0.214328f, 0.225868f, 0.232832f, 0.236330f, 0.238118f, 0.238385f, 0.237189f, 0.235549f, 0.233292f, 0.228644f, 0.221316f, 0.213017f, 0.204613f, 0.196295f, 0.189029f, 0.180265f, 0.160578f, 0.123113f, 0.075941f, 0.036564f, 0.013988f, 0.003474f}, + {-0.035571f, -0.082138f, -0.071881f, -0.003092f, 0.101819f, 0.191638f, 0.193745f, 0.076115f, -0.091802f, -0.185433f, -0.151170f, -0.053032f, 0.018984f, 0.043815f, 0.047820f, 0.036034f, -0.003122f, -0.047268f, -0.050528f, -0.006921f, 0.038234f, 0.049115f, 0.039088f, 0.038101f, 0.048336f, 0.050095f, 0.033245f, 0.003517f, -0.032931f, -0.074051f, -0.113659f, -0.141573f, -0.153955f, -0.156842f, -0.158152f, -0.160297f, -0.160824f, -0.156125f, -0.143114f, -0.120343f, -0.089839f, -0.056855f, -0.026374f, -0.000211f, 0.022161f, 0.041369f, 0.057834f, 0.072513f, 0.086354f, 0.099354f, 0.111114f, 0.121809f, 0.131727f, 0.140502f, 0.147687f, 0.153512f, 0.158207f, 0.161156f, 0.161507f, 0.159270f, 0.155236f, 0.150152f, 0.144509f, 0.139018f, 0.134862f, 0.133145f, 0.133984f, 0.136505f, 0.140154f, 0.145498f, 0.153052f, 0.161967f, 0.171013f, 0.180271f, 0.190456f, 0.200982f, 0.210096f, 0.216588f, 0.220074f, 0.219946f, 0.215202f, 0.205145f, 0.189615f, 0.168961f, 0.143969f, 0.114996f, 0.081374f, 0.043024f, 0.002201f, -0.038478f, -0.079680f, -0.124703f, -0.174812f, -0.227318f, -0.278767f, -0.328165f, + -0.376275f, -0.423057f, -0.466602f, -0.504310f, -0.535025f, -0.559812f, -0.579998f, -0.594737f, -0.601786f, -0.600642f, -0.593485f, -0.582907f, -0.569794f, -0.553260f, -0.531574f, -0.503599f, -0.470364f, -0.434785f, -0.399160f, -0.363704f, -0.327884f, -0.291902f, -0.256412f, -0.222128f, -0.190043f, -0.160765f, -0.133592f, -0.107383f, -0.081970f, -0.057569f, -0.033581f, -0.009158f, 0.015876f, 0.041442f, 0.067251f, 0.091897f, 0.113638f, 0.132541f, 0.150206f, 0.167416f, 0.183901f, 0.199680f, 0.214328f, 0.225868f, 0.232832f, 0.236330f, 0.238118f, 0.238385f, 0.237189f, 0.235549f, 0.233292f, 0.228644f, 0.221316f, 0.213017f, 0.204613f, 0.196295f, 0.189029f, 0.180265f, 0.160578f, 0.123113f, 0.075941f, 0.036564f, 0.013988f, 0.003474f} + }, + { + {0.042551f, 0.061299f, -0.028672f, -0.144580f, -0.225015f, -0.285627f, -0.304011f, -0.184177f, 0.097749f, 0.418361f, 0.636609f, 0.684969f, 0.487187f, -0.018125f, -0.625221f, -0.833372f, -0.352995f, 0.433022f, 0.798844f, 0.478184f, -0.106003f, -0.434667f, -0.441046f, -0.368821f, -0.347324f, -0.318444f, -0.244373f, -0.171635f, -0.121000f, -0.059037f, 0.023724f, 0.097010f, 0.147728f, 0.189866f, 0.225827f, 0.243381f, 0.241962f, 0.230347f, 0.209235f, 0.177802f, 0.144642f, 0.116772f, 0.090397f, 0.061815f, 0.034477f, 0.010059f, -0.014474f, -0.038175f, -0.056107f, -0.068563f, -0.080545f, -0.093619f, -0.106370f, -0.119695f, -0.134742f, -0.149473f, -0.162326f, -0.174807f, -0.187244f, -0.197268f, -0.204420f, -0.210807f, -0.216408f, -0.219069f, -0.218931f, -0.217754f, -0.214932f, -0.208841f, -0.200539f, -0.192118f, -0.183496f, -0.174075f, -0.165039f, -0.157372f, -0.150168f, -0.142655f, -0.135395f, -0.128631f, -0.122082f, -0.116426f, -0.112435f, -0.109121f, -0.105059f, -0.100419f, -0.095650f, -0.089752f, -0.081852f, -0.072848f, -0.064030f, -0.055849f, -0.048935f, -0.044367f, -0.042466f, -0.043236f, -0.047696f, -0.056506f, + -0.067688f, -0.077997f, -0.086044f, -0.092096f, -0.095584f, -0.094704f, -0.087898f, -0.074555f, -0.055146f, -0.031374f, -0.005109f, 0.023181f, 0.053769f, 0.085647f, 0.116644f, 0.145301f, 0.171246f, 0.194304f, 0.214606f, 0.232833f, 0.249102f, 0.262412f, 0.272200f, 0.279515f, 0.285963f, 0.292502f, 0.299498f, 0.306603f, 0.312397f, 0.315556f, 0.316484f, 0.316658f, 0.316768f, 0.316676f, 0.316453f, 0.316057f, 0.314697f, 0.311795f, 0.307878f, 0.303586f, 0.298738f, 0.293100f, 0.286921f, 0.280025f, 0.271517f, 0.260915f, 0.248546f, 0.234604f, 0.218918f, 0.201792f, 0.184003f, 0.165897f, 0.147257f, 0.128036f, 0.108579f, 0.088849f, 0.067408f, 0.041787f, 0.011933f, -0.015821f, -0.031241f, -0.029810f, -0.017985f, -0.005466f}, + {0.042551f, 0.061299f, -0.028672f, -0.144580f, -0.225015f, -0.285627f, -0.304011f, -0.184177f, 0.097749f, 0.418361f, 0.636609f, 0.684969f, 0.487187f, -0.018125f, -0.625221f, -0.833372f, -0.352995f, 0.433022f, 0.798844f, 0.478184f, -0.106003f, -0.434667f, -0.441046f, -0.368821f, -0.347324f, -0.318444f, -0.244373f, -0.171635f, -0.121000f, -0.059037f, 0.023724f, 0.097010f, 0.147728f, 0.189866f, 0.225827f, 0.243381f, 0.241962f, 0.230347f, 0.209235f, 0.177802f, 0.144642f, 0.116772f, 0.090397f, 0.061815f, 0.034477f, 0.010059f, -0.014474f, -0.038175f, -0.056107f, -0.068563f, -0.080545f, -0.093619f, -0.106370f, -0.119695f, -0.134742f, -0.149473f, -0.162326f, -0.174807f, -0.187244f, -0.197268f, -0.204420f, -0.210807f, -0.216408f, -0.219069f, -0.218931f, -0.217754f, -0.214932f, -0.208841f, -0.200539f, -0.192118f, -0.183496f, -0.174075f, -0.165039f, -0.157372f, -0.150168f, -0.142655f, -0.135395f, -0.128631f, -0.122082f, -0.116426f, -0.112435f, -0.109121f, -0.105059f, -0.100419f, -0.095650f, -0.089752f, -0.081852f, -0.072848f, -0.064030f, -0.055849f, -0.048935f, -0.044367f, -0.042466f, -0.043236f, -0.047696f, -0.056506f, + -0.067688f, -0.077997f, -0.086044f, -0.092096f, -0.095584f, -0.094704f, -0.087898f, -0.074555f, -0.055146f, -0.031374f, -0.005109f, 0.023181f, 0.053769f, 0.085647f, 0.116644f, 0.145301f, 0.171246f, 0.194304f, 0.214606f, 0.232833f, 0.249102f, 0.262412f, 0.272200f, 0.279515f, 0.285963f, 0.292502f, 0.299498f, 0.306603f, 0.312397f, 0.315556f, 0.316484f, 0.316658f, 0.316768f, 0.316676f, 0.316453f, 0.316057f, 0.314697f, 0.311795f, 0.307878f, 0.303586f, 0.298738f, 0.293100f, 0.286921f, 0.280025f, 0.271517f, 0.260915f, 0.248546f, 0.234604f, 0.218918f, 0.201792f, 0.184003f, 0.165897f, 0.147257f, 0.128036f, 0.108579f, 0.088849f, 0.067408f, 0.041787f, 0.011933f, -0.015821f, -0.031241f, -0.029810f, -0.017985f, -0.005466f} + }, + { + {0.005047f, 0.021126f, 0.045009f, 0.070453f, 0.091218f, 0.079137f, -0.005705f, -0.148208f, -0.279248f, -0.366201f, -0.399292f, -0.268604f, 0.145211f, 0.646500f, 0.731126f, 0.172486f, -0.552664f, -0.733258f, -0.260523f, 0.299749f, 0.452278f, 0.272382f, 0.101891f, 0.059461f, 0.035030f, -0.031425f, -0.085084f, -0.094988f, -0.094701f, -0.101435f, -0.094303f, -0.066565f, -0.037269f, -0.017081f, -0.001454f, 0.010929f, 0.018070f, 0.023255f, 0.028455f, 0.029520f, 0.025899f, 0.023522f, 0.023990f, 0.022461f, 0.017906f, 0.014746f, 0.014269f, 0.013796f, 0.013307f, 0.015082f, 0.018457f, 0.020882f, 0.021919f, 0.021991f, 0.020056f, 0.015522f, 0.009547f, 0.002759f, -0.005372f, -0.014351f, -0.022889f, -0.031164f, -0.040159f, -0.049486f, -0.058237f, -0.066734f, -0.075464f, -0.083764f, -0.091121f, -0.098138f, -0.105200f, -0.111892f, -0.118289f, -0.125068f, -0.132105f, -0.138497f, -0.143784f, -0.147831f, -0.150121f, -0.150387f, -0.149069f, -0.146131f, -0.140481f, -0.131487f, -0.119994f, -0.107110f, -0.092969f, -0.077185f, -0.059714f, -0.041087f, -0.022428f, -0.005113f, 0.010051f, 0.022960f, 0.033330f, 0.040497f, + 0.044394f, 0.045809f, 0.045372f, 0.043155f, 0.039528f, 0.035586f, 0.032440f, 0.030494f, 0.029398f, 0.028485f, 0.027544f, 0.027340f, 0.028936f, 0.032511f, 0.037335f, 0.042789f, 0.048810f, 0.055598f, 0.063500f, 0.072809f, 0.083162f, 0.093560f, 0.103403f, 0.113024f, 0.123077f, 0.134014f, 0.146084f, 0.159017f, 0.171851f, 0.183812f, 0.195106f, 0.206245f, 0.217176f, 0.227589f, 0.237250f, 0.245546f, 0.251644f, 0.255500f, 0.257760f, 0.258677f, 0.258173f, 0.256605f, 0.254245f, 0.250550f, 0.245153f, 0.238801f, 0.232311f, 0.225757f, 0.219429f, 0.214026f, 0.209321f, 0.204392f, 0.199161f, 0.193782f, 0.187372f, 0.179378f, 0.169453f, 0.152758f, 0.120530f, 0.072470f, 0.024676f, -0.003666f, -0.009454f, -0.003869f}, + {-0.005047f, -0.021126f, -0.045009f, -0.070453f, -0.091218f, -0.079137f, 0.005705f, 0.148208f, 0.279248f, 0.366201f, 0.399292f, 0.268604f, -0.145211f, -0.646500f, -0.731126f, -0.172486f, 0.552664f, 0.733258f, 0.260523f, -0.299749f, -0.452278f, -0.272382f, -0.101891f, -0.059461f, -0.035030f, 0.031425f, 0.085084f, 0.094988f, 0.094701f, 0.101435f, 0.094303f, 0.066565f, 0.037269f, 0.017081f, 0.001454f, -0.010929f, -0.018070f, -0.023255f, -0.028455f, -0.029520f, -0.025899f, -0.023522f, -0.023990f, -0.022461f, -0.017906f, -0.014746f, -0.014269f, -0.013796f, -0.013307f, -0.015082f, -0.018457f, -0.020882f, -0.021919f, -0.021991f, -0.020056f, -0.015522f, -0.009547f, -0.002759f, 0.005372f, 0.014351f, 0.022889f, 0.031164f, 0.040159f, 0.049486f, 0.058237f, 0.066734f, 0.075464f, 0.083764f, 0.091121f, 0.098138f, 0.105200f, 0.111892f, 0.118289f, 0.125068f, 0.132105f, 0.138497f, 0.143784f, 0.147831f, 0.150121f, 0.150387f, 0.149069f, 0.146131f, 0.140481f, 0.131487f, 0.119994f, 0.107110f, 0.092969f, 0.077185f, 0.059714f, 0.041087f, 0.022428f, 0.005113f, -0.010051f, -0.022960f, -0.033330f, -0.040497f, + -0.044394f, -0.045809f, -0.045372f, -0.043155f, -0.039528f, -0.035586f, -0.032440f, -0.030494f, -0.029398f, -0.028485f, -0.027544f, -0.027340f, -0.028936f, -0.032511f, -0.037335f, -0.042789f, -0.048810f, -0.055598f, -0.063500f, -0.072809f, -0.083162f, -0.093560f, -0.103403f, -0.113024f, -0.123077f, -0.134014f, -0.146084f, -0.159017f, -0.171851f, -0.183812f, -0.195106f, -0.206245f, -0.217176f, -0.227589f, -0.237250f, -0.245546f, -0.251644f, -0.255500f, -0.257760f, -0.258677f, -0.258173f, -0.256605f, -0.254245f, -0.250550f, -0.245153f, -0.238801f, -0.232311f, -0.225757f, -0.219429f, -0.214026f, -0.209321f, -0.204392f, -0.199161f, -0.193782f, -0.187372f, -0.179378f, -0.169453f, -0.152758f, -0.120530f, -0.072470f, -0.024676f, 0.003666f, 0.009454f, 0.003869f} + }, + { + {0.003264f, 0.004318f, -0.005829f, -0.024893f, -0.041105f, -0.025902f, 0.043471f, 0.128408f, 0.134001f, 0.021030f, -0.114589f, -0.139872f, -0.049571f, 0.037102f, 0.041588f, 0.008422f, 0.005052f, 0.019837f, 0.006847f, -0.026552f, -0.037371f, -0.021147f, -0.012506f, -0.023997f, -0.030666f, -0.014881f, 0.008946f, 0.019948f, 0.015955f, 0.005594f, -0.007241f, -0.022512f, -0.037468f, -0.047732f, -0.050991f, -0.047280f, -0.038592f, -0.028517f, -0.019426f, -0.010194f, 0.001263f, 0.014159f, 0.025520f, 0.033481f, 0.038027f, 0.039692f, 0.039526f, 0.039623f, 0.042009f, 0.047181f, 0.054431f, 0.062973f, 0.072033f, 0.080590f, 0.087853f, 0.093716f, 0.098363f, 0.101802f, 0.104025f, 0.105212f, 0.105518f, 0.104869f, 0.103123f, 0.100365f, 0.097014f, 0.093624f, 0.090496f, 0.087654f, 0.085314f, 0.084000f, 0.083899f, 0.084586f, 0.085875f, 0.088367f, 0.092576f, 0.098106f, 0.104335f, 0.111281f, 0.119002f, 0.126690f, 0.133135f, 0.137682f, 0.140158f, 0.140242f, 0.137283f, 0.130334f, 0.118340f, 0.100873f, 0.078543f, 0.051954f, 0.020504f, -0.016782f, -0.059370f, -0.105077f, -0.151633f, -0.197526f, + -0.241483f, -0.281925f, -0.316997f, -0.344975f, -0.365154f, -0.378455f, -0.386389f, -0.389309f, -0.386608f, -0.378830f, -0.368544f, -0.358689f, -0.350553f, -0.343331f, -0.335103f, -0.324515f, -0.312129f, -0.299944f, -0.289316f, -0.279871f, -0.270574f, -0.260978f, -0.251183f, -0.241549f, -0.232707f, -0.224985f, -0.217706f, -0.209798f, -0.200910f, -0.191257f, -0.180862f, -0.169770f, -0.158385f, -0.146895f, -0.135062f, -0.123099f, -0.111787f, -0.101401f, -0.091527f, -0.082057f, -0.073151f, -0.064454f, -0.055670f, -0.047503f, -0.040626f, -0.034415f, -0.027978f, -0.021363f, -0.014489f, -0.006443f, 0.002867f, 0.012203f, 0.021232f, 0.031102f, 0.042272f, 0.054913f, 0.071608f, 0.094348f, 0.116599f, 0.123809f, 0.106728f, 0.072105f, 0.036517f, 0.010336f}, + {-0.003264f, -0.004318f, 0.005829f, 0.024893f, 0.041105f, 0.025902f, -0.043471f, -0.128408f, -0.134001f, -0.021030f, 0.114589f, 0.139872f, 0.049571f, -0.037102f, -0.041588f, -0.008422f, -0.005052f, -0.019837f, -0.006847f, 0.026552f, 0.037371f, 0.021147f, 0.012506f, 0.023997f, 0.030666f, 0.014881f, -0.008946f, -0.019948f, -0.015955f, -0.005594f, 0.007241f, 0.022512f, 0.037468f, 0.047732f, 0.050991f, 0.047280f, 0.038592f, 0.028517f, 0.019426f, 0.010194f, -0.001263f, -0.014159f, -0.025520f, -0.033481f, -0.038027f, -0.039692f, -0.039526f, -0.039623f, -0.042009f, -0.047181f, -0.054431f, -0.062973f, -0.072033f, -0.080590f, -0.087853f, -0.093716f, -0.098363f, -0.101802f, -0.104025f, -0.105212f, -0.105518f, -0.104869f, -0.103123f, -0.100365f, -0.097014f, -0.093624f, -0.090496f, -0.087654f, -0.085314f, -0.084000f, -0.083899f, -0.084586f, -0.085875f, -0.088367f, -0.092576f, -0.098106f, -0.104335f, -0.111281f, -0.119002f, -0.126690f, -0.133135f, -0.137682f, -0.140158f, -0.140242f, -0.137283f, -0.130334f, -0.118340f, -0.100873f, -0.078543f, -0.051954f, -0.020504f, 0.016782f, 0.059370f, 0.105077f, 0.151633f, 0.197526f, + 0.241483f, 0.281925f, 0.316997f, 0.344975f, 0.365154f, 0.378455f, 0.386389f, 0.389309f, 0.386608f, 0.378830f, 0.368544f, 0.358689f, 0.350553f, 0.343331f, 0.335103f, 0.324515f, 0.312129f, 0.299944f, 0.289316f, 0.279871f, 0.270574f, 0.260978f, 0.251183f, 0.241549f, 0.232707f, 0.224985f, 0.217706f, 0.209798f, 0.200910f, 0.191257f, 0.180862f, 0.169770f, 0.158385f, 0.146895f, 0.135062f, 0.123099f, 0.111787f, 0.101401f, 0.091527f, 0.082057f, 0.073151f, 0.064454f, 0.055670f, 0.047503f, 0.040626f, 0.034415f, 0.027978f, 0.021363f, 0.014489f, 0.006443f, -0.002867f, -0.012203f, -0.021232f, -0.031102f, -0.042272f, -0.054913f, -0.071608f, -0.094348f, -0.116599f, -0.123809f, -0.106728f, -0.072105f, -0.036517f, -0.010336f} + }, + { + {0.011217f, 0.032990f, 0.036897f, 0.010621f, -0.001993f, 0.049544f, 0.112830f, 0.056133f, -0.160339f, -0.385630f, -0.392350f, -0.095349f, 0.328404f, 0.542847f, 0.344208f, -0.105590f, -0.399358f, -0.300598f, 0.018016f, 0.214090f, 0.169827f, 0.038946f, -0.027942f, -0.041781f, -0.059684f, -0.065038f, -0.024287f, 0.032375f, 0.055196f, 0.048115f, 0.048570f, 0.069300f, 0.097432f, 0.125436f, 0.152243f, 0.169511f, 0.168791f, 0.153482f, 0.132068f, 0.107982f, 0.082397f, 0.058065f, 0.035645f, 0.012912f, -0.010363f, -0.032150f, -0.052509f, -0.073090f, -0.093478f, -0.112421f, -0.130887f, -0.150015f, -0.167940f, -0.181658f, -0.190093f, -0.193280f, -0.190900f, -0.183505f, -0.172998f, -0.160425f, -0.144966f, -0.125766f, -0.102989f, -0.076649f, -0.046121f, -0.011292f, 0.026894f, 0.067039f, 0.107592f, 0.146900f, 0.183708f, 0.217201f, 0.246116f, 0.268588f, 0.283453f, 0.290932f, 0.291460f, 0.284592f, 0.269758f, 0.247580f, 0.219717f, 0.187538f, 0.151436f, 0.111504f, 0.068474f, 0.023637f, -0.022098f, -0.068620f, -0.115935f, -0.163543f, -0.210736f, -0.256901f, -0.300916f, -0.340700f, -0.374071f, -0.399767f, + -0.417035f, -0.424614f, -0.421054f, -0.406173f, -0.381691f, -0.350278f, -0.314081f, -0.274012f, -0.230338f, -0.184210f, -0.138589f, -0.097123f, -0.061885f, -0.032563f, -0.007863f, 0.012882f, 0.029569f, 0.041935f, 0.049803f, 0.053141f, 0.052307f, 0.048088f, 0.041442f, 0.033372f, 0.024841f, 0.016293f, 0.007207f, -0.003502f, -0.016548f, -0.031791f, -0.048410f, -0.065287f, -0.081508f, -0.096823f, -0.111564f, -0.125991f, -0.139856f, -0.152551f, -0.163405f, -0.171901f, -0.177907f, -0.181647f, -0.183211f, -0.182296f, -0.178654f, -0.172490f, -0.164191f, -0.154059f, -0.142478f, -0.129944f, -0.116760f, -0.103091f, -0.089272f, -0.075716f, -0.062663f, -0.050022f, -0.036539f, -0.019395f, 0.002713f, 0.024763f, 0.036870f, 0.033747f, 0.020633f, 0.006443f}, + {-0.011217f, -0.032990f, -0.036897f, -0.010621f, 0.001993f, -0.049544f, -0.112830f, -0.056133f, 0.160339f, 0.385630f, 0.392350f, 0.095349f, -0.328404f, -0.542847f, -0.344208f, 0.105590f, 0.399358f, 0.300598f, -0.018016f, -0.214090f, -0.169827f, -0.038946f, 0.027942f, 0.041781f, 0.059684f, 0.065038f, 0.024287f, -0.032375f, -0.055196f, -0.048115f, -0.048570f, -0.069300f, -0.097432f, -0.125436f, -0.152243f, -0.169511f, -0.168791f, -0.153482f, -0.132068f, -0.107982f, -0.082397f, -0.058065f, -0.035645f, -0.012912f, 0.010363f, 0.032150f, 0.052509f, 0.073090f, 0.093478f, 0.112421f, 0.130887f, 0.150015f, 0.167940f, 0.181658f, 0.190093f, 0.193280f, 0.190900f, 0.183505f, 0.172998f, 0.160425f, 0.144966f, 0.125766f, 0.102989f, 0.076649f, 0.046121f, 0.011292f, -0.026894f, -0.067039f, -0.107592f, -0.146900f, -0.183708f, -0.217201f, -0.246116f, -0.268588f, -0.283453f, -0.290932f, -0.291460f, -0.284592f, -0.269758f, -0.247580f, -0.219717f, -0.187538f, -0.151436f, -0.111504f, -0.068474f, -0.023637f, 0.022098f, 0.068620f, 0.115935f, 0.163543f, 0.210736f, 0.256901f, 0.300916f, 0.340700f, 0.374071f, 0.399767f, + 0.417035f, 0.424614f, 0.421054f, 0.406173f, 0.381691f, 0.350278f, 0.314081f, 0.274012f, 0.230338f, 0.184210f, 0.138589f, 0.097123f, 0.061885f, 0.032563f, 0.007863f, -0.012882f, -0.029569f, -0.041935f, -0.049803f, -0.053141f, -0.052307f, -0.048088f, -0.041442f, -0.033372f, -0.024841f, -0.016293f, -0.007207f, 0.003502f, 0.016548f, 0.031791f, 0.048410f, 0.065287f, 0.081508f, 0.096823f, 0.111564f, 0.125991f, 0.139856f, 0.152551f, 0.163405f, 0.171901f, 0.177907f, 0.181647f, 0.183211f, 0.182296f, 0.178654f, 0.172490f, 0.164191f, 0.154059f, 0.142478f, 0.129944f, 0.116760f, 0.103091f, 0.089272f, 0.075716f, 0.062663f, 0.050022f, 0.036539f, 0.019395f, -0.002713f, -0.024763f, -0.036870f, -0.033747f, -0.020633f, -0.006443f} + }, + { + {0.000083f, 0.005036f, 0.018377f, 0.032102f, 0.033143f, 0.014136f, -0.022619f, -0.065291f, -0.089673f, -0.066050f, 0.009591f, 0.089794f, 0.106985f, 0.045740f, -0.034502f, -0.065255f, -0.039897f, 0.000078f, 0.028484f, 0.051608f, 0.072366f, 0.075587f, 0.055795f, 0.030842f, 0.015327f, 0.000007f, -0.029864f, -0.069463f, -0.099077f, -0.105101f, -0.088131f, -0.057540f, -0.025793f, -0.003611f, 0.006114f, 0.009267f, 0.013559f, 0.021781f, 0.031617f, 0.039206f, 0.042208f, 0.041252f, 0.038988f, 0.037309f, 0.036122f, 0.034790f, 0.033050f, 0.030156f, 0.024935f, 0.017196f, 0.007780f, -0.002812f, -0.014616f, -0.027403f, -0.040792f, -0.054583f, -0.068097f, -0.080003f, -0.089434f, -0.096351f, -0.100606f, -0.101910f, -0.100671f, -0.097487f, -0.092005f, -0.083641f, -0.072770f, -0.059711f, -0.043405f, -0.022639f, 0.002276f, 0.030372f, 0.061335f, 0.094600f, 0.128377f, 0.160824f, 0.191129f, 0.218597f, 0.241992f, 0.260549f, 0.274515f, 0.284048f, 0.288459f, 0.286928f, 0.279376f, 0.266510f, 0.249197f, 0.227462f, 0.200216f, 0.166835f, 0.128828f, 0.088822f, 0.048134f, 0.006659f, -0.035128f, -0.075405f, + -0.111911f, -0.142566f, -0.165901f, -0.182096f, -0.192944f, -0.199789f, -0.202049f, -0.198236f, -0.187646f, -0.171039f, -0.150806f, -0.130229f, -0.111175f, -0.092669f, -0.072879f, -0.051877f, -0.031403f, -0.013020f, 0.002318f, 0.014147f, 0.023189f, 0.030986f, 0.037985f, 0.043116f, 0.045482f, 0.044959f, 0.041243f, 0.034134f, 0.024551f, 0.013580f, 0.001006f, -0.013772f, -0.030379f, -0.048389f, -0.068202f, -0.089706f, -0.111625f, -0.133172f, -0.154629f, -0.175780f, -0.195743f, -0.214472f, -0.232333f, -0.248520f, -0.261904f, -0.272627f, -0.280980f, -0.286143f, -0.287719f, -0.286566f, -0.282756f, -0.275181f, -0.263986f, -0.250601f, -0.235353f, -0.217748f, -0.196795f, -0.167237f, -0.121073f, -0.061155f, -0.008179f, 0.017190f, 0.016197f, 0.005515f}, + {0.000083f, 0.005036f, 0.018377f, 0.032102f, 0.033143f, 0.014136f, -0.022619f, -0.065291f, -0.089673f, -0.066050f, 0.009591f, 0.089794f, 0.106985f, 0.045740f, -0.034502f, -0.065255f, -0.039897f, 0.000078f, 0.028484f, 0.051608f, 0.072366f, 0.075587f, 0.055795f, 0.030842f, 0.015327f, 0.000007f, -0.029864f, -0.069463f, -0.099077f, -0.105101f, -0.088131f, -0.057540f, -0.025793f, -0.003611f, 0.006114f, 0.009267f, 0.013559f, 0.021781f, 0.031617f, 0.039206f, 0.042208f, 0.041252f, 0.038988f, 0.037309f, 0.036122f, 0.034790f, 0.033050f, 0.030156f, 0.024935f, 0.017196f, 0.007780f, -0.002812f, -0.014616f, -0.027403f, -0.040792f, -0.054583f, -0.068097f, -0.080003f, -0.089434f, -0.096351f, -0.100606f, -0.101910f, -0.100671f, -0.097487f, -0.092005f, -0.083641f, -0.072770f, -0.059711f, -0.043405f, -0.022639f, 0.002276f, 0.030372f, 0.061335f, 0.094600f, 0.128377f, 0.160824f, 0.191129f, 0.218597f, 0.241992f, 0.260549f, 0.274515f, 0.284048f, 0.288459f, 0.286928f, 0.279376f, 0.266510f, 0.249197f, 0.227462f, 0.200216f, 0.166835f, 0.128828f, 0.088822f, 0.048134f, 0.006659f, -0.035128f, -0.075405f, + -0.111911f, -0.142566f, -0.165901f, -0.182096f, -0.192944f, -0.199789f, -0.202049f, -0.198236f, -0.187646f, -0.171039f, -0.150806f, -0.130229f, -0.111175f, -0.092669f, -0.072879f, -0.051877f, -0.031403f, -0.013020f, 0.002318f, 0.014147f, 0.023189f, 0.030986f, 0.037985f, 0.043116f, 0.045482f, 0.044959f, 0.041243f, 0.034134f, 0.024551f, 0.013580f, 0.001006f, -0.013772f, -0.030379f, -0.048389f, -0.068202f, -0.089706f, -0.111625f, -0.133172f, -0.154629f, -0.175780f, -0.195743f, -0.214472f, -0.232333f, -0.248520f, -0.261904f, -0.272627f, -0.280980f, -0.286143f, -0.287719f, -0.286566f, -0.282756f, -0.275181f, -0.263986f, -0.250601f, -0.235353f, -0.217748f, -0.196795f, -0.167237f, -0.121073f, -0.061155f, -0.008179f, 0.017190f, 0.016197f, 0.005515f} + }, + { + {0.003277f, 0.020620f, 0.046924f, 0.053396f, 0.027529f, -0.018184f, -0.075068f, -0.129965f, -0.134034f, -0.041093f, 0.107597f, 0.192042f, 0.138507f, 0.002361f, -0.097386f, -0.097716f, -0.027837f, 0.041165f, 0.055356f, 0.009000f, -0.053914f, -0.075455f, -0.037025f, 0.027229f, 0.073147f, 0.088050f, 0.084707f, 0.074263f, 0.059879f, 0.044753f, 0.030913f, 0.014584f, -0.007652f, -0.031648f, -0.050796f, -0.064274f, -0.075002f, -0.083080f, -0.086106f, -0.083894f, -0.079273f, -0.075317f, -0.073762f, -0.075115f, -0.078933f, -0.084283f, -0.090103f, -0.094754f, -0.095967f, -0.092275f, -0.084148f, -0.073198f, -0.060975f, -0.049003f, -0.038889f, -0.031415f, -0.026007f, -0.021619f, -0.017630f, -0.013612f, -0.008806f, -0.002247f, 0.006927f, 0.019339f, 0.035096f, 0.053529f, 0.073490f, 0.093872f, 0.113559f, 0.131158f, 0.145463f, 0.156306f, 0.164334f, 0.169750f, 0.171955f, 0.170864f, 0.167779f, 0.164008f, 0.159174f, 0.152172f, 0.143633f, 0.135949f, 0.130577f, 0.126799f, 0.123854f, 0.122887f, 0.125529f, 0.131183f, 0.136998f, 0.140478f, 0.141438f, 0.141364f, 0.141457f, 0.141528f, 0.140550f, 0.137820f, + 0.133341f, 0.127425f, 0.120598f, 0.113838f, 0.108067f, 0.102944f, 0.096659f, 0.087377f, 0.074639f, 0.059155f, 0.041597f, 0.021904f, -0.000390f, -0.025326f, -0.052050f, -0.079280f, -0.106273f, -0.133120f, -0.160007f, -0.186459f, -0.211358f, -0.233392f, -0.251545f, -0.265595f, -0.276202f, -0.284154f, -0.289485f, -0.291522f, -0.289603f, -0.283599f, -0.274102f, -0.262440f, -0.250053f, -0.237377f, -0.223517f, -0.207267f, -0.188278f, -0.167320f, -0.145844f, -0.125284f, -0.106307f, -0.088608f, -0.071476f, -0.054349f, -0.036881f, -0.019173f, -0.002062f, 0.013514f, 0.027449f, 0.039974f, 0.050573f, 0.058579f, 0.064464f, 0.069138f, 0.072610f, 0.074870f, 0.076796f, 0.077682f, 0.073281f, 0.059949f, 0.040437f, 0.022196f, 0.009962f, 0.002764f}, + {0.003277f, 0.020620f, 0.046924f, 0.053396f, 0.027529f, -0.018184f, -0.075068f, -0.129965f, -0.134034f, -0.041093f, 0.107597f, 0.192042f, 0.138507f, 0.002361f, -0.097386f, -0.097716f, -0.027837f, 0.041165f, 0.055356f, 0.009000f, -0.053914f, -0.075455f, -0.037025f, 0.027229f, 0.073147f, 0.088050f, 0.084707f, 0.074263f, 0.059879f, 0.044753f, 0.030913f, 0.014584f, -0.007652f, -0.031648f, -0.050796f, -0.064274f, -0.075002f, -0.083080f, -0.086106f, -0.083894f, -0.079273f, -0.075317f, -0.073762f, -0.075115f, -0.078933f, -0.084283f, -0.090103f, -0.094754f, -0.095967f, -0.092275f, -0.084148f, -0.073198f, -0.060975f, -0.049003f, -0.038889f, -0.031415f, -0.026007f, -0.021619f, -0.017630f, -0.013612f, -0.008806f, -0.002247f, 0.006927f, 0.019339f, 0.035096f, 0.053529f, 0.073490f, 0.093872f, 0.113559f, 0.131158f, 0.145463f, 0.156306f, 0.164334f, 0.169750f, 0.171955f, 0.170864f, 0.167779f, 0.164008f, 0.159174f, 0.152172f, 0.143633f, 0.135949f, 0.130577f, 0.126799f, 0.123854f, 0.122887f, 0.125529f, 0.131183f, 0.136998f, 0.140478f, 0.141438f, 0.141364f, 0.141457f, 0.141528f, 0.140550f, 0.137820f, + 0.133341f, 0.127425f, 0.120598f, 0.113838f, 0.108067f, 0.102944f, 0.096659f, 0.087377f, 0.074639f, 0.059155f, 0.041597f, 0.021904f, -0.000390f, -0.025326f, -0.052050f, -0.079280f, -0.106273f, -0.133120f, -0.160007f, -0.186459f, -0.211358f, -0.233392f, -0.251545f, -0.265595f, -0.276202f, -0.284154f, -0.289485f, -0.291522f, -0.289603f, -0.283599f, -0.274102f, -0.262440f, -0.250053f, -0.237377f, -0.223517f, -0.207267f, -0.188278f, -0.167320f, -0.145844f, -0.125284f, -0.106307f, -0.088608f, -0.071476f, -0.054349f, -0.036881f, -0.019173f, -0.002062f, 0.013514f, 0.027449f, 0.039974f, 0.050573f, 0.058579f, 0.064464f, 0.069138f, 0.072610f, 0.074870f, 0.076796f, 0.077682f, 0.073281f, 0.059949f, 0.040437f, 0.022196f, 0.009962f, 0.002764f} + }, + { + {-0.008293f, -0.013970f, -0.006751f, -0.004194f, -0.000967f, 0.027228f, 0.059778f, 0.022682f, -0.106073f, -0.214108f, -0.153498f, 0.064143f, 0.238226f, 0.193438f, -0.014455f, -0.165780f, -0.132467f, 0.001700f, 0.083408f, 0.077007f, 0.060090f, 0.082445f, 0.105818f, 0.080684f, 0.018380f, -0.037842f, -0.074236f, -0.108541f, -0.150869f, -0.190041f, -0.211970f, -0.212547f, -0.194180f, -0.162258f, -0.125194f, -0.090440f, -0.060047f, -0.033077f, -0.010004f, 0.007878f, 0.020452f, 0.027724f, 0.029258f, 0.026432f, 0.022993f, 0.022085f, 0.024478f, 0.029976f, 0.038329f, 0.048433f, 0.058546f, 0.067656f, 0.075393f, 0.080877f, 0.082981f, 0.081487f, 0.077061f, 0.070494f, 0.062643f, 0.054653f, 0.047646f, 0.042468f, 0.039796f, 0.040085f, 0.043440f, 0.049885f, 0.059496f, 0.072069f, 0.087127f, 0.104428f, 0.123856f, 0.144734f, 0.165869f, 0.186238f, 0.205023f, 0.221226f, 0.233959f, 0.242827f, 0.247601f, 0.248219f, 0.245523f, 0.240985f, 0.235213f, 0.227742f, 0.218596f, 0.208683f, 0.198442f, 0.187753f, 0.177376f, 0.168395f, 0.159521f, 0.146885f, 0.127542f, 0.101864f, 0.071685f, 0.037282f, + -0.002911f, -0.050169f, -0.103604f, -0.160216f, -0.216687f, -0.271079f, -0.322554f, -0.369840f, -0.410986f, -0.444781f, -0.471531f, -0.492157f, -0.506979f, -0.515336f, -0.516033f, -0.508542f, -0.494176f, -0.475536f, -0.454382f, -0.430583f, -0.403314f, -0.372531f, -0.339168f, -0.304785f, -0.271079f, -0.238824f, -0.207195f, -0.174785f, -0.141074f, -0.106436f, -0.071329f, -0.036073f, -0.000775f, 0.034934f, 0.071321f, 0.107583f, 0.142393f, 0.175297f, 0.206552f, 0.236016f, 0.263322f, 0.288426f, 0.310739f, 0.328664f, 0.341198f, 0.348940f, 0.352697f, 0.352598f, 0.349143f, 0.343169f, 0.334326f, 0.321627f, 0.305401f, 0.286727f, 0.265938f, 0.243372f, 0.218307f, 0.184517f, 0.133522f, 0.069279f, 0.013554f, -0.013422f, -0.013865f, -0.004732f}, + {-0.008293f, -0.013970f, -0.006751f, -0.004194f, -0.000967f, 0.027228f, 0.059778f, 0.022682f, -0.106073f, -0.214108f, -0.153498f, 0.064143f, 0.238226f, 0.193438f, -0.014455f, -0.165780f, -0.132467f, 0.001700f, 0.083408f, 0.077007f, 0.060090f, 0.082445f, 0.105818f, 0.080684f, 0.018380f, -0.037842f, -0.074236f, -0.108541f, -0.150869f, -0.190041f, -0.211970f, -0.212547f, -0.194180f, -0.162258f, -0.125194f, -0.090440f, -0.060047f, -0.033077f, -0.010004f, 0.007878f, 0.020452f, 0.027724f, 0.029258f, 0.026432f, 0.022993f, 0.022085f, 0.024478f, 0.029976f, 0.038329f, 0.048433f, 0.058546f, 0.067656f, 0.075393f, 0.080877f, 0.082981f, 0.081487f, 0.077061f, 0.070494f, 0.062643f, 0.054653f, 0.047646f, 0.042468f, 0.039796f, 0.040085f, 0.043440f, 0.049885f, 0.059496f, 0.072069f, 0.087127f, 0.104428f, 0.123856f, 0.144734f, 0.165869f, 0.186238f, 0.205023f, 0.221226f, 0.233959f, 0.242827f, 0.247601f, 0.248219f, 0.245523f, 0.240985f, 0.235213f, 0.227742f, 0.218596f, 0.208683f, 0.198442f, 0.187753f, 0.177376f, 0.168395f, 0.159521f, 0.146885f, 0.127542f, 0.101864f, 0.071685f, 0.037282f, + -0.002911f, -0.050169f, -0.103604f, -0.160216f, -0.216687f, -0.271079f, -0.322554f, -0.369840f, -0.410986f, -0.444781f, -0.471531f, -0.492157f, -0.506979f, -0.515336f, -0.516033f, -0.508542f, -0.494176f, -0.475536f, -0.454382f, -0.430583f, -0.403314f, -0.372531f, -0.339168f, -0.304785f, -0.271079f, -0.238824f, -0.207195f, -0.174785f, -0.141074f, -0.106436f, -0.071329f, -0.036073f, -0.000775f, 0.034934f, 0.071321f, 0.107583f, 0.142393f, 0.175297f, 0.206552f, 0.236016f, 0.263322f, 0.288426f, 0.310739f, 0.328664f, 0.341198f, 0.348940f, 0.352697f, 0.352598f, 0.349143f, 0.343169f, 0.334326f, 0.321627f, 0.305401f, 0.286727f, 0.265938f, 0.243372f, 0.218307f, 0.184517f, 0.133522f, 0.069279f, 0.013554f, -0.013422f, -0.013865f, -0.004732f} + }, + { + {0.000177f, 0.000226f, -0.000534f, -0.002844f, -0.006900f, -0.008636f, -0.000913f, 0.012312f, 0.007372f, -0.030503f, -0.063506f, -0.022827f, 0.091931f, 0.166548f, 0.089015f, -0.090455f, -0.187289f, -0.097089f, 0.077605f, 0.157235f, 0.092127f, -0.016472f, -0.065347f, -0.047160f, -0.006944f, 0.028956f, 0.056051f, 0.066667f, 0.053772f, 0.024836f, -0.006025f, -0.031877f, -0.051501f, -0.064067f, -0.072308f, -0.083529f, -0.101732f, -0.122988f, -0.140854f, -0.151866f, -0.154661f, -0.148621f, -0.135381f, -0.118751f, -0.102023f, -0.086997f, -0.075122f, -0.067345f, -0.063027f, -0.060678f, -0.059457f, -0.058879f, -0.057880f, -0.055382f, -0.051316f, -0.046358f, -0.041263f, -0.036901f, -0.034150f, -0.033230f, -0.033646f, -0.034904f, -0.036618f, -0.037981f, -0.037996f, -0.036359f, -0.033414f, -0.029270f, -0.023673f, -0.016686f, -0.008707f, 0.000153f, 0.009974f, 0.020300f, 0.030277f, 0.039653f, 0.048922f, 0.058264f, 0.067028f, 0.074752f, 0.082196f, 0.090675f, 0.100423f, 0.110252f, 0.119144f, 0.127625f, 0.136849f, 0.146460f, 0.154233f, 0.158150f, 0.158200f, 0.155698f, 0.151413f, 0.145018f, 0.136153f, 0.125516f, + 0.114815f, 0.105682f, 0.098486f, 0.092374f, 0.086804f, 0.082876f, 0.082667f, 0.087334f, 0.096215f, 0.107481f, 0.119244f, 0.130421f, 0.141184f, 0.152404f, 0.164286f, 0.175808f, 0.185694f, 0.193429f, 0.199183f, 0.203422f, 0.206875f, 0.210212f, 0.213414f, 0.215952f, 0.217594f, 0.218544f, 0.218872f, 0.218422f, 0.217083f, 0.214671f, 0.210839f, 0.205624f, 0.199681f, 0.193644f, 0.187770f, 0.182378f, 0.177914f, 0.174397f, 0.171558f, 0.169503f, 0.168445f, 0.167984f, 0.167536f, 0.167028f, 0.166265f, 0.164275f, 0.160229f, 0.154156f, 0.145927f, 0.134776f, 0.120686f, 0.104691f, 0.087066f, 0.067093f, 0.045071f, 0.021659f, -0.005316f, -0.038739f, -0.073888f, -0.096316f, -0.093511f, -0.068230f, -0.036309f, -0.010540f}, + {0.000177f, 0.000226f, -0.000534f, -0.002844f, -0.006900f, -0.008636f, -0.000913f, 0.012312f, 0.007372f, -0.030503f, -0.063506f, -0.022827f, 0.091931f, 0.166548f, 0.089015f, -0.090455f, -0.187289f, -0.097089f, 0.077605f, 0.157235f, 0.092127f, -0.016472f, -0.065347f, -0.047160f, -0.006944f, 0.028956f, 0.056051f, 0.066667f, 0.053772f, 0.024836f, -0.006025f, -0.031877f, -0.051501f, -0.064067f, -0.072308f, -0.083529f, -0.101732f, -0.122988f, -0.140854f, -0.151866f, -0.154661f, -0.148621f, -0.135381f, -0.118751f, -0.102023f, -0.086997f, -0.075122f, -0.067345f, -0.063027f, -0.060678f, -0.059457f, -0.058879f, -0.057880f, -0.055382f, -0.051316f, -0.046358f, -0.041263f, -0.036901f, -0.034150f, -0.033230f, -0.033646f, -0.034904f, -0.036618f, -0.037981f, -0.037996f, -0.036359f, -0.033414f, -0.029270f, -0.023673f, -0.016686f, -0.008707f, 0.000153f, 0.009974f, 0.020300f, 0.030277f, 0.039653f, 0.048922f, 0.058264f, 0.067028f, 0.074752f, 0.082196f, 0.090675f, 0.100423f, 0.110252f, 0.119144f, 0.127625f, 0.136849f, 0.146460f, 0.154233f, 0.158150f, 0.158200f, 0.155698f, 0.151413f, 0.145018f, 0.136153f, 0.125516f, + 0.114815f, 0.105682f, 0.098486f, 0.092374f, 0.086804f, 0.082876f, 0.082667f, 0.087334f, 0.096215f, 0.107481f, 0.119244f, 0.130421f, 0.141184f, 0.152404f, 0.164286f, 0.175808f, 0.185694f, 0.193429f, 0.199183f, 0.203422f, 0.206875f, 0.210212f, 0.213414f, 0.215952f, 0.217594f, 0.218544f, 0.218872f, 0.218422f, 0.217083f, 0.214671f, 0.210839f, 0.205624f, 0.199681f, 0.193644f, 0.187770f, 0.182378f, 0.177914f, 0.174397f, 0.171558f, 0.169503f, 0.168445f, 0.167984f, 0.167536f, 0.167028f, 0.166265f, 0.164275f, 0.160229f, 0.154156f, 0.145927f, 0.134776f, 0.120686f, 0.104691f, 0.087066f, 0.067093f, 0.045071f, 0.021659f, -0.005316f, -0.038739f, -0.073888f, -0.096316f, -0.093511f, -0.068230f, -0.036309f, -0.010540f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; + +/* Sample Rate = 16000 */ + +const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz = 1; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]={{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1} }; +const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; +const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]={{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}},{{80},{80}}}; +const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; +const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; +const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]={ + { + { 0.883857f, 0.733415f, 0.488407f, 0.219765f, -0.019522f, -0.206727f, -0.355857f, -0.497398f, -0.626479f, -0.691928f, -0.658239f, -0.535571f, -0.319712f, 0.011730f, 0.358242f, 0.451741f, 0.134258f, -0.340096f, -0.484683f, -0.125786f, 0.390069f, 0.611189f, 0.450608f, 0.138633f, -0.137573f, -0.370128f, -0.584446f, -0.746152f, -0.830104f, -0.865577f, -0.882556f, -0.877705f, -0.846732f, -0.803300f, -0.757904f, -0.709171f, -0.657369f, -0.606374f, -0.556373f, -0.507104f, -0.460955f, -0.416905f, -0.371212f, -0.325363f, -0.282989f, -0.241932f, -0.199475f, -0.158957f, -0.122405f, -0.085805f, -0.048176f, -0.013848f, 0.017815f, 0.051603f, 0.085261f, 0.113579f, 0.139998f, 0.169326f, 0.196673f, 0.218159f, 0.240616f, 0.267320f, 0.290455f, 0.308757f, 0.331756f, 0.358830f, 0.379533f, 0.397779f, 0.425526f, 0.455662f, 0.476389f, 0.501029f, 0.542486f, 0.581357f, 0.609875f, 0.668286f, 0.765750f, 0.813077f, 0.736556f, 0.621909f}, + { 0.883857f, 0.733415f, 0.488407f, 0.219765f, -0.019522f, -0.206727f, -0.355857f, -0.497398f, -0.626479f, -0.691928f, -0.658239f, -0.535571f, -0.319712f, 0.011730f, 0.358242f, 0.451741f, 0.134258f, -0.340096f, -0.484683f, -0.125786f, 0.390069f, 0.611189f, 0.450608f, 0.138633f, -0.137573f, -0.370128f, -0.584446f, -0.746152f, -0.830104f, -0.865577f, -0.882556f, -0.877705f, -0.846732f, -0.803300f, -0.757904f, -0.709171f, -0.657369f, -0.606374f, -0.556373f, -0.507104f, -0.460955f, -0.416905f, -0.371212f, -0.325363f, -0.282989f, -0.241932f, -0.199475f, -0.158957f, -0.122405f, -0.085805f, -0.048176f, -0.013848f, 0.017815f, 0.051603f, 0.085261f, 0.113579f, 0.139998f, 0.169326f, 0.196673f, 0.218159f, 0.240616f, 0.267320f, 0.290455f, 0.308757f, 0.331756f, 0.358830f, 0.379533f, 0.397779f, 0.425526f, 0.455662f, 0.476389f, 0.501029f, 0.542486f, 0.581357f, 0.609875f, 0.668286f, 0.765750f, 0.813077f, 0.736556f, 0.621909f} + }, + { + { -0.027320f, 0.203042f, 0.560441f, 0.855080f, 0.913923f, 0.695595f, 0.275320f, -0.242317f, -0.734864f, -1.060751f, -1.161327f, -1.101927f, -0.890150f, -0.379506f, 0.403667f, 0.941418f, 0.637872f, -0.349883f, -1.070253f, -0.802884f, 0.138395f, 0.872965f, 0.973380f, 0.700130f, 0.411920f, 0.163851f, -0.106361f, -0.348889f, -0.492759f, -0.572846f, -0.652509f, -0.726343f, -0.765973f, -0.782601f, -0.797805f, -0.807837f, -0.804710f, -0.793867f, -0.778506f, -0.754424f, -0.722406f, -0.686425f, -0.645124f, -0.597900f, -0.549560f, -0.501709f, -0.451184f, -0.399036f, -0.349319f, -0.301514f, -0.254382f, -0.210559f, -0.169586f, -0.126625f, -0.082489f, -0.042121f, -0.003063f, 0.039580f, 0.081194f, 0.116558f, 0.151377f, 0.189529f, 0.223338f, 0.250399f, 0.280134f, 0.312833f, 0.337748f, 0.358162f, 0.386893f, 0.417232f, 0.436207f, 0.457643f, 0.496886f, 0.534086f, 0.559077f, 0.615495f, 0.720955f, 0.788091f, 0.733920f, 0.633048f}, + { 0.027320f, -0.203042f, -0.560441f, -0.855080f, -0.913923f, -0.695595f, -0.275320f, 0.242317f, 0.734864f, 1.060751f, 1.161327f, 1.101927f, 0.890150f, 0.379506f, -0.403667f, -0.941418f, -0.637872f, 0.349883f, 1.070253f, 0.802884f, -0.138395f, -0.872965f, -0.973380f, -0.700130f, -0.411920f, -0.163851f, 0.106361f, 0.348889f, 0.492759f, 0.572846f, 0.652509f, 0.726343f, 0.765973f, 0.782601f, 0.797805f, 0.807837f, 0.804710f, 0.793867f, 0.778506f, 0.754424f, 0.722406f, 0.686425f, 0.645124f, 0.597900f, 0.549560f, 0.501709f, 0.451184f, 0.399036f, 0.349319f, 0.301514f, 0.254382f, 0.210559f, 0.169586f, 0.126625f, 0.082489f, 0.042121f, 0.003063f, -0.039580f, -0.081194f, -0.116558f, -0.151377f, -0.189529f, -0.223338f, -0.250399f, -0.280134f, -0.312833f, -0.337748f, -0.358162f, -0.386893f, -0.417232f, -0.436207f, -0.457643f, -0.496886f, -0.534086f, -0.559077f, -0.615495f, -0.720955f, -0.788091f, -0.733920f, -0.633048f} + }, + { + { 0.118436f, 0.115238f, 0.066724f, -0.031005f, -0.110536f, -0.104982f, -0.026119f, 0.054803f, 0.085973f, 0.067873f, 0.022013f, -0.034585f, -0.076928f, -0.068265f, 0.001219f, 0.079759f, 0.089362f, 0.012958f, -0.068933f, -0.055059f, 0.061752f, 0.181176f, 0.204944f, 0.133740f, 0.039616f, -0.026727f, -0.067425f, -0.097358f, -0.117479f, -0.128816f, -0.139106f, -0.148124f, -0.147540f, -0.137735f, -0.127967f, -0.121964f, -0.118868f, -0.123376f, -0.139592f, -0.160579f, -0.177238f, -0.190353f, -0.203239f, -0.212479f, -0.215771f, -0.218017f, -0.221530f, -0.221546f, -0.216582f, -0.210524f, -0.201753f, -0.183921f, -0.158000f, -0.129614f, -0.096841f, -0.054949f, -0.008121f, 0.037786f, 0.086428f, 0.141514f, 0.196865f, 0.248309f, 0.301857f, 0.359085f, 0.410915f, 0.454764f, 0.498103f, 0.538709f, 0.564751f, 0.577927f, 0.589323f, 0.592448f, 0.572721f, 0.540242f, 0.513516f, 0.474346f, 0.385659f, 0.255970f, 0.141241f, 0.082055f}, + { 0.118436f, 0.115238f, 0.066724f, -0.031005f, -0.110536f, -0.104982f, -0.026119f, 0.054803f, 0.085973f, 0.067873f, 0.022013f, -0.034585f, -0.076928f, -0.068265f, 0.001219f, 0.079759f, 0.089362f, 0.012958f, -0.068933f, -0.055059f, 0.061752f, 0.181176f, 0.204944f, 0.133740f, 0.039616f, -0.026727f, -0.067425f, -0.097358f, -0.117479f, -0.128816f, -0.139106f, -0.148124f, -0.147540f, -0.137735f, -0.127967f, -0.121964f, -0.118868f, -0.123376f, -0.139592f, -0.160579f, -0.177238f, -0.190353f, -0.203239f, -0.212479f, -0.215771f, -0.218017f, -0.221530f, -0.221546f, -0.216582f, -0.210524f, -0.201753f, -0.183921f, -0.158000f, -0.129614f, -0.096841f, -0.054949f, -0.008121f, 0.037786f, 0.086428f, 0.141514f, 0.196865f, 0.248309f, 0.301857f, 0.359085f, 0.410915f, 0.454764f, 0.498103f, 0.538709f, 0.564751f, 0.577927f, 0.589323f, 0.592448f, 0.572721f, 0.540242f, 0.513516f, 0.474346f, 0.385659f, 0.255970f, 0.141241f, 0.082055f} + }, + { + { 0.032265f, 0.058092f, 0.073219f, 0.041427f, -0.027377f, -0.074710f, -0.054839f, 0.005525f, 0.033420f, -0.004645f, -0.074163f, -0.131671f, -0.164722f, -0.155087f, -0.066220f, 0.075605f, 0.140276f, 0.027223f, -0.171436f, -0.236113f, -0.070379f, 0.189981f, 0.347922f, 0.350289f, 0.275749f, 0.188927f, 0.086500f, -0.040928f, -0.171421f, -0.284063f, -0.381731f, -0.470062f, -0.541769f, -0.589134f, -0.613034f, -0.615565f, -0.596996f, -0.561345f, -0.515497f, -0.463484f, -0.407689f, -0.352161f, -0.299365f, -0.247826f, -0.196903f, -0.149167f, -0.105444f, -0.063031f, -0.021015f, 0.017920f, 0.052064f, 0.081783f, 0.105940f, 0.122756f, 0.134246f, 0.144836f, 0.156248f, 0.167997f, 0.181050f, 0.196383f, 0.212049f, 0.225943f, 0.239050f, 0.252450f, 0.264499f, 0.274458f, 0.284930f, 0.297257f, 0.308914f, 0.318683f, 0.329107f, 0.340350f, 0.347916f, 0.350893f, 0.354868f, 0.358797f, 0.345304f, 0.296893f, 0.224114f, 0.168317f}, + { 0.032265f, 0.058092f, 0.073219f, 0.041427f, -0.027377f, -0.074710f, -0.054839f, 0.005525f, 0.033420f, -0.004645f, -0.074163f, -0.131671f, -0.164722f, -0.155087f, -0.066220f, 0.075605f, 0.140276f, 0.027223f, -0.171436f, -0.236113f, -0.070379f, 0.189981f, 0.347922f, 0.350289f, 0.275749f, 0.188927f, 0.086500f, -0.040928f, -0.171421f, -0.284063f, -0.381731f, -0.470062f, -0.541769f, -0.589134f, -0.613034f, -0.615565f, -0.596996f, -0.561345f, -0.515497f, -0.463484f, -0.407689f, -0.352161f, -0.299365f, -0.247826f, -0.196903f, -0.149167f, -0.105444f, -0.063031f, -0.021015f, 0.017920f, 0.052064f, 0.081783f, 0.105940f, 0.122756f, 0.134246f, 0.144836f, 0.156248f, 0.167997f, 0.181050f, 0.196383f, 0.212049f, 0.225943f, 0.239050f, 0.252450f, 0.264499f, 0.274458f, 0.284930f, 0.297257f, 0.308914f, 0.318683f, 0.329107f, 0.340350f, 0.347916f, 0.350893f, 0.354868f, 0.358797f, 0.345304f, 0.296893f, 0.224114f, 0.168317f} + }, + { + { 0.011552f, 0.000565f, -0.003312f, 0.012114f, 0.034643f, 0.042894f, 0.038718f, 0.047434f, 0.078185f, 0.098700f, 0.060730f, -0.052718f, -0.197397f, -0.271665f, -0.179838f, 0.052824f, 0.238687f, 0.183493f, -0.084160f, -0.306954f, -0.270000f, -0.022547f, 0.219181f, 0.324412f, 0.323963f, 0.283599f, 0.211949f, 0.102569f, -0.017904f, -0.119553f, -0.202749f, -0.277404f, -0.338929f, -0.381318f, -0.410145f, -0.429239f, -0.431485f, -0.411399f, -0.374227f, -0.328491f, -0.279921f, -0.233766f, -0.193863f, -0.159140f, -0.127047f, -0.098014f, -0.072129f, -0.046232f, -0.018734f, 0.007677f, 0.031175f, 0.053092f, 0.073299f, 0.089460f, 0.102015f, 0.113996f, 0.125945f, 0.136708f, 0.147823f, 0.161322f, 0.175607f, 0.188937f, 0.203404f, 0.220320f, 0.236539f, 0.250298f, 0.264790f, 0.281291f, 0.295883f, 0.307388f, 0.320088f, 0.334110f, 0.343177f, 0.346983f, 0.353477f, 0.359929f, 0.343271f, 0.284042f, 0.198067f, 0.133818f}, + { -0.011552f, -0.000565f, 0.003312f, -0.012114f, -0.034643f, -0.042894f, -0.038718f, -0.047434f, -0.078185f, -0.098700f, -0.060730f, 0.052718f, 0.197397f, 0.271665f, 0.179838f, -0.052824f, -0.238687f, -0.183493f, 0.084160f, 0.306954f, 0.270000f, 0.022547f, -0.219181f, -0.324412f, -0.323963f, -0.283599f, -0.211949f, -0.102569f, 0.017904f, 0.119553f, 0.202749f, 0.277404f, 0.338929f, 0.381318f, 0.410145f, 0.429239f, 0.431485f, 0.411399f, 0.374227f, 0.328491f, 0.279921f, 0.233766f, 0.193863f, 0.159140f, 0.127047f, 0.098014f, 0.072129f, 0.046232f, 0.018734f, -0.007677f, -0.031175f, -0.053092f, -0.073299f, -0.089460f, -0.102015f, -0.113996f, -0.125945f, -0.136708f, -0.147823f, -0.161322f, -0.175607f, -0.188937f, -0.203404f, -0.220320f, -0.236539f, -0.250298f, -0.264790f, -0.281291f, -0.295883f, -0.307388f, -0.320088f, -0.334110f, -0.343177f, -0.346983f, -0.353477f, -0.359929f, -0.343271f, -0.284042f, -0.198067f, -0.133818f} + }, + { + { 0.051162f, 0.004630f, -0.001227f, 0.050366f, 0.063139f, -0.012808f, -0.073989f, 0.003079f, 0.174556f, 0.264299f, 0.172675f, -0.020436f, -0.159153f, -0.156052f, -0.032841f, 0.113831f, 0.167176f, 0.075277f, -0.079544f, -0.141124f, -0.047299f, 0.099392f, 0.161108f, 0.119504f, 0.056727f, 0.028236f, 0.022203f, 0.022582f, 0.040897f, 0.080790f, 0.122332f, 0.151311f, 0.170587f, 0.180438f, 0.176020f, 0.162553f, 0.148761f, 0.129984f, 0.097918f, 0.058507f, 0.022731f, -0.008873f, -0.037674f, -0.057264f, -0.065527f, -0.071491f, -0.080334f, -0.087226f, -0.091495f, -0.098993f, -0.107772f, -0.110111f, -0.108138f, -0.108645f, -0.106898f, -0.094525f, -0.075444f, -0.055728f, -0.029601f, 0.007217f, 0.045808f, 0.081023f, 0.120922f, 0.166769f, 0.206984f, 0.240262f, 0.277196f, 0.313665f, 0.334528f, 0.343916f, 0.355052f, 0.356025f, 0.328945f, 0.289951f, 0.257626f, 0.201059f, 0.086037f, -0.044980f, -0.115572f, -0.123491f}, + { -0.051162f, -0.004630f, 0.001227f, -0.050366f, -0.063139f, 0.012808f, 0.073989f, -0.003079f, -0.174556f, -0.264299f, -0.172675f, 0.020436f, 0.159153f, 0.156052f, 0.032841f, -0.113831f, -0.167176f, -0.075277f, 0.079544f, 0.141124f, 0.047299f, -0.099392f, -0.161108f, -0.119504f, -0.056727f, -0.028236f, -0.022203f, -0.022582f, -0.040897f, -0.080790f, -0.122332f, -0.151311f, -0.170587f, -0.180438f, -0.176020f, -0.162553f, -0.148761f, -0.129984f, -0.097918f, -0.058507f, -0.022731f, 0.008873f, 0.037674f, 0.057264f, 0.065527f, 0.071491f, 0.080334f, 0.087226f, 0.091495f, 0.098993f, 0.107772f, 0.110111f, 0.108138f, 0.108645f, 0.106898f, 0.094525f, 0.075444f, 0.055728f, 0.029601f, -0.007217f, -0.045808f, -0.081023f, -0.120922f, -0.166769f, -0.206984f, -0.240262f, -0.277196f, -0.313665f, -0.334528f, -0.343916f, -0.355052f, -0.356025f, -0.328945f, -0.289951f, -0.257626f, -0.201059f, -0.086037f, 0.044980f, 0.115572f, 0.123491f} + }, + { + { -0.001314f, 0.013986f, 0.009786f, -0.021568f, -0.047753f, -0.057550f, -0.086395f, -0.154169f, -0.215190f, -0.199014f, -0.071655f, 0.152694f, 0.397084f, 0.495990f, 0.293761f, -0.132217f, -0.431993f, -0.318278f, 0.082383f, 0.358067f, 0.288935f, 0.046365f, -0.101534f, -0.106415f, -0.078828f, -0.063480f, -0.018297f, 0.055798f, 0.098862f, 0.089346f, 0.066346f, 0.059485f, 0.060855f, 0.062340f, 0.070487f, 0.084437f, 0.093707f, 0.096733f, 0.099690f, 0.102715f, 0.102674f, 0.100995f, 0.097996f, 0.089458f, 0.075691f, 0.063124f, 0.053174f, 0.040888f, 0.025646f, 0.011582f, -0.001922f, -0.019025f, -0.038853f, -0.058009f, -0.077789f, -0.100164f, -0.121936f, -0.140242f, -0.157366f, -0.174332f, -0.187554f, -0.195964f, -0.202516f, -0.206222f, -0.202547f, -0.192157f, -0.178650f, -0.159543f, -0.131095f, -0.097600f, -0.063527f, -0.024200f, 0.022505f, 0.067763f, 0.110169f, 0.162198f, 0.215318f, 0.224924f, 0.168949f, 0.102011f}, + { -0.001314f, 0.013986f, 0.009786f, -0.021568f, -0.047753f, -0.057550f, -0.086395f, -0.154169f, -0.215190f, -0.199014f, -0.071655f, 0.152694f, 0.397084f, 0.495990f, 0.293761f, -0.132217f, -0.431993f, -0.318278f, 0.082383f, 0.358067f, 0.288935f, 0.046365f, -0.101534f, -0.106415f, -0.078828f, -0.063480f, -0.018297f, 0.055798f, 0.098862f, 0.089346f, 0.066346f, 0.059485f, 0.060855f, 0.062340f, 0.070487f, 0.084437f, 0.093707f, 0.096733f, 0.099690f, 0.102715f, 0.102674f, 0.100995f, 0.097996f, 0.089458f, 0.075691f, 0.063124f, 0.053174f, 0.040888f, 0.025646f, 0.011582f, -0.001922f, -0.019025f, -0.038853f, -0.058009f, -0.077789f, -0.100164f, -0.121936f, -0.140242f, -0.157366f, -0.174332f, -0.187554f, -0.195964f, -0.202516f, -0.206222f, -0.202547f, -0.192157f, -0.178650f, -0.159543f, -0.131095f, -0.097600f, -0.063527f, -0.024200f, 0.022505f, 0.067763f, 0.110169f, 0.162198f, 0.215318f, 0.224924f, 0.168949f, 0.102011f} + }, + { + { 0.042103f, -0.013452f, -0.091487f, -0.148327f, -0.144124f, -0.055175f, 0.091983f, 0.204935f, 0.191965f, 0.062580f, -0.072721f, -0.121327f, -0.093551f, -0.051022f, -0.017300f, 0.017247f, 0.037857f, 0.014410f, -0.039540f, -0.070060f, -0.052305f, -0.017107f, 0.000424f, 0.004587f, 0.018491f, 0.047099f, 0.077608f, 0.099837f, 0.110945f, 0.108370f, 0.089842f, 0.058821f, 0.024413f, -0.005114f, -0.028508f, -0.051222f, -0.078453f, -0.109684f, -0.140991f, -0.169087f, -0.190473f, -0.201281f, -0.201941f, -0.197857f, -0.192519f, -0.184895f, -0.175234f, -0.166555f, -0.158810f, -0.148859f, -0.137050f, -0.126350f, -0.115695f, -0.102138f, -0.087471f, -0.074652f, -0.061324f, -0.044873f, -0.028707f, -0.015999f, -0.004116f, 0.008155f, 0.016586f, 0.020249f, 0.023972f, 0.028420f, 0.029801f, 0.030588f, 0.036368f, 0.043745f, 0.047696f, 0.055248f, 0.072784f, 0.090791f, 0.104872f, 0.134221f, 0.185880f, 0.221150f, 0.203371f, 0.163391f}, + { 0.042103f, -0.013452f, -0.091487f, -0.148327f, -0.144124f, -0.055175f, 0.091983f, 0.204935f, 0.191965f, 0.062580f, -0.072721f, -0.121327f, -0.093551f, -0.051022f, -0.017300f, 0.017247f, 0.037857f, 0.014410f, -0.039540f, -0.070060f, -0.052305f, -0.017107f, 0.000424f, 0.004587f, 0.018491f, 0.047099f, 0.077608f, 0.099837f, 0.110945f, 0.108370f, 0.089842f, 0.058821f, 0.024413f, -0.005114f, -0.028508f, -0.051222f, -0.078453f, -0.109684f, -0.140991f, -0.169087f, -0.190473f, -0.201281f, -0.201941f, -0.197857f, -0.192519f, -0.184895f, -0.175234f, -0.166555f, -0.158810f, -0.148859f, -0.137050f, -0.126350f, -0.115695f, -0.102138f, -0.087471f, -0.074652f, -0.061324f, -0.044873f, -0.028707f, -0.015999f, -0.004116f, 0.008155f, 0.016586f, 0.020249f, 0.023972f, 0.028420f, 0.029801f, 0.030588f, 0.036368f, 0.043745f, 0.047696f, 0.055248f, 0.072784f, 0.090791f, 0.104872f, 0.134221f, 0.185880f, 0.221150f, 0.203371f, 0.163391f} + }, + { + { -0.017545f, 0.076968f, 0.147238f, 0.125289f, 0.049414f, -0.057820f, -0.233434f, -0.448356f, -0.560146f, -0.463019f, -0.188026f, 0.190602f, 0.597571f, 0.824948f, 0.577274f, -0.126396f, -0.739164f, -0.676925f, -0.006837f, 0.613537f, 0.701525f, 0.399638f, 0.115282f, -0.003365f, -0.072131f, -0.166089f, -0.238583f, -0.264945f, -0.284852f, -0.312500f, -0.316805f, -0.287275f, -0.246557f, -0.204600f, -0.151995f, -0.090222f, -0.031983f, 0.019104f, 0.064902f, 0.100523f, 0.122410f, 0.136855f, 0.149719f, 0.158877f, 0.162462f, 0.163196f, 0.161570f, 0.155005f, 0.144910f, 0.136207f, 0.130365f, 0.125254f, 0.119853f, 0.114133f, 0.106910f, 0.097381f, 0.086310f, 0.074005f, 0.059767f, 0.043801f, 0.027185f, 0.010169f, -0.007656f, -0.026211f, -0.045001f, -0.063487f, -0.081298f, -0.098501f, -0.114708f, -0.128404f, -0.139398f, -0.150144f, -0.161200f, -0.169677f, -0.177286f, -0.191238f, -0.207043f, -0.202388f, -0.166936f, -0.129206f}, + { -0.017545f, 0.076968f, 0.147238f, 0.125289f, 0.049414f, -0.057820f, -0.233434f, -0.448356f, -0.560146f, -0.463019f, -0.188026f, 0.190602f, 0.597571f, 0.824948f, 0.577274f, -0.126396f, -0.739164f, -0.676925f, -0.006837f, 0.613537f, 0.701525f, 0.399638f, 0.115282f, -0.003365f, -0.072131f, -0.166089f, -0.238583f, -0.264945f, -0.284852f, -0.312500f, -0.316805f, -0.287275f, -0.246557f, -0.204600f, -0.151995f, -0.090222f, -0.031983f, 0.019104f, 0.064902f, 0.100523f, 0.122410f, 0.136855f, 0.149719f, 0.158877f, 0.162462f, 0.163196f, 0.161570f, 0.155005f, 0.144910f, 0.136207f, 0.130365f, 0.125254f, 0.119853f, 0.114133f, 0.106910f, 0.097381f, 0.086310f, 0.074005f, 0.059767f, 0.043801f, 0.027185f, 0.010169f, -0.007656f, -0.026211f, -0.045001f, -0.063487f, -0.081298f, -0.098501f, -0.114708f, -0.128404f, -0.139398f, -0.150144f, -0.161200f, -0.169677f, -0.177286f, -0.191238f, -0.207043f, -0.202388f, -0.166936f, -0.129206f} + }, + { + { -0.006941f, -0.009137f, -0.001025f, 0.023181f, 0.071280f, 0.152288f, 0.232381f, 0.241767f, 0.159918f, 0.019441f, -0.191250f, -0.477987f, -0.641445f, -0.366185f, 0.303140f, 0.785583f, 0.561935f, -0.151779f, -0.630912f, -0.503217f, -0.082209f, 0.167454f, 0.171480f, 0.133590f, 0.151479f, 0.158082f, 0.114516f, 0.066176f, 0.040238f, 0.013478f, -0.024102f, -0.051025f, -0.056634f, -0.052834f, -0.047949f, -0.040161f, -0.030751f, -0.023050f, -0.014898f, -0.004699f, 0.003065f, 0.006126f, 0.009138f, 0.014713f, 0.018779f, 0.018792f, 0.018156f, 0.019353f, 0.020281f, 0.020049f, 0.021722f, 0.026967f, 0.033551f, 0.039947f, 0.047332f, 0.055643f, 0.062465f, 0.067092f, 0.071222f, 0.074871f, 0.076231f, 0.075857f, 0.075991f, 0.075860f, 0.073017f, 0.068571f, 0.065118f, 0.061079f, 0.053861f, 0.045973f, 0.040311f, 0.033378f, 0.022033f, 0.010850f, 0.001847f, -0.014432f, -0.042350f, -0.064916f, -0.064261f, -0.051262f}, + { 0.006941f, 0.009137f, 0.001025f, -0.023181f, -0.071280f, -0.152288f, -0.232381f, -0.241767f, -0.159918f, -0.019441f, 0.191250f, 0.477987f, 0.641445f, 0.366185f, -0.303140f, -0.785583f, -0.561935f, 0.151779f, 0.630912f, 0.503217f, 0.082209f, -0.167454f, -0.171480f, -0.133590f, -0.151479f, -0.158082f, -0.114516f, -0.066176f, -0.040238f, -0.013478f, 0.024102f, 0.051025f, 0.056634f, 0.052834f, 0.047949f, 0.040161f, 0.030751f, 0.023050f, 0.014898f, 0.004699f, -0.003065f, -0.006126f, -0.009138f, -0.014713f, -0.018779f, -0.018792f, -0.018156f, -0.019353f, -0.020281f, -0.020049f, -0.021722f, -0.026967f, -0.033551f, -0.039947f, -0.047332f, -0.055643f, -0.062465f, -0.067092f, -0.071222f, -0.074871f, -0.076231f, -0.075857f, -0.075991f, -0.075860f, -0.073017f, -0.068571f, -0.065118f, -0.061079f, -0.053861f, -0.045973f, -0.040311f, -0.033378f, -0.022033f, -0.010850f, -0.001847f, 0.014432f, 0.042350f, 0.064916f, 0.064261f, 0.051262f} + }, + { + { -0.009108f, -0.000638f, 0.006579f, 0.001811f, -0.025320f, -0.072975f, -0.099878f, -0.046177f, 0.078173f, 0.161617f, 0.109552f, -0.025830f, -0.103052f, -0.069323f, -0.005915f, 0.007950f, -0.006548f, 0.003625f, 0.029014f, 0.026490f, -0.001964f, -0.017075f, -0.008856f, -0.005898f, -0.023342f, -0.040994f, -0.037654f, -0.018706f, -0.001195f, 0.008790f, 0.013986f, 0.014099f, 0.006255f, -0.008494f, -0.025735f, -0.041885f, -0.054703f, -0.062996f, -0.068182f, -0.073039f, -0.077308f, -0.077697f, -0.073146f, -0.066479f, -0.060233f, -0.054842f, -0.051364f, -0.051522f, -0.054305f, -0.056526f, -0.056981f, -0.056335f, -0.053803f, -0.048110f, -0.040567f, -0.033134f, -0.025166f, -0.015716f, -0.006373f, 0.001714f, 0.010176f, 0.019674f, 0.028014f, 0.034461f, 0.040938f, 0.047298f, 0.051293f, 0.053861f, 0.057721f, 0.061503f, 0.062963f, 0.065308f, 0.071389f, 0.076861f, 0.080196f, 0.090996f, 0.112659f, 0.126656f, 0.115757f, 0.095245f}, + { 0.009108f, 0.000638f, -0.006579f, -0.001811f, 0.025320f, 0.072975f, 0.099878f, 0.046177f, -0.078173f, -0.161617f, -0.109552f, 0.025830f, 0.103052f, 0.069323f, 0.005915f, -0.007950f, 0.006548f, -0.003625f, -0.029014f, -0.026490f, 0.001964f, 0.017075f, 0.008856f, 0.005898f, 0.023342f, 0.040994f, 0.037654f, 0.018706f, 0.001195f, -0.008790f, -0.013986f, -0.014099f, -0.006255f, 0.008494f, 0.025735f, 0.041885f, 0.054703f, 0.062996f, 0.068182f, 0.073039f, 0.077308f, 0.077697f, 0.073146f, 0.066479f, 0.060233f, 0.054842f, 0.051364f, 0.051522f, 0.054305f, 0.056526f, 0.056981f, 0.056335f, 0.053803f, 0.048110f, 0.040567f, 0.033134f, 0.025166f, 0.015716f, 0.006373f, -0.001714f, -0.010176f, -0.019674f, -0.028014f, -0.034461f, -0.040938f, -0.047298f, -0.051293f, -0.053861f, -0.057721f, -0.061503f, -0.062963f, -0.065308f, -0.071389f, -0.076861f, -0.080196f, -0.090996f, -0.112659f, -0.126656f, -0.115757f, -0.095245f} + }, + { + { -0.036299f, -0.021576f, 0.008339f, 0.022024f, -0.006026f, -0.023441f, 0.054545f, 0.203109f, 0.258935f, 0.083497f, -0.260111f, -0.516144f, -0.440053f, -0.037701f, 0.381792f, 0.458565f, 0.145761f, -0.228806f, -0.323180f, -0.139235f, 0.059116f, 0.103770f, 0.056741f, 0.022598f, -0.002741f, -0.054614f, -0.101353f, -0.098354f, -0.066298f, -0.053021f, -0.063515f, -0.072217f, -0.068674f, -0.055829f, -0.030066f, 0.010072f, 0.053291f, 0.089027f, 0.117100f, 0.138411f, 0.151225f, 0.158410f, 0.164831f, 0.168991f, 0.167807f, 0.164211f, 0.160954f, 0.154801f, 0.144154f, 0.132890f, 0.121469f, 0.104824f, 0.081993f, 0.056942f, 0.029818f, -0.001262f, -0.032295f, -0.058604f, -0.083127f, -0.109320f, -0.133549f, -0.153530f, -0.173701f, -0.194504f, -0.209278f, -0.217046f, -0.222920f, -0.223700f, -0.211596f, -0.190929f, -0.169788f, -0.141148f, -0.097122f, -0.049726f, -0.007241f, 0.050044f, 0.129214f, 0.183903f, 0.170356f, 0.125994f}, + { 0.036299f, 0.021576f, -0.008339f, -0.022024f, 0.006026f, 0.023441f, -0.054545f, -0.203109f, -0.258935f, -0.083497f, 0.260111f, 0.516144f, 0.440053f, 0.037701f, -0.381792f, -0.458565f, -0.145761f, 0.228806f, 0.323180f, 0.139235f, -0.059116f, -0.103770f, -0.056741f, -0.022598f, 0.002741f, 0.054614f, 0.101353f, 0.098354f, 0.066298f, 0.053021f, 0.063515f, 0.072217f, 0.068674f, 0.055829f, 0.030066f, -0.010072f, -0.053291f, -0.089027f, -0.117100f, -0.138411f, -0.151225f, -0.158410f, -0.164831f, -0.168991f, -0.167807f, -0.164211f, -0.160954f, -0.154801f, -0.144154f, -0.132890f, -0.121469f, -0.104824f, -0.081993f, -0.056942f, -0.029818f, 0.001262f, 0.032295f, 0.058604f, 0.083127f, 0.109320f, 0.133549f, 0.153530f, 0.173701f, 0.194504f, 0.209278f, 0.217046f, 0.222920f, 0.223700f, 0.211596f, 0.190929f, 0.169788f, 0.141148f, 0.097122f, 0.049726f, 0.007241f, -0.050044f, -0.129214f, -0.183903f, -0.170356f, -0.125994f} + }, + { + { -0.025047f, -0.028754f, -0.028569f, -0.015495f, 0.010196f, 0.035640f, 0.044337f, 0.024249f, -0.028081f, -0.094389f, -0.127559f, -0.087289f, 0.004235f, 0.069146f, 0.055857f, -0.007075f, -0.056597f, -0.069039f, -0.062730f, -0.050133f, -0.024468f, 0.012365f, 0.041470f, 0.052445f, 0.056366f, 0.065583f, 0.073587f, 0.063210f, 0.028539f, -0.017899f, -0.057371f, -0.079077f, -0.082830f, -0.074407f, -0.062370f, -0.055041f, -0.054380f, -0.054159f, -0.048181f, -0.037707f, -0.027394f, -0.018485f, -0.010478f, -0.004506f, -0.000331f, 0.005219f, 0.013155f, 0.020828f, 0.027469f, 0.034894f, 0.041923f, 0.045338f, 0.046128f, 0.047149f, 0.046350f, 0.040257f, 0.030844f, 0.020980f, 0.008220f, -0.009083f, -0.026461f, -0.041430f, -0.058137f, -0.077722f, -0.094897f, -0.109097f, -0.126050f, -0.144888f, -0.158763f, -0.169239f, -0.182316f, -0.191952f, -0.188522f, -0.178697f, -0.171250f, -0.150620f, -0.097096f, -0.027594f, 0.019215f, 0.033651f}, + { -0.025047f, -0.028754f, -0.028569f, -0.015495f, 0.010196f, 0.035640f, 0.044337f, 0.024249f, -0.028081f, -0.094389f, -0.127559f, -0.087289f, 0.004235f, 0.069146f, 0.055857f, -0.007075f, -0.056597f, -0.069039f, -0.062730f, -0.050133f, -0.024468f, 0.012365f, 0.041470f, 0.052445f, 0.056366f, 0.065583f, 0.073587f, 0.063210f, 0.028539f, -0.017899f, -0.057371f, -0.079077f, -0.082830f, -0.074407f, -0.062370f, -0.055041f, -0.054380f, -0.054159f, -0.048181f, -0.037707f, -0.027394f, -0.018485f, -0.010478f, -0.004506f, -0.000331f, 0.005219f, 0.013155f, 0.020828f, 0.027469f, 0.034894f, 0.041923f, 0.045338f, 0.046128f, 0.047149f, 0.046350f, 0.040257f, 0.030844f, 0.020980f, 0.008220f, -0.009083f, -0.026461f, -0.041430f, -0.058137f, -0.077722f, -0.094897f, -0.109097f, -0.126050f, -0.144888f, -0.158763f, -0.169239f, -0.182316f, -0.191952f, -0.188522f, -0.178697f, -0.171250f, -0.150620f, -0.097096f, -0.027594f, 0.019215f, 0.033651f} + }, + { + { -0.033005f, -0.036257f, -0.019445f, 0.020321f, 0.057860f, 0.074577f, 0.063661f, 0.007800f, -0.096480f, -0.187851f, -0.173226f, -0.040226f, 0.105389f, 0.146569f, 0.072525f, -0.031645f, -0.081998f, -0.057456f, 0.006102f, 0.049635f, 0.032558f, -0.032467f, -0.090130f, -0.098890f, -0.066699f, -0.025791f, 0.006963f, 0.032157f, 0.050494f, 0.061958f, 0.071686f, 0.082610f, 0.088992f, 0.085509f, 0.075402f, 0.063868f, 0.050996f, 0.035750f, 0.020313f, 0.007358f, -0.002044f, -0.007197f, -0.008819f, -0.010228f, -0.013890f, -0.019307f, -0.026762f, -0.038606f, -0.054410f, -0.070003f, -0.083022f, -0.094042f, -0.102024f, -0.104979f, -0.104775f, -0.105066f, -0.105910f, -0.106145f, -0.107843f, -0.112681f, -0.118356f, -0.123577f, -0.130694f, -0.139213f, -0.144218f, -0.144444f, -0.143029f, -0.138673f, -0.126828f, -0.109819f, -0.093429f, -0.075360f, -0.051148f, -0.026508f, -0.006566f, 0.019079f, 0.058133f, 0.091618f, 0.096195f, 0.083166f}, + { -0.033005f, -0.036257f, -0.019445f, 0.020321f, 0.057860f, 0.074577f, 0.063661f, 0.007800f, -0.096480f, -0.187851f, -0.173226f, -0.040226f, 0.105389f, 0.146569f, 0.072525f, -0.031645f, -0.081998f, -0.057456f, 0.006102f, 0.049635f, 0.032558f, -0.032467f, -0.090130f, -0.098890f, -0.066699f, -0.025791f, 0.006963f, 0.032157f, 0.050494f, 0.061958f, 0.071686f, 0.082610f, 0.088992f, 0.085509f, 0.075402f, 0.063868f, 0.050996f, 0.035750f, 0.020313f, 0.007358f, -0.002044f, -0.007197f, -0.008819f, -0.010228f, -0.013890f, -0.019307f, -0.026762f, -0.038606f, -0.054410f, -0.070003f, -0.083022f, -0.094042f, -0.102024f, -0.104979f, -0.104775f, -0.105066f, -0.105910f, -0.106145f, -0.107843f, -0.112681f, -0.118356f, -0.123577f, -0.130694f, -0.139213f, -0.144218f, -0.144444f, -0.143029f, -0.138673f, -0.126828f, -0.109819f, -0.093429f, -0.075360f, -0.051148f, -0.026508f, -0.006566f, 0.019079f, 0.058133f, 0.091618f, 0.096195f, 0.083166f} + }, + { + { 0.001244f, -0.011714f, -0.018975f, -0.019388f, -0.028242f, -0.031454f, 0.013230f, 0.095142f, 0.112352f, -0.016836f, -0.210437f, -0.270105f, -0.109627f, 0.120234f, 0.193261f, 0.063294f, -0.105565f, -0.151978f, -0.085969f, -0.022310f, -0.012774f, -0.007520f, 0.041667f, 0.109371f, 0.143796f, 0.138462f, 0.124355f, 0.115741f, 0.097689f, 0.058191f, 0.004528f, -0.051150f, -0.101799f, -0.140639f, -0.162437f, -0.170701f, -0.172906f, -0.170378f, -0.161243f, -0.148300f, -0.135406f, -0.121911f, -0.108101f, -0.099258f, -0.097962f, -0.099850f, -0.101590f, -0.104536f, -0.107601f, -0.106247f, -0.100485f, -0.094225f, -0.086781f, -0.074970f, -0.061475f, -0.051088f, -0.042559f, -0.033713f, -0.028432f, -0.029468f, -0.032466f, -0.035073f, -0.041591f, -0.052187f, -0.060305f, -0.065417f, -0.073316f, -0.081610f, -0.082466f, -0.078897f, -0.077999f, -0.072670f, -0.053724f, -0.030703f, -0.011855f, 0.021724f, 0.084005f, 0.142124f, 0.153989f, 0.135267f}, + { 0.001244f, -0.011714f, -0.018975f, -0.019388f, -0.028242f, -0.031454f, 0.013230f, 0.095142f, 0.112352f, -0.016836f, -0.210437f, -0.270105f, -0.109627f, 0.120234f, 0.193261f, 0.063294f, -0.105565f, -0.151978f, -0.085969f, -0.022310f, -0.012774f, -0.007520f, 0.041667f, 0.109371f, 0.143796f, 0.138462f, 0.124355f, 0.115741f, 0.097689f, 0.058191f, 0.004528f, -0.051150f, -0.101799f, -0.140639f, -0.162437f, -0.170701f, -0.172906f, -0.170378f, -0.161243f, -0.148300f, -0.135406f, -0.121911f, -0.108101f, -0.099258f, -0.097962f, -0.099850f, -0.101590f, -0.104536f, -0.107601f, -0.106247f, -0.100485f, -0.094225f, -0.086781f, -0.074970f, -0.061475f, -0.051088f, -0.042559f, -0.033713f, -0.028432f, -0.029468f, -0.032466f, -0.035073f, -0.041591f, -0.052187f, -0.060305f, -0.065417f, -0.073316f, -0.081610f, -0.082466f, -0.078897f, -0.077999f, -0.072670f, -0.053724f, -0.030703f, -0.011855f, 0.021724f, 0.084005f, 0.142124f, 0.153989f, 0.135267f} + }, + { + { -0.013036f, -0.012005f, -0.010946f, -0.010336f, -0.011806f, -0.018223f, -0.025154f, -0.017942f, 0.005606f, 0.011671f, -0.037994f, -0.113752f, -0.116094f, 0.005214f, 0.150250f, 0.156107f, -0.002268f, -0.162837f, -0.163654f, -0.027056f, 0.091762f, 0.097477f, 0.030660f, -0.026612f, -0.045438f, -0.038626f, -0.014564f, 0.023807f, 0.062441f, 0.085957f, 0.093102f, 0.090477f, 0.081990f, 0.071815f, 0.066281f, 0.065817f, 0.062838f, 0.051246f, 0.031641f, 0.006718f, -0.021218f, -0.047928f, -0.068727f, -0.082506f, -0.090476f, -0.092952f, -0.090869f, -0.087450f, -0.085084f, -0.083439f, -0.082526f, -0.083859f, -0.087311f, -0.090779f, -0.093524f, -0.095999f, -0.097064f, -0.095528f, -0.093135f, -0.092047f, -0.091608f, -0.091215f, -0.092962f, -0.097813f, -0.103266f, -0.108015f, -0.113964f, -0.121091f, -0.126325f, -0.129603f, -0.133962f, -0.138229f, -0.137962f, -0.134611f, -0.133515f, -0.130971f, -0.114570f, -0.080508f, -0.041940f, -0.017332f}, + { -0.013036f, -0.012005f, -0.010946f, -0.010336f, -0.011806f, -0.018223f, -0.025154f, -0.017942f, 0.005606f, 0.011671f, -0.037994f, -0.113752f, -0.116094f, 0.005214f, 0.150250f, 0.156107f, -0.002268f, -0.162837f, -0.163654f, -0.027056f, 0.091762f, 0.097477f, 0.030660f, -0.026612f, -0.045438f, -0.038626f, -0.014564f, 0.023807f, 0.062441f, 0.085957f, 0.093102f, 0.090477f, 0.081990f, 0.071815f, 0.066281f, 0.065817f, 0.062838f, 0.051246f, 0.031641f, 0.006718f, -0.021218f, -0.047928f, -0.068727f, -0.082506f, -0.090476f, -0.092952f, -0.090869f, -0.087450f, -0.085084f, -0.083439f, -0.082526f, -0.083859f, -0.087311f, -0.090779f, -0.093524f, -0.095999f, -0.097064f, -0.095528f, -0.093135f, -0.092047f, -0.091608f, -0.091215f, -0.092962f, -0.097813f, -0.103266f, -0.108015f, -0.113964f, -0.121091f, -0.126325f, -0.129603f, -0.133962f, -0.138229f, -0.137962f, -0.134611f, -0.133515f, -0.130971f, -0.114570f, -0.080508f, -0.041940f, -0.017332f} + } +}; +const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]={ + { + { -0.177326f, -0.487059f, -0.688283f, -0.768556f, -0.752979f, -0.684514f, -0.599780f, -0.496150f, -0.338007f, -0.118021f, 0.117601f, 0.327026f, 0.493513f, 0.540869f, 0.331702f, -0.114816f, -0.473318f, -0.386772f, 0.079465f, 0.440207f, 0.323651f, -0.145870f, -0.579736f, -0.778395f, -0.813983f, -0.787794f, -0.702264f, -0.551636f, -0.383614f, -0.237862f, -0.107087f, 0.020217f, 0.132968f, 0.222907f, 0.297407f, 0.362059f, 0.415348f, 0.458635f, 0.495122f, 0.524689f, 0.548673f, 0.570929f, 0.590645f, 0.604357f, 0.614127f, 0.623417f, 0.629725f, 0.630908f, 0.630925f, 0.631539f, 0.628735f, 0.622443f, 0.617331f, 0.612036f, 0.601631f, 0.589119f, 0.579764f, 0.569621f, 0.554496f, 0.540418f, 0.531134f, 0.519368f, 0.502799f, 0.490106f, 0.481669f, 0.467444f, 0.449557f, 0.439167f, 0.430774f, 0.412237f, 0.393245f, 0.385818f, 0.373300f, 0.343565f, 0.321957f, 0.311994f, 0.249042f, 0.099998f, -0.035738f, -0.039462f}, + { -0.177326f, -0.487059f, -0.688283f, -0.768556f, -0.752979f, -0.684514f, -0.599780f, -0.496150f, -0.338007f, -0.118021f, 0.117601f, 0.327026f, 0.493513f, 0.540869f, 0.331702f, -0.114816f, -0.473318f, -0.386772f, 0.079465f, 0.440207f, 0.323651f, -0.145870f, -0.579736f, -0.778395f, -0.813983f, -0.787794f, -0.702264f, -0.551636f, -0.383614f, -0.237862f, -0.107087f, 0.020217f, 0.132968f, 0.222907f, 0.297407f, 0.362059f, 0.415348f, 0.458635f, 0.495122f, 0.524689f, 0.548673f, 0.570929f, 0.590645f, 0.604357f, 0.614127f, 0.623417f, 0.629725f, 0.630908f, 0.630925f, 0.631539f, 0.628735f, 0.622443f, 0.617331f, 0.612036f, 0.601631f, 0.589119f, 0.579764f, 0.569621f, 0.554496f, 0.540418f, 0.531134f, 0.519368f, 0.502799f, 0.490106f, 0.481669f, 0.467444f, 0.449557f, 0.439167f, 0.430774f, 0.412237f, 0.393245f, 0.385818f, 0.373300f, 0.343565f, 0.321957f, 0.311994f, 0.249042f, 0.099998f, -0.035738f, -0.039462f} + }, + { + { 0.139379f, 0.334475f, 0.302418f, -0.001740f, -0.470657f, -0.918060f, -1.205378f, -1.264950f, -1.068335f, -0.667808f, -0.206855f, 0.225808f, 0.664665f, 1.029106f, 0.958676f, 0.223895f, -0.711948f, -0.958987f, -0.218731f, 0.776762f, 1.088344f, 0.584741f, -0.131994f, -0.574116f, -0.760032f, -0.866210f, -0.902940f, -0.825573f, -0.695964f, -0.595691f, -0.515122f, -0.414746f, -0.305467f, -0.213289f, -0.131852f, -0.047320f, 0.035561f, 0.111395f, 0.184753f, 0.256163f, 0.320948f, 0.379770f, 0.434479f, 0.481617f, 0.520017f, 0.553844f, 0.583536f, 0.605648f, 0.621334f, 0.633823f, 0.642170f, 0.646572f, 0.651242f, 0.655765f, 0.655221f, 0.651172f, 0.648535f, 0.643768f, 0.631801f, 0.617925f, 0.606967f, 0.592474f, 0.571477f, 0.552782f, 0.538082f, 0.517509f, 0.492647f, 0.475480f, 0.461290f, 0.437183f, 0.413126f, 0.403158f, 0.390400f, 0.360546f, 0.340803f, 0.339290f, 0.288776f, 0.145051f, -0.000376f, -0.026236f}, + { -0.139379f, -0.334475f, -0.302418f, 0.001740f, 0.470657f, 0.918060f, 1.205378f, 1.264950f, 1.068335f, 0.667808f, 0.206855f, -0.225808f, -0.664665f, -1.029106f, -0.958676f, -0.223895f, 0.711948f, 0.958987f, 0.218731f, -0.776762f, -1.088344f, -0.584741f, 0.131994f, 0.574116f, 0.760032f, 0.866210f, 0.902940f, 0.825573f, 0.695964f, 0.595691f, 0.515122f, 0.414746f, 0.305467f, 0.213289f, 0.131852f, 0.047320f, -0.035561f, -0.111395f, -0.184753f, -0.256163f, -0.320948f, -0.379770f, -0.434479f, -0.481617f, -0.520017f, -0.553844f, -0.583536f, -0.605648f, -0.621334f, -0.633823f, -0.642170f, -0.646572f, -0.651242f, -0.655765f, -0.655221f, -0.651172f, -0.648535f, -0.643768f, -0.631801f, -0.617925f, -0.606967f, -0.592474f, -0.571477f, -0.552782f, -0.538082f, -0.517509f, -0.492647f, -0.475480f, -0.461290f, -0.437183f, -0.413126f, -0.403158f, -0.390400f, -0.360546f, -0.340803f, -0.339290f, -0.288776f, -0.145051f, 0.000376f, 0.026236f} + }, + { + { -0.017355f, -0.068585f, -0.129748f, -0.140677f, -0.067873f, 0.038579f, 0.095547f, 0.074031f, 0.011534f, -0.044693f, -0.073913f, -0.067610f, -0.018737f, 0.054581f, 0.097078f, 0.061877f, -0.025775f, -0.074615f, -0.020989f, 0.089634f, 0.140779f, 0.070434f, -0.065703f, -0.166766f, -0.192897f, -0.175608f, -0.151255f, -0.126215f, -0.098863f, -0.074963f, -0.054673f, -0.030640f, -0.004266f, 0.014389f, 0.022782f, 0.026012f, 0.024773f, 0.018634f, 0.015637f, 0.024021f, 0.040551f, 0.058741f, 0.079941f, 0.106170f, 0.132694f, 0.156946f, 0.183756f, 0.215131f, 0.246786f, 0.278634f, 0.315363f, 0.354946f, 0.390462f, 0.422391f, 0.455016f, 0.484479f, 0.504790f, 0.519338f, 0.532532f, 0.539137f, 0.534904f, 0.525663f, 0.514081f, 0.492430f, 0.458525f, 0.420763f, 0.379757f, 0.326532f, 0.263903f, 0.204445f, 0.145530f, 0.075927f, 0.005235f, -0.048914f, -0.098551f, -0.166600f, -0.231941f, -0.240292f, -0.172726f, -0.060996f}, + { -0.017355f, -0.068585f, -0.129748f, -0.140677f, -0.067873f, 0.038579f, 0.095547f, 0.074031f, 0.011534f, -0.044693f, -0.073913f, -0.067610f, -0.018737f, 0.054581f, 0.097078f, 0.061877f, -0.025775f, -0.074615f, -0.020989f, 0.089634f, 0.140779f, 0.070434f, -0.065703f, -0.166766f, -0.192897f, -0.175608f, -0.151255f, -0.126215f, -0.098863f, -0.074963f, -0.054673f, -0.030640f, -0.004266f, 0.014389f, 0.022782f, 0.026012f, 0.024773f, 0.018634f, 0.015637f, 0.024021f, 0.040551f, 0.058741f, 0.079941f, 0.106170f, 0.132694f, 0.156946f, 0.183756f, 0.215131f, 0.246786f, 0.278634f, 0.315363f, 0.354946f, 0.390462f, 0.422391f, 0.455016f, 0.484479f, 0.504790f, 0.519338f, 0.532532f, 0.539137f, 0.534904f, 0.525663f, 0.514081f, 0.492430f, 0.458525f, 0.420763f, 0.379757f, 0.326532f, 0.263903f, 0.204445f, 0.145530f, 0.075927f, 0.005235f, -0.048914f, -0.098551f, -0.166600f, -0.231941f, -0.240292f, -0.172726f, -0.060996f} + }, + { + { 0.005973f, -0.001416f, -0.045800f, -0.099150f, -0.109299f, -0.059292f, 0.001039f, 0.004764f, -0.052550f, -0.109926f, -0.118088f, -0.081582f, -0.016964f, 0.073434f, 0.150725f, 0.125706f, -0.026114f, -0.169539f, -0.128661f, 0.090155f, 0.279655f, 0.263749f, 0.075346f, -0.131939f, -0.272993f, -0.368065f, -0.444884f, -0.489466f, -0.487957f, -0.454682f, -0.405665f, -0.339390f, -0.252979f, -0.154344f, -0.052502f, 0.048489f, 0.143632f, 0.226516f, 0.295187f, 0.351028f, 0.394089f, 0.425052f, 0.447704f, 0.464623f, 0.474693f, 0.477963f, 0.477681f, 0.475121f, 0.467826f, 0.454724f, 0.437798f, 0.418152f, 0.395857f, 0.373745f, 0.355940f, 0.342815f, 0.331856f, 0.322189f, 0.313867f, 0.304823f, 0.293125f, 0.280092f, 0.267362f, 0.253770f, 0.238552f, 0.223882f, 0.210719f, 0.196308f, 0.179088f, 0.161285f, 0.143372f, 0.121745f, 0.095725f, 0.069936f, 0.044076f, 0.008055f, -0.042005f, -0.085674f, -0.088660f, -0.037890f}, + { 0.005973f, -0.001416f, -0.045800f, -0.099150f, -0.109299f, -0.059292f, 0.001039f, 0.004764f, -0.052550f, -0.109926f, -0.118088f, -0.081582f, -0.016964f, 0.073434f, 0.150725f, 0.125706f, -0.026114f, -0.169539f, -0.128661f, 0.090155f, 0.279655f, 0.263749f, 0.075346f, -0.131939f, -0.272993f, -0.368065f, -0.444884f, -0.489466f, -0.487957f, -0.454682f, -0.405665f, -0.339390f, -0.252979f, -0.154344f, -0.052502f, 0.048489f, 0.143632f, 0.226516f, 0.295187f, 0.351028f, 0.394089f, 0.425052f, 0.447704f, 0.464623f, 0.474693f, 0.477963f, 0.477681f, 0.475121f, 0.467826f, 0.454724f, 0.437798f, 0.418152f, 0.395857f, 0.373745f, 0.355940f, 0.342815f, 0.331856f, 0.322189f, 0.313867f, 0.304823f, 0.293125f, 0.280092f, 0.267362f, 0.253770f, 0.238552f, 0.223882f, 0.210719f, 0.196308f, 0.179088f, 0.161285f, 0.143372f, 0.121745f, 0.095725f, 0.069936f, 0.044076f, 0.008055f, -0.042005f, -0.085674f, -0.088660f, -0.037890f} + }, + { + { -0.004434f, -0.004101f, 0.011236f, 0.025203f, 0.019806f, 0.001597f, -0.006647f, -0.003102f, -0.018186f, -0.077431f, -0.161881f, -0.209978f, -0.155425f, 0.015003f, 0.208989f, 0.259800f, 0.084031f, -0.179896f, -0.269483f, -0.079015f, 0.215424f, 0.357678f, 0.278152f, 0.099699f, -0.058114f, -0.180673f, -0.286537f, -0.359113f, -0.378791f, -0.360714f, -0.328350f, -0.283730f, -0.223043f, -0.154424f, -0.085113f, -0.011153f, 0.069195f, 0.146411f, 0.210268f, 0.258185f, 0.290989f, 0.310397f, 0.321311f, 0.328850f, 0.333862f, 0.336132f, 0.338054f, 0.340622f, 0.340800f, 0.336748f, 0.330523f, 0.323257f, 0.313600f, 0.302440f, 0.293034f, 0.285845f, 0.278952f, 0.272797f, 0.268758f, 0.264967f, 0.259214f, 0.253039f, 0.247703f, 0.240380f, 0.229389f, 0.217820f, 0.207144f, 0.193744f, 0.176271f, 0.158660f, 0.141444f, 0.119286f, 0.091743f, 0.065323f, 0.038472f, -0.002614f, -0.061009f, -0.109488f, -0.108302f, -0.045399f}, + { 0.004434f, 0.004101f, -0.011236f, -0.025203f, -0.019806f, -0.001597f, 0.006647f, 0.003102f, 0.018186f, 0.077431f, 0.161881f, 0.209978f, 0.155425f, -0.015003f, -0.208989f, -0.259800f, -0.084031f, 0.179896f, 0.269483f, 0.079015f, -0.215424f, -0.357678f, -0.278152f, -0.099699f, 0.058114f, 0.180673f, 0.286537f, 0.359113f, 0.378791f, 0.360714f, 0.328350f, 0.283730f, 0.223043f, 0.154424f, 0.085113f, 0.011153f, -0.069195f, -0.146411f, -0.210268f, -0.258185f, -0.290989f, -0.310397f, -0.321311f, -0.328850f, -0.333862f, -0.336132f, -0.338054f, -0.340622f, -0.340800f, -0.336748f, -0.330523f, -0.323257f, -0.313600f, -0.302440f, -0.293034f, -0.285845f, -0.278952f, -0.272797f, -0.268758f, -0.264967f, -0.259214f, -0.253039f, -0.247703f, -0.240380f, -0.229389f, -0.217820f, -0.207144f, -0.193744f, -0.176271f, -0.158660f, -0.141444f, -0.119286f, -0.091743f, -0.065323f, -0.038472f, 0.002614f, 0.061009f, 0.109488f, 0.108302f, 0.045399f} + }, + { + { -0.022223f, -0.023532f, 0.026143f, 0.036395f, -0.022129f, -0.046557f, 0.045156f, 0.166015f, 0.154331f, -0.014356f, -0.190818f, -0.223106f, -0.100545f, 0.070829f, 0.171310f, 0.137761f, 0.000653f, -0.117443f, -0.095181f, 0.054848f, 0.184857f, 0.177260f, 0.071288f, -0.011410f, -0.019128f, 0.008364f, 0.032900f, 0.058999f, 0.089829f, 0.105464f, 0.095113f, 0.070357f, 0.040449f, 0.004549f, -0.032060f, -0.060672f, -0.084976f, -0.112282f, -0.135857f, -0.144728f, -0.140958f, -0.131144f, -0.113768f, -0.089047f, -0.066562f, -0.051180f, -0.036343f, -0.018844f, -0.003461f, 0.010980f, 0.031603f, 0.056462f, 0.078228f, 0.100182f, 0.129600f, 0.161531f, 0.187796f, 0.212133f, 0.238638f, 0.258971f, 0.267587f, 0.272407f, 0.276295f, 0.269169f, 0.249535f, 0.228442f, 0.204681f, 0.165734f, 0.116242f, 0.071322f, 0.024434f, -0.038282f, -0.101208f, -0.144017f, -0.186203f, -0.247657f, -0.284781f, -0.238696f, -0.131685f, -0.036438f}, + { 0.022223f, 0.023532f, -0.026143f, -0.036395f, 0.022129f, 0.046557f, -0.045156f, -0.166015f, -0.154331f, 0.014356f, 0.190818f, 0.223106f, 0.100545f, -0.070829f, -0.171310f, -0.137761f, -0.000653f, 0.117443f, 0.095181f, -0.054848f, -0.184857f, -0.177260f, -0.071288f, 0.011410f, 0.019128f, -0.008364f, -0.032900f, -0.058999f, -0.089829f, -0.105464f, -0.095113f, -0.070357f, -0.040449f, -0.004549f, 0.032060f, 0.060672f, 0.084976f, 0.112282f, 0.135857f, 0.144728f, 0.140958f, 0.131144f, 0.113768f, 0.089047f, 0.066562f, 0.051180f, 0.036343f, 0.018844f, 0.003461f, -0.010980f, -0.031603f, -0.056462f, -0.078228f, -0.100182f, -0.129600f, -0.161531f, -0.187796f, -0.212133f, -0.238638f, -0.258971f, -0.267587f, -0.272407f, -0.276295f, -0.269169f, -0.249535f, -0.228442f, -0.204681f, -0.165734f, -0.116242f, -0.071322f, -0.024434f, 0.038282f, 0.101208f, 0.144017f, 0.186203f, 0.247657f, 0.284781f, 0.238696f, 0.131685f, 0.036438f} + }, + { + { 0.003862f, -0.005550f, -0.035219f, -0.050424f, -0.039835f, -0.034124f, -0.043985f, -0.024194f, 0.069437f, 0.217796f, 0.352478f, 0.391419f, 0.253518f, -0.070759f, -0.406493f, -0.459708f, -0.129673f, 0.296657f, 0.414245f, 0.156646f, -0.158625f, -0.243467f, -0.132649f, -0.019223f, 0.029037f, 0.069156f, 0.114565f, 0.114517f, 0.063159f, 0.016167f, 0.005053f, 0.009585f, 0.010376f, 0.011826f, 0.014968f, 0.010184f, -0.002825f, -0.015268f, -0.025795f, -0.038657f, -0.052993f, -0.066906f, -0.082812f, -0.100047f, -0.112689f, -0.119957f, -0.127651f, -0.136984f, -0.143527f, -0.147285f, -0.152286f, -0.157533f, -0.158902f, -0.157091f, -0.154423f, -0.148374f, -0.136396f, -0.121265f, -0.105059f, -0.085015f, -0.060285f, -0.034399f, -0.007734f, 0.023017f, 0.056440f, 0.087696f, 0.117449f, 0.148415f, 0.176241f, 0.195804f, 0.210603f, 0.223157f, 0.225976f, 0.215951f, 0.201691f, 0.178640f, 0.121187f, 0.030102f, -0.036777f, -0.026855f}, + { 0.003862f, -0.005550f, -0.035219f, -0.050424f, -0.039835f, -0.034124f, -0.043985f, -0.024194f, 0.069437f, 0.217796f, 0.352478f, 0.391419f, 0.253518f, -0.070759f, -0.406493f, -0.459708f, -0.129673f, 0.296657f, 0.414245f, 0.156646f, -0.158625f, -0.243467f, -0.132649f, -0.019223f, 0.029037f, 0.069156f, 0.114565f, 0.114517f, 0.063159f, 0.016167f, 0.005053f, 0.009585f, 0.010376f, 0.011826f, 0.014968f, 0.010184f, -0.002825f, -0.015268f, -0.025795f, -0.038657f, -0.052993f, -0.066906f, -0.082812f, -0.100047f, -0.112689f, -0.119957f, -0.127651f, -0.136984f, -0.143527f, -0.147285f, -0.152286f, -0.157533f, -0.158902f, -0.157091f, -0.154423f, -0.148374f, -0.136396f, -0.121265f, -0.105059f, -0.085015f, -0.060285f, -0.034399f, -0.007734f, 0.023017f, 0.056440f, 0.087696f, 0.117449f, 0.148415f, 0.176241f, 0.195804f, 0.210603f, 0.223157f, 0.225976f, 0.215951f, 0.201691f, 0.178640f, 0.121187f, 0.030102f, -0.036777f, -0.026855f} + }, + { + { -0.035270f, -0.081929f, -0.072328f, -0.003387f, 0.102081f, 0.191567f, 0.193107f, 0.075847f, -0.091649f, -0.185816f, -0.151954f, -0.053283f, 0.018945f, 0.043102f, 0.046927f, 0.035757f, -0.003446f, -0.048321f, -0.051509f, -0.007303f, 0.037527f, 0.047720f, 0.038011f, 0.037503f, 0.047149f, 0.048355f, 0.032027f, 0.002560f, -0.034692f, -0.076149f, -0.115107f, -0.143065f, -0.156385f, -0.159333f, -0.159978f, -0.162529f, -0.164023f, -0.159091f, -0.145532f, -0.123554f, -0.093928f, -0.060439f, -0.029679f, -0.004678f, 0.017022f, 0.036928f, 0.053244f, 0.066453f, 0.079933f, 0.093680f, 0.104712f, 0.113731f, 0.123664f, 0.133021f, 0.138757f, 0.142838f, 0.147926f, 0.150992f, 0.149042f, 0.145156f, 0.141793f, 0.135931f, 0.127005f, 0.120124f, 0.116637f, 0.112583f, 0.108976f, 0.110492f, 0.114119f, 0.114315f, 0.115877f, 0.124115f, 0.130358f, 0.128184f, 0.129646f, 0.137654f, 0.122241f, 0.064040f, 0.002466f, -0.010057f}, + { -0.035270f, -0.081929f, -0.072328f, -0.003387f, 0.102081f, 0.191567f, 0.193107f, 0.075847f, -0.091649f, -0.185816f, -0.151954f, -0.053283f, 0.018945f, 0.043102f, 0.046927f, 0.035757f, -0.003446f, -0.048321f, -0.051509f, -0.007303f, 0.037527f, 0.047720f, 0.038011f, 0.037503f, 0.047149f, 0.048355f, 0.032027f, 0.002560f, -0.034692f, -0.076149f, -0.115107f, -0.143065f, -0.156385f, -0.159333f, -0.159978f, -0.162529f, -0.164023f, -0.159091f, -0.145532f, -0.123554f, -0.093928f, -0.060439f, -0.029679f, -0.004678f, 0.017022f, 0.036928f, 0.053244f, 0.066453f, 0.079933f, 0.093680f, 0.104712f, 0.113731f, 0.123664f, 0.133021f, 0.138757f, 0.142838f, 0.147926f, 0.150992f, 0.149042f, 0.145156f, 0.141793f, 0.135931f, 0.127005f, 0.120124f, 0.116637f, 0.112583f, 0.108976f, 0.110492f, 0.114119f, 0.114315f, 0.115877f, 0.124115f, 0.130358f, 0.128184f, 0.129646f, 0.137654f, 0.122241f, 0.064040f, 0.002466f, -0.010057f} + }, + { + { 0.042625f, 0.061776f, -0.027586f, -0.143182f, -0.223451f, -0.283569f, -0.301376f, -0.181308f, 0.100838f, 0.422023f, 0.640790f, 0.689329f, 0.491852f, -0.012830f, -0.619485f, -0.827479f, -0.346691f, 0.439982f, 0.806159f, 0.485676f, -0.097985f, -0.426002f, -0.432106f, -0.359643f, -0.337508f, -0.308023f, -0.233735f, -0.160655f, -0.109291f, -0.046792f, 0.036163f, 0.109928f, 0.161438f, 0.204028f, 0.240207f, 0.258404f, 0.257802f, 0.246553f, 0.225745f, 0.195126f, 0.162764f, 0.135196f, 0.109277f, 0.081673f, 0.055076f, 0.030942f, 0.007082f, -0.015502f, -0.032778f, -0.044893f, -0.055922f, -0.067781f, -0.079963f, -0.092783f, -0.106544f, -0.120012f, -0.132352f, -0.144019f, -0.154792f, -0.163557f, -0.170153f, -0.175219f, -0.178738f, -0.180172f, -0.179230f, -0.175923f, -0.170545f, -0.163212f, -0.153389f, -0.141450f, -0.129644f, -0.118625f, -0.105868f, -0.091562f, -0.079757f, -0.066681f, -0.038738f, 0.003573f, 0.031128f, 0.017989f}, + { 0.042625f, 0.061776f, -0.027586f, -0.143182f, -0.223451f, -0.283569f, -0.301376f, -0.181308f, 0.100838f, 0.422023f, 0.640790f, 0.689329f, 0.491852f, -0.012830f, -0.619485f, -0.827479f, -0.346691f, 0.439982f, 0.806159f, 0.485676f, -0.097985f, -0.426002f, -0.432106f, -0.359643f, -0.337508f, -0.308023f, -0.233735f, -0.160655f, -0.109291f, -0.046792f, 0.036163f, 0.109928f, 0.161438f, 0.204028f, 0.240207f, 0.258404f, 0.257802f, 0.246553f, 0.225745f, 0.195126f, 0.162764f, 0.135196f, 0.109277f, 0.081673f, 0.055076f, 0.030942f, 0.007082f, -0.015502f, -0.032778f, -0.044893f, -0.055922f, -0.067781f, -0.079963f, -0.092783f, -0.106544f, -0.120012f, -0.132352f, -0.144019f, -0.154792f, -0.163557f, -0.170153f, -0.175219f, -0.178738f, -0.180172f, -0.179230f, -0.175923f, -0.170545f, -0.163212f, -0.153389f, -0.141450f, -0.129644f, -0.118625f, -0.105868f, -0.091562f, -0.079757f, -0.066681f, -0.038738f, 0.003573f, 0.031128f, 0.017989f} + }, + { + { 0.004986f, 0.021455f, 0.046135f, 0.071785f, 0.092466f, 0.080954f, -0.003158f, -0.145617f, -0.276633f, -0.362866f, -0.395355f, -0.264738f, 0.149265f, 0.651373f, 0.736434f, 0.177675f, -0.547090f, -0.726833f, -0.253845f, 0.306337f, 0.459460f, 0.280374f, 0.109965f, 0.067554f, 0.043904f, -0.021849f, -0.075554f, -0.085260f, -0.084048f, -0.090241f, -0.083218f, -0.055049f, -0.024749f, -0.004212f, 0.011330f, 0.024407f, 0.032551f, 0.037896f, 0.043132f, 0.045153f, 0.042454f, 0.040083f, 0.040807f, 0.040467f, 0.036682f, 0.033444f, 0.033537f, 0.034430f, 0.034508f, 0.036228f, 0.040565f, 0.044452f, 0.045834f, 0.046017f, 0.045496f, 0.042430f, 0.036603f, 0.030268f, 0.024047f, 0.016450f, 0.007946f, 0.000698f, -0.005855f, -0.013972f, -0.022632f, -0.029204f, -0.034902f, -0.042227f, -0.049092f, -0.052708f, -0.056008f, -0.061987f, -0.066609f, -0.066985f, -0.069150f, -0.074874f, -0.070084f, -0.044292f, -0.013242f, -0.000130f}, + { -0.004986f, -0.021455f, -0.046135f, -0.071785f, -0.092466f, -0.080954f, 0.003158f, 0.145617f, 0.276633f, 0.362866f, 0.395355f, 0.264738f, -0.149265f, -0.651373f, -0.736434f, -0.177675f, 0.547090f, 0.726833f, 0.253845f, -0.306337f, -0.459460f, -0.280374f, -0.109965f, -0.067554f, -0.043904f, 0.021849f, 0.075554f, 0.085260f, 0.084048f, 0.090241f, 0.083218f, 0.055049f, 0.024749f, 0.004212f, -0.011330f, -0.024407f, -0.032551f, -0.037896f, -0.043132f, -0.045153f, -0.042454f, -0.040083f, -0.040807f, -0.040467f, -0.036682f, -0.033444f, -0.033537f, -0.034430f, -0.034508f, -0.036228f, -0.040565f, -0.044452f, -0.045834f, -0.046017f, -0.045496f, -0.042430f, -0.036603f, -0.030268f, -0.024047f, -0.016450f, -0.007946f, -0.000698f, 0.005855f, 0.013972f, 0.022632f, 0.029204f, 0.034902f, 0.042227f, 0.049092f, 0.052708f, 0.056008f, 0.061987f, 0.066609f, 0.066985f, 0.069150f, 0.074874f, 0.070084f, 0.044292f, 0.013242f, 0.000130f} + }, + { + { 0.003402f, 0.004407f, -0.006051f, -0.025050f, -0.041008f, -0.025966f, 0.043136f, 0.128240f, 0.134022f, 0.020795f, -0.115019f, -0.140061f, -0.049669f, 0.036681f, 0.041074f, 0.008186f, 0.004784f, 0.019218f, 0.006249f, -0.026881f, -0.037864f, -0.021977f, -0.013202f, -0.024484f, -0.031445f, -0.015937f, 0.008115f, 0.019221f, 0.014829f, 0.004287f, -0.008269f, -0.023585f, -0.039009f, -0.049334f, -0.052310f, -0.048822f, -0.040627f, -0.030481f, -0.021172f, -0.012355f, -0.001360f, 0.011724f, 0.023165f, 0.030522f, 0.034690f, 0.036621f, 0.036317f, 0.035645f, 0.037782f, 0.043224f, 0.050040f, 0.057691f, 0.066656f, 0.075380f, 0.081835f, 0.086743f, 0.091441f, 0.094789f, 0.095756f, 0.095987f, 0.096430f, 0.095207f, 0.091675f, 0.088019f, 0.084731f, 0.079935f, 0.074369f, 0.070712f, 0.067983f, 0.063773f, 0.060332f, 0.060178f, 0.059510f, 0.055794f, 0.055006f, 0.058300f, 0.051108f, 0.024257f, -0.003223f, -0.006390f}, + { -0.003402f, -0.004407f, 0.006051f, 0.025050f, 0.041008f, 0.025966f, -0.043136f, -0.128240f, -0.134022f, -0.020795f, 0.115019f, 0.140061f, 0.049669f, -0.036681f, -0.041074f, -0.008186f, -0.004784f, -0.019218f, -0.006249f, 0.026881f, 0.037864f, 0.021977f, 0.013202f, 0.024484f, 0.031445f, 0.015937f, -0.008115f, -0.019221f, -0.014829f, -0.004287f, 0.008269f, 0.023585f, 0.039009f, 0.049334f, 0.052310f, 0.048822f, 0.040627f, 0.030481f, 0.021172f, 0.012355f, 0.001360f, -0.011724f, -0.023165f, -0.030522f, -0.034690f, -0.036621f, -0.036317f, -0.035645f, -0.037782f, -0.043224f, -0.050040f, -0.057691f, -0.066656f, -0.075380f, -0.081835f, -0.086743f, -0.091441f, -0.094789f, -0.095756f, -0.095987f, -0.096430f, -0.095207f, -0.091675f, -0.088019f, -0.084731f, -0.079935f, -0.074369f, -0.070712f, -0.067983f, -0.063773f, -0.060332f, -0.060178f, -0.059510f, -0.055794f, -0.055006f, -0.058300f, -0.051108f, -0.024257f, 0.003223f, 0.006390f} + }, + { + { 0.011580f, 0.033110f, 0.035997f, 0.009825f, -0.002131f, 0.048826f, 0.111220f, 0.054933f, -0.161075f, -0.387225f, -0.394599f, -0.096964f, 0.326957f, 0.540354f, 0.341380f, -0.107676f, -0.401640f, -0.303987f, 0.014646f, 0.211430f, 0.166588f, 0.034676f, -0.031854f, -0.045160f, -0.063992f, -0.070171f, -0.028788f, 0.028095f, 0.049715f, 0.042124f, 0.043372f, 0.063906f, 0.090684f, 0.118564f, 0.146170f, 0.162760f, 0.160684f, 0.145656f, 0.124864f, 0.099606f, 0.072825f, 0.049131f, 0.026964f, 0.002608f, -0.021547f, -0.042454f, -0.063121f, -0.085674f, -0.106502f, -0.124513f, -0.144021f, -0.165318f, -0.183168f, -0.196174f, -0.206536f, -0.211896f, -0.208932f, -0.201414f, -0.193839f, -0.183228f, -0.166803f, -0.148575f, -0.129851f, -0.105037f, -0.073501f, -0.041507f, -0.008652f, 0.030592f, 0.071399f, 0.104577f, 0.134417f, 0.167669f, 0.193709f, 0.202800f, 0.208008f, 0.214079f, 0.187614f, 0.107244f, 0.021441f, -0.005911f}, + { -0.011580f, -0.033110f, -0.035997f, -0.009825f, 0.002131f, -0.048826f, -0.111220f, -0.054933f, 0.161075f, 0.387225f, 0.394599f, 0.096964f, -0.326957f, -0.540354f, -0.341380f, 0.107676f, 0.401640f, 0.303987f, -0.014646f, -0.211430f, -0.166588f, -0.034676f, 0.031854f, 0.045160f, 0.063992f, 0.070171f, 0.028788f, -0.028095f, -0.049715f, -0.042124f, -0.043372f, -0.063906f, -0.090684f, -0.118564f, -0.146170f, -0.162760f, -0.160684f, -0.145656f, -0.124864f, -0.099606f, -0.072825f, -0.049131f, -0.026964f, -0.002608f, 0.021547f, 0.042454f, 0.063121f, 0.085674f, 0.106502f, 0.124513f, 0.144021f, 0.165318f, 0.183168f, 0.196174f, 0.206536f, 0.211896f, 0.208932f, 0.201414f, 0.193839f, 0.183228f, 0.166803f, 0.148575f, 0.129851f, 0.105037f, 0.073501f, 0.041507f, 0.008652f, -0.030592f, -0.071399f, -0.104577f, -0.134417f, -0.167669f, -0.193709f, -0.202800f, -0.208008f, -0.214079f, -0.187614f, -0.107244f, -0.021441f, 0.005911f} + }, + { + { 0.000353f, 0.004850f, 0.016938f, 0.030564f, 0.032073f, 0.012264f, -0.025611f, -0.068068f, -0.092183f, -0.069650f, 0.005117f, 0.085764f, 0.102915f, 0.040391f, -0.040399f, -0.070602f, -0.045658f, -0.007020f, 0.021199f, 0.044834f, 0.064788f, 0.066750f, 0.047115f, 0.022488f, 0.005813f, -0.010554f, -0.039993f, -0.079586f, -0.110633f, -0.117382f, -0.099825f, -0.069651f, -0.039484f, -0.017639f, -0.007327f, -0.005072f, -0.002356f, 0.005931f, 0.016176f, 0.022381f, 0.023972f, 0.023436f, 0.021218f, 0.017720f, 0.015438f, 0.014768f, 0.012536f, 0.007496f, 0.001618f, -0.005392f, -0.015987f, -0.028902f, -0.040848f, -0.053077f, -0.068452f, -0.084551f, -0.097679f, -0.109499f, -0.121805f, -0.130797f, -0.134202f, -0.136272f, -0.138859f, -0.137270f, -0.130628f, -0.124399f, -0.118371f, -0.106102f, -0.088590f, -0.072164f, -0.053226f, -0.024390f, 0.007484f, 0.032334f, 0.059271f, 0.098873f, 0.130378f, 0.121254f, 0.074924f, 0.023150f}, + { 0.000353f, 0.004850f, 0.016938f, 0.030564f, 0.032073f, 0.012264f, -0.025611f, -0.068068f, -0.092183f, -0.069650f, 0.005117f, 0.085764f, 0.102915f, 0.040391f, -0.040399f, -0.070602f, -0.045658f, -0.007020f, 0.021199f, 0.044834f, 0.064788f, 0.066750f, 0.047115f, 0.022488f, 0.005813f, -0.010554f, -0.039993f, -0.079586f, -0.110633f, -0.117382f, -0.099825f, -0.069651f, -0.039484f, -0.017639f, -0.007327f, -0.005072f, -0.002356f, 0.005931f, 0.016176f, 0.022381f, 0.023972f, 0.023436f, 0.021218f, 0.017720f, 0.015438f, 0.014768f, 0.012536f, 0.007496f, 0.001618f, -0.005392f, -0.015987f, -0.028902f, -0.040848f, -0.053077f, -0.068452f, -0.084551f, -0.097679f, -0.109499f, -0.121805f, -0.130797f, -0.134202f, -0.136272f, -0.138859f, -0.137270f, -0.130628f, -0.124399f, -0.118371f, -0.106102f, -0.088590f, -0.072164f, -0.053226f, -0.024390f, 0.007484f, 0.032334f, 0.059271f, 0.098873f, 0.130378f, 0.121254f, 0.074924f, 0.023150f} + }, + { + { 0.003395f, 0.020426f, 0.045976f, 0.052329f, 0.026661f, -0.019555f, -0.077123f, -0.131965f, -0.135946f, -0.043667f, 0.104469f, 0.189095f, 0.135481f, -0.001437f, -0.101563f, -0.101652f, -0.032058f, 0.036129f, 0.050140f, 0.004006f, -0.059414f, -0.081736f, -0.043298f, 0.021078f, 0.066283f, 0.080513f, 0.077331f, 0.066832f, 0.051569f, 0.035939f, 0.022351f, 0.005726f, -0.017489f, -0.041778f, -0.060670f, -0.074727f, -0.086452f, -0.094598f, -0.097466f, -0.096127f, -0.092430f, -0.088340f, -0.086838f, -0.089337f, -0.093915f, -0.098990f, -0.105183f, -0.111202f, -0.112934f, -0.108926f, -0.101596f, -0.092150f, -0.080152f, -0.067970f, -0.059163f, -0.053214f, -0.047722f, -0.043425f, -0.041320f, -0.038708f, -0.033546f, -0.027639f, -0.020974f, -0.009681f, 0.006590f, 0.023443f, 0.040235f, 0.060007f, 0.080112f, 0.094580f, 0.105031f, 0.116178f, 0.123880f, 0.123088f, 0.120984f, 0.122633f, 0.112565f, 0.076090f, 0.030569f, 0.005103f}, + { 0.003395f, 0.020426f, 0.045976f, 0.052329f, 0.026661f, -0.019555f, -0.077123f, -0.131965f, -0.135946f, -0.043667f, 0.104469f, 0.189095f, 0.135481f, -0.001437f, -0.101563f, -0.101652f, -0.032058f, 0.036129f, 0.050140f, 0.004006f, -0.059414f, -0.081736f, -0.043298f, 0.021078f, 0.066283f, 0.080513f, 0.077331f, 0.066832f, 0.051569f, 0.035939f, 0.022351f, 0.005726f, -0.017489f, -0.041778f, -0.060670f, -0.074727f, -0.086452f, -0.094598f, -0.097466f, -0.096127f, -0.092430f, -0.088340f, -0.086838f, -0.089337f, -0.093915f, -0.098990f, -0.105183f, -0.111202f, -0.112934f, -0.108926f, -0.101596f, -0.092150f, -0.080152f, -0.067970f, -0.059163f, -0.053214f, -0.047722f, -0.043425f, -0.041320f, -0.038708f, -0.033546f, -0.027639f, -0.020974f, -0.009681f, 0.006590f, 0.023443f, 0.040235f, 0.060007f, 0.080112f, 0.094580f, 0.105031f, 0.116178f, 0.123880f, 0.123088f, 0.120984f, 0.122633f, 0.112565f, 0.076090f, 0.030569f, 0.005103f} + }, + { + { -0.008000f, -0.013983f, -0.007789f, -0.005223f, -0.001470f, 0.026111f, 0.057750f, 0.020944f, -0.107461f, -0.216369f, -0.156456f, 0.061682f, 0.235845f, 0.190009f, -0.018294f, -0.169020f, -0.135958f, -0.002906f, 0.078713f, 0.072889f, 0.055366f, 0.076663f, 0.100261f, 0.075548f, 0.012307f, -0.044797f, -0.080708f, -0.114873f, -0.158404f, -0.198177f, -0.219465f, -0.220285f, -0.203282f, -0.171611f, -0.133886f, -0.099826f, -0.070822f, -0.043728f, -0.020140f, -0.003424f, 0.007885f, 0.015626f, 0.017347f, 0.012913f, 0.008483f, 0.008293f, 0.010362f, 0.013895f, 0.021659f, 0.032566f, 0.041674f, 0.048599f, 0.056239f, 0.062372f, 0.062643f, 0.058926f, 0.054923f, 0.048525f, 0.037890f, 0.027863f, 0.021734f, 0.015808f, 0.009301f, 0.007997f, 0.012479f, 0.016621f, 0.021242f, 0.032989f, 0.048955f, 0.061284f, 0.074399f, 0.095752f, 0.116342f, 0.126272f, 0.137340f, 0.157260f, 0.157611f, 0.110681f, 0.043883f, 0.006629f}, + { -0.008000f, -0.013983f, -0.007789f, -0.005223f, -0.001470f, 0.026111f, 0.057750f, 0.020944f, -0.107461f, -0.216369f, -0.156456f, 0.061682f, 0.235845f, 0.190009f, -0.018294f, -0.169020f, -0.135958f, -0.002906f, 0.078713f, 0.072889f, 0.055366f, 0.076663f, 0.100261f, 0.075548f, 0.012307f, -0.044797f, -0.080708f, -0.114873f, -0.158404f, -0.198177f, -0.219465f, -0.220285f, -0.203282f, -0.171611f, -0.133886f, -0.099826f, -0.070822f, -0.043728f, -0.020140f, -0.003424f, 0.007885f, 0.015626f, 0.017347f, 0.012913f, 0.008483f, 0.008293f, 0.010362f, 0.013895f, 0.021659f, 0.032566f, 0.041674f, 0.048599f, 0.056239f, 0.062372f, 0.062643f, 0.058926f, 0.054923f, 0.048525f, 0.037890f, 0.027863f, 0.021734f, 0.015808f, 0.009301f, 0.007997f, 0.012479f, 0.016621f, 0.021242f, 0.032989f, 0.048955f, 0.061284f, 0.074399f, 0.095752f, 0.116342f, 0.126272f, 0.137340f, 0.157260f, 0.157611f, 0.110681f, 0.043883f, 0.006629f} + }, + { + { 0.000244f, 0.000061f, -0.001224f, -0.003636f, -0.007582f, -0.009677f, -0.002431f, 0.010807f, 0.005905f, -0.032432f, -0.065824f, -0.025045f, 0.089641f, 0.163727f, 0.085925f, -0.093404f, -0.190444f, -0.100797f, 0.073761f, 0.153524f, 0.088072f, -0.021053f, -0.069934f, -0.051675f, -0.011931f, 0.023520f, 0.050716f, 0.061297f, 0.047832f, 0.018566f, -0.012127f, -0.038159f, -0.058406f, -0.071156f, -0.079212f, -0.090778f, -0.109603f, -0.130885f, -0.148610f, -0.160134f, -0.163490f, -0.157326f, -0.144051f, -0.128082f, -0.111790f, -0.096521f, -0.084775f, -0.077767f, -0.073706f, -0.071042f, -0.070160f, -0.070401f, -0.069434f, -0.066612f, -0.063128f, -0.058957f, -0.053631f, -0.049011f, -0.047099f, -0.046826f, -0.046713f, -0.047859f, -0.050655f, -0.052377f, -0.051505f, -0.049975f, -0.048302f, -0.043964f, -0.036939f, -0.030309f, -0.023615f, -0.013271f, -0.000672f, 0.009320f, 0.019077f, 0.036301f, 0.058484f, 0.069611f, 0.056538f, 0.021593f}, + { 0.000244f, 0.000061f, -0.001224f, -0.003636f, -0.007582f, -0.009677f, -0.002431f, 0.010807f, 0.005905f, -0.032432f, -0.065824f, -0.025045f, 0.089641f, 0.163727f, 0.085925f, -0.093404f, -0.190444f, -0.100797f, 0.073761f, 0.153524f, 0.088072f, -0.021053f, -0.069934f, -0.051675f, -0.011931f, 0.023520f, 0.050716f, 0.061297f, 0.047832f, 0.018566f, -0.012127f, -0.038159f, -0.058406f, -0.071156f, -0.079212f, -0.090778f, -0.109603f, -0.130885f, -0.148610f, -0.160134f, -0.163490f, -0.157326f, -0.144051f, -0.128082f, -0.111790f, -0.096521f, -0.084775f, -0.077767f, -0.073706f, -0.071042f, -0.070160f, -0.070401f, -0.069434f, -0.066612f, -0.063128f, -0.058957f, -0.053631f, -0.049011f, -0.047099f, -0.046826f, -0.046713f, -0.047859f, -0.050655f, -0.052377f, -0.051505f, -0.049975f, -0.048302f, -0.043964f, -0.036939f, -0.030309f, -0.023615f, -0.013271f, -0.000672f, 0.009320f, 0.019077f, 0.036301f, 0.058484f, 0.069611f, 0.056538f, 0.021593f} + } +}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; +#endif /* UPDATE_SBA_FILTER */ + + /********************** CRendBin_Combined_BRIR **********************/ -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER const float CRendBin_Combined_BRIR_latency_s = 0.000145834f; #else const float CRendBin_Combined_BRIR_latency_s = 0.000145833328133f; diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 64582a1672..8f0823dc7b 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -45,10 +45,14 @@ #ifndef _IVAS_ROM_BINAURAL_CREND_HEAD_ #define _IVAS_ROM_BINAURAL_CREND_HEAD_ +#ifndef UPDATE_SBA_FILTER #include #include "cnst.h" +#endif #include "ivas_cnst.h" +#ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 + /********************** CRendBin_Combined_HRIR **********************/ @@ -95,6 +99,10 @@ extern float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]; extern float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ + +#ifndef UPDATE_SBA_FILTER + /********************** CRendBin_HOA3_HRIR **********************/ @@ -141,6 +149,159 @@ extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]; extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* UPDATE_SBA_FILTER */ + +#ifdef UPDATE_SBA_FILTER + + +/********************** CRendBin_FOA_HRIR **********************/ + +extern float CRendBin_FOA_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_48kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_48kHz[4][BINAURAL_CHANNELS][240]; +extern float CRendBin_FOA_HRIR_coeff_im_48kHz[4][BINAURAL_CHANNELS][240]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_32kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_32kHz[4][BINAURAL_CHANNELS][160]; +extern float CRendBin_FOA_HRIR_coeff_im_32kHz[4][BINAURAL_CHANNELS][160]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_FOA_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_16kHz[4][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[4][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz[4]; +extern uint16_t *CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; +extern float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* UPDATE_SBA_FILTER */ + +#ifdef UPDATE_SBA_FILTER + + +/********************** CRendBin_HOA2_HRIR **********************/ + +extern float CRendBin_HOA2_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_48kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_48kHz[9][BINAURAL_CHANNELS][240]; +extern float CRendBin_HOA2_HRIR_coeff_im_48kHz[9][BINAURAL_CHANNELS][240]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_32kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_32kHz[9][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA2_HRIR_coeff_im_32kHz[9][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_HOA2_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_16kHz[9][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[9][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz[9]; +extern uint16_t *CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; +extern float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* UPDATE_SBA_FILTER */ + +#ifdef UPDATE_SBA_FILTER + + +/********************** CRendBin_HOA3_HRIR **********************/ + +extern float CRendBin_HOA3_HRIR_latency_s; + +/* Sample Rate = 48000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][240]; +extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][240]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 32000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][160]; +extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][160]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; + +/* Sample Rate = 16000 */ + +extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; +extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][1]; +extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; +extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; +extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; +extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; +extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; +extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; +#endif /* UPDATE_SBA_FILTER */ + + /********************** CRendBin_Combined_BRIR **********************/ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index ddfdcb6763..79ef75e470 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -165,14 +165,13 @@ void Euler2Quat( float cr = cosf( roll * 0.5f ); float sr = sinf( roll * 0.5f ); float cp = cosf( pitch * 0.5f ); - float sp = sinf( -pitch * 0.5f ); + float sp = sinf( pitch * 0.5f ); float cy = cosf( yaw * 0.5f ); float sy = sinf( yaw * 0.5f ); - - quat->w = cr * cp * cy - sr * sp * sy; - quat->x = sr * cp * cy + cr * sp * sy; - quat->y = cr * sp * cy - sr * cp * sy; - quat->z = cr * cp * sy + sr * sp * cy; + quat->w = cr * cp * cy + sr * sp * sy; + quat->x = sr * cp * cy - cr * sp * sy; + quat->y = sr * cp * sy + cr * sp * cy; + quat->z = cr * cp * sy - sr * sp * cy; return; } @@ -251,10 +250,14 @@ void rotateAziEle( void rotateFrame_shd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const int16_t subframe_idx /* i : subframe index */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ +#else + float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ +#endif + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, l, n, m; @@ -354,11 +357,15 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const int16_t subframe_idx /* i : subframe index */ +#ifdef JBM_TSM_ON_TCS + float *output[], /* i/o: unrotated SD signal buffer in TD */ +#else + float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ +#endif + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, j; @@ -492,7 +499,10 @@ void rotateFrame_shd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ - const int16_t shd_rot_max_order /* i : split-order rotation method */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif + const int16_t shd_rot_max_order /* i : split-order rotation method */ ) { int16_t n = 0; @@ -515,7 +525,11 @@ void rotateFrame_shd_cldfb( SHrotmatgen( SHrotmat, Rmat, shd_rot_max_order ); /* rotation by mtx multiplication */ +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < numTimeSlots; i++ ) +#else for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) +#endif { for ( iBand = 0; iBand < CLDFB_NO_CHANNELS_MAX; iBand++ ) { @@ -586,7 +600,10 @@ void rotateFrame_sd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const int16_t nb_band /* i : number of CLDFB bands to process */ +#ifdef JBM_TSM_ON_TCS + const int16_t numTimeSlots, /* i : number of time slots to process */ +#endif + const int16_t nb_band /* i : number of CLDFB bands to process */ ) { int16_t iBlock, iBand, m, n; @@ -644,7 +661,11 @@ void rotateFrame_sd_cldfb( p_imagRot = imagRot[n]; if ( g1 > 0.f ) { +#ifdef JBM_TSM_ON_TCS + for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ ) +#else for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) +#endif { p_real = Cldfb_RealBuffer[m][iBlock]; p_imag = Cldfb_ImagBuffer[m][iBlock]; @@ -664,7 +685,11 @@ void rotateFrame_sd_cldfb( { p_realRot = realRot[n]; p_imagRot = imagRot[n]; +#ifdef JBM_TSM_ON_TCS + for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ ) +#else for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) +#endif { p_real = Cldfb_RealBuffer[n][iBlock]; p_imag = Cldfb_ImagBuffer[n][iBlock]; diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index 8fd10d83ba..059cd847e1 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -51,11 +51,10 @@ *-------------------------------------------------------------------*/ void ivas_sba_prototype_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ - float inRe[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ - float inIm[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ - const int16_t firstSubframe, /* i : First subframe to map */ - const int16_t nSubframes /* i : Number of subframes to map */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, imag */ + const int16_t subframe /* i : Subframe to render */ ) { float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; @@ -66,8 +65,10 @@ void ivas_sba_prototype_renderer( int16_t num_cldfb_bands, numch_in, numch_out; int16_t cldfb_band; int16_t out_ch, in_ch; - int16_t firstSlot, slotEnd, firstInCh, inChEnd, firstOutCh, outChEnd; - int16_t sf_idx; + int16_t firstInCh, inChEnd, firstOutCh, outChEnd; +#ifdef JBM_TSM_ON_TCS + int16_t slot_idx_start, md_idx; +#endif push_wmops( "ivas_sba_prototype_renderer" ); @@ -75,12 +76,12 @@ void ivas_sba_prototype_renderer( hDecoderConfig = st_ivas->hDecoderConfig; num_spar_bands = hSpar->hFbMixer->pFb->filterbank_num_bands; - firstSlot = firstSubframe * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); - slotEnd = ( firstSubframe + nSubframes ) * ( CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES ); - num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; +#ifdef JBM_TSM_ON_TCS + slot_idx_start = hSpar->slots_rendered; +#endif if ( st_ivas->nchan_transport == 1 ) { @@ -98,10 +99,19 @@ void ivas_sba_prototype_renderer( } /* Apply mixing matrix */ - for ( ts = firstSlot; ts < slotEnd; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) +#else + for ( ts = 0; ts < CLDFB_SLOTS_PER_SUBFRAME; ts++ ) +#endif { /* determine SPAR parameters for this time slot */ - ivas_spar_get_parameters( hSpar, hDecoderConfig, ts, numch_out, numch_in, num_spar_bands, mixer_mat ); +#ifdef JBM_TSM_ON_TCS + md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; + ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); +#else + ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + subframe * CLDFB_SLOTS_PER_SUBFRAME, numch_out, numch_in, num_spar_bands, mixer_mat ); +#endif for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) { @@ -145,10 +155,12 @@ void ivas_sba_prototype_renderer( } } +#ifdef JBM_TSM_ON_TCS /* Update mixing matrices */ - if ( ( ( ts + 1 ) % MAX_PARAM_SPATIAL_SUBFRAMES ) == 0 ) + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) { - sf_idx = ts / MAX_PARAM_SPATIAL_SUBFRAMES; + /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ + int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; hSpar->i_subframe++; hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); @@ -162,17 +174,43 @@ void ivas_sba_prototype_renderer( { for ( b = 0; b < num_spar_bands; b++ ) { - hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + sf_idx * IVAS_MAX_NUM_BANDS]; + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; } } } } +#endif } +#ifndef JBM_TSM_ON_TCS + /* Update mixing matrices */ + hSpar->i_subframe++; + hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( b = 0; b < num_spar_bands; b++ ) + { + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + subframe * IVAS_MAX_NUM_BANDS]; + } + } + } +#endif + /* Create prototypes */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { - for ( ts = firstSlot; ts < slotEnd; ts++ ) +#ifdef JBM_TSM_ON_TCS + for ( ts = 0; ts < hSpar->subframe_nbslots[subframe]; ts++ ) +#else + for ( ts = 0; ts < CLDFB_SLOTS_PER_SUBFRAME; ts++ ) +#endif { if ( st_ivas->nchan_transport == 1 ) /* Dual mono */ { @@ -198,6 +236,10 @@ void ivas_sba_prototype_renderer( } } +#ifdef JBM_TSM_ON_TCS + hSpar->subframes_rendered++; + hSpar->slots_rendered += hSpar->subframe_nbslots[subframe]; +#endif pop_wmops(); return; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index a3308e23c2..877076db9a 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -228,7 +228,11 @@ typedef struct EFAP typedef struct ivas_orient_trk_state_t { +#ifdef FIX_439_OTR_PARAMS + HEAD_ORIENT_TRK_T orientation_tracking; +#else OTR_TRACKING_T trackingType; +#endif float centerAdaptationRate; float offCenterAdaptationRate; float adaptationAngle; @@ -604,9 +608,7 @@ typedef struct float mem_hrf_left[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; float mem_hrf_right[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; float Gain; -#ifdef FIX_379_GAININTP float prevGain; -#endif } TDREND_SRC_t; /* Top level TD binaural renderer handle */ @@ -699,6 +701,10 @@ typedef struct ivas_hrtfs_crend_structure { HRTFS_DATA *hHRTF_hrir_combined; HRTFS_DATA *hHRTF_hrir_hoa3; +#ifdef UPDATE_SBA_FILTER + HRTFS_DATA *hHRTF_hrir_hoa2; + HRTFS_DATA *hHRTF_hrir_foa; +#endif HRTFS_DATA *hHRTF_brir_combined; } HRTFS_CREND, *HRTFS_CREND_HANDLE; @@ -709,17 +715,43 @@ typedef struct ivas_hrtfs_crend_structure typedef struct ivas_hrtfs_fastconv_struct { float FASTCONV_HRIR_latency_s; +#ifdef UPDATE_SBA_FILTER + float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; + float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; + float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; + float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; +#else float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; +#endif float FASTCONV_HOA3_latency_s; +#ifdef UPDATE_SBA_FILTER + float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; + float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; + float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; + float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; +#else float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; +#endif +#ifdef UPDATE_SBA_FILTER + float FASTCONV_HOA2_latency_s; + float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; + float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; + float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; + float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; + float FASTCONV_FOA_latency_s; + float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; + float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; + float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; + float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; +#endif float FASTCONV_BRIR_latency_s; float leftBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; float leftBRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 7744a6582b..41f68b6520 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -118,6 +118,8 @@ typedef struct CREND_WRAPPER_HANDLE crendWrapper; REVERB_HANDLE hReverb; rotation_matrix rot_mat_prev; + int16_t nonDiegeticPan; + float nonDiegeticPanGain; } input_ism; typedef struct @@ -144,6 +146,8 @@ typedef struct CREND_WRAPPER_HANDLE crendWrapper; REVERB_HANDLE hReverb; rotation_gains rot_gains_prev; + int16_t nonDiegeticPan; + float nonDiegeticPanGain; lfe_routing lfeRouting; } input_mc; @@ -1010,6 +1014,7 @@ static IVAS_REND_AudioObjectPosition defaultObjectPosition( pos.radius = 1.0f; pos.yaw = 0.0f; pos.pitch = 0.0f; + pos.non_diegetic_flag = 0; return pos; } @@ -1615,7 +1620,16 @@ static ivas_error updateMcPanGainsForMcOut( inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_MONO || inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { - error = initMcPanGainsWithEfap( inputMc, outConfig ); + if ( ( inputMc->base.inConfig == IVAS_REND_AUDIO_CONFIG_MONO ) && ( inputMc->nonDiegeticPan ) ) + { + inputMc->panGains[0][0] = ( inputMc->nonDiegeticPanGain + 1.f ) * 0.5f; + inputMc->panGains[0][1] = 1.f - inputMc->panGains[0][0]; + error = IVAS_ERR_OK; + } + else + { + error = initMcPanGainsWithEfap( inputMc, outConfig ); + } } else if ( outConfig == IVAS_REND_AUDIO_CONFIG_MONO ) { @@ -1798,7 +1812,7 @@ static ivas_error initMcBinauralRendering( outSampleRate = *inputMc->base.ctx.pOutSampleRate; - /* TODO tmu : needs review allocate both renderers; needed if headrotation is toggled so the renderer can be switched */ + /* Needs optimization, see issue 513 */ // bool initTDRend; // initTDRend = false; // if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) @@ -2195,9 +2209,13 @@ static ivas_error initMasaDummyDecForMcOut( output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); decDummy->hDecoderConfig->output_config = output_config; + decDummy->sba_analysis_order = 1; + decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ +#ifndef SBA_MODE_CLEAN_UP + decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ +#endif + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); ivas_output_init( &( decDummy->hIntSetup ), output_config ); @@ -2279,8 +2297,12 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ +#ifndef SBA_MODE_CLEAN_UP + decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ +#endif + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + + decDummy->sba_analysis_order = 1; ivas_output_init( &( decDummy->hOutSetup ), output_config ); ivas_output_init( &( decDummy->hIntSetup ), output_config ); @@ -2348,9 +2370,13 @@ static ivas_error initMasaDummyDecForBinauralOut( output_config = decDummy->hDecoderConfig->output_config; + decDummy->sba_analysis_order = 1; + decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ +#ifndef SBA_MODE_CLEAN_UP + decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ +#endif + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); if ( output_config == AUDIO_CONFIG_BINAURAL ) @@ -2447,6 +2473,9 @@ static DecoderDummy *initDecoderDummy( decDummy->hDecoderConfig->output_Fs = sampleRate; decDummy->hDecoderConfig->nchan_out = numOutChannels; decDummy->hDecoderConfig->Opt_Headrotation = 0; +#ifdef JBM_TSM_ON_TCS + decDummy->hDecoderConfig->voip_active = 0; +#endif decDummy->hBinRenderer = NULL; decDummy->hEFAPdata = NULL; @@ -2458,10 +2487,18 @@ static DecoderDummy *initDecoderDummy( decDummy->hMasa = NULL; decDummy->hDiracDecBin = NULL; decDummy->hQMetaData = NULL; +#ifdef FIX_482_DUMMYDEC_INIT + decDummy->hHrtfParambin = NULL; + decDummy->hHeadTrackData = NULL; + decDummy->hDirAC = NULL; +#endif +#ifdef JBM_TSM_ON_TCS + decDummy->hTcBuffer = NULL; +#endif decDummy->hDecoderConfig->output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); decDummy->nchan_transport = numTransChannels; - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) + if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL ) { decDummy->hHeadTrackData = malloc( sizeof( HEAD_TRACK_DATA ) ); /* Initialise Rmat_prev to I, Rmat will be computed later */ @@ -2471,6 +2508,19 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData->Rmat_prev[i][i] = 1.0f; } +#ifdef FIX_482_DUMMYDEC_INIT + set_zero( decDummy->hHeadTrackData->chEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->chEneIIR[1], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->procChEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( decDummy->hHeadTrackData->procChEneIIR[1], MASA_FREQUENCY_BANDS ); + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + decDummy->hHeadTrackData->Quaternions[i].w = 1.0f; + decDummy->hHeadTrackData->Quaternions[i].x = 0.0f; + decDummy->hHeadTrackData->Quaternions[i].y = 0.0f; + decDummy->hHeadTrackData->Quaternions[i].z = 0.0f; + } +#endif decDummy->hHeadTrackData->num_quaternions = 0; decDummy->hHeadTrackData->lrSwitchInterpVal = 0.0f; decDummy->hHeadTrackData->lrSwitchedCurrent = 0; @@ -2494,6 +2544,11 @@ static DecoderDummy *initDecoderDummy( decDummy->hRenderConfig = NULL; } +#ifdef JBM_TSM_ON_TCS + /* get a default TC buffer, needed for some renderers */ + ivas_jbm_dec_tc_buffer_open( decDummy, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ); +#endif + decDummy->renderer_type = RENDERER_DISABLE; return decDummy; @@ -2601,6 +2656,11 @@ static void freeDecoderDummy( /* Parametric binaural renderer handle */ ivas_dirac_dec_close_binaural_data( &pDecDummy->hDiracDecBin ); +#ifdef JBM_TSM_ON_TCS + /* TC buffer */ + ivas_jbm_dec_tc_buffer_close( &pDecDummy->hTcBuffer ); +#endif + free( pDecDummy ); pDecDummy = NULL; @@ -2623,7 +2683,9 @@ static void clearInputMasa( ivas_error IVAS_REND_Open( IVAS_REND_HANDLE *phIvasRend, const int32_t outputSampleRate, - const IVAS_REND_AudioConfig outConfig ) + const IVAS_REND_AudioConfig outConfig, + const int16_t nonDiegeticPan, + const float nonDiegeticPanGain ) { int16_t i; IVAS_REND_HANDLE hIvasRend; @@ -2693,6 +2755,8 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsIsm[i].crendWrapper = NULL; hIvasRend->inputsIsm[i].hReverb = NULL; hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; + hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan; + hIvasRend->inputsIsm[i].nonDiegeticPanGain = nonDiegeticPanGain; } for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) @@ -2702,6 +2766,8 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsMc[i].crendWrapper = NULL; hIvasRend->inputsMc[i].hReverb = NULL; hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL; + hIvasRend->inputsMc[i].nonDiegeticPan = nonDiegeticPan; + hIvasRend->inputsMc[i].nonDiegeticPanGain = nonDiegeticPanGain; } for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) @@ -3728,6 +3794,9 @@ int16_t IVAS_REND_GetRenderConfig( hRCout->room_acoustics.nBands = hRCin->roomAcoustics.nBands; hRCout->room_acoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; hRCout->room_acoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; +#ifdef FIX_463_TD_RENDERER_DIRECTIVITY_RESET + mvr2r( hRCin->directivity, hRCout->directivity, 3 ); +#endif mvr2r( hRCin->roomAcoustics.pFc_input, hRCout->room_acoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); mvr2r( hRCin->roomAcoustics.pAcoustic_rt60, hRCout->room_acoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); @@ -3754,9 +3823,8 @@ int16_t IVAS_REND_FeedRenderConfig( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - hRenderConfig = hIvasRend->hRendererConfig; - mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 ); + #ifdef DEBUGGING hRenderConfig->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE; if ( renderConfig.renderer_type_override == IVAS_RENDER_TYPE_OVERRIDE_FASTCONV ) @@ -3777,6 +3845,7 @@ int16_t IVAS_REND_FeedRenderConfig( mvr2r( renderConfig.room_acoustics.pFc_input, hRenderConfig->roomAcoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); mvr2r( renderConfig.room_acoustics.pAcoustic_rt60, hRenderConfig->roomAcoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); mvr2r( renderConfig.room_acoustics.pAcoustic_dsr, hRenderConfig->roomAcoustics.pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX ); + mvr2r( renderConfig.directivity, hRenderConfig->directivity, 3 ); return IVAS_ERR_OK; } @@ -3845,9 +3914,16 @@ ivas_error IVAS_REND_SetHeadRotation( ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const uint8_t otrMode /* i : Orientation tracking mode */ +#ifdef FIX_439_OTR_PARAMS + const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ +#else + const uint8_t otrMode /* i : Orientation tracking mode */ +#endif ) { +#ifdef FIX_439_OTR_PARAMS + return ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, orientation_tracking ); +#else OTR_TRACKING_T mode; ivas_error error; @@ -3882,6 +3958,7 @@ ivas_error IVAS_REND_SetOrientationTrackingMode( } return IVAS_ERR_OK; +#endif } @@ -4313,7 +4390,6 @@ static ivas_error renderIsmToBinaural( copyBufferTo2dArray( ismInput->base.inputBuffer, tmpTDRendBuffer ); - /* TODO tmu : missing: interpolation between positions, 5ms rendering */ if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, @@ -4350,6 +4426,14 @@ static ivas_error renderIsmToBinauralRoom( IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioObjectPosition rotatedPos; const IVAS_REND_HeadRotData *headRotData; +#ifdef JBM_TSM_ON_TCS + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } +#endif push_wmops( "renderIsmToBinauralRoom" ); @@ -4360,7 +4444,6 @@ static ivas_error renderIsmToBinauralRoom( { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); - /* TODO tmu : missing: interpolation between positions, 5ms rendering */ if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, @@ -4393,9 +4476,9 @@ static ivas_error renderIsmToBinauralRoom( (void) subframe_len; // avoid warning } - /* TODO tmu : missing: interpolation between positions, 5ms rendering */ - /* TODO(sgi): Possible optimization: less processing needed if position didn't change */ - /* TODO tmu2sgi: needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ + /* TODO tmu : see issue #518 */ + /* Possible optimization: less processing needed if position didn't change + * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ /* previous position gains */ if ( headRotData->headRotEnabled ) { @@ -4449,8 +4532,13 @@ static ivas_error renderIsmToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4477,17 +4565,26 @@ static ivas_error renderIsmToMc( /* TODO(sgi): Possible optimization: less processing needed if position didn't change */ if ( *ismInput->base.ctx.pOutConfig == IVAS_REND_AUDIO_CONFIG_STEREO ) { - set_zero( currentPanGains, 16 ); - ivas_ism_get_stereo_gains( ismInput->currentPos.azimuth, - ismInput->currentPos.elevation, - ¤tPanGains[0], - ¤tPanGains[1] ); - - set_zero( previousPanGains, 16 ); - ivas_ism_get_stereo_gains( ismInput->previousPos.azimuth, - ismInput->previousPos.elevation, - &previousPanGains[0], - &previousPanGains[1] ); + if ( ismInput->nonDiegeticPan ) + { + previousPanGains[0] = currentPanGains[0] = ( ismInput->nonDiegeticPanGain + 1.f ) * 0.5f; + previousPanGains[1] = currentPanGains[1] = 1.f - currentPanGains[0]; + error = IVAS_ERR_OK; + } + else + { + set_zero( currentPanGains, 16 ); + ivas_ism_get_stereo_gains( ismInput->currentPos.azimuth, + ismInput->currentPos.elevation, + ¤tPanGains[0], + ¤tPanGains[1] ); + + set_zero( previousPanGains, 16 ); + ivas_ism_get_stereo_gains( ismInput->previousPos.azimuth, + ismInput->previousPos.elevation, + &previousPanGains[0], + &previousPanGains[1] ); + } } else { @@ -4709,6 +4806,15 @@ static ivas_error renderMcToBinaural( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; +#ifdef JBM_TSM_ON_TCS + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } +#endif push_wmops( "renderMcToBinaural" ); @@ -4749,8 +4855,13 @@ static ivas_error renderMcToBinaural( } /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4758,7 +4869,6 @@ static ivas_error renderMcToBinaural( accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); - /* TODO tmu : needs delay compensation */ if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) { return error; @@ -4779,6 +4889,15 @@ static ivas_error renderMcToBinauralRoom( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; +#ifdef JBM_TSM_ON_TCS + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } +#endif push_wmops( "renderMcToBinauralRoom" ); @@ -4819,8 +4938,13 @@ static ivas_error renderMcToBinauralRoom( } /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -4828,7 +4952,6 @@ static ivas_error renderMcToBinauralRoom( accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); - /* TODO tmu : needs delay compensation */ if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) { return error; @@ -4852,6 +4975,9 @@ static ivas_error renderMcCustomLsToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; +#ifdef JBM_TSM_ON_TCS + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; +#endif push_wmops( "renderMcCustomLsToBinauralRoom" ); @@ -4859,6 +4985,13 @@ static ivas_error renderMcCustomLsToBinauralRoom( headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } +#endif + /* apply rotation */ if ( headRotEnabled ) { @@ -4892,15 +5025,19 @@ static ivas_error renderMcCustomLsToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, + p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); - /* TODO tmu : needs delay compensation */ if ( ( error = renderLfeToBinaural( mcInput, outAudio ) ) != IVAS_ERR_OK ) { return error; @@ -5092,12 +5229,22 @@ static ivas_error renderSbaToBinaural( IVAS_REND_AudioBuffer outAudio ) { float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; - ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; +#ifdef JBM_TSM_ON_TCS + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; +#endif push_wmops( "renderSbaToBinaural" ); +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } +#endif + /* apply rotation */ if ( sbaInput->base.ctx.pHeadRotData->headRotEnabled ) { @@ -5121,8 +5268,13 @@ static ivas_error renderSbaToBinaural( } /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -5147,11 +5299,21 @@ static ivas_error renderSbaToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; +#ifdef JBM_TSM_ON_TCS + float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; +#endif tmpRotBuffer = outAudio; /* avoid compilation warning */ push_wmops( "renderSbaToBinauralRoom" ); +#ifdef JBM_TSM_ON_TCS + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; + } +#endif + headRotEnabled = sbaInput->base.ctx.pHeadRotData->headRotEnabled; /* apply rotation */ @@ -5190,8 +5352,13 @@ static ivas_error renderSbaToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ +#ifdef JBM_TSM_ON_TCS + if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), + NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -5337,14 +5504,17 @@ static void renderMasaToMc( copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC ); - /* TODO(sgi): Remove code duplication w.r.t. MASA rendering to other output configs */ if ( masaInput->decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC ) { ivas_dirac_dec_binaural( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); } else { +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); +#else ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, NULL, NULL, -1 ); +#endif } accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); @@ -5361,7 +5531,11 @@ static void renderMasaToSba( copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC ); +#ifdef JBM_TSM_ON_TCS + ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); +#else ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, NULL, NULL, -1 ); +#endif accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 1e9d41fd38..33cbd78f56 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -134,7 +134,9 @@ typedef uint16_t IVAS_REND_InputId; ivas_error IVAS_REND_Open( IVAS_REND_HANDLE *phIvasRend, /* i/o: Pointer to renderer handle */ const int32_t outputSampleRate, /* i : output sampling rate */ - const IVAS_REND_AudioConfig outConfig /* i : output audio config */ + const IVAS_REND_AudioConfig outConfig, /* i : output audio config */ + const int16_t nonDiegeticPan, /* i : non-diegetic object flag */ + const float nonDiegeticPanGain /* i : non-diegetic panning gain */ ); /* Note: this will reset custom LFE routings set for any MC input */ @@ -143,7 +145,6 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for renderer output */ ); -/* Support for custom HRTFs will be added in the future. */ /* Note: this affects output delay */ ivas_error IVAS_REND_SetCustomHrtf( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ @@ -228,8 +229,8 @@ ivas_error IVAS_REND_FeedInputMasaMetadata( ); ivas_error IVAS_REND_InitConfig( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + const IVAS_REND_AudioConfig outAudioConfig /* i : output audioConfig */ ); int16_t IVAS_REND_GetRenderConfig( @@ -245,12 +246,16 @@ int16_t IVAS_REND_FeedRenderConfig( ivas_error IVAS_REND_SetHeadRotation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const IVAS_QUATERNION headRot[RENDERER_HEAD_POSITIONS_PER_FRAME], /* i : head orientations for next rendering call */ - const IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ + const IVAS_VECTOR3 Pos[RENDERER_HEAD_POSITIONS_PER_FRAME] /* i : listener positions for next rendering call */ ); ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - const uint8_t otrMode /* i : Orientation tracking mode */ +#ifdef FIX_439_OTR_PARAMS + const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ +#else + const uint8_t otrMode /* i : Orientation tracking mode */ +#endif ); ivas_error IVAS_REND_SetReferenceRotation( diff --git a/lib_util/audio_file_writer.c b/lib_util/audio_file_writer.c index 81084dbd95..0ed64d02c5 100644 --- a/lib_util/audio_file_writer.c +++ b/lib_util/audio_file_writer.c @@ -151,7 +151,6 @@ ivas_error AudioFileWriter_write( uint32_t numSamples ) { ivas_error error = IVAS_ERR_OK; - if ( self->rawFile ) { if ( fwrite( samples, sizeof( int16_t ), numSamples, self->rawFile ) != numSamples ) diff --git a/lib_util/cmdln_parser.c b/lib_util/cmdln_parser.c index 200b8c86e9..6ac2b0ec2d 100644 --- a/lib_util/cmdln_parser.c +++ b/lib_util/cmdln_parser.c @@ -31,6 +31,7 @@ *******************************************************************************************************/ #include "cmdln_parser.h" +#include "cmdl_tools.h" #include #include #include @@ -119,7 +120,7 @@ static int16_t initOpts( static int8_t stringLooksLikeOption( const char *str ) { - if ( str[0] == '-' ) + if ( ( str[0] == '-' ) && is_number( str ) == false ) { return 1; } @@ -130,7 +131,7 @@ static int8_t stringLooksLikeOption( static const char *stringToOptionName( const char *str ) { - while ( *str == '-' ) + while ( ( *str == '-' ) && ( ( str[1] != '0' ) || ( str[1] != '1' ) ) ) { ++str; } @@ -268,7 +269,7 @@ static const char *getBasename( static int32_t totalOptionNameLength( const OptionProps opt ) { - return strlen( opt.match ) + strlen( opt.matchShort ); + return (int32_t) ( strlen( opt.match ) + strlen( opt.matchShort ) ); } static void printWhitespace( diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index b7ffe81682..d2f923bfeb 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -195,7 +195,12 @@ static ivas_error check_hrtf_binary_header( } /* Check the output format of the decoder */ + +#ifdef UPDATE_SBA_FILTER + if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_FOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) +#else if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) +#endif { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (input audio configuration)" ); } @@ -974,6 +979,31 @@ static ivas_error init_fastconv_HRTF_handle( set_zero( hHrtf->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); } } +#ifdef UPDATE_SBA_FILTER + hHrtf->FASTCONV_HOA2_latency_s = 0; + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < 9; j++ ) + { + set_zero( hHrtf->leftHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->leftHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->rightHRIRReal_HOA2[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->rightHRIRImag_HOA2[i][j], BINAURAL_NTAPS ); + } + } + hHrtf->FASTCONV_FOA_latency_s = 0; + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < 4; j++ ) + { + set_zero( hHrtf->leftHRIRReal_FOA[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->leftHRIRImag_FOA[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS ); + set_zero( hHrtf->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS ); + } + } +#endif + hHrtf->FASTCONV_BRIR_latency_s = 0; for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) @@ -1078,7 +1108,11 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } +#ifdef UPDATE_SBA_FILTER + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { /* HRIR_HOA3 */ ( *hHRTF )->FASTCONV_HOA3_latency_s = *( (float *) ( hrtf_data_rptr ) ); @@ -1129,8 +1163,116 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } +#ifdef UPDATE_SBA_FILTER + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + /* HRIR_HOA2 */ + ( *hHRTF )->FASTCONV_HOA2_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + + if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRReal_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRImag_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRReal_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRImag_HOA2[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + } + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + /* HRIR_FOA */ + ( *hHRTF )->FASTCONV_FOA_latency_s = *( (float *) ( hrtf_data_rptr ) ); + hrtf_data_rptr += sizeof( float ); + + if ( HRTF_SH_CHANNELS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (HRTF_SH_CHANNELS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + if ( BINAURAL_NTAPS != *( (uint16_t *) ( hrtf_data_rptr ) ) ) + { + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "HRTF binary file not compliant (BINAURAL_NTAPS)" ); + } + hrtf_data_rptr += sizeof( uint16_t ); + + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRReal_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->leftHRIRImag_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRReal_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) + { + memcpy( ( *hHRTF )->rightHRIRImag_FOA[i][j], hrtf_data_rptr, BINAURAL_NTAPS * sizeof( float ) ); + hrtf_data_rptr += BINAURAL_NTAPS * sizeof( float ); + } + } + } +#endif /* BRIR */ +#ifdef UPDATE_SBA_FILTER + else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) +#else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) +#endif { ( *hHRTF )->FASTCONV_BRIR_latency_s = *( (float *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( float ); @@ -1488,10 +1630,24 @@ ivas_error create_SetOfHRTF_from_binary( { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_combined ); } +#ifdef UPDATE_SBA_FILTER + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 ); } +#ifdef UPDATE_SBA_FILTER + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 ); + } + else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_foa ); + } +#endif } else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -1598,6 +1754,10 @@ ivas_error destroy_SetOfHRTF( { destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_combined ) ); destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa3 ) ); +#ifdef UPDATE_SBA_FILTER + destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa2 ) ); + destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_foa ) ); +#endif destroy_HRTF( &( hSetOfHRTF->hHRTF_brir_combined ) ); } diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index fa449512e4..7054d2081b 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -35,10 +35,9 @@ #include #include - #define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ -#define NUM_ISM_METADATA_PER_LINE 7 /* Number of ISM metadata per line in a metadata file */ -#define NUM_MIN_ISM_METADATA 2 /* Minimum number of metadata parameters (azimuth and elevation) */ +#define NUM_ISM_METADATA_PER_LINE 8 /* Number of ISM metadata per line in a metadata file */ +#define NUM_MIN_ISM_METADATA 1 /* Minimum number of metadata parameters (azimuth) */ struct IsmFileReader @@ -96,7 +95,7 @@ ivas_error IsmFileReader_readNextFrame( { char char_buff[META_LINE_LENGTH]; float meta_prm[NUM_ISM_METADATA_PER_LINE]; - const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f }; + const float meta_prm_default[NUM_ISM_METADATA_PER_LINE] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }; char *char_ptr; int16_t i; FILE *file; @@ -142,7 +141,6 @@ ivas_error IsmFileReader_readNextFrame( return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; } - ismMetadata->azimuth = meta_prm[0]; ismMetadata->elevation = meta_prm[1]; ismMetadata->radius = meta_prm[2]; @@ -150,8 +148,14 @@ ivas_error IsmFileReader_readNextFrame( ismMetadata->gainFactor = meta_prm[4]; ismMetadata->yaw = meta_prm[5]; ismMetadata->pitch = meta_prm[6]; + ismMetadata->non_diegetic_flag = (int16_t) meta_prm[7]; /* verify whether the read metadata values are in an expected range */ + if ( ( ismMetadata->non_diegetic_flag ) != 0 && ( ismMetadata->non_diegetic_flag != 1 ) ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 ) { return IVAS_ERR_ISM_INVALID_METADATA_VALUE; diff --git a/lib_util/ism_file_writer.c b/lib_util/ism_file_writer.c index b29386282b..ca845323e7 100644 --- a/lib_util/ism_file_writer.c +++ b/lib_util/ism_file_writer.c @@ -63,7 +63,7 @@ ivas_error IsmFileWriter_open( strncpy( metadata_filename_loc, filePathWav, sizeof( metadata_filename_loc ) - 1 ); snprintf( ext_meta, sizeof( ext_meta ), ".%d.csv", obj_num ); - const int32_t maxNumCharactersToAppend = (int32_t) sizeof( metadata_filename_loc ) - strlen( metadata_filename_loc ) - 1; + const int32_t maxNumCharactersToAppend = (int32_t) ( sizeof( metadata_filename_loc ) - strlen( metadata_filename_loc ) - 1 ); strncat( metadata_filename_loc, ext_meta, maxNumCharactersToAppend ); strcpy( filePath, metadata_filename_loc ); @@ -113,12 +113,7 @@ ivas_error IsmFileWriter_writeFrame( file = ismWriter->file; - /* IVAS_fmToDo: work in progress; currently position_azimuth, position_elevation, position_radius, spread, gain_factor */ -#ifdef FIX_293_EXT_RENDERER_CLI - sprintf( char_buff, "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch ); -#endif - snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch ); - + snprintf( char_buff, sizeof( char_buff ), "%+07.2f,%+06.2f,%05.2f,%06.2f,%04.2f,%+07.2f,%+06.2f,%d\n", ismMetadata.azimuth, ismMetadata.elevation, ismMetadata.radius, ismMetadata.spread, ismMetadata.gainFactor, ismMetadata.yaw, ismMetadata.pitch, ismMetadata.non_diegetic_flag ); if ( file ) { fputs( char_buff, file ); diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c index 19f12182f3..90756a39b1 100644 --- a/lib_util/masa_file_reader.c +++ b/lib_util/masa_file_reader.c @@ -84,7 +84,7 @@ MasaFileReader *MasaFileReader_open( *------------------------------------------------------------------------*/ IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle( - MasaFileReader *self /* i/o: MasaFileReader handle */ + MasaFileReader *self /* i/o: MasaFileReader handle */ ) { if ( self == NULL ) @@ -95,12 +95,13 @@ IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle( return &self->metadataFrame; } + +#ifndef HR_METADATA /*------------------------------------------------------------------------- * deindex_sph_idx() * * deindex the MASA metadata from the input metadata file *------------------------------------------------------------------------*/ - static void deindex_sph_idx( const uint16_t sphIndex, /* i : Spherical index */ const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ @@ -249,6 +250,7 @@ static void deindex_sph_idx( return; } +#endif /*------------------------------------------------------------------------- @@ -342,6 +344,9 @@ ivas_error MasaFileReader_readNextFrame( for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) { deindex_sph_idx( readIndex[b], &self->sph_grid16, &( hMeta->directional_meta[i].elevation[j][b] ), &( hMeta->directional_meta[i].azimuth[j][b] ) ); +#ifdef HR_METADATA + hMeta->directional_meta[i].spherical_index[j][b] = readIndex[b]; +#endif } /* Direct-to-total ratio */ @@ -412,7 +417,7 @@ ivas_error MasaFileReader_readNextFrame( *------------------------------------------------------------------------*/ void MasaFileReader_close( - MasaFileReader **selfPtr /* i/o: pointer to MasaFileReader handle */ + MasaFileReader **selfPtr /* i/o: pointer to MasaFileReader handle */ ) { if ( selfPtr == NULL || *selfPtr == NULL ) diff --git a/lib_util/tinywaveout_c.h b/lib_util/tinywaveout_c.h index d0531eb665..393633a745 100644 --- a/lib_util/tinywaveout_c.h +++ b/lib_util/tinywaveout_c.h @@ -205,7 +205,7 @@ static WAVEFILEOUT *CreateBWF( wfch.blockAlignment = LittleEndian16( (int16_t) blockAlignment ); wfch.sampleRate = LittleEndian32( sampleRate ); wfch.bytesPerSecond = LittleEndian32( sampleRate * blockAlignment ); - /* tbd: wavfmt ext hdr here */ + /* ToDo: tbd: wavfmt ext hdr here */ /* write to file */ self->fmtChunkOffset = ByteCnt; ByteCnt += (uint32_t) fwrite( &wfch, 1, sizeof( wfch ), self->theFile ); @@ -490,6 +490,49 @@ static int32_t WriteWavShort( return __TWO_SUCCESS; } +#ifdef DEBUG_JBM +/* this function expects values in the 16 bit range +-32767/8 */ +static int32_t WriteWavFloat( + WAVEFILEOUT *self, + float sampleBuffer[], + uint32_t nSamples ) +{ + uint32_t i; + int32_t err = __TWO_SUCCESS; + + if ( !self ) + { + return __TWO_ERROR; + } + if ( !sampleBuffer ) + { + return __TWO_ERROR; + } + if ( __dataSizeChk( self, nSamples * sizeof( float ) ) ) + { + return __TWO_ERROR; + } + + for ( i = 0; i < nSamples; i++ ) + { + if ( self->bps == 32 ) + { + err = __WriteSample32( self, sampleBuffer[i] / 32768.0f ); + } + else + { + err = __TWO_ERROR; + } + if ( err != __TWO_SUCCESS ) + { + return err; + } + } + + return __TWO_SUCCESS; +} +#endif + static int32_t CloseWav( WAVEFILEOUT *self ) { diff --git a/lib_util/tsm_scale_file_reader.c b/lib_util/tsm_scale_file_reader.c new file mode 100644 index 0000000000..fbd1824d9d --- /dev/null +++ b/lib_util/tsm_scale_file_reader.c @@ -0,0 +1,148 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include "tsm_scale_file_reader.h" +#include "cmdl_tools.h" +#include +#include +#include + +struct TsmScaleFileReader +{ + FILE *file; + char *file_path; + bool fileRewind; +}; + + +/*---------------------------------------------------------------------* + * TsmScaleFileReader_open() + * + * Allocates memory for an TsmScaleFileReader and opens the file at given path for reading. + *---------------------------------------------------------------------*/ + +/*! r: JbmFileReader handle */ +TsmScaleFileReader *TsmScaleFileReader_open( + const char *filePath /* i : path to CA config file */ +) +{ + TsmScaleFileReader *self; + FILE *file; + + if ( !filePath ) + { + return NULL; + } + + file = fopen( filePath, "rb" ); + + if ( !file ) + { + return NULL; + } + + self = calloc( sizeof( TsmScaleFileReader ), 1 ); + self->file = file; + self->file_path = calloc( sizeof( char ), strlen( filePath ) + 1 ); + strcpy( self->file_path, filePath ); + + return self; +} + + +/*---------------------------------------------------------------------* + * TsmScaleFileReader_readScale() + * + * Read TSM scale entry + *---------------------------------------------------------------------*/ + +ivas_error TsmScaleFileReader_readScale( + TsmScaleFileReader *self, /* i/o: TsmScaleFileReader handle */ + int16_t *scale /* o : scale */ +) +{ + int tmp; + if ( 1 != fscanf( self->file, "%d", &tmp ) ) + { + if ( feof( self->file ) ) + { + rewind( self->file ); + self->fileRewind = true; + return TsmScaleFileReader_readScale( self, scale ); + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + *scale = (int16_t) tmp; + return IVAS_ERR_OK; +} + + +/*---------------------------------------------------------------------* + * JbmFileReader_close() + * + * De-allocates all underlying memory of an JbmFileReader. + *---------------------------------------------------------------------*/ + +void TsmScaleFileReader_close( + TsmScaleFileReader **selfPtr /* i/o: pointer to JbmFileReader handle */ +) +{ + if ( selfPtr == NULL || *selfPtr == NULL ) + { + return; + } + + fclose( ( *selfPtr )->file ); + free( ( *selfPtr )->file_path ); + free( *selfPtr ); + *selfPtr = NULL; + + return; +} + + +/*---------------------------------------------------------------------* + * JbmFileReader_getFilePath() + * + *---------------------------------------------------------------------*/ + +const char *TsmScaleFileReader_getFilePath( + TsmScaleFileReader *self /* i/o: JbmFileReader handle */ +) +{ + if ( self == NULL ) + { + return NULL; + } + + return self->file_path; +} diff --git a/lib_util/tsm_scale_file_reader.h b/lib_util/tsm_scale_file_reader.h new file mode 100644 index 0000000000..7a795a25cb --- /dev/null +++ b/lib_util/tsm_scale_file_reader.h @@ -0,0 +1,67 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#ifndef IVAS_TSM_SCALE_FILE_READER_H +#define IVAS_TSM_SCALE_FILE_READER_H + +#include +#include "common_api_types.h" +#include "ivas_error.h" + +/* clang-format off */ + +typedef struct TsmScaleFileReader TsmScaleFileReader; + + +/*! r: TsmScaleFileReader handle */ +TsmScaleFileReader *TsmScaleFileReader_open( + const char *filePath /* i : path to TSM scale file */ +); + +ivas_error TsmScaleFileReader_readScale( + TsmScaleFileReader* self, /* i/o: TsmScaleFileReader handle */ + int16_t *scale /* o : next scale */ +); + +void TsmScaleFileReader_close( + TsmScaleFileReader **selfPtr /* i/o: pointer to TsmScaleFileReader handle */ +); + +/*! r: path to the currently opened file or NULL if `self` is NULL */ +const char *TsmScaleFileReader_getFilePath( + TsmScaleFileReader* self /* i/o: TsmScaleFileReader handle */ +); + + +/* clang-format on */ + +#endif /* IVAS_TSM_SCALE_FILE_READER_H */ diff --git a/readme.txt b/readme.txt index c566c78ea2..21a5a19e79 100644 --- a/readme.txt +++ b/readme.txt @@ -123,32 +123,33 @@ should have the following structure: |-- Workspace_msvc |-- apps |-- lib_com -....|-- lib_debug + |-- lib_debug |-- lib_dec |-- lib_enc + |-- lib_rend |-- lib_util |-- scripts -....|-- work_in_progress - |-- readme_OSS.txt - `-- readme.txt + |-- tests + |-- readme.txt The package includes a Makefile for gcc, which has been verified on 32-bit Linux systems. The code can be compiled by entering the directory -"c-code" and typing the command: make. The resulting encoder/decoder -executables are named "IVAS_cod" and "IVAS_dec". Both reside in the c-code -directory. +"c-code" and typing the command: make. The resulting encoder/decoder/renderer +executables are named "IVAS_cod", "IVAS_dec", and "IVAS_rend". All reside +in the c-code directory. The package also includes a solution-file for Microsoft Visual Studio 2017 (x86). To compile the code, please open "Workspace_msvc\Workspace_msvc.sln" and build "encoder" for the encoder and "decoder" for the decoder executable. The resulting -encoder/decoder executables are named "IVAS_cod.exe" and "IVAS_dec.exe". Both reside -in the c-code directory. +encoder/decoder/renderer executables are named "IVAS_cod.exe", "IVAS_dec.exe", +and "IVAS_rend.exe". All reside in the c-code directory. RUNNING THE SOFTWARE ==================== The usage of the "IVAS_cod" program is as follows: +-------------------------------------------------- Usage: IVAS_cod.exe [Options] R Fs input_file bitstream_file @@ -161,9 +162,9 @@ R : Bitrate in bps, for AMR-WB IO modes R = (6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850) for IVAS stereo R = (13200, 16400, 24400, 32000, 48000, 64000, 80000, - 96000, 128000, 160000, 192000, 256000) - for IVAS ISM R = 13200 for 1 ISM, 16400 for 1 ISM and 2 ISM, - (24400, 32000, 48000, 64000, 80000, 96000, 128000) + 96000, 128000, 160000, 192000, 256000) + for IVAS ISM R = 13200 for 1 ISM, 16400 for 1 ISM and 2 ISM, + (24400, 32000, 48000, 64000, 80000, 96000,128000) for 2 ISM, 3 ISM and 4 ISM also 160000, 192000, 256000 for 3 ISM and 4 ISM also 384000 for 4 ISM also 512000 @@ -179,17 +180,17 @@ bitstream_file : Output bitstream filename Options: -------- EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc --stereo [Mode] : Stereo format, default is unified stereo - optional for Mode: 1: DFT Stereo, 2: TD Stereo, 3: MDCT Stereo --ism Channels Files : ISM format - where Channels specifies the number of ISMs (1-4) +-stereo : Stereo format +-ism [+]Ch Files : ISM format + where Ch specifies the number of ISMs (1-4) + where positive (+) indicates extended metadata (only 64 kbps and up) and Files specify input files containing metadata, one file per object (use NULL for no input metadata) -sba +/-Order : Scene Based Audio input format (Ambisonics ACN/SN3D), where Order specifies the Ambisionics order (1-3), where positive (+) means full 3D and negative (-) only 2D/planar components to be coded --masa Channels File : MASA format - where Channels specifies the number of input/transport channels (1 or 2): +-masa Ch File : MASA format + where Ch specifies the number of input/transport channels (1 or 2): and File specifies input file containing parametric MASA metadata -mc InputConf : Multi-channel format where InputConf specifies the channel configuration: 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4 @@ -213,13 +214,13 @@ EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -mime : Mime output bitstream file format The encoder produces TS26.445 Annex.2.6 Mime Storage Format, (not RFC4867 Mime Format). default output bitstream file format is G.192 --agc op : SBA Adaptive gain control, op = (0, 1), by default op is 0 or deactivated -bypass mode : SBA PCA by-pass, mode = (1, 2), 1 = PCA off, 2 = signal adaptive, default is 1 -q : Quiet mode, no frame counters default is deactivated The usage of the "IVAS_dec" program is as follows: +-------------------------------------------------- Usage for EVS: IVAS_dec.exe [Options] Fs bitstream_file output_file Usage for IVAS: IVAS_dec.exe [Options] OutputConf Fs bitstream_file output_file @@ -264,17 +265,16 @@ Options: -rvf File : Reference vector specified by external trajectory file works only in combination with '-otr ref_vec' and 'ref_vec_lev' modes -render_config File : Renderer configuration option File --no_diegetic_pan : panning mono non-diegetic sound to stereo -1<= pan <=1, - left or l or 1->left, right or r or -1->right, center or c or 0->middle +-non_diegetic_pan P : panning mono non-diegetic sound to stereo -90<= P <=90, + left or l or 90->left, right or r or -90->right, center or c or 0->middle -q : Quiet mode, no frame counter default is deactivated --FEC X : Insert frame erasures, X = 0-10 is the percentage - of erased frames, or X may be the name of binary file or - file with G192 headers indicating GOOD FRAME or BAD FRAME - containing FEC pattern (short values of 0 (good) or 1 (bad)) - default is OFF, if this option is not used --force R : Force specific binaural rendering mode, R = (TDREND, CLDFBREND), - + + +The usage of the "IVAS_rend" program is as follows: +--------------------------------------------------- + +TBD MULTICHANNEL LOUDSPEAKER INPUT / OUTPUT CONFIGURATIONS @@ -359,7 +359,7 @@ stv2MASA2TC48c.wav - 2 channels (2 MASA transport channel), 48000 Hz, 48000 Hz, For the MASA operation modes, in addition the following metadata files -are required: +located in /scripts/testv/ folder are required: stv1MASA1TC48c.met stv1MASA1TC48n.met @@ -375,7 +375,7 @@ available at https://www.3gpp.org/ftp/TSG_SA/WG4_CODEC/TSGS4_118-e/Docs/S4-220443.zip For the ISM operation modes, in addition the following metadata files -are required: +located at /scripts/testv/ folder are required: stvISM1.csv stvISM2.csv @@ -384,21 +384,40 @@ stvISM4.csv These are comma separated files (csv) which indicate the per object position in the format: -frame azimuth, elevation, distance (unit circle), spread, gain +frame azimuth, elevation, radius, spread, gain, yaw, pitch, non-diegetic with the following meaning: -| Parameter | format, value range | meaning ------------------------------------------------------------------------------------ -| azimuth | float, [-180,180[ | azimuth; positive indicates left ------------------------------------------------------------------------------------ -| elevation | float, [-90,90] | elevation; positive indicates up ------------------------------------------------------------------------------------ -| distance | float, tbd | distance; default: 1 ------------------------------------------------------------------------------------ -| spread | float, [0,360] | spread in angles from 0...360 deg; default: 0 ------------------------------------------------------------------------------------ -| gain | float, [0,1] | gain; default: 1 ------------------------------------------------------------------------------------ +| Parameter | format, value range | meaning +--------------------------------------------------------------------------------------------------- +| azimuth | float, [-180,180] | azimuth; positive indicates left; default: 0 +--------------------------------------------------------------------------------------------------- +| elevation | float, [-90,90] | elevation; positive indicates up; default: 0 +--------------------------------------------------------------------------------------------------- +| radius | float, [0, 15.75] | radius (extended metadata); default: 1 +--------------------------------------------------------------------------------------------------- +| spread | float, [0,360] | spread in angles from 0...360 deg; default: 0 +--------------------------------------------------------------------------------------------------- +| gain | float, [0,1] | gain; default: 1 +--------------------------------------------------------------------------------------------------- +| yaw | float, [-180,180] | yaw (extended metadata); positive indicates left; default: 0 +--------------------------------------------------------------------------------------------------- +| pitch | float, [-90,90] | pitch (extended metadata); positive indicates up; default: 0 +--------------------------------------------------------------------------------------------------- +| non-diegetic | float*, [0 1] | Flag for activation of non-diegetic rendering; default: 0 +| | if Flag is set to 1, panning gain is specified by azimuth. +| | Value between [-90,90], 90 left, -90 right, 0 center +--------------------------------------------------------------------------------------------------- +*Read as float value for convenience, but used as an integer flag internally. + +The metadata reader accepts 1-8 values specified per line. If a value is not specified, the default +value is assumed. + +For the HRTF filter File option, external HRTF filter Files are available in folder +/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data : + +ivas_binaural_16kHz.bin +ivas_binaural_32kHz.bin +ivas_binaural_48kHz.bin For the Head rotation operation modes, external trajectory files are available: @@ -409,6 +428,9 @@ headrot_case01_3000_q.csv headrot_case02_3000_q.csv headrot_case03_3000_q.csv +For Reference vector specified by external trajectory file, example files are available at +/scripts/trajectories folder. + For the Renderer configuration option operation modes, external configuration files are available: @@ -421,5 +443,6 @@ config_renderer.cfg ================== Additional scripts for item generation and codec testing are available -in the directory scripts. Please refer to scripts/README.md for -additional documentation. +in the directories scripts and tests. Please refer to scripts/README.md, resp. +tests/README.md for additional documentation. + diff --git a/scripts/README.md b/scripts/README.md index fec54ffeac..4e8a9b3664 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -38,7 +38,6 @@ title: Python scripts for Testing the IVAS code and Generating test items - [Python scripts for Testing the IVAS code and Generating test items](#python-scripts-for-testing-the-ivas-code-and-generating-test-items) - [Contents](#contents) - [0. Requirements](#0-requirements) - - [- numpy and scipy for `generate_test_items.py`, `testBitexact.py` and `self_test.py`](#--numpy-and-scipy-for-generate_test_itemspy-testbitexactpy-and-self_testpy) - [1. Scripts and classes for testing IVAS code](#1--scripts-and-classes-for-testing-ivas-code) - [1.1 Classes](#11-classes) - [1.2 Output directory structure](#12-output-directory-structure) @@ -49,16 +48,6 @@ title: Python scripts for Testing the IVAS code and Generating test items - [`IvasBuildAndRunChecks.py`](#ivasbuildandruncheckspy) - [`testBitexact.py`](#testbitexactpy) - [`self_test.py`](#self_testpy) - - [2. Script for generating listening test items](#2-script-for-generating-listening-test-items) - - [2.1. `generate_test_items.py`](#21-generate_test_itemspy) - - [2.2. Test configuration file](#22-test-configuration-file) - - [2.3. Supported test conditions](#23-supported-test-conditions) - - [2.4. Supported input/output/rendered audio formats](#24-supported-inputoutputrendered-audio-formats) - - [2.5. Processing](#25-processing) - - [2.6. Renderer Metadata definition](#26-renderer-metadata-definition) - - [3. Script for converting formats and binauralizing](#3-script-for-converting-formats-and-binauralizing) - - [3.1. Binauralizing with head rotation](#31-binauralizing-with-head-rotation) - - [3.2. Generating binaural reference signals](#32-generating-binaural-reference-signals) --- @@ -441,216 +430,3 @@ Missing reference conditions and the test conditions are then generated and the reference and test conditions are compared. ----- - - -## 2. Script for generating listening test items - -The `generate_test_items.py` python script helps to quickly setup listening tests with multiple (pre-)processing and post-processing options. - -### 2.1. `generate_test_items.py` - -Script for generating (listening) test items. - -``` -usage: generate_test_items.py [-h] -i INFILE [INFILE ...] - -Generate test items - -optional arguments: - -h, --help show this help message and exit - -i INFILE [INFILE ...], --infile INFILE [INFILE ...] - Configuration file(s): FILE1.json FILE2.json ... -``` - -Example how to call it: - -``` - python3 .\generate_test_items.py -i .\examples\my_test_config.json -``` - -Where `my_test_config.json` is a test configuration file in json format with fields explained in next section. - -### 2.2. Test configuration file - -This is the main file to edit in order to change global configuration options, detailed below. - -*NOTE: Paths specified in the JSON file are relative to the working directory where the script is executed from, NOT the location of the JSON file itself. It is possible (and recommended!) to use absolute paths instead to avoid confusion.* - -| key | values (example) | default | description | -|---------------------------|:------------------:|:-------------:|-----------------------------------------------| -| name | "my_test" | Required | name of the test session | -| author | "myself" | | Author of the configuration file (optional) | -| date | 20210205 | | Date of creation (optional) | -| | | | | -| enable_multiprocessing | True/False | True | Enables multiprocessing, recommended to set to True to make things fast. | -| delete_tmp | True/False | False | Enables deletion of temporary directories (containing intermediate processing files, bitstreams and per-item logfiles etc.). | -| | | | | -| input_path | ./my_items/ | Required | Input directory with *.WAV, *.PCM or *.TXT files to process | -| preproc_input | True/False | False | Whether to execute preprocessing on the input files | -| in_format | HOA3 | Required | Input format for the conditions to generate, see spatial_audio_format | -| in_fs | 32000 | 48000 | Input sampling rate for conditions to generate (assumed to be sampling-rate of input PCM files to process) | -| input_select | ["in", "file2"] | Required | Filenames to filter in the input directory, can be a single value, an array or null. Only compares filenames (therefore "in" in this array would match both "in.wav" and "in.pcm") | -| | | | | -| concatenate_input | True/False | False | Whether to (horizontally) concatenate files in the input directory | -| concat_silence_ms | [1000, 1000] | [0, 0] | Specifies the pre- and post-silence duration to pad concatenation with in ms. If a single value is specified it will be used for BOTH pre- and post-padding | -| preproc_loudness | -26 | | Loudness to preprocess input to (dBov / LKFS depending on tool). Only processed if preproc_input is True. | -| | | | | -| output_path | ./out/ | | Output root directory hosting generated items & log | -| out_fs | 48000 | 48000 | Output sampling rate for conditions to generate | -| output_loudness | -26 | | Loudness level for output file (dBov / LKFS depending on tool). | -| | | | | -| renderer_format | 7_1_4 or CICP19 | Required | Format to be rendered (using offline rendering, will be bypassed if = out_format) | -| binaural_rendered | True/False | False | Extra binauralization of the rendered outputs (using offline rendering) | -| include_LFE | True/False | False | Whether to include LFE in binural rendering | -| gain_factor | float value | 1.0 | Gain factor to be applied to LFE channel | -| loudness_tool | "sv56demo" | "bs1770demo" | Tool to use for loudness adjustment. Currently only sv56demo and bs1770demo are supported for appropriate format configurations. Optionally can be a path to the binary. | -| | | | | -| lt_mode | "MUSHRA" | | Automatically generates a NAME.ltg file with generate_lt_file.py in output_path according to the specified mode | -| conditions_to_generate | ["ref", "ivas"] | Required | list of conditions to be generated, for ivas and evs, multiple conditions can be specified with an \_ separator (i.e. "ivas_branch", "ivas_trunk" etc.) | -| | | | | -| ref | | | | -| - out_fc | 32000 | 48000 | cut-off frequency to be applied to the reference condition in post | -| ivas | | | | -| - bitrates | [16400, 128000] | Required | Bitrate(s) used for IVAS encoder | -| - enc_fs | 48000 | 48000 | Sampling rate for input to the encoder (pre-processing) | -| - max_band | wb, swb, fb etc. | FB | Maximum encoded bandwidth | -| - out_format | 7_1_4 or CICP19 | Required | Output format for IVAS, see spatial_audio_format | -| - dec_fs | 48000 | 48000 | Sampling rate for decoder output | -| - dtx | True/False | False | Enable DTX mode | -| - head_tracking | True/False | False | Enable head tracking | -| - ht_file | | "./trajectories/full_circle_in_15s" | Head rotation file | -| - plc | True/False | False | Enables forward error correction `IVAS_dec -FEC X` | -| - plc_rate | 0-10 | 10 | Percentage of erased frames | -| - cod_bin | "../../../IVAS_cod"| "../IVAS_cod" | path to encoder binary | -| - dec_bin | "../../../IVAS_dec"| "../IVAS_dec" | path to decoder binary | -| - cod_opt | ["-ucct", "1"] | | list of additional encoder options | -| - dec_opt | ["-q"] | | list of additional decoder options | -| evs | | | | -| - bitrates | [13200, 164000] | Required | Bitrate used for multi-stream EVS condition per stream/channel | -| - enc_fs | 48000 | 48000 | Sampling rate for input to the encoder (pre-processing) | -| - max_band | wb, swb, fb etc. | FB | Maximum encoded bandwidth | -| - dec_fs | 48000 | 480000 | Sampling rate for decoder output | -| - dtx | True/False | False | Enable DTX mode | -| - cod_bin | ../../../IVAS_cod | "../IVAS_cod" | path to binary | -| - dec_bin | ../../../IVAS_dec | "../IVAS_dec" | path to binary | -| | | | | - ---- -### 2.3. Supported test conditions - -The following conditions are the conditions which can be generated currently by `generate_test_items.py`. - -| Supported conditions | Description | -|:--------------------:|-----------------------------------------------------------| -| ref | Uncoded (reference) | -| lp3k5 | Uncoded low-passed at 3.5 kHz (anchor) | -| lp7k | Uncoded low-passed at 7 kHz (anchor) | -| evs_mono | Coded with multi-stream EVS codec, !!metadata not coded!! | -| ivas | Coded with IVAS codec | - - -Multiple conditions for evs_mono and ivas can be specified by using underscore separators e.g. `"ivas_1" : {...}, "ivas_2" : {...}` -(also see `test_SBA.json` for an example) - ---- - -### 2.4. Supported input/output/rendered audio formats - -| spatial_audio_format | Input/Ouput/Rendered | Description | -|--------------------------------------------------|----------------------|------------------------------------------------| -| MONO | yes/yes/yes | mono signals | -| STEREO | yes/yes/yes | stereo signals | -| ISM or ISMx | yes/no/no | Objects with metadata, description using renderer metadata | -| MASA or MASAx | yes/no/no | mono or stereo signals with spatial metadata !!!metadata must share same basename as waveform file but with .met extension!!! | -| FOA/HOA2/HOA3 or PLANAR(FOA/HOAx) | yes/yes/yes | Ambisonic signals or planar ambisonic signals | -| BINAURAL/BINAURAL_ROOM | no/yes/yes | Binaural signals | -| 5_1/5_1_2/5_1_4/7_1/7_1_4 or CICP[6/12/14/16/19] | yes/yes/yes | Multi-channel signals for predefined loudspeaker layout | -| META | yes/yes/no | Audio scene described by a renderer config | - ---- - -### 2.5. Processing - -The processing chain is as follows: - -1. Preprocessing - - **Condition**: `preproc_input == true` - - Input files converted to `in_format` -2. Processing - - **Condition**: Performed depending on key in `conditions_to_generate` - - Coding/decoding from `in_format` to `out_format` -3. Postprocessing - 1. Rendering to `renderer_format` - - **Condition**: `out_format != renderer_format` - - output files converted from `out_format` to `renderer_format` - 1. Binaural Rendering - - **Condition**: `binaural_rendered == true` and `out_format` is not a BINAURAL type - - output files converted from `out_format` to `BINAURAL` - ---- - -### 2.6. Renderer Metadata definition - -To run, the renderer requires a config file describing the input scene.The expected format of the config file is as follows: - ---- - -- Line 1: Path to a "multitrack" audio file. This should be a single multichannel wav/pcm file that contains all input audio. For example channels 1-4 can be an FOA scene,channel 5 - an object and channels 6-11 - a 5.1 channel bed. If the path is not absolute, it is considered relative to the renderer executable, not the config file. This path has lower priority than the one given on the command line: *The path in the config file is ignored if the --inputAudio argument to the renderer executable is specified.* - ---- - -- Line 2: Contains number of inputs. An input can either be an Ambisonics scene, anobject or a channel bed.This is NOT the total number of channels in the input audio file.The renderer currently supports simultaneously: *Up to 2 SBA inputs, Up to 2 MC inputs* Up to 16 ISM inputsThese limits can be freely changed with pre-processor macros, if needed. - ---- -- Following lines: -Define each of the inputs. Inputs can be listed in any order - they are NOT required to be listed in the same order as in the audio file. -Input definitions: - - First line of an input definition contains the input type: SBA, MC or ISM.Following lines depend on the input type:SBAIndex of the first channel of this input in the multitrack file (1-indexed)Ambisonics orderMCIndex of the first channel of this input in the multitrack file (1-indexed)CICP index of the speaker layoutISMIndex of this input's audio in the multitrack file (1-indexed)Path to ISM metadata file (if not absolute, relative to executable location)ORISMIndex of this input's audio in the multitrack file (1-indexed)Number N of positions defined, followed by N lines in form: -stay in position for x frames, azimuth, elevation(ISM position metadata defined this way is looped if there are more framesof audio than given positions) - ---- -Example config -The following example defines a scene with 4 inputs: *ISM with trajectory defined in a separate file. Channel 12 in the input file.* Ambisonics, order 1. Channels 1-4 in the input audio file. *CICP6 channel bed. Channels 5-10 in the input audio file.* ISM with 2 defined positions (-90,0) and (90,0). Channel 11 in the input file. The object will start at position (-90,0) and stay there for 5 frames, then move to (90,0) and stay there for 5 frames. This trajectory is looped over the duration of the input audio file. - -``` -./input_audio.wav4ISM12path/to/IVAS_ISM_metadata.csv -3 -SBA -1 -1 -MC -5 -6 -ISM -1 -1 -25,-90,05,90, -``` - -## 3. Script for converting formats and binauralizing - -The script audio3dtools.py can convert between different input and output formats and binauralize signals. - -Execute `python -m pyaudio3dtools.audio3dtools --help` for usage. - -### 3.1. Binauralizing with head rotation - -This example binauralizes a HOA3 signal with a head-rotation trajectory. Head rotation is peformed in SHD. It is supported for HOA3 and META input formats. For META input format, the audioscene is first prerendered to HOA3 and then rotated and binauralized. - -``` -python -m pyaudio3dtools.audio3dtools -i hoa3_input.wav -o . -F BINAURAL -T .\trajectories\full_circle_in_15s -``` - -### 3.2. Generating binaural reference signals - -Currently MC input signals are supported. The reference processing can be activated by selecting BINAURAL[_ROOM]_REF as output format. The signals are generated by convolving the channels with the filters from the database that are closes to the current position of the virtual LS. All interpolation methods supported by numpy can be chosen between the measured points along the trajectory. - -``` -python -m pyaudio3dtools.audio3dtools -i cicp6_input.wav -o . -F BINAURAL_REF -T .\trajectories\full_circle_in_15s -``` - -### 3.3. Rendering ISM to Custom loudspeakers with auxiliary binaural output -ISM metadata can either be specified via an input text file in the Renderer Metadata definition format, or via the commandline using the same style as IVAS: -``` -python -m pyaudio3dtools.audio3dtools -i ism2.wav -f ISM2 -m ism1.csv NULL -F 7_1_4 -o . -b -T .\trajectories\full_circle_in_15s -``` diff --git a/scripts/batch_comp_audio.py b/scripts/batch_comp_audio.py index 72ae3fcc7d..97e9f8f548 100755 --- a/scripts/batch_comp_audio.py +++ b/scripts/batch_comp_audio.py @@ -96,10 +96,9 @@ def main(args): if not args.diffs_only or diff > 0: if diff == 0.0: - label = "\033[00;32m[OKAY]\033[00;00m" + label = "[OKAY]" else: - label = "\033[00;31m[FAIL]\033[00;00m" - + label = "[FAIL]" result = f"{label} Max. diff (PCM) for file {f}: {diff}" if args.verbose and diff != 0.0: @@ -108,10 +107,10 @@ def main(args): print(result, file=out_file) - if num_files_diff > 0: - print(f"{num_files_diff} files differ/don't exist", file=out_file) - else: - print(f"All files are bitexact", file=out_file) + if num_files_diff > 0: + print(f"{num_files_diff} files differ/don't exist", file=out_file) + else: + print(f"All files are bitexact", file=out_file) def compare_files(f, fol1, fol2, outputs_dict): diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa new file mode 100644 index 0000000000..7c30b0de53 --- /dev/null +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA1.sofa @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be90326a0196b802502d2d93dcaacc2bcec15f6d79f1b8d4c7e69564f32e1132 +size 46952 diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa new file mode 100644 index 0000000000..9d91f9a04d --- /dev/null +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA2.sofa @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6acd3ec4d8e0d586dac663b53124a90be699244fa21107d553fca00af00fa373 +size 51905 diff --git a/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa new file mode 100644 index 0000000000..74e60618a0 --- /dev/null +++ b/scripts/binauralRenderer_interface/HRIRs_sofa/HRIR_128_48000_dolby_SBA3.sofa @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:872b1d794d77f1987a38f20cc3cb5627aee67bfd01ed7a50ab3514e0accedea5 +size 58924 diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c index a7d4391c75..6c0054ff6b 100644 --- a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c +++ b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c @@ -58,8 +58,12 @@ #define DEFAULT_BIN_FILE_EXT ".bin" #define IVAS_NB_RENDERER_TYPE 7 -#define IVAS_NB_AUDIO_CONFIG 2 -#define IVAS_NB_SAMPLERATE 3 +#ifdef UPDATE_SBA_FILTER +#define IVAS_NB_AUDIO_CONFIG 4 +#else +#define IVAS_NB_AUDIO_CONFIG 2 +#endif +#define IVAS_NB_SAMPLERATE 3 const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = { RENDERER_BINAURAL_FASTCONV, @@ -72,8 +76,15 @@ const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = { }; const BINAURAL_INPUT_AUDIO_CONFIG input_cfgs[IVAS_NB_AUDIO_CONFIG] = { BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, +#ifdef UPDATE_SBA_FILTER + BINAURAL_INPUT_AUDIO_CONFIG_HOA3, + BINAURAL_INPUT_AUDIO_CONFIG_HOA2, + BINAURAL_INPUT_AUDIO_CONFIG_FOA +#else BINAURAL_INPUT_AUDIO_CONFIG_HOA +#endif }; + const int32_t sample_rates[IVAS_NB_SAMPLERATE] = { 48000, 32000, 16000 }; /* Hz */ /* 8000 Hz not supported by mdft */ #ifdef FILE_HEADER @@ -323,7 +334,7 @@ int main( int argc, char *argv[] ) setOfHRTF[nbHRTF] = create_hrtf_tdrend( freq_ptr[k], &hrtf_size ); if ( hrtf_size == -1 ) { - fprintf( stderr, "Creation of HRTF (%d, %d, %d) failed!\n\n", rend_types[i], input_cfgs[j], freq_ptr[k] ); + fprintf( stderr, "Creation of HRTF (%d, %d) failed!\n\n", rend_types[i], freq_ptr[k] ); for ( l = 0; l < nbHRTF; l++ ) { free( setOfHRTF[l] ); @@ -820,7 +831,11 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG cldfb_nchan_max = CLDFB_NO_CHANNELS_MAX; } } +#ifdef UPDATE_SBA_FILTER + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { @@ -832,6 +847,32 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG hrtf_channels = HRTF_SH_CHANNELS; num_taps = BINAURAL_NTAPS; } +#ifdef UPDATE_SBA_FILTER + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* No HOA2 BRIRs */ + return NULL; + } + + latency_s = FASTCONV_HOA2_latency_s; + hrtf_channels = 9; + num_taps = BINAURAL_NTAPS; + } + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) + { + /* No HOA2 BRIRs */ + return NULL; + } + + latency_s = FASTCONV_FOA_latency_s; + hrtf_channels = 4; + num_taps = BINAURAL_NTAPS; + } +#endif else { fprintf( stderr, "Unsupported renderer type in create_hrtf_fastconv()\n\n" ); @@ -943,7 +984,11 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } // HRIR_HOA3 +#ifdef UPDATE_SBA_FILTER + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float hrtf_wptr += sizeof( float ); @@ -988,6 +1033,99 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } } +#ifdef UPDATE_SBA_FILTER + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float + hrtf_wptr += sizeof( float ); + + memcpy( hrtf_wptr, &( hrtf_channels ), sizeof( uint16_t ) ); // hrtf_channels => uint16_t + hrtf_wptr += sizeof( uint16_t ); + + memcpy( hrtf_wptr, &( num_taps ), sizeof( uint16_t ) ); // num_taps => uint16_t + hrtf_wptr += sizeof( uint16_t ); + + data_size_tmp = num_taps * sizeof( float ); + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &leftHRIRReal_HOA2[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &leftHRIRImag_HOA2[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &rightHRIRReal_HOA2[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &rightHRIRImag_HOA2[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + } + // FOA + else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float + hrtf_wptr += sizeof( float ); + + memcpy( hrtf_wptr, &( hrtf_channels ), sizeof( uint16_t ) ); // hrtf_channels => uint16_t + hrtf_wptr += sizeof( uint16_t ); + + memcpy( hrtf_wptr, &( num_taps ), sizeof( uint16_t ) ); // num_taps => uint16_t + hrtf_wptr += sizeof( uint16_t ); + + data_size_tmp = num_taps * sizeof( float ); + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &leftHRIRReal_FOA[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &leftHRIRImag_FOA[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &rightHRIRReal_FOA[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) + { + for ( j = 0; j < hrtf_channels; j++ ) + { + memcpy( hrtf_wptr, &rightHRIRImag_FOA[i][j], data_size_tmp ); + hrtf_wptr += data_size_tmp; + } + } + } +#endif // BRIR else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) { @@ -1191,7 +1329,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON { if ( frequency == 48000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_48kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz ); @@ -1209,7 +1347,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 32000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_32kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz ); @@ -1227,7 +1365,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 16000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_16kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz ); @@ -1251,11 +1389,15 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } +#ifdef UPDATE_SBA_FILTER + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) +#else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { if ( frequency == 48000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_48kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz ); @@ -1269,11 +1411,12 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; + result = 0; } else if ( frequency == 32000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_32kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz ); @@ -1291,7 +1434,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 16000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_HOA3_HRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA3_HRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_16kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz ); @@ -1315,6 +1458,118 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } +#ifdef UPDATE_SBA_FILTER + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) + { + if ( frequency == 48000 ) + { + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_48kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_48kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_48kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz; + result = 0; + } + else if ( frequency == 32000 ) + { + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_32kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_32kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_32kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz; + result = 0; + } + else if ( frequency == 16000 ) + { + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_HOA2_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_16kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_re_16kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_im_16kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz; + result = 0; + } + hrtf_table_dims_out.max_num_ir = 9; + } + else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) + { + if ( frequency == 48000 ) + { + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_48kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_48kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_48kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz; + result = 0; + } + else if ( frequency == 32000 ) + { + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_32kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_32kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_32kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz; + result = 0; + } + else if ( frequency == 16000 ) + { + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_FOA_HRIR_latency_s; + hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_16kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz ); + hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz ); + hrtf_table_ptrs_out.pIndex_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz ); + hrtf_table_ptrs_out.index_frequency_max_diffuse = (uint16_t *) ( &CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz ); + hrtf_table_ptrs_out.inv_diffuse_weight = (float *) ( &CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz ); + hrtf_table_ptrs_out.coeff_re = (float *) ( &CRendBin_FOA_HRIR_coeff_re_16kHz ); + hrtf_table_ptrs_out.coeff_im = (float *) ( &CRendBin_FOA_HRIR_coeff_im_16kHz ); + hrtf_table_ptrs_out.coeff_diffuse_re = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz ); + hrtf_table_ptrs_out.coeff_diffuse_im = (float *) ( &CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz ); + + hrtf_table_dims_out.max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz; + result = 0; + } + hrtf_table_dims_out.max_num_ir = 4; + } +#endif } else if ( rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -1322,7 +1577,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON { if ( frequency == 48000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_48kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz ); @@ -1340,7 +1595,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 32000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_32kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz ); @@ -1358,7 +1613,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } else if ( frequency == 16000 ) { - hrtf_table_ptrs_out.latency_s = &CRendBin_Combined_BRIR_latency_s; + hrtf_table_ptrs_out.latency_s = (float *) &CRendBin_Combined_BRIR_latency_s; hrtf_table_ptrs_out.num_iterations = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_16kHz ); hrtf_table_ptrs_out.pIndex_frequency_max = (uint16_t *) ( &CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz ); hrtf_table_ptrs_out.num_iterations_diffuse = (uint16_t *) ( &CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz ); @@ -1382,7 +1637,11 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } +#ifdef UPDATE_SBA_FILTER + else if ( ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) ) +#else else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) +#endif { result = 0; } @@ -1458,6 +1717,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } } + // Copy the results if ( ( result == 0 ) && ( hrtf_table_ptrs != NULL ) ) { diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt b/scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt new file mode 100644 index 0000000000..8648ecb2e6 --- /dev/null +++ b/scripts/binauralRenderer_interface/Table_Format_Converter/tables_format_converter_readme.txt @@ -0,0 +1,60 @@ +/****************************************************************************************************** + + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +Table Format Converter program +------------------------------ + +The table format converter is used to generate the file containing the binary representation of the binaural +filters for renderers (dynamic loading of generated file using –hrtf argument). +This tool is able : + - to generate binary file for MIXER_CONV, MIXER_CONV_ROOM (tables conversion from ROM); + - to aggregate the binary HR filter of OBJECTS_TD (to be done : FASTCONV and PARAMETRIC binaural) + +First, build the converter under scripts/binauralRenderer_interface/Table_Format_Converter/ in VSCode (using CMakeList). + +Usage: +------ +tables_format_converter [Options] + +Mandatory parameters : + +Options : +-output_file_path : Path where output file will be created (with separator, default = './'). +-output_file_name : Name of output file (without extension .bin, default = 'ivas_binaural'). +-16 : Select 16 kHz sampling frequency (no multiple values, all frequencies by default). +-32 : Select 32 kHz sampling frequency (no multiple values, all frequencies by default). +-48 : Select 48 kHz sampling frequency (no multiple values, all frequencies by default). +-input_td_file_path : Path of binary files for time-domain renderer (with separator, used as flag). +-input_td_file_name : Name of input td file (without extension .bin, default = 'hrfilter_model'). + +For example : +tables_format_converter(.exe) -output_file_path './' -48 -input_td_file_path './../../../td_object_renderer/hrtf_data/Orange_53/' -input_td_file_name 'hrfilter_model_v002' \ No newline at end of file diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin index b9a35aa26b..980668c27e 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81d8c14bf10697a0353c15986fde3432df1b6909ea2d122ce3599b3655237d71 -size 2074176 +oid sha256:07d2de62c345650f19a404001c5502e64f72277e6c689064e204a7031779bc0e +size 2072948 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin index 992a1c61fa..9659006ef6 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16b993a0af01bf8b8289e554452e6d2c98e7b977bf2a40f0afd3ca7498d39f8b -size 2578388 +oid sha256:d2c8461458ca23f86f592acf102edfec4eb80bbb935bb324e04ab1c535d0dd94 +size 2573320 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin index eaf5d445fe..d2dee97c34 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a29e9692bd5be5e93358db63159f55851d12f66c0382ff14afb642090427685 -size 2860964 +oid sha256:80043c85556218c5444c87aa2a86498ab4158fc40c6f4c3190caa182af1553e5 +size 2852056 diff --git a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c index 3f847f83cf..5858b430d9 100644 --- a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c +++ b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c @@ -169,7 +169,9 @@ int main( int argc, char *argv[] ) char *lib_rend_path = NULL; bool no_optim = false; + bool add_define = false; int notEndingWithSeparator = 0; + char *sofa_name = NULL; int i = 1; /* Optional arguments */ @@ -194,6 +196,11 @@ int main( int argc, char *argv[] ) no_optim = true; i++; } + else if ( strcmp( to_upper( argv[i] ), "-ADD_DEFINE" ) == 0 ) + { + add_define = true; + i++; + } else { fprintf( stderr, "Unknown option: %s\n\n", argv[i] ); @@ -389,9 +396,44 @@ int main( int argc, char *argv[] ) int err = 0; for ( ; i < argc; i++ ) { + if ( add_define ) + { + fp = fopen( c_file_path, "a" ); + if ( fp ) + { + sofa_name = strrchr( argv[i], '/' ); + size_t size_path = strlen( sofa_name ); + sofa_name = malloc( sizeof( char ) * size_path - 5 ); + strncpy( sofa_name, strrchr( argv[i], '/' ) + 1, size_path - 5 ); + sofa_name[size_path - 6] = '\0'; + fprintf( fp, "\n#ifdef USE_%s\n", to_upper( sofa_name ) ); + fclose( fp ); + } + fp = fopen( h_file_path, "a" ); + if ( fp ) + { + fprintf( fp, "\n#ifdef USE_%s\n", to_upper( sofa_name ) ); + fclose( fp ); + } + } err = generate_crend_ivas_tables_from_sofa( argv[i], no_optim ); if ( err != 0 ) return err; + if ( add_define ) + { + fp = fopen( c_file_path, "a" ); + if ( fp ) + { + fprintf( fp, "\n#endif /* USE_%s */\n", to_upper( sofa_name ) ); + fclose( fp ); + } + fp = fopen( h_file_path, "a" ); + if ( fp ) + { + fprintf( fp, "\n#endif /* USE_%s */\n", to_upper( sofa_name ) ); + fclose( fp ); + } + } } fp = fopen( h_file_path, "a" ); if ( fp ) @@ -812,7 +854,7 @@ int generate_crend_ivas_tables_from_sofa( const char *file_path, bool no_optim ) ivas_set_hrtf_fr( &hrtf_data, ivas_hrtf, frame_len ); } -#ifdef FIX_BINAURAL_DELAY_PRECISION +#ifdef UPDATE_SBA_FILTER hrtf_data.latency_s += 0.000000001f; #endif @@ -992,8 +1034,9 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int { /* float latency_s; */ fprintf( fp, "\n\n/********************** %s_%s **********************/\n", DECLARATION_NAME, lscfg.name ); -#ifdef FIX_BINAURAL_DELAY_PRECISION - fprintf( fp, "\nconst float %s_%s_latency_s = %10.9ff;", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); +#ifdef UPDATE_SBA_FILTER + fprintf( fp, "\n#ifdef FIX_BINAURAL_DELAY_PRECISION\nconst float %s_%s_latency_s = %10.9ff;\n#else", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); + fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;\n#endif", DECLARATION_NAME, lscfg.name, hrtf->latency_s - 0.000000001f ); #else fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); #endif diff --git a/scripts/config/ci_linux_sidstart_test.json b/scripts/config/ci_linux_sidstart_test.json new file mode 100644 index 0000000000..3436d9eaea --- /dev/null +++ b/scripts/config/ci_linux_sidstart_test.json @@ -0,0 +1,25 @@ +{ + "afspPath": "not_needed", + "utilPath": "/tools", + "inpaths": { + "MONO": "/usr/local/testv/test_mono.wav", + "STEREO": "/usr/local/testv/test_stereo.wav", + "FOA": "/usr/local/ltv/ltv48_FOA.wav", + "HOA2": "/usr/local/ltv/ltv48_HOA2.wav", + "HOA3": "/usr/local/ltv/ltv48_HOA3.wav", + "SBA": "/usr/local/ltv/ltv48_HOA3.wav", + "MASA1TC1DIR": "/usr/local/testv/test_MASA_1dir1TC.wav", + "MASA1TC2DIR": "/usr/local/testv/test_MASA_2dir1TC.wav", + "MASA2TC1DIR": "/usr/local/testv/test_MASA_1dir2TC.wav", + "MASA2TC2DIR": "/usr/local/testv/test_MASA_2dir2TC.wav", + "5_1": "/usr/local/testv/test_MC51.wav", + "5_1_2": "/usr/local/testv/test_MC51p2.wav", + "5_1_4": "/usr/local/testv/test_MC51p4.wav", + "7_1": "/usr/local/testv/test_MC71.wav", + "7_1_4": "/usr/local/testv/test_MC71p4.wav", + "ISM1": "/usr/local/testv/test_mono.wav", + "ISM2": "/usr/local/testv/test_ISM_2obj.wav", + "ISM3": "/usr/local/testv/test_ISM_3obj.wav", + "ISM4": "/usr/local/testv/test_ISM_4obj.wav" + } +} diff --git a/scripts/config/ivas_modes.json b/scripts/config/ivas_modes.json index 2f8d4ce398..97bfb263f8 100644 --- a/scripts/config/ivas_modes.json +++ b/scripts/config/ivas_modes.json @@ -964,6 +964,44 @@ ] } }, + "MASA_1TC_1DIR_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-masa", + "1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "7_1_4": [], + "HOA3": [], + "mono": [], + "stereo": [], + "EXT": [] + }, + "in_config": "MASA1TC1DIR", + "table_name": "MASA 1TC 1DIR@{table_bitrate} kbps RS {bandwidth}", + "nummetadata": 1, + "metadatafilenames": [ + "{item}.met" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + } + } + + }, "MASA_2TC_1DIR_b{bitrate}_{bandwidth}_cbr": { "encmodeoption": [ "-masa", @@ -1034,6 +1072,46 @@ ] } }, + "MASA_2TC_1DIR_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-masa", + "2" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "7_1_4": [], + "HOA3": [], + "mono": [], + "stereo": [], + "EXT": [] + }, + "in_config": "MASA2TC1DIR", + "table_name": "MASA 2TC 1DIR@{table_bitrate} kbps {bandwidth}", + "nummetadata": 1, + "metadatafilenames": [ + "{item}.met" + ], + "rs": true, + "amr": false, + "mono": false, + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_13k2_512k.bin" + } + } + }, "MASA_1TC_2DIR_b{bitrate}_{bandwidth}_cbr": { "encmodeoption": [ "-masa", @@ -1851,6 +1929,39 @@ ] } }, + "ISM1_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism", + "1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM1", + "table_name": "ISM1@{table_bitrate} RS kbps {bandwidth}", + "nummetadata": 1, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_13k2_128k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_13k2_128k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_32k_128k.bin" + } + } + }, "ISM1_b{bitrate}_dtx_{bandwidth}_cbr": { "encmodeoption": [ "-ism", @@ -2030,6 +2141,39 @@ 256000 ] } + }, + "ISM2_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism", + "2" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM2", + "table_name": "ISM2@{table_bitrate} kbps RS {bandwidth}", + "nummetadata": 2, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_16k4_256k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_16k4_256k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_32k_256k.bin" + } + } } }, "ISM3": { @@ -2157,6 +2301,39 @@ 384000 ] } + }, + "ISM3_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism", + "3" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM3", + "table_name": "ISM3@{table_bitrate} kbps {bandwidth}", + "nummetadata": 3, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_24k4_384k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_24k4_384k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_32k_384k.bin" + } + } } }, "ISM4": { @@ -2290,8 +2467,537 @@ 512000 ] } + }, + "ISM4_b{bitrate}_{bandwidth}_rs": { + "encmodeoption": [ + "-ism", + "4" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM4", + "table_name": "ISM4@{table_bitrate} kbps RS {bandwidth}", + "nummetadata": 4, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": true, + "amr": false, + "mono": false, + "bitrates": { + "wb": { + "all": "{sw_files_path}/sw_24k4_384k.bin" + }, + "swb": { + "all": "{sw_files_path}/sw_24k4_384k.bin" + }, + "fb": { + "all": "{sw_files_path}/sw_32k_384k.bin" + } + } } }, + "ISM+1": { + "ISM+1_b{bitrate}_{bandwidth}_cbr": { + "encmodeoption": [ + "-ism", + "+1" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM1", + "table_name": "ISM+1@{table_bitrate} kbps {bandwidth}", + "nummetadata": 1, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": false, + "amr": false, + "mono": false, + "bitrates": { + "wb": [ + 13200, + 16400, + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000 + ], + "swb": [ + 13200, + 16400, + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000 + ], + "fb": [ + 32000, + 48000, + 64000, + 80000, + 96000, + 128000 + ] + } + }, + "ISM+1_b{bitrate}_dtx_{bandwidth}_cbr": { + "encmodeoption": [ + "-ism", + "+1" + ], + "encoptions": [ + "-dtx", + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM1", + "table_name": "ISM+1@{table_bitrate} kbps DTX {bandwidth}", + "nummetadata": 1, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": false, + "amr": false, + "mono": false, + "bitrates": { + "wb": [ + 13200, + 16400, + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000 + ], + "swb": [ + 13200, + 16400, + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000 + ], + "fb": [ + 32000, + 48000, + 64000, + 80000, + 96000, + 128000 + ] + } + } + }, + "ISM+2": { + "ISM+2_b{bitrate}_{bandwidth}_cbr": { + "encmodeoption": [ + "-ism", + "+2" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM2", + "table_name": "ISM+2@{table_bitrate} kbps {bandwidth}", + "nummetadata": 2, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": false, + "amr": false, + "mono": false, + "bitrates": { + "wb": [ + 16400, + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000 + ], + "swb": [ + 16400, + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000 + ], + "fb": [ + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000 + ] + } + }, + "ISM+2_b{bitrate}_dtx_{bandwidth}_cbr": { + "encmodeoption": [ + "-dtx", + "-ism", + "+2" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM2", + "table_name": "ISM+2@{table_bitrate} kbps DTX {bandwidth}", + "nummetadata": 2, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": false, + "amr": false, + "mono": false, + "bitrates": { + "wb": [ + 16400, + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000 + ], + "swb": [ + 16400, + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000 + ], + "fb": [ + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000 + ] + } + } + }, + "ISM+3": { + "ISM+3_b{bitrate}_{bandwidth}_cbr": { + "encmodeoption": [ + "-ism", + "+3" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM3", + "table_name": "ISM+3@{table_bitrate} kbps {bandwidth}", + "nummetadata": 3, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": false, + "amr": false, + "mono": false, + "bitrates": { + "wb": [ + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000 + ], + "swb": [ + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000 + ], + "fb": [ + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000 + ] + } + }, + "ISM+3_b{bitrate}_dtx_{bandwidth}_cbr": { + "encmodeoption": [ + "-dtx", + "-ism", + "+3" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM3", + "table_name": "ISM+3@{table_bitrate} kbps DTX {bandwidth}", + "nummetadata": 3, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": false, + "amr": false, + "mono": false, + "bitrates": { + "wb": [ + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000 + ], + "swb": [ + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000 + ], + "fb": [ + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000 + ] + } + } + }, + "ISM+4": { + "ISM+4_b{bitrate}_{bandwidth}_cbr": { + "encmodeoption": [ + "-ism", + "+4" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM4", + "table_name": "ISM+4@{table_bitrate} kbps {bandwidth}", + "nummetadata": 4, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": false, + "amr": false, + "mono": false, + "bitrates": { + "wb": [ + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000, + 512000 + ], + "swb": [ + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000, + 512000 + ], + "fb": [ + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000, + 512000 + ] + } + }, + "ISM+4_b{bitrate}_dtx_{bandwidth}_cbr": { + "encmodeoption": [ + "-dtx", + "-ism", + "+4" + ], + "encoptions": [ + "-max_band", + "{bandwidth}" + ], + "dec": { + "EXT": [] + }, + "in_config": "ISM4", + "table_name": "ISM+4@{table_bitrate} kbps DTX {bandwidth}", + "nummetadata": 4, + "metadatafilenames": [ + "stvISM{mdi}.csv" + ], + "rs": false, + "amr": false, + "mono": false, + "bitrates": { + "wb": [ + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000, + 512000 + ], + "swb": [ + 24400, + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000, + 512000 + ], + "fb": [ + 32000, + 48000, + 64000, + 80000, + 96000, + 128000, + 160000, + 192000, + 256000, + 384000, + 512000 + ] + } + } + }, "stereo": { "stereo_b{bitrate}_{bandwidth}_cbr": { "encmodeoption": [ diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 91bca7eef2..81fe3cff88 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -900,6 +900,14 @@ ../IVAS_cod -mc 7_1_4 96000 48 testv/stv714MC48c.wav bit ../IVAS_dec -fec 5 5_1 48 bit testv/stv714MC48c.wav_MC714_96000_48-48_5_1_FEC5.tst +// Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, BINAURAL out +../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC_binaural.tst + +// Multi-channel 7_1_4 at 160 kbps, 48kHz in, 48kHz out, 7_1_4 out +../IVAS_cod -mc 7_1_4 160000 48 testv/stv714MC48c.wav bit +../IVAS_dec 7_1_4 48 bit testv/stv714MC48c.wav_MC714_160000_48-48_MC714.tst + // Multi-channel 5_1_2 at 32 kbps, 48kHz in, 48kHz out, STEREO out, random FEC at 5% ../IVAS_cod -mc 5_1_2 32000 48 testv/stv512MC48c.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stv512MC48c.wav_MC714_32000_48-48_Stereo.tst @@ -1016,3 +1024,14 @@ networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit networkSimulator_g192 ../scripts/dly_error_profiles/dly_error_profile_5.dat bit netsimoutput tracefile_sim 2 0 ../IVAS_dec -Tracefile tracefile_dec -VOIP 7_1_4 48 netsimoutput testv/stv51MC48c.wav_MC51_384000_48-48_7_1_4_JBM5.tst + + + +// NON DIEGETiC PAN at 60 kbps, 48kHz in, 48kHz out, STEREO out +../IVAS_cod 64000 48 testv/stv48c.wav bit +../IVAS_dec -non_diegetic_pan -0.5 48 bit testv/stv48c.pcm_MONO_64000_48-48_STEREO_NON-DIEGETIC-PAN_-0.5.tst + +// 4 ISM with extended metadata and non diegetic pan object switching bitrate 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out +../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM_with_no_diegetic_switch.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s+non_diegetic_pan.wav_brate_256000-48_DTX_binaural.tst + diff --git a/scripts/cut_bs.py b/scripts/cut_bs.py index 5fee9845e7..4986ccec21 100755 --- a/scripts/cut_bs.py +++ b/scripts/cut_bs.py @@ -35,11 +35,32 @@ import argparse import os.path import sys -SID_BITS = {35, 48, 88, 100} +SID_BITS = {35, 48, 104} SYNC_WORDS = {b"!k", b" k"} -def cut_bs(fp, fp_out, start_frame=0, start_with_sid=False): +def cut_to_length(fp, fp_out, length): + assert length > 0 + + fr_cnt = 0 + + for f in range(length): + sync_word = fp.read(2) + if sync_word == b"": + return fr_cnt + if sync_word not in SYNC_WORDS: + raise ValueError("Bad Sync word!") + n_bits_bs = fp.read(2) + n_bits = struct.unpack("h", n_bits_bs)[0] + fp_out.write(sync_word) + fp_out.write(n_bits_bs) + fp_out.write(fp.read(n_bits * 2)) + fr_cnt += 1 + + return fr_cnt + + +def cut_from_start(fp, fp_out, start_frame=0, start_with_sid=False): # cut until start frame fr_cnt = 0 cut_cnt = 0 @@ -86,20 +107,20 @@ def cut_bs(fp, fp_out, start_frame=0, start_with_sid=False): fp_out.write(n_bits_bs) fp_out.write(fp.read(n_bits * 2)) fr_cnt += 1 - return (fr_cnt, cut_cnt) if __name__ == "__main__": my_parser = argparse.ArgumentParser( - description="Cut frames from the beginning of a G.192 bit stream file" + description="Cut a G.192 bit stream file" ) my_parser.add_argument( - "--sid", "-s", help="Cut until the first SID frame", action="store_true" + "--sid", "-s", help="Cut away all frames before the first SID frame", action="store_true" ) my_parser.add_argument( - "--frame", "-f", type=int, help="Number of frames to cut.", default=0 + "--frame", "-f", type=int, help="Number of frames to cut from the start of the file.", default=0 ) + my_parser.add_argument("--length", "-l", type=int, help="Cut bitstream to this length (in frames)", default=-1) my_parser.add_argument("bs_in", type=str, help="G.192 bit stream file name to cut") my_parser.add_argument("bs_out", type=str, help="Cut G.192 bit stream file name") my_args = my_parser.parse_args() @@ -113,10 +134,16 @@ if __name__ == "__main__": with open(my_args.bs_in, "rb") as fp_in: with open(my_args.bs_out, "wb") as fp_out: - fr_cnt, cut_cnt = cut_bs( - fp_in, fp_out, start_frame=my_args.frame, start_with_sid=my_args.sid - ) + if my_args.sid or my_args.frame: + fr_cnt, cut_cnt = cut_from_start( + fp_in, fp_out, start_frame=my_args.frame, start_with_sid=my_args.sid + ) + if my_args.sid and (fr_cnt == cut_cnt): + print("Warning! No SID frame found in bitstream!") + print(f"Cut {cut_cnt} of {fr_cnt} frames from {my_args.bs_in}") + elif my_args.length: + fr_cnt = cut_to_length(fp_in, fp_out, my_args.length) + if fr_cnt != my_args.length: + print(f"Warning! Could not cut to length {my_args.length} as bitstream only contained {fr_cnt} frames!") + print(f"Cut {my_args.bs_in} to {fr_cnt} frames") - if my_args.sid and (fr_cnt == cut_cnt): - print("Warning! No SID frame found in bitstream!") - print(f"Cut {cut_cnt} of {fr_cnt} frames from {my_args.bs_in}") diff --git a/scripts/prepare_instrumentation.sh b/scripts/prepare_instrumentation.sh index c748f19aca..70d6987496 100755 --- a/scripts/prepare_instrumentation.sh +++ b/scripts/prepare_instrumentation.sh @@ -103,7 +103,8 @@ find $targetdir -name "*.[ch]" -exec sed -i.bak -e "s/\(0x[0-9a-fA-F]*\)UL/\(\(u # run wmc_tool "tools/$system/wmc_tool" -m "$targetdir/apps/encoder.c" "$targetdir/lib_enc/*.c" "$targetdir/lib_com/*.c" >> /dev/null -"tools/$system/wmc_tool" -m "$targetdir/apps/decoder.c" "$targetdir/lib_dec/*.c" "$targetdir/lib_rend/*.c" >> /dev/null +"tools/$system/wmc_tool" -m "$targetdir/apps/decoder.c" "$targetdir/lib_dec/*.c" >> /dev/null +"tools/$system/wmc_tool" -m "$targetdir/apps/renderer.c" "$targetdir/lib_rend/*.c" >> /dev/null # automatically enable #define WMOPS in options.h sed -i.bak -e "s/\/\*[[:space:]]*\(#define[[:space:]]*WMOPS\)[[:space:]]*\*\//\1/g" $targetdir/lib_com/options.h diff --git a/scripts/prepare_mem_dryrun.py b/scripts/prepare_mem_dryrun.py old mode 100644 new mode 100755 index 21f5b81145..20da546c19 --- a/scripts/prepare_mem_dryrun.py +++ b/scripts/prepare_mem_dryrun.py @@ -1,4 +1,4 @@ -#!/bin/python3 +#!/usr/bin/env python3 import re, os, fnmatch @@ -16,6 +16,7 @@ for d in dirs: with open(fileIn, 'r') as f_in: lines = f_in.readlines() with open(fileIn, 'w') as f_out: + skip = 0 for line in lines: if re.search(r'#define\W+WMC_TOOL_SKIP', line): skip = 1 diff --git a/scripts/pyaudio3dtools/__init__.py b/scripts/pyaudio3dtools/__init__.py index 9870fb6620..33a5d39126 100644 --- a/scripts/pyaudio3dtools/__init__.py +++ b/scripts/pyaudio3dtools/__init__.py @@ -43,10 +43,5 @@ class from . import ( audioarray, audiofile, - binauralrenderer, - hoadecoder, - spatialaudioconvert, spatialaudioformat, - spatialmetadata, ) -from .EFAP import EFAP diff --git a/scripts/pyaudio3dtools/audio3dtools.py b/scripts/pyaudio3dtools/audio3dtools.py index e6c03d7b73..cfb7acb9f5 100755 --- a/scripts/pyaudio3dtools/audio3dtools.py +++ b/scripts/pyaudio3dtools/audio3dtools.py @@ -36,8 +36,6 @@ import os from pyaudio3dtools import ( audiofile, - binauralrenderer, - spatialaudioconvert, spatialaudioformat, ) @@ -47,245 +45,10 @@ logger.setLevel(logging.DEBUG) def main(): - parser = argparse.ArgumentParser( - description="Audio3DTools: Convert/Manipulate spatial audio files." + print( + f"These scripts have been deprecated! Please check out and use the latest version from https://forge.3gpp.org/rep/ivas-codec-pc/ivas-processing-scripts.git" ) - """ Required arguments """ - parser.add_argument( - "-i", - "--infiles", - required=True, - type=str, - help="input file *.wav or *.pcm or directory", - default=None, - ) - parser.add_argument( - "-o", - "--outdir", - required=True, - type=str, - help="output file *.wav or directory", - default="out", - ) - parser.add_argument( - "-f", - "--informat", - required=True, - type=str, - metavar="INFORMAT", - help="Input format (use -l/-L for a list)", - default=None, - ) - - """ Additional arguments """ - parser.add_argument( - "-F", - "--outformat", - type=str, - metavar="OUTFORMAT", - help="Output format (default = %(default)s, same as input format). Can be a custom loudspeaker layout file.", - default=None, - ) - parser.add_argument( - "-s", - "--infs", - type=int, - help="Input sampling rate (Hz) (default = %(default)s, deduced for input file)", - default=None, - ) - parser.add_argument( - "-S", - "--outfs", - type=int, - help="Output sampling rate (Hz) (default = %(default)s, same as input)", - default=None, - ) - parser.add_argument( - "-c", - "--inchan", - type=int, - help="Input number of channels (default = %(default)s, deduced for input file)", - default=None, - ) - parser.add_argument( - "-m", - "--metadata", - type=str, - nargs="+", - help="list of input metadata files (only relevant for ISM and MASA input)", - default=None, - ) - parser.add_argument( - "-fc", - "--outfc", - type=int, - help="Cut-off freq for eventual low-pass filtering (default = %(default)s)", - default=None, - ) - parser.add_argument( - "-T", - "--trajectory", - type=str, - help="Head-tracking trajectory file (default = %(default)s)", - default=None, - ) - parser.add_argument( - "-n", - "--normalize", - default=None, - type=int, - help="Normalize to given loudness with --LOUDNESS_TOOL (default = %(default)s)", - ) - - """ Miscellaneous or meta arguments """ - parser.add_argument( - "-b", - "--binaural", - help="Binauralize output *in addition to converting to output format", - action="store_true", - ) - parser.add_argument( - "--binaural_dataset", - type=str, - help="Dataset to use for binaural rendering (default = %(default)s)", - choices=["orange51", "orange52", "orange53", "orange54", "sadie"], - default="orange53", - ) - parser.add_argument( - "-l", - "--list", - help="list all supported spatial audio formats", - action="store_true", - ) - parser.add_argument( - "-L", - "--long", - help="list all supported spatial audio formats with long description", - action="store_true", - ) - parser.add_argument( - "-lt", - "--loudness_tool", - default="bs1770demo", - type=str, - help="Loudness tool to use: bs1770demo [default] or sv56demo (tool must be in $PATH or a path to the binary)", - ) - parser.add_argument( - "-rn", - "--dont-rename", - help="Disable default behaviour of renaming output files _.", - action="store_true", - ) - args = parser.parse_args() - - # Set up logging handlers - console_handler = logging.StreamHandler() - console_handler.setLevel(logging.INFO) - console_handler.setFormatter(logging.Formatter("%(message)s")) - - # Configure loggers - LOGGER_FORMAT = "%(asctime)s | %(name)-12s | %(levelname)-8s | %(message)s" - LOGGER_DATEFMT = "%m-%d %H:%M" - logging.basicConfig( - format=LOGGER_FORMAT, - datefmt=LOGGER_DATEFMT, - level=logging.INFO, - handlers=[console_handler], - ) - logger.info("Audio3DTools") - logger.info( - "Attention: you are using an older version of the pyaudio3dtools scripts (not including ISM-> binaural reference renderer or loudness tool)" - ) - logger.info("For the newest version see branch python_scripts_updates") - - if args.list is True or args.long is True: - logger.info("===Supported spatial audio formats===") - spatialaudioformat.Format.list_all(args.long) - - elif args.infiles is not None: - logger.info("===Convert spatial audio file===") - # Input folder can be a path, a file or a list of files - if os.path.isdir(args.infiles): - path = args.infiles - audio_list = [ - os.path.join(path, f) for f in os.listdir(path) if f.endswith((".wav")) - ] - else: - audio_list = [args.infiles] - - outdir = args.outdir - _, output_ext = os.path.splitext(os.path.basename(outdir)) - if (len(audio_list) == 1) and ( - (output_ext.lower() == ".wav") or (output_ext.lower() == ".pcm") - ): - outfile = outdir - else: - outfile = None - if not os.path.exists(outdir): - os.makedirs(outdir) - - for infile in audio_list: - logger.info(f" process {infile}") - - _, input_ext = os.path.splitext(os.path.basename(infile)) - - if outfile is None: - outfile = os.path.basename(infile) - if not args.dont_rename: - if args.outformat is not None: - outfile = outfile.replace(input_ext, f"_{args.outformat}.wav") - else: - outfile = outfile.replace(input_ext, ".out.wav") - outfile = os.path.join(outdir, outfile) - - spatialaudioconvert.spatial_audio_convert( - infile, - outfile, - in_format=args.informat, - in_fs=args.infs, - in_nchans=args.inchan, - in_meta_files=args.metadata, - out_format=args.outformat, - out_fs=args.outfs, - out_fc=args.outfc, - output_loudness=args.normalize, - loudness_tool=args.loudness_tool, - trajectory=args.trajectory, - binaural_dataset=args.binaural_dataset, - ) - - logger.info(f" Output {outfile}") - - if args.binaural: - if args.outformat.startswith("BINAURAL"): - raise SystemExit( - "BINAURAL output format can not be binauralized again!" - ) - - _, output_ext = os.path.splitext(os.path.basename(outfile)) - outfile_bin = outfile.replace(output_ext, "_BINAURAL.wav") - logger.info(f" Output binaural {outfile_bin}") - - spatialaudioconvert.spatial_audio_convert( - in_file=outfile, - out_file=outfile_bin, - in_format=args.outformat, - in_fs=args.outfs, - in_meta_files=args.metadata, - out_format="BINAURAL", - output_loudness=args.normalize, - loudness_tool=args.loudness_tool, - trajectory=args.trajectory, - binaural_dataset=args.binaural_dataset, - ) - - outfile = None - else: - raise Exception( - "Input file must be provided for conversion and audio manipulation." - ) - if __name__ == "__main__": main() diff --git a/scripts/pyaudio3dtools/audioarray.py b/scripts/pyaudio3dtools/audioarray.py index 87fc50b463..740c40c3c6 100644 --- a/scripts/pyaudio3dtools/audioarray.py +++ b/scripts/pyaudio3dtools/audioarray.py @@ -221,7 +221,7 @@ def cut(x: np.ndarray, limits: Tuple[int, int]) -> np.ndarray: return y -def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool=True) -> dict: +def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool = True) -> dict: """Compare two audio arrays Parameters @@ -250,7 +250,7 @@ def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool=True) -> "nsamples_diff_percentage": 0.0, "first_diff_pos_sample": -1, "first_diff_pos_channel": -1, - "first_diff_pos_frame": -1 + "first_diff_pos_frame": -1, } if per_frame: result["max_abs_diff_pos_frame"] = 0 @@ -269,7 +269,7 @@ def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool=True) -> max_diff_pos[0][0] // framesize, max_diff_pos[1][0], ] - + first_diff_pos = np.nonzero(diff) first_diff_pos = [ first_diff_pos[0][0], @@ -454,7 +454,9 @@ def get_framewise(x: np.ndarray, chunk_size: int, zero_pad=False) -> np.ndarray: if x.shape[0] % chunk_size: last_chunk = x[n_frames * chunk_size :, :] if zero_pad: - yield np.pad(last_chunk, [[0, chunk_size - (x.shape[0] % chunk_size)], [0, 0]]) + yield np.pad( + last_chunk, [[0, chunk_size - (x.shape[0] % chunk_size)], [0, 0]] + ) else: yield last_chunk diff --git a/scripts/pyaudio3dtools/audiofile.py b/scripts/pyaudio3dtools/audiofile.py index 77be42285f..5b6ffcdced 100644 --- a/scripts/pyaudio3dtools/audiofile.py +++ b/scripts/pyaudio3dtools/audiofile.py @@ -695,7 +695,6 @@ def print_plot_play(x: np.ndarray, fs: int, text: Optional[str] = "") -> None: def get_wav_file_info(filename: str) -> dict: - """ Get the format information from a WAV file. Return a dictionary with the format information @@ -713,7 +712,6 @@ def get_wav_file_info(filename: str) -> dict: fid = open(filename, "rb") try: - riff = fid.read(4) if riff == b"RIFF": @@ -769,7 +767,9 @@ def get_wav_file_info(filename: str) -> dict: if __name__ == "__main__": import argparse - parser = argparse.ArgumentParser(description="Tool for basic operations on audio files") + parser = argparse.ArgumentParser( + description="Tool for basic operations on audio files" + ) subparsers = parser.add_subparsers() def pre_trim_wrapper(pre_trim_args): @@ -779,14 +779,21 @@ if __name__ == "__main__": print("Delay currently only supported with WAV file input") exit(-1) - x, _ = readfile(pre_trim_args.input_file, fs=input_file_properties["fs"], nchannels=input_file_properties["channels"]) + x, _ = readfile( + pre_trim_args.input_file, + fs=input_file_properties["fs"], + nchannels=input_file_properties["channels"], + ) trim = int(pre_trim_args.amount_in_ms * input_file_properties["fs"] / 1000) x = x[trim:] writefile(pre_trim_args.output_file, x, fs=input_file_properties["fs"]) - - parser_delay = subparsers.add_parser("pre-trim", help="Trim a given amount of content from the beginning of the file") - parser_delay.add_argument("amount_in_ms", type=float, help="Trim amount milliseconds.") + parser_delay = subparsers.add_parser( + "pre-trim", help="Trim a given amount of content from the beginning of the file" + ) + parser_delay.add_argument( + "amount_in_ms", type=float, help="Trim amount milliseconds." + ) parser_delay.add_argument("input_file") parser_delay.add_argument("output_file") parser_delay.set_defaults(func=pre_trim_wrapper) @@ -799,7 +806,8 @@ if __name__ == "__main__": convertfile(convert_args.input_file, convert_args.output_file) parser_convert = subparsers.add_parser( - "convert", help="Convert file format (output file extension determines output format)" + "convert", + help="Convert file format (output file extension determines output format)", ) parser_convert.add_argument("input_file") parser_convert.add_argument("output_file") diff --git a/scripts/pyivastest/IvasModeAnalyzer.py b/scripts/pyivastest/IvasModeAnalyzer.py index 94e2646684..7e6d40b2e5 100644 --- a/scripts/pyivastest/IvasModeAnalyzer.py +++ b/scripts/pyivastest/IvasModeAnalyzer.py @@ -187,8 +187,9 @@ class IvasModeAnalyzer(IvasModeCollector): all_log_files = os.listdir(log_dir) for mode in self.flat_mode_list: for f in all_log_files: + search_string = re.escape("_{}".format(mode)) if ( - re.search("_{}".format(mode), f) + re.search(search_string, f) and os.path.splitext(f)[1] == LOG_FILE_EXT ): # this is a log file belonging to the ivas_format diff --git a/scripts/pyivastest/IvasScriptsCommon.py b/scripts/pyivastest/IvasScriptsCommon.py index 681e6b1b7f..a3876a2b4e 100644 --- a/scripts/pyivastest/IvasScriptsCommon.py +++ b/scripts/pyivastest/IvasScriptsCommon.py @@ -276,6 +276,12 @@ class IvasScriptArgParser(argparse.ArgumentParser): help="Cut frames from the beginning of the encoded bit stream until the first SID frame", action="store_true", ) + self.add_argument( + "--bs_length", + help="Cut bitstream to this (maximum) length. Is applied AFTER --sidstart processing, if this is given", + type=int, + default=-1, + ) self.add_argument( "--info", help="Ouput debug info in subfolders of /res (use with caution, this can generate a huge amount of data)", @@ -613,6 +619,18 @@ def runner_setup(runner, args): ] add_to_proc_chain(bs_proc_chain, sidstart_cmd) + if args["bs_length"] > 0: + bs_len = args["bs_length"] + bs_cut_cmd = [ + os.path.join(constants.SCRIPTS_BASE_DIR, "cut_bs.py"), + "--length", + f"{bs_len}", + "{in_file}", + "{out_file}", + f"{bs_len}frames", + ] + add_to_proc_chain(bs_proc_chain, bs_cut_cmd) + if bs_proc_chain != {}: runner.global_bitstream_processing = bs_proc_chain diff --git a/scripts/runIvasCodec.py b/scripts/runIvasCodec.py index 070fb8e4f0..7cf1d64a6b 100755 --- a/scripts/runIvasCodec.py +++ b/scripts/runIvasCodec.py @@ -34,6 +34,7 @@ import os.path import platform import sys import logging +import shutil from pyivastest import IvasScriptsCommon, IvasModeRunner import pyivastest.constants as constants @@ -81,6 +82,11 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript): help="Decoder binary name (default {})".format(default_dec), default=default_dec, ) + self.parser.add_argument( + "--fail_log_dir", + help="Move logs of failed modes to dir (default none)", + default=None, + ) def run(self): self.parse_args() @@ -137,13 +143,26 @@ class RunIvasCodec(IvasScriptsCommon.IvasScript): self.logger.console(" Encoder: {}".format(bin_enc), logging.INFO) self.logger.console(" Decoder: {}".format(bin_dec), logging.INFO) + runner.run() self.logger.console(" ") + fail_log_dir=None + if self.args["fail_log_dir"] is not None: + fail_log_dir = os.path.realpath(self.args["fail_log_dir"]) + if not(os.path.exists(fail_log_dir)): + os.makedirs(fail_log_dir) for r in runner.results: self.logger.console(r[0]) + if fail_log_dir is not None: + shutil.copy(r[3],fail_log_dir) + self.logger.console(" ") + encs_failed = len(runner.failed_modes["enc"]) > 0 + decs_failed = len(runner.failed_modes["dec"]) > 0 + return encs_failed or decs_failed + if __name__ == "__main__": script = RunIvasCodec() - script.run() + sys.exit(script.run()) diff --git a/scripts/switchPaths/sw_13k2_128k.bin b/scripts/switchPaths/sw_13k2_128k.bin new file mode 100644 index 0000000000..7309ee26ab --- /dev/null +++ b/scripts/switchPaths/sw_13k2_128k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9ddf71b27bcd47d5f37abb6c62146ff4fb5a848cd85605d4df87a9cc4b1d1e0 +size 60000 diff --git a/scripts/switchPaths/sw_13k2_256k.bin b/scripts/switchPaths/sw_13k2_256k.bin new file mode 100644 index 0000000000..1d0c3fac28 --- /dev/null +++ b/scripts/switchPaths/sw_13k2_256k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05fd8870e43b0eb349d5e9b3bb939574b71d3e7630940a10d6767cae2c6c4a3c +size 60000 diff --git a/scripts/switchPaths/sw_16k4_128k.bin b/scripts/switchPaths/sw_16k4_128k.bin new file mode 100644 index 0000000000..1e85a18b77 --- /dev/null +++ b/scripts/switchPaths/sw_16k4_128k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e07f8c6be0e08ed96b15c9a3daa2811ef0b596dc08cc687bce1f0ca8e49969b +size 60000 diff --git a/scripts/switchPaths/sw_16k4_256k.bin b/scripts/switchPaths/sw_16k4_256k.bin new file mode 100644 index 0000000000..47bc9c9aa3 --- /dev/null +++ b/scripts/switchPaths/sw_16k4_256k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dedd5a20cbc5594ec869b13b3e9774efd6394ad5d5b64a4e98210447c3a75ba +size 60000 diff --git a/scripts/switchPaths/sw_24k4_256k_1.bin b/scripts/switchPaths/sw_24k4_256k_1.bin new file mode 100644 index 0000000000..e285261926 --- /dev/null +++ b/scripts/switchPaths/sw_24k4_256k_1.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf5b303299209bdd4f7e007d1190c7957b17ab3ee399570f1bb87d27f3fec092 +size 60000 diff --git a/scripts/switchPaths/sw_24k4_384k.bin b/scripts/switchPaths/sw_24k4_384k.bin new file mode 100644 index 0000000000..781e3023b2 --- /dev/null +++ b/scripts/switchPaths/sw_24k4_384k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e3e7599638d3792d851a5bdc13b85d6b401ebc9724795562b1a5d25fc2c3bc6 +size 60000 diff --git a/scripts/switchPaths/sw_24k4_512k.bin b/scripts/switchPaths/sw_24k4_512k.bin new file mode 100644 index 0000000000..dcc58dbdc6 --- /dev/null +++ b/scripts/switchPaths/sw_24k4_512k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2369edc21bdf3440ceaf21de16698e38cf50c246ddf04878a5961538dded11ad +size 60000 diff --git a/scripts/switchPaths/sw_32k_128k.bin b/scripts/switchPaths/sw_32k_128k.bin new file mode 100644 index 0000000000..fc4b81e0c3 --- /dev/null +++ b/scripts/switchPaths/sw_32k_128k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdb0da661cb08cc546c3761afa1d778d2c7aa04df61b608ae4301e31867dcc2e +size 60000 diff --git a/scripts/switchPaths/sw_32k_256k.bin b/scripts/switchPaths/sw_32k_256k.bin new file mode 100644 index 0000000000..46b1e17cd4 --- /dev/null +++ b/scripts/switchPaths/sw_32k_256k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61dacf79a7582edb83c151c300392efb719f08762a963da29f9b7665305a8c5f +size 60000 diff --git a/scripts/switchPaths/sw_32k_384k.bin b/scripts/switchPaths/sw_32k_384k.bin new file mode 100644 index 0000000000..088edfacbf --- /dev/null +++ b/scripts/switchPaths/sw_32k_384k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f6e7b141b16bd21005c5169cd9bc8b7b2c96df379ce9e74788717c66b9130f +size 60000 diff --git a/scripts/switchPaths/sw_32k_512k.bin b/scripts/switchPaths/sw_32k_512k.bin new file mode 100644 index 0000000000..d385f3a890 --- /dev/null +++ b/scripts/switchPaths/sw_32k_512k.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a6eb4080fce3bc1a7ba20cfc8ef3e8ff981ebce5de7c8e45bbc12edf7f21d0c +size 60000 diff --git a/scripts/testv/stvISM1.csv b/scripts/testv/stvISM1.csv index 0082c12823..9100a52238 100644 --- a/scripts/testv/stvISM1.csv +++ b/scripts/testv/stvISM1.csv @@ -1,1500 +1,1500 @@ -0.00,0.00,0.00,0.00,1.00,0.00,0.00 -4.80,0.00,0.02,0.00,1.00,0.00,-4.80 -9.60,0.00,0.04,0.00,1.00,0.00,4.80 -14.40,0.00,0.06,0.00,1.00,0.00,-9.60 -19.20,0.00,0.09,0.00,1.00,0.00,14.40 -24.00,0.00,0.11,0.00,1.00,0.00,-14.40 -28.80,0.00,0.13,0.00,1.00,0.00,19.20 -33.60,0.00,0.15,0.00,1.00,0.00,-24.00 -38.40,0.00,0.17,0.00,1.00,0.00,24.00 -43.20,0.00,0.19,0.00,1.00,0.00,-28.80 -48.00,0.00,0.21,0.00,1.00,0.00,33.60 -52.80,0.00,0.23,0.00,1.00,0.00,-33.60 -57.60,0.00,0.26,0.00,1.00,0.00,38.40 -62.40,0.00,0.28,0.00,1.00,4.80,-38.40 -67.20,0.00,0.30,0.00,1.00,4.80,38.40 -72.00,0.00,0.32,0.00,1.00,4.80,-43.20 -76.80,0.00,0.34,0.00,1.00,9.60,43.20 -81.60,0.00,0.36,0.00,1.00,19.20,-43.20 -86.40,0.00,0.38,0.00,1.00,134.40,43.20 -91.20,0.00,0.41,0.00,1.00,168.00,-43.20 -96.00,0.00,0.43,0.00,1.00,172.80,43.20 -100.80,0.00,0.45,0.00,1.00,177.60,-43.20 -105.60,0.00,0.47,0.00,1.00,177.60,43.20 -110.40,0.00,0.49,0.00,1.00,177.60,-43.20 -115.20,0.00,0.51,0.00,1.00,177.60,38.40 -120.00,0.00,0.53,0.00,1.00,177.60,-38.40 -124.80,0.00,0.56,0.00,1.00,177.60,33.60 -129.60,0.00,0.58,0.00,1.00,177.60,-33.60 -134.40,0.00,0.60,0.00,1.00,177.60,28.80 -139.20,0.00,0.62,0.00,1.00,177.60,-28.80 -144.00,0.00,0.64,0.00,1.00,177.60,24.00 -148.80,0.00,0.66,0.00,1.00,177.60,-19.20 -153.60,0.00,0.68,0.00,1.00,177.60,19.20 -158.40,0.00,0.70,0.00,1.00,177.60,-14.40 -163.20,0.00,0.73,0.00,1.00,177.60,9.60 -168.00,0.00,0.75,0.00,1.00,177.60,-9.60 -172.80,0.00,0.77,0.00,1.00,177.60,4.80 -177.60,0.00,0.79,0.00,1.00,-177.60,-0.00 --177.60,0.00,0.81,0.00,1.00,-177.60,-0.00 --172.80,0.00,0.83,0.00,1.00,-177.60,4.80 --168.00,0.00,0.85,0.00,1.00,-177.60,-9.60 --163.20,0.00,0.88,0.00,1.00,-177.60,9.60 --158.40,0.00,0.90,0.00,1.00,-177.60,-14.40 --153.60,0.00,0.92,0.00,1.00,-177.60,19.20 --148.80,0.00,0.94,0.00,1.00,-177.60,-19.20 --144.00,0.00,0.96,0.00,1.00,-177.60,24.00 --139.20,0.00,0.98,0.00,1.00,-177.60,-28.80 --134.40,0.00,1.00,0.00,1.00,-177.60,28.80 --129.60,0.00,1.03,0.00,1.00,-177.60,-33.60 --124.80,0.00,1.05,0.00,1.00,-177.60,33.60 --120.00,0.00,1.07,0.00,1.00,-177.60,-38.40 --115.20,0.00,1.09,0.00,1.00,-177.60,38.40 --110.40,0.00,1.11,0.00,1.00,-177.60,-43.20 --105.60,0.00,1.13,0.00,1.00,-172.80,43.20 --100.80,0.00,1.15,0.00,1.00,-168.00,-43.20 --96.00,0.00,1.17,0.00,1.00,-134.40,43.20 --91.20,0.00,1.20,0.00,1.00,-19.20,-43.20 --86.40,0.00,1.22,0.00,1.00,-9.60,43.20 --81.60,0.00,1.24,0.00,1.00,-4.80,-43.20 --76.80,0.00,1.26,0.00,1.00,-4.80,43.20 --72.00,0.00,1.28,0.00,1.00,-4.80,-43.20 --67.20,0.00,1.30,0.00,1.00,-0.00,38.40 --62.40,0.00,1.32,0.00,1.00,-0.00,-38.40 --57.60,0.00,1.35,0.00,1.00,-0.00,38.40 --52.80,0.00,1.37,0.00,1.00,-0.00,-33.60 --48.00,0.00,1.39,0.00,1.00,-0.00,33.60 --43.20,0.00,1.41,0.00,1.00,-0.00,-28.80 --38.40,0.00,1.43,0.00,1.00,-0.00,24.00 --33.60,0.00,1.45,0.00,1.00,-0.00,-24.00 --28.80,0.00,1.47,0.00,1.00,-0.00,19.20 --24.00,0.00,1.50,0.00,1.00,-0.00,-14.40 --19.20,0.00,1.52,0.00,1.00,-0.00,14.40 --14.40,0.00,1.54,0.00,1.00,-0.00,-9.60 --9.60,0.00,1.56,0.00,1.00,-0.00,4.80 --4.80,0.00,1.58,0.00,1.00,-0.00,-4.80 -0.00,0.00,1.60,0.00,1.00,-0.00,0.00 -4.80,-0.00,1.62,0.00,1.00,-0.00,-4.80 -9.60,-0.00,1.64,0.00,1.00,-0.00,4.80 -14.40,-0.00,1.67,0.00,1.00,-0.00,-9.60 -19.20,-0.00,1.69,0.00,1.00,-0.00,14.40 -24.00,-0.00,1.71,0.00,1.00,-0.00,-14.40 -28.80,-0.00,1.73,0.00,1.00,-0.00,19.20 -33.60,-4.80,1.75,0.00,1.00,-4.80,-19.20 -38.40,-4.80,1.77,0.00,1.00,-4.80,24.00 -43.20,-4.80,1.79,0.00,1.00,-4.80,-24.00 -48.00,-4.80,1.82,0.00,1.00,-4.80,28.80 -52.80,-4.80,1.84,0.00,1.00,-4.80,-28.80 -57.60,-4.80,1.86,0.00,1.00,-4.80,33.60 -62.40,-4.80,1.88,0.00,1.00,-9.60,-33.60 -67.20,-4.80,1.90,0.00,1.00,-9.60,38.40 -72.00,-4.80,1.92,0.00,1.00,-14.40,-38.40 -76.80,-4.80,1.94,0.00,1.00,-24.00,38.40 -81.60,-4.80,1.97,0.00,1.00,-43.20,-38.40 -86.40,-4.80,1.99,0.00,1.00,-110.40,38.40 -91.20,-4.80,2.01,0.00,1.00,-148.80,-38.40 -96.00,-4.80,2.03,0.00,1.00,-163.20,38.40 -100.80,-4.80,2.05,0.00,1.00,-168.00,-38.40 -105.60,-4.80,2.07,0.00,1.00,-172.80,38.40 -110.40,-4.80,2.09,0.00,1.00,-172.80,-38.40 -115.20,-4.80,2.11,0.00,1.00,-172.80,33.60 -120.00,-4.80,2.14,0.00,1.00,-172.80,-33.60 -124.80,-4.80,2.16,0.00,1.00,-177.60,33.60 -129.60,-4.80,2.18,0.00,1.00,-177.60,-28.80 -134.40,-4.80,2.20,0.00,1.00,-177.60,28.80 -139.20,-4.80,2.22,0.00,1.00,-177.60,-24.00 -144.00,-4.80,2.24,0.00,1.00,-177.60,24.00 -148.80,-4.80,2.26,0.00,1.00,-177.60,-19.20 -153.60,-0.00,2.29,0.00,1.00,-177.60,14.40 -158.40,-0.00,2.31,0.00,1.00,-177.60,-14.40 -163.20,-0.00,2.33,0.00,1.00,-177.60,9.60 -168.00,-0.00,2.35,0.00,1.00,-177.60,-9.60 -172.80,-0.00,2.37,0.00,1.00,-177.60,4.80 -177.60,-0.00,2.39,0.00,1.00,177.60,-0.00 --177.60,0.00,2.41,0.00,1.00,177.60,-0.00 --172.80,0.00,2.44,0.00,1.00,177.60,4.80 --168.00,0.00,2.46,0.00,1.00,177.60,-9.60 --163.20,0.00,2.48,0.00,1.00,177.60,9.60 --158.40,0.00,2.50,0.00,1.00,177.60,-14.40 --153.60,0.00,2.52,0.00,1.00,177.60,14.40 --148.80,4.80,2.54,0.00,1.00,177.60,-19.20 --144.00,4.80,2.56,0.00,1.00,177.60,24.00 --139.20,4.80,2.58,0.00,1.00,177.60,-24.00 --134.40,4.80,2.61,0.00,1.00,177.60,28.80 --129.60,4.80,2.63,0.00,1.00,172.80,-28.80 --124.80,4.80,2.65,0.00,1.00,172.80,33.60 --120.00,4.80,2.67,0.00,1.00,172.80,-33.60 --115.20,4.80,2.69,0.00,1.00,172.80,33.60 --110.40,4.80,2.71,0.00,1.00,168.00,-38.40 --105.60,4.80,2.73,0.00,1.00,163.20,38.40 --100.80,4.80,2.76,0.00,1.00,148.80,-38.40 --96.00,4.80,2.78,0.00,1.00,110.40,38.40 --91.20,4.80,2.80,0.00,1.00,43.20,-38.40 --86.40,4.80,2.82,0.00,1.00,24.00,38.40 --81.60,4.80,2.84,0.00,1.00,14.40,-38.40 --76.80,4.80,2.86,0.00,1.00,9.60,38.40 --72.00,4.80,2.88,0.00,1.00,9.60,-38.40 --67.20,4.80,2.91,0.00,1.00,4.80,38.40 --62.40,4.80,2.93,0.00,1.00,4.80,-33.60 --57.60,4.80,2.95,0.00,1.00,4.80,33.60 --52.80,4.80,2.97,0.00,1.00,4.80,-28.80 --48.00,4.80,2.99,0.00,1.00,4.80,28.80 --43.20,4.80,3.01,0.00,1.00,4.80,-24.00 --38.40,4.80,3.03,0.00,1.00,0.00,24.00 --33.60,4.80,3.05,0.00,1.00,0.00,-19.20 --28.80,0.00,3.08,0.00,1.00,0.00,19.20 --24.00,0.00,3.10,0.00,1.00,0.00,-14.40 --19.20,0.00,3.12,0.00,1.00,0.00,14.40 --14.40,0.00,3.14,0.00,1.00,0.00,-9.60 --9.60,0.00,3.16,0.00,1.00,0.00,4.80 --4.80,0.00,3.18,0.00,1.00,0.00,-4.80 -0.00,0.00,3.20,0.00,1.00,-0.00,0.00 -4.80,-0.00,3.23,0.00,1.00,-0.00,-4.80 -9.60,-0.00,3.25,0.00,1.00,-0.00,4.80 -14.40,-0.00,3.27,0.00,1.00,-4.80,-9.60 -19.20,-4.80,3.29,0.00,1.00,-4.80,9.60 -24.00,-4.80,3.31,0.00,1.00,-4.80,-14.40 -28.80,-4.80,3.33,0.00,1.00,-4.80,14.40 -33.60,-4.80,3.35,0.00,1.00,-4.80,-19.20 -38.40,-4.80,3.38,0.00,1.00,-9.60,19.20 -43.20,-4.80,3.40,0.00,1.00,-9.60,-24.00 -48.00,-4.80,3.42,0.00,1.00,-9.60,24.00 -52.80,-9.60,3.44,0.00,1.00,-14.40,-28.80 -57.60,-9.60,3.46,0.00,1.00,-14.40,28.80 -62.40,-9.60,3.48,0.00,1.00,-19.20,-28.80 -67.20,-9.60,3.50,0.00,1.00,-24.00,33.60 -72.00,-9.60,3.52,0.00,1.00,-33.60,-33.60 -76.80,-9.60,3.55,0.00,1.00,-43.20,33.60 -81.60,-9.60,3.57,0.00,1.00,-67.20,-33.60 -86.40,-9.60,3.59,0.00,1.00,-96.00,33.60 -91.20,-9.60,3.61,0.00,1.00,-124.80,-33.60 -96.00,-9.60,3.63,0.00,1.00,-144.00,33.60 -100.80,-9.60,3.65,0.00,1.00,-153.60,-33.60 -105.60,-9.60,3.67,0.00,1.00,-158.40,33.60 -110.40,-9.60,3.70,0.00,1.00,-163.20,-33.60 -115.20,-9.60,3.72,0.00,1.00,-168.00,33.60 -120.00,-9.60,3.74,0.00,1.00,-168.00,-28.80 -124.80,-9.60,3.76,0.00,1.00,-168.00,28.80 -129.60,-9.60,3.78,0.00,1.00,-172.80,-28.80 -134.40,-4.80,3.80,0.00,1.00,-172.80,24.00 -139.20,-4.80,3.82,0.00,1.00,-172.80,-24.00 -144.00,-4.80,3.85,0.00,1.00,-172.80,19.20 -148.80,-4.80,3.87,0.00,1.00,-177.60,-19.20 -153.60,-4.80,3.89,0.00,1.00,-177.60,14.40 -158.40,-4.80,3.91,0.00,1.00,-177.60,-14.40 -163.20,-4.80,3.93,0.00,1.00,-177.60,9.60 -168.00,-0.00,3.95,0.00,1.00,-177.60,-4.80 -172.80,-0.00,3.97,0.00,1.00,-177.60,4.80 -177.60,-0.00,3.99,0.00,1.00,177.60,-0.00 --177.60,0.00,4.02,0.00,1.00,177.60,-0.00 --172.80,0.00,4.04,0.00,1.00,177.60,4.80 --168.00,0.00,4.06,0.00,1.00,177.60,-4.80 --163.20,4.80,4.08,0.00,1.00,177.60,9.60 --158.40,4.80,4.10,0.00,1.00,177.60,-14.40 --153.60,4.80,4.12,0.00,1.00,172.80,14.40 --148.80,4.80,4.14,0.00,1.00,172.80,-19.20 --144.00,4.80,4.17,0.00,1.00,172.80,19.20 --139.20,4.80,4.19,0.00,1.00,172.80,-24.00 --134.40,4.80,4.21,0.00,1.00,168.00,24.00 --129.60,9.60,4.23,0.00,1.00,168.00,-28.80 --124.80,9.60,4.25,0.00,1.00,168.00,28.80 --120.00,9.60,4.27,0.00,1.00,163.20,-28.80 --115.20,9.60,4.29,0.00,1.00,158.40,33.60 --110.40,9.60,4.32,0.00,1.00,153.60,-33.60 --105.60,9.60,4.34,0.00,1.00,144.00,33.60 --100.80,9.60,4.36,0.00,1.00,124.80,-33.60 --96.00,9.60,4.38,0.00,1.00,96.00,33.60 --91.20,9.60,4.40,0.00,1.00,67.20,-33.60 --86.40,9.60,4.42,0.00,1.00,43.20,33.60 --81.60,9.60,4.44,0.00,1.00,33.60,-33.60 --76.80,9.60,4.46,0.00,1.00,24.00,33.60 --72.00,9.60,4.49,0.00,1.00,19.20,-33.60 --67.20,9.60,4.51,0.00,1.00,14.40,33.60 --62.40,9.60,4.53,0.00,1.00,14.40,-28.80 --57.60,9.60,4.55,0.00,1.00,9.60,28.80 --52.80,9.60,4.57,0.00,1.00,9.60,-28.80 --48.00,4.80,4.59,0.00,1.00,9.60,24.00 --43.20,4.80,4.61,0.00,1.00,4.80,-24.00 --38.40,4.80,4.64,0.00,1.00,4.80,19.20 --33.60,4.80,4.66,0.00,1.00,4.80,-19.20 --28.80,4.80,4.68,0.00,1.00,4.80,14.40 --24.00,4.80,4.70,0.00,1.00,4.80,-14.40 --19.20,4.80,4.72,0.00,1.00,0.00,9.60 --14.40,0.00,4.74,0.00,1.00,0.00,-9.60 --9.60,0.00,4.76,0.00,1.00,0.00,4.80 --4.80,0.00,4.79,0.00,1.00,0.00,-4.80 -0.00,0.00,4.81,0.00,1.00,-0.00,0.00 -4.80,-0.00,4.83,0.00,1.00,-0.00,-4.80 -9.60,-0.00,4.85,0.00,1.00,-4.80,4.80 -14.40,-4.80,4.87,0.00,1.00,-4.80,-9.60 -19.20,-4.80,4.89,0.00,1.00,-4.80,9.60 -24.00,-4.80,4.91,0.00,1.00,-4.80,-9.60 -28.80,-4.80,4.93,0.00,1.00,-9.60,14.40 -33.60,-9.60,4.96,0.00,1.00,-9.60,-14.40 -38.40,-9.60,4.98,0.00,1.00,-14.40,19.20 -43.20,-9.60,5.00,0.00,1.00,-14.40,-19.20 -48.00,-9.60,5.02,0.00,1.00,-14.40,24.00 -52.80,-9.60,5.04,0.00,1.00,-19.20,-24.00 -57.60,-14.40,5.06,0.00,1.00,-24.00,24.00 -62.40,-14.40,5.08,0.00,1.00,-28.80,-28.80 -67.20,-14.40,5.11,0.00,1.00,-33.60,28.80 -72.00,-14.40,5.13,0.00,1.00,-43.20,-28.80 -76.80,-14.40,5.15,0.00,1.00,-57.60,28.80 -81.60,-14.40,5.17,0.00,1.00,-76.80,-28.80 -86.40,-14.40,5.19,0.00,1.00,-96.00,28.80 -91.20,-14.40,5.21,0.00,1.00,-115.20,-28.80 -96.00,-14.40,5.23,0.00,1.00,-129.60,28.80 -100.80,-14.40,5.26,0.00,1.00,-139.20,-28.80 -105.60,-14.40,5.28,0.00,1.00,-148.80,28.80 -110.40,-14.40,5.30,0.00,1.00,-153.60,-28.80 -115.20,-14.40,5.32,0.00,1.00,-158.40,28.80 -120.00,-14.40,5.34,0.00,1.00,-163.20,-24.00 -124.80,-9.60,5.36,0.00,1.00,-163.20,24.00 -129.60,-9.60,5.38,0.00,1.00,-168.00,-24.00 -134.40,-9.60,5.40,0.00,1.00,-168.00,19.20 -139.20,-9.60,5.43,0.00,1.00,-172.80,-19.20 -144.00,-9.60,5.45,0.00,1.00,-172.80,19.20 -148.80,-9.60,5.47,0.00,1.00,-172.80,-14.40 -153.60,-4.80,5.49,0.00,1.00,-172.80,14.40 -158.40,-4.80,5.51,0.00,1.00,-177.60,-9.60 -163.20,-4.80,5.53,0.00,1.00,-177.60,9.60 -168.00,-4.80,5.55,0.00,1.00,-177.60,-4.80 -172.80,-0.00,5.58,0.00,1.00,-177.60,4.80 -177.60,-0.00,5.60,0.00,1.00,177.60,-0.00 --177.60,0.00,5.62,0.00,1.00,177.60,-0.00 --172.80,0.00,5.64,0.00,1.00,177.60,4.80 --168.00,4.80,5.66,0.00,1.00,177.60,-4.80 --163.20,4.80,5.68,0.00,1.00,172.80,9.60 --158.40,4.80,5.70,0.00,1.00,172.80,-9.60 --153.60,4.80,5.72,0.00,1.00,172.80,14.40 --148.80,9.60,5.75,0.00,1.00,172.80,-14.40 --144.00,9.60,5.77,0.00,1.00,168.00,19.20 --139.20,9.60,5.79,0.00,1.00,168.00,-19.20 --134.40,9.60,5.81,0.00,1.00,163.20,19.20 --129.60,9.60,5.83,0.00,1.00,163.20,-24.00 --124.80,9.60,5.85,0.00,1.00,158.40,24.00 --120.00,14.40,5.87,0.00,1.00,153.60,-24.00 --115.20,14.40,5.90,0.00,1.00,148.80,28.80 --110.40,14.40,5.92,0.00,1.00,139.20,-28.80 --105.60,14.40,5.94,0.00,1.00,129.60,28.80 --100.80,14.40,5.96,0.00,1.00,115.20,-28.80 --96.00,14.40,5.98,0.00,1.00,96.00,28.80 --91.20,14.40,6.00,0.00,1.00,76.80,-28.80 --86.40,14.40,6.02,0.00,1.00,57.60,28.80 --81.60,14.40,6.05,0.00,1.00,43.20,-28.80 --76.80,14.40,6.07,0.00,1.00,33.60,28.80 --72.00,14.40,6.09,0.00,1.00,28.80,-28.80 --67.20,14.40,6.11,0.00,1.00,24.00,28.80 --62.40,14.40,6.13,0.00,1.00,19.20,-28.80 --57.60,14.40,6.15,0.00,1.00,14.40,24.00 --52.80,9.60,6.17,0.00,1.00,14.40,-24.00 --48.00,9.60,6.19,0.00,1.00,14.40,24.00 --43.20,9.60,6.22,0.00,1.00,9.60,-19.20 --38.40,9.60,6.24,0.00,1.00,9.60,19.20 --33.60,9.60,6.26,0.00,1.00,4.80,-14.40 --28.80,4.80,6.28,0.00,1.00,4.80,14.40 --24.00,4.80,6.30,0.00,1.00,4.80,-9.60 --19.20,4.80,6.32,0.00,1.00,4.80,9.60 --14.40,4.80,6.34,0.00,1.00,0.00,-9.60 --9.60,0.00,6.37,0.00,1.00,0.00,4.80 --4.80,0.00,6.39,0.00,1.00,0.00,-4.80 -0.00,0.00,6.41,0.00,1.00,-0.00,0.00 -4.80,-0.00,6.43,0.00,1.00,-4.80,-0.00 -9.60,-4.80,6.45,0.00,1.00,-4.80,4.80 -14.40,-4.80,6.47,0.00,1.00,-4.80,-4.80 -19.20,-4.80,6.49,0.00,1.00,-9.60,9.60 -24.00,-9.60,6.52,0.00,1.00,-9.60,-9.60 -28.80,-9.60,6.54,0.00,1.00,-9.60,14.40 -33.60,-9.60,6.56,0.00,1.00,-14.40,-14.40 -38.40,-9.60,6.58,0.00,1.00,-14.40,14.40 -43.20,-14.40,6.60,0.00,1.00,-19.20,-19.20 -48.00,-14.40,6.62,0.00,1.00,-24.00,19.20 -52.80,-14.40,6.64,0.00,1.00,-24.00,-19.20 -57.60,-14.40,6.66,0.00,1.00,-28.80,19.20 -62.40,-19.20,6.69,0.00,1.00,-38.40,-24.00 -67.20,-19.20,6.71,0.00,1.00,-43.20,24.00 -72.00,-19.20,6.73,0.00,1.00,-52.80,-24.00 -76.80,-19.20,6.75,0.00,1.00,-62.40,24.00 -81.60,-19.20,6.77,0.00,1.00,-76.80,-24.00 -86.40,-19.20,6.79,0.00,1.00,-96.00,24.00 -91.20,-19.20,6.81,0.00,1.00,-110.40,-24.00 -96.00,-19.20,6.84,0.00,1.00,-120.00,24.00 -100.80,-19.20,6.86,0.00,1.00,-134.40,-24.00 -105.60,-19.20,6.88,0.00,1.00,-139.20,24.00 -110.40,-19.20,6.90,0.00,1.00,-148.80,-24.00 -115.20,-19.20,6.92,0.00,1.00,-153.60,24.00 -120.00,-14.40,6.94,0.00,1.00,-158.40,-24.00 -124.80,-14.40,6.96,0.00,1.00,-158.40,19.20 -129.60,-14.40,6.99,0.00,1.00,-163.20,-19.20 -134.40,-14.40,7.01,0.00,1.00,-163.20,19.20 -139.20,-14.40,7.03,0.00,1.00,-168.00,-14.40 -144.00,-9.60,7.05,0.00,1.00,-168.00,14.40 -148.80,-9.60,7.07,0.00,1.00,-172.80,-14.40 -153.60,-9.60,7.09,0.00,1.00,-172.80,9.60 -158.40,-4.80,7.11,0.00,1.00,-172.80,-9.60 -163.20,-4.80,7.13,0.00,1.00,-177.60,9.60 -168.00,-4.80,7.16,0.00,1.00,-177.60,-4.80 -172.80,-0.00,7.18,0.00,1.00,-177.60,4.80 -177.60,-0.00,7.20,0.00,1.00,177.60,-0.00 --177.60,0.00,7.22,0.00,1.00,177.60,-0.00 --172.80,0.00,7.24,0.00,1.00,177.60,4.80 --168.00,4.80,7.26,0.00,1.00,172.80,-4.80 --163.20,4.80,7.28,0.00,1.00,172.80,9.60 --158.40,4.80,7.31,0.00,1.00,172.80,-9.60 --153.60,9.60,7.33,0.00,1.00,168.00,9.60 --148.80,9.60,7.35,0.00,1.00,168.00,-14.40 --144.00,9.60,7.37,0.00,1.00,163.20,14.40 --139.20,14.40,7.39,0.00,1.00,163.20,-14.40 --134.40,14.40,7.41,0.00,1.00,158.40,19.20 --129.60,14.40,7.43,0.00,1.00,158.40,-19.20 --124.80,14.40,7.46,0.00,1.00,153.60,19.20 --120.00,14.40,7.48,0.00,1.00,148.80,-24.00 --115.20,19.20,7.50,0.00,1.00,139.20,24.00 --110.40,19.20,7.52,0.00,1.00,134.40,-24.00 --105.60,19.20,7.54,0.00,1.00,120.00,24.00 --100.80,19.20,7.56,0.00,1.00,110.40,-24.00 --96.00,19.20,7.58,0.00,1.00,96.00,24.00 --91.20,19.20,7.60,0.00,1.00,76.80,-24.00 --86.40,19.20,7.63,0.00,1.00,62.40,24.00 --81.60,19.20,7.65,0.00,1.00,52.80,-24.00 --76.80,19.20,7.67,0.00,1.00,43.20,24.00 --72.00,19.20,7.69,0.00,1.00,38.40,-24.00 --67.20,19.20,7.71,0.00,1.00,28.80,24.00 --62.40,19.20,7.73,0.00,1.00,24.00,-24.00 --57.60,14.40,7.75,0.00,1.00,24.00,19.20 --52.80,14.40,7.78,0.00,1.00,19.20,-19.20 --48.00,14.40,7.80,0.00,1.00,14.40,19.20 --43.20,14.40,7.82,0.00,1.00,14.40,-19.20 --38.40,9.60,7.84,0.00,1.00,9.60,14.40 --33.60,9.60,7.86,0.00,1.00,9.60,-14.40 --28.80,9.60,7.88,0.00,1.00,9.60,14.40 --24.00,9.60,7.90,0.00,1.00,4.80,-9.60 --19.20,4.80,7.93,0.00,1.00,4.80,9.60 --14.40,4.80,7.95,0.00,1.00,4.80,-4.80 --9.60,4.80,7.97,0.00,1.00,0.00,4.80 --4.80,0.00,7.99,0.00,1.00,0.00,-0.00 -0.00,0.00,8.01,0.00,1.00,-0.00,0.00 -4.80,-0.00,8.03,0.00,1.00,-4.80,-0.00 -9.60,-4.80,8.05,0.00,1.00,-4.80,4.80 -14.40,-4.80,8.07,0.00,1.00,-9.60,-4.80 -19.20,-9.60,8.10,0.00,1.00,-9.60,4.80 -24.00,-9.60,8.12,0.00,1.00,-14.40,-9.60 -28.80,-9.60,8.14,0.00,1.00,-14.40,9.60 -33.60,-14.40,8.16,0.00,1.00,-19.20,-9.60 -33.60,-14.40,8.18,0.00,1.00,-19.20,14.40 -38.40,-14.40,8.20,0.00,1.00,-24.00,-14.40 -43.20,-19.20,8.22,0.00,1.00,-28.80,14.40 -48.00,-19.20,8.25,0.00,1.00,-33.60,-14.40 -57.60,-19.20,8.27,0.00,1.00,-38.40,19.20 -62.40,-19.20,8.29,0.00,1.00,-43.20,-19.20 -67.20,-24.00,8.31,0.00,1.00,-48.00,19.20 -72.00,-24.00,8.33,0.00,1.00,-57.60,-19.20 -76.80,-24.00,8.35,0.00,1.00,-67.20,19.20 -81.60,-24.00,8.37,0.00,1.00,-81.60,-19.20 -86.40,-24.00,8.40,0.00,1.00,-91.20,19.20 -91.20,-24.00,8.42,0.00,1.00,-105.60,-19.20 -96.00,-24.00,8.44,0.00,1.00,-115.20,19.20 -100.80,-24.00,8.46,0.00,1.00,-124.80,-19.20 -105.60,-24.00,8.48,0.00,1.00,-134.40,19.20 -110.40,-24.00,8.50,0.00,1.00,-139.20,-19.20 -115.20,-19.20,8.52,0.00,1.00,-144.00,19.20 -120.00,-19.20,8.54,0.00,1.00,-148.80,-19.20 -129.60,-19.20,8.57,0.00,1.00,-153.60,19.20 -134.40,-19.20,8.59,0.00,1.00,-158.40,-14.40 -139.20,-19.20,8.61,0.00,1.00,-163.20,14.40 -144.00,-14.40,8.63,0.00,1.00,-163.20,-14.40 -148.80,-14.40,8.65,0.00,1.00,-168.00,14.40 -148.80,-14.40,8.67,0.00,1.00,-168.00,-9.60 -153.60,-9.60,8.69,0.00,1.00,-172.80,9.60 -158.40,-9.60,8.72,0.00,1.00,-172.80,-9.60 -163.20,-4.80,8.74,0.00,1.00,-177.60,4.80 -168.00,-4.80,8.76,0.00,1.00,-177.60,-4.80 -172.80,-4.80,8.78,0.00,1.00,-177.60,4.80 -177.60,-0.00,8.80,0.00,1.00,177.60,-0.00 --177.60,0.00,8.82,0.00,1.00,177.60,-0.00 --172.80,4.80,8.84,0.00,1.00,177.60,4.80 --168.00,4.80,8.87,0.00,1.00,172.80,-4.80 --163.20,4.80,8.89,0.00,1.00,172.80,4.80 --158.40,9.60,8.91,0.00,1.00,168.00,-9.60 --153.60,9.60,8.93,0.00,1.00,168.00,9.60 --148.80,14.40,8.95,0.00,1.00,163.20,-9.60 --148.80,14.40,8.97,0.00,1.00,163.20,14.40 --144.00,14.40,8.99,0.00,1.00,158.40,-14.40 --139.20,19.20,9.01,0.00,1.00,153.60,14.40 --134.40,19.20,9.04,0.00,1.00,148.80,-14.40 --129.60,19.20,9.06,0.00,1.00,144.00,19.20 --120.00,19.20,9.08,0.00,1.00,139.20,-19.20 --115.20,19.20,9.10,0.00,1.00,134.40,19.20 --110.40,24.00,9.12,0.00,1.00,124.80,-19.20 --105.60,24.00,9.14,0.00,1.00,115.20,19.20 --100.80,24.00,9.16,0.00,1.00,105.60,-19.20 --96.00,24.00,9.19,0.00,1.00,91.20,19.20 --91.20,24.00,9.21,0.00,1.00,81.60,-19.20 --86.40,24.00,9.23,0.00,1.00,67.20,19.20 --81.60,24.00,9.25,0.00,1.00,57.60,-19.20 --76.80,24.00,9.27,0.00,1.00,48.00,19.20 --72.00,24.00,9.29,0.00,1.00,43.20,-19.20 --67.20,24.00,9.31,0.00,1.00,38.40,19.20 --62.40,19.20,9.34,0.00,1.00,33.60,-19.20 --57.60,19.20,9.36,0.00,1.00,28.80,19.20 --48.00,19.20,9.38,0.00,1.00,24.00,-14.40 --43.20,19.20,9.40,0.00,1.00,19.20,14.40 --38.40,14.40,9.42,0.00,1.00,19.20,-14.40 --33.60,14.40,9.44,0.00,1.00,14.40,14.40 --33.60,14.40,9.46,0.00,1.00,14.40,-9.60 --28.80,9.60,9.48,0.00,1.00,9.60,9.60 --24.00,9.60,9.51,0.00,1.00,9.60,-9.60 --19.20,9.60,9.53,0.00,1.00,4.80,4.80 --14.40,4.80,9.55,0.00,1.00,4.80,-4.80 --9.60,4.80,9.57,0.00,1.00,0.00,4.80 --4.80,0.00,9.59,0.00,1.00,0.00,-0.00 -0.00,0.00,9.61,0.00,1.00,-0.00,0.00 -4.80,-0.00,9.63,0.00,1.00,-4.80,-0.00 -9.60,-4.80,9.66,0.00,1.00,-4.80,4.80 -14.40,-4.80,9.68,0.00,1.00,-9.60,-4.80 -19.20,-9.60,9.70,0.00,1.00,-9.60,4.80 -19.20,-9.60,9.72,0.00,1.00,-14.40,-4.80 -24.00,-14.40,9.74,0.00,1.00,-19.20,9.60 -28.80,-14.40,9.76,0.00,1.00,-19.20,-9.60 -33.60,-19.20,9.78,0.00,1.00,-24.00,9.60 -38.40,-19.20,9.81,0.00,1.00,-28.80,-9.60 -43.20,-19.20,9.83,0.00,1.00,-33.60,9.60 -48.00,-24.00,9.85,0.00,1.00,-38.40,-14.40 -52.80,-24.00,9.87,0.00,1.00,-43.20,14.40 -57.60,-24.00,9.89,0.00,1.00,-48.00,-14.40 -62.40,-24.00,9.91,0.00,1.00,-52.80,14.40 -72.00,-28.80,9.93,0.00,1.00,-62.40,-14.40 -76.80,-28.80,9.95,0.00,1.00,-72.00,14.40 -81.60,-28.80,9.98,0.00,1.00,-81.60,-14.40 -86.40,-28.80,10.00,0.00,1.00,-91.20,14.40 -91.20,-28.80,10.02,0.00,1.00,-100.80,-14.40 -96.00,-28.80,10.04,0.00,1.00,-110.40,14.40 -100.80,-28.80,10.06,0.00,1.00,-120.00,-14.40 -105.60,-28.80,10.08,0.00,1.00,-129.60,14.40 -115.20,-28.80,10.10,0.00,1.00,-134.40,-14.40 -120.00,-24.00,10.13,0.00,1.00,-139.20,14.40 -124.80,-24.00,10.15,0.00,1.00,-144.00,-14.40 -129.60,-24.00,10.17,0.00,1.00,-148.80,14.40 -134.40,-24.00,10.19,0.00,1.00,-153.60,-14.40 -139.20,-19.20,10.21,0.00,1.00,-158.40,9.60 -144.00,-19.20,10.23,0.00,1.00,-163.20,-9.60 -148.80,-14.40,10.25,0.00,1.00,-163.20,9.60 -153.60,-14.40,10.28,0.00,1.00,-168.00,-9.60 -158.40,-14.40,10.30,0.00,1.00,-168.00,4.80 -163.20,-9.60,10.32,0.00,1.00,-172.80,-4.80 -163.20,-9.60,10.34,0.00,1.00,-172.80,4.80 -168.00,-4.80,10.36,0.00,1.00,-177.60,-4.80 -172.80,-4.80,10.38,0.00,1.00,-177.60,0.00 -177.60,-0.00,10.40,0.00,1.00,177.60,-0.00 --177.60,0.00,10.42,0.00,1.00,177.60,-0.00 --172.80,4.80,10.45,0.00,1.00,172.80,0.00 --168.00,4.80,10.47,0.00,1.00,172.80,-4.80 --163.20,9.60,10.49,0.00,1.00,168.00,4.80 --163.20,9.60,10.51,0.00,1.00,168.00,-4.80 --158.40,14.40,10.53,0.00,1.00,163.20,4.80 --153.60,14.40,10.55,0.00,1.00,163.20,-9.60 --148.80,14.40,10.57,0.00,1.00,158.40,9.60 --144.00,19.20,10.60,0.00,1.00,153.60,-9.60 --139.20,19.20,10.62,0.00,1.00,148.80,9.60 --134.40,24.00,10.64,0.00,1.00,144.00,-14.40 --129.60,24.00,10.66,0.00,1.00,139.20,14.40 --124.80,24.00,10.68,0.00,1.00,134.40,-14.40 --120.00,24.00,10.70,0.00,1.00,129.60,14.40 --115.20,28.80,10.72,0.00,1.00,120.00,-14.40 --105.60,28.80,10.74,0.00,1.00,110.40,14.40 --100.80,28.80,10.77,0.00,1.00,100.80,-14.40 --96.00,28.80,10.79,0.00,1.00,91.20,14.40 --91.20,28.80,10.81,0.00,1.00,81.60,-14.40 --86.40,28.80,10.83,0.00,1.00,72.00,14.40 --81.60,28.80,10.85,0.00,1.00,62.40,-14.40 --76.80,28.80,10.87,0.00,1.00,52.80,14.40 --72.00,28.80,10.89,0.00,1.00,48.00,-14.40 --62.40,24.00,10.92,0.00,1.00,43.20,14.40 --57.60,24.00,10.94,0.00,1.00,38.40,-14.40 --52.80,24.00,10.96,0.00,1.00,33.60,14.40 --48.00,24.00,10.98,0.00,1.00,28.80,-14.40 --43.20,19.20,11.00,0.00,1.00,24.00,9.60 --38.40,19.20,11.02,0.00,1.00,19.20,-9.60 --33.60,19.20,11.04,0.00,1.00,19.20,9.60 --28.80,14.40,11.07,0.00,1.00,14.40,-9.60 --24.00,14.40,11.09,0.00,1.00,9.60,9.60 --19.20,9.60,11.11,0.00,1.00,9.60,-4.80 --19.20,9.60,11.13,0.00,1.00,4.80,4.80 --14.40,4.80,11.15,0.00,1.00,4.80,-4.80 --9.60,4.80,11.17,0.00,1.00,0.00,4.80 --4.80,0.00,11.19,0.00,1.00,0.00,-0.00 -0.00,0.00,11.21,0.00,1.00,-4.80,0.00 -4.80,-4.80,11.24,0.00,1.00,-4.80,-0.00 -9.60,-4.80,11.26,0.00,1.00,-9.60,0.00 -14.40,-9.60,11.28,0.00,1.00,-9.60,-4.80 -14.40,-9.60,11.30,0.00,1.00,-14.40,4.80 -19.20,-14.40,11.32,0.00,1.00,-14.40,-4.80 -24.00,-14.40,11.34,0.00,1.00,-19.20,4.80 -28.80,-19.20,11.36,0.00,1.00,-24.00,-4.80 -33.60,-19.20,11.39,0.00,1.00,-28.80,4.80 -38.40,-24.00,11.41,0.00,1.00,-28.80,-9.60 -43.20,-24.00,11.43,0.00,1.00,-33.60,9.60 -48.00,-24.00,11.45,0.00,1.00,-38.40,-9.60 -52.80,-28.80,11.47,0.00,1.00,-48.00,9.60 -57.60,-28.80,11.49,0.00,1.00,-52.80,-9.60 -62.40,-28.80,11.51,0.00,1.00,-57.60,9.60 -67.20,-33.60,11.54,0.00,1.00,-67.20,-9.60 -72.00,-33.60,11.56,0.00,1.00,-76.80,9.60 -81.60,-33.60,11.58,0.00,1.00,-81.60,-9.60 -86.40,-33.60,11.60,0.00,1.00,-91.20,9.60 -91.20,-33.60,11.62,0.00,1.00,-100.80,-9.60 -96.00,-33.60,11.64,0.00,1.00,-110.40,9.60 -100.80,-33.60,11.66,0.00,1.00,-115.20,-9.60 -110.40,-33.60,11.68,0.00,1.00,-124.80,9.60 -115.20,-33.60,11.71,0.00,1.00,-129.60,-9.60 -120.00,-28.80,11.73,0.00,1.00,-139.20,9.60 -124.80,-28.80,11.75,0.00,1.00,-144.00,-9.60 -129.60,-28.80,11.77,0.00,1.00,-148.80,9.60 -134.40,-24.00,11.79,0.00,1.00,-153.60,-9.60 -139.20,-24.00,11.81,0.00,1.00,-153.60,9.60 -144.00,-19.20,11.83,0.00,1.00,-158.40,-9.60 -148.80,-19.20,11.86,0.00,1.00,-163.20,4.80 -153.60,-14.40,11.88,0.00,1.00,-163.20,-4.80 -158.40,-14.40,11.90,0.00,1.00,-168.00,4.80 -163.20,-9.60,11.92,0.00,1.00,-172.80,-4.80 -168.00,-9.60,11.94,0.00,1.00,-172.80,4.80 -168.00,-4.80,11.96,0.00,1.00,-177.60,-0.00 -172.80,-4.80,11.98,0.00,1.00,-177.60,0.00 -177.60,-0.00,12.01,0.00,1.00,177.60,-0.00 --177.60,0.00,12.03,0.00,1.00,177.60,-0.00 --172.80,4.80,12.05,0.00,1.00,172.80,0.00 --168.00,4.80,12.07,0.00,1.00,172.80,-0.00 --168.00,9.60,12.09,0.00,1.00,168.00,4.80 --163.20,9.60,12.11,0.00,1.00,163.20,-4.80 --158.40,14.40,12.13,0.00,1.00,163.20,4.80 --153.60,14.40,12.15,0.00,1.00,158.40,-4.80 --148.80,19.20,12.18,0.00,1.00,153.60,4.80 --144.00,19.20,12.20,0.00,1.00,153.60,-9.60 --139.20,24.00,12.22,0.00,1.00,148.80,9.60 --134.40,24.00,12.24,0.00,1.00,144.00,-9.60 --129.60,28.80,12.26,0.00,1.00,139.20,9.60 --124.80,28.80,12.28,0.00,1.00,129.60,-9.60 --120.00,28.80,12.30,0.00,1.00,124.80,9.60 --115.20,33.60,12.33,0.00,1.00,115.20,-9.60 --110.40,33.60,12.35,0.00,1.00,110.40,9.60 --100.80,33.60,12.37,0.00,1.00,100.80,-9.60 --96.00,33.60,12.39,0.00,1.00,91.20,9.60 --91.20,33.60,12.41,0.00,1.00,81.60,-9.60 --86.40,33.60,12.43,0.00,1.00,76.80,9.60 --81.60,33.60,12.45,0.00,1.00,67.20,-9.60 --72.00,33.60,12.48,0.00,1.00,57.60,9.60 --67.20,33.60,12.50,0.00,1.00,52.80,-9.60 --62.40,28.80,12.52,0.00,1.00,48.00,9.60 --57.60,28.80,12.54,0.00,1.00,38.40,-9.60 --52.80,28.80,12.56,0.00,1.00,33.60,9.60 --48.00,24.00,12.58,0.00,1.00,28.80,-9.60 --43.20,24.00,12.60,0.00,1.00,28.80,9.60 --38.40,24.00,12.62,0.00,1.00,24.00,-9.60 --33.60,19.20,12.65,0.00,1.00,19.20,4.80 --28.80,19.20,12.67,0.00,1.00,14.40,-4.80 --24.00,14.40,12.69,0.00,1.00,14.40,4.80 --19.20,14.40,12.71,0.00,1.00,9.60,-4.80 --14.40,9.60,12.73,0.00,1.00,9.60,4.80 --14.40,9.60,12.75,0.00,1.00,4.80,-4.80 --9.60,4.80,12.77,0.00,1.00,4.80,0.00 --4.80,4.80,12.80,0.00,1.00,0.00,-0.00 -0.00,0.00,12.82,0.00,1.00,-4.80,0.00 -4.80,-4.80,12.84,0.00,1.00,-4.80,-0.00 -9.60,-4.80,12.86,0.00,1.00,-9.60,0.00 -9.60,-9.60,12.88,0.00,1.00,-9.60,-0.00 -14.40,-9.60,12.90,0.00,1.00,-14.40,0.00 -19.20,-14.40,12.92,0.00,1.00,-19.20,-4.80 -24.00,-19.20,12.95,0.00,1.00,-24.00,4.80 -28.80,-19.20,12.97,0.00,1.00,-24.00,-4.80 -33.60,-24.00,12.99,0.00,1.00,-28.80,4.80 -38.40,-24.00,13.01,0.00,1.00,-33.60,-4.80 -43.20,-28.80,13.03,0.00,1.00,-38.40,4.80 -48.00,-28.80,13.05,0.00,1.00,-43.20,-4.80 -52.80,-33.60,13.07,0.00,1.00,-48.00,4.80 -57.60,-33.60,13.09,0.00,1.00,-52.80,-4.80 -62.40,-33.60,13.12,0.00,1.00,-62.40,4.80 -67.20,-38.40,13.14,0.00,1.00,-67.20,-4.80 -72.00,-38.40,13.16,0.00,1.00,-76.80,4.80 -81.60,-38.40,13.18,0.00,1.00,-86.40,-4.80 -86.40,-38.40,13.20,0.00,1.00,-91.20,4.80 -91.20,-38.40,13.22,0.00,1.00,-100.80,-4.80 -96.00,-38.40,13.24,0.00,1.00,-105.60,4.80 -105.60,-38.40,13.27,0.00,1.00,-115.20,-4.80 -110.40,-38.40,13.29,0.00,1.00,-120.00,4.80 -115.20,-33.60,13.31,0.00,1.00,-129.60,-4.80 -120.00,-33.60,13.33,0.00,1.00,-134.40,4.80 -124.80,-33.60,13.35,0.00,1.00,-139.20,-4.80 -129.60,-28.80,13.37,0.00,1.00,-144.00,4.80 -134.40,-28.80,13.39,0.00,1.00,-148.80,-4.80 -139.20,-24.00,13.42,0.00,1.00,-153.60,4.80 -144.00,-24.00,13.44,0.00,1.00,-158.40,-4.80 -148.80,-19.20,13.46,0.00,1.00,-158.40,4.80 -153.60,-19.20,13.48,0.00,1.00,-163.20,-4.80 -158.40,-14.40,13.50,0.00,1.00,-168.00,4.80 -163.20,-14.40,13.52,0.00,1.00,-168.00,-4.80 -168.00,-9.60,13.54,0.00,1.00,-172.80,0.00 -172.80,-9.60,13.56,0.00,1.00,-177.60,-0.00 -172.80,-4.80,13.59,0.00,1.00,-177.60,0.00 -177.60,-0.00,13.61,0.00,1.00,177.60,-0.00 --177.60,0.00,13.63,0.00,1.00,177.60,-0.00 --172.80,4.80,13.65,0.00,1.00,172.80,0.00 --172.80,9.60,13.67,0.00,1.00,168.00,-0.00 --168.00,9.60,13.69,0.00,1.00,168.00,0.00 --163.20,14.40,13.71,0.00,1.00,163.20,-4.80 --158.40,14.40,13.74,0.00,1.00,158.40,4.80 --153.60,19.20,13.76,0.00,1.00,158.40,-4.80 --148.80,19.20,13.78,0.00,1.00,153.60,4.80 --144.00,24.00,13.80,0.00,1.00,148.80,-4.80 --139.20,24.00,13.82,0.00,1.00,144.00,4.80 --134.40,28.80,13.84,0.00,1.00,139.20,-4.80 --129.60,28.80,13.86,0.00,1.00,134.40,4.80 --124.80,33.60,13.89,0.00,1.00,129.60,-4.80 --120.00,33.60,13.91,0.00,1.00,120.00,4.80 --115.20,33.60,13.93,0.00,1.00,115.20,-4.80 --110.40,38.40,13.95,0.00,1.00,105.60,4.80 --105.60,38.40,13.97,0.00,1.00,100.80,-4.80 --96.00,38.40,13.99,0.00,1.00,91.20,4.80 --91.20,38.40,14.01,0.00,1.00,86.40,-4.80 --86.40,38.40,14.03,0.00,1.00,76.80,4.80 --81.60,38.40,14.06,0.00,1.00,67.20,-4.80 --72.00,38.40,14.08,0.00,1.00,62.40,4.80 --67.20,38.40,14.10,0.00,1.00,52.80,-4.80 --62.40,33.60,14.12,0.00,1.00,48.00,4.80 --57.60,33.60,14.14,0.00,1.00,43.20,-4.80 --52.80,33.60,14.16,0.00,1.00,38.40,4.80 --48.00,28.80,14.18,0.00,1.00,33.60,-4.80 --43.20,28.80,14.21,0.00,1.00,28.80,4.80 --38.40,24.00,14.23,0.00,1.00,24.00,-4.80 --33.60,24.00,14.25,0.00,1.00,24.00,4.80 --28.80,19.20,14.27,0.00,1.00,19.20,-4.80 --24.00,19.20,14.29,0.00,1.00,14.40,4.80 --19.20,14.40,14.31,0.00,1.00,9.60,-4.80 --14.40,9.60,14.33,0.00,1.00,9.60,0.00 --9.60,9.60,14.36,0.00,1.00,4.80,-0.00 --9.60,4.80,14.38,0.00,1.00,4.80,0.00 --4.80,4.80,14.40,0.00,1.00,0.00,-0.00 -0.00,0.00,14.42,0.00,1.00,-4.80,0.00 -4.80,-4.80,14.44,0.00,1.00,-4.80,-0.00 -4.80,-4.80,14.46,0.00,1.00,-9.60,0.00 -9.60,-9.60,14.48,0.00,1.00,-14.40,-0.00 -14.40,-14.40,14.50,0.00,1.00,-14.40,0.00 -19.20,-14.40,14.53,0.00,1.00,-19.20,-0.00 -24.00,-19.20,14.55,0.00,1.00,-24.00,0.00 -24.00,-24.00,14.57,0.00,1.00,-28.80,-0.00 -28.80,-24.00,14.59,0.00,1.00,-33.60,0.00 -33.60,-28.80,14.61,0.00,1.00,-38.40,-0.00 -38.40,-28.80,14.63,0.00,1.00,-43.20,0.00 -43.20,-33.60,14.65,0.00,1.00,-48.00,-0.00 -48.00,-33.60,14.68,0.00,1.00,-52.80,0.00 -52.80,-38.40,14.70,0.00,1.00,-57.60,-0.00 -62.40,-38.40,14.72,0.00,1.00,-62.40,0.00 -67.20,-38.40,14.74,0.00,1.00,-72.00,-0.00 -72.00,-43.20,14.76,0.00,1.00,-76.80,0.00 -76.80,-43.20,14.78,0.00,1.00,-86.40,-0.00 -86.40,-43.20,14.80,0.00,1.00,-91.20,0.00 -91.20,-43.20,14.83,0.00,1.00,-100.80,-0.00 -96.00,-43.20,14.85,0.00,1.00,-105.60,0.00 -105.60,-43.20,14.87,0.00,1.00,-110.40,-0.00 -110.40,-43.20,14.89,0.00,1.00,-120.00,0.00 -115.20,-38.40,14.91,0.00,1.00,-124.80,-0.00 -124.80,-38.40,14.93,0.00,1.00,-129.60,0.00 -129.60,-38.40,14.95,0.00,1.00,-134.40,-0.00 -134.40,-33.60,14.97,0.00,1.00,-139.20,0.00 -139.20,-33.60,15.00,0.00,1.00,-144.00,-0.00 -144.00,-28.80,15.02,0.00,1.00,-148.80,0.00 -148.80,-28.80,15.04,0.00,1.00,-153.60,-0.00 -153.60,-24.00,15.06,0.00,1.00,-158.40,0.00 -158.40,-19.20,15.08,0.00,1.00,-163.20,-0.00 -158.40,-19.20,15.10,0.00,1.00,-163.20,0.00 -163.20,-14.40,15.12,0.00,1.00,-168.00,-0.00 -168.00,-9.60,15.15,0.00,1.00,-172.80,0.00 -172.80,-9.60,15.17,0.00,1.00,-172.80,-0.00 -172.80,-4.80,15.19,0.00,1.00,-177.60,0.00 -177.60,-0.00,15.21,0.00,1.00,177.60,-0.00 --177.60,0.00,15.23,0.00,1.00,172.80,-0.00 --172.80,4.80,15.25,0.00,1.00,172.80,0.00 --172.80,9.60,15.27,0.00,1.00,168.00,-0.00 --168.00,9.60,15.30,0.00,1.00,163.20,0.00 --163.20,14.40,15.32,0.00,1.00,163.20,-0.00 --158.40,19.20,15.34,0.00,1.00,158.40,0.00 --158.40,19.20,15.36,0.00,1.00,153.60,-0.00 --153.60,24.00,15.38,0.00,1.00,148.80,0.00 --148.80,28.80,15.40,0.00,1.00,144.00,-0.00 --144.00,28.80,15.42,0.00,1.00,139.20,0.00 --139.20,33.60,15.44,0.00,1.00,134.40,-0.00 --134.40,33.60,15.47,0.00,1.00,129.60,0.00 --129.60,38.40,15.49,0.00,1.00,124.80,-0.00 --124.80,38.40,15.51,0.00,1.00,120.00,0.00 --115.20,38.40,15.53,0.00,1.00,110.40,-0.00 --110.40,43.20,15.55,0.00,1.00,105.60,0.00 --105.60,43.20,15.57,0.00,1.00,100.80,-0.00 --96.00,43.20,15.59,0.00,1.00,91.20,0.00 --91.20,43.20,15.62,0.00,1.00,86.40,-0.00 --86.40,43.20,15.64,0.00,1.00,76.80,0.00 --76.80,43.20,15.66,0.00,1.00,72.00,-0.00 --72.00,43.20,15.68,0.00,1.00,62.40,0.00 --67.20,38.40,15.70,0.00,1.00,57.60,-0.00 --62.40,38.40,15.72,0.00,1.00,52.80,0.00 --52.80,38.40,15.74,0.00,1.00,48.00,-0.00 --48.00,33.60,15.77,0.00,1.00,43.20,0.00 --43.20,33.60,15.79,0.00,1.00,38.40,-0.00 --38.40,28.80,15.81,0.00,1.00,33.60,0.00 --33.60,28.80,15.83,0.00,1.00,28.80,-0.00 --28.80,24.00,15.85,0.00,1.00,24.00,0.00 --24.00,24.00,15.87,0.00,1.00,19.20,-0.00 --24.00,19.20,15.89,0.00,1.00,14.40,0.00 --19.20,14.40,15.91,0.00,1.00,14.40,-0.00 --14.40,14.40,15.94,0.00,1.00,9.60,0.00 --9.60,9.60,15.96,0.00,1.00,4.80,-0.00 --4.80,4.80,15.98,0.00,1.00,4.80,0.00 --4.80,4.80,16.00,0.00,1.00,0.00,-0.00 -0.00,0.00,16.00,0.00,1.00,-4.80,0.00 -4.80,-4.80,15.98,0.00,1.00,-4.80,0.00 -4.80,-4.80,15.96,0.00,1.00,-9.60,-0.00 -9.60,-9.60,15.94,0.00,1.00,-14.40,0.00 -14.40,-14.40,15.91,0.00,1.00,-19.20,-0.00 -14.40,-19.20,15.89,0.00,1.00,-24.00,0.00 -19.20,-19.20,15.87,0.00,1.00,-24.00,-0.00 -24.00,-24.00,15.85,0.00,1.00,-28.80,0.00 -28.80,-28.80,15.83,0.00,1.00,-33.60,-0.00 -33.60,-28.80,15.81,0.00,1.00,-38.40,0.00 -38.40,-33.60,15.79,0.00,1.00,-43.20,-0.00 -43.20,-38.40,15.77,0.00,1.00,-48.00,0.00 -48.00,-38.40,15.74,0.00,1.00,-52.80,-4.80 -52.80,-43.20,15.72,0.00,1.00,-62.40,4.80 -57.60,-43.20,15.70,0.00,1.00,-67.20,-4.80 -62.40,-43.20,15.68,0.00,1.00,-72.00,4.80 -72.00,-48.00,15.66,0.00,1.00,-76.80,-4.80 -76.80,-48.00,15.64,0.00,1.00,-86.40,4.80 -86.40,-48.00,15.62,0.00,1.00,-91.20,-4.80 -91.20,-48.00,15.59,0.00,1.00,-96.00,4.80 -100.80,-48.00,15.57,0.00,1.00,-105.60,-4.80 -105.60,-48.00,15.55,0.00,1.00,-110.40,4.80 -110.40,-48.00,15.53,0.00,1.00,-115.20,-4.80 -120.00,-43.20,15.51,0.00,1.00,-124.80,4.80 -124.80,-43.20,15.49,0.00,1.00,-129.60,-4.80 -129.60,-38.40,15.47,0.00,1.00,-134.40,4.80 -134.40,-38.40,15.44,0.00,1.00,-139.20,-4.80 -139.20,-33.60,15.42,0.00,1.00,-144.00,0.00 -144.00,-33.60,15.40,0.00,1.00,-148.80,-0.00 -148.80,-28.80,15.38,0.00,1.00,-153.60,0.00 -153.60,-24.00,15.36,0.00,1.00,-158.40,-0.00 -158.40,-24.00,15.34,0.00,1.00,-158.40,0.00 -163.20,-19.20,15.32,0.00,1.00,-163.20,-0.00 -163.20,-14.40,15.30,0.00,1.00,-168.00,0.00 -168.00,-14.40,15.27,0.00,1.00,-172.80,-0.00 -172.80,-9.60,15.25,0.00,1.00,-172.80,0.00 -172.80,-4.80,15.23,0.00,1.00,-177.60,-0.00 -177.60,-0.00,15.21,0.00,1.00,177.60,0.00 --177.60,0.00,15.19,0.00,1.00,172.80,0.00 --172.80,4.80,15.17,0.00,1.00,172.80,-0.00 --172.80,9.60,15.15,0.00,1.00,168.00,0.00 --168.00,14.40,15.12,0.00,1.00,163.20,-0.00 --163.20,14.40,15.10,0.00,1.00,158.40,0.00 --163.20,19.20,15.08,0.00,1.00,158.40,-0.00 --158.40,24.00,15.06,0.00,1.00,153.60,0.00 --153.60,24.00,15.04,0.00,1.00,148.80,-0.00 --148.80,28.80,15.02,0.00,1.00,144.00,0.00 --144.00,33.60,15.00,0.00,1.00,139.20,-0.00 --139.20,33.60,14.97,0.00,1.00,134.40,0.00 --134.40,38.40,14.95,0.00,1.00,129.60,-4.80 --129.60,38.40,14.93,0.00,1.00,124.80,4.80 --124.80,43.20,14.91,0.00,1.00,115.20,-4.80 --120.00,43.20,14.89,0.00,1.00,110.40,4.80 --110.40,48.00,14.87,0.00,1.00,105.60,-4.80 --105.60,48.00,14.85,0.00,1.00,96.00,4.80 --100.80,48.00,14.83,0.00,1.00,91.20,-4.80 --91.20,48.00,14.80,0.00,1.00,86.40,4.80 --86.40,48.00,14.78,0.00,1.00,76.80,-4.80 --76.80,48.00,14.76,0.00,1.00,72.00,4.80 --72.00,48.00,14.74,0.00,1.00,67.20,-4.80 --62.40,43.20,14.72,0.00,1.00,62.40,4.80 --57.60,43.20,14.70,0.00,1.00,52.80,-4.80 --52.80,43.20,14.68,0.00,1.00,48.00,4.80 --48.00,38.40,14.65,0.00,1.00,43.20,-4.80 --43.20,38.40,14.63,0.00,1.00,38.40,0.00 --38.40,33.60,14.61,0.00,1.00,33.60,-0.00 --33.60,28.80,14.59,0.00,1.00,28.80,0.00 --28.80,28.80,14.57,0.00,1.00,24.00,-0.00 --24.00,24.00,14.55,0.00,1.00,24.00,0.00 --19.20,19.20,14.53,0.00,1.00,19.20,-0.00 --14.40,19.20,14.50,0.00,1.00,14.40,0.00 --14.40,14.40,14.48,0.00,1.00,9.60,-0.00 --9.60,9.60,14.46,0.00,1.00,4.80,0.00 --4.80,4.80,14.44,0.00,1.00,4.80,-0.00 --4.80,4.80,14.42,0.00,1.00,0.00,0.00 -0.00,0.00,14.40,0.00,1.00,-4.80,0.00 -4.80,-4.80,14.38,0.00,1.00,-9.60,0.00 -4.80,-9.60,14.36,0.00,1.00,-9.60,-0.00 -9.60,-9.60,14.33,0.00,1.00,-14.40,0.00 -9.60,-14.40,14.31,0.00,1.00,-19.20,-4.80 -14.40,-19.20,14.29,0.00,1.00,-24.00,4.80 -19.20,-24.00,14.27,0.00,1.00,-28.80,-4.80 -24.00,-24.00,14.25,0.00,1.00,-33.60,4.80 -24.00,-28.80,14.23,0.00,1.00,-38.40,-4.80 -28.80,-33.60,14.21,0.00,1.00,-43.20,4.80 -33.60,-38.40,14.18,0.00,1.00,-48.00,-4.80 -38.40,-38.40,14.16,0.00,1.00,-52.80,4.80 -43.20,-43.20,14.14,0.00,1.00,-57.60,-4.80 -48.00,-43.20,14.12,0.00,1.00,-62.40,4.80 -52.80,-48.00,14.10,0.00,1.00,-67.20,-4.80 -62.40,-48.00,14.08,0.00,1.00,-72.00,9.60 -67.20,-52.80,14.06,0.00,1.00,-81.60,-9.60 -76.80,-52.80,14.03,0.00,1.00,-86.40,9.60 -86.40,-52.80,14.01,0.00,1.00,-91.20,-9.60 -91.20,-52.80,13.99,0.00,1.00,-96.00,9.60 -100.80,-52.80,13.97,0.00,1.00,-105.60,-9.60 -105.60,-52.80,13.95,0.00,1.00,-110.40,9.60 -115.20,-48.00,13.93,0.00,1.00,-115.20,-9.60 -120.00,-48.00,13.91,0.00,1.00,-120.00,9.60 -129.60,-48.00,13.89,0.00,1.00,-124.80,-4.80 -134.40,-43.20,13.86,0.00,1.00,-129.60,4.80 -139.20,-43.20,13.84,0.00,1.00,-134.40,-4.80 -144.00,-38.40,13.82,0.00,1.00,-139.20,4.80 -148.80,-33.60,13.80,0.00,1.00,-144.00,-4.80 -153.60,-33.60,13.78,0.00,1.00,-148.80,4.80 -158.40,-28.80,13.76,0.00,1.00,-153.60,-4.80 -158.40,-24.00,13.74,0.00,1.00,-158.40,4.80 -163.20,-19.20,13.71,0.00,1.00,-163.20,-4.80 -168.00,-19.20,13.69,0.00,1.00,-168.00,4.80 -168.00,-14.40,13.67,0.00,1.00,-172.80,-0.00 -172.80,-9.60,13.65,0.00,1.00,-172.80,0.00 -177.60,-4.80,13.63,0.00,1.00,-177.60,-0.00 -177.60,-0.00,13.61,0.00,1.00,177.60,0.00 --177.60,0.00,13.59,0.00,1.00,172.80,0.00 --177.60,4.80,13.56,0.00,1.00,172.80,-0.00 --172.80,9.60,13.54,0.00,1.00,168.00,0.00 --168.00,14.40,13.52,0.00,1.00,163.20,-0.00 --168.00,19.20,13.50,0.00,1.00,158.40,4.80 --163.20,19.20,13.48,0.00,1.00,153.60,-4.80 --158.40,24.00,13.46,0.00,1.00,148.80,4.80 --158.40,28.80,13.44,0.00,1.00,144.00,-4.80 --153.60,33.60,13.42,0.00,1.00,139.20,4.80 --148.80,33.60,13.39,0.00,1.00,134.40,-4.80 --144.00,38.40,13.37,0.00,1.00,129.60,4.80 --139.20,43.20,13.35,0.00,1.00,124.80,-4.80 --134.40,43.20,13.33,0.00,1.00,120.00,4.80 --129.60,48.00,13.31,0.00,1.00,115.20,-4.80 --120.00,48.00,13.29,0.00,1.00,110.40,9.60 --115.20,48.00,13.27,0.00,1.00,105.60,-9.60 --105.60,52.80,13.24,0.00,1.00,96.00,9.60 --100.80,52.80,13.22,0.00,1.00,91.20,-9.60 --91.20,52.80,13.20,0.00,1.00,86.40,9.60 --86.40,52.80,13.18,0.00,1.00,81.60,-9.60 --76.80,52.80,13.16,0.00,1.00,72.00,9.60 --67.20,52.80,13.14,0.00,1.00,67.20,-9.60 --62.40,48.00,13.12,0.00,1.00,62.40,9.60 --52.80,48.00,13.09,0.00,1.00,57.60,-4.80 --48.00,43.20,13.07,0.00,1.00,52.80,4.80 --43.20,43.20,13.05,0.00,1.00,48.00,-4.80 --38.40,38.40,13.03,0.00,1.00,43.20,4.80 --33.60,38.40,13.01,0.00,1.00,38.40,-4.80 --28.80,33.60,12.99,0.00,1.00,33.60,4.80 --24.00,28.80,12.97,0.00,1.00,28.80,-4.80 --24.00,24.00,12.95,0.00,1.00,24.00,4.80 --19.20,24.00,12.92,0.00,1.00,19.20,-4.80 --14.40,19.20,12.90,0.00,1.00,14.40,4.80 --9.60,14.40,12.88,0.00,1.00,9.60,-4.80 --9.60,9.60,12.86,0.00,1.00,9.60,0.00 --4.80,9.60,12.84,0.00,1.00,4.80,-0.00 --4.80,4.80,12.82,0.00,1.00,0.00,0.00 -0.00,0.00,12.80,0.00,1.00,-4.80,0.00 -4.80,-4.80,12.77,0.00,1.00,-9.60,0.00 -4.80,-9.60,12.75,0.00,1.00,-14.40,-0.00 -9.60,-14.40,12.73,0.00,1.00,-14.40,4.80 -9.60,-14.40,12.71,0.00,1.00,-19.20,-4.80 -14.40,-19.20,12.69,0.00,1.00,-24.00,4.80 -14.40,-24.00,12.67,0.00,1.00,-28.80,-4.80 -19.20,-28.80,12.65,0.00,1.00,-33.60,4.80 -24.00,-33.60,12.62,0.00,1.00,-38.40,-9.60 -28.80,-33.60,12.60,0.00,1.00,-43.20,9.60 -28.80,-38.40,12.58,0.00,1.00,-48.00,-9.60 -33.60,-43.20,12.56,0.00,1.00,-52.80,9.60 -38.40,-43.20,12.54,0.00,1.00,-57.60,-9.60 -48.00,-48.00,12.52,0.00,1.00,-62.40,9.60 -52.80,-52.80,12.50,0.00,1.00,-67.20,-9.60 -57.60,-52.80,12.48,0.00,1.00,-72.00,9.60 -67.20,-57.60,12.45,0.00,1.00,-81.60,-14.40 -76.80,-57.60,12.43,0.00,1.00,-86.40,14.40 -81.60,-57.60,12.41,0.00,1.00,-91.20,-14.40 -91.20,-57.60,12.39,0.00,1.00,-96.00,14.40 -100.80,-57.60,12.37,0.00,1.00,-100.80,-14.40 -110.40,-57.60,12.35,0.00,1.00,-110.40,14.40 -115.20,-52.80,12.33,0.00,1.00,-115.20,-14.40 -124.80,-52.80,12.30,0.00,1.00,-120.00,9.60 -129.60,-48.00,12.28,0.00,1.00,-124.80,-9.60 -139.20,-48.00,12.26,0.00,1.00,-129.60,9.60 -144.00,-43.20,12.24,0.00,1.00,-134.40,-9.60 -148.80,-38.40,12.22,0.00,1.00,-139.20,9.60 -153.60,-38.40,12.20,0.00,1.00,-144.00,-9.60 -153.60,-33.60,12.18,0.00,1.00,-148.80,9.60 -158.40,-28.80,12.15,0.00,1.00,-153.60,-9.60 -163.20,-24.00,12.13,0.00,1.00,-158.40,4.80 -163.20,-24.00,12.11,0.00,1.00,-163.20,-4.80 -168.00,-19.20,12.09,0.00,1.00,-168.00,4.80 -172.80,-14.40,12.07,0.00,1.00,-168.00,-4.80 -172.80,-9.60,12.05,0.00,1.00,-172.80,4.80 -177.60,-4.80,12.03,0.00,1.00,-177.60,-0.00 -177.60,-0.00,12.01,0.00,1.00,177.60,0.00 --177.60,0.00,11.98,0.00,1.00,172.80,0.00 --177.60,4.80,11.96,0.00,1.00,168.00,-0.00 --172.80,9.60,11.94,0.00,1.00,168.00,4.80 --172.80,14.40,11.92,0.00,1.00,163.20,-4.80 --168.00,19.20,11.90,0.00,1.00,158.40,4.80 --163.20,24.00,11.88,0.00,1.00,153.60,-4.80 --163.20,24.00,11.86,0.00,1.00,148.80,4.80 --158.40,28.80,11.83,0.00,1.00,144.00,-9.60 --153.60,33.60,11.81,0.00,1.00,139.20,9.60 --153.60,38.40,11.79,0.00,1.00,134.40,-9.60 --148.80,38.40,11.77,0.00,1.00,129.60,9.60 --144.00,43.20,11.75,0.00,1.00,124.80,-9.60 --139.20,48.00,11.73,0.00,1.00,120.00,9.60 --129.60,48.00,11.71,0.00,1.00,115.20,-9.60 --124.80,52.80,11.68,0.00,1.00,110.40,9.60 --115.20,52.80,11.66,0.00,1.00,100.80,-14.40 --110.40,57.60,11.64,0.00,1.00,96.00,14.40 --100.80,57.60,11.62,0.00,1.00,91.20,-14.40 --91.20,57.60,11.60,0.00,1.00,86.40,14.40 --81.60,57.60,11.58,0.00,1.00,81.60,-14.40 --76.80,57.60,11.56,0.00,1.00,72.00,14.40 --67.20,57.60,11.54,0.00,1.00,67.20,-14.40 --57.60,52.80,11.51,0.00,1.00,62.40,9.60 --52.80,52.80,11.49,0.00,1.00,57.60,-9.60 --48.00,48.00,11.47,0.00,1.00,52.80,9.60 --38.40,43.20,11.45,0.00,1.00,48.00,-9.60 --33.60,43.20,11.43,0.00,1.00,43.20,9.60 --28.80,38.40,11.41,0.00,1.00,38.40,-9.60 --28.80,33.60,11.39,0.00,1.00,33.60,9.60 --24.00,33.60,11.36,0.00,1.00,28.80,-9.60 --19.20,28.80,11.34,0.00,1.00,24.00,4.80 --14.40,24.00,11.32,0.00,1.00,19.20,-4.80 --14.40,19.20,11.30,0.00,1.00,14.40,4.80 --9.60,14.40,11.28,0.00,1.00,14.40,-4.80 --9.60,14.40,11.26,0.00,1.00,9.60,4.80 --4.80,9.60,11.24,0.00,1.00,4.80,-0.00 --4.80,4.80,11.21,0.00,1.00,0.00,0.00 -0.00,0.00,11.19,0.00,1.00,-4.80,0.00 -0.00,-4.80,11.17,0.00,1.00,-9.60,0.00 -4.80,-9.60,11.15,0.00,1.00,-14.40,-4.80 -4.80,-14.40,11.13,0.00,1.00,-19.20,4.80 -9.60,-19.20,11.11,0.00,1.00,-19.20,-4.80 -9.60,-19.20,11.09,0.00,1.00,-24.00,4.80 -14.40,-24.00,11.07,0.00,1.00,-28.80,-9.60 -19.20,-28.80,11.04,0.00,1.00,-33.60,9.60 -19.20,-33.60,11.02,0.00,1.00,-38.40,-9.60 -24.00,-38.40,11.00,0.00,1.00,-43.20,9.60 -28.80,-43.20,10.98,0.00,1.00,-48.00,-14.40 -33.60,-43.20,10.96,0.00,1.00,-52.80,14.40 -38.40,-48.00,10.94,0.00,1.00,-57.60,-14.40 -43.20,-52.80,10.92,0.00,1.00,-62.40,14.40 -48.00,-52.80,10.89,0.00,1.00,-72.00,-14.40 -52.80,-57.60,10.87,0.00,1.00,-76.80,14.40 -62.40,-57.60,10.85,0.00,1.00,-81.60,-19.20 -72.00,-62.40,10.83,0.00,1.00,-86.40,19.20 -81.60,-62.40,10.81,0.00,1.00,-91.20,-19.20 -91.20,-62.40,10.79,0.00,1.00,-96.00,19.20 -100.80,-62.40,10.77,0.00,1.00,-100.80,-19.20 -110.40,-62.40,10.74,0.00,1.00,-105.60,19.20 -120.00,-57.60,10.72,0.00,1.00,-115.20,-14.40 -129.60,-57.60,10.70,0.00,1.00,-120.00,14.40 -134.40,-52.80,10.68,0.00,1.00,-124.80,-14.40 -139.20,-48.00,10.66,0.00,1.00,-129.60,14.40 -144.00,-48.00,10.64,0.00,1.00,-134.40,-14.40 -148.80,-43.20,10.62,0.00,1.00,-139.20,14.40 -153.60,-38.40,10.60,0.00,1.00,-144.00,-14.40 -158.40,-33.60,10.57,0.00,1.00,-148.80,9.60 -163.20,-33.60,10.55,0.00,1.00,-153.60,-9.60 -163.20,-28.80,10.53,0.00,1.00,-158.40,9.60 -168.00,-24.00,10.51,0.00,1.00,-163.20,-9.60 -168.00,-19.20,10.49,0.00,1.00,-163.20,4.80 -172.80,-14.40,10.47,0.00,1.00,-168.00,-4.80 -172.80,-9.60,10.45,0.00,1.00,-172.80,4.80 -177.60,-4.80,10.42,0.00,1.00,-177.60,-0.00 -177.60,-0.00,10.40,0.00,1.00,177.60,0.00 --177.60,0.00,10.38,0.00,1.00,172.80,0.00 --177.60,4.80,10.36,0.00,1.00,168.00,-0.00 --172.80,9.60,10.34,0.00,1.00,163.20,4.80 --172.80,14.40,10.32,0.00,1.00,163.20,-4.80 --168.00,19.20,10.30,0.00,1.00,158.40,4.80 --168.00,24.00,10.28,0.00,1.00,153.60,-9.60 --163.20,28.80,10.25,0.00,1.00,148.80,9.60 --163.20,33.60,10.23,0.00,1.00,144.00,-9.60 --158.40,33.60,10.21,0.00,1.00,139.20,9.60 --153.60,38.40,10.19,0.00,1.00,134.40,-14.40 --148.80,43.20,10.17,0.00,1.00,129.60,14.40 --144.00,48.00,10.15,0.00,1.00,124.80,-14.40 --139.20,48.00,10.13,0.00,1.00,120.00,14.40 --134.40,52.80,10.10,0.00,1.00,115.20,-14.40 --129.60,57.60,10.08,0.00,1.00,105.60,14.40 --120.00,57.60,10.06,0.00,1.00,100.80,-14.40 --110.40,62.40,10.04,0.00,1.00,96.00,19.20 --100.80,62.40,10.02,0.00,1.00,91.20,-19.20 --91.20,62.40,10.00,0.00,1.00,86.40,19.20 --81.60,62.40,9.98,0.00,1.00,81.60,-19.20 --72.00,62.40,9.95,0.00,1.00,76.80,19.20 --62.40,57.60,9.93,0.00,1.00,72.00,-19.20 --52.80,57.60,9.91,0.00,1.00,62.40,14.40 --48.00,52.80,9.89,0.00,1.00,57.60,-14.40 --43.20,52.80,9.87,0.00,1.00,52.80,14.40 --38.40,48.00,9.85,0.00,1.00,48.00,-14.40 --33.60,43.20,9.83,0.00,1.00,43.20,14.40 --28.80,43.20,9.81,0.00,1.00,38.40,-14.40 --24.00,38.40,9.78,0.00,1.00,33.60,9.60 --19.20,33.60,9.76,0.00,1.00,28.80,-9.60 --19.20,28.80,9.74,0.00,1.00,24.00,9.60 --14.40,24.00,9.72,0.00,1.00,19.20,-9.60 --9.60,19.20,9.70,0.00,1.00,19.20,4.80 --9.60,19.20,9.68,0.00,1.00,14.40,-4.80 --4.80,14.40,9.66,0.00,1.00,9.60,4.80 --4.80,9.60,9.63,0.00,1.00,4.80,-4.80 --0.00,4.80,9.61,0.00,1.00,0.00,0.00 -0.00,0.00,9.59,0.00,1.00,-4.80,0.00 -0.00,-4.80,9.57,0.00,1.00,-9.60,0.00 -4.80,-9.60,9.55,0.00,1.00,-14.40,-4.80 -4.80,-14.40,9.53,0.00,1.00,-19.20,4.80 -9.60,-19.20,9.51,0.00,1.00,-24.00,-4.80 -9.60,-24.00,9.48,0.00,1.00,-28.80,9.60 -14.40,-24.00,9.46,0.00,1.00,-33.60,-9.60 -14.40,-28.80,9.44,0.00,1.00,-33.60,14.40 -19.20,-33.60,9.42,0.00,1.00,-38.40,-14.40 -19.20,-38.40,9.40,0.00,1.00,-43.20,14.40 -24.00,-43.20,9.38,0.00,1.00,-48.00,-14.40 -28.80,-48.00,9.36,0.00,1.00,-57.60,19.20 -33.60,-52.80,9.34,0.00,1.00,-62.40,-19.20 -38.40,-52.80,9.31,0.00,1.00,-67.20,19.20 -43.20,-57.60,9.29,0.00,1.00,-72.00,-19.20 -48.00,-62.40,9.27,0.00,1.00,-76.80,19.20 -57.60,-62.40,9.25,0.00,1.00,-81.60,-19.20 -67.20,-67.20,9.23,0.00,1.00,-86.40,24.00 -81.60,-67.20,9.21,0.00,1.00,-91.20,-24.00 -91.20,-67.20,9.19,0.00,1.00,-96.00,24.00 -105.60,-67.20,9.16,0.00,1.00,-100.80,-24.00 -115.20,-67.20,9.14,0.00,1.00,-105.60,24.00 -124.80,-62.40,9.12,0.00,1.00,-110.40,-19.20 -134.40,-57.60,9.10,0.00,1.00,-115.20,19.20 -139.20,-57.60,9.08,0.00,1.00,-120.00,-19.20 -144.00,-52.80,9.06,0.00,1.00,-129.60,19.20 -148.80,-48.00,9.04,0.00,1.00,-134.40,-19.20 -153.60,-43.20,9.01,0.00,1.00,-139.20,19.20 -158.40,-43.20,8.99,0.00,1.00,-144.00,-14.40 -163.20,-38.40,8.97,0.00,1.00,-148.80,14.40 -163.20,-33.60,8.95,0.00,1.00,-148.80,-14.40 -168.00,-28.80,8.93,0.00,1.00,-153.60,9.60 -168.00,-24.00,8.91,0.00,1.00,-158.40,-9.60 -172.80,-19.20,8.89,0.00,1.00,-163.20,9.60 -172.80,-14.40,8.87,0.00,1.00,-168.00,-4.80 -177.60,-9.60,8.84,0.00,1.00,-172.80,4.80 -177.60,-4.80,8.82,0.00,1.00,-177.60,-4.80 -177.60,-0.00,8.80,0.00,1.00,177.60,0.00 --177.60,0.00,8.78,0.00,1.00,172.80,0.00 --177.60,4.80,8.76,0.00,1.00,168.00,-4.80 --177.60,9.60,8.74,0.00,1.00,163.20,4.80 --172.80,14.40,8.72,0.00,1.00,158.40,-4.80 --172.80,19.20,8.69,0.00,1.00,153.60,9.60 --168.00,24.00,8.67,0.00,1.00,148.80,-9.60 --168.00,28.80,8.65,0.00,1.00,148.80,9.60 --163.20,33.60,8.63,0.00,1.00,144.00,-14.40 --163.20,38.40,8.61,0.00,1.00,139.20,14.40 --158.40,43.20,8.59,0.00,1.00,134.40,-14.40 --153.60,43.20,8.57,0.00,1.00,129.60,19.20 --148.80,48.00,8.54,0.00,1.00,120.00,-19.20 --144.00,52.80,8.52,0.00,1.00,115.20,19.20 --139.20,57.60,8.50,0.00,1.00,110.40,-19.20 --134.40,57.60,8.48,0.00,1.00,105.60,19.20 --124.80,62.40,8.46,0.00,1.00,100.80,-19.20 --115.20,67.20,8.44,0.00,1.00,96.00,24.00 --105.60,67.20,8.42,0.00,1.00,91.20,-24.00 --91.20,67.20,8.40,0.00,1.00,86.40,24.00 --81.60,67.20,8.37,0.00,1.00,81.60,-24.00 --67.20,67.20,8.35,0.00,1.00,76.80,24.00 --57.60,62.40,8.33,0.00,1.00,72.00,-19.20 --48.00,62.40,8.31,0.00,1.00,67.20,19.20 --43.20,57.60,8.29,0.00,1.00,62.40,-19.20 --38.40,52.80,8.27,0.00,1.00,57.60,19.20 --33.60,52.80,8.25,0.00,1.00,48.00,-19.20 --28.80,48.00,8.22,0.00,1.00,43.20,19.20 --24.00,43.20,8.20,0.00,1.00,38.40,-14.40 --19.20,38.40,8.18,0.00,1.00,33.60,14.40 --19.20,33.60,8.16,0.00,1.00,33.60,-14.40 --14.40,28.80,8.14,0.00,1.00,28.80,14.40 --14.40,24.00,8.12,0.00,1.00,24.00,-9.60 --9.60,24.00,8.10,0.00,1.00,19.20,9.60 --9.60,19.20,8.07,0.00,1.00,14.40,-4.80 --4.80,14.40,8.05,0.00,1.00,9.60,4.80 --4.80,9.60,8.03,0.00,1.00,4.80,-4.80 --0.00,4.80,8.01,0.00,1.00,0.00,0.00 -0.00,0.00,7.99,0.00,1.00,-4.80,0.00 -0.00,-4.80,7.97,0.00,1.00,-9.60,0.00 -4.80,-9.60,7.95,0.00,1.00,-14.40,-4.80 -4.80,-14.40,7.93,0.00,1.00,-19.20,4.80 -4.80,-19.20,7.90,0.00,1.00,-24.00,-9.60 -9.60,-24.00,7.88,0.00,1.00,-28.80,9.60 -9.60,-28.80,7.86,0.00,1.00,-33.60,-14.40 -9.60,-33.60,7.84,0.00,1.00,-38.40,14.40 -14.40,-38.40,7.82,0.00,1.00,-43.20,-14.40 -14.40,-38.40,7.80,0.00,1.00,-48.00,19.20 -19.20,-43.20,7.78,0.00,1.00,-52.80,-19.20 -24.00,-48.00,7.75,0.00,1.00,-57.60,19.20 -24.00,-52.80,7.73,0.00,1.00,-62.40,-24.00 -28.80,-57.60,7.71,0.00,1.00,-67.20,24.00 -38.40,-62.40,7.69,0.00,1.00,-72.00,-24.00 -43.20,-62.40,7.67,0.00,1.00,-76.80,24.00 -52.80,-67.20,7.65,0.00,1.00,-81.60,-24.00 -62.40,-72.00,7.63,0.00,1.00,-86.40,28.80 -76.80,-72.00,7.60,0.00,1.00,-91.20,-28.80 -96.00,-72.00,7.58,0.00,1.00,-96.00,28.80 -110.40,-72.00,7.56,0.00,1.00,-100.80,-28.80 -120.00,-67.20,7.54,0.00,1.00,-105.60,28.80 -134.40,-67.20,7.52,0.00,1.00,-110.40,-24.00 -139.20,-62.40,7.50,0.00,1.00,-115.20,24.00 -148.80,-57.60,7.48,0.00,1.00,-120.00,-24.00 -153.60,-57.60,7.46,0.00,1.00,-124.80,24.00 -158.40,-52.80,7.43,0.00,1.00,-129.60,-24.00 -158.40,-48.00,7.41,0.00,1.00,-134.40,19.20 -163.20,-43.20,7.39,0.00,1.00,-139.20,-19.20 -163.20,-38.40,7.37,0.00,1.00,-144.00,19.20 -168.00,-33.60,7.35,0.00,1.00,-148.80,-14.40 -168.00,-28.80,7.33,0.00,1.00,-153.60,14.40 -172.80,-24.00,7.31,0.00,1.00,-158.40,-9.60 -172.80,-19.20,7.28,0.00,1.00,-163.20,9.60 -172.80,-14.40,7.26,0.00,1.00,-168.00,-9.60 -177.60,-9.60,7.24,0.00,1.00,-172.80,4.80 -177.60,-4.80,7.22,0.00,1.00,-177.60,-4.80 -177.60,-0.00,7.20,0.00,1.00,177.60,0.00 --177.60,0.00,7.18,0.00,1.00,172.80,0.00 --177.60,4.80,7.16,0.00,1.00,168.00,-4.80 --177.60,9.60,7.13,0.00,1.00,163.20,4.80 --172.80,14.40,7.11,0.00,1.00,158.40,-9.60 --172.80,19.20,7.09,0.00,1.00,153.60,9.60 --172.80,24.00,7.07,0.00,1.00,148.80,-9.60 --168.00,28.80,7.05,0.00,1.00,144.00,14.40 --168.00,33.60,7.03,0.00,1.00,139.20,-14.40 --163.20,38.40,7.01,0.00,1.00,134.40,19.20 --163.20,43.20,6.99,0.00,1.00,129.60,-19.20 --158.40,48.00,6.96,0.00,1.00,124.80,19.20 --158.40,52.80,6.94,0.00,1.00,120.00,-24.00 --153.60,57.60,6.92,0.00,1.00,115.20,24.00 --148.80,57.60,6.90,0.00,1.00,110.40,-24.00 --139.20,62.40,6.88,0.00,1.00,105.60,24.00 --134.40,67.20,6.86,0.00,1.00,100.80,-24.00 --120.00,67.20,6.84,0.00,1.00,96.00,28.80 --110.40,72.00,6.81,0.00,1.00,91.20,-28.80 --96.00,72.00,6.79,0.00,1.00,86.40,28.80 --76.80,72.00,6.77,0.00,1.00,81.60,-28.80 --62.40,72.00,6.75,0.00,1.00,76.80,28.80 --52.80,67.20,6.73,0.00,1.00,72.00,-24.00 --43.20,62.40,6.71,0.00,1.00,67.20,24.00 --38.40,62.40,6.69,0.00,1.00,62.40,-24.00 --28.80,57.60,6.66,0.00,1.00,57.60,24.00 --24.00,52.80,6.64,0.00,1.00,52.80,-24.00 --24.00,48.00,6.62,0.00,1.00,48.00,19.20 --19.20,43.20,6.60,0.00,1.00,43.20,-19.20 --14.40,38.40,6.58,0.00,1.00,38.40,19.20 --14.40,38.40,6.56,0.00,1.00,33.60,-14.40 --9.60,33.60,6.54,0.00,1.00,28.80,14.40 --9.60,28.80,6.52,0.00,1.00,24.00,-14.40 --9.60,24.00,6.49,0.00,1.00,19.20,9.60 --4.80,19.20,6.47,0.00,1.00,14.40,-9.60 --4.80,14.40,6.45,0.00,1.00,9.60,4.80 --4.80,9.60,6.43,0.00,1.00,4.80,-4.80 --0.00,4.80,6.41,0.00,1.00,0.00,0.00 -0.00,0.00,6.39,0.00,1.00,-4.80,0.00 -0.00,-4.80,6.37,0.00,1.00,-9.60,4.80 -0.00,-9.60,6.34,0.00,1.00,-14.40,-4.80 -4.80,-14.40,6.32,0.00,1.00,-19.20,9.60 -4.80,-19.20,6.30,0.00,1.00,-24.00,-9.60 -4.80,-24.00,6.28,0.00,1.00,-28.80,14.40 -4.80,-28.80,6.26,0.00,1.00,-33.60,-14.40 -9.60,-33.60,6.24,0.00,1.00,-38.40,19.20 -9.60,-38.40,6.22,0.00,1.00,-43.20,-19.20 -14.40,-43.20,6.19,0.00,1.00,-48.00,19.20 -14.40,-48.00,6.17,0.00,1.00,-52.80,-24.00 -14.40,-52.80,6.15,0.00,1.00,-57.60,24.00 -19.20,-57.60,6.13,0.00,1.00,-62.40,-28.80 -24.00,-57.60,6.11,0.00,1.00,-67.20,28.80 -28.80,-62.40,6.09,0.00,1.00,-72.00,-28.80 -33.60,-67.20,6.07,0.00,1.00,-76.80,28.80 -43.20,-72.00,6.05,0.00,1.00,-81.60,-28.80 -57.60,-72.00,6.02,0.00,1.00,-86.40,33.60 -76.80,-76.80,6.00,0.00,1.00,-91.20,-33.60 -96.00,-76.80,5.98,0.00,1.00,-96.00,33.60 -115.20,-76.80,5.96,0.00,1.00,-100.80,-33.60 -129.60,-72.00,5.94,0.00,1.00,-105.60,28.80 -139.20,-72.00,5.92,0.00,1.00,-110.40,-28.80 -148.80,-67.20,5.90,0.00,1.00,-115.20,28.80 -153.60,-62.40,5.87,0.00,1.00,-120.00,-28.80 -158.40,-57.60,5.85,0.00,1.00,-124.80,28.80 -163.20,-52.80,5.83,0.00,1.00,-129.60,-24.00 -163.20,-48.00,5.81,0.00,1.00,-134.40,24.00 -168.00,-43.20,5.79,0.00,1.00,-139.20,-24.00 -168.00,-38.40,5.77,0.00,1.00,-144.00,19.20 -172.80,-33.60,5.75,0.00,1.00,-148.80,-19.20 -172.80,-28.80,5.72,0.00,1.00,-153.60,14.40 -172.80,-24.00,5.70,0.00,1.00,-158.40,-14.40 -172.80,-19.20,5.68,0.00,1.00,-163.20,9.60 -177.60,-14.40,5.66,0.00,1.00,-168.00,-9.60 -177.60,-9.60,5.64,0.00,1.00,-172.80,4.80 -177.60,-4.80,5.62,0.00,1.00,-177.60,-4.80 -177.60,-0.00,5.60,0.00,1.00,177.60,0.00 --177.60,0.00,5.58,0.00,1.00,172.80,0.00 --177.60,4.80,5.55,0.00,1.00,168.00,-4.80 --177.60,9.60,5.53,0.00,1.00,163.20,4.80 --177.60,14.40,5.51,0.00,1.00,158.40,-9.60 --172.80,19.20,5.49,0.00,1.00,153.60,9.60 --172.80,24.00,5.47,0.00,1.00,148.80,-14.40 --172.80,28.80,5.45,0.00,1.00,144.00,14.40 --172.80,33.60,5.43,0.00,1.00,139.20,-19.20 --168.00,38.40,5.40,0.00,1.00,134.40,19.20 --168.00,43.20,5.38,0.00,1.00,129.60,-24.00 --163.20,48.00,5.36,0.00,1.00,124.80,24.00 --163.20,52.80,5.34,0.00,1.00,120.00,-24.00 --158.40,57.60,5.32,0.00,1.00,115.20,28.80 --153.60,62.40,5.30,0.00,1.00,110.40,-28.80 --148.80,67.20,5.28,0.00,1.00,105.60,28.80 --139.20,72.00,5.26,0.00,1.00,100.80,-28.80 --129.60,72.00,5.23,0.00,1.00,96.00,28.80 --115.20,76.80,5.21,0.00,1.00,91.20,-33.60 --96.00,76.80,5.19,0.00,1.00,86.40,33.60 --76.80,76.80,5.17,0.00,1.00,81.60,-33.60 --57.60,72.00,5.15,0.00,1.00,76.80,33.60 --43.20,72.00,5.13,0.00,1.00,72.00,-28.80 --33.60,67.20,5.11,0.00,1.00,67.20,28.80 --28.80,62.40,5.08,0.00,1.00,62.40,-28.80 --24.00,57.60,5.06,0.00,1.00,57.60,28.80 --19.20,57.60,5.04,0.00,1.00,52.80,-28.80 --14.40,52.80,5.02,0.00,1.00,48.00,24.00 --14.40,48.00,5.00,0.00,1.00,43.20,-24.00 --14.40,43.20,4.98,0.00,1.00,38.40,19.20 --9.60,38.40,4.96,0.00,1.00,33.60,-19.20 --9.60,33.60,4.93,0.00,1.00,28.80,19.20 --4.80,28.80,4.91,0.00,1.00,24.00,-14.40 --4.80,24.00,4.89,0.00,1.00,19.20,14.40 --4.80,19.20,4.87,0.00,1.00,14.40,-9.60 --4.80,14.40,4.85,0.00,1.00,9.60,9.60 --0.00,9.60,4.83,0.00,1.00,4.80,-4.80 --0.00,4.80,4.81,0.00,1.00,0.00,4.80 -0.00,0.00,4.79,0.00,1.00,-4.80,0.00 -0.00,-4.80,4.76,0.00,1.00,-9.60,4.80 -0.00,-9.60,4.74,0.00,1.00,-14.40,-4.80 -0.00,-14.40,4.72,0.00,1.00,-19.20,9.60 -4.80,-19.20,4.70,0.00,1.00,-24.00,-9.60 -4.80,-24.00,4.68,0.00,1.00,-28.80,14.40 -4.80,-28.80,4.66,0.00,1.00,-33.60,-14.40 -4.80,-33.60,4.64,0.00,1.00,-38.40,19.20 -4.80,-38.40,4.61,0.00,1.00,-43.20,-24.00 -9.60,-43.20,4.59,0.00,1.00,-48.00,24.00 -9.60,-48.00,4.57,0.00,1.00,-52.80,-24.00 -9.60,-52.80,4.55,0.00,1.00,-57.60,28.80 -14.40,-57.60,4.53,0.00,1.00,-62.40,-28.80 -14.40,-62.40,4.51,0.00,1.00,-67.20,33.60 -19.20,-67.20,4.49,0.00,1.00,-72.00,-33.60 -24.00,-72.00,4.46,0.00,1.00,-76.80,33.60 -33.60,-72.00,4.44,0.00,1.00,-81.60,-33.60 -43.20,-76.80,4.42,0.00,1.00,-86.40,38.40 -67.20,-81.60,4.40,0.00,1.00,-91.20,-38.40 -96.00,-81.60,4.38,0.00,1.00,-96.00,38.40 -124.80,-81.60,4.36,0.00,1.00,-100.80,-38.40 -144.00,-76.80,4.34,0.00,1.00,-105.60,33.60 -153.60,-72.00,4.32,0.00,1.00,-110.40,-33.60 -158.40,-67.20,4.29,0.00,1.00,-115.20,33.60 -163.20,-62.40,4.27,0.00,1.00,-120.00,-33.60 -168.00,-57.60,4.25,0.00,1.00,-124.80,28.80 -168.00,-52.80,4.23,0.00,1.00,-129.60,-28.80 -168.00,-48.00,4.21,0.00,1.00,-134.40,28.80 -172.80,-43.20,4.19,0.00,1.00,-139.20,-24.00 -172.80,-38.40,4.17,0.00,1.00,-144.00,24.00 -172.80,-33.60,4.14,0.00,1.00,-148.80,-19.20 -172.80,-28.80,4.12,0.00,1.00,-153.60,19.20 -177.60,-24.00,4.10,0.00,1.00,-158.40,-14.40 -177.60,-19.20,4.08,0.00,1.00,-163.20,14.40 -177.60,-14.40,4.06,0.00,1.00,-168.00,-9.60 -177.60,-9.60,4.04,0.00,1.00,-172.80,4.80 -177.60,-4.80,4.02,0.00,1.00,-177.60,-4.80 -177.60,-0.00,3.99,0.00,1.00,177.60,0.00 --177.60,0.00,3.97,0.00,1.00,172.80,0.00 --177.60,4.80,3.95,0.00,1.00,168.00,-4.80 --177.60,9.60,3.93,0.00,1.00,163.20,4.80 --177.60,14.40,3.91,0.00,1.00,158.40,-9.60 --177.60,19.20,3.89,0.00,1.00,153.60,14.40 --177.60,24.00,3.87,0.00,1.00,148.80,-14.40 --172.80,28.80,3.85,0.00,1.00,144.00,19.20 --172.80,33.60,3.82,0.00,1.00,139.20,-19.20 --172.80,38.40,3.80,0.00,1.00,134.40,24.00 --172.80,43.20,3.78,0.00,1.00,129.60,-24.00 --168.00,48.00,3.76,0.00,1.00,124.80,28.80 --168.00,52.80,3.74,0.00,1.00,120.00,-28.80 --168.00,57.60,3.72,0.00,1.00,115.20,28.80 --163.20,62.40,3.70,0.00,1.00,110.40,-33.60 --158.40,67.20,3.67,0.00,1.00,105.60,33.60 --153.60,72.00,3.65,0.00,1.00,100.80,-33.60 --144.00,76.80,3.63,0.00,1.00,96.00,33.60 --124.80,81.60,3.61,0.00,1.00,91.20,-38.40 --96.00,81.60,3.59,0.00,1.00,86.40,38.40 --67.20,81.60,3.57,0.00,1.00,81.60,-38.40 --43.20,76.80,3.55,0.00,1.00,76.80,38.40 --33.60,72.00,3.52,0.00,1.00,72.00,-33.60 --24.00,72.00,3.50,0.00,1.00,67.20,33.60 --19.20,67.20,3.48,0.00,1.00,62.40,-33.60 --14.40,62.40,3.46,0.00,1.00,57.60,33.60 --14.40,57.60,3.44,0.00,1.00,52.80,-28.80 --9.60,52.80,3.42,0.00,1.00,48.00,28.80 --9.60,48.00,3.40,0.00,1.00,43.20,-24.00 --9.60,43.20,3.38,0.00,1.00,38.40,24.00 --4.80,38.40,3.35,0.00,1.00,33.60,-24.00 --4.80,33.60,3.33,0.00,1.00,28.80,19.20 --4.80,28.80,3.31,0.00,1.00,24.00,-14.40 --4.80,24.00,3.29,0.00,1.00,19.20,14.40 --4.80,19.20,3.27,0.00,1.00,14.40,-9.60 --0.00,14.40,3.25,0.00,1.00,9.60,9.60 --0.00,9.60,3.23,0.00,1.00,4.80,-4.80 --0.00,4.80,3.20,0.00,1.00,0.00,4.80 -0.00,0.00,3.18,0.00,1.00,-4.80,0.00 -0.00,-4.80,3.16,0.00,1.00,-9.60,4.80 -0.00,-9.60,3.14,0.00,1.00,-14.40,-4.80 -0.00,-14.40,3.12,0.00,1.00,-19.20,9.60 -0.00,-19.20,3.10,0.00,1.00,-24.00,-14.40 -0.00,-24.00,3.08,0.00,1.00,-28.80,14.40 -0.00,-28.80,3.05,0.00,1.00,-33.60,-19.20 -0.00,-33.60,3.03,0.00,1.00,-38.40,19.20 -4.80,-38.40,3.01,0.00,1.00,-43.20,-24.00 -4.80,-43.20,2.99,0.00,1.00,-48.00,28.80 -4.80,-48.00,2.97,0.00,1.00,-52.80,-28.80 -4.80,-52.80,2.95,0.00,1.00,-57.60,33.60 -4.80,-57.60,2.93,0.00,1.00,-62.40,-33.60 -4.80,-62.40,2.91,0.00,1.00,-67.20,33.60 -9.60,-67.20,2.88,0.00,1.00,-72.00,-38.40 -9.60,-72.00,2.86,0.00,1.00,-76.80,38.40 -14.40,-76.80,2.84,0.00,1.00,-81.60,-38.40 -24.00,-81.60,2.82,0.00,1.00,-86.40,43.20 -43.20,-86.40,2.80,0.00,1.00,-91.20,-43.20 -110.40,-86.40,2.78,0.00,1.00,-96.00,43.20 -148.80,-81.60,2.76,0.00,1.00,-100.80,-43.20 -163.20,-76.80,2.73,0.00,1.00,-105.60,38.40 -168.00,-72.00,2.71,0.00,1.00,-110.40,-38.40 -172.80,-67.20,2.69,0.00,1.00,-115.20,38.40 -172.80,-62.40,2.67,0.00,1.00,-120.00,-38.40 -172.80,-57.60,2.65,0.00,1.00,-124.80,33.60 -172.80,-52.80,2.63,0.00,1.00,-129.60,-33.60 -177.60,-48.00,2.61,0.00,1.00,-134.40,28.80 -177.60,-43.20,2.58,0.00,1.00,-139.20,-28.80 -177.60,-38.40,2.56,0.00,1.00,-144.00,24.00 -177.60,-33.60,2.54,0.00,1.00,-148.80,-24.00 -177.60,-28.80,2.52,0.00,1.00,-153.60,19.20 -177.60,-24.00,2.50,0.00,1.00,-158.40,-19.20 -177.60,-19.20,2.48,0.00,1.00,-163.20,14.40 -177.60,-14.40,2.46,0.00,1.00,-168.00,-9.60 -177.60,-9.60,2.44,0.00,1.00,-172.80,9.60 -177.60,-4.80,2.41,0.00,1.00,-177.60,-4.80 -177.60,-0.00,2.39,0.00,1.00,177.60,0.00 --177.60,0.00,2.37,0.00,1.00,172.80,0.00 --177.60,4.80,2.35,0.00,1.00,168.00,-4.80 --177.60,9.60,2.33,0.00,1.00,163.20,9.60 --177.60,14.40,2.31,0.00,1.00,158.40,-9.60 --177.60,19.20,2.29,0.00,1.00,153.60,14.40 --177.60,24.00,2.26,0.00,1.00,148.80,-19.20 --177.60,28.80,2.24,0.00,1.00,144.00,19.20 --177.60,33.60,2.22,0.00,1.00,139.20,-24.00 --177.60,38.40,2.20,0.00,1.00,134.40,24.00 --177.60,43.20,2.18,0.00,1.00,129.60,-28.80 --177.60,48.00,2.16,0.00,1.00,124.80,28.80 --172.80,52.80,2.14,0.00,1.00,120.00,-33.60 --172.80,57.60,2.11,0.00,1.00,115.20,33.60 --172.80,62.40,2.09,0.00,1.00,110.40,-38.40 --172.80,67.20,2.07,0.00,1.00,105.60,38.40 --168.00,72.00,2.05,0.00,1.00,100.80,-38.40 --163.20,76.80,2.03,0.00,1.00,96.00,38.40 --148.80,81.60,2.01,0.00,1.00,91.20,-43.20 --110.40,86.40,1.99,0.00,1.00,86.40,43.20 --43.20,86.40,1.97,0.00,1.00,81.60,-43.20 --24.00,81.60,1.94,0.00,1.00,76.80,43.20 --14.40,76.80,1.92,0.00,1.00,72.00,-38.40 --9.60,72.00,1.90,0.00,1.00,67.20,38.40 --9.60,67.20,1.88,0.00,1.00,62.40,-38.40 --4.80,62.40,1.86,0.00,1.00,57.60,33.60 --4.80,57.60,1.84,0.00,1.00,52.80,-33.60 --4.80,52.80,1.82,0.00,1.00,48.00,33.60 --4.80,48.00,1.79,0.00,1.00,43.20,-28.80 --4.80,43.20,1.77,0.00,1.00,38.40,28.80 --4.80,38.40,1.75,0.00,1.00,33.60,-24.00 --0.00,33.60,1.73,0.00,1.00,28.80,19.20 --0.00,28.80,1.71,0.00,1.00,24.00,-19.20 --0.00,24.00,1.69,0.00,1.00,19.20,14.40 --0.00,19.20,1.67,0.00,1.00,14.40,-14.40 --0.00,14.40,1.64,0.00,1.00,9.60,9.60 --0.00,9.60,1.62,0.00,1.00,4.80,-4.80 --0.00,4.80,1.60,0.00,1.00,0.00,4.80 --0.00,0.00,1.58,0.00,1.00,-4.80,0.00 --0.00,-4.80,1.56,0.00,1.00,-9.60,4.80 --0.00,-9.60,1.54,0.00,1.00,-14.40,-4.80 --0.00,-14.40,1.52,0.00,1.00,-19.20,9.60 --0.00,-19.20,1.50,0.00,1.00,-24.00,-14.40 --0.00,-24.00,1.47,0.00,1.00,-28.80,19.20 --0.00,-28.80,1.45,0.00,1.00,-33.60,-19.20 --0.00,-33.60,1.43,0.00,1.00,-38.40,24.00 --0.00,-38.40,1.41,0.00,1.00,-43.20,-28.80 --0.00,-43.20,1.39,0.00,1.00,-48.00,28.80 --0.00,-48.00,1.37,0.00,1.00,-52.80,-33.60 --0.00,-52.80,1.35,0.00,1.00,-57.60,33.60 --0.00,-57.60,1.32,0.00,1.00,-62.40,-38.40 --0.00,-62.40,1.30,0.00,1.00,-67.20,38.40 --4.80,-67.20,1.28,0.00,1.00,-72.00,-43.20 --4.80,-72.00,1.26,0.00,1.00,-76.80,43.20 --4.80,-76.80,1.24,0.00,1.00,-81.60,-43.20 --9.60,-81.60,1.22,0.00,1.00,-86.40,43.20 --19.20,-86.40,1.20,0.00,1.00,-91.20,-48.00 --134.40,-86.40,1.17,0.00,1.00,-96.00,48.00 --168.00,-81.60,1.15,0.00,1.00,-100.80,-48.00 --172.80,-76.80,1.13,0.00,1.00,-105.60,43.20 --177.60,-72.00,1.11,0.00,1.00,-110.40,-43.20 --177.60,-67.20,1.09,0.00,1.00,-115.20,43.20 --177.60,-62.40,1.07,0.00,1.00,-120.00,-38.40 --177.60,-57.60,1.05,0.00,1.00,-124.80,38.40 --177.60,-52.80,1.03,0.00,1.00,-129.60,-38.40 --177.60,-48.00,1.00,0.00,1.00,-134.40,33.60 --177.60,-43.20,0.98,0.00,1.00,-139.20,-28.80 --177.60,-38.40,0.96,0.00,1.00,-144.00,28.80 --177.60,-33.60,0.94,0.00,1.00,-148.80,-24.00 --177.60,-28.80,0.92,0.00,1.00,-153.60,24.00 --177.60,-24.00,0.90,0.00,1.00,-158.40,-19.20 --177.60,-19.20,0.88,0.00,1.00,-163.20,14.40 --177.60,-14.40,0.85,0.00,1.00,-168.00,-14.40 --177.60,-9.60,0.83,0.00,1.00,-172.80,9.60 --177.60,-4.80,0.81,0.00,1.00,-177.60,-4.80 --177.60,-0.00,0.79,0.00,1.00,177.60,0.00 -177.60,0.00,0.77,0.00,1.00,172.80,0.00 -177.60,4.80,0.75,0.00,1.00,168.00,-4.80 -177.60,9.60,0.73,0.00,1.00,163.20,9.60 -177.60,14.40,0.70,0.00,1.00,158.40,-14.40 -177.60,19.20,0.68,0.00,1.00,153.60,14.40 -177.60,24.00,0.66,0.00,1.00,148.80,-19.20 -177.60,28.80,0.64,0.00,1.00,144.00,24.00 -177.60,33.60,0.62,0.00,1.00,139.20,-24.00 -177.60,38.40,0.60,0.00,1.00,134.40,28.80 -177.60,43.20,0.58,0.00,1.00,129.60,-28.80 -177.60,48.00,0.56,0.00,1.00,124.80,33.60 -177.60,52.80,0.53,0.00,1.00,120.00,-38.40 -177.60,57.60,0.51,0.00,1.00,115.20,38.40 -177.60,62.40,0.49,0.00,1.00,110.40,-38.40 -177.60,67.20,0.47,0.00,1.00,105.60,43.20 -177.60,72.00,0.45,0.00,1.00,100.80,-43.20 -172.80,76.80,0.43,0.00,1.00,96.00,43.20 -168.00,81.60,0.41,0.00,1.00,91.20,-48.00 -134.40,86.40,0.38,0.00,1.00,86.40,48.00 -19.20,86.40,0.36,0.00,1.00,81.60,-48.00 -9.60,81.60,0.34,0.00,1.00,76.80,43.20 -4.80,76.80,0.32,0.00,1.00,72.00,-43.20 -4.80,72.00,0.30,0.00,1.00,67.20,43.20 -4.80,67.20,0.28,0.00,1.00,62.40,-43.20 -0.00,62.40,0.26,0.00,1.00,57.60,38.40 -0.00,57.60,0.23,0.00,1.00,52.80,-38.40 -0.00,52.80,0.21,0.00,1.00,48.00,33.60 -0.00,48.00,0.19,0.00,1.00,43.20,-33.60 -0.00,43.20,0.17,0.00,1.00,38.40,28.80 -0.00,38.40,0.15,0.00,1.00,33.60,-28.80 -0.00,33.60,0.13,0.00,1.00,28.80,24.00 -0.00,28.80,0.11,0.00,1.00,24.00,-19.20 -0.00,24.00,0.09,0.00,1.00,19.20,19.20 -0.00,19.20,0.06,0.00,1.00,14.40,-14.40 -0.00,14.40,0.04,0.00,1.00,9.60,9.60 -0.00,9.60,0.02,0.00,1.00,4.80,-4.80 -0.00,4.80,0.00,0.00,1.00,0.00,4.80 +0.00,0.00,0.00,0.00,1.00,0.00,0.00,0 +4.80,0.00,0.02,0.00,1.00,0.00,-4.80,0 +9.60,0.00,0.04,0.00,1.00,0.00,4.80,0 +14.40,0.00,0.06,0.00,1.00,0.00,-9.60,0 +19.20,0.00,0.09,0.00,1.00,0.00,14.40,0 +24.00,0.00,0.11,0.00,1.00,0.00,-14.40,0 +28.80,0.00,0.13,0.00,1.00,0.00,19.20,0 +33.60,0.00,0.15,0.00,1.00,0.00,-24.00,0 +38.40,0.00,0.17,0.00,1.00,0.00,24.00,0 +43.20,0.00,0.19,0.00,1.00,0.00,-28.80,0 +48.00,0.00,0.21,0.00,1.00,0.00,33.60,0 +52.80,0.00,0.23,0.00,1.00,0.00,-33.60,0 +57.60,0.00,0.26,0.00,1.00,0.00,38.40,0 +62.40,0.00,0.28,0.00,1.00,4.80,-38.40,0 +67.20,0.00,0.30,0.00,1.00,4.80,38.40,0 +72.00,0.00,0.32,0.00,1.00,4.80,-43.20,0 +76.80,0.00,0.34,0.00,1.00,9.60,43.20,0 +81.60,0.00,0.36,0.00,1.00,19.20,-43.20,0 +86.40,0.00,0.38,0.00,1.00,134.40,43.20,0 +91.20,0.00,0.41,0.00,1.00,168.00,-43.20,0 +96.00,0.00,0.43,0.00,1.00,172.80,43.20,0 +100.80,0.00,0.45,0.00,1.00,177.60,-43.20,0 +105.60,0.00,0.47,0.00,1.00,177.60,43.20,0 +110.40,0.00,0.49,0.00,1.00,177.60,-43.20,0 +115.20,0.00,0.51,0.00,1.00,177.60,38.40,0 +120.00,0.00,0.53,0.00,1.00,177.60,-38.40,0 +124.80,0.00,0.56,0.00,1.00,177.60,33.60,0 +129.60,0.00,0.58,0.00,1.00,177.60,-33.60,0 +134.40,0.00,0.60,0.00,1.00,177.60,28.80,0 +139.20,0.00,0.62,0.00,1.00,177.60,-28.80,0 +144.00,0.00,0.64,0.00,1.00,177.60,24.00,0 +148.80,0.00,0.66,0.00,1.00,177.60,-19.20,0 +153.60,0.00,0.68,0.00,1.00,177.60,19.20,0 +158.40,0.00,0.70,0.00,1.00,177.60,-14.40,0 +163.20,0.00,0.73,0.00,1.00,177.60,9.60,0 +168.00,0.00,0.75,0.00,1.00,177.60,-9.60,0 +172.80,0.00,0.77,0.00,1.00,177.60,4.80,0 +177.60,0.00,0.79,0.00,1.00,-177.60,-0.00,0 +-177.60,0.00,0.81,0.00,1.00,-177.60,-0.00,0 +-172.80,0.00,0.83,0.00,1.00,-177.60,4.80,0 +-168.00,0.00,0.85,0.00,1.00,-177.60,-9.60,0 +-163.20,0.00,0.88,0.00,1.00,-177.60,9.60,0 +-158.40,0.00,0.90,0.00,1.00,-177.60,-14.40,0 +-153.60,0.00,0.92,0.00,1.00,-177.60,19.20,0 +-148.80,0.00,0.94,0.00,1.00,-177.60,-19.20,0 +-144.00,0.00,0.96,0.00,1.00,-177.60,24.00,0 +-139.20,0.00,0.98,0.00,1.00,-177.60,-28.80,0 +-134.40,0.00,1.00,0.00,1.00,-177.60,28.80,0 +-129.60,0.00,1.03,0.00,1.00,-177.60,-33.60,0 +-124.80,0.00,1.05,0.00,1.00,-177.60,33.60,0 +-120.00,0.00,1.07,0.00,1.00,-177.60,-38.40,0 +-115.20,0.00,1.09,0.00,1.00,-177.60,38.40,0 +-110.40,0.00,1.11,0.00,1.00,-177.60,-43.20,0 +-105.60,0.00,1.13,0.00,1.00,-172.80,43.20,0 +-100.80,0.00,1.15,0.00,1.00,-168.00,-43.20,0 +-96.00,0.00,1.17,0.00,1.00,-134.40,43.20,0 +-91.20,0.00,1.20,0.00,1.00,-19.20,-43.20,0 +-86.40,0.00,1.22,0.00,1.00,-9.60,43.20,0 +-81.60,0.00,1.24,0.00,1.00,-4.80,-43.20,0 +-76.80,0.00,1.26,0.00,1.00,-4.80,43.20,0 +-72.00,0.00,1.28,0.00,1.00,-4.80,-43.20,0 +-67.20,0.00,1.30,0.00,1.00,-0.00,38.40,0 +-62.40,0.00,1.32,0.00,1.00,-0.00,-38.40,0 +-57.60,0.00,1.35,0.00,1.00,-0.00,38.40,0 +-52.80,0.00,1.37,0.00,1.00,-0.00,-33.60,0 +-48.00,0.00,1.39,0.00,1.00,-0.00,33.60,0 +-43.20,0.00,1.41,0.00,1.00,-0.00,-28.80,0 +-38.40,0.00,1.43,0.00,1.00,-0.00,24.00,0 +-33.60,0.00,1.45,0.00,1.00,-0.00,-24.00,0 +-28.80,0.00,1.47,0.00,1.00,-0.00,19.20,0 +-24.00,0.00,1.50,0.00,1.00,-0.00,-14.40,0 +-19.20,0.00,1.52,0.00,1.00,-0.00,14.40,0 +-14.40,0.00,1.54,0.00,1.00,-0.00,-9.60,0 +-9.60,0.00,1.56,0.00,1.00,-0.00,4.80,0 +-4.80,0.00,1.58,0.00,1.00,-0.00,-4.80,0 +0.00,0.00,1.60,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,1.62,0.00,1.00,-0.00,-4.80,0 +9.60,-0.00,1.64,0.00,1.00,-0.00,4.80,0 +14.40,-0.00,1.67,0.00,1.00,-0.00,-9.60,0 +19.20,-0.00,1.69,0.00,1.00,-0.00,14.40,0 +24.00,-0.00,1.71,0.00,1.00,-0.00,-14.40,0 +28.80,-0.00,1.73,0.00,1.00,-0.00,19.20,0 +33.60,-4.80,1.75,0.00,1.00,-4.80,-19.20,0 +38.40,-4.80,1.77,0.00,1.00,-4.80,24.00,0 +43.20,-4.80,1.79,0.00,1.00,-4.80,-24.00,0 +48.00,-4.80,1.82,0.00,1.00,-4.80,28.80,0 +52.80,-4.80,1.84,0.00,1.00,-4.80,-28.80,0 +57.60,-4.80,1.86,0.00,1.00,-4.80,33.60,0 +62.40,-4.80,1.88,0.00,1.00,-9.60,-33.60,0 +67.20,-4.80,1.90,0.00,1.00,-9.60,38.40,0 +72.00,-4.80,1.92,0.00,1.00,-14.40,-38.40,0 +76.80,-4.80,1.94,0.00,1.00,-24.00,38.40,0 +81.60,-4.80,1.97,0.00,1.00,-43.20,-38.40,0 +86.40,-4.80,1.99,0.00,1.00,-110.40,38.40,0 +91.20,-4.80,2.01,0.00,1.00,-148.80,-38.40,0 +96.00,-4.80,2.03,0.00,1.00,-163.20,38.40,0 +100.80,-4.80,2.05,0.00,1.00,-168.00,-38.40,0 +105.60,-4.80,2.07,0.00,1.00,-172.80,38.40,0 +110.40,-4.80,2.09,0.00,1.00,-172.80,-38.40,0 +115.20,-4.80,2.11,0.00,1.00,-172.80,33.60,0 +120.00,-4.80,2.14,0.00,1.00,-172.80,-33.60,0 +124.80,-4.80,2.16,0.00,1.00,-177.60,33.60,0 +129.60,-4.80,2.18,0.00,1.00,-177.60,-28.80,0 +134.40,-4.80,2.20,0.00,1.00,-177.60,28.80,0 +139.20,-4.80,2.22,0.00,1.00,-177.60,-24.00,0 +144.00,-4.80,2.24,0.00,1.00,-177.60,24.00,0 +148.80,-4.80,2.26,0.00,1.00,-177.60,-19.20,0 +153.60,-0.00,2.29,0.00,1.00,-177.60,14.40,0 +158.40,-0.00,2.31,0.00,1.00,-177.60,-14.40,0 +163.20,-0.00,2.33,0.00,1.00,-177.60,9.60,0 +168.00,-0.00,2.35,0.00,1.00,-177.60,-9.60,0 +172.80,-0.00,2.37,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,2.39,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,2.41,0.00,1.00,177.60,-0.00,0 +-172.80,0.00,2.44,0.00,1.00,177.60,4.80,0 +-168.00,0.00,2.46,0.00,1.00,177.60,-9.60,0 +-163.20,0.00,2.48,0.00,1.00,177.60,9.60,0 +-158.40,0.00,2.50,0.00,1.00,177.60,-14.40,0 +-153.60,0.00,2.52,0.00,1.00,177.60,14.40,0 +-148.80,4.80,2.54,0.00,1.00,177.60,-19.20,0 +-144.00,4.80,2.56,0.00,1.00,177.60,24.00,0 +-139.20,4.80,2.58,0.00,1.00,177.60,-24.00,0 +-134.40,4.80,2.61,0.00,1.00,177.60,28.80,0 +-129.60,4.80,2.63,0.00,1.00,172.80,-28.80,0 +-124.80,4.80,2.65,0.00,1.00,172.80,33.60,0 +-120.00,4.80,2.67,0.00,1.00,172.80,-33.60,0 +-115.20,4.80,2.69,0.00,1.00,172.80,33.60,0 +-110.40,4.80,2.71,0.00,1.00,168.00,-38.40,0 +-105.60,4.80,2.73,0.00,1.00,163.20,38.40,0 +-100.80,4.80,2.76,0.00,1.00,148.80,-38.40,0 +-96.00,4.80,2.78,0.00,1.00,110.40,38.40,0 +-91.20,4.80,2.80,0.00,1.00,43.20,-38.40,0 +-86.40,4.80,2.82,0.00,1.00,24.00,38.40,0 +-81.60,4.80,2.84,0.00,1.00,14.40,-38.40,0 +-76.80,4.80,2.86,0.00,1.00,9.60,38.40,0 +-72.00,4.80,2.88,0.00,1.00,9.60,-38.40,0 +-67.20,4.80,2.91,0.00,1.00,4.80,38.40,0 +-62.40,4.80,2.93,0.00,1.00,4.80,-33.60,0 +-57.60,4.80,2.95,0.00,1.00,4.80,33.60,0 +-52.80,4.80,2.97,0.00,1.00,4.80,-28.80,0 +-48.00,4.80,2.99,0.00,1.00,4.80,28.80,0 +-43.20,4.80,3.01,0.00,1.00,4.80,-24.00,0 +-38.40,4.80,3.03,0.00,1.00,0.00,24.00,0 +-33.60,4.80,3.05,0.00,1.00,0.00,-19.20,0 +-28.80,0.00,3.08,0.00,1.00,0.00,19.20,0 +-24.00,0.00,3.10,0.00,1.00,0.00,-14.40,0 +-19.20,0.00,3.12,0.00,1.00,0.00,14.40,0 +-14.40,0.00,3.14,0.00,1.00,0.00,-9.60,0 +-9.60,0.00,3.16,0.00,1.00,0.00,4.80,0 +-4.80,0.00,3.18,0.00,1.00,0.00,-4.80,0 +0.00,0.00,3.20,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,3.23,0.00,1.00,-0.00,-4.80,0 +9.60,-0.00,3.25,0.00,1.00,-0.00,4.80,0 +14.40,-0.00,3.27,0.00,1.00,-4.80,-9.60,0 +19.20,-4.80,3.29,0.00,1.00,-4.80,9.60,0 +24.00,-4.80,3.31,0.00,1.00,-4.80,-14.40,0 +28.80,-4.80,3.33,0.00,1.00,-4.80,14.40,0 +33.60,-4.80,3.35,0.00,1.00,-4.80,-19.20,0 +38.40,-4.80,3.38,0.00,1.00,-9.60,19.20,0 +43.20,-4.80,3.40,0.00,1.00,-9.60,-24.00,0 +48.00,-4.80,3.42,0.00,1.00,-9.60,24.00,0 +52.80,-9.60,3.44,0.00,1.00,-14.40,-28.80,0 +57.60,-9.60,3.46,0.00,1.00,-14.40,28.80,0 +62.40,-9.60,3.48,0.00,1.00,-19.20,-28.80,0 +67.20,-9.60,3.50,0.00,1.00,-24.00,33.60,0 +72.00,-9.60,3.52,0.00,1.00,-33.60,-33.60,0 +76.80,-9.60,3.55,0.00,1.00,-43.20,33.60,0 +81.60,-9.60,3.57,0.00,1.00,-67.20,-33.60,0 +86.40,-9.60,3.59,0.00,1.00,-96.00,33.60,0 +91.20,-9.60,3.61,0.00,1.00,-124.80,-33.60,0 +96.00,-9.60,3.63,0.00,1.00,-144.00,33.60,0 +100.80,-9.60,3.65,0.00,1.00,-153.60,-33.60,0 +105.60,-9.60,3.67,0.00,1.00,-158.40,33.60,0 +110.40,-9.60,3.70,0.00,1.00,-163.20,-33.60,0 +115.20,-9.60,3.72,0.00,1.00,-168.00,33.60,0 +120.00,-9.60,3.74,0.00,1.00,-168.00,-28.80,0 +124.80,-9.60,3.76,0.00,1.00,-168.00,28.80,0 +129.60,-9.60,3.78,0.00,1.00,-172.80,-28.80,0 +134.40,-4.80,3.80,0.00,1.00,-172.80,24.00,0 +139.20,-4.80,3.82,0.00,1.00,-172.80,-24.00,0 +144.00,-4.80,3.85,0.00,1.00,-172.80,19.20,0 +148.80,-4.80,3.87,0.00,1.00,-177.60,-19.20,0 +153.60,-4.80,3.89,0.00,1.00,-177.60,14.40,0 +158.40,-4.80,3.91,0.00,1.00,-177.60,-14.40,0 +163.20,-4.80,3.93,0.00,1.00,-177.60,9.60,0 +168.00,-0.00,3.95,0.00,1.00,-177.60,-4.80,0 +172.80,-0.00,3.97,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,3.99,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,4.02,0.00,1.00,177.60,-0.00,0 +-172.80,0.00,4.04,0.00,1.00,177.60,4.80,0 +-168.00,0.00,4.06,0.00,1.00,177.60,-4.80,0 +-163.20,4.80,4.08,0.00,1.00,177.60,9.60,0 +-158.40,4.80,4.10,0.00,1.00,177.60,-14.40,0 +-153.60,4.80,4.12,0.00,1.00,172.80,14.40,0 +-148.80,4.80,4.14,0.00,1.00,172.80,-19.20,0 +-144.00,4.80,4.17,0.00,1.00,172.80,19.20,0 +-139.20,4.80,4.19,0.00,1.00,172.80,-24.00,0 +-134.40,4.80,4.21,0.00,1.00,168.00,24.00,0 +-129.60,9.60,4.23,0.00,1.00,168.00,-28.80,0 +-124.80,9.60,4.25,0.00,1.00,168.00,28.80,0 +-120.00,9.60,4.27,0.00,1.00,163.20,-28.80,0 +-115.20,9.60,4.29,0.00,1.00,158.40,33.60,0 +-110.40,9.60,4.32,0.00,1.00,153.60,-33.60,0 +-105.60,9.60,4.34,0.00,1.00,144.00,33.60,0 +-100.80,9.60,4.36,0.00,1.00,124.80,-33.60,0 +-96.00,9.60,4.38,0.00,1.00,96.00,33.60,0 +-91.20,9.60,4.40,0.00,1.00,67.20,-33.60,0 +-86.40,9.60,4.42,0.00,1.00,43.20,33.60,0 +-81.60,9.60,4.44,0.00,1.00,33.60,-33.60,0 +-76.80,9.60,4.46,0.00,1.00,24.00,33.60,0 +-72.00,9.60,4.49,0.00,1.00,19.20,-33.60,0 +-67.20,9.60,4.51,0.00,1.00,14.40,33.60,0 +-62.40,9.60,4.53,0.00,1.00,14.40,-28.80,0 +-57.60,9.60,4.55,0.00,1.00,9.60,28.80,0 +-52.80,9.60,4.57,0.00,1.00,9.60,-28.80,0 +-48.00,4.80,4.59,0.00,1.00,9.60,24.00,0 +-43.20,4.80,4.61,0.00,1.00,4.80,-24.00,0 +-38.40,4.80,4.64,0.00,1.00,4.80,19.20,0 +-33.60,4.80,4.66,0.00,1.00,4.80,-19.20,0 +-28.80,4.80,4.68,0.00,1.00,4.80,14.40,0 +-24.00,4.80,4.70,0.00,1.00,4.80,-14.40,0 +-19.20,4.80,4.72,0.00,1.00,0.00,9.60,0 +-14.40,0.00,4.74,0.00,1.00,0.00,-9.60,0 +-9.60,0.00,4.76,0.00,1.00,0.00,4.80,0 +-4.80,0.00,4.79,0.00,1.00,0.00,-4.80,0 +0.00,0.00,4.81,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,4.83,0.00,1.00,-0.00,-4.80,0 +9.60,-0.00,4.85,0.00,1.00,-4.80,4.80,0 +14.40,-4.80,4.87,0.00,1.00,-4.80,-9.60,0 +19.20,-4.80,4.89,0.00,1.00,-4.80,9.60,0 +24.00,-4.80,4.91,0.00,1.00,-4.80,-9.60,0 +28.80,-4.80,4.93,0.00,1.00,-9.60,14.40,0 +33.60,-9.60,4.96,0.00,1.00,-9.60,-14.40,0 +38.40,-9.60,4.98,0.00,1.00,-14.40,19.20,0 +43.20,-9.60,5.00,0.00,1.00,-14.40,-19.20,0 +48.00,-9.60,5.02,0.00,1.00,-14.40,24.00,0 +52.80,-9.60,5.04,0.00,1.00,-19.20,-24.00,0 +57.60,-14.40,5.06,0.00,1.00,-24.00,24.00,0 +62.40,-14.40,5.08,0.00,1.00,-28.80,-28.80,0 +67.20,-14.40,5.11,0.00,1.00,-33.60,28.80,0 +72.00,-14.40,5.13,0.00,1.00,-43.20,-28.80,0 +76.80,-14.40,5.15,0.00,1.00,-57.60,28.80,0 +81.60,-14.40,5.17,0.00,1.00,-76.80,-28.80,0 +86.40,-14.40,5.19,0.00,1.00,-96.00,28.80,0 +91.20,-14.40,5.21,0.00,1.00,-115.20,-28.80,0 +96.00,-14.40,5.23,0.00,1.00,-129.60,28.80,0 +100.80,-14.40,5.26,0.00,1.00,-139.20,-28.80,0 +105.60,-14.40,5.28,0.00,1.00,-148.80,28.80,0 +110.40,-14.40,5.30,0.00,1.00,-153.60,-28.80,0 +115.20,-14.40,5.32,0.00,1.00,-158.40,28.80,0 +120.00,-14.40,5.34,0.00,1.00,-163.20,-24.00,0 +124.80,-9.60,5.36,0.00,1.00,-163.20,24.00,0 +129.60,-9.60,5.38,0.00,1.00,-168.00,-24.00,0 +134.40,-9.60,5.40,0.00,1.00,-168.00,19.20,0 +139.20,-9.60,5.43,0.00,1.00,-172.80,-19.20,0 +144.00,-9.60,5.45,0.00,1.00,-172.80,19.20,0 +148.80,-9.60,5.47,0.00,1.00,-172.80,-14.40,0 +153.60,-4.80,5.49,0.00,1.00,-172.80,14.40,0 +158.40,-4.80,5.51,0.00,1.00,-177.60,-9.60,0 +163.20,-4.80,5.53,0.00,1.00,-177.60,9.60,0 +168.00,-4.80,5.55,0.00,1.00,-177.60,-4.80,0 +172.80,-0.00,5.58,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,5.60,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,5.62,0.00,1.00,177.60,-0.00,0 +-172.80,0.00,5.64,0.00,1.00,177.60,4.80,0 +-168.00,4.80,5.66,0.00,1.00,177.60,-4.80,0 +-163.20,4.80,5.68,0.00,1.00,172.80,9.60,0 +-158.40,4.80,5.70,0.00,1.00,172.80,-9.60,0 +-153.60,4.80,5.72,0.00,1.00,172.80,14.40,0 +-148.80,9.60,5.75,0.00,1.00,172.80,-14.40,0 +-144.00,9.60,5.77,0.00,1.00,168.00,19.20,0 +-139.20,9.60,5.79,0.00,1.00,168.00,-19.20,0 +-134.40,9.60,5.81,0.00,1.00,163.20,19.20,0 +-129.60,9.60,5.83,0.00,1.00,163.20,-24.00,0 +-124.80,9.60,5.85,0.00,1.00,158.40,24.00,0 +-120.00,14.40,5.87,0.00,1.00,153.60,-24.00,0 +-115.20,14.40,5.90,0.00,1.00,148.80,28.80,0 +-110.40,14.40,5.92,0.00,1.00,139.20,-28.80,0 +-105.60,14.40,5.94,0.00,1.00,129.60,28.80,0 +-100.80,14.40,5.96,0.00,1.00,115.20,-28.80,0 +-96.00,14.40,5.98,0.00,1.00,96.00,28.80,0 +-91.20,14.40,6.00,0.00,1.00,76.80,-28.80,0 +-86.40,14.40,6.02,0.00,1.00,57.60,28.80,0 +-81.60,14.40,6.05,0.00,1.00,43.20,-28.80,0 +-76.80,14.40,6.07,0.00,1.00,33.60,28.80,0 +-72.00,14.40,6.09,0.00,1.00,28.80,-28.80,0 +-67.20,14.40,6.11,0.00,1.00,24.00,28.80,0 +-62.40,14.40,6.13,0.00,1.00,19.20,-28.80,0 +-57.60,14.40,6.15,0.00,1.00,14.40,24.00,0 +-52.80,9.60,6.17,0.00,1.00,14.40,-24.00,0 +-48.00,9.60,6.19,0.00,1.00,14.40,24.00,0 +-43.20,9.60,6.22,0.00,1.00,9.60,-19.20,0 +-38.40,9.60,6.24,0.00,1.00,9.60,19.20,0 +-33.60,9.60,6.26,0.00,1.00,4.80,-14.40,0 +-28.80,4.80,6.28,0.00,1.00,4.80,14.40,0 +-24.00,4.80,6.30,0.00,1.00,4.80,-9.60,0 +-19.20,4.80,6.32,0.00,1.00,4.80,9.60,0 +-14.40,4.80,6.34,0.00,1.00,0.00,-9.60,0 +-9.60,0.00,6.37,0.00,1.00,0.00,4.80,0 +-4.80,0.00,6.39,0.00,1.00,0.00,-4.80,0 +0.00,0.00,6.41,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,6.43,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,6.45,0.00,1.00,-4.80,4.80,0 +14.40,-4.80,6.47,0.00,1.00,-4.80,-4.80,0 +19.20,-4.80,6.49,0.00,1.00,-9.60,9.60,0 +24.00,-9.60,6.52,0.00,1.00,-9.60,-9.60,0 +28.80,-9.60,6.54,0.00,1.00,-9.60,14.40,0 +33.60,-9.60,6.56,0.00,1.00,-14.40,-14.40,0 +38.40,-9.60,6.58,0.00,1.00,-14.40,14.40,0 +43.20,-14.40,6.60,0.00,1.00,-19.20,-19.20,0 +48.00,-14.40,6.62,0.00,1.00,-24.00,19.20,0 +52.80,-14.40,6.64,0.00,1.00,-24.00,-19.20,0 +57.60,-14.40,6.66,0.00,1.00,-28.80,19.20,0 +62.40,-19.20,6.69,0.00,1.00,-38.40,-24.00,0 +67.20,-19.20,6.71,0.00,1.00,-43.20,24.00,0 +72.00,-19.20,6.73,0.00,1.00,-52.80,-24.00,0 +76.80,-19.20,6.75,0.00,1.00,-62.40,24.00,0 +81.60,-19.20,6.77,0.00,1.00,-76.80,-24.00,0 +86.40,-19.20,6.79,0.00,1.00,-96.00,24.00,0 +91.20,-19.20,6.81,0.00,1.00,-110.40,-24.00,0 +96.00,-19.20,6.84,0.00,1.00,-120.00,24.00,0 +100.80,-19.20,6.86,0.00,1.00,-134.40,-24.00,0 +105.60,-19.20,6.88,0.00,1.00,-139.20,24.00,0 +110.40,-19.20,6.90,0.00,1.00,-148.80,-24.00,0 +115.20,-19.20,6.92,0.00,1.00,-153.60,24.00,0 +120.00,-14.40,6.94,0.00,1.00,-158.40,-24.00,0 +124.80,-14.40,6.96,0.00,1.00,-158.40,19.20,0 +129.60,-14.40,6.99,0.00,1.00,-163.20,-19.20,0 +134.40,-14.40,7.01,0.00,1.00,-163.20,19.20,0 +139.20,-14.40,7.03,0.00,1.00,-168.00,-14.40,0 +144.00,-9.60,7.05,0.00,1.00,-168.00,14.40,0 +148.80,-9.60,7.07,0.00,1.00,-172.80,-14.40,0 +153.60,-9.60,7.09,0.00,1.00,-172.80,9.60,0 +158.40,-4.80,7.11,0.00,1.00,-172.80,-9.60,0 +163.20,-4.80,7.13,0.00,1.00,-177.60,9.60,0 +168.00,-4.80,7.16,0.00,1.00,-177.60,-4.80,0 +172.80,-0.00,7.18,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,7.20,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,7.22,0.00,1.00,177.60,-0.00,0 +-172.80,0.00,7.24,0.00,1.00,177.60,4.80,0 +-168.00,4.80,7.26,0.00,1.00,172.80,-4.80,0 +-163.20,4.80,7.28,0.00,1.00,172.80,9.60,0 +-158.40,4.80,7.31,0.00,1.00,172.80,-9.60,0 +-153.60,9.60,7.33,0.00,1.00,168.00,9.60,0 +-148.80,9.60,7.35,0.00,1.00,168.00,-14.40,0 +-144.00,9.60,7.37,0.00,1.00,163.20,14.40,0 +-139.20,14.40,7.39,0.00,1.00,163.20,-14.40,0 +-134.40,14.40,7.41,0.00,1.00,158.40,19.20,0 +-129.60,14.40,7.43,0.00,1.00,158.40,-19.20,0 +-124.80,14.40,7.46,0.00,1.00,153.60,19.20,0 +-120.00,14.40,7.48,0.00,1.00,148.80,-24.00,0 +-115.20,19.20,7.50,0.00,1.00,139.20,24.00,0 +-110.40,19.20,7.52,0.00,1.00,134.40,-24.00,0 +-105.60,19.20,7.54,0.00,1.00,120.00,24.00,0 +-100.80,19.20,7.56,0.00,1.00,110.40,-24.00,0 +-96.00,19.20,7.58,0.00,1.00,96.00,24.00,0 +-91.20,19.20,7.60,0.00,1.00,76.80,-24.00,0 +-86.40,19.20,7.63,0.00,1.00,62.40,24.00,0 +-81.60,19.20,7.65,0.00,1.00,52.80,-24.00,0 +-76.80,19.20,7.67,0.00,1.00,43.20,24.00,0 +-72.00,19.20,7.69,0.00,1.00,38.40,-24.00,0 +-67.20,19.20,7.71,0.00,1.00,28.80,24.00,0 +-62.40,19.20,7.73,0.00,1.00,24.00,-24.00,0 +-57.60,14.40,7.75,0.00,1.00,24.00,19.20,0 +-52.80,14.40,7.78,0.00,1.00,19.20,-19.20,0 +-48.00,14.40,7.80,0.00,1.00,14.40,19.20,0 +-43.20,14.40,7.82,0.00,1.00,14.40,-19.20,0 +-38.40,9.60,7.84,0.00,1.00,9.60,14.40,0 +-33.60,9.60,7.86,0.00,1.00,9.60,-14.40,0 +-28.80,9.60,7.88,0.00,1.00,9.60,14.40,0 +-24.00,9.60,7.90,0.00,1.00,4.80,-9.60,0 +-19.20,4.80,7.93,0.00,1.00,4.80,9.60,0 +-14.40,4.80,7.95,0.00,1.00,4.80,-4.80,0 +-9.60,4.80,7.97,0.00,1.00,0.00,4.80,0 +-4.80,0.00,7.99,0.00,1.00,0.00,-0.00,0 +0.00,0.00,8.01,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,8.03,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,8.05,0.00,1.00,-4.80,4.80,0 +14.40,-4.80,8.07,0.00,1.00,-9.60,-4.80,0 +19.20,-9.60,8.10,0.00,1.00,-9.60,4.80,0 +24.00,-9.60,8.12,0.00,1.00,-14.40,-9.60,0 +28.80,-9.60,8.14,0.00,1.00,-14.40,9.60,0 +33.60,-14.40,8.16,0.00,1.00,-19.20,-9.60,0 +33.60,-14.40,8.18,0.00,1.00,-19.20,14.40,0 +38.40,-14.40,8.20,0.00,1.00,-24.00,-14.40,0 +43.20,-19.20,8.22,0.00,1.00,-28.80,14.40,0 +48.00,-19.20,8.25,0.00,1.00,-33.60,-14.40,0 +57.60,-19.20,8.27,0.00,1.00,-38.40,19.20,0 +62.40,-19.20,8.29,0.00,1.00,-43.20,-19.20,0 +67.20,-24.00,8.31,0.00,1.00,-48.00,19.20,0 +72.00,-24.00,8.33,0.00,1.00,-57.60,-19.20,0 +76.80,-24.00,8.35,0.00,1.00,-67.20,19.20,0 +81.60,-24.00,8.37,0.00,1.00,-81.60,-19.20,0 +86.40,-24.00,8.40,0.00,1.00,-91.20,19.20,0 +91.20,-24.00,8.42,0.00,1.00,-105.60,-19.20,0 +96.00,-24.00,8.44,0.00,1.00,-115.20,19.20,0 +100.80,-24.00,8.46,0.00,1.00,-124.80,-19.20,0 +105.60,-24.00,8.48,0.00,1.00,-134.40,19.20,0 +110.40,-24.00,8.50,0.00,1.00,-139.20,-19.20,0 +115.20,-19.20,8.52,0.00,1.00,-144.00,19.20,0 +120.00,-19.20,8.54,0.00,1.00,-148.80,-19.20,0 +129.60,-19.20,8.57,0.00,1.00,-153.60,19.20,0 +134.40,-19.20,8.59,0.00,1.00,-158.40,-14.40,0 +139.20,-19.20,8.61,0.00,1.00,-163.20,14.40,0 +144.00,-14.40,8.63,0.00,1.00,-163.20,-14.40,0 +148.80,-14.40,8.65,0.00,1.00,-168.00,14.40,0 +148.80,-14.40,8.67,0.00,1.00,-168.00,-9.60,0 +153.60,-9.60,8.69,0.00,1.00,-172.80,9.60,0 +158.40,-9.60,8.72,0.00,1.00,-172.80,-9.60,0 +163.20,-4.80,8.74,0.00,1.00,-177.60,4.80,0 +168.00,-4.80,8.76,0.00,1.00,-177.60,-4.80,0 +172.80,-4.80,8.78,0.00,1.00,-177.60,4.80,0 +177.60,-0.00,8.80,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,8.82,0.00,1.00,177.60,-0.00,0 +-172.80,4.80,8.84,0.00,1.00,177.60,4.80,0 +-168.00,4.80,8.87,0.00,1.00,172.80,-4.80,0 +-163.20,4.80,8.89,0.00,1.00,172.80,4.80,0 +-158.40,9.60,8.91,0.00,1.00,168.00,-9.60,0 +-153.60,9.60,8.93,0.00,1.00,168.00,9.60,0 +-148.80,14.40,8.95,0.00,1.00,163.20,-9.60,0 +-148.80,14.40,8.97,0.00,1.00,163.20,14.40,0 +-144.00,14.40,8.99,0.00,1.00,158.40,-14.40,0 +-139.20,19.20,9.01,0.00,1.00,153.60,14.40,0 +-134.40,19.20,9.04,0.00,1.00,148.80,-14.40,0 +-129.60,19.20,9.06,0.00,1.00,144.00,19.20,0 +-120.00,19.20,9.08,0.00,1.00,139.20,-19.20,0 +-115.20,19.20,9.10,0.00,1.00,134.40,19.20,0 +-110.40,24.00,9.12,0.00,1.00,124.80,-19.20,0 +-105.60,24.00,9.14,0.00,1.00,115.20,19.20,0 +-100.80,24.00,9.16,0.00,1.00,105.60,-19.20,0 +-96.00,24.00,9.19,0.00,1.00,91.20,19.20,0 +-91.20,24.00,9.21,0.00,1.00,81.60,-19.20,0 +-86.40,24.00,9.23,0.00,1.00,67.20,19.20,0 +-81.60,24.00,9.25,0.00,1.00,57.60,-19.20,0 +-76.80,24.00,9.27,0.00,1.00,48.00,19.20,0 +-72.00,24.00,9.29,0.00,1.00,43.20,-19.20,0 +-67.20,24.00,9.31,0.00,1.00,38.40,19.20,0 +-62.40,19.20,9.34,0.00,1.00,33.60,-19.20,0 +-57.60,19.20,9.36,0.00,1.00,28.80,19.20,0 +-48.00,19.20,9.38,0.00,1.00,24.00,-14.40,0 +-43.20,19.20,9.40,0.00,1.00,19.20,14.40,0 +-38.40,14.40,9.42,0.00,1.00,19.20,-14.40,0 +-33.60,14.40,9.44,0.00,1.00,14.40,14.40,0 +-33.60,14.40,9.46,0.00,1.00,14.40,-9.60,0 +-28.80,9.60,9.48,0.00,1.00,9.60,9.60,0 +-24.00,9.60,9.51,0.00,1.00,9.60,-9.60,0 +-19.20,9.60,9.53,0.00,1.00,4.80,4.80,0 +-14.40,4.80,9.55,0.00,1.00,4.80,-4.80,0 +-9.60,4.80,9.57,0.00,1.00,0.00,4.80,0 +-4.80,0.00,9.59,0.00,1.00,0.00,-0.00,0 +0.00,0.00,9.61,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,9.63,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,9.66,0.00,1.00,-4.80,4.80,0 +14.40,-4.80,9.68,0.00,1.00,-9.60,-4.80,0 +19.20,-9.60,9.70,0.00,1.00,-9.60,4.80,0 +19.20,-9.60,9.72,0.00,1.00,-14.40,-4.80,0 +24.00,-14.40,9.74,0.00,1.00,-19.20,9.60,0 +28.80,-14.40,9.76,0.00,1.00,-19.20,-9.60,0 +33.60,-19.20,9.78,0.00,1.00,-24.00,9.60,0 +38.40,-19.20,9.81,0.00,1.00,-28.80,-9.60,0 +43.20,-19.20,9.83,0.00,1.00,-33.60,9.60,0 +48.00,-24.00,9.85,0.00,1.00,-38.40,-14.40,0 +52.80,-24.00,9.87,0.00,1.00,-43.20,14.40,0 +57.60,-24.00,9.89,0.00,1.00,-48.00,-14.40,0 +62.40,-24.00,9.91,0.00,1.00,-52.80,14.40,0 +72.00,-28.80,9.93,0.00,1.00,-62.40,-14.40,0 +76.80,-28.80,9.95,0.00,1.00,-72.00,14.40,0 +81.60,-28.80,9.98,0.00,1.00,-81.60,-14.40,0 +86.40,-28.80,10.00,0.00,1.00,-91.20,14.40,0 +91.20,-28.80,10.02,0.00,1.00,-100.80,-14.40,0 +96.00,-28.80,10.04,0.00,1.00,-110.40,14.40,0 +100.80,-28.80,10.06,0.00,1.00,-120.00,-14.40,0 +105.60,-28.80,10.08,0.00,1.00,-129.60,14.40,0 +115.20,-28.80,10.10,0.00,1.00,-134.40,-14.40,0 +120.00,-24.00,10.13,0.00,1.00,-139.20,14.40,0 +124.80,-24.00,10.15,0.00,1.00,-144.00,-14.40,0 +129.60,-24.00,10.17,0.00,1.00,-148.80,14.40,0 +134.40,-24.00,10.19,0.00,1.00,-153.60,-14.40,0 +139.20,-19.20,10.21,0.00,1.00,-158.40,9.60,0 +144.00,-19.20,10.23,0.00,1.00,-163.20,-9.60,0 +148.80,-14.40,10.25,0.00,1.00,-163.20,9.60,0 +153.60,-14.40,10.28,0.00,1.00,-168.00,-9.60,0 +158.40,-14.40,10.30,0.00,1.00,-168.00,4.80,0 +163.20,-9.60,10.32,0.00,1.00,-172.80,-4.80,0 +163.20,-9.60,10.34,0.00,1.00,-172.80,4.80,0 +168.00,-4.80,10.36,0.00,1.00,-177.60,-4.80,0 +172.80,-4.80,10.38,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,10.40,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,10.42,0.00,1.00,177.60,-0.00,0 +-172.80,4.80,10.45,0.00,1.00,172.80,0.00,0 +-168.00,4.80,10.47,0.00,1.00,172.80,-4.80,0 +-163.20,9.60,10.49,0.00,1.00,168.00,4.80,0 +-163.20,9.60,10.51,0.00,1.00,168.00,-4.80,0 +-158.40,14.40,10.53,0.00,1.00,163.20,4.80,0 +-153.60,14.40,10.55,0.00,1.00,163.20,-9.60,0 +-148.80,14.40,10.57,0.00,1.00,158.40,9.60,0 +-144.00,19.20,10.60,0.00,1.00,153.60,-9.60,0 +-139.20,19.20,10.62,0.00,1.00,148.80,9.60,0 +-134.40,24.00,10.64,0.00,1.00,144.00,-14.40,0 +-129.60,24.00,10.66,0.00,1.00,139.20,14.40,0 +-124.80,24.00,10.68,0.00,1.00,134.40,-14.40,0 +-120.00,24.00,10.70,0.00,1.00,129.60,14.40,0 +-115.20,28.80,10.72,0.00,1.00,120.00,-14.40,0 +-105.60,28.80,10.74,0.00,1.00,110.40,14.40,0 +-100.80,28.80,10.77,0.00,1.00,100.80,-14.40,0 +-96.00,28.80,10.79,0.00,1.00,91.20,14.40,0 +-91.20,28.80,10.81,0.00,1.00,81.60,-14.40,0 +-86.40,28.80,10.83,0.00,1.00,72.00,14.40,0 +-81.60,28.80,10.85,0.00,1.00,62.40,-14.40,0 +-76.80,28.80,10.87,0.00,1.00,52.80,14.40,0 +-72.00,28.80,10.89,0.00,1.00,48.00,-14.40,0 +-62.40,24.00,10.92,0.00,1.00,43.20,14.40,0 +-57.60,24.00,10.94,0.00,1.00,38.40,-14.40,0 +-52.80,24.00,10.96,0.00,1.00,33.60,14.40,0 +-48.00,24.00,10.98,0.00,1.00,28.80,-14.40,0 +-43.20,19.20,11.00,0.00,1.00,24.00,9.60,0 +-38.40,19.20,11.02,0.00,1.00,19.20,-9.60,0 +-33.60,19.20,11.04,0.00,1.00,19.20,9.60,0 +-28.80,14.40,11.07,0.00,1.00,14.40,-9.60,0 +-24.00,14.40,11.09,0.00,1.00,9.60,9.60,0 +-19.20,9.60,11.11,0.00,1.00,9.60,-4.80,0 +-19.20,9.60,11.13,0.00,1.00,4.80,4.80,0 +-14.40,4.80,11.15,0.00,1.00,4.80,-4.80,0 +-9.60,4.80,11.17,0.00,1.00,0.00,4.80,0 +-4.80,0.00,11.19,0.00,1.00,0.00,-0.00,0 +0.00,0.00,11.21,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,11.24,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,11.26,0.00,1.00,-9.60,0.00,0 +14.40,-9.60,11.28,0.00,1.00,-9.60,-4.80,0 +14.40,-9.60,11.30,0.00,1.00,-14.40,4.80,0 +19.20,-14.40,11.32,0.00,1.00,-14.40,-4.80,0 +24.00,-14.40,11.34,0.00,1.00,-19.20,4.80,0 +28.80,-19.20,11.36,0.00,1.00,-24.00,-4.80,0 +33.60,-19.20,11.39,0.00,1.00,-28.80,4.80,0 +38.40,-24.00,11.41,0.00,1.00,-28.80,-9.60,0 +43.20,-24.00,11.43,0.00,1.00,-33.60,9.60,0 +48.00,-24.00,11.45,0.00,1.00,-38.40,-9.60,0 +52.80,-28.80,11.47,0.00,1.00,-48.00,9.60,0 +57.60,-28.80,11.49,0.00,1.00,-52.80,-9.60,0 +62.40,-28.80,11.51,0.00,1.00,-57.60,9.60,0 +67.20,-33.60,11.54,0.00,1.00,-67.20,-9.60,0 +72.00,-33.60,11.56,0.00,1.00,-76.80,9.60,0 +81.60,-33.60,11.58,0.00,1.00,-81.60,-9.60,0 +86.40,-33.60,11.60,0.00,1.00,-91.20,9.60,0 +91.20,-33.60,11.62,0.00,1.00,-100.80,-9.60,0 +96.00,-33.60,11.64,0.00,1.00,-110.40,9.60,0 +100.80,-33.60,11.66,0.00,1.00,-115.20,-9.60,0 +110.40,-33.60,11.68,0.00,1.00,-124.80,9.60,0 +115.20,-33.60,11.71,0.00,1.00,-129.60,-9.60,0 +120.00,-28.80,11.73,0.00,1.00,-139.20,9.60,0 +124.80,-28.80,11.75,0.00,1.00,-144.00,-9.60,0 +129.60,-28.80,11.77,0.00,1.00,-148.80,9.60,0 +134.40,-24.00,11.79,0.00,1.00,-153.60,-9.60,0 +139.20,-24.00,11.81,0.00,1.00,-153.60,9.60,0 +144.00,-19.20,11.83,0.00,1.00,-158.40,-9.60,0 +148.80,-19.20,11.86,0.00,1.00,-163.20,4.80,0 +153.60,-14.40,11.88,0.00,1.00,-163.20,-4.80,0 +158.40,-14.40,11.90,0.00,1.00,-168.00,4.80,0 +163.20,-9.60,11.92,0.00,1.00,-172.80,-4.80,0 +168.00,-9.60,11.94,0.00,1.00,-172.80,4.80,0 +168.00,-4.80,11.96,0.00,1.00,-177.60,-0.00,0 +172.80,-4.80,11.98,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,12.01,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,12.03,0.00,1.00,177.60,-0.00,0 +-172.80,4.80,12.05,0.00,1.00,172.80,0.00,0 +-168.00,4.80,12.07,0.00,1.00,172.80,-0.00,0 +-168.00,9.60,12.09,0.00,1.00,168.00,4.80,0 +-163.20,9.60,12.11,0.00,1.00,163.20,-4.80,0 +-158.40,14.40,12.13,0.00,1.00,163.20,4.80,0 +-153.60,14.40,12.15,0.00,1.00,158.40,-4.80,0 +-148.80,19.20,12.18,0.00,1.00,153.60,4.80,0 +-144.00,19.20,12.20,0.00,1.00,153.60,-9.60,0 +-139.20,24.00,12.22,0.00,1.00,148.80,9.60,0 +-134.40,24.00,12.24,0.00,1.00,144.00,-9.60,0 +-129.60,28.80,12.26,0.00,1.00,139.20,9.60,0 +-124.80,28.80,12.28,0.00,1.00,129.60,-9.60,0 +-120.00,28.80,12.30,0.00,1.00,124.80,9.60,0 +-115.20,33.60,12.33,0.00,1.00,115.20,-9.60,0 +-110.40,33.60,12.35,0.00,1.00,110.40,9.60,0 +-100.80,33.60,12.37,0.00,1.00,100.80,-9.60,0 +-96.00,33.60,12.39,0.00,1.00,91.20,9.60,0 +-91.20,33.60,12.41,0.00,1.00,81.60,-9.60,0 +-86.40,33.60,12.43,0.00,1.00,76.80,9.60,0 +-81.60,33.60,12.45,0.00,1.00,67.20,-9.60,0 +-72.00,33.60,12.48,0.00,1.00,57.60,9.60,0 +-67.20,33.60,12.50,0.00,1.00,52.80,-9.60,0 +-62.40,28.80,12.52,0.00,1.00,48.00,9.60,0 +-57.60,28.80,12.54,0.00,1.00,38.40,-9.60,0 +-52.80,28.80,12.56,0.00,1.00,33.60,9.60,0 +-48.00,24.00,12.58,0.00,1.00,28.80,-9.60,0 +-43.20,24.00,12.60,0.00,1.00,28.80,9.60,0 +-38.40,24.00,12.62,0.00,1.00,24.00,-9.60,0 +-33.60,19.20,12.65,0.00,1.00,19.20,4.80,0 +-28.80,19.20,12.67,0.00,1.00,14.40,-4.80,0 +-24.00,14.40,12.69,0.00,1.00,14.40,4.80,0 +-19.20,14.40,12.71,0.00,1.00,9.60,-4.80,0 +-14.40,9.60,12.73,0.00,1.00,9.60,4.80,0 +-14.40,9.60,12.75,0.00,1.00,4.80,-4.80,0 +-9.60,4.80,12.77,0.00,1.00,4.80,0.00,0 +-4.80,4.80,12.80,0.00,1.00,0.00,-0.00,0 +0.00,0.00,12.82,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,12.84,0.00,1.00,-4.80,-0.00,0 +9.60,-4.80,12.86,0.00,1.00,-9.60,0.00,0 +9.60,-9.60,12.88,0.00,1.00,-9.60,-0.00,0 +14.40,-9.60,12.90,0.00,1.00,-14.40,0.00,0 +19.20,-14.40,12.92,0.00,1.00,-19.20,-4.80,0 +24.00,-19.20,12.95,0.00,1.00,-24.00,4.80,0 +28.80,-19.20,12.97,0.00,1.00,-24.00,-4.80,0 +33.60,-24.00,12.99,0.00,1.00,-28.80,4.80,0 +38.40,-24.00,13.01,0.00,1.00,-33.60,-4.80,0 +43.20,-28.80,13.03,0.00,1.00,-38.40,4.80,0 +48.00,-28.80,13.05,0.00,1.00,-43.20,-4.80,0 +52.80,-33.60,13.07,0.00,1.00,-48.00,4.80,0 +57.60,-33.60,13.09,0.00,1.00,-52.80,-4.80,0 +62.40,-33.60,13.12,0.00,1.00,-62.40,4.80,0 +67.20,-38.40,13.14,0.00,1.00,-67.20,-4.80,0 +72.00,-38.40,13.16,0.00,1.00,-76.80,4.80,0 +81.60,-38.40,13.18,0.00,1.00,-86.40,-4.80,0 +86.40,-38.40,13.20,0.00,1.00,-91.20,4.80,0 +91.20,-38.40,13.22,0.00,1.00,-100.80,-4.80,0 +96.00,-38.40,13.24,0.00,1.00,-105.60,4.80,0 +105.60,-38.40,13.27,0.00,1.00,-115.20,-4.80,0 +110.40,-38.40,13.29,0.00,1.00,-120.00,4.80,0 +115.20,-33.60,13.31,0.00,1.00,-129.60,-4.80,0 +120.00,-33.60,13.33,0.00,1.00,-134.40,4.80,0 +124.80,-33.60,13.35,0.00,1.00,-139.20,-4.80,0 +129.60,-28.80,13.37,0.00,1.00,-144.00,4.80,0 +134.40,-28.80,13.39,0.00,1.00,-148.80,-4.80,0 +139.20,-24.00,13.42,0.00,1.00,-153.60,4.80,0 +144.00,-24.00,13.44,0.00,1.00,-158.40,-4.80,0 +148.80,-19.20,13.46,0.00,1.00,-158.40,4.80,0 +153.60,-19.20,13.48,0.00,1.00,-163.20,-4.80,0 +158.40,-14.40,13.50,0.00,1.00,-168.00,4.80,0 +163.20,-14.40,13.52,0.00,1.00,-168.00,-4.80,0 +168.00,-9.60,13.54,0.00,1.00,-172.80,0.00,0 +172.80,-9.60,13.56,0.00,1.00,-177.60,-0.00,0 +172.80,-4.80,13.59,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,13.61,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,13.63,0.00,1.00,177.60,-0.00,0 +-172.80,4.80,13.65,0.00,1.00,172.80,0.00,0 +-172.80,9.60,13.67,0.00,1.00,168.00,-0.00,0 +-168.00,9.60,13.69,0.00,1.00,168.00,0.00,0 +-163.20,14.40,13.71,0.00,1.00,163.20,-4.80,0 +-158.40,14.40,13.74,0.00,1.00,158.40,4.80,0 +-153.60,19.20,13.76,0.00,1.00,158.40,-4.80,0 +-148.80,19.20,13.78,0.00,1.00,153.60,4.80,0 +-144.00,24.00,13.80,0.00,1.00,148.80,-4.80,0 +-139.20,24.00,13.82,0.00,1.00,144.00,4.80,0 +-134.40,28.80,13.84,0.00,1.00,139.20,-4.80,0 +-129.60,28.80,13.86,0.00,1.00,134.40,4.80,0 +-124.80,33.60,13.89,0.00,1.00,129.60,-4.80,0 +-120.00,33.60,13.91,0.00,1.00,120.00,4.80,0 +-115.20,33.60,13.93,0.00,1.00,115.20,-4.80,0 +-110.40,38.40,13.95,0.00,1.00,105.60,4.80,0 +-105.60,38.40,13.97,0.00,1.00,100.80,-4.80,0 +-96.00,38.40,13.99,0.00,1.00,91.20,4.80,0 +-91.20,38.40,14.01,0.00,1.00,86.40,-4.80,0 +-86.40,38.40,14.03,0.00,1.00,76.80,4.80,0 +-81.60,38.40,14.06,0.00,1.00,67.20,-4.80,0 +-72.00,38.40,14.08,0.00,1.00,62.40,4.80,0 +-67.20,38.40,14.10,0.00,1.00,52.80,-4.80,0 +-62.40,33.60,14.12,0.00,1.00,48.00,4.80,0 +-57.60,33.60,14.14,0.00,1.00,43.20,-4.80,0 +-52.80,33.60,14.16,0.00,1.00,38.40,4.80,0 +-48.00,28.80,14.18,0.00,1.00,33.60,-4.80,0 +-43.20,28.80,14.21,0.00,1.00,28.80,4.80,0 +-38.40,24.00,14.23,0.00,1.00,24.00,-4.80,0 +-33.60,24.00,14.25,0.00,1.00,24.00,4.80,0 +-28.80,19.20,14.27,0.00,1.00,19.20,-4.80,0 +-24.00,19.20,14.29,0.00,1.00,14.40,4.80,0 +-19.20,14.40,14.31,0.00,1.00,9.60,-4.80,0 +-14.40,9.60,14.33,0.00,1.00,9.60,0.00,0 +-9.60,9.60,14.36,0.00,1.00,4.80,-0.00,0 +-9.60,4.80,14.38,0.00,1.00,4.80,0.00,0 +-4.80,4.80,14.40,0.00,1.00,0.00,-0.00,0 +0.00,0.00,14.42,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,14.44,0.00,1.00,-4.80,-0.00,0 +4.80,-4.80,14.46,0.00,1.00,-9.60,0.00,0 +9.60,-9.60,14.48,0.00,1.00,-14.40,-0.00,0 +14.40,-14.40,14.50,0.00,1.00,-14.40,0.00,0 +19.20,-14.40,14.53,0.00,1.00,-19.20,-0.00,0 +24.00,-19.20,14.55,0.00,1.00,-24.00,0.00,0 +24.00,-24.00,14.57,0.00,1.00,-28.80,-0.00,0 +28.80,-24.00,14.59,0.00,1.00,-33.60,0.00,0 +33.60,-28.80,14.61,0.00,1.00,-38.40,-0.00,0 +38.40,-28.80,14.63,0.00,1.00,-43.20,0.00,0 +43.20,-33.60,14.65,0.00,1.00,-48.00,-0.00,0 +48.00,-33.60,14.68,0.00,1.00,-52.80,0.00,0 +52.80,-38.40,14.70,0.00,1.00,-57.60,-0.00,0 +62.40,-38.40,14.72,0.00,1.00,-62.40,0.00,0 +67.20,-38.40,14.74,0.00,1.00,-72.00,-0.00,0 +72.00,-43.20,14.76,0.00,1.00,-76.80,0.00,0 +76.80,-43.20,14.78,0.00,1.00,-86.40,-0.00,0 +86.40,-43.20,14.80,0.00,1.00,-91.20,0.00,0 +91.20,-43.20,14.83,0.00,1.00,-100.80,-0.00,0 +96.00,-43.20,14.85,0.00,1.00,-105.60,0.00,0 +105.60,-43.20,14.87,0.00,1.00,-110.40,-0.00,0 +110.40,-43.20,14.89,0.00,1.00,-120.00,0.00,0 +115.20,-38.40,14.91,0.00,1.00,-124.80,-0.00,0 +124.80,-38.40,14.93,0.00,1.00,-129.60,0.00,0 +129.60,-38.40,14.95,0.00,1.00,-134.40,-0.00,0 +134.40,-33.60,14.97,0.00,1.00,-139.20,0.00,0 +139.20,-33.60,15.00,0.00,1.00,-144.00,-0.00,0 +144.00,-28.80,15.02,0.00,1.00,-148.80,0.00,0 +148.80,-28.80,15.04,0.00,1.00,-153.60,-0.00,0 +153.60,-24.00,15.06,0.00,1.00,-158.40,0.00,0 +158.40,-19.20,15.08,0.00,1.00,-163.20,-0.00,0 +158.40,-19.20,15.10,0.00,1.00,-163.20,0.00,0 +163.20,-14.40,15.12,0.00,1.00,-168.00,-0.00,0 +168.00,-9.60,15.15,0.00,1.00,-172.80,0.00,0 +172.80,-9.60,15.17,0.00,1.00,-172.80,-0.00,0 +172.80,-4.80,15.19,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,15.21,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,15.23,0.00,1.00,172.80,-0.00,0 +-172.80,4.80,15.25,0.00,1.00,172.80,0.00,0 +-172.80,9.60,15.27,0.00,1.00,168.00,-0.00,0 +-168.00,9.60,15.30,0.00,1.00,163.20,0.00,0 +-163.20,14.40,15.32,0.00,1.00,163.20,-0.00,0 +-158.40,19.20,15.34,0.00,1.00,158.40,0.00,0 +-158.40,19.20,15.36,0.00,1.00,153.60,-0.00,0 +-153.60,24.00,15.38,0.00,1.00,148.80,0.00,0 +-148.80,28.80,15.40,0.00,1.00,144.00,-0.00,0 +-144.00,28.80,15.42,0.00,1.00,139.20,0.00,0 +-139.20,33.60,15.44,0.00,1.00,134.40,-0.00,0 +-134.40,33.60,15.47,0.00,1.00,129.60,0.00,0 +-129.60,38.40,15.49,0.00,1.00,124.80,-0.00,0 +-124.80,38.40,15.51,0.00,1.00,120.00,0.00,0 +-115.20,38.40,15.53,0.00,1.00,110.40,-0.00,0 +-110.40,43.20,15.55,0.00,1.00,105.60,0.00,0 +-105.60,43.20,15.57,0.00,1.00,100.80,-0.00,0 +-96.00,43.20,15.59,0.00,1.00,91.20,0.00,0 +-91.20,43.20,15.62,0.00,1.00,86.40,-0.00,0 +-86.40,43.20,15.64,0.00,1.00,76.80,0.00,0 +-76.80,43.20,15.66,0.00,1.00,72.00,-0.00,0 +-72.00,43.20,15.68,0.00,1.00,62.40,0.00,0 +-67.20,38.40,15.70,0.00,1.00,57.60,-0.00,0 +-62.40,38.40,15.72,0.00,1.00,52.80,0.00,0 +-52.80,38.40,15.74,0.00,1.00,48.00,-0.00,0 +-48.00,33.60,15.77,0.00,1.00,43.20,0.00,0 +-43.20,33.60,15.79,0.00,1.00,38.40,-0.00,0 +-38.40,28.80,15.81,0.00,1.00,33.60,0.00,0 +-33.60,28.80,15.83,0.00,1.00,28.80,-0.00,0 +-28.80,24.00,15.85,0.00,1.00,24.00,0.00,0 +-24.00,24.00,15.87,0.00,1.00,19.20,-0.00,0 +-24.00,19.20,15.89,0.00,1.00,14.40,0.00,0 +-19.20,14.40,15.91,0.00,1.00,14.40,-0.00,0 +-14.40,14.40,15.94,0.00,1.00,9.60,0.00,0 +-9.60,9.60,15.96,0.00,1.00,4.80,-0.00,0 +-4.80,4.80,15.98,0.00,1.00,4.80,0.00,0 +-4.80,4.80,16.00,0.00,1.00,0.00,-0.00,0 +0.00,0.00,16.00,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,15.98,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,15.96,0.00,1.00,-9.60,-0.00,0 +9.60,-9.60,15.94,0.00,1.00,-14.40,0.00,0 +14.40,-14.40,15.91,0.00,1.00,-19.20,-0.00,0 +14.40,-19.20,15.89,0.00,1.00,-24.00,0.00,0 +19.20,-19.20,15.87,0.00,1.00,-24.00,-0.00,0 +24.00,-24.00,15.85,0.00,1.00,-28.80,0.00,0 +28.80,-28.80,15.83,0.00,1.00,-33.60,-0.00,0 +33.60,-28.80,15.81,0.00,1.00,-38.40,0.00,0 +38.40,-33.60,15.79,0.00,1.00,-43.20,-0.00,0 +43.20,-38.40,15.77,0.00,1.00,-48.00,0.00,0 +48.00,-38.40,15.74,0.00,1.00,-52.80,-4.80,0 +52.80,-43.20,15.72,0.00,1.00,-62.40,4.80,0 +57.60,-43.20,15.70,0.00,1.00,-67.20,-4.80,0 +62.40,-43.20,15.68,0.00,1.00,-72.00,4.80,0 +72.00,-48.00,15.66,0.00,1.00,-76.80,-4.80,0 +76.80,-48.00,15.64,0.00,1.00,-86.40,4.80,0 +86.40,-48.00,15.62,0.00,1.00,-91.20,-4.80,0 +91.20,-48.00,15.59,0.00,1.00,-96.00,4.80,0 +100.80,-48.00,15.57,0.00,1.00,-105.60,-4.80,0 +105.60,-48.00,15.55,0.00,1.00,-110.40,4.80,0 +110.40,-48.00,15.53,0.00,1.00,-115.20,-4.80,0 +120.00,-43.20,15.51,0.00,1.00,-124.80,4.80,0 +124.80,-43.20,15.49,0.00,1.00,-129.60,-4.80,0 +129.60,-38.40,15.47,0.00,1.00,-134.40,4.80,0 +134.40,-38.40,15.44,0.00,1.00,-139.20,-4.80,0 +139.20,-33.60,15.42,0.00,1.00,-144.00,0.00,0 +144.00,-33.60,15.40,0.00,1.00,-148.80,-0.00,0 +148.80,-28.80,15.38,0.00,1.00,-153.60,0.00,0 +153.60,-24.00,15.36,0.00,1.00,-158.40,-0.00,0 +158.40,-24.00,15.34,0.00,1.00,-158.40,0.00,0 +163.20,-19.20,15.32,0.00,1.00,-163.20,-0.00,0 +163.20,-14.40,15.30,0.00,1.00,-168.00,0.00,0 +168.00,-14.40,15.27,0.00,1.00,-172.80,-0.00,0 +172.80,-9.60,15.25,0.00,1.00,-172.80,0.00,0 +172.80,-4.80,15.23,0.00,1.00,-177.60,-0.00,0 +177.60,-0.00,15.21,0.00,1.00,177.60,0.00,0 +-177.60,0.00,15.19,0.00,1.00,172.80,0.00,0 +-172.80,4.80,15.17,0.00,1.00,172.80,-0.00,0 +-172.80,9.60,15.15,0.00,1.00,168.00,0.00,0 +-168.00,14.40,15.12,0.00,1.00,163.20,-0.00,0 +-163.20,14.40,15.10,0.00,1.00,158.40,0.00,0 +-163.20,19.20,15.08,0.00,1.00,158.40,-0.00,0 +-158.40,24.00,15.06,0.00,1.00,153.60,0.00,0 +-153.60,24.00,15.04,0.00,1.00,148.80,-0.00,0 +-148.80,28.80,15.02,0.00,1.00,144.00,0.00,0 +-144.00,33.60,15.00,0.00,1.00,139.20,-0.00,0 +-139.20,33.60,14.97,0.00,1.00,134.40,0.00,0 +-134.40,38.40,14.95,0.00,1.00,129.60,-4.80,0 +-129.60,38.40,14.93,0.00,1.00,124.80,4.80,0 +-124.80,43.20,14.91,0.00,1.00,115.20,-4.80,0 +-120.00,43.20,14.89,0.00,1.00,110.40,4.80,0 +-110.40,48.00,14.87,0.00,1.00,105.60,-4.80,0 +-105.60,48.00,14.85,0.00,1.00,96.00,4.80,0 +-100.80,48.00,14.83,0.00,1.00,91.20,-4.80,0 +-91.20,48.00,14.80,0.00,1.00,86.40,4.80,0 +-86.40,48.00,14.78,0.00,1.00,76.80,-4.80,0 +-76.80,48.00,14.76,0.00,1.00,72.00,4.80,0 +-72.00,48.00,14.74,0.00,1.00,67.20,-4.80,0 +-62.40,43.20,14.72,0.00,1.00,62.40,4.80,0 +-57.60,43.20,14.70,0.00,1.00,52.80,-4.80,0 +-52.80,43.20,14.68,0.00,1.00,48.00,4.80,0 +-48.00,38.40,14.65,0.00,1.00,43.20,-4.80,0 +-43.20,38.40,14.63,0.00,1.00,38.40,0.00,0 +-38.40,33.60,14.61,0.00,1.00,33.60,-0.00,0 +-33.60,28.80,14.59,0.00,1.00,28.80,0.00,0 +-28.80,28.80,14.57,0.00,1.00,24.00,-0.00,0 +-24.00,24.00,14.55,0.00,1.00,24.00,0.00,0 +-19.20,19.20,14.53,0.00,1.00,19.20,-0.00,0 +-14.40,19.20,14.50,0.00,1.00,14.40,0.00,0 +-14.40,14.40,14.48,0.00,1.00,9.60,-0.00,0 +-9.60,9.60,14.46,0.00,1.00,4.80,0.00,0 +-4.80,4.80,14.44,0.00,1.00,4.80,-0.00,0 +-4.80,4.80,14.42,0.00,1.00,0.00,0.00,0 +0.00,0.00,14.40,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,14.38,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,14.36,0.00,1.00,-9.60,-0.00,0 +9.60,-9.60,14.33,0.00,1.00,-14.40,0.00,0 +9.60,-14.40,14.31,0.00,1.00,-19.20,-4.80,0 +14.40,-19.20,14.29,0.00,1.00,-24.00,4.80,0 +19.20,-24.00,14.27,0.00,1.00,-28.80,-4.80,0 +24.00,-24.00,14.25,0.00,1.00,-33.60,4.80,0 +24.00,-28.80,14.23,0.00,1.00,-38.40,-4.80,0 +28.80,-33.60,14.21,0.00,1.00,-43.20,4.80,0 +33.60,-38.40,14.18,0.00,1.00,-48.00,-4.80,0 +38.40,-38.40,14.16,0.00,1.00,-52.80,4.80,0 +43.20,-43.20,14.14,0.00,1.00,-57.60,-4.80,0 +48.00,-43.20,14.12,0.00,1.00,-62.40,4.80,0 +52.80,-48.00,14.10,0.00,1.00,-67.20,-4.80,0 +62.40,-48.00,14.08,0.00,1.00,-72.00,9.60,0 +67.20,-52.80,14.06,0.00,1.00,-81.60,-9.60,0 +76.80,-52.80,14.03,0.00,1.00,-86.40,9.60,0 +86.40,-52.80,14.01,0.00,1.00,-91.20,-9.60,0 +91.20,-52.80,13.99,0.00,1.00,-96.00,9.60,0 +100.80,-52.80,13.97,0.00,1.00,-105.60,-9.60,0 +105.60,-52.80,13.95,0.00,1.00,-110.40,9.60,0 +115.20,-48.00,13.93,0.00,1.00,-115.20,-9.60,0 +120.00,-48.00,13.91,0.00,1.00,-120.00,9.60,0 +129.60,-48.00,13.89,0.00,1.00,-124.80,-4.80,0 +134.40,-43.20,13.86,0.00,1.00,-129.60,4.80,0 +139.20,-43.20,13.84,0.00,1.00,-134.40,-4.80,0 +144.00,-38.40,13.82,0.00,1.00,-139.20,4.80,0 +148.80,-33.60,13.80,0.00,1.00,-144.00,-4.80,0 +153.60,-33.60,13.78,0.00,1.00,-148.80,4.80,0 +158.40,-28.80,13.76,0.00,1.00,-153.60,-4.80,0 +158.40,-24.00,13.74,0.00,1.00,-158.40,4.80,0 +163.20,-19.20,13.71,0.00,1.00,-163.20,-4.80,0 +168.00,-19.20,13.69,0.00,1.00,-168.00,4.80,0 +168.00,-14.40,13.67,0.00,1.00,-172.80,-0.00,0 +172.80,-9.60,13.65,0.00,1.00,-172.80,0.00,0 +177.60,-4.80,13.63,0.00,1.00,-177.60,-0.00,0 +177.60,-0.00,13.61,0.00,1.00,177.60,0.00,0 +-177.60,0.00,13.59,0.00,1.00,172.80,0.00,0 +-177.60,4.80,13.56,0.00,1.00,172.80,-0.00,0 +-172.80,9.60,13.54,0.00,1.00,168.00,0.00,0 +-168.00,14.40,13.52,0.00,1.00,163.20,-0.00,0 +-168.00,19.20,13.50,0.00,1.00,158.40,4.80,0 +-163.20,19.20,13.48,0.00,1.00,153.60,-4.80,0 +-158.40,24.00,13.46,0.00,1.00,148.80,4.80,0 +-158.40,28.80,13.44,0.00,1.00,144.00,-4.80,0 +-153.60,33.60,13.42,0.00,1.00,139.20,4.80,0 +-148.80,33.60,13.39,0.00,1.00,134.40,-4.80,0 +-144.00,38.40,13.37,0.00,1.00,129.60,4.80,0 +-139.20,43.20,13.35,0.00,1.00,124.80,-4.80,0 +-134.40,43.20,13.33,0.00,1.00,120.00,4.80,0 +-129.60,48.00,13.31,0.00,1.00,115.20,-4.80,0 +-120.00,48.00,13.29,0.00,1.00,110.40,9.60,0 +-115.20,48.00,13.27,0.00,1.00,105.60,-9.60,0 +-105.60,52.80,13.24,0.00,1.00,96.00,9.60,0 +-100.80,52.80,13.22,0.00,1.00,91.20,-9.60,0 +-91.20,52.80,13.20,0.00,1.00,86.40,9.60,0 +-86.40,52.80,13.18,0.00,1.00,81.60,-9.60,0 +-76.80,52.80,13.16,0.00,1.00,72.00,9.60,0 +-67.20,52.80,13.14,0.00,1.00,67.20,-9.60,0 +-62.40,48.00,13.12,0.00,1.00,62.40,9.60,0 +-52.80,48.00,13.09,0.00,1.00,57.60,-4.80,0 +-48.00,43.20,13.07,0.00,1.00,52.80,4.80,0 +-43.20,43.20,13.05,0.00,1.00,48.00,-4.80,0 +-38.40,38.40,13.03,0.00,1.00,43.20,4.80,0 +-33.60,38.40,13.01,0.00,1.00,38.40,-4.80,0 +-28.80,33.60,12.99,0.00,1.00,33.60,4.80,0 +-24.00,28.80,12.97,0.00,1.00,28.80,-4.80,0 +-24.00,24.00,12.95,0.00,1.00,24.00,4.80,0 +-19.20,24.00,12.92,0.00,1.00,19.20,-4.80,0 +-14.40,19.20,12.90,0.00,1.00,14.40,4.80,0 +-9.60,14.40,12.88,0.00,1.00,9.60,-4.80,0 +-9.60,9.60,12.86,0.00,1.00,9.60,0.00,0 +-4.80,9.60,12.84,0.00,1.00,4.80,-0.00,0 +-4.80,4.80,12.82,0.00,1.00,0.00,0.00,0 +0.00,0.00,12.80,0.00,1.00,-4.80,0.00,0 +4.80,-4.80,12.77,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,12.75,0.00,1.00,-14.40,-0.00,0 +9.60,-14.40,12.73,0.00,1.00,-14.40,4.80,0 +9.60,-14.40,12.71,0.00,1.00,-19.20,-4.80,0 +14.40,-19.20,12.69,0.00,1.00,-24.00,4.80,0 +14.40,-24.00,12.67,0.00,1.00,-28.80,-4.80,0 +19.20,-28.80,12.65,0.00,1.00,-33.60,4.80,0 +24.00,-33.60,12.62,0.00,1.00,-38.40,-9.60,0 +28.80,-33.60,12.60,0.00,1.00,-43.20,9.60,0 +28.80,-38.40,12.58,0.00,1.00,-48.00,-9.60,0 +33.60,-43.20,12.56,0.00,1.00,-52.80,9.60,0 +38.40,-43.20,12.54,0.00,1.00,-57.60,-9.60,0 +48.00,-48.00,12.52,0.00,1.00,-62.40,9.60,0 +52.80,-52.80,12.50,0.00,1.00,-67.20,-9.60,0 +57.60,-52.80,12.48,0.00,1.00,-72.00,9.60,0 +67.20,-57.60,12.45,0.00,1.00,-81.60,-14.40,0 +76.80,-57.60,12.43,0.00,1.00,-86.40,14.40,0 +81.60,-57.60,12.41,0.00,1.00,-91.20,-14.40,0 +91.20,-57.60,12.39,0.00,1.00,-96.00,14.40,0 +100.80,-57.60,12.37,0.00,1.00,-100.80,-14.40,0 +110.40,-57.60,12.35,0.00,1.00,-110.40,14.40,0 +115.20,-52.80,12.33,0.00,1.00,-115.20,-14.40,0 +124.80,-52.80,12.30,0.00,1.00,-120.00,9.60,0 +129.60,-48.00,12.28,0.00,1.00,-124.80,-9.60,0 +139.20,-48.00,12.26,0.00,1.00,-129.60,9.60,0 +144.00,-43.20,12.24,0.00,1.00,-134.40,-9.60,0 +148.80,-38.40,12.22,0.00,1.00,-139.20,9.60,0 +153.60,-38.40,12.20,0.00,1.00,-144.00,-9.60,0 +153.60,-33.60,12.18,0.00,1.00,-148.80,9.60,0 +158.40,-28.80,12.15,0.00,1.00,-153.60,-9.60,0 +163.20,-24.00,12.13,0.00,1.00,-158.40,4.80,0 +163.20,-24.00,12.11,0.00,1.00,-163.20,-4.80,0 +168.00,-19.20,12.09,0.00,1.00,-168.00,4.80,0 +172.80,-14.40,12.07,0.00,1.00,-168.00,-4.80,0 +172.80,-9.60,12.05,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,12.03,0.00,1.00,-177.60,-0.00,0 +177.60,-0.00,12.01,0.00,1.00,177.60,0.00,0 +-177.60,0.00,11.98,0.00,1.00,172.80,0.00,0 +-177.60,4.80,11.96,0.00,1.00,168.00,-0.00,0 +-172.80,9.60,11.94,0.00,1.00,168.00,4.80,0 +-172.80,14.40,11.92,0.00,1.00,163.20,-4.80,0 +-168.00,19.20,11.90,0.00,1.00,158.40,4.80,0 +-163.20,24.00,11.88,0.00,1.00,153.60,-4.80,0 +-163.20,24.00,11.86,0.00,1.00,148.80,4.80,0 +-158.40,28.80,11.83,0.00,1.00,144.00,-9.60,0 +-153.60,33.60,11.81,0.00,1.00,139.20,9.60,0 +-153.60,38.40,11.79,0.00,1.00,134.40,-9.60,0 +-148.80,38.40,11.77,0.00,1.00,129.60,9.60,0 +-144.00,43.20,11.75,0.00,1.00,124.80,-9.60,0 +-139.20,48.00,11.73,0.00,1.00,120.00,9.60,0 +-129.60,48.00,11.71,0.00,1.00,115.20,-9.60,0 +-124.80,52.80,11.68,0.00,1.00,110.40,9.60,0 +-115.20,52.80,11.66,0.00,1.00,100.80,-14.40,0 +-110.40,57.60,11.64,0.00,1.00,96.00,14.40,0 +-100.80,57.60,11.62,0.00,1.00,91.20,-14.40,0 +-91.20,57.60,11.60,0.00,1.00,86.40,14.40,0 +-81.60,57.60,11.58,0.00,1.00,81.60,-14.40,0 +-76.80,57.60,11.56,0.00,1.00,72.00,14.40,0 +-67.20,57.60,11.54,0.00,1.00,67.20,-14.40,0 +-57.60,52.80,11.51,0.00,1.00,62.40,9.60,0 +-52.80,52.80,11.49,0.00,1.00,57.60,-9.60,0 +-48.00,48.00,11.47,0.00,1.00,52.80,9.60,0 +-38.40,43.20,11.45,0.00,1.00,48.00,-9.60,0 +-33.60,43.20,11.43,0.00,1.00,43.20,9.60,0 +-28.80,38.40,11.41,0.00,1.00,38.40,-9.60,0 +-28.80,33.60,11.39,0.00,1.00,33.60,9.60,0 +-24.00,33.60,11.36,0.00,1.00,28.80,-9.60,0 +-19.20,28.80,11.34,0.00,1.00,24.00,4.80,0 +-14.40,24.00,11.32,0.00,1.00,19.20,-4.80,0 +-14.40,19.20,11.30,0.00,1.00,14.40,4.80,0 +-9.60,14.40,11.28,0.00,1.00,14.40,-4.80,0 +-9.60,14.40,11.26,0.00,1.00,9.60,4.80,0 +-4.80,9.60,11.24,0.00,1.00,4.80,-0.00,0 +-4.80,4.80,11.21,0.00,1.00,0.00,0.00,0 +0.00,0.00,11.19,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,11.17,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,11.15,0.00,1.00,-14.40,-4.80,0 +4.80,-14.40,11.13,0.00,1.00,-19.20,4.80,0 +9.60,-19.20,11.11,0.00,1.00,-19.20,-4.80,0 +9.60,-19.20,11.09,0.00,1.00,-24.00,4.80,0 +14.40,-24.00,11.07,0.00,1.00,-28.80,-9.60,0 +19.20,-28.80,11.04,0.00,1.00,-33.60,9.60,0 +19.20,-33.60,11.02,0.00,1.00,-38.40,-9.60,0 +24.00,-38.40,11.00,0.00,1.00,-43.20,9.60,0 +28.80,-43.20,10.98,0.00,1.00,-48.00,-14.40,0 +33.60,-43.20,10.96,0.00,1.00,-52.80,14.40,0 +38.40,-48.00,10.94,0.00,1.00,-57.60,-14.40,0 +43.20,-52.80,10.92,0.00,1.00,-62.40,14.40,0 +48.00,-52.80,10.89,0.00,1.00,-72.00,-14.40,0 +52.80,-57.60,10.87,0.00,1.00,-76.80,14.40,0 +62.40,-57.60,10.85,0.00,1.00,-81.60,-19.20,0 +72.00,-62.40,10.83,0.00,1.00,-86.40,19.20,0 +81.60,-62.40,10.81,0.00,1.00,-91.20,-19.20,0 +91.20,-62.40,10.79,0.00,1.00,-96.00,19.20,0 +100.80,-62.40,10.77,0.00,1.00,-100.80,-19.20,0 +110.40,-62.40,10.74,0.00,1.00,-105.60,19.20,0 +120.00,-57.60,10.72,0.00,1.00,-115.20,-14.40,0 +129.60,-57.60,10.70,0.00,1.00,-120.00,14.40,0 +134.40,-52.80,10.68,0.00,1.00,-124.80,-14.40,0 +139.20,-48.00,10.66,0.00,1.00,-129.60,14.40,0 +144.00,-48.00,10.64,0.00,1.00,-134.40,-14.40,0 +148.80,-43.20,10.62,0.00,1.00,-139.20,14.40,0 +153.60,-38.40,10.60,0.00,1.00,-144.00,-14.40,0 +158.40,-33.60,10.57,0.00,1.00,-148.80,9.60,0 +163.20,-33.60,10.55,0.00,1.00,-153.60,-9.60,0 +163.20,-28.80,10.53,0.00,1.00,-158.40,9.60,0 +168.00,-24.00,10.51,0.00,1.00,-163.20,-9.60,0 +168.00,-19.20,10.49,0.00,1.00,-163.20,4.80,0 +172.80,-14.40,10.47,0.00,1.00,-168.00,-4.80,0 +172.80,-9.60,10.45,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,10.42,0.00,1.00,-177.60,-0.00,0 +177.60,-0.00,10.40,0.00,1.00,177.60,0.00,0 +-177.60,0.00,10.38,0.00,1.00,172.80,0.00,0 +-177.60,4.80,10.36,0.00,1.00,168.00,-0.00,0 +-172.80,9.60,10.34,0.00,1.00,163.20,4.80,0 +-172.80,14.40,10.32,0.00,1.00,163.20,-4.80,0 +-168.00,19.20,10.30,0.00,1.00,158.40,4.80,0 +-168.00,24.00,10.28,0.00,1.00,153.60,-9.60,0 +-163.20,28.80,10.25,0.00,1.00,148.80,9.60,0 +-163.20,33.60,10.23,0.00,1.00,144.00,-9.60,0 +-158.40,33.60,10.21,0.00,1.00,139.20,9.60,0 +-153.60,38.40,10.19,0.00,1.00,134.40,-14.40,0 +-148.80,43.20,10.17,0.00,1.00,129.60,14.40,0 +-144.00,48.00,10.15,0.00,1.00,124.80,-14.40,0 +-139.20,48.00,10.13,0.00,1.00,120.00,14.40,0 +-134.40,52.80,10.10,0.00,1.00,115.20,-14.40,0 +-129.60,57.60,10.08,0.00,1.00,105.60,14.40,0 +-120.00,57.60,10.06,0.00,1.00,100.80,-14.40,0 +-110.40,62.40,10.04,0.00,1.00,96.00,19.20,0 +-100.80,62.40,10.02,0.00,1.00,91.20,-19.20,0 +-91.20,62.40,10.00,0.00,1.00,86.40,19.20,0 +-81.60,62.40,9.98,0.00,1.00,81.60,-19.20,0 +-72.00,62.40,9.95,0.00,1.00,76.80,19.20,0 +-62.40,57.60,9.93,0.00,1.00,72.00,-19.20,0 +-52.80,57.60,9.91,0.00,1.00,62.40,14.40,0 +-48.00,52.80,9.89,0.00,1.00,57.60,-14.40,0 +-43.20,52.80,9.87,0.00,1.00,52.80,14.40,0 +-38.40,48.00,9.85,0.00,1.00,48.00,-14.40,0 +-33.60,43.20,9.83,0.00,1.00,43.20,14.40,0 +-28.80,43.20,9.81,0.00,1.00,38.40,-14.40,0 +-24.00,38.40,9.78,0.00,1.00,33.60,9.60,0 +-19.20,33.60,9.76,0.00,1.00,28.80,-9.60,0 +-19.20,28.80,9.74,0.00,1.00,24.00,9.60,0 +-14.40,24.00,9.72,0.00,1.00,19.20,-9.60,0 +-9.60,19.20,9.70,0.00,1.00,19.20,4.80,0 +-9.60,19.20,9.68,0.00,1.00,14.40,-4.80,0 +-4.80,14.40,9.66,0.00,1.00,9.60,4.80,0 +-4.80,9.60,9.63,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,9.61,0.00,1.00,0.00,0.00,0 +0.00,0.00,9.59,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,9.57,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,9.55,0.00,1.00,-14.40,-4.80,0 +4.80,-14.40,9.53,0.00,1.00,-19.20,4.80,0 +9.60,-19.20,9.51,0.00,1.00,-24.00,-4.80,0 +9.60,-24.00,9.48,0.00,1.00,-28.80,9.60,0 +14.40,-24.00,9.46,0.00,1.00,-33.60,-9.60,0 +14.40,-28.80,9.44,0.00,1.00,-33.60,14.40,0 +19.20,-33.60,9.42,0.00,1.00,-38.40,-14.40,0 +19.20,-38.40,9.40,0.00,1.00,-43.20,14.40,0 +24.00,-43.20,9.38,0.00,1.00,-48.00,-14.40,0 +28.80,-48.00,9.36,0.00,1.00,-57.60,19.20,0 +33.60,-52.80,9.34,0.00,1.00,-62.40,-19.20,0 +38.40,-52.80,9.31,0.00,1.00,-67.20,19.20,0 +43.20,-57.60,9.29,0.00,1.00,-72.00,-19.20,0 +48.00,-62.40,9.27,0.00,1.00,-76.80,19.20,0 +57.60,-62.40,9.25,0.00,1.00,-81.60,-19.20,0 +67.20,-67.20,9.23,0.00,1.00,-86.40,24.00,0 +81.60,-67.20,9.21,0.00,1.00,-91.20,-24.00,0 +91.20,-67.20,9.19,0.00,1.00,-96.00,24.00,0 +105.60,-67.20,9.16,0.00,1.00,-100.80,-24.00,0 +115.20,-67.20,9.14,0.00,1.00,-105.60,24.00,0 +124.80,-62.40,9.12,0.00,1.00,-110.40,-19.20,0 +134.40,-57.60,9.10,0.00,1.00,-115.20,19.20,0 +139.20,-57.60,9.08,0.00,1.00,-120.00,-19.20,0 +144.00,-52.80,9.06,0.00,1.00,-129.60,19.20,0 +148.80,-48.00,9.04,0.00,1.00,-134.40,-19.20,0 +153.60,-43.20,9.01,0.00,1.00,-139.20,19.20,0 +158.40,-43.20,8.99,0.00,1.00,-144.00,-14.40,0 +163.20,-38.40,8.97,0.00,1.00,-148.80,14.40,0 +163.20,-33.60,8.95,0.00,1.00,-148.80,-14.40,0 +168.00,-28.80,8.93,0.00,1.00,-153.60,9.60,0 +168.00,-24.00,8.91,0.00,1.00,-158.40,-9.60,0 +172.80,-19.20,8.89,0.00,1.00,-163.20,9.60,0 +172.80,-14.40,8.87,0.00,1.00,-168.00,-4.80,0 +177.60,-9.60,8.84,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,8.82,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,8.80,0.00,1.00,177.60,0.00,0 +-177.60,0.00,8.78,0.00,1.00,172.80,0.00,0 +-177.60,4.80,8.76,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,8.74,0.00,1.00,163.20,4.80,0 +-172.80,14.40,8.72,0.00,1.00,158.40,-4.80,0 +-172.80,19.20,8.69,0.00,1.00,153.60,9.60,0 +-168.00,24.00,8.67,0.00,1.00,148.80,-9.60,0 +-168.00,28.80,8.65,0.00,1.00,148.80,9.60,0 +-163.20,33.60,8.63,0.00,1.00,144.00,-14.40,0 +-163.20,38.40,8.61,0.00,1.00,139.20,14.40,0 +-158.40,43.20,8.59,0.00,1.00,134.40,-14.40,0 +-153.60,43.20,8.57,0.00,1.00,129.60,19.20,0 +-148.80,48.00,8.54,0.00,1.00,120.00,-19.20,0 +-144.00,52.80,8.52,0.00,1.00,115.20,19.20,0 +-139.20,57.60,8.50,0.00,1.00,110.40,-19.20,0 +-134.40,57.60,8.48,0.00,1.00,105.60,19.20,0 +-124.80,62.40,8.46,0.00,1.00,100.80,-19.20,0 +-115.20,67.20,8.44,0.00,1.00,96.00,24.00,0 +-105.60,67.20,8.42,0.00,1.00,91.20,-24.00,0 +-91.20,67.20,8.40,0.00,1.00,86.40,24.00,0 +-81.60,67.20,8.37,0.00,1.00,81.60,-24.00,0 +-67.20,67.20,8.35,0.00,1.00,76.80,24.00,0 +-57.60,62.40,8.33,0.00,1.00,72.00,-19.20,0 +-48.00,62.40,8.31,0.00,1.00,67.20,19.20,0 +-43.20,57.60,8.29,0.00,1.00,62.40,-19.20,0 +-38.40,52.80,8.27,0.00,1.00,57.60,19.20,0 +-33.60,52.80,8.25,0.00,1.00,48.00,-19.20,0 +-28.80,48.00,8.22,0.00,1.00,43.20,19.20,0 +-24.00,43.20,8.20,0.00,1.00,38.40,-14.40,0 +-19.20,38.40,8.18,0.00,1.00,33.60,14.40,0 +-19.20,33.60,8.16,0.00,1.00,33.60,-14.40,0 +-14.40,28.80,8.14,0.00,1.00,28.80,14.40,0 +-14.40,24.00,8.12,0.00,1.00,24.00,-9.60,0 +-9.60,24.00,8.10,0.00,1.00,19.20,9.60,0 +-9.60,19.20,8.07,0.00,1.00,14.40,-4.80,0 +-4.80,14.40,8.05,0.00,1.00,9.60,4.80,0 +-4.80,9.60,8.03,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,8.01,0.00,1.00,0.00,0.00,0 +0.00,0.00,7.99,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,7.97,0.00,1.00,-9.60,0.00,0 +4.80,-9.60,7.95,0.00,1.00,-14.40,-4.80,0 +4.80,-14.40,7.93,0.00,1.00,-19.20,4.80,0 +4.80,-19.20,7.90,0.00,1.00,-24.00,-9.60,0 +9.60,-24.00,7.88,0.00,1.00,-28.80,9.60,0 +9.60,-28.80,7.86,0.00,1.00,-33.60,-14.40,0 +9.60,-33.60,7.84,0.00,1.00,-38.40,14.40,0 +14.40,-38.40,7.82,0.00,1.00,-43.20,-14.40,0 +14.40,-38.40,7.80,0.00,1.00,-48.00,19.20,0 +19.20,-43.20,7.78,0.00,1.00,-52.80,-19.20,0 +24.00,-48.00,7.75,0.00,1.00,-57.60,19.20,0 +24.00,-52.80,7.73,0.00,1.00,-62.40,-24.00,0 +28.80,-57.60,7.71,0.00,1.00,-67.20,24.00,0 +38.40,-62.40,7.69,0.00,1.00,-72.00,-24.00,0 +43.20,-62.40,7.67,0.00,1.00,-76.80,24.00,0 +52.80,-67.20,7.65,0.00,1.00,-81.60,-24.00,0 +62.40,-72.00,7.63,0.00,1.00,-86.40,28.80,0 +76.80,-72.00,7.60,0.00,1.00,-91.20,-28.80,0 +96.00,-72.00,7.58,0.00,1.00,-96.00,28.80,0 +110.40,-72.00,7.56,0.00,1.00,-100.80,-28.80,0 +120.00,-67.20,7.54,0.00,1.00,-105.60,28.80,0 +134.40,-67.20,7.52,0.00,1.00,-110.40,-24.00,0 +139.20,-62.40,7.50,0.00,1.00,-115.20,24.00,0 +148.80,-57.60,7.48,0.00,1.00,-120.00,-24.00,0 +153.60,-57.60,7.46,0.00,1.00,-124.80,24.00,0 +158.40,-52.80,7.43,0.00,1.00,-129.60,-24.00,0 +158.40,-48.00,7.41,0.00,1.00,-134.40,19.20,0 +163.20,-43.20,7.39,0.00,1.00,-139.20,-19.20,0 +163.20,-38.40,7.37,0.00,1.00,-144.00,19.20,0 +168.00,-33.60,7.35,0.00,1.00,-148.80,-14.40,0 +168.00,-28.80,7.33,0.00,1.00,-153.60,14.40,0 +172.80,-24.00,7.31,0.00,1.00,-158.40,-9.60,0 +172.80,-19.20,7.28,0.00,1.00,-163.20,9.60,0 +172.80,-14.40,7.26,0.00,1.00,-168.00,-9.60,0 +177.60,-9.60,7.24,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,7.22,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,7.20,0.00,1.00,177.60,0.00,0 +-177.60,0.00,7.18,0.00,1.00,172.80,0.00,0 +-177.60,4.80,7.16,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,7.13,0.00,1.00,163.20,4.80,0 +-172.80,14.40,7.11,0.00,1.00,158.40,-9.60,0 +-172.80,19.20,7.09,0.00,1.00,153.60,9.60,0 +-172.80,24.00,7.07,0.00,1.00,148.80,-9.60,0 +-168.00,28.80,7.05,0.00,1.00,144.00,14.40,0 +-168.00,33.60,7.03,0.00,1.00,139.20,-14.40,0 +-163.20,38.40,7.01,0.00,1.00,134.40,19.20,0 +-163.20,43.20,6.99,0.00,1.00,129.60,-19.20,0 +-158.40,48.00,6.96,0.00,1.00,124.80,19.20,0 +-158.40,52.80,6.94,0.00,1.00,120.00,-24.00,0 +-153.60,57.60,6.92,0.00,1.00,115.20,24.00,0 +-148.80,57.60,6.90,0.00,1.00,110.40,-24.00,0 +-139.20,62.40,6.88,0.00,1.00,105.60,24.00,0 +-134.40,67.20,6.86,0.00,1.00,100.80,-24.00,0 +-120.00,67.20,6.84,0.00,1.00,96.00,28.80,0 +-110.40,72.00,6.81,0.00,1.00,91.20,-28.80,0 +-96.00,72.00,6.79,0.00,1.00,86.40,28.80,0 +-76.80,72.00,6.77,0.00,1.00,81.60,-28.80,0 +-62.40,72.00,6.75,0.00,1.00,76.80,28.80,0 +-52.80,67.20,6.73,0.00,1.00,72.00,-24.00,0 +-43.20,62.40,6.71,0.00,1.00,67.20,24.00,0 +-38.40,62.40,6.69,0.00,1.00,62.40,-24.00,0 +-28.80,57.60,6.66,0.00,1.00,57.60,24.00,0 +-24.00,52.80,6.64,0.00,1.00,52.80,-24.00,0 +-24.00,48.00,6.62,0.00,1.00,48.00,19.20,0 +-19.20,43.20,6.60,0.00,1.00,43.20,-19.20,0 +-14.40,38.40,6.58,0.00,1.00,38.40,19.20,0 +-14.40,38.40,6.56,0.00,1.00,33.60,-14.40,0 +-9.60,33.60,6.54,0.00,1.00,28.80,14.40,0 +-9.60,28.80,6.52,0.00,1.00,24.00,-14.40,0 +-9.60,24.00,6.49,0.00,1.00,19.20,9.60,0 +-4.80,19.20,6.47,0.00,1.00,14.40,-9.60,0 +-4.80,14.40,6.45,0.00,1.00,9.60,4.80,0 +-4.80,9.60,6.43,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,6.41,0.00,1.00,0.00,0.00,0 +0.00,0.00,6.39,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,6.37,0.00,1.00,-9.60,4.80,0 +0.00,-9.60,6.34,0.00,1.00,-14.40,-4.80,0 +4.80,-14.40,6.32,0.00,1.00,-19.20,9.60,0 +4.80,-19.20,6.30,0.00,1.00,-24.00,-9.60,0 +4.80,-24.00,6.28,0.00,1.00,-28.80,14.40,0 +4.80,-28.80,6.26,0.00,1.00,-33.60,-14.40,0 +9.60,-33.60,6.24,0.00,1.00,-38.40,19.20,0 +9.60,-38.40,6.22,0.00,1.00,-43.20,-19.20,0 +14.40,-43.20,6.19,0.00,1.00,-48.00,19.20,0 +14.40,-48.00,6.17,0.00,1.00,-52.80,-24.00,0 +14.40,-52.80,6.15,0.00,1.00,-57.60,24.00,0 +19.20,-57.60,6.13,0.00,1.00,-62.40,-28.80,0 +24.00,-57.60,6.11,0.00,1.00,-67.20,28.80,0 +28.80,-62.40,6.09,0.00,1.00,-72.00,-28.80,0 +33.60,-67.20,6.07,0.00,1.00,-76.80,28.80,0 +43.20,-72.00,6.05,0.00,1.00,-81.60,-28.80,0 +57.60,-72.00,6.02,0.00,1.00,-86.40,33.60,0 +76.80,-76.80,6.00,0.00,1.00,-91.20,-33.60,0 +96.00,-76.80,5.98,0.00,1.00,-96.00,33.60,0 +115.20,-76.80,5.96,0.00,1.00,-100.80,-33.60,0 +129.60,-72.00,5.94,0.00,1.00,-105.60,28.80,0 +139.20,-72.00,5.92,0.00,1.00,-110.40,-28.80,0 +148.80,-67.20,5.90,0.00,1.00,-115.20,28.80,0 +153.60,-62.40,5.87,0.00,1.00,-120.00,-28.80,0 +158.40,-57.60,5.85,0.00,1.00,-124.80,28.80,0 +163.20,-52.80,5.83,0.00,1.00,-129.60,-24.00,0 +163.20,-48.00,5.81,0.00,1.00,-134.40,24.00,0 +168.00,-43.20,5.79,0.00,1.00,-139.20,-24.00,0 +168.00,-38.40,5.77,0.00,1.00,-144.00,19.20,0 +172.80,-33.60,5.75,0.00,1.00,-148.80,-19.20,0 +172.80,-28.80,5.72,0.00,1.00,-153.60,14.40,0 +172.80,-24.00,5.70,0.00,1.00,-158.40,-14.40,0 +172.80,-19.20,5.68,0.00,1.00,-163.20,9.60,0 +177.60,-14.40,5.66,0.00,1.00,-168.00,-9.60,0 +177.60,-9.60,5.64,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,5.62,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,5.60,0.00,1.00,177.60,0.00,0 +-177.60,0.00,5.58,0.00,1.00,172.80,0.00,0 +-177.60,4.80,5.55,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,5.53,0.00,1.00,163.20,4.80,0 +-177.60,14.40,5.51,0.00,1.00,158.40,-9.60,0 +-172.80,19.20,5.49,0.00,1.00,153.60,9.60,0 +-172.80,24.00,5.47,0.00,1.00,148.80,-14.40,0 +-172.80,28.80,5.45,0.00,1.00,144.00,14.40,0 +-172.80,33.60,5.43,0.00,1.00,139.20,-19.20,0 +-168.00,38.40,5.40,0.00,1.00,134.40,19.20,0 +-168.00,43.20,5.38,0.00,1.00,129.60,-24.00,0 +-163.20,48.00,5.36,0.00,1.00,124.80,24.00,0 +-163.20,52.80,5.34,0.00,1.00,120.00,-24.00,0 +-158.40,57.60,5.32,0.00,1.00,115.20,28.80,0 +-153.60,62.40,5.30,0.00,1.00,110.40,-28.80,0 +-148.80,67.20,5.28,0.00,1.00,105.60,28.80,0 +-139.20,72.00,5.26,0.00,1.00,100.80,-28.80,0 +-129.60,72.00,5.23,0.00,1.00,96.00,28.80,0 +-115.20,76.80,5.21,0.00,1.00,91.20,-33.60,0 +-96.00,76.80,5.19,0.00,1.00,86.40,33.60,0 +-76.80,76.80,5.17,0.00,1.00,81.60,-33.60,0 +-57.60,72.00,5.15,0.00,1.00,76.80,33.60,0 +-43.20,72.00,5.13,0.00,1.00,72.00,-28.80,0 +-33.60,67.20,5.11,0.00,1.00,67.20,28.80,0 +-28.80,62.40,5.08,0.00,1.00,62.40,-28.80,0 +-24.00,57.60,5.06,0.00,1.00,57.60,28.80,0 +-19.20,57.60,5.04,0.00,1.00,52.80,-28.80,0 +-14.40,52.80,5.02,0.00,1.00,48.00,24.00,0 +-14.40,48.00,5.00,0.00,1.00,43.20,-24.00,0 +-14.40,43.20,4.98,0.00,1.00,38.40,19.20,0 +-9.60,38.40,4.96,0.00,1.00,33.60,-19.20,0 +-9.60,33.60,4.93,0.00,1.00,28.80,19.20,0 +-4.80,28.80,4.91,0.00,1.00,24.00,-14.40,0 +-4.80,24.00,4.89,0.00,1.00,19.20,14.40,0 +-4.80,19.20,4.87,0.00,1.00,14.40,-9.60,0 +-4.80,14.40,4.85,0.00,1.00,9.60,9.60,0 +-0.00,9.60,4.83,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,4.81,0.00,1.00,0.00,4.80,0 +0.00,0.00,4.79,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,4.76,0.00,1.00,-9.60,4.80,0 +0.00,-9.60,4.74,0.00,1.00,-14.40,-4.80,0 +0.00,-14.40,4.72,0.00,1.00,-19.20,9.60,0 +4.80,-19.20,4.70,0.00,1.00,-24.00,-9.60,0 +4.80,-24.00,4.68,0.00,1.00,-28.80,14.40,0 +4.80,-28.80,4.66,0.00,1.00,-33.60,-14.40,0 +4.80,-33.60,4.64,0.00,1.00,-38.40,19.20,0 +4.80,-38.40,4.61,0.00,1.00,-43.20,-24.00,0 +9.60,-43.20,4.59,0.00,1.00,-48.00,24.00,0 +9.60,-48.00,4.57,0.00,1.00,-52.80,-24.00,0 +9.60,-52.80,4.55,0.00,1.00,-57.60,28.80,0 +14.40,-57.60,4.53,0.00,1.00,-62.40,-28.80,0 +14.40,-62.40,4.51,0.00,1.00,-67.20,33.60,0 +19.20,-67.20,4.49,0.00,1.00,-72.00,-33.60,0 +24.00,-72.00,4.46,0.00,1.00,-76.80,33.60,0 +33.60,-72.00,4.44,0.00,1.00,-81.60,-33.60,0 +43.20,-76.80,4.42,0.00,1.00,-86.40,38.40,0 +67.20,-81.60,4.40,0.00,1.00,-91.20,-38.40,0 +96.00,-81.60,4.38,0.00,1.00,-96.00,38.40,0 +124.80,-81.60,4.36,0.00,1.00,-100.80,-38.40,0 +144.00,-76.80,4.34,0.00,1.00,-105.60,33.60,0 +153.60,-72.00,4.32,0.00,1.00,-110.40,-33.60,0 +158.40,-67.20,4.29,0.00,1.00,-115.20,33.60,0 +163.20,-62.40,4.27,0.00,1.00,-120.00,-33.60,0 +168.00,-57.60,4.25,0.00,1.00,-124.80,28.80,0 +168.00,-52.80,4.23,0.00,1.00,-129.60,-28.80,0 +168.00,-48.00,4.21,0.00,1.00,-134.40,28.80,0 +172.80,-43.20,4.19,0.00,1.00,-139.20,-24.00,0 +172.80,-38.40,4.17,0.00,1.00,-144.00,24.00,0 +172.80,-33.60,4.14,0.00,1.00,-148.80,-19.20,0 +172.80,-28.80,4.12,0.00,1.00,-153.60,19.20,0 +177.60,-24.00,4.10,0.00,1.00,-158.40,-14.40,0 +177.60,-19.20,4.08,0.00,1.00,-163.20,14.40,0 +177.60,-14.40,4.06,0.00,1.00,-168.00,-9.60,0 +177.60,-9.60,4.04,0.00,1.00,-172.80,4.80,0 +177.60,-4.80,4.02,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,3.99,0.00,1.00,177.60,0.00,0 +-177.60,0.00,3.97,0.00,1.00,172.80,0.00,0 +-177.60,4.80,3.95,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,3.93,0.00,1.00,163.20,4.80,0 +-177.60,14.40,3.91,0.00,1.00,158.40,-9.60,0 +-177.60,19.20,3.89,0.00,1.00,153.60,14.40,0 +-177.60,24.00,3.87,0.00,1.00,148.80,-14.40,0 +-172.80,28.80,3.85,0.00,1.00,144.00,19.20,0 +-172.80,33.60,3.82,0.00,1.00,139.20,-19.20,0 +-172.80,38.40,3.80,0.00,1.00,134.40,24.00,0 +-172.80,43.20,3.78,0.00,1.00,129.60,-24.00,0 +-168.00,48.00,3.76,0.00,1.00,124.80,28.80,0 +-168.00,52.80,3.74,0.00,1.00,120.00,-28.80,0 +-168.00,57.60,3.72,0.00,1.00,115.20,28.80,0 +-163.20,62.40,3.70,0.00,1.00,110.40,-33.60,0 +-158.40,67.20,3.67,0.00,1.00,105.60,33.60,0 +-153.60,72.00,3.65,0.00,1.00,100.80,-33.60,0 +-144.00,76.80,3.63,0.00,1.00,96.00,33.60,0 +-124.80,81.60,3.61,0.00,1.00,91.20,-38.40,0 +-96.00,81.60,3.59,0.00,1.00,86.40,38.40,0 +-67.20,81.60,3.57,0.00,1.00,81.60,-38.40,0 +-43.20,76.80,3.55,0.00,1.00,76.80,38.40,0 +-33.60,72.00,3.52,0.00,1.00,72.00,-33.60,0 +-24.00,72.00,3.50,0.00,1.00,67.20,33.60,0 +-19.20,67.20,3.48,0.00,1.00,62.40,-33.60,0 +-14.40,62.40,3.46,0.00,1.00,57.60,33.60,0 +-14.40,57.60,3.44,0.00,1.00,52.80,-28.80,0 +-9.60,52.80,3.42,0.00,1.00,48.00,28.80,0 +-9.60,48.00,3.40,0.00,1.00,43.20,-24.00,0 +-9.60,43.20,3.38,0.00,1.00,38.40,24.00,0 +-4.80,38.40,3.35,0.00,1.00,33.60,-24.00,0 +-4.80,33.60,3.33,0.00,1.00,28.80,19.20,0 +-4.80,28.80,3.31,0.00,1.00,24.00,-14.40,0 +-4.80,24.00,3.29,0.00,1.00,19.20,14.40,0 +-4.80,19.20,3.27,0.00,1.00,14.40,-9.60,0 +-0.00,14.40,3.25,0.00,1.00,9.60,9.60,0 +-0.00,9.60,3.23,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,3.20,0.00,1.00,0.00,4.80,0 +0.00,0.00,3.18,0.00,1.00,-4.80,0.00,0 +0.00,-4.80,3.16,0.00,1.00,-9.60,4.80,0 +0.00,-9.60,3.14,0.00,1.00,-14.40,-4.80,0 +0.00,-14.40,3.12,0.00,1.00,-19.20,9.60,0 +0.00,-19.20,3.10,0.00,1.00,-24.00,-14.40,0 +0.00,-24.00,3.08,0.00,1.00,-28.80,14.40,0 +0.00,-28.80,3.05,0.00,1.00,-33.60,-19.20,0 +0.00,-33.60,3.03,0.00,1.00,-38.40,19.20,0 +4.80,-38.40,3.01,0.00,1.00,-43.20,-24.00,0 +4.80,-43.20,2.99,0.00,1.00,-48.00,28.80,0 +4.80,-48.00,2.97,0.00,1.00,-52.80,-28.80,0 +4.80,-52.80,2.95,0.00,1.00,-57.60,33.60,0 +4.80,-57.60,2.93,0.00,1.00,-62.40,-33.60,0 +4.80,-62.40,2.91,0.00,1.00,-67.20,33.60,0 +9.60,-67.20,2.88,0.00,1.00,-72.00,-38.40,0 +9.60,-72.00,2.86,0.00,1.00,-76.80,38.40,0 +14.40,-76.80,2.84,0.00,1.00,-81.60,-38.40,0 +24.00,-81.60,2.82,0.00,1.00,-86.40,43.20,0 +43.20,-86.40,2.80,0.00,1.00,-91.20,-43.20,0 +110.40,-86.40,2.78,0.00,1.00,-96.00,43.20,0 +148.80,-81.60,2.76,0.00,1.00,-100.80,-43.20,0 +163.20,-76.80,2.73,0.00,1.00,-105.60,38.40,0 +168.00,-72.00,2.71,0.00,1.00,-110.40,-38.40,0 +172.80,-67.20,2.69,0.00,1.00,-115.20,38.40,0 +172.80,-62.40,2.67,0.00,1.00,-120.00,-38.40,0 +172.80,-57.60,2.65,0.00,1.00,-124.80,33.60,0 +172.80,-52.80,2.63,0.00,1.00,-129.60,-33.60,0 +177.60,-48.00,2.61,0.00,1.00,-134.40,28.80,0 +177.60,-43.20,2.58,0.00,1.00,-139.20,-28.80,0 +177.60,-38.40,2.56,0.00,1.00,-144.00,24.00,0 +177.60,-33.60,2.54,0.00,1.00,-148.80,-24.00,0 +177.60,-28.80,2.52,0.00,1.00,-153.60,19.20,0 +177.60,-24.00,2.50,0.00,1.00,-158.40,-19.20,0 +177.60,-19.20,2.48,0.00,1.00,-163.20,14.40,0 +177.60,-14.40,2.46,0.00,1.00,-168.00,-9.60,0 +177.60,-9.60,2.44,0.00,1.00,-172.80,9.60,0 +177.60,-4.80,2.41,0.00,1.00,-177.60,-4.80,0 +177.60,-0.00,2.39,0.00,1.00,177.60,0.00,0 +-177.60,0.00,2.37,0.00,1.00,172.80,0.00,0 +-177.60,4.80,2.35,0.00,1.00,168.00,-4.80,0 +-177.60,9.60,2.33,0.00,1.00,163.20,9.60,0 +-177.60,14.40,2.31,0.00,1.00,158.40,-9.60,0 +-177.60,19.20,2.29,0.00,1.00,153.60,14.40,0 +-177.60,24.00,2.26,0.00,1.00,148.80,-19.20,0 +-177.60,28.80,2.24,0.00,1.00,144.00,19.20,0 +-177.60,33.60,2.22,0.00,1.00,139.20,-24.00,0 +-177.60,38.40,2.20,0.00,1.00,134.40,24.00,0 +-177.60,43.20,2.18,0.00,1.00,129.60,-28.80,0 +-177.60,48.00,2.16,0.00,1.00,124.80,28.80,0 +-172.80,52.80,2.14,0.00,1.00,120.00,-33.60,0 +-172.80,57.60,2.11,0.00,1.00,115.20,33.60,0 +-172.80,62.40,2.09,0.00,1.00,110.40,-38.40,0 +-172.80,67.20,2.07,0.00,1.00,105.60,38.40,0 +-168.00,72.00,2.05,0.00,1.00,100.80,-38.40,0 +-163.20,76.80,2.03,0.00,1.00,96.00,38.40,0 +-148.80,81.60,2.01,0.00,1.00,91.20,-43.20,0 +-110.40,86.40,1.99,0.00,1.00,86.40,43.20,0 +-43.20,86.40,1.97,0.00,1.00,81.60,-43.20,0 +-24.00,81.60,1.94,0.00,1.00,76.80,43.20,0 +-14.40,76.80,1.92,0.00,1.00,72.00,-38.40,0 +-9.60,72.00,1.90,0.00,1.00,67.20,38.40,0 +-9.60,67.20,1.88,0.00,1.00,62.40,-38.40,0 +-4.80,62.40,1.86,0.00,1.00,57.60,33.60,0 +-4.80,57.60,1.84,0.00,1.00,52.80,-33.60,0 +-4.80,52.80,1.82,0.00,1.00,48.00,33.60,0 +-4.80,48.00,1.79,0.00,1.00,43.20,-28.80,0 +-4.80,43.20,1.77,0.00,1.00,38.40,28.80,0 +-4.80,38.40,1.75,0.00,1.00,33.60,-24.00,0 +-0.00,33.60,1.73,0.00,1.00,28.80,19.20,0 +-0.00,28.80,1.71,0.00,1.00,24.00,-19.20,0 +-0.00,24.00,1.69,0.00,1.00,19.20,14.40,0 +-0.00,19.20,1.67,0.00,1.00,14.40,-14.40,0 +-0.00,14.40,1.64,0.00,1.00,9.60,9.60,0 +-0.00,9.60,1.62,0.00,1.00,4.80,-4.80,0 +-0.00,4.80,1.60,0.00,1.00,0.00,4.80,0 +-0.00,0.00,1.58,0.00,1.00,-4.80,0.00,0 +-0.00,-4.80,1.56,0.00,1.00,-9.60,4.80,0 +-0.00,-9.60,1.54,0.00,1.00,-14.40,-4.80,0 +-0.00,-14.40,1.52,0.00,1.00,-19.20,9.60,0 +-0.00,-19.20,1.50,0.00,1.00,-24.00,-14.40,0 +-0.00,-24.00,1.47,0.00,1.00,-28.80,19.20,0 +-0.00,-28.80,1.45,0.00,1.00,-33.60,-19.20,0 +-0.00,-33.60,1.43,0.00,1.00,-38.40,24.00,0 +-0.00,-38.40,1.41,0.00,1.00,-43.20,-28.80,0 +-0.00,-43.20,1.39,0.00,1.00,-48.00,28.80,0 +-0.00,-48.00,1.37,0.00,1.00,-52.80,-33.60,0 +-0.00,-52.80,1.35,0.00,1.00,-57.60,33.60,0 +-0.00,-57.60,1.32,0.00,1.00,-62.40,-38.40,0 +-0.00,-62.40,1.30,0.00,1.00,-67.20,38.40,0 +-4.80,-67.20,1.28,0.00,1.00,-72.00,-43.20,0 +-4.80,-72.00,1.26,0.00,1.00,-76.80,43.20,0 +-4.80,-76.80,1.24,0.00,1.00,-81.60,-43.20,0 +-9.60,-81.60,1.22,0.00,1.00,-86.40,43.20,0 +-19.20,-86.40,1.20,0.00,1.00,-91.20,-48.00,0 +-134.40,-86.40,1.17,0.00,1.00,-96.00,48.00,0 +-168.00,-81.60,1.15,0.00,1.00,-100.80,-48.00,0 +-172.80,-76.80,1.13,0.00,1.00,-105.60,43.20,0 +-177.60,-72.00,1.11,0.00,1.00,-110.40,-43.20,0 +-177.60,-67.20,1.09,0.00,1.00,-115.20,43.20,0 +-177.60,-62.40,1.07,0.00,1.00,-120.00,-38.40,0 +-177.60,-57.60,1.05,0.00,1.00,-124.80,38.40,0 +-177.60,-52.80,1.03,0.00,1.00,-129.60,-38.40,0 +-177.60,-48.00,1.00,0.00,1.00,-134.40,33.60,0 +-177.60,-43.20,0.98,0.00,1.00,-139.20,-28.80,0 +-177.60,-38.40,0.96,0.00,1.00,-144.00,28.80,0 +-177.60,-33.60,0.94,0.00,1.00,-148.80,-24.00,0 +-177.60,-28.80,0.92,0.00,1.00,-153.60,24.00,0 +-177.60,-24.00,0.90,0.00,1.00,-158.40,-19.20,0 +-177.60,-19.20,0.88,0.00,1.00,-163.20,14.40,0 +-177.60,-14.40,0.85,0.00,1.00,-168.00,-14.40,0 +-177.60,-9.60,0.83,0.00,1.00,-172.80,9.60,0 +-177.60,-4.80,0.81,0.00,1.00,-177.60,-4.80,0 +-177.60,-0.00,0.79,0.00,1.00,177.60,0.00,0 +177.60,0.00,0.77,0.00,1.00,172.80,0.00,0 +177.60,4.80,0.75,0.00,1.00,168.00,-4.80,0 +177.60,9.60,0.73,0.00,1.00,163.20,9.60,0 +177.60,14.40,0.70,0.00,1.00,158.40,-14.40,0 +177.60,19.20,0.68,0.00,1.00,153.60,14.40,0 +177.60,24.00,0.66,0.00,1.00,148.80,-19.20,0 +177.60,28.80,0.64,0.00,1.00,144.00,24.00,0 +177.60,33.60,0.62,0.00,1.00,139.20,-24.00,0 +177.60,38.40,0.60,0.00,1.00,134.40,28.80,0 +177.60,43.20,0.58,0.00,1.00,129.60,-28.80,0 +177.60,48.00,0.56,0.00,1.00,124.80,33.60,0 +177.60,52.80,0.53,0.00,1.00,120.00,-38.40,0 +177.60,57.60,0.51,0.00,1.00,115.20,38.40,0 +177.60,62.40,0.49,0.00,1.00,110.40,-38.40,0 +177.60,67.20,0.47,0.00,1.00,105.60,43.20,0 +177.60,72.00,0.45,0.00,1.00,100.80,-43.20,0 +172.80,76.80,0.43,0.00,1.00,96.00,43.20,0 +168.00,81.60,0.41,0.00,1.00,91.20,-48.00,0 +134.40,86.40,0.38,0.00,1.00,86.40,48.00,0 +19.20,86.40,0.36,0.00,1.00,81.60,-48.00,0 +9.60,81.60,0.34,0.00,1.00,76.80,43.20,0 +4.80,76.80,0.32,0.00,1.00,72.00,-43.20,0 +4.80,72.00,0.30,0.00,1.00,67.20,43.20,0 +4.80,67.20,0.28,0.00,1.00,62.40,-43.20,0 +0.00,62.40,0.26,0.00,1.00,57.60,38.40,0 +0.00,57.60,0.23,0.00,1.00,52.80,-38.40,0 +0.00,52.80,0.21,0.00,1.00,48.00,33.60,0 +0.00,48.00,0.19,0.00,1.00,43.20,-33.60,0 +0.00,43.20,0.17,0.00,1.00,38.40,28.80,0 +0.00,38.40,0.15,0.00,1.00,33.60,-28.80,0 +0.00,33.60,0.13,0.00,1.00,28.80,24.00,0 +0.00,28.80,0.11,0.00,1.00,24.00,-19.20,0 +0.00,24.00,0.09,0.00,1.00,19.20,19.20,0 +0.00,19.20,0.06,0.00,1.00,14.40,-14.40,0 +0.00,14.40,0.04,0.00,1.00,9.60,9.60,0 +0.00,9.60,0.02,0.00,1.00,4.80,-4.80,0 +0.00,4.80,0.00,0.00,1.00,0.00,4.80,0 diff --git a/scripts/testv/stvISM2.csv b/scripts/testv/stvISM2.csv index 35698d046f..f5c6b1f25e 100644 --- a/scripts/testv/stvISM2.csv +++ b/scripts/testv/stvISM2.csv @@ -1,1500 +1,1500 @@ -0.00,4.80,16.00,0.00,1.00,0.00,0.00 -0.00,9.60,15.98,0.00,1.00,-177.60,4.80 -0.00,14.40,15.96,0.00,1.00,4.80,9.60 -0.00,19.20,15.94,0.00,1.00,-168.00,14.40 -0.00,24.00,15.91,0.00,1.00,14.40,19.20 -0.00,28.80,15.89,0.00,1.00,-163.20,24.00 -0.00,33.60,15.87,0.00,1.00,19.20,28.80 -0.00,38.40,15.85,0.00,1.00,-153.60,33.60 -0.00,43.20,15.83,0.00,1.00,28.80,38.40 -0.00,48.00,15.81,0.00,1.00,-148.80,43.20 -0.00,52.80,15.79,0.00,1.00,38.40,48.00 -0.00,57.60,15.77,0.00,1.00,-139.20,52.80 -0.00,62.40,15.74,0.00,1.00,48.00,57.60 -4.80,67.20,15.72,0.00,1.00,-124.80,62.40 -4.80,72.00,15.70,0.00,1.00,57.60,67.20 -4.80,76.80,15.68,0.00,1.00,-115.20,72.00 -9.60,81.60,15.66,0.00,1.00,72.00,76.80 -19.20,86.40,15.64,0.00,1.00,-100.80,81.60 -134.40,86.40,15.62,0.00,1.00,86.40,86.40 -168.00,81.60,15.59,0.00,1.00,-86.40,89.20 -172.80,76.80,15.57,0.00,1.00,100.80,86.40 -177.60,72.00,15.55,0.00,1.00,-76.80,81.60 -177.60,67.20,15.53,0.00,1.00,110.40,76.80 -177.60,62.40,15.51,0.00,1.00,-62.40,72.00 -177.60,57.60,15.49,0.00,1.00,124.80,67.20 -177.60,52.80,15.47,0.00,1.00,-52.80,62.40 -177.60,48.00,15.44,0.00,1.00,134.40,57.60 -177.60,43.20,15.42,0.00,1.00,-38.40,52.80 -177.60,38.40,15.40,0.00,1.00,144.00,48.00 -177.60,33.60,15.38,0.00,1.00,-33.60,43.20 -177.60,28.80,15.36,0.00,1.00,153.60,38.40 -177.60,24.00,15.34,0.00,1.00,-24.00,33.60 -177.60,19.20,15.32,0.00,1.00,158.40,28.80 -177.60,14.40,15.30,0.00,1.00,-14.40,24.00 -177.60,9.60,15.27,0.00,1.00,168.00,19.20 -177.60,4.80,15.25,0.00,1.00,-9.60,14.40 -177.60,0.00,15.23,0.00,1.00,172.80,9.60 --177.60,-0.00,15.21,0.00,1.00,-0.00,4.80 --177.60,-4.80,15.19,0.00,1.00,-177.60,-0.00 --177.60,-9.60,15.17,0.00,1.00,4.80,-4.80 --177.60,-14.40,15.15,0.00,1.00,-172.80,-9.60 --177.60,-19.20,15.12,0.00,1.00,14.40,-14.40 --177.60,-24.00,15.10,0.00,1.00,-163.20,-19.20 --177.60,-28.80,15.08,0.00,1.00,19.20,-24.00 --177.60,-33.60,15.06,0.00,1.00,-158.40,-28.80 --177.60,-38.40,15.04,0.00,1.00,28.80,-33.60 --177.60,-43.20,15.02,0.00,1.00,-148.80,-38.40 --177.60,-48.00,15.00,0.00,1.00,33.60,-48.00 --177.60,-52.80,14.97,0.00,1.00,-139.20,-48.00 --177.60,-57.60,14.95,0.00,1.00,43.20,-52.80 --177.60,-62.40,14.93,0.00,1.00,-129.60,-57.60 --177.60,-67.20,14.91,0.00,1.00,57.60,-62.40 --177.60,-72.00,14.89,0.00,1.00,-120.00,-67.20 --172.80,-76.80,14.87,0.00,1.00,67.20,-76.80 --168.00,-81.60,14.85,0.00,1.00,-105.60,-76.80 --134.40,-86.40,14.83,0.00,1.00,81.60,-86.40 --19.20,-86.40,14.80,0.00,1.00,-91.20,-89.20 --9.60,-81.60,14.78,0.00,1.00,96.00,-86.40 --4.80,-76.80,14.76,0.00,1.00,-76.80,-81.60 --4.80,-72.00,14.74,0.00,1.00,110.40,-76.80 --4.80,-67.20,14.72,0.00,1.00,-67.20,-72.00 --0.00,-62.40,14.70,0.00,1.00,120.00,-67.20 --0.00,-57.60,14.68,0.00,1.00,-52.80,-62.40 --0.00,-52.80,14.65,0.00,1.00,129.60,-57.60 --0.00,-48.00,14.63,0.00,1.00,-43.20,-52.80 --0.00,-43.20,14.61,0.00,1.00,144.00,-48.00 --0.00,-38.40,14.59,0.00,1.00,-33.60,-43.20 --0.00,-33.60,14.57,0.00,1.00,148.80,-38.40 --0.00,-28.80,14.55,0.00,1.00,-24.00,-33.60 --0.00,-24.00,14.53,0.00,1.00,158.40,-28.80 --0.00,-19.20,14.50,0.00,1.00,-19.20,-24.00 --0.00,-14.40,14.48,0.00,1.00,168.00,-19.20 --0.00,-9.60,14.46,0.00,1.00,-9.60,-14.40 --0.00,-4.80,14.44,0.00,1.00,172.80,-9.60 --0.00,0.00,14.42,0.00,1.00,-4.80,-4.80 --0.00,4.80,14.40,0.00,1.00,0.00,0.00 --0.00,9.60,14.38,0.00,1.00,-177.60,4.80 --0.00,14.40,14.36,0.00,1.00,9.60,9.60 --0.00,19.20,14.33,0.00,1.00,-168.00,14.40 --0.00,24.00,14.31,0.00,1.00,14.40,19.20 --0.00,28.80,14.29,0.00,1.00,-163.20,24.00 --0.00,33.60,14.27,0.00,1.00,24.00,28.80 --4.80,38.40,14.25,0.00,1.00,-153.60,33.60 --4.80,43.20,14.23,0.00,1.00,28.80,38.40 --4.80,48.00,14.21,0.00,1.00,-144.00,43.20 --4.80,52.80,14.18,0.00,1.00,38.40,48.00 --4.80,57.60,14.16,0.00,1.00,-134.40,52.80 --4.80,62.40,14.14,0.00,1.00,48.00,57.60 --9.60,67.20,14.12,0.00,1.00,-124.80,62.40 --9.60,72.00,14.10,0.00,1.00,62.40,67.20 --14.40,76.80,14.08,0.00,1.00,-115.20,72.00 --24.00,81.60,14.06,0.00,1.00,72.00,76.80 --43.20,86.40,14.03,0.00,1.00,-100.80,81.60 --110.40,86.40,14.01,0.00,1.00,86.40,86.40 --148.80,81.60,13.99,0.00,1.00,-86.40,86.40 --163.20,76.80,13.97,0.00,1.00,96.00,81.60 --168.00,72.00,13.95,0.00,1.00,-76.80,76.80 --172.80,67.20,13.93,0.00,1.00,110.40,72.00 --172.80,62.40,13.91,0.00,1.00,-62.40,67.20 --172.80,57.60,13.89,0.00,1.00,120.00,62.40 --172.80,52.80,13.86,0.00,1.00,-52.80,57.60 --177.60,48.00,13.84,0.00,1.00,134.40,52.80 --177.60,43.20,13.82,0.00,1.00,-43.20,48.00 --177.60,38.40,13.80,0.00,1.00,144.00,43.20 --177.60,33.60,13.78,0.00,1.00,-33.60,38.40 --177.60,28.80,13.76,0.00,1.00,148.80,33.60 --177.60,24.00,13.74,0.00,1.00,-24.00,28.80 --177.60,19.20,13.71,0.00,1.00,158.40,24.00 --177.60,14.40,13.69,0.00,1.00,-19.20,19.20 --177.60,9.60,13.67,0.00,1.00,168.00,14.40 --177.60,4.80,13.65,0.00,1.00,-9.60,9.60 --177.60,0.00,13.63,0.00,1.00,172.80,4.80 -177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 -177.60,-4.80,13.59,0.00,1.00,-177.60,-0.00 -177.60,-9.60,13.56,0.00,1.00,4.80,-4.80 -177.60,-14.40,13.54,0.00,1.00,-172.80,-9.60 -177.60,-19.20,13.52,0.00,1.00,14.40,-14.40 -177.60,-24.00,13.50,0.00,1.00,-163.20,-19.20 -177.60,-28.80,13.48,0.00,1.00,19.20,-24.00 -177.60,-33.60,13.46,0.00,1.00,-153.60,-28.80 -177.60,-38.40,13.44,0.00,1.00,28.80,-33.60 -177.60,-43.20,13.42,0.00,1.00,-148.80,-38.40 -177.60,-48.00,13.39,0.00,1.00,38.40,-43.20 -172.80,-52.80,13.37,0.00,1.00,-139.20,-48.00 -172.80,-57.60,13.35,0.00,1.00,48.00,-52.80 -172.80,-62.40,13.33,0.00,1.00,-124.80,-57.60 -172.80,-67.20,13.31,0.00,1.00,57.60,-62.40 -168.00,-72.00,13.29,0.00,1.00,-115.20,-67.20 -163.20,-76.80,13.27,0.00,1.00,72.00,-72.00 -148.80,-81.60,13.24,0.00,1.00,-105.60,-76.80 -110.40,-86.40,13.22,0.00,1.00,81.60,-81.60 -43.20,-86.40,13.20,0.00,1.00,-91.20,-86.40 -24.00,-81.60,13.18,0.00,1.00,96.00,-86.40 -14.40,-76.80,13.16,0.00,1.00,-76.80,-81.60 -9.60,-72.00,13.14,0.00,1.00,105.60,-76.80 -9.60,-67.20,13.12,0.00,1.00,-67.20,-72.00 -4.80,-62.40,13.09,0.00,1.00,120.00,-67.20 -4.80,-57.60,13.07,0.00,1.00,-57.60,-62.40 -4.80,-52.80,13.05,0.00,1.00,129.60,-57.60 -4.80,-48.00,13.03,0.00,1.00,-43.20,-52.80 -4.80,-43.20,13.01,0.00,1.00,139.20,-48.00 -4.80,-38.40,12.99,0.00,1.00,-33.60,-43.20 -0.00,-33.60,12.97,0.00,1.00,148.80,-38.40 -0.00,-28.80,12.95,0.00,1.00,-28.80,-33.60 -0.00,-24.00,12.92,0.00,1.00,158.40,-28.80 -0.00,-19.20,12.90,0.00,1.00,-19.20,-24.00 -0.00,-14.40,12.88,0.00,1.00,163.20,-19.20 -0.00,-9.60,12.86,0.00,1.00,-9.60,-14.40 -0.00,-4.80,12.84,0.00,1.00,172.80,-9.60 -0.00,0.00,12.82,0.00,1.00,-4.80,-4.80 --0.00,4.80,12.80,0.00,1.00,0.00,0.00 --0.00,9.60,12.77,0.00,1.00,-177.60,4.80 --0.00,14.40,12.75,0.00,1.00,9.60,9.60 --4.80,19.20,12.73,0.00,1.00,-168.00,14.40 --4.80,24.00,12.71,0.00,1.00,14.40,19.20 --4.80,28.80,12.69,0.00,1.00,-158.40,24.00 --4.80,33.60,12.67,0.00,1.00,24.00,28.80 --4.80,38.40,12.65,0.00,1.00,-153.60,33.60 --9.60,43.20,12.62,0.00,1.00,33.60,38.40 --9.60,48.00,12.60,0.00,1.00,-144.00,43.20 --9.60,52.80,12.58,0.00,1.00,43.20,48.00 --14.40,57.60,12.56,0.00,1.00,-134.40,52.80 --14.40,62.40,12.54,0.00,1.00,52.80,57.60 --19.20,67.20,12.52,0.00,1.00,-124.80,62.40 --24.00,72.00,12.50,0.00,1.00,62.40,67.20 --33.60,72.00,12.48,0.00,1.00,-110.40,72.00 --43.20,76.80,12.45,0.00,1.00,72.00,72.00 --67.20,81.60,12.43,0.00,1.00,-100.80,76.80 --96.00,81.60,12.41,0.00,1.00,86.40,81.60 --124.80,81.60,12.39,0.00,1.00,-86.40,81.60 --144.00,76.80,12.37,0.00,1.00,96.00,76.80 --153.60,72.00,12.35,0.00,1.00,-76.80,76.80 --158.40,67.20,12.33,0.00,1.00,110.40,72.00 --163.20,62.40,12.30,0.00,1.00,-67.20,67.20 --168.00,57.60,12.28,0.00,1.00,120.00,62.40 --168.00,52.80,12.26,0.00,1.00,-52.80,57.60 --168.00,48.00,12.24,0.00,1.00,129.60,52.80 --172.80,43.20,12.22,0.00,1.00,-43.20,48.00 --172.80,38.40,12.20,0.00,1.00,139.20,43.20 --172.80,33.60,12.18,0.00,1.00,-33.60,38.40 --172.80,28.80,12.15,0.00,1.00,148.80,33.60 --177.60,24.00,12.13,0.00,1.00,-24.00,28.80 --177.60,19.20,12.11,0.00,1.00,158.40,24.00 --177.60,14.40,12.09,0.00,1.00,-19.20,19.20 --177.60,9.60,12.07,0.00,1.00,168.00,14.40 --177.60,4.80,12.05,0.00,1.00,-9.60,9.60 --177.60,0.00,12.03,0.00,1.00,172.80,4.80 -177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 -177.60,-4.80,11.98,0.00,1.00,-177.60,-0.00 -177.60,-9.60,11.96,0.00,1.00,4.80,-4.80 -177.60,-14.40,11.94,0.00,1.00,-168.00,-9.60 -177.60,-19.20,11.92,0.00,1.00,14.40,-14.40 -177.60,-24.00,11.90,0.00,1.00,-163.20,-19.20 -172.80,-28.80,11.88,0.00,1.00,24.00,-24.00 -172.80,-33.60,11.86,0.00,1.00,-153.60,-28.80 -172.80,-38.40,11.83,0.00,1.00,28.80,-33.60 -172.80,-43.20,11.81,0.00,1.00,-144.00,-38.40 -168.00,-48.00,11.79,0.00,1.00,38.40,-43.20 -168.00,-52.80,11.77,0.00,1.00,-134.40,-48.00 -168.00,-57.60,11.75,0.00,1.00,48.00,-52.80 -163.20,-62.40,11.73,0.00,1.00,-124.80,-57.60 -158.40,-67.20,11.71,0.00,1.00,62.40,-62.40 -153.60,-72.00,11.68,0.00,1.00,-115.20,-67.20 -144.00,-76.80,11.66,0.00,1.00,72.00,-72.00 -124.80,-81.60,11.64,0.00,1.00,-100.80,-76.80 -96.00,-81.60,11.62,0.00,1.00,81.60,-76.80 -67.20,-81.60,11.60,0.00,1.00,-91.20,-81.60 -43.20,-76.80,11.58,0.00,1.00,96.00,-81.60 -33.60,-72.00,11.56,0.00,1.00,-81.60,-76.80 -24.00,-72.00,11.54,0.00,1.00,105.60,-72.00 -19.20,-67.20,11.51,0.00,1.00,-67.20,-72.00 -14.40,-62.40,11.49,0.00,1.00,115.20,-67.20 -14.40,-57.60,11.47,0.00,1.00,-57.60,-62.40 -9.60,-52.80,11.45,0.00,1.00,129.60,-57.60 -9.60,-48.00,11.43,0.00,1.00,-48.00,-52.80 -9.60,-43.20,11.41,0.00,1.00,139.20,-48.00 -4.80,-38.40,11.39,0.00,1.00,-38.40,-43.20 -4.80,-33.60,11.36,0.00,1.00,148.80,-38.40 -4.80,-28.80,11.34,0.00,1.00,-28.80,-33.60 -4.80,-24.00,11.32,0.00,1.00,153.60,-28.80 -4.80,-19.20,11.30,0.00,1.00,-19.20,-24.00 -0.00,-14.40,11.28,0.00,1.00,163.20,-19.20 -0.00,-9.60,11.26,0.00,1.00,-9.60,-14.40 -0.00,-4.80,11.24,0.00,1.00,172.80,-9.60 -0.00,0.00,11.21,0.00,1.00,-4.80,-4.80 --0.00,4.80,11.19,0.00,1.00,0.00,0.00 --0.00,9.60,11.17,0.00,1.00,-177.60,4.80 --4.80,14.40,11.15,0.00,1.00,9.60,9.60 --4.80,19.20,11.13,0.00,1.00,-168.00,14.40 --4.80,24.00,11.11,0.00,1.00,14.40,19.20 --4.80,28.80,11.09,0.00,1.00,-158.40,24.00 --9.60,33.60,11.07,0.00,1.00,24.00,28.80 --9.60,38.40,11.04,0.00,1.00,-148.80,33.60 --14.40,43.20,11.02,0.00,1.00,33.60,38.40 --14.40,48.00,11.00,0.00,1.00,-139.20,43.20 --14.40,52.80,10.98,0.00,1.00,43.20,48.00 --19.20,57.60,10.96,0.00,1.00,-129.60,52.80 --24.00,57.60,10.94,0.00,1.00,52.80,52.80 --28.80,62.40,10.92,0.00,1.00,-120.00,57.60 --33.60,67.20,10.89,0.00,1.00,62.40,62.40 --43.20,72.00,10.87,0.00,1.00,-110.40,67.20 --57.60,72.00,10.85,0.00,1.00,76.80,72.00 --76.80,76.80,10.83,0.00,1.00,-100.80,72.00 --96.00,76.80,10.81,0.00,1.00,86.40,76.80 --115.20,76.80,10.79,0.00,1.00,-86.40,76.80 --129.60,72.00,10.77,0.00,1.00,96.00,76.80 --139.20,72.00,10.74,0.00,1.00,-76.80,72.00 --148.80,67.20,10.72,0.00,1.00,105.60,67.20 --153.60,62.40,10.70,0.00,1.00,-67.20,67.20 --158.40,57.60,10.68,0.00,1.00,120.00,62.40 --163.20,52.80,10.66,0.00,1.00,-57.60,57.60 --163.20,48.00,10.64,0.00,1.00,129.60,52.80 --168.00,43.20,10.62,0.00,1.00,-48.00,48.00 --168.00,38.40,10.60,0.00,1.00,139.20,43.20 --172.80,33.60,10.57,0.00,1.00,-38.40,38.40 --172.80,28.80,10.55,0.00,1.00,148.80,33.60 --172.80,24.00,10.53,0.00,1.00,-28.80,28.80 --172.80,19.20,10.51,0.00,1.00,158.40,24.00 --177.60,14.40,10.49,0.00,1.00,-19.20,19.20 --177.60,9.60,10.47,0.00,1.00,163.20,14.40 --177.60,4.80,10.45,0.00,1.00,-9.60,9.60 --177.60,0.00,10.42,0.00,1.00,172.80,4.80 -177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 -177.60,-4.80,10.38,0.00,1.00,-177.60,-0.00 -177.60,-9.60,10.36,0.00,1.00,4.80,-4.80 -177.60,-14.40,10.34,0.00,1.00,-168.00,-9.60 -172.80,-19.20,10.32,0.00,1.00,14.40,-14.40 -172.80,-24.00,10.30,0.00,1.00,-163.20,-19.20 -172.80,-28.80,10.28,0.00,1.00,24.00,-24.00 -172.80,-33.60,10.25,0.00,1.00,-153.60,-28.80 -168.00,-38.40,10.23,0.00,1.00,33.60,-33.60 -168.00,-43.20,10.21,0.00,1.00,-144.00,-38.40 -163.20,-48.00,10.19,0.00,1.00,43.20,-43.20 -163.20,-52.80,10.17,0.00,1.00,-134.40,-48.00 -158.40,-57.60,10.15,0.00,1.00,52.80,-52.80 -153.60,-62.40,10.13,0.00,1.00,-124.80,-57.60 -148.80,-67.20,10.10,0.00,1.00,62.40,-62.40 -139.20,-72.00,10.08,0.00,1.00,-115.20,-67.20 -129.60,-72.00,10.06,0.00,1.00,72.00,-67.20 -115.20,-76.80,10.04,0.00,1.00,-100.80,-72.00 -96.00,-76.80,10.02,0.00,1.00,81.60,-76.80 -76.80,-76.80,10.00,0.00,1.00,-91.20,-76.80 -57.60,-72.00,9.98,0.00,1.00,96.00,-76.80 -43.20,-72.00,9.95,0.00,1.00,-81.60,-72.00 -33.60,-67.20,9.93,0.00,1.00,105.60,-72.00 -28.80,-62.40,9.91,0.00,1.00,-67.20,-67.20 -24.00,-57.60,9.89,0.00,1.00,115.20,-62.40 -19.20,-57.60,9.87,0.00,1.00,-57.60,-57.60 -14.40,-52.80,9.85,0.00,1.00,124.80,-52.80 -14.40,-48.00,9.83,0.00,1.00,-48.00,-52.80 -14.40,-43.20,9.81,0.00,1.00,134.40,-48.00 -9.60,-38.40,9.78,0.00,1.00,-38.40,-43.20 -9.60,-33.60,9.76,0.00,1.00,144.00,-38.40 -4.80,-28.80,9.74,0.00,1.00,-28.80,-33.60 -4.80,-24.00,9.72,0.00,1.00,153.60,-28.80 -4.80,-19.20,9.70,0.00,1.00,-19.20,-24.00 -4.80,-14.40,9.68,0.00,1.00,163.20,-19.20 -0.00,-9.60,9.66,0.00,1.00,-14.40,-14.40 -0.00,-4.80,9.63,0.00,1.00,172.80,-9.60 -0.00,0.00,9.61,0.00,1.00,-4.80,-4.80 --0.00,4.80,9.59,0.00,1.00,0.00,0.00 --4.80,9.60,9.57,0.00,1.00,-177.60,4.80 --4.80,14.40,9.55,0.00,1.00,9.60,9.60 --4.80,19.20,9.53,0.00,1.00,-168.00,14.40 --9.60,24.00,9.51,0.00,1.00,19.20,19.20 --9.60,28.80,9.48,0.00,1.00,-158.40,24.00 --9.60,33.60,9.46,0.00,1.00,24.00,28.80 --14.40,38.40,9.44,0.00,1.00,-148.80,33.60 --14.40,38.40,9.42,0.00,1.00,33.60,33.60 --19.20,43.20,9.40,0.00,1.00,-139.20,38.40 --24.00,48.00,9.38,0.00,1.00,43.20,43.20 --24.00,52.80,9.36,0.00,1.00,-129.60,48.00 --28.80,57.60,9.34,0.00,1.00,52.80,52.80 --38.40,62.40,9.31,0.00,1.00,-120.00,57.60 --43.20,62.40,9.29,0.00,1.00,67.20,62.40 --52.80,67.20,9.27,0.00,1.00,-110.40,62.40 --62.40,72.00,9.25,0.00,1.00,76.80,67.20 --76.80,72.00,9.23,0.00,1.00,-100.80,67.20 --96.00,72.00,9.21,0.00,1.00,86.40,72.00 --110.40,72.00,9.19,0.00,1.00,-86.40,72.00 --120.00,67.20,9.16,0.00,1.00,96.00,72.00 --134.40,67.20,9.14,0.00,1.00,-76.80,67.20 --139.20,62.40,9.12,0.00,1.00,105.60,67.20 --148.80,57.60,9.10,0.00,1.00,-67.20,62.40 --153.60,57.60,9.08,0.00,1.00,115.20,57.60 --158.40,52.80,9.06,0.00,1.00,-57.60,52.80 --158.40,48.00,9.04,0.00,1.00,129.60,52.80 --163.20,43.20,9.01,0.00,1.00,-48.00,48.00 --163.20,38.40,8.99,0.00,1.00,139.20,43.20 --168.00,33.60,8.97,0.00,1.00,-38.40,38.40 --168.00,28.80,8.95,0.00,1.00,148.80,33.60 --172.80,24.00,8.93,0.00,1.00,-28.80,28.80 --172.80,19.20,8.91,0.00,1.00,153.60,24.00 --172.80,14.40,8.89,0.00,1.00,-19.20,19.20 --177.60,9.60,8.87,0.00,1.00,163.20,14.40 --177.60,4.80,8.84,0.00,1.00,-9.60,9.60 --177.60,0.00,8.82,0.00,1.00,172.80,4.80 -177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 -177.60,-4.80,8.78,0.00,1.00,-177.60,-0.00 -177.60,-9.60,8.76,0.00,1.00,4.80,-4.80 -172.80,-14.40,8.74,0.00,1.00,-168.00,-9.60 -172.80,-19.20,8.72,0.00,1.00,14.40,-14.40 -172.80,-24.00,8.69,0.00,1.00,-158.40,-19.20 -168.00,-28.80,8.67,0.00,1.00,24.00,-24.00 -168.00,-33.60,8.65,0.00,1.00,-153.60,-28.80 -163.20,-38.40,8.63,0.00,1.00,33.60,-33.60 -163.20,-43.20,8.61,0.00,1.00,-144.00,-38.40 -158.40,-48.00,8.59,0.00,1.00,43.20,-43.20 -158.40,-52.80,8.57,0.00,1.00,-134.40,-48.00 -153.60,-57.60,8.54,0.00,1.00,52.80,-52.80 -148.80,-57.60,8.52,0.00,1.00,-124.80,-52.80 -139.20,-62.40,8.50,0.00,1.00,62.40,-57.60 -134.40,-67.20,8.48,0.00,1.00,-110.40,-62.40 -120.00,-67.20,8.46,0.00,1.00,72.00,-67.20 -110.40,-72.00,8.44,0.00,1.00,-100.80,-67.20 -96.00,-72.00,8.42,0.00,1.00,81.60,-72.00 -76.80,-72.00,8.40,0.00,1.00,-91.20,-72.00 -62.40,-72.00,8.37,0.00,1.00,96.00,-72.00 -52.80,-67.20,8.35,0.00,1.00,-81.60,-67.20 -43.20,-62.40,8.33,0.00,1.00,105.60,-67.20 -38.40,-62.40,8.31,0.00,1.00,-72.00,-62.40 -28.80,-57.60,8.29,0.00,1.00,115.20,-62.40 -24.00,-52.80,8.27,0.00,1.00,-57.60,-57.60 -24.00,-48.00,8.25,0.00,1.00,124.80,-52.80 -19.20,-43.20,8.22,0.00,1.00,-48.00,-48.00 -14.40,-38.40,8.20,0.00,1.00,134.40,-43.20 -14.40,-38.40,8.18,0.00,1.00,-38.40,-38.40 -9.60,-33.60,8.16,0.00,1.00,144.00,-33.60 -9.60,-28.80,8.14,0.00,1.00,-28.80,-33.60 -9.60,-24.00,8.12,0.00,1.00,153.60,-28.80 -4.80,-19.20,8.10,0.00,1.00,-24.00,-24.00 -4.80,-14.40,8.07,0.00,1.00,163.20,-19.20 -4.80,-9.60,8.05,0.00,1.00,-14.40,-14.40 -0.00,-4.80,8.03,0.00,1.00,172.80,-9.60 -0.00,0.00,8.01,0.00,1.00,-4.80,-4.80 --0.00,4.80,7.99,0.00,1.00,0.00,0.00 --4.80,9.60,7.97,0.00,1.00,-177.60,4.80 --4.80,14.40,7.95,0.00,1.00,9.60,9.60 --9.60,19.20,7.93,0.00,1.00,-168.00,14.40 --9.60,24.00,7.90,0.00,1.00,19.20,19.20 --14.40,24.00,7.88,0.00,1.00,-158.40,24.00 --14.40,28.80,7.86,0.00,1.00,28.80,24.00 --19.20,33.60,7.84,0.00,1.00,-148.80,28.80 --19.20,38.40,7.82,0.00,1.00,38.40,33.60 --24.00,43.20,7.80,0.00,1.00,-139.20,38.40 --28.80,48.00,7.78,0.00,1.00,48.00,43.20 --33.60,52.80,7.75,0.00,1.00,-129.60,48.00 --38.40,52.80,7.73,0.00,1.00,57.60,52.80 --43.20,57.60,7.71,0.00,1.00,-120.00,52.80 --48.00,62.40,7.69,0.00,1.00,67.20,57.60 --57.60,62.40,7.67,0.00,1.00,-110.40,62.40 --67.20,67.20,7.65,0.00,1.00,76.80,62.40 --81.60,67.20,7.63,0.00,1.00,-100.80,62.40 --91.20,67.20,7.60,0.00,1.00,86.40,67.20 --105.60,67.20,7.58,0.00,1.00,-86.40,67.20 --115.20,67.20,7.56,0.00,1.00,96.00,67.20 --124.80,62.40,7.54,0.00,1.00,-76.80,62.40 --134.40,57.60,7.52,0.00,1.00,105.60,62.40 --139.20,57.60,7.50,0.00,1.00,-67.20,57.60 --144.00,52.80,7.48,0.00,1.00,115.20,57.60 --148.80,48.00,7.46,0.00,1.00,-57.60,52.80 --153.60,43.20,7.43,0.00,1.00,124.80,48.00 --158.40,43.20,7.41,0.00,1.00,-48.00,43.20 --163.20,38.40,7.39,0.00,1.00,134.40,38.40 --163.20,33.60,7.37,0.00,1.00,-38.40,38.40 --168.00,28.80,7.35,0.00,1.00,144.00,33.60 --168.00,24.00,7.33,0.00,1.00,-28.80,28.80 --172.80,19.20,7.31,0.00,1.00,153.60,24.00 --172.80,14.40,7.28,0.00,1.00,-19.20,19.20 --177.60,9.60,7.26,0.00,1.00,163.20,14.40 --177.60,4.80,7.24,0.00,1.00,-9.60,9.60 --177.60,0.00,7.22,0.00,1.00,172.80,4.80 -177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 -177.60,-4.80,7.18,0.00,1.00,-177.60,-0.00 -177.60,-9.60,7.16,0.00,1.00,4.80,-4.80 -172.80,-14.40,7.13,0.00,1.00,-168.00,-9.60 -172.80,-19.20,7.11,0.00,1.00,14.40,-14.40 -168.00,-24.00,7.09,0.00,1.00,-158.40,-19.20 -168.00,-28.80,7.07,0.00,1.00,24.00,-24.00 -163.20,-33.60,7.05,0.00,1.00,-148.80,-28.80 -163.20,-38.40,7.03,0.00,1.00,33.60,-33.60 -158.40,-43.20,7.01,0.00,1.00,-139.20,-38.40 -153.60,-43.20,6.99,0.00,1.00,43.20,-38.40 -148.80,-48.00,6.96,0.00,1.00,-129.60,-43.20 -144.00,-52.80,6.94,0.00,1.00,52.80,-48.00 -139.20,-57.60,6.92,0.00,1.00,-120.00,-52.80 -134.40,-57.60,6.90,0.00,1.00,62.40,-57.60 -124.80,-62.40,6.88,0.00,1.00,-110.40,-57.60 -115.20,-67.20,6.86,0.00,1.00,72.00,-62.40 -105.60,-67.20,6.84,0.00,1.00,-100.80,-62.40 -91.20,-67.20,6.81,0.00,1.00,81.60,-67.20 -81.60,-67.20,6.79,0.00,1.00,-91.20,-67.20 -67.20,-67.20,6.77,0.00,1.00,96.00,-67.20 -57.60,-62.40,6.75,0.00,1.00,-81.60,-62.40 -48.00,-62.40,6.73,0.00,1.00,105.60,-62.40 -43.20,-57.60,6.71,0.00,1.00,-72.00,-62.40 -38.40,-52.80,6.69,0.00,1.00,115.20,-57.60 -33.60,-52.80,6.66,0.00,1.00,-62.40,-52.80 -28.80,-48.00,6.64,0.00,1.00,124.80,-52.80 -24.00,-43.20,6.62,0.00,1.00,-52.80,-48.00 -19.20,-38.40,6.60,0.00,1.00,134.40,-43.20 -19.20,-33.60,6.58,0.00,1.00,-43.20,-38.40 -14.40,-28.80,6.56,0.00,1.00,144.00,-33.60 -14.40,-24.00,6.54,0.00,1.00,-33.60,-28.80 -9.60,-24.00,6.52,0.00,1.00,153.60,-24.00 -9.60,-19.20,6.49,0.00,1.00,-24.00,-24.00 -4.80,-14.40,6.47,0.00,1.00,163.20,-19.20 -4.80,-9.60,6.45,0.00,1.00,-14.40,-14.40 -0.00,-4.80,6.43,0.00,1.00,172.80,-9.60 -0.00,0.00,6.41,0.00,1.00,-4.80,-4.80 --0.00,4.80,6.39,0.00,1.00,0.00,0.00 --4.80,9.60,6.37,0.00,1.00,-177.60,4.80 --4.80,14.40,6.34,0.00,1.00,9.60,9.60 --9.60,19.20,6.32,0.00,1.00,-168.00,14.40 --9.60,19.20,6.30,0.00,1.00,19.20,14.40 --14.40,24.00,6.28,0.00,1.00,-158.40,19.20 --19.20,28.80,6.26,0.00,1.00,28.80,24.00 --19.20,33.60,6.24,0.00,1.00,-148.80,28.80 --24.00,38.40,6.22,0.00,1.00,38.40,33.60 --28.80,43.20,6.19,0.00,1.00,-139.20,38.40 --33.60,43.20,6.17,0.00,1.00,48.00,38.40 --38.40,48.00,6.15,0.00,1.00,-129.60,43.20 --43.20,52.80,6.13,0.00,1.00,57.60,48.00 --48.00,52.80,6.11,0.00,1.00,-120.00,52.80 --52.80,57.60,6.09,0.00,1.00,67.20,52.80 --62.40,57.60,6.07,0.00,1.00,-110.40,57.60 --72.00,62.40,6.05,0.00,1.00,76.80,57.60 --81.60,62.40,6.02,0.00,1.00,-100.80,62.40 --91.20,62.40,6.00,0.00,1.00,86.40,62.40 --100.80,62.40,5.98,0.00,1.00,-86.40,62.40 --110.40,62.40,5.96,0.00,1.00,96.00,62.40 --120.00,57.60,5.94,0.00,1.00,-76.80,57.60 --129.60,57.60,5.92,0.00,1.00,105.60,57.60 --134.40,52.80,5.90,0.00,1.00,-67.20,57.60 --139.20,48.00,5.87,0.00,1.00,115.20,52.80 --144.00,48.00,5.85,0.00,1.00,-57.60,48.00 --148.80,43.20,5.83,0.00,1.00,124.80,48.00 --153.60,38.40,5.81,0.00,1.00,-48.00,43.20 --158.40,33.60,5.79,0.00,1.00,134.40,38.40 --163.20,33.60,5.77,0.00,1.00,-38.40,33.60 --163.20,28.80,5.75,0.00,1.00,144.00,28.80 --168.00,24.00,5.72,0.00,1.00,-28.80,28.80 --168.00,19.20,5.70,0.00,1.00,153.60,24.00 --172.80,14.40,5.68,0.00,1.00,-19.20,19.20 --172.80,9.60,5.66,0.00,1.00,163.20,14.40 --177.60,4.80,5.64,0.00,1.00,-9.60,9.60 --177.60,0.00,5.62,0.00,1.00,172.80,4.80 -177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 -177.60,-4.80,5.58,0.00,1.00,-177.60,-0.00 -172.80,-9.60,5.55,0.00,1.00,4.80,-4.80 -172.80,-14.40,5.53,0.00,1.00,-168.00,-9.60 -168.00,-19.20,5.51,0.00,1.00,14.40,-14.40 -168.00,-24.00,5.49,0.00,1.00,-158.40,-19.20 -163.20,-28.80,5.47,0.00,1.00,24.00,-24.00 -163.20,-33.60,5.45,0.00,1.00,-148.80,-28.80 -158.40,-33.60,5.43,0.00,1.00,33.60,-28.80 -153.60,-38.40,5.40,0.00,1.00,-139.20,-33.60 -148.80,-43.20,5.38,0.00,1.00,43.20,-38.40 -144.00,-48.00,5.36,0.00,1.00,-129.60,-43.20 -139.20,-48.00,5.34,0.00,1.00,52.80,-48.00 -134.40,-52.80,5.32,0.00,1.00,-120.00,-48.00 -129.60,-57.60,5.30,0.00,1.00,62.40,-52.80 -120.00,-57.60,5.28,0.00,1.00,-110.40,-57.60 -110.40,-62.40,5.26,0.00,1.00,72.00,-57.60 -100.80,-62.40,5.23,0.00,1.00,-100.80,-57.60 -91.20,-62.40,5.21,0.00,1.00,81.60,-62.40 -81.60,-62.40,5.19,0.00,1.00,-91.20,-62.40 -72.00,-62.40,5.17,0.00,1.00,96.00,-62.40 -62.40,-57.60,5.15,0.00,1.00,-81.60,-62.40 -52.80,-57.60,5.13,0.00,1.00,105.60,-57.60 -48.00,-52.80,5.11,0.00,1.00,-72.00,-57.60 -43.20,-52.80,5.08,0.00,1.00,115.20,-52.80 -38.40,-48.00,5.06,0.00,1.00,-62.40,-52.80 -33.60,-43.20,5.04,0.00,1.00,124.80,-48.00 -28.80,-43.20,5.02,0.00,1.00,-52.80,-43.20 -24.00,-38.40,5.00,0.00,1.00,134.40,-38.40 -19.20,-33.60,4.98,0.00,1.00,-43.20,-38.40 -19.20,-28.80,4.96,0.00,1.00,144.00,-33.60 -14.40,-24.00,4.93,0.00,1.00,-33.60,-28.80 -9.60,-19.20,4.91,0.00,1.00,153.60,-24.00 -9.60,-19.20,4.89,0.00,1.00,-24.00,-19.20 -4.80,-14.40,4.87,0.00,1.00,163.20,-14.40 -4.80,-9.60,4.85,0.00,1.00,-14.40,-14.40 -0.00,-4.80,4.83,0.00,1.00,172.80,-9.60 -0.00,0.00,4.81,0.00,1.00,-4.80,-4.80 --4.80,4.80,4.79,0.00,1.00,0.00,0.00 --4.80,9.60,4.76,0.00,1.00,-177.60,4.80 --9.60,14.40,4.74,0.00,1.00,9.60,9.60 --9.60,14.40,4.72,0.00,1.00,-168.00,9.60 --14.40,19.20,4.70,0.00,1.00,19.20,14.40 --14.40,24.00,4.68,0.00,1.00,-158.40,19.20 --19.20,28.80,4.66,0.00,1.00,28.80,24.00 --24.00,33.60,4.64,0.00,1.00,-148.80,28.80 --28.80,33.60,4.61,0.00,1.00,38.40,28.80 --28.80,38.40,4.59,0.00,1.00,-139.20,33.60 --33.60,43.20,4.57,0.00,1.00,48.00,38.40 --38.40,43.20,4.55,0.00,1.00,-129.60,43.20 --48.00,48.00,4.53,0.00,1.00,57.60,43.20 --52.80,52.80,4.51,0.00,1.00,-120.00,48.00 --57.60,52.80,4.49,0.00,1.00,67.20,48.00 --67.20,57.60,4.46,0.00,1.00,-110.40,52.80 --76.80,57.60,4.44,0.00,1.00,76.80,52.80 --81.60,57.60,4.42,0.00,1.00,-100.80,57.60 --91.20,57.60,4.40,0.00,1.00,86.40,57.60 --100.80,57.60,4.38,0.00,1.00,-86.40,57.60 --110.40,57.60,4.36,0.00,1.00,96.00,57.60 --115.20,52.80,4.34,0.00,1.00,-76.80,52.80 --124.80,52.80,4.32,0.00,1.00,105.60,52.80 --129.60,48.00,4.29,0.00,1.00,-67.20,52.80 --139.20,48.00,4.27,0.00,1.00,115.20,48.00 --144.00,43.20,4.25,0.00,1.00,-57.60,48.00 --148.80,38.40,4.23,0.00,1.00,124.80,43.20 --153.60,38.40,4.21,0.00,1.00,-48.00,38.40 --153.60,33.60,4.19,0.00,1.00,134.40,38.40 --158.40,28.80,4.17,0.00,1.00,-38.40,33.60 --163.20,24.00,4.14,0.00,1.00,144.00,28.80 --163.20,24.00,4.12,0.00,1.00,-28.80,24.00 --168.00,19.20,4.10,0.00,1.00,153.60,24.00 --172.80,14.40,4.08,0.00,1.00,-19.20,19.20 --172.80,9.60,4.06,0.00,1.00,163.20,14.40 --177.60,4.80,4.04,0.00,1.00,-9.60,9.60 --177.60,0.00,4.02,0.00,1.00,172.80,4.80 -177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 -177.60,-4.80,3.97,0.00,1.00,-177.60,-0.00 -172.80,-9.60,3.95,0.00,1.00,4.80,-4.80 -172.80,-14.40,3.93,0.00,1.00,-168.00,-9.60 -168.00,-19.20,3.91,0.00,1.00,14.40,-14.40 -163.20,-24.00,3.89,0.00,1.00,-158.40,-19.20 -163.20,-24.00,3.87,0.00,1.00,24.00,-24.00 -158.40,-28.80,3.85,0.00,1.00,-148.80,-24.00 -153.60,-33.60,3.82,0.00,1.00,33.60,-28.80 -153.60,-38.40,3.80,0.00,1.00,-139.20,-33.60 -148.80,-38.40,3.78,0.00,1.00,43.20,-38.40 -144.00,-43.20,3.76,0.00,1.00,-129.60,-38.40 -139.20,-48.00,3.74,0.00,1.00,52.80,-43.20 -129.60,-48.00,3.72,0.00,1.00,-120.00,-48.00 -124.80,-52.80,3.70,0.00,1.00,62.40,-48.00 -115.20,-52.80,3.67,0.00,1.00,-110.40,-52.80 -110.40,-57.60,3.65,0.00,1.00,72.00,-52.80 -100.80,-57.60,3.63,0.00,1.00,-100.80,-52.80 -91.20,-57.60,3.61,0.00,1.00,81.60,-57.60 -81.60,-57.60,3.59,0.00,1.00,-91.20,-57.60 -76.80,-57.60,3.57,0.00,1.00,96.00,-57.60 -67.20,-57.60,3.55,0.00,1.00,-81.60,-57.60 -57.60,-52.80,3.52,0.00,1.00,105.60,-52.80 -52.80,-52.80,3.50,0.00,1.00,-72.00,-52.80 -48.00,-48.00,3.48,0.00,1.00,115.20,-48.00 -38.40,-43.20,3.46,0.00,1.00,-62.40,-48.00 -33.60,-43.20,3.44,0.00,1.00,124.80,-43.20 -28.80,-38.40,3.42,0.00,1.00,-52.80,-43.20 -28.80,-33.60,3.40,0.00,1.00,134.40,-38.40 -24.00,-33.60,3.38,0.00,1.00,-43.20,-33.60 -19.20,-28.80,3.35,0.00,1.00,144.00,-28.80 -14.40,-24.00,3.33,0.00,1.00,-33.60,-28.80 -14.40,-19.20,3.31,0.00,1.00,153.60,-24.00 -9.60,-14.40,3.29,0.00,1.00,-24.00,-19.20 -9.60,-14.40,3.27,0.00,1.00,163.20,-14.40 -4.80,-9.60,3.25,0.00,1.00,-14.40,-9.60 -4.80,-4.80,3.23,0.00,1.00,172.80,-9.60 -0.00,0.00,3.20,0.00,1.00,-4.80,-4.80 --4.80,4.80,3.18,0.00,1.00,0.00,0.00 --4.80,9.60,3.16,0.00,1.00,-177.60,4.80 --9.60,9.60,3.14,0.00,1.00,9.60,9.60 --9.60,14.40,3.12,0.00,1.00,-168.00,9.60 --14.40,19.20,3.10,0.00,1.00,19.20,14.40 --19.20,24.00,3.08,0.00,1.00,-158.40,19.20 --24.00,24.00,3.05,0.00,1.00,28.80,24.00 --24.00,28.80,3.03,0.00,1.00,-148.80,24.00 --28.80,33.60,3.01,0.00,1.00,38.40,28.80 --33.60,38.40,2.99,0.00,1.00,-139.20,33.60 --38.40,38.40,2.97,0.00,1.00,48.00,33.60 --43.20,43.20,2.95,0.00,1.00,-129.60,38.40 --48.00,43.20,2.93,0.00,1.00,57.60,43.20 --52.80,48.00,2.91,0.00,1.00,-120.00,43.20 --62.40,48.00,2.88,0.00,1.00,67.20,48.00 --67.20,52.80,2.86,0.00,1.00,-110.40,48.00 --76.80,52.80,2.84,0.00,1.00,76.80,48.00 --86.40,52.80,2.82,0.00,1.00,-100.80,52.80 --91.20,52.80,2.80,0.00,1.00,86.40,52.80 --100.80,52.80,2.78,0.00,1.00,-86.40,52.80 --105.60,52.80,2.76,0.00,1.00,96.00,52.80 --115.20,48.00,2.73,0.00,1.00,-76.80,48.00 --120.00,48.00,2.71,0.00,1.00,105.60,48.00 --129.60,48.00,2.69,0.00,1.00,-67.20,48.00 --134.40,43.20,2.67,0.00,1.00,115.20,43.20 --139.20,43.20,2.65,0.00,1.00,-57.60,43.20 --144.00,38.40,2.63,0.00,1.00,124.80,38.40 --148.80,33.60,2.61,0.00,1.00,-48.00,38.40 --153.60,33.60,2.58,0.00,1.00,134.40,33.60 --158.40,28.80,2.56,0.00,1.00,-38.40,28.80 --158.40,24.00,2.54,0.00,1.00,144.00,28.80 --163.20,19.20,2.52,0.00,1.00,-28.80,24.00 --168.00,19.20,2.50,0.00,1.00,153.60,19.20 --168.00,14.40,2.48,0.00,1.00,-19.20,14.40 --172.80,9.60,2.46,0.00,1.00,163.20,14.40 --177.60,4.80,2.44,0.00,1.00,-9.60,9.60 --177.60,0.00,2.41,0.00,1.00,172.80,4.80 -177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 -177.60,-4.80,2.37,0.00,1.00,-177.60,-0.00 -172.80,-9.60,2.35,0.00,1.00,4.80,-4.80 -168.00,-14.40,2.33,0.00,1.00,-168.00,-9.60 -168.00,-19.20,2.31,0.00,1.00,14.40,-14.40 -163.20,-19.20,2.29,0.00,1.00,-158.40,-14.40 -158.40,-24.00,2.26,0.00,1.00,24.00,-19.20 -158.40,-28.80,2.24,0.00,1.00,-148.80,-24.00 -153.60,-33.60,2.22,0.00,1.00,33.60,-28.80 -148.80,-33.60,2.20,0.00,1.00,-139.20,-28.80 -144.00,-38.40,2.18,0.00,1.00,43.20,-33.60 -139.20,-43.20,2.16,0.00,1.00,-129.60,-38.40 -134.40,-43.20,2.14,0.00,1.00,52.80,-38.40 -129.60,-48.00,2.11,0.00,1.00,-120.00,-43.20 -120.00,-48.00,2.09,0.00,1.00,62.40,-43.20 -115.20,-48.00,2.07,0.00,1.00,-110.40,-48.00 -105.60,-52.80,2.05,0.00,1.00,72.00,-48.00 -100.80,-52.80,2.03,0.00,1.00,-100.80,-48.00 -91.20,-52.80,2.01,0.00,1.00,81.60,-52.80 -86.40,-52.80,1.99,0.00,1.00,-91.20,-52.80 -76.80,-52.80,1.97,0.00,1.00,96.00,-52.80 -67.20,-52.80,1.94,0.00,1.00,-81.60,-52.80 -62.40,-48.00,1.92,0.00,1.00,105.60,-48.00 -52.80,-48.00,1.90,0.00,1.00,-72.00,-48.00 -48.00,-43.20,1.88,0.00,1.00,115.20,-48.00 -43.20,-43.20,1.86,0.00,1.00,-62.40,-43.20 -38.40,-38.40,1.84,0.00,1.00,124.80,-43.20 -33.60,-38.40,1.82,0.00,1.00,-52.80,-38.40 -28.80,-33.60,1.79,0.00,1.00,134.40,-33.60 -24.00,-28.80,1.77,0.00,1.00,-43.20,-33.60 -24.00,-24.00,1.75,0.00,1.00,144.00,-28.80 -19.20,-24.00,1.73,0.00,1.00,-33.60,-24.00 -14.40,-19.20,1.71,0.00,1.00,153.60,-24.00 -9.60,-14.40,1.69,0.00,1.00,-24.00,-19.20 -9.60,-9.60,1.67,0.00,1.00,163.20,-14.40 -4.80,-9.60,1.64,0.00,1.00,-14.40,-9.60 -4.80,-4.80,1.62,0.00,1.00,172.80,-9.60 -0.00,0.00,1.60,0.00,1.00,-4.80,-4.80 --4.80,4.80,1.58,0.00,1.00,0.00,0.00 --4.80,4.80,1.56,0.00,1.00,-177.60,4.80 --9.60,9.60,1.54,0.00,1.00,9.60,4.80 --14.40,14.40,1.52,0.00,1.00,-168.00,9.60 --14.40,19.20,1.50,0.00,1.00,19.20,14.40 --19.20,19.20,1.47,0.00,1.00,-158.40,19.20 --24.00,24.00,1.45,0.00,1.00,28.80,19.20 --28.80,28.80,1.43,0.00,1.00,-148.80,24.00 --33.60,28.80,1.41,0.00,1.00,38.40,28.80 --38.40,33.60,1.39,0.00,1.00,-139.20,28.80 --43.20,38.40,1.37,0.00,1.00,48.00,33.60 --48.00,38.40,1.35,0.00,1.00,-129.60,33.60 --52.80,43.20,1.32,0.00,1.00,57.60,38.40 --57.60,43.20,1.30,0.00,1.00,-120.00,38.40 --62.40,43.20,1.28,0.00,1.00,67.20,43.20 --72.00,48.00,1.26,0.00,1.00,-110.40,43.20 --76.80,48.00,1.24,0.00,1.00,76.80,43.20 --86.40,48.00,1.22,0.00,1.00,-100.80,48.00 --91.20,48.00,1.20,0.00,1.00,86.40,48.00 --100.80,48.00,1.17,0.00,1.00,-86.40,48.00 --105.60,48.00,1.15,0.00,1.00,96.00,48.00 --110.40,48.00,1.13,0.00,1.00,-76.80,48.00 --120.00,43.20,1.11,0.00,1.00,105.60,43.20 --124.80,43.20,1.09,0.00,1.00,-67.20,43.20 --129.60,38.40,1.07,0.00,1.00,115.20,43.20 --134.40,38.40,1.05,0.00,1.00,-57.60,38.40 --139.20,33.60,1.03,0.00,1.00,124.80,38.40 --144.00,33.60,1.00,0.00,1.00,-48.00,33.60 --148.80,28.80,0.98,0.00,1.00,134.40,33.60 --153.60,24.00,0.96,0.00,1.00,-38.40,28.80 --158.40,24.00,0.94,0.00,1.00,144.00,24.00 --163.20,19.20,0.92,0.00,1.00,-28.80,24.00 --163.20,14.40,0.90,0.00,1.00,153.60,19.20 --168.00,14.40,0.88,0.00,1.00,-19.20,14.40 --172.80,9.60,0.85,0.00,1.00,163.20,14.40 --172.80,4.80,0.83,0.00,1.00,-9.60,9.60 --177.60,0.00,0.81,0.00,1.00,172.80,4.80 -177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 -172.80,-4.80,0.77,0.00,1.00,-177.60,-0.00 -172.80,-9.60,0.75,0.00,1.00,4.80,-4.80 -168.00,-14.40,0.73,0.00,1.00,-168.00,-9.60 -163.20,-14.40,0.70,0.00,1.00,14.40,-14.40 -163.20,-19.20,0.68,0.00,1.00,-158.40,-14.40 -158.40,-24.00,0.66,0.00,1.00,24.00,-19.20 -153.60,-24.00,0.64,0.00,1.00,-148.80,-24.00 -148.80,-28.80,0.62,0.00,1.00,33.60,-24.00 -144.00,-33.60,0.60,0.00,1.00,-139.20,-28.80 -139.20,-33.60,0.58,0.00,1.00,43.20,-33.60 -134.40,-38.40,0.56,0.00,1.00,-129.60,-33.60 -129.60,-38.40,0.53,0.00,1.00,52.80,-38.40 -124.80,-43.20,0.51,0.00,1.00,-120.00,-38.40 -120.00,-43.20,0.49,0.00,1.00,62.40,-43.20 -110.40,-48.00,0.47,0.00,1.00,-110.40,-43.20 -105.60,-48.00,0.45,0.00,1.00,72.00,-43.20 -100.80,-48.00,0.43,0.00,1.00,-100.80,-48.00 -91.20,-48.00,0.41,0.00,1.00,81.60,-48.00 -86.40,-48.00,0.38,0.00,1.00,-91.20,-48.00 -76.80,-48.00,0.36,0.00,1.00,96.00,-48.00 -72.00,-48.00,0.34,0.00,1.00,-81.60,-48.00 -62.40,-43.20,0.32,0.00,1.00,105.60,-43.20 -57.60,-43.20,0.30,0.00,1.00,-72.00,-43.20 -52.80,-43.20,0.28,0.00,1.00,115.20,-43.20 -48.00,-38.40,0.26,0.00,1.00,-62.40,-38.40 -43.20,-38.40,0.23,0.00,1.00,124.80,-38.40 -38.40,-33.60,0.21,0.00,1.00,-52.80,-33.60 -33.60,-28.80,0.19,0.00,1.00,134.40,-33.60 -28.80,-28.80,0.17,0.00,1.00,-43.20,-28.80 -24.00,-24.00,0.15,0.00,1.00,144.00,-28.80 -19.20,-19.20,0.13,0.00,1.00,-33.60,-24.00 -14.40,-19.20,0.11,0.00,1.00,153.60,-19.20 -14.40,-14.40,0.09,0.00,1.00,-24.00,-19.20 -9.60,-9.60,0.06,0.00,1.00,163.20,-14.40 -4.80,-4.80,0.04,0.00,1.00,-14.40,-9.60 -4.80,-4.80,0.02,0.00,1.00,172.80,-4.80 -0.00,0.00,0.00,0.00,1.00,-4.80,-4.80 --4.80,4.80,0.00,0.00,1.00,0.00,0.00 --4.80,4.80,0.02,0.00,1.00,-177.60,4.80 --9.60,9.60,0.04,0.00,1.00,9.60,4.80 --14.40,14.40,0.06,0.00,1.00,-168.00,9.60 --19.20,14.40,0.09,0.00,1.00,19.20,14.40 --24.00,19.20,0.11,0.00,1.00,-158.40,14.40 --24.00,24.00,0.13,0.00,1.00,28.80,19.20 --28.80,24.00,0.15,0.00,1.00,-148.80,24.00 --33.60,28.80,0.17,0.00,1.00,38.40,24.00 --38.40,28.80,0.19,0.00,1.00,-139.20,28.80 --43.20,33.60,0.21,0.00,1.00,48.00,28.80 --48.00,33.60,0.23,0.00,1.00,-129.60,33.60 --52.80,38.40,0.26,0.00,1.00,57.60,33.60 --62.40,38.40,0.28,0.00,1.00,-120.00,38.40 --67.20,38.40,0.30,0.00,1.00,67.20,38.40 --72.00,43.20,0.32,0.00,1.00,-110.40,38.40 --76.80,43.20,0.34,0.00,1.00,76.80,38.40 --86.40,43.20,0.36,0.00,1.00,-100.80,43.20 --91.20,43.20,0.38,0.00,1.00,86.40,43.20 --96.00,43.20,0.41,0.00,1.00,-86.40,43.20 --105.60,43.20,0.43,0.00,1.00,96.00,43.20 --110.40,43.20,0.45,0.00,1.00,-76.80,43.20 --115.20,38.40,0.47,0.00,1.00,105.60,38.40 --124.80,38.40,0.49,0.00,1.00,-67.20,38.40 --129.60,38.40,0.51,0.00,1.00,115.20,38.40 --134.40,33.60,0.53,0.00,1.00,-57.60,33.60 --139.20,33.60,0.56,0.00,1.00,124.80,33.60 --144.00,28.80,0.58,0.00,1.00,-48.00,28.80 --148.80,28.80,0.60,0.00,1.00,134.40,28.80 --153.60,24.00,0.62,0.00,1.00,-38.40,24.00 --158.40,19.20,0.64,0.00,1.00,144.00,24.00 --158.40,19.20,0.66,0.00,1.00,-28.80,19.20 --163.20,14.40,0.68,0.00,1.00,153.60,19.20 --168.00,9.60,0.70,0.00,1.00,-19.20,14.40 --172.80,9.60,0.73,0.00,1.00,163.20,9.60 --172.80,4.80,0.75,0.00,1.00,-9.60,9.60 --177.60,0.00,0.77,0.00,1.00,172.80,4.80 -177.60,-0.00,0.79,0.00,1.00,-0.00,0.00 -172.80,-4.80,0.81,0.00,1.00,-177.60,-0.00 -172.80,-9.60,0.83,0.00,1.00,4.80,-4.80 -168.00,-9.60,0.85,0.00,1.00,-168.00,-9.60 -163.20,-14.40,0.88,0.00,1.00,14.40,-9.60 -158.40,-19.20,0.90,0.00,1.00,-158.40,-14.40 -158.40,-19.20,0.92,0.00,1.00,24.00,-19.20 -153.60,-24.00,0.94,0.00,1.00,-148.80,-19.20 -148.80,-28.80,0.96,0.00,1.00,33.60,-24.00 -144.00,-28.80,0.98,0.00,1.00,-139.20,-24.00 -139.20,-33.60,1.00,0.00,1.00,43.20,-28.80 -134.40,-33.60,1.03,0.00,1.00,-129.60,-28.80 -129.60,-38.40,1.05,0.00,1.00,52.80,-33.60 -124.80,-38.40,1.07,0.00,1.00,-120.00,-33.60 -115.20,-38.40,1.09,0.00,1.00,62.40,-38.40 -110.40,-43.20,1.11,0.00,1.00,-110.40,-38.40 -105.60,-43.20,1.13,0.00,1.00,72.00,-38.40 -96.00,-43.20,1.15,0.00,1.00,-100.80,-43.20 -91.20,-43.20,1.17,0.00,1.00,81.60,-43.20 -86.40,-43.20,1.20,0.00,1.00,-91.20,-43.20 -76.80,-43.20,1.22,0.00,1.00,96.00,-43.20 -72.00,-43.20,1.24,0.00,1.00,-81.60,-43.20 -67.20,-38.40,1.26,0.00,1.00,105.60,-38.40 -62.40,-38.40,1.28,0.00,1.00,-72.00,-38.40 -52.80,-38.40,1.30,0.00,1.00,115.20,-38.40 -48.00,-33.60,1.32,0.00,1.00,-62.40,-38.40 -43.20,-33.60,1.35,0.00,1.00,124.80,-33.60 -38.40,-28.80,1.37,0.00,1.00,-52.80,-33.60 -33.60,-28.80,1.39,0.00,1.00,134.40,-28.80 -28.80,-24.00,1.41,0.00,1.00,-43.20,-28.80 -24.00,-24.00,1.43,0.00,1.00,144.00,-24.00 -24.00,-19.20,1.45,0.00,1.00,-33.60,-24.00 -19.20,-14.40,1.47,0.00,1.00,153.60,-19.20 -14.40,-14.40,1.50,0.00,1.00,-24.00,-14.40 -9.60,-9.60,1.52,0.00,1.00,163.20,-14.40 -4.80,-4.80,1.54,0.00,1.00,-14.40,-9.60 -4.80,-4.80,1.56,0.00,1.00,172.80,-4.80 -0.00,0.00,1.58,0.00,1.00,-4.80,-4.80 --4.80,4.80,1.60,0.00,1.00,0.00,0.00 --9.60,4.80,1.62,0.00,1.00,-177.60,4.80 --9.60,9.60,1.64,0.00,1.00,9.60,4.80 --14.40,9.60,1.67,0.00,1.00,-168.00,9.60 --19.20,14.40,1.69,0.00,1.00,19.20,9.60 --24.00,19.20,1.71,0.00,1.00,-158.40,14.40 --28.80,19.20,1.73,0.00,1.00,28.80,19.20 --33.60,24.00,1.75,0.00,1.00,-148.80,19.20 --38.40,24.00,1.77,0.00,1.00,38.40,24.00 --43.20,28.80,1.79,0.00,1.00,-139.20,24.00 --48.00,28.80,1.82,0.00,1.00,48.00,28.80 --52.80,33.60,1.84,0.00,1.00,-129.60,28.80 --57.60,33.60,1.86,0.00,1.00,57.60,28.80 --62.40,33.60,1.88,0.00,1.00,-120.00,33.60 --67.20,38.40,1.90,0.00,1.00,67.20,33.60 --72.00,38.40,1.92,0.00,1.00,-110.40,33.60 --81.60,38.40,1.94,0.00,1.00,76.80,38.40 --86.40,38.40,1.97,0.00,1.00,-100.80,38.40 --91.20,38.40,1.99,0.00,1.00,86.40,38.40 --96.00,38.40,2.01,0.00,1.00,-86.40,38.40 --105.60,38.40,2.03,0.00,1.00,96.00,38.40 --110.40,38.40,2.05,0.00,1.00,-76.80,38.40 --115.20,33.60,2.07,0.00,1.00,105.60,33.60 --120.00,33.60,2.09,0.00,1.00,-67.20,33.60 --124.80,33.60,2.11,0.00,1.00,115.20,33.60 --129.60,28.80,2.14,0.00,1.00,-57.60,33.60 --134.40,28.80,2.16,0.00,1.00,124.80,28.80 --139.20,24.00,2.18,0.00,1.00,-48.00,28.80 --144.00,24.00,2.20,0.00,1.00,134.40,24.00 --148.80,19.20,2.22,0.00,1.00,-38.40,24.00 --153.60,19.20,2.24,0.00,1.00,144.00,19.20 --158.40,14.40,2.26,0.00,1.00,-28.80,19.20 --163.20,14.40,2.29,0.00,1.00,153.60,14.40 --168.00,9.60,2.31,0.00,1.00,-19.20,14.40 --172.80,9.60,2.33,0.00,1.00,163.20,9.60 --172.80,4.80,2.35,0.00,1.00,-9.60,9.60 --177.60,0.00,2.37,0.00,1.00,172.80,4.80 -177.60,-0.00,2.39,0.00,1.00,-0.00,0.00 -172.80,-4.80,2.41,0.00,1.00,-177.60,-0.00 -172.80,-9.60,2.44,0.00,1.00,4.80,-4.80 -168.00,-9.60,2.46,0.00,1.00,-168.00,-9.60 -163.20,-14.40,2.48,0.00,1.00,14.40,-9.60 -158.40,-14.40,2.50,0.00,1.00,-158.40,-14.40 -153.60,-19.20,2.52,0.00,1.00,24.00,-14.40 -148.80,-19.20,2.54,0.00,1.00,-148.80,-19.20 -144.00,-24.00,2.56,0.00,1.00,33.60,-19.20 -139.20,-24.00,2.58,0.00,1.00,-139.20,-24.00 -134.40,-28.80,2.61,0.00,1.00,43.20,-24.00 -129.60,-28.80,2.63,0.00,1.00,-129.60,-28.80 -124.80,-33.60,2.65,0.00,1.00,52.80,-28.80 -120.00,-33.60,2.67,0.00,1.00,-120.00,-33.60 -115.20,-33.60,2.69,0.00,1.00,62.40,-33.60 -110.40,-38.40,2.71,0.00,1.00,-110.40,-33.60 -105.60,-38.40,2.73,0.00,1.00,72.00,-33.60 -96.00,-38.40,2.76,0.00,1.00,-100.80,-38.40 -91.20,-38.40,2.78,0.00,1.00,81.60,-38.40 -86.40,-38.40,2.80,0.00,1.00,-91.20,-38.40 -81.60,-38.40,2.82,0.00,1.00,96.00,-38.40 -72.00,-38.40,2.84,0.00,1.00,-81.60,-38.40 -67.20,-38.40,2.86,0.00,1.00,105.60,-38.40 -62.40,-33.60,2.88,0.00,1.00,-72.00,-33.60 -57.60,-33.60,2.91,0.00,1.00,115.20,-33.60 -52.80,-33.60,2.93,0.00,1.00,-62.40,-33.60 -48.00,-28.80,2.95,0.00,1.00,124.80,-28.80 -43.20,-28.80,2.97,0.00,1.00,-52.80,-28.80 -38.40,-24.00,2.99,0.00,1.00,134.40,-28.80 -33.60,-24.00,3.01,0.00,1.00,-43.20,-24.00 -28.80,-19.20,3.03,0.00,1.00,144.00,-24.00 -24.00,-19.20,3.05,0.00,1.00,-33.60,-19.20 -19.20,-14.40,3.08,0.00,1.00,153.60,-19.20 -14.40,-9.60,3.10,0.00,1.00,-24.00,-14.40 -9.60,-9.60,3.12,0.00,1.00,163.20,-9.60 -9.60,-4.80,3.14,0.00,1.00,-14.40,-9.60 -4.80,-4.80,3.16,0.00,1.00,172.80,-4.80 -0.00,0.00,3.18,0.00,1.00,-4.80,-4.80 --4.80,4.80,3.20,0.00,1.00,0.00,0.00 --9.60,4.80,3.23,0.00,1.00,-177.60,4.80 --14.40,9.60,3.25,0.00,1.00,9.60,4.80 --14.40,9.60,3.27,0.00,1.00,-168.00,9.60 --19.20,14.40,3.29,0.00,1.00,19.20,9.60 --24.00,14.40,3.31,0.00,1.00,-158.40,14.40 --28.80,19.20,3.33,0.00,1.00,28.80,14.40 --33.60,19.20,3.35,0.00,1.00,-148.80,19.20 --38.40,24.00,3.38,0.00,1.00,38.40,19.20 --43.20,24.00,3.40,0.00,1.00,-139.20,19.20 --48.00,24.00,3.42,0.00,1.00,48.00,24.00 --52.80,28.80,3.44,0.00,1.00,-129.60,24.00 --57.60,28.80,3.46,0.00,1.00,57.60,28.80 --62.40,28.80,3.48,0.00,1.00,-120.00,28.80 --67.20,33.60,3.50,0.00,1.00,67.20,28.80 --72.00,33.60,3.52,0.00,1.00,-110.40,28.80 --81.60,33.60,3.55,0.00,1.00,76.80,33.60 --86.40,33.60,3.57,0.00,1.00,-100.80,33.60 --91.20,33.60,3.59,0.00,1.00,86.40,33.60 --96.00,33.60,3.61,0.00,1.00,-86.40,33.60 --100.80,33.60,3.63,0.00,1.00,96.00,33.60 --110.40,33.60,3.65,0.00,1.00,-76.80,33.60 --115.20,33.60,3.67,0.00,1.00,105.60,28.80 --120.00,28.80,3.70,0.00,1.00,-67.20,28.80 --124.80,28.80,3.72,0.00,1.00,115.20,28.80 --129.60,28.80,3.74,0.00,1.00,-57.60,28.80 --134.40,24.00,3.76,0.00,1.00,124.80,24.00 --139.20,24.00,3.78,0.00,1.00,-48.00,24.00 --144.00,19.20,3.80,0.00,1.00,134.40,24.00 --148.80,19.20,3.82,0.00,1.00,-38.40,19.20 --153.60,14.40,3.85,0.00,1.00,144.00,19.20 --158.40,14.40,3.87,0.00,1.00,-28.80,14.40 --163.20,9.60,3.89,0.00,1.00,153.60,14.40 --168.00,9.60,3.91,0.00,1.00,-19.20,9.60 --168.00,4.80,3.93,0.00,1.00,163.20,9.60 --172.80,4.80,3.95,0.00,1.00,-9.60,4.80 --177.60,0.00,3.97,0.00,1.00,172.80,4.80 -177.60,-0.00,3.99,0.00,1.00,-0.00,0.00 -172.80,-4.80,4.02,0.00,1.00,-177.60,-0.00 -168.00,-4.80,4.04,0.00,1.00,4.80,-4.80 -168.00,-9.60,4.06,0.00,1.00,-168.00,-4.80 -163.20,-9.60,4.08,0.00,1.00,14.40,-9.60 -158.40,-14.40,4.10,0.00,1.00,-158.40,-9.60 -153.60,-14.40,4.12,0.00,1.00,24.00,-14.40 -148.80,-19.20,4.14,0.00,1.00,-148.80,-14.40 -144.00,-19.20,4.17,0.00,1.00,33.60,-19.20 -139.20,-24.00,4.19,0.00,1.00,-139.20,-19.20 -134.40,-24.00,4.21,0.00,1.00,43.20,-24.00 -129.60,-28.80,4.23,0.00,1.00,-129.60,-24.00 -124.80,-28.80,4.25,0.00,1.00,52.80,-24.00 -120.00,-28.80,4.27,0.00,1.00,-120.00,-28.80 -115.20,-33.60,4.29,0.00,1.00,62.40,-28.80 -110.40,-33.60,4.32,0.00,1.00,-110.40,-28.80 -100.80,-33.60,4.34,0.00,1.00,72.00,-28.80 -96.00,-33.60,4.36,0.00,1.00,-100.80,-33.60 -91.20,-33.60,4.38,0.00,1.00,81.60,-33.60 -86.40,-33.60,4.40,0.00,1.00,-91.20,-33.60 -81.60,-33.60,4.42,0.00,1.00,96.00,-33.60 -72.00,-33.60,4.44,0.00,1.00,-81.60,-33.60 -67.20,-33.60,4.46,0.00,1.00,105.60,-33.60 -62.40,-28.80,4.49,0.00,1.00,-72.00,-28.80 -57.60,-28.80,4.51,0.00,1.00,115.20,-28.80 -52.80,-28.80,4.53,0.00,1.00,-62.40,-28.80 -48.00,-24.00,4.55,0.00,1.00,124.80,-28.80 -43.20,-24.00,4.57,0.00,1.00,-52.80,-24.00 -38.40,-24.00,4.59,0.00,1.00,134.40,-24.00 -33.60,-19.20,4.61,0.00,1.00,-43.20,-19.20 -28.80,-19.20,4.64,0.00,1.00,144.00,-19.20 -24.00,-14.40,4.66,0.00,1.00,-33.60,-19.20 -19.20,-14.40,4.68,0.00,1.00,153.60,-14.40 -14.40,-9.60,4.70,0.00,1.00,-24.00,-14.40 -14.40,-9.60,4.72,0.00,1.00,163.20,-9.60 -9.60,-4.80,4.74,0.00,1.00,-14.40,-9.60 -4.80,-4.80,4.76,0.00,1.00,172.80,-4.80 -0.00,0.00,4.79,0.00,1.00,-4.80,-4.80 --4.80,0.00,4.81,0.00,1.00,0.00,0.00 --9.60,4.80,4.83,0.00,1.00,-177.60,0.00 --14.40,4.80,4.85,0.00,1.00,9.60,4.80 --19.20,9.60,4.87,0.00,1.00,-168.00,4.80 --19.20,9.60,4.89,0.00,1.00,19.20,9.60 --24.00,14.40,4.91,0.00,1.00,-158.40,9.60 --28.80,14.40,4.93,0.00,1.00,28.80,14.40 --33.60,19.20,4.96,0.00,1.00,-148.80,14.40 --38.40,19.20,4.98,0.00,1.00,38.40,14.40 --43.20,19.20,5.00,0.00,1.00,-139.20,19.20 --48.00,24.00,5.02,0.00,1.00,48.00,19.20 --52.80,24.00,5.04,0.00,1.00,-129.60,24.00 --57.60,24.00,5.06,0.00,1.00,57.60,24.00 --62.40,24.00,5.08,0.00,1.00,-120.00,24.00 --72.00,28.80,5.11,0.00,1.00,67.20,24.00 --76.80,28.80,5.13,0.00,1.00,-110.40,24.00 --81.60,28.80,5.15,0.00,1.00,76.80,28.80 --86.40,28.80,5.17,0.00,1.00,-100.80,28.80 --91.20,28.80,5.19,0.00,1.00,86.40,28.80 --96.00,28.80,5.21,0.00,1.00,-86.40,28.80 --100.80,28.80,5.23,0.00,1.00,96.00,28.80 --105.60,28.80,5.26,0.00,1.00,-76.80,28.80 --115.20,28.80,5.28,0.00,1.00,105.60,28.80 --120.00,24.00,5.30,0.00,1.00,-67.20,24.00 --124.80,24.00,5.32,0.00,1.00,115.20,24.00 --129.60,24.00,5.34,0.00,1.00,-57.60,24.00 --134.40,24.00,5.36,0.00,1.00,124.80,24.00 --139.20,19.20,5.38,0.00,1.00,-48.00,19.20 --144.00,19.20,5.40,0.00,1.00,134.40,19.20 --148.80,14.40,5.43,0.00,1.00,-38.40,19.20 --153.60,14.40,5.45,0.00,1.00,144.00,14.40 --158.40,14.40,5.47,0.00,1.00,-28.80,14.40 --163.20,9.60,5.49,0.00,1.00,153.60,9.60 --163.20,9.60,5.51,0.00,1.00,-19.20,9.60 --168.00,4.80,5.53,0.00,1.00,163.20,9.60 --172.80,4.80,5.55,0.00,1.00,-9.60,4.80 --177.60,0.00,5.58,0.00,1.00,172.80,4.80 -177.60,-0.00,5.60,0.00,1.00,-0.00,0.00 -172.80,-4.80,5.62,0.00,1.00,-177.60,-0.00 -168.00,-4.80,5.64,0.00,1.00,4.80,-4.80 -163.20,-9.60,5.66,0.00,1.00,-168.00,-4.80 -163.20,-9.60,5.68,0.00,1.00,14.40,-9.60 -158.40,-14.40,5.70,0.00,1.00,-158.40,-9.60 -153.60,-14.40,5.72,0.00,1.00,24.00,-9.60 -148.80,-14.40,5.75,0.00,1.00,-148.80,-14.40 -144.00,-19.20,5.77,0.00,1.00,33.60,-14.40 -139.20,-19.20,5.79,0.00,1.00,-139.20,-19.20 -134.40,-24.00,5.81,0.00,1.00,43.20,-19.20 -129.60,-24.00,5.83,0.00,1.00,-129.60,-19.20 -124.80,-24.00,5.85,0.00,1.00,52.80,-24.00 -120.00,-24.00,5.87,0.00,1.00,-120.00,-24.00 -115.20,-28.80,5.90,0.00,1.00,62.40,-24.00 -105.60,-28.80,5.92,0.00,1.00,-110.40,-24.00 -100.80,-28.80,5.94,0.00,1.00,72.00,-28.80 -96.00,-28.80,5.96,0.00,1.00,-100.80,-28.80 -91.20,-28.80,5.98,0.00,1.00,81.60,-28.80 -86.40,-28.80,6.00,0.00,1.00,-91.20,-28.80 -81.60,-28.80,6.02,0.00,1.00,96.00,-28.80 -76.80,-28.80,6.05,0.00,1.00,-81.60,-28.80 -72.00,-28.80,6.07,0.00,1.00,105.60,-28.80 -62.40,-24.00,6.09,0.00,1.00,-72.00,-24.00 -57.60,-24.00,6.11,0.00,1.00,115.20,-24.00 -52.80,-24.00,6.13,0.00,1.00,-62.40,-24.00 -48.00,-24.00,6.15,0.00,1.00,124.80,-24.00 -43.20,-19.20,6.17,0.00,1.00,-52.80,-24.00 -38.40,-19.20,6.19,0.00,1.00,134.40,-19.20 -33.60,-19.20,6.22,0.00,1.00,-43.20,-19.20 -28.80,-14.40,6.24,0.00,1.00,144.00,-14.40 -24.00,-14.40,6.26,0.00,1.00,-33.60,-14.40 -19.20,-9.60,6.28,0.00,1.00,153.60,-14.40 -19.20,-9.60,6.30,0.00,1.00,-24.00,-9.60 -14.40,-4.80,6.32,0.00,1.00,163.20,-9.60 -9.60,-4.80,6.34,0.00,1.00,-14.40,-4.80 -4.80,-0.00,6.37,0.00,1.00,172.80,-4.80 -0.00,0.00,6.39,0.00,1.00,-4.80,-0.00 --4.80,0.00,6.41,0.00,1.00,0.00,0.00 --9.60,4.80,6.43,0.00,1.00,-177.60,0.00 --14.40,4.80,6.45,0.00,1.00,9.60,4.80 --19.20,9.60,6.47,0.00,1.00,-168.00,4.80 --24.00,9.60,6.49,0.00,1.00,19.20,9.60 --28.80,9.60,6.52,0.00,1.00,-158.40,9.60 --33.60,14.40,6.54,0.00,1.00,28.80,9.60 --33.60,14.40,6.56,0.00,1.00,-148.80,14.40 --38.40,14.40,6.58,0.00,1.00,38.40,14.40 --43.20,19.20,6.60,0.00,1.00,-139.20,14.40 --48.00,19.20,6.62,0.00,1.00,48.00,14.40 --57.60,19.20,6.64,0.00,1.00,-129.60,19.20 --62.40,19.20,6.66,0.00,1.00,57.60,19.20 --67.20,24.00,6.69,0.00,1.00,-120.00,19.20 --72.00,24.00,6.71,0.00,1.00,67.20,19.20 --76.80,24.00,6.73,0.00,1.00,-110.40,24.00 --81.60,24.00,6.75,0.00,1.00,76.80,24.00 --86.40,24.00,6.77,0.00,1.00,-100.80,24.00 --91.20,24.00,6.79,0.00,1.00,86.40,24.00 --96.00,24.00,6.81,0.00,1.00,-86.40,24.00 --100.80,24.00,6.84,0.00,1.00,96.00,24.00 --105.60,24.00,6.86,0.00,1.00,-76.80,24.00 --110.40,24.00,6.88,0.00,1.00,105.60,24.00 --115.20,19.20,6.90,0.00,1.00,-67.20,19.20 --120.00,19.20,6.92,0.00,1.00,115.20,19.20 --129.60,19.20,6.94,0.00,1.00,-57.60,19.20 --134.40,19.20,6.96,0.00,1.00,124.80,19.20 --139.20,19.20,6.99,0.00,1.00,-48.00,19.20 --144.00,14.40,7.01,0.00,1.00,134.40,14.40 --148.80,14.40,7.03,0.00,1.00,-38.40,14.40 --148.80,14.40,7.05,0.00,1.00,144.00,14.40 --153.60,9.60,7.07,0.00,1.00,-28.80,9.60 --158.40,9.60,7.09,0.00,1.00,153.60,9.60 --163.20,4.80,7.11,0.00,1.00,-19.20,9.60 --168.00,4.80,7.13,0.00,1.00,163.20,4.80 --172.80,4.80,7.16,0.00,1.00,-9.60,4.80 --177.60,0.00,7.18,0.00,1.00,172.80,4.80 -177.60,-0.00,7.20,0.00,1.00,-0.00,0.00 -172.80,-4.80,7.22,0.00,1.00,-177.60,-0.00 -168.00,-4.80,7.24,0.00,1.00,4.80,-4.80 -163.20,-4.80,7.26,0.00,1.00,-168.00,-4.80 -158.40,-9.60,7.28,0.00,1.00,14.40,-4.80 -153.60,-9.60,7.31,0.00,1.00,-158.40,-9.60 -148.80,-14.40,7.33,0.00,1.00,24.00,-9.60 -148.80,-14.40,7.35,0.00,1.00,-148.80,-9.60 -144.00,-14.40,7.37,0.00,1.00,33.60,-14.40 -139.20,-19.20,7.39,0.00,1.00,-139.20,-14.40 -134.40,-19.20,7.41,0.00,1.00,43.20,-14.40 -129.60,-19.20,7.43,0.00,1.00,-129.60,-19.20 -120.00,-19.20,7.46,0.00,1.00,52.80,-19.20 -115.20,-19.20,7.48,0.00,1.00,-120.00,-19.20 -110.40,-24.00,7.50,0.00,1.00,62.40,-19.20 -105.60,-24.00,7.52,0.00,1.00,-110.40,-19.20 -100.80,-24.00,7.54,0.00,1.00,72.00,-24.00 -96.00,-24.00,7.56,0.00,1.00,-100.80,-24.00 -91.20,-24.00,7.58,0.00,1.00,81.60,-24.00 -86.40,-24.00,7.60,0.00,1.00,-91.20,-24.00 -81.60,-24.00,7.63,0.00,1.00,96.00,-24.00 -76.80,-24.00,7.65,0.00,1.00,-81.60,-24.00 -72.00,-24.00,7.67,0.00,1.00,105.60,-24.00 -67.20,-24.00,7.69,0.00,1.00,-72.00,-24.00 -62.40,-19.20,7.71,0.00,1.00,115.20,-19.20 -57.60,-19.20,7.73,0.00,1.00,-62.40,-19.20 -48.00,-19.20,7.75,0.00,1.00,124.80,-19.20 -43.20,-19.20,7.78,0.00,1.00,-52.80,-19.20 -38.40,-14.40,7.80,0.00,1.00,134.40,-14.40 -33.60,-14.40,7.82,0.00,1.00,-43.20,-14.40 -33.60,-14.40,7.84,0.00,1.00,144.00,-14.40 -28.80,-9.60,7.86,0.00,1.00,-33.60,-14.40 -24.00,-9.60,7.88,0.00,1.00,153.60,-9.60 -19.20,-9.60,7.90,0.00,1.00,-24.00,-9.60 -14.40,-4.80,7.93,0.00,1.00,163.20,-9.60 -9.60,-4.80,7.95,0.00,1.00,-14.40,-4.80 -4.80,-0.00,7.97,0.00,1.00,172.80,-4.80 -0.00,0.00,7.99,0.00,1.00,-4.80,-0.00 --4.80,0.00,8.01,0.00,1.00,0.00,0.00 --9.60,4.80,8.03,0.00,1.00,-177.60,0.00 --14.40,4.80,8.05,0.00,1.00,9.60,4.80 --19.20,4.80,8.07,0.00,1.00,-168.00,4.80 --24.00,9.60,8.10,0.00,1.00,19.20,4.80 --28.80,9.60,8.12,0.00,1.00,-158.40,9.60 --33.60,9.60,8.14,0.00,1.00,24.00,9.60 --38.40,9.60,8.16,0.00,1.00,-148.80,9.60 --43.20,14.40,8.18,0.00,1.00,33.60,9.60 --48.00,14.40,8.20,0.00,1.00,-139.20,14.40 --52.80,14.40,8.22,0.00,1.00,43.20,14.40 --57.60,14.40,8.25,0.00,1.00,-129.60,14.40 --62.40,19.20,8.27,0.00,1.00,52.80,14.40 --67.20,19.20,8.29,0.00,1.00,-120.00,14.40 --72.00,19.20,8.31,0.00,1.00,62.40,14.40 --76.80,19.20,8.33,0.00,1.00,-110.40,19.20 --81.60,19.20,8.35,0.00,1.00,76.80,19.20 --86.40,19.20,8.37,0.00,1.00,-100.80,19.20 --91.20,19.20,8.40,0.00,1.00,86.40,19.20 --96.00,19.20,8.42,0.00,1.00,-86.40,19.20 --100.80,19.20,8.44,0.00,1.00,96.00,19.20 --105.60,19.20,8.46,0.00,1.00,-76.80,19.20 --110.40,19.20,8.48,0.00,1.00,105.60,19.20 --115.20,19.20,8.50,0.00,1.00,-67.20,19.20 --120.00,14.40,8.52,0.00,1.00,120.00,14.40 --124.80,14.40,8.54,0.00,1.00,-57.60,14.40 --129.60,14.40,8.57,0.00,1.00,129.60,14.40 --134.40,14.40,8.59,0.00,1.00,-48.00,14.40 --139.20,14.40,8.61,0.00,1.00,139.20,14.40 --144.00,9.60,8.63,0.00,1.00,-38.40,9.60 --148.80,9.60,8.65,0.00,1.00,148.80,9.60 --153.60,9.60,8.67,0.00,1.00,-28.80,9.60 --158.40,4.80,8.69,0.00,1.00,158.40,9.60 --163.20,4.80,8.72,0.00,1.00,-19.20,4.80 --168.00,4.80,8.74,0.00,1.00,163.20,4.80 --172.80,0.00,8.76,0.00,1.00,-9.60,4.80 --177.60,0.00,8.78,0.00,1.00,172.80,0.00 -177.60,-0.00,8.80,0.00,1.00,-0.00,0.00 -172.80,-0.00,8.82,0.00,1.00,-177.60,-0.00 -168.00,-4.80,8.84,0.00,1.00,4.80,-0.00 -163.20,-4.80,8.87,0.00,1.00,-168.00,-4.80 -158.40,-4.80,8.89,0.00,1.00,14.40,-4.80 -153.60,-9.60,8.91,0.00,1.00,-158.40,-4.80 -148.80,-9.60,8.93,0.00,1.00,24.00,-9.60 -144.00,-9.60,8.95,0.00,1.00,-153.60,-9.60 -139.20,-14.40,8.97,0.00,1.00,33.60,-9.60 -134.40,-14.40,8.99,0.00,1.00,-144.00,-9.60 -129.60,-14.40,9.01,0.00,1.00,43.20,-14.40 -124.80,-14.40,9.04,0.00,1.00,-134.40,-14.40 -120.00,-14.40,9.06,0.00,1.00,52.80,-14.40 -115.20,-19.20,9.08,0.00,1.00,-124.80,-14.40 -110.40,-19.20,9.10,0.00,1.00,62.40,-14.40 -105.60,-19.20,9.12,0.00,1.00,-110.40,-19.20 -100.80,-19.20,9.14,0.00,1.00,72.00,-19.20 -96.00,-19.20,9.16,0.00,1.00,-100.80,-19.20 -91.20,-19.20,9.19,0.00,1.00,81.60,-19.20 -86.40,-19.20,9.21,0.00,1.00,-91.20,-19.20 -81.60,-19.20,9.23,0.00,1.00,96.00,-19.20 -76.80,-19.20,9.25,0.00,1.00,-81.60,-19.20 -72.00,-19.20,9.27,0.00,1.00,105.60,-19.20 -67.20,-19.20,9.29,0.00,1.00,-72.00,-19.20 -62.40,-19.20,9.31,0.00,1.00,115.20,-14.40 -57.60,-14.40,9.34,0.00,1.00,-57.60,-14.40 -52.80,-14.40,9.36,0.00,1.00,124.80,-14.40 -48.00,-14.40,9.38,0.00,1.00,-48.00,-14.40 -43.20,-14.40,9.40,0.00,1.00,134.40,-14.40 -38.40,-9.60,9.42,0.00,1.00,-38.40,-14.40 -33.60,-9.60,9.44,0.00,1.00,144.00,-9.60 -28.80,-9.60,9.46,0.00,1.00,-28.80,-9.60 -24.00,-9.60,9.48,0.00,1.00,153.60,-9.60 -19.20,-4.80,9.51,0.00,1.00,-24.00,-9.60 -14.40,-4.80,9.53,0.00,1.00,163.20,-4.80 -9.60,-4.80,9.55,0.00,1.00,-14.40,-4.80 -4.80,-0.00,9.57,0.00,1.00,172.80,-4.80 -0.00,0.00,9.59,0.00,1.00,-4.80,-0.00 --4.80,0.00,9.61,0.00,1.00,0.00,0.00 --9.60,0.00,9.63,0.00,1.00,-177.60,0.00 --14.40,4.80,9.66,0.00,1.00,9.60,0.00 --19.20,4.80,9.68,0.00,1.00,-168.00,4.80 --24.00,4.80,9.70,0.00,1.00,14.40,4.80 --28.80,4.80,9.72,0.00,1.00,-158.40,4.80 --33.60,9.60,9.74,0.00,1.00,24.00,4.80 --38.40,9.60,9.76,0.00,1.00,-148.80,9.60 --43.20,9.60,9.78,0.00,1.00,33.60,9.60 --48.00,9.60,9.81,0.00,1.00,-139.20,9.60 --52.80,9.60,9.83,0.00,1.00,43.20,9.60 --57.60,14.40,9.85,0.00,1.00,-129.60,9.60 --62.40,14.40,9.87,0.00,1.00,52.80,9.60 --67.20,14.40,9.89,0.00,1.00,-120.00,9.60 --72.00,14.40,9.91,0.00,1.00,62.40,14.40 --76.80,14.40,9.93,0.00,1.00,-110.40,14.40 --81.60,14.40,9.95,0.00,1.00,76.80,14.40 --86.40,14.40,9.98,0.00,1.00,-100.80,14.40 --91.20,14.40,10.00,0.00,1.00,86.40,14.40 --96.00,14.40,10.02,0.00,1.00,-86.40,14.40 --100.80,14.40,10.04,0.00,1.00,96.00,14.40 --105.60,14.40,10.06,0.00,1.00,-76.80,14.40 --110.40,14.40,10.08,0.00,1.00,110.40,14.40 --115.20,14.40,10.10,0.00,1.00,-67.20,14.40 --120.00,14.40,10.13,0.00,1.00,120.00,9.60 --124.80,9.60,10.15,0.00,1.00,-57.60,9.60 --129.60,9.60,10.17,0.00,1.00,129.60,9.60 --134.40,9.60,10.19,0.00,1.00,-48.00,9.60 --139.20,9.60,10.21,0.00,1.00,139.20,9.60 --144.00,9.60,10.23,0.00,1.00,-38.40,9.60 --148.80,9.60,10.25,0.00,1.00,148.80,9.60 --153.60,4.80,10.28,0.00,1.00,-28.80,4.80 --158.40,4.80,10.30,0.00,1.00,158.40,4.80 --163.20,4.80,10.32,0.00,1.00,-19.20,4.80 --168.00,4.80,10.34,0.00,1.00,168.00,4.80 --172.80,0.00,10.36,0.00,1.00,-9.60,4.80 --177.60,0.00,10.38,0.00,1.00,172.80,0.00 -177.60,-0.00,10.40,0.00,1.00,-0.00,0.00 -172.80,-0.00,10.42,0.00,1.00,-177.60,-0.00 -168.00,-4.80,10.45,0.00,1.00,4.80,-0.00 -163.20,-4.80,10.47,0.00,1.00,-168.00,-4.80 -158.40,-4.80,10.49,0.00,1.00,14.40,-4.80 -153.60,-4.80,10.51,0.00,1.00,-163.20,-4.80 -148.80,-9.60,10.53,0.00,1.00,24.00,-4.80 -144.00,-9.60,10.55,0.00,1.00,-153.60,-4.80 -139.20,-9.60,10.57,0.00,1.00,33.60,-9.60 -134.40,-9.60,10.60,0.00,1.00,-144.00,-9.60 -129.60,-9.60,10.62,0.00,1.00,43.20,-9.60 -124.80,-9.60,10.64,0.00,1.00,-134.40,-9.60 -120.00,-14.40,10.66,0.00,1.00,52.80,-9.60 -115.20,-14.40,10.68,0.00,1.00,-124.80,-9.60 -110.40,-14.40,10.70,0.00,1.00,62.40,-9.60 -105.60,-14.40,10.72,0.00,1.00,-115.20,-14.40 -100.80,-14.40,10.74,0.00,1.00,72.00,-14.40 -96.00,-14.40,10.77,0.00,1.00,-100.80,-14.40 -91.20,-14.40,10.79,0.00,1.00,81.60,-14.40 -86.40,-14.40,10.81,0.00,1.00,-91.20,-14.40 -81.60,-14.40,10.83,0.00,1.00,96.00,-14.40 -76.80,-14.40,10.85,0.00,1.00,-81.60,-14.40 -72.00,-14.40,10.87,0.00,1.00,105.60,-14.40 -67.20,-14.40,10.89,0.00,1.00,-67.20,-14.40 -62.40,-14.40,10.92,0.00,1.00,115.20,-14.40 -57.60,-14.40,10.94,0.00,1.00,-57.60,-9.60 -52.80,-9.60,10.96,0.00,1.00,124.80,-9.60 -48.00,-9.60,10.98,0.00,1.00,-48.00,-9.60 -43.20,-9.60,11.00,0.00,1.00,134.40,-9.60 -38.40,-9.60,11.02,0.00,1.00,-38.40,-9.60 -33.60,-9.60,11.04,0.00,1.00,144.00,-9.60 -28.80,-4.80,11.07,0.00,1.00,-28.80,-9.60 -24.00,-4.80,11.09,0.00,1.00,153.60,-4.80 -19.20,-4.80,11.11,0.00,1.00,-19.20,-4.80 -14.40,-4.80,11.13,0.00,1.00,163.20,-4.80 -9.60,-0.00,11.15,0.00,1.00,-14.40,-4.80 -4.80,-0.00,11.17,0.00,1.00,172.80,-0.00 -0.00,0.00,11.19,0.00,1.00,-4.80,-0.00 --4.80,0.00,11.21,0.00,1.00,0.00,0.00 --9.60,0.00,11.24,0.00,1.00,-177.60,0.00 --14.40,0.00,11.26,0.00,1.00,9.60,0.00 --19.20,4.80,11.28,0.00,1.00,-168.00,0.00 --24.00,4.80,11.30,0.00,1.00,14.40,4.80 --28.80,4.80,11.32,0.00,1.00,-158.40,4.80 --33.60,4.80,11.34,0.00,1.00,24.00,4.80 --38.40,4.80,11.36,0.00,1.00,-153.60,4.80 --43.20,4.80,11.39,0.00,1.00,33.60,4.80 --48.00,4.80,11.41,0.00,1.00,-144.00,4.80 --52.80,9.60,11.43,0.00,1.00,43.20,4.80 --57.60,9.60,11.45,0.00,1.00,-134.40,4.80 --62.40,9.60,11.47,0.00,1.00,52.80,4.80 --67.20,9.60,11.49,0.00,1.00,-124.80,9.60 --72.00,9.60,11.51,0.00,1.00,62.40,9.60 --76.80,9.60,11.54,0.00,1.00,-110.40,9.60 --81.60,9.60,11.56,0.00,1.00,72.00,9.60 --86.40,9.60,11.58,0.00,1.00,-100.80,9.60 --91.20,9.60,11.60,0.00,1.00,86.40,9.60 --96.00,9.60,11.62,0.00,1.00,-86.40,9.60 --100.80,9.60,11.64,0.00,1.00,96.00,9.60 --105.60,9.60,11.66,0.00,1.00,-76.80,9.60 --110.40,9.60,11.68,0.00,1.00,110.40,9.60 --115.20,9.60,11.71,0.00,1.00,-67.20,9.60 --120.00,9.60,11.73,0.00,1.00,120.00,9.60 --124.80,9.60,11.75,0.00,1.00,-52.80,9.60 --129.60,9.60,11.77,0.00,1.00,129.60,4.80 --134.40,4.80,11.79,0.00,1.00,-43.20,4.80 --139.20,4.80,11.81,0.00,1.00,139.20,4.80 --144.00,4.80,11.83,0.00,1.00,-33.60,4.80 --148.80,4.80,11.86,0.00,1.00,148.80,4.80 --153.60,4.80,11.88,0.00,1.00,-24.00,4.80 --158.40,4.80,11.90,0.00,1.00,158.40,4.80 --163.20,4.80,11.92,0.00,1.00,-19.20,4.80 --168.00,0.00,11.94,0.00,1.00,168.00,4.80 --172.80,0.00,11.96,0.00,1.00,-9.60,0.00 --177.60,0.00,11.98,0.00,1.00,172.80,0.00 -177.60,-0.00,12.01,0.00,1.00,-0.00,0.00 -172.80,-0.00,12.03,0.00,1.00,-177.60,-0.00 -168.00,-0.00,12.05,0.00,1.00,4.80,-0.00 -163.20,-4.80,12.07,0.00,1.00,-168.00,-0.00 -158.40,-4.80,12.09,0.00,1.00,14.40,-4.80 -153.60,-4.80,12.11,0.00,1.00,-163.20,-4.80 -148.80,-4.80,12.13,0.00,1.00,24.00,-4.80 -144.00,-4.80,12.15,0.00,1.00,-153.60,-4.80 -139.20,-4.80,12.18,0.00,1.00,28.80,-4.80 -134.40,-4.80,12.20,0.00,1.00,-144.00,-4.80 -129.60,-9.60,12.22,0.00,1.00,38.40,-4.80 -124.80,-9.60,12.24,0.00,1.00,-134.40,-4.80 -120.00,-9.60,12.26,0.00,1.00,48.00,-4.80 -115.20,-9.60,12.28,0.00,1.00,-124.80,-9.60 -110.40,-9.60,12.30,0.00,1.00,57.60,-9.60 -105.60,-9.60,12.33,0.00,1.00,-115.20,-9.60 -100.80,-9.60,12.35,0.00,1.00,72.00,-9.60 -96.00,-9.60,12.37,0.00,1.00,-105.60,-9.60 -91.20,-9.60,12.39,0.00,1.00,81.60,-9.60 -86.40,-9.60,12.41,0.00,1.00,-91.20,-9.60 -81.60,-9.60,12.43,0.00,1.00,96.00,-9.60 -76.80,-9.60,12.45,0.00,1.00,-81.60,-9.60 -72.00,-9.60,12.48,0.00,1.00,105.60,-9.60 -67.20,-9.60,12.50,0.00,1.00,-67.20,-9.60 -62.40,-9.60,12.52,0.00,1.00,120.00,-9.60 -57.60,-9.60,12.54,0.00,1.00,-57.60,-9.60 -52.80,-9.60,12.56,0.00,1.00,129.60,-4.80 -48.00,-4.80,12.58,0.00,1.00,-48.00,-4.80 -43.20,-4.80,12.60,0.00,1.00,139.20,-4.80 -38.40,-4.80,12.62,0.00,1.00,-38.40,-4.80 -33.60,-4.80,12.65,0.00,1.00,148.80,-4.80 -28.80,-4.80,12.67,0.00,1.00,-28.80,-4.80 -24.00,-4.80,12.69,0.00,1.00,158.40,-4.80 -19.20,-4.80,12.71,0.00,1.00,-19.20,-4.80 -14.40,-0.00,12.73,0.00,1.00,163.20,-4.80 -9.60,-0.00,12.75,0.00,1.00,-9.60,-0.00 -4.80,-0.00,12.77,0.00,1.00,172.80,-0.00 -0.00,0.00,12.80,0.00,1.00,-4.80,-0.00 --4.80,0.00,12.82,0.00,1.00,0.00,0.00 --9.60,0.00,12.84,0.00,1.00,-177.60,0.00 --14.40,0.00,12.86,0.00,1.00,9.60,0.00 --19.20,0.00,12.88,0.00,1.00,-168.00,0.00 --24.00,0.00,12.90,0.00,1.00,14.40,0.00 --28.80,0.00,12.92,0.00,1.00,-163.20,0.00 --33.60,4.80,12.95,0.00,1.00,24.00,0.00 --38.40,4.80,12.97,0.00,1.00,-153.60,0.00 --43.20,4.80,12.99,0.00,1.00,28.80,0.00 --48.00,4.80,13.01,0.00,1.00,-144.00,4.80 --52.80,4.80,13.03,0.00,1.00,38.40,4.80 --57.60,4.80,13.05,0.00,1.00,-134.40,4.80 --62.40,4.80,13.07,0.00,1.00,48.00,4.80 --67.20,4.80,13.09,0.00,1.00,-124.80,4.80 --72.00,4.80,13.12,0.00,1.00,62.40,4.80 --76.80,4.80,13.14,0.00,1.00,-115.20,4.80 --81.60,4.80,13.16,0.00,1.00,72.00,4.80 --86.40,4.80,13.18,0.00,1.00,-100.80,4.80 --91.20,4.80,13.20,0.00,1.00,86.40,4.80 --96.00,4.80,13.22,0.00,1.00,-86.40,4.80 --100.80,4.80,13.24,0.00,1.00,96.00,4.80 --105.60,4.80,13.27,0.00,1.00,-76.80,4.80 --110.40,4.80,13.29,0.00,1.00,110.40,4.80 --115.20,4.80,13.31,0.00,1.00,-62.40,4.80 --120.00,4.80,13.33,0.00,1.00,120.00,4.80 --124.80,4.80,13.35,0.00,1.00,-52.80,4.80 --129.60,4.80,13.37,0.00,1.00,134.40,4.80 --134.40,4.80,13.39,0.00,1.00,-43.20,4.80 --139.20,4.80,13.42,0.00,1.00,144.00,4.80 --144.00,4.80,13.44,0.00,1.00,-33.60,0.00 --148.80,4.80,13.46,0.00,1.00,153.60,0.00 --153.60,0.00,13.48,0.00,1.00,-24.00,0.00 --158.40,0.00,13.50,0.00,1.00,158.40,0.00 --163.20,0.00,13.52,0.00,1.00,-14.40,0.00 --168.00,0.00,13.54,0.00,1.00,168.00,0.00 --172.80,0.00,13.56,0.00,1.00,-9.60,0.00 --177.60,0.00,13.59,0.00,1.00,172.80,0.00 -177.60,-0.00,13.61,0.00,1.00,-0.00,0.00 -172.80,-0.00,13.63,0.00,1.00,-177.60,-0.00 -168.00,-0.00,13.65,0.00,1.00,4.80,-0.00 -163.20,-0.00,13.67,0.00,1.00,-172.80,-0.00 -158.40,-0.00,13.69,0.00,1.00,14.40,-0.00 -153.60,-0.00,13.71,0.00,1.00,-163.20,-0.00 -148.80,-4.80,13.74,0.00,1.00,19.20,-0.00 -144.00,-4.80,13.76,0.00,1.00,-153.60,-0.00 -139.20,-4.80,13.78,0.00,1.00,28.80,-0.00 -134.40,-4.80,13.80,0.00,1.00,-148.80,-0.00 -129.60,-4.80,13.82,0.00,1.00,38.40,-4.80 -124.80,-4.80,13.84,0.00,1.00,-139.20,-4.80 -120.00,-4.80,13.86,0.00,1.00,48.00,-4.80 -115.20,-4.80,13.89,0.00,1.00,-129.60,-4.80 -110.40,-4.80,13.91,0.00,1.00,57.60,-4.80 -105.60,-4.80,13.93,0.00,1.00,-115.20,-4.80 -100.80,-4.80,13.95,0.00,1.00,67.20,-4.80 -96.00,-4.80,13.97,0.00,1.00,-105.60,-4.80 -91.20,-4.80,13.99,0.00,1.00,81.60,-4.80 -86.40,-4.80,14.01,0.00,1.00,-91.20,-4.80 -81.60,-4.80,14.03,0.00,1.00,96.00,-4.80 -76.80,-4.80,14.06,0.00,1.00,-76.80,-4.80 -72.00,-4.80,14.08,0.00,1.00,105.60,-4.80 -67.20,-4.80,14.10,0.00,1.00,-67.20,-4.80 -62.40,-4.80,14.12,0.00,1.00,120.00,-4.80 -57.60,-4.80,14.14,0.00,1.00,-52.80,-4.80 -52.80,-4.80,14.16,0.00,1.00,129.60,-4.80 -48.00,-4.80,14.18,0.00,1.00,-43.20,-4.80 -43.20,-4.80,14.21,0.00,1.00,139.20,-4.80 -38.40,-4.80,14.23,0.00,1.00,-33.60,-4.80 -33.60,-4.80,14.25,0.00,1.00,148.80,-0.00 -28.80,-0.00,14.27,0.00,1.00,-28.80,-0.00 -24.00,-0.00,14.29,0.00,1.00,158.40,-0.00 -19.20,-0.00,14.31,0.00,1.00,-19.20,-0.00 -14.40,-0.00,14.33,0.00,1.00,163.20,-0.00 -9.60,-0.00,14.36,0.00,1.00,-9.60,-0.00 -4.80,-0.00,14.38,0.00,1.00,172.80,-0.00 -0.00,0.00,14.40,0.00,1.00,-4.80,-0.00 --4.80,0.00,14.42,0.00,1.00,0.00,0.00 --9.60,0.00,14.44,0.00,1.00,-177.60,-0.00 --14.40,0.00,14.46,0.00,1.00,4.80,-0.00 --19.20,0.00,14.48,0.00,1.00,-168.00,-0.00 --24.00,0.00,14.50,0.00,1.00,14.40,-0.00 --28.80,0.00,14.53,0.00,1.00,-163.20,-0.00 --33.60,0.00,14.55,0.00,1.00,19.20,-0.00 --38.40,0.00,14.57,0.00,1.00,-153.60,-0.00 --43.20,0.00,14.59,0.00,1.00,28.80,-0.00 --48.00,0.00,14.61,0.00,1.00,-148.80,-0.00 --52.80,0.00,14.63,0.00,1.00,38.40,-0.00 --57.60,0.00,14.65,0.00,1.00,-139.20,-0.00 --62.40,0.00,14.68,0.00,1.00,48.00,-0.00 --67.20,0.00,14.70,0.00,1.00,-124.80,-0.00 --72.00,0.00,14.72,0.00,1.00,57.60,-0.00 --76.80,0.00,14.74,0.00,1.00,-115.20,-0.00 --81.60,0.00,14.76,0.00,1.00,72.00,-0.00 --86.40,0.00,14.78,0.00,1.00,-100.80,-0.00 --91.20,0.00,14.80,0.00,1.00,86.40,-0.00 --96.00,0.00,14.83,0.00,1.00,-86.40,-0.00 --100.80,0.00,14.85,0.00,1.00,100.80,-0.00 --105.60,0.00,14.87,0.00,1.00,-76.80,-0.00 --110.40,0.00,14.89,0.00,1.00,110.40,-0.00 --115.20,0.00,14.91,0.00,1.00,-62.40,-0.00 --120.00,0.00,14.93,0.00,1.00,124.80,-0.00 --124.80,0.00,14.95,0.00,1.00,-48.00,-0.00 --129.60,0.00,14.97,0.00,1.00,134.40,-0.00 --134.40,0.00,15.00,0.00,1.00,-38.40,-0.00 --139.20,0.00,15.02,0.00,1.00,144.00,-0.00 --144.00,0.00,15.04,0.00,1.00,-28.80,-0.00 --148.80,0.00,15.06,0.00,1.00,153.60,-0.00 --153.60,0.00,15.08,0.00,1.00,-24.00,-0.00 --158.40,0.00,15.10,0.00,1.00,163.20,-0.00 --163.20,0.00,15.12,0.00,1.00,-14.40,-0.00 --168.00,0.00,15.15,0.00,1.00,168.00,-0.00 --172.80,0.00,15.17,0.00,1.00,-9.60,-0.00 --177.60,0.00,15.19,0.00,1.00,172.80,-0.00 -177.60,0.00,15.21,0.00,1.00,-0.00,-0.00 -172.80,0.00,15.23,0.00,1.00,-177.60,0.00 -168.00,0.00,15.25,0.00,1.00,4.80,0.00 -163.20,0.00,15.27,0.00,1.00,-172.80,0.00 -158.40,0.00,15.30,0.00,1.00,9.60,0.00 -153.60,0.00,15.32,0.00,1.00,-163.20,0.00 -148.80,0.00,15.34,0.00,1.00,19.20,0.00 -144.00,0.00,15.36,0.00,1.00,-158.40,0.00 -139.20,0.00,15.38,0.00,1.00,28.80,0.00 -134.40,0.00,15.40,0.00,1.00,-148.80,0.00 -129.60,0.00,15.42,0.00,1.00,33.60,0.00 -124.80,0.00,15.44,0.00,1.00,-139.20,0.00 -120.00,0.00,15.47,0.00,1.00,43.20,0.00 -115.20,0.00,15.49,0.00,1.00,-129.60,0.00 -110.40,0.00,15.51,0.00,1.00,57.60,0.00 -105.60,0.00,15.53,0.00,1.00,-120.00,0.00 -100.80,0.00,15.55,0.00,1.00,67.20,0.00 -96.00,0.00,15.57,0.00,1.00,-105.60,0.00 -91.20,0.00,15.59,0.00,1.00,81.60,0.00 -86.40,0.00,15.62,0.00,1.00,-91.20,0.00 -81.60,0.00,15.64,0.00,1.00,96.00,0.00 -76.80,0.00,15.66,0.00,1.00,-76.80,0.00 -72.00,0.00,15.68,0.00,1.00,110.40,0.00 -67.20,0.00,15.70,0.00,1.00,-67.20,0.00 -62.40,0.00,15.72,0.00,1.00,120.00,0.00 -57.60,0.00,15.74,0.00,1.00,-52.80,0.00 -52.80,0.00,15.77,0.00,1.00,134.40,0.00 -48.00,0.00,15.79,0.00,1.00,-43.20,0.00 -43.20,0.00,15.81,0.00,1.00,144.00,0.00 -38.40,0.00,15.83,0.00,1.00,-33.60,0.00 -33.60,0.00,15.85,0.00,1.00,153.60,0.00 -28.80,0.00,15.87,0.00,1.00,-24.00,0.00 -24.00,0.00,15.89,0.00,1.00,158.40,0.00 -19.20,0.00,15.91,0.00,1.00,-19.20,0.00 -14.40,0.00,15.94,0.00,1.00,168.00,0.00 -9.60,0.00,15.96,0.00,1.00,-9.60,0.00 -4.80,0.00,15.98,0.00,1.00,172.80,0.00 -0.00,0.00,16.00,0.00,1.00,-4.80,0.00 +0.00,4.80,16.00,0.00,1.00,0.00,0.00,0 +0.00,9.60,15.98,0.00,1.00,-177.60,4.80,0 +0.00,14.40,15.96,0.00,1.00,4.80,9.60,0 +0.00,19.20,15.94,0.00,1.00,-168.00,14.40,0 +0.00,24.00,15.91,0.00,1.00,14.40,19.20,0 +0.00,28.80,15.89,0.00,1.00,-163.20,24.00,0 +0.00,33.60,15.87,0.00,1.00,19.20,28.80,0 +0.00,38.40,15.85,0.00,1.00,-153.60,33.60,0 +0.00,43.20,15.83,0.00,1.00,28.80,38.40,0 +0.00,48.00,15.81,0.00,1.00,-148.80,43.20,0 +0.00,52.80,15.79,0.00,1.00,38.40,48.00,0 +0.00,57.60,15.77,0.00,1.00,-139.20,52.80,0 +0.00,62.40,15.74,0.00,1.00,48.00,57.60,0 +4.80,67.20,15.72,0.00,1.00,-124.80,62.40,0 +4.80,72.00,15.70,0.00,1.00,57.60,67.20,0 +4.80,76.80,15.68,0.00,1.00,-115.20,72.00,0 +9.60,81.60,15.66,0.00,1.00,72.00,76.80,0 +19.20,86.40,15.64,0.00,1.00,-100.80,81.60,0 +134.40,86.40,15.62,0.00,1.00,86.40,86.40,0 +168.00,81.60,15.59,0.00,1.00,-86.40,89.20,0 +172.80,76.80,15.57,0.00,1.00,100.80,86.40,0 +177.60,72.00,15.55,0.00,1.00,-76.80,81.60,0 +177.60,67.20,15.53,0.00,1.00,110.40,76.80,0 +177.60,62.40,15.51,0.00,1.00,-62.40,72.00,0 +177.60,57.60,15.49,0.00,1.00,124.80,67.20,0 +177.60,52.80,15.47,0.00,1.00,-52.80,62.40,0 +177.60,48.00,15.44,0.00,1.00,134.40,57.60,0 +177.60,43.20,15.42,0.00,1.00,-38.40,52.80,0 +177.60,38.40,15.40,0.00,1.00,144.00,48.00,0 +177.60,33.60,15.38,0.00,1.00,-33.60,43.20,0 +177.60,28.80,15.36,0.00,1.00,153.60,38.40,0 +177.60,24.00,15.34,0.00,1.00,-24.00,33.60,0 +177.60,19.20,15.32,0.00,1.00,158.40,28.80,0 +177.60,14.40,15.30,0.00,1.00,-14.40,24.00,0 +177.60,9.60,15.27,0.00,1.00,168.00,19.20,0 +177.60,4.80,15.25,0.00,1.00,-9.60,14.40,0 +177.60,0.00,15.23,0.00,1.00,172.80,9.60,0 +-177.60,-0.00,15.21,0.00,1.00,-0.00,4.80,0 +-177.60,-4.80,15.19,0.00,1.00,-177.60,-0.00,0 +-177.60,-9.60,15.17,0.00,1.00,4.80,-4.80,0 +-177.60,-14.40,15.15,0.00,1.00,-172.80,-9.60,0 +-177.60,-19.20,15.12,0.00,1.00,14.40,-14.40,0 +-177.60,-24.00,15.10,0.00,1.00,-163.20,-19.20,0 +-177.60,-28.80,15.08,0.00,1.00,19.20,-24.00,0 +-177.60,-33.60,15.06,0.00,1.00,-158.40,-28.80,0 +-177.60,-38.40,15.04,0.00,1.00,28.80,-33.60,0 +-177.60,-43.20,15.02,0.00,1.00,-148.80,-38.40,0 +-177.60,-48.00,15.00,0.00,1.00,33.60,-48.00,0 +-177.60,-52.80,14.97,0.00,1.00,-139.20,-48.00,0 +-177.60,-57.60,14.95,0.00,1.00,43.20,-52.80,0 +-177.60,-62.40,14.93,0.00,1.00,-129.60,-57.60,0 +-177.60,-67.20,14.91,0.00,1.00,57.60,-62.40,0 +-177.60,-72.00,14.89,0.00,1.00,-120.00,-67.20,0 +-172.80,-76.80,14.87,0.00,1.00,67.20,-76.80,0 +-168.00,-81.60,14.85,0.00,1.00,-105.60,-76.80,0 +-134.40,-86.40,14.83,0.00,1.00,81.60,-86.40,0 +-19.20,-86.40,14.80,0.00,1.00,-91.20,-89.20,0 +-9.60,-81.60,14.78,0.00,1.00,96.00,-86.40,0 +-4.80,-76.80,14.76,0.00,1.00,-76.80,-81.60,0 +-4.80,-72.00,14.74,0.00,1.00,110.40,-76.80,0 +-4.80,-67.20,14.72,0.00,1.00,-67.20,-72.00,0 +-0.00,-62.40,14.70,0.00,1.00,120.00,-67.20,0 +-0.00,-57.60,14.68,0.00,1.00,-52.80,-62.40,0 +-0.00,-52.80,14.65,0.00,1.00,129.60,-57.60,0 +-0.00,-48.00,14.63,0.00,1.00,-43.20,-52.80,0 +-0.00,-43.20,14.61,0.00,1.00,144.00,-48.00,0 +-0.00,-38.40,14.59,0.00,1.00,-33.60,-43.20,0 +-0.00,-33.60,14.57,0.00,1.00,148.80,-38.40,0 +-0.00,-28.80,14.55,0.00,1.00,-24.00,-33.60,0 +-0.00,-24.00,14.53,0.00,1.00,158.40,-28.80,0 +-0.00,-19.20,14.50,0.00,1.00,-19.20,-24.00,0 +-0.00,-14.40,14.48,0.00,1.00,168.00,-19.20,0 +-0.00,-9.60,14.46,0.00,1.00,-9.60,-14.40,0 +-0.00,-4.80,14.44,0.00,1.00,172.80,-9.60,0 +-0.00,0.00,14.42,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,14.40,0.00,1.00,0.00,0.00,0 +-0.00,9.60,14.38,0.00,1.00,-177.60,4.80,0 +-0.00,14.40,14.36,0.00,1.00,9.60,9.60,0 +-0.00,19.20,14.33,0.00,1.00,-168.00,14.40,0 +-0.00,24.00,14.31,0.00,1.00,14.40,19.20,0 +-0.00,28.80,14.29,0.00,1.00,-163.20,24.00,0 +-0.00,33.60,14.27,0.00,1.00,24.00,28.80,0 +-4.80,38.40,14.25,0.00,1.00,-153.60,33.60,0 +-4.80,43.20,14.23,0.00,1.00,28.80,38.40,0 +-4.80,48.00,14.21,0.00,1.00,-144.00,43.20,0 +-4.80,52.80,14.18,0.00,1.00,38.40,48.00,0 +-4.80,57.60,14.16,0.00,1.00,-134.40,52.80,0 +-4.80,62.40,14.14,0.00,1.00,48.00,57.60,0 +-9.60,67.20,14.12,0.00,1.00,-124.80,62.40,0 +-9.60,72.00,14.10,0.00,1.00,62.40,67.20,0 +-14.40,76.80,14.08,0.00,1.00,-115.20,72.00,0 +-24.00,81.60,14.06,0.00,1.00,72.00,76.80,0 +-43.20,86.40,14.03,0.00,1.00,-100.80,81.60,0 +-110.40,86.40,14.01,0.00,1.00,86.40,86.40,0 +-148.80,81.60,13.99,0.00,1.00,-86.40,86.40,0 +-163.20,76.80,13.97,0.00,1.00,96.00,81.60,0 +-168.00,72.00,13.95,0.00,1.00,-76.80,76.80,0 +-172.80,67.20,13.93,0.00,1.00,110.40,72.00,0 +-172.80,62.40,13.91,0.00,1.00,-62.40,67.20,0 +-172.80,57.60,13.89,0.00,1.00,120.00,62.40,0 +-172.80,52.80,13.86,0.00,1.00,-52.80,57.60,0 +-177.60,48.00,13.84,0.00,1.00,134.40,52.80,0 +-177.60,43.20,13.82,0.00,1.00,-43.20,48.00,0 +-177.60,38.40,13.80,0.00,1.00,144.00,43.20,0 +-177.60,33.60,13.78,0.00,1.00,-33.60,38.40,0 +-177.60,28.80,13.76,0.00,1.00,148.80,33.60,0 +-177.60,24.00,13.74,0.00,1.00,-24.00,28.80,0 +-177.60,19.20,13.71,0.00,1.00,158.40,24.00,0 +-177.60,14.40,13.69,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,13.67,0.00,1.00,168.00,14.40,0 +-177.60,4.80,13.65,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,13.63,0.00,1.00,172.80,4.80,0 +177.60,-0.00,13.61,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,13.59,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,13.56,0.00,1.00,4.80,-4.80,0 +177.60,-14.40,13.54,0.00,1.00,-172.80,-9.60,0 +177.60,-19.20,13.52,0.00,1.00,14.40,-14.40,0 +177.60,-24.00,13.50,0.00,1.00,-163.20,-19.20,0 +177.60,-28.80,13.48,0.00,1.00,19.20,-24.00,0 +177.60,-33.60,13.46,0.00,1.00,-153.60,-28.80,0 +177.60,-38.40,13.44,0.00,1.00,28.80,-33.60,0 +177.60,-43.20,13.42,0.00,1.00,-148.80,-38.40,0 +177.60,-48.00,13.39,0.00,1.00,38.40,-43.20,0 +172.80,-52.80,13.37,0.00,1.00,-139.20,-48.00,0 +172.80,-57.60,13.35,0.00,1.00,48.00,-52.80,0 +172.80,-62.40,13.33,0.00,1.00,-124.80,-57.60,0 +172.80,-67.20,13.31,0.00,1.00,57.60,-62.40,0 +168.00,-72.00,13.29,0.00,1.00,-115.20,-67.20,0 +163.20,-76.80,13.27,0.00,1.00,72.00,-72.00,0 +148.80,-81.60,13.24,0.00,1.00,-105.60,-76.80,0 +110.40,-86.40,13.22,0.00,1.00,81.60,-81.60,0 +43.20,-86.40,13.20,0.00,1.00,-91.20,-86.40,0 +24.00,-81.60,13.18,0.00,1.00,96.00,-86.40,0 +14.40,-76.80,13.16,0.00,1.00,-76.80,-81.60,0 +9.60,-72.00,13.14,0.00,1.00,105.60,-76.80,0 +9.60,-67.20,13.12,0.00,1.00,-67.20,-72.00,0 +4.80,-62.40,13.09,0.00,1.00,120.00,-67.20,0 +4.80,-57.60,13.07,0.00,1.00,-57.60,-62.40,0 +4.80,-52.80,13.05,0.00,1.00,129.60,-57.60,0 +4.80,-48.00,13.03,0.00,1.00,-43.20,-52.80,0 +4.80,-43.20,13.01,0.00,1.00,139.20,-48.00,0 +4.80,-38.40,12.99,0.00,1.00,-33.60,-43.20,0 +0.00,-33.60,12.97,0.00,1.00,148.80,-38.40,0 +0.00,-28.80,12.95,0.00,1.00,-28.80,-33.60,0 +0.00,-24.00,12.92,0.00,1.00,158.40,-28.80,0 +0.00,-19.20,12.90,0.00,1.00,-19.20,-24.00,0 +0.00,-14.40,12.88,0.00,1.00,163.20,-19.20,0 +0.00,-9.60,12.86,0.00,1.00,-9.60,-14.40,0 +0.00,-4.80,12.84,0.00,1.00,172.80,-9.60,0 +0.00,0.00,12.82,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,12.80,0.00,1.00,0.00,0.00,0 +-0.00,9.60,12.77,0.00,1.00,-177.60,4.80,0 +-0.00,14.40,12.75,0.00,1.00,9.60,9.60,0 +-4.80,19.20,12.73,0.00,1.00,-168.00,14.40,0 +-4.80,24.00,12.71,0.00,1.00,14.40,19.20,0 +-4.80,28.80,12.69,0.00,1.00,-158.40,24.00,0 +-4.80,33.60,12.67,0.00,1.00,24.00,28.80,0 +-4.80,38.40,12.65,0.00,1.00,-153.60,33.60,0 +-9.60,43.20,12.62,0.00,1.00,33.60,38.40,0 +-9.60,48.00,12.60,0.00,1.00,-144.00,43.20,0 +-9.60,52.80,12.58,0.00,1.00,43.20,48.00,0 +-14.40,57.60,12.56,0.00,1.00,-134.40,52.80,0 +-14.40,62.40,12.54,0.00,1.00,52.80,57.60,0 +-19.20,67.20,12.52,0.00,1.00,-124.80,62.40,0 +-24.00,72.00,12.50,0.00,1.00,62.40,67.20,0 +-33.60,72.00,12.48,0.00,1.00,-110.40,72.00,0 +-43.20,76.80,12.45,0.00,1.00,72.00,72.00,0 +-67.20,81.60,12.43,0.00,1.00,-100.80,76.80,0 +-96.00,81.60,12.41,0.00,1.00,86.40,81.60,0 +-124.80,81.60,12.39,0.00,1.00,-86.40,81.60,0 +-144.00,76.80,12.37,0.00,1.00,96.00,76.80,0 +-153.60,72.00,12.35,0.00,1.00,-76.80,76.80,0 +-158.40,67.20,12.33,0.00,1.00,110.40,72.00,0 +-163.20,62.40,12.30,0.00,1.00,-67.20,67.20,0 +-168.00,57.60,12.28,0.00,1.00,120.00,62.40,0 +-168.00,52.80,12.26,0.00,1.00,-52.80,57.60,0 +-168.00,48.00,12.24,0.00,1.00,129.60,52.80,0 +-172.80,43.20,12.22,0.00,1.00,-43.20,48.00,0 +-172.80,38.40,12.20,0.00,1.00,139.20,43.20,0 +-172.80,33.60,12.18,0.00,1.00,-33.60,38.40,0 +-172.80,28.80,12.15,0.00,1.00,148.80,33.60,0 +-177.60,24.00,12.13,0.00,1.00,-24.00,28.80,0 +-177.60,19.20,12.11,0.00,1.00,158.40,24.00,0 +-177.60,14.40,12.09,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,12.07,0.00,1.00,168.00,14.40,0 +-177.60,4.80,12.05,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,12.03,0.00,1.00,172.80,4.80,0 +177.60,-0.00,12.01,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,11.98,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,11.96,0.00,1.00,4.80,-4.80,0 +177.60,-14.40,11.94,0.00,1.00,-168.00,-9.60,0 +177.60,-19.20,11.92,0.00,1.00,14.40,-14.40,0 +177.60,-24.00,11.90,0.00,1.00,-163.20,-19.20,0 +172.80,-28.80,11.88,0.00,1.00,24.00,-24.00,0 +172.80,-33.60,11.86,0.00,1.00,-153.60,-28.80,0 +172.80,-38.40,11.83,0.00,1.00,28.80,-33.60,0 +172.80,-43.20,11.81,0.00,1.00,-144.00,-38.40,0 +168.00,-48.00,11.79,0.00,1.00,38.40,-43.20,0 +168.00,-52.80,11.77,0.00,1.00,-134.40,-48.00,0 +168.00,-57.60,11.75,0.00,1.00,48.00,-52.80,0 +163.20,-62.40,11.73,0.00,1.00,-124.80,-57.60,0 +158.40,-67.20,11.71,0.00,1.00,62.40,-62.40,0 +153.60,-72.00,11.68,0.00,1.00,-115.20,-67.20,0 +144.00,-76.80,11.66,0.00,1.00,72.00,-72.00,0 +124.80,-81.60,11.64,0.00,1.00,-100.80,-76.80,0 +96.00,-81.60,11.62,0.00,1.00,81.60,-76.80,0 +67.20,-81.60,11.60,0.00,1.00,-91.20,-81.60,0 +43.20,-76.80,11.58,0.00,1.00,96.00,-81.60,0 +33.60,-72.00,11.56,0.00,1.00,-81.60,-76.80,0 +24.00,-72.00,11.54,0.00,1.00,105.60,-72.00,0 +19.20,-67.20,11.51,0.00,1.00,-67.20,-72.00,0 +14.40,-62.40,11.49,0.00,1.00,115.20,-67.20,0 +14.40,-57.60,11.47,0.00,1.00,-57.60,-62.40,0 +9.60,-52.80,11.45,0.00,1.00,129.60,-57.60,0 +9.60,-48.00,11.43,0.00,1.00,-48.00,-52.80,0 +9.60,-43.20,11.41,0.00,1.00,139.20,-48.00,0 +4.80,-38.40,11.39,0.00,1.00,-38.40,-43.20,0 +4.80,-33.60,11.36,0.00,1.00,148.80,-38.40,0 +4.80,-28.80,11.34,0.00,1.00,-28.80,-33.60,0 +4.80,-24.00,11.32,0.00,1.00,153.60,-28.80,0 +4.80,-19.20,11.30,0.00,1.00,-19.20,-24.00,0 +0.00,-14.40,11.28,0.00,1.00,163.20,-19.20,0 +0.00,-9.60,11.26,0.00,1.00,-9.60,-14.40,0 +0.00,-4.80,11.24,0.00,1.00,172.80,-9.60,0 +0.00,0.00,11.21,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,11.19,0.00,1.00,0.00,0.00,0 +-0.00,9.60,11.17,0.00,1.00,-177.60,4.80,0 +-4.80,14.40,11.15,0.00,1.00,9.60,9.60,0 +-4.80,19.20,11.13,0.00,1.00,-168.00,14.40,0 +-4.80,24.00,11.11,0.00,1.00,14.40,19.20,0 +-4.80,28.80,11.09,0.00,1.00,-158.40,24.00,0 +-9.60,33.60,11.07,0.00,1.00,24.00,28.80,0 +-9.60,38.40,11.04,0.00,1.00,-148.80,33.60,0 +-14.40,43.20,11.02,0.00,1.00,33.60,38.40,0 +-14.40,48.00,11.00,0.00,1.00,-139.20,43.20,0 +-14.40,52.80,10.98,0.00,1.00,43.20,48.00,0 +-19.20,57.60,10.96,0.00,1.00,-129.60,52.80,0 +-24.00,57.60,10.94,0.00,1.00,52.80,52.80,0 +-28.80,62.40,10.92,0.00,1.00,-120.00,57.60,0 +-33.60,67.20,10.89,0.00,1.00,62.40,62.40,0 +-43.20,72.00,10.87,0.00,1.00,-110.40,67.20,0 +-57.60,72.00,10.85,0.00,1.00,76.80,72.00,0 +-76.80,76.80,10.83,0.00,1.00,-100.80,72.00,0 +-96.00,76.80,10.81,0.00,1.00,86.40,76.80,0 +-115.20,76.80,10.79,0.00,1.00,-86.40,76.80,0 +-129.60,72.00,10.77,0.00,1.00,96.00,76.80,0 +-139.20,72.00,10.74,0.00,1.00,-76.80,72.00,0 +-148.80,67.20,10.72,0.00,1.00,105.60,67.20,0 +-153.60,62.40,10.70,0.00,1.00,-67.20,67.20,0 +-158.40,57.60,10.68,0.00,1.00,120.00,62.40,0 +-163.20,52.80,10.66,0.00,1.00,-57.60,57.60,0 +-163.20,48.00,10.64,0.00,1.00,129.60,52.80,0 +-168.00,43.20,10.62,0.00,1.00,-48.00,48.00,0 +-168.00,38.40,10.60,0.00,1.00,139.20,43.20,0 +-172.80,33.60,10.57,0.00,1.00,-38.40,38.40,0 +-172.80,28.80,10.55,0.00,1.00,148.80,33.60,0 +-172.80,24.00,10.53,0.00,1.00,-28.80,28.80,0 +-172.80,19.20,10.51,0.00,1.00,158.40,24.00,0 +-177.60,14.40,10.49,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,10.47,0.00,1.00,163.20,14.40,0 +-177.60,4.80,10.45,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,10.42,0.00,1.00,172.80,4.80,0 +177.60,-0.00,10.40,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,10.38,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,10.36,0.00,1.00,4.80,-4.80,0 +177.60,-14.40,10.34,0.00,1.00,-168.00,-9.60,0 +172.80,-19.20,10.32,0.00,1.00,14.40,-14.40,0 +172.80,-24.00,10.30,0.00,1.00,-163.20,-19.20,0 +172.80,-28.80,10.28,0.00,1.00,24.00,-24.00,0 +172.80,-33.60,10.25,0.00,1.00,-153.60,-28.80,0 +168.00,-38.40,10.23,0.00,1.00,33.60,-33.60,0 +168.00,-43.20,10.21,0.00,1.00,-144.00,-38.40,0 +163.20,-48.00,10.19,0.00,1.00,43.20,-43.20,0 +163.20,-52.80,10.17,0.00,1.00,-134.40,-48.00,0 +158.40,-57.60,10.15,0.00,1.00,52.80,-52.80,0 +153.60,-62.40,10.13,0.00,1.00,-124.80,-57.60,0 +148.80,-67.20,10.10,0.00,1.00,62.40,-62.40,0 +139.20,-72.00,10.08,0.00,1.00,-115.20,-67.20,0 +129.60,-72.00,10.06,0.00,1.00,72.00,-67.20,0 +115.20,-76.80,10.04,0.00,1.00,-100.80,-72.00,0 +96.00,-76.80,10.02,0.00,1.00,81.60,-76.80,0 +76.80,-76.80,10.00,0.00,1.00,-91.20,-76.80,0 +57.60,-72.00,9.98,0.00,1.00,96.00,-76.80,0 +43.20,-72.00,9.95,0.00,1.00,-81.60,-72.00,0 +33.60,-67.20,9.93,0.00,1.00,105.60,-72.00,0 +28.80,-62.40,9.91,0.00,1.00,-67.20,-67.20,0 +24.00,-57.60,9.89,0.00,1.00,115.20,-62.40,0 +19.20,-57.60,9.87,0.00,1.00,-57.60,-57.60,0 +14.40,-52.80,9.85,0.00,1.00,124.80,-52.80,0 +14.40,-48.00,9.83,0.00,1.00,-48.00,-52.80,0 +14.40,-43.20,9.81,0.00,1.00,134.40,-48.00,0 +9.60,-38.40,9.78,0.00,1.00,-38.40,-43.20,0 +9.60,-33.60,9.76,0.00,1.00,144.00,-38.40,0 +4.80,-28.80,9.74,0.00,1.00,-28.80,-33.60,0 +4.80,-24.00,9.72,0.00,1.00,153.60,-28.80,0 +4.80,-19.20,9.70,0.00,1.00,-19.20,-24.00,0 +4.80,-14.40,9.68,0.00,1.00,163.20,-19.20,0 +0.00,-9.60,9.66,0.00,1.00,-14.40,-14.40,0 +0.00,-4.80,9.63,0.00,1.00,172.80,-9.60,0 +0.00,0.00,9.61,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,9.59,0.00,1.00,0.00,0.00,0 +-4.80,9.60,9.57,0.00,1.00,-177.60,4.80,0 +-4.80,14.40,9.55,0.00,1.00,9.60,9.60,0 +-4.80,19.20,9.53,0.00,1.00,-168.00,14.40,0 +-9.60,24.00,9.51,0.00,1.00,19.20,19.20,0 +-9.60,28.80,9.48,0.00,1.00,-158.40,24.00,0 +-9.60,33.60,9.46,0.00,1.00,24.00,28.80,0 +-14.40,38.40,9.44,0.00,1.00,-148.80,33.60,0 +-14.40,38.40,9.42,0.00,1.00,33.60,33.60,0 +-19.20,43.20,9.40,0.00,1.00,-139.20,38.40,0 +-24.00,48.00,9.38,0.00,1.00,43.20,43.20,0 +-24.00,52.80,9.36,0.00,1.00,-129.60,48.00,0 +-28.80,57.60,9.34,0.00,1.00,52.80,52.80,0 +-38.40,62.40,9.31,0.00,1.00,-120.00,57.60,0 +-43.20,62.40,9.29,0.00,1.00,67.20,62.40,0 +-52.80,67.20,9.27,0.00,1.00,-110.40,62.40,0 +-62.40,72.00,9.25,0.00,1.00,76.80,67.20,0 +-76.80,72.00,9.23,0.00,1.00,-100.80,67.20,0 +-96.00,72.00,9.21,0.00,1.00,86.40,72.00,0 +-110.40,72.00,9.19,0.00,1.00,-86.40,72.00,0 +-120.00,67.20,9.16,0.00,1.00,96.00,72.00,0 +-134.40,67.20,9.14,0.00,1.00,-76.80,67.20,0 +-139.20,62.40,9.12,0.00,1.00,105.60,67.20,0 +-148.80,57.60,9.10,0.00,1.00,-67.20,62.40,0 +-153.60,57.60,9.08,0.00,1.00,115.20,57.60,0 +-158.40,52.80,9.06,0.00,1.00,-57.60,52.80,0 +-158.40,48.00,9.04,0.00,1.00,129.60,52.80,0 +-163.20,43.20,9.01,0.00,1.00,-48.00,48.00,0 +-163.20,38.40,8.99,0.00,1.00,139.20,43.20,0 +-168.00,33.60,8.97,0.00,1.00,-38.40,38.40,0 +-168.00,28.80,8.95,0.00,1.00,148.80,33.60,0 +-172.80,24.00,8.93,0.00,1.00,-28.80,28.80,0 +-172.80,19.20,8.91,0.00,1.00,153.60,24.00,0 +-172.80,14.40,8.89,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,8.87,0.00,1.00,163.20,14.40,0 +-177.60,4.80,8.84,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,8.82,0.00,1.00,172.80,4.80,0 +177.60,-0.00,8.80,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,8.78,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,8.76,0.00,1.00,4.80,-4.80,0 +172.80,-14.40,8.74,0.00,1.00,-168.00,-9.60,0 +172.80,-19.20,8.72,0.00,1.00,14.40,-14.40,0 +172.80,-24.00,8.69,0.00,1.00,-158.40,-19.20,0 +168.00,-28.80,8.67,0.00,1.00,24.00,-24.00,0 +168.00,-33.60,8.65,0.00,1.00,-153.60,-28.80,0 +163.20,-38.40,8.63,0.00,1.00,33.60,-33.60,0 +163.20,-43.20,8.61,0.00,1.00,-144.00,-38.40,0 +158.40,-48.00,8.59,0.00,1.00,43.20,-43.20,0 +158.40,-52.80,8.57,0.00,1.00,-134.40,-48.00,0 +153.60,-57.60,8.54,0.00,1.00,52.80,-52.80,0 +148.80,-57.60,8.52,0.00,1.00,-124.80,-52.80,0 +139.20,-62.40,8.50,0.00,1.00,62.40,-57.60,0 +134.40,-67.20,8.48,0.00,1.00,-110.40,-62.40,0 +120.00,-67.20,8.46,0.00,1.00,72.00,-67.20,0 +110.40,-72.00,8.44,0.00,1.00,-100.80,-67.20,0 +96.00,-72.00,8.42,0.00,1.00,81.60,-72.00,0 +76.80,-72.00,8.40,0.00,1.00,-91.20,-72.00,0 +62.40,-72.00,8.37,0.00,1.00,96.00,-72.00,0 +52.80,-67.20,8.35,0.00,1.00,-81.60,-67.20,0 +43.20,-62.40,8.33,0.00,1.00,105.60,-67.20,0 +38.40,-62.40,8.31,0.00,1.00,-72.00,-62.40,0 +28.80,-57.60,8.29,0.00,1.00,115.20,-62.40,0 +24.00,-52.80,8.27,0.00,1.00,-57.60,-57.60,0 +24.00,-48.00,8.25,0.00,1.00,124.80,-52.80,0 +19.20,-43.20,8.22,0.00,1.00,-48.00,-48.00,0 +14.40,-38.40,8.20,0.00,1.00,134.40,-43.20,0 +14.40,-38.40,8.18,0.00,1.00,-38.40,-38.40,0 +9.60,-33.60,8.16,0.00,1.00,144.00,-33.60,0 +9.60,-28.80,8.14,0.00,1.00,-28.80,-33.60,0 +9.60,-24.00,8.12,0.00,1.00,153.60,-28.80,0 +4.80,-19.20,8.10,0.00,1.00,-24.00,-24.00,0 +4.80,-14.40,8.07,0.00,1.00,163.20,-19.20,0 +4.80,-9.60,8.05,0.00,1.00,-14.40,-14.40,0 +0.00,-4.80,8.03,0.00,1.00,172.80,-9.60,0 +0.00,0.00,8.01,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,7.99,0.00,1.00,0.00,0.00,0 +-4.80,9.60,7.97,0.00,1.00,-177.60,4.80,0 +-4.80,14.40,7.95,0.00,1.00,9.60,9.60,0 +-9.60,19.20,7.93,0.00,1.00,-168.00,14.40,0 +-9.60,24.00,7.90,0.00,1.00,19.20,19.20,0 +-14.40,24.00,7.88,0.00,1.00,-158.40,24.00,0 +-14.40,28.80,7.86,0.00,1.00,28.80,24.00,0 +-19.20,33.60,7.84,0.00,1.00,-148.80,28.80,0 +-19.20,38.40,7.82,0.00,1.00,38.40,33.60,0 +-24.00,43.20,7.80,0.00,1.00,-139.20,38.40,0 +-28.80,48.00,7.78,0.00,1.00,48.00,43.20,0 +-33.60,52.80,7.75,0.00,1.00,-129.60,48.00,0 +-38.40,52.80,7.73,0.00,1.00,57.60,52.80,0 +-43.20,57.60,7.71,0.00,1.00,-120.00,52.80,0 +-48.00,62.40,7.69,0.00,1.00,67.20,57.60,0 +-57.60,62.40,7.67,0.00,1.00,-110.40,62.40,0 +-67.20,67.20,7.65,0.00,1.00,76.80,62.40,0 +-81.60,67.20,7.63,0.00,1.00,-100.80,62.40,0 +-91.20,67.20,7.60,0.00,1.00,86.40,67.20,0 +-105.60,67.20,7.58,0.00,1.00,-86.40,67.20,0 +-115.20,67.20,7.56,0.00,1.00,96.00,67.20,0 +-124.80,62.40,7.54,0.00,1.00,-76.80,62.40,0 +-134.40,57.60,7.52,0.00,1.00,105.60,62.40,0 +-139.20,57.60,7.50,0.00,1.00,-67.20,57.60,0 +-144.00,52.80,7.48,0.00,1.00,115.20,57.60,0 +-148.80,48.00,7.46,0.00,1.00,-57.60,52.80,0 +-153.60,43.20,7.43,0.00,1.00,124.80,48.00,0 +-158.40,43.20,7.41,0.00,1.00,-48.00,43.20,0 +-163.20,38.40,7.39,0.00,1.00,134.40,38.40,0 +-163.20,33.60,7.37,0.00,1.00,-38.40,38.40,0 +-168.00,28.80,7.35,0.00,1.00,144.00,33.60,0 +-168.00,24.00,7.33,0.00,1.00,-28.80,28.80,0 +-172.80,19.20,7.31,0.00,1.00,153.60,24.00,0 +-172.80,14.40,7.28,0.00,1.00,-19.20,19.20,0 +-177.60,9.60,7.26,0.00,1.00,163.20,14.40,0 +-177.60,4.80,7.24,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,7.22,0.00,1.00,172.80,4.80,0 +177.60,-0.00,7.20,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,7.18,0.00,1.00,-177.60,-0.00,0 +177.60,-9.60,7.16,0.00,1.00,4.80,-4.80,0 +172.80,-14.40,7.13,0.00,1.00,-168.00,-9.60,0 +172.80,-19.20,7.11,0.00,1.00,14.40,-14.40,0 +168.00,-24.00,7.09,0.00,1.00,-158.40,-19.20,0 +168.00,-28.80,7.07,0.00,1.00,24.00,-24.00,0 +163.20,-33.60,7.05,0.00,1.00,-148.80,-28.80,0 +163.20,-38.40,7.03,0.00,1.00,33.60,-33.60,0 +158.40,-43.20,7.01,0.00,1.00,-139.20,-38.40,0 +153.60,-43.20,6.99,0.00,1.00,43.20,-38.40,0 +148.80,-48.00,6.96,0.00,1.00,-129.60,-43.20,0 +144.00,-52.80,6.94,0.00,1.00,52.80,-48.00,0 +139.20,-57.60,6.92,0.00,1.00,-120.00,-52.80,0 +134.40,-57.60,6.90,0.00,1.00,62.40,-57.60,0 +124.80,-62.40,6.88,0.00,1.00,-110.40,-57.60,0 +115.20,-67.20,6.86,0.00,1.00,72.00,-62.40,0 +105.60,-67.20,6.84,0.00,1.00,-100.80,-62.40,0 +91.20,-67.20,6.81,0.00,1.00,81.60,-67.20,0 +81.60,-67.20,6.79,0.00,1.00,-91.20,-67.20,0 +67.20,-67.20,6.77,0.00,1.00,96.00,-67.20,0 +57.60,-62.40,6.75,0.00,1.00,-81.60,-62.40,0 +48.00,-62.40,6.73,0.00,1.00,105.60,-62.40,0 +43.20,-57.60,6.71,0.00,1.00,-72.00,-62.40,0 +38.40,-52.80,6.69,0.00,1.00,115.20,-57.60,0 +33.60,-52.80,6.66,0.00,1.00,-62.40,-52.80,0 +28.80,-48.00,6.64,0.00,1.00,124.80,-52.80,0 +24.00,-43.20,6.62,0.00,1.00,-52.80,-48.00,0 +19.20,-38.40,6.60,0.00,1.00,134.40,-43.20,0 +19.20,-33.60,6.58,0.00,1.00,-43.20,-38.40,0 +14.40,-28.80,6.56,0.00,1.00,144.00,-33.60,0 +14.40,-24.00,6.54,0.00,1.00,-33.60,-28.80,0 +9.60,-24.00,6.52,0.00,1.00,153.60,-24.00,0 +9.60,-19.20,6.49,0.00,1.00,-24.00,-24.00,0 +4.80,-14.40,6.47,0.00,1.00,163.20,-19.20,0 +4.80,-9.60,6.45,0.00,1.00,-14.40,-14.40,0 +0.00,-4.80,6.43,0.00,1.00,172.80,-9.60,0 +0.00,0.00,6.41,0.00,1.00,-4.80,-4.80,0 +-0.00,4.80,6.39,0.00,1.00,0.00,0.00,0 +-4.80,9.60,6.37,0.00,1.00,-177.60,4.80,0 +-4.80,14.40,6.34,0.00,1.00,9.60,9.60,0 +-9.60,19.20,6.32,0.00,1.00,-168.00,14.40,0 +-9.60,19.20,6.30,0.00,1.00,19.20,14.40,0 +-14.40,24.00,6.28,0.00,1.00,-158.40,19.20,0 +-19.20,28.80,6.26,0.00,1.00,28.80,24.00,0 +-19.20,33.60,6.24,0.00,1.00,-148.80,28.80,0 +-24.00,38.40,6.22,0.00,1.00,38.40,33.60,0 +-28.80,43.20,6.19,0.00,1.00,-139.20,38.40,0 +-33.60,43.20,6.17,0.00,1.00,48.00,38.40,0 +-38.40,48.00,6.15,0.00,1.00,-129.60,43.20,0 +-43.20,52.80,6.13,0.00,1.00,57.60,48.00,0 +-48.00,52.80,6.11,0.00,1.00,-120.00,52.80,0 +-52.80,57.60,6.09,0.00,1.00,67.20,52.80,0 +-62.40,57.60,6.07,0.00,1.00,-110.40,57.60,0 +-72.00,62.40,6.05,0.00,1.00,76.80,57.60,0 +-81.60,62.40,6.02,0.00,1.00,-100.80,62.40,0 +-91.20,62.40,6.00,0.00,1.00,86.40,62.40,0 +-100.80,62.40,5.98,0.00,1.00,-86.40,62.40,0 +-110.40,62.40,5.96,0.00,1.00,96.00,62.40,0 +-120.00,57.60,5.94,0.00,1.00,-76.80,57.60,0 +-129.60,57.60,5.92,0.00,1.00,105.60,57.60,0 +-134.40,52.80,5.90,0.00,1.00,-67.20,57.60,0 +-139.20,48.00,5.87,0.00,1.00,115.20,52.80,0 +-144.00,48.00,5.85,0.00,1.00,-57.60,48.00,0 +-148.80,43.20,5.83,0.00,1.00,124.80,48.00,0 +-153.60,38.40,5.81,0.00,1.00,-48.00,43.20,0 +-158.40,33.60,5.79,0.00,1.00,134.40,38.40,0 +-163.20,33.60,5.77,0.00,1.00,-38.40,33.60,0 +-163.20,28.80,5.75,0.00,1.00,144.00,28.80,0 +-168.00,24.00,5.72,0.00,1.00,-28.80,28.80,0 +-168.00,19.20,5.70,0.00,1.00,153.60,24.00,0 +-172.80,14.40,5.68,0.00,1.00,-19.20,19.20,0 +-172.80,9.60,5.66,0.00,1.00,163.20,14.40,0 +-177.60,4.80,5.64,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,5.62,0.00,1.00,172.80,4.80,0 +177.60,-0.00,5.60,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,5.58,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,5.55,0.00,1.00,4.80,-4.80,0 +172.80,-14.40,5.53,0.00,1.00,-168.00,-9.60,0 +168.00,-19.20,5.51,0.00,1.00,14.40,-14.40,0 +168.00,-24.00,5.49,0.00,1.00,-158.40,-19.20,0 +163.20,-28.80,5.47,0.00,1.00,24.00,-24.00,0 +163.20,-33.60,5.45,0.00,1.00,-148.80,-28.80,0 +158.40,-33.60,5.43,0.00,1.00,33.60,-28.80,0 +153.60,-38.40,5.40,0.00,1.00,-139.20,-33.60,0 +148.80,-43.20,5.38,0.00,1.00,43.20,-38.40,0 +144.00,-48.00,5.36,0.00,1.00,-129.60,-43.20,0 +139.20,-48.00,5.34,0.00,1.00,52.80,-48.00,0 +134.40,-52.80,5.32,0.00,1.00,-120.00,-48.00,0 +129.60,-57.60,5.30,0.00,1.00,62.40,-52.80,0 +120.00,-57.60,5.28,0.00,1.00,-110.40,-57.60,0 +110.40,-62.40,5.26,0.00,1.00,72.00,-57.60,0 +100.80,-62.40,5.23,0.00,1.00,-100.80,-57.60,0 +91.20,-62.40,5.21,0.00,1.00,81.60,-62.40,0 +81.60,-62.40,5.19,0.00,1.00,-91.20,-62.40,0 +72.00,-62.40,5.17,0.00,1.00,96.00,-62.40,0 +62.40,-57.60,5.15,0.00,1.00,-81.60,-62.40,0 +52.80,-57.60,5.13,0.00,1.00,105.60,-57.60,0 +48.00,-52.80,5.11,0.00,1.00,-72.00,-57.60,0 +43.20,-52.80,5.08,0.00,1.00,115.20,-52.80,0 +38.40,-48.00,5.06,0.00,1.00,-62.40,-52.80,0 +33.60,-43.20,5.04,0.00,1.00,124.80,-48.00,0 +28.80,-43.20,5.02,0.00,1.00,-52.80,-43.20,0 +24.00,-38.40,5.00,0.00,1.00,134.40,-38.40,0 +19.20,-33.60,4.98,0.00,1.00,-43.20,-38.40,0 +19.20,-28.80,4.96,0.00,1.00,144.00,-33.60,0 +14.40,-24.00,4.93,0.00,1.00,-33.60,-28.80,0 +9.60,-19.20,4.91,0.00,1.00,153.60,-24.00,0 +9.60,-19.20,4.89,0.00,1.00,-24.00,-19.20,0 +4.80,-14.40,4.87,0.00,1.00,163.20,-14.40,0 +4.80,-9.60,4.85,0.00,1.00,-14.40,-14.40,0 +0.00,-4.80,4.83,0.00,1.00,172.80,-9.60,0 +0.00,0.00,4.81,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,4.79,0.00,1.00,0.00,0.00,0 +-4.80,9.60,4.76,0.00,1.00,-177.60,4.80,0 +-9.60,14.40,4.74,0.00,1.00,9.60,9.60,0 +-9.60,14.40,4.72,0.00,1.00,-168.00,9.60,0 +-14.40,19.20,4.70,0.00,1.00,19.20,14.40,0 +-14.40,24.00,4.68,0.00,1.00,-158.40,19.20,0 +-19.20,28.80,4.66,0.00,1.00,28.80,24.00,0 +-24.00,33.60,4.64,0.00,1.00,-148.80,28.80,0 +-28.80,33.60,4.61,0.00,1.00,38.40,28.80,0 +-28.80,38.40,4.59,0.00,1.00,-139.20,33.60,0 +-33.60,43.20,4.57,0.00,1.00,48.00,38.40,0 +-38.40,43.20,4.55,0.00,1.00,-129.60,43.20,0 +-48.00,48.00,4.53,0.00,1.00,57.60,43.20,0 +-52.80,52.80,4.51,0.00,1.00,-120.00,48.00,0 +-57.60,52.80,4.49,0.00,1.00,67.20,48.00,0 +-67.20,57.60,4.46,0.00,1.00,-110.40,52.80,0 +-76.80,57.60,4.44,0.00,1.00,76.80,52.80,0 +-81.60,57.60,4.42,0.00,1.00,-100.80,57.60,0 +-91.20,57.60,4.40,0.00,1.00,86.40,57.60,0 +-100.80,57.60,4.38,0.00,1.00,-86.40,57.60,0 +-110.40,57.60,4.36,0.00,1.00,96.00,57.60,0 +-115.20,52.80,4.34,0.00,1.00,-76.80,52.80,0 +-124.80,52.80,4.32,0.00,1.00,105.60,52.80,0 +-129.60,48.00,4.29,0.00,1.00,-67.20,52.80,0 +-139.20,48.00,4.27,0.00,1.00,115.20,48.00,0 +-144.00,43.20,4.25,0.00,1.00,-57.60,48.00,0 +-148.80,38.40,4.23,0.00,1.00,124.80,43.20,0 +-153.60,38.40,4.21,0.00,1.00,-48.00,38.40,0 +-153.60,33.60,4.19,0.00,1.00,134.40,38.40,0 +-158.40,28.80,4.17,0.00,1.00,-38.40,33.60,0 +-163.20,24.00,4.14,0.00,1.00,144.00,28.80,0 +-163.20,24.00,4.12,0.00,1.00,-28.80,24.00,0 +-168.00,19.20,4.10,0.00,1.00,153.60,24.00,0 +-172.80,14.40,4.08,0.00,1.00,-19.20,19.20,0 +-172.80,9.60,4.06,0.00,1.00,163.20,14.40,0 +-177.60,4.80,4.04,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,4.02,0.00,1.00,172.80,4.80,0 +177.60,-0.00,3.99,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,3.97,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,3.95,0.00,1.00,4.80,-4.80,0 +172.80,-14.40,3.93,0.00,1.00,-168.00,-9.60,0 +168.00,-19.20,3.91,0.00,1.00,14.40,-14.40,0 +163.20,-24.00,3.89,0.00,1.00,-158.40,-19.20,0 +163.20,-24.00,3.87,0.00,1.00,24.00,-24.00,0 +158.40,-28.80,3.85,0.00,1.00,-148.80,-24.00,0 +153.60,-33.60,3.82,0.00,1.00,33.60,-28.80,0 +153.60,-38.40,3.80,0.00,1.00,-139.20,-33.60,0 +148.80,-38.40,3.78,0.00,1.00,43.20,-38.40,0 +144.00,-43.20,3.76,0.00,1.00,-129.60,-38.40,0 +139.20,-48.00,3.74,0.00,1.00,52.80,-43.20,0 +129.60,-48.00,3.72,0.00,1.00,-120.00,-48.00,0 +124.80,-52.80,3.70,0.00,1.00,62.40,-48.00,0 +115.20,-52.80,3.67,0.00,1.00,-110.40,-52.80,0 +110.40,-57.60,3.65,0.00,1.00,72.00,-52.80,0 +100.80,-57.60,3.63,0.00,1.00,-100.80,-52.80,0 +91.20,-57.60,3.61,0.00,1.00,81.60,-57.60,0 +81.60,-57.60,3.59,0.00,1.00,-91.20,-57.60,0 +76.80,-57.60,3.57,0.00,1.00,96.00,-57.60,0 +67.20,-57.60,3.55,0.00,1.00,-81.60,-57.60,0 +57.60,-52.80,3.52,0.00,1.00,105.60,-52.80,0 +52.80,-52.80,3.50,0.00,1.00,-72.00,-52.80,0 +48.00,-48.00,3.48,0.00,1.00,115.20,-48.00,0 +38.40,-43.20,3.46,0.00,1.00,-62.40,-48.00,0 +33.60,-43.20,3.44,0.00,1.00,124.80,-43.20,0 +28.80,-38.40,3.42,0.00,1.00,-52.80,-43.20,0 +28.80,-33.60,3.40,0.00,1.00,134.40,-38.40,0 +24.00,-33.60,3.38,0.00,1.00,-43.20,-33.60,0 +19.20,-28.80,3.35,0.00,1.00,144.00,-28.80,0 +14.40,-24.00,3.33,0.00,1.00,-33.60,-28.80,0 +14.40,-19.20,3.31,0.00,1.00,153.60,-24.00,0 +9.60,-14.40,3.29,0.00,1.00,-24.00,-19.20,0 +9.60,-14.40,3.27,0.00,1.00,163.20,-14.40,0 +4.80,-9.60,3.25,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,3.23,0.00,1.00,172.80,-9.60,0 +0.00,0.00,3.20,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,3.18,0.00,1.00,0.00,0.00,0 +-4.80,9.60,3.16,0.00,1.00,-177.60,4.80,0 +-9.60,9.60,3.14,0.00,1.00,9.60,9.60,0 +-9.60,14.40,3.12,0.00,1.00,-168.00,9.60,0 +-14.40,19.20,3.10,0.00,1.00,19.20,14.40,0 +-19.20,24.00,3.08,0.00,1.00,-158.40,19.20,0 +-24.00,24.00,3.05,0.00,1.00,28.80,24.00,0 +-24.00,28.80,3.03,0.00,1.00,-148.80,24.00,0 +-28.80,33.60,3.01,0.00,1.00,38.40,28.80,0 +-33.60,38.40,2.99,0.00,1.00,-139.20,33.60,0 +-38.40,38.40,2.97,0.00,1.00,48.00,33.60,0 +-43.20,43.20,2.95,0.00,1.00,-129.60,38.40,0 +-48.00,43.20,2.93,0.00,1.00,57.60,43.20,0 +-52.80,48.00,2.91,0.00,1.00,-120.00,43.20,0 +-62.40,48.00,2.88,0.00,1.00,67.20,48.00,0 +-67.20,52.80,2.86,0.00,1.00,-110.40,48.00,0 +-76.80,52.80,2.84,0.00,1.00,76.80,48.00,0 +-86.40,52.80,2.82,0.00,1.00,-100.80,52.80,0 +-91.20,52.80,2.80,0.00,1.00,86.40,52.80,0 +-100.80,52.80,2.78,0.00,1.00,-86.40,52.80,0 +-105.60,52.80,2.76,0.00,1.00,96.00,52.80,0 +-115.20,48.00,2.73,0.00,1.00,-76.80,48.00,0 +-120.00,48.00,2.71,0.00,1.00,105.60,48.00,0 +-129.60,48.00,2.69,0.00,1.00,-67.20,48.00,0 +-134.40,43.20,2.67,0.00,1.00,115.20,43.20,0 +-139.20,43.20,2.65,0.00,1.00,-57.60,43.20,0 +-144.00,38.40,2.63,0.00,1.00,124.80,38.40,0 +-148.80,33.60,2.61,0.00,1.00,-48.00,38.40,0 +-153.60,33.60,2.58,0.00,1.00,134.40,33.60,0 +-158.40,28.80,2.56,0.00,1.00,-38.40,28.80,0 +-158.40,24.00,2.54,0.00,1.00,144.00,28.80,0 +-163.20,19.20,2.52,0.00,1.00,-28.80,24.00,0 +-168.00,19.20,2.50,0.00,1.00,153.60,19.20,0 +-168.00,14.40,2.48,0.00,1.00,-19.20,14.40,0 +-172.80,9.60,2.46,0.00,1.00,163.20,14.40,0 +-177.60,4.80,2.44,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,2.41,0.00,1.00,172.80,4.80,0 +177.60,-0.00,2.39,0.00,1.00,-0.00,0.00,0 +177.60,-4.80,2.37,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,2.35,0.00,1.00,4.80,-4.80,0 +168.00,-14.40,2.33,0.00,1.00,-168.00,-9.60,0 +168.00,-19.20,2.31,0.00,1.00,14.40,-14.40,0 +163.20,-19.20,2.29,0.00,1.00,-158.40,-14.40,0 +158.40,-24.00,2.26,0.00,1.00,24.00,-19.20,0 +158.40,-28.80,2.24,0.00,1.00,-148.80,-24.00,0 +153.60,-33.60,2.22,0.00,1.00,33.60,-28.80,0 +148.80,-33.60,2.20,0.00,1.00,-139.20,-28.80,0 +144.00,-38.40,2.18,0.00,1.00,43.20,-33.60,0 +139.20,-43.20,2.16,0.00,1.00,-129.60,-38.40,0 +134.40,-43.20,2.14,0.00,1.00,52.80,-38.40,0 +129.60,-48.00,2.11,0.00,1.00,-120.00,-43.20,0 +120.00,-48.00,2.09,0.00,1.00,62.40,-43.20,0 +115.20,-48.00,2.07,0.00,1.00,-110.40,-48.00,0 +105.60,-52.80,2.05,0.00,1.00,72.00,-48.00,0 +100.80,-52.80,2.03,0.00,1.00,-100.80,-48.00,0 +91.20,-52.80,2.01,0.00,1.00,81.60,-52.80,0 +86.40,-52.80,1.99,0.00,1.00,-91.20,-52.80,0 +76.80,-52.80,1.97,0.00,1.00,96.00,-52.80,0 +67.20,-52.80,1.94,0.00,1.00,-81.60,-52.80,0 +62.40,-48.00,1.92,0.00,1.00,105.60,-48.00,0 +52.80,-48.00,1.90,0.00,1.00,-72.00,-48.00,0 +48.00,-43.20,1.88,0.00,1.00,115.20,-48.00,0 +43.20,-43.20,1.86,0.00,1.00,-62.40,-43.20,0 +38.40,-38.40,1.84,0.00,1.00,124.80,-43.20,0 +33.60,-38.40,1.82,0.00,1.00,-52.80,-38.40,0 +28.80,-33.60,1.79,0.00,1.00,134.40,-33.60,0 +24.00,-28.80,1.77,0.00,1.00,-43.20,-33.60,0 +24.00,-24.00,1.75,0.00,1.00,144.00,-28.80,0 +19.20,-24.00,1.73,0.00,1.00,-33.60,-24.00,0 +14.40,-19.20,1.71,0.00,1.00,153.60,-24.00,0 +9.60,-14.40,1.69,0.00,1.00,-24.00,-19.20,0 +9.60,-9.60,1.67,0.00,1.00,163.20,-14.40,0 +4.80,-9.60,1.64,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,1.62,0.00,1.00,172.80,-9.60,0 +0.00,0.00,1.60,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,1.58,0.00,1.00,0.00,0.00,0 +-4.80,4.80,1.56,0.00,1.00,-177.60,4.80,0 +-9.60,9.60,1.54,0.00,1.00,9.60,4.80,0 +-14.40,14.40,1.52,0.00,1.00,-168.00,9.60,0 +-14.40,19.20,1.50,0.00,1.00,19.20,14.40,0 +-19.20,19.20,1.47,0.00,1.00,-158.40,19.20,0 +-24.00,24.00,1.45,0.00,1.00,28.80,19.20,0 +-28.80,28.80,1.43,0.00,1.00,-148.80,24.00,0 +-33.60,28.80,1.41,0.00,1.00,38.40,28.80,0 +-38.40,33.60,1.39,0.00,1.00,-139.20,28.80,0 +-43.20,38.40,1.37,0.00,1.00,48.00,33.60,0 +-48.00,38.40,1.35,0.00,1.00,-129.60,33.60,0 +-52.80,43.20,1.32,0.00,1.00,57.60,38.40,0 +-57.60,43.20,1.30,0.00,1.00,-120.00,38.40,0 +-62.40,43.20,1.28,0.00,1.00,67.20,43.20,0 +-72.00,48.00,1.26,0.00,1.00,-110.40,43.20,0 +-76.80,48.00,1.24,0.00,1.00,76.80,43.20,0 +-86.40,48.00,1.22,0.00,1.00,-100.80,48.00,0 +-91.20,48.00,1.20,0.00,1.00,86.40,48.00,0 +-100.80,48.00,1.17,0.00,1.00,-86.40,48.00,0 +-105.60,48.00,1.15,0.00,1.00,96.00,48.00,0 +-110.40,48.00,1.13,0.00,1.00,-76.80,48.00,0 +-120.00,43.20,1.11,0.00,1.00,105.60,43.20,0 +-124.80,43.20,1.09,0.00,1.00,-67.20,43.20,0 +-129.60,38.40,1.07,0.00,1.00,115.20,43.20,0 +-134.40,38.40,1.05,0.00,1.00,-57.60,38.40,0 +-139.20,33.60,1.03,0.00,1.00,124.80,38.40,0 +-144.00,33.60,1.00,0.00,1.00,-48.00,33.60,0 +-148.80,28.80,0.98,0.00,1.00,134.40,33.60,0 +-153.60,24.00,0.96,0.00,1.00,-38.40,28.80,0 +-158.40,24.00,0.94,0.00,1.00,144.00,24.00,0 +-163.20,19.20,0.92,0.00,1.00,-28.80,24.00,0 +-163.20,14.40,0.90,0.00,1.00,153.60,19.20,0 +-168.00,14.40,0.88,0.00,1.00,-19.20,14.40,0 +-172.80,9.60,0.85,0.00,1.00,163.20,14.40,0 +-172.80,4.80,0.83,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,0.81,0.00,1.00,172.80,4.80,0 +177.60,-0.00,0.79,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,0.77,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,0.75,0.00,1.00,4.80,-4.80,0 +168.00,-14.40,0.73,0.00,1.00,-168.00,-9.60,0 +163.20,-14.40,0.70,0.00,1.00,14.40,-14.40,0 +163.20,-19.20,0.68,0.00,1.00,-158.40,-14.40,0 +158.40,-24.00,0.66,0.00,1.00,24.00,-19.20,0 +153.60,-24.00,0.64,0.00,1.00,-148.80,-24.00,0 +148.80,-28.80,0.62,0.00,1.00,33.60,-24.00,0 +144.00,-33.60,0.60,0.00,1.00,-139.20,-28.80,0 +139.20,-33.60,0.58,0.00,1.00,43.20,-33.60,0 +134.40,-38.40,0.56,0.00,1.00,-129.60,-33.60,0 +129.60,-38.40,0.53,0.00,1.00,52.80,-38.40,0 +124.80,-43.20,0.51,0.00,1.00,-120.00,-38.40,0 +120.00,-43.20,0.49,0.00,1.00,62.40,-43.20,0 +110.40,-48.00,0.47,0.00,1.00,-110.40,-43.20,0 +105.60,-48.00,0.45,0.00,1.00,72.00,-43.20,0 +100.80,-48.00,0.43,0.00,1.00,-100.80,-48.00,0 +91.20,-48.00,0.41,0.00,1.00,81.60,-48.00,0 +86.40,-48.00,0.38,0.00,1.00,-91.20,-48.00,0 +76.80,-48.00,0.36,0.00,1.00,96.00,-48.00,0 +72.00,-48.00,0.34,0.00,1.00,-81.60,-48.00,0 +62.40,-43.20,0.32,0.00,1.00,105.60,-43.20,0 +57.60,-43.20,0.30,0.00,1.00,-72.00,-43.20,0 +52.80,-43.20,0.28,0.00,1.00,115.20,-43.20,0 +48.00,-38.40,0.26,0.00,1.00,-62.40,-38.40,0 +43.20,-38.40,0.23,0.00,1.00,124.80,-38.40,0 +38.40,-33.60,0.21,0.00,1.00,-52.80,-33.60,0 +33.60,-28.80,0.19,0.00,1.00,134.40,-33.60,0 +28.80,-28.80,0.17,0.00,1.00,-43.20,-28.80,0 +24.00,-24.00,0.15,0.00,1.00,144.00,-28.80,0 +19.20,-19.20,0.13,0.00,1.00,-33.60,-24.00,0 +14.40,-19.20,0.11,0.00,1.00,153.60,-19.20,0 +14.40,-14.40,0.09,0.00,1.00,-24.00,-19.20,0 +9.60,-9.60,0.06,0.00,1.00,163.20,-14.40,0 +4.80,-4.80,0.04,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,0.02,0.00,1.00,172.80,-4.80,0 +0.00,0.00,0.00,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,0.00,0.00,1.00,0.00,0.00,0 +-4.80,4.80,0.02,0.00,1.00,-177.60,4.80,0 +-9.60,9.60,0.04,0.00,1.00,9.60,4.80,0 +-14.40,14.40,0.06,0.00,1.00,-168.00,9.60,0 +-19.20,14.40,0.09,0.00,1.00,19.20,14.40,0 +-24.00,19.20,0.11,0.00,1.00,-158.40,14.40,0 +-24.00,24.00,0.13,0.00,1.00,28.80,19.20,0 +-28.80,24.00,0.15,0.00,1.00,-148.80,24.00,0 +-33.60,28.80,0.17,0.00,1.00,38.40,24.00,0 +-38.40,28.80,0.19,0.00,1.00,-139.20,28.80,0 +-43.20,33.60,0.21,0.00,1.00,48.00,28.80,0 +-48.00,33.60,0.23,0.00,1.00,-129.60,33.60,0 +-52.80,38.40,0.26,0.00,1.00,57.60,33.60,0 +-62.40,38.40,0.28,0.00,1.00,-120.00,38.40,0 +-67.20,38.40,0.30,0.00,1.00,67.20,38.40,0 +-72.00,43.20,0.32,0.00,1.00,-110.40,38.40,0 +-76.80,43.20,0.34,0.00,1.00,76.80,38.40,0 +-86.40,43.20,0.36,0.00,1.00,-100.80,43.20,0 +-91.20,43.20,0.38,0.00,1.00,86.40,43.20,0 +-96.00,43.20,0.41,0.00,1.00,-86.40,43.20,0 +-105.60,43.20,0.43,0.00,1.00,96.00,43.20,0 +-110.40,43.20,0.45,0.00,1.00,-76.80,43.20,0 +-115.20,38.40,0.47,0.00,1.00,105.60,38.40,0 +-124.80,38.40,0.49,0.00,1.00,-67.20,38.40,0 +-129.60,38.40,0.51,0.00,1.00,115.20,38.40,0 +-134.40,33.60,0.53,0.00,1.00,-57.60,33.60,0 +-139.20,33.60,0.56,0.00,1.00,124.80,33.60,0 +-144.00,28.80,0.58,0.00,1.00,-48.00,28.80,0 +-148.80,28.80,0.60,0.00,1.00,134.40,28.80,0 +-153.60,24.00,0.62,0.00,1.00,-38.40,24.00,0 +-158.40,19.20,0.64,0.00,1.00,144.00,24.00,0 +-158.40,19.20,0.66,0.00,1.00,-28.80,19.20,0 +-163.20,14.40,0.68,0.00,1.00,153.60,19.20,0 +-168.00,9.60,0.70,0.00,1.00,-19.20,14.40,0 +-172.80,9.60,0.73,0.00,1.00,163.20,9.60,0 +-172.80,4.80,0.75,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,0.77,0.00,1.00,172.80,4.80,0 +177.60,-0.00,0.79,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,0.81,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,0.83,0.00,1.00,4.80,-4.80,0 +168.00,-9.60,0.85,0.00,1.00,-168.00,-9.60,0 +163.20,-14.40,0.88,0.00,1.00,14.40,-9.60,0 +158.40,-19.20,0.90,0.00,1.00,-158.40,-14.40,0 +158.40,-19.20,0.92,0.00,1.00,24.00,-19.20,0 +153.60,-24.00,0.94,0.00,1.00,-148.80,-19.20,0 +148.80,-28.80,0.96,0.00,1.00,33.60,-24.00,0 +144.00,-28.80,0.98,0.00,1.00,-139.20,-24.00,0 +139.20,-33.60,1.00,0.00,1.00,43.20,-28.80,0 +134.40,-33.60,1.03,0.00,1.00,-129.60,-28.80,0 +129.60,-38.40,1.05,0.00,1.00,52.80,-33.60,0 +124.80,-38.40,1.07,0.00,1.00,-120.00,-33.60,0 +115.20,-38.40,1.09,0.00,1.00,62.40,-38.40,0 +110.40,-43.20,1.11,0.00,1.00,-110.40,-38.40,0 +105.60,-43.20,1.13,0.00,1.00,72.00,-38.40,0 +96.00,-43.20,1.15,0.00,1.00,-100.80,-43.20,0 +91.20,-43.20,1.17,0.00,1.00,81.60,-43.20,0 +86.40,-43.20,1.20,0.00,1.00,-91.20,-43.20,0 +76.80,-43.20,1.22,0.00,1.00,96.00,-43.20,0 +72.00,-43.20,1.24,0.00,1.00,-81.60,-43.20,0 +67.20,-38.40,1.26,0.00,1.00,105.60,-38.40,0 +62.40,-38.40,1.28,0.00,1.00,-72.00,-38.40,0 +52.80,-38.40,1.30,0.00,1.00,115.20,-38.40,0 +48.00,-33.60,1.32,0.00,1.00,-62.40,-38.40,0 +43.20,-33.60,1.35,0.00,1.00,124.80,-33.60,0 +38.40,-28.80,1.37,0.00,1.00,-52.80,-33.60,0 +33.60,-28.80,1.39,0.00,1.00,134.40,-28.80,0 +28.80,-24.00,1.41,0.00,1.00,-43.20,-28.80,0 +24.00,-24.00,1.43,0.00,1.00,144.00,-24.00,0 +24.00,-19.20,1.45,0.00,1.00,-33.60,-24.00,0 +19.20,-14.40,1.47,0.00,1.00,153.60,-19.20,0 +14.40,-14.40,1.50,0.00,1.00,-24.00,-14.40,0 +9.60,-9.60,1.52,0.00,1.00,163.20,-14.40,0 +4.80,-4.80,1.54,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,1.56,0.00,1.00,172.80,-4.80,0 +0.00,0.00,1.58,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,1.60,0.00,1.00,0.00,0.00,0 +-9.60,4.80,1.62,0.00,1.00,-177.60,4.80,0 +-9.60,9.60,1.64,0.00,1.00,9.60,4.80,0 +-14.40,9.60,1.67,0.00,1.00,-168.00,9.60,0 +-19.20,14.40,1.69,0.00,1.00,19.20,9.60,0 +-24.00,19.20,1.71,0.00,1.00,-158.40,14.40,0 +-28.80,19.20,1.73,0.00,1.00,28.80,19.20,0 +-33.60,24.00,1.75,0.00,1.00,-148.80,19.20,0 +-38.40,24.00,1.77,0.00,1.00,38.40,24.00,0 +-43.20,28.80,1.79,0.00,1.00,-139.20,24.00,0 +-48.00,28.80,1.82,0.00,1.00,48.00,28.80,0 +-52.80,33.60,1.84,0.00,1.00,-129.60,28.80,0 +-57.60,33.60,1.86,0.00,1.00,57.60,28.80,0 +-62.40,33.60,1.88,0.00,1.00,-120.00,33.60,0 +-67.20,38.40,1.90,0.00,1.00,67.20,33.60,0 +-72.00,38.40,1.92,0.00,1.00,-110.40,33.60,0 +-81.60,38.40,1.94,0.00,1.00,76.80,38.40,0 +-86.40,38.40,1.97,0.00,1.00,-100.80,38.40,0 +-91.20,38.40,1.99,0.00,1.00,86.40,38.40,0 +-96.00,38.40,2.01,0.00,1.00,-86.40,38.40,0 +-105.60,38.40,2.03,0.00,1.00,96.00,38.40,0 +-110.40,38.40,2.05,0.00,1.00,-76.80,38.40,0 +-115.20,33.60,2.07,0.00,1.00,105.60,33.60,0 +-120.00,33.60,2.09,0.00,1.00,-67.20,33.60,0 +-124.80,33.60,2.11,0.00,1.00,115.20,33.60,0 +-129.60,28.80,2.14,0.00,1.00,-57.60,33.60,0 +-134.40,28.80,2.16,0.00,1.00,124.80,28.80,0 +-139.20,24.00,2.18,0.00,1.00,-48.00,28.80,0 +-144.00,24.00,2.20,0.00,1.00,134.40,24.00,0 +-148.80,19.20,2.22,0.00,1.00,-38.40,24.00,0 +-153.60,19.20,2.24,0.00,1.00,144.00,19.20,0 +-158.40,14.40,2.26,0.00,1.00,-28.80,19.20,0 +-163.20,14.40,2.29,0.00,1.00,153.60,14.40,0 +-168.00,9.60,2.31,0.00,1.00,-19.20,14.40,0 +-172.80,9.60,2.33,0.00,1.00,163.20,9.60,0 +-172.80,4.80,2.35,0.00,1.00,-9.60,9.60,0 +-177.60,0.00,2.37,0.00,1.00,172.80,4.80,0 +177.60,-0.00,2.39,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,2.41,0.00,1.00,-177.60,-0.00,0 +172.80,-9.60,2.44,0.00,1.00,4.80,-4.80,0 +168.00,-9.60,2.46,0.00,1.00,-168.00,-9.60,0 +163.20,-14.40,2.48,0.00,1.00,14.40,-9.60,0 +158.40,-14.40,2.50,0.00,1.00,-158.40,-14.40,0 +153.60,-19.20,2.52,0.00,1.00,24.00,-14.40,0 +148.80,-19.20,2.54,0.00,1.00,-148.80,-19.20,0 +144.00,-24.00,2.56,0.00,1.00,33.60,-19.20,0 +139.20,-24.00,2.58,0.00,1.00,-139.20,-24.00,0 +134.40,-28.80,2.61,0.00,1.00,43.20,-24.00,0 +129.60,-28.80,2.63,0.00,1.00,-129.60,-28.80,0 +124.80,-33.60,2.65,0.00,1.00,52.80,-28.80,0 +120.00,-33.60,2.67,0.00,1.00,-120.00,-33.60,0 +115.20,-33.60,2.69,0.00,1.00,62.40,-33.60,0 +110.40,-38.40,2.71,0.00,1.00,-110.40,-33.60,0 +105.60,-38.40,2.73,0.00,1.00,72.00,-33.60,0 +96.00,-38.40,2.76,0.00,1.00,-100.80,-38.40,0 +91.20,-38.40,2.78,0.00,1.00,81.60,-38.40,0 +86.40,-38.40,2.80,0.00,1.00,-91.20,-38.40,0 +81.60,-38.40,2.82,0.00,1.00,96.00,-38.40,0 +72.00,-38.40,2.84,0.00,1.00,-81.60,-38.40,0 +67.20,-38.40,2.86,0.00,1.00,105.60,-38.40,0 +62.40,-33.60,2.88,0.00,1.00,-72.00,-33.60,0 +57.60,-33.60,2.91,0.00,1.00,115.20,-33.60,0 +52.80,-33.60,2.93,0.00,1.00,-62.40,-33.60,0 +48.00,-28.80,2.95,0.00,1.00,124.80,-28.80,0 +43.20,-28.80,2.97,0.00,1.00,-52.80,-28.80,0 +38.40,-24.00,2.99,0.00,1.00,134.40,-28.80,0 +33.60,-24.00,3.01,0.00,1.00,-43.20,-24.00,0 +28.80,-19.20,3.03,0.00,1.00,144.00,-24.00,0 +24.00,-19.20,3.05,0.00,1.00,-33.60,-19.20,0 +19.20,-14.40,3.08,0.00,1.00,153.60,-19.20,0 +14.40,-9.60,3.10,0.00,1.00,-24.00,-14.40,0 +9.60,-9.60,3.12,0.00,1.00,163.20,-9.60,0 +9.60,-4.80,3.14,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,3.16,0.00,1.00,172.80,-4.80,0 +0.00,0.00,3.18,0.00,1.00,-4.80,-4.80,0 +-4.80,4.80,3.20,0.00,1.00,0.00,0.00,0 +-9.60,4.80,3.23,0.00,1.00,-177.60,4.80,0 +-14.40,9.60,3.25,0.00,1.00,9.60,4.80,0 +-14.40,9.60,3.27,0.00,1.00,-168.00,9.60,0 +-19.20,14.40,3.29,0.00,1.00,19.20,9.60,0 +-24.00,14.40,3.31,0.00,1.00,-158.40,14.40,0 +-28.80,19.20,3.33,0.00,1.00,28.80,14.40,0 +-33.60,19.20,3.35,0.00,1.00,-148.80,19.20,0 +-38.40,24.00,3.38,0.00,1.00,38.40,19.20,0 +-43.20,24.00,3.40,0.00,1.00,-139.20,19.20,0 +-48.00,24.00,3.42,0.00,1.00,48.00,24.00,0 +-52.80,28.80,3.44,0.00,1.00,-129.60,24.00,0 +-57.60,28.80,3.46,0.00,1.00,57.60,28.80,0 +-62.40,28.80,3.48,0.00,1.00,-120.00,28.80,0 +-67.20,33.60,3.50,0.00,1.00,67.20,28.80,0 +-72.00,33.60,3.52,0.00,1.00,-110.40,28.80,0 +-81.60,33.60,3.55,0.00,1.00,76.80,33.60,0 +-86.40,33.60,3.57,0.00,1.00,-100.80,33.60,0 +-91.20,33.60,3.59,0.00,1.00,86.40,33.60,0 +-96.00,33.60,3.61,0.00,1.00,-86.40,33.60,0 +-100.80,33.60,3.63,0.00,1.00,96.00,33.60,0 +-110.40,33.60,3.65,0.00,1.00,-76.80,33.60,0 +-115.20,33.60,3.67,0.00,1.00,105.60,28.80,0 +-120.00,28.80,3.70,0.00,1.00,-67.20,28.80,0 +-124.80,28.80,3.72,0.00,1.00,115.20,28.80,0 +-129.60,28.80,3.74,0.00,1.00,-57.60,28.80,0 +-134.40,24.00,3.76,0.00,1.00,124.80,24.00,0 +-139.20,24.00,3.78,0.00,1.00,-48.00,24.00,0 +-144.00,19.20,3.80,0.00,1.00,134.40,24.00,0 +-148.80,19.20,3.82,0.00,1.00,-38.40,19.20,0 +-153.60,14.40,3.85,0.00,1.00,144.00,19.20,0 +-158.40,14.40,3.87,0.00,1.00,-28.80,14.40,0 +-163.20,9.60,3.89,0.00,1.00,153.60,14.40,0 +-168.00,9.60,3.91,0.00,1.00,-19.20,9.60,0 +-168.00,4.80,3.93,0.00,1.00,163.20,9.60,0 +-172.80,4.80,3.95,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,3.97,0.00,1.00,172.80,4.80,0 +177.60,-0.00,3.99,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,4.02,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,4.04,0.00,1.00,4.80,-4.80,0 +168.00,-9.60,4.06,0.00,1.00,-168.00,-4.80,0 +163.20,-9.60,4.08,0.00,1.00,14.40,-9.60,0 +158.40,-14.40,4.10,0.00,1.00,-158.40,-9.60,0 +153.60,-14.40,4.12,0.00,1.00,24.00,-14.40,0 +148.80,-19.20,4.14,0.00,1.00,-148.80,-14.40,0 +144.00,-19.20,4.17,0.00,1.00,33.60,-19.20,0 +139.20,-24.00,4.19,0.00,1.00,-139.20,-19.20,0 +134.40,-24.00,4.21,0.00,1.00,43.20,-24.00,0 +129.60,-28.80,4.23,0.00,1.00,-129.60,-24.00,0 +124.80,-28.80,4.25,0.00,1.00,52.80,-24.00,0 +120.00,-28.80,4.27,0.00,1.00,-120.00,-28.80,0 +115.20,-33.60,4.29,0.00,1.00,62.40,-28.80,0 +110.40,-33.60,4.32,0.00,1.00,-110.40,-28.80,0 +100.80,-33.60,4.34,0.00,1.00,72.00,-28.80,0 +96.00,-33.60,4.36,0.00,1.00,-100.80,-33.60,0 +91.20,-33.60,4.38,0.00,1.00,81.60,-33.60,0 +86.40,-33.60,4.40,0.00,1.00,-91.20,-33.60,0 +81.60,-33.60,4.42,0.00,1.00,96.00,-33.60,0 +72.00,-33.60,4.44,0.00,1.00,-81.60,-33.60,0 +67.20,-33.60,4.46,0.00,1.00,105.60,-33.60,0 +62.40,-28.80,4.49,0.00,1.00,-72.00,-28.80,0 +57.60,-28.80,4.51,0.00,1.00,115.20,-28.80,0 +52.80,-28.80,4.53,0.00,1.00,-62.40,-28.80,0 +48.00,-24.00,4.55,0.00,1.00,124.80,-28.80,0 +43.20,-24.00,4.57,0.00,1.00,-52.80,-24.00,0 +38.40,-24.00,4.59,0.00,1.00,134.40,-24.00,0 +33.60,-19.20,4.61,0.00,1.00,-43.20,-19.20,0 +28.80,-19.20,4.64,0.00,1.00,144.00,-19.20,0 +24.00,-14.40,4.66,0.00,1.00,-33.60,-19.20,0 +19.20,-14.40,4.68,0.00,1.00,153.60,-14.40,0 +14.40,-9.60,4.70,0.00,1.00,-24.00,-14.40,0 +14.40,-9.60,4.72,0.00,1.00,163.20,-9.60,0 +9.60,-4.80,4.74,0.00,1.00,-14.40,-9.60,0 +4.80,-4.80,4.76,0.00,1.00,172.80,-4.80,0 +0.00,0.00,4.79,0.00,1.00,-4.80,-4.80,0 +-4.80,0.00,4.81,0.00,1.00,0.00,0.00,0 +-9.60,4.80,4.83,0.00,1.00,-177.60,0.00,0 +-14.40,4.80,4.85,0.00,1.00,9.60,4.80,0 +-19.20,9.60,4.87,0.00,1.00,-168.00,4.80,0 +-19.20,9.60,4.89,0.00,1.00,19.20,9.60,0 +-24.00,14.40,4.91,0.00,1.00,-158.40,9.60,0 +-28.80,14.40,4.93,0.00,1.00,28.80,14.40,0 +-33.60,19.20,4.96,0.00,1.00,-148.80,14.40,0 +-38.40,19.20,4.98,0.00,1.00,38.40,14.40,0 +-43.20,19.20,5.00,0.00,1.00,-139.20,19.20,0 +-48.00,24.00,5.02,0.00,1.00,48.00,19.20,0 +-52.80,24.00,5.04,0.00,1.00,-129.60,24.00,0 +-57.60,24.00,5.06,0.00,1.00,57.60,24.00,0 +-62.40,24.00,5.08,0.00,1.00,-120.00,24.00,0 +-72.00,28.80,5.11,0.00,1.00,67.20,24.00,0 +-76.80,28.80,5.13,0.00,1.00,-110.40,24.00,0 +-81.60,28.80,5.15,0.00,1.00,76.80,28.80,0 +-86.40,28.80,5.17,0.00,1.00,-100.80,28.80,0 +-91.20,28.80,5.19,0.00,1.00,86.40,28.80,0 +-96.00,28.80,5.21,0.00,1.00,-86.40,28.80,0 +-100.80,28.80,5.23,0.00,1.00,96.00,28.80,0 +-105.60,28.80,5.26,0.00,1.00,-76.80,28.80,0 +-115.20,28.80,5.28,0.00,1.00,105.60,28.80,0 +-120.00,24.00,5.30,0.00,1.00,-67.20,24.00,0 +-124.80,24.00,5.32,0.00,1.00,115.20,24.00,0 +-129.60,24.00,5.34,0.00,1.00,-57.60,24.00,0 +-134.40,24.00,5.36,0.00,1.00,124.80,24.00,0 +-139.20,19.20,5.38,0.00,1.00,-48.00,19.20,0 +-144.00,19.20,5.40,0.00,1.00,134.40,19.20,0 +-148.80,14.40,5.43,0.00,1.00,-38.40,19.20,0 +-153.60,14.40,5.45,0.00,1.00,144.00,14.40,0 +-158.40,14.40,5.47,0.00,1.00,-28.80,14.40,0 +-163.20,9.60,5.49,0.00,1.00,153.60,9.60,0 +-163.20,9.60,5.51,0.00,1.00,-19.20,9.60,0 +-168.00,4.80,5.53,0.00,1.00,163.20,9.60,0 +-172.80,4.80,5.55,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,5.58,0.00,1.00,172.80,4.80,0 +177.60,-0.00,5.60,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,5.62,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,5.64,0.00,1.00,4.80,-4.80,0 +163.20,-9.60,5.66,0.00,1.00,-168.00,-4.80,0 +163.20,-9.60,5.68,0.00,1.00,14.40,-9.60,0 +158.40,-14.40,5.70,0.00,1.00,-158.40,-9.60,0 +153.60,-14.40,5.72,0.00,1.00,24.00,-9.60,0 +148.80,-14.40,5.75,0.00,1.00,-148.80,-14.40,0 +144.00,-19.20,5.77,0.00,1.00,33.60,-14.40,0 +139.20,-19.20,5.79,0.00,1.00,-139.20,-19.20,0 +134.40,-24.00,5.81,0.00,1.00,43.20,-19.20,0 +129.60,-24.00,5.83,0.00,1.00,-129.60,-19.20,0 +124.80,-24.00,5.85,0.00,1.00,52.80,-24.00,0 +120.00,-24.00,5.87,0.00,1.00,-120.00,-24.00,0 +115.20,-28.80,5.90,0.00,1.00,62.40,-24.00,0 +105.60,-28.80,5.92,0.00,1.00,-110.40,-24.00,0 +100.80,-28.80,5.94,0.00,1.00,72.00,-28.80,0 +96.00,-28.80,5.96,0.00,1.00,-100.80,-28.80,0 +91.20,-28.80,5.98,0.00,1.00,81.60,-28.80,0 +86.40,-28.80,6.00,0.00,1.00,-91.20,-28.80,0 +81.60,-28.80,6.02,0.00,1.00,96.00,-28.80,0 +76.80,-28.80,6.05,0.00,1.00,-81.60,-28.80,0 +72.00,-28.80,6.07,0.00,1.00,105.60,-28.80,0 +62.40,-24.00,6.09,0.00,1.00,-72.00,-24.00,0 +57.60,-24.00,6.11,0.00,1.00,115.20,-24.00,0 +52.80,-24.00,6.13,0.00,1.00,-62.40,-24.00,0 +48.00,-24.00,6.15,0.00,1.00,124.80,-24.00,0 +43.20,-19.20,6.17,0.00,1.00,-52.80,-24.00,0 +38.40,-19.20,6.19,0.00,1.00,134.40,-19.20,0 +33.60,-19.20,6.22,0.00,1.00,-43.20,-19.20,0 +28.80,-14.40,6.24,0.00,1.00,144.00,-14.40,0 +24.00,-14.40,6.26,0.00,1.00,-33.60,-14.40,0 +19.20,-9.60,6.28,0.00,1.00,153.60,-14.40,0 +19.20,-9.60,6.30,0.00,1.00,-24.00,-9.60,0 +14.40,-4.80,6.32,0.00,1.00,163.20,-9.60,0 +9.60,-4.80,6.34,0.00,1.00,-14.40,-4.80,0 +4.80,-0.00,6.37,0.00,1.00,172.80,-4.80,0 +0.00,0.00,6.39,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,6.41,0.00,1.00,0.00,0.00,0 +-9.60,4.80,6.43,0.00,1.00,-177.60,0.00,0 +-14.40,4.80,6.45,0.00,1.00,9.60,4.80,0 +-19.20,9.60,6.47,0.00,1.00,-168.00,4.80,0 +-24.00,9.60,6.49,0.00,1.00,19.20,9.60,0 +-28.80,9.60,6.52,0.00,1.00,-158.40,9.60,0 +-33.60,14.40,6.54,0.00,1.00,28.80,9.60,0 +-33.60,14.40,6.56,0.00,1.00,-148.80,14.40,0 +-38.40,14.40,6.58,0.00,1.00,38.40,14.40,0 +-43.20,19.20,6.60,0.00,1.00,-139.20,14.40,0 +-48.00,19.20,6.62,0.00,1.00,48.00,14.40,0 +-57.60,19.20,6.64,0.00,1.00,-129.60,19.20,0 +-62.40,19.20,6.66,0.00,1.00,57.60,19.20,0 +-67.20,24.00,6.69,0.00,1.00,-120.00,19.20,0 +-72.00,24.00,6.71,0.00,1.00,67.20,19.20,0 +-76.80,24.00,6.73,0.00,1.00,-110.40,24.00,0 +-81.60,24.00,6.75,0.00,1.00,76.80,24.00,0 +-86.40,24.00,6.77,0.00,1.00,-100.80,24.00,0 +-91.20,24.00,6.79,0.00,1.00,86.40,24.00,0 +-96.00,24.00,6.81,0.00,1.00,-86.40,24.00,0 +-100.80,24.00,6.84,0.00,1.00,96.00,24.00,0 +-105.60,24.00,6.86,0.00,1.00,-76.80,24.00,0 +-110.40,24.00,6.88,0.00,1.00,105.60,24.00,0 +-115.20,19.20,6.90,0.00,1.00,-67.20,19.20,0 +-120.00,19.20,6.92,0.00,1.00,115.20,19.20,0 +-129.60,19.20,6.94,0.00,1.00,-57.60,19.20,0 +-134.40,19.20,6.96,0.00,1.00,124.80,19.20,0 +-139.20,19.20,6.99,0.00,1.00,-48.00,19.20,0 +-144.00,14.40,7.01,0.00,1.00,134.40,14.40,0 +-148.80,14.40,7.03,0.00,1.00,-38.40,14.40,0 +-148.80,14.40,7.05,0.00,1.00,144.00,14.40,0 +-153.60,9.60,7.07,0.00,1.00,-28.80,9.60,0 +-158.40,9.60,7.09,0.00,1.00,153.60,9.60,0 +-163.20,4.80,7.11,0.00,1.00,-19.20,9.60,0 +-168.00,4.80,7.13,0.00,1.00,163.20,4.80,0 +-172.80,4.80,7.16,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,7.18,0.00,1.00,172.80,4.80,0 +177.60,-0.00,7.20,0.00,1.00,-0.00,0.00,0 +172.80,-4.80,7.22,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,7.24,0.00,1.00,4.80,-4.80,0 +163.20,-4.80,7.26,0.00,1.00,-168.00,-4.80,0 +158.40,-9.60,7.28,0.00,1.00,14.40,-4.80,0 +153.60,-9.60,7.31,0.00,1.00,-158.40,-9.60,0 +148.80,-14.40,7.33,0.00,1.00,24.00,-9.60,0 +148.80,-14.40,7.35,0.00,1.00,-148.80,-9.60,0 +144.00,-14.40,7.37,0.00,1.00,33.60,-14.40,0 +139.20,-19.20,7.39,0.00,1.00,-139.20,-14.40,0 +134.40,-19.20,7.41,0.00,1.00,43.20,-14.40,0 +129.60,-19.20,7.43,0.00,1.00,-129.60,-19.20,0 +120.00,-19.20,7.46,0.00,1.00,52.80,-19.20,0 +115.20,-19.20,7.48,0.00,1.00,-120.00,-19.20,0 +110.40,-24.00,7.50,0.00,1.00,62.40,-19.20,0 +105.60,-24.00,7.52,0.00,1.00,-110.40,-19.20,0 +100.80,-24.00,7.54,0.00,1.00,72.00,-24.00,0 +96.00,-24.00,7.56,0.00,1.00,-100.80,-24.00,0 +91.20,-24.00,7.58,0.00,1.00,81.60,-24.00,0 +86.40,-24.00,7.60,0.00,1.00,-91.20,-24.00,0 +81.60,-24.00,7.63,0.00,1.00,96.00,-24.00,0 +76.80,-24.00,7.65,0.00,1.00,-81.60,-24.00,0 +72.00,-24.00,7.67,0.00,1.00,105.60,-24.00,0 +67.20,-24.00,7.69,0.00,1.00,-72.00,-24.00,0 +62.40,-19.20,7.71,0.00,1.00,115.20,-19.20,0 +57.60,-19.20,7.73,0.00,1.00,-62.40,-19.20,0 +48.00,-19.20,7.75,0.00,1.00,124.80,-19.20,0 +43.20,-19.20,7.78,0.00,1.00,-52.80,-19.20,0 +38.40,-14.40,7.80,0.00,1.00,134.40,-14.40,0 +33.60,-14.40,7.82,0.00,1.00,-43.20,-14.40,0 +33.60,-14.40,7.84,0.00,1.00,144.00,-14.40,0 +28.80,-9.60,7.86,0.00,1.00,-33.60,-14.40,0 +24.00,-9.60,7.88,0.00,1.00,153.60,-9.60,0 +19.20,-9.60,7.90,0.00,1.00,-24.00,-9.60,0 +14.40,-4.80,7.93,0.00,1.00,163.20,-9.60,0 +9.60,-4.80,7.95,0.00,1.00,-14.40,-4.80,0 +4.80,-0.00,7.97,0.00,1.00,172.80,-4.80,0 +0.00,0.00,7.99,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,8.01,0.00,1.00,0.00,0.00,0 +-9.60,4.80,8.03,0.00,1.00,-177.60,0.00,0 +-14.40,4.80,8.05,0.00,1.00,9.60,4.80,0 +-19.20,4.80,8.07,0.00,1.00,-168.00,4.80,0 +-24.00,9.60,8.10,0.00,1.00,19.20,4.80,0 +-28.80,9.60,8.12,0.00,1.00,-158.40,9.60,0 +-33.60,9.60,8.14,0.00,1.00,24.00,9.60,0 +-38.40,9.60,8.16,0.00,1.00,-148.80,9.60,0 +-43.20,14.40,8.18,0.00,1.00,33.60,9.60,0 +-48.00,14.40,8.20,0.00,1.00,-139.20,14.40,0 +-52.80,14.40,8.22,0.00,1.00,43.20,14.40,0 +-57.60,14.40,8.25,0.00,1.00,-129.60,14.40,0 +-62.40,19.20,8.27,0.00,1.00,52.80,14.40,0 +-67.20,19.20,8.29,0.00,1.00,-120.00,14.40,0 +-72.00,19.20,8.31,0.00,1.00,62.40,14.40,0 +-76.80,19.20,8.33,0.00,1.00,-110.40,19.20,0 +-81.60,19.20,8.35,0.00,1.00,76.80,19.20,0 +-86.40,19.20,8.37,0.00,1.00,-100.80,19.20,0 +-91.20,19.20,8.40,0.00,1.00,86.40,19.20,0 +-96.00,19.20,8.42,0.00,1.00,-86.40,19.20,0 +-100.80,19.20,8.44,0.00,1.00,96.00,19.20,0 +-105.60,19.20,8.46,0.00,1.00,-76.80,19.20,0 +-110.40,19.20,8.48,0.00,1.00,105.60,19.20,0 +-115.20,19.20,8.50,0.00,1.00,-67.20,19.20,0 +-120.00,14.40,8.52,0.00,1.00,120.00,14.40,0 +-124.80,14.40,8.54,0.00,1.00,-57.60,14.40,0 +-129.60,14.40,8.57,0.00,1.00,129.60,14.40,0 +-134.40,14.40,8.59,0.00,1.00,-48.00,14.40,0 +-139.20,14.40,8.61,0.00,1.00,139.20,14.40,0 +-144.00,9.60,8.63,0.00,1.00,-38.40,9.60,0 +-148.80,9.60,8.65,0.00,1.00,148.80,9.60,0 +-153.60,9.60,8.67,0.00,1.00,-28.80,9.60,0 +-158.40,4.80,8.69,0.00,1.00,158.40,9.60,0 +-163.20,4.80,8.72,0.00,1.00,-19.20,4.80,0 +-168.00,4.80,8.74,0.00,1.00,163.20,4.80,0 +-172.80,0.00,8.76,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,8.78,0.00,1.00,172.80,0.00,0 +177.60,-0.00,8.80,0.00,1.00,-0.00,0.00,0 +172.80,-0.00,8.82,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,8.84,0.00,1.00,4.80,-0.00,0 +163.20,-4.80,8.87,0.00,1.00,-168.00,-4.80,0 +158.40,-4.80,8.89,0.00,1.00,14.40,-4.80,0 +153.60,-9.60,8.91,0.00,1.00,-158.40,-4.80,0 +148.80,-9.60,8.93,0.00,1.00,24.00,-9.60,0 +144.00,-9.60,8.95,0.00,1.00,-153.60,-9.60,0 +139.20,-14.40,8.97,0.00,1.00,33.60,-9.60,0 +134.40,-14.40,8.99,0.00,1.00,-144.00,-9.60,0 +129.60,-14.40,9.01,0.00,1.00,43.20,-14.40,0 +124.80,-14.40,9.04,0.00,1.00,-134.40,-14.40,0 +120.00,-14.40,9.06,0.00,1.00,52.80,-14.40,0 +115.20,-19.20,9.08,0.00,1.00,-124.80,-14.40,0 +110.40,-19.20,9.10,0.00,1.00,62.40,-14.40,0 +105.60,-19.20,9.12,0.00,1.00,-110.40,-19.20,0 +100.80,-19.20,9.14,0.00,1.00,72.00,-19.20,0 +96.00,-19.20,9.16,0.00,1.00,-100.80,-19.20,0 +91.20,-19.20,9.19,0.00,1.00,81.60,-19.20,0 +86.40,-19.20,9.21,0.00,1.00,-91.20,-19.20,0 +81.60,-19.20,9.23,0.00,1.00,96.00,-19.20,0 +76.80,-19.20,9.25,0.00,1.00,-81.60,-19.20,0 +72.00,-19.20,9.27,0.00,1.00,105.60,-19.20,0 +67.20,-19.20,9.29,0.00,1.00,-72.00,-19.20,0 +62.40,-19.20,9.31,0.00,1.00,115.20,-14.40,0 +57.60,-14.40,9.34,0.00,1.00,-57.60,-14.40,0 +52.80,-14.40,9.36,0.00,1.00,124.80,-14.40,0 +48.00,-14.40,9.38,0.00,1.00,-48.00,-14.40,0 +43.20,-14.40,9.40,0.00,1.00,134.40,-14.40,0 +38.40,-9.60,9.42,0.00,1.00,-38.40,-14.40,0 +33.60,-9.60,9.44,0.00,1.00,144.00,-9.60,0 +28.80,-9.60,9.46,0.00,1.00,-28.80,-9.60,0 +24.00,-9.60,9.48,0.00,1.00,153.60,-9.60,0 +19.20,-4.80,9.51,0.00,1.00,-24.00,-9.60,0 +14.40,-4.80,9.53,0.00,1.00,163.20,-4.80,0 +9.60,-4.80,9.55,0.00,1.00,-14.40,-4.80,0 +4.80,-0.00,9.57,0.00,1.00,172.80,-4.80,0 +0.00,0.00,9.59,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,9.61,0.00,1.00,0.00,0.00,0 +-9.60,0.00,9.63,0.00,1.00,-177.60,0.00,0 +-14.40,4.80,9.66,0.00,1.00,9.60,0.00,0 +-19.20,4.80,9.68,0.00,1.00,-168.00,4.80,0 +-24.00,4.80,9.70,0.00,1.00,14.40,4.80,0 +-28.80,4.80,9.72,0.00,1.00,-158.40,4.80,0 +-33.60,9.60,9.74,0.00,1.00,24.00,4.80,0 +-38.40,9.60,9.76,0.00,1.00,-148.80,9.60,0 +-43.20,9.60,9.78,0.00,1.00,33.60,9.60,0 +-48.00,9.60,9.81,0.00,1.00,-139.20,9.60,0 +-52.80,9.60,9.83,0.00,1.00,43.20,9.60,0 +-57.60,14.40,9.85,0.00,1.00,-129.60,9.60,0 +-62.40,14.40,9.87,0.00,1.00,52.80,9.60,0 +-67.20,14.40,9.89,0.00,1.00,-120.00,9.60,0 +-72.00,14.40,9.91,0.00,1.00,62.40,14.40,0 +-76.80,14.40,9.93,0.00,1.00,-110.40,14.40,0 +-81.60,14.40,9.95,0.00,1.00,76.80,14.40,0 +-86.40,14.40,9.98,0.00,1.00,-100.80,14.40,0 +-91.20,14.40,10.00,0.00,1.00,86.40,14.40,0 +-96.00,14.40,10.02,0.00,1.00,-86.40,14.40,0 +-100.80,14.40,10.04,0.00,1.00,96.00,14.40,0 +-105.60,14.40,10.06,0.00,1.00,-76.80,14.40,0 +-110.40,14.40,10.08,0.00,1.00,110.40,14.40,0 +-115.20,14.40,10.10,0.00,1.00,-67.20,14.40,0 +-120.00,14.40,10.13,0.00,1.00,120.00,9.60,0 +-124.80,9.60,10.15,0.00,1.00,-57.60,9.60,0 +-129.60,9.60,10.17,0.00,1.00,129.60,9.60,0 +-134.40,9.60,10.19,0.00,1.00,-48.00,9.60,0 +-139.20,9.60,10.21,0.00,1.00,139.20,9.60,0 +-144.00,9.60,10.23,0.00,1.00,-38.40,9.60,0 +-148.80,9.60,10.25,0.00,1.00,148.80,9.60,0 +-153.60,4.80,10.28,0.00,1.00,-28.80,4.80,0 +-158.40,4.80,10.30,0.00,1.00,158.40,4.80,0 +-163.20,4.80,10.32,0.00,1.00,-19.20,4.80,0 +-168.00,4.80,10.34,0.00,1.00,168.00,4.80,0 +-172.80,0.00,10.36,0.00,1.00,-9.60,4.80,0 +-177.60,0.00,10.38,0.00,1.00,172.80,0.00,0 +177.60,-0.00,10.40,0.00,1.00,-0.00,0.00,0 +172.80,-0.00,10.42,0.00,1.00,-177.60,-0.00,0 +168.00,-4.80,10.45,0.00,1.00,4.80,-0.00,0 +163.20,-4.80,10.47,0.00,1.00,-168.00,-4.80,0 +158.40,-4.80,10.49,0.00,1.00,14.40,-4.80,0 +153.60,-4.80,10.51,0.00,1.00,-163.20,-4.80,0 +148.80,-9.60,10.53,0.00,1.00,24.00,-4.80,0 +144.00,-9.60,10.55,0.00,1.00,-153.60,-4.80,0 +139.20,-9.60,10.57,0.00,1.00,33.60,-9.60,0 +134.40,-9.60,10.60,0.00,1.00,-144.00,-9.60,0 +129.60,-9.60,10.62,0.00,1.00,43.20,-9.60,0 +124.80,-9.60,10.64,0.00,1.00,-134.40,-9.60,0 +120.00,-14.40,10.66,0.00,1.00,52.80,-9.60,0 +115.20,-14.40,10.68,0.00,1.00,-124.80,-9.60,0 +110.40,-14.40,10.70,0.00,1.00,62.40,-9.60,0 +105.60,-14.40,10.72,0.00,1.00,-115.20,-14.40,0 +100.80,-14.40,10.74,0.00,1.00,72.00,-14.40,0 +96.00,-14.40,10.77,0.00,1.00,-100.80,-14.40,0 +91.20,-14.40,10.79,0.00,1.00,81.60,-14.40,0 +86.40,-14.40,10.81,0.00,1.00,-91.20,-14.40,0 +81.60,-14.40,10.83,0.00,1.00,96.00,-14.40,0 +76.80,-14.40,10.85,0.00,1.00,-81.60,-14.40,0 +72.00,-14.40,10.87,0.00,1.00,105.60,-14.40,0 +67.20,-14.40,10.89,0.00,1.00,-67.20,-14.40,0 +62.40,-14.40,10.92,0.00,1.00,115.20,-14.40,0 +57.60,-14.40,10.94,0.00,1.00,-57.60,-9.60,0 +52.80,-9.60,10.96,0.00,1.00,124.80,-9.60,0 +48.00,-9.60,10.98,0.00,1.00,-48.00,-9.60,0 +43.20,-9.60,11.00,0.00,1.00,134.40,-9.60,0 +38.40,-9.60,11.02,0.00,1.00,-38.40,-9.60,0 +33.60,-9.60,11.04,0.00,1.00,144.00,-9.60,0 +28.80,-4.80,11.07,0.00,1.00,-28.80,-9.60,0 +24.00,-4.80,11.09,0.00,1.00,153.60,-4.80,0 +19.20,-4.80,11.11,0.00,1.00,-19.20,-4.80,0 +14.40,-4.80,11.13,0.00,1.00,163.20,-4.80,0 +9.60,-0.00,11.15,0.00,1.00,-14.40,-4.80,0 +4.80,-0.00,11.17,0.00,1.00,172.80,-0.00,0 +0.00,0.00,11.19,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,11.21,0.00,1.00,0.00,0.00,0 +-9.60,0.00,11.24,0.00,1.00,-177.60,0.00,0 +-14.40,0.00,11.26,0.00,1.00,9.60,0.00,0 +-19.20,4.80,11.28,0.00,1.00,-168.00,0.00,0 +-24.00,4.80,11.30,0.00,1.00,14.40,4.80,0 +-28.80,4.80,11.32,0.00,1.00,-158.40,4.80,0 +-33.60,4.80,11.34,0.00,1.00,24.00,4.80,0 +-38.40,4.80,11.36,0.00,1.00,-153.60,4.80,0 +-43.20,4.80,11.39,0.00,1.00,33.60,4.80,0 +-48.00,4.80,11.41,0.00,1.00,-144.00,4.80,0 +-52.80,9.60,11.43,0.00,1.00,43.20,4.80,0 +-57.60,9.60,11.45,0.00,1.00,-134.40,4.80,0 +-62.40,9.60,11.47,0.00,1.00,52.80,4.80,0 +-67.20,9.60,11.49,0.00,1.00,-124.80,9.60,0 +-72.00,9.60,11.51,0.00,1.00,62.40,9.60,0 +-76.80,9.60,11.54,0.00,1.00,-110.40,9.60,0 +-81.60,9.60,11.56,0.00,1.00,72.00,9.60,0 +-86.40,9.60,11.58,0.00,1.00,-100.80,9.60,0 +-91.20,9.60,11.60,0.00,1.00,86.40,9.60,0 +-96.00,9.60,11.62,0.00,1.00,-86.40,9.60,0 +-100.80,9.60,11.64,0.00,1.00,96.00,9.60,0 +-105.60,9.60,11.66,0.00,1.00,-76.80,9.60,0 +-110.40,9.60,11.68,0.00,1.00,110.40,9.60,0 +-115.20,9.60,11.71,0.00,1.00,-67.20,9.60,0 +-120.00,9.60,11.73,0.00,1.00,120.00,9.60,0 +-124.80,9.60,11.75,0.00,1.00,-52.80,9.60,0 +-129.60,9.60,11.77,0.00,1.00,129.60,4.80,0 +-134.40,4.80,11.79,0.00,1.00,-43.20,4.80,0 +-139.20,4.80,11.81,0.00,1.00,139.20,4.80,0 +-144.00,4.80,11.83,0.00,1.00,-33.60,4.80,0 +-148.80,4.80,11.86,0.00,1.00,148.80,4.80,0 +-153.60,4.80,11.88,0.00,1.00,-24.00,4.80,0 +-158.40,4.80,11.90,0.00,1.00,158.40,4.80,0 +-163.20,4.80,11.92,0.00,1.00,-19.20,4.80,0 +-168.00,0.00,11.94,0.00,1.00,168.00,4.80,0 +-172.80,0.00,11.96,0.00,1.00,-9.60,0.00,0 +-177.60,0.00,11.98,0.00,1.00,172.80,0.00,0 +177.60,-0.00,12.01,0.00,1.00,-0.00,0.00,0 +172.80,-0.00,12.03,0.00,1.00,-177.60,-0.00,0 +168.00,-0.00,12.05,0.00,1.00,4.80,-0.00,0 +163.20,-4.80,12.07,0.00,1.00,-168.00,-0.00,0 +158.40,-4.80,12.09,0.00,1.00,14.40,-4.80,0 +153.60,-4.80,12.11,0.00,1.00,-163.20,-4.80,0 +148.80,-4.80,12.13,0.00,1.00,24.00,-4.80,0 +144.00,-4.80,12.15,0.00,1.00,-153.60,-4.80,0 +139.20,-4.80,12.18,0.00,1.00,28.80,-4.80,0 +134.40,-4.80,12.20,0.00,1.00,-144.00,-4.80,0 +129.60,-9.60,12.22,0.00,1.00,38.40,-4.80,0 +124.80,-9.60,12.24,0.00,1.00,-134.40,-4.80,0 +120.00,-9.60,12.26,0.00,1.00,48.00,-4.80,0 +115.20,-9.60,12.28,0.00,1.00,-124.80,-9.60,0 +110.40,-9.60,12.30,0.00,1.00,57.60,-9.60,0 +105.60,-9.60,12.33,0.00,1.00,-115.20,-9.60,0 +100.80,-9.60,12.35,0.00,1.00,72.00,-9.60,0 +96.00,-9.60,12.37,0.00,1.00,-105.60,-9.60,0 +91.20,-9.60,12.39,0.00,1.00,81.60,-9.60,0 +86.40,-9.60,12.41,0.00,1.00,-91.20,-9.60,0 +81.60,-9.60,12.43,0.00,1.00,96.00,-9.60,0 +76.80,-9.60,12.45,0.00,1.00,-81.60,-9.60,0 +72.00,-9.60,12.48,0.00,1.00,105.60,-9.60,0 +67.20,-9.60,12.50,0.00,1.00,-67.20,-9.60,0 +62.40,-9.60,12.52,0.00,1.00,120.00,-9.60,0 +57.60,-9.60,12.54,0.00,1.00,-57.60,-9.60,0 +52.80,-9.60,12.56,0.00,1.00,129.60,-4.80,0 +48.00,-4.80,12.58,0.00,1.00,-48.00,-4.80,0 +43.20,-4.80,12.60,0.00,1.00,139.20,-4.80,0 +38.40,-4.80,12.62,0.00,1.00,-38.40,-4.80,0 +33.60,-4.80,12.65,0.00,1.00,148.80,-4.80,0 +28.80,-4.80,12.67,0.00,1.00,-28.80,-4.80,0 +24.00,-4.80,12.69,0.00,1.00,158.40,-4.80,0 +19.20,-4.80,12.71,0.00,1.00,-19.20,-4.80,0 +14.40,-0.00,12.73,0.00,1.00,163.20,-4.80,0 +9.60,-0.00,12.75,0.00,1.00,-9.60,-0.00,0 +4.80,-0.00,12.77,0.00,1.00,172.80,-0.00,0 +0.00,0.00,12.80,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,12.82,0.00,1.00,0.00,0.00,0 +-9.60,0.00,12.84,0.00,1.00,-177.60,0.00,0 +-14.40,0.00,12.86,0.00,1.00,9.60,0.00,0 +-19.20,0.00,12.88,0.00,1.00,-168.00,0.00,0 +-24.00,0.00,12.90,0.00,1.00,14.40,0.00,0 +-28.80,0.00,12.92,0.00,1.00,-163.20,0.00,0 +-33.60,4.80,12.95,0.00,1.00,24.00,0.00,0 +-38.40,4.80,12.97,0.00,1.00,-153.60,0.00,0 +-43.20,4.80,12.99,0.00,1.00,28.80,0.00,0 +-48.00,4.80,13.01,0.00,1.00,-144.00,4.80,0 +-52.80,4.80,13.03,0.00,1.00,38.40,4.80,0 +-57.60,4.80,13.05,0.00,1.00,-134.40,4.80,0 +-62.40,4.80,13.07,0.00,1.00,48.00,4.80,0 +-67.20,4.80,13.09,0.00,1.00,-124.80,4.80,0 +-72.00,4.80,13.12,0.00,1.00,62.40,4.80,0 +-76.80,4.80,13.14,0.00,1.00,-115.20,4.80,0 +-81.60,4.80,13.16,0.00,1.00,72.00,4.80,0 +-86.40,4.80,13.18,0.00,1.00,-100.80,4.80,0 +-91.20,4.80,13.20,0.00,1.00,86.40,4.80,0 +-96.00,4.80,13.22,0.00,1.00,-86.40,4.80,0 +-100.80,4.80,13.24,0.00,1.00,96.00,4.80,0 +-105.60,4.80,13.27,0.00,1.00,-76.80,4.80,0 +-110.40,4.80,13.29,0.00,1.00,110.40,4.80,0 +-115.20,4.80,13.31,0.00,1.00,-62.40,4.80,0 +-120.00,4.80,13.33,0.00,1.00,120.00,4.80,0 +-124.80,4.80,13.35,0.00,1.00,-52.80,4.80,0 +-129.60,4.80,13.37,0.00,1.00,134.40,4.80,0 +-134.40,4.80,13.39,0.00,1.00,-43.20,4.80,0 +-139.20,4.80,13.42,0.00,1.00,144.00,4.80,0 +-144.00,4.80,13.44,0.00,1.00,-33.60,0.00,0 +-148.80,4.80,13.46,0.00,1.00,153.60,0.00,0 +-153.60,0.00,13.48,0.00,1.00,-24.00,0.00,0 +-158.40,0.00,13.50,0.00,1.00,158.40,0.00,0 +-163.20,0.00,13.52,0.00,1.00,-14.40,0.00,0 +-168.00,0.00,13.54,0.00,1.00,168.00,0.00,0 +-172.80,0.00,13.56,0.00,1.00,-9.60,0.00,0 +-177.60,0.00,13.59,0.00,1.00,172.80,0.00,0 +177.60,-0.00,13.61,0.00,1.00,-0.00,0.00,0 +172.80,-0.00,13.63,0.00,1.00,-177.60,-0.00,0 +168.00,-0.00,13.65,0.00,1.00,4.80,-0.00,0 +163.20,-0.00,13.67,0.00,1.00,-172.80,-0.00,0 +158.40,-0.00,13.69,0.00,1.00,14.40,-0.00,0 +153.60,-0.00,13.71,0.00,1.00,-163.20,-0.00,0 +148.80,-4.80,13.74,0.00,1.00,19.20,-0.00,0 +144.00,-4.80,13.76,0.00,1.00,-153.60,-0.00,0 +139.20,-4.80,13.78,0.00,1.00,28.80,-0.00,0 +134.40,-4.80,13.80,0.00,1.00,-148.80,-0.00,0 +129.60,-4.80,13.82,0.00,1.00,38.40,-4.80,0 +124.80,-4.80,13.84,0.00,1.00,-139.20,-4.80,0 +120.00,-4.80,13.86,0.00,1.00,48.00,-4.80,0 +115.20,-4.80,13.89,0.00,1.00,-129.60,-4.80,0 +110.40,-4.80,13.91,0.00,1.00,57.60,-4.80,0 +105.60,-4.80,13.93,0.00,1.00,-115.20,-4.80,0 +100.80,-4.80,13.95,0.00,1.00,67.20,-4.80,0 +96.00,-4.80,13.97,0.00,1.00,-105.60,-4.80,0 +91.20,-4.80,13.99,0.00,1.00,81.60,-4.80,0 +86.40,-4.80,14.01,0.00,1.00,-91.20,-4.80,0 +81.60,-4.80,14.03,0.00,1.00,96.00,-4.80,0 +76.80,-4.80,14.06,0.00,1.00,-76.80,-4.80,0 +72.00,-4.80,14.08,0.00,1.00,105.60,-4.80,0 +67.20,-4.80,14.10,0.00,1.00,-67.20,-4.80,0 +62.40,-4.80,14.12,0.00,1.00,120.00,-4.80,0 +57.60,-4.80,14.14,0.00,1.00,-52.80,-4.80,0 +52.80,-4.80,14.16,0.00,1.00,129.60,-4.80,0 +48.00,-4.80,14.18,0.00,1.00,-43.20,-4.80,0 +43.20,-4.80,14.21,0.00,1.00,139.20,-4.80,0 +38.40,-4.80,14.23,0.00,1.00,-33.60,-4.80,0 +33.60,-4.80,14.25,0.00,1.00,148.80,-0.00,0 +28.80,-0.00,14.27,0.00,1.00,-28.80,-0.00,0 +24.00,-0.00,14.29,0.00,1.00,158.40,-0.00,0 +19.20,-0.00,14.31,0.00,1.00,-19.20,-0.00,0 +14.40,-0.00,14.33,0.00,1.00,163.20,-0.00,0 +9.60,-0.00,14.36,0.00,1.00,-9.60,-0.00,0 +4.80,-0.00,14.38,0.00,1.00,172.80,-0.00,0 +0.00,0.00,14.40,0.00,1.00,-4.80,-0.00,0 +-4.80,0.00,14.42,0.00,1.00,0.00,0.00,0 +-9.60,0.00,14.44,0.00,1.00,-177.60,-0.00,0 +-14.40,0.00,14.46,0.00,1.00,4.80,-0.00,0 +-19.20,0.00,14.48,0.00,1.00,-168.00,-0.00,0 +-24.00,0.00,14.50,0.00,1.00,14.40,-0.00,0 +-28.80,0.00,14.53,0.00,1.00,-163.20,-0.00,0 +-33.60,0.00,14.55,0.00,1.00,19.20,-0.00,0 +-38.40,0.00,14.57,0.00,1.00,-153.60,-0.00,0 +-43.20,0.00,14.59,0.00,1.00,28.80,-0.00,0 +-48.00,0.00,14.61,0.00,1.00,-148.80,-0.00,0 +-52.80,0.00,14.63,0.00,1.00,38.40,-0.00,0 +-57.60,0.00,14.65,0.00,1.00,-139.20,-0.00,0 +-62.40,0.00,14.68,0.00,1.00,48.00,-0.00,0 +-67.20,0.00,14.70,0.00,1.00,-124.80,-0.00,0 +-72.00,0.00,14.72,0.00,1.00,57.60,-0.00,0 +-76.80,0.00,14.74,0.00,1.00,-115.20,-0.00,0 +-81.60,0.00,14.76,0.00,1.00,72.00,-0.00,0 +-86.40,0.00,14.78,0.00,1.00,-100.80,-0.00,0 +-91.20,0.00,14.80,0.00,1.00,86.40,-0.00,0 +-96.00,0.00,14.83,0.00,1.00,-86.40,-0.00,0 +-100.80,0.00,14.85,0.00,1.00,100.80,-0.00,0 +-105.60,0.00,14.87,0.00,1.00,-76.80,-0.00,0 +-110.40,0.00,14.89,0.00,1.00,110.40,-0.00,0 +-115.20,0.00,14.91,0.00,1.00,-62.40,-0.00,0 +-120.00,0.00,14.93,0.00,1.00,124.80,-0.00,0 +-124.80,0.00,14.95,0.00,1.00,-48.00,-0.00,0 +-129.60,0.00,14.97,0.00,1.00,134.40,-0.00,0 +-134.40,0.00,15.00,0.00,1.00,-38.40,-0.00,0 +-139.20,0.00,15.02,0.00,1.00,144.00,-0.00,0 +-144.00,0.00,15.04,0.00,1.00,-28.80,-0.00,0 +-148.80,0.00,15.06,0.00,1.00,153.60,-0.00,0 +-153.60,0.00,15.08,0.00,1.00,-24.00,-0.00,0 +-158.40,0.00,15.10,0.00,1.00,163.20,-0.00,0 +-163.20,0.00,15.12,0.00,1.00,-14.40,-0.00,0 +-168.00,0.00,15.15,0.00,1.00,168.00,-0.00,0 +-172.80,0.00,15.17,0.00,1.00,-9.60,-0.00,0 +-177.60,0.00,15.19,0.00,1.00,172.80,-0.00,0 +177.60,0.00,15.21,0.00,1.00,-0.00,-0.00,0 +172.80,0.00,15.23,0.00,1.00,-177.60,0.00,0 +168.00,0.00,15.25,0.00,1.00,4.80,0.00,0 +163.20,0.00,15.27,0.00,1.00,-172.80,0.00,0 +158.40,0.00,15.30,0.00,1.00,9.60,0.00,0 +153.60,0.00,15.32,0.00,1.00,-163.20,0.00,0 +148.80,0.00,15.34,0.00,1.00,19.20,0.00,0 +144.00,0.00,15.36,0.00,1.00,-158.40,0.00,0 +139.20,0.00,15.38,0.00,1.00,28.80,0.00,0 +134.40,0.00,15.40,0.00,1.00,-148.80,0.00,0 +129.60,0.00,15.42,0.00,1.00,33.60,0.00,0 +124.80,0.00,15.44,0.00,1.00,-139.20,0.00,0 +120.00,0.00,15.47,0.00,1.00,43.20,0.00,0 +115.20,0.00,15.49,0.00,1.00,-129.60,0.00,0 +110.40,0.00,15.51,0.00,1.00,57.60,0.00,0 +105.60,0.00,15.53,0.00,1.00,-120.00,0.00,0 +100.80,0.00,15.55,0.00,1.00,67.20,0.00,0 +96.00,0.00,15.57,0.00,1.00,-105.60,0.00,0 +91.20,0.00,15.59,0.00,1.00,81.60,0.00,0 +86.40,0.00,15.62,0.00,1.00,-91.20,0.00,0 +81.60,0.00,15.64,0.00,1.00,96.00,0.00,0 +76.80,0.00,15.66,0.00,1.00,-76.80,0.00,0 +72.00,0.00,15.68,0.00,1.00,110.40,0.00,0 +67.20,0.00,15.70,0.00,1.00,-67.20,0.00,0 +62.40,0.00,15.72,0.00,1.00,120.00,0.00,0 +57.60,0.00,15.74,0.00,1.00,-52.80,0.00,0 +52.80,0.00,15.77,0.00,1.00,134.40,0.00,0 +48.00,0.00,15.79,0.00,1.00,-43.20,0.00,0 +43.20,0.00,15.81,0.00,1.00,144.00,0.00,0 +38.40,0.00,15.83,0.00,1.00,-33.60,0.00,0 +33.60,0.00,15.85,0.00,1.00,153.60,0.00,0 +28.80,0.00,15.87,0.00,1.00,-24.00,0.00,0 +24.00,0.00,15.89,0.00,1.00,158.40,0.00,0 +19.20,0.00,15.91,0.00,1.00,-19.20,0.00,0 +14.40,0.00,15.94,0.00,1.00,168.00,0.00,0 +9.60,0.00,15.96,0.00,1.00,-9.60,0.00,0 +4.80,0.00,15.98,0.00,1.00,172.80,0.00,0 +0.00,0.00,16.00,0.00,1.00,-4.80,0.00,0 diff --git a/scripts/testv/stvISM3.csv b/scripts/testv/stvISM3.csv index ac37e672e3..14eee9b693 100644 --- a/scripts/testv/stvISM3.csv +++ b/scripts/testv/stvISM3.csv @@ -1,1500 +1,1500 @@ -0.00,0.00,0.00,0.00,1.00,-0.00,0.00 --177.60,-4.80,16.00,0.00,1.00,-0.00,0.00 -4.80,4.80,0.02,0.00,1.00,-0.00,0.00 --168.00,-9.60,15.98,0.00,1.00,-0.00,0.00 -14.40,14.40,0.04,0.00,1.00,-0.00,0.00 --163.20,-14.40,15.96,0.00,1.00,-0.00,0.00 -19.20,19.20,0.06,0.00,1.00,-0.00,0.00 --153.60,-24.00,15.94,0.00,1.00,-0.00,0.00 -28.80,24.00,0.09,0.00,1.00,-0.00,0.00 --148.80,-28.80,15.91,0.00,1.00,-0.00,0.00 -38.40,33.60,0.11,0.00,1.00,-0.00,0.00 --139.20,-33.60,15.89,0.00,1.00,-0.00,0.00 -48.00,38.40,0.13,0.00,1.00,-0.00,0.00 --124.80,-38.40,15.87,0.00,1.00,-0.00,0.00 -57.60,38.40,0.15,0.00,1.00,-0.00,0.00 --115.20,-43.20,15.85,0.00,1.00,-0.00,0.00 -72.00,43.20,0.17,0.00,1.00,-0.00,0.00 --100.80,-43.20,15.83,0.00,1.00,-0.00,0.00 -86.40,43.20,0.19,0.00,1.00,-0.00,0.00 --86.40,-43.20,15.81,0.00,1.00,-177.60,0.00 -100.80,43.20,0.21,0.00,1.00,-177.60,0.00 --76.80,-43.20,15.79,0.00,1.00,-177.60,0.00 -110.40,43.20,0.23,0.00,1.00,-177.60,0.00 --62.40,-43.20,15.77,0.00,1.00,-177.60,0.00 -124.80,38.40,0.26,0.00,1.00,-177.60,0.00 --52.80,-38.40,15.74,0.00,1.00,177.60,0.00 -134.40,33.60,0.28,0.00,1.00,177.60,0.00 --38.40,-33.60,15.72,0.00,1.00,177.60,0.00 -144.00,28.80,0.30,0.00,1.00,177.60,0.00 --33.60,-28.80,15.70,0.00,1.00,177.60,0.00 -153.60,24.00,0.32,0.00,1.00,177.60,0.00 --24.00,-19.20,15.68,0.00,1.00,177.60,0.00 -158.40,19.20,0.34,0.00,1.00,177.60,0.00 --14.40,-14.40,15.66,0.00,1.00,177.60,0.00 -168.00,9.60,0.36,0.00,1.00,177.60,0.00 --9.60,-9.60,15.64,0.00,1.00,177.60,0.00 -172.80,4.80,0.38,0.00,1.00,177.60,0.00 --0.00,-0.00,15.62,0.00,1.00,177.60,0.00 --177.60,-0.00,0.41,0.00,1.00,-177.60,0.00 -4.80,4.80,15.59,0.00,1.00,-177.60,0.00 --172.80,-9.60,0.43,0.00,1.00,-177.60,0.00 -14.40,9.60,15.57,0.00,1.00,-177.60,0.00 --163.20,-14.40,0.45,0.00,1.00,-177.60,0.00 -19.20,19.20,15.55,0.00,1.00,-177.60,0.00 --158.40,-19.20,0.47,0.00,1.00,-177.60,0.00 -28.80,24.00,15.53,0.00,1.00,-177.60,0.00 --148.80,-28.80,0.49,0.00,1.00,-177.60,0.00 -33.60,28.80,15.51,0.00,1.00,-177.60,0.00 --139.20,-33.60,0.51,0.00,1.00,-177.60,0.00 -43.20,33.60,15.49,0.00,1.00,-177.60,0.00 --129.60,-38.40,0.53,0.00,1.00,-177.60,0.00 -57.60,38.40,15.47,0.00,1.00,177.60,0.00 --120.00,-43.20,0.56,0.00,1.00,177.60,0.00 -67.20,43.20,15.44,0.00,1.00,177.60,0.00 --105.60,-43.20,0.58,0.00,1.00,177.60,0.00 -81.60,43.20,15.42,0.00,1.00,177.60,0.00 --91.20,-43.20,0.60,0.00,1.00,177.60,0.00 -96.00,43.20,15.40,0.00,1.00,0.00,0.00 --76.80,-43.20,0.62,0.00,1.00,0.00,0.00 -110.40,43.20,15.38,0.00,1.00,0.00,0.00 --67.20,-43.20,0.64,0.00,1.00,0.00,0.00 -120.00,38.40,15.36,0.00,1.00,0.00,0.00 --52.80,-38.40,0.66,0.00,1.00,0.00,0.00 -129.60,38.40,15.34,0.00,1.00,0.00,0.00 --43.20,-33.60,0.68,0.00,1.00,0.00,0.00 -144.00,33.60,15.32,0.00,1.00,0.00,0.00 --33.60,-28.80,0.70,0.00,1.00,0.00,0.00 -148.80,24.00,15.30,0.00,1.00,0.00,0.00 --24.00,-24.00,0.73,0.00,1.00,0.00,0.00 -158.40,19.20,15.27,0.00,1.00,0.00,0.00 --19.20,-14.40,0.75,0.00,1.00,0.00,0.00 -168.00,14.40,15.25,0.00,1.00,0.00,0.00 --9.60,-9.60,0.77,0.00,1.00,0.00,0.00 -172.80,4.80,15.23,0.00,1.00,0.00,0.00 --4.80,-4.80,0.79,0.00,1.00,0.00,0.00 -0.00,0.00,15.21,0.00,1.00,0.00,0.00 --177.60,-4.80,0.81,0.00,1.00,0.00,-0.00 -9.60,4.80,15.19,0.00,1.00,0.00,-0.00 --168.00,-9.60,0.83,0.00,1.00,0.00,-0.00 -14.40,14.40,15.17,0.00,1.00,0.00,-0.00 --163.20,-14.40,0.85,0.00,1.00,0.00,-0.00 -24.00,19.20,15.15,0.00,1.00,4.80,-0.00 --153.60,-19.20,0.88,0.00,1.00,4.80,-4.80 -28.80,24.00,15.12,0.00,1.00,4.80,-4.80 --144.00,-24.00,0.90,0.00,1.00,4.80,-4.80 -38.40,28.80,15.10,0.00,1.00,4.80,-4.80 --134.40,-28.80,0.92,0.00,1.00,4.80,-4.80 -48.00,33.60,15.08,0.00,1.00,9.60,-4.80 --124.80,-33.60,0.94,0.00,1.00,9.60,-4.80 -62.40,38.40,15.06,0.00,1.00,9.60,-4.80 --115.20,-38.40,0.96,0.00,1.00,14.40,-4.80 -72.00,38.40,15.04,0.00,1.00,19.20,-4.80 --100.80,-38.40,0.98,0.00,1.00,28.80,-4.80 -86.40,38.40,15.02,0.00,1.00,52.80,-4.80 --86.40,-38.40,1.00,0.00,1.00,105.60,-4.80 -96.00,38.40,15.00,0.00,1.00,139.20,-4.80 --76.80,-38.40,1.03,0.00,1.00,158.40,-4.80 -110.40,38.40,14.97,0.00,1.00,163.20,-4.80 --62.40,-38.40,1.05,0.00,1.00,168.00,-4.80 -120.00,33.60,14.95,0.00,1.00,168.00,-4.80 --52.80,-33.60,1.07,0.00,1.00,172.80,-4.80 -134.40,33.60,14.93,0.00,1.00,172.80,-4.80 --43.20,-28.80,1.09,0.00,1.00,172.80,-4.80 -144.00,28.80,14.91,0.00,1.00,172.80,-4.80 --33.60,-24.00,1.11,0.00,1.00,177.60,-4.80 -148.80,24.00,14.89,0.00,1.00,177.60,-4.80 --24.00,-19.20,1.13,0.00,1.00,177.60,-4.80 -158.40,14.40,14.87,0.00,1.00,177.60,-0.00 --19.20,-14.40,1.15,0.00,1.00,177.60,-0.00 -168.00,9.60,14.85,0.00,1.00,177.60,-0.00 --9.60,-9.60,1.17,0.00,1.00,177.60,-0.00 -172.80,4.80,14.83,0.00,1.00,177.60,-0.00 --0.00,-0.00,1.20,0.00,1.00,177.60,-0.00 --177.60,-0.00,14.80,0.00,1.00,-177.60,0.00 -4.80,4.80,1.22,0.00,1.00,-177.60,0.00 --172.80,-9.60,14.78,0.00,1.00,-177.60,0.00 -14.40,9.60,1.24,0.00,1.00,-177.60,0.00 --163.20,-14.40,14.76,0.00,1.00,-177.60,0.00 -19.20,14.40,1.26,0.00,1.00,-177.60,0.00 --153.60,-19.20,14.74,0.00,1.00,-177.60,4.80 -28.80,24.00,1.28,0.00,1.00,-177.60,4.80 --148.80,-24.00,14.72,0.00,1.00,-177.60,4.80 -38.40,28.80,1.30,0.00,1.00,-172.80,4.80 --139.20,-28.80,14.70,0.00,1.00,-172.80,4.80 -48.00,33.60,1.32,0.00,1.00,-172.80,4.80 --124.80,-33.60,14.68,0.00,1.00,-172.80,4.80 -57.60,33.60,1.35,0.00,1.00,-168.00,4.80 --115.20,-38.40,14.65,0.00,1.00,-168.00,4.80 -72.00,38.40,1.37,0.00,1.00,-163.20,4.80 --105.60,-38.40,14.63,0.00,1.00,-158.40,4.80 -81.60,38.40,1.39,0.00,1.00,-139.20,4.80 --91.20,-38.40,14.61,0.00,1.00,-105.60,4.80 -96.00,38.40,1.41,0.00,1.00,-52.80,4.80 --76.80,-38.40,14.59,0.00,1.00,-28.80,4.80 -105.60,38.40,1.43,0.00,1.00,-19.20,4.80 --67.20,-38.40,14.57,0.00,1.00,-14.40,4.80 -120.00,38.40,1.45,0.00,1.00,-9.60,4.80 --57.60,-33.60,14.55,0.00,1.00,-9.60,4.80 -129.60,33.60,1.47,0.00,1.00,-9.60,4.80 --43.20,-28.80,14.53,0.00,1.00,-4.80,4.80 -139.20,28.80,1.50,0.00,1.00,-4.80,4.80 --33.60,-24.00,14.50,0.00,1.00,-4.80,4.80 -148.80,24.00,1.52,0.00,1.00,-4.80,4.80 --28.80,-19.20,14.48,0.00,1.00,-4.80,4.80 -158.40,19.20,1.54,0.00,1.00,-4.80,0.00 --19.20,-14.40,14.46,0.00,1.00,-0.00,0.00 -163.20,14.40,1.56,0.00,1.00,-0.00,0.00 --9.60,-9.60,14.44,0.00,1.00,-0.00,0.00 -172.80,4.80,1.58,0.00,1.00,-0.00,0.00 --4.80,-4.80,14.42,0.00,1.00,-0.00,0.00 -0.00,0.00,1.60,0.00,1.00,0.00,0.00 --177.60,-4.80,14.40,0.00,1.00,0.00,-0.00 -9.60,4.80,1.62,0.00,1.00,0.00,-0.00 --168.00,-9.60,14.38,0.00,1.00,4.80,-0.00 -14.40,9.60,1.64,0.00,1.00,4.80,-4.80 --158.40,-14.40,14.36,0.00,1.00,4.80,-4.80 -24.00,14.40,1.67,0.00,1.00,4.80,-4.80 --153.60,-19.20,14.33,0.00,1.00,4.80,-4.80 -33.60,19.20,1.69,0.00,1.00,9.60,-4.80 --144.00,-24.00,14.31,0.00,1.00,9.60,-4.80 -43.20,24.00,1.71,0.00,1.00,9.60,-4.80 --134.40,-28.80,14.29,0.00,1.00,14.40,-9.60 -52.80,28.80,1.73,0.00,1.00,14.40,-9.60 --124.80,-28.80,14.27,0.00,1.00,19.20,-9.60 -62.40,33.60,1.75,0.00,1.00,24.00,-9.60 --110.40,-33.60,14.25,0.00,1.00,28.80,-9.60 -72.00,33.60,1.77,0.00,1.00,33.60,-9.60 --100.80,-33.60,14.23,0.00,1.00,48.00,-9.60 -86.40,33.60,1.79,0.00,1.00,67.20,-9.60 --86.40,-33.60,14.21,0.00,1.00,96.00,-9.60 -96.00,33.60,1.82,0.00,1.00,120.00,-9.60 --76.80,-33.60,14.18,0.00,1.00,139.20,-9.60 -110.40,33.60,1.84,0.00,1.00,148.80,-9.60 --67.20,-33.60,14.16,0.00,1.00,153.60,-9.60 -120.00,33.60,1.86,0.00,1.00,158.40,-9.60 --52.80,-28.80,14.14,0.00,1.00,163.20,-9.60 -129.60,28.80,1.88,0.00,1.00,168.00,-9.60 --43.20,-28.80,14.12,0.00,1.00,168.00,-9.60 -139.20,24.00,1.90,0.00,1.00,168.00,-4.80 --33.60,-24.00,14.10,0.00,1.00,172.80,-4.80 -148.80,19.20,1.92,0.00,1.00,172.80,-4.80 --24.00,-19.20,14.08,0.00,1.00,172.80,-4.80 -158.40,14.40,1.94,0.00,1.00,177.60,-4.80 --19.20,-14.40,14.06,0.00,1.00,177.60,-4.80 -168.00,9.60,1.97,0.00,1.00,177.60,-4.80 --9.60,-4.80,14.03,0.00,1.00,177.60,-0.00 -172.80,4.80,1.99,0.00,1.00,177.60,-0.00 --0.00,-0.00,14.01,0.00,1.00,177.60,-0.00 --177.60,-0.00,2.01,0.00,1.00,-177.60,0.00 -4.80,4.80,13.99,0.00,1.00,-177.60,0.00 --168.00,-4.80,2.03,0.00,1.00,-177.60,0.00 -14.40,9.60,13.97,0.00,1.00,-177.60,4.80 --163.20,-14.40,2.05,0.00,1.00,-177.60,4.80 -24.00,14.40,13.95,0.00,1.00,-177.60,4.80 --153.60,-19.20,2.07,0.00,1.00,-172.80,4.80 -28.80,19.20,13.93,0.00,1.00,-172.80,4.80 --144.00,-24.00,2.09,0.00,1.00,-172.80,4.80 -38.40,24.00,13.91,0.00,1.00,-168.00,4.80 --134.40,-28.80,2.11,0.00,1.00,-168.00,9.60 -48.00,28.80,13.89,0.00,1.00,-168.00,9.60 --124.80,-28.80,2.14,0.00,1.00,-163.20,9.60 -62.40,33.60,13.86,0.00,1.00,-158.40,9.60 --115.20,-33.60,2.16,0.00,1.00,-153.60,9.60 -72.00,33.60,13.84,0.00,1.00,-148.80,9.60 --100.80,-33.60,2.18,0.00,1.00,-139.20,9.60 -81.60,33.60,13.82,0.00,1.00,-120.00,9.60 --91.20,-33.60,2.20,0.00,1.00,-96.00,9.60 -96.00,33.60,13.80,0.00,1.00,-67.20,9.60 --81.60,-33.60,2.22,0.00,1.00,-48.00,9.60 -105.60,33.60,13.78,0.00,1.00,-33.60,9.60 --67.20,-33.60,2.24,0.00,1.00,-28.80,9.60 -115.20,33.60,13.76,0.00,1.00,-24.00,9.60 --57.60,-28.80,2.26,0.00,1.00,-19.20,9.60 -129.60,28.80,13.74,0.00,1.00,-14.40,9.60 --48.00,-28.80,2.29,0.00,1.00,-14.40,9.60 -139.20,24.00,13.71,0.00,1.00,-9.60,4.80 --38.40,-24.00,2.31,0.00,1.00,-9.60,4.80 -148.80,19.20,13.69,0.00,1.00,-9.60,4.80 --28.80,-19.20,2.33,0.00,1.00,-4.80,4.80 -153.60,14.40,13.67,0.00,1.00,-4.80,4.80 --19.20,-14.40,2.35,0.00,1.00,-4.80,4.80 -163.20,9.60,13.65,0.00,1.00,-4.80,4.80 --9.60,-9.60,2.37,0.00,1.00,-4.80,0.00 -172.80,4.80,13.63,0.00,1.00,-0.00,0.00 --4.80,-4.80,2.39,0.00,1.00,-0.00,0.00 -0.00,0.00,13.61,0.00,1.00,0.00,0.00 --177.60,-4.80,2.41,0.00,1.00,0.00,-0.00 -9.60,4.80,13.59,0.00,1.00,4.80,-0.00 --168.00,-9.60,2.44,0.00,1.00,4.80,-4.80 -14.40,9.60,13.56,0.00,1.00,4.80,-4.80 --158.40,-9.60,2.46,0.00,1.00,4.80,-4.80 -24.00,14.40,13.54,0.00,1.00,9.60,-4.80 --148.80,-14.40,2.48,0.00,1.00,9.60,-9.60 -33.60,19.20,13.52,0.00,1.00,9.60,-9.60 --139.20,-19.20,2.50,0.00,1.00,14.40,-9.60 -43.20,24.00,13.50,0.00,1.00,14.40,-9.60 --129.60,-24.00,2.52,0.00,1.00,19.20,-9.60 -52.80,24.00,13.48,0.00,1.00,19.20,-14.40 --120.00,-28.80,2.54,0.00,1.00,24.00,-14.40 -62.40,28.80,13.46,0.00,1.00,28.80,-14.40 --110.40,-28.80,2.56,0.00,1.00,38.40,-14.40 -76.80,28.80,13.44,0.00,1.00,48.00,-14.40 --100.80,-28.80,2.58,0.00,1.00,57.60,-14.40 -86.40,28.80,13.42,0.00,1.00,76.80,-14.40 --86.40,-28.80,2.61,0.00,1.00,96.00,-14.40 -96.00,28.80,13.39,0.00,1.00,115.20,-14.40 --76.80,-28.80,2.63,0.00,1.00,129.60,-14.40 -105.60,28.80,13.37,0.00,1.00,139.20,-14.40 --67.20,-28.80,2.65,0.00,1.00,144.00,-14.40 -120.00,28.80,13.35,0.00,1.00,153.60,-14.40 --57.60,-24.00,2.67,0.00,1.00,158.40,-14.40 -129.60,24.00,13.33,0.00,1.00,158.40,-9.60 --48.00,-24.00,2.69,0.00,1.00,163.20,-9.60 -139.20,19.20,13.31,0.00,1.00,168.00,-9.60 --38.40,-19.20,2.71,0.00,1.00,168.00,-9.60 -148.80,19.20,13.29,0.00,1.00,168.00,-9.60 --28.80,-14.40,2.73,0.00,1.00,172.80,-9.60 -158.40,14.40,13.27,0.00,1.00,172.80,-4.80 --19.20,-9.60,2.76,0.00,1.00,172.80,-4.80 -163.20,9.60,13.24,0.00,1.00,177.60,-4.80 --9.60,-4.80,2.78,0.00,1.00,177.60,-4.80 -172.80,4.80,13.22,0.00,1.00,177.60,-0.00 --0.00,-0.00,2.80,0.00,1.00,177.60,-0.00 --177.60,-0.00,13.20,0.00,1.00,-177.60,0.00 -4.80,4.80,2.82,0.00,1.00,-177.60,0.00 --168.00,-4.80,13.18,0.00,1.00,-177.60,4.80 -14.40,9.60,2.84,0.00,1.00,-177.60,4.80 --163.20,-9.60,13.16,0.00,1.00,-172.80,4.80 -24.00,14.40,2.86,0.00,1.00,-172.80,4.80 --153.60,-14.40,13.14,0.00,1.00,-172.80,9.60 -33.60,19.20,2.88,0.00,1.00,-168.00,9.60 --144.00,-19.20,13.12,0.00,1.00,-168.00,9.60 -43.20,19.20,2.91,0.00,1.00,-168.00,9.60 --134.40,-24.00,13.09,0.00,1.00,-163.20,9.60 -52.80,24.00,2.93,0.00,1.00,-158.40,9.60 --124.80,-24.00,13.07,0.00,1.00,-158.40,14.40 -62.40,28.80,2.95,0.00,1.00,-153.60,14.40 --115.20,-28.80,13.05,0.00,1.00,-144.00,14.40 -72.00,28.80,2.97,0.00,1.00,-139.20,14.40 --100.80,-28.80,13.03,0.00,1.00,-129.60,14.40 -81.60,28.80,2.99,0.00,1.00,-115.20,14.40 --91.20,-28.80,13.01,0.00,1.00,-96.00,14.40 -96.00,28.80,3.01,0.00,1.00,-76.80,14.40 --81.60,-28.80,12.99,0.00,1.00,-57.60,14.40 -105.60,28.80,3.03,0.00,1.00,-48.00,14.40 --67.20,-28.80,12.97,0.00,1.00,-38.40,14.40 -115.20,28.80,3.05,0.00,1.00,-28.80,14.40 --57.60,-28.80,12.95,0.00,1.00,-24.00,14.40 -124.80,24.00,3.08,0.00,1.00,-19.20,14.40 --48.00,-24.00,12.92,0.00,1.00,-19.20,9.60 -134.40,24.00,3.10,0.00,1.00,-14.40,9.60 --38.40,-19.20,12.90,0.00,1.00,-14.40,9.60 -144.00,19.20,3.12,0.00,1.00,-9.60,9.60 --28.80,-14.40,12.88,0.00,1.00,-9.60,9.60 -153.60,14.40,3.14,0.00,1.00,-9.60,4.80 --19.20,-9.60,12.86,0.00,1.00,-4.80,4.80 -163.20,9.60,3.16,0.00,1.00,-4.80,4.80 --14.40,-9.60,12.84,0.00,1.00,-4.80,4.80 -172.80,4.80,3.18,0.00,1.00,-4.80,0.00 --4.80,-4.80,12.82,0.00,1.00,-0.00,0.00 -0.00,0.00,3.20,0.00,1.00,0.00,0.00 --177.60,-0.00,12.80,0.00,1.00,0.00,-0.00 -9.60,4.80,3.23,0.00,1.00,4.80,-4.80 --168.00,-4.80,12.77,0.00,1.00,4.80,-4.80 -19.20,9.60,3.25,0.00,1.00,4.80,-4.80 --158.40,-9.60,12.75,0.00,1.00,9.60,-9.60 -24.00,14.40,3.27,0.00,1.00,9.60,-9.60 --148.80,-14.40,12.73,0.00,1.00,14.40,-9.60 -33.60,14.40,3.29,0.00,1.00,14.40,-9.60 --139.20,-19.20,12.71,0.00,1.00,19.20,-14.40 -43.20,19.20,3.31,0.00,1.00,19.20,-14.40 --129.60,-19.20,12.69,0.00,1.00,24.00,-14.40 -52.80,19.20,3.33,0.00,1.00,28.80,-14.40 --120.00,-24.00,12.67,0.00,1.00,33.60,-19.20 -67.20,24.00,3.35,0.00,1.00,38.40,-19.20 --110.40,-24.00,12.65,0.00,1.00,43.20,-19.20 -76.80,24.00,3.38,0.00,1.00,52.80,-19.20 --100.80,-24.00,12.62,0.00,1.00,67.20,-19.20 -86.40,24.00,3.40,0.00,1.00,76.80,-19.20 --86.40,-24.00,12.60,0.00,1.00,96.00,-19.20 -96.00,24.00,3.42,0.00,1.00,105.60,-19.20 --76.80,-24.00,12.58,0.00,1.00,120.00,-19.20 -105.60,24.00,3.44,0.00,1.00,129.60,-19.20 --67.20,-24.00,12.56,0.00,1.00,139.20,-19.20 -115.20,24.00,3.46,0.00,1.00,144.00,-19.20 --57.60,-24.00,12.54,0.00,1.00,148.80,-14.40 -129.60,19.20,3.48,0.00,1.00,153.60,-14.40 --48.00,-19.20,12.52,0.00,1.00,158.40,-14.40 -139.20,19.20,3.50,0.00,1.00,163.20,-14.40 --38.40,-14.40,12.50,0.00,1.00,163.20,-14.40 -148.80,14.40,3.52,0.00,1.00,168.00,-9.60 --28.80,-14.40,12.48,0.00,1.00,168.00,-9.60 -153.60,9.60,3.55,0.00,1.00,172.80,-9.60 --19.20,-9.60,12.45,0.00,1.00,172.80,-4.80 -163.20,9.60,3.57,0.00,1.00,172.80,-4.80 --9.60,-4.80,12.43,0.00,1.00,177.60,-4.80 -172.80,4.80,3.59,0.00,1.00,177.60,-0.00 --0.00,-0.00,12.41,0.00,1.00,177.60,-0.00 --177.60,-0.00,3.61,0.00,1.00,-177.60,0.00 -4.80,4.80,12.39,0.00,1.00,-177.60,0.00 --168.00,-4.80,3.63,0.00,1.00,-177.60,4.80 -14.40,9.60,12.37,0.00,1.00,-172.80,4.80 --158.40,-9.60,3.65,0.00,1.00,-172.80,4.80 -24.00,9.60,12.35,0.00,1.00,-172.80,9.60 --153.60,-14.40,3.67,0.00,1.00,-168.00,9.60 -33.60,14.40,12.33,0.00,1.00,-168.00,9.60 --144.00,-14.40,3.70,0.00,1.00,-163.20,14.40 -43.20,19.20,12.30,0.00,1.00,-163.20,14.40 --134.40,-19.20,3.72,0.00,1.00,-158.40,14.40 -52.80,19.20,12.28,0.00,1.00,-153.60,14.40 --124.80,-24.00,3.74,0.00,1.00,-148.80,14.40 -62.40,24.00,12.26,0.00,1.00,-144.00,19.20 --110.40,-24.00,3.76,0.00,1.00,-139.20,19.20 -72.00,24.00,12.24,0.00,1.00,-129.60,19.20 --100.80,-24.00,3.78,0.00,1.00,-120.00,19.20 -81.60,24.00,12.22,0.00,1.00,-105.60,19.20 --91.20,-24.00,3.80,0.00,1.00,-96.00,19.20 -96.00,24.00,12.20,0.00,1.00,-76.80,19.20 --81.60,-24.00,3.82,0.00,1.00,-67.20,19.20 -105.60,24.00,12.18,0.00,1.00,-52.80,19.20 --72.00,-24.00,3.85,0.00,1.00,-43.20,19.20 -115.20,24.00,12.15,0.00,1.00,-38.40,19.20 --57.60,-24.00,3.87,0.00,1.00,-33.60,19.20 -124.80,19.20,12.13,0.00,1.00,-28.80,14.40 --48.00,-19.20,3.89,0.00,1.00,-24.00,14.40 -134.40,19.20,12.11,0.00,1.00,-19.20,14.40 --38.40,-19.20,3.91,0.00,1.00,-19.20,14.40 -144.00,14.40,12.09,0.00,1.00,-14.40,9.60 --28.80,-14.40,3.93,0.00,1.00,-14.40,9.60 -153.60,14.40,12.07,0.00,1.00,-9.60,9.60 --24.00,-9.60,3.95,0.00,1.00,-9.60,9.60 -163.20,9.60,12.05,0.00,1.00,-4.80,4.80 --14.40,-4.80,3.97,0.00,1.00,-4.80,4.80 -172.80,4.80,12.03,0.00,1.00,-4.80,4.80 --4.80,-0.00,3.99,0.00,1.00,-0.00,0.00 -0.00,0.00,12.01,0.00,1.00,0.00,0.00 --177.60,-0.00,4.02,0.00,1.00,0.00,-0.00 -9.60,4.80,11.98,0.00,1.00,4.80,-4.80 --168.00,-4.80,4.04,0.00,1.00,4.80,-4.80 -19.20,4.80,11.96,0.00,1.00,9.60,-9.60 --158.40,-9.60,4.06,0.00,1.00,9.60,-9.60 -28.80,9.60,11.94,0.00,1.00,14.40,-9.60 --148.80,-9.60,4.08,0.00,1.00,14.40,-14.40 -38.40,14.40,11.92,0.00,1.00,19.20,-14.40 --139.20,-14.40,4.10,0.00,1.00,19.20,-14.40 -48.00,14.40,11.90,0.00,1.00,24.00,-19.20 --129.60,-14.40,4.12,0.00,1.00,28.80,-19.20 -57.60,19.20,11.88,0.00,1.00,33.60,-19.20 --120.00,-19.20,4.14,0.00,1.00,38.40,-19.20 -67.20,19.20,11.86,0.00,1.00,43.20,-24.00 --110.40,-19.20,4.17,0.00,1.00,52.80,-24.00 -76.80,19.20,11.83,0.00,1.00,62.40,-24.00 --100.80,-19.20,4.19,0.00,1.00,72.00,-24.00 -86.40,19.20,11.81,0.00,1.00,81.60,-24.00 --86.40,-19.20,4.21,0.00,1.00,91.20,-24.00 -96.00,19.20,11.79,0.00,1.00,105.60,-24.00 --76.80,-19.20,4.23,0.00,1.00,115.20,-24.00 -105.60,19.20,11.77,0.00,1.00,124.80,-24.00 --67.20,-19.20,4.25,0.00,1.00,134.40,-24.00 -115.20,19.20,11.75,0.00,1.00,139.20,-19.20 --57.60,-19.20,4.27,0.00,1.00,144.00,-19.20 -124.80,19.20,11.73,0.00,1.00,148.80,-19.20 --48.00,-14.40,4.29,0.00,1.00,153.60,-19.20 -134.40,14.40,11.71,0.00,1.00,158.40,-19.20 --38.40,-14.40,4.32,0.00,1.00,158.40,-14.40 -144.00,14.40,11.68,0.00,1.00,163.20,-14.40 --28.80,-9.60,4.34,0.00,1.00,168.00,-14.40 -153.60,9.60,11.66,0.00,1.00,168.00,-9.60 --19.20,-9.60,4.36,0.00,1.00,172.80,-9.60 -163.20,4.80,11.64,0.00,1.00,172.80,-4.80 --9.60,-4.80,4.38,0.00,1.00,172.80,-4.80 -172.80,4.80,11.62,0.00,1.00,177.60,-4.80 --0.00,-0.00,4.40,0.00,1.00,177.60,-0.00 --177.60,-0.00,11.60,0.00,1.00,-177.60,0.00 -4.80,4.80,4.42,0.00,1.00,-177.60,4.80 --168.00,-4.80,11.58,0.00,1.00,-172.80,4.80 -14.40,4.80,4.44,0.00,1.00,-172.80,4.80 --158.40,-9.60,11.56,0.00,1.00,-172.80,9.60 -24.00,9.60,4.46,0.00,1.00,-168.00,9.60 --148.80,-9.60,11.54,0.00,1.00,-168.00,14.40 -33.60,14.40,4.49,0.00,1.00,-163.20,14.40 --139.20,-14.40,11.51,0.00,1.00,-158.40,14.40 -43.20,14.40,4.51,0.00,1.00,-158.40,19.20 --129.60,-14.40,11.49,0.00,1.00,-153.60,19.20 -52.80,19.20,4.53,0.00,1.00,-148.80,19.20 --120.00,-19.20,11.47,0.00,1.00,-144.00,19.20 -62.40,19.20,4.55,0.00,1.00,-139.20,19.20 --110.40,-19.20,11.45,0.00,1.00,-134.40,24.00 -72.00,19.20,4.57,0.00,1.00,-124.80,24.00 --100.80,-19.20,11.43,0.00,1.00,-115.20,24.00 -81.60,19.20,4.59,0.00,1.00,-105.60,24.00 --91.20,-19.20,11.41,0.00,1.00,-91.20,24.00 -96.00,19.20,4.61,0.00,1.00,-81.60,24.00 --81.60,-19.20,11.39,0.00,1.00,-72.00,24.00 -105.60,19.20,4.64,0.00,1.00,-62.40,24.00 --72.00,-19.20,11.36,0.00,1.00,-52.80,24.00 -115.20,19.20,4.66,0.00,1.00,-43.20,24.00 --62.40,-19.20,11.34,0.00,1.00,-38.40,19.20 -124.80,19.20,4.68,0.00,1.00,-33.60,19.20 --52.80,-14.40,11.32,0.00,1.00,-28.80,19.20 -134.40,14.40,4.70,0.00,1.00,-24.00,19.20 --43.20,-14.40,11.30,0.00,1.00,-19.20,14.40 -144.00,14.40,4.72,0.00,1.00,-19.20,14.40 --33.60,-9.60,11.28,0.00,1.00,-14.40,14.40 -153.60,9.60,4.74,0.00,1.00,-14.40,9.60 --24.00,-9.60,11.26,0.00,1.00,-9.60,9.60 -163.20,4.80,4.76,0.00,1.00,-9.60,9.60 --14.40,-4.80,11.24,0.00,1.00,-4.80,4.80 -172.80,4.80,4.79,0.00,1.00,-4.80,4.80 --4.80,-0.00,11.21,0.00,1.00,-0.00,0.00 -0.00,0.00,4.81,0.00,1.00,0.00,0.00 --177.60,-0.00,11.19,0.00,1.00,0.00,-0.00 -9.60,4.80,4.83,0.00,1.00,4.80,-4.80 --168.00,-4.80,11.17,0.00,1.00,4.80,-4.80 -19.20,4.80,4.85,0.00,1.00,9.60,-9.60 --158.40,-4.80,11.15,0.00,1.00,14.40,-9.60 -28.80,9.60,4.87,0.00,1.00,14.40,-14.40 --148.80,-9.60,11.13,0.00,1.00,19.20,-14.40 -38.40,9.60,4.89,0.00,1.00,19.20,-19.20 --139.20,-9.60,11.11,0.00,1.00,24.00,-19.20 -48.00,9.60,4.91,0.00,1.00,28.80,-19.20 --129.60,-14.40,11.09,0.00,1.00,33.60,-24.00 -57.60,14.40,4.93,0.00,1.00,38.40,-24.00 --120.00,-14.40,11.07,0.00,1.00,43.20,-24.00 -67.20,14.40,4.96,0.00,1.00,48.00,-24.00 --110.40,-14.40,11.04,0.00,1.00,57.60,-28.80 -76.80,14.40,4.98,0.00,1.00,62.40,-28.80 --100.80,-14.40,11.02,0.00,1.00,72.00,-28.80 -86.40,14.40,5.00,0.00,1.00,81.60,-28.80 --86.40,-14.40,11.00,0.00,1.00,91.20,-28.80 -96.00,14.40,5.02,0.00,1.00,100.80,-28.80 --76.80,-14.40,10.98,0.00,1.00,110.40,-28.80 -105.60,14.40,5.04,0.00,1.00,120.00,-28.80 --67.20,-14.40,10.96,0.00,1.00,129.60,-28.80 -115.20,14.40,5.06,0.00,1.00,134.40,-24.00 --57.60,-14.40,10.94,0.00,1.00,139.20,-24.00 -124.80,14.40,5.08,0.00,1.00,144.00,-24.00 --48.00,-14.40,10.92,0.00,1.00,148.80,-24.00 -134.40,9.60,5.11,0.00,1.00,153.60,-19.20 --38.40,-9.60,10.89,0.00,1.00,158.40,-19.20 -144.00,9.60,5.13,0.00,1.00,158.40,-14.40 --28.80,-9.60,10.87,0.00,1.00,163.20,-14.40 -153.60,4.80,5.15,0.00,1.00,168.00,-14.40 --19.20,-4.80,10.85,0.00,1.00,168.00,-9.60 -163.20,4.80,5.17,0.00,1.00,172.80,-9.60 --9.60,-4.80,10.83,0.00,1.00,172.80,-4.80 -172.80,0.00,5.19,0.00,1.00,177.60,-4.80 --0.00,-0.00,10.81,0.00,1.00,177.60,-0.00 --177.60,-0.00,5.21,0.00,1.00,-177.60,0.00 -4.80,0.00,10.79,0.00,1.00,-177.60,4.80 --168.00,-4.80,5.23,0.00,1.00,-172.80,4.80 -14.40,4.80,10.77,0.00,1.00,-172.80,9.60 --158.40,-4.80,5.26,0.00,1.00,-168.00,9.60 -24.00,4.80,10.74,0.00,1.00,-168.00,14.40 --148.80,-9.60,5.28,0.00,1.00,-163.20,14.40 -33.60,9.60,10.72,0.00,1.00,-158.40,14.40 --139.20,-9.60,5.30,0.00,1.00,-158.40,19.20 -43.20,9.60,10.70,0.00,1.00,-153.60,19.20 --129.60,-14.40,5.32,0.00,1.00,-148.80,24.00 -52.80,14.40,10.68,0.00,1.00,-144.00,24.00 --120.00,-14.40,5.34,0.00,1.00,-139.20,24.00 -62.40,14.40,10.66,0.00,1.00,-134.40,24.00 --110.40,-14.40,5.36,0.00,1.00,-129.60,28.80 -72.00,14.40,10.64,0.00,1.00,-120.00,28.80 --100.80,-14.40,5.38,0.00,1.00,-110.40,28.80 -81.60,14.40,10.62,0.00,1.00,-100.80,28.80 --91.20,-14.40,5.40,0.00,1.00,-91.20,28.80 -96.00,14.40,10.60,0.00,1.00,-81.60,28.80 --81.60,-14.40,5.43,0.00,1.00,-72.00,28.80 -105.60,14.40,10.57,0.00,1.00,-62.40,28.80 --72.00,-14.40,5.45,0.00,1.00,-57.60,28.80 -115.20,14.40,10.55,0.00,1.00,-48.00,24.00 --62.40,-14.40,5.47,0.00,1.00,-43.20,24.00 -124.80,14.40,10.53,0.00,1.00,-38.40,24.00 --52.80,-14.40,5.49,0.00,1.00,-33.60,24.00 -134.40,9.60,10.51,0.00,1.00,-28.80,19.20 --43.20,-9.60,5.51,0.00,1.00,-24.00,19.20 -144.00,9.60,10.49,0.00,1.00,-19.20,19.20 --33.60,-9.60,5.53,0.00,1.00,-19.20,14.40 -153.60,9.60,10.47,0.00,1.00,-14.40,14.40 --24.00,-4.80,5.55,0.00,1.00,-14.40,9.60 -163.20,4.80,10.45,0.00,1.00,-9.60,9.60 --14.40,-4.80,5.58,0.00,1.00,-4.80,4.80 -172.80,4.80,10.42,0.00,1.00,-4.80,4.80 --4.80,-0.00,5.60,0.00,1.00,-0.00,0.00 -0.00,0.00,10.40,0.00,1.00,0.00,0.00 --177.60,-0.00,5.62,0.00,1.00,4.80,-4.80 -9.60,0.00,10.38,0.00,1.00,4.80,-4.80 --168.00,-4.80,5.64,0.00,1.00,9.60,-9.60 -19.20,4.80,10.36,0.00,1.00,9.60,-9.60 --158.40,-4.80,5.66,0.00,1.00,14.40,-14.40 -28.80,4.80,10.34,0.00,1.00,19.20,-14.40 --148.80,-4.80,5.68,0.00,1.00,19.20,-19.20 -38.40,4.80,10.32,0.00,1.00,24.00,-19.20 --139.20,-9.60,5.70,0.00,1.00,28.80,-24.00 -48.00,9.60,10.30,0.00,1.00,33.60,-24.00 --129.60,-9.60,5.72,0.00,1.00,38.40,-24.00 -57.60,9.60,10.28,0.00,1.00,43.20,-28.80 --120.00,-9.60,5.75,0.00,1.00,48.00,-28.80 -67.20,9.60,10.25,0.00,1.00,52.80,-28.80 --110.40,-9.60,5.77,0.00,1.00,57.60,-33.60 -76.80,9.60,10.23,0.00,1.00,67.20,-33.60 --100.80,-9.60,5.79,0.00,1.00,76.80,-33.60 -86.40,9.60,10.21,0.00,1.00,81.60,-33.60 --86.40,-9.60,5.81,0.00,1.00,91.20,-33.60 -96.00,9.60,10.19,0.00,1.00,100.80,-33.60 --76.80,-9.60,5.83,0.00,1.00,110.40,-33.60 -105.60,9.60,10.17,0.00,1.00,115.20,-33.60 --67.20,-9.60,5.85,0.00,1.00,124.80,-33.60 -115.20,9.60,10.15,0.00,1.00,129.60,-28.80 --57.60,-9.60,5.87,0.00,1.00,134.40,-28.80 -124.80,9.60,10.13,0.00,1.00,139.20,-28.80 --48.00,-9.60,5.90,0.00,1.00,144.00,-24.00 -134.40,9.60,10.10,0.00,1.00,148.80,-24.00 --38.40,-9.60,5.92,0.00,1.00,153.60,-19.20 -144.00,4.80,10.08,0.00,1.00,158.40,-19.20 --28.80,-4.80,5.94,0.00,1.00,163.20,-14.40 -153.60,4.80,10.06,0.00,1.00,163.20,-14.40 --19.20,-4.80,5.96,0.00,1.00,168.00,-9.60 -163.20,4.80,10.04,0.00,1.00,172.80,-9.60 --9.60,-0.00,5.98,0.00,1.00,172.80,-4.80 -172.80,0.00,10.02,0.00,1.00,177.60,-4.80 --0.00,-0.00,6.00,0.00,1.00,177.60,-0.00 --177.60,-0.00,10.00,0.00,1.00,-177.60,0.00 -4.80,0.00,6.02,0.00,1.00,-177.60,4.80 --168.00,-0.00,9.98,0.00,1.00,-172.80,4.80 -14.40,4.80,6.05,0.00,1.00,-172.80,9.60 --158.40,-4.80,9.95,0.00,1.00,-168.00,9.60 -24.00,4.80,6.07,0.00,1.00,-163.20,14.40 --148.80,-4.80,9.93,0.00,1.00,-163.20,14.40 -33.60,4.80,6.09,0.00,1.00,-158.40,19.20 --139.20,-9.60,9.91,0.00,1.00,-153.60,19.20 -43.20,9.60,6.11,0.00,1.00,-148.80,24.00 --129.60,-9.60,9.89,0.00,1.00,-144.00,24.00 -52.80,9.60,6.13,0.00,1.00,-139.20,28.80 --120.00,-9.60,9.87,0.00,1.00,-134.40,28.80 -62.40,9.60,6.15,0.00,1.00,-129.60,28.80 --110.40,-9.60,9.85,0.00,1.00,-124.80,33.60 -72.00,9.60,6.17,0.00,1.00,-115.20,33.60 --100.80,-9.60,9.83,0.00,1.00,-110.40,33.60 -81.60,9.60,6.19,0.00,1.00,-100.80,33.60 --91.20,-9.60,9.81,0.00,1.00,-91.20,33.60 -96.00,9.60,6.22,0.00,1.00,-81.60,33.60 --81.60,-9.60,9.78,0.00,1.00,-76.80,33.60 -105.60,9.60,6.24,0.00,1.00,-67.20,33.60 --72.00,-9.60,9.76,0.00,1.00,-57.60,33.60 -115.20,9.60,6.26,0.00,1.00,-52.80,28.80 --62.40,-9.60,9.74,0.00,1.00,-48.00,28.80 -124.80,9.60,6.28,0.00,1.00,-43.20,28.80 --52.80,-9.60,9.72,0.00,1.00,-38.40,24.00 -134.40,9.60,6.30,0.00,1.00,-33.60,24.00 --43.20,-9.60,9.70,0.00,1.00,-28.80,24.00 -144.00,4.80,6.32,0.00,1.00,-24.00,19.20 --33.60,-4.80,9.68,0.00,1.00,-19.20,19.20 -153.60,4.80,6.34,0.00,1.00,-19.20,14.40 --24.00,-4.80,9.66,0.00,1.00,-14.40,14.40 -163.20,4.80,6.37,0.00,1.00,-9.60,9.60 --14.40,-4.80,9.63,0.00,1.00,-9.60,9.60 -172.80,0.00,6.39,0.00,1.00,-4.80,4.80 --4.80,-0.00,9.61,0.00,1.00,-4.80,4.80 -0.00,0.00,6.41,0.00,1.00,0.00,0.00 --177.60,-0.00,9.59,0.00,1.00,4.80,-4.80 -9.60,0.00,6.43,0.00,1.00,4.80,-4.80 --168.00,-0.00,9.57,0.00,1.00,9.60,-9.60 -19.20,0.00,6.45,0.00,1.00,14.40,-9.60 --158.40,-4.80,9.55,0.00,1.00,14.40,-14.40 -28.80,4.80,6.47,0.00,1.00,19.20,-19.20 --148.80,-4.80,9.53,0.00,1.00,24.00,-19.20 -38.40,4.80,6.49,0.00,1.00,24.00,-24.00 --139.20,-4.80,9.51,0.00,1.00,28.80,-24.00 -48.00,4.80,6.52,0.00,1.00,33.60,-28.80 --129.60,-4.80,9.48,0.00,1.00,38.40,-28.80 -57.60,4.80,6.54,0.00,1.00,43.20,-33.60 --120.00,-4.80,9.46,0.00,1.00,48.00,-33.60 -67.20,4.80,6.56,0.00,1.00,57.60,-33.60 --110.40,-4.80,9.44,0.00,1.00,62.40,-38.40 -76.80,4.80,6.58,0.00,1.00,67.20,-38.40 --100.80,-4.80,9.42,0.00,1.00,76.80,-38.40 -86.40,4.80,6.60,0.00,1.00,86.40,-38.40 --86.40,-4.80,9.40,0.00,1.00,91.20,-38.40 -96.00,4.80,6.62,0.00,1.00,100.80,-38.40 --76.80,-4.80,9.38,0.00,1.00,105.60,-38.40 -105.60,4.80,6.64,0.00,1.00,115.20,-38.40 --67.20,-4.80,9.36,0.00,1.00,120.00,-33.60 -115.20,4.80,6.66,0.00,1.00,124.80,-33.60 --57.60,-4.80,9.34,0.00,1.00,134.40,-33.60 -124.80,4.80,6.69,0.00,1.00,139.20,-28.80 --48.00,-4.80,9.31,0.00,1.00,144.00,-28.80 -134.40,4.80,6.71,0.00,1.00,148.80,-24.00 --38.40,-4.80,9.29,0.00,1.00,153.60,-24.00 -144.00,4.80,6.73,0.00,1.00,153.60,-19.20 --28.80,-4.80,9.27,0.00,1.00,158.40,-19.20 -153.60,4.80,6.75,0.00,1.00,163.20,-14.40 --19.20,-4.80,9.25,0.00,1.00,168.00,-14.40 -163.20,0.00,6.77,0.00,1.00,168.00,-9.60 --9.60,-0.00,9.23,0.00,1.00,172.80,-9.60 -172.80,0.00,6.79,0.00,1.00,177.60,-4.80 --0.00,-0.00,9.21,0.00,1.00,177.60,-0.00 --177.60,-0.00,6.81,0.00,1.00,-177.60,0.00 -4.80,0.00,9.19,0.00,1.00,-177.60,4.80 --168.00,-0.00,6.84,0.00,1.00,-172.80,9.60 -14.40,0.00,9.16,0.00,1.00,-168.00,9.60 --158.40,-4.80,6.86,0.00,1.00,-168.00,14.40 -24.00,4.80,9.14,0.00,1.00,-163.20,14.40 --148.80,-4.80,6.88,0.00,1.00,-158.40,19.20 -33.60,4.80,9.12,0.00,1.00,-153.60,19.20 --139.20,-4.80,6.90,0.00,1.00,-153.60,24.00 -43.20,4.80,9.10,0.00,1.00,-148.80,24.00 --129.60,-4.80,6.92,0.00,1.00,-144.00,28.80 -52.80,4.80,9.08,0.00,1.00,-139.20,28.80 --120.00,-4.80,6.94,0.00,1.00,-134.40,33.60 -62.40,4.80,9.06,0.00,1.00,-124.80,33.60 --110.40,-4.80,6.96,0.00,1.00,-120.00,33.60 -72.00,4.80,9.04,0.00,1.00,-115.20,38.40 --100.80,-4.80,6.99,0.00,1.00,-105.60,38.40 -81.60,4.80,9.01,0.00,1.00,-100.80,38.40 --91.20,-4.80,7.01,0.00,1.00,-91.20,38.40 -96.00,4.80,8.99,0.00,1.00,-86.40,38.40 --81.60,-4.80,7.03,0.00,1.00,-76.80,38.40 -105.60,4.80,8.97,0.00,1.00,-67.20,38.40 --72.00,-4.80,7.05,0.00,1.00,-62.40,38.40 -115.20,4.80,8.95,0.00,1.00,-57.60,33.60 --62.40,-4.80,7.07,0.00,1.00,-48.00,33.60 -124.80,4.80,8.93,0.00,1.00,-43.20,33.60 --52.80,-4.80,7.09,0.00,1.00,-38.40,28.80 -134.40,4.80,8.91,0.00,1.00,-33.60,28.80 --43.20,-4.80,7.11,0.00,1.00,-28.80,24.00 -144.00,4.80,8.89,0.00,1.00,-24.00,24.00 --33.60,-4.80,7.13,0.00,1.00,-24.00,19.20 -153.60,4.80,8.87,0.00,1.00,-19.20,19.20 --24.00,-4.80,7.16,0.00,1.00,-14.40,14.40 -163.20,0.00,8.84,0.00,1.00,-14.40,9.60 --14.40,-0.00,7.18,0.00,1.00,-9.60,9.60 -172.80,0.00,8.82,0.00,1.00,-4.80,4.80 --4.80,-0.00,7.20,0.00,1.00,-4.80,4.80 -0.00,0.00,8.80,0.00,1.00,0.00,0.00 --177.60,-0.00,7.22,0.00,1.00,4.80,-4.80 -9.60,0.00,8.78,0.00,1.00,4.80,-4.80 --168.00,-0.00,7.24,0.00,1.00,9.60,-9.60 -19.20,0.00,8.76,0.00,1.00,14.40,-14.40 --158.40,-0.00,7.26,0.00,1.00,19.20,-14.40 -28.80,0.00,8.74,0.00,1.00,19.20,-19.20 --148.80,-0.00,7.28,0.00,1.00,24.00,-24.00 -38.40,0.00,8.72,0.00,1.00,28.80,-24.00 --139.20,-0.00,7.31,0.00,1.00,33.60,-28.80 -48.00,0.00,8.69,0.00,1.00,38.40,-28.80 --129.60,-0.00,7.33,0.00,1.00,43.20,-33.60 -57.60,0.00,8.67,0.00,1.00,48.00,-33.60 --120.00,-0.00,7.35,0.00,1.00,52.80,-38.40 -67.20,0.00,8.65,0.00,1.00,57.60,-38.40 --110.40,-0.00,7.37,0.00,1.00,62.40,-38.40 -76.80,0.00,8.63,0.00,1.00,72.00,-43.20 --100.80,-0.00,7.39,0.00,1.00,76.80,-43.20 -86.40,0.00,8.61,0.00,1.00,86.40,-43.20 --86.40,-0.00,7.41,0.00,1.00,91.20,-43.20 -96.00,0.00,8.59,0.00,1.00,100.80,-43.20 --76.80,-0.00,7.43,0.00,1.00,105.60,-43.20 -105.60,0.00,8.57,0.00,1.00,110.40,-43.20 --67.20,-0.00,7.46,0.00,1.00,120.00,-38.40 -115.20,0.00,8.54,0.00,1.00,124.80,-38.40 --57.60,-0.00,7.48,0.00,1.00,129.60,-38.40 -124.80,0.00,8.52,0.00,1.00,134.40,-33.60 --48.00,-0.00,7.50,0.00,1.00,139.20,-33.60 -134.40,0.00,8.50,0.00,1.00,144.00,-28.80 --38.40,-0.00,7.52,0.00,1.00,148.80,-28.80 -144.00,0.00,8.48,0.00,1.00,153.60,-24.00 --28.80,-0.00,7.54,0.00,1.00,158.40,-19.20 -153.60,0.00,8.46,0.00,1.00,163.20,-19.20 --19.20,-0.00,7.56,0.00,1.00,163.20,-14.40 -163.20,0.00,8.44,0.00,1.00,168.00,-9.60 --9.60,-0.00,7.58,0.00,1.00,172.80,-9.60 -172.80,0.00,8.42,0.00,1.00,172.80,-4.80 --0.00,-0.00,7.60,0.00,1.00,177.60,-0.00 --177.60,-0.00,8.40,0.00,1.00,-177.60,0.00 -4.80,0.00,7.63,0.00,1.00,-172.80,4.80 --168.00,-0.00,8.37,0.00,1.00,-172.80,9.60 -14.40,0.00,7.65,0.00,1.00,-168.00,9.60 --158.40,-0.00,8.35,0.00,1.00,-163.20,14.40 -24.00,0.00,7.67,0.00,1.00,-163.20,19.20 --148.80,-0.00,8.33,0.00,1.00,-158.40,19.20 -33.60,0.00,7.69,0.00,1.00,-153.60,24.00 --139.20,-0.00,8.31,0.00,1.00,-148.80,28.80 -43.20,0.00,7.71,0.00,1.00,-144.00,28.80 --129.60,-0.00,8.29,0.00,1.00,-139.20,33.60 -52.80,0.00,7.73,0.00,1.00,-134.40,33.60 --120.00,-0.00,8.27,0.00,1.00,-129.60,38.40 -62.40,0.00,7.75,0.00,1.00,-124.80,38.40 --110.40,-0.00,8.25,0.00,1.00,-120.00,38.40 -72.00,0.00,7.78,0.00,1.00,-110.40,43.20 --100.80,-0.00,8.22,0.00,1.00,-105.60,43.20 -81.60,0.00,7.80,0.00,1.00,-100.80,43.20 --91.20,-0.00,8.20,0.00,1.00,-91.20,43.20 -96.00,0.00,7.82,0.00,1.00,-86.40,43.20 --81.60,-0.00,8.18,0.00,1.00,-76.80,43.20 -105.60,0.00,7.84,0.00,1.00,-72.00,43.20 --72.00,-0.00,8.16,0.00,1.00,-62.40,38.40 -115.20,0.00,7.86,0.00,1.00,-57.60,38.40 --62.40,-0.00,8.14,0.00,1.00,-52.80,38.40 -124.80,0.00,7.88,0.00,1.00,-48.00,33.60 --52.80,-0.00,8.12,0.00,1.00,-43.20,33.60 -134.40,0.00,7.90,0.00,1.00,-38.40,28.80 --43.20,-0.00,8.10,0.00,1.00,-33.60,28.80 -144.00,0.00,7.93,0.00,1.00,-28.80,24.00 --33.60,-0.00,8.07,0.00,1.00,-24.00,24.00 -153.60,0.00,7.95,0.00,1.00,-19.20,19.20 --24.00,-0.00,8.05,0.00,1.00,-19.20,14.40 -163.20,0.00,7.97,0.00,1.00,-14.40,14.40 --14.40,-0.00,8.03,0.00,1.00,-9.60,9.60 -172.80,0.00,7.99,0.00,1.00,-4.80,4.80 --4.80,-0.00,8.01,0.00,1.00,-4.80,4.80 -0.00,0.00,8.01,0.00,1.00,0.00,0.00 --177.60,0.00,7.99,0.00,1.00,4.80,-4.80 -9.60,-0.00,8.03,0.00,1.00,4.80,-4.80 --168.00,0.00,7.97,0.00,1.00,9.60,-9.60 -19.20,-0.00,8.05,0.00,1.00,14.40,-14.40 --158.40,0.00,7.95,0.00,1.00,19.20,-19.20 -28.80,-0.00,8.07,0.00,1.00,24.00,-19.20 --148.80,0.00,7.93,0.00,1.00,24.00,-24.00 -38.40,-0.00,8.10,0.00,1.00,28.80,-28.80 --139.20,0.00,7.90,0.00,1.00,33.60,-28.80 -48.00,-0.00,8.12,0.00,1.00,38.40,-33.60 --129.60,0.00,7.88,0.00,1.00,43.20,-38.40 -57.60,-4.80,8.14,0.00,1.00,48.00,-38.40 --120.00,4.80,7.86,0.00,1.00,52.80,-43.20 -67.20,-4.80,8.16,0.00,1.00,62.40,-43.20 --110.40,4.80,7.84,0.00,1.00,67.20,-43.20 -76.80,-4.80,8.18,0.00,1.00,72.00,-48.00 --100.80,4.80,7.82,0.00,1.00,76.80,-48.00 -86.40,-4.80,8.20,0.00,1.00,86.40,-48.00 --86.40,4.80,7.80,0.00,1.00,91.20,-48.00 -96.00,-4.80,8.22,0.00,1.00,96.00,-48.00 --76.80,4.80,7.78,0.00,1.00,105.60,-48.00 -105.60,-4.80,8.25,0.00,1.00,110.40,-48.00 --67.20,4.80,7.75,0.00,1.00,115.20,-43.20 -115.20,-4.80,8.27,0.00,1.00,120.00,-43.20 --57.60,4.80,7.73,0.00,1.00,129.60,-38.40 -124.80,-4.80,8.29,0.00,1.00,134.40,-38.40 --48.00,0.00,7.71,0.00,1.00,139.20,-33.60 -134.40,-0.00,8.31,0.00,1.00,144.00,-33.60 --38.40,0.00,7.69,0.00,1.00,148.80,-28.80 -144.00,-0.00,8.33,0.00,1.00,153.60,-24.00 --28.80,0.00,7.67,0.00,1.00,153.60,-24.00 -153.60,-0.00,8.35,0.00,1.00,158.40,-19.20 --19.20,0.00,7.65,0.00,1.00,163.20,-14.40 -163.20,-0.00,8.37,0.00,1.00,168.00,-14.40 --9.60,0.00,7.63,0.00,1.00,172.80,-9.60 -172.80,-0.00,8.40,0.00,1.00,172.80,-4.80 --0.00,0.00,7.60,0.00,1.00,177.60,-0.00 --177.60,0.00,8.42,0.00,1.00,-177.60,0.00 -4.80,-0.00,7.58,0.00,1.00,-172.80,4.80 --168.00,0.00,8.44,0.00,1.00,-172.80,9.60 -14.40,-0.00,7.56,0.00,1.00,-168.00,14.40 --158.40,0.00,8.46,0.00,1.00,-163.20,14.40 -24.00,-0.00,7.54,0.00,1.00,-158.40,19.20 --148.80,0.00,8.48,0.00,1.00,-153.60,24.00 -33.60,-0.00,7.52,0.00,1.00,-153.60,24.00 --139.20,0.00,8.50,0.00,1.00,-148.80,28.80 -43.20,-0.00,7.50,0.00,1.00,-144.00,33.60 --129.60,0.00,8.52,0.00,1.00,-139.20,33.60 -52.80,-4.80,7.48,0.00,1.00,-134.40,38.40 --120.00,4.80,8.54,0.00,1.00,-129.60,38.40 -62.40,-4.80,7.46,0.00,1.00,-120.00,43.20 --110.40,4.80,8.57,0.00,1.00,-115.20,43.20 -72.00,-4.80,7.43,0.00,1.00,-110.40,48.00 --100.80,4.80,8.59,0.00,1.00,-105.60,48.00 -81.60,-4.80,7.41,0.00,1.00,-96.00,48.00 --91.20,4.80,8.61,0.00,1.00,-91.20,48.00 -96.00,-4.80,7.39,0.00,1.00,-86.40,48.00 --81.60,4.80,8.63,0.00,1.00,-76.80,48.00 -105.60,-4.80,7.37,0.00,1.00,-72.00,48.00 --72.00,4.80,8.65,0.00,1.00,-67.20,43.20 -115.20,-4.80,7.35,0.00,1.00,-62.40,43.20 --62.40,4.80,8.67,0.00,1.00,-52.80,43.20 -124.80,-4.80,7.33,0.00,1.00,-48.00,38.40 --52.80,0.00,8.69,0.00,1.00,-43.20,38.40 -134.40,-0.00,7.31,0.00,1.00,-38.40,33.60 --43.20,0.00,8.72,0.00,1.00,-33.60,28.80 -144.00,-0.00,7.28,0.00,1.00,-28.80,28.80 --33.60,0.00,8.74,0.00,1.00,-24.00,24.00 -153.60,-0.00,7.26,0.00,1.00,-24.00,19.20 --24.00,0.00,8.76,0.00,1.00,-19.20,19.20 -163.20,-0.00,7.24,0.00,1.00,-14.40,14.40 --14.40,0.00,8.78,0.00,1.00,-9.60,9.60 -172.80,-0.00,7.22,0.00,1.00,-4.80,4.80 --4.80,0.00,8.80,0.00,1.00,-4.80,4.80 -0.00,0.00,7.20,0.00,1.00,0.00,0.00 --177.60,0.00,8.82,0.00,1.00,4.80,-4.80 -9.60,-0.00,7.18,0.00,1.00,9.60,-9.60 --168.00,0.00,8.84,0.00,1.00,9.60,-9.60 -19.20,-4.80,7.16,0.00,1.00,14.40,-14.40 --158.40,4.80,8.87,0.00,1.00,19.20,-19.20 -28.80,-4.80,7.13,0.00,1.00,24.00,-24.00 --148.80,4.80,8.89,0.00,1.00,28.80,-24.00 -38.40,-4.80,7.11,0.00,1.00,33.60,-28.80 --139.20,4.80,8.91,0.00,1.00,38.40,-33.60 -48.00,-4.80,7.09,0.00,1.00,43.20,-38.40 --129.60,4.80,8.93,0.00,1.00,48.00,-38.40 -57.60,-4.80,7.07,0.00,1.00,52.80,-43.20 --120.00,4.80,8.95,0.00,1.00,57.60,-43.20 -67.20,-4.80,7.05,0.00,1.00,62.40,-48.00 --110.40,9.60,8.97,0.00,1.00,67.20,-48.00 -76.80,-9.60,7.03,0.00,1.00,72.00,-52.80 --100.80,9.60,8.99,0.00,1.00,81.60,-52.80 -86.40,-9.60,7.01,0.00,1.00,86.40,-52.80 --86.40,9.60,9.01,0.00,1.00,91.20,-52.80 -96.00,-9.60,6.99,0.00,1.00,96.00,-52.80 --76.80,9.60,9.04,0.00,1.00,105.60,-52.80 -105.60,-9.60,6.96,0.00,1.00,110.40,-48.00 --67.20,9.60,9.06,0.00,1.00,115.20,-48.00 -115.20,-4.80,6.94,0.00,1.00,120.00,-48.00 --57.60,4.80,9.08,0.00,1.00,124.80,-43.20 -124.80,-4.80,6.92,0.00,1.00,129.60,-43.20 --48.00,4.80,9.10,0.00,1.00,134.40,-38.40 -134.40,-4.80,6.90,0.00,1.00,139.20,-33.60 --38.40,4.80,9.12,0.00,1.00,144.00,-33.60 -144.00,-4.80,6.88,0.00,1.00,148.80,-28.80 --28.80,4.80,9.14,0.00,1.00,153.60,-24.00 -153.60,-4.80,6.86,0.00,1.00,158.40,-19.20 --19.20,4.80,9.16,0.00,1.00,163.20,-19.20 -163.20,-0.00,6.84,0.00,1.00,168.00,-14.40 --9.60,0.00,9.19,0.00,1.00,168.00,-9.60 -172.80,-0.00,6.81,0.00,1.00,172.80,-4.80 --0.00,0.00,9.21,0.00,1.00,177.60,-0.00 --177.60,0.00,6.79,0.00,1.00,-177.60,0.00 -4.80,-0.00,9.23,0.00,1.00,-172.80,4.80 --168.00,0.00,6.77,0.00,1.00,-168.00,9.60 -14.40,-0.00,9.25,0.00,1.00,-168.00,14.40 --158.40,4.80,6.75,0.00,1.00,-163.20,19.20 -24.00,-4.80,9.27,0.00,1.00,-158.40,19.20 --148.80,4.80,6.73,0.00,1.00,-153.60,24.00 -33.60,-4.80,9.29,0.00,1.00,-148.80,28.80 --139.20,4.80,6.71,0.00,1.00,-144.00,33.60 -43.20,-4.80,9.31,0.00,1.00,-139.20,33.60 --129.60,4.80,6.69,0.00,1.00,-134.40,38.40 -52.80,-4.80,9.34,0.00,1.00,-129.60,43.20 --120.00,4.80,6.66,0.00,1.00,-124.80,43.20 -62.40,-4.80,9.36,0.00,1.00,-120.00,48.00 --110.40,9.60,6.64,0.00,1.00,-115.20,48.00 -72.00,-9.60,9.38,0.00,1.00,-110.40,48.00 --100.80,9.60,6.62,0.00,1.00,-105.60,52.80 -81.60,-9.60,9.40,0.00,1.00,-96.00,52.80 --91.20,9.60,6.60,0.00,1.00,-91.20,52.80 -96.00,-9.60,9.42,0.00,1.00,-86.40,52.80 --81.60,9.60,6.58,0.00,1.00,-81.60,52.80 -105.60,-9.60,9.44,0.00,1.00,-72.00,52.80 --72.00,9.60,6.56,0.00,1.00,-67.20,48.00 -115.20,-4.80,9.46,0.00,1.00,-62.40,48.00 --62.40,4.80,6.54,0.00,1.00,-57.60,43.20 -124.80,-4.80,9.48,0.00,1.00,-52.80,43.20 --52.80,4.80,6.52,0.00,1.00,-48.00,38.40 -134.40,-4.80,9.51,0.00,1.00,-43.20,38.40 --43.20,4.80,6.49,0.00,1.00,-38.40,33.60 -144.00,-4.80,9.53,0.00,1.00,-33.60,28.80 --33.60,4.80,6.47,0.00,1.00,-28.80,24.00 -153.60,-4.80,9.55,0.00,1.00,-24.00,24.00 --24.00,4.80,6.45,0.00,1.00,-19.20,19.20 -163.20,-4.80,9.57,0.00,1.00,-14.40,14.40 --14.40,0.00,6.43,0.00,1.00,-9.60,9.60 -172.80,-0.00,9.59,0.00,1.00,-9.60,9.60 --4.80,0.00,6.41,0.00,1.00,-4.80,4.80 -0.00,0.00,9.61,0.00,1.00,0.00,0.00 --177.60,0.00,6.39,0.00,1.00,4.80,-4.80 -9.60,-0.00,9.63,0.00,1.00,9.60,-9.60 --168.00,4.80,6.37,0.00,1.00,14.40,-14.40 -19.20,-4.80,9.66,0.00,1.00,14.40,-14.40 --158.40,4.80,6.34,0.00,1.00,19.20,-19.20 -28.80,-4.80,9.68,0.00,1.00,24.00,-24.00 --148.80,4.80,6.32,0.00,1.00,28.80,-28.80 -38.40,-9.60,9.70,0.00,1.00,33.60,-33.60 --139.20,9.60,6.30,0.00,1.00,38.40,-33.60 -48.00,-9.60,9.72,0.00,1.00,43.20,-38.40 --129.60,9.60,6.28,0.00,1.00,48.00,-43.20 -57.60,-9.60,9.74,0.00,1.00,52.80,-43.20 --120.00,9.60,6.26,0.00,1.00,57.60,-48.00 -67.20,-9.60,9.76,0.00,1.00,62.40,-52.80 --110.40,9.60,6.24,0.00,1.00,67.20,-52.80 -76.80,-14.40,9.78,0.00,1.00,76.80,-57.60 --100.80,14.40,6.22,0.00,1.00,81.60,-57.60 -86.40,-14.40,9.81,0.00,1.00,86.40,-57.60 --86.40,14.40,6.19,0.00,1.00,91.20,-57.60 -96.00,-14.40,9.83,0.00,1.00,96.00,-57.60 --76.80,14.40,6.17,0.00,1.00,100.80,-57.60 -105.60,-14.40,9.85,0.00,1.00,110.40,-52.80 --67.20,9.60,6.15,0.00,1.00,115.20,-52.80 -115.20,-9.60,9.87,0.00,1.00,120.00,-48.00 --57.60,9.60,6.13,0.00,1.00,124.80,-48.00 -124.80,-9.60,9.89,0.00,1.00,129.60,-43.20 --48.00,9.60,6.11,0.00,1.00,134.40,-38.40 -134.40,-9.60,9.91,0.00,1.00,139.20,-38.40 --38.40,9.60,6.09,0.00,1.00,144.00,-33.60 -144.00,-9.60,9.93,0.00,1.00,148.80,-28.80 --28.80,4.80,6.07,0.00,1.00,153.60,-24.00 -153.60,-4.80,9.95,0.00,1.00,158.40,-24.00 --19.20,4.80,6.05,0.00,1.00,163.20,-19.20 -163.20,-4.80,9.98,0.00,1.00,168.00,-14.40 --9.60,4.80,6.02,0.00,1.00,168.00,-9.60 -172.80,-0.00,10.00,0.00,1.00,172.80,-4.80 --0.00,0.00,6.00,0.00,1.00,177.60,-0.00 --177.60,0.00,10.02,0.00,1.00,-177.60,0.00 -4.80,-0.00,5.98,0.00,1.00,-172.80,4.80 --168.00,4.80,10.04,0.00,1.00,-168.00,9.60 -14.40,-4.80,5.96,0.00,1.00,-168.00,14.40 --158.40,4.80,10.06,0.00,1.00,-163.20,19.20 -24.00,-4.80,5.94,0.00,1.00,-158.40,24.00 --148.80,4.80,10.08,0.00,1.00,-153.60,24.00 -33.60,-9.60,5.92,0.00,1.00,-148.80,28.80 --139.20,9.60,10.10,0.00,1.00,-144.00,33.60 -43.20,-9.60,5.90,0.00,1.00,-139.20,38.40 --129.60,9.60,10.13,0.00,1.00,-134.40,38.40 -52.80,-9.60,5.87,0.00,1.00,-129.60,43.20 --120.00,9.60,10.15,0.00,1.00,-124.80,48.00 -62.40,-9.60,5.85,0.00,1.00,-120.00,48.00 --110.40,9.60,10.17,0.00,1.00,-115.20,52.80 -72.00,-14.40,5.83,0.00,1.00,-110.40,52.80 --100.80,14.40,10.19,0.00,1.00,-100.80,57.60 -81.60,-14.40,5.81,0.00,1.00,-96.00,57.60 --91.20,14.40,10.21,0.00,1.00,-91.20,57.60 -96.00,-14.40,5.79,0.00,1.00,-86.40,57.60 --81.60,14.40,10.23,0.00,1.00,-81.60,57.60 -105.60,-14.40,5.77,0.00,1.00,-76.80,57.60 --72.00,9.60,10.25,0.00,1.00,-67.20,52.80 -115.20,-9.60,5.75,0.00,1.00,-62.40,52.80 --62.40,9.60,10.28,0.00,1.00,-57.60,48.00 -124.80,-9.60,5.72,0.00,1.00,-52.80,43.20 --52.80,9.60,10.30,0.00,1.00,-48.00,43.20 -134.40,-9.60,5.70,0.00,1.00,-43.20,38.40 --43.20,9.60,10.32,0.00,1.00,-38.40,33.60 -144.00,-9.60,5.68,0.00,1.00,-33.60,33.60 --33.60,4.80,10.34,0.00,1.00,-28.80,28.80 -153.60,-4.80,5.66,0.00,1.00,-24.00,24.00 --24.00,4.80,10.36,0.00,1.00,-19.20,19.20 -163.20,-4.80,5.64,0.00,1.00,-14.40,14.40 --14.40,4.80,10.38,0.00,1.00,-14.40,14.40 -172.80,-0.00,5.62,0.00,1.00,-9.60,9.60 --4.80,0.00,10.40,0.00,1.00,-4.80,4.80 -0.00,0.00,5.60,0.00,1.00,0.00,0.00 --177.60,0.00,10.42,0.00,1.00,4.80,-4.80 -9.60,-4.80,5.58,0.00,1.00,9.60,-9.60 --168.00,4.80,10.45,0.00,1.00,14.40,-14.40 -19.20,-4.80,5.55,0.00,1.00,19.20,-19.20 --158.40,4.80,10.47,0.00,1.00,19.20,-19.20 -28.80,-9.60,5.53,0.00,1.00,24.00,-24.00 --148.80,9.60,10.49,0.00,1.00,28.80,-28.80 -38.40,-9.60,5.51,0.00,1.00,33.60,-33.60 --139.20,9.60,10.51,0.00,1.00,38.40,-38.40 -48.00,-14.40,5.49,0.00,1.00,43.20,-43.20 --129.60,14.40,10.53,0.00,1.00,48.00,-43.20 -57.60,-14.40,5.47,0.00,1.00,52.80,-48.00 --120.00,14.40,10.55,0.00,1.00,57.60,-52.80 -67.20,-14.40,5.45,0.00,1.00,62.40,-52.80 --110.40,14.40,10.57,0.00,1.00,72.00,-57.60 -76.80,-19.20,5.43,0.00,1.00,76.80,-57.60 --100.80,19.20,10.60,0.00,1.00,81.60,-62.40 -86.40,-19.20,5.40,0.00,1.00,86.40,-62.40 --86.40,19.20,10.62,0.00,1.00,91.20,-62.40 -96.00,-19.20,5.38,0.00,1.00,96.00,-62.40 --76.80,19.20,10.64,0.00,1.00,100.80,-62.40 -105.60,-14.40,5.36,0.00,1.00,105.60,-57.60 --67.20,14.40,10.66,0.00,1.00,110.40,-57.60 -115.20,-14.40,5.34,0.00,1.00,120.00,-52.80 --57.60,14.40,10.68,0.00,1.00,124.80,-48.00 -124.80,-14.40,5.32,0.00,1.00,129.60,-48.00 --48.00,14.40,10.70,0.00,1.00,134.40,-43.20 -134.40,-14.40,5.30,0.00,1.00,139.20,-38.40 --38.40,9.60,10.72,0.00,1.00,144.00,-33.60 -144.00,-9.60,5.28,0.00,1.00,148.80,-33.60 --28.80,9.60,10.74,0.00,1.00,153.60,-28.80 -153.60,-9.60,5.26,0.00,1.00,158.40,-24.00 --19.20,4.80,10.77,0.00,1.00,158.40,-19.20 -163.20,-4.80,5.23,0.00,1.00,163.20,-14.40 --9.60,4.80,10.79,0.00,1.00,168.00,-9.60 -172.80,-0.00,5.21,0.00,1.00,172.80,-4.80 --0.00,0.00,10.81,0.00,1.00,177.60,-0.00 --177.60,0.00,5.19,0.00,1.00,-177.60,0.00 -4.80,-0.00,10.83,0.00,1.00,-172.80,4.80 --168.00,4.80,5.17,0.00,1.00,-168.00,9.60 -14.40,-4.80,10.85,0.00,1.00,-163.20,14.40 --158.40,4.80,5.15,0.00,1.00,-158.40,19.20 -24.00,-9.60,10.87,0.00,1.00,-158.40,24.00 --148.80,9.60,5.13,0.00,1.00,-153.60,28.80 -33.60,-9.60,10.89,0.00,1.00,-148.80,33.60 --139.20,9.60,5.11,0.00,1.00,-144.00,33.60 -43.20,-14.40,10.92,0.00,1.00,-139.20,38.40 --129.60,14.40,5.08,0.00,1.00,-134.40,43.20 -52.80,-14.40,10.94,0.00,1.00,-129.60,48.00 --120.00,14.40,5.06,0.00,1.00,-124.80,48.00 -62.40,-14.40,10.96,0.00,1.00,-120.00,52.80 --110.40,14.40,5.04,0.00,1.00,-110.40,57.60 -72.00,-14.40,10.98,0.00,1.00,-105.60,57.60 --100.80,19.20,5.02,0.00,1.00,-100.80,62.40 -81.60,-19.20,11.00,0.00,1.00,-96.00,62.40 --91.20,19.20,5.00,0.00,1.00,-91.20,62.40 -96.00,-19.20,11.02,0.00,1.00,-86.40,62.40 --81.60,19.20,4.98,0.00,1.00,-81.60,62.40 -105.60,-19.20,11.04,0.00,1.00,-76.80,57.60 --72.00,14.40,4.96,0.00,1.00,-72.00,57.60 -115.20,-14.40,11.07,0.00,1.00,-62.40,52.80 --62.40,14.40,4.93,0.00,1.00,-57.60,52.80 -124.80,-14.40,11.09,0.00,1.00,-52.80,48.00 --52.80,14.40,4.91,0.00,1.00,-48.00,43.20 -134.40,-14.40,11.11,0.00,1.00,-43.20,43.20 --43.20,9.60,4.89,0.00,1.00,-38.40,38.40 -144.00,-9.60,11.13,0.00,1.00,-33.60,33.60 --33.60,9.60,4.87,0.00,1.00,-28.80,28.80 -153.60,-9.60,11.15,0.00,1.00,-24.00,24.00 --24.00,4.80,4.85,0.00,1.00,-19.20,19.20 -163.20,-4.80,11.17,0.00,1.00,-19.20,19.20 --14.40,4.80,4.83,0.00,1.00,-14.40,14.40 -172.80,-4.80,11.19,0.00,1.00,-9.60,9.60 --4.80,0.00,4.81,0.00,1.00,-4.80,4.80 -0.00,0.00,11.21,0.00,1.00,0.00,0.00 --177.60,0.00,4.79,0.00,1.00,4.80,-4.80 -9.60,-4.80,11.24,0.00,1.00,9.60,-9.60 --168.00,4.80,4.76,0.00,1.00,14.40,-14.40 -19.20,-4.80,11.26,0.00,1.00,19.20,-19.20 --158.40,9.60,4.74,0.00,1.00,24.00,-24.00 -28.80,-9.60,11.28,0.00,1.00,28.80,-24.00 --148.80,14.40,4.72,0.00,1.00,33.60,-28.80 -38.40,-14.40,11.30,0.00,1.00,38.40,-33.60 --139.20,14.40,4.70,0.00,1.00,43.20,-38.40 -48.00,-14.40,11.32,0.00,1.00,48.00,-43.20 --129.60,19.20,4.68,0.00,1.00,52.80,-48.00 -57.60,-19.20,11.34,0.00,1.00,57.60,-52.80 --120.00,19.20,4.66,0.00,1.00,62.40,-52.80 -67.20,-19.20,11.36,0.00,1.00,67.20,-57.60 --110.40,19.20,4.64,0.00,1.00,72.00,-62.40 -76.80,-19.20,11.39,0.00,1.00,76.80,-62.40 --100.80,24.00,4.61,0.00,1.00,81.60,-67.20 -86.40,-24.00,11.41,0.00,1.00,86.40,-67.20 --86.40,24.00,4.59,0.00,1.00,91.20,-67.20 -96.00,-24.00,11.43,0.00,1.00,96.00,-67.20 --76.80,24.00,4.57,0.00,1.00,100.80,-67.20 -105.60,-19.20,11.45,0.00,1.00,105.60,-62.40 --67.20,19.20,4.55,0.00,1.00,110.40,-57.60 -115.20,-19.20,11.47,0.00,1.00,115.20,-57.60 --57.60,19.20,4.53,0.00,1.00,120.00,-52.80 -124.80,-19.20,11.49,0.00,1.00,124.80,-48.00 --48.00,19.20,4.51,0.00,1.00,129.60,-43.20 -134.40,-14.40,11.51,0.00,1.00,134.40,-43.20 --38.40,14.40,4.49,0.00,1.00,139.20,-38.40 -144.00,-14.40,11.54,0.00,1.00,144.00,-33.60 --28.80,9.60,4.46,0.00,1.00,148.80,-28.80 -153.60,-9.60,11.56,0.00,1.00,153.60,-24.00 --19.20,9.60,4.44,0.00,1.00,158.40,-19.20 -163.20,-4.80,11.58,0.00,1.00,163.20,-14.40 --9.60,4.80,4.42,0.00,1.00,168.00,-9.60 -172.80,-4.80,11.60,0.00,1.00,172.80,-4.80 --0.00,0.00,4.40,0.00,1.00,177.60,-0.00 --177.60,0.00,11.62,0.00,1.00,-177.60,0.00 -4.80,-4.80,4.38,0.00,1.00,-172.80,4.80 --168.00,4.80,11.64,0.00,1.00,-168.00,9.60 -14.40,-4.80,4.36,0.00,1.00,-163.20,14.40 --158.40,9.60,11.66,0.00,1.00,-158.40,19.20 -24.00,-9.60,4.34,0.00,1.00,-153.60,24.00 --148.80,9.60,11.68,0.00,1.00,-148.80,28.80 -33.60,-14.40,4.32,0.00,1.00,-144.00,33.60 --139.20,14.40,11.71,0.00,1.00,-139.20,38.40 -43.20,-14.40,4.29,0.00,1.00,-134.40,43.20 --129.60,19.20,11.73,0.00,1.00,-129.60,43.20 -52.80,-19.20,4.27,0.00,1.00,-124.80,48.00 --120.00,19.20,11.75,0.00,1.00,-120.00,52.80 -62.40,-19.20,4.25,0.00,1.00,-115.20,57.60 --110.40,19.20,11.77,0.00,1.00,-110.40,57.60 -72.00,-19.20,4.23,0.00,1.00,-105.60,62.40 --100.80,24.00,11.79,0.00,1.00,-100.80,67.20 -81.60,-24.00,4.21,0.00,1.00,-96.00,67.20 --91.20,24.00,11.81,0.00,1.00,-91.20,67.20 -96.00,-24.00,4.19,0.00,1.00,-86.40,67.20 --81.60,24.00,11.83,0.00,1.00,-81.60,67.20 -105.60,-19.20,4.17,0.00,1.00,-76.80,62.40 --72.00,19.20,11.86,0.00,1.00,-72.00,62.40 -115.20,-19.20,4.14,0.00,1.00,-67.20,57.60 --62.40,19.20,11.88,0.00,1.00,-62.40,52.80 -124.80,-19.20,4.12,0.00,1.00,-57.60,52.80 --52.80,19.20,11.90,0.00,1.00,-52.80,48.00 -134.40,-14.40,4.10,0.00,1.00,-48.00,43.20 --43.20,14.40,11.92,0.00,1.00,-43.20,38.40 -144.00,-14.40,4.08,0.00,1.00,-38.40,33.60 --33.60,14.40,11.94,0.00,1.00,-33.60,28.80 -153.60,-9.60,4.06,0.00,1.00,-28.80,24.00 --24.00,9.60,11.96,0.00,1.00,-24.00,24.00 -163.20,-4.80,4.04,0.00,1.00,-19.20,19.20 --14.40,4.80,11.98,0.00,1.00,-14.40,14.40 -172.80,-4.80,4.02,0.00,1.00,-9.60,9.60 --4.80,0.00,12.01,0.00,1.00,-4.80,4.80 -0.00,0.00,3.99,0.00,1.00,0.00,0.00 --177.60,0.00,12.03,0.00,1.00,4.80,-4.80 -9.60,-4.80,3.97,0.00,1.00,9.60,-9.60 --168.00,4.80,12.05,0.00,1.00,14.40,-14.40 -19.20,-9.60,3.95,0.00,1.00,19.20,-19.20 --158.40,9.60,12.07,0.00,1.00,24.00,-24.00 -24.00,-14.40,3.93,0.00,1.00,28.80,-28.80 --148.80,14.40,12.09,0.00,1.00,33.60,-33.60 -33.60,-14.40,3.91,0.00,1.00,38.40,-38.40 --139.20,19.20,12.11,0.00,1.00,43.20,-38.40 -43.20,-19.20,3.89,0.00,1.00,48.00,-43.20 --129.60,19.20,12.13,0.00,1.00,52.80,-48.00 -52.80,-24.00,3.87,0.00,1.00,57.60,-52.80 --120.00,24.00,12.15,0.00,1.00,62.40,-57.60 -62.40,-24.00,3.85,0.00,1.00,67.20,-62.40 --110.40,24.00,12.18,0.00,1.00,72.00,-62.40 -76.80,-24.00,3.82,0.00,1.00,76.80,-67.20 --100.80,28.80,12.20,0.00,1.00,81.60,-72.00 -86.40,-28.80,3.80,0.00,1.00,86.40,-72.00 --86.40,28.80,12.22,0.00,1.00,91.20,-72.00 -96.00,-28.80,3.78,0.00,1.00,96.00,-72.00 --76.80,28.80,12.24,0.00,1.00,100.80,-67.20 -105.60,-24.00,3.76,0.00,1.00,105.60,-67.20 --67.20,24.00,12.26,0.00,1.00,110.40,-62.40 -120.00,-24.00,3.74,0.00,1.00,115.20,-57.60 --57.60,24.00,12.28,0.00,1.00,120.00,-57.60 -129.60,-24.00,3.72,0.00,1.00,124.80,-52.80 --48.00,19.20,12.30,0.00,1.00,129.60,-48.00 -139.20,-19.20,3.70,0.00,1.00,134.40,-43.20 --38.40,19.20,12.33,0.00,1.00,139.20,-38.40 -148.80,-14.40,3.67,0.00,1.00,144.00,-33.60 --28.80,14.40,12.35,0.00,1.00,148.80,-28.80 -158.40,-9.60,3.65,0.00,1.00,153.60,-24.00 --19.20,9.60,12.37,0.00,1.00,158.40,-19.20 -163.20,-9.60,3.63,0.00,1.00,163.20,-14.40 --9.60,4.80,12.39,0.00,1.00,168.00,-9.60 -172.80,-4.80,3.61,0.00,1.00,172.80,-4.80 --0.00,0.00,12.41,0.00,1.00,177.60,-0.00 --177.60,0.00,3.59,0.00,1.00,-177.60,0.00 -4.80,-4.80,12.43,0.00,1.00,-172.80,4.80 --168.00,4.80,3.57,0.00,1.00,-168.00,9.60 -14.40,-9.60,12.45,0.00,1.00,-163.20,14.40 --158.40,9.60,3.55,0.00,1.00,-158.40,19.20 -24.00,-9.60,12.48,0.00,1.00,-153.60,24.00 --153.60,14.40,3.52,0.00,1.00,-148.80,28.80 -33.60,-14.40,12.50,0.00,1.00,-144.00,33.60 --144.00,19.20,3.50,0.00,1.00,-139.20,38.40 -43.20,-19.20,12.52,0.00,1.00,-134.40,43.20 --134.40,19.20,3.48,0.00,1.00,-129.60,48.00 -52.80,-24.00,12.54,0.00,1.00,-124.80,52.80 --124.80,24.00,3.46,0.00,1.00,-120.00,57.60 -62.40,-24.00,12.56,0.00,1.00,-115.20,57.60 --110.40,24.00,3.44,0.00,1.00,-110.40,62.40 -72.00,-24.00,12.58,0.00,1.00,-105.60,67.20 --100.80,28.80,3.42,0.00,1.00,-100.80,67.20 -81.60,-28.80,12.60,0.00,1.00,-96.00,72.00 --91.20,28.80,3.40,0.00,1.00,-91.20,72.00 -96.00,-28.80,12.62,0.00,1.00,-86.40,72.00 --81.60,28.80,3.38,0.00,1.00,-81.60,72.00 -105.60,-24.00,12.65,0.00,1.00,-76.80,67.20 --72.00,24.00,3.35,0.00,1.00,-72.00,62.40 -115.20,-24.00,12.67,0.00,1.00,-67.20,62.40 --57.60,24.00,3.33,0.00,1.00,-62.40,57.60 -124.80,-24.00,12.69,0.00,1.00,-57.60,52.80 --48.00,19.20,3.31,0.00,1.00,-52.80,48.00 -134.40,-19.20,12.71,0.00,1.00,-48.00,43.20 --38.40,19.20,3.29,0.00,1.00,-43.20,38.40 -144.00,-14.40,12.73,0.00,1.00,-38.40,38.40 --28.80,14.40,3.27,0.00,1.00,-33.60,33.60 -153.60,-14.40,12.75,0.00,1.00,-28.80,28.80 --24.00,9.60,3.25,0.00,1.00,-24.00,24.00 -163.20,-9.60,12.77,0.00,1.00,-19.20,19.20 --14.40,4.80,3.23,0.00,1.00,-14.40,14.40 -172.80,-4.80,12.80,0.00,1.00,-9.60,9.60 --4.80,0.00,3.20,0.00,1.00,-4.80,4.80 -0.00,0.00,12.82,0.00,1.00,0.00,0.00 --177.60,4.80,3.18,0.00,1.00,4.80,-4.80 -9.60,-4.80,12.84,0.00,1.00,9.60,-9.60 --168.00,9.60,3.16,0.00,1.00,14.40,-14.40 -14.40,-9.60,12.86,0.00,1.00,19.20,-19.20 --158.40,14.40,3.14,0.00,1.00,24.00,-24.00 -24.00,-14.40,12.88,0.00,1.00,28.80,-28.80 --148.80,19.20,3.12,0.00,1.00,33.60,-33.60 -33.60,-19.20,12.90,0.00,1.00,38.40,-38.40 --139.20,19.20,3.10,0.00,1.00,43.20,-43.20 -43.20,-24.00,12.92,0.00,1.00,48.00,-48.00 --129.60,24.00,3.08,0.00,1.00,52.80,-52.80 -52.80,-28.80,12.95,0.00,1.00,57.60,-57.60 --120.00,28.80,3.05,0.00,1.00,62.40,-57.60 -62.40,-28.80,12.97,0.00,1.00,67.20,-62.40 --110.40,28.80,3.03,0.00,1.00,72.00,-67.20 -76.80,-28.80,12.99,0.00,1.00,76.80,-72.00 --100.80,33.60,3.01,0.00,1.00,81.60,-72.00 -86.40,-33.60,13.01,0.00,1.00,86.40,-76.80 --86.40,33.60,2.99,0.00,1.00,91.20,-76.80 -96.00,-33.60,13.03,0.00,1.00,96.00,-76.80 --76.80,28.80,2.97,0.00,1.00,100.80,-72.00 -110.40,-28.80,13.05,0.00,1.00,105.60,-72.00 --67.20,28.80,2.95,0.00,1.00,110.40,-67.20 -120.00,-28.80,13.07,0.00,1.00,115.20,-62.40 --57.60,28.80,2.93,0.00,1.00,120.00,-57.60 -129.60,-24.00,13.09,0.00,1.00,124.80,-52.80 --48.00,24.00,2.91,0.00,1.00,129.60,-48.00 -139.20,-24.00,13.12,0.00,1.00,134.40,-43.20 --38.40,19.20,2.88,0.00,1.00,139.20,-38.40 -148.80,-19.20,13.14,0.00,1.00,144.00,-33.60 --28.80,14.40,2.86,0.00,1.00,148.80,-28.80 -158.40,-14.40,13.16,0.00,1.00,153.60,-24.00 --19.20,9.60,2.84,0.00,1.00,158.40,-19.20 -168.00,-9.60,13.18,0.00,1.00,163.20,-14.40 --9.60,4.80,2.82,0.00,1.00,168.00,-9.60 -172.80,-4.80,13.20,0.00,1.00,172.80,-4.80 --0.00,0.00,2.80,0.00,1.00,177.60,-0.00 --177.60,0.00,13.22,0.00,1.00,-177.60,0.00 -4.80,-4.80,2.78,0.00,1.00,-172.80,4.80 --168.00,4.80,13.24,0.00,1.00,-168.00,9.60 -14.40,-9.60,2.76,0.00,1.00,-163.20,14.40 --163.20,9.60,13.27,0.00,1.00,-158.40,19.20 -24.00,-14.40,2.73,0.00,1.00,-153.60,24.00 --153.60,14.40,13.29,0.00,1.00,-148.80,28.80 -33.60,-19.20,2.71,0.00,1.00,-144.00,33.60 --144.00,19.20,13.31,0.00,1.00,-139.20,38.40 -43.20,-24.00,2.69,0.00,1.00,-134.40,43.20 --134.40,24.00,13.33,0.00,1.00,-129.60,48.00 -52.80,-24.00,2.67,0.00,1.00,-124.80,52.80 --124.80,28.80,13.35,0.00,1.00,-120.00,57.60 -62.40,-28.80,2.65,0.00,1.00,-115.20,62.40 --115.20,28.80,13.37,0.00,1.00,-110.40,67.20 -72.00,-28.80,2.63,0.00,1.00,-105.60,72.00 --100.80,28.80,13.39,0.00,1.00,-100.80,72.00 -81.60,-33.60,2.61,0.00,1.00,-96.00,76.80 --91.20,33.60,13.42,0.00,1.00,-91.20,76.80 -96.00,-33.60,2.58,0.00,1.00,-86.40,76.80 --81.60,33.60,13.44,0.00,1.00,-81.60,72.00 -105.60,-28.80,2.56,0.00,1.00,-76.80,72.00 --67.20,28.80,13.46,0.00,1.00,-72.00,67.20 -115.20,-28.80,2.54,0.00,1.00,-67.20,62.40 --57.60,28.80,13.48,0.00,1.00,-62.40,57.60 -124.80,-28.80,2.52,0.00,1.00,-57.60,57.60 --48.00,24.00,13.50,0.00,1.00,-52.80,52.80 -134.40,-24.00,2.50,0.00,1.00,-48.00,48.00 --38.40,19.20,13.52,0.00,1.00,-43.20,43.20 -144.00,-19.20,2.48,0.00,1.00,-38.40,38.40 --28.80,19.20,13.54,0.00,1.00,-33.60,33.60 -153.60,-14.40,2.46,0.00,1.00,-28.80,28.80 --19.20,14.40,13.56,0.00,1.00,-24.00,24.00 -163.20,-9.60,2.44,0.00,1.00,-19.20,19.20 --14.40,9.60,13.59,0.00,1.00,-14.40,14.40 -172.80,-4.80,2.41,0.00,1.00,-9.60,9.60 --4.80,4.80,13.61,0.00,1.00,-4.80,4.80 -0.00,0.00,2.39,0.00,1.00,0.00,0.00 --177.60,4.80,13.63,0.00,1.00,4.80,-4.80 -9.60,-4.80,2.37,0.00,1.00,9.60,-9.60 --168.00,9.60,13.65,0.00,1.00,14.40,-14.40 -14.40,-9.60,2.35,0.00,1.00,19.20,-19.20 --158.40,14.40,13.67,0.00,1.00,24.00,-24.00 -24.00,-14.40,2.33,0.00,1.00,28.80,-28.80 --153.60,19.20,13.69,0.00,1.00,33.60,-33.60 -33.60,-24.00,2.31,0.00,1.00,38.40,-38.40 --144.00,24.00,13.71,0.00,1.00,43.20,-43.20 -43.20,-24.00,2.29,0.00,1.00,48.00,-48.00 --134.40,28.80,13.74,0.00,1.00,52.80,-52.80 -52.80,-28.80,2.26,0.00,1.00,57.60,-57.60 --124.80,33.60,13.76,0.00,1.00,62.40,-62.40 -62.40,-33.60,2.24,0.00,1.00,67.20,-67.20 --110.40,33.60,13.78,0.00,1.00,72.00,-72.00 -72.00,-33.60,2.22,0.00,1.00,76.80,-72.00 --100.80,38.40,13.80,0.00,1.00,81.60,-76.80 -86.40,-38.40,2.20,0.00,1.00,86.40,-81.60 --86.40,38.40,13.82,0.00,1.00,91.20,-81.60 -96.00,-38.40,2.18,0.00,1.00,96.00,-81.60 --76.80,33.60,13.84,0.00,1.00,100.80,-76.80 -110.40,-33.60,2.16,0.00,1.00,105.60,-72.00 --67.20,33.60,13.86,0.00,1.00,110.40,-67.20 -120.00,-33.60,2.14,0.00,1.00,115.20,-62.40 --52.80,28.80,13.89,0.00,1.00,120.00,-57.60 -129.60,-28.80,2.11,0.00,1.00,124.80,-52.80 --43.20,28.80,13.91,0.00,1.00,129.60,-48.00 -139.20,-24.00,2.09,0.00,1.00,134.40,-43.20 --33.60,24.00,13.93,0.00,1.00,139.20,-38.40 -148.80,-19.20,2.07,0.00,1.00,144.00,-33.60 --24.00,19.20,13.95,0.00,1.00,148.80,-28.80 -158.40,-14.40,2.05,0.00,1.00,153.60,-24.00 --19.20,14.40,13.97,0.00,1.00,158.40,-19.20 -168.00,-9.60,2.03,0.00,1.00,163.20,-14.40 --9.60,4.80,13.99,0.00,1.00,168.00,-9.60 -172.80,-4.80,2.01,0.00,1.00,172.80,-4.80 --0.00,0.00,14.01,0.00,1.00,177.60,-0.00 --177.60,0.00,1.99,0.00,1.00,-177.60,0.00 -4.80,-4.80,14.03,0.00,1.00,-172.80,4.80 --168.00,4.80,1.97,0.00,1.00,-168.00,9.60 -14.40,-9.60,14.06,0.00,1.00,-163.20,14.40 --163.20,14.40,1.94,0.00,1.00,-158.40,19.20 -24.00,-14.40,14.08,0.00,1.00,-153.60,24.00 --153.60,19.20,1.92,0.00,1.00,-148.80,28.80 -28.80,-19.20,14.10,0.00,1.00,-144.00,33.60 --144.00,24.00,1.90,0.00,1.00,-139.20,38.40 -38.40,-24.00,14.12,0.00,1.00,-134.40,43.20 --134.40,28.80,1.88,0.00,1.00,-129.60,48.00 -48.00,-28.80,14.14,0.00,1.00,-124.80,52.80 --124.80,28.80,1.86,0.00,1.00,-120.00,57.60 -57.60,-33.60,14.16,0.00,1.00,-115.20,62.40 --115.20,33.60,1.84,0.00,1.00,-110.40,67.20 -72.00,-33.60,14.18,0.00,1.00,-105.60,72.00 --105.60,33.60,1.82,0.00,1.00,-100.80,76.80 -81.60,-38.40,14.21,0.00,1.00,-96.00,81.60 --91.20,38.40,1.79,0.00,1.00,-91.20,81.60 -96.00,-38.40,14.23,0.00,1.00,-86.40,81.60 --81.60,38.40,1.77,0.00,1.00,-81.60,76.80 -105.60,-33.60,14.25,0.00,1.00,-76.80,72.00 --67.20,33.60,1.75,0.00,1.00,-72.00,72.00 -120.00,-33.60,14.27,0.00,1.00,-67.20,67.20 --57.60,33.60,1.73,0.00,1.00,-62.40,62.40 -129.60,-28.80,14.29,0.00,1.00,-57.60,57.60 --48.00,28.80,1.71,0.00,1.00,-52.80,52.80 -139.20,-24.00,14.31,0.00,1.00,-48.00,48.00 --38.40,24.00,1.69,0.00,1.00,-43.20,43.20 -148.80,-24.00,14.33,0.00,1.00,-38.40,38.40 --28.80,19.20,1.67,0.00,1.00,-33.60,33.60 -158.40,-14.40,14.36,0.00,1.00,-28.80,28.80 --19.20,14.40,1.64,0.00,1.00,-24.00,24.00 -163.20,-9.60,14.38,0.00,1.00,-19.20,19.20 --9.60,9.60,1.62,0.00,1.00,-14.40,14.40 -172.80,-4.80,14.40,0.00,1.00,-9.60,9.60 --4.80,4.80,1.60,0.00,1.00,-4.80,4.80 -0.00,0.00,14.42,0.00,1.00,0.00,0.00 --177.60,4.80,1.58,0.00,1.00,4.80,-4.80 -9.60,-4.80,14.44,0.00,1.00,9.60,-9.60 --168.00,9.60,1.56,0.00,1.00,14.40,-14.40 -14.40,-14.40,14.46,0.00,1.00,19.20,-19.20 --163.20,14.40,1.54,0.00,1.00,24.00,-24.00 -24.00,-19.20,14.48,0.00,1.00,28.80,-28.80 --153.60,19.20,1.52,0.00,1.00,33.60,-33.60 -28.80,-24.00,14.50,0.00,1.00,38.40,-38.40 --144.00,28.80,1.50,0.00,1.00,43.20,-43.20 -38.40,-28.80,14.53,0.00,1.00,48.00,-48.00 --134.40,33.60,1.47,0.00,1.00,52.80,-52.80 -48.00,-33.60,14.55,0.00,1.00,57.60,-57.60 --124.80,33.60,1.45,0.00,1.00,62.40,-62.40 -62.40,-38.40,14.57,0.00,1.00,67.20,-67.20 --115.20,38.40,1.43,0.00,1.00,72.00,-72.00 -72.00,-38.40,14.59,0.00,1.00,76.80,-76.80 --100.80,43.20,1.41,0.00,1.00,81.60,-81.60 -86.40,-43.20,14.61,0.00,1.00,86.40,-86.40 --86.40,43.20,1.39,0.00,1.00,91.20,-86.40 -96.00,-43.20,14.63,0.00,1.00,96.00,-81.60 --76.80,38.40,1.37,0.00,1.00,100.80,-76.80 -110.40,-38.40,14.65,0.00,1.00,105.60,-72.00 --62.40,38.40,1.35,0.00,1.00,110.40,-67.20 -120.00,-38.40,14.68,0.00,1.00,115.20,-62.40 --52.80,33.60,1.32,0.00,1.00,120.00,-57.60 -134.40,-33.60,14.70,0.00,1.00,124.80,-52.80 --43.20,28.80,1.30,0.00,1.00,129.60,-48.00 -144.00,-28.80,14.72,0.00,1.00,134.40,-43.20 --33.60,24.00,1.28,0.00,1.00,139.20,-38.40 -153.60,-24.00,14.74,0.00,1.00,144.00,-33.60 --24.00,19.20,1.26,0.00,1.00,148.80,-28.80 -158.40,-19.20,14.76,0.00,1.00,153.60,-24.00 --14.40,14.40,1.24,0.00,1.00,158.40,-19.20 -168.00,-9.60,14.78,0.00,1.00,163.20,-14.40 --9.60,9.60,1.22,0.00,1.00,168.00,-9.60 -172.80,-4.80,14.80,0.00,1.00,172.80,-4.80 --0.00,0.00,1.20,0.00,1.00,177.60,-0.00 --177.60,0.00,14.83,0.00,1.00,-177.60,0.00 -4.80,-4.80,1.17,0.00,1.00,-172.80,4.80 --172.80,9.60,14.85,0.00,1.00,-168.00,9.60 -14.40,-9.60,1.15,0.00,1.00,-163.20,14.40 --163.20,14.40,14.87,0.00,1.00,-158.40,19.20 -19.20,-19.20,1.13,0.00,1.00,-153.60,24.00 --153.60,19.20,14.89,0.00,1.00,-148.80,28.80 -28.80,-24.00,1.11,0.00,1.00,-144.00,33.60 --148.80,24.00,14.91,0.00,1.00,-139.20,38.40 -38.40,-28.80,1.09,0.00,1.00,-134.40,43.20 --139.20,28.80,14.93,0.00,1.00,-129.60,48.00 -48.00,-33.60,1.07,0.00,1.00,-124.80,52.80 --129.60,33.60,14.95,0.00,1.00,-120.00,57.60 -57.60,-38.40,1.05,0.00,1.00,-115.20,62.40 --115.20,38.40,14.97,0.00,1.00,-110.40,67.20 -67.20,-38.40,1.03,0.00,1.00,-105.60,72.00 --105.60,38.40,15.00,0.00,1.00,-100.80,76.80 -81.60,-43.20,1.00,0.00,1.00,-96.00,81.60 --91.20,43.20,15.02,0.00,1.00,-91.20,86.40 -96.00,-43.20,0.98,0.00,1.00,-86.40,86.40 --76.80,43.20,15.04,0.00,1.00,-81.60,81.60 -105.60,-38.40,0.96,0.00,1.00,-76.80,76.80 --67.20,38.40,15.06,0.00,1.00,-72.00,72.00 -120.00,-38.40,0.94,0.00,1.00,-67.20,67.20 --52.80,33.60,15.08,0.00,1.00,-62.40,62.40 -129.60,-33.60,0.92,0.00,1.00,-57.60,57.60 --43.20,33.60,15.10,0.00,1.00,-52.80,52.80 -139.20,-28.80,0.90,0.00,1.00,-48.00,48.00 --33.60,28.80,15.12,0.00,1.00,-43.20,43.20 -148.80,-24.00,0.88,0.00,1.00,-38.40,38.40 --28.80,19.20,15.15,0.00,1.00,-33.60,33.60 -158.40,-19.20,0.85,0.00,1.00,-28.80,28.80 --19.20,14.40,15.17,0.00,1.00,-24.00,24.00 -163.20,-14.40,0.83,0.00,1.00,-19.20,19.20 --9.60,9.60,15.19,0.00,1.00,-14.40,14.40 -172.80,-4.80,0.81,0.00,1.00,-9.60,9.60 --4.80,4.80,15.21,0.00,1.00,-4.80,4.80 -0.00,0.00,0.79,0.00,1.00,0.00,0.00 --177.60,4.80,15.23,0.00,1.00,4.80,-4.80 -4.80,-4.80,0.77,0.00,1.00,9.60,-9.60 --168.00,9.60,15.25,0.00,1.00,14.40,-14.40 -14.40,-14.40,0.75,0.00,1.00,19.20,-19.20 --163.20,19.20,15.27,0.00,1.00,24.00,-24.00 -19.20,-19.20,0.73,0.00,1.00,28.80,-28.80 --153.60,24.00,15.30,0.00,1.00,33.60,-33.60 -28.80,-28.80,0.70,0.00,1.00,38.40,-38.40 --148.80,28.80,15.32,0.00,1.00,43.20,-43.20 -38.40,-33.60,0.68,0.00,1.00,48.00,-48.00 --139.20,33.60,15.34,0.00,1.00,52.80,-52.80 -48.00,-38.40,0.66,0.00,1.00,57.60,-57.60 --124.80,38.40,15.36,0.00,1.00,62.40,-62.40 -57.60,-43.20,0.64,0.00,1.00,67.20,-67.20 --115.20,43.20,15.38,0.00,1.00,72.00,-72.00 -72.00,-43.20,0.62,0.00,1.00,76.80,-76.80 --100.80,43.20,15.40,0.00,1.00,81.60,-81.60 -86.40,-48.00,0.60,0.00,1.00,86.40,-86.40 --86.40,48.00,15.42,0.00,1.00,91.20,-86.40 -100.80,-48.00,0.58,0.00,1.00,96.00,-81.60 --76.80,43.20,15.44,0.00,1.00,100.80,-76.80 -110.40,-43.20,0.56,0.00,1.00,105.60,-72.00 --62.40,43.20,15.47,0.00,1.00,110.40,-67.20 -124.80,-38.40,0.53,0.00,1.00,115.20,-62.40 --48.00,38.40,15.49,0.00,1.00,120.00,-57.60 -134.40,-38.40,0.51,0.00,1.00,124.80,-52.80 --38.40,33.60,15.51,0.00,1.00,129.60,-48.00 -144.00,-28.80,0.49,0.00,1.00,134.40,-43.20 --28.80,28.80,15.53,0.00,1.00,139.20,-38.40 -153.60,-24.00,0.47,0.00,1.00,144.00,-33.60 --24.00,24.00,15.55,0.00,1.00,148.80,-28.80 -163.20,-19.20,0.45,0.00,1.00,153.60,-24.00 --14.40,14.40,15.57,0.00,1.00,158.40,-19.20 -168.00,-14.40,0.43,0.00,1.00,163.20,-14.40 --9.60,9.60,15.59,0.00,1.00,168.00,-9.60 -172.80,-4.80,0.41,0.00,1.00,172.80,-4.80 --0.00,0.00,15.62,0.00,1.00,177.60,-0.00 --177.60,0.00,0.38,0.00,1.00,-177.60,0.00 -4.80,-4.80,15.64,0.00,1.00,-172.80,4.80 --172.80,9.60,0.36,0.00,1.00,-168.00,9.60 -9.60,-14.40,15.66,0.00,1.00,-163.20,14.40 --163.20,14.40,0.34,0.00,1.00,-158.40,19.20 -19.20,-19.20,15.68,0.00,1.00,-153.60,24.00 --158.40,24.00,0.32,0.00,1.00,-148.80,28.80 -28.80,-24.00,15.70,0.00,1.00,-144.00,33.60 --148.80,28.80,0.30,0.00,1.00,-139.20,38.40 -33.60,-28.80,15.72,0.00,1.00,-134.40,43.20 --139.20,33.60,0.28,0.00,1.00,-129.60,48.00 -43.20,-38.40,15.74,0.00,1.00,-124.80,52.80 --129.60,38.40,0.26,0.00,1.00,-120.00,57.60 -57.60,-38.40,15.77,0.00,1.00,-115.20,62.40 --120.00,43.20,0.23,0.00,1.00,-110.40,67.20 -67.20,-43.20,15.79,0.00,1.00,-105.60,72.00 --105.60,43.20,0.21,0.00,1.00,-100.80,76.80 -81.60,-48.00,15.81,0.00,1.00,-96.00,81.60 --91.20,48.00,0.19,0.00,1.00,-91.20,86.40 -96.00,-48.00,15.83,0.00,1.00,-86.40,86.40 --76.80,43.20,0.17,0.00,1.00,-81.60,81.60 -110.40,-43.20,15.85,0.00,1.00,-76.80,76.80 --67.20,43.20,0.15,0.00,1.00,-72.00,72.00 -120.00,-43.20,15.87,0.00,1.00,-67.20,67.20 --52.80,38.40,0.13,0.00,1.00,-62.40,62.40 -134.40,-38.40,15.89,0.00,1.00,-57.60,57.60 --43.20,33.60,0.11,0.00,1.00,-52.80,52.80 -144.00,-33.60,15.91,0.00,1.00,-48.00,48.00 --33.60,28.80,0.09,0.00,1.00,-43.20,43.20 -153.60,-28.80,15.94,0.00,1.00,-38.40,38.40 --24.00,24.00,0.06,0.00,1.00,-33.60,33.60 -158.40,-19.20,15.96,0.00,1.00,-28.80,28.80 --19.20,19.20,0.04,0.00,1.00,-24.00,24.00 -168.00,-14.40,15.98,0.00,1.00,-19.20,19.20 --9.60,9.60,0.02,0.00,1.00,-14.40,14.40 -172.80,-4.80,16.00,0.00,1.00,-9.60,9.60 --4.80,4.80,0.00,0.00,1.00,-4.80,4.80 +0.00,0.00,0.00,0.00,1.00,-0.00,0.00,0 +-177.60,-4.80,16.00,0.00,1.00,-0.00,0.00,0 +4.80,4.80,0.02,0.00,1.00,-0.00,0.00,0 +-168.00,-9.60,15.98,0.00,1.00,-0.00,0.00,0 +14.40,14.40,0.04,0.00,1.00,-0.00,0.00,0 +-163.20,-14.40,15.96,0.00,1.00,-0.00,0.00,0 +19.20,19.20,0.06,0.00,1.00,-0.00,0.00,0 +-153.60,-24.00,15.94,0.00,1.00,-0.00,0.00,0 +28.80,24.00,0.09,0.00,1.00,-0.00,0.00,0 +-148.80,-28.80,15.91,0.00,1.00,-0.00,0.00,0 +38.40,33.60,0.11,0.00,1.00,-0.00,0.00,0 +-139.20,-33.60,15.89,0.00,1.00,-0.00,0.00,0 +48.00,38.40,0.13,0.00,1.00,-0.00,0.00,0 +-124.80,-38.40,15.87,0.00,1.00,-0.00,0.00,0 +57.60,38.40,0.15,0.00,1.00,-0.00,0.00,0 +-115.20,-43.20,15.85,0.00,1.00,-0.00,0.00,0 +72.00,43.20,0.17,0.00,1.00,-0.00,0.00,0 +-100.80,-43.20,15.83,0.00,1.00,-0.00,0.00,0 +86.40,43.20,0.19,0.00,1.00,-0.00,0.00,0 +-86.40,-43.20,15.81,0.00,1.00,-177.60,0.00,0 +100.80,43.20,0.21,0.00,1.00,-177.60,0.00,0 +-76.80,-43.20,15.79,0.00,1.00,-177.60,0.00,0 +110.40,43.20,0.23,0.00,1.00,-177.60,0.00,0 +-62.40,-43.20,15.77,0.00,1.00,-177.60,0.00,0 +124.80,38.40,0.26,0.00,1.00,-177.60,0.00,0 +-52.80,-38.40,15.74,0.00,1.00,177.60,0.00,0 +134.40,33.60,0.28,0.00,1.00,177.60,0.00,0 +-38.40,-33.60,15.72,0.00,1.00,177.60,0.00,0 +144.00,28.80,0.30,0.00,1.00,177.60,0.00,0 +-33.60,-28.80,15.70,0.00,1.00,177.60,0.00,0 +153.60,24.00,0.32,0.00,1.00,177.60,0.00,0 +-24.00,-19.20,15.68,0.00,1.00,177.60,0.00,0 +158.40,19.20,0.34,0.00,1.00,177.60,0.00,0 +-14.40,-14.40,15.66,0.00,1.00,177.60,0.00,0 +168.00,9.60,0.36,0.00,1.00,177.60,0.00,0 +-9.60,-9.60,15.64,0.00,1.00,177.60,0.00,0 +172.80,4.80,0.38,0.00,1.00,177.60,0.00,0 +-0.00,-0.00,15.62,0.00,1.00,177.60,0.00,0 +-177.60,-0.00,0.41,0.00,1.00,-177.60,0.00,0 +4.80,4.80,15.59,0.00,1.00,-177.60,0.00,0 +-172.80,-9.60,0.43,0.00,1.00,-177.60,0.00,0 +14.40,9.60,15.57,0.00,1.00,-177.60,0.00,0 +-163.20,-14.40,0.45,0.00,1.00,-177.60,0.00,0 +19.20,19.20,15.55,0.00,1.00,-177.60,0.00,0 +-158.40,-19.20,0.47,0.00,1.00,-177.60,0.00,0 +28.80,24.00,15.53,0.00,1.00,-177.60,0.00,0 +-148.80,-28.80,0.49,0.00,1.00,-177.60,0.00,0 +33.60,28.80,15.51,0.00,1.00,-177.60,0.00,0 +-139.20,-33.60,0.51,0.00,1.00,-177.60,0.00,0 +43.20,33.60,15.49,0.00,1.00,-177.60,0.00,0 +-129.60,-38.40,0.53,0.00,1.00,-177.60,0.00,0 +57.60,38.40,15.47,0.00,1.00,177.60,0.00,0 +-120.00,-43.20,0.56,0.00,1.00,177.60,0.00,0 +67.20,43.20,15.44,0.00,1.00,177.60,0.00,0 +-105.60,-43.20,0.58,0.00,1.00,177.60,0.00,0 +81.60,43.20,15.42,0.00,1.00,177.60,0.00,0 +-91.20,-43.20,0.60,0.00,1.00,177.60,0.00,0 +96.00,43.20,15.40,0.00,1.00,0.00,0.00,0 +-76.80,-43.20,0.62,0.00,1.00,0.00,0.00,0 +110.40,43.20,15.38,0.00,1.00,0.00,0.00,0 +-67.20,-43.20,0.64,0.00,1.00,0.00,0.00,0 +120.00,38.40,15.36,0.00,1.00,0.00,0.00,0 +-52.80,-38.40,0.66,0.00,1.00,0.00,0.00,0 +129.60,38.40,15.34,0.00,1.00,0.00,0.00,0 +-43.20,-33.60,0.68,0.00,1.00,0.00,0.00,0 +144.00,33.60,15.32,0.00,1.00,0.00,0.00,0 +-33.60,-28.80,0.70,0.00,1.00,0.00,0.00,0 +148.80,24.00,15.30,0.00,1.00,0.00,0.00,0 +-24.00,-24.00,0.73,0.00,1.00,0.00,0.00,0 +158.40,19.20,15.27,0.00,1.00,0.00,0.00,0 +-19.20,-14.40,0.75,0.00,1.00,0.00,0.00,0 +168.00,14.40,15.25,0.00,1.00,0.00,0.00,0 +-9.60,-9.60,0.77,0.00,1.00,0.00,0.00,0 +172.80,4.80,15.23,0.00,1.00,0.00,0.00,0 +-4.80,-4.80,0.79,0.00,1.00,0.00,0.00,0 +0.00,0.00,15.21,0.00,1.00,0.00,0.00,0 +-177.60,-4.80,0.81,0.00,1.00,0.00,-0.00,0 +9.60,4.80,15.19,0.00,1.00,0.00,-0.00,0 +-168.00,-9.60,0.83,0.00,1.00,0.00,-0.00,0 +14.40,14.40,15.17,0.00,1.00,0.00,-0.00,0 +-163.20,-14.40,0.85,0.00,1.00,0.00,-0.00,0 +24.00,19.20,15.15,0.00,1.00,4.80,-0.00,0 +-153.60,-19.20,0.88,0.00,1.00,4.80,-4.80,0 +28.80,24.00,15.12,0.00,1.00,4.80,-4.80,0 +-144.00,-24.00,0.90,0.00,1.00,4.80,-4.80,0 +38.40,28.80,15.10,0.00,1.00,4.80,-4.80,0 +-134.40,-28.80,0.92,0.00,1.00,4.80,-4.80,0 +48.00,33.60,15.08,0.00,1.00,9.60,-4.80,0 +-124.80,-33.60,0.94,0.00,1.00,9.60,-4.80,0 +62.40,38.40,15.06,0.00,1.00,9.60,-4.80,0 +-115.20,-38.40,0.96,0.00,1.00,14.40,-4.80,0 +72.00,38.40,15.04,0.00,1.00,19.20,-4.80,0 +-100.80,-38.40,0.98,0.00,1.00,28.80,-4.80,0 +86.40,38.40,15.02,0.00,1.00,52.80,-4.80,0 +-86.40,-38.40,1.00,0.00,1.00,105.60,-4.80,0 +96.00,38.40,15.00,0.00,1.00,139.20,-4.80,0 +-76.80,-38.40,1.03,0.00,1.00,158.40,-4.80,0 +110.40,38.40,14.97,0.00,1.00,163.20,-4.80,0 +-62.40,-38.40,1.05,0.00,1.00,168.00,-4.80,0 +120.00,33.60,14.95,0.00,1.00,168.00,-4.80,0 +-52.80,-33.60,1.07,0.00,1.00,172.80,-4.80,0 +134.40,33.60,14.93,0.00,1.00,172.80,-4.80,0 +-43.20,-28.80,1.09,0.00,1.00,172.80,-4.80,0 +144.00,28.80,14.91,0.00,1.00,172.80,-4.80,0 +-33.60,-24.00,1.11,0.00,1.00,177.60,-4.80,0 +148.80,24.00,14.89,0.00,1.00,177.60,-4.80,0 +-24.00,-19.20,1.13,0.00,1.00,177.60,-4.80,0 +158.40,14.40,14.87,0.00,1.00,177.60,-0.00,0 +-19.20,-14.40,1.15,0.00,1.00,177.60,-0.00,0 +168.00,9.60,14.85,0.00,1.00,177.60,-0.00,0 +-9.60,-9.60,1.17,0.00,1.00,177.60,-0.00,0 +172.80,4.80,14.83,0.00,1.00,177.60,-0.00,0 +-0.00,-0.00,1.20,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,14.80,0.00,1.00,-177.60,0.00,0 +4.80,4.80,1.22,0.00,1.00,-177.60,0.00,0 +-172.80,-9.60,14.78,0.00,1.00,-177.60,0.00,0 +14.40,9.60,1.24,0.00,1.00,-177.60,0.00,0 +-163.20,-14.40,14.76,0.00,1.00,-177.60,0.00,0 +19.20,14.40,1.26,0.00,1.00,-177.60,0.00,0 +-153.60,-19.20,14.74,0.00,1.00,-177.60,4.80,0 +28.80,24.00,1.28,0.00,1.00,-177.60,4.80,0 +-148.80,-24.00,14.72,0.00,1.00,-177.60,4.80,0 +38.40,28.80,1.30,0.00,1.00,-172.80,4.80,0 +-139.20,-28.80,14.70,0.00,1.00,-172.80,4.80,0 +48.00,33.60,1.32,0.00,1.00,-172.80,4.80,0 +-124.80,-33.60,14.68,0.00,1.00,-172.80,4.80,0 +57.60,33.60,1.35,0.00,1.00,-168.00,4.80,0 +-115.20,-38.40,14.65,0.00,1.00,-168.00,4.80,0 +72.00,38.40,1.37,0.00,1.00,-163.20,4.80,0 +-105.60,-38.40,14.63,0.00,1.00,-158.40,4.80,0 +81.60,38.40,1.39,0.00,1.00,-139.20,4.80,0 +-91.20,-38.40,14.61,0.00,1.00,-105.60,4.80,0 +96.00,38.40,1.41,0.00,1.00,-52.80,4.80,0 +-76.80,-38.40,14.59,0.00,1.00,-28.80,4.80,0 +105.60,38.40,1.43,0.00,1.00,-19.20,4.80,0 +-67.20,-38.40,14.57,0.00,1.00,-14.40,4.80,0 +120.00,38.40,1.45,0.00,1.00,-9.60,4.80,0 +-57.60,-33.60,14.55,0.00,1.00,-9.60,4.80,0 +129.60,33.60,1.47,0.00,1.00,-9.60,4.80,0 +-43.20,-28.80,14.53,0.00,1.00,-4.80,4.80,0 +139.20,28.80,1.50,0.00,1.00,-4.80,4.80,0 +-33.60,-24.00,14.50,0.00,1.00,-4.80,4.80,0 +148.80,24.00,1.52,0.00,1.00,-4.80,4.80,0 +-28.80,-19.20,14.48,0.00,1.00,-4.80,4.80,0 +158.40,19.20,1.54,0.00,1.00,-4.80,0.00,0 +-19.20,-14.40,14.46,0.00,1.00,-0.00,0.00,0 +163.20,14.40,1.56,0.00,1.00,-0.00,0.00,0 +-9.60,-9.60,14.44,0.00,1.00,-0.00,0.00,0 +172.80,4.80,1.58,0.00,1.00,-0.00,0.00,0 +-4.80,-4.80,14.42,0.00,1.00,-0.00,0.00,0 +0.00,0.00,1.60,0.00,1.00,0.00,0.00,0 +-177.60,-4.80,14.40,0.00,1.00,0.00,-0.00,0 +9.60,4.80,1.62,0.00,1.00,0.00,-0.00,0 +-168.00,-9.60,14.38,0.00,1.00,4.80,-0.00,0 +14.40,9.60,1.64,0.00,1.00,4.80,-4.80,0 +-158.40,-14.40,14.36,0.00,1.00,4.80,-4.80,0 +24.00,14.40,1.67,0.00,1.00,4.80,-4.80,0 +-153.60,-19.20,14.33,0.00,1.00,4.80,-4.80,0 +33.60,19.20,1.69,0.00,1.00,9.60,-4.80,0 +-144.00,-24.00,14.31,0.00,1.00,9.60,-4.80,0 +43.20,24.00,1.71,0.00,1.00,9.60,-4.80,0 +-134.40,-28.80,14.29,0.00,1.00,14.40,-9.60,0 +52.80,28.80,1.73,0.00,1.00,14.40,-9.60,0 +-124.80,-28.80,14.27,0.00,1.00,19.20,-9.60,0 +62.40,33.60,1.75,0.00,1.00,24.00,-9.60,0 +-110.40,-33.60,14.25,0.00,1.00,28.80,-9.60,0 +72.00,33.60,1.77,0.00,1.00,33.60,-9.60,0 +-100.80,-33.60,14.23,0.00,1.00,48.00,-9.60,0 +86.40,33.60,1.79,0.00,1.00,67.20,-9.60,0 +-86.40,-33.60,14.21,0.00,1.00,96.00,-9.60,0 +96.00,33.60,1.82,0.00,1.00,120.00,-9.60,0 +-76.80,-33.60,14.18,0.00,1.00,139.20,-9.60,0 +110.40,33.60,1.84,0.00,1.00,148.80,-9.60,0 +-67.20,-33.60,14.16,0.00,1.00,153.60,-9.60,0 +120.00,33.60,1.86,0.00,1.00,158.40,-9.60,0 +-52.80,-28.80,14.14,0.00,1.00,163.20,-9.60,0 +129.60,28.80,1.88,0.00,1.00,168.00,-9.60,0 +-43.20,-28.80,14.12,0.00,1.00,168.00,-9.60,0 +139.20,24.00,1.90,0.00,1.00,168.00,-4.80,0 +-33.60,-24.00,14.10,0.00,1.00,172.80,-4.80,0 +148.80,19.20,1.92,0.00,1.00,172.80,-4.80,0 +-24.00,-19.20,14.08,0.00,1.00,172.80,-4.80,0 +158.40,14.40,1.94,0.00,1.00,177.60,-4.80,0 +-19.20,-14.40,14.06,0.00,1.00,177.60,-4.80,0 +168.00,9.60,1.97,0.00,1.00,177.60,-4.80,0 +-9.60,-4.80,14.03,0.00,1.00,177.60,-0.00,0 +172.80,4.80,1.99,0.00,1.00,177.60,-0.00,0 +-0.00,-0.00,14.01,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,2.01,0.00,1.00,-177.60,0.00,0 +4.80,4.80,13.99,0.00,1.00,-177.60,0.00,0 +-168.00,-4.80,2.03,0.00,1.00,-177.60,0.00,0 +14.40,9.60,13.97,0.00,1.00,-177.60,4.80,0 +-163.20,-14.40,2.05,0.00,1.00,-177.60,4.80,0 +24.00,14.40,13.95,0.00,1.00,-177.60,4.80,0 +-153.60,-19.20,2.07,0.00,1.00,-172.80,4.80,0 +28.80,19.20,13.93,0.00,1.00,-172.80,4.80,0 +-144.00,-24.00,2.09,0.00,1.00,-172.80,4.80,0 +38.40,24.00,13.91,0.00,1.00,-168.00,4.80,0 +-134.40,-28.80,2.11,0.00,1.00,-168.00,9.60,0 +48.00,28.80,13.89,0.00,1.00,-168.00,9.60,0 +-124.80,-28.80,2.14,0.00,1.00,-163.20,9.60,0 +62.40,33.60,13.86,0.00,1.00,-158.40,9.60,0 +-115.20,-33.60,2.16,0.00,1.00,-153.60,9.60,0 +72.00,33.60,13.84,0.00,1.00,-148.80,9.60,0 +-100.80,-33.60,2.18,0.00,1.00,-139.20,9.60,0 +81.60,33.60,13.82,0.00,1.00,-120.00,9.60,0 +-91.20,-33.60,2.20,0.00,1.00,-96.00,9.60,0 +96.00,33.60,13.80,0.00,1.00,-67.20,9.60,0 +-81.60,-33.60,2.22,0.00,1.00,-48.00,9.60,0 +105.60,33.60,13.78,0.00,1.00,-33.60,9.60,0 +-67.20,-33.60,2.24,0.00,1.00,-28.80,9.60,0 +115.20,33.60,13.76,0.00,1.00,-24.00,9.60,0 +-57.60,-28.80,2.26,0.00,1.00,-19.20,9.60,0 +129.60,28.80,13.74,0.00,1.00,-14.40,9.60,0 +-48.00,-28.80,2.29,0.00,1.00,-14.40,9.60,0 +139.20,24.00,13.71,0.00,1.00,-9.60,4.80,0 +-38.40,-24.00,2.31,0.00,1.00,-9.60,4.80,0 +148.80,19.20,13.69,0.00,1.00,-9.60,4.80,0 +-28.80,-19.20,2.33,0.00,1.00,-4.80,4.80,0 +153.60,14.40,13.67,0.00,1.00,-4.80,4.80,0 +-19.20,-14.40,2.35,0.00,1.00,-4.80,4.80,0 +163.20,9.60,13.65,0.00,1.00,-4.80,4.80,0 +-9.60,-9.60,2.37,0.00,1.00,-4.80,0.00,0 +172.80,4.80,13.63,0.00,1.00,-0.00,0.00,0 +-4.80,-4.80,2.39,0.00,1.00,-0.00,0.00,0 +0.00,0.00,13.61,0.00,1.00,0.00,0.00,0 +-177.60,-4.80,2.41,0.00,1.00,0.00,-0.00,0 +9.60,4.80,13.59,0.00,1.00,4.80,-0.00,0 +-168.00,-9.60,2.44,0.00,1.00,4.80,-4.80,0 +14.40,9.60,13.56,0.00,1.00,4.80,-4.80,0 +-158.40,-9.60,2.46,0.00,1.00,4.80,-4.80,0 +24.00,14.40,13.54,0.00,1.00,9.60,-4.80,0 +-148.80,-14.40,2.48,0.00,1.00,9.60,-9.60,0 +33.60,19.20,13.52,0.00,1.00,9.60,-9.60,0 +-139.20,-19.20,2.50,0.00,1.00,14.40,-9.60,0 +43.20,24.00,13.50,0.00,1.00,14.40,-9.60,0 +-129.60,-24.00,2.52,0.00,1.00,19.20,-9.60,0 +52.80,24.00,13.48,0.00,1.00,19.20,-14.40,0 +-120.00,-28.80,2.54,0.00,1.00,24.00,-14.40,0 +62.40,28.80,13.46,0.00,1.00,28.80,-14.40,0 +-110.40,-28.80,2.56,0.00,1.00,38.40,-14.40,0 +76.80,28.80,13.44,0.00,1.00,48.00,-14.40,0 +-100.80,-28.80,2.58,0.00,1.00,57.60,-14.40,0 +86.40,28.80,13.42,0.00,1.00,76.80,-14.40,0 +-86.40,-28.80,2.61,0.00,1.00,96.00,-14.40,0 +96.00,28.80,13.39,0.00,1.00,115.20,-14.40,0 +-76.80,-28.80,2.63,0.00,1.00,129.60,-14.40,0 +105.60,28.80,13.37,0.00,1.00,139.20,-14.40,0 +-67.20,-28.80,2.65,0.00,1.00,144.00,-14.40,0 +120.00,28.80,13.35,0.00,1.00,153.60,-14.40,0 +-57.60,-24.00,2.67,0.00,1.00,158.40,-14.40,0 +129.60,24.00,13.33,0.00,1.00,158.40,-9.60,0 +-48.00,-24.00,2.69,0.00,1.00,163.20,-9.60,0 +139.20,19.20,13.31,0.00,1.00,168.00,-9.60,0 +-38.40,-19.20,2.71,0.00,1.00,168.00,-9.60,0 +148.80,19.20,13.29,0.00,1.00,168.00,-9.60,0 +-28.80,-14.40,2.73,0.00,1.00,172.80,-9.60,0 +158.40,14.40,13.27,0.00,1.00,172.80,-4.80,0 +-19.20,-9.60,2.76,0.00,1.00,172.80,-4.80,0 +163.20,9.60,13.24,0.00,1.00,177.60,-4.80,0 +-9.60,-4.80,2.78,0.00,1.00,177.60,-4.80,0 +172.80,4.80,13.22,0.00,1.00,177.60,-0.00,0 +-0.00,-0.00,2.80,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,13.20,0.00,1.00,-177.60,0.00,0 +4.80,4.80,2.82,0.00,1.00,-177.60,0.00,0 +-168.00,-4.80,13.18,0.00,1.00,-177.60,4.80,0 +14.40,9.60,2.84,0.00,1.00,-177.60,4.80,0 +-163.20,-9.60,13.16,0.00,1.00,-172.80,4.80,0 +24.00,14.40,2.86,0.00,1.00,-172.80,4.80,0 +-153.60,-14.40,13.14,0.00,1.00,-172.80,9.60,0 +33.60,19.20,2.88,0.00,1.00,-168.00,9.60,0 +-144.00,-19.20,13.12,0.00,1.00,-168.00,9.60,0 +43.20,19.20,2.91,0.00,1.00,-168.00,9.60,0 +-134.40,-24.00,13.09,0.00,1.00,-163.20,9.60,0 +52.80,24.00,2.93,0.00,1.00,-158.40,9.60,0 +-124.80,-24.00,13.07,0.00,1.00,-158.40,14.40,0 +62.40,28.80,2.95,0.00,1.00,-153.60,14.40,0 +-115.20,-28.80,13.05,0.00,1.00,-144.00,14.40,0 +72.00,28.80,2.97,0.00,1.00,-139.20,14.40,0 +-100.80,-28.80,13.03,0.00,1.00,-129.60,14.40,0 +81.60,28.80,2.99,0.00,1.00,-115.20,14.40,0 +-91.20,-28.80,13.01,0.00,1.00,-96.00,14.40,0 +96.00,28.80,3.01,0.00,1.00,-76.80,14.40,0 +-81.60,-28.80,12.99,0.00,1.00,-57.60,14.40,0 +105.60,28.80,3.03,0.00,1.00,-48.00,14.40,0 +-67.20,-28.80,12.97,0.00,1.00,-38.40,14.40,0 +115.20,28.80,3.05,0.00,1.00,-28.80,14.40,0 +-57.60,-28.80,12.95,0.00,1.00,-24.00,14.40,0 +124.80,24.00,3.08,0.00,1.00,-19.20,14.40,0 +-48.00,-24.00,12.92,0.00,1.00,-19.20,9.60,0 +134.40,24.00,3.10,0.00,1.00,-14.40,9.60,0 +-38.40,-19.20,12.90,0.00,1.00,-14.40,9.60,0 +144.00,19.20,3.12,0.00,1.00,-9.60,9.60,0 +-28.80,-14.40,12.88,0.00,1.00,-9.60,9.60,0 +153.60,14.40,3.14,0.00,1.00,-9.60,4.80,0 +-19.20,-9.60,12.86,0.00,1.00,-4.80,4.80,0 +163.20,9.60,3.16,0.00,1.00,-4.80,4.80,0 +-14.40,-9.60,12.84,0.00,1.00,-4.80,4.80,0 +172.80,4.80,3.18,0.00,1.00,-4.80,0.00,0 +-4.80,-4.80,12.82,0.00,1.00,-0.00,0.00,0 +0.00,0.00,3.20,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,12.80,0.00,1.00,0.00,-0.00,0 +9.60,4.80,3.23,0.00,1.00,4.80,-4.80,0 +-168.00,-4.80,12.77,0.00,1.00,4.80,-4.80,0 +19.20,9.60,3.25,0.00,1.00,4.80,-4.80,0 +-158.40,-9.60,12.75,0.00,1.00,9.60,-9.60,0 +24.00,14.40,3.27,0.00,1.00,9.60,-9.60,0 +-148.80,-14.40,12.73,0.00,1.00,14.40,-9.60,0 +33.60,14.40,3.29,0.00,1.00,14.40,-9.60,0 +-139.20,-19.20,12.71,0.00,1.00,19.20,-14.40,0 +43.20,19.20,3.31,0.00,1.00,19.20,-14.40,0 +-129.60,-19.20,12.69,0.00,1.00,24.00,-14.40,0 +52.80,19.20,3.33,0.00,1.00,28.80,-14.40,0 +-120.00,-24.00,12.67,0.00,1.00,33.60,-19.20,0 +67.20,24.00,3.35,0.00,1.00,38.40,-19.20,0 +-110.40,-24.00,12.65,0.00,1.00,43.20,-19.20,0 +76.80,24.00,3.38,0.00,1.00,52.80,-19.20,0 +-100.80,-24.00,12.62,0.00,1.00,67.20,-19.20,0 +86.40,24.00,3.40,0.00,1.00,76.80,-19.20,0 +-86.40,-24.00,12.60,0.00,1.00,96.00,-19.20,0 +96.00,24.00,3.42,0.00,1.00,105.60,-19.20,0 +-76.80,-24.00,12.58,0.00,1.00,120.00,-19.20,0 +105.60,24.00,3.44,0.00,1.00,129.60,-19.20,0 +-67.20,-24.00,12.56,0.00,1.00,139.20,-19.20,0 +115.20,24.00,3.46,0.00,1.00,144.00,-19.20,0 +-57.60,-24.00,12.54,0.00,1.00,148.80,-14.40,0 +129.60,19.20,3.48,0.00,1.00,153.60,-14.40,0 +-48.00,-19.20,12.52,0.00,1.00,158.40,-14.40,0 +139.20,19.20,3.50,0.00,1.00,163.20,-14.40,0 +-38.40,-14.40,12.50,0.00,1.00,163.20,-14.40,0 +148.80,14.40,3.52,0.00,1.00,168.00,-9.60,0 +-28.80,-14.40,12.48,0.00,1.00,168.00,-9.60,0 +153.60,9.60,3.55,0.00,1.00,172.80,-9.60,0 +-19.20,-9.60,12.45,0.00,1.00,172.80,-4.80,0 +163.20,9.60,3.57,0.00,1.00,172.80,-4.80,0 +-9.60,-4.80,12.43,0.00,1.00,177.60,-4.80,0 +172.80,4.80,3.59,0.00,1.00,177.60,-0.00,0 +-0.00,-0.00,12.41,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,3.61,0.00,1.00,-177.60,0.00,0 +4.80,4.80,12.39,0.00,1.00,-177.60,0.00,0 +-168.00,-4.80,3.63,0.00,1.00,-177.60,4.80,0 +14.40,9.60,12.37,0.00,1.00,-172.80,4.80,0 +-158.40,-9.60,3.65,0.00,1.00,-172.80,4.80,0 +24.00,9.60,12.35,0.00,1.00,-172.80,9.60,0 +-153.60,-14.40,3.67,0.00,1.00,-168.00,9.60,0 +33.60,14.40,12.33,0.00,1.00,-168.00,9.60,0 +-144.00,-14.40,3.70,0.00,1.00,-163.20,14.40,0 +43.20,19.20,12.30,0.00,1.00,-163.20,14.40,0 +-134.40,-19.20,3.72,0.00,1.00,-158.40,14.40,0 +52.80,19.20,12.28,0.00,1.00,-153.60,14.40,0 +-124.80,-24.00,3.74,0.00,1.00,-148.80,14.40,0 +62.40,24.00,12.26,0.00,1.00,-144.00,19.20,0 +-110.40,-24.00,3.76,0.00,1.00,-139.20,19.20,0 +72.00,24.00,12.24,0.00,1.00,-129.60,19.20,0 +-100.80,-24.00,3.78,0.00,1.00,-120.00,19.20,0 +81.60,24.00,12.22,0.00,1.00,-105.60,19.20,0 +-91.20,-24.00,3.80,0.00,1.00,-96.00,19.20,0 +96.00,24.00,12.20,0.00,1.00,-76.80,19.20,0 +-81.60,-24.00,3.82,0.00,1.00,-67.20,19.20,0 +105.60,24.00,12.18,0.00,1.00,-52.80,19.20,0 +-72.00,-24.00,3.85,0.00,1.00,-43.20,19.20,0 +115.20,24.00,12.15,0.00,1.00,-38.40,19.20,0 +-57.60,-24.00,3.87,0.00,1.00,-33.60,19.20,0 +124.80,19.20,12.13,0.00,1.00,-28.80,14.40,0 +-48.00,-19.20,3.89,0.00,1.00,-24.00,14.40,0 +134.40,19.20,12.11,0.00,1.00,-19.20,14.40,0 +-38.40,-19.20,3.91,0.00,1.00,-19.20,14.40,0 +144.00,14.40,12.09,0.00,1.00,-14.40,9.60,0 +-28.80,-14.40,3.93,0.00,1.00,-14.40,9.60,0 +153.60,14.40,12.07,0.00,1.00,-9.60,9.60,0 +-24.00,-9.60,3.95,0.00,1.00,-9.60,9.60,0 +163.20,9.60,12.05,0.00,1.00,-4.80,4.80,0 +-14.40,-4.80,3.97,0.00,1.00,-4.80,4.80,0 +172.80,4.80,12.03,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,3.99,0.00,1.00,-0.00,0.00,0 +0.00,0.00,12.01,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,4.02,0.00,1.00,0.00,-0.00,0 +9.60,4.80,11.98,0.00,1.00,4.80,-4.80,0 +-168.00,-4.80,4.04,0.00,1.00,4.80,-4.80,0 +19.20,4.80,11.96,0.00,1.00,9.60,-9.60,0 +-158.40,-9.60,4.06,0.00,1.00,9.60,-9.60,0 +28.80,9.60,11.94,0.00,1.00,14.40,-9.60,0 +-148.80,-9.60,4.08,0.00,1.00,14.40,-14.40,0 +38.40,14.40,11.92,0.00,1.00,19.20,-14.40,0 +-139.20,-14.40,4.10,0.00,1.00,19.20,-14.40,0 +48.00,14.40,11.90,0.00,1.00,24.00,-19.20,0 +-129.60,-14.40,4.12,0.00,1.00,28.80,-19.20,0 +57.60,19.20,11.88,0.00,1.00,33.60,-19.20,0 +-120.00,-19.20,4.14,0.00,1.00,38.40,-19.20,0 +67.20,19.20,11.86,0.00,1.00,43.20,-24.00,0 +-110.40,-19.20,4.17,0.00,1.00,52.80,-24.00,0 +76.80,19.20,11.83,0.00,1.00,62.40,-24.00,0 +-100.80,-19.20,4.19,0.00,1.00,72.00,-24.00,0 +86.40,19.20,11.81,0.00,1.00,81.60,-24.00,0 +-86.40,-19.20,4.21,0.00,1.00,91.20,-24.00,0 +96.00,19.20,11.79,0.00,1.00,105.60,-24.00,0 +-76.80,-19.20,4.23,0.00,1.00,115.20,-24.00,0 +105.60,19.20,11.77,0.00,1.00,124.80,-24.00,0 +-67.20,-19.20,4.25,0.00,1.00,134.40,-24.00,0 +115.20,19.20,11.75,0.00,1.00,139.20,-19.20,0 +-57.60,-19.20,4.27,0.00,1.00,144.00,-19.20,0 +124.80,19.20,11.73,0.00,1.00,148.80,-19.20,0 +-48.00,-14.40,4.29,0.00,1.00,153.60,-19.20,0 +134.40,14.40,11.71,0.00,1.00,158.40,-19.20,0 +-38.40,-14.40,4.32,0.00,1.00,158.40,-14.40,0 +144.00,14.40,11.68,0.00,1.00,163.20,-14.40,0 +-28.80,-9.60,4.34,0.00,1.00,168.00,-14.40,0 +153.60,9.60,11.66,0.00,1.00,168.00,-9.60,0 +-19.20,-9.60,4.36,0.00,1.00,172.80,-9.60,0 +163.20,4.80,11.64,0.00,1.00,172.80,-4.80,0 +-9.60,-4.80,4.38,0.00,1.00,172.80,-4.80,0 +172.80,4.80,11.62,0.00,1.00,177.60,-4.80,0 +-0.00,-0.00,4.40,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,11.60,0.00,1.00,-177.60,0.00,0 +4.80,4.80,4.42,0.00,1.00,-177.60,4.80,0 +-168.00,-4.80,11.58,0.00,1.00,-172.80,4.80,0 +14.40,4.80,4.44,0.00,1.00,-172.80,4.80,0 +-158.40,-9.60,11.56,0.00,1.00,-172.80,9.60,0 +24.00,9.60,4.46,0.00,1.00,-168.00,9.60,0 +-148.80,-9.60,11.54,0.00,1.00,-168.00,14.40,0 +33.60,14.40,4.49,0.00,1.00,-163.20,14.40,0 +-139.20,-14.40,11.51,0.00,1.00,-158.40,14.40,0 +43.20,14.40,4.51,0.00,1.00,-158.40,19.20,0 +-129.60,-14.40,11.49,0.00,1.00,-153.60,19.20,0 +52.80,19.20,4.53,0.00,1.00,-148.80,19.20,0 +-120.00,-19.20,11.47,0.00,1.00,-144.00,19.20,0 +62.40,19.20,4.55,0.00,1.00,-139.20,19.20,0 +-110.40,-19.20,11.45,0.00,1.00,-134.40,24.00,0 +72.00,19.20,4.57,0.00,1.00,-124.80,24.00,0 +-100.80,-19.20,11.43,0.00,1.00,-115.20,24.00,0 +81.60,19.20,4.59,0.00,1.00,-105.60,24.00,0 +-91.20,-19.20,11.41,0.00,1.00,-91.20,24.00,0 +96.00,19.20,4.61,0.00,1.00,-81.60,24.00,0 +-81.60,-19.20,11.39,0.00,1.00,-72.00,24.00,0 +105.60,19.20,4.64,0.00,1.00,-62.40,24.00,0 +-72.00,-19.20,11.36,0.00,1.00,-52.80,24.00,0 +115.20,19.20,4.66,0.00,1.00,-43.20,24.00,0 +-62.40,-19.20,11.34,0.00,1.00,-38.40,19.20,0 +124.80,19.20,4.68,0.00,1.00,-33.60,19.20,0 +-52.80,-14.40,11.32,0.00,1.00,-28.80,19.20,0 +134.40,14.40,4.70,0.00,1.00,-24.00,19.20,0 +-43.20,-14.40,11.30,0.00,1.00,-19.20,14.40,0 +144.00,14.40,4.72,0.00,1.00,-19.20,14.40,0 +-33.60,-9.60,11.28,0.00,1.00,-14.40,14.40,0 +153.60,9.60,4.74,0.00,1.00,-14.40,9.60,0 +-24.00,-9.60,11.26,0.00,1.00,-9.60,9.60,0 +163.20,4.80,4.76,0.00,1.00,-9.60,9.60,0 +-14.40,-4.80,11.24,0.00,1.00,-4.80,4.80,0 +172.80,4.80,4.79,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,11.21,0.00,1.00,-0.00,0.00,0 +0.00,0.00,4.81,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,11.19,0.00,1.00,0.00,-0.00,0 +9.60,4.80,4.83,0.00,1.00,4.80,-4.80,0 +-168.00,-4.80,11.17,0.00,1.00,4.80,-4.80,0 +19.20,4.80,4.85,0.00,1.00,9.60,-9.60,0 +-158.40,-4.80,11.15,0.00,1.00,14.40,-9.60,0 +28.80,9.60,4.87,0.00,1.00,14.40,-14.40,0 +-148.80,-9.60,11.13,0.00,1.00,19.20,-14.40,0 +38.40,9.60,4.89,0.00,1.00,19.20,-19.20,0 +-139.20,-9.60,11.11,0.00,1.00,24.00,-19.20,0 +48.00,9.60,4.91,0.00,1.00,28.80,-19.20,0 +-129.60,-14.40,11.09,0.00,1.00,33.60,-24.00,0 +57.60,14.40,4.93,0.00,1.00,38.40,-24.00,0 +-120.00,-14.40,11.07,0.00,1.00,43.20,-24.00,0 +67.20,14.40,4.96,0.00,1.00,48.00,-24.00,0 +-110.40,-14.40,11.04,0.00,1.00,57.60,-28.80,0 +76.80,14.40,4.98,0.00,1.00,62.40,-28.80,0 +-100.80,-14.40,11.02,0.00,1.00,72.00,-28.80,0 +86.40,14.40,5.00,0.00,1.00,81.60,-28.80,0 +-86.40,-14.40,11.00,0.00,1.00,91.20,-28.80,0 +96.00,14.40,5.02,0.00,1.00,100.80,-28.80,0 +-76.80,-14.40,10.98,0.00,1.00,110.40,-28.80,0 +105.60,14.40,5.04,0.00,1.00,120.00,-28.80,0 +-67.20,-14.40,10.96,0.00,1.00,129.60,-28.80,0 +115.20,14.40,5.06,0.00,1.00,134.40,-24.00,0 +-57.60,-14.40,10.94,0.00,1.00,139.20,-24.00,0 +124.80,14.40,5.08,0.00,1.00,144.00,-24.00,0 +-48.00,-14.40,10.92,0.00,1.00,148.80,-24.00,0 +134.40,9.60,5.11,0.00,1.00,153.60,-19.20,0 +-38.40,-9.60,10.89,0.00,1.00,158.40,-19.20,0 +144.00,9.60,5.13,0.00,1.00,158.40,-14.40,0 +-28.80,-9.60,10.87,0.00,1.00,163.20,-14.40,0 +153.60,4.80,5.15,0.00,1.00,168.00,-14.40,0 +-19.20,-4.80,10.85,0.00,1.00,168.00,-9.60,0 +163.20,4.80,5.17,0.00,1.00,172.80,-9.60,0 +-9.60,-4.80,10.83,0.00,1.00,172.80,-4.80,0 +172.80,0.00,5.19,0.00,1.00,177.60,-4.80,0 +-0.00,-0.00,10.81,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,5.21,0.00,1.00,-177.60,0.00,0 +4.80,0.00,10.79,0.00,1.00,-177.60,4.80,0 +-168.00,-4.80,5.23,0.00,1.00,-172.80,4.80,0 +14.40,4.80,10.77,0.00,1.00,-172.80,9.60,0 +-158.40,-4.80,5.26,0.00,1.00,-168.00,9.60,0 +24.00,4.80,10.74,0.00,1.00,-168.00,14.40,0 +-148.80,-9.60,5.28,0.00,1.00,-163.20,14.40,0 +33.60,9.60,10.72,0.00,1.00,-158.40,14.40,0 +-139.20,-9.60,5.30,0.00,1.00,-158.40,19.20,0 +43.20,9.60,10.70,0.00,1.00,-153.60,19.20,0 +-129.60,-14.40,5.32,0.00,1.00,-148.80,24.00,0 +52.80,14.40,10.68,0.00,1.00,-144.00,24.00,0 +-120.00,-14.40,5.34,0.00,1.00,-139.20,24.00,0 +62.40,14.40,10.66,0.00,1.00,-134.40,24.00,0 +-110.40,-14.40,5.36,0.00,1.00,-129.60,28.80,0 +72.00,14.40,10.64,0.00,1.00,-120.00,28.80,0 +-100.80,-14.40,5.38,0.00,1.00,-110.40,28.80,0 +81.60,14.40,10.62,0.00,1.00,-100.80,28.80,0 +-91.20,-14.40,5.40,0.00,1.00,-91.20,28.80,0 +96.00,14.40,10.60,0.00,1.00,-81.60,28.80,0 +-81.60,-14.40,5.43,0.00,1.00,-72.00,28.80,0 +105.60,14.40,10.57,0.00,1.00,-62.40,28.80,0 +-72.00,-14.40,5.45,0.00,1.00,-57.60,28.80,0 +115.20,14.40,10.55,0.00,1.00,-48.00,24.00,0 +-62.40,-14.40,5.47,0.00,1.00,-43.20,24.00,0 +124.80,14.40,10.53,0.00,1.00,-38.40,24.00,0 +-52.80,-14.40,5.49,0.00,1.00,-33.60,24.00,0 +134.40,9.60,10.51,0.00,1.00,-28.80,19.20,0 +-43.20,-9.60,5.51,0.00,1.00,-24.00,19.20,0 +144.00,9.60,10.49,0.00,1.00,-19.20,19.20,0 +-33.60,-9.60,5.53,0.00,1.00,-19.20,14.40,0 +153.60,9.60,10.47,0.00,1.00,-14.40,14.40,0 +-24.00,-4.80,5.55,0.00,1.00,-14.40,9.60,0 +163.20,4.80,10.45,0.00,1.00,-9.60,9.60,0 +-14.40,-4.80,5.58,0.00,1.00,-4.80,4.80,0 +172.80,4.80,10.42,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,5.60,0.00,1.00,-0.00,0.00,0 +0.00,0.00,10.40,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,5.62,0.00,1.00,4.80,-4.80,0 +9.60,0.00,10.38,0.00,1.00,4.80,-4.80,0 +-168.00,-4.80,5.64,0.00,1.00,9.60,-9.60,0 +19.20,4.80,10.36,0.00,1.00,9.60,-9.60,0 +-158.40,-4.80,5.66,0.00,1.00,14.40,-14.40,0 +28.80,4.80,10.34,0.00,1.00,19.20,-14.40,0 +-148.80,-4.80,5.68,0.00,1.00,19.20,-19.20,0 +38.40,4.80,10.32,0.00,1.00,24.00,-19.20,0 +-139.20,-9.60,5.70,0.00,1.00,28.80,-24.00,0 +48.00,9.60,10.30,0.00,1.00,33.60,-24.00,0 +-129.60,-9.60,5.72,0.00,1.00,38.40,-24.00,0 +57.60,9.60,10.28,0.00,1.00,43.20,-28.80,0 +-120.00,-9.60,5.75,0.00,1.00,48.00,-28.80,0 +67.20,9.60,10.25,0.00,1.00,52.80,-28.80,0 +-110.40,-9.60,5.77,0.00,1.00,57.60,-33.60,0 +76.80,9.60,10.23,0.00,1.00,67.20,-33.60,0 +-100.80,-9.60,5.79,0.00,1.00,76.80,-33.60,0 +86.40,9.60,10.21,0.00,1.00,81.60,-33.60,0 +-86.40,-9.60,5.81,0.00,1.00,91.20,-33.60,0 +96.00,9.60,10.19,0.00,1.00,100.80,-33.60,0 +-76.80,-9.60,5.83,0.00,1.00,110.40,-33.60,0 +105.60,9.60,10.17,0.00,1.00,115.20,-33.60,0 +-67.20,-9.60,5.85,0.00,1.00,124.80,-33.60,0 +115.20,9.60,10.15,0.00,1.00,129.60,-28.80,0 +-57.60,-9.60,5.87,0.00,1.00,134.40,-28.80,0 +124.80,9.60,10.13,0.00,1.00,139.20,-28.80,0 +-48.00,-9.60,5.90,0.00,1.00,144.00,-24.00,0 +134.40,9.60,10.10,0.00,1.00,148.80,-24.00,0 +-38.40,-9.60,5.92,0.00,1.00,153.60,-19.20,0 +144.00,4.80,10.08,0.00,1.00,158.40,-19.20,0 +-28.80,-4.80,5.94,0.00,1.00,163.20,-14.40,0 +153.60,4.80,10.06,0.00,1.00,163.20,-14.40,0 +-19.20,-4.80,5.96,0.00,1.00,168.00,-9.60,0 +163.20,4.80,10.04,0.00,1.00,172.80,-9.60,0 +-9.60,-0.00,5.98,0.00,1.00,172.80,-4.80,0 +172.80,0.00,10.02,0.00,1.00,177.60,-4.80,0 +-0.00,-0.00,6.00,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,10.00,0.00,1.00,-177.60,0.00,0 +4.80,0.00,6.02,0.00,1.00,-177.60,4.80,0 +-168.00,-0.00,9.98,0.00,1.00,-172.80,4.80,0 +14.40,4.80,6.05,0.00,1.00,-172.80,9.60,0 +-158.40,-4.80,9.95,0.00,1.00,-168.00,9.60,0 +24.00,4.80,6.07,0.00,1.00,-163.20,14.40,0 +-148.80,-4.80,9.93,0.00,1.00,-163.20,14.40,0 +33.60,4.80,6.09,0.00,1.00,-158.40,19.20,0 +-139.20,-9.60,9.91,0.00,1.00,-153.60,19.20,0 +43.20,9.60,6.11,0.00,1.00,-148.80,24.00,0 +-129.60,-9.60,9.89,0.00,1.00,-144.00,24.00,0 +52.80,9.60,6.13,0.00,1.00,-139.20,28.80,0 +-120.00,-9.60,9.87,0.00,1.00,-134.40,28.80,0 +62.40,9.60,6.15,0.00,1.00,-129.60,28.80,0 +-110.40,-9.60,9.85,0.00,1.00,-124.80,33.60,0 +72.00,9.60,6.17,0.00,1.00,-115.20,33.60,0 +-100.80,-9.60,9.83,0.00,1.00,-110.40,33.60,0 +81.60,9.60,6.19,0.00,1.00,-100.80,33.60,0 +-91.20,-9.60,9.81,0.00,1.00,-91.20,33.60,0 +96.00,9.60,6.22,0.00,1.00,-81.60,33.60,0 +-81.60,-9.60,9.78,0.00,1.00,-76.80,33.60,0 +105.60,9.60,6.24,0.00,1.00,-67.20,33.60,0 +-72.00,-9.60,9.76,0.00,1.00,-57.60,33.60,0 +115.20,9.60,6.26,0.00,1.00,-52.80,28.80,0 +-62.40,-9.60,9.74,0.00,1.00,-48.00,28.80,0 +124.80,9.60,6.28,0.00,1.00,-43.20,28.80,0 +-52.80,-9.60,9.72,0.00,1.00,-38.40,24.00,0 +134.40,9.60,6.30,0.00,1.00,-33.60,24.00,0 +-43.20,-9.60,9.70,0.00,1.00,-28.80,24.00,0 +144.00,4.80,6.32,0.00,1.00,-24.00,19.20,0 +-33.60,-4.80,9.68,0.00,1.00,-19.20,19.20,0 +153.60,4.80,6.34,0.00,1.00,-19.20,14.40,0 +-24.00,-4.80,9.66,0.00,1.00,-14.40,14.40,0 +163.20,4.80,6.37,0.00,1.00,-9.60,9.60,0 +-14.40,-4.80,9.63,0.00,1.00,-9.60,9.60,0 +172.80,0.00,6.39,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,9.61,0.00,1.00,-4.80,4.80,0 +0.00,0.00,6.41,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,9.59,0.00,1.00,4.80,-4.80,0 +9.60,0.00,6.43,0.00,1.00,4.80,-4.80,0 +-168.00,-0.00,9.57,0.00,1.00,9.60,-9.60,0 +19.20,0.00,6.45,0.00,1.00,14.40,-9.60,0 +-158.40,-4.80,9.55,0.00,1.00,14.40,-14.40,0 +28.80,4.80,6.47,0.00,1.00,19.20,-19.20,0 +-148.80,-4.80,9.53,0.00,1.00,24.00,-19.20,0 +38.40,4.80,6.49,0.00,1.00,24.00,-24.00,0 +-139.20,-4.80,9.51,0.00,1.00,28.80,-24.00,0 +48.00,4.80,6.52,0.00,1.00,33.60,-28.80,0 +-129.60,-4.80,9.48,0.00,1.00,38.40,-28.80,0 +57.60,4.80,6.54,0.00,1.00,43.20,-33.60,0 +-120.00,-4.80,9.46,0.00,1.00,48.00,-33.60,0 +67.20,4.80,6.56,0.00,1.00,57.60,-33.60,0 +-110.40,-4.80,9.44,0.00,1.00,62.40,-38.40,0 +76.80,4.80,6.58,0.00,1.00,67.20,-38.40,0 +-100.80,-4.80,9.42,0.00,1.00,76.80,-38.40,0 +86.40,4.80,6.60,0.00,1.00,86.40,-38.40,0 +-86.40,-4.80,9.40,0.00,1.00,91.20,-38.40,0 +96.00,4.80,6.62,0.00,1.00,100.80,-38.40,0 +-76.80,-4.80,9.38,0.00,1.00,105.60,-38.40,0 +105.60,4.80,6.64,0.00,1.00,115.20,-38.40,0 +-67.20,-4.80,9.36,0.00,1.00,120.00,-33.60,0 +115.20,4.80,6.66,0.00,1.00,124.80,-33.60,0 +-57.60,-4.80,9.34,0.00,1.00,134.40,-33.60,0 +124.80,4.80,6.69,0.00,1.00,139.20,-28.80,0 +-48.00,-4.80,9.31,0.00,1.00,144.00,-28.80,0 +134.40,4.80,6.71,0.00,1.00,148.80,-24.00,0 +-38.40,-4.80,9.29,0.00,1.00,153.60,-24.00,0 +144.00,4.80,6.73,0.00,1.00,153.60,-19.20,0 +-28.80,-4.80,9.27,0.00,1.00,158.40,-19.20,0 +153.60,4.80,6.75,0.00,1.00,163.20,-14.40,0 +-19.20,-4.80,9.25,0.00,1.00,168.00,-14.40,0 +163.20,0.00,6.77,0.00,1.00,168.00,-9.60,0 +-9.60,-0.00,9.23,0.00,1.00,172.80,-9.60,0 +172.80,0.00,6.79,0.00,1.00,177.60,-4.80,0 +-0.00,-0.00,9.21,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,6.81,0.00,1.00,-177.60,0.00,0 +4.80,0.00,9.19,0.00,1.00,-177.60,4.80,0 +-168.00,-0.00,6.84,0.00,1.00,-172.80,9.60,0 +14.40,0.00,9.16,0.00,1.00,-168.00,9.60,0 +-158.40,-4.80,6.86,0.00,1.00,-168.00,14.40,0 +24.00,4.80,9.14,0.00,1.00,-163.20,14.40,0 +-148.80,-4.80,6.88,0.00,1.00,-158.40,19.20,0 +33.60,4.80,9.12,0.00,1.00,-153.60,19.20,0 +-139.20,-4.80,6.90,0.00,1.00,-153.60,24.00,0 +43.20,4.80,9.10,0.00,1.00,-148.80,24.00,0 +-129.60,-4.80,6.92,0.00,1.00,-144.00,28.80,0 +52.80,4.80,9.08,0.00,1.00,-139.20,28.80,0 +-120.00,-4.80,6.94,0.00,1.00,-134.40,33.60,0 +62.40,4.80,9.06,0.00,1.00,-124.80,33.60,0 +-110.40,-4.80,6.96,0.00,1.00,-120.00,33.60,0 +72.00,4.80,9.04,0.00,1.00,-115.20,38.40,0 +-100.80,-4.80,6.99,0.00,1.00,-105.60,38.40,0 +81.60,4.80,9.01,0.00,1.00,-100.80,38.40,0 +-91.20,-4.80,7.01,0.00,1.00,-91.20,38.40,0 +96.00,4.80,8.99,0.00,1.00,-86.40,38.40,0 +-81.60,-4.80,7.03,0.00,1.00,-76.80,38.40,0 +105.60,4.80,8.97,0.00,1.00,-67.20,38.40,0 +-72.00,-4.80,7.05,0.00,1.00,-62.40,38.40,0 +115.20,4.80,8.95,0.00,1.00,-57.60,33.60,0 +-62.40,-4.80,7.07,0.00,1.00,-48.00,33.60,0 +124.80,4.80,8.93,0.00,1.00,-43.20,33.60,0 +-52.80,-4.80,7.09,0.00,1.00,-38.40,28.80,0 +134.40,4.80,8.91,0.00,1.00,-33.60,28.80,0 +-43.20,-4.80,7.11,0.00,1.00,-28.80,24.00,0 +144.00,4.80,8.89,0.00,1.00,-24.00,24.00,0 +-33.60,-4.80,7.13,0.00,1.00,-24.00,19.20,0 +153.60,4.80,8.87,0.00,1.00,-19.20,19.20,0 +-24.00,-4.80,7.16,0.00,1.00,-14.40,14.40,0 +163.20,0.00,8.84,0.00,1.00,-14.40,9.60,0 +-14.40,-0.00,7.18,0.00,1.00,-9.60,9.60,0 +172.80,0.00,8.82,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,7.20,0.00,1.00,-4.80,4.80,0 +0.00,0.00,8.80,0.00,1.00,0.00,0.00,0 +-177.60,-0.00,7.22,0.00,1.00,4.80,-4.80,0 +9.60,0.00,8.78,0.00,1.00,4.80,-4.80,0 +-168.00,-0.00,7.24,0.00,1.00,9.60,-9.60,0 +19.20,0.00,8.76,0.00,1.00,14.40,-14.40,0 +-158.40,-0.00,7.26,0.00,1.00,19.20,-14.40,0 +28.80,0.00,8.74,0.00,1.00,19.20,-19.20,0 +-148.80,-0.00,7.28,0.00,1.00,24.00,-24.00,0 +38.40,0.00,8.72,0.00,1.00,28.80,-24.00,0 +-139.20,-0.00,7.31,0.00,1.00,33.60,-28.80,0 +48.00,0.00,8.69,0.00,1.00,38.40,-28.80,0 +-129.60,-0.00,7.33,0.00,1.00,43.20,-33.60,0 +57.60,0.00,8.67,0.00,1.00,48.00,-33.60,0 +-120.00,-0.00,7.35,0.00,1.00,52.80,-38.40,0 +67.20,0.00,8.65,0.00,1.00,57.60,-38.40,0 +-110.40,-0.00,7.37,0.00,1.00,62.40,-38.40,0 +76.80,0.00,8.63,0.00,1.00,72.00,-43.20,0 +-100.80,-0.00,7.39,0.00,1.00,76.80,-43.20,0 +86.40,0.00,8.61,0.00,1.00,86.40,-43.20,0 +-86.40,-0.00,7.41,0.00,1.00,91.20,-43.20,0 +96.00,0.00,8.59,0.00,1.00,100.80,-43.20,0 +-76.80,-0.00,7.43,0.00,1.00,105.60,-43.20,0 +105.60,0.00,8.57,0.00,1.00,110.40,-43.20,0 +-67.20,-0.00,7.46,0.00,1.00,120.00,-38.40,0 +115.20,0.00,8.54,0.00,1.00,124.80,-38.40,0 +-57.60,-0.00,7.48,0.00,1.00,129.60,-38.40,0 +124.80,0.00,8.52,0.00,1.00,134.40,-33.60,0 +-48.00,-0.00,7.50,0.00,1.00,139.20,-33.60,0 +134.40,0.00,8.50,0.00,1.00,144.00,-28.80,0 +-38.40,-0.00,7.52,0.00,1.00,148.80,-28.80,0 +144.00,0.00,8.48,0.00,1.00,153.60,-24.00,0 +-28.80,-0.00,7.54,0.00,1.00,158.40,-19.20,0 +153.60,0.00,8.46,0.00,1.00,163.20,-19.20,0 +-19.20,-0.00,7.56,0.00,1.00,163.20,-14.40,0 +163.20,0.00,8.44,0.00,1.00,168.00,-9.60,0 +-9.60,-0.00,7.58,0.00,1.00,172.80,-9.60,0 +172.80,0.00,8.42,0.00,1.00,172.80,-4.80,0 +-0.00,-0.00,7.60,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,8.40,0.00,1.00,-177.60,0.00,0 +4.80,0.00,7.63,0.00,1.00,-172.80,4.80,0 +-168.00,-0.00,8.37,0.00,1.00,-172.80,9.60,0 +14.40,0.00,7.65,0.00,1.00,-168.00,9.60,0 +-158.40,-0.00,8.35,0.00,1.00,-163.20,14.40,0 +24.00,0.00,7.67,0.00,1.00,-163.20,19.20,0 +-148.80,-0.00,8.33,0.00,1.00,-158.40,19.20,0 +33.60,0.00,7.69,0.00,1.00,-153.60,24.00,0 +-139.20,-0.00,8.31,0.00,1.00,-148.80,28.80,0 +43.20,0.00,7.71,0.00,1.00,-144.00,28.80,0 +-129.60,-0.00,8.29,0.00,1.00,-139.20,33.60,0 +52.80,0.00,7.73,0.00,1.00,-134.40,33.60,0 +-120.00,-0.00,8.27,0.00,1.00,-129.60,38.40,0 +62.40,0.00,7.75,0.00,1.00,-124.80,38.40,0 +-110.40,-0.00,8.25,0.00,1.00,-120.00,38.40,0 +72.00,0.00,7.78,0.00,1.00,-110.40,43.20,0 +-100.80,-0.00,8.22,0.00,1.00,-105.60,43.20,0 +81.60,0.00,7.80,0.00,1.00,-100.80,43.20,0 +-91.20,-0.00,8.20,0.00,1.00,-91.20,43.20,0 +96.00,0.00,7.82,0.00,1.00,-86.40,43.20,0 +-81.60,-0.00,8.18,0.00,1.00,-76.80,43.20,0 +105.60,0.00,7.84,0.00,1.00,-72.00,43.20,0 +-72.00,-0.00,8.16,0.00,1.00,-62.40,38.40,0 +115.20,0.00,7.86,0.00,1.00,-57.60,38.40,0 +-62.40,-0.00,8.14,0.00,1.00,-52.80,38.40,0 +124.80,0.00,7.88,0.00,1.00,-48.00,33.60,0 +-52.80,-0.00,8.12,0.00,1.00,-43.20,33.60,0 +134.40,0.00,7.90,0.00,1.00,-38.40,28.80,0 +-43.20,-0.00,8.10,0.00,1.00,-33.60,28.80,0 +144.00,0.00,7.93,0.00,1.00,-28.80,24.00,0 +-33.60,-0.00,8.07,0.00,1.00,-24.00,24.00,0 +153.60,0.00,7.95,0.00,1.00,-19.20,19.20,0 +-24.00,-0.00,8.05,0.00,1.00,-19.20,14.40,0 +163.20,0.00,7.97,0.00,1.00,-14.40,14.40,0 +-14.40,-0.00,8.03,0.00,1.00,-9.60,9.60,0 +172.80,0.00,7.99,0.00,1.00,-4.80,4.80,0 +-4.80,-0.00,8.01,0.00,1.00,-4.80,4.80,0 +0.00,0.00,8.01,0.00,1.00,0.00,0.00,0 +-177.60,0.00,7.99,0.00,1.00,4.80,-4.80,0 +9.60,-0.00,8.03,0.00,1.00,4.80,-4.80,0 +-168.00,0.00,7.97,0.00,1.00,9.60,-9.60,0 +19.20,-0.00,8.05,0.00,1.00,14.40,-14.40,0 +-158.40,0.00,7.95,0.00,1.00,19.20,-19.20,0 +28.80,-0.00,8.07,0.00,1.00,24.00,-19.20,0 +-148.80,0.00,7.93,0.00,1.00,24.00,-24.00,0 +38.40,-0.00,8.10,0.00,1.00,28.80,-28.80,0 +-139.20,0.00,7.90,0.00,1.00,33.60,-28.80,0 +48.00,-0.00,8.12,0.00,1.00,38.40,-33.60,0 +-129.60,0.00,7.88,0.00,1.00,43.20,-38.40,0 +57.60,-4.80,8.14,0.00,1.00,48.00,-38.40,0 +-120.00,4.80,7.86,0.00,1.00,52.80,-43.20,0 +67.20,-4.80,8.16,0.00,1.00,62.40,-43.20,0 +-110.40,4.80,7.84,0.00,1.00,67.20,-43.20,0 +76.80,-4.80,8.18,0.00,1.00,72.00,-48.00,0 +-100.80,4.80,7.82,0.00,1.00,76.80,-48.00,0 +86.40,-4.80,8.20,0.00,1.00,86.40,-48.00,0 +-86.40,4.80,7.80,0.00,1.00,91.20,-48.00,0 +96.00,-4.80,8.22,0.00,1.00,96.00,-48.00,0 +-76.80,4.80,7.78,0.00,1.00,105.60,-48.00,0 +105.60,-4.80,8.25,0.00,1.00,110.40,-48.00,0 +-67.20,4.80,7.75,0.00,1.00,115.20,-43.20,0 +115.20,-4.80,8.27,0.00,1.00,120.00,-43.20,0 +-57.60,4.80,7.73,0.00,1.00,129.60,-38.40,0 +124.80,-4.80,8.29,0.00,1.00,134.40,-38.40,0 +-48.00,0.00,7.71,0.00,1.00,139.20,-33.60,0 +134.40,-0.00,8.31,0.00,1.00,144.00,-33.60,0 +-38.40,0.00,7.69,0.00,1.00,148.80,-28.80,0 +144.00,-0.00,8.33,0.00,1.00,153.60,-24.00,0 +-28.80,0.00,7.67,0.00,1.00,153.60,-24.00,0 +153.60,-0.00,8.35,0.00,1.00,158.40,-19.20,0 +-19.20,0.00,7.65,0.00,1.00,163.20,-14.40,0 +163.20,-0.00,8.37,0.00,1.00,168.00,-14.40,0 +-9.60,0.00,7.63,0.00,1.00,172.80,-9.60,0 +172.80,-0.00,8.40,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,7.60,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,8.42,0.00,1.00,-177.60,0.00,0 +4.80,-0.00,7.58,0.00,1.00,-172.80,4.80,0 +-168.00,0.00,8.44,0.00,1.00,-172.80,9.60,0 +14.40,-0.00,7.56,0.00,1.00,-168.00,14.40,0 +-158.40,0.00,8.46,0.00,1.00,-163.20,14.40,0 +24.00,-0.00,7.54,0.00,1.00,-158.40,19.20,0 +-148.80,0.00,8.48,0.00,1.00,-153.60,24.00,0 +33.60,-0.00,7.52,0.00,1.00,-153.60,24.00,0 +-139.20,0.00,8.50,0.00,1.00,-148.80,28.80,0 +43.20,-0.00,7.50,0.00,1.00,-144.00,33.60,0 +-129.60,0.00,8.52,0.00,1.00,-139.20,33.60,0 +52.80,-4.80,7.48,0.00,1.00,-134.40,38.40,0 +-120.00,4.80,8.54,0.00,1.00,-129.60,38.40,0 +62.40,-4.80,7.46,0.00,1.00,-120.00,43.20,0 +-110.40,4.80,8.57,0.00,1.00,-115.20,43.20,0 +72.00,-4.80,7.43,0.00,1.00,-110.40,48.00,0 +-100.80,4.80,8.59,0.00,1.00,-105.60,48.00,0 +81.60,-4.80,7.41,0.00,1.00,-96.00,48.00,0 +-91.20,4.80,8.61,0.00,1.00,-91.20,48.00,0 +96.00,-4.80,7.39,0.00,1.00,-86.40,48.00,0 +-81.60,4.80,8.63,0.00,1.00,-76.80,48.00,0 +105.60,-4.80,7.37,0.00,1.00,-72.00,48.00,0 +-72.00,4.80,8.65,0.00,1.00,-67.20,43.20,0 +115.20,-4.80,7.35,0.00,1.00,-62.40,43.20,0 +-62.40,4.80,8.67,0.00,1.00,-52.80,43.20,0 +124.80,-4.80,7.33,0.00,1.00,-48.00,38.40,0 +-52.80,0.00,8.69,0.00,1.00,-43.20,38.40,0 +134.40,-0.00,7.31,0.00,1.00,-38.40,33.60,0 +-43.20,0.00,8.72,0.00,1.00,-33.60,28.80,0 +144.00,-0.00,7.28,0.00,1.00,-28.80,28.80,0 +-33.60,0.00,8.74,0.00,1.00,-24.00,24.00,0 +153.60,-0.00,7.26,0.00,1.00,-24.00,19.20,0 +-24.00,0.00,8.76,0.00,1.00,-19.20,19.20,0 +163.20,-0.00,7.24,0.00,1.00,-14.40,14.40,0 +-14.40,0.00,8.78,0.00,1.00,-9.60,9.60,0 +172.80,-0.00,7.22,0.00,1.00,-4.80,4.80,0 +-4.80,0.00,8.80,0.00,1.00,-4.80,4.80,0 +0.00,0.00,7.20,0.00,1.00,0.00,0.00,0 +-177.60,0.00,8.82,0.00,1.00,4.80,-4.80,0 +9.60,-0.00,7.18,0.00,1.00,9.60,-9.60,0 +-168.00,0.00,8.84,0.00,1.00,9.60,-9.60,0 +19.20,-4.80,7.16,0.00,1.00,14.40,-14.40,0 +-158.40,4.80,8.87,0.00,1.00,19.20,-19.20,0 +28.80,-4.80,7.13,0.00,1.00,24.00,-24.00,0 +-148.80,4.80,8.89,0.00,1.00,28.80,-24.00,0 +38.40,-4.80,7.11,0.00,1.00,33.60,-28.80,0 +-139.20,4.80,8.91,0.00,1.00,38.40,-33.60,0 +48.00,-4.80,7.09,0.00,1.00,43.20,-38.40,0 +-129.60,4.80,8.93,0.00,1.00,48.00,-38.40,0 +57.60,-4.80,7.07,0.00,1.00,52.80,-43.20,0 +-120.00,4.80,8.95,0.00,1.00,57.60,-43.20,0 +67.20,-4.80,7.05,0.00,1.00,62.40,-48.00,0 +-110.40,9.60,8.97,0.00,1.00,67.20,-48.00,0 +76.80,-9.60,7.03,0.00,1.00,72.00,-52.80,0 +-100.80,9.60,8.99,0.00,1.00,81.60,-52.80,0 +86.40,-9.60,7.01,0.00,1.00,86.40,-52.80,0 +-86.40,9.60,9.01,0.00,1.00,91.20,-52.80,0 +96.00,-9.60,6.99,0.00,1.00,96.00,-52.80,0 +-76.80,9.60,9.04,0.00,1.00,105.60,-52.80,0 +105.60,-9.60,6.96,0.00,1.00,110.40,-48.00,0 +-67.20,9.60,9.06,0.00,1.00,115.20,-48.00,0 +115.20,-4.80,6.94,0.00,1.00,120.00,-48.00,0 +-57.60,4.80,9.08,0.00,1.00,124.80,-43.20,0 +124.80,-4.80,6.92,0.00,1.00,129.60,-43.20,0 +-48.00,4.80,9.10,0.00,1.00,134.40,-38.40,0 +134.40,-4.80,6.90,0.00,1.00,139.20,-33.60,0 +-38.40,4.80,9.12,0.00,1.00,144.00,-33.60,0 +144.00,-4.80,6.88,0.00,1.00,148.80,-28.80,0 +-28.80,4.80,9.14,0.00,1.00,153.60,-24.00,0 +153.60,-4.80,6.86,0.00,1.00,158.40,-19.20,0 +-19.20,4.80,9.16,0.00,1.00,163.20,-19.20,0 +163.20,-0.00,6.84,0.00,1.00,168.00,-14.40,0 +-9.60,0.00,9.19,0.00,1.00,168.00,-9.60,0 +172.80,-0.00,6.81,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,9.21,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,6.79,0.00,1.00,-177.60,0.00,0 +4.80,-0.00,9.23,0.00,1.00,-172.80,4.80,0 +-168.00,0.00,6.77,0.00,1.00,-168.00,9.60,0 +14.40,-0.00,9.25,0.00,1.00,-168.00,14.40,0 +-158.40,4.80,6.75,0.00,1.00,-163.20,19.20,0 +24.00,-4.80,9.27,0.00,1.00,-158.40,19.20,0 +-148.80,4.80,6.73,0.00,1.00,-153.60,24.00,0 +33.60,-4.80,9.29,0.00,1.00,-148.80,28.80,0 +-139.20,4.80,6.71,0.00,1.00,-144.00,33.60,0 +43.20,-4.80,9.31,0.00,1.00,-139.20,33.60,0 +-129.60,4.80,6.69,0.00,1.00,-134.40,38.40,0 +52.80,-4.80,9.34,0.00,1.00,-129.60,43.20,0 +-120.00,4.80,6.66,0.00,1.00,-124.80,43.20,0 +62.40,-4.80,9.36,0.00,1.00,-120.00,48.00,0 +-110.40,9.60,6.64,0.00,1.00,-115.20,48.00,0 +72.00,-9.60,9.38,0.00,1.00,-110.40,48.00,0 +-100.80,9.60,6.62,0.00,1.00,-105.60,52.80,0 +81.60,-9.60,9.40,0.00,1.00,-96.00,52.80,0 +-91.20,9.60,6.60,0.00,1.00,-91.20,52.80,0 +96.00,-9.60,9.42,0.00,1.00,-86.40,52.80,0 +-81.60,9.60,6.58,0.00,1.00,-81.60,52.80,0 +105.60,-9.60,9.44,0.00,1.00,-72.00,52.80,0 +-72.00,9.60,6.56,0.00,1.00,-67.20,48.00,0 +115.20,-4.80,9.46,0.00,1.00,-62.40,48.00,0 +-62.40,4.80,6.54,0.00,1.00,-57.60,43.20,0 +124.80,-4.80,9.48,0.00,1.00,-52.80,43.20,0 +-52.80,4.80,6.52,0.00,1.00,-48.00,38.40,0 +134.40,-4.80,9.51,0.00,1.00,-43.20,38.40,0 +-43.20,4.80,6.49,0.00,1.00,-38.40,33.60,0 +144.00,-4.80,9.53,0.00,1.00,-33.60,28.80,0 +-33.60,4.80,6.47,0.00,1.00,-28.80,24.00,0 +153.60,-4.80,9.55,0.00,1.00,-24.00,24.00,0 +-24.00,4.80,6.45,0.00,1.00,-19.20,19.20,0 +163.20,-4.80,9.57,0.00,1.00,-14.40,14.40,0 +-14.40,0.00,6.43,0.00,1.00,-9.60,9.60,0 +172.80,-0.00,9.59,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,6.41,0.00,1.00,-4.80,4.80,0 +0.00,0.00,9.61,0.00,1.00,0.00,0.00,0 +-177.60,0.00,6.39,0.00,1.00,4.80,-4.80,0 +9.60,-0.00,9.63,0.00,1.00,9.60,-9.60,0 +-168.00,4.80,6.37,0.00,1.00,14.40,-14.40,0 +19.20,-4.80,9.66,0.00,1.00,14.40,-14.40,0 +-158.40,4.80,6.34,0.00,1.00,19.20,-19.20,0 +28.80,-4.80,9.68,0.00,1.00,24.00,-24.00,0 +-148.80,4.80,6.32,0.00,1.00,28.80,-28.80,0 +38.40,-9.60,9.70,0.00,1.00,33.60,-33.60,0 +-139.20,9.60,6.30,0.00,1.00,38.40,-33.60,0 +48.00,-9.60,9.72,0.00,1.00,43.20,-38.40,0 +-129.60,9.60,6.28,0.00,1.00,48.00,-43.20,0 +57.60,-9.60,9.74,0.00,1.00,52.80,-43.20,0 +-120.00,9.60,6.26,0.00,1.00,57.60,-48.00,0 +67.20,-9.60,9.76,0.00,1.00,62.40,-52.80,0 +-110.40,9.60,6.24,0.00,1.00,67.20,-52.80,0 +76.80,-14.40,9.78,0.00,1.00,76.80,-57.60,0 +-100.80,14.40,6.22,0.00,1.00,81.60,-57.60,0 +86.40,-14.40,9.81,0.00,1.00,86.40,-57.60,0 +-86.40,14.40,6.19,0.00,1.00,91.20,-57.60,0 +96.00,-14.40,9.83,0.00,1.00,96.00,-57.60,0 +-76.80,14.40,6.17,0.00,1.00,100.80,-57.60,0 +105.60,-14.40,9.85,0.00,1.00,110.40,-52.80,0 +-67.20,9.60,6.15,0.00,1.00,115.20,-52.80,0 +115.20,-9.60,9.87,0.00,1.00,120.00,-48.00,0 +-57.60,9.60,6.13,0.00,1.00,124.80,-48.00,0 +124.80,-9.60,9.89,0.00,1.00,129.60,-43.20,0 +-48.00,9.60,6.11,0.00,1.00,134.40,-38.40,0 +134.40,-9.60,9.91,0.00,1.00,139.20,-38.40,0 +-38.40,9.60,6.09,0.00,1.00,144.00,-33.60,0 +144.00,-9.60,9.93,0.00,1.00,148.80,-28.80,0 +-28.80,4.80,6.07,0.00,1.00,153.60,-24.00,0 +153.60,-4.80,9.95,0.00,1.00,158.40,-24.00,0 +-19.20,4.80,6.05,0.00,1.00,163.20,-19.20,0 +163.20,-4.80,9.98,0.00,1.00,168.00,-14.40,0 +-9.60,4.80,6.02,0.00,1.00,168.00,-9.60,0 +172.80,-0.00,10.00,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,6.00,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,10.02,0.00,1.00,-177.60,0.00,0 +4.80,-0.00,5.98,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,10.04,0.00,1.00,-168.00,9.60,0 +14.40,-4.80,5.96,0.00,1.00,-168.00,14.40,0 +-158.40,4.80,10.06,0.00,1.00,-163.20,19.20,0 +24.00,-4.80,5.94,0.00,1.00,-158.40,24.00,0 +-148.80,4.80,10.08,0.00,1.00,-153.60,24.00,0 +33.60,-9.60,5.92,0.00,1.00,-148.80,28.80,0 +-139.20,9.60,10.10,0.00,1.00,-144.00,33.60,0 +43.20,-9.60,5.90,0.00,1.00,-139.20,38.40,0 +-129.60,9.60,10.13,0.00,1.00,-134.40,38.40,0 +52.80,-9.60,5.87,0.00,1.00,-129.60,43.20,0 +-120.00,9.60,10.15,0.00,1.00,-124.80,48.00,0 +62.40,-9.60,5.85,0.00,1.00,-120.00,48.00,0 +-110.40,9.60,10.17,0.00,1.00,-115.20,52.80,0 +72.00,-14.40,5.83,0.00,1.00,-110.40,52.80,0 +-100.80,14.40,10.19,0.00,1.00,-100.80,57.60,0 +81.60,-14.40,5.81,0.00,1.00,-96.00,57.60,0 +-91.20,14.40,10.21,0.00,1.00,-91.20,57.60,0 +96.00,-14.40,5.79,0.00,1.00,-86.40,57.60,0 +-81.60,14.40,10.23,0.00,1.00,-81.60,57.60,0 +105.60,-14.40,5.77,0.00,1.00,-76.80,57.60,0 +-72.00,9.60,10.25,0.00,1.00,-67.20,52.80,0 +115.20,-9.60,5.75,0.00,1.00,-62.40,52.80,0 +-62.40,9.60,10.28,0.00,1.00,-57.60,48.00,0 +124.80,-9.60,5.72,0.00,1.00,-52.80,43.20,0 +-52.80,9.60,10.30,0.00,1.00,-48.00,43.20,0 +134.40,-9.60,5.70,0.00,1.00,-43.20,38.40,0 +-43.20,9.60,10.32,0.00,1.00,-38.40,33.60,0 +144.00,-9.60,5.68,0.00,1.00,-33.60,33.60,0 +-33.60,4.80,10.34,0.00,1.00,-28.80,28.80,0 +153.60,-4.80,5.66,0.00,1.00,-24.00,24.00,0 +-24.00,4.80,10.36,0.00,1.00,-19.20,19.20,0 +163.20,-4.80,5.64,0.00,1.00,-14.40,14.40,0 +-14.40,4.80,10.38,0.00,1.00,-14.40,14.40,0 +172.80,-0.00,5.62,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,10.40,0.00,1.00,-4.80,4.80,0 +0.00,0.00,5.60,0.00,1.00,0.00,0.00,0 +-177.60,0.00,10.42,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,5.58,0.00,1.00,9.60,-9.60,0 +-168.00,4.80,10.45,0.00,1.00,14.40,-14.40,0 +19.20,-4.80,5.55,0.00,1.00,19.20,-19.20,0 +-158.40,4.80,10.47,0.00,1.00,19.20,-19.20,0 +28.80,-9.60,5.53,0.00,1.00,24.00,-24.00,0 +-148.80,9.60,10.49,0.00,1.00,28.80,-28.80,0 +38.40,-9.60,5.51,0.00,1.00,33.60,-33.60,0 +-139.20,9.60,10.51,0.00,1.00,38.40,-38.40,0 +48.00,-14.40,5.49,0.00,1.00,43.20,-43.20,0 +-129.60,14.40,10.53,0.00,1.00,48.00,-43.20,0 +57.60,-14.40,5.47,0.00,1.00,52.80,-48.00,0 +-120.00,14.40,10.55,0.00,1.00,57.60,-52.80,0 +67.20,-14.40,5.45,0.00,1.00,62.40,-52.80,0 +-110.40,14.40,10.57,0.00,1.00,72.00,-57.60,0 +76.80,-19.20,5.43,0.00,1.00,76.80,-57.60,0 +-100.80,19.20,10.60,0.00,1.00,81.60,-62.40,0 +86.40,-19.20,5.40,0.00,1.00,86.40,-62.40,0 +-86.40,19.20,10.62,0.00,1.00,91.20,-62.40,0 +96.00,-19.20,5.38,0.00,1.00,96.00,-62.40,0 +-76.80,19.20,10.64,0.00,1.00,100.80,-62.40,0 +105.60,-14.40,5.36,0.00,1.00,105.60,-57.60,0 +-67.20,14.40,10.66,0.00,1.00,110.40,-57.60,0 +115.20,-14.40,5.34,0.00,1.00,120.00,-52.80,0 +-57.60,14.40,10.68,0.00,1.00,124.80,-48.00,0 +124.80,-14.40,5.32,0.00,1.00,129.60,-48.00,0 +-48.00,14.40,10.70,0.00,1.00,134.40,-43.20,0 +134.40,-14.40,5.30,0.00,1.00,139.20,-38.40,0 +-38.40,9.60,10.72,0.00,1.00,144.00,-33.60,0 +144.00,-9.60,5.28,0.00,1.00,148.80,-33.60,0 +-28.80,9.60,10.74,0.00,1.00,153.60,-28.80,0 +153.60,-9.60,5.26,0.00,1.00,158.40,-24.00,0 +-19.20,4.80,10.77,0.00,1.00,158.40,-19.20,0 +163.20,-4.80,5.23,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,10.79,0.00,1.00,168.00,-9.60,0 +172.80,-0.00,5.21,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,10.81,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,5.19,0.00,1.00,-177.60,0.00,0 +4.80,-0.00,10.83,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,5.17,0.00,1.00,-168.00,9.60,0 +14.40,-4.80,10.85,0.00,1.00,-163.20,14.40,0 +-158.40,4.80,5.15,0.00,1.00,-158.40,19.20,0 +24.00,-9.60,10.87,0.00,1.00,-158.40,24.00,0 +-148.80,9.60,5.13,0.00,1.00,-153.60,28.80,0 +33.60,-9.60,10.89,0.00,1.00,-148.80,33.60,0 +-139.20,9.60,5.11,0.00,1.00,-144.00,33.60,0 +43.20,-14.40,10.92,0.00,1.00,-139.20,38.40,0 +-129.60,14.40,5.08,0.00,1.00,-134.40,43.20,0 +52.80,-14.40,10.94,0.00,1.00,-129.60,48.00,0 +-120.00,14.40,5.06,0.00,1.00,-124.80,48.00,0 +62.40,-14.40,10.96,0.00,1.00,-120.00,52.80,0 +-110.40,14.40,5.04,0.00,1.00,-110.40,57.60,0 +72.00,-14.40,10.98,0.00,1.00,-105.60,57.60,0 +-100.80,19.20,5.02,0.00,1.00,-100.80,62.40,0 +81.60,-19.20,11.00,0.00,1.00,-96.00,62.40,0 +-91.20,19.20,5.00,0.00,1.00,-91.20,62.40,0 +96.00,-19.20,11.02,0.00,1.00,-86.40,62.40,0 +-81.60,19.20,4.98,0.00,1.00,-81.60,62.40,0 +105.60,-19.20,11.04,0.00,1.00,-76.80,57.60,0 +-72.00,14.40,4.96,0.00,1.00,-72.00,57.60,0 +115.20,-14.40,11.07,0.00,1.00,-62.40,52.80,0 +-62.40,14.40,4.93,0.00,1.00,-57.60,52.80,0 +124.80,-14.40,11.09,0.00,1.00,-52.80,48.00,0 +-52.80,14.40,4.91,0.00,1.00,-48.00,43.20,0 +134.40,-14.40,11.11,0.00,1.00,-43.20,43.20,0 +-43.20,9.60,4.89,0.00,1.00,-38.40,38.40,0 +144.00,-9.60,11.13,0.00,1.00,-33.60,33.60,0 +-33.60,9.60,4.87,0.00,1.00,-28.80,28.80,0 +153.60,-9.60,11.15,0.00,1.00,-24.00,24.00,0 +-24.00,4.80,4.85,0.00,1.00,-19.20,19.20,0 +163.20,-4.80,11.17,0.00,1.00,-19.20,19.20,0 +-14.40,4.80,4.83,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,11.19,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,4.81,0.00,1.00,-4.80,4.80,0 +0.00,0.00,11.21,0.00,1.00,0.00,0.00,0 +-177.60,0.00,4.79,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,11.24,0.00,1.00,9.60,-9.60,0 +-168.00,4.80,4.76,0.00,1.00,14.40,-14.40,0 +19.20,-4.80,11.26,0.00,1.00,19.20,-19.20,0 +-158.40,9.60,4.74,0.00,1.00,24.00,-24.00,0 +28.80,-9.60,11.28,0.00,1.00,28.80,-24.00,0 +-148.80,14.40,4.72,0.00,1.00,33.60,-28.80,0 +38.40,-14.40,11.30,0.00,1.00,38.40,-33.60,0 +-139.20,14.40,4.70,0.00,1.00,43.20,-38.40,0 +48.00,-14.40,11.32,0.00,1.00,48.00,-43.20,0 +-129.60,19.20,4.68,0.00,1.00,52.80,-48.00,0 +57.60,-19.20,11.34,0.00,1.00,57.60,-52.80,0 +-120.00,19.20,4.66,0.00,1.00,62.40,-52.80,0 +67.20,-19.20,11.36,0.00,1.00,67.20,-57.60,0 +-110.40,19.20,4.64,0.00,1.00,72.00,-62.40,0 +76.80,-19.20,11.39,0.00,1.00,76.80,-62.40,0 +-100.80,24.00,4.61,0.00,1.00,81.60,-67.20,0 +86.40,-24.00,11.41,0.00,1.00,86.40,-67.20,0 +-86.40,24.00,4.59,0.00,1.00,91.20,-67.20,0 +96.00,-24.00,11.43,0.00,1.00,96.00,-67.20,0 +-76.80,24.00,4.57,0.00,1.00,100.80,-67.20,0 +105.60,-19.20,11.45,0.00,1.00,105.60,-62.40,0 +-67.20,19.20,4.55,0.00,1.00,110.40,-57.60,0 +115.20,-19.20,11.47,0.00,1.00,115.20,-57.60,0 +-57.60,19.20,4.53,0.00,1.00,120.00,-52.80,0 +124.80,-19.20,11.49,0.00,1.00,124.80,-48.00,0 +-48.00,19.20,4.51,0.00,1.00,129.60,-43.20,0 +134.40,-14.40,11.51,0.00,1.00,134.40,-43.20,0 +-38.40,14.40,4.49,0.00,1.00,139.20,-38.40,0 +144.00,-14.40,11.54,0.00,1.00,144.00,-33.60,0 +-28.80,9.60,4.46,0.00,1.00,148.80,-28.80,0 +153.60,-9.60,11.56,0.00,1.00,153.60,-24.00,0 +-19.20,9.60,4.44,0.00,1.00,158.40,-19.20,0 +163.20,-4.80,11.58,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,4.42,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,11.60,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,4.40,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,11.62,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,4.38,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,11.64,0.00,1.00,-168.00,9.60,0 +14.40,-4.80,4.36,0.00,1.00,-163.20,14.40,0 +-158.40,9.60,11.66,0.00,1.00,-158.40,19.20,0 +24.00,-9.60,4.34,0.00,1.00,-153.60,24.00,0 +-148.80,9.60,11.68,0.00,1.00,-148.80,28.80,0 +33.60,-14.40,4.32,0.00,1.00,-144.00,33.60,0 +-139.20,14.40,11.71,0.00,1.00,-139.20,38.40,0 +43.20,-14.40,4.29,0.00,1.00,-134.40,43.20,0 +-129.60,19.20,11.73,0.00,1.00,-129.60,43.20,0 +52.80,-19.20,4.27,0.00,1.00,-124.80,48.00,0 +-120.00,19.20,11.75,0.00,1.00,-120.00,52.80,0 +62.40,-19.20,4.25,0.00,1.00,-115.20,57.60,0 +-110.40,19.20,11.77,0.00,1.00,-110.40,57.60,0 +72.00,-19.20,4.23,0.00,1.00,-105.60,62.40,0 +-100.80,24.00,11.79,0.00,1.00,-100.80,67.20,0 +81.60,-24.00,4.21,0.00,1.00,-96.00,67.20,0 +-91.20,24.00,11.81,0.00,1.00,-91.20,67.20,0 +96.00,-24.00,4.19,0.00,1.00,-86.40,67.20,0 +-81.60,24.00,11.83,0.00,1.00,-81.60,67.20,0 +105.60,-19.20,4.17,0.00,1.00,-76.80,62.40,0 +-72.00,19.20,11.86,0.00,1.00,-72.00,62.40,0 +115.20,-19.20,4.14,0.00,1.00,-67.20,57.60,0 +-62.40,19.20,11.88,0.00,1.00,-62.40,52.80,0 +124.80,-19.20,4.12,0.00,1.00,-57.60,52.80,0 +-52.80,19.20,11.90,0.00,1.00,-52.80,48.00,0 +134.40,-14.40,4.10,0.00,1.00,-48.00,43.20,0 +-43.20,14.40,11.92,0.00,1.00,-43.20,38.40,0 +144.00,-14.40,4.08,0.00,1.00,-38.40,33.60,0 +-33.60,14.40,11.94,0.00,1.00,-33.60,28.80,0 +153.60,-9.60,4.06,0.00,1.00,-28.80,24.00,0 +-24.00,9.60,11.96,0.00,1.00,-24.00,24.00,0 +163.20,-4.80,4.04,0.00,1.00,-19.20,19.20,0 +-14.40,4.80,11.98,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,4.02,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,12.01,0.00,1.00,-4.80,4.80,0 +0.00,0.00,3.99,0.00,1.00,0.00,0.00,0 +-177.60,0.00,12.03,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,3.97,0.00,1.00,9.60,-9.60,0 +-168.00,4.80,12.05,0.00,1.00,14.40,-14.40,0 +19.20,-9.60,3.95,0.00,1.00,19.20,-19.20,0 +-158.40,9.60,12.07,0.00,1.00,24.00,-24.00,0 +24.00,-14.40,3.93,0.00,1.00,28.80,-28.80,0 +-148.80,14.40,12.09,0.00,1.00,33.60,-33.60,0 +33.60,-14.40,3.91,0.00,1.00,38.40,-38.40,0 +-139.20,19.20,12.11,0.00,1.00,43.20,-38.40,0 +43.20,-19.20,3.89,0.00,1.00,48.00,-43.20,0 +-129.60,19.20,12.13,0.00,1.00,52.80,-48.00,0 +52.80,-24.00,3.87,0.00,1.00,57.60,-52.80,0 +-120.00,24.00,12.15,0.00,1.00,62.40,-57.60,0 +62.40,-24.00,3.85,0.00,1.00,67.20,-62.40,0 +-110.40,24.00,12.18,0.00,1.00,72.00,-62.40,0 +76.80,-24.00,3.82,0.00,1.00,76.80,-67.20,0 +-100.80,28.80,12.20,0.00,1.00,81.60,-72.00,0 +86.40,-28.80,3.80,0.00,1.00,86.40,-72.00,0 +-86.40,28.80,12.22,0.00,1.00,91.20,-72.00,0 +96.00,-28.80,3.78,0.00,1.00,96.00,-72.00,0 +-76.80,28.80,12.24,0.00,1.00,100.80,-67.20,0 +105.60,-24.00,3.76,0.00,1.00,105.60,-67.20,0 +-67.20,24.00,12.26,0.00,1.00,110.40,-62.40,0 +120.00,-24.00,3.74,0.00,1.00,115.20,-57.60,0 +-57.60,24.00,12.28,0.00,1.00,120.00,-57.60,0 +129.60,-24.00,3.72,0.00,1.00,124.80,-52.80,0 +-48.00,19.20,12.30,0.00,1.00,129.60,-48.00,0 +139.20,-19.20,3.70,0.00,1.00,134.40,-43.20,0 +-38.40,19.20,12.33,0.00,1.00,139.20,-38.40,0 +148.80,-14.40,3.67,0.00,1.00,144.00,-33.60,0 +-28.80,14.40,12.35,0.00,1.00,148.80,-28.80,0 +158.40,-9.60,3.65,0.00,1.00,153.60,-24.00,0 +-19.20,9.60,12.37,0.00,1.00,158.40,-19.20,0 +163.20,-9.60,3.63,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,12.39,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,3.61,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,12.41,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,3.59,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,12.43,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,3.57,0.00,1.00,-168.00,9.60,0 +14.40,-9.60,12.45,0.00,1.00,-163.20,14.40,0 +-158.40,9.60,3.55,0.00,1.00,-158.40,19.20,0 +24.00,-9.60,12.48,0.00,1.00,-153.60,24.00,0 +-153.60,14.40,3.52,0.00,1.00,-148.80,28.80,0 +33.60,-14.40,12.50,0.00,1.00,-144.00,33.60,0 +-144.00,19.20,3.50,0.00,1.00,-139.20,38.40,0 +43.20,-19.20,12.52,0.00,1.00,-134.40,43.20,0 +-134.40,19.20,3.48,0.00,1.00,-129.60,48.00,0 +52.80,-24.00,12.54,0.00,1.00,-124.80,52.80,0 +-124.80,24.00,3.46,0.00,1.00,-120.00,57.60,0 +62.40,-24.00,12.56,0.00,1.00,-115.20,57.60,0 +-110.40,24.00,3.44,0.00,1.00,-110.40,62.40,0 +72.00,-24.00,12.58,0.00,1.00,-105.60,67.20,0 +-100.80,28.80,3.42,0.00,1.00,-100.80,67.20,0 +81.60,-28.80,12.60,0.00,1.00,-96.00,72.00,0 +-91.20,28.80,3.40,0.00,1.00,-91.20,72.00,0 +96.00,-28.80,12.62,0.00,1.00,-86.40,72.00,0 +-81.60,28.80,3.38,0.00,1.00,-81.60,72.00,0 +105.60,-24.00,12.65,0.00,1.00,-76.80,67.20,0 +-72.00,24.00,3.35,0.00,1.00,-72.00,62.40,0 +115.20,-24.00,12.67,0.00,1.00,-67.20,62.40,0 +-57.60,24.00,3.33,0.00,1.00,-62.40,57.60,0 +124.80,-24.00,12.69,0.00,1.00,-57.60,52.80,0 +-48.00,19.20,3.31,0.00,1.00,-52.80,48.00,0 +134.40,-19.20,12.71,0.00,1.00,-48.00,43.20,0 +-38.40,19.20,3.29,0.00,1.00,-43.20,38.40,0 +144.00,-14.40,12.73,0.00,1.00,-38.40,38.40,0 +-28.80,14.40,3.27,0.00,1.00,-33.60,33.60,0 +153.60,-14.40,12.75,0.00,1.00,-28.80,28.80,0 +-24.00,9.60,3.25,0.00,1.00,-24.00,24.00,0 +163.20,-9.60,12.77,0.00,1.00,-19.20,19.20,0 +-14.40,4.80,3.23,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,12.80,0.00,1.00,-9.60,9.60,0 +-4.80,0.00,3.20,0.00,1.00,-4.80,4.80,0 +0.00,0.00,12.82,0.00,1.00,0.00,0.00,0 +-177.60,4.80,3.18,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,12.84,0.00,1.00,9.60,-9.60,0 +-168.00,9.60,3.16,0.00,1.00,14.40,-14.40,0 +14.40,-9.60,12.86,0.00,1.00,19.20,-19.20,0 +-158.40,14.40,3.14,0.00,1.00,24.00,-24.00,0 +24.00,-14.40,12.88,0.00,1.00,28.80,-28.80,0 +-148.80,19.20,3.12,0.00,1.00,33.60,-33.60,0 +33.60,-19.20,12.90,0.00,1.00,38.40,-38.40,0 +-139.20,19.20,3.10,0.00,1.00,43.20,-43.20,0 +43.20,-24.00,12.92,0.00,1.00,48.00,-48.00,0 +-129.60,24.00,3.08,0.00,1.00,52.80,-52.80,0 +52.80,-28.80,12.95,0.00,1.00,57.60,-57.60,0 +-120.00,28.80,3.05,0.00,1.00,62.40,-57.60,0 +62.40,-28.80,12.97,0.00,1.00,67.20,-62.40,0 +-110.40,28.80,3.03,0.00,1.00,72.00,-67.20,0 +76.80,-28.80,12.99,0.00,1.00,76.80,-72.00,0 +-100.80,33.60,3.01,0.00,1.00,81.60,-72.00,0 +86.40,-33.60,13.01,0.00,1.00,86.40,-76.80,0 +-86.40,33.60,2.99,0.00,1.00,91.20,-76.80,0 +96.00,-33.60,13.03,0.00,1.00,96.00,-76.80,0 +-76.80,28.80,2.97,0.00,1.00,100.80,-72.00,0 +110.40,-28.80,13.05,0.00,1.00,105.60,-72.00,0 +-67.20,28.80,2.95,0.00,1.00,110.40,-67.20,0 +120.00,-28.80,13.07,0.00,1.00,115.20,-62.40,0 +-57.60,28.80,2.93,0.00,1.00,120.00,-57.60,0 +129.60,-24.00,13.09,0.00,1.00,124.80,-52.80,0 +-48.00,24.00,2.91,0.00,1.00,129.60,-48.00,0 +139.20,-24.00,13.12,0.00,1.00,134.40,-43.20,0 +-38.40,19.20,2.88,0.00,1.00,139.20,-38.40,0 +148.80,-19.20,13.14,0.00,1.00,144.00,-33.60,0 +-28.80,14.40,2.86,0.00,1.00,148.80,-28.80,0 +158.40,-14.40,13.16,0.00,1.00,153.60,-24.00,0 +-19.20,9.60,2.84,0.00,1.00,158.40,-19.20,0 +168.00,-9.60,13.18,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,2.82,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,13.20,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,2.80,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,13.22,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,2.78,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,13.24,0.00,1.00,-168.00,9.60,0 +14.40,-9.60,2.76,0.00,1.00,-163.20,14.40,0 +-163.20,9.60,13.27,0.00,1.00,-158.40,19.20,0 +24.00,-14.40,2.73,0.00,1.00,-153.60,24.00,0 +-153.60,14.40,13.29,0.00,1.00,-148.80,28.80,0 +33.60,-19.20,2.71,0.00,1.00,-144.00,33.60,0 +-144.00,19.20,13.31,0.00,1.00,-139.20,38.40,0 +43.20,-24.00,2.69,0.00,1.00,-134.40,43.20,0 +-134.40,24.00,13.33,0.00,1.00,-129.60,48.00,0 +52.80,-24.00,2.67,0.00,1.00,-124.80,52.80,0 +-124.80,28.80,13.35,0.00,1.00,-120.00,57.60,0 +62.40,-28.80,2.65,0.00,1.00,-115.20,62.40,0 +-115.20,28.80,13.37,0.00,1.00,-110.40,67.20,0 +72.00,-28.80,2.63,0.00,1.00,-105.60,72.00,0 +-100.80,28.80,13.39,0.00,1.00,-100.80,72.00,0 +81.60,-33.60,2.61,0.00,1.00,-96.00,76.80,0 +-91.20,33.60,13.42,0.00,1.00,-91.20,76.80,0 +96.00,-33.60,2.58,0.00,1.00,-86.40,76.80,0 +-81.60,33.60,13.44,0.00,1.00,-81.60,72.00,0 +105.60,-28.80,2.56,0.00,1.00,-76.80,72.00,0 +-67.20,28.80,13.46,0.00,1.00,-72.00,67.20,0 +115.20,-28.80,2.54,0.00,1.00,-67.20,62.40,0 +-57.60,28.80,13.48,0.00,1.00,-62.40,57.60,0 +124.80,-28.80,2.52,0.00,1.00,-57.60,57.60,0 +-48.00,24.00,13.50,0.00,1.00,-52.80,52.80,0 +134.40,-24.00,2.50,0.00,1.00,-48.00,48.00,0 +-38.40,19.20,13.52,0.00,1.00,-43.20,43.20,0 +144.00,-19.20,2.48,0.00,1.00,-38.40,38.40,0 +-28.80,19.20,13.54,0.00,1.00,-33.60,33.60,0 +153.60,-14.40,2.46,0.00,1.00,-28.80,28.80,0 +-19.20,14.40,13.56,0.00,1.00,-24.00,24.00,0 +163.20,-9.60,2.44,0.00,1.00,-19.20,19.20,0 +-14.40,9.60,13.59,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,2.41,0.00,1.00,-9.60,9.60,0 +-4.80,4.80,13.61,0.00,1.00,-4.80,4.80,0 +0.00,0.00,2.39,0.00,1.00,0.00,0.00,0 +-177.60,4.80,13.63,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,2.37,0.00,1.00,9.60,-9.60,0 +-168.00,9.60,13.65,0.00,1.00,14.40,-14.40,0 +14.40,-9.60,2.35,0.00,1.00,19.20,-19.20,0 +-158.40,14.40,13.67,0.00,1.00,24.00,-24.00,0 +24.00,-14.40,2.33,0.00,1.00,28.80,-28.80,0 +-153.60,19.20,13.69,0.00,1.00,33.60,-33.60,0 +33.60,-24.00,2.31,0.00,1.00,38.40,-38.40,0 +-144.00,24.00,13.71,0.00,1.00,43.20,-43.20,0 +43.20,-24.00,2.29,0.00,1.00,48.00,-48.00,0 +-134.40,28.80,13.74,0.00,1.00,52.80,-52.80,0 +52.80,-28.80,2.26,0.00,1.00,57.60,-57.60,0 +-124.80,33.60,13.76,0.00,1.00,62.40,-62.40,0 +62.40,-33.60,2.24,0.00,1.00,67.20,-67.20,0 +-110.40,33.60,13.78,0.00,1.00,72.00,-72.00,0 +72.00,-33.60,2.22,0.00,1.00,76.80,-72.00,0 +-100.80,38.40,13.80,0.00,1.00,81.60,-76.80,0 +86.40,-38.40,2.20,0.00,1.00,86.40,-81.60,0 +-86.40,38.40,13.82,0.00,1.00,91.20,-81.60,0 +96.00,-38.40,2.18,0.00,1.00,96.00,-81.60,0 +-76.80,33.60,13.84,0.00,1.00,100.80,-76.80,0 +110.40,-33.60,2.16,0.00,1.00,105.60,-72.00,0 +-67.20,33.60,13.86,0.00,1.00,110.40,-67.20,0 +120.00,-33.60,2.14,0.00,1.00,115.20,-62.40,0 +-52.80,28.80,13.89,0.00,1.00,120.00,-57.60,0 +129.60,-28.80,2.11,0.00,1.00,124.80,-52.80,0 +-43.20,28.80,13.91,0.00,1.00,129.60,-48.00,0 +139.20,-24.00,2.09,0.00,1.00,134.40,-43.20,0 +-33.60,24.00,13.93,0.00,1.00,139.20,-38.40,0 +148.80,-19.20,2.07,0.00,1.00,144.00,-33.60,0 +-24.00,19.20,13.95,0.00,1.00,148.80,-28.80,0 +158.40,-14.40,2.05,0.00,1.00,153.60,-24.00,0 +-19.20,14.40,13.97,0.00,1.00,158.40,-19.20,0 +168.00,-9.60,2.03,0.00,1.00,163.20,-14.40,0 +-9.60,4.80,13.99,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,2.01,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,14.01,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,1.99,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,14.03,0.00,1.00,-172.80,4.80,0 +-168.00,4.80,1.97,0.00,1.00,-168.00,9.60,0 +14.40,-9.60,14.06,0.00,1.00,-163.20,14.40,0 +-163.20,14.40,1.94,0.00,1.00,-158.40,19.20,0 +24.00,-14.40,14.08,0.00,1.00,-153.60,24.00,0 +-153.60,19.20,1.92,0.00,1.00,-148.80,28.80,0 +28.80,-19.20,14.10,0.00,1.00,-144.00,33.60,0 +-144.00,24.00,1.90,0.00,1.00,-139.20,38.40,0 +38.40,-24.00,14.12,0.00,1.00,-134.40,43.20,0 +-134.40,28.80,1.88,0.00,1.00,-129.60,48.00,0 +48.00,-28.80,14.14,0.00,1.00,-124.80,52.80,0 +-124.80,28.80,1.86,0.00,1.00,-120.00,57.60,0 +57.60,-33.60,14.16,0.00,1.00,-115.20,62.40,0 +-115.20,33.60,1.84,0.00,1.00,-110.40,67.20,0 +72.00,-33.60,14.18,0.00,1.00,-105.60,72.00,0 +-105.60,33.60,1.82,0.00,1.00,-100.80,76.80,0 +81.60,-38.40,14.21,0.00,1.00,-96.00,81.60,0 +-91.20,38.40,1.79,0.00,1.00,-91.20,81.60,0 +96.00,-38.40,14.23,0.00,1.00,-86.40,81.60,0 +-81.60,38.40,1.77,0.00,1.00,-81.60,76.80,0 +105.60,-33.60,14.25,0.00,1.00,-76.80,72.00,0 +-67.20,33.60,1.75,0.00,1.00,-72.00,72.00,0 +120.00,-33.60,14.27,0.00,1.00,-67.20,67.20,0 +-57.60,33.60,1.73,0.00,1.00,-62.40,62.40,0 +129.60,-28.80,14.29,0.00,1.00,-57.60,57.60,0 +-48.00,28.80,1.71,0.00,1.00,-52.80,52.80,0 +139.20,-24.00,14.31,0.00,1.00,-48.00,48.00,0 +-38.40,24.00,1.69,0.00,1.00,-43.20,43.20,0 +148.80,-24.00,14.33,0.00,1.00,-38.40,38.40,0 +-28.80,19.20,1.67,0.00,1.00,-33.60,33.60,0 +158.40,-14.40,14.36,0.00,1.00,-28.80,28.80,0 +-19.20,14.40,1.64,0.00,1.00,-24.00,24.00,0 +163.20,-9.60,14.38,0.00,1.00,-19.20,19.20,0 +-9.60,9.60,1.62,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,14.40,0.00,1.00,-9.60,9.60,0 +-4.80,4.80,1.60,0.00,1.00,-4.80,4.80,0 +0.00,0.00,14.42,0.00,1.00,0.00,0.00,0 +-177.60,4.80,1.58,0.00,1.00,4.80,-4.80,0 +9.60,-4.80,14.44,0.00,1.00,9.60,-9.60,0 +-168.00,9.60,1.56,0.00,1.00,14.40,-14.40,0 +14.40,-14.40,14.46,0.00,1.00,19.20,-19.20,0 +-163.20,14.40,1.54,0.00,1.00,24.00,-24.00,0 +24.00,-19.20,14.48,0.00,1.00,28.80,-28.80,0 +-153.60,19.20,1.52,0.00,1.00,33.60,-33.60,0 +28.80,-24.00,14.50,0.00,1.00,38.40,-38.40,0 +-144.00,28.80,1.50,0.00,1.00,43.20,-43.20,0 +38.40,-28.80,14.53,0.00,1.00,48.00,-48.00,0 +-134.40,33.60,1.47,0.00,1.00,52.80,-52.80,0 +48.00,-33.60,14.55,0.00,1.00,57.60,-57.60,0 +-124.80,33.60,1.45,0.00,1.00,62.40,-62.40,0 +62.40,-38.40,14.57,0.00,1.00,67.20,-67.20,0 +-115.20,38.40,1.43,0.00,1.00,72.00,-72.00,0 +72.00,-38.40,14.59,0.00,1.00,76.80,-76.80,0 +-100.80,43.20,1.41,0.00,1.00,81.60,-81.60,0 +86.40,-43.20,14.61,0.00,1.00,86.40,-86.40,0 +-86.40,43.20,1.39,0.00,1.00,91.20,-86.40,0 +96.00,-43.20,14.63,0.00,1.00,96.00,-81.60,0 +-76.80,38.40,1.37,0.00,1.00,100.80,-76.80,0 +110.40,-38.40,14.65,0.00,1.00,105.60,-72.00,0 +-62.40,38.40,1.35,0.00,1.00,110.40,-67.20,0 +120.00,-38.40,14.68,0.00,1.00,115.20,-62.40,0 +-52.80,33.60,1.32,0.00,1.00,120.00,-57.60,0 +134.40,-33.60,14.70,0.00,1.00,124.80,-52.80,0 +-43.20,28.80,1.30,0.00,1.00,129.60,-48.00,0 +144.00,-28.80,14.72,0.00,1.00,134.40,-43.20,0 +-33.60,24.00,1.28,0.00,1.00,139.20,-38.40,0 +153.60,-24.00,14.74,0.00,1.00,144.00,-33.60,0 +-24.00,19.20,1.26,0.00,1.00,148.80,-28.80,0 +158.40,-19.20,14.76,0.00,1.00,153.60,-24.00,0 +-14.40,14.40,1.24,0.00,1.00,158.40,-19.20,0 +168.00,-9.60,14.78,0.00,1.00,163.20,-14.40,0 +-9.60,9.60,1.22,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,14.80,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,1.20,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,14.83,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,1.17,0.00,1.00,-172.80,4.80,0 +-172.80,9.60,14.85,0.00,1.00,-168.00,9.60,0 +14.40,-9.60,1.15,0.00,1.00,-163.20,14.40,0 +-163.20,14.40,14.87,0.00,1.00,-158.40,19.20,0 +19.20,-19.20,1.13,0.00,1.00,-153.60,24.00,0 +-153.60,19.20,14.89,0.00,1.00,-148.80,28.80,0 +28.80,-24.00,1.11,0.00,1.00,-144.00,33.60,0 +-148.80,24.00,14.91,0.00,1.00,-139.20,38.40,0 +38.40,-28.80,1.09,0.00,1.00,-134.40,43.20,0 +-139.20,28.80,14.93,0.00,1.00,-129.60,48.00,0 +48.00,-33.60,1.07,0.00,1.00,-124.80,52.80,0 +-129.60,33.60,14.95,0.00,1.00,-120.00,57.60,0 +57.60,-38.40,1.05,0.00,1.00,-115.20,62.40,0 +-115.20,38.40,14.97,0.00,1.00,-110.40,67.20,0 +67.20,-38.40,1.03,0.00,1.00,-105.60,72.00,0 +-105.60,38.40,15.00,0.00,1.00,-100.80,76.80,0 +81.60,-43.20,1.00,0.00,1.00,-96.00,81.60,0 +-91.20,43.20,15.02,0.00,1.00,-91.20,86.40,0 +96.00,-43.20,0.98,0.00,1.00,-86.40,86.40,0 +-76.80,43.20,15.04,0.00,1.00,-81.60,81.60,0 +105.60,-38.40,0.96,0.00,1.00,-76.80,76.80,0 +-67.20,38.40,15.06,0.00,1.00,-72.00,72.00,0 +120.00,-38.40,0.94,0.00,1.00,-67.20,67.20,0 +-52.80,33.60,15.08,0.00,1.00,-62.40,62.40,0 +129.60,-33.60,0.92,0.00,1.00,-57.60,57.60,0 +-43.20,33.60,15.10,0.00,1.00,-52.80,52.80,0 +139.20,-28.80,0.90,0.00,1.00,-48.00,48.00,0 +-33.60,28.80,15.12,0.00,1.00,-43.20,43.20,0 +148.80,-24.00,0.88,0.00,1.00,-38.40,38.40,0 +-28.80,19.20,15.15,0.00,1.00,-33.60,33.60,0 +158.40,-19.20,0.85,0.00,1.00,-28.80,28.80,0 +-19.20,14.40,15.17,0.00,1.00,-24.00,24.00,0 +163.20,-14.40,0.83,0.00,1.00,-19.20,19.20,0 +-9.60,9.60,15.19,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,0.81,0.00,1.00,-9.60,9.60,0 +-4.80,4.80,15.21,0.00,1.00,-4.80,4.80,0 +0.00,0.00,0.79,0.00,1.00,0.00,0.00,0 +-177.60,4.80,15.23,0.00,1.00,4.80,-4.80,0 +4.80,-4.80,0.77,0.00,1.00,9.60,-9.60,0 +-168.00,9.60,15.25,0.00,1.00,14.40,-14.40,0 +14.40,-14.40,0.75,0.00,1.00,19.20,-19.20,0 +-163.20,19.20,15.27,0.00,1.00,24.00,-24.00,0 +19.20,-19.20,0.73,0.00,1.00,28.80,-28.80,0 +-153.60,24.00,15.30,0.00,1.00,33.60,-33.60,0 +28.80,-28.80,0.70,0.00,1.00,38.40,-38.40,0 +-148.80,28.80,15.32,0.00,1.00,43.20,-43.20,0 +38.40,-33.60,0.68,0.00,1.00,48.00,-48.00,0 +-139.20,33.60,15.34,0.00,1.00,52.80,-52.80,0 +48.00,-38.40,0.66,0.00,1.00,57.60,-57.60,0 +-124.80,38.40,15.36,0.00,1.00,62.40,-62.40,0 +57.60,-43.20,0.64,0.00,1.00,67.20,-67.20,0 +-115.20,43.20,15.38,0.00,1.00,72.00,-72.00,0 +72.00,-43.20,0.62,0.00,1.00,76.80,-76.80,0 +-100.80,43.20,15.40,0.00,1.00,81.60,-81.60,0 +86.40,-48.00,0.60,0.00,1.00,86.40,-86.40,0 +-86.40,48.00,15.42,0.00,1.00,91.20,-86.40,0 +100.80,-48.00,0.58,0.00,1.00,96.00,-81.60,0 +-76.80,43.20,15.44,0.00,1.00,100.80,-76.80,0 +110.40,-43.20,0.56,0.00,1.00,105.60,-72.00,0 +-62.40,43.20,15.47,0.00,1.00,110.40,-67.20,0 +124.80,-38.40,0.53,0.00,1.00,115.20,-62.40,0 +-48.00,38.40,15.49,0.00,1.00,120.00,-57.60,0 +134.40,-38.40,0.51,0.00,1.00,124.80,-52.80,0 +-38.40,33.60,15.51,0.00,1.00,129.60,-48.00,0 +144.00,-28.80,0.49,0.00,1.00,134.40,-43.20,0 +-28.80,28.80,15.53,0.00,1.00,139.20,-38.40,0 +153.60,-24.00,0.47,0.00,1.00,144.00,-33.60,0 +-24.00,24.00,15.55,0.00,1.00,148.80,-28.80,0 +163.20,-19.20,0.45,0.00,1.00,153.60,-24.00,0 +-14.40,14.40,15.57,0.00,1.00,158.40,-19.20,0 +168.00,-14.40,0.43,0.00,1.00,163.20,-14.40,0 +-9.60,9.60,15.59,0.00,1.00,168.00,-9.60,0 +172.80,-4.80,0.41,0.00,1.00,172.80,-4.80,0 +-0.00,0.00,15.62,0.00,1.00,177.60,-0.00,0 +-177.60,0.00,0.38,0.00,1.00,-177.60,0.00,0 +4.80,-4.80,15.64,0.00,1.00,-172.80,4.80,0 +-172.80,9.60,0.36,0.00,1.00,-168.00,9.60,0 +9.60,-14.40,15.66,0.00,1.00,-163.20,14.40,0 +-163.20,14.40,0.34,0.00,1.00,-158.40,19.20,0 +19.20,-19.20,15.68,0.00,1.00,-153.60,24.00,0 +-158.40,24.00,0.32,0.00,1.00,-148.80,28.80,0 +28.80,-24.00,15.70,0.00,1.00,-144.00,33.60,0 +-148.80,28.80,0.30,0.00,1.00,-139.20,38.40,0 +33.60,-28.80,15.72,0.00,1.00,-134.40,43.20,0 +-139.20,33.60,0.28,0.00,1.00,-129.60,48.00,0 +43.20,-38.40,15.74,0.00,1.00,-124.80,52.80,0 +-129.60,38.40,0.26,0.00,1.00,-120.00,57.60,0 +57.60,-38.40,15.77,0.00,1.00,-115.20,62.40,0 +-120.00,43.20,0.23,0.00,1.00,-110.40,67.20,0 +67.20,-43.20,15.79,0.00,1.00,-105.60,72.00,0 +-105.60,43.20,0.21,0.00,1.00,-100.80,76.80,0 +81.60,-48.00,15.81,0.00,1.00,-96.00,81.60,0 +-91.20,48.00,0.19,0.00,1.00,-91.20,86.40,0 +96.00,-48.00,15.83,0.00,1.00,-86.40,86.40,0 +-76.80,43.20,0.17,0.00,1.00,-81.60,81.60,0 +110.40,-43.20,15.85,0.00,1.00,-76.80,76.80,0 +-67.20,43.20,0.15,0.00,1.00,-72.00,72.00,0 +120.00,-43.20,15.87,0.00,1.00,-67.20,67.20,0 +-52.80,38.40,0.13,0.00,1.00,-62.40,62.40,0 +134.40,-38.40,15.89,0.00,1.00,-57.60,57.60,0 +-43.20,33.60,0.11,0.00,1.00,-52.80,52.80,0 +144.00,-33.60,15.91,0.00,1.00,-48.00,48.00,0 +-33.60,28.80,0.09,0.00,1.00,-43.20,43.20,0 +153.60,-28.80,15.94,0.00,1.00,-38.40,38.40,0 +-24.00,24.00,0.06,0.00,1.00,-33.60,33.60,0 +158.40,-19.20,15.96,0.00,1.00,-28.80,28.80,0 +-19.20,19.20,0.04,0.00,1.00,-24.00,24.00,0 +168.00,-14.40,15.98,0.00,1.00,-19.20,19.20,0 +-9.60,9.60,0.02,0.00,1.00,-14.40,14.40,0 +172.80,-4.80,16.00,0.00,1.00,-9.60,9.60,0 +-4.80,4.80,0.00,0.00,1.00,-4.80,4.80,0 diff --git a/scripts/testv/stvISM4.csv b/scripts/testv/stvISM4.csv index 326176319a..8a14c3413d 100644 --- a/scripts/testv/stvISM4.csv +++ b/scripts/testv/stvISM4.csv @@ -1,1500 +1,1500 @@ --0.00,0.00,0.00,0.00,1.00,0.00,4.80 --0.00,4.80,0.06,0.00,1.00,4.80,9.60 --0.00,9.60,0.13,0.00,1.00,9.60,14.40 --0.00,14.40,0.19,0.00,1.00,14.40,19.20 --0.00,19.20,0.26,0.00,1.00,19.20,24.00 --0.00,24.00,0.32,0.00,1.00,24.00,28.80 --0.00,28.80,0.39,0.00,1.00,28.80,33.60 --0.00,33.60,0.45,0.00,1.00,33.60,38.40 --0.00,38.40,0.51,0.00,1.00,38.40,43.20 --0.00,43.20,0.58,0.00,1.00,43.20,48.00 --0.00,48.00,0.64,0.00,1.00,48.00,52.80 --0.00,52.80,0.71,0.00,1.00,52.80,57.60 --0.00,57.60,0.77,0.00,1.00,57.60,62.40 --0.00,62.40,0.84,0.00,1.00,62.40,67.20 --0.00,67.20,0.90,0.00,1.00,67.20,72.00 --0.00,72.00,0.96,0.00,1.00,72.00,76.80 --0.00,76.80,1.03,0.00,1.00,76.80,81.60 --0.00,81.60,1.09,0.00,1.00,81.60,86.40 --0.00,86.40,1.16,0.00,1.00,86.40,86.40 --177.60,89.20,1.22,0.00,1.00,91.20,81.60 --177.60,86.40,1.29,0.00,1.00,96.00,76.80 --177.60,81.60,1.35,0.00,1.00,100.80,72.00 --177.60,76.80,1.41,0.00,1.00,105.60,67.20 --177.60,72.00,1.48,0.00,1.00,110.40,62.40 --177.60,67.20,1.54,0.00,1.00,115.20,57.60 -177.60,62.40,1.61,0.00,1.00,120.00,52.80 -177.60,57.60,1.67,0.00,1.00,124.80,48.00 -177.60,52.80,1.73,0.00,1.00,129.60,43.20 -177.60,48.00,1.80,0.00,1.00,134.40,38.40 -177.60,43.20,1.86,0.00,1.00,139.20,33.60 -177.60,38.40,1.93,0.00,1.00,144.00,28.80 -177.60,33.60,1.99,0.00,1.00,148.80,24.00 -177.60,28.80,2.06,0.00,1.00,153.60,19.20 -177.60,24.00,2.12,0.00,1.00,158.40,14.40 -177.60,19.20,2.18,0.00,1.00,163.20,9.60 -177.60,14.40,2.25,0.00,1.00,168.00,4.80 -177.60,9.60,2.31,0.00,1.00,172.80,0.00 -177.60,4.80,2.38,0.00,1.00,177.60,-0.00 --177.60,-0.00,2.44,0.00,1.00,-177.60,-4.80 --177.60,-4.80,2.51,0.00,1.00,-172.80,-9.60 --177.60,-9.60,2.57,0.00,1.00,-168.00,-14.40 --177.60,-14.40,2.63,0.00,1.00,-163.20,-19.20 --177.60,-19.20,2.70,0.00,1.00,-158.40,-24.00 --177.60,-24.00,2.76,0.00,1.00,-153.60,-28.80 --177.60,-28.80,2.83,0.00,1.00,-148.80,-33.60 --177.60,-33.60,2.89,0.00,1.00,-144.00,-38.40 --177.60,-38.40,2.96,0.00,1.00,-139.20,-43.20 --177.60,-48.00,3.02,0.00,1.00,-134.40,-48.00 --177.60,-48.00,3.08,0.00,1.00,-129.60,-52.80 --177.60,-52.80,3.15,0.00,1.00,-124.80,-57.60 --177.60,-57.60,3.21,0.00,1.00,-120.00,-62.40 -177.60,-62.40,3.28,0.00,1.00,-115.20,-67.20 -177.60,-67.20,3.34,0.00,1.00,-110.40,-72.00 -177.60,-76.80,3.41,0.00,1.00,-105.60,-76.80 -177.60,-76.80,3.47,0.00,1.00,-100.80,-81.60 -177.60,-86.40,3.53,0.00,1.00,-96.00,-86.40 -177.60,-89.20,3.60,0.00,1.00,-91.20,-86.40 -0.00,-86.40,3.66,0.00,1.00,-86.40,-81.60 -0.00,-81.60,3.73,0.00,1.00,-81.60,-76.80 -0.00,-76.80,3.79,0.00,1.00,-76.80,-72.00 -0.00,-72.00,3.86,0.00,1.00,-72.00,-67.20 -0.00,-67.20,3.92,0.00,1.00,-67.20,-62.40 -0.00,-62.40,3.98,0.00,1.00,-62.40,-57.60 -0.00,-57.60,4.05,0.00,1.00,-57.60,-52.80 -0.00,-52.80,4.11,0.00,1.00,-52.80,-48.00 -0.00,-48.00,4.18,0.00,1.00,-48.00,-43.20 -0.00,-43.20,4.24,0.00,1.00,-43.20,-38.40 -0.00,-38.40,4.31,0.00,1.00,-38.40,-33.60 -0.00,-33.60,4.37,0.00,1.00,-33.60,-28.80 -0.00,-28.80,4.43,0.00,1.00,-28.80,-24.00 -0.00,-24.00,4.50,0.00,1.00,-24.00,-19.20 -0.00,-19.20,4.56,0.00,1.00,-19.20,-14.40 -0.00,-14.40,4.63,0.00,1.00,-14.40,-9.60 -0.00,-9.60,4.69,0.00,1.00,-9.60,-4.80 -0.00,-4.80,4.76,0.00,1.00,-4.80,0.00 -0.00,0.00,4.82,0.00,1.00,0.00,4.80 -0.00,4.80,4.88,0.00,1.00,4.80,9.60 -0.00,9.60,4.95,0.00,1.00,9.60,14.40 -0.00,14.40,5.01,0.00,1.00,14.40,19.20 -0.00,19.20,5.08,0.00,1.00,19.20,24.00 -0.00,24.00,5.14,0.00,1.00,24.00,28.80 -4.80,28.80,5.20,0.00,1.00,28.80,33.60 -4.80,33.60,5.27,0.00,1.00,33.60,38.40 -4.80,38.40,5.33,0.00,1.00,38.40,43.20 -4.80,43.20,5.40,0.00,1.00,43.20,48.00 -4.80,48.00,5.46,0.00,1.00,48.00,52.80 -4.80,52.80,5.53,0.00,1.00,52.80,57.60 -9.60,57.60,5.59,0.00,1.00,57.60,62.40 -9.60,62.40,5.65,0.00,1.00,62.40,67.20 -9.60,67.20,5.72,0.00,1.00,67.20,72.00 -14.40,72.00,5.78,0.00,1.00,72.00,76.80 -19.20,76.80,5.85,0.00,1.00,76.80,81.60 -28.80,81.60,5.91,0.00,1.00,81.60,86.40 -52.80,86.40,5.98,0.00,1.00,86.40,86.40 -105.60,86.40,6.04,0.00,1.00,91.20,81.60 -139.20,81.60,6.10,0.00,1.00,96.00,76.80 -158.40,76.80,6.17,0.00,1.00,100.80,72.00 -163.20,72.00,6.23,0.00,1.00,105.60,67.20 -168.00,67.20,6.30,0.00,1.00,110.40,62.40 -168.00,62.40,6.36,0.00,1.00,115.20,57.60 -172.80,57.60,6.43,0.00,1.00,120.00,52.80 -172.80,52.80,6.49,0.00,1.00,124.80,48.00 -172.80,48.00,6.55,0.00,1.00,129.60,43.20 -172.80,43.20,6.62,0.00,1.00,134.40,38.40 -177.60,38.40,6.68,0.00,1.00,139.20,33.60 -177.60,33.60,6.75,0.00,1.00,144.00,28.80 -177.60,28.80,6.81,0.00,1.00,148.80,24.00 -177.60,24.00,6.88,0.00,1.00,153.60,19.20 -177.60,19.20,6.94,0.00,1.00,158.40,14.40 -177.60,14.40,7.00,0.00,1.00,163.20,9.60 -177.60,9.60,7.07,0.00,1.00,168.00,4.80 -177.60,4.80,7.13,0.00,1.00,172.80,0.00 -177.60,0.00,7.20,0.00,1.00,177.60,-0.00 --177.60,-0.00,7.26,0.00,1.00,-177.60,-4.80 --177.60,-4.80,7.33,0.00,1.00,-172.80,-9.60 --177.60,-9.60,7.39,0.00,1.00,-168.00,-14.40 --177.60,-14.40,7.45,0.00,1.00,-163.20,-19.20 --177.60,-19.20,7.52,0.00,1.00,-158.40,-24.00 --177.60,-24.00,7.58,0.00,1.00,-153.60,-28.80 --177.60,-28.80,7.65,0.00,1.00,-148.80,-33.60 --177.60,-33.60,7.71,0.00,1.00,-144.00,-38.40 --177.60,-38.40,7.78,0.00,1.00,-139.20,-43.20 --172.80,-43.20,7.84,0.00,1.00,-134.40,-48.00 --172.80,-48.00,7.90,0.00,1.00,-129.60,-52.80 --172.80,-52.80,7.97,0.00,1.00,-124.80,-57.60 --172.80,-57.60,8.03,0.00,1.00,-120.00,-62.40 --168.00,-62.40,8.10,0.00,1.00,-115.20,-67.20 --168.00,-67.20,8.16,0.00,1.00,-110.40,-72.00 --163.20,-72.00,8.22,0.00,1.00,-105.60,-76.80 --158.40,-76.80,8.29,0.00,1.00,-100.80,-81.60 --139.20,-81.60,8.35,0.00,1.00,-96.00,-86.40 --105.60,-86.40,8.42,0.00,1.00,-91.20,-86.40 --52.80,-86.40,8.48,0.00,1.00,-86.40,-81.60 --28.80,-81.60,8.55,0.00,1.00,-81.60,-76.80 --19.20,-76.80,8.61,0.00,1.00,-76.80,-72.00 --14.40,-72.00,8.67,0.00,1.00,-72.00,-67.20 --9.60,-67.20,8.74,0.00,1.00,-67.20,-62.40 --9.60,-62.40,8.80,0.00,1.00,-62.40,-57.60 --9.60,-57.60,8.87,0.00,1.00,-57.60,-52.80 --4.80,-52.80,8.93,0.00,1.00,-52.80,-48.00 --4.80,-48.00,9.00,0.00,1.00,-48.00,-43.20 --4.80,-43.20,9.06,0.00,1.00,-43.20,-38.40 --4.80,-38.40,9.12,0.00,1.00,-38.40,-33.60 --4.80,-33.60,9.19,0.00,1.00,-33.60,-28.80 --4.80,-28.80,9.25,0.00,1.00,-28.80,-24.00 --0.00,-24.00,9.32,0.00,1.00,-24.00,-19.20 --0.00,-19.20,9.38,0.00,1.00,-19.20,-14.40 --0.00,-14.40,9.45,0.00,1.00,-14.40,-9.60 --0.00,-9.60,9.51,0.00,1.00,-9.60,-4.80 --0.00,-4.80,9.57,0.00,1.00,-4.80,0.00 -0.00,0.00,9.64,0.00,1.00,0.00,4.80 -0.00,4.80,9.70,0.00,1.00,4.80,9.60 -0.00,9.60,9.77,0.00,1.00,9.60,14.40 -4.80,14.40,9.83,0.00,1.00,14.40,19.20 -4.80,19.20,9.90,0.00,1.00,19.20,24.00 -4.80,24.00,9.96,0.00,1.00,24.00,28.80 -4.80,28.80,10.02,0.00,1.00,28.80,33.60 -4.80,33.60,10.09,0.00,1.00,33.60,38.40 -9.60,38.40,10.15,0.00,1.00,38.40,43.20 -9.60,43.20,10.22,0.00,1.00,43.20,48.00 -9.60,48.00,10.28,0.00,1.00,48.00,52.80 -14.40,52.80,10.35,0.00,1.00,52.80,57.60 -14.40,57.60,10.41,0.00,1.00,57.60,62.40 -19.20,62.40,10.47,0.00,1.00,62.40,67.20 -24.00,67.20,10.54,0.00,1.00,67.20,72.00 -28.80,72.00,10.60,0.00,1.00,72.00,72.00 -33.60,72.00,10.67,0.00,1.00,76.80,76.80 -48.00,76.80,10.73,0.00,1.00,81.60,81.60 -67.20,81.60,10.80,0.00,1.00,86.40,81.60 -96.00,81.60,10.86,0.00,1.00,91.20,81.60 -120.00,76.80,10.92,0.00,1.00,96.00,76.80 -139.20,76.80,10.99,0.00,1.00,100.80,72.00 -148.80,72.00,11.05,0.00,1.00,105.60,67.20 -153.60,67.20,11.12,0.00,1.00,110.40,62.40 -158.40,62.40,11.18,0.00,1.00,115.20,57.60 -163.20,57.60,11.24,0.00,1.00,120.00,52.80 -168.00,52.80,11.31,0.00,1.00,124.80,48.00 -168.00,48.00,11.37,0.00,1.00,129.60,43.20 -168.00,43.20,11.44,0.00,1.00,134.40,38.40 -172.80,38.40,11.50,0.00,1.00,139.20,33.60 -172.80,33.60,11.57,0.00,1.00,144.00,28.80 -172.80,28.80,11.63,0.00,1.00,148.80,24.00 -177.60,24.00,11.69,0.00,1.00,153.60,19.20 -177.60,19.20,11.76,0.00,1.00,158.40,14.40 -177.60,14.40,11.82,0.00,1.00,163.20,9.60 -177.60,9.60,11.89,0.00,1.00,168.00,4.80 -177.60,4.80,11.95,0.00,1.00,172.80,0.00 -177.60,0.00,12.02,0.00,1.00,177.60,-0.00 --177.60,-0.00,12.08,0.00,1.00,-177.60,-4.80 --177.60,-4.80,12.14,0.00,1.00,-172.80,-9.60 --177.60,-9.60,12.21,0.00,1.00,-168.00,-14.40 --177.60,-14.40,12.27,0.00,1.00,-163.20,-19.20 --177.60,-19.20,12.34,0.00,1.00,-158.40,-24.00 --177.60,-24.00,12.40,0.00,1.00,-153.60,-28.80 --172.80,-28.80,12.47,0.00,1.00,-148.80,-33.60 --172.80,-33.60,12.53,0.00,1.00,-144.00,-38.40 --172.80,-38.40,12.59,0.00,1.00,-139.20,-43.20 --168.00,-43.20,12.66,0.00,1.00,-134.40,-48.00 --168.00,-48.00,12.72,0.00,1.00,-129.60,-52.80 --168.00,-52.80,12.79,0.00,1.00,-124.80,-57.60 --163.20,-57.60,12.85,0.00,1.00,-120.00,-62.40 --158.40,-62.40,12.92,0.00,1.00,-115.20,-67.20 --153.60,-67.20,12.98,0.00,1.00,-110.40,-72.00 --148.80,-72.00,13.04,0.00,1.00,-105.60,-76.80 --139.20,-76.80,13.11,0.00,1.00,-100.80,-81.60 --120.00,-76.80,13.17,0.00,1.00,-96.00,-81.60 --96.00,-81.60,13.24,0.00,1.00,-91.20,-81.60 --67.20,-81.60,13.30,0.00,1.00,-86.40,-76.80 --48.00,-76.80,13.37,0.00,1.00,-81.60,-72.00 --33.60,-72.00,13.43,0.00,1.00,-76.80,-72.00 --28.80,-72.00,13.49,0.00,1.00,-72.00,-67.20 --24.00,-67.20,13.56,0.00,1.00,-67.20,-62.40 --19.20,-62.40,13.62,0.00,1.00,-62.40,-57.60 --14.40,-57.60,13.69,0.00,1.00,-57.60,-52.80 --14.40,-52.80,13.75,0.00,1.00,-52.80,-48.00 --9.60,-48.00,13.82,0.00,1.00,-48.00,-43.20 --9.60,-43.20,13.88,0.00,1.00,-43.20,-38.40 --9.60,-38.40,13.94,0.00,1.00,-38.40,-33.60 --4.80,-33.60,14.01,0.00,1.00,-33.60,-28.80 --4.80,-28.80,14.07,0.00,1.00,-28.80,-24.00 --4.80,-24.00,14.14,0.00,1.00,-24.00,-19.20 --4.80,-19.20,14.20,0.00,1.00,-19.20,-14.40 --4.80,-14.40,14.27,0.00,1.00,-14.40,-9.60 --0.00,-9.60,14.33,0.00,1.00,-9.60,-4.80 --0.00,-4.80,14.39,0.00,1.00,-4.80,0.00 -0.00,0.00,14.46,0.00,1.00,0.00,4.80 -0.00,4.80,14.52,0.00,1.00,4.80,9.60 -4.80,9.60,14.59,0.00,1.00,9.60,14.40 -4.80,14.40,14.65,0.00,1.00,14.40,19.20 -4.80,19.20,14.71,0.00,1.00,19.20,24.00 -4.80,24.00,14.78,0.00,1.00,24.00,28.80 -9.60,28.80,14.84,0.00,1.00,28.80,33.60 -9.60,33.60,14.91,0.00,1.00,33.60,38.40 -9.60,38.40,14.97,0.00,1.00,38.40,43.20 -14.40,43.20,15.04,0.00,1.00,43.20,48.00 -14.40,48.00,15.10,0.00,1.00,48.00,52.80 -19.20,52.80,15.16,0.00,1.00,52.80,57.60 -19.20,52.80,15.23,0.00,1.00,57.60,57.60 -24.00,57.60,15.29,0.00,1.00,62.40,62.40 -28.80,62.40,15.36,0.00,1.00,67.20,67.20 -38.40,67.20,15.42,0.00,1.00,72.00,72.00 -48.00,72.00,15.49,0.00,1.00,76.80,72.00 -57.60,72.00,15.55,0.00,1.00,81.60,76.80 -76.80,76.80,15.61,0.00,1.00,86.40,76.80 -96.00,76.80,15.68,0.00,1.00,91.20,76.80 -115.20,76.80,15.74,0.00,1.00,96.00,72.00 -129.60,72.00,15.81,0.00,1.00,100.80,72.00 -139.20,67.20,15.87,0.00,1.00,105.60,67.20 -144.00,67.20,15.94,0.00,1.00,110.40,62.40 -153.60,62.40,16.00,0.00,1.00,115.20,57.60 -158.40,57.60,16.00,0.00,1.00,120.00,52.80 -158.40,52.80,15.94,0.00,1.00,124.80,48.00 -163.20,48.00,15.87,0.00,1.00,129.60,43.20 -168.00,43.20,15.81,0.00,1.00,134.40,38.40 -168.00,38.40,15.74,0.00,1.00,139.20,33.60 -168.00,33.60,15.68,0.00,1.00,144.00,28.80 -172.80,28.80,15.61,0.00,1.00,148.80,24.00 -172.80,24.00,15.55,0.00,1.00,153.60,19.20 -172.80,19.20,15.49,0.00,1.00,158.40,14.40 -177.60,14.40,15.42,0.00,1.00,163.20,9.60 -177.60,9.60,15.36,0.00,1.00,168.00,4.80 -177.60,4.80,15.29,0.00,1.00,172.80,0.00 -177.60,0.00,15.23,0.00,1.00,177.60,-0.00 --177.60,-0.00,15.16,0.00,1.00,-177.60,-4.80 --177.60,-4.80,15.10,0.00,1.00,-172.80,-9.60 --177.60,-9.60,15.04,0.00,1.00,-168.00,-14.40 --177.60,-14.40,14.97,0.00,1.00,-163.20,-19.20 --172.80,-19.20,14.91,0.00,1.00,-158.40,-24.00 --172.80,-24.00,14.84,0.00,1.00,-153.60,-28.80 --172.80,-28.80,14.78,0.00,1.00,-148.80,-33.60 --168.00,-33.60,14.71,0.00,1.00,-144.00,-38.40 --168.00,-38.40,14.65,0.00,1.00,-139.20,-43.20 --168.00,-43.20,14.59,0.00,1.00,-134.40,-48.00 --163.20,-48.00,14.52,0.00,1.00,-129.60,-52.80 --158.40,-52.80,14.46,0.00,1.00,-124.80,-57.60 --158.40,-57.60,14.39,0.00,1.00,-120.00,-62.40 --153.60,-62.40,14.33,0.00,1.00,-115.20,-67.20 --144.00,-67.20,14.27,0.00,1.00,-110.40,-72.00 --139.20,-67.20,14.20,0.00,1.00,-105.60,-72.00 --129.60,-72.00,14.14,0.00,1.00,-100.80,-76.80 --115.20,-76.80,14.07,0.00,1.00,-96.00,-76.80 --96.00,-76.80,14.01,0.00,1.00,-91.20,-76.80 --76.80,-76.80,13.94,0.00,1.00,-86.40,-72.00 --57.60,-72.00,13.88,0.00,1.00,-81.60,-72.00 --48.00,-72.00,13.82,0.00,1.00,-76.80,-67.20 --38.40,-67.20,13.75,0.00,1.00,-72.00,-62.40 --28.80,-62.40,13.69,0.00,1.00,-67.20,-57.60 --24.00,-57.60,13.62,0.00,1.00,-62.40,-57.60 --19.20,-52.80,13.56,0.00,1.00,-57.60,-52.80 --19.20,-52.80,13.49,0.00,1.00,-52.80,-48.00 --14.40,-48.00,13.43,0.00,1.00,-48.00,-43.20 --14.40,-43.20,13.37,0.00,1.00,-43.20,-38.40 --9.60,-38.40,13.30,0.00,1.00,-38.40,-33.60 --9.60,-33.60,13.24,0.00,1.00,-33.60,-28.80 --9.60,-28.80,13.17,0.00,1.00,-28.80,-24.00 --4.80,-24.00,13.11,0.00,1.00,-24.00,-19.20 --4.80,-19.20,13.04,0.00,1.00,-19.20,-14.40 --4.80,-14.40,12.98,0.00,1.00,-14.40,-9.60 --4.80,-9.60,12.92,0.00,1.00,-9.60,-4.80 --0.00,-4.80,12.85,0.00,1.00,-4.80,0.00 -0.00,0.00,12.79,0.00,1.00,0.00,4.80 -0.00,4.80,12.72,0.00,1.00,4.80,9.60 -4.80,9.60,12.66,0.00,1.00,9.60,14.40 -4.80,14.40,12.59,0.00,1.00,14.40,19.20 -4.80,19.20,12.53,0.00,1.00,19.20,24.00 -9.60,24.00,12.47,0.00,1.00,24.00,28.80 -9.60,28.80,12.40,0.00,1.00,28.80,33.60 -14.40,33.60,12.34,0.00,1.00,33.60,38.40 -14.40,33.60,12.27,0.00,1.00,38.40,38.40 -19.20,38.40,12.21,0.00,1.00,43.20,43.20 -19.20,43.20,12.14,0.00,1.00,48.00,48.00 -24.00,48.00,12.08,0.00,1.00,52.80,52.80 -28.80,52.80,12.02,0.00,1.00,57.60,57.60 -33.60,57.60,11.95,0.00,1.00,62.40,62.40 -38.40,62.40,11.89,0.00,1.00,67.20,62.40 -43.20,62.40,11.82,0.00,1.00,72.00,67.20 -52.80,67.20,11.76,0.00,1.00,76.80,72.00 -67.20,67.20,11.69,0.00,1.00,81.60,72.00 -76.80,72.00,11.63,0.00,1.00,86.40,72.00 -96.00,72.00,11.57,0.00,1.00,91.20,72.00 -105.60,72.00,11.50,0.00,1.00,96.00,67.20 -120.00,67.20,11.44,0.00,1.00,100.80,67.20 -129.60,67.20,11.37,0.00,1.00,105.60,62.40 -139.20,62.40,11.31,0.00,1.00,110.40,57.60 -144.00,57.60,11.24,0.00,1.00,115.20,57.60 -148.80,52.80,11.18,0.00,1.00,120.00,52.80 -153.60,52.80,11.12,0.00,1.00,124.80,48.00 -158.40,48.00,11.05,0.00,1.00,129.60,43.20 -163.20,43.20,10.99,0.00,1.00,134.40,38.40 -163.20,38.40,10.92,0.00,1.00,139.20,33.60 -168.00,33.60,10.86,0.00,1.00,144.00,28.80 -168.00,28.80,10.80,0.00,1.00,148.80,24.00 -172.80,24.00,10.73,0.00,1.00,153.60,19.20 -172.80,19.20,10.67,0.00,1.00,158.40,14.40 -172.80,14.40,10.60,0.00,1.00,163.20,9.60 -177.60,9.60,10.54,0.00,1.00,168.00,4.80 -177.60,4.80,10.47,0.00,1.00,172.80,0.00 -177.60,0.00,10.41,0.00,1.00,177.60,-0.00 --177.60,-0.00,10.35,0.00,1.00,-177.60,-4.80 --177.60,-4.80,10.28,0.00,1.00,-172.80,-9.60 --177.60,-9.60,10.22,0.00,1.00,-168.00,-14.40 --172.80,-14.40,10.15,0.00,1.00,-163.20,-19.20 --172.80,-19.20,10.09,0.00,1.00,-158.40,-24.00 --172.80,-24.00,10.02,0.00,1.00,-153.60,-28.80 --168.00,-28.80,9.96,0.00,1.00,-148.80,-33.60 --168.00,-33.60,9.90,0.00,1.00,-144.00,-38.40 --163.20,-38.40,9.83,0.00,1.00,-139.20,-43.20 --163.20,-43.20,9.77,0.00,1.00,-134.40,-48.00 --158.40,-48.00,9.70,0.00,1.00,-129.60,-52.80 --153.60,-52.80,9.64,0.00,1.00,-124.80,-57.60 --148.80,-52.80,9.57,0.00,1.00,-120.00,-57.60 --144.00,-57.60,9.51,0.00,1.00,-115.20,-62.40 --139.20,-62.40,9.45,0.00,1.00,-110.40,-67.20 --129.60,-67.20,9.38,0.00,1.00,-105.60,-67.20 --120.00,-67.20,9.32,0.00,1.00,-100.80,-72.00 --105.60,-72.00,9.25,0.00,1.00,-96.00,-72.00 --96.00,-72.00,9.19,0.00,1.00,-91.20,-72.00 --76.80,-72.00,9.12,0.00,1.00,-86.40,-72.00 --67.20,-67.20,9.06,0.00,1.00,-81.60,-67.20 --52.80,-67.20,9.00,0.00,1.00,-76.80,-62.40 --43.20,-62.40,8.93,0.00,1.00,-72.00,-62.40 --38.40,-62.40,8.87,0.00,1.00,-67.20,-57.60 --33.60,-57.60,8.80,0.00,1.00,-62.40,-52.80 --28.80,-52.80,8.74,0.00,1.00,-57.60,-48.00 --24.00,-48.00,8.67,0.00,1.00,-52.80,-43.20 --19.20,-43.20,8.61,0.00,1.00,-48.00,-38.40 --19.20,-38.40,8.55,0.00,1.00,-43.20,-38.40 --14.40,-33.60,8.48,0.00,1.00,-38.40,-33.60 --14.40,-33.60,8.42,0.00,1.00,-33.60,-28.80 --9.60,-28.80,8.35,0.00,1.00,-28.80,-24.00 --9.60,-24.00,8.29,0.00,1.00,-24.00,-19.20 --4.80,-19.20,8.22,0.00,1.00,-19.20,-14.40 --4.80,-14.40,8.16,0.00,1.00,-14.40,-9.60 --4.80,-9.60,8.10,0.00,1.00,-9.60,-4.80 --0.00,-4.80,8.03,0.00,1.00,-4.80,0.00 -0.00,0.00,7.97,0.00,1.00,0.00,4.80 -0.00,4.80,7.90,0.00,1.00,4.80,9.60 -4.80,9.60,7.84,0.00,1.00,9.60,14.40 -4.80,14.40,7.78,0.00,1.00,14.40,19.20 -9.60,19.20,7.71,0.00,1.00,19.20,24.00 -9.60,24.00,7.65,0.00,1.00,24.00,24.00 -14.40,24.00,7.58,0.00,1.00,28.80,28.80 -14.40,28.80,7.52,0.00,1.00,33.60,33.60 -19.20,33.60,7.45,0.00,1.00,33.60,38.40 -19.20,38.40,7.39,0.00,1.00,38.40,43.20 -24.00,43.20,7.33,0.00,1.00,43.20,48.00 -28.80,48.00,7.26,0.00,1.00,48.00,52.80 -33.60,52.80,7.20,0.00,1.00,57.60,52.80 -38.40,52.80,7.13,0.00,1.00,62.40,57.60 -43.20,57.60,7.07,0.00,1.00,67.20,62.40 -52.80,62.40,7.00,0.00,1.00,72.00,62.40 -62.40,62.40,6.94,0.00,1.00,76.80,67.20 -72.00,62.40,6.88,0.00,1.00,81.60,67.20 -81.60,67.20,6.81,0.00,1.00,86.40,67.20 -91.20,67.20,6.75,0.00,1.00,91.20,67.20 -105.60,67.20,6.68,0.00,1.00,96.00,67.20 -115.20,62.40,6.62,0.00,1.00,100.80,62.40 -124.80,62.40,6.55,0.00,1.00,105.60,57.60 -134.40,57.60,6.49,0.00,1.00,110.40,57.60 -139.20,57.60,6.43,0.00,1.00,115.20,52.80 -144.00,52.80,6.36,0.00,1.00,120.00,48.00 -148.80,48.00,6.30,0.00,1.00,129.60,43.20 -153.60,43.20,6.23,0.00,1.00,134.40,43.20 -158.40,38.40,6.17,0.00,1.00,139.20,38.40 -158.40,38.40,6.10,0.00,1.00,144.00,33.60 -163.20,33.60,6.04,0.00,1.00,148.80,28.80 -168.00,28.80,5.98,0.00,1.00,148.80,24.00 -168.00,24.00,5.91,0.00,1.00,153.60,19.20 -172.80,19.20,5.85,0.00,1.00,158.40,14.40 -172.80,14.40,5.78,0.00,1.00,163.20,9.60 -172.80,9.60,5.72,0.00,1.00,168.00,4.80 -177.60,4.80,5.65,0.00,1.00,172.80,0.00 -177.60,0.00,5.59,0.00,1.00,177.60,-0.00 --177.60,-0.00,5.53,0.00,1.00,-177.60,-4.80 --177.60,-4.80,5.46,0.00,1.00,-172.80,-9.60 --172.80,-9.60,5.40,0.00,1.00,-168.00,-14.40 --172.80,-14.40,5.33,0.00,1.00,-163.20,-19.20 --172.80,-19.20,5.27,0.00,1.00,-158.40,-24.00 --168.00,-24.00,5.20,0.00,1.00,-153.60,-28.80 --168.00,-28.80,5.14,0.00,1.00,-148.80,-33.60 --163.20,-33.60,5.08,0.00,1.00,-148.80,-38.40 --158.40,-38.40,5.01,0.00,1.00,-144.00,-43.20 --158.40,-38.40,4.95,0.00,1.00,-139.20,-43.20 --153.60,-43.20,4.88,0.00,1.00,-134.40,-48.00 --148.80,-48.00,4.82,0.00,1.00,-129.60,-52.80 --144.00,-52.80,4.76,0.00,1.00,-120.00,-57.60 --139.20,-57.60,4.69,0.00,1.00,-115.20,-57.60 --134.40,-57.60,4.63,0.00,1.00,-110.40,-62.40 --124.80,-62.40,4.56,0.00,1.00,-105.60,-67.20 --115.20,-62.40,4.50,0.00,1.00,-100.80,-67.20 --105.60,-67.20,4.43,0.00,1.00,-96.00,-67.20 --91.20,-67.20,4.37,0.00,1.00,-91.20,-67.20 --81.60,-67.20,4.31,0.00,1.00,-86.40,-67.20 --72.00,-62.40,4.24,0.00,1.00,-81.60,-62.40 --62.40,-62.40,4.18,0.00,1.00,-76.80,-62.40 --52.80,-62.40,4.11,0.00,1.00,-72.00,-57.60 --43.20,-57.60,4.05,0.00,1.00,-67.20,-52.80 --38.40,-52.80,3.98,0.00,1.00,-62.40,-52.80 --33.60,-52.80,3.92,0.00,1.00,-57.60,-48.00 --28.80,-48.00,3.86,0.00,1.00,-48.00,-43.20 --24.00,-43.20,3.79,0.00,1.00,-43.20,-38.40 --19.20,-38.40,3.73,0.00,1.00,-38.40,-33.60 --19.20,-33.60,3.66,0.00,1.00,-33.60,-28.80 --14.40,-28.80,3.60,0.00,1.00,-33.60,-24.00 --14.40,-24.00,3.53,0.00,1.00,-28.80,-24.00 --9.60,-24.00,3.47,0.00,1.00,-24.00,-19.20 --9.60,-19.20,3.41,0.00,1.00,-19.20,-14.40 --4.80,-14.40,3.34,0.00,1.00,-14.40,-9.60 --4.80,-9.60,3.28,0.00,1.00,-9.60,-4.80 --0.00,-4.80,3.21,0.00,1.00,-4.80,0.00 -0.00,0.00,3.15,0.00,1.00,0.00,4.80 -0.00,4.80,3.08,0.00,1.00,4.80,9.60 -4.80,9.60,3.02,0.00,1.00,9.60,14.40 -4.80,14.40,2.96,0.00,1.00,14.40,19.20 -9.60,14.40,2.89,0.00,1.00,19.20,19.20 -14.40,19.20,2.83,0.00,1.00,19.20,24.00 -14.40,24.00,2.76,0.00,1.00,24.00,28.80 -19.20,28.80,2.70,0.00,1.00,28.80,33.60 -19.20,33.60,2.63,0.00,1.00,33.60,38.40 -24.00,38.40,2.57,0.00,1.00,38.40,43.20 -28.80,38.40,2.51,0.00,1.00,43.20,43.20 -33.60,43.20,2.44,0.00,1.00,48.00,48.00 -38.40,48.00,2.38,0.00,1.00,52.80,52.80 -43.20,52.80,2.31,0.00,1.00,57.60,52.80 -48.00,52.80,2.25,0.00,1.00,62.40,57.60 -57.60,57.60,2.18,0.00,1.00,72.00,57.60 -62.40,57.60,2.12,0.00,1.00,76.80,62.40 -72.00,62.40,2.06,0.00,1.00,81.60,62.40 -81.60,62.40,1.99,0.00,1.00,86.40,62.40 -91.20,62.40,1.93,0.00,1.00,91.20,62.40 -100.80,62.40,1.86,0.00,1.00,96.00,62.40 -110.40,57.60,1.80,0.00,1.00,100.80,57.60 -120.00,57.60,1.73,0.00,1.00,105.60,57.60 -129.60,57.60,1.67,0.00,1.00,115.20,52.80 -134.40,52.80,1.61,0.00,1.00,120.00,48.00 -139.20,48.00,1.54,0.00,1.00,124.80,48.00 -144.00,48.00,1.48,0.00,1.00,129.60,43.20 -148.80,43.20,1.41,0.00,1.00,134.40,38.40 -153.60,38.40,1.35,0.00,1.00,139.20,33.60 -158.40,33.60,1.29,0.00,1.00,144.00,33.60 -158.40,28.80,1.22,0.00,1.00,148.80,28.80 -163.20,28.80,1.16,0.00,1.00,153.60,24.00 -168.00,24.00,1.09,0.00,1.00,158.40,19.20 -168.00,19.20,1.03,0.00,1.00,163.20,14.40 -172.80,14.40,0.96,0.00,1.00,163.20,9.60 -172.80,9.60,0.90,0.00,1.00,168.00,4.80 -177.60,4.80,0.84,0.00,1.00,172.80,0.00 -177.60,0.00,0.77,0.00,1.00,177.60,-0.00 --177.60,-0.00,0.71,0.00,1.00,-177.60,-4.80 --177.60,-4.80,0.64,0.00,1.00,-172.80,-9.60 --172.80,-9.60,0.58,0.00,1.00,-168.00,-14.40 --172.80,-14.40,0.51,0.00,1.00,-163.20,-19.20 --168.00,-19.20,0.45,0.00,1.00,-163.20,-24.00 --168.00,-24.00,0.39,0.00,1.00,-158.40,-28.80 --163.20,-28.80,0.32,0.00,1.00,-153.60,-33.60 --158.40,-28.80,0.26,0.00,1.00,-148.80,-33.60 --158.40,-33.60,0.19,0.00,1.00,-144.00,-38.40 --153.60,-38.40,0.13,0.00,1.00,-139.20,-43.20 --148.80,-43.20,0.06,0.00,1.00,-134.40,-48.00 --144.00,-48.00,0.00,0.00,1.00,-129.60,-48.00 --139.20,-48.00,0.00,0.00,1.00,-124.80,-52.80 --134.40,-52.80,0.16,0.00,1.00,-120.00,-57.60 --129.60,-57.60,0.32,0.00,1.00,-115.20,-57.60 --120.00,-57.60,0.48,0.00,1.00,-105.60,-62.40 --110.40,-57.60,0.65,0.00,1.00,-100.80,-62.40 --100.80,-62.40,0.81,0.00,1.00,-96.00,-62.40 --91.20,-62.40,0.97,0.00,1.00,-91.20,-62.40 --81.60,-62.40,1.13,0.00,1.00,-86.40,-62.40 --72.00,-62.40,1.29,0.00,1.00,-81.60,-57.60 --62.40,-57.60,1.45,0.00,1.00,-76.80,-57.60 --57.60,-57.60,1.62,0.00,1.00,-72.00,-52.80 --48.00,-52.80,1.78,0.00,1.00,-62.40,-52.80 --43.20,-52.80,1.94,0.00,1.00,-57.60,-48.00 --38.40,-48.00,2.10,0.00,1.00,-52.80,-43.20 --33.60,-43.20,2.26,0.00,1.00,-48.00,-43.20 --28.80,-38.40,2.42,0.00,1.00,-43.20,-38.40 --24.00,-38.40,2.59,0.00,1.00,-38.40,-33.60 --19.20,-33.60,2.75,0.00,1.00,-33.60,-28.80 --19.20,-28.80,2.91,0.00,1.00,-28.80,-24.00 --14.40,-24.00,3.07,0.00,1.00,-24.00,-19.20 --14.40,-19.20,3.23,0.00,1.00,-19.20,-19.20 --9.60,-14.40,3.39,0.00,1.00,-19.20,-14.40 --4.80,-14.40,3.56,0.00,1.00,-14.40,-9.60 --4.80,-9.60,3.72,0.00,1.00,-9.60,-4.80 --0.00,-4.80,3.88,0.00,1.00,-4.80,0.00 -0.00,0.00,4.04,0.00,1.00,0.00,4.80 -4.80,4.80,4.20,0.00,1.00,4.80,9.60 -4.80,9.60,4.36,0.00,1.00,9.60,14.40 -9.60,9.60,4.53,0.00,1.00,14.40,14.40 -9.60,14.40,4.69,0.00,1.00,14.40,19.20 -14.40,19.20,4.85,0.00,1.00,19.20,24.00 -19.20,24.00,5.01,0.00,1.00,24.00,28.80 -19.20,28.80,5.17,0.00,1.00,28.80,33.60 -24.00,28.80,5.33,0.00,1.00,33.60,33.60 -28.80,33.60,5.49,0.00,1.00,38.40,38.40 -33.60,38.40,5.66,0.00,1.00,43.20,43.20 -38.40,43.20,5.82,0.00,1.00,48.00,43.20 -43.20,43.20,5.98,0.00,1.00,52.80,48.00 -48.00,48.00,6.14,0.00,1.00,57.60,52.80 -52.80,48.00,6.30,0.00,1.00,62.40,52.80 -57.60,52.80,6.46,0.00,1.00,67.20,57.60 -67.20,52.80,6.63,0.00,1.00,72.00,57.60 -76.80,57.60,6.79,0.00,1.00,81.60,57.60 -81.60,57.60,6.95,0.00,1.00,86.40,57.60 -91.20,57.60,7.11,0.00,1.00,91.20,57.60 -100.80,57.60,7.27,0.00,1.00,96.00,57.60 -110.40,52.80,7.43,0.00,1.00,100.80,52.80 -115.20,52.80,7.60,0.00,1.00,110.40,52.80 -124.80,52.80,7.76,0.00,1.00,115.20,48.00 -129.60,48.00,7.92,0.00,1.00,120.00,48.00 -134.40,48.00,8.08,0.00,1.00,124.80,43.20 -139.20,43.20,8.24,0.00,1.00,129.60,38.40 -144.00,38.40,8.40,0.00,1.00,134.40,38.40 -148.80,38.40,8.57,0.00,1.00,139.20,33.60 -153.60,33.60,8.73,0.00,1.00,144.00,28.80 -158.40,28.80,8.89,0.00,1.00,148.80,24.00 -163.20,24.00,9.05,0.00,1.00,153.60,24.00 -163.20,24.00,9.21,0.00,1.00,158.40,19.20 -168.00,19.20,9.37,0.00,1.00,163.20,14.40 -172.80,14.40,9.54,0.00,1.00,168.00,9.60 -172.80,9.60,9.70,0.00,1.00,168.00,4.80 -177.60,4.80,9.86,0.00,1.00,172.80,0.00 -177.60,0.00,10.02,0.00,1.00,177.60,-0.00 --177.60,-0.00,10.18,0.00,1.00,-177.60,-4.80 --177.60,-4.80,10.34,0.00,1.00,-172.80,-9.60 --172.80,-9.60,10.51,0.00,1.00,-168.00,-14.40 --172.80,-14.40,10.67,0.00,1.00,-168.00,-19.20 --168.00,-19.20,10.83,0.00,1.00,-163.20,-24.00 --163.20,-24.00,10.99,0.00,1.00,-158.40,-24.00 --163.20,-24.00,11.15,0.00,1.00,-153.60,-28.80 --158.40,-28.80,11.31,0.00,1.00,-148.80,-33.60 --153.60,-33.60,11.47,0.00,1.00,-144.00,-38.40 --148.80,-38.40,11.64,0.00,1.00,-139.20,-38.40 --144.00,-38.40,11.80,0.00,1.00,-134.40,-43.20 --139.20,-43.20,11.96,0.00,1.00,-129.60,-48.00 --134.40,-48.00,12.12,0.00,1.00,-124.80,-48.00 --129.60,-48.00,12.28,0.00,1.00,-120.00,-52.80 --124.80,-52.80,12.44,0.00,1.00,-115.20,-52.80 --115.20,-52.80,12.61,0.00,1.00,-110.40,-57.60 --110.40,-52.80,12.77,0.00,1.00,-100.80,-57.60 --100.80,-57.60,12.93,0.00,1.00,-96.00,-57.60 --91.20,-57.60,13.09,0.00,1.00,-91.20,-57.60 --81.60,-57.60,13.25,0.00,1.00,-86.40,-57.60 --76.80,-57.60,13.41,0.00,1.00,-81.60,-57.60 --67.20,-52.80,13.58,0.00,1.00,-72.00,-52.80 --57.60,-52.80,13.74,0.00,1.00,-67.20,-52.80 --52.80,-48.00,13.90,0.00,1.00,-62.40,-48.00 --48.00,-48.00,14.06,0.00,1.00,-57.60,-43.20 --43.20,-43.20,14.22,0.00,1.00,-52.80,-43.20 --38.40,-43.20,14.38,0.00,1.00,-48.00,-38.40 --33.60,-38.40,14.55,0.00,1.00,-43.20,-33.60 --28.80,-33.60,14.71,0.00,1.00,-38.40,-33.60 --24.00,-28.80,14.87,0.00,1.00,-33.60,-28.80 --19.20,-28.80,15.03,0.00,1.00,-28.80,-24.00 --19.20,-24.00,15.19,0.00,1.00,-24.00,-19.20 --14.40,-19.20,15.35,0.00,1.00,-19.20,-14.40 --9.60,-14.40,15.52,0.00,1.00,-14.40,-14.40 --9.60,-9.60,15.68,0.00,1.00,-14.40,-9.60 --4.80,-9.60,15.84,0.00,1.00,-9.60,-4.80 --4.80,-4.80,16.00,0.00,1.00,-4.80,0.00 -0.00,0.00,16.00,0.00,1.00,0.00,4.80 -4.80,4.80,15.84,0.00,1.00,4.80,9.60 -4.80,9.60,15.68,0.00,1.00,9.60,9.60 -9.60,9.60,15.52,0.00,1.00,9.60,14.40 -14.40,14.40,15.35,0.00,1.00,14.40,19.20 -14.40,19.20,15.19,0.00,1.00,19.20,24.00 -19.20,24.00,15.03,0.00,1.00,24.00,24.00 -24.00,24.00,14.87,0.00,1.00,28.80,28.80 -24.00,28.80,14.71,0.00,1.00,33.60,33.60 -28.80,33.60,14.55,0.00,1.00,38.40,38.40 -33.60,33.60,14.38,0.00,1.00,43.20,38.40 -38.40,38.40,14.22,0.00,1.00,48.00,43.20 -43.20,43.20,14.06,0.00,1.00,52.80,43.20 -48.00,43.20,13.90,0.00,1.00,57.60,48.00 -57.60,48.00,13.74,0.00,1.00,62.40,48.00 -62.40,48.00,13.58,0.00,1.00,67.20,52.80 -67.20,48.00,13.41,0.00,1.00,72.00,52.80 -76.80,52.80,13.25,0.00,1.00,81.60,52.80 -86.40,52.80,13.09,0.00,1.00,86.40,52.80 -91.20,52.80,12.93,0.00,1.00,91.20,52.80 -100.80,52.80,12.77,0.00,1.00,96.00,52.80 -105.60,48.00,12.61,0.00,1.00,105.60,48.00 -115.20,48.00,12.44,0.00,1.00,110.40,48.00 -120.00,48.00,12.28,0.00,1.00,115.20,48.00 -124.80,43.20,12.12,0.00,1.00,120.00,43.20 -134.40,43.20,11.96,0.00,1.00,124.80,43.20 -139.20,38.40,11.80,0.00,1.00,129.60,38.40 -144.00,38.40,11.64,0.00,1.00,134.40,33.60 -148.80,33.60,11.47,0.00,1.00,139.20,33.60 -153.60,28.80,11.31,0.00,1.00,144.00,28.80 -153.60,28.80,11.15,0.00,1.00,148.80,24.00 -158.40,24.00,10.99,0.00,1.00,153.60,19.20 -163.20,19.20,10.83,0.00,1.00,158.40,19.20 -168.00,14.40,10.67,0.00,1.00,163.20,14.40 -168.00,14.40,10.51,0.00,1.00,168.00,9.60 -172.80,9.60,10.34,0.00,1.00,172.80,4.80 -177.60,4.80,10.18,0.00,1.00,172.80,0.00 -177.60,0.00,10.02,0.00,1.00,177.60,-0.00 --177.60,-0.00,9.86,0.00,1.00,-177.60,-4.80 --177.60,-4.80,9.70,0.00,1.00,-172.80,-9.60 --172.80,-9.60,9.54,0.00,1.00,-172.80,-14.40 --168.00,-14.40,9.37,0.00,1.00,-168.00,-19.20 --168.00,-14.40,9.21,0.00,1.00,-163.20,-19.20 --163.20,-19.20,9.05,0.00,1.00,-158.40,-24.00 --158.40,-24.00,8.89,0.00,1.00,-153.60,-28.80 --153.60,-28.80,8.73,0.00,1.00,-148.80,-33.60 --153.60,-28.80,8.57,0.00,1.00,-144.00,-33.60 --148.80,-33.60,8.40,0.00,1.00,-139.20,-38.40 --144.00,-38.40,8.24,0.00,1.00,-134.40,-43.20 --139.20,-38.40,8.08,0.00,1.00,-129.60,-43.20 --134.40,-43.20,7.92,0.00,1.00,-124.80,-48.00 --124.80,-43.20,7.76,0.00,1.00,-120.00,-48.00 --120.00,-48.00,7.60,0.00,1.00,-115.20,-48.00 --115.20,-48.00,7.43,0.00,1.00,-110.40,-52.80 --105.60,-48.00,7.27,0.00,1.00,-105.60,-52.80 --100.80,-52.80,7.11,0.00,1.00,-96.00,-52.80 --91.20,-52.80,6.95,0.00,1.00,-91.20,-52.80 --86.40,-52.80,6.79,0.00,1.00,-86.40,-52.80 --76.80,-52.80,6.63,0.00,1.00,-81.60,-52.80 --67.20,-48.00,6.46,0.00,1.00,-72.00,-48.00 --62.40,-48.00,6.30,0.00,1.00,-67.20,-48.00 --57.60,-48.00,6.14,0.00,1.00,-62.40,-43.20 --48.00,-43.20,5.98,0.00,1.00,-57.60,-43.20 --43.20,-43.20,5.82,0.00,1.00,-52.80,-38.40 --38.40,-38.40,5.66,0.00,1.00,-48.00,-38.40 --33.60,-33.60,5.49,0.00,1.00,-43.20,-33.60 --28.80,-33.60,5.33,0.00,1.00,-38.40,-28.80 --24.00,-28.80,5.17,0.00,1.00,-33.60,-24.00 --24.00,-24.00,5.01,0.00,1.00,-28.80,-24.00 --19.20,-24.00,4.85,0.00,1.00,-24.00,-19.20 --14.40,-19.20,4.69,0.00,1.00,-19.20,-14.40 --14.40,-14.40,4.53,0.00,1.00,-14.40,-9.60 --9.60,-9.60,4.36,0.00,1.00,-9.60,-9.60 --4.80,-9.60,4.20,0.00,1.00,-9.60,-4.80 --4.80,-4.80,4.04,0.00,1.00,-4.80,0.00 -0.00,0.00,3.88,0.00,1.00,0.00,4.80 -4.80,4.80,3.72,0.00,1.00,4.80,4.80 -4.80,4.80,3.56,0.00,1.00,4.80,9.60 -9.60,9.60,3.39,0.00,1.00,9.60,14.40 -14.40,14.40,3.23,0.00,1.00,14.40,19.20 -19.20,19.20,3.07,0.00,1.00,19.20,19.20 -19.20,19.20,2.91,0.00,1.00,24.00,24.00 -24.00,24.00,2.75,0.00,1.00,24.00,28.80 -28.80,28.80,2.59,0.00,1.00,28.80,28.80 -33.60,28.80,2.42,0.00,1.00,33.60,33.60 -38.40,33.60,2.26,0.00,1.00,38.40,38.40 -43.20,33.60,2.10,0.00,1.00,43.20,38.40 -48.00,38.40,1.94,0.00,1.00,48.00,43.20 -52.80,38.40,1.78,0.00,1.00,52.80,43.20 -57.60,43.20,1.62,0.00,1.00,62.40,43.20 -62.40,43.20,1.45,0.00,1.00,67.20,48.00 -72.00,43.20,1.29,0.00,1.00,72.00,48.00 -76.80,48.00,1.13,0.00,1.00,76.80,48.00 -86.40,48.00,0.97,0.00,1.00,86.40,48.00 -91.20,48.00,0.81,0.00,1.00,91.20,48.00 -100.80,48.00,0.65,0.00,1.00,96.00,48.00 -105.60,48.00,0.48,0.00,1.00,105.60,48.00 -110.40,43.20,0.32,0.00,1.00,110.40,43.20 -120.00,43.20,0.16,0.00,1.00,115.20,43.20 -124.80,43.20,0.00,0.00,1.00,124.80,38.40 -129.60,38.40,0.00,0.00,1.00,129.60,38.40 -134.40,38.40,0.04,0.00,1.00,134.40,33.60 -139.20,33.60,0.08,0.00,1.00,139.20,33.60 -144.00,33.60,0.12,0.00,1.00,144.00,28.80 -148.80,28.80,0.16,0.00,1.00,148.80,24.00 -153.60,24.00,0.20,0.00,1.00,153.60,24.00 -158.40,24.00,0.24,0.00,1.00,158.40,19.20 -163.20,19.20,0.28,0.00,1.00,158.40,14.40 -163.20,14.40,0.32,0.00,1.00,163.20,14.40 -168.00,14.40,0.36,0.00,1.00,168.00,9.60 -172.80,9.60,0.40,0.00,1.00,172.80,4.80 -172.80,4.80,0.44,0.00,1.00,172.80,0.00 -177.60,0.00,0.48,0.00,1.00,177.60,-0.00 --177.60,-0.00,0.52,0.00,1.00,-177.60,-4.80 --172.80,-4.80,0.56,0.00,1.00,-172.80,-9.60 --172.80,-9.60,0.60,0.00,1.00,-172.80,-14.40 --168.00,-14.40,0.64,0.00,1.00,-168.00,-14.40 --163.20,-14.40,0.68,0.00,1.00,-163.20,-19.20 --163.20,-19.20,0.72,0.00,1.00,-158.40,-24.00 --158.40,-24.00,0.76,0.00,1.00,-158.40,-24.00 --153.60,-24.00,0.80,0.00,1.00,-153.60,-28.80 --148.80,-28.80,0.84,0.00,1.00,-148.80,-33.60 --144.00,-33.60,0.88,0.00,1.00,-144.00,-33.60 --139.20,-33.60,0.92,0.00,1.00,-139.20,-38.40 --134.40,-38.40,0.96,0.00,1.00,-134.40,-38.40 --129.60,-38.40,1.00,0.00,1.00,-129.60,-43.20 --124.80,-43.20,1.04,0.00,1.00,-124.80,-43.20 --120.00,-43.20,1.08,0.00,1.00,-115.20,-48.00 --110.40,-43.20,1.12,0.00,1.00,-110.40,-48.00 --105.60,-48.00,1.16,0.00,1.00,-105.60,-48.00 --100.80,-48.00,1.20,0.00,1.00,-96.00,-48.00 --91.20,-48.00,1.24,0.00,1.00,-91.20,-48.00 --86.40,-48.00,1.28,0.00,1.00,-86.40,-48.00 --76.80,-48.00,1.32,0.00,1.00,-76.80,-48.00 --72.00,-43.20,1.36,0.00,1.00,-72.00,-43.20 --62.40,-43.20,1.40,0.00,1.00,-67.20,-43.20 --57.60,-43.20,1.44,0.00,1.00,-62.40,-43.20 --52.80,-38.40,1.48,0.00,1.00,-52.80,-38.40 --48.00,-38.40,1.52,0.00,1.00,-48.00,-38.40 --43.20,-33.60,1.56,0.00,1.00,-43.20,-33.60 --38.40,-33.60,1.60,0.00,1.00,-38.40,-28.80 --33.60,-28.80,1.64,0.00,1.00,-33.60,-28.80 --28.80,-28.80,1.68,0.00,1.00,-28.80,-24.00 --24.00,-24.00,1.72,0.00,1.00,-24.00,-19.20 --19.20,-19.20,1.76,0.00,1.00,-24.00,-19.20 --19.20,-19.20,1.80,0.00,1.00,-19.20,-14.40 --14.40,-14.40,1.84,0.00,1.00,-14.40,-9.60 --9.60,-9.60,1.88,0.00,1.00,-9.60,-4.80 --4.80,-4.80,1.92,0.00,1.00,-4.80,-4.80 --4.80,-4.80,1.96,0.00,1.00,-4.80,0.00 -0.00,0.00,2.01,0.00,1.00,0.00,4.80 -4.80,4.80,2.05,0.00,1.00,4.80,4.80 -4.80,4.80,2.09,0.00,1.00,4.80,9.60 -9.60,9.60,2.13,0.00,1.00,9.60,14.40 -14.40,14.40,2.17,0.00,1.00,14.40,14.40 -19.20,14.40,2.21,0.00,1.00,14.40,19.20 -24.00,19.20,2.25,0.00,1.00,19.20,24.00 -24.00,24.00,2.29,0.00,1.00,24.00,24.00 -28.80,24.00,2.33,0.00,1.00,28.80,28.80 -33.60,28.80,2.37,0.00,1.00,33.60,28.80 -38.40,28.80,2.41,0.00,1.00,38.40,33.60 -43.20,33.60,2.45,0.00,1.00,43.20,33.60 -48.00,33.60,2.49,0.00,1.00,48.00,38.40 -52.80,38.40,2.53,0.00,1.00,52.80,38.40 -62.40,38.40,2.57,0.00,1.00,57.60,38.40 -67.20,38.40,2.61,0.00,1.00,62.40,43.20 -72.00,38.40,2.65,0.00,1.00,72.00,43.20 -76.80,43.20,2.69,0.00,1.00,76.80,43.20 -86.40,43.20,2.73,0.00,1.00,86.40,43.20 -91.20,43.20,2.77,0.00,1.00,91.20,43.20 -96.00,43.20,2.81,0.00,1.00,100.80,43.20 -105.60,43.20,2.85,0.00,1.00,105.60,43.20 -110.40,38.40,2.89,0.00,1.00,110.40,38.40 -115.20,38.40,2.93,0.00,1.00,120.00,38.40 -120.00,38.40,2.97,0.00,1.00,124.80,38.40 -129.60,33.60,3.01,0.00,1.00,129.60,33.60 -134.40,33.60,3.05,0.00,1.00,134.40,33.60 -139.20,28.80,3.09,0.00,1.00,139.20,28.80 -144.00,28.80,3.13,0.00,1.00,144.00,28.80 -148.80,24.00,3.17,0.00,1.00,148.80,24.00 -153.60,24.00,3.21,0.00,1.00,153.60,19.20 -153.60,19.20,3.25,0.00,1.00,158.40,19.20 -158.40,19.20,3.29,0.00,1.00,163.20,14.40 -163.20,14.40,3.33,0.00,1.00,163.20,9.60 -168.00,9.60,3.37,0.00,1.00,168.00,9.60 -172.80,9.60,3.41,0.00,1.00,172.80,4.80 -172.80,4.80,3.45,0.00,1.00,172.80,0.00 -177.60,0.00,3.49,0.00,1.00,177.60,-0.00 --177.60,-0.00,3.53,0.00,1.00,-177.60,-4.80 --172.80,-4.80,3.57,0.00,1.00,-172.80,-9.60 --172.80,-9.60,3.61,0.00,1.00,-172.80,-9.60 --168.00,-9.60,3.65,0.00,1.00,-168.00,-14.40 --163.20,-14.40,3.69,0.00,1.00,-163.20,-19.20 --158.40,-19.20,3.73,0.00,1.00,-163.20,-19.20 --153.60,-19.20,3.77,0.00,1.00,-158.40,-24.00 --153.60,-24.00,3.81,0.00,1.00,-153.60,-28.80 --148.80,-24.00,3.85,0.00,1.00,-148.80,-28.80 --144.00,-28.80,3.89,0.00,1.00,-144.00,-33.60 --139.20,-28.80,3.93,0.00,1.00,-139.20,-33.60 --134.40,-33.60,3.97,0.00,1.00,-134.40,-38.40 --129.60,-33.60,4.01,0.00,1.00,-129.60,-38.40 --120.00,-38.40,4.05,0.00,1.00,-124.80,-38.40 --115.20,-38.40,4.09,0.00,1.00,-120.00,-43.20 --110.40,-38.40,4.13,0.00,1.00,-110.40,-43.20 --105.60,-43.20,4.17,0.00,1.00,-105.60,-43.20 --96.00,-43.20,4.21,0.00,1.00,-100.80,-43.20 --91.20,-43.20,4.25,0.00,1.00,-91.20,-43.20 --86.40,-43.20,4.29,0.00,1.00,-86.40,-43.20 --76.80,-43.20,4.33,0.00,1.00,-76.80,-43.20 --72.00,-38.40,4.37,0.00,1.00,-72.00,-38.40 --67.20,-38.40,4.41,0.00,1.00,-62.40,-38.40 --62.40,-38.40,4.45,0.00,1.00,-57.60,-38.40 --52.80,-38.40,4.49,0.00,1.00,-52.80,-33.60 --48.00,-33.60,4.53,0.00,1.00,-48.00,-33.60 --43.20,-33.60,4.57,0.00,1.00,-43.20,-28.80 --38.40,-28.80,4.61,0.00,1.00,-38.40,-28.80 --33.60,-28.80,4.65,0.00,1.00,-33.60,-24.00 --28.80,-24.00,4.69,0.00,1.00,-28.80,-24.00 --24.00,-24.00,4.73,0.00,1.00,-24.00,-19.20 --24.00,-19.20,4.77,0.00,1.00,-19.20,-14.40 --19.20,-14.40,4.81,0.00,1.00,-14.40,-14.40 --14.40,-14.40,4.85,0.00,1.00,-14.40,-9.60 --9.60,-9.60,4.89,0.00,1.00,-9.60,-4.80 --4.80,-4.80,4.93,0.00,1.00,-4.80,-4.80 --4.80,-4.80,4.97,0.00,1.00,-4.80,0.00 -0.00,0.00,5.01,0.00,1.00,0.00,4.80 -4.80,4.80,5.05,0.00,1.00,4.80,4.80 -9.60,4.80,5.09,0.00,1.00,4.80,9.60 -9.60,9.60,5.13,0.00,1.00,9.60,9.60 -14.40,9.60,5.17,0.00,1.00,9.60,14.40 -19.20,14.40,5.21,0.00,1.00,14.40,19.20 -24.00,19.20,5.25,0.00,1.00,19.20,19.20 -28.80,19.20,5.29,0.00,1.00,24.00,24.00 -33.60,24.00,5.33,0.00,1.00,24.00,24.00 -38.40,24.00,5.37,0.00,1.00,28.80,28.80 -43.20,28.80,5.41,0.00,1.00,33.60,28.80 -48.00,28.80,5.45,0.00,1.00,38.40,33.60 -52.80,28.80,5.49,0.00,1.00,43.20,33.60 -57.60,33.60,5.53,0.00,1.00,48.00,33.60 -62.40,33.60,5.57,0.00,1.00,52.80,38.40 -67.20,33.60,5.61,0.00,1.00,62.40,38.40 -72.00,38.40,5.65,0.00,1.00,67.20,38.40 -81.60,38.40,5.69,0.00,1.00,76.80,38.40 -86.40,38.40,5.73,0.00,1.00,86.40,38.40 -91.20,38.40,5.77,0.00,1.00,91.20,38.40 -96.00,38.40,5.81,0.00,1.00,100.80,38.40 -105.60,38.40,5.85,0.00,1.00,105.60,38.40 -110.40,33.60,5.89,0.00,1.00,115.20,33.60 -115.20,33.60,5.93,0.00,1.00,120.00,33.60 -120.00,33.60,5.97,0.00,1.00,129.60,33.60 -124.80,33.60,6.02,0.00,1.00,134.40,28.80 -129.60,28.80,6.06,0.00,1.00,139.20,28.80 -134.40,28.80,6.10,0.00,1.00,144.00,24.00 -139.20,24.00,6.14,0.00,1.00,148.80,24.00 -144.00,24.00,6.18,0.00,1.00,153.60,19.20 -148.80,19.20,6.22,0.00,1.00,158.40,19.20 -153.60,19.20,6.26,0.00,1.00,158.40,14.40 -158.40,14.40,6.30,0.00,1.00,163.20,14.40 -163.20,14.40,6.34,0.00,1.00,168.00,9.60 -168.00,9.60,6.38,0.00,1.00,168.00,9.60 -168.00,9.60,6.42,0.00,1.00,172.80,4.80 -172.80,4.80,6.46,0.00,1.00,177.60,0.00 -177.60,0.00,6.50,0.00,1.00,177.60,-0.00 --177.60,-0.00,6.54,0.00,1.00,-177.60,-4.80 --172.80,-4.80,6.58,0.00,1.00,-177.60,-9.60 --168.00,-9.60,6.62,0.00,1.00,-172.80,-9.60 --168.00,-9.60,6.66,0.00,1.00,-168.00,-14.40 --163.20,-14.40,6.70,0.00,1.00,-168.00,-14.40 --158.40,-14.40,6.74,0.00,1.00,-163.20,-19.20 --153.60,-19.20,6.78,0.00,1.00,-158.40,-19.20 --148.80,-19.20,6.82,0.00,1.00,-158.40,-24.00 --144.00,-24.00,6.86,0.00,1.00,-153.60,-24.00 --139.20,-24.00,6.90,0.00,1.00,-148.80,-28.80 --134.40,-28.80,6.94,0.00,1.00,-144.00,-28.80 --129.60,-28.80,6.98,0.00,1.00,-139.20,-33.60 --124.80,-33.60,7.02,0.00,1.00,-134.40,-33.60 --120.00,-33.60,7.06,0.00,1.00,-129.60,-33.60 --115.20,-33.60,7.10,0.00,1.00,-120.00,-38.40 --110.40,-33.60,7.14,0.00,1.00,-115.20,-38.40 --105.60,-38.40,7.18,0.00,1.00,-105.60,-38.40 --96.00,-38.40,7.22,0.00,1.00,-100.80,-38.40 --91.20,-38.40,7.26,0.00,1.00,-91.20,-38.40 --86.40,-38.40,7.30,0.00,1.00,-86.40,-38.40 --81.60,-38.40,7.34,0.00,1.00,-76.80,-38.40 --72.00,-38.40,7.38,0.00,1.00,-67.20,-38.40 --67.20,-33.60,7.42,0.00,1.00,-62.40,-33.60 --62.40,-33.60,7.46,0.00,1.00,-52.80,-33.60 --57.60,-33.60,7.50,0.00,1.00,-48.00,-33.60 --52.80,-28.80,7.54,0.00,1.00,-43.20,-28.80 --48.00,-28.80,7.58,0.00,1.00,-38.40,-28.80 --43.20,-28.80,7.62,0.00,1.00,-33.60,-24.00 --38.40,-24.00,7.66,0.00,1.00,-28.80,-24.00 --33.60,-24.00,7.70,0.00,1.00,-24.00,-19.20 --28.80,-19.20,7.74,0.00,1.00,-24.00,-19.20 --24.00,-19.20,7.78,0.00,1.00,-19.20,-14.40 --19.20,-14.40,7.82,0.00,1.00,-14.40,-9.60 --14.40,-9.60,7.86,0.00,1.00,-9.60,-9.60 --9.60,-9.60,7.90,0.00,1.00,-9.60,-4.80 --9.60,-4.80,7.94,0.00,1.00,-4.80,-4.80 --4.80,-4.80,7.98,0.00,1.00,-4.80,0.00 -0.00,0.00,8.02,0.00,1.00,0.00,4.80 -4.80,4.80,8.06,0.00,1.00,4.80,4.80 -9.60,4.80,8.10,0.00,1.00,4.80,9.60 -14.40,9.60,8.14,0.00,1.00,9.60,9.60 -14.40,9.60,8.18,0.00,1.00,9.60,14.40 -19.20,14.40,8.22,0.00,1.00,14.40,14.40 -24.00,14.40,8.26,0.00,1.00,14.40,19.20 -28.80,19.20,8.30,0.00,1.00,19.20,19.20 -33.60,19.20,8.34,0.00,1.00,24.00,24.00 -38.40,19.20,8.38,0.00,1.00,28.80,24.00 -43.20,24.00,8.42,0.00,1.00,28.80,24.00 -48.00,24.00,8.46,0.00,1.00,33.60,28.80 -52.80,28.80,8.50,0.00,1.00,38.40,28.80 -57.60,28.80,8.54,0.00,1.00,48.00,28.80 -62.40,28.80,8.58,0.00,1.00,52.80,33.60 -67.20,28.80,8.62,0.00,1.00,57.60,33.60 -76.80,33.60,8.66,0.00,1.00,67.20,33.60 -81.60,33.60,8.70,0.00,1.00,76.80,33.60 -86.40,33.60,8.74,0.00,1.00,81.60,33.60 -91.20,33.60,8.78,0.00,1.00,91.20,33.60 -96.00,33.60,8.82,0.00,1.00,100.80,33.60 -100.80,33.60,8.86,0.00,1.00,110.40,33.60 -110.40,28.80,8.90,0.00,1.00,115.20,33.60 -115.20,28.80,8.94,0.00,1.00,124.80,28.80 -120.00,28.80,8.98,0.00,1.00,129.60,28.80 -124.80,28.80,9.02,0.00,1.00,139.20,28.80 -129.60,24.00,9.06,0.00,1.00,144.00,24.00 -134.40,24.00,9.10,0.00,1.00,148.80,24.00 -139.20,24.00,9.14,0.00,1.00,153.60,19.20 -144.00,19.20,9.18,0.00,1.00,153.60,19.20 -148.80,19.20,9.22,0.00,1.00,158.40,14.40 -153.60,14.40,9.26,0.00,1.00,163.20,14.40 -158.40,14.40,9.30,0.00,1.00,163.20,9.60 -163.20,9.60,9.34,0.00,1.00,168.00,9.60 -168.00,9.60,9.38,0.00,1.00,172.80,4.80 -168.00,4.80,9.42,0.00,1.00,172.80,4.80 -172.80,4.80,9.46,0.00,1.00,177.60,0.00 -177.60,0.00,9.50,0.00,1.00,177.60,-0.00 --177.60,-0.00,9.54,0.00,1.00,-177.60,-4.80 --172.80,-4.80,9.58,0.00,1.00,-177.60,-4.80 --168.00,-4.80,9.62,0.00,1.00,-172.80,-9.60 --168.00,-9.60,9.66,0.00,1.00,-172.80,-9.60 --163.20,-9.60,9.70,0.00,1.00,-168.00,-14.40 --158.40,-14.40,9.74,0.00,1.00,-163.20,-14.40 --153.60,-14.40,9.78,0.00,1.00,-163.20,-19.20 --148.80,-19.20,9.82,0.00,1.00,-158.40,-19.20 --144.00,-19.20,9.86,0.00,1.00,-153.60,-24.00 --139.20,-24.00,9.90,0.00,1.00,-153.60,-24.00 --134.40,-24.00,9.94,0.00,1.00,-148.80,-28.80 --129.60,-24.00,9.98,0.00,1.00,-144.00,-28.80 --124.80,-28.80,10.03,0.00,1.00,-139.20,-28.80 --120.00,-28.80,10.07,0.00,1.00,-129.60,-33.60 --115.20,-28.80,10.11,0.00,1.00,-124.80,-33.60 --110.40,-28.80,10.15,0.00,1.00,-115.20,-33.60 --100.80,-33.60,10.19,0.00,1.00,-110.40,-33.60 --96.00,-33.60,10.23,0.00,1.00,-100.80,-33.60 --91.20,-33.60,10.27,0.00,1.00,-91.20,-33.60 --86.40,-33.60,10.31,0.00,1.00,-81.60,-33.60 --81.60,-33.60,10.35,0.00,1.00,-76.80,-33.60 --76.80,-33.60,10.39,0.00,1.00,-67.20,-33.60 --67.20,-28.80,10.43,0.00,1.00,-57.60,-28.80 --62.40,-28.80,10.47,0.00,1.00,-52.80,-28.80 --57.60,-28.80,10.51,0.00,1.00,-48.00,-28.80 --52.80,-28.80,10.55,0.00,1.00,-38.40,-24.00 --48.00,-24.00,10.59,0.00,1.00,-33.60,-24.00 --43.20,-24.00,10.63,0.00,1.00,-28.80,-24.00 --38.40,-19.20,10.67,0.00,1.00,-28.80,-19.20 --33.60,-19.20,10.71,0.00,1.00,-24.00,-19.20 --28.80,-19.20,10.75,0.00,1.00,-19.20,-14.40 --24.00,-14.40,10.79,0.00,1.00,-14.40,-14.40 --19.20,-14.40,10.83,0.00,1.00,-14.40,-9.60 --14.40,-9.60,10.87,0.00,1.00,-9.60,-9.60 --14.40,-9.60,10.91,0.00,1.00,-9.60,-4.80 --9.60,-4.80,10.95,0.00,1.00,-4.80,-4.80 --4.80,-4.80,10.99,0.00,1.00,-4.80,0.00 -0.00,0.00,11.03,0.00,1.00,0.00,0.00 -4.80,0.00,11.07,0.00,1.00,0.00,4.80 -9.60,4.80,11.11,0.00,1.00,4.80,4.80 -14.40,4.80,11.15,0.00,1.00,4.80,9.60 -19.20,9.60,11.19,0.00,1.00,9.60,9.60 -19.20,9.60,11.23,0.00,1.00,9.60,14.40 -24.00,14.40,11.27,0.00,1.00,14.40,14.40 -28.80,14.40,11.31,0.00,1.00,19.20,19.20 -33.60,14.40,11.35,0.00,1.00,19.20,19.20 -38.40,19.20,11.39,0.00,1.00,24.00,19.20 -43.20,19.20,11.43,0.00,1.00,28.80,24.00 -48.00,24.00,11.47,0.00,1.00,33.60,24.00 -52.80,24.00,11.51,0.00,1.00,38.40,24.00 -57.60,24.00,11.55,0.00,1.00,43.20,24.00 -62.40,24.00,11.59,0.00,1.00,48.00,28.80 -72.00,24.00,11.63,0.00,1.00,52.80,28.80 -76.80,28.80,11.67,0.00,1.00,62.40,28.80 -81.60,28.80,11.71,0.00,1.00,72.00,28.80 -86.40,28.80,11.75,0.00,1.00,81.60,28.80 -91.20,28.80,11.79,0.00,1.00,91.20,28.80 -96.00,28.80,11.83,0.00,1.00,100.80,28.80 -100.80,28.80,11.87,0.00,1.00,110.40,28.80 -105.60,28.80,11.91,0.00,1.00,120.00,28.80 -110.40,24.00,11.95,0.00,1.00,129.60,24.00 -120.00,24.00,11.99,0.00,1.00,134.40,24.00 -124.80,24.00,12.03,0.00,1.00,139.20,24.00 -129.60,24.00,12.07,0.00,1.00,144.00,24.00 -134.40,19.20,12.11,0.00,1.00,148.80,19.20 -139.20,19.20,12.15,0.00,1.00,153.60,19.20 -144.00,19.20,12.19,0.00,1.00,158.40,14.40 -148.80,14.40,12.23,0.00,1.00,163.20,14.40 -153.60,14.40,12.27,0.00,1.00,163.20,14.40 -158.40,9.60,12.31,0.00,1.00,168.00,9.60 -158.40,9.60,12.35,0.00,1.00,168.00,9.60 -163.20,9.60,12.39,0.00,1.00,172.80,4.80 -168.00,4.80,12.43,0.00,1.00,172.80,4.80 -172.80,4.80,12.47,0.00,1.00,177.60,0.00 -177.60,0.00,12.51,0.00,1.00,177.60,-0.00 --177.60,-0.00,12.55,0.00,1.00,-177.60,-4.80 --172.80,-4.80,12.59,0.00,1.00,-177.60,-4.80 --168.00,-4.80,12.63,0.00,1.00,-172.80,-9.60 --163.20,-9.60,12.67,0.00,1.00,-172.80,-9.60 --158.40,-9.60,12.71,0.00,1.00,-168.00,-14.40 --158.40,-9.60,12.75,0.00,1.00,-168.00,-14.40 --153.60,-14.40,12.79,0.00,1.00,-163.20,-14.40 --148.80,-14.40,12.83,0.00,1.00,-163.20,-19.20 --144.00,-19.20,12.87,0.00,1.00,-158.40,-19.20 --139.20,-19.20,12.91,0.00,1.00,-153.60,-24.00 --134.40,-19.20,12.95,0.00,1.00,-148.80,-24.00 --129.60,-24.00,12.99,0.00,1.00,-144.00,-24.00 --124.80,-24.00,13.03,0.00,1.00,-139.20,-24.00 --120.00,-24.00,13.07,0.00,1.00,-134.40,-28.80 --110.40,-24.00,13.11,0.00,1.00,-129.60,-28.80 --105.60,-28.80,13.15,0.00,1.00,-120.00,-28.80 --100.80,-28.80,13.19,0.00,1.00,-110.40,-28.80 --96.00,-28.80,13.23,0.00,1.00,-100.80,-28.80 --91.20,-28.80,13.27,0.00,1.00,-91.20,-28.80 --86.40,-28.80,13.31,0.00,1.00,-81.60,-28.80 --81.60,-28.80,13.35,0.00,1.00,-72.00,-28.80 --76.80,-28.80,13.39,0.00,1.00,-62.40,-28.80 --72.00,-24.00,13.43,0.00,1.00,-52.80,-24.00 --62.40,-24.00,13.47,0.00,1.00,-48.00,-24.00 --57.60,-24.00,13.51,0.00,1.00,-43.20,-24.00 --52.80,-24.00,13.55,0.00,1.00,-38.40,-24.00 --48.00,-24.00,13.59,0.00,1.00,-33.60,-19.20 --43.20,-19.20,13.63,0.00,1.00,-28.80,-19.20 --38.40,-19.20,13.67,0.00,1.00,-24.00,-19.20 --33.60,-14.40,13.71,0.00,1.00,-19.20,-14.40 --28.80,-14.40,13.75,0.00,1.00,-19.20,-14.40 --24.00,-14.40,13.79,0.00,1.00,-14.40,-9.60 --19.20,-9.60,13.83,0.00,1.00,-9.60,-9.60 --19.20,-9.60,13.87,0.00,1.00,-9.60,-4.80 --14.40,-4.80,13.91,0.00,1.00,-4.80,-4.80 --9.60,-4.80,13.95,0.00,1.00,-4.80,-0.00 --4.80,-0.00,13.99,0.00,1.00,-0.00,0.00 -0.00,0.00,14.04,0.00,1.00,0.00,0.00 -4.80,0.00,14.08,0.00,1.00,0.00,4.80 -9.60,4.80,14.12,0.00,1.00,4.80,4.80 -14.40,4.80,14.16,0.00,1.00,4.80,9.60 -19.20,9.60,14.20,0.00,1.00,9.60,9.60 -24.00,9.60,14.24,0.00,1.00,9.60,9.60 -28.80,9.60,14.28,0.00,1.00,14.40,14.40 -33.60,14.40,14.32,0.00,1.00,14.40,14.40 -38.40,14.40,14.36,0.00,1.00,19.20,14.40 -43.20,14.40,14.40,0.00,1.00,19.20,19.20 -48.00,14.40,14.44,0.00,1.00,24.00,19.20 -52.80,19.20,14.48,0.00,1.00,28.80,19.20 -57.60,19.20,14.52,0.00,1.00,33.60,19.20 -62.40,19.20,14.56,0.00,1.00,38.40,24.00 -67.20,19.20,14.60,0.00,1.00,43.20,24.00 -72.00,24.00,14.64,0.00,1.00,48.00,24.00 -76.80,24.00,14.68,0.00,1.00,57.60,24.00 -81.60,24.00,14.72,0.00,1.00,67.20,24.00 -86.40,24.00,14.76,0.00,1.00,81.60,24.00 -91.20,24.00,14.80,0.00,1.00,91.20,24.00 -96.00,24.00,14.84,0.00,1.00,105.60,24.00 -100.80,24.00,14.88,0.00,1.00,115.20,24.00 -105.60,24.00,14.92,0.00,1.00,124.80,24.00 -110.40,19.20,14.96,0.00,1.00,134.40,19.20 -115.20,19.20,15.00,0.00,1.00,139.20,19.20 -120.00,19.20,15.04,0.00,1.00,144.00,19.20 -124.80,19.20,15.08,0.00,1.00,148.80,19.20 -129.60,19.20,15.12,0.00,1.00,153.60,19.20 -134.40,14.40,15.16,0.00,1.00,158.40,14.40 -139.20,14.40,15.20,0.00,1.00,163.20,14.40 -144.00,14.40,15.24,0.00,1.00,163.20,14.40 -148.80,9.60,15.28,0.00,1.00,168.00,9.60 -153.60,9.60,15.32,0.00,1.00,168.00,9.60 -158.40,9.60,15.36,0.00,1.00,172.80,4.80 -163.20,4.80,15.40,0.00,1.00,172.80,4.80 -168.00,4.80,15.44,0.00,1.00,177.60,4.80 -172.80,4.80,15.48,0.00,1.00,177.60,0.00 -177.60,0.00,15.52,0.00,1.00,177.60,-0.00 --177.60,-0.00,15.56,0.00,1.00,-177.60,-4.80 --172.80,-4.80,15.60,0.00,1.00,-177.60,-4.80 --168.00,-4.80,15.64,0.00,1.00,-177.60,-4.80 --163.20,-4.80,15.68,0.00,1.00,-172.80,-9.60 --158.40,-9.60,15.72,0.00,1.00,-172.80,-9.60 --153.60,-9.60,15.76,0.00,1.00,-168.00,-14.40 --148.80,-9.60,15.80,0.00,1.00,-168.00,-14.40 --144.00,-14.40,15.84,0.00,1.00,-163.20,-14.40 --139.20,-14.40,15.88,0.00,1.00,-163.20,-19.20 --134.40,-14.40,15.92,0.00,1.00,-158.40,-19.20 --129.60,-19.20,15.96,0.00,1.00,-153.60,-19.20 --124.80,-19.20,16.00,0.00,1.00,-148.80,-19.20 --120.00,-19.20,16.00,0.00,1.00,-144.00,-19.20 --115.20,-19.20,15.96,0.00,1.00,-139.20,-24.00 --110.40,-19.20,15.92,0.00,1.00,-134.40,-24.00 --105.60,-24.00,15.88,0.00,1.00,-124.80,-24.00 --100.80,-24.00,15.84,0.00,1.00,-115.20,-24.00 --96.00,-24.00,15.80,0.00,1.00,-105.60,-24.00 --91.20,-24.00,15.76,0.00,1.00,-91.20,-24.00 --86.40,-24.00,15.72,0.00,1.00,-81.60,-24.00 --81.60,-24.00,15.68,0.00,1.00,-67.20,-24.00 --76.80,-24.00,15.64,0.00,1.00,-57.60,-24.00 --72.00,-24.00,15.60,0.00,1.00,-48.00,-24.00 --67.20,-19.20,15.56,0.00,1.00,-43.20,-19.20 --62.40,-19.20,15.52,0.00,1.00,-38.40,-19.20 --57.60,-19.20,15.48,0.00,1.00,-33.60,-19.20 --52.80,-19.20,15.44,0.00,1.00,-28.80,-19.20 --48.00,-14.40,15.40,0.00,1.00,-24.00,-14.40 --43.20,-14.40,15.36,0.00,1.00,-19.20,-14.40 --38.40,-14.40,15.32,0.00,1.00,-19.20,-14.40 --33.60,-14.40,15.28,0.00,1.00,-14.40,-9.60 --28.80,-9.60,15.24,0.00,1.00,-14.40,-9.60 --24.00,-9.60,15.20,0.00,1.00,-9.60,-9.60 --19.20,-9.60,15.16,0.00,1.00,-9.60,-4.80 --14.40,-4.80,15.12,0.00,1.00,-4.80,-4.80 --9.60,-4.80,15.08,0.00,1.00,-4.80,-0.00 --4.80,-0.00,15.04,0.00,1.00,-0.00,0.00 -0.00,0.00,15.00,0.00,1.00,0.00,0.00 -4.80,0.00,14.96,0.00,1.00,0.00,4.80 -9.60,4.80,14.92,0.00,1.00,4.80,4.80 -14.40,4.80,14.88,0.00,1.00,4.80,4.80 -19.20,4.80,14.84,0.00,1.00,4.80,9.60 -24.00,9.60,14.80,0.00,1.00,9.60,9.60 -28.80,9.60,14.76,0.00,1.00,9.60,9.60 -33.60,9.60,14.72,0.00,1.00,9.60,9.60 -38.40,9.60,14.68,0.00,1.00,14.40,14.40 -43.20,14.40,14.64,0.00,1.00,14.40,14.40 -48.00,14.40,14.60,0.00,1.00,19.20,14.40 -52.80,14.40,14.56,0.00,1.00,24.00,14.40 -57.60,14.40,14.52,0.00,1.00,24.00,19.20 -62.40,14.40,14.48,0.00,1.00,28.80,19.20 -67.20,14.40,14.44,0.00,1.00,38.40,19.20 -72.00,19.20,14.40,0.00,1.00,43.20,19.20 -76.80,19.20,14.36,0.00,1.00,52.80,19.20 -81.60,19.20,14.32,0.00,1.00,62.40,19.20 -86.40,19.20,14.28,0.00,1.00,76.80,19.20 -91.20,19.20,14.24,0.00,1.00,96.00,19.20 -96.00,19.20,14.20,0.00,1.00,110.40,19.20 -100.80,19.20,14.16,0.00,1.00,120.00,19.20 -105.60,19.20,14.12,0.00,1.00,134.40,19.20 -110.40,19.20,14.08,0.00,1.00,139.20,19.20 -115.20,14.40,14.04,0.00,1.00,148.80,14.40 -120.00,14.40,13.99,0.00,1.00,153.60,14.40 -124.80,14.40,13.95,0.00,1.00,158.40,14.40 -129.60,14.40,13.91,0.00,1.00,158.40,14.40 -134.40,14.40,13.87,0.00,1.00,163.20,14.40 -139.20,9.60,13.83,0.00,1.00,163.20,9.60 -144.00,9.60,13.79,0.00,1.00,168.00,9.60 -148.80,9.60,13.75,0.00,1.00,168.00,9.60 -153.60,9.60,13.71,0.00,1.00,172.80,4.80 -158.40,4.80,13.67,0.00,1.00,172.80,4.80 -163.20,4.80,13.63,0.00,1.00,172.80,4.80 -168.00,4.80,13.59,0.00,1.00,177.60,0.00 -172.80,0.00,13.55,0.00,1.00,177.60,0.00 -177.60,0.00,13.51,0.00,1.00,177.60,-0.00 --177.60,-0.00,13.47,0.00,1.00,-177.60,-0.00 --172.80,-0.00,13.43,0.00,1.00,-177.60,-4.80 --168.00,-4.80,13.39,0.00,1.00,-177.60,-4.80 --163.20,-4.80,13.35,0.00,1.00,-172.80,-4.80 --158.40,-4.80,13.31,0.00,1.00,-172.80,-9.60 --153.60,-9.60,13.27,0.00,1.00,-172.80,-9.60 --148.80,-9.60,13.23,0.00,1.00,-168.00,-9.60 --144.00,-9.60,13.19,0.00,1.00,-168.00,-14.40 --139.20,-9.60,13.15,0.00,1.00,-163.20,-14.40 --134.40,-14.40,13.11,0.00,1.00,-163.20,-14.40 --129.60,-14.40,13.07,0.00,1.00,-158.40,-14.40 --124.80,-14.40,13.03,0.00,1.00,-158.40,-14.40 --120.00,-14.40,12.99,0.00,1.00,-153.60,-19.20 --115.20,-14.40,12.95,0.00,1.00,-148.80,-19.20 --110.40,-19.20,12.91,0.00,1.00,-139.20,-19.20 --105.60,-19.20,12.87,0.00,1.00,-134.40,-19.20 --100.80,-19.20,12.83,0.00,1.00,-120.00,-19.20 --96.00,-19.20,12.79,0.00,1.00,-110.40,-19.20 --91.20,-19.20,12.75,0.00,1.00,-96.00,-19.20 --86.40,-19.20,12.71,0.00,1.00,-76.80,-19.20 --81.60,-19.20,12.67,0.00,1.00,-62.40,-19.20 --76.80,-19.20,12.63,0.00,1.00,-52.80,-19.20 --72.00,-19.20,12.59,0.00,1.00,-43.20,-19.20 --67.20,-14.40,12.55,0.00,1.00,-38.40,-19.20 --62.40,-14.40,12.51,0.00,1.00,-28.80,-14.40 --57.60,-14.40,12.47,0.00,1.00,-24.00,-14.40 --52.80,-14.40,12.43,0.00,1.00,-24.00,-14.40 --48.00,-14.40,12.39,0.00,1.00,-19.20,-14.40 --43.20,-14.40,12.35,0.00,1.00,-14.40,-9.60 --38.40,-9.60,12.31,0.00,1.00,-14.40,-9.60 --33.60,-9.60,12.27,0.00,1.00,-9.60,-9.60 --28.80,-9.60,12.23,0.00,1.00,-9.60,-9.60 --24.00,-9.60,12.19,0.00,1.00,-9.60,-4.80 --19.20,-4.80,12.15,0.00,1.00,-4.80,-4.80 --14.40,-4.80,12.11,0.00,1.00,-4.80,-4.80 --9.60,-4.80,12.07,0.00,1.00,-4.80,-0.00 --4.80,-0.00,12.03,0.00,1.00,-0.00,0.00 -0.00,0.00,11.99,0.00,1.00,0.00,0.00 -4.80,0.00,11.95,0.00,1.00,0.00,0.00 -9.60,0.00,11.91,0.00,1.00,0.00,4.80 -14.40,4.80,11.87,0.00,1.00,4.80,4.80 -19.20,4.80,11.83,0.00,1.00,4.80,4.80 -24.00,4.80,11.79,0.00,1.00,4.80,4.80 -28.80,4.80,11.75,0.00,1.00,4.80,9.60 -33.60,9.60,11.71,0.00,1.00,9.60,9.60 -38.40,9.60,11.67,0.00,1.00,9.60,9.60 -43.20,9.60,11.63,0.00,1.00,14.40,9.60 -48.00,9.60,11.59,0.00,1.00,14.40,9.60 -52.80,9.60,11.55,0.00,1.00,14.40,14.40 -57.60,9.60,11.51,0.00,1.00,19.20,14.40 -62.40,9.60,11.47,0.00,1.00,24.00,14.40 -67.20,14.40,11.43,0.00,1.00,28.80,14.40 -72.00,14.40,11.39,0.00,1.00,33.60,14.40 -76.80,14.40,11.35,0.00,1.00,43.20,14.40 -81.60,14.40,11.31,0.00,1.00,57.60,14.40 -86.40,14.40,11.27,0.00,1.00,76.80,14.40 -91.20,14.40,11.23,0.00,1.00,96.00,14.40 -96.00,14.40,11.19,0.00,1.00,115.20,14.40 -100.80,14.40,11.15,0.00,1.00,129.60,14.40 -105.60,14.40,11.11,0.00,1.00,139.20,14.40 -110.40,14.40,11.07,0.00,1.00,148.80,14.40 -115.20,9.60,11.03,0.00,1.00,153.60,14.40 -120.00,9.60,10.99,0.00,1.00,158.40,9.60 -124.80,9.60,10.95,0.00,1.00,163.20,9.60 -129.60,9.60,10.91,0.00,1.00,163.20,9.60 -134.40,9.60,10.87,0.00,1.00,168.00,9.60 -139.20,9.60,10.83,0.00,1.00,168.00,9.60 -144.00,9.60,10.79,0.00,1.00,172.80,9.60 -148.80,4.80,10.75,0.00,1.00,172.80,4.80 -153.60,4.80,10.71,0.00,1.00,172.80,4.80 -158.40,4.80,10.67,0.00,1.00,172.80,4.80 -163.20,4.80,10.63,0.00,1.00,177.60,4.80 -168.00,4.80,10.59,0.00,1.00,177.60,0.00 -172.80,0.00,10.55,0.00,1.00,177.60,0.00 -177.60,0.00,10.51,0.00,1.00,177.60,-0.00 --177.60,-0.00,10.47,0.00,1.00,-177.60,-0.00 --172.80,-0.00,10.43,0.00,1.00,-177.60,-4.80 --168.00,-4.80,10.39,0.00,1.00,-177.60,-4.80 --163.20,-4.80,10.35,0.00,1.00,-177.60,-4.80 --158.40,-4.80,10.31,0.00,1.00,-172.80,-4.80 --153.60,-4.80,10.27,0.00,1.00,-172.80,-9.60 --148.80,-4.80,10.23,0.00,1.00,-172.80,-9.60 --144.00,-9.60,10.19,0.00,1.00,-172.80,-9.60 --139.20,-9.60,10.15,0.00,1.00,-168.00,-9.60 --134.40,-9.60,10.11,0.00,1.00,-168.00,-9.60 --129.60,-9.60,10.07,0.00,1.00,-163.20,-9.60 --124.80,-9.60,10.03,0.00,1.00,-163.20,-14.40 --120.00,-9.60,9.98,0.00,1.00,-158.40,-14.40 --115.20,-9.60,9.94,0.00,1.00,-153.60,-14.40 --110.40,-14.40,9.90,0.00,1.00,-148.80,-14.40 --105.60,-14.40,9.86,0.00,1.00,-139.20,-14.40 --100.80,-14.40,9.82,0.00,1.00,-129.60,-14.40 --96.00,-14.40,9.78,0.00,1.00,-115.20,-14.40 --91.20,-14.40,9.74,0.00,1.00,-96.00,-14.40 --86.40,-14.40,9.70,0.00,1.00,-76.80,-14.40 --81.60,-14.40,9.66,0.00,1.00,-57.60,-14.40 --76.80,-14.40,9.62,0.00,1.00,-43.20,-14.40 --72.00,-14.40,9.58,0.00,1.00,-33.60,-14.40 --67.20,-14.40,9.54,0.00,1.00,-28.80,-14.40 --62.40,-9.60,9.50,0.00,1.00,-24.00,-14.40 --57.60,-9.60,9.46,0.00,1.00,-19.20,-9.60 --52.80,-9.60,9.42,0.00,1.00,-14.40,-9.60 --48.00,-9.60,9.38,0.00,1.00,-14.40,-9.60 --43.20,-9.60,9.34,0.00,1.00,-14.40,-9.60 --38.40,-9.60,9.30,0.00,1.00,-9.60,-9.60 --33.60,-9.60,9.26,0.00,1.00,-9.60,-4.80 --28.80,-4.80,9.22,0.00,1.00,-4.80,-4.80 --24.00,-4.80,9.18,0.00,1.00,-4.80,-4.80 --19.20,-4.80,9.14,0.00,1.00,-4.80,-4.80 --14.40,-4.80,9.10,0.00,1.00,-4.80,-0.00 --9.60,-0.00,9.06,0.00,1.00,-0.00,-0.00 --4.80,-0.00,9.02,0.00,1.00,-0.00,0.00 -0.00,0.00,8.98,0.00,1.00,0.00,0.00 -4.80,0.00,8.94,0.00,1.00,0.00,0.00 -9.60,0.00,8.90,0.00,1.00,0.00,0.00 -14.40,0.00,8.86,0.00,1.00,0.00,4.80 -19.20,4.80,8.82,0.00,1.00,4.80,4.80 -24.00,4.80,8.78,0.00,1.00,4.80,4.80 -28.80,4.80,8.74,0.00,1.00,4.80,4.80 -33.60,4.80,8.70,0.00,1.00,4.80,4.80 -38.40,4.80,8.66,0.00,1.00,4.80,4.80 -43.20,4.80,8.62,0.00,1.00,9.60,4.80 -48.00,4.80,8.58,0.00,1.00,9.60,9.60 -52.80,4.80,8.54,0.00,1.00,9.60,9.60 -57.60,4.80,8.50,0.00,1.00,14.40,9.60 -62.40,9.60,8.46,0.00,1.00,14.40,9.60 -67.20,9.60,8.42,0.00,1.00,19.20,9.60 -72.00,9.60,8.38,0.00,1.00,24.00,9.60 -76.80,9.60,8.34,0.00,1.00,33.60,9.60 -81.60,9.60,8.30,0.00,1.00,43.20,9.60 -86.40,9.60,8.26,0.00,1.00,67.20,9.60 -91.20,9.60,8.22,0.00,1.00,96.00,9.60 -96.00,9.60,8.18,0.00,1.00,124.80,9.60 -100.80,9.60,8.14,0.00,1.00,144.00,9.60 -105.60,9.60,8.10,0.00,1.00,153.60,9.60 -110.40,9.60,8.06,0.00,1.00,158.40,9.60 -115.20,9.60,8.02,0.00,1.00,163.20,9.60 -120.00,9.60,7.98,0.00,1.00,168.00,9.60 -124.80,4.80,7.94,0.00,1.00,168.00,9.60 -129.60,4.80,7.90,0.00,1.00,168.00,4.80 -134.40,4.80,7.86,0.00,1.00,172.80,4.80 -139.20,4.80,7.82,0.00,1.00,172.80,4.80 -144.00,4.80,7.78,0.00,1.00,172.80,4.80 -148.80,4.80,7.74,0.00,1.00,172.80,4.80 -153.60,4.80,7.70,0.00,1.00,177.60,4.80 -158.40,4.80,7.66,0.00,1.00,177.60,4.80 -163.20,4.80,7.62,0.00,1.00,177.60,0.00 -168.00,0.00,7.58,0.00,1.00,177.60,0.00 -172.80,0.00,7.54,0.00,1.00,177.60,0.00 -177.60,0.00,7.50,0.00,1.00,177.60,-0.00 --177.60,-0.00,7.46,0.00,1.00,-177.60,-0.00 --172.80,-0.00,7.42,0.00,1.00,-177.60,-0.00 --168.00,-0.00,7.38,0.00,1.00,-177.60,-4.80 --163.20,-4.80,7.34,0.00,1.00,-177.60,-4.80 --158.40,-4.80,7.30,0.00,1.00,-177.60,-4.80 --153.60,-4.80,7.26,0.00,1.00,-177.60,-4.80 --148.80,-4.80,7.22,0.00,1.00,-172.80,-4.80 --144.00,-4.80,7.18,0.00,1.00,-172.80,-4.80 --139.20,-4.80,7.14,0.00,1.00,-172.80,-4.80 --134.40,-4.80,7.10,0.00,1.00,-172.80,-9.60 --129.60,-4.80,7.06,0.00,1.00,-168.00,-9.60 --124.80,-4.80,7.02,0.00,1.00,-168.00,-9.60 --120.00,-9.60,6.98,0.00,1.00,-168.00,-9.60 --115.20,-9.60,6.94,0.00,1.00,-163.20,-9.60 --110.40,-9.60,6.90,0.00,1.00,-158.40,-9.60 --105.60,-9.60,6.86,0.00,1.00,-153.60,-9.60 --100.80,-9.60,6.82,0.00,1.00,-144.00,-9.60 --96.00,-9.60,6.78,0.00,1.00,-124.80,-9.60 --91.20,-9.60,6.74,0.00,1.00,-96.00,-9.60 --86.40,-9.60,6.70,0.00,1.00,-67.20,-9.60 --81.60,-9.60,6.66,0.00,1.00,-43.20,-9.60 --76.80,-9.60,6.62,0.00,1.00,-33.60,-9.60 --72.00,-9.60,6.58,0.00,1.00,-24.00,-9.60 --67.20,-9.60,6.54,0.00,1.00,-19.20,-9.60 --62.40,-9.60,6.50,0.00,1.00,-14.40,-9.60 --57.60,-4.80,6.46,0.00,1.00,-14.40,-9.60 --52.80,-4.80,6.42,0.00,1.00,-9.60,-4.80 --48.00,-4.80,6.38,0.00,1.00,-9.60,-4.80 --43.20,-4.80,6.34,0.00,1.00,-9.60,-4.80 --38.40,-4.80,6.30,0.00,1.00,-4.80,-4.80 --33.60,-4.80,6.26,0.00,1.00,-4.80,-4.80 --28.80,-4.80,6.22,0.00,1.00,-4.80,-4.80 --24.00,-4.80,6.18,0.00,1.00,-4.80,-4.80 --19.20,-4.80,6.14,0.00,1.00,-4.80,-0.00 --14.40,-0.00,6.10,0.00,1.00,-0.00,-0.00 --9.60,-0.00,6.06,0.00,1.00,-0.00,-0.00 --4.80,-0.00,6.02,0.00,1.00,-0.00,0.00 -0.00,0.00,5.97,0.00,1.00,0.00,0.00 -4.80,0.00,5.93,0.00,1.00,0.00,0.00 -9.60,0.00,5.89,0.00,1.00,0.00,0.00 -14.40,0.00,5.85,0.00,1.00,0.00,0.00 -19.20,0.00,5.81,0.00,1.00,0.00,0.00 -24.00,0.00,5.77,0.00,1.00,0.00,0.00 -28.80,0.00,5.73,0.00,1.00,0.00,4.80 -33.60,0.00,5.69,0.00,1.00,0.00,4.80 -38.40,0.00,5.65,0.00,1.00,4.80,4.80 -43.20,4.80,5.61,0.00,1.00,4.80,4.80 -48.00,4.80,5.57,0.00,1.00,4.80,4.80 -52.80,4.80,5.53,0.00,1.00,4.80,4.80 -57.60,4.80,5.49,0.00,1.00,4.80,4.80 -62.40,4.80,5.45,0.00,1.00,4.80,4.80 -67.20,4.80,5.41,0.00,1.00,9.60,4.80 -72.00,4.80,5.37,0.00,1.00,9.60,4.80 -76.80,4.80,5.33,0.00,1.00,14.40,4.80 -81.60,4.80,5.29,0.00,1.00,24.00,4.80 -86.40,4.80,5.25,0.00,1.00,43.20,4.80 -91.20,4.80,5.21,0.00,1.00,110.40,4.80 -96.00,4.80,5.17,0.00,1.00,148.80,4.80 -100.80,4.80,5.13,0.00,1.00,163.20,4.80 -105.60,4.80,5.09,0.00,1.00,168.00,4.80 -110.40,4.80,5.05,0.00,1.00,172.80,4.80 -115.20,4.80,5.01,0.00,1.00,172.80,4.80 -120.00,4.80,4.97,0.00,1.00,172.80,4.80 -124.80,4.80,4.93,0.00,1.00,172.80,4.80 -129.60,4.80,4.89,0.00,1.00,177.60,4.80 -134.40,4.80,4.85,0.00,1.00,177.60,4.80 -139.20,0.00,4.81,0.00,1.00,177.60,4.80 -144.00,0.00,4.77,0.00,1.00,177.60,4.80 -148.80,0.00,4.73,0.00,1.00,177.60,0.00 -153.60,0.00,4.69,0.00,1.00,177.60,0.00 -158.40,0.00,4.65,0.00,1.00,177.60,0.00 -163.20,0.00,4.61,0.00,1.00,177.60,0.00 -168.00,0.00,4.57,0.00,1.00,177.60,0.00 -172.80,0.00,4.53,0.00,1.00,177.60,0.00 -177.60,0.00,4.49,0.00,1.00,177.60,-0.00 --177.60,-0.00,4.45,0.00,1.00,-177.60,-0.00 --172.80,-0.00,4.41,0.00,1.00,-177.60,-0.00 --168.00,-0.00,4.37,0.00,1.00,-177.60,-0.00 --163.20,-0.00,4.33,0.00,1.00,-177.60,-0.00 --158.40,-0.00,4.29,0.00,1.00,-177.60,-0.00 --153.60,-0.00,4.25,0.00,1.00,-177.60,-4.80 --148.80,-0.00,4.21,0.00,1.00,-177.60,-4.80 --144.00,-0.00,4.17,0.00,1.00,-177.60,-4.80 --139.20,-0.00,4.13,0.00,1.00,-177.60,-4.80 --134.40,-4.80,4.09,0.00,1.00,-177.60,-4.80 --129.60,-4.80,4.05,0.00,1.00,-177.60,-4.80 --124.80,-4.80,4.01,0.00,1.00,-172.80,-4.80 --120.00,-4.80,3.97,0.00,1.00,-172.80,-4.80 --115.20,-4.80,3.93,0.00,1.00,-172.80,-4.80 --110.40,-4.80,3.89,0.00,1.00,-172.80,-4.80 --105.60,-4.80,3.85,0.00,1.00,-168.00,-4.80 --100.80,-4.80,3.81,0.00,1.00,-163.20,-4.80 --96.00,-4.80,3.77,0.00,1.00,-148.80,-4.80 --91.20,-4.80,3.73,0.00,1.00,-110.40,-4.80 --86.40,-4.80,3.69,0.00,1.00,-43.20,-4.80 --81.60,-4.80,3.65,0.00,1.00,-24.00,-4.80 --76.80,-4.80,3.61,0.00,1.00,-14.40,-4.80 --72.00,-4.80,3.57,0.00,1.00,-9.60,-4.80 --67.20,-4.80,3.53,0.00,1.00,-9.60,-4.80 --62.40,-4.80,3.49,0.00,1.00,-4.80,-4.80 --57.60,-4.80,3.45,0.00,1.00,-4.80,-4.80 --52.80,-4.80,3.41,0.00,1.00,-4.80,-4.80 --48.00,-4.80,3.37,0.00,1.00,-4.80,-4.80 --43.20,-4.80,3.33,0.00,1.00,-4.80,-4.80 --38.40,-0.00,3.29,0.00,1.00,-4.80,-4.80 --33.60,-0.00,3.25,0.00,1.00,-0.00,-0.00 --28.80,-0.00,3.21,0.00,1.00,-0.00,-0.00 --24.00,-0.00,3.17,0.00,1.00,-0.00,-0.00 --19.20,-0.00,3.13,0.00,1.00,-0.00,-0.00 --14.40,-0.00,3.09,0.00,1.00,-0.00,-0.00 --9.60,-0.00,3.05,0.00,1.00,-0.00,-0.00 --4.80,-0.00,3.01,0.00,1.00,-0.00,0.00 -0.00,0.00,2.97,0.00,1.00,-0.00,0.00 -4.80,-0.00,2.93,0.00,1.00,-0.00,0.00 -9.60,-0.00,2.89,0.00,1.00,-0.00,0.00 -14.40,-0.00,2.85,0.00,1.00,-0.00,0.00 -19.20,-0.00,2.81,0.00,1.00,-0.00,0.00 -24.00,-0.00,2.77,0.00,1.00,-0.00,0.00 -28.80,-0.00,2.73,0.00,1.00,-0.00,0.00 -33.60,-0.00,2.69,0.00,1.00,-0.00,0.00 -38.40,-0.00,2.65,0.00,1.00,-0.00,0.00 -43.20,-0.00,2.61,0.00,1.00,-0.00,0.00 -48.00,-0.00,2.57,0.00,1.00,-0.00,0.00 -52.80,-0.00,2.53,0.00,1.00,-0.00,0.00 -57.60,-0.00,2.49,0.00,1.00,-0.00,0.00 -62.40,-0.00,2.45,0.00,1.00,-0.00,0.00 -67.20,-0.00,2.41,0.00,1.00,-4.80,0.00 -72.00,-0.00,2.37,0.00,1.00,-4.80,0.00 -76.80,-0.00,2.33,0.00,1.00,-4.80,0.00 -81.60,-0.00,2.29,0.00,1.00,-9.60,0.00 -86.40,-0.00,2.25,0.00,1.00,-19.20,0.00 -91.20,-0.00,2.21,0.00,1.00,-134.40,0.00 -96.00,-0.00,2.17,0.00,1.00,-168.00,0.00 -100.80,-0.00,2.13,0.00,1.00,-172.80,0.00 -105.60,-0.00,2.09,0.00,1.00,-177.60,0.00 -110.40,-0.00,2.05,0.00,1.00,-177.60,0.00 -115.20,-0.00,2.01,0.00,1.00,-177.60,0.00 -120.00,-0.00,1.96,0.00,1.00,-177.60,0.00 -124.80,-0.00,1.92,0.00,1.00,-177.60,0.00 -129.60,-0.00,1.88,0.00,1.00,-177.60,0.00 -134.40,-0.00,1.84,0.00,1.00,-177.60,0.00 -139.20,-0.00,1.80,0.00,1.00,-177.60,0.00 -144.00,-0.00,1.76,0.00,1.00,-177.60,0.00 -148.80,-0.00,1.72,0.00,1.00,-177.60,0.00 -153.60,-0.00,1.68,0.00,1.00,-177.60,0.00 -158.40,-0.00,1.64,0.00,1.00,-177.60,0.00 -163.20,-0.00,1.60,0.00,1.00,-177.60,0.00 -168.00,-0.00,1.56,0.00,1.00,-177.60,0.00 -172.80,-0.00,1.52,0.00,1.00,-177.60,0.00 -177.60,-0.00,1.48,0.00,1.00,-177.60,0.00 --177.60,0.00,1.44,0.00,1.00,177.60,0.00 --172.80,0.00,1.40,0.00,1.00,177.60,0.00 --168.00,0.00,1.36,0.00,1.00,177.60,0.00 --163.20,0.00,1.32,0.00,1.00,177.60,0.00 --158.40,0.00,1.28,0.00,1.00,177.60,0.00 --153.60,0.00,1.24,0.00,1.00,177.60,0.00 --148.80,0.00,1.20,0.00,1.00,177.60,0.00 --144.00,0.00,1.16,0.00,1.00,177.60,0.00 --139.20,0.00,1.12,0.00,1.00,177.60,0.00 --134.40,0.00,1.08,0.00,1.00,177.60,0.00 --129.60,0.00,1.04,0.00,1.00,177.60,0.00 --124.80,0.00,1.00,0.00,1.00,177.60,0.00 --120.00,0.00,0.96,0.00,1.00,177.60,0.00 --115.20,0.00,0.92,0.00,1.00,177.60,0.00 --110.40,0.00,0.88,0.00,1.00,177.60,0.00 --105.60,0.00,0.84,0.00,1.00,177.60,0.00 --100.80,0.00,0.80,0.00,1.00,172.80,0.00 --96.00,0.00,0.76,0.00,1.00,168.00,0.00 --91.20,0.00,0.72,0.00,1.00,134.40,0.00 --86.40,0.00,0.68,0.00,1.00,19.20,0.00 --81.60,0.00,0.64,0.00,1.00,9.60,0.00 --76.80,0.00,0.60,0.00,1.00,4.80,0.00 --72.00,0.00,0.56,0.00,1.00,4.80,0.00 --67.20,0.00,0.52,0.00,1.00,4.80,0.00 --62.40,0.00,0.48,0.00,1.00,0.00,0.00 --57.60,0.00,0.44,0.00,1.00,0.00,0.00 --52.80,0.00,0.40,0.00,1.00,0.00,0.00 --48.00,0.00,0.36,0.00,1.00,0.00,0.00 --43.20,0.00,0.32,0.00,1.00,0.00,0.00 --38.40,0.00,0.28,0.00,1.00,0.00,0.00 --33.60,0.00,0.24,0.00,1.00,0.00,0.00 --28.80,0.00,0.20,0.00,1.00,0.00,0.00 --24.00,0.00,0.16,0.00,1.00,0.00,0.00 --19.20,0.00,0.12,0.00,1.00,0.00,0.00 --14.40,0.00,0.08,0.00,1.00,0.00,0.00 --9.60,0.00,0.04,0.00,1.00,0.00,0.00 --4.80,0.00,0.00,0.00,1.00,0.00,0.00 +-0.00,0.00,0.00,0.00,1.00,0.00,4.80,0 +-0.00,4.80,0.06,0.00,1.00,4.80,9.60,0 +-0.00,9.60,0.13,0.00,1.00,9.60,14.40,0 +-0.00,14.40,0.19,0.00,1.00,14.40,19.20,0 +-0.00,19.20,0.26,0.00,1.00,19.20,24.00,0 +-0.00,24.00,0.32,0.00,1.00,24.00,28.80,0 +-0.00,28.80,0.39,0.00,1.00,28.80,33.60,0 +-0.00,33.60,0.45,0.00,1.00,33.60,38.40,0 +-0.00,38.40,0.51,0.00,1.00,38.40,43.20,0 +-0.00,43.20,0.58,0.00,1.00,43.20,48.00,0 +-0.00,48.00,0.64,0.00,1.00,48.00,52.80,0 +-0.00,52.80,0.71,0.00,1.00,52.80,57.60,0 +-0.00,57.60,0.77,0.00,1.00,57.60,62.40,0 +-0.00,62.40,0.84,0.00,1.00,62.40,67.20,0 +-0.00,67.20,0.90,0.00,1.00,67.20,72.00,0 +-0.00,72.00,0.96,0.00,1.00,72.00,76.80,0 +-0.00,76.80,1.03,0.00,1.00,76.80,81.60,0 +-0.00,81.60,1.09,0.00,1.00,81.60,86.40,0 +-0.00,86.40,1.16,0.00,1.00,86.40,86.40,0 +-177.60,89.20,1.22,0.00,1.00,91.20,81.60,0 +-177.60,86.40,1.29,0.00,1.00,96.00,76.80,0 +-177.60,81.60,1.35,0.00,1.00,100.80,72.00,0 +-177.60,76.80,1.41,0.00,1.00,105.60,67.20,0 +-177.60,72.00,1.48,0.00,1.00,110.40,62.40,0 +-177.60,67.20,1.54,0.00,1.00,115.20,57.60,0 +177.60,62.40,1.61,0.00,1.00,120.00,52.80,0 +177.60,57.60,1.67,0.00,1.00,124.80,48.00,0 +177.60,52.80,1.73,0.00,1.00,129.60,43.20,0 +177.60,48.00,1.80,0.00,1.00,134.40,38.40,0 +177.60,43.20,1.86,0.00,1.00,139.20,33.60,0 +177.60,38.40,1.93,0.00,1.00,144.00,28.80,0 +177.60,33.60,1.99,0.00,1.00,148.80,24.00,0 +177.60,28.80,2.06,0.00,1.00,153.60,19.20,0 +177.60,24.00,2.12,0.00,1.00,158.40,14.40,0 +177.60,19.20,2.18,0.00,1.00,163.20,9.60,0 +177.60,14.40,2.25,0.00,1.00,168.00,4.80,0 +177.60,9.60,2.31,0.00,1.00,172.80,0.00,0 +177.60,4.80,2.38,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,2.44,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,2.51,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,2.57,0.00,1.00,-168.00,-14.40,0 +-177.60,-14.40,2.63,0.00,1.00,-163.20,-19.20,0 +-177.60,-19.20,2.70,0.00,1.00,-158.40,-24.00,0 +-177.60,-24.00,2.76,0.00,1.00,-153.60,-28.80,0 +-177.60,-28.80,2.83,0.00,1.00,-148.80,-33.60,0 +-177.60,-33.60,2.89,0.00,1.00,-144.00,-38.40,0 +-177.60,-38.40,2.96,0.00,1.00,-139.20,-43.20,0 +-177.60,-48.00,3.02,0.00,1.00,-134.40,-48.00,0 +-177.60,-48.00,3.08,0.00,1.00,-129.60,-52.80,0 +-177.60,-52.80,3.15,0.00,1.00,-124.80,-57.60,0 +-177.60,-57.60,3.21,0.00,1.00,-120.00,-62.40,0 +177.60,-62.40,3.28,0.00,1.00,-115.20,-67.20,0 +177.60,-67.20,3.34,0.00,1.00,-110.40,-72.00,0 +177.60,-76.80,3.41,0.00,1.00,-105.60,-76.80,0 +177.60,-76.80,3.47,0.00,1.00,-100.80,-81.60,0 +177.60,-86.40,3.53,0.00,1.00,-96.00,-86.40,0 +177.60,-89.20,3.60,0.00,1.00,-91.20,-86.40,0 +0.00,-86.40,3.66,0.00,1.00,-86.40,-81.60,0 +0.00,-81.60,3.73,0.00,1.00,-81.60,-76.80,0 +0.00,-76.80,3.79,0.00,1.00,-76.80,-72.00,0 +0.00,-72.00,3.86,0.00,1.00,-72.00,-67.20,0 +0.00,-67.20,3.92,0.00,1.00,-67.20,-62.40,0 +0.00,-62.40,3.98,0.00,1.00,-62.40,-57.60,0 +0.00,-57.60,4.05,0.00,1.00,-57.60,-52.80,0 +0.00,-52.80,4.11,0.00,1.00,-52.80,-48.00,0 +0.00,-48.00,4.18,0.00,1.00,-48.00,-43.20,0 +0.00,-43.20,4.24,0.00,1.00,-43.20,-38.40,0 +0.00,-38.40,4.31,0.00,1.00,-38.40,-33.60,0 +0.00,-33.60,4.37,0.00,1.00,-33.60,-28.80,0 +0.00,-28.80,4.43,0.00,1.00,-28.80,-24.00,0 +0.00,-24.00,4.50,0.00,1.00,-24.00,-19.20,0 +0.00,-19.20,4.56,0.00,1.00,-19.20,-14.40,0 +0.00,-14.40,4.63,0.00,1.00,-14.40,-9.60,0 +0.00,-9.60,4.69,0.00,1.00,-9.60,-4.80,0 +0.00,-4.80,4.76,0.00,1.00,-4.80,0.00,0 +0.00,0.00,4.82,0.00,1.00,0.00,4.80,0 +0.00,4.80,4.88,0.00,1.00,4.80,9.60,0 +0.00,9.60,4.95,0.00,1.00,9.60,14.40,0 +0.00,14.40,5.01,0.00,1.00,14.40,19.20,0 +0.00,19.20,5.08,0.00,1.00,19.20,24.00,0 +0.00,24.00,5.14,0.00,1.00,24.00,28.80,0 +4.80,28.80,5.20,0.00,1.00,28.80,33.60,0 +4.80,33.60,5.27,0.00,1.00,33.60,38.40,0 +4.80,38.40,5.33,0.00,1.00,38.40,43.20,0 +4.80,43.20,5.40,0.00,1.00,43.20,48.00,0 +4.80,48.00,5.46,0.00,1.00,48.00,52.80,0 +4.80,52.80,5.53,0.00,1.00,52.80,57.60,0 +9.60,57.60,5.59,0.00,1.00,57.60,62.40,0 +9.60,62.40,5.65,0.00,1.00,62.40,67.20,0 +9.60,67.20,5.72,0.00,1.00,67.20,72.00,0 +14.40,72.00,5.78,0.00,1.00,72.00,76.80,0 +19.20,76.80,5.85,0.00,1.00,76.80,81.60,0 +28.80,81.60,5.91,0.00,1.00,81.60,86.40,0 +52.80,86.40,5.98,0.00,1.00,86.40,86.40,0 +105.60,86.40,6.04,0.00,1.00,91.20,81.60,0 +139.20,81.60,6.10,0.00,1.00,96.00,76.80,0 +158.40,76.80,6.17,0.00,1.00,100.80,72.00,0 +163.20,72.00,6.23,0.00,1.00,105.60,67.20,0 +168.00,67.20,6.30,0.00,1.00,110.40,62.40,0 +168.00,62.40,6.36,0.00,1.00,115.20,57.60,0 +172.80,57.60,6.43,0.00,1.00,120.00,52.80,0 +172.80,52.80,6.49,0.00,1.00,124.80,48.00,0 +172.80,48.00,6.55,0.00,1.00,129.60,43.20,0 +172.80,43.20,6.62,0.00,1.00,134.40,38.40,0 +177.60,38.40,6.68,0.00,1.00,139.20,33.60,0 +177.60,33.60,6.75,0.00,1.00,144.00,28.80,0 +177.60,28.80,6.81,0.00,1.00,148.80,24.00,0 +177.60,24.00,6.88,0.00,1.00,153.60,19.20,0 +177.60,19.20,6.94,0.00,1.00,158.40,14.40,0 +177.60,14.40,7.00,0.00,1.00,163.20,9.60,0 +177.60,9.60,7.07,0.00,1.00,168.00,4.80,0 +177.60,4.80,7.13,0.00,1.00,172.80,0.00,0 +177.60,0.00,7.20,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,7.26,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,7.33,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,7.39,0.00,1.00,-168.00,-14.40,0 +-177.60,-14.40,7.45,0.00,1.00,-163.20,-19.20,0 +-177.60,-19.20,7.52,0.00,1.00,-158.40,-24.00,0 +-177.60,-24.00,7.58,0.00,1.00,-153.60,-28.80,0 +-177.60,-28.80,7.65,0.00,1.00,-148.80,-33.60,0 +-177.60,-33.60,7.71,0.00,1.00,-144.00,-38.40,0 +-177.60,-38.40,7.78,0.00,1.00,-139.20,-43.20,0 +-172.80,-43.20,7.84,0.00,1.00,-134.40,-48.00,0 +-172.80,-48.00,7.90,0.00,1.00,-129.60,-52.80,0 +-172.80,-52.80,7.97,0.00,1.00,-124.80,-57.60,0 +-172.80,-57.60,8.03,0.00,1.00,-120.00,-62.40,0 +-168.00,-62.40,8.10,0.00,1.00,-115.20,-67.20,0 +-168.00,-67.20,8.16,0.00,1.00,-110.40,-72.00,0 +-163.20,-72.00,8.22,0.00,1.00,-105.60,-76.80,0 +-158.40,-76.80,8.29,0.00,1.00,-100.80,-81.60,0 +-139.20,-81.60,8.35,0.00,1.00,-96.00,-86.40,0 +-105.60,-86.40,8.42,0.00,1.00,-91.20,-86.40,0 +-52.80,-86.40,8.48,0.00,1.00,-86.40,-81.60,0 +-28.80,-81.60,8.55,0.00,1.00,-81.60,-76.80,0 +-19.20,-76.80,8.61,0.00,1.00,-76.80,-72.00,0 +-14.40,-72.00,8.67,0.00,1.00,-72.00,-67.20,0 +-9.60,-67.20,8.74,0.00,1.00,-67.20,-62.40,0 +-9.60,-62.40,8.80,0.00,1.00,-62.40,-57.60,0 +-9.60,-57.60,8.87,0.00,1.00,-57.60,-52.80,0 +-4.80,-52.80,8.93,0.00,1.00,-52.80,-48.00,0 +-4.80,-48.00,9.00,0.00,1.00,-48.00,-43.20,0 +-4.80,-43.20,9.06,0.00,1.00,-43.20,-38.40,0 +-4.80,-38.40,9.12,0.00,1.00,-38.40,-33.60,0 +-4.80,-33.60,9.19,0.00,1.00,-33.60,-28.80,0 +-4.80,-28.80,9.25,0.00,1.00,-28.80,-24.00,0 +-0.00,-24.00,9.32,0.00,1.00,-24.00,-19.20,0 +-0.00,-19.20,9.38,0.00,1.00,-19.20,-14.40,0 +-0.00,-14.40,9.45,0.00,1.00,-14.40,-9.60,0 +-0.00,-9.60,9.51,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,9.57,0.00,1.00,-4.80,0.00,0 +0.00,0.00,9.64,0.00,1.00,0.00,4.80,0 +0.00,4.80,9.70,0.00,1.00,4.80,9.60,0 +0.00,9.60,9.77,0.00,1.00,9.60,14.40,0 +4.80,14.40,9.83,0.00,1.00,14.40,19.20,0 +4.80,19.20,9.90,0.00,1.00,19.20,24.00,0 +4.80,24.00,9.96,0.00,1.00,24.00,28.80,0 +4.80,28.80,10.02,0.00,1.00,28.80,33.60,0 +4.80,33.60,10.09,0.00,1.00,33.60,38.40,0 +9.60,38.40,10.15,0.00,1.00,38.40,43.20,0 +9.60,43.20,10.22,0.00,1.00,43.20,48.00,0 +9.60,48.00,10.28,0.00,1.00,48.00,52.80,0 +14.40,52.80,10.35,0.00,1.00,52.80,57.60,0 +14.40,57.60,10.41,0.00,1.00,57.60,62.40,0 +19.20,62.40,10.47,0.00,1.00,62.40,67.20,0 +24.00,67.20,10.54,0.00,1.00,67.20,72.00,0 +28.80,72.00,10.60,0.00,1.00,72.00,72.00,0 +33.60,72.00,10.67,0.00,1.00,76.80,76.80,0 +48.00,76.80,10.73,0.00,1.00,81.60,81.60,0 +67.20,81.60,10.80,0.00,1.00,86.40,81.60,0 +96.00,81.60,10.86,0.00,1.00,91.20,81.60,0 +120.00,76.80,10.92,0.00,1.00,96.00,76.80,0 +139.20,76.80,10.99,0.00,1.00,100.80,72.00,0 +148.80,72.00,11.05,0.00,1.00,105.60,67.20,0 +153.60,67.20,11.12,0.00,1.00,110.40,62.40,0 +158.40,62.40,11.18,0.00,1.00,115.20,57.60,0 +163.20,57.60,11.24,0.00,1.00,120.00,52.80,0 +168.00,52.80,11.31,0.00,1.00,124.80,48.00,0 +168.00,48.00,11.37,0.00,1.00,129.60,43.20,0 +168.00,43.20,11.44,0.00,1.00,134.40,38.40,0 +172.80,38.40,11.50,0.00,1.00,139.20,33.60,0 +172.80,33.60,11.57,0.00,1.00,144.00,28.80,0 +172.80,28.80,11.63,0.00,1.00,148.80,24.00,0 +177.60,24.00,11.69,0.00,1.00,153.60,19.20,0 +177.60,19.20,11.76,0.00,1.00,158.40,14.40,0 +177.60,14.40,11.82,0.00,1.00,163.20,9.60,0 +177.60,9.60,11.89,0.00,1.00,168.00,4.80,0 +177.60,4.80,11.95,0.00,1.00,172.80,0.00,0 +177.60,0.00,12.02,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,12.08,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,12.14,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,12.21,0.00,1.00,-168.00,-14.40,0 +-177.60,-14.40,12.27,0.00,1.00,-163.20,-19.20,0 +-177.60,-19.20,12.34,0.00,1.00,-158.40,-24.00,0 +-177.60,-24.00,12.40,0.00,1.00,-153.60,-28.80,0 +-172.80,-28.80,12.47,0.00,1.00,-148.80,-33.60,0 +-172.80,-33.60,12.53,0.00,1.00,-144.00,-38.40,0 +-172.80,-38.40,12.59,0.00,1.00,-139.20,-43.20,0 +-168.00,-43.20,12.66,0.00,1.00,-134.40,-48.00,0 +-168.00,-48.00,12.72,0.00,1.00,-129.60,-52.80,0 +-168.00,-52.80,12.79,0.00,1.00,-124.80,-57.60,0 +-163.20,-57.60,12.85,0.00,1.00,-120.00,-62.40,0 +-158.40,-62.40,12.92,0.00,1.00,-115.20,-67.20,0 +-153.60,-67.20,12.98,0.00,1.00,-110.40,-72.00,0 +-148.80,-72.00,13.04,0.00,1.00,-105.60,-76.80,0 +-139.20,-76.80,13.11,0.00,1.00,-100.80,-81.60,0 +-120.00,-76.80,13.17,0.00,1.00,-96.00,-81.60,0 +-96.00,-81.60,13.24,0.00,1.00,-91.20,-81.60,0 +-67.20,-81.60,13.30,0.00,1.00,-86.40,-76.80,0 +-48.00,-76.80,13.37,0.00,1.00,-81.60,-72.00,0 +-33.60,-72.00,13.43,0.00,1.00,-76.80,-72.00,0 +-28.80,-72.00,13.49,0.00,1.00,-72.00,-67.20,0 +-24.00,-67.20,13.56,0.00,1.00,-67.20,-62.40,0 +-19.20,-62.40,13.62,0.00,1.00,-62.40,-57.60,0 +-14.40,-57.60,13.69,0.00,1.00,-57.60,-52.80,0 +-14.40,-52.80,13.75,0.00,1.00,-52.80,-48.00,0 +-9.60,-48.00,13.82,0.00,1.00,-48.00,-43.20,0 +-9.60,-43.20,13.88,0.00,1.00,-43.20,-38.40,0 +-9.60,-38.40,13.94,0.00,1.00,-38.40,-33.60,0 +-4.80,-33.60,14.01,0.00,1.00,-33.60,-28.80,0 +-4.80,-28.80,14.07,0.00,1.00,-28.80,-24.00,0 +-4.80,-24.00,14.14,0.00,1.00,-24.00,-19.20,0 +-4.80,-19.20,14.20,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,14.27,0.00,1.00,-14.40,-9.60,0 +-0.00,-9.60,14.33,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,14.39,0.00,1.00,-4.80,0.00,0 +0.00,0.00,14.46,0.00,1.00,0.00,4.80,0 +0.00,4.80,14.52,0.00,1.00,4.80,9.60,0 +4.80,9.60,14.59,0.00,1.00,9.60,14.40,0 +4.80,14.40,14.65,0.00,1.00,14.40,19.20,0 +4.80,19.20,14.71,0.00,1.00,19.20,24.00,0 +4.80,24.00,14.78,0.00,1.00,24.00,28.80,0 +9.60,28.80,14.84,0.00,1.00,28.80,33.60,0 +9.60,33.60,14.91,0.00,1.00,33.60,38.40,0 +9.60,38.40,14.97,0.00,1.00,38.40,43.20,0 +14.40,43.20,15.04,0.00,1.00,43.20,48.00,0 +14.40,48.00,15.10,0.00,1.00,48.00,52.80,0 +19.20,52.80,15.16,0.00,1.00,52.80,57.60,0 +19.20,52.80,15.23,0.00,1.00,57.60,57.60,0 +24.00,57.60,15.29,0.00,1.00,62.40,62.40,0 +28.80,62.40,15.36,0.00,1.00,67.20,67.20,0 +38.40,67.20,15.42,0.00,1.00,72.00,72.00,0 +48.00,72.00,15.49,0.00,1.00,76.80,72.00,0 +57.60,72.00,15.55,0.00,1.00,81.60,76.80,0 +76.80,76.80,15.61,0.00,1.00,86.40,76.80,0 +96.00,76.80,15.68,0.00,1.00,91.20,76.80,0 +115.20,76.80,15.74,0.00,1.00,96.00,72.00,0 +129.60,72.00,15.81,0.00,1.00,100.80,72.00,0 +139.20,67.20,15.87,0.00,1.00,105.60,67.20,0 +144.00,67.20,15.94,0.00,1.00,110.40,62.40,0 +153.60,62.40,16.00,0.00,1.00,115.20,57.60,0 +158.40,57.60,16.00,0.00,1.00,120.00,52.80,0 +158.40,52.80,15.94,0.00,1.00,124.80,48.00,0 +163.20,48.00,15.87,0.00,1.00,129.60,43.20,0 +168.00,43.20,15.81,0.00,1.00,134.40,38.40,0 +168.00,38.40,15.74,0.00,1.00,139.20,33.60,0 +168.00,33.60,15.68,0.00,1.00,144.00,28.80,0 +172.80,28.80,15.61,0.00,1.00,148.80,24.00,0 +172.80,24.00,15.55,0.00,1.00,153.60,19.20,0 +172.80,19.20,15.49,0.00,1.00,158.40,14.40,0 +177.60,14.40,15.42,0.00,1.00,163.20,9.60,0 +177.60,9.60,15.36,0.00,1.00,168.00,4.80,0 +177.60,4.80,15.29,0.00,1.00,172.80,0.00,0 +177.60,0.00,15.23,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,15.16,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,15.10,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,15.04,0.00,1.00,-168.00,-14.40,0 +-177.60,-14.40,14.97,0.00,1.00,-163.20,-19.20,0 +-172.80,-19.20,14.91,0.00,1.00,-158.40,-24.00,0 +-172.80,-24.00,14.84,0.00,1.00,-153.60,-28.80,0 +-172.80,-28.80,14.78,0.00,1.00,-148.80,-33.60,0 +-168.00,-33.60,14.71,0.00,1.00,-144.00,-38.40,0 +-168.00,-38.40,14.65,0.00,1.00,-139.20,-43.20,0 +-168.00,-43.20,14.59,0.00,1.00,-134.40,-48.00,0 +-163.20,-48.00,14.52,0.00,1.00,-129.60,-52.80,0 +-158.40,-52.80,14.46,0.00,1.00,-124.80,-57.60,0 +-158.40,-57.60,14.39,0.00,1.00,-120.00,-62.40,0 +-153.60,-62.40,14.33,0.00,1.00,-115.20,-67.20,0 +-144.00,-67.20,14.27,0.00,1.00,-110.40,-72.00,0 +-139.20,-67.20,14.20,0.00,1.00,-105.60,-72.00,0 +-129.60,-72.00,14.14,0.00,1.00,-100.80,-76.80,0 +-115.20,-76.80,14.07,0.00,1.00,-96.00,-76.80,0 +-96.00,-76.80,14.01,0.00,1.00,-91.20,-76.80,0 +-76.80,-76.80,13.94,0.00,1.00,-86.40,-72.00,0 +-57.60,-72.00,13.88,0.00,1.00,-81.60,-72.00,0 +-48.00,-72.00,13.82,0.00,1.00,-76.80,-67.20,0 +-38.40,-67.20,13.75,0.00,1.00,-72.00,-62.40,0 +-28.80,-62.40,13.69,0.00,1.00,-67.20,-57.60,0 +-24.00,-57.60,13.62,0.00,1.00,-62.40,-57.60,0 +-19.20,-52.80,13.56,0.00,1.00,-57.60,-52.80,0 +-19.20,-52.80,13.49,0.00,1.00,-52.80,-48.00,0 +-14.40,-48.00,13.43,0.00,1.00,-48.00,-43.20,0 +-14.40,-43.20,13.37,0.00,1.00,-43.20,-38.40,0 +-9.60,-38.40,13.30,0.00,1.00,-38.40,-33.60,0 +-9.60,-33.60,13.24,0.00,1.00,-33.60,-28.80,0 +-9.60,-28.80,13.17,0.00,1.00,-28.80,-24.00,0 +-4.80,-24.00,13.11,0.00,1.00,-24.00,-19.20,0 +-4.80,-19.20,13.04,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,12.98,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,12.92,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,12.85,0.00,1.00,-4.80,0.00,0 +0.00,0.00,12.79,0.00,1.00,0.00,4.80,0 +0.00,4.80,12.72,0.00,1.00,4.80,9.60,0 +4.80,9.60,12.66,0.00,1.00,9.60,14.40,0 +4.80,14.40,12.59,0.00,1.00,14.40,19.20,0 +4.80,19.20,12.53,0.00,1.00,19.20,24.00,0 +9.60,24.00,12.47,0.00,1.00,24.00,28.80,0 +9.60,28.80,12.40,0.00,1.00,28.80,33.60,0 +14.40,33.60,12.34,0.00,1.00,33.60,38.40,0 +14.40,33.60,12.27,0.00,1.00,38.40,38.40,0 +19.20,38.40,12.21,0.00,1.00,43.20,43.20,0 +19.20,43.20,12.14,0.00,1.00,48.00,48.00,0 +24.00,48.00,12.08,0.00,1.00,52.80,52.80,0 +28.80,52.80,12.02,0.00,1.00,57.60,57.60,0 +33.60,57.60,11.95,0.00,1.00,62.40,62.40,0 +38.40,62.40,11.89,0.00,1.00,67.20,62.40,0 +43.20,62.40,11.82,0.00,1.00,72.00,67.20,0 +52.80,67.20,11.76,0.00,1.00,76.80,72.00,0 +67.20,67.20,11.69,0.00,1.00,81.60,72.00,0 +76.80,72.00,11.63,0.00,1.00,86.40,72.00,0 +96.00,72.00,11.57,0.00,1.00,91.20,72.00,0 +105.60,72.00,11.50,0.00,1.00,96.00,67.20,0 +120.00,67.20,11.44,0.00,1.00,100.80,67.20,0 +129.60,67.20,11.37,0.00,1.00,105.60,62.40,0 +139.20,62.40,11.31,0.00,1.00,110.40,57.60,0 +144.00,57.60,11.24,0.00,1.00,115.20,57.60,0 +148.80,52.80,11.18,0.00,1.00,120.00,52.80,0 +153.60,52.80,11.12,0.00,1.00,124.80,48.00,0 +158.40,48.00,11.05,0.00,1.00,129.60,43.20,0 +163.20,43.20,10.99,0.00,1.00,134.40,38.40,0 +163.20,38.40,10.92,0.00,1.00,139.20,33.60,0 +168.00,33.60,10.86,0.00,1.00,144.00,28.80,0 +168.00,28.80,10.80,0.00,1.00,148.80,24.00,0 +172.80,24.00,10.73,0.00,1.00,153.60,19.20,0 +172.80,19.20,10.67,0.00,1.00,158.40,14.40,0 +172.80,14.40,10.60,0.00,1.00,163.20,9.60,0 +177.60,9.60,10.54,0.00,1.00,168.00,4.80,0 +177.60,4.80,10.47,0.00,1.00,172.80,0.00,0 +177.60,0.00,10.41,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,10.35,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,10.28,0.00,1.00,-172.80,-9.60,0 +-177.60,-9.60,10.22,0.00,1.00,-168.00,-14.40,0 +-172.80,-14.40,10.15,0.00,1.00,-163.20,-19.20,0 +-172.80,-19.20,10.09,0.00,1.00,-158.40,-24.00,0 +-172.80,-24.00,10.02,0.00,1.00,-153.60,-28.80,0 +-168.00,-28.80,9.96,0.00,1.00,-148.80,-33.60,0 +-168.00,-33.60,9.90,0.00,1.00,-144.00,-38.40,0 +-163.20,-38.40,9.83,0.00,1.00,-139.20,-43.20,0 +-163.20,-43.20,9.77,0.00,1.00,-134.40,-48.00,0 +-158.40,-48.00,9.70,0.00,1.00,-129.60,-52.80,0 +-153.60,-52.80,9.64,0.00,1.00,-124.80,-57.60,0 +-148.80,-52.80,9.57,0.00,1.00,-120.00,-57.60,0 +-144.00,-57.60,9.51,0.00,1.00,-115.20,-62.40,0 +-139.20,-62.40,9.45,0.00,1.00,-110.40,-67.20,0 +-129.60,-67.20,9.38,0.00,1.00,-105.60,-67.20,0 +-120.00,-67.20,9.32,0.00,1.00,-100.80,-72.00,0 +-105.60,-72.00,9.25,0.00,1.00,-96.00,-72.00,0 +-96.00,-72.00,9.19,0.00,1.00,-91.20,-72.00,0 +-76.80,-72.00,9.12,0.00,1.00,-86.40,-72.00,0 +-67.20,-67.20,9.06,0.00,1.00,-81.60,-67.20,0 +-52.80,-67.20,9.00,0.00,1.00,-76.80,-62.40,0 +-43.20,-62.40,8.93,0.00,1.00,-72.00,-62.40,0 +-38.40,-62.40,8.87,0.00,1.00,-67.20,-57.60,0 +-33.60,-57.60,8.80,0.00,1.00,-62.40,-52.80,0 +-28.80,-52.80,8.74,0.00,1.00,-57.60,-48.00,0 +-24.00,-48.00,8.67,0.00,1.00,-52.80,-43.20,0 +-19.20,-43.20,8.61,0.00,1.00,-48.00,-38.40,0 +-19.20,-38.40,8.55,0.00,1.00,-43.20,-38.40,0 +-14.40,-33.60,8.48,0.00,1.00,-38.40,-33.60,0 +-14.40,-33.60,8.42,0.00,1.00,-33.60,-28.80,0 +-9.60,-28.80,8.35,0.00,1.00,-28.80,-24.00,0 +-9.60,-24.00,8.29,0.00,1.00,-24.00,-19.20,0 +-4.80,-19.20,8.22,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,8.16,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,8.10,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,8.03,0.00,1.00,-4.80,0.00,0 +0.00,0.00,7.97,0.00,1.00,0.00,4.80,0 +0.00,4.80,7.90,0.00,1.00,4.80,9.60,0 +4.80,9.60,7.84,0.00,1.00,9.60,14.40,0 +4.80,14.40,7.78,0.00,1.00,14.40,19.20,0 +9.60,19.20,7.71,0.00,1.00,19.20,24.00,0 +9.60,24.00,7.65,0.00,1.00,24.00,24.00,0 +14.40,24.00,7.58,0.00,1.00,28.80,28.80,0 +14.40,28.80,7.52,0.00,1.00,33.60,33.60,0 +19.20,33.60,7.45,0.00,1.00,33.60,38.40,0 +19.20,38.40,7.39,0.00,1.00,38.40,43.20,0 +24.00,43.20,7.33,0.00,1.00,43.20,48.00,0 +28.80,48.00,7.26,0.00,1.00,48.00,52.80,0 +33.60,52.80,7.20,0.00,1.00,57.60,52.80,0 +38.40,52.80,7.13,0.00,1.00,62.40,57.60,0 +43.20,57.60,7.07,0.00,1.00,67.20,62.40,0 +52.80,62.40,7.00,0.00,1.00,72.00,62.40,0 +62.40,62.40,6.94,0.00,1.00,76.80,67.20,0 +72.00,62.40,6.88,0.00,1.00,81.60,67.20,0 +81.60,67.20,6.81,0.00,1.00,86.40,67.20,0 +91.20,67.20,6.75,0.00,1.00,91.20,67.20,0 +105.60,67.20,6.68,0.00,1.00,96.00,67.20,0 +115.20,62.40,6.62,0.00,1.00,100.80,62.40,0 +124.80,62.40,6.55,0.00,1.00,105.60,57.60,0 +134.40,57.60,6.49,0.00,1.00,110.40,57.60,0 +139.20,57.60,6.43,0.00,1.00,115.20,52.80,0 +144.00,52.80,6.36,0.00,1.00,120.00,48.00,0 +148.80,48.00,6.30,0.00,1.00,129.60,43.20,0 +153.60,43.20,6.23,0.00,1.00,134.40,43.20,0 +158.40,38.40,6.17,0.00,1.00,139.20,38.40,0 +158.40,38.40,6.10,0.00,1.00,144.00,33.60,0 +163.20,33.60,6.04,0.00,1.00,148.80,28.80,0 +168.00,28.80,5.98,0.00,1.00,148.80,24.00,0 +168.00,24.00,5.91,0.00,1.00,153.60,19.20,0 +172.80,19.20,5.85,0.00,1.00,158.40,14.40,0 +172.80,14.40,5.78,0.00,1.00,163.20,9.60,0 +172.80,9.60,5.72,0.00,1.00,168.00,4.80,0 +177.60,4.80,5.65,0.00,1.00,172.80,0.00,0 +177.60,0.00,5.59,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,5.53,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,5.46,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,5.40,0.00,1.00,-168.00,-14.40,0 +-172.80,-14.40,5.33,0.00,1.00,-163.20,-19.20,0 +-172.80,-19.20,5.27,0.00,1.00,-158.40,-24.00,0 +-168.00,-24.00,5.20,0.00,1.00,-153.60,-28.80,0 +-168.00,-28.80,5.14,0.00,1.00,-148.80,-33.60,0 +-163.20,-33.60,5.08,0.00,1.00,-148.80,-38.40,0 +-158.40,-38.40,5.01,0.00,1.00,-144.00,-43.20,0 +-158.40,-38.40,4.95,0.00,1.00,-139.20,-43.20,0 +-153.60,-43.20,4.88,0.00,1.00,-134.40,-48.00,0 +-148.80,-48.00,4.82,0.00,1.00,-129.60,-52.80,0 +-144.00,-52.80,4.76,0.00,1.00,-120.00,-57.60,0 +-139.20,-57.60,4.69,0.00,1.00,-115.20,-57.60,0 +-134.40,-57.60,4.63,0.00,1.00,-110.40,-62.40,0 +-124.80,-62.40,4.56,0.00,1.00,-105.60,-67.20,0 +-115.20,-62.40,4.50,0.00,1.00,-100.80,-67.20,0 +-105.60,-67.20,4.43,0.00,1.00,-96.00,-67.20,0 +-91.20,-67.20,4.37,0.00,1.00,-91.20,-67.20,0 +-81.60,-67.20,4.31,0.00,1.00,-86.40,-67.20,0 +-72.00,-62.40,4.24,0.00,1.00,-81.60,-62.40,0 +-62.40,-62.40,4.18,0.00,1.00,-76.80,-62.40,0 +-52.80,-62.40,4.11,0.00,1.00,-72.00,-57.60,0 +-43.20,-57.60,4.05,0.00,1.00,-67.20,-52.80,0 +-38.40,-52.80,3.98,0.00,1.00,-62.40,-52.80,0 +-33.60,-52.80,3.92,0.00,1.00,-57.60,-48.00,0 +-28.80,-48.00,3.86,0.00,1.00,-48.00,-43.20,0 +-24.00,-43.20,3.79,0.00,1.00,-43.20,-38.40,0 +-19.20,-38.40,3.73,0.00,1.00,-38.40,-33.60,0 +-19.20,-33.60,3.66,0.00,1.00,-33.60,-28.80,0 +-14.40,-28.80,3.60,0.00,1.00,-33.60,-24.00,0 +-14.40,-24.00,3.53,0.00,1.00,-28.80,-24.00,0 +-9.60,-24.00,3.47,0.00,1.00,-24.00,-19.20,0 +-9.60,-19.20,3.41,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,3.34,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,3.28,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,3.21,0.00,1.00,-4.80,0.00,0 +0.00,0.00,3.15,0.00,1.00,0.00,4.80,0 +0.00,4.80,3.08,0.00,1.00,4.80,9.60,0 +4.80,9.60,3.02,0.00,1.00,9.60,14.40,0 +4.80,14.40,2.96,0.00,1.00,14.40,19.20,0 +9.60,14.40,2.89,0.00,1.00,19.20,19.20,0 +14.40,19.20,2.83,0.00,1.00,19.20,24.00,0 +14.40,24.00,2.76,0.00,1.00,24.00,28.80,0 +19.20,28.80,2.70,0.00,1.00,28.80,33.60,0 +19.20,33.60,2.63,0.00,1.00,33.60,38.40,0 +24.00,38.40,2.57,0.00,1.00,38.40,43.20,0 +28.80,38.40,2.51,0.00,1.00,43.20,43.20,0 +33.60,43.20,2.44,0.00,1.00,48.00,48.00,0 +38.40,48.00,2.38,0.00,1.00,52.80,52.80,0 +43.20,52.80,2.31,0.00,1.00,57.60,52.80,0 +48.00,52.80,2.25,0.00,1.00,62.40,57.60,0 +57.60,57.60,2.18,0.00,1.00,72.00,57.60,0 +62.40,57.60,2.12,0.00,1.00,76.80,62.40,0 +72.00,62.40,2.06,0.00,1.00,81.60,62.40,0 +81.60,62.40,1.99,0.00,1.00,86.40,62.40,0 +91.20,62.40,1.93,0.00,1.00,91.20,62.40,0 +100.80,62.40,1.86,0.00,1.00,96.00,62.40,0 +110.40,57.60,1.80,0.00,1.00,100.80,57.60,0 +120.00,57.60,1.73,0.00,1.00,105.60,57.60,0 +129.60,57.60,1.67,0.00,1.00,115.20,52.80,0 +134.40,52.80,1.61,0.00,1.00,120.00,48.00,0 +139.20,48.00,1.54,0.00,1.00,124.80,48.00,0 +144.00,48.00,1.48,0.00,1.00,129.60,43.20,0 +148.80,43.20,1.41,0.00,1.00,134.40,38.40,0 +153.60,38.40,1.35,0.00,1.00,139.20,33.60,0 +158.40,33.60,1.29,0.00,1.00,144.00,33.60,0 +158.40,28.80,1.22,0.00,1.00,148.80,28.80,0 +163.20,28.80,1.16,0.00,1.00,153.60,24.00,0 +168.00,24.00,1.09,0.00,1.00,158.40,19.20,0 +168.00,19.20,1.03,0.00,1.00,163.20,14.40,0 +172.80,14.40,0.96,0.00,1.00,163.20,9.60,0 +172.80,9.60,0.90,0.00,1.00,168.00,4.80,0 +177.60,4.80,0.84,0.00,1.00,172.80,0.00,0 +177.60,0.00,0.77,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,0.71,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,0.64,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,0.58,0.00,1.00,-168.00,-14.40,0 +-172.80,-14.40,0.51,0.00,1.00,-163.20,-19.20,0 +-168.00,-19.20,0.45,0.00,1.00,-163.20,-24.00,0 +-168.00,-24.00,0.39,0.00,1.00,-158.40,-28.80,0 +-163.20,-28.80,0.32,0.00,1.00,-153.60,-33.60,0 +-158.40,-28.80,0.26,0.00,1.00,-148.80,-33.60,0 +-158.40,-33.60,0.19,0.00,1.00,-144.00,-38.40,0 +-153.60,-38.40,0.13,0.00,1.00,-139.20,-43.20,0 +-148.80,-43.20,0.06,0.00,1.00,-134.40,-48.00,0 +-144.00,-48.00,0.00,0.00,1.00,-129.60,-48.00,0 +-139.20,-48.00,0.00,0.00,1.00,-124.80,-52.80,0 +-134.40,-52.80,0.16,0.00,1.00,-120.00,-57.60,0 +-129.60,-57.60,0.32,0.00,1.00,-115.20,-57.60,0 +-120.00,-57.60,0.48,0.00,1.00,-105.60,-62.40,0 +-110.40,-57.60,0.65,0.00,1.00,-100.80,-62.40,0 +-100.80,-62.40,0.81,0.00,1.00,-96.00,-62.40,0 +-91.20,-62.40,0.97,0.00,1.00,-91.20,-62.40,0 +-81.60,-62.40,1.13,0.00,1.00,-86.40,-62.40,0 +-72.00,-62.40,1.29,0.00,1.00,-81.60,-57.60,0 +-62.40,-57.60,1.45,0.00,1.00,-76.80,-57.60,0 +-57.60,-57.60,1.62,0.00,1.00,-72.00,-52.80,0 +-48.00,-52.80,1.78,0.00,1.00,-62.40,-52.80,0 +-43.20,-52.80,1.94,0.00,1.00,-57.60,-48.00,0 +-38.40,-48.00,2.10,0.00,1.00,-52.80,-43.20,0 +-33.60,-43.20,2.26,0.00,1.00,-48.00,-43.20,0 +-28.80,-38.40,2.42,0.00,1.00,-43.20,-38.40,0 +-24.00,-38.40,2.59,0.00,1.00,-38.40,-33.60,0 +-19.20,-33.60,2.75,0.00,1.00,-33.60,-28.80,0 +-19.20,-28.80,2.91,0.00,1.00,-28.80,-24.00,0 +-14.40,-24.00,3.07,0.00,1.00,-24.00,-19.20,0 +-14.40,-19.20,3.23,0.00,1.00,-19.20,-19.20,0 +-9.60,-14.40,3.39,0.00,1.00,-19.20,-14.40,0 +-4.80,-14.40,3.56,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,3.72,0.00,1.00,-9.60,-4.80,0 +-0.00,-4.80,3.88,0.00,1.00,-4.80,0.00,0 +0.00,0.00,4.04,0.00,1.00,0.00,4.80,0 +4.80,4.80,4.20,0.00,1.00,4.80,9.60,0 +4.80,9.60,4.36,0.00,1.00,9.60,14.40,0 +9.60,9.60,4.53,0.00,1.00,14.40,14.40,0 +9.60,14.40,4.69,0.00,1.00,14.40,19.20,0 +14.40,19.20,4.85,0.00,1.00,19.20,24.00,0 +19.20,24.00,5.01,0.00,1.00,24.00,28.80,0 +19.20,28.80,5.17,0.00,1.00,28.80,33.60,0 +24.00,28.80,5.33,0.00,1.00,33.60,33.60,0 +28.80,33.60,5.49,0.00,1.00,38.40,38.40,0 +33.60,38.40,5.66,0.00,1.00,43.20,43.20,0 +38.40,43.20,5.82,0.00,1.00,48.00,43.20,0 +43.20,43.20,5.98,0.00,1.00,52.80,48.00,0 +48.00,48.00,6.14,0.00,1.00,57.60,52.80,0 +52.80,48.00,6.30,0.00,1.00,62.40,52.80,0 +57.60,52.80,6.46,0.00,1.00,67.20,57.60,0 +67.20,52.80,6.63,0.00,1.00,72.00,57.60,0 +76.80,57.60,6.79,0.00,1.00,81.60,57.60,0 +81.60,57.60,6.95,0.00,1.00,86.40,57.60,0 +91.20,57.60,7.11,0.00,1.00,91.20,57.60,0 +100.80,57.60,7.27,0.00,1.00,96.00,57.60,0 +110.40,52.80,7.43,0.00,1.00,100.80,52.80,0 +115.20,52.80,7.60,0.00,1.00,110.40,52.80,0 +124.80,52.80,7.76,0.00,1.00,115.20,48.00,0 +129.60,48.00,7.92,0.00,1.00,120.00,48.00,0 +134.40,48.00,8.08,0.00,1.00,124.80,43.20,0 +139.20,43.20,8.24,0.00,1.00,129.60,38.40,0 +144.00,38.40,8.40,0.00,1.00,134.40,38.40,0 +148.80,38.40,8.57,0.00,1.00,139.20,33.60,0 +153.60,33.60,8.73,0.00,1.00,144.00,28.80,0 +158.40,28.80,8.89,0.00,1.00,148.80,24.00,0 +163.20,24.00,9.05,0.00,1.00,153.60,24.00,0 +163.20,24.00,9.21,0.00,1.00,158.40,19.20,0 +168.00,19.20,9.37,0.00,1.00,163.20,14.40,0 +172.80,14.40,9.54,0.00,1.00,168.00,9.60,0 +172.80,9.60,9.70,0.00,1.00,168.00,4.80,0 +177.60,4.80,9.86,0.00,1.00,172.80,0.00,0 +177.60,0.00,10.02,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,10.18,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,10.34,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,10.51,0.00,1.00,-168.00,-14.40,0 +-172.80,-14.40,10.67,0.00,1.00,-168.00,-19.20,0 +-168.00,-19.20,10.83,0.00,1.00,-163.20,-24.00,0 +-163.20,-24.00,10.99,0.00,1.00,-158.40,-24.00,0 +-163.20,-24.00,11.15,0.00,1.00,-153.60,-28.80,0 +-158.40,-28.80,11.31,0.00,1.00,-148.80,-33.60,0 +-153.60,-33.60,11.47,0.00,1.00,-144.00,-38.40,0 +-148.80,-38.40,11.64,0.00,1.00,-139.20,-38.40,0 +-144.00,-38.40,11.80,0.00,1.00,-134.40,-43.20,0 +-139.20,-43.20,11.96,0.00,1.00,-129.60,-48.00,0 +-134.40,-48.00,12.12,0.00,1.00,-124.80,-48.00,0 +-129.60,-48.00,12.28,0.00,1.00,-120.00,-52.80,0 +-124.80,-52.80,12.44,0.00,1.00,-115.20,-52.80,0 +-115.20,-52.80,12.61,0.00,1.00,-110.40,-57.60,0 +-110.40,-52.80,12.77,0.00,1.00,-100.80,-57.60,0 +-100.80,-57.60,12.93,0.00,1.00,-96.00,-57.60,0 +-91.20,-57.60,13.09,0.00,1.00,-91.20,-57.60,0 +-81.60,-57.60,13.25,0.00,1.00,-86.40,-57.60,0 +-76.80,-57.60,13.41,0.00,1.00,-81.60,-57.60,0 +-67.20,-52.80,13.58,0.00,1.00,-72.00,-52.80,0 +-57.60,-52.80,13.74,0.00,1.00,-67.20,-52.80,0 +-52.80,-48.00,13.90,0.00,1.00,-62.40,-48.00,0 +-48.00,-48.00,14.06,0.00,1.00,-57.60,-43.20,0 +-43.20,-43.20,14.22,0.00,1.00,-52.80,-43.20,0 +-38.40,-43.20,14.38,0.00,1.00,-48.00,-38.40,0 +-33.60,-38.40,14.55,0.00,1.00,-43.20,-33.60,0 +-28.80,-33.60,14.71,0.00,1.00,-38.40,-33.60,0 +-24.00,-28.80,14.87,0.00,1.00,-33.60,-28.80,0 +-19.20,-28.80,15.03,0.00,1.00,-28.80,-24.00,0 +-19.20,-24.00,15.19,0.00,1.00,-24.00,-19.20,0 +-14.40,-19.20,15.35,0.00,1.00,-19.20,-14.40,0 +-9.60,-14.40,15.52,0.00,1.00,-14.40,-14.40,0 +-9.60,-9.60,15.68,0.00,1.00,-14.40,-9.60,0 +-4.80,-9.60,15.84,0.00,1.00,-9.60,-4.80,0 +-4.80,-4.80,16.00,0.00,1.00,-4.80,0.00,0 +0.00,0.00,16.00,0.00,1.00,0.00,4.80,0 +4.80,4.80,15.84,0.00,1.00,4.80,9.60,0 +4.80,9.60,15.68,0.00,1.00,9.60,9.60,0 +9.60,9.60,15.52,0.00,1.00,9.60,14.40,0 +14.40,14.40,15.35,0.00,1.00,14.40,19.20,0 +14.40,19.20,15.19,0.00,1.00,19.20,24.00,0 +19.20,24.00,15.03,0.00,1.00,24.00,24.00,0 +24.00,24.00,14.87,0.00,1.00,28.80,28.80,0 +24.00,28.80,14.71,0.00,1.00,33.60,33.60,0 +28.80,33.60,14.55,0.00,1.00,38.40,38.40,0 +33.60,33.60,14.38,0.00,1.00,43.20,38.40,0 +38.40,38.40,14.22,0.00,1.00,48.00,43.20,0 +43.20,43.20,14.06,0.00,1.00,52.80,43.20,0 +48.00,43.20,13.90,0.00,1.00,57.60,48.00,0 +57.60,48.00,13.74,0.00,1.00,62.40,48.00,0 +62.40,48.00,13.58,0.00,1.00,67.20,52.80,0 +67.20,48.00,13.41,0.00,1.00,72.00,52.80,0 +76.80,52.80,13.25,0.00,1.00,81.60,52.80,0 +86.40,52.80,13.09,0.00,1.00,86.40,52.80,0 +91.20,52.80,12.93,0.00,1.00,91.20,52.80,0 +100.80,52.80,12.77,0.00,1.00,96.00,52.80,0 +105.60,48.00,12.61,0.00,1.00,105.60,48.00,0 +115.20,48.00,12.44,0.00,1.00,110.40,48.00,0 +120.00,48.00,12.28,0.00,1.00,115.20,48.00,0 +124.80,43.20,12.12,0.00,1.00,120.00,43.20,0 +134.40,43.20,11.96,0.00,1.00,124.80,43.20,0 +139.20,38.40,11.80,0.00,1.00,129.60,38.40,0 +144.00,38.40,11.64,0.00,1.00,134.40,33.60,0 +148.80,33.60,11.47,0.00,1.00,139.20,33.60,0 +153.60,28.80,11.31,0.00,1.00,144.00,28.80,0 +153.60,28.80,11.15,0.00,1.00,148.80,24.00,0 +158.40,24.00,10.99,0.00,1.00,153.60,19.20,0 +163.20,19.20,10.83,0.00,1.00,158.40,19.20,0 +168.00,14.40,10.67,0.00,1.00,163.20,14.40,0 +168.00,14.40,10.51,0.00,1.00,168.00,9.60,0 +172.80,9.60,10.34,0.00,1.00,172.80,4.80,0 +177.60,4.80,10.18,0.00,1.00,172.80,0.00,0 +177.60,0.00,10.02,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,9.86,0.00,1.00,-177.60,-4.80,0 +-177.60,-4.80,9.70,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,9.54,0.00,1.00,-172.80,-14.40,0 +-168.00,-14.40,9.37,0.00,1.00,-168.00,-19.20,0 +-168.00,-14.40,9.21,0.00,1.00,-163.20,-19.20,0 +-163.20,-19.20,9.05,0.00,1.00,-158.40,-24.00,0 +-158.40,-24.00,8.89,0.00,1.00,-153.60,-28.80,0 +-153.60,-28.80,8.73,0.00,1.00,-148.80,-33.60,0 +-153.60,-28.80,8.57,0.00,1.00,-144.00,-33.60,0 +-148.80,-33.60,8.40,0.00,1.00,-139.20,-38.40,0 +-144.00,-38.40,8.24,0.00,1.00,-134.40,-43.20,0 +-139.20,-38.40,8.08,0.00,1.00,-129.60,-43.20,0 +-134.40,-43.20,7.92,0.00,1.00,-124.80,-48.00,0 +-124.80,-43.20,7.76,0.00,1.00,-120.00,-48.00,0 +-120.00,-48.00,7.60,0.00,1.00,-115.20,-48.00,0 +-115.20,-48.00,7.43,0.00,1.00,-110.40,-52.80,0 +-105.60,-48.00,7.27,0.00,1.00,-105.60,-52.80,0 +-100.80,-52.80,7.11,0.00,1.00,-96.00,-52.80,0 +-91.20,-52.80,6.95,0.00,1.00,-91.20,-52.80,0 +-86.40,-52.80,6.79,0.00,1.00,-86.40,-52.80,0 +-76.80,-52.80,6.63,0.00,1.00,-81.60,-52.80,0 +-67.20,-48.00,6.46,0.00,1.00,-72.00,-48.00,0 +-62.40,-48.00,6.30,0.00,1.00,-67.20,-48.00,0 +-57.60,-48.00,6.14,0.00,1.00,-62.40,-43.20,0 +-48.00,-43.20,5.98,0.00,1.00,-57.60,-43.20,0 +-43.20,-43.20,5.82,0.00,1.00,-52.80,-38.40,0 +-38.40,-38.40,5.66,0.00,1.00,-48.00,-38.40,0 +-33.60,-33.60,5.49,0.00,1.00,-43.20,-33.60,0 +-28.80,-33.60,5.33,0.00,1.00,-38.40,-28.80,0 +-24.00,-28.80,5.17,0.00,1.00,-33.60,-24.00,0 +-24.00,-24.00,5.01,0.00,1.00,-28.80,-24.00,0 +-19.20,-24.00,4.85,0.00,1.00,-24.00,-19.20,0 +-14.40,-19.20,4.69,0.00,1.00,-19.20,-14.40,0 +-14.40,-14.40,4.53,0.00,1.00,-14.40,-9.60,0 +-9.60,-9.60,4.36,0.00,1.00,-9.60,-9.60,0 +-4.80,-9.60,4.20,0.00,1.00,-9.60,-4.80,0 +-4.80,-4.80,4.04,0.00,1.00,-4.80,0.00,0 +0.00,0.00,3.88,0.00,1.00,0.00,4.80,0 +4.80,4.80,3.72,0.00,1.00,4.80,4.80,0 +4.80,4.80,3.56,0.00,1.00,4.80,9.60,0 +9.60,9.60,3.39,0.00,1.00,9.60,14.40,0 +14.40,14.40,3.23,0.00,1.00,14.40,19.20,0 +19.20,19.20,3.07,0.00,1.00,19.20,19.20,0 +19.20,19.20,2.91,0.00,1.00,24.00,24.00,0 +24.00,24.00,2.75,0.00,1.00,24.00,28.80,0 +28.80,28.80,2.59,0.00,1.00,28.80,28.80,0 +33.60,28.80,2.42,0.00,1.00,33.60,33.60,0 +38.40,33.60,2.26,0.00,1.00,38.40,38.40,0 +43.20,33.60,2.10,0.00,1.00,43.20,38.40,0 +48.00,38.40,1.94,0.00,1.00,48.00,43.20,0 +52.80,38.40,1.78,0.00,1.00,52.80,43.20,0 +57.60,43.20,1.62,0.00,1.00,62.40,43.20,0 +62.40,43.20,1.45,0.00,1.00,67.20,48.00,0 +72.00,43.20,1.29,0.00,1.00,72.00,48.00,0 +76.80,48.00,1.13,0.00,1.00,76.80,48.00,0 +86.40,48.00,0.97,0.00,1.00,86.40,48.00,0 +91.20,48.00,0.81,0.00,1.00,91.20,48.00,0 +100.80,48.00,0.65,0.00,1.00,96.00,48.00,0 +105.60,48.00,0.48,0.00,1.00,105.60,48.00,0 +110.40,43.20,0.32,0.00,1.00,110.40,43.20,0 +120.00,43.20,0.16,0.00,1.00,115.20,43.20,0 +124.80,43.20,0.00,0.00,1.00,124.80,38.40,0 +129.60,38.40,0.00,0.00,1.00,129.60,38.40,0 +134.40,38.40,0.04,0.00,1.00,134.40,33.60,0 +139.20,33.60,0.08,0.00,1.00,139.20,33.60,0 +144.00,33.60,0.12,0.00,1.00,144.00,28.80,0 +148.80,28.80,0.16,0.00,1.00,148.80,24.00,0 +153.60,24.00,0.20,0.00,1.00,153.60,24.00,0 +158.40,24.00,0.24,0.00,1.00,158.40,19.20,0 +163.20,19.20,0.28,0.00,1.00,158.40,14.40,0 +163.20,14.40,0.32,0.00,1.00,163.20,14.40,0 +168.00,14.40,0.36,0.00,1.00,168.00,9.60,0 +172.80,9.60,0.40,0.00,1.00,172.80,4.80,0 +172.80,4.80,0.44,0.00,1.00,172.80,0.00,0 +177.60,0.00,0.48,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,0.52,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,0.56,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,0.60,0.00,1.00,-172.80,-14.40,0 +-168.00,-14.40,0.64,0.00,1.00,-168.00,-14.40,0 +-163.20,-14.40,0.68,0.00,1.00,-163.20,-19.20,0 +-163.20,-19.20,0.72,0.00,1.00,-158.40,-24.00,0 +-158.40,-24.00,0.76,0.00,1.00,-158.40,-24.00,0 +-153.60,-24.00,0.80,0.00,1.00,-153.60,-28.80,0 +-148.80,-28.80,0.84,0.00,1.00,-148.80,-33.60,0 +-144.00,-33.60,0.88,0.00,1.00,-144.00,-33.60,0 +-139.20,-33.60,0.92,0.00,1.00,-139.20,-38.40,0 +-134.40,-38.40,0.96,0.00,1.00,-134.40,-38.40,0 +-129.60,-38.40,1.00,0.00,1.00,-129.60,-43.20,0 +-124.80,-43.20,1.04,0.00,1.00,-124.80,-43.20,0 +-120.00,-43.20,1.08,0.00,1.00,-115.20,-48.00,0 +-110.40,-43.20,1.12,0.00,1.00,-110.40,-48.00,0 +-105.60,-48.00,1.16,0.00,1.00,-105.60,-48.00,0 +-100.80,-48.00,1.20,0.00,1.00,-96.00,-48.00,0 +-91.20,-48.00,1.24,0.00,1.00,-91.20,-48.00,0 +-86.40,-48.00,1.28,0.00,1.00,-86.40,-48.00,0 +-76.80,-48.00,1.32,0.00,1.00,-76.80,-48.00,0 +-72.00,-43.20,1.36,0.00,1.00,-72.00,-43.20,0 +-62.40,-43.20,1.40,0.00,1.00,-67.20,-43.20,0 +-57.60,-43.20,1.44,0.00,1.00,-62.40,-43.20,0 +-52.80,-38.40,1.48,0.00,1.00,-52.80,-38.40,0 +-48.00,-38.40,1.52,0.00,1.00,-48.00,-38.40,0 +-43.20,-33.60,1.56,0.00,1.00,-43.20,-33.60,0 +-38.40,-33.60,1.60,0.00,1.00,-38.40,-28.80,0 +-33.60,-28.80,1.64,0.00,1.00,-33.60,-28.80,0 +-28.80,-28.80,1.68,0.00,1.00,-28.80,-24.00,0 +-24.00,-24.00,1.72,0.00,1.00,-24.00,-19.20,0 +-19.20,-19.20,1.76,0.00,1.00,-24.00,-19.20,0 +-19.20,-19.20,1.80,0.00,1.00,-19.20,-14.40,0 +-14.40,-14.40,1.84,0.00,1.00,-14.40,-9.60,0 +-9.60,-9.60,1.88,0.00,1.00,-9.60,-4.80,0 +-4.80,-4.80,1.92,0.00,1.00,-4.80,-4.80,0 +-4.80,-4.80,1.96,0.00,1.00,-4.80,0.00,0 +0.00,0.00,2.01,0.00,1.00,0.00,4.80,0 +4.80,4.80,2.05,0.00,1.00,4.80,4.80,0 +4.80,4.80,2.09,0.00,1.00,4.80,9.60,0 +9.60,9.60,2.13,0.00,1.00,9.60,14.40,0 +14.40,14.40,2.17,0.00,1.00,14.40,14.40,0 +19.20,14.40,2.21,0.00,1.00,14.40,19.20,0 +24.00,19.20,2.25,0.00,1.00,19.20,24.00,0 +24.00,24.00,2.29,0.00,1.00,24.00,24.00,0 +28.80,24.00,2.33,0.00,1.00,28.80,28.80,0 +33.60,28.80,2.37,0.00,1.00,33.60,28.80,0 +38.40,28.80,2.41,0.00,1.00,38.40,33.60,0 +43.20,33.60,2.45,0.00,1.00,43.20,33.60,0 +48.00,33.60,2.49,0.00,1.00,48.00,38.40,0 +52.80,38.40,2.53,0.00,1.00,52.80,38.40,0 +62.40,38.40,2.57,0.00,1.00,57.60,38.40,0 +67.20,38.40,2.61,0.00,1.00,62.40,43.20,0 +72.00,38.40,2.65,0.00,1.00,72.00,43.20,0 +76.80,43.20,2.69,0.00,1.00,76.80,43.20,0 +86.40,43.20,2.73,0.00,1.00,86.40,43.20,0 +91.20,43.20,2.77,0.00,1.00,91.20,43.20,0 +96.00,43.20,2.81,0.00,1.00,100.80,43.20,0 +105.60,43.20,2.85,0.00,1.00,105.60,43.20,0 +110.40,38.40,2.89,0.00,1.00,110.40,38.40,0 +115.20,38.40,2.93,0.00,1.00,120.00,38.40,0 +120.00,38.40,2.97,0.00,1.00,124.80,38.40,0 +129.60,33.60,3.01,0.00,1.00,129.60,33.60,0 +134.40,33.60,3.05,0.00,1.00,134.40,33.60,0 +139.20,28.80,3.09,0.00,1.00,139.20,28.80,0 +144.00,28.80,3.13,0.00,1.00,144.00,28.80,0 +148.80,24.00,3.17,0.00,1.00,148.80,24.00,0 +153.60,24.00,3.21,0.00,1.00,153.60,19.20,0 +153.60,19.20,3.25,0.00,1.00,158.40,19.20,0 +158.40,19.20,3.29,0.00,1.00,163.20,14.40,0 +163.20,14.40,3.33,0.00,1.00,163.20,9.60,0 +168.00,9.60,3.37,0.00,1.00,168.00,9.60,0 +172.80,9.60,3.41,0.00,1.00,172.80,4.80,0 +172.80,4.80,3.45,0.00,1.00,172.80,0.00,0 +177.60,0.00,3.49,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,3.53,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,3.57,0.00,1.00,-172.80,-9.60,0 +-172.80,-9.60,3.61,0.00,1.00,-172.80,-9.60,0 +-168.00,-9.60,3.65,0.00,1.00,-168.00,-14.40,0 +-163.20,-14.40,3.69,0.00,1.00,-163.20,-19.20,0 +-158.40,-19.20,3.73,0.00,1.00,-163.20,-19.20,0 +-153.60,-19.20,3.77,0.00,1.00,-158.40,-24.00,0 +-153.60,-24.00,3.81,0.00,1.00,-153.60,-28.80,0 +-148.80,-24.00,3.85,0.00,1.00,-148.80,-28.80,0 +-144.00,-28.80,3.89,0.00,1.00,-144.00,-33.60,0 +-139.20,-28.80,3.93,0.00,1.00,-139.20,-33.60,0 +-134.40,-33.60,3.97,0.00,1.00,-134.40,-38.40,0 +-129.60,-33.60,4.01,0.00,1.00,-129.60,-38.40,0 +-120.00,-38.40,4.05,0.00,1.00,-124.80,-38.40,0 +-115.20,-38.40,4.09,0.00,1.00,-120.00,-43.20,0 +-110.40,-38.40,4.13,0.00,1.00,-110.40,-43.20,0 +-105.60,-43.20,4.17,0.00,1.00,-105.60,-43.20,0 +-96.00,-43.20,4.21,0.00,1.00,-100.80,-43.20,0 +-91.20,-43.20,4.25,0.00,1.00,-91.20,-43.20,0 +-86.40,-43.20,4.29,0.00,1.00,-86.40,-43.20,0 +-76.80,-43.20,4.33,0.00,1.00,-76.80,-43.20,0 +-72.00,-38.40,4.37,0.00,1.00,-72.00,-38.40,0 +-67.20,-38.40,4.41,0.00,1.00,-62.40,-38.40,0 +-62.40,-38.40,4.45,0.00,1.00,-57.60,-38.40,0 +-52.80,-38.40,4.49,0.00,1.00,-52.80,-33.60,0 +-48.00,-33.60,4.53,0.00,1.00,-48.00,-33.60,0 +-43.20,-33.60,4.57,0.00,1.00,-43.20,-28.80,0 +-38.40,-28.80,4.61,0.00,1.00,-38.40,-28.80,0 +-33.60,-28.80,4.65,0.00,1.00,-33.60,-24.00,0 +-28.80,-24.00,4.69,0.00,1.00,-28.80,-24.00,0 +-24.00,-24.00,4.73,0.00,1.00,-24.00,-19.20,0 +-24.00,-19.20,4.77,0.00,1.00,-19.20,-14.40,0 +-19.20,-14.40,4.81,0.00,1.00,-14.40,-14.40,0 +-14.40,-14.40,4.85,0.00,1.00,-14.40,-9.60,0 +-9.60,-9.60,4.89,0.00,1.00,-9.60,-4.80,0 +-4.80,-4.80,4.93,0.00,1.00,-4.80,-4.80,0 +-4.80,-4.80,4.97,0.00,1.00,-4.80,0.00,0 +0.00,0.00,5.01,0.00,1.00,0.00,4.80,0 +4.80,4.80,5.05,0.00,1.00,4.80,4.80,0 +9.60,4.80,5.09,0.00,1.00,4.80,9.60,0 +9.60,9.60,5.13,0.00,1.00,9.60,9.60,0 +14.40,9.60,5.17,0.00,1.00,9.60,14.40,0 +19.20,14.40,5.21,0.00,1.00,14.40,19.20,0 +24.00,19.20,5.25,0.00,1.00,19.20,19.20,0 +28.80,19.20,5.29,0.00,1.00,24.00,24.00,0 +33.60,24.00,5.33,0.00,1.00,24.00,24.00,0 +38.40,24.00,5.37,0.00,1.00,28.80,28.80,0 +43.20,28.80,5.41,0.00,1.00,33.60,28.80,0 +48.00,28.80,5.45,0.00,1.00,38.40,33.60,0 +52.80,28.80,5.49,0.00,1.00,43.20,33.60,0 +57.60,33.60,5.53,0.00,1.00,48.00,33.60,0 +62.40,33.60,5.57,0.00,1.00,52.80,38.40,0 +67.20,33.60,5.61,0.00,1.00,62.40,38.40,0 +72.00,38.40,5.65,0.00,1.00,67.20,38.40,0 +81.60,38.40,5.69,0.00,1.00,76.80,38.40,0 +86.40,38.40,5.73,0.00,1.00,86.40,38.40,0 +91.20,38.40,5.77,0.00,1.00,91.20,38.40,0 +96.00,38.40,5.81,0.00,1.00,100.80,38.40,0 +105.60,38.40,5.85,0.00,1.00,105.60,38.40,0 +110.40,33.60,5.89,0.00,1.00,115.20,33.60,0 +115.20,33.60,5.93,0.00,1.00,120.00,33.60,0 +120.00,33.60,5.97,0.00,1.00,129.60,33.60,0 +124.80,33.60,6.02,0.00,1.00,134.40,28.80,0 +129.60,28.80,6.06,0.00,1.00,139.20,28.80,0 +134.40,28.80,6.10,0.00,1.00,144.00,24.00,0 +139.20,24.00,6.14,0.00,1.00,148.80,24.00,0 +144.00,24.00,6.18,0.00,1.00,153.60,19.20,0 +148.80,19.20,6.22,0.00,1.00,158.40,19.20,0 +153.60,19.20,6.26,0.00,1.00,158.40,14.40,0 +158.40,14.40,6.30,0.00,1.00,163.20,14.40,0 +163.20,14.40,6.34,0.00,1.00,168.00,9.60,0 +168.00,9.60,6.38,0.00,1.00,168.00,9.60,0 +168.00,9.60,6.42,0.00,1.00,172.80,4.80,0 +172.80,4.80,6.46,0.00,1.00,177.60,0.00,0 +177.60,0.00,6.50,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,6.54,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,6.58,0.00,1.00,-177.60,-9.60,0 +-168.00,-9.60,6.62,0.00,1.00,-172.80,-9.60,0 +-168.00,-9.60,6.66,0.00,1.00,-168.00,-14.40,0 +-163.20,-14.40,6.70,0.00,1.00,-168.00,-14.40,0 +-158.40,-14.40,6.74,0.00,1.00,-163.20,-19.20,0 +-153.60,-19.20,6.78,0.00,1.00,-158.40,-19.20,0 +-148.80,-19.20,6.82,0.00,1.00,-158.40,-24.00,0 +-144.00,-24.00,6.86,0.00,1.00,-153.60,-24.00,0 +-139.20,-24.00,6.90,0.00,1.00,-148.80,-28.80,0 +-134.40,-28.80,6.94,0.00,1.00,-144.00,-28.80,0 +-129.60,-28.80,6.98,0.00,1.00,-139.20,-33.60,0 +-124.80,-33.60,7.02,0.00,1.00,-134.40,-33.60,0 +-120.00,-33.60,7.06,0.00,1.00,-129.60,-33.60,0 +-115.20,-33.60,7.10,0.00,1.00,-120.00,-38.40,0 +-110.40,-33.60,7.14,0.00,1.00,-115.20,-38.40,0 +-105.60,-38.40,7.18,0.00,1.00,-105.60,-38.40,0 +-96.00,-38.40,7.22,0.00,1.00,-100.80,-38.40,0 +-91.20,-38.40,7.26,0.00,1.00,-91.20,-38.40,0 +-86.40,-38.40,7.30,0.00,1.00,-86.40,-38.40,0 +-81.60,-38.40,7.34,0.00,1.00,-76.80,-38.40,0 +-72.00,-38.40,7.38,0.00,1.00,-67.20,-38.40,0 +-67.20,-33.60,7.42,0.00,1.00,-62.40,-33.60,0 +-62.40,-33.60,7.46,0.00,1.00,-52.80,-33.60,0 +-57.60,-33.60,7.50,0.00,1.00,-48.00,-33.60,0 +-52.80,-28.80,7.54,0.00,1.00,-43.20,-28.80,0 +-48.00,-28.80,7.58,0.00,1.00,-38.40,-28.80,0 +-43.20,-28.80,7.62,0.00,1.00,-33.60,-24.00,0 +-38.40,-24.00,7.66,0.00,1.00,-28.80,-24.00,0 +-33.60,-24.00,7.70,0.00,1.00,-24.00,-19.20,0 +-28.80,-19.20,7.74,0.00,1.00,-24.00,-19.20,0 +-24.00,-19.20,7.78,0.00,1.00,-19.20,-14.40,0 +-19.20,-14.40,7.82,0.00,1.00,-14.40,-9.60,0 +-14.40,-9.60,7.86,0.00,1.00,-9.60,-9.60,0 +-9.60,-9.60,7.90,0.00,1.00,-9.60,-4.80,0 +-9.60,-4.80,7.94,0.00,1.00,-4.80,-4.80,0 +-4.80,-4.80,7.98,0.00,1.00,-4.80,0.00,0 +0.00,0.00,8.02,0.00,1.00,0.00,4.80,0 +4.80,4.80,8.06,0.00,1.00,4.80,4.80,0 +9.60,4.80,8.10,0.00,1.00,4.80,9.60,0 +14.40,9.60,8.14,0.00,1.00,9.60,9.60,0 +14.40,9.60,8.18,0.00,1.00,9.60,14.40,0 +19.20,14.40,8.22,0.00,1.00,14.40,14.40,0 +24.00,14.40,8.26,0.00,1.00,14.40,19.20,0 +28.80,19.20,8.30,0.00,1.00,19.20,19.20,0 +33.60,19.20,8.34,0.00,1.00,24.00,24.00,0 +38.40,19.20,8.38,0.00,1.00,28.80,24.00,0 +43.20,24.00,8.42,0.00,1.00,28.80,24.00,0 +48.00,24.00,8.46,0.00,1.00,33.60,28.80,0 +52.80,28.80,8.50,0.00,1.00,38.40,28.80,0 +57.60,28.80,8.54,0.00,1.00,48.00,28.80,0 +62.40,28.80,8.58,0.00,1.00,52.80,33.60,0 +67.20,28.80,8.62,0.00,1.00,57.60,33.60,0 +76.80,33.60,8.66,0.00,1.00,67.20,33.60,0 +81.60,33.60,8.70,0.00,1.00,76.80,33.60,0 +86.40,33.60,8.74,0.00,1.00,81.60,33.60,0 +91.20,33.60,8.78,0.00,1.00,91.20,33.60,0 +96.00,33.60,8.82,0.00,1.00,100.80,33.60,0 +100.80,33.60,8.86,0.00,1.00,110.40,33.60,0 +110.40,28.80,8.90,0.00,1.00,115.20,33.60,0 +115.20,28.80,8.94,0.00,1.00,124.80,28.80,0 +120.00,28.80,8.98,0.00,1.00,129.60,28.80,0 +124.80,28.80,9.02,0.00,1.00,139.20,28.80,0 +129.60,24.00,9.06,0.00,1.00,144.00,24.00,0 +134.40,24.00,9.10,0.00,1.00,148.80,24.00,0 +139.20,24.00,9.14,0.00,1.00,153.60,19.20,0 +144.00,19.20,9.18,0.00,1.00,153.60,19.20,0 +148.80,19.20,9.22,0.00,1.00,158.40,14.40,0 +153.60,14.40,9.26,0.00,1.00,163.20,14.40,0 +158.40,14.40,9.30,0.00,1.00,163.20,9.60,0 +163.20,9.60,9.34,0.00,1.00,168.00,9.60,0 +168.00,9.60,9.38,0.00,1.00,172.80,4.80,0 +168.00,4.80,9.42,0.00,1.00,172.80,4.80,0 +172.80,4.80,9.46,0.00,1.00,177.60,0.00,0 +177.60,0.00,9.50,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,9.54,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,9.58,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,9.62,0.00,1.00,-172.80,-9.60,0 +-168.00,-9.60,9.66,0.00,1.00,-172.80,-9.60,0 +-163.20,-9.60,9.70,0.00,1.00,-168.00,-14.40,0 +-158.40,-14.40,9.74,0.00,1.00,-163.20,-14.40,0 +-153.60,-14.40,9.78,0.00,1.00,-163.20,-19.20,0 +-148.80,-19.20,9.82,0.00,1.00,-158.40,-19.20,0 +-144.00,-19.20,9.86,0.00,1.00,-153.60,-24.00,0 +-139.20,-24.00,9.90,0.00,1.00,-153.60,-24.00,0 +-134.40,-24.00,9.94,0.00,1.00,-148.80,-28.80,0 +-129.60,-24.00,9.98,0.00,1.00,-144.00,-28.80,0 +-124.80,-28.80,10.03,0.00,1.00,-139.20,-28.80,0 +-120.00,-28.80,10.07,0.00,1.00,-129.60,-33.60,0 +-115.20,-28.80,10.11,0.00,1.00,-124.80,-33.60,0 +-110.40,-28.80,10.15,0.00,1.00,-115.20,-33.60,0 +-100.80,-33.60,10.19,0.00,1.00,-110.40,-33.60,0 +-96.00,-33.60,10.23,0.00,1.00,-100.80,-33.60,0 +-91.20,-33.60,10.27,0.00,1.00,-91.20,-33.60,0 +-86.40,-33.60,10.31,0.00,1.00,-81.60,-33.60,0 +-81.60,-33.60,10.35,0.00,1.00,-76.80,-33.60,0 +-76.80,-33.60,10.39,0.00,1.00,-67.20,-33.60,0 +-67.20,-28.80,10.43,0.00,1.00,-57.60,-28.80,0 +-62.40,-28.80,10.47,0.00,1.00,-52.80,-28.80,0 +-57.60,-28.80,10.51,0.00,1.00,-48.00,-28.80,0 +-52.80,-28.80,10.55,0.00,1.00,-38.40,-24.00,0 +-48.00,-24.00,10.59,0.00,1.00,-33.60,-24.00,0 +-43.20,-24.00,10.63,0.00,1.00,-28.80,-24.00,0 +-38.40,-19.20,10.67,0.00,1.00,-28.80,-19.20,0 +-33.60,-19.20,10.71,0.00,1.00,-24.00,-19.20,0 +-28.80,-19.20,10.75,0.00,1.00,-19.20,-14.40,0 +-24.00,-14.40,10.79,0.00,1.00,-14.40,-14.40,0 +-19.20,-14.40,10.83,0.00,1.00,-14.40,-9.60,0 +-14.40,-9.60,10.87,0.00,1.00,-9.60,-9.60,0 +-14.40,-9.60,10.91,0.00,1.00,-9.60,-4.80,0 +-9.60,-4.80,10.95,0.00,1.00,-4.80,-4.80,0 +-4.80,-4.80,10.99,0.00,1.00,-4.80,0.00,0 +0.00,0.00,11.03,0.00,1.00,0.00,0.00,0 +4.80,0.00,11.07,0.00,1.00,0.00,4.80,0 +9.60,4.80,11.11,0.00,1.00,4.80,4.80,0 +14.40,4.80,11.15,0.00,1.00,4.80,9.60,0 +19.20,9.60,11.19,0.00,1.00,9.60,9.60,0 +19.20,9.60,11.23,0.00,1.00,9.60,14.40,0 +24.00,14.40,11.27,0.00,1.00,14.40,14.40,0 +28.80,14.40,11.31,0.00,1.00,19.20,19.20,0 +33.60,14.40,11.35,0.00,1.00,19.20,19.20,0 +38.40,19.20,11.39,0.00,1.00,24.00,19.20,0 +43.20,19.20,11.43,0.00,1.00,28.80,24.00,0 +48.00,24.00,11.47,0.00,1.00,33.60,24.00,0 +52.80,24.00,11.51,0.00,1.00,38.40,24.00,0 +57.60,24.00,11.55,0.00,1.00,43.20,24.00,0 +62.40,24.00,11.59,0.00,1.00,48.00,28.80,0 +72.00,24.00,11.63,0.00,1.00,52.80,28.80,0 +76.80,28.80,11.67,0.00,1.00,62.40,28.80,0 +81.60,28.80,11.71,0.00,1.00,72.00,28.80,0 +86.40,28.80,11.75,0.00,1.00,81.60,28.80,0 +91.20,28.80,11.79,0.00,1.00,91.20,28.80,0 +96.00,28.80,11.83,0.00,1.00,100.80,28.80,0 +100.80,28.80,11.87,0.00,1.00,110.40,28.80,0 +105.60,28.80,11.91,0.00,1.00,120.00,28.80,0 +110.40,24.00,11.95,0.00,1.00,129.60,24.00,0 +120.00,24.00,11.99,0.00,1.00,134.40,24.00,0 +124.80,24.00,12.03,0.00,1.00,139.20,24.00,0 +129.60,24.00,12.07,0.00,1.00,144.00,24.00,0 +134.40,19.20,12.11,0.00,1.00,148.80,19.20,0 +139.20,19.20,12.15,0.00,1.00,153.60,19.20,0 +144.00,19.20,12.19,0.00,1.00,158.40,14.40,0 +148.80,14.40,12.23,0.00,1.00,163.20,14.40,0 +153.60,14.40,12.27,0.00,1.00,163.20,14.40,0 +158.40,9.60,12.31,0.00,1.00,168.00,9.60,0 +158.40,9.60,12.35,0.00,1.00,168.00,9.60,0 +163.20,9.60,12.39,0.00,1.00,172.80,4.80,0 +168.00,4.80,12.43,0.00,1.00,172.80,4.80,0 +172.80,4.80,12.47,0.00,1.00,177.60,0.00,0 +177.60,0.00,12.51,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,12.55,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,12.59,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,12.63,0.00,1.00,-172.80,-9.60,0 +-163.20,-9.60,12.67,0.00,1.00,-172.80,-9.60,0 +-158.40,-9.60,12.71,0.00,1.00,-168.00,-14.40,0 +-158.40,-9.60,12.75,0.00,1.00,-168.00,-14.40,0 +-153.60,-14.40,12.79,0.00,1.00,-163.20,-14.40,0 +-148.80,-14.40,12.83,0.00,1.00,-163.20,-19.20,0 +-144.00,-19.20,12.87,0.00,1.00,-158.40,-19.20,0 +-139.20,-19.20,12.91,0.00,1.00,-153.60,-24.00,0 +-134.40,-19.20,12.95,0.00,1.00,-148.80,-24.00,0 +-129.60,-24.00,12.99,0.00,1.00,-144.00,-24.00,0 +-124.80,-24.00,13.03,0.00,1.00,-139.20,-24.00,0 +-120.00,-24.00,13.07,0.00,1.00,-134.40,-28.80,0 +-110.40,-24.00,13.11,0.00,1.00,-129.60,-28.80,0 +-105.60,-28.80,13.15,0.00,1.00,-120.00,-28.80,0 +-100.80,-28.80,13.19,0.00,1.00,-110.40,-28.80,0 +-96.00,-28.80,13.23,0.00,1.00,-100.80,-28.80,0 +-91.20,-28.80,13.27,0.00,1.00,-91.20,-28.80,0 +-86.40,-28.80,13.31,0.00,1.00,-81.60,-28.80,0 +-81.60,-28.80,13.35,0.00,1.00,-72.00,-28.80,0 +-76.80,-28.80,13.39,0.00,1.00,-62.40,-28.80,0 +-72.00,-24.00,13.43,0.00,1.00,-52.80,-24.00,0 +-62.40,-24.00,13.47,0.00,1.00,-48.00,-24.00,0 +-57.60,-24.00,13.51,0.00,1.00,-43.20,-24.00,0 +-52.80,-24.00,13.55,0.00,1.00,-38.40,-24.00,0 +-48.00,-24.00,13.59,0.00,1.00,-33.60,-19.20,0 +-43.20,-19.20,13.63,0.00,1.00,-28.80,-19.20,0 +-38.40,-19.20,13.67,0.00,1.00,-24.00,-19.20,0 +-33.60,-14.40,13.71,0.00,1.00,-19.20,-14.40,0 +-28.80,-14.40,13.75,0.00,1.00,-19.20,-14.40,0 +-24.00,-14.40,13.79,0.00,1.00,-14.40,-9.60,0 +-19.20,-9.60,13.83,0.00,1.00,-9.60,-9.60,0 +-19.20,-9.60,13.87,0.00,1.00,-9.60,-4.80,0 +-14.40,-4.80,13.91,0.00,1.00,-4.80,-4.80,0 +-9.60,-4.80,13.95,0.00,1.00,-4.80,-0.00,0 +-4.80,-0.00,13.99,0.00,1.00,-0.00,0.00,0 +0.00,0.00,14.04,0.00,1.00,0.00,0.00,0 +4.80,0.00,14.08,0.00,1.00,0.00,4.80,0 +9.60,4.80,14.12,0.00,1.00,4.80,4.80,0 +14.40,4.80,14.16,0.00,1.00,4.80,9.60,0 +19.20,9.60,14.20,0.00,1.00,9.60,9.60,0 +24.00,9.60,14.24,0.00,1.00,9.60,9.60,0 +28.80,9.60,14.28,0.00,1.00,14.40,14.40,0 +33.60,14.40,14.32,0.00,1.00,14.40,14.40,0 +38.40,14.40,14.36,0.00,1.00,19.20,14.40,0 +43.20,14.40,14.40,0.00,1.00,19.20,19.20,0 +48.00,14.40,14.44,0.00,1.00,24.00,19.20,0 +52.80,19.20,14.48,0.00,1.00,28.80,19.20,0 +57.60,19.20,14.52,0.00,1.00,33.60,19.20,0 +62.40,19.20,14.56,0.00,1.00,38.40,24.00,0 +67.20,19.20,14.60,0.00,1.00,43.20,24.00,0 +72.00,24.00,14.64,0.00,1.00,48.00,24.00,0 +76.80,24.00,14.68,0.00,1.00,57.60,24.00,0 +81.60,24.00,14.72,0.00,1.00,67.20,24.00,0 +86.40,24.00,14.76,0.00,1.00,81.60,24.00,0 +91.20,24.00,14.80,0.00,1.00,91.20,24.00,0 +96.00,24.00,14.84,0.00,1.00,105.60,24.00,0 +100.80,24.00,14.88,0.00,1.00,115.20,24.00,0 +105.60,24.00,14.92,0.00,1.00,124.80,24.00,0 +110.40,19.20,14.96,0.00,1.00,134.40,19.20,0 +115.20,19.20,15.00,0.00,1.00,139.20,19.20,0 +120.00,19.20,15.04,0.00,1.00,144.00,19.20,0 +124.80,19.20,15.08,0.00,1.00,148.80,19.20,0 +129.60,19.20,15.12,0.00,1.00,153.60,19.20,0 +134.40,14.40,15.16,0.00,1.00,158.40,14.40,0 +139.20,14.40,15.20,0.00,1.00,163.20,14.40,0 +144.00,14.40,15.24,0.00,1.00,163.20,14.40,0 +148.80,9.60,15.28,0.00,1.00,168.00,9.60,0 +153.60,9.60,15.32,0.00,1.00,168.00,9.60,0 +158.40,9.60,15.36,0.00,1.00,172.80,4.80,0 +163.20,4.80,15.40,0.00,1.00,172.80,4.80,0 +168.00,4.80,15.44,0.00,1.00,177.60,4.80,0 +172.80,4.80,15.48,0.00,1.00,177.60,0.00,0 +177.60,0.00,15.52,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,15.56,0.00,1.00,-177.60,-4.80,0 +-172.80,-4.80,15.60,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,15.64,0.00,1.00,-177.60,-4.80,0 +-163.20,-4.80,15.68,0.00,1.00,-172.80,-9.60,0 +-158.40,-9.60,15.72,0.00,1.00,-172.80,-9.60,0 +-153.60,-9.60,15.76,0.00,1.00,-168.00,-14.40,0 +-148.80,-9.60,15.80,0.00,1.00,-168.00,-14.40,0 +-144.00,-14.40,15.84,0.00,1.00,-163.20,-14.40,0 +-139.20,-14.40,15.88,0.00,1.00,-163.20,-19.20,0 +-134.40,-14.40,15.92,0.00,1.00,-158.40,-19.20,0 +-129.60,-19.20,15.96,0.00,1.00,-153.60,-19.20,0 +-124.80,-19.20,16.00,0.00,1.00,-148.80,-19.20,0 +-120.00,-19.20,16.00,0.00,1.00,-144.00,-19.20,0 +-115.20,-19.20,15.96,0.00,1.00,-139.20,-24.00,0 +-110.40,-19.20,15.92,0.00,1.00,-134.40,-24.00,0 +-105.60,-24.00,15.88,0.00,1.00,-124.80,-24.00,0 +-100.80,-24.00,15.84,0.00,1.00,-115.20,-24.00,0 +-96.00,-24.00,15.80,0.00,1.00,-105.60,-24.00,0 +-91.20,-24.00,15.76,0.00,1.00,-91.20,-24.00,0 +-86.40,-24.00,15.72,0.00,1.00,-81.60,-24.00,0 +-81.60,-24.00,15.68,0.00,1.00,-67.20,-24.00,0 +-76.80,-24.00,15.64,0.00,1.00,-57.60,-24.00,0 +-72.00,-24.00,15.60,0.00,1.00,-48.00,-24.00,0 +-67.20,-19.20,15.56,0.00,1.00,-43.20,-19.20,0 +-62.40,-19.20,15.52,0.00,1.00,-38.40,-19.20,0 +-57.60,-19.20,15.48,0.00,1.00,-33.60,-19.20,0 +-52.80,-19.20,15.44,0.00,1.00,-28.80,-19.20,0 +-48.00,-14.40,15.40,0.00,1.00,-24.00,-14.40,0 +-43.20,-14.40,15.36,0.00,1.00,-19.20,-14.40,0 +-38.40,-14.40,15.32,0.00,1.00,-19.20,-14.40,0 +-33.60,-14.40,15.28,0.00,1.00,-14.40,-9.60,0 +-28.80,-9.60,15.24,0.00,1.00,-14.40,-9.60,0 +-24.00,-9.60,15.20,0.00,1.00,-9.60,-9.60,0 +-19.20,-9.60,15.16,0.00,1.00,-9.60,-4.80,0 +-14.40,-4.80,15.12,0.00,1.00,-4.80,-4.80,0 +-9.60,-4.80,15.08,0.00,1.00,-4.80,-0.00,0 +-4.80,-0.00,15.04,0.00,1.00,-0.00,0.00,0 +0.00,0.00,15.00,0.00,1.00,0.00,0.00,0 +4.80,0.00,14.96,0.00,1.00,0.00,4.80,0 +9.60,4.80,14.92,0.00,1.00,4.80,4.80,0 +14.40,4.80,14.88,0.00,1.00,4.80,4.80,0 +19.20,4.80,14.84,0.00,1.00,4.80,9.60,0 +24.00,9.60,14.80,0.00,1.00,9.60,9.60,0 +28.80,9.60,14.76,0.00,1.00,9.60,9.60,0 +33.60,9.60,14.72,0.00,1.00,9.60,9.60,0 +38.40,9.60,14.68,0.00,1.00,14.40,14.40,0 +43.20,14.40,14.64,0.00,1.00,14.40,14.40,0 +48.00,14.40,14.60,0.00,1.00,19.20,14.40,0 +52.80,14.40,14.56,0.00,1.00,24.00,14.40,0 +57.60,14.40,14.52,0.00,1.00,24.00,19.20,0 +62.40,14.40,14.48,0.00,1.00,28.80,19.20,0 +67.20,14.40,14.44,0.00,1.00,38.40,19.20,0 +72.00,19.20,14.40,0.00,1.00,43.20,19.20,0 +76.80,19.20,14.36,0.00,1.00,52.80,19.20,0 +81.60,19.20,14.32,0.00,1.00,62.40,19.20,0 +86.40,19.20,14.28,0.00,1.00,76.80,19.20,0 +91.20,19.20,14.24,0.00,1.00,96.00,19.20,0 +96.00,19.20,14.20,0.00,1.00,110.40,19.20,0 +100.80,19.20,14.16,0.00,1.00,120.00,19.20,0 +105.60,19.20,14.12,0.00,1.00,134.40,19.20,0 +110.40,19.20,14.08,0.00,1.00,139.20,19.20,0 +115.20,14.40,14.04,0.00,1.00,148.80,14.40,0 +120.00,14.40,13.99,0.00,1.00,153.60,14.40,0 +124.80,14.40,13.95,0.00,1.00,158.40,14.40,0 +129.60,14.40,13.91,0.00,1.00,158.40,14.40,0 +134.40,14.40,13.87,0.00,1.00,163.20,14.40,0 +139.20,9.60,13.83,0.00,1.00,163.20,9.60,0 +144.00,9.60,13.79,0.00,1.00,168.00,9.60,0 +148.80,9.60,13.75,0.00,1.00,168.00,9.60,0 +153.60,9.60,13.71,0.00,1.00,172.80,4.80,0 +158.40,4.80,13.67,0.00,1.00,172.80,4.80,0 +163.20,4.80,13.63,0.00,1.00,172.80,4.80,0 +168.00,4.80,13.59,0.00,1.00,177.60,0.00,0 +172.80,0.00,13.55,0.00,1.00,177.60,0.00,0 +177.60,0.00,13.51,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,13.47,0.00,1.00,-177.60,-0.00,0 +-172.80,-0.00,13.43,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,13.39,0.00,1.00,-177.60,-4.80,0 +-163.20,-4.80,13.35,0.00,1.00,-172.80,-4.80,0 +-158.40,-4.80,13.31,0.00,1.00,-172.80,-9.60,0 +-153.60,-9.60,13.27,0.00,1.00,-172.80,-9.60,0 +-148.80,-9.60,13.23,0.00,1.00,-168.00,-9.60,0 +-144.00,-9.60,13.19,0.00,1.00,-168.00,-14.40,0 +-139.20,-9.60,13.15,0.00,1.00,-163.20,-14.40,0 +-134.40,-14.40,13.11,0.00,1.00,-163.20,-14.40,0 +-129.60,-14.40,13.07,0.00,1.00,-158.40,-14.40,0 +-124.80,-14.40,13.03,0.00,1.00,-158.40,-14.40,0 +-120.00,-14.40,12.99,0.00,1.00,-153.60,-19.20,0 +-115.20,-14.40,12.95,0.00,1.00,-148.80,-19.20,0 +-110.40,-19.20,12.91,0.00,1.00,-139.20,-19.20,0 +-105.60,-19.20,12.87,0.00,1.00,-134.40,-19.20,0 +-100.80,-19.20,12.83,0.00,1.00,-120.00,-19.20,0 +-96.00,-19.20,12.79,0.00,1.00,-110.40,-19.20,0 +-91.20,-19.20,12.75,0.00,1.00,-96.00,-19.20,0 +-86.40,-19.20,12.71,0.00,1.00,-76.80,-19.20,0 +-81.60,-19.20,12.67,0.00,1.00,-62.40,-19.20,0 +-76.80,-19.20,12.63,0.00,1.00,-52.80,-19.20,0 +-72.00,-19.20,12.59,0.00,1.00,-43.20,-19.20,0 +-67.20,-14.40,12.55,0.00,1.00,-38.40,-19.20,0 +-62.40,-14.40,12.51,0.00,1.00,-28.80,-14.40,0 +-57.60,-14.40,12.47,0.00,1.00,-24.00,-14.40,0 +-52.80,-14.40,12.43,0.00,1.00,-24.00,-14.40,0 +-48.00,-14.40,12.39,0.00,1.00,-19.20,-14.40,0 +-43.20,-14.40,12.35,0.00,1.00,-14.40,-9.60,0 +-38.40,-9.60,12.31,0.00,1.00,-14.40,-9.60,0 +-33.60,-9.60,12.27,0.00,1.00,-9.60,-9.60,0 +-28.80,-9.60,12.23,0.00,1.00,-9.60,-9.60,0 +-24.00,-9.60,12.19,0.00,1.00,-9.60,-4.80,0 +-19.20,-4.80,12.15,0.00,1.00,-4.80,-4.80,0 +-14.40,-4.80,12.11,0.00,1.00,-4.80,-4.80,0 +-9.60,-4.80,12.07,0.00,1.00,-4.80,-0.00,0 +-4.80,-0.00,12.03,0.00,1.00,-0.00,0.00,0 +0.00,0.00,11.99,0.00,1.00,0.00,0.00,0 +4.80,0.00,11.95,0.00,1.00,0.00,0.00,0 +9.60,0.00,11.91,0.00,1.00,0.00,4.80,0 +14.40,4.80,11.87,0.00,1.00,4.80,4.80,0 +19.20,4.80,11.83,0.00,1.00,4.80,4.80,0 +24.00,4.80,11.79,0.00,1.00,4.80,4.80,0 +28.80,4.80,11.75,0.00,1.00,4.80,9.60,0 +33.60,9.60,11.71,0.00,1.00,9.60,9.60,0 +38.40,9.60,11.67,0.00,1.00,9.60,9.60,0 +43.20,9.60,11.63,0.00,1.00,14.40,9.60,0 +48.00,9.60,11.59,0.00,1.00,14.40,9.60,0 +52.80,9.60,11.55,0.00,1.00,14.40,14.40,0 +57.60,9.60,11.51,0.00,1.00,19.20,14.40,0 +62.40,9.60,11.47,0.00,1.00,24.00,14.40,0 +67.20,14.40,11.43,0.00,1.00,28.80,14.40,0 +72.00,14.40,11.39,0.00,1.00,33.60,14.40,0 +76.80,14.40,11.35,0.00,1.00,43.20,14.40,0 +81.60,14.40,11.31,0.00,1.00,57.60,14.40,0 +86.40,14.40,11.27,0.00,1.00,76.80,14.40,0 +91.20,14.40,11.23,0.00,1.00,96.00,14.40,0 +96.00,14.40,11.19,0.00,1.00,115.20,14.40,0 +100.80,14.40,11.15,0.00,1.00,129.60,14.40,0 +105.60,14.40,11.11,0.00,1.00,139.20,14.40,0 +110.40,14.40,11.07,0.00,1.00,148.80,14.40,0 +115.20,9.60,11.03,0.00,1.00,153.60,14.40,0 +120.00,9.60,10.99,0.00,1.00,158.40,9.60,0 +124.80,9.60,10.95,0.00,1.00,163.20,9.60,0 +129.60,9.60,10.91,0.00,1.00,163.20,9.60,0 +134.40,9.60,10.87,0.00,1.00,168.00,9.60,0 +139.20,9.60,10.83,0.00,1.00,168.00,9.60,0 +144.00,9.60,10.79,0.00,1.00,172.80,9.60,0 +148.80,4.80,10.75,0.00,1.00,172.80,4.80,0 +153.60,4.80,10.71,0.00,1.00,172.80,4.80,0 +158.40,4.80,10.67,0.00,1.00,172.80,4.80,0 +163.20,4.80,10.63,0.00,1.00,177.60,4.80,0 +168.00,4.80,10.59,0.00,1.00,177.60,0.00,0 +172.80,0.00,10.55,0.00,1.00,177.60,0.00,0 +177.60,0.00,10.51,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,10.47,0.00,1.00,-177.60,-0.00,0 +-172.80,-0.00,10.43,0.00,1.00,-177.60,-4.80,0 +-168.00,-4.80,10.39,0.00,1.00,-177.60,-4.80,0 +-163.20,-4.80,10.35,0.00,1.00,-177.60,-4.80,0 +-158.40,-4.80,10.31,0.00,1.00,-172.80,-4.80,0 +-153.60,-4.80,10.27,0.00,1.00,-172.80,-9.60,0 +-148.80,-4.80,10.23,0.00,1.00,-172.80,-9.60,0 +-144.00,-9.60,10.19,0.00,1.00,-172.80,-9.60,0 +-139.20,-9.60,10.15,0.00,1.00,-168.00,-9.60,0 +-134.40,-9.60,10.11,0.00,1.00,-168.00,-9.60,0 +-129.60,-9.60,10.07,0.00,1.00,-163.20,-9.60,0 +-124.80,-9.60,10.03,0.00,1.00,-163.20,-14.40,0 +-120.00,-9.60,9.98,0.00,1.00,-158.40,-14.40,0 +-115.20,-9.60,9.94,0.00,1.00,-153.60,-14.40,0 +-110.40,-14.40,9.90,0.00,1.00,-148.80,-14.40,0 +-105.60,-14.40,9.86,0.00,1.00,-139.20,-14.40,0 +-100.80,-14.40,9.82,0.00,1.00,-129.60,-14.40,0 +-96.00,-14.40,9.78,0.00,1.00,-115.20,-14.40,0 +-91.20,-14.40,9.74,0.00,1.00,-96.00,-14.40,0 +-86.40,-14.40,9.70,0.00,1.00,-76.80,-14.40,0 +-81.60,-14.40,9.66,0.00,1.00,-57.60,-14.40,0 +-76.80,-14.40,9.62,0.00,1.00,-43.20,-14.40,0 +-72.00,-14.40,9.58,0.00,1.00,-33.60,-14.40,0 +-67.20,-14.40,9.54,0.00,1.00,-28.80,-14.40,0 +-62.40,-9.60,9.50,0.00,1.00,-24.00,-14.40,0 +-57.60,-9.60,9.46,0.00,1.00,-19.20,-9.60,0 +-52.80,-9.60,9.42,0.00,1.00,-14.40,-9.60,0 +-48.00,-9.60,9.38,0.00,1.00,-14.40,-9.60,0 +-43.20,-9.60,9.34,0.00,1.00,-14.40,-9.60,0 +-38.40,-9.60,9.30,0.00,1.00,-9.60,-9.60,0 +-33.60,-9.60,9.26,0.00,1.00,-9.60,-4.80,0 +-28.80,-4.80,9.22,0.00,1.00,-4.80,-4.80,0 +-24.00,-4.80,9.18,0.00,1.00,-4.80,-4.80,0 +-19.20,-4.80,9.14,0.00,1.00,-4.80,-4.80,0 +-14.40,-4.80,9.10,0.00,1.00,-4.80,-0.00,0 +-9.60,-0.00,9.06,0.00,1.00,-0.00,-0.00,0 +-4.80,-0.00,9.02,0.00,1.00,-0.00,0.00,0 +0.00,0.00,8.98,0.00,1.00,0.00,0.00,0 +4.80,0.00,8.94,0.00,1.00,0.00,0.00,0 +9.60,0.00,8.90,0.00,1.00,0.00,0.00,0 +14.40,0.00,8.86,0.00,1.00,0.00,4.80,0 +19.20,4.80,8.82,0.00,1.00,4.80,4.80,0 +24.00,4.80,8.78,0.00,1.00,4.80,4.80,0 +28.80,4.80,8.74,0.00,1.00,4.80,4.80,0 +33.60,4.80,8.70,0.00,1.00,4.80,4.80,0 +38.40,4.80,8.66,0.00,1.00,4.80,4.80,0 +43.20,4.80,8.62,0.00,1.00,9.60,4.80,0 +48.00,4.80,8.58,0.00,1.00,9.60,9.60,0 +52.80,4.80,8.54,0.00,1.00,9.60,9.60,0 +57.60,4.80,8.50,0.00,1.00,14.40,9.60,0 +62.40,9.60,8.46,0.00,1.00,14.40,9.60,0 +67.20,9.60,8.42,0.00,1.00,19.20,9.60,0 +72.00,9.60,8.38,0.00,1.00,24.00,9.60,0 +76.80,9.60,8.34,0.00,1.00,33.60,9.60,0 +81.60,9.60,8.30,0.00,1.00,43.20,9.60,0 +86.40,9.60,8.26,0.00,1.00,67.20,9.60,0 +91.20,9.60,8.22,0.00,1.00,96.00,9.60,0 +96.00,9.60,8.18,0.00,1.00,124.80,9.60,0 +100.80,9.60,8.14,0.00,1.00,144.00,9.60,0 +105.60,9.60,8.10,0.00,1.00,153.60,9.60,0 +110.40,9.60,8.06,0.00,1.00,158.40,9.60,0 +115.20,9.60,8.02,0.00,1.00,163.20,9.60,0 +120.00,9.60,7.98,0.00,1.00,168.00,9.60,0 +124.80,4.80,7.94,0.00,1.00,168.00,9.60,0 +129.60,4.80,7.90,0.00,1.00,168.00,4.80,0 +134.40,4.80,7.86,0.00,1.00,172.80,4.80,0 +139.20,4.80,7.82,0.00,1.00,172.80,4.80,0 +144.00,4.80,7.78,0.00,1.00,172.80,4.80,0 +148.80,4.80,7.74,0.00,1.00,172.80,4.80,0 +153.60,4.80,7.70,0.00,1.00,177.60,4.80,0 +158.40,4.80,7.66,0.00,1.00,177.60,4.80,0 +163.20,4.80,7.62,0.00,1.00,177.60,0.00,0 +168.00,0.00,7.58,0.00,1.00,177.60,0.00,0 +172.80,0.00,7.54,0.00,1.00,177.60,0.00,0 +177.60,0.00,7.50,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,7.46,0.00,1.00,-177.60,-0.00,0 +-172.80,-0.00,7.42,0.00,1.00,-177.60,-0.00,0 +-168.00,-0.00,7.38,0.00,1.00,-177.60,-4.80,0 +-163.20,-4.80,7.34,0.00,1.00,-177.60,-4.80,0 +-158.40,-4.80,7.30,0.00,1.00,-177.60,-4.80,0 +-153.60,-4.80,7.26,0.00,1.00,-177.60,-4.80,0 +-148.80,-4.80,7.22,0.00,1.00,-172.80,-4.80,0 +-144.00,-4.80,7.18,0.00,1.00,-172.80,-4.80,0 +-139.20,-4.80,7.14,0.00,1.00,-172.80,-4.80,0 +-134.40,-4.80,7.10,0.00,1.00,-172.80,-9.60,0 +-129.60,-4.80,7.06,0.00,1.00,-168.00,-9.60,0 +-124.80,-4.80,7.02,0.00,1.00,-168.00,-9.60,0 +-120.00,-9.60,6.98,0.00,1.00,-168.00,-9.60,0 +-115.20,-9.60,6.94,0.00,1.00,-163.20,-9.60,0 +-110.40,-9.60,6.90,0.00,1.00,-158.40,-9.60,0 +-105.60,-9.60,6.86,0.00,1.00,-153.60,-9.60,0 +-100.80,-9.60,6.82,0.00,1.00,-144.00,-9.60,0 +-96.00,-9.60,6.78,0.00,1.00,-124.80,-9.60,0 +-91.20,-9.60,6.74,0.00,1.00,-96.00,-9.60,0 +-86.40,-9.60,6.70,0.00,1.00,-67.20,-9.60,0 +-81.60,-9.60,6.66,0.00,1.00,-43.20,-9.60,0 +-76.80,-9.60,6.62,0.00,1.00,-33.60,-9.60,0 +-72.00,-9.60,6.58,0.00,1.00,-24.00,-9.60,0 +-67.20,-9.60,6.54,0.00,1.00,-19.20,-9.60,0 +-62.40,-9.60,6.50,0.00,1.00,-14.40,-9.60,0 +-57.60,-4.80,6.46,0.00,1.00,-14.40,-9.60,0 +-52.80,-4.80,6.42,0.00,1.00,-9.60,-4.80,0 +-48.00,-4.80,6.38,0.00,1.00,-9.60,-4.80,0 +-43.20,-4.80,6.34,0.00,1.00,-9.60,-4.80,0 +-38.40,-4.80,6.30,0.00,1.00,-4.80,-4.80,0 +-33.60,-4.80,6.26,0.00,1.00,-4.80,-4.80,0 +-28.80,-4.80,6.22,0.00,1.00,-4.80,-4.80,0 +-24.00,-4.80,6.18,0.00,1.00,-4.80,-4.80,0 +-19.20,-4.80,6.14,0.00,1.00,-4.80,-0.00,0 +-14.40,-0.00,6.10,0.00,1.00,-0.00,-0.00,0 +-9.60,-0.00,6.06,0.00,1.00,-0.00,-0.00,0 +-4.80,-0.00,6.02,0.00,1.00,-0.00,0.00,0 +0.00,0.00,5.97,0.00,1.00,0.00,0.00,0 +4.80,0.00,5.93,0.00,1.00,0.00,0.00,0 +9.60,0.00,5.89,0.00,1.00,0.00,0.00,0 +14.40,0.00,5.85,0.00,1.00,0.00,0.00,0 +19.20,0.00,5.81,0.00,1.00,0.00,0.00,0 +24.00,0.00,5.77,0.00,1.00,0.00,0.00,0 +28.80,0.00,5.73,0.00,1.00,0.00,4.80,0 +33.60,0.00,5.69,0.00,1.00,0.00,4.80,0 +38.40,0.00,5.65,0.00,1.00,4.80,4.80,0 +43.20,4.80,5.61,0.00,1.00,4.80,4.80,0 +48.00,4.80,5.57,0.00,1.00,4.80,4.80,0 +52.80,4.80,5.53,0.00,1.00,4.80,4.80,0 +57.60,4.80,5.49,0.00,1.00,4.80,4.80,0 +62.40,4.80,5.45,0.00,1.00,4.80,4.80,0 +67.20,4.80,5.41,0.00,1.00,9.60,4.80,0 +72.00,4.80,5.37,0.00,1.00,9.60,4.80,0 +76.80,4.80,5.33,0.00,1.00,14.40,4.80,0 +81.60,4.80,5.29,0.00,1.00,24.00,4.80,0 +86.40,4.80,5.25,0.00,1.00,43.20,4.80,0 +91.20,4.80,5.21,0.00,1.00,110.40,4.80,0 +96.00,4.80,5.17,0.00,1.00,148.80,4.80,0 +100.80,4.80,5.13,0.00,1.00,163.20,4.80,0 +105.60,4.80,5.09,0.00,1.00,168.00,4.80,0 +110.40,4.80,5.05,0.00,1.00,172.80,4.80,0 +115.20,4.80,5.01,0.00,1.00,172.80,4.80,0 +120.00,4.80,4.97,0.00,1.00,172.80,4.80,0 +124.80,4.80,4.93,0.00,1.00,172.80,4.80,0 +129.60,4.80,4.89,0.00,1.00,177.60,4.80,0 +134.40,4.80,4.85,0.00,1.00,177.60,4.80,0 +139.20,0.00,4.81,0.00,1.00,177.60,4.80,0 +144.00,0.00,4.77,0.00,1.00,177.60,4.80,0 +148.80,0.00,4.73,0.00,1.00,177.60,0.00,0 +153.60,0.00,4.69,0.00,1.00,177.60,0.00,0 +158.40,0.00,4.65,0.00,1.00,177.60,0.00,0 +163.20,0.00,4.61,0.00,1.00,177.60,0.00,0 +168.00,0.00,4.57,0.00,1.00,177.60,0.00,0 +172.80,0.00,4.53,0.00,1.00,177.60,0.00,0 +177.60,0.00,4.49,0.00,1.00,177.60,-0.00,0 +-177.60,-0.00,4.45,0.00,1.00,-177.60,-0.00,0 +-172.80,-0.00,4.41,0.00,1.00,-177.60,-0.00,0 +-168.00,-0.00,4.37,0.00,1.00,-177.60,-0.00,0 +-163.20,-0.00,4.33,0.00,1.00,-177.60,-0.00,0 +-158.40,-0.00,4.29,0.00,1.00,-177.60,-0.00,0 +-153.60,-0.00,4.25,0.00,1.00,-177.60,-4.80,0 +-148.80,-0.00,4.21,0.00,1.00,-177.60,-4.80,0 +-144.00,-0.00,4.17,0.00,1.00,-177.60,-4.80,0 +-139.20,-0.00,4.13,0.00,1.00,-177.60,-4.80,0 +-134.40,-4.80,4.09,0.00,1.00,-177.60,-4.80,0 +-129.60,-4.80,4.05,0.00,1.00,-177.60,-4.80,0 +-124.80,-4.80,4.01,0.00,1.00,-172.80,-4.80,0 +-120.00,-4.80,3.97,0.00,1.00,-172.80,-4.80,0 +-115.20,-4.80,3.93,0.00,1.00,-172.80,-4.80,0 +-110.40,-4.80,3.89,0.00,1.00,-172.80,-4.80,0 +-105.60,-4.80,3.85,0.00,1.00,-168.00,-4.80,0 +-100.80,-4.80,3.81,0.00,1.00,-163.20,-4.80,0 +-96.00,-4.80,3.77,0.00,1.00,-148.80,-4.80,0 +-91.20,-4.80,3.73,0.00,1.00,-110.40,-4.80,0 +-86.40,-4.80,3.69,0.00,1.00,-43.20,-4.80,0 +-81.60,-4.80,3.65,0.00,1.00,-24.00,-4.80,0 +-76.80,-4.80,3.61,0.00,1.00,-14.40,-4.80,0 +-72.00,-4.80,3.57,0.00,1.00,-9.60,-4.80,0 +-67.20,-4.80,3.53,0.00,1.00,-9.60,-4.80,0 +-62.40,-4.80,3.49,0.00,1.00,-4.80,-4.80,0 +-57.60,-4.80,3.45,0.00,1.00,-4.80,-4.80,0 +-52.80,-4.80,3.41,0.00,1.00,-4.80,-4.80,0 +-48.00,-4.80,3.37,0.00,1.00,-4.80,-4.80,0 +-43.20,-4.80,3.33,0.00,1.00,-4.80,-4.80,0 +-38.40,-0.00,3.29,0.00,1.00,-4.80,-4.80,0 +-33.60,-0.00,3.25,0.00,1.00,-0.00,-0.00,0 +-28.80,-0.00,3.21,0.00,1.00,-0.00,-0.00,0 +-24.00,-0.00,3.17,0.00,1.00,-0.00,-0.00,0 +-19.20,-0.00,3.13,0.00,1.00,-0.00,-0.00,0 +-14.40,-0.00,3.09,0.00,1.00,-0.00,-0.00,0 +-9.60,-0.00,3.05,0.00,1.00,-0.00,-0.00,0 +-4.80,-0.00,3.01,0.00,1.00,-0.00,0.00,0 +0.00,0.00,2.97,0.00,1.00,-0.00,0.00,0 +4.80,-0.00,2.93,0.00,1.00,-0.00,0.00,0 +9.60,-0.00,2.89,0.00,1.00,-0.00,0.00,0 +14.40,-0.00,2.85,0.00,1.00,-0.00,0.00,0 +19.20,-0.00,2.81,0.00,1.00,-0.00,0.00,0 +24.00,-0.00,2.77,0.00,1.00,-0.00,0.00,0 +28.80,-0.00,2.73,0.00,1.00,-0.00,0.00,0 +33.60,-0.00,2.69,0.00,1.00,-0.00,0.00,0 +38.40,-0.00,2.65,0.00,1.00,-0.00,0.00,0 +43.20,-0.00,2.61,0.00,1.00,-0.00,0.00,0 +48.00,-0.00,2.57,0.00,1.00,-0.00,0.00,0 +52.80,-0.00,2.53,0.00,1.00,-0.00,0.00,0 +57.60,-0.00,2.49,0.00,1.00,-0.00,0.00,0 +62.40,-0.00,2.45,0.00,1.00,-0.00,0.00,0 +67.20,-0.00,2.41,0.00,1.00,-4.80,0.00,0 +72.00,-0.00,2.37,0.00,1.00,-4.80,0.00,0 +76.80,-0.00,2.33,0.00,1.00,-4.80,0.00,0 +81.60,-0.00,2.29,0.00,1.00,-9.60,0.00,0 +86.40,-0.00,2.25,0.00,1.00,-19.20,0.00,0 +91.20,-0.00,2.21,0.00,1.00,-134.40,0.00,0 +96.00,-0.00,2.17,0.00,1.00,-168.00,0.00,0 +100.80,-0.00,2.13,0.00,1.00,-172.80,0.00,0 +105.60,-0.00,2.09,0.00,1.00,-177.60,0.00,0 +110.40,-0.00,2.05,0.00,1.00,-177.60,0.00,0 +115.20,-0.00,2.01,0.00,1.00,-177.60,0.00,0 +120.00,-0.00,1.96,0.00,1.00,-177.60,0.00,0 +124.80,-0.00,1.92,0.00,1.00,-177.60,0.00,0 +129.60,-0.00,1.88,0.00,1.00,-177.60,0.00,0 +134.40,-0.00,1.84,0.00,1.00,-177.60,0.00,0 +139.20,-0.00,1.80,0.00,1.00,-177.60,0.00,0 +144.00,-0.00,1.76,0.00,1.00,-177.60,0.00,0 +148.80,-0.00,1.72,0.00,1.00,-177.60,0.00,0 +153.60,-0.00,1.68,0.00,1.00,-177.60,0.00,0 +158.40,-0.00,1.64,0.00,1.00,-177.60,0.00,0 +163.20,-0.00,1.60,0.00,1.00,-177.60,0.00,0 +168.00,-0.00,1.56,0.00,1.00,-177.60,0.00,0 +172.80,-0.00,1.52,0.00,1.00,-177.60,0.00,0 +177.60,-0.00,1.48,0.00,1.00,-177.60,0.00,0 +-177.60,0.00,1.44,0.00,1.00,177.60,0.00,0 +-172.80,0.00,1.40,0.00,1.00,177.60,0.00,0 +-168.00,0.00,1.36,0.00,1.00,177.60,0.00,0 +-163.20,0.00,1.32,0.00,1.00,177.60,0.00,0 +-158.40,0.00,1.28,0.00,1.00,177.60,0.00,0 +-153.60,0.00,1.24,0.00,1.00,177.60,0.00,0 +-148.80,0.00,1.20,0.00,1.00,177.60,0.00,0 +-144.00,0.00,1.16,0.00,1.00,177.60,0.00,0 +-139.20,0.00,1.12,0.00,1.00,177.60,0.00,0 +-134.40,0.00,1.08,0.00,1.00,177.60,0.00,0 +-129.60,0.00,1.04,0.00,1.00,177.60,0.00,0 +-124.80,0.00,1.00,0.00,1.00,177.60,0.00,0 +-120.00,0.00,0.96,0.00,1.00,177.60,0.00,0 +-115.20,0.00,0.92,0.00,1.00,177.60,0.00,0 +-110.40,0.00,0.88,0.00,1.00,177.60,0.00,0 +-105.60,0.00,0.84,0.00,1.00,177.60,0.00,0 +-100.80,0.00,0.80,0.00,1.00,172.80,0.00,0 +-96.00,0.00,0.76,0.00,1.00,168.00,0.00,0 +-91.20,0.00,0.72,0.00,1.00,134.40,0.00,0 +-86.40,0.00,0.68,0.00,1.00,19.20,0.00,0 +-81.60,0.00,0.64,0.00,1.00,9.60,0.00,0 +-76.80,0.00,0.60,0.00,1.00,4.80,0.00,0 +-72.00,0.00,0.56,0.00,1.00,4.80,0.00,0 +-67.20,0.00,0.52,0.00,1.00,4.80,0.00,0 +-62.40,0.00,0.48,0.00,1.00,0.00,0.00,0 +-57.60,0.00,0.44,0.00,1.00,0.00,0.00,0 +-52.80,0.00,0.40,0.00,1.00,0.00,0.00,0 +-48.00,0.00,0.36,0.00,1.00,0.00,0.00,0 +-43.20,0.00,0.32,0.00,1.00,0.00,0.00,0 +-38.40,0.00,0.28,0.00,1.00,0.00,0.00,0 +-33.60,0.00,0.24,0.00,1.00,0.00,0.00,0 +-28.80,0.00,0.20,0.00,1.00,0.00,0.00,0 +-24.00,0.00,0.16,0.00,1.00,0.00,0.00,0 +-19.20,0.00,0.12,0.00,1.00,0.00,0.00,0 +-14.40,0.00,0.08,0.00,1.00,0.00,0.00,0 +-9.60,0.00,0.04,0.00,1.00,0.00,0.00,0 +-4.80,0.00,0.00,0.00,1.00,0.00,0.00,0 diff --git a/scripts/testv/stvISM_with_no_diegetic_switch.csv b/scripts/testv/stvISM_with_no_diegetic_switch.csv new file mode 100644 index 0000000000..ee0e797637 --- /dev/null +++ b/scripts/testv/stvISM_with_no_diegetic_switch.csv @@ -0,0 +1,1500 @@ +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,0 +-8.83,0.00,1.00,0.00,1.00,0.00,0.00,0 +-13.24,0.00,1.00,0.00,1.00,0.00,0.00,0 +-17.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +-22.03,0.00,1.00,0.00,1.00,0.00,0.00,0 +-26.41,0.00,1.00,0.00,1.00,0.00,0.00,0 +-30.77,0.00,1.00,0.00,1.00,0.00,0.00,0 +-35.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +-39.44,0.00,1.00,0.00,1.00,0.00,0.00,0 +-43.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +-48.01,0.00,1.00,0.00,1.00,0.00,0.00,0 +-52.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +-56.46,0.00,1.00,0.00,1.00,0.00,0.00,0 +-60.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +-64.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +-68.88,0.00,1.00,0.00,1.00,0.00,0.00,0 +-72.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +-76.96,0.00,1.00,0.00,1.00,0.00,0.00,0 +-80.93,0.00,1.00,0.00,1.00,0.00,0.00,0 +-84.85,0.00,1.00,0.00,1.00,0.00,0.00,0 +-88.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +-92.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +-96.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +-100.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +-103.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +-107.23,0.00,1.00,0.00,1.00,0.00,0.00,0 +-110.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +-114.19,0.00,1.00,0.00,1.00,0.00,0.00,0 +-117.57,0.00,1.00,0.00,1.00,0.00,0.00,0 +-120.88,0.00,1.00,0.00,1.00,0.00,0.00,0 +-124.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +-127.28,0.00,1.00,0.00,1.00,0.00,0.00,0 +-130.36,0.00,1.00,0.00,1.00,0.00,0.00,0 +-133.37,0.00,1.00,0.00,1.00,0.00,0.00,0 +-136.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +-139.14,0.00,1.00,0.00,1.00,0.00,0.00,0 +-141.90,0.00,1.00,0.00,1.00,0.00,0.00,0 +-144.58,0.00,1.00,0.00,1.00,0.00,0.00,0 +-147.17,0.00,1.00,0.00,1.00,0.00,0.00,0 +-149.66,0.00,1.00,0.00,1.00,0.00,0.00,0 +-152.07,0.00,1.00,0.00,1.00,0.00,0.00,0 +-154.39,0.00,1.00,0.00,1.00,0.00,0.00,0 +-156.62,0.00,1.00,0.00,1.00,0.00,0.00,0 +-158.75,0.00,1.00,0.00,1.00,0.00,0.00,0 +-160.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +-162.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +-164.56,0.00,1.00,0.00,1.00,0.00,0.00,0 +-166.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +-167.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +-169.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +-170.92,0.00,1.00,0.00,1.00,0.00,0.00,0 +-172.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +-173.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +-174.61,0.00,1.00,0.00,1.00,0.00,0.00,0 +-175.63,0.00,1.00,0.00,1.00,0.00,0.00,0 +-176.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +-177.35,0.00,1.00,0.00,1.00,0.00,0.00,0 +-178.05,0.00,1.00,0.00,1.00,0.00,0.00,0 +-178.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.13,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.51,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.95,0.00,1.00,0.00,1.00,0.00,0.00,0 +-180.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.95,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.51,0.00,1.00,0.00,1.00,0.00,0.00,0 +-179.13,0.00,1.00,0.00,1.00,0.00,0.00,0 +-178.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +-178.05,0.00,1.00,0.00,1.00,0.00,0.00,0 +-177.35,0.00,1.00,0.00,1.00,0.00,0.00,0 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-52.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +-48.01,0.00,1.00,0.00,1.00,0.00,0.00,0 +-43.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +-39.44,0.00,1.00,0.00,1.00,0.00,0.00,0 +-35.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +-30.77,0.00,1.00,0.00,1.00,0.00,0.00,0 +-26.41,0.00,1.00,0.00,1.00,0.00,0.00,0 +-22.03,0.00,1.00,0.00,1.00,0.00,0.00,0 +-17.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +-13.24,0.00,1.00,0.00,1.00,0.00,0.00,0 +-8.83,0.00,1.00,0.00,1.00,0.00,0.00,0 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,0 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,0 +8.83,0.00,1.00,0.00,1.00,0.00,0.00,0 +13.24,0.00,1.00,0.00,1.00,0.00,0.00,0 +17.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +22.03,0.00,1.00,0.00,1.00,0.00,0.00,0 +26.41,0.00,1.00,0.00,1.00,0.00,0.00,0 +30.77,0.00,1.00,0.00,1.00,0.00,0.00,0 +35.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +39.44,0.00,1.00,0.00,1.00,0.00,0.00,0 +43.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +48.01,0.00,1.00,0.00,1.00,0.00,0.00,0 +52.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +56.46,0.00,1.00,0.00,1.00,0.00,0.00,0 +60.64,0.00,1.00,0.00,1.00,0.00,0.00,0 +64.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +68.88,0.00,1.00,0.00,1.00,0.00,0.00,0 +72.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +76.96,0.00,1.00,0.00,1.00,0.00,0.00,0 +80.93,0.00,1.00,0.00,1.00,0.00,0.00,0 +84.85,0.00,1.00,0.00,1.00,0.00,0.00,0 +88.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +92.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +96.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +100.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +103.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +107.23,0.00,1.00,0.00,1.00,0.00,0.00,0 +110.74,0.00,1.00,0.00,1.00,0.00,0.00,0 +114.19,0.00,1.00,0.00,1.00,0.00,0.00,0 +117.57,0.00,1.00,0.00,1.00,0.00,0.00,0 +120.88,0.00,1.00,0.00,1.00,0.00,0.00,0 +124.12,0.00,1.00,0.00,1.00,0.00,0.00,0 +127.28,0.00,1.00,0.00,1.00,0.00,0.00,0 +130.36,0.00,1.00,0.00,1.00,0.00,0.00,0 +133.37,0.00,1.00,0.00,1.00,0.00,0.00,0 +136.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +139.14,0.00,1.00,0.00,1.00,0.00,0.00,0 +141.90,0.00,1.00,0.00,1.00,0.00,0.00,0 +144.58,0.00,1.00,0.00,1.00,0.00,0.00,0 +147.17,0.00,1.00,0.00,1.00,0.00,0.00,0 +149.66,0.00,1.00,0.00,1.00,0.00,0.00,0 +152.07,0.00,1.00,0.00,1.00,0.00,0.00,0 +154.39,0.00,1.00,0.00,1.00,0.00,0.00,0 +156.62,0.00,1.00,0.00,1.00,0.00,0.00,0 +158.75,0.00,1.00,0.00,1.00,0.00,0.00,0 +160.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +162.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +164.56,0.00,1.00,0.00,1.00,0.00,0.00,0 +166.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +167.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +169.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +170.92,0.00,1.00,0.00,1.00,0.00,0.00,0 +172.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +173.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +174.61,0.00,1.00,0.00,1.00,0.00,0.00,0 +175.63,0.00,1.00,0.00,1.00,0.00,0.00,0 +176.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +177.35,0.00,1.00,0.00,1.00,0.00,0.00,0 +178.05,0.00,1.00,0.00,1.00,0.00,0.00,0 +178.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.13,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.51,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.95,0.00,1.00,0.00,1.00,0.00,0.00,0 +180.00,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.95,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.51,0.00,1.00,0.00,1.00,0.00,0.00,0 +179.13,0.00,1.00,0.00,1.00,0.00,0.00,0 +178.65,0.00,1.00,0.00,1.00,0.00,0.00,0 +178.05,0.00,1.00,0.00,1.00,0.00,0.00,0 +177.35,0.00,1.00,0.00,1.00,0.00,0.00,0 +176.54,0.00,1.00,0.00,1.00,0.00,0.00,0 +175.63,0.00,1.00,0.00,1.00,0.00,0.00,0 +174.61,0.00,1.00,0.00,1.00,0.00,0.00,0 +173.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +172.25,0.00,1.00,0.00,1.00,0.00,0.00,0 +170.92,0.00,1.00,0.00,1.00,0.00,0.00,0 +169.48,0.00,1.00,0.00,1.00,0.00,0.00,0 +167.94,0.00,1.00,0.00,1.00,0.00,0.00,0 +166.30,0.00,1.00,0.00,1.00,0.00,0.00,0 +164.56,0.00,1.00,0.00,1.00,0.00,0.00,0 +162.72,0.00,1.00,0.00,1.00,0.00,0.00,0 +160.78,0.00,1.00,0.00,1.00,0.00,0.00,0 +158.75,0.00,1.00,0.00,1.00,0.00,0.00,0 +156.62,0.00,1.00,0.00,1.00,0.00,0.00,0 +154.39,0.00,1.00,0.00,1.00,0.00,0.00,0 +152.07,0.00,1.00,0.00,1.00,0.00,0.00,0 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +0.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-2.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-4.42,0.00,1.00,0.00,1.00,0.00,0.00,1 +-6.62,0.00,1.00,0.00,1.00,0.00,0.00,1 +-8.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-11.02,0.00,1.00,0.00,1.00,0.00,0.00,1 +-13.21,0.00,1.00,0.00,1.00,0.00,0.00,1 +-15.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-17.56,0.00,1.00,0.00,1.00,0.00,0.00,1 +-19.72,0.00,1.00,0.00,1.00,0.00,0.00,1 +-21.87,0.00,1.00,0.00,1.00,0.00,0.00,1 +-24.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-26.13,0.00,1.00,0.00,1.00,0.00,0.00,1 +-28.23,0.00,1.00,0.00,1.00,0.00,0.00,1 +-30.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-32.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-34.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-36.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-38.48,0.00,1.00,0.00,1.00,0.00,0.00,1 +-40.47,0.00,1.00,0.00,1.00,0.00,0.00,1 +-42.43,0.00,1.00,0.00,1.00,0.00,0.00,1 +-44.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-46.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-48.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-50.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-51.82,0.00,1.00,0.00,1.00,0.00,0.00,1 +-53.61,0.00,1.00,0.00,1.00,0.00,0.00,1 +-55.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-57.10,0.00,1.00,0.00,1.00,0.00,0.00,1 +-58.79,0.00,1.00,0.00,1.00,0.00,0.00,1 +-60.44,0.00,1.00,0.00,1.00,0.00,0.00,1 +-62.06,0.00,1.00,0.00,1.00,0.00,0.00,1 +-63.64,0.00,1.00,0.00,1.00,0.00,0.00,1 +-65.18,0.00,1.00,0.00,1.00,0.00,0.00,1 +-66.69,0.00,1.00,0.00,1.00,0.00,0.00,1 +-68.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-69.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-90.00,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.89,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.76,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.57,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.32,0.00,1.00,0.00,1.00,0.00,0.00,1 +-89.03,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.67,0.00,1.00,0.00,1.00,0.00,0.00,1 +-88.27,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.81,0.00,1.00,0.00,1.00,0.00,0.00,1 +-87.30,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-86.12,0.00,1.00,0.00,1.00,0.00,0.00,1 +-85.46,0.00,1.00,0.00,1.00,0.00,0.00,1 +-84.74,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.97,0.00,1.00,0.00,1.00,0.00,0.00,1 +-83.15,0.00,1.00,0.00,1.00,0.00,0.00,1 +-82.28,0.00,1.00,0.00,1.00,0.00,0.00,1 +-81.36,0.00,1.00,0.00,1.00,0.00,0.00,1 +-80.39,0.00,1.00,0.00,1.00,0.00,0.00,1 +-79.37,0.00,1.00,0.00,1.00,0.00,0.00,1 +-78.31,0.00,1.00,0.00,1.00,0.00,0.00,1 +-77.20,0.00,1.00,0.00,1.00,0.00,0.00,1 +-76.04,0.00,1.00,0.00,1.00,0.00,0.00,1 +-74.83,0.00,1.00,0.00,1.00,0.00,0.00,1 +-73.58,0.00,1.00,0.00,1.00,0.00,0.00,1 +-72.29,0.00,1.00,0.00,1.00,0.00,0.00,1 +-70.95,0.00,1.00,0.00,1.00,0.00,0.00,1 diff --git a/tests/conftest.py b/tests/conftest.py index ef5f46ffc9..d7a35a36e0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -196,7 +196,6 @@ class EncoderFrontend: sba_order: Optional[str] = None, dtx_mode: Optional[bool] = False, max_band: Optional[str] = None, - agc_op: Optional[int] = None, bypass_mode: Optional[int] = None, quiet_mode: Optional[bool] = True, add_option_list: Optional[list] = None, @@ -213,9 +212,6 @@ class EncoderFrontend: if max_band is not None: command.extend(["-max_band", max_band]) - if agc_op is not None: - command.extend(["-agc", str(agc_op)]) - if bypass_mode is not None: command.extend(["-bypass", str(bypass_mode)]) diff --git a/tests/renderer/README.md b/tests/renderer/README.md index 9748d8abf1..513bd09911 100644 --- a/tests/renderer/README.md +++ b/tests/renderer/README.md @@ -1,3 +1,7 @@ +======================================== +THIS FOLDER WILL NOT BE PART OF DELIVERY +======================================== + # External Renderer Tests See also the [contribution page](https://forge.3gpp.org/rep/ivas-codec-pc/ivas-codec/-/wikis/Contributions/2-external-renderer) for related presentations. diff --git a/tests/renderer/__init__.py b/tests/renderer/__init__.py index c2c14754b4..8429fc9e1c 100644 --- a/tests/renderer/__init__.py +++ b/tests/renderer/__init__.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ - (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange, Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved. diff --git a/tests/renderer/compare_audio.py b/tests/renderer/compare_audio.py index bf3ce26c93..3fc5c064a8 100644 --- a/tests/renderer/compare_audio.py +++ b/tests/renderer/compare_audio.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ - (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange, Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved. diff --git a/tests/renderer/constants.py b/tests/renderer/constants.py index e29696adec..56b4d71e26 100644 --- a/tests/renderer/constants.py +++ b/tests/renderer/constants.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ - (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange, Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved. @@ -94,6 +94,7 @@ FORMAT_TO_FILE_SMOKETEST = { "ISM2": NCHAN_TO_FILE[2], "ISM3": NCHAN_TO_FILE[3], "ISM4": NCHAN_TO_FILE[4], + "NDP_ISM4": NCHAN_TO_FILE[4], # "ISM1": TEST_VECTOR_DIR.joinpath("spectral_test_ism1.txt"), # "ISM2": TEST_VECTOR_DIR.joinpath("spectral_test_ism2.txt"), # "ISM3": TEST_VECTOR_DIR.joinpath("spectral_test_ism3.txt"), @@ -148,6 +149,12 @@ FORMAT_TO_METADATA_FILES = { str(TESTV_DIR.joinpath("stvISM3.csv")), str(TESTV_DIR.joinpath("stvISM4.csv")), ], + "NDP_ISM4": [ + str(TESTV_DIR.joinpath("stvISM1.csv")), + str(TESTV_DIR.joinpath("stvISM2_non-diegetic-pan.csv")), + str(TESTV_DIR.joinpath("stvISM3.csv")), + str(TESTV_DIR.joinpath("stvISM4.csv")), + ], "MASA1": [str(TESTV_DIR.joinpath("stv1MASA1TC48c.met"))], "MASA2": [str(TESTV_DIR.joinpath("stv2MASA2TC48c.met"))], } diff --git a/tests/renderer/data/ism_0a_0e.csv b/tests/renderer/data/ism_0a_0e.csv index 7772c8c916..56a82f0fe3 100644 --- a/tests/renderer/data/ism_0a_0e.csv +++ b/tests/renderer/data/ism_0a_0e.csv @@ -1,750 +1,749 @@ -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 -0,0,1,0,1 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 +0,0,1,0,1,0,0,0 diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index 00ea239714..38b7bbf9e7 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ - (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange, Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved. @@ -441,3 +441,20 @@ def test_metadata(test_info, in_fmt, out_fmt): out_fmt, metadata_input=TEST_VECTOR_DIR.joinpath(f"{in_fmt}.txt"), ) + + +""" non diegetic pan """ + + +@pytest.mark.parametrize("out_fmt", ["STEREO"]) +@pytest.mark.parametrize("in_fmt", ["MONO"]) +@pytest.mark.parametrize("non_diegetic_pan", ["0", "-30", "45", "90", "-90"]) +def test_non_diegetic_pan_static(test_info, in_fmt, out_fmt, non_diegetic_pan): + run_renderer(in_fmt, out_fmt, non_diegetic_pan=non_diegetic_pan) + + +@pytest.mark.parametrize("out_fmt", ["STEREO"]) +@pytest.mark.parametrize("in_fmt", ["ISM1"]) +@pytest.mark.parametrize("non_diegetic_pan", ["0", "-30", "45", "90", "-90"]) +def test_non_diegetic_pan_ism_static(test_info, in_fmt, out_fmt, non_diegetic_pan): + run_renderer(in_fmt, out_fmt, non_diegetic_pan=non_diegetic_pan) diff --git a/tests/renderer/test_renderer_be_comparison.py b/tests/renderer/test_renderer_be_comparison.py index 815d7fd640..460ded4250 100644 --- a/tests/renderer/test_renderer_be_comparison.py +++ b/tests/renderer/test_renderer_be_comparison.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ - (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange, Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved. @@ -203,3 +203,22 @@ def test_metadata(test_info, in_fmt, out_fmt): metadata_input=TEST_VECTOR_DIR.joinpath(f"{in_fmt}.txt"), is_comparetest=True, ) + + +""" non diegetic pan """ + + +# @pytest.mark.parametrize("out_fmt", ["STEREO"]) +# @pytest.mark.parametrize("in_fmt", ["MONO"]) +# @pytest.mark.parametrize("non_diegetic_pan", ["0", "-0.2", "0.5", "1", "-1"]) +# def test_non_diegetic_pan_static(test_info, in_fmt, out_fmt, non_diegetic_pan): +# compare_renderer_vs_mergetarget( +# test_info, in_fmt, out_fmt, non_diegetic_pan=non_diegetic_pan) + + +# @pytest.mark.parametrize("out_fmt", ["STEREO"]) +# @pytest.mark.parametrize("in_fmt", ["ISM1"]) +# @pytest.mark.parametrize("non_diegetic_pan", ["0", "-0.2", "0.5", "1", "-1"]) +# def test_non_diegetic_pan_ism_static(test_info, in_fmt, out_fmt, non_diegetic_pan): +# compare_renderer_vs_mergetarget( +# test_info, in_fmt, out_fmt, non_diegetic_pan=non_diegetic_pan) diff --git a/tests/renderer/utils.py b/tests/renderer/utils.py index d2af91f60c..356902ff47 100644 --- a/tests/renderer/utils.py +++ b/tests/renderer/utils.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ - (C) 2022 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2023 Baseline Development Group with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies OY, Orange, Panasonic Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation. All Rights Reserved. @@ -105,6 +105,7 @@ def run_renderer( metadata_input: Optional[str] = None, in_meta_files: Optional[list] = None, trj_file: Optional[str] = None, + non_diegetic_pan: Optional[str] = None, name_extension: Optional[str] = None, refrot_file: Optional[str] = None, refvec_file: Optional[str] = None, @@ -162,7 +163,11 @@ def run_renderer( in_file = FORMAT_TO_FILE[in_fmt] in_name = in_fmt - out_file = str(output_path_base.joinpath(f"{in_name}_to_{out_name}{trj_name}{refrot_name}{refvec_name}{refveclev_name}{config_name}{name_extension}.wav")) + out_file = str( + output_path_base.joinpath( + f"{in_name}_to_{out_name}{trj_name}{non_diegetic_pan}{refrot_name}{refvec_name}{refveclev_name}{config_name}{name_extension}.wav" + ) + ) cmd = RENDERER_CMD[:] cmd[2] = str(in_file) @@ -178,6 +183,8 @@ def run_renderer( if trj_file is not None: cmd.extend(["-tf", str(trj_file)]) + if non_diegetic_pan is not None: + cmd.extend(["-non_diegetic_pan", str(non_diegetic_pan)]) if refrot_file is not None: cmd.extend(["-rf", str(refrot_file)]) cmd.extend(["-otr", "ref"]) @@ -197,56 +204,6 @@ def run_renderer( return pyaudio3dtools.audiofile.readfile(out_file) - -def run_pyscripts( - in_fmt, - out_fmt, - metadata_input: Optional[str] = None, - in_meta_files: Optional[list] = None, - trj_file: Optional[str] = None, - is_comparetest: Optional[bool] = False, -) -> Tuple[np.ndarray, int]: - """Reference creation with pyaudio3dtools""" - if trj_file is not None: - trj_name = f"_{trj_file.stem}" - else: - trj_name = "" - - if not isinstance(out_fmt, str): - out_name = f"{out_fmt.stem}" - else: - out_name = out_fmt - - if is_comparetest: - FORMAT_TO_FILE = FORMAT_TO_FILE_COMPARETEST - else: - FORMAT_TO_FILE = FORMAT_TO_FILE_SMOKETEST - - if metadata_input is not None: - in_file = metadata_input - in_name = metadata_input.stem - elif isinstance(in_fmt, Path): - in_file = FORMAT_TO_FILE[in_fmt.stem] - in_name = in_fmt.stem - else: - in_file = FORMAT_TO_FILE[in_fmt] - in_name = in_fmt - - out_file = str(OUTPUT_PATH_REF.joinpath(f"{in_name}_to_{out_name}{trj_name}.wav")) - - pyaudio3dtools.spatialaudioconvert.spatial_audio_convert( - in_file, - out_file, - in_format=in_fmt, - out_format=out_fmt, - in_meta_files=in_meta_files, - trajectory=trj_file, - limit_output=True, - ) - - return pyaudio3dtools.audiofile.readfile(out_file) - - def compare_renderer_vs_mergetarget(test_info, in_fmt, out_fmt, **kwargs): ref, ref_fs = run_renderer( in_fmt, diff --git a/tests/test_sba_bs_dec_plc.py b/tests/test_sba_bs_dec_plc.py index 4920a9c59c..bead7cda93 100644 --- a/tests/test_sba_bs_dec_plc.py +++ b/tests/test_sba_bs_dec_plc.py @@ -45,9 +45,9 @@ from conftest import DecoderFrontend tag_list = ['stvFOA'] plc_patterns = ['PLperc12mblen5', 'PLperc40mblen50', 'PLperc42mblen2'] dtx_set = ['0', '1'] -ivas_br_list = ['32000', '64000', '96000', '256000'] +ivas_br_list = ['13200','16400','32000', '64000', '96000', '256000'] sampling_rate_list = ['48', '32', '16'] -agc_list = [-1, 0, 1] +gain_list = [0, 1] AbsTol = '0' @@ -73,7 +73,7 @@ def check_and_makedir(dir_path): @pytest.mark.parametrize("tag", tag_list) @pytest.mark.parametrize("plc_pattern", plc_patterns) @pytest.mark.parametrize("fs", sampling_rate_list) -@pytest.mark.parametrize("agc", agc_list) +@pytest.mark.parametrize("gain_flag", gain_list) def test_sba_plc_system( dut_decoder_frontend: DecoderFrontend, test_vector_path, @@ -87,12 +87,19 @@ def test_sba_plc_system( tag, plc_pattern, fs, - agc + gain_flag ): - if dtx == '1' and ivas_br not in ['32000', '64000']: + SID = 0 + if dtx == '1' and ivas_br not in ['13200','16400','24400','32000', '64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() - + if ivas_br == '13200' or ivas_br == '16400': + if dtx == '1' and gain_flag == 0 and fs != '16': + SID = 1 + else: + pytest.skip() + if gain_flag == 1 and ivas_br not in ['13200','16400','24400','32000']: + pytest.skip() tag = tag + fs + 'c' # dec @@ -106,9 +113,10 @@ def test_sba_plc_system( fs, ivas_br, dtx, + SID, plc_pattern, update_ref, - agc, + gain_flag, keep_files, ) @@ -125,17 +133,18 @@ def sba_dec_plc( sampling_rate, ivas_br, dtx, + SID, plc_pattern, update_ref, - agc, + gain_flag, keep_files, ): # ------------ run cmd ------------ tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}" - if agc != -1: - tag_out += f'_AGC{agc}' + if gain_flag == 1: + tag_out += f'_Gain{gain_flag}' plc_tag_out = f"{tag_out}_{plc_pattern}" dut_out_dir = f"{dut_base_path}/sba_bs/raw" @@ -147,6 +156,9 @@ def sba_dec_plc( plc_file = f"{test_vector_path}/{plc_pattern}.g192" ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}.pkt" ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_dutenc.pkt" + if SID == 1: + ref_in_pkt = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_cut.pkt" + ref_in_pkt_dutenc = f"{reference_path}/sba_bs/pkt/{tag_out}_SID_dutenc_cut.pkt" dut_out_raw = f"{dut_out_dir}/{plc_tag_out}.raw" ref_out_raw = f"{ref_out_dir}/{plc_tag_out}.raw" diff --git a/tests/test_sba_bs_enc.py b/tests/test_sba_bs_enc.py index 6825ee12ba..759e1cce4f 100644 --- a/tests/test_sba_bs_enc.py +++ b/tests/test_sba_bs_enc.py @@ -42,8 +42,9 @@ import pytest from cmp_pcm import cmp_pcm from cut_pcm import cut_samples from conftest import EncoderFrontend, DecoderFrontend - +from cut_bs import cut_from_start # params + tag_list = ['stvFOA'] tag_list_HOA2 = ['stv2OA'] tag_list_HOA3 = ['stv3OA'] @@ -53,13 +54,13 @@ dtx_set = ['0', '1'] dict_fsample_bw = {'48': '3', '32': '2', '16': '1'} dict_bw_idx = {'FB': '3', 'SWB': '2', 'WB': '1'} dict_bw_tag = {'SWB': '_ForceSWB', 'WB': '_ForceWB'} -ivas_br_FOA = ['32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin'] +ivas_br_FOA = ['13200','16400','32000','64000', '96000', '160000', '256000', '384000', '512000','sw_24k4_256k.bin'] ivas_br_HOA2 = ['256000', '384000', '512000'] ivas_br_HOA3 = ['256000', '384000', '512000'] sample_rate_list = ['48', '32', '16'] bypass_list = [1, 2] -agc_list = [-1, 0, 1] +gain_list = [0, 1] sample_rate_bw_idx_list = [('48', 'SWB'), ('48', 'WB'), ('32', 'WB')] @@ -100,7 +101,7 @@ def test_bypass_enc( ivas_br = '256000' dtx = '0' max_bw = "FB" - agc = -1 + gain_flag = -1 sba_order = "+1" output_config = "FOA" @@ -116,11 +117,12 @@ def test_bypass_enc( fs, ivas_br, dtx, + None, max_bw, bypass, - agc, sba_order, update_ref, + gain_flag, cut_testv=True ) @@ -134,11 +136,12 @@ def test_bypass_enc( fs, ivas_br, dtx, + None, max_bw, bypass, - agc, output_config, update_ref, + gain_flag, keep_files, ) @@ -148,7 +151,7 @@ def test_bypass_enc( @pytest.mark.parametrize("dtx", dtx_set) @pytest.mark.parametrize("tag", tag_list) @pytest.mark.parametrize("fs", sample_rate_list) -@pytest.mark.parametrize("agc", agc_list) +@pytest.mark.parametrize("gain_flag", gain_list) def test_sba_enc_system( dut_encoder_frontend: EncoderFrontend, dut_decoder_frontend: DecoderFrontend, @@ -164,20 +167,27 @@ def test_sba_enc_system( dtx, tag, fs, - agc, + gain_flag, ): - if dtx == '1' and ivas_br not in ['32000', '64000']: + SID = 0 + if dtx == '1' and ivas_br not in ['13200','16400','24400','32000','64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() - if ivas_br == 'sw_24k4_256k.bin' and agc != 1: - pytest.skip() - + if ivas_br == 'sw_24k4_256k.bin' and gain_flag != 1: + pytest.skip() + if ivas_br == '13200' or ivas_br == '16400': + if dtx == '1' and gain_flag == 0 and fs != '16': + SID = 1 + else: + pytest.skip() + if gain_flag == 1 and ivas_br not in ['13200','16400','24400','32000']: + pytest.skip() tag = tag + fs + 'c' max_bw = "FB" bypass = -1 sba_order = "+1" output_config = "FOA" - if agc == 1: + if gain_flag == 1: cut_gain = "16.0" elif dtx == '1': cut_gain = ".004" @@ -195,11 +205,12 @@ def test_sba_enc_system( fs, ivas_br, dtx, + SID, max_bw, bypass, - agc, sba_order, update_ref, + gain_flag, cut_gain=cut_gain, create_dutenc=True, cut_testv=True @@ -215,11 +226,12 @@ def test_sba_enc_system( fs, ivas_br, dtx, + SID, max_bw, bypass, - agc, output_config, update_ref, + gain_flag, keep_files, ) @@ -242,7 +254,7 @@ def test_spar_hoa2_enc_system( ): fs = '48' dtx = '0' - agc = -1 + gain_flag = -1 tag = tag + fs + 'c' max_bw = "FB" @@ -262,11 +274,12 @@ def test_spar_hoa2_enc_system( fs, ivas_br, dtx, + None, max_bw, bypass, - agc, sba_order, update_ref, + gain_flag, ) # dec @@ -279,11 +292,12 @@ def test_spar_hoa2_enc_system( fs, ivas_br, dtx, + None, max_bw, bypass, - agc, output_config, update_ref, + gain_flag, keep_files, ) @@ -306,7 +320,7 @@ def test_spar_hoa3_enc_system( ): fs = '48' dtx = '0' - agc = -1 + gain_flag = -1 tag = tag + fs + 'c' max_bw = "FB" @@ -326,11 +340,12 @@ def test_spar_hoa3_enc_system( fs, ivas_br, dtx, + None, max_bw, bypass, - agc, sba_order, update_ref, + gain_flag, ) # dec @@ -343,11 +358,12 @@ def test_spar_hoa3_enc_system( fs, ivas_br, dtx, + None, max_bw, bypass, - agc, output_config, update_ref, + gain_flag, keep_files, ) @@ -372,16 +388,18 @@ def test_sba_enc_BWforce_system( tag, sample_rate_bw_idx, ): - if dtx == '1' and ivas_br not in ['32000', '64000']: + if dtx == '1' and ivas_br not in ['32000','64000']: # skip high bitrates for DTX until DTX issue is resolved pytest.skip() + if ivas_br == '13200' or ivas_br == '16400': + pytest.skip() if ivas_br == 'sw_24k4_256k.bin': pytest.skip() fs = sample_rate_bw_idx[0] bw = sample_rate_bw_idx[1] tag = tag + fs + 'c' bypass = -1 - agc = -1 + gain_flag = -1 sba_order = "+1" output_config = "FOA" @@ -397,11 +415,12 @@ def test_sba_enc_BWforce_system( fs, ivas_br, dtx, + None, bw, bypass, - agc, sba_order, update_ref, + gain_flag, cut_testv=True ) @@ -415,11 +434,12 @@ def test_sba_enc_BWforce_system( fs, ivas_br, dtx, + None, bw, bypass, - agc, output_config, update_ref, + gain_flag, keep_files, ) @@ -437,11 +457,12 @@ def sba_enc( sampling_rate, ivas_br, dtx, + SID, ivas_max_bw, bypass, - agc, sba_order, update_ref, + gain_flag, cut_gain='1.0', create_dutenc=False, cut_testv=False @@ -466,20 +487,28 @@ def sba_enc( if ivas_br == 'sw_24k4_256k.bin': ivas_br = f"{br_switch_file_path}/sw_24k4_256k.bin" short_tag_ext = "" - if agc != -1: - short_tag_ext += f'_AGC{agc}' + if gain_flag == 1: + short_tag_ext += f'_Gain{gain_flag}' + if SID == 1: + short_tag_ext += f'_SID' # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" # to avoid conflicting names in case of parallel test execution, differentiate all cases - long_tag_ext = f"_AGC{agc}" if agc != -1 else "_AGC-unspecified" - long_tag_ext += f"_pca{bypass}" + if gain_flag == 1: + long_tag_ext = f"_Gain{gain_flag}" + else: + long_tag_ext = f"_pca{bypass}" + if SID == 1: + long_tag_ext += f"_SID" dut_pkt_file = f"{dut_out_dir}/{tag_out}{long_tag_ext}.pkt" ref_pkt_file = f"{ref_out_dir}/{tag_out}{short_tag_ext}.pkt" ref_pkt_file_dutenc = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc.pkt" - + if SID == 1: + dut_pkt_file_cut = f"{dut_out_dir}/{tag_out}{long_tag_ext}_cut.pkt" + ref_pkt_file_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_cut.pkt" + ref_pkt_file_dutenc_cut = f"{ref_out_dir}/{tag_out}{short_tag_ext}_dutenc_cut.pkt" input_path = f"{test_vector_path}/{tag_in}{in_extension}" - agc_op = agc if agc != -1 else None bypass_mode = bypass if bypass >= 0 else None dtx_mode = dtx == '1' @@ -507,7 +536,6 @@ def sba_enc( ref_pkt_file, sba_order=sba_order, max_band=ivas_max_bw, - agc_op=agc_op, bypass_mode=bypass_mode, dtx_mode=dtx_mode, ) @@ -520,7 +548,6 @@ def sba_enc( ref_pkt_file_dutenc, sba_order=sba_order, max_band=ivas_max_bw, - agc_op=agc_op, bypass_mode=bypass_mode, dtx_mode=dtx_mode, ) @@ -534,12 +561,25 @@ def sba_enc( dut_pkt_file, sba_order=sba_order, max_band=ivas_max_bw, - agc_op=agc_op, bypass_mode=bypass_mode, dtx_mode=dtx_mode, ) - + if SID == 1: + if ref_encoder_path: + with open(ref_pkt_file, "rb") as fp_in: + with open(ref_pkt_file_cut, "wb") as fp_out: + fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True) + with open(ref_pkt_file_dutenc, "rb") as fp_in: + with open(ref_pkt_file_dutenc_cut, "wb") as fp_out: + fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True) + os.remove(ref_pkt_file) + os.remove(ref_pkt_file_dutenc) + if update_ref == 0: + with open(dut_pkt_file, "rb") as fp_in: + with open(dut_pkt_file_cut, "wb") as fp_out: + fr_cnt, cut_cnt = cut_from_start(fp_in, fp_out, 0, True) + os.remove(dut_pkt_file) def sba_dec( decoder_frontend, ref_decoder_path, @@ -549,11 +589,12 @@ def sba_dec( sampling_rate, ivas_br, dtx, + SID, ivas_max_bw, bypass, - agc, output_config, update_ref, + gain_flag, keep_files, ): @@ -566,16 +607,20 @@ def sba_dec( tag_out = f"{tag}_ivasbr{ivas_br[:-3]}k_DTX{dtx}" short_tag_ext = "" - if agc != -1: - short_tag_ext += f'_AGC{agc}' + if gain_flag == 1: + short_tag_ext += f'_Gain{gain_flag}' # we update only bypass = 0/2 (bypass 1 is the same as the baseline) if bypass in [0, 2]: short_tag_ext += f"_pca{bypass}" - + if SID == 1: + short_tag_ext += f'_SID_cut' # to avoid conflicting names in case of parallel test execution, differentiate all cases - long_tag_ext = f"_AGC{agc}" if agc != -1 else "_AGC-unspecified" - long_tag_ext += f"_pca{bypass}" - + if gain_flag == 1: + long_tag_ext = f"_Gain{gain_flag}" + else: + long_tag_ext = f"_pca{bypass}" + if SID == 1: + long_tag_ext += f"_SID_cut" dut_out_dir = f"{dut_base_path}/sba_bs/raw" ref_out_dir = f"{reference_path}/sba_bs/raw" -- GitLab From 6bef49c8b0084f81edac1fe6a9bc601f9e744023 Mon Sep 17 00:00:00 2001 From: rtyag Date: Fri, 2 Jun 2023 11:02:11 +1000 Subject: [PATCH 155/381] initializing correct ducking flag when first frame is SID --- lib_dec/ivas_spar_decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 1df642906c..a897b6041c 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -124,7 +124,7 @@ ivas_error ivas_spar_dec_open( } hSpar->hMdDec->td_decorr_flag = 1; #ifdef FIX_501_TABLE_IDX_INIT - if ( hSpar->hTdDecorr && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) + if ( hSpar->hTdDecorr ) { hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; } -- GitLab From 3c7eb22bde1ed71c881361dd8781591e98ab54cb Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 2 Jun 2023 09:24:27 +0200 Subject: [PATCH 156/381] deactivate check-first-frame-is-sid for now --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5e6440a728..d4eea1ab7d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -660,7 +660,7 @@ clang-format-check: expose_as: 'formatting patch' # check for crashes if first received frame on decoder side is an SID -check-first-frame-is-sid: +.check-first-frame-is-sid: extends: - .test-job-linux-needs-testv-dir - .rules-merge-request -- GitLab From c0d2d3082a90a61b0d82559f7134b73f4e25ba23 Mon Sep 17 00:00:00 2001 From: Vladimir Malenovsky Date: Fri, 2 Jun 2023 09:25:28 +0200 Subject: [PATCH 157/381] clang format --- lib_com/bitstream.c | 8 ++++---- lib_enc/lib_enc.c | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index a7f6c896bb..2321d37334 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -1113,7 +1113,7 @@ ivas_error push_indice( #ifdef IND_LIST_DYN /* check the limits of the list of indices */ #ifdef FIX_545_ASSERT - if ( ( error = check_ind_list_limits( hBstr )) != IVAS_ERR_OK ) + if ( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) { return IVAS_ERROR( error, "Error occured in push_indice() while re-allocating the list of indices (frame %d) !\n", frame ); } @@ -1243,7 +1243,7 @@ ivas_error push_next_indice( #ifdef IND_LIST_DYN /* check the limits of the list of indices */ #ifdef FIX_545_ASSERT - if ( ( error = check_ind_list_limits( hBstr )) != IVAS_ERR_OK ) + if ( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) { return error; } @@ -1353,7 +1353,7 @@ void push_next_bits( #ifdef IND_LIST_DYN /* check the limits of the list of indices */ #ifdef FIX_545_ASSERT - if ( ( error = check_ind_list_limits( hBstr )) != IVAS_ERR_OK ) + if ( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) { return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); } @@ -1380,7 +1380,7 @@ void push_next_bits( #ifdef IND_LIST_DYN /* check the limits of the list of indices */ #ifdef FIX_545_ASSERT - if ( ( error = check_ind_list_limits( hBstr )) != IVAS_ERR_OK ) + if ( ( error = check_ind_list_limits( hBstr ) ) != IVAS_ERR_OK ) { return IVAS_ERROR( error, "Error occured in push_next_bits() while re-allocating the list of indices (frame %d) !\n", frame ); } diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 453d74ea03..bc71f62ece 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -51,7 +51,7 @@ struct IVAS_ENC { Encoder_Struct *st_ivas; #ifndef IND_LIST_DYN - Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ + Indice ind_list[MAX_NUM_DATA][MAX_NUM_INDICES]; /* list of indices */ Indice ind_list_metadata[MAX_NUM_METADATA][MAX_BITS_METADATA]; /* list of indices for metadata */ #endif ENC_CORE_HANDLE hCoreCoder; @@ -938,8 +938,7 @@ static ivas_error configureEncoder( if ( ( error = ivas_init_encoder( st_ivas #ifndef IND_LIST_DYN , - hIvasEnc->ind_list - , + hIvasEnc->ind_list, hIvasEnc->ind_list_metadata #endif ) ) != IVAS_ERR_OK ) -- GitLab From 4156a098fff3f526e6be4c3f11fb92a58e672836 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Fri, 2 Jun 2023 10:25:52 +0200 Subject: [PATCH 158/381] Removal of use_brir and late_reverb_on flags from renderer configuration --- apps/renderer.c | 2 - lib_com/common_api_types.h | 2 + lib_dec/ivas_binRenderer_internal.c | 18 +++++ lib_dec/ivas_init_dec.c | 8 +- lib_dec/ivas_mct_dec.c | 9 ++- lib_dec/ivas_objectRenderer_internal.c | 14 ++++ lib_dec/ivas_output_config.c | 4 + lib_dec/lib_dec.c | 4 + lib_rend/ivas_crend.c | 83 ++++++++++++++++++-- lib_rend/ivas_objectRenderer.c | 8 ++ lib_rend/ivas_prot_rend.h | 8 +- lib_rend/ivas_render_config.c | 14 +--- lib_rend/ivas_reverb.c | 6 ++ lib_rend/ivas_stat_rend.h | 2 + lib_rend/lib_rend.c | 101 +++++++++++++++++++++++-- lib_util/render_config_reader.c | 4 + 16 files changed, 254 insertions(+), 33 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index e431803950..bbcdd93253 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -758,9 +758,7 @@ int main( #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { - renderConfig.room_acoustics.late_reverb_on = TRUE; renderConfig.room_acoustics.override = TRUE; - renderConfig.room_acoustics.use_brir = FALSE; } #endif diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 33ddc9e881..a2126c8490 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -135,8 +135,10 @@ typedef struct typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG { int16_t override; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG int16_t use_brir; int16_t late_reverb_on; +#endif int16_t nBands; /* Number of frequency bands for which reverb properties are provided, integer, range [2..256] */ float pFc_input[IVAS_CLDFB_NO_CHANNELS_MAX]; /* Center frequencies for which following values are provided: */ float pAcoustic_rt60[IVAS_CLDFB_NO_CHANNELS_MAX]; /* - The room's T60 per center frequency */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index d4bd43f544..7d6aa3fdb8 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -133,7 +133,9 @@ static ivas_error ivas_binRenderer_convModuleOpen( const int16_t renderer_type, const int16_t isLoudspeaker, const AUDIO_CONFIG input_config, +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG const RENDER_CONFIG_DATA *hRenderConfig, +#endif const HRTFS_FASTCONV_HANDLE hHrtf ) { int16_t bandIdx, chIdx; @@ -162,7 +164,11 @@ static ivas_error ivas_binRenderer_convModuleOpen( hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker ); } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) +#else if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && hRenderConfig->roomAcoustics.use_brir ) +#endif { hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; @@ -322,7 +328,11 @@ static ivas_error ivas_binRenderer_convModuleOpen( #endif } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) +#else if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && hRenderConfig->roomAcoustics.use_brir ) +#endif { /* set the memories to zero */ set_zero( hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx], hBinRenConvModule->numTapsArray[bandIdx] ); @@ -701,7 +711,9 @@ ivas_error ivas_binRenderer_open( st_ivas->renderer_type, 1, AUDIO_CONFIG_7_1_4, +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG st_ivas->hRenderConfig, +#endif st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) { return error; @@ -727,7 +739,9 @@ ivas_error ivas_binRenderer_open( st_ivas->renderer_type, st_ivas->hIntSetup.is_loudspeaker_setup, st_ivas->hIntSetup.output_config, +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG st_ivas->hRenderConfig, +#endif st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) { return error; @@ -771,7 +785,11 @@ ivas_error ivas_binRenderer_open( } /* Allocate memories needed for reverb module */ +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) +#else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) +#endif { if ( ( error = ivas_binaural_reverb_open( &( hBinRenderer->hReverb ), hBinRenderer->conv_band, diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 6ed2ea2261..b6475610bd 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -674,9 +674,7 @@ ivas_error ivas_init_decoder_front( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, - st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR, - st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) #endif @@ -1367,7 +1365,11 @@ ivas_error ivas_init_decoder( return error; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) +#else if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) +#endif { if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index efbd4c335a..53d7c2d7ec 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1164,8 +1164,11 @@ static ivas_error ivas_mc_dec_reconfig( { ivas_binRenderer_close( &st_ivas->hBinRenderer ); } - +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) +#else if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hRenderConfig->roomAcoustics.late_reverb_on == 0 ) ) ) +#endif { ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); } @@ -1223,7 +1226,11 @@ static ivas_error ivas_mc_dec_reconfig( return error; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) +#else if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) +#endif { if ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index ba14104ed9..9b71a5874c 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -199,7 +199,11 @@ ivas_error ivas_td_binaural_renderer_sf( ( st_ivas->hHeadTrackData != NULL ) ? &st_ivas->hHeadTrackData->Quaternions[0] : NULL, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL ); +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) +#else if ( ( st_ivas->hRenderConfig != NULL ) && ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) +#endif { if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) { @@ -217,6 +221,15 @@ ivas_error ivas_td_binaural_renderer_sf( return error; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + /* add reverb to rendered signals */ + v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame ); + v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); + } + +#else if ( st_ivas->hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */ { if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) @@ -226,6 +239,7 @@ ivas_error ivas_td_binaural_renderer_sf( v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); } } +#endif for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) { diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index a904145688..0bc2227468 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -101,7 +101,11 @@ void ivas_renderer_select( } else /* ISM_MODE_DISC */ { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( output_config == AUDIO_CONFIG_BINAURAL ) +#else if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) +#endif { #ifdef DEBUGGING if ( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 212bdbfdfb..58faac8229 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1553,8 +1553,10 @@ ivas_error IVAS_DEC_GetRenderConfig( } #endif hRCout->room_acoustics.override = hRCin->roomAcoustics.override; +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG hRCout->room_acoustics.use_brir = hRCin->roomAcoustics.use_brir; hRCout->room_acoustics.late_reverb_on = hRCin->roomAcoustics.late_reverb_on; +#endif hRCout->room_acoustics.nBands = hRCin->roomAcoustics.nBands; hRCout->room_acoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; hRCout->room_acoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; @@ -1599,8 +1601,10 @@ ivas_error IVAS_DEC_FeedRenderConfig( } #endif hRenderConfig->roomAcoustics.override = renderConfig.room_acoustics.override; +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG hRenderConfig->roomAcoustics.use_brir = renderConfig.room_acoustics.use_brir; hRenderConfig->roomAcoustics.late_reverb_on = renderConfig.room_acoustics.late_reverb_on; +#endif hRenderConfig->roomAcoustics.nBands = renderConfig.room_acoustics.nBands; hRenderConfig->roomAcoustics.acousticPreDelay = renderConfig.room_acoustics.acousticPreDelay; hRenderConfig->roomAcoustics.inputPreDelay = renderConfig.room_acoustics.inputPreDelay; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 22b2dbfb92..24485c6dbd 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -157,13 +157,17 @@ static ivas_error ivas_rend_initCrend( CREND_WRAPPER *pCrend, const AUDIO_CONFIG inIvasConfig, const AUDIO_CONFIG outIvasConfig, +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG RENDER_CONFIG_DATA *hRendCfg, +#endif HRTFS_CREND_HANDLE hSetOfHRTF, const int32_t output_Fs ) { int16_t i, j, tmp; int16_t nchan_in; +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG bool use_brir; +#endif IVAS_REND_AudioConfigType inConfigType; HRTFS_HANDLE hHrtf; ivas_error error; @@ -199,17 +203,14 @@ static ivas_error ivas_rend_initCrend( } } +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* set BRIR flag */ use_brir = false; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) ) -#else if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) ) -#endif { use_brir = true; } - +#endif if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) { @@ -231,7 +232,11 @@ static ivas_error ivas_rend_initCrend( if ( output_Fs == 48000 ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz; @@ -246,7 +251,11 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; @@ -264,7 +273,11 @@ static ivas_error ivas_rend_initCrend( } else if ( output_Fs == 32000 ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz; @@ -279,7 +292,11 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; @@ -297,7 +314,11 @@ static ivas_error ivas_rend_initCrend( } else if ( output_Fs == 16000 ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_16kHz; @@ -312,7 +333,11 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; @@ -362,7 +387,11 @@ static ivas_error ivas_rend_initCrend( if ( output_Fs == 48000 ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[tmp]; } @@ -373,7 +402,11 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; @@ -391,7 +424,11 @@ static ivas_error ivas_rend_initCrend( } else if ( output_Fs == 32000 ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[tmp]; } @@ -402,7 +439,11 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; @@ -420,7 +461,11 @@ static ivas_error ivas_rend_initCrend( } else if ( output_Fs == 16000 ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[tmp]; } @@ -431,7 +476,11 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; @@ -820,7 +869,11 @@ static ivas_error ivas_rend_initCrend( hHrtf->max_num_ir -= 1; /* subtract LFE */ hHrtf->gain_lfe = GAIN_LFE; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->latency_s = hSetOfHRTF->hHRTF_brir_combined->latency_s; hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_brir_combined->max_num_iterations; @@ -835,7 +888,11 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations_diffuse[j]; hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max_diffuse[j]; @@ -878,7 +935,11 @@ static ivas_error ivas_rend_initCrend( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight[tmp]; } @@ -889,7 +950,11 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) +#else if ( use_brir ) +#endif { hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max[tmp][j]; @@ -1115,7 +1180,11 @@ ivas_error ivas_rend_openCrend( if ( ( *pCrend )->hHrtfCrend == NULL ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hRendCfg, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1187,7 +1256,11 @@ ivas_error ivas_rend_openCrend( hCrend->lfe_delay_line = NULL; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) +#else if ( ( hRendCfg != NULL ) && ( hRendCfg->roomAcoustics.late_reverb_on ) ) +#endif { if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, hRendCfg, output_Fs ) ) != IVAS_ERR_OK ) { diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 2f5b406c66..b9589f0182 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -321,7 +321,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( /* Update the listener's location/orientation */ TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( hReverb != NULL ) +#else if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) +#endif { #ifdef JBM_TSM_ON_TCS if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) @@ -344,7 +348,11 @@ ivas_error ivas_td_binaural_renderer_unwrap( } } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( hReverb != NULL ) +#else if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) +#endif { /* add reverb to rendered signals */ v_add( reverb_signal[0], output[0], output[0], output_frame ); diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index e549c3dd23..135330c1ef 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -921,11 +921,9 @@ void ivas_render_config_close( ); ivas_error ivas_render_config_init_from_rom( - RENDER_CONFIG_HANDLE *hRenderConfig, /* i/o: Renderer config handle */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - const int16_t use_brir, /* i : use brir on/off flag */ - const int16_t late_reverb_on /* i : late reverb on/off flag */ -#else + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + , const int16_t room_flag_on /* i : room effect on/off flag */ #endif ); diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index c52d870f14..e9aead5f5b 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -99,16 +99,13 @@ void ivas_render_config_close( *-------------------------------------------------------------------*/ ivas_error ivas_render_config_init_from_rom( - RENDER_CONFIG_HANDLE *hRenderConfig, /* i/o: Renderer config handle */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - const int16_t use_brir, /* i : use brir on/off flag */ - const int16_t late_reverb_on /* i : late reverb on/off flag */ -#else + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + , const int16_t room_flag_on /* i : room effect on/off flag */ #endif ) { - if ( hRenderConfig == NULL || *hRenderConfig == NULL ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Unexpected null pointer while attempting to fill renderer configuration from ROM" ); @@ -118,10 +115,7 @@ ivas_error ivas_render_config_init_from_rom( ( *hRenderConfig )->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE; #endif ( *hRenderConfig )->roomAcoustics.override = FALSE; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - ( *hRenderConfig )->roomAcoustics.use_brir = use_brir; - ( *hRenderConfig )->roomAcoustics.late_reverb_on = late_reverb_on; -#else +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG ( *hRenderConfig )->roomAcoustics.use_brir = room_flag_on; ( *hRenderConfig )->roomAcoustics.late_reverb_on = room_flag_on; #endif diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index baa83fad0e..7525ec102d 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1180,8 +1180,10 @@ ivas_error ivas_reverb_open( pState->pConfig.renderer_type_override = hRenderConfig->renderer_type_override; #endif pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG pState->pConfig.roomAcoustics.use_brir = hRenderConfig->roomAcoustics.use_brir; pState->pConfig.roomAcoustics.late_reverb_on = hRenderConfig->roomAcoustics.late_reverb_on; +#endif pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; /* set up input downmix */ @@ -1965,7 +1967,11 @@ ivas_error ivas_binaural_reverb_open( if ( ( roomAcoustics ) && ( roomAcoustics->override ) ) { +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, output_config, false, sampling_rate, t60, ene ); +#else ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, output_config, roomAcoustics->use_brir, sampling_rate, t60, ene ); +#endif ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, t60, ene ); ivas_binaural_reverb_setPreDelay( hReverb, (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ) ); } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 877076db9a..17a6c05ffb 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -287,8 +287,10 @@ typedef struct ivas_binaural_head_track_struct typedef struct ivas_roomAcoustics_t { int16_t override; +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG int16_t use_brir; int16_t late_reverb_on; +#endif int16_t nBands; /* Number of frequency bands for which reverb properties are provided, integer, range [2..256] */ float pFc_input[CLDFB_NO_CHANNELS_MAX]; /* Center frequencies for which following values are provided: */ float pAcoustic_rt60[CLDFB_NO_CHANNELS_MAX]; /* - The room's T60 per center frequency */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index c8505d4561..5ae274f84d 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1139,18 +1139,38 @@ static ivas_error setRendInputActiveIsm( initRotMatrix( inputIsm->rot_mat_prev ); error = IVAS_ERR_OK; - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) + { + if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg, + NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } + else { if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) + { + if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) + { + if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } + } else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) { @@ -1173,6 +1193,7 @@ static ivas_error setRendInputActiveIsm( } } } +#endif return IVAS_ERR_OK; } @@ -1883,7 +1904,11 @@ static ivas_error initMcBinauralRendering( return error; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) +#else if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) +#endif { if ( ( error = ivas_reverb_open( &( inputMc->hReverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) { @@ -2593,8 +2618,10 @@ static DecoderDummy *initDecoderDummy( if ( enableRenderConfig ) { ivas_render_config_open( &decDummy->hRenderConfig ); +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG decDummy->hRenderConfig->roomAcoustics.late_reverb_on = 0; decDummy->hRenderConfig->roomAcoustics.use_brir = 0; +#endif } else { @@ -3803,7 +3830,7 @@ ivas_error IVAS_REND_InitConfig( return error; } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) #endif @@ -3854,8 +3881,10 @@ int16_t IVAS_REND_GetRenderConfig( } #endif hRCout->room_acoustics.override = hRCin->roomAcoustics.override; +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG hRCout->room_acoustics.use_brir = hRCin->roomAcoustics.use_brir; hRCout->room_acoustics.late_reverb_on = hRCin->roomAcoustics.late_reverb_on; +#endif hRCout->room_acoustics.nBands = hRCin->roomAcoustics.nBands; hRCout->room_acoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; hRCout->room_acoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; @@ -3902,8 +3931,10 @@ int16_t IVAS_REND_FeedRenderConfig( } #endif hRenderConfig->roomAcoustics.override = renderConfig.room_acoustics.override; +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG hRenderConfig->roomAcoustics.use_brir = renderConfig.room_acoustics.use_brir; hRenderConfig->roomAcoustics.late_reverb_on = renderConfig.room_acoustics.late_reverb_on; +#endif hRenderConfig->roomAcoustics.nBands = renderConfig.room_acoustics.nBands; hRenderConfig->roomAcoustics.acousticPreDelay = renderConfig.room_acoustics.acousticPreDelay; hRenderConfig->roomAcoustics.inputPreDelay = renderConfig.room_acoustics.inputPreDelay; @@ -4505,6 +4536,7 @@ static ivas_error renderIsmToBinauralRoom( headRotData = ismInput->base.ctx.pHeadRotData; rotatedPos = defaultObjectPosition(); +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && headRotData->headRotEnabled ) { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); @@ -4524,7 +4556,7 @@ static ivas_error renderIsmToBinauralRoom( } else { - +#endif if ( headRotData->headRotEnabled ) { subframe_len = ismInput->base.inputBuffer.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; @@ -4621,12 +4653,59 @@ static ivas_error renderIsmToBinauralRoom( accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); free( tmpMcBuffer.data ); +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG } +#endif pop_wmops(); return IVAS_ERR_OK; } +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + +static ivas_error renderIsmToBinauralReverb( + input_ism *ismInput, + IVAS_REND_AudioBuffer outAudio ) +{ + int16_t i; + float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; + ivas_error error; + IVAS_REND_AudioObjectPosition rotatedPos; + const IVAS_REND_HeadRotData *headRotData; +#ifdef JBM_TSM_ON_TCS + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } +#endif + + push_wmops( "renderIsmToBinauralRoom" ); + + headRotData = ismInput->base.ctx.pHeadRotData; + rotatedPos = defaultObjectPosition(); + + copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); + + if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, + ismInput->base.inConfig, + NULL, + ismInput->base.ctx.pHeadRotData, + &ismInput->currentPos, + ismInput->hReverb, + outAudio.config.numSamplesPerChannel, + tmpRendBuffer ) ) != IVAS_ERR_OK ) + { + return error; + } + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + pop_wmops(); + + return IVAS_ERR_OK; +} +#endif + static ivas_error renderIsmToMc( const input_ism *ismInput, const IVAS_REND_AudioBuffer outAudio ) @@ -4780,12 +4859,16 @@ static ivas_error renderInputIsm( break; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: + error = renderIsmToBinauralRoom( ismInput, outAudio ); + break; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: + error = renderIsmToBinauralReverb( ismInput, outAudio ); + break; #else case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#endif error = renderIsmToBinauralRoom( ismInput, outAudio ); break; +#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -4984,7 +5067,11 @@ static ivas_error renderMcToBinauralRoom( headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; +#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG + if ( ( mcInput->hReverb != NULL && outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) +#else if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) +#endif { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 54f2d012ce..95ca42779f 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -422,6 +422,7 @@ ivas_error RenderConfigReader_read( #ifdef DEBUGGING fprintf( stderr, " PARAM: %s -> %s\n", item, pValue ); #endif +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( strcmp( item, "REVERB" ) == 0 ) { if ( read_bool( pValue, &hRenderConfig->room_acoustics.late_reverb_on ) ) @@ -437,6 +438,9 @@ ivas_error RenderConfigReader_read( } } else if ( strcmp( item, "NBANDS" ) == 0 ) +#else + if ( strcmp( item, "NBANDS" ) == 0 ) +#endif { if ( !sscanf( pValue, "%hd", &hRenderConfig->room_acoustics.nBands ) || hRenderConfig->room_acoustics.nBands > CLDFB_NO_CHANNELS_MAX ) -- GitLab From 254cb8c4201ec0c370b98778ab77887ab552de9a Mon Sep 17 00:00:00 2001 From: Arnaud LEFORT Date: Fri, 2 Jun 2023 11:04:59 +0200 Subject: [PATCH 159/381] Warnings removed. --- lib_enc/ivas_stereo_dmx_evs.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 90af69e871..ddb94525b3 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -402,7 +402,7 @@ static void calc_poc( hPHA->init_frmCntr = 0; } freq_8k = L_FRAME16k / 2; - freq_ipd_max = (int16_t) ( freq_8k * 5000. / ( 8000 * STEREO_DMX_EVS_SUBBAND_SIZE ) ); + freq_ipd_max = (int16_t) ( freq_8k * 5000.0f / ( 8000.0f * STEREO_DMX_EVS_SUBBAND_SIZE ) ); // Memorize the filters N-1 for ( n = 0; n < CPE_CHANNELS; n++ ) @@ -544,7 +544,7 @@ static void calc_poc( Pr[n] = ( Pr[n] > 1.0f ) ? 1.0f : Pr[n]; Pr[n] = ( Pr[n] < -1.0f ) ? -1.0f : Pr[n]; } - ICCr = sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); + ICCr = (float) sqrt( ( Nr * Nr + Ni * Ni ) / ( eneL * eneR + EPSILON ) ); hPHA->iccr_s = STEREO_DMX_EVS_ICCR_FORGETTING * hPHA->iccr_s + ( 1.0f - STEREO_DMX_EVS_ICCR_FORGETTING ) * ICCr; if ( hPHA->curr_pha == STEREO_DMX_EVS_PHA_IPD ) @@ -1555,7 +1555,7 @@ ivas_error stereo_dmx_evs_init_encoder( } hStereoDmxEVS->hPHA->pha_len = len / 2; - hStereoDmxEVS->hPHA->init_frmCntr = (int16_t) FRAMES_PER_SEC * 0.2f; + hStereoDmxEVS->hPHA->init_frmCntr = (int16_t) ( FRAMES_PER_SEC * 0.2f ); hStereoDmxEVS->hPHA->isd_rate_s = 0.0f; hStereoDmxEVS->hPHA->iccr_s = 0.0f; @@ -1643,7 +1643,7 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->prev_prc = STEREO_DMX_EVS_PRC_POC; hStereoDmxEVS->hPHA->prc_hys_cnt = 0; - hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0 ); + hStereoDmxEVS->hPHA->fad_len_prc = (int16_t) ( STEREO_DMX_EVS_FADE_LEN_PRC * (float) input_Fs / 1000.0f ); fad_len = hStereoDmxEVS->hPHA->fad_len_prc; fad_g = hStereoDmxEVS->hPHA->fad_g_prc; fad_r = 1.0f / (float) ( fad_len + 1 ); -- GitLab From c508d9a83dfbf21ccd6350ad9e82404ced03a093 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 2 Jun 2023 17:41:39 +0200 Subject: [PATCH 160/381] Revert "use correct files in config for sidstart test" should come in with respective branch This reverts commit 2f37c2290f697c0aaebd26d87198302c190f5a80. --- scripts/config/ci_linux_sidstart_test.json | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/scripts/config/ci_linux_sidstart_test.json b/scripts/config/ci_linux_sidstart_test.json index be3915efd8..3436d9eaea 100644 --- a/scripts/config/ci_linux_sidstart_test.json +++ b/scripts/config/ci_linux_sidstart_test.json @@ -2,24 +2,24 @@ "afspPath": "not_needed", "utilPath": "/tools", "inpaths": { - "MONO": "/usr/local/testv/stv48n.wav", - "STEREO": "/usr/local/testv/stvST48n.wav", + "MONO": "/usr/local/testv/test_mono.wav", + "STEREO": "/usr/local/testv/test_stereo.wav", "FOA": "/usr/local/ltv/ltv48_FOA.wav", "HOA2": "/usr/local/ltv/ltv48_HOA2.wav", "HOA3": "/usr/local/ltv/ltv48_HOA3.wav", "SBA": "/usr/local/ltv/ltv48_HOA3.wav", - "MASA1TC1DIR": "/usr/local/testv/stv1MASA1TC48n.wav", - "MASA1TC2DIR": "/usr/local/testv/stv2MASA1TC48c.wav", - "MASA2TC1DIR": "/usr/local/testv/stv1MASA2TC48n.wav", - "MASA2TC2DIR": "/usr/local/testv/stv2MASA2TC48c.wav", - "5_1": "/usr/local/testv/stv51MC48c.wav", - "5_1_2": "/usr/local/testv/stv512MC48c.wav", - "5_1_4": "/usr/local/testv/stv514MC48c.wav", - "7_1": "/usr/local/testv/stv71MC48c.wav", - "7_1_4": "/usr/local/testv/stv714MC48c.wav", - "ISM1": "/usr/local/testv/stv1ISM48s.wav", - "ISM2": "/usr/local/testv/stv2ISM48s.wav", - "ISM3": "/usr/local/testv/stv3ISM48s.wav", - "ISM4": "/usr/local/testv/stv4ISM48s.wav" + "MASA1TC1DIR": "/usr/local/testv/test_MASA_1dir1TC.wav", + "MASA1TC2DIR": "/usr/local/testv/test_MASA_2dir1TC.wav", + "MASA2TC1DIR": "/usr/local/testv/test_MASA_1dir2TC.wav", + "MASA2TC2DIR": "/usr/local/testv/test_MASA_2dir2TC.wav", + "5_1": "/usr/local/testv/test_MC51.wav", + "5_1_2": "/usr/local/testv/test_MC51p2.wav", + "5_1_4": "/usr/local/testv/test_MC51p4.wav", + "7_1": "/usr/local/testv/test_MC71.wav", + "7_1_4": "/usr/local/testv/test_MC71p4.wav", + "ISM1": "/usr/local/testv/test_mono.wav", + "ISM2": "/usr/local/testv/test_ISM_2obj.wav", + "ISM3": "/usr/local/testv/test_ISM_3obj.wav", + "ISM4": "/usr/local/testv/test_ISM_4obj.wav" } } -- GitLab From 3d2fdefe3076a867194a8de5b1bc35fdd884fb21 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 2 Jun 2023 17:54:18 +0200 Subject: [PATCH 161/381] run clang-format --- lib_enc/fd_cng_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 5adab25943..647370ddfe 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -1279,7 +1279,7 @@ void FdCngEncodeDiracMDCTStereoSID( set_f( weights, 1.f, NPART ); #ifdef FIX_TODO_FD_CNG_SBA_CLEANUP #ifdef DEBUGGING - assert ( N[0] == N[1] ); + assert( N[0] == N[1] ); #endif #endif -- GitLab From 43f2982d939d83ea7f69639c063c2c5501f18c16 Mon Sep 17 00:00:00 2001 From: "@ragot" Date: Sat, 3 Jun 2023 01:00:27 +0200 Subject: [PATCH 162/381] fix clang issue --- lib_enc/lib_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 9d381913ad..dc142eb7a1 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1262,7 +1262,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( { inputBufferSize /= 2; #ifdef BINAURAL_AUDIO_CMDLINE - stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize, hEncoderConfig->is_binaural); + stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize, hEncoderConfig->is_binaural ); #else stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize ); #endif -- GitLab From 0b637afc7d1f7de0e5a1044dfb40f76644a825d4 Mon Sep 17 00:00:00 2001 From: ragot Date: Sat, 3 Jun 2023 01:33:55 +0200 Subject: [PATCH 163/381] fix declaration issue --- lib_enc/lib_enc.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index a4a3726b45..8d8ede4d77 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -161,8 +161,13 @@ ivas_error IVAS_ENC_ConfigureForMono( const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ - const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */ + const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */ +#ifdef BINAURAL_AUDIO_CMDLINE + const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ + const bool is_binaural /* i : if true, the input is binaural audio */ +#else const bool downmixFromStereo /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ +#endif ); /*! r: error code */ @@ -172,10 +177,15 @@ ivas_error IVAS_ENC_ConfigureForStereo( const int32_t bitrate, /* i : requested bitrate of the output bitstream */ const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ +#ifdef BINAURAL_AUDIO_CMDLINE + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const bool is_binaural /* i : flag indicating if input is binaural audio */ +#else const IVAS_ENC_DTX_CONFIG dtxConfig /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ +#endif #ifdef DEBUGGING , - const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */ + const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */ #endif ); -- GitLab From a107d305eab0df4dc1745bc9ef119ee8c348e76c Mon Sep 17 00:00:00 2001 From: ragot Date: Sat, 3 Jun 2023 01:46:09 +0200 Subject: [PATCH 164/381] fix warning --- lib_enc/ivas_stereo_dmx_evs.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 6ebf0ce8fc..8dd0db99e3 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -1163,6 +1163,13 @@ void stereo_dmx_evs_enc( int16_t input_frame; +#ifdef BINAURAL_AUDIO_CMDLINE + if (is_binaural) + { + /* use of is_binaural flag is to be considered */ + } +#endif + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); for ( n = 0; n < input_frame; n++ ) -- GitLab From 9b967796503c82bf7f128fff5e9802dec5d640ac Mon Sep 17 00:00:00 2001 From: ragot Date: Sat, 3 Jun 2023 01:57:45 +0200 Subject: [PATCH 165/381] fix clang --- lib_enc/ivas_stereo_dmx_evs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 8dd0db99e3..e479e28cdb 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -1164,7 +1164,7 @@ void stereo_dmx_evs_enc( int16_t input_frame; #ifdef BINAURAL_AUDIO_CMDLINE - if (is_binaural) + if ( is_binaural ) { /* use of is_binaural flag is to be considered */ } -- GitLab From 202543a399b5248d18ec5bb5f4c2b2a039d6db72 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Sat, 3 Jun 2023 22:49:48 +0200 Subject: [PATCH 166/381] fixes final non-zero program output during test --- scripts/config/self_test.prm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index b971bd06fc..8c1af7bee8 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -574,7 +574,7 @@ // SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst // SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -- GitLab From 194ce14c38b15ec3c63fa7e03d14fd8aac02e52b Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Mon, 5 Jun 2023 10:35:56 +0200 Subject: [PATCH 167/381] Removal of use_brir and late_reverb_on flags from renderer configuration --- lib_com/common_api_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index a2126c8490..0399bfeee5 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -135,7 +135,7 @@ typedef struct typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG { int16_t override; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG +#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG int16_t use_brir; int16_t late_reverb_on; #endif -- GitLab From c60d747cc447c60bc2351d643c75f96685d8699c Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 11:03:19 +0200 Subject: [PATCH 168/381] formal improvements within ARITH_HUFF_CODER_CHANGES: empty lines, 'const' function input arguments, comments --- lib_com/ivas_cnst.h | 4 +- lib_com/ivas_dirac_com.c | 18 +++-- lib_com/ivas_prot.h | 134 +++++++++++++++++++++++++++++------ lib_com/ivas_spar_com.c | 3 + lib_dec/ivas_spar_md_dec.c | 3 +- lib_enc/ivas_entropy_coder.c | 36 +++++----- lib_enc/ivas_sba_enc.c | 16 ++++- lib_enc/ivas_spar_encoder.c | 11 ++- lib_enc/ivas_spar_md_enc.c | 45 ++++++------ 9 files changed, 190 insertions(+), 80 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9557f7aef1..ccdad599dc 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1018,14 +1018,14 @@ typedef enum #define IVAS_SPAR_HOA3_NP_CHS 8 /* number of higher order non-planar channels */ -#define SPAR_NUM_CODING_STRAT_BITS ( 3 ) +#define SPAR_NUM_CODING_STRAT_BITS 3 /* AGC constants */ #define AGC_BITS_PER_CH 3 #define AGC_EMAX 0 #ifdef ARITH_HUFF_CODER_CHANGES #define AGC_SIGNALLING_BITS 1 -#define IVAS_SPAR_ARITH_OVERSHOOT_BITS (16) +#define IVAS_SPAR_ARITH_OVERSHOOT_BITS 16 #endif /* Common SPAR metadata constants */ diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 091215ac63..b8441871e0 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -377,13 +377,20 @@ void ivas_dirac_config_bands( return; } + #ifdef ARITH_HUFF_CODER_CHANGES +/*-------------------------------------------------------------------* + * ivas_sba_get_max_md_bits() + * + * Return maximum SBA DirAC metadata bit-budget and nominal bit-budget + *-------------------------------------------------------------------*/ + void ivas_get_dirac_sba_max_md_bits( const int32_t sba_total_brate, int16_t *bits_frame_nominal, int16_t *metadata_max_bits, int16_t *qmetadata_max_bit_req, - int16_t nbands ) + const int16_t nbands ) { if ( sba_total_brate <= IVAS_13k2 ) { @@ -442,6 +449,7 @@ void ivas_get_dirac_sba_max_md_bits( } #endif + /*------------------------------------------------------------------------- * ivas_dirac_sba_config() * @@ -547,13 +555,9 @@ ivas_error ivas_dirac_sba_config( } #endif } + #ifdef ARITH_HUFF_CODER_CHANGES - ivas_get_dirac_sba_max_md_bits( - sba_total_brate, - &hQMetaData->bits_frame_nominal, - &hQMetaData->metadata_max_bits, - &hQMetaData->qmetadata_max_bit_req, - hQMetaData->q_direction[0].cfg.nbands ); + ivas_get_dirac_sba_max_md_bits( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands ); #else if ( sba_total_brate <= IVAS_13k2 ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2804668e0f..4f2bbedf0c 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -110,18 +110,23 @@ ivas_error mct_enc_reconfigure( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ const uint16_t b_nchan_change /* i : flag indicating different channel count */ ); + ivas_error ivas_spar_md_enc_init ( - ivas_spar_md_enc_state_t *hMdEnc, /* o : MD encoder handle */ - const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ - const int16_t sba_order /* i : Ambisonic (SBA) order */ + ivas_spar_md_enc_state_t *hMdEnc, /* o : MD encoder handle */ + const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ + const int16_t sba_order /* i : Ambisonic (SBA) order */ ); + ivas_error ivas_sba_enc_reconfigure( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); + #ifdef ARITH_HUFF_CODER_CHANGES +/*! r: maximum SBA metadata bit-budget */ int16_t ivas_sba_get_max_md_bits( - Encoder_Struct *st_ivas ); + Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ +); #endif void destroy_sce_enc( @@ -3637,7 +3642,8 @@ void ivas_get_dirac_sba_max_md_bits( int16_t *bits_frame_nominal, int16_t *metadata_max_bits, int16_t *qmetadata_max_bit_req, - int16_t nbands ); + const int16_t nbands +); #endif ivas_error ivas_dirac_sba_config( @@ -5024,33 +5030,117 @@ int16_t ivas_get_bits_to_encode( int32_t val ); -void ivas_huffman_encode( ivas_huffman_cfg_t *huff_cfg, int16_t in, int16_t *hcode, int16_t *hlen ); -void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); -void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); +void ivas_huffman_encode( + ivas_huffman_cfg_t *huff_cfg, + int16_t in, + int16_t *hcode, + int16_t *hlen +); + +void ivas_spar_huff_coeffs_com_init( + ivas_huff_coeffs_t *pHuff_coeffs, + ivas_spar_md_com_cfg *pSpar_cfg, + const int16_t table_idx, + const int16_t enc_dec +); + +void ivas_spar_arith_coeffs_com_init( + ivas_arith_coeffs_t *pArith_coeffs, + ivas_spar_md_com_cfg *pSpar_cfg, + const int16_t table_idx, + const int16_t enc_dec +); + #ifdef ARITH_HUFF_CODER_CHANGES int16_t ivas_arith_encode_cmplx_cell_array( #else void ivas_arith_encode_cmplx_cell_array( #endif -ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff + + ivas_arith_t *pArith_re, + ivas_arith_t *pArith_re_diff, + const int16_t *pDo_diff, + const int16_t nB, + int16_t *pSymbol_re, + int16_t *pSymbol_old_re, + ivas_cell_dim_t *pCell_dims, + BSTR_ENC_HANDLE hMetaData, + const int16_t any_diff #ifdef ARITH_HUFF_CODER_CHANGES - , int32_t wc_strat_arith + , + const int16_t wc_strat_arith #endif ); -ivas_error ivas_huffman_decode( ivas_huffman_cfg_t *huff_cfg, Decoder_State *st0, int16_t *dec_out ); -void ivas_arith_decode_cmplx_cell_array( ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, Decoder_State *st0, ivas_cell_dim_t *pCell_dims, int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_re_old ); -void ivas_ari_start_decoding_14bits_ext_1_lfe( Decoder_State *st, Tastat *s, int16_t *extra_bits_read ); -uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe( Decoder_State *st, Tastat *s, const uint16_t *cum_freq, int16_t *extra_bits_read ); -void ivas_ari_done_decoding_14bits_ext_1_lfe( Decoder_State *st, const int16_t extra_bits_read ); -void ivas_ari_done_encoding_14bits( BSTR_ENC_HANDLE hBstr, Tastat *s ); -void ivas_ari_encode_14bits_ext( BSTR_ENC_HANDLE hBstr, Tastat *s, int32_t symbol, const uint16_t *cum_freq ); +ivas_error ivas_huffman_decode( + ivas_huffman_cfg_t *huff_cfg, + Decoder_State *st0, + int16_t *dec_out +); + +void ivas_arith_decode_cmplx_cell_array( + ivas_arith_t *pArith_re, + ivas_arith_t *pArith_re_diff, + Decoder_State *st0, + ivas_cell_dim_t *pCell_dims, + int16_t *pDo_diff, const int16_t nB, + int16_t *pSymbol_re, + int16_t *pSymbol_re_old +); + +void ivas_ari_start_decoding_14bits_ext_1_lfe( + Decoder_State *st, + Tastat *s, + int16_t *extra_bits_read +); + +uint16_t ivas_ari_decode_14bits_bit_ext_1_lfe( + Decoder_State *st, Tastat *s, + const uint16_t *cum_freq, + int16_t *extra_bits_read +); + +void ivas_ari_done_decoding_14bits_ext_1_lfe( + Decoder_State *st, + const int16_t extra_bits_read +); + +void ivas_ari_done_encoding_14bits( + BSTR_ENC_HANDLE hBstr, Tastat *s +); + +void ivas_ari_encode_14bits_ext( + BSTR_ENC_HANDLE hBstr, + Tastat *s, + int32_t symbol, + const uint16_t *cum_freq +); + +void ivas_wrap_arround( + int16_t *pArr, + const int16_t min_val, + const int16_t max_val, + const int16_t length +); + +void ivas_get_cum_freq_model( + const int16_t *pFreq_model, + const int16_t length, + int16_t *pCum_freq_model +); -void ivas_wrap_arround( int16_t *pArr, const int16_t min_val, const int16_t max_val, const int16_t length ); -void ivas_get_cum_freq_model( const int16_t *pFreq_model, const int16_t length, int16_t *pCum_freq_model ); -int16_t ivas_map_num_pred_r_to_idx( const int16_t num_quant_points_pred_r, const int16_t active_w_flag ); -int16_t ivas_map_num_drct_r_to_idx( const int16_t num_quant_points_drct_r ); -int16_t ivas_map_num_decd_r_to_idx( const int16_t num_quant_points_decd_r ); +int16_t ivas_map_num_pred_r_to_idx( + const int16_t num_quant_points_pred_r, + const int16_t active_w_flag +); + +int16_t ivas_map_num_drct_r_to_idx( + const int16_t num_quant_points_drct_r +); + +int16_t ivas_map_num_decd_r_to_idx( + const int16_t num_quant_points_decd_r +); /* Quantization utilities */ void ivas_quantise_real_values( diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 8e7da38580..e91947fa49 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2153,6 +2153,7 @@ void ivas_spar_set_bitrate_config( int16_t quant_strat; int16_t bands_bw; #endif + pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) @@ -2191,6 +2192,7 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->tgt_bits_per_blk -= md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk -= md_coding_bits_header; + #ifdef ARITH_HUFF_CODER_CHANGES if ( ivas_total_brate < IVAS_24k4 ) { @@ -2276,6 +2278,7 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->max_md_bits_spar = pSpar_md_cfg->max_bits_per_blk + agc_bits + pca_bits; } #endif + return; } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 03f014ecfd..c850f5cc5c 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -489,8 +489,7 @@ ivas_error ivas_spar_md_dec_init( ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands #ifdef ARITH_HUFF_CODER_CHANGES , - hMdDec->spar_hoa_dirac2spar_md_flag, - 0, 0, 0 + hMdDec->spar_hoa_dirac2spar_md_flag, 0, 0, 0 #endif ); diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index 830a05e41a..98d9b3f305 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -128,6 +128,7 @@ static ivas_error ivas_get_dyn_freq_model( * * Arith encoding of an array of symbols *-----------------------------------------------------------------------------------------*/ + #ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_arith_encode_array( #else @@ -139,7 +140,7 @@ static void ivas_arith_encode_array( const int16_t in_len #ifdef ARITH_HUFF_CODER_CHANGES , - int32_t wc_strat_arith + const int16_t wc_strat_arith #endif ) { @@ -158,6 +159,7 @@ static void ivas_arith_encode_array( return -1; } #endif + push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); } else @@ -188,6 +190,7 @@ static void ivas_arith_encode_array( } #endif } + #ifdef ARITH_HUFF_CODER_CHANGES return 0; #else @@ -201,6 +204,7 @@ static void ivas_arith_encode_array( * * Differential arith encoding *-----------------------------------------------------------------------------------------*/ + #ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_arithCoder_encode_array_diff( #else @@ -213,7 +217,7 @@ static void ivas_arithCoder_encode_array_diff( BSTR_ENC_HANDLE hMetaData #ifdef ARITH_HUFF_CODER_CHANGES , - int32_t wc_strat_arith + const int16_t wc_strat_arith #endif ) { @@ -232,8 +236,7 @@ static void ivas_arithCoder_encode_array_diff( ivas_wrap_arround( pIn_old_scratch, pArith_diff->vals[0], pArith_diff->vals[pArith_diff->range - 1], length ); #ifdef ARITH_HUFF_CODER_CHANGES - arith_result = ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length, - wc_strat_arith ); + arith_result = ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length, wc_strat_arith ); if ( arith_result < 0 ) { return -1; @@ -242,6 +245,7 @@ static void ivas_arithCoder_encode_array_diff( ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length ); #endif } + #ifdef ARITH_HUFF_CODER_CHANGES return 0; #else @@ -280,6 +284,7 @@ void ivas_huffman_encode( * * Arithmetic encode a cell array *-----------------------------------------------------------------------------------------*/ + #ifdef ARITH_HUFF_CODER_CHANGES static int16_t arith_encode_cell_array( #else @@ -292,7 +297,7 @@ static void arith_encode_cell_array( int16_t *pSymbol #ifdef ARITH_HUFF_CODER_CHANGES , - int32_t wc_strat_arith + const int16_t wc_strat_arith #endif ) { @@ -314,8 +319,7 @@ static void arith_encode_cell_array( if ( pArith->range > 1 ) { #ifdef ARITH_HUFF_CODER_CHANGES - arith_result = ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len, - wc_strat_arith ); + arith_result = ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len, wc_strat_arith ); if ( arith_result < 0 ) { return -1; @@ -339,6 +343,7 @@ static void arith_encode_cell_array( * * Arithmetic encode a cell array - differential *-----------------------------------------------------------------------------------------*/ + #ifdef ARITH_HUFF_CODER_CHANGES static int16_t arith_encode_cell_array_diff( #else @@ -352,7 +357,7 @@ static void arith_encode_cell_array_diff( int16_t *pSymbol #ifdef ARITH_HUFF_CODER_CHANGES , - int32_t wc_strat_arith + const int16_t wc_strat_arith #endif ) { @@ -374,8 +379,7 @@ static void arith_encode_cell_array_diff( if ( pArith_diff->range > 1 ) { #ifdef ARITH_HUFF_CODER_CHANGES - arith_result = ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData, - wc_strat_arith ); + arith_result = ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData, wc_strat_arith ); if ( arith_result < 0 ) { return -1; @@ -399,6 +403,7 @@ static void arith_encode_cell_array_diff( * * Arithmetic encode a cell array *-----------------------------------------------------------------------------------------*/ + #ifdef ARITH_HUFF_CODER_CHANGES int16_t ivas_arith_encode_cmplx_cell_array( #else @@ -415,7 +420,7 @@ void ivas_arith_encode_cmplx_cell_array( const int16_t any_diff #ifdef ARITH_HUFF_CODER_CHANGES , - int32_t wc_strat_arith + const int16_t wc_strat_arith #endif ) { @@ -494,15 +499,13 @@ void ivas_arith_encode_cmplx_cell_array( #endif #ifdef ARITH_HUFF_CODER_CHANGES - arith_result = arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input, - wc_strat_arith ); + arith_result = arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input, wc_strat_arith ); if ( arith_result < 0 ) { return -1; } - arith_result = arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new, - wc_strat_arith ); + arith_result = arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new, wc_strat_arith ); if ( arith_result < 0 ) { return -1; @@ -516,8 +519,7 @@ void ivas_arith_encode_cmplx_cell_array( else { #ifdef ARITH_HUFF_CODER_CHANGES - arith_result = arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re, - wc_strat_arith ); + arith_result = arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re, wc_strat_arith ); if ( arith_result < 0 ) { return -1; diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index e01de98741..30d5184d65 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -272,6 +272,7 @@ ivas_error ivas_sba_enc_reconfigure( mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); #endif hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; + /*-----------------------------------------------------------------* * Allocate, initialize, and configure SCE/CPE/MCT handles *-----------------------------------------------------------------*/ @@ -285,12 +286,22 @@ ivas_error ivas_sba_enc_reconfigure( return error; } + #ifdef ARITH_HUFF_CODER_CHANGES +/*-------------------------------------------------------------------* + * ivas_sba_get_max_md_bits() + * + * Return maximum SBA metadata bit-budget + *-------------------------------------------------------------------*/ + +/*! r: maximum SBA metadata bit-budget */ int16_t ivas_sba_get_max_md_bits( - Encoder_Struct *st_ivas ) + Encoder_Struct *st_ivas /* i/o: Encoder struct */ +) { int16_t max_md_bits; int16_t max_bits; + if ( ivas_get_hodirac_flag( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ) ) { max_bits = 2000; @@ -299,7 +310,9 @@ int16_t ivas_sba_get_max_md_bits( { max_bits = 500; } + max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, max_bits ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC + #ifndef SBA_MODE_CLEAN_UP if ( st_ivas->sba_mode == SBA_MODE_SPAR ) #else @@ -308,6 +321,7 @@ int16_t ivas_sba_get_max_md_bits( { max_md_bits += st_ivas->hSpar->hMdEnc->spar_md_cfg.max_md_bits_spar; } + return max_md_bits; } #endif diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 5956ef03dd..08dc96f472 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -478,8 +478,7 @@ static ivas_error ivas_spar_enc_process( input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); sba_order = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); - nchan_inp = ivas_sba_get_nchan_metadata( sba_order, - hEncoderConfig->ivas_total_brate ); + nchan_inp = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate ); assert( nchan_inp <= hEncoderConfig->nchan_inp ); int16_t active_w_vlbr; @@ -679,17 +678,15 @@ static ivas_error ivas_spar_enc_process( } else { - ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, - ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND + ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND #ifdef ARITH_HUFF_CODER_CHANGES , - hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, - 1, hEncoderConfig->Opt_PCA_ON, - hSpar->AGC_Enable + hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, hSpar->AGC_Enable #endif ); } } + /*-----------------------------------------------------------------------------------------* * Covariance process *-----------------------------------------------------------------------------------------*/ diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 50ef2f0348..d5282176cb 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -76,6 +76,7 @@ static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR #else static void ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t bands_bw ); #endif + #ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); #else @@ -89,6 +90,7 @@ static void ivas_select_next_strat( ivas_strats_t prior_strat, ivas_strats_t cs[ static void ivas_store_prior_coeffs( ivas_spar_md_enc_state_t *hMdEnc, const int16_t num_bands, const int16_t strat, const int16_t dtx_vad, const int16_t qsi ); static void ivas_write_spar_md_bitstream( ivas_spar_md_enc_state_t *hMdEnc, const int16_t nB, const int16_t bands_bw, BSTR_ENC_HANDLE hMetaData, const int32_t ivas_total_brate, const int16_t strat, const int16_t qsi, const int16_t planarCP ); + static void ivas_spar_quant_pred_coeffs_dtx( ivas_spar_md_t *pSpar_md, const float *pValues, const int16_t ndm, int16_t *pIndex, const int16_t dim1, float *pQuant ); static void ivas_quant_p_per_band_dtx( float *pP_mat, const int16_t num_dec, const int16_t num_dmx, int16_t *ppIdx_pd, float *pP_out, const int16_t num_ch ); @@ -309,6 +311,7 @@ void ivas_spar_md_enc_close( * * SPAR MD encoder initialization *-----------------------------------------------------------------------------------------*/ + ivas_error ivas_spar_md_enc_init( ivas_spar_md_enc_state_t *hMdEnc, /* o : MD encoder handle */ const ENCODER_CONFIG_HANDLE hEncoderConfig, /* i : configuration structure */ @@ -321,17 +324,14 @@ ivas_error ivas_spar_md_enc_init( int16_t num_channels, i, j, k; ivas_sba_get_spar_hoa_md_flag( sba_order, hEncoderConfig->ivas_total_brate, &hMdEnc->spar_hoa_md_flag, &hMdEnc->spar_hoa_dirac2spar_md_flag ); - num_channels = ivas_sba_get_nchan_metadata( sba_order, - hEncoderConfig->ivas_total_brate ); + num_channels = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate ); ivas_sba_get_spar_hoa_ch_ind( num_channels, hEncoderConfig->ivas_total_brate, hMdEnc->HOA_md_ind ); table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, - ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND + ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND #ifdef ARITH_HUFF_CODER_CHANGES , - hMdEnc->spar_hoa_dirac2spar_md_flag, - 1, hEncoderConfig->Opt_PCA_ON, + hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, #ifndef DEBUG_AGC_ENCODER_CMD_OPTION ivas_agc_enc_get_flag( ivas_spar_br_table_consts[table_idx].nchan_transport ) #else @@ -609,12 +609,14 @@ ivas_error ivas_spar_md_enc_process( #ifdef ARITH_HUFF_CODER_CHANGES /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ md_indices_allocated = hMdEnc->spar_md_cfg.max_bits_per_blk + IVAS_SPAR_ARITH_OVERSHOOT_BITS; - ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ); + if ( ( ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD encoder indices" ); + } #endif num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; - num_ch = ivas_sba_get_nchan_metadata( sba_order, - hEncoderConfig->ivas_total_brate ); + num_ch = ivas_sba_get_nchan_metadata( sba_order, hEncoderConfig->ivas_total_brate ); active_w = hMdEnc->spar_md_cfg.active_w; nchan_transport = hMdEnc->spar_md_cfg.nchan_transport; @@ -984,6 +986,7 @@ ivas_error ivas_spar_md_enc_process( reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); #endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); + #ifdef ARITH_HUFF_CODER_CHANGES /*write to main buffer if its a valid bitstream*/ if ( hMetaData_tmp.nb_bits_tot > 0 ) @@ -1031,6 +1034,7 @@ ivas_error ivas_spar_md_enc_process( } } +#ifdef DEBUGGING #ifdef ARITH_HUFF_CODER_CHANGES if ( dtx_vad == 1 ) { @@ -1041,6 +1045,8 @@ ivas_error ivas_spar_md_enc_process( { assert( qsi == 0 ); } +#endif + /* Reuse mixer matrix values for unsent bands */ if ( ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) && ( code_strat > 3 ) ) { @@ -1462,17 +1468,14 @@ static void ivas_write_spar_md_bitstream( #ifdef ARITH_HUFF_CODER_CHANGES entropy_coding_result = #endif - ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP, - bands_bw ); + ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP, bands_bw ); } else { #ifdef ARITH_HUFF_CODER_CHANGES entropy_coding_result = #endif - ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP, - strat, - ivas_total_brate ); + ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP, strat, ivas_total_brate ); } #ifdef ARITH_HUFF_CODER_CHANGES @@ -1491,6 +1494,7 @@ static void ivas_write_spar_md_bitstream( * * Generate huffman coded bitstream *-----------------------------------------------------------------------------------------*/ + #ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_get_huffman_coded_bs( #else @@ -1620,6 +1624,7 @@ static void ivas_get_huffman_coded_bs( * * Generate arithmetic coded bitstream *-----------------------------------------------------------------------------------------*/ + #ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_get_arith_coded_bs( #else @@ -1722,8 +1727,7 @@ static void ivas_get_arith_coded_bs( #ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, - hMdEnc->spar_md_cfg.max_bits_per_blk ); + symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); if ( arith_result < 0 ) { return -1; @@ -1775,8 +1779,7 @@ static void ivas_get_arith_coded_bs( #ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, - hMdEnc->spar_md_cfg.max_bits_per_blk ); + symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); if ( arith_result < 0 ) { return -1; @@ -1786,7 +1789,6 @@ static void ivas_get_arith_coded_bs( symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff ); #endif - ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF, planarCP ); if ( any_diff == 1 ) @@ -1801,10 +1803,10 @@ static void ivas_get_arith_coded_bs( decd_cell_dims[i].dim1 = decd_cell_dims[i].dim1 - IVAS_SPAR_HOA3_NP_CHS; } } + #ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, - hMdEnc->spar_md_cfg.max_bits_per_blk ); + symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); if ( arith_result < 0 ) { return -1; @@ -1814,7 +1816,6 @@ static void ivas_get_arith_coded_bs( symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff ); #endif - ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF, planarCP ); if ( any_diff == 1 ) -- GitLab From 78cd95adc14f2fbf05c0a60880650bdd74a95682 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 5 Jun 2023 11:11:59 +0200 Subject: [PATCH 169/381] remove superfluous todo --- lib_util/tinywavein_c.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_util/tinywavein_c.h b/lib_util/tinywavein_c.h index 2d9a218934..cddcb64501 100644 --- a/lib_util/tinywavein_c.h +++ b/lib_util/tinywavein_c.h @@ -180,7 +180,6 @@ static WAVEFILEIN *OpenWav( } /* skip some potential chunks up to fmt chunk */ - /* todo: merge "bext" reading into this loop */ while ( strncmp( "fmt ", fmt_chunk.chunkID, 4 ) != 0 ) { uint32_t chunkSize = 0; -- GitLab From 27ea113782515ad8f92389c7168d0d923bcd6f6e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 5 Jun 2023 11:16:38 +0200 Subject: [PATCH 170/381] remove superfluous todo --- lib_util/tinywaveout_c.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_util/tinywaveout_c.h b/lib_util/tinywaveout_c.h index 393633a745..db60146a02 100644 --- a/lib_util/tinywaveout_c.h +++ b/lib_util/tinywaveout_c.h @@ -205,7 +205,6 @@ static WAVEFILEOUT *CreateBWF( wfch.blockAlignment = LittleEndian16( (int16_t) blockAlignment ); wfch.sampleRate = LittleEndian32( sampleRate ); wfch.bytesPerSecond = LittleEndian32( sampleRate * blockAlignment ); - /* ToDo: tbd: wavfmt ext hdr here */ /* write to file */ self->fmtChunkOffset = ByteCnt; ByteCnt += (uint32_t) fwrite( &wfch, 1, sizeof( wfch ), self->theFile ); -- GitLab From baa47b2b08978daf64fb59446712675760fa72df Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 11:29:19 +0200 Subject: [PATCH 171/381] issue 529: fix Bandwidth Detector not working reliably for Music and Generic Audio; under FIX_529_BWD_ISSUE --- lib_com/ivas_prot.h | 5 ++++- lib_com/options.h | 1 + lib_com/prot.h | 8 +++++--- lib_enc/amr_wb_enc.c | 7 +++++-- lib_enc/bw_detect.c | 13 ++++++++++--- lib_enc/ivas_core_pre_proc_front.c | 12 +++++++++--- lib_enc/ivas_cpe_enc.c | 3 +++ lib_enc/ivas_ism_enc.c | 4 ++++ lib_enc/ivas_mdct_core_enc.c | 4 ++++ lib_enc/ivas_sce_enc.c | 3 +++ lib_enc/pre_proc.c | 7 +++++-- 11 files changed, 53 insertions(+), 14 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2804668e0f..cca3a4830e 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -211,7 +211,10 @@ ivas_error pre_proc_front_ivas( const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +#ifdef FIX_529_BWD_ISSUE + const IVAS_FORMAT ivas_format, /* i : IVAS format */ +#endif + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error pre_proc_ivas( diff --git a/lib_com/options.h b/lib_com/options.h index 369eb91f24..ca67203afd 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -237,6 +237,7 @@ #define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ #define BINAURAL_AUDIO_CMDLINE +#define FIX_529_BWD_ISSUE /* VA: issue 529: fix Bandwidth Detector not working reliably for Music and Generic Audio */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/prot.h b/lib_com/prot.h index e6f371c468..a8b07ce486 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -3877,9 +3877,11 @@ void bw_detect( Encoder_State *st, /* i/o: Encoder State */ const float signal_in[], /* i : input signal */ float *spectrum, /* i : MDCT spectrum */ - const float *enerBuffer /* i : energy buffer */ - , - const int16_t mct_on /* i : flag MCT mode */ + const float *enerBuffer, /* i : energy buffer */ +#ifdef FIX_529_BWD_ISSUE + const IVAS_FORMAT ivas_format, /* i : IVAS format */ +#endif + const int16_t mct_on /* i : flag MCT mode */ ); diff --git a/lib_enc/amr_wb_enc.c b/lib_enc/amr_wb_enc.c index c0c0b4f18e..bf7ad3808a 100644 --- a/lib_enc/amr_wb_enc.c +++ b/lib_enc/amr_wb_enc.c @@ -342,8 +342,11 @@ void amr_wb_enc( * WB, SWB and FB bandwidth detector *----------------------------------------------------------------*/ - bw_detect( st, st->input, NULL, NULL, - 0 ); +#ifdef FIX_529_BWD_ISSUE + bw_detect( st, st->input, NULL, NULL, MONO_FORMAT, 0 ); +#else + bw_detect( st, st->input, NULL, NULL, 0 ); +#endif /* in AMR_WB IO, limit the maximum band-width to WB */ if ( st->bwidth > WB ) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 6de35a211a..cb9c532cbc 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -71,9 +71,11 @@ void bw_detect( Encoder_State *st, /* i/o: Encoder State */ const float signal_in[], /* i : input signal */ float *spectrum, /* i : MDCT spectrum */ - const float *enerBuffer /* i : energy buffer */ - , - const int16_t mct_on /* i : flag MCT mode */ + const float *enerBuffer, /* i : energy buffer */ +#ifdef FIX_529_BWD_ISSUE + const IVAS_FORMAT ivas_format, /* i : IVAS format */ +#endif + const int16_t mct_on /* i : flag MCT mode */ ) { int16_t i, j, k, bw_max, bin_width, n_bins; @@ -86,7 +88,12 @@ void bw_detect( int16_t bwd_count_wider_bw, l_frame; bwd_count_wider_bw = BWD_COUNT_WIDER_BW; +#ifdef FIX_529_BWD_ISSUE + if ( ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate >= IVAS_64k || mct_on ) ) || + ( ivas_format == ISM_FORMAT && st->element_brate >= IVAS_48k ) ) +#else if ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate > IVAS_64k || mct_on ) ) +#endif { bwd_count_wider_bw = BWD_COUNT_WIDER_BW_MDCT; } diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 5f775d2403..4937305223 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -107,7 +107,10 @@ ivas_error pre_proc_front_ivas( const int16_t front_vad_flag, /* i : front-VAD flag to overwrite VAD decision */ const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ - const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ +#ifdef FIX_529_BWD_ISSUE + const IVAS_FORMAT ivas_format, /* i : IVAS format */ +#endif + const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ ) { @@ -479,8 +482,11 @@ ivas_error pre_proc_front_ivas( if ( st->idchan == 0 && element_mode != IVAS_CPE_MDCT ) { - bw_detect( st, st->input, NULL, enerBuffer, - 0 ); +#ifdef FIX_529_BWD_ISSUE + bw_detect( st, st->input, NULL, enerBuffer, ivas_format, 0 ); +#else + bw_detect( st, st->input, NULL, enerBuffer, 0 ); +#endif } if ( element_mode != IVAS_CPE_MDCT ) /* in MDCT stereo, set_bw_stereo() is used instead */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 5f19a5395a..b8bc2facff 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -442,6 +442,9 @@ ivas_error ivas_cpe_enc( &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, +#ifdef FIX_529_BWD_ISSUE + ivas_format, +#endif ivas_total_brate ); if ( error != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 6c6a0c8837..0c4d654436 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -165,6 +165,10 @@ ivas_error ivas_ism_enc( &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, +#ifdef FIX_529_BWD_ISSUE + ISM_FORMAT, +#endif + st_ivas->hEncoderConfig->ivas_total_brate ); if ( error != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index edc9ea1e50..dac1489aed 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -686,7 +686,11 @@ void ivas_mdct_core_whitening_enc( for ( n = 0; n < nSubframes; n++ ) { +#ifdef FIX_529_BWD_ISSUE + bw_detect( st, NULL, st->hTcxEnc->spectrum[n], NULL, MC_FORMAT /*just cannot be ISM_FORMAT*/, mct_on ); +#else bw_detect( st, NULL, st->hTcxEnc->spectrum[n], NULL, mct_on ); +#endif if ( nSubframes == NB_DIV && n == 0 ) { diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 87c0e8e9d3..cf272fab6b 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -185,6 +185,9 @@ ivas_error ivas_sce_enc( &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, +#ifdef FIX_529_BWD_ISSUE + ivas_format, +#endif st_ivas->hEncoderConfig->ivas_total_brate ); if ( error != IVAS_ERR_OK ) { diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c index 82436a7dfc..cac5e8efbe 100644 --- a/lib_enc/pre_proc.c +++ b/lib_enc/pre_proc.c @@ -219,8 +219,11 @@ void pre_proc( * NB/WB/SWB/FB bandwidth detector *----------------------------------------------------------------*/ - bw_detect( st, st->input, NULL, enerBuffer, - 0 ); +#ifdef FIX_529_BWD_ISSUE + bw_detect( st, st->input, NULL, enerBuffer, MONO_FORMAT, 0 ); +#else + bw_detect( st, st->input, NULL, enerBuffer, 0 ); +#endif /*----------------------------------------------------------------* * Noise energy down-ward update and total noise energy estimation -- GitLab From 3e8bc6c88e84ddb27e4a94026c621bb2c2471dae Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 5 Jun 2023 11:33:31 +0200 Subject: [PATCH 172/381] remove todo-comment --- lib_com/core_com_config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index 7f9b385c3f..a3f003f979 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -742,7 +742,6 @@ void init_tcx_window_cfg( hTcxCfg->tcx_mdct_window_min_length = (int16_t) ( sr_core * INV_CLDFB_BANDWIDTH ); hTcxCfg->tcx_mdct_window_min_lengthFB = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH ); /* save complexity by copying the small windows if they have the same length */ - /* TODO: is this always the case ? */ if ( hTcxCfg->tcx_mdct_window_min_length == hTcxCfg->tcx_mdct_window_trans_length ) { mvr2r( hTcxCfg->tcx_mdct_window_trans, hTcxCfg->tcx_mdct_window_minimum, hTcxCfg->tcx_mdct_window_min_length ); -- GitLab From e5a3d532f8fb6eab89bb8df817c03a0bcfb632b4 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 5 Jun 2023 12:50:17 +0200 Subject: [PATCH 173/381] remove (rotten) code under FIX_IVAS_337 + corresponding todo --- lib_dec/ivas_tcx_core_dec.c | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index ab82fb4e07..61fb5df443 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -45,8 +45,6 @@ #include "stat_com.h" #include "ivas_prot.h" -/*defne FIX_IVAS_337*/ // TODO: needs more work - /*-------------------------------------------------------------* * Local prototypes *-------------------------------------------------------------*/ @@ -189,9 +187,6 @@ void stereo_tcx_core_dec( /*Concealment*/ int16_t bfi; -#ifdef FIX_IVAS_337 /*IVAS-337 consider BER */ - int16_t tcx_last_overlap_mode, tcx_current_overlap_mode; -#endif float psd[L_FRAME16k], psd_part[NPART_SHAPING]; @@ -267,28 +262,9 @@ void stereo_tcx_core_dec( if ( !bfi ) { st->second_last_core = st->last_core; -#ifdef FIX_IVAS_337 /*IVAS-337 consider BER */ - tcx_last_overlap_mode = st->hTcxCfg->tcx_last_overlap_mode; - tcx_current_overlap_mode = st->hTcxCfg->tcx_curr_overlap_mode; -#endif dec_prm_tcx( st, param, param_lpc, &total_nbbits, last_element_mode, &bitsRead ); -#ifdef FIX_IVAS_337 /*IVAS-337 consider BER */ - if ( !st->rate_switching_init && st->BER_detect ) - { - st->coder_type = st->last_coder_type; - st->last_core = st->second_last_core; - st->hTcxCfg->tcx_last_overlap_mode = tcx_last_overlap_mode; - st->hTcxCfg->tcx_curr_overlap_mode = tcx_current_overlap_mode; - st->bfi = 1; - bfi = 1; - st->flagGuidedAcelp = 0; - st->nbLostCmpt++; - st->core_brate = st->last_core_brate; - st->core = GetPLCModeDecision( st ); - } -#endif } else { -- GitLab From cc240b0ed645d80a88964a79b6b311f561a49312 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 13:45:48 +0200 Subject: [PATCH 174/381] fix MSAN error within FIX_529_BWD_ISSUE --- lib_enc/bw_detect.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index cb9c532cbc..8ef000626c 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -89,8 +89,8 @@ void bw_detect( bwd_count_wider_bw = BWD_COUNT_WIDER_BW; #ifdef FIX_529_BWD_ISSUE - if ( ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate >= IVAS_64k || mct_on ) ) || - ( ivas_format == ISM_FORMAT && st->element_brate >= IVAS_48k ) ) + if ( st->ini_frame > 0 && ( ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate >= IVAS_64k || mct_on ) ) || + ( ivas_format == ISM_FORMAT && st->element_brate >= IVAS_48k ) ) ) #else if ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate > IVAS_64k || mct_on ) ) #endif -- GitLab From dbcb5c7f9d1b6dd0a69aebcdb32d47bd45d543b2 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 14:45:03 +0200 Subject: [PATCH 175/381] Formatting after acceptance of switches --- lib_com/bitstream.c | 35 ++-- lib_com/ivas_cnst.h | 3 +- lib_com/ivas_cov_smooth.c | 11 +- lib_com/ivas_fb_mixer.c | 26 +-- lib_com/ivas_prot.h | 95 ++++----- lib_com/ivas_qmetadata_com.c | 5 +- lib_com/ivas_sba_config.c | 18 +- lib_com/ivas_spar_com.c | 1 + lib_com/lsf_tools.c | 87 +++++--- lib_com/prot.h | 219 ++++++++++---------- lib_dec/acelp_core_dec.c | 5 +- lib_dec/ivas_dirac_output_synthesis_dec.c | 202 +++++++++---------- lib_dec/ivas_ism_dec.c | 3 +- lib_dec/ivas_ism_param_dec.c | 5 +- lib_dec/ivas_qmetadata_dec.c | 5 +- lib_dec/ivas_sba_dec.c | 4 +- lib_dec/ivas_spar_decoder.c | 8 +- lib_dec/ivas_spar_md_dec.c | 54 ++--- lib_dec/ivas_stereo_dft_dec.c | 2 +- lib_dec/lsf_dec.c | 24 +-- lib_enc/ivas_dirac_enc.c | 6 +- lib_enc/ivas_enc_cov_handler.c | 3 +- lib_enc/ivas_init_enc.c | 5 +- lib_enc/ivas_mc_paramupmix_enc.c | 12 +- lib_enc/ivas_qmetadata_enc.c | 7 +- lib_enc/lib_enc.c | 6 +- lib_enc/lsf_enc.c | 5 +- lib_enc/lsf_msvq_ma_enc.c | 233 +++++++++++----------- 28 files changed, 538 insertions(+), 551 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index c9571d41c1..076f8d51f1 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -228,8 +228,8 @@ Word16 rate2EVSmode( *-------------------------------------------------------------------*/ ivas_error ind_list_realloc( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ) { int16_t i, ind_list_pos; @@ -281,9 +281,10 @@ ivas_error ind_list_realloc( * Get the maximum allowed number of indices in the encoder *-----------------------------------------------------------------------*/ -int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +/*! r: maximum number of indices */ +int16_t get_ivas_max_num_indices( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { if ( ivas_format == STEREO_FORMAT ) @@ -519,9 +520,10 @@ int16_t get_ivas_max_num_indices( /* o : maximum * Get the maximum allowed number of indices in the core coder *-----------------------------------------------------------------------*/ -int16_t get_core_max_num_indices( /* o : maximum number of indices */ - const int16_t core, /* i : core */ - const int32_t total_brate /* i : total bitrate */ +/*! r: maximum number of indices */ +int16_t get_core_max_num_indices( + const int16_t core, /* i : core */ + const int32_t total_brate /* i : total bitrate */ ) { /* set the maximum number of indices in the core coder */ @@ -694,8 +696,9 @@ int16_t get_core_max_num_indices( /* o : maximum numb * Get the maximum number of indices in the BWE *-----------------------------------------------------------------------*/ -int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ - const int32_t extl_brate /* i : extensiona layer bitrate */ +/*! r: maximum number of indices */ +int16_t get_BWE_max_num_indices( + const int32_t extl_brate /* i : extensiona layer bitrate */ ) { /* set the maximum number of indices in the BWE */ @@ -716,9 +719,10 @@ int16_t get_BWE_max_num_indices( /* o : maximum number * Set the maximum allowed number of metadata indices in the list *-----------------------------------------------------------------------*/ -int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +/*! r: maximum number of indices */ +int16_t get_ivas_max_num_indices_metadata( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { /* set the maximum required number of metadata indices */ @@ -1348,7 +1352,7 @@ void push_next_bits( /*! r: result: index of the indice in the list, -1 if not found */ int16_t find_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - int16_t id, /* i : ID of the indice */ + const int16_t id, /* i : ID of the indice */ uint16_t *value, /* o : value of the quantized indice */ int16_t *nb_bits /* o : number of bits used to quantize the indice */ ) @@ -1368,6 +1372,7 @@ int16_t find_indice( return -1; } + /*-------------------------------------------------------------------* * delete_indice() * @@ -1377,7 +1382,7 @@ int16_t find_indice( /*! r: number of deleted indices */ uint16_t delete_indice( BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - int16_t id /* i : ID of the indice */ + const int16_t id /* i : ID of the indice */ ) { int16_t i, j; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9557f7aef1..897a7c4c18 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -996,8 +996,7 @@ typedef enum typedef enum { DIRAC_OPEN, /* initialize to default value */ - DIRAC_RECONFIGURE /* HOA3 */ - , + DIRAC_RECONFIGURE, /* HOA3 */ DIRAC_RECONFIGURE_MODE } DIRAC_CONFIG_FLAG; diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index e407bccc6c..4ab255bc2b 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -53,12 +53,10 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, const float max_update_rate, - const int16_t min_pool_size + const int16_t min_pool_size, #ifdef FIX_489_COV_SMOOTHING - , - const COV_SMOOTHING_TYPE smooth_mode /* i : flag multichannel vs SPAR */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : flag multichannel vs SPAR */ #endif - , const int32_t ivas_total_brate ) { int16_t j, k; @@ -157,10 +155,9 @@ ivas_error ivas_spar_covar_smooth_enc_open( ivas_cov_smooth_state_t **hCovState_out, /* i/o: SPAR Covar. smoothing handle */ const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ - const int16_t nchan_inp /* i : number of input channels */ - , + const int16_t nchan_inp, /* i : number of input channels */ #ifdef FIX_489_COV_SMOOTHING - COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ #endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index dbbce9afe4..d4c00dc2d5 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -107,9 +107,8 @@ ivas_error ivas_fb_set_cfg( const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ - const int32_t sampling_rate /* i : sampling rate */ - , - const int16_t nchan_fb_in /* i : number of dirAC analysis channels*/ + const int32_t sampling_rate, /* i : sampling rate */ + const int16_t nchan_fb_in /* i : number of dirAC analysis channels*/ ) { IVAS_FB_CFG *pFb_cfg; @@ -495,8 +494,7 @@ void ivas_fb_mixer_pcm_ingest( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ - const int16_t frame_len /* i : frame length */ - , + const int16_t frame_len, /* i : frame length */ const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ) { int16_t i; @@ -536,16 +534,13 @@ void ivas_fb_mixer_pcm_ingest( void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ - const int16_t length /* i : length of time slot */ - , - const int16_t nchan_fb_in /* i : number of analysis channels */ + const int16_t length, /* i : length of time slot */ + const int16_t nchan_fb_in /* i : number of analysis channels */ ) { int16_t i; - for ( i = 0; i < - nchan_fb_in; - i++ ) + for ( i = 0; i < nchan_fb_in; i++ ) { mvr2r( &hFbMixer->ppFilterbank_prior_input[i][length], hFbMixer->ppFilterbank_prior_input[i], hFbMixer->fb_cfg->prior_input_length - length ); mvr2r( pcm_in[i], &hFbMixer->ppFilterbank_prior_input[i][hFbMixer->fb_cfg->prior_input_length - length], length ); @@ -567,9 +562,8 @@ void ivas_fb_mixer_get_windowed_fr( float *frame_f_real[], /* o : real freq domain values */ float *frame_f_imag[], /* o : imag freq domain values */ const int16_t length, /* i : number of new samples in time slot */ - const int16_t mdft_len /* i : MDFT frame length */ - , - const int16_t nchan_fb_in /* i : number of analysis channels */ + const int16_t mdft_len, /* i : MDFT frame length */ + const int16_t nchan_fb_in /* i : number of analysis channels */ ) { int16_t ch_idx, j, offset, rev_offset; @@ -850,8 +844,8 @@ static int16_t ivas_calculate_abs_fr( float short_stride_nrg = 0.0f; float cldfb_nrg = 0.0f; int16_t short_stride = pFb->fb_bin_to_band.short_stride; - const int16_t num_bins_per_short_stride_bin = ( const int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / short_stride ); - const int16_t num_bins_per_cldfb_band = ( const int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / pFb->fb_bin_to_band.num_cldfb_bands ); + const int16_t num_bins_per_short_stride_bin = (const int16_t) ( ( sampling_rate / FRAMES_PER_SEC ) / short_stride ); + const int16_t num_bins_per_cldfb_band = (const int16_t) ( ( sampling_rate / FRAMES_PER_SEC ) / pFb->fb_bin_to_band.num_cldfb_bands ); float short_stride_max_per_spar_band = 1e-9f; /*loop over all stored Filter Bank Response MDFT coefficients*/ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2804668e0f..c33c53457c 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -666,7 +666,7 @@ ivas_error ivas_mc_enc_config( ivas_error ivas_mc_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t idx /* i : LS config. index */ - #ifdef JBM_TSM_ON_TCS +#ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ int16_t *data /* o : flushed samples (JBM) */ @@ -1014,8 +1014,7 @@ void ivas_param_ism_stereo_dmx( ); void ivas_param_ism_config( - PARAM_ISM_CONFIG_HANDLE hParamIsm /* i/o: IVAS Param ISM Config Structure */ - , + PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i/o: IVAS Param ISM Config Structure */ const int16_t nchan_ism /* i : number of ISM channels */ ); @@ -1024,8 +1023,7 @@ ivas_error ivas_ism_enc_config( ); ivas_error ivas_ism_dec_config( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ - , + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const ISM_MODE last_ism_mode /* i/o: last ISM mode */ #ifdef JBM_TSM_ON_TCS , @@ -1335,7 +1333,7 @@ void stereo_dft_dec( const int16_t nchan_transport /* i : number of transpor channels */ #ifdef FIX_STEREO_474 , - const int16_t num_md_sub_frames /* i: number of MD subframes */ + const int16_t num_md_sub_frames /* i : number of MD subframes */ #endif ); @@ -3104,8 +3102,7 @@ void mdct_read_IGF_bits( ivas_error ivas_qmetadata_enc_encode( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData /* i/o: q_metadata handle */ - , + IVAS_QMETADATA *hQMetaData, /* i/o: q_metadata handle */ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); @@ -3161,8 +3158,7 @@ void ivas_qmetadata_enc_sid_encode( int16_t ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ uint16_t *bitstream, /* i : bitstream */ - int16_t *index /* i/o: bitstream position */ - , + int16_t *index, /* i/o: bitstream position */ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); @@ -3409,11 +3405,10 @@ void ivas_dirac_param_est_enc( float **pp_fr_imag, const int16_t input_frame, #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode + const SBA_MODE sba_mode, #else - const IVAS_FORMAT ivas_format + const IVAS_FORMAT ivas_format , #endif - , const int16_t hodirac_flag, const int16_t nchan_fb_in ); @@ -3491,9 +3486,8 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( - const int16_t sba_order /* i : Ambisonic (SBA) order */ - , - const int32_t ivas_total_brate + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); void ivas_sba_get_spar_hoa_ch_ind( @@ -3843,8 +3837,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( void ivas_dirac_dec_output_synthesis_init( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ - const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ - , + const int16_t nchan_out_woLFE, /* i : number of output audio channels without LFE */ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); @@ -3867,13 +3860,11 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport /* i : number of transport channels */ + const int16_t nchan_transport, /* i : number of transport channels */ #if defined( JBM_TSM_ON_TCS ) - , - const int16_t index_slot + const int16_t ind_slot, /* i : index of the slot to be added to the input covariance */ #endif - , - const int16_t hodirac_flag + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( @@ -3884,8 +3875,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( #ifdef JBM_TSM_ON_TCS const int16_t nbslots, /* i : number of slots to process */ #endif - const float *onset_filter - , + const float *onset_filter, #ifdef FIX_393_459_460_SBA_MD float *diffuseness, #else @@ -4277,7 +4267,7 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( #endif ); -void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( +void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( #ifdef JBM_TSM_ON_TCS float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ @@ -4745,9 +4735,8 @@ void ivas_spar_to_dirac( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t dtx_vad, /* i : DTX frame flag */ - const int16_t num_bands_out /* i : number of output bands */ - , - const int16_t bw /* i : band joining factor */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t bw /* i : band joining factor */ ); void ivas_spar_update_md_hist( @@ -4756,24 +4745,21 @@ void ivas_spar_update_md_hist( void ivas_spar_smooth_md_dtx( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_bands_out /* i : number of output bands */ - , - const int16_t num_md_sub_frames /* i : number of metadata subframes */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ ); void ivas_spar_setup_md_smoothing( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_bands_out /* i : number of output bands */ - , - const int16_t num_md_sub_frames /* i : number of metadata subframes */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ ); void ivas_spar_dec_gen_umx_mat( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ - const int16_t bfi /* i : bad frame indicator */ - , + const int16_t bfi, /* i : bad frame indicator */ const int16_t num_md_sub_frames ); @@ -4782,10 +4768,9 @@ ivas_error ivas_spar_covar_enc_open( ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ const int32_t input_Fs, /* i : input sampling rate */ - const int16_t nchan_inp /* i : number of input channels */ - , + const int16_t nchan_inp, /* i : number of input channels */ #ifdef FIX_489_COV_SMOOTHING - COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ #endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); @@ -4806,8 +4791,7 @@ void ivas_enc_cov_handler_process( const int16_t end_band, const int16_t nchan_inp, const int16_t dtx_vad, - const int16_t transient_det[2] - , + const int16_t transient_det[2], const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); @@ -4815,12 +4799,11 @@ ivas_error ivas_spar_covar_smooth_enc_open( ivas_cov_smooth_state_t **hCovState, /* i/o: SPAR Covar. smoothing handle */ const ivas_cov_smooth_cfg_t *cov_smooth_cfg, /* i : SPAR config. handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ - const int16_t nchan_inp /* i : number of input channels */ - , + const int16_t nchan_inp, /* i : number of input channels */ #ifdef FIX_489_COV_SMOOTHING - COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ + const COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ #endif - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); void ivas_spar_covar_smooth_enc_close( @@ -5191,8 +5174,7 @@ void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_1, /* i : Input ratio for direction 1 */ const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ - int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ - , + int16_t *ratio_index_mod2, /* o : Output modified ratio for direction 2 */ const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); @@ -5576,12 +5558,11 @@ void computeReferencePower_enc( const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode /* i : SBA mode */ + const SBA_MODE sba_mode, /* i : SBA mode */ #else const IVAS_FORMAT ivas_format, /* i : ivas_format */ - int16_t ref_power_w /* i : use 0 if hodirac is enabled */ + int16_t ref_power_w, /* i : use 0 if hodirac is enabled */ #endif - , const int16_t nchan_ana /* i : number of analysis channels */ ); @@ -5719,8 +5700,7 @@ ivas_error ivas_fb_set_cfg( const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ - const int32_t sampling_Fs /* i : sampling rate */ - , + const int32_t sampling_Fs, /* i : sampling rate */ const int16_t nachan_dirac_ana /* i : number of DirAR analysis channels */ ); @@ -5741,8 +5721,7 @@ void ivas_fb_mixer_pcm_ingest( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float pcm_in[][L_FRAME48k], /* i : input audio channels */ float **ppOut_pcm, /* o : output audio channels */ - const int16_t frame_length /* i : frame length */ - , + const int16_t frame_length, /* i : frame length */ const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); @@ -5756,8 +5735,7 @@ void ivas_dirac_enc_spar_delay_synchro( void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ - const int16_t length /* i : length of time slot */ - , + const int16_t length, /* i : length of time slot */ const int16_t nchan_fb_in /* i : number of analysis channels */ ); @@ -5767,8 +5745,7 @@ void ivas_fb_mixer_get_windowed_fr( float *frame_f_real[], /* o : real freq domain values */ float *frame_f_imag[], /* o : imag freq domain values */ const int16_t length, /* i : number of new samples in time slot */ - const int16_t mdft_len /* i : MDFT frame length */ - , + const int16_t mdft_len, /* i : MDFT frame length */ const int16_t nchan_fb_in /* i : number of analysis channels */ ); diff --git a/lib_com/ivas_qmetadata_com.c b/lib_com/ivas_qmetadata_com.c index 26dbb10df1..32b4653d2f 100644 --- a/lib_com/ivas_qmetadata_com.c +++ b/lib_com/ivas_qmetadata_com.c @@ -507,9 +507,8 @@ void masa_compensate_two_dir_energy_ratio_index( const int16_t ratio_index_1, /* i : Input ratio for direction 1 */ const int16_t ratio_index_2, /* i : Input ratio for direction 2 */ int16_t *ratio_index_mod1, /* o : Output modified ratio for direction 1 */ - int16_t *ratio_index_mod2 /* o : Output modified ratio for direction 2 */ - , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + int16_t *ratio_index_mod2, /* o : Output modified ratio for direction 2 */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { float ratio1, ratio2; diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 450ebef791..fab61cd0cd 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -223,9 +223,9 @@ int16_t ivas_sba_get_nchan( /*! r: number of ambisonics metadata channels */ int16_t ivas_sba_get_nchan_metadata( - const int16_t sba_order /* i : Ambisonic (SBA) order */ - , - const int32_t ivas_total_brate ) + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +) { int16_t nb_channels; @@ -252,9 +252,9 @@ int16_t ivas_sba_get_nchan_metadata( } /*-------------------------------------------------------------------* - * ivas_sba_get_spar_hoa_md_flag() + * ivas_sba_get_spar_hoa_ch_ind() + * * - * Get the flag to code SPAR HOA MD for all band *-------------------------------------------------------------------*/ /*! r: flag indicating to code SPAR HOA MD for all bands */ @@ -274,6 +274,7 @@ void ivas_sba_get_spar_hoa_ch_ind( { hoa_ind = HOA_keep_ind_spar; } + for ( ch = 0; ch < num_md_chs; ch++ ) { HOA_md_ind[ch] = hoa_ind[ch]; @@ -282,6 +283,13 @@ void ivas_sba_get_spar_hoa_ch_ind( return; } + +/*-------------------------------------------------------------------* + * ivas_sba_get_spar_hoa_md_flag() + * + * Get the flag to code SPAR HOA MD for all band + *-------------------------------------------------------------------*/ + void ivas_sba_get_spar_hoa_md_flag( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 8e7da38580..3c39d7f5e4 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2153,6 +2153,7 @@ void ivas_spar_set_bitrate_config( int16_t quant_strat; int16_t bands_bw; #endif + pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c index 02a735e80c..c0c4556126 100644 --- a/lib_com/lsf_tools.c +++ b/lib_com/lsf_tools.c @@ -2027,13 +2027,20 @@ int16_t tcxlpc_get_cdk( return cdk; } + +/*--------------------------------------------------------------------------* + * dec_FDCNG_MSVQ_stage1() + * + * + *--------------------------------------------------------------------------*/ + void dec_FDCNG_MSVQ_stage1( - int16_t j_full, /* i: index full range */ - int16_t n, /* i: dimension to generate */ - const float *invTrfMatrix, /* i: IDCT matrix for synthesis */ - const DCTTYPE idcttype, /* i: specify which IDCT */ - float *uq, /* o: synthesized stage1 vector */ - Word16 *uq_ind /* o: synthesized stage1 vector in BASOP */ + int16_t j_full, /* i : index full range */ + int16_t n, /* i : dimension to generate */ + const float *invTrfMatrix, /* i : IDCT matrix for synthesis */ + const DCTTYPE idcttype, /* i : specify which IDCT */ + float *uq, /* o : synthesized stage1 vector */ + Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ ) { int16_t col, segm_ind, j; @@ -2080,6 +2087,8 @@ void dec_FDCNG_MSVQ_stage1( /*add common mid fdcng vector, in fdcng bands domain */ v_add( idct_vec, cdk1r_tr_midQ_truncQ, uq, n ); assert( uq_ind == NULL ); + + return; } @@ -2089,7 +2098,6 @@ void dec_FDCNG_MSVQ_stage1( * *--------------------------------------------------------------------------*/ - void msvq_dec( const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ @@ -2098,10 +2106,10 @@ void msvq_dec( const int16_t N, /* i : Vector dimension */ const int16_t maxN, /* i : Codebook dimension */ const int16_t Idx[], /* i : Indices */ - const int16_t applyIDCT_flag, /* i : applyIDCT flag */ - const float *invTrfMatrix, /* i: matrix for IDCT synthesis */ - float *uq, /* o : quantized vector */ - Word16 *uq_ind /* o : quantized vector (fixed point) */ + const int16_t applyIDCT_flag, /* i : applyIDCT flag */ + const float *invTrfMatrix, /* i: matrix for IDCT synthesis */ + float *uq, /* o : quantized vector */ + Word16 *uq_ind /* o : quantized vector (fixed point) */ ) { int16_t i, n, maxn, start; @@ -2425,19 +2433,22 @@ void a2isf( return; } + /*-------------------------------------------------------------------* * dctT2_N_apply_matrix() * * dct/idct truncated matrix appl. for DCT basis vector lengths of N *-------------------------------------------------------------------*/ + void dctT2_N_apply_matrix( - const float *input, - float *output, - const int16_t dct_dim, - int16_t fdcngvq_dim, - const float *matrix, - const int16_t matrix_row_dim, - DCTTYPE dcttype ) + const float *input, /* i : input in fdcng or DCT(fdcng) domain */ + float *output, /* o : output in DCT(fdcng) or fdcng ordomain */ + const int16_t dct_dim, /* i : dct processing dim possibly truncated */ + int16_t fdcngvq_dim, /* i : fdcng domain length */ + const float *matrix, /* i : IDCT matrix */ + const int16_t matrix_row_dim, /* i : */ + const DCTTYPE dcttype /* i : matrix operation type */ +) { int16_t i, j, dim_in, dim_out; int16_t mat_step_col, mat_step_row, mat_step_col_flag; @@ -2494,9 +2505,13 @@ void dctT2_N_apply_matrix( } pt_y++; } + mvr2r( tmp_y, output, dim_out ); + + return; } + /*-------------------------------------------------------------------* * extend_dctN_input() * @@ -2505,14 +2520,15 @@ void dctT2_N_apply_matrix( *-------------------------------------------------------------------*/ void extend_dctN_input( - const float *input, /* i: input in fdcng domain */ - const float *dct_input, /* i: input in dctN(fdcng) domain */ - const int16_t in_dim, /* i: in_dim == N */ - float *ext_sig, /* o: extended output in fdcng domain */ - const int16_t out_dim, /* i: output total dim */ - float *matrix, /* i: idct synthesis matrix N rows, n_cols columns */ - const int16_t n_cols, /* i: number of columns == DCT truncation length */ - DCTTYPE dcttype ) /* i: matrix operation type */ + const float *input, /* i : input in fdcng domain */ + const float *dct_input, /* i : input in dctN(fdcng) domain */ + const int16_t in_dim, /* i : in_dim == N */ + float *ext_sig, /* o : extended output in fdcng domain */ + const int16_t out_dim, /* i : output total dim */ + float *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ + const int16_t n_cols, /* i : number of columns == DCT truncation length */ + const DCTTYPE dcttype /* i : matrix operation type */ +) { int16_t i, j, i_rev; const float( *ptr )[FDCNG_VQ_DCT_MAXTRUNC] = (void *) matrix; @@ -2545,11 +2561,24 @@ void extend_dctN_input( #undef WMC_TOOL_SKIP } } + + return; } -/* inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in RAM from a quantized compressed ROM format */ -void create_IDCT_N_Matrix( float *inv_matrixFloatQ, const int16_t N, const int16_t n_cols, const int16_t alloc_size ) +/*-------------------------------------------------------------------* + * create_IDCT_N_Matrix() + * + * inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in + * RAM from a quantized compressed ROM format + *-------------------------------------------------------------------*/ + +void create_IDCT_N_Matrix( + float *inv_matrixFloatQ, /* i/o: RAM buffer */ + const int16_t N, /* i : DCT length, number of time samples */ + const int16_t n_cols, /* i : number of dct coeffs (as DCT may be truncated) */ + const int16_t alloc_size /* i : RAM buffer size in elements */ +) { int16_t c, c1, r, r_flip, W16_val; int16_t len; @@ -2613,4 +2642,6 @@ void create_IDCT_N_Matrix( float *inv_matrixFloatQ, const int16_t N, const int16 #undef WMC_TOOL_SKIP } } + + return; } diff --git a/lib_com/prot.h b/lib_com/prot.h index e6f371c468..313a35d425 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -520,28 +520,32 @@ void push_next_bits( ); #ifdef IND_LIST_DYN -int16_t get_ivas_max_num_indices( /* o : maximum number of indices */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +/*! r: maximum number of indices */ +int16_t get_ivas_max_num_indices( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); -int16_t get_core_max_num_indices( /* o : maximum number of indices */ - const int16_t core, /* i : core */ - const int32_t total_brate /* i : total bitrate */ +/*! r: maximum number of indices */ +int16_t get_core_max_num_indices( + const int16_t core, /* i : core */ + const int32_t total_brate /* i : total bitrate */ ); -int16_t get_BWE_max_num_indices( /* o : maximum number of indices */ - const int32_t extl_brate /* i : extensiona layer bitrate */ +/*! r: maximum number of indices */ +int16_t get_BWE_max_num_indices( + const int32_t extl_brate /* i : extensiona layer bitrate */ ); -int16_t get_ivas_max_num_indices_metadata( /* o : maximum number of indices for metadata */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ +/*! r: maximum number of indices */ +int16_t get_ivas_max_num_indices_metadata( + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ind_list_realloc( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ); ivas_error check_ind_list_limits( @@ -554,16 +558,18 @@ ivas_error move_indices( const int16_t nb_indices /* i : number of moved indices */ ); -int16_t find_indice( /* o : index of the indice in the list, -1 if not found */ - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ - int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ +/*! r: index of the indice in the list, -1 if not found */ +int16_t find_indice( + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + const int16_t id, /* i : ID of the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ ); -uint16_t delete_indice( /* o : number of deleted indices */ - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - int16_t id /* i : ID of the indice */ +/*! r: number of deleted indices */ +uint16_t delete_indice( + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t id /* i : ID of the indice */ ); #endif @@ -3078,9 +3084,8 @@ void lsf_enc( float *lsp_mid, /* i : mid-frame LSP vector */ float *Aq, /* o : quantized A(z) for 4 subframes */ const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ - , - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + const int16_t GSC_IVAS_mode, /* i : GSC IVAS mode */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); void isf_enc_amr_wb( @@ -3877,12 +3882,10 @@ void bw_detect( Encoder_State *st, /* i/o: Encoder State */ const float signal_in[], /* i : input signal */ float *spectrum, /* i : MDCT spectrum */ - const float *enerBuffer /* i : energy buffer */ - , - const int16_t mct_on /* i : flag MCT mode */ + const float *enerBuffer, /* i : energy buffer */ + const int16_t mct_on /* i : flag MCT mode */ ); - void set_bw( const int16_t element_mode, /* i : element mode */ const int32_t element_brate, /* i : element bitrate */ @@ -4554,9 +4557,8 @@ ivas_error acelp_core_dec( const int32_t last_element_brate, /* i : last element bitrate */ const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ - , - const int16_t read_sid_info /* i : read SID info flag */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const int16_t read_sid_info /* i : read SID info flag */ ); void bass_psfilter_init( @@ -4629,16 +4631,15 @@ void swb_CNG_dec( ); void lsf_dec( - Decoder_State *st, /* i/o: State structure */ - const int16_t tc_subfr, /* i : TC subframe index */ - float *Aq, /* o : quantized A(z) for 4 subframes */ - int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ - float *lsf_new, /* o : de-quantized LSF vector */ - float *lsp_new, /* o : de-quantized LSP vector */ - float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ - const int16_t tdm_low_rate_mode /* i : secondary channel low rate mode flag */ - , - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + Decoder_State *st, /* i/o: State structure */ + const int16_t tc_subfr, /* i : TC subframe index */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + float *lsf_new, /* o : de-quantized LSF vector */ + float *lsp_new, /* o : de-quantized LSP vector */ + float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); void isf_dec_amr_wb( @@ -8102,19 +8103,18 @@ int16_t enc_lsf_tcxlpc( ); void msvq_enc( - const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ - const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ - const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ - const float u[], /* i : Vector to be encoded (prediction and mean removed) */ - const int16_t *levels, /* i : Number of levels in each stage */ - const int16_t maxC, /* i : Tree search size (number of candidates kept from */ - /* one stage to the next == M-best) */ + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const float u[], /* i : Vector to be encoded (prediction and mean removed) */ + const int16_t *levels, /* i : Number of levels in each stage */ + const int16_t maxC, /* i : Tree search size (number of candidates kept from one stage to the next == M-best) */ const int16_t stages, /* i : Number of stages */ const float w[], /* i : Weights */ const int16_t N, /* i : Vector dimension */ const int16_t maxN, /* i : Codebook dimension */ - const int16_t applyDCT_flag, /* i : applyDCT flag */ - float *invTrfMatrix, /* i:/o expanded synthesis matrix */ + const int16_t applyDCT_flag, /* i : applyDCT flag */ + float *invTrfMatrix, /* i/o: expanded synthesis matrix */ int16_t Idx[] /* o : Indices */ ); @@ -8126,77 +8126,79 @@ void msvq_dec( const int16_t N, /* i : Vector dimension */ const int16_t maxN, /* i : Codebook dimension */ const int16_t Idx[], /* i : Indices */ - const int16_t applyIDCT_flag, /* i : applyIDCT flag */ - const float *invTrfMatrix, /* i: synthesis matrix */ + const int16_t applyIDCT_flag, /* i : applyIDCT flag */ + const float *invTrfMatrix, /* i : synthesis matrix */ float *uq, /* o : quantized vector */ Word16 *uq_ind /* o : quantized vector (fixed point) */ ); void dec_FDCNG_MSVQ_stage1( - int16_t j_full, /* i: index full range */ - int16_t n, /* i: dimension to generate */ - const float *invTrfMatrix, /* i: synthesis matrix */ - DCTTYPE idcttype, /* i: idct type */ - float *uq, /* o: synthesized stage1 vector */ - Word16 *uq_ind /* o: synthesized stage1 vector in BASOP */ + int16_t j_full, /* i : index full range */ + int16_t n, /* i : dimension to generate */ + const float *invTrfMatrix, /* i : IDCT matrix for synthesis */ + const DCTTYPE idcttype, /* i : specify which IDCT */ + float *uq, /* o : synthesized stage1 vector */ + Word16 *uq_ind /* o : synthesized stage1 vector in BASOP */ ); void create_IDCT_N_Matrix( - float *inv_matrixFloatQ, /* i/o: RAM buffer */ - const int16_t N, /* i: DCT length , number of time samples */ - const int16_t n_cols, /* i: number of dct coeffs (as DCT may be truncated) */ - const int16_t alloc_size /* i: RAM buffer size in elements*/ + float *inv_matrixFloatQ, /* i/o: RAM buffer */ + const int16_t N, /* i : DCT length, number of time samples */ + const int16_t n_cols, /* i : number of dct coeffs (as DCT may be truncated) */ + const int16_t alloc_size /* i : RAM buffer size in elements */ ); - void dctT2_N_apply_matrix( - const float *input, /* i: input in fdcng or DCT(fdcng) domain */ - float *output, /* o: output in DCT(fdcng) or fdcng ordomain */ - const int16_t dct_dim, /* i: dct processing dim possibly truncated */ - int16_t fdcngvq_dim, /* i: fdcng domain length */ - const float *idctT2_N_16matrixQ16, /* i: IDCT matrix */ - const int16_t matrix_1st_dim, /* i: */ - DCTTYPE dcttype ); /* i: matrix operation type */ - -void extend_dctN_input( - const float *input, /* i: input in fdcng domain */ - const float *dct_input, /* i: input in dctN(fdcng) domain */ - const int16_t in_dim, /* i: in_dim==N */ - float *ext_sig, /* o: extended output in fdcng domain */ - const int16_t out_dim, /* i: output total dim */ - float *matrix, /* i: idct matrix of size N rows , n_cols columns*/ - const int16_t n_cols, /* i: number of columns == truncation length */ - DCTTYPE dcttype ); /* i: matrix type */ - -int16_t msvq_stage1_dct_search( /* o : (p_max , best candidate sofar ) */ - const float *u, /* i : target */ - const int16_t N, /* i : target length and IDCT synthesis length */ - const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ - const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ - const int16_t max_dct_trunc, /* i: maximum of truncation lenghts */ - float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ - const float *midQ_truncQ, /* i: midQ vector */ - const float *dct_invScaleF, /* i: global inv scale factors*/ - const float *dct_scaleF, /* i: global scale factors*/ - const Word16 n_segm, /* i: number of segments */ - const Word16 *cols_per_segment, /* i: remaining length per segment */ - const Word16 *trunc_dct_cols_per_segment, /* i: trunc length per segment */ - const Word16 *entries_per_segment, /* i: number of rows per segment */ - const Word16 *cum_entries_per_segment, /* i: number of cumulative entries */ - const Word8 *const W8Qx_dct_sections[], /*i: Word8(byte) segment table ptrs */ - const Word16 *col_syn_shift[], /*i: columnwise syn shift tables */ - const Word8 *segm_neighbour_fwd, /*i: circular neighbour list fwd */ - const Word8 *segm_neighbour_rev, /*i: circular neighbour list reverse */ - const Word16 npost_check, /*i: number of neigbours to check , should be even */ - float *st1_mse_ptr, /*i: dynRAM buffer for MSEs */ - int16_t *indices_st1_local, /*o: selected cand indices */ - float *st1_syn_vec_ptr, /*i/o: buffer for IDCT24 synthesis */ - float *dist1_ptr /*o: resulting stage 1 MSEs in DCT-N domain */ + const float *input, /* i : input in fdcng or DCT(fdcng) domain */ + float *output, /* o : output in DCT(fdcng) or fdcng ordomain */ + const int16_t dct_dim, /* i : dct processing dim possibly truncated */ + int16_t fdcngvq_dim, /* i : fdcng domain length */ + const float *matrix, /* i : IDCT matrix */ + const int16_t matrix_row_dim, /* i : */ + const DCTTYPE dcttype /* i : matrix operation type */ ); +void extend_dctN_input( + const float *input, /* i : input in fdcng domain */ + const float *dct_input, /* i : input in dctN(fdcng) domain */ + const int16_t in_dim, /* i : in_dim == N */ + float *ext_sig, /* o : extended output in fdcng domain */ + const int16_t out_dim, /* i : output total dim */ + float *matrix, /* i : idct synthesis matrix N rows, n_cols columns */ + const int16_t n_cols, /* i : number of columns == DCT truncation length */ + const DCTTYPE dcttype /* i : matrix operation type */ +); + +/*! r: (p_max , best candidate sofar ) */ +int16_t msvq_stage1_dct_search( + const float *u, /* i : target */ + const int16_t N, /* i : target length and IDCT synthesis length */ + const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ + const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ + const int16_t max_dct_trunc, /* i : maximum of truncation lenghts */ + float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ + const float *midQ_truncQ, /* i : midQ vector */ + const float *dct_invScaleF, /* i : global inv scale factors */ + const float *dct_scaleF, /* i : global scale factors */ + const Word16 n_segm, /* i : number of segments */ + const Word16 *cols_per_segment, /* i : remaining length per segment */ + const Word16 *trunc_dct_cols_per_segment, /* i : trunc length per segment */ + const Word16 *entries_per_segment, /* i : number of rows per segment */ + const Word16 *cum_entries_per_segment, /* i : number of cumulative entries */ + const Word8 *const W8Qx_dct_sections[], /* i : Word8(byte) segment table ptrs */ + const Word16 *col_syn_shift[], /* i : columnwise syn shift tables */ + const Word8 *segm_neighbour_fwd, /* i : circular neighbour list fwd */ + const Word8 *segm_neighbour_rev, /* i : circular neighbour list reverse */ + const Word16 npost_check, /* i : number of neigbours to check , should be even */ + float *st1_mse_ptr, /* i : dynRAM buffer for MSEs */ + int16_t *indices_st1_local, /* o : selected cand indices */ + float *st1_syn_vec_ptr, /* i/o: buffer for IDCT24 synthesis */ + float *dist1_ptr /* o : resulting stage 1 MSEs in DCT-N domain */ +); + +/*! r: (updated p_max) */ int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( - /* o : (updated p_max) */ const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */ const float *u, /* i : target signal */ const int16_t maxC_st1, /* i : number of candidates in stage1 */ @@ -8344,9 +8346,8 @@ void lsf_end_dec( float *qlsf, /* o : quantized LSFs in the cosine domain */ int16_t *lpc_param, /* i : LPC parameters */ int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ - int16_t *nb_indices /* o : number of indices */ - , - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + int16_t *nb_indices, /* o : number of indices */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); ivas_error find_pred_mode( diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index eb2e84f598..8d5e9de34d 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -74,9 +74,8 @@ ivas_error acelp_core_dec( const int32_t last_element_brate, /* i : last element bitrate */ const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ - STEREO_CNG_DEC_HANDLE hStereoCng /* i : stereo CNG handle */ - , - const int16_t read_sid_info /* i : read SID info flag */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ + const int16_t read_sid_info /* i : read SID info flag */ ) { float old_exc[L_EXC_DEC], *exc; /* excitation signal buffer */ diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 33004c540c..9bf4762ecd 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -367,10 +367,9 @@ ivas_error ivas_dirac_dec_output_synthesis_open( *------------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_init( - DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ - const int16_t nchan_out_woLFE /* i : number of output audio channels without LFE */ - , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ + const int16_t nchan_out_woLFE, /* i : number of output audio channels without LFE */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { int16_t size; @@ -560,12 +559,10 @@ void ivas_dirac_dec_output_synthesis_process_slot( const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ - const int16_t nchan_transport /* i : number of transport channels*/ + const int16_t nchan_transport, /* i : number of transport channels*/ #if defined( JBM_TSM_ON_TCS ) - , - const int16_t md_idx + const int16_t md_idx, #endif - , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { @@ -680,118 +677,118 @@ void ivas_dirac_dec_output_synthesis_process_slot( } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { + { - /* compute direct responses */ + /* compute direct responses */ #ifdef JBM_TSM_ON_TCS - ivas_dirac_dec_compute_directional_responses( hDirAC, - hVBAPdata, - NULL, - azimuth, - elevation, - md_idx, - NULL, - sh_rot_max_order, - p_Rmat, - hodirac_flag ); + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + NULL, + azimuth, + elevation, + md_idx, + NULL, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); #endif - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); - /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + { + int16_t k; + if ( ch_idx != 0 ) { - int16_t k; - if ( ch_idx != 0 ) - { - float a, b, c; + float a, b, c; - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); - } + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); } - else + for ( ; k < num_freq_bands; k++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); - } + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); } } - - /*Directional gain (panning)*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) - { - v_mult( h_dirac_output_synthesis_state->direct_power_factor, - &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], - aux_buf, - num_freq_bands ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - num_freq_bands ); - } - - /*Diffuse gain*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + else { - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - hDirAC->diffuse_response_function[ch_idx], - aux_buf, - num_freq_bands_diff ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - num_freq_bands_diff ); + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } } + } - return; + /*Directional gain (panning)*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) + { + v_mult( h_dirac_output_synthesis_state->direct_power_factor, + &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], + aux_buf, + num_freq_bands ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); } - else + + /*Diffuse gain*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) { - /* compute reference and diffuse power factor for this frame */ - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + aux_buf, + num_freq_bands_diff ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); } + + return; + } + else + { + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); } + } diff_start_band = 0; if ( h_dirac_output_synthesis_params->use_onset_filters ) @@ -1841,9 +1838,8 @@ void ivas_dirac_dec_compute_directional_responses( #endif const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ - const float *p_Rmat /* i : rotation matrix */ - , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + const float *p_Rmat, /* i : rotation matrix */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { int16_t k, l; diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index fe98ca0dcb..e6e0037e2c 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -389,8 +389,7 @@ static ivas_error ivas_ism_bitrate_switching( *-------------------------------------------------------------------------*/ ivas_error ivas_ism_dec_config( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ - , + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const ISM_MODE last_ism_mode /* i/o: last ISM mode */ #ifdef JBM_TSM_ON_TCS , diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index da4ce92107..18d0a0cc9e 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -50,9 +50,8 @@ *-----------------------------------------------------------------------*/ static void ivas_param_ism_dec_dequant_DOA( - DIRAC_DEC_HANDLE hDirAC /* i/o: decoder DirAC handle */ - , - const int16_t nchan_ism /* i : number of ISM channels */ + DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ + const int16_t nchan_ism /* i : number of ISM channels */ ) { int16_t i; diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index cfd748afde..3745718470 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -138,9 +138,8 @@ static int16_t read_coherence_data_hr_512( uint16_t *bitstream, int16_t *p_bit_p int16_t ivas_qmetadata_dec_decode( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ uint16_t *bitstream, /* i : bitstream */ - int16_t *index /* i/o: bitstream position */ - , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ + int16_t *index, /* i/o: bitstream position */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { int16_t d, b, m; diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 478749ddc0..a1995b53bf 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -311,9 +311,7 @@ ivas_error ivas_sba_dec_reconfigure( #ifndef SBA_MODE_CLEAN_UP st_ivas->sba_mode, #endif - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) - - ) ) != IVAS_ERR_OK ) + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index f3fd5ed04c..bce6fb910a 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -809,10 +809,7 @@ static void ivas_spar_dec_MD( if ( st0->m_old_frame_type == ZERO_FRAME && ivas_total_brate == IVAS_SID_5k2 && st0->prev_bfi == 0 && hSpar->hMdDec->spar_md_cfg.nchan_transport == 1 ) { - ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out - - , - num_md_sub_frames ); + ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out, num_md_sub_frames ); } else { @@ -823,8 +820,7 @@ static void ivas_spar_dec_MD( { if ( !bfi ) { - ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out, - num_md_sub_frames ); + ivas_spar_smooth_md_dtx( hSpar->hMdDec, num_bands_out, num_md_sub_frames ); } set_s( hSpar->hMdDec->valid_bands, 0, IVAS_MAX_NUM_BANDS ); diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 03f014ecfd..8fd477b391 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -83,12 +83,14 @@ static ivas_error ivas_spar_set_dec_config( ivas_spar_md_dec_state_t *hMdDec, co static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decoder_State *st, const int16_t bw, const int16_t num_bands, int16_t *num_dmx_per_band, int16_t *num_dec_per_band ); static ivas_error ivas_deindex_real_index( const int16_t *index, const int16_t q_levels, const float min_value, const float max_value, float *quant, const int16_t num_ch_dim2 ); + #ifdef FIX_501_TABLE_IDX_INIT static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode, const int32_t last_active_brate ); #else static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode ); #endif + /*------------------------------------------------------------------------- * ivas_spar_md_dec_matrix_open() * @@ -97,8 +99,7 @@ static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder static ivas_error ivas_spar_md_dec_matrix_open( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_channels /* i : number of internal channels */ - , + const int16_t num_channels, /* i : number of internal channels */ const int16_t num_md_sub_frames ) { int16_t i, j; @@ -680,13 +681,14 @@ void ivas_spar_md_dec_process( ivas_spar_md_dec_state_t *hMdDec; int16_t num_md_chs; int16_t num_md_sub_frames; + int16_t active_w_vlbr; hMdDec = st_ivas->hSpar->hMdDec; - int16_t active_w_vlbr; active_w_vlbr = ( st_ivas->hDecoderConfig->ivas_total_brate < IVAS_24k4 ) ? 1 : 0; num_md_chs = ivas_sba_get_nchan_metadata( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); + num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( sba_order, st_ivas->hDecoderConfig->ivas_total_brate ); @@ -703,10 +705,7 @@ void ivas_spar_md_dec_process( char f_name[100]; int16_t num_bands = nB; int16_t num_subframes = 1, num_block_groups = 1, num_elements = 1, byte_size = sizeof( float ); - int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order - , - st_ivas->hDecoderConfig->ivas_total_brate - ); + int16_t num_ch = ivas_sba_get_nchan_metadata( sba_order , st_ivas->hDecoderConfig->ivas_total_brate ); for ( b = 0; b < num_bands; b++ ) { sprintf( f_name, "spar_band_pred_coeffs_dec.bin" ); @@ -998,11 +997,7 @@ void ivas_spar_md_dec_process( } } - ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, - num_md_chs, - active_w_vlbr - - ); + ivas_get_spar_matrices( hMdDec, num_bands_out, num_md_sub_frames, bw, dtx_vad, nB, num_md_chs, active_w_vlbr ); #ifdef DEBUG_SPAR_DIRAC_WRITE_OUT_PRED_PARS { @@ -1024,9 +1019,7 @@ void ivas_spar_md_dec_process( hMdDec->valid_bands[b] = 1; } - ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, - num_md_chs, - num_md_sub_frames ); + ivas_spar_md_fill_invalid_bands( &hMdDec->spar_coeffs, &hMdDec->spar_coeffs_prev, &hMdDec->valid_bands[0], &hMdDec->base_band_age[0], num_bands_out, num_md_chs, num_md_sub_frames ); hMdDec->dtx_md_smoothing_cntr = 1; @@ -1044,10 +1037,9 @@ void ivas_spar_md_dec_process( /* NOTE: No changes here as DTX only operates below 160kbps */ #endif void ivas_spar_smooth_md_dtx( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_bands_out /* i : number of output bands */ - , - const int16_t num_md_sub_frames /* i : number of metadata subframes */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ ) { int16_t j, k, b, dmx_ch; @@ -1121,10 +1113,9 @@ void ivas_spar_smooth_md_dtx( *-----------------------------------------------------------------------------------------*/ void ivas_spar_setup_md_smoothing( - ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ - const int16_t num_bands_out /* i : number of output bands */ - , - const int16_t num_md_sub_frames /* i : number of metadata subframes */ + ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t num_md_sub_frames /* i : number of metadata subframes */ ) { /* copy the coeffs */ @@ -1176,8 +1167,7 @@ void ivas_spar_setup_md_smoothing( } } - ivas_spar_smooth_md_dtx( hMdDec, num_bands_out, - num_md_sub_frames ); + ivas_spar_smooth_md_dtx( hMdDec, num_bands_out, num_md_sub_frames ); return; } @@ -1642,8 +1632,7 @@ void ivas_spar_dec_gen_umx_mat( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t nchan_transport, /* i : number of transport channels */ const int16_t num_bands_out, /* i : number of output bands */ - const int16_t bfi /* i : bad frame indicator */ - , + const int16_t bfi, /* i : bad frame indicator */ const int16_t num_md_sub_frames ) { int16_t i, j, b, i_ts, num_out_ch; @@ -1711,8 +1700,7 @@ void ivas_spar_dec_gen_umx_mat( #endif } - ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi, - num_md_sub_frames ); + ivas_spar_dec_compute_ramp_down_post_matrix( hMdDec, num_bands_out, bfi, num_md_sub_frames ); return; } @@ -1823,7 +1811,6 @@ static void ivas_spar_dec_parse_md_bs( ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band ); - #ifdef FIX_501_TABLE_IDX_INIT if ( last_active_brate >= IVAS_24k4 ) { @@ -1835,6 +1822,7 @@ static void ivas_spar_dec_parse_md_bs( } bw_fact = *bands_bw / bw_final; #endif + for ( i = *nB - 1; i >= 0; i-- ) { #ifdef FIX_501_TABLE_IDX_INIT @@ -2246,6 +2234,7 @@ static void ivas_decode_arith_bs( ivas_get_band_idx_from_differential( &hMdDec->spar_md, hMdDec->spar_md_cfg.quant_strat->P_r.q_levels, 1, nB, DECD_COEFF ); ivas_get_band_idx_from_differential( &hMdDec->spar_md, hMdDec->spar_md_cfg.quant_strat->P_c.q_levels, 0, nB, DECX_COEFF ); } + return; } @@ -2899,9 +2888,8 @@ void ivas_spar_to_dirac( Decoder_Struct *st_ivas, ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ const int16_t dtx_vad, /* i : DTX frame flag */ - const int16_t num_bands_out /* i : number of output bands */ - , - const int16_t bw /* i : band joining factor */ + const int16_t num_bands_out, /* i : number of output bands */ + const int16_t bw /* i : band joining factor */ ) { DIRAC_DEC_HANDLE hDirAC; diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 5c2d0b37e6..43fdcb49aa 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1133,7 +1133,7 @@ void stereo_dft_dec( const int16_t nchan_transport /* i : number of transpor channels */ #ifdef FIX_STEREO_474 , - const int16_t num_md_sub_frames /* i: number of MD subframes */ + const int16_t num_md_sub_frames /* i : number of MD subframes */ #endif ) { diff --git a/lib_dec/lsf_dec.c b/lib_dec/lsf_dec.c index 73f8933daf..9db7119aa2 100644 --- a/lib_dec/lsf_dec.c +++ b/lib_dec/lsf_dec.c @@ -64,16 +64,15 @@ static void dqlsf_CNG( Decoder_State *st, float *lsf_q ); *---------------------------------------------------------------------*/ void lsf_dec( - Decoder_State *st, /* i/o: State structure */ - const int16_t tc_subfr, /* i : TC subframe index */ - float *Aq, /* o : quantized A(z) for 4 subframes */ - int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ - float *lsf_new, /* o : de-quantized LSF vector */ - float *lsp_new, /* o : de-quantized LSP vector */ - float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ - const int16_t tdm_low_rate_mode /* i : secondary channel low rate mode flag */ - , - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + Decoder_State *st, /* i/o: State structure */ + const int16_t tc_subfr, /* i : TC subframe index */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + float *lsf_new, /* o : de-quantized LSF vector */ + float *lsp_new, /* o : de-quantized LSP vector */ + float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ + const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ) { int16_t i, nBits, coder_type, no_param_lpc; @@ -258,9 +257,8 @@ void lsf_end_dec( float *qlsf, /* o : quantized LSFs in the cosine domain */ int16_t *lpc_param, /* i : LPC parameters */ int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ - int16_t *nb_indices /* o : number of indices */ - , - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + int16_t *nb_indices, /* o : number of indices */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ) { float pred0[M]; /* Prediction for the safety-net quantizer (usually mean)*/ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 5aa872e434..904d6de51e 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -692,12 +692,11 @@ void computeReferencePower_enc( const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ #ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode /* i : SBA mode */ + const SBA_MODE sba_modem, /* i : SBA mode */ #else const IVAS_FORMAT ivas_format, /* i : ivas_format */ - int16_t ref_power_w /* i : use 0 if hodirac is enabled */ + int16_t ref_power_w, /* i : use 0 if hodirac is enabled */ #endif - , const int16_t nchan_ana /* i : number of analysis channels */ ) { @@ -730,6 +729,7 @@ void computeReferencePower_enc( } v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); + #ifndef SBA_MODE_CLEAN_UP if ( sba_mode == SBA_MODE_SPAR ) #else diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 61c4ccaef9..ec7c1acb0b 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -66,8 +66,7 @@ ivas_error ivas_spar_covar_enc_open( ivas_enc_cov_handler_state_t **hCovEnc, /* i/o: SPAR Covar. encoder handle */ ivas_filterbank_t *pFb, /* i/o: FB handle */ const int32_t input_Fs, /* i : input sampling rate */ - const int16_t nchan_inp /* i : number of input channels */ - , + const int16_t nchan_inp, /* i : number of input channels */ #ifdef FIX_489_COV_SMOOTHING COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ #endif diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 006fb176fb..137f6ba846 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -328,10 +328,7 @@ ivas_error ivas_init_encoder( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ #ifndef IND_LIST_DYN , - Indice ind_list[][MAX_NUM_INDICES] /* o : bitstream indices */ -#endif -#ifndef IND_LIST_DYN - , + Indice ind_list[][MAX_NUM_INDICES], /* o : bitstream indices */ Indice ind_list_metadata[][MAX_BITS_METADATA] /* o : bitstream indices metadata */ #endif ) diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index c5ee2950db..8582718730 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -735,13 +735,11 @@ static void ivas_mc_paramupmix_param_est_enc( float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float rxx, rxy, ryy, cmat, rxxest, drxx, wetaux; - int16_t l_ts; int16_t b, i, j, ts, bnd; #ifdef FIX_468_16KHZ_PUPMIX int16_t maxbands; #endif - int16_t transient_det[MC_PARAMUPMIX_COMBINATIONS][2]; int16_t transient_det_l[2], transient_det_r[2]; int16_t chan1s[4] = { 4, 5, 8, 9 }; @@ -758,6 +756,7 @@ static void ivas_mc_paramupmix_param_est_enc( /*-----------------------------------------------------------------------------------------* * Transient detector *-----------------------------------------------------------------------------------------*/ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { ivas_transient_det_process( hMCParamUpmix->hTranDet[2 * i], pcm_in[2 * i], input_frame, transient_det_l ); @@ -785,8 +784,10 @@ static void ivas_mc_paramupmix_param_est_enc( { ivas_fb_mixer_get_windowed_fr( hMCParamUpmix->hFbMixer, pcm_in, pp_in_fr_real, pp_in_fr_imag, l_ts, l_ts, hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hMCParamUpmix->hFbMixer, pcm_in, l_ts, hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) { pcm_in[i] += l_ts; @@ -798,14 +799,17 @@ static void ivas_mc_paramupmix_param_est_enc( /*-----------------------------------------------------------------------------------------* * Covariance process *-----------------------------------------------------------------------------------------*/ + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) { pp_in_fr_real[0] = p_fr_realbuffer[2 * b]; pp_in_fr_imag[0] = p_fr_imagbuffer[2 * b]; pp_in_fr_real[1] = FR_Real_Mid; pp_in_fr_imag[1] = FR_Imag_Mid; + v_add( pp_in_fr_real[0], p_fr_realbuffer[2 * b + 1], pp_in_fr_real[1], L_FRAME48k ); v_add( pp_in_fr_imag[0], p_fr_imagbuffer[2 * b + 1], pp_in_fr_imag[1], L_FRAME48k ); + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) { for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) @@ -814,8 +818,10 @@ static void ivas_mc_paramupmix_param_est_enc( cov_dtx_real[i][j] = hMCParamUpmix->cov_dtx_real[b][i][j]; } } + ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind ); } + #ifdef FIX_468_16KHZ_PUPMIX maxbands = hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands; for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) @@ -841,6 +847,7 @@ static void ivas_mc_paramupmix_param_est_enc( betas[b][bnd] = (float) 2.0 * wetaux; } } + #ifdef FIX_468_16KHZ_PUPMIX if ( maxbands < IVAS_MAX_NUM_BANDS ) { @@ -854,5 +861,6 @@ static void ivas_mc_paramupmix_param_est_enc( } } #endif + return; } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 213c0ce756..2a358730d0 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -155,10 +155,9 @@ static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaD *-----------------------------------------------------------------------*/ ivas_error ivas_qmetadata_enc_encode( - BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ - IVAS_QMETADATA *hQMetaData /* i/o: metadata handle */ - , - const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ + BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ + IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ + const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode*/ ) { int16_t i, bit_pos_start, bit_pos_start_coh; diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 28b954c841..97d427a319 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -956,11 +956,7 @@ static ivas_error configureEncoder( if ( ( error = ivas_init_encoder( st_ivas #ifndef IND_LIST_DYN , - hIvasEnc->ind_list -#endif -#ifndef IND_LIST_DYN - , - hIvasEnc->ind_list_metadata + hIvasEnc->ind_list, hIvasEnc->ind_list_metadata #endif ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/lsf_enc.c b/lib_enc/lsf_enc.c index 66f8847608..968a9a0d25 100644 --- a/lib_enc/lsf_enc.c +++ b/lib_enc/lsf_enc.c @@ -82,9 +82,8 @@ void lsf_enc( float *lsp_mid, /* i/o: mid-frame LSP vector */ float *Aq, /* o : quantized A(z) for 4 subframes */ const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const int16_t GSC_IVAS_mode /* i : GSC IVAS mode */ - , - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + const int16_t GSC_IVAS_mode, /* i : GSC IVAS mode */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ) { int16_t i, nBits, force_sf, no_param_lpc; diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c index 9c7bed7629..4c2bcef534 100644 --- a/lib_enc/lsf_msvq_ma_enc.c +++ b/lib_enc/lsf_msvq_ma_enc.c @@ -40,54 +40,54 @@ #include "debug.h" #endif #include "cnst.h" +#include "ivas_prot.h" #include "prot.h" #include "rom_com.h" #include "rom_enc.h" #include "basop_proto_func.h" #include "wmc_auto.h" -#define kMaxC 8 +/*--------------------------------------------------------------------------* + * Local constants + *--------------------------------------------------------------------------*/ -#include "ivas_prot.h" +#define kMaxC 8 -// void dctT2_N_apply_matrix( const float *input, float *output, const int16_t dct_dim, int16_t fdcngvq_dim, const float *idctT2_24_X_matrixQ16, const int16_t matrix_1st_dim, DCTTYPE dcttype ); +/*--------------------------------------------------------------------------* + * msvq_encmsvq_stage1_dct_search() + * + * stage1 search in a segmentwise truncated dct N domain without weights + *--------------------------------------------------------------------------*/ +/*! r: (p_max , best candidate sofar ) */ int16_t msvq_stage1_dct_search( - /* o : (p_max , best candidate sofar ) */ - const float *u, /* i : target */ - const int16_t N, /* i : target length and IDCT synthesis length */ - - /* parameterization of segmented DCT domain storage */ - const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ - - const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ - const int16_t max_dct_trunc, /* i: maximum of truncation lenghts */ - float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ - - const float *midQ_truncQ, /* i: midQ vector */ - const float *dct_invScaleF, /* i: global inv scale factors*/ - const float *dct_scaleF, /* i: global scale factors*/ - const Word16 n_segm, /* i: number of segments */ - const Word16 *cols_per_segment, /* i: remaining length per segment */ - const Word16 *trunc_dct_cols_per_segment, /* i: trunc length per segment */ - const Word16 *entries_per_segment, /* i: number of rows per segment */ - const Word16 *cum_entries_per_segment, /* i: number of cumulative entries */ - - const Word8 *const W8Qx_dct_sections[], /*i: Word8(byte) segment table ptrs */ - const Word16 *col_syn_shift[], /*i: columnwise syn shift tables */ - const Word8 *segm_neighbour_fwd, /*i: circular neighbour list fwd */ - const Word8 *segm_neighbour_rev, /*i: circular neighbour list reverse */ - const Word16 npost_check, /*i: number of neigbours to check , should be even */ - - float *st1_mse_ptr, /*i: dynRAM buffer for MSEs */ - int16_t *indices_st1_local, /*o: selected cand indices */ - float *st1_syn_vec_ptr, /*i/o: buffer for IDCT24 synthesis */ - float *dist1_ptr /*o: resulting stage 1 MSEs in DCT-N domain */ + const float *u, /* i : target */ + const int16_t N, /* i : target length and IDCT synthesis length */ + const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ + const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ + const int16_t max_dct_trunc, /* i : maximum of truncation lenghts */ + float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ + const float *midQ_truncQ, /* i : midQ vector */ + const float *dct_invScaleF, /* i : global inv scale factors */ + const float *dct_scaleF, /* i : global scale factors */ + const Word16 n_segm, /* i : number of segments */ + const Word16 *cols_per_segment, /* i : remaining length per segment */ + const Word16 *trunc_dct_cols_per_segment, /* i : trunc length per segment */ + const Word16 *entries_per_segment, /* i : number of rows per segment */ + const Word16 *cum_entries_per_segment, /* i : number of cumulative entries */ + const Word8 *const W8Qx_dct_sections[], /* i : Word8(byte) segment table ptrs */ + const Word16 *col_syn_shift[], /* i : columnwise syn shift tables */ + const Word8 *segm_neighbour_fwd, /* i : circular neighbour list fwd */ + const Word8 *segm_neighbour_rev, /* i : circular neighbour list reverse */ + const Word16 npost_check, /* i : number of neigbours to check , should be even */ + float *st1_mse_ptr, /* i : dynRAM buffer for MSEs */ + int16_t *indices_st1_local, /* o : selected cand indices */ + float *st1_syn_vec_ptr, /* i/o: buffer for IDCT24 synthesis */ + float *dist1_ptr /* o : resulting stage 1 MSEs in DCT-N domain */ ) -{ /* stage1 search in a segmentwise truncated dct N domain without weights */ - +{ float dct_target[FDCNG_VQ_DCT_MAXTRUNC]; float u_mr[FDCNG_VQ_MAX_LEN]; float u_mr_scaled[FDCNG_VQ_MAX_LEN]; @@ -271,15 +271,20 @@ int16_t msvq_stage1_dct_search( } -/* recalc MSE for fdcng WB(0..20) coeffs , +/*--------------------------------------------------------------------------* + * msvq_stage1_dct_recalc_candidates_fdcng_wb() + * + * recalc MSE for fdcng WB(0..20) coeffs , essentially subtract res21^2 ,res22^2, res23^2 that was included in stage1 MSE in the DCT24 domain truncated search, excludes the waveform contributions at pos 21,22,23 to the MSE, important to keep the WB MSEs update for the subsequent stages -*/ -int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( /* o : (updated p_max) */ - const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */ - const float *u, /* i : target signal */ - const int16_t maxC_st1, /* i : number of candidates in stage1 */ - float *dist_ptr /* i/o: updated MSE vector for stage1 */ + *--------------------------------------------------------------------------*/ + +/*! r: (updated p_max) */ +int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( + const float *st1_syn_vec_ptr, /* i : IDCT24 synthesis vectors */ + const float *u, /* i : target signal */ + const int16_t maxC_st1, /* i : number of candidates in stage1 */ + float *dist_ptr /* i/o: updated MSE vector for stage1 */ ) { int16_t p_max_local, c; @@ -309,20 +314,20 @@ int16_t msvq_stage1_dct_recalc_candidates_fdcng_wb( * * MSVQ encoder *--------------------------------------------------------------------------*/ + void msvq_enc( const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ const float u[], /* i : Vector to be encoded (prediction and mean removed) */ const int16_t *levels, /* i : Number of levels in each stage */ - const int16_t maxC, /* i : Tree search size (number of candidates kept from */ - /* one stage to the next == M-best) */ + const int16_t maxC, /* i : Tree search size (number of candidates kept from one stage to the next == M-best) */ const int16_t stages, /* i : Number of stages */ const float w[], /* i : Weights */ const int16_t N, /* i : Vector dimension */ const int16_t maxN, /* i : Codebook dimension */ - const int16_t applyDCT_flag, /* i : applyDCT flag */ - float *invTrfMatrix, /*i/o : synthesis matrix */ + const int16_t applyDCT_flag, /* i : applyDCT flag */ + float *invTrfMatrix, /* i/o: synthesis matrix */ int16_t Idx[] /* o : Indices */ ) { @@ -463,37 +468,86 @@ void msvq_enc( else /* non-DCT Stage #1 code below */ if ( !s ) /* means: m==1 */ - { - /* This loop is identical to the one below, except, that the inner + { + /* This loop is identical to the one below, except, that the inner loop over c=0..m is hardcoded to c=0, since m=1. */ - /* dist[0][0] */ - for ( j = 0; j < levels[s]; j++ ) + /* dist[0][0] */ + for ( j = 0; j < levels[s]; j++ ) + { + en = 0.0f; + /* w,Tmp */ + /* Compute weighted codebook element and its energy */ + for ( c2 = 0; c2 < n; c2++ ) + { + Tmp[start + c2] = w[start + c2] * cbp[c2]; + en += cbp[c2] * Tmp[start + c2]; + } + cbp += maxn; /* pointer is incremented */ + + pTmp = &resid[0][0]; + /* Tmp */ + tmp = ( *pTmp++ ) * Tmp[0]; + for ( c2 = 1; c2 < N; c2++ ) { - en = 0.0f; - /* w,Tmp */ - /* Compute weighted codebook element and its energy */ - for ( c2 = 0; c2 < n; c2++ ) + tmp += ( *pTmp++ ) * Tmp[c2]; + } + tmp = en - 2.0f * tmp; + tmp += dist[0][0]; + if ( tmp < dist[1][p_max] ) + { + /* Replace worst */ + dist[1][p_max] = tmp; + indices[1][p_max * stages] = j; + parents[p_max] = 0; + + p_max = 0; + for ( c2 = 1; c2 < maxC; c2++ ) { - Tmp[start + c2] = w[start + c2] * cbp[c2]; - en += cbp[c2] * Tmp[start + c2]; + if ( dist[1][c2] > dist[1][p_max] ) + { + p_max = c2; + } } - cbp += maxn; /* pointer is incremented */ + } /* if (tmp <= dist[1][p_max]) */ + } /* for (j=0; j dist[1][p_max] ) - { - p_max = c2; - } - } - } /* if (tmp <= dist[1][p_max]) */ - } /* for(c=0; c Date: Mon, 5 Jun 2023 12:57:44 +0000 Subject: [PATCH 176/381] Temporarily disable be-2-evs-windows -- Ericsson Windows runner to be paused --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d4eea1ab7d..74fd91a604 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -690,7 +690,7 @@ clang-format-check: # --------------------------------------------------------------- # check bitexactness to EVS windows binaries -be-2-evs-windows: +.be-2-evs-windows: # Temporarily disabled -- Ericsson Windows runner used for HL activities which the reduces capacity for this job. To be resumed after selection extends: - .rules-main-push tags: -- GitLab From 5d33d50cd0e508099a43636906477a242498dc23 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 13:02:22 +0000 Subject: [PATCH 177/381] lower the limit for no hysteresis BWD switching; under FIX_529_BWD_ISSUE --- lib_enc/bw_detect.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 8ef000626c..7ef39091c5 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -89,8 +89,7 @@ void bw_detect( bwd_count_wider_bw = BWD_COUNT_WIDER_BW; #ifdef FIX_529_BWD_ISSUE - if ( st->ini_frame > 0 && ( ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate >= IVAS_64k || mct_on ) ) || - ( ivas_format == ISM_FORMAT && st->element_brate >= IVAS_48k ) ) ) + if ( st->ini_frame > 0 && ( st->element_mode == IVAS_CPE_MDCT || ivas_format == ISM_FORMAT ) && ( st->element_brate >= IVAS_48k || mct_on ) ) #else if ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate > IVAS_64k || mct_on ) ) #endif -- GitLab From c8b3caeb0936f8ae76eec821940b60a025c4566f Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Mon, 5 Jun 2023 16:17:42 +0300 Subject: [PATCH 178/381] Combine rotation file readers into rotation_file_reader file --- Workspace_msvc/lib_util.vcxproj | 4 +- apps/decoder.c | 84 ++++++-- apps/renderer.c | 37 +++- lib_util/head_rotation_file_reader.c | 4 + lib_util/head_rotation_file_reader.h | 2 + ...n_file_reader.c => rotation_file_reader.c} | 185 +++++++++++++++--- ...n_file_reader.h => rotation_file_reader.h} | 81 ++++++-- 7 files changed, 327 insertions(+), 70 deletions(-) rename lib_util/{external_orientation_file_reader.c => rotation_file_reader.c} (57%) rename lib_util/{external_orientation_file_reader.h => rotation_file_reader.h} (53%) diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 25aeb8b940..e7ce06e975 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -144,7 +144,6 @@ - @@ -158,6 +157,7 @@ + @@ -168,7 +168,6 @@ - @@ -182,6 +181,7 @@ + diff --git a/apps/decoder.c b/apps/decoder.c index 0d52fed063..794122b98a 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -41,9 +41,10 @@ #include "ism_file_writer.h" #include "ls_custom_file_reader.h" #include "hrtf_file_reader.h" -#include "head_rotation_file_reader.h" #ifdef EXTERNAL_ORIENTATIONS -#include "external_orientation_file_reader.h" +#include "rotation_file_reader.h" +#else +#include "head_rotation_file_reader.h" #endif #ifdef OTR_REFERENCE_VECTOR_TRACKING #include "vector3_pair_file_reader.h" @@ -150,20 +151,20 @@ static void usage_dec( void ); #ifdef FIX_I109_ORIENTATION_TRACKING #ifdef OTR_REFERENCE_VECTOR_TRACKING #ifdef EXTERNAL_ORIENTATIONS -static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ExternalOrientationFileReader *externalOrientationFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #else static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #endif #else /* OTR_REFERENCE_VECTOR_TRACKING */ #ifdef EXTERNAL_ORIENTATIONS -static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, ExternalOrientationFileReader *externalOrientationFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #else static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #endif #endif #else /* FIX_I109_ORIENTATION_TRACKING */ #ifdef EXTERNAL_ORIENTATIONS -static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, ExternalOrientationFileReader *externalOrientationFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); +static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #else static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); #endif @@ -192,16 +193,21 @@ int main( BS_READER_HANDLE hBsReader = NULL; LsCustomFileReader *hLsCustomReader = NULL; hrtfFileReader *hrtfReader = NULL; +#ifdef EXTERNAL_ORIENTATIONS + RotFileReader *headRotReader = NULL; + RotFileReader *externalOrientationFileReader = NULL; +#ifdef FIX_I109_ORIENTATION_TRACKING + RotFileReader *refRotReader = NULL; +#endif +#else HeadRotFileReader *headRotReader = NULL; #ifdef FIX_I109_ORIENTATION_TRACKING HeadRotFileReader *refRotReader = NULL; #endif +#endif #ifdef OTR_REFERENCE_VECTOR_TRACKING Vector3PairFileReader *referenceVectorReader = NULL; #endif /* OTR_REFERENCE_VECTOR_TRACKING */ -#ifdef EXTERNAL_ORIENTATIONS - ExternalOrientationFileReader *externalOrientationFileReader = NULL; -#endif ivas_error error = IVAS_ERR_UNKNOWN; int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; RenderConfigReader *renderConfigReader = NULL; @@ -304,7 +310,11 @@ int main( goto cleanup; } +#ifdef EXTERNAL_ORIENTATIONS + if ( ( error = RotationFileReader_open( arg.headrotTrajFileName, &headRotReader ) ) != IVAS_ERR_OK ) +#else if ( ( error = HeadRotationFileReader_open( arg.headrotTrajFileName, &headRotReader ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError: Can't open head-rotation file %s \n\n", arg.headrotTrajFileName ); goto cleanup; @@ -317,7 +327,11 @@ int main( *------------------------------------------------------------------------------------------*/ if ( arg.enableReferenceRotation ) { +#ifdef EXTERNAL_ORIENTATIONS + if ( ( error = RotationFileReader_open( arg.refrotTrajFileName, &refRotReader ) ) != IVAS_ERR_OK ) +#else if ( ( error = HeadRotationFileReader_open( arg.refrotTrajFileName, &refRotReader ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nError: Can't open reference rotation file %s \n\n", arg.refrotTrajFileName ); goto cleanup; @@ -345,7 +359,7 @@ int main( if ( arg.enableExternalOrientation ) { - if ( ( error = ExternalOrientationFileReader_open( arg.externalOrientationTrajFileName, &externalOrientationFileReader ) ) != IVAS_ERR_OK ) + if ( ( error = RotationFileReader_open( arg.externalOrientationTrajFileName, &externalOrientationFileReader ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError: Can't open external orientation file %s \n\n", arg.externalOrientationTrajFileName ); goto cleanup; @@ -616,13 +630,13 @@ int main( #ifdef FIX_I109_ORIENTATION_TRACKING #ifdef OTR_REFERENCE_VECTOR_TRACKING #ifdef EXTERNAL_ORIENTATIONS - error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, externalOrientationFileReader, hIvasDec, pcmBuf ); + error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); #else error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); #endif #else #ifdef EXTERNAL_ORIENTATIONS - error = decodeG192( arg, hBsReader, headRotReader, refRotReader, externalOrientationFileReader, hIvasDec, pcmBuf ); + error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, hIvasDec, pcmBuf ); #else error = decodeG192( arg, hBsReader, headRotReader, refRotReader, hIvasDec, pcmBuf ); #endif @@ -688,16 +702,21 @@ cleanup: IVAS_DEC_Close( &hIvasDec ); CustomLsReader_close( &hLsCustomReader ); hrtfFileReader_close( &hrtfReader ); +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_close( &headRotReader ); + RotationFileReader_close( &externalOrientationFileReader ); +#ifdef FIX_I109_ORIENTATION_TRACKING + RotationFileReader_close( &refRotReader ); +#endif +#else HeadRotationFileReader_close( &headRotReader ); #ifdef FIX_I109_ORIENTATION_TRACKING HeadRotationFileReader_close( &refRotReader ); #endif +#endif #ifdef OTR_REFERENCE_VECTOR_TRACKING Vector3PairFileReader_close( &referenceVectorReader ); #endif /* OTR_REFERENCE_VECTOR_TRACKING */ -#ifdef EXTERNAL_ORIENTATIONS - ExternalOrientationFileReader_close( &externalOrientationFileReader ); -#endif RenderConfigReader_close( &renderConfigReader ); if ( BS_Reader_Close( &hBsReader ) != IVAS_ERR_OK ) @@ -1558,15 +1577,23 @@ static ivas_error initOnFirstGoodFrame( static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, + +#ifdef EXTERNAL_ORIENTATIONS + RotFileReader *headRotReader, + RotFileReader *externalOrientationFileReader, +#else HeadRotFileReader *headRotReader, +#endif + #ifdef FIX_I109_ORIENTATION_TRACKING +#ifdef EXTERNAL_ORIENTATIONS + RotFileReader *refRotReader, +#else HeadRotFileReader *refRotReader, +#endif #ifdef OTR_REFERENCE_VECTOR_TRACKING Vector3PairFileReader *referenceVectorReader, #endif /* OTR_REFERENCE_VECTOR_TRACKING */ -#endif -#ifdef EXTERNAL_ORIENTATIONS - ExternalOrientationFileReader *externalOrientationFileReader, #endif IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ) @@ -1696,7 +1723,12 @@ static ivas_error decodeG192( if ( ( error = HeadRotationFileReading( refRotReader, &quaternion ) ) != IVAS_ERR_OK ) #endif { - fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) ); + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_getFilePath( refRotReader ) ); +#else + HeadRotationFileReader_getFilePath( refRotReader ) ); +#endif goto cleanup; } @@ -1721,7 +1753,12 @@ static ivas_error decodeG192( if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i] ) ) != IVAS_ERR_OK ) #endif { - fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_getFilePath( headRotReader ) ); +#else + HeadRotationFileReader_getFilePath( headRotReader ) ); +#endif goto cleanup; } } @@ -1732,7 +1769,12 @@ static ivas_error decodeG192( if ( ( error = HeadRotationFileReading( headRotReader, Quaternions, frame ) ) != IVAS_ERR_OK ) #endif { - fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_getFilePath( headRotReader ) ); +#else + HeadRotationFileReader_getFilePath( headRotReader ) ); +#endif goto cleanup; } #endif @@ -1763,7 +1805,7 @@ static ivas_error decodeG192( if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &Quaternions[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError %s while reading external orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), - ExternalOrientationFileReader_getFilePath( externalOrientationFileReader ) ); + RotationFileReader_getFilePath( externalOrientationFileReader ) ); goto cleanup; } } diff --git a/apps/renderer.c b/apps/renderer.c index 460282e7a7..b3a52262ac 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -41,13 +41,14 @@ #include "audio_file_writer.h" #include "cmdl_tools.h" #include "cmdln_parser.h" +#ifdef EXTERNAL_ORIENTATIONS +#include "rotation_file_reader.h" +#else #include "head_rotation_file_reader.h" +#endif #ifdef OTR_REFERENCE_VECTOR_TRACKING #include "vector3_pair_file_reader.h" #endif /* OTR_REFERENCE_VECTOR_TRACKING */ -#ifdef EXTERNAL_ORIENTATIONS -#include "external_orientation_file_reader.h" -#endif #include "hrtf_file_reader.h" #include "ism_file_reader.h" #include "ls_custom_file_reader.h" @@ -545,15 +546,21 @@ int main( char **argv ) { IVAS_REND_HANDLE hIvasRend; +#ifdef EXTERNAL_ORIENTATIONS + RotFileReader *headRotReader = NULL; + RotFileReader *externalOrientationFileReader = NULL; +#else HeadRotFileReader *headRotReader = NULL; +#endif #ifdef FIX_I109_ORIENTATION_TRACKING #ifdef OTR_REFERENCE_VECTOR_TRACKING Vector3PairFileReader *referenceVectorReader = NULL; #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + RotFileReader *referenceRotReader = NULL; +#else HeadRotFileReader *referenceRotReader = NULL; #endif -#ifdef EXTERNAL_ORIENTATIONS - ExternalOrientationFileReader *externalOrientationFileReader = NULL; #endif hrtfFileReader *hrtfFileReader = NULL; IsmPositionProvider *positionProvider; @@ -620,7 +627,11 @@ int main( if ( !isEmptyString( args.headRotationFilePath ) ) { +#ifdef EXTERNAL_ORIENTATIONS + if ( RotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) +#else if ( HeadRotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "Error opening file: %s\n", args.headRotationFilePath ); exit( -1 ); @@ -630,7 +641,11 @@ int main( #ifdef FIX_I109_ORIENTATION_TRACKING if ( !isEmptyString( args.referenceRotationFilePath ) ) { +#ifdef EXTERNAL_ORIENTATIONS + if ( RotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader ) != IVAS_ERR_OK ) +#else if ( HeadRotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "Error opening file: %s\n", args.referenceRotationFilePath ); exit( -1 ); @@ -651,7 +666,7 @@ int main( #ifdef EXTERNAL_ORIENTATIONS if ( !isEmptyString( args.externalOrientationFilePath ) ) { - if ( ExternalOrientationFileReader_open( args.externalOrientationFilePath, &externalOrientationFileReader ) != IVAS_ERR_OK ) + if ( RotationFileReader_open( args.externalOrientationFilePath, &externalOrientationFileReader ) != IVAS_ERR_OK ) { fprintf( stderr, "Error opening file: %s\n", args.externalOrientationFilePath ); exit( -1 ); @@ -1294,15 +1309,21 @@ int main( } AudioFileReader_close( &audioReader ); AudioFileWriter_close( &audioWriter ); +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_close( &headRotReader ); + RotationFileReader_close( &externalOrientationFileReader ); +#else HeadRotationFileReader_close( &headRotReader ); +#endif #ifdef FIX_I109_ORIENTATION_TRACKING #ifdef OTR_REFERENCE_VECTOR_TRACKING Vector3PairFileReader_close( &referenceVectorReader ); #endif /* OTR_REFERENCE_VECTOR_TRACKING */ +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_close( &referenceRotReader ); +#else HeadRotationFileReader_close( &referenceRotReader ); #endif -#ifdef EXTERNAL_ORIENTATIONS - ExternalOrientationFileReader_close( &externalOrientationFileReader ); #endif hrtfFileReader_close( &hrtfFileReader ); IVAS_REND_Close( &hIvasRend ); diff --git a/lib_util/head_rotation_file_reader.c b/lib_util/head_rotation_file_reader.c index 500fdd2b7a..2f653b7b25 100644 --- a/lib_util/head_rotation_file_reader.c +++ b/lib_util/head_rotation_file_reader.c @@ -36,6 +36,8 @@ #include #include "prot.h" +#ifndef EXTERNAL_ORIENTATIONS + struct HeadRotFileReader { FILE *trajFile; @@ -253,3 +255,5 @@ const char *HeadRotationFileReader_getFilePath( return headRotReader->file_path; } + +#endif /* EXTERNAL_ORIENTATIONS */ diff --git a/lib_util/head_rotation_file_reader.h b/lib_util/head_rotation_file_reader.h index d735423e2c..05e27417c9 100644 --- a/lib_util/head_rotation_file_reader.h +++ b/lib_util/head_rotation_file_reader.h @@ -35,6 +35,7 @@ #include "common_api_types.h" +#ifndef EXTERNAL_ORIENTATIONS #define IVAS_MAX_PARAM_SPATIAL_SUBFRAMES 4 @@ -100,4 +101,5 @@ const char *HeadRotationFileReader_getFilePath( ); +#endif /* EXTERNAL_ORIENTATIONS */ #endif /* IVAS_HR_FILE_READER_H */ diff --git a/lib_util/external_orientation_file_reader.c b/lib_util/rotation_file_reader.c similarity index 57% rename from lib_util/external_orientation_file_reader.c rename to lib_util/rotation_file_reader.c index 1fe37c9833..3aac8ddb95 100644 --- a/lib_util/external_orientation_file_reader.c +++ b/lib_util/rotation_file_reader.c @@ -30,13 +30,15 @@ *******************************************************************************************************/ -#include "external_orientation_file_reader.h" +#include "rotation_file_reader.h" #include #include #include #include "prot.h" -struct ExternalOrientationFileReader +#ifdef EXTERNAL_ORIENTATIONS + +struct RotFileReader { FILE *trajFile; int32_t frameCounter; @@ -46,20 +48,20 @@ struct ExternalOrientationFileReader /*-----------------------------------------------------------------------* - * ExternalOrientationFileReader_open() + * RotationFileReader_open() * - * Allocate and initialize external orientation reader + * Allocate and initialize rotation reader *-----------------------------------------------------------------------*/ -ivas_error ExternalOrientationFileReader_open( - char *trajFilePath, /* i : external orientation trajectory file name */ - ExternalOrientationFileReader **externalOrientationReader /* o : ExternalOrientationFileReader handle */ +ivas_error RotationFileReader_open( + char *trajFilePath, /* i : rotation trajectory file name */ + RotFileReader **rotReader /* o : RotFileReader handle */ ) { - ExternalOrientationFileReader *self; + RotFileReader *self; FILE *trajFile; - // Open trajectory file + /* Open trajectory file */ if ( strlen( trajFilePath ) < 1 ) { return IVAS_ERR_FAILED_FILE_OPEN; @@ -72,19 +74,146 @@ ivas_error ExternalOrientationFileReader_open( return IVAS_ERR_FAILED_FILE_OPEN; } - self = malloc( sizeof( ExternalOrientationFileReader ) ); + self = calloc( sizeof( RotFileReader ), 1 ); self->trajFile = trajFile; self->frameCounter = 0; - self->file_path = malloc( ( strlen( trajFilePath ) + 1 ) * sizeof( char ) ); + self->file_path = calloc( sizeof( char ), strlen( trajFilePath ) + 1 ); strcpy( self->file_path, trajFilePath ); self->fileRewind = false; - *externalOrientationReader = self; + *rotReader = self; return IVAS_ERR_OK; } +/*-----------------------------------------------------------------------* + * HeadRotationFileReading() + * + * Read values from the trajectory file + *-----------------------------------------------------------------------*/ + +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error HeadRotationFileReading( + RotFileReader *rotReader, /* i/o: RotFileReader handle */ +#ifdef TD5 + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_POSITION *pPos /* o : listener position */ +#else + IVAS_QUATERNION *pQuaternion /* o : head-tracking data */ +#endif +) +{ + float w, x, y, z; +#ifdef TD5 + float posx, posy, posz; + int32_t read_values; + + posx = 0.0f; + posy = 0.0f; + posz = 0.0f; +#endif + +#ifdef TD5 + read_values = fscanf( rotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); + if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ +#else + if ( 4 != fscanf( rotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) ) +#endif + { + if ( feof( rotReader->trajFile ) ) + { + rewind( rotReader->trajFile ); + rotReader->fileRewind = true; +#ifdef TD5 + return HeadRotationFileReading( rotReader, pQuaternion, pPos ); +#else + return HeadRotationFileReading( rotReader, pQuaternion ); +#endif + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + ( rotReader->frameCounter )++; + + pQuaternion->w = w; + pQuaternion->x = x; + pQuaternion->y = y; + pQuaternion->z = z; +#ifdef TD5 + if ( pPos != NULL ) + { + pPos->x = posx; + pPos->y = posy; + pPos->z = posz; + } +#endif + + return IVAS_ERR_OK; +} + +#else +ivas_error HeadRotationFileReading( + RotFileReader *rotReader, /* i/o: RotFileReader handle */ + IVAS_QUATERNION *Quaternions, /* o : head-tracking data, listener orientation */ +#ifdef TD5 + IVAS_POSITION *Pos /* o : listener position */ +#else + const int32_t frame_dec /* i : decoded frame number */ +#endif +) +{ + uint16_t i; + float w, x, y, z; +#ifdef TD5 + float posx, posy, posz; + int32_t read_values; + + posx = 0.0f; + posy = 0.0f; + posz = 0.0f; +#endif + + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { +#ifdef TD5 + read_values = fscanf( rotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); + if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ +#else + if ( 4 != fscanf( rotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) ) +#endif + { + if ( feof( rotReader->trajFile ) ) + { + rewind( rotReader->trajFile ); + rotReader->fileRewind = true; +#ifdef TD5 + return HeadRotationFileReading( rotReader, Quaternions, Pos ); +#else + return HeadRotationFileReading( rotReader, Quaternions, frame_dec ); +#endif + } + return IVAS_ERR_FAILED_FILE_PARSE; + } + + ( rotReader->frameCounter )++; + + Quaternions[i].w = w; + Quaternions[i].x = x; + Quaternions[i].y = y; + Quaternions[i].z = z; +#ifdef TD5 + Pos[i].x = posx; + Pos[i].y = posy; + Pos[i].z = posz; +#endif + } + + return IVAS_ERR_OK; +} +#endif + + /*-----------------------------------------------------------------------* * ExternalOrientationFileReading() * @@ -92,7 +221,7 @@ ivas_error ExternalOrientationFileReader_open( *-----------------------------------------------------------------------*/ ivas_error ExternalOrientationFileReading( - ExternalOrientationFileReader *externalOrientationReader, /* i/o: ExternalOrientationReader handle */ + RotFileReader *externalOrientationReader, /* i/o: ExternalOrientationReader handle */ IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ @@ -141,43 +270,45 @@ ivas_error ExternalOrientationFileReading( /*-----------------------------------------------------------------------* - * ExternalOrientationFileReader_close() + * RotationFileReader_close() * - * Deallocates memory for the external orientation reader + * Deallocates memory for the rotation reader *-----------------------------------------------------------------------*/ -void ExternalOrientationFileReader_close( - ExternalOrientationFileReader **externalOrientationReader /* i/o: ExternalOrientationFileReader handle */ +void RotationFileReader_close( + RotFileReader **rotReader /* i/o: RotFileReader handle */ ) { - if ( externalOrientationReader == NULL || *externalOrientationReader == NULL ) + if ( rotReader == NULL || *rotReader == NULL ) { return; } - fclose( ( *externalOrientationReader )->trajFile ); - free( ( *externalOrientationReader )->file_path ); - free( *externalOrientationReader ); - *externalOrientationReader = NULL; + fclose( ( *rotReader )->trajFile ); + free( ( *rotReader )->file_path ); + free( *rotReader ); + *rotReader = NULL; return; } /*-----------------------------------------------------------------------* - * ExternalOrientationFileReader_getFilePath() + * HeadRotationFileReader_getFilePath() * * *-----------------------------------------------------------------------*/ -const char *ExternalOrientationFileReader_getFilePath( - ExternalOrientationFileReader *externalOrientationReader /* i/o: ExternalOrientationFileReader handle */ +const char *RotationFileReader_getFilePath( + RotFileReader *rotReader /* i/o: RotFileReader handle */ ) { - if ( externalOrientationReader == NULL ) + if ( rotReader == NULL ) { return NULL; } - return externalOrientationReader->file_path; + return rotReader->file_path; } + +#endif /* EXTERNAL_ORIENTATIONS */ diff --git a/lib_util/external_orientation_file_reader.h b/lib_util/rotation_file_reader.h similarity index 53% rename from lib_util/external_orientation_file_reader.h rename to lib_util/rotation_file_reader.h index 98b5700fb6..0725e5e5d7 100644 --- a/lib_util/external_orientation_file_reader.h +++ b/lib_util/rotation_file_reader.h @@ -30,20 +30,64 @@ *******************************************************************************************************/ -#ifndef IVAS_EXTERNAL_ORIENTATION_FILE_READER_H -#define IVAS_EXTERNAL_ORIENTATION_FILE_READER_H +#ifndef IVAS_ROTATION_FILE_READER_H +#define IVAS_ROTATION_FILE_READER_H #include "common_api_types.h" -typedef struct ExternalOrientationFileReader ExternalOrientationFileReader; +#ifdef EXTERNAL_ORIENTATIONS -ivas_error ExternalOrientationFileReader_open( - char *trajFilePath, /* i : external orientation trajectory file name */ - ExternalOrientationFileReader **externalOrientationReader /* o : ExternalOrientationFileReader handle */ +#define IVAS_MAX_PARAM_SPATIAL_SUBFRAMES 4 + +typedef struct RotFileReader RotFileReader; + +/*-----------------------------------------------------------------------* + * RotationFileReader_open() + * + * Allocate and initialize rotation handle + *-----------------------------------------------------------------------*/ + +ivas_error RotationFileReader_open( + char *trajFilePath, /* i : rotation trajectory file name */ + RotFileReader **rotReader /* o : RotFileReader handle */ +); + +/*-----------------------------------------------------------------------* + * RotationFileReading() + * + * Read values from the trajectory file + *-----------------------------------------------------------------------*/ + +#ifdef FIX_I109_ORIENTATION_TRACKING +ivas_error HeadRotationFileReading( + RotFileReader *rotReader, /* i/o: RotFileReader handle */ +#ifdef TD5 + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_POSITION *pPos /* o : listener position */ +#else + IVAS_QUATERNION *pQuaternion /* o : head-tracking data */ +#endif +); +#else +ivas_error HeadRotationFileReading( + RotFileReader *rotReader, /* i/o: RotFileReader handle */ + IVAS_QUATERNION *Quaternions, /* o : head-tracking data */ +#ifdef TD5 + IVAS_POSITION *Pos /* o : listener position */ +#else + const int32_t frame_dec /* i : decoded frame number */ +#endif ); +#endif + +/*-----------------------------------------------------------------------* + * ExternalOrientationFileReading() + * + * Read values from the trajectory file + *-----------------------------------------------------------------------*/ ivas_error ExternalOrientationFileReading( - ExternalOrientationFileReader *externalOrientationReader, /* i/o: ExternalOrientationReader handle */ + RotFileReader *externalOrientationReader, /* i/o: RotFileReader handle */ IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ @@ -51,13 +95,26 @@ ivas_error ExternalOrientationFileReading( int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is achieved */ ); -void ExternalOrientationFileReader_close( - ExternalOrientationFileReader **externalOrientationReader /* i/o: ExternalOrientationFileReader handle */ +/*-----------------------------------------------------------------------* + * RotationFileReader_close() + * + * Deallocates memory for the rotation handle + *-----------------------------------------------------------------------*/ + +void RotationFileReader_close( + RotFileReader **rotReader /* i/o: RotFileReader handle */ ); -const char *ExternalOrientationFileReader_getFilePath( - ExternalOrientationFileReader *externalOrientationReader /* i/o: ExternalOrientationFileReader handle */ +/*-----------------------------------------------------------------------* + * RotationFileReader_getFilePath() + * + * + *-----------------------------------------------------------------------*/ + +const char *RotationFileReader_getFilePath( + RotFileReader *rotReader /* i/o: RotFileReader handle */ ); -#endif /* IVAS_EXTERNAL_ORIENTATION_FILE_READER_H */ +#endif /* EXTERNAL_ORIENTATIONS */ +#endif /* IVAS_ROTATION_FILE_READER_H */ -- GitLab From 9c79250239013bdcb63c197994332e062157d647 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 15:21:38 +0200 Subject: [PATCH 179/381] avoid double to single point float data type conversions --- lib_enc/ivas_mc_paramupmix_enc.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index c5ee2950db..e50627cedd 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -696,9 +696,9 @@ static void ivas_mc_paramupmix_dmx( for ( l = 0; l < input_frame; l++ ) { /* mid */ - hMCParamUpmix->midside[i][0][l] = ( data_f[chan1s[i]][l] + data_f[chan2s[i]][l] ) * (float) 0.5; + hMCParamUpmix->midside[i][0][l] = ( data_f[chan1s[i]][l] + data_f[chan2s[i]][l] ) * 0.5f; /* side */ - hMCParamUpmix->midside[i][1][l] = ( data_f[chan1s[i]][l] - data_f[chan2s[i]][l] ) * (float) 0.5; + hMCParamUpmix->midside[i][1][l] = ( data_f[chan1s[i]][l] - data_f[chan2s[i]][l] ) * 0.5f; data_f[chanOut[i]][l] = hMCParamUpmix->midside[i][0][l]; } } @@ -831,14 +831,14 @@ static void ivas_mc_paramupmix_param_est_enc( rxy = hMCParamUpmix->cov_real[b][1][0][bnd]; ryy = hMCParamUpmix->cov_real[b][1][1][bnd]; cmat = rxy / ( ryy + EPSILON ); - alphas[b][bnd] = (float) 2.0 * cmat - (float) 1.0; + alphas[b][bnd] = 2.0f * cmat - 1.0f; rxx = hMCParamUpmix->cov_real[b][0][0][bnd]; rxxest = cmat * cmat * ryy; drxx = rxx - rxxest; - drxx = (float) max( drxx, 0.0 ); - wetaux = (float) sqrt( drxx / ( ryy + EPSILON ) ); - betas[b][bnd] = (float) 2.0 * wetaux; + drxx = max( drxx, 0.0f ); + wetaux = sqrtf( drxx / ( ryy + EPSILON ) ); + betas[b][bnd] = 2.0f * wetaux; } } #ifdef FIX_468_16KHZ_PUPMIX @@ -848,8 +848,8 @@ static void ivas_mc_paramupmix_param_est_enc( { for ( bnd = maxbands; bnd < IVAS_MAX_NUM_BANDS; bnd++ ) { - alphas[b][bnd] = 0.0; - betas[b][bnd] = 0.0; + alphas[b][bnd] = 0.0f; + betas[b][bnd] = 0.0f; } } } -- GitLab From baddad0cd7df8ef8d102d66dd8aa60af72a27ff0 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Mon, 5 Jun 2023 15:45:27 +0200 Subject: [PATCH 180/381] unified tags with main --- scripts/config/self_test.prm | 48 ++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 8c1af7bee8..c42fba7501 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -266,7 +266,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 16400 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv2ISM48s.wav_16400_48-48_binaural.tst -// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out +// 1 ISM with metadata at 16.4 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out ../IVAS_cod -ism 1 testv/stvISM1.csv 16400 48 testv/stv1ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1ISM48s.wav_16400_48-48_binaural_room.tst @@ -310,7 +310,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stv2ISM48s.wav bit ../IVAS_dec EXT 48 bit testv/stv2ISM48s.wav_32000_48-48_external.tst -// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out, random FEC at 5% +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, random FEC at 5% ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL_ROOM_IR 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_room_FEC5.tst @@ -318,7 +318,7 @@ ../IVAS_cod -ism 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv 48000 48 testv/stv3ISM48s.wav bit ../IVAS_dec MONO 48 bit testv/stv43ISM48s_48000_48-48_MONO.tst -// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL_ROOM out, random FEC at 5% +// 4 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL ROOM out, random FEC at 5% ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv4ISM48n.wav bit ../IVAS_dec -fec 5 BINAURAL_ROOM_IR 48 bit testv/stv4ISM48n.wav_48000_48-48_DTX_TD_binaural_room_FEC5.tst @@ -326,11 +326,11 @@ ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 48000 48 testv/stv2ISM48s.wav bit ../IVAS_dec -fec 5 BINAURAL 48 bit testv/stv2ISM48s.wav_48000_48-48_binaural_FEC5.tst -// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out, head rotation, random FEC at 5% +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit ../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst -// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out +// 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst @@ -338,7 +338,7 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec 5_1 32 bit testv/stv2ISM48s.wav_64000_48-32_5_1.tst -// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL_ROOM out +// 4 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv4ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv4ISM48s.wav_64000_48-48_binaural_room.tst @@ -496,27 +496,27 @@ ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_stereo.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Subframe.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, reference vector tracking +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst -// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, reference vector tracking in level mode +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst @@ -572,11 +572,11 @@ ../IVAS_cod -sba 1 96000 48 testv/stvFOA48c.wav bit ../IVAS_dec FOA 48 bit testv/stvFOA48c.wav_SBA_96000_48-48_FOA.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst -// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst @@ -658,15 +658,15 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 16400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -fec 5 HOA3 48 bit testv/stv1MASA1TC48c.wav_16400_48-48_HOA3_FEC5.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Subframe.tst -// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst @@ -706,15 +706,15 @@ ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 24400 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec STEREO 48 bit testv/stv1MASA2TC48c.wav_24400_48-48_STEREO.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst -// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation, Orientation tracking +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst @@ -824,7 +824,7 @@ ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst -// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, Headrotation +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst @@ -844,7 +844,7 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_stereo_FEC5.tst -// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out +// Multi-channel 5_1 at 192 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out ../IVAS_cod -mc 5_1 192000 48 testv/stv51MC48c.wav bit ../IVAS_dec BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_192000_48-48_BinauralRoom.tst @@ -852,11 +852,11 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec MONO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_mono.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, head rotation +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst -// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM out, head rotation, Orientation tracking +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, Orientation tracking ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst -- GitLab From db6fead21ba89c89ff260bce408ce4071e309919 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 15:51:46 +0200 Subject: [PATCH 181/381] formal improvements to the Param Upmx MC code --- lib_com/ivas_prot.h | 54 +++++----- lib_com/ivas_rom_com.c | 11 +++ lib_com/ivas_rom_com.h | 7 ++ lib_dec/ivas_dec.c | 2 +- lib_dec/ivas_mc_paramupmix_dec.c | 128 ++++++++++++------------ lib_enc/ivas_mc_paramupmix_enc.c | 163 ++++++++++++++++++------------- lib_enc/ivas_mct_enc.c | 4 +- 7 files changed, 207 insertions(+), 162 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2804668e0f..6e17622406 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3960,7 +3960,8 @@ void ivas_dirac_dec_compute_directional_responses( void ivas_dirac_dec_get_frequency_axis( float *frequency_axis, /* o : array of center frequencies of a real filter bank */ const int32_t output_Fs, /* i : sampling frequency */ - const int16_t num_freq_bands ); /* i : number of frequency bands */ + const int16_t num_freq_bands /* i : number of frequency bands */ +); void calculate_hodirac_sector_parameters( #ifdef FIX_485_STATIC_BUFFERS @@ -3968,55 +3969,50 @@ void calculate_hodirac_sector_parameters( #endif float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector, imaginary part */ - const float beta, /* i : forgetting factor for average filtering */ - const int16_t *band_grouping, /* i : indices of band groups */ - const int16_t N_bands, /* i : number of bands (groups) */ - const int16_t enc_param_start_band, /* i : first band to process */ - float *azi, /* o : array of sector azimuth angles, flat */ - float *ele, /* o : array of sector elevation angles, flat */ - float *diff, /* o : array of sector diffuseness values, flat */ - float *ene /* o : array of sector energy values, flat */ + const float beta, /* i : forgetting factor for average filtering */ + const int16_t *band_grouping, /* i : indices of band groups */ + const int16_t N_bands, /* i : number of bands (groups) */ + const int16_t enc_param_start_band, /* i : first band to process */ + float *azi, /* o : array of sector azimuth angles, flat */ + float *ele, /* o : array of sector elevation angles, flat */ + float *diff, /* o : array of sector diffuseness values, flat */ + float *ene /* o : array of sector energy values, flat */ ); void ivas_mc_paramupmix_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ - float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ - const int16_t input_frame /* i : input frame length */ + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hMetaData, /* i/o: IVAS Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ + const int16_t input_frame /* i : input frame length */ ); ivas_error ivas_mc_paramupmix_enc_open( - Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ + Encoder_Struct *st_ivas /* i/o: IVAS encoder handle */ ); void ivas_mc_paramupmix_enc_close( - MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ - const int32_t sampling_rate + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + const int32_t input_Fs /* i : input sampling rate */ ); void ivas_mc_paramupmix_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ -); - -int16_t ivas_mc_paramupmix_getNumTransportChannels( - void + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ ); ivas_error ivas_mc_paramupmix_dec_open( - Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); void ivas_mc_paramupmix_dec_close( - MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ + MC_PARAMUPMIX_DEC_HANDLE *hMCParamUpmix_out /* i/o: Parametric MC decoder handle */ ); void ivas_mc_paramupmix_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ - int16_t *nb_bits /* o : number of bits written */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_State *st, /* i/o: decoder state structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ ); void ivas_param_mc_metadata_open( diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 9f67c602f6..5c0d9c5809 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -2535,6 +2535,17 @@ const uint16_t ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_ }; +/*----------------------------------------------------------------------------------* + * Parametric Upmix MC ROM tables + *----------------------------------------------------------------------------------*/ + +const int16_t ivas_param_upmx_mx_qmap[2][33] = +{ + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 } +}; + + /*----------------------------------------------------------------------------------* * MASA ROM tables *----------------------------------------------------------------------------------*/ diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index a6437565c9..00a8334947 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -261,6 +261,13 @@ extern const uint16_t ivas_param_mc_cum_freq_icc_delta_combined_48_16bits[2 * PA extern const uint16_t ivas_param_mc_sym_freq_icc_delta_combined_48_16bits[2 * PARAM_MC_SZ_ICC_QUANTIZER - 1]; +/*----------------------------------------------------------------------------------* + * Parametric Upmix MC ROM tables + *----------------------------------------------------------------------------------*/ + +extern const int16_t ivas_param_upmx_mx_qmap[2][33]; + + /*----------------------------------------------------------------------------------* * MASA ROM tables *----------------------------------------------------------------------------------*/ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 82f03fdb3b..c22e9a06d2 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -627,7 +627,7 @@ ivas_error ivas_dec( { ivas_lfe_dec( st_ivas->hLFE, st, output_frame, st_ivas->bfi, output_lfe_ch ); - ivas_mc_paramupmix_dec_read_BS( ivas_total_brate, st, st_ivas, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] ); + ivas_mc_paramupmix_dec_read_BS( st_ivas, st, st_ivas->hMCParamUpmix, &nb_bits_metadata[0] ); if ( ( error = ivas_mct_dec( st_ivas, output, output_frame, nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_mc_paramupmix_dec.c b/lib_dec/ivas_mc_paramupmix_dec.c index 346868ab6a..37da2c702e 100644 --- a/lib_dec/ivas_mc_paramupmix_dec.c +++ b/lib_dec/ivas_mc_paramupmix_dec.c @@ -52,19 +52,21 @@ /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ -static void ps_pred_process( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, float qmf_mod_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], int16_t ch ); + +static void ps_pred_process( MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, float qmf_mod_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], const int16_t ch ); static void paramupmix_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr[], float pcm_in[][L_FRAME48k], float **pp_out_pcm, const int16_t output_frame ); static int huff_read( Decoder_State *st, const int16_t ( *ht )[2] ); -static void huffman_decode( Decoder_State *st, int16_t nv, int16_t ivStart, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t bNoDt, int32_t *vq ); +static void huffman_decode( Decoder_State *st, const int16_t nv, const int16_t ivStart, PAR_TYPE parType, QUANT_TYPE quant_type, const int16_t bNoDt, int32_t *vq ); + +static void dequant_alpha( const int16_t nv, const int16_t ivStart, const QUANT_TYPE quant_type, int32_t *vq, float *v ); -static void dequant_alpha( int16_t nv, int16_t ivStart, QUANT_TYPE quant_type, int32_t *vq, float *v ); +static void dequant_beta( const int16_t nv, const int16_t ivStart, const QUANT_TYPE quant_type, int32_t *aq, int32_t *bq, float *beta ); -static void dequant_beta( int16_t nv, int16_t ivStart, QUANT_TYPE quant_type, int32_t *aq, int32_t *bq, float *beta ); +static void get_ec_data( Decoder_State *st, const PAR_TYPE parType, const QUANT_TYPE quant_type, const int16_t nParBand, const int16_t parBandStart, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS] ); -static void get_ec_data( Decoder_State *st, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t nParBand, int16_t parBandStart, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS] ); /*------------------------------------------------------------------------- * ivas_mc_paramupmix_dec_read_BS() @@ -73,11 +75,10 @@ static void get_ec_data( Decoder_State *st, PAR_TYPE parType, QUANT_TYPE quant_t *------------------------------------------------------------------------*/ void ivas_mc_paramupmix_dec_read_BS( - const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ - int16_t *nb_bits /* o : number of bits written */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_State *st0, /* i/o: decoder state structure */ + MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix, /* i/o: decoder MC Param-Upmix handle */ + int16_t *nb_bits /* o : number of bits written */ ) { int16_t i, k; @@ -89,7 +90,7 @@ void ivas_mc_paramupmix_dec_read_BS( push_wmops( "mc_paramupmix_read_bs" ); *nb_bits = 0; - if ( st->bfi ) + if ( st0->bfi ) { for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { @@ -103,31 +104,31 @@ void ivas_mc_paramupmix_dec_read_BS( } else /* if (!st->bfi) */ { - bit_stream_orig = st->bit_stream; - next_bit_pos_orig = st->next_bit_pos; - last_bit_pos = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + bit_stream_orig = st0->bit_stream; + next_bit_pos_orig = st0->next_bit_pos; + last_bit_pos = (int16_t) ( ( st_ivas->hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); nb_bits_read_orig = 0; last_bit_pos -= nb_bits_read_orig; /* reverse the bitstream for easier reading of indices */ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) { bstr_meta[i] = st_ivas->bit_stream[last_bit_pos - i]; } - st->bit_stream = bstr_meta; - st->next_bit_pos = 0; - st->bits_frame = min( MAX_BITS_METADATA, last_bit_pos + 1 ); - st->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ + st0->bit_stream = bstr_meta; + st0->next_bit_pos = 0; + st0->bits_frame = min( MAX_BITS_METADATA, last_bit_pos + 1 ); + st0->total_brate = st_ivas->hDecoderConfig->ivas_total_brate; /* to avoid BER detect */ for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { - get_ec_data( st, ALPHA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/, + get_ec_data( st0, ALPHA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/, 0 /*parBandStart*/, hMCParamUpmix->alpha_quant[i], alpha_quant, hMCParamUpmix->alphas[i] ); - get_ec_data( st, BETA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/, + get_ec_data( st0, BETA, FINE /*quant_type*/, IVAS_MAX_NUM_BANDS /*nParBand*/, 0 /*parBandStart*/, hMCParamUpmix->beta_quant[i], alpha_quant, hMCParamUpmix->betas[i] ); } - *nb_bits += st->next_bit_pos; - st->bit_stream = bit_stream_orig; - st->next_bit_pos = next_bit_pos_orig; + *nb_bits += st0->next_bit_pos; + st0->bit_stream = bit_stream_orig; + st0->next_bit_pos = next_bit_pos_orig; if ( hMCParamUpmix->first_frame ) { @@ -145,14 +146,16 @@ void ivas_mc_paramupmix_dec_read_BS( return; } + /*------------------------------------------------------------------------- * ivas_mc_paramupmix_dec() * * MC ParamUpmix decoding process *------------------------------------------------------------------------*/ + void ivas_mc_paramupmix_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels */ ) { MC_PARAMUPMIX_DEC_HANDLE hMCParamUpmix; @@ -288,17 +291,6 @@ void ivas_mc_paramupmix_dec( return; } -/*------------------------------------------------------------------------- - * ivas_mc_paramupmix_getNumTransportChannels() - * - * - *------------------------------------------------------------------------*/ -int16_t ivas_mc_paramupmix_getNumTransportChannels() -{ - int16_t nchan_transport; - nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; /* 5.1.2 */ - return nchan_transport; -} /*------------------------------------------------------------------------- * ivas_mc_paramupmix_dec_open() @@ -329,7 +321,7 @@ ivas_error ivas_mc_paramupmix_dec_open( output_Fs = st_ivas->hDecoderConfig->output_Fs; hMCParamUpmix->first_frame = 1; - st_ivas->nchan_transport = ivas_mc_paramupmix_getNumTransportChannels(); + st_ivas->nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; nchan_transport = st_ivas->nchan_transport; switch ( nchan_transport ) @@ -344,6 +336,7 @@ ivas_error ivas_mc_paramupmix_dec_open( assert( 0 && "Number of TC not supported for MC ParamUpmix!" ); #endif } + /*-----------------------------------------------------------------* * set input parameters *-----------------------------------------------------------------*/ @@ -369,6 +362,7 @@ ivas_error ivas_mc_paramupmix_dec_open( return error; } + /*------------------------------------------------------------------------- * ivas_mc_paramupmix_dec_close() * @@ -403,6 +397,7 @@ void ivas_mc_paramupmix_dec_close( return; } + /*****************************************************************************************/ /* local functions */ /*****************************************************************************************/ @@ -413,7 +408,7 @@ static void ps_pred_process( float qmf_mod_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], float qmf_side_re[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* in/out */ float qmf_side_im[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - int16_t ch ) + const int16_t ch ) { float vmre, vmim, vsre, vsim; int16_t iqmf, ipar, ismp, iismp; @@ -423,7 +418,7 @@ static void ps_pred_process( float *alpha_prev = hMCParamUpmix->alpha_prev[ch]; float *beta_prev = hMCParamUpmix->beta_prev[ch]; - int16_t qmf_to_par_band[] = { + const int16_t qmf_to_par_band[] = { 0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, @@ -466,8 +461,11 @@ static void ps_pred_process( alpha1 = alpha2; beta1 = beta2; } + + return; } + static void paramupmix_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr[], /* i/o: SPAR Covar. decoder handle */ float pcm_in[][L_FRAME48k], /* i : input audio channels */ @@ -514,6 +512,7 @@ static void paramupmix_td_decorr_process( return; } + static int huff_read( Decoder_State *st, const int16_t ( *ht )[2] ) @@ -531,19 +530,19 @@ static int huff_read( return -( node + 1 ); } + static void huffman_decode( Decoder_State *st, - int16_t nv, - int16_t ivStart, - PAR_TYPE parType, - QUANT_TYPE quant_type, - int16_t bNoDt, + const int16_t nv, + const int16_t ivStart, + const PAR_TYPE parType, + const QUANT_TYPE quant_type, + const int16_t bNoDt, int32_t *vq ) { const int16_t( *huff_node_table )[2]; int16_t iv, bdt, nquant, offset; - nquant = 0; switch ( parType ) { @@ -568,6 +567,7 @@ static void huffman_decode( bdt = st->bit_stream[st->next_bit_pos]; st->next_bit_pos++; } + if ( bdt ) { /* Get dt */ switch ( parType ) @@ -620,12 +620,15 @@ static void huffman_decode( vq[iv] = huff_read( st, huff_node_table ) + vq[iv - 1] - offset; } } + + return; } + static void dequant_alpha( - int16_t nv, - int16_t ivStart, - QUANT_TYPE quant_type, + const int16_t nv, + const int16_t ivStart, + const QUANT_TYPE quant_type, int32_t *vq, float *v ) { @@ -641,22 +644,21 @@ static void dequant_alpha( { v[iv] = quant_table->data[vq[iv]]; } + + return; } + static void dequant_beta( - int16_t nv, - int16_t ivStart, - QUANT_TYPE quant_type, + const int16_t nv, + const int16_t ivStart, + const QUANT_TYPE quant_type, int32_t *aq, int32_t *bq, float *beta ) { int16_t iv; ACPL_QUANT_TABLE *quant_table; - const int16_t qmap[2][33] = { - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, - { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 } - }; for ( iv = 0; iv < ivStart; iv++ ) { @@ -665,22 +667,26 @@ static void dequant_beta( for ( iv = ivStart; iv < nv; iv++ ) { - quant_table = &beta_quant_table[quant_type][qmap[quant_type][aq[iv]]]; + quant_table = &beta_quant_table[quant_type][ivas_param_upmx_mx_qmap[quant_type][aq[iv]]]; beta[iv] = quant_table->data[bq[iv]]; } + + return; } + static void get_ec_data( Decoder_State *st, - PAR_TYPE parType, - QUANT_TYPE quant_type, - int16_t nParBand, - int16_t parBandStart, + const PAR_TYPE parType, + const QUANT_TYPE quant_type, + const int16_t nParBand, + const int16_t parBandStart, int32_t *parQ, int32_t *alphaQEnv, float ab[IVAS_MAX_NUM_BANDS] ) { huffman_decode( st, nParBand, parBandStart, parType, quant_type, 0, parQ ); + if ( parType == ALPHA ) { dequant_alpha( nParBand, parBandStart, quant_type, parQ, ab ); @@ -690,4 +696,6 @@ static void get_ec_data( { dequant_beta( nParBand, parBandStart, quant_type, alphaQEnv, parQ, ab ); } + + return; } diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index e50627cedd..ba9479fa6c 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -57,19 +57,20 @@ static void ivas_mc_paramupmix_dmx( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, floa static void ivas_mc_paramupmix_param_est_enc( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, float input_frame_t[][L_FRAME48k], const int16_t input_frame, float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], float betas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS] ); -static void get_huff_table( PAR_TYPE par_type, QUANT_TYPE quant_type, HUFF_TAB *df0, HUFF_TAB *df, HUFF_TAB *dt ); +static void get_huff_table( const PAR_TYPE par_type, const QUANT_TYPE quant_type, HUFF_TAB *df0, HUFF_TAB *df, HUFF_TAB *dt ); -static void write_huff_bits( int32_t value, uint16_t length, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); +static void write_huff_bits( const int32_t value, const uint16_t length, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); -static void huffman_encode( int16_t bdfOnly, int16_t bdtAllowed, int16_t nv, int16_t ivStart, int32_t *vqPrev, int32_t *vq, PAR_TYPE parType, QUANT_TYPE quant_type, int16_t nq, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); +static void huffman_encode( const int16_t bdfOnly, const int16_t bdtAllowed, const int16_t nv, const int16_t ivStart, const int32_t *vqPrev, const int32_t *vq, const PAR_TYPE parType, const QUANT_TYPE quant_type, const int16_t nq, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); -static void put_ec_data( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, int16_t ch, float pars[IVAS_MAX_NUM_BANDS], float alphas[IVAS_MAX_NUM_BANDS], PAR_TYPE parType, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); +static void put_ec_data( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, const int16_t ch, const float pars[IVAS_MAX_NUM_BANDS], const float alphas[IVAS_MAX_NUM_BANDS], const PAR_TYPE parType, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ); -static void quantize_alpha( int16_t nv, const float *alpha, QUANT_TYPE quant_type, int16_t *pnq, int32_t aq[IVAS_MAX_NUM_BANDS], float *adeq ); +static void quantize_alpha( const int16_t nv, const float *alpha, const QUANT_TYPE quant_type, int16_t *pnq, int32_t aq[IVAS_MAX_NUM_BANDS], float *adeq ); -static void quantize_pars( int16_t nv, const float *v, int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ); +static void quantize_pars( const int16_t nv, const float *v, const int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ); + +static void quantize_pars( const int16_t nv, const float *v, const int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ); -static void quantize_pars( int16_t nv, const float *v, int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ); /*------------------------------------------------------------------------- * ivas_mc_paramupmix_enc() @@ -78,10 +79,10 @@ static void quantize_pars( int16_t nv, const float *v, int16_t nq, const float * *------------------------------------------------------------------------*/ void ivas_mc_paramupmix_enc( - Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ - BSTR_ENC_HANDLE hBStr, /* i/o: IVAS Metadata bitstream handle */ - float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ - const int16_t input_frame /* i : input frame length */ + Encoder_Struct *st_ivas, /* i/o: IVAS Encoder handle */ + BSTR_ENC_HANDLE hBStr, /* i/o: IVAS Metadata bitstream handle */ + float data_f[][L_FRAME48k], /* i/o: input: CICP6, CICP12, CICP14, CICP16 or CICP19 MC data */ + const int16_t input_frame /* i : input frame length */ ) { MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; @@ -116,6 +117,7 @@ void ivas_mc_paramupmix_enc( return; } + /*------------------------------------------------------------------------- * ivas_mc_paramupmix_enc_open() * @@ -185,15 +187,14 @@ ivas_error ivas_mc_paramupmix_enc_open( /* set FB config. */ /* need to set num output channels to a value > 0 to get pFb != NULL */ #ifndef SBA_MODE_CLEAN_UP - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, - 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) #else - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, - 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) #endif { return error; } + fb_cfg->remix_order = mc_paramupmix_fb_remix_order; /* override latency, could be moved to ivas_fb_set_cfg */ /* assuming parameters are calculated at end of frame, compensate for MCT delay and half of decoder fb */ @@ -221,7 +222,6 @@ ivas_error ivas_mc_paramupmix_enc_open( } } - for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) { if ( ( hMCParamUpmix->cov_real[b] = (float ***) malloc( MC_PARAMUPMIX_NCH * sizeof( float ** ) ) ) == NULL ) @@ -268,6 +268,7 @@ ivas_error ivas_mc_paramupmix_enc_open( return error; } + /*------------------------------------------------------------------------- * ivas_mc_paramupmix_enc_close() * @@ -275,8 +276,9 @@ ivas_error ivas_mc_paramupmix_enc_open( *------------------------------------------------------------------------*/ void ivas_mc_paramupmix_enc_close( - MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ - const int32_t sampling_rate ) + MC_PARAMUPMIX_ENC_HANDLE *hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + const int32_t input_Fs /* i : input sampling rate */ +) { int16_t i, k; int16_t b, j; @@ -285,6 +287,7 @@ void ivas_mc_paramupmix_enc_close( { return; } + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) { if ( ( *hMCParamUpmix )->cov_real[b] != NULL ) @@ -305,6 +308,7 @@ void ivas_mc_paramupmix_enc_close( } free( ( *hMCParamUpmix )->cov_real[b] ); } + if ( ( *hMCParamUpmix )->cov_dtx_real[b] != NULL ) { for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) @@ -340,7 +344,7 @@ void ivas_mc_paramupmix_enc_close( if ( ( *hMCParamUpmix )->hFbMixer != NULL ) { - ivas_FB_mixer_close( &( *hMCParamUpmix )->hFbMixer, sampling_rate, 0 ); + ivas_FB_mixer_close( &( *hMCParamUpmix )->hFbMixer, input_Fs, 0 ); } for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) @@ -354,33 +358,18 @@ void ivas_mc_paramupmix_enc_close( free( *hMCParamUpmix ); *hMCParamUpmix = NULL; - return; -} - -/*------------------------------------------------------------------------- - * ivas_mc_paramupmix_getNumTransportChannels() - * - * - *------------------------------------------------------------------------*/ -/* r : number of IVAS transport channels */ -int16_t ivas_mc_paramupmix_getNumTransportChannels() -{ - int16_t nchan_transport; - - /* LFE not included */ - nchan_transport = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS - 1; /*5_1_2*/ - - return nchan_transport; + return; } /*****************************************************************************************/ /* local functions */ /*****************************************************************************************/ + static void get_huff_table( - PAR_TYPE par_type, - QUANT_TYPE quant_type, + const PAR_TYPE par_type, + const QUANT_TYPE quant_type, HUFF_TAB *df0, HUFF_TAB *df, HUFF_TAB *dt ) @@ -404,31 +393,38 @@ static void get_huff_table( dt->length = huff_beta_table[quant_type].dt.length; break; } + + return; } + static void write_huff_bits( - int32_t value, - uint16_t length, + const int32_t value, + const uint16_t length, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ) { int16_t k; + for ( k = length - 1; k >= 0; k-- ) { bit_buffer[( *bit_pos )++] = (uint16_t) ( ( value >> k ) & 1 ); } + + return; } + static void huffman_encode( - int16_t bdfOnly, - int16_t bdtAllowed, - int16_t nv, - int16_t ivStart, - int32_t *vqPrev, - int32_t *vq, - PAR_TYPE parType, - QUANT_TYPE quant_type, - int16_t nq, + const int16_t bdfOnly, + const int16_t bdtAllowed, + const int16_t nv, + const int16_t ivStart, + const int32_t *vqPrev, + const int32_t *vq, + const PAR_TYPE parType, + const QUANT_TYPE quant_type, + const int16_t nq, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ) { @@ -490,19 +486,24 @@ static void huffman_encode( for ( iv = ivStart; iv < nv; iv++ ) { icode = vq[iv] - vqPrev[iv] + offset; +#ifdef DEBUGGING if ( icode < 0 || icode >= 2 * nq - 1 ) { assert( 0 ); } +#endif write_huff_bits( dt.value[icode], dt.length[icode], bit_buffer, bit_pos ); } } + + return; } + static void quantize_pars( - int16_t nv, + const int16_t nv, const float *v, - int16_t nq, + const int16_t nq, const float *data, int32_t vq[IVAS_MAX_NUM_BANDS], float *vdeq ) @@ -538,12 +539,15 @@ static void quantize_pars( vdeq[iv] = data[iq1]; } } + + return; } + static void quantize_alpha( - int16_t nv, + const int16_t nv, const float *alpha, - QUANT_TYPE quant_type, + const QUANT_TYPE quant_type, int16_t *pnq, int32_t aq[IVAS_MAX_NUM_BANDS], float *adeq ) @@ -557,13 +561,16 @@ static void quantize_alpha( quantize_pars( nv, alpha, nq, data, aq, adeq ); *pnq = nq; + + return; } + static void quantize_beta( - int16_t nv, + const int16_t nv, const float *beta, const int32_t aq[IVAS_MAX_NUM_BANDS], - QUANT_TYPE quant_type, + const QUANT_TYPE quant_type, int16_t *pnq, int32_t bq[IVAS_MAX_NUM_BANDS], float *bdeq ) @@ -571,11 +578,10 @@ static void quantize_beta( int16_t iv, iq, iq0, iq1; ACPL_QUANT_TABLE *tables = beta_quant_table[quant_type]; ACPL_QUANT_TABLE quant_table; - const int16_t qmap[2][33] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, - { 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1, 0 } }; + for ( iv = 0; iv < nv; iv++ ) { - quant_table = tables[qmap[quant_type][aq[iv]]]; + quant_table = tables[ivas_param_upmx_mx_qmap[quant_type][aq[iv]]]; iq0 = 0; iq1 = quant_table.nquant - 1; @@ -606,14 +612,17 @@ static void quantize_beta( } *pnq = beta_quant_table[quant_type][0].nquant; + + return; } + static void put_ec_data( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, - int16_t ch, - float pars[IVAS_MAX_NUM_BANDS], - float alphas[IVAS_MAX_NUM_BANDS], - PAR_TYPE parType, + const int16_t ch, + const float pars[IVAS_MAX_NUM_BANDS], + const float alphas[IVAS_MAX_NUM_BANDS], + const PAR_TYPE parType, uint16_t bit_buffer[MC_PARAMUPMIX_MAX_BITS], int16_t *bit_pos ) { @@ -635,6 +644,7 @@ static void put_ec_data( quantize_alpha( npar, alphas, quant_type, &nq, alphaQuant, alphaDequant ); quantize_beta( npar, pars, alphaQuant, quant_type, &nq, betaQuant, betaDequant ); } + if ( hMCParamUpmix->first_frame ) { mvl2l( &( alphaQuant[0] ), &( hMCParamUpmix->alpha_quant_prev[ch][0] ), IVAS_MAX_NUM_BANDS ); @@ -666,8 +676,11 @@ static void put_ec_data( { mvl2l( betaQuant, hMCParamUpmix->beta_quant_prev[ch], IVAS_MAX_NUM_BANDS ); } + + return; } + /*------------------------------------------------------------------------- * ivas_mc_paramupmix_dmx() * @@ -676,15 +689,15 @@ static void put_ec_data( static void ivas_mc_paramupmix_dmx( MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC ParamUpmix encoder handle */ - float data_f[][L_FRAME48k], /* i/o : Input, downmix out */ + float data_f[][L_FRAME48k], /* i/o: Input, downmix out */ const int16_t input_frame /* i : Input frame length */ ) { int16_t i, l; - int16_t chan1s[4] = { 4, 5, 8, 9 }; - int16_t chan2s[4] = { 6, 7, 10, 11 }; - int16_t chanOut[4] = { 4, 5, 6, 7 }; - int16_t chanZero[4] = { 8, 9, 10, 11 }; + const int16_t chan1s[4] = { 4, 5, 8, 9 }; + const int16_t chan2s[4] = { 6, 7, 10, 11 }; + const int16_t chanOut[4] = { 4, 5, 6, 7 }; + const int16_t chanZero[4] = { 8, 9, 10, 11 }; /* boxes = { 0 1 2 3 [4 6] [5 7] [8 10] [9 11] }; */ /* 9+11 -> 7 */ @@ -702,10 +715,12 @@ static void ivas_mc_paramupmix_dmx( data_f[chanOut[i]][l] = hMCParamUpmix->midside[i][0][l]; } } + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { set_zero( data_f[chanZero[i]], input_frame ); } + return; } @@ -718,7 +733,7 @@ static void ivas_mc_paramupmix_dmx( *------------------------------------------------------------------------*/ static void ivas_mc_paramupmix_param_est_enc( - MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ + MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix, /* i/o: MC Param-Upmix encoder handle */ float input_frame_t[][L_FRAME48k], /* i : Input frame in the time domain */ const int16_t input_frame, /* i : Input frame length */ float alphas[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS], @@ -735,13 +750,11 @@ static void ivas_mc_paramupmix_param_est_enc( float *cov_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float *cov_dtx_real[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; float rxx, rxy, ryy, cmat, rxxest, drxx, wetaux; - int16_t l_ts; int16_t b, i, j, ts, bnd; #ifdef FIX_468_16KHZ_PUPMIX int16_t maxbands; #endif - int16_t transient_det[MC_PARAMUPMIX_COMBINATIONS][2]; int16_t transient_det_l[2], transient_det_r[2]; int16_t chan1s[4] = { 4, 5, 8, 9 }; @@ -758,6 +771,7 @@ static void ivas_mc_paramupmix_param_est_enc( /*-----------------------------------------------------------------------------------------* * Transient detector *-----------------------------------------------------------------------------------------*/ + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { ivas_transient_det_process( hMCParamUpmix->hTranDet[2 * i], pcm_in[2 * i], input_frame, transient_det_l ); @@ -785,8 +799,10 @@ static void ivas_mc_paramupmix_param_est_enc( { ivas_fb_mixer_get_windowed_fr( hMCParamUpmix->hFbMixer, pcm_in, pp_in_fr_real, pp_in_fr_imag, l_ts, l_ts, hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + ivas_fb_mixer_update_prior_input( hMCParamUpmix->hFbMixer, pcm_in, l_ts, hMCParamUpmix->hFbMixer->fb_cfg->num_in_chans ); + for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH; i++ ) { pcm_in[i] += l_ts; @@ -798,14 +814,17 @@ static void ivas_mc_paramupmix_param_est_enc( /*-----------------------------------------------------------------------------------------* * Covariance process *-----------------------------------------------------------------------------------------*/ + for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) { pp_in_fr_real[0] = p_fr_realbuffer[2 * b]; pp_in_fr_imag[0] = p_fr_imagbuffer[2 * b]; pp_in_fr_real[1] = FR_Real_Mid; pp_in_fr_imag[1] = FR_Imag_Mid; + v_add( pp_in_fr_real[0], p_fr_realbuffer[2 * b + 1], pp_in_fr_real[1], L_FRAME48k ); v_add( pp_in_fr_imag[0], p_fr_imagbuffer[2 * b + 1], pp_in_fr_imag[1], L_FRAME48k ); + for ( i = 0; i < MC_PARAMUPMIX_NCH; i++ ) { for ( j = 0; j < MC_PARAMUPMIX_NCH; j++ ) @@ -814,8 +833,10 @@ static void ivas_mc_paramupmix_param_est_enc( cov_dtx_real[i][j] = hMCParamUpmix->cov_dtx_real[b][i][j]; } } + ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind ); } + #ifdef FIX_468_16KHZ_PUPMIX maxbands = hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands; for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) @@ -841,6 +862,7 @@ static void ivas_mc_paramupmix_param_est_enc( betas[b][bnd] = 2.0f * wetaux; } } + #ifdef FIX_468_16KHZ_PUPMIX if ( maxbands < IVAS_MAX_NUM_BANDS ) { @@ -854,5 +876,6 @@ static void ivas_mc_paramupmix_param_est_enc( } } #endif + return; } diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index 55da6495f8..091352cc09 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -325,7 +325,7 @@ ivas_error create_mct_enc( } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels(); + hMCT->nchan_out_woLFE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; } else if ( ivas_format == SBA_FORMAT ) { @@ -441,7 +441,7 @@ ivas_error mct_enc_reconfigure( } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - hMCT->nchan_out_woLFE = ivas_mc_paramupmix_getNumTransportChannels(); + hMCT->nchan_out_woLFE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) { -- GitLab From cde66161bd0640cc227ed2337d1ee340f9a5af85 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 16:04:12 +0200 Subject: [PATCH 182/381] clang-format --- lib_com/ivas_fb_mixer.c | 4 +- lib_com/lsf_tools.c | 2 +- lib_dec/ivas_dirac_output_synthesis_dec.c | 184 +++++++++++----------- lib_enc/lsf_msvq_ma_enc.c | 136 ++++++++-------- 4 files changed, 163 insertions(+), 163 deletions(-) diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index d4c00dc2d5..febb090d3e 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -844,8 +844,8 @@ static int16_t ivas_calculate_abs_fr( float short_stride_nrg = 0.0f; float cldfb_nrg = 0.0f; int16_t short_stride = pFb->fb_bin_to_band.short_stride; - const int16_t num_bins_per_short_stride_bin = (const int16_t) ( ( sampling_rate / FRAMES_PER_SEC ) / short_stride ); - const int16_t num_bins_per_cldfb_band = (const int16_t) ( ( sampling_rate / FRAMES_PER_SEC ) / pFb->fb_bin_to_band.num_cldfb_bands ); + const int16_t num_bins_per_short_stride_bin = ( const int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / short_stride ); + const int16_t num_bins_per_cldfb_band = ( const int16_t )( ( sampling_rate / FRAMES_PER_SEC ) / pFb->fb_bin_to_band.num_cldfb_bands ); float short_stride_max_per_spar_band = 1e-9f; /*loop over all stored Filter Bank Response MDFT coefficients*/ diff --git a/lib_com/lsf_tools.c b/lib_com/lsf_tools.c index c0c4556126..4f40b83015 100644 --- a/lib_com/lsf_tools.c +++ b/lib_com/lsf_tools.c @@ -2569,7 +2569,7 @@ void extend_dctN_input( /*-------------------------------------------------------------------* * create_IDCT_N_Matrix() * - * inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in + * inititate idct24 FDCNG_VQ_DCT_MAXTRUNCx N matrix in * RAM from a quantized compressed ROM format *-------------------------------------------------------------------*/ diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 9bf4762ecd..d0ce6fa435 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -677,118 +677,118 @@ void ivas_dirac_dec_output_synthesis_process_slot( } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { + { - /* compute direct responses */ + /* compute direct responses */ #ifdef JBM_TSM_ON_TCS - ivas_dirac_dec_compute_directional_responses( hDirAC, - hVBAPdata, - NULL, - azimuth, - elevation, - md_idx, - NULL, - sh_rot_max_order, - p_Rmat, - hodirac_flag ); + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + NULL, + azimuth, + elevation, + md_idx, + NULL, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); #endif - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); - /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) - { - int16_t k; - if ( ch_idx != 0 ) + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) { - float a, b, c; - - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) + int16_t k; + if ( ch_idx != 0 ) { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + float a, b, c; + + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } } - for ( ; k < num_freq_bands; k++ ) + else { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } } } - else + + /*Directional gain (panning)*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); - } + v_mult( h_dirac_output_synthesis_state->direct_power_factor, + &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], + aux_buf, + num_freq_bands ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); } - } - /*Directional gain (panning)*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) - { - v_mult( h_dirac_output_synthesis_state->direct_power_factor, - &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], - aux_buf, - num_freq_bands ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - num_freq_bands ); - } + /*Diffuse gain*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + aux_buf, + num_freq_bands_diff ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } - /*Diffuse gain*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + return; + } + else { - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - hDirAC->diffuse_response_function[ch_idx], - aux_buf, - num_freq_bands_diff ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - num_freq_bands_diff ); + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); } - - return; - } - else - { - /* compute reference and diffuse power factor for this frame */ - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); } - } diff_start_band = 0; if ( h_dirac_output_synthesis_params->use_onset_filters ) diff --git a/lib_enc/lsf_msvq_ma_enc.c b/lib_enc/lsf_msvq_ma_enc.c index 4c2bcef534..47d9d83a8a 100644 --- a/lib_enc/lsf_msvq_ma_enc.c +++ b/lib_enc/lsf_msvq_ma_enc.c @@ -468,86 +468,37 @@ void msvq_enc( else /* non-DCT Stage #1 code below */ if ( !s ) /* means: m==1 */ - { - /* This loop is identical to the one below, except, that the inner - loop over c=0..m is hardcoded to c=0, since m=1. */ - /* dist[0][0] */ - for ( j = 0; j < levels[s]; j++ ) { - en = 0.0f; - /* w,Tmp */ - /* Compute weighted codebook element and its energy */ - for ( c2 = 0; c2 < n; c2++ ) - { - Tmp[start + c2] = w[start + c2] * cbp[c2]; - en += cbp[c2] * Tmp[start + c2]; - } - cbp += maxn; /* pointer is incremented */ - - pTmp = &resid[0][0]; - /* Tmp */ - tmp = ( *pTmp++ ) * Tmp[0]; - for ( c2 = 1; c2 < N; c2++ ) - { - tmp += ( *pTmp++ ) * Tmp[c2]; - } - tmp = en - 2.0f * tmp; - tmp += dist[0][0]; - if ( tmp < dist[1][p_max] ) + /* This loop is identical to the one below, except, that the inner + loop over c=0..m is hardcoded to c=0, since m=1. */ + /* dist[0][0] */ + for ( j = 0; j < levels[s]; j++ ) { - /* Replace worst */ - dist[1][p_max] = tmp; - indices[1][p_max * stages] = j; - parents[p_max] = 0; - - p_max = 0; - for ( c2 = 1; c2 < maxC; c2++ ) + en = 0.0f; + /* w,Tmp */ + /* Compute weighted codebook element and its energy */ + for ( c2 = 0; c2 < n; c2++ ) { - if ( dist[1][c2] > dist[1][p_max] ) - { - p_max = c2; - } + Tmp[start + c2] = w[start + c2] * cbp[c2]; + en += cbp[c2] * Tmp[start + c2]; } - } /* if (tmp <= dist[1][p_max]) */ - } /* for (j=0; j dist[1][p_max] ) + { + p_max = c2; + } + } + } /* if (tmp <= dist[1][p_max]) */ + } /* for(c=0; c Date: Mon, 5 Jun 2023 16:11:14 +0200 Subject: [PATCH 183/381] adjust naming of output files and use wav as output format --- tests/test_param_file.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/test_param_file.py b/tests/test_param_file.py index 7774d59403..fbdf57ff3a 100644 --- a/tests/test_param_file.py +++ b/tests/test_param_file.py @@ -266,11 +266,7 @@ def test_param_file_tests( # the output file is not the real output filename # -> construct output filename - if output_config != "": - output_file = f"{testv_base}_{tag_str}.dec.{output_config_name}.pcm" - else: - # EVS decoder command lines do not have an output_config: use "MONO" in the output filename - output_file = f"{testv_base}_{tag_str}.dec.MONO.pcm" + output_file = f"{testv_base}_{tag_str}.dec.wav" decode( dut_decoder_frontend, -- GitLab From 894d309bc1762034cf0259b530b33c5d6e9a7239 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 16:11:54 +0200 Subject: [PATCH 184/381] clang-format --- lib_enc/bw_detect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 7ef39091c5..4358355138 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -89,7 +89,7 @@ void bw_detect( bwd_count_wider_bw = BWD_COUNT_WIDER_BW; #ifdef FIX_529_BWD_ISSUE - if ( st->ini_frame > 0 && ( st->element_mode == IVAS_CPE_MDCT || ivas_format == ISM_FORMAT ) && ( st->element_brate >= IVAS_48k || mct_on ) ) + if ( st->ini_frame > 0 && ( st->element_mode == IVAS_CPE_MDCT || ivas_format == ISM_FORMAT ) && ( st->element_brate >= IVAS_48k || mct_on ) ) #else if ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate > IVAS_64k || mct_on ) ) #endif -- GitLab From eb4c05597ea751b5b32996fddbfeebdbef8b3be1 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Mon, 5 Jun 2023 16:26:01 +0200 Subject: [PATCH 185/381] testing Jan's proposal for fix --- tests/test_param_file.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/test_param_file.py b/tests/test_param_file.py index 0059a22408..54c5824749 100644 --- a/tests/test_param_file.py +++ b/tests/test_param_file.py @@ -266,11 +266,7 @@ def test_param_file_tests( # the output file is not the real output filename # -> construct output filename - if output_config != "": - output_file = f"{testv_base}_{tag_str}.dec.{output_config_name}.pcm" - else: - # EVS decoder command lines do not have an output_config: use "MONO" in the output filename - output_file = f"{testv_base}_{tag_str}.dec.MONO.pcm" + output_file = f"{testv_base}_{tag_str}.dec.wav" decode( dut_decoder_frontend, -- GitLab From 35bde97c4b21c4580d4a4a5a016fc2300387c3f9 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 5 Jun 2023 16:42:32 +0200 Subject: [PATCH 186/381] fix issue raised from ivas_mc_paramupmix_getNumTransportChannels() being defined twice before --- lib_enc/ivas_mct_enc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index 091352cc09..9c98fa6ee2 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -325,7 +325,7 @@ ivas_error create_mct_enc( } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - hMCT->nchan_out_woLFE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + hMCT->nchan_out_woLFE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS - 1; } else if ( ivas_format == SBA_FORMAT ) { @@ -441,7 +441,7 @@ ivas_error mct_enc_reconfigure( } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { - hMCT->nchan_out_woLFE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS; + hMCT->nchan_out_woLFE = MC_PARAMUPMIX_MAX_TRANSPORT_CHANS - 1; } else if ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_PARAMMC ) { -- GitLab From 93f75475a3c85977c33fa230fd2c4db6b1d99faf Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Mon, 5 Jun 2023 17:04:20 +0200 Subject: [PATCH 187/381] fix for issue 570 - TCX LPC parameter write --- lib_com/options.h | 1 + lib_enc/ivas_tcx_core_enc.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index e9d887b5eb..d8428a0810 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -240,6 +240,7 @@ #define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ #define BINAURAL_AUDIO_CMDLINE +#define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index e334f4d029..9931f1048d 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -392,10 +392,14 @@ void stereo_tcx_core_enc( * Write LPC parameters *--------------------------------------------------------------------------------*/ +#ifndef FIX_570_TCX_LPC_WRITE n = st->coder_type; /* IVAS_fmToDo: hack to keep bit-exactness -> TBV */ st->coder_type = INACTIVE; +#endif writeLPCparam( st, hBstr, param_lpc, bits_param_lpc, no_param_lpc, &total_nbbits ); +#ifndef FIX_570_TCX_LPC_WRITE st->coder_type = n; +#endif assert( total_nbbits == ( nbits_lpc[0] + nbits_lpc[1] ) ); #ifdef DEBUG_MODE_TCX -- GitLab From 552d2b6892f95db4152a2668a9b90cd7d0b01486 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Jun 2023 10:42:41 +0300 Subject: [PATCH 188/381] Fix merge conflicts --- apps/decoder.c | 106 +++++++++++++++++-- apps/renderer.c | 2 +- lib_com/ivas_error.h | 4 + lib_dec/ivas_binRenderer_internal.c | 65 +++++++----- lib_dec/ivas_dec.c | 17 ++- lib_dec/ivas_jbm_dec.c | 16 ++- lib_dec/ivas_mc_param_dec.c | 6 +- lib_dec/ivas_output_config.c | 1 - lib_rend/ivas_crend.c | 40 ++++++- lib_rend/ivas_dirac_dec_binaural_functions.c | 34 +++++- lib_rend/ivas_objectRenderer.c | 12 +-- lib_rend/ivas_prot_rend.h | 4 + lib_rend/ivas_rotation.c | 5 + lib_rend/ivas_stat_rend.h | 2 + lib_util/rotation_file_reader.c | 97 ++--------------- lib_util/rotation_file_reader.h | 22 +--- 16 files changed, 270 insertions(+), 163 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 8fb34f49e1..0a9fb3c214 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -168,8 +168,12 @@ static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, Head static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); #ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING +#ifdef EXTERNAL_ORIENTATIONS +static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); +#else static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); #endif +#endif static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); static int16_t app_own_random( int16_t *seed ); static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( char *forcedRendModeChar ); @@ -732,17 +736,21 @@ int main( #ifdef DEBUGGING else if ( arg.variableSpeedMode ) { - error = decodeVariableSpeed( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec ); + error = decodeVariableSpeed( arg, hBsReader, headRotReader, +#ifdef EXTERNAL_ORIENTATIONS + externalOrientationFileReader, +#endif + refRotReader, referenceVectorReader, hIvasDec ); } #endif #endif else { + error = decodeG192( arg, hBsReader, headRotReader, #ifdef EXTERNAL_ORIENTATIONS - error = decodeG192( arg, hBsReader, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); -#else - error = decodeG192( arg, hBsReader, headRotReader, refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); + externalOrientationFileReader, #endif + refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); } if ( error == IVAS_ERR_OK || error == IVAS_ERR_END_OF_FILE ) @@ -2668,8 +2676,14 @@ cleanup: static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, +#ifdef EXTERNAL_ORIENTATIONS + RotFileReader *headRotReader, + RotFileReader *externalOrientationFileReader, + RotFileReader *refRotReader, +#else HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, +#endif Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ) @@ -2773,7 +2787,12 @@ static ivas_error decodeVariableSpeed( IVAS_QUATERNION quaternion; if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) ); + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_getFilePath( refRotReader ) ); +#else + HeadRotationFileReader_getFilePath( refRotReader ) ); +#endif goto cleanup; } @@ -2793,7 +2812,12 @@ static ivas_error decodeVariableSpeed( { if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_getFilePath( headRotReader ) ); +#else + HeadRotationFileReader_getFilePath( headRotReader ) ); +#endif goto cleanup; } } @@ -2805,6 +2829,34 @@ static ivas_error decodeVariableSpeed( } } +#ifdef EXTERNAL_ORIENTATIONS + if ( arg.enableExternalOrientation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + + if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &Quaternions[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading external orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), + RotationFileReader_getFilePath( externalOrientationFileReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_FeedExternalOrientationData( hIvasDec, Quaternions, enableHeadRotation, enableExternalOrientation, enableRotationInterpolation, numFramesToTargetOrientation ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedExternalOrientationData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif + /* decode and get samples */ do { @@ -3026,7 +3078,12 @@ static ivas_error decodeVariableSpeed( IVAS_QUATERNION quaternion; if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( refRotReader ) ); + fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_getFilePath( refRotReader ) ); +#else + HeadRotationFileReader_getFilePath( refRotReader ) ); +#endif goto cleanup; } @@ -3045,7 +3102,12 @@ static ivas_error decodeVariableSpeed( { if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) { - fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), HeadRotationFileReader_getFilePath( headRotReader ) ); + fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), +#ifdef EXTERNAL_ORIENTATIONS + RotationFileReader_getFilePath( headRotReader ) ); +#else + HeadRotationFileReader_getFilePath( headRotReader ) ); +#endif goto cleanup; } } @@ -3057,6 +3119,34 @@ static ivas_error decodeVariableSpeed( } } +#ifdef EXTERNAL_ORIENTATIONS + if ( arg.enableExternalOrientation ) + { + IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableHeadRotation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableExternalOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int8_t enableRotationInterpolation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + int16_t numFramesToTargetOrientation[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; + + for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + + if ( ( error = ExternalOrientationFileReading( externalOrientationFileReader, &Quaternions[i], &enableHeadRotation[i], &enableExternalOrientation[i], &enableRotationInterpolation[i], &numFramesToTargetOrientation[i] ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError %s while reading external orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), + RotationFileReader_getFilePath( externalOrientationFileReader ) ); + goto cleanup; + } + } + + if ( ( error = IVAS_DEC_FeedExternalOrientationData( hIvasDec, Quaternions, enableHeadRotation, enableExternalOrientation, enableRotationInterpolation, numFramesToTargetOrientation ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nIVAS_DEC_FeedExternalOrientationData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } + } +#endif + /* decode and get samples */ if ( ( error = IVAS_DEC_VoIP_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesAvailableNext, &nSamplesFlushed ) ) != IVAS_ERR_OK ) { diff --git a/apps/renderer.c b/apps/renderer.c index 1ef09b59a2..58e1e1b4a6 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1842,12 +1842,12 @@ static void parseOption( assert( numOptionValues == 1 ); strncpy( args->referenceRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; -#endif #ifdef EXTERNAL_ORIENTATIONS case CmdLnOptionId_exteriorOrientationFile: assert( numOptionValues == 1 ); strncpy( args->externalOrientationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; +#endif case CmdLnOptionId_customHrtfFile: assert( numOptionValues == 1 ); strncpy( args->customHrtfFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 901877d308..521ff0043c 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -235,6 +235,10 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Wrong mode"; case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: return "Head rotation not supported"; +#ifdef EXTERNAL_ORIENTATIONS + case IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED: + return "External orientation not supported"; +#endif case IVAS_ERR_INVALID_HRTF: return "Unsupported HRTF filter set"; case IVAS_ERR_INVALID_INPUT_FORMAT: diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index e77d43d2e8..d2b592e057 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1063,13 +1063,13 @@ void ivas_binaural_cldfb( /* Implement binaural rendering */ #ifdef JBM_TSM_ON_TCS #ifdef EXTERNAL_ORIENTATIONS - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframeIdx, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #endif #else #ifdef EXTERNAL_ORIENTATIONS - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframeIdx, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #endif @@ -1166,9 +1166,17 @@ void ivas_binaural_cldfb_sf( /* Implement binaural rendering */ #ifdef JBM_TSM_ON_TCS +#ifdef EXTERNAL_ORIENTATIONS + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframeIdx, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#endif +#else +#ifdef EXTERNAL_ORIENTATIONS + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframeIdx, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); +#endif #endif /* Implement CLDFB synthesis */ @@ -1237,64 +1245,71 @@ void ivas_binRenderer( } } -#ifdef EXTERNAL_ORIENTATIONS /* Head rotation in HOA3 or CICPx */ - if ( hHeadTrackData && hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && hBinRenderer->rotInCldfb ) + if ( hHeadTrackData +#ifdef EXTERNAL_ORIENTATIONS + && hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] +#else + && hHeadTrackData->num_quaternions >= 0 +#endif + && hBinRenderer->rotInCldfb ) { if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) { /* Rotation in SHD (HOA3) */ if ( hHeadTrackData->shd_rot_max_order == -1 ) { +#ifdef EXTERNAL_ORIENTATIONS +#ifdef JBM_TSM_ON_TCS + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); +#else rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, 3 ); - } - else if ( hHeadTrackData->shd_rot_max_order > 0 ) - { - rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, hHeadTrackData->shd_rot_max_order ); - } - } - else - { - /* Rotation in SD (CICPx) */ - rotateFrame_sd_cldfb( hCombinedOrientationData->Rmat[subframe_idx], RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band ); - } - } +#endif #else - /* Head rotation in HOA3 or CICPx */ - if ( hHeadTrackData && hHeadTrackData->num_quaternions >= 0 && hBinRenderer->rotInCldfb ) - { - if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) - { - /* Rotation in SHD (HOA3) */ - if ( hHeadTrackData->shd_rot_max_order == -1 ) - { QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); #ifdef JBM_TSM_ON_TCS rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); #else rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, 3 ); +#endif #endif } else if ( hHeadTrackData->shd_rot_max_order > 0 ) { + +#ifdef EXTERNAL_ORIENTATIONS +#ifdef JBM_TSM_ON_TCS + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order ); +#else + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, hHeadTrackData->shd_rot_max_order ); +#endif +#else #ifdef JBM_TSM_ON_TCS rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order ); #else rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, hHeadTrackData->shd_rot_max_order ); +#endif #endif } } else { /* Rotation in SD (CICPx) */ +#ifdef EXTERNAL_ORIENTATIONS +#ifdef JBM_TSM_ON_TCS + rotateFrame_sd_cldfb( hCombinedOrientationData->Rmat[subframe_idx], RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); +#else + rotateFrame_sd_cldfb( hCombinedOrientationData->Rmat[subframe_idx], RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band ); +#endif +#else #ifdef JBM_TSM_ON_TCS rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); #else rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band ); +#endif #endif } } -#endif /* HOA decoding to CICP19 if needed*/ if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 ) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 024fecc8a4..dc2100b432 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -685,9 +685,22 @@ ivas_error ivas_dec( if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { #ifdef JBM_TSM_ON_TCS - if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, p_output, output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData, #else - if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK ) + st_ivas->hHeadTrackData, +#endif + &st_ivas->hIntSetup, st_ivas->hEFAPdata, p_output, output_Fs ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData, +#else + st_ivas->hHeadTrackData, +#endif + &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 04ae490414..2d4f0ab385 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -830,7 +830,12 @@ ivas_error ivas_jbm_dec_render( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData, +#else + st_ivas->hHeadTrackData, +#endif &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, p_tc, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) { return error; @@ -1052,8 +1057,13 @@ ivas_error ivas_jbm_dec_flush_renderer( { if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV || renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, hIntSetupOld, - st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData, +#else + st_ivas->hHeadTrackData, +#endif + hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 14e29ed36d..4f5635831a 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1791,7 +1791,11 @@ void ivas_param_mc_dec_render( if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, hParamMC->subframe_nbslots[subframe_idx], + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData, subframe_idx, +#endif + hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); } else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 071261f85c..da32fa666c 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -203,7 +203,6 @@ void ivas_renderer_select( #else if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) #endif -#endif #endif { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 3a993d08a1..d6dfdda9ee 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1620,7 +1620,11 @@ ivas_error ivas_rend_crendProcessSubframe( const AUDIO_CONFIG inConfig, /* i : input audio configuration */ const AUDIO_CONFIG outConfig, /* i : output audio configuration */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ +#else const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ +#endif const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ @@ -1640,6 +1644,22 @@ ivas_error ivas_rend_crendProcessSubframe( ivas_error error; IVAS_REND_AudioConfig inRendConfig; IVAS_REND_AudioConfig outRendConfig; +#ifdef EXTERNAL_ORIENTATIONS + int8_t combinedOrientationEnabled; + + combinedOrientationEnabled = 0; + if (hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if ( hCombinedOrientationData->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } +#endif push_wmops( "ivas_rend_crendProcessSubframe" ); @@ -1687,7 +1707,11 @@ ivas_error ivas_rend_crendProcessSubframe( { subframe_len = hTcBuffer->subframe_nbslots[subframe_idx] * hTcBuffer->n_samples_granularity; +#ifdef EXTERNAL_ORIENTATIONS + if ( hDecoderConfig && combinedOrientationEnabled ) +#else if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) +#endif { /* Rotation in SHD for: MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL @@ -1695,12 +1719,24 @@ ivas_error ivas_rend_crendProcessSubframe( */ if ( in_config == AUDIO_CONFIG_FOA || in_config == AUDIO_CONFIG_HOA2 || in_config == AUDIO_CONFIG_HOA3 ) { - rotateFrame_shd( hHeadTrackData, tc_local, subframe_len, *hIntSetup, 0 ); + rotateFrame_shd( +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData, +#else + hHeadTrackData, +#endif + tc_local, subframe_len, *hIntSetup, 0 ); } /* Rotation in SD for MC -> BINAURAL_ROOM */ else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) { - rotateFrame_sd( hHeadTrackData, tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 ); + rotateFrame_sd( +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData, +#else + hHeadTrackData, +#endif + tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 ); } } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 2c84f5c4fa..dfb51b0691 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -90,7 +90,13 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struc #ifdef JBM_TSM_ON_TCS static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); -static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); +static void adaptTransportSignalsHeadtracked( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hHeadTrackData, +#else + HEAD_TRACK_DATA_HANDLE hHeadTrackData, +#endif + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( #ifdef EXTERNAL_ORIENTATIONS @@ -102,7 +108,13 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( #else static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); -static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); +static void adaptTransportSignalsHeadtracked( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hHeadTrackData, +#else + HEAD_TRACK_DATA_HANDLE hHeadTrackData, +#endif + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( #ifdef EXTERNAL_ORIENTATIONS @@ -398,7 +410,7 @@ void ivas_dirac_dec_binaural_render( for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * hDirAC->subframe_nbslots[subframe_idx]; - ivas_dirac_dec_binaural_internal( st_ivas, output_f_local, nchan_transport, subframe_idx ); + ivas_dirac_dec_binaural_internal( st_ivas, st_ivas->hCombinedOrientationData, output_f_local, nchan_transport, subframe_idx ); for ( ch = 0; ch < nchan_out; ch++ ) { output_f_local[ch] += n_samples_sf; @@ -732,13 +744,21 @@ static void ivas_dirac_dec_binaural_internal( { for ( j = 0; j < 3; j++ ) { - Rmat[i][j] = hCombinedOrientationData->Rmat[firstSubframe][i][j]; + Rmat[i][j] = hCombinedOrientationData->Rmat[subframe][i][j]; } } if ( nchan_transport == 2 ) { - ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, firstSlot, slotEnd, nBins, Rmat ); +#ifdef JBM_TSM_ON_TCS + adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); + + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); +#else + adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); + + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); +#endif } #else if ( st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) @@ -1570,7 +1590,11 @@ static void ivas_dirac_dec_binaural_process_output( static void adaptTransportSignalsHeadtracked( +#ifdef EXTERNAL_ORIENTATIONS + COMBINED_ORIENTATION_HANDLE hHeadTrackData, +#else HEAD_TRACK_DATA_HANDLE hHeadTrackData, +#endif float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 55f4f2f6bb..c089812b21 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -779,9 +779,8 @@ ivas_error ivas_td_binaural_renderer_ext( #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, #endif - ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, #ifdef EXTERNAL_ORIENTATIONS @@ -790,9 +789,8 @@ ivas_error ivas_td_binaural_renderer_ext( #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, #endif - p_output, output_frame ) ) != IVAS_ERR_OK ) + ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) #endif #else #ifdef FIX_356_ISM_METADATA_SYNC @@ -803,9 +801,8 @@ ivas_error ivas_td_binaural_renderer_ext( #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, #endif - ism_md_subframe_update_ext, output, output_frame ) ) != IVAS_ERR_OK ) + ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, output, output_frame ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, #ifdef EXTERNAL_ORIENTATIONS @@ -814,9 +811,8 @@ ivas_error ivas_td_binaural_renderer_ext( #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, #endif - output, output_frame ) ) != IVAS_ERR_OK ) + ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) #endif #endif { diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index e540b3c083..01c2428d43 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -566,7 +566,11 @@ ivas_error ivas_rend_crendProcessSubframe( const AUDIO_CONFIG inConfig, /* i : input audio configuration */ const AUDIO_CONFIG outConfig, /* i : output audio configuration */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ +#else const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ +#endif const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index f02380e6b0..4ea4d03f9f 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -865,6 +865,11 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->Rmat_prev[j][j] = 1.0f; } + set_zero( ( *hCombinedOrientationData )->chEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( ( *hCombinedOrientationData )->chEneIIR[1], MASA_FREQUENCY_BANDS ); + set_zero( ( *hCombinedOrientationData )->procChEneIIR[0], MASA_FREQUENCY_BANDS ); + set_zero( ( *hCombinedOrientationData )->procChEneIIR[1], MASA_FREQUENCY_BANDS ); + return IVAS_ERR_OK; } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 09e5710ed4..79b96a08fc 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -314,6 +314,8 @@ typedef struct ivas_combined_orientation_struct IVAS_QUATERNION Quaternions_ext_interpolation_target; float Rmat[MAX_PARAM_SPATIAL_SUBFRAMES][3][3]; float Rmat_prev[3][3]; + float chEneIIR[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ + float procChEneIIR[2][MASA_FREQUENCY_BANDS]; } COMBINED_ORIENTATION_DATA, *COMBINED_ORIENTATION_HANDLE; #endif diff --git a/lib_util/rotation_file_reader.c b/lib_util/rotation_file_reader.c index 3aac8ddb95..3524d06869 100644 --- a/lib_util/rotation_file_reader.c +++ b/lib_util/rotation_file_reader.c @@ -93,127 +93,48 @@ ivas_error RotationFileReader_open( * Read values from the trajectory file *-----------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING ivas_error HeadRotationFileReading( - RotFileReader *rotReader, /* i/o: RotFileReader handle */ -#ifdef TD5 - IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_POSITION *pPos /* o : listener position */ -#else - IVAS_QUATERNION *pQuaternion /* o : head-tracking data */ -#endif + RotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_VECTOR3 *pPos /* o : listener position */ ) { float w, x, y, z; -#ifdef TD5 float posx, posy, posz; int32_t read_values; posx = 0.0f; posy = 0.0f; posz = 0.0f; -#endif -#ifdef TD5 - read_values = fscanf( rotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); + read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ -#else - if ( 4 != fscanf( rotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) ) -#endif { - if ( feof( rotReader->trajFile ) ) + if ( feof( headRotReader->trajFile ) ) { - rewind( rotReader->trajFile ); - rotReader->fileRewind = true; -#ifdef TD5 - return HeadRotationFileReading( rotReader, pQuaternion, pPos ); -#else - return HeadRotationFileReading( rotReader, pQuaternion ); -#endif + rewind( headRotReader->trajFile ); + headRotReader->fileRewind = true; + return HeadRotationFileReading( headRotReader, pQuaternion, pPos ); } return IVAS_ERR_FAILED_FILE_PARSE; } - ( rotReader->frameCounter )++; + ( headRotReader->frameCounter )++; pQuaternion->w = w; pQuaternion->x = x; pQuaternion->y = y; pQuaternion->z = z; -#ifdef TD5 if ( pPos != NULL ) { pPos->x = posx; pPos->y = posy; pPos->z = posz; } -#endif return IVAS_ERR_OK; } -#else -ivas_error HeadRotationFileReading( - RotFileReader *rotReader, /* i/o: RotFileReader handle */ - IVAS_QUATERNION *Quaternions, /* o : head-tracking data, listener orientation */ -#ifdef TD5 - IVAS_POSITION *Pos /* o : listener position */ -#else - const int32_t frame_dec /* i : decoded frame number */ -#endif -) -{ - uint16_t i; - float w, x, y, z; -#ifdef TD5 - float posx, posy, posz; - int32_t read_values; - - posx = 0.0f; - posy = 0.0f; - posz = 0.0f; -#endif - - for ( i = 0; i < IVAS_MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { -#ifdef TD5 - read_values = fscanf( rotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); - if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ -#else - if ( 4 != fscanf( rotReader->trajFile, "%f,%f,%f,%f", &w, &x, &y, &z ) ) -#endif - { - if ( feof( rotReader->trajFile ) ) - { - rewind( rotReader->trajFile ); - rotReader->fileRewind = true; -#ifdef TD5 - return HeadRotationFileReading( rotReader, Quaternions, Pos ); -#else - return HeadRotationFileReading( rotReader, Quaternions, frame_dec ); -#endif - } - return IVAS_ERR_FAILED_FILE_PARSE; - } - - ( rotReader->frameCounter )++; - - Quaternions[i].w = w; - Quaternions[i].x = x; - Quaternions[i].y = y; - Quaternions[i].z = z; -#ifdef TD5 - Pos[i].x = posx; - Pos[i].y = posy; - Pos[i].z = posz; -#endif - } - - return IVAS_ERR_OK; -} -#endif - - /*-----------------------------------------------------------------------* * ExternalOrientationFileReading() * diff --git a/lib_util/rotation_file_reader.h b/lib_util/rotation_file_reader.h index 0725e5e5d7..60053dc4d4 100644 --- a/lib_util/rotation_file_reader.h +++ b/lib_util/rotation_file_reader.h @@ -58,27 +58,11 @@ ivas_error RotationFileReader_open( * Read values from the trajectory file *-----------------------------------------------------------------------*/ -#ifdef FIX_I109_ORIENTATION_TRACKING ivas_error HeadRotationFileReading( - RotFileReader *rotReader, /* i/o: RotFileReader handle */ -#ifdef TD5 - IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_POSITION *pPos /* o : listener position */ -#else - IVAS_QUATERNION *pQuaternion /* o : head-tracking data */ -#endif + RotFileReader *headRotReader, /* i/o: RotFileReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_VECTOR3 *pPos /* o : listener position */ ); -#else -ivas_error HeadRotationFileReading( - RotFileReader *rotReader, /* i/o: RotFileReader handle */ - IVAS_QUATERNION *Quaternions, /* o : head-tracking data */ -#ifdef TD5 - IVAS_POSITION *Pos /* o : listener position */ -#else - const int32_t frame_dec /* i : decoded frame number */ -#endif -); -#endif /*-----------------------------------------------------------------------* * ExternalOrientationFileReading() -- GitLab From eae183ca62a5b344a8f66f72ef0c018ff4c8af73 Mon Sep 17 00:00:00 2001 From: Eleni Fotopoulou Date: Tue, 6 Jun 2023 09:58:02 +0200 Subject: [PATCH 189/381] cleanup todo for updating old_fpitchFB as unnecessary --- lib_dec/dec_tcx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/dec_tcx.c b/lib_dec/dec_tcx.c index 8a574c95f6..78ce952276 100644 --- a/lib_dec/dec_tcx.c +++ b/lib_dec/dec_tcx.c @@ -1742,7 +1742,7 @@ void decoder_tcx_imdct( if ( st->element_mode > EVS_MONO ) { - st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; /* TODO - or maybe used min(L_frame_TCX,L_FRAME48k) ... */ + st->old_fpitchFB = st->old_fpitch * (float) L_frameTCX_glob / (float) L_frame_glob; } else { -- GitLab From 9d653a895dbb8a55a8f99d5812e5e5f8854dba9c Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 6 Jun 2023 11:13:51 +0200 Subject: [PATCH 190/381] Removal of use_brir and late_reverb_on flags from renderer configuration --- lib_dec/ivas_init_dec.c | 2 +- lib_dec/ivas_output_config.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index b6475610bd..9e48eab6e1 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -2259,7 +2259,7 @@ static ivas_error doSanityChecks_IVAS( #ifdef DEBUGGING #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != AUDIO_CONFIG_BINAURAL && output_config != AUDIO_CONFIG_BINAURAL ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) + if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != AUDIO_CONFIG_BINAURAL && output_config != AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) #else if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode != MC_MODE_MCT && st_ivas->mc_mode != MC_MODE_PARAMUPMIX ) ) ) ) #endif diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 0bc2227468..8bf6f8771f 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -87,7 +87,7 @@ void ivas_renderer_select( if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( output_config == AUDIO_CONFIG_BINAURAL ) #endif @@ -102,7 +102,7 @@ void ivas_renderer_select( else /* ISM_MODE_DISC */ { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( output_config == AUDIO_CONFIG_BINAURAL ) + if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) #else if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) #endif -- GitLab From 99d7755b1f5c469499a75ff37087dd0b4cb3a2ac Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Jun 2023 12:16:22 +0300 Subject: [PATCH 191/381] Remove comment, fix function call in dirac dec bin --- lib_rend/ivas_dirac_dec_binaural_functions.c | 2 +- lib_rend/ivas_rotation.c | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index dfb51b0691..465fc003c7 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -753,7 +753,7 @@ static void ivas_dirac_dec_binaural_internal( #ifdef JBM_TSM_ON_TCS adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); - ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_ImagBuffer_in, Cldfb_RealBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); + ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); #else adaptTransportSignalsHeadtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 4ea4d03f9f..7019ba40d2 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -1105,20 +1105,6 @@ ivas_error combine_external_and_head_orientations( } } - // TODO(Nokia): remove this before merging to main - ////////////////////////////////////////////////////////////////////////// - /* Uncomment below to round the combined quaternions. Rounded values should get rid of numerical errors and - * the output should be BE.*/ - /*for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - float divFloat = 10000.0f; - hCombinedOrientationData->Quaternions[i].w = roundf(hCombinedOrientationData->Quaternions[i].w * divFloat) / divFloat; - hCombinedOrientationData->Quaternions[i].x = roundf(hCombinedOrientationData->Quaternions[i].x * divFloat) / divFloat; - hCombinedOrientationData->Quaternions[i].y = roundf(hCombinedOrientationData->Quaternions[i].y * divFloat) / divFloat; - hCombinedOrientationData->Quaternions[i].z = roundf(hCombinedOrientationData->Quaternions[i].z * divFloat) / divFloat; - }*/ - ////////////////////////////////////////////////////////////////////////// - if ( headRotQuaternions != NULL || hExtOrientationData != NULL ) { /* Calculate the combined rotation matrix */ -- GitLab From 1f5ccf62fc061aff3a4d95777b4f3696129bfe27 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 6 Jun 2023 11:27:36 +0200 Subject: [PATCH 192/381] [fix] minor improvements and add a warning when both LFE position and matrix are configured as on CLI --- apps/renderer.c | 50 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index b00a5c01af..84d616af1e 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -94,7 +94,7 @@ typedef struct float lfe_azi; float lfe_ele; float lfe_gain_dB; - char lfe_pan_mtx[FILENAME_MAX]; + char lfe_routing_mtx[FILENAME_MAX]; } LfeRoutingConfig; #endif typedef struct @@ -828,7 +828,11 @@ int main( { if ( args.lfePanningEnabled ) { +#ifdef FIX_296_CFG_LFE_SCENE_DESC + fprintf( stderr, "Warning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); +#else fprintf( stdout, "Warning LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); +#endif args.lfePanningEnabled = false; } @@ -854,9 +858,9 @@ int main( if ( lfeRoutingConfigs[i] != NULL ) { /* prioritise panning matrix if configured */ - if ( lfeRoutingConfigs[i]->lfe_pan_mtx[0] != '\0' ) + if ( !isEmptyString( lfeRoutingConfigs[i]->lfe_routing_mtx ) ) { - if ( ( error = parseLfePanMtxFile( lfeRoutingConfigs[i]->lfe_pan_mtx, &lfePanMatrix ) ) != IVAS_ERR_OK ) + if ( ( error = parseLfePanMtxFile( lfeRoutingConfigs[i]->lfe_routing_mtx, &lfePanMatrix ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); @@ -1953,10 +1957,10 @@ LfeRoutingConfig *LfeRoutingConfig_open( LfeRoutingConfig *lrc; lrc = (LfeRoutingConfig *) malloc( sizeof( LfeRoutingConfig ) ); - lrc->lfe_azi = 0; - lrc->lfe_ele = 0; - lrc->lfe_gain_dB = 0; - lrc->lfe_pan_mtx[0] = '\0'; + lrc->lfe_azi = 0.f; + lrc->lfe_ele = 0.f; + lrc->lfe_gain_dB = 0.f; + lrc->lfe_routing_mtx[0] = '\0'; return lrc; } @@ -2520,23 +2524,37 @@ static void parseMc( /* Read optional values */ #ifdef FIX_296_CFG_LFE_SCENE_DESC + bool lfe_panningEnabled; float lfe_gain_dB, lfe_azi, lfe_ele; - char lfe_pan_mtx[FILENAME_MAX]; + char lfe_routing_mtx[FILENAME_MAX]; - parseOptionalInputValues( line, &lfe_gain_dB, &lfe_azi, &lfe_ele, lfe_pan_mtx, &inConfig->multiChannelBuses[idx].gain_dB ); + parseOptionalInputValues( line, &lfe_gain_dB, &lfe_azi, &lfe_ele, lfe_routing_mtx, &inConfig->multiChannelBuses[idx].gain_dB ); - if ( ( lfe_gain_dB != 0.f || lfe_azi != 0.f || lfe_ele != 0.f ) || - ( lfe_pan_mtx[0] != '\0' ) ) + lfe_panningEnabled = ( lfe_gain_dB != 0.f || lfe_azi != 0.f || lfe_ele != 0.f ) ? true : false; + + if ( lfe_panningEnabled && !isEmptyString( lfe_routing_mtx ) ) + { + fprintf( stderr, "Warning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); + lfe_panningEnabled = false; + } + + if ( lfe_panningEnabled || !isEmptyString( lfe_routing_mtx ) ) { /* a configuration was specified, set the values */ lfeRoutingConfigs[idx] = LfeRoutingConfig_open(); - lfeRoutingConfigs[idx]->lfe_gain_dB = lfe_gain_dB; - lfeRoutingConfigs[idx]->lfe_azi = lfe_azi; - lfeRoutingConfigs[idx]->lfe_ele = lfe_ele; + if ( lfe_panningEnabled ) + { + lfeRoutingConfigs[idx]->lfe_gain_dB = lfe_gain_dB; + lfeRoutingConfigs[idx]->lfe_azi = lfe_azi; + lfeRoutingConfigs[idx]->lfe_ele = lfe_ele; + } - strncpy( lfeRoutingConfigs[idx]->lfe_pan_mtx, lfe_pan_mtx, FILENAME_MAX ); - convert_backslash( lfeRoutingConfigs[idx]->lfe_pan_mtx ); + if ( !isEmptyString( lfe_routing_mtx ) ) + { + strncpy( lfeRoutingConfigs[idx]->lfe_routing_mtx, lfe_routing_mtx, FILENAME_MAX ); + convert_backslash( lfeRoutingConfigs[idx]->lfe_routing_mtx ); + } } #else parseOptionalInputValues( line, &inConfig->multiChannelBuses[idx].gain_dB ); -- GitLab From d72b2f68f721e700f054b58fb3e05acac1bdcf17 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 6 Jun 2023 09:59:57 +0000 Subject: [PATCH 193/381] Update ivas_ism_param_dec.c --- lib_dec/ivas_ism_param_dec.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index da4ce92107..086e8a36a8 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -1131,9 +1131,9 @@ void ivas_ism_dec_digest_tc( /* we have a full frame interpolator, adapt it */ /* for BE testing */ - if ( ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ) == st_ivas->hTcBuffer->n_samples_available ) + if ( ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ) == st_ivas->hTcBuffer->n_samples_available ) { - int16_t interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ); + int16_t interpolator_length = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { st_ivas->hIsmRendererData->interpolator[0] = 0.0f; @@ -1152,9 +1152,7 @@ void ivas_ism_dec_digest_tc( } else { - ivas_jbm_dec_get_adapted_linear_interpolator( (int16_t) ( st_ivas->hDecoderConfig->output_Fs / (int32_t) FRAMES_PER_SECOND ), - st_ivas->hTcBuffer->n_samples_available, - st_ivas->hIsmRendererData->interpolator ); + ivas_jbm_dec_get_adapted_linear_interpolator( (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ), st_ivas->hTcBuffer->n_samples_available, st_ivas->hIsmRendererData->interpolator ); } /* also get the gains here */ num_objects = st_ivas->nchan_transport; -- GitLab From 88bd93b65114d5984bd1cec06320af7eb1a77d6d Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Jun 2023 13:28:30 +0300 Subject: [PATCH 194/381] Remove combined orientation test file and trajectories --- .../const030_enableHead_noExt.csv | 4 - .../const030_noHead_enableExt.csv | 4 - .../trajectories/const030_noHead_noExt.csv | 4 - scripts/trajectories/const_minus030.csv | 4 - tests/test_combined_orientations.py | 181 ------------------ 5 files changed, 197 deletions(-) delete mode 100644 scripts/trajectories/const030_enableHead_noExt.csv delete mode 100644 scripts/trajectories/const030_noHead_enableExt.csv delete mode 100644 scripts/trajectories/const030_noHead_noExt.csv delete mode 100644 scripts/trajectories/const_minus030.csv delete mode 100644 tests/test_combined_orientations.py diff --git a/scripts/trajectories/const030_enableHead_noExt.csv b/scripts/trajectories/const030_enableHead_noExt.csv deleted file mode 100644 index 784bfcf70d..0000000000 --- a/scripts/trajectories/const030_enableHead_noExt.csv +++ /dev/null @@ -1,4 +0,0 @@ -0.965926,0.00,0.00,0.258819,1,0,0,0 -0.965926,0.00,0.00,0.258819,1,0,0,0 -0.965926,0.00,0.00,0.258819,1,0,0,0 -0.965926,0.00,0.00,0.258819,1,0,0,0 \ No newline at end of file diff --git a/scripts/trajectories/const030_noHead_enableExt.csv b/scripts/trajectories/const030_noHead_enableExt.csv deleted file mode 100644 index 612df07495..0000000000 --- a/scripts/trajectories/const030_noHead_enableExt.csv +++ /dev/null @@ -1,4 +0,0 @@ -0.965926,0.00,0.00,0.258819,0,1,0,0 -0.965926,0.00,0.00,0.258819,0,1,0,0 -0.965926,0.00,0.00,0.258819,0,1,0,0 -0.965926,0.00,0.00,0.258819,0,1,0,0 \ No newline at end of file diff --git a/scripts/trajectories/const030_noHead_noExt.csv b/scripts/trajectories/const030_noHead_noExt.csv deleted file mode 100644 index 3272ad33bc..0000000000 --- a/scripts/trajectories/const030_noHead_noExt.csv +++ /dev/null @@ -1,4 +0,0 @@ -0.965926,0.00,0.00,0.258819,0,0,0,0 -0.965926,0.00,0.00,0.258819,0,0,0,0 -0.965926,0.00,0.00,0.258819,0,0,0,0 -0.965926,0.00,0.00,0.258819,0,0,0,0 \ No newline at end of file diff --git a/scripts/trajectories/const_minus030.csv b/scripts/trajectories/const_minus030.csv deleted file mode 100644 index 9a6e49a63d..0000000000 --- a/scripts/trajectories/const_minus030.csv +++ /dev/null @@ -1,4 +0,0 @@ --0.965926,-0.00,0.00,0.258819 --0.965926,-0.00,0.00,0.258819 --0.965926,-0.00,0.00,0.258819 --0.965926,-0.00,0.00,0.258819 \ No newline at end of file diff --git a/tests/test_combined_orientations.py b/tests/test_combined_orientations.py deleted file mode 100644 index b6a7148fe4..0000000000 --- a/tests/test_combined_orientations.py +++ /dev/null @@ -1,181 +0,0 @@ -__copyright__ = \ - """ - (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - 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. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - """ - -__doc__ = \ - """ - Test file to run C encoder and decoder code. - The outputs are compared with C generated references. - """ - -import os -import errno -import pytest - -from cmp_pcm import cmp_pcm -from conftest import EncoderFrontend, DecoderFrontend - -# params -input_mode_list = ['ism', 'sba', 'masa', 'mc'] -output_mode_list = ['BINAURAL', 'BINAURAL_ROOM'] -ivas_br_list = [13200, 16400, 24400, 32000, 48000, 64000, 80000, - 96000, 128000, 160000, 192000, 256000, 384000, 512000] - -head_ext_reference_list = [# Head rotation disabled, constant 30 degree external orientation --> output should be flipped external orientation, constant -30 degrees - ('full-circle-4s.csv', 'const030_noHead_enableExt.csv', 'const_minus030.csv'), - # Constant 240 degree head rotation, ext orientation disabled --> output should be same as head rotation, constant 240 degrees - ('const240.csv', 'const030_enableHead_noExt.csv', 'const240.csv'), - # Head rotation disabled, external orientation disabled --> output should be same as no rotation applied - ('full-circle-4s.csv', 'const030_noHead_noExt.csv', None, 'const000.csv'), - # Constant 30 degrees head rotation, constant 30 degrees external orientation --> rotations counter each other, output should be zero rotations (due to numerical errors the output is not exactly BE) - ('const030.csv', 'const030.csv', 'const000.csv')] - - -def check_and_makedir(dir_path): - if not os.path.exists(dir_path): - try: - os.makedirs(dir_path) - except OSError as e: - if e.errno != errno.EEXIST: - raise # raises the error again - - -@pytest.mark.parametrize("input_mode", input_mode_list) -@pytest.mark.parametrize("output_mode", output_mode_list) -@pytest.mark.parametrize("ivas_br", ivas_br_list) -@pytest.mark.parametrize("head_ext_reference", head_ext_reference_list) -def test_combined_orientations( - dut_encoder_frontend: EncoderFrontend, - dut_decoder_frontend: DecoderFrontend, - ref_encoder_path, - ref_decoder_path, - reference_path, - dut_base_path, - ivas_br, - head_ext_reference, - test_vector_path, - input_mode, - output_mode, -): - if input_mode == "ism" and ivas_br < 24400: - pytest.skip("ISM4 supported for bitrates above and including 24.4kbps") - - # Input parameters - in_fs = 48 - out_fs = 48 - out_fs_hz = 48000 - head_rotation_file = head_ext_reference[0] - ext_orientation_file = head_ext_reference[1] - reference_rotation_file = head_ext_reference[2] - head_rotation_file_path = f"{test_vector_path}/../trajectories/{head_rotation_file}" - ext_orientation_file_path = f"{test_vector_path}/../trajectories/{ext_orientation_file}" - - # Set reference encoder and decoder - if ref_encoder_path is None and ref_decoder_path is None: - ref_encoder_frontend = dut_encoder_frontend - ref_decoder_frontend = dut_decoder_frontend - else: - ref_encoder_frontend = EncoderFrontend(ref_encoder_path, "REF") - ref_decoder_frontend = DecoderFrontend(ref_decoder_path, "REF") - - # Set output paths - out_dir_bs_ref = f"{reference_path}/combined_orientations" - out_dir_bs_dut = f"{dut_base_path}/combined_orientations" - check_and_makedir(out_dir_bs_ref) - check_and_makedir(out_dir_bs_dut) - output_bitstream_ref = f"{out_dir_bs_ref}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_ref.bts" - output_bitstream_dut = f"{out_dir_bs_dut}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}.bts" - dec_output_ref = f"{out_dir_bs_ref}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_ref.wav" - dec_output_dut = f"{out_dir_bs_dut}/inputmode{input_mode}_outputmode{output_mode}_ivasbr{ivas_br}k_head{head_rotation_file}_ext{ext_orientation_file}_ref{reference_rotation_file}_test.wav" - - # Set options - if input_mode == "ism": - input_options = ['-ism', '4', f"{test_vector_path}/stvISM1.csv", f"{test_vector_path}/stvISM2.csv", f"{test_vector_path}/stvISM3.csv", f"{test_vector_path}/stvISM4.csv"] - input_audio_path = f"{test_vector_path}/stv4ISM48s.wav" - elif input_mode == "sba": - input_options = ['-sba', '1'] - input_audio_path = f"{test_vector_path}/stvFOA48c.wav" - elif input_mode == "masa": - input_options = ['-masa', '2', f"{test_vector_path}/stv1MASA2TC48c.met"] - input_audio_path = f"{test_vector_path}/stv1MASA2TC48c.wav" - elif input_mode == "mc": - input_options = ['-mc', '5_1'] - input_audio_path = f"{test_vector_path}/stv51MC48c.wav" - - # In MC binaural output, a different renderer is used if head rotation or external orientation file is detected - # in the input. Instead of not using a head rotation file, use zero head rotation for reference so that the same - # renderer is used in both cases (test head + ext, reference head). - if reference_rotation_file is None and output_mode == "BINAURAL": - reference_rotation_file = head_ext_reference[3] - - test_output_options = ['-T', f"{head_rotation_file_path}", '-EXOF', f"{ext_orientation_file_path}"] - ref_output_options = [] - if reference_rotation_file is not None: - reference_rotation_file_path = f"{test_vector_path}/../trajectories/{reference_rotation_file}" - ref_output_options = ['-T', f"{reference_rotation_file_path}"] - - # Encode - dut_encoder_frontend.run( - ivas_br, - in_fs, - input_audio_path, - output_bitstream_dut, - add_option_list=input_options, - ) - ref_encoder_frontend.run( - ivas_br, - in_fs, - input_audio_path, - output_bitstream_ref, - add_option_list=input_options, - ) - - # Decode head + ext - dut_decoder_frontend.run( - output_mode, - out_fs, - output_bitstream_dut, - dec_output_dut, - add_option_list=test_output_options - ) - - # Decode reference - ref_decoder_frontend.run( - output_mode, - out_fs, - output_bitstream_ref, - dec_output_ref, - add_option_list=ref_output_options - ) - - # Compare audio outputs - cmp_result, reason = cmp_pcm(dec_output_ref, dec_output_dut, output_mode, out_fs_hz) - # Report compare result - assert cmp_result == 0, reason -- GitLab From 2c54435f175749d0f2e827f641d02d2c3f3b7a0b Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Jun 2023 13:53:15 +0300 Subject: [PATCH 195/381] Add missing combined orientations in renderer path --- lib_dec/ivas_objectRenderer_internal.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 1a54c5ab75..ba2b025559 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -207,8 +207,14 @@ ivas_error ivas_td_binaural_renderer_sf( #endif /* Update the listener's location/orientation */ - TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, st_ivas->hDecoderConfig->Opt_Headrotation, + TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, +#ifdef EXTERNAL_ORIENTATIONS + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] : 0, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, +#else + st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? &st_ivas->hHeadTrackData->Quaternions[0] : NULL, +#endif ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL ); if ( ( st_ivas->hRenderConfig != NULL ) && ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) -- GitLab From bef45eff889912e5b42ec265cf922f3014057b38 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Jun 2023 14:06:27 +0300 Subject: [PATCH 196/381] Run clang-format --- apps/decoder.c | 4 +- lib_dec/ivas_binRenderer_internal.c | 4 +- lib_dec/ivas_dec.c | 4 +- lib_dec/ivas_dirac_dec.c | 8 +-- lib_dec/ivas_ism_renderer.c | 5 +- lib_dec/lib_dec.c | 14 ++--- lib_rend/ivas_crend.c | 38 ++++++------- lib_rend/ivas_dirac_dec_binaural_functions.c | 48 +++++++++++----- lib_rend/ivas_objectRenderer.c | 34 +++++------ lib_rend/ivas_rotation.c | 59 ++++++++++---------- lib_rend/ivas_stat_rend.h | 10 ++-- lib_rend/lib_rend.c | 50 ++++++++--------- lib_util/rotation_file_reader.c | 26 ++++----- lib_util/rotation_file_reader.h | 26 ++++----- 14 files changed, 172 insertions(+), 158 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 0a9fb3c214..d4b2486f9f 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1853,9 +1853,9 @@ static ivas_error decodeG192( { fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), #ifdef EXTERNAL_ORIENTATIONS - RotationFileReader_getFilePath( refRotReader ) ); + RotationFileReader_getFilePath( refRotReader ) ); #else - HeadRotationFileReader_getFilePath( refRotReader ) ); + HeadRotationFileReader_getFilePath( refRotReader ) ); #endif goto cleanup; } diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index d2b592e057..11a8c6e3c1 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1215,8 +1215,8 @@ void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ #ifdef EXTERNAL_ORIENTATIONS - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ - int16_t subframe_idx, /* i : subframe index */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ + int16_t subframe_idx, /* i : subframe index */ #endif #ifdef JBM_TSM_ON_TCS const int16_t numTimeSlots, /* i : number of time slots to render*/ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index dc2100b432..1b6de87287 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -117,8 +117,8 @@ ivas_error ivas_dec( * Combine orientations *----------------------------------------------------------------*/ - if ( ( error = combine_external_and_head_orientations_dec(st_ivas->hHeadTrackData, st_ivas->hExtOrientationData, - st_ivas->hCombinedOrientationData) ) != IVAS_ERR_OK ) + if ( ( error = combine_external_and_head_orientations_dec( st_ivas->hHeadTrackData, st_ivas->hExtOrientationData, + st_ivas->hCombinedOrientationData ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 10c161e47d..970ec57ff5 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2898,9 +2898,9 @@ void ivas_dirac_dec_render_sf( #ifdef EXTERNAL_ORIENTATIONS p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[subframe_idx][0][0]; #else - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); - p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; + p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; #endif if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) @@ -3010,7 +3010,7 @@ void ivas_dirac_dec_render_sf( #ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) #else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) #endif { ivas_dirac_dec_compute_directional_responses( hDirAC, @@ -3153,7 +3153,7 @@ void ivas_dirac_dec_render_sf( #ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) #else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) #endif { protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 70d84e7b7f..e845831e96 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -182,8 +182,9 @@ void ivas_ism_render( { #ifdef EXTERNAL_ORIENTATIONS /* Combined rotation: rotate the object positions depending the head and external orientations */ - if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1) { - rotateAziEle(st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup); + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); #else /* Head rotation: rotate the object positions depending the head's orientation */ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index e36043b47f..9315c8cd5a 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -449,7 +449,7 @@ ivas_error IVAS_DEC_Configure( const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ #ifdef EXTERNAL_ORIENTATIONS - const int16_t enableExternalOrientation, /* i : enable external orientations */ + const int16_t enableExternalOrientation, /* i : enable external orientations */ #endif #ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ @@ -1382,12 +1382,12 @@ ivas_error IVAS_DEC_FeedRefVectorData( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_FeedExternalOrientationData( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - IVAS_QUATERNION *orientation, /* i : external orientation data */ - int8_t *enableHeadRotation, /* i : flag to enable head rotation for this frame */ - int8_t *enableExternalOrientation, /* i : flag to enable external orientation for this frame */ - int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ - int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + int8_t *enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ ) { EXTERNAL_ORIENTATION_HANDLE hExternalOrientationData; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 5adf8976a3..4ae721b0a9 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1497,7 +1497,7 @@ ivas_error ivas_rend_crendProcess( int8_t combinedOrientationEnabled; combinedOrientationEnabled = 0; - if (hCombinedOrientationData != NULL ) + if ( hCombinedOrientationData != NULL ) { for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { @@ -1616,22 +1616,22 @@ ivas_error ivas_rend_crendProcess( *-----------------------------------------------------------------------------------------*/ ivas_error ivas_rend_crendProcessSubframe( - const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ - const AUDIO_CONFIG inConfig, /* i : input audio configuration */ - const AUDIO_CONFIG outConfig, /* i : output audio configuration */ - const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ #else const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ #endif - const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ - DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ - float *input_f[], /* i : transport channels */ - float *output[], /* i/o: input/output audio channels */ - const int16_t n_samples_to_render, /* i : output frame length per channel */ - const int32_t output_Fs /* i : output sampling rate */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + float *input_f[], /* i : transport channels */ + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int32_t output_Fs /* i : output sampling rate */ ) { int16_t subframe_idx, subframe_len; @@ -1648,7 +1648,7 @@ ivas_error ivas_rend_crendProcessSubframe( int8_t combinedOrientationEnabled; combinedOrientationEnabled = 0; - if (hCombinedOrientationData != NULL ) + if ( hCombinedOrientationData != NULL ) { for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { @@ -1721,22 +1721,22 @@ ivas_error ivas_rend_crendProcessSubframe( { rotateFrame_shd( #ifdef EXTERNAL_ORIENTATIONS - hCombinedOrientationData, + hCombinedOrientationData, #else - hHeadTrackData, + hHeadTrackData, #endif - tc_local, subframe_len, *hIntSetup, 0 ); + tc_local, subframe_len, *hIntSetup, 0 ); } /* Rotation in SD for MC -> BINAURAL_ROOM */ else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) { rotateFrame_sd( #ifdef EXTERNAL_ORIENTATIONS - hCombinedOrientationData, + hCombinedOrientationData, #else - hHeadTrackData, + hHeadTrackData, #endif - tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 ); + tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 ); } } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 465fc003c7..97ea070750 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -73,13 +73,17 @@ static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, #ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, #endif - float *output_f[], const int16_t nchan_transport, const int16_t subframe ); + float *output_f[], + const int16_t nchan_transport, + const int16_t subframe ); #else static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, #ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, #endif - float output_f[][L_FRAME48k], const int16_t nchan_transport, const int16_t subframe ); + float output_f[][L_FRAME48k], + const int16_t nchan_transport, + const int16_t subframe ); #endif static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); @@ -92,37 +96,51 @@ static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, flo static void adaptTransportSignalsHeadtracked( #ifdef EXTERNAL_ORIENTATIONS - COMBINED_ORIENTATION_HANDLE hHeadTrackData, + COMBINED_ORIENTATION_HANDLE hHeadTrackData, #else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, + HEAD_TRACK_DATA_HANDLE hHeadTrackData, #endif - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + const int16_t nSlots, + float Rmat[3][3] ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( #ifdef EXTERNAL_ORIENTATIONS - COMBINED_ORIENTATION_HANDLE hHeadTrackData, + COMBINED_ORIENTATION_HANDLE hHeadTrackData, #else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, + HEAD_TRACK_DATA_HANDLE hHeadTrackData, #endif - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + const int16_t nSlots, + float Rmat[3][3] ); #else static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); static void adaptTransportSignalsHeadtracked( #ifdef EXTERNAL_ORIENTATIONS - COMBINED_ORIENTATION_HANDLE hHeadTrackData, + COMBINED_ORIENTATION_HANDLE hHeadTrackData, #else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, + HEAD_TRACK_DATA_HANDLE hHeadTrackData, #endif - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + float Rmat[3][3] ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( #ifdef EXTERNAL_ORIENTATIONS - COMBINED_ORIENTATION_HANDLE hHeadTrackData, + COMBINED_ORIENTATION_HANDLE hHeadTrackData, #else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, + HEAD_TRACK_DATA_HANDLE hHeadTrackData, #endif - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + float Rmat[3][3] ); #endif static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); @@ -436,7 +454,7 @@ void ivas_dirac_dec_binaural_render( *------------------------------------------------------------------------*/ void ivas_dirac_dec_binaural( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ #ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ #endif diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index c089812b21..5d00f9e915 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -261,19 +261,19 @@ ivas_error ivas_td_binaural_renderer_unwrap( const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ #ifdef EXTERNAL_ORIENTATIONS - const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ + const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ #else - const int16_t Opt_Headrotation, /* i : Head rotation flag */ + const int16_t Opt_Headrotation, /* i : Head rotation flag */ #endif - const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ #ifdef FIX_356_ISM_METADATA_SYNC const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ #endif #ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ #else - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ + float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ #endif const int16_t output_frame /* i : output frame length */ ) @@ -696,10 +696,10 @@ ivas_error ivas_td_binaural_open_ext( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_ext( - const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ - const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ - const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ #endif @@ -774,8 +774,8 @@ ivas_error ivas_td_binaural_renderer_ext( #ifdef FIX_356_ISM_METADATA_SYNC if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, #ifdef EXTERNAL_ORIENTATIONS - (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, - (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, @@ -784,8 +784,8 @@ ivas_error ivas_td_binaural_renderer_ext( #else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, #ifdef EXTERNAL_ORIENTATIONS - (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, - (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, @@ -796,8 +796,8 @@ ivas_error ivas_td_binaural_renderer_ext( #ifdef FIX_356_ISM_METADATA_SYNC if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, #ifdef EXTERNAL_ORIENTATIONS - (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, - (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, @@ -806,8 +806,8 @@ ivas_error ivas_td_binaural_renderer_ext( #else if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, #ifdef EXTERNAL_ORIENTATIONS - (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, - (hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 7019ba40d2..8efa0dc676 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -257,7 +257,7 @@ void rotateFrame_shd( #ifdef JBM_TSM_ON_TCS float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ #else - float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ + float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ #endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -379,7 +379,7 @@ void rotateFrame_sd( #ifdef JBM_TSM_ON_TCS float *output[], /* i/o: unrotated SD signal buffer in TD */ #else - float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ + float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ #endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -629,9 +629,9 @@ void rotateFrame_shd_cldfb( void rotateFrame_sd_cldfb( #ifdef EXTERNAL_ORIENTATIONS - float Rmat[3][3], /* i : real-space rotation matrix */ + float Rmat[3][3], /* i : real-space rotation matrix */ #else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ #endif float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ @@ -818,7 +818,7 @@ void ivas_external_orientation_close( *-----------------------------------------------------------------------*/ ivas_error ivas_combined_orientation_open( - COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* o : combined orientation handle */ + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* o : combined orientation handle */ ) { int16_t i, j; @@ -852,14 +852,14 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->Quaternions_prev_headRot[i] = identity; ( *hCombinedOrientationData )->Quaternions_prev_extOrientation[i] = identity; - for ( j = 0; j < 3; j++) + for ( j = 0; j < 3; j++ ) { set_zero( ( *hCombinedOrientationData )->Rmat[i][j], 3 ); ( *hCombinedOrientationData )->Rmat[i][j][j] = 1.0f; } } - for ( j = 0; j < 3; j++) + for ( j = 0; j < 3; j++ ) { set_zero( ( *hCombinedOrientationData )->Rmat_prev[j], 3 ); ( *hCombinedOrientationData )->Rmat_prev[j][j] = 1.0f; @@ -881,7 +881,7 @@ ivas_error ivas_combined_orientation_open( *-----------------------------------------------------------------------*/ void ivas_combined_orientation_close( - COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ + COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData /* i/o: combined orientation handle */ ) { if ( hCombinedOrientationData == NULL || *hCombinedOrientationData == NULL ) @@ -903,9 +903,9 @@ void ivas_combined_orientation_close( *------------------------------------------------------------------------*/ ivas_error combine_external_and_head_orientations_dec( - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) { IVAS_QUATERNION *headRotQuaternions = NULL; @@ -920,7 +920,7 @@ ivas_error combine_external_and_head_orientations_dec( } } - return combine_external_and_head_orientations(headRotQuaternions, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData); + return combine_external_and_head_orientations( headRotQuaternions, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData ); } @@ -931,9 +931,9 @@ ivas_error combine_external_and_head_orientations_dec( *------------------------------------------------------------------------*/ ivas_error combine_external_and_head_orientations_rend( - IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ - EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ + IVAS_REND_HeadRotData *hHeadTrackData, /* i : head track handle */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) { IVAS_QUATERNION *headRotQuaternions = NULL; @@ -959,7 +959,7 @@ ivas_error combine_external_and_head_orientations_rend( } } - return combine_external_and_head_orientations(headRotQuaternions, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData); + return combine_external_and_head_orientations( headRotQuaternions, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData ); } @@ -971,10 +971,10 @@ ivas_error combine_external_and_head_orientations_rend( *------------------------------------------------------------------------*/ ivas_error combine_external_and_head_orientations( - IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ - int16_t numHeadRotQuaternions, /* i : number of head rotation quaternions */ - EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ + IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ + int16_t numHeadRotQuaternions, /* i : number of head rotation quaternions */ + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ ) { int16_t i, j; @@ -986,7 +986,7 @@ ivas_error combine_external_and_head_orientations( /* Form combined orientations or return if no data available */ if ( hCombinedOrientationData == NULL ) { - if ( headRotQuaternions != NULL || hExtOrientationData != NULL) + if ( headRotQuaternions != NULL || hExtOrientationData != NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } @@ -1008,7 +1008,7 @@ ivas_error combine_external_and_head_orientations( hCombinedOrientationData->enableCombinedOrientation[i] = 0; hCombinedOrientationData->Quaternions[i] = identity; - for ( j = 0; j < 3; j++) + for ( j = 0; j < 3; j++ ) { set_zero( hCombinedOrientationData->Rmat[i][j], 3 ); hCombinedOrientationData->Rmat[i][j][j] = 1.0f; @@ -1098,7 +1098,7 @@ ivas_error combine_external_and_head_orientations( } /* Reset the combined orientations to identity */ - if ( hExtOrientationData->enableHeadRotation[i] == 0 && hExtOrientationData->enableExternalOrientation[i] == 0) + if ( hExtOrientationData->enableHeadRotation[i] == 0 && hExtOrientationData->enableExternalOrientation[i] == 0 ) { hCombinedOrientationData->Quaternions[i] = identity; } @@ -1191,7 +1191,7 @@ ivas_error combine_external_and_head_orientations( { for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { - if ( hExtOrientationData->enableExternalOrientation[i] > 0 || ( hExtOrientationData->enableHeadRotation[i] > 0 && numHeadRotQuaternions >= 0 )) + if ( hExtOrientationData->enableExternalOrientation[i] > 0 || ( hExtOrientationData->enableHeadRotation[i] > 0 && numHeadRotQuaternions >= 0 ) ) { hCombinedOrientationData->enableCombinedOrientation[i] = 1; } @@ -1220,10 +1220,9 @@ ivas_error combine_external_and_head_orientations( *------------------------------------------------------------------------*/ void external_target_interpolation( - EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientation handle */ - const int16_t i -) + EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i/o: combined orientation handle */ + const int16_t i ) { /* Sanity check for number of frames */ hExtOrientationData->numFramesToTargetOrientation[i] = min( hExtOrientationData->numFramesToTargetOrientation[i], hCombinedOrientationData->maximumFramesToTargetOrientation ); @@ -1251,7 +1250,6 @@ void external_target_interpolation( hCombinedOrientationData->isInterpolationOngoing = TRUE; QuaternionSlerp( hCombinedOrientationData->Quaternions_ext_interpolation_start, hCombinedOrientationData->Quaternions_ext_interpolation_target, hCombinedOrientationData->interpolationCoefficient, &hCombinedOrientationData->Quaternions[i] ); hCombinedOrientationData->interpolationCoefficient += hCombinedOrientationData->interpolationIncrement; - } else { @@ -1272,8 +1270,7 @@ void external_target_interpolation( bool are_orientations_same( const IVAS_QUATERNION *orientation1, - const IVAS_QUATERNION *orientation2 -) + const IVAS_QUATERNION *orientation2 ) { bool orientationsAreSame = true; float error_margin = 0.05f; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 79b96a08fc..c7d2f14a28 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -285,11 +285,11 @@ typedef struct ivas_binaural_head_track_struct typedef struct ivas_external_orientation_struct { - int8_t enableHeadRotation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous rotation */ - int8_t enableExternalOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous orientation */ - int8_t enableRotationInterpolation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable */ - int16_t numFramesToTargetOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Number of frames until target orientation is reached */ - IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; /* External orientation in quaternions */ + int8_t enableHeadRotation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous rotation */ + int8_t enableExternalOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable, 2 - freeze to previous orientation */ + int8_t enableRotationInterpolation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* 0 - disable, 1 - enable */ + int16_t numFramesToTargetOrientation[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Number of frames until target orientation is reached */ + IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES]; /* External orientation in quaternions */ } EXTERNAL_ORIENTATION_DATA, *EXTERNAL_ORIENTATION_HANDLE; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index b4a3d6f469..a9058b0b8b 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2553,7 +2553,6 @@ static DecoderDummy *initDecoderDummy( assert( error == IVAS_ERR_OK ); } #endif - } else { @@ -2652,11 +2651,11 @@ static void freeDecoderDummy( #ifdef EXTERNAL_ORIENTATIONS if ( pDecDummy->hExtOrientationData != NULL ) { - free ( pDecDummy->hExtOrientationData ); + free( pDecDummy->hExtOrientationData ); } if ( pDecDummy->hCombinedOrientationData != NULL ) { - free ( pDecDummy->hCombinedOrientationData ); + free( pDecDummy->hCombinedOrientationData ); } #endif @@ -4122,7 +4121,6 @@ ivas_error IVAS_REND_SetReferenceVector( } - #ifdef EXTERNAL_ORIENTATIONS /*---------------------------------------------------------------------* * IVAS_REND_SetExternalOrientation() @@ -4131,12 +4129,12 @@ ivas_error IVAS_REND_SetReferenceVector( *---------------------------------------------------------------------*/ ivas_error IVAS_REND_SetExternalOrientation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_QUATERNION *orientation, /* i : external orientation data */ - int8_t *enableHeadRotation, /* i : flag to enable head rotation for this frame */ - int8_t *enableExternalOrientation, /* i : flag to enable external orientation for this frame */ - int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ - int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *orientation, /* i : external orientation data */ + int8_t *enableHeadRotation, /* i : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* i : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ + int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ ) { int16_t i; @@ -4178,7 +4176,7 @@ ivas_error IVAS_REND_SetExternalOrientation( *---------------------------------------------------------------------*/ ivas_error IVAS_REND_CombineHeadAndExternalOrientation( - IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ + IVAS_REND_HANDLE hIvasRend /* i/o: Renderer handle */ ) { if ( hIvasRend == NULL ) @@ -4197,8 +4195,8 @@ ivas_error IVAS_REND_CombineHeadAndExternalOrientation( *---------------------------------------------------------------------*/ ivas_error IVAS_REND_GetCombinedOrientation( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer processed orientation */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_QUATERNION *pOrientation /* i/o: Quaternion pointer processed orientation */ ) { int16_t i; @@ -4319,9 +4317,9 @@ static ivas_error rotateFrameMc( #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ #endif - rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ + rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) { int16_t i; @@ -4378,7 +4376,7 @@ static ivas_error rotateFrameMc( { for ( j = 0; j < 3; j++ ) { - Rmat[i][j] = ( * hCombinedOrientationData )->Rmat[subframe_idx][i][j]; + Rmat[i][j] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][j]; } } else @@ -4464,8 +4462,8 @@ static ivas_error rotateFrameSba( #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ #endif - rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ - IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ + rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ + IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) { int16_t i, l, n, m; @@ -4502,7 +4500,7 @@ static ivas_error rotateFrameSba( { for ( l = 0; l < 3; l++ ) { - Rmat[i][l] = ( * hCombinedOrientationData )->Rmat[subframe_idx][i][l]; + Rmat[i][l] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][l]; } } else @@ -4654,11 +4652,11 @@ static ivas_error renderIsmToBinauralRoom( #ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData = ismInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; - if (hCombinedOrientationData != NULL ) + if ( hCombinedOrientationData != NULL ) { for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { - if (( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) { combinedOrientationEnabled = 1; break; @@ -4669,9 +4667,9 @@ static ivas_error renderIsmToBinauralRoom( if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && #ifdef EXTERNAL_ORIENTATIONS - combinedOrientationEnabled ) + combinedOrientationEnabled ) #else - headRotData->headRotEnabled ) + headRotData->headRotEnabled ) #endif { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); @@ -4707,11 +4705,11 @@ static ivas_error renderIsmToBinauralRoom( #ifdef EXTERNAL_ORIENTATIONS for ( i = 0; i < 3; i++ ) { - if (hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) + if ( hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) { for ( j = 0; j < 3; j++ ) { - Rmat[i][j] = ( * hCombinedOrientationData )->Rmat[subframe_idx][i][j]; + Rmat[i][j] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][j]; } } else diff --git a/lib_util/rotation_file_reader.c b/lib_util/rotation_file_reader.c index 3524d06869..42bd6a3ed5 100644 --- a/lib_util/rotation_file_reader.c +++ b/lib_util/rotation_file_reader.c @@ -54,8 +54,8 @@ struct RotFileReader *-----------------------------------------------------------------------*/ ivas_error RotationFileReader_open( - char *trajFilePath, /* i : rotation trajectory file name */ - RotFileReader **rotReader /* o : RotFileReader handle */ + char *trajFilePath, /* i : rotation trajectory file name */ + RotFileReader **rotReader /* o : RotFileReader handle */ ) { RotFileReader *self; @@ -94,9 +94,9 @@ ivas_error RotationFileReader_open( *-----------------------------------------------------------------------*/ ivas_error HeadRotationFileReading( - RotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ - IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_VECTOR3 *pPos /* o : listener position */ + RotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_VECTOR3 *pPos /* o : listener position */ ) { float w, x, y, z; @@ -142,12 +142,12 @@ ivas_error HeadRotationFileReading( *-----------------------------------------------------------------------*/ ivas_error ExternalOrientationFileReading( - RotFileReader *externalOrientationReader, /* i/o: ExternalOrientationReader handle */ - IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ - int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ - int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ - int8_t *enableRotationInterpolation, /* o : flag to enable interpolation between the current and target orientations */ - int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is reached */ + RotFileReader *externalOrientationReader, /* i/o: ExternalOrientationReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ + int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* o : flag to enable interpolation between the current and target orientations */ + int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is reached */ ) { float w, x, y, z; @@ -197,7 +197,7 @@ ivas_error ExternalOrientationFileReading( *-----------------------------------------------------------------------*/ void RotationFileReader_close( - RotFileReader **rotReader /* i/o: RotFileReader handle */ + RotFileReader **rotReader /* i/o: RotFileReader handle */ ) { if ( rotReader == NULL || *rotReader == NULL ) @@ -221,7 +221,7 @@ void RotationFileReader_close( *-----------------------------------------------------------------------*/ const char *RotationFileReader_getFilePath( - RotFileReader *rotReader /* i/o: RotFileReader handle */ + RotFileReader *rotReader /* i/o: RotFileReader handle */ ) { if ( rotReader == NULL ) diff --git a/lib_util/rotation_file_reader.h b/lib_util/rotation_file_reader.h index 60053dc4d4..5f32f4ca09 100644 --- a/lib_util/rotation_file_reader.h +++ b/lib_util/rotation_file_reader.h @@ -48,8 +48,8 @@ typedef struct RotFileReader RotFileReader; *-----------------------------------------------------------------------*/ ivas_error RotationFileReader_open( - char *trajFilePath, /* i : rotation trajectory file name */ - RotFileReader **rotReader /* o : RotFileReader handle */ + char *trajFilePath, /* i : rotation trajectory file name */ + RotFileReader **rotReader /* o : RotFileReader handle */ ); /*-----------------------------------------------------------------------* @@ -59,9 +59,9 @@ ivas_error RotationFileReader_open( *-----------------------------------------------------------------------*/ ivas_error HeadRotationFileReading( - RotFileReader *headRotReader, /* i/o: RotFileReader handle */ - IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_VECTOR3 *pPos /* o : listener position */ + RotFileReader *headRotReader, /* i/o: RotFileReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ + IVAS_VECTOR3 *pPos /* o : listener position */ ); /*-----------------------------------------------------------------------* @@ -71,12 +71,12 @@ ivas_error HeadRotationFileReading( *-----------------------------------------------------------------------*/ ivas_error ExternalOrientationFileReading( - RotFileReader *externalOrientationReader, /* i/o: RotFileReader handle */ - IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ - int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ - int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ - int8_t *enableRotationInterpolation, /* o : flag to enable interpolation between the current and target orientations */ - int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is achieved */ + RotFileReader *externalOrientationReader, /* i/o: RotFileReader handle */ + IVAS_QUATERNION *pQuaternion, /* o : external orientation data */ + int8_t *enableHeadRotation, /* o : flag to enable head rotation for this frame */ + int8_t *enableExternalOrientation, /* o : flag to enable external orientation for this frame */ + int8_t *enableRotationInterpolation, /* o : flag to enable interpolation between the current and target orientations */ + int16_t *numFramesToTargetOrientation /* o : number of frames until target orientation is achieved */ ); /*-----------------------------------------------------------------------* @@ -86,7 +86,7 @@ ivas_error ExternalOrientationFileReading( *-----------------------------------------------------------------------*/ void RotationFileReader_close( - RotFileReader **rotReader /* i/o: RotFileReader handle */ + RotFileReader **rotReader /* i/o: RotFileReader handle */ ); /*-----------------------------------------------------------------------* @@ -96,7 +96,7 @@ void RotationFileReader_close( *-----------------------------------------------------------------------*/ const char *RotationFileReader_getFilePath( - RotFileReader *rotReader /* i/o: RotFileReader handle */ + RotFileReader *rotReader /* i/o: RotFileReader handle */ ); -- GitLab From 2f98af4b5f3e36c5a8d3d435602ff5651aa7df26 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Tue, 6 Jun 2023 13:10:54 +0200 Subject: [PATCH 197/381] remove obsolete ToDo concerning the ducker in the DirAC CLDFB decorrelator --- lib_dec/ivas_dirac_decorr_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_dirac_decorr_dec.c b/lib_dec/ivas_dirac_decorr_dec.c index 8c19d9698b..5e156a38b2 100644 --- a/lib_dec/ivas_dirac_decorr_dec.c +++ b/lib_dec/ivas_dirac_decorr_dec.c @@ -156,7 +156,7 @@ ivas_error ivas_dirac_dec_decorr_open( freq_domain_decorr_ap_params->max_frequency = ( DIRAC_MAX_DECORR_CLDFB_BANDS * 24000 ) / CLDFB_NO_CHANNELS_MAX; } - freq_domain_decorr_ap_params->use_ducker = 1; /* ToDo: fcs: fixed for now but can be adaptive in an extended version */ + freq_domain_decorr_ap_params->use_ducker = 1; assert( ( freq_domain_decorr_ap_params->max_frequency >= 0 ) && ( freq_domain_decorr_ap_params->max_frequency <= output_Fs / 2 ) && "Error: max_frequency invalid!" ); -- GitLab From 3a1b42afde5e18b2cf03d472d40b9457b3d317d7 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 6 Jun 2023 14:54:26 +0300 Subject: [PATCH 198/381] Fixes to merge of MASA prerend with HO-DirAC changes. --- apps/renderer.c | 3 +++ lib_rend/ivas_dirac_ana.c | 8 ++++---- lib_rend/ivas_mcmasa_ana.c | 8 ++++---- lib_rend/ivas_omasa_ana.c | 30 +++++++++++++++--------------- lib_rend/lib_rend.c | 12 ++++++++++++ 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 69d322e496..2ec42985b4 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1324,6 +1324,9 @@ int main( { MasaFileReader_close( &masaReaders[i] ); } +#ifdef MASA_PREREND + MasaFileWriter_close( &masaWriter ); +#endif AudioFileReader_close( &audioReader ); AudioFileWriter_close( &audioWriter ); HeadRotationFileReader_close( &headRotReader ); diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index ec3d29c508..f90a3c78ce 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -78,7 +78,7 @@ ivas_error ivas_dirac_ana_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DIRAC\n" ) ); } - numAnalysisChannels = DIRAC_MAX_ANA_CHANS; + numAnalysisChannels = FOA_CHANNELS; /* Determine the number of bands */ hDirAC->nbands = MASA_FREQUENCY_BANDS; @@ -254,8 +254,8 @@ static void ivas_dirac_param_est_ana( int16_t num_freq_bands, index; float dir_v[DIRAC_NUM_DIMS]; int16_t l_ts; - float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; - float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float diffuseness_vector[MASA_FREQUENCY_BANDS]; @@ -270,7 +270,7 @@ static void ivas_dirac_param_est_ana( num_freq_bands = hDirAC->nbands; l_ts = input_frame / CLDFB_NO_COL_MAX; - numAnalysisChannels = DIRAC_MAX_ANA_CHANS; + numAnalysisChannels = FOA_CHANNELS; /* do processing over all CLDFB time slots */ diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index 723b98bc52..932731bd2f 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -414,10 +414,10 @@ void ivas_mcmasa_param_est_ana( int16_t l_ts; float Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; - float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; - float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; - float FoaEven_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; - float FoaEven_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Foa_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float FoaEven_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float FoaEven_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float intensity_even_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index a91f13f1a9..3cdc707d01 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -259,15 +259,15 @@ static void ivas_omasa_param_est_ana( const int16_t input_frame, const int16_t nchan_ism ) { - float reference_power[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + float reference_power[MASA_FREQUENCY_BANDS]; int16_t ts, i, d, j; int16_t num_freq_bins, num_freq_bands, index; float dir_v[DIRAC_NUM_DIMS]; int16_t l_ts; - float Chnl_RealBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; - float Chnl_ImagBuffer[MCMASA_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; - float Foa_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; - float Foa_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX]; + float Chnl_RealBuffer[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float Chnl_ImagBuffer[MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; + float Foa_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; + float Foa_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX]; float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float direction_vector[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS]; float diffuseness_vector[MASA_FREQUENCY_BANDS]; @@ -374,7 +374,7 @@ static void ivas_omasa_param_est_ana( computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); /* Power estimation for diffuseness */ - computeReferencePower_ana( hOMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power[ts], num_freq_bands ); + computeReferencePower_ana( hOMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, reference_power, num_freq_bands ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hOMasa->index_buffer_intensity = ( hOMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ @@ -384,20 +384,20 @@ static void ivas_omasa_param_est_ana( /* only real part needed */ mvr2r( intensity_real[i], &( hOMasa->buffer_intensity_real[i][index - 1][0] ), num_freq_bands ); } - mvr2r( reference_power[ts], &( hOMasa->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); + mvr2r( reference_power, &( hOMasa->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); computeDiffuseness( hOMasa->buffer_intensity_real, hOMasa->buffer_energy, num_freq_bands, diffuseness_vector ); for ( band_m_idx = 0; band_m_idx < hOMasa->nbands; band_m_idx++ ) { - norm_tmp = reference_power[ts][band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); + norm_tmp = reference_power[band_m_idx] * ( 1 - diffuseness_vector[band_m_idx] ); hOMasa->direction_vector_m[0][block_m_idx][band_m_idx] += norm_tmp * direction_vector[0][band_m_idx]; hOMasa->direction_vector_m[1][block_m_idx][band_m_idx] += norm_tmp * direction_vector[1][band_m_idx]; hOMasa->direction_vector_m[2][block_m_idx][band_m_idx] += norm_tmp * direction_vector[2][band_m_idx]; - diffuseness_m[band_m_idx] += reference_power[ts][band_m_idx] * diffuseness_vector[band_m_idx]; - renormalization_factor_diff[band_m_idx] += reference_power[ts][band_m_idx]; + diffuseness_m[band_m_idx] += reference_power[band_m_idx] * diffuseness_vector[band_m_idx]; + renormalization_factor_diff[band_m_idx] += reference_power[band_m_idx]; } } @@ -495,8 +495,8 @@ static void ivas_omasa_dmx( void computeIntensityVector_ana( const int16_t *band_grouping, /* i : Band grouping for estimation */ - float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ - float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ const int16_t num_frequency_bands, /* i : Number of frequency bands */ float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector */ ) @@ -534,8 +534,8 @@ void computeIntensityVector_ana( void computeReferencePower_ana( const int16_t *band_grouping, /* i : Band grouping for estimation */ - float Cldfb_RealBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ - float Cldfb_ImagBuffer[DIRAC_MAX_ANA_CHANS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ + float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ + float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ float *reference_power, /* o : Estimated power */ const int16_t num_freq_bands /* i : Number of frequency bands */ ) @@ -549,7 +549,7 @@ void computeReferencePower_ana( brange[1] = band_grouping[i + 1]; reference_power[i] = 0; - for ( ch_idx = 0; ch_idx < DIRAC_MAX_ANA_CHANS; ch_idx++ ) + for ( ch_idx = 0; ch_idx < FOA_CHANNELS; ch_idx++ ) { /* abs()^2 */ for ( j = brange[0]; j < brange[1]; j++ ) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 663dc8f865..618d5063e7 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2929,6 +2929,9 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan; hIvasRend->inputsIsm[i].nonDiegeticPanGain = nonDiegeticPanGain; +#ifdef MASA_PREREND + hIvasRend->inputsIsm[i].hOMasa = NULL; +#endif } for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) @@ -2940,12 +2943,18 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL; hIvasRend->inputsMc[i].nonDiegeticPan = nonDiegeticPan; hIvasRend->inputsMc[i].nonDiegeticPanGain = nonDiegeticPanGain; +#ifdef MASA_PREREND + hIvasRend->inputsMc[i].hMcMasa = NULL; +#endif } for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) { initRendInputBase( &hIvasRend->inputsSba[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); hIvasRend->inputsSba[i].crendWrapper = NULL; +#ifdef MASA_PREREND + hIvasRend->inputsSba[i].hDirAC = NULL; +#endif } for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) @@ -2953,6 +2962,9 @@ ivas_error IVAS_REND_Open( initRendInputBase( &hIvasRend->inputsMasa[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); hIvasRend->inputsMasa[i].decDummy = NULL; hIvasRend->inputsMasa[i].metadataHasBeenFed = false; +#ifdef MASA_PREREND + hIvasRend->inputsMasa[i].hMasaPrerend = NULL; +#endif } return IVAS_ERR_OK; -- GitLab From 644f83b91ca8468ac15547548fdeab60a2c04285 Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 29 May 2023 10:07:39 +0200 Subject: [PATCH 199/381] remove unsued variable in swb_bwe_enc_lr.c --- lib_enc/swb_bwe_enc_lr.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib_enc/swb_bwe_enc_lr.c b/lib_enc/swb_bwe_enc_lr.c index afa9e75ac7..dc39e42333 100644 --- a/lib_enc/swb_bwe_enc_lr.c +++ b/lib_enc/swb_bwe_enc_lr.c @@ -66,11 +66,15 @@ static int16_t GetSubbandCorrIndex2_har( int16_t bestIdx, i, j; float corr, energy, corr_sq; float lagCorr_sq, lagEnergy, eOld; +#ifndef FIX_506 int16_t absPos; +#endif int16_t N1, N2; +#ifndef FIX_506 absPos = 0; +#endif bestIdx = 0; lagCorr_sq = 0.0f; lagEnergy = 1e30f; @@ -130,7 +134,9 @@ static int16_t GetSubbandCorrIndex2_har( } predBuf++; +#ifndef FIX_506 absPos++; +#endif } if ( lagCorr_sq == 0.0f && *prev_frame_bstindx < 0 ) -- GitLab From d7b2cb3083d175430e39ec32eaf36526c7927784 Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 29 May 2023 10:11:14 +0200 Subject: [PATCH 200/381] remove unused variable 'cnt' from swb_bwe_enc_lr --- lib_dec/swb_bwe_dec_lr.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_dec/swb_bwe_dec_lr.c b/lib_dec/swb_bwe_dec_lr.c index 4f29becf24..222316151d 100644 --- a/lib_dec/swb_bwe_dec_lr.c +++ b/lib_dec/swb_bwe_dec_lr.c @@ -130,7 +130,10 @@ static void DecodeSWBSubbands( float ss_min = 1.0f, g, be_tonal[SWB_HAR_RAN1], xSynth_har[L_FRAME32k]; GainItem pk_sf[(NB_SWB_SUBBANDS) *8]; int16_t lagIndices_real[NB_SWB_SUBBANDS]; - int16_t pul_res[NB_SWB_SUBBANDS], cnt, imin; +#ifndef FIX_506 + int16_t cnt; +#endif + int16_t pul_res[NB_SWB_SUBBANDS], imin; int16_t har_freq_est1 = 0; int16_t har_freq_est2 = 0; int16_t flag_dis = 1; @@ -202,14 +205,18 @@ static void DecodeSWBSubbands( { lagGains[k] *= 0.9f; } +#ifndef FIX_506 cnt = 0; +#endif for ( k = 0; k < NB_SWB_SUBBANDS; k++ ) { th_g[k] = 0.0f; if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + k] == 0 ) { th_g[k] = lagGains[k] * ss_min; +#ifndef FIX_506 cnt++; +#endif } } /* Construct spectrum */ -- GitLab From cf2d2e479b52e407a5e50bc497d10d97f7b9ca29 Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 29 May 2023 10:13:46 +0200 Subject: [PATCH 201/381] remove unused variable 'cnt' from swb_bwe_enc_lr.c --- lib_enc/swb_bwe_enc_lr.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_enc/swb_bwe_enc_lr.c b/lib_enc/swb_bwe_enc_lr.c index dc39e42333..dd5bf3b4ca 100644 --- a/lib_enc/swb_bwe_enc_lr.c +++ b/lib_enc/swb_bwe_enc_lr.c @@ -518,7 +518,10 @@ static void EncodeSWBSubbands( float sspectra_ni[L_FRAME32k], sspectra_diff[L_FRAME32k], be_tonal[SWB_HAR_RAN1], xSynth_har[L_FRAME32k]; float ss_min = 1.0f, th_g[NB_SWB_SUBBANDS]; GainItem pk_sf[(NB_SWB_SUBBANDS) *8]; - int16_t pul_res[NB_SWB_SUBBANDS], cnt; +#ifndef FIX_506 + int16_t cnt; +#endif + int16_t pul_res[NB_SWB_SUBBANDS]; int16_t har_freq_est1 = 0, har_freq_est2 = 0; int16_t flag_dis = 1; int16_t pos_max_hfe2 = 0; @@ -605,14 +608,18 @@ static void EncodeSWBSubbands( lagGains[k] *= 0.9f; } +#ifndef FIX_506 cnt = 0; +#endif for ( k = 0; k < NB_SWB_SUBBANDS; k++ ) { th_g[k] = 0.0f; if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + k] == 0 ) { th_g[k] = lagGains[k] * ss_min; +#ifndef FIX_506 cnt++; +#endif } } -- GitLab From 5012840edacb852c78953ccd4483527811207fc7 Mon Sep 17 00:00:00 2001 From: malenov Date: Mon, 29 May 2023 10:18:22 +0200 Subject: [PATCH 202/381] remove unused variable 'cnt' from LD_music_post_filter.c --- lib_dec/LD_music_post_filter.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib_dec/LD_music_post_filter.c b/lib_dec/LD_music_post_filter.c index 87984e873a..0b8bed426c 100644 --- a/lib_dec/LD_music_post_filter.c +++ b/lib_dec/LD_music_post_filter.c @@ -387,7 +387,10 @@ static void spectrum_mod_dct( float slope; float inv_noise[MBANDS_GN_LD]; float *pt_gbin, alpha, tmpN; - int16_t i, cnt; + int16_t i; +#ifndef FIX_506 + int16_t cnt; +#endif float *pt; float tmp, shift; const float *pt2; @@ -475,7 +478,9 @@ static void spectrum_mod_dct( tmpN = slope * inv_noise[i]; tmp = 0.0f; +#ifndef FIX_506 cnt = 0; +#endif while ( freq <= mfreq_loc_LD[i] ) { gain = 1.0f; @@ -502,7 +507,9 @@ static void spectrum_mod_dct( *pt_gbin = gain + alpha * *pt_gbin; *pt++ *= *pt_gbin; +#ifndef FIX_506 cnt++; +#endif freq += BIN_16kdct; pt_gbin++; } -- GitLab From 1637097f3bb62ae3b268748d4b86e9fedc32e836 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 14:06:14 +0200 Subject: [PATCH 203/381] missing switch in options.h --- lib_com/options.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib_com/options.h b/lib_com/options.h index c215b53875..6deb68b869 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -242,6 +242,7 @@ #define BINAURAL_AUDIO_CMDLINE #define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ +#define FIX_506 /* FhG: Compiler warnings */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From c94ed5a890d5a4be91075323e60579e7891d230c Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Jun 2023 15:08:59 +0300 Subject: [PATCH 204/381] In renderer, check enabled rotations from the combined struct --- lib_rend/ivas_rotation.c | 2 +- lib_rend/lib_rend.c | 142 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 141 insertions(+), 3 deletions(-) diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 8efa0dc676..52b6493e63 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -1177,7 +1177,7 @@ ivas_error combine_external_and_head_orientations( { for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { - if ( hExtOrientationData->enableExternalOrientation[i] > 0 || hExtOrientationData->enableHeadRotation[i] > 0 ) + if ( hExtOrientationData->enableExternalOrientation[i] > 0 ) { hCombinedOrientationData->enableCombinedOrientation[i] = 1; } diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index a9058b0b8b..e255875fd2 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5074,6 +5074,11 @@ static ivas_error renderMcToBinaural( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; +#endif #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; @@ -5089,7 +5094,30 @@ static ivas_error renderMcToBinaural( headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; - if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } +#endif + + if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( +#ifdef EXTERNAL_ORIENTATIONS + combinedOrientationEnabled +#else + headRotEnabled +#endif + + && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); @@ -5106,7 +5134,11 @@ static ivas_error renderMcToBinaural( else { /* apply rotation */ +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotEnabled ) +#endif { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); @@ -5164,6 +5196,11 @@ static ivas_error renderMcToBinauralRoom( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; +#endif #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; @@ -5179,7 +5216,29 @@ static ivas_error renderMcToBinauralRoom( headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; - if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( headRotEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } +#endif + + if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( +#ifdef EXTERNAL_ORIENTATIONS + combinedOrientationEnabled +#else + headRotEnabled +#endif + && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); @@ -5195,7 +5254,11 @@ static ivas_error renderMcToBinauralRoom( else { /* apply rotation */ +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotEnabled ) +#endif { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); @@ -5256,6 +5319,11 @@ static ivas_error renderMcCustomLsToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; +#endif #ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; #endif @@ -5273,8 +5341,28 @@ static ivas_error renderMcCustomLsToBinauralRoom( } #endif +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } +#endif + /* apply rotation */ +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotEnabled ) +#endif { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); @@ -5520,6 +5608,11 @@ static ivas_error renderSbaToBinaural( float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; #endif +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; +#endif push_wmops( "renderSbaToBinaural" ); @@ -5530,8 +5623,28 @@ static ivas_error renderSbaToBinaural( } #endif +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } +#endif + /* apply rotation */ +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( sbaInput->base.ctx.pHeadRotData->headRotEnabled ) +#endif { tmpRotBuffer = sbaInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); @@ -5588,6 +5701,11 @@ static ivas_error renderSbaToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; +#ifdef EXTERNAL_ORIENTATIONS + const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; + int8_t combinedOrientationEnabled; + int16_t subframe_idx; +#endif #ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; #endif @@ -5605,8 +5723,28 @@ static ivas_error renderSbaToBinauralRoom( headRotEnabled = sbaInput->base.ctx.pHeadRotData->headRotEnabled; +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; + combinedOrientationEnabled = 0; + if ( hCombinedOrientationData != NULL ) + { + for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) + { + if ( ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] != 0 ) + { + combinedOrientationEnabled = 1; + break; + } + } + } +#endif + /* apply rotation */ +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotEnabled ) +#endif { tmpRotBuffer = sbaInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); -- GitLab From d6cead89ca979148e8f012e1b0af69258a71e9dc Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 6 Jun 2023 14:11:58 +0200 Subject: [PATCH 205/381] Refactoring update --- lib_dec/ivas_mct_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 53d7c2d7ec..0936026edf 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1165,7 +1165,7 @@ static ivas_error ivas_mc_dec_reconfig( ivas_binRenderer_close( &st_ivas->hBinRenderer ); } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) + if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hIntSetup.output_config != AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) #else if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hRenderConfig->roomAcoustics.late_reverb_on == 0 ) ) ) #endif -- GitLab From c8d9f3a86f2fc3ae4725b85e855e9ba1ba28ccfa Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 14:18:37 +0200 Subject: [PATCH 206/381] compiler warning in spt_shorten_domain_set_dec() --- lib_dec/hq_lr_dec.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib_dec/hq_lr_dec.c b/lib_dec/hq_lr_dec.c index 774720844c..1fa8b168c4 100644 --- a/lib_dec/hq_lr_dec.c +++ b/lib_dec/hq_lr_dec.c @@ -1370,10 +1370,14 @@ static void spt_shorten_domain_set_dec( ) { int16_t j, k; +#ifndef FIX_506 int16_t kpos; +#endif int16_t spt_shorten_flag[SPT_SHORTEN_SBNUM]; +#ifndef FIX_506 kpos = 0; +#endif j = 0; for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) { @@ -1390,7 +1394,9 @@ static void spt_shorten_domain_set_dec( } } +#ifndef FIX_506 kpos++; +#endif j++; } -- GitLab From 19df94e68d43d6673a2242010ce2aeb434a5152d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 14:22:02 +0200 Subject: [PATCH 207/381] compiler warning in mat2svdMat() --- lib_dec/ivas_svd_dec.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_svd_dec.c b/lib_dec/ivas_svd_dec.c index 785a906780..7c4a0cf4bb 100644 --- a/lib_dec/ivas_svd_dec.c +++ b/lib_dec/ivas_svd_dec.c @@ -96,22 +96,26 @@ void mat2svdMat( ) { int16_t i, j; +#ifndef FIX_506 int16_t posCounter; +#endif if ( transpose ) { +#ifndef FIX_506 posCounter = 0; - +#endif for ( i = 0; i < mCols; i++ ) { for ( j = 0; j < nRows; j++ ) { svdMat[i][j] = mat[j + nRows * i]; - +#ifndef FIX_506 if ( mat[j + nRows * i] > 0.0f ) { posCounter++; } +#endif } set_zero( &svdMat[i][mCols], MAX_OUTPUT_CHANNELS - nRows ); -- GitLab From ab818f5aefe1bd476f237b060f767bb6b98c5fcf Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 6 Jun 2023 14:31:41 +0200 Subject: [PATCH 208/381] remove comment documented in issue 533 --- lib_rend/lib_rend.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 41f68b6520..0bc20fc347 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4127,7 +4127,6 @@ static void renderBufferChannelLerp( /* Otherwise use weighted average between previous and current gain */ do { - /* TODO(sgi): This is calculated for each output channel - can be optimised */ fadeIn = (float) i / ( outAudio.config.numSamplesPerChannel - 1 ); fadeOut = 1.0f - fadeIn; -- GitLab From 341cf26866d4ce5d99cb17ddd39d3d0465edd626 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 6 Jun 2023 15:32:39 +0300 Subject: [PATCH 209/381] Clear up final sanitizer problems. --- lib_rend/ivas_omasa_ana.c | 21 ++++++++++++++++++++- lib_rend/ivas_stat_rend.h | 6 +++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index 3cdc707d01..08f6dfdf2d 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -71,7 +71,7 @@ ivas_error ivas_omasa_ana_open( int16_t i, j; OMASA_ANA_HANDLE hOMasa; int16_t numAnalysisChannels; - int16_t maxBin; + int16_t maxBin, input_frame; ivas_error error; error = IVAS_ERR_OK; @@ -110,6 +110,11 @@ ivas_error ivas_omasa_ana_open( openCldfb( &( hOMasa->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ); } + for ( ; i < MAX_NUM_OBJECTS; i++ ) + { + hOMasa->cldfbAnaEnc[i] = NULL; + } + /* intensity 3-dim */ for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { @@ -138,6 +143,12 @@ ivas_error ivas_omasa_ana_open( set_f( hOMasa->prev_object_dm_gains[i], (float) sqrt( 0.5 ), MASA_MAX_TRANSPORT_CHANNELS ); } + input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); + for ( i = 0; i < input_frame; i++ ) + { + hOMasa->interpolator[i] = ( (float) i ) / ( (float) input_frame ); + } + hOMasa->index_buffer_intensity = 0; if ( ( hOMasa->hMasaOut = (MASA_DECODER_EXT_OUT_META_HANDLE) malloc( sizeof( MASA_DECODER_EXT_OUT_META ) ) ) == NULL ) @@ -151,6 +162,14 @@ ivas_error ivas_omasa_ana_open( } generate_gridEq( hOMasa->sph_grid16 ); + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + set_zero( hOMasa->energy[i], MASA_FREQUENCY_BANDS ); + } + + set_zero( hOMasa->ism_azimuth, MAX_NUM_OBJECTS ); + set_zero( hOMasa->ism_elevation, MAX_NUM_OBJECTS ); + ( *hOMasaPtr ) = hOMasa; return error; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index c700970599..c4f67a1990 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -885,8 +885,8 @@ typedef struct ivas_mcmasa_ana_data_structure float *buffer_intensity_real_vert[DIRAC_NO_COL_AVG_DIFF]; float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; - float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; - float chnlToFoaEvenMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaEvenMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; float ls_azimuth[MCMASA_MAX_ANA_CHANS]; int16_t leftNearest[MCMASA_MAX_ANA_CHANS]; int16_t rightNearest[MCMASA_MAX_ANA_CHANS]; @@ -927,7 +927,7 @@ typedef struct ivas_omasa_ana_data_structure float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; float buffer_energy[DIRAC_NO_COL_AVG_DIFF * MASA_FREQUENCY_BANDS]; - float chnlToFoaMtx[DIRAC_MAX_ANA_CHANS][MCMASA_MAX_ANA_CHANS]; + float chnlToFoaMtx[FOA_CHANNELS][MCMASA_MAX_ANA_CHANS]; float interpolator[L_FRAME48k]; -- GitLab From efb48b931e589546fe77605767e26fd1ac2ebde6 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 6 Jun 2023 14:35:39 +0200 Subject: [PATCH 210/381] remove comment documented in issue 534 --- apps/renderer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/renderer.c b/apps/renderer.c index c02785a616..0e83e59215 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -212,7 +212,7 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_sampleRate, .match = "sample_rate", .matchShort = "fs", - .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs", /* TODO(sgi): Add sampling rate to scene description files */ + .description = "Input sampling rate in kHz (16, 32, 48) - required only with raw PCM inputs", }, { .id = CmdLnOptionId_trajFile, -- GitLab From 81ea17daa34b6286678fe5af357f83f0efb30c79 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Jun 2023 15:48:41 +0300 Subject: [PATCH 211/381] Add more combined orientation checks in renderer --- lib_rend/lib_rend.c | 47 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index e255875fd2..762181e525 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4747,8 +4747,13 @@ static ivas_error renderIsmToBinauralRoom( } if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, +#ifdef EXTERNAL_ORIENTATIONS + ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, + ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, +#else ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, +#endif previousPanGains ) ) != IVAS_ERR_OK ) { return error; @@ -5069,7 +5074,6 @@ static ivas_error renderMcToBinaural( const IVAS_REND_AudioConfig outConfig, IVAS_REND_AudioBuffer outAudio ) { - int8_t headRotEnabled; float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; IVAS_REND_AudioConfig inConfig; ivas_error error; @@ -5078,6 +5082,8 @@ static ivas_error renderMcToBinaural( const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; +#else + int8_t headRotEnabled; #endif #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; @@ -5091,7 +5097,6 @@ static ivas_error renderMcToBinaural( push_wmops( "renderMcToBinaural" ); - headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; #ifdef EXTERNAL_ORIENTATIONS @@ -5108,6 +5113,8 @@ static ivas_error renderMcToBinaural( } } } +#else + headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; #endif if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( @@ -5191,7 +5198,6 @@ static ivas_error renderMcToBinauralRoom( const IVAS_REND_AudioConfig outConfig, IVAS_REND_AudioBuffer outAudio ) { - int8_t headRotEnabled; float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; IVAS_REND_AudioConfig inConfig; ivas_error error; @@ -5200,6 +5206,8 @@ static ivas_error renderMcToBinauralRoom( const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; +#else + int8_t headRotEnabled; #endif #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; @@ -5213,7 +5221,6 @@ static ivas_error renderMcToBinauralRoom( push_wmops( "renderMcToBinauralRoom" ); - headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; inConfig = mcInput->base.inConfig; #ifdef EXTERNAL_ORIENTATIONS @@ -5230,6 +5237,8 @@ static ivas_error renderMcToBinauralRoom( } } } +#else + headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; #endif if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( @@ -5311,7 +5320,6 @@ static ivas_error renderMcCustomLsToBinauralRoom( const IVAS_REND_AudioConfig outConfig, IVAS_REND_AudioBuffer outAudio ) { - int8_t headRotEnabled; int16_t i; int16_t tmp; float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; @@ -5323,6 +5331,8 @@ static ivas_error renderMcCustomLsToBinauralRoom( const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; +#else + int8_t headRotEnabled; #endif #ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; @@ -5332,8 +5342,6 @@ static ivas_error renderMcCustomLsToBinauralRoom( tmpRotBuffer = outAudio; /* avoid compilation warning */ - headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; - #ifdef JBM_TSM_ON_TCS for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { @@ -5355,6 +5363,8 @@ static ivas_error renderMcCustomLsToBinauralRoom( } } } +#else + headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; #endif /* apply rotation */ @@ -5390,7 +5400,11 @@ static ivas_error renderMcCustomLsToBinauralRoom( tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); +#ifdef EXTERNAL_ORIENTATIONS + tmpBufPtr = ( combinedOrientationEnabled ) ? &tmpRotBuffer : &mcInput->base.inputBuffer; +#else tmpBufPtr = ( headRotEnabled ) ? &tmpRotBuffer : &mcInput->base.inputBuffer; +#endif for ( i = 0; i < mcInput->base.inputBuffer.config.numChannels; i++ ) { renderBufferChannel( *tmpBufPtr, i, mcInput->panGains[i], tmpMcBuffer ); @@ -5416,7 +5430,11 @@ static ivas_error renderMcCustomLsToBinauralRoom( return error; } +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotEnabled ) +#endif { free( tmpRotBuffer.data ); } @@ -5693,7 +5711,6 @@ static ivas_error renderSbaToBinauralRoom( const IVAS_REND_AudioConfig outConfig, IVAS_REND_AudioBuffer outAudio ) { - int8_t headRotEnabled; int16_t i; int16_t tmp; float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; @@ -5705,6 +5722,8 @@ static ivas_error renderSbaToBinauralRoom( const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; +#else + int8_t headRotEnabled; #endif #ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; @@ -5721,8 +5740,6 @@ static ivas_error renderSbaToBinauralRoom( } #endif - headRotEnabled = sbaInput->base.ctx.pHeadRotData->headRotEnabled; - #ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; @@ -5737,6 +5754,8 @@ static ivas_error renderSbaToBinauralRoom( } } } +#else + headRotEnabled = sbaInput->base.ctx.pHeadRotData->headRotEnabled; #endif /* apply rotation */ @@ -5774,7 +5793,11 @@ static ivas_error renderSbaToBinauralRoom( tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numChannels * tmpMcBuffer.config.numSamplesPerChannel ); +#ifdef EXTERNAL_ORIENTATIONS + tmpBufPtr = ( combinedOrientationEnabled ) ? &tmpRotBuffer : &sbaInput->base.inputBuffer; +#else tmpBufPtr = ( headRotEnabled ) ? &tmpRotBuffer : &sbaInput->base.inputBuffer; +#endif for ( i = 0; i < sbaInput->base.inputBuffer.config.numChannels; i++ ) { renderBufferChannel( *tmpBufPtr, i, sbaInput->hoaDecMtx[i], tmpMcBuffer ); @@ -5796,7 +5819,11 @@ static ivas_error renderSbaToBinauralRoom( accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); +#ifdef EXTERNAL_ORIENTATIONS + if ( combinedOrientationEnabled ) +#else if ( headRotEnabled ) +#endif { free( tmpRotBuffer.data ); } -- GitLab From e5eac0dcff597ea395ae8e9b918db3b997f21848 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 6 Jun 2023 17:05:57 +0300 Subject: [PATCH 212/381] Move initialization inside switch, run clang format --- lib_rend/lib_rend.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 762181e525..f0112f6866 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4627,13 +4627,13 @@ static ivas_error renderIsmToBinauralRoom( pan_vector previousPanGains; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioObjectPosition rotatedPos; - const IVAS_REND_HeadRotData *headRotData; #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t j; #else IVAS_QUATERNION quat; + const IVAS_REND_HeadRotData *headRotData; #endif #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; @@ -4646,7 +4646,6 @@ static ivas_error renderIsmToBinauralRoom( push_wmops( "renderIsmToBinauralRoom" ); - headRotData = ismInput->base.ctx.pHeadRotData; rotatedPos = defaultObjectPosition(); #ifdef EXTERNAL_ORIENTATIONS @@ -4663,6 +4662,8 @@ static ivas_error renderIsmToBinauralRoom( } } } +#else + headRotData = ismInput->base.ctx.pHeadRotData; #endif if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && @@ -5119,12 +5120,12 @@ static ivas_error renderMcToBinaural( if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( #ifdef EXTERNAL_ORIENTATIONS - combinedOrientationEnabled + combinedOrientationEnabled #else - headRotEnabled + headRotEnabled #endif - && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) + && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); @@ -5243,11 +5244,11 @@ static ivas_error renderMcToBinauralRoom( if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( #ifdef EXTERNAL_ORIENTATIONS - combinedOrientationEnabled + combinedOrientationEnabled #else - headRotEnabled + headRotEnabled #endif - && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) + && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); -- GitLab From 2761d08dc88916d035eb3533d10a95b9e61d7253 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 6 Jun 2023 16:17:33 +0200 Subject: [PATCH 213/381] FIX_532_ISM_MD_INACTIVE, step 1 --- lib_com/ivas_cnst.h | 12 +++++ lib_com/ivas_ism_com.c | 67 +++++++++++++++++++++++-- lib_com/ivas_prot.h | 2 + lib_com/options.h | 4 +- lib_dec/ivas_ism_dec.c | 4 ++ lib_dec/ivas_ism_metadata_dec.c | 37 +++++++++++++- lib_enc/ivas_ism_enc.c | 4 ++ lib_enc/ivas_ism_metadata_enc.c | 87 ++++++++++++++++++++++++++++++--- 8 files changed, 203 insertions(+), 14 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9557f7aef1..77ef754b81 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -329,7 +329,11 @@ typedef enum #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ +#ifdef FIX_532_ISM_MD_INACTIVE +#define ISM_METADATA_INACTIVE_FLAG_BITS 1 /* flag to signal whether MD are sent in low-rate inactive frame */ +#else #define ISM_METADATA_VAD_FLAG_BITS 1 +#endif #define ISM_METADATA_FLAG_BITS 2 #define ISM_NO_META 0 @@ -383,6 +387,9 @@ typedef enum #define ISM_Q_STEP_LOW (ISM_Q_STEP * 2) #define ISM_Q_STEP_BORDER_LOW (ISM_Q_STEP_BORDER * 2) +#ifdef FIX_532_ISM_MD_INACTIVE +#define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM inactive frames */ +#endif typedef enum { @@ -399,8 +406,13 @@ enum IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS, IND_ISM_EXTENDED_NDP_FLAG, IND_ISM_METADATA_FLAG, +#ifdef FIX_532_ISM_MD_INACTIVE + IND_ISM_MD_INACTIVE_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, + IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_MD_INACTIVE_FLAG + MAX_NUM_OBJECTS, +#else IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS, +#endif IND_ISM_SCE_ID_DTX, IND_ISM_DTX_COH_SCA, diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index a28fb77d20..40622f9d4d 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -49,10 +49,14 @@ * Local constants *-----------------------------------------------------------------------*/ +#ifdef FIX_532_ISM_MD_INACTIVE +#define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC ) +#else #define FRMS_PER_SECOND ( 1000000000 / FRAME_SIZE_NS ) #define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM inactive frames */ #define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRMS_PER_SECOND ) +#endif #define BETA_ISM_LOW_IMP 0.6f #define BETA_ISM_MEDIUM_IMP 0.8f @@ -74,7 +78,11 @@ static void bitbudget_to_brate( for ( i = 0; i < N; i++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + y[i] = FRAMES_PER_SEC * x[i]; +#else y[i] = FRMS_PER_SECOND * x[i]; +#endif } return; @@ -93,11 +101,13 @@ ivas_error ivas_ism_config( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ - const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ - const int16_t ism_imp[], /* i : ISM importance flags */ - int32_t element_brate[], /* o : element bitrate per object */ - int32_t total_brate[], /* o : total bitrate per object */ - int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ +#ifndef FIX_532_ISM_MD_INACTIVE + const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ +#endif + const int16_t ism_imp[], /* i : ISM importance flags */ + int32_t element_brate[], /* o : element bitrate per object */ + int32_t total_brate[], /* o : total bitrate per object */ + int16_t nb_bits_metadata[] /* i/o: number of metadata bits */ ) { int16_t ch; @@ -120,12 +130,20 @@ ivas_error ivas_ism_config( { for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + ism_metadata_flag_global |= ism_imp[ch]; +#else ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; +#endif } } /* decision about bitrates per channel - constant during the session (at one ivas_total_brate) */ +#ifdef FIX_532_ISM_MD_INACTIVE + bits_ism = (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); +#else bits_ism = (int16_t) ( ism_total_brate / FRMS_PER_SECOND ); +#endif set_s( bits_element, bits_ism / n_ISms, n_ISms ); bits_element[n_ISms - 1] += bits_ism % n_ISms; bitbudget_to_brate( bits_element, element_brate, n_ISms ); @@ -146,10 +164,17 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ism_imp[ch] == ISM_NO_META ) + { + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + } +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { nb_bits_metadata[0] += ISM_METADATA_VAD_FLAG_BITS; } +#endif } } @@ -175,7 +200,11 @@ ivas_error ivas_ism_config( diff = 0; for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ism_imp[ch] == ISM_NO_META ) +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 ) +#endif { diff += bits_CoreCoder[ch] - BITS_ISM_INACTIVE; bits_CoreCoder[ch] = BITS_ISM_INACTIVE; @@ -212,18 +241,34 @@ ivas_error ivas_ism_config( { int16_t limit; +#ifdef FIX_532_ISM_MD_INACTIVE + limit = MIN_BRATE_SWB_BWE / FRAMES_PER_SEC; +#else limit = MIN_BRATE_SWB_BWE / FRMS_PER_SECOND; +#endif if ( element_brate[ch] < MIN_BRATE_SWB_STEREO ) /* replicate function set_bw() -> check the coded audio band-width */ { +#ifdef FIX_532_ISM_MD_INACTIVE + limit = MIN_BRATE_WB_BWE / FRAMES_PER_SEC; +#else limit = MIN_BRATE_WB_BWE / FRMS_PER_SECOND; +#endif } else if ( element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ { /*limit = SCE_CORE_16k_LOW_LIMIT;*/ +#ifdef FIX_532_ISM_MD_INACTIVE + limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRAMES_PER_SEC; +#else limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRMS_PER_SECOND; +#endif } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ism_imp[ch] == ISM_NO_META ) +#else if ( ism_imp[ch] == ISM_NO_META && localVAD[ch] == 0 ) +#endif { tmp = BITS_ISM_INACTIVE; } @@ -270,10 +315,18 @@ ivas_error ivas_ism_config( diff = 0; for ( ch = 0; ch < n_ISms; ch++ ) { +#ifdef FIX_532_ISM_MD_INACTIVE + limit_high = IVAS_512k / FRAMES_PER_SEC; +#else limit_high = IVAS_512k / FRMS_PER_SECOND; +#endif if ( element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ { +#ifdef FIX_532_ISM_MD_INACTIVE + limit_high = ACELP_12k8_HIGH_LIMIT / FRAMES_PER_SEC; +#else limit_high = ACELP_12k8_HIGH_LIMIT / FRMS_PER_SECOND; +#endif } tmp = (int16_t) min( bits_CoreCoder[ch], limit_high ); @@ -316,7 +369,11 @@ ivas_error ivas_ism_config( if ( nb_bits_metadata != NULL ) { int32_t tmpL; +#ifdef FIX_532_ISM_MD_INACTIVE + tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRAMES_PER_SEC; +#else tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRMS_PER_SECOND; +#endif if ( sum_l( element_brate, n_ISms ) != tmpL ) { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\nError: Mismatch in ISM bit-budget distribution. Exiting!\n" ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2804668e0f..a437c5cd74 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -885,7 +885,9 @@ ivas_error ivas_ism_config( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ +#ifndef FIX_532_ISM_MD_INACTIVE const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ +#endif const int16_t ism_imp[], /* i : ISM importance flags */ int32_t element_brate[], /* o : element bitrate per object */ int32_t total_brate[], /* o : total bitrate per object */ diff --git a/lib_com/options.h b/lib_com/options.h index d8428a0810..52afff9259 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ #ifdef DEBUGGING -/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ +#define DEBUG_MODE_INFO /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ @@ -242,6 +242,8 @@ #define BINAURAL_AUDIO_CMDLINE #define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ +#define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: impprove MD coding in ISM inactive frames */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index fe98ca0dcb..d3c33e40db 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -84,7 +84,11 @@ static ivas_error ivas_ism_bitrate_switching( ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ism_mode = ism_mode; +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index a39c496ab6..570fa95631 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -168,7 +168,11 @@ ivas_error ivas_ism_metadata_dec( uint16_t i, bstr_meta[MAX_BITS_METADATA], *bstr_orig; ISM_METADATA_HANDLE hIsmMetaData; int16_t nchan_transport_prev, ism_metadata_flag_global; +#ifdef FIX_532_ISM_MD_INACTIVE + int16_t inactive_metadata_flag[MAX_NUM_OBJECTS]; +#else int16_t localVAD[MAX_NUM_OBJECTS]; +#endif int16_t ism_imp[MAX_NUM_OBJECTS]; int16_t nbands, nblocks; int16_t md_diff_flag[MAX_NUM_OBJECTS]; @@ -176,7 +180,6 @@ ivas_error ivas_ism_metadata_dec( push_wmops( "ism_meta_dec" ); - /* initialization */ st0 = hSCE[0]->hCoreCoder[0]; ism_metadata_flag_global = 0; @@ -188,6 +191,9 @@ ivas_error ivas_ism_metadata_dec( st0->next_bit_pos = 0; ism_extmeta_bitstream = 0; non_diegetic_flag_global = 0; +#ifdef FIX_532_ISM_MD_INACTIVE + set_s( inactive_metadata_flag, 0, nchan_ism ); +#endif /* reverse the bitstream for easier reading of indices */ for ( i = 0; i < min( MAX_BITS_METADATA, last_bit_pos ); i++ ) @@ -272,6 +278,18 @@ ivas_error ivas_ism_metadata_dec( ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; } +#ifdef FIX_532_ISM_MD_INACTIVE + /* signal presence of MD in low-rate ISM_NO_META frame */ + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + { + inactive_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + + ism_metadata_flag_global |= inactive_metadata_flag[ch]; + } + } +#else /* read VAD flag */ for ( ch = 0; ch < *nchan_transport; ch++ ) { @@ -284,6 +302,7 @@ ivas_error ivas_ism_metadata_dec( localVAD[ch] = 1; } } +#endif if ( ism_metadata_flag_global ) { @@ -310,7 +329,11 @@ ivas_error ivas_ism_metadata_dec( flag_abs_orientation = 0; flag_abs_radius = 0; +#ifdef FIX_532_ISM_MD_INACTIVE + if ( hIsmMeta[ch]->ism_metadata_flag || inactive_metadata_flag[ch] ) +#else if ( hIsmMeta[ch]->ism_metadata_flag ) +#endif { if ( non_diegetic_flag_global ) { @@ -478,7 +501,11 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -490,7 +517,11 @@ ivas_error ivas_ism_metadata_dec( hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; if ( ism_mode == ISM_MODE_DISC ) { +#ifdef FIX_532_ISM_MD_INACTIVE + if ( total_brate[ch] == BRATE_ISM_INACTIVE ) +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) +#endif { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; } @@ -583,7 +614,11 @@ ivas_error ivas_ism_metadata_dec_create( ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 6c6a0c8837..1c8a9f975f 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -412,7 +412,11 @@ ivas_error ivas_ism_enc_config( st_ivas->nSCE = st_ivas->nchan_transport; st_ivas->nCPE = 0; +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index a8c4982e4b..3cd19ddafe 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -117,7 +117,10 @@ static void rate_ism_importance( const int16_t nchan_transport, /* i : number of transported channels */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ - int16_t ism_imp[] /* o : ISM importance flags */ +#ifdef FIX_532_ISM_MD_INACTIVE + const int16_t inactive_metadata_flag[MAX_NUM_OBJECTS], /* i : flag indicating MD in ISM_NO_META frame for FEC */ +#endif + int16_t ism_imp[] /* o : ISM importance flags */ ) { int16_t ch, ctype; @@ -138,7 +141,11 @@ static void rate_ism_importance( } } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( hIsmMeta[ch]->ism_metadata_flag == 0 || inactive_metadata_flag[ch] == 1 ) && hSCE[ch]->hCoreCoder[0]->localVAD == 0 ) +#else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) +#endif { ism_imp[ch] = ISM_NO_META; } @@ -174,7 +181,7 @@ ivas_error ivas_ism_metadata_enc( SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ BSTR_ENC_HANDLE hBstr, /* i/o: bitstream handle */ int16_t nb_bits_metadata[], /* o : number of metadata bits */ - const int16_t localVAD[], /* i : VAD flag */ + const int16_t vad_flag[], /* i : VAD flag */ const int16_t ism_mode, /* i : ISM mode */ const PARAM_ISM_CONFIG_HANDLE hParamIsm, /* i : Param ISM Enc Handle */ const int16_t ism_extended_metadata_flag /* i : Extended metadata flag */ @@ -194,6 +201,9 @@ ivas_error ivas_ism_metadata_enc( int16_t ism_metadata_flag_global; int16_t non_diegetic_flag_global; int16_t ism_imp[MAX_NUM_OBJECTS]; +#ifdef FIX_532_ISM_MD_INACTIVE + int16_t inactive_metadata_flag[MAX_NUM_OBJECTS]; +#endif int16_t nbands, nblocks; ivas_error error; @@ -210,6 +220,9 @@ ivas_error ivas_ism_metadata_enc( set_s( flag_abs_yaw, 0, nchan_ism ); set_s( flag_abs_pitch, 0, nchan_ism ); set_s( flag_abs_radius, 0, nchan_ism ); +#ifdef FIX_532_ISM_MD_INACTIVE + set_s( inactive_metadata_flag, 0, nchan_ism ); +#endif /*----------------------------------------------------------------* * Set Metadata presence / importance flag @@ -226,19 +239,28 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag == 1 ) { /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ - hIsmMeta[ch]->ism_metadata_flag = localVAD[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly; + hIsmMeta[ch]->ism_metadata_flag = vad_flag[ch] || hSCE[ch]->hCoreCoder[0]->lp_noise > 10 || hSCE[ch]->hCoreCoder[0]->tcxonly; + /* in inactive frames, send MD 1) in ISM_MD_INC_DIFF_CNT_MAX consecutive frames when MD significantly change, 2) at least every ISM_MD_FEC_DIFF frames */ if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { if ( ( fabsf( hIsmMeta[ch]->azimuth - hIsmMeta[ch]->last_true_azimuth ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) ) { +#ifdef FIX_532_ISM_MD_INACTIVE + inactive_metadata_flag[ch] = 1; +#else hIsmMeta[ch]->ism_metadata_flag = 1; +#endif hIsmMeta[ch]->ism_md_inc_diff_cnt = 0; } else if ( hIsmMeta[ch]->ism_md_inc_diff_cnt < ISM_MD_INC_DIFF_CNT_MAX ) { +#ifdef FIX_532_ISM_MD_INACTIVE + inactive_metadata_flag[ch] = 1; +#else hIsmMeta[ch]->ism_metadata_flag = 1; +#endif if ( hIsmMeta[ch]->ism_md_inc_diff_cnt % 2 == 0 ) { @@ -251,7 +273,11 @@ ivas_error ivas_ism_metadata_enc( } else if ( hIsmMeta[ch]->ism_md_fec_cnt_enc == ISM_MD_FEC_CNT_MAX ) { +#ifdef FIX_532_ISM_MD_INACTIVE + inactive_metadata_flag[ch] = 1; +#else hIsmMeta[ch]->ism_metadata_flag = 1; +#endif hIsmMeta[ch]->position_angle.angle1_diff_cnt = ISM_FEC_MAX; } } @@ -263,8 +289,11 @@ ivas_error ivas_ism_metadata_enc( * Rate importance of particular ISM streams *----------------------------------------------------------------*/ +#ifdef FIX_532_ISM_MD_INACTIVE + rate_ism_importance( nchan_transport, hIsmMeta, hSCE, inactive_metadata_flag, ism_imp ); +#else rate_ism_importance( nchan_transport, hIsmMeta, hSCE, ism_imp ); - +#endif /*----------------------------------------------------------------* * Write ISM common signaling @@ -280,6 +309,9 @@ ivas_error ivas_ism_metadata_enc( for ( ch = 0; ch < nchan_ism; ch++ ) { ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; +#ifdef FIX_532_ISM_MD_INACTIVE + ism_metadata_flag_global |= inactive_metadata_flag[ch]; +#endif non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag; } @@ -301,6 +333,21 @@ ivas_error ivas_ism_metadata_enc( push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } + +#ifdef FIX_532_ISM_MD_INACTIVE + /* signal presence of MD in low-rate ISM_NO_META frame */ + if ( ism_mode == ISM_MODE_DISC ) + { + for ( ch = 0; ch < nchan_transport; ch++ ) + { + if ( ism_imp[ch] == ISM_NO_META ) + { + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, inactive_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); + } + } + } + +#else if ( ism_mode == ISM_MODE_DISC ) { /* write VAD flag */ @@ -309,16 +356,18 @@ ivas_error ivas_ism_metadata_enc( if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) { /* this flag distinguishes between coding of inactive frame and active frame w/o. metadata */ - push_indice( hBstr, IND_ISM_VAD_FLAG, localVAD[ch], ISM_METADATA_VAD_FLAG_BITS ); + push_indice( hBstr, IND_ISM_VAD_FLAG, vad_flag[ch], ISM_METADATA_VAD_FLAG_BITS ); } } } +#endif if ( ism_metadata_flag_global ) { /*----------------------------------------------------------------* * Metadata quantization and coding, loop over all objects *----------------------------------------------------------------*/ + int16_t total_bits_metadata = 0; int16_t bits_metadata_ism = 0; int16_t nb_bits_objcod_written; @@ -336,7 +385,11 @@ ivas_error ivas_ism_metadata_enc( nb_bits_start = hBstr->nb_bits_tot; } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( hIsmMeta[ch]->ism_metadata_flag || inactive_metadata_flag[ch] ) +#else if ( hIsmMeta[ch]->ism_metadata_flag ) +#endif { /*----------------------------------------------------------------* * Quantize and encode azimuth and elevation @@ -532,7 +585,11 @@ ivas_error ivas_ism_metadata_enc( * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#else + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, vad_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -558,7 +615,11 @@ ivas_error ivas_ism_metadata_enc( hSCE[ch]->hCoreCoder[0]->low_rate_mode = 0; if ( ism_mode == ISM_MODE_DISC ) { - if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) +#ifdef FIX_532_ISM_MD_INACTIVE + if ( total_brate[ch] == BRATE_ISM_INACTIVE ) +#else + if ( hIsmMeta[ch]->ism_metadata_flag == 0 && vad_flag[ch] == 0 && ism_metadata_flag_global ) +#endif { hSCE[ch]->hCoreCoder[0]->low_rate_mode = 1; } @@ -643,7 +704,11 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; } +#ifdef FIX_532_ISM_MD_INACTIVE + if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) +#endif { return error; } @@ -1064,11 +1129,19 @@ void ivas_ism_metadata_sid_enc( { if ( ism_mode == ISM_MODE_DISC ) { +#ifdef FIX_532_ISM_MD_INACTIVE + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, 0, 1 ); +#else push_indice( hBstr, IND_ISM_VAD_FLAG, 0, 1 ); +#endif } else { +#ifdef FIX_532_ISM_MD_INACTIVE + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, 1, 1 ); +#else push_indice( hBstr, IND_ISM_VAD_FLAG, 1, 1 ); +#endif } if ( ism_mode == ISM_MODE_PARAM ) -- GitLab From 1269d98bb92df1d064ff8bc9157c0395b9012633 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 6 Jun 2023 17:19:56 +0300 Subject: [PATCH 214/381] Limit MASA format output to only merging with MASA situation. --- apps/renderer.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/renderer.c b/apps/renderer.c index 2ec42985b4..89d40cdcd0 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -582,6 +582,24 @@ int main( exit( -1 ); } +#ifdef MASA_PREREND + if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + if ( args.inConfig.numMasaBuses == 0 ) + { + fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); + fprintf( stderr, "\nMASA input is missing\n" ); + exit( -1 ); + } + + if ( args.inConfig.numAudioObjects == 0 && args.inConfig.numMultiChannelBuses == 0 && args.inConfig.numAmbisonicsBuses == 0 ) + { + fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); + fprintf( stderr, "\nNo object, multi-channel, or Ambisonic input present.\n" ); + exit( -1 ); + } + } +#endif positionProvider = IsmPositionProvider_open(); convert_backslash( args.inputFilePath ); -- GitLab From 785db88b0d3dd3097ef80dd08a607bebabe852b2 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 6 Jun 2023 17:55:39 +0300 Subject: [PATCH 215/381] Moving limitation check after configuration has been parsed. --- apps/renderer.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 89d40cdcd0..571aebc85c 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -582,24 +582,6 @@ int main( exit( -1 ); } -#ifdef MASA_PREREND - if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) - { - if ( args.inConfig.numMasaBuses == 0 ) - { - fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); - fprintf( stderr, "\nMASA input is missing\n" ); - exit( -1 ); - } - - if ( args.inConfig.numAudioObjects == 0 && args.inConfig.numMultiChannelBuses == 0 && args.inConfig.numAmbisonicsBuses == 0 ) - { - fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); - fprintf( stderr, "\nNo object, multi-channel, or Ambisonic input present.\n" ); - exit( -1 ); - } - } -#endif positionProvider = IsmPositionProvider_open(); convert_backslash( args.inputFilePath ); @@ -665,6 +647,25 @@ int main( setupWithSingleFormatInput( args, audioFilePath, positionProvider, masaReaders ); } +#ifdef MASA_PREREND + if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) + { + if ( args.inConfig.numMasaBuses == 0 ) + { + fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); + fprintf( stderr, "\nMASA input is missing\n" ); + exit( -1 ); + } + + if ( args.inConfig.numAudioObjects == 0 && args.inConfig.numMultiChannelBuses == 0 && args.inConfig.numAmbisonicsBuses == 0 ) + { + fprintf( stderr, "\nInvalid configuration - Merging to MASA output requires MASA input and at least one another input to be present\n" ); + fprintf( stderr, "\nNo object, multi-channel, or Ambisonic input present.\n" ); + exit( -1 ); + } + } +#endif + if ( AudioFileReader_open( &audioReader, audioFilePath ) != IVAS_ERR_OK ) { fprintf( stderr, "Error opening file: %s\n", audioFilePath ); -- GitLab From ea2e2d2d91cd69b3e65507f67d15629d96df6b9b Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 6 Jun 2023 18:29:09 +0300 Subject: [PATCH 216/381] Add MASA prerenderer files to VS solution. --- Workspace_msvc/lib_rend.vcxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 865652649a..d1cda3290d 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -202,14 +202,18 @@ + + + + -- GitLab From 2f2784e9c3aa005ba18275e5e7aae8be44acecb5 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 6 Jun 2023 18:30:53 +0300 Subject: [PATCH 217/381] Apply clang format --- apps/renderer.c | 2 +- lib_rend/ivas_dirac_ana.c | 14 ++++++------- lib_rend/ivas_masa_merge.c | 36 ++++++++++++++++----------------- lib_rend/ivas_mcmasa_ana.c | 41 +++++++++++++++++++------------------- lib_rend/ivas_omasa_ana.c | 24 +++++++++++----------- lib_rend/ivas_stat_rend.h | 2 +- lib_rend/lib_rend.c | 28 +++++++++++++------------- 7 files changed, 73 insertions(+), 74 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 010262a2f3..31a4022a17 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -159,7 +159,7 @@ typedef struct bool sceneDescriptionInput; float inputGainGlobal; /* Linear gain (not in dB) */ bool lfePanningEnabled; - float lfeConfigGain; /* Linear gain (not in dB) */ + float lfeConfigGain; /* Linear gain (not in dB) */ float lfeConfigAzimuth; float lfeConfigElevation; bool lfeCustomRoutingEnabled; diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index f90a3c78ce..3a749570cf 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -78,7 +78,7 @@ ivas_error ivas_dirac_ana_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DIRAC\n" ) ); } - numAnalysisChannels = FOA_CHANNELS; + numAnalysisChannels = FOA_CHANNELS; /* Determine the number of bands */ hDirAC->nbands = MASA_FREQUENCY_BANDS; @@ -156,7 +156,7 @@ ivas_error ivas_dirac_ana_open( *--------------------------------------------------------------------------*/ void ivas_dirac_ana_close( - DIRAC_ANA_HANDLE ( *hDirAC ) /* i/o: analysis DIRAC handle */ + DIRAC_ANA_HANDLE( *hDirAC ) /* i/o: analysis DIRAC handle */ ) { int16_t i, j; @@ -208,10 +208,10 @@ void ivas_dirac_ana_close( *--------------------------------------------------------------------------*/ void ivas_dirac_ana( - DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ - float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ - const int16_t input_frame, /* i : Input frame size */ - const int16_t nchan_transport /* i : Number of transport channels */ + DIRAC_ANA_HANDLE hDirAC, /* i/o: DIRAC analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport /* i : Number of transport channels */ ) { float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -386,7 +386,7 @@ static void ivas_dirac_dmx( int16_t i; float data_out_f[MASA_MAX_TRANSPORT_CHANNELS][L_FRAME48k]; - if ( nchan_transport == 2) + if ( nchan_transport == 2 ) { v_add( data_in_f[0], data_in_f[1], data_out_f[0], input_frame ); v_multc( data_out_f[0], 0.5f, data_out_f[0], input_frame ); diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c index e2935d20de..6837274694 100644 --- a/lib_rend/ivas_masa_merge.c +++ b/lib_rend/ivas_masa_merge.c @@ -58,11 +58,11 @@ static void full_stream_merge( ); static void diffuse_meta_merge_1x1( - MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: Input metadata 1 */ - float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ - MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i: Input metadata 2 */ - float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: Input metadata 1 */ + float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i/o: TF-energy of input 1. after merge, contains the energy of the merged signal */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i: Input metadata 2 */ + float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ ); void copy_masa_meta_tile( @@ -116,11 +116,11 @@ void copy_masa_descriptive_meta( } void diffuse_meta_merge_1x1( - MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ - MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: Input metadata 1 */ - float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: TF-energy of input 1 */ - MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i: Input metadata 2 */ - float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ + MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: Merged metadata output */ + MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: Input metadata 1 */ + float inEne[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: TF-energy of input 1 */ + MASA_DECODER_EXT_OUT_META_HANDLE inMetaISM, /* i: Input metadata 2 */ + float inEneISM[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: TF-energy of input 2 */ ) { int8_t sf, band; @@ -137,7 +137,7 @@ void diffuse_meta_merge_1x1( total_nrg = inEne[sf][band] + inEneISM[sf][band]; /* target is original MASA diffuseness */ - total_diff_nrg = (float) ( inMeta->diffuseToTotalRatio[sf][band] ) / UINT8_MAX * inEne[sf][band]; + total_diff_nrg = (float) ( inMeta->diffuseToTotalRatio[sf][band] ) / UINT8_MAX * inEne[sf][band]; /* criterion is mean of ISM ratio and new ratio */ dir_ratio_ism = (float) ( inMetaISM->directToTotalRatio[0][sf][band] ) / UINT8_MAX; @@ -152,8 +152,8 @@ void diffuse_meta_merge_1x1( outMeta->surroundCoherence[sf][band] = inMetaISM->surroundCoherence[sf][band]; - dir_nrg_ratio = 1.0f - total_diff_nrg / ( EPSILON + total_nrg ); /* new dir ratio */ - new_dir_ratio = min( dir_nrg_ratio, dir_ratio_ism ); /* clip with original ISM dir */ + dir_nrg_ratio = 1.0f - total_diff_nrg / ( EPSILON + total_nrg ); /* new dir ratio */ + new_dir_ratio = min( dir_nrg_ratio, dir_ratio_ism ); /* clip with original ISM dir */ outMeta->directToTotalRatio[0][sf][band] = (uint8_t) floorf( new_dir_ratio * UINT8_MAX ); new_diff_ratio = 1.0f - new_dir_ratio; outMeta->diffuseToTotalRatio[sf][band] = (uint8_t) floorf( new_diff_ratio * UINT8_MAX ); @@ -223,7 +223,7 @@ void full_stream_merge( if ( dir_nrg_1 > dir_nrg_2 ) { - copy_masa_meta_tile(outMeta, inMeta1, sf, band); + copy_masa_meta_tile( outMeta, inMeta1, sf, band ); } else { @@ -267,16 +267,16 @@ void ivas_prerend_merge_masa_metadata( if ( inType1 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && inType2 != IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) { /* meta_1 is ISM and both are 1dir */ - diffuse_meta_merge_1x1(outMeta, inMeta2, inEne2, inMeta1, inEne1); + diffuse_meta_merge_1x1( outMeta, inMeta2, inEne2, inMeta1, inEne1 ); } else if ( inType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && inType1 != IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED && ( inMeta1->descriptiveMeta.numberOfDirections == 0u && inMeta2->descriptiveMeta.numberOfDirections == 0u ) ) { /* meta_2 is ISM and both are 1dir */ - diffuse_meta_merge_1x1(outMeta, inMeta1, inEne1, inMeta2, inEne2); + diffuse_meta_merge_1x1( outMeta, inMeta1, inEne1, inMeta2, inEne2 ); } else { - full_stream_merge(outMeta, inMeta1, inEne1, inMeta2, inEne2); + full_stream_merge( outMeta, inMeta1, inEne1, inMeta2, inEne2 ); } return; @@ -303,7 +303,7 @@ ivas_error masaPrerendOpen( hMasaPrerend->num_Cldfb_instances = numTransports; for ( i = 0; i < hMasaPrerend->num_Cldfb_instances; i++ ) { - if ( ( error = openCldfb( &(hMasaPrerend->cldfbAnaEnc[i]), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) + if ( ( error = openCldfb( &( hMasaPrerend->cldfbAnaEnc[i] ), CLDFB_ANALYSIS, input_Fs, CLDFB_PROTOTYPE_5_00MS ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index 932731bd2f..bc99d810f9 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -78,7 +78,6 @@ static void computeVerticalDiffuseness( float **buffer_intensity, const float *b static void computeEvenLayout( const float *ls_azimuth, float *ls_azimuth_even, const int16_t numChannels ); - /*--------------------------------------------------------------------------* * ivas_mcmasa_ana_open() * @@ -355,11 +354,11 @@ void ivas_mcmasa_ana_close( *--------------------------------------------------------------------------*/ void ivas_mcmasa_ana( - MCMASA_ANA_HANDLE hMcMasa, /* i/o: McMASA encoder handle */ - float data_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ - const int16_t input_frame, /* i : Input frame size */ - const int16_t nchan_transport, /* i : Number of transport channels */ - const int16_t nchan_inp /* i : Number of input channels */ + MCMASA_ANA_HANDLE hMcMasa, /* i/o: McMASA encoder handle */ + float data_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_inp /* i : Number of input channels */ ) { int16_t i; @@ -394,7 +393,7 @@ void ivas_mcmasa_ana( * Local functions *--------------------------------------------------------------------------*/ - /* Estimate metadata parameters for McMASA */ +/* Estimate metadata parameters for McMASA */ void ivas_mcmasa_param_est_ana( MCMASA_ANA_HANDLE hMcMasa, /* i : McMASA analyzer structure */ float data_f[][L_FRAME48k], /* i : Audio frame in MC-format */ @@ -584,12 +583,12 @@ void ivas_mcmasa_param_est_ana( } /* Direction estimation */ - computeIntensityVector_ana(hMcMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); + computeIntensityVector_ana( hMcMasa->band_grouping, Foa_RealBuffer, Foa_ImagBuffer, num_freq_bands, intensity_real ); computeDirectionVectors( intensity_real[0], intensity_real[1], intensity_real[2], 0, num_freq_bands, direction_vector[0], direction_vector[1], direction_vector[2] ); /* Power and intensity estimation for diffuseness */ computeIntensityVector_ana( hMcMasa->band_grouping, FoaEven_RealBuffer, FoaEven_ImagBuffer, num_freq_bands, intensity_even_real ); - computeReferencePower_ana( hMcMasa->band_grouping, FoaEven_RealBuffer, FoaEven_ImagBuffer, reference_power[ts], num_freq_bands ); + computeReferencePower_ana( hMcMasa->band_grouping, FoaEven_RealBuffer, FoaEven_ImagBuffer, reference_power[ts], num_freq_bands ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ hMcMasa->index_buffer_intensity = ( hMcMasa->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ @@ -926,10 +925,10 @@ static void compute_cov_mtx( *------------------------------------------------------------------------*/ static void computeVerticalDiffuseness( - float **buffer_intensity, /* i : Intensity vectors */ - const float *buffer_energy, /* i : Energy */ - const int16_t num_freq_bands, /* i : Number of frequency bands */ - float *diffuseness /* o : Estimated diffuseness */ + float **buffer_intensity, /* i : Intensity vectors */ + const float *buffer_energy, /* i : Energy */ + const int16_t num_freq_bands, /* i : Number of frequency bands */ + float *diffuseness /* o : Estimated diffuseness */ ) { float intensity_slow[MASA_FREQUENCY_BANDS]; @@ -1039,14 +1038,14 @@ static void computeEvenLayout( } void ivas_create_masa_out_meta( - MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: MASA metadata handle */ - SPHERICAL_GRID_DATA *Sph_Grid16, /* i: Spherical grid */ - const int16_t nchan_transport, /* i: Number of transport channels */ - float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated elevation */ - float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated azimuth */ - float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated direct-to-total ratio */ - float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated spread coherence */ - float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: Estimated surround coherence */ + MASA_DECODER_EXT_OUT_META_HANDLE extOutMeta, /* i/o: MASA metadata handle */ + SPHERICAL_GRID_DATA *Sph_Grid16, /* i: Spherical grid */ + const int16_t nchan_transport, /* i: Number of transport channels */ + float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated elevation */ + float azimuth_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated azimuth */ + float energyRatio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated direct-to-total ratio */ + float spreadCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], /* i: Estimated spread coherence */ + float surroundingCoherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] /* i: Estimated surround coherence */ ) { const uint8_t ivasmasaFormatDescriptor[8] = { 0x49, 0x56, 0x41, 0x53, 0x4D, 0x41, 0x53, 0x41 }; /* "IVASMASA" */ diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index 08f6dfdf2d..28a3af9133 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -81,7 +81,7 @@ ivas_error ivas_omasa_ana_open( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for OMASA\n" ) ); } - numAnalysisChannels = (int16_t) total_num_objects; + numAnalysisChannels = (int16_t) total_num_objects; /* Determine the number of bands */ hOMasa->nbands = MASA_FREQUENCY_BANDS; @@ -235,11 +235,11 @@ void ivas_omasa_ana_close( *--------------------------------------------------------------------------*/ void ivas_omasa_ana( - OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ - float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ - const int16_t input_frame, /* i : Input frame size */ - const int16_t nchan_transport, /* i : Number of transport channels */ - const int16_t nchan_ism /* i : Number of objects for parameter analysis */ + OMASA_ANA_HANDLE hOMasa, /* i/o: OMASA analysis handle */ + float data_in_f[][L_FRAME48k], /* i/o: Input / transport audio signals */ + const int16_t input_frame, /* i : Input frame size */ + const int16_t nchan_transport, /* i : Number of transport channels */ + const int16_t nchan_ism /* i : Number of objects for parameter analysis */ ) { float elevation_m_values[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; @@ -513,11 +513,11 @@ static void ivas_omasa_dmx( void computeIntensityVector_ana( - const int16_t *band_grouping, /* i : Band grouping for estimation */ + const int16_t *band_grouping, /* i : Band grouping for estimation */ float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ - const int16_t num_frequency_bands, /* i : Number of frequency bands */ - float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector */ + const int16_t num_frequency_bands, /* i : Number of frequency bands */ + float intensity_real[DIRAC_NUM_DIMS][MASA_FREQUENCY_BANDS] /* o : Intensity vector */ ) { /* Reminder @@ -552,11 +552,11 @@ void computeIntensityVector_ana( void computeReferencePower_ana( - const int16_t *band_grouping, /* i : Band grouping for estimation */ + const int16_t *band_grouping, /* i : Band grouping for estimation */ float Cldfb_RealBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Real part of input signal */ float Cldfb_ImagBuffer[FOA_CHANNELS][CLDFB_NO_CHANNELS_MAX], /* i : Imag part of input signal */ - float *reference_power, /* o : Estimated power */ - const int16_t num_freq_bands /* i : Number of frequency bands */ + float *reference_power, /* o : Estimated power */ + const int16_t num_freq_bands /* i : Number of frequency bands */ ) { int16_t brange[2]; diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index c4f67a1990..95c53fbac1 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -38,7 +38,7 @@ #include "ivas_cnst.h" #include "ivas_stat_com.h" // note: needed for DIRAC_DEC_BIN_HANDLE until #156 is solved #ifdef MASA_PREREND -#include "stat_com.h" /* Note: Currently needed for CLDFB. */ +#include "stat_com.h" /* Note: Currently needed for CLDFB. */ #endif #include "common_api_types.h" diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 618d5063e7..19389f390a 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1183,7 +1183,7 @@ static ivas_error setRendInputActiveIsm( #ifdef MASA_PREREND else if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { - if ( ( error = initIsmMasaRendering( inputIsm, inConfig, *rendCtx.pOutSampleRate) ) != IVAS_ERR_OK ) + if ( ( error = initIsmMasaRendering( inputIsm, inConfig, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } @@ -3826,7 +3826,7 @@ ivas_error IVAS_REND_FeedInputAudio( #ifdef MASA_PREREND if ( ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) && inputBase->inConfig == IVAS_REND_AUDIO_CONFIG_OBJECT ) { - numInputChannels = ( int16_t ) hIvasRend->inputsIsm[0].total_num_objects; + numInputChannels = (int16_t) hIvasRend->inputsIsm[0].total_num_objects; } #endif @@ -5997,7 +5997,7 @@ static void renderMasaToMasa( } } - copy_masa_descriptive_meta( &(outMeta->descriptiveMeta), &(inMeta->descriptive_meta) ); + copy_masa_descriptive_meta( &( outMeta->descriptiveMeta ), &( inMeta->descriptive_meta ) ); accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); @@ -6146,8 +6146,8 @@ ivas_error IVAS_REND_MergeMasaMetadata( ) { MASA_DECODER_EXT_OUT_META_HANDLE inMeta2; - float (*inEne1)[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; - float (*inEne2)[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float( *inEne1 )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; + float( *inEne2 )[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; if ( hIvasRend == NULL ) { @@ -6158,22 +6158,22 @@ ivas_error IVAS_REND_MergeMasaMetadata( if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) { *hMasaExtOutMeta = hIvasRend->inputsIsm->hOMasa->hMasaOut; - inEne1 = &(hIvasRend->inputsIsm->hOMasa->energy); + inEne1 = &( hIvasRend->inputsIsm->hOMasa->energy ); } else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { *hMasaExtOutMeta = hIvasRend->inputsMc->hMcMasa->hMasaOut; - inEne1 = &(hIvasRend->inputsMc->hMcMasa->energy); + inEne1 = &( hIvasRend->inputsMc->hMcMasa->energy ); } else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { *hMasaExtOutMeta = hIvasRend->inputsSba->hDirAC->hMasaOut; - inEne1 = &(hIvasRend->inputsSba->hDirAC->energy); + inEne1 = &( hIvasRend->inputsSba->hDirAC->energy ); } else if ( inputType1 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) { *hMasaExtOutMeta = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; - inEne1 = &(hIvasRend->inputsMasa->hMasaPrerend->energy); + inEne1 = &( hIvasRend->inputsMasa->hMasaPrerend->energy ); } else { @@ -6184,22 +6184,22 @@ ivas_error IVAS_REND_MergeMasaMetadata( if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED ) { inMeta2 = hIvasRend->inputsIsm->hOMasa->hMasaOut; - inEne2 = &(hIvasRend->inputsIsm->hOMasa->energy); + inEne2 = &( hIvasRend->inputsIsm->hOMasa->energy ); } else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { inMeta2 = hIvasRend->inputsMc->hMcMasa->hMasaOut; - inEne2 = &(hIvasRend->inputsMc->hMcMasa->energy); + inEne2 = &( hIvasRend->inputsMc->hMcMasa->energy ); } else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { inMeta2 = hIvasRend->inputsSba->hDirAC->hMasaOut; - inEne2 = &(hIvasRend->inputsSba->hDirAC->energy); + inEne2 = &( hIvasRend->inputsSba->hDirAC->energy ); } else if ( inputType2 == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) { inMeta2 = hIvasRend->inputsMasa->hMasaPrerend->hMasaOut; - inEne2 = &(hIvasRend->inputsMasa->hMasaPrerend->energy); + inEne2 = &( hIvasRend->inputsMasa->hMasaPrerend->energy ); } else { @@ -6208,7 +6208,7 @@ ivas_error IVAS_REND_MergeMasaMetadata( /* Merge metadata */ ivas_prerend_merge_masa_metadata( *hMasaExtOutMeta, *hMasaExtOutMeta, inputType1, *inEne1, inMeta2, inputType2, *inEne2 ); - (*hMasaExtOutMeta)->descriptiveMeta.numberOfChannels = hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA1 ? 0u : 1u; + ( *hMasaExtOutMeta )->descriptiveMeta.numberOfChannels = hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA1 ? 0u : 1u; return IVAS_ERR_OK; -- GitLab From 0e5b6d6c2c42abe812021f5229a3044d7f798eba Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 6 Jun 2023 17:38:09 +0200 Subject: [PATCH 218/381] fix issue 531; under FIX_531_BWS_ISM_BFI --- apps/decoder.c | 14 ++++++++------ lib_com/options.h | 2 ++ lib_com/swb_bwe_com.c | 1 + lib_dec/ivas_core_dec.c | 4 ++++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 7ceda8f6f3..dd531b4ffa 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1776,12 +1776,14 @@ static ivas_error decodeG192( goto cleanup; } } - /* Run decoder for one frame (get rendered output) */ - if ( ( error = IVAS_DEC_GetSamples( hIvasDec, pcmBuf, &nOutSamples ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError: could not get samples from decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } + + if ( frame > 3200 ) + /* Run decoder for one frame (get rendered output) */ + if ( ( error = IVAS_DEC_GetSamples( hIvasDec, pcmBuf, &nOutSamples ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not get samples from decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } /* Continue checking for first good frame until it is found */ if ( !decodedGoodFrame ) diff --git a/lib_com/options.h b/lib_com/options.h index 6deb68b869..285fdd3be2 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -243,6 +243,8 @@ #define BINAURAL_AUDIO_CMDLINE #define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ #define FIX_506 /* FhG: Compiler warnings */ +#define FIX_531_BWS_ISM_BFI /* VA: issue 531: fix MemorySanitizer: use-of-uninitialized-value in ISM2 rate switching with frame errors */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/swb_bwe_com.c b/lib_com/swb_bwe_com.c index 4efbaa735d..21937632f8 100644 --- a/lib_com/swb_bwe_com.c +++ b/lib_com/swb_bwe_com.c @@ -309,6 +309,7 @@ void calc_tilt_bwe( } *tilt = (float) ( r1 / sqrt( r0 ) ); + dbgwrite( &sp[0], 4, 1, 960, "res/aa" ); return; } diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 9d6211bf8f..3367cd5d71 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -504,7 +504,11 @@ ivas_error ivas_core_dec( * SWB(FB) BWE decoding *---------------------------------------------------------------------*/ +#ifdef FIX_531_BWS_ISM_BFI + if ( st->extl == SWB_TBE || st->extl == FB_TBE || ( st->coder_type != AUDIO && st->coder_type != INACTIVE && st->core_brate >= SID_2k40 && st->core == ACELP_CORE && !st->con_tcx && output_Fs >= 32000 && st->bwidth > NB && st->bws_cnt > 0 ) ) +#else if ( st->extl == SWB_TBE || st->extl == FB_TBE || ( st->coder_type != AUDIO && st->coder_type != INACTIVE && st->core_brate >= SID_2k40 && st->core == ACELP_CORE && output_Fs >= 32000 && st->bwidth > NB && st->bws_cnt > 0 ) ) +#endif { /* SWB TBE decoder */ swb_tbe_dec( st, hStereoICBWE, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], tmp_buffer /*fb_exc*/, hb_synth[n], pitch_buf[n] ); -- GitLab From 099c0da16d83905e2cfc37a46da9a9fab1d4d056 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 6 Jun 2023 17:40:08 +0200 Subject: [PATCH 219/381] remove debugging code --- apps/decoder.c | 14 ++++++-------- lib_com/swb_bwe_com.c | 1 - 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index dd531b4ffa..7ceda8f6f3 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -1776,14 +1776,12 @@ static ivas_error decodeG192( goto cleanup; } } - - if ( frame > 3200 ) - /* Run decoder for one frame (get rendered output) */ - if ( ( error = IVAS_DEC_GetSamples( hIvasDec, pcmBuf, &nOutSamples ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "\nError: could not get samples from decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } + /* Run decoder for one frame (get rendered output) */ + if ( ( error = IVAS_DEC_GetSamples( hIvasDec, pcmBuf, &nOutSamples ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: could not get samples from decoder: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } /* Continue checking for first good frame until it is found */ if ( !decodedGoodFrame ) diff --git a/lib_com/swb_bwe_com.c b/lib_com/swb_bwe_com.c index 21937632f8..4efbaa735d 100644 --- a/lib_com/swb_bwe_com.c +++ b/lib_com/swb_bwe_com.c @@ -309,7 +309,6 @@ void calc_tilt_bwe( } *tilt = (float) ( r1 / sqrt( r0 ) ); - dbgwrite( &sp[0], 4, 1, 960, "res/aa" ); return; } -- GitLab From 7baca4692eefaf2db93e14f07b907324a2ae987e Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 6 Jun 2023 18:43:32 +0300 Subject: [PATCH 220/381] Fix build warnings. --- apps/renderer.c | 1 + lib_rend/ivas_stat_rend.h | 4 ++-- lib_rend/lib_rend.c | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index 31a4022a17..c7849a04d0 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1300,6 +1300,7 @@ int main( inputType1 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; inputType2 = IVAS_REND_AUDIO_CONFIG_TYPE_UNKNOWN; + hMetaOutput = NULL; numInputFormats = 0; if ( args.inConfig.numAmbisonicsBuses > 0 ) diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 95c53fbac1..a5f6ced654 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -911,7 +911,7 @@ typedef struct ivas_mcmasa_ana_data_structure typedef struct ivas_omasa_ana_data_structure { - uint8_t nbands; + int16_t nbands; /* CLDFB analysis */ int16_t num_Cldfb_instances; @@ -948,7 +948,7 @@ typedef struct ivas_omasa_ana_data_structure typedef struct ivas_dirac_ana_data_structure { - uint8_t nbands; + int16_t nbands; /* CLDFB analysis */ int16_t num_Cldfb_instances; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 19389f390a..6f6cbf7098 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -1095,7 +1095,6 @@ static bool isIoConfigPairSupported( #ifdef MASA_PREREND static ivas_error initIsmMasaRendering( input_ism *inputIsm, - const IVAS_REND_AudioConfig inConfig, int32_t inSampleRate ) { ivas_error error; @@ -1183,7 +1182,7 @@ static ivas_error setRendInputActiveIsm( #ifdef MASA_PREREND else if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { - if ( ( error = initIsmMasaRendering( inputIsm, inConfig, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 66916b34e0d4bd48d47b19d70022132e90b059a2 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Tue, 6 Jun 2023 16:02:46 +0200 Subject: [PATCH 221/381] Fix initial value of late_reverb --- lib_rend/ivas_render_config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index efd866ccec..54e9d98482 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -114,7 +114,7 @@ ivas_error ivas_render_config_init_from_rom( #endif ( *hRenderConfig )->roomAcoustics.override = FALSE; ( *hRenderConfig )->roomAcoustics.use_brir = room_flag_on; - ( *hRenderConfig )->roomAcoustics.late_reverb_on = room_flag_on; + ( *hRenderConfig )->roomAcoustics.late_reverb_on = FALSE; ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_PRE_DELAY; ( *hRenderConfig )->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_INPUT_DELAY; -- GitLab From c8654099f645648c15b74dc3bf78e32716bc4abb Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Tue, 6 Jun 2023 18:48:30 +0200 Subject: [PATCH 222/381] bring in line with main --- lib_rend/ivas_render_config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index e9aead5f5b..019df4d790 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -117,7 +117,7 @@ ivas_error ivas_render_config_init_from_rom( ( *hRenderConfig )->roomAcoustics.override = FALSE; #ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG ( *hRenderConfig )->roomAcoustics.use_brir = room_flag_on; - ( *hRenderConfig )->roomAcoustics.late_reverb_on = room_flag_on; + ( *hRenderConfig )->roomAcoustics.late_reverb_on = FALSE; #endif ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_PRE_DELAY; -- GitLab From 1dca9e42a74bb32b41e8ed4459f7d4ff5167d364 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Tue, 6 Jun 2023 19:37:20 +0200 Subject: [PATCH 223/381] bringing in line with default disabled reverb w/o config file --- scripts/testv/just_reverb.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/testv/just_reverb.cfg b/scripts/testv/just_reverb.cfg index 28acb76dc6..7c8dd32788 100644 --- a/scripts/testv/just_reverb.cfg +++ b/scripts/testv/just_reverb.cfg @@ -1,2 +1,2 @@ [roomAcoustics] -reverb = true; # Reverb switch, in case BRIR is undefined or false, reverb flag is inherited from the room flag +reverb = false; # Reverb switch, in case BRIR is undefined or false, reverb flag is inherited from the room flag -- GitLab From 0167332b3db8fe910ab0165a2cfe9927dc7facb2 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:31:42 +0200 Subject: [PATCH 224/381] [cleanup] accept HR_METADATA --- lib_com/ivas_cnst.h | 8 -- lib_com/ivas_masa_com.c | 4 - lib_com/ivas_prot.h | 6 -- lib_com/ivas_rom_com.c | 6 -- lib_com/ivas_rom_com.h | 2 - lib_com/ivas_stat_com.h | 2 - lib_com/options.h | 3 - lib_dec/ivas_masa_dec.c | 181 ---------------------------------- lib_dec/ivas_qmetadata_dec.c | 95 ------------------ lib_enc/ivas_masa_enc.c | 22 ----- lib_enc/ivas_qmetadata_enc.c | 71 ------------- lib_enc/ivas_qspherical_enc.c | 6 -- lib_util/masa_file_reader.c | 157 ----------------------------- 13 files changed, 563 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9557f7aef1..f59ac2f000 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1186,9 +1186,7 @@ enum #define MASA_DIRECTION_MAX_BITS 11 #define MASA_NO_INDEX 32767 #define MASA_BITS_ER 3 -#ifdef HR_METADATA #define MASA_BITS_ER_HR 4 -#endif #define MASA_MIN_BITS_TF 4 #define MASA_LIMIT_2D 2 #define MASA_NO_CV_COH 8 @@ -1208,10 +1206,8 @@ enum #define QMETADATA_MAX_NO_DIRECTIONS 2 #define MASA_MAX_BITS 1300 /* max. bit-budget for MASA metadata */ -#ifdef HR_METADATA #define MASA_MAX_BITS_HR 2000 /* max. bit-budget for MASA metadata in HR mode*/ #define HR_MASA_ER_LEVELS 16 -#endif #ifdef FIX_HBR_MASAMETA #define MAX_REDUCED_NBANDS 18 /* max number of subbands that is less than the default value 24 */ #endif @@ -1246,12 +1242,8 @@ enum #define MASA_STEREO_MIN_BITRATE IVAS_24k4 #define MASA_BIT_REDUCT_PARAM 10 -#ifdef HR_METADATA #define MASA_MAXIMUM_TWO_DIR_BANDS 24 #define NBITS_HR_COH 4 -#else -#define MASA_MAXIMUM_TWO_DIR_BANDS 18 -#endif typedef enum { MASA_STEREO_NOT_DEFINED, diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 22caa5d2cf..820d505e47 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -53,7 +53,6 @@ #define MASA_SMALL_INC_META_BITS 10 -#ifdef HR_METADATA /*--------------------------------------------------------------- * Local prototypes *---------------------------------------------------------------*/ @@ -62,7 +61,6 @@ static int16_t quantize_theta_masa( float x, const int16_t no_cb, float *xhat ); static int16_t quantize_phi_masa( float phi, const int16_t flag_delta, float *phi_hat, const int16_t n ); -#endif /*--------------------------------------------------------------- @@ -454,7 +452,6 @@ void masa_sample_rate_band_correction( } -#ifdef HR_METADATA /*------------------------------------------------------------------------- * index_theta_phi_16() * @@ -803,4 +800,3 @@ void deindex_sph_idx( return; } -#endif diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 2a040f2d57..211b3f3326 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3109,7 +3109,6 @@ ivas_error ivas_qmetadata_enc_encode( const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); -#ifdef HR_METADATA ivas_error ivas_qmetadata_enc_encode_hr_384_512( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *hQMetaData, /* i/o: metadata handle */ @@ -3130,7 +3129,6 @@ uint16_t index_theta_phi_16( float * p_phi, /* i/o: input azimuth to be indexed */ const SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ ); -#endif void reset_metadata_spatial( const IVAS_FORMAT ivas_format, /* i : IVAS format */ @@ -3166,7 +3164,6 @@ int16_t ivas_qmetadata_dec_decode( const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); -#ifdef HR_METADATA /*! r: number of bits read */ int16_t ivas_qmetadata_dec_decode_hr_384_512( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: hQMetaData handle */ @@ -3180,7 +3177,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( uint8_t ncoding_bands_config #endif ); -#endif /*! r: number of bits read */ int16_t ivas_qmetadata_dec_sid_decode( @@ -3266,10 +3262,8 @@ void quantize_direction_frame( IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ -#endif ); /*! r: quantized spherical index */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 9f67c602f6..8f32d0067f 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -2538,7 +2538,6 @@ const uint16_t ivas_param_mc_sym_freq_ild_delta_combined_48_16bits[2 * PARAM_MC_ /*----------------------------------------------------------------------------------* * MASA ROM tables *----------------------------------------------------------------------------------*/ -#ifdef HR_METADATA const float diffuseness_reconstructions_hr[HR_MASA_ER_LEVELS] = { @@ -2579,7 +2578,6 @@ const float diffuseness_thresholds_hr[HR_MASA_ER_LEVELS + 1] = 0.8673095703125f, 2.0f /* out-of-range large value to make searching easier */ }; -#endif const int16_t bits_direction_masa[DIRAC_DIFFUSE_LEVELS] = { 11, @@ -2775,11 +2773,7 @@ const uint8_t masa_joined_nbands[IVAS_NUM_ACTIVE_BRATES] = const uint8_t masa_twodir_bands[IVAS_NUM_ACTIVE_BRATES] = { -#ifdef HR_METADATA 0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 24 -#else - 0, 0, 0, 0, 0, 1, 1, 1, 3, 4, 6, 6, 9, 12 -#endif }; const uint8_t masa_twodir_bands_joined[IVAS_NUM_ACTIVE_BRATES] = diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index a6437565c9..ed3ffa6c08 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -298,10 +298,8 @@ extern const uint8_t masa_joined_nbands[]; extern const uint8_t masa_twodir_bands[]; extern const uint8_t masa_twodir_bands_joined[]; -#ifdef HR_METADATA extern const float diffuseness_reconstructions_hr[HR_MASA_ER_LEVELS]; extern const float diffuseness_thresholds_hr[HR_MASA_ER_LEVELS + 1]; -#endif /* Multi-channel input and output setups */ extern const float ls_azimuth_CICP2[2]; diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index cc0fbf89b3..c4be5a6c63 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -432,9 +432,7 @@ typedef struct ivas_masa_directional_spatial_meta_struct float elevation[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; float spread_coherence[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; -#ifdef HR_METADATA uint16_t spherical_index[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; -#endif } MASA_DIRECTIONAL_SPATIAL_META; diff --git a/lib_com/options.h b/lib_com/options.h index 3a1e1b24c1..9c1c6ff625 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,7 +147,6 @@ #define UPDATE_SBA_FILTER /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define HR_METADATA /* Nok: Contribution #45: encode directional MASA metadata with more bits at 384k and 512k */ #define SBA_TD_RESIDUAL /* Dlb : Issue 426: SBA encoder complexity optimization */ @@ -218,9 +217,7 @@ #define SBA_MODE_CLEAN_UP /* Dlb: Cean up SBA mode references */ #define FIX_502_IND_LIST_SIZE /* Fix issue #502: insufficient index buffer sizes */ -#ifdef HR_METADATA #define FIX_505_MASA_SPHGRID_REUSE /* Nokia: Fix issue #505: MASA spherical grid reuse fix */ -#endif #define FIX_481_UNUSED_VARIABLES /* Nokia: Fix issue #481: Unused debug variables */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 8d6cebe036..d284d3f7d9 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -55,11 +55,6 @@ /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ -#ifndef HR_METADATA -static int16_t quantize_theta( float x, int16_t no_cb, float *xhat ); -static uint16_t index_theta_phi_16( float theta, float phi, SPHERICAL_GRID_DATA *Sph_Grid16 ); -static int16_t quantize_phi_masa( float phi, int16_t flag_delta, float *phi_hat, const int16_t n ); -#endif static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, SPHERICAL_GRID_DATA *Sph_Grid16 ); @@ -196,7 +191,6 @@ ivas_error ivas_masa_decode( /* Remove already read bits from the bit budget */ hQMetaData->metadata_max_bits -= *nb_bits_read; -#ifdef HR_METADATA if ( ivas_total_brate >= IVAS_384k ) { if ( ivas_total_brate >= IVAS_512k ) @@ -220,12 +214,9 @@ ivas_error ivas_masa_decode( } else { -#endif *nb_bits_read += ivas_qmetadata_dec_decode( hQMetaData, st->bit_stream, &st->next_bit_pos, 0 ); -#ifdef HR_METADATA } -#endif /* Get direction decoding quality. EC 1 and 2 are handled by the default value. */ if ( hQMetaData->ec_flag == 2 ) @@ -529,7 +520,6 @@ static ivas_error ivas_masa_dec_config( ivas_masa_set_coding_config( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ); -#ifdef HR_METADATA if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate == IVAS_512k ) { hMasa->config.mergeRatiosOverSubframes = 0; @@ -540,7 +530,6 @@ static ivas_error ivas_masa_dec_config( generate_gridEq( hMasa->data.sph_grid16 ); } } -#endif st_ivas->hQMetaData->metadata_max_bits = hMasa->config.max_metadata_bits; st_ivas->hQMetaData->bandMap = hMasa->data.band_mapping; st_ivas->hQMetaData->nchan_transport = st_ivas->nchan_transport; @@ -643,176 +632,6 @@ void ivas_masa_prerender( /*-------------------------------------------------------------------* * Local functions *-------------------------------------------------------------------*/ -#ifndef HR_METADATA -/* !r: index of quantized value */ -static int16_t quantize_theta( - float x, /* i : theta value to be quantized */ - int16_t no_cb, /* i : number of codewords */ - float *xhat /* o : quantized value */ -) -{ - int16_t imin; - float diff1, diff2; - - imin = (int16_t) ( x * MASA_INV_ANGLE_AT_EQUATOR_DEG + 0.5f ); - - if ( imin >= no_cb - 1 ) - { - imin = no_cb - 1; - diff1 = x - 90; - diff2 = x - MASA_ANGLE_AT_EQUATOR_DEG * ( imin - 1 ); - if ( fabsf( diff1 ) > fabsf( diff2 ) ) - { - imin--; - *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; - } - else - { - *xhat = 90; - } - } - else - { - *xhat = imin * MASA_ANGLE_AT_EQUATOR_DEG; - } - - return imin; -} - - -/* !r: index azimuth */ -static int16_t quantize_phi_masa( - float phi, /* i : azimuth value */ - int16_t flag_delta, /* i : flag indicating if the azimuth codebook is translated or not */ - float *phi_hat, /* o : quantized azimuth */ - const int16_t n /* i : azimuth codebook size */ -) -{ - int16_t id_phi; - float dd; - float delta_phi; - - delta_phi = 360.0f / (float) n; - - if ( n == 1 ) - { - *phi_hat = 0; - - return 0; - } - - if ( flag_delta == 1 ) - { - dd = delta_phi / 2.0f; - } - else - { - dd = 0; - } - - id_phi = (int16_t) ( ( phi - dd + delta_phi / 2.0f ) / (float) delta_phi ); - - if ( id_phi == n ) - { - id_phi = 0; - } - - if ( id_phi == -1 ) - { - id_phi = n - 1; - } - - *phi_hat = id_phi * delta_phi + dd; - - return id_phi; -} - - -/* !r: output index for direction */ -static uint16_t index_theta_phi_16( - float theta, /* i : input elevation to be indexed */ - float phi, /* i : input azimuth to be indexed */ - SPHERICAL_GRID_DATA *gridData /* i : generated grid data */ -) -{ - float abs_theta; - int16_t sign_th, id_phi, id_th; - uint16_t idx_sph; - uint16_t cum_n; - float theta_hat, phi_hat; /* Can be removed */ - - phi = phi + 180; - - if ( theta < 0 ) - { - abs_theta = -theta; - sign_th = -1; - } - else - { - abs_theta = theta; - sign_th = 1; - } - - id_th = quantize_theta( abs_theta, gridData->no_theta, &theta_hat ); - if ( gridData->no_theta > 1 ) - { - if ( gridData->no_phi[id_th] > 1 ) - { - id_phi = quantize_phi_masa( phi, ( id_th % 2 == 1 ), &phi_hat, gridData->no_phi[id_th] ); - } - else - { - id_phi = 0; - phi_hat = 180; - } - } - else - { - id_phi = quantize_phi_masa( phi, ( id_th % 2 == 1 ), &phi_hat, gridData->no_phi[id_th] ); - } - - /* Starting from Equator, alternating positive and negative */ - if ( id_th == 0 ) - { - idx_sph = id_phi; - } - else - { - if ( id_th == gridData->no_theta - 1 ) - { - idx_sph = 65534 + ( sign_th < 0 ); - } - else - { - theta = MASA_ANGLE_AT_EQUATOR * (float) ( id_th + 0.5f ); - if ( id_th == 1 ) - { - cum_n = 2 * (uint16_t) ceilf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); - } - else - { - cum_n = 2 * (uint16_t) roundf( MASA_NTOT2_FAC * ( sinf( theta ) - MASA_ASIN_OFFSET ) ); - } - - cum_n += gridData->no_phi[0]; - - if ( sign_th > 0 ) - { - cum_n -= 2 * gridData->no_phi[id_th]; - } - else - { - cum_n -= gridData->no_phi[id_th]; - } - idx_sph = cum_n + id_phi; - } - } - - - return idx_sph; -} -#endif static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index cfd748afde..eabe725035 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -50,17 +50,13 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness( uint16_t *bitstream, i static int16_t ivas_qmetadata_entropy_decode_df_ratio( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, int16_t *dfRatio_bits ); static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band -#ifdef HR_METADATA , const int16_t hrmasa_flag -#endif ); static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band -#ifdef HR_METADATA , const int16_t hrmasa_flag -#endif ); static uint16_t ivas_qmetadata_DecodeQuasiUniform( const uint16_t *bitstream, int16_t *index, const uint16_t alphabet_size ); @@ -88,19 +84,15 @@ static int16_t read_truncGR_azimuth( uint16_t *bitstream, IVAS_QDIRECTION *q_dir static ivas_error read_huf( int16_t *num_bits_read, const uint16_t *bitstream, uint16_t *out, const int16_t start_pos, const int16_t len, const int16_t *huff_code, const int16_t max_len ); static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir -#ifdef HR_METADATA , const int16_t hrmasa_flag -#endif ); static int16_t read_surround_coherence( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData ); static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames -#ifdef HR_METADATA , const int16_t hrmasa_flag -#endif ); static void decode_combined_index( uint64_t comb_index, const int16_t *no_cv_vec, uint16_t *index, const int16_t len ); @@ -111,7 +103,6 @@ static int16_t read_GR_min_removed_data( uint16_t *bitstream, int16_t *p_bit_pos static int16_t decode_fixed_rate_composed_index_coherence( uint16_t *bitstream, int16_t *p_bit_pos, const int16_t no_bands, int16_t *no_cv_vec, uint16_t *decoded_index, const int16_t no_symb ); -#ifdef HR_METADATA static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction ); @@ -121,7 +112,6 @@ static int16_t ivas_qmetadata_raw_decode_dir_512( IVAS_QDIRECTION *q_direction, static int16_t read_surround_coherence_hr( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData ); static int16_t read_coherence_data_hr_512( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir, const int16_t nbits_coh ); -#endif /*-----------------------------------------------------------------------* @@ -463,10 +453,8 @@ int16_t ivas_qmetadata_dec_decode( if ( all_coherence_zero == 0 ) { bits_coherence = read_coherence_data( bitstream, index, hQMetaData, d -#ifdef HR_METADATA , 0 -#endif ); } else @@ -516,19 +504,15 @@ int16_t ivas_qmetadata_dec_decode( if ( raw_flag[0] == 0 ) { bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, nbands, start_band -#ifdef HR_METADATA , 0 -#endif ); } else { bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, nbands, start_band -#ifdef HR_METADATA , 0 -#endif ); } } @@ -550,10 +534,8 @@ int16_t ivas_qmetadata_dec_decode( if ( raw_flag[b] == 0 ) { bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, b + 1, b -#ifdef HR_METADATA , 0 -#endif ); } else @@ -599,10 +581,8 @@ int16_t ivas_qmetadata_dec_decode( if ( raw_flag[b] ) { bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, b + 1, b -#ifdef HR_METADATA , 0 -#endif ); } } @@ -638,10 +618,8 @@ int16_t ivas_qmetadata_dec_decode( if ( nblocks > 1 ) { decode_spread_coherence( hQMetaData, d, nblocks -#ifdef HR_METADATA , 0 -#endif ); } } @@ -783,7 +761,6 @@ int16_t ivas_qmetadata_dec_decode( } -#ifdef HR_METADATA /*-----------------------------------------------------------------------* * ivas_qmetadata_dec_decode_hr_384_512() * @@ -1248,7 +1225,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( return ( start_index_0 - *index ); } -#endif /*-----------------------------------------------------------------------* @@ -1637,7 +1613,6 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness( } -#ifdef HR_METADATA /*-------------------------------------------------------------------* * ivas_qmetadata_entropy_decode_diffuseness_hr() * @@ -1764,7 +1739,6 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness_hr_512( return ( index_start - *index ); } -#endif /*-------------------------------------------------------------------* @@ -1899,10 +1873,8 @@ static int16_t ivas_qmetadata_entropy_decode_dir( const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ -#endif ) { int16_t b, m; @@ -1930,18 +1902,14 @@ static int16_t ivas_qmetadata_entropy_decode_dir( /*Raw coding for high diffuseness*/ for ( b = start_band; b < nbands; b++ ) { -#ifdef HR_METADATA if ( hrmasa_flag ) { diff_idx = 0; } else { -#endif diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; -#ifdef HR_METADATA } -#endif diff_idx_min = min( diff_idx_min, diff_idx ); if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) @@ -1953,11 +1921,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( elev_alph[b] = no_theta_masa[bits_direction_masa[diff_idx] - 3] * 2 - 1; } -#ifdef HR_METADATA if ( q_direction->band_data[b].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame ) -#else - if ( diff_idx > diffuseness_index_max_ec_frame ) -#endif { bands_entropic[b] = 0; @@ -2010,18 +1974,14 @@ static int16_t ivas_qmetadata_entropy_decode_dir( if ( bands_entropic[b] ) { int16_t tmp_index; -#ifdef HR_METADATA if ( hrmasa_flag ) { diff_idx = 0; } else { -#endif diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; -#ifdef HR_METADATA } -#endif if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { @@ -2071,18 +2031,14 @@ static int16_t ivas_qmetadata_entropy_decode_dir( { if ( bands_entropic[b] ) { -#ifdef HR_METADATA if ( hrmasa_flag ) { diff_idx = 0; } else { -#endif diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; -#ifdef HR_METADATA } -#endif for ( m = 0; m < nblocks; m++ ) { @@ -2141,18 +2097,14 @@ static int16_t ivas_qmetadata_entropy_decode_dir( { if ( bands_entropic[b] ) { -#ifdef HR_METADATA if ( hrmasa_flag ) { diff_idx = 0; } else { -#endif diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; -#ifdef HR_METADATA } -#endif for ( m = 0; m < nblocks; m++ ) { @@ -2273,7 +2225,6 @@ static int16_t ivas_qmetadata_entropy_decode_dir( } -#ifdef HR_METADATA /*------------------------------------------------------------------------- * ivas_qmetadata_raw_decode_dir() * @@ -2324,7 +2275,6 @@ static int16_t ivas_qmetadata_raw_decode_dir_512( return ( index_start - *index ); } -#endif /*------------------------------------------------------------------------- * ivas_qmetadata_raw_decode_dir() @@ -2338,10 +2288,8 @@ static int16_t ivas_qmetadata_raw_decode_dir( int16_t *index, const int16_t nbands, const int16_t start_band -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ -#endif ) { int16_t b, m, azith_alph; @@ -2360,18 +2308,14 @@ static int16_t ivas_qmetadata_raw_decode_dir( } else { -#ifdef HR_METADATA if ( hrmasa_flag ) { diff_idx = 0; } else { -#endif diff_idx = q_direction->band_data[b].energy_ratio_index_mod[0]; -#ifdef HR_METADATA } -#endif for ( m = 0; m < nblocks; m++ ) { @@ -3413,10 +3357,8 @@ static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: quantized metadata structure */ int16_t idx_d, /* i : direction index */ const int16_t no_frames /* i : number of time subframes */ -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ -#endif ) { int16_t i, j; @@ -3426,9 +3368,7 @@ static void decode_spread_coherence( int16_t MASA_grouping[MASA_MAXIMUM_CODING_SUBBANDS]; IVAS_QDIRECTION *q_direction; int16_t coding_subbands, coding_subbands_0, d, two_dir_band[MASA_MAXIMUM_CODING_SUBBANDS]; -#ifdef HR_METADATA int16_t min_index; -#endif coding_subbands_0 = hQMetaData->q_direction[0].cfg.nbands; coding_subbands = hQMetaData->q_direction[idx_d].cfg.nbands; @@ -3485,7 +3425,6 @@ static void decode_spread_coherence( { var_azi = var( q_direction->band_data[i].azimuth, no_frames ); -#ifdef HR_METADATA if ( hrmasa_flag ) { minimum_s( (int16_t *) ( q_direction->band_data[i].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); @@ -3504,16 +3443,6 @@ static void decode_spread_coherence( { idx_sub_cb = MASA_NO_CV_COH * ( min_index + DIRAC_DIFFUSE_LEVELS ); /* NO_CV_COH = 8 */ } -#else - if ( var_azi < MASA_DELTA_AZI_DCT0 ) - { - idx_sub_cb = MASA_NO_CV_COH * q_direction->band_data[i].energy_ratio_index[0]; - } - else - { - idx_sub_cb = MASA_NO_CV_COH * ( q_direction->band_data[i].energy_ratio_index[0] + DIRAC_DIFFUSE_LEVELS ); /* NO_CV_COH = 8 */ - } -#endif dct_coh[i][0] = coherence_cb0_masa[idx_sub_cb + q_direction->coherence_band_data[i].spread_coherence_dct0_index]; @@ -3774,7 +3703,6 @@ static int16_t decode_fixed_rate_composed_index_coherence( } -#ifdef HR_METADATA /*-------------------------------------------------------------------* * read_coherence_data_hr_512() * @@ -3852,7 +3780,6 @@ static int16_t read_coherence_data_hr_512( nbits = nbits - *p_bit_pos; return nbits; } -#endif /*------------------------------------------------------------------- * @@ -3867,10 +3794,8 @@ static int16_t read_coherence_data( int16_t *p_bit_pos, /* i : position in the bitstream */ IVAS_QMETADATA *hQMetaData, /* i/o: quantized metadata structure */ const int16_t idx_dir /* i : direction index */ -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ -#endif ) { int16_t j; @@ -3888,9 +3813,7 @@ static int16_t read_coherence_data( int16_t decoded_idx[MASA_MAXIMUM_CODING_SUBBANDS]; uint16_t byteBuffer; int16_t idx_ER; -#ifdef HR_METADATA int16_t min_index; -#endif coding_subbands = hQMetaData->q_direction[idx_dir].cfg.nbands; @@ -3902,7 +3825,6 @@ static int16_t read_coherence_data( { for ( j = 0; j < coding_subbands; j++ ) { -#ifdef HR_METADATA if ( hrmasa_flag ) { idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + coding_subbands / MASA_FACTOR_CV_COH; @@ -3910,11 +3832,8 @@ static int16_t read_coherence_data( else { -#endif idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH; -#ifdef HR_METADATA } -#endif no_cv_vec[j] = idx_ER + 1; } @@ -3938,11 +3857,7 @@ static int16_t read_coherence_data( { if ( no_cv_vec[j] > 1 ) { -#ifdef HR_METADATA q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); -#else - q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_idx[j] * ( 255.0f / (float) ( 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH ) ) ); -#endif } else { @@ -3959,11 +3874,7 @@ static int16_t read_coherence_data( { if ( no_cv_vec[j] > 1 ) { -#ifdef HR_METADATA q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> ( hrmasa_flag ) ) + coding_subbands / MASA_FACTOR_CV_COH ) ) ); -#else - q_direction->coherence_band_data[j].spread_coherence[0] = (uint8_t) roundf( decoded_index[j] * ( 255.0f / (float) ( 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + coding_subbands / MASA_FACTOR_CV_COH ) ) ); -#endif } else { @@ -3976,7 +3887,6 @@ static int16_t read_coherence_data( { for ( j = 0; j < coding_subbands; j++ ) { -#ifdef HR_METADATA if ( hrmasa_flag ) { minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); @@ -3984,11 +3894,8 @@ static int16_t read_coherence_data( } else { -#endif no_cv_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; /* spread coherence DCT0*/ -#ifdef HR_METADATA } -#endif } if ( sum_s( no_cv_vec, coding_subbands ) > MASA_COH_LIMIT_2IDX ) @@ -4274,7 +4181,6 @@ static int16_t read_surround_coherence( } -#ifdef HR_METADATA /*-------------------------------------------------------------------* * read_surround_coherence_hr() * @@ -4434,7 +4340,6 @@ static int16_t read_surround_coherence_hr( return bits_sur_coherence; } -#endif /*-------------------------------------------------------------------* * decode_combined_index() diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 707e1b3397..17a9b68074 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -62,14 +62,12 @@ static int16_t encode_lfe_to_total_energy_ratio( MASA_ENCODER_HANDLE hMasa, BSTR static void reduce_metadata_further( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hqmetadata, const IVAS_FORMAT ivas_format ); static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] -#ifdef HR_METADATA , const SPHERICAL_GRID_DATA *sphGrid #ifdef FIX_505_MASA_SPHGRID_REUSE , const uint8_t useSphGrid #endif -#endif ); static void copy_masa_metadata_subframe( const MASA_METADATA_HANDLE hMetaFrom, const uint8_t sfFrom, MASA_METADATA_HANDLE hMetaTo, const uint8_t sfTo ); @@ -250,19 +248,15 @@ ivas_error ivas_masa_encode( mvr2r( hMasa->masaMetadata.directional_meta[i].azimuth[j], h_orig_metadata[i].azimuth[j], MASA_FREQUENCY_BANDS ); mvr2r( hMasa->masaMetadata.directional_meta[i].elevation[j], h_orig_metadata[i].elevation[j], MASA_FREQUENCY_BANDS ); mvr2r( hMasa->masaMetadata.directional_meta[i].energy_ratio[j], h_orig_metadata[i].energy_ratio[j], MASA_FREQUENCY_BANDS ); -#ifdef HR_METADATA mvs2s( (int16_t *) ( hMasa->masaMetadata.directional_meta[i].spherical_index[j] ), (int16_t *) ( h_orig_metadata[i].spherical_index[j] ), MASA_FREQUENCY_BANDS ); -#endif } } } -#ifdef HR_METADATA if ( ivas_format == MASA_FORMAT && ivas_total_brate >= IVAS_384k ) { hMasa->config.mergeRatiosOverSubframes = 0; } -#endif /* Combine frequency bands and sub-frames */ combine_freqbands_and_subframes( hMasa ); @@ -327,7 +321,6 @@ ivas_error ivas_masa_encode( } /* Encode metadata */ -#ifdef HR_METADATA if ( ivas_total_brate >= IVAS_384k ) { if ( ivas_total_brate >= IVAS_512k ) @@ -341,12 +334,9 @@ ivas_error ivas_masa_encode( } else { -#endif ivas_qmetadata_enc_encode( hMetaData, hQMetaData, 0 ); -#ifdef HR_METADATA } -#endif *nb_bits_metadata = hMetaData->nb_bits_tot; @@ -512,10 +502,8 @@ ivas_error ivas_masa_enc_config( int16_t maxBin, sf; #endif ivas_error error; -#ifdef HR_METADATA #ifndef FIX_505_MASA_SPHGRID_REUSE SPHERICAL_GRID_DATA *sphGrid; -#endif #endif error = IVAS_ERR_OK; @@ -537,7 +525,6 @@ ivas_error ivas_masa_enc_config( if ( hMasa->data.sync_state.frame_mode == MASA_FRAME_1SF && hMasa->data.sync_state.prev_offset != 0 ) { -#ifdef HR_METADATA #ifndef FIX_505_MASA_SPHGRID_REUSE if ( ( sphGrid = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) { @@ -552,19 +539,16 @@ ivas_error ivas_masa_enc_config( { sphGrid->no_theta = 0; } -#endif #endif /* average over sub-frames */ average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy -#ifdef HR_METADATA , #ifdef FIX_505_MASA_SPHGRID_REUSE &( hMasa->data.Sph_Grid16 ), ivas_total_brate == IVAS_512k ? TRUE : FALSE #else sphGrid -#endif #endif ); } @@ -1149,9 +1133,7 @@ static void move_metadata_to_qmetadata( hQMeta->q_direction[dir].band_data[band].azimuth[sf] = hMeta->directional_meta[dir].azimuth[sf][band]; hQMeta->q_direction[dir].band_data[band].elevation[sf] = hMeta->directional_meta[dir].elevation[sf][band]; hQMeta->q_direction[dir].band_data[band].energy_ratio[sf] = hMeta->directional_meta[dir].energy_ratio[sf][band]; -#ifdef HR_METADATA hQMeta->q_direction[dir].band_data[band].spherical_index[sf] = hMeta->directional_meta[dir].spherical_index[sf][band]; -#endif if ( hQMeta->q_direction[dir].coherence_band_data != NULL ) { hQMeta->q_direction[dir].coherence_band_data[band].spread_coherence[sf] = (uint8_t) roundf( hMeta->directional_meta[dir].spread_coherence[sf][band] * UINT8_MAX ); @@ -1840,14 +1822,12 @@ void ivas_masa_enc_reconfigure( static void average_masa_metadata( MASA_METADATA_FRAME *hMeta, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] -#ifdef HR_METADATA , const SPHERICAL_GRID_DATA *Sph_Grid16 #ifdef FIX_505_MASA_SPHGRID_REUSE , const uint8_t useSphGrid #endif -#endif ) { int16_t i, j, k; @@ -1895,7 +1875,6 @@ static void average_masa_metadata( j = 0; hMeta->directional_meta[i].azimuth[j][k] = atan2f( y_sum, x_sum ) / EVS_PI * 180.0f; hMeta->directional_meta[i].elevation[j][k] = atan2f( z_sum, sqrtf( x_sum * x_sum + y_sum * y_sum ) ) / EVS_PI * 180.0f; -#ifdef HR_METADATA #ifdef FIX_505_MASA_SPHGRID_REUSE if ( useSphGrid == TRUE ) #else @@ -1905,7 +1884,6 @@ static void average_masa_metadata( hMeta->directional_meta[i].spherical_index[j][k] = index_theta_phi_16( &( hMeta->directional_meta[i].elevation[j][k] ), &( hMeta->directional_meta[i].azimuth[j][k] ), Sph_Grid16 ); } -#endif vec_len = sqrtf( x_sum * x_sum + y_sum * y_sum + z_sum * z_sum ); hMeta->directional_meta[i].energy_ratio[j][k] = vec_len / ( energy_sum + EPSILON ); diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 213c0ce756..bae7edc5fd 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -61,10 +61,8 @@ static void ivas_qmetadata_reorder_2dir_bands( IVAS_QMETADATA_HANDLE hQMetaData static int16_t ivas_qmetadata_entropy_encode_df_ratio( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, int16_t *df_ratio_bits ); static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits -#ifdef HR_METADATA , const int16_t hrmasa_flag -#endif ); static int16_t ivas_qmetadata_raw_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t nbands, const int16_t start_band ); @@ -94,19 +92,15 @@ static ivas_error write_ec_direction( int16_t *num_bits_written, BSTR_ENC_HANDLE static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t j_idx, const int16_t len ); static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence -#ifdef HR_METADATA , const int16_t hrmasa_flag -#endif ); static void dct4_transform( uint8_t *v, float *dct_v ); static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb -#ifdef HR_METADATA , const int16_t hrmasa_flag -#endif ); static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, const int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ); @@ -133,7 +127,6 @@ static void transform_azimuth_dir2( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *d static int16_t calc_var_azi( const IVAS_QDIRECTION *q_direction, const int16_t diffuseness_index_max_ec_frame, const float avg_azimuth, float *avg_azimuth_out ); -#ifdef HR_METADATA static void ivas_qmetadata_quantize_diffuseness_nrg_ratios_hr( IVAS_QMETADATA_HANDLE hQMetaData, int16_t *needed_bits, int16_t *nbits_diff, int16_t *dfRatioBits, const int16_t bits_dir_hr ); static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, uint16_t *diffuseness_index_max_ec_frame ); @@ -145,7 +138,6 @@ static int16_t encode_surround_coherence_hr( IVAS_QMETADATA *hQMetaData, BSTR_EN static void ivas_qmetadata_reorder_2dir_bands_hr( IVAS_QMETADATA_HANDLE hQMetaData ); static int16_t ivas_qmetadata_quantize_coherence_hr_512( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t bits_coh ); -#endif /*-----------------------------------------------------------------------* @@ -424,10 +416,8 @@ ivas_error ivas_qmetadata_enc_encode( if ( all_coherence_zero == 0 ) { bits_coherence[d] = ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 0, &indice_coherence -#ifdef HR_METADATA , 0 -#endif ); } @@ -441,10 +431,8 @@ ivas_error ivas_qmetadata_enc_encode( { /* Quantize directions*/ quantize_direction_frame( q_direction, azimuth_orig, elevation_orig -#ifdef HR_METADATA , 0 -#endif ); } @@ -480,10 +468,8 @@ ivas_error ivas_qmetadata_enc_encode( reduce_bits = hQMetaData->is_masa_ivas_format ? ( total_bits_1dir - ( bits_diff[d] + bits_coherence[d] + bits_signaling[d] ) - 1 ) : MASA_MAX_BITS; bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, q_direction->cfg.nbands, q_direction->cfg.start_band, bits_dir_bands[0], reduce_bits -#ifdef HR_METADATA , 0 -#endif ); if ( bits_ec < 0 ) @@ -539,10 +525,8 @@ ivas_error ivas_qmetadata_enc_encode( /* Write ec bits */ bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, i + 1, i, bits_dir_bands[i], MASA_MAX_BITS -#ifdef HR_METADATA , 0 -#endif ); if ( bits_ec >= 0 ) @@ -647,10 +631,8 @@ ivas_error ivas_qmetadata_enc_encode( bit_pos_start = hMetaData->nb_bits_tot; hMetaData->nb_bits_tot = bit_pos_start_coh; ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 1, &indice_coherence -#ifdef HR_METADATA , 0 -#endif ); hMetaData->nb_bits_tot = bit_pos_start; } @@ -740,7 +722,6 @@ ivas_error ivas_qmetadata_enc_encode( } -#ifdef HR_METADATA /*-----------------------------------------------------------------------* * ivas_qmetadata_enc_encode_hr_384_512() * @@ -1015,7 +996,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( #endif return error; } -#endif /*-----------------------------------------------------------------------* @@ -1472,7 +1452,6 @@ int16_t quantize_direction2D( } -#ifdef HR_METADATA /*------------------------------------------------------------------------- * ivas_qmetadata_quantize_diffuseness_nrg_ratios() * @@ -1765,7 +1744,6 @@ static int16_t ivas_qmetadata_entropy_encode_diffuseness_hr( return ( hMetaData->nb_bits_tot - start_bit_pos ); } -#endif /*------------------------------------------------------------------------- * ivas_qmetadata_quantize_diffuseness_nrg_ratios() @@ -2583,10 +2561,8 @@ static int16_t ivas_qmetadata_entropy_encode_dir( const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits -#ifdef HR_METADATA , const int16_t hrmasa_flag -#endif ) { uint16_t diff_idx_min; @@ -2634,18 +2610,14 @@ static int16_t ivas_qmetadata_entropy_encode_dir( for ( i = start_band; i < nbands; i++ ) { -#ifdef HR_METADATA if ( hrmasa_flag ) { diff_idx_min = 0; // min( q_direction->band_data[i].energy_ratio_index_mod[0]>>1, diff_idx_min ); } else { -#endif diff_idx_min = min( q_direction->band_data[i].energy_ratio_index_mod[0], diff_idx_min ); -#ifdef HR_METADATA } -#endif if ( q_direction->band_data[i].energy_ratio_index_mod[0] > diffuseness_index_max_ec_frame ) { @@ -4856,10 +4828,8 @@ static int16_t encode_spread_coherence_1sf( IVAS_QMETADATA *q_metadata, /* i : quantized metadata */ const int16_t idx_d, /* i : current direction index */ BSTR_ENC_HANDLE hMasaMetaData /* i/o: metadata bitstream handle */ -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ -#endif ) { int16_t i, j, k; @@ -4890,18 +4860,14 @@ static int16_t encode_spread_coherence_1sf( extra_cv = coding_subbands / MASA_FACTOR_CV_COH; for ( j = 0; j < coding_subbands; j++ ) { -#ifdef HR_METADATA if ( hrmasa_flag ) { idx_ER = 7 - ( q_direction->band_data[j].energy_ratio_index_mod[0] >> 1 ) + extra_cv; } else { -#endif idx_ER = 7 - q_direction->band_data[j].energy_ratio_index_mod[0] + extra_cv; -#ifdef HR_METADATA } -#endif if ( idx_ER > 0 ) { @@ -5252,7 +5218,6 @@ static int16_t encode_surround_coherence( } -#ifdef HR_METADATA static int16_t encode_surround_coherence_hr( IVAS_QMETADATA *hQMetaData, /* i : quantized metadata */ BSTR_ENC_HANDLE hMetaData /* i/o: metadata bitstream handle */ @@ -5453,7 +5418,6 @@ static int16_t encode_surround_coherence_hr( return nbits; } -#endif /*-------------------------------------------------------------------* @@ -5472,21 +5436,16 @@ static float quantize_DCT_0_coh( IVAS_QDIRECTION *q_direction, /* i : quantized metadata */ uint16_t *idx_x, /* o : codewords index */ int16_t *p_no_cb /* o : actual number of codewords dependent on energy ratio value */ -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ -#endif ) { float var_azi, xhat; int16_t idx_sub_cb, idx; -#ifdef HR_METADATA int16_t min_index; -#endif /* quantize first DCT component */ var_azi = var( q_direction->band_data[j].azimuth, q_direction->cfg.nblocks ); -#ifdef HR_METADATA if ( hrmasa_flag ) { minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); @@ -5509,20 +5468,6 @@ static float quantize_DCT_0_coh( idx = squant( x, &xhat, &coherence_cb[idx_sub_cb], len_cb_dct0_masa[min_index] ); *p_no_cb = len_cb_dct0_masa[min_index]; -#else - if ( var_azi < delta_var ) - { - idx_sub_cb = no_cb * q_direction->band_data[j].energy_ratio_index[0]; - } - else - { - idx_sub_cb = no_cb * ( q_direction->band_data[j].energy_ratio_index[0] + DIRAC_DIFFUSE_LEVELS ); - } - - idx = squant( x, &xhat, &coherence_cb[idx_sub_cb], len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]] ); - - *p_no_cb = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; -#endif *idx_x = idx; return xhat; @@ -5591,7 +5536,6 @@ static void dct4_transform( } -#ifdef HR_METADATA /*-------------------------------------------------------------------* * ivas_qmetadata_quantize_coherence_hr_512() * @@ -5697,7 +5641,6 @@ static int16_t ivas_qmetadata_quantize_coherence_hr_512( nbits = hMetaData->nb_bits_tot - nbits; return nbits; } -#endif /*-------------------------------------------------------------------* @@ -5714,10 +5657,8 @@ static int16_t ivas_qmetadata_quantize_coherence( BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ const int16_t write_flag, /* i : flag to actually write the data or not */ int16_t *indice_coherence -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ -#endif ) { int16_t j, k; @@ -5732,10 +5673,8 @@ static int16_t ivas_qmetadata_quantize_coherence( int16_t two_dir_band[MASA_MAXIMUM_CODING_SUBBANDS]; int16_t no_cb_vec[MASA_MAXIMUM_CODING_SUBBANDS]; IVAS_QDIRECTION *q_direction; -#ifdef HR_METADATA int16_t min_index; min_index = 0; -#endif q_direction = &( hQMetaData->q_direction[idx_d] ); coding_subbands = q_direction->cfg.nbands; nbits = 0; @@ -5748,10 +5687,8 @@ static int16_t ivas_qmetadata_quantize_coherence( if ( hQMetaData->q_direction[idx_d].cfg.nblocks == 1 ) { nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData -#ifdef HR_METADATA , hrmasa_flag -#endif ); return nbits; @@ -5808,7 +5745,6 @@ static int16_t ivas_qmetadata_quantize_coherence( /* DCT transform */ dct4_transform( hQMetaData->q_direction[idx_d].coherence_band_data[j].spread_coherence, dct_coh[j] ); -#ifdef HR_METADATA if ( hrmasa_flag ) { minimum_s( (int16_t *) ( q_direction->band_data[j].energy_ratio_index ), q_direction->cfg.nblocks, &min_index ); @@ -5816,20 +5752,15 @@ static int16_t ivas_qmetadata_quantize_coherence( } else { -#endif no_cb_vec[j] = len_cb_dct0_masa[q_direction->band_data[j].energy_ratio_index[0]]; -#ifdef HR_METADATA } -#endif if ( write_flag ) { /* quantize first DCT parameter */ dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j] -#ifdef HR_METADATA , hrmasa_flag -#endif ); } @@ -5994,7 +5925,6 @@ static void ivas_qmetadata_reorder_2dir_bands( } -#ifdef HR_METADATA /*-------------------------------------------------------------------* * ivas_qmetadata_reorder_2dir_bands_hr() * @@ -6052,7 +5982,6 @@ static void ivas_qmetadata_reorder_2dir_bands_hr( return; } -#endif /*-------------------------------------------------------------------* diff --git a/lib_enc/ivas_qspherical_enc.c b/lib_enc/ivas_qspherical_enc.c index 4c79b875b7..00ca0f1cd6 100644 --- a/lib_enc/ivas_qspherical_enc.c +++ b/lib_enc/ivas_qspherical_enc.c @@ -60,10 +60,8 @@ void quantize_direction_frame( IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] -#ifdef HR_METADATA , const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ -#endif ) { int16_t i, j; @@ -97,7 +95,6 @@ void quantize_direction_frame( q_direction->not_in_2D += q_direction->band_data[i].elevation_index[j]; -#ifdef HR_METADATA if ( hrmasa_flag ) { if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) @@ -113,7 +110,6 @@ void quantize_direction_frame( } else { -#endif if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) { q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3]; @@ -124,9 +120,7 @@ void quantize_direction_frame( q_direction->band_data[i].elevation_m_alphabet[j] = no_theta_masa[bits_direction_masa[idx] - 3] * 2 - 1; q_direction->band_data[i].azimuth_m_alphabet[j] = no_phi_masa[bits_direction_masa[idx] - 1][( q_direction->band_data[i].elevation_index[j] + 1 ) >> 1]; } -#ifdef HR_METADATA } -#endif if ( q_direction->band_data[i].azimuth_index[j] == MASA_NO_INDEX ) { diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c index 90756a39b1..09cdf1b2d0 100644 --- a/lib_util/masa_file_reader.c +++ b/lib_util/masa_file_reader.c @@ -96,161 +96,6 @@ IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle( } -#ifndef HR_METADATA -/*------------------------------------------------------------------------- - * deindex_sph_idx() - * - * deindex the MASA metadata from the input metadata file - *------------------------------------------------------------------------*/ -static void deindex_sph_idx( - const uint16_t sphIndex, /* i : Spherical index */ - const SPHERICAL_GRID_DATA *gridData, /* i : Prepared spherical grid */ - float *theta, /* o : Elevation */ - float *phi /* o : Azimuth */ -) -{ - float ba_crt, del_crt, div_crt, a4_crt; - float estim; - int32_t base_low, base_up; - int16_t n_crt; - int16_t id_th; - int16_t sign_theta; - int16_t id_phi; - int16_t no_th = gridData->no_theta; - const int16_t *n = gridData->no_phi; - const float ba[3] = { - 2.137991118026424e+02f, - 1.244854404591542e+02f, - 1.228408647140870e+02f, - }; - const float del[3] = { 7.998262115303199e+05f, 1.300883976959332e+06f, 1.424072242426373e+06f }; - const float div[3] = { -0.237662341081474f, -0.100938185496887f, -0.092050209205032f }; - const float a4[3] = { -8.415300425381099f, -19.814106922515204f, -21.727272727270197f }; - const uint16_t limit_index1 = 64964, limit_index2 = 47870; - - if ( sphIndex >= limit_index1 ) - { - ba_crt = ba[2]; - div_crt = div[2]; - a4_crt = a4[2]; - del_crt = del[2]; - } - else if ( sphIndex >= limit_index2 ) - { - ba_crt = ba[1]; - div_crt = div[1]; - a4_crt = a4[1]; - del_crt = del[1]; - } - else - { - ba_crt = ba[0]; - div_crt = div[0]; - a4_crt = a4[0]; - del_crt = del[0]; - } - estim = ba_crt + div_crt * sqrtf( del_crt + a4_crt * sphIndex ); - - if ( estim > MASA_NO_CIRCLES ) - { - estim = MASA_NO_CIRCLES; - } - - assert( estim > 0 ); - id_th = (int16_t) roundf( estim ) - 1; - if ( id_th < 0 ) - { - id_th = 0; - } - - if ( id_th == 0 ) - { - base_low = 0; - base_up = n[0]; - } - else - { - estim = MASA_ANGLE_AT_EQUATOR * (float) ( id_th - 0.5f ); - base_low = n[0]; - if ( id_th >= 2 ) - { - if ( id_th == 2 ) - { - base_low += 2 * (int16_t) ceilf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) ); - } - else - { - base_low += 2 * (int16_t) roundf( MASA_NTOT2_FAC * ( sinf( estim ) - MASA_ASIN_OFFSET ) ); - } - } - base_up = base_low + 2 * n[id_th]; - } - - sign_theta = 1; - - n_crt = n[id_th]; - if ( sphIndex < base_low ) - { - id_th--; - n_crt = n[id_th]; - if ( id_th == 0 ) - { - base_low = 0; - base_up = n_crt; - } - else - { - base_up = base_low; - base_low -= 2 * n[id_th]; - } - assert( sphIndex >= base_low ); - } - else if ( sphIndex >= base_up ) - { - id_th++; - n_crt = n[id_th]; - base_low = base_up; - base_up += 2 * n_crt; - assert( sphIndex < base_up ); - } - - id_phi = (int16_t) ( sphIndex - base_low ); - if ( sphIndex - base_low >= n_crt ) - { - id_phi -= n_crt; - sign_theta = -1; - } - - if ( id_th == 0 ) - { - *theta = 0.f; - *phi = (float) sphIndex * 360 / (float) n_crt - 180; - } - else - { - if ( id_th == no_th - 1 ) - { - id_phi = 0; - *phi = -180; - *theta = 90 * (float) sign_theta; - } - else - { - *theta = id_th * MASA_ANGLE_AT_EQUATOR_DEG * (float) sign_theta; - if ( id_th % 2 == 0 ) - { - *phi = (float) id_phi * 360 / (float) n_crt - 180; - } - else - { - *phi = ( (float) id_phi + 0.5f ) * 360 / (float) n_crt - 180; - } - } - } - - return; -} -#endif /*------------------------------------------------------------------------- @@ -344,9 +189,7 @@ ivas_error MasaFileReader_readNextFrame( for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) { deindex_sph_idx( readIndex[b], &self->sph_grid16, &( hMeta->directional_meta[i].elevation[j][b] ), &( hMeta->directional_meta[i].azimuth[j][b] ) ); -#ifdef HR_METADATA hMeta->directional_meta[i].spherical_index[j][b] = readIndex[b]; -#endif } /* Direct-to-total ratio */ -- GitLab From 36b6d26cc97c45682c37c7e3e8ab4bc501b77253 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:32:41 +0200 Subject: [PATCH 225/381] [cleanup] accept SBA_TD_RESIDUAL --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 9c1c6ff625..b258c52eba 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define SBA_TD_RESIDUAL /* Dlb : Issue 426: SBA encoder complexity optimization */ #define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */ #define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ -- GitLab From e4a50a64085f1b41bbdeeb84ffc052101b8bf609 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:33:17 +0200 Subject: [PATCH 226/381] [cleanup] accept FIX_357_DTX_32K --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index b258c52eba..33b5aca8a5 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_357_DTX_32K /* Eri: issue 357 - Forced LP-CNG at 32k */ #define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ #define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ -- GitLab From 7532e399821167b4d288c7bdad8d16f5a5a8e906 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:33:55 +0200 Subject: [PATCH 227/381] [cleanup] accept FIX_435_ISM_MERGE_BUG --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 33b5aca8a5..fcc7ef5182 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_435_ISM_MERGE_BUG /* Eri: Merge bug fix for ISM NULL metadata and tcx_only cases */ #define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ -- GitLab From eb6eee3687df8bb75f51b1fde93429abefb9b8ac Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:34:39 +0200 Subject: [PATCH 228/381] [cleanup] accept FIX_355_REFACTOR_PARAMBIN_TO_5MS --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index fcc7ef5182..c6612e86fb 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_355_REFACTOR_PARAMBIN_TO_5MS /* Nokia: Fixes issue 355 by refactoring parametric binauralizer code to 5 ms mode */ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ -- GitLab From d6e1ff2635da0c78268d3c5d4b96844edf8ed245 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:35:46 +0200 Subject: [PATCH 229/381] [cleanup] accept FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index c6612e86fb..5f016efa99 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ #define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ -- GitLab From 4f1785ea64cb91e413003873dcb772391c9b162d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:36:37 +0200 Subject: [PATCH 230/381] [cleanup] accept COMBINED_FORMAT_SIGNALING --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5f016efa99..ece0331349 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,7 +149,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ #define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ -- GitLab From 3988e6f2f016cb66bc9a904d08f6cd1a96ef4e73 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:37:41 +0200 Subject: [PATCH 231/381] [cleanup] accept FIX_356_ISM_METADATA_SYNC --- apps/decoder.c | 8 ---- lib_com/options.h | 1 - lib_dec/ivas_objectRenderer_internal.c | 19 -------- lib_dec/ivas_stat_dec.h | 2 - lib_dec/lib_dec.c | 8 ---- lib_dec/lib_dec.h | 4 -- lib_rend/ivas_objectRenderer.c | 66 -------------------------- lib_rend/ivas_objectRenderer_sources.c | 8 ---- lib_rend/ivas_prot_rend.h | 21 -------- 9 files changed, 137 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 7ceda8f6f3..455114a186 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -386,18 +386,10 @@ int main( /*------------------------------------------------------------------------------------------* * Configure the decoder *------------------------------------------------------------------------------------------*/ -#ifdef FIX_356_ISM_METADATA_SYNC #ifdef FIX_439_OTR_PARAMS if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef FIX_439_OTR_PARAMS - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain ) ) != IVAS_ERR_OK ) -#endif #endif { diff --git a/lib_com/options.h b/lib_com/options.h index ece0331349..4cd607270b 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ -#define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ #define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index ba14104ed9..c023c14f79 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -75,7 +75,6 @@ ivas_error ivas_td_binaural_renderer( const int16_t output_frame /* i : output frame length */ ) { -#ifdef FIX_356_ISM_METADATA_SYNC int16_t ism_md_subframe_update; if ( st_ivas->hDecoderConfig->Opt_delay_comp ) @@ -92,14 +91,6 @@ ivas_error ivas_td_binaural_renderer( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, ism_md_subframe_update, output, output_frame ); -#else - return ivas_td_binaural_renderer_unwrap( - st_ivas->hReverb, - st_ivas->transport_config, - st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, - st_ivas->hIsmMetaData, st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, - ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, output, output_frame ); -#endif } @@ -125,7 +116,6 @@ ivas_error ivas_td_binaural_renderer_sf( int16_t ch, slot_size, slots_to_render, output_frame; ivas_error error; -#ifdef FIX_356_ISM_METADATA_SYNC int16_t ism_md_subframe_update_jbm; int16_t c_indx, nS; @@ -139,7 +129,6 @@ ivas_error ivas_td_binaural_renderer_sf( ism_md_subframe_update_jbm = st_ivas->hTcBuffer->nb_subframes - 2; } -#endif for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { p_reverb_signal[ch] = reverb_signal[ch]; @@ -174,7 +163,6 @@ ivas_error ivas_td_binaural_renderer_sf( output_frame = st_ivas->hTcBuffer->subframe_nbslots[subframe_idx] * st_ivas->hTcBuffer->n_samples_granularity; /* Update object position(s) */ -#ifdef FIX_356_ISM_METADATA_SYNC c_indx = 0; for ( nS = 0; nS < st_ivas->nchan_transport; nS++ ) @@ -190,9 +178,6 @@ ivas_error ivas_td_binaural_renderer_sf( { TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, st_ivas->ivas_format, st_ivas->hIsmMetaData ); } -#else - TDREND_Update_object_positions( st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, tc_local ); -#endif /* Update the listener's location/orientation */ TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, st_ivas->hDecoderConfig->Opt_Headrotation, @@ -208,11 +193,7 @@ ivas_error ivas_td_binaural_renderer_sf( } /* Render subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC if ( ( error = TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0, ism_md_subframe_update_jbm ) ) != IVAS_ERR_OK ) -#else - if ( ( error = TDREND_GetMix( st_ivas->hBinRendererTd, output_f_local, output_frame, 0 ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index cd565f3eae..892f941c7d 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1226,9 +1226,7 @@ typedef struct decoder_config_structure #ifdef JBM_TSM_ON_TCS int16_t voip_active; #endif -#ifdef FIX_356_ISM_METADATA_SYNC int16_t Opt_delay_comp; /* flag indicating delay compensation active */ -#endif } DECODER_CONFIG, *DECODER_CONFIG_HANDLE; diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index fd33c41101..062add5aaa 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -280,9 +280,7 @@ static void init_decoder_config( hDecoderConfig->voip_active = 0; #endif -#ifdef FIX_356_ISM_METADATA_SYNC hDecoderConfig->Opt_delay_comp = 0; -#endif return; } @@ -450,12 +448,8 @@ ivas_error IVAS_DEC_Configure( #endif const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ -#ifdef FIX_356_ISM_METADATA_SYNC const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ const int16_t delayCompensationEnabled /* i : enable delay compensation */ -#else - const float non_diegetic_pan_gain /* i : non diegetic panning gain */ -#endif ) { Decoder_Struct *st_ivas; @@ -511,9 +505,7 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan; hDecoderConfig->non_diegetic_pan_gain = non_diegetic_pan_gain; -#ifdef FIX_356_ISM_METADATA_SYNC hDecoderConfig->Opt_delay_comp = delayCompensationEnabled; -#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 0539d75188..3b42cb80de 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -152,12 +152,8 @@ ivas_error IVAS_DEC_Configure( #endif const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ -#ifdef FIX_356_ISM_METADATA_SYNC const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ const int16_t delayCompensationEnabled /* i : enable delay compensation */ -#else - const float non_diegetic_pan_gain /* i : non diegetic panning gain */ -#endif ); void IVAS_DEC_Close( diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 2f5b406c66..1b6f2eeccc 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -263,9 +263,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ -#endif #ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ #else @@ -278,9 +276,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( int16_t subframe_idx; float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; ivas_error error; -#ifdef FIX_356_ISM_METADATA_SYNC int16_t c_indx, nS; -#endif #ifdef JBM_TSM_ON_TCS float *p_reverb_signal[BINAURAL_CHANNELS]; int16_t ch; @@ -293,7 +289,6 @@ ivas_error ivas_td_binaural_renderer_unwrap( subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; -#ifdef FIX_356_ISM_METADATA_SYNC c_indx = 0; for ( nS = 0; nS < num_src; nS++ ) { @@ -304,20 +299,14 @@ ivas_error ivas_td_binaural_renderer_unwrap( c_indx++; } } -#else - /* Update object position(s) */ - TDREND_Update_object_positions( hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, output ); -#endif for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { -#ifdef FIX_356_ISM_METADATA_SYNC if ( subframe_idx == ism_md_subframe_update ) { /* Update object position(s) */ TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); } -#endif /* Update the listener's location/orientation */ TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); @@ -334,11 +323,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( } /* Render subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx, ism_md_subframe_update ) ) != IVAS_ERR_OK ) -#else - if ( ( error = TDREND_GetMix( hBinRendererTd, output, subframe_length, subframe_idx ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -369,12 +354,8 @@ ivas_error TDREND_GetMix( float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ #endif const int16_t subframe_length, /* i/o: subframe length */ -#ifdef FIX_356_ISM_METADATA_SYNC const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ -#else - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ -#endif ) { int16_t i; @@ -387,11 +368,9 @@ ivas_error TDREND_GetMix( float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH]; int16_t intp_count; float pan_left, pan_right; -#ifdef FIX_356_ISM_METADATA_SYNC int16_t subframe_update_flag; subframe_update_flag = subframe_idx == ism_md_subframe_update; -#endif error = IVAS_ERR_OK; @@ -416,11 +395,7 @@ ivas_error TDREND_GetMix( if ( ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING ) && ( hBinRendererTd->Listener_p->PoseUpdated || SrcSpatial_p->Updated ) ) { TDREND_SRC_REND_UpdateFiltersFromSpatialParams( hBinRendererTd, SrcRend_p, SrcSpatial_p, Src_p->hrf_left_prev, -#ifdef FIX_356_ISM_METADATA_SYNC Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_update_flag ); -#else - Src_p->hrf_right_prev, hrf_left_delta, hrf_right_delta, &intp_count, &Src_p->filterlength, &Src_p->itd, &Src_p->Gain, Src_p, subframe_idx ); -#endif } /* Render source if needed */ @@ -481,45 +456,20 @@ static void TDREND_Clear_Update_flags( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ const int16_t num_src, /* i : number of sources to render */ -#ifndef FIX_356_ISM_METADATA_SYNC - const int16_t lfe_idx, /* i : Input LFE index */ -#endif const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ -#ifndef FIX_356_ISM_METADATA_SYNC - , -#ifdef JBM_TSM_ON_TCS - float *output[] /* i/o: SCE/MC channels */ -#else - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ -#endif -#endif ) { TDREND_DirAtten_t *DirAtten_p; int16_t nS; float Pos[3]; float Dir[3]; -#ifndef FIX_356_ISM_METADATA_SYNC - int16_t c_indx; -#endif DirAtten_p = hBinRendererTd->DirAtten_p; /* For each source, write the frame data to the source object*/ -#ifndef FIX_356_ISM_METADATA_SYNC - c_indx = 0; -#endif for ( nS = 0; nS < num_src; nS++ ) { -#ifndef FIX_356_ISM_METADATA_SYNC - if ( !( in_format == MC_FORMAT && nS == lfe_idx ) ) /* Skip LFE for MC */ - { - hBinRendererTd->Sources[c_indx]->InputFrame_p = output[nS]; - hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE; - c_indx++; - } -#endif if ( in_format == ISM_FORMAT ) { /* Update the source positions */ @@ -689,9 +639,7 @@ ivas_error ivas_td_binaural_renderer_ext( IVAS_REND_AudioConfigType inConfigType; AUDIO_CONFIG transport_config; ivas_error error; -#ifdef FIX_356_ISM_METADATA_SYNC int16_t ism_md_subframe_update_ext; -#endif #ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS]; int16_t ch; @@ -707,9 +655,7 @@ ivas_error ivas_td_binaural_renderer_ext( inConfigType = getAudioConfigType( inConfig ); lfe_idx = LFE_CHANNEL; hIsmMetaData[0] = NULL; -#ifdef FIX_356_ISM_METADATA_SYNC ism_md_subframe_update_ext = 0; -#endif if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) { @@ -743,25 +689,13 @@ ivas_error ivas_td_binaural_renderer_ext( } #ifdef JBM_TSM_ON_TCS -#ifdef FIX_356_ISM_METADATA_SYNC if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) #else - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, p_output, output_frame ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef FIX_356_ISM_METADATA_SYNC if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, output, output_frame ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, output, output_frame ) ) != IVAS_ERR_OK ) -#endif #endif { return error; diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 1468273572..a1cac4f1d3 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -259,11 +259,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, /* i/o: Source pointer */ -#ifdef FIX_356_ISM_METADATA_SYNC const int16_t subframe_update_flag -#else - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ -#endif ) { TDREND_MIX_Listener_t *Listener_p; @@ -357,11 +353,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( azim_delta = ( azim_delta > 180.0f ) ? ( azim_delta - 360 ) : ( ( azim_delta < -180.0f ) ? ( azim_delta + 360 ) : ( azim_delta ) ); /* map to -180:180 range */ *intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) ); -#ifdef FIX_356_ISM_METADATA_SYNC if ( ( *intp_count > 0 ) && subframe_update_flag ) -#else - if ( ( *intp_count > 0 ) && subframe_idx == 0 ) -#endif { /* Set deltas for interpolation */ v_sub( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index ac9e765abe..a088f171c1 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -236,9 +236,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ -#ifdef FIX_356_ISM_METADATA_SYNC const int16_t ism_md_subframe_update, -#endif #ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ #else @@ -291,12 +289,8 @@ ivas_error TDREND_GetMix( float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ #endif const int16_t subframe_length, /* i/o: subframe length */ -#ifdef FIX_356_ISM_METADATA_SYNC const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ const int16_t ism_md_subframe_update /* Number of subframes to delay metadata to sync with audio */ -#else - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ -#endif ); void TDREND_Update_listener_orientation( @@ -309,19 +303,8 @@ void TDREND_Update_listener_orientation( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ const int16_t num_src, /* i : number of sources to render */ -#ifndef FIX_356_ISM_METADATA_SYNC - const int16_t lfe_idx, /* i : Input LFE index */ -#endif const IVAS_FORMAT in_format, /* i : Format of input sources */ const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ -#ifndef FIX_356_ISM_METADATA_SYNC - , -#ifdef JBM_TSM_ON_TCS - float *output[] /* i/o: SCE/MC channels */ -#else - float output[][L_FRAME48k] /* i/o: SCE/MC channels */ -#endif -#endif ); void BSplineModelEvalDealloc( @@ -392,11 +375,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, -#ifdef FIX_356_ISM_METADATA_SYNC const int16_t subframe_update_flag /* i : Flag to determine update subframe idx */ -#else - const int16_t subframe_idx /* i : Subframe index to 5 ms subframe */ -#endif ); ivas_error TDREND_SRC_Alloc( -- GitLab From 995c2d725bf8aaa718c68576c9ecdc420acf379d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:38:31 +0200 Subject: [PATCH 232/381] [cleanup] accept FIX_446_STEREO_DMX_CRASH --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4cd607270b..436d152325 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ -#define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ #define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */ -- GitLab From ec112185860448db706a93d82c9ef0a3ee492d33 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:39:25 +0200 Subject: [PATCH 233/381] [cleanup] accept FIX_386_CORECODER_RECONFIG_2 --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 436d152325..5163a82430 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -152,7 +152,6 @@ -#define FIX_386_CORECODER_RECONFIG_2 /* VA: Issue 386: Resolve remaining ToDo comments in CoreCoder reconfig. */ #define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ -- GitLab From a429a5a5e95e08825dc805b73d646603a003a59a Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:40:24 +0200 Subject: [PATCH 234/381] [cleanup] accept FIX_439_OTR_PARAMS --- apps/decoder.c | 8 ----- apps/renderer.c | 40 ------------------------ lib_com/common_api_types.h | 2 -- lib_com/ivas_cnst.h | 22 ------------- lib_com/options.h | 2 -- lib_dec/ivas_init_dec.c | 42 ------------------------- lib_dec/ivas_stat_dec.h | 4 --- lib_dec/lib_dec.c | 45 --------------------------- lib_dec/lib_dec.h | 6 ---- lib_rend/ivas_orient_trk.c | 63 -------------------------------------- lib_rend/ivas_prot_rend.h | 4 --- lib_rend/ivas_stat_rend.h | 4 --- lib_rend/lib_rend.c | 41 ------------------------- lib_rend/lib_rend.h | 4 --- 14 files changed, 287 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 455114a186..5eb46f618c 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -218,11 +218,7 @@ int main( * Open decoder handle *------------------------------------------------------------------------------------------*/ -#ifdef FIX_439_OTR_PARAMS if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_Open( &hIvasDec, arg.decMode, arg.orientation_tracking ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "Open failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; @@ -386,11 +382,7 @@ int main( /*------------------------------------------------------------------------------------------* * Configure the decoder *------------------------------------------------------------------------------------------*/ -#ifdef FIX_439_OTR_PARAMS if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); diff --git a/apps/renderer.c b/apps/renderer.c index 84d616af1e..640899679b 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -144,11 +144,7 @@ typedef struct char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; -#ifdef FIX_439_OTR_PARAMS int8_t orientation_tracking; -#else - int8_t orientationTracking; -#endif int16_t nonDiegeticPan; float nonDiegeticPanGain; bool delayCompensationEnabled; @@ -771,11 +767,7 @@ int main( } } -#ifdef FIX_439_OTR_PARAMS if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientation_tracking ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_REND_SetOrientationTrackingMode( hIvasRend, args.orientationTracking ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1475,54 +1467,30 @@ static bool parseDiegeticPan( static bool parseOrientationTracking( char *value, -#ifdef FIX_439_OTR_PARAMS int8_t *orientation_tracking -#else - int8_t *tracking_type -#endif ) { to_upper( value ); if ( strcmp( value, "NONE" ) == 0 ) { -#ifdef FIX_439_OTR_PARAMS *orientation_tracking = HEAD_ORIENT_TRK_NONE; -#else - *tracking_type = IVAS_ORIENT_TRK_NONE; -#endif } else if ( strcmp( value, "REF" ) == 0 ) { -#ifdef FIX_439_OTR_PARAMS *orientation_tracking = HEAD_ORIENT_TRK_REF; -#else - *tracking_type = IVAS_ORIENT_TRK_REF; -#endif } else if ( strcmp( value, "AVG" ) == 0 ) { -#ifdef FIX_439_OTR_PARAMS *orientation_tracking = HEAD_ORIENT_TRK_AVG; -#else - *tracking_type = IVAS_ORIENT_TRK_AVG; -#endif } else if ( strcmp( value, "REF_VEC" ) == 0 ) { -#ifdef FIX_439_OTR_PARAMS *orientation_tracking = HEAD_ORIENT_TRK_REF_VEC; -#else - *tracking_type = IVAS_ORIENT_TRK_REF_VEC; -#endif } else if ( strcmp( value, "REF_VEC_LEV" ) == 0 ) { -#ifdef FIX_439_OTR_PARAMS *orientation_tracking = HEAD_ORIENT_TRK_REF_VEC_LEV; -#else - *tracking_type = IVAS_ORIENT_TRK_REF_VEC_LEV; -#endif } else { @@ -1746,11 +1714,7 @@ static CmdlnArgs defaultArgs( clearString( args.customHrtfFilePath ); clearString( args.renderConfigFilePath ); -#ifdef FIX_439_OTR_PARAMS args.orientation_tracking = HEAD_ORIENT_TRK_NONE; -#else - args.orientationTracking = IVAS_ORIENT_TRK_NONE; -#endif args.nonDiegeticPan = 0; args.nonDiegeticPanGain = 0.f; @@ -1858,11 +1822,7 @@ static void parseOption( break; case CmdLnOptionId_orientationTracking: assert( numOptionValues == 1 ); -#ifdef FIX_439_OTR_PARAMS if ( !parseOrientationTracking( optionValues[0], &args->orientation_tracking ) ) -#else - if ( !parseOrientationTracking( optionValues[0], &args->orientationTracking ) ) -#endif { fprintf( stderr, "Unknown option for orientation tracking: %s\n", optionValues[0] ); exit( -1 ); diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index 33ddc9e881..17cc8e2abb 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -94,7 +94,6 @@ typedef struct float x, y, z; } IVAS_VECTOR3; -#ifdef FIX_439_OTR_PARAMS typedef enum { HEAD_ORIENT_TRK_NONE, @@ -103,7 +102,6 @@ typedef enum HEAD_ORIENT_TRK_REF_VEC, HEAD_ORIENT_TRK_REF_VEC_LEV } HEAD_ORIENT_TRK_T; -#endif typedef struct ivas_masa_metadata_frame_struct *IVAS_MASA_METADATA_HANDLE; typedef struct ivas_masa_decoder_ext_out_meta_struct *MASA_DECODER_EXT_OUT_META_HANDLE; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index f59ac2f000..3ba4c27c93 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1606,28 +1606,6 @@ typedef enum } SFX_OpMode_t; -#ifndef FIX_439_OTR_PARAMS -/*----------------------------------------------------------------------------------* - * Orientation tracking constants - *----------------------------------------------------------------------------------*/ - -/* Orientation tracking types */ -#define IVAS_ORIENT_TRK_NONE 0 -#define IVAS_ORIENT_TRK_REF 1 -#define IVAS_ORIENT_TRK_AVG 2 -#define IVAS_ORIENT_TRK_REF_VEC 3 -#define IVAS_ORIENT_TRK_REF_VEC_LEV 4 - -typedef enum -{ - OTR_TRACKING_NONE = IVAS_ORIENT_TRK_NONE, - OTR_TRACKING_REF_ORIENT = IVAS_ORIENT_TRK_REF, /* track orientation relative to external reference orientation (default: no rotation) */ - OTR_TRACKING_AVG_ORIENT = IVAS_ORIENT_TRK_AVG /* track orientation relative to average orientation */ - , - OTR_TRACKING_REF_VEC = IVAS_ORIENT_TRK_REF_VEC, /* track orientation relative to external reference vector */ - OTR_TRACKING_REF_VEC_LEV = IVAS_ORIENT_TRK_REF_VEC_LEV /* track orientation relative to level component of external reference vector */ -} OTR_TRACKING_T; -#endif /*----------------------------------------------------------------------------------* * Reverberator constants diff --git a/lib_com/options.h b/lib_com/options.h index 5163a82430..b5d598b7f4 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ -#define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ #define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */ @@ -173,7 +172,6 @@ #define COMPLEXITY_LEVEL_INDICATION -#define FIX_439_OTR_PARAMS /* Philips: Issue 439: orientation tracking parameter aspects. */ #define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 2452b34edb..6faa3a3a49 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -786,52 +786,10 @@ ivas_error ivas_init_decoder( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { -#ifdef FIX_439_OTR_PARAMS if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, st_ivas->hDecoderConfig->orientation_tracking ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_NONE ) - { - if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_NONE ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_AVG ) - { - if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_AVG_ORIENT ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_REF ) - { - if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_REF_ORIENT ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_REF_VEC ) - { - if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_REF_VEC ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( st_ivas->hDecoderConfig->orientation_tracking == IVAS_ORIENT_TRK_REF_VEC_LEV ) - { - if ( ( error = ivas_orient_trk_SetTrackingType( st_ivas->hHeadTrackData->OrientationTracker, OTR_TRACKING_REF_VEC_LEV ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - return IVAS_ERR_WRONG_MODE; - } -#endif } /*-----------------------------------------------------------------* diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 892f941c7d..f92781d6d8 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1210,11 +1210,7 @@ typedef struct decoder_config_structure int16_t Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ -#ifdef FIX_439_OTR_PARAMS HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ -#else - int16_t orientation_tracking; /* indicates orientation tracking type */ -#endif int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ float non_diegetic_pan_gain; /* non diegetic panning gain*/ int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 062add5aaa..76bb28480c 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -115,11 +115,7 @@ static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSampl static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, int16_t *pcmBuf ); #endif static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); -#ifdef FIX_439_OTR_PARAMS static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); -#else -static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig, const int16_t orientation_tracking ); -#endif #ifdef JBM_TSM_ON_TCS static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas ); static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( IVAS_DEC_HANDLE hIvasDec ); @@ -141,10 +137,6 @@ static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, ivas_error IVAS_DEC_Open( IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ const IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ -#ifndef FIX_439_OTR_PARAMS - , - const int16_t orientation_tracking /* i : orientation tracking type */ -#endif ) { IVAS_DEC_HANDLE hIvasDec; @@ -198,11 +190,7 @@ ivas_error IVAS_DEC_Open( st_ivas = hIvasDec->st_ivas; /* initialize Decoder Config. handle */ -#ifdef FIX_439_OTR_PARAMS init_decoder_config( hIvasDec->st_ivas->hDecoderConfig ); -#else - init_decoder_config( hIvasDec->st_ivas->hDecoderConfig, orientation_tracking ); -#endif /* initialize pointers to handles to NULL */ ivas_initialize_handles_dec( st_ivas ); @@ -255,10 +243,6 @@ ivas_error IVAS_DEC_Open( static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig /* i/o: configuration structure */ -#ifndef FIX_439_OTR_PARAMS - , - const int16_t orientation_tracking -#endif ) { hDecoderConfig->Opt_AMR_WB = 0; @@ -268,11 +252,7 @@ static void init_decoder_config( hDecoderConfig->Opt_HRTF_binary = 0; hDecoderConfig->Opt_Headrotation = 0; hDecoderConfig->Opt_RendConfigCustom = 0; -#ifdef FIX_439_OTR_PARAMS hDecoderConfig->orientation_tracking = HEAD_ORIENT_TRK_NONE; -#else - hDecoderConfig->orientation_tracking = orientation_tracking; -#endif hDecoderConfig->Opt_non_diegetic_pan = 0; hDecoderConfig->non_diegetic_pan_gain = 0; @@ -443,9 +423,7 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ -#ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ -#endif const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ @@ -498,9 +476,7 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_LsCustom = customLsOutputEnabled; hDecoderConfig->Opt_Headrotation = enableHeadRotation; -#ifdef FIX_439_OTR_PARAMS hDecoderConfig->orientation_tracking = orientation_tracking; -#endif hDecoderConfig->Opt_HRTF_binary = hrtfReaderEnabled; hDecoderConfig->Opt_RendConfigCustom = renderConfigEnabled; hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan; @@ -2760,7 +2736,6 @@ static ivas_error printConfigInfo_dec( fprintf( stdout, "Head rotation: ON\n" ); } -#ifdef FIX_439_OTR_PARAMS if ( st_ivas->hDecoderConfig->orientation_tracking != HEAD_ORIENT_TRK_NONE ) { switch ( st_ivas->hDecoderConfig->orientation_tracking ) @@ -2781,26 +2756,6 @@ static ivas_error printConfigInfo_dec( break; } } -#else - if ( st_ivas->hDecoderConfig->orientation_tracking != IVAS_ORIENT_TRK_NONE ) - { - switch ( st_ivas->hDecoderConfig->orientation_tracking ) - { - case IVAS_ORIENT_TRK_AVG: - fprintf( stdout, "Orientation tracking: AVG\n" ); - break; - case IVAS_ORIENT_TRK_REF: - fprintf( stdout, "Orientation tracking: REF\n" ); - break; - case IVAS_ORIENT_TRK_REF_VEC: - fprintf( stdout, "Orientation tracking: REF_VEC\n" ); - break; - case IVAS_ORIENT_TRK_REF_VEC_LEV: - fprintf( stdout, "Orientation tracking: REF_VEC_LEV\n" ); - break; - } - } -#endif if ( st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) { diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 3b42cb80de..c317b45e3a 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -133,10 +133,6 @@ typedef ivas_error ( *JbmTraceFileWriterFn )( const void *data, void *writer ); ivas_error IVAS_DEC_Open( IVAS_DEC_HANDLE *phIvasDec, /* i/o: pointer to an IVAS decoder handle to be opened */ IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ -#ifndef FIX_439_OTR_PARAMS - , - const int16_t orientation_tracking /* i : orientation tracking type */ -#endif ); /*! r: error code */ @@ -147,9 +143,7 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ -#ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ -#endif const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index ae646b4d5c..5fc4b7c45a 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -406,11 +406,7 @@ ivas_error ivas_orient_trk_Init( pOTR->refRot = identity; /* set safe default tracking mode */ -#ifdef FIX_439_OTR_PARAMS pOTR->orientation_tracking = HEAD_ORIENT_TRK_NONE; -#else - pOTR->trackingType = OTR_TRACKING_NONE; -#endif return IVAS_ERR_OK; } @@ -424,11 +420,7 @@ ivas_error ivas_orient_trk_Init( ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ -#ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ -#else - const OTR_TRACKING_T trackingType /* i/o: orientation tracking type */ -#endif ) { if ( pOTR == NULL ) @@ -436,11 +428,7 @@ ivas_error ivas_orient_trk_SetTrackingType( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef FIX_439_OTR_PARAMS pOTR->orientation_tracking = orientation_tracking; -#else - pOTR->trackingType = trackingType; -#endif return IVAS_ERR_OK; } @@ -491,35 +479,17 @@ ivas_error ivas_orient_trk_GetMainOrientation( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef FIX_439_OTR_PARAMS switch ( pOTR->orientation_tracking ) -#else - switch ( pOTR->trackingType ) -#endif { -#ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_NONE: -#else - case OTR_TRACKING_NONE: -#endif *pOrientation = IdentityQuaternion(); break; -#ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_REF_VEC: case HEAD_ORIENT_TRK_REF_VEC_LEV: case HEAD_ORIENT_TRK_REF: -#else - case OTR_TRACKING_REF_VEC: - case OTR_TRACKING_REF_VEC_LEV: - case OTR_TRACKING_REF_ORIENT: -#endif *pOrientation = pOTR->refRot; break; -#ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_AVG: -#else - case OTR_TRACKING_AVG_ORIENT: -#endif *pOrientation = pOTR->absAvgRot; break; } @@ -571,30 +541,15 @@ ivas_error ivas_orient_trk_SetReferenceVector( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef FIX_439_OTR_PARAMS switch ( pOTR->orientation_tracking ) -#else - switch ( pOTR->trackingType ) -#endif { -#ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_NONE: case HEAD_ORIENT_TRK_REF: case HEAD_ORIENT_TRK_AVG: case HEAD_ORIENT_TRK_REF_VEC: -#else - case OTR_TRACKING_NONE: - case OTR_TRACKING_REF_ORIENT: - case OTR_TRACKING_AVG_ORIENT: - case OTR_TRACKING_REF_VEC: -#endif acousticFrontVector = VectorSubtract( listenerPos, refPos ); break; -#ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_REF_VEC_LEV: -#else - case OTR_TRACKING_REF_VEC_LEV: -#endif /* ignore the height difference between listener position and reference position */ listenerPosLevel.z = refPosLevel.z = listenerPos.z; listenerPosLevel.x = listenerPos.x; @@ -652,28 +607,14 @@ ivas_error ivas_orient_trk_Process( result = IVAS_ERR_OK; -#ifdef FIX_439_OTR_PARAMS switch ( pOTR->orientation_tracking ) -#else - switch ( pOTR->trackingType ) -#endif { -#ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_NONE: -#else - case OTR_TRACKING_NONE: -#endif pOTR->trkRot = absRot; break; -#ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_REF: case HEAD_ORIENT_TRK_REF_VEC: case HEAD_ORIENT_TRK_REF_VEC_LEV: -#else - case OTR_TRACKING_REF_VEC: - case OTR_TRACKING_REF_VEC_LEV: - case OTR_TRACKING_REF_ORIENT: -#endif /* Reset average orientation */ pOTR->absAvgRot = absRot; @@ -685,11 +626,7 @@ ivas_error ivas_orient_trk_Process( QuaternionProduct( pOTR->trkRot, absRot, &pOTR->trkRot ); break; -#ifdef FIX_439_OTR_PARAMS case HEAD_ORIENT_TRK_AVG: -#else - case OTR_TRACKING_AVG_ORIENT: -#endif /* Compute average (low-pass filtered) absolute orientation */ QuaternionSlerp( pOTR->absAvgRot, absRot, alpha, &pOTR->absAvgRot ); diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index a088f171c1..f59ab91e0d 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -897,11 +897,7 @@ ivas_error ivas_orient_trk_Init( ivas_error ivas_orient_trk_SetTrackingType( ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ -#ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ -#else - const OTR_TRACKING_T trackingType /* i : orientation tracking type */ -#endif ); ivas_error ivas_orient_trk_SetReferenceRotation( diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 877076db9a..b90b7b5507 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -228,11 +228,7 @@ typedef struct EFAP typedef struct ivas_orient_trk_state_t { -#ifdef FIX_439_OTR_PARAMS HEAD_ORIENT_TRK_T orientation_tracking; -#else - OTR_TRACKING_T trackingType; -#endif float centerAdaptationRate; float offCenterAdaptationRate; float adaptationAngle; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 41f68b6520..4551426e2a 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3914,51 +3914,10 @@ ivas_error IVAS_REND_SetHeadRotation( ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -#ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ -#else - const uint8_t otrMode /* i : Orientation tracking mode */ -#endif ) { -#ifdef FIX_439_OTR_PARAMS return ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, orientation_tracking ); -#else - OTR_TRACKING_T mode; - ivas_error error; - - if ( hIvasRend == NULL ) - { - return IVAS_ERR_UNEXPECTED_NULL_POINTER; - } - - switch ( otrMode ) - { - case IVAS_ORIENT_TRK_AVG: - mode = OTR_TRACKING_AVG_ORIENT; - break; - case IVAS_ORIENT_TRK_REF: - mode = OTR_TRACKING_REF_ORIENT; - break; - case IVAS_ORIENT_TRK_REF_VEC: - mode = OTR_TRACKING_REF_VEC; - break; - case IVAS_ORIENT_TRK_REF_VEC_LEV: - mode = OTR_TRACKING_REF_VEC_LEV; - break; - case IVAS_ORIENT_TRK_NONE: - default: - mode = OTR_TRACKING_NONE; - break; - } - - if ( ( error = ivas_orient_trk_SetTrackingType( hIvasRend->headRotData.hOrientationTracker, mode ) ) != IVAS_ERR_OK ) - { - return error; - } - - return IVAS_ERR_OK; -#endif } diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 33cbd78f56..cf0db7e4b5 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -251,11 +251,7 @@ ivas_error IVAS_REND_SetHeadRotation( ivas_error IVAS_REND_SetOrientationTrackingMode( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -#ifdef FIX_439_OTR_PARAMS const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ -#else - const uint8_t otrMode /* i : Orientation tracking mode */ -#endif ); ivas_error IVAS_REND_SetReferenceRotation( -- GitLab From f6a99021563653b7c62246c1aac8e9ced111ef03 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:41:12 +0200 Subject: [PATCH 235/381] [cleanup] accept FIX_440_PARAM_ISM_DIR_NOISE --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index b5d598b7f4..d84610484f 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ -#define FIX_440_PARAM_ISM_DIR_NOISE /* FhG: Issue 440: Fix directional background noise becoming diffuse in ParamISM */ #define LBR_SBA_DIRAC_FIX /* DLB: Bug fix for DirAC at low bitrates */ -- GitLab From 76b8d3ffc987be9cf4c89bd3c61cf5513067db50 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:42:18 +0200 Subject: [PATCH 236/381] [cleanup] accept LBR_SBA_DIRAC_FIX --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index d84610484f..dbbbe76f3c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ -#define LBR_SBA_DIRAC_FIX /* DLB: Bug fix for DirAC at low bitrates */ #define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */ #define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ -- GitLab From 724a7438c9bb881de7d139639cde9bb97589e46c Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:43:19 +0200 Subject: [PATCH 237/381] [cleanup] accept FIX_445_SNS_BUGFIXES --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index dbbbe76f3c..1bc295f563 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ -#define FIX_445_SNS_BUGFIXES /* FhG: bug fix for spectral tilt in SNS computation + necessary update of codebooks and converison to fixedpoint-compatible tables */ #define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ -- GitLab From 5c0e81219173dac20cb1557ba9a4900a8324f960 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:44:09 +0200 Subject: [PATCH 238/381] [cleanup] accept FIX_447_PARAMBIN_MASA_REGU_FAC --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1bc295f563..7324e4adfc 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ -#define FIX_447_PARAMBIN_MASA_REGU_FAC /* Nokia: Issue 447: Fix issue by adjusting regularization factor minimum value. */ #define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ #define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ -- GitLab From 9419fc1c87031390a594d4fe9c4987daf6e38b12 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:44:53 +0200 Subject: [PATCH 239/381] [cleanup] accept FIX_441_SBA_PARAMBIN_GAINS --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7324e4adfc..29a6d266b6 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ -#define FIX_441_SBA_PARAMBIN_GAINS /* Nokia: Fix issue 441 by changing gains in SBA path of parametric binauralizer */ #define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ #define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ -- GitLab From dfb5ff6579e2cbd81d9426316dd393b47f3b300d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:45:43 +0200 Subject: [PATCH 240/381] [cleanup] accept MC_PARAMUPMIX_MODE --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 29a6d266b6..8d33de3978 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,6 @@ -#define MC_PARAMUPMIX_MODE /* Dlb: Contribution 39: Multichannel Parametric Upmix */ #define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ #define FIX_MASA_DELAY_PRINTOUT /* VA: issue 444: fix MASA decoder delay printout */ -- GitLab From 0280b6cdbc34901a88d5123d5069b198a71e2945 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:47:21 +0200 Subject: [PATCH 241/381] [cleanup] accept FIX_469_BRSWITCH_PUPMIX --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8d33de3978..43c96f9bfc 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,6 @@ -#define FIX_469_BRSWITCH_PUPMIX /* Dlb: Fix issue 469 for Param Upmix bitrate switching */ #define FIX_MASA_DELAY_PRINTOUT /* VA: issue 444: fix MASA decoder delay printout */ #define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ -- GitLab From b41179349fbab06922ec4100e303a946bafb2ead Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:48:04 +0200 Subject: [PATCH 242/381] [cleanup] accept FIX_MASA_DELAY_PRINTOUT --- lib_com/options.h | 1 - lib_dec/lib_dec.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 43c96f9bfc..4351af7175 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,6 @@ -#define FIX_MASA_DELAY_PRINTOUT /* VA: issue 444: fix MASA decoder delay printout */ #define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ #define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 76bb28480c..3f1c20643a 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1599,13 +1599,11 @@ ivas_error IVAS_DEC_GetDelay( nSamples[2] = (int16_t) roundf( (float) st_ivas->binaural_latency_ns * hDecoderConfig->output_Fs / 1000000000.f ); nSamples[0] = nSamples[1] + nSamples[2]; -#ifdef FIX_MASA_DELAY_PRINTOUT if ( st_ivas->ivas_format == MASA_FORMAT ) { /* note: in MASA, all delay is compensated at the decoder by default, so subtract the encoder delay for print-out */ nSamples[1] -= NS2SA( hDecoderConfig->output_Fs, IVAS_ENC_DELAY_NS ); } -#endif *timeScale = hDecoderConfig->output_Fs; -- GitLab From 629a817d92d1559a11e174d9d76835f92158b5dc Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:48:49 +0200 Subject: [PATCH 243/381] [cleanup] accept HODIRAC --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4351af7175..07219993b3 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,7 +158,6 @@ -#define HODIRAC /* FhG: Contribution 32: Sector-based HO-DirAC method for SBA at high bitrates */ #define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ -- GitLab From ffc6a2d3db2b18b26ea3e781c6019690bc715e28 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:49:34 +0200 Subject: [PATCH 244/381] [cleanup] accept DIRAC_ALLOC_HARM --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 07219993b3..4708230822 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,7 +158,6 @@ -#define DIRAC_ALLOC_HARM /* VA: harmonize DirAC parameters allocation/deallocation */ #define COMPLEXITY_LEVEL_INDICATION -- GitLab From 49ceda62b64f00da3ed9b94d625fdca4e65d5572 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:50:10 +0200 Subject: [PATCH 245/381] [cleanup] accept COMPLEXITY_LEVEL_INDICATION --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4708230822..5ee9ab59f9 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -160,7 +160,6 @@ -#define COMPLEXITY_LEVEL_INDICATION #define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ -- GitLab From 99ea4b1efef3a417ea2712194ad5ff1fe35dfb47 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:52:36 +0200 Subject: [PATCH 246/381] [cleanup] accept ARITH_HUFF_CODER_CHANGES --- lib_com/ivas_cnst.h | 4 -- lib_com/ivas_dirac_com.c | 58 ------------------------ lib_com/ivas_prot.h | 12 ----- lib_com/ivas_rom_com.c | 4 -- lib_com/ivas_spar_com.c | 8 ---- lib_com/ivas_stat_com.h | 2 - lib_com/options.h | 1 - lib_dec/ivas_spar_md_dec.c | 2 - lib_enc/ivas_entropy_coder.c | 86 ------------------------------------ lib_enc/ivas_sba_enc.c | 2 - lib_enc/ivas_spar_encoder.c | 8 ---- lib_enc/ivas_spar_md_enc.c | 83 ---------------------------------- 12 files changed, 270 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 3ba4c27c93..f4891c0a86 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1023,10 +1023,8 @@ typedef enum /* AGC constants */ #define AGC_BITS_PER_CH 3 #define AGC_EMAX 0 -#ifdef ARITH_HUFF_CODER_CHANGES #define AGC_SIGNALLING_BITS 1 #define IVAS_SPAR_ARITH_OVERSHOOT_BITS (16) -#endif /* Common SPAR metadata constants */ #define IVAS_ACTIVEW_DM_F_SCALE 0.5f @@ -1741,10 +1739,8 @@ typedef enum #define SPAR_DIRAC_DTX_BANDS ( SPAR_DTX_BANDS + DIRAC_DTX_BANDS ) #define CLDFB_PAR_WEIGHT_START_BAND 7 -#ifdef ARITH_HUFF_CODER_CHANGES #define QUANT_STRAT_0 0 #define QUANT_STRAT_2 2 -#endif /*----------------------------------------------------------------------------------* diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 091215ac63..55d9911c3e 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -377,7 +377,6 @@ void ivas_dirac_config_bands( return; } -#ifdef ARITH_HUFF_CODER_CHANGES void ivas_get_dirac_sba_max_md_bits( const int32_t sba_total_brate, int16_t *bits_frame_nominal, @@ -440,7 +439,6 @@ void ivas_get_dirac_sba_max_md_bits( return; } -#endif /*------------------------------------------------------------------------- * ivas_dirac_sba_config() @@ -547,68 +545,12 @@ ivas_error ivas_dirac_sba_config( } #endif } -#ifdef ARITH_HUFF_CODER_CHANGES ivas_get_dirac_sba_max_md_bits( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands ); -#else - if ( sba_total_brate <= IVAS_13k2 ) - { - hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 70; - } - else if ( sba_total_brate <= IVAS_16k4 ) - { - hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 80; - } - else if ( sba_total_brate <= IVAS_24k4 ) - { - hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 103; - } - else if ( sba_total_brate <= IVAS_32k ) - { - hQMetaData->bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 214; - } - else if ( sba_total_brate <= IVAS_48k ) - { - hQMetaData->bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 240; - } - else if ( sba_total_brate <= IVAS_64k ) - { - hQMetaData->bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_80k ) - { - hQMetaData->bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_96k ) - { - hQMetaData->bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_128k ) - { - hQMetaData->bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 250; - } - else - { - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); - hQMetaData->metadata_max_bits = MAX16B; /* no limit */ - } - - hQMetaData->metadata_max_bits = (int16_t) ceilf( (float) hQMetaData->metadata_max_bits * hQMetaData->q_direction[0].cfg.nbands / 5 ); - hQMetaData->qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1; -#endif return error; #ifndef SBA_MODE_CLEAN_UP diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 211b3f3326..25b2fb3711 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -119,10 +119,8 @@ ivas_error ivas_spar_md_enc_init ivas_error ivas_sba_enc_reconfigure( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ ); -#ifdef ARITH_HUFF_CODER_CHANGES int16_t ivas_sba_get_max_md_bits( Encoder_Struct *st_ivas ); -#endif void destroy_sce_enc( SCE_ENC_HANDLE hSCE /* i/o: SCE encoder structure */ @@ -3625,14 +3623,12 @@ void ivas_dirac_config_bands( IVAS_FB_MIXER_HANDLE hFbMdft ); -#ifdef ARITH_HUFF_CODER_CHANGES void ivas_get_dirac_sba_max_md_bits( const int32_t sba_total_brate, int16_t *bits_frame_nominal, int16_t *metadata_max_bits, int16_t *qmetadata_max_bit_req, int16_t nbands ); -#endif ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -4499,13 +4495,11 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ -#ifdef ARITH_HUFF_CODER_CHANGES , const int16_t dirac2spar_md_flag, const int16_t enc_flag, const int16_t pca_flag, const int16_t agc_flag -#endif ); void ivas_spar_bitrate_dist( @@ -5027,15 +5021,9 @@ int16_t ivas_get_bits_to_encode( void ivas_huffman_encode( ivas_huffman_cfg_t *huff_cfg, int16_t in, int16_t *hcode, int16_t *hlen ); void ivas_spar_huff_coeffs_com_init( ivas_huff_coeffs_t *pHuff_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); void ivas_spar_arith_coeffs_com_init( ivas_arith_coeffs_t *pArith_coeffs, ivas_spar_md_com_cfg *pSpar_cfg, const int16_t table_idx, const int16_t enc_dec ); -#ifdef ARITH_HUFF_CODER_CHANGES int16_t ivas_arith_encode_cmplx_cell_array( -#else -void ivas_arith_encode_cmplx_cell_array( -#endif ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff -#ifdef ARITH_HUFF_CODER_CHANGES , int32_t wc_strat_arith -#endif ); ivas_error ivas_huffman_decode( ivas_huffman_cfg_t *huff_cfg, Decoder_State *st0, int16_t *dec_out ); void ivas_arith_decode_cmplx_cell_array( ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, Decoder_State *st0, ivas_cell_dim_t *pCell_dims, int16_t *pDo_diff, const int16_t nB, int16_t *pSymbol_re, int16_t *pSymbol_re_old ); diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 8f32d0067f..67ed4d80bb 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -936,11 +936,7 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = { 256000, 0, SBA_HOA3_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 76300, 73550, 112000 },{ 59350, 57200, 56000 },{ 42400, 40850, 48000 },{ 25450, 24500, 40000 } }, { { 31, 11, 11, 1 },{ 1, 1, 1, 1 }, -#ifdef ARITH_HUFF_CODER_CHANGES { 1, 1, 1, 1 } -#else - { 31, 1, 1, 1 } -#endif }, 1, 2, 0 }, { 384000, 0, SBA_FOA_ORDER, FB, 24000, 4, WYXZ, 0, 0,{ { 128000, 128000, 128000 },{ 100000, 100000, 128000 },{ 79850, 79850, 104000 },{ 66600, 66600, 104000 } }, // not yet optimized diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 8e7da38580..f8f3fa1209 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2132,27 +2132,23 @@ void ivas_spar_set_bitrate_config( ivas_spar_md_com_cfg *pSpar_md_cfg, /* i/o: SPAR MD config. handle */ const int16_t table_idx, /* i : config. table index */ const int16_t num_bands /* i : number of bands */ -#ifdef ARITH_HUFF_CODER_CHANGES , const int16_t dirac2spar_md_flag, const int16_t enc_flag, const int16_t pca_flag, const int16_t agc_flag -#endif ) { int32_t ivas_total_brate; int16_t i, total_bits, max_bits, code, length; int16_t sba_order; int16_t md_coding_bits_header; -#ifdef ARITH_HUFF_CODER_CHANGES int16_t agc_bits, pca_bits, num_PR_bits_dirac_bands; int16_t bits_PR, bits_C, bits_P; int16_t wc_coarse_strat; int16_t n_input, n_dmx, n_dec; int16_t quant_strat; int16_t bands_bw; -#endif pSpar_md_cfg->nchan_transport = ivas_spar_br_table_consts[table_idx].nchan_transport; for ( i = 0; i < pSpar_md_cfg->nchan_transport; i++ ) @@ -2191,7 +2187,6 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->tgt_bits_per_blk -= md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk -= md_coding_bits_header; -#ifdef ARITH_HUFF_CODER_CHANGES if ( ivas_total_brate < IVAS_24k4 ) { bands_bw = 2; @@ -2200,7 +2195,6 @@ void ivas_spar_set_bitrate_config( { bands_bw = 1; } -#endif pSpar_md_cfg->tgt_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->tgt_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); pSpar_md_cfg->max_bits_per_blk = (int16_t) ceilf( ( 1.0f * pSpar_md_cfg->max_bits_per_blk * num_bands ) / IVAS_MAX_NUM_BANDS ); @@ -2208,7 +2202,6 @@ void ivas_spar_set_bitrate_config( pSpar_md_cfg->tgt_bits_per_blk += md_coding_bits_header; pSpar_md_cfg->max_bits_per_blk += md_coding_bits_header; -#ifdef ARITH_HUFF_CODER_CHANGES if ( enc_flag ) { /*calculate the actual worst case bits*/ @@ -2275,7 +2268,6 @@ void ivas_spar_set_bitrate_config( } pSpar_md_cfg->max_md_bits_spar = pSpar_md_cfg->max_bits_per_blk + agc_bits + pca_bits; } -#endif return; } diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index c4be5a6c63..fe261ef6e8 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -265,9 +265,7 @@ typedef struct ivas_spar_md_com_cfg int16_t agc_bits_ch_idx; int16_t planarCP; int16_t num_umx_chs; -#ifdef ARITH_HUFF_CODER_CHANGES int16_t max_md_bits_spar; -#endif } ivas_spar_md_com_cfg; diff --git a/lib_com/options.h b/lib_com/options.h index 5ee9ab59f9..07a234e8c0 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -162,7 +162,6 @@ -#define ARITH_HUFF_CODER_CHANGES /* DLB: Optimization of metadata memory for Huffman and arithmetic coders */ #define FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Eri: Remove unintentional reset of directivity pattern */ #define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 03f014ecfd..86fcaa1faf 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -487,11 +487,9 @@ ivas_error ivas_spar_md_dec_init( hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands -#ifdef ARITH_HUFF_CODER_CHANGES , hMdDec->spar_hoa_dirac2spar_md_flag, 0, 0, 0 -#endif ); nchan_transport = hMdDec->spar_md_cfg.nchan_transport; diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index 830a05e41a..02f3f1bea2 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -128,19 +128,13 @@ static ivas_error ivas_get_dyn_freq_model( * * Arith encoding of an array of symbols *-----------------------------------------------------------------------------------------*/ -#ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_arith_encode_array( -#else -static void ivas_arith_encode_array( -#endif int16_t *pInput, ivas_arith_t *pArith, BSTR_ENC_HANDLE hMetaData, const int16_t in_len -#ifdef ARITH_HUFF_CODER_CHANGES , int32_t wc_strat_arith -#endif ) { int16_t model_index, i, ind; @@ -152,12 +146,10 @@ static void ivas_arith_encode_array( if ( pArith->dyn_model_bits > 0 ) { ivas_get_dyn_freq_model( pInput, in_len, &model_index, pArith, &pCum_freq ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( ( hMetaData->nb_bits_tot + pArith->dyn_model_bits ) > wc_strat_arith ) { return -1; } -#endif push_next_indice( hMetaData, model_index, pArith->dyn_model_bits ); } else @@ -172,27 +164,19 @@ static void ivas_arith_encode_array( ind = pInput[i] - pArith->vals[0]; ivas_ari_encode_14bits_ext( hMetaData, &as, ind, (const uint16_t *) pCum_freq ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( hMetaData->nb_bits_tot > wc_strat_arith ) { return -1; } -#endif } ivas_ari_done_encoding_14bits( hMetaData, &as ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( hMetaData->nb_bits_tot > wc_strat_arith ) { return -1; } -#endif } -#ifdef ARITH_HUFF_CODER_CHANGES return 0; -#else - return; -#endif } @@ -201,26 +185,18 @@ static void ivas_arith_encode_array( * * Differential arith encoding *-----------------------------------------------------------------------------------------*/ -#ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_arithCoder_encode_array_diff( -#else -static void ivas_arithCoder_encode_array_diff( -#endif ivas_arith_t *pArith_diff, int16_t *pIn_new, int16_t *pIn_old_scratch, const int16_t length, BSTR_ENC_HANDLE hMetaData -#ifdef ARITH_HUFF_CODER_CHANGES , int32_t wc_strat_arith -#endif ) { int16_t n; -#ifdef ARITH_HUFF_CODER_CHANGES int16_t arith_result; -#endif if ( length > 0 ) { @@ -231,22 +207,14 @@ static void ivas_arithCoder_encode_array_diff( ivas_wrap_arround( pIn_old_scratch, pArith_diff->vals[0], pArith_diff->vals[pArith_diff->range - 1], length ); -#ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length, wc_strat_arith ); if ( arith_result < 0 ) { return -1; } -#else - ivas_arith_encode_array( pIn_old_scratch, pArith_diff, hMetaData, length ); -#endif } -#ifdef ARITH_HUFF_CODER_CHANGES return 0; -#else - return; -#endif } @@ -280,27 +248,19 @@ void ivas_huffman_encode( * * Arithmetic encode a cell array *-----------------------------------------------------------------------------------------*/ -#ifdef ARITH_HUFF_CODER_CHANGES static int16_t arith_encode_cell_array( -#else -static void arith_encode_cell_array( -#endif ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t nB, ivas_arith_t *pArith, int16_t *pSymbol -#ifdef ARITH_HUFF_CODER_CHANGES , int32_t wc_strat_arith -#endif ) { int16_t total_symbol_len = 0; int16_t i; -#ifdef ARITH_HUFF_CODER_CHANGES int16_t arith_result; -#endif for ( i = 0; i < nB; i++ ) { @@ -313,24 +273,16 @@ static void arith_encode_cell_array( { if ( pArith->range > 1 ) { -#ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len, wc_strat_arith ); if ( arith_result < 0 ) { return -1; } -#else - ivas_arith_encode_array( pSymbol, pArith, hMetaData, total_symbol_len ); -#endif } } -#ifdef ARITH_HUFF_CODER_CHANGES return 0; -#else - return; -#endif } @@ -339,27 +291,19 @@ static void arith_encode_cell_array( * * Arithmetic encode a cell array - differential *-----------------------------------------------------------------------------------------*/ -#ifdef ARITH_HUFF_CODER_CHANGES static int16_t arith_encode_cell_array_diff( -#else -static void arith_encode_cell_array_diff( -#endif const ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, int16_t nB, ivas_arith_t *pArith_diff, int16_t *pSymbol_old, int16_t *pSymbol -#ifdef ARITH_HUFF_CODER_CHANGES , int32_t wc_strat_arith -#endif ) { int16_t i, total_symbol_len; -#ifdef ARITH_HUFF_CODER_CHANGES int16_t arith_result; -#endif total_symbol_len = 0; for ( i = 0; i < nB; i++ ) @@ -373,24 +317,16 @@ static void arith_encode_cell_array_diff( { if ( pArith_diff->range > 1 ) { -#ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData, wc_strat_arith ); if ( arith_result < 0 ) { return -1; } -#else - ivas_arithCoder_encode_array_diff( pArith_diff, pSymbol, pSymbol_old, total_symbol_len, hMetaData ); -#endif } } -#ifdef ARITH_HUFF_CODER_CHANGES return 0; -#else - return; -#endif } @@ -399,11 +335,7 @@ static void arith_encode_cell_array_diff( * * Arithmetic encode a cell array *-----------------------------------------------------------------------------------------*/ -#ifdef ARITH_HUFF_CODER_CHANGES int16_t ivas_arith_encode_cmplx_cell_array( -#else -void ivas_arith_encode_cmplx_cell_array( -#endif ivas_arith_t *pArith_re, ivas_arith_t *pArith_re_diff, const int16_t *pDo_diff, @@ -413,10 +345,8 @@ void ivas_arith_encode_cmplx_cell_array( ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, const int16_t any_diff -#ifdef ARITH_HUFF_CODER_CHANGES , int32_t wc_strat_arith -#endif ) { int16_t input_old[IVAS_MAX_INPUT_LEN]; @@ -425,9 +355,7 @@ void ivas_arith_encode_cmplx_cell_array( ivas_cell_dim_t cell_dim[IVAS_MAX_NUM_BANDS], cell_dim_diff[IVAS_MAX_NUM_BANDS]; int16_t len, idx, i, j, idx1; int16_t total_len; -#ifdef ARITH_HUFF_CODER_CHANGES int16_t arith_result; -#endif idx1 = 0; if ( any_diff == 1 ) @@ -493,7 +421,6 @@ void ivas_arith_encode_cmplx_cell_array( }*/ #endif -#ifdef ARITH_HUFF_CODER_CHANGES arith_result = arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input, wc_strat_arith ); if ( arith_result < 0 ) @@ -507,30 +434,17 @@ void ivas_arith_encode_cmplx_cell_array( { return -1; } -#else - arith_encode_cell_array( cell_dim, hMetaData, nB, pArith_re, input ); - - arith_encode_cell_array_diff( cell_dim_diff, hMetaData, nB, pArith_re_diff, input_old, input_new ); -#endif } else { -#ifdef ARITH_HUFF_CODER_CHANGES arith_result = arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re, wc_strat_arith ); if ( arith_result < 0 ) { return -1; } -#else - arith_encode_cell_array( pCell_dims, hMetaData, nB, pArith_re, pSymbol_re ); -#endif } -#ifdef ARITH_HUFF_CODER_CHANGES return 0; -#else - return; -#endif } diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index e01de98741..c26f8e9983 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -285,7 +285,6 @@ ivas_error ivas_sba_enc_reconfigure( return error; } -#ifdef ARITH_HUFF_CODER_CHANGES int16_t ivas_sba_get_max_md_bits( Encoder_Struct *st_ivas ) { @@ -310,4 +309,3 @@ int16_t ivas_sba_get_max_md_bits( } return max_md_bits; } -#endif diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 5956ef03dd..4d4ed1ef6d 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -454,17 +454,13 @@ static ivas_error ivas_spar_enc_process( #endif int16_t nchan_fb_in; -#ifdef ARITH_HUFF_CODER_CHANGES /*Commented for now*/ /*int16_t start_nb_bits; int16_t total_md_bits, total_sba_bits;*/ -#endif push_wmops( "ivas_spar_enc_process" ); -#ifdef ARITH_HUFF_CODER_CHANGES /*Commented for now*/ // start_nb_bits = hMetaData->nb_bits_tot; -#endif /*-----------------------------------------------------------------------------------------* * Initialization @@ -681,12 +677,10 @@ static ivas_error ivas_spar_enc_process( { ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND -#ifdef ARITH_HUFF_CODER_CHANGES , hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, hSpar->AGC_Enable -#endif ); } } @@ -1048,12 +1042,10 @@ static ivas_error ivas_spar_enc_process( pop_wmops(); -#ifdef ARITH_HUFF_CODER_CHANGES /*Commented for now*/ /*total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; total_sba_bits = ivas_sba_get_max_md_bits( st_ivas ); assert( total_md_bits <= total_sba_bits );*/ -#endif return error; } diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 50ef2f0348..38d9a52810 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -71,16 +71,8 @@ static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], static void ivas_get_band_differential_index( ivas_band_coeffs_ind_t *pBand_idx, const int16_t q_levels[2], const int16_t one_sided, const int16_t nB, const int16_t complex_cov, const int16_t dim, const ivas_coeffs_type_t coeff_type ); -#ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t bands_bw ); -#else -static void ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t bands_bw ); -#endif -#ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); -#else -static void ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); -#endif static ivas_error ivas_spar_set_enc_config( ivas_spar_md_enc_state_t *hMdEnc, int16_t *max_freq_per_chan, const int16_t nchan_transport, float *pFC, const int16_t nchan_inp ); @@ -328,7 +320,6 @@ ivas_error ivas_spar_md_enc_init( ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND -#ifdef ARITH_HUFF_CODER_CHANGES , hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, @@ -338,7 +329,6 @@ ivas_error ivas_spar_md_enc_init( ivas_agc_enc_get_flag( hEncoderConfig->Opt_AGC_ON, ivas_spar_br_table_consts[table_idx].nchan_transport ) #endif -#endif ); /* get FB coefficients */ @@ -595,22 +585,16 @@ ivas_error ivas_spar_md_enc_process( int16_t last_ind_start; #endif BSTR_ENC_DATA hMetaData_tmp; -#ifdef ARITH_HUFF_CODER_CHANGES Indice *ind_list_tmp; int16_t md_indices_allocated; -#else - Indice ind_list_tmp[MAX_BITS_METADATA]; // IVAS_fmToDo: size to be optimized -#endif #ifdef IND_LIST_DYN int16_t max_num_indices_tmp; #endif float Wscale[IVAS_MAX_NUM_BANDS]; -#ifdef ARITH_HUFF_CODER_CHANGES /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ md_indices_allocated = hMdEnc->spar_md_cfg.max_bits_per_blk + IVAS_SPAR_ARITH_OVERSHOOT_BITS; ind_list_tmp = (Indice *) malloc( sizeof( Indice ) * md_indices_allocated ); -#endif num_quant_strats = hMdEnc->spar_md_cfg.num_quant_strats; num_ch = ivas_sba_get_nchan_metadata( sba_order, @@ -978,17 +962,11 @@ ivas_error ivas_spar_md_enc_process( strat = cs[i]; if ( strat != NO_STRAT ) { -#ifdef ARITH_HUFF_CODER_CHANGES reset_indices_enc( &hMetaData_tmp, md_indices_allocated ); -#else - reset_indices_enc( &hMetaData_tmp, MAX_BITS_METADATA ); -#endif ivas_write_spar_md_bitstream( hMdEnc, num_bands, bands_bw, &hMetaData_tmp, hEncoderConfig->ivas_total_brate, strat, qsi, planarCP ); -#ifdef ARITH_HUFF_CODER_CHANGES /*write to main buffer if its a valid bitstream*/ if ( hMetaData_tmp.nb_bits_tot > 0 ) { -#endif if ( hMetaData->nb_bits_tot == bit_pos_start || hMetaData_tmp.nb_bits_tot < ( hMetaData->nb_bits_tot - bit_pos_start ) ) { write_metadata_buffer( &hMetaData_tmp, hMetaData, bit_pos_start, next_ind_start @@ -1016,27 +994,21 @@ ivas_error ivas_spar_md_enc_process( break; } -#ifdef ARITH_HUFF_CODER_CHANGES /*only if valid bitstream was written to main buffer*/ if ( hMetaData->nb_bits_tot > bit_pos_start ) -#endif { if ( hMetaData->nb_bits_tot - bit_pos_start + ( ( ( hEncoderConfig->ivas_total_brate == IVAS_256k ) && ( sba_order == SBA_FOA_ORDER ) ) ? 1 : 0 ) <= hMdEnc->spar_md_cfg.max_bits_per_blk ) { -#ifdef ARITH_HUFF_CODER_CHANGES packed_ok = 1; -#endif break; } } } -#ifdef ARITH_HUFF_CODER_CHANGES if ( dtx_vad == 1 ) { assert( packed_ok == 1 ); } -#endif if ( hEncoderConfig->ivas_total_brate >= IVAS_256k ) { assert( qsi == 0 ); @@ -1279,9 +1251,7 @@ ivas_error ivas_spar_md_enc_process( hMdEnc->spar_md.dtx_vad = dtx_vad; hMdEnc->spar_md.num_bands = num_bands; -#ifdef ARITH_HUFF_CODER_CHANGES free( ind_list_tmp ); -#endif return IVAS_ERR_OK; } @@ -1352,9 +1322,7 @@ static void ivas_write_spar_md_bitstream( { int16_t no_ec, i; int16_t do_diff[IVAS_MAX_NUM_BANDS]; -#ifdef ARITH_HUFF_CODER_CHANGES int16_t entropy_coding_result; -#endif if ( strat == NO_STRAT ) { @@ -1459,28 +1427,22 @@ static void ivas_write_spar_md_bitstream( #endif if ( no_ec == 1 ) { -#ifdef ARITH_HUFF_CODER_CHANGES entropy_coding_result = -#endif ivas_get_huffman_coded_bs( hMdEnc, hMetaData, nB, qsi, planarCP, bands_bw ); } else { -#ifdef ARITH_HUFF_CODER_CHANGES entropy_coding_result = -#endif ivas_get_arith_coded_bs( hMdEnc, hMetaData, do_diff, bands_bw, nB, qsi, planarCP, strat, ivas_total_brate ); } -#ifdef ARITH_HUFF_CODER_CHANGES if ( entropy_coding_result < 0 ) { hMetaData->nb_bits_tot = 0; } -#endif return; } @@ -1491,11 +1453,7 @@ static void ivas_write_spar_md_bitstream( * * Generate huffman coded bitstream *-----------------------------------------------------------------------------------------*/ -#ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_get_huffman_coded_bs( -#else -static void ivas_get_huffman_coded_bs( -#endif ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, @@ -1528,12 +1486,10 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return -1; } -#endif push_next_indice( hMetaData, code, len ); } @@ -1542,12 +1498,10 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[(int16_t) floor( j / ( ndm - 1 ) )] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return -1; } -#endif push_next_indice( hMetaData, code, len ); } } @@ -1557,12 +1511,10 @@ static void ivas_get_huffman_coded_bs( if ( keep_planar[j] ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return -1; } -#endif push_next_indice( hMetaData, code, len ); } } @@ -1572,46 +1524,36 @@ static void ivas_get_huffman_coded_bs( for ( j = pred_offset; j < pred_coeff_dim; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.pred_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].pred_index_re[j], &code, &len ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return -1; } -#endif push_next_indice( hMetaData, code, len ); } for ( j = 0; j < ndec * ( ndm - 1 ); j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.drct_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].drct_index_re[j], &code, &len ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return -1; } -#endif push_next_indice( hMetaData, code, len ); } for ( j = 0; j < ndec; j++ ) { ivas_huffman_encode( &hMdEnc->huff_coeffs.decd_huff_re[qsi], hMdEnc->spar_md.band_coeffs_idx[i].decd_index_re[j], &code, &len ); -#ifdef ARITH_HUFF_CODER_CHANGES if ( ( hMetaData->nb_bits_tot + len ) > hMdEnc->spar_md_cfg.max_bits_per_blk ) { return -1; } -#endif push_next_indice( hMetaData, code, len ); } } } -#ifdef ARITH_HUFF_CODER_CHANGES return 0; -#else - return; -#endif } @@ -1620,11 +1562,7 @@ static void ivas_get_huffman_coded_bs( * * Generate arithmetic coded bitstream *-----------------------------------------------------------------------------------------*/ -#ifdef ARITH_HUFF_CODER_CHANGES static int16_t ivas_get_arith_coded_bs( -#else -static void ivas_get_arith_coded_bs( -#endif ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, @@ -1643,9 +1581,7 @@ static void ivas_get_arith_coded_bs( ivas_cell_dim_t decx_cell_dims[IVAS_MAX_NUM_BANDS]; int16_t symbol_arr_re[IVAS_MAX_INPUT_LEN]; int16_t symbol_arr_old_re[IVAS_MAX_INPUT_LEN]; -#ifdef ARITH_HUFF_CODER_CHANGES int16_t arith_result; -#endif for ( i = 0; i < nB; i++ ) { @@ -1720,7 +1656,6 @@ static void ivas_get_arith_coded_bs( ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, pred_cell_dims, PRED_COEFF, planarCP ); } -#ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); @@ -1728,10 +1663,6 @@ static void ivas_get_arith_coded_bs( { return -1; } -#else - ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.pred_arith_re[qsi], &hMdEnc->arith_coeffs.pred_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, pred_cell_dims, hMetaData, any_diff ); -#endif if ( hMdEnc->spar_hoa_md_flag && hMdEnc->spar_hoa_dirac2spar_md_flag ) { @@ -1773,7 +1704,6 @@ static void ivas_get_arith_coded_bs( } } -#ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); @@ -1781,10 +1711,6 @@ static void ivas_get_arith_coded_bs( { return -1; } -#else - ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.drct_arith_re[qsi], &hMdEnc->arith_coeffs.drct_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, drct_cell_dims, hMetaData, any_diff ); -#endif ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decd_cell_dims, DECD_COEFF, planarCP ); @@ -1801,7 +1727,6 @@ static void ivas_get_arith_coded_bs( decd_cell_dims[i].dim1 = decd_cell_dims[i].dim1 - IVAS_SPAR_HOA3_NP_CHS; } } -#ifdef ARITH_HUFF_CODER_CHANGES arith_result = ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff, hMdEnc->spar_md_cfg.max_bits_per_blk ); @@ -1809,10 +1734,6 @@ static void ivas_get_arith_coded_bs( { return -1; } -#else - ivas_arith_encode_cmplx_cell_array( &hMdEnc->arith_coeffs.decd_arith_re[qsi], &hMdEnc->arith_coeffs.decd_arith_re_diff[qsi], pDo_diff, nB, - symbol_arr_re, symbol_arr_old_re, decd_cell_dims, hMetaData, any_diff ); -#endif ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md.band_coeffs_idx, nB, symbol_arr_re, decx_cell_dims, DECX_COEFF, planarCP ); @@ -1822,11 +1743,7 @@ static void ivas_get_arith_coded_bs( ivas_copy_band_coeffs_idx_to_arr( hMdEnc->spar_md_prior.band_coeffs_idx_mapped, nB, symbol_arr_old_re, decx_cell_dims, DECX_COEFF, planarCP ); } -#ifdef ARITH_HUFF_CODER_CHANGES return 0; -#else - return; -#endif } -- GitLab From 621a3a43375bb6e8064de744930286bc2a300092 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 21:53:43 +0200 Subject: [PATCH 247/381] [cleanup] accept FIX_463_TD_RENDERER_DIRECTIVITY_RESET --- lib_com/options.h | 1 - lib_rend/ivas_objectRenderer.c | 7 ------- lib_rend/lib_rend.c | 2 -- 3 files changed, 10 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 07a234e8c0..b856ce09ca 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,7 +163,6 @@ -#define FIX_463_TD_RENDERER_DIRECTIVITY_RESET /* Eri: Remove unintentional reset of directivity pattern */ #define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ #define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */ #define VARIABLE_SPEED_DECODING /* FhG: Contribution 37: variable speed decoding employing the JBM functioniality */ diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 1b6f2eeccc..cb71f5b731 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -477,13 +477,6 @@ void TDREND_Update_object_positions( angles_to_vec( hIsmMetaData[nS]->radius, hIsmMetaData[nS]->azimuth, hIsmMetaData[nS]->elevation, Pos ); angles_to_vec( 1.0f, hIsmMetaData[nS]->yaw, hIsmMetaData[nS]->pitch, Dir ); -#ifndef FIX_463_TD_RENDERER_DIRECTIVITY_RESET - - /* Source directivity info */ - DirAtten_p->ConeInnerAngle = 360.0f; - DirAtten_p->ConeOuterAngle = 360.0f; - DirAtten_p->ConeOuterGain = 1.0f; -#endif TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos ); TDREND_MIX_SRC_SetDirAtten( hBinRendererTd, nS, DirAtten_p ); diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 4551426e2a..3810cb1918 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -3794,9 +3794,7 @@ int16_t IVAS_REND_GetRenderConfig( hRCout->room_acoustics.nBands = hRCin->roomAcoustics.nBands; hRCout->room_acoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; hRCout->room_acoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; -#ifdef FIX_463_TD_RENDERER_DIRECTIVITY_RESET mvr2r( hRCin->directivity, hRCout->directivity, 3 ); -#endif mvr2r( hRCin->roomAcoustics.pFc_input, hRCout->room_acoustics.pFc_input, CLDFB_NO_CHANNELS_MAX ); mvr2r( hRCin->roomAcoustics.pAcoustic_rt60, hRCout->room_acoustics.pAcoustic_rt60, CLDFB_NO_CHANNELS_MAX ); -- GitLab From 9441545adbeba0f6394c6f4e45707b0f785bb6a5 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:01:08 +0200 Subject: [PATCH 248/381] [cleanup] accept FIX_642 --- lib_com/options.h | 1 - lib_dec/ivas_dirac_dec.c | 31 +------------------------------ 2 files changed, 1 insertion(+), 31 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b856ce09ca..2ccdd37eb4 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,7 +163,6 @@ -#define FIX_642 /* FhG: Fix for issue 642, buggy DoA-array access in DirAC head rotation*/ #define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */ #define VARIABLE_SPEED_DECODING /* FhG: Contribution 37: variable speed decoding employing the JBM functioniality */ #define JBM_TSM_ON_TCS /* FhG: Contribution 37: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 502420781f..00f0c6ad9a 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2812,28 +2812,6 @@ void ivas_dirac_dec_render_sf( #endif #ifdef JBM_TSM_ON_TCS /* Another workaround for self test BE */ -#ifndef FIX_642 - if ( st_ivas->hHeadTrackData && st_ivas->hDecoderConfig->voip_active == 0 ) - { - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); - - p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; - - if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) - { - num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - index_slot = slot_idx_start + slot_idx; - rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); - } - } - } - else - { - p_Rmat = 0; - } -#endif /* copy parameters into local buffers*/ #ifdef FIX_393_459_460_SBA_MD @@ -2880,9 +2858,6 @@ void ivas_dirac_dec_render_sf( #ifdef JBM_TSM_ON_TCS if ( st_ivas->hHeadTrackData -#ifndef FIX_642 - && st_ivas->hDecoderConfig->voip_active == 1 -#endif ) #else if ( st_ivas->hHeadTrackData ) @@ -2919,11 +2894,7 @@ void ivas_dirac_dec_render_sf( #endif } } -#if defined( JBM_TSM_ON_TCS ) & !defined( FIX_642 ) - else if ( !st_ivas->hHeadTrackData ) -#else - else -#endif + else { p_Rmat = 0; } -- GitLab From 87f3ba37cea3a5a928f4b10a2a554773351f16ef Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:01:52 +0200 Subject: [PATCH 249/381] [cleanup] accept FIX_443_FD_CNG_INIT --- lib_com/options.h | 1 - lib_enc/ivas_core_pre_proc_front.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2ccdd37eb4..8382fe7b39 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,7 +163,6 @@ -#define FIX_443_FD_CNG_INIT /* FhG: correct bitrate value for FD-CNG init */ #define VARIABLE_SPEED_DECODING /* FhG: Contribution 37: variable speed decoding employing the JBM functioniality */ #define JBM_TSM_ON_TCS /* FhG: Contribution 37: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ #define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 5f775d2403..3552ee7790 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -563,14 +563,10 @@ ivas_error pre_proc_front_ivas( if ( st->hFdCngEnc != NULL && ( st->ini_frame == 0 || last_element_brate != element_brate || st->last_bwidth != st->bwidth ) ) { -#ifdef FIX_443_FD_CNG_INIT int32_t total_brate; total_brate = ( element_mode == IVAS_SCE ) ? st->total_brate : st->bits_frame_nominal * FRAMES_PER_SEC; configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), total_brate ); -#else - configureFdCngEnc( st->hFdCngEnc, max( st->input_bwidth, WB ), st->bits_frame_nominal * FRAMES_PER_SEC ); -#endif if ( hCPE != NULL ) { st->hFdCngEnc->hFdCngCom->CngBitrate = hCPE->element_brate - 1; -- GitLab From a421d71558296e5ae3a36448805cb3815be71317 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:05:31 +0200 Subject: [PATCH 250/381] [cleanup] accept JBM_TSM_ON_TCS --- apps/decoder.c | 45 --- lib_com/fd_cng_com.c | 2 - lib_com/ivas_cnst.h | 6 - lib_com/ivas_prot.h | 129 ------ lib_com/ivas_stat_com.h | 2 - lib_com/ivas_td_decorr.c | 16 - lib_com/ivas_tools.c | 10 - lib_com/options.h | 19 +- lib_com/prot.h | 6 - lib_com/tools.c | 8 - lib_dec/fd_cng_dec.c | 88 ---- lib_dec/ivas_binRenderer_internal.c | 60 --- lib_dec/ivas_dec.c | 135 ------- lib_dec/ivas_dirac_dec.c | 265 ------------ lib_dec/ivas_dirac_output_synthesis_cov.c | 45 --- lib_dec/ivas_dirac_output_synthesis_dec.c | 121 ------ lib_dec/ivas_init_dec.c | 27 -- lib_dec/ivas_ism_dec.c | 26 -- lib_dec/ivas_ism_dtx_dec.c | 4 - lib_dec/ivas_ism_param_dec.c | 181 --------- lib_dec/ivas_ism_renderer.c | 18 - lib_dec/ivas_jbm_dec.c | 2 - lib_dec/ivas_masa_dec.c | 57 --- lib_dec/ivas_mc_param_dec.c | 402 ------------------- lib_dec/ivas_mct_dec.c | 26 -- lib_dec/ivas_objectRenderer_internal.c | 6 - lib_dec/ivas_out_setup_conversion.c | 18 - lib_dec/ivas_sba_dec.c | 10 - lib_dec/ivas_sba_rendering_internal.c | 56 --- lib_dec/ivas_spar_decoder.c | 178 -------- lib_dec/ivas_spar_md_dec.c | 4 - lib_dec/ivas_stat_dec.h | 30 -- lib_dec/jbm_jb4sb.h | 2 - lib_dec/jbm_pcmdsp_apa.c | 104 ----- lib_dec/jbm_pcmdsp_apa.h | 6 - lib_dec/jbm_pcmdsp_fifo.c | 2 - lib_dec/jbm_pcmdsp_fifo.h | 2 - lib_dec/jbm_pcmdsp_similarityestimation.c | 42 -- lib_dec/jbm_pcmdsp_similarityestimation.h | 16 - lib_dec/jbm_pcmdsp_window.c | 30 -- lib_dec/jbm_pcmdsp_window.h | 4 - lib_dec/lib_dec.c | 231 ----------- lib_dec/lib_dec.h | 6 - lib_rend/ivas_crend.c | 23 -- lib_rend/ivas_dirac_dec_binaural_functions.c | 137 ------- lib_rend/ivas_limiter.c | 4 - lib_rend/ivas_objectRenderer.c | 22 - lib_rend/ivas_prot_rend.h | 41 -- lib_rend/ivas_reverb.c | 69 ---- lib_rend/ivas_rotation.c | 24 -- lib_rend/ivas_sba_rendering.c | 40 -- lib_rend/lib_rend.c | 64 --- 52 files changed, 1 insertion(+), 2870 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 5eb46f618c..db3aad3740 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -82,9 +82,7 @@ static #ifdef VARIABLE_SPEED_DECODING #define VARIABLE_SPEED_FETCH_FRAMESIZE_MS 20 #endif -#ifdef JBM_TSM_ON_TCS #define JBM_FRONTEND_FETCH_FRAMESIZE_MS 20 -#endif typedef struct { @@ -136,12 +134,10 @@ typedef struct char *tsmScaleFileName; uint16_t tsmScale; #endif -#ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION uint16_t frontendFetchSizeMs; #endif #endif -#endif } DecArguments; @@ -389,7 +385,6 @@ int main( goto cleanup; } -#ifdef JBM_TSM_ON_TCS /*------------------------------------------------------------------------------------------* * Configure VoIP mode *------------------------------------------------------------------------------------------*/ @@ -414,7 +409,6 @@ int main( } #endif #endif -#endif #ifdef DEBUGGING /*-----------------------------------------------------------------* @@ -642,17 +636,6 @@ int main( if ( arg.voipMode ) { -#ifndef JBM_TSM_ON_TCS -#ifdef VARIABLE_SPEED_DECODING - if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) -#endif - { - fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); - goto cleanup; - } -#endif error = decodeVoIP( arg, hBsReader, hIvasDec ); } #ifdef VARIABLE_SPEED_DECODING @@ -905,11 +888,9 @@ static bool parseCmdlIVAS_dec( arg->tsmScaleFileEnabled = false; arg->tsmScaleFileName = NULL; #endif -#ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION arg->frontendFetchSizeMs = JBM_FRONTEND_FETCH_FRAMESIZE_MS; #endif -#endif #ifdef DEBUG_JBM_CMD_OPTION arg->noBadFrameDelay = false; #endif @@ -1078,7 +1059,6 @@ static bool parseCmdlIVAS_dec( } } #endif -#ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION else if ( strcmp( argv_to_upper, "-VOIP_FRAMESIZE" ) == 0 ) { @@ -1099,7 +1079,6 @@ static bool parseCmdlIVAS_dec( } } #endif -#endif #endif /* #ifdef DEBUGGING */ else if ( strcmp( argv_to_upper, "-MIME" ) == 0 ) @@ -1388,11 +1367,9 @@ static void usage_dec( void ) fprintf( stdout, "-VS fac : Variable Speed mode: change speed of playout fac as integer in percent.\n" ); fprintf( stdout, " 50 <= fac <= 150; fac<100 faster, fac>100 slower\n" ); #endif -#ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION fprintf( stdout, "-VOIP_framesize : VoIP mode: acoustic frontend fetch frame size (must be multiples of 5!)\n" ); #endif -#endif #endif fprintf( stdout, "-fec_cfg_file : Optimal channel aware configuration computed by the JBM \n" ); fprintf( stdout, " as described in Section 6.3.1 of TS26.448. The output is \n" ); @@ -2077,10 +2054,8 @@ static ivas_error decodeVoIP( uint32_t nextPacketRcvTime_ms = 0; uint32_t systemTime_ms = 0; -#ifdef JBM_TSM_ON_TCS uint32_t systemTimeInc_ms = (uint32_t) JBM_FRONTEND_FETCH_FRAMESIZE_MS; int32_t nFramesWritten = 0; -#endif int32_t nFramesFed = 0; @@ -2216,26 +2191,18 @@ static ivas_error decodeVoIP( * Main receiving/decoding loop *------------------------------------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION systemTimeInc_ms = arg.frontendFetchSizeMs; -#endif #endif while ( 1 ) { int16_t nOutSamples = 0; -#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) uint16_t nSamplesAvailableNext = 0; -#endif -#ifdef JBM_TSM_ON_TCS #ifdef DEBUG_JBM_CMD_OPTION nOutSamples = (int16_t) ( arg.output_Fs / 1000 * arg.frontendFetchSizeMs ); #else nOutSamples = (int16_t) ( arg.output_Fs / 1000 * JBM_FRONTEND_FETCH_FRAMESIZE_MS ); -#endif -#else - nOutSamples = (int16_t) ( arg.output_Fs / 50 ); #endif /* read all packets with a receive time smaller than the system time */ while ( nextPacketRcvTime_ms <= systemTime_ms ) @@ -2280,12 +2247,8 @@ static ivas_error decodeVoIP( /* we are finished when all packets have been received and jitter buffer is empty */ /* also stop when the input file contains less than two frames, because JBM cannot calculate a delay value and won't start decoding */ -#ifdef JBM_TSM_ON_TCS /* last clause should make sure that for BE tests we end up with the same number of samples...*/ if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec, nOutSamples ) || nFramesFed < 2 ) ) -#else - if ( nextPacketRcvTime_ms == (uint32_t) ( -1 ) && ( IVAS_DEC_VoIP_IsEmpty( hIvasDec ) || nFramesFed < 2 ) ) -#endif { break; } @@ -2293,10 +2256,8 @@ static ivas_error decodeVoIP( /* decode and get samples */ if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms -#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) , &nSamplesAvailableNext -#endif #ifdef SUPPORT_JBM_TRACEFILE , writeJbmTraceFileFrameWrapper, @@ -2386,7 +2347,6 @@ static ivas_error decodeVoIP( delayNumSamples -= nOutSamples; } -#ifdef JBM_TSM_ON_TCS /* Write ISM metadata to external file(s) */ if ( decodedGoodFrame && arg.outputFormat == IVAS_DEC_OUTPUT_EXT ) { @@ -2433,7 +2393,6 @@ static ivas_error decodeVoIP( } } } -#endif } if ( !arg.quietModeEnabled ) @@ -2442,12 +2401,8 @@ static ivas_error decodeVoIP( } frame++; -#ifdef JBM_TSM_ON_TCS systemTime_ms += systemTimeInc_ms; nFramesWritten++; -#else - systemTime_ms += 20; -#endif #ifdef WMOPS update_mem(); diff --git a/lib_com/fd_cng_com.c b/lib_com/fd_cng_com.c index f0408ea3dd..dd82c4f06b 100644 --- a/lib_com/fd_cng_com.c +++ b/lib_com/fd_cng_com.c @@ -941,7 +941,6 @@ void SynthesisSTFT( } -#ifdef JBM_TSM_ON_TCS /*------------------------------------------------------------------- * SynthesisSTFT_dirac() * @@ -1007,7 +1006,6 @@ void SynthesisSTFT_dirac( return; } -#endif /*------------------------------------------------------------------- diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index f4891c0a86..9c657f69e7 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -203,7 +203,6 @@ typedef enum #define IVAS_NUM_SUPPORTED_FS 3 /* number of supported sampling-rates in IVAS */ -#ifdef JBM_TSM_ON_TCS #define CLDFB_SLOT_NS 1250000L /* 1.25ms: CLDFB slot length */ #define MAX_JBM_SUBFRAMES_5MS 8 #define DEFAULT_JBM_SUBFRAMES_5MS 4 @@ -221,7 +220,6 @@ typedef enum TC_BUFFER_MODE_RENDERER, TC_BUFFER_MODE_BUFFER } TC_BUFFER_MODE; -#endif /*----------------------------------------------------------------------------------* * IVAS Bitrates @@ -1393,11 +1391,7 @@ typedef enum #define PARAM_MC_REG_GHAT (0.001f) /* Regularization factor for mixing matrix calculation */ #define PARAM_MC_MAX_PARAMETER_BANDS 20 /* Maximum number of parameter bands */ #define PARAM_MC_MAX_PARAMETER_BANDS_RES 14 /* Maximum number of parameter bands with decorrelation */ -#ifdef JBM_TSM_ON_TCS #define PARAM_MC_MAX_NSLOTS MAX_JBM_CLDFB_TIMESLOTS /* Maximum number of CLDFB slots in a frame */ -#else -#define PARAM_MC_MAX_NSLOTS 16 /* Maximum number of CLDFB slots in a frame */ -#endif #define PARAM_MC_MAX_NSLOTS_IN_SUBFRAME 4 /* Maximum number of CLDFB slots in a subframe */ #define PARAM_MC_NSUBFRAMES_DEC 4 /* Number of subframes for the synthesis in the decoder */ #define PARAM_MC_MAX_BANDS_IN_PARAMETER_BAND 30 /* Maximum number of CLDFB frequency bands within a parameter band */ diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 25b2fb3711..729b1fced2 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -258,24 +258,18 @@ ivas_error ivas_compute_core_buffers( /*! r: number of clipped samples */ uint32_t ivas_syn_output( -#ifdef JBM_TSM_ON_TCS float *synth[], /* i/o: float synthesis signal */ -#else - float synth[][L_FRAME48k], /* i/o: float synthesis signal */ -#endif const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ int16_t *synth_out /* o : integer 16 bits synthesis signal */ ); -#ifdef JBM_TSM_ON_TCS void ivas_syn_output_f( float *synth[], /* i/o: float synthesis signal */ const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ float *synth_out /* o : integer 16 bits synthesis signal */ ); -#endif void ivas_initialize_handles_enc( Encoder_Struct *st_ivas /* i/o: IVAS encoder structure */ @@ -321,11 +315,9 @@ ivas_error ivas_dec( ivas_error ivas_dec_setup( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ int16_t *data /* o : flushed PCM samples */ -#endif ); ivas_error create_sce_dec( @@ -664,11 +656,9 @@ ivas_error ivas_mc_enc_config( ivas_error ivas_mc_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t idx /* i : LS config. index */ - #ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ int16_t *data /* o : flushed samples (JBM) */ -#endif ); /*! r: MC format mode (MCT, McMASA, ParamMC) */ @@ -769,7 +759,6 @@ void dtx_read_padding_bits( ); -#ifdef JBM_TSM_ON_TCS /*----------------------------------------------------------------------------------* * JBM prototypes *----------------------------------------------------------------------------------*/ @@ -870,7 +859,6 @@ void ivas_jbm_dec_tc_buffer_close( void ivas_jbm_dec_td_renderers_adapt_subframes( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); -#endif /*----------------------------------------------------------------------------------* @@ -1025,11 +1013,9 @@ ivas_error ivas_ism_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ , const ISM_MODE last_ism_mode /* i/o: last ISM mode */ -#ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : number of samples flushed on renderer change*/ int16_t *data /* o : flushed PCM samples */ -#endif ); ivas_error ivas_param_ism_dec_open( @@ -1046,7 +1032,6 @@ void ivas_param_ism_dec( float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ ); -#ifdef JBM_TSM_ON_TCS void ivas_ism_dec_digest_tc( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); @@ -1064,7 +1049,6 @@ void ivas_param_ism_dec_render( uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ float *output_f[] /* o : rendered time signal */ ); -#endif void ivas_param_ism_params_to_masa_param_mapping( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ @@ -3440,7 +3424,6 @@ ivas_error ivas_sba_dec_reconfigure( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); -#ifdef JBM_TSM_ON_TCS ivas_error ivas_sba_digest_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t nchan_transport, /* i : number of transport channels */ @@ -3448,7 +3431,6 @@ ivas_error ivas_sba_digest_tc( const int16_t nSamplesForRendering, /* i : number of samples provided */ float *data[] /* i : transport channel samples */ ); -#endif void ivas_init_dec_get_num_cldfb_instances( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ @@ -3559,9 +3541,7 @@ void ivas_sba2mc_cldfb( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ const int16_t nb_channels_out, /* i : nb of output channels */ const int16_t nb_bands, /* i : nb of CLDFB bands to process */ -#ifdef JBM_TSM_ON_TCS const int16_t nb_timeslots, /* i : number of time slots to process */ -#endif const float *hoa_dec_mtx /* i : HOA decoding mtx */ ); @@ -3682,7 +3662,6 @@ void ivas_dirac_dec_read_BS( int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); -#ifdef JBM_TSM_ON_TCS void generate_masking_noise_lb_dirac( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ float *tdBuffer, /* i/o: time-domain signal, if NULL no LB-CNA */ @@ -3700,9 +3679,7 @@ void ivas_dirac_dec( float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ const int16_t nchan_transport /* i : number of transport channels */ ); -#endif -#ifdef JBM_TSM_ON_TCS void ivas_dirac_dec_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const int16_t nchan_transport, /* i : number of transport channels */ @@ -3711,26 +3688,13 @@ void ivas_dirac_dec_render( uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ float *output_f[] /* o : rendered time signal */ ); -#endif -#ifndef JBM_TSM_ON_TCS -void ivas_dirac_dec( -#else void ivas_dirac_dec_render_sf( -#endif Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif const int16_t nchan_transport, /* i : number of transport channels */ float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] -#ifndef JBM_TSM_ON_TCS - , - const int16_t i_sf -#endif ); ivas_error ivas_td_decorr_reconfig_dec( @@ -3845,23 +3809,17 @@ void ivas_dirac_dec_output_synthesis_close( void ivas_dirac_dec_output_synthesis_process_slot( const float *reference_power, /* i : Estimated power */ const float *onset, /* i : onset filter */ -#ifdef JBM_TSM_ON_TCS const int16_t *azimuth, const int16_t *elevation, const float *diffuseness, -#endif DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ -#ifdef JBM_TSM_ON_TCS const int16_t sh_rot_max_order, -#endif const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport /* i : number of transport channels */ -#if defined( JBM_TSM_ON_TCS ) , const int16_t index_slot -#endif , const int16_t hodirac_flag ); @@ -3871,17 +3829,13 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ -#ifdef JBM_TSM_ON_TCS const int16_t nbslots, /* i : number of slots to process */ -#endif const float *onset_filter , #ifdef FIX_393_459_460_SBA_MD float *diffuseness, #else -#ifdef JBM_TSM_ON_TCS const int16_t md_idx, -#endif #endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); @@ -3890,13 +3844,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ -#ifdef JBM_TSM_ON_TCS const int16_t nbslots, /* i : number of slots to process */ #ifdef FIX_393_459_460_SBA_MD float *diffuseness_vector, /* i : diffuseness (needed for direction smoothing)*/ #else const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ -#endif #endif float *reference_power_smooth, float qualityBasedSmFactor @@ -3936,11 +3888,9 @@ void ivas_dirac_dec_compute_directional_responses( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ -#ifdef JBM_TSM_ON_TCS const int16_t *azimuth, const int16_t *elevation, const int16_t md_idx, -#endif const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat, /* i : rotation matrix */ @@ -4082,7 +4032,6 @@ void ivas_param_mc_dec_read_BS( int16_t *nb_bits /* o : number of bits written */ ); -#ifdef JBM_TSM_ON_TCS void ivas_param_mc_dec_digest_tc( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint8_t nCldfbSlots, /* i : number of CLFBS slots in the transport channels */ @@ -4096,15 +4045,10 @@ void ivas_param_mc_dec_render( uint16_t *nSamplesAvailable, /* o : number of CLDFB slots still to render */ float *output_f[] /* o : rendered time signal */ ); -#endif void ivas_param_mc_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ -#ifdef JBM_TSM_ON_TCS float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif ); void ivas_param_mc_default_icc_map( @@ -4235,12 +4179,10 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( const float *proto_matrix /* i : the prototype (upmix) matrix (only used if mode == 1) */ ); -#ifdef JBM_TSM_ON_TCS void ivas_dirac_dec_output_synthesis_get_interpolator( DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params, /* i/o: handle for the covariance synthesis parameters */ const uint16_t interp_length /* i : interpolator length */ ); -#endif void ivas_dirac_dec_output_synthesis_cov_init( DIRAC_OUTPUT_SYNTHESIS_COV_STATE *h_dirac_output_synthesis_state, /* i/o: pointer to the state of the covariance synthesis */ @@ -4256,40 +4198,21 @@ void ivas_dirac_dec_output_synthesis_cov_close( ); void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( -#ifdef JBM_TSM_ON_TCS float *RealBuffer, /* i : input channel filter bank samples (real part) */ float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ -#else - float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ -#endif float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ const int16_t nchan_in /* i : number of input channels */ -#ifndef JBM_TSM_ON_TCS - , - const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ -#endif ); void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( -#ifdef JBM_TSM_ON_TCS float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ -#else - float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ - float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ -#endif float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ -#ifdef JBM_TSM_ON_TCS float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ -#else - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ -#endif const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ const int16_t nX, /* i : number of input channels */ @@ -4378,11 +4301,7 @@ void ivas_sba_upmixer_renderer( ); ivas_error ivas_sba_linear_renderer( -#ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : number of input ambisonics channels */ const AUDIO_CONFIG output_config, /* i : output audio configuration */ @@ -4559,7 +4478,6 @@ int16_t ivas_is_res_channel( const int16_t nchan_transport /* i : number of transport channels (1-4) */ ); -#ifdef JBM_TSM_ON_TCS void ivas_spar_dec_agc_pca( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float output[][L_FRAME48k], /* i/o: input/output audio channels */ @@ -4602,7 +4520,6 @@ void ivas_spar_dec_upmixer_sf( float *output[], /* o : output audio channels */ const int16_t nchan_internal /* i : number of internal channels */ ); -#endif void ivas_spar_dec_upmixer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -4871,11 +4788,7 @@ void ivas_td_decorr_dec_close( void ivas_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ -#ifdef JBM_TSM_ON_TCS float *pcm_in[], /* i : input audio channels */ -#else - float pcm_in[][L_FRAME48k], /* i : input audio channels */ -#endif float **ppOut_pcm, /* o : output audio channels */ const int16_t output_frame /* i : output frame length */ ); @@ -5231,8 +5144,6 @@ void ivas_masa_prerender( const int16_t output_frame /* i : output frame length per channel */ ); -#ifdef JBM_TSM_ON_TCS -#endif void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ @@ -5257,29 +5168,21 @@ void ivas_binRenderer_close( #ifdef DEBUGGING void ivas_binaural_cldfb( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif ); -#ifdef JBM_TSM_ON_TCS void ivas_binaural_cldfb_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t n_samples_to_render, /* i : output frame length per channel */ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ); -#endif #endif void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ -#ifdef JBM_TSM_ON_TCS const int16_t numTimeSlots, /* i: : number of time slots to process */ -#endif float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -5289,12 +5192,8 @@ void ivas_binRenderer( void ivas_binaural_add_LFE( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t output_frame, /* i : length of input frame */ -#ifdef JBM_TSM_ON_TCS float *input_f[], /* i : transport channels */ float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif ); @@ -5308,21 +5207,15 @@ ivas_error ivas_ism_renderer_open( void ivas_ism_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: core-coder transport channels/object output */ -#else - float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */ -#endif const int16_t output_frame /* i : output frame length per channel */ ); -#ifdef JBM_TSM_ON_TCS void ivas_ism_render_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output_f[], /* i/o: core-coder transport channels/object output */ const int16_t n_samples_to_render /* i : output frame length per channel */ ); -#endif void ivas_ism_get_stereo_gains( const float azimuth, /* i : object azimuth */ @@ -5333,23 +5226,15 @@ void ivas_ism_get_stereo_gains( void ivas_mc2sba( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ -#ifdef JBM_TSM_ON_TCS float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ float *buffer_td[], /* o : MC signals (on input) and the HOA3 (on output) */ -#else - float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ -#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t sba_order, /* i : SBA order */ const float gain_lfe /* i : gain for LFE, 0=ignore LFE */ ); void ivas_ism2sba( -#ifdef JBM_TSM_ON_TCS float *buffer_td[], /* i/o: TD signal buffers */ -#else - float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ -#endif ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ const int16_t nchan_ism, /* i : number of objects */ @@ -5357,7 +5242,6 @@ void ivas_ism2sba( const int16_t sba_order /* i : SBA order */ ); -#ifdef JBM_TSM_ON_TCS void ivas_ism2sba_sf( float *buffer_in[], /* i : TC buffer */ float *buffer_out[], /* o : TD signal buffers */ @@ -5367,7 +5251,6 @@ void ivas_ism2sba_sf( const int16_t offset, /* i : offset for the interpolatr */ const int16_t sba_order /* i : Ambisonic (SBA) order */ ); -#endif /*----------------------------------------------------------------------------------* @@ -5422,12 +5305,8 @@ void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ const int16_t input_chans, /* i : number of input channels to the renderer */ const int16_t output_frame, /* i : frame length */ -#ifdef JBM_TSM_ON_TCS float *input[], /* i : LS input/output synthesis signal */ float *output[] /* i/o: LS input/output synthesis signal */ -#else - float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ -#endif ); void ivas_ls_setup_conversion_process_mdct( @@ -5442,9 +5321,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( void ivas_lssetupconversion_process_param_mc( Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ -#ifdef JBM_TSM_ON_TCS const int16_t num_timeslots, /* i : number of time slots to process */ -#endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ @@ -5678,21 +5555,15 @@ ivas_error ivas_td_binaural_open( ivas_error ivas_td_binaural_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ -#else - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ -#endif const int16_t output_frame /* i : output frame length */ ); -#ifdef JBM_TSM_ON_TCS ivas_error ivas_td_binaural_renderer_sf( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ float *output[], /* i/o: SCE channels / Binaural synthesis */ const int16_t n_samples_granularity /* i : granularity of the renderer/buffer */ ); -#endif /*----------------------------------------------------------------------------------* * Filter-bank (FB) Mixer diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index fe261ef6e8..917cb0e063 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -708,9 +708,7 @@ typedef struct ivas_td_decorr_state_t int16_t num_apd_sections; int16_t ducking_flag; -#ifdef JBM_TSM_ON_TCS int16_t offset; -#endif } ivas_td_decorr_state_t; diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index f2dd0871dc..afba0c3d24 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -222,9 +222,7 @@ ivas_error ivas_td_decorr_dec_open( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR COV decoder" ); } set_f( hTdDecorr_loc->look_ahead_buf, 0, (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ) ); -#ifdef JBM_TSM_ON_TCS hTdDecorr_loc->offset = (int16_t) ( output_Fs * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); -#endif hTdDecorr_loc->num_apd_sections = ivas_get_APD_filt_orders( num_out_chans, output_Fs, hTdDecorr_loc->APD_filt_state[0].order ); for ( j = 0; j < num_out_chans; j++ ) @@ -471,32 +469,18 @@ static void ivas_td_decorr_APD_sections( void ivas_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ -#ifdef JBM_TSM_ON_TCS float *pcm_in[], /* i : input audio channels */ -#else - float pcm_in[][L_FRAME48k], /* i : input audio channels */ -#endif float **ppOut_pcm, /* o : output audio channels */ const int16_t output_frame /* i : output frame length */ ) { int16_t i, j; -#ifndef JBM_TSM_ON_TCS - int16_t offset; -#endif float in_duck_gain[L_FRAME48k], out_duck_gain[L_FRAME48k]; -#ifndef JBM_TSM_ON_TCS - offset = (int16_t) ( output_frame * FRAMES_PER_SEC * IVAS_DECORR_PARM_LOOKAHEAD_TAU ); -#endif /* Look-ahead delay */ mvr2r( pcm_in[0], ppOut_pcm[0], output_frame ); -#ifdef JBM_TSM_ON_TCS delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, hTdDecorr->offset ); -#else - delay_signal( ppOut_pcm[0], output_frame, hTdDecorr->look_ahead_buf, offset ); -#endif /* In ducking gains */ if ( hTdDecorr->ducking_flag ) diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index cf59a751a6..b7fe5821e3 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -122,22 +122,14 @@ void mvc2c( /*! r: number of clipped samples */ uint32_t ivas_syn_output( -#ifdef JBM_TSM_ON_TCS float *synth[], /* i/o: float synthesis signal */ -#else - float synth[][L_FRAME48k], /* i/o: float synthesis signal */ -#endif const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ int16_t *synth_out /* o : integer 16 bits synthesis signal */ ) { int16_t i, n; -#ifdef JBM_TSM_ON_TCS int16_t synth_loc[MAX_JBM_L_FRAME48k]; -#else - int16_t synth_loc[L_FRAME48k]; -#endif uint32_t noClipping = 0; /*-----------------------------------------------------------------* @@ -164,7 +156,6 @@ uint32_t ivas_syn_output( } -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* * ivas_syn_output_f() * @@ -196,7 +187,6 @@ void ivas_syn_output_f( return; } -#endif /*-------------------------------------------------------------------* diff --git a/lib_com/options.h b/lib_com/options.h index 8382fe7b39..14b5e1b921 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -127,7 +127,7 @@ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ //#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ #define DEBUG_JBM_CMD_OPTION /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ - +#define VARIABLE_SPEED_DECODING /* variable speed decoding employing the JBM functioniality */ #endif /* #################### End DEBUGGING switches ############################ */ @@ -148,23 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ - - - - - - - - - - - - - - - -#define VARIABLE_SPEED_DECODING /* FhG: Contribution 37: variable speed decoding employing the JBM functioniality */ -#define JBM_TSM_ON_TCS /* FhG: Contribution 37: run the TSM part of JBM on the TCs instead of the final output pcm waveforms */ #define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ #define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ #define FIX_MDCT_ST_PLC_FADEOUT_DELAY diff --git a/lib_com/prot.h b/lib_com/prot.h index 23c3b98756..172053bc54 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -177,11 +177,7 @@ float sum2_f( void set_c( int8_t y[], /* i/o: Vector to set */ const int8_t a, /* i : Value to set the vector to */ -#ifdef JBM_TSM_ON_TCS const int32_t N /* i : Length of the vector */ -#else - const int16_t N /* i : Length of the vector */ -#endif ); void set_s( @@ -8680,7 +8676,6 @@ void generate_masking_noise_mdct( HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ); -#ifdef JBM_TSM_ON_TCS void SynthesisSTFT_dirac( float *fftBuffer, /* i : FFT bins */ float *timeDomainOutput, @@ -8689,7 +8684,6 @@ void SynthesisSTFT_dirac( const int16_t samples_out, HANDLE_FD_CNG_COM hFdCngCom /* i/o: FD_CNG structure containing all buffers and variables */ ); -#endif void generate_masking_noise_dirac( HANDLE_FD_CNG_COM hFdCngCom, /* i/o: FD_CNG structure containing all buffers and variables */ diff --git a/lib_com/tools.c b/lib_com/tools.c index ab688adbb9..ecd2fdbfa4 100644 --- a/lib_com/tools.c +++ b/lib_com/tools.c @@ -210,11 +210,7 @@ float sum2_f( void set_c( int8_t y[], /* i/o: Vector to set */ const int8_t a, /* i : Value to set the vector to */ -#ifdef JBM_TSM_ON_TCS const int32_t N /* i : Length of the vector */ -#else - const int16_t N /* i : Length of the vector */ -#endif ) { int16_t i; @@ -391,11 +387,7 @@ uint32_t mvr2s( return 0; } -#ifdef JBM_TSM_ON_TCS if ( (void *) y <= (const void *) x ) -#else - if ( (void *) y < (const void *) x ) -#endif { for ( i = 0; i < n; i++ ) { diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index db8b6a659f..45ab2e3435 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -1794,7 +1794,6 @@ void generate_stereo_masking_noise( } -#ifdef JBM_TSM_ON_TCS /*------------------------------------------------------------------- * generate_masking_noise_hf_cldfb() * @@ -1946,7 +1945,6 @@ void generate_masking_noise_lb_dirac( return; } -#endif /*------------------------------------------------------------------- @@ -1967,12 +1965,6 @@ void generate_masking_noise_dirac( ) { int16_t i; -#ifndef JBM_TSM_ON_TCS - float *cngNoiseLevel = hFdCngCom->cngNoiseLevel; - float *fftBuffer = hFdCngCom->fftBuffer; - float *ptr_r; - float *ptr_i; -#endif float *ptr_level; int16_t *seed = &( hFdCngCom->seed ); float scale; @@ -2024,91 +2016,11 @@ void generate_masking_noise_dirac( { if ( scale != 0 ) { -#ifndef JBM_TSM_ON_TCS - /*Generate LF comfort noise only at first slot, for the whole frame*/ - if ( slot_index == 0 ) - { - ptr_level = cngNoiseLevel; - - /* Generate Gaussian random noise in real and imaginary parts of the FFT bins - Amplitudes are adjusted to the estimated noise level cngNoiseLevel in each bin */ - if ( hFdCngCom->startBand == 0 ) - { - rand_gauss( &fftBuffer[0], seed ); - ptr_r = fftBuffer + 2; - fftBuffer[0] *= (float) sqrt( scale * *ptr_level ); /* DC component in FFT */ - ptr_level++; - } - else - { - fftBuffer[0] = 0.f; - set_f( fftBuffer + 2, 0.0f, 2 * ( hFdCngCom->startBand - 1 ) ); - ptr_r = fftBuffer + 2 * hFdCngCom->startBand; - } - ptr_i = ptr_r + 1; - - for ( ; ptr_level < cngNoiseLevel + hFdCngCom->stopFFTbin - hFdCngCom->startBand; ptr_level++ ) - { - /* Real part in FFT bins */ - rand_gauss( ptr_r, seed ); - ( *ptr_r ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); - ptr_r += 2; - /* Imaginary part in FFT bins */ - rand_gauss( ptr_i, seed ); - ( *ptr_i ) *= (float) sqrt( ( scale * *ptr_level ) * 0.5f ); - ptr_i += 2; - } - - /* Remaining FFT bins are set to zero */ - set_f( fftBuffer + 2 * hFdCngCom->stopFFTbin, 0.0f, hFdCngCom->fftlen - 2 * hFdCngCom->stopFFTbin ); - /* Nyquist frequency is discarded */ - fftBuffer[1] = 0.f; - - /* Perform STFT synthesis */ - SynthesisSTFT( fftBuffer, tdBuffer, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, 0, hFdCngCom, -1, -1 ); - -#ifdef DEBUG_MODE_DIRAC - { - int16_t tmp[1000]; - - for ( i = 0; i < hFdCngCom->frameSize; i++ ) - { - tmp[i] = (int16_t) ( tdBuffer[i] + 0.5f ); - } - dbgwrite( tmp, sizeof( int16_t ), hFdCngCom->frameSize, 1, "./res/ivas_dirac_cna_fft.pcm" ); - } -#endif - } -#endif /* LF CLDFB*/ cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb ); } else { -#ifndef JBM_TSM_ON_TCS - if ( slot_index == 0 ) - { - /* very low level case - update random seeds */ - generate_masking_noise_update_seed( hFdCngCom ); - - set_f( fftBuffer, 0.f, hFdCngCom->fftlen ); - - /* Perform STFT synthesis */ - SynthesisSTFT( fftBuffer, tdBuffer, hFdCngCom->olapBufferSynth2, hFdCngCom->olapWinSyn, 0, hFdCngCom, -1, -1 ); - -#ifdef DEBUG_MODE_DIRAC - { - int16_t tmp[1000]; - - for ( i = 0; i < hFdCngCom->frameSize; i++ ) - { - tmp[i] = (int16_t) ( tdBuffer[i] + 0.5f ); - } - dbgwrite( tmp, sizeof( int16_t ), hFdCngCom->frameSize, 1, "./res/ivas_dirac_cna_fft.pcm" ); - } -#endif - } -#endif /* LB ana CLDFB*/ cldfbAnalysis_ts( &( tdBuffer[hFdCngCom->numCoreBands * slot_index] ), Cldfb_RealBuffer, Cldfb_ImagBuffer, hFdCngCom->numCoreBands, h_cldfb ); } diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index d4bd43f544..bac1a69d56 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -59,9 +59,7 @@ static void ivas_binRenderer_filterModule( float out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals */ float CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals */ float CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals */ -#ifdef JBM_TSM_ON_TCS const int16_t numTimeSlots, /* i : number of time slots to process */ -#endif BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ ) { @@ -81,11 +79,7 @@ static void ivas_binRenderer_filterModule( filterTapsRightRealPtr = hBinRenderer->hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx]; filterTapsRightImagPtr = hBinRenderer->hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx]; -#ifdef JBM_TSM_ON_TCS for ( k = 0; k < numTimeSlots; k++ ) -#else - for ( k = 0; k < MAX_PARAM_SPATIAL_SUBFRAMES; k++ ) -#endif { float outRealLeft = 0.0f, outRealRight = 0.0f, outImagLeft = 0.0f, outImagRight = 0.0f; @@ -951,12 +945,8 @@ void ivas_binRenderer_close( void ivas_binaural_add_LFE( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t output_frame, /* i : length of input frame */ -#ifdef JBM_TSM_ON_TCS float *input_f[], /* i : transport channels */ float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif ) { int16_t render_lfe, idx_lfe; @@ -983,17 +973,10 @@ void ivas_binaural_add_LFE( } for ( idx_lfe = 0; idx_lfe < st_ivas->hIntSetup.num_lfe; idx_lfe++ ) { -#ifdef JBM_TSM_ON_TCS v_multc( input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); /* copy LFE to left and right channels */ v_add( output_f[0], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame ); v_add( output_f[1], input_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame ); -#else - v_multc( output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], gain, output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_frame ); - /* copy LFE to left and right channels */ - v_add( output_f[0], output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[0], output_frame ); - v_add( output_f[1], output_f[st_ivas->hIntSetup.index_lfe[idx_lfe]], output_f[1], output_frame ); -#endif } } @@ -1010,11 +993,7 @@ void ivas_binaural_add_LFE( void ivas_binaural_cldfb( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif ) { float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -1057,11 +1036,7 @@ void ivas_binaural_cldfb( } /* Implement binaural rendering */ -#ifdef JBM_TSM_ON_TCS ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); -#else - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); -#endif /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { @@ -1084,7 +1059,6 @@ void ivas_binaural_cldfb( } -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------------* * ivas_binaural_cldfb_sf() * @@ -1153,11 +1127,7 @@ void ivas_binaural_cldfb_sf( } /* Implement binaural rendering */ -#ifdef JBM_TSM_ON_TCS ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); -#else - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); -#endif /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) @@ -1182,7 +1152,6 @@ void ivas_binaural_cldfb_sf( return; } #endif -#endif /*------------------------------------------------------------------------- @@ -1194,9 +1163,7 @@ void ivas_binaural_cldfb_sf( void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ -#ifdef JBM_TSM_ON_TCS const int16_t numTimeSlots, /* i : number of time slots to render*/ -#endif float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ @@ -1204,9 +1171,6 @@ void ivas_binRenderer( ) { int16_t chIdx, k; -#ifndef JBM_TSM_ON_TCS - int16_t numTimeSlots = MAX_PARAM_SPATIAL_SUBFRAMES; -#endif push_wmops( "fastconv_binaural_rendering" ); @@ -1230,47 +1194,27 @@ void ivas_binRenderer( if ( hHeadTrackData->shd_rot_max_order == -1 ) { QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); -#ifdef JBM_TSM_ON_TCS rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); -#else - rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, 3 ); -#endif } else if ( hHeadTrackData->shd_rot_max_order > 0 ) { -#ifdef JBM_TSM_ON_TCS rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order ); -#else - rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, hHeadTrackData->shd_rot_max_order ); -#endif } } else { /* Rotation in SD (CICPx) */ -#ifdef JBM_TSM_ON_TCS rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); -#else - rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, hBinRenderer->conv_band ); -#endif } } /* HOA decoding to CICP19 if needed*/ if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 && hBinRenderer->nInChannels != 16 ) { -#ifdef JBM_TSM_ON_TCS ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, numTimeSlots, hBinRenderer->hoa_dec_mtx ); -#else - ivas_sba2mc_cldfb( *( hBinRenderer->hInputSetup ), RealBuffer, ImagBuffer, hBinRenderer->nInChannels, hBinRenderer->conv_band, hBinRenderer->hoa_dec_mtx ); -#endif } -#ifdef JBM_TSM_ON_TCS ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, numTimeSlots, hBinRenderer ); -#else - ivas_binRenderer_filterModule( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, RealBuffer, ImagBuffer, hBinRenderer ); -#endif /* Obtain the binaural dmx and compute the reverb */ if ( hBinRenderer->hReverb != NULL ) @@ -1290,11 +1234,7 @@ void ivas_binRenderer( } } -#ifdef JBM_TSM_ON_TCS ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, numTimeSlots, inRe, inIm, reverbRe, reverbIm ); -#else - ivas_binaural_reverb_processSubframe( hBinRenderer->hReverb, BINAURAL_CHANNELS, inRe, inIm, reverbRe, reverbIm ); -#endif /* Add the conv module and reverb module output */ for ( chIdx = 0; chIdx < BINAURAL_CHANNELS; chIdx++ ) diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 82f03fdb3b..1fb8e06cc3 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -66,9 +66,7 @@ ivas_error ivas_dec( AUDIO_CONFIG output_config; float pan_left, pan_right; ivas_error error; -#ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS]; -#endif error = IVAS_ERR_OK; @@ -84,11 +82,7 @@ ivas_error ivas_dec( if ( st_ivas->bfi == 0 ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_dec_setup( st_ivas, NULL, NULL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_dec_setup( st_ivas ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -105,12 +99,10 @@ ivas_error ivas_dec( output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); -#ifdef JBM_TSM_ON_TCS for ( n = 0; n < MAX_OUTPUT_CHANNELS; n++ ) { p_output[n] = &output[n][0]; } -#endif /*----------------------------------------------------------------* * Decoding + Rendering @@ -149,11 +141,7 @@ ivas_error ivas_dec( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_MC ) { -#ifdef JBM_TSM_ON_TCS ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); -#endif } } else if ( st_ivas->ivas_format == ISM_FORMAT ) @@ -219,11 +207,7 @@ ivas_error ivas_dec( if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { /* Convert CICP19 -> Ambisonics */ -#ifdef JBM_TSM_ON_TCS ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#else - ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#endif } } } @@ -244,11 +228,7 @@ ivas_error ivas_dec( else if ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ -#ifdef JBM_TSM_ON_TCS ivas_ism_render( st_ivas, p_output, output_frame ); -#else - ivas_ism_render( st_ivas, output, output_frame ); -#endif } #ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) @@ -257,22 +237,14 @@ ivas_error ivas_dec( #endif { /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ -#ifdef JBM_TSM_ON_TCS ivas_ism2sba( p_output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); -#else - ivas_ism2sba( output, st_ivas->hIsmRendererData, st_ivas->hIsmMetaData, st_ivas->nchan_ism, output_frame, st_ivas->hIntSetup.ambisonics_order ); -#endif } /* Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { -#ifdef JBM_TSM_ON_TCS if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) -#else - if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -280,29 +252,17 @@ ivas_error ivas_dec( else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, -#ifdef JBM_TSM_ON_TCS p_output, -#else - output, -#endif output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#ifdef JBM_TSM_ON_TCS ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); -#else - ivas_binaural_add_LFE( st_ivas, output_frame, output ); -#endif } #ifdef DEBUGGING else if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { -#ifdef JBM_TSM_ON_TCS ivas_binaural_cldfb( st_ivas, p_output ); -#else - ivas_binaural_cldfb( st_ivas, output ); -#endif } #endif } @@ -460,7 +420,6 @@ ivas_error ivas_dec( { ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); } -#ifdef JBM_TSM_ON_TCS #ifndef SBA_MODE_CLEAN_UP else if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->renderer_type != RENDERER_DISABLE ) #else @@ -469,7 +428,6 @@ ivas_error ivas_dec( { ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); } -#endif } if ( st_ivas->ivas_format == MASA_FORMAT ) @@ -508,22 +466,14 @@ ivas_error ivas_dec( { if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_sba_linear_renderer( p_output, output_frame, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_sba_linear_renderer( output, output_frame, nchan_remapped, output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ) ) != IVAS_ERR_OK ) -#endif { return error; } } else if ( st_ivas->renderer_type == RENDERER_DIRAC ) { -#ifdef JBM_TSM_ON_TCS ivas_dirac_dec( st_ivas, output, nchan_remapped ); -#else - ivas_dirac_dec( st_ivas, output, nchan_remapped, NULL, NULL, -1 ); -#endif } } else if ( !st_ivas->sba_dirac_stereo_flag && nchan_out != 1 ) @@ -561,11 +511,7 @@ ivas_error ivas_dec( if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) { -#ifdef JBM_TSM_ON_TCS ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); -#else - ivas_mc2sba( st_ivas->hTransSetup, output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); -#endif } /* Rendering */ @@ -573,54 +519,30 @@ ivas_error ivas_dec( { if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, -#ifdef JBM_TSM_ON_TCS p_output, -#else - output, -#endif output_Fs ) ) != IVAS_ERR_OK ) { return error; } -#ifdef JBM_TSM_ON_TCS ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); -#else - ivas_binaural_add_LFE( st_ivas, output_frame, output ); -#endif } else if ( st_ivas->renderer_type == RENDERER_MC ) { -#ifdef JBM_TSM_ON_TCS ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); -#endif } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { -#ifdef JBM_TSM_ON_TCS ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#else - ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#endif } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { -#ifdef JBM_TSM_ON_TCS if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) { return error; } ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); -#else - if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) - { - return error; - } - ivas_binaural_add_LFE( st_ivas, output_frame, output ); -#endif } } else if ( st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) @@ -649,74 +571,42 @@ ivas_error ivas_dec( if ( st_ivas->transport_config != st_ivas->intern_config && ( st_ivas->intern_config == AUDIO_CONFIG_FOA || st_ivas->intern_config == AUDIO_CONFIG_HOA2 || st_ivas->intern_config == AUDIO_CONFIG_HOA3 ) ) { -#ifdef JBM_TSM_ON_TCS ivas_mc2sba( st_ivas->hTransSetup, p_output, p_output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); -#else - ivas_mc2sba( st_ivas->hTransSetup, output, output_frame, st_ivas->hIntSetup.ambisonics_order, GAIN_LFE ); -#endif } /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, p_output, output_Fs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, st_ivas->hHeadTrackData, &st_ivas->hIntSetup, st_ivas->hEFAPdata, output, output_Fs ) ) != IVAS_ERR_OK ) -#endif { return error; } -#ifdef JBM_TSM_ON_TCS ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); -#else - ivas_binaural_add_LFE( st_ivas, output_frame, output ); -#endif } else if ( st_ivas->renderer_type == RENDERER_MC ) { if ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO ) || ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) { -#ifdef JBM_TSM_ON_TCS ivas_ls_setup_conversion( st_ivas, audioCfg2channels( AUDIO_CONFIG_5_1_2 ), output_frame, p_output, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, audioCfg2channels( AUDIO_CONFIG_5_1_2 ), output_frame, output ); -#endif } else { -#ifdef JBM_TSM_ON_TCS ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, output_frame, p_output, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, MC_PARAMUPMIX_MAX_INPUT_CHANS, output_frame, output ); -#endif } } else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { -#ifdef JBM_TSM_ON_TCS ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#else - ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#endif } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_OBJECTS_TD ) { -#ifdef JBM_TSM_ON_TCS if ( ( ivas_td_binaural_renderer( st_ivas, p_output, output_frame ) ) != IVAS_ERR_OK ) -#else - if ( ( ivas_td_binaural_renderer( st_ivas, output, output_frame ) ) != IVAS_ERR_OK ) -#endif { return error; } -#ifdef JBM_TSM_ON_TCS ivas_binaural_add_LFE( st_ivas, output_frame, p_output, p_output ); -#else - ivas_binaural_add_LFE( st_ivas, output_frame, output ); -#endif } } else if ( st_ivas->mc_mode == MC_MODE_PARAMMC ) @@ -748,19 +638,11 @@ ivas_error ivas_dec( /* Rendering */ if ( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) { -#ifdef JBM_TSM_ON_TCS ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, p_output, p_output ); -#else - ivas_ls_setup_conversion( st_ivas, st_ivas->nchan_transport, output_frame, output ); -#endif } else { -#ifdef JBM_TSM_ON_TCS ivas_param_mc_dec( st_ivas, p_output ); -#else - ivas_param_mc_dec( st_ivas, output ); -#endif } } else if ( st_ivas->mc_mode == MC_MODE_MCMASA ) @@ -842,19 +724,11 @@ ivas_error ivas_dec( } else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ { -#ifdef JBM_TSM_ON_TCS ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport ); -#else - ivas_dirac_dec( st_ivas, output, st_ivas->nchan_transport, NULL, NULL, -1 ); -#endif if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { -#ifdef JBM_TSM_ON_TCS ivas_mc2sba( st_ivas->hIntSetup, p_output, p_output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#else - ivas_mc2sba( st_ivas->hIntSetup, output, output_frame, st_ivas->hOutSetup.ambisonics_order, 0.f ); -#endif } else if ( st_ivas->intern_config == AUDIO_CONFIG_5_1 && ( output_config == AUDIO_CONFIG_5_1_2 || output_config == AUDIO_CONFIG_5_1_4 || output_config == AUDIO_CONFIG_7_1 ) ) { @@ -878,21 +752,12 @@ ivas_error ivas_dec( * - float to integer conversion *----------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS ivas_limiter_dec( st_ivas->hLimiter, p_output, nchan_out, output_frame, st_ivas->BER_detect ); #ifdef DEBUGGING st_ivas->noClipping += #endif ivas_syn_output( p_output, output_frame, nchan_out, data ); -#else - ivas_limiter_dec( st_ivas->hLimiter, output, nchan_out, output_frame, st_ivas->BER_detect ); - -#ifdef DEBUGGING - st_ivas->noClipping += -#endif - ivas_syn_output( output, output_frame, nchan_out, data ); -#endif /*----------------------------------------------------------------* * Common updates diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 00f0c6ad9a..3bde2aa5ee 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -269,9 +269,7 @@ ivas_error ivas_dirac_dec_config( ivas_error error; int16_t nchan_transport_orig; int16_t hodirac_flag; -#ifdef JBM_TSM_ON_TCS int16_t map_idx; -#endif DIRAC_CONFIG_FLAG flag_config; flag_config = ( flag_config_inp == DIRAC_RECONFIGURE_MODE ) ? DIRAC_RECONFIGURE : flag_config_inp; @@ -302,10 +300,8 @@ ivas_error ivas_dirac_dec_config( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); } nchan_transport_old = 0; -#ifdef JBM_TSM_ON_TCS hDirAC->hParamIsm = NULL; hDirAC->hParamIsmRendering = NULL; -#endif st_ivas->hDirAC = hDirAC; } @@ -401,18 +397,12 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); -#ifdef JBM_TSM_ON_TCS set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); hDirAC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; hDirAC->subframes_rendered = 0; hDirAC->slots_rendered = 0; hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; -#else - hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); - hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; - assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); -#endif } if ( st_ivas->ivas_format == SBA_FORMAT && flag_config == DIRAC_RECONFIGURE && ( ( ivas_total_brate > IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_256k ) || ( ivas_total_brate <= IVAS_256k && st_ivas->hDecoderConfig->last_ivas_total_brate > IVAS_256k ) ) ) @@ -1035,27 +1025,23 @@ ivas_error ivas_dirac_dec_config( { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; -#ifdef JBM_TSM_ON_TCS set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) { hDirAC->render_to_md_map[map_idx] = map_idx; } -#endif } else if ( st_ivas->ivas_format == MASA_FORMAT ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_MASA_PARAM_DEC_SFR; hDirAC->dirac_bs_md_write_idx = DELAY_MASA_PARAM_DEC_SFR; -#ifdef JBM_TSM_ON_TCS set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS; map_idx++ ) { hDirAC->render_to_md_map[map_idx] = map_idx; } -#endif } else { @@ -1091,7 +1077,6 @@ ivas_error ivas_dirac_dec_config( #ifndef SBA_MODE_CLEAN_UP } #endif -#ifdef JBM_TSM_ON_TCS set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); #ifdef FIX_393_459_460_SBA_MD @@ -1106,7 +1091,6 @@ ivas_error ivas_dirac_dec_config( hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; #endif } -#endif } if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) @@ -1162,7 +1146,6 @@ ivas_error ivas_dirac_dec_config( } } #endif -#ifdef JBM_TSM_ON_TCS /* allocate transport channels*/ if ( flag_config == DIRAC_OPEN ) { @@ -1192,7 +1175,6 @@ ivas_error ivas_dirac_dec_config( } } } -#endif /* JBM_TMS_ON_TCS*/ return error; } @@ -2144,29 +2126,20 @@ void ivas_qmetadata_to_dirac( { band_start = band_grouping[band]; band_end = band_grouping[band + 1]; -#ifdef JBM_TSM_ON_TCS tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) -#else - for ( block = 0; block < hDirAC->nb_subframes; block++ ) -#endif { -#ifdef JBM_TSM_ON_TCS #ifndef FIX_393_459_460_SBA_MD ts_start = hDirAC->block_grouping[block]; ts_end = hDirAC->block_grouping[block + 1]; -#endif #endif for ( b = band_start; b < band_end; b++ ) { -#ifdef JBM_TSM_ON_TCS tmp_write_idx_band = tmp_write_idx_param_band; -#endif hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; -#ifdef JBM_TSM_ON_TCS #ifndef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { @@ -2196,7 +2169,6 @@ void ivas_qmetadata_to_dirac( tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } -#endif #endif } } @@ -2234,11 +2206,7 @@ void ivas_qmetadata_to_dirac( #endif diff_idx = q_direction->band_data[qBand_idx].energy_ratio_index[0]; -#ifdef JBM_TSM_ON_TCS for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) -#else - for ( block = 0; block < hDirAC->nb_subframes; block++ ) -#endif { int16_t block_qmetadata; @@ -2365,11 +2333,7 @@ void ivas_qmetadata_to_dirac( { tmp_write_idx_band = hDirAC->dirac_bs_md_write_idx; -#ifdef JBM_TSM_ON_TCS for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) -#else - for ( block = 0; block < hDirAC->nb_subframes; block++ ) -#endif { #ifndef FIX_393_459_460_SBA_MD ts_start = hDirAC->block_grouping[block]; @@ -2387,11 +2351,9 @@ void ivas_qmetadata_to_dirac( hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; -#ifdef JBM_TSM_ON_TCS hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; -#endif tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; #ifndef FIX_393_459_460_SBA_MD } @@ -2402,11 +2364,9 @@ void ivas_qmetadata_to_dirac( hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; -#ifdef JBM_TSM_ON_TCS hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; -#endif tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } @@ -2432,7 +2392,6 @@ void ivas_qmetadata_to_dirac( } -#ifdef JBM_TSM_ON_TCS /*------------------------------------------------------------------------- * ivas_dirac_dec_set_md_map() * @@ -2657,7 +2616,6 @@ void ivas_dirac_dec_render( return; } -#endif /*------------------------------------------------------------------------- @@ -2666,24 +2624,12 @@ void ivas_dirac_dec_render( * DirAC decoding process *------------------------------------------------------------------------*/ -#ifndef JBM_TSM_ON_TCS -void ivas_dirac_dec( -#else void ivas_dirac_dec_render_sf( -#endif Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif const int16_t nchan_transport, /* i : number of transport channels */ float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] -#ifndef JBM_TSM_ON_TCS - , - const int16_t i_sf -#endif ) { int16_t i, ch, idx_in, idx_lfe; @@ -2692,15 +2638,10 @@ void ivas_dirac_dec_render_sf( float surCohEner; float surCohRatio[CLDFB_NO_CHANNELS_MAX]; int16_t subframe_idx; -#ifndef JBM_TSM_ON_TCS - int16_t sf1, sf2; -#endif int16_t slot_idx, index_slot; int16_t hodirac_flag; float *p_Rmat; -#ifdef JBM_TSM_ON_TCS int16_t slot_idx_start, slot_idx_start_cldfb_synth, md_idx; -#endif /*CLDFB: last output channels reserved to LFT for CICPx*/ float Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -2709,7 +2650,6 @@ void ivas_dirac_dec_render_sf( float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; int16_t index, num_freq_bands; -#ifdef JBM_TSM_ON_TCS /* local copies of azi, ele, diffuseness */ #ifdef FIX_393_459_460_SBA_MD int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; @@ -2719,7 +2659,6 @@ void ivas_dirac_dec_render_sf( int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; float diffuseness_vector[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#endif #endif DIRAC_DEC_STACK_MEM DirAC_mem; @@ -2727,11 +2666,7 @@ void ivas_dirac_dec_render_sf( float *onset_filter, *onset_filter_subframe, *p_onset_filter = NULL; uint16_t coherence_flag; -#ifndef JBM_TSM_ON_TCS - push_wmops( "ivas_dirac_dec" ); -#else push_wmops( "ivas_dirac_dec_render" ); -#endif /* Initialize aux buffers */ hDirAC = st_ivas->hDirAC; @@ -2777,30 +2712,10 @@ void ivas_dirac_dec_render_sf( #endif /* Subframe loop */ -#ifndef JBM_TSM_ON_TCS - if ( i_sf == -1 ) - { - sf1 = 0; - sf2 = hDirAC->nb_subframes; - } - else - { - sf1 = i_sf; - sf2 = i_sf + 1; - } -#endif -#ifdef JBM_TSM_ON_TCS slot_idx_start = hDirAC->slots_rendered; slot_idx_start_cldfb_synth = 0; -#endif -#ifdef JBM_TSM_ON_TCS subframe_idx = hDirAC->subframes_rendered; -#else - for ( subframe_idx = sf1; subframe_idx < sf2; subframe_idx++ ) - { -#endif -#ifdef JBM_TSM_ON_TCS if ( hDirAC->hConfig->dec_param_estim == FALSE ) { md_idx = hDirAC->render_to_md_map[subframe_idx]; @@ -2809,8 +2724,6 @@ void ivas_dirac_dec_render_sf( { md_idx = hDirAC->render_to_md_map[slot_idx_start]; } -#endif -#ifdef JBM_TSM_ON_TCS /* Another workaround for self test BE */ /* copy parameters into local buffers*/ @@ -2844,7 +2757,6 @@ void ivas_dirac_dec_render_sf( mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); } } -#endif #endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) @@ -2856,12 +2768,8 @@ void ivas_dirac_dec_render_sf( set_zero( onset_filter_subframe, hDirAC->num_freq_bands ); } -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hHeadTrackData ) -#else - if ( st_ivas->hHeadTrackData ) -#endif { QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); @@ -2876,20 +2784,9 @@ void ivas_dirac_dec_render_sf( rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } #else -#ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) -#else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) -#endif { -#ifdef JBM_TSM_ON_TCS rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); -#else - /* note, this seems wrong since it does not take the dirac read ptr into account */ - index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; - /* Todo: This access to azimuth & elevation may use wrong indices as access should probably be based on hDirAC->dirac_read_idx */ - rotateAziEle_DirAC( hDirAC->azimuth[index_slot], hDirAC->elevation[index_slot], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); -#endif } #endif } @@ -2905,14 +2802,10 @@ void ivas_dirac_dec_render_sf( if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands, -#ifdef JBM_TSM_ON_TCS #ifdef FIX_393_459_460_SBA_MD diffuseness_vector, #else diffuseness_vector[0], -#endif -#else - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], #endif hDirAC->h_output_synthesis_psd_params.max_band_decorr, hDirAC->h_output_synthesis_psd_state.direct_power_factor, @@ -2923,11 +2816,7 @@ void ivas_dirac_dec_render_sf( for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { dirEne = hDirAC->h_output_synthesis_psd_state.direct_power_factor[i]; -#ifdef JBM_TSM_ON_TCS surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[md_idx][i]; -#else - surCohEner = hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] * hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; -#endif hDirAC->h_output_synthesis_psd_state.diffuse_power_factor[i] -= surCohEner; hDirAC->h_output_synthesis_psd_state.direct_power_factor[i] += surCohEner; @@ -2942,11 +2831,7 @@ void ivas_dirac_dec_render_sf( else { ivas_dirac_dec_compute_gain_factors( hDirAC->num_freq_bands, -#ifdef JBM_TSM_ON_TCS hDirAC->diffuseness_vector[md_idx], -#else - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], -#endif hDirAC->h_output_synthesis_psd_params.max_band_decorr, hDirAC->h_output_synthesis_psd_state.direct_power_factor, hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); @@ -2955,11 +2840,7 @@ void ivas_dirac_dec_render_sf( { for ( i = 0; i < hDirAC->num_freq_bands; i++ ) { -#ifdef JBM_TSM_ON_TCS surCohRatio[i] = hDirAC->surroundingCoherence[md_idx][i]; -#else - surCohRatio[i] = hDirAC->surroundingCoherence[hDirAC->dirac_read_idx][i]; -#endif } } else @@ -2973,7 +2854,6 @@ void ivas_dirac_dec_render_sf( ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, st_ivas->hMasa, -#ifdef JBM_TSM_ON_TCS #ifdef FIX_393_459_460_SBA_MD azimuth, elevation, @@ -2982,7 +2862,6 @@ void ivas_dirac_dec_render_sf( hDirAC->elevation[md_idx], #endif md_idx, -#endif surCohRatio, st_ivas->hHeadTrackData->shd_rot_max_order, p_Rmat, @@ -2993,7 +2872,6 @@ void ivas_dirac_dec_render_sf( ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, st_ivas->hMasa, -#ifdef JBM_TSM_ON_TCS #ifdef FIX_393_459_460_SBA_MD azimuth, elevation, @@ -3002,7 +2880,6 @@ void ivas_dirac_dec_render_sf( hDirAC->elevation[md_idx], #endif md_idx, -#endif surCohRatio, 0, NULL, @@ -3010,13 +2887,8 @@ void ivas_dirac_dec_render_sf( } } -#ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) -#else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) -#endif { -#ifdef JBM_TSM_ON_TCS index_slot = slot_idx_start + slot_idx; if ( hDirAC->hConfig->dec_param_estim == TRUE ) { @@ -3026,9 +2898,6 @@ void ivas_dirac_dec_render_sf( { md_idx = hDirAC->render_to_md_map[subframe_idx]; } -#else - index_slot = subframe_idx * hDirAC->subframe_nbslots + slot_idx; -#endif #ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) @@ -3047,19 +2916,11 @@ void ivas_dirac_dec_render_sf( /* CLDFB Analysis*/ for ( ch = 0; ch < nchan_transport; ch++ ) { -#ifdef JBM_TSM_ON_TCS cldfbAnalysis_ts( &( st_ivas->hTcBuffer->tc[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), Cldfb_RealBuffer[ch][0], Cldfb_ImagBuffer[ch][0], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); -#else - cldfbAnalysis_ts( &( output_f[hDirAC->sba_map_tc[ch]][hDirAC->num_freq_bands * index_slot] ), - Cldfb_RealBuffer[ch][0], - Cldfb_ImagBuffer[ch][0], - hDirAC->num_freq_bands, - st_ivas->cldfbAnaDec[ch] ); -#endif } } @@ -3074,11 +2935,7 @@ void ivas_dirac_dec_render_sf( generate_masking_noise_dirac( st->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], -#ifdef JBM_TSM_ON_TCS st_ivas->hTcBuffer->tc[1], -#else - &( output_f[1][L_FRAME48k - L_FRAME16k] ), -#endif Cldfb_RealBuffer[1][0], Cldfb_ImagBuffer[1][0], index_slot, @@ -3093,11 +2950,7 @@ void ivas_dirac_dec_render_sf( Cldfb_RealBuffer, Cldfb_ImagBuffer, Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1], Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1], slot_idx, -#ifdef JBM_TSM_ON_TCS md_idx, -#else - subframe_idx, -#endif nchan_transport ); } @@ -3213,17 +3066,12 @@ void ivas_dirac_dec_render_sf( hDirAC->buffer_intensity_real[1][index - 1], hDirAC->buffer_intensity_real[2][index - 1], num_freq_bands, -#ifdef JBM_TSM_ON_TCS #ifdef FIX_393_459_460_SBA_MD azimuth, elevation #else azimuth[slot_idx], elevation[slot_idx] -#endif -#else - hDirAC->azimuth[hDirAC->dirac_estimator_idx], - hDirAC->elevation[hDirAC->dirac_estimator_idx] #endif ); @@ -3232,21 +3080,14 @@ void ivas_dirac_dec_render_sf( computeDiffuseness( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, -#ifdef JBM_TSM_ON_TCS #ifdef FIX_393_459_460_SBA_MD hDirAC->diffuseness_vector[md_idx] #else diffuseness_vector[slot_idx] -#endif -#else - hDirAC->diffuseness_vector[hDirAC->dirac_estimator_idx] #endif ); -#ifndef JBM_TSM_ON_TCS - hDirAC->dirac_estimator_idx = ( hDirAC->dirac_estimator_idx + 1 ) % hDirAC->dirac_md_buffer_length; -#endif } #ifdef DEBUG_MODE_DIRAC @@ -3368,34 +3209,6 @@ void ivas_dirac_dec_render_sf( } /*Compute PSDs*/ -#ifndef JBM_TSM_ON_TCS - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 2 ) - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - hDirAC, - p_Rmat, - st_ivas->hVBAPdata, - hDirAC->hOutSetup, - nchan_transport, - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k ); - } - else - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, - hDirAC, - 0, - st_ivas->hVBAPdata, - hDirAC->hOutSetup, - nchan_transport, - st_ivas->sba_analysis_order > 1 && - st_ivas->hDecoderConfig->ivas_total_brate > IVAS_256k - - ); - } -#else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) { ivas_dirac_dec_output_synthesis_process_slot( reference_power, @@ -3442,7 +3255,6 @@ void ivas_dirac_dec_render_sf( md_idx, hodirac_flag ); } -#endif #ifdef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim ) @@ -3457,21 +3269,8 @@ void ivas_dirac_dec_render_sf( v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands ); } -#ifndef JBM_TSM_ON_TCS - if ( hDirAC->hConfig->dec_param_estim ) - { - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; - } -#endif } -#ifndef JBM_TSM_ON_TCS - if ( hDirAC->hConfig->dec_param_estim == 0 ) - { - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; - } -#endif -#ifdef JBM_TSM_ON_TCS ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); #ifndef FIX_393_459_460_SBA_MD @@ -3514,23 +3313,18 @@ void ivas_dirac_dec_render_sf( } #endif -#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC, nchan_transport, -#ifdef JBM_TSM_ON_TCS hDirAC->subframe_nbslots[subframe_idx], -#endif p_onset_filter, #ifdef FIX_393_459_460_SBA_MD diffuseness_vector, #else -#ifdef JBM_TSM_ON_TCS md_idx, -#endif #endif hodirac_flag ); } @@ -3545,7 +3339,6 @@ void ivas_dirac_dec_render_sf( qualityBasedSmFactor *= qualityBasedSmFactor; } -#ifdef JBM_TSM_ON_TCS #ifndef FIX_393_459_460_SBA_MD /* Workaround for BE (should be gone when #393 is adressed) */ if ( hDirAC->hConfig->dec_param_estim == 1 ) @@ -3560,17 +3353,14 @@ void ivas_dirac_dec_render_sf( } #endif -#endif ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC, -#ifdef JBM_TSM_ON_TCS hDirAC->subframe_nbslots[subframe_idx], #ifdef FIX_393_459_460_SBA_MD diffuseness_vector, #else md_idx, -#endif #endif reference_power_smooth, qualityBasedSmFactor ); @@ -3580,20 +3370,14 @@ void ivas_dirac_dec_render_sf( * CLDFB synthesis (and binaural rendering) *-----------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS index_slot = slot_idx_start_cldfb_synth; -#else - index_slot = subframe_idx * hDirAC->subframe_nbslots; -#endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { /* Perform binaural rendering */ ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, -#ifdef JBM_TSM_ON_TCS hDirAC->subframe_nbslots[subframe_idx], -#endif Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, @@ -3606,29 +3390,17 @@ void ivas_dirac_dec_render_sf( float *RealBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; float *ImagBuffer[MAX_PARAM_SPATIAL_SUBFRAMES]; -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) -#else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) -#endif { RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; } -#ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); -#else - cldfbSynthesis( RealBuffer, - ImagBuffer, - &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), - hDirAC->num_freq_bands * hDirAC->subframe_nbslots, - st_ivas->cldfbSynDec[ch] ); -#endif } } #ifdef SBA_MODE_CLEAN_UP @@ -3639,11 +3411,7 @@ void ivas_dirac_dec_render_sf( { for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ ) { -#ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) -#else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) -#endif { mvr2r( Cldfb_RealBuffer[ch][slot_idx], pppQMfFrame_ts_re[ch][slot_idx], hDirAC->num_freq_bands ); mvr2r( Cldfb_ImagBuffer[ch][slot_idx], pppQMfFrame_ts_im[ch][slot_idx], hDirAC->num_freq_bands ); @@ -3675,11 +3443,7 @@ void ivas_dirac_dec_render_sf( float tmp_separated[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; float tmp_lfe[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; const int16_t subframe_start_sample = index_slot * hDirAC->num_freq_bands; -#ifdef JBM_TSM_ON_TCS const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx]; -#else - const int16_t num_samples_subframe = hDirAC->num_freq_bands * hDirAC->subframe_nbslots; -#endif /* Move the separated and the LFE channels to temporary variables as spatial synthesis may overwrite current channels */ mvr2r( &( output_f[st_ivas->hOutSetup.separateChannelIndex][subframe_start_sample] ), tmp_separated, num_samples_subframe ); @@ -3706,11 +3470,7 @@ void ivas_dirac_dec_render_sf( else { /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) -#else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) -#endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; @@ -3736,20 +3496,12 @@ void ivas_dirac_dec_render_sf( { if ( st_ivas->mc_mode == MC_MODE_MCMASA && !hDirAC->hOutSetup.separateChannelEnabled ) { -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) -#else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) -#endif { RealBuffer[i] = Cldfb_RealBuffer[MAX_OUTPUT_CHANNELS - 1][i]; ImagBuffer[i] = Cldfb_ImagBuffer[MAX_OUTPUT_CHANNELS - 1][i]; } -#ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); -#else - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[hDirAC->hOutSetup.nchan_out_woLFE + idx_lfe] ); -#endif } else if ( st_ivas->mc_mode == MC_MODE_MCMASA && hDirAC->hOutSetup.separateChannelEnabled ) { @@ -3757,11 +3509,7 @@ void ivas_dirac_dec_render_sf( } else { -#ifdef JBM_TSM_ON_TCS set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); -#else - set_zero( &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); -#endif } if ( idx_lfe < ( hDirAC->hOutSetup.num_lfe - 1 ) ) @@ -3777,32 +3525,19 @@ void ivas_dirac_dec_render_sf( else { /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) -#else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) -#endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; } -#ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[idx_in] ); -#else - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][index_slot * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[idx_in] ); -#endif idx_in++; } } } } -#ifdef JBM_TSM_ON_TCS hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx]; hDirAC->subframes_rendered++; -#endif -#ifndef JBM_TSM_ON_TCS -} -#endif pop_wmops(); diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index ffe6fea382..cc08a6faca 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -105,22 +105,18 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); -#ifdef JBM_TSM_ON_TCS if ( ( h_dirac_output_synthesis_state->mixing_matrix[idx] = (float *) malloc( nchan_out * nchan_in * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) ); } set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); -#endif } for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { h_dirac_output_synthesis_state->cx_old[idx] = NULL; h_dirac_output_synthesis_state->cy_old[idx] = NULL; h_dirac_output_synthesis_state->mixing_matrix_old[idx] = NULL; -#ifdef JBM_TSM_ON_TCS h_dirac_output_synthesis_state->mixing_matrix[idx] = NULL; -#endif } for ( idx = 0; idx < num_param_bands_residual; idx++ ) @@ -131,20 +127,16 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( } set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); -#ifdef JBM_TSM_ON_TCS if ( ( h_dirac_output_synthesis_state->mixing_matrix_res[idx] = (float *) malloc( nchan_out * nchan_out * sizeof( float ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis matrix\n" ) ); } set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); -#endif } for ( ; idx < CLDFB_NO_CHANNELS_MAX; idx++ ) { h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; -#ifdef JBM_TSM_ON_TCS h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL; -#endif } /*-----------------------------------------------------------------* @@ -168,7 +160,6 @@ ivas_error ivas_dirac_dec_output_synthesis_cov_open( } -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* * ivas_dirac_dec_output_synthesis_get_interpolator() * @@ -189,7 +180,6 @@ void ivas_dirac_dec_output_synthesis_get_interpolator( return; } -#endif /*-------------------------------------------------------------------* @@ -215,17 +205,13 @@ void ivas_dirac_dec_output_synthesis_cov_init( set_zero( h_dirac_output_synthesis_state->cx_old[idx], nchan_in * nchan_in ); set_zero( h_dirac_output_synthesis_state->cy_old[idx], nchan_out * nchan_out ); set_zero( h_dirac_output_synthesis_state->mixing_matrix_old[idx], nchan_out * nchan_in ); -#ifdef JBM_TSM_ON_TCS set_zero( h_dirac_output_synthesis_state->mixing_matrix[idx], nchan_out * nchan_in ); -#endif } for ( idx = 0; idx < n_param_bands_res; idx++ ) { set_zero( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx], nchan_out * nchan_out ); -#ifdef JBM_TSM_ON_TCS set_zero( h_dirac_output_synthesis_state->mixing_matrix_res[idx], nchan_out * nchan_out ); -#endif } return; @@ -297,7 +283,6 @@ void ivas_dirac_dec_output_synthesis_cov_close( h_dirac_output_synthesis_state->mixing_matrix_res_old[idx] = NULL; } -#ifdef JBM_TSM_ON_TCS if ( h_dirac_output_synthesis_state->mixing_matrix[idx] != NULL ) { free( h_dirac_output_synthesis_state->mixing_matrix[idx] ); @@ -309,7 +294,6 @@ void ivas_dirac_dec_output_synthesis_cov_close( free( h_dirac_output_synthesis_state->mixing_matrix_res[idx] ); h_dirac_output_synthesis_state->mixing_matrix_res[idx] = NULL; } -#endif } return; @@ -323,21 +307,12 @@ void ivas_dirac_dec_output_synthesis_cov_close( *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( -#ifdef JBM_TSM_ON_TCS float *RealBuffer, /* i : input channel filter bank samples (real part) */ float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ -#else - float RealBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (real part) */ - float ImagBuffer[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : input channel filter bank samples (imaginary part */ -#endif float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ const int16_t nchan_in /* i : number of input channels */ -#ifndef JBM_TSM_ON_TCS - , - const int16_t idx_slot /* i : index of the slot to be added to the input covariance */ -#endif ) { int16_t param_band, band_idx, ch_idx; @@ -363,13 +338,8 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( int16_t band = brange[0] + band_idx; for ( ch_idx = 0; ch_idx < nchan_in; ch_idx++ ) { -#ifdef JBM_TSM_ON_TCS real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx * hParamMC->num_freq_bands + band]; imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx * hParamMC->num_freq_bands + band]; -#else - real_in_buffer[band_idx + num_bands * ch_idx] = RealBuffer[ch_idx][idx_slot][band]; - imag_in_buffer[band_idx + num_bands * ch_idx] = ImagBuffer[ch_idx][idx_slot][band]; -#endif } } @@ -392,22 +362,12 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( -#ifdef JBM_TSM_ON_TCS float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ -#else - float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ - float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ -#endif float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ -#ifdef JBM_TSM_ON_TCS float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ -#else - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : parameter band wise mixing matrices (direct part) */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : parameter band wise mixing matrices (residual part) */ -#endif const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ const int16_t nX, /* i : number of input channels */ @@ -497,13 +457,8 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( /* collect input signals, still in cldfb buffers */ for ( ch_idx = 0; ch_idx < nX; ch_idx++ ) { -#ifdef JBM_TSM_ON_TCS input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx * hParamMC->num_freq_bands + band]; input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx * hParamMC->num_freq_bands + band]; -#else - input_f_real[ch_idx] = Cldfb_RealBuffer_in[ch_idx][slot_idx_tot][band]; - input_f_imag[ch_idx] = Cldfb_ImagBuffer_in[ch_idx][slot_idx_tot][band]; -#endif } /* apply mixing matrix */ diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 33004c540c..7bdaea9d3c 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -164,11 +164,7 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* buffer length and interpolator */ -#ifdef JBM_TSM_ON_TCS if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( JBM_CLDFB_SLOTS_IN_SUBFRAME * sizeof( float ) ) ) == NULL ) -#else - if ( ( dirac_output_synthesis_params->interpolator = (float *) malloc( hDirAC->subframe_nbslots * sizeof( float ) ) ) == NULL ) -#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC synthesis\n" ) ); } @@ -287,17 +283,9 @@ ivas_error ivas_dirac_dec_output_synthesis_open( } /* compute interpolator */ -#ifdef JBM_TSM_ON_TCS for ( idx = 1; idx <= JBM_CLDFB_SLOTS_IN_SUBFRAME; ++idx ) -#else - for ( idx = 1; idx <= hDirAC->subframe_nbslots; ++idx ) -#endif { -#ifdef JBM_TSM_ON_TCS dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) JBM_CLDFB_SLOTS_IN_SUBFRAME; -#else - dirac_output_synthesis_params->interpolator[idx - 1] = (float) idx / (float) hDirAC->subframe_nbslots; -#endif } /* prepare diffuse response function */ @@ -548,23 +536,17 @@ void ivas_dirac_dec_output_synthesis_close( void ivas_dirac_dec_output_synthesis_process_slot( const float *reference_power, /* i : Estimated power */ const float *onset, /* i : onset filter */ -#ifdef JBM_TSM_ON_TCS const int16_t *azimuth, const int16_t *elevation, const float *diffuseness, -#endif DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ -#ifdef JBM_TSM_ON_TCS const int16_t sh_rot_max_order, -#endif const float *p_Rmat, /* i : rotation matrix */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport /* i : number of transport channels*/ -#if defined( JBM_TSM_ON_TCS ) , const int16_t md_idx -#endif , const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) @@ -574,15 +556,9 @@ void ivas_dirac_dec_output_synthesis_process_slot( int16_t ch_idx; float aux_buf[CLDFB_NO_CHANNELS_MAX]; int16_t diff_start_band; -#ifndef JBM_TSM_ON_TCS - const float *diffuseness; -#endif DIRAC_OUTPUT_SYNTHESIS_PARAMS *h_dirac_output_synthesis_params; DIRAC_OUTPUT_SYNTHESIS_STATE *h_dirac_output_synthesis_state; -#ifndef JBM_TSM_ON_TCS - diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; -#endif h_dirac_output_synthesis_params = &( hDirAC->h_output_synthesis_psd_params ); h_dirac_output_synthesis_state = &( hDirAC->h_output_synthesis_psd_state ); @@ -608,11 +584,9 @@ void ivas_dirac_dec_output_synthesis_process_slot( ivas_dirac_dec_compute_directional_responses( hDirAC, hVBAPdata, NULL, -#ifdef JBM_TSM_ON_TCS azimuth, elevation, md_idx, -#endif NULL, 2, p_Rmat, @@ -623,7 +597,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( { if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { -#ifdef JBM_TSM_ON_TCS v_multc( hDirAC->energy_ratio1[md_idx], -1.f, aux_buf, num_freq_bands ); v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); mvr2r( hDirAC->energy_ratio1[md_idx], @@ -641,41 +614,14 @@ void ivas_dirac_dec_output_synthesis_process_slot( mvr2r( aux_buf, &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], num_freq_bands ); -#else - v_multc( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); - v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); - mvr2r( hDirAC->energy_ratio1[hDirAC->dirac_read_idx], - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - mvr2r( aux_buf, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); - - v_multc( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], -1.f, aux_buf, num_freq_bands ); - v_addc( aux_buf, 1.f, aux_buf, num_freq_bands ); - mvr2r( hDirAC->energy_ratio2[hDirAC->dirac_read_idx], - &h_dirac_output_synthesis_state->direct_power_factor[hDirAC->num_freq_bands], - num_freq_bands ); - mvr2r( aux_buf, - &h_dirac_output_synthesis_state->diffuse_power_factor[hDirAC->num_freq_bands], - num_freq_bands ); -#endif } else { -#ifdef JBM_TSM_ON_TCS ivas_dirac_dec_compute_gain_factors( num_freq_bands, hDirAC->diffuseness_vector[md_idx], h_dirac_output_synthesis_params->max_band_decorr, h_dirac_output_synthesis_state->direct_power_factor, h_dirac_output_synthesis_state->diffuse_power_factor ); -#else - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx], - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); -#endif } } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) @@ -683,7 +629,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( { /* compute direct responses */ -#ifdef JBM_TSM_ON_TCS ivas_dirac_dec_compute_directional_responses( hDirAC, hVBAPdata, NULL, @@ -694,7 +639,6 @@ void ivas_dirac_dec_output_synthesis_process_slot( sh_rot_max_order, p_Rmat, hodirac_flag ); -#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -831,16 +775,12 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ -#ifdef JBM_TSM_ON_TCS const int16_t nbslots, /* i : number of slots to process */ -#endif const float *onset_filter, #ifdef FIX_393_459_460_SBA_MD float *diffuseness, #else -#ifdef JBM_TSM_ON_TCS const int16_t md_idx, -#endif #endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) @@ -881,11 +821,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( nchan_transport_foa = min( 4, nchan_transport ); #ifndef FIX_393_459_460_SBA_MD -#ifdef JBM_TSM_ON_TCS diffuseness = hDirAC->diffuseness_vector[md_idx]; -#else - diffuseness = hDirAC->diffuseness_vector[hDirAC->dirac_read_idx]; -#endif #endif /*-----------------------------------------------------------------* @@ -1087,11 +1023,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( * gain interpolation and output streams *-----------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) -#else - for ( buf_idx = 0; buf_idx < hDirAC->subframe_nbslots; ++buf_idx ) -#endif { g1 = h_dirac_output_synthesis_params.interpolator[buf_idx]; g2 = 1.f - g1; @@ -1300,13 +1232,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ -#ifdef JBM_TSM_ON_TCS const int16_t nbslots, /* i : number of slots to process */ #ifdef FIX_393_459_460_SBA_MD float *diffuseness_vector, #else const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ -#endif #endif float *reference_power_smooth, float qualityBasedSmFactor ) @@ -1435,15 +1365,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /* Estimate the smoothness of the directions based on the diffuseness parameter */ /* TODO: check this, seems buggy in the case of parame estim on the decoder side, because the pointer here points already to the following subframe, ist this intended?*/ -#ifdef JBM_TSM_ON_TCS #ifdef FIX_393_459_460_SBA_MD instDirectionSmoothness = 1.0f - diffuseness_vector[l]; #else /* Workaround for BE */ instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[diff_md_idx][l]; /* Currently, all subframes have same energy ratio value. */ -#endif -#else - instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[hDirAC->dirac_read_idx][l]; /* Currently, all subframes have same energy ratio value. */ #endif instDirectionSmoothness = min( max( instDirectionSmoothness, 0.0f ), 1.0f ); @@ -1588,11 +1514,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /*-----------------------------------------------------------------* * gain interpolation and output streams *-----------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS for ( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) -#else - for ( buf_idx = 0; buf_idx < hDirAC->subframe_nbslots; ++buf_idx ) -#endif { g1 = h_dirac_output_synthesis_params->interpolator[buf_idx]; g2 = 1.f - g1; @@ -1834,11 +1756,9 @@ void ivas_dirac_dec_compute_directional_responses( DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const VBAP_HANDLE hVBAPdata, /* i : VBAP structure */ const MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ -#ifdef JBM_TSM_ON_TCS const int16_t *azimuth, const int16_t *elevation, const int16_t md_idx, -#endif const float *surCohRatio, const int16_t shd_rot_max_order, /* i : split-order rotation method */ const float *p_Rmat /* i : rotation matrix */ @@ -1852,9 +1772,6 @@ void ivas_dirac_dec_compute_directional_responses( float direct_response_ls[MAX_OUTPUT_CHANNELS]; float direct_response_square[MAX_OUTPUT_CHANNELS]; float *direct_response; -#ifndef JBM_TSM_ON_TCS - const int16_t *azimuth, *elevation; -#endif const int16_t *azimuth2, *elevation2; float direct_response_dir2[MAX_OUTPUT_CHANNELS]; float directRatio[MASA_MAXIMUM_DIRECTIONS]; @@ -1875,21 +1792,11 @@ void ivas_dirac_dec_compute_directional_responses( } num_channels_dir = hDirAC->num_outputs_dir; -#ifdef JBM_TSM_ON_TCS if ( hDirAC->numSimultaneousDirections == 2 ) { azimuth2 = hDirAC->azimuth2[md_idx]; elevation2 = hDirAC->elevation2[md_idx]; } -#else - azimuth = hDirAC->azimuth[hDirAC->dirac_read_idx]; - elevation = hDirAC->elevation[hDirAC->dirac_read_idx]; - if ( hDirAC->numSimultaneousDirections == 2 ) - { - azimuth2 = hDirAC->azimuth2[hDirAC->dirac_read_idx]; - elevation2 = hDirAC->elevation2[hDirAC->dirac_read_idx]; - } -#endif codingBand = -1; assert( num_channels_dir <= MAX_OUTPUT_CHANNELS && "Number of channels is too high" ); @@ -1957,29 +1864,15 @@ void ivas_dirac_dec_compute_directional_responses( hDirAC->synthesisConf == DIRAC_SYNTHESIS_PSD_SHD || hDirAC->synthesisConf == DIRAC_SYNTHESIS_MONO ) { /* Synthesize the first direction */ -#ifdef JBM_TSM_ON_TCS spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); -#else - spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); -#endif /* Synthesize the second direction and combine the gains */ if ( hDirAC->numSimultaneousDirections == 2 ) { -#ifdef JBM_TSM_ON_TCS spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); -#else - spreadCoherencePanningHoa( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); -#endif /* Combine gains from the two directions */ -#ifdef JBM_TSM_ON_TCS totalDirect = hDirAC->energy_ratio1[md_idx][k] + hDirAC->energy_ratio2[md_idx][k] + EPSILON; directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect; directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect; -#else - totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; - directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; - directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; -#endif for ( l = 0; l < num_channels_dir; l++ ) { direct_response_hoa[l] *= directRatio[0]; @@ -2027,33 +1920,19 @@ void ivas_dirac_dec_compute_directional_responses( else if ( hDirAC->panningConf == DIRAC_PANNING_VBAP ) /*VBAP*/ { /* Synthesize the first direction */ -#ifdef JBM_TSM_ON_TCS spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); -#else - spreadCoherencePanningVbap( azimuth[k], elevation[k], hDirAC->spreadCoherence[hDirAC->dirac_read_idx][k], direct_response_ls, num_channels_dir, hVBAPdata ); -#endif normalizePanningGains( direct_response_ls, num_channels_dir ); /* Synthesize the second direction and combine the gains */ if ( hDirAC->numSimultaneousDirections == 2 ) { -#ifdef JBM_TSM_ON_TCS spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[md_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); -#else - spreadCoherencePanningVbap( azimuth2[k], elevation2[k], hDirAC->spreadCoherence2[hDirAC->dirac_read_idx][k], direct_response_dir2, num_channels_dir, hVBAPdata ); -#endif normalizePanningGains( direct_response_dir2, num_channels_dir ); /* Combine gains from the two directions */ -#ifdef JBM_TSM_ON_TCS totalDirect = hDirAC->energy_ratio1[md_idx][k] + hDirAC->energy_ratio2[md_idx][k] + EPSILON; directRatio[0] = hDirAC->energy_ratio1[md_idx][k] / totalDirect; directRatio[1] = hDirAC->energy_ratio2[md_idx][k] / totalDirect; -#else - totalDirect = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] + hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] + EPSILON; - directRatio[0] = hDirAC->energy_ratio1[hDirAC->dirac_read_idx][k] / totalDirect; - directRatio[1] = hDirAC->energy_ratio2[hDirAC->dirac_read_idx][k] / totalDirect; -#endif for ( l = 0; l < num_channels_dir; l++ ) { direct_response_ls[l] *= directRatio[0]; diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 6faa3a3a49..d89f33e075 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -63,11 +63,9 @@ static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); ivas_error ivas_dec_setup( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : number of samples flushed from the previous frame (JBM) */ int16_t *data /* o : flushed PCM samples */ -#endif ) { int16_t k, idx, num_bits_read; @@ -117,17 +115,10 @@ ivas_error ivas_dec_setup( st_ivas->nchan_ism = nchan_ism; -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) { return error; } -#else - if ( ( error = ivas_ism_dec_config( st_ivas, st_ivas->ism_mode ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } else if ( st_ivas->ivas_format == SBA_FORMAT ) { @@ -201,11 +192,7 @@ ivas_error ivas_dec_setup( num_bits_read += MC_LS_SETUP_BITS; /* select MC format mode; reconfigure the MC format decoder */ -#ifdef JBM_TSM_ON_TCS ivas_mc_dec_config( st_ivas, idx, nSamplesRendered, data ); -#else - ivas_mc_dec_config( st_ivas, idx ); -#endif } /*-------------------------------------------------------------------* @@ -696,9 +683,7 @@ ivas_error ivas_init_decoder( #endif int16_t sce_id, cpe_id; int16_t numCldfbAnalyses, numCldfbSyntheses; -#ifdef JBM_TSM_ON_TCS int16_t granularity, n_channels_transport_jbm; -#endif int32_t output_Fs, ivas_total_brate; int32_t binauralization_delay_ns; AUDIO_CONFIG output_config; @@ -1323,7 +1308,6 @@ ivas_error ivas_init_decoder( } } -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); @@ -1334,7 +1318,6 @@ ivas_error ivas_init_decoder( return error; } } -#endif } else if ( st_ivas->renderer_type == RENDERER_MC ) { @@ -1368,7 +1351,6 @@ ivas_error ivas_init_decoder( st_ivas->binaural_latency_ns = st_ivas->hCrendWrapper->binaural_latency_ns; -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { granularity = NS2SA( st_ivas->hDecoderConfig->output_Fs, FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ); @@ -1379,7 +1361,6 @@ ivas_error ivas_init_decoder( return error; } } -#endif } if ( st_ivas->ivas_format == ISM_FORMAT && @@ -1475,7 +1456,6 @@ ivas_error ivas_init_decoder( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Failed to open limiter handle" ); } -#ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------* * Allocate and initialize JBM struct + buffer *-----------------------------------------------------------------*/ @@ -1499,7 +1479,6 @@ ivas_error ivas_init_decoder( return error; } } -#endif return error; } @@ -1722,9 +1701,7 @@ void ivas_initialize_handles_dec( st_ivas->hLsSetupCustom = NULL; st_ivas->hRenderConfig = NULL; -#ifdef JBM_TSM_ON_TCS st_ivas->hTcBuffer = NULL; -#endif return; } @@ -1803,9 +1780,7 @@ void ivas_destroy_dec( /* ISM renderer handle */ if ( st_ivas->hIsmRendererData != NULL ) { -#ifdef JBM_TSM_ON_TCS free( st_ivas->hIsmRendererData->interpolator ); -#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -1919,9 +1894,7 @@ void ivas_destroy_dec( st_ivas->hDecoderConfig = NULL; } -#ifdef JBM_TSM_ON_TCS ivas_jbm_dec_tc_buffer_close( &st_ivas->hTcBuffer ); -#endif /* main IVAS handle */ free( st_ivas ); diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index fe98ca0dcb..2974e9d137 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -32,9 +32,7 @@ #include #include "options.h" -#ifdef JBM_TSM_ON_TCS #include "prot.h" -#endif #include "ivas_prot.h" #include "ivas_prot_rend.h" #ifdef DEBUGGING @@ -52,18 +50,15 @@ static ivas_error ivas_ism_bitrate_switching( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nchan_transport_old, /* i : last number of transport channels */ const ISM_MODE last_ism_mode /* i : last ISM mode */ -#ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : number of samples rendered */ int16_t *data /* o : rendered samples */ -#endif ) { ivas_error error; int32_t element_brate_tmp[MAX_NUM_OBJECTS]; int16_t nSCE_old, nCPE_old; int16_t numCldfbAnalyses_old, numCldfbSyntheses_old, ism_mode; -#ifdef JBM_TSM_ON_TCS TC_BUFFER_MODE tc_buffer_mode_new; int16_t tc_nchan_tc_new; int16_t tc_nchan_allocate_new; @@ -71,7 +66,6 @@ static ivas_error ivas_ism_bitrate_switching( AUDIO_CONFIG intern_config_old; IVAS_OUTPUT_SETUP hIntSetupOld; RENDERER_TYPE renderer_type_old; -#endif error = IVAS_ERR_OK; @@ -109,13 +103,11 @@ static ivas_error ivas_ism_bitrate_switching( return error; } -#ifdef JBM_TSM_ON_TCS /* save old IntSetup, might be needed for JBM flushing...*/ intern_config_old = st_ivas->intern_config; hIntSetupOld = st_ivas->hIntSetup; tc_granularity_new = 1; renderer_type_old = st_ivas->renderer_type; -#endif /*-----------------------------------------------------------------* * Initialize the needed renderer struct and destroy the unnecessary renderer struct @@ -129,7 +121,6 @@ static ivas_error ivas_ism_bitrate_switching( ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->hDecoderConfig->output_config ); } -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { /* transfer subframe info from DirAC or ParamMC to central tc buffer */ @@ -162,7 +153,6 @@ static ivas_error ivas_ism_bitrate_switching( } } } -#endif if ( st_ivas->ism_mode != last_ism_mode ) { @@ -206,9 +196,7 @@ static ivas_error ivas_ism_bitrate_switching( /* close the ISM renderer and reinitialize */ if ( st_ivas->hIsmRendererData != NULL ) { -#ifdef JBM_TSM_ON_TCS free( st_ivas->hIsmRendererData->interpolator ); -#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -292,9 +280,7 @@ static ivas_error ivas_ism_bitrate_switching( /* Close the ISM renderer */ if ( st_ivas->hIsmRendererData != NULL ) { -#ifdef JBM_TSM_ON_TCS free( st_ivas->hIsmRendererData->interpolator ); -#endif free( st_ivas->hIsmRendererData ); st_ivas->hIsmRendererData = NULL; } @@ -327,7 +313,6 @@ static ivas_error ivas_ism_bitrate_switching( return error; } -#ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------* * Reconfigure TC buffer *-----------------------------------------------------------------*/ @@ -375,7 +360,6 @@ static ivas_error ivas_ism_bitrate_switching( mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } } -#endif return error; } @@ -392,11 +376,9 @@ ivas_error ivas_ism_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ , const ISM_MODE last_ism_mode /* i/o: last ISM mode */ -#ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ int16_t *data -#endif ) { int32_t ivas_total_brate; @@ -437,11 +419,7 @@ ivas_error ivas_ism_dec_config( { if ( ( st_ivas->ism_mode != last_ism_mode ) || ( st_ivas->hDecoderConfig->ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -464,11 +442,7 @@ ivas_error ivas_ism_dec_config( /* ISM mode switching */ if ( st_ivas->ism_mode != last_ism_mode ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode, nSamplesRendered, data ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_bitrate_switching( st_ivas, nchan_transport_old, last_ism_mode ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_ism_dtx_dec.c b/lib_dec/ivas_ism_dtx_dec.c index 054603a15e..1c48050bee 100644 --- a/lib_dec/ivas_ism_dtx_dec.c +++ b/lib_dec/ivas_ism_dtx_dec.c @@ -95,11 +95,7 @@ ivas_error ivas_ism_dtx_dec( st_ivas->ism_mode = ism_mode_bstr; } -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode, NULL, NULL ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_ism_dec_config( st_ivas, last_ism_mode ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 086e8a36a8..3a9d7f625c 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -158,7 +158,6 @@ static void ivas_ism_get_proto_matrix( } -#ifdef JBM_TSM_ON_TCS static void ivas_param_ism_collect_slot( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ float *Cldfb_RealBuffer_in, @@ -286,129 +285,8 @@ static void ivas_param_ism_compute_mixing_matrix( return; } -#else -static void ivas_param_ism_compute_mixing_matrix( - const int16_t nchan_ism, /* i : number of ISM channels */ - DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ - ISM_DTX_DATA_DEC hISMDTX, /* i : ISM DTX handle */ - float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], - float direct_response[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN], - const int16_t nchan_transport, - const int16_t nchan_out_woLFE, - const int16_t slot_idx_start, - const int16_t slot_idx_stop, - float mixing_matrix[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX] ) -{ - int16_t slot_idx, band_idx, ch, bin_idx; - int16_t i, w, obj_indx; - float tmp, ref_power; - int16_t brange[2]; - float cx_diag[PARAM_ISM_MAX_DMX]; - float direct_power[MAX_NUM_OBJECTS]; - float cy_diag[PARAM_ISM_MAX_CHAN]; - float cy_diag_tmp[MAX_NUM_OBJECTS][PARAM_ISM_MAX_CHAN]; - float *dir_res_ptr; - float *proto_matrix; - float response_matrix[PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS]; - int16_t num_wave; - - proto_matrix = hDirAC->hParamIsmRendering->proto_matrix; - - assert( ( nchan_ism == 3 ) || ( nchan_ism == 4 ) ); - assert( nchan_transport == 2 ); - - if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) - { - num_wave = nchan_ism; - } - else - { - num_wave = MAX_PARAM_ISM_WAVE; - } - - set_zero( response_matrix, PARAM_ISM_MAX_CHAN * MAX_NUM_OBJECTS ); - - /* loop over parameter bands to compute the mixing matrix */ - for ( band_idx = 0; band_idx < hDirAC->hParamIsm->nbands; band_idx++ ) - { - brange[0] = hDirAC->hParamIsm->band_grouping[band_idx]; - brange[1] = hDirAC->hParamIsm->band_grouping[band_idx + 1]; - - /* Compute covaraince matrix from direct response*/ - for ( w = 0; w < num_wave; w++ ) - { - set_zero( cy_diag_tmp[w], nchan_out_woLFE ); - if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) - { - dir_res_ptr = direct_response[w]; - } - else - { - obj_indx = hDirAC->hParamIsm->obj_indices[band_idx][0][w]; - dir_res_ptr = direct_response[obj_indx]; - } - mvr2r( dir_res_ptr, response_matrix + w * nchan_out_woLFE, nchan_out_woLFE ); - /* we only need the diagonal of Cy*/ - matrix_product_diag( dir_res_ptr, nchan_out_woLFE, 1, 0, dir_res_ptr, 1, nchan_out_woLFE, 0, cy_diag_tmp[w] ); - } - for ( bin_idx = brange[0]; bin_idx < brange[1]; bin_idx++ ) - { - /* compute input matrix for covariance rendering */ - set_f( cx_diag, 0.0f, nchan_transport ); - for ( ch = 0; ch < nchan_transport; ch++ ) - { - tmp = 0.0f; - for ( slot_idx = slot_idx_start; slot_idx < slot_idx_stop; slot_idx++ ) - { - tmp += ( Cldfb_RealBuffer_in[ch][slot_idx][bin_idx] * Cldfb_RealBuffer_in[ch][slot_idx][bin_idx] ); - tmp += ( Cldfb_ImagBuffer_in[ch][slot_idx][bin_idx] * Cldfb_ImagBuffer_in[ch][slot_idx][bin_idx] ); - } - - cx_diag[ch] = tmp; - } - - ref_power = 0.0f; - for ( slot_idx = slot_idx_start; slot_idx < slot_idx_stop; slot_idx++ ) - { - ref_power += ( Cldfb_RealBuffer_in[0][slot_idx][bin_idx] * Cldfb_RealBuffer_in[0][slot_idx][bin_idx] ) + ( Cldfb_ImagBuffer_in[0][slot_idx][bin_idx] * Cldfb_ImagBuffer_in[0][slot_idx][bin_idx] ); - ref_power += ( Cldfb_RealBuffer_in[1][slot_idx][bin_idx] * Cldfb_RealBuffer_in[1][slot_idx][bin_idx] ) + ( Cldfb_ImagBuffer_in[1][slot_idx][bin_idx] * Cldfb_ImagBuffer_in[1][slot_idx][bin_idx] ); - } - set_zero( cy_diag, nchan_out_woLFE ); - for ( w = 0; w < num_wave; w++ ) - { - if ( hDirAC->hParamIsm->flag_noisy_speech || hISMDTX.dtx_flag ) - { - direct_power[w] = ( 1.0f / nchan_ism ) * ref_power; - } - else - { - direct_power[w] = hDirAC->power_ratios[band_idx][0][w] * ref_power; - } - - if ( direct_power[w] != 0.f ) - { - for ( i = 0; i < nchan_out_woLFE; i++ ) - { - cy_diag[i] += direct_power[w] * cy_diag_tmp[w][i]; - } - } - direct_power[w] = sqrtf( direct_power[w] ); - } - /* Compute mixing matrix */ - computeMixingMatricesISM( nchan_transport, num_wave, nchan_out_woLFE, response_matrix, direct_power, cx_diag, cy_diag, proto_matrix, 1, - PARAM_MC_REG_SX, PARAM_MC_REG_GHAT, mixing_matrix[bin_idx] ); - } - } - - return; -} -#endif - - -#ifdef JBM_TSM_ON_TCS static void ivas_param_ism_render_slot( DIRAC_DEC_HANDLE hDirAC, float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX], @@ -444,7 +322,6 @@ static void ivas_param_ism_render_slot( return; } -#endif static void ivas_param_ism_rendering( @@ -603,7 +480,6 @@ ivas_error ivas_param_ism_dec_open( *-----------------------------------------------------------------*/ hDirAC->slot_size = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX ); -#ifdef JBM_TSM_ON_TCS hDirAC->hConfig = NULL; set_s( hDirAC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hDirAC->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); @@ -611,11 +487,6 @@ ivas_error ivas_param_ism_dec_open( hDirAC->subframes_rendered = 0; hDirAC->slots_rendered = 0; hDirAC->num_slots = DEFAULT_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME; -#else - hDirAC->subframe_nbslots = (int16_t) ( CLDFB_NO_COL_MAX * 5.f / 20.f + 0.5f ); - hDirAC->nb_subframes = CLDFB_NO_COL_MAX / hDirAC->subframe_nbslots; - assert( hDirAC->nb_subframes <= MAX_PARAM_SPATIAL_SUBFRAMES ); -#endif hDirAC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hDirAC->hParamIsm->nbands = MAX_PARAM_ISM_NBANDS; @@ -647,7 +518,6 @@ ivas_error ivas_param_ism_dec_open( if ( !( output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) { /* Initialize Param ISM Rendering handle */ -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, MAX_JBM_CLDFB_TIMESLOTS, output_config ) ) != IVAS_ERR_OK ) @@ -657,14 +527,11 @@ ivas_error ivas_param_ism_dec_open( } else { -#endif if ( ( error = ivas_param_ism_rendering_init( hDirAC->hParamIsmRendering, hOutSetup, st_ivas->nchan_transport, CLDFB_NO_COL_MAX, output_config ) ) != IVAS_ERR_OK ) { return error; } -#ifdef JBM_TSM_ON_TCS } -#endif } if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) @@ -680,20 +547,13 @@ ivas_error ivas_param_ism_dec_open( set_zero( hDirAC->azimuth_values, MAX_NUM_OBJECTS ); set_zero( hDirAC->elevation_values, MAX_NUM_OBJECTS ); -#ifdef JBM_TSM_ON_TCS hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; -#else - hDirAC->dirac_md_buffer_length = 0; -#endif hDirAC->dirac_bs_md_write_idx = 0; hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { -#ifndef JBM_TSM_ON_TCS - hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; -#endif if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) { return error; @@ -709,7 +569,6 @@ ivas_error ivas_param_ism_dec_open( st_ivas->hDirAC = hDirAC; -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { if ( st_ivas->renderer_type != RENDERER_MONO_DOWNMIX && st_ivas->renderer_type != RENDERER_DISABLE ) @@ -763,7 +622,6 @@ ivas_error ivas_param_ism_dec_open( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc = NULL; hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; } -#endif pop_wmops(); return error; @@ -818,7 +676,6 @@ void ivas_param_ism_dec_close( } } -#ifdef JBM_TSM_ON_TCS if ( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc != NULL ) { free( hDirAC->hParamIsmRendering->Cldfb_RealBuffer_tc ); @@ -829,7 +686,6 @@ void ivas_param_ism_dec_close( free( hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc ); hDirAC->hParamIsmRendering->Cldfb_ImagBuffer_tc = NULL; } -#endif if ( hDirAC->hParamIsmRendering != NULL ) { @@ -858,10 +714,8 @@ void ivas_param_ism_dec( int16_t ch, nchan_transport, nchan_out, nchan_out_woLFE, i; int16_t subframe_idx, slot_idx, index_slot, bin_idx; int32_t ivas_total_brate; -#ifdef JBM_TSM_ON_TCS float ref_power[CLDFB_NO_CHANNELS_MAX]; float cx_diag[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_DMX]; -#endif /* CLDFB Input Buffers */ float Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float Cldfb_ImagBuffer_in[PARAM_ISM_MAX_DMX][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; @@ -903,14 +757,12 @@ void ivas_param_ism_dec( push_wmops( "ivas_param_ism_dec" ); -#ifdef JBM_TSM_ON_TCS /* set buffers to zero */ for ( bin_idx = 0; bin_idx < CLDFB_NO_CHANNELS_MAX; bin_idx++ ) { set_zero( cx_diag[bin_idx], PARAM_ISM_MAX_DMX ); } set_zero( ref_power, CLDFB_NO_CHANNELS_MAX ); -#endif /* Frame-level Processing */ /* De-quantization */ @@ -977,9 +829,7 @@ void ivas_param_ism_dec( { cldfbAnalysis_ts( &( output_f[ch][hDirAC->num_freq_bands * slot_idx] ), Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], hDirAC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); -#ifdef JBM_TSM_ON_TCS ivas_param_ism_collect_slot( hDirAC, Cldfb_RealBuffer_in[ch][slot_idx], Cldfb_ImagBuffer_in[ch][slot_idx], ch, ref_power, cx_diag ); -#endif } } @@ -990,41 +840,25 @@ void ivas_param_ism_dec( } /* Compute mixing matrix */ -#ifdef JBM_TSM_ON_TCS ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, direct_response, nchan_transport, nchan_out_woLFE, cx_diag, ref_power, mixing_matrix ); -#else - ivas_param_ism_compute_mixing_matrix( st_ivas->nchan_ism, hDirAC, st_ivas->hISMDTX, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, direct_response, nchan_transport, nchan_out_woLFE, 0, CLDFB_NO_COL_MAX, mixing_matrix ); -#endif /* subframe loop for synthesis*/ for ( subframe_idx = 0; subframe_idx < hDirAC->nb_subframes; subframe_idx++ ) { -#ifdef JBM_TSM_ON_TCS uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots[subframe_idx]; -#else - uint16_t slot_idx_start = subframe_idx * hDirAC->subframe_nbslots; -#endif uint16_t idx_in; uint16_t idx_lfe; /* Set some memories to zero */ for ( ch = 0; ch < nchan_out_woLFE; ch++ ) { -#ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) -#else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) -#endif { set_f( Cldfb_RealBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); set_f( Cldfb_ImagBuffer[ch][slot_idx], 0.0f, hDirAC->num_freq_bands ); } } -#ifdef JBM_TSM_ON_TCS for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) -#else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots; slot_idx++ ) -#endif { index_slot = slot_idx_start + slot_idx; @@ -1042,11 +876,7 @@ void ivas_param_ism_dec( { if ( ( hSetup.num_lfe > 0 ) && ( hSetup.index_lfe[idx_lfe] == ch ) ) { -#ifdef JBM_TSM_ON_TCS set_zero( &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots[subframe_idx] * hDirAC->num_freq_bands ); -#else - set_zero( &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->subframe_nbslots * hDirAC->num_freq_bands ); -#endif if ( idx_lfe < ( hSetup.num_lfe - 1 ) ) { idx_lfe++; @@ -1058,23 +888,14 @@ void ivas_param_ism_dec( float *ImagBuffer[16]; /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < hDirAC->subframe_nbslots[subframe_idx]; i++ ) -#else - for ( i = 0; i < hDirAC->subframe_nbslots; i++ ) -#endif { RealBuffer[i] = Cldfb_RealBuffer[idx_in][i]; ImagBuffer[i] = Cldfb_ImagBuffer[idx_in][i]; } -#ifdef JBM_TSM_ON_TCS cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), hDirAC->num_freq_bands * hDirAC->subframe_nbslots[subframe_idx], st_ivas->cldfbSynDec[ch] ); -#else - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hDirAC->num_freq_bands] ), - hDirAC->num_freq_bands * hDirAC->subframe_nbslots, st_ivas->cldfbSynDec[ch] ); -#endif idx_in++; } @@ -1105,7 +926,6 @@ void ivas_param_ism_dec( return; } -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------------* * ivas_ism_dec_digest_tc() @@ -1534,7 +1354,6 @@ void ivas_param_ism_dec_render( return; } -#endif /*-------------------------------------------------------------------------* diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 031c6cf18f..32f0393c0e 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -58,9 +58,7 @@ ivas_error ivas_ism_renderer_open( { int16_t i; uint16_t interpolator_length; -#ifdef JBM_TSM_ON_TCS uint16_t init_interpolator_length; -#endif ivas_error error; error = IVAS_ERR_OK; @@ -81,12 +79,9 @@ ivas_error ivas_ism_renderer_open( for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { set_f( st_ivas->hIsmRendererData->prev_gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); -#ifdef JBM_TSM_ON_TCS set_f( st_ivas->hIsmRendererData->gains[i], 0.0f, MAX_OUTPUT_CHANNELS ); -#endif } -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { init_interpolator_length = NS2SA( st_ivas->hDecoderConfig->output_Fs, MAX_JBM_CLDFB_TIMESLOTS * CLDFB_SLOT_NS ); @@ -102,13 +97,6 @@ ivas_error ivas_ism_renderer_open( { st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); } -#else - interpolator_length = (uint16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); - for ( i = 0; i < interpolator_length; i++ ) - { - st_ivas->hIsmRendererData->interpolator[i] = (float) i / ( (float) interpolator_length - 1 ); - } -#endif return error; } @@ -122,11 +110,7 @@ ivas_error ivas_ism_renderer_open( void ivas_ism_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: core-coder transport channels/object output */ -#else - float output_f[][L_FRAME48k], /* i/o: core-coder transport channels/object output */ -#endif const int16_t output_frame /* i : output frame length per channel */ ) { @@ -229,7 +213,6 @@ void ivas_ism_render( return; } -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------------* * ivas_ism_render_sf() * @@ -320,7 +303,6 @@ void ivas_ism_render_sf( return; } -#endif /*-------------------------------------------------------------------------* diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 04ae490414..dc54aa9734 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -46,7 +46,6 @@ #include "wmc_auto.h" -#ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------------* * Local function prototypes @@ -1864,4 +1863,3 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( return buffer_mode; } -#endif diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index d284d3f7d9..a33c48b85b 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -405,7 +405,6 @@ ivas_error ivas_masa_dec_open( st_ivas->hMasa = hMasa; -#ifdef JBM_TSM_ON_TCS /* allocate transport channels*/ if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC && st_ivas->renderer_type != RENDERER_BINAURAL_PARAMETRIC_ROOM && st_ivas->renderer_type != RENDERER_STEREO_PARAMETRIC ) { @@ -424,7 +423,6 @@ ivas_error ivas_masa_dec_open( return error; } } -#endif /* JBM_TMS_ON_TCS*/ return error; } @@ -1118,7 +1116,6 @@ ivas_error ivas_masa_dec_reconfigure( ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &tmp, &tmp, &tmp ); -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active == 1 ) { int16_t tc_nchan_to_allocate; @@ -1142,14 +1139,11 @@ ivas_error ivas_masa_dec_reconfigure( } } } -#endif return error; } -#ifdef JBM_TSM_ON_TCS -#endif void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ @@ -1174,11 +1168,9 @@ void ivas_spar_param_to_masa_param_mapping( float foaCovarianceMtx[FOA_CHANNELS][FOA_CHANNELS]; float Iy, Iz, Ix, E, azi, ele, I, ratio; float diffuseGainX, diffuseGainY, diffuseGainZ, diffuseGainSum; -#ifdef JBM_TSM_ON_TCS int16_t slot_idx, slot_idx_start, sf; SPAR_DEC_HANDLE hSpar; float slot_fac; -#endif /* Set values */ hDirAC = st_ivas->hDirAC; @@ -1186,12 +1178,8 @@ void ivas_spar_param_to_masa_param_mapping( hDiffuseDist = st_ivas->hDirAC->hDiffuseDist; nchan_transport = st_ivas->nchan_transport; band_grouping = hDirAC->band_grouping; -#ifdef JBM_TSM_ON_TCS hSpar = st_ivas->hSpar; dirac_write_idx = hDirAC->render_to_md_map[subframe]; -#else - dirac_write_idx = hDirAC->dirac_read_idx; /* Mixing matrices, from which MASA meta is determined, already have the delay compensation */ -#endif /* Init arrays */ for ( i = 0; i < FOA_CHANNELS; i++ ) @@ -1200,61 +1188,41 @@ void ivas_spar_param_to_masa_param_mapping( } /* Delay the SPAR mixing matrices to have them synced with the audio */ -#ifdef JBM_TSM_ON_TCS slot_idx_start = hSpar->slots_rendered; slot_fac = 1.0f / (float) hSpar->subframe_nbslots[subframe]; for ( slot_idx = 0; slot_idx < hSpar->subframe_nbslots[subframe]; slot_idx++ ) { sf = hSpar->render_to_md_map[slot_idx + slot_idx_start] / JBM_CLDFB_SLOTS_IN_SUBFRAME; -#endif if ( subframe < SPAR_META_DELAY_SUBFRAMES ) { -#ifdef JBM_TSM_ON_TCS mixer_mat_index = sf + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; -#else - mixer_mat_index = subframe + MAX_PARAM_SPATIAL_SUBFRAMES - SPAR_META_DELAY_SUBFRAMES + 1; -#endif for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) { for ( i = 0; i < FOA_CHANNELS; i++ ) { for ( j = 0; j < FOA_CHANNELS; j++ ) { -#ifdef JBM_TSM_ON_TCS mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; -#else - mixer_mat_sf_bands_real[band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat_prev[mixer_mat_index][i][j][band]; -#endif } } } } else { -#ifdef JBM_TSM_ON_TCS mixer_mat_index = sf - SPAR_META_DELAY_SUBFRAMES; -#else - mixer_mat_index = subframe - SPAR_META_DELAY_SUBFRAMES; -#endif for ( band = 0; band < SPAR_DIRAC_SPLIT_START_BAND; band++ ) { for ( i = 0; i < FOA_CHANNELS; i++ ) { for ( j = 0; j < FOA_CHANNELS; j++ ) { -#ifdef JBM_TSM_ON_TCS mixer_mat_sf_bands_real[band][i][j] = slot_fac * st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; -#else - mixer_mat_sf_bands_real[band][i][j] = st_ivas->hSpar->hMdDec->mixer_mat[i][j][band + mixer_mat_index * IVAS_MAX_NUM_BANDS]; -#endif } } } } -#ifdef JBM_TSM_ON_TCS } -#endif /* Map the mixing matrices from the frequency bands to frequency bins */ bin = 0; @@ -1283,11 +1251,7 @@ void ivas_spar_param_to_masa_param_mapping( set_zero( transportSignalEnergies[1], nBins ); set_zero( transportSignalCrossCorrelation, nBins ); -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) -#else - for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) -#endif { for ( bin = 0; bin < nBins; bin++ ) { @@ -1305,15 +1269,9 @@ void ivas_spar_param_to_masa_param_mapping( if ( hDiffuseDist != NULL ) { -#ifdef JBM_TSM_ON_TCS set_zero( hDiffuseDist->diffuseRatioX, CLDFB_NO_CHANNELS_MAX ); set_zero( hDiffuseDist->diffuseRatioY, CLDFB_NO_CHANNELS_MAX ); set_zero( hDiffuseDist->diffuseRatioZ, CLDFB_NO_CHANNELS_MAX ); -#else - set_zero( hDiffuseDist->diffuseRatioX[subframe], CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioY[subframe], CLDFB_NO_CHANNELS_MAX ); - set_zero( hDiffuseDist->diffuseRatioZ[subframe], CLDFB_NO_CHANNELS_MAX ); -#endif } for ( bin = 0; bin < nBins; bin++ ) @@ -1385,7 +1343,6 @@ void ivas_spar_param_to_masa_param_mapping( diffuseGainSum = diffuseGainY + diffuseGainX + diffuseGainZ; -#ifdef JBM_TSM_ON_TCS if ( diffuseGainSum == 0.0f ) { hDiffuseDist->diffuseRatioX[bin] = 1.0f / 3.0f; @@ -1398,20 +1355,6 @@ void ivas_spar_param_to_masa_param_mapping( hDiffuseDist->diffuseRatioY[bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); hDiffuseDist->diffuseRatioZ[bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); } -#else - if ( diffuseGainSum == 0.0f ) - { - hDiffuseDist->diffuseRatioX[subframe][bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioY[subframe][bin] = 1.0f / 3.0f; - hDiffuseDist->diffuseRatioZ[subframe][bin] = 1.0f / 3.0f; - } - else - { - hDiffuseDist->diffuseRatioX[subframe][bin] = diffuseGainX / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioY[subframe][bin] = diffuseGainY / ( diffuseGainSum + EPSILON ); - hDiffuseDist->diffuseRatioZ[subframe][bin] = diffuseGainZ / ( diffuseGainSum + EPSILON ); - } -#endif } } diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 4be35d188e..32c332ec53 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -76,11 +76,7 @@ typedef struct parameter_band_mapping_struct static void ivas_param_mc_dec_init( PARAM_MC_DEC_HANDLE hParamMC, const int16_t nchan_in, const int16_t nchan_out ); -#ifdef JBM_TSM_ON_TCS static void param_mc_protoSignalComputation( float *RealBuffer, float *ImagBuffer, float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t num_freq_bands ); -#else -static void param_mc_protoSignalComputation( float RealBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], float ImagBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], float *proto_frame_f, const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, const int16_t slot_index, const int16_t num_freq_bands ); -#endif static void ivas_param_mc_dec_copy_diffuse_proto( PARAM_MC_DEC_HANDLE hParamMC, float Cldfb_buffer_real[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Cldfb_buffer_imag[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nY, const int16_t slot_idx ); @@ -90,21 +86,11 @@ static int16_t ivas_param_mc_uniform_decoder( float *seq, const int16_t sz_seq, static void ivas_param_mc_dequantize_cov( PARAM_MC_DEC_HANDLE hDirAC, float *ild_q, float *icc_q, const int16_t param_band_index, const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nY, const int16_t nX, float *Cx_state, float *Cproto, float *Cy_state ); -#ifdef JBM_TSM_ON_TCS static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float *mixing_matrix[], float *mixing_matrix_res[], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); -#else -static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const int16_t nY_int, const PARAM_MC_SYNTHESIS_CONF synth_conf, const int16_t nX, const int16_t nY ); - -static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const int16_t nY_intern, const int16_t nX, const int16_t nY_cov ); -#endif -#ifdef JBM_TSM_ON_TCS static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float *mixing_matrix[], float *mixing_matrix_res[], const uint16_t nX, const uint16_t nY ); -#else -static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], const uint16_t nX, const uint16_t nY ); -#endif static void ivas_param_mc_dec_compute_interpolator( const uint16_t bAttackPresent, const uint16_t attackPos, const uint16_t interp_length, float *interpolator ); @@ -238,13 +224,9 @@ ivas_error ivas_param_mc_dec_open( *-----------------------------------------------------------------*/ hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; -#ifdef JBM_TSM_ON_TCS set_s( hParamMC->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hParamMC->subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); hParamMC->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; -#else - hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC; -#endif hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -440,9 +422,7 @@ ivas_error ivas_param_mc_dec_open( return error; } -#ifdef JBM_TSM_ON_TCS ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); -#endif /* Head rotation */ if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && st_ivas->hDecoderConfig->Opt_Headrotation ) @@ -478,7 +458,6 @@ ivas_error ivas_param_mc_dec_open( ivas_param_mc_dec_init( hParamMC, nchan_transport, nchan_out_cov ); -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active && hParamMC->synthesis_conf != PARAM_MC_SYNTH_MONO_STEREO ) { if ( ( hParamMC->Cldfb_RealBuffer_tc = (float *) malloc( MAX_JBM_CLDFB_TIMESLOTS * nchan_transport * hParamMC->num_freq_bands * sizeof( float ) ) ) == NULL ) @@ -509,7 +488,6 @@ ivas_error ivas_param_mc_dec_open( hParamMC->subframes_rendered = 0; hParamMC->slots_rendered = 0; -#endif st_ivas->hParamMC = hParamMC; @@ -657,10 +635,6 @@ ivas_error ivas_param_mc_dec_reconfig( * set input parameters *-----------------------------------------------------------------*/ -#ifndef JBM_TSM_ON_TCS - hParamMC->slot_size = (int16_t) ( output_Fs / FRAMES_PER_SEC ) / CLDFB_NO_COL_MAX; - hParamMC->subframe_nbslots = CLDFB_NO_COL_MAX / PARAM_MC_NSUBFRAMES_DEC; -#endif hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -971,9 +945,7 @@ ivas_error ivas_param_mc_dec_reconfig( return error; } -#ifdef JBM_TSM_ON_TCS ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); -#endif ivas_dirac_dec_output_synthesis_cov_init( &( hParamMC->h_output_synthesis_cov_state ), nchan_transport, nchan_out_cov, hParamMC->hMetadataPMC->num_parameter_bands, max_param_band_residual ); @@ -1185,7 +1157,6 @@ void ivas_param_mc_dec_close( hParamMC->hoa_encoder = NULL; } -#ifdef JBM_TSM_ON_TCS if ( hParamMC->Cldfb_RealBuffer_tc != NULL ) { free( hParamMC->Cldfb_RealBuffer_tc ); @@ -1196,7 +1167,6 @@ void ivas_param_mc_dec_close( free( hParamMC->Cldfb_ImagBuffer_tc ); hParamMC->Cldfb_ImagBuffer_tc = NULL; } -#endif free( *hParamMC_out ); *hParamMC_out = NULL; @@ -1315,9 +1285,6 @@ void ivas_param_mc_dec_read_BS( num_lfe_bands = 0; } -#ifndef JBM_TSM_ON_TCS - ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); -#endif if ( hMetadataPMC->flag_use_adaptive_icc_map == 1 ) { @@ -1404,9 +1371,6 @@ void ivas_param_mc_dec_read_BS( /* for PLC, use the saved ILDs and ICCs from the past and set the transient flag and transient position to zero */ hMetadataPMC->bAttackPresent = 0; hMetadataPMC->attackIndex = 0; -#ifndef JBM_TSM_ON_TCS - ivas_param_mc_dec_compute_interpolator( hMetadataPMC->bAttackPresent, hMetadataPMC->attackIndex, PARAM_MC_MAX_NSLOTS, hParamMC->h_output_synthesis_params.interpolator ); -#endif } pop_wmops(); @@ -1415,7 +1379,6 @@ void ivas_param_mc_dec_read_BS( } -#ifdef JBM_TSM_ON_TCS /*------------------------------------------------------------------------- * ivas_param_mc_dec_digest_tc() * @@ -1845,7 +1808,6 @@ void ivas_param_mc_dec_render( return; } -#endif /*------------------------------------------------------------------------- @@ -1854,7 +1816,6 @@ void ivas_param_mc_dec_render( * Parametric MC decoding process *------------------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS void ivas_param_mc_dec( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ @@ -1888,330 +1849,6 @@ void ivas_param_mc_dec( pop_wmops(); return; } -#else -void ivas_param_mc_dec( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float output_f[][L_FRAME48k] /* i/o: synthesized core-coder transport channels/DirAC output */ -) -{ - PARAM_MC_DEC_HANDLE hParamMC; - int16_t i, ch; - int16_t subframe_idx; - int16_t nb_subframes; - int16_t slot_idx, param_band_idx, slot_idx_start; - int16_t nchan_transport, nchan_out_transport, nchan_out_cldfb; - int16_t nchan_out_cov; - /*CLDFB*/ - float Cldfb_RealBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_in[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer[MAX_INTERN_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_RealBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float Cldfb_ImagBuffer_Binaural[BINAURAL_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS]; - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS]; - float real_part, imag_part; - /*Decorrelator*/ - float onset_filter[MAX_CICP_CHANNELS * CLDFB_NO_CHANNELS_MAX]; - /* format converter */ - int16_t channel_active[MAX_OUTPUT_CHANNELS]; - uint16_t nband_synth, nbands_to_zero; - uint16_t nchan_out_init; - IVAS_OUTPUT_SETUP *hSynthesisOutputSetup; - - hParamMC = st_ivas->hParamMC; - assert( hParamMC ); - - push_wmops( "param_mc_dec" ); - - set_s( channel_active, 0, MAX_CICP_CHANNELS ); - nchan_transport = st_ivas->nchan_transport; - nchan_out_transport = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; - nchan_out_init = nchan_out_transport; - - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - nchan_out_cldfb = BINAURAL_CHANNELS; - set_s( channel_active, 1, nchan_out_cldfb ); - if ( st_ivas->hHeadTrackData ) - { - nchan_out_init = MAX_INTERN_CHANNELS; - } - nchan_out_cov = st_ivas->hTransSetup.nchan_out_woLFE + st_ivas->hTransSetup.num_lfe; - hSynthesisOutputSetup = &st_ivas->hTransSetup; - } - else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) - { - nchan_out_cov = nchan_out_transport; - nchan_out_cldfb = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - hSynthesisOutputSetup = &st_ivas->hTransSetup; - } - else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) - { - nchan_out_cov = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - nchan_out_cldfb = nchan_out_cov; - set_s( channel_active, 1, nchan_out_cov ); - hSynthesisOutputSetup = &st_ivas->hOutSetup; - } - else - { - nchan_out_cov = nchan_out_transport; - nchan_out_cldfb = nchan_out_transport; - set_s( channel_active, 1, nchan_out_cov ); - hSynthesisOutputSetup = &st_ivas->hTransSetup; - } - - /* set everything to zero that will not be decoded */ - nband_synth = hParamMC->band_grouping[hParamMC->num_param_bands_synth]; - nbands_to_zero = hParamMC->num_freq_bands - nband_synth; - for ( ch = 0; ch < nchan_out_init; ch++ ) - { - for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots; slot_idx++ ) - { - set_zero( &( Cldfb_RealBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); - set_zero( &( Cldfb_ImagBuffer[ch][slot_idx][nband_synth] ), nbands_to_zero ); - } - } - - for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ ) - { - set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); - set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS ); - } - - /* slot loop for gathering the input data */ - for ( slot_idx = 0; slot_idx < CLDFB_NO_COL_MAX; slot_idx++ ) - { - float RealBuffer[CLDFB_NO_CHANNELS_MAX]; - float ImagBuffer[CLDFB_NO_CHANNELS_MAX]; - - /* CLDFB Analysis*/ - for ( ch = 0; ch < nchan_transport; ch++ ) - { - cldfbAnalysis_ts( &( output_f[ch][hParamMC->num_freq_bands * slot_idx] ), RealBuffer, ImagBuffer, hParamMC->num_freq_bands, st_ivas->cldfbAnaDec[ch] ); - - mvr2r( RealBuffer, Cldfb_RealBuffer_in[ch][slot_idx], hParamMC->num_freq_bands ); - mvr2r( ImagBuffer, Cldfb_ImagBuffer_in[ch][slot_idx], hParamMC->num_freq_bands ); - } - - if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex ) - { - ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, cx, cx_imag, hParamMC, nchan_transport, slot_idx ); - } - } - - /* map from complex input covariance to real values */ - for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ ) - { - /* Cx for transport channels */ - for ( i = 0; i < nchan_transport * nchan_transport; i++ ) - { - real_part = cx[param_band_idx][i]; - imag_part = cx_imag[param_band_idx][i]; - - /* (a-ib)(c+id) = ac + bd + i(ad-bc) */ - if ( param_band_idx < hParamMC->max_param_band_abs_cov ) - { - cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part ); - } - else - { - cx[param_band_idx][i] = real_part; - } - } - } - - /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/ - if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) ) - { - for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 ) - { - v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport ); - mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport ); - } - } - - - if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) - { - ivas_param_mc_get_mono_stereo_mixing_matrices( hParamMC, cx, mixing_matrix, mixing_matrix_res, nchan_out_transport, nchan_transport, nchan_out_cov ); - } - else - { - /* generate mixing matrices */ - ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, mixing_matrix, mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov ); - } - - /*** split here... ***/ - - /* subframe loop for synthesis*/ - nb_subframes = CLDFB_NO_COL_MAX / hParamMC->subframe_nbslots; - for ( subframe_idx = 0; subframe_idx < nb_subframes; subframe_idx++ ) - { - slot_idx_start = subframe_idx * hParamMC->subframe_nbslots; - for ( slot_idx = 0; slot_idx < hParamMC->subframe_nbslots; slot_idx++ ) - { - - if ( hParamMC->max_band_decorr > 0 ) - { - /*-----------------------------------------------------------------* - * protoype signal computation - *-----------------------------------------------------------------*/ - - param_mc_protoSignalComputation( Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, - hParamMC->proto_frame_f, hParamMC->diff_proto_info, - slot_idx + slot_idx_start, hParamMC->num_freq_bands ); - - /*-----------------------------------------------------------------* - * frequency domain decorrelation - *-----------------------------------------------------------------*/ - - /* decorrelate prototype frame */ - ivas_dirac_dec_decorr_process( hParamMC->num_freq_bands, - hParamMC->num_outputs_diff, - hParamMC->diff_proto_info->num_protos_diff, - DIRAC_SYNTHESIS_COV_MC_LS, - nchan_transport, - hParamMC->proto_frame_f, - hParamMC->diff_proto_info->num_protos_diff, - hParamMC->diff_proto_info->proto_index_diff, - hParamMC->proto_frame_dec_f, - onset_filter, - hParamMC->h_freq_domain_decorr_ap_params, - hParamMC->h_freq_domain_decorr_ap_state ); - - /* copy decorrelated frame directly to output CLDFB buffer, acts also as intermediate */ - /* memory for the decorrelated signal */ - ivas_param_mc_dec_copy_diffuse_proto( hParamMC, Cldfb_RealBuffer, Cldfb_ImagBuffer, nchan_out_cov, slot_idx ); - } - - /*-----------------------------------------------------------------* - * output synthesis - *-----------------------------------------------------------------*/ - - ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Cldfb_RealBuffer, Cldfb_ImagBuffer, - mixing_matrix, mixing_matrix_res, slot_idx, slot_idx + slot_idx_start, - nchan_transport, nchan_out_cov, hParamMC ); - - if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) - { - if ( st_ivas->hHeadTrackData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) - { - ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); - } - else - { - /* remove LFE */ - uint16_t idx_out; - uint16_t idx_lfe; - IVAS_OUTPUT_SETUP hLsSetup; - - hLsSetup = st_ivas->hTransSetup; - - /* If LFE should be rendered, add it to other channels before removing */ - if ( st_ivas->hBinRenderer->render_lfe ) - { - for ( idx_lfe = 0; idx_lfe < hLsSetup.num_lfe; idx_lfe++ ) - { - /* Copy just the first band of LFE*/ - v_multc( Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); - v_multc( Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], ( GAIN_LFE / hLsSetup.nchan_out_woLFE ), Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], 1 ); - - for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) - { - if ( hLsSetup.index_lfe[idx_lfe] != ch ) - { - v_add( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_RealBuffer[ch][slot_idx], 1 ); - v_add( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[hLsSetup.index_lfe[idx_lfe]][slot_idx], Cldfb_ImagBuffer[ch][slot_idx], 1 ); - } - } - } - } - - idx_out = 0; - idx_lfe = 0; - - for ( ch = 0; ch < ( hLsSetup.nchan_out_woLFE + hLsSetup.num_lfe ); ch++ ) - { - if ( ( hLsSetup.num_lfe > 0 ) && ( hLsSetup.index_lfe[idx_lfe] == ch ) ) - { - if ( idx_lfe < ( hLsSetup.num_lfe - 1 ) ) - { - idx_lfe++; - } - } - else if ( ch != idx_out ) - { - mvr2r( Cldfb_RealBuffer[ch][slot_idx], Cldfb_RealBuffer[idx_out][slot_idx], nband_synth ); - mvr2r( Cldfb_ImagBuffer[ch][slot_idx], Cldfb_ImagBuffer[idx_out][slot_idx], nband_synth ); - idx_out++; - } - else - { - idx_out++; - } - } - } - } - } - - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); - } - else if ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_CLDFB ) - { - /* format conversion*/ - ivas_lssetupconversion_process_param_mc( st_ivas, Cldfb_RealBuffer, Cldfb_ImagBuffer, channel_active ); - } - - /* CLDFB synthesis */ - for ( ch = 0; ch < nchan_out_cldfb; ch++ ) - { - float *RealBuffer[16]; - float *ImagBuffer[16]; - - if ( channel_active[ch] ) - { - /* open CLDFB buffer up to CLDFB_NO_CHANNELS_MAX bands for 48kHz */ - for ( i = 0; i < hParamMC->subframe_nbslots; i++ ) - { - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) - { - RealBuffer[i] = Cldfb_RealBuffer_Binaural[ch][i]; - ImagBuffer[i] = Cldfb_ImagBuffer_Binaural[ch][i]; - } - else - { - RealBuffer[i] = Cldfb_RealBuffer[ch][i]; - ImagBuffer[i] = Cldfb_ImagBuffer[ch][i]; - } - } - cldfbSynthesis( RealBuffer, ImagBuffer, &( output_f[ch][slot_idx_start * hParamMC->num_freq_bands] ), - hParamMC->num_freq_bands * hParamMC->subframe_nbslots, st_ivas->cldfbSynDec[ch] ); - } - else - { - set_f( &( output_f[ch][slot_idx_start * hParamMC->num_freq_bands] ), 0.0f, hParamMC->num_freq_bands * hParamMC->subframe_nbslots ); - } - } - } - - if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) - { - ivas_mc2sba( st_ivas->hIntSetup, output_f, hParamMC->num_freq_bands * PARAM_MC_MAX_NSLOTS, st_ivas->hOutSetup.ambisonics_order, 0.f ); - } - - /* update */ - hParamMC->hMetadataPMC->last_coded_bwidth = hParamMC->hMetadataPMC->coded_bwidth; - param_mc_update_mixing_matrices( hParamMC, mixing_matrix, mixing_matrix_res, nchan_transport, nchan_out_cov ); - pop_wmops(); - - return; -} -#endif /*------------------------------------------------------------------------- @@ -2286,18 +1923,10 @@ static void ivas_param_mc_dec_init( *------------------------------------------------------------------------*/ static void param_mc_protoSignalComputation( -#ifdef JBM_TSM_ON_TCS float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */ float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */ -#else - float RealBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (real part) */ - float ImagBuffer[PARAM_MC_MAX_TRANSPORT_CHANS][PARAM_MC_MAX_NSLOTS][CLDFB_NO_CHANNELS_MAX], /* i : CLDFB samples of the transport channels (imaginary part) */ -#endif float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ -#ifndef JBM_TSM_ON_TCS - const int16_t slot_index, /* i : current slot index */ -#endif const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ ) { @@ -2319,13 +1948,8 @@ static void param_mc_protoSignalComputation( int16_t source_ch_idx = diff_proto_info->source_chan_idx[proto_ch_idx][source_ch_cnt]; p_proto_frame = &proto_frame_f[proto_ch_idx * num_freq_bands * 2]; -#ifdef JBM_TSM_ON_TCS p_real_buffer = &RealBuffer[source_ch_idx * num_freq_bands]; p_imag_buffer = &ImagBuffer[source_ch_idx * num_freq_bands]; -#else - p_real_buffer = &RealBuffer[source_ch_idx][slot_index][0]; - p_imag_buffer = &ImagBuffer[source_ch_idx][slot_index][0]; -#endif for ( band = 0; band < num_freq_bands; band++ ) { @@ -2504,11 +2128,7 @@ static void ivas_param_mc_dec_compute_interpolator( float *interpolator /* o : interpolator */ ) { -#ifdef JBM_TSM_ON_TCS int16_t idx; -#else - uint16_t idx; -#endif if ( bAttackPresent ) { @@ -2523,14 +2143,7 @@ static void ivas_param_mc_dec_compute_interpolator( } else { -#ifdef JBM_TSM_ON_TCS ivas_jbm_dec_get_adapted_linear_interpolator( DEFAULT_JBM_CLDFB_TIMESLOTS, interp_length, interpolator ); -#else - for ( idx = 1; idx <= interp_length; ++idx ) - { - interpolator[idx - 1] = (float) idx / (float) interp_length; - } -#endif } return; @@ -2590,13 +2203,8 @@ static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ -#ifdef JBM_TSM_ON_TCS float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ -#else - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrices for all parameter bands */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrices for all parameter bands */ -#endif const int16_t nY_intern, /* i : number of channels in the transported format */ const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ const int16_t nX, /* i : number of transport channels */ @@ -2849,13 +2457,8 @@ static void ivas_param_mc_get_mixing_matrices( static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : transport channel covariance for all parameter bands */ -#ifdef JBM_TSM_ON_TCS float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ -#else - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : direct mixing matrix */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* o : residual mixing matrix (set to zero) */ -#endif const int16_t nY_intern, /* i : number of channels of the transport format */ const int16_t nX, /* i : number of transport channels */ const int16_t nY_cov ) /* i : number of output channels */ @@ -2974,13 +2577,8 @@ static void ivas_param_mc_get_mono_stereo_mixing_matrices( static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */ -#ifdef JBM_TSM_ON_TCS float *mixing_matrix[], /* i : direct mixing matrices for the frame just processed */ float *mixing_matrix_res[], /* i : residual mixing matrices for the frame just processed */ -#else - float mixing_matrix[PARAM_MC_MAX_PARAMETER_BANDS][MAX_CICP_CHANNELS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : direct mixing matrices for the frame just processed */ - float mixing_matrix_res[PARAM_MC_MAX_PARAMETER_BANDS_RES][MAX_CICP_CHANNELS * MAX_CICP_CHANNELS], /* i : residual mixing matrices for the frame just processed */ -#endif const uint16_t nX, /* i : number of transport channels */ const uint16_t nY ) /* i : number of synthesis channels */ { diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 46c4343800..a3a03f9ead 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -54,11 +54,7 @@ * Local function prototypes *-----------------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas, uint16_t *nSamplesRendered, int16_t *data ); -#else -static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas ); -#endif /*--------------------------------------------------------------------------* * ivas_mct_dec() @@ -625,11 +621,9 @@ void ivas_mct_dec_close( ivas_error ivas_mc_dec_config( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t idx /* i : LS config. index */ -#ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : samples flushed from last frame (JBM) */ int16_t *data /* o : flushed samples (JBM) */ -#endif ) { AUDIO_CONFIG signaled_config; @@ -659,11 +653,7 @@ ivas_error ivas_mc_dec_config( { if ( st_ivas->hDecoderConfig->last_ivas_total_brate != st_ivas->hDecoderConfig->ivas_total_brate || st_ivas->transport_config != signaled_config || last_mc_mode != st_ivas->mc_mode ) { -#ifdef JBM_TSM_ON_TCS ivas_mc_dec_reconfig( st_ivas, nSamplesRendered, data ); -#else - ivas_mc_dec_reconfig( st_ivas ); -#endif } } @@ -682,11 +672,9 @@ ivas_error ivas_mc_dec_config( static ivas_error ivas_mc_dec_reconfig( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS , uint16_t *nSamplesRendered, /* o : number of samples flushed from the last frame (JBM) */ int16_t *data /* o : flushed samples (JBM) */ -#endif ) { int16_t nchan_transport_old, nSCE_old, nCPE_old, sba_dirac_stereo_flag_old, nchan_hp20_old; @@ -696,14 +684,12 @@ static ivas_error ivas_mc_dec_reconfig( Decoder_State *st; ivas_error error; MC_MODE mc_mode, last_mc_mode; -#ifdef JBM_TSM_ON_TCS TC_BUFFER_MODE tc_buffer_mode_new; int16_t tc_nchan_tc_new; int16_t tc_nchan_allocate_new; int16_t tc_granularity_new; AUDIO_CONFIG intern_config_old; IVAS_OUTPUT_SETUP hIntSetupOld; -#endif error = IVAS_ERR_OK; @@ -734,12 +720,10 @@ static ivas_error ivas_mc_dec_reconfig( } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#ifdef JBM_TSM_ON_TCS /* save old IntSetup, might be needed for JBM flushing...*/ intern_config_old = st_ivas->intern_config; hIntSetupOld = st_ivas->hIntSetup; tc_granularity_new = 1; -#endif /* renderer might have changed, reselect */ renderer_type_old = st_ivas->renderer_type; @@ -749,7 +733,6 @@ static ivas_error ivas_mc_dec_reconfig( /* side effect of the renderer selection can be a changed internal config */ ivas_output_init( &( st_ivas->hIntSetup ), st_ivas->intern_config ); -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDecoderConfig->voip_active ) { /* transfer subframe info from DirAC or ParamMC to central tc buffer */ @@ -788,7 +771,6 @@ static ivas_error ivas_mc_dec_reconfig( } } } -#endif if ( st_ivas->mc_mode == MC_MODE_MCT ) @@ -817,13 +799,11 @@ static ivas_error ivas_mc_dec_reconfig( ivas_masa_dec_close( &( st_ivas->hMasa ) ); ivas_qmetadata_close( &st_ivas->hQMetaData ); -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDirAC != NULL ) { ivas_dirac_dec_close( &st_ivas->hDirAC ); vbap_free_data( &( st_ivas->hVBAPdata ) ); } -#endif /* init LS conversion if the renderer type asks for it */ if ( st_ivas->renderer_type == RENDERER_MC && st_ivas->hLsSetUpConversion == NULL ) @@ -902,14 +882,12 @@ static ivas_error ivas_mc_dec_reconfig( ivas_masa_dec_close( &( st_ivas->hMasa ) ); ivas_qmetadata_close( &st_ivas->hQMetaData ); -#ifdef JBM_TSM_ON_TCS if ( st_ivas->hDirAC != NULL ) { ivas_dirac_dec_close( &st_ivas->hDirAC ); vbap_free_data( &( st_ivas->hVBAPdata ) ); } -#endif if ( last_mc_mode == MC_MODE_MCT ) { @@ -1140,9 +1118,7 @@ static ivas_error ivas_mc_dec_reconfig( { ivas_dirac_dec_close( &( st_ivas->hDirAC ) ); -#ifdef JBM_TSM_ON_TCS vbap_free_data( &( st_ivas->hVBAPdata ) ); -#endif } } @@ -1290,7 +1266,6 @@ static ivas_error ivas_mc_dec_reconfig( return error; } -#ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------* * Reconfigure TC buffer *-----------------------------------------------------------------*/ @@ -1344,7 +1319,6 @@ static ivas_error ivas_mc_dec_reconfig( mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hParamMC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } } -#endif return error; } diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index c023c14f79..363fedaca2 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -67,11 +67,7 @@ ivas_error ivas_td_binaural_open( ivas_error ivas_td_binaural_renderer( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ -#else - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ -#endif const int16_t output_frame /* i : output frame length */ ) { @@ -94,7 +90,6 @@ ivas_error ivas_td_binaural_renderer( } -#ifdef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * ivas_td_binaural_renderer_sf() * @@ -223,4 +218,3 @@ ivas_error ivas_td_binaural_renderer_sf( return IVAS_ERR_OK; } -#endif diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index 7d14ee5041..ae113204aa 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -498,12 +498,8 @@ void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ const int16_t input_chans, /* i : number of input channels to the renderer */ const int16_t output_frame, /* i : frame length */ -#ifdef JBM_TSM_ON_TCS float *input[], /* i : LS input/output synthesis signal */ float *output[] /* i/o: LS input/output synthesis signal */ -#else - float output[][L_FRAME48k] /* i/o: LS input/output synthesis signal */ -#endif ) { int16_t chInIdx, chOutIdx, idx; @@ -530,22 +526,14 @@ void ivas_ls_setup_conversion( { for ( idx = 0; idx < output_frame; idx++ ) { -#ifdef JBM_TSM_ON_TCS output_tmp[chOutIdx][idx] += input[chInIdx][idx]; -#else - output_tmp[chOutIdx][idx] += output[chInIdx][idx]; -#endif } } else { for ( idx = 0; idx < output_frame; idx++ ) { -#ifdef JBM_TSM_ON_TCS tmpVal = dmxCoeff * input[chInIdx][idx]; -#else - tmpVal = dmxCoeff * output[chInIdx][idx]; -#endif output_tmp[chOutIdx][idx] += tmpVal; } } @@ -1144,9 +1132,7 @@ void ivas_ls_setup_conversion_process_mdct_param_mc( void ivas_lssetupconversion_process_param_mc( Decoder_Struct *st_ivas, /* i/o: LS setup conversion renderer handle */ -#ifdef JBM_TSM_ON_TCS const int16_t num_timeslots, -#endif float Cldfb_RealBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ float Cldfb_ImagBuffer_InOut[MAX_CICP_CHANNELS][PARAM_MC_MAX_NSLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i/o: LS signals */ int16_t channel_active[MAX_CICP_CHANNELS] /* i : bitmap indicating which output channels are active */ @@ -1174,11 +1160,7 @@ void ivas_lssetupconversion_process_param_mc( set_s( channel_active, 0, outChannels ); /* Loop over each time slots and compute dmx for each time slot */ -#ifdef JBM_TSM_ON_TCS for ( slotIdx = 0; slotIdx < num_timeslots; slotIdx++ ) -#else - for ( slotIdx = 0; slotIdx < st_ivas->hParamMC->subframe_nbslots; slotIdx++ ) -#endif { /* copy buffers */ for ( chInIdx = 0; chInIdx < inChannels; chInIdx++ ) diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 478749ddc0..bddabbc822 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -139,7 +139,6 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); -#ifdef JBM_TSM_ON_TCS /* save old */ if ( st_ivas->hDirAC == NULL && st_ivas->hSpar != NULL ) { @@ -157,7 +156,6 @@ ivas_error ivas_sba_dec_reconfigure( st_ivas->hTcBuffer->subframes_rendered = st_ivas->hDirAC->subframes_rendered; mvs2s( st_ivas->hDirAC->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); } -#endif /*-----------------------------------------------------------------* * Allocate, initialize, and configure SBA handles @@ -200,14 +198,12 @@ ivas_error ivas_sba_dec_reconfigure( hSpar = st_ivas->hSpar; st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#ifdef JBM_TSM_ON_TCS /* synchronize subframe info */ st_ivas->hSpar->num_slots = st_ivas->hTcBuffer->num_slots; st_ivas->hSpar->nb_subframes = st_ivas->hTcBuffer->nb_subframes; st_ivas->hSpar->slots_rendered = st_ivas->hTcBuffer->slots_rendered; st_ivas->hSpar->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hSpar->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); -#endif if ( st_ivas->nchan_transport == 1 ) { @@ -288,14 +284,12 @@ ivas_error ivas_sba_dec_reconfigure( return error; } -#ifdef JBM_TSM_ON_TCS /* synchronize subframe info */ st_ivas->hDirAC->num_slots = st_ivas->hTcBuffer->num_slots; st_ivas->hDirAC->nb_subframes = st_ivas->hTcBuffer->nb_subframes; st_ivas->hDirAC->slots_rendered = st_ivas->hTcBuffer->slots_rendered; st_ivas->hDirAC->subframes_rendered = st_ivas->hTcBuffer->subframes_rendered; mvs2s( st_ivas->hTcBuffer->subframe_nbslots, st_ivas->hDirAC->subframe_nbslots, MAX_JBM_SUBFRAMES_5MS ); -#endif } if ( ( error = ivas_dirac_sba_config( @@ -372,7 +366,6 @@ ivas_error ivas_sba_dec_reconfigure( return error; } -#ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------* * JBM TC buffer *-----------------------------------------------------------------*/ @@ -421,12 +414,10 @@ ivas_error ivas_sba_dec_reconfigure( } } } -#endif return error; } -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* * ivas_sba_dec_digest_tc() * @@ -597,4 +588,3 @@ void ivas_sba_dec_render( return; } -#endif diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index dd4af01ccf..b683262a6e 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -65,9 +65,7 @@ void ivas_sba2mc_cldfb( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ const int16_t nb_channels_out, /* i : nb of output channels */ const int16_t nb_bands, /* i : nb of CLDFB bands to process */ -#ifdef JBM_TSM_ON_TCS const int16_t nb_timeslots, /* i : number of time slots to process */ -#endif const float *hoa_dec_mtx /* i : HOA decoding mtx */ ) { @@ -93,11 +91,7 @@ void ivas_sba2mc_cldfb( p_realOut = realOut[n]; p_imagOut = imagOut[n]; -#ifdef JBM_TSM_ON_TCS for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) -#else - for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) -#endif { p_real = RealBuffer[m][iBlock]; p_imag = ImagBuffer[m][iBlock]; @@ -117,11 +111,7 @@ void ivas_sba2mc_cldfb( p_realOut = realOut[n]; p_imagOut = imagOut[n]; -#ifdef JBM_TSM_ON_TCS for ( iBlock = 0; iBlock < nb_timeslots; iBlock++ ) -#else - for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) -#endif { p_real = RealBuffer[n][iBlock]; p_imag = ImagBuffer[n][iBlock]; @@ -147,12 +137,8 @@ void ivas_sba2mc_cldfb( void ivas_mc2sba( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ -#ifdef JBM_TSM_ON_TCS float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ float *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ -#else - float buffer_td[][L_FRAME48k], /* i/o: MC signals (on input) and the HOA3 (on output) */ -#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ @@ -186,11 +172,7 @@ void ivas_mc2sba( /* Add LFE to omni W with gain*/ for ( k = 0; k < output_frame; k++ ) { -#ifdef JBM_TSM_ON_TCS buffer_tmp[0][k] += gain_lfe * in_buffer_td[i][k]; -#else - buffer_tmp[0][k] += gain_lfe * buffer_td[i][k]; -#endif } } @@ -216,11 +198,7 @@ void ivas_mc2sba( { for ( k = 0; k < output_frame; k++ ) { -#ifdef JBM_TSM_ON_TCS buffer_tmp[j][k] += gains[j] * in_buffer_td[i][k]; -#else - buffer_tmp[j][k] += gains[j] * buffer_td[i][k]; -#endif } } } @@ -312,11 +290,7 @@ int16_t ivas_sba_remapTCs( *-------------------------------------------------------------------------*/ void ivas_ism2sba( -#ifdef JBM_TSM_ON_TCS float *buffer_td[], /* i/o: TD signal buffers */ -#else - float buffer_td[][L_FRAME48k], /* i/o: TD signal buffers */ -#endif ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ const int16_t nchan_ism, /* i : number of objects */ @@ -372,7 +346,6 @@ void ivas_ism2sba( return; } -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------------* * ivas_ism2sba() * @@ -424,7 +397,6 @@ void ivas_ism2sba_sf( return; } -#endif /*-------------------------------------------------------------------* * ivas_sba_upmixer_renderer() @@ -439,35 +411,18 @@ void ivas_sba_upmixer_renderer( ) { int16_t nchan_internal; -#ifndef JBM_TSM_ON_TCS - int16_t i; - float temp; -#endif push_wmops( "ivas_sba_upmixer_renderer" ); nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); -#ifndef JBM_TSM_ON_TCS - if ( st_ivas->nchan_transport >= 3 ) - { - /*convert WYZX downmix to WYXZ*/ - for ( i = 0; i < output_frame; i++ ) - { - temp = output[2][i]; - output[2][i] = output[3][i]; - output[3][i] = temp; - } - } -#endif /* Upmixer + Renderer */ ivas_spar_dec_upmixer( st_ivas, output, nchan_internal, output_frame ); if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { -#ifdef JBM_TSM_ON_TCS float *output_f[MAX_OUTPUT_CHANNELS]; int16_t ch; @@ -477,9 +432,6 @@ void ivas_sba_upmixer_renderer( } ivas_sba_linear_renderer( output_f, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); -#else - ivas_sba_linear_renderer( output, output_frame, st_ivas->hIntSetup.nchan_out_woLFE, st_ivas->hDecoderConfig->output_config, st_ivas->hOutSetup, st_ivas->hoa_dec_mtx ); -#endif } pop_wmops(); @@ -494,11 +446,7 @@ void ivas_sba_upmixer_renderer( *-------------------------------------------------------------------*/ static void ivas_sba_mtx_mult( -#ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: synthesized core-corder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k], /* i/o: synthesized core-corder transport channels/DirAC output */ -#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : Number of ambisonic channels */ const IVAS_OUTPUT_SETUP output_setup, /* i : Output configuration */ @@ -558,11 +506,7 @@ static void ivas_sba_mtx_mult( *-------------------------------------------------------------------*/ ivas_error ivas_sba_linear_renderer( -#ifdef JBM_TSM_ON_TCS float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ -#else - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ -#endif const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : number of input ambisonics channels */ const AUDIO_CONFIG output_config, /* i : output audio configuration */ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index f3fd5ed04c..a03018e58d 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -209,7 +209,6 @@ ivas_error ivas_spar_dec_open( ivas_output_init( &( st_ivas->hTransSetup ), st_ivas->transport_config ); -#ifdef JBM_TSM_ON_TCS set_s( hSpar->subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); set_s( hSpar->subframe_nbslots, JBM_CLDFB_SLOTS_IN_SUBFRAME, DEFAULT_JBM_SUBFRAMES_5MS ); hSpar->nb_subframes = DEFAULT_JBM_SUBFRAMES_5MS; @@ -252,7 +251,6 @@ ivas_error ivas_spar_dec_open( return error; } } -#endif st_ivas->hSpar = hSpar; @@ -1098,7 +1096,6 @@ static void ivas_spar_calc_smooth_facs( } -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* * ivas_spar_dec_agc_pca() * @@ -1422,10 +1419,8 @@ void ivas_spar_dec_upmixer( return; } -#endif -#ifdef JBM_TSM_ON_TCS /*-------------------------------------------------------------------* * ivas_spar_dec_upmixer_sf() * @@ -1437,15 +1432,6 @@ void ivas_spar_dec_upmixer_sf( float *output[], /* o : output audio channels */ const int16_t nchan_internal /* i : number of internal channels */ ) -#else -void ivas_spar_dec_upmixer( - - Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ - float output[][L_FRAME48k], /* i/o: input/output audio channels */ - const int16_t nchan_internal, /* i : number of internal channels */ - const int16_t output_frame /* i : output frame length */ -) -#endif { int16_t cldfb_band, num_cldfb_bands, numch_in, numch_out; float *cldfb_in_ts_re[MAX_OUTPUT_CHANNELS][CLDFB_NO_COL_MAX]; @@ -1453,37 +1439,21 @@ void ivas_spar_dec_upmixer( int16_t i, b, ts, out_ch, in_ch; int16_t num_spar_bands, spar_band, nchan_transport; int16_t num_in_ingest, split_band; -#ifdef JBM_TSM_ON_TCS int16_t slot_size, slot_idx_start; float *p_tc[MAX_OUTPUT_CHANNELS]; int16_t md_idx; -#endif float Pcm_tmp[MAX_OUTPUT_CHANNELS][L_FRAME48k]; int16_t numch_out_dirac; -#ifndef JBM_TSM_ON_TCS - float *pPcm_tmp[MAX_OUTPUT_CHANNELS]; - int16_t num_bands_out; -#endif float mixer_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH][IVAS_MAX_NUM_BANDS]; int16_t b_skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH]; DECODER_CONFIG_HANDLE hDecoderConfig; SPAR_DEC_HANDLE hSpar; int16_t num_md_sub_frames; -#ifndef JBM_TSM_ON_TCS - int16_t md_sf_idx; -#endif -#ifdef JBM_TSM_ON_TCS push_wmops( "ivas_spar_dec_upmixer_sf" ); -#else - push_wmops( "ivas_spar_dec_upmixer" ); -#endif hSpar = st_ivas->hSpar; hDecoderConfig = st_ivas->hDecoderConfig; -#ifndef JBM_TSM_ON_TCS - num_bands_out = hSpar->hFbMixer->pFb->filterbank_num_bands; -#endif nchan_transport = hSpar->hMdDec->spar_md_cfg.nchan_transport; num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; @@ -1492,14 +1462,12 @@ void ivas_spar_dec_upmixer( num_md_sub_frames = ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, hDecoderConfig->ivas_total_brate ); -#ifdef JBM_TSM_ON_TCS slot_size = NS2SA( st_ivas->hDecoderConfig->output_Fs, CLDFB_SLOT_NS ); slot_idx_start = hSpar->slots_rendered; for ( i = 0; i < nchan_internal; i++ ) { p_tc[i] = st_ivas->hTcBuffer->tc[i] + slot_idx_start * slot_size; } -#endif #ifdef DEBUG_SPAR_BYPASS_EVS_CODEC /* by-pass core-coder */ @@ -1538,19 +1506,6 @@ void ivas_spar_dec_upmixer( } #endif -#ifndef JBM_TSM_ON_TCS - /*---------------------------------------------------------------------* - * AGC - *---------------------------------------------------------------------*/ - - ivas_agc_dec_process( hSpar->hAgcDec, output, output, nchan_transport, output_frame ); - - -#ifdef DEBUG_SBA_AUDIO_DUMP - /* Dump audio signal after ivas_agc_dec_process */ - ivas_spar_dump_signal_wav( output_frame, NULL, output, st_ivas->nchan_transport, spar_foa_dec_wav[1], "ivas_agc_dec_process()" ); -#endif -#endif /*---------------------------------------------------------------------* * TD Decorr and pcm ingest *---------------------------------------------------------------------*/ @@ -1564,12 +1519,6 @@ void ivas_spar_dec_upmixer( num_in_ingest = nchan_transport; } -#ifndef JBM_TSM_ON_TCS - for ( i = 0; i < nchan_internal; i++ ) - { - pPcm_tmp[i] = Pcm_tmp[i]; - } -#endif /*---------------------------------------------------------------------* * PCA decoder *---------------------------------------------------------------------*/ @@ -1577,46 +1526,7 @@ void ivas_spar_dec_upmixer( hSpar->pca_ingest_channels = num_in_ingest; #endif -#ifndef JBM_TSM_ON_TCS /* will already happen in the TC decoding */ - if ( hSpar->hPCA != NULL ) - { - ivas_pca_dec( hSpar->hPCA, output_frame, num_in_ingest, hDecoderConfig->ivas_total_brate, hDecoderConfig->last_ivas_total_brate, st_ivas->bfi, output ); -#ifdef DEBUG_SBA_AUDIO_DUMP - /* Dump audio signal after ivas_pca_dec */ - ivas_spar_dump_signal_wav( output_frame, NULL, output, num_in_ingest, spar_foa_dec_wav[2], "ivas_pca_dec()" ); -#endif - } -#endif - -#ifndef JBM_TSM_ON_TCS - /*---------------------------------------------------------------------* - * TD decorrelation - *---------------------------------------------------------------------*/ - - if ( hSpar->hMdDec->td_decorr_flag ) - { - ivas_td_decorr_process( hSpar->hTdDecorr, output, pPcm_tmp, output_frame ); - if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) - { - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); - } - } - else - { - for ( i = 0; i < nchan_internal - nchan_transport; i++ ) - { - set_zero( output[nchan_internal - 1 - i], output_frame ); - } - for ( i = 0; i < hSpar->hTdDecorr->num_apd_outputs; i++ ) - { - mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], output[nchan_internal - 1 - i], output_frame ); - } - } - } -#endif hSpar->hFbMixer->fb_cfg->num_in_chans = num_in_ingest; @@ -1649,14 +1559,6 @@ void ivas_spar_dec_upmixer( } } -#ifndef JBM_TSM_ON_TCS - /*---------------------------------------------------------------------* - * Gen umx mat - *---------------------------------------------------------------------*/ - - ivas_spar_dec_gen_umx_mat( hSpar->hMdDec, nchan_transport, num_bands_out, st_ivas->bfi, - num_md_sub_frames ); -#endif /*---------------------------------------------------------------------* * CLDFB Processing and Synthesis @@ -1673,32 +1575,16 @@ void ivas_spar_dec_upmixer( #ifdef DEBUG_SBA_AUDIO_DUMP /* Dump audio signal after ivas_agc_dec_process */ -#ifdef JBM_TSM_ON_TCS ivas_spar_dump_signal_wav( output_frame, p_tc, NULL, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" ); -#else - ivas_spar_dump_signal_wav( output_frame, NULL, output, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" ); -#endif #endif -#ifndef JBM_TSM_ON_TCS - for ( int16_t i_sf = 0; i_sf < MAX_PARAM_SPATIAL_SUBFRAMES; i_sf++ ) - { -#endif /* CLDFB analysis of incoming frame */ for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { -#ifdef JBM_TSM_ON_TCS for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) -#else - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) -#endif { cldfbAnalysis_ts( -#ifdef JBM_TSM_ON_TCS &p_tc[in_ch][ts * num_cldfb_bands], -#else - &output[in_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], -#endif cldfb_in_ts_re[in_ch][ts], cldfb_in_ts_im[in_ch][ts], num_cldfb_bands, @@ -1711,19 +1597,10 @@ void ivas_spar_dec_upmixer( ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf ); } -#ifdef JBM_TSM_ON_TCS for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) -#else - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) -#endif { -#ifdef JBM_TSM_ON_TCS md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); -#else - /* determine SPAR parameters for this time slots */ - ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES, numch_out, numch_in, num_spar_bands, mixer_mat ); -#endif if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) ) { for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) @@ -1784,7 +1661,6 @@ void ivas_spar_dec_upmixer( } } -#ifdef JBM_TSM_ON_TCS if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) { /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ @@ -1812,16 +1688,11 @@ void ivas_spar_dec_upmixer( hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); } } -#endif } if ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA && hDecoderConfig->output_config != AUDIO_CONFIG_STEREO && hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) { -#ifdef JBM_TSM_ON_TCS ivas_dirac_dec_render_sf( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); -#else - ivas_dirac_dec( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im, i_sf ); -#endif } if ( st_ivas->hDirAC != NULL ) @@ -1835,11 +1706,7 @@ void ivas_spar_dec_upmixer( { if ( ( st_ivas->hOutSetup.num_lfe > 0 ) && ( st_ivas->hOutSetup.index_lfe[idx_lfe] == ch ) ) { -#ifdef JBM_TSM_ON_TCS set_zero( output[ch], hSpar->subframe_nbslots[hSpar->subframes_rendered] * num_cldfb_bands ); -#else - set_zero( &( output[ch][i_sf * MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands] ), MAX_PARAM_SPATIAL_SUBFRAMES * num_cldfb_bands ); -#endif if ( idx_lfe < ( st_ivas->hDirAC->hOutSetup.num_lfe - 1 ) ) { idx_lfe++; @@ -1849,20 +1716,12 @@ void ivas_spar_dec_upmixer( { if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { -#ifdef JBM_TSM_ON_TCS for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) -#else - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) -#endif { cldfbSynthesis( &cldfb_in_ts_re[idx_in][ts], &cldfb_in_ts_im[idx_in][ts], -#ifdef JBM_TSM_ON_TCS &output[ch][ts * num_cldfb_bands], -#else - &output[ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], -#endif num_cldfb_bands, st_ivas->cldfbSynDec[idx_in] ); } @@ -1879,20 +1738,12 @@ void ivas_spar_dec_upmixer( /* CLDFB to time synthesis (overwrite mixer output) */ for ( out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) { -#ifdef JBM_TSM_ON_TCS for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) -#else - for ( ts = 0; ts < MAX_PARAM_SPATIAL_SUBFRAMES; ts++ ) -#endif { cldfbSynthesis( &cldfb_in_ts_re[out_ch][ts], &cldfb_in_ts_im[out_ch][ts], -#ifdef JBM_TSM_ON_TCS &output[out_ch][ts * num_cldfb_bands], -#else - &output[out_ch][( ts + i_sf * MAX_PARAM_SPATIAL_SUBFRAMES ) * num_cldfb_bands], -#endif num_cldfb_bands, st_ivas->cldfbSynDec[out_ch] ); } @@ -1907,38 +1758,9 @@ void ivas_spar_dec_upmixer( #endif -#ifndef JBM_TSM_ON_TCS - md_sf_idx = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; - split_band = SPAR_DIRAC_SPLIT_START_BAND; - if ( split_band < IVAS_MAX_NUM_BANDS ) - { - hSpar->i_subframe++; - hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - - for ( out_ch = 0; out_ch < numch_out; out_ch++ ) - { - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( b = 0; b < num_spar_bands; b++ ) - { - hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf_idx * IVAS_MAX_NUM_BANDS]; - } - } - } - } -#endif -#ifndef JBM_TSM_ON_TCS - } -#endif -#ifdef JBM_TSM_ON_TCS hSpar->slots_rendered += hSpar->subframe_nbslots[hSpar->subframes_rendered]; hSpar->subframes_rendered++; -#endif pop_wmops(); diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 86fcaa1faf..dc76babe9c 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -3032,11 +3032,7 @@ void ivas_spar_to_dirac( qmf_band_start = band_grouping[band]; qmf_band_end = band_grouping[band + 1]; -#ifdef JBM_TSM_ON_TCS for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) -#else - for ( block = 0; block < hDirAC->nb_subframes; block++ ) -#endif { int16_t ts_start, ts_end, ts; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index f92781d6d8..3a48913566 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -435,11 +435,9 @@ typedef struct param_ism_rendering float *proto_matrix; float *interpolator; float mixing_matrix_lin_old[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; -#ifdef JBM_TSM_ON_TCS float mixing_matrix_lin[CLDFB_NO_CHANNELS_MAX][PARAM_ISM_MAX_CHAN * PARAM_ISM_MAX_DMX]; float *Cldfb_RealBuffer_tc; float *Cldfb_ImagBuffer_tc; -#endif } PARAM_ISM_RENDERING_DATA, *PARAM_ISM_RENDERING_HANDLE; @@ -576,10 +574,8 @@ typedef struct dirac_output_synthesis_cov_state_structure float *cy_old[CLDFB_NO_CHANNELS_MAX]; float *mixing_matrix_old[CLDFB_NO_CHANNELS_MAX]; float *mixing_matrix_res_old[CLDFB_NO_CHANNELS_MAX]; -#ifdef JBM_TSM_ON_TCS float *mixing_matrix[CLDFB_NO_CHANNELS_MAX]; float *mixing_matrix_res[CLDFB_NO_CHANNELS_MAX]; -#endif } DIRAC_OUTPUT_SYNTHESIS_COV_STATE; @@ -620,15 +616,9 @@ typedef struct /* Diffuse sound directional distribution data structure */ typedef struct ivas_diffuse_distribution_data_structure { -#ifdef JBM_TSM_ON_TCS float diffuseRatioX[CLDFB_NO_CHANNELS_MAX]; float diffuseRatioY[CLDFB_NO_CHANNELS_MAX]; float diffuseRatioZ[CLDFB_NO_CHANNELS_MAX]; -#else - float diffuseRatioX[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float diffuseRatioY[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; - float diffuseRatioZ[MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; -#endif } DIFFUSE_DISTRIBUTION_DATA, *DIFFUSE_DISTRIBUTION_HANDLE; @@ -640,15 +630,11 @@ typedef struct ivas_dirac_dec_data_structure IVAS_OUTPUT_SETUP hOutSetup; int16_t slot_size; -#ifdef JBM_TSM_ON_TCS int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; int16_t subframes_rendered; int16_t slots_rendered; int16_t num_slots; int16_t render_to_md_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; -#else - int16_t subframe_nbslots; -#endif int16_t nb_subframes; int16_t num_freq_bands; @@ -759,7 +745,6 @@ typedef struct ivas_param_mc_dec_data_structure { int16_t slot_size; -#ifdef JBM_TSM_ON_TCS float *Cldfb_RealBuffer_tc; float *Cldfb_ImagBuffer_tc; int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; @@ -767,9 +752,6 @@ typedef struct ivas_param_mc_dec_data_structure int16_t subframes_rendered; int16_t slots_rendered; int16_t num_slots; -#else - int16_t subframe_nbslots; -#endif int16_t num_freq_bands; int16_t num_param_bands_synth; @@ -915,14 +897,12 @@ typedef struct ivas_spar_dec_lib_t int16_t numOutChannels; int16_t pca_ingest_channels; #endif -#ifdef JBM_TSM_ON_TCS int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; int16_t render_to_md_map[MAX_JBM_CLDFB_TIMESLOTS]; int16_t nb_subframes; int16_t subframes_rendered; int16_t slots_rendered; int16_t num_slots; -#endif } SPAR_DEC_DATA, *SPAR_DEC_HANDLE; @@ -1092,12 +1072,8 @@ typedef struct vbap_data_structure typedef struct renderer_struct { float prev_gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; -#ifdef JBM_TSM_ON_TCS float *interpolator; float gains[MAX_CICP_CHANNELS - 1][MAX_OUTPUT_CHANNELS]; -#else - float interpolator[L_FRAME48k]; -#endif } ISM_RENDERER_DATA, *ISM_RENDERER_HANDLE; @@ -1219,14 +1195,11 @@ typedef struct decoder_config_structure #ifdef DEBUGGING int16_t force_rend; /* forced TD/CLDFB binaural renderer (for ISM and MC) */ #endif -#ifdef JBM_TSM_ON_TCS int16_t voip_active; -#endif int16_t Opt_delay_comp; /* flag indicating delay compensation active */ } DECODER_CONFIG, *DECODER_CONFIG_HANDLE; -#ifdef JBM_TSM_ON_TCS typedef struct decoder_tc_buffer_structure { float *tc_buffer; /* the buffer itself */ @@ -1248,7 +1221,6 @@ typedef struct decoder_tc_buffer_structure int16_t n_samples_discard; /* number of samples to discard from the beginning of the output */ } DECODER_TC_BUFFER, *DECODER_TC_BUFFER_HANDLE; -#endif /*----------------------------------------------------------------------------------* @@ -1340,10 +1312,8 @@ typedef struct Decoder_Struct RENDER_CONFIG_DATA *hRenderConfig; /* Renderer config pointer */ int32_t binaural_latency_ns; /* Binauralization latency in ns */ -#ifdef JBM_TSM_ON_TCS /* JBM module */ DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM structure */ -#endif #ifdef DEBUGGING int32_t noClipping; /* number of clipped samples */ diff --git a/lib_dec/jbm_jb4sb.h b/lib_dec/jbm_jb4sb.h index 7954358595..00f5ccbb40 100644 --- a/lib_dec/jbm_jb4sb.h +++ b/lib_dec/jbm_jb4sb.h @@ -78,13 +78,11 @@ struct JB4_DATAUNIT int16_t nextCoderType; }; -#ifdef JBM_TSM_ON_TCS typedef enum { JBM_RENDERER_NONE, JBM_RENDERER_IVAS, } JBM_RENDERER_TYPE; -#endif typedef struct JB4_DATAUNIT *JB4_DATAUNIT_HANDLE; diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index 9742a01183..89d6cb3e59 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -66,12 +66,8 @@ struct apa_state_t { /* output buffer */ -#ifdef JBM_TSM_ON_TCS bool evs_compat_mode; float *buf_out; -#else - int16_t *buf_out; -#endif uint16_t buf_out_capacity; uint16_t l_buf_out; @@ -91,13 +87,11 @@ struct apa_state_t /* total number of processed input samples since apa_reset() */ uint32_t l_in_total; -#ifdef JBM_TSM_ON_TCS /* time resolution in samples of the IVAS renderer*/ uint16_t l_ts; /* samples already available in the renderer buffer */ uint16_t l_r_buf; -#endif /* sum of inserted/removed samples since last apa_set_scale() */ int32_t diffSinceSetScale; @@ -136,7 +130,6 @@ static float apa_corrEnergy2dB( float energy, uint16_t corr_len ); static float apa_getQualityIncreaseForLowEnergy( float energydB ); -#ifdef JBM_TSM_ON_TCS static bool logarithmic_search( const apa_state_t *ps, const float *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos ); static bool find_synch( apa_state_t *ps, const float *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos ); @@ -146,17 +139,6 @@ static bool copy_frm( apa_state_t *ps, const float frm_in[], float frm_out[], ui static bool shrink_frm( apa_state_t *ps, const float frm_in[], uint16_t maxScaling, float frm_out[], uint16_t *l_frm_out ); static bool extend_frm( apa_state_t *ps, const float frm_in[], float frm_out[], uint16_t *l_frm_out ); -#else -static bool logarithmic_search( const apa_state_t *ps, const int16_t *signal, int16_t s_start, uint16_t inlen, uint16_t offset, uint16_t fixed_pos, uint16_t corr_len, uint16_t wss, uint16_t css, int16_t *synchpos ); - -static bool find_synch( apa_state_t *ps, const int16_t *in, uint16_t l_in, int16_t s_start, uint16_t s_len, int16_t fixed_pos, uint16_t corr_len, uint16_t offset, float *energy, float *quality, int16_t *synch_pos ); - -static bool copy_frm( apa_state_t *ps, const int16_t frm_in[], int16_t frm_out[], uint16_t *l_frm_out ); - -static bool shrink_frm( apa_state_t *ps, const int16_t frm_in[], uint16_t maxScaling, int16_t frm_out[], uint16_t *l_frm_out ); - -static bool extend_frm( apa_state_t *ps, const int16_t frm_in[], int16_t frm_out[], uint16_t *l_frm_out ); -#endif /*---------------------------------------------------------------------* * Public functions @@ -188,9 +170,7 @@ ivas_error apa_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for JBM\n" ) ); } -#ifdef JBM_TSM_ON_TCS ps->evs_compat_mode = false; -#endif apa_reset( ps ); *pps = ps; @@ -224,14 +204,11 @@ void apa_reset( ps->bad_frame_count = 0; ps->good_frame_count = 0; -#ifdef JBM_TSM_ON_TCS ps->l_ts = 1; ps->l_r_buf = 0; -#endif return; } -#ifdef JBM_TSM_ON_TCS uint8_t apa_reconfigure( apa_state_t *ps, uint16_t num_channels, @@ -275,7 +252,6 @@ uint8_t apa_reconfigure( return 0; } -#endif /* Sets the audio configuration. */ bool apa_set_rate( @@ -379,7 +355,6 @@ bool apa_set_scale( return 0; } -#ifdef JBM_TSM_ON_TCS bool apa_set_renderer_granularity( apa_state_t *ps, uint16_t l_ts ) @@ -426,7 +401,6 @@ bool apa_set_evs_compat_mode( return 0; } -#endif /* ******************************************************************************** @@ -580,27 +554,15 @@ bool apa_exit( */ uint8_t apa_exec( apa_state_t *ps, /* i/o: state struct */ -#ifdef JBM_TSM_ON_TCS const float a_in[], /* i : input samples */ -#else - const int16_t a_in[], /* i : input samples */ -#endif uint16_t l_in, /* i : number of input samples */ uint16_t maxScaling, /* i : allowed number of inserted/removed samples */ -#ifdef JBM_TSM_ON_TCS float a_out[], /* o : output samples */ -#else - int16_t a_out[], /* o : output samples */ -#endif uint16_t *l_out /* o : number of output samples */ ) { uint16_t i; -#ifdef JBM_TSM_ON_TCS float frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ -#else - int16_t frm_in[APA_BUF]; /* TODO(mcjbm): this buffer could be smaller - always allocates space for 16 channels */ -#endif uint16_t l_frm_out; int16_t l_rem; int32_t dl_scaled, dl_copied, l_frm_out_target; @@ -662,13 +624,8 @@ uint8_t apa_exec( } else { -#ifdef JBM_TSM_ON_TCS float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] ); float *frm_in_ptr = &( frm_in[ps->l_frm] ); -#else - int16_t *buf_out_ptr = &( ps->buf_out[ps->l_buf_out - ps->l_frm] ); - int16_t *frm_in_ptr = &( frm_in[ps->l_frm] ); -#endif /* fill input frame */ /* 1st input frame: previous output samples */ @@ -723,13 +680,8 @@ uint8_t apa_exec( /* discard old samples; always keep at least most recent l_frm samples */ if ( ( ps->l_buf_out + l_frm_out ) > ps->buf_out_capacity ) { -#ifdef JBM_TSM_ON_TCS float *buf_out_ptr1 = ps->buf_out; float *buf_out_ptr2; -#else - int16_t *buf_out_ptr1 = ps->buf_out; - int16_t *buf_out_ptr2; -#endif l_rem = ( ps->l_frm - l_frm_out ); if ( l_rem < 0 ) @@ -749,11 +701,7 @@ uint8_t apa_exec( return 5; } { -#ifdef JBM_TSM_ON_TCS float *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] ); -#else - int16_t *buf_out_ptr = &( ps->buf_out[ps->l_buf_out] ); -#endif for ( i = 0; i < l_frm_out; i++ ) { buf_out_ptr[i] = a_out[i]; @@ -811,11 +759,7 @@ uint8_t apa_exec( */ static void get_scaling_quality( const apa_state_t *ps, -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint16_t s_len, uint16_t offset, uint16_t corr_len, @@ -968,11 +912,7 @@ static float apa_getQualityIncreaseForLowEnergy( */ static bool logarithmic_search( const apa_state_t *ps, -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif int16_t s_start, uint16_t inlen, uint16_t offset, @@ -1085,11 +1025,7 @@ static bool logarithmic_search( */ static bool find_synch( apa_state_t *ps, -#ifdef JBM_TSM_ON_TCS const float *in, -#else - const int16_t *in, -#endif uint16_t l_in, int16_t s_start, uint16_t s_len, @@ -1144,13 +1080,8 @@ static bool find_synch( */ static bool copy_frm( apa_state_t *ps, -#ifdef JBM_TSM_ON_TCS const float frm_in[], float frm_out[], -#else - const int16_t frm_in[], - int16_t frm_out[], -#endif uint16_t *l_frm_out ) { uint16_t i; @@ -1197,17 +1128,9 @@ static bool copy_frm( */ static bool shrink_frm( apa_state_t *ps, -#ifdef JBM_TSM_ON_TCS const float frm_in[], -#else - const int16_t frm_in[], -#endif uint16_t maxScaling, -#ifdef JBM_TSM_ON_TCS float frm_out[], -#else - int16_t frm_out[], -#endif uint16_t *l_frm_out ) { bool findSynchResult = 0; @@ -1238,7 +1161,6 @@ static bool shrink_frm( /* maximum scaling */ energy = -65; quality = 5; -#ifdef JBM_TSM_ON_TCS if ( ps->evs_compat_mode == false ) { @@ -1258,7 +1180,6 @@ static bool shrink_frm( } } else -#endif if ( maxScaling != 0U && s_end > maxScaling + 1 ) { xtract = maxScaling; @@ -1315,18 +1236,14 @@ static bool shrink_frm( { return 1; } -#ifdef JBM_TSM_ON_TCS if ( ps->evs_compat_mode == true ) { overlapAddEvs( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); } else { -#endif overlapAdd( frm_in, frm_in + xtract, frm_out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); -#ifdef JBM_TSM_ON_TCS } -#endif } else { @@ -1373,13 +1290,8 @@ static bool shrink_frm( */ static bool extend_frm( apa_state_t *ps, -#ifdef JBM_TSM_ON_TCS const float frm_in[], float frm_out[], -#else - const int16_t frm_in[], - int16_t frm_out[], -#endif uint16_t *l_frm_out ) { bool findSynchResult = 0; @@ -1393,13 +1305,8 @@ static bool extend_frm( int16_t s_start = 0; float energy, quality = 0.0f; uint16_t l_frm, l_seg; -#ifdef JBM_TSM_ON_TCS const float *fadeOut, *fadeIn; float *out; -#else - const int16_t *fadeOut, *fadeIn; - int16_t *out; -#endif l_frm = ps->l_frm; @@ -1490,7 +1397,6 @@ static bool extend_frm( energy = -65; quality = 5; xtract[n] = s_start + ps->num_channels; -#ifdef JBM_TSM_ON_TCS if ( ps->evs_compat_mode == false ) { /* take renderer buffer samples into accout */ @@ -1498,7 +1404,6 @@ static bool extend_frm( /* snap to next renderer time slot border to resynchronize */ xtract[n] -= ( ( N - 1 ) * l_seg - xtract[n] + ps->l_r_buf ) % ps->l_ts; } -#endif } else { @@ -1555,29 +1460,20 @@ static bool extend_frm( fadeOut = frm_in + l_frm + xtract[n - 1] + l_seg; fadeIn = frm_in + l_frm + xtract[n]; out = frm_out + ( n - 2 ) * l_seg; -#ifdef JBM_TSM_ON_TCS if ( ps->evs_compat_mode == true ) { overlapAddEvs( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); } else { -#endif overlapAdd( fadeOut, fadeIn, out, l_seg, ps->num_channels, ps->win + ps->l_halfwin, ps->win ); -#ifdef JBM_TSM_ON_TCS } -#endif } else { /* just copy down 1st half of current segment (= 2nd half of previous segment) */ -#ifdef JBM_TSM_ON_TCS float *frm_out_ptr; const float *frm_in_ptr; -#else - int16_t *frm_out_ptr; - const int16_t *frm_in_ptr; -#endif frm_out_ptr = &( frm_out[( n - 2 ) * l_seg] ); frm_in_ptr = &( frm_in[l_frm + xtract[n]] ); for ( i = 0; i < l_seg; i++ ) diff --git a/lib_dec/jbm_pcmdsp_apa.h b/lib_dec/jbm_pcmdsp_apa.h index a5e7cb7d61..74e6b59c6b 100644 --- a/lib_dec/jbm_pcmdsp_apa.h +++ b/lib_dec/jbm_pcmdsp_apa.h @@ -114,7 +114,6 @@ bool apa_set_rate( apa_state_t *ps, const int32_t output_Fs ); * @return 0 on success, 1 on failure */ bool apa_set_scale( apa_state_t *s, uint16_t scale ); -#ifdef JBM_TSM_ON_TCS bool apa_set_renderer_granularity( apa_state_t *ps, uint16_t l_ts ); bool apa_set_renderer_residual_samples( apa_state_t *ps, uint16_t l_r_buf ); @@ -122,7 +121,6 @@ bool apa_set_renderer_residual_samples( apa_state_t *ps, uint16_t l_r_buf ); bool apa_set_evs_compat_mode( apa_state_t *ps, bool mode ); uint8_t apa_reconfigure( apa_state_t *ps, uint16_t num_channels, uint16_t l_ts ); -#endif bool apa_set_complexity_options( apa_state_t *s, uint16_t wss, uint16_t css ); @@ -130,10 +128,6 @@ bool apa_set_quality( apa_state_t *s, float quality, uint16_t qualityred, uint16 bool apa_exit( apa_state_t **s ); -#ifdef JBM_TSM_ON_TCS uint8_t apa_exec( apa_state_t *s, const float a_in[], uint16_t l_in, uint16_t maxScaling, float a_out[], uint16_t *l_out ); -#else -uint8_t apa_exec( apa_state_t *s, const int16_t a_in[], uint16_t l_in, uint16_t maxScaling, int16_t a_out[], uint16_t *l_out ); -#endif #endif /* JBM_PCMDSP_APA_H */ diff --git a/lib_dec/jbm_pcmdsp_fifo.c b/lib_dec/jbm_pcmdsp_fifo.c index 108b069402..a3e8936464 100644 --- a/lib_dec/jbm_pcmdsp_fifo.c +++ b/lib_dec/jbm_pcmdsp_fifo.c @@ -175,7 +175,6 @@ int16_t pcmdsp_fifo_write( return 0; } -#ifdef JBM_TSM_ON_TCS #ifdef DEBUGGING /* Writes the given audio data to the FIFO. */ int16_t pcmdsp_fifo_write_zero( @@ -218,7 +217,6 @@ int16_t pcmdsp_fifo_write_zero( return 0; } #endif -#endif /* Reads the given number of audio samples from the FIFO. */ int16_t pcmdsp_fifo_read( diff --git a/lib_dec/jbm_pcmdsp_fifo.h b/lib_dec/jbm_pcmdsp_fifo.h index d16bd2b8d2..b601cc2e0e 100644 --- a/lib_dec/jbm_pcmdsp_fifo.h +++ b/lib_dec/jbm_pcmdsp_fifo.h @@ -74,11 +74,9 @@ ivas_error pcmdsp_fifo_init( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, int16_t pcmdsp_fifo_write( PCMDSP_FIFO_HANDLE h, const uint8_t *samples, uint16_t nSamplesPerChannel ); -#ifdef JBM_TSM_ON_TCS #ifdef DEBUGGING int16_t pcmdsp_fifo_write_zero( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel ); #endif -#endif int16_t pcmdsp_fifo_read( PCMDSP_FIFO_HANDLE h, uint16_t nSamplesPerChannel, uint8_t *samples ); diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.c b/lib_dec/jbm_pcmdsp_similarityestimation.c index e83d1f7c37..c67e71d591 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.c +++ b/lib_dec/jbm_pcmdsp_similarityestimation.c @@ -52,11 +52,7 @@ /* Calculates cross correlation coefficient for template segment. */ float cross_correlation_self( -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint16_t x, uint16_t y, uint16_t corr_len ) @@ -67,11 +63,7 @@ float cross_correlation_self( c_c = 0.0f; for ( j = 0; j < corr_len; j++ ) { -#ifdef JBM_TSM_ON_TCS c_c += ( signal[j + x] * signal[j + y] ); -#else - c_c += ( (float) signal[j + x] * (float) signal[j + y] ); -#endif } return c_c; @@ -79,11 +71,7 @@ float cross_correlation_self( /* Calculates cross correlation coefficient for template segment. */ float cross_correlation_subsampled_self( -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint16_t x, uint16_t y, uint16_t corr_len, @@ -95,11 +83,7 @@ float cross_correlation_subsampled_self( c_c = 0.0f; for ( j = 0; j < corr_len; j += subsampling ) { -#ifdef JBM_TSM_ON_TCS c_c += ( signal[j + x] * signal[j + y] ); -#else - c_c += ( (float) signal[j + x] * (float) signal[j + y] ); -#endif } return c_c; @@ -108,11 +92,7 @@ float cross_correlation_subsampled_self( /* Calculates normalized cross correlation coefficient for template segment. */ float normalized_cross_correlation_self( -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint16_t x, uint16_t y, uint16_t corr_len, @@ -122,11 +102,7 @@ float normalized_cross_correlation_self( float c_c; float energy_xy, energy_x, energy_y; uint16_t j; -#ifdef JBM_TSM_ON_TCS const float *signal_a, *signal_b; -#else - const int16_t *signal_a, *signal_b; -#endif c_c = 0.0f; energy_x = 0.0f; @@ -135,21 +111,11 @@ float normalized_cross_correlation_self( signal_b = &signal[y]; for ( j = 0; j < corr_len; j += subsampling ) { -#ifdef JBM_TSM_ON_TCS c_c += ( signal_a[j] * signal_b[j] ); energy_x += ( signal_a[j] ) * ( signal_a[j] ); energy_y += ( signal_b[j] ) * ( signal_b[j] ); -#else - c_c += ( (float) signal_a[j] * (float) signal_b[j] ); - energy_x += ( (float) signal_a[j] ) * ( (float) signal_a[j] ); - energy_y += ( (float) signal_b[j] ) * ( (float) signal_b[j] ); -#endif } -#ifdef JBM_TSM_ON_TCS energy_xy = sqrtf( energy_x * energy_y ); -#else - energy_xy = (float) sqrt( (float) energy_x * (float) energy_y ); -#endif if ( energy_xy < 1.0f ) { energy_xy = 1.0f; /* conceal silent frames */ @@ -164,11 +130,7 @@ float normalized_cross_correlation_self( /* Splits the signal into segments and checks if all of them have very low energy. */ bool isSilence( -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint32_t len, uint32_t segments ) { @@ -183,11 +145,7 @@ bool isSilence( if ( ( i != 0U && i % samplesPerSegment == 0U ) || i + 1 == len ) { /* check energy of current segment */ -#ifdef JBM_TSM_ON_TCS energy = 10 * log10f( energy / (float) samplesPerSegment ); -#else - energy = 10 * (float) log10( energy / samplesPerSegment ); -#endif if ( energy > -65 ) { return false; diff --git a/lib_dec/jbm_pcmdsp_similarityestimation.h b/lib_dec/jbm_pcmdsp_similarityestimation.h index 44b4fd246a..c944bc1f7b 100644 --- a/lib_dec/jbm_pcmdsp_similarityestimation.h +++ b/lib_dec/jbm_pcmdsp_similarityestimation.h @@ -68,11 +68,7 @@ ******************************************************************************** */ float cross_correlation_self( -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint16_t x, uint16_t y, uint16_t corr_len ); @@ -103,11 +99,7 @@ float cross_correlation_self( ******************************************************************************** */ float cross_correlation_subsampled_self( -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint16_t x, uint16_t y, uint16_t corr_len, @@ -150,11 +142,7 @@ float cross_correlation_subsampled_self( ******************************************************************************** */ float normalized_cross_correlation_self( -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint16_t x, uint16_t y, uint16_t corr_len, @@ -163,11 +151,7 @@ float normalized_cross_correlation_self( /* Splits the signal into segments and checks if all of them have very low energy. */ bool isSilence( -#ifdef JBM_TSM_ON_TCS const float *signal, -#else - const int16_t *signal, -#endif uint32_t len, uint32_t segments ); diff --git a/lib_dec/jbm_pcmdsp_window.c b/lib_dec/jbm_pcmdsp_window.c index a31d368c91..15f692fb8a 100644 --- a/lib_dec/jbm_pcmdsp_window.c +++ b/lib_dec/jbm_pcmdsp_window.c @@ -80,15 +80,9 @@ void hannWindow( *-----------------------------------------------------------------------*/ void overlapAdd( -#ifdef JBM_TSM_ON_TCS const float *fadeOut, const float *fadeIn, float *out, -#else - const int16_t *fadeOut, - const int16_t *fadeIn, - int16_t *out, -#endif uint16_t n, uint16_t nChannels, const float *fadeOutWin, @@ -96,11 +90,7 @@ void overlapAdd( { float fdOutVal, fdInVal; int16_t i, j, hannIter; -#ifdef JBM_TSM_ON_TCS float combinedVal; -#else - int32_t combinedVal; -#endif for ( j = 0; j < nChannels; j++ ) { @@ -111,28 +101,8 @@ void overlapAdd( fdOutVal = fadeOut[i] * fadeOutWin[hannIter]; fdInVal = fadeIn[i] * fadeInWin[hannIter]; /* round combinedVal value (taking care of sign) */ -#ifdef JBM_TSM_ON_TCS combinedVal = fdInVal + fdOutVal; out[i] = combinedVal; -#else - combinedVal = (int32_t) ( ( fdInVal + fdOutVal ) + 0.5 ); - if ( fdInVal + fdOutVal < 0.0 ) - { - combinedVal = (int32_t) ( ( fdInVal + fdOutVal ) - 0.5 ); - } - - /* saturate value */ - if ( combinedVal > MAX16B ) - { - combinedVal = MAX16B; - } - else if ( combinedVal < MIN16B ) - { - combinedVal = MIN16B; - } - - out[i] = (int16_t) combinedVal; -#endif hannIter++; } } diff --git a/lib_dec/jbm_pcmdsp_window.h b/lib_dec/jbm_pcmdsp_window.h index 8c1823867a..b11decf11d 100644 --- a/lib_dec/jbm_pcmdsp_window.h +++ b/lib_dec/jbm_pcmdsp_window.h @@ -61,10 +61,6 @@ void hannWindow( uint16_t n, float *w ); * @param[in] nChannels number of channels * @param[in] fadeOutWin window for fade out * @param[in] fadeInWin window for fade in */ -#ifdef JBM_TSM_ON_TCS void overlapAdd( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); void overlapAddEvs( const float *fadeOut, const float *fadeIn, float *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); -#else -void overlapAdd( const int16_t *fadeOut, const int16_t *fadeIn, int16_t *out, uint16_t n, uint16_t nChannels, const float *fadeOutWin, const float *fadeInWin ); -#endif #endif /* JBM_PCMDSP_WINDOW_H */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 3f1c20643a..7cb4753235 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -55,11 +55,7 @@ struct IVAS_DEC_VOIP JB4_HANDLE hJBM; PCMDSP_APA_HANDLE hTimeScaler; uint16_t lastDecodedWasActive; -#ifdef JBM_TSM_ON_TCS float *apaExecBuffer; /* Buffer for APA scaling */ -#else - int16_t *apaExecBuffer; /* Buffer for APA scaling */ -#endif JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ #ifdef VARIABLE_SPEED_DECODING @@ -67,14 +63,10 @@ struct IVAS_DEC_VOIP uint16_t speedFac; bool needNewFrame; #endif -#ifdef JBM_TSM_ON_TCS JBM_RENDERER_TYPE rendererType; PCMDSP_FIFO_HANDLE hFifoOut; uint8_t nTransportChannelsOld; uint16_t nSamplesAvailableNext; -#else - PCMDSP_FIFO_HANDLE hFifoAfterTimeScaler; -#endif #ifdef SUPPORT_JBM_TRACEFILE IVAS_JBM_TRACE_DATA JbmTraceData; #endif @@ -109,14 +101,9 @@ static void IVAS_DEC_Close_VoIP( IVAS_DEC_VOIP *hVoIP ); #ifdef SUPPORT_JBM_TRACEFILE static void store_JbmData( IVAS_DEC_VOIP *hVoIP, JB4_DATAUNIT_HANDLE dataUnit, const uint32_t systemTimestamp_ms, const uint16_t extBufferedSamples, const int32_t output_Fs ); #endif -#ifdef JBM_TSM_ON_TCS static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, float *floatBuf, int16_t *pcmBuf ); -#else -static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, int16_t *pcmBuf ); -#endif static ivas_error input_format_API_to_internal( IVAS_DEC_INPUT_FORMAT input_format, int16_t *bitstream_format_internal, int16_t *sdp_hf_only, const bool is_voip_enabled ); static void init_decoder_config( DECODER_CONFIG_HANDLE hDecoderConfig ); -#ifdef JBM_TSM_ON_TCS static int16_t IVAS_DEC_VoIP_GetRenderGranularity( Decoder_Struct *st_ivas ); static JBM_RENDERER_TYPE IVAS_DEC_VoIP_GetRendererConfig( IVAS_DEC_HANDLE hIvasDec ); static ivas_error IVAS_DEC_VoIP_reconfigure( IVAS_DEC_HANDLE hIvasDec, const uint16_t nTransportChannels, const uint16_t l_ts ); @@ -125,7 +112,6 @@ static ivas_error IVAS_DEC_GetTcSamples( IVAS_DEC_HANDLE hIvasDec, float *pcmBuf static ivas_error IVAS_DEC_RendererFeedTcSamples( IVAS_DEC_HANDLE hIvasDec, const int16_t nSamplesForRendering, int16_t *nSamplesResidual, float *pcmBuf ); static ivas_error IVAS_DEC_GetRenderedSamples( IVAS_DEC_HANDLE hIvasDec, const uint16_t nSamplesForRendering, uint16_t *nSamplesRendered, uint16_t *nSamplesAvailableNext, int16_t *pcmBuf ); static ivas_error IVAS_DEC_GetBufferedNumberOfSamples( IVAS_DEC_HANDLE hIvasDec, int16_t *nSamplesBuffered ); -#endif /*---------------------------------------------------------------------* * IVAS_DEC_Open() @@ -256,9 +242,7 @@ static void init_decoder_config( hDecoderConfig->Opt_non_diegetic_pan = 0; hDecoderConfig->non_diegetic_pan_gain = 0; -#ifdef JBM_TSM_ON_TCS hDecoderConfig->voip_active = 0; -#endif hDecoderConfig->Opt_delay_comp = 0; @@ -521,10 +505,6 @@ ivas_error IVAS_DEC_EnableVoIP( error = IVAS_ERR_OK; -#ifndef JBM_TSM_ON_TCS - /* initialize time scaler and FIFO after time scaler */ - uint16_t wss, css; -#endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { @@ -534,17 +514,12 @@ ivas_error IVAS_DEC_EnableVoIP( hDecoderConfig = hIvasDec->st_ivas->hDecoderConfig; hIvasDec->Opt_VOIP = 1; -#ifdef JBM_TSM_ON_TCS hDecoderConfig->voip_active = 1; -#endif -#ifdef JBM_TSM_ON_TCS if ( hDecoderConfig->output_config != AUDIO_CONFIG_EXTERNAL ) { -#endif hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); -#ifdef JBM_TSM_ON_TCS } #ifdef VARIABLE_SPEED_DECODING else @@ -552,11 +527,7 @@ ivas_error IVAS_DEC_EnableVoIP( hDecoderConfig->nchan_out = 1; } #endif -#endif -#ifndef JBM_TSM_ON_TCS - assert( hDecoderConfig->nchan_out > 0 && "EXT output not yet supported in VoIP mode" ); -#endif if ( ( error = input_format_API_to_internal( inputFormat, &hIvasDec->bitstreamformat, &hIvasDec->sdp_hf_only, true ) ) != IVAS_ERR_OK ) { @@ -575,27 +546,14 @@ ivas_error IVAS_DEC_EnableVoIP( hIvasDec->hVoIP->speedFac = speedFac; hIvasDec->hVoIP->needNewFrame = false; #endif -#ifdef JBM_TSM_ON_TCS hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs / FRAMES_PER_SEC ); hIvasDec->hVoIP->nSamplesAvailableNext = 0; hIvasDec->hVoIP->rendererType = JBM_RENDERER_NONE; hIvasDec->hVoIP->hFifoOut = NULL; -#else - hIvasDec->hVoIP->nSamplesFrame = (uint16_t) ( hDecoderConfig->output_Fs * hDecoderConfig->nchan_out / FRAMES_PER_SEC ); -#endif -#ifdef JBM_TSM_ON_TCS /* postpone init of the buffers until we know the real number of TCs*/ hIvasDec->hVoIP->apaExecBuffer = NULL; hIvasDec->hVoIP->nTransportChannelsOld = 0; -#else - - hIvasDec->hVoIP->apaExecBuffer = malloc( sizeof( int16_t ) * APA_BUF_PER_CHANNEL * hDecoderConfig->nchan_out ); - if ( hIvasDec->hVoIP->apaExecBuffer == NULL ) - { - return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate VoIP handle" ); - } -#endif #define WMC_TOOL_SKIP /* Bitstream conversion is not counted towards complexity and memory usage */ @@ -624,34 +582,7 @@ ivas_error IVAS_DEC_EnableVoIP( #ifdef VARIABLE_SPEED_DECODING } #endif -#ifndef JBM_TSM_ON_TCS - if ( hDecoderConfig->output_Fs == 8000 ) - { - wss = 1; - css = 1; - } - else if ( hDecoderConfig->output_Fs == 16000 ) - { - wss = 2; - css = 1; - } - else if ( hDecoderConfig->output_Fs == 32000 ) - { - wss = 4; - css = 2; - } - else if ( hDecoderConfig->output_Fs == 48000 ) - { - wss = 6; - css = 3; - } - else - { - return IVAS_ERR_INIT_ERROR; - } -#endif -#ifdef JBM_TSM_ON_TCS /* postpone init of time scaler and output FIFO until we know the real number of TCs */ hIvasDec->hVoIP->hTimeScaler = NULL; #ifdef VARIABLE_SPEED_DECODING @@ -659,36 +590,6 @@ ivas_error IVAS_DEC_EnableVoIP( { hIvasDec->hVoIP->needNewFrame = true; } -#endif -#else -#ifdef VARIABLE_SPEED_DECODING - { - float startQuality = hIvasDec->hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ? -2.0f : 1.0f; - if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, - hDecoderConfig->nchan_out ) != IVAS_ERR_OK || - apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || - apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || - apa_set_quality( hIvasDec->hVoIP->hTimeScaler, startQuality, 4, 4 ) != 0 || - pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoAfterTimeScaler ) != 0 || - pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoAfterTimeScaler, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != 0 ) - { - return IVAS_ERR_INIT_ERROR; - } - /* we instantly need a new frame */ - hIvasDec->hVoIP->needNewFrame = true; - } -#else - if ( apa_init( &hIvasDec->hVoIP->hTimeScaler, - hDecoderConfig->nchan_out ) != IVAS_ERR_OK || - apa_set_rate( hIvasDec->hVoIP->hTimeScaler, hDecoderConfig->output_Fs ) != 0 || - apa_set_complexity_options( hIvasDec->hVoIP->hTimeScaler, wss, css ) != 0 || - apa_set_quality( hIvasDec->hVoIP->hTimeScaler, 1, 4, 4 ) != 0 || - pcmdsp_fifo_create( &hIvasDec->hVoIP->hFifoAfterTimeScaler ) != IVAS_ERR_OK || - pcmdsp_fifo_init( hIvasDec->hVoIP->hFifoAfterTimeScaler, (uint16_t) ( hDecoderConfig->output_Fs * 4 / FRAMES_PER_SEC ) /* 4 frames */, hDecoderConfig->nchan_out, sizeof( int16_t ) ) != IVAS_ERR_OK ) - { - return IVAS_ERR_INIT_ERROR; - } -#endif #endif return error; @@ -817,11 +718,7 @@ ivas_error IVAS_DEC_GetSamples( if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = evs_dec_main( st_ivas, *nOutSamples, NULL, pcmBuf ) ) != IVAS_ERR_OK ) -#else - if ( ( error = evs_dec_main( st_ivas, *nOutSamples, pcmBuf ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -846,7 +743,6 @@ ivas_error IVAS_DEC_GetSamples( } -#ifdef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * IVAS_DEC_Setup( ) * @@ -1064,7 +960,6 @@ ivas_error IVAS_DEC_GetBufferedNumberOfSamples( return error; } -#endif /*---------------------------------------------------------------------* @@ -1831,10 +1726,8 @@ ivas_error IVAS_DEC_VoIP_GetSamples( uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ -#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) , uint16_t *sampleAvailableNext /* o : samples available for the next call */ -#endif #ifdef SUPPORT_JBM_TRACEFILE , JbmTraceFileWriterFn jbmWriterFn, @@ -1854,12 +1747,10 @@ ivas_error IVAS_DEC_VoIP_GetSamples( int16_t timeScalingDone; int16_t result; ivas_error error; -#ifdef JBM_TSM_ON_TCS int16_t nSamplesRendered; uint16_t nSamplesTcsScaled; uint8_t nTransportChannels; uint8_t nOutChannels; -#endif error = IVAS_ERR_OK; @@ -1868,32 +1759,22 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hVoIP = hIvasDec->hVoIP; timeScalingDone = 0; -#ifdef JBM_TSM_ON_TCS nOutChannels = (uint8_t) st_ivas->hDecoderConfig->nchan_out; nTransportChannels = 0; nSamplesTcsScaled = hVoIP->nSamplesFrame; nSamplesRendered = 0; -#endif #ifdef VARIABLE_SPEED_DECODING scale = hVoIP->speedFac; maxScaling = hVoIP->speedFac; #endif -#ifdef JBM_TSM_ON_TCS if ( ( hVoIP->hFifoOut != NULL && nSamplesPerChannel > hVoIP->hFifoOut->capacity ) || nSamplesPerChannel == 0 ) -#else - if ( nSamplesPerChannel > hVoIP->hFifoAfterTimeScaler->capacity || nSamplesPerChannel == 0 ) -#endif { return IVAS_ERR_WRONG_PARAMS; } /* make sure that the FIFO after decoder/scaler contains at least one sound card frame (i.e. 20ms) */ -#ifdef JBM_TSM_ON_TCS while ( ( hVoIP->hFifoOut != NULL && pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoOut ) < nSamplesPerChannel ) || ( hVoIP->hFifoOut == NULL && nSamplesRendered < nSamplesPerChannel ) ) -#else - while ( pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) < nSamplesPerChannel ) -#endif { #ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING @@ -1906,7 +1787,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( #endif #endif -#ifdef JBM_TSM_ON_TCS if ( hVoIP->nSamplesAvailableNext == 0 ) { if ( hVoIP->hFifoOut ) @@ -1928,9 +1808,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } extBufferedSamples = nSamplesRendered + nSamplesBuffered; } -#else - extBufferedSamples = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); -#endif extBufferedTime_ms = extBufferedSamples * 1000 / hDecoderConfig->output_Fs; dataUnit = NULL; @@ -1999,7 +1876,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( if ( !hIvasDec->hasBeenFedFirstGoodFrame ) { /* codec mode to use not known yet - simply output silence */ -#ifdef JBM_TSM_ON_TCS nSamplesTcsScaled = hVoIP->nSamplesFrame; if ( hVoIP->hFifoOut != NULL ) { @@ -2017,14 +1893,10 @@ ivas_error IVAS_DEC_VoIP_GetSamples( set_s( pcmBuf, 0, nSamplesPerChannel * nOutChannels ); } nSamplesRendered = nSamplesTcsScaled; -#else - set_s( hVoIP->apaExecBuffer, 0, hVoIP->nSamplesFrame ); /* TODO(mcjbm): Could be optimized: just write directly to output buffer */ -#endif } else { -#ifdef JBM_TSM_ON_TCS uint16_t l_ts = 1; uint16_t nSamplesRendered_loop; @@ -2062,12 +1934,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( return error; } -#else - if ( ( error = IVAS_DEC_GetSamples( hIvasDec, hVoIP->apaExecBuffer, &nOutSamplesElse ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } #ifdef VARIABLE_SPEED_DECODING @@ -2106,46 +1972,21 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } /* apply time scaling on decoded/concealed samples */ -#ifdef JBM_TSM_ON_TCS if ( hIvasDec->hasBeenFedFirstGoodFrame ) { -#endif if ( apa_set_scale( hVoIP->hTimeScaler, (uint16_t) scale ) != 0 ) { return IVAS_ERR_UNKNOWN; } -#ifdef JBM_TSM_ON_TCS result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame * nTransportChannels, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples ); -#else - result = apa_exec( hVoIP->hTimeScaler, hVoIP->apaExecBuffer, hVoIP->nSamplesFrame, (uint16_t) maxScaling, hVoIP->apaExecBuffer, &nTimeScalerOutSamples ); -#endif if ( result != 0 ) { return IVAS_ERR_UNKNOWN; } assert( nTimeScalerOutSamples <= APA_BUF ); -#ifdef JBM_TSM_ON_TCS nSamplesTcsScaled = nTimeScalerOutSamples / nTransportChannels; -#else - /* append scaled samples to FIFO */ - if ( pcmdsp_fifo_write( hVoIP->hFifoAfterTimeScaler, (uint8_t *) hVoIP->apaExecBuffer, (uint16_t) ( nTimeScalerOutSamples / hDecoderConfig->nchan_out ) ) != 0 ) - { - return IVAS_ERR_UNKNOWN; - } -#ifdef VARIABLE_SPEED_DECODING - if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) - { - int16_t nSamplesAvailable = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); - if ( nSamplesAvailable < nSamplesPerChannel ) - { - hVoIP->needNewFrame = true; - } - } -#endif -#endif -#ifdef JBM_TSM_ON_TCS if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE ) { /* render IVAS frames */ @@ -2177,7 +2018,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( nSamplesRendered = nSamplesTcsScaled; } } -#endif #ifdef SUPPORT_JBM_TRACEFILE /* jbmWriterFn and jbmWriter may be NULL if tracefile writing was not requested on CLI */ if ( jbmWriterFn != NULL && jbmWriter != NULL ) @@ -2191,7 +2031,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( } } #endif -#ifdef JBM_TSM_ON_TCS } if ( hIvasDec->hasBeenFedFirstGoodFrame && hVoIP->rendererType != JBM_RENDERER_NONE ) @@ -2252,40 +2091,18 @@ ivas_error IVAS_DEC_VoIP_GetSamples( hVoIP->nSamplesAvailableNext = 0; } -#endif } /* fetch a user-specified number of samples from FIFO */ -#if defined( JBM_TSM_ON_TCS ) if ( hVoIP->hFifoOut ) { if ( pcmdsp_fifo_read( hVoIP->hFifoOut, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) -#else - if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, nSamplesPerChannel, (uint8_t *) pcmBuf ) != 0 ) -#endif { return IVAS_ERR_UNKNOWN; } -#ifdef JBM_TSM_ON_TCS } -#endif -#if defined( JBM_TSM_ON_TCS ) || defined( VARIABLE_SPEED_DECODING ) -#ifdef JBM_TSM_ON_TCS *sampleAvailableNext = hVoIP->nSamplesAvailableNext; -#else - *sampleAvailableNext = max( 0, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) ); -#ifdef VARIABLE_SPEED_DECODING - if ( hVoIP->mode == IVAS_DEC_VOIP_MODE_VARIABLE_SPEED ) - { - if ( *sampleAvailableNext < nSamplesPerChannel ) - { - hVoIP->needNewFrame = true; - } - } -#endif -#endif -#endif return error; } @@ -2296,7 +2113,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( * Function to flush remaining audio in VoIP *---------------------------------------------------------------------*/ -#if defined( VARIABLE_SPEED_DECODING ) || defined( JBM_TSM_ON_TCS ) ivas_error IVAS_DEC_VoIP_Flush( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ @@ -2307,41 +2123,24 @@ ivas_error IVAS_DEC_VoIP_Flush( { ivas_error error; IVAS_DEC_VOIP *hVoIP; -#ifdef JBM_TSM_ON_TCS int16_t rendererPcmBuf[( MAX_OUTPUT_CHANNELS * L_FRAME_MAX * APA_MAX_SCALE ) / 100]; uint16_t nSamplesToRender; uint16_t nSamplesFlushedLocal; -#endif error = IVAS_ERR_OK; hVoIP = hIvasDec->hVoIP; -#if defined( JBM_TSM_ON_TCS ) *nSamplesFlushed = min( nSamplesPerChannel, hVoIP->nSamplesAvailableNext ); -#else - *nSamplesFlushed = min( nSamplesPerChannel, pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ) ); -#endif -#ifdef JBM_TSM_ON_TCS if ( hVoIP->rendererType == JBM_RENDERER_NONE ) { -#endif /* fetch a user-specified number of samples from FIFO */ -#if defined( JBM_TSM_ON_TCS ) if ( pcmdsp_fifo_read( hVoIP->hFifoOut, *nSamplesFlushed, (uint8_t *) pcmBuf ) != 0 ) -#else - if ( pcmdsp_fifo_read( hVoIP->hFifoAfterTimeScaler, *nSamplesFlushed, (uint8_t *) pcmBuf ) != 0 ) -#endif { return IVAS_ERR_UNKNOWN; } -#if defined( JBM_TSM_ON_TCS ) hVoIP->nSamplesAvailableNext -= *nSamplesFlushed; *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext; -#else - *nSamplesAvailableNext = pcmdsp_fifo_nReadableSamplesPerChannel( hVoIP->hFifoAfterTimeScaler ); -#endif -#ifdef JBM_TSM_ON_TCS } else { @@ -2365,11 +2164,9 @@ ivas_error IVAS_DEC_VoIP_Flush( *nSamplesAvailableNext = hVoIP->nSamplesAvailableNext; *nSamplesFlushed = (int16_t) nSamplesFlushedLocal; } -#endif return error; } -#endif /*---------------------------------------------------------------------* @@ -2380,17 +2177,11 @@ ivas_error IVAS_DEC_VoIP_Flush( bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ -#ifdef JBM_TSM_ON_TCS , const int16_t nSamplesAsked -#endif ) { -#ifdef JBM_TSM_ON_TCS return ( ( JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0 ) && ( hIvasDec->hVoIP->nSamplesAvailableNext < nSamplesAsked ) ); -#else - return JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0; -#endif } @@ -2431,11 +2222,7 @@ static void IVAS_DEC_Close_VoIP( apa_exit( &hVoIP->hTimeScaler ); -#ifdef JBM_TSM_ON_TCS pcmdsp_fifo_destroy( &hVoIP->hFifoOut ); -#else - pcmdsp_fifo_destroy( &hVoIP->hFifoAfterTimeScaler ); -#endif if ( hVoIP->apaExecBuffer != NULL ) { @@ -2761,7 +2548,6 @@ static ivas_error printConfigInfo_dec( } } -#ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------* * Print VoIP mode info *-----------------------------------------------------------------*/ @@ -2770,7 +2556,6 @@ static ivas_error printConfigInfo_dec( { fprintf( stdout, "VoIP mode: ON\n" ); } -#endif return IVAS_ERR_OK; } @@ -2870,18 +2655,14 @@ void IVAS_DEC_PrintDisclaimer( void ) static ivas_error evs_dec_main( Decoder_Struct *st_ivas, const int16_t nOutSamples, -#ifdef JBM_TSM_ON_TCS float *floatBuf, -#endif int16_t *pcmBuf ) { DEC_CORE_HANDLE *hCoreCoder; float output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN][L_FRAME48k]; float mixer_left, mixer_rigth; -#ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; int16_t ch; -#endif ivas_error error; error = IVAS_ERR_OK; @@ -2891,12 +2672,10 @@ static ivas_error evs_dec_main( mdct_switching_dec( hCoreCoder[0] ); -#ifdef JBM_TSM_ON_TCS for ( ch = 0; ch < MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; ch++ ) { p_output[ch] = output[ch]; } -#endif /* run the main EVS decoding routine */ if ( hCoreCoder[0]->codec_mode == MODE1 ) @@ -2951,7 +2730,6 @@ static ivas_error evs_dec_main( v_multc( output[0], mixer_left, output[0], nOutSamples ); } -#ifdef JBM_TSM_ON_TCS if ( floatBuf != NULL ) { /* BE workaround */ @@ -2970,18 +2748,11 @@ static ivas_error evs_dec_main( } else { -#endif #ifdef DEBUGGING st_ivas->noClipping += #endif -#ifdef JBM_TSM_ON_TCS ivas_syn_output( p_output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); -#else - ivas_syn_output( output, nOutSamples, st_ivas->hDecoderConfig->nchan_out, pcmBuf ); -#endif -#ifdef JBM_TSM_ON_TCS } -#endif return error; } @@ -3179,7 +2950,6 @@ static ivas_error input_format_API_to_internal( } -#ifdef JBM_TSM_ON_TCS /*---------------------------------------------------------------------* * IVAS_DEC_VoIP_GetRenderGranularity() * @@ -3342,4 +3112,3 @@ ivas_error IVAS_DEC_VoIP_reconfigure( return error; } -#endif diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index c317b45e3a..8d2159a71f 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -232,17 +232,14 @@ ivas_error IVAS_DEC_VoIP_GetSamples( uint16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ int16_t *pcmBuf, /* i/o: buffer for decoded PCM output. The memory must already be allocated and be able to hold the expected number of output samples, based on frame size and number of output channels */ const uint32_t systemTimestamp_ms /* i : current system timestamp */ -#if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING ) , uint16_t *sampleAvailableNext /* o : samples available for the next call */ -#endif #ifdef SUPPORT_JBM_TRACEFILE , JbmTraceFileWriterFn jbmWriterFn, void* jbmWriter #endif ); -#if defined( JBM_TSM_ON_TCS ) || defined(VARIABLE_SPEED_DECODING ) ivas_error IVAS_DEC_VoIP_Flush( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ const int16_t nSamplesPerChannel, /* i : number of samples per channel requested to be written to output buffer */ @@ -250,7 +247,6 @@ ivas_error IVAS_DEC_VoIP_Flush( uint16_t *nSamplesAvailableNext, /* o : number of samples still available */ int16_t *nSamplesFlushed /* o : number of samples flushed */ ); -#endif /* Setter functions - apply changes to decoder configuration */ @@ -376,10 +372,8 @@ ivas_error IVAS_DEC_GetPcmFrameSize( /*! r: true if decoder has no data in VoIP jitter buffer */ bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ -#ifdef JBM_TSM_ON_TCS , const int16_t nSamplesAsked -#endif ); ivas_error IVAS_DEC_VoIP_Get_CA_offset( diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index ae66c4fcfc..10f8743b23 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1292,13 +1292,8 @@ static ivas_error ivas_rend_crendConvolver( const CREND_WRAPPER *pCrend, IVAS_REND_AudioConfig inConfig, IVAS_REND_AudioConfig outConfig, -#ifdef JBM_TSM_ON_TCS float *pcm_in[], float *pcm_out[], -#else - float pcm_in[][L_FRAME48k], - float pcm_out[][L_FRAME48k], -#endif const int32_t output_Fs, const int16_t i_ts ) { @@ -1471,19 +1466,13 @@ ivas_error ivas_rend_crendProcess( HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: input/output audio channels */ -#else - float output[][L_FRAME48k], /* i/o: input/output audio channels */ -#endif const int32_t output_Fs ) { int16_t i, subframe_idx, output_frame, subframe_len; int16_t nchan_out; float pcm_tmp[BINAURAL_CHANNELS][L_FRAME48k]; -#ifdef JBM_TSM_ON_TCS float *p_pcm_tmp[BINAURAL_CHANNELS]; -#endif AUDIO_CONFIG in_config; IVAS_REND_AudioConfigType inConfigType; ivas_error error; @@ -1507,12 +1496,10 @@ ivas_error ivas_rend_crendProcess( output_frame = (int16_t) ( output_Fs / FRAMES_PER_SEC ); subframe_len = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < BINAURAL_CHANNELS; i++ ) { p_pcm_tmp[i] = pcm_tmp[i]; } -#endif for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { @@ -1537,22 +1524,14 @@ ivas_error ivas_rend_crendProcess( if ( ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_CHANNEL_BASED ) || ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, output, p_pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendConvolver( pCrend, inRendConfig, outRendConfig, output, pcm_tmp, output_Fs, subframe_idx ) ) != IVAS_ERR_OK ) -#endif { return error; } if ( pCrend->hCrend->hReverb != NULL ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, output, p_pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_reverb_process( pCrend->hCrend->hReverb, in_config, 1, output, pcm_tmp, subframe_idx ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1576,7 +1555,6 @@ ivas_error ivas_rend_crendProcess( } -#ifdef JBM_TSM_ON_TCS /*-----------------------------------------------------------------------------------------* * Function ivas_rend_crendProcessSubframe() * @@ -1712,4 +1690,3 @@ ivas_error ivas_rend_crendProcessSubframe( return IVAS_ERR_OK; } -#endif diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index a561f2ecd0..c520c5631e 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -81,11 +81,7 @@ typedef struct hrtfGainCache * Local function prototypes *------------------------------------------------------------------------*/ -#ifdef JBM_TSM_ON_TCS static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float *output_f[], const int16_t nchan_transport, const int16_t subframe ); -#else -static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], const int16_t nchan_transport, const int16_t subframe ); -#endif static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH @@ -98,19 +94,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3] ); #endif -#ifdef JBM_TSM_ON_TCS static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); -#else -static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float output_f[][L_FRAME48k], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); - -static void adaptTransportSignalsHeadtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); - -static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( HEAD_TRACK_DATA_HANDLE hHeadTrackData, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, float Rmat[3][3] ); -#endif static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH @@ -258,7 +246,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( st_ivas->hDiracDecBin = hBinaural; -#ifdef JBM_TSM_ON_TCS /* allocate transport channels*/ if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) { @@ -270,7 +257,6 @@ ivas_error ivas_dirac_dec_init_binaural_data( return error; } } -#endif return IVAS_ERR_OK; } @@ -351,7 +337,6 @@ ivas_error ivas_dirac_dec_binaural_copy_hrtfs( } -#ifdef JBM_TSM_ON_TCS /*------------------------------------------------------------------------- * void ivas_dirac_dec_binaural_render() * @@ -418,7 +403,6 @@ void ivas_dirac_dec_binaural_render( return; } -#endif /*------------------------------------------------------------------------- @@ -434,7 +418,6 @@ void ivas_dirac_dec_binaural( ) { int16_t subframe; -#ifdef JBM_TSM_ON_TCS float cng_td_buffer[L_FRAME16k]; float *p_output[MAX_OUTPUT_CHANNELS]; int16_t ch; @@ -465,45 +448,32 @@ void ivas_dirac_dec_binaural( { ivas_spar_dec_set_render_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); } -#endif if ( st_ivas->hDiracDecBin->useTdDecorr ) { float *decorr_signal[BINAURAL_CHANNELS]; -#ifndef JBM_TSM_ON_TCS - int16_t ch; -#endif int16_t output_frame; for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { decorr_signal[ch] = (float *) &( output_f[ch + BINAURAL_CHANNELS][0] ); -#ifdef JBM_TSM_ON_TCS st_ivas->hTcBuffer->tc[ch + BINAURAL_CHANNELS] = decorr_signal[ch]; -#endif } output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); -#ifdef JBM_TSM_ON_TCS ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); -#else - ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, output_f, decorr_signal, output_frame ); -#endif } -#ifdef JBM_TSM_ON_TCS if ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[nchan_transport], DEFAULT_JBM_CLDFB_TIMESLOTS, st->cna_dirac_flag && st->flag_cna ); } -#endif for ( subframe = 0; subframe < MAX_PARAM_SPATIAL_SUBFRAMES; subframe++ ) { -#ifdef JBM_TSM_ON_TCS int16_t n_samples_sf = slot_size * st_ivas->hDirAC->subframe_nbslots[subframe]; ivas_dirac_dec_binaural_internal( st_ivas, p_output, nchan_transport, subframe ); @@ -513,17 +483,12 @@ void ivas_dirac_dec_binaural( p_output[ch] += n_samples_sf; } st_ivas->hDirAC->dirac_read_idx = ( st_ivas->hDirAC->dirac_read_idx + 1 ) % st_ivas->hDirAC->dirac_md_buffer_length; -#else - ivas_dirac_dec_binaural_internal( st_ivas, output_f, nchan_transport, subframe ); -#endif } -#ifdef JBM_TSM_ON_TCS for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { st_ivas->hTcBuffer->tc[ch] = NULL; } -#endif return; } @@ -536,11 +501,7 @@ void ivas_dirac_dec_binaural( static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, -#ifdef JBM_TSM_ON_TCS float *output_f[], -#else - float output_f[][L_FRAME48k], -#endif const int16_t nchan_transport, const int16_t subframe ) { @@ -555,11 +516,7 @@ static void ivas_dirac_dec_binaural_internal( hDirAC = st_ivas->hDirAC; nBins = hDirAC->num_freq_bands; -#ifdef JBM_TSM_ON_TCS offsetSamples = hDirAC->slots_rendered * nBins; -#else - offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins; -#endif /* The input channel number at this processing function (not nchan_transport) */ numInChannels = BINAURAL_CHANNELS; @@ -581,22 +538,14 @@ static void ivas_dirac_dec_binaural_internal( Rmat[2][2] = 1.0f; /* CLDFB Analysis of input */ -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) -#else - for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif { for ( ch = 0; ch < numInChannels; ch++ ) { if ( ch == 0 || nchan_transport == 2 ) { cldfbAnalysis_ts( -#ifdef JBM_TSM_ON_TCS &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ), -#else - &( output_f[ch][nBins * slot + offsetSamples] ), -#endif Cldfb_RealBuffer_in[ch][slot], Cldfb_ImagBuffer_in[ch][slot], nBins, st_ivas->cldfbAnaDec[ch] ); @@ -616,19 +565,11 @@ static void ivas_dirac_dec_binaural_internal( int16_t slotInFrame; numCoreBands = st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom->numCoreBands; -#ifdef JBM_TSM_ON_TCS slotInFrame = hDirAC->slots_rendered + slot; -#else - slotInFrame = subframe * CLDFB_SLOTS_PER_SUBFRAME + slot; -#endif generate_masking_noise_dirac( st_ivas->hSCE[0]->hCoreCoder[0]->hFdCngDec->hFdCngCom, st_ivas->cldfbAnaDec[1], -#ifdef JBM_TSM_ON_TCS st_ivas->hTcBuffer->tc[nchan_transport], -#else - &( output_f[1][L_FRAME48k - L_FRAME16k] ), /*used as temporary static buffer for the whole frame*/ -#endif Cldfb_RealBuffer_in[2][slot], Cldfb_ImagBuffer_in[2][slot], slotInFrame, st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->hSCE[0]->hCoreCoder[0]->flag_cna, @@ -681,11 +622,7 @@ static void ivas_dirac_dec_binaural_internal( for ( ch = BINAURAL_CHANNELS; ch < ( 2 * BINAURAL_CHANNELS ); ch++ ) { cldfbAnalysis_ts( -#ifdef JBM_TSM_ON_TCS &( st_ivas->hTcBuffer->tc[ch][nBins * slot + offsetSamples] ), -#else - &( output_f[ch][nBins * slot + offsetSamples] ), -#endif Cldfb_RealBuffer_in[ch][slot], Cldfb_ImagBuffer_in[ch][slot], nBins, st_ivas->cldfbAnaDec[ch] ); @@ -718,15 +655,9 @@ static void ivas_dirac_dec_binaural_internal( if ( nchan_transport == 2 ) { -#ifdef JBM_TSM_ON_TCS adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); -#else - adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); - - ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, Rmat ); -#endif } } @@ -759,12 +690,8 @@ static void ivas_dirac_dec_binaural_internal( st_ivas->hDirAC->hDiffuseDist = NULL; -#ifdef JBM_TSM_ON_TCS hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe]; hDirAC->subframes_rendered++; -#else - hDirAC->dirac_read_idx = ( hDirAC->dirac_read_idx + 1 ) % hDirAC->dirac_md_buffer_length; -#endif return; } @@ -821,8 +748,6 @@ static void ivas_dirac_dec_decorrelate_slot( return; } -#ifdef JBM_TSM_ON_TCS -#endif static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( @@ -901,18 +826,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Formulate input and target covariance matrices for this subframe */ set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); -#ifdef JBM_TSM_ON_TCS dirac_read_idx = hDirAC->render_to_md_map[subframe]; -#else - dirac_read_idx = hDirAC->dirac_read_idx; -#endif /* Calculate input covariance matrix */ -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) -#else - for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) -#endif { for ( bin = 0; bin < nBins; bin++ ) { @@ -953,11 +870,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric set_zero( subFrameTotalEne, CLDFB_NO_CHANNELS_MAX ); -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < hDirAC->subframe_nbslots[subframe]; slot++ ) -#else - for ( slot = 0; slot < hDirAC->subframe_nbslots; slot++ ) -#endif { for ( bin = 0; bin < nBins; bin++ ) { @@ -1192,11 +1105,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric #endif { float diffuseFieldCoherence; -#ifdef JBM_TSM_ON_TCS diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[bin] * h->diffuseFieldCoherenceZ[bin]; -#else - diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[subframe][bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[subframe][bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[subframe][bin] * h->diffuseFieldCoherenceZ[bin]; -#endif h->ChCrossReOut[bin] += ( ( 1.0f - surCoh ) * diffuseFieldCoherence + surCoh ) * diffEne; } else @@ -1469,11 +1378,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, -#ifdef JBM_TSM_ON_TCS float *output_f[], -#else - float output_f[][L_FRAME48k], -#endif float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, @@ -1491,41 +1396,23 @@ static void ivas_dirac_dec_binaural_process_output( float *decSlotRePointer; float *decSlotImPointer; int16_t offsetSamples; -#ifdef JBM_TSM_ON_TCS int16_t nSlots; -#endif h = st_ivas->hDiracDecBin; nBins = st_ivas->hDirAC->num_freq_bands; -#ifdef JBM_TSM_ON_TCS offsetSamples = 0; nSlots = st_ivas->hDirAC->subframe_nbslots[subframe]; -#else - offsetSamples = subframe * CLDFB_SLOTS_PER_SUBFRAME * nBins; -#endif if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { /* Process second / room effect part of binaural output when needed */ -#ifdef JBM_TSM_ON_TCS ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, nSlots, inRe, inIm, reverbRe, reverbIm ); -#else - ivas_binaural_reverb_processSubframe( st_ivas->hDiracDecBin->hReverb, numInChannels, inRe, inIm, reverbRe, reverbIm ); -#endif } interpVal = 0.0f; -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < nSlots; slot++ ) -#else - for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif { -#ifdef JBM_TSM_ON_TCS interpVal += 1.0f / (float) nSlots; -#else - interpVal += 1.0f / ( (float) CLDFB_SLOTS_PER_SUBFRAME ); -#endif if ( !st_ivas->hDiracDecBin->useTdDecorr && max_band_decorr > 0 ) { ivas_dirac_dec_decorrelate_slot( st_ivas->hDirAC, slot, inRe, inIm, decSlotRe, decSlotIm ); @@ -1607,9 +1494,7 @@ static void adaptTransportSignalsHeadtracked( float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, -#ifdef JBM_TSM_ON_TCS const int16_t nSlots, -#endif float Rmat[3][3] ) { int16_t slot, ch, bin, louderCh; @@ -1641,11 +1526,7 @@ static void adaptTransportSignalsHeadtracked( for ( ch = 0; ch < 2; ch++ ) { ch_nrg[ch] = 0.0f; -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < nSlots; slot++ ) -#else - for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif { for ( bin = bin_lo; bin < bin_hi; bin++ ) { @@ -1681,11 +1562,7 @@ static void adaptTransportSignalsHeadtracked( { float band_nrg = 0.0f; -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < nSlots; slot++ ) -#else - for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif { for ( bin = bin_lo; bin < bin_hi; bin++ ) { @@ -1711,11 +1588,7 @@ static void adaptTransportSignalsHeadtracked( ene_proc = hHeadTrackData->procChEneIIR[0][band_idx] + hHeadTrackData->procChEneIIR[1][band_idx]; eqVal = fminf( 4.0f, sqrtf( ene_target / fmaxf( 1e-12f, ene_proc ) ) ); -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < nSlots; slot++ ) -#else - for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif { for ( ch = 0; ch < 2; ch++ ) { @@ -1736,9 +1609,7 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, -#ifdef JBM_TSM_ON_TCS const int16_t nSlots, -#endif float Rmat[3][3] ) { int16_t slot, bin, ch; @@ -1761,11 +1632,7 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( /* When currently in interpolation */ if ( hHeadTrackData->lrSwitchedNext != hHeadTrackData->lrSwitchedCurrent ) { -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < nSlots; slot++ ) -#else - for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif { float switchOrderFactor, origOrderFactor; @@ -1821,11 +1688,7 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( /* If not in interpolation, but in switched prototype situation, then switch left and right channels */ if ( hHeadTrackData->lrSwitchedCurrent == 1 ) { -#ifdef JBM_TSM_ON_TCS for ( slot = 0; slot < nSlots; slot++ ) -#else - for ( slot = 0; slot < CLDFB_SLOTS_PER_SUBFRAME; slot++ ) -#endif { for ( bin = 0; bin < nBins; bin++ ) { diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index 7875165e51..951d950211 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -172,11 +172,7 @@ void ivas_limiter_close( void ivas_limiter_dec( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ -#ifdef JBM_TSM_ON_TCS float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ -#else - float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */ -#endif const int16_t num_channels, /* i : number of channels to be processed */ const int16_t output_frame, /* i : number of samples per channel in the buffer */ const int16_t BER_detect /* i : BER detect flag */ diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index cb71f5b731..361d017629 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -264,11 +264,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ -#else - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ -#endif const int16_t output_frame /* i : output frame length */ ) { @@ -277,7 +273,6 @@ ivas_error ivas_td_binaural_renderer_unwrap( float reverb_signal[BINAURAL_CHANNELS][L_FRAME48k]; ivas_error error; int16_t c_indx, nS; -#ifdef JBM_TSM_ON_TCS float *p_reverb_signal[BINAURAL_CHANNELS]; int16_t ch; @@ -285,7 +280,6 @@ ivas_error ivas_td_binaural_renderer_unwrap( { p_reverb_signal[ch] = reverb_signal[ch]; } -#endif subframe_length = output_frame / MAX_PARAM_SPATIAL_SUBFRAMES; @@ -312,11 +306,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) { -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -348,11 +338,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ -#else - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ -#endif const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ @@ -633,7 +619,6 @@ ivas_error ivas_td_binaural_renderer_ext( AUDIO_CONFIG transport_config; ivas_error error; int16_t ism_md_subframe_update_ext; -#ifdef JBM_TSM_ON_TCS float *p_output[MAX_OUTPUT_CHANNELS]; int16_t ch; @@ -641,7 +626,6 @@ ivas_error ivas_td_binaural_renderer_ext( { p_output[ch] = output[ch]; } -#endif push_wmops( "ivas_td_binaural_renderer_ext" ); @@ -681,15 +665,9 @@ ivas_error ivas_td_binaural_renderer_ext( hIsmMetaData[0]->non_diegetic_flag = currentPos->non_diegetic_flag; } -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, output, output_frame ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index f59ab91e0d..e1328ca9d3 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -92,11 +92,7 @@ void ivas_limiter_close( void ivas_limiter_dec ( IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ -#ifdef JBM_TSM_ON_TCS float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ -#else - float output[MAX_OUTPUT_CHANNELS][L_FRAME48k], /* i/o: input/output buffer */ -#endif const int16_t num_channels, /* i : number of channels to be processed */ const int16_t output_frame, /* i : number of samples per channel in the buffer */ const int16_t BER_detect /* i : BER detect flag */ @@ -159,7 +155,6 @@ void ivas_dirac_dec_binaural( const int16_t nchan_transport /* i : number of transport channels */ ); -#ifdef JBM_TSM_ON_TCS void ivas_dirac_dec_binaural_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ const uint16_t nSamplesAsked, /* i : number of CLDFB slots requested */ @@ -168,7 +163,6 @@ void ivas_dirac_dec_binaural_render( const int16_t nchan_transport, /* i : number of transport channels */ float *output_f[] /* o : rendered time signal */ ); -#endif ivas_error ivas_dirac_dec_init_binaural_data( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ @@ -237,11 +231,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ const int16_t ism_md_subframe_update, -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: SCE channels / Binaural synthesis */ -#else - float output[][L_FRAME48k], /* i/o: SCE channels / Binaural synthesis */ -#endif const int16_t output_frame /* i : output frame length */ ); @@ -283,11 +273,7 @@ void ivas_td_binaural_close( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ -#else - float output[][L_FRAME48k], /* i/o: ISM object synth / rendered output in 0,1 */ -#endif const int16_t subframe_length, /* i/o: subframe length */ const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ const int16_t ism_md_subframe_update /* Number of subframes to delay metadata to sync with audio */ @@ -517,15 +503,10 @@ ivas_error ivas_rend_crendProcess( HEAD_TRACK_DATA_HANDLE hHeadTrackData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: input/output audio channels */ -#else - float output[][L_FRAME48k], /* i/o: input/output audio channels */ -#endif const int32_t output_Fs ); -#ifdef JBM_TSM_ON_TCS ivas_error ivas_rend_crendProcessSubframe( const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ const AUDIO_CONFIG inConfig, /* i : input audio configuration */ @@ -540,7 +521,6 @@ ivas_error ivas_rend_crendProcessSubframe( const int16_t n_samples_to_render, /* i : output frame length per channel */ const int32_t output_Fs /* i : output sampling rate */ ); -#endif /*----------------------------------------------------------------------------------* * Reverberator @@ -565,17 +545,13 @@ void ivas_binaural_reverb_close( void ivas_binaural_reverb_processSubframe( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const int16_t numInChannels, /* i : num input channels to be processed */ -#ifdef JBM_TSM_ON_TCS const int16_t numSlots, /* i : number of slots to be processed */ -#endif float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real */ float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ float outImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX] /* o : output CLDFB data imag */ ); -#ifdef JBM_TSM_ON_TCS -#endif ivas_error ivas_reverb_open( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */ @@ -593,13 +569,8 @@ ivas_error ivas_reverb_process( const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ -#ifdef JBM_TSM_ON_TCS float *pcm_in[], /* i : the PCM audio to apply reverb on */ float *pcm_out[], /* o : the PCM audio with reverb applied */ -#else - float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ - float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ -#endif const int16_t i_ts /* i : subframe index */ ); @@ -822,11 +793,7 @@ void SHrotmatgen( void rotateFrame_shd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ -#else - float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ -#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const int16_t subframe_idx /* i : subframe index */ @@ -834,11 +801,7 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: unrotated SD signal buffer in TD */ -#else - float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ -#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ @@ -850,9 +813,7 @@ void rotateFrame_shd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ -#ifdef JBM_TSM_ON_TCS const int16_t numTimeSlots, /* i : number of time slots to process */ -#endif const int16_t shd_rot_max_order /* i : split-order rotation method */ ); @@ -862,9 +823,7 @@ void rotateFrame_sd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ -#ifdef JBM_TSM_ON_TCS const int16_t numTimeSlots, /* i : number of time slots to process */ -#endif const int16_t nb_band /* i : number of CLDFB bands to process */ ); diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index baa83fad0e..856914a58c 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1437,11 +1437,7 @@ static void reverb_block( static ivas_error downmix_input_block( const REVERB_HANDLE hReverb, -#ifdef JBM_TSM_ON_TCS float *pcm_in[], -#else - float pcm_in[][L_FRAME48k], -#endif const AUDIO_CONFIG input_audio_config, float *pPcm_out, const int16_t input_offset ) @@ -1583,13 +1579,8 @@ ivas_error ivas_reverb_process( const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ -#ifdef JBM_TSM_ON_TCS float *pcm_in[], /* i : the PCM audio to apply reverb on */ float *pcm_out[], /* o : the PCM audio with reverb applied */ -#else - float pcm_in[][L_FRAME48k], /* i : the PCM audio to apply reverb on */ - float pcm_out[][L_FRAME48k], /* o : the PCM audio with reverb applied */ -#endif const int16_t i_ts /* i : subframe index */ ) { @@ -1628,9 +1619,7 @@ ivas_error ivas_reverb_process( void ivas_binaural_reverb_processSubframe( REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ const int16_t numInChannels, /* i : num inputs to be processed */ -#ifdef JBM_TSM_ON_TCS const int16_t numSlots, /* i : number of slots to be processed */ -#endif float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ @@ -1647,7 +1636,6 @@ void ivas_binaural_reverb_processSubframe( * for convolution purposes later on. */ for ( bin = 0; bin < hReverb->numBins; bin++ ) { -#ifdef JBM_TSM_ON_TCS /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + numSlots, hReverb->loopBufLength[bin] ); mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + numSlots, hReverb->loopBufLength[bin] ); @@ -1657,32 +1645,13 @@ void ivas_binaural_reverb_processSubframe( * is decorrelated later on. */ v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], numSlots ); v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], numSlots ); -#else - /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ - mvr2r( hReverb->loopBufReal[bin], hReverb->loopBufReal[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); - mvr2r( hReverb->loopBufImag[bin], hReverb->loopBufImag[bin] + hReverb->blockSize, hReverb->loopBufLength[bin] ); - - /* Add the data from the end of the loop to the beginning, with an attenuation factor - * according to RT60. This procedure generates an IIR decaying response. The response - * is decorrelated later on. */ - v_multc( hReverb->loopBufReal[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufReal[bin], hReverb->blockSize ); - v_multc( hReverb->loopBufImag[bin] + hReverb->loopBufLength[bin], hReverb->loopAttenuationFactor[bin], hReverb->loopBufImag[bin], hReverb->blockSize ); -#endif } /* 2) Apply the determined pre-delay to the input audio, and add the delayed audio to the loop. */ idx = hReverb->preDelayBufferIndex; -#ifdef JBM_TSM_ON_TCS for ( sample = 0; sample < numSlots; sample++ ) -#else - for ( sample = 0; sample < hReverb->blockSize; sample++ ) -#endif { -#ifdef JBM_TSM_ON_TCS invertSampleIndex = numSlots - sample - 1; -#else - invertSampleIndex = hReverb->blockSize - sample - 1; -#endif for ( bin = 0; bin < hReverb->numBins; bin++ ) { @@ -1725,20 +1694,14 @@ void ivas_binaural_reverb_processSubframe( phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch]; /* Flush output */ -#ifdef JBM_TSM_ON_TCS set_f( hReverb->outputBufferReal[bin][ch], 0.0f, numSlots ); set_f( hReverb->outputBufferImag[bin][ch], 0.0f, numSlots ); -#else - set_f( hReverb->outputBufferReal[bin][ch], 0.0f, hReverb->blockSize ); - set_f( hReverb->outputBufferImag[bin][ch], 0.0f, hReverb->blockSize ); -#endif /* Add from temporally decaying sparse tap locations the audio to the output. */ for ( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) { switch ( phaseShiftTypePr[tapIdx] ) { -#ifdef JBM_TSM_ON_TCS case 0: /* 0 degrees phase */ v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); @@ -1755,24 +1718,6 @@ void ivas_binaural_reverb_processSubframe( v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], numSlots ); v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], numSlots ); break; -#else - case 0: /* 0 degrees phase */ - v_add( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); - v_add( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); - break; - case 1: /* 90 degrees phase */ - v_sub( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); - v_add( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); - break; - case 2: /* 180 degrees phase */ - v_sub( hReverb->outputBufferReal[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); - v_sub( hReverb->outputBufferImag[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); - break; - default: /* 270 degrees phase */ - v_add( hReverb->outputBufferReal[bin][ch], tapImagPr[tapIdx], hReverb->outputBufferReal[bin][ch], hReverb->blockSize ); - v_sub( hReverb->outputBufferImag[bin][ch], tapRealPr[tapIdx], hReverb->outputBufferImag[bin][ch], hReverb->blockSize ); - break; -#endif } } } @@ -1782,11 +1727,7 @@ void ivas_binaural_reverb_processSubframe( { if ( hReverb->useBinauralCoherence ) { -#ifdef JBM_TSM_ON_TCS for ( sample = 0; sample < numSlots; sample++ ) -#else - for ( sample = 0; sample < hReverb->blockSize; sample++ ) -#endif { float leftRe, rightRe, leftIm, rightIm; @@ -1807,18 +1748,10 @@ void ivas_binaural_reverb_processSubframe( /* 4) Write data to output */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) { -#ifdef JBM_TSM_ON_TCS for ( sample = 0; sample < numSlots; sample++ ) -#else - for ( sample = 0; sample < hReverb->blockSize; sample++ ) -#endif { /* Audio was in the temporally inverted order for convolution, re-invert audio to output */ -#ifdef JBM_TSM_ON_TCS invertSampleIndex = numSlots - sample - 1; -#else - invertSampleIndex = hReverb->blockSize - sample - 1; -#endif for ( bin = 0; bin < hReverb->numBins; bin++ ) { @@ -1837,8 +1770,6 @@ void ivas_binaural_reverb_processSubframe( return; } -#ifdef JBM_TSM_ON_TCS -#endif /*------------------------------------------------------------------------- * ivas_binaural_reverb_open() diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 79ef75e470..5f4a54a3c5 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -250,11 +250,7 @@ void rotateAziEle( void rotateFrame_shd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ -#else - float output[][L_FRAME48k], /* i/o: unrotated HOA3 signal buffer in TD */ -#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const int16_t subframe_idx /* i : subframe index */ @@ -357,11 +353,7 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#ifdef JBM_TSM_ON_TCS float *output[], /* i/o: unrotated SD signal buffer in TD */ -#else - float output[][L_FRAME48k], /* i/o: unrotated SD signal buffer in TD */ -#endif const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ @@ -499,9 +491,7 @@ void rotateFrame_shd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ -#ifdef JBM_TSM_ON_TCS const int16_t numTimeSlots, /* i : number of time slots to process */ -#endif const int16_t shd_rot_max_order /* i : split-order rotation method */ ) { @@ -525,11 +515,7 @@ void rotateFrame_shd_cldfb( SHrotmatgen( SHrotmat, Rmat, shd_rot_max_order ); /* rotation by mtx multiplication */ -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < numTimeSlots; i++ ) -#else - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) -#endif { for ( iBand = 0; iBand < CLDFB_NO_CHANNELS_MAX; iBand++ ) { @@ -600,9 +586,7 @@ void rotateFrame_sd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ -#ifdef JBM_TSM_ON_TCS const int16_t numTimeSlots, /* i : number of time slots to process */ -#endif const int16_t nb_band /* i : number of CLDFB bands to process */ ) { @@ -661,11 +645,7 @@ void rotateFrame_sd_cldfb( p_imagRot = imagRot[n]; if ( g1 > 0.f ) { -#ifdef JBM_TSM_ON_TCS for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ ) -#else - for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) -#endif { p_real = Cldfb_RealBuffer[m][iBlock]; p_imag = Cldfb_ImagBuffer[m][iBlock]; @@ -685,11 +665,7 @@ void rotateFrame_sd_cldfb( { p_realRot = realRot[n]; p_imagRot = imagRot[n]; -#ifdef JBM_TSM_ON_TCS for ( iBlock = 0; iBlock < numTimeSlots; iBlock++ ) -#else - for ( iBlock = 0; iBlock < MAX_PARAM_SPATIAL_SUBFRAMES; iBlock++ ) -#endif { p_real = Cldfb_RealBuffer[n][iBlock]; p_imag = Cldfb_ImagBuffer[n][iBlock]; diff --git a/lib_rend/ivas_sba_rendering.c b/lib_rend/ivas_sba_rendering.c index 059cd847e1..0974677922 100644 --- a/lib_rend/ivas_sba_rendering.c +++ b/lib_rend/ivas_sba_rendering.c @@ -66,9 +66,7 @@ void ivas_sba_prototype_renderer( int16_t cldfb_band; int16_t out_ch, in_ch; int16_t firstInCh, inChEnd, firstOutCh, outChEnd; -#ifdef JBM_TSM_ON_TCS int16_t slot_idx_start, md_idx; -#endif push_wmops( "ivas_sba_prototype_renderer" ); @@ -79,9 +77,7 @@ void ivas_sba_prototype_renderer( num_cldfb_bands = hSpar->hFbMixer->pFb->fb_bin_to_band.num_cldfb_bands; numch_in = hSpar->hFbMixer->fb_cfg->num_in_chans; numch_out = hSpar->hFbMixer->fb_cfg->num_out_chans; -#ifdef JBM_TSM_ON_TCS slot_idx_start = hSpar->slots_rendered; -#endif if ( st_ivas->nchan_transport == 1 ) { @@ -99,19 +95,11 @@ void ivas_sba_prototype_renderer( } /* Apply mixing matrix */ -#ifdef JBM_TSM_ON_TCS for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) -#else - for ( ts = 0; ts < CLDFB_SLOTS_PER_SUBFRAME; ts++ ) -#endif { /* determine SPAR parameters for this time slot */ -#ifdef JBM_TSM_ON_TCS md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); -#else - ivas_spar_get_parameters( hSpar, hDecoderConfig, ts + subframe * CLDFB_SLOTS_PER_SUBFRAME, numch_out, numch_in, num_spar_bands, mixer_mat ); -#endif for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) { @@ -155,7 +143,6 @@ void ivas_sba_prototype_renderer( } } -#ifdef JBM_TSM_ON_TCS /* Update mixing matrices */ if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) { @@ -179,38 +166,13 @@ void ivas_sba_prototype_renderer( } } } -#endif } -#ifndef JBM_TSM_ON_TCS - /* Update mixing matrices */ - hSpar->i_subframe++; - hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - - for ( out_ch = 0; out_ch < numch_out; out_ch++ ) - { - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) - { - for ( b = 0; b < num_spar_bands; b++ ) - { - hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + subframe * IVAS_MAX_NUM_BANDS]; - } - } - } -#endif /* Create prototypes */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) { -#ifdef JBM_TSM_ON_TCS for ( ts = 0; ts < hSpar->subframe_nbslots[subframe]; ts++ ) -#else - for ( ts = 0; ts < CLDFB_SLOTS_PER_SUBFRAME; ts++ ) -#endif { if ( st_ivas->nchan_transport == 1 ) /* Dual mono */ { @@ -236,10 +198,8 @@ void ivas_sba_prototype_renderer( } } -#ifdef JBM_TSM_ON_TCS hSpar->subframes_rendered++; hSpar->slots_rendered += hSpar->subframe_nbslots[subframe]; -#endif pop_wmops(); return; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 3810cb1918..e9d4b2d5e6 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2473,9 +2473,7 @@ static DecoderDummy *initDecoderDummy( decDummy->hDecoderConfig->output_Fs = sampleRate; decDummy->hDecoderConfig->nchan_out = numOutChannels; decDummy->hDecoderConfig->Opt_Headrotation = 0; -#ifdef JBM_TSM_ON_TCS decDummy->hDecoderConfig->voip_active = 0; -#endif decDummy->hBinRenderer = NULL; decDummy->hEFAPdata = NULL; @@ -2492,9 +2490,7 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData = NULL; decDummy->hDirAC = NULL; #endif -#ifdef JBM_TSM_ON_TCS decDummy->hTcBuffer = NULL; -#endif decDummy->hDecoderConfig->output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); decDummy->nchan_transport = numTransChannels; @@ -2544,10 +2540,8 @@ static DecoderDummy *initDecoderDummy( decDummy->hRenderConfig = NULL; } -#ifdef JBM_TSM_ON_TCS /* get a default TC buffer, needed for some renderers */ ivas_jbm_dec_tc_buffer_open( decDummy, TC_BUFFER_MODE_NONE, 0, 0, 0, 1 ); -#endif decDummy->renderer_type = RENDERER_DISABLE; @@ -2656,10 +2650,8 @@ static void freeDecoderDummy( /* Parametric binaural renderer handle */ ivas_dirac_dec_close_binaural_data( &pDecDummy->hDiracDecBin ); -#ifdef JBM_TSM_ON_TCS /* TC buffer */ ivas_jbm_dec_tc_buffer_close( &pDecDummy->hTcBuffer ); -#endif free( pDecDummy ); pDecDummy = NULL; @@ -4383,14 +4375,12 @@ static ivas_error renderIsmToBinauralRoom( IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioObjectPosition rotatedPos; const IVAS_REND_HeadRotData *headRotData; -#ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpRendBuffer[i] = tmpRendBuffer[i]; } -#endif push_wmops( "renderIsmToBinauralRoom" ); @@ -4489,13 +4479,8 @@ static ivas_error renderIsmToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, - NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -4763,7 +4748,6 @@ static ivas_error renderMcToBinaural( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; -#ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; @@ -4771,7 +4755,6 @@ static ivas_error renderMcToBinaural( { p_tmpRendBuffer[i] = tmpRendBuffer[i]; } -#endif push_wmops( "renderMcToBinaural" ); @@ -4812,13 +4795,8 @@ static ivas_error renderMcToBinaural( } /* call CREND */ -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -4846,7 +4824,6 @@ static ivas_error renderMcToBinauralRoom( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; -#ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; @@ -4854,7 +4831,6 @@ static ivas_error renderMcToBinauralRoom( { p_tmpRendBuffer[i] = tmpRendBuffer[i]; } -#endif push_wmops( "renderMcToBinauralRoom" ); @@ -4895,13 +4871,8 @@ static ivas_error renderMcToBinauralRoom( } /* call CREND */ -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -4932,9 +4903,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; -#ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; -#endif push_wmops( "renderMcCustomLsToBinauralRoom" ); @@ -4942,12 +4911,10 @@ static ivas_error renderMcCustomLsToBinauralRoom( headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; } -#endif /* apply rotation */ if ( headRotEnabled ) @@ -4982,13 +4949,8 @@ static ivas_error renderMcCustomLsToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, - tmpCrendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -5188,19 +5150,15 @@ static ivas_error renderSbaToBinaural( float tmpCrendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; -#ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; -#endif push_wmops( "renderSbaToBinaural" ); -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; } -#endif /* apply rotation */ if ( sbaInput->base.ctx.pHeadRotData->headRotEnabled ) @@ -5225,13 +5183,8 @@ static ivas_error renderSbaToBinaural( } /* call CREND */ -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( sbaInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -5256,20 +5209,16 @@ static ivas_error renderSbaToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; -#ifdef JBM_TSM_ON_TCS float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; -#endif tmpRotBuffer = outAudio; /* avoid compilation warning */ push_wmops( "renderSbaToBinauralRoom" ); -#ifdef JBM_TSM_ON_TCS for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; } -#endif headRotEnabled = sbaInput->base.ctx.pHeadRotData->headRotEnabled; @@ -5309,13 +5258,8 @@ static ivas_error renderSbaToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpCrendBuffer ); /* call CREND */ -#ifdef JBM_TSM_ON_TCS if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, NULL, NULL, NULL, p_tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcess( sbaInput->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, tmpCrendBuffer, *sbaInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -5467,11 +5411,7 @@ static void renderMasaToMc( } else { -#ifdef JBM_TSM_ON_TCS ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); -#else - ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, NULL, NULL, -1 ); -#endif } accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); @@ -5488,11 +5428,7 @@ static void renderMasaToSba( copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC ); -#ifdef JBM_TSM_ON_TCS ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); -#else - ivas_dirac_dec( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels, NULL, NULL, -1 ); -#endif accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); -- GitLab From 15e8c00c27d4069764a255a251a85f60f31cc122 Mon Sep 17 00:00:00 2001 From: Marek Szczerba Date: Tue, 6 Jun 2023 22:05:36 +0200 Subject: [PATCH 251/381] clang formatting updates --- lib_rend/ivas_render_config.c | 2 +- lib_rend/lib_rend.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index 019df4d790..8ada1a8c83 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -99,7 +99,7 @@ void ivas_render_config_close( *-------------------------------------------------------------------*/ ivas_error ivas_render_config_init_from_rom( - RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ + RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ #ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG , const int16_t room_flag_on /* i : room effect on/off flag */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 5ae274f84d..6892ddb239 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4639,11 +4639,11 @@ static ivas_error renderIsmToBinauralRoom( #endif #else #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, - NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, + NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #else - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, - NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, + NULL, NULL, NULL, NULL, tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif #endif { -- GitLab From a70b76c590791f0db6d92a0b0172bdaa4393697b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:06:32 +0200 Subject: [PATCH 252/381] [cleanup] accept FIX_DTX_428 --- lib_com/ivas_dirac_com.c | 16 ---------------- lib_com/options.h | 1 - lib_enc/ivas_sba_enc.c | 6 ------ 3 files changed, 23 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 55d9911c3e..3ff512a26c 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -528,22 +528,6 @@ ivas_error ivas_dirac_sba_config( { return error; } -#if !defined( FIX_DTX_428 ) - { - int16_t dir, j; - for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) - { - for ( j = 0; j < nbands_coded; j++ ) - { - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - hQMetaData->q_direction[dir].band_data[j].energy_ratio_index[i] = 0; - hQMetaData->q_direction[dir].band_data[j].energy_ratio_index_mod[i] = 0; - } - } - } - } -#endif } ivas_get_dirac_sba_max_md_bits( sba_total_brate, diff --git a/lib_com/options.h b/lib_com/options.h index 14b5e1b921..3eb7c01d95 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_DTX_428 /* FhG: fix for issue 428, crash with DTX and bitrate switching */ #define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ #define FIX_MDCT_ST_PLC_FADEOUT_DELAY #define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index c26f8e9983..a1a505f67a 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -121,10 +121,8 @@ ivas_error ivas_sba_enc_reconfigure( SPAR_ENC_HANDLE hSpar; int16_t analysis_order_old; int16_t spar_reconfig_flag; -#ifdef FIX_DTX_428 int16_t nbands_old; int16_t ndir_old; -#endif spar_reconfig_flag = 0; nchan_transport_old = st_ivas->nchan_transport; @@ -132,10 +130,8 @@ ivas_error ivas_sba_enc_reconfigure( nSCE_old = st_ivas->nSCE; st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, hEncoderConfig->sba_order ); analysis_order_old = ivas_sba_get_analysis_order( hEncoderConfig->last_ivas_total_brate, hEncoderConfig->sba_order ); -#ifdef FIX_DTX_428 nbands_old = st_ivas->hQMetaData->q_direction->cfg.nbands; ndir_old = st_ivas->hQMetaData->no_directions; -#endif if ( analysis_order_old != st_ivas->sba_analysis_order ) { @@ -250,7 +246,6 @@ ivas_error ivas_sba_enc_reconfigure( { return error; } -#ifdef FIX_DTX_428 if ( st_ivas->hQMetaData->q_direction->cfg.nbands != nbands_old || st_ivas->hQMetaData->no_directions != ndir_old ) { int16_t dir, j, i; @@ -267,7 +262,6 @@ ivas_error ivas_sba_enc_reconfigure( } } } -#endif #ifndef SBA_MODE_CLEAN_UP mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); #endif -- GitLab From f2308d398cfa462afd3b06befdcb160e6a25ba69 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:07:19 +0200 Subject: [PATCH 253/381] [cleanup] accept FIX_STEREO_474 --- lib_com/ivas_prot.h | 4 ---- lib_com/options.h | 1 - lib_dec/ivas_cpe_dec.c | 2 -- lib_dec/ivas_sba_dirac_stereo_dec.c | 12 ------------ lib_dec/ivas_stereo_dft_dec.c | 4 ---- 5 files changed, 23 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 729b1fced2..6ba8a133ec 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1315,10 +1315,8 @@ void stereo_dft_dec( const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs, /* i : Fs for delay calculation */ const int16_t nchan_transport /* i : number of transpor channels */ -#ifdef FIX_STEREO_474 , const int16_t num_md_sub_frames /* i: number of MD subframes */ -#endif ); void stereo_dft_res_ecu( @@ -3529,10 +3527,8 @@ void ivas_sba_dirac_stereo_smooth_parameters( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs /* i : Fs for delay calculation */ -#ifdef FIX_STEREO_474 , const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ -#endif ); void ivas_sba2mc_cldfb( diff --git a/lib_com/options.h b/lib_com/options.h index 3eb7c01d95..e3988e45d2 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_STEREO_474 /* FhG fix for issue 574, crash with SBA to stereo output at 512 kbps */ #define FIX_MDCT_ST_PLC_FADEOUT_DELAY #define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index a19fb21dc2..f0d550649d 100755 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -406,10 +406,8 @@ ivas_error ivas_cpe_dec( else { stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 -#ifdef FIX_STEREO_474 , MAX_PARAM_SPATIAL_SUBFRAMES -#endif ); } diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 13f1401f8e..7a5b492102 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -697,10 +697,8 @@ void ivas_sba_dirac_stereo_smooth_parameters( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD handle for upmixing */ const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs /* i : Fs for delay calculation */ -#ifdef FIX_STEREO_474 , const int16_t num_md_sub_frames /* i : number of subframes in mixing matrix */ -#endif ) { int16_t i, j, k, i_sf; @@ -740,9 +738,7 @@ void ivas_sba_dirac_stereo_smooth_parameters( float xfade_start_ns; int16_t xfade_delay_subframes; int16_t i_hist; -#ifdef FIX_STEREO_474 int16_t md_sf; -#endif xfade_start_ns = cross_fade_start_offset / (float) output_Fs * 1000000000.f - IVAS_FB_ENC_DELAY_NS; xfade_delay_subframes = (int16_t) ( xfade_start_ns / ( FRAME_SIZE_NS / MAX_PARAM_SPATIAL_SUBFRAMES ) ); @@ -754,9 +750,7 @@ void ivas_sba_dirac_stereo_smooth_parameters( for ( i_sf = k * 2; i_sf < ( k + 1 ) * 2; i_sf++ ) { -#ifdef FIX_STEREO_474 md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? i_sf : 0; -#endif if ( hStereoDft->first_frame ) { @@ -802,11 +796,7 @@ void ivas_sba_dirac_stereo_smooth_parameters( { for ( b = 0; b < hStereoDft->nbands; b++ ) { -#ifdef FIX_STEREO_474 hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + md_sf * IVAS_MAX_NUM_BANDS]; -#else - hMdDec->mixer_mat_prev[4][i][j][b] = hMdDec->mixer_mat[i][j][b + i_sf * IVAS_MAX_NUM_BANDS]; -#endif } } } @@ -916,10 +906,8 @@ void ivas_sba_dirac_stereo_dec( ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : NULL, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hFbMixer->cross_fade_start_offset : 0, st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport -#ifdef FIX_STEREO_474 , ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) -#endif ); /* DFT synthesis */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 5c2d0b37e6..36d8eb662b 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1131,10 +1131,8 @@ void stereo_dft_dec( const int16_t cross_fade_start_offset, /* i : SPAR mixer delay compensation */ const int32_t output_Fs, /* i : Fs for delay calculation */ const int16_t nchan_transport /* i : number of transpor channels */ -#ifdef FIX_STEREO_474 , const int16_t num_md_sub_frames /* i: number of MD subframes */ -#endif ) { int16_t i, k, b, N_div, stop; @@ -1213,10 +1211,8 @@ void stereo_dft_dec( hMdDec, cross_fade_start_offset, output_Fs -#ifdef FIX_STEREO_474 , num_md_sub_frames -#endif ); } else -- GitLab From 7179baef36b99f7dd293ecd13de45b76de120f93 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:08:44 +0200 Subject: [PATCH 254/381] [cleanup] accept FIX_MDCT_ST_PLC_FADEOUT_DELAY --- lib_com/ivas_cnst.h | 2 -- lib_com/options.h | 1 - lib_dec/er_dec_tcx.c | 12 ------------ 3 files changed, 15 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9c657f69e7..9d74a26033 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -869,9 +869,7 @@ enum fea_names #define MDCT_ST_PLC_FADEOUT_MIN_NOISE_NRG 0.001f #define MDCT_ST_PLC_FADEOUT_MAX_CONC_FRAME 2 * FRAMES_PER_SEC #define MDCT_ST_PLC_FADEOUT_TO_ZERO_LEN 20 -#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY #define MDCT_ST_PLC_FADEOUT_DELAY_4_LSP_FADE 3 -#endif typedef enum { EQUAL_CORES, diff --git a/lib_com/options.h b/lib_com/options.h index e3988e45d2..d67ccf54a3 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_MDCT_ST_PLC_FADEOUT_DELAY #define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ #define FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR /* Eri: Fix for issue 462: Use-of-uninitialized memory in external HRTF deallocation in decoder together with BR switching */ diff --git a/lib_dec/er_dec_tcx.c b/lib_dec/er_dec_tcx.c index fb797f92c9..24a4817052 100644 --- a/lib_dec/er_dec_tcx.c +++ b/lib_dec/er_dec_tcx.c @@ -553,7 +553,6 @@ void con_tcx( if ( A_cng != NULL ) { -#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY float alpha_delayed; alpha_delayed = 1.0f; @@ -563,27 +562,16 @@ void con_tcx( } if ( st->plcBackgroundNoiseUpdated && alpha_delayed != 1.0f ) -#else - if ( st->plcBackgroundNoiseUpdated && alpha != 1.0f ) -#endif { float lsp_local[M], lsp_fade[M], alpha_inv; -#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY alpha_inv = 1.0f - alpha_delayed; -#else - alpha_inv = 1.0f - alpha; -#endif a2lsp_stab( A_local, lsp_local, lsp_local ); for ( i = 0; i < M; i++ ) { -#ifdef FIX_MDCT_ST_PLC_FADEOUT_DELAY lsp_fade[i] = alpha_delayed * lsp_local[i] + alpha_inv * st->lspold_cng[i]; -#else - lsp_fade[i] = alpha * lsp_local[i] + alpha_inv * st->lspold_cng[i]; -#endif } lsp2a_stab( lsp_fade, A_local, M ); -- GitLab From 4aaff20de7841c7ad23f7a85a37a528885f77fba Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:10:09 +0200 Subject: [PATCH 255/381] [cleanup] accept FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index d67ccf54a3..45d3e1dea0 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_DIRAC_LS_SYNTHESIS_CONFIG_479 /* FhG: fix for issue 479, broken LS output with DirAC at high BRs */ #define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ #define FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR /* Eri: Fix for issue 462: Use-of-uninitialized memory in external HRTF deallocation in decoder together with BR switching */ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ -- GitLab From 40408d53ac60e2910125e51a01f9f02fbb6b00f1 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:10:53 +0200 Subject: [PATCH 256/381] [cleanup] accept HYBRID_ITD_MAX --- lib_com/ivas_prot.h | 2 -- lib_com/options.h | 1 - lib_enc/ivas_cpe_enc.c | 2 -- lib_enc/ivas_stat_enc.h | 2 -- lib_enc/ivas_stereo_dft_enc.c | 4 ---- lib_enc/ivas_stereo_dft_enc_itd.c | 10 ---------- lib_enc/ivas_stereo_dft_td_itd.c | 2 -- 7 files changed, 23 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 6ba8a133ec..e0375afbb1 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1550,10 +1550,8 @@ int16_t read_BS_adapt_GR_sg( void stereo_dft_hybrid_ITD_flag( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const int32_t input_Fs /* i : CPE element sampling rate */ -#ifdef HYBRID_ITD_MAX , const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ -#endif ); void stereo_dft_enc_compute_itd( diff --git a/lib_com/options.h b/lib_com/options.h index 45d3e1dea0..b59d490f0e 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define HYBRID_ITD_MAX /* FhG: Improvement for DFT-stereo for cases with large ITDs */ #define FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR /* Eri: Fix for issue 462: Use-of-uninitialized memory in external HRTF deallocation in decoder together with BR switching */ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ #define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 5f19a5395a..0f3fffb369 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -334,10 +334,8 @@ ivas_error ivas_cpe_enc( if ( hCPE->element_mode == IVAS_CPE_DFT ) { stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs -#ifdef HYBRID_ITD_MAX , hCPE->hStereoDft->hItd->hybrid_itd_max -#endif ); /* Time Domain ITD compensation using extrapolation */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index a4bd36207d..5c9f02e4d4 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -81,10 +81,8 @@ typedef struct stereo_itd_data_struct int16_t prev_itd1; int16_t prev_itd2; -#ifdef HYBRID_ITD_MAX /*flag for hybrid ITD for very large ITDs*/ int16_t hybrid_itd_max; -#endif } ITD_DATA, *ITD_DATA_HANDLE; typedef struct dft_ana_struct diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 36e577b482..94ee7bddf6 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -298,10 +298,8 @@ ivas_error stereo_dft_enc_create( stereo_dft_enc_open( hStereoDft_loc, input_Fs, max_bwidth ); stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs -#ifdef HYBRID_ITD_MAX , hStereoDft_loc->hItd->hybrid_itd_max -#endif ); *hStereoDft = hStereoDft_loc; @@ -567,9 +565,7 @@ void stereo_enc_itd_init( hItd->prev_itd1 = 0; hItd->prev_itd2 = 0; -#ifdef HYBRID_ITD_MAX hItd->hybrid_itd_max = 0; -#endif return; } diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c index 025729e0cd..fd438bcd3f 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -115,18 +115,14 @@ static void set_band_limits( void stereo_dft_hybrid_ITD_flag( STEREO_DFT_CONFIG_DATA_HANDLE hConfig, /* o : DFT stereo configuration */ const int32_t input_Fs /* i : CPE element sampling rate */ -#ifdef HYBRID_ITD_MAX , const int16_t hybrid_itd_max /* i : flag for hybrid ITD for very large ITDs */ -#endif ) { if ( hConfig != NULL ) { if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) -#ifdef HYBRID_ITD_MAX || ( hybrid_itd_max == 1 ) -#endif ) { hConfig->hybrid_itd_flag = 1; @@ -650,10 +646,8 @@ void stereo_dft_enc_compute_itd( float cng_xcorr_filt; -#ifdef HYBRID_ITD_MAX int16_t prev_itd_max; int16_t itd_max_flip; -#endif if ( hCPE->element_mode == IVAS_CPE_DFT ) { @@ -1341,12 +1335,10 @@ void stereo_dft_enc_compute_itd( hItd->prev_sum_nrg_L_lb = sum_nrg_L_lb; mvr2r( xcorr_lb, hItd->prev_xcorr_lb, STEREO_DFT_XCORR_LB_MAX ); } -#ifdef HYBRID_ITD_MAX /*save previous flag*/ prev_itd_max = hItd->hybrid_itd_max; /* enable hybrid ITD handling for very large ITDs*/ hItd->hybrid_itd_max = ( abs( itd ) > STEREO_DFT_ITD_MAX && abs( itd ) < STEREO_DFT_ITD_MAX_ANA && !hCPE->hCoreCoder[0]->sp_aud_decision0 && hCPE->element_brate < IVAS_32k ); -#endif /* Update memory */ hItd->prev_itd = itd; @@ -1371,7 +1363,6 @@ void stereo_dft_enc_compute_itd( hItd->deltaItd[k_offset] = hItd->itd[k_offset] - hItd->td_itd[k_offset]; -#ifdef HYBRID_ITD_MAX if ( hItd->hybrid_itd_max ) { /*check if there is an ITD flip*/ @@ -1388,7 +1379,6 @@ void stereo_dft_enc_compute_itd( { hItd->hybrid_itd_max = -1; } -#endif #ifdef DEBUG_MODE_DFT { diff --git a/lib_enc/ivas_stereo_dft_td_itd.c b/lib_enc/ivas_stereo_dft_td_itd.c index 27a71dfae4..613fd33424 100644 --- a/lib_enc/ivas_stereo_dft_td_itd.c +++ b/lib_enc/ivas_stereo_dft_td_itd.c @@ -271,14 +271,12 @@ void stereo_td_itd( hITD->td_itd_32k[i] = hITD->td_itd_32k[i + 1]; } } -#ifdef HYBRID_ITD_MAX /*reset TD ITDs in case of hybrid itd_max change - turn hybrid ITD off*/ if ( hITD->hybrid_itd_max == -1 && hybrid_itd_flag == 0 ) { hITD->td_itd[k_offset] = 0; hITD->td_itd_32k[k_offset] = 0; } -#endif if ( hybrid_itd_flag == 0 ) { return; -- GitLab From 4ebac5bea1575552b0d06428e1e71ed9aa81ff1a Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:11:45 +0200 Subject: [PATCH 257/381] [cleanup] accept FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR --- lib_com/options.h | 1 - lib_dec/ivas_ism_dec.c | 19 ------------------- 2 files changed, 20 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b59d490f0e..c374e94228 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR /* Eri: Fix for issue 462: Use-of-uninitialized memory in external HRTF deallocation in decoder together with BR switching */ #define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ #define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 2974e9d137..3276d9488d 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -176,7 +176,6 @@ static ivas_error ivas_ism_bitrate_switching( ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); /* Open the TD Binaural renderer */ -#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR if ( st_ivas->hHrtfTD == NULL || st_ivas->hBinRendererTd == NULL ) { if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) @@ -184,12 +183,6 @@ static ivas_error ivas_ism_bitrate_switching( return error; } } -#else - if ( ( error = ivas_td_binaural_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif } else { @@ -250,7 +243,6 @@ static ivas_error ivas_ism_bitrate_switching( } /* Close the TD Binaural renderer */ -#ifdef FIX_462_HRTF_FILE_BR_SWITCH_MEM_ERR if ( st_ivas->hBinRendererTd->HrFiltSet_p->ModelParams.modelROM == TRUE ) { if ( st_ivas->hBinRendererTd != NULL ) @@ -263,17 +255,6 @@ static ivas_error ivas_ism_bitrate_switching( st_ivas->hHrtfTD = NULL; } } -#else - if ( st_ivas->hBinRendererTd != NULL ) - { - ivas_td_binaural_close( &st_ivas->hBinRendererTd ); - } - - if ( st_ivas->hHrtfTD != NULL ) - { - st_ivas->hHrtfTD = NULL; - } -#endif } else { -- GitLab From f6ce6460886d9d7202171c1bdfaee5a3ff877217 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:12:45 +0200 Subject: [PATCH 258/381] [cleanup] accept FIX_487_LOWRATE_SBA_TUNING_FIX --- lib_com/ivas_rom_com.c | 8 -------- lib_com/options.h | 1 - 2 files changed, 9 deletions(-) diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 67ed4d80bb..6d1482d5f6 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -888,19 +888,11 @@ const ivas_spar_br_table_t ivas_spar_br_table_consts[IVAS_SPAR_BR_TABLE_LEN] = /* When AGC is ON additional (AGC_BITS_PER_CH+1) bits may be taken from each core-coder channel so minimum core-coder bitrate per channel can be min core-coder bitrates as per the table - AGC_BITS_PER_CH */ { 13200, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, -#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX { { 10000, 8150, 13150 } }, -#else - { { 10000, 8300, 13150 } }, -#endif { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, { 16400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0, -#ifdef FIX_487_LOWRATE_SBA_TUNING_FIX { { 13200, 11350, 16350 } }, -#else - { { 13200, 11500, 16350 } }, -#endif { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, { 24400, 0, SBA_FOA_ORDER, FB, 24000, 1, WYXZ, 1, 0,{ { 16400, 14850, 24350 } }, { { 15, 1, 5, 1 },{ 15, 1, 3, 1 },{ 7, 1, 3, 1 } }, 0, 0, 0 }, diff --git a/lib_com/options.h b/lib_com/options.h index c374e94228..1bee5fe7e7 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_487_LOWRATE_SBA_TUNING_FIX /* Dlb: TUning fix for low bitrate cases to match theoretical longest SPAR MD bitstream */ #define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -- GitLab From a52685651e9b75170647ed9f2fb2fe57d08ce04d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:13:36 +0200 Subject: [PATCH 259/381] [cleanup] accept FIX_490_MASA_2TC_LBR_DTX --- lib_com/options.h | 1 - lib_dec/ivas_masa_dec.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1bee5fe7e7..85a461d9b7 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -148,7 +148,6 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ -#define FIX_490_MASA_2TC_LBR_DTX /* Nokia: Fixes issue 490 by correcting condition. */ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ #define FIX_163_SBA_TD_DECORR_OPT /* Dlb : Issue 163 : TD decorr state optimization in SBA for certain output formats */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index a33c48b85b..dcf3b3dbc6 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -604,11 +604,7 @@ void ivas_masa_prerender( const int16_t output_frame /* i : output frame length per channel */ ) { -#ifdef FIX_490_MASA_2TC_LBR_DTX if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE ) -#else - if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) -#endif { if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { -- GitLab From 5344eb5ef9f5a78b787e4e4578606b53596ef51a Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:14:20 +0200 Subject: [PATCH 260/381] [cleanup] accept FIX_163_SBA_TD_DECORR_OPT --- lib_com/options.h | 1 - lib_dec/ivas_sba_dec.c | 4 ---- lib_dec/ivas_spar_decoder.c | 16 ---------------- 3 files changed, 21 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 85a461d9b7..f577368ab9 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,7 +150,6 @@ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -#define FIX_163_SBA_TD_DECORR_OPT /* Dlb : Issue 163 : TD decorr state optimization in SBA for certain output formats */ #define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ #define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index bddabbc822..60d76b65df 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -473,14 +473,10 @@ ivas_error ivas_sba_dec_digest_tc( while ( nSamplesLeftForTD ) { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); -#ifdef FIX_163_SBA_TD_DECORR_OPT if ( st_ivas->hDiracDecBin->hTdDecorr ) { -#endif ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_tc, decorr_signal, nSamplesToDecorr ); -#ifdef FIX_163_SBA_TD_DECORR_OPT } -#endif for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) { decorr_signal[ch_idx] += nSamplesToDecorr; diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index a03018e58d..cd9888dc21 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -101,21 +101,17 @@ ivas_error ivas_spar_dec_open( } /* TD decorr. */ -#ifdef FIX_163_SBA_TD_DECORR_OPT if ( ( st_ivas->ivas_format == SBA_FORMAT ) && ( ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) || ( st_ivas->hDecoderConfig->ivas_total_brate >= IVAS_256k && st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA ) ) ) { hSpar->hTdDecorr = NULL; } else { -#endif if ( ( error = ivas_td_decorr_dec_open( &hSpar->hTdDecorr, output_Fs, num_decor_chs + 1, 1 ) ) != IVAS_ERR_OK ) { return error; } -#ifdef FIX_163_SBA_TD_DECORR_OPT } -#endif /* MD handle */ if ( ( error = ivas_spar_md_dec_open( &hSpar->hMdDec, st_ivas->hDecoderConfig, num_channels_internal, sba_order_internal, st_ivas->sid_format ) ) != IVAS_ERR_OK ) @@ -762,15 +758,11 @@ static void ivas_spar_dec_MD( if ( hSpar->hMdDec->table_idx != table_idx ) { hSpar->hMdDec->table_idx = table_idx; -#ifdef FIX_163_SBA_TD_DECORR_OPT if ( hSpar->hTdDecorr ) { -#endif hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[table_idx].td_ducking; -#ifdef FIX_163_SBA_TD_DECORR_OPT } -#endif ivas_spar_md_dec_init( hSpar->hMdDec, hDecoderConfig, num_channels, sba_order ); } } @@ -1268,10 +1260,8 @@ void ivas_spar_dec_digest_tc( { int16_t nSamplesToDecorr = min( nSamplesLeftForTD, default_frame ); -#ifdef FIX_163_SBA_TD_DECORR_OPT if ( hSpar->hTdDecorr ) { -#endif ivas_td_decorr_process( hSpar->hTdDecorr, p_tc, pPcm_tmp, nSamplesToDecorr ); if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { @@ -1291,9 +1281,7 @@ void ivas_spar_dec_digest_tc( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - ch], p_tc[nchan_internal - 1 - ch], nSamplesToDecorr ); } } -#ifdef FIX_163_SBA_TD_DECORR_OPT } -#endif for ( ch = 0; ch < nchan_internal; ch++ ) { p_tc[ch] += nSamplesToDecorr; @@ -1356,10 +1344,8 @@ void ivas_spar_dec_upmixer( if ( hSpar->hMdDec->td_decorr_flag ) { -#ifdef FIX_163_SBA_TD_DECORR_OPT if ( hSpar->hTdDecorr ) { -#endif ivas_td_decorr_process( hSpar->hTdDecorr, st_ivas->hTcBuffer->tc, pPcm_tmp, output_frame ); if ( hSpar->hTdDecorr->num_apd_outputs >= ( nchan_internal - nchan_transport ) ) { @@ -1379,9 +1365,7 @@ void ivas_spar_dec_upmixer( mvr2r( pPcm_tmp[hSpar->hTdDecorr->num_apd_outputs - 1 - i], st_ivas->hTcBuffer->tc[nchan_internal - 1 - i], output_frame ); } } -#ifdef FIX_163_SBA_TD_DECORR_OPT } -#endif } ivas_spar_dec_set_render_params( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); -- GitLab From f96fe9d03faff1610529b84829299a408edabc95 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:15:19 +0200 Subject: [PATCH 261/381] [cleanup] accept FIX_HBR_MASAMETA --- lib_com/ivas_cnst.h | 2 -- lib_com/ivas_masa_com.c | 30 ------------------------------ lib_com/ivas_prot.h | 6 ------ lib_com/ivas_stat_com.h | 2 -- lib_com/options.h | 1 - lib_dec/ivas_masa_dec.c | 18 ------------------ lib_dec/ivas_qmetadata_dec.c | 16 ---------------- lib_enc/ivas_masa_enc.c | 14 -------------- lib_enc/ivas_qmetadata_enc.c | 4 ---- 9 files changed, 93 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 9d74a26033..aa9690ac1a 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1202,9 +1202,7 @@ enum #define MASA_MAX_BITS_HR 2000 /* max. bit-budget for MASA metadata in HR mode*/ #define HR_MASA_ER_LEVELS 16 -#ifdef FIX_HBR_MASAMETA #define MAX_REDUCED_NBANDS 18 /* max number of subbands that is less than the default value 24 */ -#endif #define LIMIT_ER_ELEVATION_ENC 4 #define LIMIT_ER_SIMPLE_ENC 6 diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index 820d505e47..a962e45a81 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -324,40 +324,16 @@ void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ -#ifdef FIX_HBR_MASAMETA const uint8_t maxBand, /* i : max band */ uint8_t is_encoder, /* i: signals if called at encoder */ -#else - const int32_t sampling_rate, /* i : Sampling rate */ -#endif MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ) { uint8_t band, sf; -#ifdef FIX_HBR_MASAMETA int16_t highBand; -#else - int16_t maxBin, highBand, maxBand; -#endif uint8_t numBands48k; -#ifndef FIX_HBR_MASAMETA - if ( sampling_rate == 48000 ) - { - return; - } -#endif -#ifndef FIX_HBR_MASAMETA - /* Find maximum band usable at this sample rate */ - maxBin = (int16_t) ( CLDFB_NO_CHANNELS_MAX * sampling_rate / 48000 ); - maxBand = 0; - while ( MASA_band_grouping_24[maxBand] <= maxBin ) - { - maxBand++; - } - maxBand--; -#endif numBands48k = config->numCodingBands; for ( band = 1; band < config->numCodingBands + 1; band++ ) @@ -368,7 +344,6 @@ void masa_sample_rate_band_correction( { config->numCodingBands = band; hQMetaData->numCodingBands = band; -#ifdef FIX_HBR_MASAMETA if ( is_encoder ) { if ( hQMetaData->q_direction->cfg.nbands > band ) @@ -380,7 +355,6 @@ void masa_sample_rate_band_correction( hQMetaData->q_direction[1].cfg.nbands = band; } } -#endif band_mapping[band] = maxBand; break; } @@ -428,11 +402,7 @@ void masa_sample_rate_band_correction( /* in decoder, zero the EXT out MASA meta buffer */ for ( sf = 0; sf < MAX_PARAM_SPATIAL_SUBFRAMES; sf++ ) { -#ifdef FIX_HBR_MASAMETA for ( band = hQMetaData->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) -#else - for ( band = config->numCodingBands; band < MASA_FREQUENCY_BANDS; band++ ) -#endif { hExtOutMeta->directionIndex[0][sf][band] = SPH_IDX_FRONT; hExtOutMeta->directToTotalRatio[0][sf][band] = 0u; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e0375afbb1..0ddc423629 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3150,10 +3150,8 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( const SPHERICAL_GRID_DATA *sph_grid16, /* i: spherical grid for deindexing */ const int16_t bits_sph_idx, const int16_t bits_sp_coh -#ifdef FIX_HBR_MASAMETA , uint8_t ncoding_bands_config -#endif ); /*! r: number of bits read */ @@ -5110,12 +5108,8 @@ void masa_sample_rate_band_correction( MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ int16_t *band_mapping, /* i/o: Band mapping used and modified */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ -#ifdef FIX_HBR_MASAMETA const uint8_t maxBand, /* i : max band */ uint8_t is_encoder, /* i: signals if called at encoder */ -#else - const int32_t sampling_rate, /* i : sampling rate */ -#endif MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ); diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 917cb0e063..43b7adcc7c 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -475,9 +475,7 @@ typedef struct int16_t nbands; int16_t nblocks; int16_t start_band; -#ifdef FIX_HBR_MASAMETA uint8_t inactiveBands; -#endif int16_t search_effort; MC_LS_SETUP mc_ls_setup; diff --git a/lib_com/options.h b/lib_com/options.h index f577368ab9..bcd39f9d90 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -#define FIX_HBR_MASAMETA /* Nokia: Fixes to HBR MASA metadata at 384 and 512 kbps. Addresses issues 438 and 477 as well. */ #define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ #define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ #define FIX_499_DFT_STEREO_PLC /* Eri: Fix for issue 499: Wrong past memory addressed for computing energy of DFT stereo residual ECU frame */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index dcf3b3dbc6..ae30e4bebd 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -196,19 +196,15 @@ ivas_error ivas_masa_decode( if ( ivas_total_brate >= IVAS_512k ) { *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 -#ifdef FIX_HBR_MASAMETA , hMasa->config.numCodingBands -#endif ); } else { *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 -#ifdef FIX_HBR_MASAMETA , hMasa->config.numCodingBands -#endif ); } } @@ -505,10 +501,8 @@ static ivas_error ivas_masa_dec_config( { int16_t i; MASA_DECODER_HANDLE hMasa; -#ifdef FIX_HBR_MASAMETA uint8_t maxBand; int16_t maxBin; -#endif ivas_error error; error = IVAS_ERR_OK; @@ -557,7 +551,6 @@ static ivas_error ivas_masa_dec_config( ivas_set_qmetadata_maxbit_req( st_ivas->hQMetaData, st_ivas->ivas_format ); -#ifdef FIX_HBR_MASAMETA /* Find maximum band usable */ maxBin = (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH ); maxBand = 0; @@ -576,17 +569,6 @@ static ivas_error ivas_masa_dec_config( { masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, maxBand, 0, NULL ); } -#else - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) - { - /* need to apply the sampling rate correction also for the EXT output MASA meta buffer */ - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, hMasa->data.extOutMeta ); - } - else - { - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, st_ivas->hQMetaData, st_ivas->hDecoderConfig->output_Fs, NULL ); - } -#endif return error; } diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index eabe725035..bd63c14daf 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -775,10 +775,8 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ const int16_t bits_sph_idx, const int16_t bits_sp_coh -#ifdef FIX_HBR_MASAMETA , uint8_t ncoding_bands_config -#endif ) { int16_t d, b, m; @@ -801,10 +799,8 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #endif uint16_t all_coherence_zero; int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; -#ifdef FIX_HBR_MASAMETA int16_t codedBands, sf_nbands0, sf_nbands1; sf_nbands1 = 1; -#endif #ifdef DEBUG_MODE_QMETADATA static FILE *pF = NULL; @@ -829,7 +825,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #endif start_index_0 = *index; -#ifdef FIX_HBR_MASAMETA /* read number of higher inactive/not encoded bands */ if ( bitstream[( *index )--] ) { @@ -879,7 +874,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( hQMetaData->q_direction[0].cfg.nbands = codedBands; -#endif /*Coherence flag decoding*/ #ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA @@ -913,23 +907,17 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( { /* Read which bands have 2 directions */ hQMetaData->q_direction[1].cfg.nbands = hQMetaData->numTwoDirBands; -#ifdef FIX_HBR_MASAMETA sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; if ( hQMetaData->q_direction[1].cfg.nbands > codedBands ) { hQMetaData->q_direction[1].cfg.nbands = codedBands; } -#endif set_c( (int8_t *) hQMetaData->twoDirBands, 0, hQMetaData->q_direction[0].cfg.nbands ); d = *index; dif_p[0] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); p[0] = dif_p[0]; hQMetaData->twoDirBands[p[0]] = 1; -#ifdef FIX_HBR_MASAMETA for ( b = 1; b < hQMetaData->q_direction[1].cfg.nbands; b++ ) -#else - for ( b = 1; b < hQMetaData->numTwoDirBands; b++ ) -#endif { dif_p[b] = ivas_qmetadata_DecodeExtendedGR( bitstream, index, MASA_MAXIMUM_CODING_SUBBANDS, 0 ); p[b] = p[b - 1] + dif_p[b] + 1; @@ -944,7 +932,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( #endif } -#ifdef FIX_HBR_MASAMETA if ( bits_sph_idx == 16 && hQMetaData->no_directions == 2 ) { sf_nbands1 = hQMetaData->q_direction[1].cfg.nbands; @@ -953,7 +940,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( hQMetaData->q_direction[1].cfg.nbands = codedBands; } } -#endif #ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_diff_sum = @@ -1214,13 +1200,11 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( hQMetaData->dir_comp_ratio = 1.0f; } -#ifdef FIX_HBR_MASAMETA hQMetaData->q_direction[0].cfg.nbands = sf_nbands0; if ( hQMetaData->no_directions == 2 ) { hQMetaData->q_direction[1].cfg.nbands = sf_nbands1; } -#endif return ( start_index_0 - *index ); } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 17a9b68074..3044eb8bf6 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -497,10 +497,8 @@ ivas_error ivas_masa_enc_config( uint8_t coherencePresent; uint8_t isActualTwoDir; /* Flag to tell that when there are two directions present in metadata, they both contain meaningful information. */ int32_t ivas_total_brate; -#ifdef FIX_HBR_MASAMETA uint8_t maxBand; int16_t maxBin, sf; -#endif ivas_error error; #ifndef FIX_505_MASA_SPHGRID_REUSE SPHERICAL_GRID_DATA *sphGrid; @@ -642,7 +640,6 @@ ivas_error ivas_masa_enc_config( ivas_set_qmetadata_maxbit_req( hQMetaData, ivas_format ); -#ifdef FIX_HBR_MASAMETA /* Find maximum band usable */ maxBin = (int16_t) ( st_ivas->hEncoderConfig->input_Fs * INV_CLDFB_BANDWIDTH ); maxBand = 0; @@ -690,9 +687,6 @@ ivas_error ivas_masa_enc_config( set_c( (int8_t *) hMasa->data.twoDirBands, 1, hMasa->config.numCodingBands ); } -#else - masa_sample_rate_band_correction( &( hMasa->config ), hMasa->data.band_mapping, hQMetaData, st_ivas->hEncoderConfig->input_Fs, NULL ); -#endif /* Transmit stereo signals using a mono downmix at lowest bitrates */ if ( ivas_format == MASA_FORMAT && st_ivas->nCPE == 1 && st_ivas->hCPE[0]->hStereoDft != NULL && st_ivas->hCPE[0]->hStereoDft->hConfig != NULL ) @@ -799,11 +793,7 @@ static void combine_freqbands_and_subframes( } } } -#ifdef FIX_HBR_MASAMETA if ( numCodingBands <= MAX_REDUCED_NBANDS ) -#else - if ( numCodingBands < MASA_FREQUENCY_BANDS ) -#endif { /* reduce metadata *frequency* resolution. time resolution is not touched */ for ( i = 0; i < numDirections; i++ ) @@ -2340,9 +2330,7 @@ static void masa_metadata_direction_alignment( { /* swap the metadata of the two directions in this TF-tile */ float tmp_val; -#ifdef FIX_HBR_MASAMETA uint16_t tmp_int_val; -#endif tmp_val = hMeta->directional_meta[0].azimuth[sf][band]; hMeta->directional_meta[0].azimuth[sf][band] = hMeta->directional_meta[1].azimuth[sf][band]; hMeta->directional_meta[1].azimuth[sf][band] = tmp_val; @@ -2350,11 +2338,9 @@ static void masa_metadata_direction_alignment( tmp_val = hMeta->directional_meta[0].elevation[sf][band]; hMeta->directional_meta[0].elevation[sf][band] = hMeta->directional_meta[1].elevation[sf][band]; hMeta->directional_meta[1].elevation[sf][band] = tmp_val; -#ifdef FIX_HBR_MASAMETA tmp_int_val = hMeta->directional_meta[0].spherical_index[sf][band]; hMeta->directional_meta[0].spherical_index[sf][band] = hMeta->directional_meta[1].spherical_index[sf][band]; hMeta->directional_meta[1].spherical_index[sf][band] = tmp_int_val; -#endif tmp_val = hMeta->directional_meta[0].energy_ratio[sf][band]; hMeta->directional_meta[0].energy_ratio[sf][band] = hMeta->directional_meta[1].energy_ratio[sf][band]; hMeta->directional_meta[1].energy_ratio[sf][band] = tmp_val; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index bae7edc5fd..3be51aa3ee 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -790,7 +790,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( #else bits_no_dirs_coh = 0; #endif -#ifdef FIX_HBR_MASAMETA if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) { push_next_indice( hMetaData, 1, 1 ); @@ -802,7 +801,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( /* no change */ push_next_indice( hMetaData, 0, 1 ); } -#endif if ( hQMetaData->coherence_flag ) { all_coherence_zero = hQMetaData->all_coherence_zero; @@ -984,7 +982,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( } } } -#ifdef FIX_HBR_MASAMETA if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) { hQMetaData->q_direction[0].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; @@ -993,7 +990,6 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( hQMetaData->q_direction[1].cfg.nbands += hQMetaData->q_direction->cfg.inactiveBands; } } -#endif return error; } -- GitLab From 6d19d90a3a0bbdd405c06e26006327c6eb88a850 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:16:08 +0200 Subject: [PATCH 262/381] [cleanup] accept FIX_482_DUMMYDEC_INIT --- lib_com/options.h | 1 - lib_rend/lib_rend.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index bcd39f9d90..76656e6c61 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -#define FIX_482_DUMMYDEC_INIT /* Nokia: fix issue #428: missing inits for dummyDec in IVAS_rend */ #define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ #define FIX_499_DFT_STEREO_PLC /* Eri: Fix for issue 499: Wrong past memory addressed for computing energy of DFT stereo residual ECU frame */ #define FIX_489_COV_SMOOTHING /* Dlb: Fix covariance smoothing for ParamUpmix */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index e9d4b2d5e6..0bac2513c0 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2485,11 +2485,9 @@ static DecoderDummy *initDecoderDummy( decDummy->hMasa = NULL; decDummy->hDiracDecBin = NULL; decDummy->hQMetaData = NULL; -#ifdef FIX_482_DUMMYDEC_INIT decDummy->hHrtfParambin = NULL; decDummy->hHeadTrackData = NULL; decDummy->hDirAC = NULL; -#endif decDummy->hTcBuffer = NULL; decDummy->hDecoderConfig->output_config = getIvasAudioConfigFromRendAudioConfig( outConfig ); decDummy->nchan_transport = numTransChannels; @@ -2504,7 +2502,6 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData->Rmat_prev[i][i] = 1.0f; } -#ifdef FIX_482_DUMMYDEC_INIT set_zero( decDummy->hHeadTrackData->chEneIIR[0], MASA_FREQUENCY_BANDS ); set_zero( decDummy->hHeadTrackData->chEneIIR[1], MASA_FREQUENCY_BANDS ); set_zero( decDummy->hHeadTrackData->procChEneIIR[0], MASA_FREQUENCY_BANDS ); @@ -2516,7 +2513,6 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData->Quaternions[i].y = 0.0f; decDummy->hHeadTrackData->Quaternions[i].z = 0.0f; } -#endif decDummy->hHeadTrackData->num_quaternions = 0; decDummy->hHeadTrackData->lrSwitchInterpVal = 0.0f; decDummy->hHeadTrackData->lrSwitchedCurrent = 0; -- GitLab From 4a9d3bb37e4722c3e067a254315ba78fa6192d58 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:16:47 +0200 Subject: [PATCH 263/381] [cleanup] accept FIX_468_16KHZ_PUPMIX --- lib_com/options.h | 1 - lib_enc/ivas_mc_paramupmix_enc.c | 11 ----------- 2 files changed, 12 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 76656e6c61..536c465826 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -#define FIX_468_16KHZ_PUPMIX /* Dlb: Fix issue 468 for Param Upmix at 16kHz sampling rate */ #define FIX_499_DFT_STEREO_PLC /* Eri: Fix for issue 499: Wrong past memory addressed for computing energy of DFT stereo residual ECU frame */ #define FIX_489_COV_SMOOTHING /* Dlb: Fix covariance smoothing for ParamUpmix */ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 272e3f817b..1203fcdc64 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -742,9 +742,7 @@ static void ivas_mc_paramupmix_param_est_enc( int16_t l_ts; int16_t b, i, j, ts, bnd; -#ifdef FIX_468_16KHZ_PUPMIX int16_t maxbands; -#endif int16_t transient_det[MC_PARAMUPMIX_COMBINATIONS][2]; int16_t transient_det_l[2], transient_det_r[2]; @@ -820,18 +818,11 @@ static void ivas_mc_paramupmix_param_est_enc( } ivas_enc_cov_handler_process( hMCParamUpmix->hCovEnc[b], pp_in_fr_real, pp_in_fr_imag, cov_real, cov_dtx_real, hMCParamUpmix->hFbMixer->pFb, 0, hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands, MC_PARAMUPMIX_NCH, 0 /*dtx_vad*/, transient_det[b], HOA_md_ind ); } -#ifdef FIX_468_16KHZ_PUPMIX maxbands = hMCParamUpmix->hFbMixer->pFb->filterbank_num_bands; for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) { for ( bnd = 0; bnd < maxbands; bnd++ ) { -#else - for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) - { - for ( bnd = 0; bnd < IVAS_MAX_NUM_BANDS; bnd++ ) - { -#endif rxy = hMCParamUpmix->cov_real[b][1][0][bnd]; ryy = hMCParamUpmix->cov_real[b][1][1][bnd]; cmat = rxy / ( ryy + EPSILON ); @@ -845,7 +836,6 @@ static void ivas_mc_paramupmix_param_est_enc( betas[b][bnd] = (float) 2.0 * wetaux; } } -#ifdef FIX_468_16KHZ_PUPMIX if ( maxbands < IVAS_MAX_NUM_BANDS ) { for ( b = 0; b < MC_PARAMUPMIX_COMBINATIONS; b++ ) @@ -857,6 +847,5 @@ static void ivas_mc_paramupmix_param_est_enc( } } } -#endif return; } -- GitLab From 34632e9d9ea9d5f8d669133c282c0dcbb6752467 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:17:46 +0200 Subject: [PATCH 264/381] [cleanup] accept FIX_499_DFT_STEREO_PLC --- lib_com/options.h | 1 - lib_dec/ivas_stereo_dft_dec.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 536c465826..890938b1ae 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -#define FIX_499_DFT_STEREO_PLC /* Eri: Fix for issue 499: Wrong past memory addressed for computing energy of DFT stereo residual ECU frame */ #define FIX_489_COV_SMOOTHING /* Dlb: Fix covariance smoothing for ParamUpmix */ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 36d8eb662b..de232e8fa8 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1734,11 +1734,7 @@ void stereo_dft_dec( if ( st0->bfi && !prev_bfi ) { -#ifdef FIX_499_DFT_STEREO_PLC idx_k0 = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; -#else - idx_k0 = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; -#endif idx_k1 = ( idx_k0 + 1 ) % STEREO_DFT_PAST_MAX; /*dmx energy memory*/ hStereoDft->past_dmx_nrg = stereo_dft_dmx_swb_nrg( hStereoDft->DFT_past_DMX[idx_k0], hStereoDft->DFT_past_DMX[idx_k1], min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); -- GitLab From c45979aa007572fa8b8c66e4f54eaf3c193e52c8 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:18:40 +0200 Subject: [PATCH 265/381] [cleanup] accept FIX_489_COV_SMOOTHING --- lib_com/cnst.h | 2 -- lib_com/ivas_cov_smooth.c | 12 ------------ lib_com/ivas_prot.h | 4 ---- lib_com/options.h | 1 - lib_enc/ivas_enc_cov_handler.c | 18 ------------------ lib_enc/ivas_mc_paramupmix_enc.c | 4 ---- lib_enc/ivas_spar_encoder.c | 4 ---- 7 files changed, 45 deletions(-) diff --git a/lib_com/cnst.h b/lib_com/cnst.h index a35f5280c2..cee56f7d42 100644 --- a/lib_com/cnst.h +++ b/lib_com/cnst.h @@ -2240,13 +2240,11 @@ enum VOIP_RTPDUMP }; -#ifdef FIX_489_COV_SMOOTHING typedef enum _COV_SMOOTHING_TYPE { COV_SMOOTH_SPAR, COV_SMOOTH_MC } COV_SMOOTHING_TYPE; -#endif /* clang-format on */ #endif /* CNST_H */ diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index e407bccc6c..b466351e02 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -35,9 +35,7 @@ #ifdef DEBUGGING #include "debug.h" #endif -#ifdef FIX_489_COV_SMOOTHING #include "cnst.h" -#endif #include "ivas_prot.h" #include "wmc_auto.h" #include "prot.h" @@ -54,10 +52,8 @@ static void ivas_set_up_cov_smoothing( ivas_filterbank_t *pFb, const float max_update_rate, const int16_t min_pool_size -#ifdef FIX_489_COV_SMOOTHING , const COV_SMOOTHING_TYPE smooth_mode /* i : flag multichannel vs SPAR */ -#endif , const int32_t ivas_total_brate ) { @@ -96,7 +92,6 @@ static void ivas_set_up_cov_smoothing( } } } -#ifdef FIX_489_COV_SMOOTHING else if ( smooth_mode == COV_SMOOTH_MC ) { for ( j = 0; j < pFb->filterbank_num_bands; j++ ) @@ -117,7 +112,6 @@ static void ivas_set_up_cov_smoothing( } } } -#endif else { for ( j = 0; j < pFb->filterbank_num_bands; j++ ) @@ -159,9 +153,7 @@ ivas_error ivas_spar_covar_smooth_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int16_t nchan_inp /* i : number of input channels */ , -#ifdef FIX_489_COV_SMOOTHING COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ -#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { @@ -191,11 +183,7 @@ ivas_error ivas_spar_covar_smooth_enc_open( } -#ifdef FIX_489_COV_SMOOTHING ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, smooth_mode, ivas_total_brate ); -#else - ivas_set_up_cov_smoothing( hCovState, pFb, cov_smooth_cfg->max_update_rate, cov_smooth_cfg->min_pool_size, ivas_total_brate ); -#endif *hCovState_out = hCovState; diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0ddc423629..3b7a95a000 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -4687,9 +4687,7 @@ ivas_error ivas_spar_covar_enc_open( const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp /* i : number of input channels */ , -#ifdef FIX_489_COV_SMOOTHING COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ -#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); @@ -4720,9 +4718,7 @@ ivas_error ivas_spar_covar_smooth_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int16_t nchan_inp /* i : number of input channels */ , -#ifdef FIX_489_COV_SMOOTHING COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC*/ -#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); diff --git a/lib_com/options.h b/lib_com/options.h index 890938b1ae..37b2cc237f 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -#define FIX_489_COV_SMOOTHING /* Dlb: Fix covariance smoothing for ParamUpmix */ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ #define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 61c4ccaef9..40db2d4f75 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -68,9 +68,7 @@ ivas_error ivas_spar_covar_enc_open( const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp /* i : number of input channels */ , -#ifdef FIX_489_COV_SMOOTHING COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ -#endif const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { @@ -88,25 +86,13 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_bands = IVAS_MAX_NUM_BANDS; cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE; -#ifdef FIX_489_COV_SMOOTHING if ( smooth_mode == COV_SMOOTH_MC ) { cov_smooth_cfg.max_update_rate = 1.0f; cov_smooth_cfg.min_pool_size = 20; } -#else - if ( nchan_inp == 3 ) /* to discriminate between SPAR and mc there could be a better solution */ - { - cov_smooth_cfg.max_update_rate = 1.0f; - cov_smooth_cfg.min_pool_size = 20; - } -#endif -#ifdef FIX_489_COV_SMOOTHING if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -114,11 +100,7 @@ ivas_error ivas_spar_covar_enc_open( cov_smooth_cfg.max_update_rate = MAX_UPDATE_RATE_DTX; cov_smooth_cfg.min_pool_size = MIN_POOL_SIZE_DTX; -#ifdef FIX_489_COV_SMOOTHING if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, smooth_mode, ivas_total_brate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_covar_smooth_enc_open( &hCovState->pCov_dtx_state, &cov_smooth_cfg, pFb, nchan_inp, ivas_total_brate ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index 1203fcdc64..b328223d77 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -211,11 +211,7 @@ ivas_error ivas_mc_paramupmix_enc_open( for ( i = 0; i < MC_PARAMUPMIX_COMBINATIONS; i++ ) { /* Covariance handle */ -#ifdef FIX_489_COV_SMOOTHING if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, COV_SMOOTH_MC, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_covar_enc_open( &( hMCParamUpmix->hCovEnc[i] ), hMCParamUpmix->hFbMixer->pFb, input_Fs, MC_PARAMUPMIX_NCH + 1, st_ivas->hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 4d4ed1ef6d..d9dd0880c5 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -142,11 +142,7 @@ ivas_error ivas_spar_enc_open( } /* Covariance handle */ -#ifdef FIX_489_COV_SMOOTHING if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, COV_SMOOTH_SPAR, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_spar_covar_enc_open( &( hSpar->hCovEnc ), hSpar->hFbMixer->pFb, input_Fs, nchan_inp, hEncoderConfig->ivas_total_brate ) ) != IVAS_ERR_OK ) -#endif { return error; } -- GitLab From cf9f8f8c0d4bfcf33e6f713f7242da761931aec2 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:19:28 +0200 Subject: [PATCH 266/381] [cleanup] accept FIX_485_STATIC_BUFFERS --- lib_com/ivas_dirac_com.c | 35 ----------------------------------- lib_com/ivas_prot.h | 2 -- lib_com/options.h | 1 - lib_enc/ivas_dirac_enc.c | 4 ---- lib_enc/ivas_stat_enc.h | 2 -- 5 files changed, 44 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 3ff512a26c..3386cf5a99 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -930,9 +930,7 @@ void deindex_spherical_component( *-----------------------------------------------------------------*/ void calculate_hodirac_sector_parameters( -#ifdef FIX_485_STATIC_BUFFERS DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ -#endif float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ const float beta, /* i : forgetting factor for average filtering */ @@ -951,17 +949,6 @@ void calculate_hodirac_sector_parameters( float sec_I_vec_y[NUM_ANA_SECTORS]; float sec_I_vec_z[NUM_ANA_SECTORS]; -#ifndef FIX_485_STATIC_BUFFERS - static int16_t firstrun_sector_params = 1; - - static float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; - static float sec_I_vec_smth_y[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; - static float sec_I_vec_smth_z[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; - - static float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; - static float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; - static float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; -#endif for ( i_sec = 0; i_sec < NUM_ANA_SECTORS; i_sec++ ) { @@ -997,7 +984,6 @@ void calculate_hodirac_sector_parameters( float *p_ene = &ene[i_sec * N_bands + i_band]; float *p_diff = &diff[i_sec * N_bands + i_band]; -#ifdef FIX_485_STATIC_BUFFERS float *p_azi_prev = &hDirAC->azi_prev[i_sec * N_bands + i_band]; float *p_ele_prev = &hDirAC->ele_prev[i_sec * N_bands + i_band]; @@ -1005,15 +991,6 @@ void calculate_hodirac_sector_parameters( float *p_sec_I_vec_smth_x = &hDirAC->sec_I_vec_smth_x[i_sec][i_band]; float *p_sec_I_vec_smth_y = &hDirAC->sec_I_vec_smth_y[i_sec][i_band]; float *p_sec_I_vec_smth_z = &hDirAC->sec_I_vec_smth_z[i_sec][i_band]; -#else - float *p_azi_prev = &azi_prev[i_sec * N_bands + i_band]; - float *p_ele_prev = &ele_prev[i_sec * N_bands + i_band]; - - float *p_energy_smth = &energy_smth[i_sec][i_band]; - float *p_sec_I_vec_smth_x = &sec_I_vec_smth_x[i_sec][i_band]; - float *p_sec_I_vec_smth_y = &sec_I_vec_smth_y[i_sec][i_band]; - float *p_sec_I_vec_smth_z = &sec_I_vec_smth_z[i_sec][i_band]; -#endif *p_sec_I_vec_x = 0.f; *p_sec_I_vec_y = 0.f; *p_sec_I_vec_z = 0.f; @@ -1079,11 +1056,7 @@ void calculate_hodirac_sector_parameters( sec_z_real * sec_z_real + sec_z_imag * sec_z_imag ); } } -#ifdef FIX_485_STATIC_BUFFERS if ( hDirAC->firstrun_sector_params ) -#else - if ( firstrun_sector_params ) -#endif { *p_sec_I_vec_smth_x = *p_sec_I_vec_x; *p_sec_I_vec_smth_y = *p_sec_I_vec_y; @@ -1125,11 +1098,7 @@ void calculate_hodirac_sector_parameters( } if ( tmp_diff > 0.5f ) { -#ifdef FIX_485_STATIC_BUFFERS if ( hDirAC->firstrun_sector_params ) -#else - if ( firstrun_sector_params ) -#endif { *p_azi = 0.f; *p_ele = 0.f; @@ -1148,11 +1117,7 @@ void calculate_hodirac_sector_parameters( } } -#ifdef FIX_485_STATIC_BUFFERS hDirAC->firstrun_sector_params = 0; -#else - firstrun_sector_params = 0; -#endif return; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 3b7a95a000..96c6ca9a90 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3895,9 +3895,7 @@ void ivas_dirac_dec_get_frequency_axis( const int16_t num_freq_bands ); /* i : number of frequency bands */ void calculate_hodirac_sector_parameters( -#ifdef FIX_485_STATIC_BUFFERS DIRAC_ENC_HANDLE hDirAC, -#endif float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX],/* i : signal vector, imaginary part */ const float beta, /* i : forgetting factor for average filtering */ diff --git a/lib_com/options.h b/lib_com/options.h index 37b2cc237f..acb51e1b21 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ -#define FIX_485_STATIC_BUFFERS /* FhG: move static buffers in DirAC parameter estimator to the DirAC struct */ #define FIX_I503_ASAN_ERROR_IND_LIST /* VA: fix issue #503: address sanitizer error with IND_LIST_DYN */ #define FIX_473_JITTER_NONDIEGETIC_PANNING /* FhG,Orange: add missing non-diegetic panning to JITTER */ diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 5aa872e434..97b238f330 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -83,7 +83,6 @@ ivas_error ivas_dirac_enc_open( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC Config\n" ) ); } -#ifdef FIX_485_STATIC_BUFFERS hDirAC->firstrun_sector_params = 1; set_zero( hDirAC->sec_I_vec_smth_x[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); set_zero( hDirAC->sec_I_vec_smth_y[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); @@ -91,7 +90,6 @@ ivas_error ivas_dirac_enc_open( set_zero( hDirAC->azi_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); set_zero( hDirAC->ele_prev, NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); set_zero( hDirAC->energy_smth[0], NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS ); -#endif /*-----------------------------------------------------------------* * DirAC main configuration *-----------------------------------------------------------------*/ @@ -920,9 +918,7 @@ void ivas_dirac_param_est_enc( assert( l_ts <= DIRAC_NO_FB_BANDS_MAX ); #endif calculate_hodirac_sector_parameters( -#ifdef FIX_485_STATIC_BUFFERS hDirAC, -#endif Cldfb_RealBuffer, Cldfb_ImagBuffer, 0.20f, diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 5c9f02e4d4..fe520a0817 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -600,7 +600,6 @@ typedef struct ivas_dirac_enc_data_structure float diffuseness_m[DIRAC_MAX_NBANDS]; int16_t band_grouping[DIRAC_MAX_NBANDS + 1]; int16_t block_grouping[5]; -#ifdef FIX_485_STATIC_BUFFERS int16_t firstrun_sector_params; float sec_I_vec_smth_x[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; @@ -610,7 +609,6 @@ typedef struct ivas_dirac_enc_data_structure float energy_smth[NUM_ANA_SECTORS][IVAS_MAX_NUM_BANDS]; float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; -#endif #ifndef SBA_MODE_CLEAN_UP int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; -- GitLab From 666632df7b5d3572acf84ced6ffbd38da28d6485 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:20:13 +0200 Subject: [PATCH 267/381] [cleanup] accept FIX_I503_ASAN_ERROR_IND_LIST --- lib_com/options.h | 1 - lib_enc/ivas_qmetadata_enc.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index acb51e1b21..0793b929af 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ -#define FIX_I503_ASAN_ERROR_IND_LIST /* VA: fix issue #503: address sanitizer error with IND_LIST_DYN */ #define FIX_473_JITTER_NONDIEGETIC_PANNING /* FhG,Orange: add missing non-diegetic panning to JITTER */ #define SBA_MODE_CLEAN_UP /* Dlb: Cean up SBA mode references */ diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 3be51aa3ee..4e017dd052 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -2251,11 +2251,7 @@ void restore_metadata_buffer( int16_t i; #ifdef IND_LIST_DYN -#ifdef FIX_I503_ASAN_ERROR_IND_LIST for ( i = next_ind_start; i < hMetaData->nb_ind_tot; i++ ) -#else - for ( i = next_ind_start; i <= hMetaData->nb_ind_tot; i++ ) -#endif #else for ( i = next_ind_start; i <= hMetaData->next_ind; i++ ) #endif -- GitLab From 4d65c1aabcc650c99bab522087af3f798a8ec056 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:20:58 +0200 Subject: [PATCH 268/381] [cleanup] accept FIX_473_JITTER_NONDIEGETIC_PANNING --- lib_com/options.h | 1 - lib_dec/ivas_ism_renderer.c | 4 ---- lib_dec/ivas_jbm_dec.c | 8 -------- lib_dec/lib_dec.c | 8 -------- 4 files changed, 21 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 0793b929af..3b04c7fd45 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ -#define FIX_473_JITTER_NONDIEGETIC_PANNING /* FhG,Orange: add missing non-diegetic panning to JITTER */ #define SBA_MODE_CLEAN_UP /* Dlb: Cean up SBA mode references */ #define FIX_502_IND_LIST_SIZE /* Fix issue #502: insufficient index buffer sizes */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 32f0393c0e..915b545a59 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -259,11 +259,7 @@ void ivas_ism_render_sf( for ( i = 0; i < num_objects; i++ ) { /* Head rotation: rotate the object positions depending the head's orientation */ -#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) -#else - if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) -#endif { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); if ( st_ivas->hEFAPdata != NULL ) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index dc54aa9734..91c7a1c185 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -644,9 +644,7 @@ ivas_error ivas_jbm_dec_render( int16_t nchan_remapped; int32_t output_Fs; AUDIO_CONFIG output_config; -#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING float pan_left, pan_right; -#endif int16_t nSamplesAskedLocal; ivas_error error; float *p_output[MAX_OUTPUT_CHANNELS]; @@ -706,7 +704,6 @@ ivas_error ivas_jbm_dec_render( { ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, st_ivas->nchan_transport, p_output ); } -#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { *nSamplesRendered = min( st_ivas->hTcBuffer->n_samples_available, nSamplesAskedLocal ); @@ -715,7 +712,6 @@ ivas_error ivas_jbm_dec_render( v_multc( st_ivas->hTcBuffer->tc[0], pan_right, output[1], *nSamplesRendered ); v_multc( st_ivas->hTcBuffer->tc[0], pan_left, output[0], *nSamplesRendered ); } -#endif else if ( st_ivas->renderer_type == RENDERER_PARAM_ISM || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) { ivas_param_ism_dec_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, p_output ); @@ -737,7 +733,6 @@ ivas_error ivas_jbm_dec_render( /* Convert to CICPxx; used also for ISM->CICP19->binaural_room rendering */ ivas_ism_render_sf( st_ivas, p_output, *nSamplesRendered ); } -#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING else if ( st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { pan_left = ( st_ivas->hDecoderConfig->non_diegetic_pan_gain + 1.f ) * 0.5f; @@ -745,7 +740,6 @@ ivas_error ivas_jbm_dec_render( v_multc( st_ivas->hTcBuffer->tc[0], pan_right, output[1], *nSamplesRendered ); v_multc( st_ivas->hTcBuffer->tc[0], pan_left, output[0], *nSamplesRendered ); } -#endif else if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { /* Convert to Ambisonics; used also for ISM->HOA3->binaural rendering */ @@ -1810,9 +1804,7 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( case RENDERER_PARAM_ISM: case RENDERER_BINAURAL_MIXER_CONV: case RENDERER_BINAURAL_MIXER_CONV_ROOM: -#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING case RENDERER_NON_DIEGETIC_DOWNMIX: -#endif buffer_mode = TC_BUFFER_MODE_RENDERER; break; case RENDERER_MC_PARAMMC: diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 7cb4753235..0634cdfd05 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -766,7 +766,6 @@ static ivas_error IVAS_DEC_Setup( if ( hIvasDec->mode == IVAS_DEC_MODE_EVS ) { -#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING if ( hIvasDec->st_ivas->renderer_type == RENDERER_NON_DIEGETIC_DOWNMIX ) { *nTransportChannels = MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN; @@ -774,12 +773,9 @@ static ivas_error IVAS_DEC_Setup( } else { -#endif *nTransportChannels = 1; *nOutChannels = 1; -#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING } -#endif } else { @@ -2733,11 +2729,7 @@ static ivas_error evs_dec_main( if ( floatBuf != NULL ) { /* BE workaround */ -#ifdef FIX_473_JITTER_NONDIEGETIC_PANNING int16_t pcm_buf_local[L_FRAME48k * MAX_OUTPUT_CHANNELS_IN_DIEGETIC_PAN]; -#else - int16_t pcm_buf_local[L_FRAME48k]; -#endif /* convert 'float' output data to 'short' */ #ifdef DEBUGGING -- GitLab From e406fff2d73fb6702048eae09e88c3e8fd8f6946 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:21:43 +0200 Subject: [PATCH 269/381] [cleanup] accept SBA_MODE_CLEAN_UP --- lib_com/bitstream.c | 3 - lib_com/ivas_cnst.h | 9 - lib_com/ivas_dirac_com.c | 239 --------------- lib_com/ivas_fb_mixer.c | 17 -- lib_com/ivas_prot.h | 68 ----- lib_com/ivas_sba_config.c | 13 - lib_com/ivas_spar_com.c | 6 - lib_com/options.h | 1 - lib_dec/ivas_corecoder_dec_reconfig.c | 5 - lib_dec/ivas_dec.c | 53 ---- lib_dec/ivas_dirac_dec.c | 151 --------- lib_dec/ivas_init_dec.c | 84 ----- lib_dec/ivas_jbm_dec.c | 48 --- lib_dec/ivas_masa_dec.c | 8 - lib_dec/ivas_output_config.c | 5 - lib_dec/ivas_qmetadata_dec.c | 36 --- lib_dec/ivas_sba_dec.c | 31 -- lib_dec/ivas_sba_dirac_stereo_dec.c | 30 -- lib_dec/ivas_sba_rendering_internal.c | 17 -- lib_dec/ivas_sce_dec.c | 9 - lib_dec/ivas_spar_decoder.c | 7 - lib_dec/ivas_stat_dec.h | 6 - lib_dec/lib_dec.c | 3 - lib_enc/ivas_cpe_enc.c | 12 - lib_enc/ivas_dirac_enc.c | 304 ------------------- lib_enc/ivas_enc.c | 25 -- lib_enc/ivas_init_enc.c | 20 -- lib_enc/ivas_ism_param_enc.c | 5 - lib_enc/ivas_masa_enc.c | 4 - lib_enc/ivas_mc_param_enc.c | 5 - lib_enc/ivas_mc_paramupmix_enc.c | 5 - lib_enc/ivas_mcmasa_enc.c | 14 - lib_enc/ivas_mct_enc.c | 16 - lib_enc/ivas_qmetadata_enc.c | 49 --- lib_enc/ivas_sba_enc.c | 22 -- lib_enc/ivas_sce_enc.c | 4 - lib_enc/ivas_spar_encoder.c | 134 -------- lib_enc/ivas_stat_enc.h | 15 - lib_enc/lib_enc.c | 7 - lib_rend/ivas_dirac_dec_binaural_functions.c | 12 - lib_rend/lib_rend.c | 9 - 41 files changed, 1511 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 2321d37334..b4a42e0b2e 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -2942,9 +2942,6 @@ ivas_error preview_indices( if ( bit_stream[2] == 0 ) { st_ivas->ivas_format = SBA_FORMAT; -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode = ivas_sba_mode_select(); -#endif } else { diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index aa9690ac1a..d314be3154 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -915,15 +915,6 @@ typedef enum { #define SBA_NHARM_HOA3 16 #define SBA_T_DESIGN_11_SIZE 70 #define SBA_DTX_BITRATE_THRESHOLD IVAS_80k -#ifndef SBA_MODE_CLEAN_UP -typedef enum -{ - SBA_MODE_NONE, - SBA_MODE_DIRAC, - SBA_MODE_SPAR, -} SBA_MODE; - -#endif /*----------------------------------------------------------------------------------* * DirAC Constants diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 3386cf5a99..e799d42c56 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -85,11 +85,7 @@ ivas_error ivas_dirac_config( { IVAS_FORMAT ivas_format; int16_t sba_order; -#ifndef SBA_MODE_CLEAN_UP - int16_t *nSCE, *nCPE, *element_mode, *nchan_transport; -#else int16_t *element_mode; -#endif int32_t ivas_total_brate; DIRAC_CONFIG_DATA_HANDLE hConfig; IVAS_QMETADATA_HANDLE hQMetaData; @@ -98,9 +94,6 @@ ivas_error ivas_dirac_config( ivas_error error; int16_t spar_dirac_split_band; IVAS_FB_MIXER_HANDLE hFbMdft; -#ifndef SBA_MODE_CLEAN_UP - SBA_MODE sba_mode; -#endif int16_t *dirac_to_spar_md_bands; @@ -110,23 +103,13 @@ ivas_error ivas_dirac_config( if ( enc_dec == ENC ) { ivas_format = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_format; -#ifndef SBA_MODE_CLEAN_UP - nSCE = &( ( (Encoder_Struct *) st_ivas )->nSCE ); - nCPE = &( (Encoder_Struct *) st_ivas )->nCPE; -#endif element_mode = &( (Encoder_Struct *) st_ivas )->hEncoderConfig->element_mode_init; -#ifndef SBA_MODE_CLEAN_UP - nchan_transport = &( (Encoder_Struct *) st_ivas )->nchan_transport; -#endif sba_order = ( (Encoder_Struct *) st_ivas )->sba_analysis_order; ivas_total_brate = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->ivas_total_brate; Fs = ( (Encoder_Struct *) st_ivas )->hEncoderConfig->input_Fs; band_grouping = ( (Encoder_Struct *) st_ivas )->hDirAC->band_grouping; hConfig = ( (Encoder_Struct *) st_ivas )->hDirAC->hConfig; hQMetaData = ( (Encoder_Struct *) st_ivas )->hQMetaData; -#ifndef SBA_MODE_CLEAN_UP - sba_mode = ( (Encoder_Struct *) st_ivas )->sba_mode; -#endif if ( ( (Encoder_Struct *) st_ivas )->hSpar != NULL ) { hFbMdft = ( (Encoder_Struct *) st_ivas )->hSpar->hFbMixer; @@ -135,32 +118,18 @@ ivas_error ivas_dirac_config( { hFbMdft = NULL; } -#ifndef SBA_MODE_CLEAN_UP - dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands; -#else dirac_to_spar_md_bands = ( (Encoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands; -#endif } else { ivas_format = ( (Decoder_Struct *) st_ivas )->ivas_format; -#ifndef SBA_MODE_CLEAN_UP - nSCE = &( (Decoder_Struct *) st_ivas )->nSCE; - nCPE = &( (Decoder_Struct *) st_ivas )->nCPE; -#endif element_mode = &( (Decoder_Struct *) st_ivas )->element_mode_init; -#ifndef SBA_MODE_CLEAN_UP - nchan_transport = &( (Decoder_Struct *) st_ivas )->nchan_transport; -#endif sba_order = ( (Decoder_Struct *) st_ivas )->sba_analysis_order; ivas_total_brate = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->ivas_total_brate; Fs = ( (Decoder_Struct *) st_ivas )->hDecoderConfig->output_Fs; band_grouping = ( (Decoder_Struct *) st_ivas )->hDirAC->band_grouping; hConfig = ( (Decoder_Struct *) st_ivas )->hDirAC->hConfig; hQMetaData = ( (Decoder_Struct *) st_ivas )->hQMetaData; -#ifndef SBA_MODE_CLEAN_UP - sba_mode = ( (Decoder_Struct *) st_ivas )->sba_mode; -#endif if ( ( (Decoder_Struct *) st_ivas )->hSpar != NULL ) { hFbMdft = ( (Decoder_Struct *) st_ivas )->hSpar->hFbMixer; @@ -170,18 +139,10 @@ ivas_error ivas_dirac_config( hFbMdft = NULL; } ( (Decoder_Struct *) st_ivas )->hDirAC->hFbMdft = hFbMdft; -#ifndef SBA_MODE_CLEAN_UP - dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hDirAC->dirac_to_spar_md_bands; -#else dirac_to_spar_md_bands = ( (Decoder_Struct *) st_ivas )->hSpar->dirac_to_spar_md_bands; -#endif } -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) -#else if ( ivas_format == SBA_FORMAT ) -#endif { hConfig->nbands = IVAS_MAX_NUM_BANDS; @@ -204,22 +165,14 @@ ivas_error ivas_dirac_config( #endif if ( ivas_format == SBA_FORMAT ) /* skip for MASA decoder */ { -#ifndef SBA_MODE_CLEAN_UP - if ( ( error = ivas_dirac_sba_config( hQMetaData, nchan_transport, nSCE, nCPE, element_mode, ivas_total_brate, sba_order, sba_mode, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_dirac_sba_config( hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) -#endif { return error; } if ( hQMetaData != NULL ) { -#ifndef SBA_MODE_CLEAN_UP - if ( enc_dec == ENC || sba_mode != SBA_MODE_SPAR ) -#else if ( enc_dec == ENC || ivas_format != SBA_FORMAT ) -#endif { hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands; } @@ -227,10 +180,6 @@ ivas_error ivas_dirac_config( } -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) - { -#endif hConfig->dec_param_estim = TRUE; if ( hConfig->dec_param_estim == TRUE ) { @@ -245,23 +194,9 @@ ivas_error ivas_dirac_config( set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; } -#ifndef SBA_MODE_CLEAN_UP - } - else - { - if ( *nchan_transport > 2 ) - { - hConfig->dec_param_estim = TRUE; - } - } -#endif } -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) -#else if ( ivas_format == SBA_FORMAT ) -#endif { ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); } @@ -448,24 +383,12 @@ void ivas_get_dirac_sba_max_md_bits( ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ -#ifndef SBA_MODE_CLEAN_UP - int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE, /* o : number of CPEs */ -#endif int16_t *element_mode, /* i/o: element mode of the core coder */ int32_t sba_total_brate, /* i : SBA total bitrate */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#endif const int16_t nbands /* i : number of frequency bands */ ) { -#ifndef SBA_MODE_CLEAN_UP - int16_t i; - int16_t nbands_wb; -#endif int16_t nbands_coded; int16_t hodirac_flag; ivas_error error; @@ -474,10 +397,6 @@ ivas_error ivas_dirac_sba_config( hQMetaData->is_masa_ivas_format = 0; hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order ); -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) - { -#endif /* map the bitrate for SID frame */ if ( sba_total_brate == IVAS_SID_5k2 ) { @@ -537,164 +456,6 @@ ivas_error ivas_dirac_sba_config( hQMetaData->q_direction[0].cfg.nbands ); return error; -#ifndef SBA_MODE_CLEAN_UP - } - - if ( sba_total_brate > IVAS_SID_5k2 ) - { - *nchan_transport = ivas_get_sba_num_TCs( sba_total_brate, sba_order ); - } - else if ( sba_total_brate == IVAS_SID_5k2 ) - { - switch ( *element_mode ) - { - case IVAS_CPE_MDCT: - *nchan_transport = 2; - break; - case IVAS_SCE: - *nchan_transport = 1; - break; - default: - assert( !"Wrong initial element mode for SBA SID!" ); - break; - } - } - - if ( hQMetaData != NULL ) - { - ivas_set_qmetadata_maxbit_req( hQMetaData, SBA_FORMAT ); - if ( sba_total_brate <= IVAS_16k4 ) - { - hQMetaData->useLowerRes = 1; - } - else - { - hQMetaData->useLowerRes = 0; - } - if ( sba_total_brate >= IVAS_96k ) - { - { - int16_t no_dirs = 1; - if ( hodirac_flag ) - { - no_dirs = 2; - } - if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 6, no_dirs, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - } - nbands_wb = 4; - } - else - { - if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 5, 1, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - - nbands_wb = 4; - } - for ( i = 0; i < hQMetaData->no_directions; i++ ) - { - hQMetaData->q_direction[i].cfg.start_band = 0; - } - - if ( *nchan_transport > 2 && *nchan_transport <= 8 ) - { - *nCPE = ( ( *nchan_transport + 1 ) / 2 ); - *nSCE = 0; - - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); - - hQMetaData->metadata_max_bits = MAX16B; /* no limit */ - for ( i = 0; i < hQMetaData->no_directions; i++ ) - { - hQMetaData->q_direction[i].cfg.search_effort = 1; - - if ( hodirac_flag ) - { - hQMetaData->q_direction[i].cfg.start_band = 0; - } - else - { - hQMetaData->q_direction[i].cfg.start_band = nbands_wb; - } - } - - *element_mode = IVAS_CPE_MDCT; - } - else if ( *nchan_transport == 2 ) - { - *nCPE = 1; - *nSCE = 0; - - if ( sba_total_brate <= IVAS_48k ) - { - hQMetaData->bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 120; - } - else if ( sba_total_brate <= IVAS_64k ) - { - hQMetaData->bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_80k ) - { - hQMetaData->bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else if ( sba_total_brate <= IVAS_96k ) - { - hQMetaData->bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 200; - } - else - { - hQMetaData->bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC ); - hQMetaData->metadata_max_bits = 250; - } - - *element_mode = IVAS_CPE_MDCT; - } - else if ( *nchan_transport == 1 ) - { - *nCPE = 0; - *nSCE = 1; - - if ( sba_total_brate <= IVAS_13k2 ) - { - hQMetaData->bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 70; - } - else if ( sba_total_brate <= IVAS_16k4 ) - { - hQMetaData->bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 80; - } - else if ( sba_total_brate <= IVAS_24k4 ) - { - hQMetaData->bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 160; - } - else if ( sba_total_brate <= IVAS_32k ) - { - } - else - { - hQMetaData->bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC; - hQMetaData->metadata_max_bits = 176; - } - - *element_mode = IVAS_SCE; - } - else - { - assert( !"SBA number of transport channels must be 8 or lower" ); - } - } - return error; -#endif } diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index dbbce9afe4..c9edff81db 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -101,9 +101,6 @@ static int16_t ivas_get_num_bands( ivas_error ivas_fb_set_cfg( IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ const int16_t ivas_format, /* i : IVAS format */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#endif const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ @@ -137,23 +134,9 @@ ivas_error ivas_fb_set_cfg( { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) - { -#endif pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); pFb_cfg->prior_input_length = NS2SA( sampling_rate, FRAME_SIZE_NS ); pFb_cfg->windowed_fr_offset = (int16_t) ( (float) ( sampling_rate / FRAMES_PER_SEC ) * 3.0f / 4.0f ) - NS2SA( sampling_rate, DELAY_DIRAC_SPAR_ENC_CMP_NS ); -#ifndef SBA_MODE_CLEAN_UP - } - else /* SBA_MODE_DIRAC */ - { - pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_1_NS ); - pFb_cfg->prior_input_length = NS2SA( sampling_rate, DELAY_DIRAC_ENC_CMP_NS ) + NS2SA( sampling_rate, DIRAC_SLOT_ENC_NS ); - /* extra SPAR/DirAC synchro delay */ - pFb_cfg->prior_input_length += NS2SA( sampling_rate, DELAY_FB_1_NS ); - } -#endif } else if ( ivas_format == MASA_FORMAT ) { diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 96c6ca9a90..cfd5e5925a 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3115,10 +3115,6 @@ void reset_metadata_spatial( int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ const int16_t nb_bits_metadata /* i : number of meatdata bits */ -#ifndef SBA_MODE_CLEAN_UP - , - const SBA_MODE sba_mode /* i : SBA mode */ -#endif ); /*! r: number of bits written */ @@ -3127,10 +3123,6 @@ void ivas_qmetadata_enc_sid_encode( IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure*/ const int16_t ivas_format /* i : ivas format */ -#ifndef SBA_MODE_CLEAN_UP - , - const SBA_MODE sba_mode /* i : SBA mode */ -#endif ); /*! r: number of bits read */ @@ -3162,10 +3154,6 @@ int16_t ivas_qmetadata_dec_sid_decode( const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ const int16_t ivas_format /* i : IVAS format */ -#ifndef SBA_MODE_CLEAN_UP - , - const SBA_MODE sba_mode /* i : SBA mode */ -#endif ); void ivas_qmetadata_to_dirac( @@ -3173,11 +3161,7 @@ void ivas_qmetadata_to_dirac( DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */ MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#else const IVAS_FORMAT ivas_format, /* i : IVAS format */ -#endif const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -3378,27 +3362,13 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode -#else const IVAS_FORMAT ivas_format -#endif , const int16_t hodirac_flag, const int16_t nchan_fb_in ); -#ifndef SBA_MODE_CLEAN_UP -/*----------------------------------------------------------------------------------* - * SBA format prototypes - *----------------------------------------------------------------------------------*/ - -/*! r: SBA format mode */ -SBA_MODE ivas_sba_mode_select( - void -); -#endif void ivas_sba_config( const int32_t sba_total_brate, /* i : SBA total bitrate */ int16_t sba_order, /* i : Ambisonic (SBA) order */ @@ -3555,18 +3525,6 @@ void ivas_dirac_enc_close( const int32_t input_Fs /* i : input sampling_rate */ ); -#ifndef SBA_MODE_CLEAN_UP -void ivas_dirac_enc( - DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - int16_t *nb_bits_metadata, /* o : number of metadata bits written */ - const int16_t Opt_DTX_ON, /* i : flag signaling DTX on */ - float data_f[][L_FRAME48k], /* i/o: SBA channels */ - const int16_t input_frame, /* i : input frame length */ - const int16_t sba_planar /* i : SBA planar flag */ -); -#else void ivas_dirac_enc( DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ @@ -3579,7 +3537,6 @@ void ivas_dirac_enc( const IVAS_FORMAT ivas_format, /* i : ivas format */ int16_t hodirac_flag /* i : hodirac flag */ ); -#endif ivas_error ivas_dirac_config( void *st_ivas, /* i/o: IVAS encoder/decoder state structure */ const int16_t enc_dec /* i : encoder or decoder flag */ @@ -3604,17 +3561,9 @@ void ivas_get_dirac_sba_max_md_bits( ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ -#ifndef SBA_MODE_CLEAN_UP - int16_t *nchan_transport, /* o : number of transport channel needed for MASA format */ - int16_t *nSCE, /* o : number of SCEs */ - int16_t *nCPE, /* o : number of CPEs */ -#endif int16_t *element_mode, /* o : element mode of the core coder */ int32_t sba_total_brate, /* i : SBA total bitrate */ const int16_t sba_order, /* i : Ambisonic (SBA) order */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#endif const int16_t nbands /* i : number of frequency bands */ ); @@ -3647,9 +3596,6 @@ void ivas_dirac_dec_read_BS( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q metadata */ int16_t *nb_bits, /* o : number of bits read */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#endif const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); @@ -5422,12 +5368,8 @@ void computeReferencePower_enc( float *reference_power, /* o : Estimated power */ const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode /* i : SBA mode */ -#else const IVAS_FORMAT ivas_format, /* i : ivas_format */ int16_t ref_power_w /* i : use 0 if hodirac is enabled */ -#endif , const int16_t nchan_ana /* i : number of analysis channels */ ); @@ -5554,9 +5496,6 @@ ivas_error ivas_td_binaural_renderer_sf( ivas_error ivas_fb_set_cfg( IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ const int16_t ivas_format, /* i : IVAS format */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#endif const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ @@ -5587,13 +5526,6 @@ void ivas_fb_mixer_pcm_ingest( const int16_t HOA_md_ind[IVAS_SPAR_MAX_CH] ); -#ifndef SBA_MODE_CLEAN_UP -void ivas_dirac_enc_spar_delay_synchro( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const int16_t input_frame, /* i : input frame length */ - float data_f[][L_FRAME48k] /* i/o: SBA channels (ACN / SN3D) */ -); -#endif void ivas_fb_mixer_update_prior_input( IVAS_FB_MIXER_HANDLE hFbMixer, /* i/o: FB mixer handle */ float *pcm_in[], /* i : input audio channels */ diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index 450ebef791..91137d3433 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -47,19 +47,6 @@ #include "wmc_auto.h" -#ifndef SBA_MODE_CLEAN_UP -/*-------------------------------------------------------------------* - * ivas_sba_mode_select() - * - * Return SBA mode - *-------------------------------------------------------------------*/ - -/*! r: SBA format mode */ -SBA_MODE ivas_sba_mode_select() -{ - return SBA_MODE_SPAR; -} -#endif /*-------------------------------------------------------------------* * ivas_sba_config() * diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index f8f3fa1209..8be61ea768 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -435,12 +435,6 @@ int16_t ivas_get_sba_num_TCs( { nchan_transport = 1; } -#ifndef SBA_MODE_CLEAN_UP - else if ( ivas_sba_mode_select() == SBA_MODE_DIRAC ) - { - nchan_transport = 1; - } -#endif else { table_idx = ivas_get_spar_table_idx( ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); diff --git a/lib_com/options.h b/lib_com/options.h index 3b04c7fd45..46bce4c1c8 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ -#define SBA_MODE_CLEAN_UP /* Dlb: Cean up SBA mode references */ #define FIX_502_IND_LIST_SIZE /* Fix issue #502: insufficient index buffer sizes */ #define FIX_505_MASA_SPHGRID_REUSE /* Nokia: Fix issue #505: MASA spherical grid reuse fix */ diff --git a/lib_dec/ivas_corecoder_dec_reconfig.c b/lib_dec/ivas_corecoder_dec_reconfig.c index e112a8ec04..ffd96b635c 100644 --- a/lib_dec/ivas_corecoder_dec_reconfig.c +++ b/lib_dec/ivas_corecoder_dec_reconfig.c @@ -511,13 +511,8 @@ ivas_error ivas_cldfb_dec_reconfig( } } -#ifndef SBA_MODE_CLEAN_UP - /* CLDFB Interpolation weights */ - if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) -#else /* CLDFB Interpolation weights */ if ( st_ivas->ivas_format == SBA_FORMAT && ( numCldfbAnalyses_old != numCldfbAnalyses || numCldfbSyntheses_old != numCldfbSyntheses || nchan_transport_old != st_ivas->nchan_transport ) && numCldfbAnalyses != 0 && numCldfbSyntheses != 0 ) -#endif { ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 1fb8e06cc3..5c34af0a36 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -272,54 +272,17 @@ ivas_error ivas_dec( set_s( nb_bits_metadata, 0, MAX_SCE ); /* read parameters from the bitstream */ -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) -#else if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hQMetaData != NULL ) -#endif { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->ivas_format == SBA_FORMAT ) - { - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), - 0 ); - } - else - { -#endif if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) { return error; } -#ifndef SBA_MODE_CLEAN_UP - } -#endif } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->hQMetaData != NULL ) - { - st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - -#ifndef SBA_MODE_CLEAN_UP - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), - st_ivas->hSpar->dirac_to_spar_md_bands ); -#else - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ), - st_ivas->hSpar->dirac_to_spar_md_bands ); -#endif - } -#endif if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) { @@ -376,11 +339,7 @@ ivas_error ivas_dec( { nchan_remapped = nchan_out; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); @@ -411,20 +370,12 @@ ivas_error ivas_dec( { nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame ); -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) -#else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) -#endif { ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->renderer_type != RENDERER_DISABLE ) -#else else if ( st_ivas->renderer_type != RENDERER_DISABLE ) -#endif { ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); } @@ -458,11 +409,7 @@ ivas_error ivas_dec( { ivas_dirac_dec_binaural( st_ivas, output, nchan_remapped ); } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT ) -#else else if ( st_ivas->ivas_format == MASA_FORMAT ) -#endif { if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 3bde2aa5ee..0b795ddd31 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -312,11 +312,7 @@ ivas_error ivas_dirac_dec_config( num_protos_diff_old = 0; nchan_transport_orig = st_ivas->nchan_transport; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) -#else if ( st_ivas->ivas_format == SBA_FORMAT && !( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) -#endif { st_ivas->nchan_transport = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); @@ -421,11 +417,7 @@ ivas_error ivas_dirac_dec_config( } /* band config needed only for SPAR with FOA output */ -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->sba_mode == SBA_MODE_SPAR && !hodirac_flag ) -#else if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_FOA && st_ivas->ivas_format == SBA_FORMAT && !hodirac_flag ) -#endif { return IVAS_ERR_OK; } @@ -587,11 +579,7 @@ ivas_error ivas_dirac_dec_config( set_s( hDirAC->proto_index_diff, 0, hDirAC->num_outputs_diff ); hDirAC->sba_map_tc = sba_map_tc; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) -#else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { if ( st_ivas->sba_order > SBA_FOA_ORDER && ivas_total_brate >= IVAS_512k ) { @@ -696,11 +684,7 @@ ivas_error ivas_dirac_dec_config( { hDirAC->num_protos_diff = 1; hDirAC->num_protos_dir = nchan_transport; -#ifndef SBA_MODE_CLEAN_UP - if ( ( st_ivas->sba_planar ) && ( !( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) ) ) -#else if ( ( st_ivas->sba_planar ) && ( !( st_ivas->ivas_format == SBA_FORMAT ) ) ) -#endif { hDirAC->num_protos_dir++; } @@ -810,11 +794,7 @@ ivas_error ivas_dirac_dec_config( if ( flag_config == DIRAC_OPEN ) { hDirAC->hoa_decoder = NULL; -#ifndef SBA_MODE_CLEAN_UP - if ( ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->sba_mode == SBA_MODE_SPAR || ( nchan_transport > 2 ) ) -#else if ( ( hDirAC->panningConf == DIRAC_PANNING_HOA3 ) || st_ivas->ivas_format == SBA_FORMAT || ( nchan_transport > 2 ) ) -#endif { if ( hDirAC->hOutSetup.is_loudspeaker_setup ) { @@ -1047,22 +1027,6 @@ ivas_error ivas_dirac_dec_config( { int16_t num_slots_in_subfr; num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) - { -#ifdef FIX_393_459_460_SBA_MD - hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; -#else - hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES * num_slots_in_subfr; -#endif - hDirAC->dirac_bs_md_write_idx = 0; - hDirAC->spar_to_dirac_write_idx = 0; - hDirAC->dirac_read_idx = 0; - hDirAC->dirac_estimator_idx = 0; - } - else - { -#endif #ifdef FIX_393_459_460_SBA_MD hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ); hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; @@ -1074,9 +1038,6 @@ ivas_error ivas_dirac_dec_config( #endif hDirAC->dirac_read_idx = 0; hDirAC->dirac_estimator_idx = 0; -#ifndef SBA_MODE_CLEAN_UP - } -#endif set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); #ifdef FIX_393_459_460_SBA_MD @@ -1123,11 +1084,7 @@ ivas_error ivas_dirac_dec_config( { int16_t num_slots_in_subfr; num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { if ( ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) ) { @@ -1151,11 +1108,7 @@ ivas_error ivas_dirac_dec_config( { if ( st_ivas->hDecoderConfig->voip_active == 1 && st_ivas->hTcBuffer == NULL ) { -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) -#else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { int16_t nchan_to_allocate; @@ -1746,9 +1699,6 @@ void ivas_dirac_dec_read_BS( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ int16_t *nb_bits, /* o : number of bits read */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#endif const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) @@ -1765,40 +1715,8 @@ void ivas_dirac_dec_read_BS( b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode != SBA_MODE_SPAR ) - { - assert( ( b == 0 ) || ( hQMetaData->q_direction[0].cfg.start_band > 0 ) ); - } -#endif if ( b == 1 ) /* WB 4TCs condition, no other metadata to read*/ { -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode != SBA_MODE_SPAR ) - { - if ( hDirAC != NULL ) - { - /* No Data transmitted*/ - hQMetaData->q_direction[0].cfg.nblocks = 0; - for ( dir = 0; dir < hQMetaData->no_directions; dir++ ) - { - for ( b = 0; b < hQMetaData->q_direction[dir].cfg.nbands; b++ ) - { - set_zero( hQMetaData->q_direction[dir].band_data[b].azimuth, MAX_PARAM_SPATIAL_SUBFRAMES ); - set_zero( hQMetaData->q_direction[dir].band_data[b].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); - { - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - hQMetaData->q_direction[dir].band_data[b].energy_ratio_index[i] = 0; - } - } - } - } - } - } - else - { -#endif orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; hQMetaData->sba_inactive_mode = 1; @@ -1813,11 +1731,7 @@ void ivas_dirac_dec_read_BS( } } -#ifndef SBA_MODE_CLEAN_UP - *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); -#else *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); -#endif for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; @@ -1835,9 +1749,6 @@ void ivas_dirac_dec_read_BS( } hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; -#ifndef SBA_MODE_CLEAN_UP - } -#endif } else { @@ -1887,15 +1798,7 @@ void ivas_dirac_dec_read_BS( } } -#ifndef SBA_MODE_CLEAN_UP - *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); -#else *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); -#endif -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) - { -#endif for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; @@ -1913,29 +1816,15 @@ void ivas_dirac_dec_read_BS( } hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; -#ifndef SBA_MODE_CLEAN_UP - } - else - { - *nb_bits += SID_FORMAT_NBITS; - } - -#endif st->next_bit_pos = next_bit_pos_orig; } if ( hDirAC != NULL ) { -#ifndef SBA_MODE_CLEAN_UP - ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, sba_mode, - hodirac_flag, - dirac_to_spar_md_bands ); -#else ivas_qmetadata_to_dirac( hQMetaData, hDirAC, NULL, ivas_total_brate, SBA_FORMAT, hodirac_flag, dirac_to_spar_md_bands ); -#endif } return; @@ -1953,11 +1842,7 @@ void ivas_qmetadata_to_dirac( DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */ MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#else const IVAS_FORMAT ivas_format, /* i : IVAS format */ -#endif const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) @@ -2082,11 +1967,7 @@ void ivas_qmetadata_to_dirac( nbands = hDirAC->band_grouping[hDirAC->hConfig->nbands]; band_grouping = hDirAC->band_grouping; -#ifndef SBA_MODE_CLEAN_UP - if ( ivas_total_brate <= IVAS_SID_5k2 && sba_mode != SBA_MODE_SPAR ) -#else if ( ivas_total_brate <= IVAS_SID_5k2 && ivas_format != SBA_FORMAT ) -#endif { /* SID/zero-frame: 1 direction, 5 bands, nblocks re-generated out of SID decoder*/ start_band = 0; @@ -2097,11 +1978,7 @@ void ivas_qmetadata_to_dirac( else { start_band = hDirAC->hConfig->enc_param_start_band; -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) -#else if ( ivas_format == SBA_FORMAT ) -#endif { hDirAC->hConfig->nbands = IVAS_MAX_NUM_BANDS; } @@ -2188,11 +2065,7 @@ void ivas_qmetadata_to_dirac( band_end = band_grouping[band + 1]; tmp_write_idx_param_band = hDirAC->dirac_bs_md_write_idx; -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) -#else if ( ivas_format == SBA_FORMAT ) -#endif { qBand_idx = dirac_to_spar_md_bands[band] - start_band; } @@ -2497,11 +2370,7 @@ void ivas_dirac_dec( st_ivas->hTcBuffer->tc[n] = output_f[n]; } -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) -#else if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) -#endif { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; st_ivas->hTcBuffer->tc[nchan_transport] = &cng_td_buffer[0]; @@ -2531,11 +2400,7 @@ void ivas_dirac_dec( { st_ivas->hTcBuffer->tc[n] = NULL; } -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) -#else if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) -#endif { st_ivas->hTcBuffer->tc[nchan_transport] = NULL; } @@ -2680,11 +2545,7 @@ void ivas_dirac_dec_render_sf( hodirac_flag = ivas_get_hodirac_flag( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ); -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT ) -#else - if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) -#endif { coherence_flag = st_ivas->hQMetaData->coherence_flag; } @@ -2899,11 +2760,7 @@ void ivas_dirac_dec_render_sf( md_idx = hDirAC->render_to_md_map[subframe_idx]; } -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) -#else - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#endif { for ( ch = 0; ch < nchan_transport; ch++ ) { @@ -2925,11 +2782,7 @@ void ivas_dirac_dec_render_sf( } /* CNG in DirAC, extra CLDFB ana for CNA*/ -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format != SBA_FORMAT ) -#else - if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) -#endif { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; @@ -3403,11 +3256,7 @@ void ivas_dirac_dec_render_sf( st_ivas->cldfbSynDec[ch] ); } } -#ifdef SBA_MODE_CLEAN_UP else if ( st_ivas->ivas_format == SBA_FORMAT ) -#else - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#endif { for ( ch = 0; ch < hDirAC->hOutSetup.nchan_out_woLFE; ch++ ) { diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d89f33e075..d4699a7273 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -260,18 +260,10 @@ ivas_error ivas_dec_setup( if ( st_ivas->ini_frame > 0 && st_ivas->ivas_format == SBA_FORMAT ) { int16_t nchan_transport_old, nchan_transport; -#ifndef SBA_MODE_CLEAN_UP - SBA_MODE sba_mode_old; - sba_mode_old = ivas_sba_mode_select(); -#endif nchan_transport_old = st_ivas->nchan_transport; nchan_transport = ( st_ivas->sid_format == SID_SBA_2TC ) ? 2 : 1; -#ifdef SBA_MODE_CLEAN_UP if ( ( nchan_transport_old != nchan_transport ) ) -#else - if ( ( nchan_transport_old != nchan_transport ) || ( sba_mode_old != st_ivas->sba_mode ) ) -#endif { /*Setting the default bitrate for the reconfig function*/ if ( st_ivas->sid_format == SID_SBA_2TC ) @@ -280,12 +272,7 @@ ivas_error ivas_dec_setup( } else { -#ifdef SBA_MODE_CLEAN_UP st_ivas->hDecoderConfig->ivas_total_brate = IVAS_24k4; -#else - st_ivas->hDecoderConfig->ivas_total_brate = ( st_ivas->sba_mode == SBA_MODE_SPAR ) ? IVAS_24k4 : IVAS_13k2; - -#endif } if ( ( error = ivas_sba_dec_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) @@ -406,9 +393,6 @@ static ivas_error ivas_read_format( else { st_ivas->ivas_format = SBA_FORMAT; -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode = ivas_sba_mode_select(); -#endif } ( *num_bits_read )++; break; @@ -476,16 +460,6 @@ static ivas_error ivas_read_format( { st_ivas->sba_analysis_order = SBA_FOA_ORDER; } -#ifndef SBA_MODE_CLEAN_UP - if ( idx == 1 ) - { - st_ivas->sba_mode = SBA_MODE_SPAR; - } - else - { - st_ivas->sba_mode = SBA_MODE_DIRAC; - } -#endif } /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ @@ -580,9 +554,6 @@ ivas_error ivas_init_decoder_front( st_ivas->ism_mode = ISM_MODE_NONE; st_ivas->mc_mode = MC_MODE_NONE; -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode = SBA_MODE_NONE; -#endif st_ivas->sba_dirac_stereo_flag = 0; @@ -676,11 +647,7 @@ ivas_error ivas_init_decoder( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { -#ifndef SBA_MODE_CLEAN_UP - int16_t i, k, n; -#else int16_t i, n; -#endif int16_t sce_id, cpe_id; int16_t numCldfbAnalyses, numCldfbSyntheses; int16_t granularity, n_channels_transport_jbm; @@ -886,10 +853,6 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->ivas_format == SBA_FORMAT ) { -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) - { -#endif if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) { return error; @@ -905,17 +868,9 @@ ivas_error ivas_init_decoder( if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, -#ifndef SBA_MODE_CLEAN_UP - &st_ivas->nchan_transport, - &st_ivas->nSCE, - &st_ivas->nCPE, -#endif &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode, -#endif ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) { return error; @@ -928,12 +883,6 @@ ivas_error ivas_init_decoder( return error; } -#ifndef SBA_MODE_CLEAN_UP - for ( k = 0; k < DIRAC_MAX_NBANDS; k++ ) - { - st_ivas->hSpar->dirac_to_spar_md_bands[k] = st_ivas->hDirAC->dirac_to_spar_md_bands[k]; - } -#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; } else @@ -953,27 +902,10 @@ ivas_error ivas_init_decoder( st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); -#ifndef SBA_MODE_CLEAN_UP - } - else /* SBA_MODE_DIRAC */ - { - if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, st_ivas->sba_mode, -1 ) ) != IVAS_ERR_OK ) - { - return error; - } - - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); - } -#endif } -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->ivas_format != SBA_FORMAT ) -#else - if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && - st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode != SBA_MODE_SPAR ) -#endif { if ( ( error = ivas_dirac_dec_open( st_ivas ) ) != IVAS_ERR_OK ) { @@ -1438,11 +1370,7 @@ ivas_error ivas_init_decoder( } /* CLDFB Interpolation weights */ -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) -#else - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && !st_ivas->sba_dirac_stereo_flag && st_ivas->hDecoderConfig->nchan_out != 1 ) -#endif { ivas_spar_get_cldfb_gains( st_ivas->hSpar, st_ivas->cldfbAnaDec[0], st_ivas->cldfbSynDec[0], hDecoderConfig ); } @@ -1949,11 +1877,7 @@ void ivas_init_dec_get_num_cldfb_instances( } break; case RENDERER_DIRAC: -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) -#else - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#endif { *numCldfbAnalyses = st_ivas->hSpar->hFbMixer->fb_cfg->num_in_chans; @@ -1970,11 +1894,7 @@ void ivas_init_dec_get_num_cldfb_instances( *numCldfbSyntheses = MAX_OUTPUT_CHANNELS; } } -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format != SBA_FORMAT ) -#else - if ( st_ivas->sba_mode != SBA_MODE_SPAR ) -#endif { if ( st_ivas->nchan_transport > 2 && st_ivas->sba_planar ) { @@ -2015,11 +1935,7 @@ void ivas_init_dec_get_num_cldfb_instances( case RENDERER_BINAURAL_MIXER_CONV_ROOM: case RENDERER_BINAURAL_FASTCONV: case RENDERER_BINAURAL_FASTCONV_ROOM: -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) -#else - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#endif { if ( st_ivas->sba_dirac_stereo_flag ) { diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 91c7a1c185..a0dd0aad18 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -183,21 +183,13 @@ ivas_error ivas_jbm_dec_tc( set_s( nb_bits_metadata, 0, MAX_SCE ); /* read parameters from the bitstream */ -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) -#else if ( st_ivas->hQMetaData != NULL && st_ivas->ivas_format != SBA_FORMAT ) -#endif { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; if ( st_ivas->ivas_format == SBA_FORMAT ) { -#ifndef SBA_MODE_CLEAN_UP - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, hodirac_flag, 0 ); -#else ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, 0 ); -#endif } else { @@ -207,23 +199,8 @@ ivas_error ivas_jbm_dec_tc( } } } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->hQMetaData != NULL ) - { - st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; -#ifndef SBA_MODE_CLEAN_UP - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], st_ivas->sba_mode, hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands ); -#else - ivas_dirac_dec_read_BS( ivas_total_brate, st, st_ivas->hDirAC, st_ivas->hQMetaData, &nb_bits_metadata[0], hodirac_flag, st_ivas->hSpar->dirac_to_spar_md_bands ); -#endif - } -#endif if ( ( error = ivas_spar_dec( st_ivas, nb_bits_metadata ) ) != IVAS_ERR_OK ) { @@ -269,11 +246,7 @@ ivas_error ivas_jbm_dec_tc( { nchan_remapped = nchan_out; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { ivas_agc_dec_process( st_ivas->hSpar->hAgcDec, output, output, st_ivas->hSpar->hMdDec->spar_md_cfg.nchan_transport, output_frame ); @@ -304,19 +277,11 @@ ivas_error ivas_jbm_dec_tc( { nchan_remapped = ivas_sba_remapTCs( output, st_ivas, output_frame ); -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) -#else if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) -#endif { ivas_sba_mix_matrix_determiner( st_ivas->hSpar, output, st_ivas->bfi, nchan_remapped, output_frame ); } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else else -#endif { ivas_spar_dec_agc_pca( st_ivas, output, output_frame ); } @@ -781,11 +746,7 @@ ivas_error ivas_jbm_dec_render( { ivas_dirac_dec_binaural_render( st_ivas, nSamplesAskedLocal, nSamplesRendered, nSamplesAvailableNext, nchan_remapped, p_output ); } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_DIRAC || st_ivas->ivas_format == MASA_FORMAT ) -#else else if ( st_ivas->ivas_format == MASA_FORMAT ) -#endif { if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC ) { @@ -1311,12 +1272,7 @@ int16_t ivas_jbm_dec_get_num_tc_channels( } if ( st_ivas->ivas_format == SBA_FORMAT ) { -#ifndef SBA_MODE_CLEAN_UP - if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && num_tc >= 3 ) || - ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && num_tc == 3 ) ) -#else if ( ( st_ivas->sba_planar && num_tc >= 3 ) || ( num_tc == 3 ) ) -#endif { num_tc++; } @@ -1834,11 +1790,7 @@ TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( } break; case RENDERER_SBA_LINEAR_DEC: -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) -#else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_MONO || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_STEREO ) ) -#endif { buffer_mode = TC_BUFFER_MODE_BUFFER; } diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index ae30e4bebd..87ddae3a5c 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -274,11 +274,7 @@ ivas_error ivas_masa_decode( } tmp_elem_mode = -1; -#ifndef SBA_MODE_CLEAN_UP - *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format, SBA_MODE_NONE ); -#else *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format ); -#endif if ( st_ivas->nchan_transport == 2 ) { assert( st_ivas->nCPE > 0 ); @@ -299,11 +295,7 @@ ivas_error ivas_masa_decode( if ( st_ivas->hDirAC != NULL ) { ivas_qmetadata_to_dirac( hQMetaData, st_ivas->hDirAC, hMasa, ivas_total_brate, -#ifndef SBA_MODE_CLEAN_UP - SBA_MODE_NONE, -#else ivas_format, -#endif 0, 0 ); } diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 52891aaf87..aec03b506b 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -316,13 +316,8 @@ void ivas_renderer_select( else if ( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == SBA_FORMAT ) { *renderer_type = RENDERER_DIRAC; -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) ) -#else - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && - ( output_config != AUDIO_CONFIG_5_1 && output_config != AUDIO_CONFIG_5_1_2 && output_config != AUDIO_CONFIG_5_1_4 && output_config != AUDIO_CONFIG_7_1 && output_config != AUDIO_CONFIG_7_1_4 && output_config != AUDIO_CONFIG_LS_CUSTOM && output_config != AUDIO_CONFIG_MONO && output_config != AUDIO_CONFIG_STEREO ) ) -#endif { if ( output_config == AUDIO_CONFIG_HOA2 || output_config == AUDIO_CONFIG_FOA ) { diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index bd63c14daf..73043ec78e 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -1225,10 +1225,6 @@ int16_t ivas_qmetadata_dec_sid_decode( const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ const int16_t ivas_format /* i : IVAS format */ -#ifndef SBA_MODE_CLEAN_UP - , - const SBA_MODE sba_mode /* i : SBA mode */ -#endif ) { int16_t b, m, i; @@ -1259,21 +1255,8 @@ int16_t ivas_qmetadata_dec_sid_decode( if ( ivas_format == SBA_FORMAT ) { -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) - { -#endif /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ -#ifndef SBA_MODE_CLEAN_UP - } - else - { - /* keep 13.2 and 16.4 sid bitrate as 4.4 kbps for now*/ - /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; - } -#endif } else { @@ -1299,11 +1282,7 @@ int16_t ivas_qmetadata_dec_sid_decode( /* Fix configuration for SID */ q_direction = &hQMetaData->q_direction[0]; /* only 1 direction */ -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) -#else if ( ivas_format == SBA_FORMAT ) -#endif { nbands = DIRAC_DTX_BANDS; /* only 2 bands transmitted */ } @@ -1316,11 +1295,7 @@ int16_t ivas_qmetadata_dec_sid_decode( start_band = 0; /* start from band 0 */ /* Read 2D signaling*/ -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode != SBA_MODE_SPAR ) -#else if ( ivas_format != SBA_FORMAT ) -#endif { q_direction->not_in_2D = bitstream[( *index )--]; } @@ -1405,18 +1380,7 @@ int16_t ivas_qmetadata_dec_sid_decode( } } /* TODO: temporary hack to keep BE */ -#ifndef SBA_MODE_CLEAN_UP - if ( ivas_format == SBA_FORMAT ) - { - if ( sba_mode != SBA_MODE_SPAR ) - { - metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - 1; /* -1 for spar/dirac indicator*/ - } - } - else -#else if ( ivas_format != SBA_FORMAT ) -#endif { metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 60d76b65df..6b8576a95f 100755 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -59,11 +59,7 @@ void ivas_sba_set_cna_cng_flag( { int16_t n, cpe_id; -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 1 ) -#else - if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->nchan_transport == 1 ) -#endif { /* skip as done in init function */ /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */ @@ -294,17 +290,9 @@ ivas_error ivas_sba_dec_reconfigure( if ( ( error = ivas_dirac_sba_config( st_ivas->hQMetaData, -#ifndef SBA_MODE_CLEAN_UP - &st_ivas->nchan_transport, - &st_ivas->nSCE, - &st_ivas->nCPE, -#endif &st_ivas->element_mode_init, ivas_total_brate, st_ivas->sba_analysis_order, -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode, -#endif ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) @@ -321,9 +309,6 @@ ivas_error ivas_sba_dec_reconfigure( if ( st_ivas->hDirAC != NULL ) { -#ifndef SBA_MODE_CLEAN_UP - mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); -#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; } @@ -389,11 +374,7 @@ ivas_error ivas_sba_dec_reconfigure( { tc_nchan_to_allocate = 2 * BINAURAL_CHANNELS; } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { tc_nchan_to_allocate = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); @@ -437,20 +418,12 @@ ivas_error ivas_sba_dec_digest_tc( error = IVAS_ERR_OK; /* set the md map */ -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->hDirAC && !( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->sba_mode == SBA_MODE_DIRAC ) ) -#else if ( st_ivas->hDirAC ) -#endif { ivas_dirac_dec_set_md_map( st_ivas, nCldfbSlots ); } -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { ivas_spar_dec_digest_tc( st_ivas, st_ivas->nchan_transport, nCldfbSlots, nSamplesForRendering ); } @@ -487,11 +460,7 @@ ivas_error ivas_sba_dec_digest_tc( } /* if we have a late CNG generation, do it here */ -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->sba_mode != SBA_MODE_SPAR ) -#else if ( st_ivas->nchan_transport == 1 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag && st_ivas->ivas_format == SBA_FORMAT ) -#endif { Decoder_State *st = st_ivas->hSCE[0]->hCoreCoder[0]; generate_masking_noise_lb_dirac( st->hFdCngDec->hFdCngCom, st_ivas->hTcBuffer->tc[1], nCldfbSlots, st->cna_dirac_flag && st->flag_cna ); diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index 7a5b492102..f96fdb694a 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -63,11 +63,7 @@ int16_t ivas_get_sba_dirac_stereo_flag( if ( st_ivas->ivas_format == SBA_FORMAT || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) { -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT ) -#else - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#endif { if ( output_config == AUDIO_CONFIG_STEREO || ( output_config == AUDIO_CONFIG_MONO && st_ivas->nchan_transport == 1 ) ) { @@ -854,12 +850,7 @@ void ivas_sba_dirac_stereo_dec( memOffset = NS2SA( output_frame * FRAMES_PER_SEC, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); ivas_sba_dirac_stereo_config( hStereoDft->hConfig ); -#ifdef SBA_MODE_CLEAN_UP hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) ); -#else - hStereoDft->nbands = ivas_sba_dirac_stereo_band_config( hStereoDft->band_limits, st_ivas->hDecoderConfig->output_Fs, hStereoDft->NFFT, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) ); - -#endif stereo_dft_dec_update( hStereoDft, output_frame, 1 /*st_ivas->sba_dirac_stereo_flag*/ ); if ( st_ivas->nchan_transport > 1 ) { @@ -881,22 +872,11 @@ void ivas_sba_dirac_stereo_dec( } /* mapping of DirAC parameters (azimuth, elevation, diffuseness) to DFT Stereo parameters (side gain, prediction gain) */ -#ifdef SBA_MODE_CLEAN_UP map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0], st_ivas->ivas_format == MC_FORMAT, ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame, ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ) ); -#else - map_params_dirac_to_stereo( hStereoDft, st_ivas->hQMetaData, tmp_synth, DFT[0], - st_ivas->ivas_format == MC_FORMAT, - ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ) ? hSCE->hCoreCoder[0]->L_frame : output_frame, - ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ) ); -#endif -#ifdef SBA_MODE_CLEAN_UP if ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) -#else - if ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) -#endif { set_f( hStereoDft->res_pred_gain, 1.f, 3 * STEREO_DFT_BAND_MAX ); } @@ -940,13 +920,8 @@ void ivas_sba_dirac_stereo_dec( /* upmix ACELP BWE */ ivas_sba_dirac_stereo_compute_hb_gain( hStereoDft, hb_gain ); -#ifdef SBA_MODE_CLEAN_UP ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, ( st_ivas->ivas_format != SBA_FORMAT || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); -#else - ivas_sba_dirac_stereo_upmix_hb( hb_synth_stereo, hSCE->save_hb_synth, hb_gain, output_frame, - ( st_ivas->sba_mode != SBA_MODE_SPAR || mcmasa ), sba_mono_flag, hSCE->hCoreCoder[0]->bwidth, hStereoDft ); -#endif /* add HB to ACELP core */ v_add( output[0], hb_synth_stereo[0], output[0], output_frame ); @@ -955,12 +930,7 @@ void ivas_sba_dirac_stereo_dec( v_add( output[1], hb_synth_stereo[1], output[1], output_frame ); /* apply TD Stereo Filling as is done in ICBWE */ -#ifdef SBA_MODE_CLEAN_UP ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->ivas_format == SBA_FORMAT && !mcmasa ) ); -#else - ivas_sba_dirac_stereo_apply_td_stefi( hStereoDft, output, output_frame, ( st_ivas->sba_mode == SBA_MODE_SPAR && !mcmasa ) ); - -#endif } } diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index b683262a6e..5415609d80 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -232,21 +232,10 @@ int16_t ivas_sba_remapTCs( #endif nchan_remapped = st_ivas->nchan_transport; -#ifdef SBA_MODE_CLEAN_UP if ( nchan_remapped == 3 ) -#else - if ( ( st_ivas->sba_mode != SBA_MODE_SPAR && st_ivas->sba_planar && nchan_remapped >= 3 ) || - ( ( st_ivas->sba_mode == SBA_MODE_SPAR ) && nchan_remapped == 3 ) ) -#endif { nchan_remapped++; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode != SBA_MODE_SPAR ) - { - assert( ( ( st_ivas->nchan_transport == 3 ) || ( st_ivas->nchan_transport == 5 ) || ( st_ivas->nchan_transport == 7 ) ) && "Number of channels must be odd for SBA planar!" ); - } -#endif if ( nchan_remapped == 4 ) { @@ -273,12 +262,6 @@ int16_t ivas_sba_remapTCs( } } -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode != SBA_MODE_SPAR ) - { - ivas_sba_zero_vert_comp( sba_data, st_ivas->sba_analysis_order, st_ivas->sba_planar, output_frame ); - } -#endif return ( nchan_remapped ); } diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index f405f50c04..2ee76d24c5 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -149,13 +149,8 @@ ivas_error ivas_sce_dec( st->codec_mode = MODE1; /* set "bits_frame_nominal" */ -#ifndef SBA_MODE_CLEAN_UP - if ( ( st_ivas->hQMetaData != NULL ) && - ( st_ivas->sba_mode != SBA_MODE_SPAR ) ) -#else if ( ( st_ivas->hQMetaData != NULL ) && ( st_ivas->ivas_format != SBA_FORMAT ) ) -#endif { if ( st_ivas->mc_mode == MC_MODE_MCMASA && ivas_total_brate >= MCMASA_SEPARATE_BRATE ) { @@ -166,11 +161,7 @@ ivas_error ivas_sce_dec( st->bits_frame_nominal = st_ivas->hQMetaData->bits_frame_nominal; } } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { st->bits_frame_nominal = (int16_t) ( st_ivas->hSpar->core_nominal_brate / FRAMES_PER_SEC ); } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index cd9888dc21..df0bb993da 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -130,13 +130,8 @@ ivas_error ivas_spar_dec_open( /* set FB config. */ active_w_mixing = -1; -#ifndef SBA_MODE_CLEAN_UP - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs, - 0 ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, num_channels_internal, num_channels_internal, active_w_mixing, output_Fs, 0 ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -327,7 +322,6 @@ ivas_error ivas_spar_dec( bit_stream_orig = st0->bit_stream; next_bit_pos_orig = st0->next_bit_pos; -#ifdef SBA_MODE_CLEAN_UP /* read DirAC bitstream */ if ( st_ivas->hQMetaData != NULL ) { @@ -335,7 +329,6 @@ ivas_error ivas_spar_dec( ivas_get_hodirac_flag( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->hSpar->dirac_to_spar_md_bands ); } -#endif last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 3a48913566..bb96d8bcba 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -718,9 +718,6 @@ typedef struct ivas_dirac_dec_data_structure float power_ratios[MAX_PARAM_ISM_NBANDS][MAX_PARAM_ISM_NBLOCKS][MAX_PARAM_ISM_WAVE]; PARAM_ISM_RENDERING_HANDLE hParamIsmRendering; IVAS_FB_MIXER_HANDLE hFbMdft; -#ifndef SBA_MODE_CLEAN_UP - int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; -#endif const int16_t *sba_map_tc; } DIRAC_DEC_DATA, *DIRAC_DEC_HANDLE; @@ -1280,9 +1277,6 @@ typedef struct Decoder_Struct ISM_MODE ism_mode; /* ISM format mode */ int16_t nchan_ism; /* number of ISM channels */ -#ifndef SBA_MODE_CLEAN_UP - SBA_MODE sba_mode; /* SBA format mode */ -#endif MC_MODE mc_mode; /* MC format mode */ int16_t sba_order; /* Ambisonic (SBA) order */ int16_t sba_planar; /* Ambisonic (SBA) planar flag */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0634cdfd05..09cf754979 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -205,9 +205,6 @@ ivas_error IVAS_DEC_Open( st_ivas->writeFECoffset = 0; st_ivas->ism_mode = ISM_MODE_NONE; -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode = SBA_MODE_NONE; -#endif st_ivas->mc_mode = MC_MODE_NONE; st_ivas->sba_order = 0; diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 0f3fffb369..6bea810953 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -465,11 +465,7 @@ ivas_error ivas_cpe_enc( { if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) { -#ifndef SBA_MODE_CLEAN_UP - reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode ); -#else reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); -#endif } } @@ -479,17 +475,9 @@ ivas_error ivas_cpe_enc( stereoFdCngCoherence( sts, hCPE->last_element_mode, fft_buff ); /* Reset metadata */ -#ifndef SBA_MODE_CLEAN_UP - if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) ) -#else if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT ) ) -#endif { -#ifndef SBA_MODE_CLEAN_UP - reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode ); -#else reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata ); -#endif } } diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 97b238f330..f364137bdf 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -62,13 +62,7 @@ ivas_error ivas_dirac_enc_open( ) { int16_t i, j; -#ifndef SBA_MODE_CLEAN_UP - int32_t input_Fs; -#endif DIRAC_ENC_HANDLE hDirAC; -#ifndef SBA_MODE_CLEAN_UP - IVAS_FB_CFG *fb_cfg; -#endif int32_t dirac_slot_ns; ivas_error error; @@ -95,9 +89,6 @@ ivas_error ivas_dirac_enc_open( *-----------------------------------------------------------------*/ st_ivas->hDirAC = hDirAC; -#ifndef SBA_MODE_CLEAN_UP - input_Fs = st_ivas->hEncoderConfig->input_Fs; -#endif if ( ( error = ivas_dirac_config( (void *) st_ivas, ENC ) ) != IVAS_ERR_OK ) { @@ -105,29 +96,7 @@ ivas_error ivas_dirac_enc_open( } /* set FB config. */ -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) - { -#endif hDirAC->hFbMixer = NULL; -#ifndef SBA_MODE_CLEAN_UP - } - else - { - if ( ( error = ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_DIRAC, - FOA_CHANNELS, - 0, 0, input_Fs, - FOA_CHANNELS ) ) != IVAS_ERR_OK ) - { - return error; - } - /* Allocate and initialize FB mixer handle */ - if ( ( error = ivas_FB_mixer_open( &( hDirAC->hFbMixer ), input_Fs, fb_cfg, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - } -#endif for ( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ ) { @@ -137,30 +106,6 @@ ivas_error ivas_dirac_enc_open( dirac_slot_ns = DIRAC_SLOT_ENC_NS; /* initialize delay for SPAR/DirAC delay synchronization */ -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_DIRAC ) - { - hDirAC->num_samples_synchro_delay = NS2SA( input_Fs, IVAS_FB_ENC_DELAY_NS ); - - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) - { - if ( ( hDirAC->sba_synchro_buffer[i] = (float *) malloc( hDirAC->num_samples_synchro_delay * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for DirAC\n" ) ); - } - set_zero( hDirAC->sba_synchro_buffer[i], hDirAC->num_samples_synchro_delay ); - } - } - else - { - hDirAC->num_samples_synchro_delay = 0; - - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) - { - hDirAC->sba_synchro_buffer[i] = NULL; - } - } -#endif /* intensity 3-dim */ for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) @@ -216,15 +161,7 @@ ivas_error ivas_dirac_enc_open( hDirAC->index_buffer_intensity = 0; st_ivas->hDirAC = hDirAC; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) - { - mvs2s( st_ivas->hDirAC->dirac_to_spar_md_bands, st_ivas->hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); -#endif st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; -#ifndef SBA_MODE_CLEAN_UP - } -#endif return error; } @@ -297,16 +234,6 @@ void ivas_dirac_enc_close( { ivas_FB_mixer_close( &hDirAC->hFbMixer, input_Fs, 0 ); } -#ifndef SBA_MODE_CLEAN_UP - for ( i = 0; i < DIRAC_MAX_ANA_CHANS; i++ ) - { - if ( hDirAC->sba_synchro_buffer[i] != NULL ) - { - free( hDirAC->sba_synchro_buffer[i] ); - hDirAC->sba_synchro_buffer[i] = NULL; - } - } -#endif /* intensity 3-dim */ for ( i = 0; i < DIRAC_NUM_DIMS; i++ ) { @@ -347,220 +274,6 @@ void ivas_dirac_enc_close( return; } -#ifndef SBA_MODE_CLEAN_UP -/*------------------------------------------------------------------------- - * ivas_dirac_enc() - * - * DirAC Encoder - * - * input-data in data_f[] is assumed to be in ACN ordering, i.e. - * data_f[0] --> W - * data_f[1] --> Y - * data_f[2] --> Z - * data_f[3] --> X - *------------------------------------------------------------------------*/ - -void ivas_dirac_enc( - DIRAC_ENC_HANDLE hDirAC, /* i/o: encoder DirAC handle */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - BSTR_ENC_HANDLE hMetaData, /* i/o: Metadata bitstream handle */ - int16_t *nb_bits_metadata, /* o : number of metadata bits written */ - const int16_t Opt_DTX_ON, /* i : flag signaling DTX on */ - float data_f[][L_FRAME48k], /* i/o: SBA channels */ - const int16_t input_frame, /* i : input frame length */ - const int16_t sba_planar /* i : SBA planar flag */ -) -{ - int16_t i; - - push_wmops( "ivas_dirac_enc" ); - - /*Check if highest band of input signal <= enc_param_start_band: could happen for WB input signal in 4TCs mode*/ - if ( hDirAC->band_grouping[hDirAC->hConfig->nbands] <= hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band] ) - { - /* Signal 4 bands (WB 4TC mode) on 1 bit */ - push_next_indice( hMetaData, 1, 1 ); - *nb_bits_metadata = hMetaData->nb_bits_tot; - } - else - { - /* WB 4TC mode bit */ - push_next_indice( hMetaData, 0, 1 ); - - /* parameter estimation */ - if ( sba_planar ) - { - /* Z is forced to zero in planar case */ - set_zero( data_f[2], input_frame ); - } - - ivas_dirac_param_est_enc( hDirAC, &( hQMetaData->q_direction[0] ), hQMetaData->useLowerRes, data_f, NULL, NULL, input_frame, SBA_MODE_DIRAC, - 0, - FOA_CHANNELS ); - - /* encode parameters */ - if ( sba_planar || hQMetaData->useLowerRes ) - { - for ( i = hQMetaData->q_direction[0].cfg.start_band; i < hQMetaData->q_direction[0].cfg.nbands; i++ ) - { - /* Make sure elevation is really zero */ - set_zero( hQMetaData->q_direction[0].band_data[i].elevation, hQMetaData->q_direction[0].cfg.nblocks ); - } - } - - ivas_qmetadata_enc_encode( hMetaData, hQMetaData, - 0 ); - - *nb_bits_metadata = hMetaData->nb_bits_tot; - - if ( Opt_DTX_ON ) - { - if ( !( hQMetaData->no_directions == 1 && hQMetaData->numCodingBands == 5 ) ) - { - float orig_azi[DIRAC_MAX_NBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - float orig_ele[DIRAC_MAX_NBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - float orig_energy_ratio[DIRAC_MAX_NBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; - - float dir[3]; - float avg_dir[3]; - - float vecLen; - float energySum; - - int16_t j; - int16_t nbands; - - for ( i = 0; i < DIRAC_MAX_NBANDS; i++ ) - { - mvr2r( &hQMetaData->q_direction[0].band_data[i].azimuth[0], orig_azi[i], MAX_PARAM_SPATIAL_SUBFRAMES ); - mvr2r( &hQMetaData->q_direction[0].band_data[i].elevation[0], orig_ele[i], MAX_PARAM_SPATIAL_SUBFRAMES ); - mvr2r( &hQMetaData->q_direction[0].band_data[i].energy_ratio[0], orig_energy_ratio[i], MAX_PARAM_SPATIAL_SUBFRAMES ); - } - - /* Force to 5 bands */ - nbands = hQMetaData->q_direction[0].cfg.nbands; - hDirAC->hConfig->nbands = 5; - hQMetaData->q_direction[0].cfg.nbands = 5; - - /* compute directions */ - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - set_zero( dir, 3 ); - set_zero( avg_dir, 3 ); - energySum = 0.0f; - - /* average values over last two bands into 5th band */ - for ( j = DIRAC_MAX_NBANDS - 2; j < DIRAC_MAX_NBANDS; j++ ) - { - ivas_qmetadata_azimuth_elevation_to_direction_vector( hQMetaData->q_direction[0].band_data[j].azimuth[i], hQMetaData->q_direction[0].band_data[j].elevation[i], &dir[0] ); - vecLen = hQMetaData->q_direction[0].band_data[j].energy_ratio[i] * hDirAC->buffer_energy[i * DIRAC_MAX_NBANDS + j]; - - avg_dir[0] += dir[0] * vecLen; - avg_dir[1] += dir[1] * vecLen; - avg_dir[2] += dir[2] * vecLen; - - energySum += hDirAC->buffer_energy[i * DIRAC_MAX_NBANDS + j]; - } - - ivas_qmetadata_direction_vector_to_azimuth_elevation( &avg_dir[0], &hQMetaData->q_direction[0].band_data[DIRAC_MAX_NBANDS - 2].azimuth[i], &hQMetaData->q_direction[0].band_data[DIRAC_MAX_NBANDS - 2].elevation[i] ); - - hQMetaData->q_direction[0].band_data[DIRAC_MAX_NBANDS - 2].energy_ratio[i] = sqrtf( dotp( avg_dir, avg_dir, 3 ) ) / ( energySum + EPSILON ); - } - - /* encode SID parameters */ -#ifndef SBA_MODE_CLEAN_UP - ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, SBA_MODE_DIRAC ); -#else - ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); - -#endif - /* restore original metadata */ - hDirAC->hConfig->nbands = nbands; - hQMetaData->q_direction[0].cfg.nbands = nbands; - - for ( i = 0; i < DIRAC_MAX_NBANDS; i++ ) - { - mvr2r( orig_azi[i], &hQMetaData->q_direction[0].band_data[i].azimuth[0], MAX_PARAM_SPATIAL_SUBFRAMES ); - mvr2r( orig_ele[i], &hQMetaData->q_direction[0].band_data[i].elevation[0], MAX_PARAM_SPATIAL_SUBFRAMES ); - mvr2r( orig_energy_ratio[i], &hQMetaData->q_direction[0].band_data[i].energy_ratio[0], MAX_PARAM_SPATIAL_SUBFRAMES ); - } - } - else - { - /*indicate whether SPAR or DiRAC mode*/ - push_next_indice( hMetaData, 0, 1 ); - - /* encode SID parameters */ -#ifndef SBA_MODE_CLEAN_UP - ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, SBA_MODE_DIRAC ); -#else - ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT ); -#endif - } - } - } - - pop_wmops(); - - return; -} - - -/*------------------------------------------------------------------------- - * ivas_dirac_enc_spar_delay_synchro() - * - * Delay input channels to be synchronized between DirAC and SPAR - *-------------------------------------------------------------------------*/ - -void ivas_dirac_enc_spar_delay_synchro( - Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ - const int16_t input_frame, /* i : input frame length */ - float data_f[][L_FRAME48k] /* i/o: SBA channels (ACN / SN3D) */ -) -{ - int16_t ch_idx; - float tmp_buffer[L_FRAME48k]; - Encoder_State *sts[MCT_MAX_BLOCKS]; - int16_t sce_id, cpe_id, i_chan; - - /* check last sba_mode */ - if ( ivas_sba_mode_select() == SBA_MODE_SPAR ) - { - /* initializations */ - i_chan = 0; - for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - sts[sce_id] = st_ivas->hSCE[sce_id]->hCoreCoder[0]; - i_chan++; - } - - for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - for ( int16_t ch = 0; ch < CPE_CHANNELS; ch++ ) - { - sts[i_chan] = st_ivas->hCPE[cpe_id]->hCoreCoder[ch]; - i_chan++; - } - } - - /* populate old synchro buffers */ - for ( ch_idx = 0; ch_idx < i_chan; ch_idx++ ) - { - mvr2r( sts[ch_idx]->input, st_ivas->hDirAC->sba_synchro_buffer[ch_idx], st_ivas->hDirAC->num_samples_synchro_delay ); - } - } - - for ( ch_idx = 0; ch_idx < DIRAC_MAX_ANA_CHANS; ch_idx++ ) - { - mvr2r( data_f[ch_idx], tmp_buffer, input_frame ); - mvr2r( st_ivas->hDirAC->sba_synchro_buffer[ch_idx], data_f[ch_idx], st_ivas->hDirAC->num_samples_synchro_delay ); - mvr2r( tmp_buffer, &data_f[ch_idx][st_ivas->hDirAC->num_samples_synchro_delay], input_frame - st_ivas->hDirAC->num_samples_synchro_delay ); - mvr2r( &tmp_buffer[input_frame - st_ivas->hDirAC->num_samples_synchro_delay], st_ivas->hDirAC->sba_synchro_buffer[ch_idx], st_ivas->hDirAC->num_samples_synchro_delay ); - } - - return; -} -#else /*------------------------------------------------------------------------- * ivas_dirac_enc() * @@ -674,7 +387,6 @@ void ivas_dirac_enc( return; } -#endif /*------------------------------------------------------------------------- * computeReferencePower_enc() @@ -689,12 +401,8 @@ void computeReferencePower_enc( float *reference_power, /* o : Estimated power */ const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode /* i : SBA mode */ -#else const IVAS_FORMAT ivas_format, /* i : ivas_format */ int16_t ref_power_w /* i : use 0 if hodirac is enabled */ -#endif , const int16_t nchan_ana /* i : number of analysis channels */ ) @@ -728,11 +436,7 @@ void computeReferencePower_enc( } v_multc( reference_power, 0.5f, reference_power, num_freq_bands ); -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) -#else if ( ivas_format == SBA_FORMAT && ref_power_w == 1 ) -#endif { for ( i = 0; i < num_freq_bands; i++ ) { @@ -758,11 +462,7 @@ void ivas_dirac_param_est_enc( float **pp_fr_real, float **pp_fr_imag, const int16_t input_frame, -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, -#else const IVAS_FORMAT ivas_format, -#endif const int16_t hodirac_flag, const int16_t nchan_fb_in ) { @@ -871,12 +571,8 @@ void ivas_dirac_param_est_enc( reference_power[ts], hDirAC->hConfig->enc_param_start_band, num_freq_bands, -#ifndef SBA_MODE_CLEAN_UP - hodirac_flag ? SBA_MODE_DIRAC : sba_mode, -#else ivas_format, hodirac_flag ? 0 : 1, -#endif FOA_CHANNELS ); computeIntensityVector_enc( diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 89a97ea0b0..9939384c76 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -132,11 +132,7 @@ ivas_error ivas_enc( /* bypass EVS coding in float precision, emulating EVS encoder/decoder delay */ for ( i = 0; i < n; i++ ) { -#ifndef SBA_MODE_CLEAN_UP - if ( ( ivas_format == SBA_FORMAT ) && ( st_ivas->sba_mode == SBA_MODE_SPAR ) && !( st_ivas->sba_analysis_order > 1 ) ) -#else if ( ( ivas_format == SBA_FORMAT ) && !( st_ivas->sba_analysis_order > 1 ) ) -#endif { hp20( data_f[HOA_keep_ind[st_ivas->hSpar->hMdEnc->HOA_md_ind[i]]], input_frame, st_ivas->mem_hp20_in[i], input_Fs ); } @@ -221,22 +217,8 @@ ivas_error ivas_enc( /* SBA/MASA metadata encoding and SBA/MASA metadata bitstream writing */ hMetaData = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[st_ivas->nSCE - 1]->hMetaData : st_ivas->hCPE[st_ivas->nCPE - 1]->hMetaData; -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->hQMetaData != NULL && st_ivas->sba_mode != SBA_MODE_SPAR ) -#else if ( st_ivas->hQMetaData != NULL && ivas_format != SBA_FORMAT ) -#endif { -#ifndef SBA_MODE_CLEAN_UP - if ( ivas_format == SBA_FORMAT ) - { - ivas_dirac_enc( st_ivas->hDirAC, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], hEncoderConfig->Opt_DTX_ON, data_f, input_frame, hEncoderConfig->sba_planar ); - - ivas_dirac_enc_spar_delay_synchro( st_ivas, input_frame, data_f ); - } - else - { -#endif ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { @@ -247,15 +229,8 @@ ivas_error ivas_enc( { return error; } -#ifndef SBA_MODE_CLEAN_UP - } -#endif } -#ifndef SBA_MODE_CLEAN_UP - else if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else else if ( ivas_format == SBA_FORMAT ) -#endif { if ( ( error = ivas_spar_enc( st_ivas, data_f, input_frame, nb_bits_metadata, hMetaData ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index 5591b12f40..e1f6d72493 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -355,14 +355,8 @@ ivas_error ivas_init_encoder( /* In IVAS, ensure that minimum coded bandwidth is WB */ hEncoderConfig->max_bwidth = max( hEncoderConfig->max_bwidth, WB ); } -#ifndef SBA_MODE_CLEAN_UP - hEncoderConfig->spar_reconfig_flag = 0; -#endif st_ivas->ism_mode = ISM_MODE_NONE; st_ivas->mc_mode = MC_MODE_NONE; -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode = SBA_MODE_NONE; -#endif st_ivas->nchan_transport = -1; @@ -517,23 +511,13 @@ ivas_error ivas_init_encoder( if ( ivas_format == SBA_FORMAT ) { -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode = ivas_sba_mode_select(); -#endif st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) - { -#endif if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) { return error; } -#ifndef SBA_MODE_CLEAN_UP - } -#endif if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -564,11 +548,7 @@ ivas_error ivas_init_encoder( reset_indices_enc( st_ivas->hSCE[sce_id]->hMetaData, MAX_BITS_METADATA ); #endif -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR && st_ivas->hEncoderConfig->Opt_DTX_ON ) -#else if ( ivas_format == SBA_FORMAT && st_ivas->hEncoderConfig->Opt_DTX_ON ) -#endif { st_ivas->hSCE[sce_id]->hCoreCoder[0]->dtx_sce_sba = 1; } diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c index 24038448d9..572a0f1802 100644 --- a/lib_enc/ivas_ism_param_enc.c +++ b/lib_enc/ivas_ism_param_enc.c @@ -299,13 +299,8 @@ ivas_error ivas_param_ism_enc_open( /* set FB config. */ -#ifndef SBA_MODE_CLEAN_UP - if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, SBA_MODE_NONE, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs, - 0 ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_fb_set_cfg( &fb_cfg, ISM_FORMAT, st_ivas->hEncoderConfig->nchan_inp, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 3044eb8bf6..0307d3f61d 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -392,11 +392,7 @@ ivas_error ivas_masa_encode( free( h_orig_metadata ); -#ifndef SBA_MODE_CLEAN_UP - ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format, SBA_MODE_NONE ); -#else ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format ); -#endif /* restore old values */ hMasa->config.numCodingBands = numCodingBands; diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index ba746ff442..2af0ee3c04 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -140,13 +140,8 @@ ivas_error ivas_param_mc_enc_open( hParamMC->dmx_factors = ivas_param_mc_conf[config_index].dmx_fac; /* set FB config. */ -#ifndef SBA_MODE_CLEAN_UP - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_DIRAC, nchan_inp, 0, 0, input_Fs, - 0 ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, nchan_inp, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_mc_paramupmix_enc.c b/lib_enc/ivas_mc_paramupmix_enc.c index b328223d77..500065c347 100644 --- a/lib_enc/ivas_mc_paramupmix_enc.c +++ b/lib_enc/ivas_mc_paramupmix_enc.c @@ -184,13 +184,8 @@ ivas_error ivas_mc_paramupmix_enc_open( /* set FB config. */ /* need to set num output channels to a value > 0 to get pFb != NULL */ -#ifndef SBA_MODE_CLEAN_UP - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, SBA_MODE_SPAR, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, - 0 ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_fb_set_cfg( &fb_cfg, MC_FORMAT, MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH, MC_PARAMUPMIX_COMBINATIONS, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_mcmasa_enc.c b/lib_enc/ivas_mcmasa_enc.c index 09fe5e3f40..398b975705 100644 --- a/lib_enc/ivas_mcmasa_enc.c +++ b/lib_enc/ivas_mcmasa_enc.c @@ -188,13 +188,8 @@ ivas_error ivas_mcmasa_enc_open( } /* set FB config. */ -#ifndef SBA_MODE_CLEAN_UP - if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, SBA_MODE_NONE, numAnalysisChannels, 0, 0, input_Fs, - 0 ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_fb_set_cfg( &fb_cfg, MASA_FORMAT, numAnalysisChannels, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -225,13 +220,8 @@ ivas_error ivas_mcmasa_enc_open( else { /* Allocate and initialize FB mixer handle for LFE channel */ -#ifndef SBA_MODE_CLEAN_UP - if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, SBA_MODE_NONE, 1, 0, 0, input_Fs, - 0 ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_fb_set_cfg( &fb_cfgLfe, MASA_FORMAT, 1, 0, 0, input_Fs, 0 ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -987,12 +977,8 @@ void ivas_mcmasa_param_est_enc( reference_power[ts], 0, num_freq_bands, -#ifndef SBA_MODE_CLEAN_UP - SBA_MODE_NONE, -#else MC_FORMAT, 0, -#endif FOA_CHANNELS ); /* Fill buffers of length "averaging_length" time slots for intensity and energy */ diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index 378bcb6910..9bd4b4132c 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -60,11 +60,7 @@ static ivas_error ivas_mc_enc_reconfig( Encoder_Struct *st_ivas, const int16_t l static void set_mct_enc_params( MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ -#ifndef SBA_MODE_CLEAN_UP - const SBA_MODE sba_mode, /* i : SBA mode */ -#else const IVAS_FORMAT ivas_format, /* i : IVAS_FORMAT */ -#endif const uint16_t b_nchan_change /* i : flag indicating different channel count */ ) { @@ -86,11 +82,7 @@ static void set_mct_enc_params( } hMCT->hbr_mct = 0; -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR && ivas_total_brate >= IVAS_256k ) -#else if ( ivas_format == SBA_FORMAT && ivas_total_brate >= IVAS_256k ) -#endif { hMCT->hbr_mct = 1; } @@ -399,11 +391,7 @@ ivas_error create_mct_enc( * Initializations *-----------------------------------------------------------------*/ -#ifndef SBA_MODE_CLEAN_UP - set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, 1 ); -#else set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, 1 ); -#endif st_ivas->hMCT = hMCT; @@ -569,11 +557,7 @@ ivas_error mct_enc_reconfigure( * Initializations *-----------------------------------------------------------------*/ -#ifndef SBA_MODE_CLEAN_UP - set_mct_enc_params( hMCT, ivas_total_brate, st_ivas->sba_mode, b_nchan_change ); -#else set_mct_enc_params( hMCT, ivas_total_brate, ivas_format, b_nchan_change ); -#endif return IVAS_ERR_OK; } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 4e017dd052..acace009be 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -1006,10 +1006,6 @@ void ivas_qmetadata_enc_sid_encode( IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const int16_t masa_sid_descriptor, /* i : description of MASA SID coding structure */ const int16_t ivas_format /* i : IVAS format */ -#ifndef SBA_MODE_CLEAN_UP - , - const SBA_MODE sba_mode /* i : SBA mode */ -#endif ) { int16_t b, m; @@ -1025,21 +1021,8 @@ void ivas_qmetadata_enc_sid_encode( if ( ivas_format == SBA_FORMAT ) { -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) - { -#endif /* TODO: still use old sid frame size to keep bitexactness */ metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ -#ifndef SBA_MODE_CLEAN_UP - } - else - { - /* keep 13.2 and 16.4 SID bitrate as 4.4 kbps for now*/ - /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; - } -#endif } else { @@ -1078,11 +1061,7 @@ void ivas_qmetadata_enc_sid_encode( /* sanity checks*/ assert( q_metadata->no_directions == 1 && "Qmetadata SID: only one direction supported!" ); -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) -#else if ( ivas_format == SBA_FORMAT ) -#endif { assert( ( q_direction->cfg.nbands == DIRAC_DTX_BANDS ) && "Qmetadata SID: only 2 bands supported!" ); } @@ -1091,11 +1070,7 @@ void ivas_qmetadata_enc_sid_encode( assert( ( q_direction->cfg.nbands == 5 ) && "Qmetadata SID: only 5 bands supported!" ); } -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode != SBA_MODE_SPAR ) -#else if ( ivas_format != SBA_FORMAT ) -#endif { /* Signalling 2D*/ push_next_indice( hMetaData, ( q_direction->not_in_2D > 0 ), 1 ); /*2D flag*/ @@ -1232,19 +1207,7 @@ void ivas_qmetadata_enc_sid_encode( #endif /* TODO: temporary to keep BE */ -#ifndef SBA_MODE_CLEAN_UP - if ( ivas_format == SBA_FORMAT ) - { - if ( sba_mode != SBA_MODE_SPAR ) - { - /* keep 13.2 and 16.4 SID bitrate as 4.4 kbps for now*/ - metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - 1; /* -1 for spar/dirac indicator*/ - } - } - else -#else if ( ivas_format != SBA_FORMAT ) -#endif { metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; } @@ -1272,10 +1235,6 @@ void reset_metadata_spatial( int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ const int16_t nb_bits_metadata /* i : number of meatdata bits */ -#ifndef SBA_MODE_CLEAN_UP - , - const SBA_MODE sba_mode /* i : SBA mode */ -#endif ) { int16_t i, next_ind_sid, last_ind_sid; @@ -1289,11 +1248,7 @@ void reset_metadata_spatial( { if ( ( ivas_format == SBA_FORMAT || ivas_format == MASA_FORMAT ) && core_brate != FRAME_NO_DATA ) { -#ifndef SBA_MODE_CLEAN_UP - if ( sba_mode == SBA_MODE_SPAR ) -#else if ( ivas_format == SBA_FORMAT ) -#endif { #ifdef DEBUGGING assert( hMetaData->ind_list[0].nb_bits == 1 ); @@ -1376,11 +1331,7 @@ void reset_metadata_spatial( *total_brate = element_brate; } -#ifndef SBA_MODE_CLEAN_UP - else if ( sba_mode != SBA_MODE_SPAR ) -#else else if ( ivas_format != SBA_FORMAT ) -#endif { /* Reset SID metadata bits*/ while ( hMetaData->nb_bits_tot > nb_bits_metadata ) diff --git a/lib_enc/ivas_sba_enc.c b/lib_enc/ivas_sba_enc.c index a1a505f67a..1d6256b021 100644 --- a/lib_enc/ivas_sba_enc.c +++ b/lib_enc/ivas_sba_enc.c @@ -200,17 +200,6 @@ ivas_error ivas_sba_enc_reconfigure( } ivas_spar_config( ivas_total_brate, min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ), &st_ivas->nchan_transport, &st_ivas->nSCE, &st_ivas->nCPE, &st_ivas->hSpar->core_nominal_brate, -1 ); -#ifndef SBA_MODE_CLEAN_UP - for ( n = 0; n < DIRAC_MAX_ANA_CHANS; n++ ) - { - if ( hDirAC->sba_synchro_buffer[n] != NULL ) - { - free( hDirAC->sba_synchro_buffer[n] ); - hDirAC->sba_synchro_buffer[n] = NULL; - } - } - hDirAC->num_samples_synchro_delay = 0; -#endif hSpar = st_ivas->hSpar; if ( st_ivas->nchan_transport == 1 ) @@ -237,11 +226,7 @@ ivas_error ivas_sba_enc_reconfigure( return error; } } -#ifndef SBA_MODE_CLEAN_UP - hEncoderConfig->spar_reconfig_flag = spar_reconfig_flag; -#else st_ivas->hSpar->spar_reconfig_flag = spar_reconfig_flag; -#endif if ( ( error = ivas_dirac_enc_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) { return error; @@ -262,9 +247,6 @@ ivas_error ivas_sba_enc_reconfigure( } } } -#ifndef SBA_MODE_CLEAN_UP - mvs2s( hDirAC->dirac_to_spar_md_bands, hSpar->dirac_to_spar_md_bands, DIRAC_MAX_NBANDS ); -#endif hSpar->enc_param_start_band = hDirAC->hConfig->enc_param_start_band; /*-----------------------------------------------------------------* * Allocate, initialize, and configure SCE/CPE/MCT handles @@ -293,11 +275,7 @@ int16_t ivas_sba_get_max_md_bits( max_bits = 500; } max_md_bits = min( st_ivas->hQMetaData->metadata_max_bits + 1, max_bits ); // TODO: remove 500 once max MD bits has been defined at all bitrates in DirAC -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->sba_mode == SBA_MODE_SPAR ) -#else if ( st_ivas->hEncoderConfig->ivas_format == SBA_FORMAT ) -#endif { max_md_bits += st_ivas->hSpar->hMdEnc->spar_md_cfg.max_md_bits_spar; } diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 87c0e8e9d3..3dde94fd33 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -205,12 +205,8 @@ ivas_error ivas_sce_enc( * Reset metadata *----------------------------------------------------------------*/ -#ifndef SBA_MODE_CLEAN_UP - reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata, st_ivas->sba_mode ); -#else reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata ); -#endif /*----------------------------------------------------------------* * Write IVAS format signaling in SID frames *----------------------------------------------------------------*/ diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index d9dd0880c5..4fbb34497d 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -84,9 +84,7 @@ ivas_error ivas_spar_enc_open( } } -#ifdef SBA_MODE_CLEAN_UP hSpar->spar_reconfig_flag = 0; -#endif input_Fs = hEncoderConfig->input_Fs; sba_order_internal = min( st_ivas->sba_analysis_order, IVAS_MAX_SBA_ORDER ); nchan_inp = ivas_sba_get_nchan_metadata( sba_order_internal, @@ -126,13 +124,8 @@ ivas_error ivas_spar_enc_open( /* set FB config. */ active_w_mixing = ivas_spar_br_table_consts[table_idx].active_w; -#ifndef SBA_MODE_CLEAN_UP - ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, SBA_MODE_SPAR, nchan_inp, nchan_transport, active_w_mixing, input_Fs, - nchan_fb_in ); -#else ivas_fb_set_cfg( &fb_cfg, SBA_FORMAT, nchan_inp, nchan_transport, active_w_mixing, input_Fs, nchan_fb_in ); -#endif fb_cfg->remix_order = remix_order_set[hSpar->hMdEnc->spar_md_cfg.remix_unmix_order]; /* FB mixer handle */ @@ -350,34 +343,6 @@ ivas_error ivas_spar_enc( hEncoderConfig = st_ivas->hEncoderConfig; /* check last sba_mode */ -#ifndef SBA_MODE_CLEAN_UP - if ( ivas_sba_mode_select() == SBA_MODE_DIRAC ) - { - Encoder_State *sts[MCT_MAX_BLOCKS]; - - /* initializations */ - for ( int16_t sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) - { - sts[sce_id] = st_ivas->hSCE[sce_id]->hCoreCoder[0]; - } - - for ( int16_t cpe_id = 0, i = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) - { - for ( int16_t ch = 0; ch < CPE_CHANNELS; ch++ ) - { - sts[i] = st_ivas->hCPE[cpe_id]->hCoreCoder[ch]; - i++; - } - } - - /* update FB prior input */ - for ( int16_t i = 0; i < st_ivas->nchan_transport; i++ ) - { - mvr2r( ( sts[i]->input_buff + NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ) ), - ( st_ivas->hSpar->hFbMixer->ppFilterbank_prior_input[i] + st_ivas->hSpar->hFbMixer->fb_cfg->prior_input_length - input_frame ), input_frame ); - } - } -#endif /* front VAD */ if ( ( error = front_vad_spar( st_ivas->hSpar, data_f[0], hEncoderConfig, input_frame ) ) != IVAS_ERR_OK ) @@ -436,18 +401,10 @@ static ivas_error ivas_spar_enc_process( const int16_t *order; SPAR_ENC_HANDLE hSpar = st_ivas->hSpar; IVAS_QMETADATA_HANDLE hQMetaData = st_ivas->hQMetaData; -#ifndef SBA_MODE_CLEAN_UP - int16_t ts, l_ts, orig_dirac_bands, num_del_samples; -#else int16_t ts, l_ts, num_del_samples; -#endif float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH]; float wyzx_del_buf[FOA_CHANNELS][IVAS_FB_1MS_48K_SAMP]; -#ifndef SBA_MODE_CLEAN_UP - float dir[3], avg_dir[3]; - float energySum, vecLen; -#endif int16_t nchan_fb_in; /*Commented for now*/ @@ -561,94 +518,7 @@ static ivas_error ivas_spar_enc_process( hodirac_flag = ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ); -#ifndef SBA_MODE_CLEAN_UP - ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode, hodirac_flag, hodirac_flag ? HOA2_CHANNELS : FOA_CHANNELS ); - - if ( hQMetaData->q_direction->cfg.nbands > 0 ) - { - orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; - - if ( dtx_vad == 1 ) - { - /* WB 4TC mode bit : disable for now*/ - push_next_indice( hMetaData, 0, 1 ); - - ivas_qmetadata_enc_encode( hMetaData, hQMetaData, hodirac_flag ); - } - else - { - hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS; - - /* compute directions */ - for ( i = 0; i < hQMetaData->q_direction[0].cfg.nblocks; i++ ) - { - set_zero( dir, 3 ); - set_zero( avg_dir, 3 ); - energySum = 0.0f; - - /* combine all DirAC bands except the last one, handle last band separately, last band covers BW above WB */ - for ( j = 0; j < orig_dirac_bands - 1; j++ ) - { - ivas_qmetadata_azimuth_elevation_to_direction_vector( hQMetaData->q_direction[0].band_data[j].azimuth[i], hQMetaData->q_direction[0].band_data[j].elevation[i], &dir[0] ); - vecLen = hQMetaData->q_direction[0].band_data[j].energy_ratio[i] * st_ivas->hDirAC->buffer_energy[i * orig_dirac_bands + j]; - - avg_dir[0] += dir[0] * vecLen; - avg_dir[1] += dir[1] * vecLen; - avg_dir[2] += dir[2] * vecLen; - - energySum += st_ivas->hDirAC->buffer_energy[i * orig_dirac_bands + j]; - } - - ivas_qmetadata_direction_vector_to_azimuth_elevation( &avg_dir[0], &hQMetaData->q_direction[0].band_data[0].azimuth[i], &hQMetaData->q_direction[0].band_data[0].elevation[i] ); - hQMetaData->q_direction[0].band_data[0].energy_ratio[i] = sqrtf( dotp( avg_dir, avg_dir, 3 ) ) / ( energySum + EPSILON ); - - hQMetaData->q_direction[0].band_data[1].azimuth[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i]; - hQMetaData->q_direction[0].band_data[1].elevation[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i]; - hQMetaData->q_direction[0].band_data[1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i]; - } - - /* 1 bit to indicate mode MD coding : temp solution*/ - push_next_indice( hMetaData, 1, 1 ); - - /* encode SID parameters */ - ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, st_ivas->sba_mode ); - } - - for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ ) - { - for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ ) - { - hQMetaData->q_direction->band_data[b].azimuth[i_ts] = hQMetaData->q_direction->band_data[b].q_azimuth[i_ts]; - hQMetaData->q_direction->band_data[b].elevation[i_ts] = hQMetaData->q_direction->band_data[b].q_elevation[i_ts]; - hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]]; - } - } - - if ( dtx_vad == 0 ) - { - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; - } - - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - for ( j = orig_dirac_bands - 2; j >= 0; j-- ) - { - hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; - hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; - hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; - } - } - - hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; - } - } -#else ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag ); -#endif /*-----------------------------------------------------------------------------------------* * Set SPAR bitrates *-----------------------------------------------------------------------------------------*/ @@ -658,11 +528,7 @@ static ivas_error ivas_spar_enc_process( if ( hSpar->hMdEnc->table_idx != table_idx ) { hSpar->hMdEnc->table_idx = table_idx; -#ifndef SBA_MODE_CLEAN_UP - if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hEncoderConfig->spar_reconfig_flag ) ) -#else if ( ( ivas_total_brate != hEncoderConfig->last_ivas_total_brate ) && ( !hSpar->spar_reconfig_flag ) ) -#endif { if ( ( error = ivas_spar_md_enc_init( hSpar->hMdEnc, hEncoderConfig, sba_order ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index fe520a0817..4f2f375af7 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -589,10 +589,6 @@ typedef struct ivas_dirac_enc_data_structure PARAM_ISM_CONFIG_HANDLE hParamIsm; /* Parametric ISM handle */ IVAS_FB_MIXER_HANDLE hFbMixer; -#ifndef SBA_MODE_CLEAN_UP - float *sba_synchro_buffer[DIRAC_MAX_ANA_CHANS]; - int16_t num_samples_synchro_delay; -#endif /* DirAC parameter estimation */ float **direction_vector[DIRAC_NUM_DIMS]; @@ -610,9 +606,6 @@ typedef struct ivas_dirac_enc_data_structure float azi_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; float ele_prev[NUM_ANA_SECTORS * IVAS_MAX_NUM_BANDS]; -#ifndef SBA_MODE_CLEAN_UP - int16_t dirac_to_spar_md_bands[DIRAC_MAX_NBANDS]; -#endif /* diffuseness */ int16_t index_buffer_intensity; @@ -711,9 +704,7 @@ typedef struct ivas_spar_enc_lib_t FRONT_VAD_ENC_HANDLE hFrontVad; /* front-VAD handle */ ENC_CORE_HANDLE hCoreCoderVAD; /* core-coder handle for front-VAD module */ -#ifdef SBA_MODE_CLEAN_UP int16_t spar_reconfig_flag; -#endif int16_t front_vad_flag; int16_t front_vad_dtx_flag; int16_t force_front_vad; @@ -1119,9 +1110,6 @@ typedef struct encoder_config_structure /* temp. development parameters */ int16_t Opt_PCA_ON; /* flag indicating PCA operation in SBA */ -#ifndef SBA_MODE_CLEAN_UP - int16_t spar_reconfig_flag; - #endif #ifdef DEBUGGING /* debugging options */ int16_t stereo_mode_cmdl; /* stereo mode forced from the command-line */ @@ -1180,9 +1168,6 @@ typedef struct LFE_ENC_HANDLE hLFE; /* LFE data handle */ ISM_MODE ism_mode; /* ISM format mode */ -#ifndef SBA_MODE_CLEAN_UP - SBA_MODE sba_mode; /* SBA format mode */ -#endif MC_MODE mc_mode; /* MC format mode */ /* Stereo downmix for EVS module */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 1fe61ef2bf..544ea32ade 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -197,9 +197,6 @@ ivas_error IVAS_ENC_Open( /* set high-level parameters */ st_ivas->mc_mode = MC_MODE_NONE; st_ivas->ism_mode = ISM_MODE_NONE; -#ifndef SBA_MODE_CLEAN_UP - st_ivas->sba_mode = SBA_MODE_NONE; -#endif st_ivas->sba_analysis_order = 0; return IVAS_ERR_OK; @@ -927,11 +924,7 @@ static ivas_error configureEncoder( } #ifdef DEBUG_AGC_ENCODER_CMD_OPTION -#ifndef SBA_MODE_CLEAN_UP - if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_sba_mode_select() == SBA_MODE_SPAR ) ) -#else if ( hEncoderConfig->Opt_AGC_ON == SBA_AGC_FORCE_ENABLE && !( hEncoderConfig->ivas_format == SBA_FORMAT ) ) -#endif { return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "AGC supported in SBA format at bitrates >= 24.4 kbps only." ); } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index c520c5631e..03c38b9f49 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -440,11 +440,7 @@ void ivas_dirac_dec_binaural( } ivas_dirac_dec_set_md_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) -#else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { ivas_spar_dec_set_render_map( st_ivas, DEFAULT_JBM_CLDFB_TIMESLOTS ); } @@ -636,11 +632,7 @@ static void ivas_dirac_dec_binaural_internal( } } -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) -#else if ( st_ivas->ivas_format == SBA_FORMAT ) -#endif { st_ivas->hDirAC->hDiffuseDist = &diffuseDistData; @@ -1098,11 +1090,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } else /* When rendering binaural, ambience has frequency dependent ICC. */ { -#ifndef SBA_MODE_CLEAN_UP - if ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) -#else if ( st_ivas->ivas_format == SBA_FORMAT && bin < BINAURAL_COHERENCE_DIFFERENCE_BINS ) -#endif { float diffuseFieldCoherence; diffuseFieldCoherence = hDirAC->hDiffuseDist->diffuseRatioX[bin] * h->diffuseFieldCoherenceX[bin] + hDirAC->hDiffuseDist->diffuseRatioY[bin] * h->diffuseFieldCoherenceY[bin] + hDirAC->hDiffuseDist->diffuseRatioZ[bin] * h->diffuseFieldCoherenceZ[bin]; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 0bac2513c0..e879f923a3 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2212,9 +2212,6 @@ static ivas_error initMasaDummyDecForMcOut( decDummy->sba_analysis_order = 1; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ -#ifndef SBA_MODE_CLEAN_UP - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ -#endif decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); @@ -2297,9 +2294,6 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ -#ifndef SBA_MODE_CLEAN_UP - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ -#endif decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ decDummy->sba_analysis_order = 1; @@ -2373,9 +2367,6 @@ static ivas_error initMasaDummyDecForBinauralOut( decDummy->sba_analysis_order = 1; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ -#ifndef SBA_MODE_CLEAN_UP - decDummy->sba_mode = SBA_MODE_NONE; /* Todo Nokia: This is done to prevent ivas_dirac_dec_config() to not use uninitialized value. It could be considered if this should not be even accessed when not in SBA. */ -#endif decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); -- GitLab From 0fe671ec47b7df330bf8cd1a30e25be0dd547349 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:22:38 +0200 Subject: [PATCH 270/381] [cleanup] accept FIX_502_IND_LIST_SIZE --- lib_com/bitstream.c | 36 ------------------------------------ lib_com/options.h | 1 - 2 files changed, 37 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index b4a42e0b2e..84411b49bb 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -803,59 +803,31 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_32k ) { -#ifdef FIX_502_IND_LIST_SIZE return 125; -#else - return 110; -#endif } else if ( ivas_total_brate <= IVAS_48k ) { -#ifdef FIX_502_IND_LIST_SIZE return 205; -#else - return 180; -#endif } else if ( ivas_total_brate <= IVAS_96k ) { -#ifdef FIX_502_IND_LIST_SIZE return 240; -#else - return 200; -#endif } else if ( ivas_total_brate <= IVAS_128k ) { -#ifdef FIX_502_IND_LIST_SIZE return 305; -#else - return 250; -#endif } else if ( ivas_total_brate <= IVAS_160k ) { -#ifdef FIX_502_IND_LIST_SIZE return 425; -#else - return 320; -#endif } else if ( ivas_total_brate <= IVAS_192k ) { -#ifdef FIX_502_IND_LIST_SIZE return 630; -#else - return 430; -#endif } else if ( ivas_total_brate <= IVAS_256k ) { -#ifdef FIX_502_IND_LIST_SIZE return 850; -#else - return 600; -#endif } else if ( ivas_total_brate <= IVAS_384k ) { @@ -863,11 +835,7 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else { -#ifdef FIX_502_IND_LIST_SIZE return 1750; -#else - return 1500; -#endif } } else if ( ivas_format == MC_FORMAT ) @@ -882,11 +850,7 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_64k ) { -#ifdef FIX_502_IND_LIST_SIZE return 210; -#else - return 200; -#endif } else if ( ivas_total_brate <= IVAS_96k ) { diff --git a/lib_com/options.h b/lib_com/options.h index 46bce4c1c8..72122d7930 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ -#define FIX_502_IND_LIST_SIZE /* Fix issue #502: insufficient index buffer sizes */ #define FIX_505_MASA_SPHGRID_REUSE /* Nokia: Fix issue #505: MASA spherical grid reuse fix */ -- GitLab From 1165de2e090c1013e57797795ec657ae239d7ddc Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:23:25 +0200 Subject: [PATCH 271/381] [cleanup] accept FIX_505_MASA_SPHGRID_REUSE --- lib_com/options.h | 1 - lib_enc/ivas_masa_enc.c | 30 ------------------------------ 2 files changed, 31 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 72122d7930..d227d1fd44 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ -#define FIX_505_MASA_SPHGRID_REUSE /* Nokia: Fix issue #505: MASA spherical grid reuse fix */ #define FIX_481_UNUSED_VARIABLES /* Nokia: Fix issue #481: Unused debug variables */ diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 0307d3f61d..55308a448b 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -64,10 +64,8 @@ static void reduce_metadata_further( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_H static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] , const SPHERICAL_GRID_DATA *sphGrid -#ifdef FIX_505_MASA_SPHGRID_REUSE , const uint8_t useSphGrid -#endif ); static void copy_masa_metadata_subframe( const MASA_METADATA_HANDLE hMetaFrom, const uint8_t sfFrom, MASA_METADATA_HANDLE hMetaTo, const uint8_t sfTo ); @@ -496,9 +494,6 @@ ivas_error ivas_masa_enc_config( uint8_t maxBand; int16_t maxBin, sf; ivas_error error; -#ifndef FIX_505_MASA_SPHGRID_REUSE - SPHERICAL_GRID_DATA *sphGrid; -#endif error = IVAS_ERR_OK; @@ -519,31 +514,12 @@ ivas_error ivas_masa_enc_config( if ( hMasa->data.sync_state.frame_mode == MASA_FRAME_1SF && hMasa->data.sync_state.prev_offset != 0 ) { -#ifndef FIX_505_MASA_SPHGRID_REUSE - if ( ( sphGrid = (SPHERICAL_GRID_DATA *) malloc( sizeof( SPHERICAL_GRID_DATA ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for MASA spherical grid\n" ) ); - } - - if ( ivas_total_brate == IVAS_512k ) - { - generate_gridEq( sphGrid ); - } - else - { - sphGrid->no_theta = 0; - } -#endif /* average over sub-frames */ average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy , -#ifdef FIX_505_MASA_SPHGRID_REUSE &( hMasa->data.Sph_Grid16 ), ivas_total_brate == IVAS_512k ? TRUE : FALSE -#else - sphGrid -#endif ); } @@ -1810,10 +1786,8 @@ static void average_masa_metadata( float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] , const SPHERICAL_GRID_DATA *Sph_Grid16 -#ifdef FIX_505_MASA_SPHGRID_REUSE , const uint8_t useSphGrid -#endif ) { int16_t i, j, k; @@ -1861,11 +1835,7 @@ static void average_masa_metadata( j = 0; hMeta->directional_meta[i].azimuth[j][k] = atan2f( y_sum, x_sum ) / EVS_PI * 180.0f; hMeta->directional_meta[i].elevation[j][k] = atan2f( z_sum, sqrtf( x_sum * x_sum + y_sum * y_sum ) ) / EVS_PI * 180.0f; -#ifdef FIX_505_MASA_SPHGRID_REUSE if ( useSphGrid == TRUE ) -#else - if ( Sph_Grid16->no_theta > 0 ) -#endif { hMeta->directional_meta[i].spherical_index[j][k] = index_theta_phi_16( &( hMeta->directional_meta[i].elevation[j][k] ), &( hMeta->directional_meta[i].azimuth[j][k] ), Sph_Grid16 ); -- GitLab From ba18ed9d069ca6a7b91099949126507eb7a00698 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:24:15 +0200 Subject: [PATCH 272/381] [cleanup] accept FIX_481_UNUSED_VARIABLES --- lib_com/options.h | 1 - lib_dec/ivas_qmetadata_dec.c | 40 ------------------------------------ lib_enc/ivas_qmetadata_enc.c | 16 --------------- 3 files changed, 57 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index d227d1fd44..e2311ed87c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ -#define FIX_481_UNUSED_VARIABLES /* Nokia: Fix issue #481: Unused debug variables */ #define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ #define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 73043ec78e..d3b66c6523 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -780,22 +780,14 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( ) { int16_t d, b, m; -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA int16_t bits_diff_sum; -#endif -#else - int16_t bits_diff_sum; #endif int16_t nbands, start_band; IVAS_QDIRECTION *q_direction; int16_t start_index_0; -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA int16_t bits_no_dirs_coh, bits_sur_coherence; -#endif -#else - int16_t bits_no_dirs_coh, bits_sur_coherence; #endif uint16_t all_coherence_zero; int16_t p[MASA_MAXIMUM_CODING_SUBBANDS], dif_p[MASA_MAXIMUM_CODING_SUBBANDS]; @@ -875,24 +867,16 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( hQMetaData->q_direction[0].cfg.nbands = codedBands; /*Coherence flag decoding*/ -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh = 0; -#endif -#else - bits_no_dirs_coh = 0; #endif all_coherence_zero = 1; if ( hQMetaData->coherence_flag ) { /* read if coherence is zero */ all_coherence_zero = bitstream[( *index )--]; -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh += 1; -#endif -#else - bits_no_dirs_coh += 1; #endif } @@ -923,12 +907,8 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( p[b] = p[b - 1] + dif_p[b] + 1; hQMetaData->twoDirBands[p[b]] = 1; } -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh += ( d - *index ); -#endif -#else - bits_no_dirs_coh += ( d - *index ); #endif } @@ -940,23 +920,15 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( hQMetaData->q_direction[1].cfg.nbands = codedBands; } } -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_diff_sum = -#endif -#else - bits_diff_sum = #endif ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[0] ) ); if ( hQMetaData->no_directions == 2 ) { -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_diff_sum += -#endif -#else - bits_diff_sum += #endif ivas_qmetadata_entropy_decode_diffuseness_hr_512( bitstream, index, &( hQMetaData->q_direction[1] ) ); } @@ -1007,23 +979,15 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( if ( all_coherence_zero == 0 ) { -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_sur_coherence = -#endif -#else - bits_sur_coherence = #endif read_surround_coherence_hr( bitstream, index, hQMetaData ); } else { -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_sur_coherence = 0; -#endif -#else - bits_sur_coherence = 0; #endif /*Surround coherence*/ for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) @@ -1034,13 +998,9 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } } } -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh += bits_sur_coherence; #endif -#else - bits_no_dirs_coh += bits_sur_coherence; -#endif for ( d = 0; d < hQMetaData->no_directions; d++ ) { diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index acace009be..d9833ee060 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -740,12 +740,8 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( int16_t nbands, nblocks, start_band; int16_t ndirections, d; int16_t all_coherence_zero; -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA int16_t bits_no_dirs_coh; -#endif -#else - int16_t bits_no_dirs_coh; #endif int16_t bits_ec; float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -783,12 +779,8 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( /* Check if coherence should be encoded */ all_coherence_zero = 1; -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh = 0; -#endif -#else - bits_no_dirs_coh = 0; #endif if ( hQMetaData->q_direction->cfg.inactiveBands > 0 ) { @@ -805,24 +797,16 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( { all_coherence_zero = hQMetaData->all_coherence_zero; push_next_indice( hMetaData, all_coherence_zero, 1 ); /* signal coherence */ -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh += 1; -#endif -#else - bits_no_dirs_coh += 1; #endif } /* encode 2 direction subbands position */ if ( ndirections == 2 && bits_sph_idx == 11 ) { -#ifdef FIX_481_UNUSED_VARIABLES #ifdef DEBUG_MODE_QMETADATA bits_no_dirs_coh += -#endif -#else - bits_no_dirs_coh += #endif write_2dir_info( hMetaData, hQMetaData->twoDirBands, hQMetaData->q_direction[0].cfg.nbands, hQMetaData->numTwoDirBands ); -- GitLab From bbb81c1cf5a9651a9dfdfe020c8e0ce6995773c8 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:25:30 +0200 Subject: [PATCH 273/381] [cleanup] accept FIX_483, FIX_483b --- lib_com/bitstream.c | 4 ---- lib_com/options.h | 2 -- lib_enc/ivas_mct_core_enc.c | 8 -------- lib_enc/ivas_mct_enc_mct.c | 2 -- lib_enc/ivas_stereo_mdct_core_enc.c | 8 -------- lib_enc/ivas_stereo_mdct_stereo_enc.c | 6 ------ lib_enc/nois_est.c | 10 ---------- lib_enc/stat_enc.h | 2 -- 8 files changed, 42 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 84411b49bb..bf588d24dd 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -772,11 +772,7 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_256k ) { -#ifdef FIX_483b return 1050; -#else - return 1000; -#endif } else if ( ivas_total_brate <= IVAS_384k ) { diff --git a/lib_com/options.h b/lib_com/options.h index e2311ed87c..7bd5e60037 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,8 +157,6 @@ -#define FIX_483 /* FhG: fix issue 483, division by zero in nois_est */ -#define FIX_483b /* FhG: fix issue 483, uninitialized values in ivas_mct_core_enc */ #define FIX_506_WARNINGS /* FhG/Eri/Dlb/VA: Issue 508, Warnings on MacOS */ #define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ #define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index 40153a3c69..5298e39f39 100755 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -264,10 +264,8 @@ void ivas_mct_core_enc( sp_aud_decision0[i] = hCPE[cpe_id]->hCoreCoder[0]->sp_aud_decision0; -#ifdef FIX_483b sts[i]->hTcxEnc->tns_ms_flag[0] = 0; sts[i]->hTcxEnc->tns_ms_flag[1] = 0; -#endif i++; } @@ -343,11 +341,7 @@ void ivas_mct_core_enc( for ( n = 0; n < nSubframes; n++ ) { -#ifdef FIX_483b if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) -#else - if ( !sts[ch]->hTcxEnc->fUseTns[n] /*!sts[0]->fUseTns[n] && !sts[1]->fUseTns[n]*/ ) -#endif { /* power spectrum: MDCT^2 + MDST^2 */ for ( i = 0; i < L_subframeTCX; i++ ) @@ -358,9 +352,7 @@ void ivas_mct_core_enc( } else { -#ifdef FIX_483b if ( hMCT->currBlockDataCnt > 0 ) -#endif { /* power spectrum: MDCT^2 + MDST^2 */ powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c index 50982e2e52..08ed294a56 100755 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -700,9 +700,7 @@ void apply_MCT_enc( { v_multc( sts[ch]->hTcxEnc->spectrum[k], qratio, sts[ch]->hTcxEnc->spectrum[k], L_subframeTCX ); v_multc( mdst_spectrum[ch][k], qratio, mdst_spectrum[ch][k], L_subframeTCX ); -#ifdef FIX_483b set_zero( inv_spectrum[ch][k], L_subframeTCX ); -#endif } hMCT->mc_global_ild[ch] = 0; } diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index c8e3dcfcd4..3c274b149e 100755 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -223,10 +223,8 @@ void stereo_mdct_core_enc( inv_spectrum[ch][1] = quantized_spectrum[ch][1]; mdst_spectrum[ch][0] = mdst_spectrum_long[ch]; mdst_spectrum[ch][1] = mdst_spectrum_long[ch] + N_TCX10_MAX; -#ifdef FIX_483b sts[ch]->hTcxEnc->tns_ms_flag[0] = 0; sts[ch]->hTcxEnc->tns_ms_flag[1] = 0; -#endif } @@ -279,11 +277,7 @@ void stereo_mdct_core_enc( for ( n = 0; n < nSubframes; n++ ) { -#ifdef FIX_483b if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) -#else - if ( !sts[ch]->hTcxEnc->fUseTns[n] ) -#endif { /* power spectrum: MDCT^2 + MDST^2 */ for ( i = 0; i < L_subframeTCX; i++ ) @@ -294,9 +288,7 @@ void stereo_mdct_core_enc( } else { -#ifdef FIX_483b if ( hStereoMdct->mdct_stereo_mode[n] != SMDCT_DUAL_MONO ) -#endif { /* power spectrum: MDCT^2 + MDST^2 */ powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index 97c9ebe7ff..b8ab5398ec 100755 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -430,10 +430,8 @@ void stereo_coder_tcx( if ( !sts[0]->hTcxEnc->fUseTns[k] && !sts[1]->hTcxEnc->fUseTns[k] ) { -#ifdef FIX_483b sts[0]->hTcxEnc->tns_ms_flag[k] = 1; sts[1]->hTcxEnc->tns_ms_flag[k] = 1; -#endif ms_inv_mask_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], inv_mdst_spectrum[0][k], inv_mdst_spectrum[1][k], -1 ); ms_processing( hStereoMdct, sts, ms_mask, k, mdst_spectrum[0][k], mdst_spectrum[1][k], sfbConf->sfbCnt ); } @@ -563,12 +561,10 @@ void ms_inv_mask_processing( { int16_t sfb; STEREO_MDCT_BAND_PARAMETERS *sfbConf; -#ifdef FIX_483b int16_t nSubframes, L_subframeTCX; nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; L_subframeTCX = sts[0]->hTcxEnc->L_frameTCX / nSubframes; -#endif sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; if ( sts[0]->last_core == ACELP_CORE ) @@ -593,14 +589,12 @@ void ms_inv_mask_processing( } } -#ifdef FIX_483b /* set rest of inverse spectrum to zero */ if ( L_subframeTCX > sfbConf->sfbOffset[maxSfb] ) { set_zero( &x_inv_0[sfbConf->sfbOffset[maxSfb]], L_subframeTCX - sfbConf->sfbOffset[maxSfb] ); set_zero( &x_inv_1[sfbConf->sfbOffset[maxSfb]], L_subframeTCX - sfbConf->sfbOffset[maxSfb] ); } -#endif return; } diff --git a/lib_enc/nois_est.c b/lib_enc/nois_est.c index bf506cd9db..b35b3612b5 100644 --- a/lib_enc/nois_est.c +++ b/lib_enc/nois_est.c @@ -378,7 +378,6 @@ void noise_est( { if ( st->hSpMusClas != NULL ) { -#ifdef FIX_483 float E; E = mean( lf_E, 8 ); @@ -391,15 +390,6 @@ void noise_est( st->hSpMusClas->ener_RAT = 10.0f * (float) log10( E ); st->hSpMusClas->ener_RAT /= ( Etot + 0.01f ); } -#else - st->hSpMusClas->ener_RAT = 10.0f * (float) log10( mean( lf_E, 8 ) ); - st->hSpMusClas->ener_RAT /= ( Etot + 0.01f ); - - if ( st->hSpMusClas->ener_RAT < 0.0f ) - { - st->hSpMusClas->ener_RAT = 0.0f; - } -#endif if ( st->hSpMusClas->ener_RAT > 1.0 ) { diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 1a5c893dbd..762b8f6066 100755 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -1121,9 +1121,7 @@ typedef struct tcx_enc_structure float *acelp_zir; float tcx_target_bits_fac; -#ifdef FIX_483b int16_t tns_ms_flag[2]; -#endif } TCX_ENC_DATA, *TCX_ENC_HANDLE; /*----------------------------------------------------------------------------------* -- GitLab From a1d47617e5ef25af540ec5f62c5f77763a98156c Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:26:07 +0200 Subject: [PATCH 274/381] [cleanup] accept FIX_170_DTX_MASA --- lib_com/options.h | 1 - lib_enc/lib_enc.c | 7 ------- 2 files changed, 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7bd5e60037..c0301db0e3 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,7 +158,6 @@ #define FIX_506_WARNINGS /* FhG/Eri/Dlb/VA: Issue 508, Warnings on MacOS */ -#define FIX_170_DTX_MASA /* Nokia: Fix issue 170, relaxing the use of DTX in MASA format */ #define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ #define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */ #define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 544ea32ade..28a733d3a3 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -908,17 +908,10 @@ static ivas_error configureEncoder( return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "8kHz input sampling rate is not supported in IVAS." ); } -#ifdef FIX_170_DTX_MASA if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && ( ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || // ToDo: support for 3+ TCs to be done hEncoderConfig->ivas_format == MC_FORMAT // ToDo: TBD ) ) -#else - if ( hEncoderConfig->Opt_DTX_ON && hEncoderConfig->ivas_format != MONO_FORMAT && - ( ( hEncoderConfig->ivas_format == MASA_FORMAT && hEncoderConfig->ivas_total_brate > IVAS_128k ) || // ToDo: remove the bitrate limitation - ( hEncoderConfig->ivas_format == SBA_FORMAT && ivas_get_sba_num_TCs( hEncoderConfig->ivas_total_brate, 1 ) > 2 ) || - hEncoderConfig->ivas_format == MC_FORMAT ) ) -#endif { return IVAS_ERROR( IVAS_ERR_DTX_NOT_SUPPORTED, "DTX is not supported in this IVAS format and element mode." ); } -- GitLab From 75a3bf0e2eb0127d6361e0fd838695141b3cfee7 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:27:25 +0200 Subject: [PATCH 275/381] [cleanup] accept FIX_509 --- lib_com/bitstream.c | 8 -------- lib_com/ivas_error.h | 4 ---- lib_com/options.h | 2 -- lib_dec/lib_dec.c | 4 ---- 4 files changed, 18 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index bf588d24dd..81b734b400 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -776,19 +776,11 @@ int16_t get_ivas_max_num_indices_metadata( /* o } else if ( ivas_total_brate <= IVAS_384k ) { -#ifdef FIX_509 return 2000; -#else - return 1500; -#endif } else { -#ifdef FIX_509 return 2500; -#else - return 2000; -#endif } } else if ( ivas_format == MASA_FORMAT ) diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 56e09c558d..0fae8ff215 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -235,11 +235,7 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) case IVAS_ERR_INVALID_HRTF: return "Unsupported HRTF filter set"; case IVAS_ERR_INVALID_INPUT_FORMAT: -#ifdef FIX_510 return "Invalid input format"; -#else - return "Invalid format of input bitstream"; -#endif case IVAS_ERR_INVALID_INDEX: return "Invalid index"; default: diff --git a/lib_com/options.h b/lib_com/options.h index c0301db0e3..33adbd6eb6 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -159,8 +159,6 @@ #define FIX_506_WARNINGS /* FhG/Eri/Dlb/VA: Issue 508, Warnings on MacOS */ #define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ -#define FIX_510 /* FhG: fix issue 510, misleading error message for invalid input format */ -#define FIX_509 /* FhG: fix issue 509, too low number of bitsream indices in SBA */ #define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ #ifdef IND_LIST_DYN #define FIX_545_ASSERT /* VA: fix issue 545, replace assert() with warning message when hitting memory limit in the buffer of indices */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 09cf754979..2ee010a43f 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -2927,11 +2927,7 @@ static ivas_error input_format_API_to_internal( *sdp_hf_only = 1; break; default: -#ifdef FIX_510 return IVAS_ERR_INVALID_BITSTREAM; -#else - return IVAS_ERR_INVALID_INPUT_FORMAT; -#endif break; } -- GitLab From 94844670c3df25ddf217edde83fbfe25c44c2996 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:35:15 +0200 Subject: [PATCH 276/381] formatting --- apps/decoder.c | 3 +- apps/renderer.c | 3 +- lib_com/ivas_cov_smooth.c | 5 +- lib_com/ivas_dirac_com.c | 126 +++++----- lib_com/ivas_fb_mixer.c | 10 +- lib_com/ivas_masa_com.c | 11 +- lib_com/ivas_spar_com.c | 3 +- lib_com/ivas_td_decorr.c | 6 +- lib_com/ivas_tools.c | 2 +- lib_com/options.h | 7 - lib_dec/ivas_binRenderer_internal.c | 16 +- lib_dec/ivas_cpe_dec.c | 6 +- lib_dec/ivas_dec.c | 8 +- lib_dec/ivas_dirac_dec.c | 202 ++++++++------- lib_dec/ivas_dirac_output_synthesis_cov.c | 22 +- lib_dec/ivas_dirac_output_synthesis_dec.c | 7 +- lib_dec/ivas_init_dec.c | 72 +++--- lib_dec/ivas_ism_dec.c | 3 +- lib_dec/ivas_ism_param_dec.c | 1 - lib_dec/ivas_ism_renderer.c | 4 +- lib_dec/ivas_jbm_dec.c | 1 - lib_dec/ivas_masa_dec.c | 13 +- lib_dec/ivas_mc_param_dec.c | 42 ++-- lib_dec/ivas_objectRenderer_internal.c | 4 +- lib_dec/ivas_out_setup_conversion.c | 6 +- lib_dec/ivas_qmetadata_dec.c | 73 ++---- lib_dec/ivas_sba_dirac_stereo_dec.c | 6 +- lib_dec/ivas_sba_rendering_internal.c | 20 +- lib_dec/ivas_spar_decoder.c | 249 +++++++++---------- lib_dec/ivas_spar_md_dec.c | 6 +- lib_dec/ivas_stat_dec.h | 24 +- lib_dec/ivas_stereo_dft_dec.c | 6 +- lib_dec/jbm_pcmdsp_apa.c | 11 +- lib_dec/lib_dec.c | 27 +- lib_enc/ivas_cpe_enc.c | 6 +- lib_enc/ivas_dirac_enc.c | 8 +- lib_enc/ivas_enc.c | 20 +- lib_enc/ivas_enc_cov_handler.c | 2 +- lib_enc/ivas_entropy_coder.c | 30 +-- lib_enc/ivas_init_enc.c | 8 +- lib_enc/ivas_masa_enc.c | 22 +- lib_enc/ivas_mct_enc.c | 4 +- lib_enc/ivas_qmetadata_enc.c | 71 ++---- lib_enc/ivas_qspherical_enc.c | 3 +- lib_enc/ivas_spar_encoder.c | 6 +- lib_enc/ivas_spar_md_enc.c | 3 +- lib_enc/ivas_stereo_dft_enc.c | 6 +- lib_enc/ivas_stereo_dft_enc_itd.c | 4 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 2 - lib_rend/ivas_limiter.c | 8 +- lib_rend/ivas_objectRenderer.c | 18 +- lib_rend/ivas_objectRenderer_sources.c | 3 +- lib_rend/ivas_orient_trk.c | 2 +- lib_rend/ivas_reverb.c | 14 +- lib_rend/ivas_rotation.c | 26 +- lib_rend/lib_rend.c | 8 +- lib_util/masa_file_reader.c | 2 - 57 files changed, 575 insertions(+), 706 deletions(-) mode change 100755 => 100644 lib_dec/ivas_cpe_dec.c mode change 100755 => 100644 lib_dec/ivas_dirac_output_synthesis_dec.c mode change 100755 => 100644 lib_dec/ivas_spar_decoder.c mode change 100755 => 100644 lib_dec/ivas_spar_md_dec.c diff --git a/apps/decoder.c b/apps/decoder.c index db3aad3740..fd659b74ae 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -2255,8 +2255,7 @@ static ivas_error decodeVoIP( /* decode and get samples */ - if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms - , + if ( ( error = IVAS_DEC_VoIP_GetSamples( hIvasDec, nOutSamples, pcmBuf, systemTime_ms, &nSamplesAvailableNext #ifdef SUPPORT_JBM_TRACEFILE , diff --git a/apps/renderer.c b/apps/renderer.c index 640899679b..d285499e22 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -1467,8 +1467,7 @@ static bool parseDiegeticPan( static bool parseOrientationTracking( char *value, - int8_t *orientation_tracking -) + int8_t *orientation_tracking ) { to_upper( value ); diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index b466351e02..430e33e343 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -51,8 +51,7 @@ static void ivas_set_up_cov_smoothing( ivas_cov_smooth_state_t *hCovState, ivas_filterbank_t *pFb, const float max_update_rate, - const int16_t min_pool_size - , + const int16_t min_pool_size, const COV_SMOOTHING_TYPE smooth_mode /* i : flag multichannel vs SPAR */ , const int32_t ivas_total_brate ) @@ -154,7 +153,7 @@ ivas_error ivas_spar_covar_smooth_enc_open( const int16_t nchan_inp /* i : number of input channels */ , COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { ivas_cov_smooth_state_t *hCovState; diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index e799d42c56..1cd2aa3ab9 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -180,20 +180,20 @@ ivas_error ivas_dirac_config( } - hConfig->dec_param_estim = TRUE; - if ( hConfig->dec_param_estim == TRUE ) - { - hConfig->enc_param_start_band = spar_dirac_split_band; - } + hConfig->dec_param_estim = TRUE; + if ( hConfig->dec_param_estim == TRUE ) + { + hConfig->enc_param_start_band = spar_dirac_split_band; + } - if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) - { - hConfig->dec_param_estim = FALSE; - hConfig->enc_param_start_band = 0; + if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) + { + hConfig->dec_param_estim = FALSE; + hConfig->enc_param_start_band = 0; - set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); - hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; - } + set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); + hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; + } } if ( ivas_format == SBA_FORMAT ) @@ -383,10 +383,10 @@ void ivas_get_dirac_sba_max_md_bits( ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - int16_t *element_mode, /* i/o: element mode of the core coder */ - int32_t sba_total_brate, /* i : SBA total bitrate */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int16_t nbands /* i : number of frequency bands */ + int16_t *element_mode, /* i/o: element mode of the core coder */ + int32_t sba_total_brate, /* i : SBA total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t nbands /* i : number of frequency bands */ ) { int16_t nbands_coded; @@ -397,65 +397,65 @@ ivas_error ivas_dirac_sba_config( hQMetaData->is_masa_ivas_format = 0; hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order ); - /* map the bitrate for SID frame */ - if ( sba_total_brate == IVAS_SID_5k2 ) - { - if ( *element_mode == IVAS_SCE ) - { - sba_total_brate = ACELP_24k40; - } - else - { - sba_total_brate = ACELP_48k; - } - } - - ivas_set_qmetadata_maxbit_req( hQMetaData, SBA_FORMAT ); - - if ( sba_total_brate <= IVAS_16k4 ) + /* map the bitrate for SID frame */ + if ( sba_total_brate == IVAS_SID_5k2 ) + { + if ( *element_mode == IVAS_SCE ) { - hQMetaData->useLowerRes = 1; + sba_total_brate = ACELP_24k40; } else { - hQMetaData->useLowerRes = 0; + sba_total_brate = ACELP_48k; } + } + + ivas_set_qmetadata_maxbit_req( hQMetaData, SBA_FORMAT ); + + if ( sba_total_brate <= IVAS_16k4 ) + { + hQMetaData->useLowerRes = 1; + } + else + { + hQMetaData->useLowerRes = 0; + } - nbands_coded = nbands; - if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + nbands_coded = nbands; + if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + { + hQMetaData->useLowerBandRes = 1; + nbands_coded = nbands / 2 + nbands % 2; + } + else + { + hQMetaData->useLowerBandRes = 0; + if ( hodirac_flag == 0 ) { - hQMetaData->useLowerBandRes = 1; - nbands_coded = nbands / 2 + nbands % 2; + nbands_coded = nbands - 1; /* always combine the last two bands */ } - else + } + + { + int16_t no_dirs = 1; + if ( hodirac_flag ) { - hQMetaData->useLowerBandRes = 0; - if ( hodirac_flag == 0 ) - { - nbands_coded = nbands - 1; /* always combine the last two bands */ - } + no_dirs = 2; } + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) { - int16_t no_dirs = 1; - if ( hodirac_flag ) - { - no_dirs = 2; - } - - if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } + return error; } - ivas_get_dirac_sba_max_md_bits( - sba_total_brate, - &hQMetaData->bits_frame_nominal, - &hQMetaData->metadata_max_bits, - &hQMetaData->qmetadata_max_bit_req, - hQMetaData->q_direction[0].cfg.nbands ); - - return error; + } + ivas_get_dirac_sba_max_md_bits( + sba_total_brate, + &hQMetaData->bits_frame_nominal, + &hQMetaData->metadata_max_bits, + &hQMetaData->qmetadata_max_bit_req, + hQMetaData->q_direction[0].cfg.nbands ); + + return error; } @@ -691,7 +691,7 @@ void deindex_spherical_component( *-----------------------------------------------------------------*/ void calculate_hodirac_sector_parameters( - DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ + DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ const float beta, /* i : forgetting factor for average filtering */ diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index c9edff81db..4dd3c588e4 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -99,8 +99,8 @@ static int16_t ivas_get_num_bands( *---------------------------------------------------------------------*/ ivas_error ivas_fb_set_cfg( - IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ - const int16_t ivas_format, /* i : IVAS format */ + IVAS_FB_CFG **pFb_cfg_out, /* o : FB config. handle */ + const int16_t ivas_format, /* i : IVAS format */ const int16_t num_in_chans, /* i : number of FB input channels */ const int16_t num_out_chans, /* i : number of FB output channels */ const int16_t active_w_mixing, /* i : active_w_mixing flag */ @@ -134,9 +134,9 @@ ivas_error ivas_fb_set_cfg( { pFb_cfg->fb_latency = NS2SA( sampling_rate, DELAY_FB_1_NS ); - pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); - pFb_cfg->prior_input_length = NS2SA( sampling_rate, FRAME_SIZE_NS ); - pFb_cfg->windowed_fr_offset = (int16_t) ( (float) ( sampling_rate / FRAMES_PER_SEC ) * 3.0f / 4.0f ) - NS2SA( sampling_rate, DELAY_DIRAC_SPAR_ENC_CMP_NS ); + pFb_cfg->fade_len = NS2SA( sampling_rate, DELAY_FB_4_NS ); + pFb_cfg->prior_input_length = NS2SA( sampling_rate, FRAME_SIZE_NS ); + pFb_cfg->windowed_fr_offset = (int16_t) ( (float) ( sampling_rate / FRAMES_PER_SEC ) * 3.0f / 4.0f ) - NS2SA( sampling_rate, DELAY_DIRAC_SPAR_ENC_CMP_NS ); } else if ( ivas_format == MASA_FORMAT ) { diff --git a/lib_com/ivas_masa_com.c b/lib_com/ivas_masa_com.c index a962e45a81..8c821d99fd 100644 --- a/lib_com/ivas_masa_com.c +++ b/lib_com/ivas_masa_com.c @@ -62,7 +62,6 @@ static int16_t quantize_theta_masa( float x, const int16_t no_cb, float *xhat ); static int16_t quantize_phi_masa( float phi, const int16_t flag_delta, float *phi_hat, const int16_t n ); - /*--------------------------------------------------------------- * ivas_masa_setup() * @@ -321,11 +320,11 @@ void ivas_masa_set_coding_config( *---------------------------------------------------------------*/ void masa_sample_rate_band_correction( - MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ - int16_t *band_mapping, /* i/o: Band mapping used and modified */ - IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ - const uint8_t maxBand, /* i : max band */ - uint8_t is_encoder, /* i: signals if called at encoder */ + MASA_CODEC_CONFIG *config, /* i/o: MASA codec config */ + int16_t *band_mapping, /* i/o: Band mapping used and modified */ + IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: QMetadata structure for modification */ + const uint8_t maxBand, /* i : max band */ + uint8_t is_encoder, /* i: signals if called at encoder */ MASA_DECODER_EXT_OUT_META_HANDLE hExtOutMeta /* i/o: MASA decoder metadata ext out buffer */ ) { diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 8be61ea768..d00b802cd7 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -2130,8 +2130,7 @@ void ivas_spar_set_bitrate_config( const int16_t dirac2spar_md_flag, const int16_t enc_flag, const int16_t pca_flag, - const int16_t agc_flag -) + const int16_t agc_flag ) { int32_t ivas_total_brate; int16_t i, total_bits, max_bits, code, length; diff --git a/lib_com/ivas_td_decorr.c b/lib_com/ivas_td_decorr.c index afba0c3d24..4bf813ac35 100644 --- a/lib_com/ivas_td_decorr.c +++ b/lib_com/ivas_td_decorr.c @@ -469,9 +469,9 @@ static void ivas_td_decorr_APD_sections( void ivas_td_decorr_process( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ - float *pcm_in[], /* i : input audio channels */ - float **ppOut_pcm, /* o : output audio channels */ - const int16_t output_frame /* i : output frame length */ + float *pcm_in[], /* i : input audio channels */ + float **ppOut_pcm, /* o : output audio channels */ + const int16_t output_frame /* i : output frame length */ ) { int16_t i, j; diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index b7fe5821e3..45c87e4ff5 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -122,7 +122,7 @@ void mvc2c( /*! r: number of clipped samples */ uint32_t ivas_syn_output( - float *synth[], /* i/o: float synthesis signal */ + float *synth[], /* i/o: float synthesis signal */ const int16_t output_frame, /* i : output frame length (one channel) */ const int16_t n_channels, /* i : number of output channels */ int16_t *synth_out /* o : integer 16 bits synthesis signal */ diff --git a/lib_com/options.h b/lib_com/options.h index 33adbd6eb6..1098f65a05 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -149,14 +149,7 @@ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ - - #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ - - - - - #define FIX_506_WARNINGS /* FhG/Eri/Dlb/VA: Issue 508, Warnings on MacOS */ #define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ #define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index bac1a69d56..2e0c4f7829 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -59,8 +59,8 @@ static void ivas_binRenderer_filterModule( float out_Conv_CLDFB_imag[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : imag part of Binaural signals */ float CLDFB_real[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : real part of LS signals */ float CLDFB_imag[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : imag part of LS signals */ - const int16_t numTimeSlots, /* i : number of time slots to process */ - BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + BINAURAL_RENDERER_HANDLE hBinRenderer /* i/o: fastconv binaural renderer handle */ ) { int16_t bandIdx, k, chIdx, tapIdx; @@ -945,8 +945,8 @@ void ivas_binRenderer_close( void ivas_binaural_add_LFE( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ int16_t output_frame, /* i : length of input frame */ - float *input_f[], /* i : transport channels */ - float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ + float *input_f[], /* i : transport channels */ + float *output_f[] /* o : synthesized core-coder transport channels/DirAC output */ ) { int16_t render_lfe, idx_lfe; @@ -993,7 +993,7 @@ void ivas_binaural_add_LFE( void ivas_binaural_cldfb( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ + float *output_f[] /* i/o: synthesized core-coder transport channels/DirAC output */ ) { float Cldfb_RealBuffer[MAX_INTERN_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX]; @@ -1161,9 +1161,9 @@ void ivas_binaural_cldfb_sf( *-------------------------------------------------------------------------*/ void ivas_binRenderer( - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ - const int16_t numTimeSlots, /* i : number of time slots to render*/ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ + const int16_t numTimeSlots, /* i : number of time slots to render*/ float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c old mode 100755 new mode 100644 index f0d550649d..948b475c74 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -405,10 +405,8 @@ ivas_error ivas_cpe_dec( } else { - stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0 - , - MAX_PARAM_SPATIAL_SUBFRAMES - ); + stereo_dft_dec( hCPE->hStereoDft, sts[0], DFT, hCPE->input_mem[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, + MAX_PARAM_SPATIAL_SUBFRAMES ); } /* synthesis iFFT */ diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 5c34af0a36..e53e11037e 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -276,10 +276,10 @@ ivas_error ivas_dec( { st = ( st_ivas->nSCE > 0 ) ? st_ivas->hSCE[0]->hCoreCoder[0] : st_ivas->hCPE[0]->hCoreCoder[0]; - if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = ivas_masa_decode( st_ivas, st, &nb_bits_metadata[0] ) ) != IVAS_ERR_OK ) + { + return error; + } } else if ( st_ivas->ivas_format == SBA_FORMAT ) { diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 0b795ddd31..098aa348eb 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1010,7 +1010,6 @@ ivas_error ivas_dirac_dec_config( { hDirAC->render_to_md_map[map_idx] = map_idx; } - } else if ( st_ivas->ivas_format == MASA_FORMAT ) { @@ -1028,16 +1027,16 @@ ivas_error ivas_dirac_dec_config( int16_t num_slots_in_subfr; num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; #ifdef FIX_393_459_460_SBA_MD - hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ); - hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; - hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; + hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ); + hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; + hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; #else hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; #endif - hDirAC->dirac_read_idx = 0; - hDirAC->dirac_estimator_idx = 0; + hDirAC->dirac_read_idx = 0; + hDirAC->dirac_estimator_idx = 0; set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); #ifdef FIX_393_459_460_SBA_MD @@ -1699,8 +1698,8 @@ void ivas_dirac_dec_read_BS( DIRAC_DEC_HANDLE hDirAC, /* i/o: decoder DirAC handle */ IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata */ int16_t *nb_bits, /* o : number of bits read */ - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t i, j, b, dir, orig_dirac_bands; @@ -1717,38 +1716,38 @@ void ivas_dirac_dec_read_BS( if ( b == 1 ) /* WB 4TCs condition, no other metadata to read*/ { - orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; + orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; - hQMetaData->sba_inactive_mode = 1; + hQMetaData->sba_inactive_mode = 1; - /* if we start with a SID frame, we need to init the azi/ele arrays.*/ - if ( st->ini_frame == 0 ) + /* if we start with a SID frame, we need to init the azi/ele arrays.*/ + if ( st->ini_frame == 0 ) + { + for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) { - for ( b = 0; b < hQMetaData->q_direction[0].cfg.nbands; b++ ) - { - set_zero( hQMetaData->q_direction[0].band_data[b].azimuth, MAX_PARAM_SPATIAL_SUBFRAMES ); - set_zero( hQMetaData->q_direction[0].band_data[b].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); - } + set_zero( hQMetaData->q_direction[0].band_data[b].azimuth, MAX_PARAM_SPATIAL_SUBFRAMES ); + set_zero( hQMetaData->q_direction[0].band_data[b].elevation, MAX_PARAM_SPATIAL_SUBFRAMES ); } + } *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; - } - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + } + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = orig_dirac_bands - 2; j >= 0; j-- ) { - for ( j = orig_dirac_bands - 2; j >= 0; j-- ) - { - hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; - hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; - hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; - } + hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; + hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; } + } - hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; + hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; } else { @@ -1799,23 +1798,23 @@ void ivas_dirac_dec_read_BS( } *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) - { - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; - hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; - } - for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + } + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = orig_dirac_bands - 2; j >= 0; j-- ) { - for ( j = orig_dirac_bands - 2; j >= 0; j-- ) - { - hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; - hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; - hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; - } + hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; + hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; } + } - hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; + hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; st->next_bit_pos = next_bit_pos_orig; } @@ -1842,9 +1841,9 @@ void ivas_qmetadata_to_dirac( DIRAC_DEC_HANDLE hDirAC, /* o : DirAC decoder structure */ MASA_DECODER_HANDLE hMasa, /* i : MASA decoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int16_t hodirac_flag, /* i : flag to indicate HO-DirAC mode */ + int16_t *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { int16_t block, band; @@ -2490,12 +2489,11 @@ void ivas_dirac_dec_render( *------------------------------------------------------------------------*/ void ivas_dirac_dec_render_sf( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ const int16_t nchan_transport, /* i : number of transport channels */ float *pppQMfFrame_ts_re[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX], - float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] -) + float *pppQMfFrame_ts_im[IVAS_MAX_FB_MIXER_IN_CH][CLDFB_NO_COL_MAX] ) { int16_t i, ch, idx_in, idx_lfe; DIRAC_DEC_HANDLE hDirAC; @@ -2629,8 +2627,7 @@ void ivas_dirac_dec_render_sf( set_zero( onset_filter_subframe, hDirAC->num_freq_bands ); } - if ( st_ivas->hHeadTrackData - ) + if ( st_ivas->hHeadTrackData ) { QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); @@ -2645,10 +2642,10 @@ void ivas_dirac_dec_render_sf( rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } #else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); - } + for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) + { + rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); + } #endif } } @@ -2939,8 +2936,6 @@ void ivas_dirac_dec_render_sf( diffuseness_vector[slot_idx] #endif ); - - } #ifdef DEBUG_MODE_DIRAC @@ -3062,52 +3057,52 @@ void ivas_dirac_dec_render_sf( } /*Compute PSDs*/ - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, #ifdef FIX_393_459_460_SBA_MD - azimuth, - elevation, - hDirAC->diffuseness_vector[md_idx], + azimuth, + elevation, + hDirAC->diffuseness_vector[md_idx], #else - azimuth[slot_idx], - elevation[slot_idx], - diffuseness_vector[slot_idx], + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], #endif - hDirAC, - st_ivas->hHeadTrackData->shd_rot_max_order, - p_Rmat, - st_ivas->hVBAPdata, - hDirAC->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag - - ); - } - else - { - ivas_dirac_dec_output_synthesis_process_slot( reference_power, - p_onset_filter, + hDirAC, + st_ivas->hHeadTrackData->shd_rot_max_order, + p_Rmat, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag + + ); + } + else + { + ivas_dirac_dec_output_synthesis_process_slot( reference_power, + p_onset_filter, #ifdef FIX_393_459_460_SBA_MD - azimuth, - elevation, - hDirAC->diffuseness_vector[md_idx], + azimuth, + elevation, + hDirAC->diffuseness_vector[md_idx], #else - azimuth[slot_idx], - elevation[slot_idx], - diffuseness_vector[slot_idx], + azimuth[slot_idx], + elevation[slot_idx], + diffuseness_vector[slot_idx], #endif - hDirAC, - 0, - 0, - st_ivas->hVBAPdata, - hDirAC->hOutSetup, - nchan_transport, - md_idx, - hodirac_flag ); - } + hDirAC, + 0, + 0, + st_ivas->hVBAPdata, + hDirAC->hOutSetup, + nchan_transport, + md_idx, + hodirac_flag ); + } #ifdef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim ) @@ -3121,7 +3116,6 @@ void ivas_dirac_dec_render_sf( { v_add( reference_power, reference_power_smooth, reference_power_smooth, hDirAC->num_freq_bands ); } - } ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); @@ -3177,7 +3171,7 @@ void ivas_dirac_dec_render_sf( #ifdef FIX_393_459_460_SBA_MD diffuseness_vector, #else - md_idx, + md_idx, #endif hodirac_flag ); } @@ -3388,9 +3382,9 @@ void ivas_dirac_dec_render_sf( hDirAC->slots_rendered += hDirAC->subframe_nbslots[subframe_idx]; hDirAC->subframes_rendered++; -pop_wmops(); + pop_wmops(); -return; + return; } diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index cc08a6faca..d71d816557 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -307,8 +307,8 @@ void ivas_dirac_dec_output_synthesis_cov_close( *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( - float *RealBuffer, /* i : input channel filter bank samples (real part) */ - float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ + float *RealBuffer, /* i : input channel filter bank samples (real part) */ + float *ImagBuffer, /* i : input channel filter bank samples (imaginary part */ float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (real part) */ float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* o : accumulated input covariance (imaginary part) */ PARAM_MC_DEC_HANDLE hParamMC, /* i : handle to Parametric MC state */ @@ -362,17 +362,17 @@ void ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( *-------------------------------------------------------------------*/ void ivas_dirac_dec_output_synthesis_cov_param_mc_synthesise_slot( - float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ - float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ + float *Cldfb_RealBuffer_in, /* i : input channel filter bank samples (real part) */ + float *Cldfb_ImagBuffer_in, /* i : input channel filter bank samples (imaginary part) */ float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (real part) */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : output channel filter bank samples (imaginary part) */ - float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ - float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ - const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ - const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ - const int16_t nX, /* i : number of input channels */ - const int16_t nY, /* i : number of output channels */ - PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ + float *mixing_matrix[], /* i : parameter band wise mixing matrices (direct part) */ + float *mixing_matrix_res[], /* i : parameter band wise mixing matrices (residual part) */ + const uint16_t slot_idx_sfr, /* i : time slot index for the current slot within the current subframe */ + const uint16_t slot_idx_tot, /* i : time slot index for the current slot within the frame */ + const int16_t nX, /* i : number of input channels */ + const int16_t nY, /* i : number of output channels */ + PARAM_MC_DEC_HANDLE hParamMC /* i : handle to the Parametric MC decoder state */ ) { int16_t param_band_idx, band, ch_idx; diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c old mode 100755 new mode 100644 index 7bdaea9d3c..61682fca44 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -546,8 +546,7 @@ void ivas_dirac_dec_output_synthesis_process_slot( const IVAS_OUTPUT_SETUP hOutSetup, /* i : output setup structure */ const int16_t nchan_transport /* i : number of transport channels*/ , - const int16_t md_idx - , + const int16_t md_idx, const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { @@ -775,7 +774,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t nbslots, /* i : number of slots to process */ + const int16_t nbslots, /* i : number of slots to process */ const float *onset_filter, #ifdef FIX_393_459_460_SBA_MD float *diffuseness, @@ -1232,7 +1231,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ - const int16_t nbslots, /* i : number of slots to process */ + const int16_t nbslots, /* i : number of slots to process */ #ifdef FIX_393_459_460_SBA_MD float *diffuseness_vector, #else diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d4699a7273..0f0365d437 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -853,55 +853,55 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->ivas_format == SBA_FORMAT ) { - if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_spar_dec_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } + + if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->hOutSetup.is_loudspeaker_setup ) + { + if ( ( error = ivas_sba_get_hoa_dec_matrix( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) { return error; } + } - if ( st_ivas->renderer_type == RENDERER_SBA_LINEAR_DEC && st_ivas->hOutSetup.is_loudspeaker_setup ) - { - if ( ( error = ivas_sba_get_hoa_dec_matrix( st_ivas->hOutSetup, &st_ivas->hoa_dec_mtx, st_ivas->hIntSetup.ambisonics_order ) ) != IVAS_ERR_OK ) - { - return error; - } - } + if ( ( error = ivas_dirac_sba_config( + st_ivas->hQMetaData, + &st_ivas->element_mode_init, + ivas_total_brate, + st_ivas->sba_analysis_order, + ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) + { + return error; + } - if ( ( error = ivas_dirac_sba_config( - st_ivas->hQMetaData, - &st_ivas->element_mode_init, - ivas_total_brate, - st_ivas->sba_analysis_order, - ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ? IVAS_MAX_NUM_BANDS : ( IVAS_MAX_NUM_BANDS - SPAR_DIRAC_SPLIT_START_BAND ) ) ) != IVAS_ERR_OK ) + if ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) + { + if ( ( error = ivas_dirac_dec_open( st_ivas ) ) != IVAS_ERR_OK ) { return error; } - if ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_STEREO && st_ivas->hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) - { - if ( ( error = ivas_dirac_dec_open( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + } + else + { + int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; - st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; - } - else + st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); + if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) { - int16_t band_grouping[IVAS_MAX_NUM_BANDS + 1]; + st_ivas->hSpar->enc_param_start_band = 0; - st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - if ( ivas_get_hodirac_flag( ivas_total_brate, st_ivas->sba_analysis_order ) ) - { - st_ivas->hSpar->enc_param_start_band = 0; - - set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); - st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; - } - - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), - st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + set_c( (int8_t *) st_ivas->hQMetaData->twoDirBands, (int8_t) 1, st_ivas->hQMetaData->q_direction[0].cfg.nbands ); + st_ivas->hQMetaData->numTwoDirBands = (uint8_t) st_ivas->hQMetaData->q_direction[0].cfg.nbands; } - st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); + + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); + } + st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); } if ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 3276d9488d..1ee468dc80 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -359,8 +359,7 @@ ivas_error ivas_ism_dec_config( const ISM_MODE last_ism_mode /* i/o: last ISM mode */ , uint16_t *nSamplesRendered, /* o : number of samples flushed when the renderer granularity changes */ - int16_t *data -) + int16_t *data ) { int32_t ivas_total_brate; ivas_error error; diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 3a9d7f625c..1e28d2ea34 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -286,7 +286,6 @@ static void ivas_param_ism_compute_mixing_matrix( } - static void ivas_param_ism_render_slot( DIRAC_DEC_HANDLE hDirAC, float *Cldfb_RealBuffer_in[PARAM_ISM_MAX_DMX], diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 915b545a59..c6ca4b3b7b 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -109,8 +109,8 @@ ivas_error ivas_ism_renderer_open( *-------------------------------------------------------------------------*/ void ivas_ism_render( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output_f[], /* i/o: core-coder transport channels/object output */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output_f[], /* i/o: core-coder transport channels/object output */ const int16_t output_frame /* i : output frame length per channel */ ) { diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index a0dd0aad18..fd0375e7be 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -46,7 +46,6 @@ #include "wmc_auto.h" - /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 87ddae3a5c..45f56875ff 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -195,17 +195,13 @@ ivas_error ivas_masa_decode( { if ( ivas_total_brate >= IVAS_512k ) { - *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4 - , - hMasa->config.numCodingBands - ); + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 16, 4, + hMasa->config.numCodingBands ); } else { - *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3 - , - hMasa->config.numCodingBands - ); + *nb_bits_read += ivas_qmetadata_dec_decode_hr_384_512( hQMetaData, st->bit_stream, &st->next_bit_pos, hMasa->data.sph_grid16, 11, 3, + hMasa->config.numCodingBands ); } } else @@ -1114,7 +1110,6 @@ ivas_error ivas_masa_dec_reconfigure( } - void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : Input audio in CLDFB domain, real */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 32c332ec53..2745481402 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -631,9 +631,9 @@ ivas_error ivas_param_mc_dec_reconfig( #endif } - /*-----------------------------------------------------------------* - * set input parameters - *-----------------------------------------------------------------*/ + /*-----------------------------------------------------------------* + * set input parameters + *-----------------------------------------------------------------*/ hParamMC->num_freq_bands = (int16_t) ( output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); hParamMC->max_band_energy_compensation = hParamMC->num_freq_bands; @@ -1923,11 +1923,11 @@ static void ivas_param_mc_dec_init( *------------------------------------------------------------------------*/ static void param_mc_protoSignalComputation( - float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */ - float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */ + float *RealBuffer, /* i : CLDFB samples of the transport channels (real part) */ + float *ImagBuffer, /* i : CLDFB samples of the transport channels (imaginary part) */ float *proto_frame_f, /* o : interleaved complex prototype CLDFB samples */ const PARAM_MC_DIFF_PROTO_INFO *diff_proto_info, /* i : prototype generation information */ - const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ + const int16_t num_freq_bands /* i : number of frequency bands for the prototypes */ ) { int16_t band; @@ -2203,12 +2203,12 @@ static void ivas_param_mc_get_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ IVAS_OUTPUT_SETUP *hSynthesisOutputSetup, float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : input covariance for all parameter bands */ - float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ - float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ - const int16_t nY_intern, /* i : number of channels in the transported format */ - const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ - const int16_t nX, /* i : number of transport channels */ - const int16_t nY_cov /* i : number of covariance synthesis output channels */ + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ + const int16_t nY_intern, /* i : number of channels in the transported format */ + const PARAM_MC_SYNTHESIS_CONF synth_config, /* i : Parametric MC synthesis config */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov /* i : number of covariance synthesis output channels */ ) { int16_t param_band_idx; @@ -2457,11 +2457,11 @@ static void ivas_param_mc_get_mixing_matrices( static void ivas_param_mc_get_mono_stereo_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i : Parametric MC handle */ float Cx_in[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS], /* i : transport channel covariance for all parameter bands */ - float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ - float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ - const int16_t nY_intern, /* i : number of channels of the transport format */ - const int16_t nX, /* i : number of transport channels */ - const int16_t nY_cov ) /* i : number of output channels */ + float *mixing_matrix[], /* o : direct mixing matrices for all parameter bands */ + float *mixing_matrix_res[], /* o : residual mixing matrices for all parameter bands */ + const int16_t nY_intern, /* i : number of channels of the transport format */ + const int16_t nX, /* i : number of transport channels */ + const int16_t nY_cov ) /* i : number of output channels */ { int16_t param_band_idx; float Cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -2577,10 +2577,10 @@ static void ivas_param_mc_get_mono_stereo_mixing_matrices( static void param_mc_update_mixing_matrices( PARAM_MC_DEC_HANDLE hParamMC, /* i/o: Parametric MC handle */ - float *mixing_matrix[], /* i : direct mixing matrices for the frame just processed */ - float *mixing_matrix_res[], /* i : residual mixing matrices for the frame just processed */ - const uint16_t nX, /* i : number of transport channels */ - const uint16_t nY ) /* i : number of synthesis channels */ + float *mixing_matrix[], /* i : direct mixing matrices for the frame just processed */ + float *mixing_matrix_res[], /* i : residual mixing matrices for the frame just processed */ + const uint16_t nX, /* i : number of transport channels */ + const uint16_t nY ) /* i : number of synthesis channels */ { uint16_t param_band_idx; diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 363fedaca2..df210f2f8a 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -66,8 +66,8 @@ ivas_error ivas_td_binaural_open( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ const int16_t output_frame /* i : output frame length */ ) { diff --git a/lib_dec/ivas_out_setup_conversion.c b/lib_dec/ivas_out_setup_conversion.c index ae113204aa..153764c98a 100644 --- a/lib_dec/ivas_out_setup_conversion.c +++ b/lib_dec/ivas_out_setup_conversion.c @@ -498,8 +498,8 @@ void ivas_ls_setup_conversion( Decoder_Struct *st_ivas, /* i : IVAS decoder structure */ const int16_t input_chans, /* i : number of input channels to the renderer */ const int16_t output_frame, /* i : frame length */ - float *input[], /* i : LS input/output synthesis signal */ - float *output[] /* i/o: LS input/output synthesis signal */ + float *input[], /* i : LS input/output synthesis signal */ + float *output[] /* i/o: LS input/output synthesis signal */ ) { int16_t chInIdx, chOutIdx, idx; @@ -1159,7 +1159,7 @@ void ivas_lssetupconversion_process_param_mc( set_s( channel_active, 0, outChannels ); -/* Loop over each time slots and compute dmx for each time slot */ + /* Loop over each time slots and compute dmx for each time slot */ for ( slotIdx = 0; slotIdx < num_timeslots; slotIdx++ ) { /* copy buffers */ diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index d3b66c6523..d3ecf47b52 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -49,15 +49,9 @@ static int16_t ivas_qmetadata_entropy_decode_diffuseness( uint16_t *bitstream, i static int16_t ivas_qmetadata_entropy_decode_df_ratio( uint16_t *bitstream, int16_t *index, IVAS_QDIRECTION *q_direction, int16_t *dfRatio_bits ); -static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band - , - const int16_t hrmasa_flag -); +static int16_t ivas_qmetadata_entropy_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t hrmasa_flag ); -static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band - , - const int16_t hrmasa_flag -); +static int16_t ivas_qmetadata_raw_decode_dir( IVAS_QDIRECTION *q_direction, uint16_t *bitstream, int16_t *index, const int16_t nbands, const int16_t start_band, const int16_t hrmasa_flag ); static uint16_t ivas_qmetadata_DecodeQuasiUniform( const uint16_t *bitstream, int16_t *index, const uint16_t alphabet_size ); @@ -83,17 +77,11 @@ static int16_t read_truncGR_azimuth( uint16_t *bitstream, IVAS_QDIRECTION *q_dir static ivas_error read_huf( int16_t *num_bits_read, const uint16_t *bitstream, uint16_t *out, const int16_t start_pos, const int16_t len, const int16_t *huff_code, const int16_t max_len ); -static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir - , - const int16_t hrmasa_flag -); +static int16_t read_coherence_data( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData, const int16_t idx_dir, const int16_t hrmasa_flag ); static int16_t read_surround_coherence( uint16_t *bitstream, int16_t *p_bit_pos, IVAS_QMETADATA *hQMetaData ); -static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames - , - const int16_t hrmasa_flag -); +static void decode_spread_coherence( IVAS_QMETADATA_HANDLE hQMetaData, int16_t idx_d, const int16_t no_frames, const int16_t hrmasa_flag ); static void decode_combined_index( uint64_t comb_index, const int16_t *no_cv_vec, uint16_t *index, const int16_t len ); @@ -452,10 +440,8 @@ int16_t ivas_qmetadata_dec_decode( if ( all_coherence_zero == 0 ) { - bits_coherence = read_coherence_data( bitstream, index, hQMetaData, d - , - 0 - ); + bits_coherence = read_coherence_data( bitstream, index, hQMetaData, d, + 0 ); } else { @@ -503,17 +489,13 @@ int16_t ivas_qmetadata_dec_decode( if ( raw_flag[0] == 0 ) { - bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, nbands, start_band - , - 0 - ); + bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, nbands, start_band, + 0 ); } else { - bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, nbands, start_band - , - 0 - ); + bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, nbands, start_band, + 0 ); } } /* Decode quantized directions band-wise */ @@ -533,10 +515,8 @@ int16_t ivas_qmetadata_dec_decode( { if ( raw_flag[b] == 0 ) { - bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, b + 1, b - , - 0 - ); + bits_dir += ivas_qmetadata_entropy_decode_dir( q_direction, bitstream, index, diffuseness_index_max_ec_frame, b + 1, b, + 0 ); } else { @@ -580,10 +560,8 @@ int16_t ivas_qmetadata_dec_decode( { if ( raw_flag[b] ) { - bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, b + 1, b - , - 0 - ); + bits_dir += ivas_qmetadata_raw_decode_dir( q_direction, bitstream, index, b + 1, b, + 0 ); } } } @@ -617,10 +595,8 @@ int16_t ivas_qmetadata_dec_decode( { if ( nblocks > 1 ) { - decode_spread_coherence( hQMetaData, d, nblocks - , - 0 - ); + decode_spread_coherence( hQMetaData, d, nblocks, + 0 ); } } else @@ -774,10 +750,8 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( int16_t *index, /* i/o: bitstream position */ const SPHERICAL_GRID_DATA *sph_grid16, /* i : spherical grid for deindexing */ const int16_t bits_sph_idx, - const int16_t bits_sp_coh - , - uint8_t ncoding_bands_config -) + const int16_t bits_sp_coh, + uint8_t ncoding_bands_config ) { int16_t d, b, m; #ifdef DEBUG_MODE_QMETADATA @@ -1170,7 +1144,6 @@ int16_t ivas_qmetadata_dec_decode_hr_384_512( } - /*-----------------------------------------------------------------------* * ivas_qmetadata_dec_sid_decode() * @@ -1215,8 +1188,8 @@ int16_t ivas_qmetadata_dec_sid_decode( if ( ivas_format == SBA_FORMAT ) { - /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ + /* TODO: still use old sid frame size to keep bitexactness */ + metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ } else { @@ -1780,8 +1753,7 @@ static int16_t ivas_qmetadata_entropy_decode_dir( int16_t *index, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, - const int16_t start_band - , + const int16_t start_band, const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ ) { @@ -2195,8 +2167,7 @@ static int16_t ivas_qmetadata_raw_decode_dir( uint16_t *bitstream, /* i : bitstream */ int16_t *index, const int16_t nbands, - const int16_t start_band - , + const int16_t start_band, const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ ) { diff --git a/lib_dec/ivas_sba_dirac_stereo_dec.c b/lib_dec/ivas_sba_dirac_stereo_dec.c index f96fdb694a..aca7ce78f9 100644 --- a/lib_dec/ivas_sba_dirac_stereo_dec.c +++ b/lib_dec/ivas_sba_dirac_stereo_dec.c @@ -885,10 +885,8 @@ void ivas_sba_dirac_stereo_dec( stereo_dft_dec( hStereoDft, hCPE->hCoreCoder[0], DFT, NULL, NULL, 1 /*st_ivas->sba_dirac_stereo_flag*/, sba_mono_flag, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hMdDec : NULL, ( st_ivas->hSpar != NULL && !mcmasa ) ? st_ivas->hSpar->hFbMixer->cross_fade_start_offset : 0, - st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport - , - ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) - ); + st_ivas->hDecoderConfig->output_Fs, st_ivas->nchan_transport, + ivas_get_spar_dec_md_num_subframes( st_ivas->sba_order, st_ivas->hDecoderConfig->ivas_total_brate ) ); /* DFT synthesis */ stereo_dft_dec_synthesize( hCPE, DFT, 0, output[0], output_frame ); diff --git a/lib_dec/ivas_sba_rendering_internal.c b/lib_dec/ivas_sba_rendering_internal.c index 5415609d80..17d231a6d3 100644 --- a/lib_dec/ivas_sba_rendering_internal.c +++ b/lib_dec/ivas_sba_rendering_internal.c @@ -65,8 +65,8 @@ void ivas_sba2mc_cldfb( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: cldfb imag part */ const int16_t nb_channels_out, /* i : nb of output channels */ const int16_t nb_bands, /* i : nb of CLDFB bands to process */ - const int16_t nb_timeslots, /* i : number of time slots to process */ - const float *hoa_dec_mtx /* i : HOA decoding mtx */ + const int16_t nb_timeslots, /* i : number of time slots to process */ + const float *hoa_dec_mtx /* i : HOA decoding mtx */ ) { int16_t iBlock, iBand, n, m; @@ -137,11 +137,11 @@ void ivas_sba2mc_cldfb( void ivas_mc2sba( IVAS_OUTPUT_SETUP hIntSetup, /* i : Format of decoder output */ - float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ - float *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ - const int16_t output_frame, /* i : output frame length per channel */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ + float *in_buffer_td[], /* i : MC signals (on input) and the HOA3 (on output) */ + float *buffer_td[], /* i/o: MC signals (on input) and the HOA3 (on output) */ + const int16_t output_frame, /* i : output frame length per channel */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const float gain_lfe /* i : gain for LFE, 0 = ignore LFE */ ) { int16_t i, j, k; @@ -273,7 +273,7 @@ int16_t ivas_sba_remapTCs( *-------------------------------------------------------------------------*/ void ivas_ism2sba( - float *buffer_td[], /* i/o: TD signal buffers */ + float *buffer_td[], /* i/o: TD signal buffers */ ISM_RENDERER_HANDLE hIsmRendererData, /* i/o: renderer data */ const ISM_METADATA_HANDLE hIsmMetaData[], /* i : object metadata */ const int16_t nchan_ism, /* i : number of objects */ @@ -429,7 +429,7 @@ void ivas_sba_upmixer_renderer( *-------------------------------------------------------------------*/ static void ivas_sba_mtx_mult( - float *output_f[], /* i/o: synthesized core-corder transport channels/DirAC output */ + float *output_f[], /* i/o: synthesized core-corder transport channels/DirAC output */ const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : Number of ambisonic channels */ const IVAS_OUTPUT_SETUP output_setup, /* i : Output configuration */ @@ -489,7 +489,7 @@ static void ivas_sba_mtx_mult( *-------------------------------------------------------------------*/ ivas_error ivas_sba_linear_renderer( - float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ + float *output_f[], /* i/o: synthesized core-coder transport channels/DirAC output */ const int16_t output_frame, /* i : output frame length per channel */ const int16_t nchan_in, /* i : number of input ambisonics channels */ const AUDIO_CONFIG output_config, /* i : output audio configuration */ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c old mode 100755 new mode 100644 index df0bb993da..d7b3aba54f --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1555,187 +1555,186 @@ void ivas_spar_dec_upmixer_sf( ivas_spar_dump_signal_wav( output_frame, p_tc, NULL, numch_in, spar_foa_dec_wav[4], "ivas_spar_upmixer()" ); #endif - /* CLDFB analysis of incoming frame */ - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + /* CLDFB analysis of incoming frame */ + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + { + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) - { - cldfbAnalysis_ts( - &p_tc[in_ch][ts * num_cldfb_bands], - cldfb_in_ts_re[in_ch][ts], - cldfb_in_ts_im[in_ch][ts], - num_cldfb_bands, - st_ivas->cldfbAnaDec[in_ch] ); - } + cldfbAnalysis_ts( + &p_tc[in_ch][ts * num_cldfb_bands], + cldfb_in_ts_re[in_ch][ts], + cldfb_in_ts_im[in_ch][ts], + num_cldfb_bands, + st_ivas->cldfbAnaDec[in_ch] ); } + } - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) ) - { - ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf ); - } + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) ) + { + ivas_spar_calc_smooth_facs( cldfb_in_ts_re[0], cldfb_in_ts_im[0], num_spar_bands, &hSpar->hFbMixer->pFb->fb_bin_to_band, hSpar->hMdDec->smooth_fac, hSpar->hMdDec->smooth_buf ); + } - for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) + { + md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; + ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); + if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) ) { - md_idx = hSpar->render_to_md_map[ts + slot_idx_start]; - ivas_spar_get_parameters( hSpar, hDecoderConfig, md_idx, numch_out, numch_in, num_spar_bands, mixer_mat ); - if ( ( hDecoderConfig->ivas_total_brate < IVAS_24k4 ) && ( ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA2 ) || ( hDecoderConfig->output_config == AUDIO_CONFIG_HOA3 ) ) ) + for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) { - for ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) { - for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) - { - mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; - hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band] = mixer_mat[out_ch][in_ch][spar_band]; - } + mixer_mat[out_ch][in_ch][spar_band] = ( 1 - hSpar->hMdDec->smooth_fac[spar_band] ) * mixer_mat[out_ch][in_ch][spar_band] + hSpar->hMdDec->smooth_fac[spar_band] * hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band]; + hSpar->hMdDec->mixer_mat_prev2[out_ch][in_ch][spar_band] = mixer_mat[out_ch][in_ch][spar_band]; } } } + } + + for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) + { + float out_re[IVAS_SPAR_MAX_CH]; + float out_im[IVAS_SPAR_MAX_CH]; + float cldfb_par; + ivas_fb_bin_to_band_data_t *bin2band = &hSpar->hFbMixer->pFb->fb_bin_to_band; - for ( cldfb_band = 0; cldfb_band < num_cldfb_bands; cldfb_band++ ) + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) { - float out_re[IVAS_SPAR_MAX_CH]; - float out_im[IVAS_SPAR_MAX_CH]; - float cldfb_par; - ivas_fb_bin_to_band_data_t *bin2band = &hSpar->hFbMixer->pFb->fb_bin_to_band; + out_re[out_ch] = 0.0f; + out_im[out_ch] = 0.0f; - for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - out_re[out_ch] = 0.0f; - out_im[out_ch] = 0.0f; - - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + if ( b_skip_mat[out_ch][in_ch] == 0 ) { - if ( b_skip_mat[out_ch][in_ch] == 0 ) + if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ { - if ( cldfb_band < CLDFB_PAR_WEIGHT_START_BAND ) /* tuning parameter, depends on how much SPAR Filters overlap for the CLDFB bands */ - { - spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; - cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; - } - else + spar_band = bin2band->p_cldfb_map_to_spar_band[cldfb_band]; + cldfb_par = mixer_mat[out_ch][in_ch][spar_band]; + } + else + { + cldfb_par = 0.0f; + for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) { - cldfb_par = 0.0f; - for ( spar_band = bin2band->p_spar_start_bands[cldfb_band]; spar_band < num_spar_bands; spar_band++ ) - { - /* accumulate contributions from all SPAR bands */ - cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; - } + /* accumulate contributions from all SPAR bands */ + cldfb_par += mixer_mat[out_ch][in_ch][spar_band] * bin2band->pp_cldfb_weights_per_spar_band[cldfb_band][spar_band]; } - - out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; - out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; } + + out_re[out_ch] += cldfb_in_ts_re[in_ch][ts][cldfb_band] * cldfb_par; + out_im[out_ch] += cldfb_in_ts_im[in_ch][ts][cldfb_band] * cldfb_par; } } + } - /*update CLDFB data with the parameter-modified data*/ - for ( out_ch = 0; out_ch < numch_out; out_ch++ ) - { - cldfb_in_ts_re[out_ch][ts][cldfb_band] = out_re[out_ch]; - cldfb_in_ts_im[out_ch][ts][cldfb_band] = out_im[out_ch]; - } + /*update CLDFB data with the parameter-modified data*/ + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + cldfb_in_ts_re[out_ch][ts][cldfb_band] = out_re[out_ch]; + cldfb_in_ts_im[out_ch][ts][cldfb_band] = out_im[out_ch]; } + } - if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + if ( ( ( slot_idx_start + ts + 1 ) == hSpar->num_slots ) || ( ( md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME ) != ( hSpar->render_to_md_map[ts + slot_idx_start + 1] / JBM_CLDFB_SLOTS_IN_SUBFRAME ) ) ) + { + /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ + int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; + split_band = SPAR_DIRAC_SPLIT_START_BAND; + md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0; + if ( split_band < IVAS_MAX_NUM_BANDS ) { - /* we have crossed an unadapted parameter sf border, update previous mixing matrices */ - int16_t md_sf = md_idx / JBM_CLDFB_SLOTS_IN_SUBFRAME; - split_band = SPAR_DIRAC_SPLIT_START_BAND; - md_sf = ( num_md_sub_frames == MAX_PARAM_SPATIAL_SUBFRAMES ) ? md_sf : 0; - if ( split_band < IVAS_MAX_NUM_BANDS ) - { - mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[1][0][0], hSpar->hMdDec->mixer_mat_prev[0][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[2][0][0], hSpar->hMdDec->mixer_mat_prev[1][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[3][0][0], hSpar->hMdDec->mixer_mat_prev[2][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); + mvr2r( hSpar->hMdDec->mixer_mat_prev[4][0][0], hSpar->hMdDec->mixer_mat_prev[3][0][0], IVAS_MAX_FB_MIXER_OUT_CH * IVAS_MAX_SPAR_FB_MIXER_IN_CH * IVAS_MAX_NUM_BANDS ); - for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + for ( out_ch = 0; out_ch < numch_out; out_ch++ ) + { + for ( in_ch = 0; in_ch < numch_in; in_ch++ ) { - for ( in_ch = 0; in_ch < numch_in; in_ch++ ) + for ( b = 0; b < num_spar_bands; b++ ) { - for ( b = 0; b < num_spar_bands; b++ ) - { - hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; - } + hSpar->hMdDec->mixer_mat_prev[4][out_ch][in_ch][b] = hSpar->hMdDec->mixer_mat[out_ch][in_ch][b + md_sf * IVAS_MAX_NUM_BANDS]; } } - hSpar->i_subframe++; - hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); } + hSpar->i_subframe++; + hSpar->i_subframe = min( hSpar->i_subframe, MAX_PARAM_SPATIAL_SUBFRAMES ); } } + } - if ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA && hDecoderConfig->output_config != AUDIO_CONFIG_STEREO && hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) - { - ivas_dirac_dec_render_sf( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); - } + if ( hDecoderConfig->output_config != AUDIO_CONFIG_FOA && hDecoderConfig->output_config != AUDIO_CONFIG_STEREO && hDecoderConfig->output_config != AUDIO_CONFIG_MONO ) + { + ivas_dirac_dec_render_sf( st_ivas, output, nchan_internal, cldfb_in_ts_re, cldfb_in_ts_im ); + } - if ( st_ivas->hDirAC != NULL ) - { - int16_t outchannels, idx_in, idx_lfe, ch; - idx_in = 0; - idx_lfe = 0; + if ( st_ivas->hDirAC != NULL ) + { + int16_t outchannels, idx_in, idx_lfe, ch; + idx_in = 0; + idx_lfe = 0; - outchannels = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; - for ( ch = 0; ch < outchannels; ch++ ) + outchannels = st_ivas->hOutSetup.nchan_out_woLFE + st_ivas->hOutSetup.num_lfe; + for ( ch = 0; ch < outchannels; ch++ ) + { + if ( ( st_ivas->hOutSetup.num_lfe > 0 ) && ( st_ivas->hOutSetup.index_lfe[idx_lfe] == ch ) ) { - if ( ( st_ivas->hOutSetup.num_lfe > 0 ) && ( st_ivas->hOutSetup.index_lfe[idx_lfe] == ch ) ) + set_zero( output[ch], hSpar->subframe_nbslots[hSpar->subframes_rendered] * num_cldfb_bands ); + if ( idx_lfe < ( st_ivas->hDirAC->hOutSetup.num_lfe - 1 ) ) { - set_zero( output[ch], hSpar->subframe_nbslots[hSpar->subframes_rendered] * num_cldfb_bands ); - if ( idx_lfe < ( st_ivas->hDirAC->hOutSetup.num_lfe - 1 ) ) - { - idx_lfe++; - } + idx_lfe++; } - else + } + else + { + if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) { - if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) - { - cldfbSynthesis( - &cldfb_in_ts_re[idx_in][ts], - &cldfb_in_ts_im[idx_in][ts], - &output[ch][ts * num_cldfb_bands], - num_cldfb_bands, - st_ivas->cldfbSynDec[idx_in] ); - } + cldfbSynthesis( + &cldfb_in_ts_re[idx_in][ts], + &cldfb_in_ts_im[idx_in][ts], + &output[ch][ts * num_cldfb_bands], + num_cldfb_bands, + st_ivas->cldfbSynDec[idx_in] ); } - idx_in++; } + idx_in++; } + } #ifdef DEBUG_SBA_AUDIO_DUMP - hSpar->numOutChannels = outchannels; + hSpar->numOutChannels = outchannels; #endif - } - else + } + else + { + /* CLDFB to time synthesis (overwrite mixer output) */ + for ( out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) { - /* CLDFB to time synthesis (overwrite mixer output) */ - for ( out_ch = 0; out_ch < numch_out_dirac; out_ch++ ) + for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { - for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) - { - cldfbSynthesis( - &cldfb_in_ts_re[out_ch][ts], - &cldfb_in_ts_im[out_ch][ts], - &output[out_ch][ts * num_cldfb_bands], - num_cldfb_bands, - st_ivas->cldfbSynDec[out_ch] ); - } + cldfbSynthesis( + &cldfb_in_ts_re[out_ch][ts], + &cldfb_in_ts_im[out_ch][ts], + &output[out_ch][ts * num_cldfb_bands], + num_cldfb_bands, + st_ivas->cldfbSynDec[out_ch] ); } + } #ifdef DEBUG_SBA_AUDIO_DUMP - hSpar->numOutChannels = numch_out_dirac; + hSpar->numOutChannels = numch_out_dirac; #endif - } + } #ifdef DEBUG_SBA_AUDIO_DUMP - /* Dump audio signal after cldfbSynthesis */ - ivas_spar_dump_signal_wav( output_frame, NULL, output, hSpar->numOutChannels, spar_foa_dec_wav[3], "cldfbSynthesis()" ); + /* Dump audio signal after cldfbSynthesis */ + ivas_spar_dump_signal_wav( output_frame, NULL, output, hSpar->numOutChannels, spar_foa_dec_wav[3], "cldfbSynthesis()" ); #endif - hSpar->slots_rendered += hSpar->subframe_nbslots[hSpar->subframes_rendered]; hSpar->subframes_rendered++; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c old mode 100755 new mode 100644 index dc76babe9c..9ef40b928e --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -486,11 +486,9 @@ ivas_error ivas_spar_md_dec_init( ivas_sba_get_spar_hoa_ch_ind( num_channels, hDecoderConfig->ivas_total_brate, hMdDec->HOA_md_ind ); hMdDec->spar_md.num_bands = ( hMdDec->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands - , + ivas_spar_set_bitrate_config( &hMdDec->spar_md_cfg, hMdDec->table_idx, hMdDec->spar_md.num_bands, hMdDec->spar_hoa_dirac2spar_md_flag, - 0, 0, 0 - ); + 0, 0, 0 ); nchan_transport = hMdDec->spar_md_cfg.nchan_transport; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index bb96d8bcba..ba8f573364 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1174,19 +1174,19 @@ typedef struct ivas_masa_decoder_struct typedef struct decoder_config_structure { - int32_t ivas_total_brate; /* IVAS total bitrate in bps */ - int32_t last_ivas_total_brate; /* last IVAS total bitrate in bps */ - int32_t output_Fs; /* output signal sampling frequency in Hz */ - int16_t nchan_out; /* number of output audio channels */ - AUDIO_CONFIG output_config; /* output audio configuration */ - int16_t Opt_LsCustom; /* indicates whether loudspeaker custom setup is used */ - int16_t Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ - int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ - int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ + int32_t ivas_total_brate; /* IVAS total bitrate in bps */ + int32_t last_ivas_total_brate; /* last IVAS total bitrate in bps */ + int32_t output_Fs; /* output signal sampling frequency in Hz */ + int16_t nchan_out; /* number of output audio channels */ + AUDIO_CONFIG output_config; /* output audio configuration */ + int16_t Opt_LsCustom; /* indicates whether loudspeaker custom setup is used */ + int16_t Opt_HRTF_binary; /* indicates whether HRTF binary file is used */ + int16_t Opt_Headrotation; /* indicates whether head-rotation is used */ + int16_t Opt_RendConfigCustom; /* indicates whether Renderer configuration custom setup is used */ HEAD_ORIENT_TRK_T orientation_tracking; /* indicates orientation tracking type */ - int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ - float non_diegetic_pan_gain; /* non diegetic panning gain*/ - int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ + int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ + float non_diegetic_pan_gain; /* non diegetic panning gain*/ + int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ /* temp. development parameters */ #ifdef DEBUGGING diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index de232e8fa8..08caff6233 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1210,10 +1210,8 @@ void stereo_dft_dec( ivas_sba_dirac_stereo_smooth_parameters( hStereoDft, hMdDec, cross_fade_start_offset, - output_Fs - , - num_md_sub_frames - ); + output_Fs, + num_md_sub_frames ); } else { diff --git a/lib_dec/jbm_pcmdsp_apa.c b/lib_dec/jbm_pcmdsp_apa.c index 89d6cb3e59..1242004fc8 100644 --- a/lib_dec/jbm_pcmdsp_apa.c +++ b/lib_dec/jbm_pcmdsp_apa.c @@ -553,12 +553,12 @@ bool apa_exit( ******************************************************************************** */ uint8_t apa_exec( - apa_state_t *ps, /* i/o: state struct */ - const float a_in[], /* i : input samples */ + apa_state_t *ps, /* i/o: state struct */ + const float a_in[], /* i : input samples */ uint16_t l_in, /* i : number of input samples */ uint16_t maxScaling, /* i : allowed number of inserted/removed samples */ - float a_out[], /* o : output samples */ - uint16_t *l_out /* o : number of output samples */ + float a_out[], /* o : output samples */ + uint16_t *l_out /* o : number of output samples */ ) { uint16_t i; @@ -1179,8 +1179,7 @@ static bool shrink_frm( xtract -= ps->l_ts; } } - else - if ( maxScaling != 0U && s_end > maxScaling + 1 ) + else if ( maxScaling != 0U && s_end > maxScaling + 1 ) { xtract = maxScaling; } diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 2ee010a43f..673c030abf 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -55,7 +55,7 @@ struct IVAS_DEC_VOIP JB4_HANDLE hJBM; PCMDSP_APA_HANDLE hTimeScaler; uint16_t lastDecodedWasActive; - float *apaExecBuffer; /* Buffer for APA scaling */ + float *apaExecBuffer; /* Buffer for APA scaling */ JB4_DATAUNIT_HANDLE hCurrentDataUnit; /* Points to the currently processed data unit */ uint16_t *bs_conversion_buf; /* Buffer for bitstream conversion from packed to serial */ #ifdef VARIABLE_SPEED_DECODING @@ -398,17 +398,17 @@ static IVAS_DEC_BS_FORMAT mapIvasFormat( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_Configure( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const uint32_t sampleRate, /* i : output sampling frequency */ - const IVAS_DEC_AUDIO_CONFIG outputFormat, /* i : output format */ - const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ - const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ - const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const uint32_t sampleRate, /* i : output sampling frequency */ + const IVAS_DEC_AUDIO_CONFIG outputFormat, /* i : output format */ + const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ + const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ + const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ - const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ - const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ - const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ - const int16_t delayCompensationEnabled /* i : enable delay compensation */ + const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ + const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ + const float non_diegetic_pan_gain, /* i : non diegetic panning gain */ + const int16_t delayCompensationEnabled /* i : enable delay compensation */ ) { Decoder_Struct *st_ivas; @@ -516,7 +516,6 @@ ivas_error IVAS_DEC_EnableVoIP( if ( hDecoderConfig->output_config != AUDIO_CONFIG_EXTERNAL ) { hDecoderConfig->nchan_out = audioCfg2channels( hDecoderConfig->output_config ); - } #ifdef VARIABLE_SPEED_DECODING else @@ -1926,7 +1925,6 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { return error; } - } #ifdef VARIABLE_SPEED_DECODING @@ -2171,8 +2169,7 @@ ivas_error IVAS_DEC_VoIP_Flush( bool IVAS_DEC_VoIP_IsEmpty( IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle */ , - const int16_t nSamplesAsked -) + const int16_t nSamplesAsked ) { return ( ( JB4_bufferedDataUnits( hIvasDec->hVoIP->hJBM ) == 0 ) && ( hIvasDec->hVoIP->nSamplesAvailableNext < nSamplesAsked ) ); } diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 6bea810953..50be346797 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -333,10 +333,8 @@ ivas_error ivas_cpe_enc( if ( hCPE->element_mode == IVAS_CPE_DFT ) { - stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs - , - hCPE->hStereoDft->hItd->hybrid_itd_max - ); + stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs, + hCPE->hStereoDft->hItd->hybrid_itd_max ); /* Time Domain ITD compensation using extrapolation */ #ifdef DEBUG_MODE_DFT diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index f364137bdf..70cbbb2043 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -96,7 +96,7 @@ ivas_error ivas_dirac_enc_open( } /* set FB config. */ - hDirAC->hFbMixer = NULL; + hDirAC->hFbMixer = NULL; for ( i = 0; i < DIRAC_MAX_NBANDS + 1; i++ ) { @@ -161,7 +161,7 @@ ivas_error ivas_dirac_enc_open( hDirAC->index_buffer_intensity = 0; st_ivas->hDirAC = hDirAC; - st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; + st_ivas->hSpar->enc_param_start_band = st_ivas->hDirAC->hConfig->enc_param_start_band; return error; } @@ -401,8 +401,8 @@ void computeReferencePower_enc( float *reference_power, /* o : Estimated power */ const int16_t enc_param_start_band, /* i : first band to process */ const int16_t num_freq_bands, /* i : Number of frequency bands */ - const IVAS_FORMAT ivas_format, /* i : ivas_format */ - int16_t ref_power_w /* i : use 0 if hodirac is enabled */ + const IVAS_FORMAT ivas_format, /* i : ivas_format */ + int16_t ref_power_w /* i : use 0 if hodirac is enabled */ , const int16_t nchan_ana /* i : number of analysis channels */ ) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 9939384c76..66942eaec3 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -219,16 +219,16 @@ ivas_error ivas_enc( if ( st_ivas->hQMetaData != NULL && ivas_format != SBA_FORMAT ) { - ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ - if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) - { - return error; - } - if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, - ivas_total_brate, hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1 ) ) != IVAS_ERR_OK ) - { - return error; - } + ivas_masa_estimate_energy( st_ivas->hMasa, data_f, input_frame, st_ivas->nchan_transport ); /* energy-estimation uses TF-resolution: 4x24 */ + if ( ( error = ivas_masa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) + { + return error; + } + if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, &nb_bits_metadata[0], st_ivas->nchan_transport, ivas_format, + ivas_total_brate, hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1 ) ) != IVAS_ERR_OK ) + { + return error; + } } else if ( ivas_format == SBA_FORMAT ) { diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 40db2d4f75..b40b9d1e42 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -69,7 +69,7 @@ ivas_error ivas_spar_covar_enc_open( const int16_t nchan_inp /* i : number of input channels */ , COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { ivas_enc_cov_handler_state_t *hCovState; diff --git a/lib_enc/ivas_entropy_coder.c b/lib_enc/ivas_entropy_coder.c index 02f3f1bea2..32e55d85b7 100644 --- a/lib_enc/ivas_entropy_coder.c +++ b/lib_enc/ivas_entropy_coder.c @@ -132,10 +132,8 @@ static int16_t ivas_arith_encode_array( int16_t *pInput, ivas_arith_t *pArith, BSTR_ENC_HANDLE hMetaData, - const int16_t in_len - , - int32_t wc_strat_arith -) + const int16_t in_len, + int32_t wc_strat_arith ) { int16_t model_index, i, ind; int16_t *pCum_freq = NULL; @@ -190,10 +188,8 @@ static int16_t ivas_arithCoder_encode_array_diff( int16_t *pIn_new, int16_t *pIn_old_scratch, const int16_t length, - BSTR_ENC_HANDLE hMetaData - , - int32_t wc_strat_arith -) + BSTR_ENC_HANDLE hMetaData, + int32_t wc_strat_arith ) { int16_t n; int16_t arith_result; @@ -253,10 +249,8 @@ static int16_t arith_encode_cell_array( BSTR_ENC_HANDLE hMetaData, const int16_t nB, ivas_arith_t *pArith, - int16_t *pSymbol - , - int32_t wc_strat_arith -) + int16_t *pSymbol, + int32_t wc_strat_arith ) { int16_t total_symbol_len = 0; int16_t i; @@ -297,10 +291,8 @@ static int16_t arith_encode_cell_array_diff( int16_t nB, ivas_arith_t *pArith_diff, int16_t *pSymbol_old, - int16_t *pSymbol - , - int32_t wc_strat_arith -) + int16_t *pSymbol, + int32_t wc_strat_arith ) { int16_t i, total_symbol_len; int16_t arith_result; @@ -344,10 +336,8 @@ int16_t ivas_arith_encode_cmplx_cell_array( int16_t *pSymbol_old_re, ivas_cell_dim_t *pCell_dims, BSTR_ENC_HANDLE hMetaData, - const int16_t any_diff - , - int32_t wc_strat_arith -) + const int16_t any_diff, + int32_t wc_strat_arith ) { int16_t input_old[IVAS_MAX_INPUT_LEN]; int16_t input_new[IVAS_MAX_INPUT_LEN]; diff --git a/lib_enc/ivas_init_enc.c b/lib_enc/ivas_init_enc.c index e1f6d72493..a69cc2d9fc 100644 --- a/lib_enc/ivas_init_enc.c +++ b/lib_enc/ivas_init_enc.c @@ -513,10 +513,10 @@ ivas_error ivas_init_encoder( { st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->hEncoderConfig->sba_order ); - if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = ivas_spar_enc_open( st_ivas, 0 ) ) != IVAS_ERR_OK ) + { + return error; + } if ( ( error = ivas_dirac_enc_open( st_ivas ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 55308a448b..802654c02c 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -61,12 +61,7 @@ static int16_t encode_lfe_to_total_energy_ratio( MASA_ENCODER_HANDLE hMasa, BSTR static void reduce_metadata_further( MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hqmetadata, const IVAS_FORMAT ivas_format ); -static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] - , - const SPHERICAL_GRID_DATA *sphGrid - , - const uint8_t useSphGrid -); +static void average_masa_metadata( MASA_METADATA_FRAME *masaMetadata, float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], const SPHERICAL_GRID_DATA *sphGrid, const uint8_t useSphGrid ); static void copy_masa_metadata_subframe( const MASA_METADATA_HANDLE hMetaFrom, const uint8_t sfFrom, MASA_METADATA_HANDLE hMetaTo, const uint8_t sfTo ); @@ -516,11 +511,9 @@ ivas_error ivas_masa_enc_config( { /* average over sub-frames */ - average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy - , + average_masa_metadata( &( hMasa->masaMetadata ), hMasa->data.energy, &( hMasa->data.Sph_Grid16 ), - ivas_total_brate == IVAS_512k ? TRUE : FALSE - ); + ivas_total_brate == IVAS_512k ? TRUE : FALSE ); } /* Inspect metadata for parameter changes that affect coding. */ @@ -1783,12 +1776,9 @@ void ivas_masa_enc_reconfigure( static void average_masa_metadata( MASA_METADATA_FRAME *hMeta, - float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS] - , - const SPHERICAL_GRID_DATA *Sph_Grid16 - , - const uint8_t useSphGrid -) + float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS], + const SPHERICAL_GRID_DATA *Sph_Grid16, + const uint8_t useSphGrid ) { int16_t i, j, k; float azi_rad, ele_rad; diff --git a/lib_enc/ivas_mct_enc.c b/lib_enc/ivas_mct_enc.c index 9bd4b4132c..20f5c9da29 100644 --- a/lib_enc/ivas_mct_enc.c +++ b/lib_enc/ivas_mct_enc.c @@ -60,8 +60,8 @@ static ivas_error ivas_mc_enc_reconfig( Encoder_Struct *st_ivas, const int16_t l static void set_mct_enc_params( MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ - const IVAS_FORMAT ivas_format, /* i : IVAS_FORMAT */ - const uint16_t b_nchan_change /* i : flag indicating different channel count */ + const IVAS_FORMAT ivas_format, /* i : IVAS_FORMAT */ + const uint16_t b_nchan_change /* i : flag indicating different channel count */ ) { int16_t n; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index d9833ee060..26f46e943f 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -60,10 +60,7 @@ static void ivas_qmetadata_reorder_2dir_bands( IVAS_QMETADATA_HANDLE hQMetaData static int16_t ivas_qmetadata_entropy_encode_df_ratio( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, int16_t *df_ratio_bits ); -static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits - , - const int16_t hrmasa_flag -); +static int16_t ivas_qmetadata_entropy_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const uint16_t diffuseness_index_max_ec_frame, const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, int16_t max_bits, const int16_t hrmasa_flag ); static int16_t ivas_qmetadata_raw_encode_dir( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t nbands, const int16_t start_band ); @@ -91,17 +88,11 @@ static ivas_error write_ec_direction( int16_t *num_bits_written, BSTR_ENC_HANDLE static int16_t write_fixed_rate_direction( BSTR_ENC_HANDLE hMetaData, IVAS_QDIRECTION *q_direction, const int16_t j_idx, const int16_t len ); -static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence - , - const int16_t hrmasa_flag -); +static int16_t ivas_qmetadata_quantize_coherence( IVAS_QMETADATA *hQMetaData, const int16_t idx_d, const int16_t all_coherence_zero, BSTR_ENC_HANDLE hMetaData, const int16_t write_flag, int16_t *indice_coherence, const int16_t hrmasa_flag ); static void dct4_transform( uint8_t *v, float *dct_v ); -static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb - , - const int16_t hrmasa_flag -); +static float quantize_DCT_0_coh( const float x, const int16_t j, const float *coherence_cb, const float delta_var, const int16_t no_cb, IVAS_QDIRECTION *q_direction, uint16_t *idx_x, int16_t *p_no_cb, const int16_t hrmasa_flag ); static int16_t encode_coherence_indexesDCT0( uint16_t *idx_dct, const int16_t len, int16_t *no_cb_vec, BSTR_ENC_HANDLE hMetaData, const int16_t indice_coherence, const int16_t nbits, const int16_t nbits1 ); @@ -415,10 +406,8 @@ ivas_error ivas_qmetadata_enc_encode( if ( all_coherence_zero == 0 ) { - bits_coherence[d] = ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 0, &indice_coherence - , - 0 - ); + bits_coherence[d] = ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 0, &indice_coherence, + 0 ); } if ( q_direction->cfg.mc_ls_setup == MC_LS_SETUP_5_1 || q_direction->cfg.mc_ls_setup == MC_LS_SETUP_7_1 ) @@ -430,10 +419,8 @@ ivas_error ivas_qmetadata_enc_encode( else { /* Quantize directions*/ - quantize_direction_frame( q_direction, azimuth_orig, elevation_orig - , - 0 - ); + quantize_direction_frame( q_direction, azimuth_orig, elevation_orig, + 0 ); } /* Signalling 2D*/ @@ -467,10 +454,8 @@ ivas_error ivas_qmetadata_enc_encode( reduce_bits = hQMetaData->is_masa_ivas_format ? ( total_bits_1dir - ( bits_diff[d] + bits_coherence[d] + bits_signaling[d] ) - 1 ) : MASA_MAX_BITS; bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, - q_direction->cfg.nbands, q_direction->cfg.start_band, bits_dir_bands[0], reduce_bits - , - 0 - ); + q_direction->cfg.nbands, q_direction->cfg.start_band, bits_dir_bands[0], reduce_bits, + 0 ); if ( bits_ec < 0 ) { @@ -524,10 +509,8 @@ ivas_error ivas_qmetadata_enc_encode( bits_dir_bands[i] = ivas_qmetadata_raw_encode_dir( NULL, q_direction, i + 1, i ); /* Write ec bits */ - bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, i + 1, i, bits_dir_bands[i], MASA_MAX_BITS - , - 0 - ); + bits_ec = ivas_qmetadata_entropy_encode_dir( hMetaData, q_direction, diffuseness_index_max_ec_frame, i + 1, i, bits_dir_bands[i], MASA_MAX_BITS, + 0 ); if ( bits_ec >= 0 ) { @@ -630,10 +613,8 @@ ivas_error ivas_qmetadata_enc_encode( { bit_pos_start = hMetaData->nb_bits_tot; hMetaData->nb_bits_tot = bit_pos_start_coh; - ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 1, &indice_coherence - , - 0 - ); + ivas_qmetadata_quantize_coherence( hQMetaData, d, all_coherence_zero, hMetaData, 1, &indice_coherence, + 0 ); hMetaData->nb_bits_tot = bit_pos_start; } @@ -1005,8 +986,8 @@ void ivas_qmetadata_enc_sid_encode( if ( ivas_format == SBA_FORMAT ) { - /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ + /* TODO: still use old sid frame size to keep bitexactness */ + metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ } else { @@ -2487,10 +2468,8 @@ static int16_t ivas_qmetadata_entropy_encode_dir( const int16_t nbands, const int16_t start_band, const int16_t direction_bits_raw, - int16_t max_bits - , - const int16_t hrmasa_flag -) + int16_t max_bits, + const int16_t hrmasa_flag ) { uint16_t diff_idx_min; int16_t i, j; @@ -5346,7 +5325,6 @@ static int16_t encode_surround_coherence_hr( } - /*-------------------------------------------------------------------* * quantize_DCT_0_coh() * @@ -5583,8 +5561,7 @@ static int16_t ivas_qmetadata_quantize_coherence( const int16_t all_coherence_zero, /* i : all coherence is zero - flag */ BSTR_ENC_HANDLE hMetaData, /* i : metadata handle */ const int16_t write_flag, /* i : flag to actually write the data or not */ - int16_t *indice_coherence - , + int16_t *indice_coherence, const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding */ ) { @@ -5613,10 +5590,8 @@ static int16_t ivas_qmetadata_quantize_coherence( if ( hQMetaData->q_direction[idx_d].cfg.nblocks == 1 ) { - nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData - , - hrmasa_flag - ); + nbits = encode_spread_coherence_1sf( hQMetaData, idx_d, hMetaData, + hrmasa_flag ); return nbits; } @@ -5685,10 +5660,8 @@ static int16_t ivas_qmetadata_quantize_coherence( if ( write_flag ) { /* quantize first DCT parameter */ - dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j] - , - hrmasa_flag - ); + dct_coh[j][0] = quantize_DCT_0_coh( dct_coh[j][0], j, coherence_cb0_masa, MASA_DELTA_AZI_DCT0, MASA_NO_CV_COH, q_direction, &idx_dct[k], &no_cb_vec[j], + hrmasa_flag ); } if ( coding_subbands < coding_subbands_0 ) diff --git a/lib_enc/ivas_qspherical_enc.c b/lib_enc/ivas_qspherical_enc.c index 00ca0f1cd6..e79c0a01a7 100644 --- a/lib_enc/ivas_qspherical_enc.c +++ b/lib_enc/ivas_qspherical_enc.c @@ -59,8 +59,7 @@ static float direction_distance_cp( float theta, float theta_hat, float theta_ha void quantize_direction_frame( IVAS_QDIRECTION *q_direction, /* i/o: quantized direction structure */ float azimuth_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], - float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES] - , + float elevation_orig[MASA_MAXIMUM_CODING_SUBBANDS][MAX_PARAM_SPATIAL_SUBFRAMES], const int16_t hrmasa_flag /* i : flag indicating high-rate MASA MD coding*/ ) { diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 4fbb34497d..2731fdaf40 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -538,12 +538,10 @@ static ivas_error ivas_spar_enc_process( else { ivas_spar_set_bitrate_config( &hSpar->hMdEnc->spar_md_cfg, table_idx, - ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND - , + ( hSpar->hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND, hSpar->hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, - hSpar->AGC_Enable - ); + hSpar->AGC_Enable ); } } /*-----------------------------------------------------------------------------------------* diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 38d9a52810..2776f65765 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -319,8 +319,7 @@ ivas_error ivas_spar_md_enc_init( table_idx = ivas_get_spar_table_idx( hEncoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); ivas_spar_set_bitrate_config( &hMdEnc->spar_md_cfg, table_idx, - ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND - , + ( hMdEnc->spar_hoa_md_flag ) ? IVAS_MAX_NUM_BANDS : SPAR_DIRAC_SPLIT_START_BAND, hMdEnc->spar_hoa_dirac2spar_md_flag, 1, hEncoderConfig->Opt_PCA_ON, #ifndef DEBUG_AGC_ENCODER_CMD_OPTION diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 94ee7bddf6..e043fb4857 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -297,10 +297,8 @@ ivas_error stereo_dft_enc_create( stereo_dft_enc_open( hStereoDft_loc, input_Fs, max_bwidth ); - stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs - , - hStereoDft_loc->hItd->hybrid_itd_max - ); + stereo_dft_hybrid_ITD_flag( hStereoDft_loc->hConfig, input_Fs, + hStereoDft_loc->hItd->hybrid_itd_max ); *hStereoDft = hStereoDft_loc; diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c index fd438bcd3f..669a4a0a12 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -121,9 +121,7 @@ void stereo_dft_hybrid_ITD_flag( { if ( hConfig != NULL ) { - if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) - || ( hybrid_itd_max == 1 ) - ) + if ( hConfig->res_cod_mode || ( hConfig->ada_wb_res_cod_mode && input_Fs == 16000 ) || ( hybrid_itd_max == 1 ) ) { hConfig->hybrid_itd_flag = 1; } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 03c38b9f49..2e4dbbabcb 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -458,7 +458,6 @@ void ivas_dirac_dec_binaural( output_frame = (int16_t) ( st_ivas->hDecoderConfig->output_Fs / FRAMES_PER_SEC ); ivas_td_decorr_process( st_ivas->hDiracDecBin->hTdDecorr, p_output, decorr_signal, output_frame ); - } if ( nchan_transport == 1 && st_ivas->nchan_transport != 2 && st_ivas->hSCE[0]->hCoreCoder[0] != NULL && st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag ) @@ -741,7 +740,6 @@ static void ivas_dirac_dec_decorrelate_slot( } - static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index 951d950211..106c433034 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -171,11 +171,11 @@ void ivas_limiter_close( *-------------------------------------------------------------------*/ void ivas_limiter_dec( - IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ float *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ - const int16_t num_channels, /* i : number of channels to be processed */ - const int16_t output_frame, /* i : number of samples per channel in the buffer */ - const int16_t BER_detect /* i : BER detect flag */ + const int16_t num_channels, /* i : number of channels to be processed */ + const int16_t output_frame, /* i : number of samples per channel in the buffer */ + const int16_t BER_detect /* i : BER detect flag */ ) { int16_t c; diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 361d017629..4d324e60f3 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -263,9 +263,9 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t Opt_Headrotation, /* i : Head rotation flag */ const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ - const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ + const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; @@ -338,10 +338,10 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ - const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ + const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ ) { int16_t i; @@ -442,8 +442,8 @@ static void TDREND_Clear_Update_flags( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ const int16_t num_src, /* i : number of sources to render */ - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ ) { TDREND_DirAtten_t *DirAtten_p; diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index a1cac4f1d3..456b406b1d 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -259,8 +259,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams( int16_t *itd, /* o: ITD value */ float *Gain, /* o: Gain value */ TDREND_SRC_t *Src_p, /* i/o: Source pointer */ - const int16_t subframe_update_flag -) + const int16_t subframe_update_flag ) { TDREND_MIX_Listener_t *Listener_p; TDREND_HRFILT_FiltSet_t *HrFiltSet_p; diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index 5fc4b7c45a..e05c8061dd 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -419,7 +419,7 @@ ivas_error ivas_orient_trk_Init( *-------------------------------------------------------------------*/ ivas_error ivas_orient_trk_SetTrackingType( - ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ + ivas_orient_trk_state_t *pOTR, /* i/o: orientation tracker handle */ const HEAD_ORIENT_TRK_T orientation_tracking /* i : orientation tracking type */ ) { diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 856914a58c..e5f0a0ac96 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1579,9 +1579,9 @@ ivas_error ivas_reverb_process( const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const AUDIO_CONFIG input_audio_config, /* i : reverb. input audio configuration */ const int16_t mix_signals, /* i : add reverb to output signal */ - float *pcm_in[], /* i : the PCM audio to apply reverb on */ - float *pcm_out[], /* o : the PCM audio with reverb applied */ - const int16_t i_ts /* i : subframe index */ + float *pcm_in[], /* i : the PCM audio to apply reverb on */ + float *pcm_out[], /* o : the PCM audio with reverb applied */ + const int16_t i_ts /* i : subframe index */ ) { float tmp0[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -1617,9 +1617,9 @@ ivas_error ivas_reverb_process( *------------------------------------------------------------------------*/ void ivas_binaural_reverb_processSubframe( - REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ - const int16_t numInChannels, /* i : num inputs to be processed */ - const int16_t numSlots, /* i : number of slots to be processed */ + REVERB_STRUCT_HANDLE hReverb, /* i/o: binaural reverb handle */ + const int16_t numInChannels, /* i : num inputs to be processed */ + const int16_t numSlots, /* i : number of slots to be processed */ float inReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data real, Comment: This change swaps two first dimensions as first dimension is not constant. */ float inImag[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* i : input CLDFB data imag */ float outReal[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], /* o : output CLDFB data real */ @@ -1750,7 +1750,7 @@ void ivas_binaural_reverb_processSubframe( { for ( sample = 0; sample < numSlots; sample++ ) { -/* Audio was in the temporally inverted order for convolution, re-invert audio to output */ + /* Audio was in the temporally inverted order for convolution, re-invert audio to output */ invertSampleIndex = numSlots - sample - 1; for ( bin = 0; bin < hReverb->numBins; bin++ ) diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 5f4a54a3c5..2ae0347fd3 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -250,10 +250,10 @@ void rotateAziEle( void rotateFrame_shd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const int16_t subframe_idx /* i : subframe index */ + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, l, n, m; @@ -353,11 +353,11 @@ void rotateFrame_shd( void rotateFrame_sd( HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ - float *output[], /* i/o: unrotated SD signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const int16_t subframe_idx /* i : subframe index */ + float *output[], /* i/o: unrotated SD signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, j; @@ -491,8 +491,8 @@ void rotateFrame_shd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ float Rmat[3][3], /* i : real-space rotation matrix */ const int16_t nInChannels, /* i : number of channels */ - const int16_t numTimeSlots, /* i : number of time slots to process */ - const int16_t shd_rot_max_order /* i : split-order rotation method */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + const int16_t shd_rot_max_order /* i : split-order rotation method */ ) { int16_t n = 0; @@ -586,8 +586,8 @@ void rotateFrame_sd_cldfb( float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const int16_t numTimeSlots, /* i : number of time slots to process */ - const int16_t nb_band /* i : number of CLDFB bands to process */ + const int16_t numTimeSlots, /* i : number of time slots to process */ + const int16_t nb_band /* i : number of CLDFB bands to process */ ) { int16_t iBlock, iBand, m, n; diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index e879f923a3..b4a0950c5f 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -2212,7 +2212,7 @@ static ivas_error initMasaDummyDecForMcOut( decDummy->sba_analysis_order = 1; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); ivas_output_init( &( decDummy->hIntSetup ), output_config ); @@ -2294,7 +2294,7 @@ static ivas_error initMasaDummyDecForSbaOut( decDummy->hDecoderConfig->output_config = output_config; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ decDummy->sba_analysis_order = 1; @@ -2367,7 +2367,7 @@ static ivas_error initMasaDummyDecForBinauralOut( decDummy->sba_analysis_order = 1; decDummy->hDecoderConfig->ivas_total_brate = IVAS_512k; /* Todo Nokia: This is preventing initialization of 2TC as 1TC, should be fixed properly in ivas_dirac_dec_config() */ - decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ + decDummy->mc_mode = MC_MODE_NONE; /* Todo Nokia: This should be also refactored in such way that it is not checked if not in MC mode */ ivas_output_init( &( decDummy->hOutSetup ), output_config ); if ( output_config == AUDIO_CONFIG_BINAURAL ) @@ -3890,7 +3890,7 @@ ivas_error IVAS_REND_SetHeadRotation( *-------------------------------------------------------------------*/ ivas_error IVAS_REND_SetOrientationTrackingMode( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ + IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const HEAD_ORIENT_TRK_T orientation_tracking /* i : Head orientation tracking type */ ) { diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c index 09cdf1b2d0..5fda0fcc3c 100644 --- a/lib_util/masa_file_reader.c +++ b/lib_util/masa_file_reader.c @@ -96,8 +96,6 @@ IVAS_MASA_METADATA_HANDLE MasaFileReader_getMetadataHandle( } - - /*------------------------------------------------------------------------- * MasaFileReader_readNextFrame() * -- GitLab From 42b3d834a3200e8167cdd18ed2cf48f3a22ac1cf Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Tue, 6 Jun 2023 22:43:21 +0200 Subject: [PATCH 277/381] move VARIABLE_SPEED_DECODING again to normal section - otherwise the instrumemnted builds fail --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1098f65a05..3ff30c7505 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -127,7 +127,6 @@ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ //#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ #define DEBUG_JBM_CMD_OPTION /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ -#define VARIABLE_SPEED_DECODING /* variable speed decoding employing the JBM functioniality */ #endif /* #################### End DEBUGGING switches ############################ */ @@ -146,6 +145,7 @@ #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ #define UPDATE_SBA_FILTER /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ +#define VARIABLE_SPEED_DECODING /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -- GitLab From 544d452ac2cee675f19ec0e7a9eb88681637698b Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 07:33:45 +0200 Subject: [PATCH 278/381] clang-format --- lib_com/ivas_dirac_com.c | 116 +++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 6ec7965a3e..90ed71875a 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -180,21 +180,21 @@ ivas_error ivas_dirac_config( } - hConfig->dec_param_estim = TRUE; - if ( hConfig->dec_param_estim == TRUE ) - { - hConfig->enc_param_start_band = spar_dirac_split_band; - } + hConfig->dec_param_estim = TRUE; + if ( hConfig->dec_param_estim == TRUE ) + { + hConfig->enc_param_start_band = spar_dirac_split_band; + } - if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) - { - hConfig->dec_param_estim = FALSE; - hConfig->enc_param_start_band = 0; + if ( ivas_get_hodirac_flag( ivas_total_brate, sba_order ) ) + { + hConfig->dec_param_estim = FALSE; + hConfig->enc_param_start_band = 0; - set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); - hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; - } + set_c( (int8_t *) hQMetaData->twoDirBands, (int8_t) 1, hQMetaData->q_direction[0].cfg.nbands ); + hQMetaData->numTwoDirBands = (uint8_t) hQMetaData->q_direction[0].cfg.nbands; } + } if ( ivas_format == SBA_FORMAT ) { @@ -390,10 +390,10 @@ void ivas_get_dirac_sba_max_md_bits( ivas_error ivas_dirac_sba_config( IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle */ - int16_t *element_mode, /* i/o: element mode of the core coder */ - int32_t sba_total_brate, /* i : SBA total bitrate */ - const int16_t sba_order, /* i : Ambisonic (SBA) order */ - const int16_t nbands /* i : number of frequency bands */ + int16_t *element_mode, /* i/o: element mode of the core coder */ + int32_t sba_total_brate, /* i : SBA total bitrate */ + const int16_t sba_order, /* i : Ambisonic (SBA) order */ + const int16_t nbands /* i : number of frequency bands */ ) { int16_t nbands_coded; @@ -404,60 +404,60 @@ ivas_error ivas_dirac_sba_config( hQMetaData->is_masa_ivas_format = 0; hodirac_flag = ivas_get_hodirac_flag( sba_total_brate, sba_order ); - /* map the bitrate for SID frame */ - if ( sba_total_brate == IVAS_SID_5k2 ) - { - if ( *element_mode == IVAS_SCE ) - { - sba_total_brate = ACELP_24k40; - } - else - { - sba_total_brate = ACELP_48k; - } - } - - ivas_set_qmetadata_maxbit_req( hQMetaData, SBA_FORMAT ); - - if ( sba_total_brate <= IVAS_16k4 ) + /* map the bitrate for SID frame */ + if ( sba_total_brate == IVAS_SID_5k2 ) + { + if ( *element_mode == IVAS_SCE ) { - hQMetaData->useLowerRes = 1; + sba_total_brate = ACELP_24k40; } else { - hQMetaData->useLowerRes = 0; + sba_total_brate = ACELP_48k; } + } + + ivas_set_qmetadata_maxbit_req( hQMetaData, SBA_FORMAT ); + + if ( sba_total_brate <= IVAS_16k4 ) + { + hQMetaData->useLowerRes = 1; + } + else + { + hQMetaData->useLowerRes = 0; + } - nbands_coded = nbands; - if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + nbands_coded = nbands; + if ( sba_total_brate <= (int32_t) ( (float) IVAS_192k / (float) SPAR_DIRAC_SPLIT_START_BAND ) ) + { + hQMetaData->useLowerBandRes = 1; + nbands_coded = nbands / 2 + nbands % 2; + } + else + { + hQMetaData->useLowerBandRes = 0; + if ( hodirac_flag == 0 ) { - hQMetaData->useLowerBandRes = 1; - nbands_coded = nbands / 2 + nbands % 2; + nbands_coded = nbands - 1; /* always combine the last two bands */ } - else + } + + { + int16_t no_dirs = 1; + if ( hodirac_flag ) { - hQMetaData->useLowerBandRes = 0; - if ( hodirac_flag == 0 ) - { - nbands_coded = nbands - 1; /* always combine the last two bands */ - } + no_dirs = 2; } + if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) { - int16_t no_dirs = 1; - if ( hodirac_flag ) - { - no_dirs = 2; - } - - if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, nbands_coded, no_dirs, 0 ) ) != IVAS_ERR_OK ) - { - return error; - } - } - ivas_get_dirac_sba_max_md_bits( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands ); + return error; + } + } + ivas_get_dirac_sba_max_md_bits( sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands ); - return error; + return error; } @@ -693,7 +693,7 @@ void deindex_spherical_component( *-----------------------------------------------------------------*/ void calculate_hodirac_sector_parameters( - DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ + DIRAC_ENC_HANDLE hDirAC, /* i : DirAC handle */ float RealBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector (L+1)^2 x N_bins, real part */ float ImagBuffer[DIRAC_MAX_ANA_CHANS][DIRAC_NO_FB_BANDS_MAX], /* i : signal vector, imaginary part */ const float beta, /* i : forgetting factor for average filtering */ -- GitLab From 03170f2ee6b60ca890a67752ea20cc03c60bbe24 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 07:40:12 +0200 Subject: [PATCH 279/381] resolve comments --- lib_dec/ivas_post_proc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_dec/ivas_post_proc.c b/lib_dec/ivas_post_proc.c index da00426116..0321a646f9 100644 --- a/lib_dec/ivas_post_proc.c +++ b/lib_dec/ivas_post_proc.c @@ -146,7 +146,6 @@ void ivas_post_proc( { /*Use channel 0 side info.*/ tcx_ltp_post( sts[0], hTcxLtpDec, TCX_20_CORE, output_frame, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ), output[k], hCPE->output_mem[k] ); - /* IVAS_fmToDo: harmonize buffers hCPE->output_mem and hTcxDec->FBTCXdelayBuf ?? */ } } #endif -- GitLab From e76ad68571d16b21eeee893744a6eb0cc14bb68d Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 07:44:12 +0200 Subject: [PATCH 280/381] add "ToDo" to existing comments --- lib_enc/ivas_spar_encoder.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_spar_encoder.c b/lib_enc/ivas_spar_encoder.c index 2731fdaf40..8f87e3fb93 100644 --- a/lib_enc/ivas_spar_encoder.c +++ b/lib_enc/ivas_spar_encoder.c @@ -407,12 +407,12 @@ static ivas_error ivas_spar_enc_process( float wyzx_del_buf[FOA_CHANNELS][IVAS_FB_1MS_48K_SAMP]; int16_t nchan_fb_in; - /*Commented for now*/ + /* ToDo: Commented for now*/ /*int16_t start_nb_bits; int16_t total_md_bits, total_sba_bits;*/ push_wmops( "ivas_spar_enc_process" ); - /*Commented for now*/ + /* ToDo: Commented for now*/ // start_nb_bits = hMetaData->nb_bits_tot; /*-----------------------------------------------------------------------------------------* @@ -902,7 +902,7 @@ static ivas_error ivas_spar_enc_process( pop_wmops(); - /*Commented for now*/ + /* ToDo: Commented for now */ /*total_md_bits = hMetaData->nb_bits_tot - start_nb_bits; total_sba_bits = ivas_sba_get_max_md_bits( st_ivas ); assert( total_md_bits <= total_sba_bits );*/ -- GitLab From b63c4b6a42d68032cb24ea8256c1530afcc34e59 Mon Sep 17 00:00:00 2001 From: Stefan Bayer Date: Wed, 7 Jun 2023 07:52:05 +0200 Subject: [PATCH 281/381] fix for #122, reduce MC worst case decoder complexity by reducing the number of parameter bands in ParamMC, not BE, under define FIX_122_MC_DECODER_COMPLEXITY --- lib_com/ivas_mc_param_com.c | 4 ++++ lib_com/options.h | 1 + 2 files changed, 5 insertions(+) diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index acf7a8eae2..a66cdba916 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -406,7 +406,11 @@ static int16_t ivas_param_mc_get_num_param_bands( switch ( ivas_total_brate ) { case IVAS_128k: +#ifdef FIX_122_MC_DECODER_COMPLEXITY + num_parameter_bands = 14; +#else num_parameter_bands = 20; +#endif break; case IVAS_160k: num_parameter_bands = 20; diff --git a/lib_com/options.h b/lib_com/options.h index 3ff30c7505..8ef5e79b7c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,6 +166,7 @@ #define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ #define FIX_506 /* FhG: Compiler warnings */ #define FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH /* Nokia: Issue 511, significant optimization of parametric binauralizer gain fetching. */ +#define FIX_122_MC_DECODER_COMPLEXITY /* FhG: Issue 122, significant decrease of worst case MC decoder complexity */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ -- GitLab From 222f8232462860f1d5e90431406acc61e23973db Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 08:33:17 +0200 Subject: [PATCH 282/381] clang-format --- lib_dec/ivas_dirac_output_synthesis_dec.c | 184 +++++++++++----------- lib_enc/ivas_enc_cov_handler.c | 4 +- 2 files changed, 94 insertions(+), 94 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 103ffa2e8f..d45086edb7 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -622,116 +622,116 @@ void ivas_dirac_dec_output_synthesis_process_slot( } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { + { - /* compute direct responses */ - ivas_dirac_dec_compute_directional_responses( hDirAC, - hVBAPdata, - NULL, - azimuth, - elevation, - md_idx, - NULL, - sh_rot_max_order, - p_Rmat, - hodirac_flag ); + /* compute direct responses */ + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + NULL, + azimuth, + elevation, + md_idx, + NULL, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); - /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) - { - int16_t k; - if ( ch_idx != 0 ) + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) { - float a, b, c; - - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) + int16_t k; + if ( ch_idx != 0 ) { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + float a, b, c; + + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } } - for ( ; k < num_freq_bands; k++ ) + else { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } } } - else + + /*Directional gain (panning)*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); - } + v_mult( h_dirac_output_synthesis_state->direct_power_factor, + &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], + aux_buf, + num_freq_bands ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); } - } - /*Directional gain (panning)*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) - { - v_mult( h_dirac_output_synthesis_state->direct_power_factor, - &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], - aux_buf, - num_freq_bands ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - num_freq_bands ); - } + /*Diffuse gain*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + aux_buf, + num_freq_bands_diff ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } - /*Diffuse gain*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + return; + } + else { - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - hDirAC->diffuse_response_function[ch_idx], - aux_buf, - num_freq_bands_diff ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - num_freq_bands_diff ); + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); } - - return; - } - else - { - /* compute reference and diffuse power factor for this frame */ - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); } - } diff_start_band = 0; if ( h_dirac_output_synthesis_params->use_onset_filters ) diff --git a/lib_enc/ivas_enc_cov_handler.c b/lib_enc/ivas_enc_cov_handler.c index 3af8a35e31..14920e4ac1 100644 --- a/lib_enc/ivas_enc_cov_handler.c +++ b/lib_enc/ivas_enc_cov_handler.c @@ -67,8 +67,8 @@ ivas_error ivas_spar_covar_enc_open( ivas_filterbank_t *pFb, /* i/o: FB handle */ const int32_t input_Fs, /* i : input sampling rate */ const int16_t nchan_inp, /* i : number of input channels */ - COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + COV_SMOOTHING_TYPE smooth_mode, /* i : Smooth covariance for SPAR or MC */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ) { ivas_enc_cov_handler_state_t *hCovState; -- GitLab From 4ddc0d05b80293a3ec94bc0ed0de3a83ca58cfcf Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Wed, 7 Jun 2023 10:21:20 +0300 Subject: [PATCH 283/381] Fix merge conflicts --- lib_rend/ivas_rotation.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 6ef61d7b43..8128afb159 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -372,7 +372,6 @@ void rotateFrame_sd( #else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ #endif - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ float *output[], /* i/o: unrotated SD signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ -- GitLab From c4b015586987a572577312d405aab0d9660c378b Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Wed, 7 Jun 2023 10:26:18 +0300 Subject: [PATCH 284/381] Run clang format --- lib_dec/ivas_binRenderer_internal.c | 4 ++-- lib_dec/ivas_dirac_dec.c | 8 +++---- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/lib_dec.c | 14 ++++++------ lib_rend/ivas_dirac_dec_binaural_functions.c | 24 ++++++++++++++------ lib_rend/ivas_objectRenderer.c | 14 ++++++------ lib_rend/ivas_rotation.c | 18 +++++++-------- 7 files changed, 47 insertions(+), 37 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 4a821f2463..074a7c3cdb 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1174,8 +1174,8 @@ void ivas_binaural_cldfb_sf( *-------------------------------------------------------------------------*/ void ivas_binRenderer( - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ #ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ int16_t subframe_idx, /* i : subframe index */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index ef7f1d08b6..5877dc4738 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2635,9 +2635,9 @@ void ivas_dirac_dec_render_sf( #ifdef EXTERNAL_ORIENTATIONS p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[subframe_idx][0][0]; #else - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); + QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); - p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; + p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; #endif if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) @@ -2716,7 +2716,7 @@ void ivas_dirac_dec_render_sf( #ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) #else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) #endif { ivas_dirac_dec_compute_directional_responses( hDirAC, @@ -2823,7 +2823,7 @@ void ivas_dirac_dec_render_sf( #ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) #else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) + if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) #endif { protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 8b4423e43a..e63f6c3e43 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1188,7 +1188,7 @@ typedef struct decoder_config_structure float non_diegetic_pan_gain; /* non diegetic panning gain*/ int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ #ifdef EXTERNAL_ORIENTATIONS - int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ + int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ #endif /* temp. development parameters */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0d395be284..e01c59b779 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -402,14 +402,14 @@ static IVAS_DEC_BS_FORMAT mapIvasFormat( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_Configure( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const uint32_t sampleRate, /* i : output sampling frequency */ - const IVAS_DEC_AUDIO_CONFIG outputFormat, /* i : output format */ - const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ - const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ - const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const uint32_t sampleRate, /* i : output sampling frequency */ + const IVAS_DEC_AUDIO_CONFIG outputFormat, /* i : output format */ + const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ + const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ + const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ #ifdef EXTERNAL_ORIENTATIONS - const int16_t enableExternalOrientation, /* i : enable external orientations */ + const int16_t enableExternalOrientation, /* i : enable external orientations */ #endif const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index c0fbeb65e3..2eefb0e1d3 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -85,7 +85,9 @@ static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, #ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, #endif - float *output_f[], const int16_t nchan_transport, const int16_t subframe ); + float *output_f[], + const int16_t nchan_transport, + const int16_t subframe ); static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); @@ -103,19 +105,27 @@ static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, flo static void adaptTransportSignalsHeadtracked( #ifdef EXTERNAL_ORIENTATIONS - COMBINED_ORIENTATION_HANDLE hHeadTrackData, + COMBINED_ORIENTATION_HANDLE hHeadTrackData, #else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, + HEAD_TRACK_DATA_HANDLE hHeadTrackData, #endif - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + const int16_t nSlots, + float Rmat[3][3] ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( #ifdef EXTERNAL_ORIENTATIONS - COMBINED_ORIENTATION_HANDLE hHeadTrackData, + COMBINED_ORIENTATION_HANDLE hHeadTrackData, #else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, + HEAD_TRACK_DATA_HANDLE hHeadTrackData, #endif - float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, const int16_t nSlots, float Rmat[3][3] ); + float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], + const int16_t nBins, + const int16_t nSlots, + float Rmat[3][3] ); static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 516d1af3e8..c0eeb1ef74 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -261,15 +261,15 @@ ivas_error ivas_td_binaural_renderer_unwrap( const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ #ifdef EXTERNAL_ORIENTATIONS - const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ + const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ #else - const int16_t Opt_Headrotation, /* i : Head rotation flag */ + const int16_t Opt_Headrotation, /* i : Head rotation flag */ #endif - const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ - const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ + const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 8128afb159..7ab33cec89 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -254,10 +254,10 @@ void rotateFrame_shd( #else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ #endif - float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const int16_t subframe_idx /* i : subframe index */ + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, l, n, m; @@ -372,11 +372,11 @@ void rotateFrame_sd( #else HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ #endif - float *output[], /* i/o: unrotated SD signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const int16_t subframe_idx /* i : subframe index */ + float *output[], /* i/o: unrotated SD signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, j; -- GitLab From 32d77eb9cc0eca2df93ee5d7f37e57bb666d3e50 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 09:34:03 +0200 Subject: [PATCH 285/381] resolve todo wrt. IVAS_ERR_INVALID_CICP_INDEX name --- lib_com/ivas_error.h | 4 ++-- lib_enc/lib_enc.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index 0fae8ff215..8e7f252dd6 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -56,7 +56,7 @@ typedef enum IVAS_ERR_INVALID_SAMPLING_RATE, IVAS_ERR_NOT_CONFIGURED, IVAS_ERR_INVALID_STEREO_MODE, - IVAS_ERR_INVALID_CICP_INDEX, /* ToDo: rename, CICP not used in IVAS anymore */ + IVAS_ERR_INVALID_MC_LAYOUT, IVAS_ERR_INVALID_BITRATE, IVAS_ERR_INVALID_MASA_CONFIG, IVAS_ERR_TOO_MANY_INPUTS, @@ -190,7 +190,7 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Handle has not been configured"; case IVAS_ERR_INVALID_STEREO_MODE: return "Invalid stereo mode"; - case IVAS_ERR_INVALID_CICP_INDEX: + case IVAS_ERR_INVALID_MC_LAYOUT: return "Invalid speaker layout"; case IVAS_ERR_INVALID_BITRATE: return "Invalid bitrate"; diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 28a733d3a3..472497bea5 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -665,7 +665,7 @@ ivas_error IVAS_ENC_ConfigureForMultichannel( hEncoderConfig->mc_input_setup = MC_LS_SETUP_7_1_4; break; default: - return IVAS_ERR_INVALID_CICP_INDEX; + return IVAS_ERR_INVALID_MC_LAYOUT; break; } -- GitLab From c5f326fe196dc6a6cbb64fec41cab0132ee6a9e8 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 10:16:25 +0200 Subject: [PATCH 286/381] clang-format --- lib_dec/ivas_dirac_decorr_dec.c | 2 +- lib_dec/ivas_tcx_core_dec.c | 1 - lib_dec/updt_dec.c | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib_dec/ivas_dirac_decorr_dec.c b/lib_dec/ivas_dirac_decorr_dec.c index 5e156a38b2..3687ed53b1 100644 --- a/lib_dec/ivas_dirac_decorr_dec.c +++ b/lib_dec/ivas_dirac_decorr_dec.c @@ -156,7 +156,7 @@ ivas_error ivas_dirac_dec_decorr_open( freq_domain_decorr_ap_params->max_frequency = ( DIRAC_MAX_DECORR_CLDFB_BANDS * 24000 ) / CLDFB_NO_CHANNELS_MAX; } - freq_domain_decorr_ap_params->use_ducker = 1; + freq_domain_decorr_ap_params->use_ducker = 1; assert( ( freq_domain_decorr_ap_params->max_frequency >= 0 ) && ( freq_domain_decorr_ap_params->max_frequency <= output_Fs / 2 ) && "Error: max_frequency invalid!" ); diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index 61fb5df443..c250b0b7b5 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -264,7 +264,6 @@ void stereo_tcx_core_dec( st->second_last_core = st->last_core; dec_prm_tcx( st, param, param_lpc, &total_nbbits, last_element_mode, &bitsRead ); - } else { diff --git a/lib_dec/updt_dec.c b/lib_dec/updt_dec.c index b4bea68b3f..7ff9c9ee05 100644 --- a/lib_dec/updt_dec.c +++ b/lib_dec/updt_dec.c @@ -550,7 +550,7 @@ void updt_dec_common( st->prev_use_partial_copy = st->use_partial_copy; st->prev_tilt_code_dec = 0.0f; - for ( i = 0; i < NB_SUBFR; i++ ) + for ( i = 0; i < NB_SUBFR; i++ ) { st->prev_tilt_code_dec += st->tilt_code_dec[i] * 0.25f; } -- GitLab From 7ba687392f08dde14f17a1758a27c8b2a7ef99cf Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 7 Jun 2023 11:29:24 +0300 Subject: [PATCH 287/381] Add MASA output configuration limitation to IVAS_REND_GetSamples as well. --- apps/renderer.c | 1 + lib_rend/lib_rend.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/apps/renderer.c b/apps/renderer.c index b9d1ad4709..1844cb9249 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -731,6 +731,7 @@ int main( } #ifdef MASA_PREREND + /* Check that there is allowed configuration for MASA format output */ if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { if ( args.inConfig.numMasaBuses == 0 ) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 5a6d558602..71c28fe75b 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -6621,6 +6621,39 @@ ivas_error IVAS_REND_GetSamples( return IVAS_ERR_INVALID_BUFFER_SIZE; } +#ifdef MASA_PREREND + /* Check that there is allowed configuration for MASA format output */ + if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) + { + int16_t i; + int16_t numMasaInputs = 0; + int16_t numOtherInputs = 0; + + for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; i++ ) + { + numMasaInputs += hIvasRend->inputsMasa[i].base.inConfig == IVAS_REND_AUDIO_CONFIG_UNKNOWN ? 0 : 1; + } + + for ( i = 0; i < RENDERER_MAX_MC_INPUTS; i++ ) + { + numOtherInputs += hIvasRend->inputsMc[i].base.inConfig == IVAS_REND_AUDIO_CONFIG_UNKNOWN ? 0 : 1; + } + + for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; i++ ) + { + numOtherInputs += hIvasRend->inputsSba[i].base.inConfig == IVAS_REND_AUDIO_CONFIG_UNKNOWN ? 0 : 1; + } + + /* For ISM, we check only first as all ISMs are handled together via OMASA when merging to MASA. */ + numOtherInputs += hIvasRend->inputsIsm[0].base.inConfig == IVAS_REND_AUDIO_CONFIG_UNKNOWN ? 0 : 1; + + if ( numMasaInputs == 0 || numOtherInputs == 0 ) + { + return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; + } + } +#endif + if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) { return error; -- GitLab From 105019c1bcf65f65f41fbf01f98dac33ed8f6586 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 7 Jun 2023 10:35:30 +0200 Subject: [PATCH 288/381] remove obsolete TODO comments in front vad code --- lib_enc/ivas_front_vad.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index 9593f6682f..9f9acdbaf2 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -176,7 +176,6 @@ ivas_error front_vad( /* Preemphasis */ preemph( hFrontVad->buffer_12k8 + L_FFT / 2, PREEMPH_FAC, L_FRAME, &hFrontVad->mem_preemph ); - /* TODO: this may need adaption if ever using this for MDCT-Stereo (see conditional inside of analy_sp) */ analy_sp( IVAS_CPE_TD, hCPE, sts[0]->input_Fs, hFrontVad->buffer_12k8 + L_FFT / 2 - 3 * ( L_SUBFR / 2 ), Bin_E, Bin_E_old, fr_bands[n], lf_E[n], &Etot_LR[n], sts[0]->min_band, sts[0]->max_band, band_energies, PS, fft_buffLR ); /* add up energies for later calculating average of channel energies */ @@ -210,8 +209,6 @@ ivas_error front_vad( vad_flag_dtx[0] = vad_flag_dtx[0] || vad_flag_dtx[1]; } - /* TODO: if using this for MDCT-Stereo, this may need to be done on both channels? or maybe some more logic is needed */ - /* TODO: do we really need this for VAD only ? */ if ( sts[0]->hFdCngEnc != NULL ) { resetFdCngEnc( sts[0] ); -- GitLab From 23b648c496191e88bbd32d89b86ca09a40cfd6e6 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 11:21:02 +0200 Subject: [PATCH 289/381] introduce 'null_metadata_flag' and rename 'lowrate_metadata_flag'; 1 bit is added to ISM_NO_META mode --- lib_com/ivas_cnst.h | 4 ++- lib_com/ivas_ism_com.c | 15 +++++++-- lib_com/ivas_prot.h | 4 ++- lib_com/options.h | 2 +- lib_dec/ivas_ism_dec.c | 4 --- lib_dec/ivas_ism_metadata_dec.c | 39 ++++++++++++++++-------- lib_enc/ivas_ism_enc.c | 2 +- lib_enc/ivas_ism_metadata_enc.c | 54 ++++++++++++++++++++++----------- 8 files changed, 83 insertions(+), 41 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 1bebf9f460..5f22991fbf 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -328,6 +328,7 @@ typedef enum #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ #ifdef FIX_532_ISM_MD_INACTIVE +#define ISM_METADATA_MD_FLAG_BITS 1 /* flag to distinguish between NULL metadata and low-rate ISM_NO_META class */ #define ISM_METADATA_INACTIVE_FLAG_BITS 1 /* flag to signal whether MD are sent in low-rate inactive frame */ #else #define ISM_METADATA_VAD_FLAG_BITS 1 @@ -405,7 +406,8 @@ enum IND_ISM_EXTENDED_NDP_FLAG, IND_ISM_METADATA_FLAG, #ifdef FIX_532_ISM_MD_INACTIVE - IND_ISM_MD_INACTIVE_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, + IND_ISM_MD_NULL_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, + IND_ISM_MD_INACTIVE_FLAG = IND_ISM_MD_NULL_FLAG + MAX_NUM_OBJECTS, IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_MD_INACTIVE_FLAG + MAX_NUM_OBJECTS, #else IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS, diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 40622f9d4d..42118da48b 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -101,7 +101,9 @@ ivas_error ivas_ism_config( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ -#ifndef FIX_532_ISM_MD_INACTIVE +#ifdef FIX_532_ISM_MD_INACTIVE + const int16_t null_metadata_flag[MAX_NUM_OBJECTS], /* i : NULL MD flag */ +#else const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ #endif const int16_t ism_imp[], /* i : ISM importance flags */ @@ -167,7 +169,16 @@ ivas_error ivas_ism_config( #ifdef FIX_532_ISM_MD_INACTIVE if ( ism_imp[ch] == ISM_NO_META ) { - nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + + if ( null_metadata_flag[ch] ) + { + nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; + } + else + { + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + } } #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 684a77c9fa..9a3d5129a1 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -873,7 +873,9 @@ ivas_error ivas_ism_config( const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ -#ifndef FIX_532_ISM_MD_INACTIVE +#ifdef FIX_532_ISM_MD_INACTIVE + const int16_t null_metadata_flag[MAX_NUM_OBJECTS], /* i : NULL MD flag */ +#else const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ #endif const int16_t ism_imp[], /* i : ISM importance flags */ diff --git a/lib_com/options.h b/lib_com/options.h index 1d82476cc5..f144b0f5ac 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,7 +170,7 @@ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ -#define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: impprove MD coding in ISM inactive frames */ +#define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: improve MD coding in ISM inactive frames */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 3fc94db397..5ad0ce08c7 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -77,11 +77,7 @@ static ivas_error ivas_ism_bitrate_switching( ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ism_mode = ism_mode; -#ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 570fa95631..2bfe7894d7 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -169,7 +169,8 @@ ivas_error ivas_ism_metadata_dec( ISM_METADATA_HANDLE hIsmMetaData; int16_t nchan_transport_prev, ism_metadata_flag_global; #ifdef FIX_532_ISM_MD_INACTIVE - int16_t inactive_metadata_flag[MAX_NUM_OBJECTS]; + int16_t null_metadata_flag[MAX_NUM_OBJECTS]; + int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS]; #else int16_t localVAD[MAX_NUM_OBJECTS]; #endif @@ -192,7 +193,8 @@ ivas_error ivas_ism_metadata_dec( ism_extmeta_bitstream = 0; non_diegetic_flag_global = 0; #ifdef FIX_532_ISM_MD_INACTIVE - set_s( inactive_metadata_flag, 0, nchan_ism ); + set_s( null_metadata_flag, 0, nchan_ism ); + set_s( lowrate_metadata_flag, 0, nchan_ism ); #endif /* reverse the bitstream for easier reading of indices */ @@ -279,14 +281,29 @@ ivas_error ivas_ism_metadata_dec( } #ifdef FIX_532_ISM_MD_INACTIVE - /* signal presence of MD in low-rate ISM_NO_META frame */ - for ( ch = 0; ch < *nchan_transport; ch++ ) + /* read ISM_NO_META class signalling */ + if ( ism_mode == ISM_MODE_DISC ) { - if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) + for ( ch = 0; ch < *nchan_transport; ch++ ) { - inactive_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + if ( ism_imp[ch] == ISM_NO_META ) + { + /* low-rate ISM_NO_META frame */ + null_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); - ism_metadata_flag_global |= inactive_metadata_flag[ch]; + if ( null_metadata_flag[ch] ) + { + /* read the true ISM class */ + ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); + } + else + { + /* read presence of MD in low-rate ISM_NO_META frame flag */ + lowrate_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + + ism_metadata_flag_global |= lowrate_metadata_flag[ch]; + } + } } } #else @@ -330,7 +347,7 @@ ivas_error ivas_ism_metadata_dec( flag_abs_radius = 0; #ifdef FIX_532_ISM_MD_INACTIVE - if ( hIsmMeta[ch]->ism_metadata_flag || inactive_metadata_flag[ch] ) + if ( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] ) #else if ( hIsmMeta[ch]->ism_metadata_flag ) #endif @@ -502,7 +519,7 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #endif @@ -614,11 +631,7 @@ ivas_error ivas_ism_metadata_dec_create( ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } -#ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 1c8a9f975f..1175499b82 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -412,7 +412,7 @@ ivas_error ivas_ism_enc_config( st_ivas->nSCE = st_ivas->nchan_transport; st_ivas->nCPE = 0; -#ifdef FIX_532_ISM_MD_INACTIVE +#ifdef FIX_532_ISM_MD_INACTIVEaa if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 3cd19ddafe..c1c48a1ec3 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -118,7 +118,7 @@ static void rate_ism_importance( ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ SCE_ENC_HANDLE hSCE[], /* i/o: SCE encoder handles */ #ifdef FIX_532_ISM_MD_INACTIVE - const int16_t inactive_metadata_flag[MAX_NUM_OBJECTS], /* i : flag indicating MD in ISM_NO_META frame for FEC */ + const int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS], /* i : low-rate MD flag */ #endif int16_t ism_imp[] /* o : ISM importance flags */ ) @@ -142,7 +142,7 @@ static void rate_ism_importance( } #ifdef FIX_532_ISM_MD_INACTIVE - if ( ( hIsmMeta[ch]->ism_metadata_flag == 0 || inactive_metadata_flag[ch] == 1 ) && hSCE[ch]->hCoreCoder[0]->localVAD == 0 ) + if ( ( hIsmMeta[ch]->ism_metadata_flag == 0 || lowrate_metadata_flag[ch] == 1 ) && hSCE[ch]->hCoreCoder[0]->localVAD == 0 ) #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) #endif @@ -202,7 +202,8 @@ ivas_error ivas_ism_metadata_enc( int16_t non_diegetic_flag_global; int16_t ism_imp[MAX_NUM_OBJECTS]; #ifdef FIX_532_ISM_MD_INACTIVE - int16_t inactive_metadata_flag[MAX_NUM_OBJECTS]; + int16_t null_metadata_flag[MAX_NUM_OBJECTS]; + int16_t lowrate_metadata_flag[MAX_NUM_OBJECTS]; #endif int16_t nbands, nblocks; ivas_error error; @@ -221,7 +222,8 @@ ivas_error ivas_ism_metadata_enc( set_s( flag_abs_pitch, 0, nchan_ism ); set_s( flag_abs_radius, 0, nchan_ism ); #ifdef FIX_532_ISM_MD_INACTIVE - set_s( inactive_metadata_flag, 0, nchan_ism ); + set_s( null_metadata_flag, 0, nchan_ism ); + set_s( lowrate_metadata_flag, 0, nchan_ism ); #endif /*----------------------------------------------------------------* @@ -236,6 +238,10 @@ ivas_error ivas_ism_metadata_enc( } else if ( ism_mode == ISM_MODE_DISC ) { +#ifdef FIX_532_ISM_MD_INACTIVE + null_metadata_flag[ch] = !hIsmMeta[ch]->ism_metadata_flag; +#endif + if ( hIsmMeta[ch]->ism_metadata_flag == 1 ) { /* In case of low level noise for low bitrate inactive frames, do not sent metadata */ @@ -248,7 +254,7 @@ ivas_error ivas_ism_metadata_enc( ( fabsf( hIsmMeta[ch]->elevation - hIsmMeta[ch]->last_true_elevation ) > ISM_MD_FEC_DIFF ) || ( fabsf( hIsmMeta[ch]->radius - hIsmMeta[ch]->last_true_radius ) > ISM_MD_RAD_FEC_DIFF ) ) { #ifdef FIX_532_ISM_MD_INACTIVE - inactive_metadata_flag[ch] = 1; + lowrate_metadata_flag[ch] = 1; #else hIsmMeta[ch]->ism_metadata_flag = 1; #endif @@ -257,7 +263,7 @@ ivas_error ivas_ism_metadata_enc( else if ( hIsmMeta[ch]->ism_md_inc_diff_cnt < ISM_MD_INC_DIFF_CNT_MAX ) { #ifdef FIX_532_ISM_MD_INACTIVE - inactive_metadata_flag[ch] = 1; + lowrate_metadata_flag[ch] = 1; #else hIsmMeta[ch]->ism_metadata_flag = 1; #endif @@ -274,7 +280,7 @@ ivas_error ivas_ism_metadata_enc( else if ( hIsmMeta[ch]->ism_md_fec_cnt_enc == ISM_MD_FEC_CNT_MAX ) { #ifdef FIX_532_ISM_MD_INACTIVE - inactive_metadata_flag[ch] = 1; + lowrate_metadata_flag[ch] = 1; #else hIsmMeta[ch]->ism_metadata_flag = 1; #endif @@ -290,7 +296,7 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ #ifdef FIX_532_ISM_MD_INACTIVE - rate_ism_importance( nchan_transport, hIsmMeta, hSCE, inactive_metadata_flag, ism_imp ); + rate_ism_importance( nchan_transport, hIsmMeta, hSCE, lowrate_metadata_flag, ism_imp ); #else rate_ism_importance( nchan_transport, hIsmMeta, hSCE, ism_imp ); #endif @@ -310,7 +316,7 @@ ivas_error ivas_ism_metadata_enc( { ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag; #ifdef FIX_532_ISM_MD_INACTIVE - ism_metadata_flag_global |= inactive_metadata_flag[ch]; + ism_metadata_flag_global |= lowrate_metadata_flag[ch]; #endif non_diegetic_flag_global |= hIsmMeta[ch]->non_diegetic_flag; } @@ -335,18 +341,34 @@ ivas_error ivas_ism_metadata_enc( #ifdef FIX_532_ISM_MD_INACTIVE - /* signal presence of MD in low-rate ISM_NO_META frame */ + /* write ISM_NO_META class signalling */ if ( ism_mode == ISM_MODE_DISC ) { for ( ch = 0; ch < nchan_transport; ch++ ) { if ( ism_imp[ch] == ISM_NO_META ) { - push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, inactive_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); + if ( null_metadata_flag[ch] ) + { + /* signal NULL metadata frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); + + /* rewrite the ISM class to ISM_NO_META foloowed by the true class */ + delete_indice( hBstr, IND_ISM_METADATA_FLAG ); + push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + } + else + { + /* signal low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 0, ISM_METADATA_MD_FLAG_BITS ); + + /* signal presence of MD in low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, lowrate_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); + } } } } - #else if ( ism_mode == ISM_MODE_DISC ) { @@ -386,7 +408,7 @@ ivas_error ivas_ism_metadata_enc( } #ifdef FIX_532_ISM_MD_INACTIVE - if ( hIsmMeta[ch]->ism_metadata_flag || inactive_metadata_flag[ch] ) + if ( hIsmMeta[ch]->ism_metadata_flag || lowrate_metadata_flag[ch] ) #else if ( hIsmMeta[ch]->ism_metadata_flag ) #endif @@ -586,7 +608,7 @@ ivas_error ivas_ism_metadata_enc( *----------------------------------------------------------------*/ #ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, null_metadata_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, vad_flag, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) #endif @@ -704,11 +726,7 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; } -#ifdef FIX_532_ISM_MD_INACTIVE - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } -- GitLab From f48584a882ef2084a68ec42133f73dc983e8d23e Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 12:01:48 +0200 Subject: [PATCH 290/381] adapt NULL MD support --- lib_com/ivas_ism_com.c | 11 +++++--- lib_dec/ivas_ism_metadata_dec.c | 11 ++++++-- lib_enc/ivas_ism_metadata_enc.c | 48 ++++++++++++++++----------------- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 42118da48b..984186493a 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -167,17 +167,22 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( ism_imp[ch] == ISM_NO_META ) + //if ( ism_imp[ch] == ISM_NO_META ) { - nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + if ( null_metadata_flag[ch] ) { + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; } else { - nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + if ( ism_imp[ch] == ISM_NO_META ) + { + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; + } } } #else diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 2bfe7894d7..637a6ba697 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -241,6 +241,7 @@ ivas_error ivas_ism_metadata_dec( non_diegetic_flag_global = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS ); } } + /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */ if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */ { @@ -257,7 +258,7 @@ ivas_error ivas_ism_metadata_dec( } } - /* Read ISM present flags (one per object) */ + /* Read ISM metadata flags (one per object) */ for ( ch = 0; ch < *nchan_transport; ch++ ) { ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); @@ -290,10 +291,16 @@ ivas_error ivas_ism_metadata_dec( { /* low-rate ISM_NO_META frame */ null_metadata_flag[ch] = get_next_indice( st0, ISM_METADATA_INACTIVE_FLAG_BITS ); + } + } + for ( ch = 0; ch < *nchan_transport; ch++ ) + { + if ( ism_imp[ch] == ISM_NO_META ) + { if ( null_metadata_flag[ch] ) { - /* read the true ISM class */ + /* read the true ISM class */ ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS ); } else diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index c1c48a1ec3..d3abf35904 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -333,43 +333,41 @@ ivas_error ivas_ism_metadata_enc( } } +#ifdef FIX_532_ISM_MD_INACTIVE /* write ISM metadata flag (one per object) */ for ( ch = 0; ch < nchan_transport; ch++ ) { - push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); - } - + if ( null_metadata_flag[ch] ) + { + /* signal NULL metadata frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); -#ifdef FIX_532_ISM_MD_INACTIVE - /* write ISM_NO_META class signalling */ - if ( ism_mode == ISM_MODE_DISC ) - { - for ( ch = 0; ch < nchan_transport; ch++ ) + /* write the ISM class to ISM_NO_META and again the true ISM class */ + push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + } + else { + push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + if ( ism_imp[ch] == ISM_NO_META ) { - if ( null_metadata_flag[ch] ) - { - /* signal NULL metadata frame */ - push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 1, ISM_METADATA_MD_FLAG_BITS ); + /* signal low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 0, ISM_METADATA_MD_FLAG_BITS ); - /* rewrite the ISM class to ISM_NO_META foloowed by the true class */ - delete_indice( hBstr, IND_ISM_METADATA_FLAG ); - push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); - push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); - } - else - { - /* signal low-rate ISM_NO_META frame */ - push_indice( hBstr, IND_ISM_MD_NULL_FLAG, 0, ISM_METADATA_MD_FLAG_BITS ); - - /* signal presence of MD in low-rate ISM_NO_META frame */ - push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, lowrate_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); - } + /* signal presence of MD in low-rate ISM_NO_META frame */ + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, lowrate_metadata_flag[ch], ISM_METADATA_INACTIVE_FLAG_BITS ); } } } + #else + /* write ISM metadata flag (one per object) */ + for ( ch = 0; ch < nchan_transport; ch++ ) + { + push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + } + if ( ism_mode == ISM_MODE_DISC ) { /* write VAD flag */ -- GitLab From 7c6d6937e1e64fb19d7e9b4654cc0c73805e02bf Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 12:03:41 +0200 Subject: [PATCH 291/381] cleaning --- lib_com/ivas_ism_com.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 984186493a..bd064a584a 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -167,22 +167,17 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { #ifdef FIX_532_ISM_MD_INACTIVE - //if ( ism_imp[ch] == ISM_NO_META ) + if ( null_metadata_flag[ch] ) { - - - if ( null_metadata_flag[ch] ) + nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; + nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; + } + else + { + if ( ism_imp[ch] == ISM_NO_META ) { nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; - nb_bits_metadata[0] += ISM_METADATA_FLAG_BITS; - } - else - { - if ( ism_imp[ch] == ISM_NO_META ) - { - nb_bits_metadata[0] += ISM_METADATA_MD_FLAG_BITS; - nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; - } + nb_bits_metadata[0] += ISM_METADATA_INACTIVE_FLAG_BITS; } } #else -- GitLab From d5e2327acb37c1205e123c28d1742f49955e64e0 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 12:27:58 +0200 Subject: [PATCH 292/381] - remove unused function declaration related to a ToDo - edit two comments --- lib_dec/ivas_jbm_dec.c | 2 +- lib_enc/init_enc.c | 2 +- lib_rend/lib_rend.h | 5 ----- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 7cc96cd14f..d1132aeaa6 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -292,7 +292,7 @@ ivas_error ivas_jbm_dec_tc( } else if ( st_ivas->ivas_format == SBA_FORMAT && ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM ) ) { - float gain = 0.8414f; /* Todo: Temporary gain for roughly matching the loudness. To be tuned later together with other outputs. */ + float gain = 0.8414f; /* Todo: Temporary gain for roughly matching the loudness. To be tuned later together with other outputs. Also, this is not inline with ivas_dec() */ for ( n = 0; n < nchan_remapped; n++ ) { diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 1c10715701..543f20a406 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -704,7 +704,7 @@ ivas_error init_encoder( * TCX core *-----------------------------------------------------------------*/ - // ToDo: reduction possible for MCT_CHAN_MODE_LFE channel - see I1-172 + // ToDo: reduction possible for MCT_CHAN_MODE_LFE channel if ( idchan == 0 || st->element_mode == IVAS_CPE_MDCT ) { if ( ( st->hTcxEnc = (TCX_ENC_HANDLE) malloc( sizeof( TCX_ENC_DATA ) ) ) == NULL ) diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index c8873ecb6f..7d279a5277 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -145,11 +145,6 @@ ivas_error IVAS_REND_ConfigureCustomOutputLoudspeakerLayout( const IVAS_CUSTOM_LS_DATA layout /* i : custom loudspeaker layout for renderer output */ ); -/* Note: this affects output delay */ -ivas_error IVAS_REND_SetCustomHrtf( - IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ - void* TODO -); /* Functions to be called before/during rendering */ -- GitLab From 18bf8037a646695e9cf63ff42266a86e8589b297 Mon Sep 17 00:00:00 2001 From: Shikha Shetgeri <100861@ittiam.com> Date: Wed, 7 Jun 2023 17:08:50 +0530 Subject: [PATCH 293/381] removed unused functions --- lib_com/ivas_fb_mixer.c | 2 ++ lib_com/options.h | 1 + lib_enc/ivas_spar_md_enc.c | 2 ++ 3 files changed, 5 insertions(+) diff --git a/lib_com/ivas_fb_mixer.c b/lib_com/ivas_fb_mixer.c index a2f1a9d509..80247804b0 100644 --- a/lib_com/ivas_fb_mixer.c +++ b/lib_com/ivas_fb_mixer.c @@ -49,7 +49,9 @@ static void ivas_get_active_bins( const int16_t **pActive_bins, const int16_t **pActive_bins_abs, const int16_t **pStart_offset, const int16_t **pStart_offset_ab, const int32_t sampling_rate ); static void ivas_get_ld_fb_resp( float **ppIdeal_FRs_re, float **ppIdeal_FRs_im, float **ppNew_FRs_re, float **ppNew_FRs_im, const int16_t *pActive_bins, const int16_t *pStart_offset, const int16_t num_bands, const int16_t delay, const int32_t sampling_rate ); +#ifndef FIX_383_CLEAN_UP static int16_t ivas_fb_mixer_get_band_diff_non48k( const int32_t sampling_rate, const float delay_ms ); +#endif static const float *ivas_get_cheby_ramp( const int16_t delay ); static void ivas_get_hanning_win( const int16_t len, float *pH_win ); static ivas_error ivas_filterbank_setup( IVAS_FB_MIXER_HANDLE hFbMixer, const int32_t sampling_rate ); diff --git a/lib_com/options.h b/lib_com/options.h index 0e7035a632..921446209e 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -173,6 +173,7 @@ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ +#define FIX_383_CLEAN_UP /* Dlb : Clean up of unused functions */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index 99134b2af3..dbca3809cc 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -69,7 +69,9 @@ typedef enum ivas_strats_t static void ivas_band_mixer( float *cov_re[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], const int16_t num_ch, int16_t *num_bands, int16_t red_band_fact ); +#ifndef FIX_383_CLEAN_UP static void ivas_get_band_differential_index( ivas_band_coeffs_ind_t *pBand_idx, const int16_t q_levels[2], const int16_t one_sided, const int16_t nB, const int16_t complex_cov, const int16_t dim, const ivas_coeffs_type_t coeff_type ); +#endif static int16_t ivas_get_huffman_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t bands_bw ); static int16_t ivas_get_arith_coded_bs( ivas_spar_md_enc_state_t *hMdEnc, BSTR_ENC_HANDLE hMetaData, const int16_t *pDo_diff, const int16_t bands_bw, const int16_t nB, const int16_t qsi, const int16_t planarCP, const int16_t strat, const int32_t ivas_total_brate ); -- GitLab From 7eaf7ebf069fffdde6b5fcf34d3b552a819145fb Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 14:17:10 +0200 Subject: [PATCH 294/381] fix wrong error return --- lib_enc/ivas_enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 66942eaec3..da553657a9 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -164,7 +164,7 @@ ivas_error ivas_enc( else if ( ivas_format == ISM_FORMAT ) { /* select ISM format mode; reconfigure the ISM format encoder */ - if ( ( ivas_ism_enc_config( st_ivas ) ) ) + if ( ( error = ivas_ism_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From a622b14eacec670df4026d71bba61e4bc3159901 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Wed, 7 Jun 2023 14:33:25 +0200 Subject: [PATCH 295/381] reduce compiler warnings --- lib_rend/lib_rend.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 3278c26368..8db5820cfa 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5124,8 +5124,6 @@ static ivas_error renderIsmToBinauralReverb( int16_t i; float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; ivas_error error; - IVAS_REND_AudioObjectPosition rotatedPos; - const IVAS_REND_HeadRotData *headRotData; #ifdef JBM_TSM_ON_TCS float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; @@ -5137,9 +5135,6 @@ static ivas_error renderIsmToBinauralReverb( push_wmops( "renderIsmToBinauralRoom" ); - headRotData = ismInput->base.ctx.pHeadRotData; - rotatedPos = defaultObjectPosition(); - copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, @@ -5617,7 +5612,7 @@ static ivas_error renderMcToBinauralRoom( #else headRotEnabled #endif //EXTERNAL_ORIENTATIONS -#endif FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG +#endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); -- GitLab From 1ed8539ea07a2a242151fc17f7c97c824c76a929 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 14:45:53 +0200 Subject: [PATCH 296/381] fix in MD flags writing --- lib_com/options.h | 2 +- lib_enc/ivas_ism_metadata_enc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index f144b0f5ac..15f8fa1b18 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ #ifdef DEBUGGING -#define DEBUG_MODE_INFO /* output most important parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index d3abf35904..b3e7b2e179 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -344,7 +344,7 @@ ivas_error ivas_ism_metadata_enc( /* write the ISM class to ISM_NO_META and again the true ISM class */ push_indice( hBstr, IND_ISM_METADATA_FLAG, ISM_NO_META, ISM_METADATA_FLAG_BITS ); - push_indice( hBstr, IND_ISM_NOISY_SPEECH_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); + push_indice( hBstr, IND_ISM_MD_INACTIVE_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS ); } else { -- GitLab From 468d3b1cbcad2685e7964159b45f951cc90d6450 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Wed, 7 Jun 2023 15:08:27 +0200 Subject: [PATCH 297/381] reduce compiler warnings --- lib_rend/lib_rend.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 8db5820cfa..80a338108a 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5121,7 +5121,9 @@ static ivas_error renderIsmToBinauralReverb( input_ism *ismInput, IVAS_REND_AudioBuffer outAudio ) { +#ifdef JBM_TSM_ON_TCS int16_t i; +#endif float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; ivas_error error; #ifdef JBM_TSM_ON_TCS -- GitLab From b9ac80685531b504c17bfc75467253db04c52174 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 15:11:12 +0200 Subject: [PATCH 298/381] fix low_rate_mode flag logic --- lib_dec/ivas_ism_metadata_dec.c | 2 +- lib_enc/ivas_ism_metadata_enc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 637a6ba697..0f54c699d6 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -542,7 +542,7 @@ ivas_error ivas_ism_metadata_dec( if ( ism_mode == ISM_MODE_DISC ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( total_brate[ch] == BRATE_ISM_INACTIVE ) + if ( ism_imp[ch] == ISM_NO_META ) #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) #endif diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index b3e7b2e179..518ba3353a 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -636,7 +636,7 @@ ivas_error ivas_ism_metadata_enc( if ( ism_mode == ISM_MODE_DISC ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( total_brate[ch] == BRATE_ISM_INACTIVE ) + if ( ism_imp[ch] == ISM_NO_META ) #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && vad_flag[ch] == 0 && ism_metadata_flag_global ) #endif -- GitLab From 6f22a699279870c62f2c1ee7d3303f6741f1cee4 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 15:54:57 +0200 Subject: [PATCH 299/381] keep only ISM_25k6_HZ_CORE switch - correct FB -> SWB decision logic --- lib_com/bits_alloc.c | 9 -------- lib_com/core_com_config.c | 2 +- lib_com/ivas_cnst.h | 10 --------- lib_com/ivas_ism_com.c | 34 ++++-------------------------- lib_com/ivas_prot.h | 10 --------- lib_com/options.h | 6 +----- lib_com/prot.h | 9 +------- lib_dec/evs_dec.c | 4 ---- lib_dec/init_dec.c | 4 ---- lib_dec/ivas_cpe_dec.c | 4 ---- lib_dec/ivas_ism_dec.c | 4 ---- lib_dec/ivas_ism_metadata_dec.c | 8 ------- lib_dec/ivas_sce_dec.c | 8 ------- lib_enc/bw_detect.c | 15 +------------ lib_enc/evs_enc.c | 4 ---- lib_enc/init_enc.c | 4 ---- lib_enc/ivas_core_enc.c | 7 +----- lib_enc/ivas_core_pre_proc.c | 2 +- lib_enc/ivas_core_pre_proc_front.c | 12 +---------- lib_enc/ivas_cpe_enc.c | 16 +------------- lib_enc/ivas_decision_matrix_enc.c | 8 ------- lib_enc/ivas_ism_dtx_enc.c | 7 +----- lib_enc/ivas_ism_enc.c | 20 +----------------- lib_enc/ivas_ism_metadata_enc.c | 8 ------- lib_enc/ivas_sce_enc.c | 15 +------------ 25 files changed, 15 insertions(+), 215 deletions(-) diff --git a/lib_com/bits_alloc.c b/lib_com/bits_alloc.c index 14f75199be..56e523b392 100644 --- a/lib_com/bits_alloc.c +++ b/lib_com/bits_alloc.c @@ -1477,9 +1477,6 @@ static int16_t allocate_unused( /*! r: ACELP16k flag */ int16_t set_ACELP_flag( -#ifdef ISM_16_KHZ_CORE - const ISM_MODE ism_mode, /* i : ISM mode */ -#endif const int16_t element_mode, /* i : element mode */ const int32_t element_brate, /* i : element bitrate */ const int32_t total_brate, /* i : total bitrate per channel */ @@ -1518,12 +1515,6 @@ int16_t set_ACELP_flag( } else if ( element_mode == IVAS_SCE ) { -#ifdef ISM_16_KHZ_CORE - if ( ism_mode == ISM_MODE_DISC && element_brate >= SCE_CORE_16k_LOW_LIMIT_ISM ) - { - return 1; - } -#endif if ( element_brate >= SCE_CORE_16k_LOW_LIMIT ) { return 1; diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index 787d2f0c6e..20f5032e14 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -365,7 +365,7 @@ int32_t getCoreSamplerateMode2( const int16_t rf_mode /* i : flag to signal the RF mode */ #ifdef ISM_25k6_HZ_CORE , - const IVAS_FORMAT is_ism_format + const IVAS_FORMAT is_ism_format /* i : flag indicating ISM format */ #endif ) { diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 662fdfc358..416bb914fe 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -291,9 +291,6 @@ typedef enum #define ACELP_12k8_HIGH_LIMIT 24350 /* max. per channel bitrate where the ACELP@12.8kHz is supported */ #define ACELP_16k_LOW_LIMIT 13250 /* min. per channel bitrate where the ACELP@16kHz is supported */ #define SCE_CORE_16k_LOW_LIMIT 17000 /* min. SCE bitrate where the ACELP@16kHz is supported; must be >= (ACELP_16k_LOW_LIMIT + SWB_TBE_1k6) */ -#ifdef ISM_16_KHZ_CORE -#define SCE_CORE_16k_LOW_LIMIT_ISM 15900 /* min. SCE bitrate where the ACELP@16kHz is supported; must be >= (ACELP_16k_LOW_LIMIT + SWB_TBE_1k6) */ -#endif #define MIN_BRATE_AVQ_EXC ACELP_29k00 /* min. per channel bitrate where the AVQ excitation stage is supported */ #define MAX_BRATE_AVQ_EXC_TD 40000 /* max. per channel bitrate where the AVQ excitation stage in time domain is supported */ @@ -314,9 +311,6 @@ typedef enum #define MIN_BRATE_SWB_SCE ACELP_9k60 /* min. SCE bitrate where SWB is supported */ #define MIN_BRATE_SWB_STEREO IVAS_13k2 /* min. stereo bitrate where SWB is supported */ #define MIN_BRATE_FB_STEREO IVAS_32k /* min. SCE and stereo bitrate where FB is supported */ -#ifdef ISM_FB -#define MIN_BRATE_FB_STEREO_ISM 24000 /* min. SCE bitrate where FB is supported in ISM format */ -#endif #define MIN_TDM_BRATE_WB_TBE_1k05 12000 /* min. per channel bitrate where WB TBE @1.05 kbps is supported (0.35kbs at lower bitrates) */ #define MIN_BRATE_WB_TBE_1k05 9650 /* min. per channel bitrate where WB TBE @1.05 kbps is supported (0.35kbs at lower bitrates) */ @@ -334,11 +328,7 @@ typedef enum * ISM Constants *----------------------------------------------------------------------------------*/ -#ifdef ISM_16_KHZ_CORE -#define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT_ISM - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ -#else #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ -#endif #define ISM_METADATA_VAD_FLAG_BITS 1 #define ISM_METADATA_FLAG_BITS 2 diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index ac073e6481..a28fb77d20 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -88,13 +88,10 @@ static void bitbudget_to_brate( *-------------------------------------------------------------------*/ ivas_error ivas_ism_config( - const int32_t ism_total_brate, /* i : ISM total bitrate */ - const int16_t nchan_transport, /* i : number of transport channels */ - const int16_t nchan_ism, /* i : number of objects */ - ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ -#ifdef ISM_16_KHZ_CORE - const ISM_MODE ism_mode, /* i : ISM mode */ -#endif + const int32_t ism_total_brate, /* i : ISM total bitrate */ + const int16_t nchan_transport, /* i : number of transport channels */ + const int16_t nchan_ism, /* i : number of objects */ + ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ const int16_t ism_imp[], /* i : ISM importance flags */ @@ -110,23 +107,12 @@ ivas_error ivas_ism_config( int16_t tmp; int16_t ism_metadata_flag_global; int16_t n_ISms; -#ifdef ISM_16_KHZ_CORE - int32_t sce_core_16k_limit; -#endif ivas_error error; error = IVAS_ERR_OK; n_ISms = nchan_transport; -#ifdef ISM_16_KHZ_CORE - sce_core_16k_limit = SCE_CORE_16k_LOW_LIMIT_ISM; - if ( ism_mode == ISM_MODE_PARAM || ism_extended_metadata_flag ) - { - sce_core_16k_limit = SCE_CORE_16k_LOW_LIMIT; - } -#endif - /* initialization */ ism_metadata_flag_global = 0; bits_side = 0; @@ -231,17 +217,9 @@ ivas_error ivas_ism_config( { limit = MIN_BRATE_WB_BWE / FRMS_PER_SECOND; } -#ifdef ISM_16_KHZ_CORE - else if ( element_brate[ch] >= sce_core_16k_limit ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ -#else else if ( element_brate[ch] >= SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ -#endif { -#ifdef ISM_16_KHZ_CORE - /*limit = sce_core_16k_limit;*/ -#else /*limit = SCE_CORE_16k_LOW_LIMIT;*/ -#endif limit = ( ACELP_16k_LOW_LIMIT + SWB_TBE_1k6 ) / FRMS_PER_SECOND; } @@ -293,11 +271,7 @@ ivas_error ivas_ism_config( for ( ch = 0; ch < n_ISms; ch++ ) { limit_high = IVAS_512k / FRMS_PER_SECOND; -#ifdef ISM_16_KHZ_CORE - if ( element_brate[ch] < sce_core_16k_limit ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ -#else if ( element_brate[ch] < SCE_CORE_16k_LOW_LIMIT ) /* replicate function set_ACELP_flag() -> it is not intended to switch the ACELP internal sampling rate within an object */ -#endif { limit_high = ACELP_12k8_HIGH_LIMIT / FRMS_PER_SECOND; } diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 4f494116f8..ae25a9f898 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -214,9 +214,6 @@ ivas_error pre_proc_front_ivas( const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ const int32_t ivas_total_brate /* i : IVAS total bitrate */ -#ifdef ISM_FB - ,const ISM_MODE ism_mode -#endif ); ivas_error pre_proc_ivas( @@ -591,10 +588,6 @@ void ivas_signaling_enc( const int32_t element_brate, /* i : element bitrate */ const int16_t tdm_SM_flag, /* i : channel combination scheme flag in TD stereo */ const int16_t tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo*/ -#ifdef ISM_FB - , - const ISM_MODE ism_mode -#endif ); void ivas_decision_matrix_dec( @@ -879,9 +872,6 @@ ivas_error ivas_ism_config( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t nchan_ism, /* i : number of objects */ ISM_METADATA_HANDLE hIsmMeta[], /* i/o: ISM metadata handles */ -#ifdef ISM_16_KHZ_CORE - const ISM_MODE ism_mode, /* i : ISM mode */ -#endif const int16_t ism_extended_metadata_flag, /* i : extended metadata flag */ const int16_t localVAD[MAX_NUM_OBJECTS], /* i : local VAD flag */ const int16_t ism_imp[], /* i : ISM importance flags */ diff --git a/lib_com/options.h b/lib_com/options.h index e756e035cc..fd47747186 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,11 +174,7 @@ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ - - -#define ISM_16_KHZ_CORE // 1ISM 16.4 kbps: change starting bitrate of core-coder with 16kHz internal sampling rate from 17 kbps to 15.9 kbps -#define ISM_FB // 1ISM 32 kbps: change SWB to FB coding -#define ISM_25k6_HZ_CORE // 1ISM 48 kbps: change ACELP/TCX 16 kHz core to TCX only 25.6 kHz core +#define ISM_25k6_HZ_CORE /* VA: issue 540: 1ISM 48 kbps - change ACELP/TCX 16 kHz core to TCX only 25.6 kHz core */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 6ea66971dc..39b2f6372e 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -3899,10 +3899,6 @@ void set_bw( const int32_t element_brate, /* i : element bitrate */ Encoder_State *st, /* i/o: Encoder State */ const int16_t codec_mode /* i : codec mode */ -#ifdef ISM_FB - , - const ISM_MODE ism_mode -#endif ); float gaus_encode( @@ -9137,9 +9133,6 @@ ivas_error config_acelp1( /*! r: ACELP16k flag */ int16_t set_ACELP_flag( -#ifdef ISM_16_KHZ_CORE - const ISM_MODE ism_mode, /* i : ISM mode */ -#endif const int16_t element_mode, /* i : element mode */ const int32_t element_brate, /* i : element bitrate */ const int32_t total_brate, /* i : total bitrate per channel */ @@ -9816,7 +9809,7 @@ int32_t getCoreSamplerateMode2( const int16_t rf_mode /* i : flag to signal the RF mode */ #ifdef ISM_25k6_HZ_CORE , - const IVAS_FORMAT is_ism_format + const IVAS_FORMAT is_ism_format /* i : flag indicating ISM format */ #endif ); diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 05dc675ab0..1be8873271 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -92,11 +92,7 @@ ivas_error evs_dec( *-----------------------------------------------------------------*/ st->idchan = 0; -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); -#endif tmps = 0; delay_tdbwe = 0; diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index df5edf3baa..23656c924e 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -90,11 +90,7 @@ ivas_error init_decoder( st->last_core = -1; st->last_extl = st->extl; -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); -#endif /*-----------------------------------------------------------------* * ACELP core parameters diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index d183f8e09e..948b475c74 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -305,11 +305,7 @@ ivas_error ivas_cpe_dec( for ( n = 0; n < n_channels; n++ ) { /* set ACELP12k8 / ACELP16k flag for flexible ACELP core */ -#ifdef ISM_16_KHZ_CORE - sts[n]->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, ( hCPE->hStereoTD != NULL ? hCPE->hStereoTD->tdm_LRTD_flag : 0 ), sts[n]->bwidth, sts[n]->cng_type ); -#else sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, ( hCPE->hStereoTD != NULL ? hCPE->hStereoTD->tdm_LRTD_flag : 0 ), sts[n]->bwidth, sts[n]->cng_type ); -#endif } for ( n = 0; n < n_channels; n++ ) diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 6e083f464b..5ad0ce08c7 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -77,11 +77,7 @@ static ivas_error ivas_ism_bitrate_switching( ivas_init_dec_get_num_cldfb_instances( st_ivas, &numCldfbAnalyses_old, &numCldfbSyntheses_old ); st_ivas->ism_mode = ism_mode; -#ifdef ISM_16_KHZ_CORE - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, ism_mode, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->nchan_ism, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 6f526bfb7f..a39c496ab6 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -478,11 +478,7 @@ ivas_error ivas_ism_metadata_dec( if ( !bfi ) { -#ifdef ISM_16_KHZ_CORE - if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_mode, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( ism_total_brate, *nchan_transport, nchan_ism, hIsmMeta, ism_extmeta_bitstream, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -587,11 +583,7 @@ ivas_error ivas_ism_metadata_dec_create( ivas_ism_reset_metadata( st_ivas->hIsmMetaData[ch] ); } -#ifdef ISM_16_KHZ_CORE - if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, st_ivas->ism_mode, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hDecoderConfig->ivas_total_brate, n_ISms, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 785fb851c8..37a283e451 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -123,11 +123,7 @@ ivas_error ivas_sce_dec( /* only WB is supported */ st->bwidth = WB; } -#ifdef ISM_FB - else if ( ( hSCE->element_brate < MIN_BRATE_FB_STEREO_ISM && st_ivas->ism_mode != ISM_MODE_NONE ) || ( hSCE->element_brate < MIN_BRATE_FB_STEREO && st_ivas->ism_mode == ISM_MODE_NONE ) ) -#else else if ( hSCE->element_brate < MIN_BRATE_FB_STEREO ) -#endif { /* WB and SWB are supported */ st->bwidth = get_next_indice( st, 1 ) + WB; @@ -204,11 +200,7 @@ ivas_error ivas_sce_dec( } else { -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( st_ivas->ism_mode, IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); -#endif } if ( is_DTXrate( ivas_total_brate ) ) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 570ea4412d..2e315608b3 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -511,12 +511,7 @@ void bw_detect( if ( st->element_mode == EVS_MONO ) { - set_bw( -1, -1, st, st->codec_mode -#ifdef ISM_FB - , - ISM_MODE_NONE -#endif - ); + set_bw( -1, -1, st, st->codec_mode ); } return; @@ -533,10 +528,6 @@ void set_bw( const int32_t element_brate, /* i : element bitrate */ Encoder_State *st, /* i/o: Encoder State */ const int16_t codec_mode /* i : codec mode */ -#ifdef ISM_FB - , - const ISM_MODE ism_mode -#endif ) { /* initialization */ @@ -581,11 +572,7 @@ void set_bw( { st->bwidth = WB; } -#ifdef ISM_FB - else if ( ( ( element_brate < MIN_BRATE_FB_STEREO_ISM && ism_mode != ISM_MODE_NONE ) || ( element_brate < MIN_BRATE_FB_STEREO && ism_mode == ISM_MODE_NONE ) ) && st->bwidth > SWB ) -#else else if ( element_brate < MIN_BRATE_FB_STEREO && st->bwidth > SWB ) -#endif { st->bwidth = SWB; } diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c index f376a97d51..cc01594b79 100644 --- a/lib_enc/evs_enc.c +++ b/lib_enc/evs_enc.c @@ -124,11 +124,7 @@ ivas_error evs_enc( st->rate_switching_reset = 0; st->idchan = 0; -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( EVS_MONO, -1, st->total_brate, 0, 0, -1, -1 ); -#endif /*----------------------------------------------------------------* * set input samples buffer diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 03658c107b..9e9a7ca4b2 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -103,11 +103,7 @@ ivas_error init_encoder( st->coder_type_raw = VOICED; st->last_coder_type_raw = st->coder_type_raw; -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); -#endif #ifdef ISM_25k6_HZ_CORE st->is_ism_format = 0; diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index d2c96df162..6536ee333e 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -221,12 +221,7 @@ ivas_error ivas_core_enc( if ( !MCT_flag || ( MCT_flag && cpe_id == 0 ) ) { - ivas_signaling_enc( st, MCT_flag, element_brate, tdm_SM_or_LRTD_Pri, tdm_Pitch_reuse_flag -#ifdef ISM_FB - , - ivas_format == ISM_FORMAT ? ISM_MODE_DISC : ISM_MODE_NONE -#endif - ); + ivas_signaling_enc( st, MCT_flag, element_brate, tdm_SM_or_LRTD_Pri, tdm_Pitch_reuse_flag ); } /*---------------------------------------------------------------------* diff --git a/lib_enc/ivas_core_pre_proc.c b/lib_enc/ivas_core_pre_proc.c index ef6465162d..b6f86bb887 100644 --- a/lib_enc/ivas_core_pre_proc.c +++ b/lib_enc/ivas_core_pre_proc.c @@ -130,7 +130,7 @@ ivas_error pre_proc_ivas( st->L_frame = L_FRAME32k; } #ifdef ISM_25k6_HZ_CORE - else if ( st->bwidth >= FB && st->total_brate > MAX_ACELP_BRATE_ISM && st->total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && st->is_ism_format && st->tcxonly ) + else if ( st->bwidth >= SWB && st->total_brate > MAX_ACELP_BRATE_ISM && st->total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && st->is_ism_format && st->tcxonly ) { st->L_frame = L_FRAME25_6k; } diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 12db1ac55c..cadecf5083 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -108,11 +108,6 @@ ivas_error pre_proc_front_ivas( const int16_t force_front_vad, /* i : flag to force VAD decision */ const int16_t front_vad_dtx_flag, /* i : front-VAD DTX flag to overwrite VAD decision*/ const int32_t ivas_total_brate /* i : IVAS total bitrate - for setting the DTX */ -#ifdef ISM_FB - , - const ISM_MODE ism_mode -#endif - ) { float *inp_12k8, *new_inp_12k8; /* pointers to current frame and new data */ @@ -489,12 +484,7 @@ ivas_error pre_proc_front_ivas( if ( element_mode != IVAS_CPE_MDCT ) /* in MDCT stereo, set_bw_stereo() is used instead */ { - set_bw( element_mode, element_brate, st, MODE1 -#ifdef ISM_FB - , - ism_mode -#endif - ); + set_bw( element_mode, element_brate, st, MODE1 ); } /* set the BW of the TD secondary channel in LRTD mode same as BW of the primary channel (only at higher bitrates) */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 4581f1c145..c66ee4e1a5 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -445,13 +445,7 @@ ivas_error ivas_cpe_enc( &ener[n], &relE[n], A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], &vad_hover_flag[n], &attack_flag[n], realBuffer[n], imagBuffer[n], old_wsp[n], pitch_fr[n], voicing_fr[n], &loc_harm[n], &cor_map_sum[n], &vad_flag_dtx[n], enerBuffer[n], fft_buff[n], A[0], lsp_new[0], currFlatness[n], tdm_ratio_idx, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, band_energies_LR, 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, 0, 0, - ivas_total_brate -#ifdef ISM_FB - , - ISM_MODE_NONE -#endif - - ); + ivas_total_brate ); if ( error != IVAS_ERR_OK ) { return error; @@ -522,19 +516,11 @@ ivas_error ivas_cpe_enc( { if ( ( sts[0]->core_brate == SID_2k40 || sts[0]->core_brate == FRAME_NO_DATA ) && hCPE->element_mode == IVAS_CPE_DFT ) { -#ifdef ISM_16_KHZ_CORE - sts[n]->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, hCPE->element_mode, hCPE->element_brate, sts[n]->core_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); -#else sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->core_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); -#endif } else { -#ifdef ISM_16_KHZ_CORE - sts[n]->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); -#else sts[n]->flag_ACELP16k = set_ACELP_flag( hCPE->element_mode, hCPE->element_brate, sts[n]->total_brate, n, sts[0]->tdm_LRTD_flag, sts[n]->bwidth, sts[n]->cng_type ); -#endif } } diff --git a/lib_enc/ivas_decision_matrix_enc.c b/lib_enc/ivas_decision_matrix_enc.c index 2f5f9e0201..f182a28a32 100644 --- a/lib_enc/ivas_decision_matrix_enc.c +++ b/lib_enc/ivas_decision_matrix_enc.c @@ -386,10 +386,6 @@ void ivas_signaling_enc( const int32_t element_brate, /* i : element bitrate */ const int16_t tdm_SM_or_LRTD_Pri, /* i : channel combination scheme flag in TD stereo OR LRTD primary channel */ const int16_t tdm_Pitch_reuse_flag /* i : primary channel pitch reuse flag in TD stereo */ -#ifdef ISM_FB - , - const ISM_MODE ism_mode -#endif ) { int16_t ind; @@ -431,11 +427,7 @@ void ivas_signaling_enc( { /* only WB is supported */ } -#ifdef ISM_FB - else if ( ( element_brate < MIN_BRATE_FB_STEREO_ISM && ism_mode != ISM_MODE_NONE ) || ( element_brate < MIN_BRATE_FB_STEREO && ism_mode == ISM_MODE_NONE ) ) -#else else if ( element_brate < MIN_BRATE_FB_STEREO ) -#endif { /* WB and SWB are supported */ ind = st->bwidth - WB; diff --git a/lib_enc/ivas_ism_dtx_enc.c b/lib_enc/ivas_ism_dtx_enc.c index f097feb202..907997cf98 100644 --- a/lib_enc/ivas_ism_dtx_enc.c +++ b/lib_enc/ivas_ism_dtx_enc.c @@ -249,12 +249,7 @@ int16_t ivas_ism_dtx_enc( for ( ch = 0; ch < nchan_transport; ch++ ) { hSCE[ch]->hCoreCoder[0]->core_brate = -1; - set_bw( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 -#ifdef ISM_FB - , - -1 // VE: not really correct !!!!! -#endif - ); + set_bw( IVAS_SCE, hSCE[ch]->element_brate, hSCE[ch]->hCoreCoder[0], MODE1 ); } hISMDTX->cnt_SID_ISM = -1; diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index dc12943621..6c6a0c8837 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -165,13 +165,7 @@ ivas_error ivas_ism_enc( &ener[sce_id][0], &relE[sce_id][0], A[sce_id][0], Aw[sce_id][0], epsP[sce_id][0], lsp_new[sce_id][0], lsp_mid[sce_id][0], &vad_hover_flag[sce_id][0], &attack_flag[sce_id][0], realBuffer[sce_id][0], imagBuffer[sce_id][0], old_wsp[sce_id][0], pitch_fr[sce_id][0], voicing_fr[sce_id][0], &loc_harm[sce_id][0], &cor_map_sum[sce_id][0], &vad_flag_dtx[sce_id][0], enerBuffer[sce_id][0], fft_buff[sce_id][0], A[sce_id][0], lsp_new[sce_id][0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, 0, 0, 0, 0, - st_ivas->hEncoderConfig->ivas_total_brate -#ifdef ISM_FB - , - st_ivas->ism_mode -#endif - - ); + st_ivas->hEncoderConfig->ivas_total_brate ); if ( error != IVAS_ERR_OK ) { return error; @@ -280,11 +274,7 @@ ivas_error ivas_ism_enc( /* set ACELP@12k8 / ACELP@16k flag for flexible ACELP core */ if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) { -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( st_ivas->ism_mode, IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); -#endif } else if ( st->low_rate_mode ) { @@ -292,11 +282,7 @@ ivas_error ivas_ism_enc( } else { -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( st_ivas->ism_mode, IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); -#endif } /* modify the coder_type depending on the total_brate per channel */ @@ -426,11 +412,7 @@ ivas_error ivas_ism_enc_config( st_ivas->nSCE = st_ivas->nchan_transport; st_ivas->nCPE = 0; -#ifdef ISM_16_KHZ_CORE - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, st_ivas->ism_mode, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->nchan_transport, st_ivas->hEncoderConfig->nchan_inp, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index a359e09100..a8c4982e4b 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -532,11 +532,7 @@ ivas_error ivas_ism_metadata_enc( * Configuration and decision about bitrates per channel *----------------------------------------------------------------*/ -#ifdef ISM_16_KHZ_CORE - if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_mode, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( ism_total_brate, nchan_transport, nchan_ism, hIsmMeta, ism_extended_metadata_flag, localVAD, ism_imp, element_brate, total_brate, nb_bits_metadata ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -647,11 +643,7 @@ ivas_error ivas_ism_metadata_enc_create( st_ivas->hIsmMetaData[ch]->last_true_radius = 1.0f; } -#ifdef ISM_16_KHZ_CORE - if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, st_ivas->ism_mode, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#else if ( ( error = ivas_ism_config( st_ivas->hEncoderConfig->ivas_total_brate, nchan_transport, n_ISms, NULL, 0, NULL, NULL, element_brate_tmp, NULL, NULL ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index b264ebc3bd..3dde94fd33 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -185,12 +185,7 @@ ivas_error ivas_sce_enc( &vad_hover_flag[0], &attack_flag[0], realBuffer[0], imagBuffer[0], old_wsp[0], pitch_fr[0], voicing_fr[0], &loc_harm[0], &cor_map_sum[0], &vad_flag_dtx[0], enerBuffer[0], fft_buff[0], A[0], lsp_new[0], currFlatness[0], 0, fr_bands, Etot_LR, lf_E, localVAD_HE_SAD, NULL, flag_16k_smc, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_flag : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->force_front_vad : 0, st_ivas->hSpar != NULL ? st_ivas->hSpar->front_vad_dtx_flag : 0, - st_ivas->hEncoderConfig->ivas_total_brate -#ifdef ISM_FB - , - ISM_MODE_NONE -#endif - ); + st_ivas->hEncoderConfig->ivas_total_brate ); if ( error != IVAS_ERR_OK ) { return error; @@ -228,19 +223,11 @@ ivas_error ivas_sce_enc( /* set ACELP@12k8 / ACELP@16k flag for flexible ACELP core */ if ( st->core_brate == SID_2k40 || st->core_brate == FRAME_NO_DATA ) { -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->core_brate, 0, 0, -1, -1 ); -#endif } else { -#ifdef ISM_16_KHZ_CORE - st->flag_ACELP16k = set_ACELP_flag( ISM_MODE_NONE, IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); -#else st->flag_ACELP16k = set_ACELP_flag( IVAS_SCE, hSCE->element_brate, st->total_brate, 0, 0, -1, -1 ); -#endif } /* modify the coder_type depending on the total_brate per channel */ -- GitLab From cb33d3a3c0e16cbedc8cedaef17ab6c8fff2b0ee Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Wed, 7 Jun 2023 16:57:23 +0300 Subject: [PATCH 300/381] Fix issue 541. Adapt function calls correctly in paramBin for EXTERNAL_ORIENTATIONS switch. --- lib_com/options.h | 1 + lib_rend/ivas_dirac_dec_binaural_functions.c | 18 ++++++++++++++++-- lib_rend/lib_rend.c | 10 +++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4328602f5a..82b5866eec 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -172,6 +172,7 @@ #define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ +#define FIX_541_EXT_REND_MASA_ROTATIONS /* Nokia: Issue 541, rotations missing in masa external renderer */ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 2eefb0e1d3..36e83bf718 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -414,7 +414,11 @@ void ivas_dirac_dec_binaural_render( for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * hDirAC->subframe_nbslots[subframe_idx]; +#ifdef EXTERNAL_ORIENTATIONS ivas_dirac_dec_binaural_internal( st_ivas, st_ivas->hCombinedOrientationData, output_f_local, nchan_transport, subframe_idx ); +#else + ivas_dirac_dec_binaural_internal( st_ivas, output_f_local, nchan_transport, subframe_idx ); +#endif for ( ch = 0; ch < nchan_out; ch++ ) { output_f_local[ch] += n_samples_sf; @@ -712,7 +716,12 @@ static void ivas_dirac_dec_binaural_internal( } #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe, st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); + ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe, +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 ); +#else + st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); +#endif #else ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe ); #endif @@ -731,7 +740,12 @@ static void ivas_dirac_dec_binaural_internal( } #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH - ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat, st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); + ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat, +#ifdef EXTERNAL_ORIENTATIONS + hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 ); +#else + st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); +#endif #else ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat ); #endif diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index e9d9448161..4659f94da8 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -6415,7 +6415,7 @@ static ivas_error renderActiveInputsMasa( IVAS_REND_HANDLE hIvasRend, IVAS_REND_AudioBuffer outAudio ) { - int16_t i; + int16_t i, sf_idx; input_masa *pCurrentInput; ivas_error error; @@ -6427,6 +6427,14 @@ static ivas_error renderActiveInputsMasa( continue; } +#ifdef FIX_541_EXT_REND_MASA_ROTATIONS + for ( sf_idx = 0; sf_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; ++sf_idx ) + { + pCurrentInput->decDummy->hHeadTrackData->Quaternions[sf_idx] = hIvasRend->headRotData.headPositions[sf_idx]; + pCurrentInput->decDummy->hHeadTrackData->Pos[sf_idx] = hIvasRend->headRotData.Pos[sf_idx]; + } +#endif + if ( ( error = renderInputMasa( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) { return error; -- GitLab From 8678a9664ec66650ad8a0948e872546ecaac7430 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Wed, 7 Jun 2023 17:09:34 +0300 Subject: [PATCH 301/381] Wrap variable with switch --- lib_rend/lib_rend.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 4659f94da8..5fafee3b72 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -6415,9 +6415,12 @@ static ivas_error renderActiveInputsMasa( IVAS_REND_HANDLE hIvasRend, IVAS_REND_AudioBuffer outAudio ) { - int16_t i, sf_idx; + int16_t i; input_masa *pCurrentInput; ivas_error error; +#ifdef FIX_541_EXT_REND_MASA_ROTATIONS + int16_t sf_idx; +#endif for ( i = 0, pCurrentInput = hIvasRend->inputsMasa; i < RENDERER_MAX_MASA_INPUTS; ++i, ++pCurrentInput ) { -- GitLab From 5b03dcf50c676474b6382d4da8f5b08320ffb23c Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 17:12:29 +0200 Subject: [PATCH 302/381] fix uninitialized parameter --- lib_dec/ivas_cpe_dec.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 948b475c74..8db688760d 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -688,6 +688,9 @@ ivas_error create_cpe_dec( st->total_brate = hCPE->element_brate / ( CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; +#ifdef ISM_25k6_HZ_CORE + st->is_ism_format = 0; +#endif if ( ( error = init_decoder( st, n, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) { -- GitLab From c653487059eacc0ff6a81966440182cef47d771e Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 17:26:41 +0200 Subject: [PATCH 303/381] Fix build when VARIABLE_SPEED_DECODING is under DEBUGGING and deactivated. --- apps/decoder.c | 10 ++++------ lib_com/options.h | 4 +++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index da56077639..320b57adfd 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -440,14 +440,17 @@ int main( if ( arg.voipMode ) { +#ifdef VARIABLE_SPEED_DECODING if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VOIP, 100, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) +#else + if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) +#endif { fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); goto cleanup; } } #ifdef VARIABLE_SPEED_DECODING -#ifdef DEBUGGING else if ( arg.variableSpeedMode ) { if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, IVAS_DEC_VOIP_MODE_VARIABLE_SPEED, arg.tsmScale, 60, arg.inputFormat ) ) != IVAS_ERR_OK ) @@ -457,7 +460,6 @@ int main( } } #endif -#endif #ifdef DEBUGGING /*-----------------------------------------------------------------* @@ -491,7 +493,6 @@ int main( IVAS_DEC_PrintConfigWithBitstream( hIvasDec, arg.quietModeEnabled, bit_stream, num_bits ); #ifdef VARIABLE_SPEED_DECODING -#ifdef DEBUGGING if ( arg.variableSpeedMode ) { if ( arg.tsmScaleFileEnabled ) @@ -503,7 +504,6 @@ int main( fprintf( stdout, "Variable speed factor: %i\n", arg.tsmScale ); } } -#endif #endif } @@ -688,7 +688,6 @@ int main( error = decodeVoIP( arg, hBsReader, hIvasDec ); } #ifdef VARIABLE_SPEED_DECODING -#ifdef DEBUGGING else if ( arg.variableSpeedMode ) { error = decodeVariableSpeed( arg, hBsReader, headRotReader, @@ -697,7 +696,6 @@ int main( #endif refRotReader, referenceVectorReader, hIvasDec ); } -#endif #endif else { diff --git a/lib_com/options.h b/lib_com/options.h index 4328602f5a..a387afee57 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -128,6 +128,9 @@ //#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ #define DEBUG_JBM_CMD_OPTION /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ #endif + +#define VARIABLE_SPEED_DECODING /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ + /* #################### End DEBUGGING switches ############################ */ /* ################# Start DEVELOPMENT switches ######################## */ @@ -145,7 +148,6 @@ #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ #define UPDATE_SBA_FILTER /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ -#define VARIABLE_SPEED_DECODING /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ -- GitLab From b01dae3e853f9fa9b0f593adecb2ab1dd3ef7f49 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Wed, 7 Jun 2023 18:02:03 +0200 Subject: [PATCH 304/381] clang --- lib_rend/lib_rend.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 1e56307c3c..fbc98d17ec 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4954,7 +4954,7 @@ static ivas_error renderIsmToBinauralRoom( #ifdef EXTERNAL_ORIENTATIONS combinedOrientationEnabled ) #else - headRotData->headRotEnabled ) + headRotData->headRotEnabled ) #endif // EXTERNAL_ORIENTATIONS { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); @@ -5007,12 +5007,12 @@ static ivas_error renderIsmToBinauralRoom( } } #else - quat.w = headRotData->headPositions[subframe_idx].w; - quat.x = headRotData->headPositions[subframe_idx].x; - quat.y = headRotData->headPositions[subframe_idx].y; - quat.z = headRotData->headPositions[subframe_idx].z; + quat.w = headRotData->headPositions[subframe_idx].w; + quat.x = headRotData->headPositions[subframe_idx].x; + quat.y = headRotData->headPositions[subframe_idx].y; + quat.z = headRotData->headPositions[subframe_idx].z; - QuatToRotMat( quat, Rmat ); + QuatToRotMat( quat, Rmat ); #endif } (void) subframe_len; // avoid warning -- GitLab From eb46e7e6a505827e1c011757693345d5d0944c78 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Wed, 7 Jun 2023 18:10:34 +0200 Subject: [PATCH 305/381] clang --- lib_rend/lib_rend.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index fbc98d17ec..6a46fc681a 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5025,7 +5025,7 @@ static ivas_error renderIsmToBinauralRoom( #ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) #else - if ( headRotData->headRotEnabled ) + if ( headRotData->headRotEnabled ) #endif { rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 ); @@ -5038,8 +5038,8 @@ static ivas_error renderIsmToBinauralRoom( ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, #else - ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, - ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, + ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, + ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, #endif previousPanGains ) ) != IVAS_ERR_OK ) { @@ -5093,11 +5093,11 @@ static ivas_error renderIsmToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #else - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif { return error; @@ -5602,9 +5602,9 @@ static ivas_error renderMcToBinauralRoom( #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( mcInput->hReverb != NULL && outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( #ifdef EXTERNAL_ORIENTATIONS - combinedOrientationEnabled + combinedOrientationEnabled #else - headRotEnabled + headRotEnabled #endif // EXTERNAL_ORIENTATIONS #else if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( @@ -5612,9 +5612,9 @@ static ivas_error renderMcToBinauralRoom( combinedOrientationEnabled #else headRotEnabled -#endif //EXTERNAL_ORIENTATIONS +#endif // EXTERNAL_ORIENTATIONS #endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) + && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); -- GitLab From 8ba8f7002220a69063132d9f9837ea18985e5548 Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 Jun 2023 18:20:05 +0200 Subject: [PATCH 306/381] fix crash to due low_rate vs. TCX mismatch --- lib_enc/ivas_decision_matrix_enc.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib_enc/ivas_decision_matrix_enc.c b/lib_enc/ivas_decision_matrix_enc.c index f182a28a32..a8a220641d 100644 --- a/lib_enc/ivas_decision_matrix_enc.c +++ b/lib_enc/ivas_decision_matrix_enc.c @@ -170,6 +170,12 @@ void ivas_decision_matrix_enc( st->core = ACELP_CORE; st->coder_type = AUDIO; st->sp_aud_decision2 = 0; +#ifdef ISM_25k6_HZ_CORE + if ( st->low_rate_mode ) + { + st->coder_type = INACTIVE; + } +#endif } } @@ -224,6 +230,13 @@ void ivas_decision_matrix_enc( st->core = ACELP_CORE; st->coder_type = AUDIO; st->sp_aud_decision2 = 0; + +#ifdef ISM_25k6_HZ_CORE + if ( st->low_rate_mode ) + { + st->coder_type = INACTIVE; + } +#endif } } #endif -- GitLab From 520cd74f0175474974e19f373208374399b23ac1 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Wed, 7 Jun 2023 18:45:54 +0200 Subject: [PATCH 307/381] clang --- lib_rend/lib_rend.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 6a46fc681a..191cc8f388 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4954,7 +4954,7 @@ static ivas_error renderIsmToBinauralRoom( #ifdef EXTERNAL_ORIENTATIONS combinedOrientationEnabled ) #else - headRotData->headRotEnabled ) + headRotData->headRotEnabled ) #endif // EXTERNAL_ORIENTATIONS { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); @@ -4982,7 +4982,7 @@ static ivas_error renderIsmToBinauralRoom( #ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) #else - if ( headRotData->headRotEnabled ) + if ( headRotData->headRotEnabled ) #endif // EXTERNAL_ORIENTATIONS { subframe_len = ismInput->base.inputBuffer.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; @@ -5038,8 +5038,8 @@ static ivas_error renderIsmToBinauralRoom( ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, #else - ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, - ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, + ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, + ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, #endif previousPanGains ) ) != IVAS_ERR_OK ) { @@ -5050,7 +5050,7 @@ static ivas_error renderIsmToBinauralRoom( #ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) #else - if ( headRotData->headRotEnabled ) + if ( headRotData->headRotEnabled ) #endif { rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 ); @@ -5063,8 +5063,8 @@ static ivas_error renderIsmToBinauralRoom( ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, #else - ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, - ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, + ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, + ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, #endif currentPanGains ) ) != IVAS_ERR_OK ) { @@ -5093,8 +5093,8 @@ static ivas_error renderIsmToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #else if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) @@ -5600,7 +5600,7 @@ static ivas_error renderMcToBinauralRoom( #endif #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ( mcInput->hReverb != NULL && outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( + if ( ( mcInput->hReverb != NULL && outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( #ifdef EXTERNAL_ORIENTATIONS combinedOrientationEnabled #else -- GitLab From 23b818fc1fda7ce3821f496d0d95bb82540c21c8 Mon Sep 17 00:00:00 2001 From: Remco Stoutjesdijk Date: Wed, 7 Jun 2023 18:56:51 +0200 Subject: [PATCH 308/381] clang --- lib_rend/lib_rend.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 191cc8f388..cf427c5856 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5096,8 +5096,8 @@ static ivas_error renderIsmToBinauralRoom( if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #else - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) #endif { return error; -- GitLab From a158bf87e72e4c0fd3b7fb5ae9cf8963e74b6d02 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 8 Jun 2023 08:22:09 +0200 Subject: [PATCH 309/381] fix compilation without DEBUGGING --- lib_com/options.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index a387afee57..7e686876a2 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -127,10 +127,11 @@ /*#define DEBUG_BINAURAL_FILTER_DESIGN*/ /* debugging of Crend binaural filter design */ //#define DEBUG_AGC_ENCODER_CMD_OPTION /* Ability to force enable or disable AGC behaviour in DIRAC/SPAR via command line option */ #define DEBUG_JBM_CMD_OPTION /* ability for telling the decoder the frontend fetch size and to not delay compensate for bad frames at the beginning */ -#endif #define VARIABLE_SPEED_DECODING /* variable speed decoding employing the JBM functioniality; move to DEBUGGING after build for disabled is fixed */ +#endif + /* #################### End DEBUGGING switches ############################ */ /* ################# Start DEVELOPMENT switches ######################## */ -- GitLab From 1ba9e4adc5a6fc19f88d2b105809d1f0224cac55 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Thu, 8 Jun 2023 10:16:47 +0300 Subject: [PATCH 310/381] Copy head rotations only in binarual rendering in ext masa path --- lib_rend/lib_rend.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 5fafee3b72..3a1077f5a6 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -6431,10 +6431,13 @@ static ivas_error renderActiveInputsMasa( } #ifdef FIX_541_EXT_REND_MASA_ROTATIONS - for ( sf_idx = 0; sf_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; ++sf_idx ) + if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL && pCurrentInput->decDummy->hHeadTrackData != NULL ) { - pCurrentInput->decDummy->hHeadTrackData->Quaternions[sf_idx] = hIvasRend->headRotData.headPositions[sf_idx]; - pCurrentInput->decDummy->hHeadTrackData->Pos[sf_idx] = hIvasRend->headRotData.Pos[sf_idx]; + for ( sf_idx = 0; sf_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; ++sf_idx ) + { + pCurrentInput->decDummy->hHeadTrackData->Quaternions[sf_idx] = hIvasRend->headRotData.headPositions[sf_idx]; + pCurrentInput->decDummy->hHeadTrackData->Pos[sf_idx] = hIvasRend->headRotData.Pos[sf_idx]; + } } #endif -- GitLab From 791f0e91b71ec2725268fbb95faabed43c6a60b1 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 8 Jun 2023 13:04:51 +0200 Subject: [PATCH 311/381] fix issue 528: ISM Metadata file too short; under FIX_528_ISM_MD_FILE_TOO_SHORT --- lib_com/options.h | 3 +++ lib_util/ism_file_reader.c | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 4328602f5a..ad0ec5aef3 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -175,6 +175,9 @@ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ +#define FIX_528_ISM_MD_FILE_TOO_SHORT /* VA: issue 528: ISM Metadata file too short */ + + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index 7054d2081b..a898651362 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -113,6 +113,13 @@ ivas_error IsmFileReader_readNextFrame( file = self->file; +#ifdef FIX_528_ISM_MD_FILE_TOO_SHORT + while ( feof( self->file ) ) + { + rewind( self->file ); + } +#endif + if ( fgets( char_buff, META_LINE_LENGTH, file ) == NULL ) { return IVAS_ERR_FAILED_FILE_READ; -- GitLab From 267f5c24f916f0c8167f88c4ea2415dc254bd960 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 9 Jun 2023 09:02:41 +0200 Subject: [PATCH 312/381] fix: BWD output not employed at high bitrates --- lib_com/options.h | 5 ++++- lib_enc/bw_detect.c | 47 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 5e475705b1..7ad3f7214c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,12 +170,15 @@ #define FIX_122_MC_DECODER_COMPLEXITY /* FhG: Issue 122, significant decrease of worst case MC decoder complexity */ #define FIX_531_BWS_ISM_BFI /* VA: issue 531: fix MemorySanitizer: use-of-uninitialized-value in ISM2 rate switching with frame errors */ #define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ -#define FIX_529_BWD_ISSUE /* VA: issue 529: fix Bandwidth Detector not working reliably for Music and Generic Audio */ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ +#define FIX_529_BWD_ISSUE /* VA: issue 529: fix Bandwidth Detector not working reliably for Music and Generic Audio */ + + + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 4358355138..79cb67636e 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -52,6 +52,13 @@ * Local constants *-------------------------------------------------------------------*/ +#ifdef FIX_529_BWD_ISSUE +#define BWD_MIN_BRATE_WIDER_BW_MDCT IVAS_48k +#define BWD_MIN_BRATE_WIDER_BW_ISM IVAS_32k +#define BWD_MAX_BRATE_WIDER_BW_MDCT IVAS_80k +#define BWD_MAX_BRATE_WIDER_BW_ISM IVAS_64k +#endif + #define ALPHA_BWD 0.75f #define BWD_LT_THRESH 0.6f @@ -62,10 +69,10 @@ #define CLDFB_ENER_OFFSET 1.6f /*-------------------------------------------------------------------* - * bw_detect() - * - * bandwidth detector - *-------------------------------------------------------------------*/ + * bw_detect() + * + * bandwidth detector + *-------------------------------------------------------------------*/ void bw_detect( Encoder_State *st, /* i/o: Encoder State */ @@ -89,7 +96,8 @@ void bw_detect( bwd_count_wider_bw = BWD_COUNT_WIDER_BW; #ifdef FIX_529_BWD_ISSUE - if ( st->ini_frame > 0 && ( st->element_mode == IVAS_CPE_MDCT || ivas_format == ISM_FORMAT ) && ( st->element_brate >= IVAS_48k || mct_on ) ) + if ( st->ini_frame > 0 && ( ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate >= BWD_MIN_BRATE_WIDER_BW_MDCT || mct_on ) ) || + ( ivas_format == ISM_FORMAT && st->element_brate >= BWD_MIN_BRATE_WIDER_BW_ISM ) ) ) #else if ( st->element_mode == IVAS_CPE_MDCT && ( st->element_brate > IVAS_64k || mct_on ) ) #endif @@ -583,6 +591,12 @@ void set_bw( { st->bwidth = SWB; } +#ifdef FIX_529_BWD_ISSUE + else if ( element_brate > BWD_MAX_BRATE_WIDER_BW_ISM ) + { + st->bwidth = st->max_bwidth; + } +#endif } /* element_mode == EVS_MONO */ else if ( total_brate <= ACELP_9k60 && st->bwidth > WB ) @@ -640,7 +654,15 @@ void set_bw_stereo( { Encoder_State **sts = hCPE->hCoreCoder; - if ( hCPE->element_mode == IVAS_CPE_MDCT ) +#ifdef FIX_529_BWD_ISSUE + if ( sts[0]->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT || sts[1]->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT ) + { + sts[0]->bwidth = sts[0]->max_bwidth; + sts[1]->bwidth = sts[1]->max_bwidth; + } + else +#endif + if ( hCPE->element_mode == IVAS_CPE_MDCT ) { /* ensure that both CPE channels have the same audio band-width */ if ( sts[0]->input_bwidth == sts[1]->input_bwidth ) @@ -685,8 +707,7 @@ int16_t set_bw_mct( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = hCPE[cpe_id]->hCoreCoder[ch]; - if ( - st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } @@ -695,6 +716,16 @@ int16_t set_bw_mct( } } +#ifdef FIX_529_BWD_ISSUE + for ( cpe_id = 0; cpe_id < nCPE; cpe_id++ ) + { + if ( hCPE[cpe_id]->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT ) + { + mct_bwidth = max( mct_bwidth, hCPE[cpe_id]->hCoreCoder[0]->max_bwidth ); + } + } +#endif + bw_changed = 0; if ( mct_bwidth != last_mct_bwidth ) { -- GitLab From 947a0241d6caf48ec2421e5f0e62bc64861ee5a7 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 9 Jun 2023 07:26:52 +0000 Subject: [PATCH 313/381] bool -> int16_t data type change --- lib_dec/ivas_stat_dec.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index e63f6c3e43..415734d1b6 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -800,10 +800,11 @@ typedef struct ivas_mc_paramupmix_dec_data_structure float beta_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; int32_t alpha_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; int32_t beta_quant[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; - bool first_frame; + int16_t first_frame; float *pcm_delay[MC_PARAMUPMIX_MAX_TRANSPORT_CHANS]; } MC_PARAMUPMIX_DEC_DATA, *MC_PARAMUPMIX_DEC_HANDLE; + /*------------------------------------------------------------------------------------------* * SPAR decoder structures *------------------------------------------------------------------------------------------*/ -- GitLab From 672200b8eed25fe0751fe2340c2ee89f8164acf5 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 9 Jun 2023 07:27:41 +0000 Subject: [PATCH 314/381] bool -> int16_t data type change --- lib_enc/ivas_stat_enc.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 4f2f375af7..f8b57b49ff 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -736,6 +736,7 @@ typedef struct ivas_param_mc_enc_data_structure /*----------------------------------------------------------------------------------* * MC ParamUpmix Mode encoder structures *----------------------------------------------------------------------------------*/ + typedef struct ivas_mc_paramupmix_enc_data_structure { ivas_trans_det_state_t *hTranDet[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; @@ -746,7 +747,8 @@ typedef struct ivas_mc_paramupmix_enc_data_structure float *midside[MC_PARAMUPMIX_COMBINATIONS][MC_PARAMUPMIX_NCH]; /* hold PCM of mid-side data */ int32_t alpha_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; int32_t beta_quant_prev[MC_PARAMUPMIX_COMBINATIONS][IVAS_MAX_NUM_BANDS]; - bool first_frame; + int16_t first_frame; + } MC_PARAMUPMIX_ENC_DATA, *MC_PARAMUPMIX_ENC_HANDLE; /*----------------------------------------------------------------------------------* -- GitLab From 477a5852e8176a8dbb32dfa6e295ec01faffa6b6 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 9 Jun 2023 09:44:18 +0200 Subject: [PATCH 315/381] address issues reported in #543; under BINAURAL_AUDIO_CMDLINE --- apps/encoder.c | 23 ++++++++++------------- lib_com/options.h | 2 +- lib_enc/ivas_stat_enc.h | 2 +- lib_enc/lib_enc.c | 30 ++++++++++++++++-------------- 4 files changed, 28 insertions(+), 29 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 1dc0aead51..10fd12a94b 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -1225,16 +1225,6 @@ static bool parseCmdlIVAS_enc( * IVAS Formats *-----------------------------------------------------------------*/ -#ifdef BINAURAL_AUDIO_CMDLINE - else if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 ) - { - i++; - if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 ) - { - arg->is_binaural = true; - } - } -#endif else if ( strcmp( argv_to_upper, "-STEREO" ) == 0 ) { i++; @@ -1312,6 +1302,13 @@ static bool parseCmdlIVAS_enc( } #endif /* DEBUGGING */ } +#ifdef BINAURAL_AUDIO_CMDLINE + else if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 ) + { + arg->is_binaural = true; + i++; + } +#endif else if ( strcmp( argv_to_upper, "-ISM" ) == 0 ) { arg->inputFormat = IVAS_ENC_INPUT_ISM; @@ -1703,9 +1700,6 @@ static void usage_enc( void ) fprintf( stdout, "Options:\n" ); fprintf( stdout, "--------\n" ); fprintf( stdout, "EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, -masa, -mc\n" ); -#ifdef BINAURAL_AUDIO_CMDLINE - fprintf( stdout, "-binaural : Optional indication that input is binaural audio (to be used with -stereo or -stereo_dmx_evs)\n" ); -#endif fprintf( stdout, "-stereo : Stereo format \n" ); fprintf( stdout, "-ism (+)Ch Files : ISM format \n" ); fprintf( stdout, " where Ch specifies the number of ISMs (1-4)\n" ); @@ -1737,6 +1731,9 @@ static void usage_enc( void ) fprintf( stdout, " alternatively, B can be a text file where each line contains \"nb_frames B\"\n" ); fprintf( stdout, "-no_delay_cmp : Turn off delay compensation\n" ); fprintf( stdout, "-stereo_dmx_evs : Activate stereo downmix function for EVS.\n" ); +#ifdef BINAURAL_AUDIO_CMDLINE + fprintf( stdout, "-binaural : Optional indication that input is binaural audio (to be used with -stereo or -stereo_dmx_evs)\n" ); +#endif fprintf( stdout, "-mime : Mime output bitstream file format\n" ); fprintf( stdout, " The encoder produces TS26.445 Annex.2.6 Mime Storage Format, (not RFC4867 Mime Format).\n" ); fprintf( stdout, " default output bitstream file format is G.192\n" ); diff --git a/lib_com/options.h b/lib_com/options.h index 4328602f5a..223c6a6404 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,7 +163,7 @@ #define FIX_TODO_FD_CNG_SBA_CLEANUP /* FhG: BE, address TODO comment in fd_cng_enc */ #define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ -#define BINAURAL_AUDIO_CMDLINE +#define BINAURAL_AUDIO_CMDLINE /* issue 491: Implement Commandline-Option for Binaural Audio */ #define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ #define FIX_506 /* FhG: Compiler warnings */ #define FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH /* Nokia: Issue 511, significant optimization of parametric binauralizer gain fetching. */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 4f2f375af7..23d0acbe93 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1084,7 +1084,7 @@ typedef struct encoder_config_structure int16_t max_bwidth; /* maximum encoded bandwidth */ IVAS_FORMAT ivas_format; /* IVAS format */ #ifdef BINAURAL_AUDIO_CMDLINE - bool is_binaural; /* flag indicating if input is binaural audio */ + int16_t is_binaural; /* flag indicating if input is binaural audio */ #endif int16_t element_mode_init; /* element mode used at initialization */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 472497bea5..2eb9e6ec3c 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -283,7 +283,7 @@ ivas_error IVAS_ENC_ConfigureForMono( hIvasEnc->st_ivas->hEncoderConfig->ivas_format = MONO_FORMAT; #ifdef BINAURAL_AUDIO_CMDLINE - hIvasEnc->st_ivas->hEncoderConfig->is_binaural = is_binaural; + hIvasEnc->st_ivas->hEncoderConfig->is_binaural = (int16_t) is_binaural; #endif if ( downmixFromStereo ) @@ -337,7 +337,7 @@ ivas_error IVAS_ENC_ConfigureForStereo( hEncoderConfig->nchan_inp = 2; hEncoderConfig->ivas_format = STEREO_FORMAT; #ifdef BINAURAL_AUDIO_CMDLINE - hEncoderConfig->is_binaural = is_binaural; + hEncoderConfig->is_binaural = (int16_t) is_binaural; #endif #ifdef DEBUGGING @@ -933,6 +933,13 @@ static ivas_error configureEncoder( return error; } +#ifdef BINAURAL_AUDIO_CMDLINE + if ( hEncoderConfig->is_binaural && !( ( hEncoderConfig->ivas_format == MONO_FORMAT && hEncoderConfig->stereo_dmx_evs ) || hEncoderConfig->ivas_format == STEREO_FORMAT ) ) + { + return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "'-binaural' option is supported only with '-stereo' or '-stereo_dmx_evs'" ); + } +#endif + /*-----------------------------------------------------------------* * Finalize initialization *-----------------------------------------------------------------*/ @@ -1540,12 +1547,6 @@ static ivas_error printConfigInfo_enc( if ( hEncoderConfig->stereo_dmx_evs ) { fprintf( stdout, "IVAS format: stereo downmix to bit-exact EVS mono\n" ); -#ifdef BINAURAL_AUDIO_CMDLINE - if ( hEncoderConfig->is_binaural ) - { - fprintf( stdout, "Optional indication: binaural audio\n" ); - } -#endif } else { @@ -1580,12 +1581,6 @@ static ivas_error printConfigInfo_enc( { fprintf( stdout, "IVAS format: stereo - MDCT stereo\n" ); } -#endif -#ifdef BINAURAL_AUDIO_CMDLINE - if ( hEncoderConfig->is_binaural ) - { - fprintf( stdout, "Optional indication: binaural audio\n" ); - } #endif } else if ( hEncoderConfig->ivas_format == ISM_FORMAT ) @@ -1654,6 +1649,13 @@ static ivas_error printConfigInfo_enc( } } +#ifdef BINAURAL_AUDIO_CMDLINE + if ( hEncoderConfig->is_binaural ) + { + fprintf( stdout, "Optional indication: binaural audio\n" ); + } +#endif + /*-----------------------------------------------------------------* * Print CNG update interval, if DTX is activated *-----------------------------------------------------------------*/ -- GitLab From fa225a5faade0f49ca83ae402cef4094ef2e9417 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 9 Jun 2023 10:00:56 +0200 Subject: [PATCH 316/381] add initialization of 'hEncoderConfig->is_binaural' parameter --- lib_enc/lib_enc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 2eb9e6ec3c..2668eed044 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -2325,6 +2325,9 @@ static void init_encoder_config( hEncoderConfig->nchan_inp = 1; hEncoderConfig->element_mode_init = EVS_MONO; hEncoderConfig->ivas_format = UNDEFINED_FORMAT; +#ifdef BINAURAL_AUDIO_CMDLINE + hEncoderConfig->is_binaural = 0; +#endif hEncoderConfig->Opt_SC_VBR = 0; hEncoderConfig->last_Opt_SC_VBR = 0; hEncoderConfig->Opt_AMR_WB = 0; -- GitLab From 983ce5631179a29a36ecd98d2aebd8ff959f1884 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 9 Jun 2023 10:05:09 +0200 Subject: [PATCH 317/381] clang-format --- lib_enc/ivas_stat_enc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index f8b57b49ff..4e1f37d27d 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -736,7 +736,7 @@ typedef struct ivas_param_mc_enc_data_structure /*----------------------------------------------------------------------------------* * MC ParamUpmix Mode encoder structures *----------------------------------------------------------------------------------*/ - + typedef struct ivas_mc_paramupmix_enc_data_structure { ivas_trans_det_state_t *hTranDet[MC_PARAMUPMIX_COMBINATIONS * MC_PARAMUPMIX_NCH]; -- GitLab From 284f16d44dde4e6b838e61d15ac8a18b7c15c69c Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Fri, 9 Jun 2023 14:16:42 +0300 Subject: [PATCH 318/381] Further fixes/adjustments for EXTERNAL_ORIENTATIONS switch --- lib_com/ivas_prot.h | 3 ++- lib_dec/ivas_binRenderer_internal.c | 30 +++++++++++++++----------- lib_dec/ivas_dirac_dec.c | 27 ++++++++++++++++++----- lib_dec/ivas_ism_param_dec.c | 9 ++++++-- lib_dec/ivas_ism_renderer.c | 21 +++++++++++++++++- lib_dec/ivas_jbm_dec.c | 12 +++++++++++ lib_dec/ivas_mc_param_dec.c | 16 ++++++++++++-- lib_dec/ivas_objectRenderer_internal.c | 7 ++++-- lib_dec/ivas_output_config.c | 29 ++++++++++++++++++++++++- lib_rend/ivas_objectRenderer.c | 7 ++++-- lib_rend/ivas_prot_rend.h | 4 +++- lib_rend/ivas_rotation.c | 16 ++++++++++++-- lib_rend/ivas_stat_rend.h | 2 ++ lib_rend/lib_rend.c | 14 ++++++++---- 14 files changed, 161 insertions(+), 36 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index b4759ee720..a1950170a2 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5159,10 +5159,11 @@ void ivas_binaural_cldfb_sf( #endif void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ #ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ int16_t subframe_idx, /* i : subframe index */ +#else + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ #endif const int16_t numTimeSlots, /* i: : number of time slots to process */ float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 074a7c3cdb..c829473ce9 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1041,7 +1041,7 @@ void ivas_binaural_cldfb( /* Implement binaural rendering */ #ifdef EXTERNAL_ORIENTATIONS - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframeIdx, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, subframeIdx, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #endif @@ -1137,7 +1137,7 @@ void ivas_binaural_cldfb_sf( /* Implement binaural rendering */ #ifdef EXTERNAL_ORIENTATIONS - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hCombinedOrientationData, subframeIdx, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); + ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, subframeIdx, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #else ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); #endif @@ -1175,10 +1175,11 @@ void ivas_binaural_cldfb_sf( void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ #ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ int16_t subframe_idx, /* i : subframe index */ +#else + HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ #endif const int16_t numTimeSlots, /* i : number of time slots to render*/ float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ @@ -1203,34 +1204,37 @@ void ivas_binRenderer( } /* Head rotation in HOA3 or CICPx */ - if ( hHeadTrackData + if ( #ifdef EXTERNAL_ORIENTATIONS - && hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] + hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] #else - && hHeadTrackData->num_quaternions >= 0 + hHeadTrackData && hHeadTrackData->num_quaternions >= 0 #endif && hBinRenderer->rotInCldfb ) { if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) { /* Rotation in SHD (HOA3) */ - if ( hHeadTrackData->shd_rot_max_order == -1 ) - { #ifdef EXTERNAL_ORIENTATIONS + if ( hCombinedOrientationData->shd_rot_max_order == -1 ) + { rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); + } + else if ( hCombinedOrientationData->shd_rot_max_order > 0 ) + { + rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hCombinedOrientationData->shd_rot_max_order ); + } #else + if ( hHeadTrackData->shd_rot_max_order == -1 ) + { QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); -#endif } else if ( hHeadTrackData->shd_rot_max_order > 0 ) { -#ifdef EXTERNAL_ORIENTATIONS - rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order ); -#else rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order ); -#endif } +#endif } else { diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 5877dc4738..0524ceef70 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2627,7 +2627,7 @@ void ivas_dirac_dec_render_sf( } #ifdef EXTERNAL_ORIENTATIONS - if ( st_ivas->hHeadTrackData && st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] ) + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] ) #else if ( st_ivas->hHeadTrackData ) #endif @@ -2640,7 +2640,11 @@ void ivas_dirac_dec_render_sf( p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; #endif +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) +#else if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) +#endif { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; #ifdef FIX_393_459_460_SBA_MD @@ -2714,7 +2718,7 @@ void ivas_dirac_dec_render_sf( } } #ifdef EXTERNAL_ORIENTATIONS - if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 1 ) #else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) #endif @@ -2731,7 +2735,11 @@ void ivas_dirac_dec_render_sf( #endif md_idx, surCohRatio, +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData->shd_rot_max_order, +#else st_ivas->hHeadTrackData->shd_rot_max_order, +#endif p_Rmat, hodirac_flag ); } @@ -2821,7 +2829,7 @@ void ivas_dirac_dec_render_sf( if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { #ifdef EXTERNAL_ORIENTATIONS - if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) #else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) #endif @@ -2907,7 +2915,11 @@ void ivas_dirac_dec_render_sf( #ifdef FIX_393_459_460_SBA_MD mvs2s( &hDirAC->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); mvs2s( &hDirAC->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); +#ifdef EXTERNAL_ORIENTATIONS + if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) +#else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) +#endif { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); @@ -3072,7 +3084,7 @@ void ivas_dirac_dec_render_sf( /*Compute PSDs*/ #ifdef EXTERNAL_ORIENTATIONS - if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) #else if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) #endif @@ -3089,7 +3101,11 @@ void ivas_dirac_dec_render_sf( diffuseness_vector[slot_idx], #endif hDirAC, +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData->shd_rot_max_order, +#else st_ivas->hHeadTrackData->shd_rot_max_order, +#endif p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, @@ -3241,10 +3257,11 @@ void ivas_dirac_dec_render_sf( { /* Perform binaural rendering */ ivas_binRenderer( st_ivas->hBinRenderer, - st_ivas->hHeadTrackData, #ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData, subframe_idx, +#else + st_ivas->hHeadTrackData, #endif hDirAC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural, diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 7bbad7aa99..04d59cfdd7 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -991,8 +991,13 @@ void ivas_ism_dec_digest_tc( azimuth = (int16_t) floorf( st_ivas->hIsmMetaData[i]->azimuth + 0.5f ); elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); - if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && st_ivas->hHeadTrackData == NULL ) - { + if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData == NULL +#else + st_ivas->hHeadTrackData == NULL +#endif + ) { if ( st_ivas->hIntSetup.is_planar_setup ) { /* If no elevation support in output format, then rendering should be done with zero elevation */ diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 2362979ff6..6422c15d29 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -242,8 +242,10 @@ void ivas_ism_render_sf( int16_t azimuth, elevation; int16_t tc_offset; int16_t interp_offset; - float Rmat[3][3]; float gain, prev_gain; +#ifndef EXTERNAL_ORIENTATIONS + float Rmat[3][3]; +#endif num_objects = st_ivas->nchan_transport; nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; @@ -256,11 +258,16 @@ void ivas_ism_render_sf( set_f( output_f[i], 0.0f, n_samples_to_render ); } +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) + { +#else if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) { /* Calculate rotation matrix from the quaternion */ QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat ); +#endif ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator ); @@ -269,10 +276,18 @@ void ivas_ism_render_sf( for ( i = 0; i < num_objects; i++ ) { + +#ifdef EXTERNAL_ORIENTATIONS + /* Combined rotation: rotate the object positions depending the head and external orientations */ + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) + { + rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); +#else /* Head rotation: rotate the object positions depending the head's orientation */ if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); +#endif if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); @@ -301,7 +316,11 @@ void ivas_ism_render_sf( } /* update here only in case of head rotation */ +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) +#else if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) +#endif { st_ivas->hIsmRendererData->prev_gains[i][j] = gain; } diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index d1132aeaa6..b086001453 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -638,6 +638,18 @@ ivas_error ivas_jbm_dec_render( p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered]; } +#ifdef EXTERNAL_ORIENTATIONS + /*----------------------------------------------------------------* + * Combine orientations + *----------------------------------------------------------------*/ + + if ( ( error = combine_external_and_head_orientations_dec( st_ivas->hHeadTrackData, st_ivas->hExtOrientationData, + st_ivas->hCombinedOrientationData ) ) != IVAS_ERR_OK ) + { + return error; + } +#endif + /*----------------------------------------------------------------* * Rendering *----------------------------------------------------------------*/ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 78cdbfadc9..126f143467 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1583,7 +1583,11 @@ void ivas_param_mc_dec_render( { nchan_out_cldfb = BINAURAL_CHANNELS; set_s( channel_active, 1, nchan_out_cldfb ); +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hCombinedOrientationData ) +#else if ( st_ivas->hHeadTrackData ) +#endif { nchan_out_init = MAX_INTERN_CHANNELS; } @@ -1692,7 +1696,13 @@ void ivas_param_mc_dec_render( if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) { - if ( st_ivas->hHeadTrackData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + if ( +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData +#else + st_ivas->hHeadTrackData +#endif + && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); } @@ -1754,9 +1764,11 @@ void ivas_param_mc_dec_render( if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, + ivas_binRenderer( st_ivas->hBinRenderer, #ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData, subframe_idx, +#else + st_ivas->hHeadTrackData, #endif hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 9ba6351f63..087120d2e7 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -89,10 +89,12 @@ ivas_error ivas_td_binaural_renderer( #ifdef EXTERNAL_ORIENTATIONS ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation : NULL, ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->listenerPos : NULL, #else st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, + ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, #endif - ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, ism_md_subframe_update, output, output_frame ); + ism_md_subframe_update, output, output_frame ); } @@ -185,11 +187,12 @@ ivas_error ivas_td_binaural_renderer_sf( #ifdef EXTERNAL_ORIENTATIONS ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] : 0, ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, + ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->listenerPos : NULL ); #else st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? &st_ivas->hHeadTrackData->Quaternions[0] : NULL, -#endif ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL ); +#endif if ( ( st_ivas->hRenderConfig != NULL ) && ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) { diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 07beb88996..6be1af3503 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -71,10 +71,17 @@ void ivas_renderer_select( * Binaural rendering configurations *-----------------------------------------------------------------*/ +#ifdef EXTERNAL_ORIENTATIONS + if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) + { + st_ivas->hCombinedOrientationData->shd_rot_max_order = -1; + } +#else if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { st_ivas->hHeadTrackData->shd_rot_max_order = -1; } +#endif if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) { @@ -149,25 +156,45 @@ void ivas_renderer_select( *renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM; } - if ( st_ivas->hDecoderConfig->Opt_Headrotation ) + if ( st_ivas->hDecoderConfig->Opt_Headrotation +#ifdef EXTERNAL_ORIENTATIONS + || st_ivas->hDecoderConfig->Opt_ExternalOrientation +#endif + ) { nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); if ( nchan_internal == 2 ) { +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; +#else st_ivas->hHeadTrackData->shd_rot_max_order = 1; +#endif } else if ( nchan_internal == 4 || nchan_internal == 3 ) { +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; +#else st_ivas->hHeadTrackData->shd_rot_max_order = 0; +#endif } else if ( nchan_internal == 6 || nchan_internal == 5 ) { +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData->shd_rot_max_order = 2; +#else st_ivas->hHeadTrackData->shd_rot_max_order = 2; +#endif } else if ( nchan_internal == 8 || nchan_internal == 7 ) { +#ifdef EXTERNAL_ORIENTATIONS + st_ivas->hCombinedOrientationData->shd_rot_max_order = 3; +#else st_ivas->hHeadTrackData->shd_rot_max_order = 3; +#endif } } } diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index c0eeb1ef74..2b14732dbf 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -628,9 +628,10 @@ ivas_error ivas_td_binaural_renderer_ext( const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ +#else + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ #endif const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ @@ -697,11 +698,13 @@ ivas_error ivas_td_binaural_renderer_ext( #ifdef EXTERNAL_ORIENTATIONS ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, + ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->listenerPos : NULL, #else headRotData->headRotEnabled, ( headRotData != NULL ) ? headRotData->headPositions : NULL, + ( headRotData != NULL ) ? headRotData->Pos : NULL, #endif - ( headRotData != NULL ) ? headRotData->Pos : NULL, ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) + ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 8b0bf1f471..c89815568f 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -246,9 +246,10 @@ ivas_error ivas_td_binaural_renderer_ext( const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ +#else + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ #endif const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ @@ -888,6 +889,7 @@ ivas_error combine_external_and_head_orientations_rend( ivas_error combine_external_and_head_orientations( IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ + IVAS_VECTOR3 *listenerPos, /* i : listener position */ int16_t numHeadRotQuaternions, /* i : number of head rotation quaternions */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 7ab33cec89..58d4c7dc08 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -799,9 +799,11 @@ ivas_error ivas_combined_orientation_open( { int16_t i, j; IVAS_QUATERNION identity; + IVAS_VECTOR3 origo; identity.w = 1.0f; identity.x = identity.y = identity.z = 0.0f; + origo.x = origo.y = origo.z = 0.0f; /* Allocate handle */ if ( ( *hCombinedOrientationData = (COMBINED_ORIENTATION_HANDLE) malloc( sizeof( COMBINED_ORIENTATION_DATA ) ) ) == NULL ) @@ -827,6 +829,7 @@ ivas_error ivas_combined_orientation_open( ( *hCombinedOrientationData )->Quaternions[i] = identity; ( *hCombinedOrientationData )->Quaternions_prev_headRot[i] = identity; ( *hCombinedOrientationData )->Quaternions_prev_extOrientation[i] = identity; + ( *hCombinedOrientationData )->listenerPos[i] = origo; for ( j = 0; j < 3; j++ ) { @@ -885,6 +888,7 @@ ivas_error combine_external_and_head_orientations_dec( ) { IVAS_QUATERNION *headRotQuaternions = NULL; + IVAS_VECTOR3 *listenerPos = NULL; int16_t numHeadRotQuaternions = 0; if ( hHeadTrackData != NULL ) @@ -893,10 +897,11 @@ ivas_error combine_external_and_head_orientations_dec( if ( hHeadTrackData->num_quaternions >= 0 ) { headRotQuaternions = hHeadTrackData->Quaternions; + listenerPos = hHeadTrackData->Pos; } } - return combine_external_and_head_orientations( headRotQuaternions, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData ); + return combine_external_and_head_orientations( headRotQuaternions, listenerPos, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData ); } @@ -913,6 +918,7 @@ ivas_error combine_external_and_head_orientations_rend( ) { IVAS_QUATERNION *headRotQuaternions = NULL; + IVAS_VECTOR3 *listenerPos = NULL; int16_t numHeadRotQuaternions = 0; int16_t i; @@ -921,6 +927,7 @@ ivas_error combine_external_and_head_orientations_rend( if ( hHeadTrackData->headRotEnabled ) { headRotQuaternions = hHeadTrackData->headPositions; + listenerPos = hHeadTrackData->Pos; } } else if ( hExtOrientationData != NULL ) @@ -935,7 +942,7 @@ ivas_error combine_external_and_head_orientations_rend( } } - return combine_external_and_head_orientations( headRotQuaternions, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData ); + return combine_external_and_head_orientations( headRotQuaternions, listenerPos, numHeadRotQuaternions, hExtOrientationData, hCombinedOrientationData ); } @@ -948,6 +955,7 @@ ivas_error combine_external_and_head_orientations_rend( ivas_error combine_external_and_head_orientations( IVAS_QUATERNION *headRotQuaternions, /* i : quaternions for head rotation */ + IVAS_VECTOR3 *listenerPos, /* i : listener position */ int16_t numHeadRotQuaternions, /* i : number of head rotation quaternions */ EXTERNAL_ORIENTATION_HANDLE hExtOrientationData, /* i : external orientation handle */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData /* i/o: combined orientation handle */ @@ -955,9 +963,11 @@ ivas_error combine_external_and_head_orientations( { int16_t i, j; IVAS_QUATERNION identity; + IVAS_VECTOR3 origo; identity.w = 1.0f; identity.x = identity.y = identity.z = 0.0f; + origo.x = origo.y = origo.z = 0.0f; /* Form combined orientations or return if no data available */ if ( hCombinedOrientationData == NULL ) @@ -983,6 +993,7 @@ ivas_error combine_external_and_head_orientations( { hCombinedOrientationData->enableCombinedOrientation[i] = 0; hCombinedOrientationData->Quaternions[i] = identity; + hCombinedOrientationData->listenerPos[i] = origo; for ( j = 0; j < 3; j++ ) { @@ -1131,6 +1142,7 @@ ivas_error combine_external_and_head_orientations( hCombinedOrientationData->Quaternions_prev_headRot[i] = identity; } } + hCombinedOrientationData->listenerPos[i] = listenerPos[i]; } } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index bec505c4ee..719435b86d 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -315,6 +315,8 @@ typedef struct ivas_combined_orientation_struct float Rmat_prev[3][3]; float chEneIIR[2][MASA_FREQUENCY_BANDS]; /* independent of the format. MASA bands are suitable for the task and readily available in ROM. */ float procChEneIIR[2][MASA_FREQUENCY_BANDS]; + int16_t shd_rot_max_order; + IVAS_VECTOR3 listenerPos[MAX_PARAM_SPATIAL_SUBFRAMES]; } COMBINED_ORIENTATION_DATA, *COMBINED_ORIENTATION_HANDLE; #endif diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 3a1077f5a6..7e2d26a2dd 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4772,9 +4772,10 @@ static ivas_error renderIsmToBinaural( if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, - ismInput->base.ctx.pHeadRotData, #ifdef EXTERNAL_ORIENTATIONS ismInput->base.ctx.pCombinedOrientationData, +#else + ismInput->base.ctx.pHeadRotData, #endif &ismInput->currentPos, ismInput->hReverb, @@ -4855,9 +4856,10 @@ static ivas_error renderIsmToBinauralRoom( if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, - ismInput->base.ctx.pHeadRotData, #ifdef EXTERNAL_ORIENTATIONS ismInput->base.ctx.pCombinedOrientationData, +#else + ismInput->base.ctx.pHeadRotData, #endif &ismInput->currentPos, ismInput->hReverb, @@ -5323,9 +5325,11 @@ static ivas_error renderMcToBinaural( { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); - if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, #ifdef EXTERNAL_ORIENTATIONS mcInput->base.ctx.pCombinedOrientationData, +#else + mcInput->base.ctx.pHeadRotData, #endif NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) @@ -5439,9 +5443,11 @@ static ivas_error renderMcToBinauralRoom( { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); - if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, + if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, #ifdef EXTERNAL_ORIENTATIONS mcInput->base.ctx.pCombinedOrientationData, +#else + mcInput->base.ctx.pHeadRotData, #endif NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { -- GitLab From 811077d505ac2146333ef6a94415fa52a6cf8654 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Fri, 9 Jun 2023 14:30:39 +0300 Subject: [PATCH 319/381] Add combined rotation tests to self_test and an accomodating test file. --- scripts/config/self_test.prm | 116 + ...rot_case00_3000_q_combinedRotationTest.csv | 3000 +++++++++++++++++ 2 files changed, 3116 insertions(+) create mode 100644 scripts/testv/headrot_case00_3000_q_combinedRotationTest.csv diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 81fe3cff88..97068a99a3 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -330,6 +330,10 @@ ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit ../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR.tst +// 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, external orientation, random FEC at 5% +../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR_EXOF.tst + // 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit ../IVAS_dec BINAURAL_ROOM 48 bit testv/stv2ISM48s.wav_64000_48-48_binaural_room.tst @@ -354,6 +358,10 @@ ../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit ../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_FEC5.tst +// 1 ISM with metadata at 80 kbps, 48 kHz in, 16 kHz out, BINAURAL out (Model from file), head rotation, external orientation, random FEC at 5% +../IVAS_cod -ism 1 testv/stvISM1.csv 80000 48 testv/stv1ISM48s.wav bit +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin BINAURAL 16 bit testv/stv2ISM48s.wav_80000_48-16_binaural_file_TDHR_EXOF_FEC5.tst + // 4 ISM with metadata at 96 kbps, 48 kHz in, 48 kHz out, Custom LS setup out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 96000 48 testv/stv4ISM48s.wav bit ../IVAS_dec testv/ls_setup_16ch_8+4+4.txt 48 bit testv/stv4ISM48s.wav_96000_48-48_MC_custom_setup.tst @@ -370,6 +378,10 @@ ../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit ../IVAS_dec -t testv/headrot_case01_3000_q.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR.tst +// 2 ISM with metadata at 128 kbps, 48 kHz in, 32 kHz out, BINAURAL out (Model from file), head rotation, external orientation +../IVAS_cod -ism 2 testv/stvISM1.csv testv/stvISM2.csv 128000 48 testv/stv2ISM48s.wav bit +../IVAS_dec -t testv/headrot_case01_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -hrtf ../scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin BINAURAL 32 bit testv/stv2ISM48s.wav_128000_48-32_binaural_file_TDHR_EXOF.tst + // 4 ISM with metadata at 160 kbps, 48 kHz in, 48 kHz out, STEREO out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 160000 48 testv/stv4ISM48s.wav bit ../IVAS_dec STEREO 48 bit testv/stv4ISM48s.wav_160000_48-48_STEREO.tst @@ -386,6 +398,10 @@ ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit ../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_FEC5.tst +// 3 ISM with metadata at 192 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, external orientation, random FEC at 5% +../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 192000 48 testv/stv3ISM48s.wav bit +../IVAS_dec -fec 5 -t testv/headrot_case02_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv3ISM48s.wav_192000_48-48_binaural_file_TDHR_EXOF_FEC5.tst + // 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural.tst @@ -394,6 +410,10 @@ ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -t testv/headrot_case03_3000_q.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR.tst +// 4 ISM with metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, external orientation +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +../IVAS_dec -t testv/headrot_case03_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv4ISM48s.wav_256000_48-48_binaural_file_TDHR_EXOF.tst + // 3 ISM with metadata at 384 kbps, 48 kHz in, 32 kHz out, 7_1_4 out ../IVAS_cod -ism 3 testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 384000 48 testv/stv3ISM48s.wav bit ../IVAS_dec 7_1_4 32 bit testv/stv3ISM48s.wav_384000_48-32_7_1_4.tst @@ -406,6 +426,10 @@ ../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_OtrAvg.tst +// 4 ISm with metadata at 256 kbps, 48 kHz in, 48 kHz out, TD BINAURAL out, head rotation, external orientation, Orientation tracking +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL 48 bit testv/stv4ISM48s.pcm_256000_48-48_TDHR_EXOF_OtrAvg.tst + // 1 ISM with metadata bitrate switching from 13.2 kbps to 128 kbps, 32 kHz in, 32 kHz out, mono out, DTX on ../IVAS_cod -dtx -ism 1 testv/stvISM1.csv ../scripts/switchPaths/sw_13k2_to_128k_10fr.bin 32 testv/stv32c.wav bit ../IVAS_dec MONO 32 bit testv/stv32c.wav_brate_sw_32-32_mono_dtx.tst @@ -423,6 +447,10 @@ ../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit ../IVAS_dec -fec 5 -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv BINAURAL 48 bit testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_DirConfig_FEC5.tst +// 4 ISM with extended metadata at 256 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, external orientation, directivity configuration, random FEC at 5% +../IVAS_cod -ism +4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 256000 48 testv/stv4ISM48s.wav bit +../IVAS_dec -fec 5 -render_config testv/config_directivity.cfg -t testv/headrot_case04_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv+4ISM48s.wav_256000_48-48_binaural_file_TDHR_EXOF_DirConfig_FEC5.tst + // 4 ISM with and without extended metadata bitrate switching from 24.4 kbps to 256 kbps, 48 kHz in, 48 kHz out, DTX on, BINAURAL out ../IVAS_cod -dtx -ism +4 testv/stvISM1.csv NULL testv/stvISM3.csv testv/stvISM4.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv4ISM48s.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv+4ISM48s.wav_brate_sw_48-48_DTX_binaural.tst @@ -460,10 +488,18 @@ ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot.tst +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, external orientation +../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_Binaural_Headrot_EXOF.tst + // SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_OtrAvg.tst +// SBA at 24.4 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, external orientation, Orientation tracking +../IVAS_cod -sba 3 24400 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL 32 bit testv/stv3OA32c.pcm_SBA_24400_32-32_Binaural_Headrot_EXOF_OtrAvg.tst + // SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_FEC5.tst @@ -472,6 +508,10 @@ ../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_Headrot.tst +// SBA at 24.4 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation, external orientation +../IVAS_cod -sba 3 -dtx 24400 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_24400_32-32_DTX_Binaural_Headrot_EXOF.tst + // SBA at 32 kbps, 32kHz in, 32kHz out, FOA out ../IVAS_cod -sba 1 32000 32 testv/stvFOA32c.wav bit ../IVAS_dec FOA 32 bit testv/stvFOA32c.wav_SBA_32000_32-32_FOA.tst @@ -508,18 +548,34 @@ ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot.tst +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, external orientation +../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot_EXOF.tst + // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrAvg.tst +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking, external orientation +../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrAvg.tst + // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPos.tst +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking, external orientation +../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit +../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPos.tst + // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_OtrRefPosLev.tst +// SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking in level mode, external orientation +../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit +../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPosLev.tst + // SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -fec 5 BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_FEC5.tst @@ -528,6 +584,10 @@ ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_Headrot.tst +// SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, DTX on, Headrotation, external orientation +../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_DTX_Binaural_Headrot_EXOF.tst + // SBA at 48 kbps, 48kHz in, 48kHz out, 5_1_2 out ../IVAS_cod -sba 3 48000 48 testv/stv3OA48c.wav bit ../IVAS_dec 5_1_2 48 bit testv/stv3OA48c.wav_SBA_48000_48-48_5_1_2.tst @@ -564,6 +624,10 @@ ../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_Headrot.tst +// SBA at 80 kbps, 32kHz in, 32kHz out, BINAURAL out, Headrotation, external orientation +../IVAS_cod -sba 3 80000 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 32 bit testv/stv3OA32c.wav_SBA_80000_32-32_Binaural_Headrot_EXOF.tst + // SBA at 96 kbps, 32kHz in, 32kHz out, STEREO out ../IVAS_cod -sba 1 96000 32 testv/stvFOA32c.wav bit ../IVAS_dec STEREO 32 bit testv/stvFOA32c.wav_SBA_96000_32-32_STEREO.tst @@ -576,10 +640,18 @@ ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot.tst +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, external orientation +../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot_EXOF.tst + // SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_OtrAvg.tst +// SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking, external orientation +../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_EXOF_OtrAvg.tst + // SBA at 192 kbps, 48kHz in, 48kHz out, HOA2 out, random FEC at 5% ../IVAS_cod -sba 3 192000 48 testv/stv3OA48c.wav bit ../IVAS_dec -fec 5 HOA2 48 bit testv/stv3OA48c.wav_SBA_192000_48-48_HOA2_FEC5.tst @@ -670,6 +742,10 @@ ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot.tst +// MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, external orientation +../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot_EXOF.tst + // MASA 1dir 1TC at 32 kbps, 48kHz in, 48kHz out, 7_1_4, random FEC at 5% ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 32000 48 testv/stv1MASA1TC48c.wav bit ../IVAS_dec -fec 5 7_1_4 48 bit testv/stv1MASA1TC48c.wav_32000_48-48_7_1_4_FEC5.tst @@ -694,6 +770,10 @@ ../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot.tst +// MASA 2dir 1TC at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, external orientation +../IVAS_cod -masa 1 testv/stv2MASA1TC48c.met 128000 48 testv/stv2MASA1TC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv2MASA1TC48c.wav_128000_48-48_BINAURAL_Headrot_EXOF.tst + // MASA 1dir 2TC at 13.2 kbps, 48kHz in, 48kHz out, 5_1 out, random FEC at 5% ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 13200 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -fec 5 5_1 48 bit testv/stv1MASA2TC48c.wav_13200_48-48_5_1_FEC5.tst @@ -714,10 +794,18 @@ ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot.tst +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, external orientation +../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot_EXOF.tst + // MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_OtrAvg.tst +// MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking, external orientation +../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_EXOF_OtrAvg.tst + // MASA 1dir 2TC at 48 kbps, 48kHz in, 48kHz out, 7_1_4 out, random FEC at 5% ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 48000 48 testv/stv1MASA2TC48c.wav bit ../IVAS_dec -fec 5 7_1_4 48 bit testv/stv1MASA2TC48c.wav_48000_48-48_7_1_4_FEC5.tst @@ -750,6 +838,10 @@ ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 64000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_BINAURAL_Headrot.tst +// MASA 2dir 2TC at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, external orientation +../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 64000 48 testv/stv2MASA2TC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv2MASA2TC48c.wav_64000_48-48_BINAURAL_Headrot_EXOF.tst + // MASA 2dir 2TC at 128 kbps, 48kHz in, 48kHz out, FOA out ../IVAS_cod -masa 2 testv/stv2MASA2TC48c.met 128000 48 testv/stv2MASA2TC48c.wav bit ../IVAS_dec FOA 48 bit testv/stv2MASA2TC48c.wav_128000_48-48_FOA.tst @@ -812,6 +904,10 @@ ../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Headrot.tst +// Multi-channel 5_1 at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, external orientation +../IVAS_cod -mc 5_1 24400 48 testv/stv51MC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_24400_48-48_Binaural_Headrot_EXOF.tst + // Multi-channel 5_1 at 48 kbps, 48kHz in, 48kHz out, random FEC at 5% ../IVAS_cod -mc 5_1 48000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 5_1 48 bit testv/stv51MC48c.wav_MC51_48000_48-48_5_1_FEC5.tst @@ -824,10 +920,18 @@ ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot.tst +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, external orientation +../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_Headrot_EXOF.tst + // Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot.tst +// Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, external orientation +../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit +../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot_EXOF.tst + // Multi-channel 5_1 at 96 kbps, 48kHz in, 48kHz out, random FEC at 5% ../IVAS_cod -mc 5_1 96000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 5_1 48 bit testv/stv51MC48c.wav_MC51_96000_48-48_5_1_FEC5.tst @@ -840,6 +944,10 @@ ../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural_Headrot.tst +// Multi-channel 5_1 at 128 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, external orientation +../IVAS_cod -mc 5_1 128000 48 testv/stv51MC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv51MC48c.wav_MC51_128000_48-48_Binaural_Headrot_EXOF.tst + // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, STEREO out, random FEC at 5% ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -fec 5 STEREO 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_stereo_FEC5.tst @@ -856,10 +964,18 @@ ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot_case00_3000_q.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot.tst +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, external orientation +../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit +../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot_EXOF.tst + // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, Orientation tracking ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit ../IVAS_dec -t testv/headrot.csv -otr avg BINAURAL_ROOM 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_Headrot_OtrAvg.tst +// Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, Orientation tracking, external orientation +../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_EXOF_OtrAvg.tst + // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit ../IVAS_dec 5_1 48 bit testv/stv51MC48c.wav_MC51_384000_48-48_5_1.tst diff --git a/scripts/testv/headrot_case00_3000_q_combinedRotationTest.csv b/scripts/testv/headrot_case00_3000_q_combinedRotationTest.csv new file mode 100644 index 0000000000..562d1368c8 --- /dev/null +++ b/scripts/testv/headrot_case00_3000_q_combinedRotationTest.csv @@ -0,0 +1,3000 @@ +1.000000,0.000000,0.000000,0.000000,1,1,1,100 +1.00,0.000000,0.000000,0.00,1,1,1,99 +1.00,0.000000,0.000000,0.00,1,1,1,98 +1.00,0.000000,0.000000,0.00,1,1,1,97 +1.00,0.000000,0.000000,0.00,1,1,1,96 +1.00,0.000000,0.000000,0.00,1,1,1,95 +1.00,0.000000,0.000000,0.00,1,1,1,94 +1.00,0.000000,0.000000,0.00,1,1,1,93 +1.00,0.000000,0.000000,0.00,1,1,1,92 +1.00,0.000000,0.000000,0.00,1,1,1,91 +1.00,0.000000,0.000000,0.00,1,1,1,90 +1.00,0.000000,0.000000,0.00,1,1,1,89 +1.00,0.000000,0.000000,0.00,1,1,1,88 +1.00,0.000000,0.000000,0.00,1,1,1,87 +1.00,0.000000,0.000000,0.00,1,1,1,86 +1.00,0.000000,0.000000,0.00,1,1,1,85 +1.00,0.000000,0.000000,0.00,1,1,1,84 +1.00,0.000000,0.000000,0.00,1,1,1,83 +1.00,0.000000,0.000000,0.00,1,1,1,82 +1.00,0.000000,0.000000,0.00,1,1,1,81 +1.00,0.000000,0.000000,0.00,1,1,1,80 +1.00,0.000000,0.000000,0.00,1,1,1,79 +1.00,0.000000,0.000000,0.00,1,1,1,78 +1.00,0.000000,0.000000,0.00,1,1,1,77 +1.00,0.000000,0.000000,0.00,1,1,1,76 +1.00,0.000000,0.000000,0.00,1,1,1,75 +1.00,0.000000,0.000000,0.00,1,1,1,74 +1.00,0.000000,0.000000,0.00,1,1,1,73 +1.00,0.000000,0.000000,0.00,1,1,1,72 +1.00,0.000000,0.000000,0.00,1,1,1,71 +1.00,0.000000,0.000000,0.00,1,1,1,70 +1.00,0.000000,0.000000,0.00,1,1,1,69 +1.00,0.000000,0.000000,0.00,1,1,1,68 +1.00,0.000000,0.000000,0.00,1,1,1,67 +1.00,0.000000,0.000000,0.00,1,1,1,66 +1.00,0.000000,0.000000,0.00,1,1,1,65 +1.00,0.000000,0.000000,0.00,1,1,1,64 +1.00,0.000000,0.000000,0.00,1,1,1,63 +1.00,0.000000,0.000000,0.00,1,1,1,62 +1.00,0.000000,0.000000,0.00,1,1,1,61 +1.00,0.000000,0.000000,0.00,1,1,1,60 +1.00,0.000000,0.000000,0.00,1,1,1,59 +1.00,0.000000,0.000000,0.00,1,1,1,58 +1.00,0.000000,0.000000,0.00,1,1,1,57 +1.00,0.000000,0.000000,0.00,1,1,1,56 +1.00,0.000000,0.000000,0.00,1,1,1,55 +1.00,0.000000,0.000000,0.00,1,1,1,54 +1.00,0.000000,0.000000,0.00,1,1,1,53 +1.00,0.000000,0.000000,0.00,1,1,1,52 +1.00,0.000000,0.000000,0.00,1,1,1,51 +1.00,0.000000,0.000000,0.00,1,1,1,50 +1.00,0.000000,0.000000,0.00,1,1,1,49 +1.00,0.000000,0.000000,0.00,1,1,1,48 +1.00,0.000000,0.000000,0.00,1,1,1,47 +1.00,0.000000,0.000000,0.00,1,1,1,46 +1.00,0.000000,0.000000,0.00,1,1,1,45 +1.00,0.000000,0.000000,0.00,1,1,1,44 +1.00,0.000000,0.000000,0.00,1,1,1,43 +1.00,0.000000,0.000000,0.00,1,1,1,42 +1.00,0.000000,0.000000,0.00,1,1,1,41 +1.00,0.000000,0.000000,0.00,1,1,1,40 +1.00,0.000000,0.000000,0.00,1,1,1,39 +1.00,0.000000,0.000000,0.00,1,1,1,38 +1.00,0.000000,0.000000,0.00,1,1,1,37 +1.00,0.000000,0.000000,0.00,1,1,1,36 +1.00,0.000000,0.000000,0.00,1,1,1,35 +1.00,0.000000,0.000000,0.00,1,1,1,34 +1.00,0.000000,0.000000,0.00,1,1,1,33 +1.00,0.000000,0.000000,0.00,1,1,1,32 +1.00,0.000000,0.000000,0.00,1,1,1,31 +1.00,0.000000,0.000000,0.00,1,1,1,30 +1.00,0.000000,0.000000,0.00,1,1,1,29 +1.00,0.000000,0.000000,0.00,1,1,1,28 +1.00,0.000000,0.000000,0.00,1,1,1,27 +1.00,0.000000,0.000000,0.00,1,1,1,26 +1.00,0.000000,0.000000,0.00,1,1,1,25 +1.00,0.000000,0.000000,0.00,1,1,1,24 +1.00,0.000000,0.000000,0.00,1,1,1,23 +1.00,0.000000,0.000000,0.00,1,1,1,22 +1.00,0.000000,0.000000,0.00,1,1,1,21 +1.00,0.000000,0.000000,0.00,1,1,1,20 +1.00,0.000000,0.000000,0.00,1,1,1,19 +1.00,0.000000,0.000000,0.00,1,1,1,18 +1.00,0.000000,0.000000,0.00,1,1,1,17 +1.00,0.000000,0.000000,0.00,1,1,1,16 +1.00,0.000000,0.000000,0.00,1,1,1,15 +1.00,0.000000,0.000000,0.00,1,1,1,14 +1.00,0.000000,0.000000,0.00,1,1,1,13 +1.00,0.000000,0.000000,0.00,1,1,1,12 +1.00,0.000000,0.000000,0.00,1,1,1,11 +1.00,0.000000,0.000000,0.00,1,1,1,10 +1.00,0.000000,0.000000,0.00,1,1,1,9 +1.00,0.000000,0.000000,0.00,1,1,1,8 +1.00,0.000000,0.000000,0.00,1,1,1,7 +1.00,0.000000,0.000000,0.00,1,1,1,6 +1.00,0.000000,0.000000,0.00,1,1,1,5 +1.00,0.000000,0.000000,0.00,1,1,1,4 +1.00,0.000000,0.000000,0.00,1,1,1,3 +1.00,0.000000,0.000000,0.00,1,1,1,2 +1.00,0.000000,0.000000,0.00,1,1,1,1 +0.994522,0.000000,0.000000,0.104528,1,1,1,0 +0.994412,0.000000,0.000000,0.105570,1,1,1,0 +0.994301,0.000000,0.000000,0.106611,1,1,1,0 +0.994189,0.000000,0.000000,0.107652,1,1,1,0 +0.994075,0.000000,0.000000,0.108693,1,1,1,0 +0.993961,0.000000,0.000000,0.109734,1,1,1,0 +0.993845,0.000000,0.000000,0.110775,1,1,1,0 +0.993729,0.000000,0.000000,0.111816,1,1,1,0 +0.993611,0.000000,0.000000,0.112856,1,1,1,0 +0.993493,0.000000,0.000000,0.113897,1,1,1,0 +0.993373,0.000000,0.000000,0.114937,1,1,1,0 +0.993252,0.000000,0.000000,0.115977,1,1,1,0 +0.993130,0.000000,0.000000,0.117017,1,1,1,0 +0.993007,0.000000,0.000000,0.118057,1,1,1,0 +0.992883,0.000000,0.000000,0.119097,1,1,1,0 +0.992757,0.000000,0.000000,0.120137,1,1,1,0 +0.992631,0.000000,0.000000,0.121176,1,1,1,0 +0.992504,0.000000,0.000000,0.122216,1,1,1,0 +0.992375,0.000000,0.000000,0.123255,1,1,1,0 +0.992245,0.000000,0.000000,0.124294,1,1,1,0 +0.992115,0.000000,0.000000,0.125333,1,1,1,0 +0.991983,0.000000,0.000000,0.126372,1,1,1,0 +0.991850,0.000000,0.000000,0.127411,1,1,1,0 +0.991716,0.000000,0.000000,0.128449,1,1,1,0 +0.991581,0.000000,0.000000,0.129488,1,1,1,0 +0.991445,0.000000,0.000000,0.130526,1,1,1,0 +0.991308,0.000000,0.000000,0.131564,1,1,1,0 +0.991169,0.000000,0.000000,0.132602,1,1,1,0 +0.991030,0.000000,0.000000,0.133640,1,1,1,0 +0.990889,0.000000,0.000000,0.134678,1,1,1,0 +0.990748,0.000000,0.000000,0.135716,1,1,1,0 +0.990605,0.000000,0.000000,0.136753,1,1,1,0 +0.990461,0.000000,0.000000,0.137790,1,1,1,0 +0.990317,0.000000,0.000000,0.138827,1,1,1,0 +0.990171,0.000000,0.000000,0.139864,1,1,1,0 +0.990024,0.000000,0.000000,0.140901,1,1,1,0 +0.989876,0.000000,0.000000,0.141938,1,1,1,0 +0.989726,0.000000,0.000000,0.142974,1,1,1,0 +0.989576,0.000000,0.000000,0.144011,1,1,1,0 +0.989425,0.000000,0.000000,0.145047,1,1,1,0 +0.989272,0.000000,0.000000,0.146083,1,1,1,0 +0.989119,0.000000,0.000000,0.147119,1,1,1,150 +0.989119,0.000000,0.000000,0.147119,1,1,1,149 +0.989119,0.000000,0.000000,0.147119,1,1,1,148 +0.989119,0.000000,0.000000,0.147119,1,1,1,147 +0.989119,0.000000,0.000000,0.147119,1,1,1,146 +0.989119,0.000000,0.000000,0.147119,1,1,1,145 +0.989119,0.000000,0.000000,0.147119,1,1,1,144 +0.989119,0.000000,0.000000,0.147119,1,1,1,143 +0.989119,0.000000,0.000000,0.147119,1,1,1,142 +0.989119,0.000000,0.000000,0.147119,1,1,1,141 +0.989119,0.000000,0.000000,0.147119,1,1,1,140 +0.989119,0.000000,0.000000,0.147119,1,1,1,139 +0.989119,0.000000,0.000000,0.147119,1,1,1,138 +0.989119,0.000000,0.000000,0.147119,1,1,1,137 +0.989119,0.000000,0.000000,0.147119,1,1,1,136 +0.989119,0.000000,0.000000,0.147119,1,1,1,135 +0.989119,0.000000,0.000000,0.147119,1,1,1,134 +0.989119,0.000000,0.000000,0.147119,1,1,1,133 +0.989119,0.000000,0.000000,0.147119,1,1,1,132 +0.989119,0.000000,0.000000,0.147119,1,1,1,131 +0.989119,0.000000,0.000000,0.147119,1,1,1,130 +0.989119,0.000000,0.000000,0.147119,1,1,1,129 +0.989119,0.000000,0.000000,0.147119,1,1,1,128 +0.989119,0.000000,0.000000,0.147119,1,1,1,127 +0.989119,0.000000,0.000000,0.147119,1,1,1,126 +0.989119,0.000000,0.000000,0.147119,1,1,1,125 +0.989119,0.000000,0.000000,0.147119,1,1,1,124 +0.989119,0.000000,0.000000,0.147119,1,1,1,123 +0.989119,0.000000,0.000000,0.147119,1,1,1,122 +0.989119,0.000000,0.000000,0.147119,1,1,1,121 +0.989119,0.000000,0.000000,0.147119,1,1,1,120 +0.989119,0.000000,0.000000,0.147119,1,1,1,119 +0.989119,0.000000,0.000000,0.147119,1,1,1,118 +0.989119,0.000000,0.000000,0.147119,1,1,1,117 +0.989119,0.000000,0.000000,0.147119,1,1,1,116 +0.989119,0.000000,0.000000,0.147119,1,1,1,115 +0.989119,0.000000,0.000000,0.147119,1,1,1,114 +0.989119,0.000000,0.000000,0.147119,1,1,1,113 +0.989119,0.000000,0.000000,0.147119,1,1,1,112 +0.989119,0.000000,0.000000,0.147119,1,1,1,111 +0.989119,0.000000,0.000000,0.147119,1,1,1,110 +0.989119,0.000000,0.000000,0.147119,1,1,1,109 +0.989119,0.000000,0.000000,0.147119,1,1,1,108 +0.989119,0.000000,0.000000,0.147119,1,1,1,107 +0.989119,0.000000,0.000000,0.147119,1,1,1,106 +0.989119,0.000000,0.000000,0.147119,1,1,1,105 +0.989119,0.000000,0.000000,0.147119,1,1,1,104 +0.989119,0.000000,0.000000,0.147119,1,1,1,103 +0.989119,0.000000,0.000000,0.147119,1,1,1,102 +0.989119,0.000000,0.000000,0.147119,1,1,1,101 +0.989119,0.000000,0.000000,0.147119,1,1,1,100 +0.989119,0.000000,0.000000,0.147119,1,1,1,99 +0.989119,0.000000,0.000000,0.147119,1,1,1,98 +0.989119,0.000000,0.000000,0.147119,1,1,1,97 +0.989119,0.000000,0.000000,0.147119,1,1,1,96 +0.989119,0.000000,0.000000,0.147119,1,1,1,95 +0.989119,0.000000,0.000000,0.147119,1,1,1,94 +0.989119,0.000000,0.000000,0.147119,1,1,1,93 +0.989119,0.000000,0.000000,0.147119,1,1,1,92 +0.989119,0.000000,0.000000,0.147119,1,1,1,91 +0.989119,0.000000,0.000000,0.147119,1,1,1,90 +0.989119,0.000000,0.000000,0.147119,1,1,1,89 +0.989119,0.000000,0.000000,0.147119,1,1,1,88 +0.989119,0.000000,0.000000,0.147119,1,1,1,87 +0.989119,0.000000,0.000000,0.147119,1,1,1,86 +0.989119,0.000000,0.000000,0.147119,1,1,1,85 +0.989119,0.000000,0.000000,0.147119,1,1,1,84 +0.989119,0.000000,0.000000,0.147119,1,1,1,83 +0.989119,0.000000,0.000000,0.147119,1,1,1,82 +0.989119,0.000000,0.000000,0.147119,1,1,1,81 +0.989119,0.000000,0.000000,0.147119,1,1,1,80 +0.989119,0.000000,0.000000,0.147119,1,1,1,79 +0.989119,0.000000,0.000000,0.147119,1,1,1,78 +0.989119,0.000000,0.000000,0.147119,1,1,1,77 +0.989119,0.000000,0.000000,0.147119,1,1,1,76 +0.989119,0.000000,0.000000,0.147119,1,1,1,75 +0.989119,0.000000,0.000000,0.147119,1,1,1,74 +0.989119,0.000000,0.000000,0.147119,1,1,1,73 +0.989119,0.000000,0.000000,0.147119,1,1,1,72 +0.989119,0.000000,0.000000,0.147119,1,1,1,71 +0.989119,0.000000,0.000000,0.147119,1,1,1,70 +0.989119,0.000000,0.000000,0.147119,1,1,1,69 +0.989119,0.000000,0.000000,0.147119,1,1,1,68 +0.989119,0.000000,0.000000,0.147119,1,1,1,67 +0.989119,0.000000,0.000000,0.147119,1,1,1,66 +0.989119,0.000000,0.000000,0.147119,1,1,1,65 +0.989119,0.000000,0.000000,0.147119,1,1,1,64 +0.989119,0.000000,0.000000,0.147119,1,1,1,63 +0.989119,0.000000,0.000000,0.147119,1,1,1,62 +0.989119,0.000000,0.000000,0.147119,1,1,1,61 +0.989119,0.000000,0.000000,0.147119,1,1,1,60 +0.989119,0.000000,0.000000,0.147119,1,1,1,59 +0.989119,0.000000,0.000000,0.147119,1,1,1,58 +0.989119,0.000000,0.000000,0.147119,1,1,1,57 +0.989119,0.000000,0.000000,0.147119,1,1,1,56 +0.989119,0.000000,0.000000,0.147119,1,1,1,55 +0.989119,0.000000,0.000000,0.147119,1,1,1,54 +0.989119,0.000000,0.000000,0.147119,1,1,1,53 +0.989119,0.000000,0.000000,0.147119,1,1,1,52 +0.989119,0.000000,0.000000,0.147119,1,1,1,51 +0.989119,0.000000,0.000000,0.147119,1,1,1,50 +0.989119,0.000000,0.000000,0.147119,1,1,1,49 +0.989119,0.000000,0.000000,0.147119,1,1,1,48 +0.989119,0.000000,0.000000,0.147119,1,1,1,47 +0.989119,0.000000,0.000000,0.147119,1,1,1,46 +0.989119,0.000000,0.000000,0.147119,1,1,1,45 +0.989119,0.000000,0.000000,0.147119,1,1,1,44 +0.989119,0.000000,0.000000,0.147119,1,1,1,43 +0.989119,0.000000,0.000000,0.147119,1,1,1,42 +0.989119,0.000000,0.000000,0.147119,1,1,1,41 +0.989119,0.000000,0.000000,0.147119,1,1,1,40 +0.989119,0.000000,0.000000,0.147119,1,1,1,39 +0.989119,0.000000,0.000000,0.147119,1,1,1,38 +0.989119,0.000000,0.000000,0.147119,1,1,1,37 +0.989119,0.000000,0.000000,0.147119,1,1,1,36 +0.989119,0.000000,0.000000,0.147119,1,1,1,35 +0.989119,0.000000,0.000000,0.147119,1,1,1,34 +0.989119,0.000000,0.000000,0.147119,1,1,1,33 +0.989119,0.000000,0.000000,0.147119,1,1,1,32 +0.989119,0.000000,0.000000,0.147119,1,1,1,31 +0.989119,0.000000,0.000000,0.147119,1,1,1,30 +0.989119,0.000000,0.000000,0.147119,1,1,1,29 +0.989119,0.000000,0.000000,0.147119,1,1,1,28 +0.989119,0.000000,0.000000,0.147119,1,1,1,27 +0.989119,0.000000,0.000000,0.147119,1,1,1,26 +0.989119,0.000000,0.000000,0.147119,1,1,1,25 +0.989119,0.000000,0.000000,0.147119,1,1,1,24 +0.989119,0.000000,0.000000,0.147119,1,1,1,23 +0.989119,0.000000,0.000000,0.147119,1,1,1,22 +0.989119,0.000000,0.000000,0.147119,1,1,1,21 +0.989119,0.000000,0.000000,0.147119,1,1,1,20 +0.989119,0.000000,0.000000,0.147119,1,1,1,19 +0.989119,0.000000,0.000000,0.147119,1,1,1,18 +0.989119,0.000000,0.000000,0.147119,1,1,1,17 +0.989119,0.000000,0.000000,0.147119,1,1,1,16 +0.989119,0.000000,0.000000,0.147119,1,1,1,15 +0.989119,0.000000,0.000000,0.147119,1,1,1,14 +0.989119,0.000000,0.000000,0.147119,1,1,1,13 +0.989119,0.000000,0.000000,0.147119,1,1,1,12 +0.989119,0.000000,0.000000,0.147119,1,1,1,11 +0.989119,0.000000,0.000000,0.147119,1,1,1,10 +0.989119,0.000000,0.000000,0.147119,1,1,1,9 +0.989119,0.000000,0.000000,0.147119,1,1,1,8 +0.989119,0.000000,0.000000,0.147119,1,1,1,7 +0.989119,0.000000,0.000000,0.147119,1,1,1,6 +0.989119,0.000000,0.000000,0.147119,1,1,1,5 +0.989119,0.000000,0.000000,0.147119,1,1,1,4 +0.989119,0.000000,0.000000,0.147119,1,1,1,3 +0.989119,0.000000,0.000000,0.147119,1,1,1,2 +0.989119,0.000000,0.000000,0.147119,1,1,1,1 +0.989119,0.000000,0.000000,0.147119,1,1,1,0 +0.953612,0.000000,0.000000,0.301039,1,1,1,0 +0.953296,0.000000,0.000000,0.302037,1,1,1,0 +0.952979,0.000000,0.000000,0.303035,1,1,1,0 +0.952661,0.000000,0.000000,0.304033,1,1,1,0 +0.952343,0.000000,0.000000,0.305031,1,1,1,0 +0.952023,0.000000,0.000000,0.306028,1,1,1,0 +0.951702,0.000000,0.000000,0.307024,1,1,1,0 +0.951380,0.000000,0.000000,0.308021,1,1,1,0 +0.951057,0.000000,0.000000,0.309017,1,1,1,0 +0.950732,0.000000,0.000000,0.310013,1,1,1,0 +0.950407,0.000000,0.000000,0.311008,1,1,1,0 +0.950081,0.000000,0.000000,0.312003,1,1,1,0 +0.949754,0.000000,0.000000,0.312998,1,1,1,0 +0.949425,0.000000,0.000000,0.313992,1,1,1,0 +0.949096,0.000000,0.000000,0.314987,1,1,1,0 +0.948766,0.000000,0.000000,0.315980,1,1,1,0 +0.948434,0.000000,0.000000,0.316974,1,1,1,0 +0.948102,0.000000,0.000000,0.317967,1,1,1,0 +0.947768,0.000000,0.000000,0.318959,1,1,1,0 +0.947434,0.000000,0.000000,0.319952,1,1,1,0 +0.947098,0.000000,0.000000,0.320944,1,1,1,0 +0.946762,0.000000,0.000000,0.321935,1,1,1,0 +0.946424,0.000000,0.000000,0.322927,1,1,1,0 +0.946085,0.000000,0.000000,0.323917,1,1,1,0 +0.945746,0.000000,0.000000,0.324908,1,1,1,0 +0.945405,0.000000,0.000000,0.325898,1,1,1,0 +0.945063,0.000000,0.000000,0.326888,1,1,1,0 +0.944720,0.000000,0.000000,0.327878,1,1,1,0 +0.944376,0.000000,0.000000,0.328867,1,1,1,0 +0.944031,0.000000,0.000000,0.329855,1,1,1,0 +0.943686,0.000000,0.000000,0.330844,1,1,1,0 +0.943339,0.000000,0.000000,0.331832,1,1,1,0 +0.942991,0.000000,0.000000,0.332820,1,1,1,0 +0.942641,0.000000,0.000000,0.333807,1,1,1,0 +0.942291,0.000000,0.000000,0.334794,1,1,1,0 +0.941940,0.000000,0.000000,0.335780,1,1,1,0 +0.941588,0.000000,0.000000,0.336767,1,1,1,0 +0.941235,0.000000,0.000000,0.337752,1,1,1,0 +0.940881,0.000000,0.000000,0.338738,1,1,1,0 +0.940526,0.000000,0.000000,0.339723,1,1,1,0 +0.940169,0.000000,0.000000,0.340708,1,1,1,0 +0.939812,0.000000,0.000000,0.341692,1,1,1,0 +0.939454,0.000000,0.000000,0.342676,1,1,1,0 +0.939094,0.000000,0.000000,0.343660,1,1,1,0 +0.938734,0.000000,0.000000,0.344643,1,1,1,0 +0.938372,0.000000,0.000000,0.345626,1,1,1,0 +0.938010,0.000000,0.000000,0.346608,1,1,1,0 +0.937646,0.000000,0.000000,0.347590,1,1,1,0 +0.937282,0.000000,0.000000,0.348572,1,1,1,0 +0.936916,0.000000,0.000000,0.349553,1,1,1,0 +0.936550,0.000000,0.000000,0.350534,1,1,1,0 +0.936182,0.000000,0.000000,0.351515,1,1,1,0 +0.935814,0.000000,0.000000,0.352495,1,1,1,0 +0.935444,0.000000,0.000000,0.353475,1,1,1,0 +0.935073,0.000000,0.000000,0.354454,1,1,1,0 +0.934702,0.000000,0.000000,0.355433,1,1,1,0 +0.934329,0.000000,0.000000,0.356412,1,1,1,0 +0.933955,0.000000,0.000000,0.357390,1,1,1,0 +0.933580,0.000000,0.000000,0.358368,1,1,1,0 +0.933205,0.000000,0.000000,0.359345,1,1,1,0 +0.932828,0.000000,0.000000,0.360322,1,1,1,0 +0.932450,0.000000,0.000000,0.361299,1,1,1,0 +0.932071,0.000000,0.000000,0.362275,1,1,1,0 +0.931691,0.000000,0.000000,0.363251,1,1,1,0 +0.931310,0.000000,0.000000,0.364227,1,1,1,0 +0.930928,0.000000,0.000000,0.365202,1,1,1,0 +0.930545,0.000000,0.000000,0.366176,1,1,1,0 +0.930161,0.000000,0.000000,0.367151,1,1,1,0 +0.929776,0.000000,0.000000,0.368125,1,1,1,0 +0.929390,0.000000,0.000000,0.369098,1,1,1,0 +0.929003,0.000000,0.000000,0.370071,1,1,1,0 +0.928615,0.000000,0.000000,0.371044,1,1,1,0 +0.928226,0.000000,0.000000,0.372016,1,1,1,0 +0.927836,0.000000,0.000000,0.372988,1,1,1,0 +0.927445,0.000000,0.000000,0.373959,1,1,1,0 +0.927053,0.000000,0.000000,0.374930,1,1,1,0 +0.926660,0.000000,0.000000,0.375901,1,1,1,0 +0.926266,0.000000,0.000000,0.376871,1,1,1,0 +0.925871,0.000000,0.000000,0.377841,1,1,1,0 +0.925474,0.000000,0.000000,0.378810,1,1,1,0 +0.925077,0.000000,0.000000,0.379779,1,1,1,0 +0.924679,0.000000,0.000000,0.380748,1,1,1,0 +0.924280,0.000000,0.000000,0.381716,1,1,1,0 +0.923880,0.000000,0.000000,0.382683,1,1,1,0 +0.923478,0.000000,0.000000,0.383651,1,1,1,0 +0.923076,0.000000,0.000000,0.384618,1,1,1,0 +0.922673,0.000000,0.000000,0.385584,1,1,1,1000 +0.922673,0.000000,0.000000,0.385584,1,1,1,999 +0.922673,0.000000,0.000000,0.385584,1,1,1,998 +0.922673,0.000000,0.000000,0.385584,1,1,1,997 +0.922673,0.000000,0.000000,0.385584,1,1,1,996 +0.922673,0.000000,0.000000,0.385584,1,1,1,995 +0.922673,0.000000,0.000000,0.385584,1,1,1,994 +0.922673,0.000000,0.000000,0.385584,1,1,1,993 +0.922673,0.000000,0.000000,0.385584,1,1,1,992 +0.922673,0.000000,0.000000,0.385584,1,1,1,991 +0.922673,0.000000,0.000000,0.385584,1,1,1,990 +0.922673,0.000000,0.000000,0.385584,1,1,1,989 +0.922673,0.000000,0.000000,0.385584,1,1,1,988 +0.922673,0.000000,0.000000,0.385584,1,1,1,987 +0.922673,0.000000,0.000000,0.385584,1,1,1,986 +0.922673,0.000000,0.000000,0.385584,1,1,1,985 +0.922673,0.000000,0.000000,0.385584,1,1,1,984 +0.922673,0.000000,0.000000,0.385584,1,1,1,983 +0.922673,0.000000,0.000000,0.385584,1,1,1,982 +0.922673,0.000000,0.000000,0.385584,1,1,1,981 +0.922673,0.000000,0.000000,0.385584,1,1,1,980 +0.922673,0.000000,0.000000,0.385584,1,1,1,979 +0.922673,0.000000,0.000000,0.385584,1,1,1,978 +0.922673,0.000000,0.000000,0.385584,1,1,1,977 +0.922673,0.000000,0.000000,0.385584,1,1,1,976 +0.922673,0.000000,0.000000,0.385584,1,1,1,975 +0.922673,0.000000,0.000000,0.385584,1,1,1,974 +0.922673,0.000000,0.000000,0.385584,1,1,1,973 +0.922673,0.000000,0.000000,0.385584,1,1,1,972 +0.922673,0.000000,0.000000,0.385584,1,1,1,971 +0.922673,0.000000,0.000000,0.385584,1,1,1,970 +0.922673,0.000000,0.000000,0.385584,1,1,1,969 +0.922673,0.000000,0.000000,0.385584,1,1,1,968 +0.922673,0.000000,0.000000,0.385584,1,1,1,967 +0.922673,0.000000,0.000000,0.385584,1,1,1,966 +0.922673,0.000000,0.000000,0.385584,1,1,1,965 +0.922673,0.000000,0.000000,0.385584,1,1,1,964 +0.922673,0.000000,0.000000,0.385584,1,1,1,963 +0.922673,0.000000,0.000000,0.385584,1,1,1,962 +0.922673,0.000000,0.000000,0.385584,1,1,1,961 +0.922673,0.000000,0.000000,0.385584,1,1,1,960 +0.922673,0.000000,0.000000,0.385584,1,1,1,959 +0.922673,0.000000,0.000000,0.385584,1,1,1,958 +0.922673,0.000000,0.000000,0.385584,1,1,1,957 +0.922673,0.000000,0.000000,0.385584,1,1,1,956 +0.922673,0.000000,0.000000,0.385584,1,1,1,955 +0.922673,0.000000,0.000000,0.385584,1,1,1,954 +0.922673,0.000000,0.000000,0.385584,1,1,1,953 +0.922673,0.000000,0.000000,0.385584,1,1,1,952 +0.922673,0.000000,0.000000,0.385584,1,1,1,951 +0.922673,0.000000,0.000000,0.385584,1,1,1,950 +0.922673,0.000000,0.000000,0.385584,1,1,1,949 +0.922673,0.000000,0.000000,0.385584,1,1,1,948 +0.922673,0.000000,0.000000,0.385584,1,1,1,947 +0.922673,0.000000,0.000000,0.385584,1,1,1,946 +0.922673,0.000000,0.000000,0.385584,1,1,1,945 +0.922673,0.000000,0.000000,0.385584,1,1,1,944 +0.922673,0.000000,0.000000,0.385584,1,1,1,943 +0.922673,0.000000,0.000000,0.385584,1,1,1,942 +0.922673,0.000000,0.000000,0.385584,1,1,1,941 +0.922673,0.000000,0.000000,0.385584,1,1,1,940 +0.922673,0.000000,0.000000,0.385584,1,1,1,939 +0.922673,0.000000,0.000000,0.385584,1,1,1,938 +0.922673,0.000000,0.000000,0.385584,1,1,1,937 +0.922673,0.000000,0.000000,0.385584,1,1,1,936 +0.922673,0.000000,0.000000,0.385584,1,1,1,935 +0.922673,0.000000,0.000000,0.385584,1,1,1,934 +0.922673,0.000000,0.000000,0.385584,1,1,1,933 +0.922673,0.000000,0.000000,0.385584,1,1,1,932 +0.922673,0.000000,0.000000,0.385584,1,1,1,931 +0.922673,0.000000,0.000000,0.385584,1,1,1,930 +0.922673,0.000000,0.000000,0.385584,1,1,1,929 +0.922673,0.000000,0.000000,0.385584,1,1,1,928 +0.922673,0.000000,0.000000,0.385584,1,1,1,927 +0.922673,0.000000,0.000000,0.385584,1,1,1,926 +0.922673,0.000000,0.000000,0.385584,1,1,1,925 +0.922673,0.000000,0.000000,0.385584,1,1,1,924 +0.922673,0.000000,0.000000,0.385584,1,1,1,923 +0.922673,0.000000,0.000000,0.385584,1,1,1,922 +0.922673,0.000000,0.000000,0.385584,1,1,1,921 +0.922673,0.000000,0.000000,0.385584,1,1,1,920 +0.922673,0.000000,0.000000,0.385584,1,1,1,919 +0.922673,0.000000,0.000000,0.385584,1,1,1,918 +0.922673,0.000000,0.000000,0.385584,1,1,1,917 +0.922673,0.000000,0.000000,0.385584,1,1,1,916 +0.922673,0.000000,0.000000,0.385584,1,1,1,915 +0.922673,0.000000,0.000000,0.385584,1,1,1,914 +0.922673,0.000000,0.000000,0.385584,1,1,1,913 +0.922673,0.000000,0.000000,0.385584,1,1,1,912 +0.922673,0.000000,0.000000,0.385584,1,1,1,911 +0.922673,0.000000,0.000000,0.385584,1,1,1,910 +0.922673,0.000000,0.000000,0.385584,1,1,1,909 +0.922673,0.000000,0.000000,0.385584,1,1,1,908 +0.922673,0.000000,0.000000,0.385584,1,1,1,907 +0.922673,0.000000,0.000000,0.385584,1,1,1,906 +0.922673,0.000000,0.000000,0.385584,1,1,1,905 +0.922673,0.000000,0.000000,0.385584,1,1,1,904 +0.922673,0.000000,0.000000,0.385584,1,1,1,903 +0.922673,0.000000,0.000000,0.385584,1,1,1,902 +0.922673,0.000000,0.000000,0.385584,1,1,1,901 +0.922673,0.000000,0.000000,0.385584,1,1,1,900 +0.922673,0.000000,0.000000,0.385584,1,1,1,899 +0.922673,0.000000,0.000000,0.385584,1,1,1,898 +0.922673,0.000000,0.000000,0.385584,1,1,1,897 +0.922673,0.000000,0.000000,0.385584,1,1,1,896 +0.922673,0.000000,0.000000,0.385584,1,1,1,895 +0.922673,0.000000,0.000000,0.385584,1,1,1,894 +0.922673,0.000000,0.000000,0.385584,1,1,1,893 +0.922673,0.000000,0.000000,0.385584,1,1,1,892 +0.922673,0.000000,0.000000,0.385584,1,1,1,891 +0.922673,0.000000,0.000000,0.385584,1,1,1,890 +0.922673,0.000000,0.000000,0.385584,1,1,1,889 +0.922673,0.000000,0.000000,0.385584,1,1,1,888 +0.922673,0.000000,0.000000,0.385584,1,1,1,887 +0.922673,0.000000,0.000000,0.385584,1,1,1,886 +0.922673,0.000000,0.000000,0.385584,1,1,1,885 +0.922673,0.000000,0.000000,0.385584,1,1,1,884 +0.922673,0.000000,0.000000,0.385584,1,1,1,883 +0.922673,0.000000,0.000000,0.385584,1,1,1,882 +0.922673,0.000000,0.000000,0.385584,1,1,1,881 +0.922673,0.000000,0.000000,0.385584,1,1,1,880 +0.922673,0.000000,0.000000,0.385584,1,1,1,879 +0.922673,0.000000,0.000000,0.385584,1,1,1,878 +0.922673,0.000000,0.000000,0.385584,1,1,1,877 +0.922673,0.000000,0.000000,0.385584,1,1,1,876 +0.922673,0.000000,0.000000,0.385584,1,1,1,875 +0.922673,0.000000,0.000000,0.385584,1,1,1,874 +0.922673,0.000000,0.000000,0.385584,1,1,1,873 +0.922673,0.000000,0.000000,0.385584,1,1,1,872 +0.922673,0.000000,0.000000,0.385584,1,1,1,871 +0.922673,0.000000,0.000000,0.385584,1,1,1,870 +0.922673,0.000000,0.000000,0.385584,1,1,1,869 +0.922673,0.000000,0.000000,0.385584,1,1,1,868 +0.922673,0.000000,0.000000,0.385584,1,1,1,867 +0.922673,0.000000,0.000000,0.385584,1,1,1,866 +0.922673,0.000000,0.000000,0.385584,1,1,1,865 +0.922673,0.000000,0.000000,0.385584,1,1,1,864 +0.922673,0.000000,0.000000,0.385584,1,1,1,863 +0.922673,0.000000,0.000000,0.385584,1,1,1,862 +0.922673,0.000000,0.000000,0.385584,1,1,1,861 +0.922673,0.000000,0.000000,0.385584,1,1,1,860 +0.922673,0.000000,0.000000,0.385584,1,1,1,859 +0.922673,0.000000,0.000000,0.385584,1,1,1,858 +0.922673,0.000000,0.000000,0.385584,1,1,1,857 +0.922673,0.000000,0.000000,0.385584,1,1,1,856 +0.922673,0.000000,0.000000,0.385584,1,1,1,855 +0.922673,0.000000,0.000000,0.385584,1,1,1,854 +0.922673,0.000000,0.000000,0.385584,1,1,1,853 +0.922673,0.000000,0.000000,0.385584,1,1,1,852 +0.922673,0.000000,0.000000,0.385584,1,1,1,851 +0.922673,0.000000,0.000000,0.385584,1,1,1,850 +0.922673,0.000000,0.000000,0.385584,1,1,1,849 +0.922673,0.000000,0.000000,0.385584,1,1,1,848 +0.922673,0.000000,0.000000,0.385584,1,1,1,847 +0.922673,0.000000,0.000000,0.385584,1,1,1,846 +0.922673,0.000000,0.000000,0.385584,1,1,1,845 +0.922673,0.000000,0.000000,0.385584,1,1,1,844 +0.922673,0.000000,0.000000,0.385584,1,1,1,843 +0.922673,0.000000,0.000000,0.385584,1,1,1,842 +0.922673,0.000000,0.000000,0.385584,1,1,1,841 +0.922673,0.000000,0.000000,0.385584,1,1,1,840 +0.922673,0.000000,0.000000,0.385584,1,1,1,839 +0.922673,0.000000,0.000000,0.385584,1,1,1,838 +0.922673,0.000000,0.000000,0.385584,1,1,1,837 +0.922673,0.000000,0.000000,0.385584,1,1,1,836 +0.922673,0.000000,0.000000,0.385584,1,1,1,835 +0.922673,0.000000,0.000000,0.385584,1,1,1,834 +0.922673,0.000000,0.000000,0.385584,1,1,1,833 +0.922673,0.000000,0.000000,0.385584,1,1,1,832 +0.922673,0.000000,0.000000,0.385584,1,1,1,831 +0.922673,0.000000,0.000000,0.385584,1,1,1,830 +0.922673,0.000000,0.000000,0.385584,1,1,1,829 +0.922673,0.000000,0.000000,0.385584,1,1,1,828 +0.922673,0.000000,0.000000,0.385584,1,1,1,827 +0.922673,0.000000,0.000000,0.385584,1,1,1,826 +0.922673,0.000000,0.000000,0.385584,1,1,1,825 +0.922673,0.000000,0.000000,0.385584,1,1,1,824 +0.922673,0.000000,0.000000,0.385584,1,1,1,823 +0.922673,0.000000,0.000000,0.385584,1,1,1,822 +0.922673,0.000000,0.000000,0.385584,1,1,1,821 +0.922673,0.000000,0.000000,0.385584,1,1,1,820 +0.922673,0.000000,0.000000,0.385584,1,1,1,819 +0.922673,0.000000,0.000000,0.385584,1,1,1,818 +0.922673,0.000000,0.000000,0.385584,1,1,1,817 +0.922673,0.000000,0.000000,0.385584,1,1,1,816 +0.922673,0.000000,0.000000,0.385584,1,1,1,815 +0.922673,0.000000,0.000000,0.385584,1,1,1,814 +0.922673,0.000000,0.000000,0.385584,1,1,1,813 +0.922673,0.000000,0.000000,0.385584,1,1,1,812 +0.922673,0.000000,0.000000,0.385584,1,1,1,811 +0.922673,0.000000,0.000000,0.385584,1,1,1,810 +0.922673,0.000000,0.000000,0.385584,1,1,1,809 +0.922673,0.000000,0.000000,0.385584,1,1,1,808 +0.922673,0.000000,0.000000,0.385584,1,1,1,807 +0.922673,0.000000,0.000000,0.385584,1,1,1,806 +0.922673,0.000000,0.000000,0.385584,1,1,1,805 +0.922673,0.000000,0.000000,0.385584,1,1,1,804 +0.922673,0.000000,0.000000,0.385584,1,1,1,803 +0.922673,0.000000,0.000000,0.385584,1,1,1,802 +0.922673,0.000000,0.000000,0.385584,1,1,1,801 +0.922673,0.000000,0.000000,0.385584,1,1,1,800 +0.922673,0.000000,0.000000,0.385584,1,1,1,799 +0.922673,0.000000,0.000000,0.385584,1,1,1,798 +0.922673,0.000000,0.000000,0.385584,1,1,1,797 +0.922673,0.000000,0.000000,0.385584,1,1,1,796 +0.922673,0.000000,0.000000,0.385584,1,1,1,795 +0.922673,0.000000,0.000000,0.385584,1,1,1,794 +0.922673,0.000000,0.000000,0.385584,1,1,1,793 +0.922673,0.000000,0.000000,0.385584,1,1,1,792 +0.922673,0.000000,0.000000,0.385584,1,1,1,791 +0.922673,0.000000,0.000000,0.385584,1,1,1,790 +0.922673,0.000000,0.000000,0.385584,1,1,1,789 +0.922673,0.000000,0.000000,0.385584,1,1,1,788 +0.922673,0.000000,0.000000,0.385584,1,1,1,787 +0.922673,0.000000,0.000000,0.385584,1,1,1,786 +0.922673,0.000000,0.000000,0.385584,1,1,1,785 +0.922673,0.000000,0.000000,0.385584,1,1,1,784 +0.922673,0.000000,0.000000,0.385584,1,1,1,783 +0.922673,0.000000,0.000000,0.385584,1,1,1,782 +0.922673,0.000000,0.000000,0.385584,1,1,1,781 +0.922673,0.000000,0.000000,0.385584,1,1,1,780 +0.922673,0.000000,0.000000,0.385584,1,1,1,779 +0.922673,0.000000,0.000000,0.385584,1,1,1,778 +0.922673,0.000000,0.000000,0.385584,1,1,1,777 +0.922673,0.000000,0.000000,0.385584,1,1,1,776 +0.922673,0.000000,0.000000,0.385584,1,1,1,775 +0.922673,0.000000,0.000000,0.385584,1,1,1,774 +0.922673,0.000000,0.000000,0.385584,1,1,1,773 +0.922673,0.000000,0.000000,0.385584,1,1,1,772 +0.922673,0.000000,0.000000,0.385584,1,1,1,771 +0.922673,0.000000,0.000000,0.385584,1,1,1,770 +0.922673,0.000000,0.000000,0.385584,1,1,1,769 +0.922673,0.000000,0.000000,0.385584,1,1,1,768 +0.922673,0.000000,0.000000,0.385584,1,1,1,767 +0.922673,0.000000,0.000000,0.385584,1,1,1,766 +0.922673,0.000000,0.000000,0.385584,1,1,1,765 +0.922673,0.000000,0.000000,0.385584,1,1,1,764 +0.922673,0.000000,0.000000,0.385584,1,1,1,763 +0.922673,0.000000,0.000000,0.385584,1,1,1,762 +0.922673,0.000000,0.000000,0.385584,1,1,1,761 +0.922673,0.000000,0.000000,0.385584,1,1,1,760 +0.922673,0.000000,0.000000,0.385584,1,1,1,759 +0.922673,0.000000,0.000000,0.385584,1,1,1,758 +0.922673,0.000000,0.000000,0.385584,1,1,1,757 +0.922673,0.000000,0.000000,0.385584,1,1,1,756 +0.922673,0.000000,0.000000,0.385584,1,1,1,755 +0.922673,0.000000,0.000000,0.385584,1,1,1,754 +0.922673,0.000000,0.000000,0.385584,1,1,1,753 +0.922673,0.000000,0.000000,0.385584,1,1,1,752 +0.922673,0.000000,0.000000,0.385584,1,1,1,751 +0.922673,0.000000,0.000000,0.385584,1,1,1,750 +0.922673,0.000000,0.000000,0.385584,1,1,1,749 +0.922673,0.000000,0.000000,0.385584,1,1,1,748 +0.922673,0.000000,0.000000,0.385584,1,1,1,747 +0.922673,0.000000,0.000000,0.385584,1,1,1,746 +0.922673,0.000000,0.000000,0.385584,1,1,1,745 +0.922673,0.000000,0.000000,0.385584,1,1,1,744 +0.922673,0.000000,0.000000,0.385584,1,1,1,743 +0.922673,0.000000,0.000000,0.385584,1,1,1,742 +0.922673,0.000000,0.000000,0.385584,1,1,1,741 +0.922673,0.000000,0.000000,0.385584,1,1,1,740 +0.922673,0.000000,0.000000,0.385584,1,1,1,739 +0.922673,0.000000,0.000000,0.385584,1,1,1,738 +0.922673,0.000000,0.000000,0.385584,1,1,1,737 +0.922673,0.000000,0.000000,0.385584,1,1,1,736 +0.922673,0.000000,0.000000,0.385584,1,1,1,735 +0.922673,0.000000,0.000000,0.385584,1,1,1,734 +0.922673,0.000000,0.000000,0.385584,1,1,1,733 +0.922673,0.000000,0.000000,0.385584,1,1,1,732 +0.922673,0.000000,0.000000,0.385584,1,1,1,731 +0.922673,0.000000,0.000000,0.385584,1,1,1,730 +0.922673,0.000000,0.000000,0.385584,1,1,1,729 +0.922673,0.000000,0.000000,0.385584,1,1,1,728 +0.922673,0.000000,0.000000,0.385584,1,1,1,727 +0.922673,0.000000,0.000000,0.385584,1,1,1,726 +0.922673,0.000000,0.000000,0.385584,1,1,1,725 +0.922673,0.000000,0.000000,0.385584,1,1,1,724 +0.922673,0.000000,0.000000,0.385584,1,1,1,723 +0.922673,0.000000,0.000000,0.385584,1,1,1,722 +0.922673,0.000000,0.000000,0.385584,1,1,1,721 +0.922673,0.000000,0.000000,0.385584,1,1,1,720 +0.922673,0.000000,0.000000,0.385584,1,1,1,719 +0.922673,0.000000,0.000000,0.385584,1,1,1,718 +0.922673,0.000000,0.000000,0.385584,1,1,1,717 +0.922673,0.000000,0.000000,0.385584,1,1,1,716 +0.922673,0.000000,0.000000,0.385584,1,1,1,715 +0.922673,0.000000,0.000000,0.385584,1,1,1,714 +0.922673,0.000000,0.000000,0.385584,1,1,1,713 +0.922673,0.000000,0.000000,0.385584,1,1,1,712 +0.922673,0.000000,0.000000,0.385584,1,1,1,711 +0.922673,0.000000,0.000000,0.385584,1,1,1,710 +0.922673,0.000000,0.000000,0.385584,1,1,1,709 +0.922673,0.000000,0.000000,0.385584,1,1,1,708 +0.922673,0.000000,0.000000,0.385584,1,1,1,707 +0.922673,0.000000,0.000000,0.385584,1,1,1,706 +0.922673,0.000000,0.000000,0.385584,1,1,1,705 +0.922673,0.000000,0.000000,0.385584,1,1,1,704 +0.922673,0.000000,0.000000,0.385584,1,1,1,703 +0.922673,0.000000,0.000000,0.385584,1,1,1,702 +0.922673,0.000000,0.000000,0.385584,1,1,1,701 +0.922673,0.000000,0.000000,0.385584,1,1,1,700 +0.922673,0.000000,0.000000,0.385584,1,1,1,699 +0.922673,0.000000,0.000000,0.385584,1,1,1,698 +0.922673,0.000000,0.000000,0.385584,1,1,1,697 +0.922673,0.000000,0.000000,0.385584,1,1,1,696 +0.922673,0.000000,0.000000,0.385584,1,1,1,695 +0.922673,0.000000,0.000000,0.385584,1,1,1,694 +0.922673,0.000000,0.000000,0.385584,1,1,1,693 +0.922673,0.000000,0.000000,0.385584,1,1,1,692 +0.922673,0.000000,0.000000,0.385584,1,1,1,691 +0.922673,0.000000,0.000000,0.385584,1,1,1,690 +0.922673,0.000000,0.000000,0.385584,1,1,1,689 +0.922673,0.000000,0.000000,0.385584,1,1,1,688 +0.922673,0.000000,0.000000,0.385584,1,1,1,687 +0.922673,0.000000,0.000000,0.385584,1,1,1,686 +0.922673,0.000000,0.000000,0.385584,1,1,1,685 +0.922673,0.000000,0.000000,0.385584,1,1,1,684 +0.922673,0.000000,0.000000,0.385584,1,1,1,683 +0.922673,0.000000,0.000000,0.385584,1,1,1,682 +0.922673,0.000000,0.000000,0.385584,1,1,1,681 +0.922673,0.000000,0.000000,0.385584,1,1,1,680 +0.922673,0.000000,0.000000,0.385584,1,1,1,679 +0.922673,0.000000,0.000000,0.385584,1,1,1,678 +0.922673,0.000000,0.000000,0.385584,1,1,1,677 +0.922673,0.000000,0.000000,0.385584,1,1,1,676 +0.922673,0.000000,0.000000,0.385584,1,1,1,675 +0.922673,0.000000,0.000000,0.385584,1,1,1,674 +0.922673,0.000000,0.000000,0.385584,1,1,1,673 +0.922673,0.000000,0.000000,0.385584,1,1,1,672 +0.922673,0.000000,0.000000,0.385584,1,1,1,671 +0.922673,0.000000,0.000000,0.385584,1,1,1,670 +0.922673,0.000000,0.000000,0.385584,1,1,1,669 +0.922673,0.000000,0.000000,0.385584,1,1,1,668 +0.922673,0.000000,0.000000,0.385584,1,1,1,667 +0.922673,0.000000,0.000000,0.385584,1,1,1,666 +0.922673,0.000000,0.000000,0.385584,1,1,1,665 +0.922673,0.000000,0.000000,0.385584,1,1,1,664 +0.922673,0.000000,0.000000,0.385584,1,1,1,663 +0.922673,0.000000,0.000000,0.385584,1,1,1,662 +0.922673,0.000000,0.000000,0.385584,1,1,1,661 +0.922673,0.000000,0.000000,0.385584,1,1,1,660 +0.922673,0.000000,0.000000,0.385584,1,1,1,659 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.728969,0.000000,0.000000,0.684547,1,1,1,400 +0.600420,0.000000,0.000000,0.799685,0,1,0,0 +0.599582,0.000000,0.000000,0.800313,0,1,0,0 +0.598744,0.000000,0.000000,0.800940,0,1,0,0 +0.597905,0.000000,0.000000,0.801567,0,1,0,0 +0.597065,0.000000,0.000000,0.802193,0,1,0,0 +0.596225,0.000000,0.000000,0.802817,0,1,0,0 +0.595384,0.000000,0.000000,0.803441,0,1,0,0 +0.594542,0.000000,0.000000,0.804064,0,1,0,0 +0.593700,0.000000,0.000000,0.804687,0,1,0,0 +0.592857,0.000000,0.000000,0.805308,0,1,0,0 +0.592013,0.000000,0.000000,0.805928,0,1,0,0 +0.591169,0.000000,0.000000,0.806548,0,1,0,0 +0.590324,0.000000,0.000000,0.807166,0,1,0,0 +0.589478,0.000000,0.000000,0.807784,0,1,0,0 +0.588632,0.000000,0.000000,0.808401,0,1,0,0 +0.587785,0.000000,0.000000,0.809017,0,1,0,0 +0.586938,0.000000,0.000000,0.809632,0,1,0,0 +0.586090,0.000000,0.000000,0.810246,0,1,0,0 +0.585241,0.000000,0.000000,0.810860,0,1,0,0 +0.584391,0.000000,0.000000,0.811472,0,1,0,0 +0.583541,0.000000,0.000000,0.812084,0,1,0,0 +0.582690,0.000000,0.000000,0.812694,0,1,0,0 +0.581839,0.000000,0.000000,0.813304,0,1,0,0 +0.580987,0.000000,0.000000,0.813913,0,1,0,0 +0.580134,0.000000,0.000000,0.814521,0,1,0,0 +0.579281,0.000000,0.000000,0.815128,0,1,0,0 +0.578427,0.000000,0.000000,0.815734,0,1,0,0 +0.577573,0.000000,0.000000,0.816339,0,1,0,0 +0.576718,0.000000,0.000000,0.816944,0,1,0,0 +0.575862,0.000000,0.000000,0.817547,0,1,0,0 +0.575005,0.000000,0.000000,0.818150,0,1,0,0 +0.574148,0.000000,0.000000,0.818751,0,1,0,0 +0.573290,0.000000,0.000000,0.819352,0,1,0,0 +0.572432,0.000000,0.000000,0.819952,0,1,0,0 +0.571573,0.000000,0.000000,0.820551,0,1,0,0 +0.570714,0.000000,0.000000,0.821149,0,1,0,0 +0.569853,0.000000,0.000000,0.821746,0,1,0,0 +0.568993,0.000000,0.000000,0.822343,0,1,0,0 +0.568131,0.000000,0.000000,0.822938,0,1,0,0 +0.567269,0.000000,0.000000,0.823533,0,1,0,0 +0.566406,0.000000,0.000000,0.824126,0,1,0,0 +0.565543,0.000000,0.000000,0.824719,0,1,0,0 +0.564679,0.000000,0.000000,0.825311,0,1,0,0 +0.563814,0.000000,0.000000,0.825902,0,1,0,0 +0.562949,0.000000,0.000000,0.826492,0,1,0,0 +0.562083,0.000000,0.000000,0.827081,0,1,0,0 +0.561217,0.000000,0.000000,0.827669,0,1,0,0 +0.560350,0.000000,0.000000,0.828256,0,1,0,0 +0.559482,0.000000,0.000000,0.828842,0,1,0,0 +0.558614,0.000000,0.000000,0.829428,0,1,0,0 +0.557745,0.000000,0.000000,0.830012,0,1,0,0 +0.556876,0.000000,0.000000,0.830596,0,1,0,0 +0.556006,0.000000,0.000000,0.831179,0,1,0,0 +0.555135,0.000000,0.000000,0.831760,0,1,0,0 +0.554263,0.000000,0.000000,0.832341,0,1,0,0 +0.553392,0.000000,0.000000,0.832921,0,1,0,0 +0.552519,0.000000,0.000000,0.833500,0,1,0,0 +0.551646,0.000000,0.000000,0.834078,0,1,0,0 +0.550772,0.000000,0.000000,0.834656,0,1,0,0 +0.549898,0.000000,0.000000,0.835232,0,1,0,0 +0.549023,0.000000,0.000000,0.835807,0,1,0,0 +0.548147,0.000000,0.000000,0.836382,0,1,0,0 +0.547271,0.000000,0.000000,0.836955,0,1,0,0 +0.546394,0.000000,0.000000,0.837528,0,1,0,0 +0.545517,0.000000,0.000000,0.838100,0,1,0,0 +0.544639,0.000000,0.000000,0.838671,0,1,0,0 +0.543760,0.000000,0.000000,0.839240,0,1,0,0 +0.542881,0.000000,0.000000,0.839809,0,1,0,0 +0.542002,0.000000,0.000000,0.840377,0,1,0,0 +0.541121,0.000000,0.000000,0.840945,0,1,0,0 +0.540240,0.000000,0.000000,0.841511,0,1,0,0 +0.539359,0.000000,0.000000,0.842076,0,1,0,0 +0.538477,0.000000,0.000000,0.842640,0,1,0,0 +0.537594,0.000000,0.000000,0.843204,0,1,0,0 +0.536711,0.000000,0.000000,0.843766,0,1,0,0 +0.535827,0.000000,0.000000,0.844328,0,1,0,0 +0.534942,0.000000,0.000000,0.844889,0,1,0,0 +0.534057,0.000000,0.000000,0.845448,0,1,0,0 +0.533172,0.000000,0.000000,0.846007,0,1,0,0 +0.532285,0.000000,0.000000,0.846565,0,1,0,0 +0.531399,0.000000,0.000000,0.847122,0,1,0,0 +0.530511,0.000000,0.000000,0.847678,0,1,0,0 +0.529623,0.000000,0.000000,0.848233,0,1,0,0 +0.528735,0.000000,0.000000,0.848787,0,1,0,0 +0.527846,0.000000,0.000000,0.849340,0,1,0,0 +0.526956,0.000000,0.000000,0.849893,0,1,0,0 +0.526066,0.000000,0.000000,0.850444,0,1,0,0 +0.525175,0.000000,0.000000,0.850994,0,1,0,0 +0.524283,0.000000,0.000000,0.851544,0,1,0,0 +0.523391,0.000000,0.000000,0.852093,0,1,0,0 +0.522499,0.000000,0.000000,0.852640,0,1,0,0 +0.521605,0.000000,0.000000,0.853187,0,1,0,0 +0.520712,0.000000,0.000000,0.853733,0,1,0,0 +0.519817,0.000000,0.000000,0.854277,0,1,0,0 +0.518922,0.000000,0.000000,0.854821,0,1,0,0 +0.518027,0.000000,0.000000,0.855364,0,1,0,0 +0.517131,0.000000,0.000000,0.855906,0,1,0,0 +0.516234,0.000000,0.000000,0.856447,0,1,0,0 +0.515337,0.000000,0.000000,0.856987,0,1,0,0 +0.514440,0.000000,0.000000,0.857527,0,1,0,0 +0.513541,0.000000,0.000000,0.858065,0,1,0,0 +0.512642,0.000000,0.000000,0.858602,0,1,0,0 +0.511743,0.000000,0.000000,0.859139,0,1,0,0 +0.510843,0.000000,0.000000,0.859674,0,1,0,0 +0.509943,0.000000,0.000000,0.860208,0,1,0,0 +0.509041,0.000000,0.000000,0.860742,0,1,0,0 +0.508140,0.000000,0.000000,0.861275,0,1,0,0 +0.507238,0.000000,0.000000,0.861806,0,1,0,0 +0.506335,0.000000,0.000000,0.862337,0,1,0,0 +0.505431,0.000000,0.000000,0.862867,0,1,0,0 +0.504528,0.000000,0.000000,0.863396,0,1,0,0 +0.503623,0.000000,0.000000,0.863923,0,1,0,0 +0.502718,0.000000,0.000000,0.864450,0,1,0,0 +0.501813,0.000000,0.000000,0.864976,0,1,0,0 +0.500907,0.000000,0.000000,0.865501,0,1,0,0 +0.500000,0.000000,0.000000,0.866025,0,1,0,0 +0.499093,0.000000,0.000000,0.866549,0,1,0,0 +0.498185,0.000000,0.000000,0.867071,0,1,0,0 +0.497277,0.000000,0.000000,0.867592,0,1,0,0 +0.496368,0.000000,0.000000,0.868112,0,1,0,0 +0.495459,0.000000,0.000000,0.868632,0,1,0,0 +0.494549,0.000000,0.000000,0.869150,0,1,0,0 +0.493638,0.000000,0.000000,0.869667,0,1,0,0 +0.492727,0.000000,0.000000,0.870184,0,1,0,0 +0.491816,0.000000,0.000000,0.870699,0,1,0,0 +0.490904,0.000000,0.000000,0.871214,0,1,0,0 +0.489991,0.000000,0.000000,0.871727,0,1,0,0 +0.489078,0.000000,0.000000,0.872240,0,1,0,0 +0.488164,0.000000,0.000000,0.872752,0,1,0,0 +0.487250,0.000000,0.000000,0.873262,0,1,0,0 +0.486335,0.000000,0.000000,0.873772,0,1,0,0 +0.485420,0.000000,0.000000,0.874281,0,1,0,0 +0.484504,0.000000,0.000000,0.874789,0,1,0,0 +0.483588,0.000000,0.000000,0.875296,0,1,0,0 +0.482671,0.000000,0.000000,0.875802,0,1,0,0 +0.481754,0.000000,0.000000,0.876307,0,1,0,0 +0.480836,0.000000,0.000000,0.876811,0,1,0,0 +0.479917,0.000000,0.000000,0.877314,0,1,0,0 +0.478998,0.000000,0.000000,0.877816,0,1,0,0 +0.478079,0.000000,0.000000,0.878317,0,1,0,0 +0.477159,0.000000,0.000000,0.878817,0,1,0,0 +0.476238,0.000000,0.000000,0.879316,0,1,0,0 +0.475317,0.000000,0.000000,0.879815,0,1,0,0 +0.474396,0.000000,0.000000,0.880312,0,1,0,0 +0.473473,0.000000,0.000000,0.880808,0,1,0,0 +0.472551,0.000000,0.000000,0.881303,0,1,0,0 +0.471628,0.000000,0.000000,0.881798,0,1,0,0 +0.470704,0.000000,0.000000,0.882291,0,1,0,0 +0.469780,0.000000,0.000000,0.882784,0,1,0,0 +0.468855,0.000000,0.000000,0.883275,0,1,0,0 +0.467930,0.000000,0.000000,0.883766,0,1,0,0 +0.467004,0.000000,0.000000,0.884255,0,1,0,0 +0.466078,0.000000,0.000000,0.884744,0,1,0,0 +0.465151,0.000000,0.000000,0.885231,0,1,0,0 +0.464224,0.000000,0.000000,0.885718,0,1,0,0 +0.463296,0.000000,0.000000,0.886204,0,1,0,0 +0.462368,0.000000,0.000000,0.886688,0,1,0,0 +0.461439,0.000000,0.000000,0.887172,0,1,0,0 +0.460510,0.000000,0.000000,0.887655,0,1,0,0 +0.459580,0.000000,0.000000,0.888136,0,1,0,0 +0.458650,0.000000,0.000000,0.888617,0,1,0,0 +0.457719,0.000000,0.000000,0.889097,0,1,0,0 +0.456787,0.000000,0.000000,0.889576,0,1,0,0 +0.455856,0.000000,0.000000,0.890054,0,1,0,0 +0.454923,0.000000,0.000000,0.890531,0,1,0,0 +0.453990,0.000000,0.000000,0.891007,0,1,0,0 +0.453057,0.000000,0.000000,0.891481,0,1,0,0 +0.452123,0.000000,0.000000,0.891955,0,1,0,0 +0.451189,0.000000,0.000000,0.892428,0,1,0,0 +0.450254,0.000000,0.000000,0.892900,0,1,0,0 +0.449319,0.000000,0.000000,0.893371,0,1,0,0 +0.448383,0.000000,0.000000,0.893841,0,1,0,0 +0.447447,0.000000,0.000000,0.894310,0,1,0,0 +0.446510,0.000000,0.000000,0.894779,0,1,0,0 +0.445573,0.000000,0.000000,0.895246,0,1,0,0 +0.444635,0.000000,0.000000,0.895712,0,1,0,0 +0.443697,0.000000,0.000000,0.896177,0,1,0,0 +0.442758,0.000000,0.000000,0.896641,0,1,0,0 +0.441819,0.000000,0.000000,0.897104,0,1,0,0 +0.440879,0.000000,0.000000,0.897566,0,1,0,0 +0.439939,0.000000,0.000000,0.898028,0,1,0,0 +0.438999,0.000000,0.000000,0.898488,0,1,0,0 +0.438057,0.000000,0.000000,0.898947,0,1,0,0 +0.437116,0.000000,0.000000,0.899405,0,1,0,0 +0.436174,0.000000,0.000000,0.899863,0,1,0,0 +0.435231,0.000000,0.000000,0.900319,0,1,0,0 +0.434288,0.000000,0.000000,0.900774,0,1,0,0 +0.433345,0.000000,0.000000,0.901228,0,1,0,0 +0.432401,0.000000,0.000000,0.901682,0,1,0,0 +0.431456,0.000000,0.000000,0.902134,0,1,0,0 +0.430511,0.000000,0.000000,0.902585,0,1,0,0 +0.429566,0.000000,0.000000,0.903036,0,1,0,0 +0.428620,0.000000,0.000000,0.903485,0,1,0,0 +0.427673,0.000000,0.000000,0.903933,0,1,0,0 +0.426727,0.000000,0.000000,0.904381,0,1,0,0 +0.425779,0.000000,0.000000,0.904827,0,1,0,0 +0.424832,0.000000,0.000000,0.905272,0,1,0,0 +0.423883,0.000000,0.000000,0.905717,0,1,0,0 +0.422935,0.000000,0.000000,0.906160,0,1,0,0 +0.421985,0.000000,0.000000,0.906603,0,1,0,0 +0.421036,0.000000,0.000000,0.907044,0,1,0,0 +0.420086,0.000000,0.000000,0.907484,0,1,0,0 +0.419135,0.000000,0.000000,0.907924,0,1,0,0 +0.418184,0.000000,0.000000,0.908362,0,1,0,0 +0.417233,0.000000,0.000000,0.908800,0,1,0,0 +0.416281,0.000000,0.000000,0.909236,0,1,0,0 +0.415328,0.000000,0.000000,0.909672,0,1,0,0 +0.414376,0.000000,0.000000,0.910106,0,1,0,0 +0.413422,0.000000,0.000000,0.910539,0,1,0,0 +0.412469,0.000000,0.000000,0.910972,0,1,0,0 +0.411514,0.000000,0.000000,0.911403,0,1,0,0 +0.410560,0.000000,0.000000,0.911834,0,1,0,0 +0.409605,0.000000,0.000000,0.912263,0,1,0,0 +0.408649,0.000000,0.000000,0.912692,0,1,0,0 +0.407693,0.000000,0.000000,0.913119,0,1,0,0 +0.406737,0.000000,0.000000,0.913545,0,1,0,0 +0.405780,0.000000,0.000000,0.913971,0,1,0,0 +0.404822,0.000000,0.000000,0.914395,0,1,0,0 +0.403865,0.000000,0.000000,0.914819,0,1,0,0 +0.402906,0.000000,0.000000,0.915241,0,1,0,0 +0.401948,0.000000,0.000000,0.915663,0,1,0,0 +0.400989,0.000000,0.000000,0.916083,0,1,0,0 +0.400029,0.000000,0.000000,0.916502,0,1,0,0 +0.399069,0.000000,0.000000,0.916921,0,1,0,0 +0.398109,0.000000,0.000000,0.917338,0,1,0,0 +0.397148,0.000000,0.000000,0.917755,0,1,0,0 +0.396187,0.000000,0.000000,0.918170,0,1,0,0 +0.395225,0.000000,0.000000,0.918584,0,1,0,0 +0.394263,0.000000,0.000000,0.918998,0,1,0,0 +0.393300,0.000000,0.000000,0.919410,0,1,0,0 +0.392337,0.000000,0.000000,0.919821,0,1,0,0 +0.391374,0.000000,0.000000,0.920232,0,1,0,0 +0.390410,0.000000,0.000000,0.920641,0,1,0,0 +0.389445,0.000000,0.000000,0.921050,0,1,0,0 +0.388481,0.000000,0.000000,0.921457,1,1,0,0 +0.387516,0.000000,0.000000,0.921863,1,1,0,0 +0.386550,0.000000,0.000000,0.922268,1,1,0,0 +0.385584,0.000000,0.000000,0.922673,1,1,0,0 +0.384618,0.000000,0.000000,0.923076,1,1,0,0 +0.383651,0.000000,0.000000,0.923478,1,1,0,0 +0.382683,0.000000,0.000000,0.923880,1,1,0,0 +0.381716,0.000000,0.000000,0.924280,1,1,0,0 +0.380748,0.000000,0.000000,0.924679,1,1,0,0 +0.379779,0.000000,0.000000,0.925077,1,1,0,0 +0.378810,0.000000,0.000000,0.925474,1,1,0,0 +0.377841,0.000000,0.000000,0.925871,1,1,0,0 +0.376871,0.000000,0.000000,0.926266,1,1,0,0 +0.375901,0.000000,0.000000,0.926660,1,1,0,0 +0.374930,0.000000,0.000000,0.927053,1,1,0,0 +0.373959,0.000000,0.000000,0.927445,1,1,0,0 +0.372988,0.000000,0.000000,0.927836,1,1,0,0 +0.372016,0.000000,0.000000,0.928226,1,1,0,0 +0.371044,0.000000,0.000000,0.928615,1,1,0,0 +0.370071,0.000000,0.000000,0.929003,1,1,0,0 +0.369098,0.000000,0.000000,0.929390,1,1,0,0 +0.368125,0.000000,0.000000,0.929776,1,1,0,0 +0.367151,0.000000,0.000000,0.930161,1,1,0,0 +0.366176,0.000000,0.000000,0.930545,1,1,0,0 +0.365202,0.000000,0.000000,0.930928,1,1,0,0 +0.364227,0.000000,0.000000,0.931310,1,1,0,0 +0.363251,0.000000,0.000000,0.931691,1,1,0,0 +0.362275,0.000000,0.000000,0.932071,1,1,0,0 +0.361299,0.000000,0.000000,0.932450,1,1,0,0 +0.360322,0.000000,0.000000,0.932828,1,1,0,0 +0.359345,0.000000,0.000000,0.933205,1,1,0,0 +0.358368,0.000000,0.000000,0.933580,1,1,0,0 +0.357390,0.000000,0.000000,0.933955,1,1,0,0 +0.356412,0.000000,0.000000,0.934329,1,1,0,0 +0.355433,0.000000,0.000000,0.934702,1,1,0,0 +0.354454,0.000000,0.000000,0.935073,1,1,0,0 +0.353475,0.000000,0.000000,0.935444,1,1,0,0 +0.352495,0.000000,0.000000,0.935814,1,1,0,0 +0.351515,0.000000,0.000000,0.936182,1,1,0,0 +0.350534,0.000000,0.000000,0.936550,1,1,0,0 +0.349553,0.000000,0.000000,0.936916,1,1,0,0 +0.348572,0.000000,0.000000,0.937282,1,1,0,0 +0.347590,0.000000,0.000000,0.937646,1,1,0,0 +0.346608,0.000000,0.000000,0.938010,1,1,0,0 +0.345626,0.000000,0.000000,0.938372,1,1,0,0 +0.344643,0.000000,0.000000,0.938734,1,1,0,0 +0.343660,0.000000,0.000000,0.939094,1,1,0,0 +0.342676,0.000000,0.000000,0.939454,1,1,0,0 +0.341692,0.000000,0.000000,0.939812,1,1,0,0 +0.340708,0.000000,0.000000,0.940169,1,1,0,0 +0.339723,0.000000,0.000000,0.940526,1,1,0,0 +0.338738,0.000000,0.000000,0.940881,1,1,0,0 +0.337752,0.000000,0.000000,0.941235,1,1,0,0 +0.336767,0.000000,0.000000,0.941588,1,1,0,0 +0.335780,0.000000,0.000000,0.941940,1,1,0,0 +0.334794,0.000000,0.000000,0.942291,1,1,0,0 +0.333807,0.000000,0.000000,0.942641,1,1,0,0 +0.332820,0.000000,0.000000,0.942991,1,1,0,0 +0.331832,0.000000,0.000000,0.943339,1,1,0,0 +0.330844,0.000000,0.000000,0.943686,1,1,0,0 +0.329855,0.000000,0.000000,0.944031,1,1,0,0 +0.328867,0.000000,0.000000,0.944376,1,1,0,0 +0.327878,0.000000,0.000000,0.944720,1,1,0,0 +0.326888,0.000000,0.000000,0.945063,1,1,0,0 +0.325898,0.000000,0.000000,0.945405,1,1,0,0 +0.324908,0.000000,0.000000,0.945746,1,1,0,0 +0.323917,0.000000,0.000000,0.946085,1,1,0,0 +0.322927,0.000000,0.000000,0.946424,1,1,0,0 +0.321935,0.000000,0.000000,0.946762,1,1,0,0 +0.320944,0.000000,0.000000,0.947098,1,1,0,0 +0.319952,0.000000,0.000000,0.947434,1,1,0,0 +0.318959,0.000000,0.000000,0.947768,1,1,0,0 +0.317967,0.000000,0.000000,0.948102,1,1,0,0 +0.316974,0.000000,0.000000,0.948434,1,1,0,0 +0.315980,0.000000,0.000000,0.948766,1,1,0,0 +0.314987,0.000000,0.000000,0.949096,1,1,0,0 +0.313992,0.000000,0.000000,0.949425,1,1,0,0 +0.312998,0.000000,0.000000,0.949754,1,1,0,0 +0.312003,0.000000,0.000000,0.950081,1,1,0,0 +0.311008,0.000000,0.000000,0.950407,1,1,0,0 +0.310013,0.000000,0.000000,0.950732,1,1,0,0 +0.309017,0.000000,0.000000,0.951057,1,1,0,0 +0.308021,0.000000,0.000000,0.951380,1,1,0,0 +0.307024,0.000000,0.000000,0.951702,1,1,0,0 +0.306028,0.000000,0.000000,0.952023,1,1,0,0 +0.305031,0.000000,0.000000,0.952343,1,1,0,0 +0.304033,0.000000,0.000000,0.952661,1,1,0,0 +0.303035,0.000000,0.000000,0.952979,1,1,0,0 +0.302037,0.000000,0.000000,0.953296,1,1,0,0 +0.301039,0.000000,0.000000,0.953612,1,1,0,0 +0.300040,0.000000,0.000000,0.953927,1,1,0,0 +0.299041,0.000000,0.000000,0.954240,1,1,0,0 +0.298041,0.000000,0.000000,0.954553,1,1,0,0 +0.297042,0.000000,0.000000,0.954865,1,1,0,0 +0.296041,0.000000,0.000000,0.955175,1,1,0,0 +0.295041,0.000000,0.000000,0.955485,1,1,0,0 +0.294040,0.000000,0.000000,0.955793,1,1,0,0 +0.293039,0.000000,0.000000,0.956100,1,1,0,0 +0.292038,0.000000,0.000000,0.956407,1,1,0,0 +0.291036,0.000000,0.000000,0.956712,1,1,0,0 +0.290034,0.000000,0.000000,0.957016,1,1,0,0 +0.289032,0.000000,0.000000,0.957319,1,1,0,0 +0.288029,0.000000,0.000000,0.957622,1,1,0,0 +0.287026,0.000000,0.000000,0.957923,1,1,0,0 +0.286023,0.000000,0.000000,0.958223,1,1,0,0 +0.285019,0.000000,0.000000,0.958522,1,1,0,0 +0.284015,0.000000,0.000000,0.958820,1,1,0,0 +0.283011,0.000000,0.000000,0.959117,1,1,0,0 +0.282007,0.000000,0.000000,0.959412,1,1,0,0 +0.281002,0.000000,0.000000,0.959707,1,1,0,0 +0.279997,0.000000,0.000000,0.960001,1,1,0,0 +0.278991,0.000000,0.000000,0.960294,1,1,0,0 +0.277985,0.000000,0.000000,0.960585,1,1,0,0 +0.276979,0.000000,0.000000,0.960876,1,1,0,0 +0.275973,0.000000,0.000000,0.961165,1,1,0,0 +0.274966,0.000000,0.000000,0.961454,1,1,0,0 +0.273959,0.000000,0.000000,0.961741,1,1,0,0 +0.272952,0.000000,0.000000,0.962028,1,1,0,0 +0.271944,0.000000,0.000000,0.962313,1,1,0,0 +0.270936,0.000000,0.000000,0.962597,1,1,0,0 +0.269928,0.000000,0.000000,0.962880,1,1,0,0 +0.268920,0.000000,0.000000,0.963163,1,1,0,0 +0.267911,0.000000,0.000000,0.963444,1,1,0,0 +0.266902,0.000000,0.000000,0.963724,1,1,0,0 +0.265893,0.000000,0.000000,0.964003,1,1,0,0 +0.264883,0.000000,0.000000,0.964281,1,1,0,0 +0.263873,0.000000,0.000000,0.964557,1,1,0,0 +0.262863,0.000000,0.000000,0.964833,1,1,0,0 +0.261852,0.000000,0.000000,0.965108,1,1,0,0 +0.260842,0.000000,0.000000,0.965382,1,1,0,0 +0.259830,0.000000,0.000000,0.965654,1,1,0,0 +0.258819,0.000000,0.000000,0.965926,1,1,0,0 +0.257807,0.000000,0.000000,0.966196,1,1,0,0 +0.256795,0.000000,0.000000,0.966466,1,1,0,0 +0.255783,0.000000,0.000000,0.966734,1,1,0,0 +0.254771,0.000000,0.000000,0.967001,1,1,0,0 +0.253758,0.000000,0.000000,0.967268,1,1,0,0 +0.252745,0.000000,0.000000,0.967533,1,1,0,0 +0.251732,0.000000,0.000000,0.967797,1,1,0,0 +0.250718,0.000000,0.000000,0.968060,1,1,0,0 +0.249704,0.000000,0.000000,0.968322,1,1,0,0 +0.248690,0.000000,0.000000,0.968583,1,1,0,0 +0.247675,0.000000,0.000000,0.968843,1,1,0,0 +0.246661,0.000000,0.000000,0.969102,1,1,0,0 +0.245646,0.000000,0.000000,0.969360,1,1,0,0 +0.244631,0.000000,0.000000,0.969616,1,1,0,0 +0.243615,0.000000,0.000000,0.969872,1,1,0,0 +0.242599,0.000000,0.000000,0.970127,1,1,0,0 +0.241583,0.000000,0.000000,0.970380,1,1,0,0 +0.240567,0.000000,0.000000,0.970633,1,1,0,0 +0.239550,0.000000,0.000000,0.970884,1,1,0,0 +0.238533,0.000000,0.000000,0.971134,1,1,0,0 +0.237516,0.000000,0.000000,0.971384,1,1,0,0 +0.236499,0.000000,0.000000,0.971632,1,1,0,0 +0.235481,0.000000,0.000000,0.971879,1,1,0,0 +0.234463,0.000000,0.000000,0.972125,1,1,0,0 +0.233445,0.000000,0.000000,0.972370,1,1,0,0 +0.232427,0.000000,0.000000,0.972614,1,1,0,0 +0.231408,0.000000,0.000000,0.972857,1,1,0,0 +0.230389,0.000000,0.000000,0.973099,1,1,0,0 +0.229370,0.000000,0.000000,0.973339,1,1,0,0 +0.228351,0.000000,0.000000,0.973579,1,1,0,0 +0.227331,0.000000,0.000000,0.973817,1,1,0,0 +0.226311,0.000000,0.000000,0.974055,1,1,0,0 +0.225291,0.000000,0.000000,0.974291,1,1,0,0 +0.224271,0.000000,0.000000,0.974527,1,1,0,0 +0.223250,0.000000,0.000000,0.974761,1,1,0,0 +0.222229,0.000000,0.000000,0.974994,1,1,0,0 +0.221208,0.000000,0.000000,0.975227,1,1,0,0 +0.220187,0.000000,0.000000,0.975458,1,1,0,0 +0.219165,0.000000,0.000000,0.975688,1,1,0,0 +0.218143,0.000000,0.000000,0.975917,1,1,0,0 +0.217121,0.000000,0.000000,0.976145,1,1,0,0 +0.216099,0.000000,0.000000,0.976371,1,1,0,0 +0.215076,0.000000,0.000000,0.976597,1,1,0,0 +0.214053,0.000000,0.000000,0.976822,1,1,0,0 +0.213030,0.000000,0.000000,0.977046,1,1,0,0 +0.212007,0.000000,0.000000,0.977268,1,1,0,0 +0.210984,0.000000,0.000000,0.977490,1,1,0,0 +0.209960,0.000000,0.000000,0.977710,1,1,0,0 +0.208936,0.000000,0.000000,0.977929,1,1,0,0 +0.207912,0.000000,0.000000,0.978148,1,1,0,0 +0.206887,0.000000,0.000000,0.978365,1,1,0,0 +0.205863,0.000000,0.000000,0.978581,1,1,0,0 +0.204838,0.000000,0.000000,0.978796,1,1,0,0 +0.203813,0.000000,0.000000,0.979010,1,1,0,0 +0.202787,0.000000,0.000000,0.979223,1,1,0,0 +0.201762,0.000000,0.000000,0.979435,1,1,0,0 +0.200736,0.000000,0.000000,0.979645,1,1,0,0 +0.199710,0.000000,0.000000,0.979855,1,1,0,0 +0.198684,0.000000,0.000000,0.980064,1,1,0,0 +0.197657,0.000000,0.000000,0.980271,1,1,0,0 +0.196631,0.000000,0.000000,0.980478,1,1,0,0 +0.195604,0.000000,0.000000,0.980683,1,1,0,0 +0.194577,0.000000,0.000000,0.980887,1,1,0,0 +0.193549,0.000000,0.000000,0.981091,1,1,0,0 +0.192522,0.000000,0.000000,0.981293,1,1,0,0 +0.191494,0.000000,0.000000,0.981494,1,1,0,0 +0.190466,0.000000,0.000000,0.981694,1,1,0,0 +0.189438,0.000000,0.000000,0.981893,1,1,0,0 +0.188410,0.000000,0.000000,0.982090,1,1,0,0 +0.187381,0.000000,0.000000,0.982287,1,1,0,0 +0.186353,0.000000,0.000000,0.982483,1,1,0,0 +0.185324,0.000000,0.000000,0.982678,1,1,0,0 +0.184294,0.000000,0.000000,0.982871,1,1,0,0 +0.183265,0.000000,0.000000,0.983064,1,1,0,0 +0.182236,0.000000,0.000000,0.983255,1,1,0,0 +0.181206,0.000000,0.000000,0.983445,1,1,0,0 +0.180176,0.000000,0.000000,0.983634,1,1,0,0 +0.179146,0.000000,0.000000,0.983823,1,1,0,0 +0.178115,0.000000,0.000000,0.984010,1,1,0,0 +0.177085,0.000000,0.000000,0.984196,1,1,0,0 +0.176054,0.000000,0.000000,0.984381,1,1,0,0 +0.175023,0.000000,0.000000,0.984564,1,1,0,0 +0.173992,0.000000,0.000000,0.984747,1,1,0,0 +0.172961,0.000000,0.000000,0.984929,1,1,0,0 +0.171929,0.000000,0.000000,0.985109,1,1,0,0 +0.170897,0.000000,0.000000,0.985289,1,1,0,0 +0.169866,0.000000,0.000000,0.985467,1,1,0,0 +0.168833,0.000000,0.000000,0.985645,1,1,0,0 +0.167801,0.000000,0.000000,0.985821,1,1,0,0 +0.166769,0.000000,0.000000,0.985996,1,1,0,0 +0.165736,0.000000,0.000000,0.986170,1,1,0,0 +0.164703,0.000000,0.000000,0.986343,1,1,0,0 +0.163670,0.000000,0.000000,0.986515,1,1,0,0 +0.162637,0.000000,0.000000,0.986686,1,1,0,0 +0.161604,0.000000,0.000000,0.986856,1,1,0,0 +0.160570,0.000000,0.000000,0.987024,1,1,0,0 +0.159537,0.000000,0.000000,0.987192,1,1,0,0 +0.158503,0.000000,0.000000,0.987359,1,1,0,0 +0.157469,0.000000,0.000000,0.987524,1,1,0,0 +0.156434,0.000000,0.000000,0.987688,1,1,0,0 +0.155400,0.000000,0.000000,0.987852,1,1,0,0 +0.154366,0.000000,0.000000,0.988014,1,1,0,0 +0.153331,0.000000,0.000000,0.988175,1,1,0,0 +0.152296,0.000000,0.000000,0.988335,1,1,0,0 +0.151261,0.000000,0.000000,0.988494,1,1,0,0 +0.150226,0.000000,0.000000,0.988652,1,1,0,0 +0.149190,0.000000,0.000000,0.988809,1,1,0,0 +0.148155,0.000000,0.000000,0.988964,1,1,0,0 +0.147119,0.000000,0.000000,0.989119,1,1,0,0 +0.146083,0.000000,0.000000,0.989272,1,1,0,0 +0.145047,0.000000,0.000000,0.989425,1,1,0,0 +0.144011,0.000000,0.000000,0.989576,1,1,0,0 +0.142974,0.000000,0.000000,0.989726,1,1,0,0 +0.141938,0.000000,0.000000,0.989876,1,1,0,0 +0.140901,0.000000,0.000000,0.990024,1,1,0,0 +0.139864,0.000000,0.000000,0.990171,1,1,0,0 +0.138827,0.000000,0.000000,0.990317,1,1,0,0 +0.137790,0.000000,0.000000,0.990461,1,1,0,0 +0.136753,0.000000,0.000000,0.990605,1,1,0,0 +0.135716,0.000000,0.000000,0.990748,1,1,0,0 +0.134678,0.000000,0.000000,0.990889,1,1,0,0 +0.133640,0.000000,0.000000,0.991030,1,1,0,0 +0.132602,0.000000,0.000000,0.991169,1,1,0,0 +0.131564,0.000000,0.000000,0.991308,1,1,0,0 +0.130526,0.000000,0.000000,0.991445,1,1,0,0 +0.129488,0.000000,0.000000,0.991581,1,1,0,0 +0.128449,0.000000,0.000000,0.991716,0,1,0,0 +0.127411,0.000000,0.000000,0.991850,0,1,0,0 +0.126372,0.000000,0.000000,0.991983,0,1,0,0 +0.125333,0.000000,0.000000,0.992115,0,1,0,0 +0.124294,0.000000,0.000000,0.992245,0,1,0,0 +0.123255,0.000000,0.000000,0.992375,0,1,0,0 +0.122216,0.000000,0.000000,0.992504,0,1,0,0 +0.121176,0.000000,0.000000,0.992631,0,1,0,0 +0.120137,0.000000,0.000000,0.992757,1,0,0,0 +0.119097,0.000000,0.000000,0.992883,1,0,0,0 +0.118057,0.000000,0.000000,0.993007,1,0,0,0 +0.117017,0.000000,0.000000,0.993130,1,0,0,0 +0.115977,0.000000,0.000000,0.993252,1,0,0,0 +0.114937,0.000000,0.000000,0.993373,1,0,0,0 +0.113897,0.000000,0.000000,0.993493,1,0,0,0 +0.112856,0.000000,0.000000,0.993611,1,0,0,0 +0.111816,0.000000,0.000000,0.993729,1,0,0,0 +0.110775,0.000000,0.000000,0.993845,1,0,0,0 +0.109734,0.000000,0.000000,0.993961,1,0,0,0 +0.108693,0.000000,0.000000,0.994075,1,0,0,0 +0.107652,0.000000,0.000000,0.994189,1,0,0,0 +0.106611,0.000000,0.000000,0.994301,1,0,0,0 +0.105570,0.000000,0.000000,0.994412,1,0,0,0 +0.104528,0.000000,0.000000,0.994522,1,0,0,0 +0.103487,0.000000,0.000000,0.994631,1,0,0,0 +0.102445,0.000000,0.000000,0.994739,1,0,0,0 +0.101404,0.000000,0.000000,0.994845,1,0,0,0 +0.100362,0.000000,0.000000,0.994951,1,0,0,0 +0.099320,0.000000,0.000000,0.995056,1,0,0,0 +0.098278,0.000000,0.000000,0.995159,1,0,0,0 +0.097235,0.000000,0.000000,0.995261,1,0,0,0 +0.096193,0.000000,0.000000,0.995363,1,0,0,0 +0.095151,0.000000,0.000000,0.995463,1,0,0,0 +0.094108,0.000000,0.000000,0.995562,1,0,0,0 +0.093066,0.000000,0.000000,0.995660,1,0,0,0 +0.092023,0.000000,0.000000,0.995757,1,0,0,0 +0.090980,0.000000,0.000000,0.995853,1,0,0,0 +0.089937,0.000000,0.000000,0.995947,1,0,0,0 +0.088894,0.000000,0.000000,0.996041,1,0,0,0 +0.087851,0.000000,0.000000,0.996134,1,0,0,0 +0.086808,0.000000,0.000000,0.996225,1,0,0,0 +0.085765,0.000000,0.000000,0.996315,1,0,0,0 +0.084721,0.000000,0.000000,0.996405,1,0,0,0 +0.083678,0.000000,0.000000,0.996493,1,0,0,0 +0.082634,0.000000,0.000000,0.996580,1,0,0,0 +0.081591,0.000000,0.000000,0.996666,1,0,0,0 +0.080547,0.000000,0.000000,0.996751,1,0,0,0 +0.079503,0.000000,0.000000,0.996835,1,0,0,0 +0.078459,0.000000,0.000000,0.996917,1,0,0,0 +0.077415,0.000000,0.000000,0.996999,1,0,0,0 +0.076371,0.000000,0.000000,0.997079,1,0,0,0 +0.075327,0.000000,0.000000,0.997159,1,0,0,0 +0.074283,0.000000,0.000000,0.997237,1,0,0,0 +0.073238,0.000000,0.000000,0.997314,1,0,0,0 +0.072194,0.000000,0.000000,0.997391,1,0,0,0 +0.071149,0.000000,0.000000,0.997466,1,0,0,0 +0.070105,0.000000,0.000000,0.997540,1,0,0,0 +0.069060,0.000000,0.000000,0.997613,1,0,0,0 +0.068015,0.000000,0.000000,0.997684,1,0,0,0 +0.066970,0.000000,0.000000,0.997755,1,0,0,0 +0.065926,0.000000,0.000000,0.997825,1,0,0,0 +0.064881,0.000000,0.000000,0.997893,1,0,0,0 +0.063836,0.000000,0.000000,0.997960,1,0,0,0 +0.062791,0.000000,0.000000,0.998027,1,0,0,0 +0.061745,0.000000,0.000000,0.998092,1,0,0,0 +0.060700,0.000000,0.000000,0.998156,1,0,0,0 +0.059655,0.000000,0.000000,0.998219,1,0,0,0 +0.058609,0.000000,0.000000,0.998281,1,0,0,0 +0.057564,0.000000,0.000000,0.998342,1,0,0,0 +0.056519,0.000000,0.000000,0.998402,1,0,0,0 +0.055473,0.000000,0.000000,0.998460,1,0,0,0 +0.054427,0.000000,0.000000,0.998518,1,0,0,0 +0.053382,0.000000,0.000000,0.998574,1,0,0,0 +0.052336,0.000000,0.000000,0.998630,1,0,0,0 +0.051290,0.000000,0.000000,0.998684,1,0,0,0 +0.050244,0.000000,0.000000,0.998737,1,0,0,0 +0.049198,0.000000,0.000000,0.998789,1,0,0,0 +0.048152,0.000000,0.000000,0.998840,1,0,0,0 +0.047106,0.000000,0.000000,0.998890,1,0,0,0 +0.046060,0.000000,0.000000,0.998939,1,0,0,0 +0.045014,0.000000,0.000000,0.998986,1,0,0,0 +0.043968,0.000000,0.000000,0.999033,1,0,0,0 +0.042922,0.000000,0.000000,0.999078,1,0,0,0 +0.041876,0.000000,0.000000,0.999123,1,0,0,0 +0.040829,0.000000,0.000000,0.999166,1,0,0,0 +0.039783,0.000000,0.000000,0.999208,1,0,0,0 +0.038737,0.000000,0.000000,0.999249,1,0,0,0 +0.037690,0.000000,0.000000,0.999289,1,0,0,0 +0.036644,0.000000,0.000000,0.999328,1,0,0,0 +0.035597,0.000000,0.000000,0.999366,1,0,0,0 +0.034551,0.000000,0.000000,0.999403,1,0,0,0 +0.033504,0.000000,0.000000,0.999439,1,0,0,0 +0.032457,0.000000,0.000000,0.999473,1,0,0,0 +0.031411,0.000000,0.000000,0.999507,1,0,0,0 +0.030364,0.000000,0.000000,0.999539,1,0,0,0 +0.029317,0.000000,0.000000,0.999570,1,0,0,0 +0.028271,0.000000,0.000000,0.999600,1,0,0,0 +0.027224,0.000000,0.000000,0.999629,1,0,0,0 +0.026177,0.000000,0.000000,0.999657,1,0,0,0 +0.025130,0.000000,0.000000,0.999684,1,0,0,0 +0.024083,0.000000,0.000000,0.999710,1,0,0,0 +0.023036,0.000000,0.000000,0.999735,1,0,0,0 +0.021989,0.000000,0.000000,0.999758,1,0,0,0 +0.020942,0.000000,0.000000,0.999781,1,0,0,0 +0.019895,0.000000,0.000000,0.999802,1,0,0,0 +0.018848,0.000000,0.000000,0.999822,1,0,0,0 +0.017801,0.000000,0.000000,0.999842,1,0,0,0 +0.016754,0.000000,0.000000,0.999860,1,0,0,0 +0.015707,0.000000,0.000000,0.999877,1,0,0,0 +0.014660,0.000000,0.000000,0.999893,1,0,0,0 +0.013613,0.000000,0.000000,0.999907,1,0,0,0 +0.012566,0.000000,0.000000,0.999921,1,0,0,0 +0.011519,0.000000,0.000000,0.999934,1,0,0,0 +0.010472,0.000000,0.000000,0.999945,1,0,0,0 +0.009425,0.000000,0.000000,0.999956,1,0,0,0 +0.008377,0.000000,0.000000,0.999965,1,0,0,0 +0.007330,0.000000,0.000000,0.999973,1,0,0,0 +0.006283,0.000000,0.000000,0.999980,1,0,0,0 +0.005236,0.000000,0.000000,0.999986,1,0,0,0 +0.004189,0.000000,0.000000,0.999991,1,0,0,0 +0.003142,0.000000,0.000000,0.999995,1,0,0,0 +0.002094,0.000000,0.000000,0.999998,1,0,0,0 +0.001047,0.000000,0.000000,0.999999,1,0,0,0 +0.000000,0.000000,0.000000,1.000000,1,0,0,0 +-0.001047,-0.000000,0.000000,0.999999,1,0,0,0 +-0.002094,-0.000000,0.000000,0.999998,1,0,0,0 +-0.003142,-0.000000,0.000000,0.999995,1,0,0,0 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,1,0,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.004189,-0.000000,0.000000,0.999991,0,1,1,300 +-0.260842,-0.000000,0.000000,0.965382,0,1,0,0 +-0.261852,-0.000000,0.000000,0.965108,1,1,0,0 +-0.262863,-0.000000,0.000000,0.964833,1,1,0,0 +-0.263873,-0.000000,0.000000,0.964557,1,1,0,0 +-0.264883,-0.000000,0.000000,0.964281,1,1,0,0 +-0.265893,-0.000000,0.000000,0.964003,1,1,0,0 +-0.266902,-0.000000,0.000000,0.963724,1,1,0,0 +-0.267911,-0.000000,0.000000,0.963444,1,1,0,0 +-0.268920,-0.000000,0.000000,0.963163,1,1,0,0 +-0.269928,-0.000000,0.000000,0.962880,1,1,0,0 +-0.270936,-0.000000,0.000000,0.962597,1,1,0,0 +-0.271944,-0.000000,0.000000,0.962313,1,1,0,0 +-0.272952,-0.000000,0.000000,0.962028,1,1,0,0 +-0.273959,-0.000000,0.000000,0.961741,1,1,0,0 +-0.274966,-0.000000,0.000000,0.961454,1,1,0,0 +-0.275973,-0.000000,0.000000,0.961165,1,1,0,0 +-0.276979,-0.000000,0.000000,0.960876,1,1,0,0 +-0.277985,-0.000000,0.000000,0.960585,1,1,0,0 +-0.278991,-0.000000,0.000000,0.960294,1,1,0,0 +-0.279997,-0.000000,0.000000,0.960001,1,1,0,0 +-0.281002,-0.000000,0.000000,0.959707,1,1,0,0 +-0.282007,-0.000000,0.000000,0.959412,1,1,0,0 +-0.283011,-0.000000,0.000000,0.959117,1,1,0,0 +-0.284015,-0.000000,0.000000,0.958820,1,1,0,0 +-0.285019,-0.000000,0.000000,0.958522,1,1,0,0 +-0.286023,-0.000000,0.000000,0.958223,1,1,0,0 +-0.287026,-0.000000,0.000000,0.957923,1,1,0,0 +-0.288029,-0.000000,0.000000,0.957622,1,1,0,0 +-0.289032,-0.000000,0.000000,0.957319,1,1,0,0 +-0.290034,-0.000000,0.000000,0.957016,1,1,0,0 +-0.291036,-0.000000,0.000000,0.956712,1,1,0,0 +-0.292038,-0.000000,0.000000,0.956407,1,1,0,0 +-0.293039,-0.000000,0.000000,0.956100,1,1,0,0 +-0.294040,-0.000000,0.000000,0.955793,1,1,0,0 +-0.295041,-0.000000,0.000000,0.955485,1,1,0,0 +-0.296041,-0.000000,0.000000,0.955175,1,1,0,0 +-0.297042,-0.000000,0.000000,0.954865,1,1,0,0 +-0.298041,-0.000000,0.000000,0.954553,1,1,0,0 +-0.299041,-0.000000,0.000000,0.954240,1,1,0,0 +-0.300040,-0.000000,0.000000,0.953927,1,1,0,0 +-0.301039,-0.000000,0.000000,0.953612,1,1,0,0 +-0.302037,-0.000000,0.000000,0.953296,1,1,0,0 +-0.303035,-0.000000,0.000000,0.952979,1,1,0,0 +-0.304033,-0.000000,0.000000,0.952661,1,1,0,0 +-0.305031,-0.000000,0.000000,0.952343,1,1,0,0 +-0.306028,-0.000000,0.000000,0.952023,1,1,0,0 +-0.307024,-0.000000,0.000000,0.951702,1,1,0,0 +-0.308021,-0.000000,0.000000,0.951380,1,1,0,0 +-0.309017,-0.000000,0.000000,0.951057,1,1,0,0 +-0.310013,-0.000000,0.000000,0.950732,1,1,0,0 +-0.311008,-0.000000,0.000000,0.950407,1,1,0,0 +-0.312003,-0.000000,0.000000,0.950081,1,1,0,0 +-0.312998,-0.000000,0.000000,0.949754,1,1,0,0 +-0.313992,-0.000000,0.000000,0.949425,1,1,0,0 +-0.314987,-0.000000,0.000000,0.949096,1,1,0,0 +-0.315980,-0.000000,0.000000,0.948766,1,1,0,0 +-0.316974,-0.000000,0.000000,0.948434,1,1,0,0 +-0.317967,-0.000000,0.000000,0.948102,1,1,0,0 +-0.318959,-0.000000,0.000000,0.947768,1,1,0,0 +-0.319952,-0.000000,0.000000,0.947434,1,1,0,0 +-0.320944,-0.000000,0.000000,0.947098,1,1,0,0 +-0.321935,-0.000000,0.000000,0.946762,1,1,0,0 +-0.322927,-0.000000,0.000000,0.946424,1,1,0,0 +-0.323917,-0.000000,0.000000,0.946085,1,1,0,0 +-0.324908,-0.000000,0.000000,0.945746,1,1,0,0 +-0.325898,-0.000000,0.000000,0.945405,1,1,0,0 +-0.326888,-0.000000,0.000000,0.945063,1,1,0,0 +-0.327878,-0.000000,0.000000,0.944720,1,1,0,0 +-0.328867,-0.000000,0.000000,0.944376,1,1,0,0 +-0.329855,-0.000000,0.000000,0.944031,1,1,0,0 +-0.330844,-0.000000,0.000000,0.943686,1,1,0,0 +-0.331832,-0.000000,0.000000,0.943339,1,1,0,0 +-0.332820,-0.000000,0.000000,0.942991,1,1,0,0 +-0.333807,-0.000000,0.000000,0.942641,1,1,0,0 +-0.334794,-0.000000,0.000000,0.942291,1,1,0,0 +-0.335780,-0.000000,0.000000,0.941940,1,1,0,0 +-0.336767,-0.000000,0.000000,0.941588,1,1,0,0 +-0.337752,-0.000000,0.000000,0.941235,1,1,0,0 +-0.338738,-0.000000,0.000000,0.940881,1,1,0,0 +-0.339723,-0.000000,0.000000,0.940526,1,1,0,0 +-0.340708,-0.000000,0.000000,0.940169,1,1,0,0 +-0.341692,-0.000000,0.000000,0.939812,1,1,0,0 +-0.342676,-0.000000,0.000000,0.939454,2,1,0,0 +-0.343660,-0.000000,0.000000,0.939094,2,1,0,0 +-0.344643,-0.000000,0.000000,0.938734,2,1,0,0 +-0.345626,-0.000000,0.000000,0.938372,2,1,0,0 +-0.346608,-0.000000,0.000000,0.938010,2,1,0,0 +-0.347590,-0.000000,0.000000,0.937646,2,1,0,0 +-0.348572,-0.000000,0.000000,0.937282,2,1,0,0 +-0.349553,-0.000000,0.000000,0.936916,2,1,0,0 +-0.350534,-0.000000,0.000000,0.936550,2,1,0,0 +-0.351515,-0.000000,0.000000,0.936182,2,1,0,0 +-0.352495,-0.000000,0.000000,0.935814,2,1,0,0 +-0.353475,-0.000000,0.000000,0.935444,2,1,0,0 +-0.354454,-0.000000,0.000000,0.935073,2,1,0,0 +-0.355433,-0.000000,0.000000,0.934702,2,1,0,0 +-0.356412,-0.000000,0.000000,0.934329,2,1,0,0 +-0.357390,-0.000000,0.000000,0.933955,2,1,0,0 +-0.358368,-0.000000,0.000000,0.933580,2,1,0,0 +-0.359345,-0.000000,0.000000,0.933205,2,1,0,0 +-0.360322,-0.000000,0.000000,0.932828,2,1,0,0 +-0.361299,-0.000000,0.000000,0.932450,2,1,0,0 +-0.362275,-0.000000,0.000000,0.932071,2,1,0,0 +-0.363251,-0.000000,0.000000,0.931691,2,1,0,0 +-0.364227,-0.000000,0.000000,0.931310,2,1,0,0 +-0.365202,-0.000000,0.000000,0.930928,2,1,0,0 +-0.366176,-0.000000,0.000000,0.930545,2,1,0,0 +-0.367151,-0.000000,0.000000,0.930161,2,1,0,0 +-0.368125,-0.000000,0.000000,0.929776,2,1,0,0 +-0.369098,-0.000000,0.000000,0.929390,2,1,0,0 +-0.370071,-0.000000,0.000000,0.929003,2,1,0,0 +-0.371044,-0.000000,0.000000,0.928615,2,1,0,0 +-0.372016,-0.000000,0.000000,0.928226,2,1,0,0 +-0.372988,-0.000000,0.000000,0.927836,2,1,0,0 +-0.373959,-0.000000,0.000000,0.927445,2,1,0,0 +-0.374930,-0.000000,0.000000,0.927053,2,1,0,0 +-0.375901,-0.000000,0.000000,0.926660,2,1,0,0 +-0.376871,-0.000000,0.000000,0.926266,2,1,0,0 +-0.377841,-0.000000,0.000000,0.925871,2,1,0,0 +-0.378810,-0.000000,0.000000,0.925474,2,1,0,0 +-0.379779,-0.000000,0.000000,0.925077,2,1,0,0 +-0.380748,-0.000000,0.000000,0.924679,2,1,0,0 +-0.381716,-0.000000,0.000000,0.924280,2,1,0,0 +-0.382683,-0.000000,0.000000,0.923880,2,1,0,0 +-0.383651,-0.000000,0.000000,0.923478,2,1,0,0 +-0.384618,-0.000000,0.000000,0.923076,2,1,0,0 +-0.385584,-0.000000,0.000000,0.922673,2,1,0,0 +-0.386550,-0.000000,0.000000,0.922268,2,1,0,0 +-0.387516,-0.000000,0.000000,0.921863,2,1,0,0 +-0.388481,-0.000000,0.000000,0.921457,2,1,0,0 +-0.389445,-0.000000,0.000000,0.921050,2,1,0,0 +-0.390410,-0.000000,0.000000,0.920641,2,1,0,0 +-0.391374,-0.000000,0.000000,0.920232,2,1,0,0 +-0.392337,-0.000000,0.000000,0.919821,2,1,0,0 +-0.393300,-0.000000,0.000000,0.919410,2,1,0,0 +-0.394263,-0.000000,0.000000,0.918998,2,1,0,0 +-0.395225,-0.000000,0.000000,0.918584,2,1,0,0 +-0.396187,-0.000000,0.000000,0.918170,2,1,0,0 +-0.397148,-0.000000,0.000000,0.917755,2,1,0,0 +-0.398109,-0.000000,0.000000,0.917338,2,1,0,0 +-0.399069,-0.000000,0.000000,0.916921,2,1,0,0 +-0.400029,-0.000000,0.000000,0.916502,2,1,0,0 +-0.400989,-0.000000,0.000000,0.916083,2,1,0,0 +-0.401948,-0.000000,0.000000,0.915663,2,1,0,0 +-0.402906,-0.000000,0.000000,0.915241,2,1,0,0 +-0.403865,-0.000000,0.000000,0.914819,2,1,0,0 +-0.404822,-0.000000,0.000000,0.914395,2,1,0,0 +-0.405780,-0.000000,0.000000,0.913971,2,1,0,0 +-0.406737,-0.000000,0.000000,0.913545,2,1,0,0 +-0.407693,-0.000000,0.000000,0.913119,2,1,0,0 +-0.408649,-0.000000,0.000000,0.912692,2,1,0,0 +-0.409605,-0.000000,0.000000,0.912263,2,1,0,0 +-0.410560,-0.000000,0.000000,0.911834,2,1,0,0 +-0.411514,-0.000000,0.000000,0.911403,2,1,0,0 +-0.412469,-0.000000,0.000000,0.910972,2,1,0,0 +-0.413422,-0.000000,0.000000,0.910539,2,1,0,0 +-0.414376,-0.000000,0.000000,0.910106,2,1,0,0 +-0.415328,-0.000000,0.000000,0.909672,2,1,0,0 +-0.416281,-0.000000,0.000000,0.909236,2,1,0,0 +-0.417233,-0.000000,0.000000,0.908800,2,1,0,0 +-0.418184,-0.000000,0.000000,0.908362,2,1,0,0 +-0.419135,-0.000000,0.000000,0.907924,2,1,0,0 +-0.420086,-0.000000,0.000000,0.907484,2,1,0,0 +-0.421036,-0.000000,0.000000,0.907044,2,1,0,0 +-0.421985,-0.000000,0.000000,0.906603,2,1,0,0 +-0.422935,-0.000000,0.000000,0.906160,2,1,0,0 +-0.423883,-0.000000,0.000000,0.905717,2,1,0,0 +-0.424832,-0.000000,0.000000,0.905272,2,1,0,0 +-0.425779,-0.000000,0.000000,0.904827,2,1,0,0 +-0.426727,-0.000000,0.000000,0.904381,2,1,0,0 +-0.427673,-0.000000,0.000000,0.903933,2,1,0,0 +-0.428620,-0.000000,0.000000,0.903485,2,1,0,0 +-0.429566,-0.000000,0.000000,0.903036,2,1,0,0 +-0.430511,-0.000000,0.000000,0.902585,2,1,0,0 +-0.431456,-0.000000,0.000000,0.902134,2,1,0,0 +-0.432401,-0.000000,0.000000,0.901682,2,1,0,0 +-0.433345,-0.000000,0.000000,0.901228,2,1,0,0 +-0.434288,-0.000000,0.000000,0.900774,2,1,0,0 +-0.435231,-0.000000,0.000000,0.900319,2,1,0,0 +-0.436174,-0.000000,0.000000,0.899863,2,1,0,0 +-0.437116,-0.000000,0.000000,0.899405,2,1,0,0 +-0.438057,-0.000000,0.000000,0.898947,2,1,0,0 +-0.438999,-0.000000,0.000000,0.898488,2,1,0,0 +-0.439939,-0.000000,0.000000,0.898028,2,1,0,0 +-0.440879,-0.000000,0.000000,0.897566,2,1,0,0 +-0.441819,-0.000000,0.000000,0.897104,2,1,0,0 +-0.442758,-0.000000,0.000000,0.896641,2,1,0,0 +-0.443697,-0.000000,0.000000,0.896177,2,1,0,0 +-0.444635,-0.000000,0.000000,0.895712,2,1,0,0 +-0.445573,-0.000000,0.000000,0.895246,2,1,0,0 +-0.446510,-0.000000,0.000000,0.894779,2,1,0,0 +-0.447447,-0.000000,0.000000,0.894310,2,1,0,0 +-0.448383,-0.000000,0.000000,0.893841,2,2,0,0 +-0.449319,-0.000000,0.000000,0.893371,2,2,0,0 +-0.450254,-0.000000,0.000000,0.892900,2,2,0,0 +-0.451189,-0.000000,0.000000,0.892428,2,2,0,0 +-0.452123,-0.000000,0.000000,0.891955,2,2,0,0 +-0.453057,-0.000000,0.000000,0.891481,2,2,0,0 +-0.453990,-0.000000,0.000000,0.891007,2,2,0,0 +-0.454923,-0.000000,0.000000,0.890531,2,2,0,0 +-0.455856,-0.000000,0.000000,0.890054,2,2,0,0 +-0.456787,-0.000000,0.000000,0.889576,2,2,0,0 +-0.457719,-0.000000,0.000000,0.889097,2,2,0,0 +-0.458650,-0.000000,0.000000,0.888617,2,2,0,0 +-0.459580,-0.000000,0.000000,0.888136,2,2,0,0 +-0.460510,-0.000000,0.000000,0.887655,2,2,0,0 +-0.461439,-0.000000,0.000000,0.887172,2,2,0,0 +-0.462368,-0.000000,0.000000,0.886688,2,2,0,0 +-0.463296,-0.000000,0.000000,0.886204,2,2,0,0 +-0.464224,-0.000000,0.000000,0.885718,2,2,0,0 +-0.465151,-0.000000,0.000000,0.885231,2,2,0,0 +-0.466078,-0.000000,0.000000,0.884744,2,2,0,0 +-0.467004,-0.000000,0.000000,0.884255,2,2,0,0 +-0.467930,-0.000000,0.000000,0.883766,2,2,0,0 +-0.468855,-0.000000,0.000000,0.883275,2,2,0,0 +-0.469780,-0.000000,0.000000,0.882784,2,2,0,0 +-0.470704,-0.000000,0.000000,0.882291,2,2,0,0 +-0.471628,-0.000000,0.000000,0.881798,2,2,0,0 +-0.472551,-0.000000,0.000000,0.881303,2,2,0,0 +-0.473473,-0.000000,0.000000,0.880808,2,2,0,0 +-0.474396,-0.000000,0.000000,0.880312,2,2,0,0 +-0.475317,-0.000000,0.000000,0.879815,2,2,0,0 +-0.476238,-0.000000,0.000000,0.879316,2,2,0,0 +-0.477159,-0.000000,0.000000,0.878817,2,2,0,0 +-0.478079,-0.000000,0.000000,0.878317,2,2,0,0 +-0.478998,-0.000000,0.000000,0.877816,2,2,0,0 +-0.479917,-0.000000,0.000000,0.877314,2,2,0,0 +-0.480836,-0.000000,0.000000,0.876811,2,2,0,0 +-0.481754,-0.000000,0.000000,0.876307,2,2,0,0 +-0.482671,-0.000000,0.000000,0.875802,2,2,0,0 +-0.483588,-0.000000,0.000000,0.875296,2,2,0,0 +-0.484504,-0.000000,0.000000,0.874789,2,2,0,0 +-0.485420,-0.000000,0.000000,0.874281,2,2,0,0 +-0.486335,-0.000000,0.000000,0.873772,2,2,0,0 +-0.487250,-0.000000,0.000000,0.873262,2,2,0,0 +-0.488164,-0.000000,0.000000,0.872752,2,2,0,0 +-0.489078,-0.000000,0.000000,0.872240,2,2,0,0 +-0.489991,-0.000000,0.000000,0.871727,2,2,0,0 +-0.490904,-0.000000,0.000000,0.871214,2,2,0,0 +-0.491816,-0.000000,0.000000,0.870699,2,2,0,0 +-0.492727,-0.000000,0.000000,0.870184,2,2,0,0 +-0.493638,-0.000000,0.000000,0.869667,2,2,0,0 +-0.494549,-0.000000,0.000000,0.869150,2,2,0,0 +-0.495459,-0.000000,0.000000,0.868632,2,2,0,0 +-0.496368,-0.000000,0.000000,0.868112,2,2,0,0 +-0.497277,-0.000000,0.000000,0.867592,2,2,0,0 +-0.498185,-0.000000,0.000000,0.867071,2,2,0,0 +-0.499093,-0.000000,0.000000,0.866549,2,2,0,0 +-0.500000,-0.000000,0.000000,0.866025,2,2,0,0 +-0.500907,-0.000000,0.000000,0.865501,2,2,0,0 +-0.501813,-0.000000,0.000000,0.864976,2,2,0,0 +-0.502718,-0.000000,0.000000,0.864450,2,2,0,0 +-0.503623,-0.000000,0.000000,0.863923,2,2,0,0 +-0.504528,-0.000000,0.000000,0.863396,2,2,0,0 +-0.505431,-0.000000,0.000000,0.862867,2,2,0,0 +-0.506335,-0.000000,0.000000,0.862337,2,2,0,0 +-0.507238,-0.000000,0.000000,0.861806,2,2,0,0 +-0.508140,-0.000000,0.000000,0.861275,2,2,0,0 +-0.509041,-0.000000,0.000000,0.860742,2,2,0,0 +-0.509943,-0.000000,0.000000,0.860208,2,2,0,0 +-0.510843,-0.000000,0.000000,0.859674,2,2,0,0 +-0.511743,-0.000000,0.000000,0.859139,2,2,0,0 +-0.512642,-0.000000,0.000000,0.858602,2,2,0,0 +-0.513541,-0.000000,0.000000,0.858065,2,2,0,0 +-0.514440,-0.000000,0.000000,0.857527,2,2,0,0 +-0.515337,-0.000000,0.000000,0.856987,2,2,0,0 +-0.516234,-0.000000,0.000000,0.856447,2,2,0,0 +-0.517131,-0.000000,0.000000,0.855906,2,2,0,0 +-0.518027,-0.000000,0.000000,0.855364,2,2,0,0 +-0.518922,-0.000000,0.000000,0.854821,2,2,0,0 +-0.519817,-0.000000,0.000000,0.854277,2,2,0,0 +-0.520712,-0.000000,0.000000,0.853733,2,2,0,0 +-0.521605,-0.000000,0.000000,0.853187,2,2,0,0 +-0.522499,-0.000000,0.000000,0.852640,2,2,0,0 +-0.523391,-0.000000,0.000000,0.852093,2,2,0,0 +-0.524283,-0.000000,0.000000,0.851544,2,2,0,0 +-0.525175,-0.000000,0.000000,0.850994,2,2,0,0 +-0.526066,-0.000000,0.000000,0.850444,2,2,0,0 +-0.526956,-0.000000,0.000000,0.849893,2,2,0,0 +-0.527846,-0.000000,0.000000,0.849340,2,2,0,0 +-0.528735,-0.000000,0.000000,0.848787,2,2,0,0 +-0.529623,-0.000000,0.000000,0.848233,2,2,0,0 +-0.530511,-0.000000,0.000000,0.847678,2,2,0,0 +-0.531399,-0.000000,0.000000,0.847122,2,2,0,0 +-0.532285,-0.000000,0.000000,0.846565,2,2,0,0 +-0.533172,-0.000000,0.000000,0.846007,2,2,0,0 +-0.534057,-0.000000,0.000000,0.845448,2,2,0,0 +-0.534942,-0.000000,0.000000,0.844889,2,2,0,0 +-0.535827,-0.000000,0.000000,0.844328,2,2,0,0 +-0.536711,-0.000000,0.000000,0.843766,2,2,0,0 +-0.537594,-0.000000,0.000000,0.843204,2,2,0,0 +-0.538477,-0.000000,0.000000,0.842640,2,2,0,0 +-0.539359,-0.000000,0.000000,0.842076,2,2,0,0 +-0.540240,-0.000000,0.000000,0.841511,2,2,0,0 +-0.541121,-0.000000,0.000000,0.840945,2,2,0,0 +-0.542002,-0.000000,0.000000,0.840377,2,2,0,0 +-0.542881,-0.000000,0.000000,0.839809,2,2,0,0 +-0.543760,-0.000000,0.000000,0.839240,2,2,0,0 +-0.544639,-0.000000,0.000000,0.838671,2,2,0,0 +-0.545517,-0.000000,0.000000,0.838100,2,2,0,0 +-0.546394,-0.000000,0.000000,0.837528,2,2,0,0 +-0.547271,-0.000000,0.000000,0.836955,2,2,0,0 +-0.548147,-0.000000,0.000000,0.836382,2,2,0,0 +-0.549023,-0.000000,0.000000,0.835807,2,2,0,0 +-0.549898,-0.000000,0.000000,0.835232,2,2,0,0 +-0.550772,-0.000000,0.000000,0.834656,2,2,0,0 +-0.551646,-0.000000,0.000000,0.834078,2,2,0,0 +-0.552519,-0.000000,0.000000,0.833500,2,2,0,0 +-0.553392,-0.000000,0.000000,0.832921,2,2,0,0 +-0.554263,-0.000000,0.000000,0.832341,2,2,0,0 +-0.555135,-0.000000,0.000000,0.831760,2,2,0,0 +-0.556006,-0.000000,0.000000,0.831179,2,2,0,0 +-0.556876,-0.000000,0.000000,0.830596,2,2,0,0 +-0.557745,-0.000000,0.000000,0.830012,2,2,0,0 +-0.558614,-0.000000,0.000000,0.829428,2,2,0,0 +-0.559482,-0.000000,0.000000,0.828842,2,2,0,0 +-0.560350,-0.000000,0.000000,0.828256,2,2,0,0 +-0.561217,-0.000000,0.000000,0.827669,2,2,0,0 +-0.562083,-0.000000,0.000000,0.827081,2,2,0,0 +-0.562949,-0.000000,0.000000,0.826492,2,2,0,0 +-0.563814,-0.000000,0.000000,0.825902,2,2,0,0 +-0.564679,-0.000000,0.000000,0.825311,2,2,0,0 +-0.565543,-0.000000,0.000000,0.824719,2,2,0,0 +-0.566406,-0.000000,0.000000,0.824126,2,2,0,0 +-0.567269,-0.000000,0.000000,0.823533,2,2,0,0 +-0.568131,-0.000000,0.000000,0.822938,2,2,0,0 +-0.568993,-0.000000,0.000000,0.822343,2,2,0,0 +-0.569853,-0.000000,0.000000,0.821746,2,2,0,0 +-0.570714,-0.000000,0.000000,0.821149,2,2,0,0 +-0.571573,-0.000000,0.000000,0.820551,2,2,0,0 +-0.572432,-0.000000,0.000000,0.819952,2,2,0,0 +-0.573290,-0.000000,0.000000,0.819352,2,2,0,0 +-0.574148,-0.000000,0.000000,0.818751,2,2,0,0 +-0.575005,-0.000000,0.000000,0.818150,2,2,0,0 +-0.575862,-0.000000,0.000000,0.817547,2,2,0,0 +-0.576718,-0.000000,0.000000,0.816944,2,2,0,0 +-0.577573,-0.000000,0.000000,0.816339,2,2,0,0 +-0.578427,-0.000000,0.000000,0.815734,2,2,0,0 +-0.579281,-0.000000,0.000000,0.815128,2,2,0,0 +-0.580134,-0.000000,0.000000,0.814521,2,2,0,0 +-0.580987,-0.000000,0.000000,0.813913,2,2,0,0 +-0.581839,-0.000000,0.000000,0.813304,2,2,0,0 +-0.582690,-0.000000,0.000000,0.812694,2,2,0,0 +-0.583541,-0.000000,0.000000,0.812084,2,2,0,0 +-0.584391,-0.000000,0.000000,0.811472,2,2,0,0 +-0.585241,-0.000000,0.000000,0.810860,2,2,0,0 +-0.586090,-0.000000,0.000000,0.810246,2,2,0,0 +-0.586938,-0.000000,0.000000,0.809632,2,2,0,0 +-0.587785,-0.000000,0.000000,0.809017,2,2,0,0 +-0.588632,-0.000000,0.000000,0.808401,2,2,0,0 +-0.589478,-0.000000,0.000000,0.807784,2,2,0,0 +-0.590324,-0.000000,0.000000,0.807166,2,2,0,0 +-0.591169,-0.000000,0.000000,0.806548,2,2,0,0 +-0.592013,-0.000000,0.000000,0.805928,2,2,0,0 +-0.592857,-0.000000,0.000000,0.805308,2,2,0,0 +-0.593700,-0.000000,0.000000,0.804687,2,2,0,0 +-0.594542,-0.000000,0.000000,0.804064,2,2,0,0 +-0.595384,-0.000000,0.000000,0.803441,2,2,0,0 +-0.596225,-0.000000,0.000000,0.802817,2,2,0,0 +-0.597065,-0.000000,0.000000,0.802193,2,2,0,0 +-0.597905,-0.000000,0.000000,0.801567,2,2,0,0 +-0.598744,-0.000000,0.000000,0.800940,2,2,0,0 +-0.599582,-0.000000,0.000000,0.800313,2,2,0,0 +-0.600420,-0.000000,0.000000,0.799685,2,2,0,0 +-0.601257,-0.000000,0.000000,0.799055,2,2,0,0 +-0.602094,-0.000000,0.000000,0.798425,2,2,0,0 +-0.602930,-0.000000,0.000000,0.797794,2,2,0,0 +-0.603765,-0.000000,0.000000,0.797163,2,2,0,0 +-0.604599,-0.000000,0.000000,0.796530,2,2,0,0 +-0.605433,-0.000000,0.000000,0.795896,2,2,0,0 +-0.606266,-0.000000,0.000000,0.795262,2,2,0,0 +-0.607098,-0.000000,0.000000,0.794627,2,2,0,0 +-0.607930,-0.000000,0.000000,0.793990,2,2,0,0 +-0.608761,-0.000000,0.000000,0.793353,2,2,0,0 +-0.609592,-0.000000,0.000000,0.792715,2,2,0,0 +-0.610422,-0.000000,0.000000,0.792077,2,2,0,0 +-0.611251,-0.000000,0.000000,0.791437,2,2,0,0 +-0.612079,-0.000000,0.000000,0.790796,2,2,0,0 +-0.612907,-0.000000,0.000000,0.790155,2,2,0,0 +-0.613734,-0.000000,0.000000,0.789513,2,2,0,0 +-0.614561,-0.000000,0.000000,0.788870,2,2,0,0 +-0.615386,-0.000000,0.000000,0.788226,2,2,0,0 +-0.616211,-0.000000,0.000000,0.787581,2,2,0,0 +-0.617036,-0.000000,0.000000,0.786935,2,2,0,0 +-0.617860,-0.000000,0.000000,0.786288,2,2,0,0 +-0.618683,-0.000000,0.000000,0.785641,2,2,0,0 +-0.619505,-0.000000,0.000000,0.784993,2,2,0,0 +-0.620327,-0.000000,0.000000,0.784343,2,2,0,0 +-0.621148,-0.000000,0.000000,0.783693,2,2,0,0 +-0.621968,-0.000000,0.000000,0.783043,2,2,0,0 +-0.622788,-0.000000,0.000000,0.782391,2,2,0,0 +-0.623607,-0.000000,0.000000,0.781738,2,2,0,0 +-0.624425,-0.000000,0.000000,0.781085,2,2,0,0 +-0.625243,-0.000000,0.000000,0.780430,2,2,0,0 +-0.626060,-0.000000,0.000000,0.779775,2,2,0,0 +-0.626876,-0.000000,0.000000,0.779119,2,2,0,0 +-0.627691,-0.000000,0.000000,0.778462,2,2,0,0 +-0.628506,-0.000000,0.000000,0.777805,2,2,0,0 +-0.629320,-0.000000,0.000000,0.777146,2,2,0,0 +-0.630134,-0.000000,0.000000,0.776487,2,2,0,0 +-0.630947,-0.000000,0.000000,0.775826,2,2,0,0 +-0.631759,-0.000000,0.000000,0.775165,2,2,0,0 +-0.632570,-0.000000,0.000000,0.774503,2,2,0,0 +-0.633381,-0.000000,0.000000,0.773840,2,2,0,0 +-0.634191,-0.000000,0.000000,0.773177,2,2,0,0 +-0.635000,-0.000000,0.000000,0.772512,2,2,0,0 +-0.635809,-0.000000,0.000000,0.771847,2,2,0,0 +-0.636617,-0.000000,0.000000,0.771180,2,2,0,0 +-0.637424,-0.000000,0.000000,0.770513,2,2,0,0 +-0.638231,-0.000000,0.000000,0.769845,2,2,0,0 +-0.639036,-0.000000,0.000000,0.769177,1,2,0,0 +-0.639841,-0.000000,0.000000,0.768507,1,2,0,0 +-0.640646,-0.000000,0.000000,0.767836,1,2,0,0 +-0.641450,-0.000000,0.000000,0.767165,1,2,0,0 +-0.642253,-0.000000,0.000000,0.766493,1,2,0,0 +-0.643055,-0.000000,0.000000,0.765820,1,2,0,0 +-0.643857,-0.000000,0.000000,0.765146,1,2,0,0 +-0.644657,-0.000000,0.000000,0.764472,1,2,0,0 +-0.645458,-0.000000,0.000000,0.763796,1,2,0,0 +-0.646257,-0.000000,0.000000,0.763120,1,2,0,0 +-0.647056,-0.000000,0.000000,0.762443,1,2,0,0 +-0.647854,-0.000000,0.000000,0.761764,1,2,0,0 +-0.648651,-0.000000,0.000000,0.761086,1,2,0,0 +-0.649448,-0.000000,0.000000,0.760406,1,2,0,0 +-0.650244,-0.000000,0.000000,0.759725,1,2,0,0 +-0.651039,-0.000000,0.000000,0.759044,1,2,0,0 +-0.651834,-0.000000,0.000000,0.758362,1,2,0,0 +-0.652628,-0.000000,0.000000,0.757679,1,2,0,0 +-0.653421,-0.000000,0.000000,0.756995,1,2,0,0 +-0.654213,-0.000000,0.000000,0.756310,1,2,0,0 +-0.655005,-0.000000,0.000000,0.755625,1,2,0,0 +-0.655796,-0.000000,0.000000,0.754939,1,2,0,0 +-0.656586,-0.000000,0.000000,0.754251,1,2,0,0 +-0.657375,-0.000000,0.000000,0.753563,1,2,0,0 +-0.658164,-0.000000,0.000000,0.752875,1,2,0,0 +-0.658952,-0.000000,0.000000,0.752185,1,2,0,0 +-0.659739,-0.000000,0.000000,0.751494,1,2,0,0 +-0.660526,-0.000000,0.000000,0.750803,1,2,0,0 +-0.661312,-0.000000,0.000000,0.750111,1,2,0,0 +-0.662097,-0.000000,0.000000,0.749418,1,2,0,0 +-0.662881,-0.000000,0.000000,0.748724,1,2,0,0 +-0.663665,-0.000000,0.000000,0.748030,1,2,0,0 +-0.664448,-0.000000,0.000000,0.747334,1,2,0,0 +-0.665230,-0.000000,0.000000,0.746638,1,2,0,0 +-0.666012,-0.000000,0.000000,0.745941,1,2,0,0 +-0.666793,-0.000000,0.000000,0.745243,1,2,0,0 +-0.667573,-0.000000,0.000000,0.744545,1,2,0,0 +-0.668352,-0.000000,0.000000,0.743845,1,2,0,0 +-0.669131,-0.000000,0.000000,0.743145,1,2,0,0 +-0.669908,-0.000000,0.000000,0.742444,1,2,0,0 +-0.670686,-0.000000,0.000000,0.741742,1,2,0,0 +-0.671462,-0.000000,0.000000,0.741039,1,2,0,0 +-0.672238,-0.000000,0.000000,0.740335,1,2,0,0 +-0.673013,-0.000000,0.000000,0.739631,1,2,0,0 +-0.673787,-0.000000,0.000000,0.738926,1,2,0,0 +-0.674560,-0.000000,0.000000,0.738220,1,2,0,0 +-0.675333,-0.000000,0.000000,0.737513,1,2,0,0 +-0.676105,-0.000000,0.000000,0.736806,1,2,0,0 +-0.676876,-0.000000,0.000000,0.736097,1,2,0,0 +-0.677646,-0.000000,0.000000,0.735388,1,2,0,0 +-0.678416,-0.000000,0.000000,0.734678,1,2,0,0 +-0.679185,-0.000000,0.000000,0.733967,1,2,0,0 +-0.679953,-0.000000,0.000000,0.733255,1,2,0,0 +-0.680721,-0.000000,0.000000,0.732543,1,2,0,0 +-0.681488,-0.000000,0.000000,0.731830,1,2,0,0 +-0.682254,-0.000000,0.000000,0.731116,1,2,0,0 +-0.683019,-0.000000,0.000000,0.730401,1,2,0,0 +-0.683783,-0.000000,0.000000,0.729685,1,2,0,0 +-0.684547,-0.000000,0.000000,0.728969,1,2,0,0 +-0.685310,-0.000000,0.000000,0.728251,1,2,0,0 +-0.686072,-0.000000,0.000000,0.727533,1,2,0,0 +-0.686834,-0.000000,0.000000,0.726814,1,2,0,0 +-0.687595,-0.000000,0.000000,0.726095,1,2,0,0 +-0.688355,-0.000000,0.000000,0.725374,1,2,0,0 +-0.689114,-0.000000,0.000000,0.724653,1,2,0,0 +-0.689872,-0.000000,0.000000,0.723931,1,2,0,0 +-0.690630,-0.000000,0.000000,0.723208,1,2,0,0 +-0.691387,-0.000000,0.000000,0.722485,1,2,0,0 +-0.692143,-0.000000,0.000000,0.721760,1,2,0,0 +-0.692899,-0.000000,0.000000,0.721035,1,2,0,0 +-0.693653,-0.000000,0.000000,0.720309,1,2,0,0 +-0.694407,-0.000000,0.000000,0.719582,1,2,0,0 +-0.695160,-0.000000,0.000000,0.718855,1,2,0,0 +-0.695913,-0.000000,0.000000,0.718126,1,2,0,0 +-0.696664,-0.000000,0.000000,0.717397,1,2,0,0 +-0.697415,-0.000000,0.000000,0.716667,1,2,0,0 +-0.698165,-0.000000,0.000000,0.715936,1,2,0,0 +-0.698915,-0.000000,0.000000,0.715205,1,2,0,0 +-0.699663,-0.000000,0.000000,0.714473,1,2,0,0 +-0.700411,-0.000000,0.000000,0.713740,1,2,0,0 +-0.701158,-0.000000,0.000000,0.713006,1,2,0,0 +-0.701904,-0.000000,0.000000,0.712271,1,2,0,0 +-0.702650,-0.000000,0.000000,0.711536,1,2,0,0 +-0.703395,-0.000000,0.000000,0.710799,1,2,0,0 +-0.704139,-0.000000,0.000000,0.710062,1,2,0,0 +-0.704882,-0.000000,0.000000,0.709325,1,2,0,0 +-0.705624,-0.000000,0.000000,0.708586,1,2,0,0 +-0.706366,-0.000000,0.000000,0.707847,1,2,0,0 +-0.707107,-0.000000,0.000000,0.707107,1,2,0,0 +-0.707847,-0.000000,0.000000,0.706366,1,2,0,0 +-0.708586,-0.000000,0.000000,0.705624,1,2,0,0 +-0.709325,-0.000000,0.000000,0.704882,1,2,0,0 +-0.710062,-0.000000,0.000000,0.704139,1,2,0,0 +-0.710799,-0.000000,0.000000,0.703395,1,2,0,0 +-0.711536,-0.000000,0.000000,0.702650,1,2,0,0 +-0.712271,-0.000000,0.000000,0.701904,1,2,0,0 +-0.713006,-0.000000,0.000000,0.701158,1,2,0,0 +-0.713740,-0.000000,0.000000,0.700411,1,2,0,0 +-0.714473,-0.000000,0.000000,0.699663,1,2,0,0 +-0.715205,-0.000000,0.000000,0.698915,1,2,0,0 +-0.715936,-0.000000,0.000000,0.698165,1,2,0,0 +-0.716667,-0.000000,0.000000,0.697415,1,2,0,0 +-0.717397,-0.000000,0.000000,0.696664,1,2,0,0 +-0.718126,-0.000000,0.000000,0.695913,1,2,0,0 +-0.718855,-0.000000,0.000000,0.695160,1,2,0,0 +-0.719582,-0.000000,0.000000,0.694407,1,2,0,0 +-0.720309,-0.000000,0.000000,0.693653,1,2,0,0 +-0.721035,-0.000000,0.000000,0.692899,1,2,0,0 +-0.721760,-0.000000,0.000000,0.692143,1,2,0,0 +-0.722485,-0.000000,0.000000,0.691387,1,2,0,0 +-0.723208,-0.000000,0.000000,0.690630,1,2,0,0 +-0.723931,-0.000000,0.000000,0.689872,1,2,0,0 +-0.724653,-0.000000,0.000000,0.689114,1,2,0,0 +-0.725374,-0.000000,0.000000,0.688355,1,2,0,0 +-0.726095,-0.000000,0.000000,0.687595,1,2,0,0 +-0.726814,-0.000000,0.000000,0.686834,1,2,0,0 +-0.727533,-0.000000,0.000000,0.686072,1,2,0,0 +-0.728251,-0.000000,0.000000,0.685310,1,2,0,0 +-0.728969,-0.000000,0.000000,0.684547,1,2,0,0 +-0.729685,-0.000000,0.000000,0.683783,1,2,0,0 +-0.730401,-0.000000,0.000000,0.683019,1,2,0,0 +-0.731116,-0.000000,0.000000,0.682254,1,2,0,0 +-0.731830,-0.000000,0.000000,0.681488,1,2,0,0 +-0.732543,-0.000000,0.000000,0.680721,1,2,0,0 +-0.733255,-0.000000,0.000000,0.679953,1,2,0,0 +-0.733967,-0.000000,0.000000,0.679185,1,2,0,0 +-0.734678,-0.000000,0.000000,0.678416,1,2,0,0 +-0.735388,-0.000000,0.000000,0.677646,1,2,0,0 +-0.736097,-0.000000,0.000000,0.676876,1,2,0,0 +-0.736806,-0.000000,0.000000,0.676105,0,2,0,0 +-0.737513,-0.000000,0.000000,0.675333,0,2,0,0 +-0.738220,-0.000000,0.000000,0.674560,0,2,0,0 +-0.738926,-0.000000,0.000000,0.673787,0,2,0,0 +-0.739631,-0.000000,0.000000,0.673013,0,2,0,0 +-0.740335,-0.000000,0.000000,0.672238,0,2,0,0 +-0.741039,-0.000000,0.000000,0.671462,0,2,0,0 +-0.741742,-0.000000,0.000000,0.670686,0,2,0,0 +-0.742444,-0.000000,0.000000,0.669908,0,2,0,0 +-0.743145,-0.000000,0.000000,0.669131,0,2,0,0 +-0.743845,-0.000000,0.000000,0.668352,0,2,0,0 +-0.744545,-0.000000,0.000000,0.667573,0,2,0,0 +-0.745243,-0.000000,0.000000,0.666793,0,2,0,0 +-0.745941,-0.000000,0.000000,0.666012,0,2,0,0 +-0.746638,-0.000000,0.000000,0.665230,0,2,0,0 +-0.747334,-0.000000,0.000000,0.664448,0,2,0,0 +-0.748030,-0.000000,0.000000,0.663665,0,2,0,0 +-0.748724,-0.000000,0.000000,0.662881,0,2,0,0 +-0.749418,-0.000000,0.000000,0.662097,0,2,0,0 +-0.750111,-0.000000,0.000000,0.661312,0,2,0,0 +-0.750803,-0.000000,0.000000,0.660526,0,2,0,0 +-0.751494,-0.000000,0.000000,0.659739,0,2,0,0 +-0.752185,-0.000000,0.000000,0.658952,0,2,0,0 +-0.752875,-0.000000,0.000000,0.658164,0,2,0,0 +-0.753563,-0.000000,0.000000,0.657375,0,2,0,0 +-0.754251,-0.000000,0.000000,0.656586,0,2,0,0 +-0.754939,-0.000000,0.000000,0.655796,0,2,0,0 +-0.755625,-0.000000,0.000000,0.655005,0,2,0,0 +-0.756310,-0.000000,0.000000,0.654213,0,2,0,0 +-0.756995,-0.000000,0.000000,0.653421,0,2,0,0 +-0.757679,-0.000000,0.000000,0.652628,0,2,0,0 +-0.758362,-0.000000,0.000000,0.651834,0,2,0,0 +-0.759044,-0.000000,0.000000,0.651039,0,2,0,0 +-0.759725,-0.000000,0.000000,0.650244,0,2,0,0 +-0.760406,-0.000000,0.000000,0.649448,0,2,0,0 +-0.761086,-0.000000,0.000000,0.648651,0,2,0,0 +-0.761764,-0.000000,0.000000,0.647854,0,2,0,0 +-0.762443,-0.000000,0.000000,0.647056,0,2,0,0 +-0.763120,-0.000000,0.000000,0.646257,0,2,0,0 +-0.763796,-0.000000,0.000000,0.645458,0,2,0,0 +-0.764472,-0.000000,0.000000,0.644657,0,2,0,0 +-0.765146,-0.000000,0.000000,0.643857,0,2,0,0 +-0.765820,-0.000000,0.000000,0.643055,0,2,0,0 +-0.766493,-0.000000,0.000000,0.642253,0,2,0,0 +-0.767165,-0.000000,0.000000,0.641450,0,2,0,0 +-0.767836,-0.000000,0.000000,0.640646,0,2,0,0 +-0.768507,-0.000000,0.000000,0.639841,0,2,0,0 +-0.769177,-0.000000,0.000000,0.639036,0,2,0,0 +-0.769845,-0.000000,0.000000,0.638231,0,2,0,0 +-0.770513,-0.000000,0.000000,0.637424,0,2,0,0 +-0.771180,-0.000000,0.000000,0.636617,0,2,0,0 +-0.771847,-0.000000,0.000000,0.635809,0,2,0,0 +-0.772512,-0.000000,0.000000,0.635000,0,2,0,0 +-0.773177,-0.000000,0.000000,0.634191,0,2,0,0 +-0.773840,-0.000000,0.000000,0.633381,0,2,0,0 +-0.774503,-0.000000,0.000000,0.632570,0,2,0,0 +-0.775165,-0.000000,0.000000,0.631759,0,2,0,0 +-0.775826,-0.000000,0.000000,0.630947,0,2,0,0 +-0.776487,-0.000000,0.000000,0.630134,0,2,0,0 +-0.777146,-0.000000,0.000000,0.629320,0,2,0,0 +-0.777805,-0.000000,0.000000,0.628506,0,2,0,0 +-0.778462,-0.000000,0.000000,0.627691,0,2,0,0 +-0.779119,-0.000000,0.000000,0.626876,0,2,0,0 +-0.779775,-0.000000,0.000000,0.626060,0,2,0,0 +-0.780430,-0.000000,0.000000,0.625243,0,2,0,0 +-0.781085,-0.000000,0.000000,0.624425,0,2,0,0 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,0,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,2,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,2,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.781738,-0.000000,0.000000,0.623607,1,1,1,300 +-0.921457,-0.000000,0.000000,0.388481,1,1,0,0 +-0.921863,-0.000000,0.000000,0.387516,1,1,0,0 +-0.922268,-0.000000,0.000000,0.386550,1,1,0,0 +-0.922673,-0.000000,0.000000,0.385584,1,1,0,0 +-0.923076,-0.000000,0.000000,0.384618,1,1,0,0 +-0.923478,-0.000000,0.000000,0.383651,1,1,0,0 +-0.923880,-0.000000,0.000000,0.382683,1,1,0,0 +-0.924280,-0.000000,0.000000,0.381716,1,1,0,0 +-0.924679,-0.000000,0.000000,0.380748,1,1,0,0 +-0.925077,-0.000000,0.000000,0.379779,1,1,0,0 +-0.925474,-0.000000,0.000000,0.378810,1,1,0,0 +-0.925871,-0.000000,0.000000,0.377841,1,1,0,0 +-0.926266,-0.000000,0.000000,0.376871,1,1,0,0 +-0.926660,-0.000000,0.000000,0.375901,1,1,0,0 +-0.927053,-0.000000,0.000000,0.374930,1,1,0,0 +-0.927445,-0.000000,0.000000,0.373959,1,1,0,0 +-0.927836,-0.000000,0.000000,0.372988,1,1,0,0 +-0.928226,-0.000000,0.000000,0.372016,1,1,0,0 +-0.928615,-0.000000,0.000000,0.371044,1,1,0,0 +-0.929003,-0.000000,0.000000,0.370071,1,1,0,0 +-0.929390,-0.000000,0.000000,0.369098,1,1,0,0 +-0.929776,-0.000000,0.000000,0.368125,1,1,0,0 +-0.930161,-0.000000,0.000000,0.367151,1,1,0,0 +-0.930545,-0.000000,0.000000,0.366176,1,1,0,0 +-0.930928,-0.000000,0.000000,0.365202,1,1,0,0 +-0.931310,-0.000000,0.000000,0.364227,1,1,0,0 +-0.931691,-0.000000,0.000000,0.363251,1,1,0,0 +-0.932071,-0.000000,0.000000,0.362275,1,1,0,0 +-0.932450,-0.000000,0.000000,0.361299,1,1,0,0 +-0.932828,-0.000000,0.000000,0.360322,1,1,0,0 +-0.933205,-0.000000,0.000000,0.359345,1,1,0,0 +-0.933580,-0.000000,0.000000,0.358368,1,1,0,0 +-0.933955,-0.000000,0.000000,0.357390,1,1,0,0 +-0.934329,-0.000000,0.000000,0.356412,1,1,0,0 +-0.934702,-0.000000,0.000000,0.355433,1,1,0,0 +-0.935073,-0.000000,0.000000,0.354454,1,1,0,0 +-0.935444,-0.000000,0.000000,0.353475,1,1,0,0 +-0.935814,-0.000000,0.000000,0.352495,1,1,0,0 +-0.936182,-0.000000,0.000000,0.351515,1,1,0,0 +-0.936550,-0.000000,0.000000,0.350534,1,1,0,0 +-0.936916,-0.000000,0.000000,0.349553,1,1,0,0 +-0.937282,-0.000000,0.000000,0.348572,1,1,0,0 +-0.937646,-0.000000,0.000000,0.347590,1,1,0,0 +-0.938010,-0.000000,0.000000,0.346608,1,1,0,0 +-0.938372,-0.000000,0.000000,0.345626,1,1,0,0 +-0.938734,-0.000000,0.000000,0.344643,1,1,0,0 +-0.939094,-0.000000,0.000000,0.343660,1,1,0,0 +-0.939454,-0.000000,0.000000,0.342676,1,1,0,0 +-0.939812,-0.000000,0.000000,0.341692,1,1,0,0 +-0.940169,-0.000000,0.000000,0.340708,1,1,0,0 +-0.940526,-0.000000,0.000000,0.339723,1,1,0,0 +-0.940881,-0.000000,0.000000,0.338738,1,1,0,0 +-0.941235,-0.000000,0.000000,0.337752,1,1,0,0 +-0.941588,-0.000000,0.000000,0.336767,1,1,0,0 +-0.941940,-0.000000,0.000000,0.335780,1,1,0,0 +-0.942291,-0.000000,0.000000,0.334794,1,1,0,0 +-0.942641,-0.000000,0.000000,0.333807,1,1,0,0 +-0.942991,-0.000000,0.000000,0.332820,1,1,0,0 +-0.943339,-0.000000,0.000000,0.331832,1,1,0,0 +-0.943686,-0.000000,0.000000,0.330844,1,1,0,0 +-0.944031,-0.000000,0.000000,0.329855,1,1,0,0 +-0.944376,-0.000000,0.000000,0.328867,1,1,0,0 +-0.944720,-0.000000,0.000000,0.327878,1,1,0,0 +-0.945063,-0.000000,0.000000,0.326888,1,1,0,0 +-0.945405,-0.000000,0.000000,0.325898,1,1,0,0 +-0.945746,-0.000000,0.000000,0.324908,1,1,0,0 +-0.946085,-0.000000,0.000000,0.323917,1,1,0,0 +-0.946424,-0.000000,0.000000,0.322927,1,1,0,0 +-0.946762,-0.000000,0.000000,0.321935,1,1,0,0 +-0.947098,-0.000000,0.000000,0.320944,1,1,0,0 +-0.947434,-0.000000,0.000000,0.319952,1,1,0,0 +-0.947768,-0.000000,0.000000,0.318959,1,1,0,0 +-0.948102,-0.000000,0.000000,0.317967,1,1,0,0 +-0.948434,-0.000000,0.000000,0.316974,1,1,0,0 +-0.948766,-0.000000,0.000000,0.315980,1,1,0,0 +-0.949096,-0.000000,0.000000,0.314987,1,1,0,0 +-0.949425,-0.000000,0.000000,0.313992,1,1,0,0 +-0.949754,-0.000000,0.000000,0.312998,1,1,0,0 +-0.950081,-0.000000,0.000000,0.312003,1,1,0,0 +-0.950407,-0.000000,0.000000,0.311008,1,1,0,0 +-0.950732,-0.000000,0.000000,0.310013,1,1,0,0 +-0.951057,-0.000000,0.000000,0.309017,1,1,0,0 +-0.951380,-0.000000,0.000000,0.308021,1,1,0,0 +-0.951702,-0.000000,0.000000,0.307024,1,1,0,0 +-0.952023,-0.000000,0.000000,0.306028,1,1,0,0 +-0.952343,-0.000000,0.000000,0.305031,1,1,0,0 +-0.952661,-0.000000,0.000000,0.304033,1,1,0,0 +-0.952979,-0.000000,0.000000,0.303035,1,1,0,0 +-0.953296,-0.000000,0.000000,0.302037,1,1,0,0 +-0.953612,-0.000000,0.000000,0.301039,1,1,0,0 +-0.953927,-0.000000,0.000000,0.300040,1,1,0,0 +-0.954240,-0.000000,0.000000,0.299041,1,1,0,0 +-0.954553,-0.000000,0.000000,0.298041,1,1,0,0 +-0.954865,-0.000000,0.000000,0.297042,1,1,0,0 +-0.955175,-0.000000,0.000000,0.296041,1,1,0,0 +-0.955485,-0.000000,0.000000,0.295041,1,1,0,0 +-0.955793,-0.000000,0.000000,0.294040,1,1,0,0 +-0.956100,-0.000000,0.000000,0.293039,1,1,0,0 +-0.956407,-0.000000,0.000000,0.292038,1,1,0,0 +-0.956712,-0.000000,0.000000,0.291036,1,1,0,0 +-0.957016,-0.000000,0.000000,0.290034,1,1,0,0 +-0.957319,-0.000000,0.000000,0.289032,1,1,0,0 +-0.957622,-0.000000,0.000000,0.288029,1,1,0,0 +-0.957923,-0.000000,0.000000,0.287026,1,1,0,0 +-0.958223,-0.000000,0.000000,0.286023,1,1,0,0 +-0.958522,-0.000000,0.000000,0.285019,1,1,0,0 +-0.958820,-0.000000,0.000000,0.284015,1,1,0,0 +-0.959117,-0.000000,0.000000,0.283011,1,1,0,0 +-0.959412,-0.000000,0.000000,0.282007,1,1,0,0 +-0.959707,-0.000000,0.000000,0.281002,1,1,0,0 +-0.960001,-0.000000,0.000000,0.279997,1,1,0,0 +-0.960294,-0.000000,0.000000,0.278991,1,1,0,0 +-0.960585,-0.000000,0.000000,0.277985,1,1,0,0 +-0.960876,-0.000000,0.000000,0.276979,1,1,0,0 +-0.961165,-0.000000,0.000000,0.275973,1,1,0,0 +-0.961454,-0.000000,0.000000,0.274966,1,1,0,0 +-0.961741,-0.000000,0.000000,0.273959,1,1,0,0 +-0.962028,-0.000000,0.000000,0.272952,1,1,0,0 +-0.962313,-0.000000,0.000000,0.271944,1,1,0,0 +-0.962597,-0.000000,0.000000,0.270936,1,1,0,0 +-0.962880,-0.000000,0.000000,0.269928,1,1,0,0 +-0.963163,-0.000000,0.000000,0.268920,1,1,0,0 +-0.963444,-0.000000,0.000000,0.267911,1,1,0,0 +-0.963724,-0.000000,0.000000,0.266902,1,1,0,0 +-0.964003,-0.000000,0.000000,0.265893,1,1,0,0 +-0.964281,-0.000000,0.000000,0.264883,1,1,0,0 +-0.964557,-0.000000,0.000000,0.263873,1,1,0,0 +-0.964833,-0.000000,0.000000,0.262863,1,1,0,0 +-0.965108,-0.000000,0.000000,0.261852,1,1,0,0 +-0.965382,-0.000000,0.000000,0.260842,1,1,0,0 +-0.965654,-0.000000,0.000000,0.259830,1,1,0,0 +-0.965926,-0.000000,0.000000,0.258819,1,1,0,0 +-0.966196,-0.000000,0.000000,0.257807,1,1,0,0 +-0.966466,-0.000000,0.000000,0.256795,1,1,0,0 +-0.966734,-0.000000,0.000000,0.255783,1,1,0,0 +-0.967001,-0.000000,0.000000,0.254771,1,1,0,0 +-0.967268,-0.000000,0.000000,0.253758,1,1,0,0 +-0.967533,-0.000000,0.000000,0.252745,1,1,0,0 +-0.967797,-0.000000,0.000000,0.251732,1,1,0,0 +-0.968060,-0.000000,0.000000,0.250718,1,1,0,0 +-0.968322,-0.000000,0.000000,0.249704,1,1,0,0 +-0.968583,-0.000000,0.000000,0.248690,1,1,0,0 +-0.968843,-0.000000,0.000000,0.247675,1,1,0,0 +-0.969102,-0.000000,0.000000,0.246661,1,1,0,0 +-0.969360,-0.000000,0.000000,0.245646,1,1,0,0 +-0.969616,-0.000000,0.000000,0.244631,1,1,0,0 +-0.969872,-0.000000,0.000000,0.243615,1,1,0,0 +-0.970127,-0.000000,0.000000,0.242599,1,1,0,0 +-0.970380,-0.000000,0.000000,0.241583,1,1,0,0 +-0.970633,-0.000000,0.000000,0.240567,1,1,0,0 +-0.970884,-0.000000,0.000000,0.239550,1,1,0,0 +-0.971134,-0.000000,0.000000,0.238533,1,1,0,0 +-0.971384,-0.000000,0.000000,0.237516,1,1,0,0 +-0.971632,-0.000000,0.000000,0.236499,1,1,0,0 +-0.971879,-0.000000,0.000000,0.235481,1,1,0,0 +-0.972125,-0.000000,0.000000,0.234463,1,1,0,0 +-0.972370,-0.000000,0.000000,0.233445,1,1,0,0 +-0.972614,-0.000000,0.000000,0.232427,1,1,0,0 +-0.972857,-0.000000,0.000000,0.231408,1,1,0,0 +-0.973099,-0.000000,0.000000,0.230389,1,1,0,0 +-0.973339,-0.000000,0.000000,0.229370,1,1,0,0 +-0.973579,-0.000000,0.000000,0.228351,1,1,0,0 +-0.973817,-0.000000,0.000000,0.227331,1,1,0,0 +-0.974055,-0.000000,0.000000,0.226311,1,1,0,0 +-0.974291,-0.000000,0.000000,0.225291,1,1,0,0 +-0.974527,-0.000000,0.000000,0.224271,1,1,0,0 +-0.974761,-0.000000,0.000000,0.223250,1,1,0,0 +-0.974994,-0.000000,0.000000,0.222229,1,1,0,0 +-0.975227,-0.000000,0.000000,0.221208,1,1,0,0 +-0.975458,-0.000000,0.000000,0.220187,1,1,0,0 +-0.975688,-0.000000,0.000000,0.219165,1,1,0,0 +-0.975917,-0.000000,0.000000,0.218143,1,1,0,0 +-0.976145,-0.000000,0.000000,0.217121,1,1,0,0 +-0.976371,-0.000000,0.000000,0.216099,1,1,0,0 +-0.976597,-0.000000,0.000000,0.215076,1,1,0,0 +-0.976822,-0.000000,0.000000,0.214053,1,1,0,0 +-0.977046,-0.000000,0.000000,0.213030,1,1,0,0 +-0.977268,-0.000000,0.000000,0.212007,1,1,0,0 +-0.977490,-0.000000,0.000000,0.210984,1,1,0,0 +-0.977710,-0.000000,0.000000,0.209960,1,1,0,0 +-0.977929,-0.000000,0.000000,0.208936,1,1,0,0 +-0.978148,-0.000000,0.000000,0.207912,1,1,0,0 +-0.978365,-0.000000,0.000000,0.206887,1,1,0,0 +-0.978581,-0.000000,0.000000,0.205863,1,1,0,0 +-0.978796,-0.000000,0.000000,0.204838,1,1,0,0 +-0.979010,-0.000000,0.000000,0.203813,1,1,0,0 +-0.979223,-0.000000,0.000000,0.202787,1,1,0,0 +-0.979435,-0.000000,0.000000,0.201762,1,1,0,0 +-0.979645,-0.000000,0.000000,0.200736,1,1,0,0 +-0.979855,-0.000000,0.000000,0.199710,1,1,0,0 +-0.980064,-0.000000,0.000000,0.198684,1,1,0,0 +-0.980271,-0.000000,0.000000,0.197657,1,1,0,0 +-0.980478,-0.000000,0.000000,0.196631,1,1,0,0 +-0.980683,-0.000000,0.000000,0.195604,1,1,0,0 +-0.980887,-0.000000,0.000000,0.194577,1,1,0,0 +-0.981091,-0.000000,0.000000,0.193549,1,1,0,0 +-0.981293,-0.000000,0.000000,0.192522,1,1,0,0 +-0.981494,-0.000000,0.000000,0.191494,1,1,0,0 +-0.981694,-0.000000,0.000000,0.190466,1,1,0,0 +-0.981893,-0.000000,0.000000,0.189438,1,1,0,0 +-0.982090,-0.000000,0.000000,0.188410,1,1,0,0 +-0.982287,-0.000000,0.000000,0.187381,1,1,0,0 +-0.982483,-0.000000,0.000000,0.186353,1,1,0,0 +-0.982678,-0.000000,0.000000,0.185324,1,1,0,0 +-0.982871,-0.000000,0.000000,0.184294,1,1,0,0 +-0.983064,-0.000000,0.000000,0.183265,1,1,0,0 +-0.983255,-0.000000,0.000000,0.182236,1,1,0,0 +-0.983445,-0.000000,0.000000,0.181206,1,1,0,0 +-0.983634,-0.000000,0.000000,0.180176,1,1,0,0 +-0.983823,-0.000000,0.000000,0.179146,1,1,0,0 +-0.984010,-0.000000,0.000000,0.178115,1,1,0,0 +-0.984196,-0.000000,0.000000,0.177085,1,1,0,0 +-0.984381,-0.000000,0.000000,0.176054,1,1,0,0 +-0.984564,-0.000000,0.000000,0.175023,1,1,0,0 +-0.984747,-0.000000,0.000000,0.173992,1,1,0,0 +-0.984929,-0.000000,0.000000,0.172961,1,1,0,0 +-0.985109,-0.000000,0.000000,0.171929,1,1,0,0 +-0.985289,-0.000000,0.000000,0.170897,1,1,0,0 +-0.985467,-0.000000,0.000000,0.169866,1,1,0,0 +-0.985645,-0.000000,0.000000,0.168833,1,1,0,0 +-0.985821,-0.000000,0.000000,0.167801,1,1,0,0 +-0.985996,-0.000000,0.000000,0.166769,1,1,0,0 +-0.986170,-0.000000,0.000000,0.165736,1,1,0,0 +-0.986343,-0.000000,0.000000,0.164703,1,1,0,0 +-0.986515,-0.000000,0.000000,0.163670,1,1,0,0 +-0.986686,-0.000000,0.000000,0.162637,1,1,0,0 +-0.986856,-0.000000,0.000000,0.161604,1,1,0,0 +-0.987024,-0.000000,0.000000,0.160570,1,1,0,0 +-0.987192,-0.000000,0.000000,0.159537,1,1,0,0 +-0.987359,-0.000000,0.000000,0.158503,1,1,0,0 +-0.987524,-0.000000,0.000000,0.157469,1,1,0,0 +-0.987688,-0.000000,0.000000,0.156434,1,1,0,0 +-0.987852,-0.000000,0.000000,0.155400,1,1,0,0 +-0.988014,-0.000000,0.000000,0.154366,1,1,0,0 +-0.988175,-0.000000,0.000000,0.153331,1,1,0,0 +-0.988335,-0.000000,0.000000,0.152296,1,1,0,0 +-0.988494,-0.000000,0.000000,0.151261,1,1,0,0 +-0.988652,-0.000000,0.000000,0.150226,1,1,0,0 +-0.988809,-0.000000,0.000000,0.149190,1,1,0,0 +-0.988964,-0.000000,0.000000,0.148155,1,1,0,0 +-0.989119,-0.000000,0.000000,0.147119,1,1,0,0 +-0.989272,-0.000000,0.000000,0.146083,1,1,0,0 +-0.989425,-0.000000,0.000000,0.145047,1,1,0,0 +-0.989576,-0.000000,0.000000,0.144011,1,1,0,0 +-0.989726,-0.000000,0.000000,0.142974,1,1,0,0 +-0.989876,-0.000000,0.000000,0.141938,1,1,0,0 +-0.990024,-0.000000,0.000000,0.140901,1,1,0,0 +-0.990171,-0.000000,0.000000,0.139864,1,1,0,0 +-0.990317,-0.000000,0.000000,0.138827,1,1,0,0 +-0.990461,-0.000000,0.000000,0.137790,1,1,0,0 +-0.990605,-0.000000,0.000000,0.136753,1,1,0,0 +-0.990748,-0.000000,0.000000,0.135716,1,1,0,0 +-0.990889,-0.000000,0.000000,0.134678,1,1,0,0 +-0.991030,-0.000000,0.000000,0.133640,1,1,0,0 +-0.991169,-0.000000,0.000000,0.132602,1,1,0,0 +-0.991308,-0.000000,0.000000,0.131564,1,1,0,0 +-0.991445,-0.000000,0.000000,0.130526,1,1,0,0 +-0.991581,-0.000000,0.000000,0.129488,1,1,0,0 +-0.991716,-0.000000,0.000000,0.128449,1,1,0,0 +-0.991850,-0.000000,0.000000,0.127411,1,1,0,0 +-0.991983,-0.000000,0.000000,0.126372,1,1,0,0 +-0.992115,-0.000000,0.000000,0.125333,1,1,0,0 +-0.992245,-0.000000,0.000000,0.124294,1,1,0,0 +-0.992375,-0.000000,0.000000,0.123255,1,1,0,0 +-0.992504,-0.000000,0.000000,0.122216,1,1,0,0 +-0.992631,-0.000000,0.000000,0.121176,1,1,0,0 +-0.992757,-0.000000,0.000000,0.120137,1,1,0,0 +-0.992883,-0.000000,0.000000,0.119097,1,1,0,0 +-0.993007,-0.000000,0.000000,0.118057,1,1,0,0 +-0.993130,-0.000000,0.000000,0.117017,1,1,0,0 +-0.993252,-0.000000,0.000000,0.115977,1,1,0,0 +-0.993373,-0.000000,0.000000,0.114937,1,1,0,0 +-0.993493,-0.000000,0.000000,0.113897,1,1,0,0 +-0.993611,-0.000000,0.000000,0.112856,1,1,0,0 +-0.993729,-0.000000,0.000000,0.111816,1,1,0,0 +-0.993845,-0.000000,0.000000,0.110775,1,1,0,0 +-0.993961,-0.000000,0.000000,0.109734,1,1,0,0 +-0.994075,-0.000000,0.000000,0.108693,1,1,0,0 +-0.994189,-0.000000,0.000000,0.107652,1,1,0,0 +-0.994301,-0.000000,0.000000,0.106611,1,1,0,0 +-0.994412,-0.000000,0.000000,0.105570,1,1,0,0 +-0.994522,-0.000000,0.000000,0.104528,1,1,0,0 +-0.994631,-0.000000,0.000000,0.103487,1,1,0,0 +-0.994739,-0.000000,0.000000,0.102445,1,1,0,0 +-0.994845,-0.000000,0.000000,0.101404,1,1,0,0 +-0.994951,-0.000000,0.000000,0.100362,1,1,0,0 +-0.995056,-0.000000,0.000000,0.099320,1,1,0,0 +-0.995159,-0.000000,0.000000,0.098278,1,1,0,0 +-0.995261,-0.000000,0.000000,0.097235,1,1,0,0 +-0.995363,-0.000000,0.000000,0.096193,1,1,0,0 +-0.995463,-0.000000,0.000000,0.095151,1,1,0,0 +-0.995562,-0.000000,0.000000,0.094108,1,1,0,0 +-0.995660,-0.000000,0.000000,0.093066,1,1,0,0 +-0.995757,-0.000000,0.000000,0.092023,1,1,0,0 +-0.995853,-0.000000,0.000000,0.090980,1,1,0,0 +-0.995947,-0.000000,0.000000,0.089937,1,1,0,0 +-0.996041,-0.000000,0.000000,0.088894,1,1,0,0 +-0.996134,-0.000000,0.000000,0.087851,1,1,0,0 +-0.996225,-0.000000,0.000000,0.086808,1,1,0,0 +-0.996315,-0.000000,0.000000,0.085765,1,1,0,0 +-0.996405,-0.000000,0.000000,0.084721,1,1,0,0 +-0.996493,-0.000000,0.000000,0.083678,1,1,0,0 +-0.996580,-0.000000,0.000000,0.082634,1,1,0,0 +-0.996666,-0.000000,0.000000,0.081591,1,1,0,0 +-0.996751,-0.000000,0.000000,0.080547,1,1,0,0 +-0.996835,-0.000000,0.000000,0.079503,1,1,0,0 +-0.996917,-0.000000,0.000000,0.078459,1,1,0,0 +-0.996999,-0.000000,0.000000,0.077415,1,1,0,0 +-0.997079,-0.000000,0.000000,0.076371,1,1,0,0 +-0.997159,-0.000000,0.000000,0.075327,1,1,0,0 +-0.997237,-0.000000,0.000000,0.074283,1,1,0,0 +-0.997314,-0.000000,0.000000,0.073238,1,1,0,0 +-0.997391,-0.000000,0.000000,0.072194,1,1,0,0 +-0.997466,-0.000000,0.000000,0.071149,1,1,0,0 +-0.997540,-0.000000,0.000000,0.070105,1,1,0,0 +-0.997613,-0.000000,0.000000,0.069060,1,1,0,0 +-0.997684,-0.000000,0.000000,0.068015,1,1,0,0 +-0.997755,-0.000000,0.000000,0.066970,1,1,0,0 +-0.997825,-0.000000,0.000000,0.065926,1,1,0,0 +-0.997893,-0.000000,0.000000,0.064881,1,1,0,0 +-0.997960,-0.000000,0.000000,0.063836,1,1,0,0 +-0.998027,-0.000000,0.000000,0.062791,1,1,0,0 +-0.998092,-0.000000,0.000000,0.061745,1,1,0,0 +-0.998156,-0.000000,0.000000,0.060700,1,1,0,0 +-0.998219,-0.000000,0.000000,0.059655,1,1,0,0 +-0.998281,-0.000000,0.000000,0.058609,1,1,0,0 +-0.998342,-0.000000,0.000000,0.057564,1,1,0,0 +-0.998402,-0.000000,0.000000,0.056519,1,1,0,0 +-0.998460,-0.000000,0.000000,0.055473,1,1,0,0 +-0.998518,-0.000000,0.000000,0.054427,1,1,0,0 +-0.998574,-0.000000,0.000000,0.053382,1,1,0,0 +-0.998630,-0.000000,0.000000,0.052336,1,1,0,0 +-0.998684,-0.000000,0.000000,0.051290,1,1,0,0 +-0.998737,-0.000000,0.000000,0.050244,1,1,0,0 +-0.998789,-0.000000,0.000000,0.049198,1,1,0,0 +-0.998840,-0.000000,0.000000,0.048152,1,1,0,0 +-0.998890,-0.000000,0.000000,0.047106,1,1,0,0 +-0.998939,-0.000000,0.000000,0.046060,1,1,0,0 +-0.998986,-0.000000,0.000000,0.045014,1,1,0,0 +-0.999033,-0.000000,0.000000,0.043968,1,1,0,0 +-0.999078,-0.000000,0.000000,0.042922,1,1,0,0 +-0.999123,-0.000000,0.000000,0.041876,1,1,0,0 +-0.999166,-0.000000,0.000000,0.040829,1,1,0,0 +-0.999208,-0.000000,0.000000,0.039783,1,1,0,0 +-0.999249,-0.000000,0.000000,0.038737,1,1,0,0 +-0.999289,-0.000000,0.000000,0.037690,1,1,0,0 +-0.999328,-0.000000,0.000000,0.036644,1,1,0,0 +-0.999366,-0.000000,0.000000,0.035597,1,1,0,0 +-0.999403,-0.000000,0.000000,0.034551,1,1,0,0 +-0.999439,-0.000000,0.000000,0.033504,1,1,0,0 +-0.999473,-0.000000,0.000000,0.032457,1,1,0,0 +-0.999507,-0.000000,0.000000,0.031411,1,1,0,0 +-0.999539,-0.000000,0.000000,0.030364,1,1,0,0 +-0.999570,-0.000000,0.000000,0.029317,1,1,0,0 +-0.999600,-0.000000,0.000000,0.028271,1,1,0,0 +-0.999629,-0.000000,0.000000,0.027224,1,1,0,0 +-0.999657,-0.000000,0.000000,0.026177,1,1,0,0 +-0.999684,-0.000000,0.000000,0.025130,1,1,0,0 +-0.999710,-0.000000,0.000000,0.024083,1,1,0,0 +-0.999735,-0.000000,0.000000,0.023036,1,1,0,0 +-0.999758,-0.000000,0.000000,0.021989,1,1,0,0 +-0.999781,-0.000000,0.000000,0.020942,1,1,0,0 +-0.999802,-0.000000,0.000000,0.019895,1,1,0,0 +-0.999822,-0.000000,0.000000,0.018848,1,1,0,0 +-0.999842,-0.000000,0.000000,0.017801,1,1,0,0 +-0.999860,-0.000000,0.000000,0.016754,1,1,0,0 +-0.999877,-0.000000,0.000000,0.015707,1,1,0,0 +-0.999893,-0.000000,0.000000,0.014660,1,1,0,0 +-0.999907,-0.000000,0.000000,0.013613,1,1,0,0 +-0.999921,-0.000000,0.000000,0.012566,1,1,0,0 +-0.999934,-0.000000,0.000000,0.011519,1,1,0,0 +-0.999945,-0.000000,0.000000,0.010472,1,1,0,0 +-0.999956,-0.000000,0.000000,0.009425,1,1,0,0 +-0.999965,-0.000000,0.000000,0.008377,1,1,0,0 +-0.999973,-0.000000,0.000000,0.007330,1,1,0,0 +-0.999980,-0.000000,0.000000,0.006283,1,1,0,0 +-0.999986,-0.000000,0.000000,0.005236,1,1,0,0 +-0.999991,-0.000000,0.000000,0.004189,1,1,0,0 +-0.999995,-0.000000,0.000000,0.003142,1,1,0,0 +-0.999998,-0.000000,0.000000,0.002094,1,1,0,0 +-0.999999,-0.000000,0.000000,0.001047,1,1,0,0 \ No newline at end of file -- GitLab From bf5c93b178349b6fae4d6b7774e994dcd6e90a42 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Fri, 9 Jun 2023 14:36:54 +0300 Subject: [PATCH 320/381] Run clang-format --- lib_dec/ivas_binRenderer_internal.c | 6 +++--- lib_dec/ivas_ism_param_dec.c | 7 ++++--- lib_dec/ivas_mc_param_dec.c | 6 +++--- lib_rend/ivas_objectRenderer.c | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index c829473ce9..c23669933a 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1206,11 +1206,11 @@ void ivas_binRenderer( /* Head rotation in HOA3 or CICPx */ if ( #ifdef EXTERNAL_ORIENTATIONS - hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] + hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] #else - hHeadTrackData && hHeadTrackData->num_quaternions >= 0 + hHeadTrackData && hHeadTrackData->num_quaternions >= 0 #endif - && hBinRenderer->rotInCldfb ) + && hBinRenderer->rotInCldfb ) { if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) { diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 04d59cfdd7..8210e4121f 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -993,11 +993,12 @@ void ivas_ism_dec_digest_tc( if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && #ifdef EXTERNAL_ORIENTATIONS - st_ivas->hCombinedOrientationData == NULL + st_ivas->hCombinedOrientationData == NULL #else - st_ivas->hHeadTrackData == NULL + st_ivas->hHeadTrackData == NULL #endif - ) { + ) + { if ( st_ivas->hIntSetup.is_planar_setup ) { /* If no elevation support in output format, then rendering should be done with zero elevation */ diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 126f143467..189c94e9b2 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1698,11 +1698,11 @@ void ivas_param_mc_dec_render( { if ( #ifdef EXTERNAL_ORIENTATIONS - st_ivas->hCombinedOrientationData + st_ivas->hCombinedOrientationData #else - st_ivas->hHeadTrackData + st_ivas->hHeadTrackData #endif - && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); } diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 2b14732dbf..3bcce1e89c 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -631,7 +631,7 @@ ivas_error ivas_td_binaural_renderer_ext( #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ #else - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ #endif const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ -- GitLab From 5ec8c68c450bb5a135c91f9add87ed8f965a38fd Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Fri, 9 Jun 2023 13:46:09 +0200 Subject: [PATCH 321/381] [tests] mark two cases as xfail and add a TODO to revert them --- tests/renderer/test_renderer.py | 154 +++++++++++++++++++++----------- 1 file changed, 102 insertions(+), 52 deletions(-) diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index d1bf08431c..806e871a2e 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -61,19 +61,21 @@ def test_ambisonics_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file): @pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refrotzero(test_info, in_fmt, out_fmt, trj_file): +def test_ambisonics_binaural_headrotation_refrotzero( + test_info, in_fmt, out_fmt, trj_file +): compare_renderer_args( test_info, in_fmt, out_fmt, ref_kwargs={ "name_extension": "refrotzero", - "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv") + "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), }, cut_kwargs={ "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - "refrot_file": HR_TRAJECTORY_DIR.joinpath("const000.csv") - } + "refrot_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), + }, ) @@ -91,11 +93,16 @@ def test_ambisonics_binaural_headrotation_refrotequal(test_info, in_fmt, out_fmt "name_extension": "refrotequal", }, cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("azi_plus_2-ele_plus_2-every-100-frames.csv"), - "refrot_file": HR_TRAJECTORY_DIR.joinpath("azi_plus_2-ele_plus_2-every-25-rows.csv") - } + "trj_file": HR_TRAJECTORY_DIR.joinpath( + "azi_plus_2-ele_plus_2-every-100-frames.csv" + ), + "refrot_file": HR_TRAJECTORY_DIR.joinpath( + "azi_plus_2-ele_plus_2-every-25-rows.csv" + ), + }, ) + # This test compares rendering with: # ref: head rotation trajectory file (OTR=NONE) # cut: identical head rotation trajectory file as ref but in addition a constant @@ -103,21 +110,24 @@ def test_ambisonics_binaural_headrotation_refrotequal(test_info, in_fmt, out_fmt @pytest.mark.parametrize("trj_file", HR_TRAJECTORIES_TO_TEST) @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refveczero(test_info, in_fmt, out_fmt, trj_file): +def test_ambisonics_binaural_headrotation_refveczero( + test_info, in_fmt, out_fmt, trj_file +): compare_renderer_args( test_info, in_fmt, out_fmt, ref_kwargs={ "name_extension": "refveczero", - "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv") + "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), }, cut_kwargs={ "trj_file": HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("const000-Vector3.csv") - } + "refvec_file": HR_TRAJECTORY_DIR.joinpath("const000-Vector3.csv"), + }, ) + # This test compares rendering with: # ref: no head rotation (OTR=NONE) # cut: rendering with head rotation and a ref vector which moves in the @@ -125,18 +135,27 @@ def test_ambisonics_binaural_headrotation_refveczero(test_info, in_fmt, out_fmt, @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) def test_ambisonics_binaural_headrotation_refvecequal(test_info, in_fmt, out_fmt): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refvecequal", - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-Vector3.csv") - } - ) + # TODO revert + if in_fmt == "HOA3" and out_fmt == "BINAURAL_ROOM_REVERB": + pytest.xfail("WIP : minor differences to be resolved") + else: + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refvecequal", + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s.csv" + ), + "refvec_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s-Vector3.csv" + ), + }, + ) + # This test compares rendering with: # ref: a head rotation trajectory with elevation (OTR=NONE) @@ -145,19 +164,28 @@ def test_ambisonics_binaural_headrotation_refvecequal(test_info, in_fmt, out_fmt @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) def test_ambisonics_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): - compare_renderer_args( - test_info, - in_fmt, - out_fmt, - ref_kwargs={ - "name_extension": "refvec_rotating", - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), - }, - cut_kwargs={ - "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv") - } - ) + # TODO revert + if in_fmt == "HOA2" and out_fmt == "BINAURAL_ROOM_REVERB": + pytest.xfail("WIP : minor differences to be resolved") + else: + compare_renderer_args( + test_info, + in_fmt, + out_fmt, + ref_kwargs={ + "name_extension": "refvec_rotating", + "trj_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s.csv" + ), + }, + cut_kwargs={ + "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), + "refvec_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s-ccw-Vector3.csv" + ), + }, + ) + # This test compares rendering with: # ref: a head rotation trajectory with elevation (OTR=NONE) @@ -167,21 +195,28 @@ def test_ambisonics_binaural_headrotation_refvec_rotating(test_info, in_fmt, out # gets compensated in the REF_VEV OTR modes) @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refvec_rotating_fixed_pos_offset(test_info, in_fmt, out_fmt): +def test_ambisonics_binaural_headrotation_refvec_rotating_fixed_pos_offset( + test_info, in_fmt, out_fmt +): compare_renderer_args( test_info, in_fmt, out_fmt, ref_kwargs={ "name_extension": "refvec_rotating", - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw.csv"), + "trj_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s-ccw.csv" + ), }, cut_kwargs={ "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv") - } + "refvec_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s-fixed-pos-offset-Vector3.csv" + ), + }, ) + # This test compares rendering with: # ref: a reference position trajectory with elevation and REF_VEC_LEV OTR mode (OTR=REF_VEC_LEV) # cut: a reference position trajectory without the elevation and REF_VEC OTR mode (OTR=REF_VEC) @@ -189,7 +224,9 @@ def test_ambisonics_binaural_headrotation_refvec_rotating_fixed_pos_offset(test_ # the height difference in positions, the output must be binary equivalent. @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS_BINAURAL) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_AMBI) -def test_ambisonics_binaural_headrotation_refveclev_vs_refvec(test_info, in_fmt, out_fmt): +def test_ambisonics_binaural_headrotation_refveclev_vs_refvec( + test_info, in_fmt, out_fmt +): compare_renderer_args( test_info, in_fmt, @@ -197,12 +234,14 @@ def test_ambisonics_binaural_headrotation_refveclev_vs_refvec(test_info, in_fmt, ref_kwargs={ "name_extension": "refveclevel", "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refveclev_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-Vector3.csv"), + "refveclev_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s-Vector3.csv" + ), }, cut_kwargs={ "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-4s-Vector3.csv") - } + "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-4s-Vector3.csv"), + }, ) @@ -244,6 +283,7 @@ def test_multichannel_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file trj_file=HR_TRAJECTORY_DIR.joinpath(f"{trj_file}.csv"), ) + # This test compares rendering with: # ref: a head rotation trajectory with elevation (OTR=NONE) # cut: a static head rotation and a reference position trajectory which moves @@ -260,12 +300,16 @@ def test_multichannel_binaural_headrotation_refvec_rotating(test_info, in_fmt, o out_fmt, ref_kwargs={ "name_extension": "refvec_rotating", - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), + "trj_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s.csv" + ), }, cut_kwargs={ "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv") - } + "refvec_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s-ccw-Vector3.csv" + ), + }, ) @@ -316,6 +360,7 @@ def test_ism_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file): in_meta_files=in_meta_files, ) + # This test compares rendering with: # ref: a head rotation trajectory with elevation (OTR=NONE) # cut: a static head rotation and a reference position trajectory which moves @@ -334,16 +379,21 @@ def test_ism_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): out_fmt, ref_kwargs={ "name_extension": "refvec_rotating", - "trj_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s.csv"), - "in_meta_files": in_meta_files + "trj_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s.csv" + ), + "in_meta_files": in_meta_files, }, cut_kwargs={ "trj_file": HR_TRAJECTORY_DIR.joinpath("const000.csv"), - "refvec_file": HR_TRAJECTORY_DIR.joinpath("full-circle-with-up-and-down-4s-ccw-Vector3.csv"), - "in_meta_files": in_meta_files - } + "refvec_file": HR_TRAJECTORY_DIR.joinpath( + "full-circle-with-up-and-down-4s-ccw-Vector3.csv" + ), + "in_meta_files": in_meta_files, + }, ) + """ MASA """ -- GitLab From 5c4823b9756af6579f67ea19ef79fb16b35f34e1 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 9 Jun 2023 14:50:12 +0300 Subject: [PATCH 322/381] Adds pytest framework tests for MASA including EXT output. --- tests/test_masa_enc_dec.py | 276 +++++++++++++++++++++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 tests/test_masa_enc_dec.py diff --git a/tests/test_masa_enc_dec.py b/tests/test_masa_enc_dec.py new file mode 100644 index 0000000000..41b8381378 --- /dev/null +++ b/tests/test_masa_enc_dec.py @@ -0,0 +1,276 @@ +__copyright__ = \ + """ + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + 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. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + """ + +__doc__ = \ + """ + Test file to run C encoder and decoder code. + The outputs are compared with C generated references. + """ + +import os +import errno +import pytest +from typing import Optional +from filecmp import cmp + +from cmp_pcm import cmp_pcm +from conftest import EncoderFrontend, DecoderFrontend + +# params +#output_mode_list = ['MONO', 'STEREO', '5_1', '7_1', '5_1_2', '5_1_4', '7_1_4', 'FOA', 'HOA2', 'HOA3', 'BINAURAL', 'BINAURAL_ROOM', 'EXT'] +output_mode_list = ['BINAURAL', 'EXT'] +ivas_br_masa = [13200, 16400, 24400, 32000, 48000, 64000, 80000, 96000, 128000, 160000, 192000, 256000, 384000, 512000] + +# Write file-based parameter sets here (metafile, pcm/wave, numTC, numDir, DTX_toggle) +masa_metadata_audio_ndir_ntransportch_dtx_list = [#('stv1MASA1TC48c.met', 'stv1MASA1TC48c.wav', 1, 1, False), + #('stv1MASA2TC48c.met', 'stv1MASA2TC48c.wav', 1, 2, False), + ('stv2MASA1TC48c.met', 'stv2MASA1TC48c.wav', 2, 1, False), + #('stv2MASA2TC48c.met', 'stv2MASA2TC48c.wav', 2, 2, False), + #('stv1MASA1TC48n.met', 'stv1MASA1TC48n.wav', 1, 1, True), + ('stv1MASA2TC48n.met', 'stv1MASA2TC48n.wav', 1, 2, True)] + +# Used to not test every combination +test_split_br = [13200, 24400, 48000, 80000, 128000, 256000, 512000]; +AbsTol = '0' + + +def check_and_makedir(dir_path): + if not os.path.exists(dir_path): + try: + os.makedirs(dir_path) + except OSError as e: + if e.errno != errno.EEXIST: + raise # raises the error again + + +@pytest.mark.parametrize("output_mode", output_mode_list) +@pytest.mark.parametrize("ivas_br", ivas_br_masa) +@pytest.mark.parametrize("masa_metadata_audio_ndir_ntransportch_dtx", masa_metadata_audio_ndir_ntransportch_dtx_list) +def test_masa_enc_dec( + dut_encoder_frontend: EncoderFrontend, + dut_decoder_frontend: DecoderFrontend, + ref_encoder_path, + ref_decoder_path, + reference_path, + dut_base_path, + keep_files, + ivas_br, + masa_metadata_audio_ndir_ntransportch_dtx, + test_vector_path, + output_mode, +): + # Input parameters + in_fs = 48 + out_fs = 48 + metadata = masa_metadata_audio_ndir_ntransportch_dtx[0] + input_audio = masa_metadata_audio_ndir_ntransportch_dtx[1] + n_directions = masa_metadata_audio_ndir_ntransportch_dtx[2] + masa_channel_count = masa_metadata_audio_ndir_ntransportch_dtx[3] + dtx = masa_metadata_audio_ndir_ntransportch_dtx[4] + masa_path = f"{test_vector_path}/{metadata}" + input_audio_path = f"{test_vector_path}/{input_audio}" + + # Apply test skipping here + if dtx: + if output_mode == 'EXT' and ivas_br in test_split_br: + pytest.skip("Skipping some DTX bitrates for EXT") + else: + pytest.skip("Skipping some other DTX bitrates for other outputs") + + # Set reference encoder and decoder + ref_encoder_frontend = EncoderFrontend(ref_encoder_path, "REF") + ref_decoder_frontend = DecoderFrontend(ref_decoder_path, "REF") + + # Set output paths + out_dir_bs_ref = f"{reference_path}/masa_test/bitstreams" + out_dir_bs_dut = f"{dut_base_path}/masa_test/bitstreams" + out_dir_dec_output_ref = f"{reference_path}/masa_test/dec_output" + out_dir_dec_output_dut = f"{dut_base_path}/masa_test/dec_output" + check_and_makedir(out_dir_bs_ref) + check_and_makedir(out_dir_bs_dut) + check_and_makedir(out_dir_dec_output_ref) + check_and_makedir(out_dir_dec_output_dut) + + # To avoid conflicting names in case of parallel test execution, differentiate all cases + output_bitstream_ref = f"{out_dir_bs_ref}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.bts" + output_bitstream_dut = f"{out_dir_bs_dut}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.bts" + dec_output_ref = f"{out_dir_dec_output_ref}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.wav" + dec_output_dut = f"{out_dir_dec_output_dut}/masa{masa_channel_count}_ndirs{n_directions}_outputmode{output_mode}_ivasbr{ivas_br}k_DTX{dtx}.wav" + if output_mode == 'EXT': + dec_met_output_ref = f"{dec_output_ref}.met" + dec_met_output_dut = f"{dec_output_dut}.met" + else: + dec_met_output_ref = None + dec_met_output_dut = None + + # Encode REF + ivas_enc( + ref_encoder_frontend, + masa_channel_count, + masa_path, + ivas_br, + in_fs, + input_audio_path, + output_bitstream_ref, + dtx, + ) + + # Encode DUT + ivas_enc( + dut_encoder_frontend, + masa_channel_count, + masa_path, + ivas_br, + in_fs, + input_audio_path, + output_bitstream_dut, + dtx, + ) + + # Decode REF + ivas_dec( + ref_decoder_frontend, + output_mode, + out_fs, + output_bitstream_ref, + dec_output_ref, + ) + + # Decode DUT + ivas_dec( + dut_decoder_frontend, + output_mode, + out_fs, + output_bitstream_dut, + dec_output_dut, + ) + + # Compare outputs. For EXT output, also compare metadata. + if output_mode == 'EXT': + # Compare metadata as binary blob + metacmp_res = cmp(dec_met_output_ref, dec_met_output_dut) + + # Compare audio outputs + pcmcmp_res, reason = cmp_pcm(dec_output_dut, dec_output_ref, output_mode, int(out_fs*1000)) + + # Fail if compare fails compare result + if metacmp_res == False and pcmcmp_res != 0: + pytest.fail("Metadata and transport output difference detected") + elif metacmp_res == False: + pytest.fail("Metadata output difference detected") + elif pcmcmp_res != 0: + pytest.fail("Transport output difference detected") + + else: + # Compare audio outputs + filecmp_res = cmp(dec_output_ref, dec_output_dut) + if filecmp_res == False: + cmp_result, reason = cmp_pcm(dec_output_dut, dec_output_ref, output_mode, int(out_fs*1000)) + # Report compare result + assert cmp_result == 0, reason + + + + remove_output( + keep_files, + output_bitstream_ref, + output_bitstream_dut, + dec_output_ref, + dec_output_dut, + dec_met_output_ref, + dec_met_output_dut, + ) + + +######################################################### +# -------------------- test function -------------------- +def ivas_enc( + encoder_frontend, + masa_channel_count, + masa_path, + ivas_br, + sampling_rate, + input_audio_path, + output_bitstream, + dtx: Optional[bool] = False, +): + + # ------------ run cmd ------------ + options = ['-masa', f"{masa_channel_count}", f"{masa_path}"] + + # call encoder + encoder_frontend.run( + ivas_br, + sampling_rate, + input_audio_path, + output_bitstream, + dtx_mode=dtx, + add_option_list=options, + ) + + +def ivas_dec( + decoder_frontend, + output_mode, + sampling_rate, + input_bitstream, + output_path, +): + + # -------- run cmd ------------ + + # call decoder + decoder_frontend.run( + output_mode, + sampling_rate, + input_bitstream, + output_path, + ) + + +def remove_output( + keep_files, + output_bitstream_ref, + output_bitstream_dut, + dec_output_ref, + dec_output_dut, + dec_met_output_ref: Optional[str] = None, + dec_met_output_dut: Optional[str] = None, +): + if not keep_files: + os.remove(output_bitstream_ref) + os.remove(output_bitstream_dut) + os.remove(dec_output_ref) + os.remove(dec_output_dut) + if dec_met_output_ref is not None: + os.remove(dec_met_output_ref) + if dec_met_output_dut is not None: + os.remove(dec_met_output_dut) -- GitLab From 1af927fa19bae01579b6ed38595b2d8e7e851267 Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 9 Jun 2023 14:10:13 +0200 Subject: [PATCH 323/381] tuning within FIX_529_BWD_ISSUE --- lib_com/options.h | 2 +- lib_enc/bw_detect.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7ad3f7214c..efad21d267 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ #ifdef DEBUGGING -/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ +#define DEBUG_MODE_INFO /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 79cb67636e..2a7c13d9a6 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -62,17 +62,21 @@ #define ALPHA_BWD 0.75f #define BWD_LT_THRESH 0.6f -#define BWD_COUNT_MAX 100 -#define BWD_COUNT_WIDER_BW 10 +#define BWD_COUNT_MAX 100 +#define BWD_COUNT_WIDER_BW 10 +#ifdef FIX_529_BWD_ISSUE +#define BWD_COUNT_WIDER_BW_MDCT 2 +#else #define BWD_COUNT_WIDER_BW_MDCT 0 +#endif #define CLDFB_ENER_OFFSET 1.6f /*-------------------------------------------------------------------* - * bw_detect() - * - * bandwidth detector - *-------------------------------------------------------------------*/ + * bw_detect() + * + * bandwidth detector + *-------------------------------------------------------------------*/ void bw_detect( Encoder_State *st, /* i/o: Encoder State */ -- GitLab From 4b42978bdbbc828d2aeb6ab506dffe611260b7ca Mon Sep 17 00:00:00 2001 From: vaclav Date: Fri, 9 Jun 2023 14:23:53 +0200 Subject: [PATCH 324/381] clang-format --- lib_com/prot.h | 66 +++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/lib_com/prot.h b/lib_com/prot.h index 0831522564..28466e7587 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -526,29 +526,29 @@ void push_next_bits( #ifdef IND_LIST_DYN /*! r: maximum number of indices */ int16_t get_ivas_max_num_indices( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); /*! r: maximum number of indices */ int16_t get_core_max_num_indices( - const int16_t core, /* i : core */ - const int32_t total_brate /* i : total bitrate */ + const int16_t core, /* i : core */ + const int32_t total_brate /* i : total bitrate */ ); /*! r: maximum number of indices */ int16_t get_BWE_max_num_indices( - const int32_t extl_brate /* i : extensiona layer bitrate */ + const int32_t extl_brate /* i : extensiona layer bitrate */ ); /*! r: maximum number of indices */ int16_t get_ivas_max_num_indices_metadata( - const IVAS_FORMAT ivas_format, /* i : IVAS format */ - const int32_t ivas_total_brate /* i : IVAS total bitrate */ + const IVAS_FORMAT ivas_format, /* i : IVAS format */ + const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); ivas_error ind_list_realloc( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const int16_t max_num_indices /* i : new maximum number of allowed indices in the list */ ); @@ -568,15 +568,15 @@ ivas_error move_indices( /*! r: index of the indice in the list, -1 if not found */ int16_t find_indice( - BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i : encoder bitstream handle */ const int16_t id, /* i : ID of the indice */ - uint16_t *value, /* o : value of the quantized indice */ - int16_t *nb_bits /* o : number of bits used to quantize the indice */ + uint16_t *value, /* o : value of the quantized indice */ + int16_t *nb_bits /* o : number of bits used to quantize the indice */ ); /*! r: number of deleted indices */ uint16_t delete_indice( - BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const int16_t id /* i : ID of the indice */ ); #endif @@ -3093,7 +3093,7 @@ void lsf_enc( float *Aq, /* o : quantized A(z) for 4 subframes */ const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ const int16_t GSC_IVAS_mode, /* i : GSC IVAS mode */ - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); void isf_enc_amr_wb( @@ -4569,7 +4569,7 @@ ivas_error acelp_core_dec( const int16_t flag_sec_CNA, /* i : CNA flag for secondary channel */ const int16_t nchan_out, /* i : number of output channels */ STEREO_CNG_DEC_HANDLE hStereoCng, /* i : stereo CNG handle */ - const int16_t read_sid_info /* i : read SID info flag */ + const int16_t read_sid_info /* i : read SID info flag */ ); void bass_psfilter_init( @@ -4642,15 +4642,15 @@ void swb_CNG_dec( ); void lsf_dec( - Decoder_State *st, /* i/o: State structure */ - const int16_t tc_subfr, /* i : TC subframe index */ - float *Aq, /* o : quantized A(z) for 4 subframes */ - int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ - float *lsf_new, /* o : de-quantized LSF vector */ - float *lsp_new, /* o : de-quantized LSP vector */ - float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ + Decoder_State *st, /* i/o: State structure */ + const int16_t tc_subfr, /* i : TC subframe index */ + float *Aq, /* o : quantized A(z) for 4 subframes */ + int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ + float *lsf_new, /* o : de-quantized LSF vector */ + float *lsp_new, /* o : de-quantized LSP vector */ + float *lsp_mid, /* o : de-quantized mid-frame LSP vector */ const int16_t tdm_low_rate_mode, /* i : secondary channel low rate mode flag */ - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); void isf_dec_amr_wb( @@ -8114,11 +8114,11 @@ int16_t enc_lsf_tcxlpc( ); void msvq_enc( - const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ - const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ - const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ - const float u[], /* i : Vector to be encoded (prediction and mean removed) */ - const int16_t *levels, /* i : Number of levels in each stage */ + const float *const *cb, /* i : Codebook (indexed cb[*stages][levels][p]) */ + const int16_t dims[], /* i : Dimension of each codebook stage (NULL: full dim.) */ + const int16_t offs[], /* i : Starting dimension of each codebook stage (NULL: 0) */ + const float u[], /* i : Vector to be encoded (prediction and mean removed) */ + const int16_t *levels, /* i : Number of levels in each stage */ const int16_t maxC, /* i : Tree search size (number of candidates kept from one stage to the next == M-best) */ const int16_t stages, /* i : Number of stages */ const float w[], /* i : Weights */ @@ -8183,12 +8183,12 @@ void extend_dctN_input( /*! r: (p_max , best candidate sofar ) */ int16_t msvq_stage1_dct_search( - const float *u, /* i : target */ - const int16_t N, /* i : target length and IDCT synthesis length */ - const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ - const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ + const float *u, /* i : target */ + const int16_t N, /* i : target length and IDCT synthesis length */ + const int16_t maxC_st1, /* i : number of final stage 1 candidates to provide */ + const DCTTYPE dcttype, /* e.g. DCT_T2_16_XX, DCT_T2_24_XX; */ const int16_t max_dct_trunc, /* i : maximum of truncation lenghts */ - float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ + float *invTrfMatrix, /* i : IDCT synthesis matrix for dim N */ const float *midQ_truncQ, /* i : midQ vector */ const float *dct_invScaleF, /* i : global inv scale factors */ const float *dct_scaleF, /* i : global scale factors */ @@ -8358,7 +8358,7 @@ void lsf_end_dec( int16_t *lpc_param, /* i : LPC parameters */ int16_t *LSF_Q_prediction, /* o : LSF prediction mode */ int16_t *nb_indices, /* o : number of indices */ - const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ + const float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ ); ivas_error find_pred_mode( -- GitLab From 43cce20d23c30bffc39bbe472705c6cffafa58c2 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Fri, 9 Jun 2023 15:38:45 +0300 Subject: [PATCH 325/381] Add test cases for combined rotations --- scripts/config/self_test.prm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 97068a99a3..6aeb1fb8da 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -302,6 +302,10 @@ ../IVAS_cod -dtx -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48n.wav bit ../IVAS_dec BINAURAL 48 bit testv/stv4ISM48n.wav_32000_48-48_DTX_BINAURAL.tst +// 4 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, BINAURAL out, head rotation, external orientation +../IVAS_cod -ism 4 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 32000 48 testv/stv4ISM48s.wav bit +../IVAS_dec -t testv/headrot_case03_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv4ISM48s.wav_32000_48-48_binaural_file_TDHR_EXOF.tst + // 2 ISM with metadata at 32 kbps, 48 kHz in, 48 kHz out, DTX on, HOA2 out ../IVAS_cod -dtx -ism 2 testv/stvISM1.csv testv/stvISM2.csv 32000 48 testv/stvST48c.wav bit ../IVAS_dec HOA2 48 bit testv/stv2ST48c.wav_32000_48-48_DTX_HOA2.tst @@ -684,6 +688,10 @@ ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit ../IVAS_dec BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BINAURAL_ROOM.tst +// SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, external orientation +../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BinauralRoom_Headrot_EXOF.tst + // SBA at 256 kbps, 48kHz in, 48kHz out, 7_1 out, random FEC at 5% ../IVAS_cod -sba 1 256000 48 testv/stvFOA48c.wav bit ../IVAS_dec -fec 5 7_1 48 bit testv/stvFOA48c.wav_SBA_256000_48-48_7_1_FEC5.tst @@ -696,6 +704,10 @@ ../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit ../IVAS_dec binaural 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_binaural.tst +// SBA 3OA at 512 kbps, 48kHz in, 48kHz out, BINAURAL out, Headrotation, external orientation +../IVAS_cod -sba 3 512000 48 testv/stv3OA48c.wav bit +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL 48 bit testv/stv3OA48c.wav_SBA_512000_48-48_Binaural_Headrot_EXOF.tst + // SBA FOA bitrate switching from 13.2 kbps to 192 kbps, 48kHz in, 48kHz out, BINAURAL out ../IVAS_cod -sba 1 ../scripts/switchPaths/sw_13k2_192k_50fr.bin 48 testv/stvFOA48c.wav bit ../IVAS_dec BINAURAL 48 bit testv/stvFOA48c.wav_sw_48-48_BINAURAL.tst -- GitLab From e16f8a88a291455eb9de2f5e1e74d942139e0f70 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 9 Jun 2023 16:10:28 +0300 Subject: [PATCH 326/381] Add support for update_ref in MASA tests. --- tests/test_masa_enc_dec.py | 158 +++++++++++++++++++------------------ 1 file changed, 82 insertions(+), 76 deletions(-) diff --git a/tests/test_masa_enc_dec.py b/tests/test_masa_enc_dec.py index 41b8381378..4308947783 100644 --- a/tests/test_masa_enc_dec.py +++ b/tests/test_masa_enc_dec.py @@ -71,6 +71,7 @@ def check_and_makedir(dir_path): raise # raises the error again +@pytest.mark.create_ref @pytest.mark.parametrize("output_mode", output_mode_list) @pytest.mark.parametrize("ivas_br", ivas_br_masa) @pytest.mark.parametrize("masa_metadata_audio_ndir_ntransportch_dtx", masa_metadata_audio_ndir_ntransportch_dtx_list) @@ -81,6 +82,7 @@ def test_masa_enc_dec( ref_decoder_path, reference_path, dut_base_path, + update_ref, keep_files, ivas_br, masa_metadata_audio_ndir_ntransportch_dtx, @@ -131,83 +133,87 @@ def test_masa_enc_dec( dec_met_output_ref = None dec_met_output_dut = None - # Encode REF - ivas_enc( - ref_encoder_frontend, - masa_channel_count, - masa_path, - ivas_br, - in_fs, - input_audio_path, - output_bitstream_ref, - dtx, - ) - - # Encode DUT - ivas_enc( - dut_encoder_frontend, - masa_channel_count, - masa_path, - ivas_br, - in_fs, - input_audio_path, - output_bitstream_dut, - dtx, - ) - - # Decode REF - ivas_dec( - ref_decoder_frontend, - output_mode, - out_fs, - output_bitstream_ref, - dec_output_ref, - ) + if update_ref == 2 or update_ref == 1: + # Encode REF + ivas_enc( + ref_encoder_frontend, + masa_channel_count, + masa_path, + ivas_br, + in_fs, + input_audio_path, + output_bitstream_ref, + dtx, + ) + + # Decode REF + ivas_dec( + ref_decoder_frontend, + output_mode, + out_fs, + output_bitstream_ref, + dec_output_ref, + ) + + if update_ref == 2 or update_ref == 0: + # Encode DUT + ivas_enc( + dut_encoder_frontend, + masa_channel_count, + masa_path, + ivas_br, + in_fs, + input_audio_path, + output_bitstream_dut, + dtx, + ) + + # Decode DUT + ivas_dec( + dut_decoder_frontend, + output_mode, + out_fs, + output_bitstream_dut, + dec_output_dut, + ) + + # Compare outputs. For EXT output, also compare metadata. + if output_mode == 'EXT': + # Compare metadata as binary blob + metacmp_res = cmp(dec_met_output_ref, dec_met_output_dut) + + # Compare audio outputs + pcmcmp_res, reason = cmp_pcm(dec_output_dut, dec_output_ref, output_mode, int(out_fs*1000)) + + # Fail if compare fails compare result + if metacmp_res == False and pcmcmp_res != 0: + pytest.fail("Metadata and transport output difference detected") + elif metacmp_res == False: + pytest.fail("Metadata output difference detected") + elif pcmcmp_res != 0: + pytest.fail("Transport output difference detected") + else: + print("Comparison bit exact") - # Decode DUT - ivas_dec( - dut_decoder_frontend, - output_mode, - out_fs, - output_bitstream_dut, - dec_output_dut, - ) - - # Compare outputs. For EXT output, also compare metadata. - if output_mode == 'EXT': - # Compare metadata as binary blob - metacmp_res = cmp(dec_met_output_ref, dec_met_output_dut) - - # Compare audio outputs - pcmcmp_res, reason = cmp_pcm(dec_output_dut, dec_output_ref, output_mode, int(out_fs*1000)) - - # Fail if compare fails compare result - if metacmp_res == False and pcmcmp_res != 0: - pytest.fail("Metadata and transport output difference detected") - elif metacmp_res == False: - pytest.fail("Metadata output difference detected") - elif pcmcmp_res != 0: - pytest.fail("Transport output difference detected") - - else: - # Compare audio outputs - filecmp_res = cmp(dec_output_ref, dec_output_dut) - if filecmp_res == False: - cmp_result, reason = cmp_pcm(dec_output_dut, dec_output_ref, output_mode, int(out_fs*1000)) - # Report compare result - assert cmp_result == 0, reason - - - - remove_output( - keep_files, - output_bitstream_ref, - output_bitstream_dut, - dec_output_ref, - dec_output_dut, - dec_met_output_ref, - dec_met_output_dut, - ) + else: + # Compare audio outputs + filecmp_res = cmp(dec_output_ref, dec_output_dut) + if filecmp_res == False: + cmp_result, reason = cmp_pcm(dec_output_dut, dec_output_ref, output_mode, int(out_fs*1000)) + # Report compare result + assert cmp_result == 0, reason + else: + print("Comparison bit exact") + + # remove_output( + # keep_files, + # output_bitstream_ref, + # output_bitstream_dut, + # dec_output_ref, + # dec_output_dut, + # dec_met_output_ref, + # dec_met_output_dut, + # ) ######################################################### -- GitLab From 111332a15531f01f74324e28ef1926d16d59da9b Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 9 Jun 2023 16:50:49 +0300 Subject: [PATCH 327/381] Fix order in comment --- tests/test_masa_enc_dec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_masa_enc_dec.py b/tests/test_masa_enc_dec.py index 4308947783..9950889598 100644 --- a/tests/test_masa_enc_dec.py +++ b/tests/test_masa_enc_dec.py @@ -49,7 +49,7 @@ from conftest import EncoderFrontend, DecoderFrontend output_mode_list = ['BINAURAL', 'EXT'] ivas_br_masa = [13200, 16400, 24400, 32000, 48000, 64000, 80000, 96000, 128000, 160000, 192000, 256000, 384000, 512000] -# Write file-based parameter sets here (metafile, pcm/wave, numTC, numDir, DTX_toggle) +# Write file-based parameter sets here (metafile, pcm/wave, numDir, numTC, DTX_toggle) masa_metadata_audio_ndir_ntransportch_dtx_list = [#('stv1MASA1TC48c.met', 'stv1MASA1TC48c.wav', 1, 1, False), #('stv1MASA2TC48c.met', 'stv1MASA2TC48c.wav', 1, 2, False), ('stv2MASA1TC48c.met', 'stv2MASA1TC48c.wav', 2, 1, False), -- GitLab From 8c6e554d5898ba2cf99f0598da34dc920154a66c Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 12 Jun 2023 07:59:02 +0200 Subject: [PATCH 328/381] revert BWD hysteresis at mediumbitrates back to 0 frames --- lib_enc/bw_detect.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 2a7c13d9a6..9a15ae61bb 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -62,13 +62,9 @@ #define ALPHA_BWD 0.75f #define BWD_LT_THRESH 0.6f -#define BWD_COUNT_MAX 100 -#define BWD_COUNT_WIDER_BW 10 -#ifdef FIX_529_BWD_ISSUE -#define BWD_COUNT_WIDER_BW_MDCT 2 -#else +#define BWD_COUNT_MAX 100 +#define BWD_COUNT_WIDER_BW 10 #define BWD_COUNT_WIDER_BW_MDCT 0 -#endif #define CLDFB_ENER_OFFSET 1.6f -- GitLab From 910654a49fe11dc935e0bf0939ed9ea6c77d2ece Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Mon, 12 Jun 2023 09:00:05 +0300 Subject: [PATCH 329/381] Update copyright year. --- tests/test_masa_enc_dec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_masa_enc_dec.py b/tests/test_masa_enc_dec.py index 9950889598..c09da3c0d2 100644 --- a/tests/test_masa_enc_dec.py +++ b/tests/test_masa_enc_dec.py @@ -1,6 +1,6 @@ __copyright__ = \ """ - (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other -- GitLab From be359988c3d539edb540a0de52e7385b8f4c396c Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 12 Jun 2023 08:25:28 +0200 Subject: [PATCH 330/381] fix MSAN error --- lib_enc/bw_detect.c | 2 +- lib_enc/ivas_cpe_enc.c | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib_enc/bw_detect.c b/lib_enc/bw_detect.c index 9a15ae61bb..9c96a851f2 100644 --- a/lib_enc/bw_detect.c +++ b/lib_enc/bw_detect.c @@ -655,7 +655,7 @@ void set_bw_stereo( Encoder_State **sts = hCPE->hCoreCoder; #ifdef FIX_529_BWD_ISSUE - if ( sts[0]->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT || sts[1]->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT ) + if ( hCPE->element_brate > BWD_MAX_BRATE_WIDER_BW_MDCT ) { sts[0]->bwidth = sts[0]->max_bwidth; sts[1]->bwidth = sts[1]->max_bwidth; diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 17d9f855db..2595c6f78b 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -302,10 +302,7 @@ ivas_error ivas_cpe_enc( lfe_bits = ( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCT ? st_ivas->hLFE->lfe_bits : 0 ); sts[n]->total_brate = hCPE->element_brate; sts[n]->bits_frame_nominal = (int16_t) ( hCPE->element_brate / FRAMES_PER_SEC ); - sts[n]->bits_frame_channel = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC - - lfe_bits - - nb_bits_metadata ) / - st_ivas->hMCT->nchan_out_woLFE ); + sts[n]->bits_frame_channel = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC - lfe_bits - nb_bits_metadata ) / st_ivas->hMCT->nchan_out_woLFE ); } else { @@ -333,8 +330,7 @@ ivas_error ivas_cpe_enc( if ( hCPE->element_mode == IVAS_CPE_DFT ) { - stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs, - hCPE->hStereoDft->hItd->hybrid_itd_max ); + stereo_dft_hybrid_ITD_flag( hCPE->hStereoDft->hConfig, input_Fs, hCPE->hStereoDft->hItd->hybrid_itd_max ); /* Time Domain ITD compensation using extrapolation */ #ifdef DEBUG_MODE_DFT -- GitLab From 6cc39710e491bdc6226485a5b8fc761f922f571e Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 12 Jun 2023 08:42:18 +0200 Subject: [PATCH 331/381] disable --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index efad21d267..7ad3f7214c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -58,7 +58,7 @@ #ifdef DEBUGGING -#define DEBUG_MODE_INFO /* output most important parameters to the subdirectory "res/" */ +/*#define DEBUG_MODE_INFO*/ /* output most important parameters to the subdirectory "res/" */ #ifdef DEBUG_MODE_INFO /*#define DEBUG_MODE_ACELP*/ /* output most important ACELP core parameters to the subdirectory "res/" */ /*#define DEBUG_MODE_TCX*/ /* output most important TCX core parameters to the subdirectory "res/" */ -- GitLab From edd8d5cbbca0ca1a85c657fdf9361e2706d1981d Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Mon, 12 Jun 2023 10:22:43 +0300 Subject: [PATCH 332/381] Add masa ext renderer BE tests --- tests/renderer/test_renderer.py | 14 +------------- tests/renderer/test_renderer_be_comparison.py | 9 ++++++++- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/tests/renderer/test_renderer.py b/tests/renderer/test_renderer.py index 38b7bbf9e7..0db27448d1 100644 --- a/tests/renderer/test_renderer.py +++ b/tests/renderer/test_renderer.py @@ -365,24 +365,12 @@ def test_ism_binaural_headrotation_refvec_rotating(test_info, in_fmt, out_fmt): """ MASA """ -@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS[2:]) +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS) @pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA) def test_masa(test_info, in_fmt, out_fmt): run_renderer(in_fmt, out_fmt, in_meta_files=FORMAT_TO_METADATA_FILES[in_fmt]) -# MASA inputs not supported yet -# @pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS) -# @pytest.mark.parametrize("in_fmt", METADATA_SCENES_TO_TEST_NO_BE) -# def test_metadata_masa(test_info, in_fmt, out_fmt): -# # TODO: unify with test_metadata once Python supports MASA -# cut, cut_fs = run_renderer( -# "META", -# out_fmt, -# metadata_input=TEST_VECTOR_DIR.joinpath(f"{in_fmt}.txt"), -# ) - - """ Custom loudspeaker layouts """ diff --git a/tests/renderer/test_renderer_be_comparison.py b/tests/renderer/test_renderer_be_comparison.py index 460ded4250..ee6d79ba3e 100644 --- a/tests/renderer/test_renderer_be_comparison.py +++ b/tests/renderer/test_renderer_be_comparison.py @@ -137,7 +137,14 @@ def test_ism_binaural_headrotation(test_info, in_fmt, out_fmt, trj_file): """ MASA """ -# TODO: MASA inputs not supported yet + +@pytest.mark.parametrize("out_fmt", OUTPUT_FORMATS) +@pytest.mark.parametrize("in_fmt", INPUT_FORMATS_MASA) +def test_masa(test_info, in_fmt, out_fmt): + compare_renderer_vs_mergetarget( + test_info, in_fmt, out_fmt, in_meta_files=FORMAT_TO_METADATA_FILES[in_fmt] + ) + """ Custom loudspeaker layouts """ -- GitLab From c61e13cf532ada17f5d93e18c7ff1c5437d592d0 Mon Sep 17 00:00:00 2001 From: rhb Date: Mon, 12 Jun 2023 10:47:48 +0200 Subject: [PATCH 333/381] slight tuning of 96 kbps stereo IGF config --- lib_com/options.h | 1 + lib_com/rom_com.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 4328602f5a..7b26543f13 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,6 +170,7 @@ #define FIX_122_MC_DECODER_COMPLEXITY /* FhG: Issue 122, significant decrease of worst case MC decoder complexity */ #define FIX_531_BWS_ISM_BFI /* VA: issue 531: fix MemorySanitizer: use-of-uninitialized-value in ISM2 rate switching with frame errors */ #define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ +#define IGF_TUNING_96 /* FhG: Issue 546: slight tuning of IGF config used in 96 kbps stereo, 128 kbps SBA and others */ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 800362b576..a1a7459885 100755 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -21632,14 +21632,22 @@ const int16_t igf_tile_offset_table[IGF_BITRATE_UNKNOWN][2*IGF_MAX_TILES+1] = { { 3, 1, 0, 2, 40, 3, 80 }, /* 48000 SWB (stereo TCX10) */ { 4, 2, 80, 4, 128, 6, 144, 7, 212 }, /* 64000 SWB (stereo) */ { 2, 2, 212, 4, 280 }, /* 80000 SWB (stereo) */ +#ifdef IGF_TUNING_96 + { 1, 3, 200}, /* 96000 SWB (stereo) */ +#else { 1, 3, 320}, /* 96000 SWB (stereo) */ +#endif { 9, 1, 0, 2, 32, 3, 72, 4, 120, 5, 48, 6, 112, 7, 64, 8, 0, 9, 80 }, /* 24400 FB (stereo) */ {10, 1, 0, 2, 28, 3, 64, 4, 104, 5, 32, 6, 80, 7, 136, 8, 64, 9, 0, 10, 80 }, /* 32000 FB (stereo) */ { 7, 1, 120, 2, 152, 3, 184, 4, 224, 5, 140, 6, 192, 8, 140}, /* 48000 FB (stereo) */ { 4, 1, 0, 2, 40, 3, 80, 4, 140 }, /* 48000 FB (stereo TCX10) */ { 5, 2, 80, 4, 128, 6, 144, 7, 212, 9, 160 }, /* 64000 FB (stereo) */ { 3, 2, 212, 4, 280, 6, 200 }, /* 80000 FB (stereo) */ +#ifdef IGF_TUNING_96 + { 2, 3, 200, 5, 240}, /* 96000 FB (stereo) */ +#else { 2, 3, 320, 5, 240}, /* 96000 FB (stereo) */ +#endif { 1, 2, 416} /*128000 FB (stereo) */ }; -- GitLab From 756a72bb05c82594dbf8e125fe6fec5b80bd063e Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Mon, 12 Jun 2023 16:41:27 +0300 Subject: [PATCH 334/381] Fix function call with proper use of EXTERNAL_ORIENTATIONS switch --- lib_rend/lib_rend.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 094d7ed6bf..08f6536249 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5143,9 +5143,10 @@ static ivas_error renderIsmToBinauralReverb( if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, - ismInput->base.ctx.pHeadRotData, #ifdef EXTERNAL_ORIENTATIONS ismInput->base.ctx.pCombinedOrientationData, +#else + ismInput->base.ctx.pHeadRotData, #endif &ismInput->currentPos, ismInput->hReverb, -- GitLab From 1aacbfd39e6fc24fed9a860dc34d6f52ad4ae36f Mon Sep 17 00:00:00 2001 From: rhb Date: Mon, 12 Jun 2023 18:33:03 +0200 Subject: [PATCH 335/381] fix possible nan in IGF decoder --- lib_com/options.h | 2 +- lib_dec/igf_dec.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 lib_dec/igf_dec.c diff --git a/lib_com/options.h b/lib_com/options.h index aafa43e9af..e2107c11d6 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -181,7 +181,7 @@ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ #define ISM_25k6_HZ_CORE /* VA: issue 540: 1ISM 48 kbps - change ACELP/TCX 16 kHz core to TCX only 25.6 kHz core */ - +#define FIX_547_NAN_IGF_DEC /* FhG: issue 547: fix possible nan in IGF decoder */ #define FIX_528_ISM_MD_FILE_TOO_SHORT /* VA: issue 528: ISM Metadata file too short */ diff --git a/lib_dec/igf_dec.c b/lib_dec/igf_dec.c old mode 100644 new mode 100755 index a3eefd226e..b9049241b9 --- a/lib_dec/igf_dec.c +++ b/lib_dec/igf_dec.c @@ -165,6 +165,10 @@ static void IGF_replaceTCXNoise_2_new( } } +#ifdef FIX_547_NAN_IGF_DEC + rE = max( rE, 1.f ); +#endif + if ( n_noise_bands_tile ) { noise_band_ratio = (float) n_noise_bands_tile / n_noise_bands; -- GitLab From 89d43f0431ec06fe78e983c766b97a47bd021313 Mon Sep 17 00:00:00 2001 From: Lauros Pajunen Date: Tue, 13 Jun 2023 10:09:39 +0300 Subject: [PATCH 336/381] Change from BINAURAL_ROOM to BINAURAL_ROOM_IR in the combined orientation tests --- scripts/config/self_test.prm | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/scripts/config/self_test.prm b/scripts/config/self_test.prm index 2780bce908..2355fba5fd 100644 --- a/scripts/config/self_test.prm +++ b/scripts/config/self_test.prm @@ -336,7 +336,7 @@ // 1 ISM with metadata at 48 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out, head rotation, external orientation, random FEC at 5% ../IVAS_cod -ism 1 testv/stvISM1.csv 48000 48 testv/stv1ISM48s.wav bit -../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR_EXOF.tst +../IVAS_dec -fec 5 -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv1ISM48s.wav_64000_48-48_binaural_room_HR_EXOF.tst // 2 ISM with metadata at 64 kbps, 48 kHz in, 48 kHz out, BINAURAL ROOM out ../IVAS_cod -ism 2 testv/stvISM3.csv testv/stvISM4.csv 64000 48 testv/stv2ISM48s.wav bit @@ -554,7 +554,7 @@ // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, external orientation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot_EXOF.tst +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_48000_32-32_BinauralRoom_Headrot_EXOF.tst // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit @@ -562,7 +562,7 @@ // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking, external orientation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrAvg.tst // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit @@ -570,7 +570,7 @@ // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking, external orientation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPos.tst +../IVAS_dec -t ../scripts/trajectories/full-circle-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-4s-Vector3.csv -otr ref_vec BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPos.tst // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking in level mode ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit @@ -578,7 +578,7 @@ // SBA at 48 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, reference vector tracking in level mode, external orientation ../IVAS_cod -sba 3 48000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPosLev.tst +../IVAS_dec -t ../scripts/trajectories/full-circle-with-up-and-down-4s.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -rvf ../scripts/trajectories/full-circle-with-up-and-down-4s-Vector3.csv -otr ref_vec_lev BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_48000_32-32_BinauralRoom_Headrot_EXOF_OtrRefPosLev.tst // SBA at 48 kbps, 32kHz in, 32kHz out, DTX on, BINAURAL out, random FEC at 5% ../IVAS_cod -sba 3 -dtx 48000 32 testv/stv3OA32c.wav bit @@ -646,7 +646,7 @@ // SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, external orientation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot_EXOF.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.wav_SBA_128000_32-32_Binaural_room_Headrot_EXOF.tst // SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit @@ -654,7 +654,7 @@ // SBA at 128 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking, external orientation ../IVAS_cod -sba 3 128000 32 testv/stv3OA32c.wav bit -../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_EXOF_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 32 bit testv/stv3OA32c.pcm_SBA_128000_32-32_Binaural_room_Headrot_EXOF_OtrAvg.tst // SBA at 192 kbps, 48kHz in, 48kHz out, HOA2 out, random FEC at 5% ../IVAS_cod -sba 3 192000 48 testv/stv3OA48c.wav bit @@ -690,7 +690,7 @@ // SBA at 256 kbps, 32kHz in, 32kHz out, BINAURAL ROOM out, Headrotation, external orientation ../IVAS_cod -sba 1 256000 32 testv/stvFOA32c.wav bit -../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BinauralRoom_Headrot_EXOF.tst +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 32 bit testv/stvFOA32c.wav_SBA_256000_32-32_BinauralRoom_Headrot_EXOF.tst // SBA at 256 kbps, 48kHz in, 48kHz out, 7_1 out, random FEC at 5% ../IVAS_cod -sba 1 256000 48 testv/stvFOA48c.wav bit @@ -756,7 +756,7 @@ // MASA 1dir 1TC at 24.4 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, external orientation ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 24400 48 testv/stv1MASA1TC48c.wav bit -../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot_EXOF.tst +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA1TC48c.wav_24400_48-48_BinauralRoom_Headrot_EXOF.tst // MASA 1dir 1TC at 32 kbps, 48kHz in, 48kHz out, 7_1_4, random FEC at 5% ../IVAS_cod -masa 1 testv/stv1MASA1TC48c.met 32000 48 testv/stv1MASA1TC48c.wav bit @@ -808,7 +808,7 @@ // MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, external orientation ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot_EXOF.tst +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv1MASA2TC48c.wav_32000_48-48_BinauralRoom_Headrot_EXOF.tst // MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit @@ -816,7 +816,7 @@ // MASA 1dir 2TC at 32 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, Orientation tracking, external orientation ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 32000 48 testv/stv1MASA2TC48c.wav bit -../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_EXOF_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv_IVASMASA_1dir2TC.pcm_32000_48-48_BinauralRoom_Headrot_EXOF_OtrAvg.tst // MASA 1dir 2TC at 48 kbps, 48kHz in, 48kHz out, 7_1_4 out, random FEC at 5% ../IVAS_cod -masa 2 testv/stv1MASA2TC48c.met 48000 48 testv/stv1MASA2TC48c.wav bit @@ -942,7 +942,7 @@ // Multi-channel 5_1 at 64 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, Headrotation, external orientation ../IVAS_cod -mc 5_1 64000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot_EXOF.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_64000_48-48_Binaural_room_Headrot_EXOF.tst // Multi-channel 5_1 at 96 kbps, 48kHz in, 48kHz out, random FEC at 5% ../IVAS_cod -mc 5_1 96000 48 testv/stv51MC48c.wav bit @@ -978,7 +978,7 @@ // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, external orientation ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot_EXOF.tst +../IVAS_dec -t testv/headrot_case00_3000_q.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.wav_MC51_256000_48-48_BinauralRoom_Headrot_EXOF.tst // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, Orientation tracking ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit @@ -986,7 +986,7 @@ // Multi-channel 5_1 at 256 kbps, 48kHz in, 48kHz out, BINAURAL ROOM out, head rotation, Orientation tracking, external orientation ../IVAS_cod -mc 5_1 256000 48 testv/stv51MC48c.wav bit -../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_EXOF_OtrAvg.tst +../IVAS_dec -t testv/headrot.csv -exof testv/headrot_case00_3000_q_combinedRotationTest.csv -otr avg BINAURAL_ROOM_IR 48 bit testv/stv51MC48c.pcm_MC51_256000_48-48_BinauralRoom_EXOF_OtrAvg.tst // Multi-channel 5_1 at 384 kbps, 48kHz in, 48kHz out ../IVAS_cod -mc 5_1 384000 48 testv/stv51MC48c.wav bit -- GitLab From 7b4ed8589c95fe2778ddd5234fea5ac79b7818ac Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 13 Jun 2023 12:09:18 +0200 Subject: [PATCH 337/381] activate FIX_356_ISM_METADATA_SYNC; intorduce FIX_356_ISM_METADATA_SYNC_OMASA to temporarily keep BE in OMASA --- lib_com/options.h | 4 ++-- lib_dec/ivas_objectRenderer_internal.c | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 7fa5e09a70..1fd31be0c5 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -158,8 +158,7 @@ #define FIX_411_EVS_BE_TESTS_ON_WINDOWS_FAILING /* Eri: Fix incorrect use of stack variable used for channel aware config file */ #define COMBINED_FORMAT_SIGNALING /* VA: Introduce a signaling bit for combined format coding */ -/* Todo OMASA: This switch causes more difference for OMASA path. Thus, disabled for OMASA currently. Enable to get BE to main. */ -/*#define FIX_356_ISM_METADATA_SYNC*/ /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ +#define FIX_356_ISM_METADATA_SYNC /* Eri: issue 356: Metadata out-of-synch for -no_delay_comp */ #define FIX_446_STEREO_DMX_CRASH /* FhG: fix discrepancy with EVS code that could cause crashes in rare cases */ @@ -230,6 +229,7 @@ #define OMASA_ENERGIES #define FIX_OMASA_STEREO_SWITCHING /* VA: introduce Unified/MDCT stereo switching for 3ISM @96 kbps and 4ISM @128 kbps */ #define FIX_OMASA_BRSW /* Nokia + VA: Fix missing init of OMASA metadata delay buffers, brsw-related init fixes */ +#define FIX_356_ISM_METADATA_SYNC_OMASA #endif /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 8d5f8e8772..21093ff266 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -114,6 +114,13 @@ ivas_error ivas_td_binaural_renderer( ism_md_subframe_update = 2; } +#ifdef FIX_356_ISM_METADATA_SYNC_OMASA + if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) + { + ism_md_subframe_update = 0; + } +#endif + return ivas_td_binaural_renderer_unwrap( st_ivas->hReverb, st_ivas->transport_config, -- GitLab From 1d6ebb472f56cefd6eb65c789a4978c6a29adc0a Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 13 Jun 2023 15:21:09 +0200 Subject: [PATCH 338/381] fix warnings --- lib_dec/ivas_dirac_output_synthesis_dec.c | 188 +++++++++++----------- lib_dec/ivas_init_dec.c | 7 +- lib_rend/ivas_objectRenderer.c | 44 ++--- lib_rend/lib_rend.c | 10 +- 4 files changed, 123 insertions(+), 126 deletions(-) diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 8de9c8539e..1c74fec901 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -625,119 +625,119 @@ void ivas_dirac_dec_output_synthesis_process_slot( } else // ( hDirAC->hConfig->dec_param_estim == TRUE ) if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { + { - /* compute direct responses */ - ivas_dirac_dec_compute_directional_responses( hDirAC, - hVBAPdata, - NULL, + /* compute direct responses */ + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + NULL, #ifdef MASA_AND_OBJECTS - NULL, + NULL, #endif - azimuth, - elevation, - md_idx, - NULL, - sh_rot_max_order, - p_Rmat, - hodirac_flag ); - - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + azimuth, + elevation, + md_idx, + NULL, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); + + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); - /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) - { - int16_t k; - if ( ch_idx != 0 ) + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) { - float a, b, c; - - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) + int16_t k; + if ( ch_idx != 0 ) { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + float a, b, c; + + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + } } - for ( ; k < num_freq_bands; k++ ) + else { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } } } - else + + /*Directional gain (panning)*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); - } + v_mult( h_dirac_output_synthesis_state->direct_power_factor, + &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], + aux_buf, + num_freq_bands ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); } - } - /*Directional gain (panning)*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) - { - v_mult( h_dirac_output_synthesis_state->direct_power_factor, - &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], - aux_buf, - num_freq_bands ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - num_freq_bands ); - } + /*Diffuse gain*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + { + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + aux_buf, + num_freq_bands_diff ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); + } - /*Diffuse gain*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + return; + } + else { - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - hDirAC->diffuse_response_function[ch_idx], - aux_buf, - num_freq_bands_diff ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - num_freq_bands_diff ); + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); } - - return; - } - else - { - /* compute reference and diffuse power factor for this frame */ - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); } - } diff_start_band = 0; if ( h_dirac_output_synthesis_params->use_onset_filters ) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 6e730727cf..5d4b7812c0 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -731,7 +731,11 @@ ivas_error ivas_init_decoder( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) { +#ifdef MASA_AND_OBJECTS + int16_t i, n, k; +#else int16_t i, n; +#endif int16_t sce_id, cpe_id; int16_t numCldfbAnalyses, numCldfbSyntheses; int16_t granularity, n_channels_transport_jbm; @@ -743,6 +747,7 @@ ivas_error ivas_init_decoder( #ifdef MASA_AND_OBJECTS int32_t ism_total_brate; #endif + error = IVAS_ERR_OK; output_Fs = st_ivas->hDecoderConfig->output_Fs; @@ -1061,7 +1066,7 @@ ivas_error ivas_init_decoder( return error; } - int16_t k = 0; + k = 0; ism_total_brate = 0; while ( k < SIZE_IVAS_BRATE_TBL && ivas_total_brate != ivas_brate_tbl[k] ) { diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 1ffbeecec9..f9831d4ce5 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -275,13 +275,13 @@ ivas_error ivas_td_binaural_renderer_unwrap( #ifdef EXTERNAL_ORIENTATIONS const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ #else - const int16_t Opt_Headrotation, /* i : Head rotation flag */ + const int16_t Opt_Headrotation, /* i : Head rotation flag */ #endif - const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; @@ -366,10 +366,10 @@ ivas_error ivas_td_binaural_renderer_unwrap( ivas_error TDREND_GetMix( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ - const int16_t subframe_length, /* i/o: subframe length */ - const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ - const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ + float *output[], /* i/o: ISM object synth / rendered output in 0,1 */ + const int16_t subframe_length, /* i/o: subframe length */ + const int16_t subframe_idx, /* i : Subframe index to 5 ms subframe */ + const int16_t ism_md_subframe_update /* Number of subframes to delay ism metadata to sync with audio */ ) { int16_t i; @@ -470,8 +470,8 @@ static void TDREND_Clear_Update_flags( void TDREND_Update_object_positions( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o : TD Renderer handle */ const int16_t num_src, /* i : number of sources to render */ - const IVAS_FORMAT in_format, /* i : Format of input sources */ - const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ + const IVAS_FORMAT in_format, /* i : Format of input sources */ + const ISM_METADATA_HANDLE *hIsmMetaData /* i : Input metadata for ISM objects */ ) { TDREND_DirAtten_t *DirAtten_p; @@ -552,13 +552,13 @@ void TDREND_Update_listener_orientation( #ifdef EXTERNAL_ORIENTATIONS if ( Pos != NULL ) { - /* Input position */ - Pos_p[0] = ( *Pos ).x; - Pos_p[1] = ( *Pos ).y; - Pos_p[2] = ( *Pos ).z; - } - else - { + /* Input position */ + Pos_p[0] = ( *Pos ).x; + Pos_p[1] = ( *Pos ).y; + Pos_p[2] = ( *Pos ).z; + } + else + { /* Listener at the origin */ Pos_p[0] = 0.0f; Pos_p[1] = 0.0f; @@ -649,13 +649,13 @@ ivas_error ivas_td_binaural_open_ext( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_ext( - const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ - const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ - const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ #ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ #else - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ + const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ #endif const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 6b637b7767..3ceb66f2c5 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5117,7 +5117,6 @@ static ivas_error renderIsmToBinauralRoom( } #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - static ivas_error renderIsmToBinauralReverb( input_ism *ismInput, IVAS_REND_AudioBuffer outAudio ) @@ -5452,13 +5451,6 @@ static ivas_error renderMcToBinaural( #else int8_t headRotEnabled; #endif - float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; - int16_t i; - - for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - p_tmpRendBuffer[i] = tmpRendBuffer[i]; - } push_wmops( "renderMcToBinaural" ); @@ -5537,7 +5529,7 @@ static ivas_error renderMcToBinaural( /* call CREND */ if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + NULL, NULL, NULL, NULL, NULL /* ToDo: TBV */, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From f31a511372ff196a26bfd8ab50a3a1012c1e18dc Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 13 Jun 2023 16:01:40 +0200 Subject: [PATCH 339/381] formatting --- apps/encoder.c | 6 +- lib_com/ivas_prot.h | 8 +- lib_com/ivas_stat_com.h | 2 + lib_dec/ivas_cpe_dec.c | 1 + lib_dec/ivas_dec.c | 2 +- lib_dec/ivas_dirac_dec.c | 2 +- lib_dec/ivas_dirac_output_synthesis_dec.c | 194 +++++++++---------- lib_dec/ivas_init_dec.c | 11 +- lib_dec/ivas_masa_dec.c | 2 + lib_dec/ivas_mono_dmx_renderer.c | 1 + lib_dec/ivas_omasa_dec.c | 2 + lib_dec/ivas_vbap.c | 14 +- lib_enc/ivas_cpe_enc.c | 1 - lib_enc/ivas_decision_matrix_enc.c | 1 + lib_enc/ivas_ism_metadata_enc.c | 4 - lib_enc/ivas_masa_enc.c | 14 +- lib_enc/ivas_qmetadata_enc.c | 3 + lib_enc/ivas_stat_enc.h | 2 +- lib_enc/lib_enc.c | 6 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 2 + lib_rend/ivas_objectRenderer.c | 1 + 21 files changed, 151 insertions(+), 128 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 567e32d431..66c64f39f3 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -97,6 +97,7 @@ typedef union _EncInputFormatConfig IVAS_ENC_MASA_VARIANT masaVariant; } masa_ism; #endif + } EncInputFormatConfig; /* Struct for storing cmdln arguments */ @@ -542,7 +543,6 @@ int main( } } - #ifdef MASA_AND_OBJECTS const int16_t numIsmInputs = ( arg.inputFormat == IVAS_ENC_INPUT_ISM || arg.inputFormat == IVAS_ENC_INPUT_MASA_ISM ) ? arg.inputFormatConfig.ism.numObjects : 0; #else @@ -1809,8 +1809,8 @@ static void usage_enc( void ) fprintf( stdout, " for IVAS SBA, MASA, MC R=(13200, 16400, 24400, 32000, 48000, 64000, 80000, \n" ); fprintf( stdout, " 96000, 128000, 160000, 192000, 256000, 384000, 512000) \n" ); #ifdef MASA_AND_OBJECTS - fprintf( stdout, " for IVAS MASA and objects R = (13200, 16400, 24400, 32000, 48000, 64000, 96000, 128000, \n" ); - fprintf( stdout, " 160000, 192000, 256000, 384000, 512000)\n" ); + fprintf( stdout, " for IVAS objects-MASA R =(13200, 16400, 24400, 32000, 48000, 64000, 96000, 128000, \n" ); + fprintf( stdout, " 160000, 192000, 256000, 384000, 512000)\n" ); #endif fprintf( stdout, " Alternatively, R can be a bitrate switching file which consists of R values\n" ); fprintf( stdout, " indicating the bitrate for each frame in bps. These values are stored in\n" ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 0d4c8dc241..09c08ccb29 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -1024,7 +1024,7 @@ void ivas_ism_metadata_close( ISM_METADATA_HANDLE hIsmMetaData[] /* i/o : object metadata handles */ #ifdef MASA_AND_OBJECTS , - const int16_t first_idx /* i : index of first handle to deallocate */ + const int16_t first_idx /* i : index of first handle to deallocate */ #endif ); @@ -5090,7 +5090,7 @@ ivas_error ivas_masa_encode( const int16_t ism_imp /* i : importance of separated object */ #ifdef OMASA_ENERGIES , - int16_t flag_omasa_brate /* i: flag for using less bitrate for objects in OMASA */ + const int16_t flag_omasa_brate /* i : flag for using less bitrate for objects in OMASA*/ #endif #endif ); @@ -5404,7 +5404,7 @@ ivas_error vbap_init_data( const int16_t num_speaker_nodes /* i : number of speaker nodes in the set */ #ifdef MASA_AND_OBJECTS , - const int16_t support_object_mode /* i : init VBAP also for object panning mode */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ #endif ); @@ -5706,7 +5706,7 @@ void ivas_omasa_set_config( OMASA_ENC_HANDLE hOMasa, /* i/o: OMASA encoder handle */ MASA_ENCODER_HANDLE hMasa, /* i : MASA encoder handle */ const int32_t input_Fs, /* i : Input sample rate */ - const ISM_MODE ism_mode /* i : ISM mode */ + const ISM_MODE ism_mode /* i : ISM mode */ ); void ivas_omasa_enc( diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index f0e5a05a97..9b8cee1df5 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -455,6 +455,7 @@ typedef struct ivas_omasa_meta_struct uint8_t num_dirs; MASA_DIRECTIONAL_SPATIAL_META directional_meta[MASA_MAXIMUM_DIRECTIONS]; MASA_COMMON_SPATIAL_META common_meta; + } OMASA_SPATIAL_META, *OMASA_SPATIAL_META_HANDLE; #endif @@ -570,6 +571,7 @@ typedef struct ivas_masa_qmetadata_frame_struct #ifdef MASA_AND_OBJECTS float masa_to_total_energy_ratio[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; /* TODO Nokia: This should be moved to some other place and reserved only when needed. */ #endif + } IVAS_QMETADATA, *IVAS_QMETADATA_HANDLE; diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 8a1d2e93e1..daf7056f7b 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -83,6 +83,7 @@ ivas_error ivas_cpe_dec( int32_t element_brate_ref; #endif #endif + error = IVAS_ERR_OK; push_wmops( "ivas_cpe_dec" ); diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 4cb89aec42..6fb6cbc2cd 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -71,10 +71,10 @@ ivas_error ivas_dec( float pan_left, pan_right; ivas_error error; float *p_output[MAX_OUTPUT_CHANNELS]; - #ifdef MASA_AND_OBJECTS int32_t ism_total_brate; #endif + error = IVAS_ERR_OK; push_wmops( "ivas_dec" ); diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 1b76add66a..7197186a0b 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -784,7 +784,7 @@ ivas_error ivas_dirac_dec_config( } #ifdef MASA_AND_OBJECTS - if ( ( error = vbap_init_data( &( st_ivas->hVBAPdata ), ls_azimuth, ls_elevation, nchan_out_woLFE, st_ivas->ivas_format == MASA_ISM_FORMAT ? 1 : 0 ) ) != IVAS_ERR_OK ) + if ( ( error = vbap_init_data( &( st_ivas->hVBAPdata ), ls_azimuth, ls_elevation, nchan_out_woLFE, st_ivas->ivas_format ) ) != IVAS_ERR_OK ) { return error; } diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index 1c74fec901..97bbbab852 100644 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -623,121 +623,119 @@ void ivas_dirac_dec_output_synthesis_process_slot( h_dirac_output_synthesis_state->diffuse_power_factor ); } } - else // ( hDirAC->hConfig->dec_param_estim == TRUE ) - if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { - - /* compute direct responses */ - ivas_dirac_dec_compute_directional_responses( hDirAC, - hVBAPdata, - NULL, + else if ( hDirAC->hConfig->dec_param_estim == TRUE ) + { + /* compute direct responses */ + ivas_dirac_dec_compute_directional_responses( hDirAC, + hVBAPdata, + NULL, #ifdef MASA_AND_OBJECTS - NULL, + NULL, #endif - azimuth, - elevation, - md_idx, - NULL, - sh_rot_max_order, - p_Rmat, - hodirac_flag ); - - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) - { - ivas_dirac_dec_compute_gain_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + azimuth, + elevation, + md_idx, + NULL, + sh_rot_max_order, + p_Rmat, + hodirac_flag ); + if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) + { + ivas_dirac_dec_compute_gain_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); - v_multc( h_dirac_output_synthesis_state->direct_power_factor, - 0.25f, - h_dirac_output_synthesis_state->direct_power_factor, - num_freq_bands ); - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - 0.25f, - h_dirac_output_synthesis_state->diffuse_power_factor, - num_freq_bands ); - /*Direct gain*/ - for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + v_multc( h_dirac_output_synthesis_state->direct_power_factor, + 0.25f, + h_dirac_output_synthesis_state->direct_power_factor, + num_freq_bands ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + 0.25f, + h_dirac_output_synthesis_state->diffuse_power_factor, + num_freq_bands ); + + /*Direct gain*/ + for ( ch_idx = 0; ch_idx < min( 4, nchan_transport ); ch_idx++ ) + { + int16_t k; + if ( ch_idx != 0 ) { - int16_t k; - if ( ch_idx != 0 ) - { - float a, b, c; + float a, b, c; - /*Directonal sound gain nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; - b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); - c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); - } + /*Directonal sound gain nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); } - else + for ( ; k < num_freq_bands; k++ ) { - /*Diffuseness modellling nrg compensation*/ - for ( k = 0; k < num_freq_bands_diff; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); - } - for ( ; k < num_freq_bands; k++ ) - { - h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); - } + a = h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands + k]; + b = reference_power[k + num_freq_bands] / ( reference_power[k + ( ch_idx + 1 ) * num_freq_bands] + EPSILON ); + c = 1.f + ( 1.f / 6.f ) * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ); /*Diffuseness modellling nrg compensation*/ + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( diffuseness[k] * c + ( ( 1.f - diffuseness[k] ) * a * a * b ) ); } } - - /*Directional gain (panning)*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) - { - v_mult( h_dirac_output_synthesis_state->direct_power_factor, - &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], - aux_buf, - num_freq_bands ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], - num_freq_bands ); - } - - /*Diffuse gain*/ - for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) + else { - v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, - hDirAC->diffuse_response_function[ch_idx], - aux_buf, - num_freq_bands_diff ); - - v_add( aux_buf, - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], - num_freq_bands_diff ); + /*Diffuseness modellling nrg compensation*/ + for ( k = 0; k < num_freq_bands_diff; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor_decorr - 1.f ) ); + } + for ( ; k < num_freq_bands; k++ ) + { + h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands + k] += 0.25f * sqrtf( 1.0f + diffuseness[k] * 0.5f * ( h_dirac_output_synthesis_params->diffuse_compensation_factor - 1.f ) ); + } } + } - return; + /*Directional gain (panning)*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_dir; ch_idx++ ) + { + v_mult( h_dirac_output_synthesis_state->direct_power_factor, + &h_dirac_output_synthesis_state->direct_responses[ch_idx * num_freq_bands], + aux_buf, + num_freq_bands ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + &h_dirac_output_synthesis_state->cy_cross_dir_smooth[ch_idx * num_freq_bands], + num_freq_bands ); } - else + + /*Diffuse gain*/ + for ( ch_idx = min( 4, nchan_transport ); ch_idx < num_channels_diff; ch_idx++ ) { - /* compute reference and diffuse power factor for this frame */ - ivas_dirac_dec_compute_power_factors( num_freq_bands, - diffuseness, - h_dirac_output_synthesis_params->max_band_decorr, - h_dirac_output_synthesis_state->direct_power_factor, - h_dirac_output_synthesis_state->diffuse_power_factor ); + v_multc( h_dirac_output_synthesis_state->diffuse_power_factor, + hDirAC->diffuse_response_function[ch_idx], + aux_buf, + num_freq_bands_diff ); + + v_add( aux_buf, + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + &h_dirac_output_synthesis_state->cy_auto_diff_smooth[ch_idx * num_freq_bands_diff], + num_freq_bands_diff ); } + + return; + } + else + { + /* compute reference and diffuse power factor for this frame */ + ivas_dirac_dec_compute_power_factors( num_freq_bands, + diffuseness, + h_dirac_output_synthesis_params->max_band_decorr, + h_dirac_output_synthesis_state->direct_power_factor, + h_dirac_output_synthesis_state->diffuse_power_factor ); } + } diff_start_band = 0; if ( h_dirac_output_synthesis_params->use_onset_filters ) @@ -1874,6 +1872,7 @@ void ivas_dirac_dec_compute_directional_responses( { /* Synthesize the first direction */ spreadCoherencePanningHoa( azimuth[k], elevation[k], hDirAC->spreadCoherence[md_idx][k], direct_response_hoa, num_channels_dir, hDirAC->hOutSetup.ambisonics_order ); + /* Synthesize the second direction and combine the gains */ #ifdef MASA_AND_OBJECTS if ( hDirAC->numParametricDirections == 2 ) @@ -2010,6 +2009,7 @@ void ivas_dirac_dec_compute_directional_responses( } normalizePanningGains( direct_response_ls, num_channels_dir ); } + #ifdef MASA_AND_OBJECTS // Todo OMASA JBM: Here we also probably need md_idx if ( hDirAC->numIsmDirections > 0 ) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 5d4b7812c0..f4f741bb8c 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -436,14 +436,13 @@ static ivas_error ivas_read_format( case 3: if ( st_ivas->bit_stream[*num_bits_read] ) { - ( *num_bits_read )++; st_ivas->ivas_format = MASA_FORMAT; } else { - ( *num_bits_read )++; st_ivas->ivas_format = SBA_FORMAT; } + ( *num_bits_read )++; break; } @@ -1009,7 +1008,7 @@ ivas_error ivas_init_decoder( } } - for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) // VE: TBV - is this loop needed? + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { if ( ( error = create_sce_dec( st_ivas, sce_id, ivas_total_brate / st_ivas->nchan_transport ) ) != IVAS_ERR_OK ) { @@ -1237,7 +1236,7 @@ ivas_error ivas_init_decoder( return error; } - for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) // VE: TBV - is this loop needed? + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { if ( ( error = create_cpe_dec( st_ivas, cpe_id, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK ) { @@ -1304,7 +1303,7 @@ ivas_error ivas_init_decoder( ivas_mcmasa_split_brate( st_ivas->hOutSetup.separateChannelEnabled, ivas_total_brate, st_ivas->nSCE, st_ivas->nCPE, &brate_sce, &brate_cpe ); - for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) // VE: TBV - is this loop needed? + for ( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) { if ( ( error = create_sce_dec( st_ivas, sce_id, brate_sce ) ) != IVAS_ERR_OK ) { @@ -1314,7 +1313,7 @@ ivas_error ivas_init_decoder( reset_indices_dec( st_ivas->hSCE[sce_id]->hCoreCoder[0] ); } - for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) // VE: TBV - is this loop needed? + for ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) { st_ivas->element_mode_init = IVAS_CPE_MDCT; /* element_mode_init was IVAS_SCE for SCE initialization */ diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 6b8a947402..1251cecac3 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -309,6 +309,7 @@ ivas_error ivas_masa_decode( /* Remove already read bits from the bit budget */ hQMetaData->metadata_max_bits -= *nb_bits_read; + #ifdef MASA_AND_OBJECTS if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { @@ -351,6 +352,7 @@ ivas_error ivas_masa_decode( { total_brate = calculate_cpe_brate_MASA_ISM( st_ivas->ism_mode, ivas_total_brate, st_ivas->nchan_ism ); } + if ( total_brate >= IVAS_384k ) { if ( total_brate >= IVAS_512k ) diff --git a/lib_dec/ivas_mono_dmx_renderer.c b/lib_dec/ivas_mono_dmx_renderer.c index 4e16edca30..61d8c68094 100644 --- a/lib_dec/ivas_mono_dmx_renderer.c +++ b/lib_dec/ivas_mono_dmx_renderer.c @@ -94,6 +94,7 @@ void ivas_mono_downmix_render_passive( MONO_DOWNMIX_RENDERER_HANDLE hDownmix; numInputChannels = st_ivas->nSCE; + #ifdef MASA_AND_OBJECTS if ( st_ivas->ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_dec/ivas_omasa_dec.c b/lib_dec/ivas_omasa_dec.c index a198c6a774..40d505d5fc 100644 --- a/lib_dec/ivas_omasa_dec.c +++ b/lib_dec/ivas_omasa_dec.c @@ -183,6 +183,7 @@ ivas_error ivas_omasa_dec_config( /*-----------------------------------------------------------------* * Renderer selection *-----------------------------------------------------------------*/ + old_renderer_type = st_ivas->renderer_type; #endif @@ -296,6 +297,7 @@ ivas_error ivas_omasa_dec_config( /*-----------------------------------------------------------------* * Renderer selection *-----------------------------------------------------------------*/ + ivas_renderer_select( st_ivas ); /*-------------------------------------------------------------------* diff --git a/lib_dec/ivas_vbap.c b/lib_dec/ivas_vbap.c index e45d525fc3..dcc73907e2 100644 --- a/lib_dec/ivas_vbap.c +++ b/lib_dec/ivas_vbap.c @@ -163,7 +163,7 @@ ivas_error vbap_init_data( const int16_t num_speaker_nodes /* i : number of speaker nodes in the set */ #ifdef MASA_AND_OBJECTS , - const int16_t support_object_mode /* i : init VBAP also for object panning mode */ + const IVAS_FORMAT ivas_format /* i : IVAS format */ #endif ) { @@ -242,14 +242,16 @@ ivas_error vbap_init_data( } set_zero( vbap->bottom_virtual_speaker_node_division_gains, num_speaker_nodes ); is_success &= vbap->bottom_virtual_speaker_node_division_gains != NULL; + #ifdef MASA_AND_OBJECTS - if ( support_object_mode ) + if ( ivas_format == MASA_ISM_FORMAT ) { vbap->object_mode_bottom_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ); set_zero( vbap->object_mode_bottom_virtual_speaker_node_division_gains, num_speaker_nodes ); is_success &= vbap->object_mode_bottom_virtual_speaker_node_division_gains != NULL; } #endif + speaker_node_azi_deg_internal[vbap->bottom_virtual_speaker_node_index] = 0.0f; speaker_node_ele_deg_internal[vbap->bottom_virtual_speaker_node_index] = -90.0f; } @@ -262,14 +264,16 @@ ivas_error vbap_init_data( } set_zero( vbap->top_virtual_speaker_node_division_gains, num_speaker_nodes ); is_success &= vbap->top_virtual_speaker_node_division_gains != NULL; + #ifdef MASA_AND_OBJECTS - if ( support_object_mode ) + if ( ivas_format == MASA_ISM_FORMAT ) { vbap->object_mode_top_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ); set_zero( vbap->object_mode_top_virtual_speaker_node_division_gains, num_speaker_nodes ); is_success &= vbap->object_mode_top_virtual_speaker_node_division_gains != NULL; } #endif + speaker_node_azi_deg_internal[vbap->top_virtual_speaker_node_index] = 0.0f; speaker_node_ele_deg_internal[vbap->top_virtual_speaker_node_index] = 90.0f; } @@ -283,7 +287,7 @@ ivas_error vbap_init_data( set_zero( vbap->back_virtual_speaker_node_division_gains, num_speaker_nodes ); is_success &= vbap->back_virtual_speaker_node_division_gains != NULL; #ifdef MASA_AND_OBJECTS - if ( support_object_mode ) + if ( ivas_format == MASA_ISM_FORMAT ) { vbap->object_mode_back_virtual_speaker_node_division_gains = (float *) malloc( num_speaker_nodes * sizeof( float ) ); set_zero( vbap->object_mode_back_virtual_speaker_node_division_gains, num_speaker_nodes ); @@ -383,7 +387,7 @@ ivas_error vbap_init_data( determine_virtual_speaker_node_division_gains( vbap->top_virtual_speaker_node_index, vbap->top_virtual_speaker_node_division_gains, connections, virtual_top_type, max_num_connections, num_speaker_nodes, 0 ); determine_virtual_speaker_node_division_gains( vbap->bottom_virtual_speaker_node_index, vbap->bottom_virtual_speaker_node_division_gains, connections, virtual_bottom_type, max_num_connections, num_speaker_nodes, 0 ); determine_virtual_speaker_node_division_gains( vbap->back_virtual_speaker_node_index, vbap->back_virtual_speaker_node_division_gains, connections, virtual_back_type, max_num_connections, num_speaker_nodes, 0 ); - if ( support_object_mode ) + if ( ivas_format == MASA_ISM_FORMAT ) { determine_virtual_speaker_node_division_gains( vbap->top_virtual_speaker_node_index, vbap->object_mode_top_virtual_speaker_node_division_gains, connections, virtual_top_type == NO_VIRTUAL_SPEAKER_NODE ? NO_VIRTUAL_SPEAKER_NODE : VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY, max_num_connections, num_speaker_nodes, 1 ); determine_virtual_speaker_node_division_gains( vbap->bottom_virtual_speaker_node_index, vbap->object_mode_bottom_virtual_speaker_node_division_gains, connections, virtual_bottom_type == NO_VIRTUAL_SPEAKER_NODE ? NO_VIRTUAL_SPEAKER_NODE : VIRTUAL_SPEAKER_NODE_DISTRIBUTE_ENERGY, max_num_connections, num_speaker_nodes, 1 ); diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index f573b4ac6e..f099d448f4 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -327,7 +327,6 @@ ivas_error ivas_cpe_enc( } else { - #endif stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); #ifdef MASA_AND_OBJECTS diff --git a/lib_enc/ivas_decision_matrix_enc.c b/lib_enc/ivas_decision_matrix_enc.c index 115a7eecde..2db13f8ecf 100644 --- a/lib_enc/ivas_decision_matrix_enc.c +++ b/lib_enc/ivas_decision_matrix_enc.c @@ -424,6 +424,7 @@ void ivas_signaling_enc( /*-------------------------------------------------------------------------- * Write element mode info *--------------------------------------------------------------------------*/ + #ifdef MASA_AND_OBJECTS if ( ( st->element_mode == IVAS_CPE_DFT || st->element_mode == IVAS_CPE_TD ) && !MCT_flag ) /* note: in MCT, the MDCT stereo is used exclusively */ #else diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 734a0cbd14..fcceeca57d 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -341,11 +341,7 @@ ivas_error ivas_ism_metadata_enc( } /* write ISM metadata flag (one per object) */ -#ifdef MASA_AND_OBJECTS - for ( ch = 0; ch < nchan_transport; ch++ ) -#else for ( ch = 0; ch < nchan_transport; ch++ ) -#endif { #ifdef MASA_AND_OBJECTS if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 60e80bbfb3..4c1fd0644a 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -50,7 +50,6 @@ static void combine_freqbands_and_subframes( MASA_ENCODER_HANDLE hMasa ); #ifndef MASA_AND_OBJECTS static void combine_directions( MASA_ENCODER_HANDLE hMasa ); #endif - static void find_n_largest( const float *input, int16_t *largestIndices, const int16_t numElements, const int16_t numLargest ); static void move_metadata_to_qmetadata( const MASA_ENCODER_HANDLE hMasa, IVAS_QMETADATA_HANDLE hQMeta ); @@ -140,6 +139,7 @@ ivas_error ivas_masa_enc_open( return error; } } + #ifdef MASA_AND_OBJECTS ism_total_brate = 0; if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT && st_ivas->nSCE > 0 && ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) ) @@ -150,6 +150,7 @@ ivas_error ivas_masa_enc_open( } } #endif + ivas_masa_set_elements( st_ivas->hEncoderConfig->ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, st_ivas->hQMetaData, &hEncoderConfig->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE #ifdef MASA_AND_OBJECTS @@ -248,7 +249,7 @@ ivas_error ivas_masa_encode( const int16_t ism_imp /* i : importance of separated object */ #ifdef OMASA_ENERGIES , - int16_t flag_omasa_brate /* i: flag for using less bitrate for objects in OMASA */ + const int16_t flag_omasa_brate /* i : flag for using less bitrate for objects in OMASA */ #endif #endif ) @@ -256,7 +257,6 @@ ivas_error ivas_masa_encode( MASA_DIRECTIONAL_SPATIAL_META *h_orig_metadata; int16_t i, j; int16_t masa_sid_descriptor; - #ifdef MASA_AND_OBJECTS int16_t low_bitrate_mode; #endif @@ -265,6 +265,7 @@ ivas_error ivas_masa_encode( h_orig_metadata = NULL; #ifdef MASA_AND_OBJECTS low_bitrate_mode = 0; + if ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) #else if ( ivas_format == MASA_FORMAT ) @@ -317,6 +318,7 @@ ivas_error ivas_masa_encode( /* Combine frequency bands and sub-frames */ combine_freqbands_and_subframes( hMasa ); } + #ifdef MASA_AND_OBJECTS if ( hMasa->config.numberOfDirections == 2 && hMasa->config.numTwoDirBands < hMasa->config.numCodingBands && ( ivas_format == MASA_FORMAT || ivas_format == MASA_ISM_FORMAT ) ) #else @@ -333,6 +335,7 @@ ivas_error ivas_masa_encode( /* Combine directions */ combine_directions( hMasa ); #endif + /* If we joined all bands, then metadata is now one directional. */ if ( hMasa->config.numTwoDirBands == 0 ) { @@ -350,7 +353,6 @@ ivas_error ivas_masa_encode( if ( ivas_format == MASA_FORMAT ) #endif { - #ifndef MASA_AND_OBJECTS /* write the number of MASA transport channels */ push_next_indice( hMetaData, nchan_transport - 1, MASA_TRANSP_BITS ); @@ -458,6 +460,7 @@ ivas_error ivas_masa_encode( #else reduce_metadata_further( hMasa, hQMetaData, ivas_format ); #endif + /* Write low bitrate mode. 1 signals that we have merged through time, 0 signals merge through frequency. */ push_next_indice( hMetaData, hQMetaData->q_direction[0].cfg.nblocks == 1 ? 1 : 0, MASA_LOWBITRATE_MODE_BITS ); hQMetaData->metadata_max_bits -= MASA_LOWBITRATE_MODE_BITS; @@ -476,6 +479,7 @@ ivas_error ivas_masa_encode( hQMetaData->masa_to_total_energy_ratio[0][0] = -1; /* signals NOT to adjust the energy ratios */ } #endif + /* Encode metadata */ #ifdef MASA_AND_OBJECTS int32_t total_brate; @@ -484,6 +488,7 @@ ivas_error ivas_masa_encode( { total_brate = calculate_cpe_brate_MASA_ISM( ism_mode, ivas_total_brate, nchan_ism ); } + if ( total_brate >= IVAS_384k ) { if ( total_brate >= IVAS_512k ) @@ -559,6 +564,7 @@ ivas_error ivas_masa_encode( #else combine_directions( hMasa ); #endif + /* If we joined all bands, then metadata is now one directional. */ if ( hMasa->config.numTwoDirBands == 0 ) { diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 6af86d0098..628bbe6cb5 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -144,6 +144,7 @@ static int16_t find_optimal_GR_order( const int16_t *q_idx, const int16_t len, i static int16_t find_optimal_GR_orders( const int16_t *q_idx, const int16_t len, const int16_t len_max_GR1, int16_t *GR1, int16_t *GR2, int16_t *i_min ); #endif + /*-----------------------------------------------------------------------* * ivas_qmetadata_enc_encode() * @@ -3102,6 +3103,7 @@ static int16_t ivas_qmetadata_get_optimal_gr_param( * * *------------------------------------------------------------------------*/ + #ifndef MASA_AND_OBJECTS static #endif @@ -3248,6 +3250,7 @@ static int16_t ivas_qmetadata_reorder_azimuth_index( * * *------------------------------------------------------------------------*/ + #ifndef MASA_AND_OBJECTS static #endif diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 1b2542e757..4f3a1eb162 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1221,7 +1221,7 @@ typedef struct MC_PARAMUPMIX_ENC_HANDLE hMCParamUpmix; /* MC Param-Upmix handle */ MCMASA_ENC_HANDLE hMcMasa; /* Multi-channel MASA data handle */ #ifdef MASA_AND_OBJECTS - OMASA_ENC_HANDLE hOMasa; /* Object MASA data handle */ + OMASA_ENC_HANDLE hOMasa; /* Object-MASA data handle */ #endif LFE_ENC_HANDLE hLFE; /* LFE data handle */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 39d9f658cc..f47467aba8 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -383,6 +383,7 @@ ivas_error IVAS_ENC_ConfigureForStereo( return error; } + #ifdef MASA_AND_OBJECTS /*---------------------------------------------------------------------* * IVAS_ENC_ConfigureForMASAObjects() @@ -439,6 +440,7 @@ ivas_error IVAS_ENC_ConfigureForMASAObjects( } #endif + /*---------------------------------------------------------------------* * IVAS_ENC_ConfigureForObjects() * @@ -504,6 +506,7 @@ ivas_error IVAS_ENC_FeedObjectMetadata( { return IVAS_ERR_NOT_CONFIGURED; } + #ifdef MASA_AND_OBJECTS if ( hIvasEnc->st_ivas->hEncoderConfig->ivas_format != ISM_FORMAT && hIvasEnc->st_ivas->hEncoderConfig->ivas_format != MASA_ISM_FORMAT ) #else @@ -664,6 +667,7 @@ ivas_error IVAS_ENC_FeedMasaMetadata( { return IVAS_ERR_NOT_CONFIGURED; } + #ifdef MASA_AND_OBJECTS if ( hIvasEnc->st_ivas->hEncoderConfig->ivas_format != MASA_FORMAT && hIvasEnc->st_ivas->hEncoderConfig->ivas_format != MASA_ISM_FORMAT ) #else @@ -758,6 +762,7 @@ static ivas_error configureEncoder( #ifdef MASA_AND_OBJECTS int32_t cpe_brate; #endif + error = IVAS_ERR_OK; st_ivas = hIvasEnc->st_ivas; @@ -898,7 +903,6 @@ static ivas_error configureEncoder( } } } - #ifdef MASA_AND_OBJECTS else if ( hEncoderConfig->ivas_format == MASA_ISM_FORMAT ) { diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index f2fe66d886..2c916691d0 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -1067,6 +1067,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric spreadCoh = 0.0f; } #endif + diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ #ifdef MASA_AND_OBJECTS @@ -1254,6 +1255,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ diffEne *= ( 1.0f - surCoh ) + surCoh * surCohEne[idx]; #endif + #ifdef MASA_AND_OBJECTS /* Modify also the value for decorrelation reduction */ diffEneValForDecorrelationReduction *= spectrumModVal; diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index f9831d4ce5..82a08ef9d5 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -191,6 +191,7 @@ ivas_error ivas_td_binaural_open_unwrap( TDREND_MIX_SRC_SetDirAtten( pBinRendTd, nS, DirAtten_p ); } } + #ifdef MASA_AND_OBJECTS if ( ivas_format == ISM_FORMAT || ivas_format == MASA_ISM_FORMAT ) #else -- GitLab From 25903e4a4e1252a169c3e10218f9e6fbf4bd78ca Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 13 Jun 2023 16:14:04 +0200 Subject: [PATCH 340/381] fix build warning --- lib_rend/lib_rend.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 3ceb66f2c5..f57f06b887 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5125,13 +5125,6 @@ static ivas_error renderIsmToBinauralReverb( float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; ivas_error error; - float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; - - for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) - { - p_tmpRendBuffer[i] = tmpRendBuffer[i]; - } - push_wmops( "renderIsmToBinauralRoom" ); copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); -- GitLab From c2e627b35c7f9f39e3e93a6ea306b194f149aaf9 Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 13 Jun 2023 16:34:35 +0200 Subject: [PATCH 341/381] fix ext renderer failures --- lib_rend/lib_rend.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index f57f06b887..3d841fef0e 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -5121,7 +5121,6 @@ static ivas_error renderIsmToBinauralReverb( input_ism *ismInput, IVAS_REND_AudioBuffer outAudio ) { - int16_t i; float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k]; ivas_error error; @@ -5444,6 +5443,13 @@ static ivas_error renderMcToBinaural( #else int8_t headRotEnabled; #endif + float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; + int16_t i; + + for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) + { + p_tmpRendBuffer[i] = tmpRendBuffer[i]; + } push_wmops( "renderMcToBinaural" ); @@ -5522,7 +5528,7 @@ static ivas_error renderMcToBinaural( /* call CREND */ if ( ( error = ivas_rend_crendProcess( mcInput->crendWrapper, getIvasAudioConfigFromRendAudioConfig( mcInput->base.inConfig ), getIvasAudioConfigFromRendAudioConfig( outConfig ), - NULL, NULL, NULL, NULL, NULL /* ToDo: TBV */, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *mcInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) { return error; } -- GitLab From 3968cd2f16018f7aa77ea482a58ca96760c164b0 Mon Sep 17 00:00:00 2001 From: gaoyuy Date: Wed, 14 Jun 2023 17:50:31 +0800 Subject: [PATCH 342/381] Update old issue_69_DISABLE_ADAP_RES_COD_TMP branch to the latest main branch --- lib_com/options.h | 3 ++- lib_enc/ivas_stat_enc.h | 3 +++ lib_enc/ivas_stereo_dft_enc.c | 43 +++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index aafa43e9af..30d990a43e 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -143,7 +143,8 @@ #define BITSTREAM_INDICES_MEMORY /* Don't count memory for bitstream Indice at the encoder - it is a temporary solution for development only */ #endif -#define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ +/*#define DISABLE_ADAP_RES_COD_TMP*/ /* temporary fix for IVAS-403, disables adaptive residual coding */ +#define ADAP_OPT /* Issue 69: optimized the adap algorithm */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 4f2f375af7..1c69b93cf7 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -256,6 +256,9 @@ typedef struct stereo_dft_enc_data_struct float res_cod_NRG_S[STEREO_DFT_BAND_MAX]; float res_cod_SNR_M[STEREO_DFT_BAND_MAX]; float old_snr; +#ifdef ADAP_OPT + int16_t first_frm_flag; /* ADAP first frame flag */ +#endif /* flags and data for adaptive wideband residual coding */ float res_dmx_ratio_lt; /* long term energy ratio between RES and DMX */ diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index f628373ab7..df42777584 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -508,6 +508,10 @@ void stereo_dft_enc_reset( hStereoDft->hItd->prev_itd1 = 0; hStereoDft->hItd->prev_itd2 = 0; +#ifdef ADAP_OPT + hStereoDft->first_frm_flag = 1; +#endif + #ifdef DEBUG_MODE_DFT hStereoDft->verbose = 1; #endif @@ -1648,7 +1652,11 @@ void stereo_dft_enc_process( { stereo_dft_enc_get_res_cod_mode_flag( hStereoDft, res_nrg_all_curr, dmx_nrg_all_curr, &res_dmx_ratio, &frame_nrg_ratio ); +#ifdef ADAP_OPT + if ( hStereoDft->res_cod_sw_flag ) +#else if ( hStereoDft->res_cod_mode[k_offset] == STEREO_DFT_RES_COD_OFF || hStereoDft->res_cod_sw_flag ) +#endif { int16_t res_cod_band_max; @@ -1749,6 +1757,16 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } /* Calculate long term energy ratio between residual signal and downmix signal */ +#ifdef ADAP_OPT + if ( fast_update_flag ) + { + hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.2f + hStereoDft->res_dmx_ratio_lt * 0.8f; + } + else + { + hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.05f + hStereoDft->res_dmx_ratio_lt * 0.95f; + } +#else if ( fast_update_flag ) { hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.5f + hStereoDft->res_dmx_ratio_lt * 0.5f; @@ -1757,9 +1775,14 @@ static void stereo_dft_enc_get_res_cod_mode_flag( { hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.1f + hStereoDft->res_dmx_ratio_lt * 0.9f; } +#endif /*Get the residual signal coding initial flag */ +#ifdef ADAP_OPT + if ( hStereoDft->res_dmx_ratio_lt > 0.01f ) +#else if ( hStereoDft->res_dmx_ratio_lt > 0.075f ) +#endif { res_cod_mode_flag = 1; } @@ -1769,12 +1792,28 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } /* Get the residual signal coding flag */ +#ifdef ADAP_OPT + if ( hStereoDft->first_frm_flag ) + { + prev_res_cod_mode_flag = res_cod_mode_flag; + hStereoDft->first_frm_flag = 0; + } + else + { + prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1]; + } +#else prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1]; +#endif if ( res_cod_mode_flag != prev_res_cod_mode_flag ) { if ( prev_res_cod_mode_flag == 1 ) { +#ifdef ADAP_OPT + if ( hStereoDft->hangover_cnt0 < 5 && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 ) +#else if ( hStereoDft->hangover_cnt0 < 3 && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 ) +#endif { res_cod_mode_flag = prev_res_cod_mode_flag; hStereoDft->hangover_cnt0++; @@ -1794,7 +1833,11 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } else { +#ifdef ADAP_OPT + if ( hStereoDft->hangover_cnt1 < 5 ) +#else if ( hStereoDft->hangover_cnt1 < 3 ) +#endif { res_cod_mode_flag = prev_res_cod_mode_flag; hStereoDft->hangover_cnt1++; -- GitLab From 0cd3e43fbf024f1f3d757c40b84da80db813558d Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 14 Jun 2023 15:38:07 +0200 Subject: [PATCH 343/381] fix crash for 2ISM at 64 kbps due to too high bitrate in the low-rate mode --- lib_dec/ivas_ism_metadata_dec.c | 2 +- lib_enc/ivas_ism_metadata_enc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 0f54c699d6..30f6c7442c 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -542,7 +542,7 @@ ivas_error ivas_ism_metadata_dec( if ( ism_mode == ISM_MODE_DISC ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( ism_imp[ch] == ISM_NO_META ) + if ( ism_imp[ch] == ISM_NO_META && total_brate[ch] < ACELP_8k00 ) #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && localVAD[ch] == 0 && ism_metadata_flag_global ) #endif diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 518ba3353a..27a4a3b0cb 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -636,7 +636,7 @@ ivas_error ivas_ism_metadata_enc( if ( ism_mode == ISM_MODE_DISC ) { #ifdef FIX_532_ISM_MD_INACTIVE - if ( ism_imp[ch] == ISM_NO_META ) + if ( ism_imp[ch] == ISM_NO_META && total_brate[ch] < ACELP_8k00 ) #else if ( hIsmMeta[ch]->ism_metadata_flag == 0 && vad_flag[ch] == 0 && ism_metadata_flag_global ) #endif -- GitLab From 57f30a596e16da1dbf533fd751e4ba244922391d Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 14 Jun 2023 16:01:18 +0200 Subject: [PATCH 344/381] MASA_AND_OBJECTS fix within ISM_25k6_HZ_CORE --- lib_dec/ivas_sce_dec.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 19c655c87a..9024e91e73 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -380,7 +380,11 @@ ivas_error create_sce_dec( st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; #ifdef ISM_25k6_HZ_CORE st->is_ism_format = 0; +#ifdef MASA_AND_OBJECTS + if ( st_ivas->ivas_format == ISM_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) +#else if ( st_ivas->ivas_format == ISM_FORMAT ) +#endif { st->is_ism_format = 1; } -- GitLab From e34d084b994b20a7ac953838cad212f56a7f9d5b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:11:15 +0200 Subject: [PATCH 345/381] [cleanup] accept USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 --- lib_com/options.h | 1 - lib_rend/ivas_rom_binaural_crend_head.c | 2 -- lib_rend/ivas_rom_binaural_crend_head.h | 2 -- 3 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 1f39c1eaed..8be2c35113 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -146,7 +146,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ #define UPDATE_SBA_FILTER /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 16289a832e..7717703666 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -55,7 +55,6 @@ #define WMC_TOOL_SKIP -#ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 /********************** CRendBin_Combined_HRIR **********************/ @@ -653,7 +652,6 @@ const float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ #ifndef UPDATE_SBA_FILTER diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 8f0823dc7b..9631d04ec6 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -51,7 +51,6 @@ #endif #include "ivas_cnst.h" -#ifdef USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 /********************** CRendBin_Combined_HRIR **********************/ @@ -99,7 +98,6 @@ extern float CRendBin_Combined_HRIR_coeff_re_16kHz[15][BINAURAL_CHANNELS][80]; extern float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* USE_HRIR_128_METH5_IRC_53_Q10_SYML_ITRP1_48000 */ #ifndef UPDATE_SBA_FILTER -- GitLab From 9050e697cd2298f483123621720f7c50754729c9 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:13:54 +0200 Subject: [PATCH 346/381] [cleanup] accept UPDATE_SBA_FILTER --- apps/decoder.c | 24 - lib_com/ivas_cnst.h | 8 - lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal.c | 39 - lib_rend/ivas_crend.c | 126 - lib_rend/ivas_hrtf.c | 2 - lib_rend/ivas_rom_binauralRenderer.c | 3626 ----------------- lib_rend/ivas_rom_binauralRenderer.h | 4 - lib_rend/ivas_rom_binaural_crend_head.c | 987 ----- lib_rend/ivas_rom_binaural_crend_head.h | 59 - lib_rend/ivas_stat_rend.h | 18 - lib_util/hrtf_file_reader.c | 24 - .../generate_tables_from_rom_to_bin.c | 30 - .../generate_crend_ivas_tables_from_sofa.c | 6 - 14 files changed, 4954 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index b936bc7780..ee21051d97 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -657,11 +657,7 @@ int main( if ( arg.hrtfReaderEnabled ) { -#ifdef UPDATE_SBA_FILTER IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; -#else - IVAS_DEC_HRTF_HANDLE hHrtfTD; -#endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); @@ -672,11 +668,7 @@ int main( } -#ifdef UPDATE_SBA_FILTER IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; -#else - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; -#endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); if ( ( error = create_SetOfHRTF_from_binary( hSetOfHRTF, hrtfReader, arg.output_Fs ) ) != IVAS_ERR_OK ) @@ -684,22 +676,14 @@ int main( fprintf( stderr, "\nError in loading HRTF binary file %s for CRend \n\n", arg.hrtfCRendFileName ); goto cleanup; } -#ifdef UPDATE_SBA_FILTER IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv = NULL; -#else - IVAS_DEC_HRTF_FASTCONV_HANDLE hHrtfFastConv; -#endif IVAS_DEC_GetHrtfFastConvHandle( hIvasDec, &hHrtfFastConv ); if ( ( error = load_fastconv_HRTF_from_binary( hHrtfFastConv, hrtfReader ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError in loading HRTF binary file %s for FastConv \n\n", arg.hrtfCRendFileName ); } -#ifdef UPDATE_SBA_FILTER IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin = NULL; -#else - IVAS_DEC_HRTF_PARAMBIN_HANDLE hHrtfParambin; -#endif IVAS_DEC_GetHrtfParamBinHandle( hIvasDec, &hHrtfParambin ); if ( ( error = load_parambin_HRTF_from_binary( hHrtfParambin, hrtfReader ) ) != IVAS_ERR_OK ) @@ -777,18 +761,10 @@ cleanup: if ( arg.hrtfReaderEnabled ) { -#ifdef UPDATE_SBA_FILTER IVAS_DEC_HRTF_HANDLE hHrtfTD = NULL; -#else - IVAS_DEC_HRTF_HANDLE hHrtfTD; -#endif IVAS_DEC_GetHrtfHandle( hIvasDec, &hHrtfTD ); dealloc_HRTF_binary( hHrtfTD ); -#ifdef UPDATE_SBA_FILTER IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF = NULL; -#else - IVAS_DEC_HRTF_CREND_HANDLE hSetOfHRTF; -#endif IVAS_DEC_GetHrtfCRendHandle( hIvasDec, &hSetOfHRTF ); destroy_SetOfHRTF( hSetOfHRTF ); } diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 30a47b3eed..89f0dd2b11 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1507,11 +1507,7 @@ typedef enum #define BINAURAL_MAXBANDS 60 /* Max number of bands */ #define BINAURAL_CONVBANDS 50 /* Bands upto which convolution is performed */ -#ifdef UPDATE_SBA_FILTER #define BINAURAL_NTAPS 5 -#else -#define BINAURAL_NTAPS 7 -#endif #define BINAURAL_NTAPS_MAX 96 #define HRTF_SH_ORDER 3 @@ -1529,13 +1525,9 @@ typedef enum { BINAURAL_INPUT_AUDIO_CONFIG_INVALID, BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, /* 5_1, 5_1_2, 5_1_4, 7_1, 7_1_4 */ -#ifdef UPDATE_SBA_FILTER BINAURAL_INPUT_AUDIO_CONFIG_HOA3, /* HOA3 */ BINAURAL_INPUT_AUDIO_CONFIG_HOA2, /* HOA2 */ BINAURAL_INPUT_AUDIO_CONFIG_FOA, /* FOA */ -#else - BINAURAL_INPUT_AUDIO_CONFIG_HOA, /* FOA, HOA2, HOA3 */ -#endif BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED /* Not used */ } BINAURAL_INPUT_AUDIO_CONFIG; diff --git a/lib_com/options.h b/lib_com/options.h index 8be2c35113..4e8b9ff25f 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -146,7 +146,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define UPDATE_SBA_FILTER /* Dolby (Orange, FhG) : Contribution 36 - SBA HRIR update */ /*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index a090d1dc91..84604ee503 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -146,11 +146,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( if ( !isLoudspeaker ) { -#ifdef UPDATE_SBA_FILTER hBinRenderer->nInChannels = audioCfg2channels( input_config ); -#else - hBinRenderer->nInChannels = 16; -#endif } else { @@ -191,11 +187,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else { -#ifdef UPDATE_SBA_FILTER hBinRenConvModule->numTaps = BINAURAL_NTAPS; -#else - hBinRenConvModule->numTaps = 7; -#endif /* Use fixed order filtering */ bandIdx = 0; @@ -362,7 +354,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( } else { -#ifdef UPDATE_SBA_FILTER if ( input_config == AUDIO_CONFIG_HOA3 ) { /* HOA3 filter coefficients */ @@ -391,13 +382,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( { return IVAS_ERR_INVALID_INPUT_FORMAT; } -#else - /* HOA3 filter coefficients */ - hBinRenConvModule->filterTapsLeftReal[bandIdx][chIdx] = hHrtf->leftHRIRReal_HOA3[bandIdx][chIdx]; - hBinRenConvModule->filterTapsLeftImag[bandIdx][chIdx] = hHrtf->leftHRIRImag_HOA3[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightReal[bandIdx][chIdx] = hHrtf->rightHRIRReal_HOA3[bandIdx][chIdx]; - hBinRenConvModule->filterTapsRightImag[bandIdx][chIdx] = hHrtf->rightHRIRImag_HOA3[bandIdx][chIdx]; -#endif } } } @@ -436,27 +420,18 @@ static ivas_error ivas_binaural_hrtf_open( HrtfFastConv->FASTCONV_HRIR_latency_s = FASTCONV_HRIR_latency_s; HrtfFastConv->FASTCONV_HOA3_latency_s = FASTCONV_HOA3_latency_s; -#ifdef UPDATE_SBA_FILTER HrtfFastConv->FASTCONV_HOA2_latency_s = FASTCONV_HOA2_latency_s; HrtfFastConv->FASTCONV_FOA_latency_s = FASTCONV_FOA_latency_s; -#endif HrtfFastConv->FASTCONV_BRIR_latency_s = FASTCONV_BRIR_latency_s; for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) { for ( j = 0; j < HRTF_LS_CHANNELS; j++ ) { -#ifdef UPDATE_SBA_FILTER mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], BINAURAL_NTAPS ); mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], BINAURAL_NTAPS ); -#else - mvr2r( leftHRIRReal[i][j], HrtfFastConv->leftHRIRReal[i][j], 7 ); - mvr2r( leftHRIRImag[i][j], HrtfFastConv->leftHRIRImag[i][j], 7 ); - mvr2r( rightHRIRReal[i][j], HrtfFastConv->rightHRIRReal[i][j], 7 ); - mvr2r( rightHRIRImag[i][j], HrtfFastConv->rightHRIRImag[i][j], 7 ); -#endif mvr2r( leftBRIRReal[i][j], HrtfFastConv->leftBRIRReal[i][j], BINAURAL_NTAPS_MAX ); @@ -465,7 +440,6 @@ static ivas_error ivas_binaural_hrtf_open( mvr2r( rightBRIRImag[i][j], HrtfFastConv->rightBRIRImag[i][j], BINAURAL_NTAPS_MAX ); } -#ifdef UPDATE_SBA_FILTER for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) { mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], BINAURAL_NTAPS ); @@ -487,15 +461,6 @@ static ivas_error ivas_binaural_hrtf_open( mvr2r( rightHRIRReal_FOA[i][j], HrtfFastConv->rightHRIRReal_FOA[i][j], BINAURAL_NTAPS ); mvr2r( rightHRIRImag_FOA[i][j], HrtfFastConv->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS ); } -#else - for ( j = 0; j < HRTF_SH_CHANNELS; j++ ) - { - mvr2r( leftHRIRReal_HOA3[i][j], HrtfFastConv->leftHRIRReal_HOA3[i][j], 7 ); - mvr2r( leftHRIRImag_HOA3[i][j], HrtfFastConv->leftHRIRImag_HOA3[i][j], 7 ); - mvr2r( rightHRIRReal_HOA3[i][j], HrtfFastConv->rightHRIRReal_HOA3[i][j], 7 ); - mvr2r( rightHRIRImag_HOA3[i][j], HrtfFastConv->rightHRIRImag_HOA3[i][j], 7 ); - } -#endif } mvr2r( fastconvReverberationTimes, HrtfFastConv->fastconvReverberationTimes, CLDFB_NO_CHANNELS_MAX ); @@ -749,7 +714,6 @@ ivas_error ivas_binRenderer_open( } else { -#ifdef UPDATE_SBA_FILTER if ( hBinRenderer->nInChannels == 16 ) { st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); @@ -766,9 +730,6 @@ ivas_error ivas_binRenderer_open( { return IVAS_ERR_INVALID_INPUT_FORMAT; } -#else - st_ivas->binaural_latency_ns = (int32_t) ( st_ivas->hHrtfFastConv->FASTCONV_HOA3_latency_s * 1000000000.f ); -#endif } } else diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 367bdee3ec..ce898ee36d 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -504,7 +504,6 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { -#ifdef UPDATE_SBA_FILTER if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) { if ( output_Fs == 48000 ) @@ -770,92 +769,6 @@ static ivas_error ivas_rend_initCrend( { return IVAS_ERROR( IVAS_ERR_INVALID_INPUT_FORMAT, "Encountered unsupported input config in Crend" ); } -#else - if ( output_Fs == 48000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz[i][j]; - } - } - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[j]; - } - } - else if ( output_Fs == 32000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz[i][j]; - } - } - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[j]; - } - } - else if ( output_Fs == 16000 ) - { - hHrtf->latency_s = CRendBin_HOA3_HRIR_latency_s; - hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; - hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz[i][j]; - hHrtf->pOut_to_bin_im[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz[i][j]; - } - } - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[j]; - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INVALID_SAMPLING_RATE, "Encountered Unsupported sampling rate in Crend" ); - } -#endif } else { @@ -973,7 +886,6 @@ static ivas_error ivas_rend_initCrend( } else if ( inConfigType == IVAS_REND_AUDIO_CONFIG_TYPE_AMBISONICS ) { -#ifdef UPDATE_SBA_FILTER if ( inConfig == IVAS_REND_AUDIO_CONFIG_HOA3 ) { hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; @@ -1057,36 +969,6 @@ static ivas_error ivas_rend_initCrend( return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); } } -#else - hHrtf->latency_s = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s; - hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; - hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; - - for ( i = 0; i < hHrtf->max_num_ir; i++ ) - { - hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight[i]; - - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j]; - hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j]; - hHrtf->pOut_to_bin_re[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_re[i][j]; - hHrtf->pOut_to_bin_im[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_im[i][j]; - } - } - for ( j = 0; j < BINAURAL_CHANNELS; j++ ) - { - hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations_diffuse[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max_diffuse[j]; - hHrtf->pOut_to_bin_diffuse_re[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re[j]; - hHrtf->pOut_to_bin_diffuse_im[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im[j]; - } - } - else - { - return IVAS_ERROR( IVAS_ERR_INTERNAL, "Unsupported renderer type in Crend" ); - } -#endif } pCrend->hHrtfCrend = hHrtf; @@ -1383,17 +1265,9 @@ static ivas_error ivas_rend_crendConvolver( int16_t lfe_idx_in; int16_t offset, offset_in, offset_diffuse; int16_t nchan_in, nchan_out; -#ifdef UPDATE_SBA_FILTER const float *pIn; -#else - float *pIn; -#endif float *pFreq_buf_re, *pFreq_buf_im; -#ifdef UPDATE_SBA_FILTER const float *pFreq_filt_re, *pFreq_filt_im; -#else - float *pFreq_filt_re, *pFreq_filt_im; -#endif float pOut[L_FRAME48k * 2]; float tmp_out_re[L_FRAME48k], tmp_out_im[L_FRAME48k]; ivas_error error; diff --git a/lib_rend/ivas_hrtf.c b/lib_rend/ivas_hrtf.c index 3616bd6c93..136873668b 100644 --- a/lib_rend/ivas_hrtf.c +++ b/lib_rend/ivas_hrtf.c @@ -96,10 +96,8 @@ ivas_error ivas_HRTF_CRend_binary_open( ( *hSetOfHRTF )->hHRTF_hrir_combined = NULL; ( *hSetOfHRTF )->hHRTF_hrir_hoa3 = NULL; -#ifdef UPDATE_SBA_FILTER ( *hSetOfHRTF )->hHRTF_hrir_hoa2 = NULL; ( *hSetOfHRTF )->hHRTF_hrir_foa = NULL; -#endif ( *hSetOfHRTF )->hHRTF_brir_combined = NULL; return IVAS_ERR_OK; diff --git a/lib_rend/ivas_rom_binauralRenderer.c b/lib_rend/ivas_rom_binauralRenderer.c index 560a1382d4..7c7c2c694e 100644 --- a/lib_rend/ivas_rom_binauralRenderer.c +++ b/lib_rend/ivas_rom_binauralRenderer.c @@ -54,3628 +54,7 @@ * Generated with Matlab version 9.3.0.713579 (R2017b) by MUXE6256 */ -#ifndef UPDATE_SBA_FILTER -const float FASTCONV_HOA3_latency_s = 0.001979167f; -const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]= -{ - { - {-0.004181f, +0.093228f, +0.655506f, +0.048565f, -0.005834f, -0.005472f, -0.000066f}, - {+0.005374f, +0.154923f, -0.116326f, -0.006786f, +0.018305f, +0.006415f, +0.000041f}, - {-0.018684f, -0.029658f, +0.105423f, -0.036469f, +0.025356f, +0.038274f, +0.001267f}, - {-0.008871f, +0.005481f, +0.057893f, -0.019694f, -0.003264f, +0.024498f, +0.000905f}, - {-0.007135f, +0.000238f, -0.011224f, +0.011879f, -0.000153f, +0.021305f, +0.001042f}, - {-0.011073f, -0.016271f, -0.017319f, +0.023598f, +0.000936f, +0.014578f, +0.000910f}, - {-0.015550f, -0.028470f, -0.026848f, +0.035803f, -0.009496f, +0.011103f, +0.001177f}, - {-0.015302f, -0.004218f, +0.013086f, +0.011363f, -0.012451f, +0.030157f, +0.000806f}, - {+0.006118f, -0.009705f, +0.007305f, -0.026069f, -0.010633f, +0.007816f, +0.000054f}, - {-0.000283f, -0.011328f, +0.005244f, +0.003740f, -0.001375f, +0.008133f, +0.000147f}, - {-0.007055f, +0.006562f, -0.019723f, -0.006761f, +0.003557f, +0.002004f, +0.000575f}, - {-0.005753f, -0.006934f, +0.005584f, +0.015274f, +0.002805f, -0.023709f, -0.000371f}, - {+0.001950f, +0.010016f, +0.006074f, +0.008742f, +0.013106f, -0.015378f, -0.000623f}, - {+0.004074f, -0.005302f, -0.028657f, +0.012447f, +0.002805f, -0.010937f, -0.000426f}, - {-0.004197f, -0.012821f, +0.003244f, +0.002529f, +0.002057f, +0.017829f, +0.000124f}, - {-0.000963f, -0.001662f, +0.000380f, -0.001216f, -0.003218f, +0.008842f, +0.000285f} - }, - { - {+0.003556f, -0.239019f, +0.015814f, -0.034927f, +0.000835f, -0.000512f, +0.000096f}, - {-0.005835f, -0.204261f, -0.475712f, +0.024759f, -0.018679f, -0.011234f, +0.000105f}, - {+0.033721f, +0.079282f, +0.110406f, -0.062743f, -0.006587f, -0.011131f, -0.001989f}, - {+0.017838f, +0.044971f, +0.009827f, -0.031696f, +0.008260f, +0.013480f, -0.001373f}, - {+0.013831f, +0.024735f, -0.028944f, -0.000956f, -0.011000f, -0.001960f, -0.001544f}, - {+0.021084f, +0.059877f, +0.043110f, +0.024830f, -0.009611f, -0.004985f, -0.001304f}, - {+0.024367f, +0.081687f, +0.039981f, +0.014737f, -0.015175f, -0.013033f, -0.001675f}, - {+0.029191f, +0.107182f, +0.052422f, -0.056640f, -0.061598f, -0.000773f, -0.001122f}, - {-0.008281f, -0.074836f, -0.054378f, -0.012477f, +0.014774f, +0.013960f, -0.000068f}, - {-0.000247f, -0.007528f, -0.001935f, -0.000487f, -0.009084f, -0.000991f, -0.000245f}, - {+0.009984f, +0.059593f, +0.036553f, -0.008280f, -0.016629f, -0.010745f, -0.000707f}, - {+0.008513f, +0.061561f, +0.054083f, +0.023396f, +0.007761f, -0.009113f, +0.000565f}, - {-0.007663f, -0.005870f, -0.005063f, +0.019587f, +0.022546f, -0.002888f, +0.000939f}, - {-0.008532f, -0.051613f, -0.057984f, +0.002035f, +0.015445f, +0.003259f, +0.000501f}, - {+0.007851f, +0.011553f, +0.020470f, -0.020649f, -0.005084f, +0.010733f, -0.000320f}, - {+0.000570f, -0.000978f, +0.021905f, -0.003402f, -0.018285f, -0.001482f, -0.000408f} - }, - { - {+0.007736f, +0.144660f, -0.537748f, -0.004930f, +0.008226f, +0.004392f, +0.000030f}, - {-0.007349f, -0.151725f, -0.515888f, -0.001929f, -0.062669f, +0.004955f, -0.000372f}, - {-0.012179f, +0.171781f, +0.054918f, -0.071555f, +0.033201f, -0.047777f, +0.000031f}, - {-0.008553f, +0.124306f, +0.013829f, -0.071708f, +0.089422f, -0.036145f, -0.000142f}, - {-0.007018f, +0.059230f, +0.004335f, -0.031204f, +0.019769f, -0.032580f, -0.000209f}, - {-0.008972f, +0.099683f, +0.129678f, -0.054026f, +0.027007f, -0.029783f, -0.000267f}, - {+0.002210f, +0.110557f, +0.095413f, -0.048633f, +0.007172f, -0.025076f, -0.000359f}, - {-0.012999f, +0.162940f, +0.053582f, -0.061108f, -0.031308f, -0.032573f, -0.000315f}, - {-0.004442f, -0.087134f, -0.064380f, +0.020402f, +0.034501f, -0.007477f, +0.000025f}, - {+0.001523f, -0.000248f, -0.027496f, -0.002745f, -0.003190f, -0.007474f, -0.000005f}, - {+0.002997f, +0.089888f, +0.060886f, -0.047296f, -0.022673f, -0.008361f, -0.000391f}, - {+0.000211f, +0.098294f, +0.051481f, -0.008578f, +0.001392f, +0.017489f, +0.000056f}, - {+0.012945f, -0.029045f, -0.019498f, +0.027318f, -0.017298f, +0.022221f, +0.000180f}, - {+0.007159f, -0.062500f, -0.089020f, +0.017716f, -0.003152f, +0.016636f, +0.000389f}, - {-0.001058f, +0.044275f, +0.008121f, -0.027659f, +0.015946f, -0.015722f, +0.000269f}, - {+0.003282f, -0.015996f, +0.030381f, -0.007292f, -0.006963f, -0.008990f, -0.000065f} - }, - { - {-0.011861f, +0.271405f, -0.278430f, +0.025016f, +0.011294f, +0.000635f, -0.000128f}, - {+0.015129f, +0.148744f, -0.117912f, +0.045648f, -0.027880f, +0.014786f, +0.000135f}, - {-0.014271f, +0.053035f, -0.051116f, -0.069585f, +0.052625f, -0.010128f, +0.001602f}, - {-0.010195f, +0.240862f, +0.281626f, -0.015036f, +0.064266f, -0.026405f, +0.001338f}, - {-0.003863f, +0.128285f, +0.125752f, -0.023611f, +0.014719f, -0.008956f, +0.001428f}, - {-0.009981f, +0.104866f, +0.151836f, -0.071803f, +0.037142f, +0.005583f, +0.001248f}, - {-0.029302f, +0.049151f, +0.034147f, -0.080526f, +0.015046f, +0.009918f, +0.001557f}, - {-0.011379f, +0.090502f, -0.003478f, +0.001737f, +0.015717f, -0.005394f, +0.001166f}, - {+0.013601f, +0.081238f, +0.096361f, +0.008808f, +0.002253f, -0.024062f, -0.000103f}, - {-0.000547f, -0.077561f, -0.091202f, +0.015743f, +0.015044f, -0.000452f, +0.000266f}, - {-0.012582f, +0.024498f, -0.001563f, -0.041900f, +0.007496f, +0.015197f, +0.000762f}, - {-0.005409f, +0.069704f, +0.026963f, -0.036542f, +0.004091f, +0.029327f, -0.000573f}, - {-0.010060f, -0.118980f, -0.120352f, +0.001785f, -0.011422f, +0.009820f, -0.001153f}, - {-0.004957f, -0.055368f, -0.084714f, +0.042237f, -0.021229f, -0.008488f, -0.000721f}, - {-0.010961f, +0.026557f, -0.029680f, -0.009625f, +0.016351f, -0.027210f, +0.000149f}, - {-0.006161f, -0.050026f, -0.020995f, -0.004188f, +0.012464f, -0.003841f, +0.000357f} - }, - { - {+0.002854f, -0.199862f, +0.377557f, -0.018029f, -0.002648f, +0.005351f, +0.000048f}, - {-0.007718f, -0.100789f, +0.353419f, -0.007116f, +0.012908f, -0.010862f, +0.000471f}, - {+0.016418f, -0.074324f, +0.003833f, -0.013084f, +0.006916f, +0.022053f, -0.000834f}, - {+0.018457f, +0.117034f, +0.337759f, +0.029601f, -0.001259f, +0.012091f, -0.000541f}, - {+0.007000f, +0.085907f, +0.156550f, -0.033776f, +0.004889f, +0.021889f, -0.000374f}, - {+0.014497f, +0.047168f, +0.105236f, -0.022554f, +0.019941f, +0.024780f, -0.000224f}, - {+0.024730f, +0.024042f, -0.072819f, -0.011540f, -0.016134f, +0.027606f, -0.000150f}, - {+0.015868f, +0.018542f, -0.002232f, +0.039669f, +0.009321f, -0.002315f, -0.000217f}, - {-0.004792f, +0.097726f, +0.134353f, +0.002292f, -0.015559f, -0.007981f, +0.000121f}, - {-0.002961f, -0.078193f, -0.059778f, +0.012020f, +0.013271f, -0.004082f, -0.000112f}, - {+0.006885f, -0.004914f, -0.032684f, -0.024347f, +0.018042f, +0.016734f, +0.000199f}, - {+0.001772f, +0.014925f, +0.028214f, +0.010154f, +0.016195f, +0.004179f, +0.000317f}, - {-0.000537f, -0.110532f, -0.155034f, +0.027494f, -0.005245f, -0.020700f, +0.000591f}, - {+0.004704f, -0.038699f, -0.105421f, +0.070185f, -0.026884f, -0.015695f, -0.000119f}, - {+0.014543f, +0.004277f, -0.088559f, +0.042679f, -0.013529f, -0.007812f, -0.000550f}, - {+0.004113f, -0.037861f, -0.063426f, +0.011996f, -0.002855f, +0.001383f, -0.000115f} - }, - { - {+0.004158f, -0.136179f, +0.471486f, -0.010746f, -0.010150f, -0.000039f, +0.000105f}, - {-0.001616f, -0.103469f, +0.340476f, -0.006395f, +0.017271f, -0.014891f, -0.000499f}, - {-0.002218f, -0.055483f, +0.106726f, +0.030050f, -0.003992f, +0.017802f, -0.000677f}, - {-0.007681f, -0.231402f, -0.096778f, +0.009445f, -0.019641f, +0.009330f, -0.000885f}, - {-0.001659f, -0.038468f, +0.007609f, -0.019464f, +0.012397f, +0.007017f, -0.001037f}, - {-0.002067f, -0.064781f, +0.005724f, -0.006298f, -0.000105f, -0.001293f, -0.000955f}, - {+0.001286f, -0.002826f, -0.003672f, +0.025100f, -0.037327f, +0.015360f, -0.001277f}, - {-0.001989f, -0.020649f, +0.009698f, +0.016654f, -0.003984f, +0.002810f, -0.000842f}, - {-0.009792f, +0.035452f, +0.055742f, -0.018125f, -0.011729f, +0.001735f, +0.000192f}, - {+0.005497f, +0.003715f, +0.049312f, +0.044502f, +0.013554f, -0.000042f, -0.000266f}, - {+0.002308f, +0.000052f, -0.001201f, -0.002945f, +0.024499f, +0.000321f, -0.000757f}, - {-0.000409f, +0.034789f, +0.019482f, +0.002158f, +0.017279f, -0.003930f, +0.000257f}, - {+0.008118f, -0.058308f, -0.099792f, +0.052127f, -0.003244f, -0.003237f, +0.000776f}, - {-0.002482f, +0.018540f, -0.016084f, +0.049919f, +0.004611f, +0.019604f, +0.000812f}, - {-0.004910f, -0.030265f, -0.065174f, +0.035390f, -0.020625f, +0.011275f, +0.000329f}, - {+0.000473f, -0.044402f, -0.047664f, +0.009816f, -0.009466f, +0.005943f, -0.000152f} - }, - { - {-0.000632f, +0.234949f, -0.076449f, +0.029353f, -0.003342f, -0.002513f, -0.000116f}, - {+0.001122f, +0.198229f, -0.135880f, +0.032523f, -0.008400f, -0.002254f, -0.000234f}, - {-0.006474f, +0.012441f, +0.072023f, +0.003003f, -0.002338f, +0.007281f, +0.000731f}, - {-0.007024f, +0.078955f, -0.546900f, +0.031895f, -0.010218f, -0.000083f, +0.000850f}, - {-0.003709f, +0.044602f, -0.152003f, +0.012636f, +0.008659f, -0.000295f, +0.000563f}, - {-0.010219f, -0.027454f, -0.010304f, -0.002910f, -0.025409f, -0.001683f, +0.000451f}, - {-0.018198f, -0.084105f, +0.144050f, -0.000789f, -0.020402f, -0.010649f, +0.000341f}, - {-0.005226f, -0.009181f, +0.017438f, -0.007286f, +0.000747f, +0.000053f, +0.000472f}, - {+0.008675f, -0.020476f, +0.010393f, -0.001184f, +0.001399f, +0.008992f, -0.000466f}, - {-0.004645f, +0.050041f, +0.039208f, +0.025486f, +0.009431f, +0.003611f, +0.000210f}, - {-0.002164f, -0.021185f, +0.049694f, -0.015111f, +0.035540f, -0.011784f, +0.000018f}, - {+0.004950f, +0.038538f, -0.003861f, +0.013197f, +0.010301f, -0.003601f, -0.000426f}, - {-0.006239f, +0.032304f, -0.110293f, +0.018466f, -0.018058f, +0.013502f, -0.001178f}, - {-0.004171f, -0.047776f, +0.083221f, -0.008780f, +0.051549f, +0.010771f, -0.000331f}, - {-0.004816f, -0.038669f, -0.009734f, -0.007649f, -0.014633f, +0.012471f, +0.000408f}, - {-0.001871f, -0.049422f, +0.001620f, -0.014704f, +0.001301f, +0.000266f, +0.000126f} - }, - { - {-0.002392f, -0.036192f, -0.479850f, -0.001486f, +0.001638f, -0.000479f, -0.000028f}, - {+0.001963f, +0.007857f, -0.431508f, +0.005280f, -0.011825f, +0.003300f, +0.000660f}, - {+0.006153f, -0.066414f, -0.082293f, -0.009897f, +0.005003f, +0.001877f, +0.000116f}, - {+0.005774f, +0.224617f, -0.413182f, +0.006791f, -0.006357f, +0.002392f, +0.000339f}, - {+0.002588f, +0.046307f, -0.160934f, +0.021941f, +0.006604f, -0.003152f, +0.000788f}, - {+0.007718f, +0.039716f, +0.042914f, +0.020400f, -0.026544f, -0.007395f, +0.000668f}, - {+0.014838f, -0.078097f, +0.062858f, -0.030152f, -0.017961f, -0.018307f, +0.001193f}, - {-0.004124f, +0.009420f, +0.007060f, -0.006513f, +0.002601f, +0.003839f, +0.000370f}, - {+0.006195f, -0.101198f, -0.077793f, +0.008266f, +0.024484f, +0.019361f, +0.000086f}, - {+0.001527f, +0.002318f, -0.042308f, -0.011672f, -0.015245f, +0.001589f, +0.000306f}, - {-0.001741f, -0.019739f, +0.044832f, -0.016814f, +0.028009f, -0.014184f, +0.000622f}, - {-0.004708f, -0.024409f, -0.050324f, -0.002679f, -0.001951f, -0.009320f, +0.000159f}, - {+0.000144f, +0.069626f, -0.066872f, +0.001826f, -0.017513f, +0.018588f, +0.000180f}, - {+0.009404f, -0.062001f, +0.038164f, -0.022621f, +0.029874f, -0.005701f, -0.000507f}, - {+0.002125f, +0.011473f, +0.018800f, -0.013683f, -0.013917f, +0.006977f, -0.000722f}, - {-0.000868f, -0.014504f, +0.051713f, +0.021653f, +0.012194f, -0.003663f, -0.000082f} - }, - { - {-0.002627f, -0.217647f, -0.199116f, -0.027874f, +0.001338f, -0.001188f, +0.000121f}, - {+0.001456f, -0.227592f, -0.064939f, -0.030479f, -0.008616f, +0.013142f, -0.000112f}, - {-0.005287f, +0.010510f, -0.168053f, -0.000744f, +0.011442f, -0.010874f, -0.000237f}, - {+0.008122f, -0.212557f, +0.200960f, -0.021301f, +0.000743f, +0.003911f, -0.000783f}, - {+0.003321f, -0.083216f, +0.024517f, +0.036704f, -0.003253f, +0.001363f, -0.000669f}, - {+0.004434f, +0.081515f, +0.013504f, +0.001836f, -0.012951f, -0.003306f, -0.000538f}, - {-0.002527f, +0.121402f, -0.181651f, -0.032907f, -0.017697f, +0.004190f, -0.000617f}, - {+0.011938f, -0.009047f, +0.016303f, -0.005344f, -0.002001f, +0.010309f, -0.000307f}, - {-0.011873f, -0.001538f, -0.140792f, +0.010836f, +0.011246f, +0.016002f, +0.000623f}, - {+0.001530f, -0.013180f, -0.072034f, +0.006709f, -0.010792f, +0.004928f, -0.000404f}, - {-0.000018f, -0.021675f, +0.020101f, +0.009023f, -0.002344f, +0.005474f, -0.000170f}, - {-0.002449f, -0.053967f, -0.045424f, +0.000129f, +0.003141f, -0.010272f, +0.000137f}, - {+0.002967f, -0.038307f, +0.054857f, -0.015668f, +0.009116f, -0.003669f, +0.000920f}, - {-0.006187f, +0.037813f, -0.066234f, +0.004495f, +0.007024f, -0.005535f, +0.000559f}, - {+0.005730f, -0.012869f, +0.023624f, +0.001785f, -0.001105f, -0.003414f, +0.000094f}, - {+0.002570f, +0.016715f, -0.004781f, +0.037235f, +0.005228f, +0.002059f, +0.000081f} - }, - { - {+0.005711f, +0.172046f, +0.340244f, -0.003381f, -0.013696f, -0.007435f, -0.000034f}, - {-0.005530f, +0.112515f, +0.499395f, +0.033784f, +0.003636f, +0.015967f, -0.000566f}, - {+0.004504f, +0.107042f, -0.080755f, -0.022698f, -0.020622f, -0.026444f, -0.000180f}, - {-0.012473f, -0.051897f, +0.566323f, +0.031770f, +0.025642f, +0.017873f, +0.000020f}, - {-0.006985f, +0.051564f, +0.236654f, +0.038126f, +0.000171f, +0.001417f, -0.000657f}, - {-0.009348f, -0.016850f, -0.063936f, -0.001037f, -0.006876f, +0.002280f, -0.000410f}, - {-0.005675f, +0.072635f, -0.278726f, -0.059144f, -0.054019f, -0.009162f, -0.001082f}, - {-0.004093f, -0.010670f, +0.111505f, +0.019792f, -0.002096f, +0.012057f, -0.000160f}, - {-0.000257f, +0.106978f, -0.092498f, -0.031885f, -0.036807f, -0.018315f, -0.000585f}, - {-0.002795f, +0.018562f, -0.027422f, +0.012047f, +0.000133f, +0.004062f, -0.000286f}, - {+0.002864f, -0.009258f, +0.044075f, +0.007042f, -0.021077f, +0.002832f, -0.000326f}, - {+0.003557f, +0.013247f, -0.028639f, -0.035330f, -0.018218f, -0.013147f, -0.000247f}, - {-0.002389f, -0.017115f, +0.090839f, -0.019457f, +0.001333f, -0.020188f, -0.000874f}, - {-0.002543f, +0.056049f, -0.050696f, +0.018136f, -0.005719f, -0.016853f, -0.000034f}, - {-0.004821f, -0.020905f, +0.048575f, +0.000031f, +0.002939f, +0.000094f, +0.000672f}, - {+0.000268f, -0.021535f, -0.056314f, +0.016343f, -0.007238f, -0.001215f, +0.000162f} - }, - { - {+0.000497f, +0.199631f, +0.320546f, -0.008423f, -0.016715f, +0.001536f, -0.000099f}, - {+0.002105f, +0.133643f, +0.457823f, +0.039593f, +0.015856f, -0.006780f, +0.000357f}, - {-0.000079f, +0.081396f, -0.030397f, -0.042814f, -0.032019f, -0.004736f, +0.000009f}, - {-0.000752f, +0.001209f, +0.419299f, +0.074040f, +0.032104f, -0.009226f, +0.000573f}, - {+0.003770f, -0.002457f, +0.265036f, +0.035182f, +0.011981f, -0.015263f, +0.000892f}, - {+0.001110f, -0.071616f, -0.034638f, -0.014567f, +0.006196f, -0.004125f, +0.000526f}, - {+0.004522f, -0.068226f, -0.124263f, -0.072379f, -0.044733f, -0.015592f, +0.001006f}, - {-0.006005f, -0.047558f, +0.167542f, +0.027263f, +0.003279f, -0.009908f, +0.000023f}, - {+0.011422f, +0.014023f, -0.007679f, -0.030936f, -0.025432f, -0.026138f, -0.000327f}, - {+0.001555f, -0.042000f, +0.046252f, +0.010681f, +0.012037f, -0.006048f, +0.000727f}, - {+0.000883f, -0.006033f, +0.055431f, -0.001632f, -0.010415f, -0.001443f, +0.000033f}, - {+0.005003f, +0.047366f, -0.077066f, -0.030162f, -0.026926f, +0.011349f, +0.000163f}, - {+0.000276f, +0.023815f, +0.032561f, -0.004664f, -0.004597f, -0.024338f, -0.000084f}, - {+0.006453f, -0.015468f, +0.033735f, +0.002725f, -0.008248f, -0.008173f, -0.000289f}, - {-0.002307f, -0.023691f, +0.044946f, -0.000352f, +0.013672f, -0.001764f, -0.000499f}, - {-0.004157f, -0.047861f, -0.015442f, -0.000019f, -0.001816f, +0.000663f, -0.000406f} - }, - { - {-0.005964f, -0.197350f, -0.225433f, -0.026481f, -0.003950f, +0.006853f, +0.000077f}, - {+0.003793f, -0.264745f, -0.176567f, -0.023196f, -0.000162f, -0.016113f, +0.000334f}, - {-0.004451f, -0.025566f, -0.133088f, -0.012077f, +0.001550f, +0.015523f, +0.000458f}, - {+0.013172f, -0.221258f, -0.036103f, -0.012790f, +0.008449f, -0.019034f, -0.000168f}, - {+0.002864f, -0.153297f, +0.028848f, -0.004146f, +0.011196f, -0.010167f, +0.000393f}, - {+0.007616f, -0.026433f, +0.011621f, +0.001408f, +0.021183f, -0.002104f, +0.000192f}, - {+0.003962f, -0.009740f, +0.082496f, -0.000654f, +0.011697f, +0.005240f, +0.000722f}, - {+0.001790f, -0.065846f, +0.058500f, -0.003294f, -0.001401f, -0.007149f, +0.000264f}, - {-0.005722f, -0.027626f, +0.065396f, +0.027714f, +0.014716f, -0.003255f, +0.000850f}, - {+0.000381f, -0.020278f, +0.070264f, -0.005215f, -0.005661f, -0.015546f, -0.000010f}, - {-0.005566f, -0.043439f, +0.014711f, +0.011508f, +0.008588f, +0.006241f, +0.000138f}, - {-0.008800f, +0.030897f, -0.031074f, -0.010268f, -0.015735f, +0.011437f, +0.000056f}, - {+0.001946f, -0.054037f, -0.040838f, +0.018449f, +0.011271f, -0.005778f, +0.000769f}, - {-0.001760f, -0.030833f, +0.057221f, +0.007865f, +0.005993f, +0.008404f, +0.000331f}, - {+0.003817f, -0.027235f, +0.000283f, -0.007034f, +0.008768f, -0.002842f, -0.000338f}, - {+0.003914f, -0.006906f, +0.031714f, +0.006856f, +0.002150f, +0.003874f, +0.000040f} - }, - { - {+0.001457f, -0.047583f, -0.495325f, +0.001826f, +0.001333f, +0.003088f, +0.000074f}, - {-0.003753f, +0.008510f, -0.563613f, -0.007615f, -0.008082f, -0.006661f, -0.000427f}, - {+0.004161f, -0.022990f, -0.173930f, +0.006816f, +0.008882f, +0.017712f, -0.000179f}, - {-0.008172f, +0.031420f, -0.316800f, -0.012601f, -0.003429f, -0.006815f, -0.000397f}, - {-0.004546f, -0.000876f, -0.169999f, +0.007495f, +0.004006f, +0.011955f, -0.001091f}, - {-0.004040f, +0.019746f, -0.006157f, +0.011071f, +0.015718f, +0.008190f, -0.000403f}, - {-0.009703f, -0.178427f, +0.280306f, +0.028912f, +0.024755f, +0.018971f, -0.001247f}, - {+0.006735f, +0.062902f, -0.130876f, +0.006194f, -0.003662f, -0.002192f, +0.000078f}, - {-0.005369f, -0.054533f, +0.087578f, +0.035337f, +0.013629f, +0.015368f, -0.000193f}, - {+0.000537f, +0.025648f, +0.007994f, -0.001582f, -0.009441f, -0.002933f, -0.000931f}, - {+0.001931f, -0.022911f, -0.052152f, +0.025436f, +0.010985f, +0.006549f, +0.000366f}, - {+0.001104f, -0.133408f, +0.138104f, -0.014911f, +0.009229f, +0.000823f, -0.000186f}, - {-0.001412f, -0.065891f, -0.013259f, +0.004650f, +0.004768f, +0.018314f, -0.000516f}, - {-0.003560f, -0.040100f, +0.045120f, +0.030156f, -0.004957f, +0.021757f, -0.000275f}, - {-0.000713f, -0.011150f, -0.037123f, +0.018480f, -0.010877f, +0.000661f, +0.000571f}, - {-0.000355f, -0.001036f, +0.026826f, +0.021528f, -0.011143f, +0.005414f, +0.000615f} - }, - { - {+0.004917f, +0.226272f, -0.106762f, +0.026044f, -0.000057f, +0.000232f, -0.000133f}, - {+0.000447f, +0.251546f, -0.187348f, +0.019737f, +0.000219f, +0.003742f, -0.000098f}, - {-0.002107f, +0.100586f, +0.032124f, +0.022602f, -0.003273f, +0.008593f, -0.000509f}, - {-0.004410f, +0.146512f, -0.140248f, +0.007418f, -0.004350f, +0.000903f, +0.000226f}, - {-0.001171f, +0.105409f, -0.055027f, +0.007343f, -0.000273f, +0.017251f, +0.000064f}, - {-0.005972f, +0.023304f, +0.000894f, +0.004305f, -0.000775f, +0.004195f, -0.000102f}, - {+0.002711f, -0.077236f, +0.298881f, -0.003126f, +0.015293f, +0.023057f, -0.000231f}, - {-0.000738f, +0.026778f, -0.124956f, +0.013307f, -0.012450f, -0.010200f, -0.000427f}, - {+0.003679f, -0.030698f, +0.031463f, +0.005909f, -0.005917f, +0.008406f, -0.000670f}, - {-0.004324f, +0.028582f, -0.008041f, -0.006647f, +0.008704f, +0.016778f, +0.000567f}, - {+0.005419f, +0.007352f, -0.027129f, +0.011548f, -0.007720f, -0.008818f, -0.000379f}, - {+0.004487f, -0.054705f, +0.207122f, -0.010876f, +0.032187f, +0.013415f, +0.000030f}, - {-0.003490f, +0.034227f, +0.105685f, +0.015759f, +0.020826f, +0.034768f, -0.000215f}, - {+0.001504f, -0.018606f, +0.027693f, +0.016091f, -0.012131f, +0.014826f, -0.000087f}, - {+0.002136f, +0.015991f, +0.009194f, +0.014987f, -0.023762f, -0.008680f, +0.000105f}, - {-0.001298f, -0.030927f, -0.014560f, +0.013518f, -0.037065f, -0.013374f, -0.000457f} - }, - { - {-0.002855f, -0.080709f, +0.404422f, -0.019653f, +0.001624f, -0.002008f, +0.000004f}, - {-0.000474f, -0.138747f, +0.415942f, -0.024357f, +0.006345f, +0.000660f, +0.000332f}, - {+0.002438f, -0.097479f, +0.316719f, -0.005955f, +0.000256f, -0.004044f, +0.000432f}, - {+0.005548f, -0.072168f, +0.145204f, -0.011399f, -0.004729f, +0.006525f, +0.000260f}, - {+0.006232f, -0.036539f, +0.144292f, -0.020222f, +0.000238f, +0.016212f, +0.001053f}, - {+0.006994f, -0.075916f, +0.070194f, +0.012274f, -0.008481f, +0.002291f, +0.000282f}, - {+0.010641f, +0.141691f, +0.043526f, -0.009240f, +0.002948f, +0.019010f, +0.001265f}, - {-0.012596f, -0.072872f, +0.041895f, +0.001937f, -0.005665f, -0.014239f, -0.000047f}, - {+0.005735f, +0.038590f, -0.066170f, +0.003100f, -0.006978f, +0.003386f, +0.000489f}, - {+0.005820f, -0.013019f, +0.027717f, -0.015063f, +0.006044f, +0.020772f, +0.000699f}, - {-0.005317f, -0.024744f, +0.062066f, +0.000569f, -0.004243f, -0.012342f, -0.000609f}, - {+0.000631f, +0.150800f, +0.012382f, -0.009252f, +0.019727f, +0.012303f, +0.000172f}, - {+0.006829f, +0.105930f, +0.072965f, -0.013344f, +0.017414f, +0.026031f, +0.000559f}, - {+0.003943f, +0.012054f, -0.015121f, +0.003687f, +0.000929f, +0.005727f, +0.000623f}, - {-0.005204f, -0.004393f, +0.064977f, +0.004963f, -0.007088f, -0.010326f, -0.000553f}, - {-0.000739f, -0.007033f, -0.060218f, +0.009762f, -0.013292f, -0.018375f, -0.000507f} - }, - { - {-0.002393f, -0.117302f, +0.356998f, -0.023770f, -0.001521f, -0.003691f, +0.000144f}, - {+0.001809f, -0.120704f, +0.409752f, -0.018770f, +0.014706f, +0.003961f, -0.000008f}, - {-0.001960f, -0.141491f, +0.287454f, -0.006342f, -0.006437f, -0.011911f, +0.000284f}, - {+0.002959f, -0.074011f, +0.157490f, +0.001773f, +0.013139f, +0.012386f, -0.000239f}, - {-0.002902f, -0.081203f, +0.112950f, -0.010741f, -0.003024f, -0.019425f, -0.000547f}, - {+0.002050f, -0.066194f, +0.104659f, +0.016714f, -0.002794f, -0.000866f, +0.000119f}, - {-0.011528f, +0.008225f, -0.112939f, -0.015539f, -0.025693f, -0.040924f, -0.000274f}, - {+0.010410f, +0.025230f, +0.102311f, +0.004806f, +0.021267f, +0.023087f, +0.000575f}, - {-0.005473f, -0.011072f, -0.060495f, +0.003663f, -0.005569f, -0.002042f, +0.000316f}, - {-0.001924f, -0.052236f, +0.013653f, -0.000203f, +0.004939f, -0.011491f, -0.000985f}, - {-0.001647f, +0.011326f, +0.097267f, -0.004425f, +0.014111f, +0.016627f, +0.000941f}, - {-0.003668f, +0.062846f, -0.128135f, -0.003669f, -0.008089f, -0.027424f, -0.000024f}, - {-0.001119f, +0.011806f, -0.046422f, -0.026434f, -0.024751f, -0.030626f, -0.000245f}, - {-0.002447f, -0.008624f, -0.064037f, -0.015087f, -0.020497f, -0.036444f, -0.000501f}, - {+0.000478f, +0.008448f, +0.050137f, +0.002484f, +0.018473f, +0.019501f, +0.000029f}, - {+0.002749f, +0.018668f, -0.022800f, +0.004117f, +0.006094f, +0.020072f, +0.000831f} - }, - { - {+0.001300f, +0.203261f, -0.169783f, +0.024359f, -0.005336f, -0.001691f, -0.000112f}, - {+0.000442f, +0.283920f, -0.228721f, +0.050599f, +0.011296f, +0.008092f, -0.000207f}, - {-0.002414f, +0.094299f, -0.032645f, -0.002329f, -0.001882f, -0.013648f, -0.000457f}, - {-0.004227f, +0.101458f, -0.078323f, +0.025650f, +0.023677f, +0.008354f, -0.000149f}, - {-0.004310f, +0.040486f, -0.067656f, +0.002564f, -0.009152f, -0.020113f, -0.000721f}, - {-0.006574f, +0.036030f, +0.031660f, +0.001982f, +0.011839f, -0.005651f, -0.000249f}, - {-0.003724f, -0.096560f, +0.032395f, -0.066533f, -0.059170f, -0.030499f, -0.001058f}, - {+0.006692f, +0.160009f, -0.129379f, +0.052154f, +0.052438f, +0.021767f, -0.000066f}, - {-0.003323f, -0.125272f, +0.095773f, -0.021055f, +0.002751f, -0.004192f, -0.000439f}, - {-0.003058f, -0.040531f, +0.031526f, -0.019596f, -0.001958f, -0.022711f, -0.000117f}, - {+0.006495f, +0.062678f, -0.034315f, +0.006680f, +0.044013f, +0.015039f, +0.000365f}, - {-0.005311f, -0.024302f, -0.038568f, -0.010732f, -0.046246f, -0.018532f, -0.000284f}, - {-0.008861f, -0.084231f, +0.034646f, -0.029324f, -0.051146f, -0.030089f, -0.000240f}, - {-0.007139f, -0.034225f, -0.007526f, -0.011945f, -0.061869f, -0.025586f, -0.000432f}, - {+0.007578f, +0.057792f, -0.063008f, +0.015978f, +0.032751f, +0.013830f, +0.000600f}, - {-0.001234f, -0.011094f, +0.018209f, +0.014340f, +0.006466f, +0.018926f, +0.000111f} - }, - { - {+0.002540f, -0.000338f, -0.479144f, +0.000386f, -0.002502f, +0.001455f, -0.000053f}, - {-0.003492f, +0.047296f, -0.570068f, +0.004548f, -0.004671f, +0.001911f, -0.000027f}, - {+0.005565f, -0.070554f, -0.294440f, +0.005506f, +0.010986f, -0.002858f, -0.000058f}, - {-0.004117f, +0.049455f, -0.195110f, +0.003929f, +0.005332f, -0.003637f, +0.000211f}, - {+0.005239f, -0.039531f, -0.206152f, +0.017684f, +0.012383f, -0.000355f, +0.000834f}, - {+0.000025f, -0.011412f, -0.088156f, -0.002778f, +0.007335f, -0.007815f, -0.000126f}, - {+0.014951f, -0.155014f, +0.017818f, +0.001033f, +0.001113f, +0.012028f, +0.000714f}, - {-0.014703f, +0.108984f, -0.204093f, -0.012043f, +0.008363f, -0.004674f, -0.000739f}, - {+0.004059f, -0.053922f, +0.114961f, -0.028402f, +0.006330f, -0.001994f, -0.000160f}, - {+0.003724f, -0.050906f, -0.007554f, -0.003538f, +0.016118f, -0.006369f, +0.000907f}, - {-0.008048f, -0.007569f, -0.119841f, -0.012922f, +0.012051f, -0.014974f, -0.001375f}, - {+0.013062f, -0.030629f, -0.004117f, +0.003212f, -0.008149f, +0.009890f, +0.000182f}, - {+0.009740f, -0.079383f, +0.082374f, +0.010250f, -0.003944f, -0.004234f, +0.000369f}, - {+0.014330f, +0.009080f, +0.046588f, +0.019107f, -0.009613f, +0.013944f, +0.000930f}, - {-0.006949f, +0.023465f, -0.071807f, -0.001860f, -0.007554f, -0.013510f, -0.000279f}, - {-0.002830f, +0.009786f, +0.032572f, -0.010719f, -0.019826f, -0.001129f, -0.000924f} - }, - { - {-0.000518f, -0.211474f, -0.133935f, -0.032307f, -0.000445f, +0.000582f, +0.000134f}, - {+0.002665f, -0.289252f, -0.086622f, -0.034396f, -0.004915f, -0.001571f, +0.000206f}, - {-0.002402f, -0.054649f, -0.277773f, -0.010873f, +0.005456f, +0.005496f, +0.000270f}, - {+0.006863f, -0.037276f, -0.109263f, -0.002603f, -0.001383f, -0.003887f, +0.000096f}, - {-0.000365f, -0.066656f, -0.133958f, +0.005654f, +0.003515f, +0.012311f, +0.000218f}, - {+0.006007f, +0.060607f, -0.226834f, +0.004299f, -0.005430f, +0.000507f, +0.000245f}, - {-0.007419f, -0.063255f, -0.041223f, +0.013192f, +0.013212f, +0.008787f, +0.000568f}, - {+0.005355f, -0.074959f, -0.017724f, -0.005843f, -0.003299f, -0.007563f, +0.000379f}, - {+0.005191f, +0.144000f, -0.130413f, -0.000127f, +0.002794f, -0.002991f, +0.000328f}, - {-0.001484f, +0.018159f, -0.100829f, +0.018864f, -0.001469f, +0.014392f, -0.000332f}, - {+0.010812f, -0.031458f, -0.085778f, -0.014179f, +0.006433f, -0.023583f, +0.000238f}, - {-0.005771f, -0.068903f, +0.096062f, -0.000252f, +0.011090f, +0.003258f, +0.000270f}, - {-0.000237f, -0.068071f, +0.174038f, -0.003828f, +0.006233f, -0.008771f, -0.000157f}, - {-0.011534f, -0.073815f, +0.180878f, +0.023529f, +0.003450f, +0.017160f, -0.000130f}, - {+0.000533f, -0.029314f, +0.026930f, -0.025304f, -0.011398f, -0.006662f, -0.000498f}, - {+0.005938f, +0.020909f, +0.008329f, -0.013694f, -0.010899f, -0.016792f, +0.000342f} - }, - { - {-0.004563f, +0.124857f, +0.392082f, +0.013563f, +0.002060f, +0.000768f, -0.000051f}, - {-0.000874f, +0.118799f, +0.536475f, +0.027073f, -0.003653f, -0.007953f, +0.000025f}, - {-0.002483f, +0.099121f, -0.035839f, -0.009303f, +0.001911f, +0.011561f, +0.000073f}, - {+0.001566f, +0.007969f, +0.017632f, +0.014602f, -0.004766f, -0.011498f, -0.000206f}, - {-0.000162f, +0.069466f, +0.070394f, -0.010535f, -0.013295f, +0.006761f, -0.000783f}, - {-0.001614f, +0.022761f, -0.217697f, +0.007286f, -0.009756f, +0.000855f, +0.000123f}, - {-0.006230f, +0.043001f, +0.068506f, +0.012269f, -0.001247f, +0.005912f, -0.000829f}, - {+0.003179f, +0.070957f, +0.187234f, +0.028351f, +0.003912f, -0.015536f, +0.000707f}, - {-0.008139f, +0.072807f, -0.193636f, +0.001437f, -0.001644f, -0.004401f, +0.000212f}, - {+0.001051f, +0.001027f, -0.130312f, +0.005052f, -0.009787f, +0.012646f, -0.000484f}, - {-0.011122f, +0.053720f, +0.094386f, +0.024713f, +0.004708f, -0.004962f, +0.001401f}, - {-0.005833f, +0.020123f, +0.198197f, +0.023257f, -0.001066f, -0.005043f, -0.000360f}, - {-0.004564f, -0.002440f, +0.257145f, +0.012398f, -0.014402f, +0.011456f, -0.000090f}, - {+0.003708f, -0.033867f, +0.192105f, -0.009019f, +0.001369f, +0.017649f, -0.000875f}, - {-0.000732f, +0.046885f, +0.134712f, +0.007725f, +0.003664f, +0.006970f, +0.000515f}, - {-0.005583f, -0.032353f, -0.019855f, +0.017107f, -0.001283f, -0.011122f, +0.000713f} - }, - { - {+0.004066f, +0.114050f, +0.374700f, +0.029211f, +0.000581f, -0.000706f, -0.000055f}, - {+0.002409f, +0.197372f, +0.418425f, +0.043739f, -0.001381f, -0.006220f, -0.000261f}, - {+0.001898f, -0.064197f, +0.179119f, -0.008245f, +0.001749f, +0.008116f, -0.000159f}, - {-0.006930f, -0.044567f, +0.116693f, +0.010436f, -0.007263f, -0.009260f, -0.000055f}, - {-0.005436f, -0.030846f, +0.218738f, -0.016032f, -0.014948f, -0.006593f, +0.000194f}, - {-0.005550f, -0.139940f, +0.036170f, -0.010954f, -0.009097f, +0.004539f, -0.000244f}, - {+0.007570f, -0.021370f, +0.201636f, -0.018407f, -0.011309f, +0.008794f, -0.000028f}, - {+0.000471f, +0.110932f, +0.171227f, +0.014736f, -0.001743f, +0.001483f, -0.000770f}, - {-0.001447f, -0.112344f, +0.009378f, -0.014922f, -0.005067f, +0.006639f, -0.000413f}, - {-0.002692f, -0.030681f, -0.061540f, -0.021293f, -0.000512f, +0.001990f, +0.000334f}, - {+0.001796f, +0.003780f, +0.092257f, +0.069391f, -0.029804f, +0.029220f, -0.000867f}, - {+0.005138f, +0.080068f, +0.149507f, +0.001138f, -0.024022f, +0.014589f, -0.000067f}, - {-0.004224f, +0.108920f, +0.013328f, +0.069316f, -0.035946f, +0.025685f, +0.000258f}, - {+0.000658f, +0.090331f, +0.062341f, -0.027002f, +0.011859f, +0.001213f, +0.000603f}, - {+0.005900f, +0.098418f, +0.049627f, +0.003081f, +0.013620f, +0.005035f, +0.000178f}, - {+0.001625f, -0.027640f, -0.069299f, +0.028848f, -0.005261f, +0.005494f, -0.000622f} - }, - { - {+0.000963f, -0.209168f, -0.136783f, -0.021436f, -0.001315f, +0.001715f, +0.000053f}, - {-0.003836f, -0.240060f, -0.249017f, -0.026285f, -0.002356f, +0.002581f, +0.000097f}, - {+0.002543f, -0.056651f, +0.175187f, -0.004318f, +0.000986f, +0.000543f, -0.000230f}, - {-0.000920f, +0.004716f, +0.131627f, +0.000502f, -0.004907f, +0.000275f, +0.000237f}, - {+0.006067f, -0.044059f, +0.163804f, -0.013386f, -0.002210f, +0.001514f, +0.000471f}, - {+0.004568f, +0.030380f, +0.236809f, +0.001626f, +0.004495f, +0.008084f, -0.000145f}, - {-0.000637f, +0.044154f, +0.318363f, +0.001072f, -0.013326f, +0.005888f, +0.000534f}, - {-0.004169f, -0.041204f, +0.007502f, +0.013093f, -0.005489f, +0.005599f, -0.000320f}, - {+0.009667f, -0.026427f, +0.125387f, -0.020909f, -0.002220f, +0.007411f, -0.000193f}, - {+0.003570f, +0.038849f, +0.026343f, -0.010463f, -0.003426f, -0.005718f, +0.000181f}, - {+0.011129f, -0.105682f, -0.071918f, +0.042767f, -0.045744f, +0.019229f, -0.001047f}, - {+0.001721f, +0.011709f, +0.075679f, +0.011170f, -0.018633f, +0.009301f, +0.000298f}, - {+0.014881f, -0.126099f, -0.329945f, +0.029695f, -0.035112f, +0.015020f, -0.000347f}, - {-0.001429f, +0.041747f, -0.036410f, -0.017561f, +0.002266f, -0.010646f, +0.000475f}, - {-0.004566f, -0.060021f, -0.112881f, -0.001467f, +0.001208f, -0.008750f, -0.000458f}, - {+0.003385f, -0.054651f, -0.117931f, -0.004432f, -0.010618f, +0.008056f, -0.000354f} - }, - { - {-0.002636f, +0.021786f, -0.463103f, +0.000210f, -0.002240f, +0.001465f, +0.000004f}, - {+0.000878f, -0.033402f, -0.570083f, -0.011803f, -0.002903f, +0.005358f, +0.000186f}, - {-0.003861f, +0.077704f, -0.003869f, +0.009538f, +0.005934f, -0.007444f, +0.000299f}, - {+0.010766f, +0.071297f, +0.041586f, -0.012126f, -0.005377f, +0.011762f, -0.000054f}, - {+0.003440f, +0.083945f, +0.020595f, -0.010102f, -0.001688f, +0.003568f, -0.000305f}, - {+0.000517f, +0.090621f, +0.157862f, +0.005981f, +0.009055f, +0.001744f, +0.000308f}, - {+0.000182f, +0.151744f, +0.162737f, -0.002607f, +0.004109f, -0.003418f, -0.000159f}, - {-0.001674f, +0.013807f, -0.090106f, +0.002037f, -0.002899f, -0.000327f, +0.000853f}, - {-0.006443f, +0.001872f, +0.099185f, +0.004052f, -0.002515f, -0.000928f, +0.000598f}, - {-0.003444f, +0.003891f, +0.070062f, +0.022333f, -0.021229f, -0.003330f, -0.000068f}, - {-0.012896f, -0.014560f, -0.156269f, +0.016693f, -0.002612f, -0.014390f, +0.001286f}, - {+0.000829f, +0.055243f, -0.003801f, +0.001636f, -0.000490f, -0.001040f, +0.000005f}, - {-0.012356f, -0.110940f, -0.289749f, -0.015445f, +0.011167f, -0.013527f, +0.000160f}, - {+0.002911f, +0.062983f, -0.089502f, +0.007738f, +0.002529f, -0.010796f, -0.000711f}, - {-0.001042f, -0.042600f, -0.131138f, -0.021059f, +0.003745f, -0.005700f, +0.000034f}, - {-0.005370f, -0.110106f, -0.043966f, -0.008083f, +0.000494f, +0.000652f, +0.000654f} - }, - { - {+0.000068f, +0.218352f, -0.157003f, +0.028534f, -0.003926f, -0.000507f, -0.000005f}, - {+0.002073f, +0.275247f, -0.104488f, +0.034616f, -0.005146f, -0.000060f, -0.000164f}, - {+0.000542f, +0.035123f, -0.100984f, -0.012987f, -0.001903f, -0.010200f, +0.000216f}, - {-0.007809f, -0.017882f, -0.016749f, +0.003757f, +0.007758f, +0.013407f, -0.000199f}, - {-0.011198f, +0.012942f, -0.020894f, +0.014537f, +0.001742f, +0.002696f, -0.000187f}, - {+0.000091f, -0.053033f, -0.050071f, -0.012761f, +0.000476f, -0.005826f, +0.000111f}, - {-0.004382f, -0.147911f, -0.200725f, +0.006370f, +0.014963f, -0.002284f, -0.000221f}, - {+0.006114f, +0.016727f, -0.125469f, +0.009898f, +0.002187f, -0.002825f, -0.000120f}, - {+0.000315f, -0.042519f, -0.011423f, -0.012532f, -0.008250f, -0.008414f, -0.000042f}, - {+0.003440f, +0.012295f, +0.068286f, +0.009074f, -0.037833f, -0.006784f, -0.000232f}, - {+0.002138f, +0.083651f, -0.088555f, +0.008486f, +0.011516f, -0.015378f, +0.000453f}, - {-0.008151f, -0.083680f, -0.170893f, +0.004520f, +0.005257f, -0.007598f, -0.000202f}, - {-0.000469f, +0.132201f, -0.018388f, -0.009231f, +0.019167f, -0.012329f, +0.000366f}, - {-0.003734f, +0.034878f, -0.050414f, +0.013477f, +0.006657f, -0.003764f, -0.000102f}, - {-0.000430f, +0.080573f, -0.013035f, -0.016572f, +0.018193f, -0.001715f, +0.000223f}, - {+0.002846f, +0.020446f, +0.092520f, -0.009215f, +0.003194f, -0.000469f, +0.000030f} - }, - { - {+0.000963f, -0.125190f, +0.346445f, -0.013595f, +0.000303f, -0.000978f, -0.000033f}, - {+0.000446f, -0.100728f, +0.488217f, -0.016236f, -0.005710f, +0.001786f, -0.000035f}, - {+0.002743f, -0.014250f, -0.025406f, -0.016135f, -0.007374f, -0.003595f, -0.000484f}, - {-0.003552f, -0.038637f, -0.023362f, +0.006065f, +0.017089f, +0.002181f, +0.000163f}, - {+0.005542f, -0.022598f, -0.016879f, +0.000337f, +0.010965f, -0.004955f, +0.000192f}, - {-0.003897f, -0.006264f, -0.110622f, -0.001101f, -0.004484f, -0.005876f, -0.000391f}, - {+0.001192f, -0.096496f, -0.316300f, -0.005468f, +0.032792f, -0.008475f, +0.000051f}, - {+0.000727f, +0.053728f, -0.131435f, +0.003649f, +0.007573f, +0.001815f, -0.000580f}, - {-0.000863f, +0.008255f, -0.088991f, -0.000632f, -0.015735f, -0.002803f, -0.000629f}, - {-0.002406f, +0.061420f, +0.048885f, -0.025571f, -0.026139f, -0.013054f, -0.000085f}, - {+0.006958f, +0.009989f, +0.015982f, +0.015590f, +0.008811f, -0.003944f, -0.001342f}, - {+0.004616f, -0.048619f, -0.248100f, -0.002887f, +0.015818f, -0.007122f, -0.000127f}, - {+0.009488f, +0.064501f, +0.087537f, +0.011252f, +0.004644f, -0.003762f, -0.000684f}, - {+0.000069f, -0.120500f, +0.126342f, -0.004190f, +0.000200f, -0.001712f, +0.000586f}, - {+0.005149f, -0.007666f, +0.084919f, +0.009632f, +0.003272f, +0.006689f, +0.000055f}, - {+0.000416f, +0.029426f, +0.098519f, +0.008834f, +0.001161f, +0.002526f, -0.000495f} - }, - { - {+0.000886f, -0.148670f, +0.323207f, -0.018371f, -0.002564f, -0.001740f, +0.000012f}, - {-0.003884f, -0.175284f, +0.400890f, -0.026675f, -0.007851f, +0.000737f, +0.000065f}, - {-0.002495f, +0.080937f, +0.147671f, +0.011536f, +0.007971f, +0.006899f, +0.000035f}, - {+0.007961f, -0.084392f, -0.116379f, -0.003191f, +0.002839f, -0.007308f, +0.000062f}, - {+0.006158f, -0.080005f, -0.088685f, -0.003948f, +0.007957f, -0.004571f, +0.000120f}, - {+0.002211f, +0.071563f, -0.001572f, +0.017783f, +0.002945f, +0.001211f, +0.000025f}, - {+0.006354f, +0.043718f, -0.096037f, +0.016202f, +0.015087f, -0.012592f, +0.000187f}, - {-0.008848f, +0.111246f, +0.002666f, -0.000486f, +0.002601f, +0.004659f, +0.000250f}, - {+0.003002f, +0.031933f, -0.067079f, +0.004866f, -0.003717f, +0.006734f, +0.000335f}, - {-0.000242f, +0.057016f, +0.043568f, -0.018255f, +0.005973f, +0.012687f, +0.000474f}, - {-0.006561f, +0.039260f, +0.109217f, +0.013646f, -0.000558f, +0.004597f, +0.000141f}, - {+0.005911f, +0.034849f, -0.122537f, +0.003454f, +0.006816f, -0.008021f, +0.000346f}, - {-0.009125f, +0.032899f, +0.054825f, -0.015163f, +0.007845f, -0.000234f, +0.000195f}, - {+0.004323f, -0.058064f, +0.175096f, -0.013022f, -0.007874f, +0.002160f, -0.000093f}, - {-0.000030f, -0.004530f, +0.139712f, +0.009150f, -0.007095f, +0.003336f, -0.000160f}, - {+0.000090f, +0.003404f, +0.036143f, -0.013076f, -0.011742f, -0.000567f, +0.000145f} - }, - { - {-0.001658f, +0.168998f, -0.158518f, +0.021572f, -0.003793f, -0.001030f, +0.000055f}, - {+0.001127f, +0.205208f, -0.220912f, +0.026048f, -0.002674f, -0.002769f, +0.000023f}, - {-0.000461f, +0.009252f, +0.227604f, +0.010467f, +0.006338f, +0.006074f, +0.000422f}, - {-0.002384f, +0.002851f, -0.212446f, +0.002659f, +0.001628f, -0.007095f, -0.000144f}, - {-0.008381f, -0.010679f, -0.133194f, -0.002584f, +0.005642f, -0.000472f, -0.000122f}, - {+0.002492f, +0.019849f, +0.076078f, -0.001470f, +0.003467f, +0.000327f, +0.000366f}, - {-0.004536f, -0.073352f, +0.163370f, -0.006974f, -0.006111f, +0.002960f, -0.000053f}, - {+0.006503f, -0.143768f, +0.271114f, -0.002346f, -0.005069f, +0.007486f, +0.000318f}, - {+0.000578f, -0.025307f, +0.019989f, +0.002596f, -0.000438f, +0.005960f, +0.000442f}, - {+0.001669f, +0.018575f, +0.086499f, -0.013973f, +0.005522f, +0.018115f, -0.000044f}, - {+0.003923f, -0.045316f, +0.178720f, +0.008368f, -0.009955f, +0.008103f, +0.001025f}, - {-0.005730f, -0.104850f, +0.098014f, -0.001983f, -0.005339f, +0.003699f, +0.000081f}, - {+0.004112f, -0.056472f, +0.078708f, +0.007073f, -0.002789f, +0.002619f, +0.000670f}, - {-0.002113f, +0.147342f, -0.011554f, -0.009749f, -0.006943f, +0.003214f, -0.000444f}, - {-0.009491f, -0.008362f, +0.168137f, -0.007087f, -0.000514f, +0.001707f, -0.000225f}, - {-0.002858f, +0.040341f, -0.044863f, -0.002151f, -0.014669f, -0.003465f, +0.000263f} - }, - { - {+0.000325f, +0.012293f, -0.420365f, -0.001073f, -0.001275f, -0.000190f, -0.000056f}, - {+0.004153f, +0.000289f, -0.552776f, +0.004938f, +0.001551f, -0.000077f, +0.000021f}, - {+0.003179f, -0.114923f, +0.044254f, -0.005107f, +0.002854f, -0.000178f, -0.000238f}, - {-0.002447f, +0.087293f, -0.100868f, -0.001711f, +0.001963f, -0.006609f, +0.000026f}, - {+0.000798f, +0.106727f, +0.010700f, +0.015899f, +0.006953f, -0.001329f, -0.000158f}, - {-0.001202f, -0.077157f, -0.029032f, -0.005126f, -0.002123f, -0.005150f, -0.000138f}, - {-0.005108f, -0.025092f, +0.196748f, -0.011988f, -0.001042f, +0.009182f, -0.000182f}, - {-0.000182f, -0.149947f, +0.283461f, +0.014807f, -0.003734f, -0.001388f, -0.000169f}, - {-0.004916f, +0.034459f, +0.115305f, -0.001284f, +0.001624f, -0.003142f, -0.000476f}, - {-0.000563f, +0.021689f, +0.129439f, +0.009360f, -0.006104f, +0.001314f, -0.000611f}, - {-0.004903f, -0.097921f, +0.109890f, -0.003701f, -0.014923f, -0.001100f, -0.000445f}, - {-0.004445f, -0.041667f, +0.183618f, -0.002519f, -0.000687f, +0.004062f, -0.000508f}, - {+0.001992f, -0.044965f, +0.102788f, -0.009037f, -0.015851f, -0.006745f, -0.000749f}, - {-0.004462f, +0.089632f, -0.099871f, +0.006564f, +0.004290f, +0.010085f, +0.000230f}, - {+0.005311f, -0.026905f, +0.088346f, +0.002622f, +0.012027f, +0.008602f, +0.000330f}, - {+0.002284f, +0.015859f, -0.086945f, -0.006492f, +0.002254f, +0.002859f, -0.000141f} - }, - { - {+0.000326f, -0.185379f, -0.113130f, -0.018251f, -0.002891f, -0.000347f, -0.000024f}, - {-0.003253f, -0.209744f, -0.182927f, -0.020751f, +0.000290f, -0.000620f, -0.000129f}, - {-0.003028f, +0.047265f, -0.166312f, -0.004033f, +0.004095f, -0.000001f, -0.000176f}, - {+0.000316f, -0.113969f, +0.180249f, -0.010833f, -0.002558f, -0.003462f, +0.000061f}, - {+0.003377f, -0.011235f, +0.182709f, +0.007053f, -0.006109f, +0.001285f, +0.000192f}, - {-0.003931f, -0.005368f, -0.113545f, -0.005959f, -0.008563f, +0.003356f, -0.000270f}, - {+0.007132f, +0.113339f, -0.085151f, +0.027048f, +0.006394f, +0.004682f, +0.000174f}, - {+0.000751f, +0.118643f, -0.011839f, -0.007823f, +0.008316f, -0.008033f, -0.000242f}, - {+0.002459f, -0.036301f, +0.193951f, -0.011739f, +0.006099f, -0.008613f, -0.000199f}, - {+0.000406f, +0.016288f, +0.132011f, +0.014654f, -0.002234f, -0.013512f, +0.000336f}, - {+0.004431f, +0.059630f, -0.069866f, -0.034584f, +0.004013f, -0.006714f, -0.000599f}, - {+0.005956f, +0.026912f, +0.080301f, -0.013592f, +0.011263f, -0.002117f, +0.000173f}, - {-0.008209f, -0.004505f, +0.119613f, -0.041351f, -0.013433f, -0.006274f, -0.000170f}, - {+0.005701f, +0.024166f, -0.118285f, +0.031263f, -0.000827f, +0.014446f, +0.000265f}, - {+0.009742f, +0.118573f, -0.137465f, +0.018797f, +0.026066f, +0.001847f, +0.000233f}, - {+0.002341f, -0.050370f, -0.015346f, +0.010898f, +0.021006f, -0.007241f, -0.000088f} - }, - { - {+0.000319f, +0.126694f, +0.366724f, +0.020424f, -0.001419f, +0.002643f, +0.000070f}, - {-0.002315f, +0.189978f, +0.424487f, +0.028121f, +0.003399f, +0.001047f, +0.000054f}, - {+0.000002f, +0.059855f, -0.154980f, +0.000999f, -0.005118f, -0.004107f, +0.000191f}, - {+0.003430f, -0.035271f, +0.310904f, +0.009731f, +0.001220f, +0.005190f, +0.000006f}, - {+0.000597f, -0.036067f, +0.156487f, +0.000121f, -0.001763f, +0.002466f, +0.000103f}, - {+0.002799f, +0.082995f, -0.033871f, -0.002711f, -0.002209f, +0.005746f, +0.000158f}, - {+0.000838f, -0.029571f, -0.293367f, -0.014081f, -0.006415f, +0.002421f, -0.000016f}, - {-0.003985f, -0.053282f, -0.235190f, +0.002717f, +0.007419f, -0.003670f, +0.000132f}, - {+0.003050f, -0.115037f, +0.111070f, +0.001088f, -0.002341f, -0.002756f, +0.000444f}, - {-0.002839f, -0.039655f, +0.056727f, +0.015997f, -0.000834f, -0.008040f, +0.000489f}, - {+0.000660f, -0.016986f, -0.163358f, -0.021748f, +0.011162f, +0.003668f, +0.000413f}, - {+0.004639f, -0.044241f, -0.031884f, -0.021035f, +0.012216f, +0.004499f, +0.000415f}, - {+0.010322f, -0.027147f, +0.049841f, -0.030293f, +0.012802f, +0.010388f, +0.000831f}, - {-0.000435f, -0.007837f, -0.132385f, +0.021562f, -0.024000f, -0.010766f, -0.000329f}, - {-0.013019f, -0.039175f, -0.263229f, +0.021453f, -0.007560f, -0.017185f, -0.000554f}, - {-0.004755f, -0.013959f, +0.075438f, +0.020661f, +0.007559f, -0.002287f, +0.000024f} - }, - { - {-0.000366f, +0.124913f, +0.371948f, +0.012777f, -0.000932f, +0.002982f, -0.000011f}, - {+0.003472f, +0.140915f, +0.467037f, +0.023556f, +0.002486f, +0.001401f, +0.000134f}, - {+0.002379f, -0.064440f, +0.016932f, -0.014417f, -0.008974f, +0.000096f, +0.000033f}, - {-0.003091f, +0.132798f, +0.091856f, +0.016839f, -0.001343f, +0.008140f, -0.000081f}, - {-0.003585f, +0.084471f, -0.026953f, +0.002730f, +0.014878f, +0.007539f, -0.000263f}, - {+0.003779f, +0.001969f, +0.063847f, -0.006087f, +0.005822f, +0.005396f, +0.000227f}, - {-0.004511f, -0.122929f, -0.117186f, -0.033714f, -0.013590f, +0.002377f, -0.000100f}, - {+0.000980f, -0.075927f, -0.209412f, -0.000716f, -0.010339f, -0.005890f, +0.000204f}, - {-0.003810f, +0.057065f, -0.098800f, +0.006671f, -0.016309f, +0.008162f, +0.000049f}, - {+0.003493f, +0.065520f, -0.083489f, +0.006585f, -0.004680f, +0.003998f, -0.000533f}, - {-0.003710f, -0.067626f, -0.100484f, -0.001614f, -0.003921f, +0.004818f, +0.000362f}, - {-0.009313f, -0.006684f, -0.041093f, -0.019272f, -0.001375f, +0.012838f, -0.000308f}, - {-0.005002f, +0.026330f, -0.021257f, -0.018461f, +0.004718f, +0.021321f, -0.000281f}, - {-0.001875f, -0.027307f, -0.031082f, -0.009783f, -0.018159f, -0.018171f, +0.000040f}, - {-0.000166f, -0.115217f, -0.152392f, -0.002694f, -0.019043f, -0.016076f, -0.000053f}, - {+0.000874f, +0.000110f, +0.050226f, +0.023317f, -0.014557f, +0.001480f, +0.000044f} - }, - { - {-0.000264f, -0.194793f, -0.107821f, -0.023201f, -0.001199f, +0.000928f, -0.000060f}, - {+0.000832f, -0.240876f, -0.099242f, -0.022166f, -0.003699f, -0.002772f, -0.000150f}, - {-0.001244f, -0.043315f, +0.069455f, -0.009254f, -0.000121f, +0.002278f, -0.000050f}, - {+0.000506f, -0.065069f, -0.220826f, -0.007722f, -0.000261f, +0.008268f, -0.000002f}, - {+0.000158f, +0.024522f, -0.139604f, -0.008624f, +0.007485f, +0.001513f, +0.000052f}, - {-0.004662f, -0.057647f, +0.024501f, -0.007536f, -0.000268f, -0.003627f, -0.000193f}, - {-0.001281f, +0.103406f, +0.216683f, +0.001410f, -0.010455f, -0.001406f, +0.000159f}, - {+0.003974f, +0.035826f, -0.038344f, +0.009124f, -0.007513f, +0.004170f, -0.000115f}, - {+0.001177f, +0.014518f, -0.176436f, +0.013776f, -0.011126f, +0.004369f, -0.000360f}, - {-0.000200f, +0.028344f, -0.131828f, -0.000160f, -0.010621f, +0.002766f, -0.000196f}, - {+0.000761f, +0.050071f, +0.080542f, +0.016049f, -0.013715f, +0.000842f, -0.000304f}, - {+0.000174f, +0.037897f, +0.027758f, -0.000913f, -0.012246f, +0.000027f, -0.000247f}, - {-0.002523f, +0.017257f, -0.029696f, -0.007251f, -0.004825f, +0.006036f, -0.000646f}, - {-0.002385f, +0.084478f, +0.128806f, +0.008133f, -0.002169f, -0.006954f, +0.000201f}, - {+0.008715f, +0.075360f, +0.074445f, +0.006029f, +0.000811f, +0.006272f, +0.000696f}, - {+0.004537f, -0.062959f, -0.053134f, +0.012141f, -0.007590f, +0.010200f, +0.000089f} - }, - { - {+0.000276f, +0.007743f, -0.416264f, -0.001108f, +0.002588f, -0.002874f, +0.000036f}, - {-0.002808f, +0.022075f, -0.484229f, +0.001735f, -0.003481f, -0.002668f, -0.000022f}, - {-0.001043f, +0.025703f, -0.026181f, +0.003209f, +0.003368f, +0.000139f, -0.000060f}, - {+0.000521f, -0.056071f, -0.241883f, -0.008469f, +0.009541f, -0.000806f, +0.000153f}, - {+0.002825f, -0.022621f, -0.075727f, -0.011466f, +0.000225f, -0.001401f, +0.000211f}, - {-0.001889f, -0.007945f, -0.059481f, +0.000805f, -0.002148f, -0.004609f, -0.000188f}, - {+0.004476f, +0.059212f, +0.261153f, -0.001867f, -0.001737f, -0.006657f, -0.000119f}, - {-0.002093f, -0.007870f, +0.069319f, -0.003999f, +0.002298f, +0.004349f, -0.000164f}, - {-0.001038f, -0.064160f, -0.043605f, -0.010516f, +0.006900f, -0.004421f, -0.000000f}, - {-0.001450f, -0.032984f, -0.037734f, -0.017216f, -0.000676f, -0.001134f, +0.000457f}, - {+0.001626f, +0.021124f, +0.148362f, +0.002128f, -0.002287f, -0.004634f, -0.000290f}, - {+0.007506f, +0.018304f, +0.027687f, -0.007765f, -0.004034f, -0.009905f, +0.000275f}, - {+0.004447f, +0.019127f, -0.031778f, -0.006006f, +0.011798f, -0.014550f, +0.000549f}, - {+0.004784f, +0.020712f, +0.158803f, +0.001960f, -0.000959f, +0.001140f, -0.000291f}, - {-0.001723f, +0.027442f, +0.179042f, +0.004096f, -0.000119f, +0.015809f, -0.000273f}, - {-0.004248f, -0.027902f, -0.065637f, +0.005103f, +0.010905f, +0.003977f, -0.000099f} - }, - { - {-0.000121f, +0.168818f, -0.170063f, +0.020644f, +0.002958f, -0.003463f, +0.000046f}, - {-0.000011f, +0.194924f, -0.223064f, +0.022796f, +0.001087f, +0.000493f, +0.000117f}, - {+0.000547f, +0.029503f, -0.053171f, -0.000739f, -0.000657f, -0.002145f, +0.000015f}, - {-0.000242f, +0.117372f, +0.034986f, +0.015156f, +0.005707f, -0.008083f, -0.000136f}, - {+0.000080f, +0.024155f, +0.034423f, +0.005036f, -0.006191f, -0.007152f, -0.000179f}, - {+0.005094f, +0.032260f, -0.054141f, -0.008306f, -0.004720f, -0.002533f, +0.000274f}, - {+0.001279f, -0.165394f, -0.065559f, -0.023240f, +0.007945f, -0.001409f, -0.000067f}, - {-0.002856f, +0.009409f, +0.091949f, -0.005615f, +0.001544f, +0.004433f, +0.000065f}, - {+0.002405f, +0.052072f, +0.137955f, +0.003382f, +0.011200f, +0.000365f, +0.000319f}, - {-0.002077f, +0.047717f, +0.093664f, -0.010132f, +0.009074f, +0.004134f, +0.000010f}, - {+0.000926f, -0.043776f, +0.057405f, +0.004440f, -0.000684f, -0.002365f, +0.000282f}, - {-0.002540f, -0.085351f, -0.109742f, -0.018492f, +0.001709f, -0.008584f, +0.000206f}, - {-0.001618f, -0.009925f, -0.064822f, -0.004580f, +0.010301f, -0.020636f, +0.000410f}, - {-0.000126f, -0.171921f, -0.079783f, -0.018973f, +0.006091f, +0.015039f, +0.000181f}, - {-0.005881f, -0.031229f, +0.141619f, +0.011585f, -0.000326f, +0.012033f, -0.000629f}, - {-0.001344f, +0.104987f, +0.102295f, +0.010501f, +0.005542f, -0.003423f, -0.000124f} - }, - { - {+0.000665f, -0.123778f, +0.280425f, -0.018756f, -0.000671f, -0.000509f, -0.000067f}, - {+0.001583f, -0.162600f, +0.316923f, -0.023267f, -0.000975f, +0.003785f, -0.000038f}, - {+0.001379f, -0.026831f, +0.023970f, -0.006255f, -0.004902f, +0.000112f, +0.000081f}, - {+0.000562f, -0.030460f, +0.260600f, +0.000624f, -0.000602f, -0.007719f, -0.000080f}, - {-0.002993f, -0.002642f, +0.081219f, +0.000884f, -0.006660f, -0.009580f, -0.000060f}, - {-0.000597f, -0.004283f, +0.008621f, -0.007685f, -0.005971f, +0.001193f, +0.000047f}, - {-0.005508f, +0.031003f, -0.344879f, +0.005634f, +0.007605f, -0.002853f, +0.000190f}, - {+0.001858f, +0.007685f, +0.058337f, +0.000024f, -0.000621f, +0.003685f, +0.000209f}, - {-0.000813f, +0.038640f, +0.157464f, +0.006533f, +0.001576f, +0.003906f, -0.000022f}, - {+0.004224f, -0.021225f, +0.166071f, -0.006069f, +0.003399f, +0.001042f, -0.000214f}, - {-0.002033f, +0.060718f, -0.091992f, +0.004611f, -0.002942f, +0.001595f, +0.000196f}, - {-0.004127f, -0.004531f, -0.205174f, -0.009365f, +0.001070f, -0.003179f, -0.000289f}, - {+0.000150f, -0.029538f, -0.068904f, -0.000402f, -0.005147f, -0.003972f, -0.000769f}, - {-0.004079f, -0.017972f, -0.257424f, -0.008455f, +0.006187f, +0.013312f, +0.000198f}, - {+0.002517f, +0.012776f, +0.062784f, +0.003145f, +0.009655f, -0.004343f, +0.000614f}, - {+0.005049f, +0.022035f, +0.199714f, +0.007109f, +0.003089f, -0.003875f, +0.000168f} - }, - { - {-0.000838f, -0.093482f, +0.340134f, -0.010503f, +0.000289f, +0.001191f, +0.000003f}, - {+0.000716f, -0.099685f, +0.420241f, -0.008436f, +0.000064f, +0.003115f, -0.000044f}, - {-0.000556f, -0.021255f, +0.062613f, -0.000941f, -0.000204f, +0.000715f, -0.000034f}, - {-0.001430f, -0.100524f, +0.149323f, -0.011872f, -0.001590f, -0.004527f, +0.000235f}, - {-0.000230f, -0.032021f, +0.018295f, -0.004614f, +0.002734f, -0.001951f, +0.000193f}, - {-0.002656f, -0.009804f, +0.038729f, -0.000163f, -0.001790f, +0.000822f, -0.000256f}, - {+0.000612f, +0.140653f, -0.197385f, +0.019089f, +0.002585f, -0.003213f, -0.000031f}, - {+0.002670f, -0.040336f, -0.020386f, -0.004271f, -0.002055f, -0.001343f, -0.000109f}, - {-0.001845f, -0.078760f, -0.020200f, -0.013056f, -0.006124f, -0.004360f, -0.000331f}, - {+0.000970f, -0.117325f, +0.055613f, -0.005023f, -0.004912f, -0.004803f, -0.000116f}, - {-0.002683f, +0.035606f, -0.126398f, +0.002472f, +0.000580f, +0.000376f, -0.000241f}, - {+0.000497f, +0.114405f, -0.055418f, +0.003763f, +0.003364f, +0.001371f, -0.000155f}, - {-0.000345f, +0.007312f, +0.001802f, -0.002287f, +0.000791f, +0.008770f, +0.000007f}, - {+0.000789f, +0.144128f, -0.097885f, +0.006241f, +0.005947f, +0.001436f, -0.000489f}, - {+0.001963f, -0.040204f, -0.034424f, +0.000413f, +0.000091f, -0.010270f, +0.000273f}, - {-0.002689f, -0.084084f, +0.069751f, -0.006898f, -0.004644f, -0.006109f, +0.000091f} - }, - { - {-0.000062f, +0.159834f, -0.044876f, +0.021415f, +0.000841f, +0.001074f, +0.000061f}, - {-0.001939f, +0.203019f, -0.024500f, +0.028206f, +0.000129f, +0.000129f, +0.000014f}, - {-0.002057f, +0.017619f, +0.007554f, +0.001544f, +0.005642f, -0.000830f, -0.000029f}, - {+0.001889f, +0.080220f, -0.136610f, +0.012668f, -0.006511f, +0.005422f, -0.000119f}, - {+0.004765f, +0.006329f, -0.052477f, +0.003995f, -0.004263f, +0.009557f, -0.000103f}, - {-0.001047f, -0.021879f, +0.034445f, +0.001105f, +0.002961f, -0.002057f, +0.000104f}, - {+0.004934f, -0.125025f, +0.182894f, -0.007200f, -0.003809f, +0.003213f, -0.000175f}, - {-0.002421f, +0.038737f, -0.100988f, -0.002296f, +0.002905f, -0.006173f, -0.000222f}, - {+0.000637f, -0.009843f, -0.137662f, -0.007085f, -0.001227f, -0.007524f, +0.000084f}, - {-0.007111f, -0.006449f, -0.088114f, +0.008144f, -0.012101f, -0.002453f, +0.000119f}, - {+0.005822f, -0.035186f, -0.014091f, -0.019245f, +0.005040f, -0.002938f, -0.000098f}, - {+0.006158f, -0.034676f, +0.151427f, -0.007632f, -0.002292f, +0.003956f, +0.000311f}, - {-0.001390f, -0.073913f, +0.146335f, -0.009450f, +0.000888f, +0.008018f, +0.000743f}, - {+0.004580f, +0.035022f, +0.074565f, -0.008788f, +0.011150f, -0.012728f, +0.000186f}, - {+0.001196f, +0.053254f, -0.158975f, +0.007007f, +0.001158f, -0.005679f, -0.000680f}, - {-0.002227f, +0.044207f, -0.133488f, +0.008158f, -0.004916f, -0.004020f, -0.000190f} - }, - { - {+0.000424f, -0.032674f, -0.356108f, -0.006297f, +0.001097f, +0.001061f, -0.000058f}, - {-0.000331f, -0.053597f, -0.429631f, -0.007025f, +0.000454f, -0.001923f, +0.000032f}, - {+0.001733f, +0.005170f, -0.045501f, -0.004142f, +0.003057f, -0.000513f, -0.000016f}, - {-0.001720f, +0.029775f, -0.211691f, +0.005967f, -0.004600f, +0.009540f, -0.000129f}, - {-0.003261f, +0.003682f, -0.039174f, +0.006311f, -0.004814f, +0.010936f, -0.000074f}, - {+0.004648f, -0.024711f, -0.003591f, -0.006146f, +0.002500f, +0.000881f, +0.000107f}, - {-0.002617f, -0.049330f, +0.327007f, -0.003104f, +0.001710f, +0.009526f, +0.000033f}, - {-0.001001f, +0.058705f, -0.071001f, -0.004213f, +0.002311f, -0.003340f, +0.000235f}, - {+0.002783f, +0.023155f, -0.088891f, -0.001723f, +0.002778f, +0.002314f, +0.000343f}, - {+0.004839f, +0.023086f, -0.116501f, -0.000949f, +0.001446f, +0.005599f, +0.000354f}, - {-0.001118f, -0.002046f, +0.076766f, -0.001535f, +0.005295f, +0.001162f, +0.000125f}, - {-0.004117f, -0.023659f, +0.189693f, -0.013335f, +0.005698f, +0.006219f, +0.000048f}, - {+0.003062f, -0.013670f, +0.192441f, -0.001116f, +0.004652f, +0.002330f, -0.000476f}, - {-0.004154f, -0.034087f, +0.046539f, -0.008864f, -0.000241f, -0.015872f, +0.000426f}, - {-0.003487f, +0.020767f, -0.154091f, +0.014880f, +0.001191f, +0.001914f, +0.000136f}, - {+0.003932f, -0.000386f, -0.191705f, +0.012921f, -0.005465f, +0.004477f, -0.000047f} - }, - { - {+0.000471f, -0.125486f, -0.221411f, -0.014986f, -0.000180f, +0.001120f, +0.000009f}, - {+0.001600f, -0.154646f, -0.294774f, -0.015891f, -0.000266f, -0.001489f, -0.000008f}, - {+0.001375f, -0.000822f, -0.034636f, -0.001147f, -0.000669f, +0.000303f, +0.000008f}, - {+0.000977f, -0.092422f, -0.024070f, -0.009222f, -0.001056f, +0.003997f, +0.000206f}, - {-0.001682f, -0.020814f, +0.011430f, -0.004002f, +0.001343f, +0.002884f, +0.000166f}, - {-0.001610f, +0.020045f, -0.049480f, +0.001742f, +0.001532f, +0.002781f, -0.000115f}, - {-0.002135f, +0.091172f, +0.125333f, +0.008360f, +0.009208f, +0.002398f, +0.000271f}, - {+0.000371f, -0.059373f, +0.078618f, -0.014453f, -0.004219f, +0.001057f, +0.000062f}, - {-0.002725f, -0.015489f, -0.009239f, -0.003738f, +0.000560f, +0.006181f, -0.000199f}, - {+0.002826f, +0.007173f, -0.085964f, +0.001891f, +0.012728f, +0.005161f, -0.000323f}, - {-0.004495f, +0.013763f, +0.058388f, -0.007410f, +0.005720f, +0.002360f, +0.000110f}, - {-0.002552f, +0.045600f, +0.070285f, +0.007922f, +0.003344f, +0.005570f, -0.000207f}, - {-0.000488f, +0.136917f, -0.026687f, +0.005457f, +0.012392f, -0.001210f, -0.000307f}, - {+0.000451f, +0.008875f, -0.051701f, +0.006069f, -0.021340f, +0.001926f, -0.000475f}, - {-0.001377f, -0.105876f, +0.039317f, -0.008020f, -0.005229f, +0.004339f, +0.000386f}, - {-0.001213f, -0.076122f, -0.061268f, -0.003217f, -0.002369f, +0.004826f, +0.000159f} - }, - { - {-0.000524f, +0.118676f, +0.170583f, +0.019688f, -0.001664f, -0.000923f, +0.000041f}, - {+0.000654f, +0.156016f, +0.194337f, +0.028557f, -0.002840f, -0.004101f, -0.000028f}, - {-0.002302f, +0.008782f, +0.011429f, +0.001323f, +0.000895f, +0.003407f, +0.000105f}, - {+0.000032f, +0.046067f, +0.185629f, +0.008390f, -0.003160f, -0.003746f, -0.000055f}, - {+0.002663f, +0.026672f, +0.064125f, -0.000262f, -0.001472f, -0.005261f, -0.000110f}, - {-0.003119f, +0.016242f, -0.044580f, +0.000850f, +0.000791f, +0.003258f, +0.000018f}, - {+0.002001f, -0.070898f, -0.146048f, -0.006424f, +0.007312f, -0.003256f, -0.000170f}, - {+0.002429f, -0.028724f, +0.132991f, -0.002905f, -0.000259f, +0.001749f, -0.000211f}, - {-0.000713f, +0.004019f, +0.012770f, -0.001359f, -0.002043f, +0.004710f, -0.000292f}, - {-0.005685f, +0.050322f, +0.008163f, +0.004254f, +0.000823f, -0.001200f, -0.000403f}, - {+0.002632f, -0.030192f, -0.022068f, -0.012383f, +0.005270f, +0.001676f, -0.000059f}, - {+0.003305f, -0.018641f, -0.063460f, -0.003826f, +0.000188f, +0.000343f, -0.000082f}, - {-0.002515f, -0.058603f, -0.271848f, -0.008489f, +0.005764f, -0.000219f, +0.000545f}, - {+0.000161f, +0.016378f, -0.070205f, -0.000824f, -0.012915f, +0.010864f, -0.000122f}, - {+0.003698f, +0.037366f, +0.216969f, +0.003644f, -0.004534f, +0.002030f, -0.000224f}, - {-0.002468f, +0.016801f, +0.081543f, +0.007748f, +0.001230f, +0.004507f, +0.000051f} - }, - { - {-0.001145f, +0.003284f, +0.355844f, +0.004455f, -0.002189f, -0.000719f, -0.000061f}, - {-0.002423f, +0.000161f, +0.457860f, +0.005943f, -0.007595f, -0.001864f, +0.000021f}, - {-0.000051f, -0.012564f, +0.029260f, -0.001225f, +0.006975f, +0.002016f, -0.000066f}, - {-0.000428f, +0.050774f, +0.180925f, +0.010634f, -0.004654f, -0.005688f, -0.000097f}, - {-0.000090f, +0.027979f, +0.070853f, +0.000692f, -0.004995f, -0.008846f, -0.000049f}, - {+0.002760f, -0.025210f, -0.010985f, +0.001189f, +0.005880f, +0.001877f, +0.000037f}, - {-0.000244f, -0.010407f, -0.222937f, -0.003909f, +0.000862f, -0.004776f, -0.000303f}, - {-0.000425f, +0.069076f, +0.010384f, +0.006056f, +0.004388f, -0.000601f, +0.000104f}, - {+0.002311f, +0.019613f, -0.027315f, +0.005251f, +0.003443f, -0.001807f, +0.000316f}, - {+0.002211f, -0.010183f, +0.073548f, -0.000883f, +0.001915f, -0.009035f, +0.000618f}, - {+0.002248f, +0.008483f, -0.068380f, -0.004591f, +0.002268f, +0.001620f, -0.000165f}, - {+0.000648f, +0.009242f, -0.099359f, +0.000641f, -0.000197f, -0.006109f, +0.000157f}, - {-0.000774f, -0.111787f, -0.198070f, -0.017791f, -0.003222f, +0.006877f, -0.000137f}, - {+0.001138f, -0.044856f, +0.026044f, -0.009715f, -0.000846f, +0.004152f, +0.000446f}, - {+0.002544f, +0.087438f, +0.155678f, +0.005423f, +0.002722f, -0.003124f, -0.000080f}, - {+0.003560f, +0.014887f, +0.074843f, +0.008219f, +0.006652f, +0.002902f, -0.000131f} - }, - { - {+0.001890f, -0.134764f, +0.131961f, -0.012234f, -0.002738f, +0.000823f, +0.000033f}, - {+0.001070f, -0.173165f, +0.189994f, -0.013988f, -0.004534f, +0.003798f, -0.000004f}, - {+0.001640f, -0.008324f, +0.014514f, -0.002435f, +0.003083f, -0.002251f, -0.000150f}, - {+0.000264f, -0.073721f, -0.011380f, -0.005780f, -0.000967f, -0.002807f, +0.000095f}, - {+0.000194f, -0.034600f, -0.001603f, +0.002002f, -0.001582f, -0.004833f, +0.000182f}, - {+0.000248f, +0.009914f, +0.030975f, +0.000054f, +0.001998f, -0.003302f, -0.000047f}, - {+0.001104f, +0.068456f, -0.089528f, +0.005666f, +0.000783f, -0.000511f, +0.000430f}, - {-0.003829f, -0.022153f, -0.133797f, -0.009639f, +0.004395f, -0.000747f, +0.000011f}, - {-0.000699f, +0.010044f, -0.035723f, +0.000046f, -0.000099f, -0.006045f, +0.000154f}, - {+0.000909f, -0.038046f, +0.036614f, -0.002380f, +0.002487f, -0.007961f, +0.000174f}, - {-0.001908f, +0.026952f, -0.036236f, -0.000119f, -0.002271f, +0.000602f, +0.000080f}, - {-0.001603f, +0.029285f, -0.049821f, +0.000247f, -0.000217f, -0.005046f, +0.000216f}, - {+0.006472f, +0.116293f, +0.099963f, -0.000867f, -0.010550f, +0.001434f, -0.000225f}, - {-0.000453f, -0.006679f, +0.094671f, -0.004526f, -0.002369f, -0.000013f, -0.000073f}, - {-0.005967f, -0.109642f, -0.072567f, +0.006836f, +0.010874f, -0.002506f, +0.000008f}, - {-0.001623f, -0.037979f, -0.009548f, -0.002077f, +0.000249f, -0.003764f, -0.000113f} - }, - { - {-0.000170f, +0.121984f, -0.255345f, +0.010962f, +0.000155f, -0.000211f, +0.000029f}, - {+0.000042f, +0.155814f, -0.316189f, +0.015901f, +0.001529f, +0.002239f, +0.000003f}, - {-0.000912f, +0.011590f, +0.001094f, -0.000549f, +0.000258f, -0.004276f, +0.000153f}, - {-0.001078f, +0.027059f, -0.170587f, +0.004222f, +0.000643f, -0.000450f, -0.000026f}, - {-0.003305f, +0.001532f, -0.066652f, +0.008505f, -0.003277f, +0.000811f, -0.000150f}, - {-0.000389f, +0.020611f, +0.035423f, -0.007402f, +0.004051f, -0.005415f, +0.000014f}, - {-0.000366f, -0.068284f, +0.107122f, +0.001280f, -0.004037f, +0.003881f, +0.000063f}, - {+0.002188f, -0.047371f, -0.125091f, -0.009984f, -0.000445f, +0.000567f, -0.000063f}, - {-0.000440f, -0.020603f, +0.011508f, -0.007936f, -0.000995f, -0.001820f, -0.000353f}, - {-0.001083f, +0.027481f, -0.055464f, +0.007462f, -0.003849f, +0.002769f, -0.000734f}, - {-0.000833f, -0.000243f, -0.003680f, -0.002365f, +0.003551f, -0.005372f, +0.000154f}, - {+0.000131f, -0.044971f, +0.042558f, -0.000985f, -0.001169f, -0.001543f, -0.000319f}, - {-0.004626f, +0.038285f, +0.245476f, +0.003432f, -0.002348f, -0.009039f, +0.000192f}, - {+0.000118f, +0.032215f, +0.016390f, +0.016314f, -0.000536f, +0.000779f, -0.000274f}, - {-0.001673f, -0.067100f, -0.155922f, +0.006074f, +0.005539f, +0.002669f, +0.000075f}, - {-0.001163f, +0.016021f, -0.074264f, -0.004922f, -0.001151f, -0.006794f, +0.000180f} - }, - { - {-0.001297f, +0.019051f, -0.402417f, +0.000141f, +0.000604f, -0.001174f, -0.000063f}, - {+0.001300f, +0.028611f, -0.522073f, -0.003618f, +0.001002f, +0.001630f, +0.000006f}, - {+0.000497f, +0.002152f, +0.001349f, +0.003743f, -0.001574f, -0.003439f, +0.000141f}, - {+0.002920f, +0.034877f, -0.171496f, -0.000170f, -0.001439f, +0.001183f, +0.000002f}, - {+0.003419f, +0.015347f, -0.076929f, -0.000130f, +0.000288f, +0.004503f, -0.000040f}, - {-0.001320f, -0.012141f, +0.002094f, -0.004277f, +0.004118f, -0.002479f, +0.000060f}, - {-0.004180f, -0.013179f, +0.192192f, +0.004645f, -0.001451f, +0.001106f, -0.000485f}, - {+0.003209f, +0.039833f, +0.008962f, -0.002291f, -0.002391f, +0.004465f, +0.000122f}, - {-0.000607f, -0.005611f, +0.042134f, +0.000975f, +0.004638f, +0.004045f, +0.000008f}, - {+0.000627f, +0.026309f, -0.067454f, +0.006167f, -0.000843f, +0.011514f, +0.000137f}, - {-0.001193f, +0.006474f, +0.018477f, -0.002724f, +0.008795f, -0.001731f, -0.000074f}, - {-0.001257f, -0.008752f, +0.087176f, -0.004699f, +0.002039f, +0.003933f, -0.000164f}, - {-0.003124f, -0.033471f, +0.148053f, -0.005001f, +0.001533f, -0.010338f, -0.000015f}, - {-0.002890f, +0.001944f, -0.047134f, +0.004337f, -0.002030f, -0.001172f, +0.000046f}, - {+0.008908f, +0.054837f, -0.040335f, +0.007026f, -0.006365f, -0.001572f, +0.000146f}, - {+0.002478f, +0.029038f, -0.064961f, -0.006465f, -0.005250f, -0.005303f, +0.000152f} - }, - { - {+0.000160f, -0.150600f, -0.167483f, -0.002920f, +0.001475f, -0.001963f, +0.000024f}, - {-0.001668f, -0.172130f, -0.218810f, -0.011191f, -0.002834f, +0.003154f, -0.000022f}, - {-0.000950f, +0.022722f, -0.027772f, +0.005005f, -0.008512f, +0.003955f, -0.000238f}, - {-0.003019f, -0.054068f, -0.033941f, +0.003539f, -0.011136f, +0.005659f, +0.000016f}, - {+0.001078f, -0.021690f, +0.006189f, -0.016829f, +0.000777f, +0.009514f, +0.000199f}, - {+0.001056f, +0.014729f, -0.053067f, +0.011823f, -0.007368f, +0.001542f, -0.000064f}, - {+0.004918f, +0.007213f, +0.138765f, -0.001533f, +0.020500f, -0.011761f, +0.000227f}, - {-0.002554f, +0.001966f, +0.107627f, -0.006775f, -0.003533f, +0.005048f, -0.000080f}, - {+0.001525f, +0.005137f, +0.030090f, +0.004553f, +0.004049f, +0.000454f, +0.000282f}, - {+0.001023f, -0.024143f, +0.037424f, -0.014519f, -0.001289f, +0.011651f, +0.000625f}, - {+0.005161f, -0.022730f, +0.068907f, -0.020272f, +0.012850f, +0.000495f, -0.000137f}, - {+0.002866f, +0.007080f, +0.063234f, -0.003391f, +0.009373f, -0.003426f, +0.000457f}, - {+0.004560f, +0.037001f, -0.014139f, +0.007335f, +0.000343f, -0.005090f, -0.000062f}, - {+0.004001f, -0.046592f, +0.005932f, -0.011122f, +0.012141f, -0.007595f, +0.000216f}, - {-0.003776f, +0.041534f, +0.044983f, +0.002268f, -0.019627f, +0.007804f, -0.000235f}, - {-0.001820f, +0.010184f, -0.049175f, +0.013588f, -0.018697f, +0.002250f, -0.000303f} - }, - { - {+0.001483f, +0.113867f, +0.209976f, +0.008819f, +0.000797f, +0.000400f, +0.000036f}, - {-0.001045f, +0.192142f, +0.298750f, +0.001463f, -0.003654f, -0.001788f, +0.000013f}, - {-0.000040f, +0.023922f, -0.061440f, -0.008880f, -0.004791f, +0.003847f, -0.000085f}, - {+0.000147f, +0.077957f, +0.126838f, -0.004370f, -0.007202f, +0.002392f, -0.000067f}, - {-0.004543f, +0.091348f, +0.161744f, -0.013831f, -0.000476f, -0.002348f, -0.000151f}, - {+0.000341f, +0.019385f, -0.074320f, -0.002090f, -0.004165f, +0.003633f, -0.000059f}, - {+0.002008f, -0.125477f, -0.001322f, +0.010977f, +0.014241f, -0.001824f, +0.000290f}, - {-0.004051f, +0.054488f, +0.153092f, -0.011645f, -0.001154f, -0.003507f, -0.000105f}, - {-0.000902f, +0.009313f, +0.026711f, -0.001561f, +0.002462f, -0.001947f, -0.000100f}, - {-0.005033f, +0.126661f, +0.230194f, -0.017832f, -0.001367f, -0.007110f, -0.000344f}, - {-0.003668f, +0.007071f, +0.130982f, -0.007450f, +0.007821f, -0.001798f, +0.000031f}, - {-0.000349f, -0.045688f, +0.017878f, +0.008768f, +0.007271f, -0.001089f, -0.000044f}, - {+0.002677f, -0.079470f, -0.153864f, +0.014296f, +0.003485f, +0.006916f, +0.000050f}, - {+0.000709f, -0.042448f, +0.071138f, +0.007687f, +0.009513f, -0.002541f, +0.000023f}, - {-0.005626f, +0.054309f, +0.055654f, -0.010333f, -0.012042f, +0.002191f, -0.000096f}, - {+0.000446f, +0.021484f, -0.057903f, -0.001636f, -0.008439f, +0.007563f, -0.000076f} - }, - { - {-0.000930f, -0.020638f, +0.420161f, -0.006289f, +0.001114f, +0.002023f, -0.000034f}, - {+0.002837f, -0.034360f, +0.606921f, -0.008940f, +0.000248f, -0.004013f, +0.000004f}, - {+0.001816f, -0.018994f, -0.028978f, +0.005755f, -0.001492f, +0.000000f, +0.000298f}, - {+0.002308f, -0.019936f, +0.239454f, +0.000948f, +0.000097f, -0.002454f, +0.000065f}, - {+0.003108f, -0.010786f, +0.269338f, -0.002735f, -0.001820f, -0.004439f, -0.000049f}, - {-0.000084f, -0.020355f, -0.030329f, +0.004050f, -0.000527f, +0.001894f, +0.000134f}, - {-0.006890f, +0.046136f, -0.183299f, -0.002301f, +0.001456f, +0.008977f, -0.000300f}, - {+0.005979f, +0.011056f, +0.166257f, -0.005656f, -0.000834f, -0.005892f, +0.000154f}, - {+0.000154f, -0.000560f, +0.037346f, -0.001460f, -0.000032f, +0.000167f, -0.000173f}, - {+0.006662f, +0.002010f, +0.363378f, -0.010169f, -0.000884f, -0.009588f, -0.000407f}, - {-0.001078f, +0.029016f, +0.107209f, -0.006938f, -0.002205f, +0.002827f, +0.000183f}, - {-0.002893f, +0.028022f, -0.051556f, -0.008217f, +0.001222f, +0.004671f, -0.000375f}, - {-0.006494f, +0.014380f, -0.224961f, -0.002217f, +0.001654f, +0.010259f, +0.000017f}, - {-0.005137f, +0.012085f, +0.032649f, +0.001820f, +0.001318f, +0.004157f, -0.000284f}, - {+0.005483f, -0.014476f, +0.074456f, +0.002422f, -0.001376f, -0.006421f, +0.000309f}, - {+0.000296f, -0.028549f, -0.015223f, +0.007439f, +0.000560f, +0.001646f, +0.000380f} - }, - { - {-0.000574f, -0.054293f, +0.393027f, +0.004619f, +0.000499f, +0.001616f, -0.000019f}, - {-0.000630f, -0.085858f, +0.559718f, +0.004183f, +0.003387f, -0.002961f, +0.000006f}, - {-0.001166f, +0.017046f, +0.023078f, -0.007491f, +0.000205f, -0.001361f, -0.000017f}, - {-0.001175f, -0.022635f, +0.244404f, -0.001647f, +0.001066f, -0.003008f, +0.000032f}, - {+0.000156f, -0.031998f, +0.255427f, +0.002202f, +0.001796f, -0.001974f, +0.000172f}, - {-0.000878f, +0.017961f, +0.022887f, -0.005377f, +0.000188f, +0.000893f, -0.000012f}, - {+0.001948f, +0.014963f, -0.247765f, +0.005780f, -0.004433f, +0.007643f, -0.000121f}, - {-0.000159f, -0.041909f, +0.136394f, +0.007153f, +0.001725f, -0.004022f, +0.000071f}, - {-0.000219f, +0.000958f, +0.044869f, -0.002129f, -0.000524f, +0.001494f, +0.000102f}, - {-0.001816f, -0.063742f, +0.323681f, +0.008953f, +0.002758f, -0.004170f, +0.000396f}, - {+0.001419f, -0.031078f, +0.037154f, +0.008056f, +0.000641f, +0.003359f, -0.000045f}, - {+0.001164f, -0.009969f, -0.088648f, +0.011556f, -0.002492f, +0.005256f, +0.000124f}, - {+0.000693f, +0.026444f, -0.217624f, +0.005106f, -0.001448f, +0.007023f, -0.000105f}, - {+0.002214f, +0.001591f, -0.021758f, +0.001337f, -0.002244f, +0.004794f, +0.000016f}, - {+0.001396f, -0.022948f, +0.061227f, -0.000339f, +0.002823f, -0.006287f, +0.000004f}, - {-0.000222f, +0.016030f, +0.027796f, -0.010434f, +0.001167f, -0.001268f, -0.000077f} - }, - { - {+0.000537f, +0.069689f, +0.259996f, -0.015449f, -0.001689f, +0.000567f, +0.000032f}, - {-0.001883f, +0.105131f, +0.355263f, -0.018765f, -0.003133f, -0.000450f, -0.000016f}, - {-0.001138f, -0.018001f, +0.039839f, +0.012701f, +0.001219f, -0.000708f, -0.000287f}, - {-0.001263f, +0.029165f, +0.184940f, -0.003746f, -0.001169f, -0.001726f, -0.000098f}, - {-0.001083f, +0.037001f, +0.183894f, -0.007086f, -0.000486f, +0.000197f, -0.000096f}, - {+0.000342f, -0.013484f, +0.044965f, +0.006682f, +0.000921f, +0.000263f, -0.000136f}, - {+0.004481f, -0.021461f, -0.201741f, -0.003038f, +0.001363f, +0.001843f, +0.000265f}, - {-0.003961f, +0.024164f, +0.091417f, -0.008821f, -0.001712f, +0.000129f, -0.000204f}, - {+0.000207f, -0.002976f, +0.043954f, +0.001501f, +0.000276f, +0.000942f, +0.000107f}, - {-0.003639f, +0.052765f, +0.205252f, -0.011783f, -0.003716f, +0.001190f, +0.000192f}, - {+0.001689f, +0.023190f, -0.011247f, -0.010783f, +0.001786f, +0.002313f, -0.000212f}, - {+0.002372f, +0.004818f, -0.082129f, -0.010451f, -0.000189f, +0.001709f, +0.000272f}, - {+0.004804f, -0.020405f, -0.173555f, +0.002649f, +0.003189f, +0.001117f, +0.000066f}, - {+0.003227f, +0.010050f, -0.037377f, -0.001735f, +0.000749f, +0.001463f, +0.000329f}, - {-0.003142f, +0.023239f, +0.029929f, -0.001310f, -0.001621f, -0.001432f, -0.000309f}, - {-0.000053f, -0.009013f, +0.034476f, +0.011295f, +0.001661f, -0.001432f, -0.000323f} - }, - { - {+0.000467f, -0.049431f, +0.174512f, +0.052213f, -0.000379f, -0.000628f, +0.000018f}, - {+0.000675f, -0.068601f, +0.232702f, +0.078966f, -0.000387f, +0.001035f, -0.000020f}, - {+0.001138f, +0.009378f, +0.010305f, -0.023458f, -0.000156f, +0.000528f, +0.000103f}, - {+0.001051f, -0.021900f, +0.128073f, +0.018761f, +0.000854f, -0.000050f, +0.000029f}, - {+0.000093f, -0.025010f, +0.130739f, +0.024552f, +0.000063f, +0.000892f, -0.000054f}, - {+0.000652f, +0.002376f, +0.032485f, -0.008631f, -0.000330f, -0.000880f, +0.000082f}, - {-0.002083f, +0.015096f, -0.126566f, -0.008147f, -0.000445f, -0.003114f, +0.000045f}, - {+0.000739f, -0.009298f, +0.065194f, +0.025419f, +0.000920f, +0.003361f, -0.000035f}, - {+0.000258f, -0.000954f, +0.037598f, +0.000767f, +0.001217f, -0.000373f, -0.000075f}, - {+0.002042f, -0.033396f, +0.132174f, +0.040199f, -0.000207f, +0.002266f, -0.000307f}, - {-0.001414f, -0.014255f, -0.004390f, +0.026628f, -0.001532f, +0.000025f, +0.000092f}, - {-0.001280f, -0.002059f, -0.050357f, +0.008951f, -0.001342f, -0.002619f, -0.000087f}, - {-0.001481f, +0.009694f, -0.129207f, -0.015305f, -0.002740f, -0.004354f, +0.000130f}, - {-0.002380f, -0.004808f, -0.023046f, -0.002372f, +0.000308f, -0.001841f, -0.000118f}, - {-0.000907f, -0.004256f, +0.006995f, +0.009818f, -0.000916f, +0.002740f, +0.000058f}, - {+0.000120f, +0.004044f, +0.004424f, -0.021221f, +0.000105f, -0.000062f, +0.000164f} - } -}; - -const float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]= -{ - { - {-0.007849f, -0.189662f, +0.310868f, +0.002657f, -0.000617f, -0.002064f, +0.000079f}, - {+0.006499f, -0.151239f, +0.295372f, -0.093873f, -0.006692f, +0.006119f, +0.000079f}, - {+0.018156f, -0.036738f, -0.002366f, +0.025349f, -0.033780f, +0.029927f, -0.001760f}, - {-0.001185f, -0.014058f, +0.058055f, -0.022315f, +0.001895f, +0.011251f, -0.001195f}, - {+0.007055f, -0.018561f, +0.015516f, +0.000397f, -0.002631f, +0.012108f, -0.001368f}, - {+0.011104f, -0.020008f, +0.011257f, +0.004500f, -0.004699f, +0.010150f, -0.001162f}, - {+0.015585f, -0.011962f, -0.031150f, +0.029687f, -0.015292f, +0.011837f, -0.001505f}, - {+0.017335f, -0.020280f, -0.052951f, +0.022099f, -0.000113f, +0.011817f, -0.000989f}, - {-0.000629f, -0.006228f, +0.019972f, -0.009129f, +0.003758f, -0.000470f, -0.000086f}, - {-0.000511f, +0.004432f, +0.002064f, -0.001344f, -0.004868f, +0.004917f, -0.000206f}, - {+0.002632f, -0.004614f, +0.009077f, +0.002040f, -0.003834f, +0.003681f, -0.000651f}, - {-0.004163f, +0.016169f, +0.009480f, -0.010379f, +0.001561f, -0.007873f, +0.000482f}, - {-0.007762f, +0.010368f, +0.015510f, +0.005022f, -0.004378f, -0.005468f, +0.000778f}, - {+0.000368f, -0.001287f, +0.003269f, -0.005109f, +0.003959f, -0.005552f, +0.000443f}, - {+0.007637f, -0.013100f, -0.008745f, +0.008594f, +0.001266f, +0.005515f, -0.000260f}, - {+0.003252f, -0.007772f, +0.002549f, -0.008685f, -0.000484f, +0.004879f, -0.000366f} - }, - { - {+0.003434f, +0.064136f, +0.596947f, -0.012925f, -0.012105f, -0.006348f, +0.000052f}, - {-0.006872f, -0.208738f, +0.430749f, +0.043085f, -0.005819f, +0.002350f, -0.000212f}, - {+0.005116f, -0.046396f, -0.012121f, +0.006015f, -0.006889f, +0.045123f, -0.000620f}, - {+0.007618f, +0.010992f, +0.040544f, -0.058428f, +0.022475f, +0.032839f, -0.000538f}, - {+0.005563f, -0.030740f, +0.013780f, +0.007345f, +0.017136f, +0.029360f, -0.000627f}, - {+0.007549f, -0.029664f, +0.026873f, +0.020401f, +0.009762f, +0.021968f, -0.000592f}, - {+0.015806f, -0.023439f, -0.030157f, +0.046969f, -0.012661f, +0.017740f, -0.000763f}, - {+0.013074f, -0.053955f, -0.091847f, +0.002101f, +0.025917f, +0.039011f, -0.000578f}, - {-0.007104f, -0.011492f, -0.004920f, -0.020806f, +0.019718f, +0.010737f, -0.000003f}, - {-0.005199f, +0.005331f, +0.027619f, +0.007498f, -0.002840f, +0.009453f, -0.000077f}, - {+0.010618f, +0.009204f, +0.036117f, +0.025558f, +0.004764f, +0.003733f, -0.000485f}, - {+0.004277f, +0.034749f, +0.019826f, -0.021144f, -0.023168f, -0.026165f, +0.000230f}, - {-0.001540f, +0.026510f, +0.043031f, +0.037355f, -0.014051f, -0.021793f, +0.000440f}, - {-0.000688f, +0.004194f, +0.023981f, +0.008644f, -0.009505f, -0.014330f, +0.000422f}, - {+0.007017f, -0.006121f, -0.001366f, +0.017321f, +0.021133f, +0.020778f, +0.000064f}, - {+0.001808f, -0.009372f, -0.001227f, -0.016870f, -0.000030f, +0.010680f, -0.000179f} - }, - { - {-0.000173f, +0.307249f, +0.141892f, +0.046866f, -0.017599f, -0.001859f, -0.000115f}, - {+0.006073f, +0.167540f, -0.082726f, +0.078686f, -0.003574f, -0.012765f, -0.000025f}, - {-0.025314f, -0.107553f, +0.097665f, -0.029881f, +0.045910f, +0.001205f, +0.001921f}, - {-0.017044f, +0.048408f, -0.041355f, -0.070138f, +0.036357f, +0.026423f, +0.001421f}, - {-0.015939f, +0.012147f, -0.007879f, -0.022686f, +0.043895f, +0.005350f, +0.001553f}, - {-0.021597f, -0.029155f, +0.035998f, +0.007977f, +0.049474f, -0.004557f, +0.001326f}, - {-0.036021f, +0.006766f, +0.026953f, +0.016862f, +0.032122f, -0.017257f, +0.001676f}, - {-0.031554f, -0.089831f, +0.085198f, -0.028444f, +0.031117f, +0.004947f, +0.001188f}, - {+0.007547f, +0.066302f, -0.134055f, -0.013452f, +0.011046f, +0.022691f, -0.000004f}, - {+0.006666f, -0.037732f, +0.068344f, +0.001907f, +0.003786f, +0.000807f, +0.000263f}, - {-0.015403f, -0.000610f, +0.082095f, +0.031996f, +0.007132f, -0.014653f, +0.000743f}, - {-0.006863f, -0.004261f, +0.006302f, +0.005244f, -0.004123f, -0.025567f, -0.000603f}, - {+0.009215f, +0.013483f, +0.000507f, +0.063866f, -0.017193f, -0.008910f, -0.001086f}, - {+0.002117f, +0.062124f, -0.009407f, -0.002622f, -0.025731f, +0.002923f, -0.000603f}, - {-0.014505f, +0.023100f, +0.024324f, +0.006534f, +0.006132f, +0.023845f, +0.000284f}, - {-0.002356f, -0.003682f, -0.002242f, +0.014199f, -0.006597f, +0.001081f, +0.000406f} - }, - { - {+0.000058f, -0.136416f, -0.492276f, -0.001401f, -0.011247f, -0.000834f, +0.000005f}, - {-0.003148f, -0.049667f, -0.450793f, +0.030608f, +0.004189f, +0.011365f, +0.000468f}, - {+0.021455f, -0.091938f, +0.007962f, -0.044085f, +0.049069f, -0.040177f, -0.000546f}, - {+0.020716f, +0.044565f, -0.098169f, -0.074157f, +0.023582f, -0.027619f, -0.000233f}, - {+0.013397f, +0.032973f, -0.049759f, -0.059972f, +0.004251f, -0.031825f, -0.000139f}, - {+0.015377f, +0.014548f, -0.037187f, -0.063775f, +0.035613f, -0.031532f, -0.000014f}, - {+0.017321f, +0.106436f, +0.015760f, -0.036442f, +0.043782f, -0.027117f, +0.000046f}, - {+0.018491f, -0.043347f, +0.081495f, -0.029687f, +0.027445f, -0.012467f, +0.000037f}, - {+0.002143f, +0.058964f, -0.151480f, -0.022542f, -0.017894f, -0.000117f, +0.000011f}, - {-0.002501f, -0.051566f, +0.076858f, +0.024061f, +0.010190f, -0.002223f, -0.000059f}, - {+0.004455f, +0.004621f, +0.022586f, -0.008980f, +0.004779f, -0.014720f, +0.000296f}, - {+0.010379f, -0.031260f, -0.084411f, -0.011079f, +0.044526f, +0.004500f, +0.000139f}, - {-0.010110f, -0.002952f, +0.019419f, +0.073054f, +0.016238f, +0.023041f, +0.000177f}, - {-0.005833f, +0.056756f, -0.003891f, +0.011659f, -0.013338f, +0.016593f, -0.000291f}, - {+0.005419f, +0.040607f, +0.004132f, -0.013323f, -0.017875f, -0.003126f, -0.000447f}, - {-0.004253f, +0.020851f, +0.031947f, +0.033527f, +0.001452f, -0.004281f, -0.000039f} - }, - { - {+0.000232f, -0.196424f, -0.385415f, -0.022712f, -0.006855f, +0.000856f, +0.000126f}, - {-0.000418f, -0.175457f, -0.245702f, -0.013319f, +0.015788f, +0.013106f, -0.000327f}, - {-0.001154f, +0.007098f, -0.063563f, -0.017231f, -0.005626f, -0.013559f, -0.001143f}, - {-0.012555f, -0.174488f, +0.237964f, -0.039418f, -0.002349f, -0.016946f, -0.001147f}, - {-0.003784f, -0.065353f, +0.070894f, -0.006390f, -0.057332f, -0.007117f, -0.001233f}, - {+0.000349f, -0.048045f, +0.027724f, -0.012524f, -0.033626f, +0.005520f, -0.001111f}, - {+0.017541f, +0.092792f, +0.030184f, -0.047810f, +0.016410f, -0.003144f, -0.001400f}, - {-0.000437f, -0.002996f, -0.013522f, +0.006474f, +0.030405f, -0.007597f, -0.001046f}, - {-0.007428f, -0.049136f, -0.023268f, -0.015781f, -0.011003f, -0.014398f, +0.000182f}, - {+0.001481f, +0.033593f, +0.004295f, -0.004592f, +0.021205f, +0.000050f, -0.000263f}, - {+0.005354f, +0.018801f, -0.011774f, +0.002287f, -0.027282f, +0.010347f, -0.000769f}, - {-0.009152f, -0.006626f, -0.078942f, -0.000242f, +0.021966f, +0.021963f, +0.000453f}, - {+0.009690f, +0.055165f, +0.045330f, -0.032221f, +0.065784f, +0.004359f, +0.001062f}, - {+0.010862f, +0.081924f, -0.069800f, -0.013181f, +0.045093f, -0.014171f, +0.000806f}, - {+0.005800f, +0.042160f, -0.003294f, -0.036254f, +0.013693f, -0.023545f, +0.000070f}, - {+0.009050f, +0.025948f, +0.028277f, -0.000043f, +0.018071f, -0.006021f, -0.000268f} - }, - { - {-0.001778f, +0.223111f, +0.243284f, +0.023691f, -0.004197f, +0.005091f, -0.000088f}, - {+0.002088f, +0.146779f, +0.282563f, +0.032455f, -0.005584f, -0.004320f, -0.000383f}, - {-0.012406f, +0.076657f, +0.054535f, +0.019126f, -0.004735f, +0.003766f, +0.000879f}, - {-0.000400f, +0.009278f, +0.480121f, +0.005043f, +0.003008f, +0.000400f, +0.000750f}, - {-0.000331f, -0.023120f, +0.141880f, +0.021964f, -0.032304f, +0.009784f, +0.000503f}, - {-0.005941f, -0.021748f, +0.079982f, +0.022467f, -0.025801f, +0.013174f, +0.000364f}, - {-0.027576f, -0.056867f, -0.044804f, -0.025088f, +0.021454f, +0.021391f, +0.000258f}, - {+0.000666f, +0.004812f, -0.031881f, -0.003249f, +0.015597f, -0.005884f, +0.000399f}, - {+0.001918f, -0.036904f, +0.028920f, -0.012401f, -0.003927f, -0.013129f, -0.000289f}, - {-0.004733f, +0.044313f, +0.017544f, -0.019033f, +0.000125f, -0.005854f, +0.000158f}, - {-0.003306f, -0.007736f, -0.036072f, +0.013098f, -0.016743f, +0.014288f, -0.000093f}, - {+0.002198f, +0.032947f, -0.025622f, +0.013714f, -0.002822f, +0.006481f, -0.000426f}, - {-0.010347f, +0.044911f, +0.109159f, -0.005157f, +0.028906f, -0.016894f, -0.000962f}, - {-0.012573f, -0.001057f, -0.086903f, -0.008620f, +0.026300f, -0.014200f, -0.000105f}, - {-0.006637f, +0.003910f, +0.011665f, +0.001170f, +0.021670f, -0.012737f, +0.000541f}, - {-0.006125f, -0.002545f, +0.021834f, -0.006301f, +0.010358f, -0.000879f, +0.000147f} - }, - { - {+0.001661f, +0.044798f, +0.497958f, +0.007682f, +0.001920f, +0.000678f, -0.000069f}, - {-0.001629f, +0.057245f, +0.418929f, +0.026166f, -0.007984f, -0.010658f, +0.000615f}, - {+0.009494f, -0.023460f, +0.158416f, +0.022301f, +0.001622f, +0.009939f, +0.000314f}, - {+0.005164f, +0.249867f, +0.124203f, +0.025636f, +0.005748f, +0.000660f, +0.000601f}, - {-0.003519f, +0.029885f, +0.075655f, +0.003349f, -0.004214f, +0.004704f, +0.000885f}, - {-0.000755f, +0.015219f, +0.048678f, +0.020834f, -0.012934f, +0.003014f, +0.000805f}, - {+0.006115f, -0.134583f, -0.038858f, +0.039498f, -0.010231f, +0.019073f, +0.001215f}, - {-0.006065f, +0.022158f, +0.017704f, -0.018410f, +0.001416f, -0.001222f, +0.000596f}, - {+0.002762f, -0.060790f, +0.053349f, +0.001174f, -0.011245f, -0.011658f, -0.000102f}, - {+0.003442f, -0.021974f, +0.051257f, -0.015449f, +0.006060f, -0.001236f, +0.000282f}, - {-0.000460f, -0.017973f, -0.022112f, -0.000478f, -0.004836f, +0.011224f, +0.000713f}, - {+0.002907f, -0.013619f, +0.015874f, +0.006198f, -0.002588f, +0.007083f, -0.000030f}, - {+0.005990f, +0.054285f, +0.021602f, +0.028748f, +0.000862f, -0.009091f, -0.000327f}, - {+0.007170f, -0.073188f, -0.020928f, -0.013170f, -0.006551f, +0.016420f, -0.000711f}, - {+0.002439f, +0.025659f, -0.013787f, +0.013123f, +0.004380f, -0.000469f, -0.000567f}, - {+0.001480f, +0.021027f, -0.001495f, -0.003191f, -0.008078f, +0.005950f, +0.000028f} - }, - { - {+0.000593f, -0.236478f, +0.062751f, -0.031574f, +0.001932f, +0.000475f, +0.000125f}, - {+0.001112f, -0.219741f, -0.045964f, -0.033082f, -0.012846f, -0.010238f, +0.000058f}, - {-0.000288f, -0.043345f, +0.129386f, +0.006449f, +0.014950f, +0.014326f, -0.000484f}, - {-0.000954f, -0.177421f, -0.465052f, -0.016332f, +0.003856f, -0.000880f, -0.000851f}, - {+0.006500f, -0.076420f, -0.126017f, -0.020000f, +0.005284f, +0.001453f, -0.000605f}, - {+0.005990f, +0.031405f, +0.037913f, -0.013960f, -0.013903f, +0.004807f, -0.000506f}, - {+0.015687f, +0.021104f, +0.113959f, +0.012439f, -0.039996f, +0.000223f, -0.000453f}, - {-0.000473f, +0.041740f, +0.044827f, -0.015459f, -0.002343f, -0.005928f, -0.000432f}, - {+0.001060f, -0.019108f, +0.067790f, +0.019182f, +0.001142f, -0.000990f, +0.000595f}, - {+0.003359f, -0.055575f, +0.011279f, -0.025875f, +0.003999f, -0.001129f, -0.000287f}, - {-0.002395f, +0.004105f, -0.011084f, -0.010291f, -0.008377f, -0.009379f, -0.000116f}, - {-0.000216f, -0.045114f, -0.020852f, -0.005913f, -0.002893f, +0.004932f, +0.000316f}, - {+0.003783f, -0.058127f, -0.116863f, +0.015414f, +0.004459f, +0.012101f, +0.001164f}, - {+0.001940f, -0.000953f, +0.073317f, +0.000380f, -0.013800f, +0.008255f, +0.000500f}, - {-0.001348f, +0.013472f, -0.048338f, -0.016392f, -0.002728f, +0.008729f, -0.000177f}, - {-0.002293f, +0.042225f, +0.020761f, -0.007674f, -0.021144f, -0.001111f, -0.000047f} - }, - { - {-0.001881f, +0.104692f, -0.437628f, +0.010124f, -0.004119f, +0.002798f, -0.000007f}, - {-0.000985f, +0.054923f, -0.473910f, +0.002045f, -0.002078f, -0.007573f, -0.000638f}, - {-0.004261f, +0.068963f, -0.026476f, +0.007698f, +0.005161f, +0.016700f, -0.000087f}, - {-0.000472f, -0.135013f, -0.565164f, -0.012751f, +0.014398f, -0.005967f, -0.000128f}, - {-0.002219f, +0.017222f, -0.277363f, +0.009247f, +0.012340f, +0.001014f, -0.000724f}, - {-0.002529f, -0.014422f, +0.078148f, -0.013292f, -0.001185f, -0.005919f, -0.000538f}, - {-0.012201f, +0.079026f, +0.174608f, -0.053111f, -0.028818f, -0.008327f, -0.001164f}, - {+0.008807f, +0.024623f, -0.021642f, +0.012326f, +0.005481f, -0.005376f, -0.000217f}, - {-0.004625f, +0.095195f, -0.032818f, +0.006017f, -0.007642f, +0.021939f, -0.000335f}, - {-0.005561f, +0.011254f, -0.069687f, -0.007241f, -0.007441f, +0.000401f, -0.000318f}, - {+0.004316f, -0.006517f, -0.015791f, -0.011842f, -0.000856f, -0.009342f, -0.000485f}, - {-0.004504f, +0.028032f, -0.066155f, -0.028674f, +0.003536f, +0.000815f, -0.000257f}, - {-0.007052f, -0.039724f, -0.103443f, -0.003110f, +0.009274f, +0.021142f, -0.000615f}, - {-0.006271f, +0.036829f, +0.058440f, -0.010721f, -0.009936f, +0.008632f, +0.000238f}, - {+0.001946f, -0.003377f, -0.061145f, -0.011028f, -0.000124f, +0.004200f, +0.000756f}, - {+0.005945f, +0.005663f, +0.029383f, -0.007265f, -0.007601f, -0.001858f, +0.000153f} - }, - { - {+0.001608f, +0.200304f, -0.287352f, +0.023568f, -0.012646f, -0.001792f, -0.000110f}, - {-0.000873f, +0.220254f, -0.233692f, +0.013980f, +0.019805f, +0.013042f, +0.000254f}, - {+0.005248f, +0.005267f, -0.097062f, +0.009788f, -0.031921f, -0.004981f, +0.000066f}, - {-0.006026f, +0.165134f, -0.129644f, +0.024946f, +0.039434f, +0.008272f, +0.000680f}, - {-0.004821f, +0.081844f, -0.161841f, +0.022252f, +0.006155f, +0.007528f, +0.000769f}, - {-0.002549f, -0.058108f, +0.046846f, -0.003059f, -0.000697f, -0.000618f, +0.000547f}, - {-0.007110f, -0.091546f, -0.012640f, -0.034041f, -0.004692f, +0.010014f, +0.000815f}, - {-0.004608f, +0.001433f, -0.064603f, -0.001817f, +0.036470f, +0.013459f, +0.000154f}, - {+0.000858f, +0.011046f, -0.117929f, +0.000666f, -0.010929f, +0.023558f, -0.000529f}, - {+0.000262f, -0.000025f, -0.103739f, -0.005447f, -0.009620f, +0.007360f, +0.000558f}, - {-0.000017f, +0.006779f, +0.001324f, -0.018054f, +0.004434f, +0.000980f, +0.000147f}, - {+0.001773f, +0.058408f, -0.050166f, -0.036957f, -0.028180f, -0.014311f, +0.000042f}, - {-0.002142f, +0.052174f, +0.014142f, +0.000352f, +0.005846f, +0.011380f, -0.000521f}, - {+0.002509f, -0.018918f, -0.023498f, -0.007300f, -0.010118f, -0.001050f, -0.000485f}, - {-0.001969f, +0.016255f, -0.030569f, -0.007966f, +0.008209f, +0.001626f, -0.000336f}, - {-0.005908f, -0.042236f, +0.002979f, -0.003313f, -0.002114f, +0.001176f, -0.000242f} - }, - { - {-0.002283f, -0.190264f, +0.317807f, -0.041862f, -0.013710f, -0.009182f, +0.000055f}, - {+0.004396f, -0.188305f, +0.367265f, -0.016356f, +0.017064f, +0.018999f, +0.000459f}, - {-0.006914f, -0.060402f, +0.070487f, -0.038753f, -0.028167f, -0.025907f, +0.000326f}, - {+0.011485f, -0.111924f, +0.257419f, +0.027696f, +0.043074f, +0.023043f, -0.000112f}, - {+0.006481f, -0.106988f, +0.078641f, +0.010369f, +0.020637f, +0.004268f, +0.000552f}, - {+0.002442f, -0.002203f, -0.021242f, +0.008312f, -0.010172f, +0.001226f, +0.000290f}, - {+0.015369f, -0.049094f, -0.176897f, +0.009396f, -0.018227f, -0.013839f, +0.000931f}, - {-0.002747f, -0.037808f, +0.016824f, +0.000881f, +0.041844f, +0.014131f, +0.000188f}, - {+0.002663f, -0.042773f, -0.067404f, -0.021799f, -0.000291f, -0.007144f, +0.000772f}, - {+0.002855f, -0.010467f, -0.079956f, -0.016808f, -0.003165f, +0.008992f, +0.000182f}, - {-0.001899f, -0.008400f, +0.030905f, -0.010609f, +0.001047f, -0.001953f, +0.000193f}, - {+0.005525f, +0.032964f, -0.043242f, -0.021771f, -0.050726f, -0.017866f, +0.000160f}, - {+0.009763f, -0.025562f, +0.101453f, -0.004032f, +0.007303f, -0.009460f, +0.000915f}, - {+0.003132f, -0.026920f, -0.054686f, +0.011398f, +0.001945f, -0.016836f, +0.000242f}, - {+0.003754f, -0.004524f, +0.013916f, -0.011236f, +0.007995f, +0.003567f, -0.000513f}, - {+0.002200f, -0.015957f, -0.044466f, +0.002366f, +0.002169f, -0.002036f, -0.000098f} - }, - { - {+0.003609f, -0.124165f, +0.450240f, -0.011960f, +0.001814f, -0.000226f, +0.000090f}, - {-0.005252f, -0.076277f, +0.547236f, -0.002862f, -0.003045f, +0.000456f, -0.000415f}, - {+0.006808f, -0.053114f, +0.098672f, -0.009249f, +0.001674f, -0.012447f, -0.000058f}, - {-0.008375f, -0.004906f, +0.362870f, -0.014974f, -0.000367f, -0.002802f, -0.000478f}, - {-0.002228f, +0.003473f, +0.205137f, -0.023272f, -0.006215f, -0.017134f, -0.001010f}, - {-0.000571f, +0.025991f, -0.026818f, -0.005091f, -0.013779f, -0.007778f, -0.000473f}, - {-0.003735f, -0.105491f, -0.279191f, -0.027929f, -0.010252f, -0.020097f, -0.001156f}, - {-0.001217f, +0.071835f, +0.154430f, -0.011855f, +0.002667f, -0.002826f, +0.000054f}, - {+0.000480f, -0.020383f, -0.034553f, -0.028592f, -0.016234f, -0.022065f, +0.000065f}, - {+0.000803f, +0.045105f, -0.000768f, -0.011625f, -0.005524f, -0.002577f, -0.000868f}, - {-0.003690f, +0.013195f, +0.053141f, -0.016549f, -0.007503f, -0.003226f, +0.000154f}, - {-0.004956f, -0.069593f, -0.135765f, -0.005671f, -0.003950f, +0.004994f, -0.000202f}, - {-0.001284f, -0.058847f, +0.070425f, -0.007215f, -0.008366f, -0.028907f, -0.000284f}, - {-0.003455f, -0.008730f, -0.036217f, -0.008454f, -0.004655f, -0.017679f, +0.000014f}, - {-0.005924f, -0.006414f, +0.021672f, -0.012342f, -0.002642f, -0.000940f, +0.000569f}, - {+0.000350f, +0.002979f, -0.028344f, +0.001530f, -0.005199f, -0.000823f, +0.000541f} - }, - { - {-0.002595f, +0.231505f, -0.059475f, +0.031323f, +0.000811f, +0.002997f, -0.000105f}, - {+0.000920f, +0.251923f, +0.021212f, +0.041245f, +0.002087f, -0.009892f, -0.000208f}, - {-0.001905f, +0.088975f, -0.095092f, +0.000614f, -0.000732f, +0.001651f, -0.000526f}, - {+0.001829f, +0.162263f, +0.072547f, +0.010691f, -0.006275f, -0.010152f, +0.000202f}, - {-0.001074f, +0.127675f, +0.024806f, -0.004697f, -0.015653f, -0.013365f, -0.000181f}, - {+0.001734f, +0.018512f, -0.027144f, -0.018621f, -0.006091f, -0.003330f, -0.000128f}, - {-0.010389f, -0.084487f, -0.226334f, -0.035829f, -0.004528f, -0.009666f, -0.000481f}, - {+0.009032f, +0.061811f, +0.096836f, +0.009505f, -0.012954f, +0.000064f, -0.000350f}, - {-0.002417f, -0.004918f, -0.012012f, -0.022845f, -0.015983f, -0.009882f, -0.000808f}, - {-0.003024f, +0.039172f, +0.013326f, -0.000801f, -0.001560f, -0.016627f, +0.000275f}, - {+0.007452f, +0.030058f, -0.016768f, +0.006774f, -0.012188f, +0.006626f, -0.000198f}, - {-0.004613f, -0.042919f, -0.140928f, -0.003562f, +0.014757f, -0.000165f, +0.000013f}, - {-0.012233f, +0.049543f, -0.035377f, +0.000625f, -0.000981f, -0.023350f, -0.000508f}, - {-0.000298f, -0.004223f, -0.034114f, -0.011313f, -0.011180f, -0.002456f, -0.000276f}, - {+0.003105f, +0.000900f, -0.043146f, +0.007921f, -0.009306f, +0.001719f, +0.000197f}, - {+0.000056f, -0.017410f, +0.012442f, -0.014149f, -0.007345f, +0.007077f, -0.000235f} - }, - { - {-0.000105f, -0.028242f, -0.490151f, -0.006013f, -0.000405f, +0.003651f, -0.000044f}, - {+0.004273f, -0.091012f, -0.512346f, -0.009209f, +0.006038f, -0.006005f, +0.000395f}, - {-0.003775f, -0.013142f, -0.264416f, -0.018230f, +0.003223f, +0.013630f, +0.000320f}, - {+0.000877f, -0.058724f, -0.212378f, -0.000299f, -0.004217f, -0.010691f, +0.000326f}, - {-0.000849f, -0.003925f, -0.168919f, -0.006611f, -0.017126f, -0.002900f, +0.001110f}, - {-0.003390f, -0.030951f, -0.055595f, -0.010449f, +0.001866f, +0.002874f, +0.000333f}, - {+0.007610f, +0.216878f, +0.101973f, -0.006828f, -0.006093f, +0.002417f, +0.001281f}, - {-0.005247f, -0.092910f, -0.082840f, +0.000173f, -0.000662f, +0.004149f, -0.000070f}, - {-0.003825f, +0.054499f, +0.068119f, -0.004337f, -0.003343f, +0.005033f, +0.000389f}, - {-0.001521f, +0.011283f, -0.019235f, +0.007889f, -0.004145f, -0.013462f, +0.000877f}, - {-0.002597f, -0.017853f, -0.077262f, +0.005729f, -0.000186f, +0.009721f, -0.000537f}, - {+0.007806f, +0.173983f, +0.083663f, +0.017989f, +0.010736f, -0.004214f, +0.000162f}, - {+0.007527f, +0.139189f, +0.016947f, +0.007434f, +0.010151f, -0.003075f, +0.000600f}, - {+0.001257f, +0.034327f, +0.000584f, -0.010653f, -0.017435f, +0.012041f, +0.000506f}, - {+0.003054f, -0.012901f, -0.072559f, -0.003234f, -0.002533f, +0.004886f, -0.000554f}, - {-0.001440f, -0.001177f, +0.041342f, -0.035758f, -0.008227f, +0.013542f, -0.000605f} - }, - { - {+0.000534f, -0.191712f, -0.256462f, -0.027639f, -0.000869f, +0.002740f, +0.000150f}, - {-0.004711f, -0.189644f, -0.323706f, -0.035566f, +0.003931f, -0.001774f, +0.000023f}, - {+0.005338f, -0.132584f, -0.123062f, -0.006922f, +0.001908f, +0.014249f, +0.000418f}, - {-0.001514f, -0.096895f, -0.149462f, -0.012634f, -0.002553f, -0.008145f, -0.000239f}, - {+0.004455f, -0.078939f, -0.109890f, +0.030175f, -0.054100f, +0.020621f, -0.000317f}, - {+0.001954f, -0.037369f, -0.070319f, +0.012542f, -0.001373f, +0.004905f, +0.000105f}, - {+0.009597f, +0.091443f, +0.213955f, +0.082122f, -0.078271f, +0.037887f, -0.000021f}, - {-0.006956f, -0.041842f, -0.097106f, -0.047918f, +0.046573f, -0.019063f, +0.000497f}, - {+0.009351f, +0.017534f, +0.036624f, +0.019555f, -0.006998f, +0.006656f, +0.000487f}, - {+0.006094f, -0.025598f, -0.007412f, +0.043196f, -0.046727f, +0.015901f, -0.000824f}, - {-0.003579f, -0.015919f, -0.063537f, -0.024273f, +0.033493f, -0.010473f, +0.000646f}, - {+0.003786f, +0.079431f, +0.211573f, +0.049145f, -0.046596f, +0.025127f, -0.000019f}, - {+0.013003f, +0.024809f, +0.097034f, +0.057786f, -0.052429f, +0.039258f, -0.000048f}, - {+0.003464f, +0.021931f, -0.011529f, +0.044162f, -0.055245f, +0.027731f, -0.000194f}, - {-0.005197f, -0.016476f, -0.014479f, -0.033521f, +0.033687f, -0.015973f, -0.000043f}, - {+0.001962f, +0.024503f, +0.005662f, -0.050924f, +0.039002f, -0.020531f, +0.000668f} - }, - { - {+0.001553f, +0.146963f, +0.302141f, +0.026379f, +0.000840f, +0.000346f, -0.000061f}, - {+0.001717f, +0.217569f, +0.292571f, +0.015852f, -0.000463f, -0.005375f, -0.000261f}, - {-0.004635f, +0.115185f, +0.259233f, +0.023669f, +0.003813f, +0.006664f, -0.000481f}, - {+0.003717f, +0.087889f, +0.084589f, -0.005335f, -0.001673f, -0.001669f, -0.000199f}, - {-0.004523f, +0.042980f, +0.118037f, +0.067124f, -0.037615f, +0.021729f, -0.000920f}, - {-0.000118f, +0.066640f, +0.036964f, +0.011214f, -0.005413f, +0.005046f, -0.000256f}, - {-0.021275f, -0.088041f, +0.115907f, +0.129339f, -0.055323f, +0.030816f, -0.001195f}, - {+0.013274f, +0.085064f, +0.010644f, -0.082487f, +0.025821f, -0.022331f, +0.000007f}, - {-0.003747f, -0.079218f, -0.067175f, +0.016473f, -0.003161f, +0.005630f, -0.000496f}, - {-0.004932f, -0.009594f, +0.051342f, +0.075947f, -0.023028f, +0.024066f, -0.000426f}, - {+0.004863f, +0.054121f, +0.015535f, -0.051655f, +0.010816f, -0.015566f, +0.000550f}, - {-0.014845f, -0.103176f, +0.080073f, +0.073893f, -0.033782f, +0.019073f, -0.000223f}, - {-0.020172f, -0.123083f, +0.025247f, +0.077152f, -0.044505f, +0.035317f, -0.000427f}, - {-0.009806f, -0.027794f, -0.010006f, +0.092919f, -0.036980f, +0.021231f, -0.000596f}, - {+0.003438f, +0.040179f, +0.056704f, -0.041600f, +0.022592f, -0.014077f, +0.000577f}, - {-0.000596f, -0.015506f, -0.049450f, -0.036447f, +0.050092f, -0.018485f, +0.000333f} - }, - { - {-0.002422f, +0.059309f, +0.454757f, +0.012657f, +0.002371f, -0.003051f, -0.000109f}, - {-0.000972f, +0.089012f, +0.471174f, -0.002615f, -0.003776f, +0.002449f, -0.000000f}, - {+0.004981f, +0.029440f, +0.402898f, +0.009542f, +0.008586f, -0.005243f, -0.000150f}, - {-0.003934f, +0.068475f, +0.154745f, -0.020530f, -0.010063f, +0.011466f, +0.000228f}, - {+0.001934f, +0.008674f, +0.222726f, +0.009188f, +0.005025f, -0.009762f, +0.000728f}, - {+0.001313f, +0.027392f, +0.137224f, -0.014991f, -0.001664f, +0.004118f, -0.000127f}, - {+0.014825f, -0.131128f, +0.122638f, +0.075503f, +0.018816f, -0.031020f, +0.000515f}, - {-0.011235f, +0.084345f, -0.009674f, -0.055727f, -0.015906f, +0.017483f, -0.000662f}, - {-0.005861f, -0.019533f, -0.082227f, +0.006916f, +0.001847f, +0.000758f, -0.000202f}, - {+0.002580f, -0.007477f, +0.078927f, +0.037096f, +0.017242f, -0.002675f, +0.001011f}, - {-0.006105f, +0.029808f, +0.069762f, -0.048809f, -0.026042f, +0.019077f, -0.001200f}, - {+0.007044f, -0.114937f, -0.015102f, +0.066422f, +0.026713f, -0.021148f, +0.000080f}, - {+0.001891f, -0.137403f, -0.008770f, +0.069524f, +0.011781f, -0.014633f, +0.000357f}, - {+0.011650f, -0.048431f, -0.022767f, +0.070071f, +0.022558f, -0.031545f, +0.000766f}, - {-0.004098f, +0.038606f, +0.034870f, -0.023526f, -0.016759f, +0.018251f, -0.000137f}, - {-0.002804f, -0.007684f, -0.077297f, +0.002580f, +0.008066f, +0.011234f, -0.000920f} - }, - { - {+0.001243f, -0.224613f, -0.012233f, -0.028833f, +0.002009f, -0.001573f, +0.000139f}, - {+0.003295f, -0.291789f, -0.088662f, -0.035172f, -0.002488f, +0.006098f, +0.000188f}, - {-0.004422f, -0.109655f, +0.194382f, -0.015495f, -0.002943f, -0.012500f, +0.000375f}, - {-0.000983f, -0.060160f, +0.019095f, +0.002163f, -0.009795f, +0.008264f, +0.000115f}, - {-0.001589f, -0.082539f, +0.072974f, -0.012423f, -0.001200f, -0.017036f, +0.000476f}, - {-0.002963f, +0.004891f, +0.170906f, +0.002191f, -0.010678f, -0.003313f, +0.000249f}, - {+0.000920f, -0.061561f, +0.127515f, -0.015016f, +0.024498f, -0.020689f, +0.000844f}, - {+0.008002f, -0.061962f, -0.190966f, -0.006417f, -0.015050f, +0.014959f, +0.000195f}, - {+0.005173f, +0.156470f, +0.092158f, +0.003397f, +0.001560f, -0.000232f, +0.000368f}, - {-0.003501f, +0.012214f, +0.075482f, -0.005243f, -0.002154f, -0.020806f, -0.000155f}, - {+0.008351f, +0.016040f, +0.026286f, -0.012254f, -0.009563f, +0.018921f, -0.000087f}, - {+0.011531f, -0.098810f, -0.081896f, -0.003554f, +0.022476f, -0.012750f, +0.000309f}, - {+0.015089f, -0.023102f, -0.004189f, -0.005266f, +0.027232f, -0.009300f, +0.000031f}, - {-0.005756f, -0.105164f, -0.121008f, -0.004928f, +0.021585f, -0.023954f, +0.000170f}, - {+0.006045f, -0.003955f, -0.049276f, -0.014402f, -0.022434f, +0.010508f, -0.000583f}, - {+0.004951f, +0.038486f, -0.010450f, +0.009920f, -0.000470f, +0.019584f, +0.000126f} - }, - { - {-0.000785f, +0.071187f, -0.465505f, +0.008818f, +0.000726f, -0.000365f, -0.000008f}, - {-0.003977f, +0.050770f, -0.585842f, +0.009869f, -0.005833f, +0.006502f, +0.000042f}, - {+0.001056f, +0.090926f, -0.134707f, -0.000269f, +0.002753f, -0.009764f, +0.000032f}, - {+0.004617f, -0.003374f, -0.109444f, +0.009037f, -0.005531f, +0.005999f, -0.000201f}, - {+0.003957f, +0.051265f, -0.172281f, +0.013706f, +0.002364f, -0.006848f, -0.000853f}, - {+0.001658f, +0.038903f, +0.082157f, -0.000716f, -0.007295f, -0.006209f, +0.000121f}, - {-0.008525f, +0.078895f, -0.017870f, -0.012860f, +0.021118f, -0.002045f, -0.000829f}, - {-0.004920f, +0.015338f, -0.238590f, -0.001845f, -0.024647f, +0.009983f, +0.000767f}, - {+0.004676f, +0.105685f, +0.151514f, -0.014114f, -0.002475f, +0.001016f, +0.000176f}, - {+0.004034f, +0.022836f, +0.044207f, -0.014588f, -0.008672f, -0.010817f, -0.000710f}, - {-0.002168f, +0.116093f, -0.070756f, -0.031832f, +0.022730f, -0.006607f, +0.001442f}, - {-0.016149f, -0.002381f, -0.087859f, -0.020749f, -0.000196f, +0.003994f, -0.000292f}, - {-0.004050f, +0.044943f, -0.009330f, -0.045828f, +0.060443f, -0.016203f, -0.000276f}, - {-0.005468f, -0.113575f, -0.136984f, +0.012815f, +0.014267f, -0.005446f, -0.000965f}, - {-0.002865f, +0.038861f, -0.055190f, -0.024730f, -0.004192f, -0.008756f, +0.000421f}, - {-0.000981f, +0.013622f, +0.075658f, -0.024512f, +0.006801f, +0.006189f, +0.000849f} - }, - { - {+0.001239f, +0.191379f, -0.284220f, +0.019946f, +0.003893f, +0.000657f, -0.000100f}, - {+0.001075f, +0.276377f, -0.283032f, +0.022859f, -0.009082f, +0.003365f, -0.000240f}, - {+0.001241f, -0.011637f, -0.274203f, +0.004930f, +0.017890f, -0.002705f, -0.000186f}, - {-0.000041f, -0.018968f, -0.133490f, +0.005016f, -0.007152f, +0.003102f, -0.000080f}, - {-0.003640f, +0.003961f, -0.218334f, +0.022294f, +0.024633f, +0.009211f, +0.000017f}, - {+0.000298f, -0.117839f, -0.145841f, -0.001220f, -0.000336f, -0.003714f, -0.000241f}, - {+0.003359f, +0.080035f, -0.097693f, -0.029470f, +0.008235f, -0.002678f, -0.000275f}, - {+0.000294f, +0.114223f, -0.072671f, +0.021916f, -0.033236f, -0.003728f, -0.000589f}, - {-0.009708f, -0.120433f, -0.071254f, -0.014746f, -0.008719f, -0.006424f, -0.000344f}, - {-0.001269f, -0.046754f, -0.003954f, +0.016916f, +0.003171f, +0.006009f, +0.000388f}, - {-0.012341f, +0.075476f, -0.093630f, -0.049195f, +0.003798f, -0.028589f, -0.000568f}, - {+0.002325f, +0.131285f, +0.044269f, -0.020071f, -0.028957f, -0.007233f, -0.000174f}, - {-0.019754f, +0.109314f, +0.101468f, -0.085502f, +0.027617f, -0.021611f, +0.000269f}, - {+0.013359f, +0.074152f, +0.055568f, +0.013092f, +0.010223f, +0.008649f, +0.000405f}, - {-0.002438f, +0.089734f, +0.050761f, -0.012420f, +0.004906f, -0.005249f, +0.000350f}, - {-0.007586f, -0.002478f, +0.072281f, -0.033398f, -0.009508f, -0.010318f, -0.000512f} - }, - { - {+0.000051f, -0.155265f, +0.261455f, -0.025571f, +0.008165f, -0.000717f, +0.000066f}, - {+0.001630f, -0.169186f, +0.393845f, -0.036438f, +0.008078f, -0.006680f, +0.000028f}, - {+0.000337f, -0.079130f, -0.143638f, -0.006564f, +0.000925f, +0.007661f, -0.000153f}, - {-0.007150f, -0.020081f, -0.070013f, -0.006603f, +0.004172f, -0.008362f, +0.000222f}, - {-0.002015f, -0.099180f, -0.044872f, +0.014401f, +0.021736f, +0.002693f, +0.000644f}, - {+0.000309f, -0.013186f, -0.262927f, +0.008874f, -0.004250f, -0.004267f, -0.000133f}, - {+0.004143f, +0.028994f, -0.084453f, +0.022748f, -0.010859f, +0.000658f, +0.000717f}, - {+0.001064f, -0.067881f, +0.148877f, -0.004518f, -0.009488f, -0.012696f, -0.000549f}, - {+0.004788f, -0.075563f, -0.198295f, +0.012604f, -0.014432f, -0.006906f, -0.000228f}, - {-0.000822f, +0.008456f, -0.066147f, +0.014101f, -0.000566f, +0.009494f, +0.000293f}, - {+0.017337f, -0.086056f, +0.025001f, -0.029312f, -0.013841f, -0.014057f, -0.001264f}, - {+0.007897f, +0.009827f, +0.121822f, +0.034941f, -0.036994f, -0.008486f, +0.000358f}, - {+0.020805f, -0.117331f, +0.232026f, -0.011502f, -0.017947f, -0.002610f, -0.000143f}, - {-0.009701f, +0.046825f, +0.183213f, -0.000834f, -0.001503f, +0.018015f, +0.000694f}, - {+0.000783f, -0.037442f, +0.178684f, -0.005879f, -0.013166f, +0.009162f, -0.000528f}, - {+0.011722f, -0.002350f, -0.004545f, -0.002405f, -0.010888f, -0.012285f, -0.000539f} - }, - { - {-0.002527f, -0.041067f, +0.437759f, -0.007129f, +0.005781f, -0.001019f, +0.000019f}, - {-0.001146f, -0.101283f, +0.529356f, -0.017671f, +0.006206f, -0.006544f, +0.000244f}, - {-0.001251f, +0.075658f, +0.077822f, +0.003804f, -0.004672f, +0.009631f, +0.000203f}, - {+0.005863f, +0.094796f, +0.059519f, -0.004478f, -0.006540f, -0.013700f, +0.000009f}, - {+0.007285f, +0.061623f, +0.137831f, +0.001381f, +0.008080f, -0.004592f, -0.000290f}, - {-0.001291f, +0.109556f, -0.079837f, +0.019787f, -0.002279f, +0.002518f, +0.000266f}, - {-0.005084f, +0.124814f, +0.081853f, +0.002734f, -0.001840f, +0.008835f, -0.000121f}, - {+0.004182f, -0.049684f, +0.191667f, -0.005192f, +0.001015f, +0.000119f, +0.000867f}, - {+0.001163f, +0.010105f, -0.120678f, +0.012616f, +0.002928f, +0.005188f, +0.000510f}, - {+0.000188f, -0.004985f, -0.107319f, -0.006725f, -0.000249f, +0.007191f, -0.000210f}, - {-0.003857f, -0.076698f, +0.118389f, +0.002946f, -0.004928f, +0.024526f, +0.001114f}, - {-0.000953f, -0.010379f, +0.119279f, +0.017060f, -0.013659f, +0.010888f, +0.000001f}, - {+0.003450f, -0.223022f, +0.159256f, +0.028244f, -0.004310f, +0.024009f, -0.000105f}, - {-0.001797f, +0.007725f, +0.102409f, -0.028265f, +0.001228f, +0.008448f, -0.000702f}, - {+0.005477f, -0.062622f, +0.122632f, -0.002666f, -0.020475f, +0.004011f, -0.000036f}, - {-0.006490f, -0.074102f, -0.080569f, +0.003599f, -0.001484f, +0.001399f, +0.000668f} - }, - { - {+0.002605f, +0.217915f, +0.017254f, +0.026685f, +0.001074f, +0.001696f, -0.000027f}, - {-0.000507f, +0.280145f, -0.055434f, +0.036463f, -0.007121f, +0.000445f, -0.000151f}, - {-0.002225f, +0.031540f, +0.137049f, +0.003402f, +0.001446f, +0.006851f, +0.000259f}, - {+0.003339f, +0.029607f, +0.111028f, +0.012934f, -0.015664f, -0.008267f, -0.000233f}, - {-0.005138f, +0.044216f, +0.166568f, +0.008876f, -0.001389f, +0.000115f, -0.000307f}, - {-0.000318f, -0.060748f, +0.148723f, +0.005268f, -0.001350f, +0.007903f, +0.000142f}, - {+0.002239f, -0.107172f, +0.365147f, -0.022416f, +0.007887f, +0.007958f, -0.000349f}, - {-0.008240f, +0.029286f, +0.131515f, +0.000924f, +0.001729f, +0.003361f, +0.000076f}, - {-0.001111f, -0.048033f, +0.008200f, -0.002944f, +0.003827f, +0.007343f, +0.000098f}, - {-0.001402f, -0.043485f, -0.056675f, -0.011711f, +0.010410f, -0.001163f, -0.000166f}, - {-0.010717f, +0.047236f, +0.000355f, +0.006515f, +0.009782f, +0.018035f, +0.000768f}, - {-0.007978f, -0.038622f, +0.174602f, -0.002049f, -0.003385f, +0.010858f, -0.000228f}, - {-0.020226f, +0.096237f, -0.148919f, +0.011944f, +0.011821f, +0.016071f, +0.000439f}, - {+0.006621f, +0.001528f, -0.011697f, +0.001299f, +0.008412f, -0.001732f, -0.000267f}, - {-0.004817f, +0.097631f, -0.066498f, +0.021077f, -0.018987f, -0.003674f, +0.000339f}, - {-0.001070f, +0.015835f, -0.169665f, -0.009779f, +0.002793f, +0.003666f, +0.000178f} - }, - { - {-0.000218f, -0.089026f, -0.421023f, -0.012375f, -0.004634f, +0.001798f, -0.000012f}, - {+0.000562f, -0.036209f, -0.550665f, -0.008292f, -0.010922f, +0.001692f, -0.000105f}, - {+0.005142f, -0.043344f, +0.001224f, -0.012674f, +0.003441f, -0.001675f, -0.000409f}, - {-0.008966f, -0.031569f, +0.059797f, +0.001454f, +0.000130f, +0.005702f, +0.000118f}, - {-0.002522f, -0.011413f, +0.087325f, -0.011922f, -0.000022f, +0.005284f, +0.000260f}, - {+0.002181f, -0.052724f, +0.140023f, -0.006731f, +0.003810f, +0.005104f, -0.000356f}, - {-0.001765f, -0.138044f, +0.333274f, -0.033581f, -0.002688f, +0.003200f, +0.000115f}, - {+0.003973f, +0.003541f, +0.046013f, -0.008444f, -0.007414f, -0.002627f, -0.000742f}, - {-0.001162f, -0.005039f, +0.086514f, +0.005749f, +0.000068f, +0.001696f, -0.000644f}, - {+0.005849f, +0.018637f, +0.044453f, +0.010415f, +0.017192f, +0.005809f, -0.000040f}, - {+0.008661f, +0.000783f, -0.119984f, -0.007281f, -0.002656f, -0.002479f, -0.001365f}, - {+0.001526f, -0.035648f, +0.157081f, -0.009488f, -0.019925f, +0.005193f, -0.000063f}, - {+0.011404f, +0.097066f, -0.250275f, +0.008788f, +0.002808f, -0.002067f, -0.000457f}, - {+0.001614f, -0.102998f, -0.128763f, +0.002681f, +0.005070f, -0.005321f, +0.000660f}, - {-0.003298f, +0.036157f, -0.178811f, +0.006825f, -0.008513f, -0.007543f, -0.000020f}, - {+0.001641f, +0.072805f, -0.123235f, -0.015452f, +0.002179f, +0.000264f, -0.000592f} - }, - { - {-0.000975f, -0.195927f, -0.252176f, -0.030354f, -0.003229f, +0.000526f, -0.000001f}, - {+0.000309f, -0.234067f, -0.266019f, -0.031177f, -0.006945f, -0.001049f, +0.000130f}, - {-0.002386f, +0.028204f, -0.131500f, +0.018106f, +0.002251f, -0.009442f, -0.000107f}, - {+0.005664f, -0.042363f, +0.072003f, -0.019768f, +0.004863f, +0.013196f, +0.000136f}, - {+0.006853f, -0.021462f, +0.075786f, -0.014512f, +0.006282f, +0.005188f, +0.000127f}, - {-0.001367f, +0.048666f, -0.006991f, +0.006727f, +0.010622f, -0.002375f, -0.000051f}, - {+0.003019f, +0.102067f, -0.002017f, -0.014826f, -0.006139f, +0.006654f, +0.000175f}, - {+0.001819f, +0.060630f, -0.102441f, +0.007947f, -0.006446f, -0.004503f, +0.000229f}, - {+0.000306f, +0.033150f, +0.030918f, +0.012775f, -0.001709f, -0.007959f, +0.000197f}, - {-0.007447f, +0.004851f, +0.083008f, +0.030885f, +0.022103f, -0.013176f, +0.000348f}, - {+0.000980f, +0.004050f, -0.155101f, -0.009877f, +0.004389f, -0.010605f, -0.000136f}, - {+0.011198f, +0.094889f, -0.026127f, -0.019593f, -0.014251f, +0.000870f, +0.000246f}, - {+0.003826f, +0.006068f, -0.154175f, +0.011531f, -0.003595f, -0.004320f, -0.000133f}, - {-0.010429f, -0.057946f, -0.099086f, -0.007643f, +0.012220f, -0.006023f, -0.000013f}, - {+0.006881f, -0.044670f, -0.130668f, -0.002390f, -0.001337f, -0.004130f, -0.000157f}, - {+0.002955f, -0.008067f, -0.021343f, -0.008702f, -0.004275f, -0.000004f, +0.000081f} - }, - { - {+0.000069f, +0.146635f, +0.261169f, +0.019817f, +0.000075f, +0.000531f, +0.000050f}, - {-0.000305f, +0.167956f, +0.370129f, +0.020672f, +0.001785f, +0.004094f, +0.000005f}, - {-0.001609f, +0.024380f, -0.133534f, +0.009049f, +0.001346f, -0.007049f, +0.000490f}, - {-0.000308f, -0.024516f, +0.102890f, -0.000078f, -0.001148f, +0.006088f, -0.000171f}, - {-0.003839f, -0.022205f, +0.075778f, -0.005346f, +0.001081f, -0.003317f, -0.000138f}, - {+0.000262f, -0.001355f, -0.058890f, +0.010171f, +0.003640f, -0.003881f, +0.000395f}, - {-0.002110f, -0.010551f, -0.210784f, -0.011445f, -0.007396f, -0.008617f, -0.000022f}, - {-0.000164f, -0.077247f, -0.273416f, -0.009245f, -0.003585f, -0.002259f, +0.000426f}, - {+0.001898f, -0.029394f, -0.081419f, +0.001244f, -0.003552f, -0.004044f, +0.000555f}, - {+0.003842f, -0.015743f, -0.003106f, -0.017909f, +0.010335f, -0.016376f, +0.000053f}, - {-0.000773f, +0.009196f, -0.117905f, -0.005612f, -0.002042f, -0.007695f, +0.001220f}, - {-0.010660f, -0.058962f, -0.204008f, -0.008327f, -0.009183f, -0.007026f, +0.000141f}, - {-0.004701f, -0.015995f, -0.106937f, +0.021098f, -0.004298f, -0.004601f, +0.000763f}, - {+0.006433f, +0.158915f, +0.112726f, -0.004279f, +0.017104f, -0.005337f, -0.000512f}, - {-0.001227f, -0.004124f, -0.047424f, -0.003324f, +0.000541f, +0.001090f, -0.000151f}, - {-0.003536f, -0.000793f, +0.041435f, +0.013181f, +0.004530f, +0.004257f, +0.000379f} - }, - { - {+0.000364f, +0.080984f, +0.376956f, +0.011952f, +0.000472f, -0.001518f, -0.000035f}, - {-0.000358f, +0.095210f, +0.504080f, +0.005232f, +0.006697f, +0.000372f, -0.000005f}, - {+0.000714f, -0.120793f, +0.065080f, -0.000397f, -0.002637f, +0.003362f, -0.000163f}, - {-0.000153f, +0.085409f, -0.047521f, +0.008039f, -0.002805f, +0.001302f, -0.000001f}, - {-0.001358f, +0.070095f, -0.050933f, +0.008619f, -0.006272f, -0.002042f, -0.000141f}, - {-0.001606f, -0.076349f, +0.053110f, -0.001126f, -0.005007f, +0.002104f, -0.000094f}, - {+0.000002f, -0.031163f, -0.172766f, -0.008913f, -0.001813f, -0.012478f, -0.000206f}, - {-0.003516f, -0.128750f, -0.154401f, -0.011018f, -0.010691f, +0.005231f, -0.000216f}, - {-0.001149f, +0.000294f, -0.147009f, +0.020344f, -0.008919f, +0.004686f, -0.000431f}, - {-0.001679f, -0.029734f, -0.035947f, +0.006328f, -0.015421f, +0.005286f, -0.000570f}, - {-0.004711f, -0.055321f, +0.011201f, -0.003090f, -0.007013f, +0.002069f, -0.000342f}, - {-0.000641f, -0.063262f, -0.204996f, -0.003457f, -0.008688f, -0.007549f, -0.000450f}, - {-0.000379f, -0.044888f, -0.064556f, +0.012953f, -0.001097f, +0.000928f, -0.000518f}, - {+0.003186f, +0.094917f, +0.184077f, -0.001265f, +0.005182f, -0.004312f, +0.000161f}, - {-0.005195f, -0.055939f, +0.071423f, -0.012305f, +0.003317f, +0.000086f, +0.000225f}, - {-0.001806f, -0.015355f, +0.044186f, +0.012248f, +0.011792f, -0.000869f, -0.000164f} - }, - { - {+0.000195f, -0.185610f, -0.036287f, -0.024075f, +0.002082f, -0.000689f, -0.000044f}, - {+0.000757f, -0.229752f, -0.017681f, -0.031382f, +0.006224f, -0.001307f, -0.000075f}, - {+0.001914f, +0.006500f, +0.229048f, +0.000819f, -0.005861f, +0.003371f, -0.000304f}, - {-0.002186f, -0.056829f, -0.244763f, -0.001140f, -0.001038f, -0.002732f, +0.000098f}, - {+0.002962f, -0.006295f, -0.156039f, +0.011850f, -0.001834f, -0.002488f, +0.000145f}, - {+0.002632f, -0.018280f, +0.116610f, +0.003232f, -0.011774f, -0.002750f, -0.000318f}, - {-0.000368f, +0.118018f, +0.078968f, +0.009095f, +0.007376f, -0.003097f, +0.000120f}, - {-0.000867f, +0.179501f, +0.254048f, +0.024606f, -0.007672f, +0.009218f, -0.000263f}, - {-0.002079f, +0.021491f, -0.107751f, +0.011889f, -0.003752f, +0.008417f, -0.000315f}, - {+0.004687f, +0.011076f, -0.013710f, -0.010901f, -0.002336f, +0.018359f, +0.000185f}, - {+0.000171f, +0.103745f, +0.209256f, +0.011020f, -0.000511f, +0.007430f, -0.000803f}, - {+0.003492f, +0.092594f, +0.015449f, +0.020195f, +0.000503f, +0.000351f, +0.000039f}, - {-0.004172f, +0.029566f, +0.007150f, +0.009351f, +0.000760f, +0.002162f, -0.000446f}, - {-0.001750f, -0.062137f, +0.037050f, -0.023719f, -0.012362f, -0.004177f, +0.000369f}, - {+0.005958f, +0.060184f, +0.203001f, -0.025293f, -0.001997f, +0.001870f, +0.000255f}, - {+0.005258f, -0.060569f, -0.061313f, -0.024494f, +0.010320f, +0.002211f, -0.000161f} - }, - { - {+0.000112f, +0.060658f, -0.417787f, +0.005714f, +0.004379f, -0.002197f, +0.000068f}, - {-0.001102f, +0.095822f, -0.518040f, +0.011832f, +0.002015f, -0.000251f, -0.000000f}, - {-0.000516f, +0.082315f, +0.132261f, +0.005735f, -0.007129f, +0.002706f, +0.000243f}, - {+0.002333f, -0.078203f, -0.213458f, -0.013410f, +0.010117f, -0.008587f, -0.000019f}, - {-0.002081f, -0.076825f, -0.077848f, +0.015310f, +0.000613f, -0.001883f, +0.000148f}, - {-0.000575f, +0.080134f, -0.005198f, +0.013834f, -0.013263f, -0.006006f, +0.000155f}, - {+0.002393f, +0.024462f, +0.208714f, -0.012361f, +0.008510f, +0.002277f, +0.000100f}, - {+0.009163f, +0.075210f, +0.409320f, +0.005280f, +0.007354f, +0.000656f, +0.000140f}, - {+0.004047f, -0.084423f, +0.061196f, -0.021248f, +0.011737f, -0.000848f, +0.000475f}, - {-0.006606f, -0.032804f, +0.077956f, -0.007869f, +0.018631f, +0.005903f, +0.000583f}, - {+0.010179f, +0.078026f, +0.230409f, +0.005878f, +0.003699f, -0.003518f, +0.000459f}, - {+0.005684f, +0.014213f, +0.151112f, +0.001273f, +0.006624f, -0.001254f, +0.000492f}, - {+0.010719f, -0.040781f, +0.075906f, +0.029747f, -0.006338f, -0.010906f, +0.000848f}, - {-0.008963f, -0.034970f, -0.020605f, -0.013122f, -0.028749f, +0.011953f, -0.000294f}, - {-0.003411f, +0.040528f, +0.227979f, -0.043627f, -0.002551f, +0.014298f, -0.000446f}, - {-0.001660f, -0.005966f, -0.105333f, -0.046917f, +0.022085f, +0.000796f, +0.000090f} - }, - { - {-0.000762f, +0.164203f, -0.247474f, +0.021171f, +0.002604f, -0.001593f, +0.000004f}, - {+0.001507f, +0.190154f, -0.345179f, +0.027840f, -0.002873f, -0.000767f, +0.000153f}, - {-0.002025f, -0.067328f, -0.076491f, -0.004353f, -0.007606f, +0.000171f, +0.000078f}, - {-0.000406f, +0.123751f, +0.084938f, +0.003933f, +0.009525f, -0.007896f, -0.000054f}, - {+0.002507f, +0.050784f, +0.079755f, -0.010591f, -0.019603f, -0.004806f, -0.000238f}, - {-0.001211f, -0.003210f, -0.123704f, -0.005078f, -0.012530f, -0.000861f, +0.000240f}, - {-0.002198f, -0.122685f, +0.004525f, -0.009356f, +0.009948f, +0.002933f, -0.000172f}, - {-0.009420f, -0.096936f, +0.211990f, -0.000631f, +0.024610f, +0.000067f, +0.000227f}, - {-0.003401f, +0.043359f, +0.236137f, -0.016754f, +0.003721f, -0.009061f, +0.000108f}, - {+0.002629f, +0.050970f, +0.171015f, -0.010701f, +0.001236f, -0.008654f, -0.000462f}, - {-0.009391f, -0.075614f, +0.036986f, -0.017209f, +0.013531f, -0.004588f, +0.000450f}, - {-0.010190f, -0.026020f, +0.092489f, -0.018996f, +0.007141f, -0.007424f, -0.000270f}, - {-0.003474f, -0.040283f, +0.090442f, +0.009004f, -0.004342f, -0.014442f, -0.000085f}, - {+0.010671f, -0.021234f, -0.041419f, +0.021963f, -0.017488f, +0.020488f, -0.000125f}, - {-0.000297f, -0.084055f, +0.073590f, -0.011210f, +0.003463f, +0.009384f, -0.000164f}, - {-0.004279f, +0.044600f, +0.008641f, +0.002947f, +0.027023f, -0.005455f, +0.000050f} - }, - { - {-0.000283f, -0.176649f, +0.262566f, -0.014478f, -0.000954f, +0.001308f, -0.000065f}, - {-0.001140f, -0.224468f, +0.279707f, -0.024096f, -0.000047f, +0.001875f, -0.000114f}, - {+0.000295f, -0.043283f, -0.120193f, -0.002250f, -0.006566f, -0.003343f, -0.000115f}, - {-0.000666f, -0.031706f, +0.308527f, +0.002946f, +0.000818f, -0.001236f, -0.000021f}, - {-0.003617f, +0.019505f, +0.143563f, -0.020992f, -0.023490f, +0.001424f, -0.000030f}, - {-0.000505f, -0.065371f, -0.050416f, -0.019406f, -0.013739f, +0.004956f, -0.000166f}, - {-0.000079f, +0.061295f, -0.259588f, +0.019944f, -0.005382f, +0.003509f, +0.000117f}, - {+0.002104f, +0.058949f, -0.059993f, +0.018286f, +0.035136f, -0.004869f, -0.000129f}, - {+0.001987f, +0.057127f, +0.194890f, +0.013423f, -0.011511f, -0.004034f, -0.000400f}, - {+0.001749f, +0.059976f, +0.129299f, +0.005890f, -0.011219f, -0.006091f, -0.000349f}, - {-0.001519f, +0.020751f, -0.128431f, -0.012395f, +0.015072f, +0.001704f, -0.000350f}, - {+0.001715f, +0.003520f, -0.009236f, +0.008621f, -0.014036f, +0.004524f, -0.000320f}, - {-0.010397f, -0.014939f, +0.057907f, +0.006560f, -0.017006f, +0.004021f, -0.000748f}, - {+0.001022f, +0.060447f, -0.104723f, +0.013416f, +0.008510f, -0.003268f, +0.000304f}, - {+0.005057f, +0.086252f, -0.154014f, +0.015645f, +0.017376f, -0.013300f, +0.000642f}, - {+0.005479f, -0.023273f, +0.095430f, +0.015576f, +0.022876f, -0.005860f, +0.000040f} - }, - { - {+0.001675f, -0.061396f, +0.429767f, -0.006398f, -0.000228f, +0.003526f, +0.000023f}, - {-0.000038f, -0.062648f, +0.515535f, -0.008029f, -0.001737f, +0.001547f, -0.000082f}, - {+0.002291f, +0.049399f, +0.003192f, +0.012249f, +0.000654f, +0.000678f, -0.000034f}, - {+0.000593f, -0.108396f, +0.186199f, -0.012697f, +0.003336f, +0.005452f, +0.000123f}, - {+0.002390f, -0.058095f, +0.036001f, -0.006041f, -0.003012f, +0.007234f, +0.000254f}, - {+0.001933f, +0.004195f, +0.056774f, +0.003687f, -0.004092f, +0.006881f, -0.000217f}, - {+0.000593f, +0.099058f, -0.194124f, +0.023991f, -0.002165f, +0.006354f, -0.000012f}, - {+0.001696f, +0.017095f, -0.148208f, -0.004048f, +0.013373f, -0.008460f, -0.000177f}, - {-0.001325f, -0.077202f, -0.002682f, -0.007197f, -0.007521f, +0.006474f, -0.000016f}, - {-0.000736f, -0.051938f, -0.026746f, -0.008682f, -0.008806f, +0.002090f, +0.000530f}, - {+0.005409f, +0.046224f, -0.113326f, -0.016402f, +0.008996f, +0.004761f, -0.000319f}, - {+0.007047f, -0.001884f, -0.012136f, +0.013255f, -0.007585f, +0.013566f, +0.000298f}, - {+0.010596f, +0.004092f, +0.006563f, -0.012092f, -0.004082f, +0.021089f, +0.000426f}, - {-0.008695f, +0.032158f, -0.077474f, +0.007159f, +0.002695f, -0.010826f, -0.000194f}, - {-0.006170f, +0.054185f, -0.187606f, +0.009185f, +0.009767f, -0.019049f, -0.000096f}, - {-0.001578f, -0.028257f, +0.067351f, -0.012794f, +0.006489f, -0.002797f, -0.000065f} - }, - { - {-0.000604f, +0.195551f, +0.046469f, +0.024960f, +0.000124f, +0.002789f, +0.000055f}, - {+0.000690f, +0.220876f, +0.080732f, +0.034526f, -0.002081f, -0.002082f, +0.000149f}, - {+0.000246f, +0.043891f, +0.048838f, -0.000487f, -0.000343f, +0.001784f, +0.000016f}, - {-0.000835f, +0.096167f, -0.135430f, +0.014028f, +0.001033f, +0.010401f, -0.000056f}, - {+0.000208f, +0.005067f, -0.068234f, +0.003921f, +0.004117f, +0.005521f, -0.000126f}, - {+0.000916f, +0.048030f, +0.028754f, +0.003326f, +0.001391f, -0.000076f, +0.000235f}, - {+0.001355f, -0.130889f, +0.158329f, -0.015536f, +0.005834f, +0.000347f, -0.000134f}, - {+0.000772f, -0.014933f, -0.083088f, -0.015662f, -0.005534f, -0.000822f, +0.000089f}, - {+0.000775f, +0.009184f, -0.151945f, +0.000406f, +0.003723f, +0.001745f, +0.000332f}, - {-0.001608f, +0.007143f, -0.122931f, +0.000855f, +0.002881f, -0.002170f, +0.000072f}, - {+0.000702f, -0.045072f, +0.040098f, -0.018823f, -0.001317f, +0.002269f, +0.000285f}, - {-0.004532f, -0.032658f, +0.089350f, -0.008837f, +0.001128f, +0.005456f, +0.000214f}, - {+0.002363f, +0.019083f, +0.016835f, -0.018529f, -0.001377f, +0.016870f, +0.000540f}, - {+0.001715f, -0.134043f, +0.119796f, -0.009102f, +0.006833f, -0.014270f, -0.000027f}, - {-0.000241f, -0.081470f, -0.041657f, +0.000811f, -0.002552f, -0.004671f, -0.000698f}, - {-0.002448f, +0.073265f, -0.102780f, +0.006728f, -0.005038f, +0.008304f, -0.000118f} - }, - { - {-0.001452f, -0.069169f, -0.359772f, -0.004528f, -0.001473f, -0.001174f, -0.000052f}, - {-0.000298f, -0.104548f, -0.415506f, -0.005346f, -0.002661f, -0.003417f, -0.000022f}, - {-0.004227f, -0.021575f, -0.027481f, -0.005602f, -0.003477f, -0.000211f, +0.000081f}, - {+0.001287f, +0.013519f, -0.267631f, +0.008302f, -0.001317f, +0.004439f, -0.000141f}, - {-0.000359f, +0.000352f, -0.067106f, +0.012917f, +0.006433f, +0.003644f, -0.000143f}, - {-0.004008f, -0.012160f, -0.057113f, -0.006758f, -0.001210f, -0.002980f, +0.000130f}, - {-0.002266f, -0.023397f, +0.318814f, -0.007434f, +0.005449f, -0.001677f, +0.000180f}, - {-0.001788f, +0.018561f, -0.001859f, -0.003902f, -0.003138f, +0.001594f, +0.000177f}, - {+0.000498f, +0.040998f, -0.104388f, +0.007015f, +0.005666f, -0.003054f, -0.000009f}, - {-0.000750f, +0.015717f, -0.104401f, +0.011167f, +0.018971f, -0.000557f, -0.000338f}, - {-0.002290f, +0.018734f, +0.161180f, +0.000199f, -0.006956f, -0.002383f, +0.000251f}, - {-0.002329f, -0.000388f, +0.118224f, -0.001665f, -0.000288f, -0.002715f, -0.000270f}, - {-0.008356f, -0.024500f, +0.022446f, +0.012317f, -0.008248f, -0.005294f, -0.000668f}, - {+0.006958f, -0.022401f, +0.224422f, +0.002575f, +0.012970f, -0.007896f, +0.000296f}, - {+0.006675f, +0.016668f, +0.092843f, -0.004034f, +0.003197f, +0.011486f, +0.000459f}, - {+0.003001f, +0.042559f, -0.167839f, -0.012591f, -0.010475f, +0.006189f, +0.000137f} - }, - { - {+0.001035f, -0.135712f, -0.265067f, -0.014975f, -0.000173f, -0.002689f, -0.000027f}, - {+0.000022f, -0.153794f, -0.337679f, -0.016131f, -0.002264f, -0.001857f, -0.000076f}, - {+0.002408f, -0.029883f, -0.058542f, +0.003685f, -0.004307f, -0.001136f, -0.000028f}, - {-0.001009f, -0.110854f, -0.066337f, -0.007994f, +0.001871f, -0.001869f, +0.000206f}, - {-0.001958f, -0.038357f, +0.009285f, +0.006704f, +0.004883f, -0.003613f, +0.000203f}, - {+0.002126f, -0.034418f, -0.063655f, -0.004958f, -0.005206f, -0.002377f, -0.000286f}, - {+0.000538f, +0.150140f, +0.064965f, +0.004933f, +0.003963f, -0.000065f, +0.000002f}, - {-0.001160f, -0.027758f, +0.059854f, +0.003349f, -0.002280f, +0.003818f, -0.000068f}, - {-0.001370f, -0.078725f, +0.069559f, +0.006628f, -0.004080f, +0.003499f, -0.000321f}, - {+0.005045f, -0.087250f, +0.030052f, +0.009251f, +0.005200f, +0.005087f, -0.000028f}, - {-0.004623f, +0.037497f, +0.117998f, +0.017368f, -0.005325f, -0.002149f, -0.000273f}, - {+0.002264f, +0.112372f, -0.037646f, -0.000037f, -0.001923f, -0.006678f, -0.000193f}, - {+0.001085f, +0.002533f, -0.050740f, +0.020287f, -0.001175f, -0.016779f, -0.000229f}, - {-0.003630f, +0.183327f, +0.014287f, +0.012823f, -0.005434f, +0.009035f, -0.000371f}, - {-0.003395f, +0.010246f, +0.150859f, -0.008983f, +0.010531f, +0.013647f, +0.000481f}, - {-0.000416f, -0.086769f, +0.004870f, -0.014825f, -0.000882f, +0.001829f, +0.000113f} - }, - { - {+0.000645f, +0.154946f, +0.177668f, +0.017072f, +0.000651f, -0.001522f, +0.000072f}, - {-0.000549f, +0.194573f, +0.188311f, +0.025413f, +0.001784f, +0.002119f, +0.000030f}, - {+0.002387f, +0.018045f, +0.004555f, +0.005425f, -0.001933f, +0.000483f, -0.000060f}, - {+0.000284f, +0.072221f, +0.199350f, +0.001255f, -0.006916f, -0.008191f, -0.000017f}, - {+0.002646f, +0.013121f, +0.061521f, -0.004586f, -0.008749f, -0.011041f, -0.000026f}, - {+0.001392f, -0.014040f, -0.018106f, +0.002009f, -0.001377f, +0.001398f, +0.000040f}, - {+0.001216f, -0.089923f, -0.283202f, -0.010597f, +0.000107f, -0.005548f, -0.000176f}, - {+0.001911f, +0.010949f, +0.090459f, +0.006436f, +0.003223f, +0.005766f, -0.000234f}, - {+0.000186f, -0.021096f, +0.146517f, +0.004613f, -0.006003f, +0.005164f, +0.000046f}, - {-0.004900f, -0.001082f, +0.145303f, +0.003824f, -0.005874f, +0.001264f, +0.000130f}, - {+0.006513f, -0.036434f, -0.017113f, +0.008670f, +0.001776f, +0.001766f, -0.000139f}, - {+0.002383f, -0.011656f, -0.199522f, +0.001517f, +0.000917f, -0.006316f, +0.000312f}, - {+0.004072f, -0.017482f, -0.140043f, -0.005490f, +0.003161f, -0.009171f, +0.000809f}, - {-0.003928f, +0.035690f, -0.165301f, +0.017863f, +0.001525f, +0.015105f, -0.000020f}, - {-0.004490f, +0.026473f, +0.158660f, -0.016182f, +0.002051f, +0.001422f, -0.000697f}, - {-0.002701f, +0.021762f, +0.186409f, +0.002465f, +0.003261f, -0.000400f, -0.000186f} - }, - { - {+0.000099f, +0.036368f, +0.371003f, +0.001629f, +0.000185f, -0.000164f, -0.000035f}, - {+0.001027f, +0.021065f, +0.455523f, +0.007009f, -0.000171f, +0.003644f, +0.000031f}, - {-0.002203f, +0.010908f, +0.054143f, -0.006492f, +0.001603f, -0.000076f, +0.000020f}, - {+0.000202f, +0.081447f, +0.185899f, -0.000039f, -0.002519f, -0.009060f, -0.000207f}, - {-0.000145f, +0.040892f, +0.024916f, -0.002845f, -0.007084f, -0.008654f, -0.000149f}, - {-0.000681f, -0.015374f, +0.019466f, -0.006281f, +0.004147f, -0.001144f, +0.000190f}, - {-0.000720f, -0.090186f, -0.294095f, -0.004346f, +0.001360f, -0.006895f, +0.000032f}, - {+0.001250f, +0.048376f, +0.032072f, +0.005694f, +0.004343f, +0.001826f, +0.000175f}, - {+0.001972f, +0.055906f, +0.051458f, -0.008972f, +0.008989f, -0.004482f, +0.000341f}, - {+0.000721f, +0.053054f, +0.080364f, +0.010933f, +0.000804f, -0.005258f, +0.000240f}, - {+0.001755f, +0.008278f, -0.060930f, -0.007833f, +0.006118f, -0.000505f, +0.000186f}, - {-0.002845f, -0.055065f, -0.155770f, +0.013884f, -0.002897f, -0.003665f, +0.000097f}, - {+0.001472f, -0.015073f, -0.108333f, -0.008884f, -0.002637f, +0.002145f, -0.000265f}, - {+0.002067f, -0.074717f, -0.056765f, -0.010752f, +0.008573f, +0.010308f, +0.000507f}, - {+0.004477f, +0.042604f, +0.079819f, -0.009975f, +0.003623f, -0.005897f, -0.000048f}, - {+0.003540f, +0.034868f, +0.173761f, -0.016563f, +0.013425f, -0.007023f, -0.000066f} - }, - { - {-0.002183f, -0.153188f, +0.087452f, -0.017701f, +0.000455f, -0.000059f, -0.000031f}, - {-0.000837f, -0.194734f, +0.137795f, -0.017874f, -0.004064f, +0.001732f, -0.000005f}, - {-0.001557f, -0.009676f, +0.022334f, -0.008279f, +0.003448f, -0.001046f, +0.000008f}, - {-0.000623f, -0.079188f, -0.056711f, -0.015350f, +0.006488f, +0.001018f, +0.000189f}, - {-0.002293f, +0.003889f, -0.025529f, +0.001638f, +0.006470f, +0.003898f, +0.000154f}, - {-0.001846f, +0.009455f, +0.036884f, -0.009081f, +0.004726f, -0.003122f, -0.000129f}, - {-0.001102f, +0.135342f, +0.027798f, +0.014279f, +0.007762f, +0.000259f, +0.000211f}, - {-0.002017f, -0.058553f, -0.096374f, -0.002043f, +0.001398f, -0.003248f, +0.000161f}, - {-0.001923f, -0.019124f, -0.056759f, -0.013113f, +0.012447f, -0.007132f, -0.000136f}, - {+0.002339f, -0.011508f, -0.033382f, -0.007946f, +0.001297f, -0.003215f, -0.000190f}, - {-0.006828f, +0.026842f, -0.004072f, -0.001985f, +0.003739f, -0.003753f, +0.000089f}, - {-0.000656f, +0.067311f, +0.002677f, +0.013922f, +0.003169f, -0.000952f, -0.000271f}, - {-0.006268f, +0.106955f, +0.113991f, +0.011181f, -0.002632f, +0.003434f, -0.000563f}, - {+0.004974f, -0.010018f, +0.065905f, +0.006508f, -0.004051f, -0.007315f, -0.000366f}, - {+0.002011f, -0.084345f, -0.082409f, -0.005323f, +0.003835f, -0.005258f, +0.000564f}, - {-0.001219f, -0.090067f, -0.002658f, -0.027505f, +0.008564f, -0.005530f, +0.000179f} - }, - { - {+0.001676f, +0.080558f, -0.289199f, +0.010856f, -0.001705f, +0.001083f, +0.000061f}, - {+0.000604f, +0.113797f, -0.341125f, +0.013986f, -0.002559f, +0.000854f, -0.000034f}, - {+0.001412f, +0.004029f, -0.029843f, -0.001918f, +0.004280f, -0.001322f, +0.000062f}, - {+0.001059f, +0.017126f, -0.215757f, +0.009036f, -0.003131f, +0.007262f, +0.000030f}, - {+0.002126f, +0.010907f, -0.045035f, +0.009192f, +0.000070f, +0.009903f, -0.000020f}, - {+0.000402f, +0.017331f, +0.008068f, -0.007097f, +0.000818f, -0.000446f, -0.000032f}, - {+0.002552f, -0.019031f, +0.267246f, +0.002794f, +0.003761f, +0.007416f, -0.000074f}, - {-0.001830f, -0.057617f, -0.100520f, +0.002131f, -0.000594f, -0.002920f, -0.000253f}, - {-0.000762f, -0.011768f, -0.059922f, -0.015063f, +0.002708f, -0.001199f, -0.000329f}, - {-0.002450f, +0.031770f, -0.094689f, -0.023282f, -0.000467f, +0.004312f, -0.000416f}, - {+0.000761f, -0.034628f, +0.069799f, -0.000792f, -0.001198f, +0.000138f, -0.000078f}, - {+0.001806f, -0.008081f, +0.111324f, +0.010794f, -0.000375f, +0.004200f, -0.000039f}, - {+0.001363f, -0.031037f, +0.279729f, -0.006910f, -0.003632f, +0.002136f, +0.000578f}, - {-0.004327f, +0.034468f, +0.049016f, +0.013984f, -0.003393f, -0.015626f, -0.000281f}, - {-0.002852f, +0.006131f, -0.177457f, +0.009111f, +0.001002f, -0.000720f, -0.000233f}, - {-0.001818f, +0.009660f, -0.145990f, -0.004769f, -0.003075f, -0.000340f, +0.000041f} - }, - { - {+0.000552f, +0.069003f, -0.301992f, +0.008999f, -0.002406f, +0.001408f, -0.000044f}, - {-0.000802f, +0.083031f, -0.389256f, +0.010430f, -0.003080f, +0.000170f, +0.000017f}, - {+0.001854f, -0.004303f, -0.039738f, -0.002076f, +0.002884f, -0.001064f, -0.000029f}, - {-0.000928f, +0.080110f, -0.113738f, +0.018229f, -0.004586f, +0.006420f, -0.000168f}, - {-0.001017f, +0.018957f, -0.020512f, +0.009990f, -0.000517f, +0.008319f, -0.000130f}, - {+0.002904f, -0.018312f, -0.036890f, -0.007636f, -0.002542f, +0.000516f, +0.000078f}, - {-0.002954f, -0.060368f, +0.217523f, +0.002451f, +0.005655f, +0.004182f, -0.000317f}, - {+0.003919f, +0.063163f, +0.040871f, +0.006505f, -0.000581f, -0.000746f, +0.000040f}, - {+0.002405f, +0.015869f, -0.003557f, +0.001227f, +0.001181f, +0.003627f, +0.000263f}, - {+0.001198f, +0.012221f, -0.089063f, -0.001056f, +0.001660f, +0.007526f, +0.000479f}, - {+0.005324f, -0.011776f, +0.070950f, -0.005147f, +0.003184f, +0.000378f, -0.000142f}, - {+0.000051f, -0.028299f, +0.085723f, +0.005212f, +0.001858f, +0.007443f, +0.000157f}, - {+0.004306f, -0.142068f, +0.110900f, -0.013176f, -0.003157f, -0.002452f, +0.000049f}, - {-0.002413f, -0.017599f, -0.058088f, -0.006858f, +0.002731f, -0.002117f, +0.000497f}, - {-0.002874f, +0.105920f, -0.045074f, +0.010682f, +0.002132f, +0.002632f, -0.000206f}, - {+0.002079f, +0.058269f, -0.081409f, +0.010848f, -0.004241f, +0.001114f, -0.000140f} - }, - { - {-0.000418f, -0.142873f, +0.039874f, -0.019991f, +0.002205f, -0.000747f, -0.000005f}, - {+0.000936f, -0.189643f, +0.031282f, -0.020851f, +0.005506f, -0.005310f, +0.000013f}, - {-0.001308f, -0.006482f, -0.008509f, -0.006678f, -0.002770f, +0.003622f, -0.000135f}, - {+0.000352f, -0.070885f, +0.103936f, +0.002558f, +0.003246f, -0.000103f, +0.000099f}, - {+0.000887f, -0.045238f, +0.048190f, +0.008634f, +0.007525f, -0.000260f, +0.000172f}, - {-0.002007f, +0.012279f, -0.056322f, -0.008316f, -0.007235f, +0.004635f, -0.000040f}, - {+0.001704f, +0.071575f, -0.010837f, +0.019662f, +0.006908f, +0.000040f, +0.000304f}, - {-0.000579f, +0.012185f, +0.136975f, -0.003098f, -0.002671f, +0.000450f, +0.000120f}, - {-0.000783f, +0.012147f, +0.013944f, -0.004558f, -0.003031f, +0.006334f, +0.000232f}, - {+0.000405f, -0.033333f, -0.004358f, -0.008655f, +0.005913f, +0.003262f, +0.000314f}, - {-0.001823f, +0.042713f, +0.011527f, -0.005063f, +0.002103f, +0.001502f, +0.000065f}, - {-0.000974f, +0.024120f, -0.004097f, +0.007567f, +0.008038f, +0.004120f, +0.000156f}, - {-0.001640f, +0.093084f, -0.198061f, +0.003093f, -0.002683f, +0.001119f, -0.000406f}, - {+0.003567f, -0.007486f, -0.098988f, -0.008744f, +0.000657f, +0.004123f, -0.000005f}, - {+0.004574f, -0.078397f, +0.170549f, +0.002466f, -0.001846f, +0.002619f, +0.000132f}, - {+0.000617f, -0.007229f, +0.037692f, -0.007070f, -0.006347f, +0.005576f, -0.000078f} - }, - { - {-0.001486f, +0.056882f, +0.344270f, +0.002981f, +0.002487f, +0.000072f, +0.000054f}, - {-0.000547f, +0.073464f, +0.437965f, +0.006803f, +0.006483f, -0.002618f, -0.000013f}, - {-0.002208f, +0.014125f, +0.020584f, -0.002492f, -0.000969f, +0.003592f, +0.000109f}, - {-0.000305f, -0.016927f, +0.185175f, -0.003380f, -0.001318f, -0.002537f, +0.000023f}, - {-0.000351f, -0.029189f, +0.073389f, +0.000284f, +0.000493f, -0.005939f, -0.000055f}, - {-0.001499f, +0.034879f, -0.021228f, +0.004371f, -0.002644f, +0.004411f, -0.000007f}, - {+0.000897f, -0.046281f, -0.193165f, -0.000062f, -0.001114f, -0.004264f, +0.000213f}, - {-0.002752f, -0.051084f, +0.069214f, +0.001396f, +0.003500f, -0.000286f, -0.000111f}, - {-0.001121f, -0.015804f, -0.019775f, -0.002359f, -0.004389f, +0.000835f, -0.000349f}, - {-0.001148f, +0.019967f, +0.074378f, -0.001520f, +0.002356f, -0.007542f, -0.000708f}, - {-0.003015f, +0.000567f, -0.032040f, -0.000478f, +0.007053f, +0.003880f, +0.000168f}, - {+0.000599f, -0.031243f, -0.090853f, -0.001066f, +0.003609f, -0.001923f, -0.000219f}, - {-0.002584f, +0.058926f, -0.270418f, -0.007516f, +0.005804f, +0.009528f, +0.000212f}, - {+0.001291f, +0.042693f, -0.027401f, -0.014999f, -0.004171f, +0.003174f, -0.000358f}, - {-0.000365f, -0.070750f, +0.194323f, -0.005364f, -0.011038f, -0.002927f, +0.000039f}, - {-0.002865f, +0.017053f, +0.089613f, +0.000603f, -0.002832f, +0.006954f, +0.000143f} - }, - { - {+0.001162f, +0.086726f, +0.283216f, +0.007174f, +0.000292f, +0.001000f, -0.000057f}, - {-0.000280f, +0.113299f, +0.375196f, +0.009194f, +0.001746f, +0.000631f, +0.000011f}, - {+0.001584f, -0.002657f, +0.025271f, -0.001278f, +0.002584f, +0.000574f, +0.000151f}, - {+0.000612f, +0.053497f, +0.079626f, +0.000480f, +0.000018f, -0.003410f, -0.000053f}, - {-0.002124f, +0.011394f, +0.030926f, +0.002382f, -0.003441f, -0.005642f, -0.000133f}, - {+0.001314f, -0.010118f, +0.036750f, -0.003806f, +0.004747f, -0.000553f, +0.000052f}, - {-0.001831f, -0.043275f, -0.185257f, -0.005098f, -0.001017f, -0.000283f, -0.000498f}, - {+0.000841f, +0.040701f, -0.070294f, +0.003830f, +0.009401f, -0.002752f, +0.000077f}, - {+0.000100f, -0.008475f, -0.031005f, -0.000708f, +0.001122f, -0.005186f, -0.000069f}, - {-0.001130f, +0.030959f, +0.056257f, +0.001556f, +0.000116f, -0.010873f, -0.000014f}, - {-0.000403f, -0.010182f, -0.025332f, -0.003832f, +0.009692f, +0.002446f, -0.000086f}, - {-0.000803f, -0.016374f, -0.101303f, -0.002464f, +0.006149f, -0.004906f, -0.000224f}, - {-0.000197f, -0.109631f, -0.065418f, -0.005555f, +0.002254f, +0.006250f, +0.000073f}, - {-0.002052f, +0.011617f, +0.030519f, -0.011538f, -0.006873f, +0.002073f, +0.000080f}, - {-0.001077f, +0.085345f, +0.002855f, +0.007450f, -0.007853f, -0.001185f, +0.000097f}, - {+0.002250f, +0.036761f, +0.046050f, +0.003265f, +0.006503f, +0.000120f, +0.000142f} - }, - { - {+0.000832f, -0.158853f, -0.072678f, -0.012837f, -0.001243f, +0.000766f, +0.000001f}, - {+0.001371f, -0.196755f, -0.090338f, -0.015963f, -0.002640f, -0.000092f, -0.000018f}, - {+0.002755f, -0.004994f, +0.024145f, +0.002847f, -0.001298f, -0.004721f, -0.000196f}, - {+0.000183f, -0.068683f, -0.100662f, -0.001292f, +0.000276f, -0.003596f, +0.000038f}, - {+0.004483f, -0.020981f, -0.050436f, -0.005530f, -0.012253f, -0.005578f, +0.000204f}, - {+0.001815f, -0.002810f, +0.053671f, +0.002732f, +0.007735f, -0.004239f, -0.000035f}, - {-0.001514f, +0.072829f, -0.017583f, -0.007325f, +0.002548f, +0.007120f, +0.000100f}, - {+0.003140f, +0.020486f, -0.131828f, -0.003411f, +0.006628f, -0.002774f, -0.000011f}, - {+0.001742f, +0.019912f, -0.000260f, +0.004598f, +0.007668f, -0.001955f, +0.000329f}, - {+0.005335f, -0.019705f, -0.047513f, -0.006920f, -0.004015f, -0.005271f, +0.000701f}, - {+0.005474f, +0.005480f, -0.023623f, -0.006954f, +0.001571f, -0.004400f, -0.000139f}, - {+0.000204f, +0.046146f, -0.019690f, -0.000994f, +0.009635f, -0.000428f, +0.000413f}, - {+0.004339f, +0.007559f, +0.127446f, +0.001487f, -0.005782f, -0.002564f, -0.000124f}, - {-0.002984f, -0.018528f, +0.001355f, -0.007831f, -0.002702f, +0.004698f, +0.000223f}, - {-0.001367f, +0.031137f, -0.113810f, +0.002510f, -0.008233f, -0.002569f, -0.000155f}, - {+0.000009f, -0.026245f, -0.034477f, +0.004931f, +0.007176f, -0.005186f, -0.000238f} - }, - { - {-0.000477f, +0.058490f, -0.374545f, -0.004159f, +0.002739f, -0.001094f, +0.000053f}, - {-0.002198f, +0.090787f, -0.515343f, +0.019512f, -0.011118f, +0.002760f, +0.000006f}, - {-0.003536f, +0.014800f, +0.004465f, +0.015900f, -0.007941f, -0.004530f, -0.000120f}, - {-0.002066f, +0.010520f, -0.229451f, +0.023897f, -0.008281f, -0.000987f, -0.000047f}, - {-0.003822f, +0.045322f, -0.163451f, +0.029821f, -0.027772f, +0.003256f, -0.000066f}, - {-0.001898f, +0.027443f, +0.009605f, +0.016147f, +0.003770f, -0.003937f, -0.000066f}, - {+0.006181f, -0.053430f, +0.182900f, -0.048805f, +0.021820f, +0.000734f, +0.000402f}, - {-0.003572f, +0.004723f, -0.113184f, +0.021852f, -0.015940f, +0.005627f, -0.000124f}, - {-0.000782f, +0.015335f, +0.005219f, +0.010880f, +0.004732f, +0.003112f, -0.000067f}, - {-0.006371f, +0.061427f, -0.195453f, +0.054114f, -0.027990f, +0.010717f, -0.000260f}, - {-0.002273f, +0.021317f, -0.031278f, +0.003656f, -0.010351f, +0.000120f, +0.000050f}, - {+0.002561f, -0.012507f, +0.081773f, -0.021758f, +0.012853f, +0.001867f, +0.000061f}, - {-0.001484f, -0.021192f, +0.210492f, -0.022630f, +0.009588f, -0.011400f, +0.000044f}, - {+0.005245f, -0.017676f, -0.015155f, -0.024154f, +0.011647f, +0.000569f, -0.000003f}, - {-0.000187f, -0.011239f, -0.111629f, +0.029530f, -0.019611f, -0.001593f, -0.000139f}, - {-0.001637f, -0.009739f, -0.067653f, +0.013129f, +0.001334f, -0.008061f, -0.000131f} - }, - { - {-0.001659f, +0.077353f, -0.359886f, -0.001342f, +0.003150f, -0.002566f, -0.000035f}, - {+0.001743f, +0.095489f, -0.538290f, +0.007895f, -0.005864f, +0.004758f, +0.000015f}, - {+0.000199f, -0.021824f, -0.059806f, +0.003881f, -0.005303f, +0.002246f, +0.000274f}, - {+0.002843f, +0.025276f, -0.232757f, +0.006919f, -0.005946f, +0.005166f, +0.000025f}, - {+0.001000f, +0.042449f, -0.207087f, +0.002790f, -0.014255f, +0.008316f, -0.000140f}, - {-0.000864f, -0.019677f, -0.065963f, +0.005015f, -0.000565f, -0.000970f, +0.000100f}, - {-0.006272f, +0.011725f, +0.307474f, -0.022937f, +0.016682f, -0.012514f, -0.000292f}, - {+0.000891f, +0.038792f, -0.076724f, +0.005785f, -0.013845f, +0.007378f, +0.000127f}, - {-0.001574f, +0.009977f, -0.015642f, -0.004639f, -0.000740f, -0.000203f, -0.000226f}, - {+0.002378f, +0.068006f, -0.252407f, +0.007752f, -0.019800f, +0.013024f, -0.000522f}, - {-0.004302f, +0.060260f, +0.005996f, -0.003943f, -0.005945f, -0.002528f, +0.000155f}, - {-0.003991f, +0.015204f, +0.149872f, -0.006936f, +0.007406f, -0.005552f, -0.000438f}, - {-0.003479f, -0.031918f, +0.202480f, -0.003236f, +0.010951f, -0.010456f, +0.000030f}, - {-0.001985f, +0.025675f, +0.051263f, -0.016015f, +0.009638f, -0.007087f, -0.000243f}, - {+0.005351f, -0.015965f, -0.094735f, +0.021303f, -0.013086f, +0.009584f, +0.000288f}, - {+0.002121f, -0.032597f, -0.093402f, +0.010396f, -0.001090f, +0.000499f, +0.000356f} - }, - { - {+0.001361f, -0.127216f, -0.096953f, +0.006235f, -0.000180f, -0.000731f, -0.000024f}, - {-0.000077f, -0.185659f, -0.165622f, +0.007882f, +0.002327f, +0.000515f, -0.000009f}, - {+0.000798f, +0.001405f, -0.110977f, +0.003087f, +0.000336f, +0.002285f, +0.000037f}, - {-0.001371f, -0.069821f, -0.106352f, +0.006433f, +0.001232f, +0.002833f, +0.000059f}, - {+0.000676f, -0.076651f, -0.074758f, +0.008439f, +0.001331f, +0.000214f, +0.000188f}, - {+0.001012f, +0.000045f, -0.101569f, -0.000762f, -0.000644f, +0.001165f, +0.000031f}, - {+0.001504f, +0.068991f, +0.219465f, -0.002619f, -0.002215f, -0.004299f, -0.000189f}, - {+0.000708f, -0.054030f, +0.019772f, +0.009350f, +0.001699f, -0.000302f, +0.000084f}, - {+0.001417f, -0.007861f, -0.018247f, +0.005171f, -0.001109f, -0.001575f, +0.000109f}, - {+0.001702f, -0.108115f, -0.056674f, +0.007191f, +0.000679f, -0.001209f, +0.000390f}, - {+0.003820f, -0.028678f, +0.094978f, +0.001056f, -0.001138f, -0.002897f, -0.000028f}, - {+0.001163f, +0.013941f, +0.146232f, -0.003691f, -0.002281f, -0.002873f, +0.000110f}, - {+0.001835f, +0.058948f, +0.092899f, -0.010727f, -0.001995f, -0.000419f, -0.000068f}, - {-0.000383f, +0.011179f, +0.080862f, -0.000626f, -0.001516f, -0.003705f, -0.000018f}, - {-0.004888f, -0.032976f, -0.033844f, +0.002714f, +0.003106f, +0.003558f, +0.000045f}, - {-0.001851f, -0.003757f, -0.114020f, +0.002867f, +0.000714f, +0.003783f, +0.000001f} - }, - { - {+0.000989f, +0.092433f, +0.193494f, -0.016545f, -0.001036f, +0.000893f, +0.000031f}, - {-0.000902f, +0.141939f, +0.265388f, -0.024296f, -0.001144f, -0.001844f, -0.000003f}, - {+0.001383f, -0.000237f, -0.122476f, -0.000540f, +0.001285f, +0.001055f, -0.000304f}, - {-0.000497f, +0.058598f, +0.045853f, -0.014865f, -0.000634f, +0.000463f, -0.000091f}, - {-0.000237f, +0.057564f, +0.087896f, -0.015305f, +0.001272f, -0.001760f, -0.000039f}, - {+0.001374f, +0.003361f, -0.091147f, +0.000960f, -0.000406f, +0.001710f, -0.000148f}, - {+0.001943f, -0.066809f, +0.042081f, +0.008400f, -0.000093f, +0.002768f, +0.000282f}, - {-0.000153f, +0.028003f, +0.111273f, -0.008248f, +0.001235f, -0.003749f, -0.000175f}, - {+0.000675f, +0.002884f, -0.010918f, -0.003694f, -0.000404f, -0.000614f, +0.000132f}, - {-0.001418f, +0.072420f, +0.180948f, -0.017214f, -0.000992f, -0.005319f, +0.000293f}, - {+0.001484f, +0.001291f, +0.146812f, -0.001551f, +0.002710f, +0.000106f, -0.000206f}, - {+0.002004f, -0.023206f, +0.102482f, +0.004154f, -0.000028f, +0.001722f, +0.000309f}, - {+0.002826f, -0.051123f, -0.022162f, +0.015905f, +0.000248f, +0.005517f, +0.000008f}, - {-0.000743f, -0.005847f, +0.051339f, -0.003006f, +0.000343f, +0.000305f, +0.000318f}, - {-0.001312f, +0.033335f, +0.026403f, -0.004254f, +0.000299f, -0.002144f, -0.000310f}, - {+0.000777f, +0.010567f, -0.110591f, +0.000664f, +0.001107f, +0.002352f, -0.000367f} - }, - { - {-0.001081f, -0.033814f, +0.333833f, +0.015580f, -0.000169f, +0.001418f, +0.000020f}, - {+0.000068f, -0.051968f, +0.486920f, +0.018057f, -0.001446f, -0.002909f, -0.000020f}, - {-0.001231f, -0.003720f, -0.105259f, +0.003104f, +0.000408f, -0.000534f, +0.000068f}, - {+0.000669f, -0.025095f, +0.126683f, +0.013011f, +0.000378f, -0.001754f, +0.000001f}, - {-0.000431f, -0.024471f, +0.168776f, +0.013940f, +0.000659f, -0.001756f, -0.000118f}, - {-0.001220f, -0.006562f, -0.066045f, +0.001255f, -0.000672f, +0.001593f, +0.000055f}, - {-0.000638f, +0.032380f, -0.077154f, -0.011244f, -0.002050f, +0.006869f, +0.000080f}, - {-0.000384f, -0.003919f, +0.154252f, +0.002162f, -0.000624f, -0.004539f, -0.000060f}, - {-0.000933f, -0.004213f, -0.005919f, +0.002857f, -0.000013f, +0.001095f, -0.000087f}, - {-0.000897f, -0.024730f, +0.295271f, +0.014868f, -0.000581f, -0.004478f, -0.000366f}, - {-0.002205f, +0.007868f, +0.149414f, -0.001464f, -0.001968f, +0.002619f, +0.000072f}, - {-0.000856f, +0.018526f, +0.060893f, -0.004704f, -0.000041f, +0.005169f, -0.000105f}, - {-0.001868f, +0.025649f, -0.086705f, -0.011873f, -0.000399f, +0.008170f, +0.000137f}, - {+0.000887f, +0.002393f, +0.005593f, +0.004599f, +0.000139f, +0.003740f, -0.000067f}, - {+0.003181f, -0.002560f, +0.063703f, -0.002038f, -0.001140f, -0.005416f, +0.000026f}, - {+0.000621f, -0.004432f, -0.093619f, +0.002450f, +0.000816f, +0.000256f, +0.000136f} - }, - { - {-0.000993f, -0.001761f, +0.290470f, -0.026998f, +0.004346f, +0.001346f, -0.000039f}, - {+0.000907f, -0.008888f, +0.442379f, -0.025931f, +0.005447f, -0.002552f, +0.000039f}, - {-0.001503f, +0.012850f, -0.084634f, -0.005522f, -0.001963f, -0.000167f, +0.000255f}, - {+0.000250f, +0.003902f, +0.108970f, -0.022510f, +0.001247f, -0.002167f, +0.000089f}, - {+0.000174f, +0.001806f, +0.141803f, -0.020639f, +0.002673f, -0.000809f, +0.000112f}, - {-0.001312f, +0.013144f, -0.050638f, -0.007456f, -0.001478f, +0.001569f, +0.000104f}, - {-0.001499f, -0.008388f, -0.082956f, +0.019708f, -0.001680f, +0.005721f, -0.000262f}, - {-0.000041f, -0.001863f, +0.127396f, -0.012108f, +0.001411f, -0.002508f, +0.000239f}, - {-0.000715f, +0.006113f, -0.013908f, -0.011484f, +0.000460f, +0.001411f, -0.000095f}, - {+0.000981f, -0.002577f, +0.248744f, -0.018853f, +0.004160f, -0.002225f, -0.000118f}, - {-0.001352f, -0.005720f, +0.121014f, +0.004489f, -0.000186f, +0.003461f, +0.000201f}, - {-0.001794f, -0.007883f, +0.040311f, +0.006885f, +0.000317f, +0.004274f, -0.000273f}, - {-0.002392f, -0.002476f, -0.074256f, +0.022144f, -0.001551f, +0.006133f, -0.000150f}, - {+0.001088f, -0.008842f, -0.006752f, +0.003464f, -0.000302f, +0.002836f, -0.000315f}, - {+0.001092f, -0.012713f, +0.072873f, +0.008050f, +0.000423f, -0.003892f, +0.000312f}, - {-0.000911f, +0.006864f, -0.069290f, -0.001134f, -0.000822f, +0.000026f, +0.000265f} - } -}; - -const float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]= -{ - { - {-0.004181f, +0.093228f, +0.655506f, +0.048565f, -0.005834f, -0.005472f, -0.000066f}, - {-0.005374f, -0.154923f, +0.116326f, +0.006786f, -0.018305f, -0.006415f, -0.000041f}, - {-0.018684f, -0.029658f, +0.105423f, -0.036469f, +0.025356f, +0.038274f, +0.001267f}, - {-0.008871f, +0.005481f, +0.057893f, -0.019694f, -0.003264f, +0.024498f, +0.000905f}, - {+0.007135f, -0.000238f, +0.011224f, -0.011879f, +0.000153f, -0.021305f, -0.001042f}, - {+0.011073f, +0.016271f, +0.017319f, -0.023598f, -0.000936f, -0.014578f, -0.000910f}, - {-0.015550f, -0.028470f, -0.026848f, +0.035803f, -0.009496f, +0.011103f, +0.001177f}, - {-0.015302f, -0.004218f, +0.013086f, +0.011363f, -0.012451f, +0.030157f, +0.000806f}, - {+0.006118f, -0.009705f, +0.007305f, -0.026069f, -0.010633f, +0.007816f, +0.000054f}, - {+0.000283f, +0.011328f, -0.005244f, -0.003740f, +0.001375f, -0.008133f, -0.000147f}, - {+0.007055f, -0.006562f, +0.019723f, +0.006761f, -0.003557f, -0.002004f, -0.000575f}, - {+0.005753f, +0.006934f, -0.005584f, -0.015274f, -0.002805f, +0.023709f, +0.000371f}, - {+0.001950f, +0.010016f, +0.006074f, +0.008742f, +0.013106f, -0.015378f, -0.000623f}, - {+0.004074f, -0.005302f, -0.028657f, +0.012447f, +0.002805f, -0.010937f, -0.000426f}, - {-0.004197f, -0.012821f, +0.003244f, +0.002529f, +0.002057f, +0.017829f, +0.000124f}, - {-0.000963f, -0.001662f, +0.000380f, -0.001216f, -0.003218f, +0.008842f, +0.000285f} - }, - { - {+0.003556f, -0.239019f, +0.015814f, -0.034927f, +0.000835f, -0.000512f, +0.000096f}, - {+0.005835f, +0.204261f, +0.475712f, -0.024759f, +0.018679f, +0.011234f, -0.000105f}, - {+0.033721f, +0.079282f, +0.110406f, -0.062743f, -0.006587f, -0.011131f, -0.001989f}, - {+0.017838f, +0.044971f, +0.009827f, -0.031696f, +0.008260f, +0.013480f, -0.001373f}, - {-0.013831f, -0.024735f, +0.028944f, +0.000956f, +0.011000f, +0.001960f, +0.001544f}, - {-0.021084f, -0.059877f, -0.043110f, -0.024830f, +0.009611f, +0.004985f, +0.001304f}, - {+0.024367f, +0.081687f, +0.039981f, +0.014737f, -0.015175f, -0.013033f, -0.001675f}, - {+0.029191f, +0.107182f, +0.052422f, -0.056640f, -0.061598f, -0.000773f, -0.001122f}, - {-0.008281f, -0.074836f, -0.054378f, -0.012477f, +0.014774f, +0.013960f, -0.000068f}, - {+0.000247f, +0.007528f, +0.001935f, +0.000487f, +0.009084f, +0.000991f, +0.000245f}, - {-0.009984f, -0.059593f, -0.036553f, +0.008280f, +0.016629f, +0.010745f, +0.000707f}, - {-0.008513f, -0.061561f, -0.054083f, -0.023396f, -0.007761f, +0.009113f, -0.000565f}, - {-0.007663f, -0.005870f, -0.005063f, +0.019587f, +0.022546f, -0.002888f, +0.000939f}, - {-0.008532f, -0.051613f, -0.057984f, +0.002035f, +0.015445f, +0.003259f, +0.000501f}, - {+0.007851f, +0.011553f, +0.020470f, -0.020649f, -0.005084f, +0.010733f, -0.000320f}, - {+0.000570f, -0.000978f, +0.021905f, -0.003402f, -0.018285f, -0.001482f, -0.000408f} - }, - { - {+0.007736f, +0.144660f, -0.537748f, -0.004930f, +0.008226f, +0.004392f, +0.000030f}, - {+0.007349f, +0.151725f, +0.515888f, +0.001929f, +0.062669f, -0.004955f, +0.000372f}, - {-0.012179f, +0.171781f, +0.054918f, -0.071555f, +0.033201f, -0.047777f, +0.000031f}, - {-0.008553f, +0.124306f, +0.013829f, -0.071708f, +0.089422f, -0.036145f, -0.000142f}, - {+0.007018f, -0.059230f, -0.004335f, +0.031204f, -0.019769f, +0.032580f, +0.000209f}, - {+0.008972f, -0.099683f, -0.129678f, +0.054026f, -0.027007f, +0.029783f, +0.000267f}, - {+0.002210f, +0.110557f, +0.095413f, -0.048633f, +0.007172f, -0.025076f, -0.000359f}, - {-0.012999f, +0.162940f, +0.053582f, -0.061108f, -0.031308f, -0.032573f, -0.000315f}, - {-0.004442f, -0.087134f, -0.064380f, +0.020402f, +0.034501f, -0.007477f, +0.000025f}, - {-0.001523f, +0.000248f, +0.027496f, +0.002745f, +0.003190f, +0.007474f, +0.000005f}, - {-0.002997f, -0.089888f, -0.060886f, +0.047296f, +0.022673f, +0.008361f, +0.000391f}, - {-0.000211f, -0.098294f, -0.051481f, +0.008578f, -0.001392f, -0.017489f, -0.000056f}, - {+0.012945f, -0.029045f, -0.019498f, +0.027318f, -0.017298f, +0.022221f, +0.000180f}, - {+0.007159f, -0.062500f, -0.089020f, +0.017716f, -0.003152f, +0.016636f, +0.000389f}, - {-0.001058f, +0.044275f, +0.008121f, -0.027659f, +0.015946f, -0.015722f, +0.000269f}, - {+0.003282f, -0.015996f, +0.030381f, -0.007292f, -0.006963f, -0.008990f, -0.000065f} - }, - { - {-0.011861f, +0.271405f, -0.278430f, +0.025016f, +0.011294f, +0.000635f, -0.000128f}, - {-0.015129f, -0.148744f, +0.117912f, -0.045648f, +0.027880f, -0.014786f, -0.000135f}, - {-0.014271f, +0.053035f, -0.051116f, -0.069585f, +0.052625f, -0.010128f, +0.001602f}, - {-0.010195f, +0.240862f, +0.281626f, -0.015036f, +0.064266f, -0.026405f, +0.001338f}, - {+0.003863f, -0.128285f, -0.125752f, +0.023611f, -0.014719f, +0.008956f, -0.001428f}, - {+0.009981f, -0.104866f, -0.151836f, +0.071803f, -0.037142f, -0.005583f, -0.001248f}, - {-0.029302f, +0.049151f, +0.034147f, -0.080526f, +0.015046f, +0.009918f, +0.001557f}, - {-0.011379f, +0.090502f, -0.003478f, +0.001737f, +0.015717f, -0.005394f, +0.001166f}, - {+0.013601f, +0.081238f, +0.096361f, +0.008808f, +0.002253f, -0.024062f, -0.000103f}, - {+0.000547f, +0.077561f, +0.091202f, -0.015743f, -0.015044f, +0.000452f, -0.000266f}, - {+0.012582f, -0.024498f, +0.001563f, +0.041900f, -0.007496f, -0.015197f, -0.000762f}, - {+0.005409f, -0.069704f, -0.026963f, +0.036542f, -0.004091f, -0.029327f, +0.000573f}, - {-0.010060f, -0.118980f, -0.120352f, +0.001785f, -0.011422f, +0.009820f, -0.001153f}, - {-0.004957f, -0.055368f, -0.084714f, +0.042237f, -0.021229f, -0.008488f, -0.000721f}, - {-0.010961f, +0.026557f, -0.029680f, -0.009625f, +0.016351f, -0.027210f, +0.000149f}, - {-0.006161f, -0.050026f, -0.020995f, -0.004188f, +0.012464f, -0.003841f, +0.000357f} - }, - { - {+0.002854f, -0.199862f, +0.377557f, -0.018029f, -0.002648f, +0.005351f, +0.000048f}, - {+0.007718f, +0.100789f, -0.353419f, +0.007116f, -0.012908f, +0.010862f, -0.000471f}, - {+0.016418f, -0.074324f, +0.003833f, -0.013084f, +0.006916f, +0.022053f, -0.000834f}, - {+0.018457f, +0.117034f, +0.337759f, +0.029601f, -0.001259f, +0.012091f, -0.000541f}, - {-0.007000f, -0.085907f, -0.156550f, +0.033776f, -0.004889f, -0.021889f, +0.000374f}, - {-0.014497f, -0.047168f, -0.105236f, +0.022554f, -0.019941f, -0.024780f, +0.000224f}, - {+0.024730f, +0.024042f, -0.072819f, -0.011540f, -0.016134f, +0.027606f, -0.000150f}, - {+0.015868f, +0.018542f, -0.002232f, +0.039669f, +0.009321f, -0.002315f, -0.000217f}, - {-0.004792f, +0.097726f, +0.134353f, +0.002292f, -0.015559f, -0.007981f, +0.000121f}, - {+0.002961f, +0.078193f, +0.059778f, -0.012020f, -0.013271f, +0.004082f, +0.000112f}, - {-0.006885f, +0.004914f, +0.032684f, +0.024347f, -0.018042f, -0.016734f, -0.000199f}, - {-0.001772f, -0.014925f, -0.028214f, -0.010154f, -0.016195f, -0.004179f, -0.000317f}, - {-0.000537f, -0.110532f, -0.155034f, +0.027494f, -0.005245f, -0.020700f, +0.000591f}, - {+0.004704f, -0.038699f, -0.105421f, +0.070185f, -0.026884f, -0.015695f, -0.000119f}, - {+0.014543f, +0.004277f, -0.088559f, +0.042679f, -0.013529f, -0.007812f, -0.000550f}, - {+0.004113f, -0.037861f, -0.063426f, +0.011996f, -0.002855f, +0.001383f, -0.000115f} - }, - { - {+0.004158f, -0.136179f, +0.471486f, -0.010746f, -0.010150f, -0.000039f, +0.000105f}, - {+0.001616f, +0.103469f, -0.340476f, +0.006395f, -0.017271f, +0.014891f, +0.000499f}, - {-0.002218f, -0.055483f, +0.106726f, +0.030050f, -0.003992f, +0.017802f, -0.000677f}, - {-0.007681f, -0.231402f, -0.096778f, +0.009445f, -0.019641f, +0.009330f, -0.000885f}, - {+0.001659f, +0.038468f, -0.007609f, +0.019464f, -0.012397f, -0.007017f, +0.001037f}, - {+0.002067f, +0.064781f, -0.005724f, +0.006298f, +0.000105f, +0.001293f, +0.000955f}, - {+0.001286f, -0.002826f, -0.003672f, +0.025100f, -0.037327f, +0.015360f, -0.001277f}, - {-0.001989f, -0.020649f, +0.009698f, +0.016654f, -0.003984f, +0.002810f, -0.000842f}, - {-0.009792f, +0.035452f, +0.055742f, -0.018125f, -0.011729f, +0.001735f, +0.000192f}, - {-0.005497f, -0.003715f, -0.049312f, -0.044502f, -0.013554f, +0.000042f, +0.000266f}, - {-0.002308f, -0.000052f, +0.001201f, +0.002945f, -0.024499f, -0.000321f, +0.000757f}, - {+0.000409f, -0.034789f, -0.019482f, -0.002158f, -0.017279f, +0.003930f, -0.000257f}, - {+0.008118f, -0.058308f, -0.099792f, +0.052127f, -0.003244f, -0.003237f, +0.000776f}, - {-0.002482f, +0.018540f, -0.016084f, +0.049919f, +0.004611f, +0.019604f, +0.000812f}, - {-0.004910f, -0.030265f, -0.065174f, +0.035390f, -0.020625f, +0.011275f, +0.000329f}, - {+0.000473f, -0.044402f, -0.047664f, +0.009816f, -0.009466f, +0.005943f, -0.000152f} - }, - { - {-0.000632f, +0.234949f, -0.076449f, +0.029353f, -0.003342f, -0.002513f, -0.000116f}, - {-0.001122f, -0.198229f, +0.135880f, -0.032523f, +0.008400f, +0.002254f, +0.000234f}, - {-0.006474f, +0.012441f, +0.072023f, +0.003003f, -0.002338f, +0.007281f, +0.000731f}, - {-0.007024f, +0.078955f, -0.546900f, +0.031895f, -0.010218f, -0.000083f, +0.000850f}, - {+0.003709f, -0.044602f, +0.152003f, -0.012636f, -0.008659f, +0.000295f, -0.000563f}, - {+0.010219f, +0.027454f, +0.010304f, +0.002910f, +0.025409f, +0.001683f, -0.000451f}, - {-0.018198f, -0.084105f, +0.144050f, -0.000789f, -0.020402f, -0.010649f, +0.000341f}, - {-0.005226f, -0.009181f, +0.017438f, -0.007286f, +0.000747f, +0.000053f, +0.000472f}, - {+0.008675f, -0.020476f, +0.010393f, -0.001184f, +0.001399f, +0.008992f, -0.000466f}, - {+0.004645f, -0.050041f, -0.039208f, -0.025486f, -0.009431f, -0.003611f, -0.000210f}, - {+0.002164f, +0.021185f, -0.049694f, +0.015111f, -0.035540f, +0.011784f, -0.000018f}, - {-0.004950f, -0.038538f, +0.003861f, -0.013197f, -0.010301f, +0.003601f, +0.000426f}, - {-0.006239f, +0.032304f, -0.110293f, +0.018466f, -0.018058f, +0.013502f, -0.001178f}, - {-0.004171f, -0.047776f, +0.083221f, -0.008780f, +0.051549f, +0.010771f, -0.000331f}, - {-0.004816f, -0.038669f, -0.009734f, -0.007649f, -0.014633f, +0.012471f, +0.000408f}, - {-0.001871f, -0.049422f, +0.001620f, -0.014704f, +0.001301f, +0.000266f, +0.000126f} - }, - { - {-0.002392f, -0.036192f, -0.479850f, -0.001486f, +0.001638f, -0.000479f, -0.000028f}, - {-0.001963f, -0.007857f, +0.431508f, -0.005280f, +0.011825f, -0.003300f, -0.000660f}, - {+0.006153f, -0.066414f, -0.082293f, -0.009897f, +0.005003f, +0.001877f, +0.000116f}, - {+0.005774f, +0.224617f, -0.413182f, +0.006791f, -0.006357f, +0.002392f, +0.000339f}, - {-0.002588f, -0.046307f, +0.160934f, -0.021941f, -0.006604f, +0.003152f, -0.000788f}, - {-0.007718f, -0.039716f, -0.042914f, -0.020400f, +0.026544f, +0.007395f, -0.000668f}, - {+0.014838f, -0.078097f, +0.062858f, -0.030152f, -0.017961f, -0.018307f, +0.001193f}, - {-0.004124f, +0.009420f, +0.007060f, -0.006513f, +0.002601f, +0.003839f, +0.000370f}, - {+0.006195f, -0.101198f, -0.077793f, +0.008266f, +0.024484f, +0.019361f, +0.000086f}, - {-0.001527f, -0.002318f, +0.042308f, +0.011672f, +0.015245f, -0.001589f, -0.000306f}, - {+0.001741f, +0.019739f, -0.044832f, +0.016814f, -0.028009f, +0.014184f, -0.000622f}, - {+0.004708f, +0.024409f, +0.050324f, +0.002679f, +0.001951f, +0.009320f, -0.000159f}, - {+0.000144f, +0.069626f, -0.066872f, +0.001826f, -0.017513f, +0.018588f, +0.000180f}, - {+0.009404f, -0.062001f, +0.038164f, -0.022621f, +0.029874f, -0.005701f, -0.000507f}, - {+0.002125f, +0.011473f, +0.018800f, -0.013683f, -0.013917f, +0.006977f, -0.000722f}, - {-0.000868f, -0.014504f, +0.051713f, +0.021653f, +0.012194f, -0.003663f, -0.000082f} - }, - { - {-0.002627f, -0.217647f, -0.199116f, -0.027874f, +0.001338f, -0.001188f, +0.000121f}, - {-0.001456f, +0.227592f, +0.064939f, +0.030479f, +0.008616f, -0.013142f, +0.000112f}, - {-0.005287f, +0.010510f, -0.168053f, -0.000744f, +0.011442f, -0.010874f, -0.000237f}, - {+0.008122f, -0.212557f, +0.200960f, -0.021301f, +0.000743f, +0.003911f, -0.000783f}, - {-0.003321f, +0.083216f, -0.024517f, -0.036704f, +0.003253f, -0.001363f, +0.000669f}, - {-0.004434f, -0.081515f, -0.013504f, -0.001836f, +0.012951f, +0.003306f, +0.000538f}, - {-0.002527f, +0.121402f, -0.181651f, -0.032907f, -0.017697f, +0.004190f, -0.000617f}, - {+0.011938f, -0.009047f, +0.016303f, -0.005344f, -0.002001f, +0.010309f, -0.000307f}, - {-0.011873f, -0.001538f, -0.140792f, +0.010836f, +0.011246f, +0.016002f, +0.000623f}, - {-0.001530f, +0.013180f, +0.072034f, -0.006709f, +0.010792f, -0.004928f, +0.000404f}, - {+0.000018f, +0.021675f, -0.020101f, -0.009023f, +0.002344f, -0.005474f, +0.000170f}, - {+0.002449f, +0.053967f, +0.045424f, -0.000129f, -0.003141f, +0.010272f, -0.000137f}, - {+0.002967f, -0.038307f, +0.054857f, -0.015668f, +0.009116f, -0.003669f, +0.000920f}, - {-0.006187f, +0.037813f, -0.066234f, +0.004495f, +0.007024f, -0.005535f, +0.000559f}, - {+0.005730f, -0.012869f, +0.023624f, +0.001785f, -0.001105f, -0.003414f, +0.000094f}, - {+0.002570f, +0.016715f, -0.004781f, +0.037235f, +0.005228f, +0.002059f, +0.000081f} - }, - { - {+0.005711f, +0.172046f, +0.340244f, -0.003381f, -0.013696f, -0.007435f, -0.000034f}, - {+0.005530f, -0.112515f, -0.499395f, -0.033784f, -0.003636f, -0.015967f, +0.000566f}, - {+0.004504f, +0.107042f, -0.080755f, -0.022698f, -0.020622f, -0.026444f, -0.000180f}, - {-0.012473f, -0.051897f, +0.566323f, +0.031770f, +0.025642f, +0.017873f, +0.000020f}, - {+0.006985f, -0.051564f, -0.236654f, -0.038126f, -0.000171f, -0.001417f, +0.000657f}, - {+0.009348f, +0.016850f, +0.063936f, +0.001037f, +0.006876f, -0.002280f, +0.000410f}, - {-0.005675f, +0.072635f, -0.278726f, -0.059144f, -0.054019f, -0.009162f, -0.001082f}, - {-0.004093f, -0.010670f, +0.111505f, +0.019792f, -0.002096f, +0.012057f, -0.000160f}, - {-0.000257f, +0.106978f, -0.092498f, -0.031885f, -0.036807f, -0.018315f, -0.000585f}, - {+0.002795f, -0.018562f, +0.027422f, -0.012047f, -0.000133f, -0.004062f, +0.000286f}, - {-0.002864f, +0.009258f, -0.044075f, -0.007042f, +0.021077f, -0.002832f, +0.000326f}, - {-0.003557f, -0.013247f, +0.028639f, +0.035330f, +0.018218f, +0.013147f, +0.000247f}, - {-0.002389f, -0.017115f, +0.090839f, -0.019457f, +0.001333f, -0.020188f, -0.000874f}, - {-0.002543f, +0.056049f, -0.050696f, +0.018136f, -0.005719f, -0.016853f, -0.000034f}, - {-0.004821f, -0.020905f, +0.048575f, +0.000031f, +0.002939f, +0.000094f, +0.000672f}, - {+0.000268f, -0.021535f, -0.056314f, +0.016343f, -0.007238f, -0.001215f, +0.000162f} - }, - { - {+0.000497f, +0.199631f, +0.320546f, -0.008423f, -0.016715f, +0.001536f, -0.000099f}, - {-0.002105f, -0.133643f, -0.457823f, -0.039593f, -0.015856f, +0.006780f, -0.000357f}, - {-0.000079f, +0.081396f, -0.030397f, -0.042814f, -0.032019f, -0.004736f, +0.000009f}, - {-0.000752f, +0.001209f, +0.419299f, +0.074040f, +0.032104f, -0.009226f, +0.000573f}, - {-0.003770f, +0.002457f, -0.265036f, -0.035182f, -0.011981f, +0.015263f, -0.000892f}, - {-0.001110f, +0.071616f, +0.034638f, +0.014567f, -0.006196f, +0.004125f, -0.000526f}, - {+0.004522f, -0.068226f, -0.124263f, -0.072379f, -0.044733f, -0.015592f, +0.001006f}, - {-0.006005f, -0.047558f, +0.167542f, +0.027263f, +0.003279f, -0.009908f, +0.000023f}, - {+0.011422f, +0.014023f, -0.007679f, -0.030936f, -0.025432f, -0.026138f, -0.000327f}, - {-0.001555f, +0.042000f, -0.046252f, -0.010681f, -0.012037f, +0.006048f, -0.000727f}, - {-0.000883f, +0.006033f, -0.055431f, +0.001632f, +0.010415f, +0.001443f, -0.000033f}, - {-0.005003f, -0.047366f, +0.077066f, +0.030162f, +0.026926f, -0.011349f, -0.000163f}, - {+0.000276f, +0.023815f, +0.032561f, -0.004664f, -0.004597f, -0.024338f, -0.000084f}, - {+0.006453f, -0.015468f, +0.033735f, +0.002725f, -0.008248f, -0.008173f, -0.000289f}, - {-0.002307f, -0.023691f, +0.044946f, -0.000352f, +0.013672f, -0.001764f, -0.000499f}, - {-0.004157f, -0.047861f, -0.015442f, -0.000019f, -0.001816f, +0.000663f, -0.000406f} - }, - { - {-0.005964f, -0.197350f, -0.225433f, -0.026481f, -0.003950f, +0.006853f, +0.000077f}, - {-0.003793f, +0.264745f, +0.176567f, +0.023196f, +0.000162f, +0.016113f, -0.000334f}, - {-0.004451f, -0.025566f, -0.133088f, -0.012077f, +0.001550f, +0.015523f, +0.000458f}, - {+0.013172f, -0.221258f, -0.036103f, -0.012790f, +0.008449f, -0.019034f, -0.000168f}, - {-0.002864f, +0.153297f, -0.028848f, +0.004146f, -0.011196f, +0.010167f, -0.000393f}, - {-0.007616f, +0.026433f, -0.011621f, -0.001408f, -0.021183f, +0.002104f, -0.000192f}, - {+0.003962f, -0.009740f, +0.082496f, -0.000654f, +0.011697f, +0.005240f, +0.000722f}, - {+0.001790f, -0.065846f, +0.058500f, -0.003294f, -0.001401f, -0.007149f, +0.000264f}, - {-0.005722f, -0.027626f, +0.065396f, +0.027714f, +0.014716f, -0.003255f, +0.000850f}, - {-0.000381f, +0.020278f, -0.070264f, +0.005215f, +0.005661f, +0.015546f, +0.000010f}, - {+0.005566f, +0.043439f, -0.014711f, -0.011508f, -0.008588f, -0.006241f, -0.000138f}, - {+0.008800f, -0.030897f, +0.031074f, +0.010268f, +0.015735f, -0.011437f, -0.000056f}, - {+0.001946f, -0.054037f, -0.040838f, +0.018449f, +0.011271f, -0.005778f, +0.000769f}, - {-0.001760f, -0.030833f, +0.057221f, +0.007865f, +0.005993f, +0.008404f, +0.000331f}, - {+0.003817f, -0.027235f, +0.000283f, -0.007034f, +0.008768f, -0.002842f, -0.000338f}, - {+0.003914f, -0.006906f, +0.031714f, +0.006856f, +0.002150f, +0.003874f, +0.000040f} - }, - { - {+0.001457f, -0.047583f, -0.495325f, +0.001826f, +0.001333f, +0.003088f, +0.000074f}, - {+0.003753f, -0.008510f, +0.563613f, +0.007615f, +0.008082f, +0.006661f, +0.000427f}, - {+0.004161f, -0.022990f, -0.173930f, +0.006816f, +0.008882f, +0.017712f, -0.000179f}, - {-0.008172f, +0.031420f, -0.316800f, -0.012601f, -0.003429f, -0.006815f, -0.000397f}, - {+0.004546f, +0.000876f, +0.169999f, -0.007495f, -0.004006f, -0.011955f, +0.001091f}, - {+0.004040f, -0.019746f, +0.006157f, -0.011071f, -0.015718f, -0.008190f, +0.000403f}, - {-0.009703f, -0.178427f, +0.280306f, +0.028912f, +0.024755f, +0.018971f, -0.001247f}, - {+0.006735f, +0.062902f, -0.130876f, +0.006194f, -0.003662f, -0.002192f, +0.000078f}, - {-0.005369f, -0.054533f, +0.087578f, +0.035337f, +0.013629f, +0.015368f, -0.000193f}, - {-0.000537f, -0.025648f, -0.007994f, +0.001582f, +0.009441f, +0.002933f, +0.000931f}, - {-0.001931f, +0.022911f, +0.052152f, -0.025436f, -0.010985f, -0.006549f, -0.000366f}, - {-0.001104f, +0.133408f, -0.138104f, +0.014911f, -0.009229f, -0.000823f, +0.000186f}, - {-0.001412f, -0.065891f, -0.013259f, +0.004650f, +0.004768f, +0.018314f, -0.000516f}, - {-0.003560f, -0.040100f, +0.045120f, +0.030156f, -0.004957f, +0.021757f, -0.000275f}, - {-0.000713f, -0.011150f, -0.037123f, +0.018480f, -0.010877f, +0.000661f, +0.000571f}, - {-0.000355f, -0.001036f, +0.026826f, +0.021528f, -0.011143f, +0.005414f, +0.000615f} - }, - { - {+0.004917f, +0.226272f, -0.106762f, +0.026044f, -0.000057f, +0.000232f, -0.000133f}, - {-0.000447f, -0.251546f, +0.187348f, -0.019737f, -0.000219f, -0.003742f, +0.000098f}, - {-0.002107f, +0.100586f, +0.032124f, +0.022602f, -0.003273f, +0.008593f, -0.000509f}, - {-0.004410f, +0.146512f, -0.140248f, +0.007418f, -0.004350f, +0.000903f, +0.000226f}, - {+0.001171f, -0.105409f, +0.055027f, -0.007343f, +0.000273f, -0.017251f, -0.000064f}, - {+0.005972f, -0.023304f, -0.000894f, -0.004305f, +0.000775f, -0.004195f, +0.000102f}, - {+0.002711f, -0.077236f, +0.298881f, -0.003126f, +0.015293f, +0.023057f, -0.000231f}, - {-0.000738f, +0.026778f, -0.124956f, +0.013307f, -0.012450f, -0.010200f, -0.000427f}, - {+0.003679f, -0.030698f, +0.031463f, +0.005909f, -0.005917f, +0.008406f, -0.000670f}, - {+0.004324f, -0.028582f, +0.008041f, +0.006647f, -0.008704f, -0.016778f, -0.000567f}, - {-0.005419f, -0.007352f, +0.027129f, -0.011548f, +0.007720f, +0.008818f, +0.000379f}, - {-0.004487f, +0.054705f, -0.207122f, +0.010876f, -0.032187f, -0.013415f, -0.000030f}, - {-0.003490f, +0.034227f, +0.105685f, +0.015759f, +0.020826f, +0.034768f, -0.000215f}, - {+0.001504f, -0.018606f, +0.027693f, +0.016091f, -0.012131f, +0.014826f, -0.000087f}, - {+0.002136f, +0.015991f, +0.009194f, +0.014987f, -0.023762f, -0.008680f, +0.000105f}, - {-0.001298f, -0.030927f, -0.014560f, +0.013518f, -0.037065f, -0.013374f, -0.000457f} - }, - { - {-0.002855f, -0.080709f, +0.404422f, -0.019653f, +0.001624f, -0.002008f, +0.000004f}, - {+0.000474f, +0.138747f, -0.415942f, +0.024357f, -0.006345f, -0.000660f, -0.000332f}, - {+0.002438f, -0.097479f, +0.316719f, -0.005955f, +0.000256f, -0.004044f, +0.000432f}, - {+0.005548f, -0.072168f, +0.145204f, -0.011399f, -0.004729f, +0.006525f, +0.000260f}, - {-0.006232f, +0.036539f, -0.144292f, +0.020222f, -0.000238f, -0.016212f, -0.001053f}, - {-0.006994f, +0.075916f, -0.070194f, -0.012274f, +0.008481f, -0.002291f, -0.000282f}, - {+0.010641f, +0.141691f, +0.043526f, -0.009240f, +0.002948f, +0.019010f, +0.001265f}, - {-0.012596f, -0.072872f, +0.041895f, +0.001937f, -0.005665f, -0.014239f, -0.000047f}, - {+0.005735f, +0.038590f, -0.066170f, +0.003100f, -0.006978f, +0.003386f, +0.000489f}, - {-0.005820f, +0.013019f, -0.027717f, +0.015063f, -0.006044f, -0.020772f, -0.000699f}, - {+0.005317f, +0.024744f, -0.062066f, -0.000569f, +0.004243f, +0.012342f, +0.000609f}, - {-0.000631f, -0.150800f, -0.012382f, +0.009252f, -0.019727f, -0.012303f, -0.000172f}, - {+0.006829f, +0.105930f, +0.072965f, -0.013344f, +0.017414f, +0.026031f, +0.000559f}, - {+0.003943f, +0.012054f, -0.015121f, +0.003687f, +0.000929f, +0.005727f, +0.000623f}, - {-0.005204f, -0.004393f, +0.064977f, +0.004963f, -0.007088f, -0.010326f, -0.000553f}, - {-0.000739f, -0.007033f, -0.060218f, +0.009762f, -0.013292f, -0.018375f, -0.000507f} - }, - { - {-0.002393f, -0.117302f, +0.356998f, -0.023770f, -0.001521f, -0.003691f, +0.000144f}, - {-0.001809f, +0.120704f, -0.409752f, +0.018770f, -0.014706f, -0.003961f, +0.000008f}, - {-0.001960f, -0.141491f, +0.287454f, -0.006342f, -0.006437f, -0.011911f, +0.000284f}, - {+0.002959f, -0.074011f, +0.157490f, +0.001773f, +0.013139f, +0.012386f, -0.000239f}, - {+0.002902f, +0.081203f, -0.112950f, +0.010741f, +0.003024f, +0.019425f, +0.000547f}, - {-0.002050f, +0.066194f, -0.104659f, -0.016714f, +0.002794f, +0.000866f, -0.000119f}, - {-0.011528f, +0.008225f, -0.112939f, -0.015539f, -0.025693f, -0.040924f, -0.000274f}, - {+0.010410f, +0.025230f, +0.102311f, +0.004806f, +0.021267f, +0.023087f, +0.000575f}, - {-0.005473f, -0.011072f, -0.060495f, +0.003663f, -0.005569f, -0.002042f, +0.000316f}, - {+0.001924f, +0.052236f, -0.013653f, +0.000203f, -0.004939f, +0.011491f, +0.000985f}, - {+0.001647f, -0.011326f, -0.097267f, +0.004425f, -0.014111f, -0.016627f, -0.000941f}, - {+0.003668f, -0.062846f, +0.128135f, +0.003669f, +0.008089f, +0.027424f, +0.000024f}, - {-0.001119f, +0.011806f, -0.046422f, -0.026434f, -0.024751f, -0.030626f, -0.000245f}, - {-0.002447f, -0.008624f, -0.064037f, -0.015087f, -0.020497f, -0.036444f, -0.000501f}, - {+0.000478f, +0.008448f, +0.050137f, +0.002484f, +0.018473f, +0.019501f, +0.000029f}, - {+0.002749f, +0.018668f, -0.022800f, +0.004117f, +0.006094f, +0.020072f, +0.000831f} - }, - { - {+0.001300f, +0.203261f, -0.169783f, +0.024359f, -0.005336f, -0.001691f, -0.000112f}, - {-0.000442f, -0.283920f, +0.228721f, -0.050599f, -0.011296f, -0.008092f, +0.000207f}, - {-0.002414f, +0.094299f, -0.032645f, -0.002329f, -0.001882f, -0.013648f, -0.000457f}, - {-0.004227f, +0.101458f, -0.078323f, +0.025650f, +0.023677f, +0.008354f, -0.000149f}, - {+0.004310f, -0.040486f, +0.067656f, -0.002564f, +0.009152f, +0.020113f, +0.000721f}, - {+0.006574f, -0.036030f, -0.031660f, -0.001982f, -0.011839f, +0.005651f, +0.000249f}, - {-0.003724f, -0.096560f, +0.032395f, -0.066533f, -0.059170f, -0.030499f, -0.001058f}, - {+0.006692f, +0.160009f, -0.129379f, +0.052154f, +0.052438f, +0.021767f, -0.000066f}, - {-0.003323f, -0.125272f, +0.095773f, -0.021055f, +0.002751f, -0.004192f, -0.000439f}, - {+0.003058f, +0.040531f, -0.031526f, +0.019596f, +0.001958f, +0.022711f, +0.000117f}, - {-0.006495f, -0.062678f, +0.034315f, -0.006680f, -0.044013f, -0.015039f, -0.000365f}, - {+0.005311f, +0.024302f, +0.038568f, +0.010732f, +0.046246f, +0.018532f, +0.000284f}, - {-0.008861f, -0.084231f, +0.034646f, -0.029324f, -0.051146f, -0.030089f, -0.000240f}, - {-0.007139f, -0.034225f, -0.007526f, -0.011945f, -0.061869f, -0.025586f, -0.000432f}, - {+0.007578f, +0.057792f, -0.063008f, +0.015978f, +0.032751f, +0.013830f, +0.000600f}, - {-0.001234f, -0.011094f, +0.018209f, +0.014340f, +0.006466f, +0.018926f, +0.000111f} - }, - { - {+0.002540f, -0.000338f, -0.479144f, +0.000386f, -0.002502f, +0.001455f, -0.000053f}, - {+0.003492f, -0.047296f, +0.570068f, -0.004548f, +0.004671f, -0.001911f, +0.000027f}, - {+0.005565f, -0.070554f, -0.294440f, +0.005506f, +0.010986f, -0.002858f, -0.000058f}, - {-0.004117f, +0.049455f, -0.195110f, +0.003929f, +0.005332f, -0.003637f, +0.000211f}, - {-0.005239f, +0.039531f, +0.206152f, -0.017684f, -0.012383f, +0.000355f, -0.000834f}, - {-0.000025f, +0.011412f, +0.088156f, +0.002778f, -0.007335f, +0.007815f, +0.000126f}, - {+0.014951f, -0.155014f, +0.017818f, +0.001033f, +0.001113f, +0.012028f, +0.000714f}, - {-0.014703f, +0.108984f, -0.204093f, -0.012043f, +0.008363f, -0.004674f, -0.000739f}, - {+0.004059f, -0.053922f, +0.114961f, -0.028402f, +0.006330f, -0.001994f, -0.000160f}, - {-0.003724f, +0.050906f, +0.007554f, +0.003538f, -0.016118f, +0.006369f, -0.000907f}, - {+0.008048f, +0.007569f, +0.119841f, +0.012922f, -0.012051f, +0.014974f, +0.001375f}, - {-0.013062f, +0.030629f, +0.004117f, -0.003212f, +0.008149f, -0.009890f, -0.000182f}, - {+0.009740f, -0.079383f, +0.082374f, +0.010250f, -0.003944f, -0.004234f, +0.000369f}, - {+0.014330f, +0.009080f, +0.046588f, +0.019107f, -0.009613f, +0.013944f, +0.000930f}, - {-0.006949f, +0.023465f, -0.071807f, -0.001860f, -0.007554f, -0.013510f, -0.000279f}, - {-0.002830f, +0.009786f, +0.032572f, -0.010719f, -0.019826f, -0.001129f, -0.000924f} - }, - { - {-0.000518f, -0.211474f, -0.133935f, -0.032307f, -0.000445f, +0.000582f, +0.000134f}, - {-0.002665f, +0.289252f, +0.086622f, +0.034396f, +0.004915f, +0.001571f, -0.000206f}, - {-0.002402f, -0.054649f, -0.277773f, -0.010873f, +0.005456f, +0.005496f, +0.000270f}, - {+0.006863f, -0.037276f, -0.109263f, -0.002603f, -0.001383f, -0.003887f, +0.000096f}, - {+0.000365f, +0.066656f, +0.133958f, -0.005654f, -0.003515f, -0.012311f, -0.000218f}, - {-0.006007f, -0.060607f, +0.226834f, -0.004299f, +0.005430f, -0.000507f, -0.000245f}, - {-0.007419f, -0.063255f, -0.041223f, +0.013192f, +0.013212f, +0.008787f, +0.000568f}, - {+0.005355f, -0.074959f, -0.017724f, -0.005843f, -0.003299f, -0.007563f, +0.000379f}, - {+0.005191f, +0.144000f, -0.130413f, -0.000127f, +0.002794f, -0.002991f, +0.000328f}, - {+0.001484f, -0.018159f, +0.100829f, -0.018864f, +0.001469f, -0.014392f, +0.000332f}, - {-0.010812f, +0.031458f, +0.085778f, +0.014179f, -0.006433f, +0.023583f, -0.000238f}, - {+0.005771f, +0.068903f, -0.096062f, +0.000252f, -0.011090f, -0.003258f, -0.000270f}, - {-0.000237f, -0.068071f, +0.174038f, -0.003828f, +0.006233f, -0.008771f, -0.000157f}, - {-0.011534f, -0.073815f, +0.180878f, +0.023529f, +0.003450f, +0.017160f, -0.000130f}, - {+0.000533f, -0.029314f, +0.026930f, -0.025304f, -0.011398f, -0.006662f, -0.000498f}, - {+0.005938f, +0.020909f, +0.008329f, -0.013694f, -0.010899f, -0.016792f, +0.000342f} - }, - { - {-0.004563f, +0.124857f, +0.392082f, +0.013563f, +0.002060f, +0.000768f, -0.000051f}, - {+0.000874f, -0.118799f, -0.536475f, -0.027073f, +0.003653f, +0.007953f, -0.000025f}, - {-0.002483f, +0.099121f, -0.035839f, -0.009303f, +0.001911f, +0.011561f, +0.000073f}, - {+0.001566f, +0.007969f, +0.017632f, +0.014602f, -0.004766f, -0.011498f, -0.000206f}, - {+0.000162f, -0.069466f, -0.070394f, +0.010535f, +0.013295f, -0.006761f, +0.000783f}, - {+0.001614f, -0.022761f, +0.217697f, -0.007286f, +0.009756f, -0.000855f, -0.000123f}, - {-0.006230f, +0.043001f, +0.068506f, +0.012269f, -0.001247f, +0.005912f, -0.000829f}, - {+0.003179f, +0.070957f, +0.187234f, +0.028351f, +0.003912f, -0.015536f, +0.000707f}, - {-0.008139f, +0.072807f, -0.193636f, +0.001437f, -0.001644f, -0.004401f, +0.000212f}, - {-0.001051f, -0.001027f, +0.130312f, -0.005052f, +0.009787f, -0.012646f, +0.000484f}, - {+0.011122f, -0.053720f, -0.094386f, -0.024713f, -0.004708f, +0.004962f, -0.001401f}, - {+0.005833f, -0.020123f, -0.198197f, -0.023257f, +0.001066f, +0.005043f, +0.000360f}, - {-0.004564f, -0.002440f, +0.257145f, +0.012398f, -0.014402f, +0.011456f, -0.000090f}, - {+0.003708f, -0.033867f, +0.192105f, -0.009019f, +0.001369f, +0.017649f, -0.000875f}, - {-0.000732f, +0.046885f, +0.134712f, +0.007725f, +0.003664f, +0.006970f, +0.000515f}, - {-0.005583f, -0.032353f, -0.019855f, +0.017107f, -0.001283f, -0.011122f, +0.000713f} - }, - { - {+0.004066f, +0.114050f, +0.374700f, +0.029211f, +0.000581f, -0.000706f, -0.000055f}, - {-0.002409f, -0.197372f, -0.418425f, -0.043739f, +0.001381f, +0.006220f, +0.000261f}, - {+0.001898f, -0.064197f, +0.179119f, -0.008245f, +0.001749f, +0.008116f, -0.000159f}, - {-0.006930f, -0.044567f, +0.116693f, +0.010436f, -0.007263f, -0.009260f, -0.000055f}, - {+0.005436f, +0.030846f, -0.218738f, +0.016032f, +0.014948f, +0.006593f, -0.000194f}, - {+0.005550f, +0.139940f, -0.036170f, +0.010954f, +0.009097f, -0.004539f, +0.000244f}, - {+0.007570f, -0.021370f, +0.201636f, -0.018407f, -0.011309f, +0.008794f, -0.000028f}, - {+0.000471f, +0.110932f, +0.171227f, +0.014736f, -0.001743f, +0.001483f, -0.000770f}, - {-0.001447f, -0.112344f, +0.009378f, -0.014922f, -0.005067f, +0.006639f, -0.000413f}, - {+0.002692f, +0.030681f, +0.061540f, +0.021293f, +0.000512f, -0.001990f, -0.000334f}, - {-0.001796f, -0.003780f, -0.092257f, -0.069391f, +0.029804f, -0.029220f, +0.000867f}, - {-0.005138f, -0.080068f, -0.149507f, -0.001138f, +0.024022f, -0.014589f, +0.000067f}, - {-0.004224f, +0.108920f, +0.013328f, +0.069316f, -0.035946f, +0.025685f, +0.000258f}, - {+0.000658f, +0.090331f, +0.062341f, -0.027002f, +0.011859f, +0.001213f, +0.000603f}, - {+0.005900f, +0.098418f, +0.049627f, +0.003081f, +0.013620f, +0.005035f, +0.000178f}, - {+0.001625f, -0.027640f, -0.069299f, +0.028848f, -0.005261f, +0.005494f, -0.000622f} - }, - { - {+0.000963f, -0.209168f, -0.136783f, -0.021436f, -0.001315f, +0.001715f, +0.000053f}, - {+0.003836f, +0.240060f, +0.249017f, +0.026285f, +0.002356f, -0.002581f, -0.000097f}, - {+0.002543f, -0.056651f, +0.175187f, -0.004318f, +0.000986f, +0.000543f, -0.000230f}, - {-0.000920f, +0.004716f, +0.131627f, +0.000502f, -0.004907f, +0.000275f, +0.000237f}, - {-0.006067f, +0.044059f, -0.163804f, +0.013386f, +0.002210f, -0.001514f, -0.000471f}, - {-0.004568f, -0.030380f, -0.236809f, -0.001626f, -0.004495f, -0.008084f, +0.000145f}, - {-0.000637f, +0.044154f, +0.318363f, +0.001072f, -0.013326f, +0.005888f, +0.000534f}, - {-0.004169f, -0.041204f, +0.007502f, +0.013093f, -0.005489f, +0.005599f, -0.000320f}, - {+0.009667f, -0.026427f, +0.125387f, -0.020909f, -0.002220f, +0.007411f, -0.000193f}, - {-0.003570f, -0.038849f, -0.026343f, +0.010463f, +0.003426f, +0.005718f, -0.000181f}, - {-0.011129f, +0.105682f, +0.071918f, -0.042767f, +0.045744f, -0.019229f, +0.001047f}, - {-0.001721f, -0.011709f, -0.075679f, -0.011170f, +0.018633f, -0.009301f, -0.000298f}, - {+0.014881f, -0.126099f, -0.329945f, +0.029695f, -0.035112f, +0.015020f, -0.000347f}, - {-0.001429f, +0.041747f, -0.036410f, -0.017561f, +0.002266f, -0.010646f, +0.000475f}, - {-0.004566f, -0.060021f, -0.112881f, -0.001467f, +0.001208f, -0.008750f, -0.000458f}, - {+0.003385f, -0.054651f, -0.117931f, -0.004432f, -0.010618f, +0.008056f, -0.000354f} - }, - { - {-0.002636f, +0.021786f, -0.463103f, +0.000210f, -0.002240f, +0.001465f, +0.000004f}, - {-0.000878f, +0.033402f, +0.570083f, +0.011803f, +0.002903f, -0.005358f, -0.000186f}, - {-0.003861f, +0.077704f, -0.003869f, +0.009538f, +0.005934f, -0.007444f, +0.000299f}, - {+0.010766f, +0.071297f, +0.041586f, -0.012126f, -0.005377f, +0.011762f, -0.000054f}, - {-0.003440f, -0.083945f, -0.020595f, +0.010102f, +0.001688f, -0.003568f, +0.000305f}, - {-0.000517f, -0.090621f, -0.157862f, -0.005981f, -0.009055f, -0.001744f, -0.000308f}, - {+0.000182f, +0.151744f, +0.162737f, -0.002607f, +0.004109f, -0.003418f, -0.000159f}, - {-0.001674f, +0.013807f, -0.090106f, +0.002037f, -0.002899f, -0.000327f, +0.000853f}, - {-0.006443f, +0.001872f, +0.099185f, +0.004052f, -0.002515f, -0.000928f, +0.000598f}, - {+0.003444f, -0.003891f, -0.070062f, -0.022333f, +0.021229f, +0.003330f, +0.000068f}, - {+0.012896f, +0.014560f, +0.156269f, -0.016693f, +0.002612f, +0.014390f, -0.001286f}, - {-0.000829f, -0.055243f, +0.003801f, -0.001636f, +0.000490f, +0.001040f, -0.000005f}, - {-0.012356f, -0.110940f, -0.289749f, -0.015445f, +0.011167f, -0.013527f, +0.000160f}, - {+0.002911f, +0.062983f, -0.089502f, +0.007738f, +0.002529f, -0.010796f, -0.000711f}, - {-0.001042f, -0.042600f, -0.131138f, -0.021059f, +0.003745f, -0.005700f, +0.000034f}, - {-0.005370f, -0.110106f, -0.043966f, -0.008083f, +0.000494f, +0.000652f, +0.000654f} - }, - { - {+0.000068f, +0.218352f, -0.157003f, +0.028534f, -0.003926f, -0.000507f, -0.000005f}, - {-0.002073f, -0.275247f, +0.104488f, -0.034616f, +0.005146f, +0.000060f, +0.000164f}, - {+0.000542f, +0.035123f, -0.100984f, -0.012987f, -0.001903f, -0.010200f, +0.000216f}, - {-0.007809f, -0.017882f, -0.016749f, +0.003757f, +0.007758f, +0.013407f, -0.000199f}, - {+0.011198f, -0.012942f, +0.020894f, -0.014537f, -0.001742f, -0.002696f, +0.000187f}, - {-0.000091f, +0.053033f, +0.050071f, +0.012761f, -0.000476f, +0.005826f, -0.000111f}, - {-0.004382f, -0.147911f, -0.200725f, +0.006370f, +0.014963f, -0.002284f, -0.000221f}, - {+0.006114f, +0.016727f, -0.125469f, +0.009898f, +0.002187f, -0.002825f, -0.000120f}, - {+0.000315f, -0.042519f, -0.011423f, -0.012532f, -0.008250f, -0.008414f, -0.000042f}, - {-0.003440f, -0.012295f, -0.068286f, -0.009074f, +0.037833f, +0.006784f, +0.000232f}, - {-0.002138f, -0.083651f, +0.088555f, -0.008486f, -0.011516f, +0.015378f, -0.000453f}, - {+0.008151f, +0.083680f, +0.170893f, -0.004520f, -0.005257f, +0.007598f, +0.000202f}, - {-0.000469f, +0.132201f, -0.018388f, -0.009231f, +0.019167f, -0.012329f, +0.000366f}, - {-0.003734f, +0.034878f, -0.050414f, +0.013477f, +0.006657f, -0.003764f, -0.000102f}, - {-0.000430f, +0.080573f, -0.013035f, -0.016572f, +0.018193f, -0.001715f, +0.000223f}, - {+0.002846f, +0.020446f, +0.092520f, -0.009215f, +0.003194f, -0.000469f, +0.000030f} - }, - { - {+0.000963f, -0.125190f, +0.346445f, -0.013595f, +0.000303f, -0.000978f, -0.000033f}, - {-0.000446f, +0.100728f, -0.488217f, +0.016236f, +0.005710f, -0.001786f, +0.000035f}, - {+0.002743f, -0.014250f, -0.025406f, -0.016135f, -0.007374f, -0.003595f, -0.000484f}, - {-0.003552f, -0.038637f, -0.023362f, +0.006065f, +0.017089f, +0.002181f, +0.000163f}, - {-0.005542f, +0.022598f, +0.016879f, -0.000337f, -0.010965f, +0.004955f, -0.000192f}, - {+0.003897f, +0.006264f, +0.110622f, +0.001101f, +0.004484f, +0.005876f, +0.000391f}, - {+0.001192f, -0.096496f, -0.316300f, -0.005468f, +0.032792f, -0.008475f, +0.000051f}, - {+0.000727f, +0.053728f, -0.131435f, +0.003649f, +0.007573f, +0.001815f, -0.000580f}, - {-0.000863f, +0.008255f, -0.088991f, -0.000632f, -0.015735f, -0.002803f, -0.000629f}, - {+0.002406f, -0.061420f, -0.048885f, +0.025571f, +0.026139f, +0.013054f, +0.000085f}, - {-0.006958f, -0.009989f, -0.015982f, -0.015590f, -0.008811f, +0.003944f, +0.001342f}, - {-0.004616f, +0.048619f, +0.248100f, +0.002887f, -0.015818f, +0.007122f, +0.000127f}, - {+0.009488f, +0.064501f, +0.087537f, +0.011252f, +0.004644f, -0.003762f, -0.000684f}, - {+0.000069f, -0.120500f, +0.126342f, -0.004190f, +0.000200f, -0.001712f, +0.000586f}, - {+0.005149f, -0.007666f, +0.084919f, +0.009632f, +0.003272f, +0.006689f, +0.000055f}, - {+0.000416f, +0.029426f, +0.098519f, +0.008834f, +0.001161f, +0.002526f, -0.000495f} - }, - { - {+0.000886f, -0.148670f, +0.323207f, -0.018371f, -0.002564f, -0.001740f, +0.000012f}, - {+0.003884f, +0.175284f, -0.400890f, +0.026675f, +0.007851f, -0.000737f, -0.000065f}, - {-0.002495f, +0.080937f, +0.147671f, +0.011536f, +0.007971f, +0.006899f, +0.000035f}, - {+0.007961f, -0.084392f, -0.116379f, -0.003191f, +0.002839f, -0.007308f, +0.000062f}, - {-0.006158f, +0.080005f, +0.088685f, +0.003948f, -0.007957f, +0.004571f, -0.000120f}, - {-0.002211f, -0.071563f, +0.001572f, -0.017783f, -0.002945f, -0.001211f, -0.000025f}, - {+0.006354f, +0.043718f, -0.096037f, +0.016202f, +0.015087f, -0.012592f, +0.000187f}, - {-0.008848f, +0.111246f, +0.002666f, -0.000486f, +0.002601f, +0.004659f, +0.000250f}, - {+0.003002f, +0.031933f, -0.067079f, +0.004866f, -0.003717f, +0.006734f, +0.000335f}, - {+0.000242f, -0.057016f, -0.043568f, +0.018255f, -0.005973f, -0.012687f, -0.000474f}, - {+0.006561f, -0.039260f, -0.109217f, -0.013646f, +0.000558f, -0.004597f, -0.000141f}, - {-0.005911f, -0.034849f, +0.122537f, -0.003454f, -0.006816f, +0.008021f, -0.000346f}, - {-0.009125f, +0.032899f, +0.054825f, -0.015163f, +0.007845f, -0.000234f, +0.000195f}, - {+0.004323f, -0.058064f, +0.175096f, -0.013022f, -0.007874f, +0.002160f, -0.000093f}, - {-0.000030f, -0.004530f, +0.139712f, +0.009150f, -0.007095f, +0.003336f, -0.000160f}, - {+0.000090f, +0.003404f, +0.036143f, -0.013076f, -0.011742f, -0.000567f, +0.000145f} - }, - { - {-0.001658f, +0.168998f, -0.158518f, +0.021572f, -0.003793f, -0.001030f, +0.000055f}, - {-0.001127f, -0.205208f, +0.220912f, -0.026048f, +0.002674f, +0.002769f, -0.000023f}, - {-0.000461f, +0.009252f, +0.227604f, +0.010467f, +0.006338f, +0.006074f, +0.000422f}, - {-0.002384f, +0.002851f, -0.212446f, +0.002659f, +0.001628f, -0.007095f, -0.000144f}, - {+0.008381f, +0.010679f, +0.133194f, +0.002584f, -0.005642f, +0.000472f, +0.000122f}, - {-0.002492f, -0.019849f, -0.076078f, +0.001470f, -0.003467f, -0.000327f, -0.000366f}, - {-0.004536f, -0.073352f, +0.163370f, -0.006974f, -0.006111f, +0.002960f, -0.000053f}, - {+0.006503f, -0.143768f, +0.271114f, -0.002346f, -0.005069f, +0.007486f, +0.000318f}, - {+0.000578f, -0.025307f, +0.019989f, +0.002596f, -0.000438f, +0.005960f, +0.000442f}, - {-0.001669f, -0.018575f, -0.086499f, +0.013973f, -0.005522f, -0.018115f, +0.000044f}, - {-0.003923f, +0.045316f, -0.178720f, -0.008368f, +0.009955f, -0.008103f, -0.001025f}, - {+0.005730f, +0.104850f, -0.098014f, +0.001983f, +0.005339f, -0.003699f, -0.000081f}, - {+0.004112f, -0.056472f, +0.078708f, +0.007073f, -0.002789f, +0.002619f, +0.000670f}, - {-0.002113f, +0.147342f, -0.011554f, -0.009749f, -0.006943f, +0.003214f, -0.000444f}, - {-0.009491f, -0.008362f, +0.168137f, -0.007087f, -0.000514f, +0.001707f, -0.000225f}, - {-0.002858f, +0.040341f, -0.044863f, -0.002151f, -0.014669f, -0.003465f, +0.000263f} - }, - { - {+0.000325f, +0.012293f, -0.420365f, -0.001073f, -0.001275f, -0.000190f, -0.000056f}, - {-0.004153f, -0.000289f, +0.552776f, -0.004938f, -0.001551f, +0.000077f, -0.000021f}, - {+0.003179f, -0.114923f, +0.044254f, -0.005107f, +0.002854f, -0.000178f, -0.000238f}, - {-0.002447f, +0.087293f, -0.100868f, -0.001711f, +0.001963f, -0.006609f, +0.000026f}, - {-0.000798f, -0.106727f, -0.010700f, -0.015899f, -0.006953f, +0.001329f, +0.000158f}, - {+0.001202f, +0.077157f, +0.029032f, +0.005126f, +0.002123f, +0.005150f, +0.000138f}, - {-0.005108f, -0.025092f, +0.196748f, -0.011988f, -0.001042f, +0.009182f, -0.000182f}, - {-0.000182f, -0.149947f, +0.283461f, +0.014807f, -0.003734f, -0.001388f, -0.000169f}, - {-0.004916f, +0.034459f, +0.115305f, -0.001284f, +0.001624f, -0.003142f, -0.000476f}, - {+0.000563f, -0.021689f, -0.129439f, -0.009360f, +0.006104f, -0.001314f, +0.000611f}, - {+0.004903f, +0.097921f, -0.109890f, +0.003701f, +0.014923f, +0.001100f, +0.000445f}, - {+0.004445f, +0.041667f, -0.183618f, +0.002519f, +0.000687f, -0.004062f, +0.000508f}, - {+0.001992f, -0.044965f, +0.102788f, -0.009037f, -0.015851f, -0.006745f, -0.000749f}, - {-0.004462f, +0.089632f, -0.099871f, +0.006564f, +0.004290f, +0.010085f, +0.000230f}, - {+0.005311f, -0.026905f, +0.088346f, +0.002622f, +0.012027f, +0.008602f, +0.000330f}, - {+0.002284f, +0.015859f, -0.086945f, -0.006492f, +0.002254f, +0.002859f, -0.000141f} - }, - { - {+0.000326f, -0.185379f, -0.113130f, -0.018251f, -0.002891f, -0.000347f, -0.000024f}, - {+0.003253f, +0.209744f, +0.182927f, +0.020751f, -0.000290f, +0.000620f, +0.000129f}, - {-0.003028f, +0.047265f, -0.166312f, -0.004033f, +0.004095f, -0.000001f, -0.000176f}, - {+0.000316f, -0.113969f, +0.180249f, -0.010833f, -0.002558f, -0.003462f, +0.000061f}, - {-0.003377f, +0.011235f, -0.182709f, -0.007053f, +0.006109f, -0.001285f, -0.000192f}, - {+0.003931f, +0.005368f, +0.113545f, +0.005959f, +0.008563f, -0.003356f, +0.000270f}, - {+0.007132f, +0.113339f, -0.085151f, +0.027048f, +0.006394f, +0.004682f, +0.000174f}, - {+0.000751f, +0.118643f, -0.011839f, -0.007823f, +0.008316f, -0.008033f, -0.000242f}, - {+0.002459f, -0.036301f, +0.193951f, -0.011739f, +0.006099f, -0.008613f, -0.000199f}, - {-0.000406f, -0.016288f, -0.132011f, -0.014654f, +0.002234f, +0.013512f, -0.000336f}, - {-0.004431f, -0.059630f, +0.069866f, +0.034584f, -0.004013f, +0.006714f, +0.000599f}, - {-0.005956f, -0.026912f, -0.080301f, +0.013592f, -0.011263f, +0.002117f, -0.000173f}, - {-0.008209f, -0.004505f, +0.119613f, -0.041351f, -0.013433f, -0.006274f, -0.000170f}, - {+0.005701f, +0.024166f, -0.118285f, +0.031263f, -0.000827f, +0.014446f, +0.000265f}, - {+0.009742f, +0.118573f, -0.137465f, +0.018797f, +0.026066f, +0.001847f, +0.000233f}, - {+0.002341f, -0.050370f, -0.015346f, +0.010898f, +0.021006f, -0.007241f, -0.000088f} - }, - { - {+0.000319f, +0.126694f, +0.366724f, +0.020424f, -0.001419f, +0.002643f, +0.000070f}, - {+0.002315f, -0.189978f, -0.424487f, -0.028121f, -0.003399f, -0.001047f, -0.000054f}, - {+0.000002f, +0.059855f, -0.154980f, +0.000999f, -0.005118f, -0.004107f, +0.000191f}, - {+0.003430f, -0.035271f, +0.310904f, +0.009731f, +0.001220f, +0.005190f, +0.000006f}, - {-0.000597f, +0.036067f, -0.156487f, -0.000121f, +0.001763f, -0.002466f, -0.000103f}, - {-0.002799f, -0.082995f, +0.033871f, +0.002711f, +0.002209f, -0.005746f, -0.000158f}, - {+0.000838f, -0.029571f, -0.293367f, -0.014081f, -0.006415f, +0.002421f, -0.000016f}, - {-0.003985f, -0.053282f, -0.235190f, +0.002717f, +0.007419f, -0.003670f, +0.000132f}, - {+0.003050f, -0.115037f, +0.111070f, +0.001088f, -0.002341f, -0.002756f, +0.000444f}, - {+0.002839f, +0.039655f, -0.056727f, -0.015997f, +0.000834f, +0.008040f, -0.000489f}, - {-0.000660f, +0.016986f, +0.163358f, +0.021748f, -0.011162f, -0.003668f, -0.000413f}, - {-0.004639f, +0.044241f, +0.031884f, +0.021035f, -0.012216f, -0.004499f, -0.000415f}, - {+0.010322f, -0.027147f, +0.049841f, -0.030293f, +0.012802f, +0.010388f, +0.000831f}, - {-0.000435f, -0.007837f, -0.132385f, +0.021562f, -0.024000f, -0.010766f, -0.000329f}, - {-0.013019f, -0.039175f, -0.263229f, +0.021453f, -0.007560f, -0.017185f, -0.000554f}, - {-0.004755f, -0.013959f, +0.075438f, +0.020661f, +0.007559f, -0.002287f, +0.000024f} - }, - { - {-0.000366f, +0.124913f, +0.371948f, +0.012777f, -0.000932f, +0.002982f, -0.000011f}, - {-0.003472f, -0.140915f, -0.467037f, -0.023556f, -0.002486f, -0.001401f, -0.000134f}, - {+0.002379f, -0.064440f, +0.016932f, -0.014417f, -0.008974f, +0.000096f, +0.000033f}, - {-0.003091f, +0.132798f, +0.091856f, +0.016839f, -0.001343f, +0.008140f, -0.000081f}, - {+0.003585f, -0.084471f, +0.026953f, -0.002730f, -0.014878f, -0.007539f, +0.000263f}, - {-0.003779f, -0.001969f, -0.063847f, +0.006087f, -0.005822f, -0.005396f, -0.000227f}, - {-0.004511f, -0.122929f, -0.117186f, -0.033714f, -0.013590f, +0.002377f, -0.000100f}, - {+0.000980f, -0.075927f, -0.209412f, -0.000716f, -0.010339f, -0.005890f, +0.000204f}, - {-0.003810f, +0.057065f, -0.098800f, +0.006671f, -0.016309f, +0.008162f, +0.000049f}, - {-0.003493f, -0.065520f, +0.083489f, -0.006585f, +0.004680f, -0.003998f, +0.000533f}, - {+0.003710f, +0.067626f, +0.100484f, +0.001614f, +0.003921f, -0.004818f, -0.000362f}, - {+0.009313f, +0.006684f, +0.041093f, +0.019272f, +0.001375f, -0.012838f, +0.000308f}, - {-0.005002f, +0.026330f, -0.021257f, -0.018461f, +0.004718f, +0.021321f, -0.000281f}, - {-0.001875f, -0.027307f, -0.031082f, -0.009783f, -0.018159f, -0.018171f, +0.000040f}, - {-0.000166f, -0.115217f, -0.152392f, -0.002694f, -0.019043f, -0.016076f, -0.000053f}, - {+0.000874f, +0.000110f, +0.050226f, +0.023317f, -0.014557f, +0.001480f, +0.000044f} - }, - { - {-0.000264f, -0.194793f, -0.107821f, -0.023201f, -0.001199f, +0.000928f, -0.000060f}, - {-0.000832f, +0.240876f, +0.099242f, +0.022166f, +0.003699f, +0.002772f, +0.000150f}, - {-0.001244f, -0.043315f, +0.069455f, -0.009254f, -0.000121f, +0.002278f, -0.000050f}, - {+0.000506f, -0.065069f, -0.220826f, -0.007722f, -0.000261f, +0.008268f, -0.000002f}, - {-0.000158f, -0.024522f, +0.139604f, +0.008624f, -0.007485f, -0.001513f, -0.000052f}, - {+0.004662f, +0.057647f, -0.024501f, +0.007536f, +0.000268f, +0.003627f, +0.000193f}, - {-0.001281f, +0.103406f, +0.216683f, +0.001410f, -0.010455f, -0.001406f, +0.000159f}, - {+0.003974f, +0.035826f, -0.038344f, +0.009124f, -0.007513f, +0.004170f, -0.000115f}, - {+0.001177f, +0.014518f, -0.176436f, +0.013776f, -0.011126f, +0.004369f, -0.000360f}, - {+0.000200f, -0.028344f, +0.131828f, +0.000160f, +0.010621f, -0.002766f, +0.000196f}, - {-0.000761f, -0.050071f, -0.080542f, -0.016049f, +0.013715f, -0.000842f, +0.000304f}, - {-0.000174f, -0.037897f, -0.027758f, +0.000913f, +0.012246f, -0.000027f, +0.000247f}, - {-0.002523f, +0.017257f, -0.029696f, -0.007251f, -0.004825f, +0.006036f, -0.000646f}, - {-0.002385f, +0.084478f, +0.128806f, +0.008133f, -0.002169f, -0.006954f, +0.000201f}, - {+0.008715f, +0.075360f, +0.074445f, +0.006029f, +0.000811f, +0.006272f, +0.000696f}, - {+0.004537f, -0.062959f, -0.053134f, +0.012141f, -0.007590f, +0.010200f, +0.000089f} - }, - { - {+0.000276f, +0.007743f, -0.416264f, -0.001108f, +0.002588f, -0.002874f, +0.000036f}, - {+0.002808f, -0.022075f, +0.484229f, -0.001735f, +0.003481f, +0.002668f, +0.000022f}, - {-0.001043f, +0.025703f, -0.026181f, +0.003209f, +0.003368f, +0.000139f, -0.000060f}, - {+0.000521f, -0.056071f, -0.241883f, -0.008469f, +0.009541f, -0.000806f, +0.000153f}, - {-0.002825f, +0.022621f, +0.075727f, +0.011466f, -0.000225f, +0.001401f, -0.000211f}, - {+0.001889f, +0.007945f, +0.059481f, -0.000805f, +0.002148f, +0.004609f, +0.000188f}, - {+0.004476f, +0.059212f, +0.261153f, -0.001867f, -0.001737f, -0.006657f, -0.000119f}, - {-0.002093f, -0.007870f, +0.069319f, -0.003999f, +0.002298f, +0.004349f, -0.000164f}, - {-0.001038f, -0.064160f, -0.043605f, -0.010516f, +0.006900f, -0.004421f, -0.000000f}, - {+0.001450f, +0.032984f, +0.037734f, +0.017216f, +0.000676f, +0.001134f, -0.000457f}, - {-0.001626f, -0.021124f, -0.148362f, -0.002128f, +0.002287f, +0.004634f, +0.000290f}, - {-0.007506f, -0.018304f, -0.027687f, +0.007765f, +0.004034f, +0.009905f, -0.000275f}, - {+0.004447f, +0.019127f, -0.031778f, -0.006006f, +0.011798f, -0.014550f, +0.000549f}, - {+0.004784f, +0.020712f, +0.158803f, +0.001960f, -0.000959f, +0.001140f, -0.000291f}, - {-0.001723f, +0.027442f, +0.179042f, +0.004096f, -0.000119f, +0.015809f, -0.000273f}, - {-0.004248f, -0.027902f, -0.065637f, +0.005103f, +0.010905f, +0.003977f, -0.000099f} - }, - { - {-0.000121f, +0.168818f, -0.170063f, +0.020644f, +0.002958f, -0.003463f, +0.000046f}, - {+0.000011f, -0.194924f, +0.223064f, -0.022796f, -0.001087f, -0.000493f, -0.000117f}, - {+0.000547f, +0.029503f, -0.053171f, -0.000739f, -0.000657f, -0.002145f, +0.000015f}, - {-0.000242f, +0.117372f, +0.034986f, +0.015156f, +0.005707f, -0.008083f, -0.000136f}, - {-0.000080f, -0.024155f, -0.034423f, -0.005036f, +0.006191f, +0.007152f, +0.000179f}, - {-0.005094f, -0.032260f, +0.054141f, +0.008306f, +0.004720f, +0.002533f, -0.000274f}, - {+0.001279f, -0.165394f, -0.065559f, -0.023240f, +0.007945f, -0.001409f, -0.000067f}, - {-0.002856f, +0.009409f, +0.091949f, -0.005615f, +0.001544f, +0.004433f, +0.000065f}, - {+0.002405f, +0.052072f, +0.137955f, +0.003382f, +0.011200f, +0.000365f, +0.000319f}, - {+0.002077f, -0.047717f, -0.093664f, +0.010132f, -0.009074f, -0.004134f, -0.000010f}, - {-0.000926f, +0.043776f, -0.057405f, -0.004440f, +0.000684f, +0.002365f, -0.000282f}, - {+0.002540f, +0.085351f, +0.109742f, +0.018492f, -0.001709f, +0.008584f, -0.000206f}, - {-0.001618f, -0.009925f, -0.064822f, -0.004580f, +0.010301f, -0.020636f, +0.000410f}, - {-0.000126f, -0.171921f, -0.079783f, -0.018973f, +0.006091f, +0.015039f, +0.000181f}, - {-0.005881f, -0.031229f, +0.141619f, +0.011585f, -0.000326f, +0.012033f, -0.000629f}, - {-0.001344f, +0.104987f, +0.102295f, +0.010501f, +0.005542f, -0.003423f, -0.000124f} - }, - { - {+0.000665f, -0.123778f, +0.280425f, -0.018756f, -0.000671f, -0.000509f, -0.000067f}, - {-0.001583f, +0.162600f, -0.316923f, +0.023267f, +0.000975f, -0.003785f, +0.000038f}, - {+0.001379f, -0.026831f, +0.023970f, -0.006255f, -0.004902f, +0.000112f, +0.000081f}, - {+0.000562f, -0.030460f, +0.260600f, +0.000624f, -0.000602f, -0.007719f, -0.000080f}, - {+0.002993f, +0.002642f, -0.081219f, -0.000884f, +0.006660f, +0.009580f, +0.000060f}, - {+0.000597f, +0.004283f, -0.008621f, +0.007685f, +0.005971f, -0.001193f, -0.000047f}, - {-0.005508f, +0.031003f, -0.344879f, +0.005634f, +0.007605f, -0.002853f, +0.000190f}, - {+0.001858f, +0.007685f, +0.058337f, +0.000024f, -0.000621f, +0.003685f, +0.000209f}, - {-0.000813f, +0.038640f, +0.157464f, +0.006533f, +0.001576f, +0.003906f, -0.000022f}, - {-0.004224f, +0.021225f, -0.166071f, +0.006069f, -0.003399f, -0.001042f, +0.000214f}, - {+0.002033f, -0.060718f, +0.091992f, -0.004611f, +0.002942f, -0.001595f, -0.000196f}, - {+0.004127f, +0.004531f, +0.205174f, +0.009365f, -0.001070f, +0.003179f, +0.000289f}, - {+0.000150f, -0.029538f, -0.068904f, -0.000402f, -0.005147f, -0.003972f, -0.000769f}, - {-0.004079f, -0.017972f, -0.257424f, -0.008455f, +0.006187f, +0.013312f, +0.000198f}, - {+0.002517f, +0.012776f, +0.062784f, +0.003145f, +0.009655f, -0.004343f, +0.000614f}, - {+0.005049f, +0.022035f, +0.199714f, +0.007109f, +0.003089f, -0.003875f, +0.000168f} - }, - { - {-0.000838f, -0.093482f, +0.340134f, -0.010503f, +0.000289f, +0.001191f, +0.000003f}, - {-0.000716f, +0.099685f, -0.420241f, +0.008436f, -0.000064f, -0.003115f, +0.000044f}, - {-0.000556f, -0.021255f, +0.062613f, -0.000941f, -0.000204f, +0.000715f, -0.000034f}, - {-0.001430f, -0.100524f, +0.149323f, -0.011872f, -0.001590f, -0.004527f, +0.000235f}, - {+0.000230f, +0.032021f, -0.018295f, +0.004614f, -0.002734f, +0.001951f, -0.000193f}, - {+0.002656f, +0.009804f, -0.038729f, +0.000163f, +0.001790f, -0.000822f, +0.000256f}, - {+0.000612f, +0.140653f, -0.197385f, +0.019089f, +0.002585f, -0.003213f, -0.000031f}, - {+0.002670f, -0.040336f, -0.020386f, -0.004271f, -0.002055f, -0.001343f, -0.000109f}, - {-0.001845f, -0.078760f, -0.020200f, -0.013056f, -0.006124f, -0.004360f, -0.000331f}, - {-0.000970f, +0.117325f, -0.055613f, +0.005023f, +0.004912f, +0.004803f, +0.000116f}, - {+0.002683f, -0.035606f, +0.126398f, -0.002472f, -0.000580f, -0.000376f, +0.000241f}, - {-0.000497f, -0.114405f, +0.055418f, -0.003763f, -0.003364f, -0.001371f, +0.000155f}, - {-0.000345f, +0.007312f, +0.001802f, -0.002287f, +0.000791f, +0.008770f, +0.000007f}, - {+0.000789f, +0.144128f, -0.097885f, +0.006241f, +0.005947f, +0.001436f, -0.000489f}, - {+0.001963f, -0.040204f, -0.034424f, +0.000413f, +0.000091f, -0.010270f, +0.000273f}, - {-0.002689f, -0.084084f, +0.069751f, -0.006898f, -0.004644f, -0.006109f, +0.000091f} - }, - { - {-0.000062f, +0.159834f, -0.044876f, +0.021415f, +0.000841f, +0.001074f, +0.000061f}, - {+0.001939f, -0.203019f, +0.024500f, -0.028206f, -0.000129f, -0.000129f, -0.000014f}, - {-0.002057f, +0.017619f, +0.007554f, +0.001544f, +0.005642f, -0.000830f, -0.000029f}, - {+0.001889f, +0.080220f, -0.136610f, +0.012668f, -0.006511f, +0.005422f, -0.000119f}, - {-0.004765f, -0.006329f, +0.052477f, -0.003995f, +0.004263f, -0.009557f, +0.000103f}, - {+0.001047f, +0.021879f, -0.034445f, -0.001105f, -0.002961f, +0.002057f, -0.000104f}, - {+0.004934f, -0.125025f, +0.182894f, -0.007200f, -0.003809f, +0.003213f, -0.000175f}, - {-0.002421f, +0.038737f, -0.100988f, -0.002296f, +0.002905f, -0.006173f, -0.000222f}, - {+0.000637f, -0.009843f, -0.137662f, -0.007085f, -0.001227f, -0.007524f, +0.000084f}, - {+0.007111f, +0.006449f, +0.088114f, -0.008144f, +0.012101f, +0.002453f, -0.000119f}, - {-0.005822f, +0.035186f, +0.014091f, +0.019245f, -0.005040f, +0.002938f, +0.000098f}, - {-0.006158f, +0.034676f, -0.151427f, +0.007632f, +0.002292f, -0.003956f, -0.000311f}, - {-0.001390f, -0.073913f, +0.146335f, -0.009450f, +0.000888f, +0.008018f, +0.000743f}, - {+0.004580f, +0.035022f, +0.074565f, -0.008788f, +0.011150f, -0.012728f, +0.000186f}, - {+0.001196f, +0.053254f, -0.158975f, +0.007007f, +0.001158f, -0.005679f, -0.000680f}, - {-0.002227f, +0.044207f, -0.133488f, +0.008158f, -0.004916f, -0.004020f, -0.000190f} - }, - { - {+0.000424f, -0.032674f, -0.356108f, -0.006297f, +0.001097f, +0.001061f, -0.000058f}, - {+0.000331f, +0.053597f, +0.429631f, +0.007025f, -0.000454f, +0.001923f, -0.000032f}, - {+0.001733f, +0.005170f, -0.045501f, -0.004142f, +0.003057f, -0.000513f, -0.000016f}, - {-0.001720f, +0.029775f, -0.211691f, +0.005967f, -0.004600f, +0.009540f, -0.000129f}, - {+0.003261f, -0.003682f, +0.039174f, -0.006311f, +0.004814f, -0.010936f, +0.000074f}, - {-0.004648f, +0.024711f, +0.003591f, +0.006146f, -0.002500f, -0.000881f, -0.000107f}, - {-0.002617f, -0.049330f, +0.327007f, -0.003104f, +0.001710f, +0.009526f, +0.000033f}, - {-0.001001f, +0.058705f, -0.071001f, -0.004213f, +0.002311f, -0.003340f, +0.000235f}, - {+0.002783f, +0.023155f, -0.088891f, -0.001723f, +0.002778f, +0.002314f, +0.000343f}, - {-0.004839f, -0.023086f, +0.116501f, +0.000949f, -0.001446f, -0.005599f, -0.000354f}, - {+0.001118f, +0.002046f, -0.076766f, +0.001535f, -0.005295f, -0.001162f, -0.000125f}, - {+0.004117f, +0.023659f, -0.189693f, +0.013335f, -0.005698f, -0.006219f, -0.000048f}, - {+0.003062f, -0.013670f, +0.192441f, -0.001116f, +0.004652f, +0.002330f, -0.000476f}, - {-0.004154f, -0.034087f, +0.046539f, -0.008864f, -0.000241f, -0.015872f, +0.000426f}, - {-0.003487f, +0.020767f, -0.154091f, +0.014880f, +0.001191f, +0.001914f, +0.000136f}, - {+0.003932f, -0.000386f, -0.191705f, +0.012921f, -0.005465f, +0.004477f, -0.000047f} - }, - { - {+0.000471f, -0.125486f, -0.221411f, -0.014986f, -0.000180f, +0.001120f, +0.000009f}, - {-0.001600f, +0.154646f, +0.294774f, +0.015891f, +0.000266f, +0.001489f, +0.000008f}, - {+0.001375f, -0.000822f, -0.034636f, -0.001147f, -0.000669f, +0.000303f, +0.000008f}, - {+0.000977f, -0.092422f, -0.024070f, -0.009222f, -0.001056f, +0.003997f, +0.000206f}, - {+0.001682f, +0.020814f, -0.011430f, +0.004002f, -0.001343f, -0.002884f, -0.000166f}, - {+0.001610f, -0.020045f, +0.049480f, -0.001742f, -0.001532f, -0.002781f, +0.000115f}, - {-0.002135f, +0.091172f, +0.125333f, +0.008360f, +0.009208f, +0.002398f, +0.000271f}, - {+0.000371f, -0.059373f, +0.078618f, -0.014453f, -0.004219f, +0.001057f, +0.000062f}, - {-0.002725f, -0.015489f, -0.009239f, -0.003738f, +0.000560f, +0.006181f, -0.000199f}, - {-0.002826f, -0.007173f, +0.085964f, -0.001891f, -0.012728f, -0.005161f, +0.000323f}, - {+0.004495f, -0.013763f, -0.058388f, +0.007410f, -0.005720f, -0.002360f, -0.000110f}, - {+0.002552f, -0.045600f, -0.070285f, -0.007922f, -0.003344f, -0.005570f, +0.000207f}, - {-0.000488f, +0.136917f, -0.026687f, +0.005457f, +0.012392f, -0.001210f, -0.000307f}, - {+0.000451f, +0.008875f, -0.051701f, +0.006069f, -0.021340f, +0.001926f, -0.000475f}, - {-0.001377f, -0.105876f, +0.039317f, -0.008020f, -0.005229f, +0.004339f, +0.000386f}, - {-0.001213f, -0.076122f, -0.061268f, -0.003217f, -0.002369f, +0.004826f, +0.000159f} - }, - { - {-0.000524f, +0.118676f, +0.170583f, +0.019688f, -0.001664f, -0.000923f, +0.000041f}, - {-0.000654f, -0.156016f, -0.194337f, -0.028557f, +0.002840f, +0.004101f, +0.000028f}, - {-0.002302f, +0.008782f, +0.011429f, +0.001323f, +0.000895f, +0.003407f, +0.000105f}, - {+0.000032f, +0.046067f, +0.185629f, +0.008390f, -0.003160f, -0.003746f, -0.000055f}, - {-0.002663f, -0.026672f, -0.064125f, +0.000262f, +0.001472f, +0.005261f, +0.000110f}, - {+0.003119f, -0.016242f, +0.044580f, -0.000850f, -0.000791f, -0.003258f, -0.000018f}, - {+0.002001f, -0.070898f, -0.146048f, -0.006424f, +0.007312f, -0.003256f, -0.000170f}, - {+0.002429f, -0.028724f, +0.132991f, -0.002905f, -0.000259f, +0.001749f, -0.000211f}, - {-0.000713f, +0.004019f, +0.012770f, -0.001359f, -0.002043f, +0.004710f, -0.000292f}, - {+0.005685f, -0.050322f, -0.008163f, -0.004254f, -0.000823f, +0.001200f, +0.000403f}, - {-0.002632f, +0.030192f, +0.022068f, +0.012383f, -0.005270f, -0.001676f, +0.000059f}, - {-0.003305f, +0.018641f, +0.063460f, +0.003826f, -0.000188f, -0.000343f, +0.000082f}, - {-0.002515f, -0.058603f, -0.271848f, -0.008489f, +0.005764f, -0.000219f, +0.000545f}, - {+0.000161f, +0.016378f, -0.070205f, -0.000824f, -0.012915f, +0.010864f, -0.000122f}, - {+0.003698f, +0.037366f, +0.216969f, +0.003644f, -0.004534f, +0.002030f, -0.000224f}, - {-0.002468f, +0.016801f, +0.081543f, +0.007748f, +0.001230f, +0.004507f, +0.000051f} - }, - { - {-0.001145f, +0.003284f, +0.355844f, +0.004455f, -0.002189f, -0.000719f, -0.000061f}, - {+0.002423f, -0.000161f, -0.457860f, -0.005943f, +0.007595f, +0.001864f, -0.000021f}, - {-0.000051f, -0.012564f, +0.029260f, -0.001225f, +0.006975f, +0.002016f, -0.000066f}, - {-0.000428f, +0.050774f, +0.180925f, +0.010634f, -0.004654f, -0.005688f, -0.000097f}, - {+0.000090f, -0.027979f, -0.070853f, -0.000692f, +0.004995f, +0.008846f, +0.000049f}, - {-0.002760f, +0.025210f, +0.010985f, -0.001189f, -0.005880f, -0.001877f, -0.000037f}, - {-0.000244f, -0.010407f, -0.222937f, -0.003909f, +0.000862f, -0.004776f, -0.000303f}, - {-0.000425f, +0.069076f, +0.010384f, +0.006056f, +0.004388f, -0.000601f, +0.000104f}, - {+0.002311f, +0.019613f, -0.027315f, +0.005251f, +0.003443f, -0.001807f, +0.000316f}, - {-0.002211f, +0.010183f, -0.073548f, +0.000883f, -0.001915f, +0.009035f, -0.000618f}, - {-0.002248f, -0.008483f, +0.068380f, +0.004591f, -0.002268f, -0.001620f, +0.000165f}, - {-0.000648f, -0.009242f, +0.099359f, -0.000641f, +0.000197f, +0.006109f, -0.000157f}, - {-0.000774f, -0.111787f, -0.198070f, -0.017791f, -0.003222f, +0.006877f, -0.000137f}, - {+0.001138f, -0.044856f, +0.026044f, -0.009715f, -0.000846f, +0.004152f, +0.000446f}, - {+0.002544f, +0.087438f, +0.155678f, +0.005423f, +0.002722f, -0.003124f, -0.000080f}, - {+0.003560f, +0.014887f, +0.074843f, +0.008219f, +0.006652f, +0.002902f, -0.000131f} - }, - { - {+0.001890f, -0.134764f, +0.131961f, -0.012234f, -0.002738f, +0.000823f, +0.000033f}, - {-0.001070f, +0.173165f, -0.189994f, +0.013988f, +0.004534f, -0.003798f, +0.000004f}, - {+0.001640f, -0.008324f, +0.014514f, -0.002435f, +0.003083f, -0.002251f, -0.000150f}, - {+0.000264f, -0.073721f, -0.011380f, -0.005780f, -0.000967f, -0.002807f, +0.000095f}, - {-0.000194f, +0.034600f, +0.001603f, -0.002002f, +0.001582f, +0.004833f, -0.000182f}, - {-0.000248f, -0.009914f, -0.030975f, -0.000054f, -0.001998f, +0.003302f, +0.000047f}, - {+0.001104f, +0.068456f, -0.089528f, +0.005666f, +0.000783f, -0.000511f, +0.000430f}, - {-0.003829f, -0.022153f, -0.133797f, -0.009639f, +0.004395f, -0.000747f, +0.000011f}, - {-0.000699f, +0.010044f, -0.035723f, +0.000046f, -0.000099f, -0.006045f, +0.000154f}, - {-0.000909f, +0.038046f, -0.036614f, +0.002380f, -0.002487f, +0.007961f, -0.000174f}, - {+0.001908f, -0.026952f, +0.036236f, +0.000119f, +0.002271f, -0.000602f, -0.000080f}, - {+0.001603f, -0.029285f, +0.049821f, -0.000247f, +0.000217f, +0.005046f, -0.000216f}, - {+0.006472f, +0.116293f, +0.099963f, -0.000867f, -0.010550f, +0.001434f, -0.000225f}, - {-0.000453f, -0.006679f, +0.094671f, -0.004526f, -0.002369f, -0.000013f, -0.000073f}, - {-0.005967f, -0.109642f, -0.072567f, +0.006836f, +0.010874f, -0.002506f, +0.000008f}, - {-0.001623f, -0.037979f, -0.009548f, -0.002077f, +0.000249f, -0.003764f, -0.000113f} - }, - { - {-0.000170f, +0.121984f, -0.255345f, +0.010962f, +0.000155f, -0.000211f, +0.000029f}, - {-0.000042f, -0.155814f, +0.316189f, -0.015901f, -0.001529f, -0.002239f, -0.000003f}, - {-0.000912f, +0.011590f, +0.001094f, -0.000549f, +0.000258f, -0.004276f, +0.000153f}, - {-0.001078f, +0.027059f, -0.170587f, +0.004222f, +0.000643f, -0.000450f, -0.000026f}, - {+0.003305f, -0.001532f, +0.066652f, -0.008505f, +0.003277f, -0.000811f, +0.000150f}, - {+0.000389f, -0.020611f, -0.035423f, +0.007402f, -0.004051f, +0.005415f, -0.000014f}, - {-0.000366f, -0.068284f, +0.107122f, +0.001280f, -0.004037f, +0.003881f, +0.000063f}, - {+0.002188f, -0.047371f, -0.125091f, -0.009984f, -0.000445f, +0.000567f, -0.000063f}, - {-0.000440f, -0.020603f, +0.011508f, -0.007936f, -0.000995f, -0.001820f, -0.000353f}, - {+0.001083f, -0.027481f, +0.055464f, -0.007462f, +0.003849f, -0.002769f, +0.000734f}, - {+0.000833f, +0.000243f, +0.003680f, +0.002365f, -0.003551f, +0.005372f, -0.000154f}, - {-0.000131f, +0.044971f, -0.042558f, +0.000985f, +0.001169f, +0.001543f, +0.000319f}, - {-0.004626f, +0.038285f, +0.245476f, +0.003432f, -0.002348f, -0.009039f, +0.000192f}, - {+0.000118f, +0.032215f, +0.016390f, +0.016314f, -0.000536f, +0.000779f, -0.000274f}, - {-0.001673f, -0.067100f, -0.155922f, +0.006074f, +0.005539f, +0.002669f, +0.000075f}, - {-0.001163f, +0.016021f, -0.074264f, -0.004922f, -0.001151f, -0.006794f, +0.000180f} - }, - { - {-0.001297f, +0.019051f, -0.402417f, +0.000141f, +0.000604f, -0.001174f, -0.000063f}, - {-0.001300f, -0.028611f, +0.522073f, +0.003618f, -0.001002f, -0.001630f, -0.000006f}, - {+0.000497f, +0.002152f, +0.001349f, +0.003743f, -0.001574f, -0.003439f, +0.000141f}, - {+0.002920f, +0.034877f, -0.171496f, -0.000170f, -0.001439f, +0.001183f, +0.000002f}, - {-0.003419f, -0.015347f, +0.076929f, +0.000130f, -0.000288f, -0.004503f, +0.000040f}, - {+0.001320f, +0.012141f, -0.002094f, +0.004277f, -0.004118f, +0.002479f, -0.000060f}, - {-0.004180f, -0.013179f, +0.192192f, +0.004645f, -0.001451f, +0.001106f, -0.000485f}, - {+0.003209f, +0.039833f, +0.008962f, -0.002291f, -0.002391f, +0.004465f, +0.000122f}, - {-0.000607f, -0.005611f, +0.042134f, +0.000975f, +0.004638f, +0.004045f, +0.000008f}, - {-0.000627f, -0.026309f, +0.067454f, -0.006167f, +0.000843f, -0.011514f, -0.000137f}, - {+0.001193f, -0.006474f, -0.018477f, +0.002724f, -0.008795f, +0.001731f, +0.000074f}, - {+0.001257f, +0.008752f, -0.087176f, +0.004699f, -0.002039f, -0.003933f, +0.000164f}, - {-0.003124f, -0.033471f, +0.148053f, -0.005001f, +0.001533f, -0.010338f, -0.000015f}, - {-0.002890f, +0.001944f, -0.047134f, +0.004337f, -0.002030f, -0.001172f, +0.000046f}, - {+0.008908f, +0.054837f, -0.040335f, +0.007026f, -0.006365f, -0.001572f, +0.000146f}, - {+0.002478f, +0.029038f, -0.064961f, -0.006465f, -0.005250f, -0.005303f, +0.000152f} - }, - { - {+0.000160f, -0.150600f, -0.167483f, -0.002920f, +0.001475f, -0.001963f, +0.000024f}, - {+0.001668f, +0.172130f, +0.218810f, +0.011191f, +0.002834f, -0.003154f, +0.000022f}, - {-0.000950f, +0.022722f, -0.027772f, +0.005005f, -0.008512f, +0.003955f, -0.000238f}, - {-0.003019f, -0.054068f, -0.033941f, +0.003539f, -0.011136f, +0.005659f, +0.000016f}, - {-0.001078f, +0.021690f, -0.006189f, +0.016829f, -0.000777f, -0.009514f, -0.000199f}, - {-0.001056f, -0.014729f, +0.053067f, -0.011823f, +0.007368f, -0.001542f, +0.000064f}, - {+0.004918f, +0.007213f, +0.138765f, -0.001533f, +0.020500f, -0.011761f, +0.000227f}, - {-0.002554f, +0.001966f, +0.107627f, -0.006775f, -0.003533f, +0.005048f, -0.000080f}, - {+0.001525f, +0.005137f, +0.030090f, +0.004553f, +0.004049f, +0.000454f, +0.000282f}, - {-0.001023f, +0.024143f, -0.037424f, +0.014519f, +0.001289f, -0.011651f, -0.000625f}, - {-0.005161f, +0.022730f, -0.068907f, +0.020272f, -0.012850f, -0.000495f, +0.000137f}, - {-0.002866f, -0.007080f, -0.063234f, +0.003391f, -0.009373f, +0.003426f, -0.000457f}, - {+0.004560f, +0.037001f, -0.014139f, +0.007335f, +0.000343f, -0.005090f, -0.000062f}, - {+0.004001f, -0.046592f, +0.005932f, -0.011122f, +0.012141f, -0.007595f, +0.000216f}, - {-0.003776f, +0.041534f, +0.044983f, +0.002268f, -0.019627f, +0.007804f, -0.000235f}, - {-0.001820f, +0.010184f, -0.049175f, +0.013588f, -0.018697f, +0.002250f, -0.000303f} - }, - { - {+0.001483f, +0.113867f, +0.209976f, +0.008819f, +0.000797f, +0.000400f, +0.000036f}, - {+0.001045f, -0.192142f, -0.298750f, -0.001463f, +0.003654f, +0.001788f, -0.000013f}, - {-0.000040f, +0.023922f, -0.061440f, -0.008880f, -0.004791f, +0.003847f, -0.000085f}, - {+0.000147f, +0.077957f, +0.126838f, -0.004370f, -0.007202f, +0.002392f, -0.000067f}, - {+0.004543f, -0.091348f, -0.161744f, +0.013831f, +0.000476f, +0.002348f, +0.000151f}, - {-0.000341f, -0.019385f, +0.074320f, +0.002090f, +0.004165f, -0.003633f, +0.000059f}, - {+0.002008f, -0.125477f, -0.001322f, +0.010977f, +0.014241f, -0.001824f, +0.000290f}, - {-0.004051f, +0.054488f, +0.153092f, -0.011645f, -0.001154f, -0.003507f, -0.000105f}, - {-0.000902f, +0.009313f, +0.026711f, -0.001561f, +0.002462f, -0.001947f, -0.000100f}, - {+0.005033f, -0.126661f, -0.230194f, +0.017832f, +0.001367f, +0.007110f, +0.000344f}, - {+0.003668f, -0.007071f, -0.130982f, +0.007450f, -0.007821f, +0.001798f, -0.000031f}, - {+0.000349f, +0.045688f, -0.017878f, -0.008768f, -0.007271f, +0.001089f, +0.000044f}, - {+0.002677f, -0.079470f, -0.153864f, +0.014296f, +0.003485f, +0.006916f, +0.000050f}, - {+0.000709f, -0.042448f, +0.071138f, +0.007687f, +0.009513f, -0.002541f, +0.000023f}, - {-0.005626f, +0.054309f, +0.055654f, -0.010333f, -0.012042f, +0.002191f, -0.000096f}, - {+0.000446f, +0.021484f, -0.057903f, -0.001636f, -0.008439f, +0.007563f, -0.000076f} - }, - { - {-0.000930f, -0.020638f, +0.420161f, -0.006289f, +0.001114f, +0.002023f, -0.000034f}, - {-0.002837f, +0.034360f, -0.606921f, +0.008940f, -0.000248f, +0.004013f, -0.000004f}, - {+0.001816f, -0.018994f, -0.028978f, +0.005755f, -0.001492f, +0.000000f, +0.000298f}, - {+0.002308f, -0.019936f, +0.239454f, +0.000948f, +0.000097f, -0.002454f, +0.000065f}, - {-0.003108f, +0.010786f, -0.269338f, +0.002735f, +0.001820f, +0.004439f, +0.000049f}, - {+0.000084f, +0.020355f, +0.030329f, -0.004050f, +0.000527f, -0.001894f, -0.000134f}, - {-0.006890f, +0.046136f, -0.183299f, -0.002301f, +0.001456f, +0.008977f, -0.000300f}, - {+0.005979f, +0.011056f, +0.166257f, -0.005656f, -0.000834f, -0.005892f, +0.000154f}, - {+0.000154f, -0.000560f, +0.037346f, -0.001460f, -0.000032f, +0.000167f, -0.000173f}, - {-0.006662f, -0.002010f, -0.363378f, +0.010169f, +0.000884f, +0.009588f, +0.000407f}, - {+0.001078f, -0.029016f, -0.107209f, +0.006938f, +0.002205f, -0.002827f, -0.000183f}, - {+0.002893f, -0.028022f, +0.051556f, +0.008217f, -0.001222f, -0.004671f, +0.000375f}, - {-0.006494f, +0.014380f, -0.224961f, -0.002217f, +0.001654f, +0.010259f, +0.000017f}, - {-0.005137f, +0.012085f, +0.032649f, +0.001820f, +0.001318f, +0.004157f, -0.000284f}, - {+0.005483f, -0.014476f, +0.074456f, +0.002422f, -0.001376f, -0.006421f, +0.000309f}, - {+0.000296f, -0.028549f, -0.015223f, +0.007439f, +0.000560f, +0.001646f, +0.000380f} - }, - { - {-0.000574f, -0.054293f, +0.393027f, +0.004619f, +0.000499f, +0.001616f, -0.000019f}, - {+0.000630f, +0.085858f, -0.559718f, -0.004183f, -0.003387f, +0.002961f, -0.000006f}, - {-0.001166f, +0.017046f, +0.023078f, -0.007491f, +0.000205f, -0.001361f, -0.000017f}, - {-0.001175f, -0.022635f, +0.244404f, -0.001647f, +0.001066f, -0.003008f, +0.000032f}, - {-0.000156f, +0.031998f, -0.255427f, -0.002202f, -0.001796f, +0.001974f, -0.000172f}, - {+0.000878f, -0.017961f, -0.022887f, +0.005377f, -0.000188f, -0.000893f, +0.000012f}, - {+0.001948f, +0.014963f, -0.247765f, +0.005780f, -0.004433f, +0.007643f, -0.000121f}, - {-0.000159f, -0.041909f, +0.136394f, +0.007153f, +0.001725f, -0.004022f, +0.000071f}, - {-0.000219f, +0.000958f, +0.044869f, -0.002129f, -0.000524f, +0.001494f, +0.000102f}, - {+0.001816f, +0.063742f, -0.323681f, -0.008953f, -0.002758f, +0.004170f, -0.000396f}, - {-0.001419f, +0.031078f, -0.037154f, -0.008056f, -0.000641f, -0.003359f, +0.000045f}, - {-0.001164f, +0.009969f, +0.088648f, -0.011556f, +0.002492f, -0.005256f, -0.000124f}, - {+0.000693f, +0.026444f, -0.217624f, +0.005106f, -0.001448f, +0.007023f, -0.000105f}, - {+0.002214f, +0.001591f, -0.021758f, +0.001337f, -0.002244f, +0.004794f, +0.000016f}, - {+0.001396f, -0.022948f, +0.061227f, -0.000339f, +0.002823f, -0.006287f, +0.000004f}, - {-0.000222f, +0.016030f, +0.027796f, -0.010434f, +0.001167f, -0.001268f, -0.000077f} - }, - { - {+0.000537f, +0.069689f, +0.259996f, -0.015449f, -0.001689f, +0.000567f, +0.000032f}, - {+0.001883f, -0.105131f, -0.355263f, +0.018765f, +0.003133f, +0.000450f, +0.000016f}, - {-0.001138f, -0.018001f, +0.039839f, +0.012701f, +0.001219f, -0.000708f, -0.000287f}, - {-0.001263f, +0.029165f, +0.184940f, -0.003746f, -0.001169f, -0.001726f, -0.000098f}, - {+0.001083f, -0.037001f, -0.183894f, +0.007086f, +0.000486f, -0.000197f, +0.000096f}, - {-0.000342f, +0.013484f, -0.044965f, -0.006682f, -0.000921f, -0.000263f, +0.000136f}, - {+0.004481f, -0.021461f, -0.201741f, -0.003038f, +0.001363f, +0.001843f, +0.000265f}, - {-0.003961f, +0.024164f, +0.091417f, -0.008821f, -0.001712f, +0.000129f, -0.000204f}, - {+0.000207f, -0.002976f, +0.043954f, +0.001501f, +0.000276f, +0.000942f, +0.000107f}, - {+0.003639f, -0.052765f, -0.205252f, +0.011783f, +0.003716f, -0.001190f, -0.000192f}, - {-0.001689f, -0.023190f, +0.011247f, +0.010783f, -0.001786f, -0.002313f, +0.000212f}, - {-0.002372f, -0.004818f, +0.082129f, +0.010451f, +0.000189f, -0.001709f, -0.000272f}, - {+0.004804f, -0.020405f, -0.173555f, +0.002649f, +0.003189f, +0.001117f, +0.000066f}, - {+0.003227f, +0.010050f, -0.037377f, -0.001735f, +0.000749f, +0.001463f, +0.000329f}, - {-0.003142f, +0.023239f, +0.029929f, -0.001310f, -0.001621f, -0.001432f, -0.000309f}, - {-0.000053f, -0.009013f, +0.034476f, +0.011295f, +0.001661f, -0.001432f, -0.000323f} - }, - { - {+0.000467f, -0.049431f, +0.174512f, +0.052213f, -0.000379f, -0.000628f, +0.000018f}, - {-0.000675f, +0.068601f, -0.232702f, -0.078966f, +0.000387f, -0.001035f, +0.000020f}, - {+0.001138f, +0.009378f, +0.010305f, -0.023458f, -0.000156f, +0.000528f, +0.000103f}, - {+0.001051f, -0.021900f, +0.128073f, +0.018761f, +0.000854f, -0.000050f, +0.000029f}, - {-0.000093f, +0.025010f, -0.130739f, -0.024552f, -0.000063f, -0.000892f, +0.000054f}, - {-0.000652f, -0.002376f, -0.032485f, +0.008631f, +0.000330f, +0.000880f, -0.000082f}, - {-0.002083f, +0.015096f, -0.126566f, -0.008147f, -0.000445f, -0.003114f, +0.000045f}, - {+0.000739f, -0.009298f, +0.065194f, +0.025419f, +0.000920f, +0.003361f, -0.000035f}, - {+0.000258f, -0.000954f, +0.037598f, +0.000767f, +0.001217f, -0.000373f, -0.000075f}, - {-0.002042f, +0.033396f, -0.132174f, -0.040199f, +0.000207f, -0.002266f, +0.000307f}, - {+0.001414f, +0.014255f, +0.004390f, -0.026628f, +0.001532f, -0.000025f, -0.000092f}, - {+0.001280f, +0.002059f, +0.050357f, -0.008951f, +0.001342f, +0.002619f, +0.000087f}, - {-0.001481f, +0.009694f, -0.129207f, -0.015305f, -0.002740f, -0.004354f, +0.000130f}, - {-0.002380f, -0.004808f, -0.023046f, -0.002372f, +0.000308f, -0.001841f, -0.000118f}, - {-0.000907f, -0.004256f, +0.006995f, +0.009818f, -0.000916f, +0.002740f, +0.000058f}, - {+0.000120f, +0.004044f, +0.004424f, -0.021221f, +0.000105f, -0.000062f, +0.000164f} - } -}; - -const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]= -{ - { - {-0.007849f, -0.189662f, +0.310868f, +0.002657f, -0.000617f, -0.002064f, +0.000079f}, - {-0.006499f, +0.151239f, -0.295372f, +0.093873f, +0.006692f, -0.006119f, -0.000079f}, - {+0.018156f, -0.036738f, -0.002366f, +0.025349f, -0.033780f, +0.029927f, -0.001760f}, - {-0.001185f, -0.014058f, +0.058055f, -0.022315f, +0.001895f, +0.011251f, -0.001195f}, - {-0.007055f, +0.018561f, -0.015516f, -0.000397f, +0.002631f, -0.012108f, +0.001368f}, - {-0.011104f, +0.020008f, -0.011257f, -0.004500f, +0.004699f, -0.010150f, +0.001162f}, - {+0.015585f, -0.011962f, -0.031150f, +0.029687f, -0.015292f, +0.011837f, -0.001505f}, - {+0.017335f, -0.020280f, -0.052951f, +0.022099f, -0.000113f, +0.011817f, -0.000989f}, - {-0.000629f, -0.006228f, +0.019972f, -0.009129f, +0.003758f, -0.000470f, -0.000086f}, - {+0.000511f, -0.004432f, -0.002064f, +0.001344f, +0.004868f, -0.004917f, +0.000206f}, - {-0.002632f, +0.004614f, -0.009077f, -0.002040f, +0.003834f, -0.003681f, +0.000651f}, - {+0.004163f, -0.016169f, -0.009480f, +0.010379f, -0.001561f, +0.007873f, -0.000482f}, - {-0.007762f, +0.010368f, +0.015510f, +0.005022f, -0.004378f, -0.005468f, +0.000778f}, - {+0.000368f, -0.001287f, +0.003269f, -0.005109f, +0.003959f, -0.005552f, +0.000443f}, - {+0.007637f, -0.013100f, -0.008745f, +0.008594f, +0.001266f, +0.005515f, -0.000260f}, - {+0.003252f, -0.007772f, +0.002549f, -0.008685f, -0.000484f, +0.004879f, -0.000366f} - }, - { - {+0.003434f, +0.064136f, +0.596947f, -0.012925f, -0.012105f, -0.006348f, +0.000052f}, - {+0.006872f, +0.208738f, -0.430749f, -0.043085f, +0.005819f, -0.002350f, +0.000212f}, - {+0.005116f, -0.046396f, -0.012121f, +0.006015f, -0.006889f, +0.045123f, -0.000620f}, - {+0.007618f, +0.010992f, +0.040544f, -0.058428f, +0.022475f, +0.032839f, -0.000538f}, - {-0.005563f, +0.030740f, -0.013780f, -0.007345f, -0.017136f, -0.029360f, +0.000627f}, - {-0.007549f, +0.029664f, -0.026873f, -0.020401f, -0.009762f, -0.021968f, +0.000592f}, - {+0.015806f, -0.023439f, -0.030157f, +0.046969f, -0.012661f, +0.017740f, -0.000763f}, - {+0.013074f, -0.053955f, -0.091847f, +0.002101f, +0.025917f, +0.039011f, -0.000578f}, - {-0.007104f, -0.011492f, -0.004920f, -0.020806f, +0.019718f, +0.010737f, -0.000003f}, - {+0.005199f, -0.005331f, -0.027619f, -0.007498f, +0.002840f, -0.009453f, +0.000077f}, - {-0.010618f, -0.009204f, -0.036117f, -0.025558f, -0.004764f, -0.003733f, +0.000485f}, - {-0.004277f, -0.034749f, -0.019826f, +0.021144f, +0.023168f, +0.026165f, -0.000230f}, - {-0.001540f, +0.026510f, +0.043031f, +0.037355f, -0.014051f, -0.021793f, +0.000440f}, - {-0.000688f, +0.004194f, +0.023981f, +0.008644f, -0.009505f, -0.014330f, +0.000422f}, - {+0.007017f, -0.006121f, -0.001366f, +0.017321f, +0.021133f, +0.020778f, +0.000064f}, - {+0.001808f, -0.009372f, -0.001227f, -0.016870f, -0.000030f, +0.010680f, -0.000179f} - }, - { - {-0.000173f, +0.307249f, +0.141892f, +0.046866f, -0.017599f, -0.001859f, -0.000115f}, - {-0.006073f, -0.167540f, +0.082726f, -0.078686f, +0.003574f, +0.012765f, +0.000025f}, - {-0.025314f, -0.107553f, +0.097665f, -0.029881f, +0.045910f, +0.001205f, +0.001921f}, - {-0.017044f, +0.048408f, -0.041355f, -0.070138f, +0.036357f, +0.026423f, +0.001421f}, - {+0.015939f, -0.012147f, +0.007879f, +0.022686f, -0.043895f, -0.005350f, -0.001553f}, - {+0.021597f, +0.029155f, -0.035998f, -0.007977f, -0.049474f, +0.004557f, -0.001326f}, - {-0.036021f, +0.006766f, +0.026953f, +0.016862f, +0.032122f, -0.017257f, +0.001676f}, - {-0.031554f, -0.089831f, +0.085198f, -0.028444f, +0.031117f, +0.004947f, +0.001188f}, - {+0.007547f, +0.066302f, -0.134055f, -0.013452f, +0.011046f, +0.022691f, -0.000004f}, - {-0.006666f, +0.037732f, -0.068344f, -0.001907f, -0.003786f, -0.000807f, -0.000263f}, - {+0.015403f, +0.000610f, -0.082095f, -0.031996f, -0.007132f, +0.014653f, -0.000743f}, - {+0.006863f, +0.004261f, -0.006302f, -0.005244f, +0.004123f, +0.025567f, +0.000603f}, - {+0.009215f, +0.013483f, +0.000507f, +0.063866f, -0.017193f, -0.008910f, -0.001086f}, - {+0.002117f, +0.062124f, -0.009407f, -0.002622f, -0.025731f, +0.002923f, -0.000603f}, - {-0.014505f, +0.023100f, +0.024324f, +0.006534f, +0.006132f, +0.023845f, +0.000284f}, - {-0.002356f, -0.003682f, -0.002242f, +0.014199f, -0.006597f, +0.001081f, +0.000406f} - }, - { - {+0.000058f, -0.136416f, -0.492276f, -0.001401f, -0.011247f, -0.000834f, +0.000005f}, - {+0.003148f, +0.049667f, +0.450793f, -0.030608f, -0.004189f, -0.011365f, -0.000468f}, - {+0.021455f, -0.091938f, +0.007962f, -0.044085f, +0.049069f, -0.040177f, -0.000546f}, - {+0.020716f, +0.044565f, -0.098169f, -0.074157f, +0.023582f, -0.027619f, -0.000233f}, - {-0.013397f, -0.032973f, +0.049759f, +0.059972f, -0.004251f, +0.031825f, +0.000139f}, - {-0.015377f, -0.014548f, +0.037187f, +0.063775f, -0.035613f, +0.031532f, +0.000014f}, - {+0.017321f, +0.106436f, +0.015760f, -0.036442f, +0.043782f, -0.027117f, +0.000046f}, - {+0.018491f, -0.043347f, +0.081495f, -0.029687f, +0.027445f, -0.012467f, +0.000037f}, - {+0.002143f, +0.058964f, -0.151480f, -0.022542f, -0.017894f, -0.000117f, +0.000011f}, - {+0.002501f, +0.051566f, -0.076858f, -0.024061f, -0.010190f, +0.002223f, +0.000059f}, - {-0.004455f, -0.004621f, -0.022586f, +0.008980f, -0.004779f, +0.014720f, -0.000296f}, - {-0.010379f, +0.031260f, +0.084411f, +0.011079f, -0.044526f, -0.004500f, -0.000139f}, - {-0.010110f, -0.002952f, +0.019419f, +0.073054f, +0.016238f, +0.023041f, +0.000177f}, - {-0.005833f, +0.056756f, -0.003891f, +0.011659f, -0.013338f, +0.016593f, -0.000291f}, - {+0.005419f, +0.040607f, +0.004132f, -0.013323f, -0.017875f, -0.003126f, -0.000447f}, - {-0.004253f, +0.020851f, +0.031947f, +0.033527f, +0.001452f, -0.004281f, -0.000039f} - }, - { - {+0.000232f, -0.196424f, -0.385415f, -0.022712f, -0.006855f, +0.000856f, +0.000126f}, - {+0.000418f, +0.175457f, +0.245702f, +0.013319f, -0.015788f, -0.013106f, +0.000327f}, - {-0.001154f, +0.007098f, -0.063563f, -0.017231f, -0.005626f, -0.013559f, -0.001143f}, - {-0.012555f, -0.174488f, +0.237964f, -0.039418f, -0.002349f, -0.016946f, -0.001147f}, - {+0.003784f, +0.065353f, -0.070894f, +0.006390f, +0.057332f, +0.007117f, +0.001233f}, - {-0.000349f, +0.048045f, -0.027724f, +0.012524f, +0.033626f, -0.005520f, +0.001111f}, - {+0.017541f, +0.092792f, +0.030184f, -0.047810f, +0.016410f, -0.003144f, -0.001400f}, - {-0.000437f, -0.002996f, -0.013522f, +0.006474f, +0.030405f, -0.007597f, -0.001046f}, - {-0.007428f, -0.049136f, -0.023268f, -0.015781f, -0.011003f, -0.014398f, +0.000182f}, - {-0.001481f, -0.033593f, -0.004295f, +0.004592f, -0.021205f, -0.000050f, +0.000263f}, - {-0.005354f, -0.018801f, +0.011774f, -0.002287f, +0.027282f, -0.010347f, +0.000769f}, - {+0.009152f, +0.006626f, +0.078942f, +0.000242f, -0.021966f, -0.021963f, -0.000453f}, - {+0.009690f, +0.055165f, +0.045330f, -0.032221f, +0.065784f, +0.004359f, +0.001062f}, - {+0.010862f, +0.081924f, -0.069800f, -0.013181f, +0.045093f, -0.014171f, +0.000806f}, - {+0.005800f, +0.042160f, -0.003294f, -0.036254f, +0.013693f, -0.023545f, +0.000070f}, - {+0.009050f, +0.025948f, +0.028277f, -0.000043f, +0.018071f, -0.006021f, -0.000268f} - }, - { - {-0.001778f, +0.223111f, +0.243284f, +0.023691f, -0.004197f, +0.005091f, -0.000088f}, - {-0.002088f, -0.146779f, -0.282563f, -0.032455f, +0.005584f, +0.004320f, +0.000383f}, - {-0.012406f, +0.076657f, +0.054535f, +0.019126f, -0.004735f, +0.003766f, +0.000879f}, - {-0.000400f, +0.009278f, +0.480121f, +0.005043f, +0.003008f, +0.000400f, +0.000750f}, - {+0.000331f, +0.023120f, -0.141880f, -0.021964f, +0.032304f, -0.009784f, -0.000503f}, - {+0.005941f, +0.021748f, -0.079982f, -0.022467f, +0.025801f, -0.013174f, -0.000364f}, - {-0.027576f, -0.056867f, -0.044804f, -0.025088f, +0.021454f, +0.021391f, +0.000258f}, - {+0.000666f, +0.004812f, -0.031881f, -0.003249f, +0.015597f, -0.005884f, +0.000399f}, - {+0.001918f, -0.036904f, +0.028920f, -0.012401f, -0.003927f, -0.013129f, -0.000289f}, - {+0.004733f, -0.044313f, -0.017544f, +0.019033f, -0.000125f, +0.005854f, -0.000158f}, - {+0.003306f, +0.007736f, +0.036072f, -0.013098f, +0.016743f, -0.014288f, +0.000093f}, - {-0.002198f, -0.032947f, +0.025622f, -0.013714f, +0.002822f, -0.006481f, +0.000426f}, - {-0.010347f, +0.044911f, +0.109159f, -0.005157f, +0.028906f, -0.016894f, -0.000962f}, - {-0.012573f, -0.001057f, -0.086903f, -0.008620f, +0.026300f, -0.014200f, -0.000105f}, - {-0.006637f, +0.003910f, +0.011665f, +0.001170f, +0.021670f, -0.012737f, +0.000541f}, - {-0.006125f, -0.002545f, +0.021834f, -0.006301f, +0.010358f, -0.000879f, +0.000147f} - }, - { - {+0.001661f, +0.044798f, +0.497958f, +0.007682f, +0.001920f, +0.000678f, -0.000069f}, - {+0.001629f, -0.057245f, -0.418929f, -0.026166f, +0.007984f, +0.010658f, -0.000615f}, - {+0.009494f, -0.023460f, +0.158416f, +0.022301f, +0.001622f, +0.009939f, +0.000314f}, - {+0.005164f, +0.249867f, +0.124203f, +0.025636f, +0.005748f, +0.000660f, +0.000601f}, - {+0.003519f, -0.029885f, -0.075655f, -0.003349f, +0.004214f, -0.004704f, -0.000885f}, - {+0.000755f, -0.015219f, -0.048678f, -0.020834f, +0.012934f, -0.003014f, -0.000805f}, - {+0.006115f, -0.134583f, -0.038858f, +0.039498f, -0.010231f, +0.019073f, +0.001215f}, - {-0.006065f, +0.022158f, +0.017704f, -0.018410f, +0.001416f, -0.001222f, +0.000596f}, - {+0.002762f, -0.060790f, +0.053349f, +0.001174f, -0.011245f, -0.011658f, -0.000102f}, - {-0.003442f, +0.021974f, -0.051257f, +0.015449f, -0.006060f, +0.001236f, -0.000282f}, - {+0.000460f, +0.017973f, +0.022112f, +0.000478f, +0.004836f, -0.011224f, -0.000713f}, - {-0.002907f, +0.013619f, -0.015874f, -0.006198f, +0.002588f, -0.007083f, +0.000030f}, - {+0.005990f, +0.054285f, +0.021602f, +0.028748f, +0.000862f, -0.009091f, -0.000327f}, - {+0.007170f, -0.073188f, -0.020928f, -0.013170f, -0.006551f, +0.016420f, -0.000711f}, - {+0.002439f, +0.025659f, -0.013787f, +0.013123f, +0.004380f, -0.000469f, -0.000567f}, - {+0.001480f, +0.021027f, -0.001495f, -0.003191f, -0.008078f, +0.005950f, +0.000028f} - }, - { - {+0.000593f, -0.236478f, +0.062751f, -0.031574f, +0.001932f, +0.000475f, +0.000125f}, - {-0.001112f, +0.219741f, +0.045964f, +0.033082f, +0.012846f, +0.010238f, -0.000058f}, - {-0.000288f, -0.043345f, +0.129386f, +0.006449f, +0.014950f, +0.014326f, -0.000484f}, - {-0.000954f, -0.177421f, -0.465052f, -0.016332f, +0.003856f, -0.000880f, -0.000851f}, - {-0.006500f, +0.076420f, +0.126017f, +0.020000f, -0.005284f, -0.001453f, +0.000605f}, - {-0.005990f, -0.031405f, -0.037913f, +0.013960f, +0.013903f, -0.004807f, +0.000506f}, - {+0.015687f, +0.021104f, +0.113959f, +0.012439f, -0.039996f, +0.000223f, -0.000453f}, - {-0.000473f, +0.041740f, +0.044827f, -0.015459f, -0.002343f, -0.005928f, -0.000432f}, - {+0.001060f, -0.019108f, +0.067790f, +0.019182f, +0.001142f, -0.000990f, +0.000595f}, - {-0.003359f, +0.055575f, -0.011279f, +0.025875f, -0.003999f, +0.001129f, +0.000287f}, - {+0.002395f, -0.004105f, +0.011084f, +0.010291f, +0.008377f, +0.009379f, +0.000116f}, - {+0.000216f, +0.045114f, +0.020852f, +0.005913f, +0.002893f, -0.004932f, -0.000316f}, - {+0.003783f, -0.058127f, -0.116863f, +0.015414f, +0.004459f, +0.012101f, +0.001164f}, - {+0.001940f, -0.000953f, +0.073317f, +0.000380f, -0.013800f, +0.008255f, +0.000500f}, - {-0.001348f, +0.013472f, -0.048338f, -0.016392f, -0.002728f, +0.008729f, -0.000177f}, - {-0.002293f, +0.042225f, +0.020761f, -0.007674f, -0.021144f, -0.001111f, -0.000047f} - }, - { - {-0.001881f, +0.104692f, -0.437628f, +0.010124f, -0.004119f, +0.002798f, -0.000007f}, - {+0.000985f, -0.054923f, +0.473910f, -0.002045f, +0.002078f, +0.007573f, +0.000638f}, - {-0.004261f, +0.068963f, -0.026476f, +0.007698f, +0.005161f, +0.016700f, -0.000087f}, - {-0.000472f, -0.135013f, -0.565164f, -0.012751f, +0.014398f, -0.005967f, -0.000128f}, - {+0.002219f, -0.017222f, +0.277363f, -0.009247f, -0.012340f, -0.001014f, +0.000724f}, - {+0.002529f, +0.014422f, -0.078148f, +0.013292f, +0.001185f, +0.005919f, +0.000538f}, - {-0.012201f, +0.079026f, +0.174608f, -0.053111f, -0.028818f, -0.008327f, -0.001164f}, - {+0.008807f, +0.024623f, -0.021642f, +0.012326f, +0.005481f, -0.005376f, -0.000217f}, - {-0.004625f, +0.095195f, -0.032818f, +0.006017f, -0.007642f, +0.021939f, -0.000335f}, - {+0.005561f, -0.011254f, +0.069687f, +0.007241f, +0.007441f, -0.000401f, +0.000318f}, - {-0.004316f, +0.006517f, +0.015791f, +0.011842f, +0.000856f, +0.009342f, +0.000485f}, - {+0.004504f, -0.028032f, +0.066155f, +0.028674f, -0.003536f, -0.000815f, +0.000257f}, - {-0.007052f, -0.039724f, -0.103443f, -0.003110f, +0.009274f, +0.021142f, -0.000615f}, - {-0.006271f, +0.036829f, +0.058440f, -0.010721f, -0.009936f, +0.008632f, +0.000238f}, - {+0.001946f, -0.003377f, -0.061145f, -0.011028f, -0.000124f, +0.004200f, +0.000756f}, - {+0.005945f, +0.005663f, +0.029383f, -0.007265f, -0.007601f, -0.001858f, +0.000153f} - }, - { - {+0.001608f, +0.200304f, -0.287352f, +0.023568f, -0.012646f, -0.001792f, -0.000110f}, - {+0.000873f, -0.220254f, +0.233692f, -0.013980f, -0.019805f, -0.013042f, -0.000254f}, - {+0.005248f, +0.005267f, -0.097062f, +0.009788f, -0.031921f, -0.004981f, +0.000066f}, - {-0.006026f, +0.165134f, -0.129644f, +0.024946f, +0.039434f, +0.008272f, +0.000680f}, - {+0.004821f, -0.081844f, +0.161841f, -0.022252f, -0.006155f, -0.007528f, -0.000769f}, - {+0.002549f, +0.058108f, -0.046846f, +0.003059f, +0.000697f, +0.000618f, -0.000547f}, - {-0.007110f, -0.091546f, -0.012640f, -0.034041f, -0.004692f, +0.010014f, +0.000815f}, - {-0.004608f, +0.001433f, -0.064603f, -0.001817f, +0.036470f, +0.013459f, +0.000154f}, - {+0.000858f, +0.011046f, -0.117929f, +0.000666f, -0.010929f, +0.023558f, -0.000529f}, - {-0.000262f, +0.000025f, +0.103739f, +0.005447f, +0.009620f, -0.007360f, -0.000558f}, - {+0.000017f, -0.006779f, -0.001324f, +0.018054f, -0.004434f, -0.000980f, -0.000147f}, - {-0.001773f, -0.058408f, +0.050166f, +0.036957f, +0.028180f, +0.014311f, -0.000042f}, - {-0.002142f, +0.052174f, +0.014142f, +0.000352f, +0.005846f, +0.011380f, -0.000521f}, - {+0.002509f, -0.018918f, -0.023498f, -0.007300f, -0.010118f, -0.001050f, -0.000485f}, - {-0.001969f, +0.016255f, -0.030569f, -0.007966f, +0.008209f, +0.001626f, -0.000336f}, - {-0.005908f, -0.042236f, +0.002979f, -0.003313f, -0.002114f, +0.001176f, -0.000242f} - }, - { - {-0.002283f, -0.190264f, +0.317807f, -0.041862f, -0.013710f, -0.009182f, +0.000055f}, - {-0.004396f, +0.188305f, -0.367265f, +0.016356f, -0.017064f, -0.018999f, -0.000459f}, - {-0.006914f, -0.060402f, +0.070487f, -0.038753f, -0.028167f, -0.025907f, +0.000326f}, - {+0.011485f, -0.111924f, +0.257419f, +0.027696f, +0.043074f, +0.023043f, -0.000112f}, - {-0.006481f, +0.106988f, -0.078641f, -0.010369f, -0.020637f, -0.004268f, -0.000552f}, - {-0.002442f, +0.002203f, +0.021242f, -0.008312f, +0.010172f, -0.001226f, -0.000290f}, - {+0.015369f, -0.049094f, -0.176897f, +0.009396f, -0.018227f, -0.013839f, +0.000931f}, - {-0.002747f, -0.037808f, +0.016824f, +0.000881f, +0.041844f, +0.014131f, +0.000188f}, - {+0.002663f, -0.042773f, -0.067404f, -0.021799f, -0.000291f, -0.007144f, +0.000772f}, - {-0.002855f, +0.010467f, +0.079956f, +0.016808f, +0.003165f, -0.008992f, -0.000182f}, - {+0.001899f, +0.008400f, -0.030905f, +0.010609f, -0.001047f, +0.001953f, -0.000193f}, - {-0.005525f, -0.032964f, +0.043242f, +0.021771f, +0.050726f, +0.017866f, -0.000160f}, - {+0.009763f, -0.025562f, +0.101453f, -0.004032f, +0.007303f, -0.009460f, +0.000915f}, - {+0.003132f, -0.026920f, -0.054686f, +0.011398f, +0.001945f, -0.016836f, +0.000242f}, - {+0.003754f, -0.004524f, +0.013916f, -0.011236f, +0.007995f, +0.003567f, -0.000513f}, - {+0.002200f, -0.015957f, -0.044466f, +0.002366f, +0.002169f, -0.002036f, -0.000098f} - }, - { - {+0.003609f, -0.124165f, +0.450240f, -0.011960f, +0.001814f, -0.000226f, +0.000090f}, - {+0.005252f, +0.076277f, -0.547236f, +0.002862f, +0.003045f, -0.000456f, +0.000415f}, - {+0.006808f, -0.053114f, +0.098672f, -0.009249f, +0.001674f, -0.012447f, -0.000058f}, - {-0.008375f, -0.004906f, +0.362870f, -0.014974f, -0.000367f, -0.002802f, -0.000478f}, - {+0.002228f, -0.003473f, -0.205137f, +0.023272f, +0.006215f, +0.017134f, +0.001010f}, - {+0.000571f, -0.025991f, +0.026818f, +0.005091f, +0.013779f, +0.007778f, +0.000473f}, - {-0.003735f, -0.105491f, -0.279191f, -0.027929f, -0.010252f, -0.020097f, -0.001156f}, - {-0.001217f, +0.071835f, +0.154430f, -0.011855f, +0.002667f, -0.002826f, +0.000054f}, - {+0.000480f, -0.020383f, -0.034553f, -0.028592f, -0.016234f, -0.022065f, +0.000065f}, - {-0.000803f, -0.045105f, +0.000768f, +0.011625f, +0.005524f, +0.002577f, +0.000868f}, - {+0.003690f, -0.013195f, -0.053141f, +0.016549f, +0.007503f, +0.003226f, -0.000154f}, - {+0.004956f, +0.069593f, +0.135765f, +0.005671f, +0.003950f, -0.004994f, +0.000202f}, - {-0.001284f, -0.058847f, +0.070425f, -0.007215f, -0.008366f, -0.028907f, -0.000284f}, - {-0.003455f, -0.008730f, -0.036217f, -0.008454f, -0.004655f, -0.017679f, +0.000014f}, - {-0.005924f, -0.006414f, +0.021672f, -0.012342f, -0.002642f, -0.000940f, +0.000569f}, - {+0.000350f, +0.002979f, -0.028344f, +0.001530f, -0.005199f, -0.000823f, +0.000541f} - }, - { - {-0.002595f, +0.231505f, -0.059475f, +0.031323f, +0.000811f, +0.002997f, -0.000105f}, - {-0.000920f, -0.251923f, -0.021212f, -0.041245f, -0.002087f, +0.009892f, +0.000208f}, - {-0.001905f, +0.088975f, -0.095092f, +0.000614f, -0.000732f, +0.001651f, -0.000526f}, - {+0.001829f, +0.162263f, +0.072547f, +0.010691f, -0.006275f, -0.010152f, +0.000202f}, - {+0.001074f, -0.127675f, -0.024806f, +0.004697f, +0.015653f, +0.013365f, +0.000181f}, - {-0.001734f, -0.018512f, +0.027144f, +0.018621f, +0.006091f, +0.003330f, +0.000128f}, - {-0.010389f, -0.084487f, -0.226334f, -0.035829f, -0.004528f, -0.009666f, -0.000481f}, - {+0.009032f, +0.061811f, +0.096836f, +0.009505f, -0.012954f, +0.000064f, -0.000350f}, - {-0.002417f, -0.004918f, -0.012012f, -0.022845f, -0.015983f, -0.009882f, -0.000808f}, - {+0.003024f, -0.039172f, -0.013326f, +0.000801f, +0.001560f, +0.016627f, -0.000275f}, - {-0.007452f, -0.030058f, +0.016768f, -0.006774f, +0.012188f, -0.006626f, +0.000198f}, - {+0.004613f, +0.042919f, +0.140928f, +0.003562f, -0.014757f, +0.000165f, -0.000013f}, - {-0.012233f, +0.049543f, -0.035377f, +0.000625f, -0.000981f, -0.023350f, -0.000508f}, - {-0.000298f, -0.004223f, -0.034114f, -0.011313f, -0.011180f, -0.002456f, -0.000276f}, - {+0.003105f, +0.000900f, -0.043146f, +0.007921f, -0.009306f, +0.001719f, +0.000197f}, - {+0.000056f, -0.017410f, +0.012442f, -0.014149f, -0.007345f, +0.007077f, -0.000235f} - }, - { - {-0.000105f, -0.028242f, -0.490151f, -0.006013f, -0.000405f, +0.003651f, -0.000044f}, - {-0.004273f, +0.091012f, +0.512346f, +0.009209f, -0.006038f, +0.006005f, -0.000395f}, - {-0.003775f, -0.013142f, -0.264416f, -0.018230f, +0.003223f, +0.013630f, +0.000320f}, - {+0.000877f, -0.058724f, -0.212378f, -0.000299f, -0.004217f, -0.010691f, +0.000326f}, - {+0.000849f, +0.003925f, +0.168919f, +0.006611f, +0.017126f, +0.002900f, -0.001110f}, - {+0.003390f, +0.030951f, +0.055595f, +0.010449f, -0.001866f, -0.002874f, -0.000333f}, - {+0.007610f, +0.216878f, +0.101973f, -0.006828f, -0.006093f, +0.002417f, +0.001281f}, - {-0.005247f, -0.092910f, -0.082840f, +0.000173f, -0.000662f, +0.004149f, -0.000070f}, - {-0.003825f, +0.054499f, +0.068119f, -0.004337f, -0.003343f, +0.005033f, +0.000389f}, - {+0.001521f, -0.011283f, +0.019235f, -0.007889f, +0.004145f, +0.013462f, -0.000877f}, - {+0.002597f, +0.017853f, +0.077262f, -0.005729f, +0.000186f, -0.009721f, +0.000537f}, - {-0.007806f, -0.173983f, -0.083663f, -0.017989f, -0.010736f, +0.004214f, -0.000162f}, - {+0.007527f, +0.139189f, +0.016947f, +0.007434f, +0.010151f, -0.003075f, +0.000600f}, - {+0.001257f, +0.034327f, +0.000584f, -0.010653f, -0.017435f, +0.012041f, +0.000506f}, - {+0.003054f, -0.012901f, -0.072559f, -0.003234f, -0.002533f, +0.004886f, -0.000554f}, - {-0.001440f, -0.001177f, +0.041342f, -0.035758f, -0.008227f, +0.013542f, -0.000605f} - }, - { - {+0.000534f, -0.191712f, -0.256462f, -0.027639f, -0.000869f, +0.002740f, +0.000150f}, - {+0.004711f, +0.189644f, +0.323706f, +0.035566f, -0.003931f, +0.001774f, -0.000023f}, - {+0.005338f, -0.132584f, -0.123062f, -0.006922f, +0.001908f, +0.014249f, +0.000418f}, - {-0.001514f, -0.096895f, -0.149462f, -0.012634f, -0.002553f, -0.008145f, -0.000239f}, - {-0.004455f, +0.078939f, +0.109890f, -0.030175f, +0.054100f, -0.020621f, +0.000317f}, - {-0.001954f, +0.037369f, +0.070319f, -0.012542f, +0.001373f, -0.004905f, -0.000105f}, - {+0.009597f, +0.091443f, +0.213955f, +0.082122f, -0.078271f, +0.037887f, -0.000021f}, - {-0.006956f, -0.041842f, -0.097106f, -0.047918f, +0.046573f, -0.019063f, +0.000497f}, - {+0.009351f, +0.017534f, +0.036624f, +0.019555f, -0.006998f, +0.006656f, +0.000487f}, - {-0.006094f, +0.025598f, +0.007412f, -0.043196f, +0.046727f, -0.015901f, +0.000824f}, - {+0.003579f, +0.015919f, +0.063537f, +0.024273f, -0.033493f, +0.010473f, -0.000646f}, - {-0.003786f, -0.079431f, -0.211573f, -0.049145f, +0.046596f, -0.025127f, +0.000019f}, - {+0.013003f, +0.024809f, +0.097034f, +0.057786f, -0.052429f, +0.039258f, -0.000048f}, - {+0.003464f, +0.021931f, -0.011529f, +0.044162f, -0.055245f, +0.027731f, -0.000194f}, - {-0.005197f, -0.016476f, -0.014479f, -0.033521f, +0.033687f, -0.015973f, -0.000043f}, - {+0.001962f, +0.024503f, +0.005662f, -0.050924f, +0.039002f, -0.020531f, +0.000668f} - }, - { - {+0.001553f, +0.146963f, +0.302141f, +0.026379f, +0.000840f, +0.000346f, -0.000061f}, - {-0.001717f, -0.217569f, -0.292571f, -0.015852f, +0.000463f, +0.005375f, +0.000261f}, - {-0.004635f, +0.115185f, +0.259233f, +0.023669f, +0.003813f, +0.006664f, -0.000481f}, - {+0.003717f, +0.087889f, +0.084589f, -0.005335f, -0.001673f, -0.001669f, -0.000199f}, - {+0.004523f, -0.042980f, -0.118037f, -0.067124f, +0.037615f, -0.021729f, +0.000920f}, - {+0.000118f, -0.066640f, -0.036964f, -0.011214f, +0.005413f, -0.005046f, +0.000256f}, - {-0.021275f, -0.088041f, +0.115907f, +0.129339f, -0.055323f, +0.030816f, -0.001195f}, - {+0.013274f, +0.085064f, +0.010644f, -0.082487f, +0.025821f, -0.022331f, +0.000007f}, - {-0.003747f, -0.079218f, -0.067175f, +0.016473f, -0.003161f, +0.005630f, -0.000496f}, - {+0.004932f, +0.009594f, -0.051342f, -0.075947f, +0.023028f, -0.024066f, +0.000426f}, - {-0.004863f, -0.054121f, -0.015535f, +0.051655f, -0.010816f, +0.015566f, -0.000550f}, - {+0.014845f, +0.103176f, -0.080073f, -0.073893f, +0.033782f, -0.019073f, +0.000223f}, - {-0.020172f, -0.123083f, +0.025247f, +0.077152f, -0.044505f, +0.035317f, -0.000427f}, - {-0.009806f, -0.027794f, -0.010006f, +0.092919f, -0.036980f, +0.021231f, -0.000596f}, - {+0.003438f, +0.040179f, +0.056704f, -0.041600f, +0.022592f, -0.014077f, +0.000577f}, - {-0.000596f, -0.015506f, -0.049450f, -0.036447f, +0.050092f, -0.018485f, +0.000333f} - }, - { - {-0.002422f, +0.059309f, +0.454757f, +0.012657f, +0.002371f, -0.003051f, -0.000109f}, - {+0.000972f, -0.089012f, -0.471174f, +0.002615f, +0.003776f, -0.002449f, +0.000000f}, - {+0.004981f, +0.029440f, +0.402898f, +0.009542f, +0.008586f, -0.005243f, -0.000150f}, - {-0.003934f, +0.068475f, +0.154745f, -0.020530f, -0.010063f, +0.011466f, +0.000228f}, - {-0.001934f, -0.008674f, -0.222726f, -0.009188f, -0.005025f, +0.009762f, -0.000728f}, - {-0.001313f, -0.027392f, -0.137224f, +0.014991f, +0.001664f, -0.004118f, +0.000127f}, - {+0.014825f, -0.131128f, +0.122638f, +0.075503f, +0.018816f, -0.031020f, +0.000515f}, - {-0.011235f, +0.084345f, -0.009674f, -0.055727f, -0.015906f, +0.017483f, -0.000662f}, - {-0.005861f, -0.019533f, -0.082227f, +0.006916f, +0.001847f, +0.000758f, -0.000202f}, - {-0.002580f, +0.007477f, -0.078927f, -0.037096f, -0.017242f, +0.002675f, -0.001011f}, - {+0.006105f, -0.029808f, -0.069762f, +0.048809f, +0.026042f, -0.019077f, +0.001200f}, - {-0.007044f, +0.114937f, +0.015102f, -0.066422f, -0.026713f, +0.021148f, -0.000080f}, - {+0.001891f, -0.137403f, -0.008770f, +0.069524f, +0.011781f, -0.014633f, +0.000357f}, - {+0.011650f, -0.048431f, -0.022767f, +0.070071f, +0.022558f, -0.031545f, +0.000766f}, - {-0.004098f, +0.038606f, +0.034870f, -0.023526f, -0.016759f, +0.018251f, -0.000137f}, - {-0.002804f, -0.007684f, -0.077297f, +0.002580f, +0.008066f, +0.011234f, -0.000920f} - }, - { - {+0.001243f, -0.224613f, -0.012233f, -0.028833f, +0.002009f, -0.001573f, +0.000139f}, - {-0.003295f, +0.291789f, +0.088662f, +0.035172f, +0.002488f, -0.006098f, -0.000188f}, - {-0.004422f, -0.109655f, +0.194382f, -0.015495f, -0.002943f, -0.012500f, +0.000375f}, - {-0.000983f, -0.060160f, +0.019095f, +0.002163f, -0.009795f, +0.008264f, +0.000115f}, - {+0.001589f, +0.082539f, -0.072974f, +0.012423f, +0.001200f, +0.017036f, -0.000476f}, - {+0.002963f, -0.004891f, -0.170906f, -0.002191f, +0.010678f, +0.003313f, -0.000249f}, - {+0.000920f, -0.061561f, +0.127515f, -0.015016f, +0.024498f, -0.020689f, +0.000844f}, - {+0.008002f, -0.061962f, -0.190966f, -0.006417f, -0.015050f, +0.014959f, +0.000195f}, - {+0.005173f, +0.156470f, +0.092158f, +0.003397f, +0.001560f, -0.000232f, +0.000368f}, - {+0.003501f, -0.012214f, -0.075482f, +0.005243f, +0.002154f, +0.020806f, +0.000155f}, - {-0.008351f, -0.016040f, -0.026286f, +0.012254f, +0.009563f, -0.018921f, +0.000087f}, - {-0.011531f, +0.098810f, +0.081896f, +0.003554f, -0.022476f, +0.012750f, -0.000309f}, - {+0.015089f, -0.023102f, -0.004189f, -0.005266f, +0.027232f, -0.009300f, +0.000031f}, - {-0.005756f, -0.105164f, -0.121008f, -0.004928f, +0.021585f, -0.023954f, +0.000170f}, - {+0.006045f, -0.003955f, -0.049276f, -0.014402f, -0.022434f, +0.010508f, -0.000583f}, - {+0.004951f, +0.038486f, -0.010450f, +0.009920f, -0.000470f, +0.019584f, +0.000126f} - }, - { - {-0.000785f, +0.071187f, -0.465505f, +0.008818f, +0.000726f, -0.000365f, -0.000008f}, - {+0.003977f, -0.050770f, +0.585842f, -0.009869f, +0.005833f, -0.006502f, -0.000042f}, - {+0.001056f, +0.090926f, -0.134707f, -0.000269f, +0.002753f, -0.009764f, +0.000032f}, - {+0.004617f, -0.003374f, -0.109444f, +0.009037f, -0.005531f, +0.005999f, -0.000201f}, - {-0.003957f, -0.051265f, +0.172281f, -0.013706f, -0.002364f, +0.006848f, +0.000853f}, - {-0.001658f, -0.038903f, -0.082157f, +0.000716f, +0.007295f, +0.006209f, -0.000121f}, - {-0.008525f, +0.078895f, -0.017870f, -0.012860f, +0.021118f, -0.002045f, -0.000829f}, - {-0.004920f, +0.015338f, -0.238590f, -0.001845f, -0.024647f, +0.009983f, +0.000767f}, - {+0.004676f, +0.105685f, +0.151514f, -0.014114f, -0.002475f, +0.001016f, +0.000176f}, - {-0.004034f, -0.022836f, -0.044207f, +0.014588f, +0.008672f, +0.010817f, +0.000710f}, - {+0.002168f, -0.116093f, +0.070756f, +0.031832f, -0.022730f, +0.006607f, -0.001442f}, - {+0.016149f, +0.002381f, +0.087859f, +0.020749f, +0.000196f, -0.003994f, +0.000292f}, - {-0.004050f, +0.044943f, -0.009330f, -0.045828f, +0.060443f, -0.016203f, -0.000276f}, - {-0.005468f, -0.113575f, -0.136984f, +0.012815f, +0.014267f, -0.005446f, -0.000965f}, - {-0.002865f, +0.038861f, -0.055190f, -0.024730f, -0.004192f, -0.008756f, +0.000421f}, - {-0.000981f, +0.013622f, +0.075658f, -0.024512f, +0.006801f, +0.006189f, +0.000849f} - }, - { - {+0.001239f, +0.191379f, -0.284220f, +0.019946f, +0.003893f, +0.000657f, -0.000100f}, - {-0.001075f, -0.276377f, +0.283032f, -0.022859f, +0.009082f, -0.003365f, +0.000240f}, - {+0.001241f, -0.011637f, -0.274203f, +0.004930f, +0.017890f, -0.002705f, -0.000186f}, - {-0.000041f, -0.018968f, -0.133490f, +0.005016f, -0.007152f, +0.003102f, -0.000080f}, - {+0.003640f, -0.003961f, +0.218334f, -0.022294f, -0.024633f, -0.009211f, -0.000017f}, - {-0.000298f, +0.117839f, +0.145841f, +0.001220f, +0.000336f, +0.003714f, +0.000241f}, - {+0.003359f, +0.080035f, -0.097693f, -0.029470f, +0.008235f, -0.002678f, -0.000275f}, - {+0.000294f, +0.114223f, -0.072671f, +0.021916f, -0.033236f, -0.003728f, -0.000589f}, - {-0.009708f, -0.120433f, -0.071254f, -0.014746f, -0.008719f, -0.006424f, -0.000344f}, - {+0.001269f, +0.046754f, +0.003954f, -0.016916f, -0.003171f, -0.006009f, -0.000388f}, - {+0.012341f, -0.075476f, +0.093630f, +0.049195f, -0.003798f, +0.028589f, +0.000568f}, - {-0.002325f, -0.131285f, -0.044269f, +0.020071f, +0.028957f, +0.007233f, +0.000174f}, - {-0.019754f, +0.109314f, +0.101468f, -0.085502f, +0.027617f, -0.021611f, +0.000269f}, - {+0.013359f, +0.074152f, +0.055568f, +0.013092f, +0.010223f, +0.008649f, +0.000405f}, - {-0.002438f, +0.089734f, +0.050761f, -0.012420f, +0.004906f, -0.005249f, +0.000350f}, - {-0.007586f, -0.002478f, +0.072281f, -0.033398f, -0.009508f, -0.010318f, -0.000512f} - }, - { - {+0.000051f, -0.155265f, +0.261455f, -0.025571f, +0.008165f, -0.000717f, +0.000066f}, - {-0.001630f, +0.169186f, -0.393845f, +0.036438f, -0.008078f, +0.006680f, -0.000028f}, - {+0.000337f, -0.079130f, -0.143638f, -0.006564f, +0.000925f, +0.007661f, -0.000153f}, - {-0.007150f, -0.020081f, -0.070013f, -0.006603f, +0.004172f, -0.008362f, +0.000222f}, - {+0.002015f, +0.099180f, +0.044872f, -0.014401f, -0.021736f, -0.002693f, -0.000644f}, - {-0.000309f, +0.013186f, +0.262927f, -0.008874f, +0.004250f, +0.004267f, +0.000133f}, - {+0.004143f, +0.028994f, -0.084453f, +0.022748f, -0.010859f, +0.000658f, +0.000717f}, - {+0.001064f, -0.067881f, +0.148877f, -0.004518f, -0.009488f, -0.012696f, -0.000549f}, - {+0.004788f, -0.075563f, -0.198295f, +0.012604f, -0.014432f, -0.006906f, -0.000228f}, - {+0.000822f, -0.008456f, +0.066147f, -0.014101f, +0.000566f, -0.009494f, -0.000293f}, - {-0.017337f, +0.086056f, -0.025001f, +0.029312f, +0.013841f, +0.014057f, +0.001264f}, - {-0.007897f, -0.009827f, -0.121822f, -0.034941f, +0.036994f, +0.008486f, -0.000358f}, - {+0.020805f, -0.117331f, +0.232026f, -0.011502f, -0.017947f, -0.002610f, -0.000143f}, - {-0.009701f, +0.046825f, +0.183213f, -0.000834f, -0.001503f, +0.018015f, +0.000694f}, - {+0.000783f, -0.037442f, +0.178684f, -0.005879f, -0.013166f, +0.009162f, -0.000528f}, - {+0.011722f, -0.002350f, -0.004545f, -0.002405f, -0.010888f, -0.012285f, -0.000539f} - }, - { - {-0.002527f, -0.041067f, +0.437759f, -0.007129f, +0.005781f, -0.001019f, +0.000019f}, - {+0.001146f, +0.101283f, -0.529356f, +0.017671f, -0.006206f, +0.006544f, -0.000244f}, - {-0.001251f, +0.075658f, +0.077822f, +0.003804f, -0.004672f, +0.009631f, +0.000203f}, - {+0.005863f, +0.094796f, +0.059519f, -0.004478f, -0.006540f, -0.013700f, +0.000009f}, - {-0.007285f, -0.061623f, -0.137831f, -0.001381f, -0.008080f, +0.004592f, +0.000290f}, - {+0.001291f, -0.109556f, +0.079837f, -0.019787f, +0.002279f, -0.002518f, -0.000266f}, - {-0.005084f, +0.124814f, +0.081853f, +0.002734f, -0.001840f, +0.008835f, -0.000121f}, - {+0.004182f, -0.049684f, +0.191667f, -0.005192f, +0.001015f, +0.000119f, +0.000867f}, - {+0.001163f, +0.010105f, -0.120678f, +0.012616f, +0.002928f, +0.005188f, +0.000510f}, - {-0.000188f, +0.004985f, +0.107319f, +0.006725f, +0.000249f, -0.007191f, +0.000210f}, - {+0.003857f, +0.076698f, -0.118389f, -0.002946f, +0.004928f, -0.024526f, -0.001114f}, - {+0.000953f, +0.010379f, -0.119279f, -0.017060f, +0.013659f, -0.010888f, -0.000001f}, - {+0.003450f, -0.223022f, +0.159256f, +0.028244f, -0.004310f, +0.024009f, -0.000105f}, - {-0.001797f, +0.007725f, +0.102409f, -0.028265f, +0.001228f, +0.008448f, -0.000702f}, - {+0.005477f, -0.062622f, +0.122632f, -0.002666f, -0.020475f, +0.004011f, -0.000036f}, - {-0.006490f, -0.074102f, -0.080569f, +0.003599f, -0.001484f, +0.001399f, +0.000668f} - }, - { - {+0.002605f, +0.217915f, +0.017254f, +0.026685f, +0.001074f, +0.001696f, -0.000027f}, - {+0.000507f, -0.280145f, +0.055434f, -0.036463f, +0.007121f, -0.000445f, +0.000151f}, - {-0.002225f, +0.031540f, +0.137049f, +0.003402f, +0.001446f, +0.006851f, +0.000259f}, - {+0.003339f, +0.029607f, +0.111028f, +0.012934f, -0.015664f, -0.008267f, -0.000233f}, - {+0.005138f, -0.044216f, -0.166568f, -0.008876f, +0.001389f, -0.000115f, +0.000307f}, - {+0.000318f, +0.060748f, -0.148723f, -0.005268f, +0.001350f, -0.007903f, -0.000142f}, - {+0.002239f, -0.107172f, +0.365147f, -0.022416f, +0.007887f, +0.007958f, -0.000349f}, - {-0.008240f, +0.029286f, +0.131515f, +0.000924f, +0.001729f, +0.003361f, +0.000076f}, - {-0.001111f, -0.048033f, +0.008200f, -0.002944f, +0.003827f, +0.007343f, +0.000098f}, - {+0.001402f, +0.043485f, +0.056675f, +0.011711f, -0.010410f, +0.001163f, +0.000166f}, - {+0.010717f, -0.047236f, -0.000355f, -0.006515f, -0.009782f, -0.018035f, -0.000768f}, - {+0.007978f, +0.038622f, -0.174602f, +0.002049f, +0.003385f, -0.010858f, +0.000228f}, - {-0.020226f, +0.096237f, -0.148919f, +0.011944f, +0.011821f, +0.016071f, +0.000439f}, - {+0.006621f, +0.001528f, -0.011697f, +0.001299f, +0.008412f, -0.001732f, -0.000267f}, - {-0.004817f, +0.097631f, -0.066498f, +0.021077f, -0.018987f, -0.003674f, +0.000339f}, - {-0.001070f, +0.015835f, -0.169665f, -0.009779f, +0.002793f, +0.003666f, +0.000178f} - }, - { - {-0.000218f, -0.089026f, -0.421023f, -0.012375f, -0.004634f, +0.001798f, -0.000012f}, - {-0.000562f, +0.036209f, +0.550665f, +0.008292f, +0.010922f, -0.001692f, +0.000105f}, - {+0.005142f, -0.043344f, +0.001224f, -0.012674f, +0.003441f, -0.001675f, -0.000409f}, - {-0.008966f, -0.031569f, +0.059797f, +0.001454f, +0.000130f, +0.005702f, +0.000118f}, - {+0.002522f, +0.011413f, -0.087325f, +0.011922f, +0.000022f, -0.005284f, -0.000260f}, - {-0.002181f, +0.052724f, -0.140023f, +0.006731f, -0.003810f, -0.005104f, +0.000356f}, - {-0.001765f, -0.138044f, +0.333274f, -0.033581f, -0.002688f, +0.003200f, +0.000115f}, - {+0.003973f, +0.003541f, +0.046013f, -0.008444f, -0.007414f, -0.002627f, -0.000742f}, - {-0.001162f, -0.005039f, +0.086514f, +0.005749f, +0.000068f, +0.001696f, -0.000644f}, - {-0.005849f, -0.018637f, -0.044453f, -0.010415f, -0.017192f, -0.005809f, +0.000040f}, - {-0.008661f, -0.000783f, +0.119984f, +0.007281f, +0.002656f, +0.002479f, +0.001365f}, - {-0.001526f, +0.035648f, -0.157081f, +0.009488f, +0.019925f, -0.005193f, +0.000063f}, - {+0.011404f, +0.097066f, -0.250275f, +0.008788f, +0.002808f, -0.002067f, -0.000457f}, - {+0.001614f, -0.102998f, -0.128763f, +0.002681f, +0.005070f, -0.005321f, +0.000660f}, - {-0.003298f, +0.036157f, -0.178811f, +0.006825f, -0.008513f, -0.007543f, -0.000020f}, - {+0.001641f, +0.072805f, -0.123235f, -0.015452f, +0.002179f, +0.000264f, -0.000592f} - }, - { - {-0.000975f, -0.195927f, -0.252176f, -0.030354f, -0.003229f, +0.000526f, -0.000001f}, - {-0.000309f, +0.234067f, +0.266019f, +0.031177f, +0.006945f, +0.001049f, -0.000130f}, - {-0.002386f, +0.028204f, -0.131500f, +0.018106f, +0.002251f, -0.009442f, -0.000107f}, - {+0.005664f, -0.042363f, +0.072003f, -0.019768f, +0.004863f, +0.013196f, +0.000136f}, - {-0.006853f, +0.021462f, -0.075786f, +0.014512f, -0.006282f, -0.005188f, -0.000127f}, - {+0.001367f, -0.048666f, +0.006991f, -0.006727f, -0.010622f, +0.002375f, +0.000051f}, - {+0.003019f, +0.102067f, -0.002017f, -0.014826f, -0.006139f, +0.006654f, +0.000175f}, - {+0.001819f, +0.060630f, -0.102441f, +0.007947f, -0.006446f, -0.004503f, +0.000229f}, - {+0.000306f, +0.033150f, +0.030918f, +0.012775f, -0.001709f, -0.007959f, +0.000197f}, - {+0.007447f, -0.004851f, -0.083008f, -0.030885f, -0.022103f, +0.013176f, -0.000348f}, - {-0.000980f, -0.004050f, +0.155101f, +0.009877f, -0.004389f, +0.010605f, +0.000136f}, - {-0.011198f, -0.094889f, +0.026127f, +0.019593f, +0.014251f, -0.000870f, -0.000246f}, - {+0.003826f, +0.006068f, -0.154175f, +0.011531f, -0.003595f, -0.004320f, -0.000133f}, - {-0.010429f, -0.057946f, -0.099086f, -0.007643f, +0.012220f, -0.006023f, -0.000013f}, - {+0.006881f, -0.044670f, -0.130668f, -0.002390f, -0.001337f, -0.004130f, -0.000157f}, - {+0.002955f, -0.008067f, -0.021343f, -0.008702f, -0.004275f, -0.000004f, +0.000081f} - }, - { - {+0.000069f, +0.146635f, +0.261169f, +0.019817f, +0.000075f, +0.000531f, +0.000050f}, - {+0.000305f, -0.167956f, -0.370129f, -0.020672f, -0.001785f, -0.004094f, -0.000005f}, - {-0.001609f, +0.024380f, -0.133534f, +0.009049f, +0.001346f, -0.007049f, +0.000490f}, - {-0.000308f, -0.024516f, +0.102890f, -0.000078f, -0.001148f, +0.006088f, -0.000171f}, - {+0.003839f, +0.022205f, -0.075778f, +0.005346f, -0.001081f, +0.003317f, +0.000138f}, - {-0.000262f, +0.001355f, +0.058890f, -0.010171f, -0.003640f, +0.003881f, -0.000395f}, - {-0.002110f, -0.010551f, -0.210784f, -0.011445f, -0.007396f, -0.008617f, -0.000022f}, - {-0.000164f, -0.077247f, -0.273416f, -0.009245f, -0.003585f, -0.002259f, +0.000426f}, - {+0.001898f, -0.029394f, -0.081419f, +0.001244f, -0.003552f, -0.004044f, +0.000555f}, - {-0.003842f, +0.015743f, +0.003106f, +0.017909f, -0.010335f, +0.016376f, -0.000053f}, - {+0.000773f, -0.009196f, +0.117905f, +0.005612f, +0.002042f, +0.007695f, -0.001220f}, - {+0.010660f, +0.058962f, +0.204008f, +0.008327f, +0.009183f, +0.007026f, -0.000141f}, - {-0.004701f, -0.015995f, -0.106937f, +0.021098f, -0.004298f, -0.004601f, +0.000763f}, - {+0.006433f, +0.158915f, +0.112726f, -0.004279f, +0.017104f, -0.005337f, -0.000512f}, - {-0.001227f, -0.004124f, -0.047424f, -0.003324f, +0.000541f, +0.001090f, -0.000151f}, - {-0.003536f, -0.000793f, +0.041435f, +0.013181f, +0.004530f, +0.004257f, +0.000379f} - }, - { - {+0.000364f, +0.080984f, +0.376956f, +0.011952f, +0.000472f, -0.001518f, -0.000035f}, - {+0.000358f, -0.095210f, -0.504080f, -0.005232f, -0.006697f, -0.000372f, +0.000005f}, - {+0.000714f, -0.120793f, +0.065080f, -0.000397f, -0.002637f, +0.003362f, -0.000163f}, - {-0.000153f, +0.085409f, -0.047521f, +0.008039f, -0.002805f, +0.001302f, -0.000001f}, - {+0.001358f, -0.070095f, +0.050933f, -0.008619f, +0.006272f, +0.002042f, +0.000141f}, - {+0.001606f, +0.076349f, -0.053110f, +0.001126f, +0.005007f, -0.002104f, +0.000094f}, - {+0.000002f, -0.031163f, -0.172766f, -0.008913f, -0.001813f, -0.012478f, -0.000206f}, - {-0.003516f, -0.128750f, -0.154401f, -0.011018f, -0.010691f, +0.005231f, -0.000216f}, - {-0.001149f, +0.000294f, -0.147009f, +0.020344f, -0.008919f, +0.004686f, -0.000431f}, - {+0.001679f, +0.029734f, +0.035947f, -0.006328f, +0.015421f, -0.005286f, +0.000570f}, - {+0.004711f, +0.055321f, -0.011201f, +0.003090f, +0.007013f, -0.002069f, +0.000342f}, - {+0.000641f, +0.063262f, +0.204996f, +0.003457f, +0.008688f, +0.007549f, +0.000450f}, - {-0.000379f, -0.044888f, -0.064556f, +0.012953f, -0.001097f, +0.000928f, -0.000518f}, - {+0.003186f, +0.094917f, +0.184077f, -0.001265f, +0.005182f, -0.004312f, +0.000161f}, - {-0.005195f, -0.055939f, +0.071423f, -0.012305f, +0.003317f, +0.000086f, +0.000225f}, - {-0.001806f, -0.015355f, +0.044186f, +0.012248f, +0.011792f, -0.000869f, -0.000164f} - }, - { - {+0.000195f, -0.185610f, -0.036287f, -0.024075f, +0.002082f, -0.000689f, -0.000044f}, - {-0.000757f, +0.229752f, +0.017681f, +0.031382f, -0.006224f, +0.001307f, +0.000075f}, - {+0.001914f, +0.006500f, +0.229048f, +0.000819f, -0.005861f, +0.003371f, -0.000304f}, - {-0.002186f, -0.056829f, -0.244763f, -0.001140f, -0.001038f, -0.002732f, +0.000098f}, - {-0.002962f, +0.006295f, +0.156039f, -0.011850f, +0.001834f, +0.002488f, -0.000145f}, - {-0.002632f, +0.018280f, -0.116610f, -0.003232f, +0.011774f, +0.002750f, +0.000318f}, - {-0.000368f, +0.118018f, +0.078968f, +0.009095f, +0.007376f, -0.003097f, +0.000120f}, - {-0.000867f, +0.179501f, +0.254048f, +0.024606f, -0.007672f, +0.009218f, -0.000263f}, - {-0.002079f, +0.021491f, -0.107751f, +0.011889f, -0.003752f, +0.008417f, -0.000315f}, - {-0.004687f, -0.011076f, +0.013710f, +0.010901f, +0.002336f, -0.018359f, -0.000185f}, - {-0.000171f, -0.103745f, -0.209256f, -0.011020f, +0.000511f, -0.007430f, +0.000803f}, - {-0.003492f, -0.092594f, -0.015449f, -0.020195f, -0.000503f, -0.000351f, -0.000039f}, - {-0.004172f, +0.029566f, +0.007150f, +0.009351f, +0.000760f, +0.002162f, -0.000446f}, - {-0.001750f, -0.062137f, +0.037050f, -0.023719f, -0.012362f, -0.004177f, +0.000369f}, - {+0.005958f, +0.060184f, +0.203001f, -0.025293f, -0.001997f, +0.001870f, +0.000255f}, - {+0.005258f, -0.060569f, -0.061313f, -0.024494f, +0.010320f, +0.002211f, -0.000161f} - }, - { - {+0.000112f, +0.060658f, -0.417787f, +0.005714f, +0.004379f, -0.002197f, +0.000068f}, - {+0.001102f, -0.095822f, +0.518040f, -0.011832f, -0.002015f, +0.000251f, +0.000000f}, - {-0.000516f, +0.082315f, +0.132261f, +0.005735f, -0.007129f, +0.002706f, +0.000243f}, - {+0.002333f, -0.078203f, -0.213458f, -0.013410f, +0.010117f, -0.008587f, -0.000019f}, - {+0.002081f, +0.076825f, +0.077848f, -0.015310f, -0.000613f, +0.001883f, -0.000148f}, - {+0.000575f, -0.080134f, +0.005198f, -0.013834f, +0.013263f, +0.006006f, -0.000155f}, - {+0.002393f, +0.024462f, +0.208714f, -0.012361f, +0.008510f, +0.002277f, +0.000100f}, - {+0.009163f, +0.075210f, +0.409320f, +0.005280f, +0.007354f, +0.000656f, +0.000140f}, - {+0.004047f, -0.084423f, +0.061196f, -0.021248f, +0.011737f, -0.000848f, +0.000475f}, - {+0.006606f, +0.032804f, -0.077956f, +0.007869f, -0.018631f, -0.005903f, -0.000583f}, - {-0.010179f, -0.078026f, -0.230409f, -0.005878f, -0.003699f, +0.003518f, -0.000459f}, - {-0.005684f, -0.014213f, -0.151112f, -0.001273f, -0.006624f, +0.001254f, -0.000492f}, - {+0.010719f, -0.040781f, +0.075906f, +0.029747f, -0.006338f, -0.010906f, +0.000848f}, - {-0.008963f, -0.034970f, -0.020605f, -0.013122f, -0.028749f, +0.011953f, -0.000294f}, - {-0.003411f, +0.040528f, +0.227979f, -0.043627f, -0.002551f, +0.014298f, -0.000446f}, - {-0.001660f, -0.005966f, -0.105333f, -0.046917f, +0.022085f, +0.000796f, +0.000090f} - }, - { - {-0.000762f, +0.164203f, -0.247474f, +0.021171f, +0.002604f, -0.001593f, +0.000004f}, - {-0.001507f, -0.190154f, +0.345179f, -0.027840f, +0.002873f, +0.000767f, -0.000153f}, - {-0.002025f, -0.067328f, -0.076491f, -0.004353f, -0.007606f, +0.000171f, +0.000078f}, - {-0.000406f, +0.123751f, +0.084938f, +0.003933f, +0.009525f, -0.007896f, -0.000054f}, - {-0.002507f, -0.050784f, -0.079755f, +0.010591f, +0.019603f, +0.004806f, +0.000238f}, - {+0.001211f, +0.003210f, +0.123704f, +0.005078f, +0.012530f, +0.000861f, -0.000240f}, - {-0.002198f, -0.122685f, +0.004525f, -0.009356f, +0.009948f, +0.002933f, -0.000172f}, - {-0.009420f, -0.096936f, +0.211990f, -0.000631f, +0.024610f, +0.000067f, +0.000227f}, - {-0.003401f, +0.043359f, +0.236137f, -0.016754f, +0.003721f, -0.009061f, +0.000108f}, - {-0.002629f, -0.050970f, -0.171015f, +0.010701f, -0.001236f, +0.008654f, +0.000462f}, - {+0.009391f, +0.075614f, -0.036986f, +0.017209f, -0.013531f, +0.004588f, -0.000450f}, - {+0.010190f, +0.026020f, -0.092489f, +0.018996f, -0.007141f, +0.007424f, +0.000270f}, - {-0.003474f, -0.040283f, +0.090442f, +0.009004f, -0.004342f, -0.014442f, -0.000085f}, - {+0.010671f, -0.021234f, -0.041419f, +0.021963f, -0.017488f, +0.020488f, -0.000125f}, - {-0.000297f, -0.084055f, +0.073590f, -0.011210f, +0.003463f, +0.009384f, -0.000164f}, - {-0.004279f, +0.044600f, +0.008641f, +0.002947f, +0.027023f, -0.005455f, +0.000050f} - }, - { - {-0.000283f, -0.176649f, +0.262566f, -0.014478f, -0.000954f, +0.001308f, -0.000065f}, - {+0.001140f, +0.224468f, -0.279707f, +0.024096f, +0.000047f, -0.001875f, +0.000114f}, - {+0.000295f, -0.043283f, -0.120193f, -0.002250f, -0.006566f, -0.003343f, -0.000115f}, - {-0.000666f, -0.031706f, +0.308527f, +0.002946f, +0.000818f, -0.001236f, -0.000021f}, - {+0.003617f, -0.019505f, -0.143563f, +0.020992f, +0.023490f, -0.001424f, +0.000030f}, - {+0.000505f, +0.065371f, +0.050416f, +0.019406f, +0.013739f, -0.004956f, +0.000166f}, - {-0.000079f, +0.061295f, -0.259588f, +0.019944f, -0.005382f, +0.003509f, +0.000117f}, - {+0.002104f, +0.058949f, -0.059993f, +0.018286f, +0.035136f, -0.004869f, -0.000129f}, - {+0.001987f, +0.057127f, +0.194890f, +0.013423f, -0.011511f, -0.004034f, -0.000400f}, - {-0.001749f, -0.059976f, -0.129299f, -0.005890f, +0.011219f, +0.006091f, +0.000349f}, - {+0.001519f, -0.020751f, +0.128431f, +0.012395f, -0.015072f, -0.001704f, +0.000350f}, - {-0.001715f, -0.003520f, +0.009236f, -0.008621f, +0.014036f, -0.004524f, +0.000320f}, - {-0.010397f, -0.014939f, +0.057907f, +0.006560f, -0.017006f, +0.004021f, -0.000748f}, - {+0.001022f, +0.060447f, -0.104723f, +0.013416f, +0.008510f, -0.003268f, +0.000304f}, - {+0.005057f, +0.086252f, -0.154014f, +0.015645f, +0.017376f, -0.013300f, +0.000642f}, - {+0.005479f, -0.023273f, +0.095430f, +0.015576f, +0.022876f, -0.005860f, +0.000040f} - }, - { - {+0.001675f, -0.061396f, +0.429767f, -0.006398f, -0.000228f, +0.003526f, +0.000023f}, - {+0.000038f, +0.062648f, -0.515535f, +0.008029f, +0.001737f, -0.001547f, +0.000082f}, - {+0.002291f, +0.049399f, +0.003192f, +0.012249f, +0.000654f, +0.000678f, -0.000034f}, - {+0.000593f, -0.108396f, +0.186199f, -0.012697f, +0.003336f, +0.005452f, +0.000123f}, - {-0.002390f, +0.058095f, -0.036001f, +0.006041f, +0.003012f, -0.007234f, -0.000254f}, - {-0.001933f, -0.004195f, -0.056774f, -0.003687f, +0.004092f, -0.006881f, +0.000217f}, - {+0.000593f, +0.099058f, -0.194124f, +0.023991f, -0.002165f, +0.006354f, -0.000012f}, - {+0.001696f, +0.017095f, -0.148208f, -0.004048f, +0.013373f, -0.008460f, -0.000177f}, - {-0.001325f, -0.077202f, -0.002682f, -0.007197f, -0.007521f, +0.006474f, -0.000016f}, - {+0.000736f, +0.051938f, +0.026746f, +0.008682f, +0.008806f, -0.002090f, -0.000530f}, - {-0.005409f, -0.046224f, +0.113326f, +0.016402f, -0.008996f, -0.004761f, +0.000319f}, - {-0.007047f, +0.001884f, +0.012136f, -0.013255f, +0.007585f, -0.013566f, -0.000298f}, - {+0.010596f, +0.004092f, +0.006563f, -0.012092f, -0.004082f, +0.021089f, +0.000426f}, - {-0.008695f, +0.032158f, -0.077474f, +0.007159f, +0.002695f, -0.010826f, -0.000194f}, - {-0.006170f, +0.054185f, -0.187606f, +0.009185f, +0.009767f, -0.019049f, -0.000096f}, - {-0.001578f, -0.028257f, +0.067351f, -0.012794f, +0.006489f, -0.002797f, -0.000065f} - }, - { - {-0.000604f, +0.195551f, +0.046469f, +0.024960f, +0.000124f, +0.002789f, +0.000055f}, - {-0.000690f, -0.220876f, -0.080732f, -0.034526f, +0.002081f, +0.002082f, -0.000149f}, - {+0.000246f, +0.043891f, +0.048838f, -0.000487f, -0.000343f, +0.001784f, +0.000016f}, - {-0.000835f, +0.096167f, -0.135430f, +0.014028f, +0.001033f, +0.010401f, -0.000056f}, - {-0.000208f, -0.005067f, +0.068234f, -0.003921f, -0.004117f, -0.005521f, +0.000126f}, - {-0.000916f, -0.048030f, -0.028754f, -0.003326f, -0.001391f, +0.000076f, -0.000235f}, - {+0.001355f, -0.130889f, +0.158329f, -0.015536f, +0.005834f, +0.000347f, -0.000134f}, - {+0.000772f, -0.014933f, -0.083088f, -0.015662f, -0.005534f, -0.000822f, +0.000089f}, - {+0.000775f, +0.009184f, -0.151945f, +0.000406f, +0.003723f, +0.001745f, +0.000332f}, - {+0.001608f, -0.007143f, +0.122931f, -0.000855f, -0.002881f, +0.002170f, -0.000072f}, - {-0.000702f, +0.045072f, -0.040098f, +0.018823f, +0.001317f, -0.002269f, -0.000285f}, - {+0.004532f, +0.032658f, -0.089350f, +0.008837f, -0.001128f, -0.005456f, -0.000214f}, - {+0.002363f, +0.019083f, +0.016835f, -0.018529f, -0.001377f, +0.016870f, +0.000540f}, - {+0.001715f, -0.134043f, +0.119796f, -0.009102f, +0.006833f, -0.014270f, -0.000027f}, - {-0.000241f, -0.081470f, -0.041657f, +0.000811f, -0.002552f, -0.004671f, -0.000698f}, - {-0.002448f, +0.073265f, -0.102780f, +0.006728f, -0.005038f, +0.008304f, -0.000118f} - }, - { - {-0.001452f, -0.069169f, -0.359772f, -0.004528f, -0.001473f, -0.001174f, -0.000052f}, - {+0.000298f, +0.104548f, +0.415506f, +0.005346f, +0.002661f, +0.003417f, +0.000022f}, - {-0.004227f, -0.021575f, -0.027481f, -0.005602f, -0.003477f, -0.000211f, +0.000081f}, - {+0.001287f, +0.013519f, -0.267631f, +0.008302f, -0.001317f, +0.004439f, -0.000141f}, - {+0.000359f, -0.000352f, +0.067106f, -0.012917f, -0.006433f, -0.003644f, +0.000143f}, - {+0.004008f, +0.012160f, +0.057113f, +0.006758f, +0.001210f, +0.002980f, -0.000130f}, - {-0.002266f, -0.023397f, +0.318814f, -0.007434f, +0.005449f, -0.001677f, +0.000180f}, - {-0.001788f, +0.018561f, -0.001859f, -0.003902f, -0.003138f, +0.001594f, +0.000177f}, - {+0.000498f, +0.040998f, -0.104388f, +0.007015f, +0.005666f, -0.003054f, -0.000009f}, - {+0.000750f, -0.015717f, +0.104401f, -0.011167f, -0.018971f, +0.000557f, +0.000338f}, - {+0.002290f, -0.018734f, -0.161180f, -0.000199f, +0.006956f, +0.002383f, -0.000251f}, - {+0.002329f, +0.000388f, -0.118224f, +0.001665f, +0.000288f, +0.002715f, +0.000270f}, - {-0.008356f, -0.024500f, +0.022446f, +0.012317f, -0.008248f, -0.005294f, -0.000668f}, - {+0.006958f, -0.022401f, +0.224422f, +0.002575f, +0.012970f, -0.007896f, +0.000296f}, - {+0.006675f, +0.016668f, +0.092843f, -0.004034f, +0.003197f, +0.011486f, +0.000459f}, - {+0.003001f, +0.042559f, -0.167839f, -0.012591f, -0.010475f, +0.006189f, +0.000137f} - }, - { - {+0.001035f, -0.135712f, -0.265067f, -0.014975f, -0.000173f, -0.002689f, -0.000027f}, - {-0.000022f, +0.153794f, +0.337679f, +0.016131f, +0.002264f, +0.001857f, +0.000076f}, - {+0.002408f, -0.029883f, -0.058542f, +0.003685f, -0.004307f, -0.001136f, -0.000028f}, - {-0.001009f, -0.110854f, -0.066337f, -0.007994f, +0.001871f, -0.001869f, +0.000206f}, - {+0.001958f, +0.038357f, -0.009285f, -0.006704f, -0.004883f, +0.003613f, -0.000203f}, - {-0.002126f, +0.034418f, +0.063655f, +0.004958f, +0.005206f, +0.002377f, +0.000286f}, - {+0.000538f, +0.150140f, +0.064965f, +0.004933f, +0.003963f, -0.000065f, +0.000002f}, - {-0.001160f, -0.027758f, +0.059854f, +0.003349f, -0.002280f, +0.003818f, -0.000068f}, - {-0.001370f, -0.078725f, +0.069559f, +0.006628f, -0.004080f, +0.003499f, -0.000321f}, - {-0.005045f, +0.087250f, -0.030052f, -0.009251f, -0.005200f, -0.005087f, +0.000028f}, - {+0.004623f, -0.037497f, -0.117998f, -0.017368f, +0.005325f, +0.002149f, +0.000273f}, - {-0.002264f, -0.112372f, +0.037646f, +0.000037f, +0.001923f, +0.006678f, +0.000193f}, - {+0.001085f, +0.002533f, -0.050740f, +0.020287f, -0.001175f, -0.016779f, -0.000229f}, - {-0.003630f, +0.183327f, +0.014287f, +0.012823f, -0.005434f, +0.009035f, -0.000371f}, - {-0.003395f, +0.010246f, +0.150859f, -0.008983f, +0.010531f, +0.013647f, +0.000481f}, - {-0.000416f, -0.086769f, +0.004870f, -0.014825f, -0.000882f, +0.001829f, +0.000113f} - }, - { - {+0.000645f, +0.154946f, +0.177668f, +0.017072f, +0.000651f, -0.001522f, +0.000072f}, - {+0.000549f, -0.194573f, -0.188311f, -0.025413f, -0.001784f, -0.002119f, -0.000030f}, - {+0.002387f, +0.018045f, +0.004555f, +0.005425f, -0.001933f, +0.000483f, -0.000060f}, - {+0.000284f, +0.072221f, +0.199350f, +0.001255f, -0.006916f, -0.008191f, -0.000017f}, - {-0.002646f, -0.013121f, -0.061521f, +0.004586f, +0.008749f, +0.011041f, +0.000026f}, - {-0.001392f, +0.014040f, +0.018106f, -0.002009f, +0.001377f, -0.001398f, -0.000040f}, - {+0.001216f, -0.089923f, -0.283202f, -0.010597f, +0.000107f, -0.005548f, -0.000176f}, - {+0.001911f, +0.010949f, +0.090459f, +0.006436f, +0.003223f, +0.005766f, -0.000234f}, - {+0.000186f, -0.021096f, +0.146517f, +0.004613f, -0.006003f, +0.005164f, +0.000046f}, - {+0.004900f, +0.001082f, -0.145303f, -0.003824f, +0.005874f, -0.001264f, -0.000130f}, - {-0.006513f, +0.036434f, +0.017113f, -0.008670f, -0.001776f, -0.001766f, +0.000139f}, - {-0.002383f, +0.011656f, +0.199522f, -0.001517f, -0.000917f, +0.006316f, -0.000312f}, - {+0.004072f, -0.017482f, -0.140043f, -0.005490f, +0.003161f, -0.009171f, +0.000809f}, - {-0.003928f, +0.035690f, -0.165301f, +0.017863f, +0.001525f, +0.015105f, -0.000020f}, - {-0.004490f, +0.026473f, +0.158660f, -0.016182f, +0.002051f, +0.001422f, -0.000697f}, - {-0.002701f, +0.021762f, +0.186409f, +0.002465f, +0.003261f, -0.000400f, -0.000186f} - }, - { - {+0.000099f, +0.036368f, +0.371003f, +0.001629f, +0.000185f, -0.000164f, -0.000035f}, - {-0.001027f, -0.021065f, -0.455523f, -0.007009f, +0.000171f, -0.003644f, -0.000031f}, - {-0.002203f, +0.010908f, +0.054143f, -0.006492f, +0.001603f, -0.000076f, +0.000020f}, - {+0.000202f, +0.081447f, +0.185899f, -0.000039f, -0.002519f, -0.009060f, -0.000207f}, - {+0.000145f, -0.040892f, -0.024916f, +0.002845f, +0.007084f, +0.008654f, +0.000149f}, - {+0.000681f, +0.015374f, -0.019466f, +0.006281f, -0.004147f, +0.001144f, -0.000190f}, - {-0.000720f, -0.090186f, -0.294095f, -0.004346f, +0.001360f, -0.006895f, +0.000032f}, - {+0.001250f, +0.048376f, +0.032072f, +0.005694f, +0.004343f, +0.001826f, +0.000175f}, - {+0.001972f, +0.055906f, +0.051458f, -0.008972f, +0.008989f, -0.004482f, +0.000341f}, - {-0.000721f, -0.053054f, -0.080364f, -0.010933f, -0.000804f, +0.005258f, -0.000240f}, - {-0.001755f, -0.008278f, +0.060930f, +0.007833f, -0.006118f, +0.000505f, -0.000186f}, - {+0.002845f, +0.055065f, +0.155770f, -0.013884f, +0.002897f, +0.003665f, -0.000097f}, - {+0.001472f, -0.015073f, -0.108333f, -0.008884f, -0.002637f, +0.002145f, -0.000265f}, - {+0.002067f, -0.074717f, -0.056765f, -0.010752f, +0.008573f, +0.010308f, +0.000507f}, - {+0.004477f, +0.042604f, +0.079819f, -0.009975f, +0.003623f, -0.005897f, -0.000048f}, - {+0.003540f, +0.034868f, +0.173761f, -0.016563f, +0.013425f, -0.007023f, -0.000066f} - }, - { - {-0.002183f, -0.153188f, +0.087452f, -0.017701f, +0.000455f, -0.000059f, -0.000031f}, - {+0.000837f, +0.194734f, -0.137795f, +0.017874f, +0.004064f, -0.001732f, +0.000005f}, - {-0.001557f, -0.009676f, +0.022334f, -0.008279f, +0.003448f, -0.001046f, +0.000008f}, - {-0.000623f, -0.079188f, -0.056711f, -0.015350f, +0.006488f, +0.001018f, +0.000189f}, - {+0.002293f, -0.003889f, +0.025529f, -0.001638f, -0.006470f, -0.003898f, -0.000154f}, - {+0.001846f, -0.009455f, -0.036884f, +0.009081f, -0.004726f, +0.003122f, +0.000129f}, - {-0.001102f, +0.135342f, +0.027798f, +0.014279f, +0.007762f, +0.000259f, +0.000211f}, - {-0.002017f, -0.058553f, -0.096374f, -0.002043f, +0.001398f, -0.003248f, +0.000161f}, - {-0.001923f, -0.019124f, -0.056759f, -0.013113f, +0.012447f, -0.007132f, -0.000136f}, - {-0.002339f, +0.011508f, +0.033382f, +0.007946f, -0.001297f, +0.003215f, +0.000190f}, - {+0.006828f, -0.026842f, +0.004072f, +0.001985f, -0.003739f, +0.003753f, -0.000089f}, - {+0.000656f, -0.067311f, -0.002677f, -0.013922f, -0.003169f, +0.000952f, +0.000271f}, - {-0.006268f, +0.106955f, +0.113991f, +0.011181f, -0.002632f, +0.003434f, -0.000563f}, - {+0.004974f, -0.010018f, +0.065905f, +0.006508f, -0.004051f, -0.007315f, -0.000366f}, - {+0.002011f, -0.084345f, -0.082409f, -0.005323f, +0.003835f, -0.005258f, +0.000564f}, - {-0.001219f, -0.090067f, -0.002658f, -0.027505f, +0.008564f, -0.005530f, +0.000179f} - }, - { - {+0.001676f, +0.080558f, -0.289199f, +0.010856f, -0.001705f, +0.001083f, +0.000061f}, - {-0.000604f, -0.113797f, +0.341125f, -0.013986f, +0.002559f, -0.000854f, +0.000034f}, - {+0.001412f, +0.004029f, -0.029843f, -0.001918f, +0.004280f, -0.001322f, +0.000062f}, - {+0.001059f, +0.017126f, -0.215757f, +0.009036f, -0.003131f, +0.007262f, +0.000030f}, - {-0.002126f, -0.010907f, +0.045035f, -0.009192f, -0.000070f, -0.009903f, +0.000020f}, - {-0.000402f, -0.017331f, -0.008068f, +0.007097f, -0.000818f, +0.000446f, +0.000032f}, - {+0.002552f, -0.019031f, +0.267246f, +0.002794f, +0.003761f, +0.007416f, -0.000074f}, - {-0.001830f, -0.057617f, -0.100520f, +0.002131f, -0.000594f, -0.002920f, -0.000253f}, - {-0.000762f, -0.011768f, -0.059922f, -0.015063f, +0.002708f, -0.001199f, -0.000329f}, - {+0.002450f, -0.031770f, +0.094689f, +0.023282f, +0.000467f, -0.004312f, +0.000416f}, - {-0.000761f, +0.034628f, -0.069799f, +0.000792f, +0.001198f, -0.000138f, +0.000078f}, - {-0.001806f, +0.008081f, -0.111324f, -0.010794f, +0.000375f, -0.004200f, +0.000039f}, - {+0.001363f, -0.031037f, +0.279729f, -0.006910f, -0.003632f, +0.002136f, +0.000578f}, - {-0.004327f, +0.034468f, +0.049016f, +0.013984f, -0.003393f, -0.015626f, -0.000281f}, - {-0.002852f, +0.006131f, -0.177457f, +0.009111f, +0.001002f, -0.000720f, -0.000233f}, - {-0.001818f, +0.009660f, -0.145990f, -0.004769f, -0.003075f, -0.000340f, +0.000041f} - }, - { - {+0.000552f, +0.069003f, -0.301992f, +0.008999f, -0.002406f, +0.001408f, -0.000044f}, - {+0.000802f, -0.083031f, +0.389256f, -0.010430f, +0.003080f, -0.000170f, -0.000017f}, - {+0.001854f, -0.004303f, -0.039738f, -0.002076f, +0.002884f, -0.001064f, -0.000029f}, - {-0.000928f, +0.080110f, -0.113738f, +0.018229f, -0.004586f, +0.006420f, -0.000168f}, - {+0.001017f, -0.018957f, +0.020512f, -0.009990f, +0.000517f, -0.008319f, +0.000130f}, - {-0.002904f, +0.018312f, +0.036890f, +0.007636f, +0.002542f, -0.000516f, -0.000078f}, - {-0.002954f, -0.060368f, +0.217523f, +0.002451f, +0.005655f, +0.004182f, -0.000317f}, - {+0.003919f, +0.063163f, +0.040871f, +0.006505f, -0.000581f, -0.000746f, +0.000040f}, - {+0.002405f, +0.015869f, -0.003557f, +0.001227f, +0.001181f, +0.003627f, +0.000263f}, - {-0.001198f, -0.012221f, +0.089063f, +0.001056f, -0.001660f, -0.007526f, -0.000479f}, - {-0.005324f, +0.011776f, -0.070950f, +0.005147f, -0.003184f, -0.000378f, +0.000142f}, - {-0.000051f, +0.028299f, -0.085723f, -0.005212f, -0.001858f, -0.007443f, -0.000157f}, - {+0.004306f, -0.142068f, +0.110900f, -0.013176f, -0.003157f, -0.002452f, +0.000049f}, - {-0.002413f, -0.017599f, -0.058088f, -0.006858f, +0.002731f, -0.002117f, +0.000497f}, - {-0.002874f, +0.105920f, -0.045074f, +0.010682f, +0.002132f, +0.002632f, -0.000206f}, - {+0.002079f, +0.058269f, -0.081409f, +0.010848f, -0.004241f, +0.001114f, -0.000140f} - }, - { - {-0.000418f, -0.142873f, +0.039874f, -0.019991f, +0.002205f, -0.000747f, -0.000005f}, - {-0.000936f, +0.189643f, -0.031282f, +0.020851f, -0.005506f, +0.005310f, -0.000013f}, - {-0.001308f, -0.006482f, -0.008509f, -0.006678f, -0.002770f, +0.003622f, -0.000135f}, - {+0.000352f, -0.070885f, +0.103936f, +0.002558f, +0.003246f, -0.000103f, +0.000099f}, - {-0.000887f, +0.045238f, -0.048190f, -0.008634f, -0.007525f, +0.000260f, -0.000172f}, - {+0.002007f, -0.012279f, +0.056322f, +0.008316f, +0.007235f, -0.004635f, +0.000040f}, - {+0.001704f, +0.071575f, -0.010837f, +0.019662f, +0.006908f, +0.000040f, +0.000304f}, - {-0.000579f, +0.012185f, +0.136975f, -0.003098f, -0.002671f, +0.000450f, +0.000120f}, - {-0.000783f, +0.012147f, +0.013944f, -0.004558f, -0.003031f, +0.006334f, +0.000232f}, - {-0.000405f, +0.033333f, +0.004358f, +0.008655f, -0.005913f, -0.003262f, -0.000314f}, - {+0.001823f, -0.042713f, -0.011527f, +0.005063f, -0.002103f, -0.001502f, -0.000065f}, - {+0.000974f, -0.024120f, +0.004097f, -0.007567f, -0.008038f, -0.004120f, -0.000156f}, - {-0.001640f, +0.093084f, -0.198061f, +0.003093f, -0.002683f, +0.001119f, -0.000406f}, - {+0.003567f, -0.007486f, -0.098988f, -0.008744f, +0.000657f, +0.004123f, -0.000005f}, - {+0.004574f, -0.078397f, +0.170549f, +0.002466f, -0.001846f, +0.002619f, +0.000132f}, - {+0.000617f, -0.007229f, +0.037692f, -0.007070f, -0.006347f, +0.005576f, -0.000078f} - }, - { - {-0.001486f, +0.056882f, +0.344270f, +0.002981f, +0.002487f, +0.000072f, +0.000054f}, - {+0.000547f, -0.073464f, -0.437965f, -0.006803f, -0.006483f, +0.002618f, +0.000013f}, - {-0.002208f, +0.014125f, +0.020584f, -0.002492f, -0.000969f, +0.003592f, +0.000109f}, - {-0.000305f, -0.016927f, +0.185175f, -0.003380f, -0.001318f, -0.002537f, +0.000023f}, - {+0.000351f, +0.029189f, -0.073389f, -0.000284f, -0.000493f, +0.005939f, +0.000055f}, - {+0.001499f, -0.034879f, +0.021228f, -0.004371f, +0.002644f, -0.004411f, +0.000007f}, - {+0.000897f, -0.046281f, -0.193165f, -0.000062f, -0.001114f, -0.004264f, +0.000213f}, - {-0.002752f, -0.051084f, +0.069214f, +0.001396f, +0.003500f, -0.000286f, -0.000111f}, - {-0.001121f, -0.015804f, -0.019775f, -0.002359f, -0.004389f, +0.000835f, -0.000349f}, - {+0.001148f, -0.019967f, -0.074378f, +0.001520f, -0.002356f, +0.007542f, +0.000708f}, - {+0.003015f, -0.000567f, +0.032040f, +0.000478f, -0.007053f, -0.003880f, -0.000168f}, - {-0.000599f, +0.031243f, +0.090853f, +0.001066f, -0.003609f, +0.001923f, +0.000219f}, - {-0.002584f, +0.058926f, -0.270418f, -0.007516f, +0.005804f, +0.009528f, +0.000212f}, - {+0.001291f, +0.042693f, -0.027401f, -0.014999f, -0.004171f, +0.003174f, -0.000358f}, - {-0.000365f, -0.070750f, +0.194323f, -0.005364f, -0.011038f, -0.002927f, +0.000039f}, - {-0.002865f, +0.017053f, +0.089613f, +0.000603f, -0.002832f, +0.006954f, +0.000143f} - }, - { - {+0.001162f, +0.086726f, +0.283216f, +0.007174f, +0.000292f, +0.001000f, -0.000057f}, - {+0.000280f, -0.113299f, -0.375196f, -0.009194f, -0.001746f, -0.000631f, -0.000011f}, - {+0.001584f, -0.002657f, +0.025271f, -0.001278f, +0.002584f, +0.000574f, +0.000151f}, - {+0.000612f, +0.053497f, +0.079626f, +0.000480f, +0.000018f, -0.003410f, -0.000053f}, - {+0.002124f, -0.011394f, -0.030926f, -0.002382f, +0.003441f, +0.005642f, +0.000133f}, - {-0.001314f, +0.010118f, -0.036750f, +0.003806f, -0.004747f, +0.000553f, -0.000052f}, - {-0.001831f, -0.043275f, -0.185257f, -0.005098f, -0.001017f, -0.000283f, -0.000498f}, - {+0.000841f, +0.040701f, -0.070294f, +0.003830f, +0.009401f, -0.002752f, +0.000077f}, - {+0.000100f, -0.008475f, -0.031005f, -0.000708f, +0.001122f, -0.005186f, -0.000069f}, - {+0.001130f, -0.030959f, -0.056257f, -0.001556f, -0.000116f, +0.010873f, +0.000014f}, - {+0.000403f, +0.010182f, +0.025332f, +0.003832f, -0.009692f, -0.002446f, +0.000086f}, - {+0.000803f, +0.016374f, +0.101303f, +0.002464f, -0.006149f, +0.004906f, +0.000224f}, - {-0.000197f, -0.109631f, -0.065418f, -0.005555f, +0.002254f, +0.006250f, +0.000073f}, - {-0.002052f, +0.011617f, +0.030519f, -0.011538f, -0.006873f, +0.002073f, +0.000080f}, - {-0.001077f, +0.085345f, +0.002855f, +0.007450f, -0.007853f, -0.001185f, +0.000097f}, - {+0.002250f, +0.036761f, +0.046050f, +0.003265f, +0.006503f, +0.000120f, +0.000142f} - }, - { - {+0.000832f, -0.158853f, -0.072678f, -0.012837f, -0.001243f, +0.000766f, +0.000001f}, - {-0.001371f, +0.196755f, +0.090338f, +0.015963f, +0.002640f, +0.000092f, +0.000018f}, - {+0.002755f, -0.004994f, +0.024145f, +0.002847f, -0.001298f, -0.004721f, -0.000196f}, - {+0.000183f, -0.068683f, -0.100662f, -0.001292f, +0.000276f, -0.003596f, +0.000038f}, - {-0.004483f, +0.020981f, +0.050436f, +0.005530f, +0.012253f, +0.005578f, -0.000204f}, - {-0.001815f, +0.002810f, -0.053671f, -0.002732f, -0.007735f, +0.004239f, +0.000035f}, - {-0.001514f, +0.072829f, -0.017583f, -0.007325f, +0.002548f, +0.007120f, +0.000100f}, - {+0.003140f, +0.020486f, -0.131828f, -0.003411f, +0.006628f, -0.002774f, -0.000011f}, - {+0.001742f, +0.019912f, -0.000260f, +0.004598f, +0.007668f, -0.001955f, +0.000329f}, - {-0.005335f, +0.019705f, +0.047513f, +0.006920f, +0.004015f, +0.005271f, -0.000701f}, - {-0.005474f, -0.005480f, +0.023623f, +0.006954f, -0.001571f, +0.004400f, +0.000139f}, - {-0.000204f, -0.046146f, +0.019690f, +0.000994f, -0.009635f, +0.000428f, -0.000413f}, - {+0.004339f, +0.007559f, +0.127446f, +0.001487f, -0.005782f, -0.002564f, -0.000124f}, - {-0.002984f, -0.018528f, +0.001355f, -0.007831f, -0.002702f, +0.004698f, +0.000223f}, - {-0.001367f, +0.031137f, -0.113810f, +0.002510f, -0.008233f, -0.002569f, -0.000155f}, - {+0.000009f, -0.026245f, -0.034477f, +0.004931f, +0.007176f, -0.005186f, -0.000238f} - }, - { - {-0.000477f, +0.058490f, -0.374545f, -0.004159f, +0.002739f, -0.001094f, +0.000053f}, - {+0.002198f, -0.090787f, +0.515343f, -0.019512f, +0.011118f, -0.002760f, -0.000006f}, - {-0.003536f, +0.014800f, +0.004465f, +0.015900f, -0.007941f, -0.004530f, -0.000120f}, - {-0.002066f, +0.010520f, -0.229451f, +0.023897f, -0.008281f, -0.000987f, -0.000047f}, - {+0.003822f, -0.045322f, +0.163451f, -0.029821f, +0.027772f, -0.003256f, +0.000066f}, - {+0.001898f, -0.027443f, -0.009605f, -0.016147f, -0.003770f, +0.003937f, +0.000066f}, - {+0.006181f, -0.053430f, +0.182900f, -0.048805f, +0.021820f, +0.000734f, +0.000402f}, - {-0.003572f, +0.004723f, -0.113184f, +0.021852f, -0.015940f, +0.005627f, -0.000124f}, - {-0.000782f, +0.015335f, +0.005219f, +0.010880f, +0.004732f, +0.003112f, -0.000067f}, - {+0.006371f, -0.061427f, +0.195453f, -0.054114f, +0.027990f, -0.010717f, +0.000260f}, - {+0.002273f, -0.021317f, +0.031278f, -0.003656f, +0.010351f, -0.000120f, -0.000050f}, - {-0.002561f, +0.012507f, -0.081773f, +0.021758f, -0.012853f, -0.001867f, -0.000061f}, - {-0.001484f, -0.021192f, +0.210492f, -0.022630f, +0.009588f, -0.011400f, +0.000044f}, - {+0.005245f, -0.017676f, -0.015155f, -0.024154f, +0.011647f, +0.000569f, -0.000003f}, - {-0.000187f, -0.011239f, -0.111629f, +0.029530f, -0.019611f, -0.001593f, -0.000139f}, - {-0.001637f, -0.009739f, -0.067653f, +0.013129f, +0.001334f, -0.008061f, -0.000131f} - }, - { - {-0.001659f, +0.077353f, -0.359886f, -0.001342f, +0.003150f, -0.002566f, -0.000035f}, - {-0.001743f, -0.095489f, +0.538290f, -0.007895f, +0.005864f, -0.004758f, -0.000015f}, - {+0.000199f, -0.021824f, -0.059806f, +0.003881f, -0.005303f, +0.002246f, +0.000274f}, - {+0.002843f, +0.025276f, -0.232757f, +0.006919f, -0.005946f, +0.005166f, +0.000025f}, - {-0.001000f, -0.042449f, +0.207087f, -0.002790f, +0.014255f, -0.008316f, +0.000140f}, - {+0.000864f, +0.019677f, +0.065963f, -0.005015f, +0.000565f, +0.000970f, -0.000100f}, - {-0.006272f, +0.011725f, +0.307474f, -0.022937f, +0.016682f, -0.012514f, -0.000292f}, - {+0.000891f, +0.038792f, -0.076724f, +0.005785f, -0.013845f, +0.007378f, +0.000127f}, - {-0.001574f, +0.009977f, -0.015642f, -0.004639f, -0.000740f, -0.000203f, -0.000226f}, - {-0.002378f, -0.068006f, +0.252407f, -0.007752f, +0.019800f, -0.013024f, +0.000522f}, - {+0.004302f, -0.060260f, -0.005996f, +0.003943f, +0.005945f, +0.002528f, -0.000155f}, - {+0.003991f, -0.015204f, -0.149872f, +0.006936f, -0.007406f, +0.005552f, +0.000438f}, - {-0.003479f, -0.031918f, +0.202480f, -0.003236f, +0.010951f, -0.010456f, +0.000030f}, - {-0.001985f, +0.025675f, +0.051263f, -0.016015f, +0.009638f, -0.007087f, -0.000243f}, - {+0.005351f, -0.015965f, -0.094735f, +0.021303f, -0.013086f, +0.009584f, +0.000288f}, - {+0.002121f, -0.032597f, -0.093402f, +0.010396f, -0.001090f, +0.000499f, +0.000356f} - }, - { - {+0.001361f, -0.127216f, -0.096953f, +0.006235f, -0.000180f, -0.000731f, -0.000024f}, - {+0.000077f, +0.185659f, +0.165622f, -0.007882f, -0.002327f, -0.000515f, +0.000009f}, - {+0.000798f, +0.001405f, -0.110977f, +0.003087f, +0.000336f, +0.002285f, +0.000037f}, - {-0.001371f, -0.069821f, -0.106352f, +0.006433f, +0.001232f, +0.002833f, +0.000059f}, - {-0.000676f, +0.076651f, +0.074758f, -0.008439f, -0.001331f, -0.000214f, -0.000188f}, - {-0.001012f, -0.000045f, +0.101569f, +0.000762f, +0.000644f, -0.001165f, -0.000031f}, - {+0.001504f, +0.068991f, +0.219465f, -0.002619f, -0.002215f, -0.004299f, -0.000189f}, - {+0.000708f, -0.054030f, +0.019772f, +0.009350f, +0.001699f, -0.000302f, +0.000084f}, - {+0.001417f, -0.007861f, -0.018247f, +0.005171f, -0.001109f, -0.001575f, +0.000109f}, - {-0.001702f, +0.108115f, +0.056674f, -0.007191f, -0.000679f, +0.001209f, -0.000390f}, - {-0.003820f, +0.028678f, -0.094978f, -0.001056f, +0.001138f, +0.002897f, +0.000028f}, - {-0.001163f, -0.013941f, -0.146232f, +0.003691f, +0.002281f, +0.002873f, -0.000110f}, - {+0.001835f, +0.058948f, +0.092899f, -0.010727f, -0.001995f, -0.000419f, -0.000068f}, - {-0.000383f, +0.011179f, +0.080862f, -0.000626f, -0.001516f, -0.003705f, -0.000018f}, - {-0.004888f, -0.032976f, -0.033844f, +0.002714f, +0.003106f, +0.003558f, +0.000045f}, - {-0.001851f, -0.003757f, -0.114020f, +0.002867f, +0.000714f, +0.003783f, +0.000001f} - }, - { - {+0.000989f, +0.092433f, +0.193494f, -0.016545f, -0.001036f, +0.000893f, +0.000031f}, - {+0.000902f, -0.141939f, -0.265388f, +0.024296f, +0.001144f, +0.001844f, +0.000003f}, - {+0.001383f, -0.000237f, -0.122476f, -0.000540f, +0.001285f, +0.001055f, -0.000304f}, - {-0.000497f, +0.058598f, +0.045853f, -0.014865f, -0.000634f, +0.000463f, -0.000091f}, - {+0.000237f, -0.057564f, -0.087896f, +0.015305f, -0.001272f, +0.001760f, +0.000039f}, - {-0.001374f, -0.003361f, +0.091147f, -0.000960f, +0.000406f, -0.001710f, +0.000148f}, - {+0.001943f, -0.066809f, +0.042081f, +0.008400f, -0.000093f, +0.002768f, +0.000282f}, - {-0.000153f, +0.028003f, +0.111273f, -0.008248f, +0.001235f, -0.003749f, -0.000175f}, - {+0.000675f, +0.002884f, -0.010918f, -0.003694f, -0.000404f, -0.000614f, +0.000132f}, - {+0.001418f, -0.072420f, -0.180948f, +0.017214f, +0.000992f, +0.005319f, -0.000293f}, - {-0.001484f, -0.001291f, -0.146812f, +0.001551f, -0.002710f, -0.000106f, +0.000206f}, - {-0.002004f, +0.023206f, -0.102482f, -0.004154f, +0.000028f, -0.001722f, -0.000309f}, - {+0.002826f, -0.051123f, -0.022162f, +0.015905f, +0.000248f, +0.005517f, +0.000008f}, - {-0.000743f, -0.005847f, +0.051339f, -0.003006f, +0.000343f, +0.000305f, +0.000318f}, - {-0.001312f, +0.033335f, +0.026403f, -0.004254f, +0.000299f, -0.002144f, -0.000310f}, - {+0.000777f, +0.010567f, -0.110591f, +0.000664f, +0.001107f, +0.002352f, -0.000367f} - }, - { - {-0.001081f, -0.033814f, +0.333833f, +0.015580f, -0.000169f, +0.001418f, +0.000020f}, - {-0.000068f, +0.051968f, -0.486920f, -0.018057f, +0.001446f, +0.002909f, +0.000020f}, - {-0.001231f, -0.003720f, -0.105259f, +0.003104f, +0.000408f, -0.000534f, +0.000068f}, - {+0.000669f, -0.025095f, +0.126683f, +0.013011f, +0.000378f, -0.001754f, +0.000001f}, - {+0.000431f, +0.024471f, -0.168776f, -0.013940f, -0.000659f, +0.001756f, +0.000118f}, - {+0.001220f, +0.006562f, +0.066045f, -0.001255f, +0.000672f, -0.001593f, -0.000055f}, - {-0.000638f, +0.032380f, -0.077154f, -0.011244f, -0.002050f, +0.006869f, +0.000080f}, - {-0.000384f, -0.003919f, +0.154252f, +0.002162f, -0.000624f, -0.004539f, -0.000060f}, - {-0.000933f, -0.004213f, -0.005919f, +0.002857f, -0.000013f, +0.001095f, -0.000087f}, - {+0.000897f, +0.024730f, -0.295271f, -0.014868f, +0.000581f, +0.004478f, +0.000366f}, - {+0.002205f, -0.007868f, -0.149414f, +0.001464f, +0.001968f, -0.002619f, -0.000072f}, - {+0.000856f, -0.018526f, -0.060893f, +0.004704f, +0.000041f, -0.005169f, +0.000105f}, - {-0.001868f, +0.025649f, -0.086705f, -0.011873f, -0.000399f, +0.008170f, +0.000137f}, - {+0.000887f, +0.002393f, +0.005593f, +0.004599f, +0.000139f, +0.003740f, -0.000067f}, - {+0.003181f, -0.002560f, +0.063703f, -0.002038f, -0.001140f, -0.005416f, +0.000026f}, - {+0.000621f, -0.004432f, -0.093619f, +0.002450f, +0.000816f, +0.000256f, +0.000136f} - }, - { - {-0.000993f, -0.001761f, +0.290470f, -0.026998f, +0.004346f, +0.001346f, -0.000039f}, - {-0.000907f, +0.008888f, -0.442379f, +0.025931f, -0.005447f, +0.002552f, -0.000039f}, - {-0.001503f, +0.012850f, -0.084634f, -0.005522f, -0.001963f, -0.000167f, +0.000255f}, - {+0.000250f, +0.003902f, +0.108970f, -0.022510f, +0.001247f, -0.002167f, +0.000089f}, - {-0.000174f, -0.001806f, -0.141803f, +0.020639f, -0.002673f, +0.000809f, -0.000112f}, - {+0.001312f, -0.013144f, +0.050638f, +0.007456f, +0.001478f, -0.001569f, -0.000104f}, - {-0.001499f, -0.008388f, -0.082956f, +0.019708f, -0.001680f, +0.005721f, -0.000262f}, - {-0.000041f, -0.001863f, +0.127396f, -0.012108f, +0.001411f, -0.002508f, +0.000239f}, - {-0.000715f, +0.006113f, -0.013908f, -0.011484f, +0.000460f, +0.001411f, -0.000095f}, - {-0.000981f, +0.002577f, -0.248744f, +0.018853f, -0.004160f, +0.002225f, +0.000118f}, - {+0.001352f, +0.005720f, -0.121014f, -0.004489f, +0.000186f, -0.003461f, -0.000201f}, - {+0.001794f, +0.007883f, -0.040311f, -0.006885f, -0.000317f, -0.004274f, +0.000273f}, - {-0.002392f, -0.002476f, -0.074256f, +0.022144f, -0.001551f, +0.006133f, -0.000150f}, - {+0.001088f, -0.008842f, -0.006752f, +0.003464f, -0.000302f, +0.002836f, -0.000315f}, - {+0.001092f, -0.012713f, +0.072873f, +0.008050f, +0.000423f, -0.003892f, +0.000312f}, - {-0.000911f, +0.006864f, -0.069290f, -0.001134f, -0.000822f, +0.000026f, +0.000265f} - } -}; - -#endif - -#ifdef UPDATE_SBA_FILTER const float FASTCONV_HOA3_latency_s = 0.000666667f; const float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= @@ -7294,9 +3673,7 @@ const float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][16][BINAURAL_NTAPS]= } }; -#endif -#ifdef UPDATE_SBA_FILTER const float FASTCONV_HOA2_latency_s = 0.000666667f; const float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= @@ -9515,9 +5892,7 @@ const float rightHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]= } }; -#endif -#ifdef UPDATE_SBA_FILTER const float FASTCONV_FOA_latency_s = 0.000666667f; const float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= @@ -10736,7 +7111,6 @@ const float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]= } }; -#endif const float FASTCONV_HRIR_latency_s = 0.000666667f; const float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]= diff --git a/lib_rend/ivas_rom_binauralRenderer.h b/lib_rend/ivas_rom_binauralRenderer.h index 26aae29319..0cf8e35a6d 100644 --- a/lib_rend/ivas_rom_binauralRenderer.h +++ b/lib_rend/ivas_rom_binauralRenderer.h @@ -48,7 +48,6 @@ extern float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NT extern float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; extern float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; extern float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; -#ifdef UPDATE_SBA_FILTER extern float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; extern float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; extern float rightHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; @@ -57,7 +56,6 @@ extern float leftHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; extern float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; extern float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; extern float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; -#endif extern float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; extern float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; @@ -65,10 +63,8 @@ extern float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS] extern float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; extern float FASTCONV_HOA3_latency_s; -#ifdef UPDATE_SBA_FILTER extern float FASTCONV_HOA2_latency_s; extern float FASTCONV_FOA_latency_s; -#endif extern float hrtfShCoeffsRe[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; extern float hrtfShCoeffsIm[BINAURAL_CHANNELS][HRTF_SH_CHANNELS][HRTF_NUM_BINS]; diff --git a/lib_rend/ivas_rom_binaural_crend_head.c b/lib_rend/ivas_rom_binaural_crend_head.c index 7717703666..b313ffa534 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.c +++ b/lib_rend/ivas_rom_binaural_crend_head.c @@ -42,13 +42,7 @@ -#ifndef UPDATE_SBA_FILTER -#include -#endif #include -#ifndef UPDATE_SBA_FILTER -#include "cnst.h" -#endif #include "ivas_cnst.h" /* clang-format off */ @@ -59,11 +53,7 @@ /********************** CRendBin_Combined_HRIR **********************/ -#ifdef UPDATE_SBA_FILTER const float CRendBin_Combined_HRIR_latency_s = 0.000020834f; -#else -const float CRendBin_Combined_HRIR_latency_s = 0.000020833333110f; -#endif /* Sample Rate = 48000 */ @@ -653,972 +643,12 @@ const float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]={ const float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#ifndef UPDATE_SBA_FILTER -/********************** CRendBin_HOA3_HRIR **********************/ - -#ifdef UPDATE_SBA_FILTER -const float CRendBin_HOA3_HRIR_latency_s = 0.001333334f; -#else -const float CRendBin_HOA3_HRIR_latency_s = 0.001333333319053f; -#endif - -/* Sample Rate = 48000 */ - -const int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz = 2; -const uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]={{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2} }; -const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS] = {0, 0}; -const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][2]={{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}},{{240, 240},{240, 240}}}; -const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz = 0; -const float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; -const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][480]={ - { - {-0.007743f, -0.007558f, -0.007195f, -0.006666f, -0.005988f, -0.005184f, -0.004281f, -0.003308f, -0.002297f, -0.001282f, -0.000295f, 0.000632f, 0.001470f, 0.002193f, 0.002779f, 0.003212f, 0.003480f, 0.003577f, 0.003506f, 0.003272f, 0.002887f, 0.002371f, 0.001744f, 0.001033f, 0.000266f, -0.000524f, -0.001308f, -0.002054f, -0.002731f, -0.003314f, -0.003778f, -0.004105f, -0.004278f, -0.004290f, -0.004136f, -0.003818f, -0.003346f, -0.002730f, -0.001990f, -0.001147f, -0.000226f, 0.000744f, 0.001734f, 0.002716f, 0.003658f, 0.004535f, 0.005321f, 0.005993f, 0.006535f, 0.006932f, 0.007177f, 0.007266f, 0.007200f, 0.006986f, 0.006636f, 0.006164f, 0.005590f, 0.004934f, 0.004220f, 0.003472f, 0.002715f, 0.001972f, 0.001265f, 0.000614f, 0.000036f, -0.000456f, -0.000852f, -0.001146f, -0.001339f, -0.001431f, -0.001430f, -0.001345f, -0.001189f, -0.000977f, -0.000725f, -0.000450f, -0.000171f, 0.000097f, 0.000338f, 0.000538f, 0.000686f, 0.000774f, 0.000798f, 0.000755f, 0.000647f, 0.000478f, 0.000258f, -0.000005f, -0.000297f, -0.000604f, -0.000913f, -0.001206f, -0.001471f, -0.001692f, -0.001859f, -0.001960f, - -0.001990f, -0.001944f, -0.001821f, -0.001623f, -0.001356f, -0.001028f, -0.000650f, -0.000236f, 0.000198f, 0.000637f, 0.001062f, 0.001458f, 0.001807f, 0.002094f, 0.002307f, 0.002436f, 0.002471f, 0.002410f, 0.002250f, 0.001996f, 0.001651f, 0.001227f, 0.000734f, 0.000187f, -0.000397f, -0.001000f, -0.001604f, -0.002189f, -0.002738f, -0.003233f, -0.003660f, -0.004005f, -0.004258f, -0.004412f, -0.004464f, -0.004414f, -0.004263f, -0.004019f, -0.003691f, -0.003290f, -0.002831f, -0.002328f, -0.001799f, -0.001260f, -0.000729f, -0.000219f, 0.000253f, 0.000676f, 0.001039f, 0.001336f, 0.001560f, 0.001710f, 0.001787f, 0.001795f, 0.001740f, 0.001631f, 0.001477f, 0.001291f, 0.001084f, 0.000869f, 0.000659f, 0.000464f, 0.000294f, 0.000159f, 0.000065f, 0.000015f, 0.000012f, 0.000054f, 0.000139f, 0.000261f, 0.000413f, 0.000585f, 0.000768f, 0.000951f, 0.001122f, 0.001271f, 0.001387f, 0.001462f, 0.001487f, 0.001458f, 0.001371f, 0.001226f, 0.001024f, 0.000770f, 0.000469f, 0.000130f, -0.000237f, -0.000619f, -0.001004f, -0.001379f, -0.001731f, -0.002048f, -0.002318f, -0.002532f, -0.002681f, -0.002760f, - -0.002766f, -0.002698f, -0.002559f, -0.002353f, -0.002087f, -0.001772f, -0.001418f, -0.001038f, -0.000646f, -0.000256f, 0.000117f, 0.000461f, 0.000764f, 0.001013f, 0.001202f, 0.001322f, 0.001371f, 0.001348f, 0.001254f, 0.001093f, 0.000873f, 0.000602f, 0.000291f, -0.000048f, -0.000400f, -0.000753f, -0.001092f, -0.001406f, -0.001680f, -0.001907f, -0.002076f, -0.002182f, -0.002222f, -0.002195f, -0.002102f, -0.001947f, -0.001739f, -0.001485f, -0.001196f, -0.000885f, -0.000563f, -0.000245f, 0.000056f, 0.000329f, 0.000561f, 0.000745f, 0.000871f, 0.000936f, 0.874744f, 0.116038f, -0.662441f, -0.827243f, -0.402995f, 0.289219f, 0.777716f, 0.685468f, 0.185590f, -0.493054f, -0.845543f, -0.701112f, -0.169822f, 0.554816f, 0.803711f, 0.562077f, -0.069675f, -0.622495f, -0.781014f, -0.389092f, 0.215356f, 0.699522f, 0.690218f, 0.204725f, -0.389698f, -0.710518f, -0.532733f, -0.008668f, 0.516164f, 0.684794f, 0.399502f, -0.157365f, -0.611437f, -0.649130f, -0.248718f, 0.314094f, 0.667438f, 0.566124f, 0.102008f, -0.423539f, -0.611442f, -0.605219f, -0.119896f, 0.439049f, 0.716128f, 0.472981f, -0.083944f, -0.590980f, - -0.676140f, -0.304134f, 0.279336f, 0.670561f, 0.602354f, 0.111260f, -0.451186f, -0.697564f, -0.455095f, 0.073426f, 0.529809f, 0.615436f, 0.268620f, -0.258841f, -0.598350f, -0.541586f, -0.093143f, 0.452635f, 0.668540f, 0.437278f, -0.106588f, -0.567294f, -0.653630f, -0.294182f, 0.267007f, 0.638346f, 0.582978f, 0.123374f, -0.429176f, -0.700189f, -0.473598f, 0.049201f, 0.530224f, 0.600061f, 0.268114f, -0.222115f, -0.603516f, -0.549236f, -0.121190f, 0.409789f, 0.654206f, 0.450342f, -0.058339f, -0.539424f, -0.638139f, -0.303548f, 0.210202f, 0.613552f, 0.586286f, 0.181245f, -0.311242f, -0.603267f, -0.500979f, -0.070766f, 0.392784f, 0.575899f, 0.388449f, -0.079622f, -0.471543f, -0.550515f, -0.252483f, 0.225112f, 0.560233f, 0.501195f, 0.088979f, -0.389568f, -0.616564f, -0.388516f, 0.087457f, 0.516491f, 0.603478f, 0.270287f, -0.264257f, -0.628381f, -0.544418f, -0.085427f, 0.417717f, 0.625695f, 0.396777f, -0.104381f, -0.518951f, -0.566067f, -0.223737f, 0.251795f, 0.549033f, 0.465643f, 0.054492f, -0.371032f, -0.544392f, -0.348233f, 0.081606f, 0.465192f, 0.525950f, 0.228049f, -0.225864f, -0.513316f, - -0.444995f, -0.072351f, 0.338365f, 0.508348f, 0.313193f, -0.092672f, -0.444725f, -0.474146f, -0.170556f, 0.255870f, 0.483517f, 0.367405f, -0.019046f, -0.360357f, -0.458396f, -0.219427f, 0.183072f, 0.464582f, 0.399087f, 0.054445f, -0.355513f, -0.503123f, -0.266677f, 0.157341f, 0.472099f, 0.437246f, 0.064651f, -0.376213f, -0.543538f, -0.285626f, 0.200362f, 0.539895f, 0.464228f, 0.014684f, -0.447591f, -0.531674f, -0.222697f, 0.271333f, 0.544990f, 0.362913f, -0.136141f, -0.527405f, -0.465809f, 0.013651f, 0.482914f, 0.505125f, 0.046413f, -0.453673f, -0.499113f, -0.044012f, 0.432176f, 0.428347f, -0.038277f, -0.425444f, -0.285800f, 0.182464f, 0.345587f, -0.006216f, -0.239016f, -0.030037f, 0.092603f, 0.007249f, -0.019244f, -0.003579f, -0.000623f, -0.001458f, -0.001441f, -0.001327f, -0.002820f, -0.002466f, -0.001718f, -0.002159f, -0.001581f, -0.001010f, -0.001896f, -0.001492f, -0.002548f, -0.001642f, -0.001386f, -0.001124f, -0.000852f, -0.002251f, -0.001420f, -0.000767f, -0.002070f, -0.002048f, -0.001322f, -0.001390f, -0.001647f, -0.001369f, -0.002590f, -0.001041f, -0.001429f, -0.001899f, -0.000935f, -0.002037f}, - {-0.007743f, -0.007558f, -0.007195f, -0.006666f, -0.005988f, -0.005184f, -0.004281f, -0.003308f, -0.002297f, -0.001282f, -0.000295f, 0.000632f, 0.001470f, 0.002193f, 0.002779f, 0.003212f, 0.003480f, 0.003577f, 0.003506f, 0.003272f, 0.002887f, 0.002371f, 0.001744f, 0.001033f, 0.000266f, -0.000524f, -0.001308f, -0.002054f, -0.002731f, -0.003314f, -0.003778f, -0.004105f, -0.004278f, -0.004290f, -0.004136f, -0.003818f, -0.003346f, -0.002730f, -0.001990f, -0.001147f, -0.000226f, 0.000744f, 0.001734f, 0.002716f, 0.003658f, 0.004535f, 0.005321f, 0.005993f, 0.006535f, 0.006932f, 0.007177f, 0.007266f, 0.007200f, 0.006986f, 0.006636f, 0.006164f, 0.005590f, 0.004934f, 0.004220f, 0.003472f, 0.002715f, 0.001972f, 0.001265f, 0.000614f, 0.000036f, -0.000456f, -0.000852f, -0.001146f, -0.001339f, -0.001431f, -0.001430f, -0.001345f, -0.001189f, -0.000977f, -0.000725f, -0.000450f, -0.000171f, 0.000097f, 0.000338f, 0.000538f, 0.000686f, 0.000774f, 0.000798f, 0.000755f, 0.000647f, 0.000478f, 0.000258f, -0.000005f, -0.000297f, -0.000604f, -0.000913f, -0.001206f, -0.001471f, -0.001692f, -0.001859f, -0.001960f, - -0.001990f, -0.001944f, -0.001821f, -0.001623f, -0.001356f, -0.001028f, -0.000650f, -0.000236f, 0.000198f, 0.000637f, 0.001062f, 0.001458f, 0.001807f, 0.002094f, 0.002307f, 0.002436f, 0.002471f, 0.002410f, 0.002250f, 0.001996f, 0.001651f, 0.001227f, 0.000734f, 0.000187f, -0.000397f, -0.001000f, -0.001604f, -0.002189f, -0.002738f, -0.003233f, -0.003660f, -0.004005f, -0.004258f, -0.004412f, -0.004464f, -0.004414f, -0.004263f, -0.004019f, -0.003691f, -0.003290f, -0.002831f, -0.002328f, -0.001799f, -0.001260f, -0.000729f, -0.000219f, 0.000253f, 0.000676f, 0.001039f, 0.001336f, 0.001560f, 0.001710f, 0.001787f, 0.001795f, 0.001740f, 0.001631f, 0.001477f, 0.001291f, 0.001084f, 0.000869f, 0.000659f, 0.000464f, 0.000294f, 0.000159f, 0.000065f, 0.000015f, 0.000012f, 0.000054f, 0.000139f, 0.000261f, 0.000413f, 0.000585f, 0.000768f, 0.000951f, 0.001122f, 0.001271f, 0.001387f, 0.001462f, 0.001487f, 0.001458f, 0.001371f, 0.001226f, 0.001024f, 0.000770f, 0.000469f, 0.000130f, -0.000237f, -0.000619f, -0.001004f, -0.001379f, -0.001731f, -0.002048f, -0.002318f, -0.002532f, -0.002681f, -0.002760f, - -0.002766f, -0.002698f, -0.002559f, -0.002353f, -0.002087f, -0.001772f, -0.001418f, -0.001038f, -0.000646f, -0.000256f, 0.000117f, 0.000461f, 0.000764f, 0.001013f, 0.001202f, 0.001322f, 0.001371f, 0.001348f, 0.001254f, 0.001093f, 0.000873f, 0.000602f, 0.000291f, -0.000048f, -0.000400f, -0.000753f, -0.001092f, -0.001406f, -0.001680f, -0.001907f, -0.002076f, -0.002182f, -0.002222f, -0.002195f, -0.002102f, -0.001947f, -0.001739f, -0.001485f, -0.001196f, -0.000885f, -0.000563f, -0.000245f, 0.000056f, 0.000329f, 0.000561f, 0.000745f, 0.000871f, 0.000936f, 0.874744f, 0.116038f, -0.662441f, -0.827243f, -0.402995f, 0.289219f, 0.777716f, 0.685468f, 0.185590f, -0.493054f, -0.845543f, -0.701112f, -0.169822f, 0.554816f, 0.803711f, 0.562077f, -0.069675f, -0.622495f, -0.781014f, -0.389092f, 0.215356f, 0.699522f, 0.690218f, 0.204725f, -0.389698f, -0.710518f, -0.532733f, -0.008668f, 0.516164f, 0.684794f, 0.399502f, -0.157365f, -0.611437f, -0.649130f, -0.248718f, 0.314094f, 0.667438f, 0.566124f, 0.102008f, -0.423539f, -0.611442f, -0.605219f, -0.119896f, 0.439049f, 0.716128f, 0.472981f, -0.083944f, -0.590980f, - -0.676140f, -0.304134f, 0.279336f, 0.670561f, 0.602354f, 0.111260f, -0.451186f, -0.697564f, -0.455095f, 0.073426f, 0.529809f, 0.615436f, 0.268620f, -0.258841f, -0.598350f, -0.541586f, -0.093143f, 0.452635f, 0.668540f, 0.437278f, -0.106588f, -0.567294f, -0.653630f, -0.294182f, 0.267007f, 0.638346f, 0.582978f, 0.123374f, -0.429176f, -0.700189f, -0.473598f, 0.049201f, 0.530224f, 0.600061f, 0.268114f, -0.222115f, -0.603516f, -0.549236f, -0.121190f, 0.409789f, 0.654206f, 0.450342f, -0.058339f, -0.539424f, -0.638139f, -0.303548f, 0.210202f, 0.613552f, 0.586286f, 0.181245f, -0.311242f, -0.603267f, -0.500979f, -0.070766f, 0.392784f, 0.575899f, 0.388449f, -0.079622f, -0.471543f, -0.550515f, -0.252483f, 0.225112f, 0.560233f, 0.501195f, 0.088979f, -0.389568f, -0.616564f, -0.388516f, 0.087457f, 0.516491f, 0.603478f, 0.270287f, -0.264257f, -0.628381f, -0.544418f, -0.085427f, 0.417717f, 0.625695f, 0.396777f, -0.104381f, -0.518951f, -0.566067f, -0.223737f, 0.251795f, 0.549033f, 0.465643f, 0.054492f, -0.371032f, -0.544392f, -0.348233f, 0.081606f, 0.465192f, 0.525950f, 0.228049f, -0.225864f, -0.513316f, - -0.444995f, -0.072351f, 0.338365f, 0.508348f, 0.313193f, -0.092672f, -0.444725f, -0.474146f, -0.170556f, 0.255870f, 0.483517f, 0.367405f, -0.019046f, -0.360357f, -0.458396f, -0.219427f, 0.183072f, 0.464582f, 0.399087f, 0.054445f, -0.355513f, -0.503123f, -0.266677f, 0.157341f, 0.472099f, 0.437246f, 0.064651f, -0.376213f, -0.543538f, -0.285626f, 0.200362f, 0.539895f, 0.464228f, 0.014684f, -0.447591f, -0.531674f, -0.222697f, 0.271333f, 0.544990f, 0.362913f, -0.136141f, -0.527405f, -0.465809f, 0.013651f, 0.482914f, 0.505125f, 0.046413f, -0.453673f, -0.499113f, -0.044012f, 0.432176f, 0.428347f, -0.038277f, -0.425444f, -0.285800f, 0.182464f, 0.345587f, -0.006216f, -0.239016f, -0.030037f, 0.092603f, 0.007249f, -0.019244f, -0.003579f, -0.000623f, -0.001458f, -0.001441f, -0.001327f, -0.002820f, -0.002466f, -0.001718f, -0.002159f, -0.001581f, -0.001010f, -0.001896f, -0.001492f, -0.002548f, -0.001642f, -0.001386f, -0.001124f, -0.000852f, -0.002251f, -0.001420f, -0.000767f, -0.002070f, -0.002048f, -0.001322f, -0.001390f, -0.001647f, -0.001369f, -0.002590f, -0.001041f, -0.001429f, -0.001899f, -0.000935f, -0.002037f} - }, - { - {-0.000037f, -0.000125f, -0.000295f, -0.000533f, -0.000818f, -0.001126f, -0.001426f, -0.001686f, -0.001873f, -0.001953f, -0.001893f, -0.001665f, -0.001246f, -0.000616f, 0.000234f, 0.001309f, 0.002601f, 0.004098f, 0.005777f, 0.007606f, 0.009548f, 0.011558f, 0.013587f, 0.015580f, 0.017483f, 0.019242f, 0.020802f, 0.022115f, 0.023135f, 0.023826f, 0.024158f, 0.024112f, 0.023679f, 0.022860f, 0.021667f, 0.020125f, 0.018265f, 0.016132f, 0.013774f, 0.011251f, 0.008623f, 0.005956f, 0.003315f, 0.000767f, -0.001627f, -0.003810f, -0.005730f, -0.007346f, -0.008623f, -0.009538f, -0.010079f, -0.010244f, -0.010044f, -0.009498f, -0.008635f, -0.007496f, -0.006125f, -0.004574f, -0.002898f, -0.001155f, 0.000596f, 0.002300f, 0.003903f, 0.005356f, 0.006618f, 0.007653f, 0.008436f, 0.008949f, 0.009183f, 0.009140f, 0.008829f, 0.008268f, 0.007483f, 0.006506f, 0.005372f, 0.004123f, 0.002800f, 0.001448f, 0.000107f, -0.001182f, -0.002383f, -0.003463f, -0.004396f, -0.005161f, -0.005746f, -0.006142f, -0.006349f, -0.006372f, -0.006224f, -0.005920f, -0.005481f, -0.004930f, -0.004295f, -0.003601f, -0.002875f, -0.002144f, - -0.001432f, -0.000759f, -0.000144f, 0.000400f, 0.000863f, 0.001239f, 0.001527f, 0.001729f, 0.001852f, 0.001905f, 0.001897f, 0.001844f, 0.001757f, 0.001651f, 0.001538f, 0.001430f, 0.001336f, 0.001264f, 0.001219f, 0.001201f, 0.001209f, 0.001240f, 0.001287f, 0.001341f, 0.001392f, 0.001429f, 0.001440f, 0.001414f, 0.001341f, 0.001213f, 0.001024f, 0.000769f, 0.000449f, 0.000067f, -0.000372f, -0.000859f, -0.001380f, -0.001922f, -0.002467f, -0.002996f, -0.003492f, -0.003934f, -0.004305f, -0.004588f, -0.004769f, -0.004837f, -0.004783f, -0.004606f, -0.004304f, -0.003885f, -0.003356f, -0.002733f, -0.002032f, -0.001275f, -0.000484f, 0.000315f, 0.001096f, 0.001834f, 0.002503f, 0.003081f, 0.003548f, 0.003887f, 0.004087f, 0.004138f, 0.004040f, 0.003796f, 0.003412f, 0.002903f, 0.002285f, 0.001582f, 0.000816f, 0.000016f, -0.000791f, -0.001574f, -0.002307f, -0.002963f, -0.003518f, -0.003951f, -0.004247f, -0.004395f, -0.004389f, -0.004228f, -0.003918f, -0.003469f, -0.002898f, -0.002223f, -0.001468f, -0.000659f, 0.000175f, 0.001005f, 0.001803f, 0.002542f, 0.003197f, 0.003745f, 0.004170f, 0.004457f, - 0.004599f, 0.004593f, 0.004441f, 0.004153f, 0.003740f, 0.003220f, 0.002614f, 0.001946f, 0.001242f, 0.000529f, -0.000165f, -0.000816f, -0.001399f, -0.001893f, -0.002282f, -0.002551f, -0.002692f, -0.002704f, -0.002586f, -0.002347f, -0.001998f, -0.001555f, -0.001036f, -0.000465f, 0.000136f, 0.000741f, 0.001325f, 0.001865f, 0.002340f, 0.002729f, 0.003019f, 0.003197f, 0.003258f, 0.003199f, 0.003023f, 0.002738f, 0.002356f, 0.001893f, 0.001368f, 0.000803f, 0.000221f, -0.000355f, -0.000900f, -0.001394f, -0.001815f, -0.002146f, -0.002375f, -0.002492f, 0.102067f, 0.340374f, 0.253576f, -0.392824f, -0.863480f, -0.541285f, 0.348747f, 0.908338f, 0.675127f, 0.029763f, -0.332153f, -0.699319f, -0.237615f, 0.263874f, 0.599313f, 0.464551f, 0.108943f, -0.429287f, -0.590275f, -0.410124f, 0.075999f, 0.451859f, 0.602381f, 0.261955f, -0.272532f, -0.611835f, -0.494864f, -0.123053f, 0.374729f, 0.621529f, 0.458242f, 0.034874f, -0.487088f, -0.663934f, -0.416264f, 0.141788f, 0.610468f, 0.748296f, 0.313634f, -0.331232f, -0.814857f, -0.565392f, 0.019484f, 0.617619f, 0.797305f, 0.434767f, -0.248637f, -0.751056f, - -0.724588f, -0.188109f, 0.430504f, 0.771733f, 0.576749f, 0.008453f, -0.604160f, -0.760334f, -0.426276f, 0.190034f, 0.626999f, 0.665805f, 0.215852f, -0.370023f, -0.714810f, -0.578496f, -0.065875f, 0.452677f, 0.808784f, 0.610411f, -0.009182f, -0.639069f, -0.817950f, -0.473376f, 0.228548f, 0.746920f, 0.794849f, 0.274199f, -0.440060f, -0.846523f, -0.713642f, -0.056773f, 0.601525f, 0.786555f, 0.464751f, -0.138588f, -0.713334f, -0.747887f, -0.263577f, 0.412564f, 0.819784f, 0.649608f, 0.052727f, -0.553307f, -0.819208f, -0.502275f, 0.100429f, 0.679034f, 0.756242f, 0.347214f, -0.301781f, -0.727920f, -0.654618f, -0.125292f, 0.484910f, 0.738531f, 0.520485f, -0.083904f, -0.617421f, -0.729817f, -0.287874f, 0.330201f, 0.740371f, 0.602818f, 0.067640f, -0.527236f, -0.755411f, -0.426334f, 0.208118f, 0.688928f, 0.733810f, 0.282400f, -0.391717f, -0.764435f, -0.614978f, -0.059433f, 0.532077f, 0.757324f, 0.440711f, -0.155543f, -0.625442f, -0.635152f, -0.221708f, 0.327142f, 0.664040f, 0.523697f, 0.026158f, -0.479470f, -0.651830f, -0.387733f, 0.140806f, 0.584307f, 0.618295f, 0.236836f, -0.300408f, -0.633192f, - -0.514642f, -0.027482f, 0.456828f, 0.622653f, 0.365466f, -0.159245f, -0.572755f, -0.570376f, -0.176307f, 0.353824f, 0.612098f, 0.441220f, -0.055421f, -0.467380f, -0.571616f, -0.254627f, 0.252806f, 0.617633f, 0.502197f, 0.048927f, -0.469973f, -0.648555f, -0.325167f, 0.222546f, 0.618981f, 0.552694f, 0.073944f, -0.489228f, -0.693035f, -0.373494f, 0.256126f, 0.688764f, 0.589141f, 0.010161f, -0.569339f, -0.768008f, -0.278704f, 0.453206f, 0.830687f, 0.518906f, -0.222511f, -0.778247f, -0.654275f, 0.052124f, 0.715401f, 0.722228f, 0.066974f, -0.638539f, -0.706863f, -0.078273f, 0.610052f, 0.635849f, -0.009045f, -0.598320f, -0.447012f, 0.239234f, 0.532691f, 0.030543f, -0.354172f, -0.057609f, 0.147463f, 0.024064f, -0.022992f, -0.000013f, 0.004885f, 0.003122f, 0.002322f, 0.001677f, 0.002744f, 0.004802f, 0.004419f, 0.003188f, 0.002682f, 0.001137f, 0.001908f, 0.002869f, 0.003807f, 0.001619f, 0.002752f, 0.001867f, 0.003558f, 0.003116f, 0.000532f, 0.003231f, 0.001722f, 0.002239f, 0.004198f, 0.001317f, 0.004158f, 0.002167f, 0.003823f, 0.002629f, 0.002598f, 0.003009f, 0.002802f, 0.005357f}, - {0.000037f, 0.000125f, 0.000295f, 0.000533f, 0.000818f, 0.001126f, 0.001426f, 0.001686f, 0.001873f, 0.001953f, 0.001893f, 0.001665f, 0.001246f, 0.000616f, -0.000234f, -0.001309f, -0.002601f, -0.004098f, -0.005777f, -0.007606f, -0.009548f, -0.011558f, -0.013587f, -0.015580f, -0.017483f, -0.019242f, -0.020802f, -0.022115f, -0.023135f, -0.023826f, -0.024158f, -0.024112f, -0.023679f, -0.022860f, -0.021667f, -0.020125f, -0.018265f, -0.016132f, -0.013774f, -0.011251f, -0.008623f, -0.005956f, -0.003315f, -0.000767f, 0.001627f, 0.003810f, 0.005730f, 0.007346f, 0.008623f, 0.009538f, 0.010079f, 0.010244f, 0.010044f, 0.009498f, 0.008635f, 0.007496f, 0.006125f, 0.004574f, 0.002898f, 0.001155f, -0.000596f, -0.002300f, -0.003903f, -0.005356f, -0.006618f, -0.007653f, -0.008436f, -0.008949f, -0.009183f, -0.009140f, -0.008829f, -0.008268f, -0.007483f, -0.006506f, -0.005372f, -0.004123f, -0.002800f, -0.001448f, -0.000107f, 0.001182f, 0.002383f, 0.003463f, 0.004396f, 0.005161f, 0.005746f, 0.006142f, 0.006349f, 0.006372f, 0.006224f, 0.005920f, 0.005481f, 0.004930f, 0.004295f, 0.003601f, 0.002875f, 0.002144f, - 0.001432f, 0.000759f, 0.000144f, -0.000400f, -0.000863f, -0.001239f, -0.001527f, -0.001729f, -0.001852f, -0.001905f, -0.001897f, -0.001844f, -0.001757f, -0.001651f, -0.001538f, -0.001430f, -0.001336f, -0.001264f, -0.001219f, -0.001201f, -0.001209f, -0.001240f, -0.001287f, -0.001341f, -0.001392f, -0.001429f, -0.001440f, -0.001414f, -0.001341f, -0.001213f, -0.001024f, -0.000769f, -0.000449f, -0.000067f, 0.000372f, 0.000859f, 0.001380f, 0.001922f, 0.002467f, 0.002996f, 0.003492f, 0.003934f, 0.004305f, 0.004588f, 0.004769f, 0.004837f, 0.004783f, 0.004606f, 0.004304f, 0.003885f, 0.003356f, 0.002733f, 0.002032f, 0.001275f, 0.000484f, -0.000315f, -0.001096f, -0.001834f, -0.002503f, -0.003081f, -0.003548f, -0.003887f, -0.004087f, -0.004138f, -0.004040f, -0.003796f, -0.003412f, -0.002903f, -0.002285f, -0.001582f, -0.000816f, -0.000016f, 0.000791f, 0.001574f, 0.002307f, 0.002963f, 0.003518f, 0.003951f, 0.004247f, 0.004395f, 0.004389f, 0.004228f, 0.003918f, 0.003469f, 0.002898f, 0.002223f, 0.001468f, 0.000659f, -0.000175f, -0.001005f, -0.001803f, -0.002542f, -0.003197f, -0.003745f, -0.004170f, -0.004457f, - -0.004599f, -0.004593f, -0.004441f, -0.004153f, -0.003740f, -0.003220f, -0.002614f, -0.001946f, -0.001242f, -0.000529f, 0.000165f, 0.000816f, 0.001399f, 0.001893f, 0.002282f, 0.002551f, 0.002692f, 0.002704f, 0.002586f, 0.002347f, 0.001998f, 0.001555f, 0.001036f, 0.000465f, -0.000136f, -0.000741f, -0.001325f, -0.001865f, -0.002340f, -0.002729f, -0.003019f, -0.003197f, -0.003258f, -0.003199f, -0.003023f, -0.002738f, -0.002356f, -0.001893f, -0.001368f, -0.000803f, -0.000221f, 0.000355f, 0.000900f, 0.001394f, 0.001815f, 0.002146f, 0.002375f, 0.002492f, -0.102067f, -0.340374f, -0.253576f, 0.392824f, 0.863480f, 0.541285f, -0.348747f, -0.908338f, -0.675127f, -0.029763f, 0.332153f, 0.699319f, 0.237615f, -0.263874f, -0.599313f, -0.464551f, -0.108943f, 0.429287f, 0.590275f, 0.410124f, -0.075999f, -0.451859f, -0.602381f, -0.261955f, 0.272532f, 0.611835f, 0.494864f, 0.123053f, -0.374729f, -0.621529f, -0.458242f, -0.034874f, 0.487088f, 0.663934f, 0.416264f, -0.141788f, -0.610468f, -0.748296f, -0.313634f, 0.331232f, 0.814857f, 0.565392f, -0.019484f, -0.617619f, -0.797305f, -0.434767f, 0.248637f, 0.751056f, - 0.724588f, 0.188109f, -0.430504f, -0.771733f, -0.576749f, -0.008453f, 0.604160f, 0.760334f, 0.426276f, -0.190034f, -0.626999f, -0.665805f, -0.215852f, 0.370023f, 0.714810f, 0.578496f, 0.065875f, -0.452677f, -0.808784f, -0.610411f, 0.009182f, 0.639069f, 0.817950f, 0.473376f, -0.228548f, -0.746920f, -0.794849f, -0.274199f, 0.440060f, 0.846523f, 0.713642f, 0.056773f, -0.601525f, -0.786555f, -0.464751f, 0.138588f, 0.713334f, 0.747887f, 0.263577f, -0.412564f, -0.819784f, -0.649608f, -0.052727f, 0.553307f, 0.819208f, 0.502275f, -0.100429f, -0.679034f, -0.756242f, -0.347214f, 0.301781f, 0.727920f, 0.654618f, 0.125292f, -0.484910f, -0.738531f, -0.520485f, 0.083904f, 0.617421f, 0.729817f, 0.287874f, -0.330201f, -0.740371f, -0.602818f, -0.067640f, 0.527236f, 0.755411f, 0.426334f, -0.208118f, -0.688928f, -0.733810f, -0.282400f, 0.391717f, 0.764435f, 0.614978f, 0.059433f, -0.532077f, -0.757324f, -0.440711f, 0.155543f, 0.625442f, 0.635152f, 0.221708f, -0.327142f, -0.664040f, -0.523697f, -0.026158f, 0.479470f, 0.651830f, 0.387733f, -0.140806f, -0.584307f, -0.618295f, -0.236836f, 0.300408f, 0.633192f, - 0.514642f, 0.027482f, -0.456828f, -0.622653f, -0.365466f, 0.159245f, 0.572755f, 0.570376f, 0.176307f, -0.353824f, -0.612098f, -0.441220f, 0.055421f, 0.467380f, 0.571616f, 0.254627f, -0.252806f, -0.617633f, -0.502197f, -0.048927f, 0.469973f, 0.648555f, 0.325167f, -0.222546f, -0.618981f, -0.552694f, -0.073944f, 0.489228f, 0.693035f, 0.373494f, -0.256126f, -0.688764f, -0.589141f, -0.010161f, 0.569339f, 0.768008f, 0.278704f, -0.453206f, -0.830687f, -0.518906f, 0.222511f, 0.778247f, 0.654275f, -0.052124f, -0.715401f, -0.722228f, -0.066974f, 0.638539f, 0.706863f, 0.078273f, -0.610052f, -0.635849f, 0.009045f, 0.598320f, 0.447012f, -0.239234f, -0.532691f, -0.030543f, 0.354172f, 0.057609f, -0.147463f, -0.024064f, 0.022992f, 0.000013f, -0.004885f, -0.003122f, -0.002322f, -0.001677f, -0.002744f, -0.004802f, -0.004419f, -0.003188f, -0.002682f, -0.001137f, -0.001908f, -0.002869f, -0.003807f, -0.001619f, -0.002752f, -0.001867f, -0.003558f, -0.003116f, -0.000532f, -0.003231f, -0.001722f, -0.002239f, -0.004198f, -0.001317f, -0.004158f, -0.002167f, -0.003823f, -0.002629f, -0.002598f, -0.003009f, -0.002802f, -0.005357f} - }, - { - {0.057990f, 0.057551f, 0.056676f, 0.055371f, 0.053644f, 0.051507f, 0.048977f, 0.046072f, 0.042817f, 0.039239f, 0.035373f, 0.031256f, 0.026931f, 0.022447f, 0.017856f, 0.013215f, 0.008585f, 0.004028f, -0.000390f, -0.004604f, -0.008549f, -0.012161f, -0.015382f, -0.018157f, -0.020438f, -0.022185f, -0.023367f, -0.023963f, -0.023964f, -0.023372f, -0.022202f, -0.020480f, -0.018246f, -0.015550f, -0.012453f, -0.009027f, -0.005348f, -0.001502f, 0.002422f, 0.006333f, 0.010141f, 0.013758f, 0.017100f, 0.020090f, 0.022660f, 0.024752f, 0.026322f, 0.027338f, 0.027781f, 0.027647f, 0.026950f, 0.025713f, 0.023975f, 0.021790f, 0.019218f, 0.016332f, 0.013210f, 0.009937f, 0.006599f, 0.003282f, 0.000072f, -0.002950f, -0.005713f, -0.008148f, -0.010202f, -0.011830f, -0.013001f, -0.013695f, -0.013909f, -0.013649f, -0.012937f, -0.011804f, -0.010294f, -0.008458f, -0.006355f, -0.004051f, -0.001614f, 0.000887f, 0.003382f, 0.005806f, 0.008094f, 0.010193f, 0.012051f, 0.013630f, 0.014897f, 0.015832f, 0.016424f, 0.016670f, 0.016581f, 0.016172f, 0.015469f, 0.014504f, 0.013315f, 0.011944f, 0.010435f, 0.008834f, - 0.007186f, 0.005535f, 0.003922f, 0.002385f, 0.000955f, -0.000341f, -0.001482f, -0.002453f, -0.003245f, -0.003857f, -0.004292f, -0.004558f, -0.004668f, -0.004638f, -0.004488f, -0.004237f, -0.003909f, -0.003524f, -0.003104f, -0.002668f, -0.002234f, -0.001816f, -0.001426f, -0.001073f, -0.000762f, -0.000497f, -0.000277f, -0.000099f, 0.000041f, 0.000150f, 0.000234f, 0.000301f, 0.000359f, 0.000415f, 0.000474f, 0.000542f, 0.000621f, 0.000713f, 0.000817f, 0.000931f, 0.001050f, 0.001170f, 0.001285f, 0.001386f, 0.001467f, 0.001521f, 0.001540f, 0.001520f, 0.001457f, 0.001347f, 0.001191f, 0.000991f, 0.000749f, 0.000474f, 0.000172f, -0.000147f, -0.000470f, -0.000786f, -0.001081f, -0.001342f, -0.001557f, -0.001713f, -0.001800f, -0.001808f, -0.001733f, -0.001568f, -0.001314f, -0.000971f, -0.000544f, -0.000040f, 0.000530f, 0.001156f, 0.001823f, 0.002515f, 0.003216f, 0.003911f, 0.004581f, 0.005211f, 0.005787f, 0.006296f, 0.006726f, 0.007071f, 0.007323f, 0.007481f, 0.007545f, 0.007518f, 0.007406f, 0.007217f, 0.006961f, 0.006651f, 0.006300f, 0.005922f, 0.005531f, 0.005141f, 0.004765f, 0.004415f, - 0.004100f, 0.003830f, 0.003610f, 0.003444f, 0.003334f, 0.003277f, 0.003271f, 0.003311f, 0.003390f, 0.003499f, 0.003630f, 0.003772f, 0.003916f, 0.004053f, 0.004174f, 0.004271f, 0.004338f, 0.004371f, 0.004367f, 0.004324f, 0.004246f, 0.004133f, 0.003990f, 0.003824f, 0.003641f, 0.003450f, 0.003257f, 0.003073f, 0.002903f, 0.002757f, 0.002639f, 0.002555f, 0.002508f, 0.002500f, 0.002531f, 0.002600f, 0.002703f, 0.002835f, 0.002991f, 0.003163f, 0.003343f, 0.003525f, 0.003698f, 0.003857f, 0.003993f, 0.004101f, 0.004175f, 0.004213f, 0.025493f, -0.047455f, -0.206540f, -0.180737f, 0.076698f, 0.007288f, -0.166173f, -0.202836f, -0.244911f, -0.225975f, -0.104465f, 0.272194f, 0.125062f, 0.081907f, 0.216402f, -0.010589f, -0.079220f, -0.139664f, -0.034890f, -0.030574f, 0.087613f, 0.152898f, 0.252140f, 0.072496f, -0.131820f, -0.186218f, 0.030134f, 0.161903f, 0.228954f, 0.120766f, -0.019227f, -0.224895f, -0.167825f, -0.058346f, 0.178973f, 0.240116f, 0.161527f, -0.083111f, -0.165331f, -0.176407f, 0.041491f, -0.197156f, -0.142013f, -0.004267f, 0.188880f, 0.191319f, 0.081722f, -0.127133f, - -0.228454f, -0.207586f, 0.057983f, 0.248368f, 0.308434f, 0.142332f, -0.137033f, -0.397708f, -0.321202f, 0.011995f, 0.416821f, 0.511799f, 0.290059f, -0.186803f, -0.492613f, -0.494386f, -0.057184f, 0.388077f, 0.468303f, 0.122035f, -0.298587f, -0.493250f, -0.282021f, 0.102010f, 0.381789f, 0.379117f, 0.065081f, -0.263329f, -0.364143f, -0.234270f, 0.158247f, 0.329315f, 0.263075f, 0.012767f, -0.234963f, -0.319959f, -0.150808f, 0.078276f, 0.254248f, 0.216596f, 0.039173f, -0.127683f, -0.202735f, -0.151174f, -0.029901f, 0.045948f, 0.133607f, 0.107376f, -0.003139f, -0.091457f, -0.149897f, -0.078458f, 0.129406f, 0.250965f, 0.193469f, -0.015697f, -0.286780f, -0.327940f, -0.123900f, 0.166658f, 0.337032f, 0.283810f, 0.025301f, -0.238622f, -0.299722f, -0.161796f, 0.128558f, 0.255374f, 0.237808f, 0.030703f, -0.148637f, -0.247569f, -0.123435f, 0.005753f, 0.131947f, 0.168550f, 0.092217f, -0.010030f, -0.064929f, -0.098678f, -0.091864f, -0.053448f, 0.029236f, 0.072744f, 0.087151f, 0.035778f, -0.028064f, -0.088679f, -0.082291f, -0.042768f, 0.033241f, 0.094467f, 0.076939f, 0.019309f, -0.045104f, -0.073694f, - -0.046734f, -0.009283f, 0.052709f, 0.072200f, 0.025338f, -0.010891f, -0.047185f, -0.046494f, -0.008576f, 0.031316f, 0.055596f, 0.012706f, -0.012001f, -0.047642f, -0.041810f, -0.002784f, 0.043247f, 0.027354f, 0.016670f, -0.016791f, -0.046652f, -0.032431f, -0.010611f, 0.027002f, 0.032900f, 0.008735f, -0.024343f, -0.040507f, -0.015884f, 0.019326f, 0.016809f, -0.008429f, -0.037666f, -0.036170f, -0.016857f, -0.024047f, 0.089287f, 0.114137f, 0.047188f, -0.081205f, -0.128577f, -0.055059f, 0.088676f, 0.143960f, 0.052069f, -0.101950f, -0.145637f, -0.031726f, 0.118112f, 0.128265f, -0.007591f, -0.128859f, -0.086502f, 0.055411f, 0.113541f, 0.010025f, -0.092906f, -0.036297f, 0.057924f, 0.017587f, -0.023888f, -0.005725f, 0.005014f, -0.001565f, -0.000171f, -0.000855f, 0.000693f, 0.000005f, -0.000326f, -0.002626f, -0.001412f, -0.001083f, -0.001205f, -0.000870f, -0.000136f, -0.001613f, -0.000940f, -0.003150f, -0.001555f, -0.000591f, 0.000728f, 0.000136f, -0.000155f, -0.000405f, -0.000913f, -0.001417f, -0.001185f, -0.001152f, -0.000419f, -0.000418f, -0.000787f, -0.000272f, -0.000412f, -0.000635f, -0.001489f, -0.001892f}, - {0.057990f, 0.057551f, 0.056676f, 0.055371f, 0.053644f, 0.051507f, 0.048977f, 0.046072f, 0.042817f, 0.039239f, 0.035373f, 0.031256f, 0.026931f, 0.022447f, 0.017856f, 0.013215f, 0.008585f, 0.004028f, -0.000390f, -0.004604f, -0.008549f, -0.012161f, -0.015382f, -0.018157f, -0.020438f, -0.022185f, -0.023367f, -0.023963f, -0.023964f, -0.023372f, -0.022202f, -0.020480f, -0.018246f, -0.015550f, -0.012453f, -0.009027f, -0.005348f, -0.001502f, 0.002422f, 0.006333f, 0.010141f, 0.013758f, 0.017100f, 0.020090f, 0.022660f, 0.024752f, 0.026322f, 0.027338f, 0.027781f, 0.027647f, 0.026950f, 0.025713f, 0.023975f, 0.021790f, 0.019218f, 0.016332f, 0.013210f, 0.009937f, 0.006599f, 0.003282f, 0.000072f, -0.002950f, -0.005713f, -0.008148f, -0.010202f, -0.011830f, -0.013001f, -0.013695f, -0.013909f, -0.013649f, -0.012937f, -0.011804f, -0.010294f, -0.008458f, -0.006355f, -0.004051f, -0.001614f, 0.000887f, 0.003382f, 0.005806f, 0.008094f, 0.010193f, 0.012051f, 0.013630f, 0.014897f, 0.015832f, 0.016424f, 0.016670f, 0.016581f, 0.016172f, 0.015469f, 0.014504f, 0.013315f, 0.011944f, 0.010435f, 0.008834f, - 0.007186f, 0.005535f, 0.003922f, 0.002385f, 0.000955f, -0.000341f, -0.001482f, -0.002453f, -0.003245f, -0.003857f, -0.004292f, -0.004558f, -0.004668f, -0.004638f, -0.004488f, -0.004237f, -0.003909f, -0.003524f, -0.003104f, -0.002668f, -0.002234f, -0.001816f, -0.001426f, -0.001073f, -0.000762f, -0.000497f, -0.000277f, -0.000099f, 0.000041f, 0.000150f, 0.000234f, 0.000301f, 0.000359f, 0.000415f, 0.000474f, 0.000542f, 0.000621f, 0.000713f, 0.000817f, 0.000931f, 0.001050f, 0.001170f, 0.001285f, 0.001386f, 0.001467f, 0.001521f, 0.001540f, 0.001520f, 0.001457f, 0.001347f, 0.001191f, 0.000991f, 0.000749f, 0.000474f, 0.000172f, -0.000147f, -0.000470f, -0.000786f, -0.001081f, -0.001342f, -0.001557f, -0.001713f, -0.001800f, -0.001808f, -0.001733f, -0.001568f, -0.001314f, -0.000971f, -0.000544f, -0.000040f, 0.000530f, 0.001156f, 0.001823f, 0.002515f, 0.003216f, 0.003911f, 0.004581f, 0.005211f, 0.005787f, 0.006296f, 0.006726f, 0.007071f, 0.007323f, 0.007481f, 0.007545f, 0.007518f, 0.007406f, 0.007217f, 0.006961f, 0.006651f, 0.006300f, 0.005922f, 0.005531f, 0.005141f, 0.004765f, 0.004415f, - 0.004100f, 0.003830f, 0.003610f, 0.003444f, 0.003334f, 0.003277f, 0.003271f, 0.003311f, 0.003390f, 0.003499f, 0.003630f, 0.003772f, 0.003916f, 0.004053f, 0.004174f, 0.004271f, 0.004338f, 0.004371f, 0.004367f, 0.004324f, 0.004246f, 0.004133f, 0.003990f, 0.003824f, 0.003641f, 0.003450f, 0.003257f, 0.003073f, 0.002903f, 0.002757f, 0.002639f, 0.002555f, 0.002508f, 0.002500f, 0.002531f, 0.002600f, 0.002703f, 0.002835f, 0.002991f, 0.003163f, 0.003343f, 0.003525f, 0.003698f, 0.003857f, 0.003993f, 0.004101f, 0.004175f, 0.004213f, 0.025493f, -0.047455f, -0.206540f, -0.180737f, 0.076698f, 0.007288f, -0.166173f, -0.202836f, -0.244911f, -0.225975f, -0.104465f, 0.272194f, 0.125062f, 0.081907f, 0.216402f, -0.010589f, -0.079220f, -0.139664f, -0.034890f, -0.030574f, 0.087613f, 0.152898f, 0.252140f, 0.072496f, -0.131820f, -0.186218f, 0.030134f, 0.161903f, 0.228954f, 0.120766f, -0.019227f, -0.224895f, -0.167825f, -0.058346f, 0.178973f, 0.240116f, 0.161527f, -0.083111f, -0.165331f, -0.176407f, 0.041491f, -0.197156f, -0.142013f, -0.004267f, 0.188880f, 0.191319f, 0.081722f, -0.127133f, - -0.228454f, -0.207586f, 0.057983f, 0.248368f, 0.308434f, 0.142332f, -0.137033f, -0.397708f, -0.321202f, 0.011995f, 0.416821f, 0.511799f, 0.290059f, -0.186803f, -0.492613f, -0.494386f, -0.057184f, 0.388077f, 0.468303f, 0.122035f, -0.298587f, -0.493250f, -0.282021f, 0.102010f, 0.381789f, 0.379117f, 0.065081f, -0.263329f, -0.364143f, -0.234270f, 0.158247f, 0.329315f, 0.263075f, 0.012767f, -0.234963f, -0.319959f, -0.150808f, 0.078276f, 0.254248f, 0.216596f, 0.039173f, -0.127683f, -0.202735f, -0.151174f, -0.029901f, 0.045948f, 0.133607f, 0.107376f, -0.003139f, -0.091457f, -0.149897f, -0.078458f, 0.129406f, 0.250965f, 0.193469f, -0.015697f, -0.286780f, -0.327940f, -0.123900f, 0.166658f, 0.337032f, 0.283810f, 0.025301f, -0.238622f, -0.299722f, -0.161796f, 0.128558f, 0.255374f, 0.237808f, 0.030703f, -0.148637f, -0.247569f, -0.123435f, 0.005753f, 0.131947f, 0.168550f, 0.092217f, -0.010030f, -0.064929f, -0.098678f, -0.091864f, -0.053448f, 0.029236f, 0.072744f, 0.087151f, 0.035778f, -0.028064f, -0.088679f, -0.082291f, -0.042768f, 0.033241f, 0.094467f, 0.076939f, 0.019309f, -0.045104f, -0.073694f, - -0.046734f, -0.009283f, 0.052709f, 0.072200f, 0.025338f, -0.010891f, -0.047185f, -0.046494f, -0.008576f, 0.031316f, 0.055596f, 0.012706f, -0.012001f, -0.047642f, -0.041810f, -0.002784f, 0.043247f, 0.027354f, 0.016670f, -0.016791f, -0.046652f, -0.032431f, -0.010611f, 0.027002f, 0.032900f, 0.008735f, -0.024343f, -0.040507f, -0.015884f, 0.019326f, 0.016809f, -0.008429f, -0.037666f, -0.036170f, -0.016857f, -0.024047f, 0.089287f, 0.114137f, 0.047188f, -0.081205f, -0.128577f, -0.055059f, 0.088676f, 0.143960f, 0.052069f, -0.101950f, -0.145637f, -0.031726f, 0.118112f, 0.128265f, -0.007591f, -0.128859f, -0.086502f, 0.055411f, 0.113541f, 0.010025f, -0.092906f, -0.036297f, 0.057924f, 0.017587f, -0.023888f, -0.005725f, 0.005014f, -0.001565f, -0.000171f, -0.000855f, 0.000693f, 0.000005f, -0.000326f, -0.002626f, -0.001412f, -0.001083f, -0.001205f, -0.000870f, -0.000136f, -0.001613f, -0.000940f, -0.003150f, -0.001555f, -0.000591f, 0.000728f, 0.000136f, -0.000155f, -0.000405f, -0.000913f, -0.001417f, -0.001185f, -0.001152f, -0.000419f, -0.000418f, -0.000787f, -0.000272f, -0.000412f, -0.000635f, -0.001489f, -0.001892f} - }, - { - {0.053939f, 0.053168f, 0.051645f, 0.049411f, 0.046524f, 0.043059f, 0.039106f, 0.034766f, 0.030149f, 0.025371f, 0.020548f, 0.015798f, 0.011232f, 0.006952f, 0.003053f, -0.000388f, -0.003306f, -0.005656f, -0.007410f, -0.008558f, -0.009110f, -0.009095f, -0.008557f, -0.007556f, -0.006164f, -0.004465f, -0.002548f, -0.000510f, 0.001554f, 0.003549f, 0.005387f, 0.006984f, 0.008271f, 0.009189f, 0.009693f, 0.009755f, 0.009362f, 0.008518f, 0.007244f, 0.005576f, 0.003562f, 0.001266f, -0.001241f, -0.003880f, -0.006567f, -0.009216f, -0.011741f, -0.014061f, -0.016102f, -0.017797f, -0.019091f, -0.019942f, -0.020323f, -0.020220f, -0.019635f, -0.018586f, -0.017105f, -0.015237f, -0.013041f, -0.010583f, -0.007940f, -0.005192f, -0.002424f, 0.000280f, 0.002838f, 0.005173f, 0.007216f, 0.008906f, 0.010194f, 0.011044f, 0.011434f, 0.011355f, 0.010813f, 0.009828f, 0.008434f, 0.006676f, 0.004611f, 0.002303f, -0.000174f, -0.002746f, -0.005333f, -0.007857f, -0.010242f, -0.012419f, -0.014323f, -0.015899f, -0.017103f, -0.017903f, -0.018277f, -0.018217f, -0.017730f, -0.016832f, -0.015553f, -0.013933f, -0.012022f, -0.009877f, - -0.007561f, -0.005142f, -0.002689f, -0.000270f, 0.002046f, 0.004198f, 0.006129f, 0.007788f, 0.009135f, 0.010139f, 0.010778f, 0.011044f, 0.010935f, 0.010465f, 0.009654f, 0.008534f, 0.007142f, 0.005525f, 0.003734f, 0.001824f, -0.000148f, -0.002124f, -0.004047f, -0.005864f, -0.007524f, -0.008982f, -0.010201f, -0.011149f, -0.011804f, -0.012151f, -0.012183f, -0.011904f, -0.011324f, -0.010460f, -0.009340f, -0.007993f, -0.006456f, -0.004770f, -0.002977f, -0.001123f, 0.000747f, 0.002589f, 0.004361f, 0.006022f, 0.007538f, 0.008876f, 0.010011f, 0.010923f, 0.011596f, 0.012024f, 0.012203f, 0.012138f, 0.011837f, 0.011315f, 0.010592f, 0.009691f, 0.008638f, 0.007461f, 0.006193f, 0.004863f, 0.003505f, 0.002149f, 0.000826f, -0.000436f, -0.001612f, -0.002679f, -0.003617f, -0.004412f, -0.005051f, -0.005526f, -0.005834f, -0.005975f, -0.005953f, -0.005775f, -0.005453f, -0.005000f, -0.004431f, -0.003766f, -0.003024f, -0.002226f, -0.001392f, -0.000545f, 0.000295f, 0.001109f, 0.001878f, 0.002584f, 0.003215f, 0.003756f, 0.004200f, 0.004538f, 0.004768f, 0.004887f, 0.004897f, 0.004804f, 0.004613f, 0.004333f, - 0.003977f, 0.003556f, 0.003085f, 0.002579f, 0.002053f, 0.001523f, 0.001003f, 0.000508f, 0.000051f, -0.000356f, -0.000703f, -0.000982f, -0.001188f, -0.001317f, -0.001369f, -0.001344f, -0.001246f, -0.001082f, -0.000859f, -0.000586f, -0.000274f, 0.000064f, 0.000418f, 0.000774f, 0.001120f, 0.001444f, 0.001735f, 0.001983f, 0.002182f, 0.002323f, 0.002403f, 0.002420f, 0.002374f, 0.002268f, 0.002104f, 0.001890f, 0.001633f, 0.001342f, 0.001028f, 0.000702f, 0.000375f, 0.000059f, -0.000236f, -0.000499f, -0.000722f, -0.000895f, -0.001015f, -0.001075f, 0.049892f, 0.047990f, -0.033258f, -0.133611f, -0.052183f, 0.061542f, -0.066189f, -0.089403f, -0.087291f, -0.054690f, -0.271607f, 0.096603f, -0.267726f, -0.264256f, 0.129132f, 0.545913f, 0.617339f, 0.272794f, -0.174907f, -0.533748f, -0.554207f, -0.047609f, 0.546477f, 0.739049f, 0.437232f, -0.183155f, -0.701637f, -0.783026f, -0.180038f, 0.530674f, 0.909066f, 0.571940f, -0.135388f, -0.739667f, -0.743880f, -0.233864f, 0.430650f, 0.757264f, 0.447132f, -0.114267f, -0.697564f, -0.285638f, 0.199784f, 0.551573f, 0.527110f, 0.166839f, -0.279615f, -0.511378f, - -0.414597f, -0.035481f, 0.341233f, 0.439039f, 0.261439f, -0.073149f, -0.320806f, -0.349659f, -0.137619f, 0.104207f, 0.286915f, 0.269047f, 0.082840f, -0.149283f, -0.281998f, -0.208006f, -0.019203f, 0.101892f, 0.320901f, 0.235951f, 0.042155f, -0.220082f, -0.218070f, -0.072821f, 0.123239f, 0.178973f, 0.115959f, -0.050898f, -0.138270f, -0.074258f, 0.036054f, 0.153232f, 0.152791f, 0.013746f, -0.140713f, -0.160471f, -0.062189f, 0.111791f, 0.259895f, 0.179835f, 0.030866f, -0.155186f, -0.163893f, -0.024727f, 0.057868f, 0.095150f, 0.048223f, -0.039504f, -0.025509f, -0.025762f, 0.060861f, 0.031466f, -0.120354f, -0.222981f, -0.180983f, 0.016892f, 0.223071f, 0.273060f, 0.085555f, -0.173778f, -0.344302f, -0.229392f, 0.091982f, 0.346138f, 0.343015f, 0.091762f, -0.246905f, -0.397401f, -0.330364f, 0.031457f, 0.369990f, 0.427005f, 0.131021f, -0.260986f, -0.436361f, -0.310050f, 0.029087f, 0.323590f, 0.385483f, 0.170781f, -0.141240f, -0.359812f, -0.310507f, -0.043287f, 0.254955f, 0.384213f, 0.215259f, -0.062184f, -0.327732f, -0.348448f, -0.119290f, 0.201937f, 0.353261f, 0.283515f, -0.011811f, -0.252592f, - -0.339514f, -0.211221f, 0.051300f, 0.280752f, 0.283220f, 0.092064f, -0.144765f, -0.288062f, -0.208872f, 0.005855f, 0.237021f, 0.313554f, 0.130575f, -0.114179f, -0.277431f, -0.250920f, -0.032791f, 0.225855f, 0.278421f, 0.137232f, -0.080003f, -0.245236f, -0.213592f, -0.037867f, 0.158155f, 0.242168f, 0.125690f, -0.102714f, -0.254825f, -0.211195f, 0.003451f, 0.225300f, 0.258602f, 0.103888f, -0.159026f, -0.337059f, -0.112344f, 0.196349f, 0.357577f, 0.198215f, -0.126973f, -0.336837f, -0.230151f, 0.083405f, 0.320534f, 0.248317f, -0.055685f, -0.288169f, -0.219367f, 0.063406f, 0.263101f, 0.170224f, -0.090796f, -0.222565f, -0.079326f, 0.141957f, 0.144276f, -0.049174f, -0.100479f, 0.016247f, 0.040632f, -0.004263f, -0.004172f, 0.001039f, 0.002231f, -0.000104f, 0.003192f, 0.001874f, 0.000180f, 0.001159f, 0.001815f, 0.000130f, 0.000856f, 0.001144f, 0.001903f, 0.000931f, 0.000960f, 0.001644f, 0.001821f, 0.000738f, -0.000514f, 0.000766f, 0.002281f, 0.002899f, 0.001980f, 0.001944f, 0.000363f, 0.002092f, -0.000780f, -0.002933f, 0.002161f, 0.003171f, 0.003051f, 0.001162f, 0.000614f, 0.001346f}, - {0.053939f, 0.053168f, 0.051645f, 0.049411f, 0.046524f, 0.043059f, 0.039106f, 0.034766f, 0.030149f, 0.025371f, 0.020548f, 0.015798f, 0.011232f, 0.006952f, 0.003053f, -0.000388f, -0.003306f, -0.005656f, -0.007410f, -0.008558f, -0.009110f, -0.009095f, -0.008557f, -0.007556f, -0.006164f, -0.004465f, -0.002548f, -0.000510f, 0.001554f, 0.003549f, 0.005387f, 0.006984f, 0.008271f, 0.009189f, 0.009693f, 0.009755f, 0.009362f, 0.008518f, 0.007244f, 0.005576f, 0.003562f, 0.001266f, -0.001241f, -0.003880f, -0.006567f, -0.009216f, -0.011741f, -0.014061f, -0.016102f, -0.017797f, -0.019091f, -0.019942f, -0.020323f, -0.020220f, -0.019635f, -0.018586f, -0.017105f, -0.015237f, -0.013041f, -0.010583f, -0.007940f, -0.005192f, -0.002424f, 0.000280f, 0.002838f, 0.005173f, 0.007216f, 0.008906f, 0.010194f, 0.011044f, 0.011434f, 0.011355f, 0.010813f, 0.009828f, 0.008434f, 0.006676f, 0.004611f, 0.002303f, -0.000174f, -0.002746f, -0.005333f, -0.007857f, -0.010242f, -0.012419f, -0.014323f, -0.015899f, -0.017103f, -0.017903f, -0.018277f, -0.018217f, -0.017730f, -0.016832f, -0.015553f, -0.013933f, -0.012022f, -0.009877f, - -0.007561f, -0.005142f, -0.002689f, -0.000270f, 0.002046f, 0.004198f, 0.006129f, 0.007788f, 0.009135f, 0.010139f, 0.010778f, 0.011044f, 0.010935f, 0.010465f, 0.009654f, 0.008534f, 0.007142f, 0.005525f, 0.003734f, 0.001824f, -0.000148f, -0.002124f, -0.004047f, -0.005864f, -0.007524f, -0.008982f, -0.010201f, -0.011149f, -0.011804f, -0.012151f, -0.012183f, -0.011904f, -0.011324f, -0.010460f, -0.009340f, -0.007993f, -0.006456f, -0.004770f, -0.002977f, -0.001123f, 0.000747f, 0.002589f, 0.004361f, 0.006022f, 0.007538f, 0.008876f, 0.010011f, 0.010923f, 0.011596f, 0.012024f, 0.012203f, 0.012138f, 0.011837f, 0.011315f, 0.010592f, 0.009691f, 0.008638f, 0.007461f, 0.006193f, 0.004863f, 0.003505f, 0.002149f, 0.000826f, -0.000436f, -0.001612f, -0.002679f, -0.003617f, -0.004412f, -0.005051f, -0.005526f, -0.005834f, -0.005975f, -0.005953f, -0.005775f, -0.005453f, -0.005000f, -0.004431f, -0.003766f, -0.003024f, -0.002226f, -0.001392f, -0.000545f, 0.000295f, 0.001109f, 0.001878f, 0.002584f, 0.003215f, 0.003756f, 0.004200f, 0.004538f, 0.004768f, 0.004887f, 0.004897f, 0.004804f, 0.004613f, 0.004333f, - 0.003977f, 0.003556f, 0.003085f, 0.002579f, 0.002053f, 0.001523f, 0.001003f, 0.000508f, 0.000051f, -0.000356f, -0.000703f, -0.000982f, -0.001188f, -0.001317f, -0.001369f, -0.001344f, -0.001246f, -0.001082f, -0.000859f, -0.000586f, -0.000274f, 0.000064f, 0.000418f, 0.000774f, 0.001120f, 0.001444f, 0.001735f, 0.001983f, 0.002182f, 0.002323f, 0.002403f, 0.002420f, 0.002374f, 0.002268f, 0.002104f, 0.001890f, 0.001633f, 0.001342f, 0.001028f, 0.000702f, 0.000375f, 0.000059f, -0.000236f, -0.000499f, -0.000722f, -0.000895f, -0.001015f, -0.001075f, 0.049892f, 0.047990f, -0.033258f, -0.133611f, -0.052183f, 0.061542f, -0.066189f, -0.089403f, -0.087291f, -0.054690f, -0.271607f, 0.096603f, -0.267726f, -0.264256f, 0.129132f, 0.545913f, 0.617339f, 0.272794f, -0.174907f, -0.533748f, -0.554207f, -0.047609f, 0.546477f, 0.739049f, 0.437232f, -0.183155f, -0.701637f, -0.783026f, -0.180038f, 0.530674f, 0.909066f, 0.571940f, -0.135388f, -0.739667f, -0.743880f, -0.233864f, 0.430650f, 0.757264f, 0.447132f, -0.114267f, -0.697564f, -0.285638f, 0.199784f, 0.551573f, 0.527110f, 0.166839f, -0.279615f, -0.511378f, - -0.414597f, -0.035481f, 0.341233f, 0.439039f, 0.261439f, -0.073149f, -0.320806f, -0.349659f, -0.137619f, 0.104207f, 0.286915f, 0.269047f, 0.082840f, -0.149283f, -0.281998f, -0.208006f, -0.019203f, 0.101892f, 0.320901f, 0.235951f, 0.042155f, -0.220082f, -0.218070f, -0.072821f, 0.123239f, 0.178973f, 0.115959f, -0.050898f, -0.138270f, -0.074258f, 0.036054f, 0.153232f, 0.152791f, 0.013746f, -0.140713f, -0.160471f, -0.062189f, 0.111791f, 0.259895f, 0.179835f, 0.030866f, -0.155186f, -0.163893f, -0.024727f, 0.057868f, 0.095150f, 0.048223f, -0.039504f, -0.025509f, -0.025762f, 0.060861f, 0.031466f, -0.120354f, -0.222981f, -0.180983f, 0.016892f, 0.223071f, 0.273060f, 0.085555f, -0.173778f, -0.344302f, -0.229392f, 0.091982f, 0.346138f, 0.343015f, 0.091762f, -0.246905f, -0.397401f, -0.330364f, 0.031457f, 0.369990f, 0.427005f, 0.131021f, -0.260986f, -0.436361f, -0.310050f, 0.029087f, 0.323590f, 0.385483f, 0.170781f, -0.141240f, -0.359812f, -0.310507f, -0.043287f, 0.254955f, 0.384213f, 0.215259f, -0.062184f, -0.327732f, -0.348448f, -0.119290f, 0.201937f, 0.353261f, 0.283515f, -0.011811f, -0.252592f, - -0.339514f, -0.211221f, 0.051300f, 0.280752f, 0.283220f, 0.092064f, -0.144765f, -0.288062f, -0.208872f, 0.005855f, 0.237021f, 0.313554f, 0.130575f, -0.114179f, -0.277431f, -0.250920f, -0.032791f, 0.225855f, 0.278421f, 0.137232f, -0.080003f, -0.245236f, -0.213592f, -0.037867f, 0.158155f, 0.242168f, 0.125690f, -0.102714f, -0.254825f, -0.211195f, 0.003451f, 0.225300f, 0.258602f, 0.103888f, -0.159026f, -0.337059f, -0.112344f, 0.196349f, 0.357577f, 0.198215f, -0.126973f, -0.336837f, -0.230151f, 0.083405f, 0.320534f, 0.248317f, -0.055685f, -0.288169f, -0.219367f, 0.063406f, 0.263101f, 0.170224f, -0.090796f, -0.222565f, -0.079326f, 0.141957f, 0.144276f, -0.049174f, -0.100479f, 0.016247f, 0.040632f, -0.004263f, -0.004172f, 0.001039f, 0.002231f, -0.000104f, 0.003192f, 0.001874f, 0.000180f, 0.001159f, 0.001815f, 0.000130f, 0.000856f, 0.001144f, 0.001903f, 0.000931f, 0.000960f, 0.001644f, 0.001821f, 0.000738f, -0.000514f, 0.000766f, 0.002281f, 0.002899f, 0.001980f, 0.001944f, 0.000363f, 0.002092f, -0.000780f, -0.002933f, 0.002161f, 0.003171f, 0.003051f, 0.001162f, 0.000614f, 0.001346f} - }, - { - {0.041901f, 0.041644f, 0.041132f, 0.040369f, 0.039360f, 0.038115f, 0.036644f, 0.034960f, 0.033080f, 0.031023f, 0.028809f, 0.026466f, 0.024020f, 0.021503f, 0.018948f, 0.016390f, 0.013868f, 0.011418f, 0.009081f, 0.006893f, 0.004891f, 0.003110f, 0.001579f, 0.000327f, -0.000627f, -0.001266f, -0.001584f, -0.001578f, -0.001255f, -0.000629f, 0.000275f, 0.001430f, 0.002798f, 0.004334f, 0.005991f, 0.007715f, 0.009451f, 0.011139f, 0.012723f, 0.014147f, 0.015357f, 0.016306f, 0.016952f, 0.017258f, 0.017201f, 0.016763f, 0.015936f, 0.014726f, 0.013146f, 0.011220f, 0.008981f, 0.006473f, 0.003744f, 0.000852f, -0.002144f, -0.005180f, -0.008192f, -0.011115f, -0.013889f, -0.016456f, -0.018766f, -0.020774f, -0.022445f, -0.023754f, -0.024685f, -0.025231f, -0.025398f, -0.025201f, -0.024663f, -0.023818f, -0.022705f, -0.021370f, -0.019863f, -0.018236f, -0.016543f, -0.014836f, -0.013165f, -0.011578f, -0.010113f, -0.008805f, -0.007681f, -0.006758f, -0.006047f, -0.005549f, -0.005257f, -0.005155f, -0.005223f, -0.005432f, -0.005751f, -0.006144f, -0.006574f, -0.007004f, -0.007397f, -0.007720f, -0.007944f, -0.008045f, - -0.008005f, -0.007812f, -0.007463f, -0.006961f, -0.006316f, -0.005545f, -0.004673f, -0.003728f, -0.002743f, -0.001752f, -0.000794f, 0.000097f, 0.000883f, 0.001533f, 0.002019f, 0.002318f, 0.002414f, 0.002298f, 0.001968f, 0.001430f, 0.000700f, -0.000203f, -0.001249f, -0.002404f, -0.003629f, -0.004882f, -0.006117f, -0.007289f, -0.008353f, -0.009267f, -0.009993f, -0.010497f, -0.010752f, -0.010739f, -0.010447f, -0.009872f, -0.009020f, -0.007906f, -0.006552f, -0.004990f, -0.003255f, -0.001391f, 0.000554f, 0.002531f, 0.004488f, 0.006374f, 0.008138f, 0.009735f, 0.011121f, 0.012261f, 0.013125f, 0.013691f, 0.013945f, 0.013883f, 0.013507f, 0.012829f, 0.011869f, 0.010655f, 0.009219f, 0.007599f, 0.005840f, 0.003986f, 0.002083f, 0.000180f, -0.001679f, -0.003450f, -0.005094f, -0.006576f, -0.007867f, -0.008943f, -0.009788f, -0.010393f, -0.010753f, -0.010873f, -0.010762f, -0.010435f, -0.009913f, -0.009219f, -0.008380f, -0.007427f, -0.006389f, -0.005298f, -0.004184f, -0.003075f, -0.001998f, -0.000976f, -0.000030f, 0.000825f, 0.001575f, 0.002213f, 0.002733f, 0.003136f, 0.003424f, 0.003602f, 0.003680f, 0.003668f, - 0.003577f, 0.003421f, 0.003213f, 0.002966f, 0.002694f, 0.002407f, 0.002117f, 0.001833f, 0.001562f, 0.001310f, 0.001082f, 0.000879f, 0.000704f, 0.000555f, 0.000431f, 0.000331f, 0.000251f, 0.000189f, 0.000142f, 0.000107f, 0.000082f, 0.000064f, 0.000052f, 0.000046f, 0.000044f, 0.000047f, 0.000055f, 0.000071f, 0.000094f, 0.000127f, 0.000170f, 0.000224f, 0.000290f, 0.000369f, 0.000459f, 0.000561f, 0.000672f, 0.000790f, 0.000912f, 0.001037f, 0.001159f, 0.001277f, 0.001386f, 0.001482f, 0.001564f, 0.001627f, 0.001671f, 0.001693f, -0.008589f, -0.013706f, -0.011480f, -0.019507f, -0.084522f, -0.068258f, -0.074407f, 0.006022f, -0.067948f, -0.035105f, -0.113541f, 0.025271f, -0.099929f, -0.161352f, 0.090732f, 0.307217f, 0.230926f, 0.193524f, -0.085241f, -0.256383f, -0.088475f, -0.069444f, 0.162221f, 0.143857f, 0.081764f, -0.108640f, -0.218760f, -0.183481f, 0.035748f, 0.217219f, 0.277907f, 0.149093f, -0.077173f, -0.379104f, -0.268807f, 0.110869f, 0.337248f, 0.322414f, 0.116275f, -0.214108f, -0.405948f, -0.119559f, 0.205668f, 0.360167f, 0.308288f, 0.030463f, -0.224371f, -0.290891f, - -0.230312f, -0.083689f, 0.192198f, 0.256347f, 0.249895f, 0.006398f, -0.133492f, -0.289328f, -0.121189f, -0.013016f, 0.252580f, 0.282690f, 0.023350f, 0.006112f, -0.200784f, -0.265022f, -0.097706f, 0.187679f, 0.257554f, 0.123191f, -0.143874f, -0.318190f, -0.222703f, -0.006171f, 0.175978f, 0.299184f, 0.196664f, -0.081596f, -0.264277f, -0.266021f, 0.041392f, 0.221364f, 0.275588f, 0.198585f, -0.143864f, -0.297232f, -0.244483f, 0.042519f, 0.230431f, 0.266412f, 0.069441f, -0.176026f, -0.242817f, -0.105670f, 0.058095f, 0.091494f, -0.006481f, -0.079556f, -0.051063f, -0.011345f, 0.063851f, 0.023359f, -0.117032f, -0.175189f, -0.150623f, 0.008055f, 0.146025f, 0.202026f, 0.075495f, -0.077481f, -0.244727f, -0.212741f, -0.061630f, 0.111017f, 0.269495f, 0.230027f, -0.040848f, -0.229507f, -0.203636f, -0.057604f, 0.188787f, 0.209641f, 0.097030f, 0.012440f, -0.228649f, -0.213129f, -0.114776f, 0.056545f, 0.171551f, 0.135038f, -0.008104f, -0.094644f, -0.109245f, -0.031083f, 0.042358f, 0.096241f, 0.061876f, 0.001161f, -0.066020f, -0.132764f, -0.071367f, 0.033501f, 0.081855f, 0.092746f, 0.018466f, -0.045010f, - -0.086509f, -0.101242f, -0.042110f, 0.028859f, 0.063454f, 0.029496f, -0.012907f, -0.044474f, -0.028225f, -0.015706f, 0.043059f, 0.082143f, 0.044775f, -0.036787f, -0.083370f, -0.092755f, -0.025675f, 0.110962f, 0.136245f, 0.074590f, -0.022154f, -0.107603f, -0.096543f, -0.032923f, 0.041587f, 0.074610f, 0.043238f, -0.031976f, -0.114357f, -0.096251f, -0.011309f, 0.075988f, 0.137679f, 0.023208f, -0.078534f, -0.307022f, -0.159274f, 0.170167f, 0.368532f, 0.258626f, -0.077972f, -0.339673f, -0.285783f, 0.038908f, 0.323796f, 0.299487f, -0.011876f, -0.295894f, -0.273170f, 0.028462f, 0.279003f, 0.220583f, -0.071685f, -0.249678f, -0.118577f, 0.142453f, 0.181962f, -0.040878f, -0.131885f, 0.009338f, 0.051482f, -0.002209f, -0.009751f, -0.000868f, 0.001002f, 0.000512f, 0.002613f, -0.001675f, -0.000713f, -0.001351f, -0.000432f, -0.000353f, 0.001025f, 0.000304f, -0.001145f, -0.000262f, 0.001746f, -0.000411f, -0.000323f, -0.001006f, 0.000548f, -0.000515f, -0.001958f, -0.000622f, -0.000196f, 0.001542f, 0.001213f, -0.002762f, -0.000766f, -0.003663f, -0.000140f, -0.000560f, 0.000919f, 0.000676f, -0.001502f, -0.002685f}, - {-0.041901f, -0.041644f, -0.041132f, -0.040369f, -0.039360f, -0.038115f, -0.036644f, -0.034960f, -0.033080f, -0.031023f, -0.028809f, -0.026466f, -0.024020f, -0.021503f, -0.018948f, -0.016390f, -0.013868f, -0.011418f, -0.009081f, -0.006893f, -0.004891f, -0.003110f, -0.001579f, -0.000327f, 0.000627f, 0.001266f, 0.001584f, 0.001578f, 0.001255f, 0.000629f, -0.000275f, -0.001430f, -0.002798f, -0.004334f, -0.005991f, -0.007715f, -0.009451f, -0.011139f, -0.012723f, -0.014147f, -0.015357f, -0.016306f, -0.016952f, -0.017258f, -0.017201f, -0.016763f, -0.015936f, -0.014726f, -0.013146f, -0.011220f, -0.008981f, -0.006473f, -0.003744f, -0.000852f, 0.002144f, 0.005180f, 0.008192f, 0.011115f, 0.013889f, 0.016456f, 0.018766f, 0.020774f, 0.022445f, 0.023754f, 0.024685f, 0.025231f, 0.025398f, 0.025201f, 0.024663f, 0.023818f, 0.022705f, 0.021370f, 0.019863f, 0.018236f, 0.016543f, 0.014836f, 0.013165f, 0.011578f, 0.010113f, 0.008805f, 0.007681f, 0.006758f, 0.006047f, 0.005549f, 0.005257f, 0.005155f, 0.005223f, 0.005432f, 0.005751f, 0.006144f, 0.006574f, 0.007004f, 0.007397f, 0.007720f, 0.007944f, 0.008045f, - 0.008005f, 0.007812f, 0.007463f, 0.006961f, 0.006316f, 0.005545f, 0.004673f, 0.003728f, 0.002743f, 0.001752f, 0.000794f, -0.000097f, -0.000883f, -0.001533f, -0.002019f, -0.002318f, -0.002414f, -0.002298f, -0.001968f, -0.001430f, -0.000700f, 0.000203f, 0.001249f, 0.002404f, 0.003629f, 0.004882f, 0.006117f, 0.007289f, 0.008353f, 0.009267f, 0.009993f, 0.010497f, 0.010752f, 0.010739f, 0.010447f, 0.009872f, 0.009020f, 0.007906f, 0.006552f, 0.004990f, 0.003255f, 0.001391f, -0.000554f, -0.002531f, -0.004488f, -0.006374f, -0.008138f, -0.009735f, -0.011121f, -0.012261f, -0.013125f, -0.013691f, -0.013945f, -0.013883f, -0.013507f, -0.012829f, -0.011869f, -0.010655f, -0.009219f, -0.007599f, -0.005840f, -0.003986f, -0.002083f, -0.000180f, 0.001679f, 0.003450f, 0.005094f, 0.006576f, 0.007867f, 0.008943f, 0.009788f, 0.010393f, 0.010753f, 0.010873f, 0.010762f, 0.010435f, 0.009913f, 0.009219f, 0.008380f, 0.007427f, 0.006389f, 0.005298f, 0.004184f, 0.003075f, 0.001998f, 0.000976f, 0.000030f, -0.000825f, -0.001575f, -0.002213f, -0.002733f, -0.003136f, -0.003424f, -0.003602f, -0.003680f, -0.003668f, - -0.003577f, -0.003421f, -0.003213f, -0.002966f, -0.002694f, -0.002407f, -0.002117f, -0.001833f, -0.001562f, -0.001310f, -0.001082f, -0.000879f, -0.000704f, -0.000555f, -0.000431f, -0.000331f, -0.000251f, -0.000189f, -0.000142f, -0.000107f, -0.000082f, -0.000064f, -0.000052f, -0.000046f, -0.000044f, -0.000047f, -0.000055f, -0.000071f, -0.000094f, -0.000127f, -0.000170f, -0.000224f, -0.000290f, -0.000369f, -0.000459f, -0.000561f, -0.000672f, -0.000790f, -0.000912f, -0.001037f, -0.001159f, -0.001277f, -0.001386f, -0.001482f, -0.001564f, -0.001627f, -0.001671f, -0.001693f, 0.008589f, 0.013706f, 0.011480f, 0.019507f, 0.084522f, 0.068258f, 0.074407f, -0.006022f, 0.067948f, 0.035105f, 0.113541f, -0.025271f, 0.099929f, 0.161352f, -0.090732f, -0.307217f, -0.230926f, -0.193524f, 0.085241f, 0.256383f, 0.088475f, 0.069444f, -0.162221f, -0.143857f, -0.081764f, 0.108640f, 0.218760f, 0.183481f, -0.035748f, -0.217219f, -0.277907f, -0.149093f, 0.077173f, 0.379104f, 0.268807f, -0.110869f, -0.337248f, -0.322414f, -0.116275f, 0.214108f, 0.405948f, 0.119559f, -0.205668f, -0.360167f, -0.308288f, -0.030463f, 0.224371f, 0.290891f, - 0.230312f, 0.083689f, -0.192198f, -0.256347f, -0.249895f, -0.006398f, 0.133492f, 0.289328f, 0.121189f, 0.013016f, -0.252580f, -0.282690f, -0.023350f, -0.006112f, 0.200784f, 0.265022f, 0.097706f, -0.187679f, -0.257554f, -0.123191f, 0.143874f, 0.318190f, 0.222703f, 0.006171f, -0.175978f, -0.299184f, -0.196664f, 0.081596f, 0.264277f, 0.266021f, -0.041392f, -0.221364f, -0.275588f, -0.198585f, 0.143864f, 0.297232f, 0.244483f, -0.042519f, -0.230431f, -0.266412f, -0.069441f, 0.176026f, 0.242817f, 0.105670f, -0.058095f, -0.091494f, 0.006481f, 0.079556f, 0.051063f, 0.011345f, -0.063851f, -0.023359f, 0.117032f, 0.175189f, 0.150623f, -0.008055f, -0.146025f, -0.202026f, -0.075495f, 0.077481f, 0.244727f, 0.212741f, 0.061630f, -0.111017f, -0.269495f, -0.230027f, 0.040848f, 0.229507f, 0.203636f, 0.057604f, -0.188787f, -0.209641f, -0.097030f, -0.012440f, 0.228649f, 0.213129f, 0.114776f, -0.056545f, -0.171551f, -0.135038f, 0.008104f, 0.094644f, 0.109245f, 0.031083f, -0.042358f, -0.096241f, -0.061876f, -0.001161f, 0.066020f, 0.132764f, 0.071367f, -0.033501f, -0.081855f, -0.092746f, -0.018466f, 0.045010f, - 0.086509f, 0.101242f, 0.042110f, -0.028859f, -0.063454f, -0.029496f, 0.012907f, 0.044474f, 0.028225f, 0.015706f, -0.043059f, -0.082143f, -0.044775f, 0.036787f, 0.083370f, 0.092755f, 0.025675f, -0.110962f, -0.136245f, -0.074590f, 0.022154f, 0.107603f, 0.096543f, 0.032923f, -0.041587f, -0.074610f, -0.043238f, 0.031976f, 0.114357f, 0.096251f, 0.011309f, -0.075988f, -0.137679f, -0.023208f, 0.078534f, 0.307022f, 0.159274f, -0.170167f, -0.368532f, -0.258626f, 0.077972f, 0.339673f, 0.285783f, -0.038908f, -0.323796f, -0.299487f, 0.011876f, 0.295894f, 0.273170f, -0.028462f, -0.279003f, -0.220583f, 0.071685f, 0.249678f, 0.118577f, -0.142453f, -0.181962f, 0.040878f, 0.131885f, -0.009338f, -0.051482f, 0.002209f, 0.009751f, 0.000868f, -0.001002f, -0.000512f, -0.002613f, 0.001675f, 0.000713f, 0.001351f, 0.000432f, 0.000353f, -0.001025f, -0.000304f, 0.001145f, 0.000262f, -0.001746f, 0.000411f, 0.000323f, 0.001006f, -0.000548f, 0.000515f, 0.001958f, 0.000622f, 0.000196f, -0.001542f, -0.001213f, 0.002762f, 0.000766f, 0.003663f, 0.000140f, 0.000560f, -0.000919f, -0.000676f, 0.001502f, 0.002685f} - }, - { - {0.027990f, 0.028005f, 0.028028f, 0.028053f, 0.028063f, 0.028043f, 0.027973f, 0.027831f, 0.027596f, 0.027246f, 0.026761f, 0.026124f, 0.025322f, 0.024348f, 0.023197f, 0.021873f, 0.020385f, 0.018748f, 0.016984f, 0.015119f, 0.013185f, 0.011218f, 0.009255f, 0.007337f, 0.005503f, 0.003793f, 0.002242f, 0.000883f, -0.000256f, -0.001156f, -0.001801f, -0.002185f, -0.002310f, -0.002185f, -0.001828f, -0.001262f, -0.000520f, 0.000362f, 0.001343f, 0.002380f, 0.003425f, 0.004436f, 0.005367f, 0.006178f, 0.006835f, 0.007307f, 0.007572f, 0.007615f, 0.007429f, 0.007017f, 0.006390f, 0.005566f, 0.004572f, 0.003442f, 0.002214f, 0.000931f, -0.000362f, -0.001619f, -0.002794f, -0.003844f, -0.004729f, -0.005417f, -0.005879f, -0.006096f, -0.006056f, -0.005756f, -0.005203f, -0.004411f, -0.003403f, -0.002210f, -0.000868f, 0.000582f, 0.002093f, 0.003620f, 0.005113f, 0.006526f, 0.007817f, 0.008944f, 0.009876f, 0.010585f, 0.011052f, 0.011267f, 0.011226f, 0.010937f, 0.010415f, 0.009680f, 0.008763f, 0.007699f, 0.006527f, 0.005289f, 0.004029f, 0.002790f, 0.001615f, 0.000542f, -0.000394f, -0.001166f, - -0.001750f, -0.002132f, -0.002305f, -0.002271f, -0.002036f, -0.001618f, -0.001038f, -0.000325f, 0.000488f, 0.001367f, 0.002273f, 0.003169f, 0.004016f, 0.004780f, 0.005430f, 0.005940f, 0.006287f, 0.006458f, 0.006444f, 0.006245f, 0.005866f, 0.005321f, 0.004627f, 0.003808f, 0.002892f, 0.001910f, 0.000895f, -0.000121f, -0.001103f, -0.002021f, -0.002849f, -0.003561f, -0.004139f, -0.004570f, -0.004847f, -0.004968f, -0.004939f, -0.004770f, -0.004477f, -0.004080f, -0.003603f, -0.003074f, -0.002519f, -0.001968f, -0.001447f, -0.000983f, -0.000597f, -0.000309f, -0.000133f, -0.000077f, -0.000145f, -0.000334f, -0.000637f, -0.001041f, -0.001528f, -0.002076f, -0.002662f, -0.003258f, -0.003837f, -0.004372f, -0.004836f, -0.005204f, -0.005458f, -0.005580f, -0.005557f, -0.005385f, -0.005060f, -0.004589f, -0.003981f, -0.003251f, -0.002419f, -0.001509f, -0.000546f, 0.000440f, 0.001420f, 0.002365f, 0.003247f, 0.004040f, 0.004721f, 0.005271f, 0.005678f, 0.005931f, 0.006028f, 0.005970f, 0.005766f, 0.005426f, 0.004969f, 0.004416f, 0.003789f, 0.003114f, 0.002420f, 0.001732f, 0.001076f, 0.000478f, -0.000043f, -0.000468f, - -0.000783f, -0.000980f, -0.001055f, -0.001009f, -0.000847f, -0.000579f, -0.000221f, 0.000211f, 0.000697f, 0.001213f, 0.001738f, 0.002249f, 0.002723f, 0.003140f, 0.003485f, 0.003741f, 0.003899f, 0.003954f, 0.003903f, 0.003749f, 0.003500f, 0.003166f, 0.002762f, 0.002305f, 0.001813f, 0.001308f, 0.000810f, 0.000340f, -0.000084f, -0.000445f, -0.000728f, -0.000924f, -0.001023f, -0.001025f, -0.000930f, -0.000742f, -0.000472f, -0.000131f, 0.000265f, 0.000698f, 0.001151f, 0.001602f, 0.002033f, 0.002424f, 0.002760f, 0.003025f, 0.003208f, 0.003302f, -0.032158f, -0.046833f, -0.027272f, -0.016391f, -0.081230f, -0.040334f, -0.044233f, -0.101522f, -0.273682f, -0.111065f, 0.010397f, 0.201649f, -0.125347f, -0.213447f, 0.130225f, 0.239388f, 0.175666f, 0.076501f, -0.046882f, -0.188087f, -0.040587f, -0.052777f, 0.136348f, 0.108998f, 0.071914f, -0.078411f, 0.045397f, -0.025762f, 0.050736f, -0.061556f, -0.071913f, 0.045355f, 0.114936f, 0.162979f, 0.108390f, -0.007783f, -0.125580f, -0.119828f, -0.037017f, 0.054773f, 0.129187f, 0.087269f, 0.057169f, 0.039024f, -0.049536f, -0.025118f, -0.030408f, 0.015725f, - 0.014511f, -0.054591f, 0.039370f, 0.037187f, 0.051297f, 0.003383f, -0.048966f, -0.114383f, -0.048045f, 0.074534f, 0.218755f, 0.143640f, 0.038173f, -0.095445f, -0.194052f, -0.153489f, 0.019498f, 0.123819f, 0.178131f, 0.009808f, -0.137529f, -0.191101f, 0.004305f, 0.185018f, 0.250203f, 0.051325f, -0.212989f, -0.330886f, -0.161339f, 0.151261f, 0.362329f, 0.321536f, 0.032559f, -0.246685f, -0.404872f, -0.251175f, 0.091372f, 0.306711f, 0.310470f, 0.099365f, -0.202046f, -0.326032f, -0.218682f, 0.036550f, 0.204057f, 0.201308f, 0.102938f, -0.067942f, -0.154368f, -0.121237f, -0.025975f, 0.115722f, 0.134627f, 0.085124f, 0.012716f, -0.032068f, -0.114969f, -0.153559f, -0.113738f, 0.035265f, 0.140270f, 0.195745f, 0.081435f, -0.058531f, -0.181768f, -0.164670f, -0.051989f, 0.061720f, 0.209701f, 0.162171f, 0.046233f, -0.137134f, -0.169130f, -0.078092f, -0.023700f, 0.073608f, 0.104920f, 0.089401f, 0.026370f, -0.049912f, -0.109171f, -0.100252f, -0.030372f, 0.043768f, 0.094858f, 0.073096f, -0.005715f, -0.114473f, -0.092123f, -0.033089f, 0.022771f, 0.051720f, 0.027033f, -0.004410f, -0.027660f, -0.007557f, - 0.027030f, 0.040251f, 0.030178f, 0.001408f, -0.064907f, -0.059277f, -0.034878f, -0.000683f, 0.038725f, 0.067961f, 0.032636f, -0.049619f, -0.082172f, -0.062792f, -0.004106f, 0.059555f, 0.079096f, -0.021453f, -0.069399f, -0.083642f, -0.036959f, 0.020946f, 0.051561f, 0.063735f, 0.038631f, -0.019134f, -0.069186f, -0.066851f, 0.020319f, 0.047934f, 0.055697f, 0.006777f, -0.062843f, -0.056647f, -0.069231f, -0.023056f, 0.100717f, 0.119971f, 0.035186f, -0.092918f, -0.130130f, -0.047746f, 0.082491f, 0.122115f, 0.041456f, -0.078171f, -0.114526f, -0.039584f, 0.073601f, 0.096201f, 0.018784f, -0.079570f, -0.080645f, 0.002115f, 0.071886f, 0.041651f, -0.042178f, -0.050420f, 0.017227f, 0.025339f, -0.007606f, -0.011025f, 0.000787f, -0.002242f, -0.003983f, -0.003079f, 0.001395f, -0.000121f, -0.002287f, -0.003160f, -0.002294f, -0.002673f, -0.001601f, -0.002908f, -0.003412f, -0.001842f, -0.000148f, -0.002231f, -0.002496f, -0.003088f, -0.001460f, -0.001897f, -0.001890f, -0.000061f, -0.002011f, -0.002058f, -0.002790f, -0.001119f, -0.001602f, -0.004154f, -0.003795f, -0.001532f, -0.000538f, -0.001093f, -0.001079f, -0.003076f}, - {-0.027990f, -0.028005f, -0.028028f, -0.028053f, -0.028063f, -0.028043f, -0.027973f, -0.027831f, -0.027596f, -0.027246f, -0.026761f, -0.026124f, -0.025322f, -0.024348f, -0.023197f, -0.021873f, -0.020385f, -0.018748f, -0.016984f, -0.015119f, -0.013185f, -0.011218f, -0.009255f, -0.007337f, -0.005503f, -0.003793f, -0.002242f, -0.000883f, 0.000256f, 0.001156f, 0.001801f, 0.002185f, 0.002310f, 0.002185f, 0.001828f, 0.001262f, 0.000520f, -0.000362f, -0.001343f, -0.002380f, -0.003425f, -0.004436f, -0.005367f, -0.006178f, -0.006835f, -0.007307f, -0.007572f, -0.007615f, -0.007429f, -0.007017f, -0.006390f, -0.005566f, -0.004572f, -0.003442f, -0.002214f, -0.000931f, 0.000362f, 0.001619f, 0.002794f, 0.003844f, 0.004729f, 0.005417f, 0.005879f, 0.006096f, 0.006056f, 0.005756f, 0.005203f, 0.004411f, 0.003403f, 0.002210f, 0.000868f, -0.000582f, -0.002093f, -0.003620f, -0.005113f, -0.006526f, -0.007817f, -0.008944f, -0.009876f, -0.010585f, -0.011052f, -0.011267f, -0.011226f, -0.010937f, -0.010415f, -0.009680f, -0.008763f, -0.007699f, -0.006527f, -0.005289f, -0.004029f, -0.002790f, -0.001615f, -0.000542f, 0.000394f, 0.001166f, - 0.001750f, 0.002132f, 0.002305f, 0.002271f, 0.002036f, 0.001618f, 0.001038f, 0.000325f, -0.000488f, -0.001367f, -0.002273f, -0.003169f, -0.004016f, -0.004780f, -0.005430f, -0.005940f, -0.006287f, -0.006458f, -0.006444f, -0.006245f, -0.005866f, -0.005321f, -0.004627f, -0.003808f, -0.002892f, -0.001910f, -0.000895f, 0.000121f, 0.001103f, 0.002021f, 0.002849f, 0.003561f, 0.004139f, 0.004570f, 0.004847f, 0.004968f, 0.004939f, 0.004770f, 0.004477f, 0.004080f, 0.003603f, 0.003074f, 0.002519f, 0.001968f, 0.001447f, 0.000983f, 0.000597f, 0.000309f, 0.000133f, 0.000077f, 0.000145f, 0.000334f, 0.000637f, 0.001041f, 0.001528f, 0.002076f, 0.002662f, 0.003258f, 0.003837f, 0.004372f, 0.004836f, 0.005204f, 0.005458f, 0.005580f, 0.005557f, 0.005385f, 0.005060f, 0.004589f, 0.003981f, 0.003251f, 0.002419f, 0.001509f, 0.000546f, -0.000440f, -0.001420f, -0.002365f, -0.003247f, -0.004040f, -0.004721f, -0.005271f, -0.005678f, -0.005931f, -0.006028f, -0.005970f, -0.005766f, -0.005426f, -0.004969f, -0.004416f, -0.003789f, -0.003114f, -0.002420f, -0.001732f, -0.001076f, -0.000478f, 0.000043f, 0.000468f, - 0.000783f, 0.000980f, 0.001055f, 0.001009f, 0.000847f, 0.000579f, 0.000221f, -0.000211f, -0.000697f, -0.001213f, -0.001738f, -0.002249f, -0.002723f, -0.003140f, -0.003485f, -0.003741f, -0.003899f, -0.003954f, -0.003903f, -0.003749f, -0.003500f, -0.003166f, -0.002762f, -0.002305f, -0.001813f, -0.001308f, -0.000810f, -0.000340f, 0.000084f, 0.000445f, 0.000728f, 0.000924f, 0.001023f, 0.001025f, 0.000930f, 0.000742f, 0.000472f, 0.000131f, -0.000265f, -0.000698f, -0.001151f, -0.001602f, -0.002033f, -0.002424f, -0.002760f, -0.003025f, -0.003208f, -0.003302f, 0.032158f, 0.046833f, 0.027272f, 0.016391f, 0.081230f, 0.040334f, 0.044233f, 0.101522f, 0.273682f, 0.111065f, -0.010397f, -0.201649f, 0.125347f, 0.213447f, -0.130225f, -0.239388f, -0.175666f, -0.076501f, 0.046882f, 0.188087f, 0.040587f, 0.052777f, -0.136348f, -0.108998f, -0.071914f, 0.078411f, -0.045397f, 0.025762f, -0.050736f, 0.061556f, 0.071913f, -0.045355f, -0.114936f, -0.162979f, -0.108390f, 0.007783f, 0.125580f, 0.119828f, 0.037017f, -0.054773f, -0.129187f, -0.087269f, -0.057169f, -0.039024f, 0.049536f, 0.025118f, 0.030408f, -0.015725f, - -0.014511f, 0.054591f, -0.039370f, -0.037187f, -0.051297f, -0.003383f, 0.048966f, 0.114383f, 0.048045f, -0.074534f, -0.218755f, -0.143640f, -0.038173f, 0.095445f, 0.194052f, 0.153489f, -0.019498f, -0.123819f, -0.178131f, -0.009808f, 0.137529f, 0.191101f, -0.004305f, -0.185018f, -0.250203f, -0.051325f, 0.212989f, 0.330886f, 0.161339f, -0.151261f, -0.362329f, -0.321536f, -0.032559f, 0.246685f, 0.404872f, 0.251175f, -0.091372f, -0.306711f, -0.310470f, -0.099365f, 0.202046f, 0.326032f, 0.218682f, -0.036550f, -0.204057f, -0.201308f, -0.102938f, 0.067942f, 0.154368f, 0.121237f, 0.025975f, -0.115722f, -0.134627f, -0.085124f, -0.012716f, 0.032068f, 0.114969f, 0.153559f, 0.113738f, -0.035265f, -0.140270f, -0.195745f, -0.081435f, 0.058531f, 0.181768f, 0.164670f, 0.051989f, -0.061720f, -0.209701f, -0.162171f, -0.046233f, 0.137134f, 0.169130f, 0.078092f, 0.023700f, -0.073608f, -0.104920f, -0.089401f, -0.026370f, 0.049912f, 0.109171f, 0.100252f, 0.030372f, -0.043768f, -0.094858f, -0.073096f, 0.005715f, 0.114473f, 0.092123f, 0.033089f, -0.022771f, -0.051720f, -0.027033f, 0.004410f, 0.027660f, 0.007557f, - -0.027030f, -0.040251f, -0.030178f, -0.001408f, 0.064907f, 0.059277f, 0.034878f, 0.000683f, -0.038725f, -0.067961f, -0.032636f, 0.049619f, 0.082172f, 0.062792f, 0.004106f, -0.059555f, -0.079096f, 0.021453f, 0.069399f, 0.083642f, 0.036959f, -0.020946f, -0.051561f, -0.063735f, -0.038631f, 0.019134f, 0.069186f, 0.066851f, -0.020319f, -0.047934f, -0.055697f, -0.006777f, 0.062843f, 0.056647f, 0.069231f, 0.023056f, -0.100717f, -0.119971f, -0.035186f, 0.092918f, 0.130130f, 0.047746f, -0.082491f, -0.122115f, -0.041456f, 0.078171f, 0.114526f, 0.039584f, -0.073601f, -0.096201f, -0.018784f, 0.079570f, 0.080645f, -0.002115f, -0.071886f, -0.041651f, 0.042178f, 0.050420f, -0.017227f, -0.025339f, 0.007606f, 0.011025f, -0.000787f, 0.002242f, 0.003983f, 0.003079f, -0.001395f, 0.000121f, 0.002287f, 0.003160f, 0.002294f, 0.002673f, 0.001601f, 0.002908f, 0.003412f, 0.001842f, 0.000148f, 0.002231f, 0.002496f, 0.003088f, 0.001460f, 0.001897f, 0.001890f, 0.000061f, 0.002011f, 0.002058f, 0.002790f, 0.001119f, 0.001602f, 0.004154f, 0.003795f, 0.001532f, 0.000538f, 0.001093f, 0.001079f, 0.003076f} - }, - { - {0.025610f, 0.025966f, 0.026661f, 0.027659f, 0.028909f, 0.030346f, 0.031894f, 0.033470f, 0.034985f, 0.036349f, 0.037476f, 0.038287f, 0.038710f, 0.038690f, 0.038186f, 0.037173f, 0.035647f, 0.033624f, 0.031139f, 0.028244f, 0.025013f, 0.021529f, 0.017890f, 0.014204f, 0.010581f, 0.007134f, 0.003970f, 0.001193f, -0.001109f, -0.002859f, -0.003998f, -0.004489f, -0.004315f, -0.003483f, -0.002021f, 0.000018f, 0.002563f, 0.005523f, 0.008791f, 0.012247f, 0.015764f, 0.019211f, 0.022455f, 0.025371f, 0.027839f, 0.029756f, 0.031033f, 0.031602f, 0.031415f, 0.030452f, 0.028713f, 0.026225f, 0.023040f, 0.019230f, 0.014888f, 0.010125f, 0.005062f, -0.000166f, -0.005423f, -0.010571f, -0.015474f, -0.020008f, -0.024058f, -0.027526f, -0.030333f, -0.032420f, -0.033753f, -0.034319f, -0.034130f, -0.033220f, -0.031645f, -0.029479f, -0.026815f, -0.023755f, -0.020413f, -0.016907f, -0.013358f, -0.009882f, -0.006589f, -0.003579f, -0.000938f, 0.001262f, 0.002970f, 0.004152f, 0.004794f, 0.004902f, 0.004503f, 0.003637f, 0.002365f, 0.000756f, -0.001107f, -0.003138f, -0.005245f, -0.007337f, -0.009326f, -0.011131f, - -0.012679f, -0.013911f, -0.014781f, -0.015257f, -0.015323f, -0.014980f, -0.014243f, -0.013143f, -0.011724f, -0.010039f, -0.008152f, -0.006131f, -0.004050f, -0.001979f, 0.000009f, 0.001850f, 0.003486f, 0.004868f, 0.005959f, 0.006734f, 0.007179f, 0.007297f, 0.007101f, 0.006614f, 0.005874f, 0.004926f, 0.003819f, 0.002613f, 0.001364f, 0.000132f, -0.001026f, -0.002059f, -0.002919f, -0.003571f, -0.003985f, -0.004144f, -0.004040f, -0.003677f, -0.003070f, -0.002242f, -0.001225f, -0.000058f, 0.001213f, 0.002541f, 0.003876f, 0.005170f, 0.006377f, 0.007455f, 0.008368f, 0.009087f, 0.009593f, 0.009873f, 0.009925f, 0.009757f, 0.009381f, 0.008822f, 0.008109f, 0.007275f, 0.006358f, 0.005397f, 0.004431f, 0.003499f, 0.002634f, 0.001865f, 0.001217f, 0.000706f, 0.000341f, 0.000123f, 0.000045f, 0.000094f, 0.000248f, 0.000483f, 0.000766f, 0.001064f, 0.001343f, 0.001568f, 0.001707f, 0.001730f, 0.001613f, 0.001339f, 0.000896f, 0.000281f, -0.000500f, -0.001435f, -0.002504f, -0.003679f, -0.004926f, -0.006208f, -0.007483f, -0.008708f, -0.009840f, -0.010839f, -0.011667f, -0.012292f, -0.012687f, -0.012836f, - -0.012728f, -0.012362f, -0.011747f, -0.010900f, -0.009847f, -0.008622f, -0.007264f, -0.005817f, -0.004330f, -0.002852f, -0.001433f, -0.000118f, 0.001048f, 0.002029f, 0.002793f, 0.003319f, 0.003593f, 0.003610f, 0.003377f, 0.002907f, 0.002226f, 0.001363f, 0.000358f, -0.000748f, -0.001907f, -0.003072f, -0.004195f, -0.005231f, -0.006137f, -0.006877f, -0.007423f, -0.007752f, -0.007852f, -0.007721f, -0.007363f, -0.006795f, -0.006040f, -0.005128f, -0.004097f, -0.002990f, -0.001850f, -0.000725f, 0.000341f, 0.001304f, 0.002126f, 0.002773f, 0.003220f, 0.003448f, -0.062172f, -0.091515f, -0.072763f, 0.070171f, -0.008941f, -0.099493f, -0.108939f, -0.147460f, -0.248276f, -0.178114f, -0.034602f, 0.058273f, -0.136470f, -0.217398f, 0.034715f, -0.063726f, -0.030817f, 0.068934f, 0.197802f, 0.101927f, -0.063032f, 0.004692f, -0.071259f, -0.096027f, -0.035763f, 0.098619f, 0.375310f, 0.252493f, 0.089705f, -0.043696f, -0.173499f, -0.130961f, -0.135621f, 0.295667f, 0.451114f, 0.238014f, -0.127549f, -0.279218f, -0.349355f, -0.078250f, 0.363353f, 0.168766f, 0.174663f, -0.032703f, -0.169587f, -0.097054f, 0.223490f, 0.428374f, - 0.231674f, -0.343396f, -0.481211f, -0.423973f, 0.047945f, 0.399053f, 0.562478f, 0.255866f, -0.070070f, -0.423145f, -0.236500f, -0.018686f, -0.046020f, 0.340138f, 0.153029f, -0.135824f, -0.140186f, 0.214839f, -0.119183f, -0.258816f, -0.374971f, -0.158821f, -0.013087f, 0.153132f, 0.104243f, 0.158932f, 0.044119f, -0.046752f, -0.113389f, -0.220468f, -0.152913f, 0.054289f, 0.156006f, 0.099701f, -0.178202f, -0.297953f, -0.100918f, 0.255658f, 0.470123f, 0.279739f, -0.145172f, -0.515016f, -0.514805f, -0.096374f, 0.448823f, 0.583482f, 0.312449f, -0.142389f, -0.399044f, -0.480280f, -0.057314f, 0.187400f, 0.276702f, 0.141990f, -0.082796f, -0.258281f, -0.248877f, -0.048325f, 0.214102f, 0.309213f, 0.187387f, -0.075422f, -0.272167f, -0.307918f, -0.178783f, 0.017618f, 0.249229f, 0.359000f, 0.148202f, -0.155440f, -0.409498f, -0.358952f, 0.002647f, 0.262971f, 0.388537f, 0.274792f, -0.088734f, -0.362447f, -0.397575f, -0.155395f, 0.151434f, 0.411319f, 0.362653f, 0.063857f, -0.326209f, -0.457817f, -0.329221f, 0.056563f, 0.384616f, 0.475754f, 0.182653f, -0.249120f, -0.487117f, -0.387725f, -0.025216f, 0.349249f, - 0.481058f, 0.269217f, -0.158897f, -0.449593f, -0.425922f, -0.091493f, 0.271958f, 0.425929f, 0.250062f, -0.106214f, -0.344123f, -0.310552f, -0.025361f, 0.232261f, 0.363327f, 0.161035f, -0.124671f, -0.269196f, -0.227176f, -0.012995f, 0.217935f, 0.279720f, 0.129086f, -0.129026f, -0.289828f, -0.227366f, 0.023489f, 0.232246f, 0.260926f, 0.106217f, -0.139601f, -0.247048f, -0.130607f, 0.058323f, 0.220883f, 0.327093f, -0.092404f, -0.398289f, -0.395170f, -0.061263f, 0.279569f, 0.361623f, 0.113971f, -0.221012f, -0.353200f, -0.168261f, 0.140828f, 0.292861f, 0.150711f, -0.131760f, -0.261245f, -0.124104f, 0.114667f, 0.191874f, 0.040400f, -0.139259f, -0.123195f, 0.038250f, 0.082579f, -0.012815f, -0.041801f, -0.007158f, -0.000334f, -0.005782f, -0.007424f, -0.006915f, -0.006995f, -0.005584f, -0.005366f, -0.006011f, -0.006448f, -0.006286f, -0.007543f, -0.005083f, -0.006372f, -0.005205f, -0.007209f, -0.007291f, -0.006362f, -0.005063f, -0.005453f, -0.008310f, -0.005609f, -0.004844f, -0.006088f, -0.005906f, -0.005358f, -0.006688f, -0.004550f, -0.004954f, -0.007725f, -0.006471f, -0.004609f, -0.004685f, -0.004876f, -0.007015f}, - {0.025610f, 0.025966f, 0.026661f, 0.027659f, 0.028909f, 0.030346f, 0.031894f, 0.033470f, 0.034985f, 0.036349f, 0.037476f, 0.038287f, 0.038710f, 0.038690f, 0.038186f, 0.037173f, 0.035647f, 0.033624f, 0.031139f, 0.028244f, 0.025013f, 0.021529f, 0.017890f, 0.014204f, 0.010581f, 0.007134f, 0.003970f, 0.001193f, -0.001109f, -0.002859f, -0.003998f, -0.004489f, -0.004315f, -0.003483f, -0.002021f, 0.000018f, 0.002563f, 0.005523f, 0.008791f, 0.012247f, 0.015764f, 0.019211f, 0.022455f, 0.025371f, 0.027839f, 0.029756f, 0.031033f, 0.031602f, 0.031415f, 0.030452f, 0.028713f, 0.026225f, 0.023040f, 0.019230f, 0.014888f, 0.010125f, 0.005062f, -0.000166f, -0.005423f, -0.010571f, -0.015474f, -0.020008f, -0.024058f, -0.027526f, -0.030333f, -0.032420f, -0.033753f, -0.034319f, -0.034130f, -0.033220f, -0.031645f, -0.029479f, -0.026815f, -0.023755f, -0.020413f, -0.016907f, -0.013358f, -0.009882f, -0.006589f, -0.003579f, -0.000938f, 0.001262f, 0.002970f, 0.004152f, 0.004794f, 0.004902f, 0.004503f, 0.003637f, 0.002365f, 0.000756f, -0.001107f, -0.003138f, -0.005245f, -0.007337f, -0.009326f, -0.011131f, - -0.012679f, -0.013911f, -0.014781f, -0.015257f, -0.015323f, -0.014980f, -0.014243f, -0.013143f, -0.011724f, -0.010039f, -0.008152f, -0.006131f, -0.004050f, -0.001979f, 0.000009f, 0.001850f, 0.003486f, 0.004868f, 0.005959f, 0.006734f, 0.007179f, 0.007297f, 0.007101f, 0.006614f, 0.005874f, 0.004926f, 0.003819f, 0.002613f, 0.001364f, 0.000132f, -0.001026f, -0.002059f, -0.002919f, -0.003571f, -0.003985f, -0.004144f, -0.004040f, -0.003677f, -0.003070f, -0.002242f, -0.001225f, -0.000058f, 0.001213f, 0.002541f, 0.003876f, 0.005170f, 0.006377f, 0.007455f, 0.008368f, 0.009087f, 0.009593f, 0.009873f, 0.009925f, 0.009757f, 0.009381f, 0.008822f, 0.008109f, 0.007275f, 0.006358f, 0.005397f, 0.004431f, 0.003499f, 0.002634f, 0.001865f, 0.001217f, 0.000706f, 0.000341f, 0.000123f, 0.000045f, 0.000094f, 0.000248f, 0.000483f, 0.000766f, 0.001064f, 0.001343f, 0.001568f, 0.001707f, 0.001730f, 0.001613f, 0.001339f, 0.000896f, 0.000281f, -0.000500f, -0.001435f, -0.002504f, -0.003679f, -0.004926f, -0.006208f, -0.007483f, -0.008708f, -0.009840f, -0.010839f, -0.011667f, -0.012292f, -0.012687f, -0.012836f, - -0.012728f, -0.012362f, -0.011747f, -0.010900f, -0.009847f, -0.008622f, -0.007264f, -0.005817f, -0.004330f, -0.002852f, -0.001433f, -0.000118f, 0.001048f, 0.002029f, 0.002793f, 0.003319f, 0.003593f, 0.003610f, 0.003377f, 0.002907f, 0.002226f, 0.001363f, 0.000358f, -0.000748f, -0.001907f, -0.003072f, -0.004195f, -0.005231f, -0.006137f, -0.006877f, -0.007423f, -0.007752f, -0.007852f, -0.007721f, -0.007363f, -0.006795f, -0.006040f, -0.005128f, -0.004097f, -0.002990f, -0.001850f, -0.000725f, 0.000341f, 0.001304f, 0.002126f, 0.002773f, 0.003220f, 0.003448f, -0.062172f, -0.091515f, -0.072763f, 0.070171f, -0.008941f, -0.099493f, -0.108939f, -0.147460f, -0.248276f, -0.178114f, -0.034602f, 0.058273f, -0.136470f, -0.217398f, 0.034715f, -0.063726f, -0.030817f, 0.068934f, 0.197802f, 0.101927f, -0.063032f, 0.004692f, -0.071259f, -0.096027f, -0.035763f, 0.098619f, 0.375310f, 0.252493f, 0.089705f, -0.043696f, -0.173499f, -0.130961f, -0.135621f, 0.295667f, 0.451114f, 0.238014f, -0.127549f, -0.279218f, -0.349355f, -0.078250f, 0.363353f, 0.168766f, 0.174663f, -0.032703f, -0.169587f, -0.097054f, 0.223490f, 0.428374f, - 0.231674f, -0.343396f, -0.481211f, -0.423973f, 0.047945f, 0.399053f, 0.562478f, 0.255866f, -0.070070f, -0.423145f, -0.236500f, -0.018686f, -0.046020f, 0.340138f, 0.153029f, -0.135824f, -0.140186f, 0.214839f, -0.119183f, -0.258816f, -0.374971f, -0.158821f, -0.013087f, 0.153132f, 0.104243f, 0.158932f, 0.044119f, -0.046752f, -0.113389f, -0.220468f, -0.152913f, 0.054289f, 0.156006f, 0.099701f, -0.178202f, -0.297953f, -0.100918f, 0.255658f, 0.470123f, 0.279739f, -0.145172f, -0.515016f, -0.514805f, -0.096374f, 0.448823f, 0.583482f, 0.312449f, -0.142389f, -0.399044f, -0.480280f, -0.057314f, 0.187400f, 0.276702f, 0.141990f, -0.082796f, -0.258281f, -0.248877f, -0.048325f, 0.214102f, 0.309213f, 0.187387f, -0.075422f, -0.272167f, -0.307918f, -0.178783f, 0.017618f, 0.249229f, 0.359000f, 0.148202f, -0.155440f, -0.409498f, -0.358952f, 0.002647f, 0.262971f, 0.388537f, 0.274792f, -0.088734f, -0.362447f, -0.397575f, -0.155395f, 0.151434f, 0.411319f, 0.362653f, 0.063857f, -0.326209f, -0.457817f, -0.329221f, 0.056563f, 0.384616f, 0.475754f, 0.182653f, -0.249120f, -0.487117f, -0.387725f, -0.025216f, 0.349249f, - 0.481058f, 0.269217f, -0.158897f, -0.449593f, -0.425922f, -0.091493f, 0.271958f, 0.425929f, 0.250062f, -0.106214f, -0.344123f, -0.310552f, -0.025361f, 0.232261f, 0.363327f, 0.161035f, -0.124671f, -0.269196f, -0.227176f, -0.012995f, 0.217935f, 0.279720f, 0.129086f, -0.129026f, -0.289828f, -0.227366f, 0.023489f, 0.232246f, 0.260926f, 0.106217f, -0.139601f, -0.247048f, -0.130607f, 0.058323f, 0.220883f, 0.327093f, -0.092404f, -0.398289f, -0.395170f, -0.061263f, 0.279569f, 0.361623f, 0.113971f, -0.221012f, -0.353200f, -0.168261f, 0.140828f, 0.292861f, 0.150711f, -0.131760f, -0.261245f, -0.124104f, 0.114667f, 0.191874f, 0.040400f, -0.139259f, -0.123195f, 0.038250f, 0.082579f, -0.012815f, -0.041801f, -0.007158f, -0.000334f, -0.005782f, -0.007424f, -0.006915f, -0.006995f, -0.005584f, -0.005366f, -0.006011f, -0.006448f, -0.006286f, -0.007543f, -0.005083f, -0.006372f, -0.005205f, -0.007209f, -0.007291f, -0.006362f, -0.005063f, -0.005453f, -0.008310f, -0.005609f, -0.004844f, -0.006088f, -0.005906f, -0.005358f, -0.006688f, -0.004550f, -0.004954f, -0.007725f, -0.006471f, -0.004609f, -0.004685f, -0.004876f, -0.007015f} - }, - { - {0.047152f, 0.046419f, 0.044975f, 0.042863f, 0.040145f, 0.036900f, 0.033224f, 0.029222f, 0.025009f, 0.020704f, 0.016426f, 0.012291f, 0.008408f, 0.004875f, 0.001776f, -0.000820f, -0.002863f, -0.004323f, -0.005190f, -0.005475f, -0.005207f, -0.004435f, -0.003223f, -0.001648f, 0.000201f, 0.002228f, 0.004334f, 0.006419f, 0.008387f, 0.010150f, 0.011629f, 0.012757f, 0.013484f, 0.013775f, 0.013613f, 0.013002f, 0.011961f, 0.010526f, 0.008751f, 0.006702f, 0.004456f, 0.002098f, -0.000281f, -0.002589f, -0.004736f, -0.006636f, -0.008212f, -0.009397f, -0.010137f, -0.010395f, -0.010148f, -0.009391f, -0.008135f, -0.006409f, -0.004258f, -0.001740f, 0.001075f, 0.004108f, 0.007272f, 0.010478f, 0.013635f, 0.016655f, 0.019455f, 0.021961f, 0.024107f, 0.025844f, 0.027131f, 0.027947f, 0.028283f, 0.028147f, 0.027560f, 0.026559f, 0.025189f, 0.023509f, 0.021583f, 0.019480f, 0.017274f, 0.015037f, 0.012837f, 0.010740f, 0.008803f, 0.007073f, 0.005589f, 0.004377f, 0.003450f, 0.002810f, 0.002447f, 0.002341f, 0.002460f, 0.002767f, 0.003215f, 0.003756f, 0.004338f, 0.004910f, 0.005423f, 0.005832f, - 0.006099f, 0.006192f, 0.006090f, 0.005779f, 0.005258f, 0.004533f, 0.003622f, 0.002551f, 0.001353f, 0.000070f, -0.001256f, -0.002575f, -0.003840f, -0.005004f, -0.006021f, -0.006853f, -0.007466f, -0.007835f, -0.007943f, -0.007781f, -0.007353f, -0.006669f, -0.005750f, -0.004625f, -0.003331f, -0.001908f, -0.000405f, 0.001131f, 0.002649f, 0.004102f, 0.005442f, 0.006629f, 0.007626f, 0.008406f, 0.008947f, 0.009238f, 0.009276f, 0.009066f, 0.008622f, 0.007967f, 0.007129f, 0.006142f, 0.005045f, 0.003878f, 0.002683f, 0.001502f, 0.000374f, -0.000666f, -0.001588f, -0.002367f, -0.002985f, -0.003431f, -0.003702f, -0.003802f, -0.003741f, -0.003538f, -0.003215f, -0.002797f, -0.002316f, -0.001801f, -0.001286f, -0.000799f, -0.000370f, -0.000021f, 0.000228f, 0.000362f, 0.000375f, 0.000264f, 0.000034f, -0.000302f, -0.000729f, -0.001224f, -0.001762f, -0.002315f, -0.002853f, -0.003344f, -0.003760f, -0.004075f, -0.004263f, -0.004307f, -0.004193f, -0.003914f, -0.003467f, -0.002860f, -0.002103f, -0.001214f, -0.000217f, 0.000860f, 0.001987f, 0.003130f, 0.004254f, 0.005325f, 0.006310f, 0.007179f, 0.007908f, 0.008474f, - 0.008862f, 0.009065f, 0.009080f, 0.008910f, 0.008569f, 0.008071f, 0.007441f, 0.006704f, 0.005891f, 0.005035f, 0.004169f, 0.003326f, 0.002538f, 0.001833f, 0.001236f, 0.000767f, 0.000440f, 0.000265f, 0.000243f, 0.000370f, 0.000636f, 0.001026f, 0.001519f, 0.002091f, 0.002714f, 0.003360f, 0.004000f, 0.004604f, 0.005146f, 0.005601f, 0.005950f, 0.006177f, 0.006272f, 0.006232f, 0.006057f, 0.005755f, 0.005338f, 0.004825f, 0.004237f, 0.003598f, 0.002936f, 0.002278f, 0.001651f, 0.001083f, 0.000598f, 0.000214f, -0.000051f, -0.000186f, -0.014399f, -0.088918f, -0.104568f, 0.033774f, 0.006889f, -0.014211f, -0.339412f, -0.200382f, -0.197825f, -0.256243f, -0.049747f, 0.153723f, 0.189341f, 0.030845f, 0.049345f, 0.023389f, 0.124600f, -0.055314f, 0.034364f, 0.042592f, 0.009443f, 0.028243f, 0.002752f, -0.002188f, 0.008221f, -0.011938f, -0.027058f, 0.014048f, 0.003354f, -0.058375f, -0.073083f, -0.034868f, 0.005558f, -0.010350f, -0.046182f, -0.010972f, 0.053029f, 0.157632f, 0.016291f, -0.057067f, -0.213388f, 0.018673f, 0.169634f, 0.193574f, 0.145085f, -0.084971f, -0.237624f, -0.226809f, - -0.110297f, 0.096854f, 0.213419f, 0.198516f, 0.019172f, -0.167969f, -0.238403f, -0.157229f, -0.008594f, 0.166266f, 0.146397f, 0.056850f, 0.078227f, -0.230405f, -0.182536f, -0.000273f, 0.081119f, -0.082448f, 0.310260f, 0.369648f, 0.327330f, -0.054515f, -0.303985f, -0.330843f, 0.023930f, 0.249376f, 0.283462f, 0.082354f, -0.210615f, -0.253664f, -0.298859f, -0.051273f, 0.258919f, 0.344791f, 0.212825f, -0.062716f, -0.254123f, -0.228433f, 0.024020f, 0.174971f, 0.169038f, -0.016732f, -0.152145f, -0.181161f, -0.026750f, 0.108313f, 0.105190f, 0.005511f, -0.080886f, -0.175720f, -0.053616f, 0.124221f, 0.328626f, 0.269120f, -0.012363f, -0.366991f, -0.418201f, -0.179777f, 0.226324f, 0.502263f, 0.469250f, 0.157321f, -0.343881f, -0.631262f, -0.403278f, 0.113845f, 0.477319f, 0.374508f, -0.060622f, -0.349411f, -0.409097f, -0.083539f, 0.217155f, 0.263939f, 0.250254f, -0.057498f, -0.154273f, -0.182069f, -0.042848f, 0.108637f, 0.149146f, 0.048201f, -0.034839f, -0.113656f, -0.076942f, 0.021116f, 0.113304f, 0.085027f, 0.004350f, -0.092580f, -0.102413f, -0.029857f, 0.069689f, 0.114991f, 0.094846f, -0.030280f, - -0.136362f, -0.139061f, -0.036977f, 0.094935f, 0.173700f, 0.157429f, 0.014736f, -0.146953f, -0.191168f, -0.145844f, -0.001188f, 0.157952f, 0.198629f, 0.089918f, -0.075089f, -0.194002f, -0.170286f, -0.047141f, 0.122563f, 0.190138f, 0.123703f, -0.025843f, -0.186317f, -0.197764f, -0.034739f, 0.119741f, 0.200216f, 0.110432f, -0.010105f, -0.153690f, -0.166144f, -0.039158f, 0.099676f, 0.143215f, 0.059367f, -0.190863f, -0.163854f, 0.031416f, 0.208956f, 0.221929f, 0.042610f, -0.164837f, -0.219071f, -0.058930f, 0.162295f, 0.234901f, 0.081855f, -0.143458f, -0.211225f, -0.049183f, 0.162727f, 0.191917f, 0.007000f, -0.167170f, -0.118384f, 0.082358f, 0.149077f, -0.009682f, -0.097921f, 0.005018f, 0.046167f, 0.000346f, -0.005773f, 0.003501f, 0.005151f, 0.002723f, 0.003190f, 0.002225f, 0.003858f, 0.003725f, 0.004658f, 0.004453f, 0.001746f, 0.003153f, 0.002864f, 0.003655f, 0.003188f, 0.003292f, 0.001931f, 0.002658f, 0.001276f, 0.002184f, 0.003202f, 0.006402f, 0.002000f, 0.002265f, 0.000766f, 0.003939f, 0.004158f, 0.002916f, 0.002643f, 0.001368f, 0.002446f, 0.003088f, 0.003033f, 0.003336f}, - {0.047152f, 0.046419f, 0.044975f, 0.042863f, 0.040145f, 0.036900f, 0.033224f, 0.029222f, 0.025009f, 0.020704f, 0.016426f, 0.012291f, 0.008408f, 0.004875f, 0.001776f, -0.000820f, -0.002863f, -0.004323f, -0.005190f, -0.005475f, -0.005207f, -0.004435f, -0.003223f, -0.001648f, 0.000201f, 0.002228f, 0.004334f, 0.006419f, 0.008387f, 0.010150f, 0.011629f, 0.012757f, 0.013484f, 0.013775f, 0.013613f, 0.013002f, 0.011961f, 0.010526f, 0.008751f, 0.006702f, 0.004456f, 0.002098f, -0.000281f, -0.002589f, -0.004736f, -0.006636f, -0.008212f, -0.009397f, -0.010137f, -0.010395f, -0.010148f, -0.009391f, -0.008135f, -0.006409f, -0.004258f, -0.001740f, 0.001075f, 0.004108f, 0.007272f, 0.010478f, 0.013635f, 0.016655f, 0.019455f, 0.021961f, 0.024107f, 0.025844f, 0.027131f, 0.027947f, 0.028283f, 0.028147f, 0.027560f, 0.026559f, 0.025189f, 0.023509f, 0.021583f, 0.019480f, 0.017274f, 0.015037f, 0.012837f, 0.010740f, 0.008803f, 0.007073f, 0.005589f, 0.004377f, 0.003450f, 0.002810f, 0.002447f, 0.002341f, 0.002460f, 0.002767f, 0.003215f, 0.003756f, 0.004338f, 0.004910f, 0.005423f, 0.005832f, - 0.006099f, 0.006192f, 0.006090f, 0.005779f, 0.005258f, 0.004533f, 0.003622f, 0.002551f, 0.001353f, 0.000070f, -0.001256f, -0.002575f, -0.003840f, -0.005004f, -0.006021f, -0.006853f, -0.007466f, -0.007835f, -0.007943f, -0.007781f, -0.007353f, -0.006669f, -0.005750f, -0.004625f, -0.003331f, -0.001908f, -0.000405f, 0.001131f, 0.002649f, 0.004102f, 0.005442f, 0.006629f, 0.007626f, 0.008406f, 0.008947f, 0.009238f, 0.009276f, 0.009066f, 0.008622f, 0.007967f, 0.007129f, 0.006142f, 0.005045f, 0.003878f, 0.002683f, 0.001502f, 0.000374f, -0.000666f, -0.001588f, -0.002367f, -0.002985f, -0.003431f, -0.003702f, -0.003802f, -0.003741f, -0.003538f, -0.003215f, -0.002797f, -0.002316f, -0.001801f, -0.001286f, -0.000799f, -0.000370f, -0.000021f, 0.000228f, 0.000362f, 0.000375f, 0.000264f, 0.000034f, -0.000302f, -0.000729f, -0.001224f, -0.001762f, -0.002315f, -0.002853f, -0.003344f, -0.003760f, -0.004075f, -0.004263f, -0.004307f, -0.004193f, -0.003914f, -0.003467f, -0.002860f, -0.002103f, -0.001214f, -0.000217f, 0.000860f, 0.001987f, 0.003130f, 0.004254f, 0.005325f, 0.006310f, 0.007179f, 0.007908f, 0.008474f, - 0.008862f, 0.009065f, 0.009080f, 0.008910f, 0.008569f, 0.008071f, 0.007441f, 0.006704f, 0.005891f, 0.005035f, 0.004169f, 0.003326f, 0.002538f, 0.001833f, 0.001236f, 0.000767f, 0.000440f, 0.000265f, 0.000243f, 0.000370f, 0.000636f, 0.001026f, 0.001519f, 0.002091f, 0.002714f, 0.003360f, 0.004000f, 0.004604f, 0.005146f, 0.005601f, 0.005950f, 0.006177f, 0.006272f, 0.006232f, 0.006057f, 0.005755f, 0.005338f, 0.004825f, 0.004237f, 0.003598f, 0.002936f, 0.002278f, 0.001651f, 0.001083f, 0.000598f, 0.000214f, -0.000051f, -0.000186f, -0.014399f, -0.088918f, -0.104568f, 0.033774f, 0.006889f, -0.014211f, -0.339412f, -0.200382f, -0.197825f, -0.256243f, -0.049747f, 0.153723f, 0.189341f, 0.030845f, 0.049345f, 0.023389f, 0.124600f, -0.055314f, 0.034364f, 0.042592f, 0.009443f, 0.028243f, 0.002752f, -0.002188f, 0.008221f, -0.011938f, -0.027058f, 0.014048f, 0.003354f, -0.058375f, -0.073083f, -0.034868f, 0.005558f, -0.010350f, -0.046182f, -0.010972f, 0.053029f, 0.157632f, 0.016291f, -0.057067f, -0.213388f, 0.018673f, 0.169634f, 0.193574f, 0.145085f, -0.084971f, -0.237624f, -0.226809f, - -0.110297f, 0.096854f, 0.213419f, 0.198516f, 0.019172f, -0.167969f, -0.238403f, -0.157229f, -0.008594f, 0.166266f, 0.146397f, 0.056850f, 0.078227f, -0.230405f, -0.182536f, -0.000273f, 0.081119f, -0.082448f, 0.310260f, 0.369648f, 0.327330f, -0.054515f, -0.303985f, -0.330843f, 0.023930f, 0.249376f, 0.283462f, 0.082354f, -0.210615f, -0.253664f, -0.298859f, -0.051273f, 0.258919f, 0.344791f, 0.212825f, -0.062716f, -0.254123f, -0.228433f, 0.024020f, 0.174971f, 0.169038f, -0.016732f, -0.152145f, -0.181161f, -0.026750f, 0.108313f, 0.105190f, 0.005511f, -0.080886f, -0.175720f, -0.053616f, 0.124221f, 0.328626f, 0.269120f, -0.012363f, -0.366991f, -0.418201f, -0.179777f, 0.226324f, 0.502263f, 0.469250f, 0.157321f, -0.343881f, -0.631262f, -0.403278f, 0.113845f, 0.477319f, 0.374508f, -0.060622f, -0.349411f, -0.409097f, -0.083539f, 0.217155f, 0.263939f, 0.250254f, -0.057498f, -0.154273f, -0.182069f, -0.042848f, 0.108637f, 0.149146f, 0.048201f, -0.034839f, -0.113656f, -0.076942f, 0.021116f, 0.113304f, 0.085027f, 0.004350f, -0.092580f, -0.102413f, -0.029857f, 0.069689f, 0.114991f, 0.094846f, -0.030280f, - -0.136362f, -0.139061f, -0.036977f, 0.094935f, 0.173700f, 0.157429f, 0.014736f, -0.146953f, -0.191168f, -0.145844f, -0.001188f, 0.157952f, 0.198629f, 0.089918f, -0.075089f, -0.194002f, -0.170286f, -0.047141f, 0.122563f, 0.190138f, 0.123703f, -0.025843f, -0.186317f, -0.197764f, -0.034739f, 0.119741f, 0.200216f, 0.110432f, -0.010105f, -0.153690f, -0.166144f, -0.039158f, 0.099676f, 0.143215f, 0.059367f, -0.190863f, -0.163854f, 0.031416f, 0.208956f, 0.221929f, 0.042610f, -0.164837f, -0.219071f, -0.058930f, 0.162295f, 0.234901f, 0.081855f, -0.143458f, -0.211225f, -0.049183f, 0.162727f, 0.191917f, 0.007000f, -0.167170f, -0.118384f, 0.082358f, 0.149077f, -0.009682f, -0.097921f, 0.005018f, 0.046167f, 0.000346f, -0.005773f, 0.003501f, 0.005151f, 0.002723f, 0.003190f, 0.002225f, 0.003858f, 0.003725f, 0.004658f, 0.004453f, 0.001746f, 0.003153f, 0.002864f, 0.003655f, 0.003188f, 0.003292f, 0.001931f, 0.002658f, 0.001276f, 0.002184f, 0.003202f, 0.006402f, 0.002000f, 0.002265f, 0.000766f, 0.003939f, 0.004158f, 0.002916f, 0.002643f, 0.001368f, 0.002446f, 0.003088f, 0.003033f, 0.003336f} - }, - { - {0.020127f, 0.019564f, 0.018453f, 0.016824f, 0.014720f, 0.012199f, 0.009327f, 0.006183f, 0.002851f, -0.000580f, -0.004016f, -0.007366f, -0.010538f, -0.013447f, -0.016013f, -0.018166f, -0.019846f, -0.021005f, -0.021609f, -0.021638f, -0.021086f, -0.019962f, -0.018288f, -0.016102f, -0.013452f, -0.010398f, -0.007010f, -0.003364f, 0.000457f, 0.004367f, 0.008280f, 0.012111f, 0.015777f, 0.019202f, 0.022315f, 0.025057f, 0.027376f, 0.029232f, 0.030599f, 0.031461f, 0.031816f, 0.031671f, 0.031050f, 0.029982f, 0.028509f, 0.026681f, 0.024553f, 0.022187f, 0.019647f, 0.016999f, 0.014309f, 0.011639f, 0.009051f, 0.006600f, 0.004335f, 0.002298f, 0.000523f, -0.000965f, -0.002147f, -0.003018f, -0.003575f, -0.003830f, -0.003796f, -0.003497f, -0.002961f, -0.002220f, -0.001310f, -0.000270f, 0.000862f, 0.002046f, 0.003247f, 0.004427f, 0.005556f, 0.006605f, 0.007551f, 0.008374f, 0.009061f, 0.009603f, 0.009995f, 0.010239f, 0.010340f, 0.010305f, 0.010146f, 0.009877f, 0.009513f, 0.009072f, 0.008569f, 0.008021f, 0.007443f, 0.006849f, 0.006250f, 0.005657f, 0.005077f, 0.004514f, 0.003972f, 0.003449f, - 0.002944f, 0.002455f, 0.001975f, 0.001500f, 0.001023f, 0.000538f, 0.000041f, -0.000474f, -0.001008f, -0.001565f, -0.002143f, -0.002739f, -0.003350f, -0.003968f, -0.004586f, -0.005194f, -0.005780f, -0.006332f, -0.006838f, -0.007285f, -0.007661f, -0.007955f, -0.008158f, -0.008261f, -0.008260f, -0.008152f, -0.007935f, -0.007614f, -0.007193f, -0.006682f, -0.006092f, -0.005437f, -0.004733f, -0.003998f, -0.003250f, -0.002510f, -0.001797f, -0.001131f, -0.000530f, -0.000012f, 0.000409f, 0.000721f, 0.000914f, 0.000981f, 0.000920f, 0.000730f, 0.000417f, -0.000014f, -0.000552f, -0.001183f, -0.001893f, -0.002664f, -0.003477f, -0.004313f, -0.005151f, -0.005971f, -0.006755f, -0.007484f, -0.008143f, -0.008718f, -0.009198f, -0.009574f, -0.009842f, -0.009998f, -0.010043f, -0.009981f, -0.009818f, -0.009564f, -0.009227f, -0.008823f, -0.008363f, -0.007862f, -0.007336f, -0.006799f, -0.006264f, -0.005746f, -0.005254f, -0.004800f, -0.004392f, -0.004034f, -0.003731f, -0.003483f, -0.003291f, -0.003151f, -0.003060f, -0.003010f, -0.002994f, -0.003005f, -0.003033f, -0.003070f, -0.003107f, -0.003136f, -0.003149f, -0.003140f, -0.003105f, -0.003039f, - -0.002942f, -0.002813f, -0.002654f, -0.002466f, -0.002256f, -0.002028f, -0.001789f, -0.001546f, -0.001306f, -0.001077f, -0.000865f, -0.000678f, -0.000522f, -0.000401f, -0.000319f, -0.000279f, -0.000280f, -0.000323f, -0.000404f, -0.000522f, -0.000670f, -0.000842f, -0.001033f, -0.001235f, -0.001440f, -0.001639f, -0.001827f, -0.001996f, -0.002139f, -0.002251f, -0.002329f, -0.002369f, -0.002371f, -0.002334f, -0.002261f, -0.002154f, -0.002017f, -0.001856f, -0.001677f, -0.001488f, -0.001294f, -0.001105f, -0.000927f, -0.000766f, -0.000630f, -0.000523f, -0.000449f, -0.000412f, -0.014151f, 0.039337f, -0.009261f, -0.048279f, -0.015075f, 0.009931f, 0.016956f, 0.126611f, 0.199676f, 0.247669f, -0.052009f, -0.166393f, -0.248453f, -0.100524f, 0.104113f, 0.332347f, 0.192038f, 0.074604f, -0.098523f, -0.080987f, -0.048782f, 0.050214f, -0.015708f, -0.046663f, -0.035120f, -0.020731f, 0.024618f, 0.126910f, 0.109013f, 0.139900f, -0.066775f, -0.193711f, -0.186368f, -0.061481f, 0.134857f, 0.271718f, 0.167815f, -0.028485f, -0.220587f, -0.176122f, 0.052869f, 0.014749f, 0.044216f, 0.024563f, 0.012979f, -0.046201f, -0.072822f, 0.081452f, - 0.084678f, -0.086224f, -0.090877f, -0.104086f, -0.040794f, 0.029843f, 0.143701f, 0.103193f, 0.063207f, -0.055107f, -0.065673f, -0.095260f, -0.027833f, 0.096659f, 0.166484f, 0.103337f, 0.012089f, -0.106923f, -0.226200f, -0.244058f, -0.041068f, 0.180731f, 0.277362f, 0.277711f, 0.158361f, -0.095499f, -0.346798f, -0.338543f, -0.124445f, 0.158028f, 0.304308f, 0.289049f, 0.048713f, -0.175475f, -0.299394f, -0.229171f, 0.044670f, 0.173668f, 0.073384f, -0.087531f, -0.142934f, -0.123168f, 0.004141f, 0.079146f, 0.121943f, 0.095298f, 0.028484f, -0.076227f, -0.146192f, -0.055801f, 0.023663f, 0.107204f, 0.137803f, 0.026475f, -0.075617f, -0.157564f, -0.101773f, 0.032719f, 0.182020f, 0.145379f, -0.064918f, -0.190720f, -0.146656f, -0.008983f, 0.178396f, 0.219287f, 0.110936f, -0.157996f, -0.400782f, -0.284468f, 0.057294f, 0.286167f, 0.308590f, 0.056655f, -0.173065f, -0.257245f, -0.177888f, 0.080312f, 0.201813f, 0.215213f, 0.086871f, -0.098072f, -0.204441f, -0.162266f, -0.022601f, 0.186823f, 0.214745f, 0.125103f, -0.102279f, -0.251245f, -0.218701f, -0.022069f, 0.125565f, 0.222139f, 0.159612f, 0.010752f, - -0.169728f, -0.206679f, -0.085379f, 0.106638f, 0.118277f, 0.089598f, -0.024958f, -0.122614f, -0.092495f, -0.005718f, 0.053518f, 0.032109f, 0.013678f, -0.011855f, -0.023277f, -0.026915f, -0.025700f, -0.048447f, -0.015780f, 0.028899f, 0.060556f, 0.037983f, -0.004137f, -0.049395f, -0.051257f, -0.028121f, 0.004230f, 0.040847f, 0.064514f, 0.017160f, -0.019601f, -0.059654f, -0.043605f, 0.021966f, 0.007920f, -0.021072f, -0.040672f, 0.003927f, 0.038201f, 0.043360f, -0.010796f, -0.047209f, -0.039646f, 0.022779f, 0.053054f, 0.024522f, -0.037072f, -0.052419f, -0.009074f, 0.045387f, 0.042043f, -0.007891f, -0.054910f, -0.031857f, 0.030133f, 0.051439f, -0.008864f, -0.052426f, -0.007621f, 0.030137f, -0.000197f, -0.009380f, -0.000042f, -0.000829f, -0.002167f, -0.000541f, -0.000478f, -0.000541f, -0.000586f, 0.000333f, -0.001820f, -0.001863f, -0.001979f, -0.000635f, -0.001398f, -0.000042f, -0.001265f, -0.001653f, -0.001439f, -0.001095f, -0.003172f, -0.001245f, -0.000398f, 0.000360f, -0.000036f, -0.002032f, -0.000729f, -0.002114f, -0.001880f, -0.001614f, -0.001210f, 0.000266f, -0.000904f, -0.001292f, -0.000951f, -0.001328f}, - {0.020127f, 0.019564f, 0.018453f, 0.016824f, 0.014720f, 0.012199f, 0.009327f, 0.006183f, 0.002851f, -0.000580f, -0.004016f, -0.007366f, -0.010538f, -0.013447f, -0.016013f, -0.018166f, -0.019846f, -0.021005f, -0.021609f, -0.021638f, -0.021086f, -0.019962f, -0.018288f, -0.016102f, -0.013452f, -0.010398f, -0.007010f, -0.003364f, 0.000457f, 0.004367f, 0.008280f, 0.012111f, 0.015777f, 0.019202f, 0.022315f, 0.025057f, 0.027376f, 0.029232f, 0.030599f, 0.031461f, 0.031816f, 0.031671f, 0.031050f, 0.029982f, 0.028509f, 0.026681f, 0.024553f, 0.022187f, 0.019647f, 0.016999f, 0.014309f, 0.011639f, 0.009051f, 0.006600f, 0.004335f, 0.002298f, 0.000523f, -0.000965f, -0.002147f, -0.003018f, -0.003575f, -0.003830f, -0.003796f, -0.003497f, -0.002961f, -0.002220f, -0.001310f, -0.000270f, 0.000862f, 0.002046f, 0.003247f, 0.004427f, 0.005556f, 0.006605f, 0.007551f, 0.008374f, 0.009061f, 0.009603f, 0.009995f, 0.010239f, 0.010340f, 0.010305f, 0.010146f, 0.009877f, 0.009513f, 0.009072f, 0.008569f, 0.008021f, 0.007443f, 0.006849f, 0.006250f, 0.005657f, 0.005077f, 0.004514f, 0.003972f, 0.003449f, - 0.002944f, 0.002455f, 0.001975f, 0.001500f, 0.001023f, 0.000538f, 0.000041f, -0.000474f, -0.001008f, -0.001565f, -0.002143f, -0.002739f, -0.003350f, -0.003968f, -0.004586f, -0.005194f, -0.005780f, -0.006332f, -0.006838f, -0.007285f, -0.007661f, -0.007955f, -0.008158f, -0.008261f, -0.008260f, -0.008152f, -0.007935f, -0.007614f, -0.007193f, -0.006682f, -0.006092f, -0.005437f, -0.004733f, -0.003998f, -0.003250f, -0.002510f, -0.001797f, -0.001131f, -0.000530f, -0.000012f, 0.000409f, 0.000721f, 0.000914f, 0.000981f, 0.000920f, 0.000730f, 0.000417f, -0.000014f, -0.000552f, -0.001183f, -0.001893f, -0.002664f, -0.003477f, -0.004313f, -0.005151f, -0.005971f, -0.006755f, -0.007484f, -0.008143f, -0.008718f, -0.009198f, -0.009574f, -0.009842f, -0.009998f, -0.010043f, -0.009981f, -0.009818f, -0.009564f, -0.009227f, -0.008823f, -0.008363f, -0.007862f, -0.007336f, -0.006799f, -0.006264f, -0.005746f, -0.005254f, -0.004800f, -0.004392f, -0.004034f, -0.003731f, -0.003483f, -0.003291f, -0.003151f, -0.003060f, -0.003010f, -0.002994f, -0.003005f, -0.003033f, -0.003070f, -0.003107f, -0.003136f, -0.003149f, -0.003140f, -0.003105f, -0.003039f, - -0.002942f, -0.002813f, -0.002654f, -0.002466f, -0.002256f, -0.002028f, -0.001789f, -0.001546f, -0.001306f, -0.001077f, -0.000865f, -0.000678f, -0.000522f, -0.000401f, -0.000319f, -0.000279f, -0.000280f, -0.000323f, -0.000404f, -0.000522f, -0.000670f, -0.000842f, -0.001033f, -0.001235f, -0.001440f, -0.001639f, -0.001827f, -0.001996f, -0.002139f, -0.002251f, -0.002329f, -0.002369f, -0.002371f, -0.002334f, -0.002261f, -0.002154f, -0.002017f, -0.001856f, -0.001677f, -0.001488f, -0.001294f, -0.001105f, -0.000927f, -0.000766f, -0.000630f, -0.000523f, -0.000449f, -0.000412f, -0.014151f, 0.039337f, -0.009261f, -0.048279f, -0.015075f, 0.009931f, 0.016956f, 0.126611f, 0.199676f, 0.247669f, -0.052009f, -0.166393f, -0.248453f, -0.100524f, 0.104113f, 0.332347f, 0.192038f, 0.074604f, -0.098523f, -0.080987f, -0.048782f, 0.050214f, -0.015708f, -0.046663f, -0.035120f, -0.020731f, 0.024618f, 0.126910f, 0.109013f, 0.139900f, -0.066775f, -0.193711f, -0.186368f, -0.061481f, 0.134857f, 0.271718f, 0.167815f, -0.028485f, -0.220587f, -0.176122f, 0.052869f, 0.014749f, 0.044216f, 0.024563f, 0.012979f, -0.046201f, -0.072822f, 0.081452f, - 0.084678f, -0.086224f, -0.090877f, -0.104086f, -0.040794f, 0.029843f, 0.143701f, 0.103193f, 0.063207f, -0.055107f, -0.065673f, -0.095260f, -0.027833f, 0.096659f, 0.166484f, 0.103337f, 0.012089f, -0.106923f, -0.226200f, -0.244058f, -0.041068f, 0.180731f, 0.277362f, 0.277711f, 0.158361f, -0.095499f, -0.346798f, -0.338543f, -0.124445f, 0.158028f, 0.304308f, 0.289049f, 0.048713f, -0.175475f, -0.299394f, -0.229171f, 0.044670f, 0.173668f, 0.073384f, -0.087531f, -0.142934f, -0.123168f, 0.004141f, 0.079146f, 0.121943f, 0.095298f, 0.028484f, -0.076227f, -0.146192f, -0.055801f, 0.023663f, 0.107204f, 0.137803f, 0.026475f, -0.075617f, -0.157564f, -0.101773f, 0.032719f, 0.182020f, 0.145379f, -0.064918f, -0.190720f, -0.146656f, -0.008983f, 0.178396f, 0.219287f, 0.110936f, -0.157996f, -0.400782f, -0.284468f, 0.057294f, 0.286167f, 0.308590f, 0.056655f, -0.173065f, -0.257245f, -0.177888f, 0.080312f, 0.201813f, 0.215213f, 0.086871f, -0.098072f, -0.204441f, -0.162266f, -0.022601f, 0.186823f, 0.214745f, 0.125103f, -0.102279f, -0.251245f, -0.218701f, -0.022069f, 0.125565f, 0.222139f, 0.159612f, 0.010752f, - -0.169728f, -0.206679f, -0.085379f, 0.106638f, 0.118277f, 0.089598f, -0.024958f, -0.122614f, -0.092495f, -0.005718f, 0.053518f, 0.032109f, 0.013678f, -0.011855f, -0.023277f, -0.026915f, -0.025700f, -0.048447f, -0.015780f, 0.028899f, 0.060556f, 0.037983f, -0.004137f, -0.049395f, -0.051257f, -0.028121f, 0.004230f, 0.040847f, 0.064514f, 0.017160f, -0.019601f, -0.059654f, -0.043605f, 0.021966f, 0.007920f, -0.021072f, -0.040672f, 0.003927f, 0.038201f, 0.043360f, -0.010796f, -0.047209f, -0.039646f, 0.022779f, 0.053054f, 0.024522f, -0.037072f, -0.052419f, -0.009074f, 0.045387f, 0.042043f, -0.007891f, -0.054910f, -0.031857f, 0.030133f, 0.051439f, -0.008864f, -0.052426f, -0.007621f, 0.030137f, -0.000197f, -0.009380f, -0.000042f, -0.000829f, -0.002167f, -0.000541f, -0.000478f, -0.000541f, -0.000586f, 0.000333f, -0.001820f, -0.001863f, -0.001979f, -0.000635f, -0.001398f, -0.000042f, -0.001265f, -0.001653f, -0.001439f, -0.001095f, -0.003172f, -0.001245f, -0.000398f, 0.000360f, -0.000036f, -0.002032f, -0.000729f, -0.002114f, -0.001880f, -0.001614f, -0.001210f, 0.000266f, -0.000904f, -0.001292f, -0.000951f, -0.001328f} - }, - { - {0.011383f, 0.011186f, 0.010798f, 0.010228f, 0.009495f, 0.008617f, 0.007619f, 0.006530f, 0.005379f, 0.004198f, 0.003020f, 0.001877f, 0.000801f, -0.000180f, -0.001039f, -0.001754f, -0.002305f, -0.002679f, -0.002866f, -0.002863f, -0.002671f, -0.002297f, -0.001751f, -0.001049f, -0.000213f, 0.000736f, 0.001769f, 0.002860f, 0.003977f, 0.005090f, 0.006167f, 0.007180f, 0.008098f, 0.008897f, 0.009550f, 0.010038f, 0.010342f, 0.010448f, 0.010346f, 0.010029f, 0.009494f, 0.008744f, 0.007781f, 0.006616f, 0.005259f, 0.003724f, 0.002030f, 0.000194f, -0.001760f, -0.003810f, -0.005932f, -0.008100f, -0.010287f, -0.012466f, -0.014611f, -0.016694f, -0.018689f, -0.020570f, -0.022310f, -0.023887f, -0.025276f, -0.026459f, -0.027414f, -0.028127f, -0.028584f, -0.028773f, -0.028687f, -0.028323f, -0.027682f, -0.026767f, -0.025588f, -0.024158f, -0.022495f, -0.020621f, -0.018562f, -0.016349f, -0.014016f, -0.011601f, -0.009142f, -0.006681f, -0.004261f, -0.001924f, 0.000288f, 0.002333f, 0.004175f, 0.005779f, 0.007115f, 0.008157f, 0.008887f, 0.009291f, 0.009362f, 0.009103f, 0.008519f, 0.007627f, 0.006447f, 0.005008f, - 0.003342f, 0.001488f, -0.000513f, -0.002614f, -0.004769f, -0.006931f, -0.009053f, -0.011090f, -0.012999f, -0.014742f, -0.016286f, -0.017602f, -0.018670f, -0.019473f, -0.020004f, -0.020262f, -0.020253f, -0.019988f, -0.019486f, -0.018769f, -0.017865f, -0.016804f, -0.015621f, -0.014348f, -0.013021f, -0.011673f, -0.010336f, -0.009039f, -0.007807f, -0.006662f, -0.005620f, -0.004694f, -0.003891f, -0.003213f, -0.002657f, -0.002218f, -0.001887f, -0.001650f, -0.001494f, -0.001403f, -0.001361f, -0.001353f, -0.001366f, -0.001388f, -0.001409f, -0.001423f, -0.001429f, -0.001427f, -0.001421f, -0.001419f, -0.001432f, -0.001474f, -0.001558f, -0.001701f, -0.001918f, -0.002226f, -0.002637f, -0.003164f, -0.003813f, -0.004590f, -0.005495f, -0.006523f, -0.007664f, -0.008904f, -0.010222f, -0.011597f, -0.012999f, -0.014398f, -0.015761f, -0.017054f, -0.018242f, -0.019293f, -0.020174f, -0.020858f, -0.021319f, -0.021540f, -0.021508f, -0.021214f, -0.020661f, -0.019854f, -0.018808f, -0.017544f, -0.016088f, -0.014473f, -0.012735f, -0.010915f, -0.009056f, -0.007200f, -0.005391f, -0.003671f, -0.002079f, -0.000649f, 0.000588f, 0.001610f, 0.002400f, 0.002946f, - 0.003247f, 0.003307f, 0.003139f, 0.002759f, 0.002194f, 0.001472f, 0.000626f, -0.000308f, -0.001292f, -0.002288f, -0.003259f, -0.004171f, -0.004993f, -0.005697f, -0.006262f, -0.006673f, -0.006919f, -0.006999f, -0.006914f, -0.006675f, -0.006296f, -0.005798f, -0.005204f, -0.004543f, -0.003843f, -0.003135f, -0.002447f, -0.001809f, -0.001247f, -0.000781f, -0.000432f, -0.000211f, -0.000127f, -0.000181f, -0.000371f, -0.000686f, -0.001113f, -0.001634f, -0.002227f, -0.002866f, -0.003526f, -0.004179f, -0.004798f, -0.005358f, -0.005836f, -0.006213f, -0.006472f, -0.006605f, -0.006998f, -0.007302f, -0.009285f, 0.001946f, -0.011202f, 0.010434f, 0.038234f, 0.047188f, -0.002116f, -0.058181f, -0.008719f, 0.080501f, 0.166412f, 0.130947f, -0.065633f, -0.225874f, -0.117186f, -0.107285f, 0.050453f, 0.030896f, 0.014089f, 0.071935f, 0.123050f, -0.050048f, -0.131004f, -0.054090f, -0.035697f, 0.042958f, 0.121916f, 0.060453f, 0.081295f, 0.027237f, -0.106500f, -0.090785f, 0.011481f, 0.130883f, 0.113592f, -0.013612f, -0.075622f, -0.126169f, -0.000034f, 0.128718f, 0.118850f, 0.055358f, -0.030814f, -0.126930f, -0.098443f, -0.013206f, - 0.018041f, 0.043026f, 0.047928f, 0.037975f, 0.072457f, 0.009024f, -0.006488f, -0.029939f, -0.004033f, -0.046866f, 0.070776f, 0.124386f, -0.027794f, 0.103948f, -0.013067f, -0.156957f, -0.037500f, 0.088757f, -0.010331f, -0.103131f, -0.114647f, -0.056834f, 0.032948f, 0.110615f, 0.105636f, 0.060598f, -0.099175f, -0.162321f, -0.043659f, 0.147583f, 0.177857f, 0.058867f, -0.097171f, -0.095133f, -0.074913f, 0.003973f, 0.109863f, 0.126805f, -0.001215f, -0.145587f, -0.148811f, -0.063469f, 0.092143f, 0.033766f, 0.070635f, -0.014765f, -0.100284f, -0.089819f, -0.043569f, 0.207105f, 0.117878f, 0.040455f, -0.028645f, 0.085072f, 0.048328f, -0.025363f, -0.123722f, -0.096264f, -0.020690f, 0.122851f, 0.058308f, -0.063702f, -0.178735f, -0.082291f, 0.092825f, 0.204646f, 0.098992f, -0.009351f, -0.211555f, -0.163706f, 0.059042f, 0.248569f, 0.221289f, 0.081352f, -0.128114f, -0.192953f, -0.174097f, 0.017787f, 0.113572f, 0.193936f, 0.059321f, -0.062213f, -0.151698f, -0.104186f, -0.003643f, 0.200419f, 0.139390f, 0.049724f, -0.128159f, -0.239877f, -0.153039f, 0.088733f, 0.245812f, 0.272284f, 0.112405f, -0.061009f, - -0.183121f, -0.122927f, -0.031436f, 0.095909f, 0.145585f, 0.070347f, -0.057318f, -0.123796f, -0.075604f, 0.118445f, 0.162034f, 0.039343f, -0.068750f, -0.141701f, -0.113409f, -0.023384f, 0.063457f, 0.098375f, 0.066934f, -0.001273f, -0.103206f, -0.120582f, -0.057365f, 0.041736f, 0.106670f, 0.098947f, 0.033093f, -0.058760f, -0.120056f, -0.095522f, -0.028166f, 0.051268f, 0.123035f, 0.071960f, -0.077613f, -0.397179f, -0.228099f, 0.207627f, 0.479767f, 0.380003f, -0.052829f, -0.415736f, -0.418186f, -0.015359f, 0.398178f, 0.458893f, 0.078948f, -0.354241f, -0.424500f, -0.050655f, 0.355875f, 0.371308f, -0.011293f, -0.334910f, -0.239494f, 0.144311f, 0.290245f, 0.014109f, -0.190746f, -0.022066f, 0.084360f, 0.014742f, -0.009296f, 0.002098f, 0.004677f, 0.006425f, 0.003394f, 0.005549f, 0.002100f, 0.002641f, 0.002453f, 0.001752f, 0.003888f, 0.004496f, 0.000021f, 0.003081f, 0.002653f, 0.005549f, 0.001527f, 0.004676f, 0.003669f, 0.002300f, 0.003097f, 0.003088f, 0.003046f, 0.005155f, 0.004289f, 0.004373f, 0.002084f, 0.002798f, 0.003251f, 0.003214f, 0.005724f, 0.003667f, 0.004292f, 0.004786f}, - {-0.011383f, -0.011186f, -0.010798f, -0.010228f, -0.009495f, -0.008617f, -0.007619f, -0.006530f, -0.005379f, -0.004198f, -0.003020f, -0.001877f, -0.000801f, 0.000180f, 0.001039f, 0.001754f, 0.002305f, 0.002679f, 0.002866f, 0.002863f, 0.002671f, 0.002297f, 0.001751f, 0.001049f, 0.000213f, -0.000736f, -0.001769f, -0.002860f, -0.003977f, -0.005090f, -0.006167f, -0.007180f, -0.008098f, -0.008897f, -0.009550f, -0.010038f, -0.010342f, -0.010448f, -0.010346f, -0.010029f, -0.009494f, -0.008744f, -0.007781f, -0.006616f, -0.005259f, -0.003724f, -0.002030f, -0.000194f, 0.001760f, 0.003810f, 0.005932f, 0.008100f, 0.010287f, 0.012466f, 0.014611f, 0.016694f, 0.018689f, 0.020570f, 0.022310f, 0.023887f, 0.025276f, 0.026459f, 0.027414f, 0.028127f, 0.028584f, 0.028773f, 0.028687f, 0.028323f, 0.027682f, 0.026767f, 0.025588f, 0.024158f, 0.022495f, 0.020621f, 0.018562f, 0.016349f, 0.014016f, 0.011601f, 0.009142f, 0.006681f, 0.004261f, 0.001924f, -0.000288f, -0.002333f, -0.004175f, -0.005779f, -0.007115f, -0.008157f, -0.008887f, -0.009291f, -0.009362f, -0.009103f, -0.008519f, -0.007627f, -0.006447f, -0.005008f, - -0.003342f, -0.001488f, 0.000513f, 0.002614f, 0.004769f, 0.006931f, 0.009053f, 0.011090f, 0.012999f, 0.014742f, 0.016286f, 0.017602f, 0.018670f, 0.019473f, 0.020004f, 0.020262f, 0.020253f, 0.019988f, 0.019486f, 0.018769f, 0.017865f, 0.016804f, 0.015621f, 0.014348f, 0.013021f, 0.011673f, 0.010336f, 0.009039f, 0.007807f, 0.006662f, 0.005620f, 0.004694f, 0.003891f, 0.003213f, 0.002657f, 0.002218f, 0.001887f, 0.001650f, 0.001494f, 0.001403f, 0.001361f, 0.001353f, 0.001366f, 0.001388f, 0.001409f, 0.001423f, 0.001429f, 0.001427f, 0.001421f, 0.001419f, 0.001432f, 0.001474f, 0.001558f, 0.001701f, 0.001918f, 0.002226f, 0.002637f, 0.003164f, 0.003813f, 0.004590f, 0.005495f, 0.006523f, 0.007664f, 0.008904f, 0.010222f, 0.011597f, 0.012999f, 0.014398f, 0.015761f, 0.017054f, 0.018242f, 0.019293f, 0.020174f, 0.020858f, 0.021319f, 0.021540f, 0.021508f, 0.021214f, 0.020661f, 0.019854f, 0.018808f, 0.017544f, 0.016088f, 0.014473f, 0.012735f, 0.010915f, 0.009056f, 0.007200f, 0.005391f, 0.003671f, 0.002079f, 0.000649f, -0.000588f, -0.001610f, -0.002400f, -0.002946f, - -0.003247f, -0.003307f, -0.003139f, -0.002759f, -0.002194f, -0.001472f, -0.000626f, 0.000308f, 0.001292f, 0.002288f, 0.003259f, 0.004171f, 0.004993f, 0.005697f, 0.006262f, 0.006673f, 0.006919f, 0.006999f, 0.006914f, 0.006675f, 0.006296f, 0.005798f, 0.005204f, 0.004543f, 0.003843f, 0.003135f, 0.002447f, 0.001809f, 0.001247f, 0.000781f, 0.000432f, 0.000211f, 0.000127f, 0.000181f, 0.000371f, 0.000686f, 0.001113f, 0.001634f, 0.002227f, 0.002866f, 0.003526f, 0.004179f, 0.004798f, 0.005358f, 0.005836f, 0.006213f, 0.006472f, 0.006605f, 0.006998f, 0.007302f, 0.009285f, -0.001946f, 0.011202f, -0.010434f, -0.038234f, -0.047188f, 0.002116f, 0.058181f, 0.008719f, -0.080501f, -0.166412f, -0.130947f, 0.065633f, 0.225874f, 0.117186f, 0.107285f, -0.050453f, -0.030896f, -0.014089f, -0.071935f, -0.123050f, 0.050048f, 0.131004f, 0.054090f, 0.035697f, -0.042958f, -0.121916f, -0.060453f, -0.081295f, -0.027237f, 0.106500f, 0.090785f, -0.011481f, -0.130883f, -0.113592f, 0.013612f, 0.075622f, 0.126169f, 0.000034f, -0.128718f, -0.118850f, -0.055358f, 0.030814f, 0.126930f, 0.098443f, 0.013206f, - -0.018041f, -0.043026f, -0.047928f, -0.037975f, -0.072457f, -0.009024f, 0.006488f, 0.029939f, 0.004033f, 0.046866f, -0.070776f, -0.124386f, 0.027794f, -0.103948f, 0.013067f, 0.156957f, 0.037500f, -0.088757f, 0.010331f, 0.103131f, 0.114647f, 0.056834f, -0.032948f, -0.110615f, -0.105636f, -0.060598f, 0.099175f, 0.162321f, 0.043659f, -0.147583f, -0.177857f, -0.058867f, 0.097171f, 0.095133f, 0.074913f, -0.003973f, -0.109863f, -0.126805f, 0.001215f, 0.145587f, 0.148811f, 0.063469f, -0.092143f, -0.033766f, -0.070635f, 0.014765f, 0.100284f, 0.089819f, 0.043569f, -0.207105f, -0.117878f, -0.040455f, 0.028645f, -0.085072f, -0.048328f, 0.025363f, 0.123722f, 0.096264f, 0.020690f, -0.122851f, -0.058308f, 0.063702f, 0.178735f, 0.082291f, -0.092825f, -0.204646f, -0.098992f, 0.009351f, 0.211555f, 0.163706f, -0.059042f, -0.248569f, -0.221289f, -0.081352f, 0.128114f, 0.192953f, 0.174097f, -0.017787f, -0.113572f, -0.193936f, -0.059321f, 0.062213f, 0.151698f, 0.104186f, 0.003643f, -0.200419f, -0.139390f, -0.049724f, 0.128159f, 0.239877f, 0.153039f, -0.088733f, -0.245812f, -0.272284f, -0.112405f, 0.061009f, - 0.183121f, 0.122927f, 0.031436f, -0.095909f, -0.145585f, -0.070347f, 0.057318f, 0.123796f, 0.075604f, -0.118445f, -0.162034f, -0.039343f, 0.068750f, 0.141701f, 0.113409f, 0.023384f, -0.063457f, -0.098375f, -0.066934f, 0.001273f, 0.103206f, 0.120582f, 0.057365f, -0.041736f, -0.106670f, -0.098947f, -0.033093f, 0.058760f, 0.120056f, 0.095522f, 0.028166f, -0.051268f, -0.123035f, -0.071960f, 0.077613f, 0.397179f, 0.228099f, -0.207627f, -0.479767f, -0.380003f, 0.052829f, 0.415736f, 0.418186f, 0.015359f, -0.398178f, -0.458893f, -0.078948f, 0.354241f, 0.424500f, 0.050655f, -0.355875f, -0.371308f, 0.011293f, 0.334910f, 0.239494f, -0.144311f, -0.290245f, -0.014109f, 0.190746f, 0.022066f, -0.084360f, -0.014742f, 0.009296f, -0.002098f, -0.004677f, -0.006425f, -0.003394f, -0.005549f, -0.002100f, -0.002641f, -0.002453f, -0.001752f, -0.003888f, -0.004496f, -0.000021f, -0.003081f, -0.002653f, -0.005549f, -0.001527f, -0.004676f, -0.003669f, -0.002300f, -0.003097f, -0.003088f, -0.003046f, -0.005155f, -0.004289f, -0.004373f, -0.002084f, -0.002798f, -0.003251f, -0.003214f, -0.005724f, -0.003667f, -0.004292f, -0.004786f} - }, - { - {0.004457f, 0.004803f, 0.005482f, 0.006472f, 0.007739f, 0.009242f, 0.010928f, 0.012742f, 0.014622f, 0.016505f, 0.018326f, 0.020024f, 0.021540f, 0.022823f, 0.023827f, 0.024516f, 0.024865f, 0.024857f, 0.024487f, 0.023764f, 0.022702f, 0.021331f, 0.019685f, 0.017808f, 0.015751f, 0.013567f, 0.011312f, 0.009044f, 0.006818f, 0.004688f, 0.002701f, 0.000900f, -0.000681f, -0.002014f, -0.003083f, -0.003877f, -0.004396f, -0.004649f, -0.004651f, -0.004424f, -0.003997f, -0.003402f, -0.002673f, -0.001845f, -0.000955f, -0.000035f, 0.000883f, 0.001776f, 0.002621f, 0.003406f, 0.004122f, 0.004769f, 0.005351f, 0.005881f, 0.006376f, 0.006856f, 0.007348f, 0.007876f, 0.008469f, 0.009152f, 0.009951f, 0.010886f, 0.011973f, 0.013223f, 0.014638f, 0.016216f, 0.017947f, 0.019811f, 0.021784f, 0.023835f, 0.025926f, 0.028015f, 0.030057f, 0.032006f, 0.033814f, 0.035436f, 0.036827f, 0.037950f, 0.038769f, 0.039260f, 0.039401f, 0.039184f, 0.038605f, 0.037672f, 0.036400f, 0.034814f, 0.032946f, 0.030833f, 0.028519f, 0.026053f, 0.023486f, 0.020868f, 0.018251f, 0.015685f, 0.013215f, 0.010884f, - 0.008726f, 0.006771f, 0.005041f, 0.003550f, 0.002304f, 0.001302f, 0.000536f, -0.000009f, -0.000353f, -0.000522f, -0.000543f, -0.000448f, -0.000269f, -0.000037f, 0.000218f, 0.000468f, 0.000688f, 0.000859f, 0.000966f, 0.000998f, 0.000950f, 0.000823f, 0.000622f, 0.000355f, 0.000037f, -0.000316f, -0.000687f, -0.001057f, -0.001407f, -0.001718f, -0.001974f, -0.002160f, -0.002268f, -0.002288f, -0.002220f, -0.002063f, -0.001823f, -0.001509f, -0.001134f, -0.000713f, -0.000264f, 0.000194f, 0.000641f, 0.001059f, 0.001430f, 0.001737f, 0.001967f, 0.002112f, 0.002164f, 0.002123f, 0.001991f, 0.001774f, 0.001484f, 0.001134f, 0.000742f, 0.000328f, -0.000088f, -0.000484f, -0.000839f, -0.001133f, -0.001349f, -0.001470f, -0.001486f, -0.001391f, -0.001180f, -0.000856f, -0.000427f, 0.000098f, 0.000702f, 0.001366f, 0.002069f, 0.002786f, 0.003493f, 0.004165f, 0.004776f, 0.005304f, 0.005731f, 0.006038f, 0.006215f, 0.006253f, 0.006152f, 0.005915f, 0.005548f, 0.005068f, 0.004490f, 0.003838f, 0.003135f, 0.002410f, 0.001691f, 0.001006f, 0.000382f, -0.000155f, -0.000582f, -0.000882f, -0.001040f, -0.001049f, - -0.000904f, -0.000608f, -0.000171f, 0.000394f, 0.001069f, 0.001831f, 0.002653f, 0.003506f, 0.004360f, 0.005185f, 0.005952f, 0.006632f, 0.007202f, 0.007642f, 0.007935f, 0.008072f, 0.008047f, 0.007864f, 0.007529f, 0.007055f, 0.006461f, 0.005769f, 0.005006f, 0.004202f, 0.003387f, 0.002591f, 0.001847f, 0.001180f, 0.000619f, 0.000183f, -0.000111f, -0.000251f, -0.000231f, -0.000053f, 0.000277f, 0.000747f, 0.001339f, 0.002030f, 0.002795f, 0.003604f, 0.004428f, 0.005234f, 0.005992f, 0.006673f, 0.007253f, 0.007707f, 0.008020f, 0.008180f, -0.023080f, 0.017255f, 0.009678f, -0.011088f, -0.020983f, -0.001735f, -0.031981f, -0.037461f, -0.201735f, -0.238518f, 0.004204f, 0.076735f, -0.004756f, -0.025361f, 0.027211f, -0.019033f, -0.058846f, 0.013061f, 0.041154f, -0.003229f, 0.085427f, -0.052678f, -0.014999f, -0.044477f, -0.016524f, 0.051942f, 0.048424f, 0.116574f, -0.062608f, -0.053412f, -0.032905f, 0.028786f, 0.000561f, -0.050637f, -0.047139f, -0.023233f, -0.032433f, 0.069848f, 0.044266f, -0.030568f, -0.045929f, -0.046424f, 0.023603f, 0.074502f, 0.070463f, -0.006424f, -0.108626f, -0.071322f, - -0.065093f, -0.085552f, -0.010056f, 0.075042f, 0.070567f, -0.019741f, -0.089702f, -0.097700f, -0.063491f, 0.066151f, 0.096163f, 0.062052f, 0.045207f, -0.175419f, -0.159971f, -0.014387f, 0.038870f, 0.002240f, 0.236593f, 0.087543f, 0.026099f, -0.086112f, -0.066294f, 0.050274f, 0.187045f, 0.211058f, 0.034819f, -0.105354f, -0.116580f, -0.240834f, -0.192060f, 0.078708f, 0.199071f, 0.082504f, -0.059802f, -0.031618f, -0.213500f, -0.340961f, -0.088397f, 0.032796f, 0.193430f, 0.127659f, 0.018922f, -0.218201f, -0.213684f, -0.116907f, 0.089426f, 0.147526f, 0.155369f, -0.095128f, -0.145553f, -0.076523f, 0.099395f, 0.167693f, 0.163064f, -0.059897f, -0.186886f, -0.196185f, 0.021562f, 0.203422f, 0.303995f, 0.158257f, -0.137884f, -0.372733f, -0.355944f, -0.040808f, 0.262717f, 0.219980f, 0.026477f, -0.109705f, -0.250266f, -0.199136f, 0.000263f, 0.170630f, 0.232540f, 0.046589f, -0.047705f, -0.178808f, -0.204458f, -0.049330f, 0.114216f, 0.180834f, 0.138758f, -0.029559f, -0.178497f, -0.209665f, -0.022738f, 0.159440f, 0.212599f, 0.085953f, -0.080565f, -0.190275f, -0.193684f, -0.061446f, 0.104574f, 0.120742f, - 0.040625f, -0.046597f, -0.077670f, -0.083227f, -0.093542f, -0.005046f, 0.070144f, 0.088945f, 0.023759f, -0.074423f, -0.140730f, -0.082456f, 0.043191f, 0.076740f, 0.089912f, 0.022335f, -0.065760f, -0.120857f, -0.075501f, 0.019147f, 0.067641f, 0.067659f, 0.025161f, -0.039109f, -0.032581f, -0.025880f, 0.021715f, 0.001680f, 0.027937f, -0.033921f, -0.038421f, -0.045726f, 0.025639f, 0.023107f, 0.040383f, -0.095445f, -0.189905f, -0.084207f, 0.077202f, 0.183977f, 0.127790f, -0.042108f, -0.183065f, -0.152692f, 0.018627f, 0.170712f, 0.153600f, -0.027257f, -0.179305f, -0.143176f, 0.046629f, 0.169116f, 0.086310f, -0.100029f, -0.154624f, -0.007877f, 0.127514f, 0.040025f, -0.086180f, -0.030789f, 0.034832f, -0.000504f, -0.015469f, -0.005420f, -0.004356f, -0.003216f, -0.001101f, -0.003867f, -0.002833f, -0.004278f, -0.004491f, -0.003796f, -0.003657f, -0.005810f, -0.005043f, -0.007314f, -0.003679f, -0.003831f, -0.004629f, -0.007485f, -0.004645f, -0.006691f, -0.002879f, -0.005852f, -0.006690f, -0.006330f, -0.008273f, -0.004149f, -0.005079f, -0.003481f, -0.008020f, -0.004895f, -0.004774f, -0.003941f, -0.002730f, -0.007628f}, - {-0.004457f, -0.004803f, -0.005482f, -0.006472f, -0.007739f, -0.009242f, -0.010928f, -0.012742f, -0.014622f, -0.016505f, -0.018326f, -0.020024f, -0.021540f, -0.022823f, -0.023827f, -0.024516f, -0.024865f, -0.024857f, -0.024487f, -0.023764f, -0.022702f, -0.021331f, -0.019685f, -0.017808f, -0.015751f, -0.013567f, -0.011312f, -0.009044f, -0.006818f, -0.004688f, -0.002701f, -0.000900f, 0.000681f, 0.002014f, 0.003083f, 0.003877f, 0.004396f, 0.004649f, 0.004651f, 0.004424f, 0.003997f, 0.003402f, 0.002673f, 0.001845f, 0.000955f, 0.000035f, -0.000883f, -0.001776f, -0.002621f, -0.003406f, -0.004122f, -0.004769f, -0.005351f, -0.005881f, -0.006376f, -0.006856f, -0.007348f, -0.007876f, -0.008469f, -0.009152f, -0.009951f, -0.010886f, -0.011973f, -0.013223f, -0.014638f, -0.016216f, -0.017947f, -0.019811f, -0.021784f, -0.023835f, -0.025926f, -0.028015f, -0.030057f, -0.032006f, -0.033814f, -0.035436f, -0.036827f, -0.037950f, -0.038769f, -0.039260f, -0.039401f, -0.039184f, -0.038605f, -0.037672f, -0.036400f, -0.034814f, -0.032946f, -0.030833f, -0.028519f, -0.026053f, -0.023486f, -0.020868f, -0.018251f, -0.015685f, -0.013215f, -0.010884f, - -0.008726f, -0.006771f, -0.005041f, -0.003550f, -0.002304f, -0.001302f, -0.000536f, 0.000009f, 0.000353f, 0.000522f, 0.000543f, 0.000448f, 0.000269f, 0.000037f, -0.000218f, -0.000468f, -0.000688f, -0.000859f, -0.000966f, -0.000998f, -0.000950f, -0.000823f, -0.000622f, -0.000355f, -0.000037f, 0.000316f, 0.000687f, 0.001057f, 0.001407f, 0.001718f, 0.001974f, 0.002160f, 0.002268f, 0.002288f, 0.002220f, 0.002063f, 0.001823f, 0.001509f, 0.001134f, 0.000713f, 0.000264f, -0.000194f, -0.000641f, -0.001059f, -0.001430f, -0.001737f, -0.001967f, -0.002112f, -0.002164f, -0.002123f, -0.001991f, -0.001774f, -0.001484f, -0.001134f, -0.000742f, -0.000328f, 0.000088f, 0.000484f, 0.000839f, 0.001133f, 0.001349f, 0.001470f, 0.001486f, 0.001391f, 0.001180f, 0.000856f, 0.000427f, -0.000098f, -0.000702f, -0.001366f, -0.002069f, -0.002786f, -0.003493f, -0.004165f, -0.004776f, -0.005304f, -0.005731f, -0.006038f, -0.006215f, -0.006253f, -0.006152f, -0.005915f, -0.005548f, -0.005068f, -0.004490f, -0.003838f, -0.003135f, -0.002410f, -0.001691f, -0.001006f, -0.000382f, 0.000155f, 0.000582f, 0.000882f, 0.001040f, 0.001049f, - 0.000904f, 0.000608f, 0.000171f, -0.000394f, -0.001069f, -0.001831f, -0.002653f, -0.003506f, -0.004360f, -0.005185f, -0.005952f, -0.006632f, -0.007202f, -0.007642f, -0.007935f, -0.008072f, -0.008047f, -0.007864f, -0.007529f, -0.007055f, -0.006461f, -0.005769f, -0.005006f, -0.004202f, -0.003387f, -0.002591f, -0.001847f, -0.001180f, -0.000619f, -0.000183f, 0.000111f, 0.000251f, 0.000231f, 0.000053f, -0.000277f, -0.000747f, -0.001339f, -0.002030f, -0.002795f, -0.003604f, -0.004428f, -0.005234f, -0.005992f, -0.006673f, -0.007253f, -0.007707f, -0.008020f, -0.008180f, 0.023080f, -0.017255f, -0.009678f, 0.011088f, 0.020983f, 0.001735f, 0.031981f, 0.037461f, 0.201735f, 0.238518f, -0.004204f, -0.076735f, 0.004756f, 0.025361f, -0.027211f, 0.019033f, 0.058846f, -0.013061f, -0.041154f, 0.003229f, -0.085427f, 0.052678f, 0.014999f, 0.044477f, 0.016524f, -0.051942f, -0.048424f, -0.116574f, 0.062608f, 0.053412f, 0.032905f, -0.028786f, -0.000561f, 0.050637f, 0.047139f, 0.023233f, 0.032433f, -0.069848f, -0.044266f, 0.030568f, 0.045929f, 0.046424f, -0.023603f, -0.074502f, -0.070463f, 0.006424f, 0.108626f, 0.071322f, - 0.065093f, 0.085552f, 0.010056f, -0.075042f, -0.070567f, 0.019741f, 0.089702f, 0.097700f, 0.063491f, -0.066151f, -0.096163f, -0.062052f, -0.045207f, 0.175419f, 0.159971f, 0.014387f, -0.038870f, -0.002240f, -0.236593f, -0.087543f, -0.026099f, 0.086112f, 0.066294f, -0.050274f, -0.187045f, -0.211058f, -0.034819f, 0.105354f, 0.116580f, 0.240834f, 0.192060f, -0.078708f, -0.199071f, -0.082504f, 0.059802f, 0.031618f, 0.213500f, 0.340961f, 0.088397f, -0.032796f, -0.193430f, -0.127659f, -0.018922f, 0.218201f, 0.213684f, 0.116907f, -0.089426f, -0.147526f, -0.155369f, 0.095128f, 0.145553f, 0.076523f, -0.099395f, -0.167693f, -0.163064f, 0.059897f, 0.186886f, 0.196185f, -0.021562f, -0.203422f, -0.303995f, -0.158257f, 0.137884f, 0.372733f, 0.355944f, 0.040808f, -0.262717f, -0.219980f, -0.026477f, 0.109705f, 0.250266f, 0.199136f, -0.000263f, -0.170630f, -0.232540f, -0.046589f, 0.047705f, 0.178808f, 0.204458f, 0.049330f, -0.114216f, -0.180834f, -0.138758f, 0.029559f, 0.178497f, 0.209665f, 0.022738f, -0.159440f, -0.212599f, -0.085953f, 0.080565f, 0.190275f, 0.193684f, 0.061446f, -0.104574f, -0.120742f, - -0.040625f, 0.046597f, 0.077670f, 0.083227f, 0.093542f, 0.005046f, -0.070144f, -0.088945f, -0.023759f, 0.074423f, 0.140730f, 0.082456f, -0.043191f, -0.076740f, -0.089912f, -0.022335f, 0.065760f, 0.120857f, 0.075501f, -0.019147f, -0.067641f, -0.067659f, -0.025161f, 0.039109f, 0.032581f, 0.025880f, -0.021715f, -0.001680f, -0.027937f, 0.033921f, 0.038421f, 0.045726f, -0.025639f, -0.023107f, -0.040383f, 0.095445f, 0.189905f, 0.084207f, -0.077202f, -0.183977f, -0.127790f, 0.042108f, 0.183065f, 0.152692f, -0.018627f, -0.170712f, -0.153600f, 0.027257f, 0.179305f, 0.143176f, -0.046629f, -0.169116f, -0.086310f, 0.100029f, 0.154624f, 0.007877f, -0.127514f, -0.040025f, 0.086180f, 0.030789f, -0.034832f, 0.000504f, 0.015469f, 0.005420f, 0.004356f, 0.003216f, 0.001101f, 0.003867f, 0.002833f, 0.004278f, 0.004491f, 0.003796f, 0.003657f, 0.005810f, 0.005043f, 0.007314f, 0.003679f, 0.003831f, 0.004629f, 0.007485f, 0.004645f, 0.006691f, 0.002879f, 0.005852f, 0.006690f, 0.006330f, 0.008273f, 0.004149f, 0.005079f, 0.003481f, 0.008020f, 0.004895f, 0.004774f, 0.003941f, 0.002730f, 0.007628f} - }, - { - {-0.040881f, -0.039965f, -0.038159f, -0.035521f, -0.032131f, -0.028094f, -0.023534f, -0.018587f, -0.013405f, -0.008140f, -0.002948f, 0.002020f, 0.006624f, 0.010739f, 0.014255f, 0.017086f, 0.019171f, 0.020472f, 0.020982f, 0.020716f, 0.019718f, 0.018055f, 0.015816f, 0.013106f, 0.010045f, 0.006761f, 0.003390f, 0.000064f, -0.003089f, -0.005948f, -0.008409f, -0.010382f, -0.011799f, -0.012613f, -0.012801f, -0.012364f, -0.011328f, -0.009738f, -0.007662f, -0.005186f, -0.002408f, 0.000561f, 0.003605f, 0.006606f, 0.009449f, 0.012024f, 0.014233f, 0.015990f, 0.017228f, 0.017899f, 0.017975f, 0.017451f, 0.016342f, 0.014686f, 0.012538f, 0.009971f, 0.007074f, 0.003945f, 0.000690f, -0.002582f, -0.005762f, -0.008746f, -0.011438f, -0.013752f, -0.015620f, -0.016988f, -0.017820f, -0.018103f, -0.017839f, -0.017054f, -0.015789f, -0.014103f, -0.012067f, -0.009765f, -0.007288f, -0.004733f, -0.002195f, 0.000231f, 0.002457f, 0.004404f, 0.006007f, 0.007212f, 0.007983f, 0.008300f, 0.008161f, 0.007579f, 0.006588f, 0.005231f, 0.003568f, 0.001667f, -0.000396f, -0.002539f, -0.004681f, -0.006741f, -0.008644f, -0.010323f, - -0.011721f, -0.012791f, -0.013503f, -0.013841f, -0.013802f, -0.013400f, -0.012664f, -0.011633f, -0.010359f, -0.008904f, -0.007334f, -0.005721f, -0.004135f, -0.002648f, -0.001324f, -0.000220f, 0.000614f, 0.001141f, 0.001337f, 0.001191f, 0.000706f, -0.000101f, -0.001202f, -0.002555f, -0.004110f, -0.005806f, -0.007579f, -0.009361f, -0.011084f, -0.012681f, -0.014090f, -0.015257f, -0.016136f, -0.016692f, -0.016901f, -0.016753f, -0.016251f, -0.015410f, -0.014257f, -0.012832f, -0.011182f, -0.009364f, -0.007438f, -0.005469f, -0.003522f, -0.001662f, 0.000053f, 0.001569f, 0.002840f, 0.003830f, 0.004514f, 0.004877f, 0.004918f, 0.004647f, 0.004082f, 0.003255f, 0.002204f, 0.000975f, -0.000380f, -0.001809f, -0.003256f, -0.004668f, -0.005995f, -0.007191f, -0.008219f, -0.009049f, -0.009660f, -0.010039f, -0.010187f, -0.010111f, -0.009828f, -0.009363f, -0.008750f, -0.008025f, -0.007229f, -0.006407f, -0.005599f, -0.004849f, -0.004192f, -0.003661f, -0.003282f, -0.003074f, -0.003046f, -0.003199f, -0.003528f, -0.004016f, -0.004641f, -0.005375f, -0.006183f, -0.007027f, -0.007870f, -0.008669f, -0.009389f, -0.009992f, -0.010450f, -0.010736f, - -0.010834f, -0.010735f, -0.010435f, -0.009943f, -0.009273f, -0.008447f, -0.007494f, -0.006448f, -0.005347f, -0.004233f, -0.003147f, -0.002130f, -0.001219f, -0.000448f, 0.000152f, 0.000562f, 0.000766f, 0.000758f, 0.000540f, 0.000123f, -0.000475f, -0.001229f, -0.002106f, -0.003070f, -0.004081f, -0.005098f, -0.006077f, -0.006980f, -0.007769f, -0.008411f, -0.008879f, -0.009156f, -0.009228f, -0.009093f, -0.008755f, -0.008228f, -0.007533f, -0.006698f, -0.005756f, -0.004745f, -0.003705f, -0.002679f, -0.001707f, -0.000829f, -0.000080f, 0.000510f, 0.000916f, 0.001124f, 0.001405f, -0.011307f, 0.023755f, 0.010060f, 0.007247f, 0.047340f, 0.037354f, -0.162787f, -0.162415f, -0.105082f, -0.018683f, 0.015858f, -0.054927f, -0.017871f, 0.216992f, 0.114575f, 0.071094f, -0.102642f, -0.015053f, 0.038868f, 0.109641f, 0.010900f, 0.003695f, -0.044931f, -0.067549f, -0.039879f, -0.028640f, -0.006825f, 0.044025f, 0.074633f, 0.068953f, -0.006513f, -0.131510f, -0.149665f, 0.005649f, 0.072184f, 0.101365f, 0.070488f, -0.005129f, -0.102374f, 0.162843f, -0.036980f, -0.071588f, -0.127539f, -0.101807f, 0.021461f, 0.192087f, 0.205971f, - 0.044353f, -0.202735f, -0.313378f, -0.270330f, 0.048024f, 0.305831f, 0.370715f, 0.273108f, -0.081253f, -0.352290f, -0.324178f, -0.071810f, -0.027099f, 0.314215f, 0.189838f, 0.005054f, -0.042232f, 0.088868f, -0.150193f, -0.020693f, -0.082737f, -0.035341f, -0.169353f, -0.150333f, -0.116398f, 0.089213f, 0.131883f, 0.177783f, -0.001054f, -0.186749f, -0.416386f, -0.157525f, 0.096505f, 0.311886f, 0.111138f, -0.093343f, -0.115374f, -0.089440f, 0.106927f, 0.135966f, 0.024655f, -0.177522f, -0.242578f, -0.118012f, 0.125475f, 0.314922f, 0.181500f, -0.073097f, -0.316649f, -0.389086f, -0.057635f, 0.169788f, 0.266739f, 0.089674f, -0.167879f, -0.348737f, -0.247511f, 0.018748f, 0.266828f, 0.312541f, 0.131098f, -0.088081f, -0.234146f, -0.241476f, -0.075798f, 0.114267f, 0.186007f, 0.028598f, -0.153952f, -0.128974f, -0.105816f, -0.012368f, 0.052341f, 0.051225f, -0.011653f, 0.005902f, -0.056305f, -0.040576f, -0.060932f, -0.026504f, -0.033534f, 0.068671f, 0.128337f, 0.085491f, -0.065497f, -0.180343f, -0.213819f, -0.063258f, 0.184496f, 0.324874f, 0.192777f, -0.044238f, -0.270100f, -0.311131f, -0.130907f, 0.119784f, - 0.260308f, 0.222679f, -0.025611f, -0.265754f, -0.246170f, -0.017878f, 0.155285f, 0.223147f, 0.105955f, -0.073536f, -0.160483f, -0.117929f, -0.026936f, 0.080816f, 0.141065f, 0.069388f, -0.056032f, -0.104513f, -0.097304f, 0.017071f, 0.108282f, 0.136150f, 0.050768f, -0.085694f, -0.150248f, -0.106420f, 0.039844f, 0.128671f, 0.141846f, 0.032064f, -0.075533f, -0.108401f, -0.077053f, 0.017857f, 0.086372f, 0.144167f, -0.054317f, -0.187772f, -0.175366f, 0.016080f, 0.171246f, 0.163549f, -0.024564f, -0.177619f, -0.155765f, 0.026498f, 0.149948f, 0.106725f, -0.054458f, -0.135474f, -0.071082f, 0.057778f, 0.089388f, 0.013412f, -0.071645f, -0.058854f, 0.017501f, 0.047369f, -0.015272f, -0.026602f, -0.001780f, 0.000565f, -0.007389f, -0.005318f, -0.006795f, -0.004696f, -0.006953f, -0.003315f, -0.004558f, -0.001633f, -0.005423f, -0.005203f, -0.007470f, -0.004443f, -0.007558f, -0.005285f, -0.006401f, -0.005032f, -0.005035f, -0.001361f, -0.006098f, -0.005330f, -0.005546f, -0.003775f, -0.005107f, -0.005011f, -0.005249f, -0.004569f, -0.006403f, -0.004169f, -0.004055f, -0.005732f, -0.005934f, -0.005591f, -0.004628f, -0.004699f}, - {0.040881f, 0.039965f, 0.038159f, 0.035521f, 0.032131f, 0.028094f, 0.023534f, 0.018587f, 0.013405f, 0.008140f, 0.002948f, -0.002020f, -0.006624f, -0.010739f, -0.014255f, -0.017086f, -0.019171f, -0.020472f, -0.020982f, -0.020716f, -0.019718f, -0.018055f, -0.015816f, -0.013106f, -0.010045f, -0.006761f, -0.003390f, -0.000064f, 0.003089f, 0.005948f, 0.008409f, 0.010382f, 0.011799f, 0.012613f, 0.012801f, 0.012364f, 0.011328f, 0.009738f, 0.007662f, 0.005186f, 0.002408f, -0.000561f, -0.003605f, -0.006606f, -0.009449f, -0.012024f, -0.014233f, -0.015990f, -0.017228f, -0.017899f, -0.017975f, -0.017451f, -0.016342f, -0.014686f, -0.012538f, -0.009971f, -0.007074f, -0.003945f, -0.000690f, 0.002582f, 0.005762f, 0.008746f, 0.011438f, 0.013752f, 0.015620f, 0.016988f, 0.017820f, 0.018103f, 0.017839f, 0.017054f, 0.015789f, 0.014103f, 0.012067f, 0.009765f, 0.007288f, 0.004733f, 0.002195f, -0.000231f, -0.002457f, -0.004404f, -0.006007f, -0.007212f, -0.007983f, -0.008300f, -0.008161f, -0.007579f, -0.006588f, -0.005231f, -0.003568f, -0.001667f, 0.000396f, 0.002539f, 0.004681f, 0.006741f, 0.008644f, 0.010323f, - 0.011721f, 0.012791f, 0.013503f, 0.013841f, 0.013802f, 0.013400f, 0.012664f, 0.011633f, 0.010359f, 0.008904f, 0.007334f, 0.005721f, 0.004135f, 0.002648f, 0.001324f, 0.000220f, -0.000614f, -0.001141f, -0.001337f, -0.001191f, -0.000706f, 0.000101f, 0.001202f, 0.002555f, 0.004110f, 0.005806f, 0.007579f, 0.009361f, 0.011084f, 0.012681f, 0.014090f, 0.015257f, 0.016136f, 0.016692f, 0.016901f, 0.016753f, 0.016251f, 0.015410f, 0.014257f, 0.012832f, 0.011182f, 0.009364f, 0.007438f, 0.005469f, 0.003522f, 0.001662f, -0.000053f, -0.001569f, -0.002840f, -0.003830f, -0.004514f, -0.004877f, -0.004918f, -0.004647f, -0.004082f, -0.003255f, -0.002204f, -0.000975f, 0.000380f, 0.001809f, 0.003256f, 0.004668f, 0.005995f, 0.007191f, 0.008219f, 0.009049f, 0.009660f, 0.010039f, 0.010187f, 0.010111f, 0.009828f, 0.009363f, 0.008750f, 0.008025f, 0.007229f, 0.006407f, 0.005599f, 0.004849f, 0.004192f, 0.003661f, 0.003282f, 0.003074f, 0.003046f, 0.003199f, 0.003528f, 0.004016f, 0.004641f, 0.005375f, 0.006183f, 0.007027f, 0.007870f, 0.008669f, 0.009389f, 0.009992f, 0.010450f, 0.010736f, - 0.010834f, 0.010735f, 0.010435f, 0.009943f, 0.009273f, 0.008447f, 0.007494f, 0.006448f, 0.005347f, 0.004233f, 0.003147f, 0.002130f, 0.001219f, 0.000448f, -0.000152f, -0.000562f, -0.000766f, -0.000758f, -0.000540f, -0.000123f, 0.000475f, 0.001229f, 0.002106f, 0.003070f, 0.004081f, 0.005098f, 0.006077f, 0.006980f, 0.007769f, 0.008411f, 0.008879f, 0.009156f, 0.009228f, 0.009093f, 0.008755f, 0.008228f, 0.007533f, 0.006698f, 0.005756f, 0.004745f, 0.003705f, 0.002679f, 0.001707f, 0.000829f, 0.000080f, -0.000510f, -0.000916f, -0.001124f, -0.001405f, 0.011307f, -0.023755f, -0.010060f, -0.007247f, -0.047340f, -0.037354f, 0.162787f, 0.162415f, 0.105082f, 0.018683f, -0.015858f, 0.054927f, 0.017871f, -0.216992f, -0.114575f, -0.071094f, 0.102642f, 0.015053f, -0.038868f, -0.109641f, -0.010900f, -0.003695f, 0.044931f, 0.067549f, 0.039879f, 0.028640f, 0.006825f, -0.044025f, -0.074633f, -0.068953f, 0.006513f, 0.131510f, 0.149665f, -0.005649f, -0.072184f, -0.101365f, -0.070488f, 0.005129f, 0.102374f, -0.162843f, 0.036980f, 0.071588f, 0.127539f, 0.101807f, -0.021461f, -0.192087f, -0.205971f, - -0.044353f, 0.202735f, 0.313378f, 0.270330f, -0.048024f, -0.305831f, -0.370715f, -0.273108f, 0.081253f, 0.352290f, 0.324178f, 0.071810f, 0.027099f, -0.314215f, -0.189838f, -0.005054f, 0.042232f, -0.088868f, 0.150193f, 0.020693f, 0.082737f, 0.035341f, 0.169353f, 0.150333f, 0.116398f, -0.089213f, -0.131883f, -0.177783f, 0.001054f, 0.186749f, 0.416386f, 0.157525f, -0.096505f, -0.311886f, -0.111138f, 0.093343f, 0.115374f, 0.089440f, -0.106927f, -0.135966f, -0.024655f, 0.177522f, 0.242578f, 0.118012f, -0.125475f, -0.314922f, -0.181500f, 0.073097f, 0.316649f, 0.389086f, 0.057635f, -0.169788f, -0.266739f, -0.089674f, 0.167879f, 0.348737f, 0.247511f, -0.018748f, -0.266828f, -0.312541f, -0.131098f, 0.088081f, 0.234146f, 0.241476f, 0.075798f, -0.114267f, -0.186007f, -0.028598f, 0.153952f, 0.128974f, 0.105816f, 0.012368f, -0.052341f, -0.051225f, 0.011653f, -0.005902f, 0.056305f, 0.040576f, 0.060932f, 0.026504f, 0.033534f, -0.068671f, -0.128337f, -0.085491f, 0.065497f, 0.180343f, 0.213819f, 0.063258f, -0.184496f, -0.324874f, -0.192777f, 0.044238f, 0.270100f, 0.311131f, 0.130907f, -0.119784f, - -0.260308f, -0.222679f, 0.025611f, 0.265754f, 0.246170f, 0.017878f, -0.155285f, -0.223147f, -0.105955f, 0.073536f, 0.160483f, 0.117929f, 0.026936f, -0.080816f, -0.141065f, -0.069388f, 0.056032f, 0.104513f, 0.097304f, -0.017071f, -0.108282f, -0.136150f, -0.050768f, 0.085694f, 0.150248f, 0.106420f, -0.039844f, -0.128671f, -0.141846f, -0.032064f, 0.075533f, 0.108401f, 0.077053f, -0.017857f, -0.086372f, -0.144167f, 0.054317f, 0.187772f, 0.175366f, -0.016080f, -0.171246f, -0.163549f, 0.024564f, 0.177619f, 0.155765f, -0.026498f, -0.149948f, -0.106725f, 0.054458f, 0.135474f, 0.071082f, -0.057778f, -0.089388f, -0.013412f, 0.071645f, 0.058854f, -0.017501f, -0.047369f, 0.015272f, 0.026602f, 0.001780f, -0.000565f, 0.007389f, 0.005318f, 0.006795f, 0.004696f, 0.006953f, 0.003315f, 0.004558f, 0.001633f, 0.005423f, 0.005203f, 0.007470f, 0.004443f, 0.007558f, 0.005285f, 0.006401f, 0.005032f, 0.005035f, 0.001361f, 0.006098f, 0.005330f, 0.005546f, 0.003775f, 0.005107f, 0.005011f, 0.005249f, 0.004569f, 0.006403f, 0.004169f, 0.004055f, 0.005732f, 0.005934f, 0.005591f, 0.004628f, 0.004699f} - }, - { - {-0.029892f, -0.029542f, -0.028856f, -0.027857f, -0.026583f, -0.025079f, -0.023399f, -0.021600f, -0.019744f, -0.017891f, -0.016098f, -0.014418f, -0.012895f, -0.011561f, -0.010440f, -0.009540f, -0.008855f, -0.008369f, -0.008049f, -0.007854f, -0.007730f, -0.007616f, -0.007448f, -0.007158f, -0.006680f, -0.005952f, -0.004918f, -0.003536f, -0.001775f, 0.000383f, 0.002934f, 0.005861f, 0.009126f, 0.012674f, 0.016434f, 0.020319f, 0.024230f, 0.028058f, 0.031689f, 0.035007f, 0.037898f, 0.040252f, 0.041972f, 0.042973f, 0.043189f, 0.042572f, 0.041100f, 0.038772f, 0.035614f, 0.031677f, 0.027035f, 0.021787f, 0.016048f, 0.009953f, 0.003650f, -0.002707f, -0.008959f, -0.014945f, -0.020515f, -0.025524f, -0.029848f, -0.033376f, -0.036023f, -0.037728f, -0.038458f, -0.038206f, -0.036995f, -0.034872f, -0.031914f, -0.028218f, -0.023902f, -0.019098f, -0.013952f, -0.008616f, -0.003243f, 0.002016f, 0.007018f, 0.011632f, 0.015743f, 0.019255f, 0.022095f, 0.024213f, 0.025584f, 0.026207f, 0.026107f, 0.025331f, 0.023946f, 0.022036f, 0.019699f, 0.017044f, 0.014184f, 0.011235f, 0.008308f, 0.005510f, 0.002935f, 0.000663f, - -0.001242f, -0.002733f, -0.003786f, -0.004393f, -0.004571f, -0.004350f, -0.003782f, -0.002930f, -0.001872f, -0.000690f, 0.000525f, 0.001683f, 0.002699f, 0.003490f, 0.003986f, 0.004128f, 0.003872f, 0.003192f, 0.002077f, 0.000537f, -0.001401f, -0.003695f, -0.006286f, -0.009104f, -0.012065f, -0.015083f, -0.018065f, -0.020919f, -0.023555f, -0.025891f, -0.027854f, -0.029383f, -0.030432f, -0.030969f, -0.030982f, -0.030475f, -0.029468f, -0.027999f, -0.026120f, -0.023894f, -0.021395f, -0.018706f, -0.015911f, -0.013097f, -0.010347f, -0.007739f, -0.005344f, -0.003220f, -0.001415f, 0.000040f, 0.001127f, 0.001844f, 0.002204f, 0.002235f, 0.001976f, 0.001478f, 0.000801f, 0.000009f, -0.000830f, -0.001647f, -0.002379f, -0.002965f, -0.003354f, -0.003506f, -0.003391f, -0.002992f, -0.002309f, -0.001353f, -0.000149f, 0.001265f, 0.002842f, 0.004523f, 0.006247f, 0.007944f, 0.009546f, 0.010988f, 0.012205f, 0.013144f, 0.013759f, 0.014014f, 0.013888f, 0.013374f, 0.012478f, 0.011219f, 0.009633f, 0.007766f, 0.005674f, 0.003424f, 0.001085f, -0.001265f, -0.003552f, -0.005703f, -0.007649f, -0.009329f, -0.010692f, -0.011698f, - -0.012321f, -0.012549f, -0.012384f, -0.011842f, -0.010953f, -0.009760f, -0.008315f, -0.006679f, -0.004921f, -0.003112f, -0.001323f, 0.000375f, 0.001917f, 0.003245f, 0.004311f, 0.005076f, 0.005514f, 0.005615f, 0.005380f, 0.004824f, 0.003975f, 0.002872f, 0.001564f, 0.000109f, -0.001431f, -0.002990f, -0.004504f, -0.005909f, -0.007146f, -0.008165f, -0.008925f, -0.009393f, -0.009551f, -0.009394f, -0.008928f, -0.008172f, -0.007159f, -0.005929f, -0.004534f, -0.003031f, -0.001480f, 0.000053f, 0.001507f, 0.002823f, 0.003946f, 0.004831f, 0.005442f, 0.005753f, 0.036056f, 0.021124f, 0.026973f, 0.002853f, 0.025504f, -0.036759f, 0.120369f, 0.068962f, -0.020475f, -0.006364f, 0.082802f, -0.095240f, 0.015746f, 0.112186f, -0.049374f, -0.361187f, -0.225574f, -0.127324f, 0.157493f, 0.116115f, -0.176209f, -0.033021f, 0.133424f, 0.235411f, 0.062228f, -0.044699f, -0.116768f, -0.191572f, -0.051900f, 0.128522f, 0.226795f, 0.159784f, 0.002433f, -0.116993f, -0.146142f, -0.075191f, 0.062285f, 0.165989f, 0.094672f, 0.046845f, -0.069561f, -0.120506f, -0.054545f, 0.095776f, 0.175229f, 0.142224f, -0.009731f, -0.071782f, - -0.077554f, -0.112175f, -0.041778f, 0.011164f, 0.128118f, 0.208308f, 0.235745f, 0.111922f, -0.132997f, -0.259796f, -0.113422f, 0.074893f, -0.038254f, 0.238270f, 0.168505f, 0.082608f, -0.031260f, 0.116822f, -0.233589f, -0.185223f, -0.173442f, 0.043233f, 0.021947f, 0.054493f, -0.126625f, 0.023288f, 0.105875f, 0.198739f, 0.250896f, -0.249375f, -0.448407f, -0.145145f, 0.106279f, 0.302558f, 0.246126f, 0.196574f, -0.235638f, -0.653698f, -0.528796f, -0.090020f, 0.349899f, 0.436636f, 0.195874f, -0.175564f, -0.414966f, -0.390250f, -0.051659f, 0.151280f, 0.221583f, 0.036830f, -0.113118f, -0.102813f, 0.129464f, 0.150724f, 0.030080f, -0.103389f, -0.144849f, -0.060319f, 0.117822f, 0.184830f, 0.123875f, -0.015875f, -0.102409f, -0.076583f, -0.014518f, 0.191465f, 0.143807f, -0.120737f, -0.168517f, -0.104127f, -0.043151f, 0.037230f, 0.046696f, -0.021623f, -0.120959f, -0.067850f, -0.039591f, -0.013026f, -0.008023f, 0.001913f, -0.040271f, -0.073136f, 0.018257f, 0.059690f, 0.043106f, -0.031780f, -0.123499f, -0.075675f, -0.003068f, 0.069011f, 0.094692f, 0.066325f, -0.067325f, -0.140321f, -0.080914f, 0.095344f, - 0.192658f, 0.148638f, -0.039963f, -0.225561f, -0.285811f, -0.131370f, 0.112440f, 0.338432f, 0.285997f, 0.056425f, -0.307868f, -0.433614f, -0.250132f, 0.100298f, 0.381305f, 0.396289f, 0.121852f, -0.230055f, -0.398159f, -0.299296f, -0.003885f, 0.316878f, 0.413720f, 0.151302f, -0.177576f, -0.366316f, -0.264946f, 0.003264f, 0.196150f, 0.209733f, 0.039209f, -0.155458f, -0.213414f, -0.109735f, 0.103263f, 0.311253f, 0.159213f, -0.165452f, -0.350194f, -0.227372f, 0.093303f, 0.300425f, 0.213728f, -0.091342f, -0.300816f, -0.218461f, 0.065816f, 0.244071f, 0.162550f, -0.092415f, -0.238137f, -0.128252f, 0.100712f, 0.181651f, 0.030990f, -0.157017f, -0.115265f, 0.070998f, 0.081800f, -0.046351f, -0.044295f, 0.008006f, 0.002149f, -0.009225f, -0.006588f, -0.009025f, -0.006800f, -0.005616f, -0.005679f, -0.009525f, -0.008407f, -0.006958f, -0.003893f, -0.006852f, -0.008169f, -0.007599f, -0.008781f, -0.005618f, -0.005729f, -0.006583f, -0.011031f, -0.006071f, -0.008584f, -0.006814f, -0.003493f, -0.006068f, -0.008759f, -0.010555f, -0.008607f, -0.005921f, -0.007738f, -0.005798f, -0.007830f, -0.004725f, -0.005808f, -0.010209f}, - {-0.029892f, -0.029542f, -0.028856f, -0.027857f, -0.026583f, -0.025079f, -0.023399f, -0.021600f, -0.019744f, -0.017891f, -0.016098f, -0.014418f, -0.012895f, -0.011561f, -0.010440f, -0.009540f, -0.008855f, -0.008369f, -0.008049f, -0.007854f, -0.007730f, -0.007616f, -0.007448f, -0.007158f, -0.006680f, -0.005952f, -0.004918f, -0.003536f, -0.001775f, 0.000383f, 0.002934f, 0.005861f, 0.009126f, 0.012674f, 0.016434f, 0.020319f, 0.024230f, 0.028058f, 0.031689f, 0.035007f, 0.037898f, 0.040252f, 0.041972f, 0.042973f, 0.043189f, 0.042572f, 0.041100f, 0.038772f, 0.035614f, 0.031677f, 0.027035f, 0.021787f, 0.016048f, 0.009953f, 0.003650f, -0.002707f, -0.008959f, -0.014945f, -0.020515f, -0.025524f, -0.029848f, -0.033376f, -0.036023f, -0.037728f, -0.038458f, -0.038206f, -0.036995f, -0.034872f, -0.031914f, -0.028218f, -0.023902f, -0.019098f, -0.013952f, -0.008616f, -0.003243f, 0.002016f, 0.007018f, 0.011632f, 0.015743f, 0.019255f, 0.022095f, 0.024213f, 0.025584f, 0.026207f, 0.026107f, 0.025331f, 0.023946f, 0.022036f, 0.019699f, 0.017044f, 0.014184f, 0.011235f, 0.008308f, 0.005510f, 0.002935f, 0.000663f, - -0.001242f, -0.002733f, -0.003786f, -0.004393f, -0.004571f, -0.004350f, -0.003782f, -0.002930f, -0.001872f, -0.000690f, 0.000525f, 0.001683f, 0.002699f, 0.003490f, 0.003986f, 0.004128f, 0.003872f, 0.003192f, 0.002077f, 0.000537f, -0.001401f, -0.003695f, -0.006286f, -0.009104f, -0.012065f, -0.015083f, -0.018065f, -0.020919f, -0.023555f, -0.025891f, -0.027854f, -0.029383f, -0.030432f, -0.030969f, -0.030982f, -0.030475f, -0.029468f, -0.027999f, -0.026120f, -0.023894f, -0.021395f, -0.018706f, -0.015911f, -0.013097f, -0.010347f, -0.007739f, -0.005344f, -0.003220f, -0.001415f, 0.000040f, 0.001127f, 0.001844f, 0.002204f, 0.002235f, 0.001976f, 0.001478f, 0.000801f, 0.000009f, -0.000830f, -0.001647f, -0.002379f, -0.002965f, -0.003354f, -0.003506f, -0.003391f, -0.002992f, -0.002309f, -0.001353f, -0.000149f, 0.001265f, 0.002842f, 0.004523f, 0.006247f, 0.007944f, 0.009546f, 0.010988f, 0.012205f, 0.013144f, 0.013759f, 0.014014f, 0.013888f, 0.013374f, 0.012478f, 0.011219f, 0.009633f, 0.007766f, 0.005674f, 0.003424f, 0.001085f, -0.001265f, -0.003552f, -0.005703f, -0.007649f, -0.009329f, -0.010692f, -0.011698f, - -0.012321f, -0.012549f, -0.012384f, -0.011842f, -0.010953f, -0.009760f, -0.008315f, -0.006679f, -0.004921f, -0.003112f, -0.001323f, 0.000375f, 0.001917f, 0.003245f, 0.004311f, 0.005076f, 0.005514f, 0.005615f, 0.005380f, 0.004824f, 0.003975f, 0.002872f, 0.001564f, 0.000109f, -0.001431f, -0.002990f, -0.004504f, -0.005909f, -0.007146f, -0.008165f, -0.008925f, -0.009393f, -0.009551f, -0.009394f, -0.008928f, -0.008172f, -0.007159f, -0.005929f, -0.004534f, -0.003031f, -0.001480f, 0.000053f, 0.001507f, 0.002823f, 0.003946f, 0.004831f, 0.005442f, 0.005753f, 0.036056f, 0.021124f, 0.026973f, 0.002853f, 0.025504f, -0.036759f, 0.120369f, 0.068962f, -0.020475f, -0.006364f, 0.082802f, -0.095240f, 0.015746f, 0.112186f, -0.049374f, -0.361187f, -0.225574f, -0.127324f, 0.157493f, 0.116115f, -0.176209f, -0.033021f, 0.133424f, 0.235411f, 0.062228f, -0.044699f, -0.116768f, -0.191572f, -0.051900f, 0.128522f, 0.226795f, 0.159784f, 0.002433f, -0.116993f, -0.146142f, -0.075191f, 0.062285f, 0.165989f, 0.094672f, 0.046845f, -0.069561f, -0.120506f, -0.054545f, 0.095776f, 0.175229f, 0.142224f, -0.009731f, -0.071782f, - -0.077554f, -0.112175f, -0.041778f, 0.011164f, 0.128118f, 0.208308f, 0.235745f, 0.111922f, -0.132997f, -0.259796f, -0.113422f, 0.074893f, -0.038254f, 0.238270f, 0.168505f, 0.082608f, -0.031260f, 0.116822f, -0.233589f, -0.185223f, -0.173442f, 0.043233f, 0.021947f, 0.054493f, -0.126625f, 0.023288f, 0.105875f, 0.198739f, 0.250896f, -0.249375f, -0.448407f, -0.145145f, 0.106279f, 0.302558f, 0.246126f, 0.196574f, -0.235638f, -0.653698f, -0.528796f, -0.090020f, 0.349899f, 0.436636f, 0.195874f, -0.175564f, -0.414966f, -0.390250f, -0.051659f, 0.151280f, 0.221583f, 0.036830f, -0.113118f, -0.102813f, 0.129464f, 0.150724f, 0.030080f, -0.103389f, -0.144849f, -0.060319f, 0.117822f, 0.184830f, 0.123875f, -0.015875f, -0.102409f, -0.076583f, -0.014518f, 0.191465f, 0.143807f, -0.120737f, -0.168517f, -0.104127f, -0.043151f, 0.037230f, 0.046696f, -0.021623f, -0.120959f, -0.067850f, -0.039591f, -0.013026f, -0.008023f, 0.001913f, -0.040271f, -0.073136f, 0.018257f, 0.059690f, 0.043106f, -0.031780f, -0.123499f, -0.075675f, -0.003068f, 0.069011f, 0.094692f, 0.066325f, -0.067325f, -0.140321f, -0.080914f, 0.095344f, - 0.192658f, 0.148638f, -0.039963f, -0.225561f, -0.285811f, -0.131370f, 0.112440f, 0.338432f, 0.285997f, 0.056425f, -0.307868f, -0.433614f, -0.250132f, 0.100298f, 0.381305f, 0.396289f, 0.121852f, -0.230055f, -0.398159f, -0.299296f, -0.003885f, 0.316878f, 0.413720f, 0.151302f, -0.177576f, -0.366316f, -0.264946f, 0.003264f, 0.196150f, 0.209733f, 0.039209f, -0.155458f, -0.213414f, -0.109735f, 0.103263f, 0.311253f, 0.159213f, -0.165452f, -0.350194f, -0.227372f, 0.093303f, 0.300425f, 0.213728f, -0.091342f, -0.300816f, -0.218461f, 0.065816f, 0.244071f, 0.162550f, -0.092415f, -0.238137f, -0.128252f, 0.100712f, 0.181651f, 0.030990f, -0.157017f, -0.115265f, 0.070998f, 0.081800f, -0.046351f, -0.044295f, 0.008006f, 0.002149f, -0.009225f, -0.006588f, -0.009025f, -0.006800f, -0.005616f, -0.005679f, -0.009525f, -0.008407f, -0.006958f, -0.003893f, -0.006852f, -0.008169f, -0.007599f, -0.008781f, -0.005618f, -0.005729f, -0.006583f, -0.011031f, -0.006071f, -0.008584f, -0.006814f, -0.003493f, -0.006068f, -0.008759f, -0.010555f, -0.008607f, -0.005921f, -0.007738f, -0.005798f, -0.007830f, -0.004725f, -0.005808f, -0.010209f} - }, - { - {-0.014853f, -0.014704f, -0.014411f, -0.013990f, -0.013461f, -0.012849f, -0.012185f, -0.011500f, -0.010831f, -0.010211f, -0.009675f, -0.009252f, -0.008968f, -0.008844f, -0.008893f, -0.009121f, -0.009525f, -0.010095f, -0.010810f, -0.011644f, -0.012561f, -0.013520f, -0.014474f, -0.015372f, -0.016163f, -0.016793f, -0.017211f, -0.017371f, -0.017230f, -0.016755f, -0.015919f, -0.014708f, -0.013117f, -0.011153f, -0.008836f, -0.006199f, -0.003284f, -0.000147f, 0.003149f, 0.006531f, 0.009921f, 0.013235f, 0.016389f, 0.019297f, 0.021880f, 0.024059f, 0.025766f, 0.026943f, 0.027540f, 0.027524f, 0.026875f, 0.025588f, 0.023674f, 0.021160f, 0.018087f, 0.014513f, 0.010507f, 0.006150f, 0.001532f, -0.003249f, -0.008091f, -0.012889f, -0.017541f, -0.021946f, -0.026010f, -0.029648f, -0.032785f, -0.035358f, -0.037320f, -0.038638f, -0.039295f, -0.039291f, -0.038643f, -0.037382f, -0.035555f, -0.033222f, -0.030454f, -0.027331f, -0.023942f, -0.020380f, -0.016738f, -0.013112f, -0.009591f, -0.006263f, -0.003205f, -0.000485f, 0.001839f, 0.003724f, 0.005139f, 0.006068f, 0.006509f, 0.006473f, 0.005989f, 0.005093f, 0.003835f, 0.002275f, - 0.000479f, -0.001479f, -0.003525f, -0.005581f, -0.007571f, -0.009421f, -0.011066f, -0.012443f, -0.013502f, -0.014201f, -0.014508f, -0.014406f, -0.013888f, -0.012960f, -0.011639f, -0.009953f, -0.007944f, -0.005657f, -0.003151f, -0.000486f, 0.002270f, 0.005050f, 0.007783f, 0.010401f, 0.012840f, 0.015038f, 0.016941f, 0.018502f, 0.019684f, 0.020458f, 0.020805f, 0.020716f, 0.020195f, 0.019253f, 0.017912f, 0.016203f, 0.014165f, 0.011845f, 0.009293f, 0.006565f, 0.003720f, 0.000819f, -0.002080f, -0.004917f, -0.007637f, -0.010188f, -0.012524f, -0.014605f, -0.016397f, -0.017873f, -0.019017f, -0.019817f, -0.020271f, -0.020385f, -0.020172f, -0.019650f, -0.018847f, -0.017792f, -0.016521f, -0.015073f, -0.013489f, -0.011811f, -0.010081f, -0.008343f, -0.006635f, -0.004996f, -0.003461f, -0.002058f, -0.000816f, 0.000247f, 0.001113f, 0.001773f, 0.002222f, 0.002460f, 0.002493f, 0.002331f, 0.001987f, 0.001482f, 0.000834f, 0.000069f, -0.000788f, -0.001710f, -0.002671f, -0.003644f, -0.004603f, -0.005524f, -0.006384f, -0.007165f, -0.007850f, -0.008424f, -0.008879f, -0.009209f, -0.009409f, -0.009481f, -0.009429f, -0.009260f, - -0.008984f, -0.008613f, -0.008161f, -0.007645f, -0.007081f, -0.006485f, -0.005876f, -0.005271f, -0.004684f, -0.004131f, -0.003625f, -0.003177f, -0.002795f, -0.002486f, -0.002254f, -0.002099f, -0.002022f, -0.002019f, -0.002085f, -0.002212f, -0.002392f, -0.002614f, -0.002869f, -0.003143f, -0.003427f, -0.003708f, -0.003977f, -0.004223f, -0.004439f, -0.004617f, -0.004752f, -0.004840f, -0.004880f, -0.004873f, -0.004819f, -0.004724f, -0.004591f, -0.004428f, -0.004241f, -0.004040f, -0.003832f, -0.003627f, -0.003433f, -0.003257f, -0.003107f, -0.002990f, -0.002908f, -0.002867f, -0.021142f, -0.012772f, 0.041782f, 0.011461f, -0.023324f, -0.048552f, 0.083324f, 0.128741f, 0.163210f, 0.022466f, -0.073034f, -0.164555f, -0.008334f, 0.027284f, -0.094363f, -0.135137f, -0.128155f, -0.159423f, 0.082480f, 0.276145f, 0.024414f, 0.012123f, -0.073510f, -0.075878f, -0.059393f, 0.141106f, 0.094630f, 0.252383f, 0.019271f, 0.006408f, -0.120424f, -0.077277f, -0.046363f, 0.087579f, 0.149186f, 0.113399f, -0.009919f, -0.070191f, -0.072746f, -0.074360f, -0.034070f, 0.050165f, 0.105453f, 0.054835f, -0.023624f, -0.052217f, -0.043143f, 0.060931f, - 0.037146f, -0.077516f, -0.101350f, -0.030535f, 0.010477f, 0.027091f, 0.106609f, -0.004045f, 0.035518f, -0.038627f, 0.027477f, -0.009505f, -0.146818f, 0.148435f, 0.115373f, -0.024588f, -0.084493f, 0.082609f, -0.189595f, -0.023110f, -0.024360f, 0.019452f, -0.139658f, -0.250359f, -0.312635f, 0.005022f, 0.285309f, 0.301526f, 0.106997f, -0.150844f, -0.259924f, -0.206224f, 0.000870f, 0.241643f, 0.281995f, 0.062769f, -0.089250f, -0.041351f, 0.002812f, 0.054198f, 0.045527f, 0.040906f, -0.053555f, -0.145768f, -0.138296f, -0.016220f, 0.154665f, 0.237434f, 0.194321f, 0.016704f, -0.203386f, -0.280457f, -0.244762f, 0.079565f, 0.301006f, 0.366981f, 0.209383f, -0.097659f, -0.290700f, -0.270046f, -0.115097f, 0.058905f, 0.086002f, 0.106486f, 0.028261f, -0.094005f, -0.005879f, 0.130444f, 0.200986f, -0.052487f, -0.121960f, -0.124044f, 0.042045f, 0.084948f, 0.176359f, 0.093919f, -0.040256f, -0.179410f, -0.211577f, -0.091507f, 0.129094f, 0.291859f, 0.261148f, 0.052084f, -0.248293f, -0.365230f, -0.303634f, 0.002162f, 0.338277f, 0.428645f, 0.233104f, -0.079498f, -0.326450f, -0.334632f, -0.092269f, 0.060237f, - 0.159157f, 0.139104f, 0.076327f, -0.011701f, -0.089277f, -0.092387f, -0.028372f, 0.036030f, 0.113183f, 0.072351f, 0.020929f, -0.031411f, -0.112913f, -0.067827f, -0.012575f, 0.118199f, 0.122719f, 0.053657f, -0.066424f, -0.129719f, -0.134491f, -0.023484f, 0.111408f, 0.114918f, 0.026332f, 0.015100f, -0.020594f, -0.043328f, -0.065491f, -0.008995f, 0.028595f, 0.063051f, 0.066698f, 0.020313f, -0.018236f, 0.019814f, -0.129555f, -0.137360f, -0.047141f, 0.080344f, 0.098521f, 0.034005f, -0.063626f, -0.085019f, -0.038896f, 0.031129f, 0.050531f, 0.026089f, -0.021032f, -0.038992f, -0.035237f, 0.003396f, 0.028927f, 0.029184f, -0.008887f, -0.036009f, -0.020577f, 0.026326f, 0.015104f, -0.015360f, -0.013356f, 0.007853f, -0.001375f, -0.000048f, -0.004307f, 0.001124f, -0.000891f, -0.000933f, -0.002570f, 0.000851f, -0.002801f, -0.000454f, -0.000990f, -0.000218f, -0.001979f, 0.003152f, -0.001396f, -0.001332f, 0.003680f, 0.001222f, 0.000151f, -0.000306f, -0.001812f, -0.001295f, -0.002856f, 0.000203f, -0.004890f, 0.002523f, 0.000903f, 0.002135f, -0.002393f, -0.001312f, 0.000310f, -0.002222f, -0.000223f, -0.000378f}, - {-0.014853f, -0.014704f, -0.014411f, -0.013990f, -0.013461f, -0.012849f, -0.012185f, -0.011500f, -0.010831f, -0.010211f, -0.009675f, -0.009252f, -0.008968f, -0.008844f, -0.008893f, -0.009121f, -0.009525f, -0.010095f, -0.010810f, -0.011644f, -0.012561f, -0.013520f, -0.014474f, -0.015372f, -0.016163f, -0.016793f, -0.017211f, -0.017371f, -0.017230f, -0.016755f, -0.015919f, -0.014708f, -0.013117f, -0.011153f, -0.008836f, -0.006199f, -0.003284f, -0.000147f, 0.003149f, 0.006531f, 0.009921f, 0.013235f, 0.016389f, 0.019297f, 0.021880f, 0.024059f, 0.025766f, 0.026943f, 0.027540f, 0.027524f, 0.026875f, 0.025588f, 0.023674f, 0.021160f, 0.018087f, 0.014513f, 0.010507f, 0.006150f, 0.001532f, -0.003249f, -0.008091f, -0.012889f, -0.017541f, -0.021946f, -0.026010f, -0.029648f, -0.032785f, -0.035358f, -0.037320f, -0.038638f, -0.039295f, -0.039291f, -0.038643f, -0.037382f, -0.035555f, -0.033222f, -0.030454f, -0.027331f, -0.023942f, -0.020380f, -0.016738f, -0.013112f, -0.009591f, -0.006263f, -0.003205f, -0.000485f, 0.001839f, 0.003724f, 0.005139f, 0.006068f, 0.006509f, 0.006473f, 0.005989f, 0.005093f, 0.003835f, 0.002275f, - 0.000479f, -0.001479f, -0.003525f, -0.005581f, -0.007571f, -0.009421f, -0.011066f, -0.012443f, -0.013502f, -0.014201f, -0.014508f, -0.014406f, -0.013888f, -0.012960f, -0.011639f, -0.009953f, -0.007944f, -0.005657f, -0.003151f, -0.000486f, 0.002270f, 0.005050f, 0.007783f, 0.010401f, 0.012840f, 0.015038f, 0.016941f, 0.018502f, 0.019684f, 0.020458f, 0.020805f, 0.020716f, 0.020195f, 0.019253f, 0.017912f, 0.016203f, 0.014165f, 0.011845f, 0.009293f, 0.006565f, 0.003720f, 0.000819f, -0.002080f, -0.004917f, -0.007637f, -0.010188f, -0.012524f, -0.014605f, -0.016397f, -0.017873f, -0.019017f, -0.019817f, -0.020271f, -0.020385f, -0.020172f, -0.019650f, -0.018847f, -0.017792f, -0.016521f, -0.015073f, -0.013489f, -0.011811f, -0.010081f, -0.008343f, -0.006635f, -0.004996f, -0.003461f, -0.002058f, -0.000816f, 0.000247f, 0.001113f, 0.001773f, 0.002222f, 0.002460f, 0.002493f, 0.002331f, 0.001987f, 0.001482f, 0.000834f, 0.000069f, -0.000788f, -0.001710f, -0.002671f, -0.003644f, -0.004603f, -0.005524f, -0.006384f, -0.007165f, -0.007850f, -0.008424f, -0.008879f, -0.009209f, -0.009409f, -0.009481f, -0.009429f, -0.009260f, - -0.008984f, -0.008613f, -0.008161f, -0.007645f, -0.007081f, -0.006485f, -0.005876f, -0.005271f, -0.004684f, -0.004131f, -0.003625f, -0.003177f, -0.002795f, -0.002486f, -0.002254f, -0.002099f, -0.002022f, -0.002019f, -0.002085f, -0.002212f, -0.002392f, -0.002614f, -0.002869f, -0.003143f, -0.003427f, -0.003708f, -0.003977f, -0.004223f, -0.004439f, -0.004617f, -0.004752f, -0.004840f, -0.004880f, -0.004873f, -0.004819f, -0.004724f, -0.004591f, -0.004428f, -0.004241f, -0.004040f, -0.003832f, -0.003627f, -0.003433f, -0.003257f, -0.003107f, -0.002990f, -0.002908f, -0.002867f, -0.021142f, -0.012772f, 0.041782f, 0.011461f, -0.023324f, -0.048552f, 0.083324f, 0.128741f, 0.163210f, 0.022466f, -0.073034f, -0.164555f, -0.008334f, 0.027284f, -0.094363f, -0.135137f, -0.128155f, -0.159423f, 0.082480f, 0.276145f, 0.024414f, 0.012123f, -0.073510f, -0.075878f, -0.059393f, 0.141106f, 0.094630f, 0.252383f, 0.019271f, 0.006408f, -0.120424f, -0.077277f, -0.046363f, 0.087579f, 0.149186f, 0.113399f, -0.009919f, -0.070191f, -0.072746f, -0.074360f, -0.034070f, 0.050165f, 0.105453f, 0.054835f, -0.023624f, -0.052217f, -0.043143f, 0.060931f, - 0.037146f, -0.077516f, -0.101350f, -0.030535f, 0.010477f, 0.027091f, 0.106609f, -0.004045f, 0.035518f, -0.038627f, 0.027477f, -0.009505f, -0.146818f, 0.148435f, 0.115373f, -0.024588f, -0.084493f, 0.082609f, -0.189595f, -0.023110f, -0.024360f, 0.019452f, -0.139658f, -0.250359f, -0.312635f, 0.005022f, 0.285309f, 0.301526f, 0.106997f, -0.150844f, -0.259924f, -0.206224f, 0.000870f, 0.241643f, 0.281995f, 0.062769f, -0.089250f, -0.041351f, 0.002812f, 0.054198f, 0.045527f, 0.040906f, -0.053555f, -0.145768f, -0.138296f, -0.016220f, 0.154665f, 0.237434f, 0.194321f, 0.016704f, -0.203386f, -0.280457f, -0.244762f, 0.079565f, 0.301006f, 0.366981f, 0.209383f, -0.097659f, -0.290700f, -0.270046f, -0.115097f, 0.058905f, 0.086002f, 0.106486f, 0.028261f, -0.094005f, -0.005879f, 0.130444f, 0.200986f, -0.052487f, -0.121960f, -0.124044f, 0.042045f, 0.084948f, 0.176359f, 0.093919f, -0.040256f, -0.179410f, -0.211577f, -0.091507f, 0.129094f, 0.291859f, 0.261148f, 0.052084f, -0.248293f, -0.365230f, -0.303634f, 0.002162f, 0.338277f, 0.428645f, 0.233104f, -0.079498f, -0.326450f, -0.334632f, -0.092269f, 0.060237f, - 0.159157f, 0.139104f, 0.076327f, -0.011701f, -0.089277f, -0.092387f, -0.028372f, 0.036030f, 0.113183f, 0.072351f, 0.020929f, -0.031411f, -0.112913f, -0.067827f, -0.012575f, 0.118199f, 0.122719f, 0.053657f, -0.066424f, -0.129719f, -0.134491f, -0.023484f, 0.111408f, 0.114918f, 0.026332f, 0.015100f, -0.020594f, -0.043328f, -0.065491f, -0.008995f, 0.028595f, 0.063051f, 0.066698f, 0.020313f, -0.018236f, 0.019814f, -0.129555f, -0.137360f, -0.047141f, 0.080344f, 0.098521f, 0.034005f, -0.063626f, -0.085019f, -0.038896f, 0.031129f, 0.050531f, 0.026089f, -0.021032f, -0.038992f, -0.035237f, 0.003396f, 0.028927f, 0.029184f, -0.008887f, -0.036009f, -0.020577f, 0.026326f, 0.015104f, -0.015360f, -0.013356f, 0.007853f, -0.001375f, -0.000048f, -0.004307f, 0.001124f, -0.000891f, -0.000933f, -0.002570f, 0.000851f, -0.002801f, -0.000454f, -0.000990f, -0.000218f, -0.001979f, 0.003152f, -0.001396f, -0.001332f, 0.003680f, 0.001222f, 0.000151f, -0.000306f, -0.001812f, -0.001295f, -0.002856f, 0.000203f, -0.004890f, 0.002523f, 0.000903f, 0.002135f, -0.002393f, -0.001312f, 0.000310f, -0.002222f, -0.000223f, -0.000378f} - }, - { - {0.030630f, 0.029886f, 0.028419f, 0.026269f, 0.023494f, 0.020171f, 0.016388f, 0.012248f, 0.007859f, 0.003338f, -0.001200f, -0.005641f, -0.009876f, -0.013804f, -0.017337f, -0.020400f, -0.022935f, -0.024898f, -0.026269f, -0.027040f, -0.027226f, -0.026858f, -0.025979f, -0.024651f, -0.022944f, -0.020937f, -0.018715f, -0.016365f, -0.013975f, -0.011627f, -0.009400f, -0.007362f, -0.005571f, -0.004073f, -0.002900f, -0.002071f, -0.001588f, -0.001443f, -0.001612f, -0.002061f, -0.002744f, -0.003610f, -0.004601f, -0.005654f, -0.006709f, -0.007705f, -0.008586f, -0.009302f, -0.009810f, -0.010078f, -0.010084f, -0.009816f, -0.009274f, -0.008469f, -0.007422f, -0.006164f, -0.004732f, -0.003171f, -0.001530f, 0.000141f, 0.001791f, 0.003371f, 0.004836f, 0.006146f, 0.007269f, 0.008179f, 0.008862f, 0.009311f, 0.009530f, 0.009530f, 0.009332f, 0.008965f, 0.008463f, 0.007863f, 0.007208f, 0.006538f, 0.005896f, 0.005319f, 0.004841f, 0.004491f, 0.004289f, 0.004247f, 0.004371f, 0.004656f, 0.005087f, 0.005645f, 0.006301f, 0.007019f, 0.007762f, 0.008485f, 0.009148f, 0.009706f, 0.010119f, 0.010352f, 0.010375f, 0.010165f, - 0.009708f, 0.009001f, 0.008046f, 0.006861f, 0.005470f, 0.003906f, 0.002212f, 0.000436f, -0.001369f, -0.003144f, -0.004831f, -0.006373f, -0.007713f, -0.008801f, -0.009593f, -0.010051f, -0.010149f, -0.009870f, -0.009208f, -0.008168f, -0.006767f, -0.005033f, -0.003004f, -0.000725f, 0.001749f, 0.004359f, 0.007042f, 0.009732f, 0.012365f, 0.014878f, 0.017212f, 0.019314f, 0.021138f, 0.022648f, 0.023816f, 0.024624f, 0.025066f, 0.025145f, 0.024873f, 0.024274f, 0.023376f, 0.022217f, 0.020840f, 0.019289f, 0.017613f, 0.015860f, 0.014077f, 0.012308f, 0.010594f, 0.008969f, 0.007461f, 0.006094f, 0.004882f, 0.003833f, 0.002948f, 0.002223f, 0.001646f, 0.001203f, 0.000875f, 0.000640f, 0.000476f, 0.000360f, 0.000273f, 0.000194f, 0.000108f, 0.000003f, -0.000128f, -0.000288f, -0.000476f, -0.000686f, -0.000906f, -0.001125f, -0.001324f, -0.001488f, -0.001596f, -0.001630f, -0.001575f, -0.001415f, -0.001139f, -0.000741f, -0.000217f, 0.000429f, 0.001189f, 0.002051f, 0.002998f, 0.004006f, 0.005050f, 0.006102f, 0.007132f, 0.008110f, 0.009004f, 0.009788f, 0.010435f, 0.010925f, 0.011241f, 0.011371f, - 0.011312f, 0.011064f, 0.010635f, 0.010040f, 0.009298f, 0.008435f, 0.007480f, 0.006465f, 0.005424f, 0.004394f, 0.003408f, 0.002500f, 0.001700f, 0.001033f, 0.000520f, 0.000176f, 0.000009f, 0.000021f, 0.000206f, 0.000552f, 0.001043f, 0.001654f, 0.002358f, 0.003124f, 0.003918f, 0.004707f, 0.005455f, 0.006132f, 0.006708f, 0.007158f, 0.007462f, 0.007606f, 0.007583f, 0.007391f, 0.007036f, 0.006531f, 0.005894f, 0.005148f, 0.004321f, 0.003444f, 0.002551f, 0.001675f, 0.000851f, 0.000109f, -0.000522f, -0.001018f, -0.001359f, -0.001533f, -0.013588f, -0.039467f, -0.037901f, -0.021588f, 0.011313f, 0.000789f, -0.055494f, 0.005170f, -0.073707f, -0.098420f, -0.068258f, -0.001448f, -0.054406f, 0.005726f, -0.020404f, -0.008435f, -0.065711f, -0.030719f, 0.136399f, 0.158010f, -0.089710f, -0.028559f, 0.013863f, 0.105298f, 0.066637f, 0.035608f, 0.039413f, -0.028561f, -0.059565f, -0.060206f, 0.033290f, 0.092845f, -0.009329f, -0.065797f, -0.068659f, -0.005349f, 0.042261f, 0.099630f, 0.025256f, -0.005513f, -0.041187f, 0.031916f, 0.017488f, 0.091830f, 0.037378f, 0.014187f, -0.023848f, -0.000482f, - -0.050457f, -0.055721f, -0.058509f, 0.077087f, 0.048546f, 0.027771f, -0.043394f, -0.103564f, -0.084214f, 0.008461f, 0.031071f, 0.040095f, 0.097907f, -0.095014f, -0.111959f, -0.069063f, 0.011158f, -0.025619f, 0.173890f, 0.126003f, 0.099104f, -0.033678f, -0.044920f, -0.097036f, 0.056543f, 0.058742f, 0.064084f, 0.051523f, 0.013651f, -0.166152f, -0.244119f, -0.147183f, 0.090228f, 0.235326f, 0.281570f, 0.040560f, -0.139487f, -0.269164f, -0.126385f, 0.045203f, 0.226480f, 0.214837f, 0.079560f, -0.049083f, -0.283805f, -0.236087f, 0.000289f, 0.173246f, 0.206911f, 0.015769f, -0.144701f, -0.163731f, -0.050881f, 0.084700f, 0.150058f, 0.014995f, -0.147567f, -0.221592f, -0.110711f, 0.103520f, 0.274064f, 0.143869f, -0.128538f, -0.312151f, -0.225086f, -0.092757f, 0.300536f, 0.418715f, 0.127606f, -0.230029f, -0.341479f, -0.195968f, 0.122780f, 0.284097f, 0.358943f, 0.123112f, -0.127152f, -0.283415f, -0.196468f, 0.014572f, 0.231089f, 0.266968f, 0.093281f, -0.111264f, -0.201375f, -0.113465f, 0.096944f, 0.219131f, 0.117782f, -0.054741f, -0.153716f, -0.120550f, 0.107774f, 0.195634f, 0.116388f, -0.062415f, - -0.192398f, -0.210544f, -0.029201f, 0.201855f, 0.249644f, 0.100840f, -0.102094f, -0.237392f, -0.208560f, -0.069246f, 0.169403f, 0.299624f, 0.217982f, -0.028703f, -0.265906f, -0.319232f, -0.125647f, 0.173379f, 0.338687f, 0.240591f, -0.008976f, -0.264023f, -0.333698f, -0.135412f, 0.048295f, 0.226408f, 0.212682f, 0.097199f, -0.085554f, -0.155354f, -0.131984f, -0.011196f, 0.083124f, 0.107153f, 0.036576f, -0.152611f, 0.004281f, 0.119319f, 0.165601f, 0.066304f, -0.049091f, -0.120765f, -0.070825f, 0.028825f, 0.109023f, 0.094864f, 0.018672f, -0.068787f, -0.085827f, -0.030428f, 0.063047f, 0.093016f, 0.044563f, -0.052808f, -0.080650f, -0.006784f, 0.083424f, 0.041339f, -0.039872f, -0.022357f, 0.024608f, 0.013488f, 0.000998f, 0.003189f, 0.007823f, 0.002533f, 0.003391f, 0.000901f, 0.002675f, 0.003156f, 0.003914f, 0.004147f, 0.003899f, -0.001965f, 0.005109f, 0.006066f, 0.003780f, 0.002728f, 0.005253f, 0.005267f, 0.004289f, 0.002943f, 0.005577f, 0.000016f, 0.002358f, 0.001586f, 0.006119f, 0.001132f, 0.000415f, 0.003371f, 0.002974f, 0.001878f, 0.008552f, 0.005038f, 0.004298f, 0.003232f}, - {0.030630f, 0.029886f, 0.028419f, 0.026269f, 0.023494f, 0.020171f, 0.016388f, 0.012248f, 0.007859f, 0.003338f, -0.001200f, -0.005641f, -0.009876f, -0.013804f, -0.017337f, -0.020400f, -0.022935f, -0.024898f, -0.026269f, -0.027040f, -0.027226f, -0.026858f, -0.025979f, -0.024651f, -0.022944f, -0.020937f, -0.018715f, -0.016365f, -0.013975f, -0.011627f, -0.009400f, -0.007362f, -0.005571f, -0.004073f, -0.002900f, -0.002071f, -0.001588f, -0.001443f, -0.001612f, -0.002061f, -0.002744f, -0.003610f, -0.004601f, -0.005654f, -0.006709f, -0.007705f, -0.008586f, -0.009302f, -0.009810f, -0.010078f, -0.010084f, -0.009816f, -0.009274f, -0.008469f, -0.007422f, -0.006164f, -0.004732f, -0.003171f, -0.001530f, 0.000141f, 0.001791f, 0.003371f, 0.004836f, 0.006146f, 0.007269f, 0.008179f, 0.008862f, 0.009311f, 0.009530f, 0.009530f, 0.009332f, 0.008965f, 0.008463f, 0.007863f, 0.007208f, 0.006538f, 0.005896f, 0.005319f, 0.004841f, 0.004491f, 0.004289f, 0.004247f, 0.004371f, 0.004656f, 0.005087f, 0.005645f, 0.006301f, 0.007019f, 0.007762f, 0.008485f, 0.009148f, 0.009706f, 0.010119f, 0.010352f, 0.010375f, 0.010165f, - 0.009708f, 0.009001f, 0.008046f, 0.006861f, 0.005470f, 0.003906f, 0.002212f, 0.000436f, -0.001369f, -0.003144f, -0.004831f, -0.006373f, -0.007713f, -0.008801f, -0.009593f, -0.010051f, -0.010149f, -0.009870f, -0.009208f, -0.008168f, -0.006767f, -0.005033f, -0.003004f, -0.000725f, 0.001749f, 0.004359f, 0.007042f, 0.009732f, 0.012365f, 0.014878f, 0.017212f, 0.019314f, 0.021138f, 0.022648f, 0.023816f, 0.024624f, 0.025066f, 0.025145f, 0.024873f, 0.024274f, 0.023376f, 0.022217f, 0.020840f, 0.019289f, 0.017613f, 0.015860f, 0.014077f, 0.012308f, 0.010594f, 0.008969f, 0.007461f, 0.006094f, 0.004882f, 0.003833f, 0.002948f, 0.002223f, 0.001646f, 0.001203f, 0.000875f, 0.000640f, 0.000476f, 0.000360f, 0.000273f, 0.000194f, 0.000108f, 0.000003f, -0.000128f, -0.000288f, -0.000476f, -0.000686f, -0.000906f, -0.001125f, -0.001324f, -0.001488f, -0.001596f, -0.001630f, -0.001575f, -0.001415f, -0.001139f, -0.000741f, -0.000217f, 0.000429f, 0.001189f, 0.002051f, 0.002998f, 0.004006f, 0.005050f, 0.006102f, 0.007132f, 0.008110f, 0.009004f, 0.009788f, 0.010435f, 0.010925f, 0.011241f, 0.011371f, - 0.011312f, 0.011064f, 0.010635f, 0.010040f, 0.009298f, 0.008435f, 0.007480f, 0.006465f, 0.005424f, 0.004394f, 0.003408f, 0.002500f, 0.001700f, 0.001033f, 0.000520f, 0.000176f, 0.000009f, 0.000021f, 0.000206f, 0.000552f, 0.001043f, 0.001654f, 0.002358f, 0.003124f, 0.003918f, 0.004707f, 0.005455f, 0.006132f, 0.006708f, 0.007158f, 0.007462f, 0.007606f, 0.007583f, 0.007391f, 0.007036f, 0.006531f, 0.005894f, 0.005148f, 0.004321f, 0.003444f, 0.002551f, 0.001675f, 0.000851f, 0.000109f, -0.000522f, -0.001018f, -0.001359f, -0.001533f, -0.013588f, -0.039467f, -0.037901f, -0.021588f, 0.011313f, 0.000789f, -0.055494f, 0.005170f, -0.073707f, -0.098420f, -0.068258f, -0.001448f, -0.054406f, 0.005726f, -0.020404f, -0.008435f, -0.065711f, -0.030719f, 0.136399f, 0.158010f, -0.089710f, -0.028559f, 0.013863f, 0.105298f, 0.066637f, 0.035608f, 0.039413f, -0.028561f, -0.059565f, -0.060206f, 0.033290f, 0.092845f, -0.009329f, -0.065797f, -0.068659f, -0.005349f, 0.042261f, 0.099630f, 0.025256f, -0.005513f, -0.041187f, 0.031916f, 0.017488f, 0.091830f, 0.037378f, 0.014187f, -0.023848f, -0.000482f, - -0.050457f, -0.055721f, -0.058509f, 0.077087f, 0.048546f, 0.027771f, -0.043394f, -0.103564f, -0.084214f, 0.008461f, 0.031071f, 0.040095f, 0.097907f, -0.095014f, -0.111959f, -0.069063f, 0.011158f, -0.025619f, 0.173890f, 0.126003f, 0.099104f, -0.033678f, -0.044920f, -0.097036f, 0.056543f, 0.058742f, 0.064084f, 0.051523f, 0.013651f, -0.166152f, -0.244119f, -0.147183f, 0.090228f, 0.235326f, 0.281570f, 0.040560f, -0.139487f, -0.269164f, -0.126385f, 0.045203f, 0.226480f, 0.214837f, 0.079560f, -0.049083f, -0.283805f, -0.236087f, 0.000289f, 0.173246f, 0.206911f, 0.015769f, -0.144701f, -0.163731f, -0.050881f, 0.084700f, 0.150058f, 0.014995f, -0.147567f, -0.221592f, -0.110711f, 0.103520f, 0.274064f, 0.143869f, -0.128538f, -0.312151f, -0.225086f, -0.092757f, 0.300536f, 0.418715f, 0.127606f, -0.230029f, -0.341479f, -0.195968f, 0.122780f, 0.284097f, 0.358943f, 0.123112f, -0.127152f, -0.283415f, -0.196468f, 0.014572f, 0.231089f, 0.266968f, 0.093281f, -0.111264f, -0.201375f, -0.113465f, 0.096944f, 0.219131f, 0.117782f, -0.054741f, -0.153716f, -0.120550f, 0.107774f, 0.195634f, 0.116388f, -0.062415f, - -0.192398f, -0.210544f, -0.029201f, 0.201855f, 0.249644f, 0.100840f, -0.102094f, -0.237392f, -0.208560f, -0.069246f, 0.169403f, 0.299624f, 0.217982f, -0.028703f, -0.265906f, -0.319232f, -0.125647f, 0.173379f, 0.338687f, 0.240591f, -0.008976f, -0.264023f, -0.333698f, -0.135412f, 0.048295f, 0.226408f, 0.212682f, 0.097199f, -0.085554f, -0.155354f, -0.131984f, -0.011196f, 0.083124f, 0.107153f, 0.036576f, -0.152611f, 0.004281f, 0.119319f, 0.165601f, 0.066304f, -0.049091f, -0.120765f, -0.070825f, 0.028825f, 0.109023f, 0.094864f, 0.018672f, -0.068787f, -0.085827f, -0.030428f, 0.063047f, 0.093016f, 0.044563f, -0.052808f, -0.080650f, -0.006784f, 0.083424f, 0.041339f, -0.039872f, -0.022357f, 0.024608f, 0.013488f, 0.000998f, 0.003189f, 0.007823f, 0.002533f, 0.003391f, 0.000901f, 0.002675f, 0.003156f, 0.003914f, 0.004147f, 0.003899f, -0.001965f, 0.005109f, 0.006066f, 0.003780f, 0.002728f, 0.005253f, 0.005267f, 0.004289f, 0.002943f, 0.005577f, 0.000016f, 0.002358f, 0.001586f, 0.006119f, 0.001132f, 0.000415f, 0.003371f, 0.002974f, 0.001878f, 0.008552f, 0.005038f, 0.004298f, 0.003232f} - }, - { - {0.014266f, 0.014099f, 0.013769f, 0.013283f, 0.012652f, 0.011891f, 0.011016f, 0.010046f, 0.009002f, 0.007906f, 0.006780f, 0.005647f, 0.004528f, 0.003444f, 0.002411f, 0.001448f, 0.000565f, -0.000225f, -0.000916f, -0.001505f, -0.001991f, -0.002377f, -0.002669f, -0.002875f, -0.003006f, -0.003074f, -0.003092f, -0.003075f, -0.003035f, -0.002988f, -0.002943f, -0.002912f, -0.002903f, -0.002920f, -0.002967f, -0.003043f, -0.003143f, -0.003262f, -0.003388f, -0.003509f, -0.003610f, -0.003674f, -0.003683f, -0.003618f, -0.003460f, -0.003192f, -0.002798f, -0.002262f, -0.001574f, -0.000725f, 0.000287f, 0.001462f, 0.002796f, 0.004279f, 0.005895f, 0.007626f, 0.009448f, 0.011333f, 0.013252f, 0.015170f, 0.017054f, 0.018868f, 0.020575f, 0.022141f, 0.023533f, 0.024722f, 0.025682f, 0.026391f, 0.026832f, 0.026996f, 0.026878f, 0.026480f, 0.025810f, 0.024882f, 0.023717f, 0.022341f, 0.020783f, 0.019079f, 0.017266f, 0.015382f, 0.013469f, 0.011568f, 0.009715f, 0.007950f, 0.006304f, 0.004808f, 0.003484f, 0.002353f, 0.001426f, 0.000710f, 0.000204f, -0.000098f, -0.000208f, -0.000146f, 0.000067f, 0.000404f, - 0.000834f, 0.001326f, 0.001846f, 0.002362f, 0.002842f, 0.003256f, 0.003578f, 0.003787f, 0.003865f, 0.003802f, 0.003590f, 0.003231f, 0.002731f, 0.002102f, 0.001361f, 0.000532f, -0.000359f, -0.001283f, -0.002207f, -0.003099f, -0.003926f, -0.004655f, -0.005258f, -0.005708f, -0.005983f, -0.006067f, -0.005949f, -0.005623f, -0.005091f, -0.004362f, -0.003450f, -0.002375f, -0.001163f, 0.000154f, 0.001544f, 0.002968f, 0.004388f, 0.005765f, 0.007059f, 0.008236f, 0.009260f, 0.010103f, 0.010741f, 0.011154f, 0.011332f, 0.011269f, 0.010966f, 0.010433f, 0.009686f, 0.008745f, 0.007638f, 0.006399f, 0.005062f, 0.003666f, 0.002253f, 0.000862f, -0.000467f, -0.001695f, -0.002788f, -0.003716f, -0.004452f, -0.004977f, -0.005277f, -0.005346f, -0.005184f, -0.004796f, -0.004196f, -0.003401f, -0.002437f, -0.001331f, -0.000115f, 0.001176f, 0.002508f, 0.003843f, 0.005147f, 0.006387f, 0.007532f, 0.008555f, 0.009434f, 0.010150f, 0.010693f, 0.011055f, 0.011234f, 0.011236f, 0.011070f, 0.010750f, 0.010293f, 0.009722f, 0.009059f, 0.008331f, 0.007563f, 0.006782f, 0.006013f, 0.005278f, 0.004598f, 0.003992f, - 0.003473f, 0.003051f, 0.002733f, 0.002520f, 0.002411f, 0.002400f, 0.002478f, 0.002634f, 0.002854f, 0.003121f, 0.003421f, 0.003735f, 0.004047f, 0.004342f, 0.004607f, 0.004828f, 0.004998f, 0.005109f, 0.005157f, 0.005142f, 0.005066f, 0.004933f, 0.004750f, 0.004527f, 0.004273f, 0.004001f, 0.003723f, 0.003450f, 0.003194f, 0.002966f, 0.002774f, 0.002627f, 0.002529f, 0.002482f, 0.002488f, 0.002545f, 0.002649f, 0.002793f, 0.002970f, 0.003171f, 0.003386f, 0.003604f, 0.003815f, 0.004009f, 0.004176f, 0.004308f, 0.004400f, 0.004447f, -0.008117f, -0.004781f, -0.006598f, -0.018545f, -0.025597f, 0.042077f, -0.015089f, -0.029318f, -0.005835f, -0.008171f, 0.065454f, 0.017045f, -0.029551f, 0.007135f, -0.076603f, -0.157012f, -0.066141f, -0.026523f, 0.057249f, 0.043034f, -0.070796f, -0.020043f, 0.023324f, 0.089411f, 0.084758f, 0.035790f, 0.023783f, 0.033177f, -0.041975f, -0.060794f, -0.142789f, 0.008082f, 0.042334f, 0.010198f, 0.030540f, 0.037254f, -0.074155f, -0.097473f, -0.048026f, 0.009435f, 0.067059f, 0.102453f, 0.072618f, 0.019962f, -0.034514f, -0.021699f, -0.024063f, 0.049352f, - 0.036632f, 0.016999f, -0.031435f, 0.004227f, -0.113697f, -0.018912f, 0.056030f, 0.016169f, 0.091707f, 0.078866f, -0.054679f, -0.123760f, 0.051217f, -0.068318f, 0.096888f, 0.072978f, 0.072757f, -0.076411f, -0.090509f, -0.010835f, 0.057468f, 0.075408f, 0.063779f, 0.025827f, 0.041213f, -0.078705f, -0.097994f, -0.030170f, 0.123951f, 0.082740f, -0.042369f, -0.048554f, -0.066582f, -0.106656f, -0.039913f, 0.054512f, 0.049807f, -0.114358f, -0.215607f, -0.205969f, 0.041956f, 0.234425f, 0.265590f, 0.103549f, -0.087024f, -0.245732f, -0.151602f, 0.030550f, 0.142402f, 0.082910f, 0.004883f, -0.071084f, -0.045589f, -0.014730f, 0.027929f, 0.030718f, 0.062894f, -0.059104f, -0.059472f, -0.132011f, -0.061556f, -0.023570f, 0.124157f, 0.172644f, 0.122441f, -0.128672f, -0.148254f, -0.044770f, -0.080031f, 0.032261f, 0.085118f, 0.136007f, 0.037226f, -0.130449f, -0.059001f, -0.056811f, 0.088079f, 0.162189f, 0.121557f, 0.038020f, -0.016111f, -0.151295f, -0.181267f, -0.100758f, 0.108348f, 0.272622f, 0.281771f, 0.067561f, -0.207803f, -0.273469f, -0.163158f, 0.051822f, 0.244010f, 0.261897f, 0.080929f, -0.137511f, - -0.268044f, -0.175537f, 0.052243f, 0.301171f, 0.208899f, -0.013515f, -0.180532f, -0.265725f, -0.153590f, 0.052063f, 0.197927f, 0.187255f, 0.049341f, -0.083697f, -0.144994f, -0.126802f, -0.006250f, 0.055872f, 0.085810f, 0.031950f, -0.047777f, -0.119150f, -0.105607f, -0.004721f, 0.108134f, 0.123686f, 0.054182f, -0.053034f, -0.105318f, -0.096349f, -0.017170f, 0.093395f, 0.062758f, 0.028064f, -0.071315f, -0.075505f, 0.101127f, 0.140895f, 0.070198f, -0.086650f, -0.148540f, -0.081551f, 0.076697f, 0.146288f, 0.071101f, -0.088899f, -0.135306f, -0.039831f, 0.097748f, 0.110281f, -0.006700f, -0.108368f, -0.068172f, 0.050684f, 0.087551f, -0.007703f, -0.072486f, -0.013393f, 0.050897f, 0.004567f, -0.024493f, -0.002029f, 0.006294f, -0.004220f, -0.002998f, -0.002927f, -0.000138f, -0.002606f, 0.002296f, 0.000322f, 0.001175f, -0.000720f, 0.000056f, -0.006301f, -0.001237f, -0.005921f, 0.002369f, 0.000285f, -0.003134f, -0.000816f, 0.002985f, -0.001983f, 0.000990f, -0.001084f, -0.003292f, -0.003434f, -0.002880f, 0.000129f, -0.001524f, 0.000604f, 0.001678f, -0.002724f, -0.002961f, 0.000212f, -0.001253f, -0.001810f}, - {0.014266f, 0.014099f, 0.013769f, 0.013283f, 0.012652f, 0.011891f, 0.011016f, 0.010046f, 0.009002f, 0.007906f, 0.006780f, 0.005647f, 0.004528f, 0.003444f, 0.002411f, 0.001448f, 0.000565f, -0.000225f, -0.000916f, -0.001505f, -0.001991f, -0.002377f, -0.002669f, -0.002875f, -0.003006f, -0.003074f, -0.003092f, -0.003075f, -0.003035f, -0.002988f, -0.002943f, -0.002912f, -0.002903f, -0.002920f, -0.002967f, -0.003043f, -0.003143f, -0.003262f, -0.003388f, -0.003509f, -0.003610f, -0.003674f, -0.003683f, -0.003618f, -0.003460f, -0.003192f, -0.002798f, -0.002262f, -0.001574f, -0.000725f, 0.000287f, 0.001462f, 0.002796f, 0.004279f, 0.005895f, 0.007626f, 0.009448f, 0.011333f, 0.013252f, 0.015170f, 0.017054f, 0.018868f, 0.020575f, 0.022141f, 0.023533f, 0.024722f, 0.025682f, 0.026391f, 0.026832f, 0.026996f, 0.026878f, 0.026480f, 0.025810f, 0.024882f, 0.023717f, 0.022341f, 0.020783f, 0.019079f, 0.017266f, 0.015382f, 0.013469f, 0.011568f, 0.009715f, 0.007950f, 0.006304f, 0.004808f, 0.003484f, 0.002353f, 0.001426f, 0.000710f, 0.000204f, -0.000098f, -0.000208f, -0.000146f, 0.000067f, 0.000404f, - 0.000834f, 0.001326f, 0.001846f, 0.002362f, 0.002842f, 0.003256f, 0.003578f, 0.003787f, 0.003865f, 0.003802f, 0.003590f, 0.003231f, 0.002731f, 0.002102f, 0.001361f, 0.000532f, -0.000359f, -0.001283f, -0.002207f, -0.003099f, -0.003926f, -0.004655f, -0.005258f, -0.005708f, -0.005983f, -0.006067f, -0.005949f, -0.005623f, -0.005091f, -0.004362f, -0.003450f, -0.002375f, -0.001163f, 0.000154f, 0.001544f, 0.002968f, 0.004388f, 0.005765f, 0.007059f, 0.008236f, 0.009260f, 0.010103f, 0.010741f, 0.011154f, 0.011332f, 0.011269f, 0.010966f, 0.010433f, 0.009686f, 0.008745f, 0.007638f, 0.006399f, 0.005062f, 0.003666f, 0.002253f, 0.000862f, -0.000467f, -0.001695f, -0.002788f, -0.003716f, -0.004452f, -0.004977f, -0.005277f, -0.005346f, -0.005184f, -0.004796f, -0.004196f, -0.003401f, -0.002437f, -0.001331f, -0.000115f, 0.001176f, 0.002508f, 0.003843f, 0.005147f, 0.006387f, 0.007532f, 0.008555f, 0.009434f, 0.010150f, 0.010693f, 0.011055f, 0.011234f, 0.011236f, 0.011070f, 0.010750f, 0.010293f, 0.009722f, 0.009059f, 0.008331f, 0.007563f, 0.006782f, 0.006013f, 0.005278f, 0.004598f, 0.003992f, - 0.003473f, 0.003051f, 0.002733f, 0.002520f, 0.002411f, 0.002400f, 0.002478f, 0.002634f, 0.002854f, 0.003121f, 0.003421f, 0.003735f, 0.004047f, 0.004342f, 0.004607f, 0.004828f, 0.004998f, 0.005109f, 0.005157f, 0.005142f, 0.005066f, 0.004933f, 0.004750f, 0.004527f, 0.004273f, 0.004001f, 0.003723f, 0.003450f, 0.003194f, 0.002966f, 0.002774f, 0.002627f, 0.002529f, 0.002482f, 0.002488f, 0.002545f, 0.002649f, 0.002793f, 0.002970f, 0.003171f, 0.003386f, 0.003604f, 0.003815f, 0.004009f, 0.004176f, 0.004308f, 0.004400f, 0.004447f, -0.008117f, -0.004781f, -0.006598f, -0.018545f, -0.025597f, 0.042077f, -0.015089f, -0.029318f, -0.005835f, -0.008171f, 0.065454f, 0.017045f, -0.029551f, 0.007135f, -0.076603f, -0.157012f, -0.066141f, -0.026523f, 0.057249f, 0.043034f, -0.070796f, -0.020043f, 0.023324f, 0.089411f, 0.084758f, 0.035790f, 0.023783f, 0.033177f, -0.041975f, -0.060794f, -0.142789f, 0.008082f, 0.042334f, 0.010198f, 0.030540f, 0.037254f, -0.074155f, -0.097473f, -0.048026f, 0.009435f, 0.067059f, 0.102453f, 0.072618f, 0.019962f, -0.034514f, -0.021699f, -0.024063f, 0.049352f, - 0.036632f, 0.016999f, -0.031435f, 0.004227f, -0.113697f, -0.018912f, 0.056030f, 0.016169f, 0.091707f, 0.078866f, -0.054679f, -0.123760f, 0.051217f, -0.068318f, 0.096888f, 0.072978f, 0.072757f, -0.076411f, -0.090509f, -0.010835f, 0.057468f, 0.075408f, 0.063779f, 0.025827f, 0.041213f, -0.078705f, -0.097994f, -0.030170f, 0.123951f, 0.082740f, -0.042369f, -0.048554f, -0.066582f, -0.106656f, -0.039913f, 0.054512f, 0.049807f, -0.114358f, -0.215607f, -0.205969f, 0.041956f, 0.234425f, 0.265590f, 0.103549f, -0.087024f, -0.245732f, -0.151602f, 0.030550f, 0.142402f, 0.082910f, 0.004883f, -0.071084f, -0.045589f, -0.014730f, 0.027929f, 0.030718f, 0.062894f, -0.059104f, -0.059472f, -0.132011f, -0.061556f, -0.023570f, 0.124157f, 0.172644f, 0.122441f, -0.128672f, -0.148254f, -0.044770f, -0.080031f, 0.032261f, 0.085118f, 0.136007f, 0.037226f, -0.130449f, -0.059001f, -0.056811f, 0.088079f, 0.162189f, 0.121557f, 0.038020f, -0.016111f, -0.151295f, -0.181267f, -0.100758f, 0.108348f, 0.272622f, 0.281771f, 0.067561f, -0.207803f, -0.273469f, -0.163158f, 0.051822f, 0.244010f, 0.261897f, 0.080929f, -0.137511f, - -0.268044f, -0.175537f, 0.052243f, 0.301171f, 0.208899f, -0.013515f, -0.180532f, -0.265725f, -0.153590f, 0.052063f, 0.197927f, 0.187255f, 0.049341f, -0.083697f, -0.144994f, -0.126802f, -0.006250f, 0.055872f, 0.085810f, 0.031950f, -0.047777f, -0.119150f, -0.105607f, -0.004721f, 0.108134f, 0.123686f, 0.054182f, -0.053034f, -0.105318f, -0.096349f, -0.017170f, 0.093395f, 0.062758f, 0.028064f, -0.071315f, -0.075505f, 0.101127f, 0.140895f, 0.070198f, -0.086650f, -0.148540f, -0.081551f, 0.076697f, 0.146288f, 0.071101f, -0.088899f, -0.135306f, -0.039831f, 0.097748f, 0.110281f, -0.006700f, -0.108368f, -0.068172f, 0.050684f, 0.087551f, -0.007703f, -0.072486f, -0.013393f, 0.050897f, 0.004567f, -0.024493f, -0.002029f, 0.006294f, -0.004220f, -0.002998f, -0.002927f, -0.000138f, -0.002606f, 0.002296f, 0.000322f, 0.001175f, -0.000720f, 0.000056f, -0.006301f, -0.001237f, -0.005921f, 0.002369f, 0.000285f, -0.003134f, -0.000816f, 0.002985f, -0.001983f, 0.000990f, -0.001084f, -0.003292f, -0.003434f, -0.002880f, 0.000129f, -0.001524f, 0.000604f, 0.001678f, -0.002724f, -0.002961f, 0.000212f, -0.001253f, -0.001810f} - } -}; -const float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][480]={ - { - {0.000549f, 0.001631f, 0.002663f, 0.003615f, 0.004457f, 0.005166f, 0.005720f, 0.006107f, 0.006315f, 0.006343f, 0.006195f, 0.005878f, 0.005408f, 0.004806f, 0.004094f, 0.003303f, 0.002461f, 0.001602f, 0.000756f, -0.000043f, -0.000768f, -0.001390f, -0.001888f, -0.002243f, -0.002443f, -0.002479f, -0.002352f, -0.002064f, -0.001626f, -0.001054f, -0.000369f, 0.000407f, 0.001245f, 0.002115f, 0.002988f, 0.003833f, 0.004619f, 0.005320f, 0.005911f, 0.006370f, 0.006682f, 0.006834f, 0.006822f, 0.006644f, 0.006305f, 0.005815f, 0.005189f, 0.004445f, 0.003606f, 0.002698f, 0.001746f, 0.000779f, -0.000176f, -0.001093f, -0.001948f, -0.002718f, -0.003385f, -0.003937f, -0.004361f, -0.004654f, -0.004815f, -0.004847f, -0.004759f, -0.004562f, -0.004272f, -0.003906f, -0.003484f, -0.003026f, -0.002552f, -0.002084f, -0.001639f, -0.001234f, -0.000884f, -0.000600f, -0.000389f, -0.000255f, -0.000199f, -0.000217f, -0.000303f, -0.000448f, -0.000640f, -0.000865f, -0.001108f, -0.001354f, -0.001587f, -0.001793f, -0.001958f, -0.002073f, -0.002127f, -0.002116f, -0.002037f, -0.001890f, -0.001680f, -0.001413f, -0.001098f, -0.000749f, - -0.000378f, -0.000000f, 0.000367f, 0.000709f, 0.001010f, 0.001257f, 0.001436f, 0.001539f, 0.001559f, 0.001491f, 0.001336f, 0.001096f, 0.000777f, 0.000389f, -0.000057f, -0.000545f, -0.001059f, -0.001582f, -0.002095f, -0.002580f, -0.003020f, -0.003398f, -0.003701f, -0.003916f, -0.004034f, -0.004051f, -0.003962f, -0.003771f, -0.003482f, -0.003102f, -0.002643f, -0.002118f, -0.001543f, -0.000936f, -0.000313f, 0.000306f, 0.000903f, 0.001462f, 0.001967f, 0.002405f, 0.002765f, 0.003039f, 0.003223f, 0.003314f, 0.003315f, 0.003231f, 0.003067f, 0.002836f, 0.002547f, 0.002215f, 0.001853f, 0.001477f, 0.001101f, 0.000738f, 0.000401f, 0.000100f, -0.000155f, -0.000359f, -0.000508f, -0.000601f, -0.000639f, -0.000628f, -0.000572f, -0.000481f, -0.000363f, -0.000230f, -0.000092f, 0.000039f, 0.000152f, 0.000238f, 0.000289f, 0.000298f, 0.000260f, 0.000174f, 0.000039f, -0.000141f, -0.000362f, -0.000616f, -0.000895f, -0.001188f, -0.001484f, -0.001771f, -0.002037f, -0.002270f, -0.002460f, -0.002598f, -0.002675f, -0.002688f, -0.002633f, -0.002510f, -0.002320f, -0.002070f, -0.001765f, -0.001416f, -0.001033f, -0.000628f, - -0.000217f, 0.000189f, 0.000575f, 0.000927f, 0.001235f, 0.001487f, 0.001674f, 0.001792f, 0.001836f, 0.001806f, 0.001703f, 0.001532f, 0.001300f, 0.001017f, 0.000693f, 0.000341f, -0.000025f, -0.000392f, -0.000744f, -0.001069f, -0.001355f, -0.001591f, -0.001768f, -0.001881f, -0.001924f, -0.001898f, -0.001803f, -0.001645f, -0.001429f, -0.001165f, -0.000863f, -0.000536f, -0.000196f, 0.000143f, 0.000468f, 0.000765f, 0.001024f, 0.001235f, 0.001389f, 0.001482f, 0.001510f, 0.001472f, 0.001370f, 0.001211f, 0.000999f, 0.000746f, 0.000460f, 0.000156f, -0.459988f, -0.951364f, -0.610488f, 0.138856f, 0.698197f, 0.756538f, 0.243251f, -0.421561f, -0.809017f, -0.723124f, -0.130978f, 0.462606f, 0.869329f, 0.668927f, 0.030586f, -0.563056f, -0.788995f, -0.467552f, 0.152083f, 0.679937f, 0.729245f, 0.338703f, -0.322545f, -0.698697f, -0.615539f, -0.094425f, 0.456741f, 0.704130f, 0.460061f, -0.071586f, -0.567986f, -0.669722f, -0.335589f, 0.246636f, 0.632875f, 0.618595f, 0.155702f, -0.373707f, -0.695337f, -0.504141f, -0.123673f, 0.357714f, 0.720972f, 0.555961f, 0.039481f, -0.524585f, -0.688642f, -0.391594f, - 0.199571f, 0.632368f, 0.653497f, 0.212242f, -0.363710f, -0.698362f, -0.533969f, -0.013174f, 0.510447f, 0.654537f, 0.374430f, -0.161899f, -0.563497f, -0.567399f, -0.172138f, 0.340047f, 0.661268f, 0.495634f, -0.012328f, -0.517845f, -0.669687f, -0.364384f, 0.180465f, 0.612619f, 0.618588f, 0.208082f, -0.346706f, -0.674587f, -0.546981f, -0.034491f, 0.493899f, 0.663842f, 0.384299f, -0.161248f, -0.530011f, -0.571216f, -0.199479f, 0.330839f, 0.641365f, 0.517783f, 0.029365f, -0.469162f, -0.650912f, -0.382365f, 0.162567f, 0.572309f, 0.620024f, 0.258968f, -0.286565f, -0.604121f, -0.539109f, -0.134658f, 0.351582f, 0.601150f, 0.439245f, 0.005804f, -0.429748f, -0.570360f, -0.309470f, 0.144957f, 0.518672f, 0.532375f, 0.181912f, -0.316777f, -0.582908f, -0.462849f, 0.006490f, 0.467799f, 0.600352f, 0.338467f, -0.171078f, -0.576634f, -0.591189f, -0.184358f, 0.357559f, 0.635154f, 0.475979f, -0.006956f, -0.474676f, -0.603798f, -0.308351f, 0.187600f, 0.541923f, 0.513726f, 0.151033f, -0.322051f, -0.548969f, -0.399484f, 0.016445f, 0.417020f, 0.542622f, 0.294498f, -0.155090f, -0.498546f, -0.492820f, -0.152761f, - 0.286108f, 0.512682f, 0.385987f, -0.014018f, -0.390285f, -0.496220f, -0.247561f, 0.178302f, 0.478161f, 0.429657f, 0.081502f, -0.320164f, -0.471944f, -0.286304f, 0.091236f, 0.417376f, 0.439153f, 0.136549f, -0.272420f, -0.487026f, -0.361011f, 0.059105f, 0.421041f, 0.473316f, 0.174411f, -0.265012f, -0.518633f, -0.380817f, 0.063996f, 0.474638f, 0.521219f, 0.163071f, -0.331621f, -0.576037f, -0.349084f, 0.134778f, 0.496984f, 0.477692f, 0.054462f, -0.415126f, -0.543009f, -0.197895f, 0.324273f, 0.569567f, 0.294501f, -0.250950f, -0.561133f, -0.322396f, 0.225841f, 0.532439f, 0.278501f, -0.248472f, -0.474949f, -0.151682f, 0.312118f, 0.347247f, -0.075374f, -0.303858f, -0.026373f, 0.162830f, 0.018239f, -0.044566f, -0.004146f, 0.006047f, 0.000605f, 0.000729f, -0.000193f, 0.000013f, -0.000995f, 0.001505f, -0.000002f, 0.001062f, 0.000599f, 0.000661f, -0.000421f, 0.000596f, -0.000387f, 0.001767f, -0.000116f, 0.001335f, -0.000958f, 0.000380f, 0.000386f, 0.000219f, -0.001087f, 0.000999f, -0.000098f, 0.000362f, -0.000387f, 0.000100f, -0.000422f, 0.001448f, -0.001190f, 0.001039f, -0.000707f, -0.000023f}, - {0.000549f, 0.001631f, 0.002663f, 0.003615f, 0.004457f, 0.005166f, 0.005720f, 0.006107f, 0.006315f, 0.006343f, 0.006195f, 0.005878f, 0.005408f, 0.004806f, 0.004094f, 0.003303f, 0.002461f, 0.001602f, 0.000756f, -0.000043f, -0.000768f, -0.001390f, -0.001888f, -0.002243f, -0.002443f, -0.002479f, -0.002352f, -0.002064f, -0.001626f, -0.001054f, -0.000369f, 0.000407f, 0.001245f, 0.002115f, 0.002988f, 0.003833f, 0.004619f, 0.005320f, 0.005911f, 0.006370f, 0.006682f, 0.006834f, 0.006822f, 0.006644f, 0.006305f, 0.005815f, 0.005189f, 0.004445f, 0.003606f, 0.002698f, 0.001746f, 0.000779f, -0.000176f, -0.001093f, -0.001948f, -0.002718f, -0.003385f, -0.003937f, -0.004361f, -0.004654f, -0.004815f, -0.004847f, -0.004759f, -0.004562f, -0.004272f, -0.003906f, -0.003484f, -0.003026f, -0.002552f, -0.002084f, -0.001639f, -0.001234f, -0.000884f, -0.000600f, -0.000389f, -0.000255f, -0.000199f, -0.000217f, -0.000303f, -0.000448f, -0.000640f, -0.000865f, -0.001108f, -0.001354f, -0.001587f, -0.001793f, -0.001958f, -0.002073f, -0.002127f, -0.002116f, -0.002037f, -0.001890f, -0.001680f, -0.001413f, -0.001098f, -0.000749f, - -0.000378f, -0.000000f, 0.000367f, 0.000709f, 0.001010f, 0.001257f, 0.001436f, 0.001539f, 0.001559f, 0.001491f, 0.001336f, 0.001096f, 0.000777f, 0.000389f, -0.000057f, -0.000545f, -0.001059f, -0.001582f, -0.002095f, -0.002580f, -0.003020f, -0.003398f, -0.003701f, -0.003916f, -0.004034f, -0.004051f, -0.003962f, -0.003771f, -0.003482f, -0.003102f, -0.002643f, -0.002118f, -0.001543f, -0.000936f, -0.000313f, 0.000306f, 0.000903f, 0.001462f, 0.001967f, 0.002405f, 0.002765f, 0.003039f, 0.003223f, 0.003314f, 0.003315f, 0.003231f, 0.003067f, 0.002836f, 0.002547f, 0.002215f, 0.001853f, 0.001477f, 0.001101f, 0.000738f, 0.000401f, 0.000100f, -0.000155f, -0.000359f, -0.000508f, -0.000601f, -0.000639f, -0.000628f, -0.000572f, -0.000481f, -0.000363f, -0.000230f, -0.000092f, 0.000039f, 0.000152f, 0.000238f, 0.000289f, 0.000298f, 0.000260f, 0.000174f, 0.000039f, -0.000141f, -0.000362f, -0.000616f, -0.000895f, -0.001188f, -0.001484f, -0.001771f, -0.002037f, -0.002270f, -0.002460f, -0.002598f, -0.002675f, -0.002688f, -0.002633f, -0.002510f, -0.002320f, -0.002070f, -0.001765f, -0.001416f, -0.001033f, -0.000628f, - -0.000217f, 0.000189f, 0.000575f, 0.000927f, 0.001235f, 0.001487f, 0.001674f, 0.001792f, 0.001836f, 0.001806f, 0.001703f, 0.001532f, 0.001300f, 0.001017f, 0.000693f, 0.000341f, -0.000025f, -0.000392f, -0.000744f, -0.001069f, -0.001355f, -0.001591f, -0.001768f, -0.001881f, -0.001924f, -0.001898f, -0.001803f, -0.001645f, -0.001429f, -0.001165f, -0.000863f, -0.000536f, -0.000196f, 0.000143f, 0.000468f, 0.000765f, 0.001024f, 0.001235f, 0.001389f, 0.001482f, 0.001510f, 0.001472f, 0.001370f, 0.001211f, 0.000999f, 0.000746f, 0.000460f, 0.000156f, -0.459988f, -0.951364f, -0.610488f, 0.138856f, 0.698197f, 0.756538f, 0.243251f, -0.421561f, -0.809017f, -0.723124f, -0.130978f, 0.462606f, 0.869329f, 0.668927f, 0.030586f, -0.563056f, -0.788995f, -0.467552f, 0.152083f, 0.679937f, 0.729245f, 0.338703f, -0.322545f, -0.698697f, -0.615539f, -0.094425f, 0.456741f, 0.704130f, 0.460061f, -0.071586f, -0.567986f, -0.669722f, -0.335589f, 0.246636f, 0.632875f, 0.618595f, 0.155702f, -0.373707f, -0.695337f, -0.504141f, -0.123673f, 0.357714f, 0.720972f, 0.555961f, 0.039481f, -0.524585f, -0.688642f, -0.391594f, - 0.199571f, 0.632368f, 0.653497f, 0.212242f, -0.363710f, -0.698362f, -0.533969f, -0.013174f, 0.510447f, 0.654537f, 0.374430f, -0.161899f, -0.563497f, -0.567399f, -0.172138f, 0.340047f, 0.661268f, 0.495634f, -0.012328f, -0.517845f, -0.669687f, -0.364384f, 0.180465f, 0.612619f, 0.618588f, 0.208082f, -0.346706f, -0.674587f, -0.546981f, -0.034491f, 0.493899f, 0.663842f, 0.384299f, -0.161248f, -0.530011f, -0.571216f, -0.199479f, 0.330839f, 0.641365f, 0.517783f, 0.029365f, -0.469162f, -0.650912f, -0.382365f, 0.162567f, 0.572309f, 0.620024f, 0.258968f, -0.286565f, -0.604121f, -0.539109f, -0.134658f, 0.351582f, 0.601150f, 0.439245f, 0.005804f, -0.429748f, -0.570360f, -0.309470f, 0.144957f, 0.518672f, 0.532375f, 0.181912f, -0.316777f, -0.582908f, -0.462849f, 0.006490f, 0.467799f, 0.600352f, 0.338467f, -0.171078f, -0.576634f, -0.591189f, -0.184358f, 0.357559f, 0.635154f, 0.475979f, -0.006956f, -0.474676f, -0.603798f, -0.308351f, 0.187600f, 0.541923f, 0.513726f, 0.151033f, -0.322051f, -0.548969f, -0.399484f, 0.016445f, 0.417020f, 0.542622f, 0.294498f, -0.155090f, -0.498546f, -0.492820f, -0.152761f, - 0.286108f, 0.512682f, 0.385987f, -0.014018f, -0.390285f, -0.496220f, -0.247561f, 0.178302f, 0.478161f, 0.429657f, 0.081502f, -0.320164f, -0.471944f, -0.286304f, 0.091236f, 0.417376f, 0.439153f, 0.136549f, -0.272420f, -0.487026f, -0.361011f, 0.059105f, 0.421041f, 0.473316f, 0.174411f, -0.265012f, -0.518633f, -0.380817f, 0.063996f, 0.474638f, 0.521219f, 0.163071f, -0.331621f, -0.576037f, -0.349084f, 0.134778f, 0.496984f, 0.477692f, 0.054462f, -0.415126f, -0.543009f, -0.197895f, 0.324273f, 0.569567f, 0.294501f, -0.250950f, -0.561133f, -0.322396f, 0.225841f, 0.532439f, 0.278501f, -0.248472f, -0.474949f, -0.151682f, 0.312118f, 0.347247f, -0.075374f, -0.303858f, -0.026373f, 0.162830f, 0.018239f, -0.044566f, -0.004146f, 0.006047f, 0.000605f, 0.000729f, -0.000193f, 0.000013f, -0.000995f, 0.001505f, -0.000002f, 0.001062f, 0.000599f, 0.000661f, -0.000421f, 0.000596f, -0.000387f, 0.001767f, -0.000116f, 0.001335f, -0.000958f, 0.000380f, 0.000386f, 0.000219f, -0.001087f, 0.000999f, -0.000098f, 0.000362f, -0.000387f, 0.000100f, -0.000422f, 0.001448f, -0.001190f, 0.001039f, -0.000707f, -0.000023f} - }, - { - {0.000033f, 0.000115f, 0.000241f, 0.000437f, 0.000727f, 0.001129f, 0.001655f, 0.002311f, 0.003095f, 0.003997f, 0.005000f, 0.006080f, 0.007207f, 0.008344f, 0.009452f, 0.010488f, 0.011408f, 0.012168f, 0.012727f, 0.013047f, 0.013096f, 0.012849f, 0.012289f, 0.011407f, 0.010204f, 0.008692f, 0.006891f, 0.004833f, 0.002557f, 0.000110f, -0.002454f, -0.005076f, -0.007695f, -0.010247f, -0.012669f, -0.014902f, -0.016890f, -0.018583f, -0.019939f, -0.020927f, -0.021524f, -0.021719f, -0.021511f, -0.020913f, -0.019945f, -0.018640f, -0.017040f, -0.015194f, -0.013159f, -0.010993f, -0.008762f, -0.006527f, -0.004353f, -0.002298f, -0.000417f, 0.001242f, 0.002639f, 0.003742f, 0.004530f, 0.004993f, 0.005128f, 0.004945f, 0.004462f, 0.003708f, 0.002717f, 0.001530f, 0.000194f, -0.001242f, -0.002728f, -0.004213f, -0.005648f, -0.006988f, -0.008193f, -0.009228f, -0.010064f, -0.010683f, -0.011072f, -0.011225f, -0.011147f, -0.010848f, -0.010345f, -0.009663f, -0.008828f, -0.007874f, -0.006833f, -0.005740f, -0.004631f, -0.003539f, -0.002495f, -0.001526f, -0.000655f, 0.000100f, 0.000726f, 0.001215f, 0.001564f, 0.001777f, - 0.001862f, 0.001828f, 0.001693f, 0.001472f, 0.001184f, 0.000850f, 0.000488f, 0.000116f, -0.000248f, -0.000591f, -0.000901f, -0.001170f, -0.001394f, -0.001571f, -0.001703f, -0.001795f, -0.001854f, -0.001888f, -0.001908f, -0.001924f, -0.001948f, -0.001988f, -0.002054f, -0.002152f, -0.002286f, -0.002457f, -0.002663f, -0.002901f, -0.003162f, -0.003438f, -0.003715f, -0.003981f, -0.004221f, -0.004421f, -0.004565f, -0.004641f, -0.004636f, -0.004542f, -0.004353f, -0.004066f, -0.003682f, -0.003206f, -0.002647f, -0.002017f, -0.001331f, -0.000609f, 0.000129f, 0.000860f, 0.001562f, 0.002212f, 0.002787f, 0.003268f, 0.003637f, 0.003881f, 0.003990f, 0.003958f, 0.003786f, 0.003477f, 0.003040f, 0.002489f, 0.001844f, 0.001124f, 0.000354f, -0.000438f, -0.001225f, -0.001980f, -0.002675f, -0.003285f, -0.003789f, -0.004167f, -0.004406f, -0.004495f, -0.004431f, -0.004215f, -0.003854f, -0.003359f, -0.002748f, -0.002040f, -0.001261f, -0.000438f, 0.000402f, 0.001229f, 0.002013f, 0.002729f, 0.003351f, 0.003858f, 0.004232f, 0.004463f, 0.004541f, 0.004466f, 0.004242f, 0.003877f, 0.003386f, 0.002787f, 0.002103f, 0.001359f, - 0.000583f, -0.000199f, -0.000957f, -0.001665f, -0.002299f, -0.002836f, -0.003258f, -0.003553f, -0.003712f, -0.003732f, -0.003614f, -0.003366f, -0.002999f, -0.002531f, -0.001981f, -0.001373f, -0.000730f, -0.000078f, 0.000556f, 0.001147f, 0.001674f, 0.002116f, 0.002456f, 0.002683f, 0.002788f, 0.002770f, 0.002631f, 0.002377f, 0.002020f, 0.001577f, 0.001065f, 0.000507f, -0.000074f, -0.000653f, -0.001208f, -0.001715f, -0.002153f, -0.002504f, -0.002755f, -0.002894f, -0.002917f, -0.002822f, -0.002613f, -0.002299f, -0.001892f, -0.001409f, -0.000869f, -0.000293f, 0.049131f, -0.015616f, -0.522292f, -0.600258f, -0.029599f, 0.813772f, 0.895386f, 0.289781f, -0.543579f, -0.625267f, -0.515360f, 0.034943f, 0.575737f, 0.501286f, 0.121036f, -0.361330f, -0.606864f, -0.495434f, 0.005356f, 0.414851f, 0.580779f, 0.318371f, -0.123311f, -0.593897f, -0.557451f, -0.169763f, 0.347590f, 0.571183f, 0.524966f, 0.030215f, -0.384597f, -0.656131f, -0.441995f, 0.048106f, 0.566672f, 0.677656f, 0.404255f, -0.224061f, -0.700876f, -0.731566f, -0.152888f, 0.531724f, 0.760169f, 0.501596f, -0.144728f, -0.704601f, -0.795966f, -0.330431f, - 0.353769f, 0.753201f, 0.632239f, 0.089246f, -0.518902f, -0.792079f, -0.525313f, 0.104648f, 0.617031f, 0.707476f, 0.314736f, -0.260498f, -0.691655f, -0.601412f, -0.141066f, 0.463251f, 0.710407f, 0.595793f, 0.079532f, -0.566041f, -0.843219f, -0.546416f, 0.105977f, 0.689965f, 0.809491f, 0.360253f, -0.318746f, -0.836742f, -0.743698f, -0.190055f, 0.522132f, 0.866911f, 0.580073f, -0.073123f, -0.601450f, -0.773098f, -0.387519f, 0.305634f, 0.768200f, 0.716101f, 0.158541f, -0.513838f, -0.804112f, -0.591068f, 0.032888f, 0.617203f, 0.790415f, 0.449739f, -0.218370f, -0.690069f, -0.721129f, -0.227665f, 0.387618f, 0.763053f, 0.570480f, 0.034747f, -0.545742f, -0.740702f, -0.422311f, 0.218477f, 0.693095f, 0.673995f, 0.183893f, -0.441957f, -0.734538f, -0.536156f, 0.074688f, 0.632881f, 0.739209f, 0.338747f, -0.278687f, -0.756625f, -0.698729f, -0.160207f, 0.460456f, 0.758172f, 0.544559f, -0.052809f, -0.595830f, -0.706044f, -0.331895f, 0.255145f, 0.628821f, 0.584354f, 0.128971f, -0.420826f, -0.663711f, -0.453743f, 0.061328f, 0.526863f, 0.647273f, 0.317473f, -0.228324f, -0.609292f, -0.576534f, -0.146893f, - 0.392392f, 0.635176f, 0.429766f, -0.061573f, -0.513517f, -0.617936f, -0.268287f, 0.255404f, 0.606177f, 0.516536f, 0.065794f, -0.428316f, -0.592311f, -0.336865f, 0.139531f, 0.539778f, 0.555964f, 0.157542f, -0.382310f, -0.625238f, -0.458078f, 0.099422f, 0.550784f, 0.609096f, 0.201930f, -0.351519f, -0.671711f, -0.479070f, 0.078702f, 0.611679f, 0.668634f, 0.215243f, -0.430488f, -0.717891f, -0.470740f, 0.197954f, 0.766795f, 0.682469f, 0.044272f, -0.648601f, -0.791369f, -0.268294f, 0.498422f, 0.820191f, 0.406963f, -0.377448f, -0.799427f, -0.464122f, 0.311450f, 0.753181f, 0.422651f, -0.330904f, -0.685414f, -0.265079f, 0.430938f, 0.533296f, -0.072866f, -0.462007f, -0.064815f, 0.243788f, 0.040393f, -0.070903f, -0.008836f, 0.006176f, 0.000743f, -0.001883f, -0.000500f, -0.000516f, 0.001860f, 0.000220f, -0.001136f, -0.001868f, -0.001613f, -0.001259f, 0.000712f, 0.000443f, -0.000560f, -0.001141f, 0.000506f, -0.000510f, 0.001301f, -0.002347f, 0.000487f, 0.000658f, -0.000408f, 0.001931f, -0.000180f, 0.000240f, 0.001278f, -0.000570f, 0.001468f, -0.001239f, 0.001603f, -0.000209f, 0.002269f, 0.000913f}, - {-0.000033f, -0.000115f, -0.000241f, -0.000437f, -0.000727f, -0.001129f, -0.001655f, -0.002311f, -0.003095f, -0.003997f, -0.005000f, -0.006080f, -0.007207f, -0.008344f, -0.009452f, -0.010488f, -0.011408f, -0.012168f, -0.012727f, -0.013047f, -0.013096f, -0.012849f, -0.012289f, -0.011407f, -0.010204f, -0.008692f, -0.006891f, -0.004833f, -0.002557f, -0.000110f, 0.002454f, 0.005076f, 0.007695f, 0.010247f, 0.012669f, 0.014902f, 0.016890f, 0.018583f, 0.019939f, 0.020927f, 0.021524f, 0.021719f, 0.021511f, 0.020913f, 0.019945f, 0.018640f, 0.017040f, 0.015194f, 0.013159f, 0.010993f, 0.008762f, 0.006527f, 0.004353f, 0.002298f, 0.000417f, -0.001242f, -0.002639f, -0.003742f, -0.004530f, -0.004993f, -0.005128f, -0.004945f, -0.004462f, -0.003708f, -0.002717f, -0.001530f, -0.000194f, 0.001242f, 0.002728f, 0.004213f, 0.005648f, 0.006988f, 0.008193f, 0.009228f, 0.010064f, 0.010683f, 0.011072f, 0.011225f, 0.011147f, 0.010848f, 0.010345f, 0.009663f, 0.008828f, 0.007874f, 0.006833f, 0.005740f, 0.004631f, 0.003539f, 0.002495f, 0.001526f, 0.000655f, -0.000100f, -0.000726f, -0.001215f, -0.001564f, -0.001777f, - -0.001862f, -0.001828f, -0.001693f, -0.001472f, -0.001184f, -0.000850f, -0.000488f, -0.000116f, 0.000248f, 0.000591f, 0.000901f, 0.001170f, 0.001394f, 0.001571f, 0.001703f, 0.001795f, 0.001854f, 0.001888f, 0.001908f, 0.001924f, 0.001948f, 0.001988f, 0.002054f, 0.002152f, 0.002286f, 0.002457f, 0.002663f, 0.002901f, 0.003162f, 0.003438f, 0.003715f, 0.003981f, 0.004221f, 0.004421f, 0.004565f, 0.004641f, 0.004636f, 0.004542f, 0.004353f, 0.004066f, 0.003682f, 0.003206f, 0.002647f, 0.002017f, 0.001331f, 0.000609f, -0.000129f, -0.000860f, -0.001562f, -0.002212f, -0.002787f, -0.003268f, -0.003637f, -0.003881f, -0.003990f, -0.003958f, -0.003786f, -0.003477f, -0.003040f, -0.002489f, -0.001844f, -0.001124f, -0.000354f, 0.000438f, 0.001225f, 0.001980f, 0.002675f, 0.003285f, 0.003789f, 0.004167f, 0.004406f, 0.004495f, 0.004431f, 0.004215f, 0.003854f, 0.003359f, 0.002748f, 0.002040f, 0.001261f, 0.000438f, -0.000402f, -0.001229f, -0.002013f, -0.002729f, -0.003351f, -0.003858f, -0.004232f, -0.004463f, -0.004541f, -0.004466f, -0.004242f, -0.003877f, -0.003386f, -0.002787f, -0.002103f, -0.001359f, - -0.000583f, 0.000199f, 0.000957f, 0.001665f, 0.002299f, 0.002836f, 0.003258f, 0.003553f, 0.003712f, 0.003732f, 0.003614f, 0.003366f, 0.002999f, 0.002531f, 0.001981f, 0.001373f, 0.000730f, 0.000078f, -0.000556f, -0.001147f, -0.001674f, -0.002116f, -0.002456f, -0.002683f, -0.002788f, -0.002770f, -0.002631f, -0.002377f, -0.002020f, -0.001577f, -0.001065f, -0.000507f, 0.000074f, 0.000653f, 0.001208f, 0.001715f, 0.002153f, 0.002504f, 0.002755f, 0.002894f, 0.002917f, 0.002822f, 0.002613f, 0.002299f, 0.001892f, 0.001409f, 0.000869f, 0.000293f, -0.049131f, 0.015616f, 0.522292f, 0.600258f, 0.029599f, -0.813772f, -0.895386f, -0.289781f, 0.543579f, 0.625267f, 0.515360f, -0.034943f, -0.575737f, -0.501286f, -0.121036f, 0.361330f, 0.606864f, 0.495434f, -0.005356f, -0.414851f, -0.580779f, -0.318371f, 0.123311f, 0.593897f, 0.557451f, 0.169763f, -0.347590f, -0.571183f, -0.524966f, -0.030215f, 0.384597f, 0.656131f, 0.441995f, -0.048106f, -0.566672f, -0.677656f, -0.404255f, 0.224061f, 0.700876f, 0.731566f, 0.152888f, -0.531724f, -0.760169f, -0.501596f, 0.144728f, 0.704601f, 0.795966f, 0.330431f, - -0.353769f, -0.753201f, -0.632239f, -0.089246f, 0.518902f, 0.792079f, 0.525313f, -0.104648f, -0.617031f, -0.707476f, -0.314736f, 0.260498f, 0.691655f, 0.601412f, 0.141066f, -0.463251f, -0.710407f, -0.595793f, -0.079532f, 0.566041f, 0.843219f, 0.546416f, -0.105977f, -0.689965f, -0.809491f, -0.360253f, 0.318746f, 0.836742f, 0.743698f, 0.190055f, -0.522132f, -0.866911f, -0.580073f, 0.073123f, 0.601450f, 0.773098f, 0.387519f, -0.305634f, -0.768200f, -0.716101f, -0.158541f, 0.513838f, 0.804112f, 0.591068f, -0.032888f, -0.617203f, -0.790415f, -0.449739f, 0.218370f, 0.690069f, 0.721129f, 0.227665f, -0.387618f, -0.763053f, -0.570480f, -0.034747f, 0.545742f, 0.740702f, 0.422311f, -0.218477f, -0.693095f, -0.673995f, -0.183893f, 0.441957f, 0.734538f, 0.536156f, -0.074688f, -0.632881f, -0.739209f, -0.338747f, 0.278687f, 0.756625f, 0.698729f, 0.160207f, -0.460456f, -0.758172f, -0.544559f, 0.052809f, 0.595830f, 0.706044f, 0.331895f, -0.255145f, -0.628821f, -0.584354f, -0.128971f, 0.420826f, 0.663711f, 0.453743f, -0.061328f, -0.526863f, -0.647273f, -0.317473f, 0.228324f, 0.609292f, 0.576534f, 0.146893f, - -0.392392f, -0.635176f, -0.429766f, 0.061573f, 0.513517f, 0.617936f, 0.268287f, -0.255404f, -0.606177f, -0.516536f, -0.065794f, 0.428316f, 0.592311f, 0.336865f, -0.139531f, -0.539778f, -0.555964f, -0.157542f, 0.382310f, 0.625238f, 0.458078f, -0.099422f, -0.550784f, -0.609096f, -0.201930f, 0.351519f, 0.671711f, 0.479070f, -0.078702f, -0.611679f, -0.668634f, -0.215243f, 0.430488f, 0.717891f, 0.470740f, -0.197954f, -0.766795f, -0.682469f, -0.044272f, 0.648601f, 0.791369f, 0.268294f, -0.498422f, -0.820191f, -0.406963f, 0.377448f, 0.799427f, 0.464122f, -0.311450f, -0.753181f, -0.422651f, 0.330904f, 0.685414f, 0.265079f, -0.430938f, -0.533296f, 0.072866f, 0.462007f, 0.064815f, -0.243788f, -0.040393f, 0.070903f, 0.008836f, -0.006176f, -0.000743f, 0.001883f, 0.000500f, 0.000516f, -0.001860f, -0.000220f, 0.001136f, 0.001868f, 0.001613f, 0.001259f, -0.000712f, -0.000443f, 0.000560f, 0.001141f, -0.000506f, 0.000510f, -0.001301f, 0.002347f, -0.000487f, -0.000658f, 0.000408f, -0.001931f, 0.000180f, -0.000240f, -0.001278f, 0.000570f, -0.001468f, 0.001239f, -0.001603f, 0.000209f, -0.002269f, -0.000913f} - }, - { - {-0.002272f, -0.006795f, -0.011257f, -0.015617f, -0.019835f, -0.023870f, -0.027681f, -0.031227f, -0.034468f, -0.037367f, -0.039885f, -0.041987f, -0.043643f, -0.044825f, -0.045510f, -0.045682f, -0.045329f, -0.044450f, -0.043050f, -0.041143f, -0.038752f, -0.035909f, -0.032657f, -0.029046f, -0.025134f, -0.020989f, -0.016682f, -0.012291f, -0.007898f, -0.003585f, 0.000565f, 0.004471f, 0.008056f, 0.011249f, 0.013987f, 0.016216f, 0.017893f, 0.018988f, 0.019483f, 0.019374f, 0.018672f, 0.017402f, 0.015600f, 0.013318f, 0.010618f, 0.007572f, 0.004259f, 0.000766f, -0.002818f, -0.006400f, -0.009890f, -0.013202f, -0.016252f, -0.018968f, -0.021285f, -0.023149f, -0.024521f, -0.025372f, -0.025691f, -0.025479f, -0.024751f, -0.023537f, -0.021877f, -0.019824f, -0.017440f, -0.014795f, -0.011964f, -0.009025f, -0.006057f, -0.003140f, -0.000347f, 0.002250f, 0.004591f, 0.006621f, 0.008296f, 0.009584f, 0.010463f, 0.010925f, 0.010971f, 0.010616f, 0.009883f, 0.008806f, 0.007428f, 0.005795f, 0.003963f, 0.001987f, -0.000073f, -0.002162f, -0.004221f, -0.006199f, -0.008049f, -0.009728f, -0.011202f, -0.012444f, -0.013434f, -0.014163f, - -0.014628f, -0.014832f, -0.014789f, -0.014516f, -0.014036f, -0.013377f, -0.012571f, -0.011648f, -0.010644f, -0.009589f, -0.008516f, -0.007453f, -0.006427f, -0.005458f, -0.004566f, -0.003762f, -0.003057f, -0.002455f, -0.001955f, -0.001554f, -0.001247f, -0.001022f, -0.000870f, -0.000777f, -0.000731f, -0.000719f, -0.000729f, -0.000749f, -0.000770f, -0.000785f, -0.000788f, -0.000777f, -0.000751f, -0.000710f, -0.000659f, -0.000600f, -0.000539f, -0.000482f, -0.000436f, -0.000405f, -0.000395f, -0.000409f, -0.000449f, -0.000517f, -0.000610f, -0.000725f, -0.000858f, -0.001002f, -0.001149f, -0.001288f, -0.001412f, -0.001508f, -0.001568f, -0.001582f, -0.001542f, -0.001441f, -0.001274f, -0.001038f, -0.000734f, -0.000365f, 0.000066f, 0.000550f, 0.001078f, 0.001638f, 0.002216f, 0.002797f, 0.003367f, 0.003909f, 0.004408f, 0.004850f, 0.005222f, 0.005512f, 0.005712f, 0.005815f, 0.005818f, 0.005721f, 0.005526f, 0.005238f, 0.004865f, 0.004419f, 0.003912f, 0.003358f, 0.002773f, 0.002172f, 0.001572f, 0.000989f, 0.000436f, -0.000072f, -0.000525f, -0.000914f, -0.001232f, -0.001476f, -0.001643f, -0.001736f, -0.001759f, -0.001718f, - -0.001620f, -0.001476f, -0.001297f, -0.001095f, -0.000880f, -0.000665f, -0.000460f, -0.000275f, -0.000118f, 0.000004f, 0.000088f, 0.000129f, 0.000129f, 0.000089f, 0.000012f, -0.000096f, -0.000228f, -0.000378f, -0.000536f, -0.000694f, -0.000843f, -0.000975f, -0.001084f, -0.001163f, -0.001208f, -0.001215f, -0.001183f, -0.001114f, -0.001009f, -0.000872f, -0.000709f, -0.000526f, -0.000331f, -0.000131f, 0.000065f, 0.000250f, 0.000415f, 0.000555f, 0.000663f, 0.000736f, 0.000771f, 0.000767f, 0.000725f, 0.000648f, 0.000540f, 0.000405f, 0.000251f, 0.000085f, -0.059789f, -0.102829f, -0.092753f, 0.169252f, 0.093765f, -0.110248f, -0.095322f, 0.009461f, 0.074713f, 0.221773f, 0.387343f, 0.304712f, -0.048022f, 0.160610f, -0.081762f, -0.113382f, -0.081985f, 0.078842f, 0.099060f, 0.161641f, 0.146515f, 0.134489f, -0.053092f, -0.199125f, -0.154658f, 0.111864f, 0.191718f, 0.134431f, -0.053547f, -0.160212f, -0.247981f, -0.088622f, 0.085153f, 0.222292f, 0.162242f, -0.013458f, -0.238175f, -0.220659f, -0.130588f, 0.083230f, -0.006207f, -0.064393f, 0.177034f, 0.211256f, 0.150919f, -0.065328f, -0.180990f, -0.183912f, - -0.016825f, 0.198157f, 0.309640f, 0.155162f, -0.070330f, -0.296548f, -0.324287f, -0.090291f, 0.289213f, 0.471930f, 0.310026f, -0.111317f, -0.473323f, -0.533542f, -0.208394f, 0.244730f, 0.540629f, 0.312600f, -0.147136f, -0.472310f, -0.372218f, 0.003398f, 0.387393f, 0.428112f, 0.198046f, -0.184664f, -0.399299f, -0.269342f, 0.015118f, 0.323212f, 0.361407f, 0.070727f, -0.185849f, -0.326405f, -0.211415f, 0.043730f, 0.263641f, 0.263832f, 0.112385f, -0.133428f, -0.218343f, -0.175736f, -0.025087f, 0.111237f, 0.154633f, 0.126215f, 0.065378f, -0.077963f, -0.105330f, -0.075156f, 0.037828f, 0.184245f, 0.203843f, 0.017538f, -0.180532f, -0.306739f, -0.183135f, 0.120400f, 0.329952f, 0.313537f, 0.081923f, -0.191752f, -0.341449f, -0.208336f, 0.036696f, 0.273900f, 0.269394f, 0.080001f, -0.140039f, -0.256785f, -0.187831f, -0.003402f, 0.168854f, 0.171834f, 0.130938f, -0.020893f, -0.112005f, -0.126611f, -0.078294f, -0.032492f, 0.036975f, 0.085114f, 0.097007f, 0.040828f, -0.017462f, -0.082045f, -0.077678f, -0.040142f, 0.042448f, 0.078425f, 0.102311f, 0.029889f, -0.039703f, -0.081530f, -0.060571f, -0.006374f, - 0.047472f, 0.063504f, 0.059607f, -0.017375f, -0.048996f, -0.050657f, -0.024905f, 0.023163f, 0.046934f, 0.038970f, -0.010564f, -0.045341f, -0.037140f, -0.022486f, 0.030092f, 0.047710f, 0.024071f, -0.021430f, -0.024707f, -0.047456f, -0.005417f, 0.018754f, 0.040895f, 0.026417f, -0.007848f, -0.034097f, -0.027195f, 0.003021f, 0.035275f, 0.019933f, -0.011997f, -0.023716f, -0.011194f, 0.030116f, 0.027922f, 0.075121f, 0.083562f, -0.036478f, -0.111375f, -0.108350f, 0.022050f, 0.120270f, 0.118130f, -0.027445f, -0.135747f, -0.117002f, 0.042730f, 0.142848f, 0.094614f, -0.070999f, -0.137432f, -0.050371f, 0.099772f, 0.104817f, -0.015100f, -0.110045f, -0.026105f, 0.072741f, 0.032957f, -0.043118f, -0.006230f, 0.008846f, 0.005076f, -0.004781f, 0.004484f, -0.003187f, 0.004079f, -0.004361f, 0.001958f, -0.004392f, 0.004279f, -0.003276f, 0.003650f, -0.002566f, 0.002882f, -0.003588f, 0.002789f, -0.003288f, 0.005494f, -0.001615f, 0.004485f, -0.003597f, 0.003197f, -0.003885f, 0.002673f, -0.003492f, 0.003498f, -0.002798f, 0.003864f, -0.003417f, 0.003344f, -0.003215f, 0.002718f, -0.004054f, 0.002212f, -0.003445f}, - {-0.002272f, -0.006795f, -0.011257f, -0.015617f, -0.019835f, -0.023870f, -0.027681f, -0.031227f, -0.034468f, -0.037367f, -0.039885f, -0.041987f, -0.043643f, -0.044825f, -0.045510f, -0.045682f, -0.045329f, -0.044450f, -0.043050f, -0.041143f, -0.038752f, -0.035909f, -0.032657f, -0.029046f, -0.025134f, -0.020989f, -0.016682f, -0.012291f, -0.007898f, -0.003585f, 0.000565f, 0.004471f, 0.008056f, 0.011249f, 0.013987f, 0.016216f, 0.017893f, 0.018988f, 0.019483f, 0.019374f, 0.018672f, 0.017402f, 0.015600f, 0.013318f, 0.010618f, 0.007572f, 0.004259f, 0.000766f, -0.002818f, -0.006400f, -0.009890f, -0.013202f, -0.016252f, -0.018968f, -0.021285f, -0.023149f, -0.024521f, -0.025372f, -0.025691f, -0.025479f, -0.024751f, -0.023537f, -0.021877f, -0.019824f, -0.017440f, -0.014795f, -0.011964f, -0.009025f, -0.006057f, -0.003140f, -0.000347f, 0.002250f, 0.004591f, 0.006621f, 0.008296f, 0.009584f, 0.010463f, 0.010925f, 0.010971f, 0.010616f, 0.009883f, 0.008806f, 0.007428f, 0.005795f, 0.003963f, 0.001987f, -0.000073f, -0.002162f, -0.004221f, -0.006199f, -0.008049f, -0.009728f, -0.011202f, -0.012444f, -0.013434f, -0.014163f, - -0.014628f, -0.014832f, -0.014789f, -0.014516f, -0.014036f, -0.013377f, -0.012571f, -0.011648f, -0.010644f, -0.009589f, -0.008516f, -0.007453f, -0.006427f, -0.005458f, -0.004566f, -0.003762f, -0.003057f, -0.002455f, -0.001955f, -0.001554f, -0.001247f, -0.001022f, -0.000870f, -0.000777f, -0.000731f, -0.000719f, -0.000729f, -0.000749f, -0.000770f, -0.000785f, -0.000788f, -0.000777f, -0.000751f, -0.000710f, -0.000659f, -0.000600f, -0.000539f, -0.000482f, -0.000436f, -0.000405f, -0.000395f, -0.000409f, -0.000449f, -0.000517f, -0.000610f, -0.000725f, -0.000858f, -0.001002f, -0.001149f, -0.001288f, -0.001412f, -0.001508f, -0.001568f, -0.001582f, -0.001542f, -0.001441f, -0.001274f, -0.001038f, -0.000734f, -0.000365f, 0.000066f, 0.000550f, 0.001078f, 0.001638f, 0.002216f, 0.002797f, 0.003367f, 0.003909f, 0.004408f, 0.004850f, 0.005222f, 0.005512f, 0.005712f, 0.005815f, 0.005818f, 0.005721f, 0.005526f, 0.005238f, 0.004865f, 0.004419f, 0.003912f, 0.003358f, 0.002773f, 0.002172f, 0.001572f, 0.000989f, 0.000436f, -0.000072f, -0.000525f, -0.000914f, -0.001232f, -0.001476f, -0.001643f, -0.001736f, -0.001759f, -0.001718f, - -0.001620f, -0.001476f, -0.001297f, -0.001095f, -0.000880f, -0.000665f, -0.000460f, -0.000275f, -0.000118f, 0.000004f, 0.000088f, 0.000129f, 0.000129f, 0.000089f, 0.000012f, -0.000096f, -0.000228f, -0.000378f, -0.000536f, -0.000694f, -0.000843f, -0.000975f, -0.001084f, -0.001163f, -0.001208f, -0.001215f, -0.001183f, -0.001114f, -0.001009f, -0.000872f, -0.000709f, -0.000526f, -0.000331f, -0.000131f, 0.000065f, 0.000250f, 0.000415f, 0.000555f, 0.000663f, 0.000736f, 0.000771f, 0.000767f, 0.000725f, 0.000648f, 0.000540f, 0.000405f, 0.000251f, 0.000085f, -0.059789f, -0.102829f, -0.092753f, 0.169252f, 0.093765f, -0.110248f, -0.095322f, 0.009461f, 0.074713f, 0.221773f, 0.387343f, 0.304712f, -0.048022f, 0.160610f, -0.081762f, -0.113382f, -0.081985f, 0.078842f, 0.099060f, 0.161641f, 0.146515f, 0.134489f, -0.053092f, -0.199125f, -0.154658f, 0.111864f, 0.191718f, 0.134431f, -0.053547f, -0.160212f, -0.247981f, -0.088622f, 0.085153f, 0.222292f, 0.162242f, -0.013458f, -0.238175f, -0.220659f, -0.130588f, 0.083230f, -0.006207f, -0.064393f, 0.177034f, 0.211256f, 0.150919f, -0.065328f, -0.180990f, -0.183912f, - -0.016825f, 0.198157f, 0.309640f, 0.155162f, -0.070330f, -0.296548f, -0.324287f, -0.090291f, 0.289213f, 0.471930f, 0.310026f, -0.111317f, -0.473323f, -0.533542f, -0.208394f, 0.244730f, 0.540629f, 0.312600f, -0.147136f, -0.472310f, -0.372218f, 0.003398f, 0.387393f, 0.428112f, 0.198046f, -0.184664f, -0.399299f, -0.269342f, 0.015118f, 0.323212f, 0.361407f, 0.070727f, -0.185849f, -0.326405f, -0.211415f, 0.043730f, 0.263641f, 0.263832f, 0.112385f, -0.133428f, -0.218343f, -0.175736f, -0.025087f, 0.111237f, 0.154633f, 0.126215f, 0.065378f, -0.077963f, -0.105330f, -0.075156f, 0.037828f, 0.184245f, 0.203843f, 0.017538f, -0.180532f, -0.306739f, -0.183135f, 0.120400f, 0.329952f, 0.313537f, 0.081923f, -0.191752f, -0.341449f, -0.208336f, 0.036696f, 0.273900f, 0.269394f, 0.080001f, -0.140039f, -0.256785f, -0.187831f, -0.003402f, 0.168854f, 0.171834f, 0.130938f, -0.020893f, -0.112005f, -0.126611f, -0.078294f, -0.032492f, 0.036975f, 0.085114f, 0.097007f, 0.040828f, -0.017462f, -0.082045f, -0.077678f, -0.040142f, 0.042448f, 0.078425f, 0.102311f, 0.029889f, -0.039703f, -0.081530f, -0.060571f, -0.006374f, - 0.047472f, 0.063504f, 0.059607f, -0.017375f, -0.048996f, -0.050657f, -0.024905f, 0.023163f, 0.046934f, 0.038970f, -0.010564f, -0.045341f, -0.037140f, -0.022486f, 0.030092f, 0.047710f, 0.024071f, -0.021430f, -0.024707f, -0.047456f, -0.005417f, 0.018754f, 0.040895f, 0.026417f, -0.007848f, -0.034097f, -0.027195f, 0.003021f, 0.035275f, 0.019933f, -0.011997f, -0.023716f, -0.011194f, 0.030116f, 0.027922f, 0.075121f, 0.083562f, -0.036478f, -0.111375f, -0.108350f, 0.022050f, 0.120270f, 0.118130f, -0.027445f, -0.135747f, -0.117002f, 0.042730f, 0.142848f, 0.094614f, -0.070999f, -0.137432f, -0.050371f, 0.099772f, 0.104817f, -0.015100f, -0.110045f, -0.026105f, 0.072741f, 0.032957f, -0.043118f, -0.006230f, 0.008846f, 0.005076f, -0.004781f, 0.004484f, -0.003187f, 0.004079f, -0.004361f, 0.001958f, -0.004392f, 0.004279f, -0.003276f, 0.003650f, -0.002566f, 0.002882f, -0.003588f, 0.002789f, -0.003288f, 0.005494f, -0.001615f, 0.004485f, -0.003597f, 0.003197f, -0.003885f, 0.002673f, -0.003492f, 0.003498f, -0.002798f, 0.003864f, -0.003417f, 0.003344f, -0.003215f, 0.002718f, -0.004054f, 0.002212f, -0.003445f} - }, - { - {-0.002789f, -0.008307f, -0.013643f, -0.018683f, -0.023322f, -0.027463f, -0.031025f, -0.033946f, -0.036178f, -0.037694f, -0.038488f, -0.038572f, -0.037978f, -0.036756f, -0.034972f, -0.032707f, -0.030052f, -0.027107f, -0.023977f, -0.020770f, -0.017592f, -0.014544f, -0.011719f, -0.009201f, -0.007061f, -0.005352f, -0.004116f, -0.003373f, -0.003127f, -0.003367f, -0.004062f, -0.005167f, -0.006623f, -0.008359f, -0.010298f, -0.012354f, -0.014437f, -0.016461f, -0.018337f, -0.019988f, -0.021340f, -0.022333f, -0.022918f, -0.023060f, -0.022740f, -0.021955f, -0.020718f, -0.019054f, -0.017008f, -0.014632f, -0.011993f, -0.009166f, -0.006230f, -0.003272f, -0.000376f, 0.002375f, 0.004901f, 0.007130f, 0.008999f, 0.010457f, 0.011466f, 0.012000f, 0.012051f, 0.011622f, 0.010733f, 0.009419f, 0.007726f, 0.005712f, 0.003444f, 0.000997f, -0.001550f, -0.004114f, -0.006615f, -0.008973f, -0.011113f, -0.012969f, -0.014483f, -0.015610f, -0.016313f, -0.016573f, -0.016380f, -0.015743f, -0.014678f, -0.013220f, -0.011411f, -0.009304f, -0.006962f, -0.004452f, -0.001847f, 0.000778f, 0.003351f, 0.005800f, 0.008057f, 0.010062f, 0.011763f, 0.013118f, - 0.014095f, 0.014673f, 0.014843f, 0.014609f, 0.013987f, 0.013001f, 0.011687f, 0.010091f, 0.008264f, 0.006264f, 0.004152f, 0.001991f, -0.000154f, -0.002222f, -0.004154f, -0.005897f, -0.007404f, -0.008635f, -0.009559f, -0.010155f, -0.010410f, -0.010323f, -0.009900f, -0.009158f, -0.008122f, -0.006824f, -0.005303f, -0.003604f, -0.001774f, 0.000137f, 0.002076f, 0.003992f, 0.005837f, 0.007562f, 0.009127f, 0.010494f, 0.011632f, 0.012516f, 0.013128f, 0.013459f, 0.013506f, 0.013272f, 0.012769f, 0.012014f, 0.011030f, 0.009846f, 0.008492f, 0.007005f, 0.005422f, 0.003780f, 0.002118f, 0.000474f, -0.001116f, -0.002619f, -0.004005f, -0.005246f, -0.006321f, -0.007211f, -0.007906f, -0.008396f, -0.008678f, -0.008756f, -0.008634f, -0.008326f, -0.007844f, -0.007207f, -0.006436f, -0.005554f, -0.004585f, -0.003556f, -0.002492f, -0.001419f, -0.000362f, 0.000657f, 0.001614f, 0.002490f, 0.003269f, 0.003937f, 0.004482f, 0.004898f, 0.005180f, 0.005327f, 0.005341f, 0.005228f, 0.004995f, 0.004654f, 0.004217f, 0.003699f, 0.003116f, 0.002486f, 0.001826f, 0.001153f, 0.000487f, -0.000158f, -0.000764f, -0.001317f, - -0.001807f, -0.002221f, -0.002553f, -0.002796f, -0.002948f, -0.003009f, -0.002981f, -0.002868f, -0.002678f, -0.002419f, -0.002101f, -0.001738f, -0.001341f, -0.000924f, -0.000501f, -0.000085f, 0.000310f, 0.000672f, 0.000991f, 0.001258f, 0.001466f, 0.001608f, 0.001683f, 0.001690f, 0.001630f, 0.001506f, 0.001325f, 0.001094f, 0.000823f, 0.000520f, 0.000198f, -0.000132f, -0.000458f, -0.000769f, -0.001053f, -0.001301f, -0.001504f, -0.001654f, -0.001748f, -0.001781f, -0.001753f, -0.001665f, -0.001519f, -0.001321f, -0.001078f, -0.000798f, -0.000490f, -0.000165f, 0.017176f, -0.095187f, -0.084606f, -0.066811f, 0.125559f, -0.055178f, -0.043647f, -0.055244f, 0.072692f, -0.100566f, 0.144466f, 0.115529f, -0.073006f, 0.428083f, 0.536602f, 0.361472f, -0.187950f, -0.504191f, -0.536616f, -0.209228f, 0.324262f, 0.717470f, 0.478981f, -0.076945f, -0.630505f, -0.733172f, -0.375303f, 0.361746f, 0.851780f, 0.698445f, 0.037438f, -0.675581f, -0.833947f, -0.418577f, 0.332675f, 0.737928f, 0.682865f, 0.031743f, -0.473913f, -0.676649f, -0.117154f, 0.532501f, 0.479968f, 0.217465f, -0.301848f, -0.549401f, -0.506875f, -0.111072f, - 0.270243f, 0.498796f, 0.300719f, -0.032138f, -0.355314f, -0.392730f, -0.221885f, 0.107243f, 0.283997f, 0.295613f, 0.107448f, -0.126633f, -0.290794f, -0.236983f, -0.062118f, 0.192882f, 0.217201f, 0.246534f, 0.077800f, -0.182329f, -0.291132f, -0.187252f, 0.073341f, 0.190753f, 0.164380f, -0.004872f, -0.127444f, -0.163991f, -0.015512f, 0.092454f, 0.131975f, 0.055603f, -0.096848f, -0.186120f, -0.110515f, 0.053529f, 0.167286f, 0.194905f, 0.025435f, -0.166737f, -0.232992f, -0.166609f, 0.041217f, 0.101374f, 0.059077f, -0.013888f, -0.098945f, -0.070482f, -0.025854f, -0.002388f, -0.004873f, -0.144900f, -0.143526f, -0.024917f, 0.174840f, 0.253184f, 0.159423f, -0.101731f, -0.281333f, -0.266236f, -0.020673f, 0.276208f, 0.361017f, 0.143252f, -0.173068f, -0.399336f, -0.321599f, -0.051770f, 0.281296f, 0.447241f, 0.242085f, -0.149283f, -0.440122f, -0.363316f, -0.037746f, 0.303052f, 0.419547f, 0.243804f, -0.087344f, -0.340480f, -0.342191f, -0.114542f, 0.211909f, 0.363800f, 0.284290f, -0.029414f, -0.291687f, -0.360590f, -0.187496f, 0.133136f, 0.356109f, 0.307411f, 0.052787f, -0.239933f, -0.364350f, -0.224866f, - 0.017593f, 0.263960f, 0.324224f, 0.167012f, -0.114450f, -0.267339f, -0.247516f, -0.036651f, 0.195931f, 0.291766f, 0.198195f, -0.068327f, -0.278376f, -0.265980f, -0.093008f, 0.159531f, 0.300914f, 0.205936f, -0.054356f, -0.225104f, -0.255082f, -0.090307f, 0.125451f, 0.237868f, 0.175738f, -0.017821f, -0.216213f, -0.228798f, -0.061587f, 0.173951f, 0.277154f, 0.171367f, -0.077741f, -0.239995f, -0.256539f, 0.042831f, 0.319227f, 0.274893f, -0.000013f, -0.298031f, -0.323092f, -0.070354f, 0.245828f, 0.321677f, 0.100790f, -0.219246f, -0.313970f, -0.105338f, 0.193433f, 0.273140f, 0.068388f, -0.193449f, -0.221340f, -0.006955f, 0.190425f, 0.125486f, -0.090515f, -0.132627f, 0.025865f, 0.066881f, -0.010202f, -0.019306f, 0.001199f, -0.000057f, -0.000712f, -0.001216f, 0.000966f, -0.003512f, -0.000585f, -0.000861f, -0.000802f, -0.001826f, 0.000550f, -0.000723f, 0.000118f, -0.001682f, 0.000548f, -0.000821f, -0.000305f, -0.002193f, 0.000435f, 0.000823f, 0.001605f, -0.000919f, -0.000456f, -0.001958f, -0.000591f, -0.001151f, -0.002830f, 0.001704f, 0.003810f, 0.000403f, -0.000276f, -0.001902f, 0.000440f, -0.000242f}, - {-0.002789f, -0.008307f, -0.013643f, -0.018683f, -0.023322f, -0.027463f, -0.031025f, -0.033946f, -0.036178f, -0.037694f, -0.038488f, -0.038572f, -0.037978f, -0.036756f, -0.034972f, -0.032707f, -0.030052f, -0.027107f, -0.023977f, -0.020770f, -0.017592f, -0.014544f, -0.011719f, -0.009201f, -0.007061f, -0.005352f, -0.004116f, -0.003373f, -0.003127f, -0.003367f, -0.004062f, -0.005167f, -0.006623f, -0.008359f, -0.010298f, -0.012354f, -0.014437f, -0.016461f, -0.018337f, -0.019988f, -0.021340f, -0.022333f, -0.022918f, -0.023060f, -0.022740f, -0.021955f, -0.020718f, -0.019054f, -0.017008f, -0.014632f, -0.011993f, -0.009166f, -0.006230f, -0.003272f, -0.000376f, 0.002375f, 0.004901f, 0.007130f, 0.008999f, 0.010457f, 0.011466f, 0.012000f, 0.012051f, 0.011622f, 0.010733f, 0.009419f, 0.007726f, 0.005712f, 0.003444f, 0.000997f, -0.001550f, -0.004114f, -0.006615f, -0.008973f, -0.011113f, -0.012969f, -0.014483f, -0.015610f, -0.016313f, -0.016573f, -0.016380f, -0.015743f, -0.014678f, -0.013220f, -0.011411f, -0.009304f, -0.006962f, -0.004452f, -0.001847f, 0.000778f, 0.003351f, 0.005800f, 0.008057f, 0.010062f, 0.011763f, 0.013118f, - 0.014095f, 0.014673f, 0.014843f, 0.014609f, 0.013987f, 0.013001f, 0.011687f, 0.010091f, 0.008264f, 0.006264f, 0.004152f, 0.001991f, -0.000154f, -0.002222f, -0.004154f, -0.005897f, -0.007404f, -0.008635f, -0.009559f, -0.010155f, -0.010410f, -0.010323f, -0.009900f, -0.009158f, -0.008122f, -0.006824f, -0.005303f, -0.003604f, -0.001774f, 0.000137f, 0.002076f, 0.003992f, 0.005837f, 0.007562f, 0.009127f, 0.010494f, 0.011632f, 0.012516f, 0.013128f, 0.013459f, 0.013506f, 0.013272f, 0.012769f, 0.012014f, 0.011030f, 0.009846f, 0.008492f, 0.007005f, 0.005422f, 0.003780f, 0.002118f, 0.000474f, -0.001116f, -0.002619f, -0.004005f, -0.005246f, -0.006321f, -0.007211f, -0.007906f, -0.008396f, -0.008678f, -0.008756f, -0.008634f, -0.008326f, -0.007844f, -0.007207f, -0.006436f, -0.005554f, -0.004585f, -0.003556f, -0.002492f, -0.001419f, -0.000362f, 0.000657f, 0.001614f, 0.002490f, 0.003269f, 0.003937f, 0.004482f, 0.004898f, 0.005180f, 0.005327f, 0.005341f, 0.005228f, 0.004995f, 0.004654f, 0.004217f, 0.003699f, 0.003116f, 0.002486f, 0.001826f, 0.001153f, 0.000487f, -0.000158f, -0.000764f, -0.001317f, - -0.001807f, -0.002221f, -0.002553f, -0.002796f, -0.002948f, -0.003009f, -0.002981f, -0.002868f, -0.002678f, -0.002419f, -0.002101f, -0.001738f, -0.001341f, -0.000924f, -0.000501f, -0.000085f, 0.000310f, 0.000672f, 0.000991f, 0.001258f, 0.001466f, 0.001608f, 0.001683f, 0.001690f, 0.001630f, 0.001506f, 0.001325f, 0.001094f, 0.000823f, 0.000520f, 0.000198f, -0.000132f, -0.000458f, -0.000769f, -0.001053f, -0.001301f, -0.001504f, -0.001654f, -0.001748f, -0.001781f, -0.001753f, -0.001665f, -0.001519f, -0.001321f, -0.001078f, -0.000798f, -0.000490f, -0.000165f, 0.017176f, -0.095187f, -0.084606f, -0.066811f, 0.125559f, -0.055178f, -0.043647f, -0.055244f, 0.072692f, -0.100566f, 0.144466f, 0.115529f, -0.073006f, 0.428083f, 0.536602f, 0.361472f, -0.187950f, -0.504191f, -0.536616f, -0.209228f, 0.324262f, 0.717470f, 0.478981f, -0.076945f, -0.630505f, -0.733172f, -0.375303f, 0.361746f, 0.851780f, 0.698445f, 0.037438f, -0.675581f, -0.833947f, -0.418577f, 0.332675f, 0.737928f, 0.682865f, 0.031743f, -0.473913f, -0.676649f, -0.117154f, 0.532501f, 0.479968f, 0.217465f, -0.301848f, -0.549401f, -0.506875f, -0.111072f, - 0.270243f, 0.498796f, 0.300719f, -0.032138f, -0.355314f, -0.392730f, -0.221885f, 0.107243f, 0.283997f, 0.295613f, 0.107448f, -0.126633f, -0.290794f, -0.236983f, -0.062118f, 0.192882f, 0.217201f, 0.246534f, 0.077800f, -0.182329f, -0.291132f, -0.187252f, 0.073341f, 0.190753f, 0.164380f, -0.004872f, -0.127444f, -0.163991f, -0.015512f, 0.092454f, 0.131975f, 0.055603f, -0.096848f, -0.186120f, -0.110515f, 0.053529f, 0.167286f, 0.194905f, 0.025435f, -0.166737f, -0.232992f, -0.166609f, 0.041217f, 0.101374f, 0.059077f, -0.013888f, -0.098945f, -0.070482f, -0.025854f, -0.002388f, -0.004873f, -0.144900f, -0.143526f, -0.024917f, 0.174840f, 0.253184f, 0.159423f, -0.101731f, -0.281333f, -0.266236f, -0.020673f, 0.276208f, 0.361017f, 0.143252f, -0.173068f, -0.399336f, -0.321599f, -0.051770f, 0.281296f, 0.447241f, 0.242085f, -0.149283f, -0.440122f, -0.363316f, -0.037746f, 0.303052f, 0.419547f, 0.243804f, -0.087344f, -0.340480f, -0.342191f, -0.114542f, 0.211909f, 0.363800f, 0.284290f, -0.029414f, -0.291687f, -0.360590f, -0.187496f, 0.133136f, 0.356109f, 0.307411f, 0.052787f, -0.239933f, -0.364350f, -0.224866f, - 0.017593f, 0.263960f, 0.324224f, 0.167012f, -0.114450f, -0.267339f, -0.247516f, -0.036651f, 0.195931f, 0.291766f, 0.198195f, -0.068327f, -0.278376f, -0.265980f, -0.093008f, 0.159531f, 0.300914f, 0.205936f, -0.054356f, -0.225104f, -0.255082f, -0.090307f, 0.125451f, 0.237868f, 0.175738f, -0.017821f, -0.216213f, -0.228798f, -0.061587f, 0.173951f, 0.277154f, 0.171367f, -0.077741f, -0.239995f, -0.256539f, 0.042831f, 0.319227f, 0.274893f, -0.000013f, -0.298031f, -0.323092f, -0.070354f, 0.245828f, 0.321677f, 0.100790f, -0.219246f, -0.313970f, -0.105338f, 0.193433f, 0.273140f, 0.068388f, -0.193449f, -0.221340f, -0.006955f, 0.190425f, 0.125486f, -0.090515f, -0.132627f, 0.025865f, 0.066881f, -0.010202f, -0.019306f, 0.001199f, -0.000057f, -0.000712f, -0.001216f, 0.000966f, -0.003512f, -0.000585f, -0.000861f, -0.000802f, -0.001826f, 0.000550f, -0.000723f, 0.000118f, -0.001682f, 0.000548f, -0.000821f, -0.000305f, -0.002193f, 0.000435f, 0.000823f, 0.001605f, -0.000919f, -0.000456f, -0.001958f, -0.000591f, -0.001151f, -0.002830f, 0.001704f, 0.003810f, 0.000403f, -0.000276f, -0.001902f, 0.000440f, -0.000242f} - }, - { - {-0.001398f, -0.004182f, -0.006929f, -0.009613f, -0.012210f, -0.014694f, -0.017042f, -0.019228f, -0.021231f, -0.023026f, -0.024594f, -0.025915f, -0.026973f, -0.027753f, -0.028247f, -0.028448f, -0.028355f, -0.027972f, -0.027307f, -0.026377f, -0.025200f, -0.023805f, -0.022221f, -0.020487f, -0.018643f, -0.016735f, -0.014809f, -0.012916f, -0.011104f, -0.009424f, -0.007923f, -0.006643f, -0.005625f, -0.004901f, -0.004498f, -0.004433f, -0.004717f, -0.005350f, -0.006323f, -0.007618f, -0.009207f, -0.011054f, -0.013115f, -0.015340f, -0.017673f, -0.020053f, -0.022418f, -0.024705f, -0.026852f, -0.028801f, -0.030496f, -0.031889f, -0.032939f, -0.033615f, -0.033894f, -0.033763f, -0.033221f, -0.032277f, -0.030951f, -0.029271f, -0.027277f, -0.025014f, -0.022533f, -0.019893f, -0.017153f, -0.014374f, -0.011616f, -0.008939f, -0.006395f, -0.004034f, -0.001897f, -0.000018f, 0.001578f, 0.002877f, 0.003871f, 0.004566f, 0.004972f, 0.005112f, 0.005014f, 0.004712f, 0.004245f, 0.003655f, 0.002988f, 0.002286f, 0.001593f, 0.000947f, 0.000384f, -0.000067f, -0.000383f, -0.000548f, -0.000555f, -0.000403f, -0.000100f, 0.000340f, 0.000896f, 0.001542f, - 0.002248f, 0.002979f, 0.003701f, 0.004380f, 0.004981f, 0.005473f, 0.005830f, 0.006030f, 0.006058f, 0.005906f, 0.005571f, 0.005060f, 0.004387f, 0.003572f, 0.002642f, 0.001628f, 0.000567f, -0.000503f, -0.001539f, -0.002501f, -0.003351f, -0.004051f, -0.004568f, -0.004877f, -0.004957f, -0.004794f, -0.004384f, -0.003731f, -0.002845f, -0.001746f, -0.000463f, 0.000972f, 0.002517f, 0.004130f, 0.005761f, 0.007363f, 0.008885f, 0.010280f, 0.011503f, 0.012513f, 0.013275f, 0.013762f, 0.013953f, 0.013836f, 0.013408f, 0.012675f, 0.011652f, 0.010360f, 0.008831f, 0.007102f, 0.005214f, 0.003214f, 0.001153f, -0.000919f, -0.002950f, -0.004893f, -0.006699f, -0.008327f, -0.009741f, -0.010910f, -0.011810f, -0.012426f, -0.012750f, -0.012782f, -0.012530f, -0.012007f, -0.011237f, -0.010245f, -0.009064f, -0.007730f, -0.006280f, -0.004755f, -0.003194f, -0.001637f, -0.000119f, 0.001324f, 0.002663f, 0.003873f, 0.004931f, 0.005824f, 0.006540f, 0.007076f, 0.007431f, 0.007611f, 0.007626f, 0.007489f, 0.007217f, 0.006829f, 0.006346f, 0.005788f, 0.005178f, 0.004536f, 0.003883f, 0.003236f, 0.002612f, 0.002024f, - 0.001483f, 0.000998f, 0.000574f, 0.000214f, -0.000082f, -0.000314f, -0.000487f, -0.000605f, -0.000674f, -0.000702f, -0.000694f, -0.000659f, -0.000603f, -0.000532f, -0.000452f, -0.000367f, -0.000280f, -0.000196f, -0.000114f, -0.000037f, 0.000037f, 0.000107f, 0.000173f, 0.000238f, 0.000303f, 0.000367f, 0.000433f, 0.000499f, 0.000567f, 0.000636f, 0.000704f, 0.000769f, 0.000831f, 0.000886f, 0.000932f, 0.000966f, 0.000987f, 0.000992f, 0.000979f, 0.000947f, 0.000896f, 0.000825f, 0.000735f, 0.000628f, 0.000505f, 0.000370f, 0.000226f, 0.000076f, 0.009537f, -0.025098f, 0.002786f, -0.063195f, -0.011454f, -0.003229f, 0.064313f, 0.015733f, 0.011226f, 0.012941f, 0.058888f, 0.091003f, -0.032689f, 0.214915f, 0.315019f, 0.133084f, -0.086255f, -0.175700f, -0.329061f, 0.007385f, 0.076743f, 0.172848f, 0.129603f, -0.050093f, -0.147751f, -0.174632f, -0.016302f, 0.183859f, 0.275204f, 0.164708f, -0.046160f, -0.231085f, -0.305367f, -0.102624f, 0.318419f, 0.373301f, 0.151958f, -0.142073f, -0.327602f, -0.316282f, 0.056588f, 0.374551f, 0.289291f, 0.067277f, -0.238822f, -0.368754f, -0.260695f, -0.020030f, - 0.130222f, 0.304065f, 0.227394f, 0.048681f, -0.170527f, -0.268830f, -0.199083f, -0.018513f, 0.202927f, 0.204249f, 0.217268f, -0.177928f, -0.183146f, -0.198042f, -0.177634f, 0.058768f, 0.262191f, 0.200701f, -0.052419f, -0.252923f, -0.275988f, -0.049426f, 0.207429f, 0.273299f, 0.208886f, 0.013765f, -0.244023f, -0.286224f, -0.113709f, 0.172389f, 0.313132f, 0.124798f, -0.017737f, -0.298624f, -0.315803f, -0.087124f, 0.189075f, 0.280196f, 0.123507f, -0.110427f, -0.296829f, -0.222220f, -0.002989f, 0.148554f, 0.108602f, -0.027102f, -0.095315f, -0.032799f, 0.026530f, 0.041807f, 0.008194f, -0.121200f, -0.101256f, -0.003539f, 0.143894f, 0.201917f, 0.134308f, -0.044255f, -0.179498f, -0.196896f, -0.077737f, 0.144113f, 0.232885f, 0.232204f, 0.078859f, -0.184195f, -0.281655f, -0.102618f, 0.100404f, 0.234960f, 0.179685f, -0.069331f, -0.132755f, -0.230639f, -0.151544f, 0.074729f, 0.170532f, 0.204106f, 0.063404f, -0.088652f, -0.140248f, -0.063267f, 0.029244f, 0.099832f, 0.076021f, 0.020095f, -0.072666f, -0.081413f, -0.089380f, 0.004151f, 0.105303f, 0.104567f, 0.041334f, -0.033844f, -0.099053f, -0.068595f, - -0.043828f, 0.039783f, 0.086204f, 0.084819f, 0.014423f, -0.026491f, -0.038131f, 0.002549f, 0.027963f, 0.054907f, 0.060903f, 0.000251f, -0.073438f, -0.075337f, -0.024455f, 0.050430f, 0.132453f, 0.105391f, -0.027614f, -0.100381f, -0.131174f, -0.056092f, 0.032895f, 0.085088f, 0.063533f, 0.003182f, -0.071345f, -0.087193f, -0.040483f, 0.081616f, 0.100384f, 0.102589f, -0.046386f, -0.122259f, -0.163890f, -0.009890f, 0.324037f, 0.313620f, 0.065158f, -0.273810f, -0.351656f, -0.129786f, 0.227440f, 0.356748f, 0.161216f, -0.193691f, -0.342080f, -0.158923f, 0.181586f, 0.312851f, 0.119461f, -0.188232f, -0.260462f, -0.037299f, 0.204803f, 0.166662f, -0.082503f, -0.167438f, 0.019261f, 0.089158f, -0.004467f, -0.024844f, 0.000708f, 0.003341f, 0.001287f, 0.000897f, -0.000649f, -0.002509f, 0.000959f, -0.000583f, 0.001758f, 0.000265f, 0.001482f, -0.001572f, 0.000488f, 0.000974f, 0.000454f, -0.001844f, 0.000233f, -0.000726f, 0.000899f, -0.002310f, 0.000677f, 0.000363f, 0.001329f, 0.000209f, -0.002589f, -0.001986f, -0.000225f, -0.000729f, 0.002987f, -0.000728f, 0.001898f, -0.002967f, -0.000898f, -0.001951f}, - {0.001398f, 0.004182f, 0.006929f, 0.009613f, 0.012210f, 0.014694f, 0.017042f, 0.019228f, 0.021231f, 0.023026f, 0.024594f, 0.025915f, 0.026973f, 0.027753f, 0.028247f, 0.028448f, 0.028355f, 0.027972f, 0.027307f, 0.026377f, 0.025200f, 0.023805f, 0.022221f, 0.020487f, 0.018643f, 0.016735f, 0.014809f, 0.012916f, 0.011104f, 0.009424f, 0.007923f, 0.006643f, 0.005625f, 0.004901f, 0.004498f, 0.004433f, 0.004717f, 0.005350f, 0.006323f, 0.007618f, 0.009207f, 0.011054f, 0.013115f, 0.015340f, 0.017673f, 0.020053f, 0.022418f, 0.024705f, 0.026852f, 0.028801f, 0.030496f, 0.031889f, 0.032939f, 0.033615f, 0.033894f, 0.033763f, 0.033221f, 0.032277f, 0.030951f, 0.029271f, 0.027277f, 0.025014f, 0.022533f, 0.019893f, 0.017153f, 0.014374f, 0.011616f, 0.008939f, 0.006395f, 0.004034f, 0.001897f, 0.000018f, -0.001578f, -0.002877f, -0.003871f, -0.004566f, -0.004972f, -0.005112f, -0.005014f, -0.004712f, -0.004245f, -0.003655f, -0.002988f, -0.002286f, -0.001593f, -0.000947f, -0.000384f, 0.000067f, 0.000383f, 0.000548f, 0.000555f, 0.000403f, 0.000100f, -0.000340f, -0.000896f, -0.001542f, - -0.002248f, -0.002979f, -0.003701f, -0.004380f, -0.004981f, -0.005473f, -0.005830f, -0.006030f, -0.006058f, -0.005906f, -0.005571f, -0.005060f, -0.004387f, -0.003572f, -0.002642f, -0.001628f, -0.000567f, 0.000503f, 0.001539f, 0.002501f, 0.003351f, 0.004051f, 0.004568f, 0.004877f, 0.004957f, 0.004794f, 0.004384f, 0.003731f, 0.002845f, 0.001746f, 0.000463f, -0.000972f, -0.002517f, -0.004130f, -0.005761f, -0.007363f, -0.008885f, -0.010280f, -0.011503f, -0.012513f, -0.013275f, -0.013762f, -0.013953f, -0.013836f, -0.013408f, -0.012675f, -0.011652f, -0.010360f, -0.008831f, -0.007102f, -0.005214f, -0.003214f, -0.001153f, 0.000919f, 0.002950f, 0.004893f, 0.006699f, 0.008327f, 0.009741f, 0.010910f, 0.011810f, 0.012426f, 0.012750f, 0.012782f, 0.012530f, 0.012007f, 0.011237f, 0.010245f, 0.009064f, 0.007730f, 0.006280f, 0.004755f, 0.003194f, 0.001637f, 0.000119f, -0.001324f, -0.002663f, -0.003873f, -0.004931f, -0.005824f, -0.006540f, -0.007076f, -0.007431f, -0.007611f, -0.007626f, -0.007489f, -0.007217f, -0.006829f, -0.006346f, -0.005788f, -0.005178f, -0.004536f, -0.003883f, -0.003236f, -0.002612f, -0.002024f, - -0.001483f, -0.000998f, -0.000574f, -0.000214f, 0.000082f, 0.000314f, 0.000487f, 0.000605f, 0.000674f, 0.000702f, 0.000694f, 0.000659f, 0.000603f, 0.000532f, 0.000452f, 0.000367f, 0.000280f, 0.000196f, 0.000114f, 0.000037f, -0.000037f, -0.000107f, -0.000173f, -0.000238f, -0.000303f, -0.000367f, -0.000433f, -0.000499f, -0.000567f, -0.000636f, -0.000704f, -0.000769f, -0.000831f, -0.000886f, -0.000932f, -0.000966f, -0.000987f, -0.000992f, -0.000979f, -0.000947f, -0.000896f, -0.000825f, -0.000735f, -0.000628f, -0.000505f, -0.000370f, -0.000226f, -0.000076f, -0.009537f, 0.025098f, -0.002786f, 0.063195f, 0.011454f, 0.003229f, -0.064313f, -0.015733f, -0.011226f, -0.012941f, -0.058888f, -0.091003f, 0.032689f, -0.214915f, -0.315019f, -0.133084f, 0.086255f, 0.175700f, 0.329061f, -0.007385f, -0.076743f, -0.172848f, -0.129603f, 0.050093f, 0.147751f, 0.174632f, 0.016302f, -0.183859f, -0.275204f, -0.164708f, 0.046160f, 0.231085f, 0.305367f, 0.102624f, -0.318419f, -0.373301f, -0.151958f, 0.142073f, 0.327602f, 0.316282f, -0.056588f, -0.374551f, -0.289291f, -0.067277f, 0.238822f, 0.368754f, 0.260695f, 0.020030f, - -0.130222f, -0.304065f, -0.227394f, -0.048681f, 0.170527f, 0.268830f, 0.199083f, 0.018513f, -0.202927f, -0.204249f, -0.217268f, 0.177928f, 0.183146f, 0.198042f, 0.177634f, -0.058768f, -0.262191f, -0.200701f, 0.052419f, 0.252923f, 0.275988f, 0.049426f, -0.207429f, -0.273299f, -0.208886f, -0.013765f, 0.244023f, 0.286224f, 0.113709f, -0.172389f, -0.313132f, -0.124798f, 0.017737f, 0.298624f, 0.315803f, 0.087124f, -0.189075f, -0.280196f, -0.123507f, 0.110427f, 0.296829f, 0.222220f, 0.002989f, -0.148554f, -0.108602f, 0.027102f, 0.095315f, 0.032799f, -0.026530f, -0.041807f, -0.008194f, 0.121200f, 0.101256f, 0.003539f, -0.143894f, -0.201917f, -0.134308f, 0.044255f, 0.179498f, 0.196896f, 0.077737f, -0.144113f, -0.232885f, -0.232204f, -0.078859f, 0.184195f, 0.281655f, 0.102618f, -0.100404f, -0.234960f, -0.179685f, 0.069331f, 0.132755f, 0.230639f, 0.151544f, -0.074729f, -0.170532f, -0.204106f, -0.063404f, 0.088652f, 0.140248f, 0.063267f, -0.029244f, -0.099832f, -0.076021f, -0.020095f, 0.072666f, 0.081413f, 0.089380f, -0.004151f, -0.105303f, -0.104567f, -0.041334f, 0.033844f, 0.099053f, 0.068595f, - 0.043828f, -0.039783f, -0.086204f, -0.084819f, -0.014423f, 0.026491f, 0.038131f, -0.002549f, -0.027963f, -0.054907f, -0.060903f, -0.000251f, 0.073438f, 0.075337f, 0.024455f, -0.050430f, -0.132453f, -0.105391f, 0.027614f, 0.100381f, 0.131174f, 0.056092f, -0.032895f, -0.085088f, -0.063533f, -0.003182f, 0.071345f, 0.087193f, 0.040483f, -0.081616f, -0.100384f, -0.102589f, 0.046386f, 0.122259f, 0.163890f, 0.009890f, -0.324037f, -0.313620f, -0.065158f, 0.273810f, 0.351656f, 0.129786f, -0.227440f, -0.356748f, -0.161216f, 0.193691f, 0.342080f, 0.158923f, -0.181586f, -0.312851f, -0.119461f, 0.188232f, 0.260462f, 0.037299f, -0.204803f, -0.166662f, 0.082503f, 0.167438f, -0.019261f, -0.089158f, 0.004467f, 0.024844f, -0.000708f, -0.003341f, -0.001287f, -0.000897f, 0.000649f, 0.002509f, -0.000959f, 0.000583f, -0.001758f, -0.000265f, -0.001482f, 0.001572f, -0.000488f, -0.000974f, -0.000454f, 0.001844f, -0.000233f, 0.000726f, -0.000899f, 0.002310f, -0.000677f, -0.000363f, -0.001329f, -0.000209f, 0.002589f, 0.001986f, 0.000225f, 0.000729f, -0.002987f, 0.000728f, -0.001898f, 0.002967f, 0.000898f, 0.001951f} - }, - { - {-0.000465f, -0.001404f, -0.002369f, -0.003376f, -0.004436f, -0.005561f, -0.006755f, -0.008017f, -0.009344f, -0.010725f, -0.012145f, -0.013583f, -0.015015f, -0.016415f, -0.017751f, -0.018992f, -0.020108f, -0.021068f, -0.021845f, -0.022413f, -0.022755f, -0.022856f, -0.022709f, -0.022314f, -0.021677f, -0.020814f, -0.019744f, -0.018496f, -0.017103f, -0.015602f, -0.014037f, -0.012450f, -0.010886f, -0.009389f, -0.008001f, -0.006759f, -0.005696f, -0.004839f, -0.004207f, -0.003813f, -0.003660f, -0.003742f, -0.004047f, -0.004552f, -0.005231f, -0.006048f, -0.006964f, -0.007936f, -0.008918f, -0.009866f, -0.010735f, -0.011484f, -0.012075f, -0.012477f, -0.012666f, -0.012624f, -0.012343f, -0.011823f, -0.011072f, -0.010110f, -0.008959f, -0.007654f, -0.006231f, -0.004734f, -0.003209f, -0.001703f, -0.000262f, 0.001067f, 0.002243f, 0.003228f, 0.003993f, 0.004514f, 0.004775f, 0.004770f, 0.004501f, 0.003977f, 0.003219f, 0.002253f, 0.001113f, -0.000163f, -0.001532f, -0.002948f, -0.004365f, -0.005736f, -0.007019f, -0.008174f, -0.009165f, -0.009964f, -0.010550f, -0.010909f, -0.011035f, -0.010933f, -0.010612f, -0.010091f, -0.009396f, -0.008557f, - -0.007610f, -0.006595f, -0.005550f, -0.004518f, -0.003538f, -0.002646f, -0.001875f, -0.001254f, -0.000804f, -0.000539f, -0.000468f, -0.000591f, -0.000900f, -0.001382f, -0.002016f, -0.002776f, -0.003634f, -0.004554f, -0.005503f, -0.006443f, -0.007341f, -0.008162f, -0.008878f, -0.009463f, -0.009896f, -0.010164f, -0.010259f, -0.010179f, -0.009929f, -0.009520f, -0.008970f, -0.008299f, -0.007535f, -0.006704f, -0.005838f, -0.004967f, -0.004121f, -0.003328f, -0.002614f, -0.002000f, -0.001501f, -0.001130f, -0.000892f, -0.000788f, -0.000810f, -0.000948f, -0.001186f, -0.001503f, -0.001875f, -0.002277f, -0.002682f, -0.003063f, -0.003393f, -0.003648f, -0.003808f, -0.003856f, -0.003779f, -0.003570f, -0.003229f, -0.002759f, -0.002169f, -0.001474f, -0.000694f, 0.000148f, 0.001028f, 0.001916f, 0.002785f, 0.003605f, 0.004349f, 0.004992f, 0.005513f, 0.005894f, 0.006122f, 0.006190f, 0.006096f, 0.005843f, 0.005440f, 0.004902f, 0.004247f, 0.003499f, 0.002682f, 0.001824f, 0.000955f, 0.000103f, -0.000705f, -0.001443f, -0.002088f, -0.002622f, -0.003029f, -0.003302f, -0.003435f, -0.003429f, -0.003292f, -0.003032f, -0.002666f, -0.002213f, - -0.001695f, -0.001134f, -0.000556f, 0.000015f, 0.000554f, 0.001039f, 0.001452f, 0.001777f, 0.002000f, 0.002116f, 0.002120f, 0.002014f, 0.001806f, 0.001504f, 0.001123f, 0.000681f, 0.000196f, -0.000310f, -0.000816f, -0.001299f, -0.001741f, -0.002123f, -0.002428f, -0.002646f, -0.002766f, -0.002786f, -0.002704f, -0.002524f, -0.002255f, -0.001909f, -0.001499f, -0.001043f, -0.000561f, -0.000072f, 0.000403f, 0.000846f, 0.001238f, 0.001564f, 0.001811f, 0.001970f, 0.002035f, 0.002005f, 0.001881f, 0.001672f, 0.001386f, 0.001037f, 0.000642f, 0.000217f, -0.001771f, -0.006509f, 0.021218f, -0.038823f, -0.011955f, 0.006621f, -0.022612f, -0.091329f, 0.050131f, 0.231275f, 0.216905f, 0.058289f, -0.170730f, 0.265267f, 0.272061f, 0.108026f, -0.098152f, -0.093782f, -0.191434f, 0.041068f, 0.077779f, 0.153635f, 0.115409f, 0.000412f, -0.091943f, -0.012296f, 0.033729f, -0.008604f, 0.021260f, -0.062307f, 0.115324f, 0.113905f, 0.093298f, -0.017337f, -0.112194f, -0.159297f, -0.075821f, 0.053020f, 0.117890f, 0.118754f, 0.040959f, -0.045215f, -0.040676f, -0.088463f, -0.062670f, -0.000527f, -0.003547f, 0.037605f, - -0.048673f, 0.027213f, 0.042369f, 0.001320f, -0.030588f, -0.064022f, -0.062636f, 0.020981f, 0.124786f, 0.158579f, 0.031542f, -0.138539f, -0.178898f, -0.174371f, -0.050201f, 0.125858f, 0.166937f, 0.095657f, -0.065029f, -0.187046f, -0.105766f, 0.076904f, 0.222051f, 0.114834f, -0.090380f, -0.301362f, -0.214266f, 0.032387f, 0.318904f, 0.313672f, 0.105259f, -0.239403f, -0.380528f, -0.301328f, -0.009186f, 0.307860f, 0.362465f, 0.142829f, -0.125570f, -0.338388f, -0.275916f, -0.027072f, 0.226341f, 0.279907f, 0.133181f, -0.048681f, -0.163439f, -0.178024f, -0.037065f, 0.068988f, 0.155843f, 0.101329f, -0.013498f, -0.095146f, -0.105885f, -0.112835f, -0.080862f, 0.011656f, 0.137496f, 0.173189f, 0.102717f, -0.040418f, -0.178866f, -0.172001f, -0.085014f, 0.094635f, 0.149504f, 0.179765f, 0.058294f, -0.115007f, -0.196490f, -0.164638f, 0.021371f, 0.081504f, 0.111317f, 0.091809f, 0.009121f, -0.059923f, -0.110283f, -0.101207f, -0.044888f, 0.048637f, 0.090221f, 0.082468f, 0.012110f, -0.067582f, -0.120570f, -0.062062f, 0.046498f, 0.069486f, 0.067465f, 0.012578f, -0.021644f, -0.029169f, -0.000807f, 0.027809f, - 0.023619f, -0.010232f, -0.035235f, -0.068464f, -0.045281f, 0.016621f, 0.036291f, 0.053031f, 0.035968f, -0.007885f, -0.080731f, -0.071418f, -0.014221f, 0.050538f, 0.070548f, 0.051202f, -0.049188f, -0.087715f, -0.035265f, 0.020442f, 0.077010f, 0.066420f, 0.037202f, -0.007388f, -0.055334f, -0.066451f, -0.030671f, 0.050953f, 0.069560f, 0.017126f, -0.021652f, -0.078683f, -0.039305f, 0.003748f, 0.034086f, 0.112302f, 0.082916f, -0.042044f, -0.124954f, -0.099556f, 0.027331f, 0.122032f, 0.101599f, -0.023147f, -0.113462f, -0.092581f, 0.020670f, 0.105113f, 0.079967f, -0.029626f, -0.096065f, -0.059540f, 0.044136f, 0.081574f, 0.027577f, -0.058395f, -0.048951f, 0.026629f, 0.040829f, -0.012841f, -0.015365f, 0.001796f, 0.004625f, -0.003680f, 0.001891f, 0.001369f, 0.003418f, -0.003678f, -0.000207f, -0.002016f, 0.001498f, -0.001351f, 0.001518f, -0.002317f, 0.002310f, 0.000464f, 0.001450f, -0.002586f, 0.001277f, -0.001014f, 0.002699f, -0.001753f, 0.002854f, -0.001710f, 0.000280f, -0.001913f, 0.001334f, -0.000786f, -0.000541f, -0.002219f, 0.002868f, 0.000858f, 0.001782f, -0.001423f, 0.000322f, -0.002513f}, - {0.000465f, 0.001404f, 0.002369f, 0.003376f, 0.004436f, 0.005561f, 0.006755f, 0.008017f, 0.009344f, 0.010725f, 0.012145f, 0.013583f, 0.015015f, 0.016415f, 0.017751f, 0.018992f, 0.020108f, 0.021068f, 0.021845f, 0.022413f, 0.022755f, 0.022856f, 0.022709f, 0.022314f, 0.021677f, 0.020814f, 0.019744f, 0.018496f, 0.017103f, 0.015602f, 0.014037f, 0.012450f, 0.010886f, 0.009389f, 0.008001f, 0.006759f, 0.005696f, 0.004839f, 0.004207f, 0.003813f, 0.003660f, 0.003742f, 0.004047f, 0.004552f, 0.005231f, 0.006048f, 0.006964f, 0.007936f, 0.008918f, 0.009866f, 0.010735f, 0.011484f, 0.012075f, 0.012477f, 0.012666f, 0.012624f, 0.012343f, 0.011823f, 0.011072f, 0.010110f, 0.008959f, 0.007654f, 0.006231f, 0.004734f, 0.003209f, 0.001703f, 0.000262f, -0.001067f, -0.002243f, -0.003228f, -0.003993f, -0.004514f, -0.004775f, -0.004770f, -0.004501f, -0.003977f, -0.003219f, -0.002253f, -0.001113f, 0.000163f, 0.001532f, 0.002948f, 0.004365f, 0.005736f, 0.007019f, 0.008174f, 0.009165f, 0.009964f, 0.010550f, 0.010909f, 0.011035f, 0.010933f, 0.010612f, 0.010091f, 0.009396f, 0.008557f, - 0.007610f, 0.006595f, 0.005550f, 0.004518f, 0.003538f, 0.002646f, 0.001875f, 0.001254f, 0.000804f, 0.000539f, 0.000468f, 0.000591f, 0.000900f, 0.001382f, 0.002016f, 0.002776f, 0.003634f, 0.004554f, 0.005503f, 0.006443f, 0.007341f, 0.008162f, 0.008878f, 0.009463f, 0.009896f, 0.010164f, 0.010259f, 0.010179f, 0.009929f, 0.009520f, 0.008970f, 0.008299f, 0.007535f, 0.006704f, 0.005838f, 0.004967f, 0.004121f, 0.003328f, 0.002614f, 0.002000f, 0.001501f, 0.001130f, 0.000892f, 0.000788f, 0.000810f, 0.000948f, 0.001186f, 0.001503f, 0.001875f, 0.002277f, 0.002682f, 0.003063f, 0.003393f, 0.003648f, 0.003808f, 0.003856f, 0.003779f, 0.003570f, 0.003229f, 0.002759f, 0.002169f, 0.001474f, 0.000694f, -0.000148f, -0.001028f, -0.001916f, -0.002785f, -0.003605f, -0.004349f, -0.004992f, -0.005513f, -0.005894f, -0.006122f, -0.006190f, -0.006096f, -0.005843f, -0.005440f, -0.004902f, -0.004247f, -0.003499f, -0.002682f, -0.001824f, -0.000955f, -0.000103f, 0.000705f, 0.001443f, 0.002088f, 0.002622f, 0.003029f, 0.003302f, 0.003435f, 0.003429f, 0.003292f, 0.003032f, 0.002666f, 0.002213f, - 0.001695f, 0.001134f, 0.000556f, -0.000015f, -0.000554f, -0.001039f, -0.001452f, -0.001777f, -0.002000f, -0.002116f, -0.002120f, -0.002014f, -0.001806f, -0.001504f, -0.001123f, -0.000681f, -0.000196f, 0.000310f, 0.000816f, 0.001299f, 0.001741f, 0.002123f, 0.002428f, 0.002646f, 0.002766f, 0.002786f, 0.002704f, 0.002524f, 0.002255f, 0.001909f, 0.001499f, 0.001043f, 0.000561f, 0.000072f, -0.000403f, -0.000846f, -0.001238f, -0.001564f, -0.001811f, -0.001970f, -0.002035f, -0.002005f, -0.001881f, -0.001672f, -0.001386f, -0.001037f, -0.000642f, -0.000217f, 0.001771f, 0.006509f, -0.021218f, 0.038823f, 0.011955f, -0.006621f, 0.022612f, 0.091329f, -0.050131f, -0.231275f, -0.216905f, -0.058289f, 0.170730f, -0.265267f, -0.272061f, -0.108026f, 0.098152f, 0.093782f, 0.191434f, -0.041068f, -0.077779f, -0.153635f, -0.115409f, -0.000412f, 0.091943f, 0.012296f, -0.033729f, 0.008604f, -0.021260f, 0.062307f, -0.115324f, -0.113905f, -0.093298f, 0.017337f, 0.112194f, 0.159297f, 0.075821f, -0.053020f, -0.117890f, -0.118754f, -0.040959f, 0.045215f, 0.040676f, 0.088463f, 0.062670f, 0.000527f, 0.003547f, -0.037605f, - 0.048673f, -0.027213f, -0.042369f, -0.001320f, 0.030588f, 0.064022f, 0.062636f, -0.020981f, -0.124786f, -0.158579f, -0.031542f, 0.138539f, 0.178898f, 0.174371f, 0.050201f, -0.125858f, -0.166937f, -0.095657f, 0.065029f, 0.187046f, 0.105766f, -0.076904f, -0.222051f, -0.114834f, 0.090380f, 0.301362f, 0.214266f, -0.032387f, -0.318904f, -0.313672f, -0.105259f, 0.239403f, 0.380528f, 0.301328f, 0.009186f, -0.307860f, -0.362465f, -0.142829f, 0.125570f, 0.338388f, 0.275916f, 0.027072f, -0.226341f, -0.279907f, -0.133181f, 0.048681f, 0.163439f, 0.178024f, 0.037065f, -0.068988f, -0.155843f, -0.101329f, 0.013498f, 0.095146f, 0.105885f, 0.112835f, 0.080862f, -0.011656f, -0.137496f, -0.173189f, -0.102717f, 0.040418f, 0.178866f, 0.172001f, 0.085014f, -0.094635f, -0.149504f, -0.179765f, -0.058294f, 0.115007f, 0.196490f, 0.164638f, -0.021371f, -0.081504f, -0.111317f, -0.091809f, -0.009121f, 0.059923f, 0.110283f, 0.101207f, 0.044888f, -0.048637f, -0.090221f, -0.082468f, -0.012110f, 0.067582f, 0.120570f, 0.062062f, -0.046498f, -0.069486f, -0.067465f, -0.012578f, 0.021644f, 0.029169f, 0.000807f, -0.027809f, - -0.023619f, 0.010232f, 0.035235f, 0.068464f, 0.045281f, -0.016621f, -0.036291f, -0.053031f, -0.035968f, 0.007885f, 0.080731f, 0.071418f, 0.014221f, -0.050538f, -0.070548f, -0.051202f, 0.049188f, 0.087715f, 0.035265f, -0.020442f, -0.077010f, -0.066420f, -0.037202f, 0.007388f, 0.055334f, 0.066451f, 0.030671f, -0.050953f, -0.069560f, -0.017126f, 0.021652f, 0.078683f, 0.039305f, -0.003748f, -0.034086f, -0.112302f, -0.082916f, 0.042044f, 0.124954f, 0.099556f, -0.027331f, -0.122032f, -0.101599f, 0.023147f, 0.113462f, 0.092581f, -0.020670f, -0.105113f, -0.079967f, 0.029626f, 0.096065f, 0.059540f, -0.044136f, -0.081574f, -0.027577f, 0.058395f, 0.048951f, -0.026629f, -0.040829f, 0.012841f, 0.015365f, -0.001796f, -0.004625f, 0.003680f, -0.001891f, -0.001369f, -0.003418f, 0.003678f, 0.000207f, 0.002016f, -0.001498f, 0.001351f, -0.001518f, 0.002317f, -0.002310f, -0.000464f, -0.001450f, 0.002586f, -0.001277f, 0.001014f, -0.002699f, 0.001753f, -0.002854f, 0.001710f, -0.000280f, 0.001913f, -0.001334f, 0.000786f, 0.000541f, 0.002219f, -0.002868f, -0.000858f, -0.001782f, 0.001423f, -0.000322f, 0.002513f} - }, - { - {0.000351f, 0.001011f, 0.001545f, 0.001875f, 0.001932f, 0.001659f, 0.001012f, -0.000033f, -0.001487f, -0.003338f, -0.005558f, -0.008100f, -0.010904f, -0.013893f, -0.016979f, -0.020069f, -0.023061f, -0.025858f, -0.028363f, -0.030486f, -0.032151f, -0.033292f, -0.033863f, -0.033835f, -0.033202f, -0.031977f, -0.030196f, -0.027913f, -0.025203f, -0.022158f, -0.018881f, -0.015488f, -0.012100f, -0.008840f, -0.005830f, -0.003184f, -0.001006f, 0.000613f, 0.001602f, 0.001907f, 0.001499f, 0.000373f, -0.001454f, -0.003940f, -0.007021f, -0.010610f, -0.014606f, -0.018889f, -0.023331f, -0.027797f, -0.032147f, -0.036248f, -0.039969f, -0.043192f, -0.045815f, -0.047752f, -0.048938f, -0.049333f, -0.048920f, -0.047705f, -0.045721f, -0.043022f, -0.039685f, -0.035803f, -0.031487f, -0.026859f, -0.022046f, -0.017180f, -0.012393f, -0.007810f, -0.003547f, 0.000292f, 0.003620f, 0.006370f, 0.008492f, 0.009960f, 0.010770f, 0.010938f, 0.010503f, 0.009520f, 0.008062f, 0.006214f, 0.004073f, 0.001741f, -0.000678f, -0.003079f, -0.005364f, -0.007440f, -0.009229f, -0.010664f, -0.011694f, -0.012284f, -0.012420f, -0.012102f, -0.011349f, -0.010196f, - -0.008692f, -0.006898f, -0.004886f, -0.002731f, -0.000515f, 0.001682f, 0.003781f, 0.005709f, 0.007403f, 0.008808f, 0.009882f, 0.010597f, 0.010939f, 0.010907f, 0.010517f, 0.009795f, 0.008781f, 0.007523f, 0.006079f, 0.004510f, 0.002881f, 0.001259f, -0.000294f, -0.001719f, -0.002965f, -0.003988f, -0.004756f, -0.005248f, -0.005452f, -0.005372f, -0.005020f, -0.004421f, -0.003609f, -0.002625f, -0.001517f, -0.000336f, 0.000863f, 0.002027f, 0.003105f, 0.004050f, 0.004821f, 0.005386f, 0.005721f, 0.005810f, 0.005649f, 0.005244f, 0.004608f, 0.003765f, 0.002746f, 0.001588f, 0.000331f, -0.000980f, -0.002301f, -0.003588f, -0.004801f, -0.005903f, -0.006865f, -0.007662f, -0.008280f, -0.008711f, -0.008955f, -0.009022f, -0.008930f, -0.008699f, -0.008361f, -0.007945f, -0.007489f, -0.007026f, -0.006592f, -0.006220f, -0.005936f, -0.005763f, -0.005719f, -0.005812f, -0.006044f, -0.006408f, -0.006890f, -0.007470f, -0.008121f, -0.008811f, -0.009505f, -0.010165f, -0.010753f, -0.011232f, -0.011568f, -0.011733f, -0.011702f, -0.011459f, -0.010995f, -0.010310f, -0.009413f, -0.008318f, -0.007052f, -0.005647f, -0.004140f, -0.002574f, - -0.000995f, 0.000550f, 0.002013f, 0.003350f, 0.004519f, 0.005485f, 0.006220f, 0.006702f, 0.006920f, 0.006871f, 0.006562f, 0.006009f, 0.005237f, 0.004279f, 0.003174f, 0.001966f, 0.000702f, -0.000568f, -0.001795f, -0.002932f, -0.003936f, -0.004770f, -0.005403f, -0.005812f, -0.005985f, -0.005916f, -0.005611f, -0.005085f, -0.004360f, -0.003467f, -0.002444f, -0.001332f, -0.000177f, 0.000974f, 0.002075f, 0.003082f, 0.003955f, 0.004659f, 0.005166f, 0.005457f, 0.005521f, 0.005356f, 0.004970f, 0.004378f, 0.003607f, 0.002688f, 0.001658f, 0.000560f, 0.001365f, -0.005282f, 0.091386f, 0.027096f, -0.110470f, -0.072853f, -0.047053f, -0.060849f, 0.019689f, 0.179100f, 0.180847f, 0.052269f, -0.078928f, 0.202594f, 0.182531f, 0.087056f, 0.204108f, 0.200376f, 0.111086f, -0.098967f, -0.003997f, 0.037594f, 0.006320f, 0.130559f, 0.198318f, 0.306011f, 0.137971f, -0.168854f, -0.168012f, -0.202469f, -0.028656f, 0.059362f, 0.277224f, 0.354088f, -0.072346f, -0.351328f, -0.377967f, -0.122179f, 0.080254f, 0.468769f, 0.159139f, -0.071262f, -0.114378f, -0.217912f, -0.030676f, 0.193918f, 0.235601f, -0.074225f, - -0.515604f, -0.464563f, -0.047118f, 0.323559f, 0.559021f, 0.307643f, -0.066844f, -0.469425f, -0.435315f, -0.253431f, 0.245073f, 0.044140f, 0.250680f, 0.056655f, -0.264860f, -0.252830f, 0.108479f, -0.098469f, -0.316136f, -0.153824f, 0.050116f, 0.266847f, 0.233378f, 0.153505f, 0.013379f, -0.016834f, -0.179006f, -0.104367f, -0.135727f, 0.001192f, 0.165036f, 0.202483f, 0.030499f, -0.143798f, -0.194432f, 0.118753f, 0.340240f, 0.354315f, -0.026860f, -0.389394f, -0.510589f, -0.197218f, 0.271761f, 0.631820f, 0.425170f, -0.058408f, -0.484943f, -0.476308f, -0.263813f, 0.177632f, 0.410086f, 0.219180f, 0.010928f, -0.226147f, -0.235120f, -0.102069f, 0.152772f, 0.293250f, 0.231404f, -0.031223f, -0.254637f, -0.322474f, -0.160527f, 0.057017f, 0.248437f, 0.294002f, 0.228441f, -0.081658f, -0.331972f, -0.349940f, -0.117661f, 0.271573f, 0.421057f, 0.257790f, 0.016894f, -0.327288f, -0.407511f, -0.211055f, 0.144184f, 0.365284f, 0.381074f, 0.127687f, -0.233440f, -0.455060f, -0.340202f, 0.005594f, 0.347046f, 0.479449f, 0.269346f, -0.124816f, -0.469715f, -0.425124f, -0.091510f, 0.310163f, 0.488578f, 0.338187f, - -0.048840f, -0.409422f, -0.465075f, -0.172028f, 0.226861f, 0.462260f, 0.345374f, 0.015127f, -0.324667f, -0.362308f, -0.137012f, 0.203355f, 0.345099f, 0.251686f, -0.032658f, -0.306335f, -0.272934f, -0.081282f, 0.159200f, 0.275533f, 0.181888f, -0.065405f, -0.261459f, -0.271706f, -0.062225f, 0.187779f, 0.293385f, 0.144842f, -0.073625f, -0.262863f, -0.225519f, -0.024463f, 0.184510f, 0.178295f, 0.124958f, -0.226115f, -0.448434f, -0.171999f, 0.191953f, 0.423991f, 0.259954f, -0.078384f, -0.350027f, -0.275698f, 0.018586f, 0.296410f, 0.273919f, 0.024354f, -0.241972f, -0.234854f, -0.008607f, 0.211595f, 0.180961f, -0.024704f, -0.177770f, -0.092307f, 0.083111f, 0.115066f, -0.020591f, -0.057406f, -0.000249f, 0.020003f, -0.000291f, 0.001135f, -0.001590f, 0.003310f, -0.000324f, 0.003949f, -0.001306f, 0.002062f, -0.001281f, 0.001886f, -0.000542f, 0.003265f, -0.001631f, 0.002411f, -0.002831f, 0.003455f, -0.000559f, 0.003497f, -0.003104f, 0.002614f, 0.000646f, 0.002225f, -0.001745f, 0.002795f, -0.001764f, 0.002432f, -0.000396f, 0.000214f, -0.002129f, 0.003695f, -0.000641f, 0.001720f, -0.002786f, 0.000426f}, - {0.000351f, 0.001011f, 0.001545f, 0.001875f, 0.001932f, 0.001659f, 0.001012f, -0.000033f, -0.001487f, -0.003338f, -0.005558f, -0.008100f, -0.010904f, -0.013893f, -0.016979f, -0.020069f, -0.023061f, -0.025858f, -0.028363f, -0.030486f, -0.032151f, -0.033292f, -0.033863f, -0.033835f, -0.033202f, -0.031977f, -0.030196f, -0.027913f, -0.025203f, -0.022158f, -0.018881f, -0.015488f, -0.012100f, -0.008840f, -0.005830f, -0.003184f, -0.001006f, 0.000613f, 0.001602f, 0.001907f, 0.001499f, 0.000373f, -0.001454f, -0.003940f, -0.007021f, -0.010610f, -0.014606f, -0.018889f, -0.023331f, -0.027797f, -0.032147f, -0.036248f, -0.039969f, -0.043192f, -0.045815f, -0.047752f, -0.048938f, -0.049333f, -0.048920f, -0.047705f, -0.045721f, -0.043022f, -0.039685f, -0.035803f, -0.031487f, -0.026859f, -0.022046f, -0.017180f, -0.012393f, -0.007810f, -0.003547f, 0.000292f, 0.003620f, 0.006370f, 0.008492f, 0.009960f, 0.010770f, 0.010938f, 0.010503f, 0.009520f, 0.008062f, 0.006214f, 0.004073f, 0.001741f, -0.000678f, -0.003079f, -0.005364f, -0.007440f, -0.009229f, -0.010664f, -0.011694f, -0.012284f, -0.012420f, -0.012102f, -0.011349f, -0.010196f, - -0.008692f, -0.006898f, -0.004886f, -0.002731f, -0.000515f, 0.001682f, 0.003781f, 0.005709f, 0.007403f, 0.008808f, 0.009882f, 0.010597f, 0.010939f, 0.010907f, 0.010517f, 0.009795f, 0.008781f, 0.007523f, 0.006079f, 0.004510f, 0.002881f, 0.001259f, -0.000294f, -0.001719f, -0.002965f, -0.003988f, -0.004756f, -0.005248f, -0.005452f, -0.005372f, -0.005020f, -0.004421f, -0.003609f, -0.002625f, -0.001517f, -0.000336f, 0.000863f, 0.002027f, 0.003105f, 0.004050f, 0.004821f, 0.005386f, 0.005721f, 0.005810f, 0.005649f, 0.005244f, 0.004608f, 0.003765f, 0.002746f, 0.001588f, 0.000331f, -0.000980f, -0.002301f, -0.003588f, -0.004801f, -0.005903f, -0.006865f, -0.007662f, -0.008280f, -0.008711f, -0.008955f, -0.009022f, -0.008930f, -0.008699f, -0.008361f, -0.007945f, -0.007489f, -0.007026f, -0.006592f, -0.006220f, -0.005936f, -0.005763f, -0.005719f, -0.005812f, -0.006044f, -0.006408f, -0.006890f, -0.007470f, -0.008121f, -0.008811f, -0.009505f, -0.010165f, -0.010753f, -0.011232f, -0.011568f, -0.011733f, -0.011702f, -0.011459f, -0.010995f, -0.010310f, -0.009413f, -0.008318f, -0.007052f, -0.005647f, -0.004140f, -0.002574f, - -0.000995f, 0.000550f, 0.002013f, 0.003350f, 0.004519f, 0.005485f, 0.006220f, 0.006702f, 0.006920f, 0.006871f, 0.006562f, 0.006009f, 0.005237f, 0.004279f, 0.003174f, 0.001966f, 0.000702f, -0.000568f, -0.001795f, -0.002932f, -0.003936f, -0.004770f, -0.005403f, -0.005812f, -0.005985f, -0.005916f, -0.005611f, -0.005085f, -0.004360f, -0.003467f, -0.002444f, -0.001332f, -0.000177f, 0.000974f, 0.002075f, 0.003082f, 0.003955f, 0.004659f, 0.005166f, 0.005457f, 0.005521f, 0.005356f, 0.004970f, 0.004378f, 0.003607f, 0.002688f, 0.001658f, 0.000560f, 0.001365f, -0.005282f, 0.091386f, 0.027096f, -0.110470f, -0.072853f, -0.047053f, -0.060849f, 0.019689f, 0.179100f, 0.180847f, 0.052269f, -0.078928f, 0.202594f, 0.182531f, 0.087056f, 0.204108f, 0.200376f, 0.111086f, -0.098967f, -0.003997f, 0.037594f, 0.006320f, 0.130559f, 0.198318f, 0.306011f, 0.137971f, -0.168854f, -0.168012f, -0.202469f, -0.028656f, 0.059362f, 0.277224f, 0.354088f, -0.072346f, -0.351328f, -0.377967f, -0.122179f, 0.080254f, 0.468769f, 0.159139f, -0.071262f, -0.114378f, -0.217912f, -0.030676f, 0.193918f, 0.235601f, -0.074225f, - -0.515604f, -0.464563f, -0.047118f, 0.323559f, 0.559021f, 0.307643f, -0.066844f, -0.469425f, -0.435315f, -0.253431f, 0.245073f, 0.044140f, 0.250680f, 0.056655f, -0.264860f, -0.252830f, 0.108479f, -0.098469f, -0.316136f, -0.153824f, 0.050116f, 0.266847f, 0.233378f, 0.153505f, 0.013379f, -0.016834f, -0.179006f, -0.104367f, -0.135727f, 0.001192f, 0.165036f, 0.202483f, 0.030499f, -0.143798f, -0.194432f, 0.118753f, 0.340240f, 0.354315f, -0.026860f, -0.389394f, -0.510589f, -0.197218f, 0.271761f, 0.631820f, 0.425170f, -0.058408f, -0.484943f, -0.476308f, -0.263813f, 0.177632f, 0.410086f, 0.219180f, 0.010928f, -0.226147f, -0.235120f, -0.102069f, 0.152772f, 0.293250f, 0.231404f, -0.031223f, -0.254637f, -0.322474f, -0.160527f, 0.057017f, 0.248437f, 0.294002f, 0.228441f, -0.081658f, -0.331972f, -0.349940f, -0.117661f, 0.271573f, 0.421057f, 0.257790f, 0.016894f, -0.327288f, -0.407511f, -0.211055f, 0.144184f, 0.365284f, 0.381074f, 0.127687f, -0.233440f, -0.455060f, -0.340202f, 0.005594f, 0.347046f, 0.479449f, 0.269346f, -0.124816f, -0.469715f, -0.425124f, -0.091510f, 0.310163f, 0.488578f, 0.338187f, - -0.048840f, -0.409422f, -0.465075f, -0.172028f, 0.226861f, 0.462260f, 0.345374f, 0.015127f, -0.324667f, -0.362308f, -0.137012f, 0.203355f, 0.345099f, 0.251686f, -0.032658f, -0.306335f, -0.272934f, -0.081282f, 0.159200f, 0.275533f, 0.181888f, -0.065405f, -0.261459f, -0.271706f, -0.062225f, 0.187779f, 0.293385f, 0.144842f, -0.073625f, -0.262863f, -0.225519f, -0.024463f, 0.184510f, 0.178295f, 0.124958f, -0.226115f, -0.448434f, -0.171999f, 0.191953f, 0.423991f, 0.259954f, -0.078384f, -0.350027f, -0.275698f, 0.018586f, 0.296410f, 0.273919f, 0.024354f, -0.241972f, -0.234854f, -0.008607f, 0.211595f, 0.180961f, -0.024704f, -0.177770f, -0.092307f, 0.083111f, 0.115066f, -0.020591f, -0.057406f, -0.000249f, 0.020003f, -0.000291f, 0.001135f, -0.001590f, 0.003310f, -0.000324f, 0.003949f, -0.001306f, 0.002062f, -0.001281f, 0.001886f, -0.000542f, 0.003265f, -0.001631f, 0.002411f, -0.002831f, 0.003455f, -0.000559f, 0.003497f, -0.003104f, 0.002614f, 0.000646f, 0.002225f, -0.001745f, 0.002795f, -0.001764f, 0.002432f, -0.000396f, 0.000214f, -0.002129f, 0.003695f, -0.000641f, 0.001720f, -0.002786f, 0.000426f} - }, - { - {-0.002431f, -0.007230f, -0.011846f, -0.016163f, -0.020075f, -0.023489f, -0.026328f, -0.028532f, -0.030062f, -0.030900f, -0.031050f, -0.030535f, -0.029400f, -0.027708f, -0.025538f, -0.022979f, -0.020135f, -0.017113f, -0.014022f, -0.010971f, -0.008064f, -0.005397f, -0.003053f, -0.001100f, 0.000408f, 0.001437f, 0.001971f, 0.002014f, 0.001588f, 0.000734f, -0.000493f, -0.002024f, -0.003777f, -0.005666f, -0.007596f, -0.009476f, -0.011214f, -0.012724f, -0.013931f, -0.014771f, -0.015193f, -0.015163f, -0.014664f, -0.013695f, -0.012275f, -0.010438f, -0.008235f, -0.005728f, -0.002995f, -0.000117f, 0.002813f, 0.005705f, 0.008466f, 0.011009f, 0.013252f, 0.015123f, 0.016564f, 0.017529f, 0.017987f, 0.017924f, 0.017342f, 0.016259f, 0.014711f, 0.012743f, 0.010417f, 0.007803f, 0.004976f, 0.002021f, -0.000980f, -0.003945f, -0.006793f, -0.009453f, -0.011861f, -0.013964f, -0.015721f, -0.017104f, -0.018099f, -0.018706f, -0.018937f, -0.018819f, -0.018387f, -0.017687f, -0.016771f, -0.015698f, -0.014527f, -0.013319f, -0.012131f, -0.011018f, -0.010028f, -0.009198f, -0.008560f, -0.008133f, -0.007926f, -0.007937f, -0.008154f, -0.008554f, - -0.009107f, -0.009775f, -0.010516f, -0.011281f, -0.012025f, -0.012699f, -0.013258f, -0.013664f, -0.013882f, -0.013885f, -0.013656f, -0.013188f, -0.012481f, -0.011546f, -0.010405f, -0.009086f, -0.007625f, -0.006066f, -0.004454f, -0.002839f, -0.001270f, 0.000203f, 0.001535f, 0.002685f, 0.003619f, 0.004308f, 0.004735f, 0.004889f, 0.004771f, 0.004389f, 0.003761f, 0.002914f, 0.001880f, 0.000698f, -0.000588f, -0.001932f, -0.003288f, -0.004610f, -0.005853f, -0.006978f, -0.007951f, -0.008744f, -0.009336f, -0.009715f, -0.009876f, -0.009823f, -0.009567f, -0.009128f, -0.008529f, -0.007799f, -0.006974f, -0.006086f, -0.005174f, -0.004272f, -0.003414f, -0.002628f, -0.001941f, -0.001371f, -0.000933f, -0.000631f, -0.000467f, -0.000433f, -0.000517f, -0.000699f, -0.000958f, -0.001266f, -0.001594f, -0.001914f, -0.002196f, -0.002413f, -0.002540f, -0.002557f, -0.002450f, -0.002208f, -0.001827f, -0.001312f, -0.000671f, 0.000079f, 0.000920f, 0.001824f, 0.002763f, 0.003706f, 0.004620f, 0.005473f, 0.006233f, 0.006873f, 0.007367f, 0.007696f, 0.007847f, 0.007811f, 0.007587f, 0.007181f, 0.006606f, 0.005878f, 0.005023f, 0.004067f, - 0.003043f, 0.001984f, 0.000926f, -0.000098f, -0.001055f, -0.001913f, -0.002648f, -0.003238f, -0.003668f, -0.003928f, -0.004016f, -0.003935f, -0.003696f, -0.003313f, -0.002809f, -0.002209f, -0.001541f, -0.000835f, -0.000123f, 0.000563f, 0.001196f, 0.001749f, 0.002198f, 0.002527f, 0.002723f, 0.002779f, 0.002695f, 0.002476f, 0.002133f, 0.001683f, 0.001146f, 0.000546f, -0.000089f, -0.000732f, -0.001354f, -0.001929f, -0.002430f, -0.002836f, -0.003130f, -0.003297f, -0.003331f, -0.003229f, -0.002996f, -0.002639f, -0.002175f, -0.001620f, -0.001000f, -0.000338f, -0.018290f, -0.062542f, 0.075373f, 0.023942f, -0.043869f, -0.192620f, -0.125258f, 0.151248f, 0.025188f, 0.252837f, 0.330054f, 0.289273f, 0.019560f, 0.027911f, 0.021279f, 0.080888f, -0.016728f, -0.037625f, 0.082546f, -0.021887f, 0.015778f, -0.008822f, -0.010483f, -0.001995f, -0.001428f, -0.021831f, 0.015079f, 0.012810f, -0.034509f, -0.033014f, 0.031136f, 0.059442f, 0.050913f, 0.004466f, 0.051857f, 0.078859f, 0.120192f, -0.015399f, -0.108147f, -0.094294f, 0.046426f, 0.262133f, 0.079013f, -0.001468f, -0.210725f, -0.235095f, -0.104065f, 0.105383f, - 0.215871f, 0.245890f, 0.063137f, -0.094421f, -0.246703f, -0.137069f, -0.002323f, 0.198470f, 0.210950f, 0.182676f, -0.069049f, 0.003720f, -0.182436f, -0.097736f, 0.145036f, 0.243565f, 0.045020f, 0.222209f, 0.277898f, -0.033674f, -0.277553f, -0.438511f, -0.182238f, 0.138761f, 0.347199f, 0.116233f, -0.089010f, -0.345756f, -0.215789f, -0.056986f, 0.155095f, 0.380138f, 0.258245f, -0.011012f, -0.261045f, -0.300396f, -0.131265f, 0.144730f, 0.224700f, 0.088212f, -0.110429f, -0.191985f, -0.100833f, 0.068341f, 0.174078f, 0.092212f, -0.046042f, -0.089726f, -0.082558f, 0.053932f, 0.209877f, 0.224859f, 0.062561f, -0.248984f, -0.397906f, -0.249788f, 0.149703f, 0.422700f, 0.454342f, 0.129361f, -0.262008f, -0.568459f, -0.523737f, -0.060849f, 0.446629f, 0.537808f, 0.189092f, -0.301296f, -0.429567f, -0.206890f, 0.150223f, 0.422084f, 0.238417f, 0.070144f, -0.187961f, -0.253082f, -0.085001f, 0.047626f, 0.184962f, 0.118252f, -0.017623f, -0.111506f, -0.092764f, -0.032066f, 0.088418f, 0.108586f, 0.046415f, -0.070387f, -0.099868f, -0.069341f, 0.047191f, 0.104158f, 0.095540f, 0.005518f, -0.089450f, -0.148444f, - -0.055762f, 0.065694f, 0.163000f, 0.133901f, 0.035208f, -0.117751f, -0.205851f, -0.144787f, 0.002520f, 0.129263f, 0.208158f, 0.130617f, -0.038862f, -0.176770f, -0.182205f, -0.062025f, 0.102914f, 0.194411f, 0.164397f, 0.004247f, -0.132913f, -0.191209f, -0.100734f, 0.103360f, 0.206840f, 0.161036f, 0.006662f, -0.133314f, -0.164263f, -0.103104f, 0.072983f, 0.163216f, 0.116373f, -0.011197f, -0.164415f, -0.108598f, 0.159688f, 0.216945f, 0.128949f, -0.106626f, -0.222040f, -0.161871f, 0.069665f, 0.219679f, 0.180035f, -0.048692f, -0.211565f, -0.174812f, 0.054405f, 0.204882f, 0.143031f, -0.084741f, -0.191758f, -0.077955f, 0.131194f, 0.141344f, -0.034264f, -0.132219f, 0.006956f, 0.067337f, 0.001168f, -0.024976f, 0.005599f, 0.000442f, 0.003906f, -0.003997f, 0.004107f, -0.002965f, 0.005384f, -0.003211f, 0.004713f, -0.005429f, 0.003167f, -0.003119f, 0.003858f, -0.003361f, 0.003274f, -0.004298f, 0.003072f, -0.003647f, 0.003571f, -0.001956f, 0.005858f, -0.003621f, 0.000852f, -0.003328f, 0.003440f, -0.000548f, 0.001963f, -0.003313f, 0.001772f, -0.002875f, 0.003917f, -0.002348f, 0.003217f, -0.002608f}, - {-0.002431f, -0.007230f, -0.011846f, -0.016163f, -0.020075f, -0.023489f, -0.026328f, -0.028532f, -0.030062f, -0.030900f, -0.031050f, -0.030535f, -0.029400f, -0.027708f, -0.025538f, -0.022979f, -0.020135f, -0.017113f, -0.014022f, -0.010971f, -0.008064f, -0.005397f, -0.003053f, -0.001100f, 0.000408f, 0.001437f, 0.001971f, 0.002014f, 0.001588f, 0.000734f, -0.000493f, -0.002024f, -0.003777f, -0.005666f, -0.007596f, -0.009476f, -0.011214f, -0.012724f, -0.013931f, -0.014771f, -0.015193f, -0.015163f, -0.014664f, -0.013695f, -0.012275f, -0.010438f, -0.008235f, -0.005728f, -0.002995f, -0.000117f, 0.002813f, 0.005705f, 0.008466f, 0.011009f, 0.013252f, 0.015123f, 0.016564f, 0.017529f, 0.017987f, 0.017924f, 0.017342f, 0.016259f, 0.014711f, 0.012743f, 0.010417f, 0.007803f, 0.004976f, 0.002021f, -0.000980f, -0.003945f, -0.006793f, -0.009453f, -0.011861f, -0.013964f, -0.015721f, -0.017104f, -0.018099f, -0.018706f, -0.018937f, -0.018819f, -0.018387f, -0.017687f, -0.016771f, -0.015698f, -0.014527f, -0.013319f, -0.012131f, -0.011018f, -0.010028f, -0.009198f, -0.008560f, -0.008133f, -0.007926f, -0.007937f, -0.008154f, -0.008554f, - -0.009107f, -0.009775f, -0.010516f, -0.011281f, -0.012025f, -0.012699f, -0.013258f, -0.013664f, -0.013882f, -0.013885f, -0.013656f, -0.013188f, -0.012481f, -0.011546f, -0.010405f, -0.009086f, -0.007625f, -0.006066f, -0.004454f, -0.002839f, -0.001270f, 0.000203f, 0.001535f, 0.002685f, 0.003619f, 0.004308f, 0.004735f, 0.004889f, 0.004771f, 0.004389f, 0.003761f, 0.002914f, 0.001880f, 0.000698f, -0.000588f, -0.001932f, -0.003288f, -0.004610f, -0.005853f, -0.006978f, -0.007951f, -0.008744f, -0.009336f, -0.009715f, -0.009876f, -0.009823f, -0.009567f, -0.009128f, -0.008529f, -0.007799f, -0.006974f, -0.006086f, -0.005174f, -0.004272f, -0.003414f, -0.002628f, -0.001941f, -0.001371f, -0.000933f, -0.000631f, -0.000467f, -0.000433f, -0.000517f, -0.000699f, -0.000958f, -0.001266f, -0.001594f, -0.001914f, -0.002196f, -0.002413f, -0.002540f, -0.002557f, -0.002450f, -0.002208f, -0.001827f, -0.001312f, -0.000671f, 0.000079f, 0.000920f, 0.001824f, 0.002763f, 0.003706f, 0.004620f, 0.005473f, 0.006233f, 0.006873f, 0.007367f, 0.007696f, 0.007847f, 0.007811f, 0.007587f, 0.007181f, 0.006606f, 0.005878f, 0.005023f, 0.004067f, - 0.003043f, 0.001984f, 0.000926f, -0.000098f, -0.001055f, -0.001913f, -0.002648f, -0.003238f, -0.003668f, -0.003928f, -0.004016f, -0.003935f, -0.003696f, -0.003313f, -0.002809f, -0.002209f, -0.001541f, -0.000835f, -0.000123f, 0.000563f, 0.001196f, 0.001749f, 0.002198f, 0.002527f, 0.002723f, 0.002779f, 0.002695f, 0.002476f, 0.002133f, 0.001683f, 0.001146f, 0.000546f, -0.000089f, -0.000732f, -0.001354f, -0.001929f, -0.002430f, -0.002836f, -0.003130f, -0.003297f, -0.003331f, -0.003229f, -0.002996f, -0.002639f, -0.002175f, -0.001620f, -0.001000f, -0.000338f, -0.018290f, -0.062542f, 0.075373f, 0.023942f, -0.043869f, -0.192620f, -0.125258f, 0.151248f, 0.025188f, 0.252837f, 0.330054f, 0.289273f, 0.019560f, 0.027911f, 0.021279f, 0.080888f, -0.016728f, -0.037625f, 0.082546f, -0.021887f, 0.015778f, -0.008822f, -0.010483f, -0.001995f, -0.001428f, -0.021831f, 0.015079f, 0.012810f, -0.034509f, -0.033014f, 0.031136f, 0.059442f, 0.050913f, 0.004466f, 0.051857f, 0.078859f, 0.120192f, -0.015399f, -0.108147f, -0.094294f, 0.046426f, 0.262133f, 0.079013f, -0.001468f, -0.210725f, -0.235095f, -0.104065f, 0.105383f, - 0.215871f, 0.245890f, 0.063137f, -0.094421f, -0.246703f, -0.137069f, -0.002323f, 0.198470f, 0.210950f, 0.182676f, -0.069049f, 0.003720f, -0.182436f, -0.097736f, 0.145036f, 0.243565f, 0.045020f, 0.222209f, 0.277898f, -0.033674f, -0.277553f, -0.438511f, -0.182238f, 0.138761f, 0.347199f, 0.116233f, -0.089010f, -0.345756f, -0.215789f, -0.056986f, 0.155095f, 0.380138f, 0.258245f, -0.011012f, -0.261045f, -0.300396f, -0.131265f, 0.144730f, 0.224700f, 0.088212f, -0.110429f, -0.191985f, -0.100833f, 0.068341f, 0.174078f, 0.092212f, -0.046042f, -0.089726f, -0.082558f, 0.053932f, 0.209877f, 0.224859f, 0.062561f, -0.248984f, -0.397906f, -0.249788f, 0.149703f, 0.422700f, 0.454342f, 0.129361f, -0.262008f, -0.568459f, -0.523737f, -0.060849f, 0.446629f, 0.537808f, 0.189092f, -0.301296f, -0.429567f, -0.206890f, 0.150223f, 0.422084f, 0.238417f, 0.070144f, -0.187961f, -0.253082f, -0.085001f, 0.047626f, 0.184962f, 0.118252f, -0.017623f, -0.111506f, -0.092764f, -0.032066f, 0.088418f, 0.108586f, 0.046415f, -0.070387f, -0.099868f, -0.069341f, 0.047191f, 0.104158f, 0.095540f, 0.005518f, -0.089450f, -0.148444f, - -0.055762f, 0.065694f, 0.163000f, 0.133901f, 0.035208f, -0.117751f, -0.205851f, -0.144787f, 0.002520f, 0.129263f, 0.208158f, 0.130617f, -0.038862f, -0.176770f, -0.182205f, -0.062025f, 0.102914f, 0.194411f, 0.164397f, 0.004247f, -0.132913f, -0.191209f, -0.100734f, 0.103360f, 0.206840f, 0.161036f, 0.006662f, -0.133314f, -0.164263f, -0.103104f, 0.072983f, 0.163216f, 0.116373f, -0.011197f, -0.164415f, -0.108598f, 0.159688f, 0.216945f, 0.128949f, -0.106626f, -0.222040f, -0.161871f, 0.069665f, 0.219679f, 0.180035f, -0.048692f, -0.211565f, -0.174812f, 0.054405f, 0.204882f, 0.143031f, -0.084741f, -0.191758f, -0.077955f, 0.131194f, 0.141344f, -0.034264f, -0.132219f, 0.006956f, 0.067337f, 0.001168f, -0.024976f, 0.005599f, 0.000442f, 0.003906f, -0.003997f, 0.004107f, -0.002965f, 0.005384f, -0.003211f, 0.004713f, -0.005429f, 0.003167f, -0.003119f, 0.003858f, -0.003361f, 0.003274f, -0.004298f, 0.003072f, -0.003647f, 0.003571f, -0.001956f, 0.005858f, -0.003621f, 0.000852f, -0.003328f, 0.003440f, -0.000548f, 0.001963f, -0.003313f, 0.001772f, -0.002875f, 0.003917f, -0.002348f, 0.003217f, -0.002608f} - }, - { - {-0.001645f, -0.004889f, -0.007994f, -0.010872f, -0.013441f, -0.015627f, -0.017366f, -0.018606f, -0.019309f, -0.019449f, -0.019017f, -0.018018f, -0.016473f, -0.014415f, -0.011894f, -0.008968f, -0.005708f, -0.002193f, 0.001492f, 0.005258f, 0.009013f, 0.012668f, 0.016133f, 0.019327f, 0.022174f, 0.024608f, 0.026572f, 0.028024f, 0.028931f, 0.029277f, 0.029057f, 0.028283f, 0.026975f, 0.025171f, 0.022916f, 0.020266f, 0.017286f, 0.014047f, 0.010624f, 0.007094f, 0.003535f, 0.000024f, -0.003366f, -0.006569f, -0.009523f, -0.012176f, -0.014484f, -0.016413f, -0.017941f, -0.019056f, -0.019756f, -0.020049f, -0.019954f, -0.019497f, -0.018714f, -0.017645f, -0.016336f, -0.014838f, -0.013201f, -0.011478f, -0.009722f, -0.007980f, -0.006300f, -0.004722f, -0.003284f, -0.002015f, -0.000939f, -0.000073f, 0.000573f, 0.000994f, 0.001195f, 0.001184f, 0.000974f, 0.000585f, 0.000037f, -0.000645f, -0.001434f, -0.002304f, -0.003228f, -0.004180f, -0.005136f, -0.006074f, -0.006975f, -0.007823f, -0.008607f, -0.009317f, -0.009947f, -0.010497f, -0.010966f, -0.011359f, -0.011681f, -0.011939f, -0.012142f, -0.012299f, -0.012420f, -0.012512f, - -0.012584f, -0.012641f, -0.012688f, -0.012728f, -0.012762f, -0.012789f, -0.012806f, -0.012808f, -0.012789f, -0.012743f, -0.012661f, -0.012535f, -0.012358f, -0.012123f, -0.011825f, -0.011457f, -0.011019f, -0.010510f, -0.009931f, -0.009287f, -0.008586f, -0.007835f, -0.007048f, -0.006237f, -0.005417f, -0.004604f, -0.003816f, -0.003069f, -0.002380f, -0.001765f, -0.001239f, -0.000814f, -0.000500f, -0.000304f, -0.000232f, -0.000285f, -0.000460f, -0.000753f, -0.001155f, -0.001654f, -0.002236f, -0.002885f, -0.003582f, -0.004308f, -0.005042f, -0.005763f, -0.006450f, -0.007084f, -0.007647f, -0.008124f, -0.008499f, -0.008763f, -0.008907f, -0.008927f, -0.008822f, -0.008594f, -0.008248f, -0.007793f, -0.007239f, -0.006599f, -0.005890f, -0.005128f, -0.004330f, -0.003514f, -0.002698f, -0.001899f, -0.001133f, -0.000414f, 0.000244f, 0.000833f, 0.001344f, 0.001771f, 0.002114f, 0.002371f, 0.002545f, 0.002642f, 0.002667f, 0.002630f, 0.002541f, 0.002410f, 0.002249f, 0.002069f, 0.001881f, 0.001696f, 0.001524f, 0.001371f, 0.001246f, 0.001152f, 0.001093f, 0.001070f, 0.001082f, 0.001127f, 0.001201f, 0.001298f, 0.001412f, 0.001537f, - 0.001664f, 0.001786f, 0.001896f, 0.001986f, 0.002051f, 0.002085f, 0.002084f, 0.002047f, 0.001972f, 0.001859f, 0.001712f, 0.001533f, 0.001327f, 0.001100f, 0.000859f, 0.000610f, 0.000363f, 0.000124f, -0.000099f, -0.000300f, -0.000472f, -0.000610f, -0.000710f, -0.000770f, -0.000790f, -0.000768f, -0.000708f, -0.000612f, -0.000486f, -0.000334f, -0.000164f, 0.000018f, 0.000204f, 0.000386f, 0.000558f, 0.000711f, 0.000840f, 0.000940f, 0.001007f, 0.001037f, 0.001030f, 0.000985f, 0.000904f, 0.000790f, 0.000647f, 0.000480f, 0.000295f, 0.000100f, 0.051440f, -0.017404f, -0.015031f, -0.006631f, 0.084912f, 0.030042f, 0.126303f, 0.077667f, 0.061283f, -0.206804f, -0.266513f, -0.146299f, 0.048463f, 0.221834f, 0.276928f, 0.058618f, -0.164883f, -0.206521f, -0.157245f, -0.019971f, 0.022484f, 0.009127f, -0.074832f, -0.003766f, 0.011558f, 0.046388f, 0.084463f, 0.035029f, -0.041705f, -0.135144f, -0.247107f, -0.068341f, 0.062401f, 0.215002f, 0.182115f, 0.017813f, -0.224853f, -0.242217f, -0.154143f, 0.140675f, 0.085035f, 0.013789f, 0.004699f, -0.030640f, -0.048520f, -0.053992f, 0.042938f, 0.077860f, - -0.122612f, -0.094380f, -0.021180f, 0.048656f, 0.098990f, 0.131997f, 0.049407f, -0.051469f, -0.107798f, -0.102519f, -0.027519f, 0.017002f, 0.121854f, 0.099067f, -0.012549f, -0.136986f, -0.168680f, -0.174574f, -0.066879f, 0.136946f, 0.301285f, 0.218697f, 0.064603f, -0.129712f, -0.295903f, -0.372101f, -0.176103f, 0.125151f, 0.321045f, 0.280827f, 0.079868f, -0.182004f, -0.337718f, -0.255048f, -0.075833f, 0.186080f, 0.229930f, 0.034094f, -0.137032f, -0.117218f, -0.015998f, 0.102881f, 0.148584f, 0.090919f, 0.023247f, -0.071571f, -0.111685f, -0.117527f, 0.010460f, 0.106725f, 0.099762f, 0.070302f, -0.064238f, -0.141554f, -0.120835f, -0.020430f, 0.117272f, 0.156353f, 0.059997f, -0.155890f, -0.200814f, -0.054347f, 0.108571f, 0.190060f, 0.124766f, -0.081814f, -0.251485f, -0.318244f, -0.060085f, 0.291755f, 0.371072f, 0.175054f, -0.113281f, -0.303607f, -0.187642f, -0.017714f, 0.224460f, 0.243779f, 0.102581f, -0.074083f, -0.204041f, -0.200559f, -0.040905f, 0.108675f, 0.223579f, 0.138661f, -0.050251f, -0.213777f, -0.246007f, -0.079520f, 0.144106f, 0.230220f, 0.169662f, 0.026378f, -0.146485f, -0.219150f, - -0.151349f, 0.038709f, 0.179876f, 0.134576f, -0.009275f, -0.077913f, -0.144363f, -0.041473f, 0.052335f, 0.093512f, 0.027278f, -0.011454f, -0.031205f, -0.026190f, -0.019791f, -0.000507f, -0.007044f, 0.020804f, 0.056088f, 0.052051f, 0.007688f, -0.040209f, -0.055811f, -0.032228f, 0.014392f, 0.040408f, 0.049053f, 0.038043f, -0.015223f, -0.058610f, -0.047302f, -0.026520f, 0.045780f, 0.026105f, -0.013310f, -0.017261f, 0.022633f, 0.048770f, 0.024043f, -0.024744f, -0.049378f, -0.012487f, 0.038986f, 0.054117f, 0.000389f, -0.046756f, -0.042967f, 0.017333f, 0.052966f, 0.029892f, -0.029762f, -0.051009f, -0.014580f, 0.046694f, 0.043299f, -0.016820f, -0.055613f, 0.000172f, 0.042298f, 0.006846f, -0.019183f, 0.002989f, 0.001877f, 0.000899f, -0.000117f, 0.002684f, -0.000509f, 0.001446f, -0.000408f, 0.000453f, -0.002198f, 0.001084f, -0.000278f, 0.001686f, -0.000636f, 0.001433f, -0.002012f, 0.001090f, -0.000798f, 0.000549f, -0.000918f, 0.003335f, -0.000223f, 0.001920f, -0.002619f, 0.000713f, -0.001257f, 0.000292f, -0.000361f, 0.001446f, 0.000380f, 0.001368f, -0.001780f, 0.001050f, -0.001139f, 0.000807f}, - {-0.001645f, -0.004889f, -0.007994f, -0.010872f, -0.013441f, -0.015627f, -0.017366f, -0.018606f, -0.019309f, -0.019449f, -0.019017f, -0.018018f, -0.016473f, -0.014415f, -0.011894f, -0.008968f, -0.005708f, -0.002193f, 0.001492f, 0.005258f, 0.009013f, 0.012668f, 0.016133f, 0.019327f, 0.022174f, 0.024608f, 0.026572f, 0.028024f, 0.028931f, 0.029277f, 0.029057f, 0.028283f, 0.026975f, 0.025171f, 0.022916f, 0.020266f, 0.017286f, 0.014047f, 0.010624f, 0.007094f, 0.003535f, 0.000024f, -0.003366f, -0.006569f, -0.009523f, -0.012176f, -0.014484f, -0.016413f, -0.017941f, -0.019056f, -0.019756f, -0.020049f, -0.019954f, -0.019497f, -0.018714f, -0.017645f, -0.016336f, -0.014838f, -0.013201f, -0.011478f, -0.009722f, -0.007980f, -0.006300f, -0.004722f, -0.003284f, -0.002015f, -0.000939f, -0.000073f, 0.000573f, 0.000994f, 0.001195f, 0.001184f, 0.000974f, 0.000585f, 0.000037f, -0.000645f, -0.001434f, -0.002304f, -0.003228f, -0.004180f, -0.005136f, -0.006074f, -0.006975f, -0.007823f, -0.008607f, -0.009317f, -0.009947f, -0.010497f, -0.010966f, -0.011359f, -0.011681f, -0.011939f, -0.012142f, -0.012299f, -0.012420f, -0.012512f, - -0.012584f, -0.012641f, -0.012688f, -0.012728f, -0.012762f, -0.012789f, -0.012806f, -0.012808f, -0.012789f, -0.012743f, -0.012661f, -0.012535f, -0.012358f, -0.012123f, -0.011825f, -0.011457f, -0.011019f, -0.010510f, -0.009931f, -0.009287f, -0.008586f, -0.007835f, -0.007048f, -0.006237f, -0.005417f, -0.004604f, -0.003816f, -0.003069f, -0.002380f, -0.001765f, -0.001239f, -0.000814f, -0.000500f, -0.000304f, -0.000232f, -0.000285f, -0.000460f, -0.000753f, -0.001155f, -0.001654f, -0.002236f, -0.002885f, -0.003582f, -0.004308f, -0.005042f, -0.005763f, -0.006450f, -0.007084f, -0.007647f, -0.008124f, -0.008499f, -0.008763f, -0.008907f, -0.008927f, -0.008822f, -0.008594f, -0.008248f, -0.007793f, -0.007239f, -0.006599f, -0.005890f, -0.005128f, -0.004330f, -0.003514f, -0.002698f, -0.001899f, -0.001133f, -0.000414f, 0.000244f, 0.000833f, 0.001344f, 0.001771f, 0.002114f, 0.002371f, 0.002545f, 0.002642f, 0.002667f, 0.002630f, 0.002541f, 0.002410f, 0.002249f, 0.002069f, 0.001881f, 0.001696f, 0.001524f, 0.001371f, 0.001246f, 0.001152f, 0.001093f, 0.001070f, 0.001082f, 0.001127f, 0.001201f, 0.001298f, 0.001412f, 0.001537f, - 0.001664f, 0.001786f, 0.001896f, 0.001986f, 0.002051f, 0.002085f, 0.002084f, 0.002047f, 0.001972f, 0.001859f, 0.001712f, 0.001533f, 0.001327f, 0.001100f, 0.000859f, 0.000610f, 0.000363f, 0.000124f, -0.000099f, -0.000300f, -0.000472f, -0.000610f, -0.000710f, -0.000770f, -0.000790f, -0.000768f, -0.000708f, -0.000612f, -0.000486f, -0.000334f, -0.000164f, 0.000018f, 0.000204f, 0.000386f, 0.000558f, 0.000711f, 0.000840f, 0.000940f, 0.001007f, 0.001037f, 0.001030f, 0.000985f, 0.000904f, 0.000790f, 0.000647f, 0.000480f, 0.000295f, 0.000100f, 0.051440f, -0.017404f, -0.015031f, -0.006631f, 0.084912f, 0.030042f, 0.126303f, 0.077667f, 0.061283f, -0.206804f, -0.266513f, -0.146299f, 0.048463f, 0.221834f, 0.276928f, 0.058618f, -0.164883f, -0.206521f, -0.157245f, -0.019971f, 0.022484f, 0.009127f, -0.074832f, -0.003766f, 0.011558f, 0.046388f, 0.084463f, 0.035029f, -0.041705f, -0.135144f, -0.247107f, -0.068341f, 0.062401f, 0.215002f, 0.182115f, 0.017813f, -0.224853f, -0.242217f, -0.154143f, 0.140675f, 0.085035f, 0.013789f, 0.004699f, -0.030640f, -0.048520f, -0.053992f, 0.042938f, 0.077860f, - -0.122612f, -0.094380f, -0.021180f, 0.048656f, 0.098990f, 0.131997f, 0.049407f, -0.051469f, -0.107798f, -0.102519f, -0.027519f, 0.017002f, 0.121854f, 0.099067f, -0.012549f, -0.136986f, -0.168680f, -0.174574f, -0.066879f, 0.136946f, 0.301285f, 0.218697f, 0.064603f, -0.129712f, -0.295903f, -0.372101f, -0.176103f, 0.125151f, 0.321045f, 0.280827f, 0.079868f, -0.182004f, -0.337718f, -0.255048f, -0.075833f, 0.186080f, 0.229930f, 0.034094f, -0.137032f, -0.117218f, -0.015998f, 0.102881f, 0.148584f, 0.090919f, 0.023247f, -0.071571f, -0.111685f, -0.117527f, 0.010460f, 0.106725f, 0.099762f, 0.070302f, -0.064238f, -0.141554f, -0.120835f, -0.020430f, 0.117272f, 0.156353f, 0.059997f, -0.155890f, -0.200814f, -0.054347f, 0.108571f, 0.190060f, 0.124766f, -0.081814f, -0.251485f, -0.318244f, -0.060085f, 0.291755f, 0.371072f, 0.175054f, -0.113281f, -0.303607f, -0.187642f, -0.017714f, 0.224460f, 0.243779f, 0.102581f, -0.074083f, -0.204041f, -0.200559f, -0.040905f, 0.108675f, 0.223579f, 0.138661f, -0.050251f, -0.213777f, -0.246007f, -0.079520f, 0.144106f, 0.230220f, 0.169662f, 0.026378f, -0.146485f, -0.219150f, - -0.151349f, 0.038709f, 0.179876f, 0.134576f, -0.009275f, -0.077913f, -0.144363f, -0.041473f, 0.052335f, 0.093512f, 0.027278f, -0.011454f, -0.031205f, -0.026190f, -0.019791f, -0.000507f, -0.007044f, 0.020804f, 0.056088f, 0.052051f, 0.007688f, -0.040209f, -0.055811f, -0.032228f, 0.014392f, 0.040408f, 0.049053f, 0.038043f, -0.015223f, -0.058610f, -0.047302f, -0.026520f, 0.045780f, 0.026105f, -0.013310f, -0.017261f, 0.022633f, 0.048770f, 0.024043f, -0.024744f, -0.049378f, -0.012487f, 0.038986f, 0.054117f, 0.000389f, -0.046756f, -0.042967f, 0.017333f, 0.052966f, 0.029892f, -0.029762f, -0.051009f, -0.014580f, 0.046694f, 0.043299f, -0.016820f, -0.055613f, 0.000172f, 0.042298f, 0.006846f, -0.019183f, 0.002989f, 0.001877f, 0.000899f, -0.000117f, 0.002684f, -0.000509f, 0.001446f, -0.000408f, 0.000453f, -0.002198f, 0.001084f, -0.000278f, 0.001686f, -0.000636f, 0.001433f, -0.002012f, 0.001090f, -0.000798f, 0.000549f, -0.000918f, 0.003335f, -0.000223f, 0.001920f, -0.002619f, 0.000713f, -0.001257f, 0.000292f, -0.000361f, 0.001446f, 0.000380f, 0.001368f, -0.001780f, 0.001050f, -0.001139f, 0.000807f} - }, - { - {-0.000690f, -0.002053f, -0.003367f, -0.004601f, -0.005728f, -0.006720f, -0.007557f, -0.008222f, -0.008701f, -0.008989f, -0.009083f, -0.008987f, -0.008711f, -0.008268f, -0.007678f, -0.006963f, -0.006150f, -0.005268f, -0.004347f, -0.003420f, -0.002518f, -0.001673f, -0.000914f, -0.000269f, 0.000238f, 0.000585f, 0.000757f, 0.000739f, 0.000525f, 0.000111f, -0.000501f, -0.001306f, -0.002292f, -0.003446f, -0.004750f, -0.006182f, -0.007719f, -0.009334f, -0.011001f, -0.012691f, -0.014375f, -0.016025f, -0.017613f, -0.019112f, -0.020496f, -0.021743f, -0.022829f, -0.023737f, -0.024449f, -0.024952f, -0.025234f, -0.025286f, -0.025103f, -0.024683f, -0.024026f, -0.023135f, -0.022016f, -0.020679f, -0.019136f, -0.017401f, -0.015492f, -0.013430f, -0.011237f, -0.008940f, -0.006565f, -0.004143f, -0.001704f, 0.000718f, 0.003089f, 0.005377f, 0.007546f, 0.009564f, 0.011399f, 0.013020f, 0.014400f, 0.015515f, 0.016344f, 0.016871f, 0.017086f, 0.016982f, 0.016561f, 0.015827f, 0.014793f, 0.013478f, 0.011905f, 0.010103f, 0.008109f, 0.005959f, 0.003697f, 0.001368f, -0.000981f, -0.003304f, -0.005551f, -0.007679f, -0.009644f, -0.011407f, - -0.012933f, -0.014192f, -0.015163f, -0.015828f, -0.016178f, -0.016213f, -0.015936f, -0.015362f, -0.014509f, -0.013404f, -0.012076f, -0.010562f, -0.008900f, -0.007133f, -0.005302f, -0.003450f, -0.001619f, 0.000153f, 0.001828f, 0.003374f, 0.004765f, 0.005979f, 0.006999f, 0.007816f, 0.008426f, 0.008831f, 0.009037f, 0.009057f, 0.008907f, 0.008608f, 0.008181f, 0.007650f, 0.007040f, 0.006375f, 0.005679f, 0.004971f, 0.004271f, 0.003593f, 0.002949f, 0.002346f, 0.001788f, 0.001275f, 0.000803f, 0.000365f, -0.000047f, -0.000445f, -0.000840f, -0.001245f, -0.001672f, -0.002130f, -0.002627f, -0.003169f, -0.003757f, -0.004391f, -0.005063f, -0.005765f, -0.006483f, -0.007200f, -0.007896f, -0.008548f, -0.009133f, -0.009624f, -0.009999f, -0.010233f, -0.010305f, -0.010196f, -0.009892f, -0.009383f, -0.008666f, -0.007741f, -0.006616f, -0.005305f, -0.003827f, -0.002207f, -0.000476f, 0.001333f, 0.003180f, 0.005028f, 0.006833f, 0.008555f, 0.010155f, 0.011596f, 0.012844f, 0.013871f, 0.014654f, 0.015176f, 0.015429f, 0.015411f, 0.015126f, 0.014589f, 0.013818f, 0.012839f, 0.011683f, 0.010388f, 0.008990f, 0.007533f, - 0.006057f, 0.004604f, 0.003214f, 0.001923f, 0.000764f, -0.000238f, -0.001059f, -0.001686f, -0.002112f, -0.002334f, -0.002360f, -0.002202f, -0.001877f, -0.001411f, -0.000830f, -0.000166f, 0.000549f, 0.001282f, 0.001998f, 0.002668f, 0.003262f, 0.003756f, 0.004130f, 0.004368f, 0.004463f, 0.004411f, 0.004214f, 0.003882f, 0.003429f, 0.002872f, 0.002235f, 0.001542f, 0.000822f, 0.000102f, -0.000590f, -0.001227f, -0.001786f, -0.002246f, -0.002591f, -0.002809f, -0.002893f, -0.002843f, -0.002662f, -0.002362f, -0.001955f, -0.001462f, -0.000904f, -0.000306f, 0.000296f, 0.003937f, 0.009648f, 0.012419f, 0.011267f, 0.040238f, 0.015703f, -0.011552f, -0.058160f, 0.013046f, 0.072824f, 0.088627f, -0.015958f, -0.160738f, -0.254131f, -0.050171f, 0.053966f, 0.110719f, 0.126033f, 0.010242f, 0.054476f, 0.047715f, -0.060406f, -0.155297f, 0.013718f, 0.062056f, 0.089206f, 0.119108f, 0.035385f, -0.029856f, -0.021391f, -0.127605f, -0.058302f, 0.063474f, 0.126353f, 0.057306f, -0.086294f, -0.115687f, -0.061619f, 0.036661f, 0.157767f, 0.060098f, -0.043304f, -0.112367f, -0.120737f, -0.060150f, 0.071453f, 0.076516f, - 0.063806f, 0.039984f, 0.012824f, 0.010209f, -0.018528f, -0.064632f, -0.023531f, -0.020034f, 0.014198f, 0.015704f, 0.120472f, -0.088570f, -0.026549f, -0.032296f, -0.172561f, -0.040071f, 0.109757f, -0.008742f, -0.101366f, -0.055359f, 0.046352f, 0.103096f, 0.129563f, 0.047553f, -0.024178f, -0.125148f, -0.117219f, 0.036596f, 0.186238f, 0.123714f, -0.045137f, -0.171506f, -0.106041f, -0.002482f, 0.055770f, 0.107032f, 0.059515f, -0.077665f, -0.169167f, -0.091629f, 0.046448f, 0.144953f, 0.091318f, -0.011980f, 0.009144f, -0.117581f, 0.016691f, 0.032711f, 0.218095f, 0.098833f, -0.062401f, -0.088608f, -0.001681f, 0.001069f, -0.093855f, -0.119791f, -0.048200f, 0.050228f, 0.123198f, 0.041732f, -0.097033f, -0.117008f, 0.012802f, 0.172574f, 0.184757f, 0.009102f, -0.120569f, -0.172745f, -0.076288f, 0.177154f, 0.250881f, 0.099183f, -0.107409f, -0.237621f, -0.190393f, -0.046260f, 0.129260f, 0.187136f, 0.116149f, -0.021548f, -0.160583f, -0.126560f, -0.027619f, 0.100470f, 0.179752f, 0.093998f, -0.109599f, -0.153948f, -0.181134f, 0.020372f, 0.217498f, 0.277900f, 0.121373f, -0.074423f, -0.234906f, -0.205704f, - -0.082379f, 0.085297f, 0.116048f, 0.117933f, -0.030242f, -0.117081f, -0.129572f, -0.010412f, 0.112942f, 0.131377f, -0.076372f, -0.144450f, -0.141864f, -0.036980f, 0.060290f, 0.118163f, 0.075497f, 0.007247f, -0.076572f, -0.106067f, -0.084042f, 0.039064f, 0.097812f, 0.118444f, 0.030211f, -0.043478f, -0.118658f, -0.097851f, -0.039008f, 0.070489f, 0.085911f, 0.105045f, -0.013103f, -0.109826f, -0.234591f, -0.026291f, 0.411073f, 0.430086f, 0.115483f, -0.325910f, -0.478239f, -0.221265f, 0.238392f, 0.486933f, 0.281713f, -0.180712f, -0.476652f, -0.295784f, 0.161026f, 0.445223f, 0.244443f, -0.190672f, -0.395177f, -0.136553f, 0.241464f, 0.292475f, -0.052163f, -0.246516f, -0.033780f, 0.137826f, 0.013441f, -0.035850f, -0.009276f, 0.005239f, -0.002221f, 0.001268f, -0.004987f, 0.001142f, -0.006533f, 0.002459f, -0.004739f, 0.003077f, -0.001965f, 0.000451f, -0.003766f, 0.004415f, -0.001868f, 0.003175f, -0.004095f, 0.005067f, -0.005135f, 0.003633f, -0.002886f, 0.003814f, -0.001883f, 0.004380f, -0.003811f, 0.002574f, -0.004489f, 0.004757f, -0.003096f, 0.005553f, -0.002642f, 0.002949f, -0.002289f, 0.003374f}, - {0.000690f, 0.002053f, 0.003367f, 0.004601f, 0.005728f, 0.006720f, 0.007557f, 0.008222f, 0.008701f, 0.008989f, 0.009083f, 0.008987f, 0.008711f, 0.008268f, 0.007678f, 0.006963f, 0.006150f, 0.005268f, 0.004347f, 0.003420f, 0.002518f, 0.001673f, 0.000914f, 0.000269f, -0.000238f, -0.000585f, -0.000757f, -0.000739f, -0.000525f, -0.000111f, 0.000501f, 0.001306f, 0.002292f, 0.003446f, 0.004750f, 0.006182f, 0.007719f, 0.009334f, 0.011001f, 0.012691f, 0.014375f, 0.016025f, 0.017613f, 0.019112f, 0.020496f, 0.021743f, 0.022829f, 0.023737f, 0.024449f, 0.024952f, 0.025234f, 0.025286f, 0.025103f, 0.024683f, 0.024026f, 0.023135f, 0.022016f, 0.020679f, 0.019136f, 0.017401f, 0.015492f, 0.013430f, 0.011237f, 0.008940f, 0.006565f, 0.004143f, 0.001704f, -0.000718f, -0.003089f, -0.005377f, -0.007546f, -0.009564f, -0.011399f, -0.013020f, -0.014400f, -0.015515f, -0.016344f, -0.016871f, -0.017086f, -0.016982f, -0.016561f, -0.015827f, -0.014793f, -0.013478f, -0.011905f, -0.010103f, -0.008109f, -0.005959f, -0.003697f, -0.001368f, 0.000981f, 0.003304f, 0.005551f, 0.007679f, 0.009644f, 0.011407f, - 0.012933f, 0.014192f, 0.015163f, 0.015828f, 0.016178f, 0.016213f, 0.015936f, 0.015362f, 0.014509f, 0.013404f, 0.012076f, 0.010562f, 0.008900f, 0.007133f, 0.005302f, 0.003450f, 0.001619f, -0.000153f, -0.001828f, -0.003374f, -0.004765f, -0.005979f, -0.006999f, -0.007816f, -0.008426f, -0.008831f, -0.009037f, -0.009057f, -0.008907f, -0.008608f, -0.008181f, -0.007650f, -0.007040f, -0.006375f, -0.005679f, -0.004971f, -0.004271f, -0.003593f, -0.002949f, -0.002346f, -0.001788f, -0.001275f, -0.000803f, -0.000365f, 0.000047f, 0.000445f, 0.000840f, 0.001245f, 0.001672f, 0.002130f, 0.002627f, 0.003169f, 0.003757f, 0.004391f, 0.005063f, 0.005765f, 0.006483f, 0.007200f, 0.007896f, 0.008548f, 0.009133f, 0.009624f, 0.009999f, 0.010233f, 0.010305f, 0.010196f, 0.009892f, 0.009383f, 0.008666f, 0.007741f, 0.006616f, 0.005305f, 0.003827f, 0.002207f, 0.000476f, -0.001333f, -0.003180f, -0.005028f, -0.006833f, -0.008555f, -0.010155f, -0.011596f, -0.012844f, -0.013871f, -0.014654f, -0.015176f, -0.015429f, -0.015411f, -0.015126f, -0.014589f, -0.013818f, -0.012839f, -0.011683f, -0.010388f, -0.008990f, -0.007533f, - -0.006057f, -0.004604f, -0.003214f, -0.001923f, -0.000764f, 0.000238f, 0.001059f, 0.001686f, 0.002112f, 0.002334f, 0.002360f, 0.002202f, 0.001877f, 0.001411f, 0.000830f, 0.000166f, -0.000549f, -0.001282f, -0.001998f, -0.002668f, -0.003262f, -0.003756f, -0.004130f, -0.004368f, -0.004463f, -0.004411f, -0.004214f, -0.003882f, -0.003429f, -0.002872f, -0.002235f, -0.001542f, -0.000822f, -0.000102f, 0.000590f, 0.001227f, 0.001786f, 0.002246f, 0.002591f, 0.002809f, 0.002893f, 0.002843f, 0.002662f, 0.002362f, 0.001955f, 0.001462f, 0.000904f, 0.000306f, -0.000296f, -0.003937f, -0.009648f, -0.012419f, -0.011267f, -0.040238f, -0.015703f, 0.011552f, 0.058160f, -0.013046f, -0.072824f, -0.088627f, 0.015958f, 0.160738f, 0.254131f, 0.050171f, -0.053966f, -0.110719f, -0.126033f, -0.010242f, -0.054476f, -0.047715f, 0.060406f, 0.155297f, -0.013718f, -0.062056f, -0.089206f, -0.119108f, -0.035385f, 0.029856f, 0.021391f, 0.127605f, 0.058302f, -0.063474f, -0.126353f, -0.057306f, 0.086294f, 0.115687f, 0.061619f, -0.036661f, -0.157767f, -0.060098f, 0.043304f, 0.112367f, 0.120737f, 0.060150f, -0.071453f, -0.076516f, - -0.063806f, -0.039984f, -0.012824f, -0.010209f, 0.018528f, 0.064632f, 0.023531f, 0.020034f, -0.014198f, -0.015704f, -0.120472f, 0.088570f, 0.026549f, 0.032296f, 0.172561f, 0.040071f, -0.109757f, 0.008742f, 0.101366f, 0.055359f, -0.046352f, -0.103096f, -0.129563f, -0.047553f, 0.024178f, 0.125148f, 0.117219f, -0.036596f, -0.186238f, -0.123714f, 0.045137f, 0.171506f, 0.106041f, 0.002482f, -0.055770f, -0.107032f, -0.059515f, 0.077665f, 0.169167f, 0.091629f, -0.046448f, -0.144953f, -0.091318f, 0.011980f, -0.009144f, 0.117581f, -0.016691f, -0.032711f, -0.218095f, -0.098833f, 0.062401f, 0.088608f, 0.001681f, -0.001069f, 0.093855f, 0.119791f, 0.048200f, -0.050228f, -0.123198f, -0.041732f, 0.097033f, 0.117008f, -0.012802f, -0.172574f, -0.184757f, -0.009102f, 0.120569f, 0.172745f, 0.076288f, -0.177154f, -0.250881f, -0.099183f, 0.107409f, 0.237621f, 0.190393f, 0.046260f, -0.129260f, -0.187136f, -0.116149f, 0.021548f, 0.160583f, 0.126560f, 0.027619f, -0.100470f, -0.179752f, -0.093998f, 0.109599f, 0.153948f, 0.181134f, -0.020372f, -0.217498f, -0.277900f, -0.121373f, 0.074423f, 0.234906f, 0.205704f, - 0.082379f, -0.085297f, -0.116048f, -0.117933f, 0.030242f, 0.117081f, 0.129572f, 0.010412f, -0.112942f, -0.131377f, 0.076372f, 0.144450f, 0.141864f, 0.036980f, -0.060290f, -0.118163f, -0.075497f, -0.007247f, 0.076572f, 0.106067f, 0.084042f, -0.039064f, -0.097812f, -0.118444f, -0.030211f, 0.043478f, 0.118658f, 0.097851f, 0.039008f, -0.070489f, -0.085911f, -0.105045f, 0.013103f, 0.109826f, 0.234591f, 0.026291f, -0.411073f, -0.430086f, -0.115483f, 0.325910f, 0.478239f, 0.221265f, -0.238392f, -0.486933f, -0.281713f, 0.180712f, 0.476652f, 0.295784f, -0.161026f, -0.445223f, -0.244443f, 0.190672f, 0.395177f, 0.136553f, -0.241464f, -0.292475f, 0.052163f, 0.246516f, 0.033780f, -0.137826f, -0.013441f, 0.035850f, 0.009276f, -0.005239f, 0.002221f, -0.001268f, 0.004987f, -0.001142f, 0.006533f, -0.002459f, 0.004739f, -0.003077f, 0.001965f, -0.000451f, 0.003766f, -0.004415f, 0.001868f, -0.003175f, 0.004095f, -0.005067f, 0.005135f, -0.003633f, 0.002886f, -0.003814f, 0.001883f, -0.004380f, 0.003811f, -0.002574f, 0.004489f, -0.004757f, 0.003096f, -0.005553f, 0.002642f, -0.002949f, 0.002289f, -0.003374f} - }, - { - {0.000859f, 0.002546f, 0.004137f, 0.005573f, 0.006798f, 0.007766f, 0.008436f, 0.008779f, 0.008777f, 0.008421f, 0.007715f, 0.006676f, 0.005329f, 0.003711f, 0.001866f, -0.000155f, -0.002292f, -0.004487f, -0.006677f, -0.008800f, -0.010797f, -0.012613f, -0.014199f, -0.015515f, -0.016527f, -0.017213f, -0.017560f, -0.017564f, -0.017234f, -0.016584f, -0.015642f, -0.014439f, -0.013015f, -0.011413f, -0.009678f, -0.007859f, -0.006004f, -0.004156f, -0.002357f, -0.000644f, 0.000952f, 0.002409f, 0.003709f, 0.004844f, 0.005813f, 0.006621f, 0.007281f, 0.007810f, 0.008230f, 0.008566f, 0.008846f, 0.009095f, 0.009341f, 0.009606f, 0.009911f, 0.010269f, 0.010690f, 0.011177f, 0.011727f, 0.012329f, 0.012965f, 0.013615f, 0.014250f, 0.014838f, 0.015346f, 0.015737f, 0.015976f, 0.016028f, 0.015860f, 0.015447f, 0.014766f, 0.013801f, 0.012546f, 0.010999f, 0.009171f, 0.007076f, 0.004742f, 0.002199f, -0.000513f, -0.003349f, -0.006259f, -0.009193f, -0.012095f, -0.014913f, -0.017595f, -0.020094f, -0.022364f, -0.024369f, -0.026078f, -0.027468f, -0.028525f, -0.029243f, -0.029625f, -0.029682f, -0.029434f, -0.028905f, - -0.028130f, -0.027144f, -0.025987f, -0.024703f, -0.023333f, -0.021921f, -0.020506f, -0.019125f, -0.017811f, -0.016591f, -0.015486f, -0.014511f, -0.013675f, -0.012980f, -0.012422f, -0.011993f, -0.011678f, -0.011460f, -0.011317f, -0.011228f, -0.011169f, -0.011117f, -0.011051f, -0.010951f, -0.010802f, -0.010592f, -0.010311f, -0.009957f, -0.009530f, -0.009035f, -0.008482f, -0.007882f, -0.007252f, -0.006607f, -0.005968f, -0.005352f, -0.004777f, -0.004260f, -0.003816f, -0.003455f, -0.003186f, -0.003012f, -0.002933f, -0.002945f, -0.003039f, -0.003203f, -0.003423f, -0.003681f, -0.003957f, -0.004231f, -0.004482f, -0.004693f, -0.004843f, -0.004920f, -0.004909f, -0.004804f, -0.004600f, -0.004297f, -0.003901f, -0.003419f, -0.002867f, -0.002259f, -0.001617f, -0.000961f, -0.000314f, 0.000300f, 0.000859f, 0.001341f, 0.001728f, 0.002005f, 0.002161f, 0.002188f, 0.002085f, 0.001854f, 0.001504f, 0.001048f, 0.000501f, -0.000114f, -0.000775f, -0.001455f, -0.002127f, -0.002765f, -0.003342f, -0.003835f, -0.004222f, -0.004485f, -0.004613f, -0.004596f, -0.004433f, -0.004127f, -0.003686f, -0.003124f, -0.002460f, -0.001716f, -0.000917f, -0.000093f, - 0.000728f, 0.001515f, 0.002241f, 0.002879f, 0.003406f, 0.003801f, 0.004051f, 0.004146f, 0.004082f, 0.003861f, 0.003492f, 0.002988f, 0.002368f, 0.001654f, 0.000873f, 0.000055f, -0.000770f, -0.001572f, -0.002319f, -0.002985f, -0.003543f, -0.003974f, -0.004260f, -0.004391f, -0.004362f, -0.004174f, -0.003834f, -0.003355f, -0.002754f, -0.002054f, -0.001281f, -0.000466f, 0.000363f, 0.001173f, 0.001934f, 0.002618f, 0.003198f, 0.003654f, 0.003967f, 0.004127f, 0.004128f, 0.003969f, 0.003658f, 0.003206f, 0.002631f, 0.001955f, 0.001204f, 0.000406f, 0.017226f, 0.012013f, -0.028321f, -0.030423f, -0.022893f, -0.033501f, -0.060821f, -0.088080f, -0.112243f, 0.154253f, 0.203443f, 0.058316f, -0.012445f, 0.055654f, 0.021804f, -0.008967f, 0.035061f, 0.095283f, -0.000718f, 0.050392f, -0.018996f, -0.055789f, 0.032982f, -0.007091f, 0.094774f, 0.026985f, 0.048263f, -0.071591f, -0.107635f, 0.011283f, 0.017843f, 0.025335f, -0.054642f, -0.015553f, 0.014738f, 0.028520f, 0.050245f, 0.062858f, -0.068352f, -0.030551f, -0.019679f, 0.052072f, 0.057232f, 0.021821f, -0.070286f, -0.113515f, -0.071628f, 0.027134f, - -0.012002f, 0.068095f, 0.094405f, 0.068474f, -0.058745f, -0.073551f, -0.048971f, 0.047774f, 0.095484f, 0.136276f, -0.020782f, -0.008228f, -0.156104f, -0.089359f, 0.090499f, 0.174599f, 0.045334f, 0.164127f, 0.055132f, -0.122527f, -0.092643f, -0.072552f, 0.080633f, 0.116478f, 0.056780f, -0.140743f, -0.260926f, -0.168795f, -0.133615f, -0.060155f, 0.178317f, 0.217051f, -0.005971f, -0.165801f, -0.140198f, -0.114298f, -0.209628f, 0.119419f, 0.231336f, 0.219009f, 0.076439f, -0.087801f, -0.201419f, -0.123932f, 0.079096f, 0.213570f, 0.193245f, 0.071682f, -0.105801f, -0.155119f, 0.036797f, 0.147391f, 0.158791f, 0.027849f, -0.132063f, -0.217392f, -0.063462f, 0.120396f, 0.255590f, 0.137794f, -0.053665f, -0.330210f, -0.344688f, -0.158570f, 0.200625f, 0.367654f, 0.189377f, -0.125986f, -0.191932f, -0.177880f, -0.044655f, 0.177784f, 0.243707f, 0.166341f, -0.059203f, -0.181411f, -0.141760f, -0.105250f, 0.101497f, 0.204489f, 0.162081f, 0.018700f, -0.128499f, -0.199396f, -0.101125f, 0.091973f, 0.230468f, 0.135103f, -0.041913f, -0.203133f, -0.185174f, -0.090538f, 0.079898f, 0.180571f, 0.130038f, -0.027597f, - -0.089495f, -0.090417f, -0.024452f, -0.007223f, 0.068041f, 0.110296f, 0.065420f, -0.023719f, -0.095513f, -0.089005f, 0.002369f, 0.124344f, 0.110889f, 0.042596f, -0.026849f, -0.096845f, -0.081131f, -0.002341f, 0.095227f, 0.102042f, 0.044684f, -0.010971f, -0.063710f, -0.034114f, -0.001677f, 0.030173f, 0.013740f, -0.000268f, -0.021227f, -0.043999f, -0.001913f, 0.026924f, 0.041319f, -0.015041f, -0.054437f, -0.130356f, 0.047521f, 0.167756f, 0.184390f, 0.033196f, -0.121109f, -0.184845f, -0.054031f, 0.118381f, 0.199260f, 0.079203f, -0.103129f, -0.191235f, -0.059463f, 0.122197f, 0.182977f, 0.024420f, -0.135288f, -0.134242f, 0.050368f, 0.146347f, 0.040904f, -0.109526f, -0.032549f, 0.056726f, 0.019439f, -0.025118f, 0.005572f, 0.001777f, 0.007640f, 0.000271f, 0.005556f, -0.003630f, 0.004957f, -0.004408f, 0.004800f, -0.003228f, 0.002972f, -0.004344f, 0.003459f, -0.002986f, 0.006276f, -0.004350f, 0.002435f, -0.004030f, 0.004971f, -0.003604f, 0.005546f, -0.007147f, 0.005138f, -0.005555f, 0.006601f, -0.002204f, 0.005298f, -0.004820f, 0.003456f, -0.001146f, 0.004085f, -0.002134f, 0.001776f, -0.006348f}, - {-0.000859f, -0.002546f, -0.004137f, -0.005573f, -0.006798f, -0.007766f, -0.008436f, -0.008779f, -0.008777f, -0.008421f, -0.007715f, -0.006676f, -0.005329f, -0.003711f, -0.001866f, 0.000155f, 0.002292f, 0.004487f, 0.006677f, 0.008800f, 0.010797f, 0.012613f, 0.014199f, 0.015515f, 0.016527f, 0.017213f, 0.017560f, 0.017564f, 0.017234f, 0.016584f, 0.015642f, 0.014439f, 0.013015f, 0.011413f, 0.009678f, 0.007859f, 0.006004f, 0.004156f, 0.002357f, 0.000644f, -0.000952f, -0.002409f, -0.003709f, -0.004844f, -0.005813f, -0.006621f, -0.007281f, -0.007810f, -0.008230f, -0.008566f, -0.008846f, -0.009095f, -0.009341f, -0.009606f, -0.009911f, -0.010269f, -0.010690f, -0.011177f, -0.011727f, -0.012329f, -0.012965f, -0.013615f, -0.014250f, -0.014838f, -0.015346f, -0.015737f, -0.015976f, -0.016028f, -0.015860f, -0.015447f, -0.014766f, -0.013801f, -0.012546f, -0.010999f, -0.009171f, -0.007076f, -0.004742f, -0.002199f, 0.000513f, 0.003349f, 0.006259f, 0.009193f, 0.012095f, 0.014913f, 0.017595f, 0.020094f, 0.022364f, 0.024369f, 0.026078f, 0.027468f, 0.028525f, 0.029243f, 0.029625f, 0.029682f, 0.029434f, 0.028905f, - 0.028130f, 0.027144f, 0.025987f, 0.024703f, 0.023333f, 0.021921f, 0.020506f, 0.019125f, 0.017811f, 0.016591f, 0.015486f, 0.014511f, 0.013675f, 0.012980f, 0.012422f, 0.011993f, 0.011678f, 0.011460f, 0.011317f, 0.011228f, 0.011169f, 0.011117f, 0.011051f, 0.010951f, 0.010802f, 0.010592f, 0.010311f, 0.009957f, 0.009530f, 0.009035f, 0.008482f, 0.007882f, 0.007252f, 0.006607f, 0.005968f, 0.005352f, 0.004777f, 0.004260f, 0.003816f, 0.003455f, 0.003186f, 0.003012f, 0.002933f, 0.002945f, 0.003039f, 0.003203f, 0.003423f, 0.003681f, 0.003957f, 0.004231f, 0.004482f, 0.004693f, 0.004843f, 0.004920f, 0.004909f, 0.004804f, 0.004600f, 0.004297f, 0.003901f, 0.003419f, 0.002867f, 0.002259f, 0.001617f, 0.000961f, 0.000314f, -0.000300f, -0.000859f, -0.001341f, -0.001728f, -0.002005f, -0.002161f, -0.002188f, -0.002085f, -0.001854f, -0.001504f, -0.001048f, -0.000501f, 0.000114f, 0.000775f, 0.001455f, 0.002127f, 0.002765f, 0.003342f, 0.003835f, 0.004222f, 0.004485f, 0.004613f, 0.004596f, 0.004433f, 0.004127f, 0.003686f, 0.003124f, 0.002460f, 0.001716f, 0.000917f, 0.000093f, - -0.000728f, -0.001515f, -0.002241f, -0.002879f, -0.003406f, -0.003801f, -0.004051f, -0.004146f, -0.004082f, -0.003861f, -0.003492f, -0.002988f, -0.002368f, -0.001654f, -0.000873f, -0.000055f, 0.000770f, 0.001572f, 0.002319f, 0.002985f, 0.003543f, 0.003974f, 0.004260f, 0.004391f, 0.004362f, 0.004174f, 0.003834f, 0.003355f, 0.002754f, 0.002054f, 0.001281f, 0.000466f, -0.000363f, -0.001173f, -0.001934f, -0.002618f, -0.003198f, -0.003654f, -0.003967f, -0.004127f, -0.004128f, -0.003969f, -0.003658f, -0.003206f, -0.002631f, -0.001955f, -0.001204f, -0.000406f, -0.017226f, -0.012013f, 0.028321f, 0.030423f, 0.022893f, 0.033501f, 0.060821f, 0.088080f, 0.112243f, -0.154253f, -0.203443f, -0.058316f, 0.012445f, -0.055654f, -0.021804f, 0.008967f, -0.035061f, -0.095283f, 0.000718f, -0.050392f, 0.018996f, 0.055789f, -0.032982f, 0.007091f, -0.094774f, -0.026985f, -0.048263f, 0.071591f, 0.107635f, -0.011283f, -0.017843f, -0.025335f, 0.054642f, 0.015553f, -0.014738f, -0.028520f, -0.050245f, -0.062858f, 0.068352f, 0.030551f, 0.019679f, -0.052072f, -0.057232f, -0.021821f, 0.070286f, 0.113515f, 0.071628f, -0.027134f, - 0.012002f, -0.068095f, -0.094405f, -0.068474f, 0.058745f, 0.073551f, 0.048971f, -0.047774f, -0.095484f, -0.136276f, 0.020782f, 0.008228f, 0.156104f, 0.089359f, -0.090499f, -0.174599f, -0.045334f, -0.164127f, -0.055132f, 0.122527f, 0.092643f, 0.072552f, -0.080633f, -0.116478f, -0.056780f, 0.140743f, 0.260926f, 0.168795f, 0.133615f, 0.060155f, -0.178317f, -0.217051f, 0.005971f, 0.165801f, 0.140198f, 0.114298f, 0.209628f, -0.119419f, -0.231336f, -0.219009f, -0.076439f, 0.087801f, 0.201419f, 0.123932f, -0.079096f, -0.213570f, -0.193245f, -0.071682f, 0.105801f, 0.155119f, -0.036797f, -0.147391f, -0.158791f, -0.027849f, 0.132063f, 0.217392f, 0.063462f, -0.120396f, -0.255590f, -0.137794f, 0.053665f, 0.330210f, 0.344688f, 0.158570f, -0.200625f, -0.367654f, -0.189377f, 0.125986f, 0.191932f, 0.177880f, 0.044655f, -0.177784f, -0.243707f, -0.166341f, 0.059203f, 0.181411f, 0.141760f, 0.105250f, -0.101497f, -0.204489f, -0.162081f, -0.018700f, 0.128499f, 0.199396f, 0.101125f, -0.091973f, -0.230468f, -0.135103f, 0.041913f, 0.203133f, 0.185174f, 0.090538f, -0.079898f, -0.180571f, -0.130038f, 0.027597f, - 0.089495f, 0.090417f, 0.024452f, 0.007223f, -0.068041f, -0.110296f, -0.065420f, 0.023719f, 0.095513f, 0.089005f, -0.002369f, -0.124344f, -0.110889f, -0.042596f, 0.026849f, 0.096845f, 0.081131f, 0.002341f, -0.095227f, -0.102042f, -0.044684f, 0.010971f, 0.063710f, 0.034114f, 0.001677f, -0.030173f, -0.013740f, 0.000268f, 0.021227f, 0.043999f, 0.001913f, -0.026924f, -0.041319f, 0.015041f, 0.054437f, 0.130356f, -0.047521f, -0.167756f, -0.184390f, -0.033196f, 0.121109f, 0.184845f, 0.054031f, -0.118381f, -0.199260f, -0.079203f, 0.103129f, 0.191235f, 0.059463f, -0.122197f, -0.182977f, -0.024420f, 0.135288f, 0.134242f, -0.050368f, -0.146347f, -0.040904f, 0.109526f, 0.032549f, -0.056726f, -0.019439f, 0.025118f, -0.005572f, -0.001777f, -0.007640f, -0.000271f, -0.005556f, 0.003630f, -0.004957f, 0.004408f, -0.004800f, 0.003228f, -0.002972f, 0.004344f, -0.003459f, 0.002986f, -0.006276f, 0.004350f, -0.002435f, 0.004030f, -0.004971f, 0.003604f, -0.005546f, 0.007147f, -0.005138f, 0.005555f, -0.006601f, 0.002204f, -0.005298f, 0.004820f, -0.003456f, 0.001146f, -0.004085f, 0.002134f, -0.001776f, 0.006348f} - }, - { - {0.002823f, 0.008389f, 0.013718f, 0.018663f, 0.023087f, 0.026869f, 0.029913f, 0.032143f, 0.033511f, 0.033996f, 0.033606f, 0.032375f, 0.030364f, 0.027658f, 0.024363f, 0.020601f, 0.016506f, 0.012223f, 0.007896f, 0.003669f, -0.000321f, -0.003949f, -0.007105f, -0.009700f, -0.011666f, -0.012957f, -0.013555f, -0.013467f, -0.012723f, -0.011378f, -0.009508f, -0.007205f, -0.004577f, -0.001742f, 0.001176f, 0.004055f, 0.006772f, 0.009215f, 0.011282f, 0.012888f, 0.013963f, 0.014463f, 0.014361f, 0.013656f, 0.012367f, 0.010538f, 0.008230f, 0.005521f, 0.002507f, -0.000709f, -0.004016f, -0.007300f, -0.010448f, -0.013354f, -0.015920f, -0.018061f, -0.019709f, -0.020812f, -0.021339f, -0.021280f, -0.020645f, -0.019465f, -0.017788f, -0.015681f, -0.013224f, -0.010508f, -0.007634f, -0.004703f, -0.001820f, 0.000915f, 0.003409f, 0.005581f, 0.007360f, 0.008693f, 0.009542f, 0.009890f, 0.009735f, 0.009098f, 0.008012f, 0.006530f, 0.004715f, 0.002644f, 0.000400f, -0.001930f, -0.004255f, -0.006490f, -0.008552f, -0.010368f, -0.011876f, -0.013026f, -0.013783f, -0.014130f, -0.014062f, -0.013593f, -0.012752f, -0.011581f, - -0.010133f, -0.008474f, -0.006673f, -0.004805f, -0.002947f, -0.001172f, 0.000449f, 0.001855f, 0.002993f, 0.003823f, 0.004317f, 0.004461f, 0.004257f, 0.003718f, 0.002874f, 0.001765f, 0.000442f, -0.001035f, -0.002601f, -0.004187f, -0.005723f, -0.007142f, -0.008382f, -0.009387f, -0.010111f, -0.010518f, -0.010586f, -0.010304f, -0.009677f, -0.008721f, -0.007466f, -0.005953f, -0.004231f, -0.002360f, -0.000403f, 0.001572f, 0.003499f, 0.005312f, 0.006948f, 0.008354f, 0.009484f, 0.010301f, 0.010781f, 0.010912f, 0.010694f, 0.010139f, 0.009271f, 0.008126f, 0.006747f, 0.005185f, 0.003497f, 0.001744f, -0.000014f, -0.001718f, -0.003312f, -0.004745f, -0.005974f, -0.006966f, -0.007695f, -0.008148f, -0.008322f, -0.008224f, -0.007872f, -0.007293f, -0.006522f, -0.005599f, -0.004569f, -0.003480f, -0.002381f, -0.001318f, -0.000335f, 0.000531f, 0.001246f, 0.001787f, 0.002138f, 0.002292f, 0.002251f, 0.002026f, 0.001637f, 0.001110f, 0.000477f, -0.000225f, -0.000958f, -0.001679f, -0.002351f, -0.002936f, -0.003401f, -0.003718f, -0.003867f, -0.003834f, -0.003615f, -0.003212f, -0.002637f, -0.001909f, -0.001054f, -0.000104f, - 0.000904f, 0.001932f, 0.002939f, 0.003884f, 0.004730f, 0.005443f, 0.005992f, 0.006355f, 0.006517f, 0.006469f, 0.006213f, 0.005757f, 0.005118f, 0.004320f, 0.003395f, 0.002378f, 0.001308f, 0.000226f, -0.000824f, -0.001802f, -0.002672f, -0.003398f, -0.003953f, -0.004317f, -0.004477f, -0.004427f, -0.004171f, -0.003721f, -0.003096f, -0.002324f, -0.001436f, -0.000471f, 0.000533f, 0.001532f, 0.002486f, 0.003354f, 0.004101f, 0.004694f, 0.005110f, 0.005330f, 0.005344f, 0.005150f, 0.004755f, 0.004175f, 0.003431f, 0.002551f, 0.001572f, 0.000531f, -0.025688f, 0.026915f, -0.008551f, -0.003691f, -0.022601f, -0.000660f, -0.156528f, -0.111393f, 0.028493f, 0.108824f, 0.104758f, 0.065063f, 0.026530f, 0.213562f, 0.082655f, -0.061031f, -0.117392f, -0.066242f, 0.072011f, 0.041473f, -0.014914f, -0.097632f, -0.041251f, -0.081319f, 0.004432f, 0.010078f, 0.037392f, 0.044746f, 0.051890f, -0.005366f, -0.064750f, -0.128326f, -0.085975f, 0.083484f, 0.137437f, 0.073582f, 0.001098f, -0.053269f, -0.120250f, 0.054962f, 0.016628f, -0.181935f, -0.023235f, -0.049819f, 0.135352f, 0.140517f, 0.115850f, -0.150025f, - -0.246660f, -0.254713f, 0.010057f, 0.217888f, 0.425324f, 0.170587f, -0.000894f, -0.366132f, -0.390544f, -0.248375f, 0.184205f, 0.154963f, 0.288394f, 0.122914f, -0.153765f, -0.193585f, -0.006970f, -0.150889f, -0.112666f, -0.021523f, -0.064199f, -0.061539f, -0.070544f, 0.060940f, 0.154890f, 0.167767f, 0.034782f, -0.101531f, -0.250810f, -0.230540f, 0.019017f, 0.347077f, 0.277001f, 0.085076f, -0.242863f, -0.095458f, -0.042193f, 0.130637f, 0.092155f, -0.057397f, -0.199128f, -0.145930f, 0.044730f, 0.234143f, 0.243780f, 0.023978f, -0.278476f, -0.308623f, -0.219451f, 0.162768f, 0.334214f, 0.210667f, -0.033177f, -0.258524f, -0.246503f, -0.028790f, 0.263949f, 0.345040f, 0.216509f, -0.075180f, -0.255710f, -0.257503f, -0.115401f, 0.083209f, 0.221638f, 0.156401f, -0.024868f, -0.200868f, -0.087228f, 0.018970f, 0.088801f, 0.115951f, 0.072505f, -0.017732f, -0.009354f, -0.023435f, -0.018067f, 0.014657f, 0.031956f, 0.057493f, 0.079698f, 0.112267f, 0.000138f, -0.113165f, -0.157296f, -0.056569f, 0.107155f, 0.278913f, 0.245623f, 0.007285f, -0.245854f, -0.298588f, -0.180016f, 0.096249f, 0.281524f, 0.268503f, - 0.076388f, -0.160191f, -0.288207f, -0.124868f, 0.152759f, 0.261110f, 0.166910f, -0.006599f, -0.177852f, -0.162466f, -0.039010f, 0.089040f, 0.132594f, 0.118348f, 0.001736f, -0.111109f, -0.102237f, -0.018782f, 0.077950f, 0.136106f, 0.067304f, -0.033510f, -0.146148f, -0.119064f, -0.014996f, 0.123470f, 0.149227f, 0.065867f, -0.056608f, -0.146168f, -0.095006f, -0.020288f, 0.077417f, 0.084737f, 0.060939f, -0.093503f, -0.197415f, -0.057628f, 0.116799f, 0.213634f, 0.084091f, -0.102030f, -0.200069f, -0.070761f, 0.108761f, 0.181640f, 0.047338f, -0.102865f, -0.140615f, -0.008568f, 0.099425f, 0.097485f, -0.022045f, -0.079000f, -0.045199f, 0.048425f, 0.054467f, -0.007508f, -0.041201f, 0.012327f, 0.007542f, 0.002916f, -0.005532f, 0.005379f, -0.002943f, 0.005489f, -0.002093f, 0.006741f, -0.002504f, 0.004367f, -0.005957f, 0.003284f, -0.003766f, 0.004741f, -0.004155f, 0.006042f, -0.003084f, 0.006195f, -0.001465f, 0.004644f, -0.006098f, 0.005356f, -0.003579f, 0.005223f, -0.004932f, 0.004642f, -0.004095f, 0.004139f, -0.004242f, 0.005984f, -0.005431f, 0.003672f, -0.004344f, 0.005198f, -0.003723f, 0.004351f}, - {-0.002823f, -0.008389f, -0.013718f, -0.018663f, -0.023087f, -0.026869f, -0.029913f, -0.032143f, -0.033511f, -0.033996f, -0.033606f, -0.032375f, -0.030364f, -0.027658f, -0.024363f, -0.020601f, -0.016506f, -0.012223f, -0.007896f, -0.003669f, 0.000321f, 0.003949f, 0.007105f, 0.009700f, 0.011666f, 0.012957f, 0.013555f, 0.013467f, 0.012723f, 0.011378f, 0.009508f, 0.007205f, 0.004577f, 0.001742f, -0.001176f, -0.004055f, -0.006772f, -0.009215f, -0.011282f, -0.012888f, -0.013963f, -0.014463f, -0.014361f, -0.013656f, -0.012367f, -0.010538f, -0.008230f, -0.005521f, -0.002507f, 0.000709f, 0.004016f, 0.007300f, 0.010448f, 0.013354f, 0.015920f, 0.018061f, 0.019709f, 0.020812f, 0.021339f, 0.021280f, 0.020645f, 0.019465f, 0.017788f, 0.015681f, 0.013224f, 0.010508f, 0.007634f, 0.004703f, 0.001820f, -0.000915f, -0.003409f, -0.005581f, -0.007360f, -0.008693f, -0.009542f, -0.009890f, -0.009735f, -0.009098f, -0.008012f, -0.006530f, -0.004715f, -0.002644f, -0.000400f, 0.001930f, 0.004255f, 0.006490f, 0.008552f, 0.010368f, 0.011876f, 0.013026f, 0.013783f, 0.014130f, 0.014062f, 0.013593f, 0.012752f, 0.011581f, - 0.010133f, 0.008474f, 0.006673f, 0.004805f, 0.002947f, 0.001172f, -0.000449f, -0.001855f, -0.002993f, -0.003823f, -0.004317f, -0.004461f, -0.004257f, -0.003718f, -0.002874f, -0.001765f, -0.000442f, 0.001035f, 0.002601f, 0.004187f, 0.005723f, 0.007142f, 0.008382f, 0.009387f, 0.010111f, 0.010518f, 0.010586f, 0.010304f, 0.009677f, 0.008721f, 0.007466f, 0.005953f, 0.004231f, 0.002360f, 0.000403f, -0.001572f, -0.003499f, -0.005312f, -0.006948f, -0.008354f, -0.009484f, -0.010301f, -0.010781f, -0.010912f, -0.010694f, -0.010139f, -0.009271f, -0.008126f, -0.006747f, -0.005185f, -0.003497f, -0.001744f, 0.000014f, 0.001718f, 0.003312f, 0.004745f, 0.005974f, 0.006966f, 0.007695f, 0.008148f, 0.008322f, 0.008224f, 0.007872f, 0.007293f, 0.006522f, 0.005599f, 0.004569f, 0.003480f, 0.002381f, 0.001318f, 0.000335f, -0.000531f, -0.001246f, -0.001787f, -0.002138f, -0.002292f, -0.002251f, -0.002026f, -0.001637f, -0.001110f, -0.000477f, 0.000225f, 0.000958f, 0.001679f, 0.002351f, 0.002936f, 0.003401f, 0.003718f, 0.003867f, 0.003834f, 0.003615f, 0.003212f, 0.002637f, 0.001909f, 0.001054f, 0.000104f, - -0.000904f, -0.001932f, -0.002939f, -0.003884f, -0.004730f, -0.005443f, -0.005992f, -0.006355f, -0.006517f, -0.006469f, -0.006213f, -0.005757f, -0.005118f, -0.004320f, -0.003395f, -0.002378f, -0.001308f, -0.000226f, 0.000824f, 0.001802f, 0.002672f, 0.003398f, 0.003953f, 0.004317f, 0.004477f, 0.004427f, 0.004171f, 0.003721f, 0.003096f, 0.002324f, 0.001436f, 0.000471f, -0.000533f, -0.001532f, -0.002486f, -0.003354f, -0.004101f, -0.004694f, -0.005110f, -0.005330f, -0.005344f, -0.005150f, -0.004755f, -0.004175f, -0.003431f, -0.002551f, -0.001572f, -0.000531f, 0.025688f, -0.026915f, 0.008551f, 0.003691f, 0.022601f, 0.000660f, 0.156528f, 0.111393f, -0.028493f, -0.108824f, -0.104758f, -0.065063f, -0.026530f, -0.213562f, -0.082655f, 0.061031f, 0.117392f, 0.066242f, -0.072011f, -0.041473f, 0.014914f, 0.097632f, 0.041251f, 0.081319f, -0.004432f, -0.010078f, -0.037392f, -0.044746f, -0.051890f, 0.005366f, 0.064750f, 0.128326f, 0.085975f, -0.083484f, -0.137437f, -0.073582f, -0.001098f, 0.053269f, 0.120250f, -0.054962f, -0.016628f, 0.181935f, 0.023235f, 0.049819f, -0.135352f, -0.140517f, -0.115850f, 0.150025f, - 0.246660f, 0.254713f, -0.010057f, -0.217888f, -0.425324f, -0.170587f, 0.000894f, 0.366132f, 0.390544f, 0.248375f, -0.184205f, -0.154963f, -0.288394f, -0.122914f, 0.153765f, 0.193585f, 0.006970f, 0.150889f, 0.112666f, 0.021523f, 0.064199f, 0.061539f, 0.070544f, -0.060940f, -0.154890f, -0.167767f, -0.034782f, 0.101531f, 0.250810f, 0.230540f, -0.019017f, -0.347077f, -0.277001f, -0.085076f, 0.242863f, 0.095458f, 0.042193f, -0.130637f, -0.092155f, 0.057397f, 0.199128f, 0.145930f, -0.044730f, -0.234143f, -0.243780f, -0.023978f, 0.278476f, 0.308623f, 0.219451f, -0.162768f, -0.334214f, -0.210667f, 0.033177f, 0.258524f, 0.246503f, 0.028790f, -0.263949f, -0.345040f, -0.216509f, 0.075180f, 0.255710f, 0.257503f, 0.115401f, -0.083209f, -0.221638f, -0.156401f, 0.024868f, 0.200868f, 0.087228f, -0.018970f, -0.088801f, -0.115951f, -0.072505f, 0.017732f, 0.009354f, 0.023435f, 0.018067f, -0.014657f, -0.031956f, -0.057493f, -0.079698f, -0.112267f, -0.000138f, 0.113165f, 0.157296f, 0.056569f, -0.107155f, -0.278913f, -0.245623f, -0.007285f, 0.245854f, 0.298588f, 0.180016f, -0.096249f, -0.281524f, -0.268503f, - -0.076388f, 0.160191f, 0.288207f, 0.124868f, -0.152759f, -0.261110f, -0.166910f, 0.006599f, 0.177852f, 0.162466f, 0.039010f, -0.089040f, -0.132594f, -0.118348f, -0.001736f, 0.111109f, 0.102237f, 0.018782f, -0.077950f, -0.136106f, -0.067304f, 0.033510f, 0.146148f, 0.119064f, 0.014996f, -0.123470f, -0.149227f, -0.065867f, 0.056608f, 0.146168f, 0.095006f, 0.020288f, -0.077417f, -0.084737f, -0.060939f, 0.093503f, 0.197415f, 0.057628f, -0.116799f, -0.213634f, -0.084091f, 0.102030f, 0.200069f, 0.070761f, -0.108761f, -0.181640f, -0.047338f, 0.102865f, 0.140615f, 0.008568f, -0.099425f, -0.097485f, 0.022045f, 0.079000f, 0.045199f, -0.048425f, -0.054467f, 0.007508f, 0.041201f, -0.012327f, -0.007542f, -0.002916f, 0.005532f, -0.005379f, 0.002943f, -0.005489f, 0.002093f, -0.006741f, 0.002504f, -0.004367f, 0.005957f, -0.003284f, 0.003766f, -0.004741f, 0.004155f, -0.006042f, 0.003084f, -0.006195f, 0.001465f, -0.004644f, 0.006098f, -0.005356f, 0.003579f, -0.005223f, 0.004932f, -0.004642f, 0.004095f, -0.004139f, 0.004242f, -0.005984f, 0.005431f, -0.003672f, 0.004344f, -0.005198f, 0.003723f, -0.004351f} - }, - { - {0.001322f, 0.003935f, 0.006454f, 0.008823f, 0.010990f, 0.012913f, 0.014559f, 0.015910f, 0.016958f, 0.017708f, 0.018180f, 0.018402f, 0.018417f, 0.018273f, 0.018026f, 0.017734f, 0.017457f, 0.017253f, 0.017173f, 0.017263f, 0.017556f, 0.018075f, 0.018827f, 0.019806f, 0.020989f, 0.022340f, 0.023806f, 0.025324f, 0.026820f, 0.028211f, 0.029412f, 0.030333f, 0.030889f, 0.031000f, 0.030596f, 0.029620f, 0.028029f, 0.025801f, 0.022932f, 0.019439f, 0.015364f, 0.010767f, 0.005729f, 0.000352f, -0.005250f, -0.010946f, -0.016601f, -0.022070f, -0.027213f, -0.031890f, -0.035972f, -0.039343f, -0.041903f, -0.043576f, -0.044305f, -0.044062f, -0.042844f, -0.040677f, -0.037614f, -0.033732f, -0.029132f, -0.023937f, -0.018286f, -0.012331f, -0.006230f, -0.000148f, 0.005754f, 0.011323f, 0.016416f, 0.020904f, 0.024682f, 0.027663f, 0.029787f, 0.031022f, 0.031361f, 0.030824f, 0.029458f, 0.027331f, 0.024536f, 0.021179f, 0.017383f, 0.013279f, 0.009000f, 0.004684f, 0.000460f, -0.003551f, -0.007238f, -0.010511f, -0.013294f, -0.015534f, -0.017202f, -0.018289f, -0.018808f, -0.018794f, -0.018299f, -0.017394f, - -0.016159f, -0.014687f, -0.013074f, -0.011419f, -0.009818f, -0.008360f, -0.007125f, -0.006182f, -0.005580f, -0.005356f, -0.005525f, -0.006084f, -0.007015f, -0.008277f, -0.009817f, -0.011568f, -0.013452f, -0.015384f, -0.017274f, -0.019033f, -0.020574f, -0.021819f, -0.022695f, -0.023147f, -0.023132f, -0.022623f, -0.021611f, -0.020105f, -0.018133f, -0.015736f, -0.012973f, -0.009914f, -0.006640f, -0.003239f, 0.000198f, 0.003579f, 0.006813f, 0.009818f, 0.012520f, 0.014855f, 0.016775f, 0.018244f, 0.019247f, 0.019780f, 0.019859f, 0.019513f, 0.018788f, 0.017739f, 0.016430f, 0.014934f, 0.013327f, 0.011684f, 0.010080f, 0.008584f, 0.007256f, 0.006146f, 0.005294f, 0.004724f, 0.004447f, 0.004460f, 0.004745f, 0.005272f, 0.005999f, 0.006873f, 0.007837f, 0.008825f, 0.009773f, 0.010616f, 0.011293f, 0.011749f, 0.011938f, 0.011825f, 0.011387f, 0.010615f, 0.009512f, 0.008099f, 0.006405f, 0.004475f, 0.002364f, 0.000133f, -0.002148f, -0.004406f, -0.006569f, -0.008566f, -0.010332f, -0.011806f, -0.012942f, -0.013701f, -0.014060f, -0.014009f, -0.013554f, -0.012712f, -0.011516f, -0.010013f, -0.008257f, -0.006312f, - -0.004251f, -0.002146f, -0.000073f, 0.001895f, 0.003690f, 0.005252f, 0.006529f, 0.007482f, 0.008083f, 0.008319f, 0.008192f, 0.007716f, 0.006918f, 0.005840f, 0.004531f, 0.003050f, 0.001461f, -0.000167f, -0.001766f, -0.003271f, -0.004619f, -0.005755f, -0.006635f, -0.007225f, -0.007501f, -0.007454f, -0.007090f, -0.006424f, -0.005486f, -0.004316f, -0.002964f, -0.001486f, 0.000056f, 0.001598f, 0.003076f, 0.004430f, 0.005603f, 0.006548f, 0.007227f, 0.007610f, 0.007683f, 0.007443f, 0.006899f, 0.006074f, 0.005002f, 0.003726f, 0.002298f, 0.000777f, -0.030696f, 0.010079f, -0.038675f, 0.012582f, -0.040801f, 0.045322f, 0.035278f, -0.097745f, -0.078951f, 0.014559f, -0.086888f, -0.091152f, 0.053565f, -0.108519f, -0.285451f, -0.115492f, 0.174039f, 0.213796f, 0.243672f, -0.145965f, 0.017388f, 0.185458f, 0.179834f, -0.035021f, -0.162928f, -0.117639f, -0.077068f, 0.058654f, 0.229831f, 0.175223f, 0.046760f, -0.150464f, -0.165831f, -0.118794f, 0.039510f, 0.116700f, 0.173975f, 0.016928f, -0.057488f, -0.115028f, -0.092878f, 0.005873f, 0.141806f, 0.125902f, 0.030814f, -0.131927f, -0.150309f, -0.081015f, - -0.030206f, 0.022789f, 0.121464f, 0.113373f, 0.153768f, 0.011404f, -0.081105f, -0.307289f, -0.230855f, -0.079987f, 0.219398f, 0.020953f, 0.139568f, 0.076876f, -0.106696f, -0.202691f, -0.072874f, -0.212543f, -0.238707f, 0.008286f, 0.086439f, 0.133956f, -0.003077f, -0.030179f, -0.044500f, 0.169272f, 0.012399f, 0.043748f, -0.335844f, -0.427871f, 0.029599f, 0.301234f, 0.250250f, 0.067467f, -0.179678f, -0.363815f, -0.593776f, -0.157676f, 0.327665f, 0.584992f, 0.348499f, -0.048251f, -0.391810f, -0.372665f, -0.160141f, 0.241420f, 0.352707f, 0.236621f, -0.001022f, -0.134055f, -0.053121f, 0.141937f, 0.146798f, -0.055752f, -0.132145f, -0.096131f, 0.042013f, 0.164349f, 0.158217f, 0.000641f, -0.119515f, -0.161831f, -0.052040f, 0.024591f, 0.117203f, 0.055545f, -0.216649f, -0.214301f, -0.030497f, 0.038761f, 0.075765f, 0.040536f, -0.036389f, -0.103000f, -0.034191f, 0.044298f, 0.034372f, 0.036930f, 0.015048f, 0.003259f, -0.027983f, 0.049992f, 0.082727f, 0.012939f, -0.043868f, -0.091831f, -0.011452f, 0.085173f, 0.104380f, 0.071771f, 0.001449f, -0.092150f, -0.112132f, 0.005303f, 0.141831f, 0.155707f, - 0.010751f, -0.163970f, -0.245046f, -0.148464f, 0.078076f, 0.270186f, 0.300173f, 0.099280f, -0.205232f, -0.380479f, -0.317213f, 0.056430f, 0.345089f, 0.427063f, 0.189260f, -0.159506f, -0.416259f, -0.340820f, -0.060319f, 0.260954f, 0.388964f, 0.267633f, -0.113508f, -0.379353f, -0.350004f, -0.086303f, 0.208950f, 0.285451f, 0.142200f, -0.078494f, -0.215562f, -0.149965f, 0.034041f, 0.192228f, 0.234471f, 0.017520f, -0.298944f, -0.295611f, -0.045851f, 0.268164f, 0.308789f, 0.082452f, -0.227730f, -0.294581f, -0.082215f, 0.211627f, 0.266252f, 0.067987f, -0.185676f, -0.223757f, -0.027744f, 0.188095f, 0.173846f, -0.024262f, -0.178182f, -0.080763f, 0.112276f, 0.111610f, -0.054879f, -0.058273f, 0.025991f, 0.023344f, -0.007588f, 0.000557f, -0.001454f, 0.002463f, 0.000901f, 0.003014f, -0.002952f, 0.000982f, 0.000588f, 0.004419f, -0.000529f, -0.000775f, -0.001110f, 0.001083f, 0.000192f, 0.003196f, -0.001687f, -0.001023f, -0.001387f, 0.003966f, -0.002321f, 0.005528f, -0.002013f, -0.000908f, -0.004451f, 0.001728f, 0.001047f, 0.002773f, -0.001200f, 0.002569f, -0.001884f, 0.003416f, -0.005666f, 0.000214f}, - {0.001322f, 0.003935f, 0.006454f, 0.008823f, 0.010990f, 0.012913f, 0.014559f, 0.015910f, 0.016958f, 0.017708f, 0.018180f, 0.018402f, 0.018417f, 0.018273f, 0.018026f, 0.017734f, 0.017457f, 0.017253f, 0.017173f, 0.017263f, 0.017556f, 0.018075f, 0.018827f, 0.019806f, 0.020989f, 0.022340f, 0.023806f, 0.025324f, 0.026820f, 0.028211f, 0.029412f, 0.030333f, 0.030889f, 0.031000f, 0.030596f, 0.029620f, 0.028029f, 0.025801f, 0.022932f, 0.019439f, 0.015364f, 0.010767f, 0.005729f, 0.000352f, -0.005250f, -0.010946f, -0.016601f, -0.022070f, -0.027213f, -0.031890f, -0.035972f, -0.039343f, -0.041903f, -0.043576f, -0.044305f, -0.044062f, -0.042844f, -0.040677f, -0.037614f, -0.033732f, -0.029132f, -0.023937f, -0.018286f, -0.012331f, -0.006230f, -0.000148f, 0.005754f, 0.011323f, 0.016416f, 0.020904f, 0.024682f, 0.027663f, 0.029787f, 0.031022f, 0.031361f, 0.030824f, 0.029458f, 0.027331f, 0.024536f, 0.021179f, 0.017383f, 0.013279f, 0.009000f, 0.004684f, 0.000460f, -0.003551f, -0.007238f, -0.010511f, -0.013294f, -0.015534f, -0.017202f, -0.018289f, -0.018808f, -0.018794f, -0.018299f, -0.017394f, - -0.016159f, -0.014687f, -0.013074f, -0.011419f, -0.009818f, -0.008360f, -0.007125f, -0.006182f, -0.005580f, -0.005356f, -0.005525f, -0.006084f, -0.007015f, -0.008277f, -0.009817f, -0.011568f, -0.013452f, -0.015384f, -0.017274f, -0.019033f, -0.020574f, -0.021819f, -0.022695f, -0.023147f, -0.023132f, -0.022623f, -0.021611f, -0.020105f, -0.018133f, -0.015736f, -0.012973f, -0.009914f, -0.006640f, -0.003239f, 0.000198f, 0.003579f, 0.006813f, 0.009818f, 0.012520f, 0.014855f, 0.016775f, 0.018244f, 0.019247f, 0.019780f, 0.019859f, 0.019513f, 0.018788f, 0.017739f, 0.016430f, 0.014934f, 0.013327f, 0.011684f, 0.010080f, 0.008584f, 0.007256f, 0.006146f, 0.005294f, 0.004724f, 0.004447f, 0.004460f, 0.004745f, 0.005272f, 0.005999f, 0.006873f, 0.007837f, 0.008825f, 0.009773f, 0.010616f, 0.011293f, 0.011749f, 0.011938f, 0.011825f, 0.011387f, 0.010615f, 0.009512f, 0.008099f, 0.006405f, 0.004475f, 0.002364f, 0.000133f, -0.002148f, -0.004406f, -0.006569f, -0.008566f, -0.010332f, -0.011806f, -0.012942f, -0.013701f, -0.014060f, -0.014009f, -0.013554f, -0.012712f, -0.011516f, -0.010013f, -0.008257f, -0.006312f, - -0.004251f, -0.002146f, -0.000073f, 0.001895f, 0.003690f, 0.005252f, 0.006529f, 0.007482f, 0.008083f, 0.008319f, 0.008192f, 0.007716f, 0.006918f, 0.005840f, 0.004531f, 0.003050f, 0.001461f, -0.000167f, -0.001766f, -0.003271f, -0.004619f, -0.005755f, -0.006635f, -0.007225f, -0.007501f, -0.007454f, -0.007090f, -0.006424f, -0.005486f, -0.004316f, -0.002964f, -0.001486f, 0.000056f, 0.001598f, 0.003076f, 0.004430f, 0.005603f, 0.006548f, 0.007227f, 0.007610f, 0.007683f, 0.007443f, 0.006899f, 0.006074f, 0.005002f, 0.003726f, 0.002298f, 0.000777f, -0.030696f, 0.010079f, -0.038675f, 0.012582f, -0.040801f, 0.045322f, 0.035278f, -0.097745f, -0.078951f, 0.014559f, -0.086888f, -0.091152f, 0.053565f, -0.108519f, -0.285451f, -0.115492f, 0.174039f, 0.213796f, 0.243672f, -0.145965f, 0.017388f, 0.185458f, 0.179834f, -0.035021f, -0.162928f, -0.117639f, -0.077068f, 0.058654f, 0.229831f, 0.175223f, 0.046760f, -0.150464f, -0.165831f, -0.118794f, 0.039510f, 0.116700f, 0.173975f, 0.016928f, -0.057488f, -0.115028f, -0.092878f, 0.005873f, 0.141806f, 0.125902f, 0.030814f, -0.131927f, -0.150309f, -0.081015f, - -0.030206f, 0.022789f, 0.121464f, 0.113373f, 0.153768f, 0.011404f, -0.081105f, -0.307289f, -0.230855f, -0.079987f, 0.219398f, 0.020953f, 0.139568f, 0.076876f, -0.106696f, -0.202691f, -0.072874f, -0.212543f, -0.238707f, 0.008286f, 0.086439f, 0.133956f, -0.003077f, -0.030179f, -0.044500f, 0.169272f, 0.012399f, 0.043748f, -0.335844f, -0.427871f, 0.029599f, 0.301234f, 0.250250f, 0.067467f, -0.179678f, -0.363815f, -0.593776f, -0.157676f, 0.327665f, 0.584992f, 0.348499f, -0.048251f, -0.391810f, -0.372665f, -0.160141f, 0.241420f, 0.352707f, 0.236621f, -0.001022f, -0.134055f, -0.053121f, 0.141937f, 0.146798f, -0.055752f, -0.132145f, -0.096131f, 0.042013f, 0.164349f, 0.158217f, 0.000641f, -0.119515f, -0.161831f, -0.052040f, 0.024591f, 0.117203f, 0.055545f, -0.216649f, -0.214301f, -0.030497f, 0.038761f, 0.075765f, 0.040536f, -0.036389f, -0.103000f, -0.034191f, 0.044298f, 0.034372f, 0.036930f, 0.015048f, 0.003259f, -0.027983f, 0.049992f, 0.082727f, 0.012939f, -0.043868f, -0.091831f, -0.011452f, 0.085173f, 0.104380f, 0.071771f, 0.001449f, -0.092150f, -0.112132f, 0.005303f, 0.141831f, 0.155707f, - 0.010751f, -0.163970f, -0.245046f, -0.148464f, 0.078076f, 0.270186f, 0.300173f, 0.099280f, -0.205232f, -0.380479f, -0.317213f, 0.056430f, 0.345089f, 0.427063f, 0.189260f, -0.159506f, -0.416259f, -0.340820f, -0.060319f, 0.260954f, 0.388964f, 0.267633f, -0.113508f, -0.379353f, -0.350004f, -0.086303f, 0.208950f, 0.285451f, 0.142200f, -0.078494f, -0.215562f, -0.149965f, 0.034041f, 0.192228f, 0.234471f, 0.017520f, -0.298944f, -0.295611f, -0.045851f, 0.268164f, 0.308789f, 0.082452f, -0.227730f, -0.294581f, -0.082215f, 0.211627f, 0.266252f, 0.067987f, -0.185676f, -0.223757f, -0.027744f, 0.188095f, 0.173846f, -0.024262f, -0.178182f, -0.080763f, 0.112276f, 0.111610f, -0.054879f, -0.058273f, 0.025991f, 0.023344f, -0.007588f, 0.000557f, -0.001454f, 0.002463f, 0.000901f, 0.003014f, -0.002952f, 0.000982f, 0.000588f, 0.004419f, -0.000529f, -0.000775f, -0.001110f, 0.001083f, 0.000192f, 0.003196f, -0.001687f, -0.001023f, -0.001387f, 0.003966f, -0.002321f, 0.005528f, -0.002013f, -0.000908f, -0.004451f, 0.001728f, 0.001047f, 0.002773f, -0.001200f, 0.002569f, -0.001884f, 0.003416f, -0.005666f, 0.000214f} - }, - { - {0.000429f, 0.001272f, 0.002066f, 0.002781f, 0.003390f, 0.003873f, 0.004214f, 0.004402f, 0.004438f, 0.004326f, 0.004079f, 0.003719f, 0.003271f, 0.002769f, 0.002248f, 0.001749f, 0.001312f, 0.000979f, 0.000788f, 0.000775f, 0.000970f, 0.001397f, 0.002072f, 0.003001f, 0.004181f, 0.005599f, 0.007231f, 0.009046f, 0.010999f, 0.013041f, 0.015114f, 0.017154f, 0.019095f, 0.020868f, 0.022405f, 0.023641f, 0.024517f, 0.024978f, 0.024980f, 0.024489f, 0.023484f, 0.021955f, 0.019907f, 0.017361f, 0.014349f, 0.010918f, 0.007130f, 0.003053f, -0.001229f, -0.005629f, -0.010052f, -0.014400f, -0.018576f, -0.022483f, -0.026031f, -0.029135f, -0.031720f, -0.033725f, -0.035098f, -0.035806f, -0.035830f, -0.035166f, -0.033829f, -0.031849f, -0.029272f, -0.026158f, -0.022579f, -0.018619f, -0.014370f, -0.009930f, -0.005400f, -0.000884f, 0.003519f, 0.007712f, 0.011607f, 0.015122f, 0.018190f, 0.020756f, 0.022777f, 0.024227f, 0.025095f, 0.025387f, 0.025121f, 0.024332f, 0.023068f, 0.021387f, 0.019357f, 0.017056f, 0.014564f, 0.011967f, 0.009348f, 0.006792f, 0.004377f, 0.002175f, 0.000251f, -0.001340f, - -0.002556f, -0.003366f, -0.003753f, -0.003712f, -0.003251f, -0.002392f, -0.001169f, 0.000375f, 0.002186f, 0.004204f, 0.006362f, 0.008589f, 0.010814f, 0.012965f, 0.014971f, 0.016768f, 0.018295f, 0.019503f, 0.020346f, 0.020793f, 0.020821f, 0.020419f, 0.019587f, 0.018337f, 0.016691f, 0.014681f, 0.012349f, 0.009745f, 0.006923f, 0.003944f, 0.000874f, -0.002223f, -0.005280f, -0.008234f, -0.011022f, -0.013590f, -0.015885f, -0.017865f, -0.019493f, -0.020743f, -0.021597f, -0.022046f, -0.022090f, -0.021739f, -0.021012f, -0.019933f, -0.018535f, -0.016859f, -0.014948f, -0.012849f, -0.010613f, -0.008293f, -0.005939f, -0.003602f, -0.001332f, 0.000828f, 0.002836f, 0.004656f, 0.006259f, 0.007619f, 0.008720f, 0.009550f, 0.010106f, 0.010389f, 0.010407f, 0.010175f, 0.009711f, 0.009040f, 0.008189f, 0.007188f, 0.006069f, 0.004866f, 0.003613f, 0.002344f, 0.001092f, -0.000114f, -0.001245f, -0.002277f, -0.003189f, -0.003963f, -0.004586f, -0.005050f, -0.005351f, -0.005489f, -0.005468f, -0.005296f, -0.004984f, -0.004547f, -0.004003f, -0.003369f, -0.002667f, -0.001918f, -0.001143f, -0.000364f, 0.000399f, 0.001128f, - 0.001804f, 0.002412f, 0.002941f, 0.003381f, 0.003724f, 0.003967f, 0.004108f, 0.004150f, 0.004096f, 0.003954f, 0.003734f, 0.003444f, 0.003099f, 0.002712f, 0.002295f, 0.001864f, 0.001431f, 0.001011f, 0.000614f, 0.000253f, -0.000065f, -0.000333f, -0.000544f, -0.000697f, -0.000789f, -0.000823f, -0.000802f, -0.000729f, -0.000612f, -0.000459f, -0.000277f, -0.000077f, 0.000132f, 0.000340f, 0.000538f, 0.000717f, 0.000871f, 0.000991f, 0.001075f, 0.001117f, 0.001116f, 0.001073f, 0.000988f, 0.000866f, 0.000710f, 0.000528f, 0.000325f, 0.000110f, 0.004325f, 0.038062f, 0.020580f, -0.024641f, -0.010812f, 0.065193f, 0.106067f, 0.011613f, -0.082134f, -0.198732f, -0.130452f, -0.044671f, 0.099718f, -0.096835f, -0.057591f, -0.027115f, 0.073916f, 0.130933f, 0.339398f, -0.032221f, -0.083327f, -0.075477f, -0.011526f, 0.011000f, 0.186231f, 0.095079f, 0.087461f, -0.057836f, -0.177390f, -0.100523f, -0.090915f, 0.056568f, 0.079578f, 0.127256f, -0.011849f, -0.101805f, -0.152564f, -0.064817f, -0.032282f, 0.024912f, 0.071233f, 0.080544f, -0.003501f, -0.087247f, -0.076317f, -0.035437f, 0.035623f, 0.024788f, - -0.091994f, -0.079745f, 0.020901f, 0.074127f, 0.043623f, 0.064571f, -0.010169f, -0.064132f, -0.009114f, -0.068800f, 0.047633f, -0.142630f, 0.105867f, 0.093698f, -0.096038f, -0.167419f, 0.026841f, -0.110855f, -0.091647f, 0.073117f, -0.032957f, -0.056334f, -0.156696f, -0.014605f, 0.194360f, 0.437939f, 0.198456f, -0.047092f, -0.274072f, -0.198778f, -0.026182f, 0.206621f, 0.301615f, 0.217354f, -0.072622f, -0.197400f, -0.081358f, 0.030432f, 0.033997f, 0.021622f, -0.034318f, -0.063383f, -0.118311f, -0.018524f, 0.101311f, 0.212623f, 0.162632f, 0.016773f, -0.165046f, -0.273346f, -0.193594f, -0.000947f, 0.245901f, 0.378040f, 0.174211f, -0.055126f, -0.339109f, -0.345752f, -0.166324f, 0.090062f, 0.198502f, 0.178359f, 0.053506f, 0.023101f, -0.108601f, 0.021106f, 0.102141f, 0.119987f, -0.125830f, -0.180442f, -0.053532f, 0.089257f, 0.129860f, 0.068003f, -0.005655f, -0.170720f, -0.174745f, -0.116848f, 0.079347f, 0.218131f, 0.247059f, 0.053708f, -0.177930f, -0.357342f, -0.276339f, -0.023190f, 0.259482f, 0.433787f, 0.279328f, -0.065102f, -0.348322f, -0.387358f, -0.207420f, 0.119153f, 0.252331f, 0.194574f, - 0.095594f, -0.038457f, -0.090909f, -0.118740f, -0.055565f, 0.031000f, 0.086467f, 0.084120f, 0.031550f, -0.075907f, -0.066799f, -0.104845f, -0.014430f, 0.057053f, 0.115622f, 0.073755f, -0.050623f, -0.130727f, -0.127212f, -0.045579f, 0.068296f, 0.153761f, 0.099787f, -0.039918f, -0.060346f, -0.051542f, -0.052361f, -0.034906f, 0.018428f, 0.057516f, 0.043171f, 0.014680f, -0.035625f, -0.083127f, -0.036201f, -0.088496f, -0.099303f, 0.059697f, 0.122499f, 0.100904f, -0.025937f, -0.084272f, -0.077960f, 0.016659f, 0.062050f, 0.062134f, -0.001570f, -0.034258f, -0.042715f, -0.004483f, 0.021577f, 0.044006f, 0.013080f, -0.014641f, -0.038426f, -0.002938f, 0.029375f, 0.025165f, -0.023109f, -0.009682f, 0.008798f, 0.010358f, -0.006268f, 0.004481f, -0.003225f, 0.007309f, -0.004619f, 0.004374f, -0.002460f, 0.005010f, -0.003899f, 0.006250f, -0.002826f, 0.004784f, -0.001410f, 0.005846f, -0.006009f, 0.007681f, -0.002530f, 0.001607f, -0.004596f, 0.001338f, -0.004160f, 0.002091f, -0.002249f, 0.002802f, -0.001929f, 0.007748f, -0.004506f, 0.003110f, -0.007015f, 0.005977f, -0.005323f, 0.004130f, -0.003102f, 0.003839f}, - {0.000429f, 0.001272f, 0.002066f, 0.002781f, 0.003390f, 0.003873f, 0.004214f, 0.004402f, 0.004438f, 0.004326f, 0.004079f, 0.003719f, 0.003271f, 0.002769f, 0.002248f, 0.001749f, 0.001312f, 0.000979f, 0.000788f, 0.000775f, 0.000970f, 0.001397f, 0.002072f, 0.003001f, 0.004181f, 0.005599f, 0.007231f, 0.009046f, 0.010999f, 0.013041f, 0.015114f, 0.017154f, 0.019095f, 0.020868f, 0.022405f, 0.023641f, 0.024517f, 0.024978f, 0.024980f, 0.024489f, 0.023484f, 0.021955f, 0.019907f, 0.017361f, 0.014349f, 0.010918f, 0.007130f, 0.003053f, -0.001229f, -0.005629f, -0.010052f, -0.014400f, -0.018576f, -0.022483f, -0.026031f, -0.029135f, -0.031720f, -0.033725f, -0.035098f, -0.035806f, -0.035830f, -0.035166f, -0.033829f, -0.031849f, -0.029272f, -0.026158f, -0.022579f, -0.018619f, -0.014370f, -0.009930f, -0.005400f, -0.000884f, 0.003519f, 0.007712f, 0.011607f, 0.015122f, 0.018190f, 0.020756f, 0.022777f, 0.024227f, 0.025095f, 0.025387f, 0.025121f, 0.024332f, 0.023068f, 0.021387f, 0.019357f, 0.017056f, 0.014564f, 0.011967f, 0.009348f, 0.006792f, 0.004377f, 0.002175f, 0.000251f, -0.001340f, - -0.002556f, -0.003366f, -0.003753f, -0.003712f, -0.003251f, -0.002392f, -0.001169f, 0.000375f, 0.002186f, 0.004204f, 0.006362f, 0.008589f, 0.010814f, 0.012965f, 0.014971f, 0.016768f, 0.018295f, 0.019503f, 0.020346f, 0.020793f, 0.020821f, 0.020419f, 0.019587f, 0.018337f, 0.016691f, 0.014681f, 0.012349f, 0.009745f, 0.006923f, 0.003944f, 0.000874f, -0.002223f, -0.005280f, -0.008234f, -0.011022f, -0.013590f, -0.015885f, -0.017865f, -0.019493f, -0.020743f, -0.021597f, -0.022046f, -0.022090f, -0.021739f, -0.021012f, -0.019933f, -0.018535f, -0.016859f, -0.014948f, -0.012849f, -0.010613f, -0.008293f, -0.005939f, -0.003602f, -0.001332f, 0.000828f, 0.002836f, 0.004656f, 0.006259f, 0.007619f, 0.008720f, 0.009550f, 0.010106f, 0.010389f, 0.010407f, 0.010175f, 0.009711f, 0.009040f, 0.008189f, 0.007188f, 0.006069f, 0.004866f, 0.003613f, 0.002344f, 0.001092f, -0.000114f, -0.001245f, -0.002277f, -0.003189f, -0.003963f, -0.004586f, -0.005050f, -0.005351f, -0.005489f, -0.005468f, -0.005296f, -0.004984f, -0.004547f, -0.004003f, -0.003369f, -0.002667f, -0.001918f, -0.001143f, -0.000364f, 0.000399f, 0.001128f, - 0.001804f, 0.002412f, 0.002941f, 0.003381f, 0.003724f, 0.003967f, 0.004108f, 0.004150f, 0.004096f, 0.003954f, 0.003734f, 0.003444f, 0.003099f, 0.002712f, 0.002295f, 0.001864f, 0.001431f, 0.001011f, 0.000614f, 0.000253f, -0.000065f, -0.000333f, -0.000544f, -0.000697f, -0.000789f, -0.000823f, -0.000802f, -0.000729f, -0.000612f, -0.000459f, -0.000277f, -0.000077f, 0.000132f, 0.000340f, 0.000538f, 0.000717f, 0.000871f, 0.000991f, 0.001075f, 0.001117f, 0.001116f, 0.001073f, 0.000988f, 0.000866f, 0.000710f, 0.000528f, 0.000325f, 0.000110f, 0.004325f, 0.038062f, 0.020580f, -0.024641f, -0.010812f, 0.065193f, 0.106067f, 0.011613f, -0.082134f, -0.198732f, -0.130452f, -0.044671f, 0.099718f, -0.096835f, -0.057591f, -0.027115f, 0.073916f, 0.130933f, 0.339398f, -0.032221f, -0.083327f, -0.075477f, -0.011526f, 0.011000f, 0.186231f, 0.095079f, 0.087461f, -0.057836f, -0.177390f, -0.100523f, -0.090915f, 0.056568f, 0.079578f, 0.127256f, -0.011849f, -0.101805f, -0.152564f, -0.064817f, -0.032282f, 0.024912f, 0.071233f, 0.080544f, -0.003501f, -0.087247f, -0.076317f, -0.035437f, 0.035623f, 0.024788f, - -0.091994f, -0.079745f, 0.020901f, 0.074127f, 0.043623f, 0.064571f, -0.010169f, -0.064132f, -0.009114f, -0.068800f, 0.047633f, -0.142630f, 0.105867f, 0.093698f, -0.096038f, -0.167419f, 0.026841f, -0.110855f, -0.091647f, 0.073117f, -0.032957f, -0.056334f, -0.156696f, -0.014605f, 0.194360f, 0.437939f, 0.198456f, -0.047092f, -0.274072f, -0.198778f, -0.026182f, 0.206621f, 0.301615f, 0.217354f, -0.072622f, -0.197400f, -0.081358f, 0.030432f, 0.033997f, 0.021622f, -0.034318f, -0.063383f, -0.118311f, -0.018524f, 0.101311f, 0.212623f, 0.162632f, 0.016773f, -0.165046f, -0.273346f, -0.193594f, -0.000947f, 0.245901f, 0.378040f, 0.174211f, -0.055126f, -0.339109f, -0.345752f, -0.166324f, 0.090062f, 0.198502f, 0.178359f, 0.053506f, 0.023101f, -0.108601f, 0.021106f, 0.102141f, 0.119987f, -0.125830f, -0.180442f, -0.053532f, 0.089257f, 0.129860f, 0.068003f, -0.005655f, -0.170720f, -0.174745f, -0.116848f, 0.079347f, 0.218131f, 0.247059f, 0.053708f, -0.177930f, -0.357342f, -0.276339f, -0.023190f, 0.259482f, 0.433787f, 0.279328f, -0.065102f, -0.348322f, -0.387358f, -0.207420f, 0.119153f, 0.252331f, 0.194574f, - 0.095594f, -0.038457f, -0.090909f, -0.118740f, -0.055565f, 0.031000f, 0.086467f, 0.084120f, 0.031550f, -0.075907f, -0.066799f, -0.104845f, -0.014430f, 0.057053f, 0.115622f, 0.073755f, -0.050623f, -0.130727f, -0.127212f, -0.045579f, 0.068296f, 0.153761f, 0.099787f, -0.039918f, -0.060346f, -0.051542f, -0.052361f, -0.034906f, 0.018428f, 0.057516f, 0.043171f, 0.014680f, -0.035625f, -0.083127f, -0.036201f, -0.088496f, -0.099303f, 0.059697f, 0.122499f, 0.100904f, -0.025937f, -0.084272f, -0.077960f, 0.016659f, 0.062050f, 0.062134f, -0.001570f, -0.034258f, -0.042715f, -0.004483f, 0.021577f, 0.044006f, 0.013080f, -0.014641f, -0.038426f, -0.002938f, 0.029375f, 0.025165f, -0.023109f, -0.009682f, 0.008798f, 0.010358f, -0.006268f, 0.004481f, -0.003225f, 0.007309f, -0.004619f, 0.004374f, -0.002460f, 0.005010f, -0.003899f, 0.006250f, -0.002826f, 0.004784f, -0.001410f, 0.005846f, -0.006009f, 0.007681f, -0.002530f, 0.001607f, -0.004596f, 0.001338f, -0.004160f, 0.002091f, -0.002249f, 0.002802f, -0.001929f, 0.007748f, -0.004506f, 0.003110f, -0.007015f, 0.005977f, -0.005323f, 0.004130f, -0.003102f, 0.003839f} - }, - { - {-0.002413f, -0.007177f, -0.011763f, -0.016054f, -0.019947f, -0.023348f, -0.026178f, -0.028375f, -0.029895f, -0.030714f, -0.030827f, -0.030250f, -0.029018f, -0.027181f, -0.024809f, -0.021981f, -0.018790f, -0.015333f, -0.011714f, -0.008037f, -0.004401f, -0.000904f, 0.002368f, 0.005338f, 0.007945f, 0.010139f, 0.011889f, 0.013178f, 0.014007f, 0.014391f, 0.014362f, 0.013961f, 0.013244f, 0.012273f, 0.011117f, 0.009849f, 0.008539f, 0.007259f, 0.006075f, 0.005045f, 0.004218f, 0.003634f, 0.003320f, 0.003292f, 0.003551f, 0.004089f, 0.004883f, 0.005903f, 0.007108f, 0.008451f, 0.009879f, 0.011338f, 0.012772f, 0.014126f, 0.015352f, 0.016405f, 0.017248f, 0.017852f, 0.018199f, 0.018280f, 0.018097f, 0.017660f, 0.016992f, 0.016120f, 0.015081f, 0.013916f, 0.012669f, 0.011387f, 0.010116f, 0.008899f, 0.007777f, 0.006782f, 0.005944f, 0.005281f, 0.004804f, 0.004514f, 0.004406f, 0.004463f, 0.004663f, 0.004976f, 0.005367f, 0.005799f, 0.006230f, 0.006622f, 0.006935f, 0.007134f, 0.007190f, 0.007081f, 0.006789f, 0.006309f, 0.005642f, 0.004801f, 0.003804f, 0.002681f, 0.001468f, 0.000206f, - -0.001057f, -0.002273f, -0.003391f, -0.004362f, -0.005139f, -0.005679f, -0.005949f, -0.005920f, -0.005574f, -0.004904f, -0.003912f, -0.002610f, -0.001024f, 0.000814f, 0.002859f, 0.005061f, 0.007363f, 0.009703f, 0.012018f, 0.014242f, 0.016313f, 0.018172f, 0.019765f, 0.021045f, 0.021975f, 0.022526f, 0.022681f, 0.022434f, 0.021790f, 0.020765f, 0.019385f, 0.017686f, 0.015712f, 0.013513f, 0.011145f, 0.008666f, 0.006135f, 0.003611f, 0.001151f, -0.001192f, -0.003373f, -0.005351f, -0.007095f, -0.008580f, -0.009793f, -0.010727f, -0.011384f, -0.011776f, -0.011920f, -0.011840f, -0.011563f, -0.011123f, -0.010552f, -0.009886f, -0.009157f, -0.008398f, -0.007636f, -0.006896f, -0.006197f, -0.005553f, -0.004972f, -0.004458f, -0.004008f, -0.003616f, -0.003271f, -0.002959f, -0.002665f, -0.002371f, -0.002061f, -0.001720f, -0.001334f, -0.000894f, -0.000392f, 0.000174f, 0.000801f, 0.001483f, 0.002208f, 0.002960f, 0.003721f, 0.004468f, 0.005178f, 0.005827f, 0.006389f, 0.006842f, 0.007166f, 0.007342f, 0.007358f, 0.007206f, 0.006882f, 0.006391f, 0.005742f, 0.004949f, 0.004032f, 0.003017f, 0.001932f, 0.000809f, - -0.000319f, -0.001416f, -0.002451f, -0.003390f, -0.004206f, -0.004874f, -0.005375f, -0.005695f, -0.005827f, -0.005770f, -0.005531f, -0.005123f, -0.004563f, -0.003876f, -0.003091f, -0.002239f, -0.001355f, -0.000473f, 0.000372f, 0.001148f, 0.001824f, 0.002375f, 0.002781f, 0.003027f, 0.003104f, 0.003011f, 0.002753f, 0.002342f, 0.001795f, 0.001137f, 0.000393f, -0.000404f, -0.001221f, -0.002025f, -0.002782f, -0.003461f, -0.004032f, -0.004472f, -0.004761f, -0.004886f, -0.004839f, -0.004619f, -0.004235f, -0.003697f, -0.003026f, -0.002244f, -0.001380f, -0.000466f, -0.000615f, -0.021191f, 0.027880f, 0.012174f, 0.032338f, -0.054992f, 0.011160f, -0.023717f, -0.040512f, 0.010908f, 0.085733f, 0.035783f, 0.048874f, 0.056802f, 0.031973f, 0.031169f, 0.042248f, 0.148670f, 0.144374f, -0.094051f, -0.074670f, 0.080443f, 0.071192f, 0.060975f, -0.051582f, -0.011649f, -0.064562f, -0.058762f, -0.021654f, 0.049947f, 0.086487f, -0.021086f, -0.079879f, -0.023443f, 0.046919f, 0.080546f, 0.076935f, 0.005172f, -0.051518f, -0.030896f, 0.017684f, 0.041659f, 0.021894f, 0.015478f, -0.074044f, -0.043204f, -0.052144f, -0.021901f, - -0.054245f, 0.013077f, 0.053051f, 0.081595f, -0.063261f, -0.031584f, -0.113133f, 0.008047f, 0.038664f, 0.118693f, -0.004410f, 0.077017f, -0.103930f, -0.081495f, 0.003826f, 0.124312f, 0.050884f, 0.151746f, 0.094586f, -0.030841f, -0.107123f, -0.098013f, -0.055043f, 0.042530f, 0.084145f, -0.010977f, -0.026112f, -0.073697f, -0.151197f, -0.145617f, 0.038560f, 0.236814f, 0.255649f, 0.130794f, -0.120527f, -0.269751f, -0.195657f, -0.007831f, 0.208284f, 0.211839f, 0.124481f, -0.119691f, -0.185847f, -0.250728f, -0.124480f, 0.172273f, 0.240133f, 0.139943f, -0.084784f, -0.203705f, -0.115258f, 0.048286f, 0.137808f, 0.117562f, -0.045046f, -0.165917f, -0.125860f, 0.050754f, 0.210969f, 0.243112f, 0.023364f, -0.223044f, -0.264048f, -0.023971f, 0.182798f, 0.357620f, 0.336762f, -0.089491f, -0.361557f, -0.268941f, 0.033550f, 0.314113f, 0.336011f, 0.169341f, -0.085608f, -0.318431f, -0.253429f, -0.064344f, 0.199461f, 0.264282f, 0.179393f, -0.083483f, -0.222066f, -0.192701f, -0.004908f, 0.165831f, 0.198551f, 0.012269f, -0.158841f, -0.161697f, -0.044380f, 0.138979f, 0.174485f, -0.016049f, -0.161850f, -0.203848f, - -0.080865f, 0.100964f, 0.260636f, 0.163338f, -0.061272f, -0.230647f, -0.219669f, -0.071659f, 0.126849f, 0.250508f, 0.243999f, 0.015787f, -0.212824f, -0.321049f, -0.177592f, 0.088023f, 0.321437f, 0.290189f, 0.050094f, -0.234798f, -0.321695f, -0.226345f, 0.084210f, 0.251862f, 0.265496f, 0.138093f, -0.064518f, -0.178604f, -0.172685f, -0.030430f, 0.079900f, 0.157663f, 0.077999f, 0.015414f, -0.124574f, 0.006968f, 0.164962f, 0.085234f, -0.024024f, -0.142999f, -0.114214f, -0.029137f, 0.091986f, 0.101595f, 0.046692f, -0.061337f, -0.097706f, -0.072977f, 0.023678f, 0.081482f, 0.076747f, -0.015231f, -0.078642f, -0.077566f, 0.025165f, 0.081296f, 0.034390f, -0.067929f, -0.030864f, 0.025283f, 0.020473f, -0.015586f, -0.001156f, -0.003147f, 0.001510f, -0.008340f, 0.001776f, -0.006130f, 0.004503f, -0.004098f, 0.003664f, -0.004185f, 0.000306f, -0.003483f, 0.008412f, -0.004797f, 0.002505f, -0.003378f, 0.004609f, -0.004696f, 0.001396f, -0.003903f, 0.001049f, -0.006249f, 0.004345f, -0.002750f, 0.004282f, -0.007419f, 0.006100f, -0.002088f, 0.004488f, -0.000247f, 0.006924f, -0.006715f, 0.004240f, -0.005750f}, - {-0.002413f, -0.007177f, -0.011763f, -0.016054f, -0.019947f, -0.023348f, -0.026178f, -0.028375f, -0.029895f, -0.030714f, -0.030827f, -0.030250f, -0.029018f, -0.027181f, -0.024809f, -0.021981f, -0.018790f, -0.015333f, -0.011714f, -0.008037f, -0.004401f, -0.000904f, 0.002368f, 0.005338f, 0.007945f, 0.010139f, 0.011889f, 0.013178f, 0.014007f, 0.014391f, 0.014362f, 0.013961f, 0.013244f, 0.012273f, 0.011117f, 0.009849f, 0.008539f, 0.007259f, 0.006075f, 0.005045f, 0.004218f, 0.003634f, 0.003320f, 0.003292f, 0.003551f, 0.004089f, 0.004883f, 0.005903f, 0.007108f, 0.008451f, 0.009879f, 0.011338f, 0.012772f, 0.014126f, 0.015352f, 0.016405f, 0.017248f, 0.017852f, 0.018199f, 0.018280f, 0.018097f, 0.017660f, 0.016992f, 0.016120f, 0.015081f, 0.013916f, 0.012669f, 0.011387f, 0.010116f, 0.008899f, 0.007777f, 0.006782f, 0.005944f, 0.005281f, 0.004804f, 0.004514f, 0.004406f, 0.004463f, 0.004663f, 0.004976f, 0.005367f, 0.005799f, 0.006230f, 0.006622f, 0.006935f, 0.007134f, 0.007190f, 0.007081f, 0.006789f, 0.006309f, 0.005642f, 0.004801f, 0.003804f, 0.002681f, 0.001468f, 0.000206f, - -0.001057f, -0.002273f, -0.003391f, -0.004362f, -0.005139f, -0.005679f, -0.005949f, -0.005920f, -0.005574f, -0.004904f, -0.003912f, -0.002610f, -0.001024f, 0.000814f, 0.002859f, 0.005061f, 0.007363f, 0.009703f, 0.012018f, 0.014242f, 0.016313f, 0.018172f, 0.019765f, 0.021045f, 0.021975f, 0.022526f, 0.022681f, 0.022434f, 0.021790f, 0.020765f, 0.019385f, 0.017686f, 0.015712f, 0.013513f, 0.011145f, 0.008666f, 0.006135f, 0.003611f, 0.001151f, -0.001192f, -0.003373f, -0.005351f, -0.007095f, -0.008580f, -0.009793f, -0.010727f, -0.011384f, -0.011776f, -0.011920f, -0.011840f, -0.011563f, -0.011123f, -0.010552f, -0.009886f, -0.009157f, -0.008398f, -0.007636f, -0.006896f, -0.006197f, -0.005553f, -0.004972f, -0.004458f, -0.004008f, -0.003616f, -0.003271f, -0.002959f, -0.002665f, -0.002371f, -0.002061f, -0.001720f, -0.001334f, -0.000894f, -0.000392f, 0.000174f, 0.000801f, 0.001483f, 0.002208f, 0.002960f, 0.003721f, 0.004468f, 0.005178f, 0.005827f, 0.006389f, 0.006842f, 0.007166f, 0.007342f, 0.007358f, 0.007206f, 0.006882f, 0.006391f, 0.005742f, 0.004949f, 0.004032f, 0.003017f, 0.001932f, 0.000809f, - -0.000319f, -0.001416f, -0.002451f, -0.003390f, -0.004206f, -0.004874f, -0.005375f, -0.005695f, -0.005827f, -0.005770f, -0.005531f, -0.005123f, -0.004563f, -0.003876f, -0.003091f, -0.002239f, -0.001355f, -0.000473f, 0.000372f, 0.001148f, 0.001824f, 0.002375f, 0.002781f, 0.003027f, 0.003104f, 0.003011f, 0.002753f, 0.002342f, 0.001795f, 0.001137f, 0.000393f, -0.000404f, -0.001221f, -0.002025f, -0.002782f, -0.003461f, -0.004032f, -0.004472f, -0.004761f, -0.004886f, -0.004839f, -0.004619f, -0.004235f, -0.003697f, -0.003026f, -0.002244f, -0.001380f, -0.000466f, -0.000615f, -0.021191f, 0.027880f, 0.012174f, 0.032338f, -0.054992f, 0.011160f, -0.023717f, -0.040512f, 0.010908f, 0.085733f, 0.035783f, 0.048874f, 0.056802f, 0.031973f, 0.031169f, 0.042248f, 0.148670f, 0.144374f, -0.094051f, -0.074670f, 0.080443f, 0.071192f, 0.060975f, -0.051582f, -0.011649f, -0.064562f, -0.058762f, -0.021654f, 0.049947f, 0.086487f, -0.021086f, -0.079879f, -0.023443f, 0.046919f, 0.080546f, 0.076935f, 0.005172f, -0.051518f, -0.030896f, 0.017684f, 0.041659f, 0.021894f, 0.015478f, -0.074044f, -0.043204f, -0.052144f, -0.021901f, - -0.054245f, 0.013077f, 0.053051f, 0.081595f, -0.063261f, -0.031584f, -0.113133f, 0.008047f, 0.038664f, 0.118693f, -0.004410f, 0.077017f, -0.103930f, -0.081495f, 0.003826f, 0.124312f, 0.050884f, 0.151746f, 0.094586f, -0.030841f, -0.107123f, -0.098013f, -0.055043f, 0.042530f, 0.084145f, -0.010977f, -0.026112f, -0.073697f, -0.151197f, -0.145617f, 0.038560f, 0.236814f, 0.255649f, 0.130794f, -0.120527f, -0.269751f, -0.195657f, -0.007831f, 0.208284f, 0.211839f, 0.124481f, -0.119691f, -0.185847f, -0.250728f, -0.124480f, 0.172273f, 0.240133f, 0.139943f, -0.084784f, -0.203705f, -0.115258f, 0.048286f, 0.137808f, 0.117562f, -0.045046f, -0.165917f, -0.125860f, 0.050754f, 0.210969f, 0.243112f, 0.023364f, -0.223044f, -0.264048f, -0.023971f, 0.182798f, 0.357620f, 0.336762f, -0.089491f, -0.361557f, -0.268941f, 0.033550f, 0.314113f, 0.336011f, 0.169341f, -0.085608f, -0.318431f, -0.253429f, -0.064344f, 0.199461f, 0.264282f, 0.179393f, -0.083483f, -0.222066f, -0.192701f, -0.004908f, 0.165831f, 0.198551f, 0.012269f, -0.158841f, -0.161697f, -0.044380f, 0.138979f, 0.174485f, -0.016049f, -0.161850f, -0.203848f, - -0.080865f, 0.100964f, 0.260636f, 0.163338f, -0.061272f, -0.230647f, -0.219669f, -0.071659f, 0.126849f, 0.250508f, 0.243999f, 0.015787f, -0.212824f, -0.321049f, -0.177592f, 0.088023f, 0.321437f, 0.290189f, 0.050094f, -0.234798f, -0.321695f, -0.226345f, 0.084210f, 0.251862f, 0.265496f, 0.138093f, -0.064518f, -0.178604f, -0.172685f, -0.030430f, 0.079900f, 0.157663f, 0.077999f, 0.015414f, -0.124574f, 0.006968f, 0.164962f, 0.085234f, -0.024024f, -0.142999f, -0.114214f, -0.029137f, 0.091986f, 0.101595f, 0.046692f, -0.061337f, -0.097706f, -0.072977f, 0.023678f, 0.081482f, 0.076747f, -0.015231f, -0.078642f, -0.077566f, 0.025165f, 0.081296f, 0.034390f, -0.067929f, -0.030864f, 0.025283f, 0.020473f, -0.015586f, -0.001156f, -0.003147f, 0.001510f, -0.008340f, 0.001776f, -0.006130f, 0.004503f, -0.004098f, 0.003664f, -0.004185f, 0.000306f, -0.003483f, 0.008412f, -0.004797f, 0.002505f, -0.003378f, 0.004609f, -0.004696f, 0.001396f, -0.003903f, 0.001049f, -0.006249f, 0.004345f, -0.002750f, 0.004282f, -0.007419f, 0.006100f, -0.002088f, 0.004488f, -0.000247f, 0.006924f, -0.006715f, 0.004240f, -0.005750f} - }, - { - {-0.000629f, -0.001876f, -0.003086f, -0.004238f, -0.005309f, -0.006281f, -0.007137f, -0.007864f, -0.008450f, -0.008890f, -0.009180f, -0.009320f, -0.009315f, -0.009171f, -0.008900f, -0.008514f, -0.008029f, -0.007460f, -0.006826f, -0.006145f, -0.005435f, -0.004713f, -0.003994f, -0.003292f, -0.002620f, -0.001986f, -0.001396f, -0.000854f, -0.000358f, 0.000093f, 0.000506f, 0.000888f, 0.001251f, 0.001607f, 0.001968f, 0.002348f, 0.002760f, 0.003218f, 0.003733f, 0.004313f, 0.004966f, 0.005696f, 0.006502f, 0.007382f, 0.008328f, 0.009330f, 0.010372f, 0.011438f, 0.012504f, 0.013549f, 0.014546f, 0.015468f, 0.016288f, 0.016979f, 0.017514f, 0.017870f, 0.018024f, 0.017960f, 0.017664f, 0.017126f, 0.016343f, 0.015318f, 0.014057f, 0.012575f, 0.010890f, 0.009026f, 0.007012f, 0.004880f, 0.002668f, 0.000413f, -0.001845f, -0.004064f, -0.006205f, -0.008229f, -0.010102f, -0.011790f, -0.013267f, -0.014510f, -0.015503f, -0.016234f, -0.016701f, -0.016906f, -0.016859f, -0.016573f, -0.016072f, -0.015380f, -0.014527f, -0.013548f, -0.012477f, -0.011352f, -0.010209f, -0.009085f, -0.008012f, -0.007022f, -0.006141f, -0.005391f, - -0.004787f, -0.004341f, -0.004057f, -0.003932f, -0.003959f, -0.004124f, -0.004408f, -0.004789f, -0.005239f, -0.005729f, -0.006227f, -0.006703f, -0.007125f, -0.007464f, -0.007694f, -0.007791f, -0.007738f, -0.007521f, -0.007133f, -0.006573f, -0.005847f, -0.004964f, -0.003944f, -0.002806f, -0.001580f, -0.000296f, 0.001013f, 0.002311f, 0.003562f, 0.004729f, 0.005778f, 0.006679f, 0.007404f, 0.007929f, 0.008238f, 0.008319f, 0.008169f, 0.007789f, 0.007189f, 0.006385f, 0.005397f, 0.004255f, 0.002989f, 0.001637f, 0.000237f, -0.001170f, -0.002545f, -0.003846f, -0.005036f, -0.006080f, -0.006947f, -0.007613f, -0.008058f, -0.008269f, -0.008240f, -0.007971f, -0.007471f, -0.006754f, -0.005840f, -0.004756f, -0.003532f, -0.002203f, -0.000807f, 0.000619f, 0.002035f, 0.003402f, 0.004684f, 0.005848f, 0.006865f, 0.007710f, 0.008363f, 0.008811f, 0.009047f, 0.009069f, 0.008884f, 0.008501f, 0.007938f, 0.007215f, 0.006357f, 0.005391f, 0.004350f, 0.003262f, 0.002161f, 0.001077f, 0.000037f, -0.000931f, -0.001804f, -0.002565f, -0.003197f, -0.003693f, -0.004045f, -0.004256f, -0.004328f, -0.004271f, -0.004097f, -0.003821f, - -0.003462f, -0.003040f, -0.002574f, -0.002087f, -0.001599f, -0.001129f, -0.000694f, -0.000309f, 0.000014f, 0.000266f, 0.000442f, 0.000539f, 0.000560f, 0.000508f, 0.000391f, 0.000219f, 0.000002f, -0.000245f, -0.000509f, -0.000777f, -0.001035f, -0.001269f, -0.001471f, -0.001629f, -0.001737f, -0.001790f, -0.001787f, -0.001728f, -0.001616f, -0.001456f, -0.001255f, -0.001023f, -0.000770f, -0.000505f, -0.000242f, 0.000010f, 0.000241f, 0.000440f, 0.000602f, 0.000719f, 0.000789f, 0.000810f, 0.000782f, 0.000710f, 0.000598f, 0.000452f, 0.000281f, 0.000096f, 0.003833f, -0.002393f, -0.001550f, -0.010768f, 0.032629f, 0.011306f, -0.044284f, 0.018314f, 0.003978f, 0.038048f, 0.006921f, -0.071210f, -0.029689f, -0.044542f, -0.099327f, 0.020127f, 0.098187f, 0.091075f, 0.086575f, -0.042671f, 0.007877f, 0.078891f, 0.084995f, 0.054082f, -0.021638f, -0.048082f, -0.022392f, -0.071858f, -0.067982f, -0.059163f, 0.033391f, 0.127379f, 0.007895f, 0.018223f, 0.005708f, -0.047327f, -0.074037f, 0.045486f, 0.080097f, 0.109529f, 0.075418f, 0.024993f, -0.049446f, -0.061939f, -0.038186f, 0.006499f, 0.027318f, 0.040559f, - -0.033439f, -0.035134f, -0.033588f, -0.020991f, -0.034200f, 0.145024f, 0.003104f, 0.062410f, -0.002398f, -0.055186f, -0.153519f, 0.085516f, 0.013526f, 0.050198f, 0.080210f, -0.026815f, -0.080563f, -0.105866f, 0.039693f, 0.079955f, 0.053818f, 0.007022f, -0.049899f, -0.040756f, -0.090243f, -0.096030f, 0.014919f, 0.099631f, 0.049712f, -0.117783f, -0.104527f, -0.047732f, -0.058681f, 0.011162f, 0.071316f, 0.042627f, -0.104107f, -0.123039f, -0.013747f, 0.203720f, 0.300154f, 0.163747f, -0.071562f, -0.218673f, -0.226938f, -0.051208f, 0.155922f, 0.185269f, 0.051669f, -0.059647f, -0.090049f, -0.032626f, 0.023640f, 0.050562f, 0.020662f, 0.021180f, -0.064624f, -0.074480f, -0.033960f, 0.015714f, 0.109849f, 0.132771f, 0.140950f, -0.014645f, -0.158302f, -0.188966f, 0.057032f, 0.035205f, 0.090630f, 0.127866f, 0.070389f, -0.005047f, -0.151082f, -0.039095f, 0.060604f, 0.101319f, 0.155564f, 0.015911f, -0.077633f, -0.120064f, -0.128551f, -0.103619f, 0.069509f, 0.194971f, 0.254877f, 0.084847f, -0.134256f, -0.334629f, -0.222454f, 0.004266f, 0.210033f, 0.251997f, 0.137596f, -0.119336f, -0.256430f, -0.239825f, - -0.025960f, 0.182839f, 0.278925f, 0.086432f, -0.206817f, -0.257206f, -0.181695f, 0.010354f, 0.202964f, 0.229244f, 0.098833f, -0.087026f, -0.181307f, -0.141921f, -0.048110f, 0.075799f, 0.114635f, 0.060613f, -0.007091f, -0.085373f, -0.082937f, -0.027346f, 0.088356f, 0.139427f, 0.092503f, -0.030368f, -0.103502f, -0.107065f, -0.020528f, 0.052644f, 0.128449f, 0.060539f, -0.024419f, -0.053943f, -0.053067f, 0.104894f, 0.110330f, -0.030292f, -0.137751f, -0.137278f, 0.001888f, 0.123472f, 0.133148f, -0.007019f, -0.129875f, -0.123791f, 0.026745f, 0.121553f, 0.087812f, -0.059539f, -0.115914f, -0.041189f, 0.084327f, 0.080379f, -0.023472f, -0.085842f, -0.004187f, 0.058332f, 0.012800f, -0.041715f, -0.000345f, 0.009540f, 0.000671f, -0.007229f, 0.003356f, -0.001562f, 0.003583f, -0.001390f, 0.004748f, -0.004077f, 0.001544f, -0.004733f, -0.001209f, -0.004578f, 0.003593f, -0.002046f, 0.008076f, -0.006694f, 0.003824f, -0.000642f, 0.003010f, -0.005633f, 0.003952f, -0.007572f, 0.002614f, -0.004205f, 0.006070f, -0.002496f, 0.004053f, -0.001677f, 0.001551f, -0.006302f, 0.004819f, -0.002902f, 0.002256f, -0.003500f}, - {-0.000629f, -0.001876f, -0.003086f, -0.004238f, -0.005309f, -0.006281f, -0.007137f, -0.007864f, -0.008450f, -0.008890f, -0.009180f, -0.009320f, -0.009315f, -0.009171f, -0.008900f, -0.008514f, -0.008029f, -0.007460f, -0.006826f, -0.006145f, -0.005435f, -0.004713f, -0.003994f, -0.003292f, -0.002620f, -0.001986f, -0.001396f, -0.000854f, -0.000358f, 0.000093f, 0.000506f, 0.000888f, 0.001251f, 0.001607f, 0.001968f, 0.002348f, 0.002760f, 0.003218f, 0.003733f, 0.004313f, 0.004966f, 0.005696f, 0.006502f, 0.007382f, 0.008328f, 0.009330f, 0.010372f, 0.011438f, 0.012504f, 0.013549f, 0.014546f, 0.015468f, 0.016288f, 0.016979f, 0.017514f, 0.017870f, 0.018024f, 0.017960f, 0.017664f, 0.017126f, 0.016343f, 0.015318f, 0.014057f, 0.012575f, 0.010890f, 0.009026f, 0.007012f, 0.004880f, 0.002668f, 0.000413f, -0.001845f, -0.004064f, -0.006205f, -0.008229f, -0.010102f, -0.011790f, -0.013267f, -0.014510f, -0.015503f, -0.016234f, -0.016701f, -0.016906f, -0.016859f, -0.016573f, -0.016072f, -0.015380f, -0.014527f, -0.013548f, -0.012477f, -0.011352f, -0.010209f, -0.009085f, -0.008012f, -0.007022f, -0.006141f, -0.005391f, - -0.004787f, -0.004341f, -0.004057f, -0.003932f, -0.003959f, -0.004124f, -0.004408f, -0.004789f, -0.005239f, -0.005729f, -0.006227f, -0.006703f, -0.007125f, -0.007464f, -0.007694f, -0.007791f, -0.007738f, -0.007521f, -0.007133f, -0.006573f, -0.005847f, -0.004964f, -0.003944f, -0.002806f, -0.001580f, -0.000296f, 0.001013f, 0.002311f, 0.003562f, 0.004729f, 0.005778f, 0.006679f, 0.007404f, 0.007929f, 0.008238f, 0.008319f, 0.008169f, 0.007789f, 0.007189f, 0.006385f, 0.005397f, 0.004255f, 0.002989f, 0.001637f, 0.000237f, -0.001170f, -0.002545f, -0.003846f, -0.005036f, -0.006080f, -0.006947f, -0.007613f, -0.008058f, -0.008269f, -0.008240f, -0.007971f, -0.007471f, -0.006754f, -0.005840f, -0.004756f, -0.003532f, -0.002203f, -0.000807f, 0.000619f, 0.002035f, 0.003402f, 0.004684f, 0.005848f, 0.006865f, 0.007710f, 0.008363f, 0.008811f, 0.009047f, 0.009069f, 0.008884f, 0.008501f, 0.007938f, 0.007215f, 0.006357f, 0.005391f, 0.004350f, 0.003262f, 0.002161f, 0.001077f, 0.000037f, -0.000931f, -0.001804f, -0.002565f, -0.003197f, -0.003693f, -0.004045f, -0.004256f, -0.004328f, -0.004271f, -0.004097f, -0.003821f, - -0.003462f, -0.003040f, -0.002574f, -0.002087f, -0.001599f, -0.001129f, -0.000694f, -0.000309f, 0.000014f, 0.000266f, 0.000442f, 0.000539f, 0.000560f, 0.000508f, 0.000391f, 0.000219f, 0.000002f, -0.000245f, -0.000509f, -0.000777f, -0.001035f, -0.001269f, -0.001471f, -0.001629f, -0.001737f, -0.001790f, -0.001787f, -0.001728f, -0.001616f, -0.001456f, -0.001255f, -0.001023f, -0.000770f, -0.000505f, -0.000242f, 0.000010f, 0.000241f, 0.000440f, 0.000602f, 0.000719f, 0.000789f, 0.000810f, 0.000782f, 0.000710f, 0.000598f, 0.000452f, 0.000281f, 0.000096f, 0.003833f, -0.002393f, -0.001550f, -0.010768f, 0.032629f, 0.011306f, -0.044284f, 0.018314f, 0.003978f, 0.038048f, 0.006921f, -0.071210f, -0.029689f, -0.044542f, -0.099327f, 0.020127f, 0.098187f, 0.091075f, 0.086575f, -0.042671f, 0.007877f, 0.078891f, 0.084995f, 0.054082f, -0.021638f, -0.048082f, -0.022392f, -0.071858f, -0.067982f, -0.059163f, 0.033391f, 0.127379f, 0.007895f, 0.018223f, 0.005708f, -0.047327f, -0.074037f, 0.045486f, 0.080097f, 0.109529f, 0.075418f, 0.024993f, -0.049446f, -0.061939f, -0.038186f, 0.006499f, 0.027318f, 0.040559f, - -0.033439f, -0.035134f, -0.033588f, -0.020991f, -0.034200f, 0.145024f, 0.003104f, 0.062410f, -0.002398f, -0.055186f, -0.153519f, 0.085516f, 0.013526f, 0.050198f, 0.080210f, -0.026815f, -0.080563f, -0.105866f, 0.039693f, 0.079955f, 0.053818f, 0.007022f, -0.049899f, -0.040756f, -0.090243f, -0.096030f, 0.014919f, 0.099631f, 0.049712f, -0.117783f, -0.104527f, -0.047732f, -0.058681f, 0.011162f, 0.071316f, 0.042627f, -0.104107f, -0.123039f, -0.013747f, 0.203720f, 0.300154f, 0.163747f, -0.071562f, -0.218673f, -0.226938f, -0.051208f, 0.155922f, 0.185269f, 0.051669f, -0.059647f, -0.090049f, -0.032626f, 0.023640f, 0.050562f, 0.020662f, 0.021180f, -0.064624f, -0.074480f, -0.033960f, 0.015714f, 0.109849f, 0.132771f, 0.140950f, -0.014645f, -0.158302f, -0.188966f, 0.057032f, 0.035205f, 0.090630f, 0.127866f, 0.070389f, -0.005047f, -0.151082f, -0.039095f, 0.060604f, 0.101319f, 0.155564f, 0.015911f, -0.077633f, -0.120064f, -0.128551f, -0.103619f, 0.069509f, 0.194971f, 0.254877f, 0.084847f, -0.134256f, -0.334629f, -0.222454f, 0.004266f, 0.210033f, 0.251997f, 0.137596f, -0.119336f, -0.256430f, -0.239825f, - -0.025960f, 0.182839f, 0.278925f, 0.086432f, -0.206817f, -0.257206f, -0.181695f, 0.010354f, 0.202964f, 0.229244f, 0.098833f, -0.087026f, -0.181307f, -0.141921f, -0.048110f, 0.075799f, 0.114635f, 0.060613f, -0.007091f, -0.085373f, -0.082937f, -0.027346f, 0.088356f, 0.139427f, 0.092503f, -0.030368f, -0.103502f, -0.107065f, -0.020528f, 0.052644f, 0.128449f, 0.060539f, -0.024419f, -0.053943f, -0.053067f, 0.104894f, 0.110330f, -0.030292f, -0.137751f, -0.137278f, 0.001888f, 0.123472f, 0.133148f, -0.007019f, -0.129875f, -0.123791f, 0.026745f, 0.121553f, 0.087812f, -0.059539f, -0.115914f, -0.041189f, 0.084327f, 0.080379f, -0.023472f, -0.085842f, -0.004187f, 0.058332f, 0.012800f, -0.041715f, -0.000345f, 0.009540f, 0.000671f, -0.007229f, 0.003356f, -0.001562f, 0.003583f, -0.001390f, 0.004748f, -0.004077f, 0.001544f, -0.004733f, -0.001209f, -0.004578f, 0.003593f, -0.002046f, 0.008076f, -0.006694f, 0.003824f, -0.000642f, 0.003010f, -0.005633f, 0.003952f, -0.007572f, 0.002614f, -0.004205f, 0.006070f, -0.002496f, 0.004053f, -0.001677f, 0.001551f, -0.006302f, 0.004819f, -0.002902f, 0.002256f, -0.003500f} - } -}; -const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]={NULL,NULL}; - -/* Sample Rate = 32000 */ - -const int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz = 2; -const uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]={{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2} }; -const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS] = {0, 0}; -const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][2]={{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}},{{160, 160},{160, 160}}}; -const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz = 0; -const float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; -const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][320]={ - { - {-0.008122f, -0.007933f, -0.007561f, -0.007019f, -0.006325f, -0.005502f, -0.004578f, -0.003583f, -0.002551f, -0.001514f, -0.000508f, 0.000436f, 0.001287f, 0.002019f, 0.002609f, 0.003042f, 0.003305f, 0.003394f, 0.003309f, 0.003059f, 0.002655f, 0.002117f, 0.001467f, 0.000733f, -0.000055f, -0.000865f, -0.001666f, -0.002426f, -0.003114f, -0.003702f, -0.004167f, -0.004490f, -0.004655f, -0.004654f, -0.004483f, -0.004147f, -0.003653f, -0.003014f, -0.002251f, -0.001386f, -0.000446f, 0.000542f, 0.001546f, 0.002537f, 0.003485f, 0.004362f, 0.005143f, 0.005806f, 0.006334f, 0.006713f, 0.006936f, 0.007001f, 0.006910f, 0.006671f, 0.006296f, 0.005802f, 0.005207f, 0.004535f, 0.003809f, 0.003054f, 0.002295f, 0.001555f, 0.000857f, 0.000219f, -0.000341f, -0.000811f, -0.001184f, -0.001453f, -0.001620f, -0.001687f, -0.001663f, -0.001559f, -0.001387f, -0.001163f, -0.000906f, -0.000631f, -0.000358f, -0.000102f, 0.000122f, 0.000300f, 0.000422f, 0.000482f, 0.000474f, 0.000400f, 0.000261f, 0.000064f, -0.000182f, -0.000465f, -0.000773f, -0.001091f, -0.001403f, -0.001693f, -0.001948f, -0.002154f, -0.002299f, -0.002376f, - -0.002377f, -0.002299f, -0.002145f, -0.001916f, -0.001620f, -0.001268f, -0.000871f, -0.000444f, -0.000003f, 0.000433f, 0.000849f, 0.001227f, 0.001551f, 0.001806f, 0.001982f, 0.002068f, 0.002059f, 0.001952f, 0.001747f, 0.001450f, 0.001067f, 0.000611f, 0.000093f, -0.000470f, -0.001062f, -0.001662f, -0.002254f, -0.002818f, -0.003338f, -0.003797f, -0.004183f, -0.004483f, -0.004691f, -0.004802f, -0.004815f, -0.004731f, -0.004556f, -0.004299f, -0.003971f, -0.003585f, -0.003155f, -0.002698f, -0.002230f, -0.001767f, -0.001324f, -0.000916f, -0.000554f, -0.000247f, -0.000004f, 0.000173f, 0.000281f, 0.000321f, 0.000299f, 0.000222f, 0.000097f, -0.000064f, -0.000250f, -0.000449f, -0.000647f, -0.000833f, -0.000997f, -0.001128f, -0.001220f, -0.001267f, 0.875363f, 0.116654f, -0.661817f, -0.826629f, -0.402369f, 0.289829f, 0.778345f, 0.686075f, 0.186222f, -0.492450f, -0.844907f, -0.700511f, -0.169182f, 0.555413f, 0.804353f, 0.562671f, -0.069029f, -0.621903f, -0.780365f, -0.388504f, 0.216008f, 0.700107f, 0.690873f, 0.205307f, -0.389038f, -0.709940f, -0.532071f, -0.008092f, 0.516830f, 0.685366f, 0.400172f, -0.156796f, - -0.610764f, -0.648564f, -0.248041f, 0.314656f, 0.668118f, 0.566683f, 0.102692f, -0.422984f, -0.610754f, -0.604667f, -0.119204f, 0.439597f, 0.716823f, 0.473525f, -0.083245f, -0.590438f, -0.675436f, -0.303597f, 0.280043f, 0.671094f, 0.603066f, 0.111790f, -0.450470f, -0.697038f, -0.454375f, 0.073947f, 0.530533f, 0.615953f, 0.269348f, -0.258327f, -0.597617f, -0.541078f, -0.092406f, 0.453139f, 0.669282f, 0.437777f, -0.105841f, -0.566799f, -0.652878f, -0.293692f, 0.267762f, 0.638830f, 0.583739f, 0.123852f, -0.428410f, -0.699716f, -0.472827f, 0.049668f, 0.530999f, 0.600521f, 0.268894f, -0.221661f, -0.602731f, -0.548789f, -0.120400f, 0.410229f, 0.655002f, 0.450774f, -0.057538f, -0.539000f, -0.637333f, -0.303133f, 0.211013f, 0.613957f, 0.587101f, 0.181641f, -0.310422f, -0.602883f, -0.500154f, -0.070393f, 0.393613f, 0.576259f, 0.389283f, -0.079276f, -0.470705f, -0.550184f, -0.251642f, 0.225426f, 0.561077f, 0.501491f, 0.089824f, -0.389292f, -0.615716f, -0.388263f, 0.088304f, 0.516718f, 0.604324f, 0.270485f, -0.263414f, -0.628216f, -0.543581f, -0.085300f, 0.418545f, 0.625778f, 0.397591f, -0.104349f, - -0.518155f, -0.566096f, -0.222967f, 0.251693f, 0.549767f, 0.465451f, 0.055175f, -0.371335f, -0.543778f, -0.348676f, 0.082121f, 0.464566f, 0.526323f, 0.227178f, -0.225699f, -0.514528f, -0.445148f, -0.074063f, 0.337702f, 0.505853f, 0.311651f, -0.096507f, -0.447922f, -0.480465f, -0.176267f, 0.237952f, 0.407723f, 0.224503f, -0.015059f, -0.056214f, -0.018457f, -0.003490f}, - {-0.008122f, -0.007933f, -0.007561f, -0.007019f, -0.006325f, -0.005502f, -0.004578f, -0.003583f, -0.002551f, -0.001514f, -0.000508f, 0.000436f, 0.001287f, 0.002019f, 0.002609f, 0.003042f, 0.003305f, 0.003394f, 0.003309f, 0.003059f, 0.002655f, 0.002117f, 0.001467f, 0.000733f, -0.000055f, -0.000865f, -0.001666f, -0.002426f, -0.003114f, -0.003702f, -0.004167f, -0.004490f, -0.004655f, -0.004654f, -0.004483f, -0.004147f, -0.003653f, -0.003014f, -0.002251f, -0.001386f, -0.000446f, 0.000542f, 0.001546f, 0.002537f, 0.003485f, 0.004362f, 0.005143f, 0.005806f, 0.006334f, 0.006713f, 0.006936f, 0.007001f, 0.006910f, 0.006671f, 0.006296f, 0.005802f, 0.005207f, 0.004535f, 0.003809f, 0.003054f, 0.002295f, 0.001555f, 0.000857f, 0.000219f, -0.000341f, -0.000811f, -0.001184f, -0.001453f, -0.001620f, -0.001687f, -0.001663f, -0.001559f, -0.001387f, -0.001163f, -0.000906f, -0.000631f, -0.000358f, -0.000102f, 0.000122f, 0.000300f, 0.000422f, 0.000482f, 0.000474f, 0.000400f, 0.000261f, 0.000064f, -0.000182f, -0.000465f, -0.000773f, -0.001091f, -0.001403f, -0.001693f, -0.001948f, -0.002154f, -0.002299f, -0.002376f, - -0.002377f, -0.002299f, -0.002145f, -0.001916f, -0.001620f, -0.001268f, -0.000871f, -0.000444f, -0.000003f, 0.000433f, 0.000849f, 0.001227f, 0.001551f, 0.001806f, 0.001982f, 0.002068f, 0.002059f, 0.001952f, 0.001747f, 0.001450f, 0.001067f, 0.000611f, 0.000093f, -0.000470f, -0.001062f, -0.001662f, -0.002254f, -0.002818f, -0.003338f, -0.003797f, -0.004183f, -0.004483f, -0.004691f, -0.004802f, -0.004815f, -0.004731f, -0.004556f, -0.004299f, -0.003971f, -0.003585f, -0.003155f, -0.002698f, -0.002230f, -0.001767f, -0.001324f, -0.000916f, -0.000554f, -0.000247f, -0.000004f, 0.000173f, 0.000281f, 0.000321f, 0.000299f, 0.000222f, 0.000097f, -0.000064f, -0.000250f, -0.000449f, -0.000647f, -0.000833f, -0.000997f, -0.001128f, -0.001220f, -0.001267f, 0.875363f, 0.116654f, -0.661817f, -0.826629f, -0.402369f, 0.289829f, 0.778345f, 0.686075f, 0.186222f, -0.492450f, -0.844907f, -0.700511f, -0.169182f, 0.555413f, 0.804353f, 0.562671f, -0.069029f, -0.621903f, -0.780365f, -0.388504f, 0.216008f, 0.700107f, 0.690873f, 0.205307f, -0.389038f, -0.709940f, -0.532071f, -0.008092f, 0.516830f, 0.685366f, 0.400172f, -0.156796f, - -0.610764f, -0.648564f, -0.248041f, 0.314656f, 0.668118f, 0.566683f, 0.102692f, -0.422984f, -0.610754f, -0.604667f, -0.119204f, 0.439597f, 0.716823f, 0.473525f, -0.083245f, -0.590438f, -0.675436f, -0.303597f, 0.280043f, 0.671094f, 0.603066f, 0.111790f, -0.450470f, -0.697038f, -0.454375f, 0.073947f, 0.530533f, 0.615953f, 0.269348f, -0.258327f, -0.597617f, -0.541078f, -0.092406f, 0.453139f, 0.669282f, 0.437777f, -0.105841f, -0.566799f, -0.652878f, -0.293692f, 0.267762f, 0.638830f, 0.583739f, 0.123852f, -0.428410f, -0.699716f, -0.472827f, 0.049668f, 0.530999f, 0.600521f, 0.268894f, -0.221661f, -0.602731f, -0.548789f, -0.120400f, 0.410229f, 0.655002f, 0.450774f, -0.057538f, -0.539000f, -0.637333f, -0.303133f, 0.211013f, 0.613957f, 0.587101f, 0.181641f, -0.310422f, -0.602883f, -0.500154f, -0.070393f, 0.393613f, 0.576259f, 0.389283f, -0.079276f, -0.470705f, -0.550184f, -0.251642f, 0.225426f, 0.561077f, 0.501491f, 0.089824f, -0.389292f, -0.615716f, -0.388263f, 0.088304f, 0.516718f, 0.604324f, 0.270485f, -0.263414f, -0.628216f, -0.543581f, -0.085300f, 0.418545f, 0.625778f, 0.397591f, -0.104349f, - -0.518155f, -0.566096f, -0.222967f, 0.251693f, 0.549767f, 0.465451f, 0.055175f, -0.371335f, -0.543778f, -0.348676f, 0.082121f, 0.464566f, 0.526323f, 0.227178f, -0.225699f, -0.514528f, -0.445148f, -0.074063f, 0.337702f, 0.505853f, 0.311651f, -0.096507f, -0.447922f, -0.480465f, -0.176267f, 0.237952f, 0.407723f, 0.224503f, -0.015059f, -0.056214f, -0.018457f, -0.003490f} - }, - { - {-0.000273f, -0.000358f, -0.000520f, -0.000746f, -0.001017f, -0.001307f, -0.001588f, -0.001829f, -0.001995f, -0.002055f, -0.001978f, -0.001734f, -0.001302f, -0.000663f, 0.000193f, 0.001268f, 0.002558f, 0.004048f, 0.005715f, 0.007530f, 0.009455f, 0.011446f, 0.013453f, 0.015426f, 0.017308f, 0.019047f, 0.020590f, 0.021887f, 0.022896f, 0.023579f, 0.023907f, 0.023862f, 0.023434f, 0.022624f, 0.021445f, 0.019919f, 0.018078f, 0.015965f, 0.013629f, 0.011127f, 0.008519f, 0.005871f, 0.003246f, 0.000710f, -0.001675f, -0.003854f, -0.005775f, -0.007396f, -0.008683f, -0.009612f, -0.010172f, -0.010358f, -0.010181f, -0.009660f, -0.008823f, -0.007708f, -0.006360f, -0.004829f, -0.003170f, -0.001440f, 0.000303f, 0.002004f, 0.003609f, 0.005069f, 0.006343f, 0.007396f, 0.008199f, 0.008735f, 0.008995f, 0.008977f, 0.008692f, 0.008155f, 0.007392f, 0.006432f, 0.005312f, 0.004071f, 0.002750f, 0.001393f, 0.000042f, -0.001263f, -0.002485f, -0.003591f, -0.004554f, -0.005353f, -0.005972f, -0.006402f, -0.006643f, -0.006697f, -0.006575f, -0.006293f, -0.005870f, -0.005329f, -0.004695f, -0.003995f, -0.003257f, -0.002507f, - -0.001769f, -0.001065f, -0.000415f, 0.000165f, 0.000666f, 0.001078f, 0.001399f, 0.001631f, 0.001776f, 0.001844f, 0.001843f, 0.001787f, 0.001687f, 0.001558f, 0.001413f, 0.001264f, 0.001122f, 0.000996f, 0.000892f, 0.000814f, 0.000763f, 0.000737f, 0.000731f, 0.000741f, 0.000757f, 0.000769f, 0.000769f, 0.000746f, 0.000689f, 0.000591f, 0.000444f, 0.000243f, -0.000014f, -0.000327f, -0.000694f, -0.001108f, -0.001561f, -0.002042f, -0.002539f, -0.003036f, -0.003519f, -0.003972f, -0.004378f, -0.004724f, -0.004996f, -0.005184f, -0.005280f, -0.005277f, -0.005175f, -0.004976f, -0.004683f, -0.004307f, -0.003859f, -0.003353f, -0.002807f, -0.002238f, -0.001667f, -0.001113f, -0.000596f, -0.000133f, 0.000259f, 0.000565f, 0.000776f, 0.000883f, 0.102988f, 0.341294f, 0.254497f, -0.391906f, -0.862557f, -0.540368f, 0.349671f, 0.909254f, 0.676052f, 0.030677f, -0.331228f, -0.698406f, -0.236689f, 0.264785f, 0.600240f, 0.465461f, 0.109871f, -0.428379f, -0.589347f, -0.409218f, 0.076928f, 0.452763f, 0.603311f, 0.262857f, -0.271601f, -0.610935f, -0.493932f, -0.122155f, 0.375662f, 0.622425f, 0.459174f, 0.035767f, - -0.486155f, -0.663043f, -0.415330f, 0.142677f, 0.611402f, 0.749182f, 0.314569f, -0.330349f, -0.813922f, -0.564511f, 0.020420f, 0.618496f, 0.798240f, 0.435640f, -0.247700f, -0.750185f, -0.723652f, -0.187242f, 0.431441f, 0.772596f, 0.577686f, 0.009311f, -0.603223f, -0.759479f, -0.425338f, 0.190884f, 0.627938f, 0.666650f, 0.216790f, -0.369183f, -0.713871f, -0.577661f, -0.064936f, 0.453506f, 0.809723f, 0.611234f, -0.008242f, -0.638253f, -0.817010f, -0.472566f, 0.229487f, 0.747722f, 0.795789f, 0.274994f, -0.439120f, -0.845736f, -0.712702f, -0.055994f, 0.602465f, 0.787324f, 0.465691f, -0.137828f, -0.712394f, -0.747138f, -0.262637f, 0.413301f, 0.820724f, 0.650333f, 0.053666f, -0.552595f, -0.818269f, -0.501577f, 0.101368f, 0.679716f, 0.757179f, 0.347880f, -0.300844f, -0.727271f, -0.653682f, -0.124663f, 0.485844f, 0.739138f, 0.521417f, -0.083320f, -0.616491f, -0.729258f, -0.286947f, 0.330731f, 0.741294f, 0.603318f, 0.068560f, -0.526770f, -0.754496f, -0.425907f, 0.209026f, 0.689311f, 0.734710f, 0.282736f, -0.390827f, -0.764154f, -0.614101f, -0.059215f, 0.532938f, 0.757470f, 0.441552f, -0.155480f, - -0.624627f, -0.635188f, -0.220928f, 0.326989f, 0.664776f, 0.523404f, 0.026833f, -0.479936f, -0.651236f, -0.388414f, 0.141286f, 0.583351f, 0.618613f, 0.235517f, -0.300328f, -0.635007f, -0.514926f, -0.030010f, 0.455951f, 0.619030f, 0.363555f, -0.164710f, -0.576657f, -0.579246f, -0.183449f, 0.328783f, 0.516179f, 0.267201f, -0.030584f, -0.073694f, -0.023572f, -0.004919f}, - {0.000273f, 0.000358f, 0.000520f, 0.000746f, 0.001017f, 0.001307f, 0.001588f, 0.001829f, 0.001995f, 0.002055f, 0.001978f, 0.001734f, 0.001302f, 0.000663f, -0.000193f, -0.001268f, -0.002558f, -0.004048f, -0.005715f, -0.007530f, -0.009455f, -0.011446f, -0.013453f, -0.015426f, -0.017308f, -0.019047f, -0.020590f, -0.021887f, -0.022896f, -0.023579f, -0.023907f, -0.023862f, -0.023434f, -0.022624f, -0.021445f, -0.019919f, -0.018078f, -0.015965f, -0.013629f, -0.011127f, -0.008519f, -0.005871f, -0.003246f, -0.000710f, 0.001675f, 0.003854f, 0.005775f, 0.007396f, 0.008683f, 0.009612f, 0.010172f, 0.010358f, 0.010181f, 0.009660f, 0.008823f, 0.007708f, 0.006360f, 0.004829f, 0.003170f, 0.001440f, -0.000303f, -0.002004f, -0.003609f, -0.005069f, -0.006343f, -0.007396f, -0.008199f, -0.008735f, -0.008995f, -0.008977f, -0.008692f, -0.008155f, -0.007392f, -0.006432f, -0.005312f, -0.004071f, -0.002750f, -0.001393f, -0.000042f, 0.001263f, 0.002485f, 0.003591f, 0.004554f, 0.005353f, 0.005972f, 0.006402f, 0.006643f, 0.006697f, 0.006575f, 0.006293f, 0.005870f, 0.005329f, 0.004695f, 0.003995f, 0.003257f, 0.002507f, - 0.001769f, 0.001065f, 0.000415f, -0.000165f, -0.000666f, -0.001078f, -0.001399f, -0.001631f, -0.001776f, -0.001844f, -0.001843f, -0.001787f, -0.001687f, -0.001558f, -0.001413f, -0.001264f, -0.001122f, -0.000996f, -0.000892f, -0.000814f, -0.000763f, -0.000737f, -0.000731f, -0.000741f, -0.000757f, -0.000769f, -0.000769f, -0.000746f, -0.000689f, -0.000591f, -0.000444f, -0.000243f, 0.000014f, 0.000327f, 0.000694f, 0.001108f, 0.001561f, 0.002042f, 0.002539f, 0.003036f, 0.003519f, 0.003972f, 0.004378f, 0.004724f, 0.004996f, 0.005184f, 0.005280f, 0.005277f, 0.005175f, 0.004976f, 0.004683f, 0.004307f, 0.003859f, 0.003353f, 0.002807f, 0.002238f, 0.001667f, 0.001113f, 0.000596f, 0.000133f, -0.000259f, -0.000565f, -0.000776f, -0.000883f, -0.102988f, -0.341294f, -0.254497f, 0.391906f, 0.862557f, 0.540368f, -0.349671f, -0.909254f, -0.676052f, -0.030677f, 0.331228f, 0.698406f, 0.236689f, -0.264785f, -0.600240f, -0.465461f, -0.109871f, 0.428379f, 0.589347f, 0.409218f, -0.076928f, -0.452763f, -0.603311f, -0.262857f, 0.271601f, 0.610935f, 0.493932f, 0.122155f, -0.375662f, -0.622425f, -0.459174f, -0.035767f, - 0.486155f, 0.663043f, 0.415330f, -0.142677f, -0.611402f, -0.749182f, -0.314569f, 0.330349f, 0.813922f, 0.564511f, -0.020420f, -0.618496f, -0.798240f, -0.435640f, 0.247700f, 0.750185f, 0.723652f, 0.187242f, -0.431441f, -0.772596f, -0.577686f, -0.009311f, 0.603223f, 0.759479f, 0.425338f, -0.190884f, -0.627938f, -0.666650f, -0.216790f, 0.369183f, 0.713871f, 0.577661f, 0.064936f, -0.453506f, -0.809723f, -0.611234f, 0.008242f, 0.638253f, 0.817010f, 0.472566f, -0.229487f, -0.747722f, -0.795789f, -0.274994f, 0.439120f, 0.845736f, 0.712702f, 0.055994f, -0.602465f, -0.787324f, -0.465691f, 0.137828f, 0.712394f, 0.747138f, 0.262637f, -0.413301f, -0.820724f, -0.650333f, -0.053666f, 0.552595f, 0.818269f, 0.501577f, -0.101368f, -0.679716f, -0.757179f, -0.347880f, 0.300844f, 0.727271f, 0.653682f, 0.124663f, -0.485844f, -0.739138f, -0.521417f, 0.083320f, 0.616491f, 0.729258f, 0.286947f, -0.330731f, -0.741294f, -0.603318f, -0.068560f, 0.526770f, 0.754496f, 0.425907f, -0.209026f, -0.689311f, -0.734710f, -0.282736f, 0.390827f, 0.764154f, 0.614101f, 0.059215f, -0.532938f, -0.757470f, -0.441552f, 0.155480f, - 0.624627f, 0.635188f, 0.220928f, -0.326989f, -0.664776f, -0.523404f, -0.026833f, 0.479936f, 0.651236f, 0.388414f, -0.141286f, -0.583351f, -0.618613f, -0.235517f, 0.300328f, 0.635007f, 0.514926f, 0.030010f, -0.455951f, -0.619030f, -0.363555f, 0.164710f, 0.576657f, 0.579246f, 0.183449f, -0.328783f, -0.516179f, -0.267201f, 0.030584f, 0.073694f, 0.023572f, 0.004919f} - }, - { - {0.059356f, 0.058918f, 0.058045f, 0.056742f, 0.055018f, 0.052885f, 0.050359f, 0.047458f, 0.044207f, 0.040633f, 0.036770f, 0.032655f, 0.028332f, 0.023848f, 0.019257f, 0.014615f, 0.009983f, 0.005423f, 0.001002f, -0.003216f, -0.007164f, -0.010780f, -0.014005f, -0.016783f, -0.019066f, -0.020814f, -0.021996f, -0.022592f, -0.022591f, -0.021996f, -0.020822f, -0.019095f, -0.016856f, -0.014154f, -0.011051f, -0.007618f, -0.003934f, -0.000083f, 0.003845f, 0.007760f, 0.011570f, 0.015188f, 0.018529f, 0.021517f, 0.024084f, 0.026173f, 0.027739f, 0.028749f, 0.029187f, 0.029049f, 0.028346f, 0.027106f, 0.025366f, 0.023179f, 0.020608f, 0.017724f, 0.014606f, 0.011338f, 0.008007f, 0.004699f, 0.001498f, -0.001515f, -0.004266f, -0.006691f, -0.008735f, -0.010354f, -0.011517f, -0.012206f, -0.012415f, -0.012153f, -0.011440f, -0.010309f, -0.008803f, -0.006972f, -0.004877f, -0.002581f, -0.000152f, 0.002341f, 0.004829f, 0.007246f, 0.009530f, 0.011626f, 0.013485f, 0.015066f, 0.016339f, 0.017283f, 0.017887f, 0.018148f, 0.018075f, 0.017685f, 0.017001f, 0.016057f, 0.014888f, 0.013535f, 0.012042f, 0.010455f, - 0.008818f, 0.007174f, 0.005564f, 0.004026f, 0.002591f, 0.001287f, 0.000135f, -0.000850f, -0.001658f, -0.002286f, -0.002736f, -0.003016f, -0.003136f, -0.003113f, -0.002964f, -0.002710f, -0.002371f, -0.001969f, -0.001525f, -0.001059f, -0.000589f, -0.000130f, 0.000304f, 0.000704f, 0.001062f, 0.001373f, 0.001636f, 0.001852f, 0.002023f, 0.002155f, 0.002253f, 0.002324f, 0.002376f, 0.002416f, 0.002450f, 0.002485f, 0.002527f, 0.002578f, 0.002641f, 0.002719f, 0.002809f, 0.002912f, 0.003026f, 0.003145f, 0.003268f, 0.003390f, 0.003507f, 0.003615f, 0.003711f, 0.003791f, 0.003854f, 0.003899f, 0.003925f, 0.003934f, 0.003926f, 0.003905f, 0.003874f, 0.003835f, 0.003793f, 0.003751f, 0.003712f, 0.003681f, 0.003658f, 0.003646f, 0.025435f, -0.047501f, -0.206609f, -0.180773f, 0.076618f, 0.007264f, -0.166264f, -0.202849f, -0.245013f, -0.225976f, -0.104578f, 0.272204f, 0.124939f, 0.081930f, 0.216268f, -0.010555f, -0.079365f, -0.139618f, -0.035045f, -0.030516f, 0.087447f, 0.152968f, 0.251964f, 0.072578f, -0.132006f, -0.186124f, 0.029938f, 0.162010f, 0.228747f, 0.120886f, -0.019444f, -0.224763f, - -0.168052f, -0.058201f, 0.178736f, 0.240274f, 0.161280f, -0.082940f, -0.165587f, -0.176223f, 0.041225f, -0.196959f, -0.142288f, -0.004056f, 0.188594f, 0.191543f, 0.081427f, -0.126895f, -0.228758f, -0.207334f, 0.057669f, 0.248634f, 0.308111f, 0.142612f, -0.137366f, -0.397413f, -0.321543f, 0.012304f, 0.416471f, 0.512123f, 0.289699f, -0.186465f, -0.492982f, -0.494032f, -0.057562f, 0.388446f, 0.467916f, 0.122419f, -0.298982f, -0.492849f, -0.282425f, 0.102427f, 0.381377f, 0.379549f, 0.064660f, -0.262880f, -0.364571f, -0.233805f, 0.157811f, 0.329797f, 0.262631f, 0.013266f, -0.235415f, -0.319442f, -0.151267f, 0.078810f, 0.253781f, 0.217149f, 0.038698f, -0.127112f, -0.203217f, -0.150585f, -0.030391f, 0.046557f, 0.133111f, 0.108005f, -0.003642f, -0.090809f, -0.150407f, -0.077790f, 0.128890f, 0.251654f, 0.192947f, -0.014988f, -0.287307f, -0.327209f, -0.124433f, 0.167411f, 0.336493f, 0.284586f, 0.024757f, -0.237824f, -0.300271f, -0.160975f, 0.128004f, 0.256220f, 0.237250f, 0.031573f, -0.149200f, -0.246673f, -0.124003f, 0.006675f, 0.131374f, 0.169499f, 0.091640f, -0.009052f, -0.065511f, -0.097672f, - -0.092451f, -0.052411f, 0.028642f, 0.073811f, 0.086550f, 0.036878f, -0.028675f, -0.087544f, -0.082915f, -0.041597f, 0.032600f, 0.095675f, 0.076272f, 0.020556f, -0.045808f, -0.072406f, -0.047495f, -0.007953f, 0.051857f, 0.073567f, 0.024330f, -0.009503f, -0.048483f, -0.045138f, -0.010428f, 0.031531f, 0.045241f, 0.008668f, -0.006942f, -0.007100f, -0.002881f, -0.000993f}, - {0.059356f, 0.058918f, 0.058045f, 0.056742f, 0.055018f, 0.052885f, 0.050359f, 0.047458f, 0.044207f, 0.040633f, 0.036770f, 0.032655f, 0.028332f, 0.023848f, 0.019257f, 0.014615f, 0.009983f, 0.005423f, 0.001002f, -0.003216f, -0.007164f, -0.010780f, -0.014005f, -0.016783f, -0.019066f, -0.020814f, -0.021996f, -0.022592f, -0.022591f, -0.021996f, -0.020822f, -0.019095f, -0.016856f, -0.014154f, -0.011051f, -0.007618f, -0.003934f, -0.000083f, 0.003845f, 0.007760f, 0.011570f, 0.015188f, 0.018529f, 0.021517f, 0.024084f, 0.026173f, 0.027739f, 0.028749f, 0.029187f, 0.029049f, 0.028346f, 0.027106f, 0.025366f, 0.023179f, 0.020608f, 0.017724f, 0.014606f, 0.011338f, 0.008007f, 0.004699f, 0.001498f, -0.001515f, -0.004266f, -0.006691f, -0.008735f, -0.010354f, -0.011517f, -0.012206f, -0.012415f, -0.012153f, -0.011440f, -0.010309f, -0.008803f, -0.006972f, -0.004877f, -0.002581f, -0.000152f, 0.002341f, 0.004829f, 0.007246f, 0.009530f, 0.011626f, 0.013485f, 0.015066f, 0.016339f, 0.017283f, 0.017887f, 0.018148f, 0.018075f, 0.017685f, 0.017001f, 0.016057f, 0.014888f, 0.013535f, 0.012042f, 0.010455f, - 0.008818f, 0.007174f, 0.005564f, 0.004026f, 0.002591f, 0.001287f, 0.000135f, -0.000850f, -0.001658f, -0.002286f, -0.002736f, -0.003016f, -0.003136f, -0.003113f, -0.002964f, -0.002710f, -0.002371f, -0.001969f, -0.001525f, -0.001059f, -0.000589f, -0.000130f, 0.000304f, 0.000704f, 0.001062f, 0.001373f, 0.001636f, 0.001852f, 0.002023f, 0.002155f, 0.002253f, 0.002324f, 0.002376f, 0.002416f, 0.002450f, 0.002485f, 0.002527f, 0.002578f, 0.002641f, 0.002719f, 0.002809f, 0.002912f, 0.003026f, 0.003145f, 0.003268f, 0.003390f, 0.003507f, 0.003615f, 0.003711f, 0.003791f, 0.003854f, 0.003899f, 0.003925f, 0.003934f, 0.003926f, 0.003905f, 0.003874f, 0.003835f, 0.003793f, 0.003751f, 0.003712f, 0.003681f, 0.003658f, 0.003646f, 0.025435f, -0.047501f, -0.206609f, -0.180773f, 0.076618f, 0.007264f, -0.166264f, -0.202849f, -0.245013f, -0.225976f, -0.104578f, 0.272204f, 0.124939f, 0.081930f, 0.216268f, -0.010555f, -0.079365f, -0.139618f, -0.035045f, -0.030516f, 0.087447f, 0.152968f, 0.251964f, 0.072578f, -0.132006f, -0.186124f, 0.029938f, 0.162010f, 0.228747f, 0.120886f, -0.019444f, -0.224763f, - -0.168052f, -0.058201f, 0.178736f, 0.240274f, 0.161280f, -0.082940f, -0.165587f, -0.176223f, 0.041225f, -0.196959f, -0.142288f, -0.004056f, 0.188594f, 0.191543f, 0.081427f, -0.126895f, -0.228758f, -0.207334f, 0.057669f, 0.248634f, 0.308111f, 0.142612f, -0.137366f, -0.397413f, -0.321543f, 0.012304f, 0.416471f, 0.512123f, 0.289699f, -0.186465f, -0.492982f, -0.494032f, -0.057562f, 0.388446f, 0.467916f, 0.122419f, -0.298982f, -0.492849f, -0.282425f, 0.102427f, 0.381377f, 0.379549f, 0.064660f, -0.262880f, -0.364571f, -0.233805f, 0.157811f, 0.329797f, 0.262631f, 0.013266f, -0.235415f, -0.319442f, -0.151267f, 0.078810f, 0.253781f, 0.217149f, 0.038698f, -0.127112f, -0.203217f, -0.150585f, -0.030391f, 0.046557f, 0.133111f, 0.108005f, -0.003642f, -0.090809f, -0.150407f, -0.077790f, 0.128890f, 0.251654f, 0.192947f, -0.014988f, -0.287307f, -0.327209f, -0.124433f, 0.167411f, 0.336493f, 0.284586f, 0.024757f, -0.237824f, -0.300271f, -0.160975f, 0.128004f, 0.256220f, 0.237250f, 0.031573f, -0.149200f, -0.246673f, -0.124003f, 0.006675f, 0.131374f, 0.169499f, 0.091640f, -0.009052f, -0.065511f, -0.097672f, - -0.092451f, -0.052411f, 0.028642f, 0.073811f, 0.086550f, 0.036878f, -0.028675f, -0.087544f, -0.082915f, -0.041597f, 0.032600f, 0.095675f, 0.076272f, 0.020556f, -0.045808f, -0.072406f, -0.047495f, -0.007953f, 0.051857f, 0.073567f, 0.024330f, -0.009503f, -0.048483f, -0.045138f, -0.010428f, 0.031531f, 0.045241f, 0.008668f, -0.006942f, -0.007100f, -0.002881f, -0.000993f} - }, - { - {0.053625f, 0.052866f, 0.051368f, 0.049170f, 0.046329f, 0.042918f, 0.039023f, 0.034745f, 0.030190f, 0.025471f, 0.020704f, 0.016002f, 0.011474f, 0.007223f, 0.003339f, -0.000098f, -0.003026f, -0.005398f, -0.007185f, -0.008378f, -0.008983f, -0.009027f, -0.008552f, -0.007615f, -0.006285f, -0.004645f, -0.002780f, -0.000785f, 0.001246f, 0.003222f, 0.005052f, 0.006656f, 0.007962f, 0.008912f, 0.009459f, 0.009574f, 0.009241f, 0.008462f, 0.007255f, 0.005653f, 0.003703f, 0.001463f, -0.000996f, -0.003599f, -0.006261f, -0.008899f, -0.011428f, -0.013766f, -0.015839f, -0.017578f, -0.018928f, -0.019844f, -0.020294f, -0.020265f, -0.019753f, -0.018775f, -0.017358f, -0.015546f, -0.013394f, -0.010967f, -0.008340f, -0.005593f, -0.002809f, -0.000075f, 0.002529f, 0.004922f, 0.007034f, 0.008800f, 0.010169f, 0.011101f, 0.011570f, 0.011564f, 0.011086f, 0.010152f, 0.008795f, 0.007057f, 0.004995f, 0.002671f, 0.000160f, -0.002463f, -0.005116f, -0.007719f, -0.010194f, -0.012465f, -0.014467f, -0.016138f, -0.017432f, -0.018311f, -0.018750f, -0.018740f, -0.018282f, -0.017393f, -0.016100f, -0.014445f, -0.012478f, -0.010258f, - -0.007851f, -0.005328f, -0.002762f, -0.000228f, 0.002203f, 0.004463f, 0.006489f, 0.008228f, 0.009634f, 0.010673f, 0.011321f, 0.011567f, 0.011411f, 0.010866f, 0.009955f, 0.008712f, 0.007181f, 0.005413f, 0.003464f, 0.001397f, -0.000724f, -0.002835f, -0.004872f, -0.006776f, -0.008491f, -0.009969f, -0.011170f, -0.012061f, -0.012620f, -0.012835f, -0.012705f, -0.012239f, -0.011454f, -0.010378f, -0.009045f, -0.007498f, -0.005785f, -0.003955f, -0.002062f, -0.000161f, 0.001697f, 0.003461f, 0.005087f, 0.006533f, 0.007766f, 0.008761f, 0.009499f, 0.009972f, 0.010178f, 0.010127f, 0.009834f, 0.009323f, 0.008624f, 0.007772f, 0.006808f, 0.005773f, 0.004712f, 0.003667f, 0.002682f, 0.001795f, 0.001040f, 0.000447f, 0.000039f, -0.000170f, 0.050249f, 0.048348f, -0.032902f, -0.133252f, -0.051827f, 0.061902f, -0.065834f, -0.089043f, -0.086938f, -0.054330f, -0.271254f, 0.096964f, -0.267374f, -0.263896f, 0.129482f, 0.546273f, 0.617687f, 0.273155f, -0.174560f, -0.533387f, -0.553862f, -0.047249f, 0.546821f, 0.739409f, 0.437574f, -0.182795f, -0.701297f, -0.782666f, -0.179700f, 0.531033f, 0.909401f, 0.572299f, - -0.135054f, -0.739309f, -0.743548f, -0.233507f, 0.430979f, 0.757620f, 0.447458f, -0.113912f, -0.697241f, -0.285283f, 0.200104f, 0.551926f, 0.527428f, 0.167191f, -0.279300f, -0.511028f, -0.414285f, -0.035132f, 0.341541f, 0.439386f, 0.261744f, -0.072803f, -0.320505f, -0.349316f, -0.137322f, 0.104548f, 0.287208f, 0.269386f, 0.083129f, -0.148946f, -0.281713f, -0.207672f, -0.018923f, 0.102224f, 0.321176f, 0.236280f, 0.042425f, -0.219756f, -0.217805f, -0.072498f, 0.123498f, 0.179293f, 0.116213f, -0.050582f, -0.138022f, -0.073945f, 0.036296f, 0.153541f, 0.153026f, 0.014050f, -0.140485f, -0.160171f, -0.061968f, 0.112086f, 0.260109f, 0.180126f, 0.031071f, -0.154900f, -0.163696f, -0.024447f, 0.058056f, 0.095424f, 0.048401f, -0.039236f, -0.025341f, -0.025501f, 0.061017f, 0.031721f, -0.120208f, -0.222734f, -0.180850f, 0.017131f, 0.223191f, 0.273290f, 0.085660f, -0.173557f, -0.344212f, -0.229181f, 0.092056f, 0.346337f, 0.343069f, 0.091950f, -0.246870f, -0.397226f, -0.330350f, 0.031617f, 0.369979f, 0.427147f, 0.130983f, -0.260862f, -0.436429f, -0.309947f, 0.028984f, 0.323668f, 0.385342f, 0.170831f, - -0.141426f, -0.359796f, -0.310746f, -0.043311f, 0.254655f, 0.384138f, 0.214884f, -0.062321f, -0.328198f, -0.348665f, -0.119870f, 0.201613f, 0.352533f, 0.283046f, -0.012735f, -0.253267f, -0.340710f, -0.212202f, 0.049709f, 0.279291f, 0.281016f, 0.089799f, -0.147975f, -0.291692f, -0.212827f, 0.000441f, 0.200148f, 0.196099f, 0.046973f, -0.016103f, -0.005004f, 0.002778f}, - {0.053625f, 0.052866f, 0.051368f, 0.049170f, 0.046329f, 0.042918f, 0.039023f, 0.034745f, 0.030190f, 0.025471f, 0.020704f, 0.016002f, 0.011474f, 0.007223f, 0.003339f, -0.000098f, -0.003026f, -0.005398f, -0.007185f, -0.008378f, -0.008983f, -0.009027f, -0.008552f, -0.007615f, -0.006285f, -0.004645f, -0.002780f, -0.000785f, 0.001246f, 0.003222f, 0.005052f, 0.006656f, 0.007962f, 0.008912f, 0.009459f, 0.009574f, 0.009241f, 0.008462f, 0.007255f, 0.005653f, 0.003703f, 0.001463f, -0.000996f, -0.003599f, -0.006261f, -0.008899f, -0.011428f, -0.013766f, -0.015839f, -0.017578f, -0.018928f, -0.019844f, -0.020294f, -0.020265f, -0.019753f, -0.018775f, -0.017358f, -0.015546f, -0.013394f, -0.010967f, -0.008340f, -0.005593f, -0.002809f, -0.000075f, 0.002529f, 0.004922f, 0.007034f, 0.008800f, 0.010169f, 0.011101f, 0.011570f, 0.011564f, 0.011086f, 0.010152f, 0.008795f, 0.007057f, 0.004995f, 0.002671f, 0.000160f, -0.002463f, -0.005116f, -0.007719f, -0.010194f, -0.012465f, -0.014467f, -0.016138f, -0.017432f, -0.018311f, -0.018750f, -0.018740f, -0.018282f, -0.017393f, -0.016100f, -0.014445f, -0.012478f, -0.010258f, - -0.007851f, -0.005328f, -0.002762f, -0.000228f, 0.002203f, 0.004463f, 0.006489f, 0.008228f, 0.009634f, 0.010673f, 0.011321f, 0.011567f, 0.011411f, 0.010866f, 0.009955f, 0.008712f, 0.007181f, 0.005413f, 0.003464f, 0.001397f, -0.000724f, -0.002835f, -0.004872f, -0.006776f, -0.008491f, -0.009969f, -0.011170f, -0.012061f, -0.012620f, -0.012835f, -0.012705f, -0.012239f, -0.011454f, -0.010378f, -0.009045f, -0.007498f, -0.005785f, -0.003955f, -0.002062f, -0.000161f, 0.001697f, 0.003461f, 0.005087f, 0.006533f, 0.007766f, 0.008761f, 0.009499f, 0.009972f, 0.010178f, 0.010127f, 0.009834f, 0.009323f, 0.008624f, 0.007772f, 0.006808f, 0.005773f, 0.004712f, 0.003667f, 0.002682f, 0.001795f, 0.001040f, 0.000447f, 0.000039f, -0.000170f, 0.050249f, 0.048348f, -0.032902f, -0.133252f, -0.051827f, 0.061902f, -0.065834f, -0.089043f, -0.086938f, -0.054330f, -0.271254f, 0.096964f, -0.267374f, -0.263896f, 0.129482f, 0.546273f, 0.617687f, 0.273155f, -0.174560f, -0.533387f, -0.553862f, -0.047249f, 0.546821f, 0.739409f, 0.437574f, -0.182795f, -0.701297f, -0.782666f, -0.179700f, 0.531033f, 0.909401f, 0.572299f, - -0.135054f, -0.739309f, -0.743548f, -0.233507f, 0.430979f, 0.757620f, 0.447458f, -0.113912f, -0.697241f, -0.285283f, 0.200104f, 0.551926f, 0.527428f, 0.167191f, -0.279300f, -0.511028f, -0.414285f, -0.035132f, 0.341541f, 0.439386f, 0.261744f, -0.072803f, -0.320505f, -0.349316f, -0.137322f, 0.104548f, 0.287208f, 0.269386f, 0.083129f, -0.148946f, -0.281713f, -0.207672f, -0.018923f, 0.102224f, 0.321176f, 0.236280f, 0.042425f, -0.219756f, -0.217805f, -0.072498f, 0.123498f, 0.179293f, 0.116213f, -0.050582f, -0.138022f, -0.073945f, 0.036296f, 0.153541f, 0.153026f, 0.014050f, -0.140485f, -0.160171f, -0.061968f, 0.112086f, 0.260109f, 0.180126f, 0.031071f, -0.154900f, -0.163696f, -0.024447f, 0.058056f, 0.095424f, 0.048401f, -0.039236f, -0.025341f, -0.025501f, 0.061017f, 0.031721f, -0.120208f, -0.222734f, -0.180850f, 0.017131f, 0.223191f, 0.273290f, 0.085660f, -0.173557f, -0.344212f, -0.229181f, 0.092056f, 0.346337f, 0.343069f, 0.091950f, -0.246870f, -0.397226f, -0.330350f, 0.031617f, 0.369979f, 0.427147f, 0.130983f, -0.260862f, -0.436429f, -0.309947f, 0.028984f, 0.323668f, 0.385342f, 0.170831f, - -0.141426f, -0.359796f, -0.310746f, -0.043311f, 0.254655f, 0.384138f, 0.214884f, -0.062321f, -0.328198f, -0.348665f, -0.119870f, 0.201613f, 0.352533f, 0.283046f, -0.012735f, -0.253267f, -0.340710f, -0.212202f, 0.049709f, 0.279291f, 0.281016f, 0.089799f, -0.147975f, -0.291692f, -0.212827f, 0.000441f, 0.200148f, 0.196099f, 0.046973f, -0.016103f, -0.005004f, 0.002778f} - }, - { - {0.041404f, 0.041181f, 0.040735f, 0.040068f, 0.039181f, 0.038078f, 0.036763f, 0.035243f, 0.033527f, 0.031627f, 0.029558f, 0.027339f, 0.024993f, 0.022545f, 0.020028f, 0.017474f, 0.014920f, 0.012407f, 0.009975f, 0.007665f, 0.005521f, 0.003582f, 0.001885f, 0.000465f, -0.000651f, -0.001440f, -0.001887f, -0.001986f, -0.001739f, -0.001156f, -0.000259f, 0.000924f, 0.002354f, 0.003985f, 0.005764f, 0.007634f, 0.009531f, 0.011392f, 0.013150f, 0.014743f, 0.016111f, 0.017197f, 0.017955f, 0.018344f, 0.018334f, 0.017906f, 0.017053f, 0.015780f, 0.014102f, 0.012048f, 0.009657f, 0.006977f, 0.004066f, 0.000987f, -0.002192f, -0.005397f, -0.008559f, -0.011606f, -0.014472f, -0.017094f, -0.019419f, -0.021403f, -0.023011f, -0.024218f, -0.025013f, -0.025397f, -0.025380f, -0.024986f, -0.024246f, -0.023202f, -0.021903f, -0.020403f, -0.018758f, -0.017029f, -0.015274f, -0.013548f, -0.011903f, -0.010384f, -0.009031f, -0.007873f, -0.006930f, -0.006214f, -0.005725f, -0.005456f, -0.005389f, -0.005500f, -0.005758f, -0.006126f, -0.006565f, -0.007033f, -0.007489f, -0.007894f, -0.008211f, -0.008410f, -0.008465f, -0.008359f, - -0.008083f, -0.007635f, -0.007021f, -0.006257f, -0.005365f, -0.004374f, -0.003317f, -0.002232f, -0.001159f, -0.000140f, 0.000786f, 0.001581f, 0.002214f, 0.002656f, 0.002888f, 0.002895f, 0.002675f, 0.002230f, 0.001573f, 0.000725f, -0.000284f, -0.001422f, -0.002646f, -0.003913f, -0.005176f, -0.006389f, -0.007505f, -0.008481f, -0.009279f, -0.009864f, -0.010212f, -0.010304f, -0.010130f, -0.009691f, -0.008994f, -0.008057f, -0.006906f, -0.005572f, -0.004093f, -0.002513f, -0.000877f, 0.000768f, 0.002376f, 0.003903f, 0.005308f, 0.006555f, 0.007615f, 0.008468f, 0.009098f, 0.009501f, 0.009680f, 0.009647f, 0.009419f, 0.009023f, 0.008491f, 0.007857f, 0.007161f, 0.006441f, 0.005737f, 0.005085f, 0.004520f, 0.004069f, 0.003756f, 0.003595f, -0.008836f, -0.013947f, -0.011734f, -0.019741f, -0.084781f, -0.068486f, -0.074672f, 0.005801f, -0.068220f, -0.035320f, -0.113818f, 0.025063f, -0.100212f, -0.161553f, 0.090443f, 0.307023f, 0.230631f, 0.193338f, -0.085542f, -0.256562f, -0.088782f, -0.069616f, 0.161908f, 0.143692f, 0.081446f, -0.108797f, -0.219084f, -0.183631f, 0.035419f, 0.217078f, 0.277572f, 0.148960f, - -0.077514f, -0.379229f, -0.269153f, 0.110752f, 0.336897f, 0.322305f, 0.115919f, -0.214207f, -0.406310f, -0.119649f, 0.205301f, 0.360085f, 0.307915f, 0.030391f, -0.224748f, -0.290953f, -0.230695f, -0.083741f, 0.191810f, 0.256304f, 0.249502f, 0.006366f, -0.133890f, -0.289349f, -0.121593f, -0.013026f, 0.252172f, 0.282690f, 0.022936f, 0.006124f, -0.201204f, -0.264997f, -0.098130f, 0.187715f, 0.257124f, 0.123241f, -0.144308f, -0.318128f, -0.223143f, -0.006095f, 0.175533f, 0.299275f, 0.196213f, -0.081491f, -0.264732f, -0.265901f, 0.040931f, 0.221500f, 0.275122f, 0.198737f, -0.144336f, -0.297062f, -0.244960f, 0.042707f, 0.229949f, 0.266618f, 0.068954f, -0.175800f, -0.243310f, -0.105423f, 0.057597f, 0.091762f, -0.006985f, -0.079265f, -0.051572f, -0.011031f, 0.063336f, 0.023698f, -0.117553f, -0.174823f, -0.151150f, 0.008448f, 0.145491f, 0.202448f, 0.074955f, -0.077028f, -0.245274f, -0.212254f, -0.062183f, 0.111539f, 0.268934f, 0.230586f, -0.041415f, -0.228907f, -0.204211f, -0.056961f, 0.188204f, 0.210330f, 0.096438f, 0.013180f, -0.229251f, -0.212336f, -0.115388f, 0.057396f, 0.170929f, 0.135953f, - -0.008739f, -0.093660f, -0.109893f, -0.030024f, 0.041695f, 0.097382f, 0.061194f, 0.002393f, -0.066722f, -0.131433f, -0.072092f, 0.034941f, 0.081100f, 0.094303f, 0.017674f, -0.043325f, -0.087348f, -0.099424f, -0.043012f, 0.030806f, 0.062464f, 0.031543f, -0.014017f, -0.042408f, -0.029252f, -0.013344f, 0.037483f, 0.053543f, 0.019193f, -0.004597f, 0.000627f, 0.001527f}, - {-0.041404f, -0.041181f, -0.040735f, -0.040068f, -0.039181f, -0.038078f, -0.036763f, -0.035243f, -0.033527f, -0.031627f, -0.029558f, -0.027339f, -0.024993f, -0.022545f, -0.020028f, -0.017474f, -0.014920f, -0.012407f, -0.009975f, -0.007665f, -0.005521f, -0.003582f, -0.001885f, -0.000465f, 0.000651f, 0.001440f, 0.001887f, 0.001986f, 0.001739f, 0.001156f, 0.000259f, -0.000924f, -0.002354f, -0.003985f, -0.005764f, -0.007634f, -0.009531f, -0.011392f, -0.013150f, -0.014743f, -0.016111f, -0.017197f, -0.017955f, -0.018344f, -0.018334f, -0.017906f, -0.017053f, -0.015780f, -0.014102f, -0.012048f, -0.009657f, -0.006977f, -0.004066f, -0.000987f, 0.002192f, 0.005397f, 0.008559f, 0.011606f, 0.014472f, 0.017094f, 0.019419f, 0.021403f, 0.023011f, 0.024218f, 0.025013f, 0.025397f, 0.025380f, 0.024986f, 0.024246f, 0.023202f, 0.021903f, 0.020403f, 0.018758f, 0.017029f, 0.015274f, 0.013548f, 0.011903f, 0.010384f, 0.009031f, 0.007873f, 0.006930f, 0.006214f, 0.005725f, 0.005456f, 0.005389f, 0.005500f, 0.005758f, 0.006126f, 0.006565f, 0.007033f, 0.007489f, 0.007894f, 0.008211f, 0.008410f, 0.008465f, 0.008359f, - 0.008083f, 0.007635f, 0.007021f, 0.006257f, 0.005365f, 0.004374f, 0.003317f, 0.002232f, 0.001159f, 0.000140f, -0.000786f, -0.001581f, -0.002214f, -0.002656f, -0.002888f, -0.002895f, -0.002675f, -0.002230f, -0.001573f, -0.000725f, 0.000284f, 0.001422f, 0.002646f, 0.003913f, 0.005176f, 0.006389f, 0.007505f, 0.008481f, 0.009279f, 0.009864f, 0.010212f, 0.010304f, 0.010130f, 0.009691f, 0.008994f, 0.008057f, 0.006906f, 0.005572f, 0.004093f, 0.002513f, 0.000877f, -0.000768f, -0.002376f, -0.003903f, -0.005308f, -0.006555f, -0.007615f, -0.008468f, -0.009098f, -0.009501f, -0.009680f, -0.009647f, -0.009419f, -0.009023f, -0.008491f, -0.007857f, -0.007161f, -0.006441f, -0.005737f, -0.005085f, -0.004520f, -0.004069f, -0.003756f, -0.003595f, 0.008836f, 0.013947f, 0.011734f, 0.019741f, 0.084781f, 0.068486f, 0.074672f, -0.005801f, 0.068220f, 0.035320f, 0.113818f, -0.025063f, 0.100212f, 0.161553f, -0.090443f, -0.307023f, -0.230631f, -0.193338f, 0.085542f, 0.256562f, 0.088782f, 0.069616f, -0.161908f, -0.143692f, -0.081446f, 0.108797f, 0.219084f, 0.183631f, -0.035419f, -0.217078f, -0.277572f, -0.148960f, - 0.077514f, 0.379229f, 0.269153f, -0.110752f, -0.336897f, -0.322305f, -0.115919f, 0.214207f, 0.406310f, 0.119649f, -0.205301f, -0.360085f, -0.307915f, -0.030391f, 0.224748f, 0.290953f, 0.230695f, 0.083741f, -0.191810f, -0.256304f, -0.249502f, -0.006366f, 0.133890f, 0.289349f, 0.121593f, 0.013026f, -0.252172f, -0.282690f, -0.022936f, -0.006124f, 0.201204f, 0.264997f, 0.098130f, -0.187715f, -0.257124f, -0.123241f, 0.144308f, 0.318128f, 0.223143f, 0.006095f, -0.175533f, -0.299275f, -0.196213f, 0.081491f, 0.264732f, 0.265901f, -0.040931f, -0.221500f, -0.275122f, -0.198737f, 0.144336f, 0.297062f, 0.244960f, -0.042707f, -0.229949f, -0.266618f, -0.068954f, 0.175800f, 0.243310f, 0.105423f, -0.057597f, -0.091762f, 0.006985f, 0.079265f, 0.051572f, 0.011031f, -0.063336f, -0.023698f, 0.117553f, 0.174823f, 0.151150f, -0.008448f, -0.145491f, -0.202448f, -0.074955f, 0.077028f, 0.245274f, 0.212254f, 0.062183f, -0.111539f, -0.268934f, -0.230586f, 0.041415f, 0.228907f, 0.204211f, 0.056961f, -0.188204f, -0.210330f, -0.096438f, -0.013180f, 0.229251f, 0.212336f, 0.115388f, -0.057396f, -0.170929f, -0.135953f, - 0.008739f, 0.093660f, 0.109893f, 0.030024f, -0.041695f, -0.097382f, -0.061194f, -0.002393f, 0.066722f, 0.131433f, 0.072092f, -0.034941f, -0.081100f, -0.094303f, -0.017674f, 0.043325f, 0.087348f, 0.099424f, 0.043012f, -0.030806f, -0.062464f, -0.031543f, 0.014017f, 0.042408f, 0.029252f, 0.013344f, -0.037483f, -0.053543f, -0.019193f, 0.004597f, -0.000627f, -0.001527f} - }, - { - {0.028626f, 0.028642f, 0.028671f, 0.028702f, 0.028721f, 0.028711f, 0.028652f, 0.028521f, 0.028297f, 0.027957f, 0.027481f, 0.026852f, 0.026056f, 0.025086f, 0.023936f, 0.022611f, 0.021120f, 0.019477f, 0.017705f, 0.015831f, 0.013886f, 0.011907f, 0.009933f, 0.008003f, 0.006159f, 0.004439f, 0.002881f, 0.001516f, 0.000373f, -0.000527f, -0.001171f, -0.001551f, -0.001670f, -0.001537f, -0.001170f, -0.000593f, 0.000160f, 0.001054f, 0.002046f, 0.003092f, 0.004146f, 0.005163f, 0.006098f, 0.006912f, 0.007567f, 0.008036f, 0.008294f, 0.008328f, 0.008132f, 0.007708f, 0.007068f, 0.006231f, 0.005225f, 0.004082f, 0.002843f, 0.001551f, 0.000250f, -0.001011f, -0.002187f, -0.003236f, -0.004118f, -0.004799f, -0.005252f, -0.005458f, -0.005406f, -0.005094f, -0.004528f, -0.003723f, -0.002704f, -0.001502f, -0.000152f, 0.001302f, 0.002815f, 0.004339f, 0.005828f, 0.007233f, 0.008513f, 0.009628f, 0.010545f, 0.011238f, 0.011688f, 0.011887f, 0.011831f, 0.011528f, 0.010994f, 0.010251f, 0.009329f, 0.008264f, 0.007093f, 0.005861f, 0.004610f, 0.003383f, 0.002222f, 0.001165f, 0.000245f, -0.000509f, - -0.001078f, -0.001446f, -0.001608f, -0.001565f, -0.001327f, -0.000908f, -0.000334f, 0.000370f, 0.001171f, 0.002033f, 0.002919f, 0.003791f, 0.004615f, 0.005355f, 0.005983f, 0.006471f, 0.006801f, 0.006959f, 0.006937f, 0.006736f, 0.006361f, 0.005825f, 0.005147f, 0.004348f, 0.003458f, 0.002504f, 0.001519f, 0.000534f, -0.000420f, -0.001312f, -0.002119f, -0.002816f, -0.003387f, -0.003819f, -0.004106f, -0.004247f, -0.004246f, -0.004112f, -0.003861f, -0.003510f, -0.003082f, -0.002598f, -0.002086f, -0.001569f, -0.001071f, -0.000615f, -0.000219f, 0.000100f, 0.000330f, 0.000465f, 0.000501f, 0.000441f, 0.000291f, 0.000061f, -0.000235f, -0.000579f, -0.000954f, -0.001339f, -0.001715f, -0.002062f, -0.002363f, -0.002603f, -0.002770f, -0.002856f, -0.031883f, -0.046548f, -0.027006f, -0.016097f, -0.080974f, -0.040031f, -0.043987f, -0.101210f, -0.273445f, -0.110743f, 0.010624f, 0.201980f, -0.125129f, -0.213107f, 0.130433f, 0.239737f, 0.175863f, 0.076859f, -0.046694f, -0.187719f, -0.040409f, -0.052401f, 0.136515f, 0.109383f, 0.072071f, -0.078017f, 0.045544f, -0.025358f, 0.050872f, -0.061143f, -0.071787f, 0.045776f, - 0.115052f, 0.163409f, 0.108495f, -0.007344f, -0.125486f, -0.119381f, -0.036933f, 0.055229f, 0.129259f, 0.087735f, 0.057230f, 0.039498f, -0.049486f, -0.024636f, -0.030369f, 0.016216f, 0.014539f, -0.054091f, 0.039386f, 0.037695f, 0.051301f, 0.003901f, -0.048974f, -0.113857f, -0.048065f, 0.075069f, 0.218723f, 0.144183f, 0.038129f, -0.094893f, -0.194108f, -0.152929f, 0.019428f, 0.124388f, 0.178049f, 0.010386f, -0.137624f, -0.190515f, 0.004197f, 0.185613f, 0.250081f, 0.051928f, -0.213124f, -0.330274f, -0.161489f, 0.151882f, 0.362165f, 0.322165f, 0.032381f, -0.246047f, -0.405064f, -0.250528f, 0.091165f, 0.307366f, 0.310248f, 0.100028f, -0.202284f, -0.325360f, -0.218936f, 0.037230f, 0.203787f, 0.201997f, 0.102652f, -0.067244f, -0.154671f, -0.120531f, -0.026295f, 0.116436f, 0.134289f, 0.085847f, 0.012360f, -0.031336f, -0.115344f, -0.152819f, -0.114131f, 0.036014f, 0.139857f, 0.196502f, 0.081002f, -0.057765f, -0.182221f, -0.163896f, -0.052464f, 0.062503f, 0.209205f, 0.162963f, 0.045714f, -0.136333f, -0.169673f, -0.077282f, -0.024267f, 0.074428f, 0.104327f, 0.090231f, 0.025751f, -0.049072f, - -0.109818f, -0.099401f, -0.031049f, 0.044631f, 0.094151f, 0.073971f, -0.006456f, -0.113584f, -0.092900f, -0.032184f, 0.021955f, 0.052643f, 0.026174f, -0.003465f, -0.028569f, -0.006586f, 0.026063f, 0.041254f, 0.029136f, 0.002444f, -0.066057f, -0.058221f, -0.036227f, 0.000289f, 0.036723f, 0.066118f, 0.024742f, -0.034124f, -0.035054f, -0.014016f, -0.006304f, -0.005896f}, - {-0.028626f, -0.028642f, -0.028671f, -0.028702f, -0.028721f, -0.028711f, -0.028652f, -0.028521f, -0.028297f, -0.027957f, -0.027481f, -0.026852f, -0.026056f, -0.025086f, -0.023936f, -0.022611f, -0.021120f, -0.019477f, -0.017705f, -0.015831f, -0.013886f, -0.011907f, -0.009933f, -0.008003f, -0.006159f, -0.004439f, -0.002881f, -0.001516f, -0.000373f, 0.000527f, 0.001171f, 0.001551f, 0.001670f, 0.001537f, 0.001170f, 0.000593f, -0.000160f, -0.001054f, -0.002046f, -0.003092f, -0.004146f, -0.005163f, -0.006098f, -0.006912f, -0.007567f, -0.008036f, -0.008294f, -0.008328f, -0.008132f, -0.007708f, -0.007068f, -0.006231f, -0.005225f, -0.004082f, -0.002843f, -0.001551f, -0.000250f, 0.001011f, 0.002187f, 0.003236f, 0.004118f, 0.004799f, 0.005252f, 0.005458f, 0.005406f, 0.005094f, 0.004528f, 0.003723f, 0.002704f, 0.001502f, 0.000152f, -0.001302f, -0.002815f, -0.004339f, -0.005828f, -0.007233f, -0.008513f, -0.009628f, -0.010545f, -0.011238f, -0.011688f, -0.011887f, -0.011831f, -0.011528f, -0.010994f, -0.010251f, -0.009329f, -0.008264f, -0.007093f, -0.005861f, -0.004610f, -0.003383f, -0.002222f, -0.001165f, -0.000245f, 0.000509f, - 0.001078f, 0.001446f, 0.001608f, 0.001565f, 0.001327f, 0.000908f, 0.000334f, -0.000370f, -0.001171f, -0.002033f, -0.002919f, -0.003791f, -0.004615f, -0.005355f, -0.005983f, -0.006471f, -0.006801f, -0.006959f, -0.006937f, -0.006736f, -0.006361f, -0.005825f, -0.005147f, -0.004348f, -0.003458f, -0.002504f, -0.001519f, -0.000534f, 0.000420f, 0.001312f, 0.002119f, 0.002816f, 0.003387f, 0.003819f, 0.004106f, 0.004247f, 0.004246f, 0.004112f, 0.003861f, 0.003510f, 0.003082f, 0.002598f, 0.002086f, 0.001569f, 0.001071f, 0.000615f, 0.000219f, -0.000100f, -0.000330f, -0.000465f, -0.000501f, -0.000441f, -0.000291f, -0.000061f, 0.000235f, 0.000579f, 0.000954f, 0.001339f, 0.001715f, 0.002062f, 0.002363f, 0.002603f, 0.002770f, 0.002856f, 0.031883f, 0.046548f, 0.027006f, 0.016097f, 0.080974f, 0.040031f, 0.043987f, 0.101210f, 0.273445f, 0.110743f, -0.010624f, -0.201980f, 0.125129f, 0.213107f, -0.130433f, -0.239737f, -0.175863f, -0.076859f, 0.046694f, 0.187719f, 0.040409f, 0.052401f, -0.136515f, -0.109383f, -0.072071f, 0.078017f, -0.045544f, 0.025358f, -0.050872f, 0.061143f, 0.071787f, -0.045776f, - -0.115052f, -0.163409f, -0.108495f, 0.007344f, 0.125486f, 0.119381f, 0.036933f, -0.055229f, -0.129259f, -0.087735f, -0.057230f, -0.039498f, 0.049486f, 0.024636f, 0.030369f, -0.016216f, -0.014539f, 0.054091f, -0.039386f, -0.037695f, -0.051301f, -0.003901f, 0.048974f, 0.113857f, 0.048065f, -0.075069f, -0.218723f, -0.144183f, -0.038129f, 0.094893f, 0.194108f, 0.152929f, -0.019428f, -0.124388f, -0.178049f, -0.010386f, 0.137624f, 0.190515f, -0.004197f, -0.185613f, -0.250081f, -0.051928f, 0.213124f, 0.330274f, 0.161489f, -0.151882f, -0.362165f, -0.322165f, -0.032381f, 0.246047f, 0.405064f, 0.250528f, -0.091165f, -0.307366f, -0.310248f, -0.100028f, 0.202284f, 0.325360f, 0.218936f, -0.037230f, -0.203787f, -0.201997f, -0.102652f, 0.067244f, 0.154671f, 0.120531f, 0.026295f, -0.116436f, -0.134289f, -0.085847f, -0.012360f, 0.031336f, 0.115344f, 0.152819f, 0.114131f, -0.036014f, -0.139857f, -0.196502f, -0.081002f, 0.057765f, 0.182221f, 0.163896f, 0.052464f, -0.062503f, -0.209205f, -0.162963f, -0.045714f, 0.136333f, 0.169673f, 0.077282f, 0.024267f, -0.074428f, -0.104327f, -0.090231f, -0.025751f, 0.049072f, - 0.109818f, 0.099401f, 0.031049f, -0.044631f, -0.094151f, -0.073971f, 0.006456f, 0.113584f, 0.092900f, 0.032184f, -0.021955f, -0.052643f, -0.026174f, 0.003465f, 0.028569f, 0.006586f, -0.026063f, -0.041254f, -0.029136f, -0.002444f, 0.066057f, 0.058221f, 0.036227f, -0.000289f, -0.036723f, -0.066118f, -0.024742f, 0.034124f, 0.035054f, 0.014016f, 0.006304f, 0.005896f} - }, - { - {0.025310f, 0.025687f, 0.026423f, 0.027479f, 0.028803f, 0.030327f, 0.031971f, 0.033646f, 0.035260f, 0.036719f, 0.037934f, 0.038819f, 0.039302f, 0.039323f, 0.038839f, 0.037826f, 0.036279f, 0.034214f, 0.031669f, 0.028699f, 0.025378f, 0.021796f, 0.018055f, 0.014265f, 0.010543f, 0.007004f, 0.003761f, 0.000920f, -0.001427f, -0.003202f, -0.004345f, -0.004818f, -0.004606f, -0.003716f, -0.002180f, -0.000053f, 0.002590f, 0.005652f, 0.009022f, 0.012578f, 0.016186f, 0.019711f, 0.023017f, 0.025976f, 0.028466f, 0.030383f, 0.031636f, 0.032159f, 0.031907f, 0.030860f, 0.029023f, 0.026427f, 0.023127f, 0.019201f, 0.014747f, 0.009880f, 0.004727f, -0.000576f, -0.005887f, -0.011066f, -0.015978f, -0.020496f, -0.024506f, -0.027913f, -0.030640f, -0.032632f, -0.033857f, -0.034310f, -0.034006f, -0.032985f, -0.031308f, -0.029055f, -0.026321f, -0.023213f, -0.019849f, -0.016346f, -0.012827f, -0.009407f, -0.006194f, -0.003285f, -0.000764f, 0.001304f, 0.002872f, 0.003912f, 0.004415f, 0.004395f, 0.003882f, 0.002923f, 0.001580f, -0.000071f, -0.001949f, -0.003965f, -0.006027f, -0.008047f, -0.009940f, -0.011630f, - -0.013049f, -0.014143f, -0.014873f, -0.015213f, -0.015155f, -0.014706f, -0.013887f, -0.012733f, -0.011291f, -0.009618f, -0.007779f, -0.005841f, -0.003874f, -0.001948f, -0.000129f, 0.001525f, 0.002963f, 0.004143f, 0.005037f, 0.005626f, 0.005908f, 0.005888f, 0.005586f, 0.005033f, 0.004268f, 0.003335f, 0.002288f, 0.001178f, 0.000062f, -0.001008f, -0.001982f, -0.002818f, -0.003480f, -0.003940f, -0.004181f, -0.004195f, -0.003984f, -0.003562f, -0.002948f, -0.002172f, -0.001269f, -0.000279f, 0.000755f, 0.001790f, 0.002784f, 0.003696f, 0.004492f, 0.005144f, 0.005628f, 0.005932f, 0.006051f, 0.005986f, 0.005752f, 0.005365f, 0.004852f, 0.004244f, 0.003576f, 0.002883f, 0.002204f, 0.001575f, 0.001027f, 0.000590f, 0.000286f, 0.000130f, -0.062719f, -0.092049f, -0.073323f, 0.069649f, -0.009513f, -0.100002f, -0.109524f, -0.147956f, -0.248873f, -0.178598f, -0.035212f, 0.057802f, -0.137092f, -0.217856f, 0.034081f, -0.064171f, -0.031464f, 0.068502f, 0.197143f, 0.101509f, -0.063704f, 0.004287f, -0.071943f, -0.096419f, -0.036460f, 0.098240f, 0.374600f, 0.252128f, 0.088983f, -0.044047f, -0.174233f, -0.131298f, - -0.136368f, 0.295343f, 0.450354f, 0.237705f, -0.128321f, -0.279512f, -0.350140f, -0.078530f, 0.362555f, 0.168500f, 0.173851f, -0.032953f, -0.170410f, -0.097289f, 0.222653f, 0.428155f, 0.230823f, -0.343600f, -0.482075f, -0.424160f, 0.047068f, 0.398882f, 0.561588f, 0.255711f, -0.070975f, -0.423283f, -0.237417f, -0.018807f, -0.046951f, 0.340034f, 0.152083f, -0.135910f, -0.141146f, 0.214772f, -0.120158f, -0.258864f, -0.375960f, -0.158851f, -0.014091f, 0.153122f, 0.103225f, 0.158943f, 0.043085f, -0.046721f, -0.114438f, -0.220415f, -0.153978f, 0.054363f, 0.154925f, 0.099798f, -0.179298f, -0.297833f, -0.102031f, 0.255803f, 0.468993f, 0.279909f, -0.146318f, -0.514820f, -0.515969f, -0.096151f, 0.447641f, 0.583733f, 0.311249f, -0.142109f, -0.400262f, -0.479969f, -0.058551f, 0.187743f, 0.275447f, 0.142366f, -0.084071f, -0.257869f, -0.250172f, -0.047876f, 0.212787f, 0.309702f, 0.186050f, -0.074890f, -0.273524f, -0.307341f, -0.180162f, 0.018243f, 0.247828f, 0.359676f, 0.146780f, -0.154708f, -0.410942f, -0.358159f, 0.001180f, 0.263830f, 0.387048f, 0.275723f, -0.090244f, -0.361436f, -0.399106f, -0.154295f, - 0.149885f, 0.412521f, 0.361088f, 0.065173f, -0.327785f, -0.456368f, -0.330803f, 0.058165f, 0.383040f, 0.477541f, 0.181098f, -0.247109f, -0.488622f, -0.385433f, -0.026630f, 0.351904f, 0.479808f, 0.272364f, -0.159846f, -0.445736f, -0.426307f, -0.086532f, 0.272691f, 0.432691f, 0.252161f, -0.094124f, -0.290550f, -0.191220f, -0.001330f, 0.035416f, 0.015705f, 0.002131f}, - {0.025310f, 0.025687f, 0.026423f, 0.027479f, 0.028803f, 0.030327f, 0.031971f, 0.033646f, 0.035260f, 0.036719f, 0.037934f, 0.038819f, 0.039302f, 0.039323f, 0.038839f, 0.037826f, 0.036279f, 0.034214f, 0.031669f, 0.028699f, 0.025378f, 0.021796f, 0.018055f, 0.014265f, 0.010543f, 0.007004f, 0.003761f, 0.000920f, -0.001427f, -0.003202f, -0.004345f, -0.004818f, -0.004606f, -0.003716f, -0.002180f, -0.000053f, 0.002590f, 0.005652f, 0.009022f, 0.012578f, 0.016186f, 0.019711f, 0.023017f, 0.025976f, 0.028466f, 0.030383f, 0.031636f, 0.032159f, 0.031907f, 0.030860f, 0.029023f, 0.026427f, 0.023127f, 0.019201f, 0.014747f, 0.009880f, 0.004727f, -0.000576f, -0.005887f, -0.011066f, -0.015978f, -0.020496f, -0.024506f, -0.027913f, -0.030640f, -0.032632f, -0.033857f, -0.034310f, -0.034006f, -0.032985f, -0.031308f, -0.029055f, -0.026321f, -0.023213f, -0.019849f, -0.016346f, -0.012827f, -0.009407f, -0.006194f, -0.003285f, -0.000764f, 0.001304f, 0.002872f, 0.003912f, 0.004415f, 0.004395f, 0.003882f, 0.002923f, 0.001580f, -0.000071f, -0.001949f, -0.003965f, -0.006027f, -0.008047f, -0.009940f, -0.011630f, - -0.013049f, -0.014143f, -0.014873f, -0.015213f, -0.015155f, -0.014706f, -0.013887f, -0.012733f, -0.011291f, -0.009618f, -0.007779f, -0.005841f, -0.003874f, -0.001948f, -0.000129f, 0.001525f, 0.002963f, 0.004143f, 0.005037f, 0.005626f, 0.005908f, 0.005888f, 0.005586f, 0.005033f, 0.004268f, 0.003335f, 0.002288f, 0.001178f, 0.000062f, -0.001008f, -0.001982f, -0.002818f, -0.003480f, -0.003940f, -0.004181f, -0.004195f, -0.003984f, -0.003562f, -0.002948f, -0.002172f, -0.001269f, -0.000279f, 0.000755f, 0.001790f, 0.002784f, 0.003696f, 0.004492f, 0.005144f, 0.005628f, 0.005932f, 0.006051f, 0.005986f, 0.005752f, 0.005365f, 0.004852f, 0.004244f, 0.003576f, 0.002883f, 0.002204f, 0.001575f, 0.001027f, 0.000590f, 0.000286f, 0.000130f, -0.062719f, -0.092049f, -0.073323f, 0.069649f, -0.009513f, -0.100002f, -0.109524f, -0.147956f, -0.248873f, -0.178598f, -0.035212f, 0.057802f, -0.137092f, -0.217856f, 0.034081f, -0.064171f, -0.031464f, 0.068502f, 0.197143f, 0.101509f, -0.063704f, 0.004287f, -0.071943f, -0.096419f, -0.036460f, 0.098240f, 0.374600f, 0.252128f, 0.088983f, -0.044047f, -0.174233f, -0.131298f, - -0.136368f, 0.295343f, 0.450354f, 0.237705f, -0.128321f, -0.279512f, -0.350140f, -0.078530f, 0.362555f, 0.168500f, 0.173851f, -0.032953f, -0.170410f, -0.097289f, 0.222653f, 0.428155f, 0.230823f, -0.343600f, -0.482075f, -0.424160f, 0.047068f, 0.398882f, 0.561588f, 0.255711f, -0.070975f, -0.423283f, -0.237417f, -0.018807f, -0.046951f, 0.340034f, 0.152083f, -0.135910f, -0.141146f, 0.214772f, -0.120158f, -0.258864f, -0.375960f, -0.158851f, -0.014091f, 0.153122f, 0.103225f, 0.158943f, 0.043085f, -0.046721f, -0.114438f, -0.220415f, -0.153978f, 0.054363f, 0.154925f, 0.099798f, -0.179298f, -0.297833f, -0.102031f, 0.255803f, 0.468993f, 0.279909f, -0.146318f, -0.514820f, -0.515969f, -0.096151f, 0.447641f, 0.583733f, 0.311249f, -0.142109f, -0.400262f, -0.479969f, -0.058551f, 0.187743f, 0.275447f, 0.142366f, -0.084071f, -0.257869f, -0.250172f, -0.047876f, 0.212787f, 0.309702f, 0.186050f, -0.074890f, -0.273524f, -0.307341f, -0.180162f, 0.018243f, 0.247828f, 0.359676f, 0.146780f, -0.154708f, -0.410942f, -0.358159f, 0.001180f, 0.263830f, 0.387048f, 0.275723f, -0.090244f, -0.361436f, -0.399106f, -0.154295f, - 0.149885f, 0.412521f, 0.361088f, 0.065173f, -0.327785f, -0.456368f, -0.330803f, 0.058165f, 0.383040f, 0.477541f, 0.181098f, -0.247109f, -0.488622f, -0.385433f, -0.026630f, 0.351904f, 0.479808f, 0.272364f, -0.159846f, -0.445736f, -0.426307f, -0.086532f, 0.272691f, 0.432691f, 0.252161f, -0.094124f, -0.290550f, -0.191220f, -0.001330f, 0.035416f, 0.015705f, 0.002131f} - }, - { - {0.049252f, 0.048505f, 0.047032f, 0.044879f, 0.042109f, 0.038804f, 0.035061f, 0.030990f, 0.026708f, 0.022336f, 0.017998f, 0.013811f, 0.009887f, 0.006325f, 0.003212f, 0.000616f, -0.001412f, -0.002843f, -0.003669f, -0.003901f, -0.003572f, -0.002732f, -0.001448f, 0.000197f, 0.002114f, 0.004204f, 0.006363f, 0.008491f, 0.010489f, 0.012268f, 0.013747f, 0.014860f, 0.015558f, 0.015807f, 0.015592f, 0.014918f, 0.013808f, 0.012301f, 0.010453f, 0.008334f, 0.006024f, 0.003612f, 0.001190f, -0.001148f, -0.003310f, -0.005209f, -0.006768f, -0.007922f, -0.008617f, -0.008817f, -0.008503f, -0.007671f, -0.006338f, -0.004534f, -0.002308f, 0.000279f, 0.003153f, 0.006233f, 0.009431f, 0.012654f, 0.015812f, 0.018815f, 0.021583f, 0.024042f, 0.026129f, 0.027795f, 0.029005f, 0.029740f, 0.029994f, 0.029780f, 0.029122f, 0.028059f, 0.026641f, 0.024928f, 0.022987f, 0.020887f, 0.018702f, 0.016503f, 0.014358f, 0.012331f, 0.010474f, 0.008833f, 0.007442f, 0.006322f, 0.005484f, 0.004926f, 0.004634f, 0.004584f, 0.004742f, 0.005069f, 0.005517f, 0.006037f, 0.006579f, 0.007092f, 0.007531f, 0.007854f, - 0.008025f, 0.008018f, 0.007815f, 0.007408f, 0.006800f, 0.006002f, 0.005035f, 0.003927f, 0.002715f, 0.001441f, 0.000148f, -0.001115f, -0.002303f, -0.003371f, -0.004279f, -0.004990f, -0.005478f, -0.005721f, -0.005708f, -0.005438f, -0.004916f, -0.004159f, -0.003191f, -0.002043f, -0.000754f, 0.000634f, 0.002076f, 0.003525f, 0.004935f, 0.006261f, 0.007464f, 0.008508f, 0.009363f, 0.010009f, 0.010432f, 0.010625f, 0.010593f, 0.010344f, 0.009898f, 0.009277f, 0.008512f, 0.007636f, 0.006683f, 0.005691f, 0.004696f, 0.003732f, 0.002830f, 0.002016f, 0.001311f, 0.000731f, 0.000286f, -0.000024f, -0.000201f, -0.000255f, -0.000199f, -0.000054f, 0.000159f, 0.000418f, 0.000696f, 0.000971f, 0.001220f, 0.001425f, 0.001571f, 0.001646f, -0.014926f, -0.089426f, -0.105113f, 0.033285f, 0.006325f, -0.014680f, -0.339995f, -0.200832f, -0.198426f, -0.256673f, -0.050366f, 0.153312f, 0.188704f, 0.030454f, 0.048690f, 0.023019f, 0.123926f, -0.055664f, 0.033674f, 0.042263f, 0.008735f, 0.027934f, 0.002027f, -0.002475f, 0.007478f, -0.012204f, -0.027819f, 0.013803f, 0.002576f, -0.058598f, -0.073877f, -0.035068f, - 0.004746f, -0.010529f, -0.047010f, -0.011128f, 0.052184f, 0.157500f, 0.015430f, -0.057176f, -0.214266f, 0.018587f, 0.168739f, 0.193512f, 0.144175f, -0.085009f, -0.238551f, -0.226822f, -0.111240f, 0.096866f, 0.212460f, 0.198553f, 0.018198f, -0.167907f, -0.239394f, -0.157140f, -0.009600f, 0.166381f, 0.145376f, 0.056992f, 0.077190f, -0.230234f, -0.183588f, -0.000075f, 0.080051f, -0.082221f, 0.309177f, 0.369904f, 0.326232f, -0.054229f, -0.305098f, -0.330527f, 0.022802f, 0.249722f, 0.282320f, 0.082731f, -0.211771f, -0.253254f, -0.300030f, -0.050831f, 0.257734f, 0.345267f, 0.211626f, -0.062206f, -0.255335f, -0.227888f, 0.022794f, 0.175552f, 0.167798f, -0.016114f, -0.153397f, -0.180506f, -0.028015f, 0.109007f, 0.103911f, 0.006245f, -0.082177f, -0.174945f, -0.054919f, 0.125037f, 0.327312f, 0.269979f, -0.013689f, -0.366086f, -0.419537f, -0.178826f, 0.224978f, 0.503260f, 0.467893f, 0.158368f, -0.345247f, -0.630165f, -0.404654f, 0.114994f, 0.475935f, 0.375711f, -0.062013f, -0.348152f, -0.410496f, -0.082221f, 0.215751f, 0.265317f, 0.248844f, -0.056057f, -0.155688f, -0.180562f, -0.044266f, 0.110211f, - 0.147724f, 0.049847f, -0.036263f, -0.111937f, -0.078368f, 0.022911f, 0.111876f, 0.086901f, 0.002921f, -0.090624f, -0.103845f, -0.027816f, 0.068250f, 0.117116f, 0.093396f, -0.028071f, -0.137833f, -0.136771f, -0.038484f, 0.097302f, 0.172137f, 0.159891f, 0.013142f, -0.144177f, -0.191770f, -0.136983f, -0.000232f, 0.108200f, 0.075797f, 0.020524f, 0.004679f, 0.007371f}, - {0.049252f, 0.048505f, 0.047032f, 0.044879f, 0.042109f, 0.038804f, 0.035061f, 0.030990f, 0.026708f, 0.022336f, 0.017998f, 0.013811f, 0.009887f, 0.006325f, 0.003212f, 0.000616f, -0.001412f, -0.002843f, -0.003669f, -0.003901f, -0.003572f, -0.002732f, -0.001448f, 0.000197f, 0.002114f, 0.004204f, 0.006363f, 0.008491f, 0.010489f, 0.012268f, 0.013747f, 0.014860f, 0.015558f, 0.015807f, 0.015592f, 0.014918f, 0.013808f, 0.012301f, 0.010453f, 0.008334f, 0.006024f, 0.003612f, 0.001190f, -0.001148f, -0.003310f, -0.005209f, -0.006768f, -0.007922f, -0.008617f, -0.008817f, -0.008503f, -0.007671f, -0.006338f, -0.004534f, -0.002308f, 0.000279f, 0.003153f, 0.006233f, 0.009431f, 0.012654f, 0.015812f, 0.018815f, 0.021583f, 0.024042f, 0.026129f, 0.027795f, 0.029005f, 0.029740f, 0.029994f, 0.029780f, 0.029122f, 0.028059f, 0.026641f, 0.024928f, 0.022987f, 0.020887f, 0.018702f, 0.016503f, 0.014358f, 0.012331f, 0.010474f, 0.008833f, 0.007442f, 0.006322f, 0.005484f, 0.004926f, 0.004634f, 0.004584f, 0.004742f, 0.005069f, 0.005517f, 0.006037f, 0.006579f, 0.007092f, 0.007531f, 0.007854f, - 0.008025f, 0.008018f, 0.007815f, 0.007408f, 0.006800f, 0.006002f, 0.005035f, 0.003927f, 0.002715f, 0.001441f, 0.000148f, -0.001115f, -0.002303f, -0.003371f, -0.004279f, -0.004990f, -0.005478f, -0.005721f, -0.005708f, -0.005438f, -0.004916f, -0.004159f, -0.003191f, -0.002043f, -0.000754f, 0.000634f, 0.002076f, 0.003525f, 0.004935f, 0.006261f, 0.007464f, 0.008508f, 0.009363f, 0.010009f, 0.010432f, 0.010625f, 0.010593f, 0.010344f, 0.009898f, 0.009277f, 0.008512f, 0.007636f, 0.006683f, 0.005691f, 0.004696f, 0.003732f, 0.002830f, 0.002016f, 0.001311f, 0.000731f, 0.000286f, -0.000024f, -0.000201f, -0.000255f, -0.000199f, -0.000054f, 0.000159f, 0.000418f, 0.000696f, 0.000971f, 0.001220f, 0.001425f, 0.001571f, 0.001646f, -0.014926f, -0.089426f, -0.105113f, 0.033285f, 0.006325f, -0.014680f, -0.339995f, -0.200832f, -0.198426f, -0.256673f, -0.050366f, 0.153312f, 0.188704f, 0.030454f, 0.048690f, 0.023019f, 0.123926f, -0.055664f, 0.033674f, 0.042263f, 0.008735f, 0.027934f, 0.002027f, -0.002475f, 0.007478f, -0.012204f, -0.027819f, 0.013803f, 0.002576f, -0.058598f, -0.073877f, -0.035068f, - 0.004746f, -0.010529f, -0.047010f, -0.011128f, 0.052184f, 0.157500f, 0.015430f, -0.057176f, -0.214266f, 0.018587f, 0.168739f, 0.193512f, 0.144175f, -0.085009f, -0.238551f, -0.226822f, -0.111240f, 0.096866f, 0.212460f, 0.198553f, 0.018198f, -0.167907f, -0.239394f, -0.157140f, -0.009600f, 0.166381f, 0.145376f, 0.056992f, 0.077190f, -0.230234f, -0.183588f, -0.000075f, 0.080051f, -0.082221f, 0.309177f, 0.369904f, 0.326232f, -0.054229f, -0.305098f, -0.330527f, 0.022802f, 0.249722f, 0.282320f, 0.082731f, -0.211771f, -0.253254f, -0.300030f, -0.050831f, 0.257734f, 0.345267f, 0.211626f, -0.062206f, -0.255335f, -0.227888f, 0.022794f, 0.175552f, 0.167798f, -0.016114f, -0.153397f, -0.180506f, -0.028015f, 0.109007f, 0.103911f, 0.006245f, -0.082177f, -0.174945f, -0.054919f, 0.125037f, 0.327312f, 0.269979f, -0.013689f, -0.366086f, -0.419537f, -0.178826f, 0.224978f, 0.503260f, 0.467893f, 0.158368f, -0.345247f, -0.630165f, -0.404654f, 0.114994f, 0.475935f, 0.375711f, -0.062013f, -0.348152f, -0.410496f, -0.082221f, 0.215751f, 0.265317f, 0.248844f, -0.056057f, -0.155688f, -0.180562f, -0.044266f, 0.110211f, - 0.147724f, 0.049847f, -0.036263f, -0.111937f, -0.078368f, 0.022911f, 0.111876f, 0.086901f, 0.002921f, -0.090624f, -0.103845f, -0.027816f, 0.068250f, 0.117116f, 0.093396f, -0.028071f, -0.137833f, -0.136771f, -0.038484f, 0.097302f, 0.172137f, 0.159891f, 0.013142f, -0.144177f, -0.191770f, -0.136983f, -0.000232f, 0.108200f, 0.075797f, 0.020524f, 0.004679f, 0.007371f} - }, - { - {0.020524f, 0.019954f, 0.018829f, 0.017179f, 0.015049f, 0.012498f, 0.009593f, 0.006414f, 0.003047f, -0.000417f, -0.003884f, -0.007261f, -0.010454f, -0.013378f, -0.015953f, -0.018107f, -0.019780f, -0.020927f, -0.021512f, -0.021516f, -0.020934f, -0.019777f, -0.018070f, -0.015849f, -0.013166f, -0.010083f, -0.006669f, -0.003003f, 0.000831f, 0.004749f, 0.008661f, 0.012484f, 0.016134f, 0.019537f, 0.022622f, 0.025331f, 0.027614f, 0.029432f, 0.030761f, 0.031586f, 0.031906f, 0.031731f, 0.031085f, 0.029999f, 0.028515f, 0.026683f, 0.024560f, 0.022205f, 0.019684f, 0.017061f, 0.014399f, 0.011763f, 0.009210f, 0.006795f, 0.004564f, 0.002558f, 0.000810f, -0.000657f, -0.001825f, -0.002689f, -0.003249f, -0.003513f, -0.003498f, -0.003225f, -0.002722f, -0.002019f, -0.001152f, -0.000157f, 0.000930f, 0.002070f, 0.003228f, 0.004372f, 0.005470f, 0.006495f, 0.007424f, 0.008241f, 0.008929f, 0.009482f, 0.009893f, 0.010163f, 0.010295f, 0.010296f, 0.010175f, 0.009946f, 0.009620f, 0.009213f, 0.008740f, 0.008214f, 0.007651f, 0.007062f, 0.006460f, 0.005852f, 0.005247f, 0.004650f, 0.004064f, 0.003492f, - 0.002932f, 0.002383f, 0.001843f, 0.001308f, 0.000775f, 0.000239f, -0.000302f, -0.000852f, -0.001413f, -0.001984f, -0.002566f, -0.003155f, -0.003747f, -0.004338f, -0.004921f, -0.005487f, -0.006028f, -0.006534f, -0.006994f, -0.007400f, -0.007741f, -0.008010f, -0.008197f, -0.008298f, -0.008307f, -0.008224f, -0.008047f, -0.007779f, -0.007425f, -0.006992f, -0.006489f, -0.005928f, -0.005323f, -0.004687f, -0.004037f, -0.003390f, -0.002763f, -0.002172f, -0.001634f, -0.001164f, -0.000775f, -0.000480f, -0.000288f, -0.000207f, -0.000239f, -0.000386f, -0.000648f, -0.001019f, -0.001491f, -0.002055f, -0.002698f, -0.003404f, -0.004157f, -0.004940f, -0.005733f, -0.006516f, -0.007271f, -0.007979f, -0.008622f, -0.009185f, -0.009653f, -0.010015f, -0.010262f, -0.010386f, -0.013960f, 0.039538f, -0.009080f, -0.048067f, -0.014905f, 0.010152f, 0.017116f, 0.126842f, 0.199826f, 0.247910f, -0.051869f, -0.166142f, -0.248324f, -0.100263f, 0.104231f, 0.332617f, 0.192145f, 0.074884f, -0.098427f, -0.080697f, -0.048697f, 0.050512f, -0.015635f, -0.046354f, -0.035057f, -0.020414f, 0.024669f, 0.127237f, 0.109052f, 0.140236f, -0.066748f, -0.193365f, - -0.186352f, -0.061126f, 0.134861f, 0.272082f, 0.167805f, -0.028111f, -0.220608f, -0.175739f, 0.052834f, 0.015141f, 0.044169f, 0.024964f, 0.012918f, -0.045790f, -0.072895f, 0.081872f, 0.084591f, -0.085795f, -0.090978f, -0.103647f, -0.040909f, 0.030292f, 0.143571f, 0.103650f, 0.063063f, -0.054640f, -0.065832f, -0.094783f, -0.028008f, 0.097145f, 0.166294f, 0.103833f, 0.011883f, -0.106418f, -0.226422f, -0.243543f, -0.041307f, 0.181256f, 0.277106f, 0.278246f, 0.158088f, -0.094954f, -0.347089f, -0.337988f, -0.124755f, 0.158593f, 0.303979f, 0.289625f, 0.048365f, -0.174889f, -0.299761f, -0.228573f, 0.044282f, 0.174276f, 0.072975f, -0.086911f, -0.143364f, -0.122536f, 0.003688f, 0.079789f, 0.121467f, 0.095954f, 0.027984f, -0.075559f, -0.146718f, -0.055121f, 0.023112f, 0.107898f, 0.137225f, 0.027182f, -0.076223f, -0.156842f, -0.102407f, 0.033455f, 0.181355f, 0.146131f, -0.065615f, -0.189951f, -0.147386f, -0.008197f, 0.177630f, 0.220091f, 0.110133f, -0.157173f, -0.401624f, -0.283624f, 0.056410f, 0.287032f, 0.307662f, 0.057544f, -0.174041f, -0.256330f, -0.178914f, 0.081254f, 0.200731f, 0.216187f, - 0.085729f, -0.097065f, -0.205649f, -0.161221f, -0.023881f, 0.187910f, 0.213384f, 0.126237f, -0.103732f, -0.250056f, -0.220258f, -0.020818f, 0.123885f, 0.223463f, 0.157788f, 0.012163f, -0.171729f, -0.205165f, -0.087605f, 0.108279f, 0.115753f, 0.091401f, -0.027898f, -0.120550f, -0.095680f, -0.003018f, 0.042296f, 0.022227f, 0.001533f, -0.002457f, -0.002996f, -0.001826f}, - {0.020524f, 0.019954f, 0.018829f, 0.017179f, 0.015049f, 0.012498f, 0.009593f, 0.006414f, 0.003047f, -0.000417f, -0.003884f, -0.007261f, -0.010454f, -0.013378f, -0.015953f, -0.018107f, -0.019780f, -0.020927f, -0.021512f, -0.021516f, -0.020934f, -0.019777f, -0.018070f, -0.015849f, -0.013166f, -0.010083f, -0.006669f, -0.003003f, 0.000831f, 0.004749f, 0.008661f, 0.012484f, 0.016134f, 0.019537f, 0.022622f, 0.025331f, 0.027614f, 0.029432f, 0.030761f, 0.031586f, 0.031906f, 0.031731f, 0.031085f, 0.029999f, 0.028515f, 0.026683f, 0.024560f, 0.022205f, 0.019684f, 0.017061f, 0.014399f, 0.011763f, 0.009210f, 0.006795f, 0.004564f, 0.002558f, 0.000810f, -0.000657f, -0.001825f, -0.002689f, -0.003249f, -0.003513f, -0.003498f, -0.003225f, -0.002722f, -0.002019f, -0.001152f, -0.000157f, 0.000930f, 0.002070f, 0.003228f, 0.004372f, 0.005470f, 0.006495f, 0.007424f, 0.008241f, 0.008929f, 0.009482f, 0.009893f, 0.010163f, 0.010295f, 0.010296f, 0.010175f, 0.009946f, 0.009620f, 0.009213f, 0.008740f, 0.008214f, 0.007651f, 0.007062f, 0.006460f, 0.005852f, 0.005247f, 0.004650f, 0.004064f, 0.003492f, - 0.002932f, 0.002383f, 0.001843f, 0.001308f, 0.000775f, 0.000239f, -0.000302f, -0.000852f, -0.001413f, -0.001984f, -0.002566f, -0.003155f, -0.003747f, -0.004338f, -0.004921f, -0.005487f, -0.006028f, -0.006534f, -0.006994f, -0.007400f, -0.007741f, -0.008010f, -0.008197f, -0.008298f, -0.008307f, -0.008224f, -0.008047f, -0.007779f, -0.007425f, -0.006992f, -0.006489f, -0.005928f, -0.005323f, -0.004687f, -0.004037f, -0.003390f, -0.002763f, -0.002172f, -0.001634f, -0.001164f, -0.000775f, -0.000480f, -0.000288f, -0.000207f, -0.000239f, -0.000386f, -0.000648f, -0.001019f, -0.001491f, -0.002055f, -0.002698f, -0.003404f, -0.004157f, -0.004940f, -0.005733f, -0.006516f, -0.007271f, -0.007979f, -0.008622f, -0.009185f, -0.009653f, -0.010015f, -0.010262f, -0.010386f, -0.013960f, 0.039538f, -0.009080f, -0.048067f, -0.014905f, 0.010152f, 0.017116f, 0.126842f, 0.199826f, 0.247910f, -0.051869f, -0.166142f, -0.248324f, -0.100263f, 0.104231f, 0.332617f, 0.192145f, 0.074884f, -0.098427f, -0.080697f, -0.048697f, 0.050512f, -0.015635f, -0.046354f, -0.035057f, -0.020414f, 0.024669f, 0.127237f, 0.109052f, 0.140236f, -0.066748f, -0.193365f, - -0.186352f, -0.061126f, 0.134861f, 0.272082f, 0.167805f, -0.028111f, -0.220608f, -0.175739f, 0.052834f, 0.015141f, 0.044169f, 0.024964f, 0.012918f, -0.045790f, -0.072895f, 0.081872f, 0.084591f, -0.085795f, -0.090978f, -0.103647f, -0.040909f, 0.030292f, 0.143571f, 0.103650f, 0.063063f, -0.054640f, -0.065832f, -0.094783f, -0.028008f, 0.097145f, 0.166294f, 0.103833f, 0.011883f, -0.106418f, -0.226422f, -0.243543f, -0.041307f, 0.181256f, 0.277106f, 0.278246f, 0.158088f, -0.094954f, -0.347089f, -0.337988f, -0.124755f, 0.158593f, 0.303979f, 0.289625f, 0.048365f, -0.174889f, -0.299761f, -0.228573f, 0.044282f, 0.174276f, 0.072975f, -0.086911f, -0.143364f, -0.122536f, 0.003688f, 0.079789f, 0.121467f, 0.095954f, 0.027984f, -0.075559f, -0.146718f, -0.055121f, 0.023112f, 0.107898f, 0.137225f, 0.027182f, -0.076223f, -0.156842f, -0.102407f, 0.033455f, 0.181355f, 0.146131f, -0.065615f, -0.189951f, -0.147386f, -0.008197f, 0.177630f, 0.220091f, 0.110133f, -0.157173f, -0.401624f, -0.283624f, 0.056410f, 0.287032f, 0.307662f, 0.057544f, -0.174041f, -0.256330f, -0.178914f, 0.081254f, 0.200731f, 0.216187f, - 0.085729f, -0.097065f, -0.205649f, -0.161221f, -0.023881f, 0.187910f, 0.213384f, 0.126237f, -0.103732f, -0.250056f, -0.220258f, -0.020818f, 0.123885f, 0.223463f, 0.157788f, 0.012163f, -0.171729f, -0.205165f, -0.087605f, 0.108279f, 0.115753f, 0.091401f, -0.027898f, -0.120550f, -0.095680f, -0.003018f, 0.042296f, 0.022227f, 0.001533f, -0.002457f, -0.002996f, -0.001826f} - }, - { - {0.009644f, 0.009468f, 0.009121f, 0.008611f, 0.007953f, 0.007163f, 0.006262f, 0.005274f, 0.004225f, 0.003142f, 0.002054f, 0.000988f, -0.000027f, -0.000965f, -0.001801f, -0.002514f, -0.003085f, -0.003500f, -0.003747f, -0.003820f, -0.003717f, -0.003442f, -0.003001f, -0.002405f, -0.001670f, -0.000816f, 0.000135f, 0.001158f, 0.002227f, 0.003311f, 0.004383f, 0.005411f, 0.006366f, 0.007221f, 0.007949f, 0.008525f, 0.008928f, 0.009139f, 0.009144f, 0.008931f, 0.008492f, 0.007825f, 0.006931f, 0.005815f, 0.004486f, 0.002956f, 0.001243f, -0.000633f, -0.002650f, -0.004782f, -0.007002f, -0.009278f, -0.011582f, -0.013881f, -0.016142f, -0.018335f, -0.020427f, -0.022388f, -0.024190f, -0.025805f, -0.027209f, -0.028381f, -0.029301f, -0.029955f, -0.030332f, -0.030425f, -0.030229f, -0.029747f, -0.028983f, -0.027949f, -0.026658f, -0.025129f, -0.023384f, -0.021450f, -0.019356f, -0.017135f, -0.014821f, -0.012453f, -0.010068f, -0.007705f, -0.005403f, -0.003199f, -0.001132f, 0.000765f, 0.002459f, 0.003923f, 0.005133f, 0.006068f, 0.006714f, 0.007061f, 0.007107f, 0.006853f, 0.006307f, 0.005483f, 0.004398f, 0.003078f, - 0.001550f, -0.000154f, -0.001998f, -0.003945f, -0.005954f, -0.007986f, -0.010000f, -0.011957f, -0.013820f, -0.015553f, -0.017125f, -0.018509f, -0.019682f, -0.020625f, -0.021326f, -0.021779f, -0.021981f, -0.021937f, -0.021655f, -0.021150f, -0.020440f, -0.019547f, -0.018497f, -0.017318f, -0.016038f, -0.014690f, -0.013303f, -0.011907f, -0.010533f, -0.009205f, -0.007950f, -0.006788f, -0.005737f, -0.004812f, -0.004024f, -0.003378f, -0.002878f, -0.002524f, -0.002310f, -0.002231f, -0.002277f, -0.002435f, -0.002693f, -0.003035f, -0.003447f, -0.003913f, -0.004418f, -0.004947f, -0.005487f, -0.006026f, -0.006553f, -0.007060f, -0.007537f, -0.007981f, -0.008386f, -0.008750f, -0.009072f, -0.009351f, -0.009586f, -0.009780f, -0.009933f, -0.010047f, -0.010122f, -0.010159f, -0.006381f, -0.006690f, -0.008662f, 0.002553f, -0.010574f, 0.011035f, 0.038869f, 0.047782f, -0.001476f, -0.057592f, -0.008074f, 0.081084f, 0.167063f, 0.131524f, -0.064977f, -0.225303f, -0.116524f, -0.106720f, 0.051120f, 0.031455f, 0.014761f, 0.072488f, 0.123728f, -0.049501f, -0.130322f, -0.053549f, -0.035009f, 0.043494f, 0.122608f, 0.060982f, 0.081993f, 0.027759f, - -0.105798f, -0.090269f, 0.012188f, 0.131393f, 0.114304f, -0.013108f, -0.074906f, -0.125671f, 0.000687f, 0.129210f, 0.119575f, 0.055843f, -0.030085f, -0.126451f, -0.097710f, -0.012733f, 0.018779f, 0.043493f, 0.048670f, 0.038435f, 0.073203f, 0.009477f, -0.005739f, -0.029491f, -0.003281f, -0.046425f, 0.071531f, 0.124820f, -0.027036f, 0.104377f, -0.012306f, -0.156535f, -0.036736f, 0.089173f, -0.009564f, -0.102722f, -0.113879f, -0.056432f, 0.033718f, 0.111011f, 0.106408f, 0.060987f, -0.098402f, -0.161937f, -0.042886f, 0.147960f, 0.178631f, 0.059238f, -0.096398f, -0.094768f, -0.074140f, 0.004331f, 0.110634f, 0.127157f, -0.000446f, -0.145241f, -0.148045f, -0.063129f, 0.092906f, 0.034099f, 0.071394f, -0.014437f, -0.099531f, -0.089497f, -0.042822f, 0.207421f, 0.118617f, 0.040766f, -0.027915f, 0.085377f, 0.049048f, -0.025063f, -0.123015f, -0.095969f, -0.019997f, 0.123141f, 0.058986f, -0.063417f, -0.178076f, -0.082010f, 0.093463f, 0.204923f, 0.099605f, -0.009078f, -0.210971f, -0.163437f, 0.059593f, 0.248835f, 0.221802f, 0.081614f, -0.127644f, -0.192694f, -0.173678f, 0.018043f, 0.113932f, 0.194188f, - 0.059613f, -0.061966f, -0.151487f, -0.103943f, -0.003527f, 0.200654f, 0.139393f, 0.049949f, -0.128293f, -0.239667f, -0.153340f, 0.088918f, 0.245305f, 0.272430f, 0.111636f, -0.060927f, -0.184231f, -0.122958f, -0.033009f, 0.095671f, 0.143342f, 0.069690f, -0.060631f, -0.125431f, -0.080599f, 0.110443f, 0.131602f, 0.016236f, -0.033800f, -0.029587f, -0.011078f, -0.007853f}, - {-0.009644f, -0.009468f, -0.009121f, -0.008611f, -0.007953f, -0.007163f, -0.006262f, -0.005274f, -0.004225f, -0.003142f, -0.002054f, -0.000988f, 0.000027f, 0.000965f, 0.001801f, 0.002514f, 0.003085f, 0.003500f, 0.003747f, 0.003820f, 0.003717f, 0.003442f, 0.003001f, 0.002405f, 0.001670f, 0.000816f, -0.000135f, -0.001158f, -0.002227f, -0.003311f, -0.004383f, -0.005411f, -0.006366f, -0.007221f, -0.007949f, -0.008525f, -0.008928f, -0.009139f, -0.009144f, -0.008931f, -0.008492f, -0.007825f, -0.006931f, -0.005815f, -0.004486f, -0.002956f, -0.001243f, 0.000633f, 0.002650f, 0.004782f, 0.007002f, 0.009278f, 0.011582f, 0.013881f, 0.016142f, 0.018335f, 0.020427f, 0.022388f, 0.024190f, 0.025805f, 0.027209f, 0.028381f, 0.029301f, 0.029955f, 0.030332f, 0.030425f, 0.030229f, 0.029747f, 0.028983f, 0.027949f, 0.026658f, 0.025129f, 0.023384f, 0.021450f, 0.019356f, 0.017135f, 0.014821f, 0.012453f, 0.010068f, 0.007705f, 0.005403f, 0.003199f, 0.001132f, -0.000765f, -0.002459f, -0.003923f, -0.005133f, -0.006068f, -0.006714f, -0.007061f, -0.007107f, -0.006853f, -0.006307f, -0.005483f, -0.004398f, -0.003078f, - -0.001550f, 0.000154f, 0.001998f, 0.003945f, 0.005954f, 0.007986f, 0.010000f, 0.011957f, 0.013820f, 0.015553f, 0.017125f, 0.018509f, 0.019682f, 0.020625f, 0.021326f, 0.021779f, 0.021981f, 0.021937f, 0.021655f, 0.021150f, 0.020440f, 0.019547f, 0.018497f, 0.017318f, 0.016038f, 0.014690f, 0.013303f, 0.011907f, 0.010533f, 0.009205f, 0.007950f, 0.006788f, 0.005737f, 0.004812f, 0.004024f, 0.003378f, 0.002878f, 0.002524f, 0.002310f, 0.002231f, 0.002277f, 0.002435f, 0.002693f, 0.003035f, 0.003447f, 0.003913f, 0.004418f, 0.004947f, 0.005487f, 0.006026f, 0.006553f, 0.007060f, 0.007537f, 0.007981f, 0.008386f, 0.008750f, 0.009072f, 0.009351f, 0.009586f, 0.009780f, 0.009933f, 0.010047f, 0.010122f, 0.010159f, 0.006381f, 0.006690f, 0.008662f, -0.002553f, 0.010574f, -0.011035f, -0.038869f, -0.047782f, 0.001476f, 0.057592f, 0.008074f, -0.081084f, -0.167063f, -0.131524f, 0.064977f, 0.225303f, 0.116524f, 0.106720f, -0.051120f, -0.031455f, -0.014761f, -0.072488f, -0.123728f, 0.049501f, 0.130322f, 0.053549f, 0.035009f, -0.043494f, -0.122608f, -0.060982f, -0.081993f, -0.027759f, - 0.105798f, 0.090269f, -0.012188f, -0.131393f, -0.114304f, 0.013108f, 0.074906f, 0.125671f, -0.000687f, -0.129210f, -0.119575f, -0.055843f, 0.030085f, 0.126451f, 0.097710f, 0.012733f, -0.018779f, -0.043493f, -0.048670f, -0.038435f, -0.073203f, -0.009477f, 0.005739f, 0.029491f, 0.003281f, 0.046425f, -0.071531f, -0.124820f, 0.027036f, -0.104377f, 0.012306f, 0.156535f, 0.036736f, -0.089173f, 0.009564f, 0.102722f, 0.113879f, 0.056432f, -0.033718f, -0.111011f, -0.106408f, -0.060987f, 0.098402f, 0.161937f, 0.042886f, -0.147960f, -0.178631f, -0.059238f, 0.096398f, 0.094768f, 0.074140f, -0.004331f, -0.110634f, -0.127157f, 0.000446f, 0.145241f, 0.148045f, 0.063129f, -0.092906f, -0.034099f, -0.071394f, 0.014437f, 0.099531f, 0.089497f, 0.042822f, -0.207421f, -0.118617f, -0.040766f, 0.027915f, -0.085377f, -0.049048f, 0.025063f, 0.123015f, 0.095969f, 0.019997f, -0.123141f, -0.058986f, 0.063417f, 0.178076f, 0.082010f, -0.093463f, -0.204923f, -0.099605f, 0.009078f, 0.210971f, 0.163437f, -0.059593f, -0.248835f, -0.221802f, -0.081614f, 0.127644f, 0.192694f, 0.173678f, -0.018043f, -0.113932f, -0.194188f, - -0.059613f, 0.061966f, 0.151487f, 0.103943f, 0.003527f, -0.200654f, -0.139393f, -0.049949f, 0.128293f, 0.239667f, 0.153340f, -0.088918f, -0.245305f, -0.272430f, -0.111636f, 0.060927f, 0.184231f, 0.122958f, 0.033009f, -0.095671f, -0.143342f, -0.069690f, 0.060631f, 0.125431f, 0.080599f, -0.110443f, -0.131602f, -0.016236f, 0.033800f, 0.029587f, 0.011078f, 0.007853f} - }, - { - {0.006688f, 0.007032f, 0.007708f, 0.008693f, 0.009955f, 0.011450f, 0.013128f, 0.014934f, 0.016805f, 0.018680f, 0.020493f, 0.022184f, 0.023695f, 0.024974f, 0.025975f, 0.026664f, 0.027013f, 0.027007f, 0.026642f, 0.025924f, 0.024870f, 0.023506f, 0.021869f, 0.020002f, 0.017953f, 0.015777f, 0.013530f, 0.011269f, 0.009049f, 0.006923f, 0.004938f, 0.003137f, 0.001555f, 0.000218f, -0.000856f, -0.001656f, -0.002184f, -0.002445f, -0.002456f, -0.002239f, -0.001822f, -0.001235f, -0.000513f, 0.000308f, 0.001194f, 0.002110f, 0.003028f, 0.003922f, 0.004771f, 0.005561f, 0.006284f, 0.006939f, 0.007531f, 0.008072f, 0.008578f, 0.009070f, 0.009572f, 0.010110f, 0.010711f, 0.011402f, 0.012205f, 0.013143f, 0.014230f, 0.015478f, 0.016889f, 0.018460f, 0.020182f, 0.022036f, 0.023998f, 0.026036f, 0.028115f, 0.030192f, 0.032223f, 0.034162f, 0.035962f, 0.037578f, 0.038966f, 0.040089f, 0.040911f, 0.041407f, 0.041557f, 0.041350f, 0.040785f, 0.039867f, 0.038611f, 0.037042f, 0.035190f, 0.033093f, 0.030793f, 0.028340f, 0.025782f, 0.023170f, 0.020557f, 0.017990f, 0.015516f, 0.013176f, - 0.011007f, 0.009038f, 0.007291f, 0.005781f, 0.004515f, 0.003494f, 0.002709f, 0.002148f, 0.001790f, 0.001611f, 0.001583f, 0.001676f, 0.001859f, 0.002099f, 0.002368f, 0.002637f, 0.002880f, 0.003079f, 0.003215f, 0.003278f, 0.003263f, 0.003167f, 0.002995f, 0.002754f, 0.002457f, 0.002119f, 0.001756f, 0.001388f, 0.001032f, 0.000707f, 0.000430f, 0.000215f, 0.000074f, 0.000016f, 0.000045f, 0.000162f, 0.000364f, 0.000643f, 0.000991f, 0.001393f, 0.001834f, 0.002298f, 0.002766f, 0.003220f, 0.003643f, 0.004020f, 0.004337f, 0.004582f, 0.004748f, 0.004831f, 0.004830f, 0.004748f, 0.004591f, 0.004369f, 0.004094f, 0.003781f, 0.003445f, 0.003103f, 0.002773f, 0.002468f, 0.002206f, 0.001997f, 0.001852f, 0.001778f, -0.023727f, 0.016634f, 0.009006f, -0.011685f, -0.021680f, -0.002306f, -0.032702f, -0.038006f, -0.202481f, -0.239038f, 0.003434f, 0.076241f, -0.005551f, -0.025828f, 0.026393f, -0.019474f, -0.059689f, 0.012646f, 0.040288f, -0.003617f, 0.084536f, -0.053039f, -0.015912f, -0.044810f, -0.017461f, 0.051636f, 0.047463f, 0.116297f, -0.063592f, -0.053661f, -0.033912f, 0.028565f, - -0.000470f, -0.050829f, -0.048193f, -0.023396f, -0.033510f, 0.069715f, 0.043166f, -0.030671f, -0.047051f, -0.046498f, 0.022457f, 0.074459f, 0.069295f, -0.006436f, -0.109817f, -0.071303f, -0.066306f, -0.085501f, -0.011291f, 0.075125f, 0.069309f, -0.019625f, -0.090982f, -0.097550f, -0.064793f, 0.066334f, 0.094839f, 0.062269f, 0.043861f, -0.175167f, -0.161338f, -0.014099f, 0.037481f, 0.002564f, 0.235182f, 0.087904f, 0.024666f, -0.085714f, -0.067747f, 0.050710f, 0.185571f, 0.211533f, 0.033323f, -0.104839f, -0.118096f, -0.240279f, -0.193597f, 0.079305f, 0.197514f, 0.083143f, -0.061378f, -0.030936f, -0.215096f, -0.340234f, -0.090012f, 0.033569f, 0.191795f, 0.128478f, 0.017269f, -0.217333f, -0.215355f, -0.115990f, 0.087738f, 0.148494f, 0.153664f, -0.094107f, -0.147274f, -0.075449f, 0.097659f, 0.168823f, 0.161313f, -0.058709f, -0.188651f, -0.194937f, 0.019785f, 0.204732f, 0.302206f, 0.159633f, -0.139682f, -0.371291f, -0.357750f, -0.039294f, 0.260904f, 0.221567f, 0.024660f, -0.108040f, -0.252084f, -0.197389f, -0.001554f, 0.172462f, 0.230729f, 0.048514f, -0.049506f, -0.176786f, -0.206245f, -0.047202f, - 0.112449f, 0.183076f, 0.137019f, -0.027194f, -0.180198f, -0.207164f, -0.024390f, 0.162092f, 0.211010f, 0.088774f, -0.082070f, -0.187258f, -0.195080f, -0.058200f, 0.103324f, 0.124264f, 0.039575f, -0.042726f, -0.078431f, -0.078889f, -0.093859f, -0.000030f, 0.070585f, 0.095080f, 0.025593f, -0.064250f, -0.117292f, -0.045434f, 0.019444f, 0.013527f, 0.004283f, 0.000702f}, - {-0.006688f, -0.007032f, -0.007708f, -0.008693f, -0.009955f, -0.011450f, -0.013128f, -0.014934f, -0.016805f, -0.018680f, -0.020493f, -0.022184f, -0.023695f, -0.024974f, -0.025975f, -0.026664f, -0.027013f, -0.027007f, -0.026642f, -0.025924f, -0.024870f, -0.023506f, -0.021869f, -0.020002f, -0.017953f, -0.015777f, -0.013530f, -0.011269f, -0.009049f, -0.006923f, -0.004938f, -0.003137f, -0.001555f, -0.000218f, 0.000856f, 0.001656f, 0.002184f, 0.002445f, 0.002456f, 0.002239f, 0.001822f, 0.001235f, 0.000513f, -0.000308f, -0.001194f, -0.002110f, -0.003028f, -0.003922f, -0.004771f, -0.005561f, -0.006284f, -0.006939f, -0.007531f, -0.008072f, -0.008578f, -0.009070f, -0.009572f, -0.010110f, -0.010711f, -0.011402f, -0.012205f, -0.013143f, -0.014230f, -0.015478f, -0.016889f, -0.018460f, -0.020182f, -0.022036f, -0.023998f, -0.026036f, -0.028115f, -0.030192f, -0.032223f, -0.034162f, -0.035962f, -0.037578f, -0.038966f, -0.040089f, -0.040911f, -0.041407f, -0.041557f, -0.041350f, -0.040785f, -0.039867f, -0.038611f, -0.037042f, -0.035190f, -0.033093f, -0.030793f, -0.028340f, -0.025782f, -0.023170f, -0.020557f, -0.017990f, -0.015516f, -0.013176f, - -0.011007f, -0.009038f, -0.007291f, -0.005781f, -0.004515f, -0.003494f, -0.002709f, -0.002148f, -0.001790f, -0.001611f, -0.001583f, -0.001676f, -0.001859f, -0.002099f, -0.002368f, -0.002637f, -0.002880f, -0.003079f, -0.003215f, -0.003278f, -0.003263f, -0.003167f, -0.002995f, -0.002754f, -0.002457f, -0.002119f, -0.001756f, -0.001388f, -0.001032f, -0.000707f, -0.000430f, -0.000215f, -0.000074f, -0.000016f, -0.000045f, -0.000162f, -0.000364f, -0.000643f, -0.000991f, -0.001393f, -0.001834f, -0.002298f, -0.002766f, -0.003220f, -0.003643f, -0.004020f, -0.004337f, -0.004582f, -0.004748f, -0.004831f, -0.004830f, -0.004748f, -0.004591f, -0.004369f, -0.004094f, -0.003781f, -0.003445f, -0.003103f, -0.002773f, -0.002468f, -0.002206f, -0.001997f, -0.001852f, -0.001778f, 0.023727f, -0.016634f, -0.009006f, 0.011685f, 0.021680f, 0.002306f, 0.032702f, 0.038006f, 0.202481f, 0.239038f, -0.003434f, -0.076241f, 0.005551f, 0.025828f, -0.026393f, 0.019474f, 0.059689f, -0.012646f, -0.040288f, 0.003617f, -0.084536f, 0.053039f, 0.015912f, 0.044810f, 0.017461f, -0.051636f, -0.047463f, -0.116297f, 0.063592f, 0.053661f, 0.033912f, -0.028565f, - 0.000470f, 0.050829f, 0.048193f, 0.023396f, 0.033510f, -0.069715f, -0.043166f, 0.030671f, 0.047051f, 0.046498f, -0.022457f, -0.074459f, -0.069295f, 0.006436f, 0.109817f, 0.071303f, 0.066306f, 0.085501f, 0.011291f, -0.075125f, -0.069309f, 0.019625f, 0.090982f, 0.097550f, 0.064793f, -0.066334f, -0.094839f, -0.062269f, -0.043861f, 0.175167f, 0.161338f, 0.014099f, -0.037481f, -0.002564f, -0.235182f, -0.087904f, -0.024666f, 0.085714f, 0.067747f, -0.050710f, -0.185571f, -0.211533f, -0.033323f, 0.104839f, 0.118096f, 0.240279f, 0.193597f, -0.079305f, -0.197514f, -0.083143f, 0.061378f, 0.030936f, 0.215096f, 0.340234f, 0.090012f, -0.033569f, -0.191795f, -0.128478f, -0.017269f, 0.217333f, 0.215355f, 0.115990f, -0.087738f, -0.148494f, -0.153664f, 0.094107f, 0.147274f, 0.075449f, -0.097659f, -0.168823f, -0.161313f, 0.058709f, 0.188651f, 0.194937f, -0.019785f, -0.204732f, -0.302206f, -0.159633f, 0.139682f, 0.371291f, 0.357750f, 0.039294f, -0.260904f, -0.221567f, -0.024660f, 0.108040f, 0.252084f, 0.197389f, 0.001554f, -0.172462f, -0.230729f, -0.048514f, 0.049506f, 0.176786f, 0.206245f, 0.047202f, - -0.112449f, -0.183076f, -0.137019f, 0.027194f, 0.180198f, 0.207164f, 0.024390f, -0.162092f, -0.211010f, -0.088774f, 0.082070f, 0.187258f, 0.195080f, 0.058200f, -0.103324f, -0.124264f, -0.039575f, 0.042726f, 0.078431f, 0.078889f, 0.093859f, 0.000030f, -0.070585f, -0.095080f, -0.025593f, 0.064250f, 0.117292f, 0.045434f, -0.019444f, -0.013527f, -0.004283f, -0.000702f} - }, - { - {-0.042673f, -0.041730f, -0.039874f, -0.037163f, -0.033680f, -0.029535f, -0.024856f, -0.019785f, -0.014478f, -0.009095f, -0.003795f, 0.001267f, 0.005945f, 0.010111f, 0.013653f, 0.016485f, 0.018543f, 0.019793f, 0.020227f, 0.019867f, 0.018758f, 0.016974f, 0.014606f, 0.011768f, 0.008583f, 0.005187f, 0.001718f, -0.001687f, -0.004895f, -0.007785f, -0.010249f, -0.012198f, -0.013566f, -0.014306f, -0.014401f, -0.013853f, -0.012694f, -0.010976f, -0.008770f, -0.006170f, -0.003278f, -0.000211f, 0.002912f, 0.005967f, 0.008838f, 0.011412f, 0.013592f, 0.015292f, 0.016449f, 0.017016f, 0.016970f, 0.016311f, 0.015061f, 0.013261f, 0.010975f, 0.008281f, 0.005272f, 0.002053f, -0.001267f, -0.004575f, -0.007762f, -0.010723f, -0.013361f, -0.015596f, -0.017360f, -0.018605f, -0.019301f, -0.019439f, -0.019030f, -0.018105f, -0.016711f, -0.014913f, -0.012790f, -0.010428f, -0.007922f, -0.005370f, -0.002870f, -0.000514f, 0.001612f, 0.003434f, 0.004888f, 0.005930f, 0.006527f, 0.006669f, 0.006361f, 0.005623f, 0.004494f, 0.003025f, 0.001281f, -0.000667f, -0.002739f, -0.004855f, -0.006933f, -0.008895f, -0.010671f, -0.012198f, - -0.013427f, -0.014318f, -0.014850f, -0.015013f, -0.014816f, -0.014280f, -0.013438f, -0.012339f, -0.011038f, -0.009599f, -0.008090f, -0.006582f, -0.005142f, -0.003835f, -0.002722f, -0.001851f, -0.001261f, -0.000981f, -0.001023f, -0.001390f, -0.002068f, -0.003032f, -0.004245f, -0.005661f, -0.007225f, -0.008877f, -0.010553f, -0.012188f, -0.013720f, -0.015092f, -0.016251f, -0.017156f, -0.017772f, -0.018079f, -0.018067f, -0.017739f, -0.017110f, -0.016205f, -0.015061f, -0.013722f, -0.012239f, -0.010666f, -0.009062f, -0.007482f, -0.005982f, -0.004610f, -0.003411f, -0.002418f, -0.001657f, -0.001143f, -0.000880f, -0.000862f, -0.001071f, -0.001483f, -0.002062f, -0.002769f, -0.003559f, -0.004386f, -0.005202f, -0.005962f, -0.006625f, -0.007155f, -0.007525f, -0.007715f, 0.000703f, -0.012014f, 0.023058f, 0.009347f, 0.006556f, 0.046623f, 0.036669f, -0.163509f, -0.163094f, -0.105808f, -0.019357f, 0.015128f, -0.055594f, -0.018606f, 0.216331f, 0.113836f, 0.070440f, -0.103385f, -0.015700f, 0.038121f, 0.109001f, 0.010150f, 0.003061f, -0.045685f, -0.068175f, -0.040635f, -0.029258f, -0.007584f, 0.043414f, 0.073871f, 0.068350f, -0.007277f, - -0.132105f, -0.150432f, 0.005063f, 0.071415f, 0.100787f, 0.069717f, -0.005698f, -0.103146f, 0.162283f, -0.037753f, -0.072138f, -0.128314f, -0.102348f, 0.020686f, 0.191555f, 0.205195f, 0.043832f, -0.203511f, -0.313890f, -0.271106f, 0.047523f, 0.305055f, 0.370226f, 0.272333f, -0.081732f, -0.353064f, -0.324645f, -0.072582f, -0.027554f, 0.313444f, 0.189395f, 0.004285f, -0.042663f, 0.088102f, -0.150611f, -0.021456f, -0.083142f, -0.036100f, -0.169744f, -0.151088f, -0.116774f, 0.088463f, 0.131521f, 0.177038f, -0.001401f, -0.187488f, -0.416717f, -0.158257f, 0.096190f, 0.311161f, 0.110840f, -0.094059f, -0.115655f, -0.090147f, 0.106664f, 0.135269f, 0.024411f, -0.178208f, -0.242803f, -0.118685f, 0.125271f, 0.314262f, 0.181317f, -0.073741f, -0.316811f, -0.389714f, -0.057773f, 0.169178f, 0.266624f, 0.089083f, -0.167968f, -0.349306f, -0.247575f, 0.018203f, 0.266792f, 0.312023f, 0.131091f, -0.088570f, -0.234122f, -0.241933f, -0.075741f, 0.113846f, 0.186098f, 0.028217f, -0.153824f, -0.129312f, -0.105649f, -0.012657f, 0.052550f, 0.050992f, -0.011399f, 0.005730f, -0.056003f, -0.040678f, -0.060576f, -0.026527f, - -0.033121f, 0.068738f, 0.128814f, 0.085662f, -0.064948f, -0.180050f, -0.213189f, -0.062824f, 0.185219f, 0.325475f, 0.193610f, -0.043435f, -0.269135f, -0.310078f, -0.129779f, 0.121151f, 0.261649f, 0.224457f, -0.023976f, -0.263413f, -0.244097f, -0.014710f, 0.158079f, 0.227605f, 0.109615f, -0.065107f, -0.132971f, -0.069191f, -0.004626f, 0.014712f, 0.007118f, 0.001950f}, - {0.042673f, 0.041730f, 0.039874f, 0.037163f, 0.033680f, 0.029535f, 0.024856f, 0.019785f, 0.014478f, 0.009095f, 0.003795f, -0.001267f, -0.005945f, -0.010111f, -0.013653f, -0.016485f, -0.018543f, -0.019793f, -0.020227f, -0.019867f, -0.018758f, -0.016974f, -0.014606f, -0.011768f, -0.008583f, -0.005187f, -0.001718f, 0.001687f, 0.004895f, 0.007785f, 0.010249f, 0.012198f, 0.013566f, 0.014306f, 0.014401f, 0.013853f, 0.012694f, 0.010976f, 0.008770f, 0.006170f, 0.003278f, 0.000211f, -0.002912f, -0.005967f, -0.008838f, -0.011412f, -0.013592f, -0.015292f, -0.016449f, -0.017016f, -0.016970f, -0.016311f, -0.015061f, -0.013261f, -0.010975f, -0.008281f, -0.005272f, -0.002053f, 0.001267f, 0.004575f, 0.007762f, 0.010723f, 0.013361f, 0.015596f, 0.017360f, 0.018605f, 0.019301f, 0.019439f, 0.019030f, 0.018105f, 0.016711f, 0.014913f, 0.012790f, 0.010428f, 0.007922f, 0.005370f, 0.002870f, 0.000514f, -0.001612f, -0.003434f, -0.004888f, -0.005930f, -0.006527f, -0.006669f, -0.006361f, -0.005623f, -0.004494f, -0.003025f, -0.001281f, 0.000667f, 0.002739f, 0.004855f, 0.006933f, 0.008895f, 0.010671f, 0.012198f, - 0.013427f, 0.014318f, 0.014850f, 0.015013f, 0.014816f, 0.014280f, 0.013438f, 0.012339f, 0.011038f, 0.009599f, 0.008090f, 0.006582f, 0.005142f, 0.003835f, 0.002722f, 0.001851f, 0.001261f, 0.000981f, 0.001023f, 0.001390f, 0.002068f, 0.003032f, 0.004245f, 0.005661f, 0.007225f, 0.008877f, 0.010553f, 0.012188f, 0.013720f, 0.015092f, 0.016251f, 0.017156f, 0.017772f, 0.018079f, 0.018067f, 0.017739f, 0.017110f, 0.016205f, 0.015061f, 0.013722f, 0.012239f, 0.010666f, 0.009062f, 0.007482f, 0.005982f, 0.004610f, 0.003411f, 0.002418f, 0.001657f, 0.001143f, 0.000880f, 0.000862f, 0.001071f, 0.001483f, 0.002062f, 0.002769f, 0.003559f, 0.004386f, 0.005202f, 0.005962f, 0.006625f, 0.007155f, 0.007525f, 0.007715f, -0.000703f, 0.012014f, -0.023058f, -0.009347f, -0.006556f, -0.046623f, -0.036669f, 0.163509f, 0.163094f, 0.105808f, 0.019357f, -0.015128f, 0.055594f, 0.018606f, -0.216331f, -0.113836f, -0.070440f, 0.103385f, 0.015700f, -0.038121f, -0.109001f, -0.010150f, -0.003061f, 0.045685f, 0.068175f, 0.040635f, 0.029258f, 0.007584f, -0.043414f, -0.073871f, -0.068350f, 0.007277f, - 0.132105f, 0.150432f, -0.005063f, -0.071415f, -0.100787f, -0.069717f, 0.005698f, 0.103146f, -0.162283f, 0.037753f, 0.072138f, 0.128314f, 0.102348f, -0.020686f, -0.191555f, -0.205195f, -0.043832f, 0.203511f, 0.313890f, 0.271106f, -0.047523f, -0.305055f, -0.370226f, -0.272333f, 0.081732f, 0.353064f, 0.324645f, 0.072582f, 0.027554f, -0.313444f, -0.189395f, -0.004285f, 0.042663f, -0.088102f, 0.150611f, 0.021456f, 0.083142f, 0.036100f, 0.169744f, 0.151088f, 0.116774f, -0.088463f, -0.131521f, -0.177038f, 0.001401f, 0.187488f, 0.416717f, 0.158257f, -0.096190f, -0.311161f, -0.110840f, 0.094059f, 0.115655f, 0.090147f, -0.106664f, -0.135269f, -0.024411f, 0.178208f, 0.242803f, 0.118685f, -0.125271f, -0.314262f, -0.181317f, 0.073741f, 0.316811f, 0.389714f, 0.057773f, -0.169178f, -0.266624f, -0.089083f, 0.167968f, 0.349306f, 0.247575f, -0.018203f, -0.266792f, -0.312023f, -0.131091f, 0.088570f, 0.234122f, 0.241933f, 0.075741f, -0.113846f, -0.186098f, -0.028217f, 0.153824f, 0.129312f, 0.105649f, 0.012657f, -0.052550f, -0.050992f, 0.011399f, -0.005730f, 0.056003f, 0.040678f, 0.060576f, 0.026527f, - 0.033121f, -0.068738f, -0.128814f, -0.085662f, 0.064948f, 0.180050f, 0.213189f, 0.062824f, -0.185219f, -0.325475f, -0.193610f, 0.043435f, 0.269135f, 0.310078f, 0.129779f, -0.121151f, -0.261649f, -0.224457f, 0.023976f, 0.263413f, 0.244097f, 0.014710f, -0.158079f, -0.227605f, -0.109615f, 0.065107f, 0.132971f, 0.069191f, 0.004626f, -0.014712f, -0.007118f, -0.001950f} - }, - { - {-0.031658f, -0.031297f, -0.030589f, -0.029558f, -0.028244f, -0.026693f, -0.024961f, -0.023108f, -0.021197f, -0.019293f, -0.017453f, -0.015733f, -0.014178f, -0.012823f, -0.011691f, -0.010791f, -0.010119f, -0.009655f, -0.009369f, -0.009215f, -0.009139f, -0.009079f, -0.008966f, -0.008732f, -0.008307f, -0.007627f, -0.006635f, -0.005285f, -0.003546f, -0.001400f, 0.001151f, 0.004090f, 0.007378f, 0.010960f, 0.014762f, 0.018696f, 0.022660f, 0.026545f, 0.030233f, 0.033604f, 0.036543f, 0.038939f, 0.040691f, 0.041714f, 0.041939f, 0.041320f, 0.039833f, 0.037479f, 0.034284f, 0.030301f, 0.025606f, 0.020299f, 0.014499f, 0.008344f, 0.001982f, -0.004428f, -0.010724f, -0.016746f, -0.022339f, -0.027361f, -0.031682f, -0.035196f, -0.037817f, -0.039484f, -0.040166f, -0.039858f, -0.038586f, -0.036401f, -0.033380f, -0.029624f, -0.025254f, -0.020406f, -0.015225f, -0.009867f, -0.004485f, 0.000768f, 0.005751f, 0.010331f, 0.014397f, 0.017853f, 0.020629f, 0.022677f, 0.023976f, 0.024528f, 0.024360f, 0.023523f, 0.022087f, 0.020138f, 0.017775f, 0.015110f, 0.012256f, 0.009328f, 0.006438f, 0.003689f, 0.001175f, -0.001027f, - -0.002856f, -0.004270f, -0.005245f, -0.005781f, -0.005894f, -0.005621f, -0.005015f, -0.004141f, -0.003077f, -0.001909f, -0.000724f, 0.000387f, 0.001340f, 0.002056f, 0.002467f, 0.002519f, 0.002172f, 0.001402f, 0.000205f, -0.001407f, -0.003403f, -0.005737f, -0.008349f, -0.011165f, -0.014104f, -0.017078f, -0.019996f, -0.022768f, -0.025309f, -0.027538f, -0.029388f, -0.030804f, -0.031742f, -0.032179f, -0.032105f, -0.031528f, -0.030472f, -0.028978f, -0.027098f, -0.024896f, -0.022445f, -0.019824f, -0.017114f, -0.014397f, -0.011749f, -0.009244f, -0.006944f, -0.004900f, -0.003155f, -0.001732f, -0.000646f, 0.000106f, 0.000538f, 0.000677f, 0.000562f, 0.000237f, -0.000245f, -0.000829f, -0.001459f, -0.002081f, -0.002644f, -0.003107f, -0.003436f, -0.003606f, 0.035933f, 0.020984f, 0.026867f, 0.002696f, 0.025415f, -0.036934f, 0.120298f, 0.068769f, -0.020529f, -0.006575f, 0.082765f, -0.095468f, 0.015725f, 0.111940f, -0.049377f, -0.361451f, -0.225560f, -0.127606f, 0.157523f, 0.115815f, -0.176161f, -0.033340f, 0.133488f, 0.235074f, 0.062310f, -0.045055f, -0.116670f, -0.191947f, -0.051784f, 0.128127f, 0.226928f, 0.159370f, - 0.002583f, -0.117427f, -0.145975f, -0.075645f, 0.062470f, 0.165515f, 0.094874f, 0.046350f, -0.069340f, -0.121021f, -0.054308f, 0.095239f, 0.175485f, 0.141666f, -0.009457f, -0.072362f, -0.077262f, -0.112777f, -0.041468f, 0.010540f, 0.128448f, 0.207661f, 0.236093f, 0.111252f, -0.132629f, -0.260489f, -0.113035f, 0.074176f, -0.037847f, 0.237528f, 0.168932f, 0.081841f, -0.030812f, 0.116029f, -0.233120f, -0.186041f, -0.172953f, 0.042388f, 0.022458f, 0.053621f, -0.126092f, 0.022388f, 0.106431f, 0.197811f, 0.251476f, -0.250332f, -0.447804f, -0.146131f, 0.106907f, 0.301541f, 0.246779f, 0.195526f, -0.234959f, -0.654778f, -0.528090f, -0.091133f, 0.350633f, 0.435490f, 0.196637f, -0.176745f, -0.414173f, -0.391466f, -0.050836f, 0.150028f, 0.222439f, 0.035540f, -0.112228f, -0.104142f, 0.130390f, 0.149355f, 0.031043f, -0.104799f, -0.143846f, -0.061771f, 0.118866f, 0.183334f, 0.124964f, -0.017414f, -0.101273f, -0.078169f, -0.013332f, 0.189832f, 0.145048f, -0.122418f, -0.167217f, -0.105858f, -0.041787f, 0.035448f, 0.048130f, -0.023457f, -0.119449f, -0.069736f, -0.037997f, -0.014965f, -0.006334f, -0.000078f, - -0.038475f, -0.075177f, 0.020174f, 0.057602f, 0.045164f, -0.033911f, -0.121277f, -0.077838f, -0.000650f, 0.066829f, 0.097348f, 0.064148f, -0.064369f, -0.142455f, -0.077573f, 0.093315f, 0.196517f, 0.146823f, -0.035371f, -0.226970f, -0.280115f, -0.132018f, 0.119916f, 0.339091f, 0.295249f, 0.056229f, -0.254791f, -0.278626f, -0.087325f, 0.007573f, 0.004968f, -0.008294f}, - {-0.031658f, -0.031297f, -0.030589f, -0.029558f, -0.028244f, -0.026693f, -0.024961f, -0.023108f, -0.021197f, -0.019293f, -0.017453f, -0.015733f, -0.014178f, -0.012823f, -0.011691f, -0.010791f, -0.010119f, -0.009655f, -0.009369f, -0.009215f, -0.009139f, -0.009079f, -0.008966f, -0.008732f, -0.008307f, -0.007627f, -0.006635f, -0.005285f, -0.003546f, -0.001400f, 0.001151f, 0.004090f, 0.007378f, 0.010960f, 0.014762f, 0.018696f, 0.022660f, 0.026545f, 0.030233f, 0.033604f, 0.036543f, 0.038939f, 0.040691f, 0.041714f, 0.041939f, 0.041320f, 0.039833f, 0.037479f, 0.034284f, 0.030301f, 0.025606f, 0.020299f, 0.014499f, 0.008344f, 0.001982f, -0.004428f, -0.010724f, -0.016746f, -0.022339f, -0.027361f, -0.031682f, -0.035196f, -0.037817f, -0.039484f, -0.040166f, -0.039858f, -0.038586f, -0.036401f, -0.033380f, -0.029624f, -0.025254f, -0.020406f, -0.015225f, -0.009867f, -0.004485f, 0.000768f, 0.005751f, 0.010331f, 0.014397f, 0.017853f, 0.020629f, 0.022677f, 0.023976f, 0.024528f, 0.024360f, 0.023523f, 0.022087f, 0.020138f, 0.017775f, 0.015110f, 0.012256f, 0.009328f, 0.006438f, 0.003689f, 0.001175f, -0.001027f, - -0.002856f, -0.004270f, -0.005245f, -0.005781f, -0.005894f, -0.005621f, -0.005015f, -0.004141f, -0.003077f, -0.001909f, -0.000724f, 0.000387f, 0.001340f, 0.002056f, 0.002467f, 0.002519f, 0.002172f, 0.001402f, 0.000205f, -0.001407f, -0.003403f, -0.005737f, -0.008349f, -0.011165f, -0.014104f, -0.017078f, -0.019996f, -0.022768f, -0.025309f, -0.027538f, -0.029388f, -0.030804f, -0.031742f, -0.032179f, -0.032105f, -0.031528f, -0.030472f, -0.028978f, -0.027098f, -0.024896f, -0.022445f, -0.019824f, -0.017114f, -0.014397f, -0.011749f, -0.009244f, -0.006944f, -0.004900f, -0.003155f, -0.001732f, -0.000646f, 0.000106f, 0.000538f, 0.000677f, 0.000562f, 0.000237f, -0.000245f, -0.000829f, -0.001459f, -0.002081f, -0.002644f, -0.003107f, -0.003436f, -0.003606f, 0.035933f, 0.020984f, 0.026867f, 0.002696f, 0.025415f, -0.036934f, 0.120298f, 0.068769f, -0.020529f, -0.006575f, 0.082765f, -0.095468f, 0.015725f, 0.111940f, -0.049377f, -0.361451f, -0.225560f, -0.127606f, 0.157523f, 0.115815f, -0.176161f, -0.033340f, 0.133488f, 0.235074f, 0.062310f, -0.045055f, -0.116670f, -0.191947f, -0.051784f, 0.128127f, 0.226928f, 0.159370f, - 0.002583f, -0.117427f, -0.145975f, -0.075645f, 0.062470f, 0.165515f, 0.094874f, 0.046350f, -0.069340f, -0.121021f, -0.054308f, 0.095239f, 0.175485f, 0.141666f, -0.009457f, -0.072362f, -0.077262f, -0.112777f, -0.041468f, 0.010540f, 0.128448f, 0.207661f, 0.236093f, 0.111252f, -0.132629f, -0.260489f, -0.113035f, 0.074176f, -0.037847f, 0.237528f, 0.168932f, 0.081841f, -0.030812f, 0.116029f, -0.233120f, -0.186041f, -0.172953f, 0.042388f, 0.022458f, 0.053621f, -0.126092f, 0.022388f, 0.106431f, 0.197811f, 0.251476f, -0.250332f, -0.447804f, -0.146131f, 0.106907f, 0.301541f, 0.246779f, 0.195526f, -0.234959f, -0.654778f, -0.528090f, -0.091133f, 0.350633f, 0.435490f, 0.196637f, -0.176745f, -0.414173f, -0.391466f, -0.050836f, 0.150028f, 0.222439f, 0.035540f, -0.112228f, -0.104142f, 0.130390f, 0.149355f, 0.031043f, -0.104799f, -0.143846f, -0.061771f, 0.118866f, 0.183334f, 0.124964f, -0.017414f, -0.101273f, -0.078169f, -0.013332f, 0.189832f, 0.145048f, -0.122418f, -0.167217f, -0.105858f, -0.041787f, 0.035448f, 0.048130f, -0.023457f, -0.119449f, -0.069736f, -0.037997f, -0.014965f, -0.006334f, -0.000078f, - -0.038475f, -0.075177f, 0.020174f, 0.057602f, 0.045164f, -0.033911f, -0.121277f, -0.077838f, -0.000650f, 0.066829f, 0.097348f, 0.064148f, -0.064369f, -0.142455f, -0.077573f, 0.093315f, 0.196517f, 0.146823f, -0.035371f, -0.226970f, -0.280115f, -0.132018f, 0.119916f, 0.339091f, 0.295249f, 0.056229f, -0.254791f, -0.278626f, -0.087325f, 0.007573f, 0.004968f, -0.008294f} - }, - { - {-0.015408f, -0.015285f, -0.015045f, -0.014699f, -0.014264f, -0.013763f, -0.013221f, -0.012665f, -0.012125f, -0.011630f, -0.011207f, -0.010883f, -0.010680f, -0.010613f, -0.010695f, -0.010928f, -0.011312f, -0.011835f, -0.012479f, -0.013221f, -0.014029f, -0.014866f, -0.015690f, -0.016456f, -0.017119f, -0.017630f, -0.017943f, -0.018017f, -0.017814f, -0.017300f, -0.016454f, -0.015260f, -0.013714f, -0.011820f, -0.009596f, -0.007071f, -0.004283f, -0.001282f, 0.001874f, 0.005119f, 0.008379f, 0.011578f, 0.014635f, 0.017470f, 0.020005f, 0.022165f, 0.023883f, 0.025098f, 0.025763f, 0.025840f, 0.025305f, 0.024148f, 0.022376f, 0.020009f, 0.017083f, 0.013647f, 0.009766f, 0.005515f, 0.000979f, -0.003748f, -0.008566f, -0.013374f, -0.018066f, -0.022543f, -0.026708f, -0.030471f, -0.033752f, -0.036484f, -0.038612f, -0.040097f, -0.040914f, -0.041057f, -0.040536f, -0.039377f, -0.037621f, -0.035325f, -0.032558f, -0.029401f, -0.025942f, -0.022276f, -0.018502f, -0.014719f, -0.011026f, -0.007514f, -0.004270f, -0.001371f, 0.001119f, 0.003148f, 0.004679f, 0.005688f, 0.006171f, 0.006137f, 0.005610f, 0.004629f, 0.003246f, 0.001525f, - -0.000461f, -0.002632f, -0.004905f, -0.007193f, -0.009411f, -0.011474f, -0.013307f, -0.014840f, -0.016015f, -0.016782f, -0.017108f, -0.016971f, -0.016366f, -0.015300f, -0.013795f, -0.011888f, -0.009625f, -0.007066f, -0.004279f, -0.001337f, 0.001679f, 0.004689f, 0.007611f, 0.010367f, 0.012881f, 0.015088f, 0.016929f, 0.018356f, 0.019333f, 0.019837f, 0.019856f, 0.019395f, 0.018467f, 0.017103f, 0.015340f, 0.013228f, 0.010824f, 0.008193f, 0.005403f, 0.002524f, -0.000374f, -0.003221f, -0.005953f, -0.008511f, -0.010844f, -0.012909f, -0.014675f, -0.016119f, -0.017231f, -0.018011f, -0.018470f, -0.018628f, -0.018516f, -0.018171f, -0.017635f, -0.016957f, -0.016187f, -0.015375f, -0.014571f, -0.013822f, -0.013169f, -0.012646f, -0.012282f, -0.012095f, -0.020686f, -0.012326f, 0.042249f, 0.011897f, -0.022847f, -0.048127f, 0.083811f, 0.129155f, 0.163708f, 0.022869f, -0.072526f, -0.164162f, -0.007816f, 0.027666f, -0.093836f, -0.134766f, -0.127618f, -0.159064f, 0.083027f, 0.276492f, 0.024970f, 0.012459f, -0.072943f, -0.075554f, -0.058818f, 0.141418f, 0.095215f, 0.252683f, 0.019866f, 0.006696f, -0.119821f, -0.077002f, - -0.045750f, 0.087841f, 0.149808f, 0.113649f, -0.009288f, -0.069954f, -0.072106f, -0.074136f, -0.033421f, 0.050376f, 0.106111f, 0.055032f, -0.022958f, -0.052034f, -0.042467f, 0.061100f, 0.037831f, -0.077361f, -0.100657f, -0.030394f, 0.011179f, 0.027216f, 0.107319f, -0.003935f, 0.036237f, -0.038532f, 0.028205f, -0.009426f, -0.146082f, 0.148498f, 0.116117f, -0.024541f, -0.083741f, 0.082639f, -0.188835f, -0.023098f, -0.023592f, 0.019447f, -0.138882f, -0.250382f, -0.311850f, 0.004980f, 0.286101f, 0.301464f, 0.107797f, -0.150925f, -0.259117f, -0.206325f, 0.001685f, 0.241522f, 0.282817f, 0.062626f, -0.088421f, -0.041516f, 0.003648f, 0.054010f, 0.046370f, 0.040694f, -0.052706f, -0.146004f, -0.137439f, -0.016482f, 0.155527f, 0.237146f, 0.195189f, 0.016389f, -0.202511f, -0.280801f, -0.243882f, 0.079192f, 0.301892f, 0.366577f, 0.210273f, -0.098096f, -0.289805f, -0.270517f, -0.114198f, 0.058399f, 0.086904f, 0.105942f, 0.029166f, -0.094588f, -0.004971f, 0.129819f, 0.201895f, -0.053156f, -0.121050f, -0.124760f, 0.042954f, 0.084181f, 0.177267f, 0.093099f, -0.039351f, -0.180287f, -0.210676f, -0.092445f, - 0.129987f, 0.290854f, 0.262032f, 0.051008f, -0.247422f, -0.366382f, -0.302780f, 0.000925f, 0.339108f, 0.427318f, 0.233903f, -0.080922f, -0.325694f, -0.336162f, -0.091573f, 0.058594f, 0.159764f, 0.137345f, 0.076793f, -0.013573f, -0.089058f, -0.094353f, -0.028671f, 0.034008f, 0.110977f, 0.068440f, 0.011509f, -0.020070f, -0.051275f, -0.009802f, -0.008549f, -0.003679f}, - {-0.015408f, -0.015285f, -0.015045f, -0.014699f, -0.014264f, -0.013763f, -0.013221f, -0.012665f, -0.012125f, -0.011630f, -0.011207f, -0.010883f, -0.010680f, -0.010613f, -0.010695f, -0.010928f, -0.011312f, -0.011835f, -0.012479f, -0.013221f, -0.014029f, -0.014866f, -0.015690f, -0.016456f, -0.017119f, -0.017630f, -0.017943f, -0.018017f, -0.017814f, -0.017300f, -0.016454f, -0.015260f, -0.013714f, -0.011820f, -0.009596f, -0.007071f, -0.004283f, -0.001282f, 0.001874f, 0.005119f, 0.008379f, 0.011578f, 0.014635f, 0.017470f, 0.020005f, 0.022165f, 0.023883f, 0.025098f, 0.025763f, 0.025840f, 0.025305f, 0.024148f, 0.022376f, 0.020009f, 0.017083f, 0.013647f, 0.009766f, 0.005515f, 0.000979f, -0.003748f, -0.008566f, -0.013374f, -0.018066f, -0.022543f, -0.026708f, -0.030471f, -0.033752f, -0.036484f, -0.038612f, -0.040097f, -0.040914f, -0.041057f, -0.040536f, -0.039377f, -0.037621f, -0.035325f, -0.032558f, -0.029401f, -0.025942f, -0.022276f, -0.018502f, -0.014719f, -0.011026f, -0.007514f, -0.004270f, -0.001371f, 0.001119f, 0.003148f, 0.004679f, 0.005688f, 0.006171f, 0.006137f, 0.005610f, 0.004629f, 0.003246f, 0.001525f, - -0.000461f, -0.002632f, -0.004905f, -0.007193f, -0.009411f, -0.011474f, -0.013307f, -0.014840f, -0.016015f, -0.016782f, -0.017108f, -0.016971f, -0.016366f, -0.015300f, -0.013795f, -0.011888f, -0.009625f, -0.007066f, -0.004279f, -0.001337f, 0.001679f, 0.004689f, 0.007611f, 0.010367f, 0.012881f, 0.015088f, 0.016929f, 0.018356f, 0.019333f, 0.019837f, 0.019856f, 0.019395f, 0.018467f, 0.017103f, 0.015340f, 0.013228f, 0.010824f, 0.008193f, 0.005403f, 0.002524f, -0.000374f, -0.003221f, -0.005953f, -0.008511f, -0.010844f, -0.012909f, -0.014675f, -0.016119f, -0.017231f, -0.018011f, -0.018470f, -0.018628f, -0.018516f, -0.018171f, -0.017635f, -0.016957f, -0.016187f, -0.015375f, -0.014571f, -0.013822f, -0.013169f, -0.012646f, -0.012282f, -0.012095f, -0.020686f, -0.012326f, 0.042249f, 0.011897f, -0.022847f, -0.048127f, 0.083811f, 0.129155f, 0.163708f, 0.022869f, -0.072526f, -0.164162f, -0.007816f, 0.027666f, -0.093836f, -0.134766f, -0.127618f, -0.159064f, 0.083027f, 0.276492f, 0.024970f, 0.012459f, -0.072943f, -0.075554f, -0.058818f, 0.141418f, 0.095215f, 0.252683f, 0.019866f, 0.006696f, -0.119821f, -0.077002f, - -0.045750f, 0.087841f, 0.149808f, 0.113649f, -0.009288f, -0.069954f, -0.072106f, -0.074136f, -0.033421f, 0.050376f, 0.106111f, 0.055032f, -0.022958f, -0.052034f, -0.042467f, 0.061100f, 0.037831f, -0.077361f, -0.100657f, -0.030394f, 0.011179f, 0.027216f, 0.107319f, -0.003935f, 0.036237f, -0.038532f, 0.028205f, -0.009426f, -0.146082f, 0.148498f, 0.116117f, -0.024541f, -0.083741f, 0.082639f, -0.188835f, -0.023098f, -0.023592f, 0.019447f, -0.138882f, -0.250382f, -0.311850f, 0.004980f, 0.286101f, 0.301464f, 0.107797f, -0.150925f, -0.259117f, -0.206325f, 0.001685f, 0.241522f, 0.282817f, 0.062626f, -0.088421f, -0.041516f, 0.003648f, 0.054010f, 0.046370f, 0.040694f, -0.052706f, -0.146004f, -0.137439f, -0.016482f, 0.155527f, 0.237146f, 0.195189f, 0.016389f, -0.202511f, -0.280801f, -0.243882f, 0.079192f, 0.301892f, 0.366577f, 0.210273f, -0.098096f, -0.289805f, -0.270517f, -0.114198f, 0.058399f, 0.086904f, 0.105942f, 0.029166f, -0.094588f, -0.004971f, 0.129819f, 0.201895f, -0.053156f, -0.121050f, -0.124760f, 0.042954f, 0.084181f, 0.177267f, 0.093099f, -0.039351f, -0.180287f, -0.210676f, -0.092445f, - 0.129987f, 0.290854f, 0.262032f, 0.051008f, -0.247422f, -0.366382f, -0.302780f, 0.000925f, 0.339108f, 0.427318f, 0.233903f, -0.080922f, -0.325694f, -0.336162f, -0.091573f, 0.058594f, 0.159764f, 0.137345f, 0.076793f, -0.013573f, -0.089058f, -0.094353f, -0.028671f, 0.034008f, 0.110977f, 0.068440f, 0.011509f, -0.020070f, -0.051275f, -0.009802f, -0.008549f, -0.003679f} - }, - { - {0.032299f, 0.031544f, 0.030055f, 0.027873f, 0.025059f, 0.021690f, 0.017856f, 0.013663f, 0.009222f, 0.004650f, 0.000066f, -0.004415f, -0.008680f, -0.012630f, -0.016174f, -0.019236f, -0.021759f, -0.023700f, -0.025037f, -0.025768f, -0.025906f, -0.025484f, -0.024551f, -0.023167f, -0.021406f, -0.019350f, -0.017085f, -0.014701f, -0.012287f, -0.009926f, -0.007696f, -0.005667f, -0.003897f, -0.002429f, -0.001295f, -0.000512f, -0.000081f, 0.000010f, -0.000213f, -0.000713f, -0.001443f, -0.002350f, -0.003372f, -0.004446f, -0.005511f, -0.006505f, -0.007372f, -0.008061f, -0.008533f, -0.008755f, -0.008706f, -0.008379f, -0.007775f, -0.006907f, -0.005800f, -0.004486f, -0.003005f, -0.001405f, 0.000266f, 0.001954f, 0.003609f, 0.005181f, 0.006625f, 0.007903f, 0.008984f, 0.009845f, 0.010472f, 0.010863f, 0.011022f, 0.010966f, 0.010717f, 0.010306f, 0.009770f, 0.009148f, 0.008484f, 0.007820f, 0.007197f, 0.006653f, 0.006221f, 0.005927f, 0.005791f, 0.005822f, 0.006022f, 0.006383f, 0.006889f, 0.007515f, 0.008231f, 0.009000f, 0.009779f, 0.010525f, 0.011195f, 0.011745f, 0.012135f, 0.012331f, 0.012304f, 0.012035f, - 0.011513f, 0.010735f, 0.009710f, 0.008458f, 0.007006f, 0.005391f, 0.003659f, 0.001860f, 0.000049f, -0.001714f, -0.003372f, -0.004865f, -0.006142f, -0.007151f, -0.007852f, -0.008212f, -0.008206f, -0.007822f, -0.007059f, -0.005925f, -0.004442f, -0.002640f, -0.000561f, 0.001749f, 0.004233f, 0.006831f, 0.009481f, 0.012119f, 0.014683f, 0.017113f, 0.019354f, 0.021358f, 0.023083f, 0.024499f, 0.025582f, 0.026320f, 0.026709f, 0.026758f, 0.026480f, 0.025901f, 0.025050f, 0.023964f, 0.022684f, 0.021252f, 0.019712f, 0.018108f, 0.016481f, 0.014870f, 0.013308f, 0.011825f, 0.010443f, 0.009182f, 0.008051f, 0.007056f, 0.006199f, 0.005475f, 0.004876f, 0.004392f, 0.004010f, 0.003717f, 0.003501f, 0.003350f, 0.003255f, 0.003210f, -0.013680f, -0.039550f, -0.038004f, -0.021661f, 0.011200f, 0.000727f, -0.055616f, 0.005118f, -0.073839f, -0.098462f, -0.068399f, -0.001479f, -0.054556f, 0.005705f, -0.020564f, -0.008444f, -0.065880f, -0.030718f, 0.136221f, 0.158023f, -0.089897f, -0.028536f, 0.013666f, 0.105333f, 0.066431f, 0.035655f, 0.039198f, -0.028502f, -0.059788f, -0.060135f, 0.033058f, 0.092928f, - -0.009570f, -0.065701f, -0.068909f, -0.005240f, 0.042002f, 0.099751f, 0.024988f, -0.005379f, -0.041463f, 0.032064f, 0.017203f, 0.091991f, 0.037084f, 0.014363f, -0.024151f, -0.000292f, -0.050768f, -0.055517f, -0.058829f, 0.077306f, 0.048217f, 0.028005f, -0.043731f, -0.103314f, -0.084560f, 0.008726f, 0.030716f, 0.040377f, 0.097543f, -0.094716f, -0.112332f, -0.068748f, 0.010776f, -0.025287f, 0.173500f, 0.126353f, 0.098705f, -0.033310f, -0.045328f, -0.096649f, 0.056125f, 0.059148f, 0.063656f, 0.051949f, 0.013214f, -0.165706f, -0.244565f, -0.146717f, 0.089772f, 0.235814f, 0.281104f, 0.041070f, -0.139964f, -0.268631f, -0.126872f, 0.045759f, 0.225982f, 0.215417f, 0.079051f, -0.048478f, -0.284325f, -0.235456f, -0.000243f, 0.173903f, 0.206366f, 0.016453f, -0.145258f, -0.163019f, -0.051451f, 0.085441f, 0.149474f, 0.015766f, -0.148167f, -0.220790f, -0.111326f, 0.104355f, 0.273432f, 0.144737f, -0.129187f, -0.311249f, -0.225754f, -0.091820f, 0.299847f, 0.419689f, 0.126895f, -0.229018f, -0.342215f, -0.194918f, 0.122016f, 0.285187f, 0.358148f, 0.124243f, -0.127982f, -0.282243f, -0.197338f, 0.015785f, - 0.230173f, 0.268222f, 0.092309f, -0.109969f, -0.202412f, -0.112134f, 0.095827f, 0.220495f, 0.116567f, -0.053352f, -0.155056f, -0.119150f, 0.106271f, 0.197023f, 0.114667f, -0.061074f, -0.194423f, -0.209315f, -0.031668f, 0.202858f, 0.246496f, 0.101415f, -0.106340f, -0.237504f, -0.213684f, -0.067325f, 0.140445f, 0.193717f, 0.078110f, 0.001223f, -0.002604f, 0.006252f}, - {0.032299f, 0.031544f, 0.030055f, 0.027873f, 0.025059f, 0.021690f, 0.017856f, 0.013663f, 0.009222f, 0.004650f, 0.000066f, -0.004415f, -0.008680f, -0.012630f, -0.016174f, -0.019236f, -0.021759f, -0.023700f, -0.025037f, -0.025768f, -0.025906f, -0.025484f, -0.024551f, -0.023167f, -0.021406f, -0.019350f, -0.017085f, -0.014701f, -0.012287f, -0.009926f, -0.007696f, -0.005667f, -0.003897f, -0.002429f, -0.001295f, -0.000512f, -0.000081f, 0.000010f, -0.000213f, -0.000713f, -0.001443f, -0.002350f, -0.003372f, -0.004446f, -0.005511f, -0.006505f, -0.007372f, -0.008061f, -0.008533f, -0.008755f, -0.008706f, -0.008379f, -0.007775f, -0.006907f, -0.005800f, -0.004486f, -0.003005f, -0.001405f, 0.000266f, 0.001954f, 0.003609f, 0.005181f, 0.006625f, 0.007903f, 0.008984f, 0.009845f, 0.010472f, 0.010863f, 0.011022f, 0.010966f, 0.010717f, 0.010306f, 0.009770f, 0.009148f, 0.008484f, 0.007820f, 0.007197f, 0.006653f, 0.006221f, 0.005927f, 0.005791f, 0.005822f, 0.006022f, 0.006383f, 0.006889f, 0.007515f, 0.008231f, 0.009000f, 0.009779f, 0.010525f, 0.011195f, 0.011745f, 0.012135f, 0.012331f, 0.012304f, 0.012035f, - 0.011513f, 0.010735f, 0.009710f, 0.008458f, 0.007006f, 0.005391f, 0.003659f, 0.001860f, 0.000049f, -0.001714f, -0.003372f, -0.004865f, -0.006142f, -0.007151f, -0.007852f, -0.008212f, -0.008206f, -0.007822f, -0.007059f, -0.005925f, -0.004442f, -0.002640f, -0.000561f, 0.001749f, 0.004233f, 0.006831f, 0.009481f, 0.012119f, 0.014683f, 0.017113f, 0.019354f, 0.021358f, 0.023083f, 0.024499f, 0.025582f, 0.026320f, 0.026709f, 0.026758f, 0.026480f, 0.025901f, 0.025050f, 0.023964f, 0.022684f, 0.021252f, 0.019712f, 0.018108f, 0.016481f, 0.014870f, 0.013308f, 0.011825f, 0.010443f, 0.009182f, 0.008051f, 0.007056f, 0.006199f, 0.005475f, 0.004876f, 0.004392f, 0.004010f, 0.003717f, 0.003501f, 0.003350f, 0.003255f, 0.003210f, -0.013680f, -0.039550f, -0.038004f, -0.021661f, 0.011200f, 0.000727f, -0.055616f, 0.005118f, -0.073839f, -0.098462f, -0.068399f, -0.001479f, -0.054556f, 0.005705f, -0.020564f, -0.008444f, -0.065880f, -0.030718f, 0.136221f, 0.158023f, -0.089897f, -0.028536f, 0.013666f, 0.105333f, 0.066431f, 0.035655f, 0.039198f, -0.028502f, -0.059788f, -0.060135f, 0.033058f, 0.092928f, - -0.009570f, -0.065701f, -0.068909f, -0.005240f, 0.042002f, 0.099751f, 0.024988f, -0.005379f, -0.041463f, 0.032064f, 0.017203f, 0.091991f, 0.037084f, 0.014363f, -0.024151f, -0.000292f, -0.050768f, -0.055517f, -0.058829f, 0.077306f, 0.048217f, 0.028005f, -0.043731f, -0.103314f, -0.084560f, 0.008726f, 0.030716f, 0.040377f, 0.097543f, -0.094716f, -0.112332f, -0.068748f, 0.010776f, -0.025287f, 0.173500f, 0.126353f, 0.098705f, -0.033310f, -0.045328f, -0.096649f, 0.056125f, 0.059148f, 0.063656f, 0.051949f, 0.013214f, -0.165706f, -0.244565f, -0.146717f, 0.089772f, 0.235814f, 0.281104f, 0.041070f, -0.139964f, -0.268631f, -0.126872f, 0.045759f, 0.225982f, 0.215417f, 0.079051f, -0.048478f, -0.284325f, -0.235456f, -0.000243f, 0.173903f, 0.206366f, 0.016453f, -0.145258f, -0.163019f, -0.051451f, 0.085441f, 0.149474f, 0.015766f, -0.148167f, -0.220790f, -0.111326f, 0.104355f, 0.273432f, 0.144737f, -0.129187f, -0.311249f, -0.225754f, -0.091820f, 0.299847f, 0.419689f, 0.126895f, -0.229018f, -0.342215f, -0.194918f, 0.122016f, 0.285187f, 0.358148f, 0.124243f, -0.127982f, -0.282243f, -0.197338f, 0.015785f, - 0.230173f, 0.268222f, 0.092309f, -0.109969f, -0.202412f, -0.112134f, 0.095827f, 0.220495f, 0.116567f, -0.053352f, -0.155056f, -0.119150f, 0.106271f, 0.197023f, 0.114667f, -0.061074f, -0.194423f, -0.209315f, -0.031668f, 0.202858f, 0.246496f, 0.101415f, -0.106340f, -0.237504f, -0.213684f, -0.067325f, 0.140445f, 0.193717f, 0.078110f, 0.001223f, -0.002604f, 0.006252f} - }, - { - {0.015793f, 0.015614f, 0.015261f, 0.014743f, 0.014070f, 0.013261f, 0.012332f, 0.011307f, 0.010207f, 0.009057f, 0.007883f, 0.006708f, 0.005555f, 0.004447f, 0.003403f, 0.002438f, 0.001568f, 0.000800f, 0.000142f, -0.000404f, -0.000841f, -0.001172f, -0.001407f, -0.001555f, -0.001630f, -0.001646f, -0.001620f, -0.001566f, -0.001501f, -0.001438f, -0.001391f, -0.001369f, -0.001381f, -0.001430f, -0.001519f, -0.001643f, -0.001798f, -0.001974f, -0.002158f, -0.002335f, -0.002488f, -0.002597f, -0.002642f, -0.002603f, -0.002459f, -0.002192f, -0.001786f, -0.001226f, -0.000503f, 0.000391f, 0.001457f, 0.002693f, 0.004091f, 0.005638f, 0.007317f, 0.009107f, 0.010980f, 0.012909f, 0.014859f, 0.016797f, 0.018687f, 0.020493f, 0.022179f, 0.023712f, 0.025060f, 0.026196f, 0.027096f, 0.027741f, 0.028118f, 0.028219f, 0.028042f, 0.027592f, 0.026880f, 0.025923f, 0.024741f, 0.023363f, 0.021819f, 0.020143f, 0.018371f, 0.016542f, 0.014694f, 0.012864f, 0.011089f, 0.009403f, 0.007835f, 0.006412f, 0.005154f, 0.004078f, 0.003193f, 0.002504f, 0.002009f, 0.001702f, 0.001570f, 0.001595f, 0.001757f, 0.002031f, - 0.002389f, 0.002802f, 0.003242f, 0.003679f, 0.004085f, 0.004434f, 0.004704f, 0.004875f, 0.004933f, 0.004867f, 0.004674f, 0.004352f, 0.003909f, 0.003354f, 0.002702f, 0.001973f, 0.001191f, 0.000379f, -0.000434f, -0.001219f, -0.001948f, -0.002594f, -0.003131f, -0.003534f, -0.003786f, -0.003869f, -0.003775f, -0.003496f, -0.003032f, -0.002390f, -0.001580f, -0.000618f, 0.000476f, 0.001676f, 0.002954f, 0.004278f, 0.005615f, 0.006931f, 0.008192f, 0.009366f, 0.010421f, 0.011330f, 0.012069f, 0.012618f, 0.012963f, 0.013095f, 0.013013f, 0.012718f, 0.012221f, 0.011536f, 0.010683f, 0.009688f, 0.008580f, 0.007390f, 0.006154f, 0.004907f, 0.003686f, 0.002526f, 0.001461f, 0.000522f, -0.000265f, -0.000876f, -0.001293f, -0.001505f, -0.007783f, -0.004437f, -0.006273f, -0.018191f, -0.025282f, 0.042441f, -0.014784f, -0.028944f, -0.005539f, -0.007788f, 0.065740f, 0.017438f, -0.029275f, 0.007538f, -0.076337f, -0.156600f, -0.065884f, -0.026101f, 0.057496f, 0.043466f, -0.070559f, -0.019601f, 0.023551f, 0.089863f, 0.084975f, 0.036251f, 0.023990f, 0.033648f, -0.041778f, -0.060314f, -0.142602f, 0.008572f, - 0.042511f, 0.010698f, 0.030706f, 0.037763f, -0.073999f, -0.096953f, -0.047880f, 0.009965f, 0.067194f, 0.102992f, 0.072743f, 0.020511f, -0.034400f, -0.021139f, -0.023958f, 0.049921f, 0.036726f, 0.017578f, -0.031352f, 0.004816f, -0.113625f, -0.018313f, 0.056091f, 0.016778f, 0.091757f, 0.079485f, -0.054640f, -0.123131f, 0.051245f, -0.067679f, 0.096904f, 0.073628f, 0.072762f, -0.075751f, -0.090515f, -0.010165f, 0.057450f, 0.076087f, 0.063748f, 0.026516f, 0.041170f, -0.078005f, -0.098049f, -0.029460f, 0.123883f, 0.083460f, -0.042449f, -0.047824f, -0.066676f, -0.105916f, -0.040019f, 0.055262f, 0.049687f, -0.113598f, -0.215741f, -0.205199f, 0.041807f, 0.235204f, 0.265427f, 0.104337f, -0.087201f, -0.244934f, -0.151795f, 0.031357f, 0.142193f, 0.083725f, 0.004657f, -0.070260f, -0.045831f, -0.013898f, 0.027669f, 0.031559f, 0.062616f, -0.058257f, -0.059770f, -0.131156f, -0.061874f, -0.022709f, 0.123818f, 0.173510f, 0.122079f, -0.127801f, -0.148640f, -0.043896f, -0.080444f, 0.033137f, 0.084677f, 0.136884f, 0.036755f, -0.129573f, -0.059507f, -0.055939f, 0.087536f, 0.163054f, 0.120972f, 0.038874f, - -0.016745f, -0.150456f, -0.181956f, -0.099941f, 0.107594f, 0.273411f, 0.280940f, 0.068309f, -0.208727f, -0.272775f, -0.164199f, 0.052441f, 0.242820f, 0.262410f, 0.079543f, -0.137148f, -0.269699f, -0.175399f, 0.050200f, 0.300957f, 0.206259f, -0.014310f, -0.184154f, -0.267489f, -0.158250f, 0.047583f, 0.164514f, 0.116695f, 0.013346f, -0.013466f, -0.005674f, -0.000653f}, - {0.015793f, 0.015614f, 0.015261f, 0.014743f, 0.014070f, 0.013261f, 0.012332f, 0.011307f, 0.010207f, 0.009057f, 0.007883f, 0.006708f, 0.005555f, 0.004447f, 0.003403f, 0.002438f, 0.001568f, 0.000800f, 0.000142f, -0.000404f, -0.000841f, -0.001172f, -0.001407f, -0.001555f, -0.001630f, -0.001646f, -0.001620f, -0.001566f, -0.001501f, -0.001438f, -0.001391f, -0.001369f, -0.001381f, -0.001430f, -0.001519f, -0.001643f, -0.001798f, -0.001974f, -0.002158f, -0.002335f, -0.002488f, -0.002597f, -0.002642f, -0.002603f, -0.002459f, -0.002192f, -0.001786f, -0.001226f, -0.000503f, 0.000391f, 0.001457f, 0.002693f, 0.004091f, 0.005638f, 0.007317f, 0.009107f, 0.010980f, 0.012909f, 0.014859f, 0.016797f, 0.018687f, 0.020493f, 0.022179f, 0.023712f, 0.025060f, 0.026196f, 0.027096f, 0.027741f, 0.028118f, 0.028219f, 0.028042f, 0.027592f, 0.026880f, 0.025923f, 0.024741f, 0.023363f, 0.021819f, 0.020143f, 0.018371f, 0.016542f, 0.014694f, 0.012864f, 0.011089f, 0.009403f, 0.007835f, 0.006412f, 0.005154f, 0.004078f, 0.003193f, 0.002504f, 0.002009f, 0.001702f, 0.001570f, 0.001595f, 0.001757f, 0.002031f, - 0.002389f, 0.002802f, 0.003242f, 0.003679f, 0.004085f, 0.004434f, 0.004704f, 0.004875f, 0.004933f, 0.004867f, 0.004674f, 0.004352f, 0.003909f, 0.003354f, 0.002702f, 0.001973f, 0.001191f, 0.000379f, -0.000434f, -0.001219f, -0.001948f, -0.002594f, -0.003131f, -0.003534f, -0.003786f, -0.003869f, -0.003775f, -0.003496f, -0.003032f, -0.002390f, -0.001580f, -0.000618f, 0.000476f, 0.001676f, 0.002954f, 0.004278f, 0.005615f, 0.006931f, 0.008192f, 0.009366f, 0.010421f, 0.011330f, 0.012069f, 0.012618f, 0.012963f, 0.013095f, 0.013013f, 0.012718f, 0.012221f, 0.011536f, 0.010683f, 0.009688f, 0.008580f, 0.007390f, 0.006154f, 0.004907f, 0.003686f, 0.002526f, 0.001461f, 0.000522f, -0.000265f, -0.000876f, -0.001293f, -0.001505f, -0.007783f, -0.004437f, -0.006273f, -0.018191f, -0.025282f, 0.042441f, -0.014784f, -0.028944f, -0.005539f, -0.007788f, 0.065740f, 0.017438f, -0.029275f, 0.007538f, -0.076337f, -0.156600f, -0.065884f, -0.026101f, 0.057496f, 0.043466f, -0.070559f, -0.019601f, 0.023551f, 0.089863f, 0.084975f, 0.036251f, 0.023990f, 0.033648f, -0.041778f, -0.060314f, -0.142602f, 0.008572f, - 0.042511f, 0.010698f, 0.030706f, 0.037763f, -0.073999f, -0.096953f, -0.047880f, 0.009965f, 0.067194f, 0.102992f, 0.072743f, 0.020511f, -0.034400f, -0.021139f, -0.023958f, 0.049921f, 0.036726f, 0.017578f, -0.031352f, 0.004816f, -0.113625f, -0.018313f, 0.056091f, 0.016778f, 0.091757f, 0.079485f, -0.054640f, -0.123131f, 0.051245f, -0.067679f, 0.096904f, 0.073628f, 0.072762f, -0.075751f, -0.090515f, -0.010165f, 0.057450f, 0.076087f, 0.063748f, 0.026516f, 0.041170f, -0.078005f, -0.098049f, -0.029460f, 0.123883f, 0.083460f, -0.042449f, -0.047824f, -0.066676f, -0.105916f, -0.040019f, 0.055262f, 0.049687f, -0.113598f, -0.215741f, -0.205199f, 0.041807f, 0.235204f, 0.265427f, 0.104337f, -0.087201f, -0.244934f, -0.151795f, 0.031357f, 0.142193f, 0.083725f, 0.004657f, -0.070260f, -0.045831f, -0.013898f, 0.027669f, 0.031559f, 0.062616f, -0.058257f, -0.059770f, -0.131156f, -0.061874f, -0.022709f, 0.123818f, 0.173510f, 0.122079f, -0.127801f, -0.148640f, -0.043896f, -0.080444f, 0.033137f, 0.084677f, 0.136884f, 0.036755f, -0.129573f, -0.059507f, -0.055939f, 0.087536f, 0.163054f, 0.120972f, 0.038874f, - -0.016745f, -0.150456f, -0.181956f, -0.099941f, 0.107594f, 0.273411f, 0.280940f, 0.068309f, -0.208727f, -0.272775f, -0.164199f, 0.052441f, 0.242820f, 0.262410f, 0.079543f, -0.137148f, -0.269699f, -0.175399f, 0.050200f, 0.300957f, 0.206259f, -0.014310f, -0.184154f, -0.267489f, -0.158250f, 0.047583f, 0.164514f, 0.116695f, 0.013346f, -0.013466f, -0.005674f, -0.000653f} - } -}; -const float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][320]={ - { - {0.000560f, 0.001661f, 0.002712f, 0.003680f, 0.004535f, 0.005253f, 0.005813f, 0.006200f, 0.006405f, 0.006425f, 0.006264f, 0.005931f, 0.005442f, 0.004817f, 0.004083f, 0.003268f, 0.002403f, 0.001521f, 0.000656f, -0.000161f, -0.000898f, -0.001530f, -0.002032f, -0.002387f, -0.002582f, -0.002609f, -0.002468f, -0.002164f, -0.001707f, -0.001115f, -0.000408f, 0.000388f, 0.001245f, 0.002133f, 0.003020f, 0.003875f, 0.004668f, 0.005370f, 0.005957f, 0.006408f, 0.006706f, 0.006842f, 0.006809f, 0.006608f, 0.006244f, 0.005728f, 0.005076f, 0.004308f, 0.003448f, 0.002521f, 0.001554f, 0.000577f, -0.000384f, -0.001302f, -0.002151f, -0.002912f, -0.003566f, -0.004099f, -0.004503f, -0.004774f, -0.004911f, -0.004920f, -0.004810f, -0.004594f, -0.004288f, -0.003910f, -0.003481f, -0.003021f, -0.002551f, -0.002092f, -0.001662f, -0.001277f, -0.000951f, -0.000694f, -0.000513f, -0.000409f, -0.000383f, -0.000431f, -0.000544f, -0.000712f, -0.000922f, -0.001160f, -0.001410f, -0.001657f, -0.001886f, -0.002081f, -0.002230f, -0.002324f, -0.002354f, -0.002316f, -0.002208f, -0.002033f, -0.001796f, -0.001505f, -0.001171f, -0.000807f, - -0.000428f, -0.000050f, 0.000312f, 0.000641f, 0.000922f, 0.001141f, 0.001289f, 0.001355f, 0.001334f, 0.001225f, 0.001028f, 0.000748f, 0.000392f, -0.000029f, -0.000500f, -0.001007f, -0.001533f, -0.002058f, -0.002566f, -0.003037f, -0.003455f, -0.003805f, -0.004073f, -0.004251f, -0.004330f, -0.004307f, -0.004182f, -0.003958f, -0.003643f, -0.003245f, -0.002778f, -0.002256f, -0.001695f, -0.001114f, -0.000530f, 0.000039f, 0.000576f, 0.001067f, 0.001497f, 0.001857f, 0.002137f, 0.002333f, 0.002443f, 0.002469f, 0.002415f, 0.002288f, 0.002098f, 0.001857f, 0.001577f, 0.001272f, 0.000957f, 0.000645f, 0.000350f, 0.000083f, -0.000146f, -0.000329f, -0.000461f, -0.000540f, -0.000566f, -0.000541f, -0.000472f, -0.000365f, -0.000231f, -0.000079f, -0.460259f, -0.951079f, -0.610747f, 0.139152f, 0.697949f, 0.756847f, 0.243016f, -0.421240f, -0.809240f, -0.722790f, -0.131189f, 0.462952f, 0.869130f, 0.669286f, 0.030399f, -0.562684f, -0.789169f, -0.467168f, 0.151920f, 0.680335f, 0.729095f, 0.339114f, -0.322683f, -0.698273f, -0.615664f, -0.093987f, 0.456628f, 0.704581f, 0.459961f, -0.071120f, -0.568074f, -0.669242f, - -0.335663f, 0.247131f, 0.632814f, 0.619104f, 0.155654f, -0.373183f, -0.695371f, -0.503600f, -0.123694f, 0.358269f, 0.720965f, 0.556532f, 0.039488f, -0.523997f, -0.688621f, -0.390989f, 0.199606f, 0.632990f, 0.653547f, 0.212882f, -0.363644f, -0.697704f, -0.533888f, -0.012498f, 0.510544f, 0.655232f, 0.374543f, -0.161184f, -0.563367f, -0.566663f, -0.171992f, 0.340804f, 0.661432f, 0.496413f, -0.012145f, -0.517044f, -0.669485f, -0.363559f, 0.180685f, 0.613468f, 0.618828f, 0.208956f, -0.346445f, -0.673686f, -0.546699f, -0.033563f, 0.494204f, 0.664797f, 0.384626f, -0.160262f, -0.529660f, -0.570199f, -0.199102f, 0.331888f, 0.641768f, 0.518867f, 0.029795f, -0.468042f, -0.650452f, -0.381207f, 0.163056f, 0.573507f, 0.620545f, 0.260207f, -0.286010f, -0.602836f, -0.538518f, -0.133326f, 0.352210f, 0.602532f, 0.439914f, 0.007239f, -0.429036f, -0.568867f, -0.308712f, 0.146511f, 0.519479f, 0.533995f, 0.182772f, -0.315085f, -0.581991f, -0.461079f, 0.007470f, 0.469652f, 0.601398f, 0.340411f, -0.169957f, -0.574590f, -0.589987f, -0.182204f, 0.358851f, 0.637429f, 0.477370f, -0.004546f, -0.473175f, -0.601238f, - -0.306724f, 0.190330f, 0.543690f, 0.516648f, 0.152960f, -0.318909f, -0.546856f, -0.396088f, 0.018774f, 0.420713f, 0.545205f, 0.298542f, -0.152204f, -0.494079f, -0.489567f, -0.147781f, 0.289809f, 0.518298f, 0.390240f, -0.007614f, -0.385375f, -0.488880f, -0.242032f, 0.186344f, 0.481677f, 0.422991f, 0.071320f, -0.202729f, -0.173620f, -0.040696f, -0.001221f, 0.001660f}, - {0.000560f, 0.001661f, 0.002712f, 0.003680f, 0.004535f, 0.005253f, 0.005813f, 0.006200f, 0.006405f, 0.006425f, 0.006264f, 0.005931f, 0.005442f, 0.004817f, 0.004083f, 0.003268f, 0.002403f, 0.001521f, 0.000656f, -0.000161f, -0.000898f, -0.001530f, -0.002032f, -0.002387f, -0.002582f, -0.002609f, -0.002468f, -0.002164f, -0.001707f, -0.001115f, -0.000408f, 0.000388f, 0.001245f, 0.002133f, 0.003020f, 0.003875f, 0.004668f, 0.005370f, 0.005957f, 0.006408f, 0.006706f, 0.006842f, 0.006809f, 0.006608f, 0.006244f, 0.005728f, 0.005076f, 0.004308f, 0.003448f, 0.002521f, 0.001554f, 0.000577f, -0.000384f, -0.001302f, -0.002151f, -0.002912f, -0.003566f, -0.004099f, -0.004503f, -0.004774f, -0.004911f, -0.004920f, -0.004810f, -0.004594f, -0.004288f, -0.003910f, -0.003481f, -0.003021f, -0.002551f, -0.002092f, -0.001662f, -0.001277f, -0.000951f, -0.000694f, -0.000513f, -0.000409f, -0.000383f, -0.000431f, -0.000544f, -0.000712f, -0.000922f, -0.001160f, -0.001410f, -0.001657f, -0.001886f, -0.002081f, -0.002230f, -0.002324f, -0.002354f, -0.002316f, -0.002208f, -0.002033f, -0.001796f, -0.001505f, -0.001171f, -0.000807f, - -0.000428f, -0.000050f, 0.000312f, 0.000641f, 0.000922f, 0.001141f, 0.001289f, 0.001355f, 0.001334f, 0.001225f, 0.001028f, 0.000748f, 0.000392f, -0.000029f, -0.000500f, -0.001007f, -0.001533f, -0.002058f, -0.002566f, -0.003037f, -0.003455f, -0.003805f, -0.004073f, -0.004251f, -0.004330f, -0.004307f, -0.004182f, -0.003958f, -0.003643f, -0.003245f, -0.002778f, -0.002256f, -0.001695f, -0.001114f, -0.000530f, 0.000039f, 0.000576f, 0.001067f, 0.001497f, 0.001857f, 0.002137f, 0.002333f, 0.002443f, 0.002469f, 0.002415f, 0.002288f, 0.002098f, 0.001857f, 0.001577f, 0.001272f, 0.000957f, 0.000645f, 0.000350f, 0.000083f, -0.000146f, -0.000329f, -0.000461f, -0.000540f, -0.000566f, -0.000541f, -0.000472f, -0.000365f, -0.000231f, -0.000079f, -0.460259f, -0.951079f, -0.610747f, 0.139152f, 0.697949f, 0.756847f, 0.243016f, -0.421240f, -0.809240f, -0.722790f, -0.131189f, 0.462952f, 0.869130f, 0.669286f, 0.030399f, -0.562684f, -0.789169f, -0.467168f, 0.151920f, 0.680335f, 0.729095f, 0.339114f, -0.322683f, -0.698273f, -0.615664f, -0.093987f, 0.456628f, 0.704581f, 0.459961f, -0.071120f, -0.568074f, -0.669242f, - -0.335663f, 0.247131f, 0.632814f, 0.619104f, 0.155654f, -0.373183f, -0.695371f, -0.503600f, -0.123694f, 0.358269f, 0.720965f, 0.556532f, 0.039488f, -0.523997f, -0.688621f, -0.390989f, 0.199606f, 0.632990f, 0.653547f, 0.212882f, -0.363644f, -0.697704f, -0.533888f, -0.012498f, 0.510544f, 0.655232f, 0.374543f, -0.161184f, -0.563367f, -0.566663f, -0.171992f, 0.340804f, 0.661432f, 0.496413f, -0.012145f, -0.517044f, -0.669485f, -0.363559f, 0.180685f, 0.613468f, 0.618828f, 0.208956f, -0.346445f, -0.673686f, -0.546699f, -0.033563f, 0.494204f, 0.664797f, 0.384626f, -0.160262f, -0.529660f, -0.570199f, -0.199102f, 0.331888f, 0.641768f, 0.518867f, 0.029795f, -0.468042f, -0.650452f, -0.381207f, 0.163056f, 0.573507f, 0.620545f, 0.260207f, -0.286010f, -0.602836f, -0.538518f, -0.133326f, 0.352210f, 0.602532f, 0.439914f, 0.007239f, -0.429036f, -0.568867f, -0.308712f, 0.146511f, 0.519479f, 0.533995f, 0.182772f, -0.315085f, -0.581991f, -0.461079f, 0.007470f, 0.469652f, 0.601398f, 0.340411f, -0.169957f, -0.574590f, -0.589987f, -0.182204f, 0.358851f, 0.637429f, 0.477370f, -0.004546f, -0.473175f, -0.601238f, - -0.306724f, 0.190330f, 0.543690f, 0.516648f, 0.152960f, -0.318909f, -0.546856f, -0.396088f, 0.018774f, 0.420713f, 0.545205f, 0.298542f, -0.152204f, -0.494079f, -0.489567f, -0.147781f, 0.289809f, 0.518298f, 0.390240f, -0.007614f, -0.385375f, -0.488880f, -0.242032f, 0.186344f, 0.481677f, 0.422991f, 0.071320f, -0.202729f, -0.173620f, -0.040696f, -0.001221f, 0.001660f} - }, - { - {0.000043f, 0.000144f, 0.000288f, 0.000500f, 0.000803f, 0.001215f, 0.001748f, 0.002406f, 0.003188f, 0.004083f, 0.005077f, 0.006143f, 0.007254f, 0.008372f, 0.009460f, 0.010475f, 0.011374f, 0.012114f, 0.012655f, 0.012959f, 0.012996f, 0.012740f, 0.012174f, 0.011291f, 0.010092f, 0.008588f, 0.006799f, 0.004755f, 0.002496f, 0.000069f, -0.002475f, -0.005077f, -0.007675f, -0.010209f, -0.012615f, -0.014835f, -0.016813f, -0.018501f, -0.019856f, -0.020848f, -0.021453f, -0.021661f, -0.021469f, -0.020890f, -0.019943f, -0.018662f, -0.017086f, -0.015264f, -0.013251f, -0.011106f, -0.008892f, -0.006671f, -0.004506f, -0.002455f, -0.000574f, 0.001091f, 0.002497f, 0.003615f, 0.004422f, 0.004905f, 0.005063f, 0.004904f, 0.004446f, 0.003715f, 0.002745f, 0.001576f, 0.000254f, -0.001173f, -0.002655f, -0.004142f, -0.005584f, -0.006937f, -0.008160f, -0.009218f, -0.010081f, -0.010730f, -0.011149f, -0.011334f, -0.011287f, -0.011017f, -0.010541f, -0.009880f, -0.009063f, -0.008119f, -0.007082f, -0.005988f, -0.004870f, -0.003763f, -0.002698f, -0.001703f, -0.000803f, -0.000016f, 0.000642f, 0.001163f, 0.001543f, 0.001783f, - 0.001888f, 0.001871f, 0.001743f, 0.001522f, 0.001226f, 0.000875f, 0.000487f, 0.000082f, -0.000322f, -0.000711f, -0.001071f, -0.001392f, -0.001669f, -0.001897f, -0.002077f, -0.002211f, -0.002304f, -0.002364f, -0.002399f, -0.002421f, -0.002438f, -0.002462f, -0.002500f, -0.002561f, -0.002650f, -0.002771f, -0.002924f, -0.003107f, -0.003317f, -0.003546f, -0.003785f, -0.004025f, -0.004252f, -0.004455f, -0.004621f, -0.004737f, -0.004793f, -0.004780f, -0.004690f, -0.004518f, -0.004265f, -0.003930f, -0.003519f, -0.003041f, -0.002505f, -0.001925f, -0.001317f, -0.000698f, -0.000087f, 0.000500f, 0.001043f, 0.001526f, 0.001935f, 0.002255f, 0.002479f, 0.002599f, 0.002613f, 0.002521f, 0.002329f, 0.002045f, 0.001680f, 0.001249f, 0.000769f, 0.000260f, 0.048997f, -0.015463f, -0.522407f, -0.600085f, -0.029695f, 0.813964f, 0.895309f, 0.289993f, -0.543636f, -0.625036f, -0.515398f, 0.035194f, 0.575718f, 0.501556f, 0.121036f, -0.361039f, -0.606845f, -0.495123f, 0.005394f, 0.415183f, 0.580837f, 0.318723f, -0.123234f, -0.593524f, -0.557355f, -0.169369f, 0.347707f, 0.571599f, 0.525102f, 0.030652f, -0.384441f, -0.655672f, - -0.441819f, 0.048587f, 0.566868f, 0.678160f, 0.404472f, -0.223534f, -0.700639f, -0.731015f, -0.152629f, 0.532299f, 0.760448f, 0.502195f, -0.144427f, -0.703978f, -0.795643f, -0.329782f, 0.354114f, 0.753876f, 0.632607f, 0.089946f, -0.518511f, -0.791351f, -0.524899f, 0.105404f, 0.617469f, 0.708260f, 0.315198f, -0.259685f, -0.691168f, -0.600568f, -0.140553f, 0.464125f, 0.710946f, 0.596699f, 0.080098f, -0.565102f, -0.842626f, -0.545444f, 0.106598f, 0.690972f, 0.810141f, 0.361296f, -0.318065f, -0.835661f, -0.742986f, -0.188936f, 0.522876f, 0.868070f, 0.580850f, -0.071922f, -0.600638f, -0.771853f, -0.386671f, 0.306924f, 0.769086f, 0.717438f, 0.159465f, -0.512452f, -0.803147f, -0.589629f, 0.033897f, 0.618695f, 0.791468f, 0.451289f, -0.217270f, -0.688459f, -0.719979f, -0.225991f, 0.388821f, 0.764794f, 0.571738f, 0.036560f, -0.544424f, -0.738813f, -0.420931f, 0.220447f, 0.694543f, 0.676052f, 0.185413f, -0.439806f, -0.732939f, -0.533904f, 0.076370f, 0.635241f, 0.740983f, 0.341226f, -0.276814f, -0.754017f, -0.696747f, -0.157458f, 0.462557f, 0.761077f, 0.546792f, -0.049733f, -0.593449f, -0.702775f, - -0.329350f, 0.258630f, 0.631552f, 0.588083f, 0.131914f, -0.416817f, -0.660524f, -0.449411f, 0.064797f, 0.531572f, 0.651073f, 0.322630f, -0.224129f, -0.603598f, -0.571861f, -0.140543f, 0.397649f, 0.642342f, 0.435744f, -0.053386f, -0.506667f, -0.608518f, -0.260578f, 0.265807f, 0.611486f, 0.509185f, 0.058931f, -0.271691f, -0.217337f, -0.048702f, -0.000227f, 0.001508f}, - {-0.000043f, -0.000144f, -0.000288f, -0.000500f, -0.000803f, -0.001215f, -0.001748f, -0.002406f, -0.003188f, -0.004083f, -0.005077f, -0.006143f, -0.007254f, -0.008372f, -0.009460f, -0.010475f, -0.011374f, -0.012114f, -0.012655f, -0.012959f, -0.012996f, -0.012740f, -0.012174f, -0.011291f, -0.010092f, -0.008588f, -0.006799f, -0.004755f, -0.002496f, -0.000069f, 0.002475f, 0.005077f, 0.007675f, 0.010209f, 0.012615f, 0.014835f, 0.016813f, 0.018501f, 0.019856f, 0.020848f, 0.021453f, 0.021661f, 0.021469f, 0.020890f, 0.019943f, 0.018662f, 0.017086f, 0.015264f, 0.013251f, 0.011106f, 0.008892f, 0.006671f, 0.004506f, 0.002455f, 0.000574f, -0.001091f, -0.002497f, -0.003615f, -0.004422f, -0.004905f, -0.005063f, -0.004904f, -0.004446f, -0.003715f, -0.002745f, -0.001576f, -0.000254f, 0.001173f, 0.002655f, 0.004142f, 0.005584f, 0.006937f, 0.008160f, 0.009218f, 0.010081f, 0.010730f, 0.011149f, 0.011334f, 0.011287f, 0.011017f, 0.010541f, 0.009880f, 0.009063f, 0.008119f, 0.007082f, 0.005988f, 0.004870f, 0.003763f, 0.002698f, 0.001703f, 0.000803f, 0.000016f, -0.000642f, -0.001163f, -0.001543f, -0.001783f, - -0.001888f, -0.001871f, -0.001743f, -0.001522f, -0.001226f, -0.000875f, -0.000487f, -0.000082f, 0.000322f, 0.000711f, 0.001071f, 0.001392f, 0.001669f, 0.001897f, 0.002077f, 0.002211f, 0.002304f, 0.002364f, 0.002399f, 0.002421f, 0.002438f, 0.002462f, 0.002500f, 0.002561f, 0.002650f, 0.002771f, 0.002924f, 0.003107f, 0.003317f, 0.003546f, 0.003785f, 0.004025f, 0.004252f, 0.004455f, 0.004621f, 0.004737f, 0.004793f, 0.004780f, 0.004690f, 0.004518f, 0.004265f, 0.003930f, 0.003519f, 0.003041f, 0.002505f, 0.001925f, 0.001317f, 0.000698f, 0.000087f, -0.000500f, -0.001043f, -0.001526f, -0.001935f, -0.002255f, -0.002479f, -0.002599f, -0.002613f, -0.002521f, -0.002329f, -0.002045f, -0.001680f, -0.001249f, -0.000769f, -0.000260f, -0.048997f, 0.015463f, 0.522407f, 0.600085f, 0.029695f, -0.813964f, -0.895309f, -0.289993f, 0.543636f, 0.625036f, 0.515398f, -0.035194f, -0.575718f, -0.501556f, -0.121036f, 0.361039f, 0.606845f, 0.495123f, -0.005394f, -0.415183f, -0.580837f, -0.318723f, 0.123234f, 0.593524f, 0.557355f, 0.169369f, -0.347707f, -0.571599f, -0.525102f, -0.030652f, 0.384441f, 0.655672f, - 0.441819f, -0.048587f, -0.566868f, -0.678160f, -0.404472f, 0.223534f, 0.700639f, 0.731015f, 0.152629f, -0.532299f, -0.760448f, -0.502195f, 0.144427f, 0.703978f, 0.795643f, 0.329782f, -0.354114f, -0.753876f, -0.632607f, -0.089946f, 0.518511f, 0.791351f, 0.524899f, -0.105404f, -0.617469f, -0.708260f, -0.315198f, 0.259685f, 0.691168f, 0.600568f, 0.140553f, -0.464125f, -0.710946f, -0.596699f, -0.080098f, 0.565102f, 0.842626f, 0.545444f, -0.106598f, -0.690972f, -0.810141f, -0.361296f, 0.318065f, 0.835661f, 0.742986f, 0.188936f, -0.522876f, -0.868070f, -0.580850f, 0.071922f, 0.600638f, 0.771853f, 0.386671f, -0.306924f, -0.769086f, -0.717438f, -0.159465f, 0.512452f, 0.803147f, 0.589629f, -0.033897f, -0.618695f, -0.791468f, -0.451289f, 0.217270f, 0.688459f, 0.719979f, 0.225991f, -0.388821f, -0.764794f, -0.571738f, -0.036560f, 0.544424f, 0.738813f, 0.420931f, -0.220447f, -0.694543f, -0.676052f, -0.185413f, 0.439806f, 0.732939f, 0.533904f, -0.076370f, -0.635241f, -0.740983f, -0.341226f, 0.276814f, 0.754017f, 0.696747f, 0.157458f, -0.462557f, -0.761077f, -0.546792f, 0.049733f, 0.593449f, 0.702775f, - 0.329350f, -0.258630f, -0.631552f, -0.588083f, -0.131914f, 0.416817f, 0.660524f, 0.449411f, -0.064797f, -0.531572f, -0.651073f, -0.322630f, 0.224129f, 0.603598f, 0.571861f, 0.140543f, -0.397649f, -0.642342f, -0.435744f, 0.053386f, 0.506667f, 0.608518f, 0.260578f, -0.265807f, -0.611486f, -0.509185f, -0.058931f, 0.271691f, 0.217337f, 0.048702f, 0.000227f, -0.001508f} - }, - { - {-0.002267f, -0.006781f, -0.011234f, -0.015586f, -0.019796f, -0.023824f, -0.027628f, -0.031169f, -0.034406f, -0.037301f, -0.039816f, -0.041916f, -0.043571f, -0.044751f, -0.045434f, -0.045604f, -0.045249f, -0.044368f, -0.042964f, -0.041052f, -0.038655f, -0.035806f, -0.032547f, -0.028927f, -0.025007f, -0.020851f, -0.016534f, -0.012133f, -0.007730f, -0.003407f, 0.000753f, 0.004667f, 0.008260f, 0.011460f, 0.014203f, 0.016436f, 0.018117f, 0.019214f, 0.019710f, 0.019602f, 0.018900f, 0.017629f, 0.015828f, 0.013547f, 0.010848f, 0.007803f, 0.004494f, 0.001006f, -0.002572f, -0.006146f, -0.009627f, -0.012928f, -0.015967f, -0.018670f, -0.020974f, -0.022825f, -0.024183f, -0.025023f, -0.025330f, -0.025107f, -0.024370f, -0.023148f, -0.021482f, -0.019425f, -0.017039f, -0.014394f, -0.011564f, -0.008627f, -0.005663f, -0.002749f, 0.000039f, 0.002634f, 0.004973f, 0.007002f, 0.008679f, 0.009970f, 0.010856f, 0.011326f, 0.011383f, 0.011041f, 0.010324f, 0.009265f, 0.007905f, 0.006292f, 0.004479f, 0.002522f, 0.000479f, -0.001593f, -0.003639f, -0.005606f, -0.007448f, -0.009123f, -0.010596f, -0.011841f, -0.012837f, -0.013575f, - -0.014049f, -0.014265f, -0.014234f, -0.013972f, -0.013503f, -0.012852f, -0.012050f, -0.011128f, -0.010119f, -0.009056f, -0.007969f, -0.006887f, -0.005837f, -0.004840f, -0.003916f, -0.003079f, -0.002339f, -0.001702f, -0.001168f, -0.000738f, -0.000404f, -0.000159f, 0.000006f, 0.000105f, 0.000149f, 0.000151f, 0.000123f, 0.000078f, 0.000026f, -0.000024f, -0.000065f, -0.000092f, -0.000102f, -0.000092f, -0.000064f, -0.000018f, 0.000041f, 0.000110f, 0.000185f, 0.000260f, 0.000331f, 0.000394f, 0.000444f, 0.000479f, 0.000497f, 0.000497f, 0.000480f, 0.000446f, 0.000397f, 0.000337f, 0.000269f, 0.000197f, 0.000124f, 0.000055f, -0.000008f, -0.000060f, -0.000100f, -0.000126f, -0.000138f, -0.000136f, -0.000121f, -0.000095f, -0.000060f, -0.000021f, -0.058407f, -0.104213f, -0.091374f, 0.167866f, 0.095142f, -0.111637f, -0.093947f, 0.008070f, 0.076086f, 0.220379f, 0.388714f, 0.303315f, -0.046653f, 0.159210f, -0.080395f, -0.114785f, -0.080619f, 0.077435f, 0.100425f, 0.160232f, 0.147878f, 0.133076f, -0.051730f, -0.200541f, -0.153297f, 0.110444f, 0.193077f, 0.133008f, -0.052189f, -0.161640f, -0.246623f, -0.090053f, - 0.086510f, 0.220857f, 0.163599f, -0.014898f, -0.236818f, -0.222103f, -0.129232f, 0.081782f, -0.004850f, -0.065845f, 0.178391f, 0.209799f, 0.152276f, -0.066789f, -0.179632f, -0.185378f, -0.015467f, 0.196687f, 0.310999f, 0.153687f, -0.068969f, -0.298029f, -0.322925f, -0.091777f, 0.290577f, 0.470439f, 0.311392f, -0.112813f, -0.471956f, -0.535044f, -0.207024f, 0.243222f, 0.542002f, 0.311086f, -0.145760f, -0.473830f, -0.370839f, 0.001872f, 0.388776f, 0.426580f, 0.199433f, -0.186202f, -0.397908f, -0.270887f, 0.016514f, 0.321660f, 0.362808f, 0.069168f, -0.184442f, -0.327971f, -0.210001f, 0.042157f, 0.265061f, 0.262252f, 0.113813f, -0.135017f, -0.216907f, -0.177332f, -0.023642f, 0.109633f, 0.156087f, 0.124602f, 0.066843f, -0.079584f, -0.103854f, -0.076786f, 0.039317f, 0.182606f, 0.205344f, 0.015890f, -0.179015f, -0.308396f, -0.181602f, 0.118732f, 0.331502f, 0.311859f, 0.083492f, -0.193440f, -0.339859f, -0.210035f, 0.038309f, 0.272190f, 0.271032f, 0.078279f, -0.138374f, -0.258518f, -0.186134f, -0.005147f, 0.170585f, 0.170076f, 0.132706f, -0.022662f, -0.110194f, -0.128394f, -0.076436f, -0.034288f, - 0.038887f, 0.083304f, 0.098979f, 0.039004f, -0.015421f, -0.083882f, -0.075557f, -0.041993f, 0.044662f, 0.076560f, 0.104634f, 0.028010f, -0.037251f, -0.083421f, -0.057962f, -0.008276f, 0.050276f, 0.061592f, 0.062659f, -0.019294f, -0.045618f, -0.052590f, -0.021082f, 0.021156f, 0.051217f, 0.035327f, -0.003896f, -0.032706f, -0.007792f, -0.007871f, 0.005964f, -0.004716f}, - {-0.002267f, -0.006781f, -0.011234f, -0.015586f, -0.019796f, -0.023824f, -0.027628f, -0.031169f, -0.034406f, -0.037301f, -0.039816f, -0.041916f, -0.043571f, -0.044751f, -0.045434f, -0.045604f, -0.045249f, -0.044368f, -0.042964f, -0.041052f, -0.038655f, -0.035806f, -0.032547f, -0.028927f, -0.025007f, -0.020851f, -0.016534f, -0.012133f, -0.007730f, -0.003407f, 0.000753f, 0.004667f, 0.008260f, 0.011460f, 0.014203f, 0.016436f, 0.018117f, 0.019214f, 0.019710f, 0.019602f, 0.018900f, 0.017629f, 0.015828f, 0.013547f, 0.010848f, 0.007803f, 0.004494f, 0.001006f, -0.002572f, -0.006146f, -0.009627f, -0.012928f, -0.015967f, -0.018670f, -0.020974f, -0.022825f, -0.024183f, -0.025023f, -0.025330f, -0.025107f, -0.024370f, -0.023148f, -0.021482f, -0.019425f, -0.017039f, -0.014394f, -0.011564f, -0.008627f, -0.005663f, -0.002749f, 0.000039f, 0.002634f, 0.004973f, 0.007002f, 0.008679f, 0.009970f, 0.010856f, 0.011326f, 0.011383f, 0.011041f, 0.010324f, 0.009265f, 0.007905f, 0.006292f, 0.004479f, 0.002522f, 0.000479f, -0.001593f, -0.003639f, -0.005606f, -0.007448f, -0.009123f, -0.010596f, -0.011841f, -0.012837f, -0.013575f, - -0.014049f, -0.014265f, -0.014234f, -0.013972f, -0.013503f, -0.012852f, -0.012050f, -0.011128f, -0.010119f, -0.009056f, -0.007969f, -0.006887f, -0.005837f, -0.004840f, -0.003916f, -0.003079f, -0.002339f, -0.001702f, -0.001168f, -0.000738f, -0.000404f, -0.000159f, 0.000006f, 0.000105f, 0.000149f, 0.000151f, 0.000123f, 0.000078f, 0.000026f, -0.000024f, -0.000065f, -0.000092f, -0.000102f, -0.000092f, -0.000064f, -0.000018f, 0.000041f, 0.000110f, 0.000185f, 0.000260f, 0.000331f, 0.000394f, 0.000444f, 0.000479f, 0.000497f, 0.000497f, 0.000480f, 0.000446f, 0.000397f, 0.000337f, 0.000269f, 0.000197f, 0.000124f, 0.000055f, -0.000008f, -0.000060f, -0.000100f, -0.000126f, -0.000138f, -0.000136f, -0.000121f, -0.000095f, -0.000060f, -0.000021f, -0.058407f, -0.104213f, -0.091374f, 0.167866f, 0.095142f, -0.111637f, -0.093947f, 0.008070f, 0.076086f, 0.220379f, 0.388714f, 0.303315f, -0.046653f, 0.159210f, -0.080395f, -0.114785f, -0.080619f, 0.077435f, 0.100425f, 0.160232f, 0.147878f, 0.133076f, -0.051730f, -0.200541f, -0.153297f, 0.110444f, 0.193077f, 0.133008f, -0.052189f, -0.161640f, -0.246623f, -0.090053f, - 0.086510f, 0.220857f, 0.163599f, -0.014898f, -0.236818f, -0.222103f, -0.129232f, 0.081782f, -0.004850f, -0.065845f, 0.178391f, 0.209799f, 0.152276f, -0.066789f, -0.179632f, -0.185378f, -0.015467f, 0.196687f, 0.310999f, 0.153687f, -0.068969f, -0.298029f, -0.322925f, -0.091777f, 0.290577f, 0.470439f, 0.311392f, -0.112813f, -0.471956f, -0.535044f, -0.207024f, 0.243222f, 0.542002f, 0.311086f, -0.145760f, -0.473830f, -0.370839f, 0.001872f, 0.388776f, 0.426580f, 0.199433f, -0.186202f, -0.397908f, -0.270887f, 0.016514f, 0.321660f, 0.362808f, 0.069168f, -0.184442f, -0.327971f, -0.210001f, 0.042157f, 0.265061f, 0.262252f, 0.113813f, -0.135017f, -0.216907f, -0.177332f, -0.023642f, 0.109633f, 0.156087f, 0.124602f, 0.066843f, -0.079584f, -0.103854f, -0.076786f, 0.039317f, 0.182606f, 0.205344f, 0.015890f, -0.179015f, -0.308396f, -0.181602f, 0.118732f, 0.331502f, 0.311859f, 0.083492f, -0.193440f, -0.339859f, -0.210035f, 0.038309f, 0.272190f, 0.271032f, 0.078279f, -0.138374f, -0.258518f, -0.186134f, -0.005147f, 0.170585f, 0.170076f, 0.132706f, -0.022662f, -0.110194f, -0.128394f, -0.076436f, -0.034288f, - 0.038887f, 0.083304f, 0.098979f, 0.039004f, -0.015421f, -0.083882f, -0.075557f, -0.041993f, 0.044662f, 0.076560f, 0.104634f, 0.028010f, -0.037251f, -0.083421f, -0.057962f, -0.008276f, 0.050276f, 0.061592f, 0.062659f, -0.019294f, -0.045618f, -0.052590f, -0.021082f, 0.021156f, 0.051217f, 0.035327f, -0.003896f, -0.032706f, -0.007792f, -0.007871f, 0.005964f, -0.004716f} - }, - { - {-0.002758f, -0.008214f, -0.013493f, -0.018483f, -0.023078f, -0.027187f, -0.030729f, -0.033641f, -0.035877f, -0.037411f, -0.038233f, -0.038357f, -0.037811f, -0.036645f, -0.034921f, -0.032719f, -0.030125f, -0.027239f, -0.024162f, -0.021001f, -0.017858f, -0.014833f, -0.012020f, -0.009500f, -0.007345f, -0.005609f, -0.004333f, -0.003542f, -0.003240f, -0.003417f, -0.004046f, -0.005086f, -0.006478f, -0.008157f, -0.010046f, -0.012060f, -0.014115f, -0.016122f, -0.017997f, -0.019659f, -0.021036f, -0.022066f, -0.022699f, -0.022899f, -0.022644f, -0.021928f, -0.020760f, -0.019164f, -0.017180f, -0.014860f, -0.012267f, -0.009473f, -0.006558f, -0.003605f, -0.000699f, 0.002077f, 0.004641f, 0.006922f, 0.008853f, 0.010382f, 0.011466f, 0.012078f, 0.012205f, 0.011848f, 0.011025f, 0.009765f, 0.008114f, 0.006127f, 0.003869f, 0.001416f, -0.001155f, -0.003759f, -0.006314f, -0.008739f, -0.010956f, -0.012896f, -0.014498f, -0.015712f, -0.016499f, -0.016833f, -0.016705f, -0.016117f, -0.015086f, -0.013642f, -0.011827f, -0.009695f, -0.007308f, -0.004735f, -0.002052f, 0.000665f, 0.003338f, 0.005892f, 0.008256f, 0.010363f, 0.012159f, 0.013595f, - 0.014636f, 0.015258f, 0.015451f, 0.015215f, 0.014566f, 0.013529f, 0.012142f, 0.010452f, 0.008514f, 0.006391f, 0.004149f, 0.001856f, -0.000417f, -0.002603f, -0.004637f, -0.006461f, -0.008024f, -0.009281f, -0.010200f, -0.010759f, -0.010943f, -0.010755f, -0.010202f, -0.009307f, -0.008100f, -0.006621f, -0.004914f, -0.003034f, -0.001036f, 0.001021f, 0.003077f, 0.005075f, 0.006958f, 0.008677f, 0.010187f, 0.011449f, 0.012435f, 0.013124f, 0.013504f, 0.013575f, 0.013342f, 0.012823f, 0.012043f, 0.011032f, 0.009830f, 0.008478f, 0.007023f, 0.005512f, 0.003994f, 0.002515f, 0.001120f, -0.000151f, -0.001265f, -0.002191f, -0.002911f, -0.003409f, -0.003681f, -0.003730f, -0.003567f, -0.003209f, -0.002683f, -0.002019f, -0.001253f, -0.000425f, 0.017164f, -0.095166f, -0.084610f, -0.066781f, 0.125564f, -0.055140f, -0.043633f, -0.055197f, 0.072714f, -0.100511f, 0.144497f, 0.115593f, -0.072967f, 0.428156f, 0.536649f, 0.361553f, -0.187894f, -0.504100f, -0.536552f, -0.209129f, 0.324334f, 0.717579f, 0.479062f, -0.076828f, -0.630415f, -0.733045f, -0.375205f, 0.361882f, 0.851886f, 0.698590f, 0.037553f, -0.675426f, - -0.833824f, -0.418413f, 0.332807f, 0.738102f, 0.683005f, 0.031927f, -0.473763f, -0.676455f, -0.116995f, 0.532705f, 0.480135f, 0.217679f, -0.301672f, -0.549176f, -0.506689f, -0.110837f, 0.270437f, 0.499041f, 0.300922f, -0.031881f, -0.355101f, -0.392462f, -0.221663f, 0.107522f, 0.284228f, 0.295903f, 0.107689f, -0.126331f, -0.290544f, -0.236669f, -0.061858f, 0.193208f, 0.217471f, 0.246872f, 0.078080f, -0.181977f, -0.290841f, -0.186887f, 0.073642f, 0.191131f, 0.164691f, -0.004480f, -0.127122f, -0.163585f, -0.015179f, 0.092875f, 0.132319f, 0.056038f, -0.096492f, -0.185668f, -0.110148f, 0.053996f, 0.167665f, 0.195388f, 0.025827f, -0.166236f, -0.232588f, -0.166091f, 0.041634f, 0.101911f, 0.059508f, -0.013331f, -0.098501f, -0.069904f, -0.025396f, -0.001789f, -0.004400f, -0.144278f, -0.143038f, -0.024272f, 0.175344f, 0.253854f, 0.159944f, -0.101035f, -0.280794f, -0.265512f, -0.020116f, 0.276962f, 0.361592f, 0.144039f, -0.172472f, -0.398515f, -0.320982f, -0.050912f, 0.281935f, 0.448140f, 0.242748f, -0.148340f, -0.439433f, -0.362324f, -0.037030f, 0.304097f, 0.420291f, 0.244908f, -0.086568f, -0.339309f, - -0.341381f, -0.113297f, 0.212756f, 0.365130f, 0.285176f, -0.027987f, -0.290757f, -0.359049f, -0.186519f, 0.134808f, 0.357137f, 0.309240f, 0.053867f, -0.237918f, -0.363218f, -0.222627f, 0.018767f, 0.266466f, 0.325402f, 0.169829f, -0.113374f, -0.264223f, -0.246908f, -0.033550f, 0.194119f, 0.284522f, 0.165400f, -0.044492f, -0.108267f, -0.038686f, -0.008172f, 0.001053f}, - {-0.002758f, -0.008214f, -0.013493f, -0.018483f, -0.023078f, -0.027187f, -0.030729f, -0.033641f, -0.035877f, -0.037411f, -0.038233f, -0.038357f, -0.037811f, -0.036645f, -0.034921f, -0.032719f, -0.030125f, -0.027239f, -0.024162f, -0.021001f, -0.017858f, -0.014833f, -0.012020f, -0.009500f, -0.007345f, -0.005609f, -0.004333f, -0.003542f, -0.003240f, -0.003417f, -0.004046f, -0.005086f, -0.006478f, -0.008157f, -0.010046f, -0.012060f, -0.014115f, -0.016122f, -0.017997f, -0.019659f, -0.021036f, -0.022066f, -0.022699f, -0.022899f, -0.022644f, -0.021928f, -0.020760f, -0.019164f, -0.017180f, -0.014860f, -0.012267f, -0.009473f, -0.006558f, -0.003605f, -0.000699f, 0.002077f, 0.004641f, 0.006922f, 0.008853f, 0.010382f, 0.011466f, 0.012078f, 0.012205f, 0.011848f, 0.011025f, 0.009765f, 0.008114f, 0.006127f, 0.003869f, 0.001416f, -0.001155f, -0.003759f, -0.006314f, -0.008739f, -0.010956f, -0.012896f, -0.014498f, -0.015712f, -0.016499f, -0.016833f, -0.016705f, -0.016117f, -0.015086f, -0.013642f, -0.011827f, -0.009695f, -0.007308f, -0.004735f, -0.002052f, 0.000665f, 0.003338f, 0.005892f, 0.008256f, 0.010363f, 0.012159f, 0.013595f, - 0.014636f, 0.015258f, 0.015451f, 0.015215f, 0.014566f, 0.013529f, 0.012142f, 0.010452f, 0.008514f, 0.006391f, 0.004149f, 0.001856f, -0.000417f, -0.002603f, -0.004637f, -0.006461f, -0.008024f, -0.009281f, -0.010200f, -0.010759f, -0.010943f, -0.010755f, -0.010202f, -0.009307f, -0.008100f, -0.006621f, -0.004914f, -0.003034f, -0.001036f, 0.001021f, 0.003077f, 0.005075f, 0.006958f, 0.008677f, 0.010187f, 0.011449f, 0.012435f, 0.013124f, 0.013504f, 0.013575f, 0.013342f, 0.012823f, 0.012043f, 0.011032f, 0.009830f, 0.008478f, 0.007023f, 0.005512f, 0.003994f, 0.002515f, 0.001120f, -0.000151f, -0.001265f, -0.002191f, -0.002911f, -0.003409f, -0.003681f, -0.003730f, -0.003567f, -0.003209f, -0.002683f, -0.002019f, -0.001253f, -0.000425f, 0.017164f, -0.095166f, -0.084610f, -0.066781f, 0.125564f, -0.055140f, -0.043633f, -0.055197f, 0.072714f, -0.100511f, 0.144497f, 0.115593f, -0.072967f, 0.428156f, 0.536649f, 0.361553f, -0.187894f, -0.504100f, -0.536552f, -0.209129f, 0.324334f, 0.717579f, 0.479062f, -0.076828f, -0.630415f, -0.733045f, -0.375205f, 0.361882f, 0.851886f, 0.698590f, 0.037553f, -0.675426f, - -0.833824f, -0.418413f, 0.332807f, 0.738102f, 0.683005f, 0.031927f, -0.473763f, -0.676455f, -0.116995f, 0.532705f, 0.480135f, 0.217679f, -0.301672f, -0.549176f, -0.506689f, -0.110837f, 0.270437f, 0.499041f, 0.300922f, -0.031881f, -0.355101f, -0.392462f, -0.221663f, 0.107522f, 0.284228f, 0.295903f, 0.107689f, -0.126331f, -0.290544f, -0.236669f, -0.061858f, 0.193208f, 0.217471f, 0.246872f, 0.078080f, -0.181977f, -0.290841f, -0.186887f, 0.073642f, 0.191131f, 0.164691f, -0.004480f, -0.127122f, -0.163585f, -0.015179f, 0.092875f, 0.132319f, 0.056038f, -0.096492f, -0.185668f, -0.110148f, 0.053996f, 0.167665f, 0.195388f, 0.025827f, -0.166236f, -0.232588f, -0.166091f, 0.041634f, 0.101911f, 0.059508f, -0.013331f, -0.098501f, -0.069904f, -0.025396f, -0.001789f, -0.004400f, -0.144278f, -0.143038f, -0.024272f, 0.175344f, 0.253854f, 0.159944f, -0.101035f, -0.280794f, -0.265512f, -0.020116f, 0.276962f, 0.361592f, 0.144039f, -0.172472f, -0.398515f, -0.320982f, -0.050912f, 0.281935f, 0.448140f, 0.242748f, -0.148340f, -0.439433f, -0.362324f, -0.037030f, 0.304097f, 0.420291f, 0.244908f, -0.086568f, -0.339309f, - -0.341381f, -0.113297f, 0.212756f, 0.365130f, 0.285176f, -0.027987f, -0.290757f, -0.359049f, -0.186519f, 0.134808f, 0.357137f, 0.309240f, 0.053867f, -0.237918f, -0.363218f, -0.222627f, 0.018767f, 0.266466f, 0.325402f, 0.169829f, -0.113374f, -0.264223f, -0.246908f, -0.033550f, 0.194119f, 0.284522f, 0.165400f, -0.044492f, -0.108267f, -0.038686f, -0.008172f, 0.001053f} - }, - { - {-0.001314f, -0.003934f, -0.006527f, -0.009075f, -0.011558f, -0.013956f, -0.016248f, -0.018413f, -0.020427f, -0.022268f, -0.023913f, -0.025340f, -0.026526f, -0.027454f, -0.028106f, -0.028470f, -0.028537f, -0.028304f, -0.027773f, -0.026955f, -0.025863f, -0.024520f, -0.022957f, -0.021207f, -0.019313f, -0.017322f, -0.015285f, -0.013255f, -0.011288f, -0.009439f, -0.007763f, -0.006312f, -0.005130f, -0.004258f, -0.003730f, -0.003568f, -0.003786f, -0.004389f, -0.005367f, -0.006704f, -0.008368f, -0.010323f, -0.012518f, -0.014897f, -0.017398f, -0.019954f, -0.022494f, -0.024947f, -0.027245f, -0.029320f, -0.031114f, -0.032572f, -0.033651f, -0.034317f, -0.034547f, -0.034331f, -0.033669f, -0.032576f, -0.031078f, -0.029210f, -0.027019f, -0.024559f, -0.021890f, -0.019077f, -0.016188f, -0.013291f, -0.010451f, -0.007730f, -0.005185f, -0.002865f, -0.000810f, 0.000949f, 0.002393f, 0.003513f, 0.004311f, 0.004798f, 0.004996f, 0.004935f, 0.004654f, 0.004194f, 0.003603f, 0.002930f, 0.002222f, 0.001527f, 0.000888f, 0.000344f, -0.000075f, -0.000343f, -0.000446f, -0.000376f, -0.000134f, 0.000269f, 0.000815f, 0.001479f, 0.002231f, 0.003035f, - 0.003854f, 0.004647f, 0.005377f, 0.006008f, 0.006506f, 0.006844f, 0.007003f, 0.006967f, 0.006731f, 0.006299f, 0.005681f, 0.004897f, 0.003971f, 0.002939f, 0.001836f, 0.000705f, -0.000411f, -0.001468f, -0.002422f, -0.003233f, -0.003867f, -0.004293f, -0.004488f, -0.004438f, -0.004136f, -0.003585f, -0.002797f, -0.001792f, -0.000597f, 0.000752f, 0.002215f, 0.003748f, 0.005303f, 0.006831f, 0.008286f, 0.009623f, 0.010799f, 0.011781f, 0.012539f, 0.013052f, 0.013308f, 0.013303f, 0.013043f, 0.012540f, 0.011816f, 0.010901f, 0.009827f, 0.008635f, 0.007366f, 0.006064f, 0.004771f, 0.003528f, 0.002374f, 0.001341f, 0.000455f, -0.000264f, -0.000804f, -0.001161f, -0.001340f, -0.001352f, -0.001217f, -0.000961f, -0.000614f, -0.000211f, 0.009824f, -0.025392f, 0.003068f, -0.063495f, -0.011179f, -0.003535f, 0.064582f, 0.015421f, 0.011489f, 0.012622f, 0.059145f, 0.090678f, -0.032440f, 0.214585f, 0.315262f, 0.132747f, -0.086018f, -0.176043f, -0.328831f, 0.007037f, 0.076966f, 0.172493f, 0.129820f, -0.050454f, -0.147541f, -0.174998f, -0.016099f, 0.183486f, 0.275400f, 0.164329f, -0.045971f, -0.231470f, - -0.305185f, -0.103015f, 0.318594f, 0.372904f, 0.152126f, -0.142477f, -0.327441f, -0.316692f, 0.056741f, 0.374135f, 0.289437f, 0.066855f, -0.238684f, -0.369182f, -0.260565f, -0.020464f, 0.130344f, 0.303624f, 0.227508f, 0.048235f, -0.170420f, -0.269283f, -0.198985f, -0.018973f, 0.203016f, 0.203783f, 0.217349f, -0.178400f, -0.183073f, -0.198521f, -0.177570f, 0.058283f, 0.262246f, 0.200208f, -0.052373f, -0.253422f, -0.275952f, -0.049932f, 0.207456f, 0.272786f, 0.208903f, 0.013245f, -0.244016f, -0.286750f, -0.113712f, 0.171855f, 0.313119f, 0.124258f, -0.017760f, -0.299172f, -0.315837f, -0.087679f, 0.189029f, 0.279633f, 0.123450f, -0.110997f, -0.296898f, -0.222798f, -0.003069f, 0.147969f, 0.108509f, -0.027695f, -0.095420f, -0.033400f, 0.026412f, 0.041198f, 0.008063f, -0.121817f, -0.101401f, -0.004164f, 0.143735f, 0.201285f, 0.134135f, -0.044895f, -0.179687f, -0.197544f, -0.077941f, 0.143457f, 0.232665f, 0.231540f, 0.078622f, -0.184865f, -0.281909f, -0.103295f, 0.100131f, 0.234276f, 0.179393f, -0.070021f, -0.133067f, -0.231333f, -0.151877f, 0.074031f, 0.170175f, 0.203405f, 0.063023f, -0.089352f, - -0.140655f, -0.063965f, 0.028808f, 0.099140f, 0.075553f, 0.019414f, -0.073169f, -0.082078f, -0.089922f, 0.003511f, 0.104713f, 0.103963f, 0.040688f, -0.034396f, -0.099769f, -0.069072f, -0.044637f, 0.039414f, 0.085266f, 0.084605f, 0.013281f, -0.026480f, -0.039645f, 0.002861f, 0.025499f, 0.053876f, 0.048795f, 0.001223f, -0.029655f, -0.009701f, -0.002193f, 0.000621f}, - {0.001314f, 0.003934f, 0.006527f, 0.009075f, 0.011558f, 0.013956f, 0.016248f, 0.018413f, 0.020427f, 0.022268f, 0.023913f, 0.025340f, 0.026526f, 0.027454f, 0.028106f, 0.028470f, 0.028537f, 0.028304f, 0.027773f, 0.026955f, 0.025863f, 0.024520f, 0.022957f, 0.021207f, 0.019313f, 0.017322f, 0.015285f, 0.013255f, 0.011288f, 0.009439f, 0.007763f, 0.006312f, 0.005130f, 0.004258f, 0.003730f, 0.003568f, 0.003786f, 0.004389f, 0.005367f, 0.006704f, 0.008368f, 0.010323f, 0.012518f, 0.014897f, 0.017398f, 0.019954f, 0.022494f, 0.024947f, 0.027245f, 0.029320f, 0.031114f, 0.032572f, 0.033651f, 0.034317f, 0.034547f, 0.034331f, 0.033669f, 0.032576f, 0.031078f, 0.029210f, 0.027019f, 0.024559f, 0.021890f, 0.019077f, 0.016188f, 0.013291f, 0.010451f, 0.007730f, 0.005185f, 0.002865f, 0.000810f, -0.000949f, -0.002393f, -0.003513f, -0.004311f, -0.004798f, -0.004996f, -0.004935f, -0.004654f, -0.004194f, -0.003603f, -0.002930f, -0.002222f, -0.001527f, -0.000888f, -0.000344f, 0.000075f, 0.000343f, 0.000446f, 0.000376f, 0.000134f, -0.000269f, -0.000815f, -0.001479f, -0.002231f, -0.003035f, - -0.003854f, -0.004647f, -0.005377f, -0.006008f, -0.006506f, -0.006844f, -0.007003f, -0.006967f, -0.006731f, -0.006299f, -0.005681f, -0.004897f, -0.003971f, -0.002939f, -0.001836f, -0.000705f, 0.000411f, 0.001468f, 0.002422f, 0.003233f, 0.003867f, 0.004293f, 0.004488f, 0.004438f, 0.004136f, 0.003585f, 0.002797f, 0.001792f, 0.000597f, -0.000752f, -0.002215f, -0.003748f, -0.005303f, -0.006831f, -0.008286f, -0.009623f, -0.010799f, -0.011781f, -0.012539f, -0.013052f, -0.013308f, -0.013303f, -0.013043f, -0.012540f, -0.011816f, -0.010901f, -0.009827f, -0.008635f, -0.007366f, -0.006064f, -0.004771f, -0.003528f, -0.002374f, -0.001341f, -0.000455f, 0.000264f, 0.000804f, 0.001161f, 0.001340f, 0.001352f, 0.001217f, 0.000961f, 0.000614f, 0.000211f, -0.009824f, 0.025392f, -0.003068f, 0.063495f, 0.011179f, 0.003535f, -0.064582f, -0.015421f, -0.011489f, -0.012622f, -0.059145f, -0.090678f, 0.032440f, -0.214585f, -0.315262f, -0.132747f, 0.086018f, 0.176043f, 0.328831f, -0.007037f, -0.076966f, -0.172493f, -0.129820f, 0.050454f, 0.147541f, 0.174998f, 0.016099f, -0.183486f, -0.275400f, -0.164329f, 0.045971f, 0.231470f, - 0.305185f, 0.103015f, -0.318594f, -0.372904f, -0.152126f, 0.142477f, 0.327441f, 0.316692f, -0.056741f, -0.374135f, -0.289437f, -0.066855f, 0.238684f, 0.369182f, 0.260565f, 0.020464f, -0.130344f, -0.303624f, -0.227508f, -0.048235f, 0.170420f, 0.269283f, 0.198985f, 0.018973f, -0.203016f, -0.203783f, -0.217349f, 0.178400f, 0.183073f, 0.198521f, 0.177570f, -0.058283f, -0.262246f, -0.200208f, 0.052373f, 0.253422f, 0.275952f, 0.049932f, -0.207456f, -0.272786f, -0.208903f, -0.013245f, 0.244016f, 0.286750f, 0.113712f, -0.171855f, -0.313119f, -0.124258f, 0.017760f, 0.299172f, 0.315837f, 0.087679f, -0.189029f, -0.279633f, -0.123450f, 0.110997f, 0.296898f, 0.222798f, 0.003069f, -0.147969f, -0.108509f, 0.027695f, 0.095420f, 0.033400f, -0.026412f, -0.041198f, -0.008063f, 0.121817f, 0.101401f, 0.004164f, -0.143735f, -0.201285f, -0.134135f, 0.044895f, 0.179687f, 0.197544f, 0.077941f, -0.143457f, -0.232665f, -0.231540f, -0.078622f, 0.184865f, 0.281909f, 0.103295f, -0.100131f, -0.234276f, -0.179393f, 0.070021f, 0.133067f, 0.231333f, 0.151877f, -0.074031f, -0.170175f, -0.203405f, -0.063023f, 0.089352f, - 0.140655f, 0.063965f, -0.028808f, -0.099140f, -0.075553f, -0.019414f, 0.073169f, 0.082078f, 0.089922f, -0.003511f, -0.104713f, -0.103963f, -0.040688f, 0.034396f, 0.099769f, 0.069072f, 0.044637f, -0.039414f, -0.085266f, -0.084605f, -0.013281f, 0.026480f, 0.039645f, -0.002861f, -0.025499f, -0.053876f, -0.048795f, -0.001223f, 0.029655f, 0.009701f, 0.002193f, -0.000621f} - }, - { - {-0.000457f, -0.001380f, -0.002330f, -0.003323f, -0.004372f, -0.005487f, -0.006672f, -0.007930f, -0.009253f, -0.010633f, -0.012054f, -0.013496f, -0.014933f, -0.016338f, -0.017681f, -0.018929f, -0.020051f, -0.021016f, -0.021796f, -0.022367f, -0.022709f, -0.022807f, -0.022655f, -0.022253f, -0.021607f, -0.020731f, -0.019647f, -0.018384f, -0.016975f, -0.015458f, -0.013877f, -0.012274f, -0.010695f, -0.009185f, -0.007786f, -0.006535f, -0.005466f, -0.004605f, -0.003973f, -0.003580f, -0.003429f, -0.003517f, -0.003828f, -0.004340f, -0.005026f, -0.005850f, -0.006772f, -0.007748f, -0.008734f, -0.009682f, -0.010549f, -0.011293f, -0.011876f, -0.012268f, -0.012444f, -0.012387f, -0.012090f, -0.011552f, -0.010783f, -0.009802f, -0.008634f, -0.007312f, -0.005875f, -0.004365f, -0.002830f, -0.001317f, 0.000128f, 0.001458f, 0.002632f, 0.003614f, 0.004372f, 0.004886f, 0.005138f, 0.005124f, 0.004845f, 0.004314f, 0.003551f, 0.002581f, 0.001440f, 0.000167f, -0.001196f, -0.002603f, -0.004007f, -0.005363f, -0.006627f, -0.007761f, -0.008730f, -0.009507f, -0.010070f, -0.010408f, -0.010515f, -0.010395f, -0.010059f, -0.009528f, -0.008825f, -0.007983f, - -0.007038f, -0.006026f, -0.004990f, -0.003968f, -0.003000f, -0.002121f, -0.001364f, -0.000755f, -0.000315f, -0.000058f, 0.000009f, -0.000112f, -0.000416f, -0.000886f, -0.001505f, -0.002244f, -0.003076f, -0.003968f, -0.004884f, -0.005791f, -0.006655f, -0.007444f, -0.008130f, -0.008688f, -0.009100f, -0.009352f, -0.009438f, -0.009356f, -0.009111f, -0.008715f, -0.008183f, -0.007536f, -0.006798f, -0.005996f, -0.005158f, -0.004312f, -0.003487f, -0.002708f, -0.001998f, -0.001376f, -0.000858f, -0.000454f, -0.000169f, -0.000004f, 0.000047f, -0.000006f, -0.000151f, -0.000371f, -0.000645f, -0.000953f, -0.001272f, -0.001581f, -0.001860f, -0.002091f, -0.002257f, -0.002346f, -0.002352f, -0.002269f, -0.002099f, -0.001846f, -0.001520f, -0.001132f, -0.000698f, -0.000236f, -0.001082f, -0.007192f, 0.021913f, -0.039500f, -0.011254f, 0.005951f, -0.021905f, -0.091993f, 0.050845f, 0.230618f, 0.217625f, 0.057638f, -0.170004f, 0.264623f, 0.272793f, 0.107389f, -0.097414f, -0.094413f, -0.190690f, 0.040445f, 0.078529f, 0.153019f, 0.116165f, -0.000198f, -0.091181f, -0.012899f, 0.034497f, -0.009199f, 0.022034f, -0.062895f, 0.116104f, 0.113324f, - 0.094084f, -0.017911f, -0.111402f, -0.159862f, -0.075024f, 0.052462f, 0.118694f, 0.118204f, 0.041768f, -0.045757f, -0.039860f, -0.088998f, -0.061848f, -0.001053f, -0.002719f, 0.037087f, -0.047839f, 0.026704f, 0.043210f, 0.000819f, -0.029741f, -0.064514f, -0.061783f, 0.020498f, 0.125645f, 0.158106f, 0.032407f, -0.139003f, -0.178026f, -0.174825f, -0.049323f, 0.125413f, 0.167822f, 0.095223f, -0.064137f, -0.187470f, -0.104867f, 0.076490f, 0.222956f, 0.114431f, -0.089468f, -0.301755f, -0.213346f, 0.032006f, 0.319832f, 0.313302f, 0.106194f, -0.239761f, -0.379586f, -0.301674f, -0.008235f, 0.307527f, 0.363424f, 0.142509f, -0.124602f, -0.338695f, -0.274940f, -0.027364f, 0.227327f, 0.279629f, 0.134176f, -0.048945f, -0.162434f, -0.178272f, -0.036050f, 0.068756f, 0.156869f, 0.101113f, -0.012461f, -0.095345f, -0.104836f, -0.113016f, -0.079800f, 0.011494f, 0.138572f, 0.173046f, 0.103807f, -0.040540f, -0.177760f, -0.172102f, -0.083891f, 0.094557f, 0.150645f, 0.179711f, 0.059456f, -0.115036f, -0.195307f, -0.164640f, 0.022578f, 0.081531f, 0.112551f, 0.091867f, 0.010385f, -0.059832f, -0.108985f, -0.101079f, - -0.043551f, 0.048804f, 0.091602f, 0.082680f, 0.013543f, -0.067321f, -0.119076f, -0.061746f, 0.048065f, 0.069868f, 0.069122f, 0.013037f, -0.019875f, -0.028618f, 0.001104f, 0.028477f, 0.025717f, -0.009408f, -0.032878f, -0.067421f, -0.042545f, 0.018003f, 0.039629f, 0.054995f, 0.040191f, -0.004595f, -0.064461f, -0.041332f, -0.001837f, 0.010840f, 0.002272f, 0.002112f}, - {0.000457f, 0.001380f, 0.002330f, 0.003323f, 0.004372f, 0.005487f, 0.006672f, 0.007930f, 0.009253f, 0.010633f, 0.012054f, 0.013496f, 0.014933f, 0.016338f, 0.017681f, 0.018929f, 0.020051f, 0.021016f, 0.021796f, 0.022367f, 0.022709f, 0.022807f, 0.022655f, 0.022253f, 0.021607f, 0.020731f, 0.019647f, 0.018384f, 0.016975f, 0.015458f, 0.013877f, 0.012274f, 0.010695f, 0.009185f, 0.007786f, 0.006535f, 0.005466f, 0.004605f, 0.003973f, 0.003580f, 0.003429f, 0.003517f, 0.003828f, 0.004340f, 0.005026f, 0.005850f, 0.006772f, 0.007748f, 0.008734f, 0.009682f, 0.010549f, 0.011293f, 0.011876f, 0.012268f, 0.012444f, 0.012387f, 0.012090f, 0.011552f, 0.010783f, 0.009802f, 0.008634f, 0.007312f, 0.005875f, 0.004365f, 0.002830f, 0.001317f, -0.000128f, -0.001458f, -0.002632f, -0.003614f, -0.004372f, -0.004886f, -0.005138f, -0.005124f, -0.004845f, -0.004314f, -0.003551f, -0.002581f, -0.001440f, -0.000167f, 0.001196f, 0.002603f, 0.004007f, 0.005363f, 0.006627f, 0.007761f, 0.008730f, 0.009507f, 0.010070f, 0.010408f, 0.010515f, 0.010395f, 0.010059f, 0.009528f, 0.008825f, 0.007983f, - 0.007038f, 0.006026f, 0.004990f, 0.003968f, 0.003000f, 0.002121f, 0.001364f, 0.000755f, 0.000315f, 0.000058f, -0.000009f, 0.000112f, 0.000416f, 0.000886f, 0.001505f, 0.002244f, 0.003076f, 0.003968f, 0.004884f, 0.005791f, 0.006655f, 0.007444f, 0.008130f, 0.008688f, 0.009100f, 0.009352f, 0.009438f, 0.009356f, 0.009111f, 0.008715f, 0.008183f, 0.007536f, 0.006798f, 0.005996f, 0.005158f, 0.004312f, 0.003487f, 0.002708f, 0.001998f, 0.001376f, 0.000858f, 0.000454f, 0.000169f, 0.000004f, -0.000047f, 0.000006f, 0.000151f, 0.000371f, 0.000645f, 0.000953f, 0.001272f, 0.001581f, 0.001860f, 0.002091f, 0.002257f, 0.002346f, 0.002352f, 0.002269f, 0.002099f, 0.001846f, 0.001520f, 0.001132f, 0.000698f, 0.000236f, 0.001082f, 0.007192f, -0.021913f, 0.039500f, 0.011254f, -0.005951f, 0.021905f, 0.091993f, -0.050845f, -0.230618f, -0.217625f, -0.057638f, 0.170004f, -0.264623f, -0.272793f, -0.107389f, 0.097414f, 0.094413f, 0.190690f, -0.040445f, -0.078529f, -0.153019f, -0.116165f, 0.000198f, 0.091181f, 0.012899f, -0.034497f, 0.009199f, -0.022034f, 0.062895f, -0.116104f, -0.113324f, - -0.094084f, 0.017911f, 0.111402f, 0.159862f, 0.075024f, -0.052462f, -0.118694f, -0.118204f, -0.041768f, 0.045757f, 0.039860f, 0.088998f, 0.061848f, 0.001053f, 0.002719f, -0.037087f, 0.047839f, -0.026704f, -0.043210f, -0.000819f, 0.029741f, 0.064514f, 0.061783f, -0.020498f, -0.125645f, -0.158106f, -0.032407f, 0.139003f, 0.178026f, 0.174825f, 0.049323f, -0.125413f, -0.167822f, -0.095223f, 0.064137f, 0.187470f, 0.104867f, -0.076490f, -0.222956f, -0.114431f, 0.089468f, 0.301755f, 0.213346f, -0.032006f, -0.319832f, -0.313302f, -0.106194f, 0.239761f, 0.379586f, 0.301674f, 0.008235f, -0.307527f, -0.363424f, -0.142509f, 0.124602f, 0.338695f, 0.274940f, 0.027364f, -0.227327f, -0.279629f, -0.134176f, 0.048945f, 0.162434f, 0.178272f, 0.036050f, -0.068756f, -0.156869f, -0.101113f, 0.012461f, 0.095345f, 0.104836f, 0.113016f, 0.079800f, -0.011494f, -0.138572f, -0.173046f, -0.103807f, 0.040540f, 0.177760f, 0.172102f, 0.083891f, -0.094557f, -0.150645f, -0.179711f, -0.059456f, 0.115036f, 0.195307f, 0.164640f, -0.022578f, -0.081531f, -0.112551f, -0.091867f, -0.010385f, 0.059832f, 0.108985f, 0.101079f, - 0.043551f, -0.048804f, -0.091602f, -0.082680f, -0.013543f, 0.067321f, 0.119076f, 0.061746f, -0.048065f, -0.069868f, -0.069122f, -0.013037f, 0.019875f, 0.028618f, -0.001104f, -0.028477f, -0.025717f, 0.009408f, 0.032878f, 0.067421f, 0.042545f, -0.018003f, -0.039629f, -0.054995f, -0.040191f, 0.004595f, 0.064461f, 0.041332f, 0.001837f, -0.010840f, -0.002272f, -0.002112f} - }, - { - {0.000405f, 0.001169f, 0.001801f, 0.002218f, 0.002349f, 0.002132f, 0.001524f, 0.000495f, -0.000962f, -0.002837f, -0.005100f, -0.007704f, -0.010583f, -0.013657f, -0.016836f, -0.020020f, -0.023105f, -0.025989f, -0.028570f, -0.030756f, -0.032466f, -0.033633f, -0.034209f, -0.034166f, -0.033496f, -0.032215f, -0.030359f, -0.027987f, -0.025177f, -0.022024f, -0.018637f, -0.015135f, -0.011644f, -0.008292f, -0.005203f, -0.002496f, -0.000277f, 0.001362f, 0.002349f, 0.002630f, 0.002178f, 0.000989f, -0.000917f, -0.003494f, -0.006672f, -0.010363f, -0.014459f, -0.018836f, -0.023361f, -0.027895f, -0.032296f, -0.036426f, -0.040154f, -0.043362f, -0.045945f, -0.047820f, -0.048926f, -0.049223f, -0.048698f, -0.047363f, -0.045255f, -0.042434f, -0.038981f, -0.034994f, -0.030589f, -0.025889f, -0.021028f, -0.016138f, -0.011351f, -0.006794f, -0.002581f, 0.001187f, 0.004427f, 0.007072f, 0.009081f, 0.010432f, 0.011126f, 0.011185f, 0.010652f, 0.009589f, 0.008072f, 0.006189f, 0.004040f, 0.001728f, -0.000642f, -0.002969f, -0.005154f, -0.007111f, -0.008763f, -0.010050f, -0.010927f, -0.011366f, -0.011356f, -0.010906f, -0.010040f, -0.008798f, - -0.007232f, -0.005406f, -0.003393f, -0.001270f, 0.000884f, 0.002991f, 0.004977f, 0.006773f, 0.008322f, 0.009576f, 0.010501f, 0.011075f, 0.011292f, 0.011158f, 0.010694f, 0.009932f, 0.008913f, 0.007690f, 0.006319f, 0.004861f, 0.003379f, 0.001932f, 0.000579f, -0.000630f, -0.001651f, -0.002450f, -0.003003f, -0.003297f, -0.003332f, -0.003115f, -0.002668f, -0.002019f, -0.001204f, -0.000266f, 0.000749f, 0.001793f, 0.002817f, 0.003776f, 0.004628f, 0.005337f, 0.005874f, 0.006220f, 0.006362f, 0.006300f, 0.006038f, 0.005594f, 0.004990f, 0.004255f, 0.003425f, 0.002538f, 0.001633f, 0.000750f, -0.000074f, -0.000806f, -0.001416f, -0.001882f, -0.002190f, -0.002332f, -0.002309f, -0.002132f, -0.001816f, -0.001384f, -0.000866f, -0.000295f, 0.001541f, -0.005469f, 0.091550f, 0.026897f, -0.110318f, -0.073062f, -0.046913f, -0.061069f, 0.019816f, 0.178869f, 0.180961f, 0.052028f, -0.078827f, 0.202343f, 0.182619f, 0.086795f, 0.204182f, 0.200105f, 0.111146f, -0.099247f, -0.003951f, 0.037305f, 0.006350f, 0.130261f, 0.198333f, 0.305704f, 0.137971f, -0.169170f, -0.168028f, -0.202794f, -0.028688f, 0.059029f, - 0.277175f, 0.353746f, -0.072412f, -0.351677f, -0.378052f, -0.122537f, 0.080151f, 0.468403f, 0.159017f, -0.071636f, -0.114519f, -0.218293f, -0.030837f, 0.193529f, 0.235419f, -0.074620f, -0.515807f, -0.464965f, -0.047342f, 0.323149f, 0.558774f, 0.307225f, -0.067114f, -0.469849f, -0.435609f, -0.253862f, 0.244754f, 0.043703f, 0.250335f, 0.056211f, -0.265231f, -0.253281f, 0.108080f, -0.098926f, -0.316563f, -0.154288f, 0.049659f, 0.266377f, 0.232891f, 0.153029f, 0.012859f, -0.017317f, -0.179558f, -0.104856f, -0.136314f, 0.000697f, 0.164413f, 0.201981f, 0.029839f, -0.144306f, -0.195132f, 0.118239f, 0.339500f, 0.353795f, -0.027643f, -0.389921f, -0.511417f, -0.197752f, 0.270887f, 0.631279f, 0.424246f, -0.058956f, -0.485919f, -0.476863f, -0.264843f, 0.177069f, 0.408998f, 0.218609f, 0.009780f, -0.226727f, -0.236332f, -0.102657f, 0.151492f, 0.292652f, 0.230052f, -0.031832f, -0.256067f, -0.323093f, -0.162039f, 0.056385f, 0.246837f, 0.293356f, 0.226747f, -0.082319f, -0.333768f, -0.350618f, -0.119567f, 0.270876f, 0.419031f, 0.257070f, 0.014739f, -0.328034f, -0.409808f, -0.211830f, 0.141731f, 0.364473f, - 0.378449f, 0.126836f, -0.236256f, -0.455961f, -0.343232f, 0.004634f, 0.343774f, 0.478417f, 0.265800f, -0.125937f, -0.473577f, -0.426358f, -0.095738f, 0.308788f, 0.483920f, 0.336634f, -0.054008f, -0.411204f, -0.470853f, -0.174093f, 0.220369f, 0.459898f, 0.338166f, 0.012781f, -0.330932f, -0.351817f, -0.123505f, 0.133013f, 0.122591f, 0.039645f, -0.001385f, 0.002204f}, - {0.000405f, 0.001169f, 0.001801f, 0.002218f, 0.002349f, 0.002132f, 0.001524f, 0.000495f, -0.000962f, -0.002837f, -0.005100f, -0.007704f, -0.010583f, -0.013657f, -0.016836f, -0.020020f, -0.023105f, -0.025989f, -0.028570f, -0.030756f, -0.032466f, -0.033633f, -0.034209f, -0.034166f, -0.033496f, -0.032215f, -0.030359f, -0.027987f, -0.025177f, -0.022024f, -0.018637f, -0.015135f, -0.011644f, -0.008292f, -0.005203f, -0.002496f, -0.000277f, 0.001362f, 0.002349f, 0.002630f, 0.002178f, 0.000989f, -0.000917f, -0.003494f, -0.006672f, -0.010363f, -0.014459f, -0.018836f, -0.023361f, -0.027895f, -0.032296f, -0.036426f, -0.040154f, -0.043362f, -0.045945f, -0.047820f, -0.048926f, -0.049223f, -0.048698f, -0.047363f, -0.045255f, -0.042434f, -0.038981f, -0.034994f, -0.030589f, -0.025889f, -0.021028f, -0.016138f, -0.011351f, -0.006794f, -0.002581f, 0.001187f, 0.004427f, 0.007072f, 0.009081f, 0.010432f, 0.011126f, 0.011185f, 0.010652f, 0.009589f, 0.008072f, 0.006189f, 0.004040f, 0.001728f, -0.000642f, -0.002969f, -0.005154f, -0.007111f, -0.008763f, -0.010050f, -0.010927f, -0.011366f, -0.011356f, -0.010906f, -0.010040f, -0.008798f, - -0.007232f, -0.005406f, -0.003393f, -0.001270f, 0.000884f, 0.002991f, 0.004977f, 0.006773f, 0.008322f, 0.009576f, 0.010501f, 0.011075f, 0.011292f, 0.011158f, 0.010694f, 0.009932f, 0.008913f, 0.007690f, 0.006319f, 0.004861f, 0.003379f, 0.001932f, 0.000579f, -0.000630f, -0.001651f, -0.002450f, -0.003003f, -0.003297f, -0.003332f, -0.003115f, -0.002668f, -0.002019f, -0.001204f, -0.000266f, 0.000749f, 0.001793f, 0.002817f, 0.003776f, 0.004628f, 0.005337f, 0.005874f, 0.006220f, 0.006362f, 0.006300f, 0.006038f, 0.005594f, 0.004990f, 0.004255f, 0.003425f, 0.002538f, 0.001633f, 0.000750f, -0.000074f, -0.000806f, -0.001416f, -0.001882f, -0.002190f, -0.002332f, -0.002309f, -0.002132f, -0.001816f, -0.001384f, -0.000866f, -0.000295f, 0.001541f, -0.005469f, 0.091550f, 0.026897f, -0.110318f, -0.073062f, -0.046913f, -0.061069f, 0.019816f, 0.178869f, 0.180961f, 0.052028f, -0.078827f, 0.202343f, 0.182619f, 0.086795f, 0.204182f, 0.200105f, 0.111146f, -0.099247f, -0.003951f, 0.037305f, 0.006350f, 0.130261f, 0.198333f, 0.305704f, 0.137971f, -0.169170f, -0.168028f, -0.202794f, -0.028688f, 0.059029f, - 0.277175f, 0.353746f, -0.072412f, -0.351677f, -0.378052f, -0.122537f, 0.080151f, 0.468403f, 0.159017f, -0.071636f, -0.114519f, -0.218293f, -0.030837f, 0.193529f, 0.235419f, -0.074620f, -0.515807f, -0.464965f, -0.047342f, 0.323149f, 0.558774f, 0.307225f, -0.067114f, -0.469849f, -0.435609f, -0.253862f, 0.244754f, 0.043703f, 0.250335f, 0.056211f, -0.265231f, -0.253281f, 0.108080f, -0.098926f, -0.316563f, -0.154288f, 0.049659f, 0.266377f, 0.232891f, 0.153029f, 0.012859f, -0.017317f, -0.179558f, -0.104856f, -0.136314f, 0.000697f, 0.164413f, 0.201981f, 0.029839f, -0.144306f, -0.195132f, 0.118239f, 0.339500f, 0.353795f, -0.027643f, -0.389921f, -0.511417f, -0.197752f, 0.270887f, 0.631279f, 0.424246f, -0.058956f, -0.485919f, -0.476863f, -0.264843f, 0.177069f, 0.408998f, 0.218609f, 0.009780f, -0.226727f, -0.236332f, -0.102657f, 0.151492f, 0.292652f, 0.230052f, -0.031832f, -0.256067f, -0.323093f, -0.162039f, 0.056385f, 0.246837f, 0.293356f, 0.226747f, -0.082319f, -0.333768f, -0.350618f, -0.119567f, 0.270876f, 0.419031f, 0.257070f, 0.014739f, -0.328034f, -0.409808f, -0.211830f, 0.141731f, 0.364473f, - 0.378449f, 0.126836f, -0.236256f, -0.455961f, -0.343232f, 0.004634f, 0.343774f, 0.478417f, 0.265800f, -0.125937f, -0.473577f, -0.426358f, -0.095738f, 0.308788f, 0.483920f, 0.336634f, -0.054008f, -0.411204f, -0.470853f, -0.174093f, 0.220369f, 0.459898f, 0.338166f, 0.012781f, -0.330932f, -0.351817f, -0.123505f, 0.133013f, 0.122591f, 0.039645f, -0.001385f, 0.002204f} - }, - { - {-0.002461f, -0.007319f, -0.011989f, -0.016353f, -0.020303f, -0.023742f, -0.026593f, -0.028795f, -0.030308f, -0.031115f, -0.031221f, -0.030650f, -0.029449f, -0.027683f, -0.025434f, -0.022796f, -0.019873f, -0.016777f, -0.013619f, -0.010512f, -0.007560f, -0.004861f, -0.002499f, -0.000544f, 0.000952f, 0.001954f, 0.002451f, 0.002445f, 0.001964f, 0.001049f, -0.000241f, -0.001833f, -0.003643f, -0.005580f, -0.007550f, -0.009456f, -0.011206f, -0.012715f, -0.013904f, -0.014711f, -0.015087f, -0.014997f, -0.014427f, -0.013380f, -0.011877f, -0.009954f, -0.007667f, -0.005081f, -0.002276f, 0.000663f, 0.003642f, 0.006568f, 0.009347f, 0.011892f, 0.014121f, 0.015964f, 0.017363f, 0.018274f, 0.018670f, 0.018540f, 0.017888f, 0.016738f, 0.015126f, 0.013104f, 0.010735f, 0.008091f, 0.005250f, 0.002298f, -0.000683f, -0.003610f, -0.006404f, -0.008995f, -0.011322f, -0.013335f, -0.014995f, -0.016280f, -0.017178f, -0.017693f, -0.017841f, -0.017653f, -0.017165f, -0.016427f, -0.015491f, -0.014417f, -0.013264f, -0.012092f, -0.010957f, -0.009910f, -0.008995f, -0.008247f, -0.007694f, -0.007349f, -0.007219f, -0.007296f, -0.007564f, -0.007999f, - -0.008567f, -0.009229f, -0.009941f, -0.010657f, -0.011330f, -0.011914f, -0.012370f, -0.012659f, -0.012754f, -0.012631f, -0.012279f, -0.011694f, -0.010882f, -0.009860f, -0.008651f, -0.007287f, -0.005807f, -0.004253f, -0.002672f, -0.001112f, 0.000380f, 0.001759f, 0.002984f, 0.004018f, 0.004833f, 0.005408f, 0.005731f, 0.005796f, 0.005610f, 0.005186f, 0.004544f, 0.003715f, 0.002732f, 0.001634f, 0.000462f, -0.000742f, -0.001933f, -0.003073f, -0.004125f, -0.005055f, -0.005838f, -0.006454f, -0.006889f, -0.007139f, -0.007205f, -0.007096f, -0.006827f, -0.006419f, -0.005896f, -0.005285f, -0.004616f, -0.003919f, -0.003222f, -0.002553f, -0.001934f, -0.001383f, -0.000915f, -0.000539f, -0.000256f, -0.000064f, 0.000046f, 0.000086f, 0.000073f, 0.000028f, -0.016524f, -0.064320f, 0.077125f, 0.022151f, -0.042129f, -0.194424f, -0.123531f, 0.149430f, 0.026902f, 0.251006f, 0.331756f, 0.287429f, 0.021249f, 0.026054f, 0.022955f, 0.079017f, -0.015064f, -0.039510f, 0.084197f, -0.023785f, 0.017416f, -0.010733f, -0.008857f, -0.003921f, 0.000185f, -0.023770f, 0.016679f, 0.010856f, -0.032920f, -0.034982f, 0.032712f, 0.057460f, - 0.052476f, 0.002469f, 0.053407f, 0.076847f, 0.121729f, -0.017425f, -0.106622f, -0.096335f, 0.047938f, 0.260077f, 0.080512f, -0.003540f, -0.209238f, -0.237182f, -0.102591f, 0.103280f, 0.217333f, 0.243771f, 0.064586f, -0.096557f, -0.245267f, -0.139221f, -0.000900f, 0.196301f, 0.212360f, 0.180491f, -0.067653f, 0.001517f, -0.181052f, -0.099956f, 0.146406f, 0.241327f, 0.046377f, 0.219953f, 0.279241f, -0.035949f, -0.276223f, -0.440805f, -0.180922f, 0.136448f, 0.348502f, 0.113900f, -0.087721f, -0.348109f, -0.214514f, -0.059360f, 0.156355f, 0.377743f, 0.259491f, -0.013428f, -0.259813f, -0.302835f, -0.130048f, 0.142268f, 0.225902f, 0.085727f, -0.109242f, -0.194494f, -0.099661f, 0.065807f, 0.175235f, 0.089653f, -0.044902f, -0.092312f, -0.081433f, 0.051319f, 0.210985f, 0.222219f, 0.063654f, -0.251653f, -0.396830f, -0.252488f, 0.150761f, 0.419968f, 0.455384f, 0.126597f, -0.260984f, -0.571256f, -0.522732f, -0.063682f, 0.447615f, 0.534938f, 0.190059f, -0.304205f, -0.428620f, -0.209841f, 0.151149f, 0.419089f, 0.239321f, 0.067103f, -0.187080f, -0.256172f, -0.084144f, 0.044483f, 0.185793f, 0.115053f, - -0.016819f, -0.114767f, -0.091989f, -0.035395f, 0.089159f, 0.105183f, 0.047119f, -0.073873f, -0.099207f, -0.072923f, 0.047801f, 0.100466f, 0.096086f, 0.001693f, -0.088988f, -0.152437f, -0.055419f, 0.061478f, 0.163163f, 0.129363f, 0.035064f, -0.122817f, -0.206598f, -0.150847f, 0.000562f, 0.117664f, 0.176597f, 0.075677f, -0.015394f, -0.030687f, -0.004427f, -0.004042f}, - {-0.002461f, -0.007319f, -0.011989f, -0.016353f, -0.020303f, -0.023742f, -0.026593f, -0.028795f, -0.030308f, -0.031115f, -0.031221f, -0.030650f, -0.029449f, -0.027683f, -0.025434f, -0.022796f, -0.019873f, -0.016777f, -0.013619f, -0.010512f, -0.007560f, -0.004861f, -0.002499f, -0.000544f, 0.000952f, 0.001954f, 0.002451f, 0.002445f, 0.001964f, 0.001049f, -0.000241f, -0.001833f, -0.003643f, -0.005580f, -0.007550f, -0.009456f, -0.011206f, -0.012715f, -0.013904f, -0.014711f, -0.015087f, -0.014997f, -0.014427f, -0.013380f, -0.011877f, -0.009954f, -0.007667f, -0.005081f, -0.002276f, 0.000663f, 0.003642f, 0.006568f, 0.009347f, 0.011892f, 0.014121f, 0.015964f, 0.017363f, 0.018274f, 0.018670f, 0.018540f, 0.017888f, 0.016738f, 0.015126f, 0.013104f, 0.010735f, 0.008091f, 0.005250f, 0.002298f, -0.000683f, -0.003610f, -0.006404f, -0.008995f, -0.011322f, -0.013335f, -0.014995f, -0.016280f, -0.017178f, -0.017693f, -0.017841f, -0.017653f, -0.017165f, -0.016427f, -0.015491f, -0.014417f, -0.013264f, -0.012092f, -0.010957f, -0.009910f, -0.008995f, -0.008247f, -0.007694f, -0.007349f, -0.007219f, -0.007296f, -0.007564f, -0.007999f, - -0.008567f, -0.009229f, -0.009941f, -0.010657f, -0.011330f, -0.011914f, -0.012370f, -0.012659f, -0.012754f, -0.012631f, -0.012279f, -0.011694f, -0.010882f, -0.009860f, -0.008651f, -0.007287f, -0.005807f, -0.004253f, -0.002672f, -0.001112f, 0.000380f, 0.001759f, 0.002984f, 0.004018f, 0.004833f, 0.005408f, 0.005731f, 0.005796f, 0.005610f, 0.005186f, 0.004544f, 0.003715f, 0.002732f, 0.001634f, 0.000462f, -0.000742f, -0.001933f, -0.003073f, -0.004125f, -0.005055f, -0.005838f, -0.006454f, -0.006889f, -0.007139f, -0.007205f, -0.007096f, -0.006827f, -0.006419f, -0.005896f, -0.005285f, -0.004616f, -0.003919f, -0.003222f, -0.002553f, -0.001934f, -0.001383f, -0.000915f, -0.000539f, -0.000256f, -0.000064f, 0.000046f, 0.000086f, 0.000073f, 0.000028f, -0.016524f, -0.064320f, 0.077125f, 0.022151f, -0.042129f, -0.194424f, -0.123531f, 0.149430f, 0.026902f, 0.251006f, 0.331756f, 0.287429f, 0.021249f, 0.026054f, 0.022955f, 0.079017f, -0.015064f, -0.039510f, 0.084197f, -0.023785f, 0.017416f, -0.010733f, -0.008857f, -0.003921f, 0.000185f, -0.023770f, 0.016679f, 0.010856f, -0.032920f, -0.034982f, 0.032712f, 0.057460f, - 0.052476f, 0.002469f, 0.053407f, 0.076847f, 0.121729f, -0.017425f, -0.106622f, -0.096335f, 0.047938f, 0.260077f, 0.080512f, -0.003540f, -0.209238f, -0.237182f, -0.102591f, 0.103280f, 0.217333f, 0.243771f, 0.064586f, -0.096557f, -0.245267f, -0.139221f, -0.000900f, 0.196301f, 0.212360f, 0.180491f, -0.067653f, 0.001517f, -0.181052f, -0.099956f, 0.146406f, 0.241327f, 0.046377f, 0.219953f, 0.279241f, -0.035949f, -0.276223f, -0.440805f, -0.180922f, 0.136448f, 0.348502f, 0.113900f, -0.087721f, -0.348109f, -0.214514f, -0.059360f, 0.156355f, 0.377743f, 0.259491f, -0.013428f, -0.259813f, -0.302835f, -0.130048f, 0.142268f, 0.225902f, 0.085727f, -0.109242f, -0.194494f, -0.099661f, 0.065807f, 0.175235f, 0.089653f, -0.044902f, -0.092312f, -0.081433f, 0.051319f, 0.210985f, 0.222219f, 0.063654f, -0.251653f, -0.396830f, -0.252488f, 0.150761f, 0.419968f, 0.455384f, 0.126597f, -0.260984f, -0.571256f, -0.522732f, -0.063682f, 0.447615f, 0.534938f, 0.190059f, -0.304205f, -0.428620f, -0.209841f, 0.151149f, 0.419089f, 0.239321f, 0.067103f, -0.187080f, -0.256172f, -0.084144f, 0.044483f, 0.185793f, 0.115053f, - -0.016819f, -0.114767f, -0.091989f, -0.035395f, 0.089159f, 0.105183f, 0.047119f, -0.073873f, -0.099207f, -0.072923f, 0.047801f, 0.100466f, 0.096086f, 0.001693f, -0.088988f, -0.152437f, -0.055419f, 0.061478f, 0.163163f, 0.129363f, 0.035064f, -0.122817f, -0.206598f, -0.150847f, 0.000562f, 0.117664f, 0.176597f, 0.075677f, -0.015394f, -0.030687f, -0.004427f, -0.004042f} - }, - { - {-0.001660f, -0.004932f, -0.008064f, -0.010965f, -0.013553f, -0.015751f, -0.017496f, -0.018735f, -0.019429f, -0.019553f, -0.019099f, -0.018072f, -0.016493f, -0.014399f, -0.011839f, -0.008873f, -0.005574f, -0.002021f, 0.001698f, 0.005493f, 0.009271f, 0.012942f, 0.016417f, 0.019613f, 0.022455f, 0.024877f, 0.026823f, 0.028252f, 0.029132f, 0.029448f, 0.029198f, 0.028393f, 0.027058f, 0.025229f, 0.022955f, 0.020291f, 0.017305f, 0.014067f, 0.010652f, 0.007138f, 0.003602f, 0.000120f, -0.003235f, -0.006399f, -0.009311f, -0.011921f, -0.014186f, -0.016075f, -0.017566f, -0.018649f, -0.019323f, -0.019597f, -0.019490f, -0.019031f, -0.018252f, -0.017195f, -0.015906f, -0.014432f, -0.012824f, -0.011134f, -0.009410f, -0.007702f, -0.006052f, -0.004502f, -0.003085f, -0.001832f, -0.000764f, 0.000103f, 0.000757f, 0.001197f, 0.001424f, 0.001446f, 0.001276f, 0.000931f, 0.000432f, -0.000200f, -0.000939f, -0.001761f, -0.002641f, -0.003554f, -0.004478f, -0.005392f, -0.006279f, -0.007122f, -0.007909f, -0.008632f, -0.009284f, -0.009861f, -0.010364f, -0.010794f, -0.011155f, -0.011452f, -0.011692f, -0.011882f, -0.012029f, -0.012139f, - -0.012220f, -0.012275f, -0.012311f, -0.012328f, -0.012329f, -0.012313f, -0.012278f, -0.012222f, -0.012140f, -0.012027f, -0.011879f, -0.011688f, -0.011451f, -0.011162f, -0.010818f, -0.010415f, -0.009952f, -0.009431f, -0.008851f, -0.008219f, -0.007540f, -0.006822f, -0.006075f, -0.005309f, -0.004538f, -0.003774f, -0.003033f, -0.002327f, -0.001671f, -0.001078f, -0.000561f, -0.000131f, 0.000205f, 0.000438f, 0.000564f, 0.000582f, 0.000493f, 0.000300f, 0.000009f, -0.000370f, -0.000827f, -0.001347f, -0.001915f, -0.002514f, -0.003127f, -0.003734f, -0.004318f, -0.004859f, -0.005342f, -0.005749f, -0.006067f, -0.006284f, -0.006390f, -0.006379f, -0.006246f, -0.005992f, -0.005619f, -0.005131f, -0.004538f, -0.003851f, -0.003083f, -0.002250f, -0.001370f, -0.000460f, 0.051673f, -0.017632f, -0.014793f, -0.006854f, 0.085155f, 0.029825f, 0.126550f, 0.077456f, 0.061534f, -0.207009f, -0.266257f, -0.146498f, 0.048723f, 0.221641f, 0.277191f, 0.058431f, -0.164615f, -0.206701f, -0.156974f, -0.020143f, 0.022758f, 0.008961f, -0.074555f, -0.003925f, 0.011839f, 0.046237f, 0.084746f, 0.034886f, -0.041420f, -0.135279f, -0.246819f, -0.068468f, - 0.062692f, 0.214884f, 0.182407f, 0.017704f, -0.224559f, -0.242317f, -0.153848f, 0.140584f, 0.085332f, 0.013707f, 0.004997f, -0.030712f, -0.048221f, -0.054054f, 0.043237f, 0.077808f, -0.122313f, -0.094422f, -0.020880f, 0.048625f, 0.099290f, 0.131977f, 0.049706f, -0.051476f, -0.107499f, -0.102515f, -0.027222f, 0.017018f, 0.122150f, 0.099096f, -0.012255f, -0.136944f, -0.168388f, -0.174519f, -0.066589f, 0.137016f, 0.301572f, 0.218780f, 0.064888f, -0.129614f, -0.295622f, -0.371987f, -0.175825f, 0.125281f, 0.321318f, 0.280973f, 0.080136f, -0.181841f, -0.337455f, -0.254867f, -0.075576f, 0.186279f, 0.230182f, 0.034312f, -0.136787f, -0.116980f, -0.015761f, 0.103139f, 0.148813f, 0.091199f, 0.023468f, -0.071270f, -0.111474f, -0.117202f, 0.010661f, 0.107073f, 0.099952f, 0.070676f, -0.064059f, -0.141154f, -0.120669f, -0.020003f, 0.117424f, 0.156810f, 0.060135f, -0.155403f, -0.200692f, -0.053828f, 0.108676f, 0.190613f, 0.124853f, -0.081226f, -0.251418f, -0.317618f, -0.060039f, 0.292421f, 0.371096f, 0.175763f, -0.113281f, -0.302853f, -0.187668f, -0.016911f, 0.224405f, 0.244635f, 0.102496f, -0.073172f, - -0.204158f, -0.199586f, -0.041058f, 0.109714f, 0.223389f, 0.139773f, -0.050482f, -0.212584f, -0.246282f, -0.078238f, 0.143784f, 0.231603f, 0.169289f, 0.027874f, -0.146913f, -0.217525f, -0.151836f, 0.040485f, 0.179321f, 0.136528f, -0.009910f, -0.075759f, -0.145118f, -0.039104f, 0.051169f, 0.093606f, 0.021532f, -0.001614f, -0.016184f, 0.004221f, -0.007703f, 0.007556f}, - {-0.001660f, -0.004932f, -0.008064f, -0.010965f, -0.013553f, -0.015751f, -0.017496f, -0.018735f, -0.019429f, -0.019553f, -0.019099f, -0.018072f, -0.016493f, -0.014399f, -0.011839f, -0.008873f, -0.005574f, -0.002021f, 0.001698f, 0.005493f, 0.009271f, 0.012942f, 0.016417f, 0.019613f, 0.022455f, 0.024877f, 0.026823f, 0.028252f, 0.029132f, 0.029448f, 0.029198f, 0.028393f, 0.027058f, 0.025229f, 0.022955f, 0.020291f, 0.017305f, 0.014067f, 0.010652f, 0.007138f, 0.003602f, 0.000120f, -0.003235f, -0.006399f, -0.009311f, -0.011921f, -0.014186f, -0.016075f, -0.017566f, -0.018649f, -0.019323f, -0.019597f, -0.019490f, -0.019031f, -0.018252f, -0.017195f, -0.015906f, -0.014432f, -0.012824f, -0.011134f, -0.009410f, -0.007702f, -0.006052f, -0.004502f, -0.003085f, -0.001832f, -0.000764f, 0.000103f, 0.000757f, 0.001197f, 0.001424f, 0.001446f, 0.001276f, 0.000931f, 0.000432f, -0.000200f, -0.000939f, -0.001761f, -0.002641f, -0.003554f, -0.004478f, -0.005392f, -0.006279f, -0.007122f, -0.007909f, -0.008632f, -0.009284f, -0.009861f, -0.010364f, -0.010794f, -0.011155f, -0.011452f, -0.011692f, -0.011882f, -0.012029f, -0.012139f, - -0.012220f, -0.012275f, -0.012311f, -0.012328f, -0.012329f, -0.012313f, -0.012278f, -0.012222f, -0.012140f, -0.012027f, -0.011879f, -0.011688f, -0.011451f, -0.011162f, -0.010818f, -0.010415f, -0.009952f, -0.009431f, -0.008851f, -0.008219f, -0.007540f, -0.006822f, -0.006075f, -0.005309f, -0.004538f, -0.003774f, -0.003033f, -0.002327f, -0.001671f, -0.001078f, -0.000561f, -0.000131f, 0.000205f, 0.000438f, 0.000564f, 0.000582f, 0.000493f, 0.000300f, 0.000009f, -0.000370f, -0.000827f, -0.001347f, -0.001915f, -0.002514f, -0.003127f, -0.003734f, -0.004318f, -0.004859f, -0.005342f, -0.005749f, -0.006067f, -0.006284f, -0.006390f, -0.006379f, -0.006246f, -0.005992f, -0.005619f, -0.005131f, -0.004538f, -0.003851f, -0.003083f, -0.002250f, -0.001370f, -0.000460f, 0.051673f, -0.017632f, -0.014793f, -0.006854f, 0.085155f, 0.029825f, 0.126550f, 0.077456f, 0.061534f, -0.207009f, -0.266257f, -0.146498f, 0.048723f, 0.221641f, 0.277191f, 0.058431f, -0.164615f, -0.206701f, -0.156974f, -0.020143f, 0.022758f, 0.008961f, -0.074555f, -0.003925f, 0.011839f, 0.046237f, 0.084746f, 0.034886f, -0.041420f, -0.135279f, -0.246819f, -0.068468f, - 0.062692f, 0.214884f, 0.182407f, 0.017704f, -0.224559f, -0.242317f, -0.153848f, 0.140584f, 0.085332f, 0.013707f, 0.004997f, -0.030712f, -0.048221f, -0.054054f, 0.043237f, 0.077808f, -0.122313f, -0.094422f, -0.020880f, 0.048625f, 0.099290f, 0.131977f, 0.049706f, -0.051476f, -0.107499f, -0.102515f, -0.027222f, 0.017018f, 0.122150f, 0.099096f, -0.012255f, -0.136944f, -0.168388f, -0.174519f, -0.066589f, 0.137016f, 0.301572f, 0.218780f, 0.064888f, -0.129614f, -0.295622f, -0.371987f, -0.175825f, 0.125281f, 0.321318f, 0.280973f, 0.080136f, -0.181841f, -0.337455f, -0.254867f, -0.075576f, 0.186279f, 0.230182f, 0.034312f, -0.136787f, -0.116980f, -0.015761f, 0.103139f, 0.148813f, 0.091199f, 0.023468f, -0.071270f, -0.111474f, -0.117202f, 0.010661f, 0.107073f, 0.099952f, 0.070676f, -0.064059f, -0.141154f, -0.120669f, -0.020003f, 0.117424f, 0.156810f, 0.060135f, -0.155403f, -0.200692f, -0.053828f, 0.108676f, 0.190613f, 0.124853f, -0.081226f, -0.251418f, -0.317618f, -0.060039f, 0.292421f, 0.371096f, 0.175763f, -0.113281f, -0.302853f, -0.187668f, -0.016911f, 0.224405f, 0.244635f, 0.102496f, -0.073172f, - -0.204158f, -0.199586f, -0.041058f, 0.109714f, 0.223389f, 0.139773f, -0.050482f, -0.212584f, -0.246282f, -0.078238f, 0.143784f, 0.231603f, 0.169289f, 0.027874f, -0.146913f, -0.217525f, -0.151836f, 0.040485f, 0.179321f, 0.136528f, -0.009910f, -0.075759f, -0.145118f, -0.039104f, 0.051169f, 0.093606f, 0.021532f, -0.001614f, -0.016184f, 0.004221f, -0.007703f, 0.007556f} - }, - { - {-0.000640f, -0.001906f, -0.003129f, -0.004283f, -0.005343f, -0.006287f, -0.007094f, -0.007750f, -0.008242f, -0.008562f, -0.008709f, -0.008684f, -0.008492f, -0.008146f, -0.007659f, -0.007050f, -0.006342f, -0.005558f, -0.004726f, -0.003873f, -0.003029f, -0.002222f, -0.001480f, -0.000831f, -0.000298f, 0.000096f, 0.000332f, 0.000394f, 0.000272f, -0.000042f, -0.000551f, -0.001253f, -0.002142f, -0.003209f, -0.004440f, -0.005816f, -0.007316f, -0.008917f, -0.010592f, -0.012312f, -0.014048f, -0.015769f, -0.017444f, -0.019044f, -0.020538f, -0.021899f, -0.023099f, -0.024116f, -0.024927f, -0.025514f, -0.025863f, -0.025961f, -0.025802f, -0.025381f, -0.024700f, -0.023761f, -0.022573f, -0.021149f, -0.019504f, -0.017657f, -0.015630f, -0.013450f, -0.011145f, -0.008744f, -0.006281f, -0.003789f, -0.001304f, 0.001141f, 0.003510f, 0.005768f, 0.007883f, 0.009822f, 0.011558f, 0.013064f, 0.014316f, 0.015297f, 0.015991f, 0.016388f, 0.016483f, 0.016275f, 0.015770f, 0.014978f, 0.013912f, 0.012595f, 0.011049f, 0.009305f, 0.007394f, 0.005352f, 0.003217f, 0.001030f, -0.001169f, -0.003339f, -0.005439f, -0.007430f, -0.009275f, -0.010942f, - -0.012399f, -0.013621f, -0.014588f, -0.015285f, -0.015701f, -0.015833f, -0.015683f, -0.015258f, -0.014573f, -0.013645f, -0.012499f, -0.011161f, -0.009662f, -0.008036f, -0.006319f, -0.004547f, -0.002757f, -0.000984f, 0.000736f, 0.002371f, 0.003893f, 0.005274f, 0.006494f, 0.007535f, 0.008384f, 0.009033f, 0.009480f, 0.009726f, 0.009778f, 0.009644f, 0.009340f, 0.008882f, 0.008290f, 0.007585f, 0.006789f, 0.005927f, 0.005020f, 0.004093f, 0.003166f, 0.002259f, 0.001389f, 0.000573f, -0.000176f, -0.000850f, -0.001440f, -0.001942f, -0.002354f, -0.002676f, -0.002910f, -0.003060f, -0.003133f, -0.003134f, -0.003072f, -0.002953f, -0.002786f, -0.002579f, -0.002337f, -0.002069f, -0.001780f, -0.001475f, -0.001158f, -0.000832f, -0.000502f, -0.000168f, -0.000950f, 0.005196f, 0.008415f, 0.013691f, 0.010046f, 0.041524f, 0.014494f, -0.010253f, -0.059357f, 0.014360f, 0.071639f, 0.089955f, -0.017131f, -0.159396f, -0.255292f, -0.048815f, 0.052816f, 0.112090f, 0.124895f, 0.011629f, 0.053349f, 0.049117f, -0.061521f, -0.153878f, 0.012614f, 0.063490f, 0.088113f, 0.120559f, 0.034303f, -0.028388f, -0.022463f, -0.126119f, - -0.059362f, 0.064977f, 0.125303f, 0.058828f, -0.087333f, -0.114147f, -0.062648f, 0.038220f, 0.156749f, 0.061676f, -0.044312f, -0.110768f, -0.121734f, -0.058530f, 0.070467f, 0.078156f, 0.062830f, 0.041647f, 0.011858f, 0.011894f, -0.019483f, -0.062924f, -0.024475f, -0.018302f, 0.013264f, 0.017461f, 0.119548f, -0.086788f, -0.027462f, -0.030487f, -0.173463f, -0.038236f, 0.108866f, -0.006879f, -0.102246f, -0.053467f, 0.045483f, 0.105019f, 0.128705f, 0.049507f, -0.025025f, -0.123162f, -0.118054f, 0.038616f, 0.185415f, 0.125769f, -0.045948f, -0.169415f, -0.106840f, -0.000353f, 0.054983f, 0.109200f, 0.058742f, -0.075455f, -0.169927f, -0.089376f, 0.045702f, 0.147251f, 0.090587f, -0.009634f, 0.008427f, -0.115185f, 0.015990f, 0.035158f, 0.217410f, 0.101335f, -0.063069f, -0.086048f, -0.002331f, 0.003691f, -0.094486f, -0.117104f, -0.048811f, 0.052984f, 0.122608f, 0.044561f, -0.097600f, -0.114101f, 0.012259f, 0.175564f, 0.184240f, 0.012182f, -0.121057f, -0.169569f, -0.076746f, 0.180433f, 0.250457f, 0.102575f, -0.107796f, -0.234107f, -0.190740f, -0.042613f, 0.128958f, 0.190930f, 0.115898f, -0.017594f, - -0.160777f, -0.122426f, -0.027748f, 0.104804f, 0.179697f, 0.098558f, -0.109567f, -0.149131f, -0.181002f, 0.025485f, 0.217751f, 0.283358f, 0.121772f, -0.068555f, -0.234328f, -0.199341f, -0.081574f, 0.092274f, 0.117148f, 0.125694f, -0.028746f, -0.108284f, -0.127547f, -0.000233f, 0.115058f, 0.139202f, -0.065825f, -0.078859f, -0.059174f, 0.008264f, -0.010895f, 0.013050f}, - {0.000640f, 0.001906f, 0.003129f, 0.004283f, 0.005343f, 0.006287f, 0.007094f, 0.007750f, 0.008242f, 0.008562f, 0.008709f, 0.008684f, 0.008492f, 0.008146f, 0.007659f, 0.007050f, 0.006342f, 0.005558f, 0.004726f, 0.003873f, 0.003029f, 0.002222f, 0.001480f, 0.000831f, 0.000298f, -0.000096f, -0.000332f, -0.000394f, -0.000272f, 0.000042f, 0.000551f, 0.001253f, 0.002142f, 0.003209f, 0.004440f, 0.005816f, 0.007316f, 0.008917f, 0.010592f, 0.012312f, 0.014048f, 0.015769f, 0.017444f, 0.019044f, 0.020538f, 0.021899f, 0.023099f, 0.024116f, 0.024927f, 0.025514f, 0.025863f, 0.025961f, 0.025802f, 0.025381f, 0.024700f, 0.023761f, 0.022573f, 0.021149f, 0.019504f, 0.017657f, 0.015630f, 0.013450f, 0.011145f, 0.008744f, 0.006281f, 0.003789f, 0.001304f, -0.001141f, -0.003510f, -0.005768f, -0.007883f, -0.009822f, -0.011558f, -0.013064f, -0.014316f, -0.015297f, -0.015991f, -0.016388f, -0.016483f, -0.016275f, -0.015770f, -0.014978f, -0.013912f, -0.012595f, -0.011049f, -0.009305f, -0.007394f, -0.005352f, -0.003217f, -0.001030f, 0.001169f, 0.003339f, 0.005439f, 0.007430f, 0.009275f, 0.010942f, - 0.012399f, 0.013621f, 0.014588f, 0.015285f, 0.015701f, 0.015833f, 0.015683f, 0.015258f, 0.014573f, 0.013645f, 0.012499f, 0.011161f, 0.009662f, 0.008036f, 0.006319f, 0.004547f, 0.002757f, 0.000984f, -0.000736f, -0.002371f, -0.003893f, -0.005274f, -0.006494f, -0.007535f, -0.008384f, -0.009033f, -0.009480f, -0.009726f, -0.009778f, -0.009644f, -0.009340f, -0.008882f, -0.008290f, -0.007585f, -0.006789f, -0.005927f, -0.005020f, -0.004093f, -0.003166f, -0.002259f, -0.001389f, -0.000573f, 0.000176f, 0.000850f, 0.001440f, 0.001942f, 0.002354f, 0.002676f, 0.002910f, 0.003060f, 0.003133f, 0.003134f, 0.003072f, 0.002953f, 0.002786f, 0.002579f, 0.002337f, 0.002069f, 0.001780f, 0.001475f, 0.001158f, 0.000832f, 0.000502f, 0.000168f, 0.000950f, -0.005196f, -0.008415f, -0.013691f, -0.010046f, -0.041524f, -0.014494f, 0.010253f, 0.059357f, -0.014360f, -0.071639f, -0.089955f, 0.017131f, 0.159396f, 0.255292f, 0.048815f, -0.052816f, -0.112090f, -0.124895f, -0.011629f, -0.053349f, -0.049117f, 0.061521f, 0.153878f, -0.012614f, -0.063490f, -0.088113f, -0.120559f, -0.034303f, 0.028388f, 0.022463f, 0.126119f, - 0.059362f, -0.064977f, -0.125303f, -0.058828f, 0.087333f, 0.114147f, 0.062648f, -0.038220f, -0.156749f, -0.061676f, 0.044312f, 0.110768f, 0.121734f, 0.058530f, -0.070467f, -0.078156f, -0.062830f, -0.041647f, -0.011858f, -0.011894f, 0.019483f, 0.062924f, 0.024475f, 0.018302f, -0.013264f, -0.017461f, -0.119548f, 0.086788f, 0.027462f, 0.030487f, 0.173463f, 0.038236f, -0.108866f, 0.006879f, 0.102246f, 0.053467f, -0.045483f, -0.105019f, -0.128705f, -0.049507f, 0.025025f, 0.123162f, 0.118054f, -0.038616f, -0.185415f, -0.125769f, 0.045948f, 0.169415f, 0.106840f, 0.000353f, -0.054983f, -0.109200f, -0.058742f, 0.075455f, 0.169927f, 0.089376f, -0.045702f, -0.147251f, -0.090587f, 0.009634f, -0.008427f, 0.115185f, -0.015990f, -0.035158f, -0.217410f, -0.101335f, 0.063069f, 0.086048f, 0.002331f, -0.003691f, 0.094486f, 0.117104f, 0.048811f, -0.052984f, -0.122608f, -0.044561f, 0.097600f, 0.114101f, -0.012259f, -0.175564f, -0.184240f, -0.012182f, 0.121057f, 0.169569f, 0.076746f, -0.180433f, -0.250457f, -0.102575f, 0.107796f, 0.234107f, 0.190740f, 0.042613f, -0.128958f, -0.190930f, -0.115898f, 0.017594f, - 0.160777f, 0.122426f, 0.027748f, -0.104804f, -0.179697f, -0.098558f, 0.109567f, 0.149131f, 0.181002f, -0.025485f, -0.217751f, -0.283358f, -0.121772f, 0.068555f, 0.234328f, 0.199341f, 0.081574f, -0.092274f, -0.117148f, -0.125694f, 0.028746f, 0.108284f, 0.127547f, 0.000233f, -0.115058f, -0.139202f, 0.065825f, 0.078859f, 0.059174f, -0.008264f, 0.010895f, -0.013050f} - }, - { - {0.000861f, 0.002552f, 0.004148f, 0.005589f, 0.006822f, 0.007797f, 0.008477f, 0.008831f, 0.008842f, 0.008500f, 0.007811f, 0.006790f, 0.005462f, 0.003864f, 0.002039f, 0.000040f, -0.002076f, -0.004250f, -0.006419f, -0.008523f, -0.010502f, -0.012301f, -0.013872f, -0.015175f, -0.016176f, -0.016852f, -0.017190f, -0.017188f, -0.016852f, -0.016198f, -0.015252f, -0.014045f, -0.012617f, -0.011010f, -0.009271f, -0.007445f, -0.005582f, -0.003724f, -0.001914f, -0.000187f, 0.001425f, 0.002899f, 0.004218f, 0.005374f, 0.006365f, 0.007196f, 0.007880f, 0.008432f, 0.008875f, 0.009235f, 0.009536f, 0.009806f, 0.010070f, 0.010351f, 0.010670f, 0.011041f, 0.011472f, 0.011967f, 0.012523f, 0.013129f, 0.013770f, 0.014422f, 0.015059f, 0.015651f, 0.016162f, 0.016557f, 0.016802f, 0.016862f, 0.016705f, 0.016305f, 0.015639f, 0.014693f, 0.013459f, 0.011936f, 0.010133f, 0.008066f, 0.005760f, 0.003247f, 0.000565f, -0.002242f, -0.005124f, -0.008031f, -0.010909f, -0.013705f, -0.016369f, -0.018851f, -0.021109f, -0.023105f, -0.024807f, -0.026193f, -0.027249f, -0.027967f, -0.028350f, -0.028408f, -0.028160f, -0.027632f, - -0.026853f, -0.025862f, -0.024696f, -0.023399f, -0.022012f, -0.020579f, -0.019138f, -0.017726f, -0.016378f, -0.015120f, -0.013974f, -0.012957f, -0.012077f, -0.011339f, -0.010740f, -0.010271f, -0.009920f, -0.009670f, -0.009501f, -0.009391f, -0.009317f, -0.009256f, -0.009187f, -0.009090f, -0.008949f, -0.008749f, -0.008483f, -0.008144f, -0.007732f, -0.007250f, -0.006705f, -0.006108f, -0.005474f, -0.004817f, -0.004156f, -0.003507f, -0.002889f, -0.002319f, -0.001811f, -0.001378f, -0.001028f, -0.000769f, -0.000601f, -0.000524f, -0.000532f, -0.000617f, -0.000767f, -0.000968f, -0.001205f, -0.001459f, -0.001714f, -0.001952f, -0.002157f, -0.002315f, -0.002413f, -0.002443f, -0.002398f, -0.002277f, -0.002080f, -0.001812f, -0.001480f, -0.001097f, -0.000674f, -0.000228f, 0.019411f, 0.009812f, -0.026151f, -0.032640f, -0.020738f, -0.035733f, -0.058682f, -0.090327f, -0.110120f, 0.151989f, 0.205551f, 0.056037f, -0.010353f, 0.053360f, 0.023881f, -0.011277f, 0.037123f, 0.092957f, 0.001328f, 0.048049f, -0.016966f, -0.058148f, 0.034997f, -0.009466f, 0.096773f, 0.024594f, 0.050246f, -0.073998f, -0.105668f, 0.008860f, 0.019794f, 0.022894f, - -0.052707f, -0.018010f, 0.016656f, 0.026045f, 0.052147f, 0.060366f, -0.066466f, -0.033060f, -0.017809f, 0.049546f, 0.059084f, 0.019277f, -0.068450f, -0.116077f, -0.069810f, 0.024554f, -0.010201f, 0.065496f, 0.096188f, 0.065856f, -0.056979f, -0.076188f, -0.047224f, 0.045117f, 0.097213f, 0.133600f, -0.019070f, -0.010924f, -0.154412f, -0.092075f, 0.092172f, 0.171862f, 0.046988f, 0.161369f, 0.056767f, -0.125307f, -0.091028f, -0.075354f, 0.082227f, 0.113654f, 0.058354f, -0.143590f, -0.259374f, -0.171666f, -0.132084f, -0.063050f, 0.179825f, 0.214131f, -0.004485f, -0.168746f, -0.138735f, -0.117269f, -0.208188f, 0.116421f, 0.232751f, 0.215983f, 0.077830f, -0.090856f, -0.200054f, -0.127017f, 0.080435f, 0.210455f, 0.194556f, 0.068536f, -0.104517f, -0.158299f, 0.038053f, 0.144177f, 0.160016f, 0.024600f, -0.130868f, -0.220678f, -0.062299f, 0.117071f, 0.256720f, 0.134429f, -0.052569f, -0.333617f, -0.343628f, -0.162022f, 0.201648f, 0.364155f, 0.190360f, -0.129535f, -0.190990f, -0.181481f, -0.043755f, 0.174126f, 0.244561f, 0.162623f, -0.058397f, -0.185193f, -0.141005f, -0.109101f, 0.102198f, 0.200563f, - 0.162725f, 0.014693f, -0.127916f, -0.203493f, -0.100609f, 0.087777f, 0.230913f, 0.130797f, -0.041546f, -0.207563f, -0.184892f, -0.095109f, 0.080087f, 0.175837f, 0.130124f, -0.032520f, -0.089523f, -0.095566f, -0.024602f, -0.012643f, 0.067768f, 0.104563f, 0.065081f, -0.029704f, -0.095207f, -0.091501f, 0.004209f, 0.077510f, 0.045222f, 0.005480f, 0.003975f, -0.002531f}, - {-0.000861f, -0.002552f, -0.004148f, -0.005589f, -0.006822f, -0.007797f, -0.008477f, -0.008831f, -0.008842f, -0.008500f, -0.007811f, -0.006790f, -0.005462f, -0.003864f, -0.002039f, -0.000040f, 0.002076f, 0.004250f, 0.006419f, 0.008523f, 0.010502f, 0.012301f, 0.013872f, 0.015175f, 0.016176f, 0.016852f, 0.017190f, 0.017188f, 0.016852f, 0.016198f, 0.015252f, 0.014045f, 0.012617f, 0.011010f, 0.009271f, 0.007445f, 0.005582f, 0.003724f, 0.001914f, 0.000187f, -0.001425f, -0.002899f, -0.004218f, -0.005374f, -0.006365f, -0.007196f, -0.007880f, -0.008432f, -0.008875f, -0.009235f, -0.009536f, -0.009806f, -0.010070f, -0.010351f, -0.010670f, -0.011041f, -0.011472f, -0.011967f, -0.012523f, -0.013129f, -0.013770f, -0.014422f, -0.015059f, -0.015651f, -0.016162f, -0.016557f, -0.016802f, -0.016862f, -0.016705f, -0.016305f, -0.015639f, -0.014693f, -0.013459f, -0.011936f, -0.010133f, -0.008066f, -0.005760f, -0.003247f, -0.000565f, 0.002242f, 0.005124f, 0.008031f, 0.010909f, 0.013705f, 0.016369f, 0.018851f, 0.021109f, 0.023105f, 0.024807f, 0.026193f, 0.027249f, 0.027967f, 0.028350f, 0.028408f, 0.028160f, 0.027632f, - 0.026853f, 0.025862f, 0.024696f, 0.023399f, 0.022012f, 0.020579f, 0.019138f, 0.017726f, 0.016378f, 0.015120f, 0.013974f, 0.012957f, 0.012077f, 0.011339f, 0.010740f, 0.010271f, 0.009920f, 0.009670f, 0.009501f, 0.009391f, 0.009317f, 0.009256f, 0.009187f, 0.009090f, 0.008949f, 0.008749f, 0.008483f, 0.008144f, 0.007732f, 0.007250f, 0.006705f, 0.006108f, 0.005474f, 0.004817f, 0.004156f, 0.003507f, 0.002889f, 0.002319f, 0.001811f, 0.001378f, 0.001028f, 0.000769f, 0.000601f, 0.000524f, 0.000532f, 0.000617f, 0.000767f, 0.000968f, 0.001205f, 0.001459f, 0.001714f, 0.001952f, 0.002157f, 0.002315f, 0.002413f, 0.002443f, 0.002398f, 0.002277f, 0.002080f, 0.001812f, 0.001480f, 0.001097f, 0.000674f, 0.000228f, -0.019411f, -0.009812f, 0.026151f, 0.032640f, 0.020738f, 0.035733f, 0.058682f, 0.090327f, 0.110120f, -0.151989f, -0.205551f, -0.056037f, 0.010353f, -0.053360f, -0.023881f, 0.011277f, -0.037123f, -0.092957f, -0.001328f, -0.048049f, 0.016966f, 0.058148f, -0.034997f, 0.009466f, -0.096773f, -0.024594f, -0.050246f, 0.073998f, 0.105668f, -0.008860f, -0.019794f, -0.022894f, - 0.052707f, 0.018010f, -0.016656f, -0.026045f, -0.052147f, -0.060366f, 0.066466f, 0.033060f, 0.017809f, -0.049546f, -0.059084f, -0.019277f, 0.068450f, 0.116077f, 0.069810f, -0.024554f, 0.010201f, -0.065496f, -0.096188f, -0.065856f, 0.056979f, 0.076188f, 0.047224f, -0.045117f, -0.097213f, -0.133600f, 0.019070f, 0.010924f, 0.154412f, 0.092075f, -0.092172f, -0.171862f, -0.046988f, -0.161369f, -0.056767f, 0.125307f, 0.091028f, 0.075354f, -0.082227f, -0.113654f, -0.058354f, 0.143590f, 0.259374f, 0.171666f, 0.132084f, 0.063050f, -0.179825f, -0.214131f, 0.004485f, 0.168746f, 0.138735f, 0.117269f, 0.208188f, -0.116421f, -0.232751f, -0.215983f, -0.077830f, 0.090856f, 0.200054f, 0.127017f, -0.080435f, -0.210455f, -0.194556f, -0.068536f, 0.104517f, 0.158299f, -0.038053f, -0.144177f, -0.160016f, -0.024600f, 0.130868f, 0.220678f, 0.062299f, -0.117071f, -0.256720f, -0.134429f, 0.052569f, 0.333617f, 0.343628f, 0.162022f, -0.201648f, -0.364155f, -0.190360f, 0.129535f, 0.190990f, 0.181481f, 0.043755f, -0.174126f, -0.244561f, -0.162623f, 0.058397f, 0.185193f, 0.141005f, 0.109101f, -0.102198f, -0.200563f, - -0.162725f, -0.014693f, 0.127916f, 0.203493f, 0.100609f, -0.087777f, -0.230913f, -0.130797f, 0.041546f, 0.207563f, 0.184892f, 0.095109f, -0.080087f, -0.175837f, -0.130124f, 0.032520f, 0.089523f, 0.095566f, 0.024602f, 0.012643f, -0.067768f, -0.104563f, -0.065081f, 0.029704f, 0.095207f, 0.091501f, -0.004209f, -0.077510f, -0.045222f, -0.005480f, -0.003975f, 0.002531f} - }, - { - {0.002884f, 0.008570f, 0.014011f, 0.019055f, 0.023559f, 0.027402f, 0.030483f, 0.032723f, 0.034076f, 0.034520f, 0.034065f, 0.032748f, 0.030633f, 0.027810f, 0.024389f, 0.020498f, 0.016277f, 0.011875f, 0.007442f, 0.003127f, -0.000930f, -0.004601f, -0.007775f, -0.010361f, -0.012290f, -0.013521f, -0.014037f, -0.013848f, -0.012990f, -0.011521f, -0.009524f, -0.007097f, -0.004352f, -0.001413f, 0.001592f, 0.004536f, 0.007293f, 0.009749f, 0.011801f, 0.013365f, 0.014373f, 0.014782f, 0.014571f, 0.013741f, 0.012318f, 0.010350f, 0.007906f, 0.005069f, 0.001940f, -0.001373f, -0.004754f, -0.008086f, -0.011254f, -0.014150f, -0.016677f, -0.018753f, -0.020310f, -0.021302f, -0.021702f, -0.021505f, -0.020727f, -0.019406f, -0.017597f, -0.015372f, -0.012816f, -0.010026f, -0.007106f, -0.004159f, -0.001292f, 0.001396f, 0.003814f, 0.005882f, 0.007534f, 0.008722f, 0.009416f, 0.009603f, 0.009290f, 0.008502f, 0.007282f, 0.005686f, 0.003785f, 0.001659f, -0.000607f, -0.002923f, -0.005200f, -0.007353f, -0.009303f, -0.010981f, -0.012332f, -0.013311f, -0.013892f, -0.014064f, -0.013831f, -0.013215f, -0.012252f, -0.010988f, - -0.009484f, -0.007806f, -0.006027f, -0.004222f, -0.002464f, -0.000825f, 0.000631f, 0.001849f, 0.002785f, 0.003405f, 0.003693f, 0.003643f, 0.003265f, 0.002583f, 0.001633f, 0.000460f, -0.000880f, -0.002326f, -0.003811f, -0.005270f, -0.006636f, -0.007849f, -0.008855f, -0.009608f, -0.010071f, -0.010222f, -0.010049f, -0.009554f, -0.008750f, -0.007665f, -0.006335f, -0.004806f, -0.003133f, -0.001372f, 0.000414f, 0.002164f, 0.003820f, 0.005325f, 0.006633f, 0.007703f, 0.008506f, 0.009022f, 0.009245f, 0.009177f, 0.008834f, 0.008242f, 0.007434f, 0.006452f, 0.005344f, 0.004160f, 0.002952f, 0.001771f, 0.000666f, -0.000321f, -0.001155f, -0.001806f, -0.002258f, -0.002501f, -0.002538f, -0.002380f, -0.002048f, -0.001572f, -0.000988f, -0.000337f, -0.026889f, 0.028099f, -0.009768f, -0.002524f, -0.023835f, 0.000490f, -0.157780f, -0.110259f, 0.027223f, 0.109942f, 0.103470f, 0.066165f, 0.025224f, 0.214648f, 0.081330f, -0.059959f, -0.118736f, -0.065186f, 0.070648f, 0.042514f, -0.016296f, -0.096606f, -0.042653f, -0.080307f, 0.003010f, 0.011074f, 0.035949f, 0.045728f, 0.050427f, -0.004399f, -0.066235f, -0.127373f, - -0.087482f, 0.084423f, 0.135908f, 0.074507f, -0.000454f, -0.052359f, -0.121824f, 0.055859f, 0.015029f, -0.181052f, -0.024857f, -0.048949f, 0.133705f, 0.141373f, 0.114178f, -0.149183f, -0.248358f, -0.253884f, 0.008334f, 0.218703f, 0.423573f, 0.171390f, -0.002672f, -0.365342f, -0.392351f, -0.247599f, 0.182369f, 0.155726f, 0.286528f, 0.123664f, -0.155661f, -0.192848f, -0.008898f, -0.150165f, -0.114626f, -0.020812f, -0.066192f, -0.060841f, -0.072571f, 0.061626f, 0.152827f, 0.168440f, 0.032683f, -0.100871f, -0.252947f, -0.229892f, 0.016842f, 0.347712f, 0.274786f, 0.085698f, -0.245119f, -0.094849f, -0.044493f, 0.131234f, 0.089811f, -0.056813f, -0.201518f, -0.145359f, 0.042291f, 0.234702f, 0.241292f, 0.024524f, -0.281017f, -0.308090f, -0.222045f, 0.163288f, 0.331563f, 0.211175f, -0.035887f, -0.258029f, -0.249274f, -0.028308f, 0.261113f, 0.345509f, 0.213605f, -0.074724f, -0.258686f, -0.257060f, -0.118453f, 0.083639f, 0.218506f, 0.156818f, -0.028084f, -0.200464f, -0.090533f, 0.019360f, 0.085401f, 0.116327f, 0.069003f, -0.017370f, -0.012965f, -0.023087f, -0.021796f, 0.014991f, 0.028101f, 0.057813f, - 0.075705f, 0.112571f, -0.004005f, -0.112876f, -0.161603f, -0.056295f, 0.102665f, 0.279171f, 0.240931f, 0.007528f, -0.250775f, -0.298360f, -0.185196f, 0.096465f, 0.276045f, 0.268710f, 0.070561f, -0.159979f, -0.294447f, -0.124619f, 0.146034f, 0.261495f, 0.159653f, -0.005708f, -0.184892f, -0.154563f, -0.041142f, 0.064629f, 0.040595f, 0.027037f, -0.007256f, 0.008844f}, - {-0.002884f, -0.008570f, -0.014011f, -0.019055f, -0.023559f, -0.027402f, -0.030483f, -0.032723f, -0.034076f, -0.034520f, -0.034065f, -0.032748f, -0.030633f, -0.027810f, -0.024389f, -0.020498f, -0.016277f, -0.011875f, -0.007442f, -0.003127f, 0.000930f, 0.004601f, 0.007775f, 0.010361f, 0.012290f, 0.013521f, 0.014037f, 0.013848f, 0.012990f, 0.011521f, 0.009524f, 0.007097f, 0.004352f, 0.001413f, -0.001592f, -0.004536f, -0.007293f, -0.009749f, -0.011801f, -0.013365f, -0.014373f, -0.014782f, -0.014571f, -0.013741f, -0.012318f, -0.010350f, -0.007906f, -0.005069f, -0.001940f, 0.001373f, 0.004754f, 0.008086f, 0.011254f, 0.014150f, 0.016677f, 0.018753f, 0.020310f, 0.021302f, 0.021702f, 0.021505f, 0.020727f, 0.019406f, 0.017597f, 0.015372f, 0.012816f, 0.010026f, 0.007106f, 0.004159f, 0.001292f, -0.001396f, -0.003814f, -0.005882f, -0.007534f, -0.008722f, -0.009416f, -0.009603f, -0.009290f, -0.008502f, -0.007282f, -0.005686f, -0.003785f, -0.001659f, 0.000607f, 0.002923f, 0.005200f, 0.007353f, 0.009303f, 0.010981f, 0.012332f, 0.013311f, 0.013892f, 0.014064f, 0.013831f, 0.013215f, 0.012252f, 0.010988f, - 0.009484f, 0.007806f, 0.006027f, 0.004222f, 0.002464f, 0.000825f, -0.000631f, -0.001849f, -0.002785f, -0.003405f, -0.003693f, -0.003643f, -0.003265f, -0.002583f, -0.001633f, -0.000460f, 0.000880f, 0.002326f, 0.003811f, 0.005270f, 0.006636f, 0.007849f, 0.008855f, 0.009608f, 0.010071f, 0.010222f, 0.010049f, 0.009554f, 0.008750f, 0.007665f, 0.006335f, 0.004806f, 0.003133f, 0.001372f, -0.000414f, -0.002164f, -0.003820f, -0.005325f, -0.006633f, -0.007703f, -0.008506f, -0.009022f, -0.009245f, -0.009177f, -0.008834f, -0.008242f, -0.007434f, -0.006452f, -0.005344f, -0.004160f, -0.002952f, -0.001771f, -0.000666f, 0.000321f, 0.001155f, 0.001806f, 0.002258f, 0.002501f, 0.002538f, 0.002380f, 0.002048f, 0.001572f, 0.000988f, 0.000337f, 0.026889f, -0.028099f, 0.009768f, 0.002524f, 0.023835f, -0.000490f, 0.157780f, 0.110259f, -0.027223f, -0.109942f, -0.103470f, -0.066165f, -0.025224f, -0.214648f, -0.081330f, 0.059959f, 0.118736f, 0.065186f, -0.070648f, -0.042514f, 0.016296f, 0.096606f, 0.042653f, 0.080307f, -0.003010f, -0.011074f, -0.035949f, -0.045728f, -0.050427f, 0.004399f, 0.066235f, 0.127373f, - 0.087482f, -0.084423f, -0.135908f, -0.074507f, 0.000454f, 0.052359f, 0.121824f, -0.055859f, -0.015029f, 0.181052f, 0.024857f, 0.048949f, -0.133705f, -0.141373f, -0.114178f, 0.149183f, 0.248358f, 0.253884f, -0.008334f, -0.218703f, -0.423573f, -0.171390f, 0.002672f, 0.365342f, 0.392351f, 0.247599f, -0.182369f, -0.155726f, -0.286528f, -0.123664f, 0.155661f, 0.192848f, 0.008898f, 0.150165f, 0.114626f, 0.020812f, 0.066192f, 0.060841f, 0.072571f, -0.061626f, -0.152827f, -0.168440f, -0.032683f, 0.100871f, 0.252947f, 0.229892f, -0.016842f, -0.347712f, -0.274786f, -0.085698f, 0.245119f, 0.094849f, 0.044493f, -0.131234f, -0.089811f, 0.056813f, 0.201518f, 0.145359f, -0.042291f, -0.234702f, -0.241292f, -0.024524f, 0.281017f, 0.308090f, 0.222045f, -0.163288f, -0.331563f, -0.211175f, 0.035887f, 0.258029f, 0.249274f, 0.028308f, -0.261113f, -0.345509f, -0.213605f, 0.074724f, 0.258686f, 0.257060f, 0.118453f, -0.083639f, -0.218506f, -0.156818f, 0.028084f, 0.200464f, 0.090533f, -0.019360f, -0.085401f, -0.116327f, -0.069003f, 0.017370f, 0.012965f, 0.023087f, 0.021796f, -0.014991f, -0.028101f, -0.057813f, - -0.075705f, -0.112571f, 0.004005f, 0.112876f, 0.161603f, 0.056295f, -0.102665f, -0.279171f, -0.240931f, -0.007528f, 0.250775f, 0.298360f, 0.185196f, -0.096465f, -0.276045f, -0.268710f, -0.070561f, 0.159979f, 0.294447f, 0.124619f, -0.146034f, -0.261495f, -0.159653f, 0.005708f, 0.184892f, 0.154563f, 0.041142f, -0.064629f, -0.040595f, -0.027037f, 0.007256f, -0.008844f} - }, - { - {0.001345f, 0.004002f, 0.006562f, 0.008966f, 0.011161f, 0.013102f, 0.014757f, 0.016105f, 0.017138f, 0.017863f, 0.018298f, 0.018475f, 0.018437f, 0.018234f, 0.017924f, 0.017569f, 0.017230f, 0.016967f, 0.016834f, 0.016878f, 0.017136f, 0.017629f, 0.018367f, 0.019343f, 0.020535f, 0.021905f, 0.023400f, 0.024955f, 0.026493f, 0.027930f, 0.029178f, 0.030145f, 0.030743f, 0.030890f, 0.030514f, 0.029556f, 0.027972f, 0.025739f, 0.022853f, 0.019332f, 0.015217f, 0.010571f, 0.005476f, 0.000035f, -0.005633f, -0.011399f, -0.017120f, -0.022653f, -0.027852f, -0.032578f, -0.036698f, -0.040096f, -0.042672f, -0.044346f, -0.045065f, -0.044800f, -0.043551f, -0.041344f, -0.038234f, -0.034302f, -0.029651f, -0.024407f, -0.018711f, -0.012717f, -0.006588f, -0.000489f, 0.005419f, 0.010980f, 0.016050f, 0.020504f, 0.024233f, 0.027155f, 0.029211f, 0.030371f, 0.030631f, 0.030014f, 0.028569f, 0.026369f, 0.023508f, 0.020095f, 0.016255f, 0.012120f, 0.007825f, 0.003507f, -0.000704f, -0.004688f, -0.008338f, -0.011562f, -0.014291f, -0.016474f, -0.018083f, -0.019114f, -0.019583f, -0.019528f, -0.019005f, -0.018085f, - -0.016852f, -0.015398f, -0.013821f, -0.012219f, -0.010685f, -0.009309f, -0.008167f, -0.007324f, -0.006827f, -0.006708f, -0.006979f, -0.007635f, -0.008650f, -0.009983f, -0.011579f, -0.013367f, -0.015270f, -0.017202f, -0.019073f, -0.020797f, -0.022290f, -0.023474f, -0.024284f, -0.024666f, -0.024583f, -0.024012f, -0.022950f, -0.021410f, -0.019422f, -0.017031f, -0.014298f, -0.011294f, -0.008100f, -0.004803f, -0.001491f, 0.001745f, 0.004821f, 0.007659f, 0.010188f, 0.012352f, 0.014108f, 0.015425f, 0.016291f, 0.016708f, 0.016693f, 0.016278f, 0.015506f, 0.014430f, 0.013112f, 0.011619f, 0.010018f, 0.008378f, 0.006763f, 0.005232f, 0.003834f, 0.002610f, 0.001587f, 0.000782f, 0.000198f, -0.000174f, -0.000355f, -0.000376f, -0.000276f, -0.000100f, -0.032205f, 0.011586f, -0.040186f, 0.014088f, -0.042313f, 0.046827f, 0.033764f, -0.096242f, -0.080467f, 0.016061f, -0.088406f, -0.089652f, 0.052045f, -0.107020f, -0.286973f, -0.113994f, 0.172515f, 0.215293f, 0.242145f, -0.144469f, 0.015859f, 0.186953f, 0.178302f, -0.033527f, -0.164463f, -0.116146f, -0.078606f, 0.060146f, 0.228290f, 0.176714f, 0.045216f, -0.148974f, - -0.167378f, -0.117306f, 0.037959f, 0.118187f, 0.172420f, 0.018415f, -0.059047f, -0.113543f, -0.094441f, 0.007358f, 0.140239f, 0.127385f, 0.029243f, -0.130445f, -0.151885f, -0.079534f, -0.031788f, 0.024268f, 0.119878f, 0.114851f, 0.152176f, 0.012880f, -0.082703f, -0.305814f, -0.232458f, -0.078515f, 0.217788f, 0.022424f, 0.137951f, 0.078344f, -0.108319f, -0.201225f, -0.074505f, -0.211080f, -0.240345f, 0.009746f, 0.084793f, 0.135413f, -0.004733f, -0.028726f, -0.046164f, 0.170722f, 0.010726f, 0.045193f, -0.337527f, -0.426429f, 0.027906f, 0.302670f, 0.248545f, 0.068898f, -0.181394f, -0.362390f, -0.595504f, -0.156258f, 0.325924f, 0.586403f, 0.346745f, -0.046848f, -0.393579f, -0.371270f, -0.161925f, 0.242804f, 0.350908f, 0.237995f, -0.002838f, -0.132692f, -0.054955f, 0.143286f, 0.144945f, -0.054418f, -0.134018f, -0.094813f, 0.040119f, 0.165650f, 0.156301f, 0.001921f, -0.121456f, -0.160572f, -0.054007f, 0.025824f, 0.115209f, 0.056750f, -0.218672f, -0.213128f, -0.032553f, 0.039900f, 0.073676f, 0.041634f, -0.038515f, -0.101947f, -0.036357f, 0.045300f, 0.032164f, 0.037874f, 0.012793f, 0.004136f, - -0.030288f, 0.050791f, 0.080366f, 0.013649f, -0.046289f, -0.091225f, -0.013940f, 0.085658f, 0.101820f, 0.072115f, -0.001188f, -0.091973f, -0.114852f, 0.005284f, 0.139027f, 0.155460f, 0.007874f, -0.164472f, -0.247952f, -0.149218f, 0.075276f, 0.269313f, 0.297946f, 0.099007f, -0.204590f, -0.365654f, -0.268602f, 0.045711f, 0.130835f, 0.071040f, 0.007248f, 0.006140f}, - {0.001345f, 0.004002f, 0.006562f, 0.008966f, 0.011161f, 0.013102f, 0.014757f, 0.016105f, 0.017138f, 0.017863f, 0.018298f, 0.018475f, 0.018437f, 0.018234f, 0.017924f, 0.017569f, 0.017230f, 0.016967f, 0.016834f, 0.016878f, 0.017136f, 0.017629f, 0.018367f, 0.019343f, 0.020535f, 0.021905f, 0.023400f, 0.024955f, 0.026493f, 0.027930f, 0.029178f, 0.030145f, 0.030743f, 0.030890f, 0.030514f, 0.029556f, 0.027972f, 0.025739f, 0.022853f, 0.019332f, 0.015217f, 0.010571f, 0.005476f, 0.000035f, -0.005633f, -0.011399f, -0.017120f, -0.022653f, -0.027852f, -0.032578f, -0.036698f, -0.040096f, -0.042672f, -0.044346f, -0.045065f, -0.044800f, -0.043551f, -0.041344f, -0.038234f, -0.034302f, -0.029651f, -0.024407f, -0.018711f, -0.012717f, -0.006588f, -0.000489f, 0.005419f, 0.010980f, 0.016050f, 0.020504f, 0.024233f, 0.027155f, 0.029211f, 0.030371f, 0.030631f, 0.030014f, 0.028569f, 0.026369f, 0.023508f, 0.020095f, 0.016255f, 0.012120f, 0.007825f, 0.003507f, -0.000704f, -0.004688f, -0.008338f, -0.011562f, -0.014291f, -0.016474f, -0.018083f, -0.019114f, -0.019583f, -0.019528f, -0.019005f, -0.018085f, - -0.016852f, -0.015398f, -0.013821f, -0.012219f, -0.010685f, -0.009309f, -0.008167f, -0.007324f, -0.006827f, -0.006708f, -0.006979f, -0.007635f, -0.008650f, -0.009983f, -0.011579f, -0.013367f, -0.015270f, -0.017202f, -0.019073f, -0.020797f, -0.022290f, -0.023474f, -0.024284f, -0.024666f, -0.024583f, -0.024012f, -0.022950f, -0.021410f, -0.019422f, -0.017031f, -0.014298f, -0.011294f, -0.008100f, -0.004803f, -0.001491f, 0.001745f, 0.004821f, 0.007659f, 0.010188f, 0.012352f, 0.014108f, 0.015425f, 0.016291f, 0.016708f, 0.016693f, 0.016278f, 0.015506f, 0.014430f, 0.013112f, 0.011619f, 0.010018f, 0.008378f, 0.006763f, 0.005232f, 0.003834f, 0.002610f, 0.001587f, 0.000782f, 0.000198f, -0.000174f, -0.000355f, -0.000376f, -0.000276f, -0.000100f, -0.032205f, 0.011586f, -0.040186f, 0.014088f, -0.042313f, 0.046827f, 0.033764f, -0.096242f, -0.080467f, 0.016061f, -0.088406f, -0.089652f, 0.052045f, -0.107020f, -0.286973f, -0.113994f, 0.172515f, 0.215293f, 0.242145f, -0.144469f, 0.015859f, 0.186953f, 0.178302f, -0.033527f, -0.164463f, -0.116146f, -0.078606f, 0.060146f, 0.228290f, 0.176714f, 0.045216f, -0.148974f, - -0.167378f, -0.117306f, 0.037959f, 0.118187f, 0.172420f, 0.018415f, -0.059047f, -0.113543f, -0.094441f, 0.007358f, 0.140239f, 0.127385f, 0.029243f, -0.130445f, -0.151885f, -0.079534f, -0.031788f, 0.024268f, 0.119878f, 0.114851f, 0.152176f, 0.012880f, -0.082703f, -0.305814f, -0.232458f, -0.078515f, 0.217788f, 0.022424f, 0.137951f, 0.078344f, -0.108319f, -0.201225f, -0.074505f, -0.211080f, -0.240345f, 0.009746f, 0.084793f, 0.135413f, -0.004733f, -0.028726f, -0.046164f, 0.170722f, 0.010726f, 0.045193f, -0.337527f, -0.426429f, 0.027906f, 0.302670f, 0.248545f, 0.068898f, -0.181394f, -0.362390f, -0.595504f, -0.156258f, 0.325924f, 0.586403f, 0.346745f, -0.046848f, -0.393579f, -0.371270f, -0.161925f, 0.242804f, 0.350908f, 0.237995f, -0.002838f, -0.132692f, -0.054955f, 0.143286f, 0.144945f, -0.054418f, -0.134018f, -0.094813f, 0.040119f, 0.165650f, 0.156301f, 0.001921f, -0.121456f, -0.160572f, -0.054007f, 0.025824f, 0.115209f, 0.056750f, -0.218672f, -0.213128f, -0.032553f, 0.039900f, 0.073676f, 0.041634f, -0.038515f, -0.101947f, -0.036357f, 0.045300f, 0.032164f, 0.037874f, 0.012793f, 0.004136f, - -0.030288f, 0.050791f, 0.080366f, 0.013649f, -0.046289f, -0.091225f, -0.013940f, 0.085658f, 0.101820f, 0.072115f, -0.001188f, -0.091973f, -0.114852f, 0.005284f, 0.139027f, 0.155460f, 0.007874f, -0.164472f, -0.247952f, -0.149218f, 0.075276f, 0.269313f, 0.297946f, 0.099007f, -0.204590f, -0.365654f, -0.268602f, 0.045711f, 0.130835f, 0.071040f, 0.007248f, 0.006140f} - }, - { - {0.000362f, 0.001073f, 0.001744f, 0.002349f, 0.002866f, 0.003277f, 0.003570f, 0.003738f, 0.003779f, 0.003698f, 0.003508f, 0.003226f, 0.002876f, 0.002485f, 0.002085f, 0.001710f, 0.001397f, 0.001181f, 0.001094f, 0.001169f, 0.001431f, 0.001901f, 0.002592f, 0.003510f, 0.004653f, 0.006007f, 0.007553f, 0.009260f, 0.011090f, 0.012998f, 0.014931f, 0.016831f, 0.018638f, 0.020289f, 0.021720f, 0.022871f, 0.023686f, 0.024113f, 0.024109f, 0.023641f, 0.022686f, 0.021232f, 0.019283f, 0.016852f, 0.013969f, 0.010675f, 0.007023f, 0.003079f, -0.001081f, -0.005376f, -0.009714f, -0.014004f, -0.018149f, -0.022056f, -0.025634f, -0.028799f, -0.031473f, -0.033592f, -0.035100f, -0.035957f, -0.036140f, -0.035639f, -0.034460f, -0.032629f, -0.030184f, -0.027179f, -0.023683f, -0.019776f, -0.015546f, -0.011091f, -0.006513f, -0.001916f, 0.002596f, 0.006922f, 0.010968f, 0.014648f, 0.017885f, 0.020617f, 0.022794f, 0.024383f, 0.025367f, 0.025744f, 0.025530f, 0.024755f, 0.023465f, 0.021719f, 0.019588f, 0.017150f, 0.014493f, 0.011706f, 0.008882f, 0.006113f, 0.003485f, 0.001081f, -0.001026f, -0.002775f, - -0.004115f, -0.005009f, -0.005435f, -0.005387f, -0.004872f, -0.003914f, -0.002548f, -0.000824f, 0.001197f, 0.003446f, 0.005846f, 0.008317f, 0.010775f, 0.013138f, 0.015324f, 0.017260f, 0.018878f, 0.020119f, 0.020938f, 0.021298f, 0.021179f, 0.020573f, 0.019487f, 0.017941f, 0.015968f, 0.013612f, 0.010929f, 0.007984f, 0.004847f, 0.001593f, -0.001699f, -0.004952f, -0.008089f, -0.011040f, -0.013738f, -0.016128f, -0.018162f, -0.019804f, -0.021028f, -0.021822f, -0.022185f, -0.022130f, -0.021678f, -0.020863f, -0.019726f, -0.018317f, -0.016691f, -0.014906f, -0.013022f, -0.011101f, -0.009198f, -0.007369f, -0.005660f, -0.004113f, -0.002759f, -0.001622f, -0.000713f, -0.000037f, 0.000414f, 0.000657f, 0.000717f, 0.000625f, 0.000421f, 0.000148f, 0.003153f, 0.039246f, 0.019417f, -0.023447f, -0.011964f, 0.066398f, 0.104926f, 0.012829f, -0.083265f, -0.197505f, -0.131572f, -0.043432f, 0.098608f, -0.095586f, -0.058691f, -0.025854f, 0.072826f, 0.132206f, 0.338317f, -0.030937f, -0.084397f, -0.074181f, -0.012587f, 0.012308f, 0.185180f, 0.096400f, 0.086420f, -0.056502f, -0.178421f, -0.099177f, -0.091937f, 0.057927f, - 0.078566f, 0.128628f, -0.012851f, -0.100419f, -0.153556f, -0.063418f, -0.033265f, 0.026325f, 0.070259f, 0.081971f, -0.004465f, -0.085805f, -0.077271f, -0.033981f, 0.034679f, 0.026259f, -0.092928f, -0.078258f, 0.019976f, 0.075629f, 0.042707f, 0.066090f, -0.011075f, -0.062597f, -0.010010f, -0.067249f, 0.046747f, -0.141062f, 0.104991f, 0.095284f, -0.096905f, -0.165815f, 0.025985f, -0.109232f, -0.092494f, 0.074759f, -0.033794f, -0.054673f, -0.157522f, -0.012924f, 0.193544f, 0.439641f, 0.197651f, -0.045368f, -0.274867f, -0.197032f, -0.026967f, 0.208389f, 0.300841f, 0.219146f, -0.073385f, -0.195584f, -0.082110f, 0.032274f, 0.033256f, 0.023490f, -0.035048f, -0.061489f, -0.119029f, -0.016601f, 0.100604f, 0.214575f, 0.161937f, 0.018756f, -0.165729f, -0.271331f, -0.194265f, 0.001101f, 0.245243f, 0.380123f, 0.173566f, -0.053007f, -0.339741f, -0.343594f, -0.166942f, 0.092259f, 0.197898f, 0.180599f, 0.052916f, 0.025386f, -0.109175f, 0.023439f, 0.101582f, 0.122370f, -0.126372f, -0.178005f, -0.054058f, 0.091751f, 0.129352f, 0.070559f, -0.006143f, -0.168099f, -0.175214f, -0.114156f, 0.078900f, 0.220900f, - 0.246636f, 0.056560f, -0.178328f, -0.354397f, -0.276709f, -0.020144f, 0.259144f, 0.436947f, 0.279027f, -0.061814f, -0.348580f, -0.383924f, -0.207627f, 0.122758f, 0.252189f, 0.198382f, 0.095538f, -0.034397f, -0.090844f, -0.114349f, -0.055317f, 0.035860f, 0.087028f, 0.089706f, 0.032524f, -0.067118f, -0.056800f, -0.060686f, -0.007022f, 0.013520f, -0.000301f, 0.004991f}, - {0.000362f, 0.001073f, 0.001744f, 0.002349f, 0.002866f, 0.003277f, 0.003570f, 0.003738f, 0.003779f, 0.003698f, 0.003508f, 0.003226f, 0.002876f, 0.002485f, 0.002085f, 0.001710f, 0.001397f, 0.001181f, 0.001094f, 0.001169f, 0.001431f, 0.001901f, 0.002592f, 0.003510f, 0.004653f, 0.006007f, 0.007553f, 0.009260f, 0.011090f, 0.012998f, 0.014931f, 0.016831f, 0.018638f, 0.020289f, 0.021720f, 0.022871f, 0.023686f, 0.024113f, 0.024109f, 0.023641f, 0.022686f, 0.021232f, 0.019283f, 0.016852f, 0.013969f, 0.010675f, 0.007023f, 0.003079f, -0.001081f, -0.005376f, -0.009714f, -0.014004f, -0.018149f, -0.022056f, -0.025634f, -0.028799f, -0.031473f, -0.033592f, -0.035100f, -0.035957f, -0.036140f, -0.035639f, -0.034460f, -0.032629f, -0.030184f, -0.027179f, -0.023683f, -0.019776f, -0.015546f, -0.011091f, -0.006513f, -0.001916f, 0.002596f, 0.006922f, 0.010968f, 0.014648f, 0.017885f, 0.020617f, 0.022794f, 0.024383f, 0.025367f, 0.025744f, 0.025530f, 0.024755f, 0.023465f, 0.021719f, 0.019588f, 0.017150f, 0.014493f, 0.011706f, 0.008882f, 0.006113f, 0.003485f, 0.001081f, -0.001026f, -0.002775f, - -0.004115f, -0.005009f, -0.005435f, -0.005387f, -0.004872f, -0.003914f, -0.002548f, -0.000824f, 0.001197f, 0.003446f, 0.005846f, 0.008317f, 0.010775f, 0.013138f, 0.015324f, 0.017260f, 0.018878f, 0.020119f, 0.020938f, 0.021298f, 0.021179f, 0.020573f, 0.019487f, 0.017941f, 0.015968f, 0.013612f, 0.010929f, 0.007984f, 0.004847f, 0.001593f, -0.001699f, -0.004952f, -0.008089f, -0.011040f, -0.013738f, -0.016128f, -0.018162f, -0.019804f, -0.021028f, -0.021822f, -0.022185f, -0.022130f, -0.021678f, -0.020863f, -0.019726f, -0.018317f, -0.016691f, -0.014906f, -0.013022f, -0.011101f, -0.009198f, -0.007369f, -0.005660f, -0.004113f, -0.002759f, -0.001622f, -0.000713f, -0.000037f, 0.000414f, 0.000657f, 0.000717f, 0.000625f, 0.000421f, 0.000148f, 0.003153f, 0.039246f, 0.019417f, -0.023447f, -0.011964f, 0.066398f, 0.104926f, 0.012829f, -0.083265f, -0.197505f, -0.131572f, -0.043432f, 0.098608f, -0.095586f, -0.058691f, -0.025854f, 0.072826f, 0.132206f, 0.338317f, -0.030937f, -0.084397f, -0.074181f, -0.012587f, 0.012308f, 0.185180f, 0.096400f, 0.086420f, -0.056502f, -0.178421f, -0.099177f, -0.091937f, 0.057927f, - 0.078566f, 0.128628f, -0.012851f, -0.100419f, -0.153556f, -0.063418f, -0.033265f, 0.026325f, 0.070259f, 0.081971f, -0.004465f, -0.085805f, -0.077271f, -0.033981f, 0.034679f, 0.026259f, -0.092928f, -0.078258f, 0.019976f, 0.075629f, 0.042707f, 0.066090f, -0.011075f, -0.062597f, -0.010010f, -0.067249f, 0.046747f, -0.141062f, 0.104991f, 0.095284f, -0.096905f, -0.165815f, 0.025985f, -0.109232f, -0.092494f, 0.074759f, -0.033794f, -0.054673f, -0.157522f, -0.012924f, 0.193544f, 0.439641f, 0.197651f, -0.045368f, -0.274867f, -0.197032f, -0.026967f, 0.208389f, 0.300841f, 0.219146f, -0.073385f, -0.195584f, -0.082110f, 0.032274f, 0.033256f, 0.023490f, -0.035048f, -0.061489f, -0.119029f, -0.016601f, 0.100604f, 0.214575f, 0.161937f, 0.018756f, -0.165729f, -0.271331f, -0.194265f, 0.001101f, 0.245243f, 0.380123f, 0.173566f, -0.053007f, -0.339741f, -0.343594f, -0.166942f, 0.092259f, 0.197898f, 0.180599f, 0.052916f, 0.025386f, -0.109175f, 0.023439f, 0.101582f, 0.122370f, -0.126372f, -0.178005f, -0.054058f, 0.091751f, 0.129352f, 0.070559f, -0.006143f, -0.168099f, -0.175214f, -0.114156f, 0.078900f, 0.220900f, - 0.246636f, 0.056560f, -0.178328f, -0.354397f, -0.276709f, -0.020144f, 0.259144f, 0.436947f, 0.279027f, -0.061814f, -0.348580f, -0.383924f, -0.207627f, 0.122758f, 0.252189f, 0.198382f, 0.095538f, -0.034397f, -0.090844f, -0.114349f, -0.055317f, 0.035860f, 0.087028f, 0.089706f, 0.032524f, -0.067118f, -0.056800f, -0.060686f, -0.007022f, 0.013520f, -0.000301f, 0.004991f} - }, - { - {-0.002437f, -0.007249f, -0.011878f, -0.016208f, -0.020132f, -0.023555f, -0.026396f, -0.028594f, -0.030103f, -0.030901f, -0.030982f, -0.030365f, -0.029084f, -0.027193f, -0.024763f, -0.021877f, -0.018627f, -0.015116f, -0.011448f, -0.007729f, -0.004061f, -0.000542f, 0.002741f, 0.005712f, 0.008307f, 0.010480f, 0.012198f, 0.013448f, 0.014232f, 0.014568f, 0.014488f, 0.014039f, 0.013276f, 0.012265f, 0.011077f, 0.009785f, 0.008463f, 0.007182f, 0.006009f, 0.005001f, 0.004208f, 0.003667f, 0.003405f, 0.003434f, 0.003755f, 0.004356f, 0.005213f, 0.006292f, 0.007550f, 0.008939f, 0.010403f, 0.011886f, 0.013333f, 0.014688f, 0.015902f, 0.016932f, 0.017741f, 0.018302f, 0.018600f, 0.018628f, 0.018389f, 0.017899f, 0.017180f, 0.016263f, 0.015189f, 0.013998f, 0.012738f, 0.011455f, 0.010197f, 0.009007f, 0.007923f, 0.006979f, 0.006200f, 0.005604f, 0.005199f, 0.004984f, 0.004949f, 0.005075f, 0.005338f, 0.005705f, 0.006139f, 0.006600f, 0.007047f, 0.007439f, 0.007738f, 0.007910f, 0.007927f, 0.007767f, 0.007417f, 0.006874f, 0.006142f, 0.005236f, 0.004179f, 0.003004f, 0.001749f, 0.000459f, - -0.000818f, -0.002032f, -0.003131f, -0.004065f, -0.004790f, -0.005264f, -0.005455f, -0.005338f, -0.004898f, -0.004130f, -0.003042f, -0.001649f, 0.000020f, 0.001928f, 0.004029f, 0.006271f, 0.008594f, 0.010936f, 0.013233f, 0.015422f, 0.017441f, 0.019234f, 0.020751f, 0.021948f, 0.022792f, 0.023260f, 0.023339f, 0.023028f, 0.022334f, 0.021278f, 0.019890f, 0.018206f, 0.016271f, 0.014137f, 0.011857f, 0.009488f, 0.007087f, 0.004707f, 0.002402f, 0.000219f, -0.001802f, -0.003625f, -0.005223f, -0.006579f, -0.007681f, -0.008525f, -0.009118f, -0.009470f, -0.009597f, -0.009522f, -0.009269f, -0.008865f, -0.008338f, -0.007716f, -0.007025f, -0.006287f, -0.005524f, -0.004752f, -0.003983f, -0.003226f, -0.002485f, -0.001761f, -0.001050f, -0.000349f, 0.000798f, -0.022608f, 0.029290f, 0.010754f, 0.033745f, -0.056416f, 0.012564f, -0.025145f, -0.039111f, 0.009475f, 0.087132f, 0.034345f, 0.050271f, 0.055360f, 0.033369f, 0.029722f, 0.043641f, 0.147217f, 0.145766f, -0.095509f, -0.073279f, 0.078979f, 0.072582f, 0.059506f, -0.050192f, -0.013124f, -0.063172f, -0.060244f, -0.020264f, 0.048458f, 0.087877f, -0.022581f, - -0.078489f, -0.024945f, 0.048310f, 0.079037f, 0.078327f, 0.003655f, -0.050125f, -0.032420f, 0.019079f, 0.040126f, 0.023291f, 0.013937f, -0.072645f, -0.044753f, -0.050742f, -0.023459f, -0.052839f, 0.011511f, 0.054459f, 0.080019f, -0.061848f, -0.033169f, -0.111716f, 0.006452f, 0.040085f, 0.117089f, -0.002984f, 0.075402f, -0.102498f, -0.083120f, 0.005264f, 0.122676f, 0.052329f, 0.150099f, 0.096037f, -0.032499f, -0.105663f, -0.099683f, -0.053576f, 0.040849f, 0.085621f, -0.012670f, -0.024627f, -0.075403f, -0.149701f, -0.147335f, 0.040066f, 0.235083f, 0.257166f, 0.129050f, -0.118997f, -0.271508f, -0.194114f, -0.009602f, 0.209841f, 0.210054f, 0.126052f, -0.121489f, -0.184259f, -0.252540f, -0.122876f, 0.170446f, 0.241755f, 0.138102f, -0.083143f, -0.205561f, -0.113596f, 0.046416f, 0.139492f, 0.115677f, -0.043339f, -0.167817f, -0.124128f, 0.048838f, 0.212727f, 0.241182f, 0.025151f, -0.224988f, -0.262230f, -0.025929f, 0.184648f, 0.355649f, 0.338647f, -0.091475f, -0.359634f, -0.270936f, 0.035513f, 0.312107f, 0.338017f, 0.167326f, -0.083554f, -0.320453f, -0.251326f, -0.066371f, 0.201620f, 0.262253f, - 0.181611f, -0.085509f, -0.219784f, -0.194721f, -0.002556f, 0.163824f, 0.200978f, 0.010282f, -0.156332f, -0.163656f, -0.041784f, 0.137059f, 0.177173f, -0.017919f, -0.159069f, -0.205658f, -0.078000f, 0.099218f, 0.263550f, 0.161633f, -0.058418f, -0.232437f, -0.217229f, -0.074059f, 0.127299f, 0.238100f, 0.208174f, 0.001426f, -0.078885f, -0.054832f, -0.003657f, -0.006916f}, - {-0.002437f, -0.007249f, -0.011878f, -0.016208f, -0.020132f, -0.023555f, -0.026396f, -0.028594f, -0.030103f, -0.030901f, -0.030982f, -0.030365f, -0.029084f, -0.027193f, -0.024763f, -0.021877f, -0.018627f, -0.015116f, -0.011448f, -0.007729f, -0.004061f, -0.000542f, 0.002741f, 0.005712f, 0.008307f, 0.010480f, 0.012198f, 0.013448f, 0.014232f, 0.014568f, 0.014488f, 0.014039f, 0.013276f, 0.012265f, 0.011077f, 0.009785f, 0.008463f, 0.007182f, 0.006009f, 0.005001f, 0.004208f, 0.003667f, 0.003405f, 0.003434f, 0.003755f, 0.004356f, 0.005213f, 0.006292f, 0.007550f, 0.008939f, 0.010403f, 0.011886f, 0.013333f, 0.014688f, 0.015902f, 0.016932f, 0.017741f, 0.018302f, 0.018600f, 0.018628f, 0.018389f, 0.017899f, 0.017180f, 0.016263f, 0.015189f, 0.013998f, 0.012738f, 0.011455f, 0.010197f, 0.009007f, 0.007923f, 0.006979f, 0.006200f, 0.005604f, 0.005199f, 0.004984f, 0.004949f, 0.005075f, 0.005338f, 0.005705f, 0.006139f, 0.006600f, 0.007047f, 0.007439f, 0.007738f, 0.007910f, 0.007927f, 0.007767f, 0.007417f, 0.006874f, 0.006142f, 0.005236f, 0.004179f, 0.003004f, 0.001749f, 0.000459f, - -0.000818f, -0.002032f, -0.003131f, -0.004065f, -0.004790f, -0.005264f, -0.005455f, -0.005338f, -0.004898f, -0.004130f, -0.003042f, -0.001649f, 0.000020f, 0.001928f, 0.004029f, 0.006271f, 0.008594f, 0.010936f, 0.013233f, 0.015422f, 0.017441f, 0.019234f, 0.020751f, 0.021948f, 0.022792f, 0.023260f, 0.023339f, 0.023028f, 0.022334f, 0.021278f, 0.019890f, 0.018206f, 0.016271f, 0.014137f, 0.011857f, 0.009488f, 0.007087f, 0.004707f, 0.002402f, 0.000219f, -0.001802f, -0.003625f, -0.005223f, -0.006579f, -0.007681f, -0.008525f, -0.009118f, -0.009470f, -0.009597f, -0.009522f, -0.009269f, -0.008865f, -0.008338f, -0.007716f, -0.007025f, -0.006287f, -0.005524f, -0.004752f, -0.003983f, -0.003226f, -0.002485f, -0.001761f, -0.001050f, -0.000349f, 0.000798f, -0.022608f, 0.029290f, 0.010754f, 0.033745f, -0.056416f, 0.012564f, -0.025145f, -0.039111f, 0.009475f, 0.087132f, 0.034345f, 0.050271f, 0.055360f, 0.033369f, 0.029722f, 0.043641f, 0.147217f, 0.145766f, -0.095509f, -0.073279f, 0.078979f, 0.072582f, 0.059506f, -0.050192f, -0.013124f, -0.063172f, -0.060244f, -0.020264f, 0.048458f, 0.087877f, -0.022581f, - -0.078489f, -0.024945f, 0.048310f, 0.079037f, 0.078327f, 0.003655f, -0.050125f, -0.032420f, 0.019079f, 0.040126f, 0.023291f, 0.013937f, -0.072645f, -0.044753f, -0.050742f, -0.023459f, -0.052839f, 0.011511f, 0.054459f, 0.080019f, -0.061848f, -0.033169f, -0.111716f, 0.006452f, 0.040085f, 0.117089f, -0.002984f, 0.075402f, -0.102498f, -0.083120f, 0.005264f, 0.122676f, 0.052329f, 0.150099f, 0.096037f, -0.032499f, -0.105663f, -0.099683f, -0.053576f, 0.040849f, 0.085621f, -0.012670f, -0.024627f, -0.075403f, -0.149701f, -0.147335f, 0.040066f, 0.235083f, 0.257166f, 0.129050f, -0.118997f, -0.271508f, -0.194114f, -0.009602f, 0.209841f, 0.210054f, 0.126052f, -0.121489f, -0.184259f, -0.252540f, -0.122876f, 0.170446f, 0.241755f, 0.138102f, -0.083143f, -0.205561f, -0.113596f, 0.046416f, 0.139492f, 0.115677f, -0.043339f, -0.167817f, -0.124128f, 0.048838f, 0.212727f, 0.241182f, 0.025151f, -0.224988f, -0.262230f, -0.025929f, 0.184648f, 0.355649f, 0.338647f, -0.091475f, -0.359634f, -0.270936f, 0.035513f, 0.312107f, 0.338017f, 0.167326f, -0.083554f, -0.320453f, -0.251326f, -0.066371f, 0.201620f, 0.262253f, - 0.181611f, -0.085509f, -0.219784f, -0.194721f, -0.002556f, 0.163824f, 0.200978f, 0.010282f, -0.156332f, -0.163656f, -0.041784f, 0.137059f, 0.177173f, -0.017919f, -0.159069f, -0.205658f, -0.078000f, 0.099218f, 0.263550f, 0.161633f, -0.058418f, -0.232437f, -0.217229f, -0.074059f, 0.127299f, 0.238100f, 0.208174f, 0.001426f, -0.078885f, -0.054832f, -0.003657f, -0.006916f} - }, - { - {-0.000655f, -0.001951f, -0.003209f, -0.004401f, -0.005506f, -0.006501f, -0.007370f, -0.008098f, -0.008674f, -0.009092f, -0.009349f, -0.009447f, -0.009392f, -0.009192f, -0.008861f, -0.008413f, -0.007867f, -0.007241f, -0.006556f, -0.005831f, -0.005086f, -0.004340f, -0.003609f, -0.002907f, -0.002246f, -0.001635f, -0.001078f, -0.000576f, -0.000128f, 0.000272f, 0.000631f, 0.000961f, 0.001275f, 0.001587f, 0.001912f, 0.002266f, 0.002663f, 0.003117f, 0.003641f, 0.004243f, 0.004929f, 0.005702f, 0.006561f, 0.007500f, 0.008510f, 0.009577f, 0.010685f, 0.011813f, 0.012936f, 0.014030f, 0.015066f, 0.016015f, 0.016850f, 0.017543f, 0.018067f, 0.018399f, 0.018519f, 0.018410f, 0.018062f, 0.017467f, 0.016625f, 0.015540f, 0.014224f, 0.012691f, 0.010964f, 0.009068f, 0.007035f, 0.004897f, 0.002693f, 0.000460f, -0.001761f, -0.003932f, -0.006014f, -0.007971f, -0.009770f, -0.011382f, -0.012783f, -0.013952f, -0.014877f, -0.015550f, -0.015970f, -0.016141f, -0.016074f, -0.015786f, -0.015296f, -0.014631f, -0.013819f, -0.012893f, -0.011885f, -0.010830f, -0.009761f, -0.008710f, -0.007708f, -0.006783f, -0.005956f, -0.005247f, - -0.004670f, -0.004234f, -0.003942f, -0.003791f, -0.003774f, -0.003880f, -0.004090f, -0.004385f, -0.004740f, -0.005131f, -0.005529f, -0.005908f, -0.006240f, -0.006500f, -0.006665f, -0.006715f, -0.006634f, -0.006411f, -0.006038f, -0.005514f, -0.004844f, -0.004035f, -0.003103f, -0.002066f, -0.000946f, 0.000230f, 0.001433f, 0.002634f, 0.003800f, 0.004900f, 0.005904f, 0.006784f, 0.007514f, 0.008074f, 0.008446f, 0.008617f, 0.008582f, 0.008340f, 0.007894f, 0.007257f, 0.006443f, 0.005474f, 0.004377f, 0.003179f, 0.001914f, 0.000616f, -0.000680f, -0.001937f, -0.003122f, -0.004202f, -0.005146f, -0.005929f, -0.006530f, -0.006932f, -0.007125f, -0.007104f, -0.006870f, -0.006432f, -0.005803f, -0.005002f, -0.004053f, -0.002984f, -0.001826f, -0.000615f, 0.005093f, -0.003646f, -0.000283f, -0.012014f, 0.033903f, 0.010066f, -0.043003f, 0.017081f, 0.005267f, 0.036821f, 0.008218f, -0.072431f, -0.028385f, -0.045756f, -0.098015f, 0.018919f, 0.099508f, 0.089873f, 0.087904f, -0.043867f, 0.009214f, 0.077701f, 0.086341f, 0.052898f, -0.020283f, -0.049260f, -0.021028f, -0.073031f, -0.066609f, -0.060330f, 0.034773f, 0.126218f, - 0.009288f, 0.017068f, 0.007110f, -0.048477f, -0.072624f, 0.044341f, 0.081520f, 0.108391f, 0.076852f, 0.023860f, -0.048001f, -0.063067f, -0.036730f, 0.005377f, 0.028787f, 0.039442f, -0.031959f, -0.036245f, -0.032095f, -0.022097f, -0.032694f, 0.143925f, 0.004623f, 0.061316f, -0.000865f, -0.056275f, -0.151972f, 0.084433f, 0.015088f, 0.049121f, 0.081787f, -0.027886f, -0.078970f, -0.106931f, 0.041302f, 0.078896f, 0.055445f, 0.005969f, -0.048255f, -0.041803f, -0.088581f, -0.097071f, 0.016601f, 0.098597f, 0.051414f, -0.118811f, -0.102804f, -0.048753f, -0.056937f, 0.010149f, 0.073083f, 0.041621f, -0.102317f, -0.124038f, -0.011932f, 0.202729f, 0.301995f, 0.162765f, -0.069694f, -0.219647f, -0.225042f, -0.052172f, 0.157848f, 0.184314f, 0.053627f, -0.060592f, -0.088058f, -0.033560f, 0.025667f, 0.049639f, 0.022726f, 0.020269f, -0.062520f, -0.075378f, -0.031814f, 0.014830f, 0.112040f, 0.131902f, 0.143188f, -0.015498f, -0.156012f, -0.189801f, 0.059376f, 0.034389f, 0.093034f, 0.127071f, 0.072857f, -0.005818f, -0.148545f, -0.039841f, 0.063216f, 0.100603f, 0.158258f, 0.015227f, -0.074849f, -0.120711f, - -0.125667f, -0.104225f, 0.072503f, 0.194413f, 0.257993f, 0.084344f, -0.131001f, -0.335068f, -0.219043f, 0.003901f, 0.213622f, 0.251721f, 0.141389f, -0.119509f, -0.252400f, -0.239874f, -0.021656f, 0.182933f, 0.283543f, 0.086681f, -0.201864f, -0.256839f, -0.176503f, 0.010550f, 0.207102f, 0.221211f, 0.088061f, -0.058597f, -0.064795f, -0.023744f, -0.001035f, -0.002587f}, - {-0.000655f, -0.001951f, -0.003209f, -0.004401f, -0.005506f, -0.006501f, -0.007370f, -0.008098f, -0.008674f, -0.009092f, -0.009349f, -0.009447f, -0.009392f, -0.009192f, -0.008861f, -0.008413f, -0.007867f, -0.007241f, -0.006556f, -0.005831f, -0.005086f, -0.004340f, -0.003609f, -0.002907f, -0.002246f, -0.001635f, -0.001078f, -0.000576f, -0.000128f, 0.000272f, 0.000631f, 0.000961f, 0.001275f, 0.001587f, 0.001912f, 0.002266f, 0.002663f, 0.003117f, 0.003641f, 0.004243f, 0.004929f, 0.005702f, 0.006561f, 0.007500f, 0.008510f, 0.009577f, 0.010685f, 0.011813f, 0.012936f, 0.014030f, 0.015066f, 0.016015f, 0.016850f, 0.017543f, 0.018067f, 0.018399f, 0.018519f, 0.018410f, 0.018062f, 0.017467f, 0.016625f, 0.015540f, 0.014224f, 0.012691f, 0.010964f, 0.009068f, 0.007035f, 0.004897f, 0.002693f, 0.000460f, -0.001761f, -0.003932f, -0.006014f, -0.007971f, -0.009770f, -0.011382f, -0.012783f, -0.013952f, -0.014877f, -0.015550f, -0.015970f, -0.016141f, -0.016074f, -0.015786f, -0.015296f, -0.014631f, -0.013819f, -0.012893f, -0.011885f, -0.010830f, -0.009761f, -0.008710f, -0.007708f, -0.006783f, -0.005956f, -0.005247f, - -0.004670f, -0.004234f, -0.003942f, -0.003791f, -0.003774f, -0.003880f, -0.004090f, -0.004385f, -0.004740f, -0.005131f, -0.005529f, -0.005908f, -0.006240f, -0.006500f, -0.006665f, -0.006715f, -0.006634f, -0.006411f, -0.006038f, -0.005514f, -0.004844f, -0.004035f, -0.003103f, -0.002066f, -0.000946f, 0.000230f, 0.001433f, 0.002634f, 0.003800f, 0.004900f, 0.005904f, 0.006784f, 0.007514f, 0.008074f, 0.008446f, 0.008617f, 0.008582f, 0.008340f, 0.007894f, 0.007257f, 0.006443f, 0.005474f, 0.004377f, 0.003179f, 0.001914f, 0.000616f, -0.000680f, -0.001937f, -0.003122f, -0.004202f, -0.005146f, -0.005929f, -0.006530f, -0.006932f, -0.007125f, -0.007104f, -0.006870f, -0.006432f, -0.005803f, -0.005002f, -0.004053f, -0.002984f, -0.001826f, -0.000615f, 0.005093f, -0.003646f, -0.000283f, -0.012014f, 0.033903f, 0.010066f, -0.043003f, 0.017081f, 0.005267f, 0.036821f, 0.008218f, -0.072431f, -0.028385f, -0.045756f, -0.098015f, 0.018919f, 0.099508f, 0.089873f, 0.087904f, -0.043867f, 0.009214f, 0.077701f, 0.086341f, 0.052898f, -0.020283f, -0.049260f, -0.021028f, -0.073031f, -0.066609f, -0.060330f, 0.034773f, 0.126218f, - 0.009288f, 0.017068f, 0.007110f, -0.048477f, -0.072624f, 0.044341f, 0.081520f, 0.108391f, 0.076852f, 0.023860f, -0.048001f, -0.063067f, -0.036730f, 0.005377f, 0.028787f, 0.039442f, -0.031959f, -0.036245f, -0.032095f, -0.022097f, -0.032694f, 0.143925f, 0.004623f, 0.061316f, -0.000865f, -0.056275f, -0.151972f, 0.084433f, 0.015088f, 0.049121f, 0.081787f, -0.027886f, -0.078970f, -0.106931f, 0.041302f, 0.078896f, 0.055445f, 0.005969f, -0.048255f, -0.041803f, -0.088581f, -0.097071f, 0.016601f, 0.098597f, 0.051414f, -0.118811f, -0.102804f, -0.048753f, -0.056937f, 0.010149f, 0.073083f, 0.041621f, -0.102317f, -0.124038f, -0.011932f, 0.202729f, 0.301995f, 0.162765f, -0.069694f, -0.219647f, -0.225042f, -0.052172f, 0.157848f, 0.184314f, 0.053627f, -0.060592f, -0.088058f, -0.033560f, 0.025667f, 0.049639f, 0.022726f, 0.020269f, -0.062520f, -0.075378f, -0.031814f, 0.014830f, 0.112040f, 0.131902f, 0.143188f, -0.015498f, -0.156012f, -0.189801f, 0.059376f, 0.034389f, 0.093034f, 0.127071f, 0.072857f, -0.005818f, -0.148545f, -0.039841f, 0.063216f, 0.100603f, 0.158258f, 0.015227f, -0.074849f, -0.120711f, - -0.125667f, -0.104225f, 0.072503f, 0.194413f, 0.257993f, 0.084344f, -0.131001f, -0.335068f, -0.219043f, 0.003901f, 0.213622f, 0.251721f, 0.141389f, -0.119509f, -0.252400f, -0.239874f, -0.021656f, 0.182933f, 0.283543f, 0.086681f, -0.201864f, -0.256839f, -0.176503f, 0.010550f, 0.207102f, 0.221211f, 0.088061f, -0.058597f, -0.064795f, -0.023744f, -0.001035f, -0.002587f} - } -}; -const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]={NULL,NULL}; - -/* Sample Rate = 16000 */ - -const int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz = 2; -const uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]={{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2} }; -const uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS] = {0, 0}; -const uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][2]={{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}},{{80, 80},{80, 80}}}; -const uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz = 0; -const float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]={0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f}; -const uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]={ - { - {-0.007698f, -0.007490f, -0.007083f, -0.006489f, -0.005730f, -0.004832f, -0.003826f, -0.002746f, -0.001630f, -0.000515f, 0.000560f, 0.001561f, 0.002454f, 0.003210f, 0.003807f, 0.004225f, 0.004456f, 0.004495f, 0.004344f, 0.004015f, 0.003524f, 0.002893f, 0.002150f, 0.001327f, 0.000457f, -0.000424f, -0.001279f, -0.002075f, -0.002778f, -0.003360f, -0.003797f, -0.004070f, -0.004166f, -0.004079f, -0.003811f, -0.003367f, -0.002762f, -0.002015f, -0.001149f, -0.000193f, 0.000821f, 0.001862f, 0.002895f, 0.003887f, 0.004808f, 0.005630f, 0.006328f, 0.006883f, 0.007281f, 0.007514f, 0.007580f, 0.007483f, 0.007232f, 0.006843f, 0.006334f, 0.005728f, 0.005052f, 0.004333f, 0.003600f, 0.002879f, 0.002198f, 0.001579f, 0.001044f, 0.000609f, 0.000284f, 0.000076f, -0.000012f, 0.000014f, 0.000147f, 0.000373f, 0.000677f, 0.001039f, 0.001437f, 0.001850f, 0.002254f, 0.002628f, 0.002954f, 0.003214f, 0.003395f, 0.003487f, 0.873088f, 0.114402f, -0.664115f, -0.828857f, -0.404687f, 0.287627f, 0.776007f, 0.683901f, 0.183866f, -0.494594f, -0.847280f, -0.702624f, -0.171571f, 0.553333f, 0.801950f, 0.560626f, - -0.071445f, -0.623912f, -0.782793f, -0.390473f, 0.213570f, 0.698180f, 0.688426f, 0.203425f, -0.391493f, -0.711773f, -0.534531f, -0.009874f, 0.514367f, 0.683640f, 0.397707f, -0.158462f, -0.613228f, -0.650165f, -0.250501f, 0.313126f, 0.665665f, 0.565230f, 0.100249f, -0.424351f, -0.613182f, -0.605940f, -0.121612f, 0.438429f, 0.714441f, 0.472475f, -0.085594f, -0.591355f, -0.677742f, -0.304361f, 0.277793f, 0.670506f, 0.600885f, 0.111407f, -0.452561f, -0.697177f, -0.456348f, 0.074105f, 0.528714f, 0.616475f, 0.267734f, -0.257343f, -0.598948f, -0.539488f, -0.093337f, 0.455552f, 0.668938f, 0.441368f, -0.105273f, -0.561401f, -0.650789f, -0.285248f, 0.272664f, 0.653204f, 0.594723f, 0.152718f, -0.397975f, -0.501182f, -0.136747f, -0.047847f}, - {-0.007698f, -0.007490f, -0.007083f, -0.006489f, -0.005730f, -0.004832f, -0.003826f, -0.002746f, -0.001630f, -0.000515f, 0.000560f, 0.001561f, 0.002454f, 0.003210f, 0.003807f, 0.004225f, 0.004456f, 0.004495f, 0.004344f, 0.004015f, 0.003524f, 0.002893f, 0.002150f, 0.001327f, 0.000457f, -0.000424f, -0.001279f, -0.002075f, -0.002778f, -0.003360f, -0.003797f, -0.004070f, -0.004166f, -0.004079f, -0.003811f, -0.003367f, -0.002762f, -0.002015f, -0.001149f, -0.000193f, 0.000821f, 0.001862f, 0.002895f, 0.003887f, 0.004808f, 0.005630f, 0.006328f, 0.006883f, 0.007281f, 0.007514f, 0.007580f, 0.007483f, 0.007232f, 0.006843f, 0.006334f, 0.005728f, 0.005052f, 0.004333f, 0.003600f, 0.002879f, 0.002198f, 0.001579f, 0.001044f, 0.000609f, 0.000284f, 0.000076f, -0.000012f, 0.000014f, 0.000147f, 0.000373f, 0.000677f, 0.001039f, 0.001437f, 0.001850f, 0.002254f, 0.002628f, 0.002954f, 0.003214f, 0.003395f, 0.003487f, 0.873088f, 0.114402f, -0.664115f, -0.828857f, -0.404687f, 0.287627f, 0.776007f, 0.683901f, 0.183866f, -0.494594f, -0.847280f, -0.702624f, -0.171571f, 0.553333f, 0.801950f, 0.560626f, - -0.071445f, -0.623912f, -0.782793f, -0.390473f, 0.213570f, 0.698180f, 0.688426f, 0.203425f, -0.391493f, -0.711773f, -0.534531f, -0.009874f, 0.514367f, 0.683640f, 0.397707f, -0.158462f, -0.613228f, -0.650165f, -0.250501f, 0.313126f, 0.665665f, 0.565230f, 0.100249f, -0.424351f, -0.613182f, -0.605940f, -0.121612f, 0.438429f, 0.714441f, 0.472475f, -0.085594f, -0.591355f, -0.677742f, -0.304361f, 0.277793f, 0.670506f, 0.600885f, 0.111407f, -0.452561f, -0.697177f, -0.456348f, 0.074105f, 0.528714f, 0.616475f, 0.267734f, -0.257343f, -0.598948f, -0.539488f, -0.093337f, 0.455552f, 0.668938f, 0.441368f, -0.105273f, -0.561401f, -0.650789f, -0.285248f, 0.272664f, 0.653204f, 0.594723f, 0.152718f, -0.397975f, -0.501182f, -0.136747f, -0.047847f} - }, - { - {0.000979f, 0.000859f, 0.000628f, 0.000303f, -0.000093f, -0.000529f, -0.000968f, -0.001372f, -0.001699f, -0.001911f, -0.001967f, -0.001834f, -0.001483f, -0.000892f, -0.000050f, 0.001049f, 0.002396f, 0.003976f, 0.005761f, 0.007716f, 0.009796f, 0.011949f, 0.014118f, 0.016243f, 0.018261f, 0.020110f, 0.021733f, 0.023075f, 0.024089f, 0.024736f, 0.024990f, 0.024832f, 0.024257f, 0.023273f, 0.021899f, 0.020167f, 0.018118f, 0.015803f, 0.013282f, 0.010620f, 0.007886f, 0.005150f, 0.002483f, -0.000050f, -0.002385f, -0.004470f, -0.006257f, -0.007712f, -0.008809f, -0.009536f, -0.009892f, -0.009888f, -0.009546f, -0.008897f, -0.007982f, -0.006849f, -0.005551f, -0.004142f, -0.002679f, -0.001219f, 0.000187f, 0.001491f, 0.002652f, 0.003637f, 0.004422f, 0.004992f, 0.005341f, 0.005476f, 0.005408f, 0.005160f, 0.004761f, 0.004243f, 0.003646f, 0.003008f, 0.002371f, 0.001772f, 0.001246f, 0.000823f, 0.000528f, 0.000376f, 0.101304f, 0.339648f, 0.252777f, -0.393513f, -0.864314f, -0.541937f, 0.347878f, 0.907725f, 0.674223f, 0.029188f, -0.333092f, -0.699853f, -0.238588f, 0.263380f, 0.598306f, 0.464099f, - 0.107903f, -0.429695f, -0.591349f, -0.410488f, 0.074892f, 0.451542f, 0.601242f, 0.261686f, -0.273703f, -0.612053f, -0.496067f, -0.123218f, 0.373495f, 0.621420f, 0.456977f, 0.034825f, -0.488382f, -0.663918f, -0.417587f, 0.141872f, 0.609117f, 0.748454f, 0.312259f, -0.330994f, -0.816255f, -0.565065f, 0.018068f, 0.618044f, 0.795873f, 0.435300f, -0.250077f, -0.750399f, -0.726031f, -0.187310f, 0.429070f, 0.772695f, 0.575337f, 0.009608f, -0.605531f, -0.758946f, -0.427578f, 0.191705f, 0.625802f, 0.667829f, 0.214816f, -0.367542f, -0.715600f, -0.575407f, -0.066289f, 0.456607f, 0.808964f, 0.615571f, -0.008032f, -0.631988f, -0.815117f, -0.462997f, 0.234557f, 0.763803f, 0.807672f, 0.306931f, -0.408833f, -0.618503f, -0.218248f, -0.076060f}, - {-0.000979f, -0.000859f, -0.000628f, -0.000303f, 0.000093f, 0.000529f, 0.000968f, 0.001372f, 0.001699f, 0.001911f, 0.001967f, 0.001834f, 0.001483f, 0.000892f, 0.000050f, -0.001049f, -0.002396f, -0.003976f, -0.005761f, -0.007716f, -0.009796f, -0.011949f, -0.014118f, -0.016243f, -0.018261f, -0.020110f, -0.021733f, -0.023075f, -0.024089f, -0.024736f, -0.024990f, -0.024832f, -0.024257f, -0.023273f, -0.021899f, -0.020167f, -0.018118f, -0.015803f, -0.013282f, -0.010620f, -0.007886f, -0.005150f, -0.002483f, 0.000050f, 0.002385f, 0.004470f, 0.006257f, 0.007712f, 0.008809f, 0.009536f, 0.009892f, 0.009888f, 0.009546f, 0.008897f, 0.007982f, 0.006849f, 0.005551f, 0.004142f, 0.002679f, 0.001219f, -0.000187f, -0.001491f, -0.002652f, -0.003637f, -0.004422f, -0.004992f, -0.005341f, -0.005476f, -0.005408f, -0.005160f, -0.004761f, -0.004243f, -0.003646f, -0.003008f, -0.002371f, -0.001772f, -0.001246f, -0.000823f, -0.000528f, -0.000376f, -0.101304f, -0.339648f, -0.252777f, 0.393513f, 0.864314f, 0.541937f, -0.347878f, -0.907725f, -0.674223f, -0.029188f, 0.333092f, 0.699853f, 0.238588f, -0.263380f, -0.598306f, -0.464099f, - -0.107903f, 0.429695f, 0.591349f, 0.410488f, -0.074892f, -0.451542f, -0.601242f, -0.261686f, 0.273703f, 0.612053f, 0.496067f, 0.123218f, -0.373495f, -0.621420f, -0.456977f, -0.034825f, 0.488382f, 0.663918f, 0.417587f, -0.141872f, -0.609117f, -0.748454f, -0.312259f, 0.330994f, 0.816255f, 0.565065f, -0.018068f, -0.618044f, -0.795873f, -0.435300f, 0.250077f, 0.750399f, 0.726031f, 0.187310f, -0.429070f, -0.772695f, -0.575337f, -0.009608f, 0.605531f, 0.758946f, 0.427578f, -0.191705f, -0.625802f, -0.667829f, -0.214816f, 0.367542f, 0.715600f, 0.575407f, 0.066289f, -0.456607f, -0.808964f, -0.615571f, 0.008032f, 0.631988f, 0.815117f, 0.462997f, -0.234557f, -0.763803f, -0.807672f, -0.306931f, 0.408833f, 0.618503f, 0.218248f, 0.076060f} - }, - { - {0.062484f, 0.062132f, 0.061426f, 0.060364f, 0.058943f, 0.057161f, 0.055018f, 0.052514f, 0.049655f, 0.046449f, 0.042913f, 0.039069f, 0.034946f, 0.030583f, 0.026026f, 0.021329f, 0.016555f, 0.011772f, 0.007057f, 0.002488f, -0.001854f, -0.005886f, -0.009530f, -0.012711f, -0.015360f, -0.017419f, -0.018840f, -0.019589f, -0.019649f, -0.019014f, -0.017700f, -0.015738f, -0.013176f, -0.010076f, -0.006518f, -0.002592f, 0.001601f, 0.005953f, 0.010350f, 0.014679f, 0.018826f, 0.022686f, 0.026161f, 0.029164f, 0.031622f, 0.033479f, 0.034699f, 0.035260f, 0.035166f, 0.034435f, 0.033108f, 0.031239f, 0.028902f, 0.026180f, 0.023168f, 0.019967f, 0.016682f, 0.013417f, 0.010273f, 0.007344f, 0.004715f, 0.002454f, 0.000620f, -0.000749f, -0.001632f, -0.002024f, -0.001940f, -0.001411f, -0.000486f, 0.000776f, 0.002302f, 0.004012f, 0.005822f, 0.007645f, 0.009395f, 0.010992f, 0.012364f, 0.013450f, 0.014202f, 0.014586f, 0.022958f, -0.049893f, -0.209171f, -0.183077f, 0.073972f, 0.005048f, -0.168993f, -0.204974f, -0.247823f, -0.228010f, -0.107469f, 0.270264f, 0.121968f, 0.080084f, 0.213218f, -0.012303f, - -0.082492f, -0.141268f, -0.038249f, -0.032065f, 0.084166f, 0.151523f, 0.248608f, 0.071240f, -0.135437f, -0.187353f, 0.026434f, 0.160893f, 0.225170f, 0.119884f, -0.023092f, -0.225645f, -0.171771f, -0.058959f, 0.174948f, 0.239644f, 0.157424f, -0.083437f, -0.169510f, -0.176581f, 0.037238f, -0.197171f, -0.146337f, -0.004115f, 0.184486f, 0.191645f, 0.077263f, -0.126621f, -0.232975f, -0.206877f, 0.053405f, 0.249289f, 0.303806f, 0.143482f, -0.141705f, -0.396307f, -0.325906f, 0.013674f, 0.412100f, 0.513794f, 0.285338f, -0.184442f, -0.497306f, -0.491586f, -0.061807f, 0.391423f, 0.463816f, 0.126103f, -0.302822f, -0.488148f, -0.285776f, 0.108766f, 0.379058f, 0.389034f, 0.065148f, -0.245125f, -0.346104f, -0.137250f, 0.068615f, 0.025104f}, - {0.062484f, 0.062132f, 0.061426f, 0.060364f, 0.058943f, 0.057161f, 0.055018f, 0.052514f, 0.049655f, 0.046449f, 0.042913f, 0.039069f, 0.034946f, 0.030583f, 0.026026f, 0.021329f, 0.016555f, 0.011772f, 0.007057f, 0.002488f, -0.001854f, -0.005886f, -0.009530f, -0.012711f, -0.015360f, -0.017419f, -0.018840f, -0.019589f, -0.019649f, -0.019014f, -0.017700f, -0.015738f, -0.013176f, -0.010076f, -0.006518f, -0.002592f, 0.001601f, 0.005953f, 0.010350f, 0.014679f, 0.018826f, 0.022686f, 0.026161f, 0.029164f, 0.031622f, 0.033479f, 0.034699f, 0.035260f, 0.035166f, 0.034435f, 0.033108f, 0.031239f, 0.028902f, 0.026180f, 0.023168f, 0.019967f, 0.016682f, 0.013417f, 0.010273f, 0.007344f, 0.004715f, 0.002454f, 0.000620f, -0.000749f, -0.001632f, -0.002024f, -0.001940f, -0.001411f, -0.000486f, 0.000776f, 0.002302f, 0.004012f, 0.005822f, 0.007645f, 0.009395f, 0.010992f, 0.012364f, 0.013450f, 0.014202f, 0.014586f, 0.022958f, -0.049893f, -0.209171f, -0.183077f, 0.073972f, 0.005048f, -0.168993f, -0.204974f, -0.247823f, -0.228010f, -0.107469f, 0.270264f, 0.121968f, 0.080084f, 0.213218f, -0.012303f, - -0.082492f, -0.141268f, -0.038249f, -0.032065f, 0.084166f, 0.151523f, 0.248608f, 0.071240f, -0.135437f, -0.187353f, 0.026434f, 0.160893f, 0.225170f, 0.119884f, -0.023092f, -0.225645f, -0.171771f, -0.058959f, 0.174948f, 0.239644f, 0.157424f, -0.083437f, -0.169510f, -0.176581f, 0.037238f, -0.197171f, -0.146337f, -0.004115f, 0.184486f, 0.191645f, 0.077263f, -0.126621f, -0.232975f, -0.206877f, 0.053405f, 0.249289f, 0.303806f, 0.143482f, -0.141705f, -0.396307f, -0.325906f, 0.013674f, 0.412100f, 0.513794f, 0.285338f, -0.184442f, -0.497306f, -0.491586f, -0.061807f, 0.391423f, 0.463816f, 0.126103f, -0.302822f, -0.488148f, -0.285776f, 0.108766f, 0.379058f, 0.389034f, 0.065148f, -0.245125f, -0.346104f, -0.137250f, 0.068615f, 0.025104f} - }, - { - {0.057111f, 0.056250f, 0.054553f, 0.052067f, 0.048864f, 0.045033f, 0.040682f, 0.035931f, 0.030910f, 0.025755f, 0.020601f, 0.015580f, 0.010819f, 0.006430f, 0.002512f, -0.000855f, -0.003609f, -0.005712f, -0.007148f, -0.007921f, -0.008060f, -0.007613f, -0.006645f, -0.005236f, -0.003482f, -0.001483f, 0.000655f, 0.002823f, 0.004917f, 0.006840f, 0.008502f, 0.009830f, 0.010762f, 0.011256f, 0.011286f, 0.010845f, 0.009946f, 0.008617f, 0.006903f, 0.004863f, 0.002566f, 0.000091f, -0.002479f, -0.005057f, -0.007559f, -0.009903f, -0.012017f, -0.013836f, -0.015308f, -0.016394f, -0.017068f, -0.017319f, -0.017154f, -0.016589f, -0.015656f, -0.014398f, -0.012866f, -0.011118f, -0.009219f, -0.007232f, -0.005221f, -0.003248f, -0.001369f, 0.000369f, 0.001925f, 0.003271f, 0.004388f, 0.005268f, 0.005913f, 0.006336f, 0.006558f, 0.006608f, 0.006518f, 0.006326f, 0.006071f, 0.005790f, 0.005517f, 0.005284f, 0.005115f, 0.005026f, 0.050263f, 0.048416f, -0.032945f, -0.133132f, -0.051928f, 0.062074f, -0.065995f, -0.088821f, -0.087160f, -0.054059f, -0.271541f, 0.097281f, -0.267727f, -0.263532f, 0.129059f, 0.546682f, - 0.617193f, 0.273608f, -0.175130f, -0.532891f, -0.554510f, -0.046712f, 0.546091f, 0.739987f, 0.436759f, -0.182178f, -0.702202f, -0.782010f, -0.180699f, 0.531728f, 0.908302f, 0.573031f, -0.136258f, -0.738541f, -0.744864f, -0.232703f, 0.429545f, 0.758458f, 0.445898f, -0.113039f, -0.698934f, -0.284378f, 0.198267f, 0.552864f, 0.525436f, 0.168161f, -0.281458f, -0.510027f, -0.416623f, -0.034099f, 0.339007f, 0.440450f, 0.258996f, -0.071709f, -0.323488f, -0.348190f, -0.140564f, 0.105708f, 0.283677f, 0.270582f, 0.079276f, -0.147708f, -0.285929f, -0.206381f, -0.023550f, 0.103586f, 0.316081f, 0.237749f, 0.036797f, -0.218107f, -0.224030f, -0.070507f, 0.116657f, 0.182062f, 0.109038f, -0.045436f, -0.141025f, -0.044537f, 0.014158f, 0.007622f}, - {0.057111f, 0.056250f, 0.054553f, 0.052067f, 0.048864f, 0.045033f, 0.040682f, 0.035931f, 0.030910f, 0.025755f, 0.020601f, 0.015580f, 0.010819f, 0.006430f, 0.002512f, -0.000855f, -0.003609f, -0.005712f, -0.007148f, -0.007921f, -0.008060f, -0.007613f, -0.006645f, -0.005236f, -0.003482f, -0.001483f, 0.000655f, 0.002823f, 0.004917f, 0.006840f, 0.008502f, 0.009830f, 0.010762f, 0.011256f, 0.011286f, 0.010845f, 0.009946f, 0.008617f, 0.006903f, 0.004863f, 0.002566f, 0.000091f, -0.002479f, -0.005057f, -0.007559f, -0.009903f, -0.012017f, -0.013836f, -0.015308f, -0.016394f, -0.017068f, -0.017319f, -0.017154f, -0.016589f, -0.015656f, -0.014398f, -0.012866f, -0.011118f, -0.009219f, -0.007232f, -0.005221f, -0.003248f, -0.001369f, 0.000369f, 0.001925f, 0.003271f, 0.004388f, 0.005268f, 0.005913f, 0.006336f, 0.006558f, 0.006608f, 0.006518f, 0.006326f, 0.006071f, 0.005790f, 0.005517f, 0.005284f, 0.005115f, 0.005026f, 0.050263f, 0.048416f, -0.032945f, -0.133132f, -0.051928f, 0.062074f, -0.065995f, -0.088821f, -0.087160f, -0.054059f, -0.271541f, 0.097281f, -0.267727f, -0.263532f, 0.129059f, 0.546682f, - 0.617193f, 0.273608f, -0.175130f, -0.532891f, -0.554510f, -0.046712f, 0.546091f, 0.739987f, 0.436759f, -0.182178f, -0.702202f, -0.782010f, -0.180699f, 0.531728f, 0.908302f, 0.573031f, -0.136258f, -0.738541f, -0.744864f, -0.232703f, 0.429545f, 0.758458f, 0.445898f, -0.113039f, -0.698934f, -0.284378f, 0.198267f, 0.552864f, 0.525436f, 0.168161f, -0.281458f, -0.510027f, -0.416623f, -0.034099f, 0.339007f, 0.440450f, 0.258996f, -0.071709f, -0.323488f, -0.348190f, -0.140564f, 0.105708f, 0.283677f, 0.270582f, 0.079276f, -0.147708f, -0.285929f, -0.206381f, -0.023550f, 0.103586f, 0.316081f, 0.237749f, 0.036797f, -0.218107f, -0.224030f, -0.070507f, 0.116657f, 0.182062f, 0.109038f, -0.045436f, -0.141025f, -0.044537f, 0.014158f, 0.007622f} - }, - { - {0.041602f, 0.041394f, 0.040978f, 0.040354f, 0.039522f, 0.038480f, 0.037231f, 0.035778f, 0.034126f, 0.032282f, 0.030260f, 0.028074f, 0.025746f, 0.023299f, 0.020763f, 0.018173f, 0.015566f, 0.012983f, 0.010468f, 0.008068f, 0.005826f, 0.003789f, 0.001998f, 0.000491f, -0.000698f, -0.001545f, -0.002030f, -0.002144f, -0.001888f, -0.001272f, -0.000319f, 0.000942f, 0.002468f, 0.004209f, 0.006108f, 0.008100f, 0.010117f, 0.012086f, 0.013937f, 0.015600f, 0.017007f, 0.018100f, 0.018826f, 0.019144f, 0.019023f, 0.018444f, 0.017404f, 0.015911f, 0.013989f, 0.011673f, 0.009011f, 0.006063f, 0.002897f, -0.000411f, -0.003783f, -0.007135f, -0.010385f, -0.013456f, -0.016272f, -0.018768f, -0.020890f, -0.022592f, -0.023845f, -0.024631f, -0.024949f, -0.024813f, -0.024248f, -0.023296f, -0.022008f, -0.020448f, -0.018686f, -0.016797f, -0.014860f, -0.012953f, -0.011154f, -0.009534f, -0.008154f, -0.007071f, -0.006324f, -0.005944f, -0.009138f, -0.014208f, -0.012076f, -0.019963f, -0.085166f, -0.068669f, -0.075100f, 0.005656f, -0.068692f, -0.035429f, -0.114336f, 0.024991f, -0.100777f, -0.161590f, 0.089829f, 0.307021f, - 0.229967f, 0.193370f, -0.086257f, -0.256496f, -0.089551f, -0.069518f, 0.161084f, 0.143823f, 0.080564f, -0.108634f, -0.220026f, -0.183436f, 0.034413f, 0.217304f, 0.276501f, 0.149216f, -0.078653f, -0.378943f, -0.270365f, 0.111069f, 0.335609f, 0.322652f, 0.114550f, -0.213831f, -0.407765f, -0.119243f, 0.203755f, 0.360522f, 0.306272f, 0.030860f, -0.226497f, -0.290452f, -0.232556f, -0.083205f, 0.189825f, 0.256878f, 0.247384f, 0.006984f, -0.136156f, -0.288681f, -0.124020f, -0.012294f, 0.249563f, 0.283504f, 0.020125f, 0.007048f, -0.204243f, -0.263916f, -0.101428f, 0.189034f, 0.253534f, 0.124939f, -0.148221f, -0.315778f, -0.227382f, -0.002516f, 0.171087f, 0.305535f, 0.192294f, -0.067680f, -0.259825f, -0.171751f, 0.014589f, 0.007614f}, - {-0.041602f, -0.041394f, -0.040978f, -0.040354f, -0.039522f, -0.038480f, -0.037231f, -0.035778f, -0.034126f, -0.032282f, -0.030260f, -0.028074f, -0.025746f, -0.023299f, -0.020763f, -0.018173f, -0.015566f, -0.012983f, -0.010468f, -0.008068f, -0.005826f, -0.003789f, -0.001998f, -0.000491f, 0.000698f, 0.001545f, 0.002030f, 0.002144f, 0.001888f, 0.001272f, 0.000319f, -0.000942f, -0.002468f, -0.004209f, -0.006108f, -0.008100f, -0.010117f, -0.012086f, -0.013937f, -0.015600f, -0.017007f, -0.018100f, -0.018826f, -0.019144f, -0.019023f, -0.018444f, -0.017404f, -0.015911f, -0.013989f, -0.011673f, -0.009011f, -0.006063f, -0.002897f, 0.000411f, 0.003783f, 0.007135f, 0.010385f, 0.013456f, 0.016272f, 0.018768f, 0.020890f, 0.022592f, 0.023845f, 0.024631f, 0.024949f, 0.024813f, 0.024248f, 0.023296f, 0.022008f, 0.020448f, 0.018686f, 0.016797f, 0.014860f, 0.012953f, 0.011154f, 0.009534f, 0.008154f, 0.007071f, 0.006324f, 0.005944f, 0.009138f, 0.014208f, 0.012076f, 0.019963f, 0.085166f, 0.068669f, 0.075100f, -0.005656f, 0.068692f, 0.035429f, 0.114336f, -0.024991f, 0.100777f, 0.161590f, -0.089829f, -0.307021f, - -0.229967f, -0.193370f, 0.086257f, 0.256496f, 0.089551f, 0.069518f, -0.161084f, -0.143823f, -0.080564f, 0.108634f, 0.220026f, 0.183436f, -0.034413f, -0.217304f, -0.276501f, -0.149216f, 0.078653f, 0.378943f, 0.270365f, -0.111069f, -0.335609f, -0.322652f, -0.114550f, 0.213831f, 0.407765f, 0.119243f, -0.203755f, -0.360522f, -0.306272f, -0.030860f, 0.226497f, 0.290452f, 0.232556f, 0.083205f, -0.189825f, -0.256878f, -0.247384f, -0.006984f, 0.136156f, 0.288681f, 0.124020f, 0.012294f, -0.249563f, -0.283504f, -0.020125f, -0.007048f, 0.204243f, 0.263916f, 0.101428f, -0.189034f, -0.253534f, -0.124939f, 0.148221f, 0.315778f, 0.227382f, 0.002516f, -0.171087f, -0.305535f, -0.192294f, 0.067680f, 0.259825f, 0.171751f, -0.014589f, -0.007614f} - }, - { - {0.030389f, 0.030416f, 0.030464f, 0.030522f, 0.030576f, 0.030605f, 0.030589f, 0.030503f, 0.030321f, 0.030021f, 0.029580f, 0.028978f, 0.028201f, 0.027239f, 0.026088f, 0.024750f, 0.023236f, 0.021562f, 0.019750f, 0.017829f, 0.015834f, 0.013803f, 0.011776f, 0.009798f, 0.007909f, 0.006153f, 0.004567f, 0.003185f, 0.002036f, 0.001142f, 0.000515f, 0.000162f, 0.000080f, 0.000257f, 0.000673f, 0.001300f, 0.002104f, 0.003045f, 0.004077f, 0.005154f, 0.006229f, 0.007252f, 0.008179f, 0.008970f, 0.009587f, 0.010003f, 0.010196f, 0.010154f, 0.009874f, 0.009362f, 0.008633f, 0.007711f, 0.006626f, 0.005417f, 0.004125f, 0.002798f, 0.001483f, 0.000229f, -0.000919f, -0.001917f, -0.002728f, -0.003322f, -0.003675f, -0.003772f, -0.003608f, -0.003188f, -0.002524f, -0.001640f, -0.000566f, 0.000660f, 0.001995f, 0.003391f, 0.004799f, 0.006169f, 0.007450f, 0.008597f, 0.009568f, 0.010329f, 0.010852f, 0.011119f, -0.032862f, -0.047478f, -0.028036f, -0.016979f, -0.082054f, -0.040865f, -0.045119f, -0.101997f, -0.274631f, -0.111485f, 0.009384f, 0.201284f, -0.126425f, -0.213759f, 0.129081f, 0.239129f, - 0.174454f, 0.076294f, -0.048163f, -0.188243f, -0.041938f, -0.052883f, 0.134924f, 0.108941f, 0.070416f, -0.078420f, 0.043823f, -0.025724f, 0.049083f, -0.061473f, -0.073646f, 0.045482f, 0.113120f, 0.163148f, 0.106488f, -0.007573f, -0.127571f, -0.119581f, -0.039101f, 0.055057f, 0.127006f, 0.087586f, 0.054887f, 0.039371f, -0.051924f, -0.024746f, -0.032908f, 0.016118f, 0.011892f, -0.054182f, 0.036623f, 0.037604f, 0.048414f, 0.003800f, -0.051998f, -0.113977f, -0.051239f, 0.074915f, 0.215380f, 0.143978f, 0.034595f, -0.095172f, -0.197864f, -0.153315f, 0.015408f, 0.123852f, 0.173705f, 0.009635f, -0.142381f, -0.191574f, -0.001107f, 0.184099f, 0.244045f, 0.049760f, -0.219899f, -0.332838f, -0.161023f, 0.133641f, 0.124055f, 0.045424f}, - {-0.030389f, -0.030416f, -0.030464f, -0.030522f, -0.030576f, -0.030605f, -0.030589f, -0.030503f, -0.030321f, -0.030021f, -0.029580f, -0.028978f, -0.028201f, -0.027239f, -0.026088f, -0.024750f, -0.023236f, -0.021562f, -0.019750f, -0.017829f, -0.015834f, -0.013803f, -0.011776f, -0.009798f, -0.007909f, -0.006153f, -0.004567f, -0.003185f, -0.002036f, -0.001142f, -0.000515f, -0.000162f, -0.000080f, -0.000257f, -0.000673f, -0.001300f, -0.002104f, -0.003045f, -0.004077f, -0.005154f, -0.006229f, -0.007252f, -0.008179f, -0.008970f, -0.009587f, -0.010003f, -0.010196f, -0.010154f, -0.009874f, -0.009362f, -0.008633f, -0.007711f, -0.006626f, -0.005417f, -0.004125f, -0.002798f, -0.001483f, -0.000229f, 0.000919f, 0.001917f, 0.002728f, 0.003322f, 0.003675f, 0.003772f, 0.003608f, 0.003188f, 0.002524f, 0.001640f, 0.000566f, -0.000660f, -0.001995f, -0.003391f, -0.004799f, -0.006169f, -0.007450f, -0.008597f, -0.009568f, -0.010329f, -0.010852f, -0.011119f, 0.032862f, 0.047478f, 0.028036f, 0.016979f, 0.082054f, 0.040865f, 0.045119f, 0.101997f, 0.274631f, 0.111485f, -0.009384f, -0.201284f, 0.126425f, 0.213759f, -0.129081f, -0.239129f, - -0.174454f, -0.076294f, 0.048163f, 0.188243f, 0.041938f, 0.052883f, -0.134924f, -0.108941f, -0.070416f, 0.078420f, -0.043823f, 0.025724f, -0.049083f, 0.061473f, 0.073646f, -0.045482f, -0.113120f, -0.163148f, -0.106488f, 0.007573f, 0.127571f, 0.119581f, 0.039101f, -0.055057f, -0.127006f, -0.087586f, -0.054887f, -0.039371f, 0.051924f, 0.024746f, 0.032908f, -0.016118f, -0.011892f, 0.054182f, -0.036623f, -0.037604f, -0.048414f, -0.003800f, 0.051998f, 0.113977f, 0.051239f, -0.074915f, -0.215380f, -0.143978f, -0.034595f, 0.095172f, 0.197864f, 0.153315f, -0.015408f, -0.123852f, -0.173705f, -0.009635f, 0.142381f, 0.191574f, 0.001107f, -0.184099f, -0.244045f, -0.049760f, 0.219899f, 0.332838f, 0.161023f, -0.133641f, -0.124055f, -0.045424f} - }, - { - {0.023099f, 0.023530f, 0.024370f, 0.025577f, 0.027089f, 0.028829f, 0.030707f, 0.032622f, 0.034469f, 0.036142f, 0.037540f, 0.038568f, 0.039146f, 0.039207f, 0.038706f, 0.037618f, 0.035941f, 0.033696f, 0.030927f, 0.027701f, 0.024104f, 0.020238f, 0.016218f, 0.012169f, 0.008218f, 0.004495f, 0.001120f, -0.001794f, -0.004149f, -0.005867f, -0.006891f, -0.007188f, -0.006750f, -0.005597f, -0.003775f, -0.001352f, 0.001577f, 0.004902f, 0.008495f, 0.012218f, 0.015926f, 0.019473f, 0.022718f, 0.025528f, 0.027784f, 0.029386f, 0.030256f, 0.030338f, 0.029605f, 0.028057f, 0.025720f, 0.022647f, 0.018917f, 0.014627f, 0.009896f, 0.004852f, -0.000365f, -0.005613f, -0.010750f, -0.015640f, -0.020162f, -0.024206f, -0.027684f, -0.030528f, -0.032697f, -0.034173f, -0.034963f, -0.035103f, -0.034646f, -0.033669f, -0.032266f, -0.030541f, -0.028610f, -0.026591f, -0.024599f, -0.022746f, -0.021131f, -0.019841f, -0.018942f, -0.018481f, -0.062673f, -0.091999f, -0.073281f, 0.069704f, -0.009475f, -0.099943f, -0.109490f, -0.147892f, -0.248842f, -0.178530f, -0.035184f, 0.057875f, -0.137067f, -0.217779f, 0.034105f, -0.064091f, - -0.031441f, 0.068585f, 0.197166f, 0.101594f, -0.063679f, 0.004375f, -0.071916f, -0.096329f, -0.036429f, 0.098331f, 0.374637f, 0.252218f, 0.089028f, -0.043957f, -0.174179f, -0.131210f, -0.136302f, 0.295429f, 0.450436f, 0.237787f, -0.128220f, -0.279436f, -0.350015f, -0.078461f, 0.362708f, 0.168562f, 0.174039f, -0.032901f, -0.170182f, -0.097249f, 0.222931f, 0.428182f, 0.231161f, -0.343587f, -0.481664f, -0.424163f, 0.047567f, 0.398863f, 0.562194f, 0.255677f, -0.070235f, -0.423328f, -0.236512f, -0.018858f, -0.045838f, 0.339990f, 0.153464f, -0.135925f, -0.139416f, 0.214827f, -0.117956f, -0.258660f, -0.373100f, -0.158343f, -0.010260f, 0.154267f, 0.108609f, 0.161556f, 0.051308f, -0.039987f, -0.098993f, -0.159335f, -0.044951f, -0.017591f}, - {0.023099f, 0.023530f, 0.024370f, 0.025577f, 0.027089f, 0.028829f, 0.030707f, 0.032622f, 0.034469f, 0.036142f, 0.037540f, 0.038568f, 0.039146f, 0.039207f, 0.038706f, 0.037618f, 0.035941f, 0.033696f, 0.030927f, 0.027701f, 0.024104f, 0.020238f, 0.016218f, 0.012169f, 0.008218f, 0.004495f, 0.001120f, -0.001794f, -0.004149f, -0.005867f, -0.006891f, -0.007188f, -0.006750f, -0.005597f, -0.003775f, -0.001352f, 0.001577f, 0.004902f, 0.008495f, 0.012218f, 0.015926f, 0.019473f, 0.022718f, 0.025528f, 0.027784f, 0.029386f, 0.030256f, 0.030338f, 0.029605f, 0.028057f, 0.025720f, 0.022647f, 0.018917f, 0.014627f, 0.009896f, 0.004852f, -0.000365f, -0.005613f, -0.010750f, -0.015640f, -0.020162f, -0.024206f, -0.027684f, -0.030528f, -0.032697f, -0.034173f, -0.034963f, -0.035103f, -0.034646f, -0.033669f, -0.032266f, -0.030541f, -0.028610f, -0.026591f, -0.024599f, -0.022746f, -0.021131f, -0.019841f, -0.018942f, -0.018481f, -0.062673f, -0.091999f, -0.073281f, 0.069704f, -0.009475f, -0.099943f, -0.109490f, -0.147892f, -0.248842f, -0.178530f, -0.035184f, 0.057875f, -0.137067f, -0.217779f, 0.034105f, -0.064091f, - -0.031441f, 0.068585f, 0.197166f, 0.101594f, -0.063679f, 0.004375f, -0.071916f, -0.096329f, -0.036429f, 0.098331f, 0.374637f, 0.252218f, 0.089028f, -0.043957f, -0.174179f, -0.131210f, -0.136302f, 0.295429f, 0.450436f, 0.237787f, -0.128220f, -0.279436f, -0.350015f, -0.078461f, 0.362708f, 0.168562f, 0.174039f, -0.032901f, -0.170182f, -0.097249f, 0.222931f, 0.428182f, 0.231161f, -0.343587f, -0.481664f, -0.424163f, 0.047567f, 0.398863f, 0.562194f, 0.255677f, -0.070235f, -0.423328f, -0.236512f, -0.018858f, -0.045838f, 0.339990f, 0.153464f, -0.135925f, -0.139416f, 0.214827f, -0.117956f, -0.258660f, -0.373100f, -0.158343f, -0.010260f, 0.154267f, 0.108609f, 0.161556f, 0.051308f, -0.039987f, -0.098993f, -0.159335f, -0.044951f, -0.017591f} - }, - { - {0.054691f, 0.053876f, 0.052270f, 0.049925f, 0.046914f, 0.043330f, 0.039284f, 0.034900f, 0.030310f, 0.025651f, 0.021061f, 0.016669f, 0.012598f, 0.008954f, 0.005830f, 0.003295f, 0.001396f, 0.000158f, -0.000418f, -0.000357f, 0.000297f, 0.001475f, 0.003097f, 0.005063f, 0.007266f, 0.009593f, 0.011929f, 0.014162f, 0.016187f, 0.017911f, 0.019255f, 0.020157f, 0.020575f, 0.020488f, 0.019896f, 0.018820f, 0.017302f, 0.015401f, 0.013194f, 0.010768f, 0.008221f, 0.005655f, 0.003174f, 0.000878f, -0.001139f, -0.002793f, -0.004014f, -0.004750f, -0.004964f, -0.004641f, -0.003785f, -0.002420f, -0.000589f, 0.001650f, 0.004224f, 0.007046f, 0.010023f, 0.013059f, 0.016054f, 0.018914f, 0.021549f, 0.023883f, 0.025849f, 0.027397f, 0.028495f, 0.029128f, 0.029299f, 0.029030f, 0.028360f, 0.027343f, 0.026044f, 0.024540f, 0.022913f, 0.021249f, 0.019632f, 0.018143f, 0.016856f, 0.015832f, 0.015121f, 0.014756f, -0.015374f, -0.089788f, -0.105645f, 0.033011f, 0.005709f, -0.014866f, -0.340692f, -0.200927f, -0.199203f, -0.256675f, -0.051222f, 0.153406f, 0.187770f, 0.030644f, 0.047679f, 0.023308f, - 0.122841f, -0.055274f, 0.032513f, 0.042757f, 0.007501f, 0.028536f, 0.000722f, -0.001765f, 0.006102f, -0.011380f, -0.029264f, 0.014743f, 0.001064f, -0.057539f, -0.075456f, -0.033885f, 0.003103f, -0.009218f, -0.048717f, -0.009685f, 0.050417f, 0.159080f, 0.013605f, -0.055453f, -0.216146f, 0.020459f, 0.166808f, 0.195538f, 0.142197f, -0.082820f, -0.240570f, -0.224463f, -0.113294f, 0.099404f, 0.210380f, 0.201281f, 0.016103f, -0.164977f, -0.241489f, -0.153995f, -0.011674f, 0.169760f, 0.143349f, 0.060626f, 0.075250f, -0.226318f, -0.185383f, 0.004166f, 0.078487f, -0.077596f, 0.307982f, 0.375011f, 0.325637f, -0.048462f, -0.304667f, -0.323737f, 0.025128f, 0.258415f, 0.288636f, 0.095959f, -0.193941f, -0.184479f, -0.080809f, -0.026990f}, - {0.054691f, 0.053876f, 0.052270f, 0.049925f, 0.046914f, 0.043330f, 0.039284f, 0.034900f, 0.030310f, 0.025651f, 0.021061f, 0.016669f, 0.012598f, 0.008954f, 0.005830f, 0.003295f, 0.001396f, 0.000158f, -0.000418f, -0.000357f, 0.000297f, 0.001475f, 0.003097f, 0.005063f, 0.007266f, 0.009593f, 0.011929f, 0.014162f, 0.016187f, 0.017911f, 0.019255f, 0.020157f, 0.020575f, 0.020488f, 0.019896f, 0.018820f, 0.017302f, 0.015401f, 0.013194f, 0.010768f, 0.008221f, 0.005655f, 0.003174f, 0.000878f, -0.001139f, -0.002793f, -0.004014f, -0.004750f, -0.004964f, -0.004641f, -0.003785f, -0.002420f, -0.000589f, 0.001650f, 0.004224f, 0.007046f, 0.010023f, 0.013059f, 0.016054f, 0.018914f, 0.021549f, 0.023883f, 0.025849f, 0.027397f, 0.028495f, 0.029128f, 0.029299f, 0.029030f, 0.028360f, 0.027343f, 0.026044f, 0.024540f, 0.022913f, 0.021249f, 0.019632f, 0.018143f, 0.016856f, 0.015832f, 0.015121f, 0.014756f, -0.015374f, -0.089788f, -0.105645f, 0.033011f, 0.005709f, -0.014866f, -0.340692f, -0.200927f, -0.199203f, -0.256675f, -0.051222f, 0.153406f, 0.187770f, 0.030644f, 0.047679f, 0.023308f, - 0.122841f, -0.055274f, 0.032513f, 0.042757f, 0.007501f, 0.028536f, 0.000722f, -0.001765f, 0.006102f, -0.011380f, -0.029264f, 0.014743f, 0.001064f, -0.057539f, -0.075456f, -0.033885f, 0.003103f, -0.009218f, -0.048717f, -0.009685f, 0.050417f, 0.159080f, 0.013605f, -0.055453f, -0.216146f, 0.020459f, 0.166808f, 0.195538f, 0.142197f, -0.082820f, -0.240570f, -0.224463f, -0.113294f, 0.099404f, 0.210380f, 0.201281f, 0.016103f, -0.164977f, -0.241489f, -0.153995f, -0.011674f, 0.169760f, 0.143349f, 0.060626f, 0.075250f, -0.226318f, -0.185383f, 0.004166f, 0.078487f, -0.077596f, 0.307982f, 0.375011f, 0.325637f, -0.048462f, -0.304667f, -0.323737f, 0.025128f, 0.258415f, 0.288636f, 0.095959f, -0.193941f, -0.184479f, -0.080809f, -0.026990f} - }, - { - {0.021533f, 0.020944f, 0.019781f, 0.018078f, 0.015881f, 0.013252f, 0.010263f, 0.006997f, 0.003545f, 0.000002f, -0.003535f, -0.006968f, -0.010202f, -0.013148f, -0.015726f, -0.017864f, -0.019504f, -0.020599f, -0.021119f, -0.021047f, -0.020383f, -0.019141f, -0.017351f, -0.015054f, -0.012307f, -0.009174f, -0.005728f, -0.002052f, 0.001771f, 0.005653f, 0.009509f, 0.013254f, 0.016809f, 0.020102f, 0.023067f, 0.025651f, 0.027810f, 0.029509f, 0.030730f, 0.031463f, 0.031710f, 0.031486f, 0.030816f, 0.029732f, 0.028278f, 0.026500f, 0.024452f, 0.022192f, 0.019777f, 0.017267f, 0.014720f, 0.012191f, 0.009732f, 0.007390f, 0.005205f, 0.003213f, 0.001442f, -0.000087f, -0.001360f, -0.002371f, -0.003117f, -0.003606f, -0.003849f, -0.003862f, -0.003667f, -0.003286f, -0.002748f, -0.002081f, -0.001316f, -0.000483f, 0.000388f, 0.001267f, 0.002127f, 0.002940f, 0.003683f, 0.004336f, 0.004881f, 0.005302f, 0.005589f, 0.005735f, -0.013971f, 0.039564f, -0.009130f, -0.048006f, -0.014996f, 0.010247f, 0.016980f, 0.126968f, 0.199644f, 0.248065f, -0.052099f, -0.165961f, -0.248606f, -0.100058f, 0.103896f, 0.332845f, - 0.191755f, 0.075132f, -0.098877f, -0.080432f, -0.049208f, 0.050792f, -0.016211f, -0.046062f, -0.035703f, -0.020113f, 0.023951f, 0.127544f, 0.108258f, 0.140546f, -0.067622f, -0.193057f, -0.187311f, -0.060823f, 0.133812f, 0.272375f, 0.166661f, -0.027833f, -0.221854f, -0.175482f, 0.051480f, 0.015371f, 0.042700f, 0.025158f, 0.011325f, -0.045641f, -0.074621f, 0.081967f, 0.082721f, -0.085767f, -0.093004f, -0.103701f, -0.043105f, 0.030138f, 0.141188f, 0.103375f, 0.060473f, -0.055064f, -0.068653f, -0.095392f, -0.031089f, 0.096306f, 0.162914f, 0.102703f, 0.008155f, -0.107921f, -0.230563f, -0.245539f, -0.045950f, 0.178590f, 0.271838f, 0.274633f, 0.152049f, -0.099951f, -0.353791f, -0.344662f, -0.124481f, 0.130436f, 0.105403f, 0.035328f}, - {0.021533f, 0.020944f, 0.019781f, 0.018078f, 0.015881f, 0.013252f, 0.010263f, 0.006997f, 0.003545f, 0.000002f, -0.003535f, -0.006968f, -0.010202f, -0.013148f, -0.015726f, -0.017864f, -0.019504f, -0.020599f, -0.021119f, -0.021047f, -0.020383f, -0.019141f, -0.017351f, -0.015054f, -0.012307f, -0.009174f, -0.005728f, -0.002052f, 0.001771f, 0.005653f, 0.009509f, 0.013254f, 0.016809f, 0.020102f, 0.023067f, 0.025651f, 0.027810f, 0.029509f, 0.030730f, 0.031463f, 0.031710f, 0.031486f, 0.030816f, 0.029732f, 0.028278f, 0.026500f, 0.024452f, 0.022192f, 0.019777f, 0.017267f, 0.014720f, 0.012191f, 0.009732f, 0.007390f, 0.005205f, 0.003213f, 0.001442f, -0.000087f, -0.001360f, -0.002371f, -0.003117f, -0.003606f, -0.003849f, -0.003862f, -0.003667f, -0.003286f, -0.002748f, -0.002081f, -0.001316f, -0.000483f, 0.000388f, 0.001267f, 0.002127f, 0.002940f, 0.003683f, 0.004336f, 0.004881f, 0.005302f, 0.005589f, 0.005735f, -0.013971f, 0.039564f, -0.009130f, -0.048006f, -0.014996f, 0.010247f, 0.016980f, 0.126968f, 0.199644f, 0.248065f, -0.052099f, -0.165961f, -0.248606f, -0.100058f, 0.103896f, 0.332845f, - 0.191755f, 0.075132f, -0.098877f, -0.080432f, -0.049208f, 0.050792f, -0.016211f, -0.046062f, -0.035703f, -0.020113f, 0.023951f, 0.127544f, 0.108258f, 0.140546f, -0.067622f, -0.193057f, -0.187311f, -0.060823f, 0.133812f, 0.272375f, 0.166661f, -0.027833f, -0.221854f, -0.175482f, 0.051480f, 0.015371f, 0.042700f, 0.025158f, 0.011325f, -0.045641f, -0.074621f, 0.081967f, 0.082721f, -0.085767f, -0.093004f, -0.103701f, -0.043105f, 0.030138f, 0.141188f, 0.103375f, 0.060473f, -0.055064f, -0.068653f, -0.095392f, -0.031089f, 0.096306f, 0.162914f, 0.102703f, 0.008155f, -0.107921f, -0.230563f, -0.245539f, -0.045950f, 0.178590f, 0.271838f, 0.274633f, 0.152049f, -0.099951f, -0.353791f, -0.344662f, -0.124481f, 0.130436f, 0.105403f, 0.035328f} - }, - { - {0.006034f, 0.005898f, 0.005630f, 0.005234f, 0.004718f, 0.004092f, 0.003369f, 0.002564f, 0.001693f, 0.000774f, -0.000172f, -0.001126f, -0.002064f, -0.002966f, -0.003810f, -0.004574f, -0.005239f, -0.005786f, -0.006198f, -0.006462f, -0.006568f, -0.006509f, -0.006281f, -0.005886f, -0.005329f, -0.004620f, -0.003775f, -0.002811f, -0.001754f, -0.000629f, 0.000533f, 0.001699f, 0.002833f, 0.003900f, 0.004862f, 0.005685f, 0.006333f, 0.006776f, 0.006986f, 0.006938f, 0.006615f, 0.006005f, 0.005102f, 0.003908f, 0.002430f, 0.000685f, -0.001305f, -0.003512f, -0.005899f, -0.008426f, -0.011049f, -0.013719f, -0.016387f, -0.019002f, -0.021513f, -0.023872f, -0.026034f, -0.027958f, -0.029610f, -0.030961f, -0.031991f, -0.032686f, -0.033043f, -0.033065f, -0.032768f, -0.032170f, -0.031303f, -0.030202f, -0.028910f, -0.027472f, -0.025940f, -0.024365f, -0.022801f, -0.021298f, -0.019907f, -0.018671f, -0.017632f, -0.016821f, -0.016267f, -0.015985f, -0.007218f, -0.007566f, -0.009460f, 0.001637f, -0.011333f, 0.010080f, 0.038148f, 0.046788f, -0.002158f, -0.058626f, -0.008716f, 0.080009f, 0.166461f, 0.130407f, -0.065540f, -0.226461f, - -0.117046f, -0.107922f, 0.050639f, 0.030209f, 0.014323f, 0.071197f, 0.123332f, -0.050839f, -0.130673f, -0.054935f, -0.035316f, 0.042057f, 0.122348f, 0.059493f, 0.081780f, 0.026216f, -0.105960f, -0.091869f, 0.012077f, 0.129733f, 0.114245f, -0.014831f, -0.074909f, -0.127461f, 0.000742f, 0.127348f, 0.119691f, 0.053906f, -0.029906f, -0.128471f, -0.097463f, -0.014842f, 0.019096f, 0.041287f, 0.049061f, 0.036122f, 0.073673f, 0.007047f, -0.005184f, -0.032054f, -0.002638f, -0.049137f, 0.072268f, 0.121937f, -0.026202f, 0.101295f, -0.011372f, -0.159853f, -0.035704f, 0.085567f, -0.008444f, -0.106689f, -0.112697f, -0.060874f, 0.034895f, 0.105899f, 0.107430f, 0.054834f, -0.097858f, -0.169880f, -0.041617f, 0.114684f, 0.055230f, 0.021408f}, - {-0.006034f, -0.005898f, -0.005630f, -0.005234f, -0.004718f, -0.004092f, -0.003369f, -0.002564f, -0.001693f, -0.000774f, 0.000172f, 0.001126f, 0.002064f, 0.002966f, 0.003810f, 0.004574f, 0.005239f, 0.005786f, 0.006198f, 0.006462f, 0.006568f, 0.006509f, 0.006281f, 0.005886f, 0.005329f, 0.004620f, 0.003775f, 0.002811f, 0.001754f, 0.000629f, -0.000533f, -0.001699f, -0.002833f, -0.003900f, -0.004862f, -0.005685f, -0.006333f, -0.006776f, -0.006986f, -0.006938f, -0.006615f, -0.006005f, -0.005102f, -0.003908f, -0.002430f, -0.000685f, 0.001305f, 0.003512f, 0.005899f, 0.008426f, 0.011049f, 0.013719f, 0.016387f, 0.019002f, 0.021513f, 0.023872f, 0.026034f, 0.027958f, 0.029610f, 0.030961f, 0.031991f, 0.032686f, 0.033043f, 0.033065f, 0.032768f, 0.032170f, 0.031303f, 0.030202f, 0.028910f, 0.027472f, 0.025940f, 0.024365f, 0.022801f, 0.021298f, 0.019907f, 0.018671f, 0.017632f, 0.016821f, 0.016267f, 0.015985f, 0.007218f, 0.007566f, 0.009460f, -0.001637f, 0.011333f, -0.010080f, -0.038148f, -0.046788f, 0.002158f, 0.058626f, 0.008716f, -0.080009f, -0.166461f, -0.130407f, 0.065540f, 0.226461f, - 0.117046f, 0.107922f, -0.050639f, -0.030209f, -0.014323f, -0.071197f, -0.123332f, 0.050839f, 0.130673f, 0.054935f, 0.035316f, -0.042057f, -0.122348f, -0.059493f, -0.081780f, -0.026216f, 0.105960f, 0.091869f, -0.012077f, -0.129733f, -0.114245f, 0.014831f, 0.074909f, 0.127461f, -0.000742f, -0.127348f, -0.119691f, -0.053906f, 0.029906f, 0.128471f, 0.097463f, 0.014842f, -0.019096f, -0.041287f, -0.049061f, -0.036122f, -0.073673f, -0.007047f, 0.005184f, 0.032054f, 0.002638f, 0.049137f, -0.072268f, -0.121937f, 0.026202f, -0.101295f, 0.011372f, 0.159853f, 0.035704f, -0.085567f, 0.008444f, 0.106689f, 0.112697f, 0.060874f, -0.034895f, -0.105899f, -0.107430f, -0.054834f, 0.097858f, 0.169880f, 0.041617f, -0.114684f, -0.055230f, -0.021408f} - }, - { - {0.010863f, 0.011200f, 0.011864f, 0.012832f, 0.014071f, 0.015541f, 0.017191f, 0.018966f, 0.020807f, 0.022651f, 0.024437f, 0.026104f, 0.027595f, 0.028860f, 0.029854f, 0.030542f, 0.030898f, 0.030907f, 0.030563f, 0.029873f, 0.028853f, 0.027528f, 0.025934f, 0.024111f, 0.022107f, 0.019975f, 0.017769f, 0.015543f, 0.013353f, 0.011248f, 0.009277f, 0.007480f, 0.005891f, 0.004538f, 0.003438f, 0.002603f, 0.002033f, 0.001724f, 0.001661f, 0.001826f, 0.002194f, 0.002735f, 0.003419f, 0.004213f, 0.005084f, 0.006003f, 0.006940f, 0.007871f, 0.008778f, 0.009645f, 0.010463f, 0.011230f, 0.011947f, 0.012622f, 0.013268f, 0.013899f, 0.014533f, 0.015191f, 0.015893f, 0.016657f, 0.017502f, 0.018441f, 0.019485f, 0.020639f, 0.021904f, 0.023275f, 0.024740f, 0.026284f, 0.027885f, 0.029517f, 0.031150f, 0.032753f, 0.034291f, 0.035730f, 0.037036f, 0.038179f, 0.039130f, 0.039865f, 0.040366f, 0.040620f, -0.022267f, 0.018161f, 0.010400f, -0.010091f, -0.020353f, -0.000646f, -0.031444f, -0.036280f, -0.201290f, -0.237245f, 0.004557f, 0.078100f, -0.004496f, -0.023904f, 0.027379f, -0.017484f, - -0.058772f, 0.014702f, 0.041136f, -0.001496f, 0.085314f, -0.050852f, -0.015205f, -0.042559f, -0.016824f, 0.053952f, 0.048029f, 0.118676f, -0.063098f, -0.051219f, -0.033491f, 0.031069f, -0.000121f, -0.048264f, -0.047918f, -0.020772f, -0.033309f, 0.072396f, 0.043293f, -0.027935f, -0.046999f, -0.043709f, 0.022435f, 0.077296f, 0.069198f, -0.003554f, -0.109988f, -0.068384f, -0.066551f, -0.082551f, -0.011608f, 0.078097f, 0.068922f, -0.016644f, -0.091435f, -0.094576f, -0.065306f, 0.069282f, 0.094273f, 0.065165f, 0.043257f, -0.172358f, -0.161959f, -0.011422f, 0.036877f, 0.005049f, 0.234653f, 0.090119f, 0.024315f, -0.083867f, -0.067721f, 0.052087f, 0.186407f, 0.212440f, 0.036082f, -0.103702f, -0.109180f, -0.194275f, -0.062967f, -0.034265f}, - {-0.010863f, -0.011200f, -0.011864f, -0.012832f, -0.014071f, -0.015541f, -0.017191f, -0.018966f, -0.020807f, -0.022651f, -0.024437f, -0.026104f, -0.027595f, -0.028860f, -0.029854f, -0.030542f, -0.030898f, -0.030907f, -0.030563f, -0.029873f, -0.028853f, -0.027528f, -0.025934f, -0.024111f, -0.022107f, -0.019975f, -0.017769f, -0.015543f, -0.013353f, -0.011248f, -0.009277f, -0.007480f, -0.005891f, -0.004538f, -0.003438f, -0.002603f, -0.002033f, -0.001724f, -0.001661f, -0.001826f, -0.002194f, -0.002735f, -0.003419f, -0.004213f, -0.005084f, -0.006003f, -0.006940f, -0.007871f, -0.008778f, -0.009645f, -0.010463f, -0.011230f, -0.011947f, -0.012622f, -0.013268f, -0.013899f, -0.014533f, -0.015191f, -0.015893f, -0.016657f, -0.017502f, -0.018441f, -0.019485f, -0.020639f, -0.021904f, -0.023275f, -0.024740f, -0.026284f, -0.027885f, -0.029517f, -0.031150f, -0.032753f, -0.034291f, -0.035730f, -0.037036f, -0.038179f, -0.039130f, -0.039865f, -0.040366f, -0.040620f, 0.022267f, -0.018161f, -0.010400f, 0.010091f, 0.020353f, 0.000646f, 0.031444f, 0.036280f, 0.201290f, 0.237245f, -0.004557f, -0.078100f, 0.004496f, 0.023904f, -0.027379f, 0.017484f, - 0.058772f, -0.014702f, -0.041136f, 0.001496f, -0.085314f, 0.050852f, 0.015205f, 0.042559f, 0.016824f, -0.053952f, -0.048029f, -0.118676f, 0.063098f, 0.051219f, 0.033491f, -0.031069f, 0.000121f, 0.048264f, 0.047918f, 0.020772f, 0.033309f, -0.072396f, -0.043293f, 0.027935f, 0.046999f, 0.043709f, -0.022435f, -0.077296f, -0.069198f, 0.003554f, 0.109988f, 0.068384f, 0.066551f, 0.082551f, 0.011608f, -0.078097f, -0.068922f, 0.016644f, 0.091435f, 0.094576f, 0.065306f, -0.069282f, -0.094273f, -0.065165f, -0.043257f, 0.172358f, 0.161959f, 0.011422f, -0.036877f, -0.005049f, -0.234653f, -0.090119f, -0.024315f, 0.083867f, 0.067721f, -0.052087f, -0.186407f, -0.212440f, -0.036082f, 0.103702f, 0.109180f, 0.194275f, 0.062967f, 0.034265f} - }, - { - {-0.047822f, -0.046886f, -0.045043f, -0.042352f, -0.038896f, -0.034783f, -0.030142f, -0.025115f, -0.019857f, -0.014526f, -0.009281f, -0.004276f, 0.000345f, 0.004455f, 0.007945f, 0.010729f, 0.012746f, 0.013964f, 0.014376f, 0.014004f, 0.012896f, 0.011125f, 0.008784f, 0.005982f, 0.002846f, -0.000495f, -0.003902f, -0.007243f, -0.010387f, -0.013218f, -0.015632f, -0.017545f, -0.018893f, -0.019635f, -0.019754f, -0.019258f, -0.018178f, -0.016565f, -0.014493f, -0.012051f, -0.009339f, -0.006467f, -0.003552f, -0.000709f, 0.001952f, 0.004327f, 0.006325f, 0.007870f, 0.008902f, 0.009381f, 0.009288f, 0.008624f, 0.007411f, 0.005688f, 0.003513f, 0.000955f, -0.001902f, -0.004970f, -0.008152f, -0.011356f, -0.014490f, -0.017469f, -0.020219f, -0.022676f, -0.024792f, -0.026535f, -0.027888f, -0.028851f, -0.029440f, -0.029684f, -0.029627f, -0.029319f, -0.028823f, -0.028200f, -0.027516f, -0.026834f, -0.026211f, -0.025697f, -0.025331f, -0.025141f, 0.002437f, -0.010385f, 0.024897f, 0.010871f, 0.008500f, 0.048040f, 0.038717f, -0.162200f, -0.160942f, -0.104608f, -0.017099f, 0.016216f, -0.053230f, -0.017630f, 0.218802f, 0.114696f, - 0.073019f, -0.102643f, -0.013011f, 0.038742f, 0.111803f, 0.010647f, 0.005978f, -0.045316f, -0.065141f, -0.040399f, -0.026103f, -0.007485f, 0.046694f, 0.073828f, 0.071760f, -0.007469f, -0.128561f, -0.150778f, 0.008746f, 0.070907f, 0.104617f, 0.069038f, -0.001713f, -0.104005f, 0.166432f, -0.038802f, -0.067815f, -0.129565f, -0.097838f, 0.019219f, 0.196267f, 0.203497f, 0.048762f, -0.205457f, -0.308719f, -0.273321f, 0.052960f, 0.302549f, 0.375961f, 0.269508f, -0.075659f, -0.356239f, -0.318182f, -0.076143f, -0.020635f, 0.309454f, 0.196861f, -0.000183f, -0.034524f, 0.083096f, -0.141618f, -0.027066f, -0.073019f, -0.042380f, -0.158044f, -0.158085f, -0.102720f, 0.080799f, 0.149340f, 0.168961f, 0.019283f, -0.165627f, -0.131561f, -0.049136f}, - {0.047822f, 0.046886f, 0.045043f, 0.042352f, 0.038896f, 0.034783f, 0.030142f, 0.025115f, 0.019857f, 0.014526f, 0.009281f, 0.004276f, -0.000345f, -0.004455f, -0.007945f, -0.010729f, -0.012746f, -0.013964f, -0.014376f, -0.014004f, -0.012896f, -0.011125f, -0.008784f, -0.005982f, -0.002846f, 0.000495f, 0.003902f, 0.007243f, 0.010387f, 0.013218f, 0.015632f, 0.017545f, 0.018893f, 0.019635f, 0.019754f, 0.019258f, 0.018178f, 0.016565f, 0.014493f, 0.012051f, 0.009339f, 0.006467f, 0.003552f, 0.000709f, -0.001952f, -0.004327f, -0.006325f, -0.007870f, -0.008902f, -0.009381f, -0.009288f, -0.008624f, -0.007411f, -0.005688f, -0.003513f, -0.000955f, 0.001902f, 0.004970f, 0.008152f, 0.011356f, 0.014490f, 0.017469f, 0.020219f, 0.022676f, 0.024792f, 0.026535f, 0.027888f, 0.028851f, 0.029440f, 0.029684f, 0.029627f, 0.029319f, 0.028823f, 0.028200f, 0.027516f, 0.026834f, 0.026211f, 0.025697f, 0.025331f, 0.025141f, -0.002437f, 0.010385f, -0.024897f, -0.010871f, -0.008500f, -0.048040f, -0.038717f, 0.162200f, 0.160942f, 0.104608f, 0.017099f, -0.016216f, 0.053230f, 0.017630f, -0.218802f, -0.114696f, - -0.073019f, 0.102643f, 0.013011f, -0.038742f, -0.111803f, -0.010647f, -0.005978f, 0.045316f, 0.065141f, 0.040399f, 0.026103f, 0.007485f, -0.046694f, -0.073828f, -0.071760f, 0.007469f, 0.128561f, 0.150778f, -0.008746f, -0.070907f, -0.104617f, -0.069038f, 0.001713f, 0.104005f, -0.166432f, 0.038802f, 0.067815f, 0.129565f, 0.097838f, -0.019219f, -0.196267f, -0.203497f, -0.048762f, 0.205457f, 0.308719f, 0.273321f, -0.052960f, -0.302549f, -0.375961f, -0.269508f, 0.075659f, 0.356239f, 0.318182f, 0.076143f, 0.020635f, -0.309454f, -0.196861f, 0.000183f, 0.034524f, -0.083096f, 0.141618f, 0.027066f, 0.073019f, 0.042380f, 0.158044f, 0.158085f, 0.102720f, -0.080799f, -0.149340f, -0.168961f, -0.019283f, 0.165627f, 0.131561f, 0.049136f} - }, - { - {-0.037392f, -0.036989f, -0.036200f, -0.035053f, -0.033593f, -0.031874f, -0.029959f, -0.027919f, -0.025825f, -0.023751f, -0.021765f, -0.019928f, -0.018293f, -0.016899f, -0.015772f, -0.014922f, -0.014343f, -0.014013f, -0.013895f, -0.013936f, -0.014074f, -0.014236f, -0.014345f, -0.014321f, -0.014085f, -0.013563f, -0.012691f, -0.011417f, -0.009706f, -0.007538f, -0.004915f, -0.001859f, 0.001586f, 0.005357f, 0.009371f, 0.013529f, 0.017716f, 0.021811f, 0.025682f, 0.029200f, 0.032238f, 0.034675f, 0.036406f, 0.037341f, 0.037412f, 0.036574f, 0.034809f, 0.032127f, 0.028567f, 0.024194f, 0.019101f, 0.013404f, 0.007241f, 0.000766f, -0.005857f, -0.012455f, -0.018856f, -0.024892f, -0.030405f, -0.035254f, -0.039318f, -0.042501f, -0.044733f, -0.045978f, -0.046230f, -0.045514f, -0.043889f, -0.041441f, -0.038284f, -0.034554f, -0.030404f, -0.026000f, -0.021517f, -0.017126f, -0.012997f, -0.009288f, -0.006137f, -0.003664f, -0.001963f, -0.001095f, 0.040016f, 0.024974f, 0.031039f, 0.006591f, 0.029674f, -0.033138f, 0.124640f, 0.072462f, -0.016105f, -0.002988f, 0.087269f, -0.091992f, 0.020306f, 0.115300f, -0.044722f, -0.358212f, - -0.220831f, -0.124493f, 0.162324f, 0.118796f, -0.171291f, -0.030497f, 0.138427f, 0.237770f, 0.067315f, -0.042512f, -0.111599f, -0.189566f, -0.046650f, 0.130336f, 0.232124f, 0.161396f, 0.007841f, -0.115595f, -0.140657f, -0.074020f, 0.067847f, 0.166918f, 0.100309f, 0.047515f, -0.063850f, -0.120113f, -0.048761f, 0.095869f, 0.181085f, 0.141993f, -0.003804f, -0.072366f, -0.071557f, -0.113145f, -0.035713f, 0.009771f, 0.134251f, 0.206445f, 0.241944f, 0.109536f, -0.126733f, -0.262770f, -0.107096f, 0.071251f, -0.031866f, 0.233860f, 0.174952f, 0.077308f, -0.024756f, 0.110470f, -0.227029f, -0.192836f, -0.166829f, 0.034076f, 0.028605f, 0.043400f, -0.119984f, 0.009704f, 0.111958f, 0.181593f, 0.244586f, -0.232359f, -0.167522f, -0.065493f}, - {-0.037392f, -0.036989f, -0.036200f, -0.035053f, -0.033593f, -0.031874f, -0.029959f, -0.027919f, -0.025825f, -0.023751f, -0.021765f, -0.019928f, -0.018293f, -0.016899f, -0.015772f, -0.014922f, -0.014343f, -0.014013f, -0.013895f, -0.013936f, -0.014074f, -0.014236f, -0.014345f, -0.014321f, -0.014085f, -0.013563f, -0.012691f, -0.011417f, -0.009706f, -0.007538f, -0.004915f, -0.001859f, 0.001586f, 0.005357f, 0.009371f, 0.013529f, 0.017716f, 0.021811f, 0.025682f, 0.029200f, 0.032238f, 0.034675f, 0.036406f, 0.037341f, 0.037412f, 0.036574f, 0.034809f, 0.032127f, 0.028567f, 0.024194f, 0.019101f, 0.013404f, 0.007241f, 0.000766f, -0.005857f, -0.012455f, -0.018856f, -0.024892f, -0.030405f, -0.035254f, -0.039318f, -0.042501f, -0.044733f, -0.045978f, -0.046230f, -0.045514f, -0.043889f, -0.041441f, -0.038284f, -0.034554f, -0.030404f, -0.026000f, -0.021517f, -0.017126f, -0.012997f, -0.009288f, -0.006137f, -0.003664f, -0.001963f, -0.001095f, 0.040016f, 0.024974f, 0.031039f, 0.006591f, 0.029674f, -0.033138f, 0.124640f, 0.072462f, -0.016105f, -0.002988f, 0.087269f, -0.091992f, 0.020306f, 0.115300f, -0.044722f, -0.358212f, - -0.220831f, -0.124493f, 0.162324f, 0.118796f, -0.171291f, -0.030497f, 0.138427f, 0.237770f, 0.067315f, -0.042512f, -0.111599f, -0.189566f, -0.046650f, 0.130336f, 0.232124f, 0.161396f, 0.007841f, -0.115595f, -0.140657f, -0.074020f, 0.067847f, 0.166918f, 0.100309f, 0.047515f, -0.063850f, -0.120113f, -0.048761f, 0.095869f, 0.181085f, 0.141993f, -0.003804f, -0.072366f, -0.071557f, -0.113145f, -0.035713f, 0.009771f, 0.134251f, 0.206445f, 0.241944f, 0.109536f, -0.126733f, -0.262770f, -0.107096f, 0.071251f, -0.031866f, 0.233860f, 0.174952f, 0.077308f, -0.024756f, 0.110470f, -0.227029f, -0.192836f, -0.166829f, 0.034076f, 0.028605f, 0.043400f, -0.119984f, 0.009704f, 0.111958f, 0.181593f, 0.244586f, -0.232359f, -0.167522f, -0.065493f} - }, - { - {-0.023121f, -0.022852f, -0.022326f, -0.021568f, -0.020616f, -0.019513f, -0.018315f, -0.017079f, -0.015867f, -0.014739f, -0.013755f, -0.012965f, -0.012415f, -0.012138f, -0.012157f, -0.012480f, -0.013101f, -0.014001f, -0.015146f, -0.016488f, -0.017970f, -0.019524f, -0.021074f, -0.022542f, -0.023848f, -0.024913f, -0.025665f, -0.026038f, -0.025979f, -0.025447f, -0.024416f, -0.022879f, -0.020843f, -0.018337f, -0.015404f, -0.012105f, -0.008515f, -0.004723f, -0.000825f, 0.003074f, 0.006867f, 0.010447f, 0.013710f, 0.016561f, 0.018913f, 0.020695f, 0.021850f, 0.022338f, 0.022141f, 0.021257f, 0.019706f, 0.017525f, 0.014769f, 0.011510f, 0.007830f, 0.003824f, -0.000408f, -0.004762f, -0.009133f, -0.013422f, -0.017535f, -0.021387f, -0.024907f, -0.028038f, -0.030737f, -0.032980f, -0.034759f, -0.036082f, -0.036974f, -0.037472f, -0.037625f, -0.037494f, -0.037141f, -0.036637f, -0.036049f, -0.035443f, -0.034879f, -0.034408f, -0.034071f, -0.033895f, -0.021504f, -0.013236f, 0.041524f, 0.010894f, -0.023477f, -0.049221f, 0.083276f, 0.127970f, 0.163269f, 0.021594f, -0.072866f, -0.165528f, -0.008057f, 0.026210f, -0.093974f, -0.136312f, - -0.127652f, -0.160700f, 0.083099f, 0.274765f, 0.025151f, 0.010641f, -0.072650f, -0.077463f, -0.058408f, 0.139417f, 0.095744f, 0.250590f, 0.020518f, 0.004510f, -0.119040f, -0.079281f, -0.044836f, 0.085468f, 0.150862f, 0.111181f, -0.008086f, -0.072516f, -0.070749f, -0.076794f, -0.031900f, 0.047623f, 0.107806f, 0.052183f, -0.021076f, -0.054978f, -0.040386f, 0.058062f, 0.040128f, -0.080490f, -0.098124f, -0.033613f, 0.013971f, 0.023914f, 0.110398f, -0.007314f, 0.039636f, -0.041975f, 0.031967f, -0.012918f, -0.141902f, 0.144984f, 0.120785f, -0.028039f, -0.078491f, 0.079219f, -0.182873f, -0.026340f, -0.016735f, 0.016552f, -0.130854f, -0.252620f, -0.302233f, 0.004013f, 0.297833f, 0.302971f, 0.117143f, -0.118876f, -0.080972f, -0.022568f}, - {-0.023121f, -0.022852f, -0.022326f, -0.021568f, -0.020616f, -0.019513f, -0.018315f, -0.017079f, -0.015867f, -0.014739f, -0.013755f, -0.012965f, -0.012415f, -0.012138f, -0.012157f, -0.012480f, -0.013101f, -0.014001f, -0.015146f, -0.016488f, -0.017970f, -0.019524f, -0.021074f, -0.022542f, -0.023848f, -0.024913f, -0.025665f, -0.026038f, -0.025979f, -0.025447f, -0.024416f, -0.022879f, -0.020843f, -0.018337f, -0.015404f, -0.012105f, -0.008515f, -0.004723f, -0.000825f, 0.003074f, 0.006867f, 0.010447f, 0.013710f, 0.016561f, 0.018913f, 0.020695f, 0.021850f, 0.022338f, 0.022141f, 0.021257f, 0.019706f, 0.017525f, 0.014769f, 0.011510f, 0.007830f, 0.003824f, -0.000408f, -0.004762f, -0.009133f, -0.013422f, -0.017535f, -0.021387f, -0.024907f, -0.028038f, -0.030737f, -0.032980f, -0.034759f, -0.036082f, -0.036974f, -0.037472f, -0.037625f, -0.037494f, -0.037141f, -0.036637f, -0.036049f, -0.035443f, -0.034879f, -0.034408f, -0.034071f, -0.033895f, -0.021504f, -0.013236f, 0.041524f, 0.010894f, -0.023477f, -0.049221f, 0.083276f, 0.127970f, 0.163269f, 0.021594f, -0.072866f, -0.165528f, -0.008057f, 0.026210f, -0.093974f, -0.136312f, - -0.127652f, -0.160700f, 0.083099f, 0.274765f, 0.025151f, 0.010641f, -0.072650f, -0.077463f, -0.058408f, 0.139417f, 0.095744f, 0.250590f, 0.020518f, 0.004510f, -0.119040f, -0.079281f, -0.044836f, 0.085468f, 0.150862f, 0.111181f, -0.008086f, -0.072516f, -0.070749f, -0.076794f, -0.031900f, 0.047623f, 0.107806f, 0.052183f, -0.021076f, -0.054978f, -0.040386f, 0.058062f, 0.040128f, -0.080490f, -0.098124f, -0.033613f, 0.013971f, 0.023914f, 0.110398f, -0.007314f, 0.039636f, -0.041975f, 0.031967f, -0.012918f, -0.141902f, 0.144984f, 0.120785f, -0.028039f, -0.078491f, 0.079219f, -0.182873f, -0.026340f, -0.016735f, 0.016552f, -0.130854f, -0.252620f, -0.302233f, 0.004013f, 0.297833f, 0.302971f, 0.117143f, -0.118876f, -0.080972f, -0.022568f} - }, - { - {0.034688f, 0.033944f, 0.032478f, 0.030329f, 0.027557f, 0.024237f, 0.020459f, 0.016325f, 0.011946f, 0.007436f, 0.002911f, -0.001515f, -0.005731f, -0.009639f, -0.013151f, -0.016191f, -0.018701f, -0.020640f, -0.021987f, -0.022735f, -0.022900f, -0.022511f, -0.021615f, -0.020272f, -0.018551f, -0.016532f, -0.014299f, -0.011939f, -0.009537f, -0.007177f, -0.004934f, -0.002876f, -0.001059f, 0.000471f, 0.001684f, 0.002562f, 0.003102f, 0.003313f, 0.003219f, 0.002853f, 0.002260f, 0.001489f, 0.000598f, -0.000354f, -0.001308f, -0.002205f, -0.002992f, -0.003619f, -0.004046f, -0.004242f, -0.004184f, -0.003860f, -0.003268f, -0.002418f, -0.001327f, -0.000022f, 0.001465f, 0.003095f, 0.004825f, 0.006610f, 0.008407f, 0.010173f, 0.011868f, 0.013457f, 0.014912f, 0.016210f, 0.017337f, 0.018284f, 0.019051f, 0.019646f, 0.020080f, 0.020372f, 0.020542f, 0.020616f, 0.020619f, 0.020575f, 0.020509f, 0.020440f, 0.020384f, 0.020353f, -0.013744f, -0.039606f, -0.038073f, -0.021709f, 0.011125f, 0.000688f, -0.055696f, 0.005090f, -0.073923f, -0.098478f, -0.068486f, -0.001483f, -0.054646f, 0.005715f, -0.020655f, -0.008419f, - -0.065972f, -0.030677f, 0.136130f, 0.158082f, -0.089988f, -0.028457f, 0.013578f, 0.105433f, 0.066346f, 0.035777f, 0.039117f, -0.028355f, -0.059865f, -0.059961f, 0.032987f, 0.093131f, -0.009634f, -0.065466f, -0.068966f, -0.004971f, 0.041955f, 0.100058f, 0.024953f, -0.005031f, -0.041486f, 0.032456f, 0.017195f, 0.092432f, 0.037094f, 0.014858f, -0.024121f, 0.000262f, -0.050715f, -0.054897f, -0.058748f, 0.078000f, 0.048332f, 0.028781f, -0.043575f, -0.102444f, -0.084352f, 0.009705f, 0.030990f, 0.041481f, 0.097902f, -0.093464f, -0.111859f, -0.067315f, 0.011407f, -0.023626f, 0.174361f, 0.128315f, 0.099916f, -0.030923f, -0.043553f, -0.093602f, 0.058886f, 0.063368f, 0.068266f, 0.058630f, 0.019437f, -0.126861f, -0.076242f, -0.027872f}, - {0.034688f, 0.033944f, 0.032478f, 0.030329f, 0.027557f, 0.024237f, 0.020459f, 0.016325f, 0.011946f, 0.007436f, 0.002911f, -0.001515f, -0.005731f, -0.009639f, -0.013151f, -0.016191f, -0.018701f, -0.020640f, -0.021987f, -0.022735f, -0.022900f, -0.022511f, -0.021615f, -0.020272f, -0.018551f, -0.016532f, -0.014299f, -0.011939f, -0.009537f, -0.007177f, -0.004934f, -0.002876f, -0.001059f, 0.000471f, 0.001684f, 0.002562f, 0.003102f, 0.003313f, 0.003219f, 0.002853f, 0.002260f, 0.001489f, 0.000598f, -0.000354f, -0.001308f, -0.002205f, -0.002992f, -0.003619f, -0.004046f, -0.004242f, -0.004184f, -0.003860f, -0.003268f, -0.002418f, -0.001327f, -0.000022f, 0.001465f, 0.003095f, 0.004825f, 0.006610f, 0.008407f, 0.010173f, 0.011868f, 0.013457f, 0.014912f, 0.016210f, 0.017337f, 0.018284f, 0.019051f, 0.019646f, 0.020080f, 0.020372f, 0.020542f, 0.020616f, 0.020619f, 0.020575f, 0.020509f, 0.020440f, 0.020384f, 0.020353f, -0.013744f, -0.039606f, -0.038073f, -0.021709f, 0.011125f, 0.000688f, -0.055696f, 0.005090f, -0.073923f, -0.098478f, -0.068486f, -0.001483f, -0.054646f, 0.005715f, -0.020655f, -0.008419f, - -0.065972f, -0.030677f, 0.136130f, 0.158082f, -0.089988f, -0.028457f, 0.013578f, 0.105433f, 0.066346f, 0.035777f, 0.039117f, -0.028355f, -0.059865f, -0.059961f, 0.032987f, 0.093131f, -0.009634f, -0.065466f, -0.068966f, -0.004971f, 0.041955f, 0.100058f, 0.024953f, -0.005031f, -0.041486f, 0.032456f, 0.017195f, 0.092432f, 0.037094f, 0.014858f, -0.024121f, 0.000262f, -0.050715f, -0.054897f, -0.058748f, 0.078000f, 0.048332f, 0.028781f, -0.043575f, -0.102444f, -0.084352f, 0.009705f, 0.030990f, 0.041481f, 0.097902f, -0.093464f, -0.111859f, -0.067315f, 0.011407f, -0.023626f, 0.174361f, 0.128315f, 0.099916f, -0.030923f, -0.043553f, -0.093602f, 0.058886f, 0.063368f, 0.068266f, 0.058630f, 0.019437f, -0.126861f, -0.076242f, -0.027872f} - }, - { - {0.020864f, 0.020628f, 0.020162f, 0.019480f, 0.018603f, 0.017556f, 0.016370f, 0.015079f, 0.013718f, 0.012325f, 0.010936f, 0.009588f, 0.008311f, 0.007135f, 0.006083f, 0.005172f, 0.004415f, 0.003816f, 0.003374f, 0.003082f, 0.002927f, 0.002891f, 0.002953f, 0.003086f, 0.003264f, 0.003461f, 0.003649f, 0.003803f, 0.003904f, 0.003932f, 0.003877f, 0.003730f, 0.003492f, 0.003167f, 0.002768f, 0.002310f, 0.001816f, 0.001313f, 0.000830f, 0.000398f, 0.000050f, -0.000182f, -0.000270f, -0.000186f, 0.000092f, 0.000581f, 0.001290f, 0.002224f, 0.003379f, 0.004744f, 0.006300f, 0.008023f, 0.009882f, 0.011841f, 0.013860f, 0.015896f, 0.017906f, 0.019847f, 0.021676f, 0.023356f, 0.024853f, 0.026138f, 0.027190f, 0.027995f, 0.028547f, 0.028848f, 0.028908f, 0.028744f, 0.028381f, 0.027849f, 0.027185f, 0.026425f, 0.025613f, 0.024788f, 0.023992f, 0.023264f, 0.022636f, 0.022138f, 0.021793f, 0.021617f, -0.006798f, -0.003380f, -0.005360f, -0.017063f, -0.024441f, 0.043640f, -0.014016f, -0.027673f, -0.004845f, -0.006445f, 0.066361f, 0.018852f, -0.028729f, 0.009025f, -0.075865f, -0.155041f, - -0.065489f, -0.024469f, 0.057814f, 0.045172f, -0.070320f, -0.017821f, 0.023709f, 0.091718f, 0.085051f, 0.038182f, 0.023982f, 0.035655f, -0.041871f, -0.058230f, -0.142784f, 0.010733f, 0.042238f, 0.012938f, 0.030339f, 0.040082f, -0.074463f, -0.094555f, -0.048446f, 0.012442f, 0.066522f, 0.105550f, 0.071961f, 0.023148f, -0.035299f, -0.018424f, -0.024981f, 0.052714f, 0.035572f, 0.020446f, -0.032645f, 0.007755f, -0.115069f, -0.015310f, 0.054485f, 0.019836f, 0.089972f, 0.082585f, -0.056621f, -0.120010f, 0.049043f, -0.064568f, 0.094450f, 0.076680f, 0.070013f, -0.072832f, -0.093618f, -0.007507f, 0.053902f, 0.078265f, 0.059600f, 0.027789f, 0.036114f, -0.078578f, -0.104827f, -0.034592f, 0.110081f, 0.044529f, -0.025476f, -0.014728f}, - {0.020864f, 0.020628f, 0.020162f, 0.019480f, 0.018603f, 0.017556f, 0.016370f, 0.015079f, 0.013718f, 0.012325f, 0.010936f, 0.009588f, 0.008311f, 0.007135f, 0.006083f, 0.005172f, 0.004415f, 0.003816f, 0.003374f, 0.003082f, 0.002927f, 0.002891f, 0.002953f, 0.003086f, 0.003264f, 0.003461f, 0.003649f, 0.003803f, 0.003904f, 0.003932f, 0.003877f, 0.003730f, 0.003492f, 0.003167f, 0.002768f, 0.002310f, 0.001816f, 0.001313f, 0.000830f, 0.000398f, 0.000050f, -0.000182f, -0.000270f, -0.000186f, 0.000092f, 0.000581f, 0.001290f, 0.002224f, 0.003379f, 0.004744f, 0.006300f, 0.008023f, 0.009882f, 0.011841f, 0.013860f, 0.015896f, 0.017906f, 0.019847f, 0.021676f, 0.023356f, 0.024853f, 0.026138f, 0.027190f, 0.027995f, 0.028547f, 0.028848f, 0.028908f, 0.028744f, 0.028381f, 0.027849f, 0.027185f, 0.026425f, 0.025613f, 0.024788f, 0.023992f, 0.023264f, 0.022636f, 0.022138f, 0.021793f, 0.021617f, -0.006798f, -0.003380f, -0.005360f, -0.017063f, -0.024441f, 0.043640f, -0.014016f, -0.027673f, -0.004845f, -0.006445f, 0.066361f, 0.018852f, -0.028729f, 0.009025f, -0.075865f, -0.155041f, - -0.065489f, -0.024469f, 0.057814f, 0.045172f, -0.070320f, -0.017821f, 0.023709f, 0.091718f, 0.085051f, 0.038182f, 0.023982f, 0.035655f, -0.041871f, -0.058230f, -0.142784f, 0.010733f, 0.042238f, 0.012938f, 0.030339f, 0.040082f, -0.074463f, -0.094555f, -0.048446f, 0.012442f, 0.066522f, 0.105550f, 0.071961f, 0.023148f, -0.035299f, -0.018424f, -0.024981f, 0.052714f, 0.035572f, 0.020446f, -0.032645f, 0.007755f, -0.115069f, -0.015310f, 0.054485f, 0.019836f, 0.089972f, 0.082585f, -0.056621f, -0.120010f, 0.049043f, -0.064568f, 0.094450f, 0.076680f, 0.070013f, -0.072832f, -0.093618f, -0.007507f, 0.053902f, 0.078265f, 0.059600f, 0.027789f, 0.036114f, -0.078578f, -0.104827f, -0.034592f, 0.110081f, 0.044529f, -0.025476f, -0.014728f} - } -}; -const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]={ - { - {0.000607f, 0.001803f, 0.002941f, 0.003987f, 0.004908f, 0.005676f, 0.006269f, 0.006670f, 0.006871f, 0.006869f, 0.006669f, 0.006284f, 0.005731f, 0.005035f, 0.004225f, 0.003335f, 0.002399f, 0.001456f, 0.000541f, -0.000310f, -0.001064f, -0.001692f, -0.002171f, -0.002481f, -0.002612f, -0.002559f, -0.002323f, -0.001912f, -0.001343f, -0.000635f, 0.000185f, 0.001087f, 0.002039f, 0.003006f, 0.003952f, 0.004845f, 0.005652f, 0.006344f, 0.006897f, 0.007292f, 0.007516f, 0.007561f, 0.007426f, 0.007117f, 0.006645f, 0.006027f, 0.005286f, 0.004447f, 0.003538f, 0.002591f, 0.001637f, 0.000706f, -0.000172f, -0.000971f, -0.001669f, -0.002246f, -0.002689f, -0.002991f, -0.003148f, -0.003164f, -0.003048f, -0.002812f, -0.002473f, -0.002053f, -0.001575f, -0.001062f, -0.000541f, -0.000035f, 0.000433f, 0.000842f, 0.001176f, 0.001423f, 0.001573f, 0.001623f, 0.001574f, 0.001432f, 0.001208f, 0.000914f, 0.000570f, 0.000194f, -0.459479f, -0.951950f, -0.610059f, 0.138191f, 0.698547f, 0.755794f, 0.243522f, -0.422384f, -0.808827f, -0.724027f, -0.130870f, 0.461622f, 0.869354f, 0.667862f, 0.030528f, -0.564204f, - -0.789139f, -0.468785f, 0.151851f, 0.678618f, 0.728923f, 0.337296f, -0.322960f, -0.700194f, -0.616049f, -0.096016f, 0.456132f, 0.702443f, 0.459349f, -0.073372f, -0.568805f, -0.671612f, -0.336520f, 0.244638f, 0.631826f, 0.616483f, 0.154529f, -0.375939f, -0.696641f, -0.506498f, -0.125118f, 0.355222f, 0.719377f, 0.553326f, 0.037725f, -0.527374f, -0.690573f, -0.394549f, 0.197449f, 0.629232f, 0.651166f, 0.208908f, -0.366272f, -0.701915f, -0.536790f, -0.016971f, 0.507334f, 0.650466f, 0.370984f, -0.166281f, -0.567325f, -0.572139f, -0.176415f, 0.334892f, 0.656461f, 0.489993f, -0.017768f, -0.524054f, -0.675884f, -0.371239f, 0.173392f, 0.605124f, 0.610706f, 0.200456f, -0.353918f, -0.678277f, -0.528640f, 0.011060f, 0.178932f, 0.016192f}, - {0.000607f, 0.001803f, 0.002941f, 0.003987f, 0.004908f, 0.005676f, 0.006269f, 0.006670f, 0.006871f, 0.006869f, 0.006669f, 0.006284f, 0.005731f, 0.005035f, 0.004225f, 0.003335f, 0.002399f, 0.001456f, 0.000541f, -0.000310f, -0.001064f, -0.001692f, -0.002171f, -0.002481f, -0.002612f, -0.002559f, -0.002323f, -0.001912f, -0.001343f, -0.000635f, 0.000185f, 0.001087f, 0.002039f, 0.003006f, 0.003952f, 0.004845f, 0.005652f, 0.006344f, 0.006897f, 0.007292f, 0.007516f, 0.007561f, 0.007426f, 0.007117f, 0.006645f, 0.006027f, 0.005286f, 0.004447f, 0.003538f, 0.002591f, 0.001637f, 0.000706f, -0.000172f, -0.000971f, -0.001669f, -0.002246f, -0.002689f, -0.002991f, -0.003148f, -0.003164f, -0.003048f, -0.002812f, -0.002473f, -0.002053f, -0.001575f, -0.001062f, -0.000541f, -0.000035f, 0.000433f, 0.000842f, 0.001176f, 0.001423f, 0.001573f, 0.001623f, 0.001574f, 0.001432f, 0.001208f, 0.000914f, 0.000570f, 0.000194f, -0.459479f, -0.951950f, -0.610059f, 0.138191f, 0.698547f, 0.755794f, 0.243522f, -0.422384f, -0.808827f, -0.724027f, -0.130870f, 0.461622f, 0.869354f, 0.667862f, 0.030528f, -0.564204f, - -0.789139f, -0.468785f, 0.151851f, 0.678618f, 0.728923f, 0.337296f, -0.322960f, -0.700194f, -0.616049f, -0.096016f, 0.456132f, 0.702443f, 0.459349f, -0.073372f, -0.568805f, -0.671612f, -0.336520f, 0.244638f, 0.631826f, 0.616483f, 0.154529f, -0.375939f, -0.696641f, -0.506498f, -0.125118f, 0.355222f, 0.719377f, 0.553326f, 0.037725f, -0.527374f, -0.690573f, -0.394549f, 0.197449f, 0.629232f, 0.651166f, 0.208908f, -0.366272f, -0.701915f, -0.536790f, -0.016971f, 0.507334f, 0.650466f, 0.370984f, -0.166281f, -0.567325f, -0.572139f, -0.176415f, 0.334892f, 0.656461f, 0.489993f, -0.017768f, -0.524054f, -0.675884f, -0.371239f, 0.173392f, 0.605124f, 0.610706f, 0.200456f, -0.353918f, -0.678277f, -0.528640f, 0.011060f, 0.178932f, 0.016192f} - }, - { - {-0.000028f, -0.000064f, -0.000047f, 0.000057f, 0.000277f, 0.000636f, 0.001148f, 0.001820f, 0.002652f, 0.003632f, 0.004741f, 0.005950f, 0.007223f, 0.008519f, 0.009791f, 0.010988f, 0.012060f, 0.012957f, 0.013630f, 0.014038f, 0.014144f, 0.013921f, 0.013351f, 0.012427f, 0.011152f, 0.009542f, 0.007624f, 0.005434f, 0.003019f, 0.000435f, -0.002256f, -0.004988f, -0.007692f, -0.010299f, -0.012741f, -0.014955f, -0.016883f, -0.018478f, -0.019699f, -0.020520f, -0.020923f, -0.020906f, -0.020476f, -0.019656f, -0.018475f, -0.016978f, -0.015215f, -0.013244f, -0.011126f, -0.008927f, -0.006712f, -0.004545f, -0.002485f, -0.000587f, 0.001104f, 0.002550f, 0.003724f, 0.004610f, 0.005201f, 0.005502f, 0.005529f, 0.005305f, 0.004864f, 0.004243f, 0.003487f, 0.002642f, 0.001754f, 0.000870f, 0.000034f, -0.000716f, -0.001348f, -0.001837f, -0.002165f, -0.002323f, -0.002313f, -0.002143f, -0.001829f, -0.001397f, -0.000875f, -0.000298f, 0.049516f, -0.016037f, -0.521945f, -0.600714f, -0.029292f, 0.813281f, 0.895652f, 0.289258f, -0.543355f, -0.625823f, -0.515181f, 0.034355f, 0.575869f, 0.500667f, 0.121120f, -0.361979f, - -0.606832f, -0.496113f, 0.005333f, 0.414143f, 0.580698f, 0.317632f, -0.123453f, -0.594664f, -0.557657f, -0.170560f, 0.347315f, 0.570357f, 0.524617f, 0.029358f, -0.385025f, -0.657018f, -0.442508f, 0.047188f, 0.566067f, 0.676706f, 0.403551f, -0.225043f, -0.701688f, -0.732583f, -0.153816f, 0.530671f, 0.759112f, 0.500505f, -0.145926f, -0.705732f, -0.797320f, -0.331604f, 0.352242f, 0.751981f, 0.630519f, 0.087976f, -0.520840f, -0.793402f, -0.527497f, 0.103267f, 0.614565f, 0.706032f, 0.311946f, -0.262008f, -0.694822f, -0.602989f, -0.144676f, 0.461612f, 0.706272f, 0.594113f, 0.074776f, -0.567699f, -0.848702f, -0.547886f, 0.099706f, 0.689166f, 0.802677f, 0.361753f, -0.323913f, -0.825131f, -0.715404f, -0.075227f, 0.194978f, 0.028869f}, - {0.000028f, 0.000064f, 0.000047f, -0.000057f, -0.000277f, -0.000636f, -0.001148f, -0.001820f, -0.002652f, -0.003632f, -0.004741f, -0.005950f, -0.007223f, -0.008519f, -0.009791f, -0.010988f, -0.012060f, -0.012957f, -0.013630f, -0.014038f, -0.014144f, -0.013921f, -0.013351f, -0.012427f, -0.011152f, -0.009542f, -0.007624f, -0.005434f, -0.003019f, -0.000435f, 0.002256f, 0.004988f, 0.007692f, 0.010299f, 0.012741f, 0.014955f, 0.016883f, 0.018478f, 0.019699f, 0.020520f, 0.020923f, 0.020906f, 0.020476f, 0.019656f, 0.018475f, 0.016978f, 0.015215f, 0.013244f, 0.011126f, 0.008927f, 0.006712f, 0.004545f, 0.002485f, 0.000587f, -0.001104f, -0.002550f, -0.003724f, -0.004610f, -0.005201f, -0.005502f, -0.005529f, -0.005305f, -0.004864f, -0.004243f, -0.003487f, -0.002642f, -0.001754f, -0.000870f, -0.000034f, 0.000716f, 0.001348f, 0.001837f, 0.002165f, 0.002323f, 0.002313f, 0.002143f, 0.001829f, 0.001397f, 0.000875f, 0.000298f, -0.049516f, 0.016037f, 0.521945f, 0.600714f, 0.029292f, -0.813281f, -0.895652f, -0.289258f, 0.543355f, 0.625823f, 0.515181f, -0.034355f, -0.575869f, -0.500667f, -0.121120f, 0.361979f, - 0.606832f, 0.496113f, -0.005333f, -0.414143f, -0.580698f, -0.317632f, 0.123453f, 0.594664f, 0.557657f, 0.170560f, -0.347315f, -0.570357f, -0.524617f, -0.029358f, 0.385025f, 0.657018f, 0.442508f, -0.047188f, -0.566067f, -0.676706f, -0.403551f, 0.225043f, 0.701688f, 0.732583f, 0.153816f, -0.530671f, -0.759112f, -0.500505f, 0.145926f, 0.705732f, 0.797320f, 0.331604f, -0.352242f, -0.751981f, -0.630519f, -0.087976f, 0.520840f, 0.793402f, 0.527497f, -0.103267f, -0.614565f, -0.706032f, -0.311946f, 0.262008f, 0.694822f, 0.602989f, 0.144676f, -0.461612f, -0.706272f, -0.594113f, -0.074776f, 0.567699f, 0.848702f, 0.547886f, -0.099706f, -0.689166f, -0.802677f, -0.361753f, 0.323913f, 0.825131f, 0.715404f, 0.075227f, -0.194978f, -0.028869f} - }, - { - {-0.002049f, -0.006137f, -0.010191f, -0.014189f, -0.018104f, -0.021908f, -0.025569f, -0.029052f, -0.032317f, -0.035324f, -0.038027f, -0.040382f, -0.042343f, -0.043866f, -0.044911f, -0.045440f, -0.045425f, -0.044844f, -0.043685f, -0.041947f, -0.039643f, -0.036797f, -0.033448f, -0.029645f, -0.025454f, -0.020950f, -0.016218f, -0.011354f, -0.006457f, -0.001632f, 0.003016f, 0.007386f, 0.011379f, 0.014907f, 0.017890f, 0.020262f, 0.021975f, 0.022994f, 0.023306f, 0.022916f, 0.021846f, 0.020138f, 0.017854f, 0.015067f, 0.011866f, 0.008351f, 0.004630f, 0.000813f, -0.002986f, -0.006656f, -0.010095f, -0.013206f, -0.015906f, -0.018127f, -0.019817f, -0.020943f, -0.021489f, -0.021460f, -0.020879f, -0.019786f, -0.018238f, -0.016306f, -0.014069f, -0.011618f, -0.009046f, -0.006448f, -0.003917f, -0.001539f, 0.000606f, 0.002452f, 0.003945f, 0.005047f, 0.005737f, 0.006012f, 0.005883f, 0.005383f, 0.004554f, 0.003455f, 0.002156f, 0.000733f, -0.053532f, -0.109196f, -0.086606f, 0.162774f, 0.099803f, -0.116839f, -0.089392f, 0.002755f, 0.080534f, 0.214951f, 0.393055f, 0.297771f, -0.042420f, 0.153547f, -0.076270f, -0.120569f, - -0.076604f, 0.071527f, 0.104329f, 0.154195f, 0.151670f, 0.126907f, -0.048054f, -0.206848f, -0.149739f, 0.103995f, 0.196515f, 0.126410f, -0.048876f, -0.168393f, -0.243439f, -0.096971f, 0.089561f, 0.213767f, 0.166510f, -0.022170f, -0.234052f, -0.229570f, -0.126619f, 0.074107f, -0.002399f, -0.073743f, 0.180669f, 0.201660f, 0.154371f, -0.075191f, -0.177736f, -0.194067f, -0.013786f, 0.187680f, 0.312445f, 0.144326f, -0.067784f, -0.307789f, -0.322030f, -0.101992f, 0.291143f, 0.459699f, 0.311581f, -0.124169f, -0.472205f, -0.547137f, -0.207796f, 0.230226f, 0.540592f, 0.296952f, -0.147969f, -0.489454f, -0.374088f, -0.015802f, 0.384106f, 0.405885f, 0.192708f, -0.211852f, -0.407725f, -0.306114f, 0.005897f, 0.206910f, 0.112954f, -0.018858f}, - {-0.002049f, -0.006137f, -0.010191f, -0.014189f, -0.018104f, -0.021908f, -0.025569f, -0.029052f, -0.032317f, -0.035324f, -0.038027f, -0.040382f, -0.042343f, -0.043866f, -0.044911f, -0.045440f, -0.045425f, -0.044844f, -0.043685f, -0.041947f, -0.039643f, -0.036797f, -0.033448f, -0.029645f, -0.025454f, -0.020950f, -0.016218f, -0.011354f, -0.006457f, -0.001632f, 0.003016f, 0.007386f, 0.011379f, 0.014907f, 0.017890f, 0.020262f, 0.021975f, 0.022994f, 0.023306f, 0.022916f, 0.021846f, 0.020138f, 0.017854f, 0.015067f, 0.011866f, 0.008351f, 0.004630f, 0.000813f, -0.002986f, -0.006656f, -0.010095f, -0.013206f, -0.015906f, -0.018127f, -0.019817f, -0.020943f, -0.021489f, -0.021460f, -0.020879f, -0.019786f, -0.018238f, -0.016306f, -0.014069f, -0.011618f, -0.009046f, -0.006448f, -0.003917f, -0.001539f, 0.000606f, 0.002452f, 0.003945f, 0.005047f, 0.005737f, 0.006012f, 0.005883f, 0.005383f, 0.004554f, 0.003455f, 0.002156f, 0.000733f, -0.053532f, -0.109196f, -0.086606f, 0.162774f, 0.099803f, -0.116839f, -0.089392f, 0.002755f, 0.080534f, 0.214951f, 0.393055f, 0.297771f, -0.042420f, 0.153547f, -0.076270f, -0.120569f, - -0.076604f, 0.071527f, 0.104329f, 0.154195f, 0.151670f, 0.126907f, -0.048054f, -0.206848f, -0.149739f, 0.103995f, 0.196515f, 0.126410f, -0.048876f, -0.168393f, -0.243439f, -0.096971f, 0.089561f, 0.213767f, 0.166510f, -0.022170f, -0.234052f, -0.229570f, -0.126619f, 0.074107f, -0.002399f, -0.073743f, 0.180669f, 0.201660f, 0.154371f, -0.075191f, -0.177736f, -0.194067f, -0.013786f, 0.187680f, 0.312445f, 0.144326f, -0.067784f, -0.307789f, -0.322030f, -0.101992f, 0.291143f, 0.459699f, 0.311581f, -0.124169f, -0.472205f, -0.547137f, -0.207796f, 0.230226f, 0.540592f, 0.296952f, -0.147969f, -0.489454f, -0.374088f, -0.015802f, 0.384106f, 0.405885f, 0.192708f, -0.211852f, -0.407725f, -0.306114f, 0.005897f, 0.206910f, 0.112954f, -0.018858f} - }, - { - {-0.002979f, -0.008865f, -0.014542f, -0.019875f, -0.024743f, -0.029039f, -0.032672f, -0.035573f, -0.037694f, -0.039013f, -0.039531f, -0.039270f, -0.038279f, -0.036624f, -0.034392f, -0.031683f, -0.028609f, -0.025289f, -0.021845f, -0.018401f, -0.015072f, -0.011968f, -0.009183f, -0.006800f, -0.004881f, -0.003472f, -0.002596f, -0.002257f, -0.002438f, -0.003104f, -0.004203f, -0.005666f, -0.007416f, -0.009364f, -0.011416f, -0.013477f, -0.015454f, -0.017259f, -0.018811f, -0.020042f, -0.020895f, -0.021330f, -0.021323f, -0.020864f, -0.019962f, -0.018642f, -0.016942f, -0.014912f, -0.012615f, -0.010120f, -0.007501f, -0.004836f, -0.002200f, 0.000335f, 0.002701f, 0.004842f, 0.006707f, 0.008262f, 0.009481f, 0.010354f, 0.010882f, 0.011077f, 0.010965f, 0.010580f, 0.009961f, 0.009156f, 0.008215f, 0.007188f, 0.006125f, 0.005072f, 0.004069f, 0.003150f, 0.002341f, 0.001658f, 0.001109f, 0.000692f, 0.000396f, 0.000204f, 0.000089f, 0.000024f, 0.018537f, -0.096517f, -0.083216f, -0.068111f, 0.126978f, -0.056448f, -0.042199f, -0.056482f, 0.074167f, -0.101773f, 0.145968f, 0.114355f, -0.071478f, 0.426941f, 0.538155f, 0.360363f, - -0.186372f, -0.505267f, -0.535014f, -0.210270f, 0.325886f, 0.716462f, 0.480627f, -0.077920f, -0.628838f, -0.734112f, -0.373618f, 0.360840f, 0.853482f, 0.697573f, 0.039156f, -0.676419f, -0.832215f, -0.419382f, 0.334418f, 0.737157f, 0.684616f, 0.031005f, -0.472156f, -0.677356f, -0.115395f, 0.531824f, 0.481723f, 0.216816f, -0.300102f, -0.550024f, -0.505144f, -0.111673f, 0.271949f, 0.498213f, 0.302390f, -0.032707f, -0.353690f, -0.393293f, -0.220326f, 0.106674f, 0.285470f, 0.295027f, 0.108805f, -0.127253f, -0.289592f, -0.237662f, -0.061127f, 0.192110f, 0.217903f, 0.245619f, 0.078096f, -0.183461f, -0.291423f, -0.188723f, 0.072156f, 0.188735f, 0.161749f, -0.007838f, -0.132645f, -0.168727f, -0.025125f, 0.068325f, 0.026307f, 0.002243f}, - {-0.002979f, -0.008865f, -0.014542f, -0.019875f, -0.024743f, -0.029039f, -0.032672f, -0.035573f, -0.037694f, -0.039013f, -0.039531f, -0.039270f, -0.038279f, -0.036624f, -0.034392f, -0.031683f, -0.028609f, -0.025289f, -0.021845f, -0.018401f, -0.015072f, -0.011968f, -0.009183f, -0.006800f, -0.004881f, -0.003472f, -0.002596f, -0.002257f, -0.002438f, -0.003104f, -0.004203f, -0.005666f, -0.007416f, -0.009364f, -0.011416f, -0.013477f, -0.015454f, -0.017259f, -0.018811f, -0.020042f, -0.020895f, -0.021330f, -0.021323f, -0.020864f, -0.019962f, -0.018642f, -0.016942f, -0.014912f, -0.012615f, -0.010120f, -0.007501f, -0.004836f, -0.002200f, 0.000335f, 0.002701f, 0.004842f, 0.006707f, 0.008262f, 0.009481f, 0.010354f, 0.010882f, 0.011077f, 0.010965f, 0.010580f, 0.009961f, 0.009156f, 0.008215f, 0.007188f, 0.006125f, 0.005072f, 0.004069f, 0.003150f, 0.002341f, 0.001658f, 0.001109f, 0.000692f, 0.000396f, 0.000204f, 0.000089f, 0.000024f, 0.018537f, -0.096517f, -0.083216f, -0.068111f, 0.126978f, -0.056448f, -0.042199f, -0.056482f, 0.074167f, -0.101773f, 0.145968f, 0.114355f, -0.071478f, 0.426941f, 0.538155f, 0.360363f, - -0.186372f, -0.505267f, -0.535014f, -0.210270f, 0.325886f, 0.716462f, 0.480627f, -0.077920f, -0.628838f, -0.734112f, -0.373618f, 0.360840f, 0.853482f, 0.697573f, 0.039156f, -0.676419f, -0.832215f, -0.419382f, 0.334418f, 0.737157f, 0.684616f, 0.031005f, -0.472156f, -0.677356f, -0.115395f, 0.531824f, 0.481723f, 0.216816f, -0.300102f, -0.550024f, -0.505144f, -0.111673f, 0.271949f, 0.498213f, 0.302390f, -0.032707f, -0.353690f, -0.393293f, -0.220326f, 0.106674f, 0.285470f, 0.295027f, 0.108805f, -0.127253f, -0.289592f, -0.237662f, -0.061127f, 0.192110f, 0.217903f, 0.245619f, 0.078096f, -0.183461f, -0.291423f, -0.188723f, 0.072156f, 0.188735f, 0.161749f, -0.007838f, -0.132645f, -0.168727f, -0.025125f, 0.068325f, 0.026307f, 0.002243f} - }, - { - {-0.001271f, -0.003806f, -0.006319f, -0.008795f, -0.011219f, -0.013571f, -0.015834f, -0.017985f, -0.020002f, -0.021861f, -0.023538f, -0.025008f, -0.026245f, -0.027228f, -0.027936f, -0.028352f, -0.028464f, -0.028264f, -0.027752f, -0.026933f, -0.025823f, -0.024440f, -0.022816f, -0.020986f, -0.018994f, -0.016889f, -0.014727f, -0.012565f, -0.010464f, -0.008486f, -0.006689f, -0.005131f, -0.003862f, -0.002926f, -0.002361f, -0.002191f, -0.002431f, -0.003086f, -0.004144f, -0.005586f, -0.007376f, -0.009470f, -0.011811f, -0.014337f, -0.016976f, -0.019652f, -0.022285f, -0.024798f, -0.027114f, -0.029160f, -0.030872f, -0.032194f, -0.033081f, -0.033500f, -0.033433f, -0.032875f, -0.031837f, -0.030342f, -0.028429f, -0.026147f, -0.023558f, -0.020731f, -0.017743f, -0.014674f, -0.011606f, -0.008619f, -0.005791f, -0.003191f, -0.000880f, 0.001090f, 0.002682f, 0.003872f, 0.004648f, 0.005017f, 0.004998f, 0.004624f, 0.003939f, 0.003003f, 0.001878f, 0.000639f, 0.010287f, -0.025862f, 0.003522f, -0.063971f, -0.010736f, -0.004017f, 0.065013f, 0.014935f, 0.011906f, 0.012134f, 0.059546f, 0.090188f, -0.032056f, 0.214094f, 0.315625f, 0.132257f, - -0.085677f, -0.176533f, -0.328515f, 0.006548f, 0.077254f, 0.172006f, 0.130077f, -0.050939f, -0.147319f, -0.175481f, -0.015915f, 0.183005f, 0.275542f, 0.163849f, -0.045876f, -0.231947f, -0.305143f, -0.103493f, 0.318577f, 0.372426f, 0.152045f, -0.142956f, -0.327595f, -0.317176f, 0.056505f, 0.373643f, 0.289109f, 0.066352f, -0.239115f, -0.369703f, -0.261113f, -0.021009f, 0.129663f, 0.303046f, 0.226674f, 0.047611f, -0.171431f, -0.269969f, -0.200202f, -0.019742f, 0.201558f, 0.202901f, 0.215602f, -0.179436f, -0.185167f, -0.199768f, -0.180089f, 0.056742f, 0.259194f, 0.198250f, -0.056107f, -0.255992f, -0.280588f, -0.053432f, 0.201582f, 0.267791f, 0.201270f, 0.005637f, -0.254080f, -0.299426f, -0.121162f, 0.120114f, 0.089266f, -0.000746f}, - {0.001271f, 0.003806f, 0.006319f, 0.008795f, 0.011219f, 0.013571f, 0.015834f, 0.017985f, 0.020002f, 0.021861f, 0.023538f, 0.025008f, 0.026245f, 0.027228f, 0.027936f, 0.028352f, 0.028464f, 0.028264f, 0.027752f, 0.026933f, 0.025823f, 0.024440f, 0.022816f, 0.020986f, 0.018994f, 0.016889f, 0.014727f, 0.012565f, 0.010464f, 0.008486f, 0.006689f, 0.005131f, 0.003862f, 0.002926f, 0.002361f, 0.002191f, 0.002431f, 0.003086f, 0.004144f, 0.005586f, 0.007376f, 0.009470f, 0.011811f, 0.014337f, 0.016976f, 0.019652f, 0.022285f, 0.024798f, 0.027114f, 0.029160f, 0.030872f, 0.032194f, 0.033081f, 0.033500f, 0.033433f, 0.032875f, 0.031837f, 0.030342f, 0.028429f, 0.026147f, 0.023558f, 0.020731f, 0.017743f, 0.014674f, 0.011606f, 0.008619f, 0.005791f, 0.003191f, 0.000880f, -0.001090f, -0.002682f, -0.003872f, -0.004648f, -0.005017f, -0.004998f, -0.004624f, -0.003939f, -0.003003f, -0.001878f, -0.000639f, -0.010287f, 0.025862f, -0.003522f, 0.063971f, 0.010736f, 0.004017f, -0.065013f, -0.014935f, -0.011906f, -0.012134f, -0.059546f, -0.090188f, 0.032056f, -0.214094f, -0.315625f, -0.132257f, - 0.085677f, 0.176533f, 0.328515f, -0.006548f, -0.077254f, -0.172006f, -0.130077f, 0.050939f, 0.147319f, 0.175481f, 0.015915f, -0.183005f, -0.275542f, -0.163849f, 0.045876f, 0.231947f, 0.305143f, 0.103493f, -0.318577f, -0.372426f, -0.152045f, 0.142956f, 0.327595f, 0.317176f, -0.056505f, -0.373643f, -0.289109f, -0.066352f, 0.239115f, 0.369703f, 0.261113f, 0.021009f, -0.129663f, -0.303046f, -0.226674f, -0.047611f, 0.171431f, 0.269969f, 0.200202f, 0.019742f, -0.201558f, -0.202901f, -0.215602f, 0.179436f, 0.185167f, 0.199768f, 0.180089f, -0.056742f, -0.259194f, -0.198250f, 0.056107f, 0.255992f, 0.280588f, 0.053432f, -0.201582f, -0.267791f, -0.201270f, -0.005637f, 0.254080f, 0.299426f, 0.121162f, -0.120114f, -0.089266f, 0.000746f} - }, - { - {-0.000422f, -0.001277f, -0.002162f, -0.003095f, -0.004091f, -0.005161f, -0.006311f, -0.007544f, -0.008852f, -0.010227f, -0.011651f, -0.013103f, -0.014557f, -0.015982f, -0.017346f, -0.018615f, -0.019755f, -0.020732f, -0.021517f, -0.022084f, -0.022411f, -0.022485f, -0.022297f, -0.021847f, -0.021144f, -0.020204f, -0.019048f, -0.017708f, -0.016220f, -0.014625f, -0.012968f, -0.011295f, -0.009655f, -0.008093f, -0.006653f, -0.005373f, -0.004289f, -0.003426f, -0.002802f, -0.002429f, -0.002307f, -0.002428f, -0.002776f, -0.003325f, -0.004044f, -0.004894f, -0.005832f, -0.006811f, -0.007785f, -0.008704f, -0.009524f, -0.010204f, -0.010706f, -0.011001f, -0.011067f, -0.010890f, -0.010467f, -0.009803f, -0.008912f, -0.007818f, -0.006551f, -0.005150f, -0.003656f, -0.002118f, -0.000584f, 0.000896f, 0.002275f, 0.003508f, 0.004556f, 0.005386f, 0.005974f, 0.006302f, 0.006362f, 0.006159f, 0.005703f, 0.005015f, 0.004125f, 0.003070f, 0.001892f, 0.000639f, 0.000874f, -0.009172f, 0.023843f, -0.041505f, -0.009350f, 0.003922f, -0.020028f, -0.094046f, 0.052693f, 0.228541f, 0.219444f, 0.055538f, -0.168216f, 0.262500f, 0.274549f, 0.105242f, - -0.095691f, -0.096583f, -0.189003f, 0.038250f, 0.080178f, 0.150798f, 0.117774f, -0.002444f, -0.089614f, -0.015171f, 0.036019f, -0.011500f, 0.023508f, -0.065226f, 0.117525f, 0.110962f, 0.095450f, -0.020307f, -0.110097f, -0.162295f, -0.073784f, 0.049988f, 0.119861f, 0.115686f, 0.042856f, -0.048324f, -0.038860f, -0.091620f, -0.060945f, -0.003739f, -0.001925f, 0.034329f, -0.047167f, 0.023862f, 0.043742f, -0.002122f, -0.029370f, -0.067574f, -0.061597f, 0.017295f, 0.125612f, 0.154726f, 0.032113f, -0.142604f, -0.178638f, -0.178711f, -0.050331f, 0.121150f, 0.166307f, 0.090444f, -0.066326f, -0.192987f, -0.107998f, 0.069844f, 0.218412f, 0.105896f, -0.096378f, -0.313954f, -0.225068f, 0.010541f, 0.290160f, 0.197862f, 0.008664f, -0.018292f}, - {0.000422f, 0.001277f, 0.002162f, 0.003095f, 0.004091f, 0.005161f, 0.006311f, 0.007544f, 0.008852f, 0.010227f, 0.011651f, 0.013103f, 0.014557f, 0.015982f, 0.017346f, 0.018615f, 0.019755f, 0.020732f, 0.021517f, 0.022084f, 0.022411f, 0.022485f, 0.022297f, 0.021847f, 0.021144f, 0.020204f, 0.019048f, 0.017708f, 0.016220f, 0.014625f, 0.012968f, 0.011295f, 0.009655f, 0.008093f, 0.006653f, 0.005373f, 0.004289f, 0.003426f, 0.002802f, 0.002429f, 0.002307f, 0.002428f, 0.002776f, 0.003325f, 0.004044f, 0.004894f, 0.005832f, 0.006811f, 0.007785f, 0.008704f, 0.009524f, 0.010204f, 0.010706f, 0.011001f, 0.011067f, 0.010890f, 0.010467f, 0.009803f, 0.008912f, 0.007818f, 0.006551f, 0.005150f, 0.003656f, 0.002118f, 0.000584f, -0.000896f, -0.002275f, -0.003508f, -0.004556f, -0.005386f, -0.005974f, -0.006302f, -0.006362f, -0.006159f, -0.005703f, -0.005015f, -0.004125f, -0.003070f, -0.001892f, -0.000639f, -0.000874f, 0.009172f, -0.023843f, 0.041505f, 0.009350f, -0.003922f, 0.020028f, 0.094046f, -0.052693f, -0.228541f, -0.219444f, -0.055538f, 0.168216f, -0.262500f, -0.274549f, -0.105242f, - 0.095691f, 0.096583f, 0.189003f, -0.038250f, -0.080178f, -0.150798f, -0.117774f, 0.002444f, 0.089614f, 0.015171f, -0.036019f, 0.011500f, -0.023508f, 0.065226f, -0.117525f, -0.110962f, -0.095450f, 0.020307f, 0.110097f, 0.162295f, 0.073784f, -0.049988f, -0.119861f, -0.115686f, -0.042856f, 0.048324f, 0.038860f, 0.091620f, 0.060945f, 0.003739f, 0.001925f, -0.034329f, 0.047167f, -0.023862f, -0.043742f, 0.002122f, 0.029370f, 0.067574f, 0.061597f, -0.017295f, -0.125612f, -0.154726f, -0.032113f, 0.142604f, 0.178638f, 0.178711f, 0.050331f, -0.121150f, -0.166307f, -0.090444f, 0.066326f, 0.192987f, 0.107998f, -0.069844f, -0.218412f, -0.105896f, 0.096378f, 0.313954f, 0.225068f, -0.010541f, -0.290160f, -0.197862f, -0.008664f, 0.018292f} - }, - { - {0.000526f, 0.001528f, 0.002380f, 0.002988f, 0.003270f, 0.003158f, 0.002603f, 0.001572f, 0.000058f, -0.001926f, -0.004346f, -0.007147f, -0.010252f, -0.013572f, -0.017003f, -0.020433f, -0.023745f, -0.026825f, -0.029561f, -0.031852f, -0.033611f, -0.034767f, -0.035272f, -0.035100f, -0.034248f, -0.032740f, -0.030623f, -0.027968f, -0.024868f, -0.021431f, -0.017782f, -0.014055f, -0.010386f, -0.006916f, -0.003776f, -0.001091f, 0.001031f, 0.002501f, 0.003251f, 0.003239f, 0.002447f, 0.000887f, -0.001404f, -0.004360f, -0.007895f, -0.011901f, -0.016251f, -0.020809f, -0.025429f, -0.029963f, -0.034266f, -0.038199f, -0.041639f, -0.044477f, -0.046626f, -0.048022f, -0.048626f, -0.048426f, -0.047439f, -0.045703f, -0.043285f, -0.040270f, -0.036762f, -0.032879f, -0.028747f, -0.024497f, -0.020259f, -0.016157f, -0.012304f, -0.008801f, -0.005727f, -0.003143f, -0.001085f, 0.000434f, 0.001426f, 0.001925f, 0.001988f, 0.001692f, 0.001126f, 0.000394f, 0.000377f, -0.004315f, 0.090374f, 0.028043f, -0.111509f, -0.071921f, -0.048123f, -0.059930f, 0.018585f, 0.180009f, 0.179706f, 0.053170f, -0.080109f, 0.203490f, 0.181306f, 0.087950f, - 0.202835f, 0.201270f, 0.109761f, -0.098069f, -0.005379f, 0.038498f, 0.004876f, 0.131472f, 0.196808f, 0.306935f, 0.136389f, -0.167915f, -0.169671f, -0.201512f, -0.030400f, 0.060340f, 0.275389f, 0.355090f, -0.074280f, -0.350298f, -0.380008f, -0.121118f, 0.078095f, 0.469865f, 0.156853f, -0.070127f, -0.116803f, -0.216734f, -0.033254f, 0.195144f, 0.232857f, -0.072946f, -0.518533f, -0.463226f, -0.050250f, 0.324958f, 0.555663f, 0.309110f, -0.070454f, -0.467882f, -0.439207f, -0.251808f, 0.240861f, 0.045852f, 0.246108f, 0.058463f, -0.269844f, -0.250916f, 0.103022f, -0.096435f, -0.322138f, -0.151651f, 0.043486f, 0.269199f, 0.226042f, 0.156135f, 0.005328f, -0.013613f, -0.187280f, -0.099045f, -0.136306f, 0.023148f, 0.048837f, 0.021336f}, - {0.000526f, 0.001528f, 0.002380f, 0.002988f, 0.003270f, 0.003158f, 0.002603f, 0.001572f, 0.000058f, -0.001926f, -0.004346f, -0.007147f, -0.010252f, -0.013572f, -0.017003f, -0.020433f, -0.023745f, -0.026825f, -0.029561f, -0.031852f, -0.033611f, -0.034767f, -0.035272f, -0.035100f, -0.034248f, -0.032740f, -0.030623f, -0.027968f, -0.024868f, -0.021431f, -0.017782f, -0.014055f, -0.010386f, -0.006916f, -0.003776f, -0.001091f, 0.001031f, 0.002501f, 0.003251f, 0.003239f, 0.002447f, 0.000887f, -0.001404f, -0.004360f, -0.007895f, -0.011901f, -0.016251f, -0.020809f, -0.025429f, -0.029963f, -0.034266f, -0.038199f, -0.041639f, -0.044477f, -0.046626f, -0.048022f, -0.048626f, -0.048426f, -0.047439f, -0.045703f, -0.043285f, -0.040270f, -0.036762f, -0.032879f, -0.028747f, -0.024497f, -0.020259f, -0.016157f, -0.012304f, -0.008801f, -0.005727f, -0.003143f, -0.001085f, 0.000434f, 0.001426f, 0.001925f, 0.001988f, 0.001692f, 0.001126f, 0.000394f, 0.000377f, -0.004315f, 0.090374f, 0.028043f, -0.111509f, -0.071921f, -0.048123f, -0.059930f, 0.018585f, 0.180009f, 0.179706f, 0.053170f, -0.080109f, 0.203490f, 0.181306f, 0.087950f, - 0.202835f, 0.201270f, 0.109761f, -0.098069f, -0.005379f, 0.038498f, 0.004876f, 0.131472f, 0.196808f, 0.306935f, 0.136389f, -0.167915f, -0.169671f, -0.201512f, -0.030400f, 0.060340f, 0.275389f, 0.355090f, -0.074280f, -0.350298f, -0.380008f, -0.121118f, 0.078095f, 0.469865f, 0.156853f, -0.070127f, -0.116803f, -0.216734f, -0.033254f, 0.195144f, 0.232857f, -0.072946f, -0.518533f, -0.463226f, -0.050250f, 0.324958f, 0.555663f, 0.309110f, -0.070454f, -0.467882f, -0.439207f, -0.251808f, 0.240861f, 0.045852f, 0.246108f, 0.058463f, -0.269844f, -0.250916f, 0.103022f, -0.096435f, -0.322138f, -0.151651f, 0.043486f, 0.269199f, 0.226042f, 0.156135f, 0.005328f, -0.013613f, -0.187280f, -0.099045f, -0.136306f, 0.023148f, 0.048837f, 0.021336f} - }, - { - {-0.002594f, -0.007712f, -0.012620f, -0.017185f, -0.021288f, -0.024824f, -0.027705f, -0.029870f, -0.031276f, -0.031910f, -0.031781f, -0.030924f, -0.029396f, -0.027276f, -0.024661f, -0.021660f, -0.018394f, -0.014987f, -0.011567f, -0.008255f, -0.005167f, -0.002405f, -0.000055f, 0.001814f, 0.003156f, 0.003943f, 0.004175f, 0.003871f, 0.003071f, 0.001837f, 0.000245f, -0.001616f, -0.003644f, -0.005734f, -0.007780f, -0.009677f, -0.011328f, -0.012647f, -0.013560f, -0.014012f, -0.013966f, -0.013404f, -0.012331f, -0.010768f, -0.008761f, -0.006369f, -0.003667f, -0.000745f, 0.002303f, 0.005375f, 0.008369f, 0.011187f, 0.013736f, 0.015934f, 0.017713f, 0.019021f, 0.019821f, 0.020099f, 0.019857f, 0.019117f, 0.017919f, 0.016319f, 0.014386f, 0.012201f, 0.009851f, 0.007428f, 0.005024f, 0.002726f, 0.000617f, -0.001232f, -0.002763f, -0.003932f, -0.004714f, -0.005098f, -0.005093f, -0.004726f, -0.004038f, -0.003084f, -0.001932f, -0.000658f, -0.012474f, -0.068409f, 0.081137f, 0.018024f, -0.038156f, -0.198590f, -0.119597f, 0.145225f, 0.030798f, 0.246762f, 0.335612f, 0.283146f, 0.025065f, 0.021730f, 0.026732f, 0.074654f, - -0.011328f, -0.043913f, 0.087894f, -0.028229f, 0.021072f, -0.015218f, -0.005244f, -0.008447f, 0.003756f, -0.028338f, 0.020207f, 0.006246f, -0.029437f, -0.039636f, 0.036150f, 0.052762f, 0.055867f, -0.002273f, 0.056749f, 0.072060f, 0.125021f, -0.022258f, -0.103383f, -0.101215f, 0.051122f, 0.255149f, 0.083638f, -0.008516f, -0.206175f, -0.242208f, -0.099596f, 0.098204f, 0.220255f, 0.238644f, 0.067428f, -0.101735f, -0.242515f, -0.144450f, 0.001750f, 0.191021f, 0.214892f, 0.175162f, -0.065258f, -0.003858f, -0.178822f, -0.105369f, 0.148433f, 0.235889f, 0.048148f, 0.214517f, 0.280683f, -0.041329f, -0.275217f, -0.446013f, -0.180500f, 0.131700f, 0.348173f, 0.110471f, -0.088639f, -0.346427f, -0.207886f, -0.015941f, 0.061582f, 0.008943f}, - {-0.002594f, -0.007712f, -0.012620f, -0.017185f, -0.021288f, -0.024824f, -0.027705f, -0.029870f, -0.031276f, -0.031910f, -0.031781f, -0.030924f, -0.029396f, -0.027276f, -0.024661f, -0.021660f, -0.018394f, -0.014987f, -0.011567f, -0.008255f, -0.005167f, -0.002405f, -0.000055f, 0.001814f, 0.003156f, 0.003943f, 0.004175f, 0.003871f, 0.003071f, 0.001837f, 0.000245f, -0.001616f, -0.003644f, -0.005734f, -0.007780f, -0.009677f, -0.011328f, -0.012647f, -0.013560f, -0.014012f, -0.013966f, -0.013404f, -0.012331f, -0.010768f, -0.008761f, -0.006369f, -0.003667f, -0.000745f, 0.002303f, 0.005375f, 0.008369f, 0.011187f, 0.013736f, 0.015934f, 0.017713f, 0.019021f, 0.019821f, 0.020099f, 0.019857f, 0.019117f, 0.017919f, 0.016319f, 0.014386f, 0.012201f, 0.009851f, 0.007428f, 0.005024f, 0.002726f, 0.000617f, -0.001232f, -0.002763f, -0.003932f, -0.004714f, -0.005098f, -0.005093f, -0.004726f, -0.004038f, -0.003084f, -0.001932f, -0.000658f, -0.012474f, -0.068409f, 0.081137f, 0.018024f, -0.038156f, -0.198590f, -0.119597f, 0.145225f, 0.030798f, 0.246762f, 0.335612f, 0.283146f, 0.025065f, 0.021730f, 0.026732f, 0.074654f, - -0.011328f, -0.043913f, 0.087894f, -0.028229f, 0.021072f, -0.015218f, -0.005244f, -0.008447f, 0.003756f, -0.028338f, 0.020207f, 0.006246f, -0.029437f, -0.039636f, 0.036150f, 0.052762f, 0.055867f, -0.002273f, 0.056749f, 0.072060f, 0.125021f, -0.022258f, -0.103383f, -0.101215f, 0.051122f, 0.255149f, 0.083638f, -0.008516f, -0.206175f, -0.242208f, -0.099596f, 0.098204f, 0.220255f, 0.238644f, 0.067428f, -0.101735f, -0.242515f, -0.144450f, 0.001750f, 0.191021f, 0.214892f, 0.175162f, -0.065258f, -0.003858f, -0.178822f, -0.105369f, 0.148433f, 0.235889f, 0.048148f, 0.214517f, 0.280683f, -0.041329f, -0.275217f, -0.446013f, -0.180500f, 0.131700f, 0.348173f, 0.110471f, -0.088639f, -0.346427f, -0.207886f, -0.015941f, 0.061582f, 0.008943f} - }, - { - {-0.001692f, -0.005028f, -0.008216f, -0.011163f, -0.013784f, -0.015999f, -0.017743f, -0.018963f, -0.019618f, -0.019685f, -0.019158f, -0.018044f, -0.016368f, -0.014170f, -0.011503f, -0.008432f, -0.005034f, -0.001394f, 0.002400f, 0.006252f, 0.010069f, 0.013758f, 0.017231f, 0.020405f, 0.023206f, 0.025572f, 0.027450f, 0.028802f, 0.029603f, 0.029841f, 0.029520f, 0.028655f, 0.027275f, 0.025421f, 0.023143f, 0.020501f, 0.017560f, 0.014391f, 0.011068f, 0.007665f, 0.004257f, 0.000915f, -0.002296f, -0.005315f, -0.008088f, -0.010571f, -0.012727f, -0.014530f, -0.015961f, -0.017015f, -0.017691f, -0.018000f, -0.017960f, -0.017595f, -0.016937f, -0.016020f, -0.014885f, -0.013572f, -0.012124f, -0.010586f, -0.008998f, -0.007401f, -0.005833f, -0.004328f, -0.002917f, -0.001626f, -0.000476f, 0.000517f, 0.001341f, 0.001989f, 0.002459f, 0.002753f, 0.002880f, 0.002848f, 0.002672f, 0.002368f, 0.001958f, 0.001461f, 0.000902f, 0.000305f, 0.052321f, -0.018258f, -0.014124f, -0.007458f, 0.085842f, 0.029245f, 0.127256f, 0.076902f, 0.062256f, -0.207538f, -0.265521f, -0.146999f, 0.049472f, 0.221169f, 0.277951f, 0.057988f, - -0.163846f, -0.207114f, -0.156198f, -0.020525f, 0.023538f, 0.008611f, -0.073772f, -0.004242f, 0.012621f, 0.045953f, 0.085524f, 0.034636f, -0.040649f, -0.135494f, -0.246060f, -0.068648f, 0.063436f, 0.214739f, 0.183131f, 0.017595f, -0.223861f, -0.242391f, -0.153182f, 0.140545f, 0.085957f, 0.013702f, 0.005574f, -0.030685f, -0.047703f, -0.053997f, 0.043684f, 0.077892f, -0.121951f, -0.094316f, -0.020622f, 0.048746f, 0.099422f, 0.132104f, 0.049686f, -0.051357f, -0.107707f, -0.102422f, -0.027663f, 0.017056f, 0.121416f, 0.099038f, -0.013366f, -0.137160f, -0.169993f, -0.174993f, -0.068867f, 0.136114f, 0.298336f, 0.217147f, 0.060197f, -0.132593f, -0.302768f, -0.377783f, -0.187963f, 0.111969f, 0.290674f, 0.187006f, -0.004044f, -0.005747f}, - {-0.001692f, -0.005028f, -0.008216f, -0.011163f, -0.013784f, -0.015999f, -0.017743f, -0.018963f, -0.019618f, -0.019685f, -0.019158f, -0.018044f, -0.016368f, -0.014170f, -0.011503f, -0.008432f, -0.005034f, -0.001394f, 0.002400f, 0.006252f, 0.010069f, 0.013758f, 0.017231f, 0.020405f, 0.023206f, 0.025572f, 0.027450f, 0.028802f, 0.029603f, 0.029841f, 0.029520f, 0.028655f, 0.027275f, 0.025421f, 0.023143f, 0.020501f, 0.017560f, 0.014391f, 0.011068f, 0.007665f, 0.004257f, 0.000915f, -0.002296f, -0.005315f, -0.008088f, -0.010571f, -0.012727f, -0.014530f, -0.015961f, -0.017015f, -0.017691f, -0.018000f, -0.017960f, -0.017595f, -0.016937f, -0.016020f, -0.014885f, -0.013572f, -0.012124f, -0.010586f, -0.008998f, -0.007401f, -0.005833f, -0.004328f, -0.002917f, -0.001626f, -0.000476f, 0.000517f, 0.001341f, 0.001989f, 0.002459f, 0.002753f, 0.002880f, 0.002848f, 0.002672f, 0.002368f, 0.001958f, 0.001461f, 0.000902f, 0.000305f, 0.052321f, -0.018258f, -0.014124f, -0.007458f, 0.085842f, 0.029245f, 0.127256f, 0.076902f, 0.062256f, -0.207538f, -0.265521f, -0.146999f, 0.049472f, 0.221169f, 0.277951f, 0.057988f, - -0.163846f, -0.207114f, -0.156198f, -0.020525f, 0.023538f, 0.008611f, -0.073772f, -0.004242f, 0.012621f, 0.045953f, 0.085524f, 0.034636f, -0.040649f, -0.135494f, -0.246060f, -0.068648f, 0.063436f, 0.214739f, 0.183131f, 0.017595f, -0.223861f, -0.242391f, -0.153182f, 0.140545f, 0.085957f, 0.013702f, 0.005574f, -0.030685f, -0.047703f, -0.053997f, 0.043684f, 0.077892f, -0.121951f, -0.094316f, -0.020622f, 0.048746f, 0.099422f, 0.132104f, 0.049686f, -0.051357f, -0.107707f, -0.102422f, -0.027663f, 0.017056f, 0.121416f, 0.099038f, -0.013366f, -0.137160f, -0.169993f, -0.174993f, -0.068867f, 0.136114f, 0.298336f, 0.217147f, 0.060197f, -0.132593f, -0.302768f, -0.377783f, -0.187963f, 0.111969f, 0.290674f, 0.187006f, -0.004044f, -0.005747f} - }, - { - {-0.000558f, -0.001666f, -0.002744f, -0.003775f, -0.004741f, -0.005625f, -0.006412f, -0.007089f, -0.007643f, -0.008067f, -0.008352f, -0.008496f, -0.008497f, -0.008358f, -0.008085f, -0.007687f, -0.007176f, -0.006567f, -0.005880f, -0.005135f, -0.004356f, -0.003569f, -0.002801f, -0.002080f, -0.001434f, -0.000891f, -0.000478f, -0.000218f, -0.000135f, -0.000246f, -0.000566f, -0.001105f, -0.001866f, -0.002850f, -0.004049f, -0.005450f, -0.007035f, -0.008780f, -0.010654f, -0.012624f, -0.014652f, -0.016695f, -0.018712f, -0.020655f, -0.022482f, -0.024149f, -0.025614f, -0.026839f, -0.027792f, -0.028446f, -0.028779f, -0.028778f, -0.028436f, -0.027756f, -0.026748f, -0.025430f, -0.023827f, -0.021974f, -0.019908f, -0.017674f, -0.015321f, -0.012901f, -0.010465f, -0.008068f, -0.005760f, -0.003590f, -0.001603f, 0.000163f, 0.001675f, 0.002908f, 0.003846f, 0.004482f, 0.004816f, 0.004858f, 0.004627f, 0.004150f, 0.003460f, 0.002599f, 0.001611f, 0.000546f, -0.003770f, 0.007996f, 0.005573f, 0.016472f, 0.007182f, 0.044288f, 0.011606f, -0.007505f, -0.062271f, 0.017093f, 0.068697f, 0.092675f, -0.020103f, -0.156687f, -0.258295f, -0.046116f, - 0.049780f, 0.114779f, 0.121823f, 0.014310f, 0.050240f, 0.051792f, -0.064670f, -0.151209f, 0.009424f, 0.066156f, 0.084879f, 0.123221f, 0.031022f, -0.025727f, -0.025793f, -0.123459f, -0.062745f, 0.067638f, 0.121865f, 0.061490f, -0.090830f, -0.111481f, -0.066207f, 0.040890f, 0.153123f, 0.064350f, -0.048007f, -0.108089f, -0.125505f, -0.055847f, 0.066616f, 0.080845f, 0.058894f, 0.044339f, 0.007831f, 0.014588f, -0.023608f, -0.060232f, -0.028704f, -0.015617f, 0.008922f, 0.020130f, 0.115085f, -0.084148f, -0.032057f, -0.027896f, -0.178202f, -0.035726f, 0.103966f, -0.004503f, -0.107328f, -0.051314f, 0.040183f, 0.106784f, 0.123118f, 0.050550f, -0.031071f, -0.123654f, -0.125188f, 0.033855f, 0.170898f, 0.080395f, -0.029415f, 0.001535f}, - {0.000558f, 0.001666f, 0.002744f, 0.003775f, 0.004741f, 0.005625f, 0.006412f, 0.007089f, 0.007643f, 0.008067f, 0.008352f, 0.008496f, 0.008497f, 0.008358f, 0.008085f, 0.007687f, 0.007176f, 0.006567f, 0.005880f, 0.005135f, 0.004356f, 0.003569f, 0.002801f, 0.002080f, 0.001434f, 0.000891f, 0.000478f, 0.000218f, 0.000135f, 0.000246f, 0.000566f, 0.001105f, 0.001866f, 0.002850f, 0.004049f, 0.005450f, 0.007035f, 0.008780f, 0.010654f, 0.012624f, 0.014652f, 0.016695f, 0.018712f, 0.020655f, 0.022482f, 0.024149f, 0.025614f, 0.026839f, 0.027792f, 0.028446f, 0.028779f, 0.028778f, 0.028436f, 0.027756f, 0.026748f, 0.025430f, 0.023827f, 0.021974f, 0.019908f, 0.017674f, 0.015321f, 0.012901f, 0.010465f, 0.008068f, 0.005760f, 0.003590f, 0.001603f, -0.000163f, -0.001675f, -0.002908f, -0.003846f, -0.004482f, -0.004816f, -0.004858f, -0.004627f, -0.004150f, -0.003460f, -0.002599f, -0.001611f, -0.000546f, 0.003770f, -0.007996f, -0.005573f, -0.016472f, -0.007182f, -0.044288f, -0.011606f, 0.007505f, 0.062271f, -0.017093f, -0.068697f, -0.092675f, 0.020103f, 0.156687f, 0.258295f, 0.046116f, - -0.049780f, -0.114779f, -0.121823f, -0.014310f, -0.050240f, -0.051792f, 0.064670f, 0.151209f, -0.009424f, -0.066156f, -0.084879f, -0.123221f, -0.031022f, 0.025727f, 0.025793f, 0.123459f, 0.062745f, -0.067638f, -0.121865f, -0.061490f, 0.090830f, 0.111481f, 0.066207f, -0.040890f, -0.153123f, -0.064350f, 0.048007f, 0.108089f, 0.125505f, 0.055847f, -0.066616f, -0.080845f, -0.058894f, -0.044339f, -0.007831f, -0.014588f, 0.023608f, 0.060232f, 0.028704f, 0.015617f, -0.008922f, -0.020130f, -0.115085f, 0.084148f, 0.032057f, 0.027896f, 0.178202f, 0.035726f, -0.103966f, 0.004503f, 0.107328f, 0.051314f, -0.040183f, -0.106784f, -0.123118f, -0.050550f, 0.031071f, 0.123654f, 0.125188f, -0.033855f, -0.170898f, -0.080395f, 0.029415f, -0.001535f} - }, - { - {0.000862f, 0.002556f, 0.004157f, 0.005606f, 0.006850f, 0.007842f, 0.008545f, 0.008928f, 0.008973f, 0.008674f, 0.008032f, 0.007065f, 0.005796f, 0.004261f, 0.002503f, 0.000572f, -0.001476f, -0.003582f, -0.005686f, -0.007728f, -0.009650f, -0.011400f, -0.012929f, -0.014196f, -0.015171f, -0.015829f, -0.016158f, -0.016154f, -0.015822f, -0.015178f, -0.014245f, -0.013053f, -0.011640f, -0.010045f, -0.008313f, -0.006489f, -0.004618f, -0.002742f, -0.000902f, 0.000867f, 0.002535f, 0.004078f, 0.005479f, 0.006727f, 0.007819f, 0.008758f, 0.009553f, 0.010216f, 0.010766f, 0.011222f, 0.011608f, 0.011945f, 0.012255f, 0.012557f, 0.012867f, 0.013199f, 0.013560f, 0.013952f, 0.014374f, 0.014816f, 0.015268f, 0.015710f, 0.016124f, 0.016484f, 0.016766f, 0.016942f, 0.016989f, 0.016882f, 0.016600f, 0.016127f, 0.015449f, 0.014561f, 0.013461f, 0.012156f, 0.010657f, 0.008982f, 0.007154f, 0.005202f, 0.003159f, 0.001059f, 0.023448f, 0.005825f, -0.022065f, -0.036579f, -0.016601f, -0.039625f, -0.054493f, -0.094171f, -0.105878f, 0.148193f, 0.209846f, 0.052288f, -0.006002f, 0.049658f, 0.028289f, -0.014931f, - 0.041590f, 0.089350f, 0.005856f, 0.044491f, -0.012375f, -0.061657f, 0.039654f, -0.012926f, 0.101497f, 0.021184f, 0.055042f, -0.077356f, -0.100797f, 0.005554f, 0.024743f, 0.019643f, -0.047675f, -0.021206f, 0.021776f, 0.022907f, 0.057359f, 0.057288f, -0.061156f, -0.036074f, -0.012394f, 0.046598f, 0.064612f, 0.016399f, -0.062802f, -0.118880f, -0.064031f, 0.021831f, -0.004281f, 0.062860f, 0.102262f, 0.063315f, -0.050738f, -0.078626f, -0.040798f, 0.042795f, 0.103842f, 0.131407f, -0.012216f, -0.012968f, -0.147305f, -0.093946f, 0.099562f, 0.170198f, 0.054699f, 0.159959f, 0.064843f, -0.126388f, -0.082527f, -0.075983f, 0.091236f, 0.113720f, 0.068035f, -0.142226f, -0.248413f, -0.166680f, -0.111711f, -0.032544f, 0.089623f, -0.019143f}, - {-0.000862f, -0.002556f, -0.004157f, -0.005606f, -0.006850f, -0.007842f, -0.008545f, -0.008928f, -0.008973f, -0.008674f, -0.008032f, -0.007065f, -0.005796f, -0.004261f, -0.002503f, -0.000572f, 0.001476f, 0.003582f, 0.005686f, 0.007728f, 0.009650f, 0.011400f, 0.012929f, 0.014196f, 0.015171f, 0.015829f, 0.016158f, 0.016154f, 0.015822f, 0.015178f, 0.014245f, 0.013053f, 0.011640f, 0.010045f, 0.008313f, 0.006489f, 0.004618f, 0.002742f, 0.000902f, -0.000867f, -0.002535f, -0.004078f, -0.005479f, -0.006727f, -0.007819f, -0.008758f, -0.009553f, -0.010216f, -0.010766f, -0.011222f, -0.011608f, -0.011945f, -0.012255f, -0.012557f, -0.012867f, -0.013199f, -0.013560f, -0.013952f, -0.014374f, -0.014816f, -0.015268f, -0.015710f, -0.016124f, -0.016484f, -0.016766f, -0.016942f, -0.016989f, -0.016882f, -0.016600f, -0.016127f, -0.015449f, -0.014561f, -0.013461f, -0.012156f, -0.010657f, -0.008982f, -0.007154f, -0.005202f, -0.003159f, -0.001059f, -0.023448f, -0.005825f, 0.022065f, 0.036579f, 0.016601f, 0.039625f, 0.054493f, 0.094171f, 0.105878f, -0.148193f, -0.209846f, -0.052288f, 0.006002f, -0.049658f, -0.028289f, 0.014931f, - -0.041590f, -0.089350f, -0.005856f, -0.044491f, 0.012375f, 0.061657f, -0.039654f, 0.012926f, -0.101497f, -0.021184f, -0.055042f, 0.077356f, 0.100797f, -0.005554f, -0.024743f, -0.019643f, 0.047675f, 0.021206f, -0.021776f, -0.022907f, -0.057359f, -0.057288f, 0.061156f, 0.036074f, 0.012394f, -0.046598f, -0.064612f, -0.016399f, 0.062802f, 0.118880f, 0.064031f, -0.021831f, 0.004281f, -0.062860f, -0.102262f, -0.063315f, 0.050738f, 0.078626f, 0.040798f, -0.042795f, -0.103842f, -0.131407f, 0.012216f, 0.012968f, 0.147305f, 0.093946f, -0.099562f, -0.170198f, -0.054699f, -0.159959f, -0.064843f, 0.126388f, 0.082527f, 0.075983f, -0.091236f, -0.113720f, -0.068035f, 0.142226f, 0.248413f, 0.166680f, 0.111711f, 0.032544f, -0.089623f, 0.019143f} - }, - { - {0.002838f, 0.008432f, 0.013783f, 0.018737f, 0.023156f, 0.026916f, 0.029917f, 0.032084f, 0.033369f, 0.033752f, 0.033243f, 0.031880f, 0.029728f, 0.026877f, 0.023436f, 0.019533f, 0.015308f, 0.010907f, 0.006479f, 0.002172f, -0.001878f, -0.005545f, -0.008720f, -0.011315f, -0.013266f, -0.014533f, -0.015101f, -0.014982f, -0.014214f, -0.012856f, -0.010989f, -0.008711f, -0.006132f, -0.003373f, -0.000558f, 0.002190f, 0.004751f, 0.007016f, 0.008888f, 0.010286f, 0.011150f, 0.011440f, 0.011137f, 0.010247f, 0.008796f, 0.006831f, 0.004417f, 0.001634f, -0.001424f, -0.004656f, -0.007955f, -0.011217f, -0.014336f, -0.017218f, -0.019776f, -0.021940f, -0.023652f, -0.024875f, -0.025587f, -0.025788f, -0.025492f, -0.024734f, -0.023560f, -0.022031f, -0.020217f, -0.018193f, -0.016039f, -0.013833f, -0.011651f, -0.009559f, -0.007617f, -0.005872f, -0.004357f, -0.003092f, -0.002082f, -0.001315f, -0.000769f, -0.000408f, -0.000187f, -0.000052f, -0.032260f, 0.033530f, -0.015083f, 0.002969f, -0.029097f, 0.006049f, -0.162991f, -0.104632f, 0.022061f, 0.115641f, 0.098353f, 0.071940f, 0.020150f, 0.220503f, 0.076297f, -0.054021f, - -0.123732f, -0.059160f, 0.065687f, 0.048633f, -0.021224f, -0.090388f, -0.047552f, -0.073986f, -0.001862f, 0.017505f, 0.031101f, 0.052275f, 0.045599f, 0.002273f, -0.071046f, -0.120569f, -0.092279f, 0.091367f, 0.131120f, 0.081603f, -0.005236f, -0.045101f, -0.126606f, 0.063292f, 0.010243f, -0.173430f, -0.029654f, -0.041122f, 0.128891f, 0.149425f, 0.109340f, -0.140884f, -0.253227f, -0.245313f, 0.003423f, 0.227577f, 0.418611f, 0.180603f, -0.007698f, -0.355744f, -0.397453f, -0.237559f, 0.177173f, 0.166279f, 0.281223f, 0.134825f, -0.161094f, -0.180949f, -0.014477f, -0.137344f, -0.120363f, -0.006787f, -0.072081f, -0.045147f, -0.078544f, 0.079862f, 0.147038f, 0.191205f, 0.028206f, -0.067228f, -0.245851f, -0.108712f, 0.005946f, 0.041767f}, - {-0.002838f, -0.008432f, -0.013783f, -0.018737f, -0.023156f, -0.026916f, -0.029917f, -0.032084f, -0.033369f, -0.033752f, -0.033243f, -0.031880f, -0.029728f, -0.026877f, -0.023436f, -0.019533f, -0.015308f, -0.010907f, -0.006479f, -0.002172f, 0.001878f, 0.005545f, 0.008720f, 0.011315f, 0.013266f, 0.014533f, 0.015101f, 0.014982f, 0.014214f, 0.012856f, 0.010989f, 0.008711f, 0.006132f, 0.003373f, 0.000558f, -0.002190f, -0.004751f, -0.007016f, -0.008888f, -0.010286f, -0.011150f, -0.011440f, -0.011137f, -0.010247f, -0.008796f, -0.006831f, -0.004417f, -0.001634f, 0.001424f, 0.004656f, 0.007955f, 0.011217f, 0.014336f, 0.017218f, 0.019776f, 0.021940f, 0.023652f, 0.024875f, 0.025587f, 0.025788f, 0.025492f, 0.024734f, 0.023560f, 0.022031f, 0.020217f, 0.018193f, 0.016039f, 0.013833f, 0.011651f, 0.009559f, 0.007617f, 0.005872f, 0.004357f, 0.003092f, 0.002082f, 0.001315f, 0.000769f, 0.000408f, 0.000187f, 0.000052f, 0.032260f, -0.033530f, 0.015083f, -0.002969f, 0.029097f, -0.006049f, 0.162991f, 0.104632f, -0.022061f, -0.115641f, -0.098353f, -0.071940f, -0.020150f, -0.220503f, -0.076297f, 0.054021f, - 0.123732f, 0.059160f, -0.065687f, -0.048633f, 0.021224f, 0.090388f, 0.047552f, 0.073986f, 0.001862f, -0.017505f, -0.031101f, -0.052275f, -0.045599f, -0.002273f, 0.071046f, 0.120569f, 0.092279f, -0.091367f, -0.131120f, -0.081603f, 0.005236f, 0.045101f, 0.126606f, -0.063292f, -0.010243f, 0.173430f, 0.029654f, 0.041122f, -0.128891f, -0.149425f, -0.109340f, 0.140884f, 0.253227f, 0.245313f, -0.003423f, -0.227577f, -0.418611f, -0.180603f, 0.007698f, 0.355744f, 0.397453f, 0.237559f, -0.177173f, -0.166279f, -0.281223f, -0.134825f, 0.161094f, 0.180949f, 0.014477f, 0.137344f, 0.120363f, 0.006787f, 0.072081f, 0.045147f, 0.078544f, -0.079862f, -0.147038f, -0.191205f, -0.028206f, 0.067228f, 0.245851f, 0.108712f, -0.005946f, -0.041767f} - }, - { - {0.001417f, 0.004213f, 0.006899f, 0.009406f, 0.011674f, 0.013652f, 0.015305f, 0.016608f, 0.017553f, 0.018149f, 0.018418f, 0.018397f, 0.018136f, 0.017694f, 0.017137f, 0.016538f, 0.015967f, 0.015493f, 0.015180f, 0.015080f, 0.015235f, 0.015670f, 0.016397f, 0.017407f, 0.018674f, 0.020154f, 0.021789f, 0.023502f, 0.025209f, 0.026812f, 0.028212f, 0.029308f, 0.030000f, 0.030198f, 0.029822f, 0.028808f, 0.027110f, 0.024706f, 0.021593f, 0.017795f, 0.013362f, 0.008367f, 0.002904f, -0.002910f, -0.008943f, -0.015050f, -0.021075f, -0.026863f, -0.032258f, -0.037112f, -0.041288f, -0.044668f, -0.047156f, -0.048678f, -0.049192f, -0.048682f, -0.047166f, -0.044690f, -0.041333f, -0.037198f, -0.032413f, -0.027126f, -0.021500f, -0.015708f, -0.009928f, -0.004333f, 0.000909f, 0.005646f, 0.009741f, 0.013084f, 0.015591f, 0.017208f, 0.017913f, 0.017715f, 0.016657f, 0.014812f, 0.012282f, 0.009191f, 0.005685f, 0.001924f, -0.037055f, 0.016619f, -0.044855f, 0.019307f, -0.046802f, 0.052235f, 0.029452f, -0.090642f, -0.084602f, 0.021858f, -0.092365f, -0.083654f, 0.048261f, -0.100817f, -0.290582f, -0.107580f, - 0.169082f, 0.221924f, 0.238889f, -0.137615f, 0.012779f, 0.194037f, 0.175402f, -0.026204f, -0.167182f, -0.108575f, -0.081142f, 0.067975f, 0.225941f, 0.184811f, 0.043057f, -0.140596f, -0.169342f, -0.108633f, 0.036195f, 0.127169f, 0.170863f, 0.027724f, -0.060391f, -0.103888f, -0.095562f, 0.017380f, 0.139349f, 0.137799f, 0.028598f, -0.119610f, -0.152271f, -0.068246f, -0.031898f, 0.036047f, 0.120064f, 0.127166f, 0.152684f, 0.025783f, -0.081842f, -0.292260f, -0.231206f, -0.064232f, 0.219482f, 0.037531f, 0.140152f, 0.094400f, -0.105524f, -0.184059f, -0.070996f, -0.192582f, -0.235947f, 0.029902f, 0.090350f, 0.157738f, 0.002441f, -0.003316f, -0.036480f, 0.201197f, 0.025254f, 0.086645f, -0.302854f, -0.271850f, 0.039836f, 0.008343f}, - {0.001417f, 0.004213f, 0.006899f, 0.009406f, 0.011674f, 0.013652f, 0.015305f, 0.016608f, 0.017553f, 0.018149f, 0.018418f, 0.018397f, 0.018136f, 0.017694f, 0.017137f, 0.016538f, 0.015967f, 0.015493f, 0.015180f, 0.015080f, 0.015235f, 0.015670f, 0.016397f, 0.017407f, 0.018674f, 0.020154f, 0.021789f, 0.023502f, 0.025209f, 0.026812f, 0.028212f, 0.029308f, 0.030000f, 0.030198f, 0.029822f, 0.028808f, 0.027110f, 0.024706f, 0.021593f, 0.017795f, 0.013362f, 0.008367f, 0.002904f, -0.002910f, -0.008943f, -0.015050f, -0.021075f, -0.026863f, -0.032258f, -0.037112f, -0.041288f, -0.044668f, -0.047156f, -0.048678f, -0.049192f, -0.048682f, -0.047166f, -0.044690f, -0.041333f, -0.037198f, -0.032413f, -0.027126f, -0.021500f, -0.015708f, -0.009928f, -0.004333f, 0.000909f, 0.005646f, 0.009741f, 0.013084f, 0.015591f, 0.017208f, 0.017913f, 0.017715f, 0.016657f, 0.014812f, 0.012282f, 0.009191f, 0.005685f, 0.001924f, -0.037055f, 0.016619f, -0.044855f, 0.019307f, -0.046802f, 0.052235f, 0.029452f, -0.090642f, -0.084602f, 0.021858f, -0.092365f, -0.083654f, 0.048261f, -0.100817f, -0.290582f, -0.107580f, - 0.169082f, 0.221924f, 0.238889f, -0.137615f, 0.012779f, 0.194037f, 0.175402f, -0.026204f, -0.167182f, -0.108575f, -0.081142f, 0.067975f, 0.225941f, 0.184811f, 0.043057f, -0.140596f, -0.169342f, -0.108633f, 0.036195f, 0.127169f, 0.170863f, 0.027724f, -0.060391f, -0.103888f, -0.095562f, 0.017380f, 0.139349f, 0.137799f, 0.028598f, -0.119610f, -0.152271f, -0.068246f, -0.031898f, 0.036047f, 0.120064f, 0.127166f, 0.152684f, 0.025783f, -0.081842f, -0.292260f, -0.231206f, -0.064232f, 0.219482f, 0.037531f, 0.140152f, 0.094400f, -0.105524f, -0.184059f, -0.070996f, -0.192582f, -0.235947f, 0.029902f, 0.090350f, 0.157738f, 0.002441f, -0.003316f, -0.036480f, 0.201197f, 0.025254f, 0.086645f, -0.302854f, -0.271850f, 0.039836f, 0.008343f} - }, - { - {0.000678f, 0.002005f, 0.003245f, 0.004342f, 0.005251f, 0.005932f, 0.006358f, 0.006511f, 0.006390f, 0.006004f, 0.005376f, 0.004542f, 0.003548f, 0.002449f, 0.001309f, 0.000193f, -0.000829f, -0.001692f, -0.002332f, -0.002695f, -0.002734f, -0.002415f, -0.001719f, -0.000640f, 0.000810f, 0.002605f, 0.004701f, 0.007042f, 0.009559f, 0.012171f, 0.014789f, 0.017321f, 0.019670f, 0.021745f, 0.023456f, 0.024724f, 0.025479f, 0.025666f, 0.025247f, 0.024200f, 0.022524f, 0.020235f, 0.017369f, 0.013981f, 0.010140f, 0.005932f, 0.001453f, -0.003193f, -0.007894f, -0.012539f, -0.017017f, -0.021225f, -0.025065f, -0.028453f, -0.031320f, -0.033611f, -0.035290f, -0.036339f, -0.036761f, -0.036573f, -0.035812f, -0.034531f, -0.032792f, -0.030672f, -0.028253f, -0.025620f, -0.022861f, -0.020061f, -0.017297f, -0.014642f, -0.012154f, -0.009880f, -0.007853f, -0.006092f, -0.004597f, -0.003358f, -0.002349f, -0.001532f, -0.000859f, -0.000276f, -0.001478f, 0.043843f, 0.014752f, -0.018881f, -0.016664f, 0.070932f, 0.100190f, 0.017333f, -0.088039f, -0.193031f, -0.136385f, -0.038987f, 0.093755f, -0.091169f, -0.063585f, -0.021465f, - 0.067888f, 0.136567f, 0.333335f, -0.026602f, -0.089426f, -0.069872f, -0.017664f, 0.016592f, 0.180053f, 0.100658f, 0.081240f, -0.052269f, -0.183656f, -0.094968f, -0.097229f, 0.062112f, 0.073215f, 0.132789f, -0.018266f, -0.096281f, -0.159036f, -0.059303f, -0.038813f, 0.030417f, 0.064639f, 0.086041f, -0.010160f, -0.081758f, -0.083045f, -0.029956f, 0.028823f, 0.030263f, -0.098869f, -0.074274f, 0.013947f, 0.079593f, 0.036589f, 0.070035f, -0.017284f, -0.058669f, -0.016308f, -0.063333f, 0.040365f, -0.137154f, 0.098537f, 0.099193f, -0.103408f, -0.161889f, 0.019474f, -0.105259f, -0.098933f, 0.078835f, -0.040012f, -0.050375f, -0.163213f, -0.008125f, 0.189076f, 0.445716f, 0.196394f, -0.035165f, -0.260981f, -0.127357f, -0.001061f, 0.023980f}, - {0.000678f, 0.002005f, 0.003245f, 0.004342f, 0.005251f, 0.005932f, 0.006358f, 0.006511f, 0.006390f, 0.006004f, 0.005376f, 0.004542f, 0.003548f, 0.002449f, 0.001309f, 0.000193f, -0.000829f, -0.001692f, -0.002332f, -0.002695f, -0.002734f, -0.002415f, -0.001719f, -0.000640f, 0.000810f, 0.002605f, 0.004701f, 0.007042f, 0.009559f, 0.012171f, 0.014789f, 0.017321f, 0.019670f, 0.021745f, 0.023456f, 0.024724f, 0.025479f, 0.025666f, 0.025247f, 0.024200f, 0.022524f, 0.020235f, 0.017369f, 0.013981f, 0.010140f, 0.005932f, 0.001453f, -0.003193f, -0.007894f, -0.012539f, -0.017017f, -0.021225f, -0.025065f, -0.028453f, -0.031320f, -0.033611f, -0.035290f, -0.036339f, -0.036761f, -0.036573f, -0.035812f, -0.034531f, -0.032792f, -0.030672f, -0.028253f, -0.025620f, -0.022861f, -0.020061f, -0.017297f, -0.014642f, -0.012154f, -0.009880f, -0.007853f, -0.006092f, -0.004597f, -0.003358f, -0.002349f, -0.001532f, -0.000859f, -0.000276f, -0.001478f, 0.043843f, 0.014752f, -0.018881f, -0.016664f, 0.070932f, 0.100190f, 0.017333f, -0.088039f, -0.193031f, -0.136385f, -0.038987f, 0.093755f, -0.091169f, -0.063585f, -0.021465f, - 0.067888f, 0.136567f, 0.333335f, -0.026602f, -0.089426f, -0.069872f, -0.017664f, 0.016592f, 0.180053f, 0.100658f, 0.081240f, -0.052269f, -0.183656f, -0.094968f, -0.097229f, 0.062112f, 0.073215f, 0.132789f, -0.018266f, -0.096281f, -0.159036f, -0.059303f, -0.038813f, 0.030417f, 0.064639f, 0.086041f, -0.010160f, -0.081758f, -0.083045f, -0.029956f, 0.028823f, 0.030263f, -0.098869f, -0.074274f, 0.013947f, 0.079593f, 0.036589f, 0.070035f, -0.017284f, -0.058669f, -0.016308f, -0.063333f, 0.040365f, -0.137154f, 0.098537f, 0.099193f, -0.103408f, -0.161889f, 0.019474f, -0.105259f, -0.098933f, 0.078835f, -0.040012f, -0.050375f, -0.163213f, -0.008125f, 0.189076f, 0.445716f, 0.196394f, -0.035165f, -0.260981f, -0.127357f, -0.001061f, 0.023980f} - }, - { - {-0.002408f, -0.007164f, -0.011740f, -0.016022f, -0.019904f, -0.023293f, -0.026111f, -0.028295f, -0.029802f, -0.030607f, -0.030708f, -0.030118f, -0.028874f, -0.027028f, -0.024647f, -0.021813f, -0.018618f, -0.015159f, -0.011540f, -0.007865f, -0.004233f, -0.000740f, 0.002528f, 0.005496f, 0.008101f, 0.010297f, 0.012051f, 0.013349f, 0.014191f, 0.014593f, 0.014587f, 0.014214f, 0.013529f, 0.012594f, 0.011477f, 0.010247f, 0.008977f, 0.007734f, 0.006583f, 0.005581f, 0.004776f, 0.004206f, 0.003897f, 0.003865f, 0.004111f, 0.004627f, 0.005393f, 0.006379f, 0.007547f, 0.008852f, 0.010246f, 0.011676f, 0.013091f, 0.014440f, 0.015676f, 0.016757f, 0.017647f, 0.018320f, 0.018756f, 0.018945f, 0.018885f, 0.018584f, 0.018055f, 0.017321f, 0.016409f, 0.015350f, 0.014179f, 0.012929f, 0.011636f, 0.010331f, 0.009044f, 0.007799f, 0.006615f, 0.005505f, 0.004475f, 0.003527f, 0.002653f, 0.001845f, 0.001086f, 0.000359f, 0.003451f, -0.025273f, 0.031934f, 0.008073f, 0.036383f, -0.059115f, 0.015201f, -0.027867f, -0.036472f, 0.006728f, 0.089776f, 0.031569f, 0.052924f, 0.052550f, 0.036035f, 0.026876f, - 0.046325f, 0.144330f, 0.148471f, -0.098440f, -0.070547f, 0.075999f, 0.075345f, 0.056472f, -0.047392f, -0.016216f, -0.060330f, -0.063398f, -0.017374f, 0.045235f, 0.090822f, -0.025879f, -0.075482f, -0.028323f, 0.051387f, 0.075571f, 0.081483f, 0.000095f, -0.046879f, -0.036083f, 0.022425f, 0.036351f, 0.026749f, 0.010041f, -0.069061f, -0.048783f, -0.047015f, -0.027634f, -0.048952f, 0.007175f, 0.058529f, 0.075508f, -0.057571f, -0.037875f, -0.107202f, 0.001530f, 0.044873f, 0.111928f, 0.002121f, 0.069973f, -0.097021f, -0.088849f, 0.011183f, 0.116610f, 0.058783f, 0.143659f, 0.103156f, -0.039348f, -0.097690f, -0.106951f, -0.044435f, 0.033247f, 0.096534f, -0.020143f, -0.010372f, -0.080353f, -0.122396f, -0.107125f, 0.051493f, -0.012680f}, - {-0.002408f, -0.007164f, -0.011740f, -0.016022f, -0.019904f, -0.023293f, -0.026111f, -0.028295f, -0.029802f, -0.030607f, -0.030708f, -0.030118f, -0.028874f, -0.027028f, -0.024647f, -0.021813f, -0.018618f, -0.015159f, -0.011540f, -0.007865f, -0.004233f, -0.000740f, 0.002528f, 0.005496f, 0.008101f, 0.010297f, 0.012051f, 0.013349f, 0.014191f, 0.014593f, 0.014587f, 0.014214f, 0.013529f, 0.012594f, 0.011477f, 0.010247f, 0.008977f, 0.007734f, 0.006583f, 0.005581f, 0.004776f, 0.004206f, 0.003897f, 0.003865f, 0.004111f, 0.004627f, 0.005393f, 0.006379f, 0.007547f, 0.008852f, 0.010246f, 0.011676f, 0.013091f, 0.014440f, 0.015676f, 0.016757f, 0.017647f, 0.018320f, 0.018756f, 0.018945f, 0.018885f, 0.018584f, 0.018055f, 0.017321f, 0.016409f, 0.015350f, 0.014179f, 0.012929f, 0.011636f, 0.010331f, 0.009044f, 0.007799f, 0.006615f, 0.005505f, 0.004475f, 0.003527f, 0.002653f, 0.001845f, 0.001086f, 0.000359f, 0.003451f, -0.025273f, 0.031934f, 0.008073f, 0.036383f, -0.059115f, 0.015201f, -0.027867f, -0.036472f, 0.006728f, 0.089776f, 0.031569f, 0.052924f, 0.052550f, 0.036035f, 0.026876f, - 0.046325f, 0.144330f, 0.148471f, -0.098440f, -0.070547f, 0.075999f, 0.075345f, 0.056472f, -0.047392f, -0.016216f, -0.060330f, -0.063398f, -0.017374f, 0.045235f, 0.090822f, -0.025879f, -0.075482f, -0.028323f, 0.051387f, 0.075571f, 0.081483f, 0.000095f, -0.046879f, -0.036083f, 0.022425f, 0.036351f, 0.026749f, 0.010041f, -0.069061f, -0.048783f, -0.047015f, -0.027634f, -0.048952f, 0.007175f, 0.058529f, 0.075508f, -0.057571f, -0.037875f, -0.107202f, 0.001530f, 0.044873f, 0.111928f, 0.002121f, 0.069973f, -0.097021f, -0.088849f, 0.011183f, 0.116610f, 0.058783f, 0.143659f, 0.103156f, -0.039348f, -0.097690f, -0.106951f, -0.044435f, 0.033247f, 0.096534f, -0.020143f, -0.010372f, -0.080353f, -0.122396f, -0.107125f, 0.051493f, -0.012680f} - }, - { - {-0.000769f, -0.002289f, -0.003749f, -0.005115f, -0.006352f, -0.007430f, -0.008327f, -0.009024f, -0.009511f, -0.009782f, -0.009840f, -0.009694f, -0.009361f, -0.008859f, -0.008215f, -0.007457f, -0.006616f, -0.005724f, -0.004812f, -0.003911f, -0.003047f, -0.002244f, -0.001520f, -0.000889f, -0.000357f, 0.000073f, 0.000406f, 0.000654f, 0.000831f, 0.000957f, 0.001057f, 0.001156f, 0.001281f, 0.001459f, 0.001716f, 0.002074f, 0.002553f, 0.003168f, 0.003926f, 0.004831f, 0.005879f, 0.007059f, 0.008354f, 0.009742f, 0.011192f, 0.012674f, 0.014150f, 0.015581f, 0.016930f, 0.018156f, 0.019224f, 0.020100f, 0.020757f, 0.021171f, 0.021326f, 0.021214f, 0.020833f, 0.020192f, 0.019304f, 0.018191f, 0.016883f, 0.015413f, 0.013821f, 0.012147f, 0.010437f, 0.008733f, 0.007078f, 0.005512f, 0.004070f, 0.002782f, 0.001673f, 0.000758f, 0.000045f, -0.000464f, -0.000778f, -0.000910f, -0.000885f, -0.000730f, -0.000477f, -0.000166f, 0.008996f, -0.007501f, 0.003669f, -0.015821f, 0.037905f, 0.006306f, -0.038948f, 0.013367f, 0.009375f, 0.033153f, 0.012381f, -0.076053f, -0.024165f, -0.049333f, -0.093735f, 0.015389f, - 0.103849f, 0.086389f, 0.092310f, -0.047303f, 0.013689f, 0.074313f, 0.090886f, 0.049559f, -0.015663f, -0.052549f, -0.016329f, -0.076266f, -0.061826f, -0.063511f, 0.039646f, 0.123095f, 0.014255f, 0.014006f, 0.012179f, -0.051475f, -0.067447f, 0.041413f, 0.086814f, 0.105537f, 0.082272f, 0.021088f, -0.042444f, -0.065750f, -0.031024f, 0.002792f, 0.034656f, 0.036967f, -0.025911f, -0.038597f, -0.025850f, -0.024307f, -0.026230f, 0.141877f, 0.011333f, 0.059458f, 0.006121f, -0.057907f, -0.144673f, 0.083071f, 0.022746f, 0.048092f, 0.089863f, -0.028500f, -0.070405f, -0.107009f, 0.050452f, 0.079530f, 0.065303f, 0.007590f, -0.037520f, -0.038727f, -0.076749f, -0.091653f, 0.029711f, 0.108371f, 0.063467f, -0.081410f, -0.017582f, -0.012313f}, - {-0.000769f, -0.002289f, -0.003749f, -0.005115f, -0.006352f, -0.007430f, -0.008327f, -0.009024f, -0.009511f, -0.009782f, -0.009840f, -0.009694f, -0.009361f, -0.008859f, -0.008215f, -0.007457f, -0.006616f, -0.005724f, -0.004812f, -0.003911f, -0.003047f, -0.002244f, -0.001520f, -0.000889f, -0.000357f, 0.000073f, 0.000406f, 0.000654f, 0.000831f, 0.000957f, 0.001057f, 0.001156f, 0.001281f, 0.001459f, 0.001716f, 0.002074f, 0.002553f, 0.003168f, 0.003926f, 0.004831f, 0.005879f, 0.007059f, 0.008354f, 0.009742f, 0.011192f, 0.012674f, 0.014150f, 0.015581f, 0.016930f, 0.018156f, 0.019224f, 0.020100f, 0.020757f, 0.021171f, 0.021326f, 0.021214f, 0.020833f, 0.020192f, 0.019304f, 0.018191f, 0.016883f, 0.015413f, 0.013821f, 0.012147f, 0.010437f, 0.008733f, 0.007078f, 0.005512f, 0.004070f, 0.002782f, 0.001673f, 0.000758f, 0.000045f, -0.000464f, -0.000778f, -0.000910f, -0.000885f, -0.000730f, -0.000477f, -0.000166f, 0.008996f, -0.007501f, 0.003669f, -0.015821f, 0.037905f, 0.006306f, -0.038948f, 0.013367f, 0.009375f, 0.033153f, 0.012381f, -0.076053f, -0.024165f, -0.049333f, -0.093735f, 0.015389f, - 0.103849f, 0.086389f, 0.092310f, -0.047303f, 0.013689f, 0.074313f, 0.090886f, 0.049559f, -0.015663f, -0.052549f, -0.016329f, -0.076266f, -0.061826f, -0.063511f, 0.039646f, 0.123095f, 0.014255f, 0.014006f, 0.012179f, -0.051475f, -0.067447f, 0.041413f, 0.086814f, 0.105537f, 0.082272f, 0.021088f, -0.042444f, -0.065750f, -0.031024f, 0.002792f, 0.034656f, 0.036967f, -0.025911f, -0.038597f, -0.025850f, -0.024307f, -0.026230f, 0.141877f, 0.011333f, 0.059458f, 0.006121f, -0.057907f, -0.144673f, 0.083071f, 0.022746f, 0.048092f, 0.089863f, -0.028500f, -0.070405f, -0.107009f, 0.050452f, 0.079530f, 0.065303f, 0.007590f, -0.037520f, -0.038727f, -0.076749f, -0.091653f, 0.029711f, 0.108371f, 0.063467f, -0.081410f, -0.017582f, -0.012313f} - } -}; -const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* UPDATE_SBA_FILTER */ - -#ifdef UPDATE_SBA_FILTER - /********************** CRendBin_FOA_HRIR **********************/ -#ifdef UPDATE_SBA_FILTER const float CRendBin_FOA_HRIR_latency_s = 0.000020834f; -#else -const float CRendBin_FOA_HRIR_latency_s = 0.000020833333110f; -#endif /* Sample Rate = 48000 */ @@ -1811,18 +841,12 @@ const float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* UPDATE_SBA_FILTER */ -#ifdef UPDATE_SBA_FILTER /********************** CRendBin_HOA2_HRIR **********************/ -#ifdef UPDATE_SBA_FILTER const float CRendBin_HOA2_HRIR_latency_s = 0.000020834f; -#else -const float CRendBin_HOA2_HRIR_latency_s = 0.000020833333110f; -#endif /* Sample Rate = 48000 */ @@ -2195,18 +1219,12 @@ const float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* UPDATE_SBA_FILTER */ -#ifdef UPDATE_SBA_FILTER /********************** CRendBin_HOA3_HRIR **********************/ -#ifdef UPDATE_SBA_FILTER const float CRendBin_HOA3_HRIR_latency_s = 0.000020834f; -#else -const float CRendBin_HOA3_HRIR_latency_s = 0.000020833333110f; -#endif /* Sample Rate = 48000 */ @@ -2831,17 +1849,12 @@ const float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]={ }; const float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; const float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]={NULL,NULL}; -#endif /* UPDATE_SBA_FILTER */ /********************** CRendBin_Combined_BRIR **********************/ -#ifdef UPDATE_SBA_FILTER const float CRendBin_Combined_BRIR_latency_s = 0.000145834f; -#else -const float CRendBin_Combined_BRIR_latency_s = 0.000145833328133f; -#endif /* Sample Rate = 48000 */ diff --git a/lib_rend/ivas_rom_binaural_crend_head.h b/lib_rend/ivas_rom_binaural_crend_head.h index 9631d04ec6..4853122a2d 100644 --- a/lib_rend/ivas_rom_binaural_crend_head.h +++ b/lib_rend/ivas_rom_binaural_crend_head.h @@ -45,10 +45,6 @@ #ifndef _IVAS_ROM_BINAURAL_CREND_HEAD_ #define _IVAS_ROM_BINAURAL_CREND_HEAD_ -#ifndef UPDATE_SBA_FILTER -#include -#include "cnst.h" -#endif #include "ivas_cnst.h" @@ -99,58 +95,8 @@ extern float CRendBin_Combined_HRIR_coeff_im_16kHz[15][BINAURAL_CHANNELS][80]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#ifndef UPDATE_SBA_FILTER -/********************** CRendBin_HOA3_HRIR **********************/ - -extern float CRendBin_HOA3_HRIR_latency_s; - -/* Sample Rate = 48000 */ - -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_48kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_48kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[16][BINAURAL_CHANNELS][2]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_48kHz[16][BINAURAL_CHANNELS][480]; -extern float CRendBin_HOA3_HRIR_coeff_im_48kHz[16][BINAURAL_CHANNELS][480]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz[BINAURAL_CHANNELS]; - -/* Sample Rate = 32000 */ - -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_32kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_32kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[16][BINAURAL_CHANNELS][2]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_32kHz[16][BINAURAL_CHANNELS][320]; -extern float CRendBin_HOA3_HRIR_coeff_im_32kHz[16][BINAURAL_CHANNELS][320]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz[BINAURAL_CHANNELS]; - -/* Sample Rate = 16000 */ - -extern int16_t CRendBin_HOA3_HRIR_max_num_iterations_16kHz; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_16kHz[16][BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[BINAURAL_CHANNELS]; -extern uint16_t CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[16][BINAURAL_CHANNELS][2]; -extern uint16_t CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; -extern float CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz[16]; -extern uint16_t *CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[BINAURAL_CHANNELS]; -extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][160]; -extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][160]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; -extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* UPDATE_SBA_FILTER */ - -#ifdef UPDATE_SBA_FILTER - /********************** CRendBin_FOA_HRIR **********************/ @@ -197,9 +143,7 @@ extern float CRendBin_FOA_HRIR_coeff_re_16kHz[4][BINAURAL_CHANNELS][80]; extern float CRendBin_FOA_HRIR_coeff_im_16kHz[4][BINAURAL_CHANNELS][80]; extern float *CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* UPDATE_SBA_FILTER */ -#ifdef UPDATE_SBA_FILTER /********************** CRendBin_HOA2_HRIR **********************/ @@ -247,9 +191,7 @@ extern float CRendBin_HOA2_HRIR_coeff_re_16kHz[9][BINAURAL_CHANNELS][80]; extern float CRendBin_HOA2_HRIR_coeff_im_16kHz[9][BINAURAL_CHANNELS][80]; extern float *CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* UPDATE_SBA_FILTER */ -#ifdef UPDATE_SBA_FILTER /********************** CRendBin_HOA3_HRIR **********************/ @@ -297,7 +239,6 @@ extern float CRendBin_HOA3_HRIR_coeff_re_16kHz[16][BINAURAL_CHANNELS][80]; extern float CRendBin_HOA3_HRIR_coeff_im_16kHz[16][BINAURAL_CHANNELS][80]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz[BINAURAL_CHANNELS]; extern float *CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz[BINAURAL_CHANNELS]; -#endif /* UPDATE_SBA_FILTER */ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index c99ab168bd..96befbf375 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -746,10 +746,8 @@ typedef struct ivas_hrtfs_crend_structure { HRTFS_DATA *hHRTF_hrir_combined; HRTFS_DATA *hHRTF_hrir_hoa3; -#ifdef UPDATE_SBA_FILTER HRTFS_DATA *hHRTF_hrir_hoa2; HRTFS_DATA *hHRTF_hrir_foa; -#endif HRTFS_DATA *hHRTF_brir_combined; } HRTFS_CREND, *HRTFS_CREND_HANDLE; @@ -760,32 +758,17 @@ typedef struct ivas_hrtfs_crend_structure typedef struct ivas_hrtfs_fastconv_struct { float FASTCONV_HRIR_latency_s; -#ifdef UPDATE_SBA_FILTER float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS]; -#else - float leftHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; - float leftHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; - float rightHRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; - float rightHRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][7]; -#endif float FASTCONV_HOA3_latency_s; -#ifdef UPDATE_SBA_FILTER float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][BINAURAL_NTAPS]; -#else - float leftHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; - float leftHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; - float rightHRIRReal_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; - float rightHRIRImag_HOA3[BINAURAL_CONVBANDS][HRTF_SH_CHANNELS][7]; -#endif -#ifdef UPDATE_SBA_FILTER float FASTCONV_HOA2_latency_s; float leftHRIRReal_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; float leftHRIRImag_HOA2[BINAURAL_CONVBANDS][9][BINAURAL_NTAPS]; @@ -796,7 +779,6 @@ typedef struct ivas_hrtfs_fastconv_struct float leftHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; float rightHRIRReal_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; float rightHRIRImag_FOA[BINAURAL_CONVBANDS][4][BINAURAL_NTAPS]; -#endif float FASTCONV_BRIR_latency_s; float leftBRIRReal[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; float leftBRIRImag[BINAURAL_CONVBANDS][HRTF_LS_CHANNELS][BINAURAL_NTAPS_MAX]; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index d2f923bfeb..eadcc9e1da 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -196,11 +196,7 @@ static ivas_error check_hrtf_binary_header( /* Check the output format of the decoder */ -#ifdef UPDATE_SBA_FILTER if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_FOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) -#else - if ( ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_HOA ) && ( hrtf_header->input_cfg != BINAURAL_INPUT_AUDIO_CONFIG_UNDEFINED ) ) -#endif { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Header of HRTF binary file not compliant (input audio configuration)" ); } @@ -979,7 +975,6 @@ static ivas_error init_fastconv_HRTF_handle( set_zero( hHrtf->rightHRIRImag_HOA3[i][j], BINAURAL_NTAPS ); } } -#ifdef UPDATE_SBA_FILTER hHrtf->FASTCONV_HOA2_latency_s = 0; for ( i = 0; i < BINAURAL_CONVBANDS; i++ ) { @@ -1002,7 +997,6 @@ static ivas_error init_fastconv_HRTF_handle( set_zero( hHrtf->rightHRIRImag_FOA[i][j], BINAURAL_NTAPS ); } } -#endif hHrtf->FASTCONV_BRIR_latency_s = 0; @@ -1108,11 +1102,7 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } -#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) -#else - if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) -#endif { /* HRIR_HOA3 */ ( *hHRTF )->FASTCONV_HOA3_latency_s = *( (float *) ( hrtf_data_rptr ) ); @@ -1163,7 +1153,6 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } -#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { /* HRIR_HOA2 */ @@ -1266,13 +1255,8 @@ static ivas_error create_fastconv_HRTF_from_rawdata( } } } -#endif /* BRIR */ -#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) -#else - if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) -#endif { ( *hHRTF )->FASTCONV_BRIR_latency_s = *( (float *) ( hrtf_data_rptr ) ); hrtf_data_rptr += sizeof( float ); @@ -1630,15 +1614,10 @@ ivas_error create_SetOfHRTF_from_binary( { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_combined ); } -#ifdef UPDATE_SBA_FILTER else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) -#else - else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) -#endif { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa3 ); } -#ifdef UPDATE_SBA_FILTER else if ( hrtf_header.input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_hoa2 ); @@ -1647,7 +1626,6 @@ ivas_error create_SetOfHRTF_from_binary( { hHRTF = &( ( *hSetOfHRTF ).hHRTF_hrir_foa ); } -#endif } else if ( hrtf_header.rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -1754,10 +1732,8 @@ ivas_error destroy_SetOfHRTF( { destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_combined ) ); destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa3 ) ); -#ifdef UPDATE_SBA_FILTER destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_hoa2 ) ); destroy_HRTF( &( hSetOfHRTF->hHRTF_hrir_foa ) ); -#endif destroy_HRTF( &( hSetOfHRTF->hHRTF_brir_combined ) ); } diff --git a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c index 6c0054ff6b..00520bb924 100644 --- a/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c +++ b/scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c @@ -58,11 +58,7 @@ #define DEFAULT_BIN_FILE_EXT ".bin" #define IVAS_NB_RENDERER_TYPE 7 -#ifdef UPDATE_SBA_FILTER #define IVAS_NB_AUDIO_CONFIG 4 -#else -#define IVAS_NB_AUDIO_CONFIG 2 -#endif #define IVAS_NB_SAMPLERATE 3 const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = { @@ -76,13 +72,9 @@ const RENDERER_TYPE rend_types[IVAS_NB_RENDERER_TYPE] = { }; const BINAURAL_INPUT_AUDIO_CONFIG input_cfgs[IVAS_NB_AUDIO_CONFIG] = { BINAURAL_INPUT_AUDIO_CONFIG_COMBINED, -#ifdef UPDATE_SBA_FILTER BINAURAL_INPUT_AUDIO_CONFIG_HOA3, BINAURAL_INPUT_AUDIO_CONFIG_HOA2, BINAURAL_INPUT_AUDIO_CONFIG_FOA -#else - BINAURAL_INPUT_AUDIO_CONFIG_HOA -#endif }; const int32_t sample_rates[IVAS_NB_SAMPLERATE] = { 48000, 32000, 16000 }; /* Hz */ /* 8000 Hz not supported by mdft */ @@ -831,11 +823,7 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG cldfb_nchan_max = CLDFB_NO_CHANNELS_MAX; } } -#ifdef UPDATE_SBA_FILTER else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) -#else - else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) -#endif { if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { @@ -847,7 +835,6 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG hrtf_channels = HRTF_SH_CHANNELS; num_taps = BINAURAL_NTAPS; } -#ifdef UPDATE_SBA_FILTER else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM ) @@ -872,7 +859,6 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG hrtf_channels = 4; num_taps = BINAURAL_NTAPS; } -#endif else { fprintf( stderr, "Unsupported renderer type in create_hrtf_fastconv()\n\n" ); @@ -984,11 +970,7 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } // HRIR_HOA3 -#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) -#else - else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) -#endif { memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float hrtf_wptr += sizeof( float ); @@ -1033,7 +1015,6 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } } -#ifdef UPDATE_SBA_FILTER else if ( rend_type == RENDERER_BINAURAL_FASTCONV && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { memcpy( hrtf_wptr, &( latency_s ), sizeof( float ) ); // latency_s => float @@ -1125,7 +1106,6 @@ char *create_hrtf_fastconv( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CONFIG } } } -#endif // BRIR else if ( rend_type == RENDERER_BINAURAL_FASTCONV_ROOM && input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_COMBINED ) { @@ -1389,11 +1369,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } -#ifdef UPDATE_SBA_FILTER else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) -#else - else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) -#endif { if ( frequency == 48000 ) { @@ -1458,7 +1434,6 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } -#ifdef UPDATE_SBA_FILTER else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) { if ( frequency == 48000 ) @@ -1569,7 +1544,6 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON } hrtf_table_dims_out.max_num_ir = 4; } -#endif } else if ( rend_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { @@ -1637,11 +1611,7 @@ int16_t get_crend_hrtf_tables( RENDERER_TYPE rend_type, BINAURAL_INPUT_AUDIO_CON hrtf_table_dims_out.max_num_iterations_diffuse = 0; hrtf_table_dims_out.max_total_num_fsamp_per_iteration_diff = 0;*/ } -#ifdef UPDATE_SBA_FILTER else if ( ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA3 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA2 ) || ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_FOA ) ) -#else - else if ( input_cfg == BINAURAL_INPUT_AUDIO_CONFIG_HOA ) -#endif { result = 0; } diff --git a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c index 5858b430d9..dcfac0116b 100644 --- a/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c +++ b/scripts/binauralRenderer_interface/generate_crend_ivas_tables_from_sofa.c @@ -854,9 +854,7 @@ int generate_crend_ivas_tables_from_sofa( const char *file_path, bool no_optim ) ivas_set_hrtf_fr( &hrtf_data, ivas_hrtf, frame_len ); } -#ifdef UPDATE_SBA_FILTER hrtf_data.latency_s += 0.000000001f; -#endif if ( ( hrtf_data.num_iterations[0][0] > 2 ) ) { @@ -1034,12 +1032,8 @@ void update_c_file( HRTFS_DATA *hrtf, struct ivas_layout_config lscfg, const int { /* float latency_s; */ fprintf( fp, "\n\n/********************** %s_%s **********************/\n", DECLARATION_NAME, lscfg.name ); -#ifdef UPDATE_SBA_FILTER fprintf( fp, "\n#ifdef FIX_BINAURAL_DELAY_PRECISION\nconst float %s_%s_latency_s = %10.9ff;\n#else", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;\n#endif", DECLARATION_NAME, lscfg.name, hrtf->latency_s - 0.000000001f ); -#else - fprintf( fp, "\nconst float %s_%s_latency_s = %16.15ff;", DECLARATION_NAME, lscfg.name, hrtf->latency_s ); -#endif } fprintf( fp, "\n\n/* Sample Rate = %ld */\n", (long) samplerate ); -- GitLab From d27b9cf1fb597a81a004c4e81fad749255d66d26 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:15:28 +0200 Subject: [PATCH 347/381] [cleanup] accept FIX_XXX_JBM_FIFO_BUFFER --- lib_com/ivas_prot.h | 4 ---- lib_com/ivas_tools.c | 8 -------- lib_com/options.h | 3 --- 3 files changed, 15 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index f98e51e32d..776f4e6aea 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2789,11 +2789,7 @@ float sumAbs( void mvc2c( const uint8_t x[], /* i : input vector */ uint8_t y[], /* o : output vector */ -#ifdef FIX_XXX_JBM_FIFO_BUFFER - const int32_t n -#else const int16_t n /* i : vector size */ -#endif ); /*! r: the dot product x'*A*A'*x */ diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 45c87e4ff5..834b190e47 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -75,18 +75,10 @@ float sumAbs( void mvc2c( const uint8_t x[], /* i : input vector */ uint8_t y[], /* o : output vector */ -#ifdef FIX_XXX_JBM_FIFO_BUFFER - const int32_t n -#else const int16_t n /* i : vector size */ -#endif ) { -#ifdef FIX_XXX_JBM_FIFO_BUFFER - int32_t i; -#else int16_t i; -#endif if ( n <= 0 ) { diff --git a/lib_com/options.h b/lib_com/options.h index 4e8b9ff25f..67e188af8c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -146,9 +146,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ - -/*#define FIX_XXX_JBM_FIFO_BUFFER */ /* FhG: prevent wraparound of a length identifier in cause of large frames and many channels*/ - #define FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* Phi: issue 196 - refactoring renderer output configuration */ #define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ -- GitLab From 4e7d890be0badd960bc0e24f2d9548c4980cdf9b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:26:57 +0200 Subject: [PATCH 348/381] [cleanup] accept FIX_393_459_460_SBA_MD --- lib_com/ivas_dirac_com.c | 3 - lib_com/ivas_prot.h | 8 - lib_com/ivas_stat_com.h | 3 - lib_com/options.h | 1 - lib_dec/ivas_dirac_dec.c | 279 ---------------------- lib_dec/ivas_dirac_output_synthesis_dec.c | 19 -- 6 files changed, 313 deletions(-) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 90ed71875a..85370e3596 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -160,9 +160,6 @@ ivas_error ivas_dirac_config( } hConfig->enc_param_start_band = 0; hConfig->dec_param_estim = FALSE; -#ifndef FIX_393_459_460_SBA_MD - hConfig->dec_param_estim_old = hConfig->dec_param_estim; -#endif if ( ivas_format == SBA_FORMAT ) /* skip for MASA decoder */ { if ( ( error = ivas_dirac_sba_config( hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band ) ) != IVAS_ERR_OK ) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 776f4e6aea..01d7967980 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3757,11 +3757,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t nbslots, /* i : number of slots to process */ const float *onset_filter, -#ifdef FIX_393_459_460_SBA_MD float *diffuseness, -#else - const int16_t md_idx, -#endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ); @@ -3770,11 +3766,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX],/* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nbslots, /* i : number of slots to process */ -#ifdef FIX_393_459_460_SBA_MD float *diffuseness_vector, /* i : diffuseness (needed for direction smoothing)*/ -#else - const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ -#endif float *reference_power_smooth, float qualityBasedSmFactor ); diff --git a/lib_com/ivas_stat_com.h b/lib_com/ivas_stat_com.h index 43b7adcc7c..7783ff5ec2 100644 --- a/lib_com/ivas_stat_com.h +++ b/lib_com/ivas_stat_com.h @@ -180,9 +180,6 @@ typedef struct ivas_dirac_config_data_struct { int16_t enc_param_start_band; int16_t dec_param_estim; -#ifndef FIX_393_459_460_SBA_MD - int16_t dec_param_estim_old; -#endif int16_t nbands; } DIRAC_CONFIG_DATA, *DIRAC_CONFIG_DATA_HANDLE; diff --git a/lib_com/options.h b/lib_com/options.h index 67e188af8c..55c0127e8d 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,7 +147,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* Phi: issue 196 - refactoring renderer output configuration */ -#define FIX_393_459_460_SBA_MD /* FhG: fix issues 393, 459, 460, 494 all related to MD buffers and the read index for accessing them */ #define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ #define FIX_506_WARNINGS /* FhG/Eri/Dlb/VA: Issue 508, Warnings on MacOS */ #define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 0524ceef70..046d22f2cb 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -997,9 +997,6 @@ ivas_error ivas_dirac_dec_config( hDirAC->dirac_bs_md_write_idx = 0; hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; -#ifndef FIX_393_459_460_SBA_MD - hDirAC->hConfig->dec_param_estim_old = hDirAC->hConfig->dec_param_estim; -#endif if ( st_ivas->mc_mode == MC_MODE_MCMASA ) { hDirAC->dirac_md_buffer_length = MAX_PARAM_SPATIAL_SUBFRAMES; @@ -1025,30 +1022,16 @@ ivas_error ivas_dirac_dec_config( { int16_t num_slots_in_subfr; num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; -#ifdef FIX_393_459_460_SBA_MD hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ); hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR; -#else - hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; - hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; - hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; -#endif hDirAC->dirac_read_idx = 0; hDirAC->dirac_estimator_idx = 0; set_s( hDirAC->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); -#ifdef FIX_393_459_460_SBA_MD for ( map_idx = 0; map_idx < DEFAULT_JBM_SUBFRAMES_5MS * num_slots_in_subfr; map_idx++ ) -#else - for ( map_idx = 0; map_idx < DEFAULT_JBM_CLDFB_TIMESLOTS; map_idx++ ) -#endif { -#ifdef FIX_393_459_460_SBA_MD hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx / num_slots_in_subfr; -#else - hDirAC->render_to_md_map[map_idx] = hDirAC->dirac_read_idx + map_idx * num_slots_in_subfr / JBM_CLDFB_SLOTS_IN_SUBFRAME; -#endif } } @@ -1077,30 +1060,6 @@ ivas_error ivas_dirac_dec_config( hDirAC->dithering_seed = DIRAC_DITH_SEED; st_ivas->hDirAC = hDirAC; } -#ifndef FIX_393_459_460_SBA_MD - else if ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) - { - int16_t num_slots_in_subfr; - num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; - if ( st_ivas->ivas_format == SBA_FORMAT ) - { - if ( ( hDirAC->hConfig->dec_param_estim_old != hDirAC->hConfig->dec_param_estim ) ) - { - ivas_dirac_deallocate_parameters( hDirAC, 1 ); - } - hDirAC->dirac_md_buffer_length = ( MAX_PARAM_SPATIAL_SUBFRAMES + DELAY_DIRAC_PARAM_DEC_SFR ) * num_slots_in_subfr; - hDirAC->dirac_bs_md_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; - hDirAC->spar_to_dirac_write_idx = DELAY_DIRAC_PARAM_DEC_SFR * num_slots_in_subfr; - hDirAC->dirac_read_idx = 0; - hDirAC->dirac_estimator_idx = 0; - - if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } -#endif /* allocate transport channels*/ if ( flag_config == DIRAC_OPEN ) { @@ -1849,9 +1808,6 @@ void ivas_qmetadata_to_dirac( int16_t *seed_ptr; int16_t band_start, band_end, diff_idx; float diffuseness; -#ifndef FIX_393_459_460_SBA_MD - int16_t ts_start, ts_end, ts; -#endif int16_t b, ele, azi; float azimuth, elevation; IVAS_QDIRECTION *q_direction; @@ -1949,16 +1905,10 @@ void ivas_qmetadata_to_dirac( } else /* SBA mode/SID/Zero frame*/ { -#ifndef FIX_393_459_460_SBA_MD - int16_t num_slots_in_subfr; -#endif int16_t tmp_write_idx_param_band; int16_t tmp_write_idx_band; float diffuseness_sec = 0.f; -#ifndef FIX_393_459_460_SBA_MD - num_slots_in_subfr = hDirAC->hConfig->dec_param_estim ? CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES : 1; -#endif /* ungroup */ seed_ptr = &hDirAC->dithering_seed; nblocks = q_direction->cfg.nblocks; @@ -2005,20 +1955,12 @@ void ivas_qmetadata_to_dirac( for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { -#ifndef FIX_393_459_460_SBA_MD - ts_start = hDirAC->block_grouping[block]; - ts_end = hDirAC->block_grouping[block + 1]; -#endif for ( b = band_start; b < band_end; b++ ) { tmp_write_idx_band = tmp_write_idx_param_band; hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; -#ifndef FIX_393_459_460_SBA_MD - if ( hDirAC->hConfig->dec_param_estim == FALSE ) - { -#endif hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; @@ -2027,24 +1969,6 @@ void ivas_qmetadata_to_dirac( hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; -#ifndef FIX_393_459_460_SBA_MD - } - else - { - for ( ts = ts_start; ts < ts_end; ts++ ) - { - hDirAC->elevation[tmp_write_idx_band][b] = 0; - hDirAC->azimuth[tmp_write_idx_band][b] = 0; -#if 0 - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; -#endif - hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; - hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; - hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; - } - } -#endif } } } @@ -2081,10 +2005,6 @@ void ivas_qmetadata_to_dirac( { int16_t block_qmetadata; -#ifndef FIX_393_459_460_SBA_MD - ts_start = hDirAC->block_grouping[block]; - ts_end = hDirAC->block_grouping[block + 1]; -#endif block_qmetadata = min( block, nblocks - 1 ); block_qmetadata = max( block_qmetadata, 0 ); @@ -2147,10 +2067,6 @@ void ivas_qmetadata_to_dirac( hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0]; -#ifndef FIX_393_459_460_SBA_MD - if ( hDirAC->hConfig->dec_param_estim == FALSE ) - { -#endif hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; @@ -2175,25 +2091,8 @@ void ivas_qmetadata_to_dirac( hDirAC->elevation[tmp_write_idx_band][b] = ele; hDirAC->azimuth[tmp_write_idx_band][b] = azi; } -#ifndef FIX_393_459_460_SBA_MD - } - else - { - for ( ts = ts_start; ts < ts_end; ts++ ) - { - hDirAC->elevation[tmp_write_idx_band][b] = ele; - hDirAC->azimuth[tmp_write_idx_band][b] = azi; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; - } - } -#endif } -#ifdef FIX_393_459_460_SBA_MD tmp_write_idx_param_band = ( tmp_write_idx_param_band + 1 ) % hDirAC->dirac_md_buffer_length; -#else - tmp_write_idx_param_band = ( tmp_write_idx_param_band + num_slots_in_subfr ) % hDirAC->dirac_md_buffer_length; -#endif } /* for ( block =...) */ } /* for ( band = ...) */ @@ -2206,19 +2105,11 @@ void ivas_qmetadata_to_dirac( for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ ) { -#ifndef FIX_393_459_460_SBA_MD - ts_start = hDirAC->block_grouping[block]; - ts_end = hDirAC->block_grouping[block + 1]; -#endif hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; hDirAC->energy_ratio1[block][b] = 0; -#ifndef FIX_393_459_460_SBA_MD - if ( hDirAC->hConfig->dec_param_estim == FALSE ) - { -#endif hDirAC->elevation[tmp_write_idx_band][b] = 0; hDirAC->azimuth[tmp_write_idx_band][b] = 0; hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; @@ -2226,39 +2117,12 @@ void ivas_qmetadata_to_dirac( hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; -#ifndef FIX_393_459_460_SBA_MD - } - else - { - for ( ts = ts_start; ts < ts_end; ts++ ) - { - hDirAC->elevation[tmp_write_idx_band][b] = 0; - hDirAC->azimuth[tmp_write_idx_band][b] = 0; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; - hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; - hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; - hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; - } - } -#endif } } } /* update buffer write index */ -#ifndef FIX_393_459_460_SBA_MD - if ( hDirAC->hConfig->dec_param_estim == FALSE ) - { -#endif hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length; -#ifndef FIX_393_459_460_SBA_MD - } - else - { - hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + CLDFB_NO_COL_MAX ) % hDirAC->dirac_md_buffer_length; - } -#endif return; } @@ -2285,18 +2149,7 @@ void ivas_dirac_dec_set_md_map( /* adapt subframes */ hDirAC->num_slots = nCldfbTs; hDirAC->slots_rendered = 0; -#ifndef FIX_393_459_460_SBA_MD - if ( hDirAC->hParamIsm != NULL || hDirAC->hConfig->dec_param_estim == 0 ) - { -#endif num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; -#ifndef FIX_393_459_460_SBA_MD - } - else - { - num_slots_in_subfr = 1; - } -#endif hDirAC->subframes_rendered = 0; ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hDirAC->subframe_nbslots, &hDirAC->nb_subframes ); @@ -2513,15 +2366,9 @@ void ivas_dirac_dec_render_sf( int16_t index, num_freq_bands; /* local copies of azi, ele, diffuseness */ -#ifdef FIX_393_459_460_SBA_MD int16_t azimuth[CLDFB_NO_CHANNELS_MAX]; int16_t elevation[CLDFB_NO_CHANNELS_MAX]; float diffuseness_vector[CLDFB_NO_CHANNELS_MAX]; -#else - int16_t azimuth[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - int16_t elevation[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; - float diffuseness_vector[JBM_CLDFB_SLOTS_IN_SUBFRAME][CLDFB_NO_CHANNELS_MAX]; -#endif DIRAC_DEC_STACK_MEM DirAC_mem; float *reference_power, *reference_power_smooth; @@ -2585,7 +2432,6 @@ void ivas_dirac_dec_render_sf( /* Another workaround for self test BE */ /* copy parameters into local buffers*/ -#ifdef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth, hDirAC->num_freq_bands ); @@ -2596,26 +2442,6 @@ void ivas_dirac_dec_render_sf( { set_zero( diffuseness_vector, hDirAC->num_freq_bands ); } -#else - if ( hDirAC->hConfig->dec_param_estim == TRUE ) - { - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], azimuth[slot_idx], hDirAC->num_freq_bands ); - mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], elevation[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); - } - } - else - { - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - mvs2s( hDirAC->azimuth[hDirAC->render_to_md_map[subframe_idx]], azimuth[slot_idx], hDirAC->num_freq_bands ); - mvs2s( hDirAC->elevation[hDirAC->render_to_md_map[subframe_idx]], elevation[slot_idx], hDirAC->num_freq_bands ); - mvr2r( hDirAC->diffuseness_vector[hDirAC->render_to_md_map[subframe_idx]], diffuseness_vector[slot_idx], hDirAC->num_freq_bands ); - } - } -#endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -2647,17 +2473,10 @@ void ivas_dirac_dec_render_sf( #endif { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; -#ifdef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim == FALSE ) { rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } -#else - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - rotateAziEle_DirAC( azimuth[slot_idx], elevation[slot_idx], num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); - } -#endif } } else @@ -2671,11 +2490,7 @@ void ivas_dirac_dec_render_sf( if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { ivas_dirac_dec_compute_power_factors( hDirAC->num_freq_bands, -#ifdef FIX_393_459_460_SBA_MD diffuseness_vector, -#else - diffuseness_vector[0], -#endif hDirAC->h_output_synthesis_psd_params.max_band_decorr, hDirAC->h_output_synthesis_psd_state.direct_power_factor, hDirAC->h_output_synthesis_psd_state.diffuse_power_factor ); @@ -2726,13 +2541,8 @@ void ivas_dirac_dec_render_sf( ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, st_ivas->hMasa, -#ifdef FIX_393_459_460_SBA_MD azimuth, elevation, -#else - hDirAC->azimuth[md_idx], - hDirAC->elevation[md_idx], -#endif md_idx, surCohRatio, #ifdef EXTERNAL_ORIENTATIONS @@ -2748,13 +2558,8 @@ void ivas_dirac_dec_render_sf( ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, st_ivas->hMasa, -#ifdef FIX_393_459_460_SBA_MD azimuth, elevation, -#else - hDirAC->azimuth[md_idx], - hDirAC->elevation[md_idx], -#endif md_idx, surCohRatio, 0, @@ -2912,7 +2717,6 @@ void ivas_dirac_dec_render_sf( if ( hDirAC->hConfig->dec_param_estim == TRUE ) { -#ifdef FIX_393_459_460_SBA_MD mvs2s( &hDirAC->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); mvs2s( &hDirAC->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); #ifdef EXTERNAL_ORIENTATIONS @@ -2924,7 +2728,6 @@ void ivas_dirac_dec_render_sf( num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); } -#endif hDirAC->index_buffer_intensity = ( hDirAC->index_buffer_intensity % DIRAC_NO_COL_AVG_DIFF ) + 1; /* averaging_length = 32 */ @@ -2942,13 +2745,8 @@ void ivas_dirac_dec_render_sf( hDirAC->buffer_intensity_real[1][index - 1], hDirAC->buffer_intensity_real[2][index - 1], num_freq_bands, -#ifdef FIX_393_459_460_SBA_MD azimuth, elevation -#else - azimuth[slot_idx], - elevation[slot_idx] -#endif ); mvr2r( reference_power, &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); @@ -2956,11 +2754,7 @@ void ivas_dirac_dec_render_sf( computeDiffuseness( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, -#ifdef FIX_393_459_460_SBA_MD hDirAC->diffuseness_vector[md_idx] -#else - diffuseness_vector[slot_idx] -#endif ); } @@ -3091,15 +2885,9 @@ void ivas_dirac_dec_render_sf( { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, -#ifdef FIX_393_459_460_SBA_MD azimuth, elevation, hDirAC->diffuseness_vector[md_idx], -#else - azimuth[slot_idx], - elevation[slot_idx], - diffuseness_vector[slot_idx], -#endif hDirAC, #ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData->shd_rot_max_order, @@ -3119,15 +2907,9 @@ void ivas_dirac_dec_render_sf( { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, -#ifdef FIX_393_459_460_SBA_MD azimuth, elevation, hDirAC->diffuseness_vector[md_idx], -#else - azimuth[slot_idx], - elevation[slot_idx], - diffuseness_vector[slot_idx], -#endif hDirAC, 0, 0, @@ -3138,13 +2920,11 @@ void ivas_dirac_dec_render_sf( hodirac_flag ); } -#ifdef FIX_393_459_460_SBA_MD if ( hDirAC->hConfig->dec_param_estim ) { float fac = 1.0f / (float) hDirAC->subframe_nbslots[subframe_idx]; v_multc_acc( hDirAC->diffuseness_vector[md_idx], fac, diffuseness_vector, hDirAC->num_freq_bands ); } -#endif if ( hDirAC->synthesisConf != DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -3154,45 +2934,7 @@ void ivas_dirac_dec_render_sf( ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); -#ifndef FIX_393_459_460_SBA_MD - if ( hDirAC->hConfig->dec_param_estim == FALSE ) - { - md_idx = hDirAC->render_to_md_map[subframe_idx]; - } - else - { - md_idx = hDirAC->render_to_md_map[slot_idx_start]; - } -#endif -#ifndef FIX_393_459_460_SBA_MD - /* Workaround for BE (should be gone when #393 is adressed and diffuseness index in the gain SHD renderer with HO-DirAC is fixed) */ - /* :TODO: remove */ - /* get the correct md index for the diffuseness in direction smoothing and HO-DirAC, it is always the first slot of the next subframe*/ - if ( slot_idx_start + hDirAC->subframe_nbslots[subframe_idx] == hDirAC->num_slots ) - { - /* we are at the end, get the next one using the normal dirac read idx...*/ - if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) - { - md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_CLDFB_TIMESLOTS ) % hDirAC->dirac_md_buffer_length; - } - else - { - md_idx = ( hDirAC->dirac_read_idx + DEFAULT_JBM_SUBFRAMES_5MS ) % hDirAC->dirac_md_buffer_length; - } - } - else - { - if ( st_ivas->hDirAC->hConfig->dec_param_estim == 1 ) - { - md_idx = hDirAC->render_to_md_map[slot_idx_start + hDirAC->subframe_nbslots[subframe_idx]]; - } - else - { - md_idx = hDirAC->render_to_md_map[subframe_idx + 1]; - } - } -#endif if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { @@ -3202,11 +2944,7 @@ void ivas_dirac_dec_render_sf( nchan_transport, hDirAC->subframe_nbslots[subframe_idx], p_onset_filter, -#ifdef FIX_393_459_460_SBA_MD diffuseness_vector, -#else - md_idx, -#endif hodirac_flag ); } else @@ -3220,29 +2958,12 @@ void ivas_dirac_dec_render_sf( qualityBasedSmFactor *= qualityBasedSmFactor; } -#ifndef FIX_393_459_460_SBA_MD - /* Workaround for BE (should be gone when #393 is adressed) */ - if ( hDirAC->hConfig->dec_param_estim == 1 ) - { - num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; - for ( slot_idx = 0; slot_idx < hDirAC->subframe_nbslots[subframe_idx]; slot_idx++ ) - { - mvs2s( azimuth[slot_idx], hDirAC->azimuth[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); - mvs2s( elevation[slot_idx], hDirAC->elevation[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); - mvr2r( diffuseness_vector[slot_idx], hDirAC->diffuseness_vector[hDirAC->render_to_md_map[slot_idx + slot_idx_start]], num_freq_bands ); - } - } -#endif ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC, hDirAC->subframe_nbslots[subframe_idx], -#ifdef FIX_393_459_460_SBA_MD diffuseness_vector, -#else - md_idx, -#endif reference_power_smooth, qualityBasedSmFactor ); } diff --git a/lib_dec/ivas_dirac_output_synthesis_dec.c b/lib_dec/ivas_dirac_output_synthesis_dec.c index d45086edb7..f1a5597175 100755 --- a/lib_dec/ivas_dirac_output_synthesis_dec.c +++ b/lib_dec/ivas_dirac_output_synthesis_dec.c @@ -773,11 +773,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( const int16_t nchan_transport, /* i : number of transport channels */ const int16_t nbslots, /* i : number of slots to process */ const float *onset_filter, -#ifdef FIX_393_459_460_SBA_MD float *diffuseness, -#else - const int16_t md_idx, -#endif const int16_t hodirac_flag /* i : flag to indicate HO-DirAC mode */ ) { @@ -800,9 +796,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( int16_t ch_idx_diff; float aux_buf[CLDFB_NO_CHANNELS_MAX]; float ratio[DIRAC_HO_NUMSECTORS * CLDFB_NO_CHANNELS_MAX]; -#ifndef FIX_393_459_460_SBA_MD - const float *diffuseness; -#endif /* collect some often used parameters */ h_dirac_output_synthesis_params = hDirAC->h_output_synthesis_psd_params; @@ -816,9 +809,6 @@ void ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( num_channels_diff = hDirAC->num_outputs_diff; nchan_transport_foa = min( 4, nchan_transport ); -#ifndef FIX_393_459_460_SBA_MD - diffuseness = hDirAC->diffuseness_vector[md_idx]; -#endif /*-----------------------------------------------------------------* * comput target Gains @@ -1229,11 +1219,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( float ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i : LS signals */ DIRAC_DEC_HANDLE hDirAC, /* i/o: DirAC handle */ const int16_t nbslots, /* i : number of slots to process */ -#ifdef FIX_393_459_460_SBA_MD float *diffuseness_vector, -#else - const int16_t diff_md_idx, /* i : md slot idx of diffuseness to use */ -#endif float *reference_power_smooth, float qualityBasedSmFactor ) { @@ -1361,12 +1347,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls( /* Estimate the smoothness of the directions based on the diffuseness parameter */ /* TODO: check this, seems buggy in the case of parame estim on the decoder side, because the pointer here points already to the following subframe, ist this intended?*/ -#ifdef FIX_393_459_460_SBA_MD instDirectionSmoothness = 1.0f - diffuseness_vector[l]; -#else - /* Workaround for BE */ - instDirectionSmoothness = 1.0f - hDirAC->diffuseness_vector[diff_md_idx][l]; /* Currently, all subframes have same energy ratio value. */ -#endif instDirectionSmoothness = min( max( instDirectionSmoothness, 0.0f ), 1.0f ); /* Average the direction smoothness parameter over time */ -- GitLab From 157c9a6f4db97c1a50779f20475a085bbedd7c9f Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:27:38 +0200 Subject: [PATCH 349/381] [cleanup] accept FIX_501_TABLE_IDX_INIT --- lib_com/options.h | 1 - lib_dec/ivas_spar_decoder.c | 4 ---- lib_dec/ivas_spar_md_dec.c | 33 --------------------------------- 3 files changed, 38 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 55c0127e8d..2a0ea8a208 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,7 +147,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* Phi: issue 196 - refactoring renderer output configuration */ -#define FIX_501_TABLE_IDX_INIT /* Dlb: Fix for the issue 501 */ #define FIX_506_WARNINGS /* FhG/Eri/Dlb/VA: Issue 508, Warnings on MacOS */ #define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ #define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 985dbb8368..9672336510 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -119,14 +119,10 @@ ivas_error ivas_spar_dec_open( return error; } hSpar->hMdDec->td_decorr_flag = 1; -#ifdef FIX_501_TABLE_IDX_INIT if ( hSpar->hTdDecorr ) { hSpar->hTdDecorr->ducking_flag = ivas_spar_br_table_consts[hSpar->hMdDec->table_idx].td_ducking; } -#else - hSpar->hMdDec->table_idx = -1; -#endif /* set FB config. */ active_w_mixing = -1; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index c8108ac33f..baefd33e83 100755 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -84,11 +84,7 @@ static void ivas_parse_parameter_bitstream_dtx( ivas_spar_md_t *pSpar_md, Decode static ivas_error ivas_deindex_real_index( const int16_t *index, const int16_t q_levels, const float min_value, const float max_value, float *quant, const int16_t num_ch_dim2 ); -#ifdef FIX_501_TABLE_IDX_INIT static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode, const int32_t last_active_brate ); -#else -static void ivas_spar_dec_parse_md_bs( ivas_spar_md_dec_state_t *hMdDec, Decoder_State *st, int16_t *nB, int16_t *bands_bw, int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode ); -#endif /*------------------------------------------------------------------------- @@ -292,7 +288,6 @@ ivas_error ivas_spar_md_dec_open( return error; } -#ifdef FIX_501_TABLE_IDX_INIT if ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) { if ( sid_format == SID_SBA_2TC ) @@ -308,13 +303,6 @@ ivas_error ivas_spar_md_dec_open( { hMdDec->table_idx = ivas_get_spar_table_idx( hDecoderConfig->ivas_total_brate, sba_order, SPAR_CONFIG_BW, NULL, NULL ); } -#else - hMdDec->table_idx = 0; /* just to initialize state variables*/ - if ( ( hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) && ( sid_format == SID_SBA_2TC ) ) - { - hMdDec->table_idx = ivas_get_spar_table_idx( IVAS_48k, sba_order, SPAR_CONFIG_BW, NULL, NULL ); - } -#endif if ( ( error = ivas_spar_md_dec_init( hMdDec, hDecoderConfig, num_channels, sba_order ) ) != IVAS_ERR_OK ) { return error; @@ -688,10 +676,8 @@ void ivas_spar_md_dec_process( ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode -#ifdef FIX_501_TABLE_IDX_INIT , st_ivas->last_active_ivas_total_brate -#endif ); #if 0 @@ -1715,10 +1701,8 @@ static void ivas_spar_dec_parse_md_bs( const int32_t ivas_total_brate, const int16_t use_planar_coeff, const int16_t sba_inactive_mode -#ifdef FIX_501_TABLE_IDX_INIT , const int32_t last_active_brate -#endif ) { int16_t i, j, k, num_bands; @@ -1730,9 +1714,7 @@ static void ivas_spar_dec_parse_md_bs( int16_t planarCP; float quant[IVAS_SPAR_MAX_C_COEFF]; int16_t do_repeat[IVAS_MAX_NUM_BANDS]; -#ifdef FIX_501_TABLE_IDX_INIT int16_t bw_final, bw_fact; -#endif *dtx_vad = 1; *bands_bw = 1; @@ -1805,7 +1787,6 @@ static void ivas_spar_dec_parse_md_bs( ivas_parse_parameter_bitstream_dtx( &hMdDec->spar_md, st0, *bands_bw, *nB, hMdDec->spar_md_cfg.num_dmx_chans_per_band, hMdDec->spar_md_cfg.num_decorr_per_band ); -#ifdef FIX_501_TABLE_IDX_INIT if ( last_active_brate >= IVAS_24k4 ) { bw_final = 1; @@ -1815,23 +1796,14 @@ static void ivas_spar_dec_parse_md_bs( bw_final = 2; } bw_fact = *bands_bw / bw_final; -#endif for ( i = *nB - 1; i >= 0; i-- ) { -#ifdef FIX_501_TABLE_IDX_INIT ndec = hMdDec->spar_md_cfg.num_decorr_per_band[bw_fact * i]; for ( b = bw_fact - 1; b >= 0; b-- ) { idx = i * bw_fact + b; -#else - ndec = hMdDec->spar_md_cfg.num_decorr_per_band[( *bands_bw ) * i]; - - for ( b = *bands_bw - 1; b >= 0; b-- ) - { - idx = i * *bands_bw + b; -#endif for ( j = 0; j < FOA_CHANNELS - 1; j++ ) { hMdDec->spar_md.band_coeffs[idx].pred_re[j] = hMdDec->spar_md.band_coeffs[i].pred_re[j]; @@ -1844,13 +1816,8 @@ static void ivas_spar_dec_parse_md_bs( } } -#ifdef FIX_501_TABLE_IDX_INIT *bands_bw = bw_final; *nB = num_bands / bw_final; -#else - *nB = num_bands; - *bands_bw = 1; -#endif return; } -- GitLab From c1632b94d71819703f21289b0dc757a116bf4eec Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:28:18 +0200 Subject: [PATCH 350/381] [cleanup] accept FIX_506_WARNINGS --- lib_com/fine_gain_bits.c | 9 --------- lib_com/hq_tools.c | 6 ------ lib_com/options.h | 1 - 3 files changed, 16 deletions(-) diff --git a/lib_com/fine_gain_bits.c b/lib_com/fine_gain_bits.c index b87de6d4d4..9f10bcd706 100644 --- a/lib_com/fine_gain_bits.c +++ b/lib_com/fine_gain_bits.c @@ -101,9 +101,6 @@ int16_t assign_gain_bits( int16_t *Rcalc /* o : Bit budget for shape quantizer (Q3) */ ) { -#ifndef FIX_506_WARNINGS - int16_t subband_cnt; -#endif int16_t gain_bits_tot; int16_t i; @@ -118,18 +115,12 @@ int16_t assign_gain_bits( } /* Re-adjust bit budget for gain quantization */ -#ifndef FIX_506_WARNINGS - subband_cnt = 0; -#endif gain_bits_tot = 0; *Rcalc = 0; for ( i = 0; i < BANDS; i++ ) { if ( Rk[i] > 0 ) { -#ifndef FIX_506_WARNINGS - subband_cnt++; -#endif Rk[i] -= gain_bits_array[i] * 8; gain_bits_tot += gain_bits_array[i]; *Rcalc += Rk[i]; diff --git a/lib_com/hq_tools.c b/lib_com/hq_tools.c index f7fef380d7..0796006ecf 100644 --- a/lib_com/hq_tools.c +++ b/lib_com/hq_tools.c @@ -1228,9 +1228,6 @@ int16_t calc_nor_delta_hf( int16_t i; int16_t ynrm_t[44], normqlg2_t[44]; int16_t delta, max_delta, min_delta, bitsforDelta, add_bits_denv; -#ifndef FIX_506_WARNINGS - int16_t temp_num = 0; -#endif max_delta = -100; calc_norm( t_audio, ynrm_t, normqlg2_t, 0, nb_sfm, sfmsize, sfm_start ); @@ -1292,9 +1289,6 @@ int16_t calc_nor_delta_hf( ynrm[i] += delta; add_bits_denv += bitsforDelta; -#ifndef FIX_506_WARNINGS - temp_num++; -#endif } } diff --git a/lib_com/options.h b/lib_com/options.h index 2a0ea8a208..4f3444c9e0 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,7 +147,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* Phi: issue 196 - refactoring renderer output configuration */ -#define FIX_506_WARNINGS /* FhG/Eri/Dlb/VA: Issue 508, Warnings on MacOS */ #define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ #define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ #ifdef IND_LIST_DYN -- GitLab From 20deaa6fd8551e7174e4d39d51610cb6dbafb1ce Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:29:07 +0200 Subject: [PATCH 351/381] [cleanup] accept FIX_296_CFG_LFE_SCENE_DESC --- apps/renderer.c | 92 ----------------------------------------------- lib_com/options.h | 1 - 2 files changed, 93 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index b2e4d57a08..cd2e31f8f0 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -95,7 +95,6 @@ typedef struct uint16_t durationCounters[RENDERER_MAX_ISM_INPUTS]; /* Number of frames spent at current position */ } IsmPositionProvider; -#ifdef FIX_296_CFG_LFE_SCENE_DESC typedef struct { float lfe_azi; @@ -103,7 +102,6 @@ typedef struct float lfe_gain_dB; char lfe_routing_mtx[FILENAME_MAX]; } LfeRoutingConfig; -#endif typedef struct { IVAS_REND_AudioConfig audioConfig; @@ -355,11 +353,7 @@ static const int32_t numCliOptions = sizeof( cliOptions ) / sizeof( CmdLnParser_ static IVAS_REND_AudioConfig ambisonicsOrderToEnum( const int16_t order ); -#ifdef FIX_296_CFG_LFE_SCENE_DESC static void parseSceneDescriptionFile( char *path, char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); -#else -static void parseSceneDescriptionFile( char *path, char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders ); -#endif static ivas_error parseCustomLayoutFile( const char *filePath, IVAS_CUSTOM_LS_DATA *pLsSetupCustom ); @@ -371,10 +365,8 @@ static void IsmPositionProvider_getNextFrame( IsmPositionProvider *positionProvi static void IsmPositionProvider_close( IsmPositionProvider *positionProvider ); -#ifdef FIX_296_CFG_LFE_SCENE_DESC static LfeRoutingConfig *LfeRoutingConfig_open( void ); static void LfeRoutingConfig_close( LfeRoutingConfig *lfeRoutingCfg ); -#endif static void readFromShorthandMetadata( IsmPositionProvider *positionProvider, ObjectPositionBuffer *objectMetadataBuffer, const uint32_t objIdx ); @@ -394,11 +386,7 @@ static int8_t parseInt32( const char *line, int32_t *ret ); static void parseObjectPosition( char *line, IVAS_REND_AudioObjectPosition *position, uint16_t *positionDuration ); -#ifdef FIX_296_CFG_LFE_SCENE_DESC static void parseMetadata( char *metadataString, char *inDir, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ); -#else -static void parseMetadata( char *metadataString, char *inDir, InputConfig *inConfig, IsmPositionProvider *positionProvider, MasaFileReader **masaReaders ); -#endif static ivas_error parseLfePanMtxFile( const char *lfeRoutingMatrixFilePath, IVAS_REND_LfePanMtx *lfePanMtx ); @@ -596,9 +584,7 @@ int main( Vector3PairFileReader *referenceVectorReader = NULL; hrtfFileReader *hrtfFileReader = NULL; IsmPositionProvider *positionProvider; -#ifdef FIX_296_CFG_LFE_SCENE_DESC LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; -#endif RenderConfigReader *renderConfigReader = NULL; MasaFileReader *masaReaders[RENDERER_MAX_MASA_INPUTS]; #ifdef MASA_PREREND @@ -636,12 +622,10 @@ int main( hMasaMetadata[i] = NULL; } -#ifdef FIX_296_CFG_LFE_SCENE_DESC for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { lfeRoutingConfigs[i] = NULL; } -#endif CmdlnArgs args = parseCmdlnArgs( argc, argv ); @@ -737,16 +721,12 @@ int main( if ( args.sceneDescriptionInput ) { /* With scene description input, inputFilePath is the path to the scene description file. Parse it. */ -#ifdef FIX_296_CFG_LFE_SCENE_DESC parseSceneDescriptionFile( args.inputFilePath, audioFilePath, &args.inConfig, positionProvider, masaReaders, lfeRoutingConfigs ); -#else - parseSceneDescriptionFile( args.inputFilePath, audioFilePath, &args.inConfig, positionProvider, masaReaders ); -#endif } else { @@ -953,11 +933,7 @@ int main( { if ( args.lfePanningEnabled ) { -#ifdef FIX_296_CFG_LFE_SCENE_DESC fprintf( stderr, "Warning: LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); -#else - fprintf( stdout, "Warning LFE position specified as well as panning matrix! Ignoring position and using gains from panning matrix\n" ); -#endif args.lfePanningEnabled = false; } @@ -976,7 +952,6 @@ int main( exit( -1 ); } } -#ifdef FIX_296_CFG_LFE_SCENE_DESC else { /* check for configuration from scene description file */ @@ -1008,7 +983,6 @@ int main( } } } -#endif } for ( i = 0; i < args.inConfig.numAudioObjects; ++i ) @@ -1526,12 +1500,10 @@ int main( { MasaFileReader_close( &masaReaders[i] ); } -#ifdef FIX_296_CFG_LFE_SCENE_DESC for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) { LfeRoutingConfig_close( lfeRoutingConfigs[i] ); } -#endif #ifdef MASA_PREREND MasaFileWriter_close( &masaWriter ); #endif @@ -2045,13 +2017,8 @@ static CmdlnArgs defaultArgs( args.lfePanningEnabled = false; args.lfeConfigGain = 1.0f; -#ifdef FIX_296_CFG_LFE_SCENE_DESC args.lfeConfigAzimuth = 0.f; args.lfeConfigElevation = 0.f; -#else - args.lfeConfigAzimuth = 0; - args.lfeConfigElevation = 0; -#endif args.lfeCustomRoutingEnabled = false; clearString( args.inLfePanningMatrixFile ); @@ -2236,7 +2203,6 @@ IsmPositionProvider *IsmPositionProvider_open( return ipp; } -#ifdef FIX_296_CFG_LFE_SCENE_DESC LfeRoutingConfig *LfeRoutingConfig_open( void ) { @@ -2262,7 +2228,6 @@ void LfeRoutingConfig_close( return; } -#endif void getMetadataFromFileReader( IsmFileReader *ismReader, @@ -2553,12 +2518,10 @@ static int8_t parseInt32( static void parseOptionalInputValues( char *line, -#ifdef FIX_296_CFG_LFE_SCENE_DESC float *lfe_gain_dB, float *lfe_pos_azi, float *lfe_pos_ele, char *lfe_pan_mtx_filename, -#endif float *gain_dB ) { char *parse_pos; @@ -2570,7 +2533,6 @@ static void parseOptionalInputValues( /* Set default values, in case some values are not specified */ *gain_dB = 0.f; -#ifdef FIX_296_CFG_LFE_SCENE_DESC if ( lfe_gain_dB != NULL ) { *lfe_gain_dB = 0.f; @@ -2587,7 +2549,6 @@ static void parseOptionalInputValues( { *lfe_pan_mtx_filename = '\0'; } -#endif /* Save parsing position - will have to be passed to strtok to resume parsing after using strtok with non-NULL value below */ parse_pos = readNextMetadataChunk( line, "\n" ); @@ -2604,15 +2565,10 @@ static void parseOptionalInputValues( if ( *endptr != '\0' ) { -#ifdef FIX_296_CFG_LFE_SCENE_DESC fprintf( stderr, "Cannot parse string \"%s\" as a float value\n", value ); -#else - fprintf( stderr, "Cannot parse string string \"%s\" as a float value\n", value ); -#endif exit( -1 ); } } -#ifdef FIX_296_CFG_LFE_SCENE_DESC else if ( ( strcmp( key, "lfe_gain_dB" ) == 0 ) && lfe_gain_dB != NULL ) { *lfe_gain_dB = (float) strtod( value, &endptr ); @@ -2647,7 +2603,6 @@ static void parseOptionalInputValues( { strncpy( lfe_pan_mtx_filename, value, FILENAME_MAX - 1 ); } -#endif else { fprintf( stderr, "Unsupported optional key: %s\n", key ); @@ -2733,11 +2688,7 @@ static void parseIsm( } /* Read optional values */ -#ifdef FIX_296_CFG_LFE_SCENE_DESC parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->audioObjects[idx].gain_dB ); -#else - parseOptionalInputValues( line, &inConfig->audioObjects[idx].gain_dB ); -#endif return; } @@ -2758,11 +2709,7 @@ static void parseSba( inConfig->ambisonicsBuses[idx].audioConfig = ambisonicsOrderToEnum( ambiOrder ); /* Read optional values */ -#ifdef FIX_296_CFG_LFE_SCENE_DESC parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->ambisonicsBuses[idx].gain_dB ); -#else - parseOptionalInputValues( line, &inConfig->ambisonicsBuses[idx].gain_dB ); -#endif return; } @@ -2770,9 +2717,7 @@ static void parseSba( static void parseMc( char *line, InputConfig *inConfig, -#ifdef FIX_296_CFG_LFE_SCENE_DESC LfeRoutingConfig **lfeRoutingConfigs, -#endif const int32_t idx ) { readNextMetadataChunk( line, "\n" ); @@ -2781,7 +2726,6 @@ static void parseMc( readNextMetadataChunk( line, "\n" ); IVAS_REND_AudioConfig cfg = parseAudioConfig( line ); -#ifdef FIX_296_CFG_LFE_SCENE_DESC /* Try to use the given string as a path to a custom loudspeaker layout file. */ if ( cfg == IVAS_REND_AUDIO_CONFIG_UNKNOWN ) { @@ -2797,19 +2741,12 @@ static void parseMc( inConfig->multiChannelBuses[idx].inputChannelIndex = 0; inConfig->multiChannelBuses[idx].gain_dB = 0.0f; } -#else - if ( cfg == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) - { - parseCustomLayoutFile( line, &inConfig->inSetupCustom ); - } -#endif else { inConfig->multiChannelBuses[idx].audioConfig = cfg; } /* Read optional values */ -#ifdef FIX_296_CFG_LFE_SCENE_DESC bool lfe_panningEnabled; float lfe_gain_dB, lfe_azi, lfe_ele; char lfe_routing_mtx[FILENAME_MAX]; @@ -2842,9 +2779,6 @@ static void parseMc( convert_backslash( lfeRoutingConfigs[idx]->lfe_routing_mtx ); } } -#else - parseOptionalInputValues( line, &inConfig->multiChannelBuses[idx].gain_dB ); -#endif return; } @@ -2885,11 +2819,7 @@ static void parseMasa( } /* Read optional values */ -#ifdef FIX_296_CFG_LFE_SCENE_DESC parseOptionalInputValues( line, NULL, NULL, NULL, NULL, &inConfig->masaBuses[idx].gain_dB ); -#else - parseOptionalInputValues( line, &inConfig->masaBuses[idx].gain_dB ); -#endif return; } @@ -2930,12 +2860,8 @@ static void parseMetadata( char *inDir, InputConfig *inConfig, IsmPositionProvider *positionProvider, -#ifdef FIX_296_CFG_LFE_SCENE_DESC MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ) -#else - MasaFileReader **masaReaders ) -#endif { char line[RENDERER_MAX_METADATA_LINE_LENGTH]; char *delimiter; @@ -2987,11 +2913,7 @@ static void parseMetadata( fprintf( stderr, "Metadata exceeds the supported number of MC inputs\n" ); exit( -1 ); } -#ifdef FIX_296_CFG_LFE_SCENE_DESC parseMc( line, inConfig, lfeRoutingConfigs, counterChannelAudioObjects - 1 ); -#else - parseMc( line, inConfig, counterChannelAudioObjects - 1 ); -#endif } else if ( strcmp( line, "SBA" ) == 0 ) { @@ -3059,12 +2981,8 @@ static void parseSceneDescriptionFile( char *audioFilePath, InputConfig *inConfig, IsmPositionProvider *positionProvider, -#ifdef FIX_296_CFG_LFE_SCENE_DESC MasaFileReader **masaReaders, LfeRoutingConfig **lfeRoutingConfigs ) -#else - MasaFileReader **masaReaders ) -#endif { uint32_t inAudioFilePathLen; char inAudioFilePath[FILENAME_MAX]; @@ -3093,11 +3011,7 @@ static void parseSceneDescriptionFile( strcpy( audioFilePath, inDir ); strncat( audioFilePath, inAudioFilePath, inAudioFilePathLen ); -#ifdef FIX_296_CFG_LFE_SCENE_DESC parseMetadata( mtdStr, inDir, inConfig, positionProvider, masaReaders, lfeRoutingConfigs ); -#else - parseMetadata( mtdStr, inDir, inConfig, positionProvider, masaReaders ); -#endif return; } @@ -3166,16 +3080,10 @@ static ivas_error parseLfePanMtxFile( set_zero( ( *lfePanMtx )[lfe_in], IVAS_MAX_OUTPUT_CHANNELS ); } -#ifdef FIX_296_CFG_LFE_SCENE_DESC for ( lfe_in = 0; lfe_in < IVAS_MAX_INPUT_LFE_CHANNELS; lfe_in++ ) -#else - for ( lfe_in = 0, ch_out = 0; lfe_in < IVAS_MAX_INPUT_LFE_CHANNELS; lfe_in++ ) -#endif { -#ifdef FIX_296_CFG_LFE_SCENE_DESC ch_out = 0; -#endif /* if EOF or a blank line is encountered, simply return */ if ( ( fgets( line, 200, mtxFile ) == NULL ) && ( strcmp( line, "\n" ) == 0 ) && ( strcmp( line, "\r\n" ) == 0 ) ) { diff --git a/lib_com/options.h b/lib_com/options.h index 4f3444c9e0..22f2c627dd 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,7 +147,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* Phi: issue 196 - refactoring renderer output configuration */ -#define FIX_296_CFG_LFE_SCENE_DESC /* FhG: Fix issue 296 - add configurable LFE handling to the scene description file */ #define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ #ifdef IND_LIST_DYN #define FIX_545_ASSERT /* VA: fix issue 545, replace assert() with warning message when hitting memory limit in the buffer of indices */ -- GitLab From 79e9a090ae6c5bb3be2ce2169aebf3d5c6689753 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:31:11 +0200 Subject: [PATCH 352/381] [cleanup] accept FIX_519_JBM_ACCESS_NULL_TC_BUFFER --- lib_com/options.h | 1 - lib_dec/lib_dec.c | 8 -------- 2 files changed, 9 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 22f2c627dd..335b6aa35f 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -147,7 +147,6 @@ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* Phi: issue 196 - refactoring renderer output configuration */ -#define FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* FhG: fix issue 519, accessing a yet uninitialized TC Buffer in frame 0*/ #ifdef IND_LIST_DYN #define FIX_545_ASSERT /* VA: fix issue 545, replace assert() with warning message when hitting memory limit in the buffer of indices */ #endif diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 0f3d260ccb..3859024180 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -965,15 +965,11 @@ ivas_error IVAS_DEC_GetBufferedNumberOfSamples( { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER /* check if the TC buffer already exists, otherweise nothing is buffered anyway */ if ( hIvasDec->st_ivas->hTcBuffer != NULL ) { -#endif *nSamplesBuffered = hIvasDec->st_ivas->hTcBuffer->n_samples_buffered - hIvasDec->st_ivas->hTcBuffer->n_samples_rendered; -#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER } -#endif return error; } @@ -1864,11 +1860,7 @@ ivas_error IVAS_DEC_VoIP_GetSamples( { int16_t nSamplesBuffered; nSamplesBuffered = 0; -#ifdef FIX_519_JBM_ACCESS_NULL_TC_BUFFER if ( hIvasDec->hasDecodedFirstGoodFrame ) -#else - if ( hIvasDec->hasBeenFedFirstGoodFrame ) -#endif { IVAS_DEC_GetBufferedNumberOfSamples( hIvasDec, &nSamplesBuffered ); } -- GitLab From de23b78338b05eeb5d18da831c6d6a725365efdc Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:32:12 +0200 Subject: [PATCH 353/381] [cleanup] accept FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER --- apps/renderer.c | 4 ---- lib_com/options.h | 1 - 2 files changed, 5 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index cd2e31f8f0..c630167af8 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -274,11 +274,7 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_nonDiegeticPan, .match = "non_diegetic_pan", .matchShort = "ndp", -#ifdef FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER .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", -#else - .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(todo: implementation)", -#endif }, { .id = CmdLnOptionId_orientationTracking, diff --git a/lib_com/options.h b/lib_com/options.h index 335b6aa35f..b04219d7b3 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ #define FIX_545_ASSERT /* VA: fix issue 545, replace assert() with warning message when hitting memory limit in the buffer of indices */ #endif -#define FIX_TODO_NON_DIEGETIC_PAN_NOT_IMPLELENTED_IN_RENDERER /* ..\apps\renderer.c(240): .... (todo: implementation)",*/ #define REMOVE_OBS_CODE /* FhG: Remove unnecessary assignement after LFE cleanup (Issue #451)*/ #define FIX_TODO_FD_CNG_SBA_CLEANUP /* FhG: BE, address TODO comment in fd_cng_enc */ -- GitLab From 6d9e75ba25499cf73cbbb28e8ca2b2cf1b8f7f3b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:33:21 +0200 Subject: [PATCH 354/381] [cleanup] accept REMOVE_OBS_CODE --- lib_com/options.h | 1 - lib_dec/ivas_cpe_dec.c | 7 ------- 2 files changed, 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b04219d7b3..01b3458b28 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,6 @@ #define FIX_545_ASSERT /* VA: fix issue 545, replace assert() with warning message when hitting memory limit in the buffer of indices */ #endif -#define REMOVE_OBS_CODE /* FhG: Remove unnecessary assignement after LFE cleanup (Issue #451)*/ #define FIX_TODO_FD_CNG_SBA_CLEANUP /* FhG: BE, address TODO comment in fd_cng_enc */ #define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 8db688760d..f5d7ca746c 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -831,13 +831,6 @@ void destroy_cpe_dec( int16_t n; Decoder_State *st; -#ifndef REMOVE_OBS_CODE - /* make sure we deallocate a potential distinct hTcxCfg for a MCT LFE channel (can only happen in rs) */ /*TODO Check this again with LFE clean up!*/ - if ( hCPE->hCoreCoder[1] != NULL && hCPE->hCoreCoder[1]->hTcxCfg != hCPE->hCoreCoder[0]->hTcxCfg ) - { - hCPE->hCoreCoder[1]->mct_chan_mode = MCT_CHAN_MODE_IGNORE; - } -#endif for ( n = 0; n < CPE_CHANNELS; n++ ) { -- GitLab From 9d74986d1e6958c84e7419ebbd4027ca38093975 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:34:25 +0200 Subject: [PATCH 355/381] [cleanup] accept FIX_TODO_FD_CNG_SBA_CLEANUP --- lib_com/options.h | 1 - lib_enc/fd_cng_enc.c | 24 ------------------------ 2 files changed, 25 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 01b3458b28..3b1939aebc 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -152,7 +152,6 @@ #endif -#define FIX_TODO_FD_CNG_SBA_CLEANUP /* FhG: BE, address TODO comment in fd_cng_enc */ #define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ #define BINAURAL_AUDIO_CMDLINE /* issue 491: Implement Commandline-Option for Binaural Audio */ diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index 647370ddfe..b460f1ea32 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -1277,21 +1277,15 @@ void FdCngEncodeDiracMDCTStereoSID( lr_out_ptr[ch] = &sts[ch]->hFdCngEnc->hFdCngCom->sidNoiseEst[0]; } set_f( weights, 1.f, NPART ); -#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP #ifdef DEBUGGING assert( N[0] == N[1] ); -#endif #endif /* apply log and save energy of original left and right channels */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { E[ch] = 0.0f; -#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP for ( p = 0; p < N[ch]; p++ ) -#else - for ( p = 0; p < NPART; p++ ) -#endif { ms_ptr[ch][p] = 10.f * log10f( lr_in_ptr[ch][p] + EPSILON ); E[ch] += ms_ptr[ch][p]; @@ -1299,15 +1293,9 @@ void FdCngEncodeDiracMDCTStereoSID( } /* M/S transform on log envelopes */ -#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP convertToMS( N[0], ms_ptr[0], ms_ptr[1], 0.5f ); E[0] = sum_f( ms_ptr[0], N[0] ); -#else - convertToMS( NPART, ms_ptr[0], ms_ptr[1], 0.5f ); - - E[0] = sum_f( ms_ptr[0], NPART ); -#endif /* Quantize M noise shape */ /* Normalize MSVQ input */ @@ -1342,11 +1330,7 @@ void FdCngEncodeDiracMDCTStereoSID( set_zero( ms_ptr[1], NPART ); /* compute M gain */ -#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP gain[0] = sum_f( ms_ptr[0], N[0] ); -#else - gain[0] = sum_f( ms_ptr[0], NPART ); -#endif gain[0] = ( E[0] - gain[0] ) / (float) N[0]; apply_scale( &gain[0], sts[0]->hFdCngEnc->hFdCngCom->CngBandwidth, sts[0]->hDtxEnc->last_active_brate, scaleTableStereo, SIZE_SCALE_TABLE_STEREO ); @@ -1358,11 +1342,7 @@ void FdCngEncodeDiracMDCTStereoSID( gain[1] = gain[0]; /* undo M/S */ -#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP convertToMS( NPART, ms_ptr[0], ms_ptr[1], 1.0f ); -#else - convertToMS( N[0], ms_ptr[0], ms_ptr[1], 1.0f ); -#endif /* restore channel noise envelopes */ for ( ch = 0; ch < CPE_CHANNELS; ch++ ) @@ -1370,11 +1350,7 @@ void FdCngEncodeDiracMDCTStereoSID( HANDLE_FD_CNG_ENC hFdCngEnc = sts[ch]->hFdCngEnc; HANDLE_FD_CNG_COM hFdCngCom = hFdCngEnc->hFdCngCom; -#ifdef FIX_TODO_FD_CNG_SBA_CLEANUP for ( p = 0; p < N[0]; p++ ) -#else - for ( p = 0; p < NPART; p++ ) -#endif { lr_out_ptr[ch][p] = powf( 10.f, ( ms_ptr[ch][p] + gain[ch] ) / 10.f ); } -- GitLab From 08558c6bc73177c7ed886a5eb95093f73ecf57d4 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:35:11 +0200 Subject: [PATCH 356/381] [cleanup] accept ENHANCED_STEREO_DMX --- lib_com/ivas_cnst.h | 2 -- lib_com/options.h | 1 - lib_enc/ivas_stat_enc.h | 4 --- lib_enc/ivas_stereo_dmx_evs.c | 51 ----------------------------------- 4 files changed, 58 deletions(-) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 89f0dd2b11..32c89d68b7 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -1745,7 +1745,6 @@ typedef enum #define IVAS_LIMITER_THRESHOLD 32729 /* -0.01 dBFS */ #define IVAS_LIMITER_ATTACK_SECONDS 0.005f -#ifdef ENHANCED_STEREO_DMX /*----------------------------------------------------------------------------------* * Stereo downmix EVS constants *----------------------------------------------------------------------------------*/ @@ -1779,7 +1778,6 @@ typedef enum STEREO_DMX_EVS_PRC_PHA, } STEREO_DMX_EVS_PRC; -#endif #endif /* clang-format on */ diff --git a/lib_com/options.h b/lib_com/options.h index 3b1939aebc..be04ef5d4c 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -152,7 +152,6 @@ #endif -#define ENHANCED_STEREO_DMX /* Orange : Contribution 48 - Enhanced stereo downmix. */ #define BINAURAL_AUDIO_CMDLINE /* issue 491: Implement Commandline-Option for Binaural Audio */ #define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index a906bca1cd..498d975020 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -998,7 +998,6 @@ typedef struct stereo_dmx_evs_phase_only_correlation_structure } STEREO_DMX_EVS_POC_DATA, *STEREO_DMX_EVS_POC_HANDLE; -#ifdef ENHANCED_STEREO_DMX typedef struct stereo_dmx_evs_correlation_filter_structure { int16_t init_frmCntr; @@ -1035,13 +1034,10 @@ typedef struct stereo_dmx_evs_correlation_filter_structure } STEREO_DMX_EVS_PHA_DATA, *STEREO_DMX_EVS_PHA_HANDLE; -#endif typedef struct stereo_dmx_evs_enc_data_structure { STEREO_DMX_EVS_POC_HANDLE hPOC; -#ifdef ENHANCED_STEREO_DMX STEREO_DMX_EVS_PHA_HANDLE hPHA; -#endif float itd; diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index e479e28cdb..08c139a8c4 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -65,7 +65,6 @@ #define Q_BAND 0.25f -#ifdef ENHANCED_STEREO_DMX #define STEREO_DMX_EVS_ISD_FORGETTING 0.95f #define STEREO_DMX_EVS_ISD_THRES_H 1.69f @@ -99,20 +98,14 @@ #define STEREO_DMX_EVS_TRNS_EGY_FORGETTING 0.75f -#endif /*-----------------------------------------------------------------------* * Local function prototypes *-----------------------------------------------------------------------*/ static void estimate_itd_wnd_fft( const float *input, float *specr, float *speci, const float *rfft_coef, const float *wnd, const int16_t input_frame ); -#ifdef ENHANCED_STEREO_DMX static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame ); static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, STEREO_DMX_EVS_PHA_HANDLE hPHA, const float srcL[], const float srcR[], float itd[], const int16_t input_frame ); -#else -static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, const float wnd[], const float rfft_coef[], const float specLr[], const float specLi[], const float specRr[], const float specRi[], const int16_t input_frame ); -static ivas_error estimate_itd( float *corr, STEREO_DMX_EVS_POC_HANDLE hPOC, const float srcL[], const float srcR[], float itd[], const int16_t input_frame ); -#endif static void weighted_ave( const float src1[], const float src2[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] ); static void adapt_gain( const float src[], float dst[], const float gain, const float old_gain, const int16_t input_frame, const float wnd[] ); static void create_M_signal( const float srcL[], const float srcR[], float dmx[], const float w_curr, const int16_t input_frame, const float wnd[], float *w_prev, float *dmx_energy, float *src_energy ); @@ -182,9 +175,7 @@ void estimate_itd_wnd_fft( static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ -#ifdef ENHANCED_STEREO_DMX STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */ -#endif const float wnd[], /* i : window coef */ const float rfft_coef[], /* i : RFFT coef */ const float specLr[], /* i : Lch real-part spectra */ @@ -211,13 +202,11 @@ static void calc_poc( int16_t cos_step, cos_max; float eps_cos, eps_sin, EPS; -#ifdef ENHANCED_STEREO_DMX int16_t isd_cnt_h, isd_cnt_l, ild_cnt, n, freq_8k, freq_ipd_max, nsbd, input_frame_pha; float Nr, Ni, Dr, Di, tPr, tPi, Pn, energy, isd_rate; float eneL, eneR, IPDr, IPDi, tIPDr, tIPDi, ICCr; float *Pr, *Pi, *ipd_ff, *p_curr_taps; float rfft_pha_buf[L_FRAME48k], tEr[STEREO_DMX_EVS_NB_SUBBAND_MAX], tEl[STEREO_DMX_EVS_NB_SUBBAND_MAX]; -#endif /* Initialization */ iN = 1.0f / (float) input_frame; @@ -226,12 +215,10 @@ static void calc_poc( n0 = input_frame / 2; itdLR = hPOC->itdLR; -#ifdef ENHANCED_STEREO_DMX Pr = hPHA->Pr; Pi = hPHA->Pi; nsbd = n0 / STEREO_DMX_EVS_SUBBAND_SIZE; input_frame_pha = input_frame / STEREO_DMX_EVS_SUBBAND_SIZE; -#endif igamma = STEREO_DMX_EVS_POC_GAMMA * iN; gamma = 1.0f - igamma; @@ -394,7 +381,6 @@ static void calc_poc( } specPOr[n0] = sign( specLr[n0] * specRr[n0] ) * wnd[i * step + bias] * gamma; -#ifdef ENHANCED_STEREO_DMX hPHA->init_frmCntr--; if ( hPHA->init_frmCntr < 0 ) @@ -678,7 +664,6 @@ static void calc_poc( } } -#endif rfft_buf[0] = specPOr[0]; rfft_buf[1] = specPOr[n0]; @@ -892,9 +877,7 @@ static float find_poc_peak( static ivas_error estimate_itd( float *corr, /* o : correlation */ STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ -#ifdef ENHANCED_STEREO_DMX STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */ -#endif const float srcL[], /* i : Lch input signal */ const float srcR[], /* i : Rch input signal */ float itd[], /* o : estimated itd */ @@ -943,11 +926,7 @@ static ivas_error estimate_itd( estimate_itd_wnd_fft( srcL, specLr, specLi, rfft_coef, hPOC->wnd, input_frame ); estimate_itd_wnd_fft( srcR, specRr, specRi, rfft_coef, hPOC->wnd, input_frame ); -#ifdef ENHANCED_STEREO_DMX calc_poc( hPOC, hPHA, hPOC->wnd, rfft_coef, specLr, specLi, specRr, specRi, input_frame ); -#else - calc_poc( hPOC, hPOC->wnd, rfft_coef, specLr, specLi, specRr, specRi, input_frame ); -#endif *corr = find_poc_peak( hPOC, itd, input_frame, STEREO_DMX_EVS_POC_W_FORGETTING ); return error; @@ -1149,7 +1128,6 @@ void stereo_dmx_evs_enc( float dmx_weight, corr; float data_f[CPE_CHANNELS][L_FRAME48k]; -#ifdef ENHANCED_STEREO_DMX int16_t k, m, pha_len, fad_len; float mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; float *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data; @@ -1157,9 +1135,6 @@ void stereo_dmx_evs_enc( STEREO_DMX_EVS_PRC curr_prc; int16_t input_subframe, is_transient; float *p_sub_frame, subframe_energy[STEREO_DMX_EVS_NB_SBFRM]; -#else - float dmx_data[L_FRAME48k]; -#endif int16_t input_frame; @@ -1183,7 +1158,6 @@ void stereo_dmx_evs_enc( set_f( data_f[1] + n_samples, 0.0f, input_frame - n_samples ); } -#ifdef ENHANCED_STEREO_DMX input_subframe = n_samples / STEREO_DMX_EVS_NB_SBFRM; is_transient = 0; @@ -1390,25 +1364,6 @@ void stereo_dmx_evs_enc( mvr2s( p_dmx_data, data, n_samples ); -#else - - estimate_itd( &corr, hStereoDmxEVS->hPOC, data_f[0], data_f[1], &hStereoDmxEVS->itd, input_frame ); - - if ( hStereoDmxEVS->itd ) - { - dmx_weight = ( ( hStereoDmxEVS->itd > 0 ) ? ( -1 ) : 1 ) * 0.5f * corr + 0.5f; - } - else - { - dmx_weight = 0.5f; - } - - create_M_signal( data_f[0], data_f[1], dmx_data, dmx_weight, input_frame, hStereoDmxEVS->s_wnd, - hStereoDmxEVS->dmx_weight, hStereoDmxEVS->pre_dmx_energy, hStereoDmxEVS->aux_dmx_energy ); - - mvr2s( dmx_data, data, n_samples ); - -#endif return; } @@ -1428,11 +1383,9 @@ ivas_error stereo_dmx_evs_init_encoder( STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS; int16_t n, input_frame; -#ifdef ENHANCED_STEREO_DMX int16_t m, len, pha_len, fad_len, fad_len2, trans_len, itrh, rfft_ipd_coef_step, n0, input_frame_pha; float *win, *fad_g, fad_r, tmp_r, a_min, a_max, a_step, *ipd_ff; const float *p_ipd_w; -#endif input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); @@ -1523,7 +1476,6 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPOC->confidence = 0.0f; -#ifdef ENHANCED_STEREO_DMX hStereoDmxEVS->hPHA = NULL; if ( ( hStereoDmxEVS->hPHA = (STEREO_DMX_EVS_PHA_HANDLE) malloc( sizeof( STEREO_DMX_EVS_PHA_DATA ) ) ) == NULL ) @@ -1671,7 +1623,6 @@ ivas_error stereo_dmx_evs_init_encoder( hStereoDmxEVS->hPHA->trns_aux_energy[n] = 0.0f; } -#endif *hStereoDmxEVS_out = hStereoDmxEVS; @@ -1700,13 +1651,11 @@ void stereo_dmx_evs_close_encoder( ( *hStereoDmxEVS )->hPOC = NULL; } -#ifdef ENHANCED_STEREO_DMX if ( ( *hStereoDmxEVS )->hPHA != NULL ) { free( ( *hStereoDmxEVS )->hPHA ); ( *hStereoDmxEVS )->hPHA = NULL; } -#endif free( ( *hStereoDmxEVS ) ); ( *hStereoDmxEVS ) = NULL; -- GitLab From ab094fd75dc8cf3954bfd5fdb7f91704cd0661a8 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:47:32 +0200 Subject: [PATCH 357/381] [cleanup] accept BINAURAL_AUDIO_CMDLINE --- apps/encoder.c | 20 -------------------- lib_com/ivas_prot.h | 4 ---- lib_com/options.h | 1 - lib_enc/ivas_stat_enc.h | 2 -- lib_enc/ivas_stereo_dmx_evs.c | 6 ------ lib_enc/lib_enc.c | 22 ---------------------- lib_enc/lib_enc.h | 8 -------- 7 files changed, 63 deletions(-) diff --git a/apps/encoder.c b/apps/encoder.c index 10fd12a94b..75798f240d 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -98,9 +98,7 @@ typedef struct char *outputBitstreamFilename; int32_t inputFs; IVAS_ENC_INPUT_FORMAT inputFormat; -#ifdef BINAURAL_AUDIO_CMDLINE bool is_binaural; -#endif EncInputFormatConfig inputFormatConfig; bool max_bwidth_user; IVAS_ENC_BANDWIDTH maxBandwidth; @@ -365,29 +363,17 @@ int main( switch ( arg.inputFormat ) { case IVAS_ENC_INPUT_MONO: -#ifdef BINAURAL_AUDIO_CMDLINE if ( ( error = IVAS_ENC_ConfigureForMono( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, caConfig, arg.inputFormatConfig.stereoToMonoDownmix, arg.is_binaural ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_ENC_ConfigureForMono( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, caConfig, arg.inputFormatConfig.stereoToMonoDownmix ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nIVAS_ENC_ConfigureForMono failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); goto cleanup; } break; case IVAS_ENC_INPUT_STEREO: -#ifdef BINAURAL_AUDIO_CMDLINE #ifdef DEBUGGING if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural, arg.inputFormatConfig.stereoMode ) ) != IVAS_ERR_OK ) #else if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.is_binaural ) ) != IVAS_ERR_OK ) -#endif -#else -#ifdef DEBUGGING - if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig, arg.inputFormatConfig.stereoMode ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_ENC_ConfigureForStereo( hIvasEnc, arg.inputFs, totalBitrate, arg.max_bwidth_user, bandwidth, arg.dtxConfig ) ) != IVAS_ERR_OK ) -#endif #endif { fprintf( stderr, "\nIVAS_ENC_ConfigureForStereo failed: %s\n\n", IVAS_ENC_GetErrorMessage( error ) ); @@ -880,9 +866,7 @@ static void initArgStruct( EncArguments *arg ) arg->outputBitstreamFilename = NULL; arg->inputFs = 0; arg->inputFormat = IVAS_ENC_INPUT_MONO; -#ifdef BINAURAL_AUDIO_CMDLINE arg->is_binaural = false; -#endif arg->inputFormatConfig.stereoToMonoDownmix = false; arg->max_bwidth_user = false; arg->maxBandwidth = IVAS_ENC_BANDWIDTH_UNDEFINED; @@ -1302,13 +1286,11 @@ static bool parseCmdlIVAS_enc( } #endif /* DEBUGGING */ } -#ifdef BINAURAL_AUDIO_CMDLINE else if ( strcmp( argv_to_upper, "-BINAURAL" ) == 0 ) { arg->is_binaural = true; i++; } -#endif else if ( strcmp( argv_to_upper, "-ISM" ) == 0 ) { arg->inputFormat = IVAS_ENC_INPUT_ISM; @@ -1731,9 +1713,7 @@ static void usage_enc( void ) fprintf( stdout, " alternatively, B can be a text file where each line contains \"nb_frames B\"\n" ); fprintf( stdout, "-no_delay_cmp : Turn off delay compensation\n" ); fprintf( stdout, "-stereo_dmx_evs : Activate stereo downmix function for EVS.\n" ); -#ifdef BINAURAL_AUDIO_CMDLINE fprintf( stdout, "-binaural : Optional indication that input is binaural audio (to be used with -stereo or -stereo_dmx_evs)\n" ); -#endif fprintf( stdout, "-mime : Mime output bitstream file format\n" ); fprintf( stdout, " The encoder produces TS26.445 Annex.2.6 Mime Storage Format, (not RFC4867 Mime Format).\n" ); fprintf( stdout, " default output bitstream file format is G.192\n" ); diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 01d7967980..bf3f847ab5 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -61,12 +61,8 @@ void stereo_dmx_evs_enc( STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ const int32_t input_Fs, /* i : input sampling rate */ int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */ -#ifdef BINAURAL_AUDIO_CMDLINE const int16_t n_samples, /* i : number of input samples */ const bool is_binaural /* i : indication that input is binaural audio */ -#else - const int16_t n_samples /* i : number of input samples */ -#endif ); /*! r: number of channels to be analysed */ diff --git a/lib_com/options.h b/lib_com/options.h index be04ef5d4c..de24fc7c52 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ -#define BINAURAL_AUDIO_CMDLINE /* issue 491: Implement Commandline-Option for Binaural Audio */ #define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ #define FIX_506 /* FhG: Compiler warnings */ #define FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH /* Nokia: Issue 511, significant optimization of parametric binauralizer gain fetching. */ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 498d975020..5ab31a5b47 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -1081,9 +1081,7 @@ typedef struct encoder_config_structure int16_t nchan_inp; /* number of input audio channels */ int16_t max_bwidth; /* maximum encoded bandwidth */ IVAS_FORMAT ivas_format; /* IVAS format */ -#ifdef BINAURAL_AUDIO_CMDLINE int16_t is_binaural; /* flag indicating if input is binaural audio */ -#endif int16_t element_mode_init; /* element mode used at initialization */ int16_t stereo_dmx_evs; /* flag to indicate that stereo downmix for EVS encoder */ diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 08c139a8c4..7dd09f2986 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -1116,12 +1116,8 @@ void stereo_dmx_evs_enc( STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ const int32_t input_Fs, /* i : input sampling rate */ int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */ -#ifdef BINAURAL_AUDIO_CMDLINE const int16_t n_samples, /* i : number of input samples */ const bool is_binaural /* i : indication that input is binaural audio */ -#else - const int16_t n_samples /* i : number of input samples */ -#endif ) { int16_t n; @@ -1138,12 +1134,10 @@ void stereo_dmx_evs_enc( int16_t input_frame; -#ifdef BINAURAL_AUDIO_CMDLINE if ( is_binaural ) { /* use of is_binaural flag is to be considered */ } -#endif input_frame = (int16_t) ( input_Fs / FRAMES_PER_SEC ); diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index 2668eed044..99fad4f631 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -264,12 +264,8 @@ ivas_error IVAS_ENC_ConfigureForMono( const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */ -#ifdef BINAURAL_AUDIO_CMDLINE const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ const bool is_binaural /* i : if true, the input is binaural audio */ -#else - const bool downmixFromStereo /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ -#endif ) { ivas_error error; @@ -282,9 +278,7 @@ ivas_error IVAS_ENC_ConfigureForMono( } hIvasEnc->st_ivas->hEncoderConfig->ivas_format = MONO_FORMAT; -#ifdef BINAURAL_AUDIO_CMDLINE hIvasEnc->st_ivas->hEncoderConfig->is_binaural = (int16_t) is_binaural; -#endif if ( downmixFromStereo ) { @@ -310,12 +304,8 @@ ivas_error IVAS_ENC_ConfigureForStereo( const int32_t bitrate, /* i : requested bitrate of the output bitstream */ const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ -#ifdef BINAURAL_AUDIO_CMDLINE const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ const bool is_binaural /* i : flag indicating if input is binaural audio */ -#else - const IVAS_ENC_DTX_CONFIG dtxConfig /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ -#endif #ifdef DEBUGGING , const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */ @@ -336,9 +326,7 @@ ivas_error IVAS_ENC_ConfigureForStereo( hEncoderConfig = st_ivas->hEncoderConfig; hEncoderConfig->nchan_inp = 2; hEncoderConfig->ivas_format = STEREO_FORMAT; -#ifdef BINAURAL_AUDIO_CMDLINE hEncoderConfig->is_binaural = (int16_t) is_binaural; -#endif #ifdef DEBUGGING switch ( stereoMode ) @@ -933,12 +921,10 @@ static ivas_error configureEncoder( return error; } -#ifdef BINAURAL_AUDIO_CMDLINE if ( hEncoderConfig->is_binaural && !( ( hEncoderConfig->ivas_format == MONO_FORMAT && hEncoderConfig->stereo_dmx_evs ) || hEncoderConfig->ivas_format == STEREO_FORMAT ) ) { return IVAS_ERROR( IVAS_ERR_NOT_SUPPORTED_OPTION, "'-binaural' option is supported only with '-stereo' or '-stereo_dmx_evs'" ); } -#endif /*-----------------------------------------------------------------* * Finalize initialization @@ -1261,11 +1247,7 @@ ivas_error IVAS_ENC_EncodeFrameToSerial( if ( hEncoderConfig->stereo_dmx_evs == 1 ) { inputBufferSize /= 2; -#ifdef BINAURAL_AUDIO_CMDLINE stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize, hEncoderConfig->is_binaural ); -#else - stereo_dmx_evs_enc( st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, inputBuffer, inputBufferSize ); -#endif } if ( hEncoderConfig->Opt_AMR_WB ) @@ -1649,12 +1631,10 @@ static ivas_error printConfigInfo_enc( } } -#ifdef BINAURAL_AUDIO_CMDLINE if ( hEncoderConfig->is_binaural ) { fprintf( stdout, "Optional indication: binaural audio\n" ); } -#endif /*-----------------------------------------------------------------* * Print CNG update interval, if DTX is activated @@ -2325,9 +2305,7 @@ static void init_encoder_config( hEncoderConfig->nchan_inp = 1; hEncoderConfig->element_mode_init = EVS_MONO; hEncoderConfig->ivas_format = UNDEFINED_FORMAT; -#ifdef BINAURAL_AUDIO_CMDLINE hEncoderConfig->is_binaural = 0; -#endif hEncoderConfig->Opt_SC_VBR = 0; hEncoderConfig->last_Opt_SC_VBR = 0; hEncoderConfig->Opt_AMR_WB = 0; diff --git a/lib_enc/lib_enc.h b/lib_enc/lib_enc.h index 8d8ede4d77..9d25787557 100644 --- a/lib_enc/lib_enc.h +++ b/lib_enc/lib_enc.h @@ -162,12 +162,8 @@ ivas_error IVAS_ENC_ConfigureForMono( const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */ -#ifdef BINAURAL_AUDIO_CMDLINE const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ const bool is_binaural /* i : if true, the input is binaural audio */ -#else - const bool downmixFromStereo /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ -#endif ); /*! r: error code */ @@ -177,12 +173,8 @@ ivas_error IVAS_ENC_ConfigureForStereo( const int32_t bitrate, /* i : requested bitrate of the output bitstream */ const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ -#ifdef BINAURAL_AUDIO_CMDLINE const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ const bool is_binaural /* i : flag indicating if input is binaural audio */ -#else - const IVAS_ENC_DTX_CONFIG dtxConfig /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ -#endif #ifdef DEBUGGING , const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */ -- GitLab From 35930bfa47142b5322f096e05b9d90f6cebbf4bc Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:49:28 +0200 Subject: [PATCH 358/381] [cleanup] accept FIX_570_TCX_LPC_WRITE --- lib_com/options.h | 1 - lib_enc/ivas_tcx_core_enc.c | 7 ------- 2 files changed, 8 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index de24fc7c52..4d4b3810ff 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ -#define FIX_570_TCX_LPC_WRITE /* FhG: fix issue 570: LPC bitstream writer in TCX */ #define FIX_506 /* FhG: Compiler warnings */ #define FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH /* Nokia: Issue 511, significant optimization of parametric binauralizer gain fetching. */ #define FIX_122_MC_DECODER_COMPLEXITY /* FhG: Issue 122, significant decrease of worst case MC decoder complexity */ diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index ac304e64a4..c5192f0393 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -397,14 +397,7 @@ void stereo_tcx_core_enc( * Write LPC parameters *--------------------------------------------------------------------------------*/ -#ifndef FIX_570_TCX_LPC_WRITE - n = st->coder_type; /* IVAS_fmToDo: hack to keep bit-exactness -> TBV */ - st->coder_type = INACTIVE; -#endif writeLPCparam( st, hBstr, param_lpc, bits_param_lpc, no_param_lpc, &total_nbbits ); -#ifndef FIX_570_TCX_LPC_WRITE - st->coder_type = n; -#endif assert( total_nbbits == ( nbits_lpc[0] + nbits_lpc[1] ) ); #ifdef DEBUG_MODE_TCX -- GitLab From 7f6d5fbb65fd72328fac26ba70543e82ab165b42 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:51:19 +0200 Subject: [PATCH 359/381] [cleanup] accept FIX_506 --- lib_com/options.h | 1 - lib_dec/LD_music_post_filter.c | 9 --------- lib_dec/hq_lr_dec.c | 9 --------- lib_dec/ivas_svd_dec.c | 12 ------------ lib_dec/swb_bwe_dec_lr.c | 9 --------- lib_enc/swb_bwe_enc_lr.c | 18 ------------------ 6 files changed, 58 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4d4b3810ff..ac156a09ea 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ -#define FIX_506 /* FhG: Compiler warnings */ #define FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH /* Nokia: Issue 511, significant optimization of parametric binauralizer gain fetching. */ #define FIX_122_MC_DECODER_COMPLEXITY /* FhG: Issue 122, significant decrease of worst case MC decoder complexity */ #define FIX_531_BWS_ISM_BFI /* VA: issue 531: fix MemorySanitizer: use-of-uninitialized-value in ISM2 rate switching with frame errors */ diff --git a/lib_dec/LD_music_post_filter.c b/lib_dec/LD_music_post_filter.c index 0b8bed426c..2a642d2647 100644 --- a/lib_dec/LD_music_post_filter.c +++ b/lib_dec/LD_music_post_filter.c @@ -388,9 +388,6 @@ static void spectrum_mod_dct( float inv_noise[MBANDS_GN_LD]; float *pt_gbin, alpha, tmpN; int16_t i; -#ifndef FIX_506 - int16_t cnt; -#endif float *pt; float tmp, shift; const float *pt2; @@ -478,9 +475,6 @@ static void spectrum_mod_dct( tmpN = slope * inv_noise[i]; tmp = 0.0f; -#ifndef FIX_506 - cnt = 0; -#endif while ( freq <= mfreq_loc_LD[i] ) { gain = 1.0f; @@ -507,9 +501,6 @@ static void spectrum_mod_dct( *pt_gbin = gain + alpha * *pt_gbin; *pt++ *= *pt_gbin; -#ifndef FIX_506 - cnt++; -#endif freq += BIN_16kdct; pt_gbin++; } diff --git a/lib_dec/hq_lr_dec.c b/lib_dec/hq_lr_dec.c index 1fa8b168c4..47a5d10d5f 100644 --- a/lib_dec/hq_lr_dec.c +++ b/lib_dec/hq_lr_dec.c @@ -1370,14 +1370,8 @@ static void spt_shorten_domain_set_dec( ) { int16_t j, k; -#ifndef FIX_506 - int16_t kpos; -#endif int16_t spt_shorten_flag[SPT_SHORTEN_SBNUM]; -#ifndef FIX_506 - kpos = 0; -#endif j = 0; for ( k = bands - SPT_SHORTEN_SBNUM; k < bands; k++ ) { @@ -1394,9 +1388,6 @@ static void spt_shorten_domain_set_dec( } } -#ifndef FIX_506 - kpos++; -#endif j++; } diff --git a/lib_dec/ivas_svd_dec.c b/lib_dec/ivas_svd_dec.c index 7c4a0cf4bb..e1105bce9d 100644 --- a/lib_dec/ivas_svd_dec.c +++ b/lib_dec/ivas_svd_dec.c @@ -96,26 +96,14 @@ void mat2svdMat( ) { int16_t i, j; -#ifndef FIX_506 - int16_t posCounter; -#endif if ( transpose ) { -#ifndef FIX_506 - posCounter = 0; -#endif for ( i = 0; i < mCols; i++ ) { for ( j = 0; j < nRows; j++ ) { svdMat[i][j] = mat[j + nRows * i]; -#ifndef FIX_506 - if ( mat[j + nRows * i] > 0.0f ) - { - posCounter++; - } -#endif } set_zero( &svdMat[i][mCols], MAX_OUTPUT_CHANNELS - nRows ); diff --git a/lib_dec/swb_bwe_dec_lr.c b/lib_dec/swb_bwe_dec_lr.c index 222316151d..0d5c64b5d9 100644 --- a/lib_dec/swb_bwe_dec_lr.c +++ b/lib_dec/swb_bwe_dec_lr.c @@ -130,9 +130,6 @@ static void DecodeSWBSubbands( float ss_min = 1.0f, g, be_tonal[SWB_HAR_RAN1], xSynth_har[L_FRAME32k]; GainItem pk_sf[(NB_SWB_SUBBANDS) *8]; int16_t lagIndices_real[NB_SWB_SUBBANDS]; -#ifndef FIX_506 - int16_t cnt; -#endif int16_t pul_res[NB_SWB_SUBBANDS], imin; int16_t har_freq_est1 = 0; int16_t har_freq_est2 = 0; @@ -205,18 +202,12 @@ static void DecodeSWBSubbands( { lagGains[k] *= 0.9f; } -#ifndef FIX_506 - cnt = 0; -#endif for ( k = 0; k < NB_SWB_SUBBANDS; k++ ) { th_g[k] = 0.0f; if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + k] == 0 ) { th_g[k] = lagGains[k] * ss_min; -#ifndef FIX_506 - cnt++; -#endif } } /* Construct spectrum */ diff --git a/lib_enc/swb_bwe_enc_lr.c b/lib_enc/swb_bwe_enc_lr.c index dd5bf3b4ca..63c432ea1a 100644 --- a/lib_enc/swb_bwe_enc_lr.c +++ b/lib_enc/swb_bwe_enc_lr.c @@ -66,15 +66,9 @@ static int16_t GetSubbandCorrIndex2_har( int16_t bestIdx, i, j; float corr, energy, corr_sq; float lagCorr_sq, lagEnergy, eOld; -#ifndef FIX_506 - int16_t absPos; -#endif int16_t N1, N2; -#ifndef FIX_506 - absPos = 0; -#endif bestIdx = 0; lagCorr_sq = 0.0f; lagEnergy = 1e30f; @@ -134,9 +128,6 @@ static int16_t GetSubbandCorrIndex2_har( } predBuf++; -#ifndef FIX_506 - absPos++; -#endif } if ( lagCorr_sq == 0.0f && *prev_frame_bstindx < 0 ) @@ -518,9 +509,6 @@ static void EncodeSWBSubbands( float sspectra_ni[L_FRAME32k], sspectra_diff[L_FRAME32k], be_tonal[SWB_HAR_RAN1], xSynth_har[L_FRAME32k]; float ss_min = 1.0f, th_g[NB_SWB_SUBBANDS]; GainItem pk_sf[(NB_SWB_SUBBANDS) *8]; -#ifndef FIX_506 - int16_t cnt; -#endif int16_t pul_res[NB_SWB_SUBBANDS]; int16_t har_freq_est1 = 0, har_freq_est2 = 0; int16_t flag_dis = 1; @@ -608,18 +596,12 @@ static void EncodeSWBSubbands( lagGains[k] *= 0.9f; } -#ifndef FIX_506 - cnt = 0; -#endif for ( k = 0; k < NB_SWB_SUBBANDS; k++ ) { th_g[k] = 0.0f; if ( p2a_flags[BANDS - NB_SWB_SUBBANDS + k] == 0 ) { th_g[k] = lagGains[k] * ss_min; -#ifndef FIX_506 - cnt++; -#endif } } -- GitLab From 3d96a7e61535b7d59edfd0ddd852f14f52f1eb9d Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:56:11 +0200 Subject: [PATCH 360/381] [cleanup] accept FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH --- lib_com/options.h | 1 - lib_rend/ivas_dirac_dec_binaural_functions.c | 93 -------------------- 2 files changed, 94 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index ac156a09ea..fd4f8dc872 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ -#define FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH /* Nokia: Issue 511, significant optimization of parametric binauralizer gain fetching. */ #define FIX_122_MC_DECODER_COMPLEXITY /* FhG: Issue 122, significant decrease of worst case MC decoder complexity */ #define FIX_531_BWS_ISM_BFI /* VA: issue 531: fix MemorySanitizer: use-of-uninitialized-value in ISM2 rate switching with frame errors */ #define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 36e83bf718..a02cd5f1d9 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -64,7 +64,6 @@ #define ADAPT_HTPROTO_ROT_LIM_0 0.4f #define ADAPT_HTPROTO_ROT_LIM_1 0.8f -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH #define MAX_GAIN_CACHE_SIZE 6 typedef struct hrtfGainCache @@ -74,7 +73,6 @@ typedef struct hrtfGainCache float shVec[HRTF_SH_CHANNELS]; } PARAMBIN_HRTF_GAIN_CACHE; -#endif /*------------------------------------------------------------------------- @@ -91,15 +89,9 @@ static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, static void ivas_dirac_dec_decorrelate_slot( DIRAC_DEC_HANDLE hDirAC, const int16_t slot, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float decRe[][CLDFB_NO_CHANNELS_MAX], float decIm[][CLDFB_NO_CHANNELS_MAX] ); -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe, const int16_t isHeadtracked ); static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3], const int16_t isHeadtracked ); -#else -static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( Decoder_Struct *st_ivas, float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], const int16_t subframe ); - -static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, float Rmat[3][3] ); -#endif static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); @@ -128,15 +120,9 @@ static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( float Rmat[3][3] ); static void formulate2x2MixingMatrix( float Ein1, float Ein2, float CinRe, float CinIm, float Eout1, float Eout2, float CoutRe, float CoutIm, float Q[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Mim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], const float regularizationFactor ); -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH static void hrtfShGetHrtf( const int16_t bin, const int16_t aziDeg, const int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t useCachedValue ); static void getDirectPartGains( const int16_t bin, int16_t aziDeg, int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, const uint8_t stereoMode, float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t isHeadtracked ); -#else -static void hrtfShGetHrtf( const int16_t bin, const int16_t aziDeg, const int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp ); - -static void getDirectPartGains( const int16_t bin, int16_t aziDeg, int16_t eleDeg, float *lRealp, float *lImagp, float *rRealp, float *rImagp, const uint8_t stereoMode, float Rmat[3][3] ); -#endif static void matrixMul( float Are[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Aim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bre[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float Bim[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outRe[BINAURAL_CHANNELS][BINAURAL_CHANNELS], float outIm[BINAURAL_CHANNELS][BINAURAL_CHANNELS] ); @@ -715,16 +701,12 @@ static void ivas_dirac_dec_binaural_internal( #endif } -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe, #ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 ); #else st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); #endif -#else - ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe ); -#endif if ( st_ivas->ivas_format == ISM_FORMAT ) { @@ -739,15 +721,11 @@ static void ivas_dirac_dec_binaural_internal( max_band_decorr = st_ivas->hDirAC->h_freq_domain_decorr_ap_params->max_band_decorr; } -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat, #ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 ); #else st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); -#endif -#else - ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat ); #endif ivas_dirac_dec_binaural_process_output( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, subframe ); @@ -818,12 +796,8 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float Rmat[3][3], -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH const int16_t subframe, const int16_t isHeadtracked ) -#else - const int16_t subframe ) -#endif { int16_t ch, slot, bin; uint8_t separateCenterChannelRendering; @@ -837,9 +811,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric uint8_t applyLowBitRateEQ; int16_t dirac_read_idx; float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_GAIN_CACHE_SIZE]; -#endif hDirAC = st_ivas->hDirAC; h = st_ivas->hDiracDecBin; @@ -859,12 +831,10 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric set_zero( frameMeanDiffusenessEneWeight, CLDFB_NO_CHANNELS_MAX ); -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH for ( idx = 0; idx < MAX_GAIN_CACHE_SIZE; idx++ ) { gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ } -#endif /* Determine EQ for low bit rates (13.2 and 16.4 kbps) */ applyLowBitRateEQ = 0; @@ -976,7 +946,6 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } else /* For second of the two simultaneous directions */ { -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH if ( ( ratio = hDirAC->energy_ratio2[dirac_read_idx][bin] ) < 0.001 ) { /* This touches only MASA path where second direction always has smaller ratio and @@ -985,12 +954,8 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric * it is better to save complexity. */ continue; } -#endif aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; -#ifndef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH - ratio = hDirAC->energy_ratio2[dirac_read_idx][bin]; -#endif spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin]; } diffuseness -= ratio; /* diffuseness = 1 - ratio1 - ratio2 */ @@ -1009,11 +974,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric spreadCoh = max( spreadCoh, altSpreadCoh ); } -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 )], isHeadtracked ); -#else - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); -#endif if ( h->renderStereoOutputInsteadOfBinaural ) { @@ -1056,11 +1017,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric rImagp *= centerMul; /* Apply the gain for the left source of the three coherent sources */ -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 + 1 )], isHeadtracked ); -#else - getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); -#endif hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); lRealp += sidesMul * lRealpTmp; @@ -1070,11 +1027,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Apply the gain for the right source of the three coherent sources. * -30 degrees to 330 wrapping due to internal functions. */ -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 + 2 )], isHeadtracked ); -#else - getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat ); -#endif hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); lRealp += sidesMul * lRealpTmp; @@ -1253,28 +1206,20 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struct *st_ivas, const int16_t max_band_decorr, -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH float Rmat[3][3], const int16_t isHeadtracked ) -#else - float Rmat[3][3] ) -#endif { int16_t chA, chB, bin; uint8_t separateCenterChannelRendering; int16_t nBins; DIRAC_DEC_BIN_HANDLE h; -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH PARAMBIN_HRTF_GAIN_CACHE gainCache; -#endif h = st_ivas->hDiracDecBin; separateCenterChannelRendering = st_ivas->hOutSetup.separateChannelEnabled; nBins = st_ivas->hDirAC->num_freq_bands; /* Actually bins */ -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH gainCache.azi = -1000; /* Use -1000 as value for uninitialized cache. */ -#endif for ( bin = 0; bin < nBins; bin++ ) { @@ -1418,11 +1363,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( h->processMtxImPrev[chA][2][bin] = h->processMtxIm[chA][2][bin]; } -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache, isHeadtracked ); -#else - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat ); -#endif h->processMtxRe[0][2][bin] = lRealp * gainFactor; h->processMtxIm[0][2][bin] = lImagp * gainFactor; @@ -2125,13 +2066,9 @@ static void getDirectPartGains( float *rRealp, float *rImagp, const uint8_t renderStereoOutputInsteadOfBinaural, -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH float Rmat[3][3], PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t isHeadtracked ) -#else - float Rmat[3][3] ) -#endif { float aziRad, eleRad; float y, mappedX, aziRadMapped, A, A2, A3; @@ -2174,7 +2111,6 @@ static void getDirectPartGains( } else /* In regular binaural rendering mode */ { -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH if ( aziDeg == gainCache->azi && eleDeg == gainCache->ele ) { hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, TRUE ); @@ -2189,10 +2125,6 @@ static void getDirectPartGains( } hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp, gainCache, FALSE ); } -#else - rotateAziEle( (float) aziDeg, (float) eleDeg, &aziDeg, &eleDeg, Rmat, 0 ); - hrtfShGetHrtf( bin, aziDeg, eleDeg, lRealp, lImagp, rRealp, rImagp ); -#endif } return; @@ -2206,16 +2138,11 @@ static void hrtfShGetHrtf( float *lRealp, float *lImagp, float *rRealp, -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH float *rImagp, PARAMBIN_HRTF_GAIN_CACHE *gainCache, const int16_t useCachedValue ) -#else - float *rImagp ) -#endif { int16_t k; -#ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH *lRealp = 0.0f; *lImagp = 0.0f; @@ -2254,26 +2181,6 @@ static void hrtfShGetHrtf( gainCache->shVec[k] = shVec[k]; } } -#else - float shVec[HRTF_SH_CHANNELS]; - - ivas_dirac_dec_get_response( aziDeg, - eleDeg, - shVec, - HRTF_SH_ORDER ); - - *lRealp = 0.0f; - *lImagp = 0.0f; - *rRealp = 0.0f; - *rImagp = 0.0f; - for ( k = 0; k < HRTF_SH_CHANNELS; k++ ) - { - *lRealp += hrtfShCoeffsRe[0][k][bin] * shVec[k]; - *lImagp += hrtfShCoeffsIm[0][k][bin] * shVec[k]; - *rRealp += hrtfShCoeffsRe[1][k][bin] * shVec[k]; - *rImagp += hrtfShCoeffsIm[1][k][bin] * shVec[k]; - } -#endif return; } -- GitLab From dc63f45a5f5e2ca5c3b1501ccc9bd304f6570c17 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:57:07 +0200 Subject: [PATCH 361/381] [cleanup] accept FIX_122_MC_DECODER_COMPLEXITY --- lib_com/ivas_mc_param_com.c | 4 ---- lib_com/options.h | 1 - 2 files changed, 5 deletions(-) diff --git a/lib_com/ivas_mc_param_com.c b/lib_com/ivas_mc_param_com.c index a66cdba916..44efdebe2e 100644 --- a/lib_com/ivas_mc_param_com.c +++ b/lib_com/ivas_mc_param_com.c @@ -406,11 +406,7 @@ static int16_t ivas_param_mc_get_num_param_bands( switch ( ivas_total_brate ) { case IVAS_128k: -#ifdef FIX_122_MC_DECODER_COMPLEXITY num_parameter_bands = 14; -#else - num_parameter_bands = 20; -#endif break; case IVAS_160k: num_parameter_bands = 20; diff --git a/lib_com/options.h b/lib_com/options.h index fd4f8dc872..a3bb258594 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ -#define FIX_122_MC_DECODER_COMPLEXITY /* FhG: Issue 122, significant decrease of worst case MC decoder complexity */ #define FIX_531_BWS_ISM_BFI /* VA: issue 531: fix MemorySanitizer: use-of-uninitialized-value in ISM2 rate switching with frame errors */ #define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ -- GitLab From 3c9925d9ad7b5e822e0c899a5ac5a1547384ef29 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 17:57:57 +0200 Subject: [PATCH 362/381] [cleanup] accept FIX_531_BWS_ISM_BFI --- lib_com/options.h | 1 - lib_dec/ivas_core_dec.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index a3bb258594..db3ed596df 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ -#define FIX_531_BWS_ISM_BFI /* VA: issue 531: fix MemorySanitizer: use-of-uninitialized-value in ISM2 rate switching with frame errors */ #define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 3367cd5d71..0f644b1d6f 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -504,11 +504,7 @@ ivas_error ivas_core_dec( * SWB(FB) BWE decoding *---------------------------------------------------------------------*/ -#ifdef FIX_531_BWS_ISM_BFI if ( st->extl == SWB_TBE || st->extl == FB_TBE || ( st->coder_type != AUDIO && st->coder_type != INACTIVE && st->core_brate >= SID_2k40 && st->core == ACELP_CORE && !st->con_tcx && output_Fs >= 32000 && st->bwidth > NB && st->bws_cnt > 0 ) ) -#else - if ( st->extl == SWB_TBE || st->extl == FB_TBE || ( st->coder_type != AUDIO && st->coder_type != INACTIVE && st->core_brate >= SID_2k40 && st->core == ACELP_CORE && output_Fs >= 32000 && st->bwidth > NB && st->bws_cnt > 0 ) ) -#endif { /* SWB TBE decoder */ swb_tbe_dec( st, hStereoICBWE, bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], tmp_buffer /*fb_exc*/, hb_synth[n], pitch_buf[n] ); -- GitLab From 8ecac39cf2d2eb9d49ba1d3dd1867a3b28b1f80e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 18:00:05 +0200 Subject: [PATCH 363/381] [cleanup] accept FIX_395_CNG_BW --- lib_com/options.h | 1 - lib_enc/ivas_cpe_enc.c | 3 --- lib_enc/ivas_stereo_dft_enc.c | 10 ---------- 3 files changed, 14 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index db3ed596df..ae08187bb1 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -153,7 +153,6 @@ -#define FIX_395_CNG_BW /* Eri: Issue 395 - CNG bandwidth issue for unified stereo */ #define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ #define FIX_541_EXT_REND_MASA_ROTATIONS /* Nokia: Issue 541, rotations missing in masa external renderer */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index c66ee4e1a5..8b9e8e42c7 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -580,9 +580,6 @@ ivas_error ivas_cpe_enc( stereo_dft_cng_side_gain( hCPE->hStereoDft, hCPE->hStereoCng, sts[0]->core_brate, sts[0]->last_core_brate, sts[0]->bwidth ); #ifdef DEBUG_MODE_DFT hCPE->hStereoDft->res_cod_bits = 0; -#endif -#ifndef FIX_395_CNG_BW - stereo_dft_enc_update( hCPE->hStereoDft, min( SWB, sts[0]->max_bwidth ) ); #endif } else diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index f628373ab7..e533ff4c4c 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -2163,7 +2163,6 @@ void stereo_dft_enc_write_BS( nbands_full = hStereoDft->nbands; -#ifdef FIX_395_CNG_BW if ( core_brate == FRAME_NO_DATA || core_brate == SID_2k40 ) { NFFT_inner = min( STEREO_DFT_N_32k_ENC, STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k ); @@ -2178,15 +2177,6 @@ void stereo_dft_enc_write_BS( /* set number of bands according to bandwidth after BWD */ hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); -#else - NFFT_inner = STEREO_DFT_N_MAX_ENC * inner_frame_tbl[hCPE->hCoreCoder[0]->bwidth] / L_FRAME48k; - - if ( !( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) ) - { - /* set number of bands according to bandwidth after BWD */ - hStereoDft->nbands = stereo_dft_band_config( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, ENC ); - } -#endif if ( core_brate == FRAME_NO_DATA ) { -- GitLab From ad82190a18fccb78d97388a231ad38ff489f7ddb Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 18:00:56 +0200 Subject: [PATCH 364/381] [cleanup] accept EXTERNAL_ORIENTATIONS --- apps/decoder.c | 88 -------- apps/renderer.c | 38 ---- lib_com/ivas_error.h | 4 - lib_com/ivas_prot.h | 4 - lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal.c | 36 ---- lib_dec/ivas_dec.c | 22 -- lib_dec/ivas_dirac_dec.c | 42 ---- lib_dec/ivas_init_dec.c | 12 -- lib_dec/ivas_ism_param_dec.c | 4 - lib_dec/ivas_ism_renderer.c | 39 ---- lib_dec/ivas_jbm_dec.c | 10 - lib_dec/ivas_mc_param_dec.c | 17 -- lib_dec/ivas_objectRenderer_internal.c | 11 - lib_dec/ivas_output_config.c | 37 ---- lib_dec/ivas_stat_dec.h | 4 - lib_dec/lib_dec.c | 10 - lib_dec/lib_dec.h | 4 - lib_rend/ivas_crend.c | 36 ---- lib_rend/ivas_dirac_dec_binaural_functions.c | 53 ----- lib_rend/ivas_objectRenderer.c | 25 --- lib_rend/ivas_orient_trk.c | 12 -- lib_rend/ivas_prot_rend.h | 34 ---- lib_rend/ivas_rotation.c | 50 ----- lib_rend/ivas_stat_rend.h | 2 - lib_rend/lib_rend.c | 200 ------------------- lib_rend/lib_rend.h | 2 - lib_util/head_rotation_file_reader.c | 143 ------------- lib_util/head_rotation_file_reader.h | 51 ----- lib_util/rotation_file_reader.c | 2 - lib_util/rotation_file_reader.h | 2 - 31 files changed, 995 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index ee21051d97..504648b708 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -42,11 +42,7 @@ #include "ism_file_writer.h" #include "ls_custom_file_reader.h" #include "hrtf_file_reader.h" -#ifdef EXTERNAL_ORIENTATIONS #include "rotation_file_reader.h" -#else -#include "head_rotation_file_reader.h" -#endif #include "vector3_pair_file_reader.h" #include "jbm_file_writer.h" #include "evs_rtp_payload.h" @@ -105,10 +101,8 @@ typedef struct char *refrotTrajFileName; bool enableReferenceVectorTracking; char *referenceVectorTrajFileName; -#ifdef EXTERNAL_ORIENTATIONS bool enableExternalOrientation; char *externalOrientationTrajFileName; -#endif #ifdef SUPPORT_JBM_TRACEFILE char *jbmTraceFilename; #endif @@ -157,19 +151,11 @@ typedef struct static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg ); static void usage_dec( void ); -#ifdef EXTERNAL_ORIENTATIONS static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); -#else -static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ); -#endif static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); #ifdef DEBUGGING #ifdef VARIABLE_SPEED_DECODING -#ifdef EXTERNAL_ORIENTATIONS static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); -#else -static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, HeadRotFileReader *headRotReader, HeadRotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ); -#endif #endif static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec ); static int16_t app_own_random( int16_t *seed ); @@ -193,14 +179,9 @@ int main( BS_READER_HANDLE hBsReader = NULL; LsCustomFileReader *hLsCustomReader = NULL; hrtfFileReader *hrtfReader = NULL; -#ifdef EXTERNAL_ORIENTATIONS RotFileReader *headRotReader = NULL; RotFileReader *externalOrientationFileReader = NULL; RotFileReader *refRotReader = NULL; -#else - HeadRotFileReader *headRotReader = NULL; - HeadRotFileReader *refRotReader = NULL; -#endif Vector3PairFileReader *referenceVectorReader = NULL; ivas_error error = IVAS_ERR_UNKNOWN; int16_t pcmBuf[MAX_OUTPUT_PCM_BUFFER_SIZE]; @@ -312,11 +293,7 @@ int main( goto cleanup; } -#ifdef EXTERNAL_ORIENTATIONS if ( ( error = RotationFileReader_open( arg.headrotTrajFileName, &headRotReader ) ) != IVAS_ERR_OK ) -#else - if ( ( error = HeadRotationFileReader_open( arg.headrotTrajFileName, &headRotReader ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError: Can't open head-rotation file %s \n\n", arg.headrotTrajFileName ); goto cleanup; @@ -347,11 +324,7 @@ int main( goto cleanup; } -#ifdef EXTERNAL_ORIENTATIONS if ( ( error = RotationFileReader_open( arg.refrotTrajFileName, &refRotReader ) ) != IVAS_ERR_OK ) -#else - if ( ( error = HeadRotationFileReader_open( arg.refrotTrajFileName, &refRotReader ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nError: Can't open reference rotation file %s \n\n", arg.refrotTrajFileName ); goto cleanup; @@ -389,7 +362,6 @@ int main( } } -#ifdef EXTERNAL_ORIENTATIONS /*------------------------------------------------------------------------------------------* * Open external orientation file *------------------------------------------------------------------------------------------*/ @@ -402,7 +374,6 @@ int main( goto cleanup; } } -#endif /*------------------------------------------------------------------------------------------* * Open custom loudspeaker layout file @@ -444,11 +415,7 @@ int main( /*------------------------------------------------------------------------------------------* * Configure the decoder *------------------------------------------------------------------------------------------*/ -#ifdef EXTERNAL_ORIENTATIONS if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.enableExternalOrientation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) -#else - if ( ( error = IVAS_DEC_Configure( hIvasDec, arg.output_Fs, arg.outputFormat, arg.customLsOutputEnabled, arg.hrtfReaderEnabled, arg.enableHeadRotation, arg.orientation_tracking, arg.renderConfigEnabled, arg.Opt_non_diegetic_pan, arg.non_diegetic_pan_gain, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) ); @@ -704,18 +671,14 @@ int main( else if ( arg.variableSpeedMode ) { error = decodeVariableSpeed( arg, hBsReader, headRotReader, -#ifdef EXTERNAL_ORIENTATIONS externalOrientationFileReader, -#endif refRotReader, referenceVectorReader, hIvasDec ); } #endif else { error = decodeG192( arg, hBsReader, headRotReader, -#ifdef EXTERNAL_ORIENTATIONS externalOrientationFileReader, -#endif refRotReader, referenceVectorReader, hIvasDec, pcmBuf ); } @@ -771,14 +734,9 @@ cleanup: IVAS_DEC_Close( &hIvasDec ); CustomLsReader_close( &hLsCustomReader ); hrtfFileReader_close( &hrtfReader ); -#ifdef EXTERNAL_ORIENTATIONS RotationFileReader_close( &headRotReader ); RotationFileReader_close( &externalOrientationFileReader ); RotationFileReader_close( &refRotReader ); -#else - HeadRotationFileReader_close( &headRotReader ); - HeadRotationFileReader_close( &refRotReader ); -#endif Vector3PairFileReader_close( &referenceVectorReader ); RenderConfigReader_close( &renderConfigReader ); @@ -937,10 +895,8 @@ static bool parseCmdlIVAS_dec( arg->headrotTrajFileName = NULL; arg->enableReferenceVectorTracking = false; arg->referenceVectorTrajFileName = NULL; -#ifdef EXTERNAL_ORIENTATIONS arg->enableExternalOrientation = false; arg->externalOrientationTrajFileName = NULL; -#endif #ifdef SUPPORT_JBM_TRACEFILE arg->jbmTraceFilename = NULL; @@ -1251,7 +1207,6 @@ static bool parseCmdlIVAS_dec( arg->referenceVectorTrajFileName = argv[i]; i++; } -#ifdef EXTERNAL_ORIENTATIONS else if ( strcmp( argv_to_upper, "-EXOF" ) == 0 ) { arg->enableExternalOrientation = true; @@ -1267,7 +1222,6 @@ static bool parseCmdlIVAS_dec( arg->externalOrientationTrajFileName = argv[i]; i++; } -#endif else if ( strcmp( argv_to_upper, "-RENDER_CONFIG" ) == 0 ) { arg->renderConfigEnabled = true; @@ -1510,9 +1464,7 @@ static void usage_dec( void ) fprintf( stdout, "-level level : Complexity level, level = (1, 2, 3), will be defined after characterisation. \n" ); fprintf( stdout, " Currently, all values default to level 3 (full functionality).\n" ); #endif -#ifdef EXTERNAL_ORIENTATIONS fprintf( stdout, "-exof File : External orientation file for external orientation trajectory\n" ); -#endif #ifdef DEBUG_MODE_INFO #ifdef DEBUG_MODE_INFO_TWEAK fprintf( stdout, "-info : specify subfolder name for debug output\n" ); @@ -1700,14 +1652,9 @@ static ivas_error initOnFirstGoodFrame( static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, -#ifdef EXTERNAL_ORIENTATIONS RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, -#else - HeadRotFileReader *headRotReader, - HeadRotFileReader *refRotReader, -#endif Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf ) @@ -1823,11 +1770,7 @@ static ivas_error decodeG192( if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), -#ifdef EXTERNAL_ORIENTATIONS RotationFileReader_getFilePath( refRotReader ) ); -#else - HeadRotationFileReader_getFilePath( refRotReader ) ); -#endif goto cleanup; } @@ -1847,11 +1790,7 @@ static ivas_error decodeG192( if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), -#ifdef EXTERNAL_ORIENTATIONS RotationFileReader_getFilePath( headRotReader ) ); -#else - HeadRotationFileReader_getFilePath( headRotReader ) ); -#endif goto cleanup; } } @@ -1863,7 +1802,6 @@ static ivas_error decodeG192( } } -#ifdef EXTERNAL_ORIENTATIONS if ( arg.enableExternalOrientation ) { IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -1889,7 +1827,6 @@ static ivas_error decodeG192( goto cleanup; } } -#endif /* Run decoder for one frame (get rendered output) */ if ( ( error = IVAS_DEC_GetSamples( hIvasDec, pcmBuf, &nOutSamples ) ) != IVAS_ERR_OK ) @@ -2623,14 +2560,9 @@ cleanup: static ivas_error decodeVariableSpeed( DecArguments arg, BS_READER_HANDLE hBsReader, -#ifdef EXTERNAL_ORIENTATIONS RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, -#else - HeadRotFileReader *headRotReader, - HeadRotFileReader *refRotReader, -#endif Vector3PairFileReader *referenceVectorReader, IVAS_DEC_HANDLE hIvasDec ) @@ -2735,11 +2667,7 @@ static ivas_error decodeVariableSpeed( if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), -#ifdef EXTERNAL_ORIENTATIONS RotationFileReader_getFilePath( refRotReader ) ); -#else - HeadRotationFileReader_getFilePath( refRotReader ) ); -#endif goto cleanup; } @@ -2760,11 +2688,7 @@ static ivas_error decodeVariableSpeed( if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), -#ifdef EXTERNAL_ORIENTATIONS RotationFileReader_getFilePath( headRotReader ) ); -#else - HeadRotationFileReader_getFilePath( headRotReader ) ); -#endif goto cleanup; } } @@ -2776,7 +2700,6 @@ static ivas_error decodeVariableSpeed( } } -#ifdef EXTERNAL_ORIENTATIONS if ( arg.enableExternalOrientation ) { IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -2802,7 +2725,6 @@ static ivas_error decodeVariableSpeed( goto cleanup; } } -#endif /* decode and get samples */ do @@ -3026,11 +2948,7 @@ static ivas_error decodeVariableSpeed( if ( ( error = HeadRotationFileReading( refRotReader, &quaternion, NULL ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError %s while reading reference rotation from %s\n", IVAS_DEC_GetErrorMessage( error ), -#ifdef EXTERNAL_ORIENTATIONS RotationFileReader_getFilePath( refRotReader ) ); -#else - HeadRotationFileReader_getFilePath( refRotReader ) ); -#endif goto cleanup; } @@ -3050,11 +2968,7 @@ static ivas_error decodeVariableSpeed( if ( ( error = HeadRotationFileReading( headRotReader, &Quaternions[i], &Pos[i] ) ) != IVAS_ERR_OK ) { fprintf( stderr, "\nError %s while reading head orientation from %s\n", IVAS_DEC_GetErrorMessage( error ), -#ifdef EXTERNAL_ORIENTATIONS RotationFileReader_getFilePath( headRotReader ) ); -#else - HeadRotationFileReader_getFilePath( headRotReader ) ); -#endif goto cleanup; } } @@ -3066,7 +2980,6 @@ static ivas_error decodeVariableSpeed( } } -#ifdef EXTERNAL_ORIENTATIONS if ( arg.enableExternalOrientation ) { IVAS_QUATERNION Quaternions[IVAS_MAX_PARAM_SPATIAL_SUBFRAMES]; @@ -3092,7 +3005,6 @@ static ivas_error decodeVariableSpeed( goto cleanup; } } -#endif /* decode and get samples */ if ( ( error = IVAS_DEC_VoIP_Flush( hIvasDec, nOutSamples, pcmBuf, &nSamplesAvailableNext, &nSamplesFlushed ) ) != IVAS_ERR_OK ) diff --git a/apps/renderer.c b/apps/renderer.c index c630167af8..c5fb0421b1 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -41,11 +41,7 @@ #include "audio_file_writer.h" #include "cmdl_tools.h" #include "cmdln_parser.h" -#ifdef EXTERNAL_ORIENTATIONS #include "rotation_file_reader.h" -#else -#include "head_rotation_file_reader.h" -#endif #include "vector3_pair_file_reader.h" #include "hrtf_file_reader.h" #include "ism_file_reader.h" @@ -147,9 +143,7 @@ typedef struct char headRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char referenceVectorFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char referenceRotationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; -#ifdef EXTERNAL_ORIENTATIONS char externalOrientationFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; -#endif char customHrtfFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; char renderConfigFilePath[RENDERER_MAX_CLI_ARG_LENGTH]; int8_t orientation_tracking; @@ -188,9 +182,7 @@ typedef enum CmdLnOptionId_listFormats, CmdLnOptionId_inputGain, CmdLnOptionId_referenceVectorFile, -#ifdef EXTERNAL_ORIENTATIONS CmdLnOptionId_exteriorOrientationFile, -#endif } CmdLnOptionId; static const CmdLnParser_Option cliOptions[] = { @@ -330,14 +322,12 @@ static const CmdLnParser_Option cliOptions[] = { .description = "Reference vector trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", #endif }, -#ifdef EXTERNAL_ORIENTATIONS { .id = CmdLnOptionId_exteriorOrientationFile, .match = "exterior_orientation_file", .matchShort = "exof", .description = "External orientation trajectory file for simulation of external orientations", }, -#endif }; @@ -569,14 +559,9 @@ int main( char **argv ) { IVAS_REND_HANDLE hIvasRend; -#ifdef EXTERNAL_ORIENTATIONS RotFileReader *headRotReader = NULL; RotFileReader *externalOrientationFileReader = NULL; RotFileReader *referenceRotReader = NULL; -#else - HeadRotFileReader *headRotReader = NULL; - HeadRotFileReader *referenceRotReader = NULL; -#endif Vector3PairFileReader *referenceVectorReader = NULL; hrtfFileReader *hrtfFileReader = NULL; IsmPositionProvider *positionProvider; @@ -646,17 +631,11 @@ int main( convert_backslash( args.referenceVectorFilePath ); convert_backslash( args.referenceRotationFilePath ); convert_backslash( args.inLfePanningMatrixFile ); -#ifdef EXTERNAL_ORIENTATIONS convert_backslash( args.externalOrientationFilePath ); -#endif if ( !isEmptyString( args.headRotationFilePath ) ) { -#ifdef EXTERNAL_ORIENTATIONS if ( RotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) -#else - if ( HeadRotationFileReader_open( args.headRotationFilePath, &headRotReader ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "Error opening file: %s\n", args.headRotationFilePath ); exit( -1 ); @@ -665,11 +644,7 @@ int main( if ( !isEmptyString( args.referenceRotationFilePath ) ) { -#ifdef EXTERNAL_ORIENTATIONS if ( RotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader ) != IVAS_ERR_OK ) -#else - if ( HeadRotationFileReader_open( args.referenceRotationFilePath, &referenceRotReader ) != IVAS_ERR_OK ) -#endif { fprintf( stderr, "Error opening file: %s\n", args.referenceRotationFilePath ); exit( -1 ); @@ -684,7 +659,6 @@ int main( } } -#ifdef EXTERNAL_ORIENTATIONS if ( !isEmptyString( args.externalOrientationFilePath ) ) { if ( RotationFileReader_open( args.externalOrientationFilePath, &externalOrientationFileReader ) != IVAS_ERR_OK ) @@ -693,7 +667,6 @@ int main( exit( -1 ); } } -#endif if ( !isEmptyString( args.customHrtfFilePath ) ) { @@ -1177,7 +1150,6 @@ int main( } } -#ifdef EXTERNAL_ORIENTATIONS /* Read from external orientation file if specified */ if ( externalOrientationFileReader != NULL ) { @@ -1210,7 +1182,6 @@ int main( fprintf( stderr, "Error combining external and head orientations: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } -#endif for ( i = 0; i < args.inConfig.numMultiChannelBuses; ++i ) { @@ -1505,14 +1476,9 @@ int main( #endif AudioFileReader_close( &audioReader ); AudioFileWriter_close( &audioWriter ); -#ifdef EXTERNAL_ORIENTATIONS RotationFileReader_close( &headRotReader ); RotationFileReader_close( &externalOrientationFileReader ); RotationFileReader_close( &referenceRotReader ); -#else - HeadRotationFileReader_close( &headRotReader ); - HeadRotationFileReader_close( &referenceRotReader ); -#endif Vector3PairFileReader_close( &referenceVectorReader ); hrtfFileReader_close( &hrtfFileReader ); IVAS_REND_Close( &hIvasRend ); @@ -1998,9 +1964,7 @@ static CmdlnArgs defaultArgs( clearString( args.referenceRotationFilePath ); clearString( args.customHrtfFilePath ); clearString( args.renderConfigFilePath ); -#ifdef EXTERNAL_ORIENTATIONS clearString( args.externalOrientationFilePath ); -#endif args.orientation_tracking = HEAD_ORIENT_TRK_NONE; args.nonDiegeticPan = 0; @@ -2086,12 +2050,10 @@ static void parseOption( assert( numOptionValues == 1 ); strncpy( args->referenceRotationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; -#ifdef EXTERNAL_ORIENTATIONS case CmdLnOptionId_exteriorOrientationFile: assert( numOptionValues == 1 ); strncpy( args->externalOrientationFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); break; -#endif case CmdLnOptionId_customHrtfFile: assert( numOptionValues == 1 ); strncpy( args->customHrtfFilePath, optionValues[0], RENDERER_MAX_CLI_ARG_LENGTH - 1 ); diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index d148d53616..c86d947125 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -75,9 +75,7 @@ typedef enum IVAS_ERR_WRONG_MODE, IVAS_ERR_INVALID_OUTPUT_FORMAT, IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, -#ifdef EXTERNAL_ORIENTATIONS IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, -#endif IVAS_ERR_INVALID_HRTF, IVAS_ERR_INVALID_INPUT_FORMAT, IVAS_ERR_INVALID_INDEX, /* ToDo: should be merged with IVAS_ERR_INDEX_OUT_OF_BOUNDS */ @@ -235,10 +233,8 @@ static inline const char *ivas_error_to_string( ivas_error error_code ) return "Wrong mode"; case IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED: return "Head rotation not supported"; -#ifdef EXTERNAL_ORIENTATIONS case IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED: return "External orientation not supported"; -#endif case IVAS_ERR_INVALID_HRTF: return "Unsupported HRTF filter set"; case IVAS_ERR_INVALID_INPUT_FORMAT: diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index bf3f847ab5..646d025ec3 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5147,12 +5147,8 @@ void ivas_binaural_cldfb_sf( #endif void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: fastconv binaural renderer handle */ -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ int16_t subframe_idx, /* i : subframe index */ -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ -#endif const int16_t numTimeSlots, /* i: : number of time slots to process */ float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ diff --git a/lib_com/options.h b/lib_com/options.h index ae08187bb1..3744447ff3 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ -#define EXTERNAL_ORIENTATIONS /* Nokia: Contribution 41: (external) orientation information handling */ #define FIX_541_EXT_REND_MASA_ROTATIONS /* Nokia: Issue 541, rotations missing in masa external renderer */ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 84604ee503..ed6025fbc5 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -784,11 +784,7 @@ ivas_error ivas_binRenderer_open( ivas_dirac_dec_get_response( (int16_t) ls_azimuth_CICP19[k], (int16_t) ls_elevation_CICP19[k], hBinRenderer->hReverb->foa_enc[k], 1 ); } } -#ifdef EXTERNAL_ORIENTATIONS else if ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) -#else - else if ( st_ivas->ivas_format == MC_FORMAT && st_ivas->hDecoderConfig->Opt_Headrotation ) -#endif { if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) { @@ -1019,11 +1015,7 @@ void ivas_binaural_cldfb( } /* Implement binaural rendering */ -#ifdef EXTERNAL_ORIENTATIONS ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, subframeIdx, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); -#else - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, JBM_CLDFB_SLOTS_IN_SUBFRAME, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); -#endif /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) @@ -1115,11 +1107,7 @@ void ivas_binaural_cldfb_sf( } /* Implement binaural rendering */ -#ifdef EXTERNAL_ORIENTATIONS ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hCombinedOrientationData, subframeIdx, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); -#else - ivas_binRenderer( st_ivas->hBinRenderer, st_ivas->hHeadTrackData, st_ivas->hTcBuffer->subframe_nbslots[subframeIdx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); -#endif /* Implement CLDFB synthesis */ for ( ch = 0; ch < BINAURAL_CHANNELS; ch++ ) @@ -1154,12 +1142,8 @@ void ivas_binaural_cldfb_sf( void ivas_binRenderer( BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ int16_t subframe_idx, /* i : subframe index */ -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i/o: head track handle */ -#endif const int16_t numTimeSlots, /* i : number of time slots to render*/ float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ @@ -1184,17 +1168,12 @@ void ivas_binRenderer( /* Head rotation in HOA3 or CICPx */ if ( -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] -#else - hHeadTrackData && hHeadTrackData->num_quaternions >= 0 -#endif && hBinRenderer->rotInCldfb ) { if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) { /* Rotation in SHD (HOA3) */ -#ifdef EXTERNAL_ORIENTATIONS if ( hCombinedOrientationData->shd_rot_max_order == -1 ) { rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); @@ -1203,26 +1182,11 @@ void ivas_binRenderer( { rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hCombinedOrientationData->Rmat[subframe_idx], hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hCombinedOrientationData->shd_rot_max_order ); } -#else - if ( hHeadTrackData->shd_rot_max_order == -1 ) - { - QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); - rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, 3 ); - } - else if ( hHeadTrackData->shd_rot_max_order > 0 ) - { - rotateFrame_shd_cldfb( RealBuffer, ImagBuffer, hHeadTrackData->Rmat, hBinRenderer->hInputSetup->nchan_out_woLFE, numTimeSlots, hHeadTrackData->shd_rot_max_order ); - } -#endif } else { /* Rotation in SD (CICPx) */ -#ifdef EXTERNAL_ORIENTATIONS rotateFrame_sd_cldfb( hCombinedOrientationData->Rmat[subframe_idx], RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); -#else - rotateFrame_sd_cldfb( hHeadTrackData, RealBuffer, ImagBuffer, hBinRenderer->hInputSetup, hBinRenderer->hEFAPdata, numTimeSlots, hBinRenderer->conv_band ); -#endif } } diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 87c43e97a3..8f9bd3f3ca 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -104,7 +104,6 @@ ivas_error ivas_dec( p_output[n] = &output[n][0]; } -#ifdef EXTERNAL_ORIENTATIONS /*----------------------------------------------------------------* * Combine orientations *----------------------------------------------------------------*/ @@ -114,7 +113,6 @@ ivas_error ivas_dec( { return error; } -#endif /*----------------------------------------------------------------* * Decoding + Rendering @@ -199,11 +197,7 @@ ivas_error ivas_dec( { ivas_param_ism_params_to_masa_param_mapping( st_ivas ); -#ifdef EXTERNAL_ORIENTATIONS ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, output, st_ivas->nchan_transport ); -#else - ivas_dirac_dec_binaural( st_ivas, output, st_ivas->nchan_transport ); -#endif } else if ( st_ivas->renderer_type == RENDERER_MONO_DOWNMIX ) { @@ -433,11 +427,7 @@ ivas_error ivas_dec( /* Loudspeakers, Ambisonics or Binaural rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { -#ifdef EXTERNAL_ORIENTATIONS ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, output, nchan_remapped ); -#else - ivas_dirac_dec_binaural( st_ivas, output, nchan_remapped ); -#endif } else if ( st_ivas->ivas_format == MASA_FORMAT ) { @@ -495,11 +485,7 @@ ivas_error ivas_dec( if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData, -#else - st_ivas->hHeadTrackData, -#endif &st_ivas->hIntSetup, st_ivas->hEFAPdata, p_output, output_Fs ) ) != IVAS_ERR_OK ) { return error; @@ -558,11 +544,7 @@ ivas_error ivas_dec( if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData, -#else - st_ivas->hHeadTrackData, -#endif &st_ivas->hIntSetup, st_ivas->hEFAPdata, p_output, output_Fs ) ) != IVAS_ERR_OK ) { return error; @@ -706,11 +688,7 @@ ivas_error ivas_dec( /* Rendering */ if ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) { -#ifdef EXTERNAL_ORIENTATIONS ivas_dirac_dec_binaural( st_ivas, st_ivas->hCombinedOrientationData, output, st_ivas->nchan_transport ); -#else - ivas_dirac_dec_binaural( st_ivas, output, st_ivas->nchan_transport ); -#endif } else if ( st_ivas->renderer_type == RENDERER_DIRAC || st_ivas->renderer_type == RENDERER_SBA_LINEAR_ENC ) /* rendering to CICPxx and Ambisonics */ { diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 046d22f2cb..d96958fce6 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -2452,25 +2452,11 @@ void ivas_dirac_dec_render_sf( set_zero( onset_filter_subframe, hDirAC->num_freq_bands ); } -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] ) -#else - if ( st_ivas->hHeadTrackData ) -#endif { -#ifdef EXTERNAL_ORIENTATIONS p_Rmat = &st_ivas->hCombinedOrientationData->Rmat[subframe_idx][0][0]; -#else - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], st_ivas->hHeadTrackData->Rmat ); - - p_Rmat = &st_ivas->hHeadTrackData->Rmat[0][0]; -#endif -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) -#else - if ( st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) -#endif { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; if ( hDirAC->hConfig->dec_param_estim == FALSE ) @@ -2532,11 +2518,7 @@ void ivas_dirac_dec_render_sf( set_zero( surCohRatio, hDirAC->num_freq_bands ); } } -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 1 ) -#else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 1 ) -#endif { ivas_dirac_dec_compute_directional_responses( hDirAC, st_ivas->hVBAPdata, @@ -2545,11 +2527,7 @@ void ivas_dirac_dec_render_sf( elevation, md_idx, surCohRatio, -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData->shd_rot_max_order, -#else - st_ivas->hHeadTrackData->shd_rot_max_order, -#endif p_Rmat, hodirac_flag ); } @@ -2633,11 +2611,7 @@ void ivas_dirac_dec_render_sf( if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) -#else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) -#endif { protoSignalComputation_shd( Cldfb_RealBuffer, Cldfb_ImagBuffer, hDirAC->h_output_synthesis_psd_state.proto_direct_buffer_f, @@ -2719,11 +2693,7 @@ void ivas_dirac_dec_render_sf( { mvs2s( &hDirAC->azimuth[md_idx][hDirAC->hConfig->enc_param_start_band], &azimuth[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); mvs2s( &hDirAC->elevation[md_idx][hDirAC->hConfig->enc_param_start_band], &elevation[hDirAC->hConfig->enc_param_start_band], hDirAC->num_freq_bands - hDirAC->hConfig->enc_param_start_band ); -#ifdef EXTERNAL_ORIENTATIONS if ( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && st_ivas->hCombinedOrientationData->shd_rot_max_order == 0 ) -#else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order == 0 ) -#endif { num_freq_bands = hDirAC->band_grouping[hDirAC->hConfig->enc_param_start_band]; rotateAziEle_DirAC( azimuth, elevation, num_freq_bands, hDirAC->num_freq_bands, p_Rmat ); @@ -2877,11 +2847,7 @@ void ivas_dirac_dec_render_sf( } /*Compute PSDs*/ -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && st_ivas->hCombinedOrientationData->shd_rot_max_order > 0 ) -#else - if ( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData->shd_rot_max_order > 0 ) -#endif { ivas_dirac_dec_output_synthesis_process_slot( reference_power, p_onset_filter, @@ -2889,11 +2855,7 @@ void ivas_dirac_dec_render_sf( elevation, hDirAC->diffuseness_vector[md_idx], hDirAC, -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData->shd_rot_max_order, -#else - st_ivas->hHeadTrackData->shd_rot_max_order, -#endif p_Rmat, st_ivas->hVBAPdata, hDirAC->hOutSetup, @@ -2978,12 +2940,8 @@ void ivas_dirac_dec_render_sf( { /* Perform binaural rendering */ ivas_binRenderer( st_ivas->hBinRenderer, -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData, subframe_idx, -#else - st_ivas->hHeadTrackData, -#endif hDirAC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 351158d3d0..d0b4f9ff68 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -589,7 +589,6 @@ ivas_error ivas_init_decoder_front( } } -#ifdef EXTERNAL_ORIENTATIONS /*-------------------------------------------------------------------* * Allocate and initialize external orientation handle *--------------------------------------------------------------------*/ @@ -613,7 +612,6 @@ ivas_error ivas_init_decoder_front( return error; } } -#endif /*-------------------------------------------------------------------* * Allocate HRTF binary handle @@ -1304,11 +1302,7 @@ ivas_error ivas_init_decoder( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) -#else - if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM && st_ivas->ivas_format == MC_FORMAT && st_ivas->hDecoderConfig->Opt_Headrotation ) -#endif { if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), st_ivas->hIntSetup.ls_azimuth, st_ivas->hIntSetup.ls_elevation, st_ivas->hIntSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) { @@ -1669,10 +1663,8 @@ void ivas_initialize_handles_dec( st_ivas->hHrtfTD = NULL; st_ivas->hLsSetupCustom = NULL; st_ivas->hRenderConfig = NULL; -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hExtOrientationData = NULL; st_ivas->hCombinedOrientationData = NULL; -#endif st_ivas->hTcBuffer = NULL; @@ -1834,13 +1826,11 @@ void ivas_destroy_dec( /* Head track data handle */ ivas_headTrack_close( &st_ivas->hHeadTrackData ); -#ifdef EXTERNAL_ORIENTATIONS /* External orientation data handle */ ivas_external_orientation_close( &st_ivas->hExtOrientationData ); /* Combined orientation data handle */ ivas_combined_orientation_close( &st_ivas->hCombinedOrientationData ); -#endif /* Time Domain binaural renderer handle */ if ( st_ivas->hBinRendererTd != NULL ) @@ -2145,7 +2135,6 @@ static ivas_error doSanityChecks_IVAS( } } -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG @@ -2157,7 +2146,6 @@ static ivas_error doSanityChecks_IVAS( return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); } } -#endif #ifdef DEBUGGING #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 36e8516e29..42260c7984 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -1009,11 +1009,7 @@ void ivas_ism_dec_digest_tc( elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData == NULL -#else - st_ivas->hHeadTrackData == NULL -#endif ) { if ( st_ivas->hIntSetup.is_planar_setup ) diff --git a/lib_dec/ivas_ism_renderer.c b/lib_dec/ivas_ism_renderer.c index 6422c15d29..77563629ae 100644 --- a/lib_dec/ivas_ism_renderer.c +++ b/lib_dec/ivas_ism_renderer.c @@ -121,9 +121,6 @@ void ivas_ism_render( float g1, g2; int16_t nchan_ism, nchan_out_woLFE, lfe_index; int16_t azimuth, elevation; -#ifndef EXTERNAL_ORIENTATIONS - float Rmat[3][3]; -#endif nchan_ism = st_ivas->nchan_ism; nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; @@ -145,13 +142,6 @@ void ivas_ism_render( set_f( output_f[i], 0.0f, output_frame ); } -#ifndef EXTERNAL_ORIENTATIONS - if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) - { - /* Calculate rotation matrix from the quaternion */ - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat ); - } -#endif for ( i = 0; i < nchan_ism; i++ ) { @@ -164,17 +154,10 @@ void ivas_ism_render( } else { -#ifdef EXTERNAL_ORIENTATIONS /* Combined rotation: rotate the object positions depending the head and external orientations */ if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); -#else - /* Head rotation: rotate the object positions depending the head's orientation */ - if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) - { - rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); -#endif } else { @@ -243,9 +226,6 @@ void ivas_ism_render_sf( int16_t tc_offset; int16_t interp_offset; float gain, prev_gain; -#ifndef EXTERNAL_ORIENTATIONS - float Rmat[3][3]; -#endif num_objects = st_ivas->nchan_transport; nchan_out_woLFE = st_ivas->hIntSetup.nchan_out_woLFE; @@ -258,16 +238,8 @@ void ivas_ism_render_sf( set_f( output_f[i], 0.0f, n_samples_to_render ); } -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] ) { -#else - if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) - { - /* Calculate rotation matrix from the quaternion */ - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[st_ivas->hHeadTrackData->num_quaternions++], Rmat ); - -#endif ivas_jbm_dec_get_adapted_linear_interpolator( n_samples_to_render, n_samples_to_render, st_ivas->hIsmRendererData->interpolator ); @@ -277,17 +249,10 @@ void ivas_ism_render_sf( for ( i = 0; i < num_objects; i++ ) { -#ifdef EXTERNAL_ORIENTATIONS /* Combined rotation: rotate the object positions depending the head and external orientations */ if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) { rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, st_ivas->hCombinedOrientationData->Rmat[0], st_ivas->hIntSetup.is_planar_setup ); -#else - /* Head rotation: rotate the object positions depending the head's orientation */ - if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 && !st_ivas->hIsmMetaData[i]->non_diegetic_flag ) - { - rotateAziEle( st_ivas->hIsmMetaData[i]->azimuth, st_ivas->hIsmMetaData[i]->elevation, &azimuth, &elevation, Rmat, st_ivas->hIntSetup.is_planar_setup ); -#endif if ( st_ivas->hEFAPdata != NULL ) { efap_determine_gains( st_ivas->hEFAPdata, st_ivas->hIsmRendererData->gains[i], azimuth, elevation, EFAP_MODE_EFAP ); @@ -316,11 +281,7 @@ void ivas_ism_render_sf( } /* update here only in case of head rotation */ -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData != NULL && st_ivas->hCombinedOrientationData->enableCombinedOrientation[0] == 1 ) -#else - if ( st_ivas->hHeadTrackData != NULL && st_ivas->hHeadTrackData->num_quaternions >= 0 ) -#endif { st_ivas->hIsmRendererData->prev_gains[i][j] = gain; } diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 5cb3882e89..d388fe1d1d 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -638,7 +638,6 @@ ivas_error ivas_jbm_dec_render( p_tc[n] = &st_ivas->hTcBuffer->tc[n][st_ivas->hTcBuffer->n_samples_rendered]; } -#ifdef EXTERNAL_ORIENTATIONS /*----------------------------------------------------------------* * Combine orientations *----------------------------------------------------------------*/ @@ -648,7 +647,6 @@ ivas_error ivas_jbm_dec_render( { return error; } -#endif /*----------------------------------------------------------------* * Rendering @@ -801,11 +799,7 @@ ivas_error ivas_jbm_dec_render( if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, st_ivas->intern_config, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData, -#else - st_ivas->hHeadTrackData, -#endif &st_ivas->hIntSetup, st_ivas->hEFAPdata, st_ivas->hTcBuffer, p_tc, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) { return error; @@ -1032,11 +1026,7 @@ ivas_error ivas_jbm_dec_flush_renderer( if ( renderer_type_old == RENDERER_BINAURAL_MIXER_CONV || renderer_type_old == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, intern_config_old, st_ivas->hOutSetup.output_config, st_ivas->hDecoderConfig, -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData, -#else - st_ivas->hHeadTrackData, -#endif hIntSetupOld, st_ivas->hEFAPdata, st_ivas->hTcBuffer, hTcBuffer->tc, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 189c94e9b2..9d8eeea5fc 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -425,13 +425,8 @@ ivas_error ivas_param_mc_dec_open( ivas_param_mc_dec_compute_interpolator( 0, 0, DEFAULT_JBM_CLDFB_TIMESLOTS, hParamMC->h_output_synthesis_params.interpolator ); -#ifdef EXTERNAL_ORIENTATIONS /* Head or external rotation */ if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) -#else - /* Head rotation */ - if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) && st_ivas->hDecoderConfig->Opt_Headrotation ) -#endif { if ( ( hParamMC->hoa_encoder = (float *) malloc( st_ivas->hTransSetup.nchan_out_woLFE * MAX_INTERN_CHANNELS * sizeof( float ) ) ) == NULL ) { @@ -1583,11 +1578,7 @@ void ivas_param_mc_dec_render( { nchan_out_cldfb = BINAURAL_CHANNELS; set_s( channel_active, 1, nchan_out_cldfb ); -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hCombinedOrientationData ) -#else - if ( st_ivas->hHeadTrackData ) -#endif { nchan_out_init = MAX_INTERN_CHANNELS; } @@ -1697,11 +1688,7 @@ void ivas_param_mc_dec_render( if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) { if ( -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData -#else - st_ivas->hHeadTrackData -#endif && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); @@ -1765,11 +1752,7 @@ void ivas_param_mc_dec_render( if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) { ivas_binRenderer( st_ivas->hBinRenderer, -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData, subframe_idx, -#else - st_ivas->hHeadTrackData, -#endif hParamMC->subframe_nbslots[subframe_idx], Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Cldfb_RealBuffer, Cldfb_ImagBuffer ); } diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 102f0affc5..8e2089d1c6 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -86,14 +86,9 @@ ivas_error ivas_td_binaural_renderer( st_ivas->transport_config, st_ivas->hBinRendererTd, st_ivas->nchan_transport, LFE_CHANNEL, st_ivas->ivas_format, st_ivas->hIsmMetaData, -#ifdef EXTERNAL_ORIENTATIONS ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation : NULL, ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->listenerPos : NULL, -#else - st_ivas->hDecoderConfig->Opt_Headrotation, ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Quaternions : NULL, - ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL, -#endif ism_md_subframe_update, output, output_frame ); } @@ -184,15 +179,9 @@ ivas_error ivas_td_binaural_renderer_sf( /* Update the listener's location/orientation */ TDREND_Update_listener_orientation( st_ivas->hBinRendererTd, -#ifdef EXTERNAL_ORIENTATIONS ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->enableCombinedOrientation[subframe_idx] : 0, ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->listenerPos : NULL ); -#else - st_ivas->hDecoderConfig->Opt_Headrotation, - ( st_ivas->hHeadTrackData != NULL ) ? &st_ivas->hHeadTrackData->Quaternions[0] : NULL, - ( st_ivas->hHeadTrackData != NULL ) ? st_ivas->hHeadTrackData->Pos : NULL ); -#endif #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index 7a008169f2..ead3058519 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -71,17 +71,10 @@ void ivas_renderer_select( * Binaural rendering configurations *-----------------------------------------------------------------*/ -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { st_ivas->hCombinedOrientationData->shd_rot_max_order = -1; } -#else - if ( st_ivas->hDecoderConfig->Opt_Headrotation ) - { - st_ivas->hHeadTrackData->shd_rot_max_order = -1; - } -#endif #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) @@ -168,44 +161,26 @@ void ivas_renderer_select( } if ( st_ivas->hDecoderConfig->Opt_Headrotation -#ifdef EXTERNAL_ORIENTATIONS || st_ivas->hDecoderConfig->Opt_ExternalOrientation -#endif ) { nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); if ( nchan_internal == 2 ) { -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData->shd_rot_max_order = 1; -#else - st_ivas->hHeadTrackData->shd_rot_max_order = 1; -#endif } else if ( nchan_internal == 4 || nchan_internal == 3 ) { -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData->shd_rot_max_order = 0; -#else - st_ivas->hHeadTrackData->shd_rot_max_order = 0; -#endif } else if ( nchan_internal == 6 || nchan_internal == 5 ) { -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData->shd_rot_max_order = 2; -#else - st_ivas->hHeadTrackData->shd_rot_max_order = 2; -#endif } else if ( nchan_internal == 8 || nchan_internal == 7 ) { -#ifdef EXTERNAL_ORIENTATIONS st_ivas->hCombinedOrientationData->shd_rot_max_order = 3; -#else - st_ivas->hHeadTrackData->shd_rot_max_order = 3; -#endif } } } @@ -229,17 +204,9 @@ void ivas_renderer_select( if ( output_config == AUDIO_CONFIG_BINAURAL ) { #ifdef DEBUGGING -#ifdef EXTERNAL_ORIENTATIONS if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) #else - if ( ( ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation ) || ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) && !( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) ) -#endif -#else -#ifdef EXTERNAL_ORIENTATIONS if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) -#else - if ( ( st_ivas->transport_config == AUDIO_CONFIG_5_1 || st_ivas->transport_config == AUDIO_CONFIG_7_1 ) && st_ivas->hDecoderConfig->Opt_Headrotation && ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) ) -#endif #endif { *renderer_type = RENDERER_BINAURAL_OBJECTS_TD; @@ -265,11 +232,7 @@ void ivas_renderer_select( *renderer_type = RENDERER_BINAURAL_FASTCONV; } #endif -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) -#else - if ( st_ivas->hDecoderConfig->Opt_Headrotation ) -#endif { /* force HOA3 domain for rotation*/ *internal_config = AUDIO_CONFIG_HOA3; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 415734d1b6..1583f4006a 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1188,9 +1188,7 @@ typedef struct decoder_config_structure int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ float non_diegetic_pan_gain; /* non diegetic panning gain*/ int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ -#ifdef EXTERNAL_ORIENTATIONS int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ -#endif /* temp. development parameters */ #ifdef DEBUGGING @@ -1309,10 +1307,8 @@ typedef struct Decoder_Struct HEAD_TRACK_DATA_HANDLE hHeadTrackData; /* Head tracking data structure */ RENDER_CONFIG_DATA *hRenderConfig; /* Renderer config pointer */ int32_t binaural_latency_ns; /* Binauralization latency in ns */ -#ifdef EXTERNAL_ORIENTATIONS EXTERNAL_ORIENTATION_HANDLE hExtOrientationData; /* External orientation data structure */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; /* Combined external and head orientation data structure */ -#endif /* JBM module */ DECODER_TC_BUFFER_HANDLE hTcBuffer; /* JBM structure */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 3859024180..a7f6fcefd1 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -243,9 +243,7 @@ static void init_decoder_config( hDecoderConfig->Opt_delay_comp = 0; -#ifdef EXTERNAL_ORIENTATIONS hDecoderConfig->Opt_ExternalOrientation = 0; -#endif return; } @@ -423,9 +421,7 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ -#ifdef EXTERNAL_ORIENTATIONS const int16_t enableExternalOrientation, /* i : enable external orientations */ -#endif const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ @@ -485,9 +481,7 @@ ivas_error IVAS_DEC_Configure( hDecoderConfig->Opt_non_diegetic_pan = Opt_non_diegetic_pan; hDecoderConfig->non_diegetic_pan_gain = non_diegetic_pan_gain; hDecoderConfig->Opt_delay_comp = delayCompensationEnabled; -#ifdef EXTERNAL_ORIENTATIONS hDecoderConfig->Opt_ExternalOrientation = enableExternalOrientation; -#endif /* Set decoder parameters to initial values */ if ( ( error = ivas_init_decoder_front( st_ivas ) ) != IVAS_ERR_OK ) @@ -1241,7 +1235,6 @@ ivas_error IVAS_DEC_FeedRefVectorData( return ivas_orient_trk_SetReferenceVector( pOtr, listenerPos, refPos ); } -#ifdef EXTERNAL_ORIENTATIONS /*---------------------------------------------------------------------* * IVAS_DEC_FeedExternalOrientationData( ) * @@ -1285,7 +1278,6 @@ ivas_error IVAS_DEC_FeedExternalOrientationData( return IVAS_ERR_OK; } -#endif /*---------------------------------------------------------------------* * IVAS_DEC_FeedCustomLsData( ) @@ -2591,12 +2583,10 @@ static ivas_error printConfigInfo_dec( fprintf( stdout, "Head rotation: ON\n" ); } -#ifdef EXTERNAL_ORIENTATIONS if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { fprintf( stdout, "External orientation: ON\n" ); } -#endif if ( st_ivas->hDecoderConfig->orientation_tracking != HEAD_ORIENT_TRK_NONE ) { diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 02270798ef..5a6e52870d 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -149,9 +149,7 @@ ivas_error IVAS_DEC_Configure( const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ -#ifdef EXTERNAL_ORIENTATIONS const int16_t enableExternalOrientation, /* i : enable external orientations */ -#endif const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ @@ -214,7 +212,6 @@ ivas_error IVAS_DEC_FeedRefVectorData( const IVAS_VECTOR3 refPos /* i : Reference position */ ); -#ifdef EXTERNAL_ORIENTATIONS /*! r: error code */ ivas_error IVAS_DEC_FeedExternalOrientationData( IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ @@ -224,7 +221,6 @@ ivas_error IVAS_DEC_FeedExternalOrientationData( int8_t *enableRotationInterpolation, /* i : flag to interpolate rotations from current and previous frames */ int16_t *numFramesToTargetOrientation /* i : number of frames until target orientation is reached */ ); -#endif /*! r: error code */ ivas_error IVAS_DEC_VoIP_FeedFrame( diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index ce898ee36d..eca2dd4d47 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1418,11 +1418,7 @@ ivas_error ivas_rend_crendProcess( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, DECODER_CONFIG_HANDLE hDecoderConfig, -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, -#endif IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, float *output[], /* i/o: input/output audio channels */ @@ -1437,7 +1433,6 @@ ivas_error ivas_rend_crendProcess( ivas_error error; IVAS_REND_AudioConfig inRendConfig; IVAS_REND_AudioConfig outRendConfig; -#ifdef EXTERNAL_ORIENTATIONS int8_t combinedOrientationEnabled; combinedOrientationEnabled = 0; @@ -1452,7 +1447,6 @@ ivas_error ivas_rend_crendProcess( } } } -#endif push_wmops( "ivas_rend_crendProcess" ); @@ -1478,11 +1472,7 @@ ivas_error ivas_rend_crendProcess( for ( subframe_idx = 0; subframe_idx < MAX_PARAM_SPATIAL_SUBFRAMES; subframe_idx++ ) { -#ifdef EXTERNAL_ORIENTATIONS if ( hDecoderConfig && combinedOrientationEnabled ) -#else - if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) -#endif { /* Orientation tracking */ @@ -1492,20 +1482,12 @@ ivas_error ivas_rend_crendProcess( */ if ( in_config == AUDIO_CONFIG_FOA || in_config == AUDIO_CONFIG_HOA2 || in_config == AUDIO_CONFIG_HOA3 ) { -#ifdef EXTERNAL_ORIENTATIONS rotateFrame_shd( hCombinedOrientationData, output, subframe_len, *hIntSetup, subframe_idx ); -#else - rotateFrame_shd( hHeadTrackData, output, subframe_len, *hIntSetup, subframe_idx ); -#endif } /* Rotation in SD for MC -> BINAURAL_ROOM */ else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) { -#ifdef EXTERNAL_ORIENTATIONS rotateFrame_sd( hCombinedOrientationData, output, subframe_len, *hIntSetup, hEFAPdata, subframe_idx ); -#else - rotateFrame_sd( hHeadTrackData, output, subframe_len, *hIntSetup, hEFAPdata, subframe_idx ); -#endif } } @@ -1553,11 +1535,7 @@ ivas_error ivas_rend_crendProcessSubframe( const AUDIO_CONFIG inConfig, /* i : input audio configuration */ const AUDIO_CONFIG outConfig, /* i : output audio configuration */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ -#else - const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ -#endif const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ @@ -1577,7 +1555,6 @@ ivas_error ivas_rend_crendProcessSubframe( ivas_error error; IVAS_REND_AudioConfig inRendConfig; IVAS_REND_AudioConfig outRendConfig; -#ifdef EXTERNAL_ORIENTATIONS int8_t combinedOrientationEnabled; combinedOrientationEnabled = 0; @@ -1592,7 +1569,6 @@ ivas_error ivas_rend_crendProcessSubframe( } } } -#endif push_wmops( "ivas_rend_crendProcessSubframe" ); @@ -1640,11 +1616,7 @@ ivas_error ivas_rend_crendProcessSubframe( { subframe_len = hTcBuffer->subframe_nbslots[subframe_idx] * hTcBuffer->n_samples_granularity; -#ifdef EXTERNAL_ORIENTATIONS if ( hDecoderConfig && combinedOrientationEnabled ) -#else - if ( hDecoderConfig && hDecoderConfig->Opt_Headrotation && hHeadTrackData && hHeadTrackData->num_quaternions >= 0 ) -#endif { /* Rotation in SHD for: MC with elevation (5_1_2 / 5_1_4 / 7_1_4) -> BINAURAL @@ -1653,22 +1625,14 @@ ivas_error ivas_rend_crendProcessSubframe( if ( in_config == AUDIO_CONFIG_FOA || in_config == AUDIO_CONFIG_HOA2 || in_config == AUDIO_CONFIG_HOA3 ) { rotateFrame_shd( -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData, -#else - hHeadTrackData, -#endif tc_local, subframe_len, *hIntSetup, 0 ); } /* Rotation in SD for MC -> BINAURAL_ROOM */ else if ( ( hIntSetup != NULL ) && hIntSetup->is_loudspeaker_setup ) { rotateFrame_sd( -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData, -#else - hHeadTrackData, -#endif tc_local, subframe_len, *hIntSetup, hEFAPdata, 0 ); } } diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index a02cd5f1d9..86c0a80ef8 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -80,9 +80,7 @@ typedef struct hrtfGainCache *------------------------------------------------------------------------*/ static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, -#endif float *output_f[], const int16_t nchan_transport, const int16_t subframe ); @@ -96,11 +94,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( Decoder_Struc static void ivas_dirac_dec_binaural_process_output( Decoder_Struct *st_ivas, float *output_f[], float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t max_band_decorr, const int16_t numInChannels, const int16_t subframe ); static void adaptTransportSignalsHeadtracked( -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hHeadTrackData, -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, -#endif float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, @@ -108,11 +102,7 @@ static void adaptTransportSignalsHeadtracked( float Rmat[3][3] ); static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hHeadTrackData, -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, -#endif float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, @@ -400,11 +390,7 @@ void ivas_dirac_dec_binaural_render( for ( subframe_idx = first_sf; subframe_idx < last_sf; subframe_idx++ ) { int16_t n_samples_sf = slot_size * hDirAC->subframe_nbslots[subframe_idx]; -#ifdef EXTERNAL_ORIENTATIONS ivas_dirac_dec_binaural_internal( st_ivas, st_ivas->hCombinedOrientationData, output_f_local, nchan_transport, subframe_idx ); -#else - ivas_dirac_dec_binaural_internal( st_ivas, output_f_local, nchan_transport, subframe_idx ); -#endif for ( ch = 0; ch < nchan_out; ch++ ) { output_f_local[ch] += n_samples_sf; @@ -430,9 +416,7 @@ void ivas_dirac_dec_binaural_render( void ivas_dirac_dec_binaural( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ -#endif float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ const int16_t nchan_transport /* i : number of transport channels */ ) @@ -491,11 +475,7 @@ void ivas_dirac_dec_binaural( { int16_t n_samples_sf = slot_size * st_ivas->hDirAC->subframe_nbslots[subframe]; -#ifdef EXTERNAL_ORIENTATIONS ivas_dirac_dec_binaural_internal( st_ivas, hCombinedOrientationData, p_output, nchan_transport, subframe ); -#else - ivas_dirac_dec_binaural_internal( st_ivas, p_output, nchan_transport, subframe ); -#endif for ( ch = 0; ch < 2 * BINAURAL_CHANNELS; ch++ ) { @@ -520,9 +500,7 @@ void ivas_dirac_dec_binaural( static void ivas_dirac_dec_binaural_internal( Decoder_Struct *st_ivas, -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, -#endif float *output_f[], const int16_t nchan_transport, const int16_t subframe ) @@ -535,9 +513,7 @@ static void ivas_dirac_dec_binaural_internal( int16_t max_band_decorr; DIFFUSE_DISTRIBUTION_DATA diffuseDistData; int16_t nBins, offsetSamples; -#ifdef EXTERNAL_ORIENTATIONS int16_t i, j; -#endif hDirAC = st_ivas->hDirAC; nBins = hDirAC->num_freq_bands; @@ -670,7 +646,6 @@ static void ivas_dirac_dec_binaural_internal( ivas_sba_prototype_renderer( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, subframe ); } -#ifdef EXTERNAL_ORIENTATIONS if ( hCombinedOrientationData ) { for ( i = 0; i < 3; i++ ) @@ -687,26 +662,10 @@ static void ivas_dirac_dec_binaural_internal( ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( hCombinedOrientationData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); } -#else - if ( st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ) - { - QuatToRotMat( st_ivas->hHeadTrackData->Quaternions[subframe], Rmat ); - - if ( nchan_transport == 2 ) - { - adaptTransportSignalsHeadtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); - - ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( st_ivas->hHeadTrackData, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, nBins, hDirAC->subframe_nbslots[subframe], Rmat ); - } -#endif } ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matrices( st_ivas, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, Rmat, subframe, -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 ); -#else - st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); -#endif if ( st_ivas->ivas_format == ISM_FORMAT ) { @@ -722,11 +681,7 @@ static void ivas_dirac_dec_binaural_internal( } ivas_dirac_dec_binaural_determine_processing_matrices( st_ivas, max_band_decorr, Rmat, -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData && hCombinedOrientationData->enableCombinedOrientation[subframe] > 0 ); -#else - st_ivas->hHeadTrackData && st_ivas->hHeadTrackData->num_quaternions >= 0 ); -#endif ivas_dirac_dec_binaural_process_output( st_ivas, output_f, Cldfb_RealBuffer_in, Cldfb_ImagBuffer_in, max_band_decorr, numInChannels, subframe ); st_ivas->hDirAC->hDiffuseDist = NULL; @@ -1490,11 +1445,7 @@ static void ivas_dirac_dec_binaural_process_output( static void adaptTransportSignalsHeadtracked( -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hHeadTrackData, -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, -#endif float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, @@ -1609,11 +1560,7 @@ static void adaptTransportSignalsHeadtracked( } static void ivas_dirac_dec_binaural_check_and_switch_transports_headtracked( -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hHeadTrackData, -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, -#endif float inRe[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], float inIm[][CLDFB_SLOTS_PER_SUBFRAME][CLDFB_NO_CHANNELS_MAX], const int16_t nBins, diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index d1858ee97f..49cf6488e0 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -260,11 +260,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ -#ifdef EXTERNAL_ORIENTATIONS const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ -#else - const int16_t Opt_Headrotation, /* i : Head rotation flag */ -#endif const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ @@ -306,11 +302,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( TDREND_Update_object_positions( hBinRendererTd, num_src, ivas_format, hIsmMetaData ); } /* Update the listener's location/orientation */ -#ifdef EXTERNAL_ORIENTATIONS TDREND_Update_listener_orientation( hBinRendererTd, ( enableCombinedOrientation != NULL ) ? enableCombinedOrientation[subframe_idx] : 0, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); -#else - TDREND_Update_listener_orientation( hBinRendererTd, Opt_Headrotation, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); -#endif #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( hReverb != NULL ) @@ -533,7 +525,6 @@ void TDREND_Update_listener_orientation( UpVec[0] = Rmat[2][0]; UpVec[1] = Rmat[2][1]; UpVec[2] = Rmat[2][2]; -#ifdef EXTERNAL_ORIENTATIONS if ( Pos != NULL ) { /* Input position */ @@ -548,12 +539,6 @@ void TDREND_Update_listener_orientation( Pos_p[1] = 0.0f; Pos_p[2] = 0.0f; } -#else - /* Input position */ - Pos_p[0] = ( *Pos ).x; - Pos_p[1] = ( *Pos ).y; - Pos_p[2] = ( *Pos ).z; -#endif } else { @@ -636,11 +621,7 @@ ivas_error ivas_td_binaural_renderer_ext( const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ -#else - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ -#endif const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const int16_t output_frame, /* i : output frame length */ @@ -703,15 +684,9 @@ ivas_error ivas_td_binaural_renderer_ext( } if ( ( error = ivas_td_binaural_renderer_unwrap( hReverb, transport_config, pTDRend->hBinRendererTd, num_src, lfe_idx, ivas_format, hIsmMetaData, -#ifdef EXTERNAL_ORIENTATIONS ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->enableCombinedOrientation : NULL, ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->Quaternions : NULL, ( hCombinedOrientationData != NULL ) ? ( *hCombinedOrientationData )->listenerPos : NULL, -#else - headRotData->headRotEnabled, - ( headRotData != NULL ) ? headRotData->headPositions : NULL, - ( headRotData != NULL ) ? headRotData->Pos : NULL, -#endif ism_md_subframe_update_ext, p_output, output_frame ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index 3843c48fc3..64945b5c7b 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -81,11 +81,7 @@ static IVAS_QUATERNION IdentityQuaternion( * Quaternion product *------------------------------------------------------------------------------------------*/ -#ifdef EXTERNAL_ORIENTATIONS void QuaternionProduct( -#else -static void QuaternionProduct( -#endif const IVAS_QUATERNION q1, const IVAS_QUATERNION q2, IVAS_QUATERNION *const r ) @@ -157,11 +153,7 @@ static void QuaternionNormalize( * Computes a spherical linear interpolation between two quaternions *------------------------------------------------------------------------------------------*/ -#ifdef EXTERNAL_ORIENTATIONS void QuaternionSlerp( -#else -static void QuaternionSlerp( -#endif const IVAS_QUATERNION q1, const IVAS_QUATERNION q2, const float t, @@ -239,11 +231,7 @@ static float QuaternionAngle( * Computes an inverse quaternion *------------------------------------------------------------------------------------------*/ -#ifdef EXTERNAL_ORIENTATIONS void QuaternionInverse( -#else -static void QuaternionInverse( -#endif const IVAS_QUATERNION q, IVAS_QUATERNION *const r ) { diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index cf9eed56f4..17732ff62c 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -151,9 +151,7 @@ ivas_error ivas_sba_get_hoa_dec_matrix( void ivas_dirac_dec_binaural( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ -#endif float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ const int16_t nchan_transport /* i : number of transport channels */ ); @@ -230,11 +228,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ -#ifdef EXTERNAL_ORIENTATIONS const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ -#else - const int16_t Opt_Headrotation, /* i : Head rotation flag */ -#endif const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ const int16_t ism_md_subframe_update, @@ -246,11 +240,7 @@ ivas_error ivas_td_binaural_renderer_ext( const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ -#else - const IVAS_REND_HeadRotData *headRotData, /* i : Input head positions */ -#endif const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ const REVERB_HANDLE hReverb, /* i : Reverberator handle */ const int16_t output_frame, /* i : output frame length */ @@ -511,11 +501,7 @@ ivas_error ivas_rend_crendProcess( const AUDIO_CONFIG inConfig, const AUDIO_CONFIG outConfig, DECODER_CONFIG_HANDLE hDecoderConfig, -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, -#endif IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, float *output[], /* i/o: input/output audio channels */ @@ -527,11 +513,7 @@ ivas_error ivas_rend_crendProcessSubframe( const AUDIO_CONFIG inConfig, /* i : input audio configuration */ const AUDIO_CONFIG outConfig, /* i : output audio configuration */ const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ -#else - const HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : Head tracking data structure */ -#endif const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ @@ -811,11 +793,7 @@ void SHrotmatgen( ); void rotateFrame_shd( -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#endif float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -823,11 +801,7 @@ void rotateFrame_shd( ); void rotateFrame_sd( -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#endif float *output[], /* i/o: unrotated SD signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -845,11 +819,7 @@ void rotateFrame_shd_cldfb( ); void rotateFrame_sd_cldfb( -#ifdef EXTERNAL_ORIENTATIONS float Rmat[3][3], /* i : real-space rotation matrix */ -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#endif float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ @@ -858,7 +828,6 @@ void rotateFrame_sd_cldfb( const int16_t nb_band /* i : number of CLDFB bands to process */ ); -#ifdef EXTERNAL_ORIENTATIONS ivas_error ivas_external_orientation_open( EXTERNAL_ORIENTATION_HANDLE *hExtOrientationData /* o : external orientation handle */ ); @@ -905,7 +874,6 @@ bool are_orientations_same( const IVAS_QUATERNION *orientation1, const IVAS_QUATERNION *orientation2 ); -#endif /*----------------------------------------------------------------------------------* @@ -929,7 +897,6 @@ ivas_error ivas_render_config_init_from_rom( ); -#ifdef EXTERNAL_ORIENTATIONS /*----------------------------------------------------------------------------------* * Quaternion operations *----------------------------------------------------------------------------------*/ @@ -951,7 +918,6 @@ void QuaternionSlerp( const float t, IVAS_QUATERNION *const r ); -#endif /*----------------------------------------------------------------------------------* diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index 58d4c7dc08..d9a96e7723 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -249,11 +249,7 @@ void rotateAziEle( *------------------------------------------------------------------------*/ void rotateFrame_shd( -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#endif float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -285,19 +281,10 @@ void rotateFrame_shd( set_zero( SHrotmat[i], HEADROT_SHMAT_DIM ); } -#ifndef EXTERNAL_ORIENTATIONS - /* get next quaternion */ - QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); -#endif /* calculate ambisonics rotation matrices for the previous and current frames */ -#ifdef EXTERNAL_ORIENTATIONS SHrotmatgen( SHrotmat_prev, hCombinedOrientationData->Rmat_prev, shd_rot_max_order ); SHrotmatgen( SHrotmat, hCombinedOrientationData->Rmat[subframe_idx], shd_rot_max_order ); -#else - SHrotmatgen( SHrotmat_prev, hHeadTrackData->Rmat_prev, shd_rot_max_order ); - SHrotmatgen( SHrotmat, hHeadTrackData->Rmat, shd_rot_max_order ); -#endif for ( i = 0; i < subframe_len; i++ ) { @@ -349,11 +336,7 @@ void rotateFrame_shd( /* move Rmat to Rmat_prev */ for ( i = 0; i < 3; i++ ) { -#ifdef EXTERNAL_ORIENTATIONS mvr2r( hCombinedOrientationData->Rmat[subframe_idx][i], hCombinedOrientationData->Rmat_prev[i], 3 ); -#else - mvr2r( hHeadTrackData->Rmat[i], hHeadTrackData->Rmat_prev[i], 3 ); -#endif } return; @@ -367,11 +350,7 @@ void rotateFrame_shd( *------------------------------------------------------------------------*/ void rotateFrame_sd( -#ifdef EXTERNAL_ORIENTATIONS COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#endif float *output[], /* i/o: unrotated SD signal buffer in TD */ const int16_t subframe_len, /* i : subframe length per channel */ const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ @@ -402,10 +381,6 @@ void rotateFrame_sd( cross_fade[i] = i * tmp; } -#ifndef EXTERNAL_ORIENTATIONS - /* Get next quaternion and calculate rotation matrix */ - QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], hHeadTrackData->Rmat ); -#endif for ( ch_in = 0; ch_in < nchan; ch_in++ ) { @@ -428,11 +403,7 @@ void rotateFrame_sd( ch_in_woLFE = ( ch_in >= index_lfe ) ? ch_in - 1 : ch_in; /* gains for previous subframe rotation */ -#ifdef EXTERNAL_ORIENTATIONS rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hCombinedOrientationData->Rmat_prev, hTransSetup.is_planar_setup ); -#else - rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hHeadTrackData->Rmat_prev, hTransSetup.is_planar_setup ); -#endif if ( hEFAPdata != NULL && ( hTransSetup.ls_azimuth[ch_in_woLFE] != azimuth || hTransSetup.ls_elevation[ch_in_woLFE] != elevation ) ) { efap_determine_gains( hEFAPdata, tmp_gains, azimuth, elevation, EFAP_MODE_EFAP ); @@ -453,11 +424,7 @@ void rotateFrame_sd( /* gains for current subframe rotation */ -#ifdef EXTERNAL_ORIENTATIONS rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hCombinedOrientationData->Rmat[subframe_idx], hTransSetup.is_planar_setup ); -#else - rotateAziEle( hTransSetup.ls_azimuth[ch_in_woLFE], hTransSetup.ls_elevation[ch_in_woLFE], &azimuth, &elevation, hHeadTrackData->Rmat, hTransSetup.is_planar_setup ); -#endif if ( hEFAPdata != NULL && ( hTransSetup.ls_azimuth[ch_in_woLFE] != azimuth || hTransSetup.ls_elevation[ch_in_woLFE] != elevation ) ) { efap_determine_gains( hEFAPdata, tmp_gains, azimuth, elevation, EFAP_MODE_EFAP ); @@ -494,11 +461,7 @@ void rotateFrame_sd( /* move Rmat to Rmat_prev */ for ( i = 0; i < 3; i++ ) { -#ifdef EXTERNAL_ORIENTATIONS mvr2r( hCombinedOrientationData->Rmat[subframe_idx][i], hCombinedOrientationData->Rmat_prev[i], 3 ); -#else - mvr2r( hHeadTrackData->Rmat[i], hHeadTrackData->Rmat_prev[i], 3 ); -#endif } /* copy to output */ @@ -614,11 +577,7 @@ void rotateFrame_shd_cldfb( *------------------------------------------------------------------------*/ void rotateFrame_sd_cldfb( -#ifdef EXTERNAL_ORIENTATIONS float Rmat[3][3], /* i : real-space rotation matrix */ -#else - HEAD_TRACK_DATA_HANDLE hHeadTrackData, /* i : head track handle */ -#endif float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ @@ -630,9 +589,6 @@ void rotateFrame_sd_cldfb( int16_t iBlock, iBand, m, n; float gains[MAX_CICP_CHANNELS - 1][MAX_CICP_CHANNELS - 1]; int16_t azimuth, elevation; -#ifndef EXTERNAL_ORIENTATIONS - float Rmat[3][3]; -#endif float g1; float realRot[MAX_CICP_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; float imagRot[MAX_CICP_CHANNELS - 1][MAX_PARAM_SPATIAL_SUBFRAMES * CLDFB_NO_CHANNELS_MAX]; @@ -654,10 +610,6 @@ void rotateFrame_sd_cldfb( } } -#ifndef EXTERNAL_ORIENTATIONS - /* Get next quaternion and calculate rotation matrix */ - QuatToRotMat( hHeadTrackData->Quaternions[hHeadTrackData->num_quaternions++], Rmat ); -#endif /* rotation of Euler angles */ for ( n = 0; n < nInChannels; n++ ) @@ -728,7 +680,6 @@ void rotateFrame_sd_cldfb( } -#ifdef EXTERNAL_ORIENTATIONS /*-----------------------------------------------------------------------* * ivas_external_orientation_open() * @@ -1273,7 +1224,6 @@ bool are_orientations_same( return orientationsAreSame; } -#endif // EXTERNAL_ORIENTATIONS /*-----------------------------------------------------------------------* * Local Function definitions diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 96befbf375..0e7f24c4cb 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -277,7 +277,6 @@ typedef struct ivas_binaural_head_track_struct } HEAD_TRACK_DATA, *HEAD_TRACK_DATA_HANDLE; -#ifdef EXTERNAL_ORIENTATIONS /*----------------------------------------------------------------------------------* * External orientation data structure *----------------------------------------------------------------------------------*/ @@ -319,7 +318,6 @@ typedef struct ivas_combined_orientation_struct IVAS_VECTOR3 listenerPos[MAX_PARAM_SPATIAL_SUBFRAMES]; } COMBINED_ORIENTATION_DATA, *COMBINED_ORIENTATION_HANDLE; -#endif /*----------------------------------------------------------------------------------* * Reverberator structure diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 08f6536249..1921515395 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -95,9 +95,7 @@ typedef struct * multiple rendering configurations unless one global one can be used. If this is not relevant, * feel free to remove this TODO. */ -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *pCombinedOrientationData; -#endif } rendering_context; /* Common base for input structs */ @@ -209,10 +207,8 @@ struct IVAS_REND IVAS_REND_HeadRotData headRotData; -#ifdef EXTERNAL_ORIENTATIONS EXTERNAL_ORIENTATION_HANDLE hExternalOrientationData; COMBINED_ORIENTATION_HANDLE hCombinedOrientationData; -#endif int8_t rendererConfigEnabled; RENDER_CONFIG_DATA *hRendererConfig; /* Renderer config pointer */ @@ -1092,9 +1088,7 @@ static rendering_context getRendCtx( ctx.pCustomLsOut = &hIvasRend->customLsOut; ctx.pEfapOutWrapper = &hIvasRend->efapOutWrapper; ctx.pHeadRotData = &hIvasRend->headRotData; -#ifdef EXTERNAL_ORIENTATIONS ctx.pCombinedOrientationData = &hIvasRend->hCombinedOrientationData; -#endif return ctx; } @@ -2762,7 +2756,6 @@ static DecoderDummy *initDecoderDummy( decDummy->hHeadTrackData->OrientationTracker = (ivas_orient_trk_state_t *) malloc( sizeof( ivas_orient_trk_state_t ) ); ivas_orient_trk_Init( decDummy->hHeadTrackData->OrientationTracker ); -#ifdef EXTERNAL_ORIENTATIONS /* External orientations */ if ( ( error = ivas_external_orientation_open( &( decDummy->hExtOrientationData ) ) ) != IVAS_ERR_OK ) { @@ -2774,15 +2767,12 @@ static DecoderDummy *initDecoderDummy( { assert( error == IVAS_ERR_OK ); } -#endif } else { decDummy->hHeadTrackData = NULL; -#ifdef EXTERNAL_ORIENTATIONS decDummy->hExtOrientationData = NULL; decDummy->hCombinedOrientationData = NULL; -#endif } if ( enableRenderConfig ) @@ -2891,7 +2881,6 @@ static void freeDecoderDummy( } free( pDecDummy->hHeadTrackData ); } -#ifdef EXTERNAL_ORIENTATIONS if ( pDecDummy->hExtOrientationData != NULL ) { free( pDecDummy->hExtOrientationData ); @@ -2900,7 +2889,6 @@ static void freeDecoderDummy( { free( pDecDummy->hCombinedOrientationData ); } -#endif ivas_render_config_close( &pDecDummy->hRenderConfig ); @@ -3027,7 +3015,6 @@ ivas_error IVAS_REND_Open( return error; } -#ifdef EXTERNAL_ORIENTATIONS /* Initialize external orientation data */ if ( ( error = ivas_external_orientation_open( &( hIvasRend->hExternalOrientationData ) ) ) != IVAS_ERR_OK ) { @@ -3039,7 +3026,6 @@ ivas_error IVAS_REND_Open( { return error; } -#endif /* Initialize EFAP */ if ( ( error = initEfap( &hIvasRend->efapOutWrapper, outConfig, &hIvasRend->customLsOut ) ) != IVAS_ERR_OK ) @@ -4407,7 +4393,6 @@ ivas_error IVAS_REND_SetReferenceVector( } -#ifdef EXTERNAL_ORIENTATIONS /*---------------------------------------------------------------------* * IVAS_REND_SetExternalOrientation() * @@ -4502,7 +4487,6 @@ ivas_error IVAS_REND_GetCombinedOrientation( return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* @@ -4599,18 +4583,14 @@ static ivas_error rotateFrameMc( IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ LSSETUP_CUSTOM_STRUCT inCustomLs, /* i : Input Custom LS setup */ const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ -#endif rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) { int16_t i; -#ifdef EXTERNAL_ORIENTATIONS int16_t j; -#endif int16_t subframe_idx, subframe_len; int16_t azimuth, elevation; int16_t is_planar_setup, lfe_idx; @@ -4654,7 +4634,6 @@ static ivas_error rotateFrameMc( subframe_len = inAudio.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; for ( subframe_idx = 0; subframe_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; subframe_idx++ ) { -#ifdef EXTERNAL_ORIENTATIONS for ( i = 0; i < 3; i++ ) { if ( hCombinedOrientationData != NULL ) @@ -4671,10 +4650,6 @@ static ivas_error rotateFrameMc( Rmat[i][i] = 1.0f; } } -#else - /* Get next quaternion and calculate rotation matrix */ - QuatToRotMat( headRotData->headPositions[subframe_idx], Rmat ); -#endif for ( ch_in = 0; ch_in < nchan; ch_in++ ) { @@ -4744,9 +4719,7 @@ static ivas_error rotateFrameSba( IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ -#endif rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) @@ -4778,7 +4751,6 @@ static ivas_error rotateFrameSba( set_zero( gains[i], HEADROT_SHMAT_DIM ); } -#ifdef EXTERNAL_ORIENTATIONS for ( i = 0; i < 3; i++ ) { if ( hCombinedOrientationData != NULL ) @@ -4795,10 +4767,6 @@ static ivas_error rotateFrameSba( Rmat[i][i] = 1.0f; } } -#else - /* Get next quaternion and calculate rotation matrix */ - QuatToRotMat( headRotData->headPositions[subframe_idx], Rmat ); -#endif /* calculate ambisonics rotation matrices for the previous and current frames */ SHrotmatgen( gains, Rmat, shd_rot_max_order ); @@ -4878,11 +4846,7 @@ static ivas_error renderIsmToBinaural( if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, -#ifdef EXTERNAL_ORIENTATIONS ismInput->base.ctx.pCombinedOrientationData, -#else - ismInput->base.ctx.pHeadRotData, -#endif &ismInput->currentPos, ismInput->hReverb, outAudio.config.numSamplesPerChannel, @@ -4913,14 +4877,9 @@ static ivas_error renderIsmToBinauralRoom( pan_vector previousPanGains; IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioObjectPosition rotatedPos; -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t j; -#else - IVAS_QUATERNION quat; - const IVAS_REND_HeadRotData *headRotData; -#endif float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) @@ -4932,7 +4891,6 @@ static ivas_error renderIsmToBinauralRoom( rotatedPos = defaultObjectPosition(); -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData = ismInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; if ( hCombinedOrientationData != NULL ) @@ -4946,28 +4904,17 @@ static ivas_error renderIsmToBinauralRoom( } } } -#else - headRotData = ismInput->base.ctx.pHeadRotData; -#endif #ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && -#ifdef EXTERNAL_ORIENTATIONS combinedOrientationEnabled ) -#else - headRotData->headRotEnabled ) -#endif // EXTERNAL_ORIENTATIONS { copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, -#ifdef EXTERNAL_ORIENTATIONS ismInput->base.ctx.pCombinedOrientationData, -#else - ismInput->base.ctx.pHeadRotData, -#endif &ismInput->currentPos, ismInput->hReverb, outAudio.config.numSamplesPerChannel, @@ -4981,17 +4928,12 @@ static ivas_error renderIsmToBinauralRoom( { #endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotData->headRotEnabled ) -#endif // EXTERNAL_ORIENTATIONS { subframe_len = ismInput->base.inputBuffer.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; // for ( subframe_idx = 0; subframe_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; subframe_idx++ ) for ( subframe_idx = 0; subframe_idx < 1; subframe_idx++ ) { -#ifdef EXTERNAL_ORIENTATIONS for ( i = 0; i < 3; i++ ) { if ( hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) @@ -5008,14 +4950,6 @@ static ivas_error renderIsmToBinauralRoom( Rmat[i][i] = 1.0f; } } -#else - quat.w = headRotData->headPositions[subframe_idx].w; - quat.x = headRotData->headPositions[subframe_idx].x; - quat.y = headRotData->headPositions[subframe_idx].y; - quat.z = headRotData->headPositions[subframe_idx].z; - - QuatToRotMat( quat, Rmat ); -#endif } (void) subframe_len; // avoid warning } @@ -5024,11 +4958,7 @@ static ivas_error renderIsmToBinauralRoom( /* Possible optimization: less processing needed if position didn't change * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ /* previous position gains */ -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotData->headRotEnabled ) -#endif { rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 ); rotatedPos.azimuth = (float) azi_rot; @@ -5036,24 +4966,15 @@ static ivas_error renderIsmToBinauralRoom( } if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, -#ifdef EXTERNAL_ORIENTATIONS ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, -#else - ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, - ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, -#endif previousPanGains ) ) != IVAS_ERR_OK ) { return error; } /* current position gains */ -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotData->headRotEnabled ) -#endif { rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 ); rotatedPos.azimuth = (float) azi_rot; @@ -5061,13 +4982,8 @@ static ivas_error renderIsmToBinauralRoom( } if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, -#ifdef EXTERNAL_ORIENTATIONS ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, -#else - ( headRotData->headRotEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, - ( headRotData->headRotEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, -#endif currentPanGains ) ) != IVAS_ERR_OK ) { return error; @@ -5143,11 +5059,7 @@ static ivas_error renderIsmToBinauralReverb( if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, ismInput->base.inConfig, NULL, -#ifdef EXTERNAL_ORIENTATIONS ismInput->base.ctx.pCombinedOrientationData, -#else - ismInput->base.ctx.pHeadRotData, -#endif &ismInput->currentPos, ismInput->hReverb, outAudio.config.numSamplesPerChannel, @@ -5448,13 +5360,9 @@ static ivas_error renderMcToBinaural( IVAS_REND_AudioConfig inConfig; ivas_error error; IVAS_REND_AudioBuffer tmpRotBuffer; -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; -#else - int8_t headRotEnabled; -#endif float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; @@ -5467,7 +5375,6 @@ static ivas_error renderMcToBinaural( inConfig = mcInput->base.inConfig; -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; if ( hCombinedOrientationData != NULL ) @@ -5481,27 +5388,16 @@ static ivas_error renderMcToBinaural( } } } -#else - headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; -#endif if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( -#ifdef EXTERNAL_ORIENTATIONS combinedOrientationEnabled -#else - headRotEnabled -#endif && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, -#ifdef EXTERNAL_ORIENTATIONS mcInput->base.ctx.pCombinedOrientationData, -#else - mcInput->base.ctx.pHeadRotData, -#endif NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { @@ -5511,20 +5407,14 @@ static ivas_error renderMcToBinaural( else { /* apply rotation */ -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotEnabled ) -#endif { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, -#ifdef EXTERNAL_ORIENTATIONS mcInput->base.ctx.pCombinedOrientationData, -#endif mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -5569,13 +5459,9 @@ static ivas_error renderMcToBinauralRoom( IVAS_REND_AudioBuffer tmpRotBuffer; float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; -#else - int8_t headRotEnabled; -#endif for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ ) { @@ -5586,7 +5472,6 @@ static ivas_error renderMcToBinauralRoom( inConfig = mcInput->base.inConfig; -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; if ( hCombinedOrientationData != NULL ) @@ -5600,35 +5485,20 @@ static ivas_error renderMcToBinauralRoom( } } } -#else - headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; -#endif #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( mcInput->hReverb != NULL && outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( -#ifdef EXTERNAL_ORIENTATIONS combinedOrientationEnabled -#else - headRotEnabled -#endif // EXTERNAL_ORIENTATIONS #else if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( -#ifdef EXTERNAL_ORIENTATIONS combinedOrientationEnabled -#else - headRotEnabled -#endif // EXTERNAL_ORIENTATIONS #endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); if ( ( error = ivas_td_binaural_renderer_ext( &mcInput->tdRendWrapper, mcInput->base.inConfig, &mcInput->customLsInput, -#ifdef EXTERNAL_ORIENTATIONS mcInput->base.ctx.pCombinedOrientationData, -#else - mcInput->base.ctx.pHeadRotData, -#endif NULL, mcInput->hReverb, mcInput->base.inputBuffer.config.numSamplesPerChannel, tmpRendBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -5637,20 +5507,14 @@ static ivas_error renderMcToBinauralRoom( else { /* apply rotation */ -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotEnabled ) -#endif { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, -#ifdef EXTERNAL_ORIENTATIONS mcInput->base.ctx.pCombinedOrientationData, -#endif mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -5697,13 +5561,9 @@ static ivas_error renderMcCustomLsToBinauralRoom( IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; -#else - int8_t headRotEnabled; -#endif push_wmops( "renderMcCustomLsToBinauralRoom" ); @@ -5714,7 +5574,6 @@ static ivas_error renderMcCustomLsToBinauralRoom( p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; } -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData = mcInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; if ( hCombinedOrientationData != NULL ) @@ -5728,25 +5587,16 @@ static ivas_error renderMcCustomLsToBinauralRoom( } } } -#else - headRotEnabled = mcInput->base.ctx.pHeadRotData->headRotEnabled; -#endif /* apply rotation */ -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotEnabled ) -#endif { tmpRotBuffer = mcInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpRotBuffer.data, tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels ); if ( ( error = rotateFrameMc( mcInput->base.inputBuffer, mcInput->base.inConfig, mcInput->customLsInput, mcInput->base.ctx.pHeadRotData, -#ifdef EXTERNAL_ORIENTATIONS mcInput->base.ctx.pCombinedOrientationData, -#endif mcInput->rot_gains_prev, mcInput->efapInWrapper.hEfap, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -5765,11 +5615,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); -#ifdef EXTERNAL_ORIENTATIONS tmpBufPtr = ( combinedOrientationEnabled ) ? &tmpRotBuffer : &mcInput->base.inputBuffer; -#else - tmpBufPtr = ( headRotEnabled ) ? &tmpRotBuffer : &mcInput->base.inputBuffer; -#endif for ( i = 0; i < mcInput->base.inputBuffer.config.numChannels; i++ ) { renderBufferChannel( *tmpBufPtr, i, mcInput->panGains[i], tmpMcBuffer ); @@ -5790,11 +5636,7 @@ static ivas_error renderMcCustomLsToBinauralRoom( return error; } -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotEnabled ) -#endif { free( tmpRotBuffer.data ); } @@ -6013,11 +5855,9 @@ static ivas_error renderSbaToBinaural( IVAS_REND_AudioBuffer tmpRotBuffer; float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; int16_t i; -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; -#endif push_wmops( "renderSbaToBinaural" ); @@ -6026,7 +5866,6 @@ static ivas_error renderSbaToBinaural( p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; } -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; if ( hCombinedOrientationData != NULL ) @@ -6040,14 +5879,9 @@ static ivas_error renderSbaToBinaural( } } } -#endif /* apply rotation */ -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( sbaInput->base.ctx.pHeadRotData->headRotEnabled ) -#endif { tmpRotBuffer = sbaInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); @@ -6056,9 +5890,7 @@ static ivas_error renderSbaToBinaural( mvr2r( sbaInput->base.inputBuffer.data, tmpRotBuffer.data, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); if ( ( error = rotateFrameSba( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, -#ifdef EXTERNAL_ORIENTATIONS sbaInput->base.ctx.pCombinedOrientationData, -#endif sbaInput->rot_gains_prev, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -6099,13 +5931,9 @@ static ivas_error renderSbaToBinauralRoom( IVAS_REND_AudioBuffer tmpMcBuffer; IVAS_REND_AudioBuffer *tmpBufPtr; float *p_tmpCrendBuffer[MAX_OUTPUT_CHANNELS]; -#ifdef EXTERNAL_ORIENTATIONS const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData; int8_t combinedOrientationEnabled; int16_t subframe_idx; -#else - int8_t headRotEnabled; -#endif tmpRotBuffer = outAudio; /* avoid compilation warning */ @@ -6116,7 +5944,6 @@ static ivas_error renderSbaToBinauralRoom( p_tmpCrendBuffer[i] = tmpCrendBuffer[i]; } -#ifdef EXTERNAL_ORIENTATIONS hCombinedOrientationData = sbaInput->base.ctx.pCombinedOrientationData; combinedOrientationEnabled = 0; if ( hCombinedOrientationData != NULL ) @@ -6130,16 +5957,9 @@ static ivas_error renderSbaToBinauralRoom( } } } -#else - headRotEnabled = sbaInput->base.ctx.pHeadRotData->headRotEnabled; -#endif /* apply rotation */ -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotEnabled ) -#endif { tmpRotBuffer = sbaInput->base.inputBuffer; tmpRotBuffer.data = malloc( tmpRotBuffer.config.numSamplesPerChannel * tmpRotBuffer.config.numChannels * sizeof( float ) ); @@ -6148,9 +5968,7 @@ static ivas_error renderSbaToBinauralRoom( mvr2r( sbaInput->base.inputBuffer.data, tmpRotBuffer.data, tmpRotBuffer.config.numChannels * tmpRotBuffer.config.numSamplesPerChannel ); if ( ( error = rotateFrameSba( sbaInput->base.inputBuffer, sbaInput->base.inConfig, sbaInput->base.ctx.pHeadRotData, -#ifdef EXTERNAL_ORIENTATIONS sbaInput->base.ctx.pCombinedOrientationData, -#endif sbaInput->rot_gains_prev, tmpRotBuffer ) ) != IVAS_ERR_OK ) { return error; @@ -6169,11 +5987,7 @@ static ivas_error renderSbaToBinauralRoom( tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numChannels * tmpMcBuffer.config.numSamplesPerChannel ); -#ifdef EXTERNAL_ORIENTATIONS tmpBufPtr = ( combinedOrientationEnabled ) ? &tmpRotBuffer : &sbaInput->base.inputBuffer; -#else - tmpBufPtr = ( headRotEnabled ) ? &tmpRotBuffer : &sbaInput->base.inputBuffer; -#endif for ( i = 0; i < sbaInput->base.inputBuffer.config.numChannels; i++ ) { renderBufferChannel( *tmpBufPtr, i, sbaInput->hoaDecMtx[i], tmpMcBuffer ); @@ -6190,11 +6004,7 @@ static ivas_error renderSbaToBinauralRoom( accumulate2dArrayToBuffer( tmpCrendBuffer, &outAudio ); -#ifdef EXTERNAL_ORIENTATIONS if ( combinedOrientationEnabled ) -#else - if ( headRotEnabled ) -#endif { free( tmpRotBuffer.data ); } @@ -6364,11 +6174,7 @@ static void renderMasaToMc( if ( masaInput->decDummy->renderer_type == RENDERER_STEREO_PARAMETRIC ) { -#ifdef EXTERNAL_ORIENTATIONS ivas_dirac_dec_binaural( masaInput->decDummy, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); -#else - ivas_dirac_dec_binaural( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); -#endif } else { @@ -6405,11 +6211,7 @@ static void renderMasaToBinaural( copyBufferTo2dArray( masaInput->base.inputBuffer, tmpBuffer ); copyMasaMetadataToDiracRenderer( &masaInput->masaMetadata, masaInput->decDummy->hDirAC ); -#ifdef EXTERNAL_ORIENTATIONS ivas_dirac_dec_binaural( masaInput->decDummy, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); -#else - ivas_dirac_dec_binaural( masaInput->decDummy, tmpBuffer, masaInput->base.inputBuffer.config.numChannels ); -#endif accumulate2dArrayToBuffer( tmpBuffer, &outAudio ); @@ -6960,10 +6762,8 @@ void IVAS_REND_Close( closeHeadRotation( hIvasRend ); -#ifdef EXTERNAL_ORIENTATIONS ivas_external_orientation_close( &hIvasRend->hExternalOrientationData ); ivas_combined_orientation_close( &hIvasRend->hCombinedOrientationData ); -#endif free( hIvasRend ); *phIvasRend = NULL; diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 4fdc5477c7..c9da572b61 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -284,7 +284,6 @@ ivas_error IVAS_REND_SetReferenceVector( const IVAS_VECTOR3 refPos /* i : Reference position */ ); -#ifdef EXTERNAL_ORIENTATIONS ivas_error IVAS_REND_SetExternalOrientation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ IVAS_QUATERNION *orientation, /* i : external orientation data */ @@ -302,7 +301,6 @@ ivas_error IVAS_REND_GetCombinedOrientation( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer processed orientation */ ); -#endif #ifdef MASA_PREREND ivas_error IVAS_REND_GetMasaMetadata( diff --git a/lib_util/head_rotation_file_reader.c b/lib_util/head_rotation_file_reader.c index 3fd6e4f439..745b48a8c9 100644 --- a/lib_util/head_rotation_file_reader.c +++ b/lib_util/head_rotation_file_reader.c @@ -36,146 +36,3 @@ #include #include "prot.h" -#ifndef EXTERNAL_ORIENTATIONS - -struct HeadRotFileReader -{ - FILE *trajFile; - int32_t frameCounter; - char *file_path; - bool fileRewind; -}; - - -/*-----------------------------------------------------------------------* - * HeadRotationFileReader_open() - * - * Allocate and initialize Head-Tracking reader - *-----------------------------------------------------------------------*/ - -ivas_error HeadRotationFileReader_open( - char *trajFilePath, /* i : head rotation trajectory file name */ - HeadRotFileReader **headRotReader /* o : HeadRotFileReader handle */ -) -{ - HeadRotFileReader *self; - FILE *trajFile; - - /* Open trajectory file */ - if ( strlen( trajFilePath ) < 1 ) - { - return IVAS_ERR_FAILED_FILE_OPEN; - } - - trajFile = fopen( trajFilePath, "r" ); - - if ( !trajFile ) - { - return IVAS_ERR_FAILED_FILE_OPEN; - } - - self = calloc( sizeof( HeadRotFileReader ), 1 ); - self->trajFile = trajFile; - self->frameCounter = 0; - self->file_path = calloc( sizeof( char ), strlen( trajFilePath ) + 1 ); - strcpy( self->file_path, trajFilePath ); - self->fileRewind = false; - - *headRotReader = self; - - return IVAS_ERR_OK; -} - - -/*-----------------------------------------------------------------------* - * HeadRotationFileReading() - * - * Read values from the trajectory file - *-----------------------------------------------------------------------*/ - -ivas_error HeadRotationFileReading( - HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ - IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_VECTOR3 *pPos /* o : listener position */ -) -{ - float w, x, y, z; - float posx, posy, posz; - int32_t read_values; - - posx = 0.0f; - posy = 0.0f; - posz = 0.0f; - - read_values = fscanf( headRotReader->trajFile, "%f,%f,%f,%f,%f,%f,%f", &w, &x, &y, &z, &posx, &posy, &posz ); - if ( ( read_values != 4 ) && ( read_values != 7 ) ) /* Allow either orientation (4) or orientation+position (4+3) */ - { - if ( feof( headRotReader->trajFile ) ) - { - rewind( headRotReader->trajFile ); - headRotReader->fileRewind = true; - return HeadRotationFileReading( headRotReader, pQuaternion, pPos ); - } - return IVAS_ERR_FAILED_FILE_PARSE; - } - - ( headRotReader->frameCounter )++; - - pQuaternion->w = w; - pQuaternion->x = x; - pQuaternion->y = y; - pQuaternion->z = z; - if ( pPos != NULL ) - { - pPos->x = posx; - pPos->y = posy; - pPos->z = posz; - } - - return IVAS_ERR_OK; -} - - -/*-----------------------------------------------------------------------* - * HeadRotationFileReader_close() - * - * Deallocates memory for the Head-Tracking reader - *-----------------------------------------------------------------------*/ - -void HeadRotationFileReader_close( - HeadRotFileReader **headRotReader /* i/o: HeadRotFileReader handle */ -) -{ - if ( headRotReader == NULL || *headRotReader == NULL ) - { - return; - } - - fclose( ( *headRotReader )->trajFile ); - free( ( *headRotReader )->file_path ); - free( *headRotReader ); - *headRotReader = NULL; - - return; -} - - -/*-----------------------------------------------------------------------* - * HeadRotationFileReader_getFilePath() - * - * - *-----------------------------------------------------------------------*/ - -const char *HeadRotationFileReader_getFilePath( - HeadRotFileReader *headRotReader /* i/o: HeadRotFileReader handle */ -) -{ - if ( headRotReader == NULL ) - { - return NULL; - } - - return headRotReader->file_path; -} - -#endif /* EXTERNAL_ORIENTATIONS */ diff --git a/lib_util/head_rotation_file_reader.h b/lib_util/head_rotation_file_reader.h index 3c82f06403..d4a2af84e7 100644 --- a/lib_util/head_rotation_file_reader.h +++ b/lib_util/head_rotation_file_reader.h @@ -35,55 +35,4 @@ #include "common_api_types.h" -#ifndef EXTERNAL_ORIENTATIONS - -#define IVAS_MAX_PARAM_SPATIAL_SUBFRAMES 4 - -typedef struct HeadRotFileReader HeadRotFileReader; - -/*-----------------------------------------------------------------------* - * HeadRotationFileReader_open() - * - * Allocate and initialize Head-Tracking handle - *-----------------------------------------------------------------------*/ - -ivas_error HeadRotationFileReader_open( - char *trajFilePath, /* i : head rotation trajectory file name */ - HeadRotFileReader **headRotReader /* o : HeadRotFileReader handle */ -); - -/*-----------------------------------------------------------------------* - * HeadRotationFileReading() - * - * Read values from the trajectory file - *-----------------------------------------------------------------------*/ - -ivas_error HeadRotationFileReading( - HeadRotFileReader *headRotReader, /* i/o: HeadRotFileReader handle */ - IVAS_QUATERNION *pQuaternion, /* o : head-tracking data */ - IVAS_VECTOR3 *pPos /* o : listener position */ -); - -/*-----------------------------------------------------------------------* - * HeadRotationFileReader_close() - * - * Deallocates memory for the Head-Tracking handle - *-----------------------------------------------------------------------*/ - -void HeadRotationFileReader_close( - HeadRotFileReader **headRotReader /* i/o: HeadRotFileReader handle */ -); - -/*-----------------------------------------------------------------------* - * HeadRotationFileReader_getFilePath() - * - * - *-----------------------------------------------------------------------*/ - -const char *HeadRotationFileReader_getFilePath( - HeadRotFileReader *headRotReader /* i/o: HeadRotFileReader handle */ -); - - -#endif /* EXTERNAL_ORIENTATIONS */ #endif /* IVAS_HR_FILE_READER_H */ diff --git a/lib_util/rotation_file_reader.c b/lib_util/rotation_file_reader.c index 42bd6a3ed5..a7686772a1 100644 --- a/lib_util/rotation_file_reader.c +++ b/lib_util/rotation_file_reader.c @@ -36,7 +36,6 @@ #include #include "prot.h" -#ifdef EXTERNAL_ORIENTATIONS struct RotFileReader { @@ -232,4 +231,3 @@ const char *RotationFileReader_getFilePath( return rotReader->file_path; } -#endif /* EXTERNAL_ORIENTATIONS */ diff --git a/lib_util/rotation_file_reader.h b/lib_util/rotation_file_reader.h index 5f32f4ca09..d597c67a7f 100644 --- a/lib_util/rotation_file_reader.h +++ b/lib_util/rotation_file_reader.h @@ -35,7 +35,6 @@ #include "common_api_types.h" -#ifdef EXTERNAL_ORIENTATIONS #define IVAS_MAX_PARAM_SPATIAL_SUBFRAMES 4 @@ -100,5 +99,4 @@ const char *RotationFileReader_getFilePath( ); -#endif /* EXTERNAL_ORIENTATIONS */ #endif /* IVAS_ROTATION_FILE_READER_H */ -- GitLab From b860fa78f17774bab6e32eb07b3c53450f257056 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 18:01:29 +0200 Subject: [PATCH 365/381] [cleanup] accept FIX_541_EXT_REND_MASA_ROTATIONS --- lib_com/options.h | 1 - lib_rend/lib_rend.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 3744447ff3..9e5a0a9e35 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,7 +154,6 @@ -#define FIX_541_EXT_REND_MASA_ROTATIONS /* Nokia: Issue 541, rotations missing in masa external renderer */ #define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ #define FIX_383_CLEAN_UP /* Dlb : Clean up of unused functions */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 1921515395..ec316f3c33 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -6421,9 +6421,7 @@ static ivas_error renderActiveInputsMasa( int16_t i; input_masa *pCurrentInput; ivas_error error; -#ifdef FIX_541_EXT_REND_MASA_ROTATIONS int16_t sf_idx; -#endif for ( i = 0, pCurrentInput = hIvasRend->inputsMasa; i < RENDERER_MAX_MASA_INPUTS; ++i, ++pCurrentInput ) { @@ -6433,7 +6431,6 @@ static ivas_error renderActiveInputsMasa( continue; } -#ifdef FIX_541_EXT_REND_MASA_ROTATIONS if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL && pCurrentInput->decDummy->hHeadTrackData != NULL ) { for ( sf_idx = 0; sf_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; ++sf_idx ) @@ -6442,7 +6439,6 @@ static ivas_error renderActiveInputsMasa( pCurrentInput->decDummy->hHeadTrackData->Pos[sf_idx] = hIvasRend->headRotData.Pos[sf_idx]; } } -#endif if ( ( error = renderInputMasa( pCurrentInput, hIvasRend->outputConfig, outAudio ) ) != IVAS_ERR_OK ) { -- GitLab From ebf14656010a5e7cac6108e01825fd4d0a839615 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 18:02:05 +0200 Subject: [PATCH 366/381] [cleanup] accept MASA_PREREND --- apps/renderer.c | 32 -------------- lib_com/options.h | 1 - lib_rend/ivas_dirac_ana.c | 2 - lib_rend/ivas_masa_merge.c | 2 - lib_rend/ivas_mcmasa_ana.c | 2 - lib_rend/ivas_omasa_ana.c | 2 - lib_rend/ivas_prot_rend.h | 2 - lib_rend/ivas_stat_rend.h | 4 -- lib_rend/lib_rend.c | 86 -------------------------------------- lib_rend/lib_rend.h | 4 -- 10 files changed, 137 deletions(-) diff --git a/apps/renderer.c b/apps/renderer.c index c5fb0421b1..9ce272926b 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -47,9 +47,7 @@ #include "ism_file_reader.h" #include "ls_custom_file_reader.h" #include "masa_file_reader.h" -#ifdef MASA_PREREND #include "masa_file_writer.h" -#endif #include "prot.h" #include "render_config_reader.h" #include "wmc_auto.h" @@ -444,9 +442,7 @@ static int16_t getTotalNumInChannels( fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); exit( -1 ); } -#ifdef MASA_PREREND IVAS_REND_GetNumAllObjects( hIvasRend, &numInputChannels ); /* In case of MASA output, modify the numInputChannels to contain all objects. Otherwise, keep the original value. */ -#endif totalNumInChannels += numInputChannels; } @@ -568,9 +564,7 @@ int main( LfeRoutingConfig *lfeRoutingConfigs[RENDERER_MAX_MC_INPUTS]; RenderConfigReader *renderConfigReader = NULL; MasaFileReader *masaReaders[RENDERER_MAX_MASA_INPUTS]; -#ifdef MASA_PREREND MasaFileWriter *masaWriter = NULL; -#endif IVAS_MASA_METADATA_HANDLE hMasaMetadata[RENDERER_MAX_MASA_INPUTS]; char audioFilePath[FILENAME_MAX]; AudioFileReader *audioReader = NULL; @@ -703,7 +697,6 @@ int main( setupWithSingleFormatInput( args, audioFilePath, positionProvider, masaReaders ); } -#ifdef MASA_PREREND /* Check that there is allowed configuration for MASA format output */ if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { @@ -721,7 +714,6 @@ int main( exit( -1 ); } } -#endif if ( AudioFileReader_open( &audioReader, audioFilePath ) != IVAS_ERR_OK ) { @@ -844,7 +836,6 @@ int main( } } -#ifdef MASA_PREREND /* Set up MASA writer for MASA output */ if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { @@ -861,7 +852,6 @@ int main( { IVAS_REND_SetTotalNumberOfObjects( hIvasRend, args.inConfig.numAudioObjects ); } -#endif IVAS_REND_LfePanMtx lfePanMatrix; @@ -968,13 +958,11 @@ int main( exit( -1 ); } -#ifdef MASA_PREREND /* With MASA output, all objects are handled at once, so add only one input having all objects in it */ if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { break; } -#endif } for ( i = 0; i < args.inConfig.numAmbisonicsBuses; ++i ) @@ -1201,7 +1189,6 @@ int main( for ( i = 0; i < args.inConfig.numAudioObjects; ++i ) { -#ifdef MASA_PREREND if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { if ( i == 0 ) @@ -1237,21 +1224,6 @@ int main( exit( -1 ); } } -#else - 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 ) - { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); - } - - if ( ( error = IVAS_REND_FeedInputObjectMetadata( hIvasRend, ismIds[i], mtdBuffer.positions[i] ) ) != IVAS_ERR_OK ) - { - fprintf( stderr, "Error: %s\n", ivas_error_to_string( error ) ); - exit( -1 ); - } -#endif } for ( i = 0; i < args.inConfig.numAmbisonicsBuses; ++i ) @@ -1343,7 +1315,6 @@ int main( delayNumSamples -= (int16_t) outBufferSize; } -#ifdef MASA_PREREND /* Write MASA metadata for MASA outputs */ if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { @@ -1417,7 +1388,6 @@ int main( fprintf( stderr, "\nError writing MASA metadata to file: %s\n", MasaFileWriter_getFilePath( masaWriter ) ); } } -#endif frame++; if ( !args.quietModeEnabled ) @@ -1471,9 +1441,7 @@ int main( { LfeRoutingConfig_close( lfeRoutingConfigs[i] ); } -#ifdef MASA_PREREND MasaFileWriter_close( &masaWriter ); -#endif AudioFileReader_close( &audioReader ); AudioFileWriter_close( &audioWriter ); RotationFileReader_close( &headRotReader ); diff --git a/lib_com/options.h b/lib_com/options.h index 9e5a0a9e35..b2b8fc1c26 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -155,7 +155,6 @@ -#define MASA_PREREND /* Nokia: Contribution 42: Support for IVAS_rend to merge MASA + other format to MASA */ #define FIX_383_CLEAN_UP /* Dlb : Clean up of unused functions */ #define ISM_25k6_HZ_CORE /* VA: issue 540: 1ISM 48 kbps - change ACELP/TCX 16 kHz core to TCX only 25.6 kHz core */ diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index 3a749570cf..71d3c924a0 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -43,7 +43,6 @@ #endif #include "wmc_auto.h" -#ifdef MASA_PREREND /*------------------------------------------------------------------------- * Local function prototypes @@ -403,4 +402,3 @@ static void ivas_dirac_dmx( return; } -#endif /* MASA_PREREND */ diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c index 6837274694..5bca5a1754 100644 --- a/lib_rend/ivas_masa_merge.c +++ b/lib_rend/ivas_masa_merge.c @@ -39,7 +39,6 @@ the United Nations Convention on Contracts on the International Sales of Goods. #include "prot.h" #include "wmc_auto.h" -#ifdef MASA_PREREND static void copy_masa_meta_tile( @@ -359,4 +358,3 @@ void masaPrerendClose( return; } -#endif /* MASA_PREREND */ diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index bc99d810f9..233c0b4459 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -45,7 +45,6 @@ #endif #include "wmc_auto.h" -#ifdef MASA_PREREND /*------------------------------------------------------------------------- @@ -1113,4 +1112,3 @@ void ivas_create_masa_out_meta( return; } -#endif /* MASA_PREREND */ diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index 28a3af9133..5013fff9d6 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -44,7 +44,6 @@ #endif #include "wmc_auto.h" -#ifdef MASA_PREREND /*------------------------------------------------------------------------- @@ -583,4 +582,3 @@ void computeReferencePower_ana( return; } -#endif /* MASA_PREREND */ diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 17732ff62c..0dd2723eba 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -961,7 +961,6 @@ ivas_error ivas_orient_trk_Process( IVAS_QUATERNION *pTrkRot /* o : tracked rotation */ ); -#ifdef MASA_PREREND /*----------------------------------------------------------------------------------* * Rendering & merging to MASA format *----------------------------------------------------------------------------------*/ @@ -1069,7 +1068,6 @@ ivas_error masaPrerendOpen( void masaPrerendClose( MASA_PREREND_HANDLE *hMasaPrerendPtr /* i/o: prerenderer handle to be closed */ ); -#endif /* clang-format on */ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 0e7f24c4cb..675740678c 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -37,9 +37,7 @@ #include "options.h" #include "ivas_cnst.h" #include "ivas_stat_com.h" // note: needed for DIRAC_DEC_BIN_HANDLE until #156 is solved -#ifdef MASA_PREREND #include "stat_com.h" /* Note: Currently needed for CLDFB. */ -#endif #include "common_api_types.h" @@ -883,7 +881,6 @@ typedef enum CHANNEL_TYPE_LFE } ChannelType; -#ifdef MASA_PREREND /*----------------------------------------------------------------------------------* * Multichannel MASA (McMASA) analysis structure *----------------------------------------------------------------------------------*/ @@ -1009,6 +1006,5 @@ typedef struct ivas_masa_prerend_data_structure float energy[MAX_PARAM_SPATIAL_SUBFRAMES][MASA_FREQUENCY_BANDS]; } MASA_PREREND_DATA, *MASA_PREREND_HANDLE; -#endif #endif /* IVAS_STAT_REND_H */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index ec316f3c33..585e3a47df 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -121,10 +121,8 @@ typedef struct rotation_matrix rot_mat_prev; int16_t nonDiegeticPan; float nonDiegeticPanGain; -#ifdef MASA_PREREND OMASA_ANA_HANDLE hOMasa; uint16_t total_num_objects; -#endif } input_ism; typedef struct @@ -154,9 +152,7 @@ typedef struct int16_t nonDiegeticPan; float nonDiegeticPanGain; lfe_routing lfeRouting; -#ifdef MASA_PREREND MCMASA_ANA_HANDLE hMcMasa; -#endif } input_mc; typedef struct @@ -165,9 +161,7 @@ typedef struct pan_matrix hoaDecMtx; CREND_WRAPPER_HANDLE crendWrapper; rotation_gains rot_gains_prev; -#ifdef MASA_PREREND DIRAC_ANA_HANDLE hDirAC; -#endif } input_sba; /* Due to API of some rendering methods, the renderer has to use the decoder struct. @@ -180,9 +174,7 @@ typedef struct DecoderDummy *decDummy; MASA_METADATA_FRAME masaMetadata; bool metadataHasBeenFed; -#ifdef MASA_PREREND MASA_PREREND_HANDLE hMasaPrerend; -#endif } input_masa; struct IVAS_REND @@ -466,10 +458,8 @@ static ivas_error validateOutputAudioConfig( #else case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#ifdef MASA_PREREND case IVAS_REND_AUDIO_CONFIG_MASA1: case IVAS_REND_AUDIO_CONFIG_MASA2: -#endif #endif return IVAS_ERR_OK; default: @@ -1132,7 +1122,6 @@ static bool isIoConfigPairSupported( return true; } -#ifdef MASA_PREREND static ivas_error initIsmMasaRendering( input_ism *inputIsm, int32_t inSampleRate ) @@ -1154,7 +1143,6 @@ static ivas_error initIsmMasaRendering( return IVAS_ERR_OK; } -#endif static ivas_error setRendInputActiveIsm( void *input, @@ -1184,9 +1172,7 @@ static ivas_error setRendInputActiveIsm( inputIsm->hReverb = NULL; inputIsm->tdRendWrapper = defaultTdRendWrapper(); initRotMatrix( inputIsm->rot_mat_prev ); -#ifdef MASA_PREREND inputIsm->hOMasa = NULL; -#endif error = IVAS_ERR_OK; #ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG @@ -1198,7 +1184,6 @@ static ivas_error setRendInputActiveIsm( return error; } } -#ifdef MASA_PREREND else if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { if ( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) @@ -1206,7 +1191,6 @@ static ivas_error setRendInputActiveIsm( return error; } } -#endif // MASA_PREREND else { if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) @@ -1252,7 +1236,6 @@ static ivas_error setRendInputActiveIsm( } } } -#ifdef MASA_PREREND else if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { if ( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) @@ -1260,7 +1243,6 @@ static ivas_error setRendInputActiveIsm( return error; } } -#endif // MASA_PREREND #endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG @@ -1288,9 +1270,7 @@ static void clearInputIsm( inputIsm->tdRendWrapper.hHrtfTD = NULL; } -#ifdef MASA_PREREND ivas_omasa_ana_close( &( inputIsm->hOMasa ) ); -#endif return; } @@ -1895,10 +1875,8 @@ static ivas_error updateMcPanGains( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; -#ifdef MASA_PREREND case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: break; /* Do nothing */ -#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -2014,7 +1992,6 @@ static ivas_error initMcBinauralRendering( return IVAS_ERR_OK; } -#ifdef MASA_PREREND static ivas_error initMcMasaRendering( input_mc *inputMc, const IVAS_REND_AudioConfig inConfig, @@ -2041,7 +2018,6 @@ static ivas_error initMcMasaRendering( return IVAS_ERR_OK; } -#endif static lfe_routing defaultLfeRouting( const IVAS_REND_AudioConfig inConfig, @@ -2127,9 +2103,7 @@ static ivas_error setRendInputActiveMc( inputMc->tdRendWrapper = defaultTdRendWrapper(); inputMc->crendWrapper = NULL; inputMc->hReverb = NULL; -#ifdef MASA_PREREND inputMc->hMcMasa = NULL; -#endif initRotGains( inputMc->rot_gains_prev ); inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); @@ -2145,7 +2119,6 @@ static ivas_error setRendInputActiveMc( } } -#ifdef MASA_PREREND if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { if ( ( error = initMcMasaRendering( inputMc, inConfig, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) @@ -2153,7 +2126,6 @@ static ivas_error setRendInputActiveMc( return error; } } -#endif if ( ( error = updateMcPanGains( inputMc, outConfig ) ) != IVAS_ERR_OK ) { @@ -2188,9 +2160,7 @@ static void clearInputMc( inputMc->tdRendWrapper.hHrtfTD = NULL; } -#ifdef MASA_PREREND ivas_mcmasa_ana_close( &( inputMc->hMcMasa ) ); -#endif return; } @@ -2339,11 +2309,9 @@ static ivas_error updateSbaPanGains( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; -#ifdef MASA_PREREND case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: error = IVAS_ERR_OK; break; /* Do nothing */ -#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -2356,7 +2324,6 @@ static ivas_error updateSbaPanGains( return IVAS_ERR_OK; } -#ifdef MASA_PREREND static ivas_error initSbaMasaRendering( input_sba *inputSba, int32_t inSampleRate ) @@ -2372,7 +2339,6 @@ static ivas_error initSbaMasaRendering( return IVAS_ERR_OK; } -#endif static ivas_error setRendInputActiveSba( void *input, @@ -2397,12 +2363,9 @@ static ivas_error setRendInputActiveSba( initRendInputBase( &inputSba->base, inConfig, id, rendCtx ); setZeroPanMatrix( inputSba->hoaDecMtx ); inputSba->crendWrapper = NULL; -#ifdef MASA_PREREND inputSba->hDirAC = NULL; -#endif initRotGains( inputSba->rot_gains_prev ); -#ifdef MASA_PREREND if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) { if ( ( error = initSbaMasaRendering( inputSba, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) @@ -2410,7 +2373,6 @@ static ivas_error setRendInputActiveSba( return error; } } -#endif if ( ( error = updateSbaPanGains( inputSba, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) { @@ -2432,9 +2394,7 @@ static void clearInputSba( /* Free input's internal handles */ ivas_rend_closeCrend( &inputSba->crendWrapper ); -#ifdef MASA_PREREND ivas_dirac_ana_close( &( inputSba->hDirAC ) ); -#endif return; } @@ -2824,7 +2784,6 @@ static ivas_error setRendInputActiveMasa( { return error; } -#ifdef MASA_PREREND if ( getAudioConfigType( outConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) { inputMasa->metadataHasBeenFed = false; @@ -2843,15 +2802,6 @@ static ivas_error setRendInputActiveMasa( return error; } } -#else - inputMasa->decDummy = initDecoderDummy( *rendCtx.pOutSampleRate, numInChannels, outConfig, 0 ); - inputMasa->metadataHasBeenFed = false; - - if ( ( error = updateMasaDummyDec( inputMasa, outConfig ) ) != IVAS_ERR_OK ) - { - return error; - } -#endif return IVAS_ERR_OK; } @@ -2944,9 +2894,7 @@ static void clearInputMasa( rendCtx = inputMasa->base.ctx; -#ifdef MASA_PREREND masaPrerendClose( &inputMasa->hMasaPrerend ); -#endif initRendInputBase( &inputMasa->base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, rendCtx ); freeDecoderDummy( &inputMasa->decDummy ); @@ -3042,9 +2990,7 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsIsm[i].tdRendWrapper.hBinRendererTd = NULL; hIvasRend->inputsIsm[i].nonDiegeticPan = nonDiegeticPan; hIvasRend->inputsIsm[i].nonDiegeticPanGain = nonDiegeticPanGain; -#ifdef MASA_PREREND hIvasRend->inputsIsm[i].hOMasa = NULL; -#endif } for ( i = 0; i < RENDERER_MAX_MC_INPUTS; ++i ) @@ -3056,18 +3002,14 @@ ivas_error IVAS_REND_Open( hIvasRend->inputsMc[i].tdRendWrapper.hBinRendererTd = NULL; hIvasRend->inputsMc[i].nonDiegeticPan = nonDiegeticPan; hIvasRend->inputsMc[i].nonDiegeticPanGain = nonDiegeticPanGain; -#ifdef MASA_PREREND hIvasRend->inputsMc[i].hMcMasa = NULL; -#endif } for ( i = 0; i < RENDERER_MAX_SBA_INPUTS; ++i ) { initRendInputBase( &hIvasRend->inputsSba[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); hIvasRend->inputsSba[i].crendWrapper = NULL; -#ifdef MASA_PREREND hIvasRend->inputsSba[i].hDirAC = NULL; -#endif } for ( i = 0; i < RENDERER_MAX_MASA_INPUTS; ++i ) @@ -3075,9 +3017,7 @@ ivas_error IVAS_REND_Open( initRendInputBase( &hIvasRend->inputsMasa[i].base, IVAS_REND_AUDIO_CONFIG_UNKNOWN, 0, getRendCtx( hIvasRend ) ); hIvasRend->inputsMasa[i].decDummy = NULL; hIvasRend->inputsMasa[i].metadataHasBeenFed = false; -#ifdef MASA_PREREND hIvasRend->inputsMasa[i].hMasaPrerend = NULL; -#endif } return IVAS_ERR_OK; @@ -3791,7 +3731,6 @@ ivas_error IVAS_REND_GetInputNumChannels( } -#ifdef MASA_PREREND /*-------------------------------------------------------------------* * IVAS_REND_GetNumAllObjects() * @@ -3815,7 +3754,6 @@ ivas_error IVAS_REND_GetNumAllObjects( return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* @@ -3940,12 +3878,10 @@ ivas_error IVAS_REND_FeedInputAudio( { return error; } -#ifdef MASA_PREREND if ( ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) && inputBase->inConfig == IVAS_REND_AUDIO_CONFIG_OBJECT ) { numInputChannels = (int16_t) hIvasRend->inputsIsm[0].total_num_objects; } -#endif if ( numInputChannels != inputAudio.config.numChannels ) { @@ -4003,7 +3939,6 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( } -#ifdef MASA_PREREND /*-------------------------------------------------------------------* * IVAS_REND_FeedInputObjectMetadata() * @@ -4028,7 +3963,6 @@ ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* @@ -5191,7 +5125,6 @@ static ivas_error renderIsmToSba( return error; } -#ifdef MASA_PREREND static ivas_error renderIsmToMasa( input_ism *ismInput, IVAS_REND_AudioBuffer outAudio ) @@ -5208,7 +5141,6 @@ static ivas_error renderIsmToMasa( return IVAS_ERR_OK; } -#endif static ivas_error renderInputIsm( input_ism *ismInput, @@ -5260,11 +5192,9 @@ static ivas_error renderInputIsm( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; -#ifdef MASA_PREREND case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: error = renderIsmToMasa( ismInput, outAudio ); break; -#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -5689,7 +5619,6 @@ static void renderMcToSba( return; } -#ifdef MASA_PREREND static ivas_error renderMcToMasa( input_mc *mcInput, IVAS_REND_AudioBuffer outAudio ) @@ -5706,7 +5635,6 @@ static ivas_error renderMcToMasa( return IVAS_ERR_OK; } -#endif static ivas_error renderInputMc( input_mc *mcInput, @@ -5766,11 +5694,9 @@ static ivas_error renderInputMc( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; -#ifdef MASA_PREREND case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: renderMcToMasa( mcInput, outAudio ); break; -#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -6015,7 +5941,6 @@ static ivas_error renderSbaToBinauralRoom( return IVAS_ERR_OK; } -#ifdef MASA_PREREND static ivas_error renderSbaToMasa( input_sba *sbaInput, IVAS_REND_AudioBuffer outAudio ) @@ -6032,7 +5957,6 @@ static ivas_error renderSbaToMasa( return IVAS_ERR_OK; } -#endif static ivas_error renderInputSba( input_sba *sbaInput, @@ -6085,11 +6009,9 @@ static ivas_error renderInputSba( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; -#ifdef MASA_PREREND case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: renderSbaToMasa( sbaInput, outAudio ); break; -#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -6218,7 +6140,6 @@ static void renderMasaToBinaural( return; } -#ifdef MASA_PREREND static void renderMasaToMasa( input_masa *masaInput, IVAS_REND_AudioBuffer outAudio ) @@ -6346,7 +6267,6 @@ static void renderMasaToMasa( return; } -#endif static ivas_error renderInputMasa( input_masa *masaInput, @@ -6402,11 +6322,9 @@ static ivas_error renderInputMasa( return IVAS_ERR_INVALID_OUTPUT_FORMAT; } break; -#ifdef MASA_PREREND case IVAS_REND_AUDIO_CONFIG_TYPE_MASA: renderMasaToMasa( masaInput, outAudio ); break; -#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -6450,7 +6368,6 @@ static ivas_error renderActiveInputsMasa( } -#ifdef MASA_PREREND /*---------------------------------------------------------------------* * IVAS_REND_GetMasaMetadata( ) * @@ -6593,7 +6510,6 @@ ivas_error IVAS_REND_SetTotalNumberOfObjects( return IVAS_ERR_OK; } -#endif /*-------------------------------------------------------------------* @@ -6633,7 +6549,6 @@ ivas_error IVAS_REND_GetSamples( return IVAS_ERR_INVALID_BUFFER_SIZE; } -#ifdef MASA_PREREND /* Check that there is allowed configuration for MASA format output */ if ( getAudioConfigType( hIvasRend->outputConfig ) == IVAS_REND_AUDIO_CONFIG_TYPE_MASA ) { @@ -6664,7 +6579,6 @@ ivas_error IVAS_REND_GetSamples( return IVAS_ERR_IO_CONFIG_PAIR_NOT_SUPPORTED; } } -#endif if ( ( error = IVAS_REND_NumOutChannels( hIvasRend, &numOutChannels ) ) != IVAS_ERR_OK ) { diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index c9da572b61..5f90810862 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -223,13 +223,11 @@ ivas_error IVAS_REND_FeedInputObjectMetadata( const IVAS_REND_AudioObjectPosition objectPosition /* i : object position struct */ ); -#ifdef MASA_PREREND ivas_error IVAS_REND_FeedInputObjectMetadataToOMasa( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ const int16_t inputIndex, /* i : Index of the input */ const IVAS_REND_AudioObjectPosition objectPosition /* i : object position struct */ ); -#endif ivas_error IVAS_REND_FeedInputMasaMetadata( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ @@ -302,7 +300,6 @@ ivas_error IVAS_REND_GetCombinedOrientation( IVAS_QUATERNION *pRotation /* i/o: Quaternion pointer processed orientation */ ); -#ifdef MASA_PREREND ivas_error IVAS_REND_GetMasaMetadata( IVAS_REND_HANDLE hIvasRend, /* i/o: IVAS renderer handle */ MASA_DECODER_EXT_OUT_META_HANDLE *hMasaExtOutMeta, /* o : pointer to handle, which will be set to point to analyzed MASA metadata */ @@ -325,7 +322,6 @@ ivas_error IVAS_REND_GetNumAllObjects( IVAS_REND_CONST_HANDLE hIvasRend, /* i : Renderer handle */ int16_t *numChannels /* o : number of all objects */ ); -#endif ivas_error IVAS_REND_GetSamples( IVAS_REND_HANDLE hIvasRend, /* i/o: Renderer handle */ -- GitLab From 5e9a42964a3bca582d666d808ee30d6deaf4ed2e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 18:05:34 +0200 Subject: [PATCH 367/381] [cleanup] accept ISM_25k6_HZ_CORE --- lib_com/core_com_config.c | 13 ------------- lib_com/ivas_cnst.h | 2 -- lib_com/options.h | 1 - lib_com/prot.h | 4 ---- lib_dec/core_dec_init.c | 4 ---- lib_dec/core_dec_switch.c | 2 -- lib_dec/evs_dec.c | 2 -- lib_dec/init_dec.c | 3 --- lib_dec/ivas_cpe_dec.c | 2 -- lib_dec/ivas_sce_dec.c | 2 -- lib_dec/ivas_tcx_core_dec.c | 4 ---- lib_enc/core_enc_init.c | 4 ---- lib_enc/core_enc_switch.c | 6 ------ lib_enc/init_enc.c | 2 -- lib_enc/ivas_core_pre_proc.c | 4 ---- lib_enc/ivas_cpe_enc.c | 2 -- lib_enc/ivas_decision_matrix_enc.c | 6 ------ lib_enc/ivas_tcx_core_enc.c | 2 -- lib_enc/pre_proc.c | 2 -- lib_enc/stat_enc.h | 2 -- lib_enc/updt_enc.c | 2 -- 21 files changed, 71 deletions(-) diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index 20f5032e14..2dc7a0178a 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -166,10 +166,8 @@ int16_t getTcxonly( const int16_t element_mode, /* i : IVAS element mode */ const int32_t total_brate, /* i : total bitrate */ const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ -#ifdef ISM_25k6_HZ_CORE , const int16_t is_ism_format -#endif ) { int16_t tcxonly = 0; @@ -183,7 +181,6 @@ int16_t getTcxonly( } break; case IVAS_SCE: -#ifdef ISM_25k6_HZ_CORE if ( is_ism_format ) { if ( total_brate > MAX_ACELP_BRATE_ISM ) @@ -200,7 +197,6 @@ int16_t getTcxonly( } break; -#endif case IVAS_CPE_DFT: case IVAS_CPE_TD: if ( total_brate > MAX_ACELP_BRATE ) @@ -363,10 +359,8 @@ int32_t getCoreSamplerateMode2( const int16_t bwidth, /* i : audio bandwidth */ const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ const int16_t rf_mode /* i : flag to signal the RF mode */ -#ifdef ISM_25k6_HZ_CORE , const IVAS_FORMAT is_ism_format /* i : flag indicating ISM format */ -#endif ) { int32_t sr_core = 0; @@ -387,7 +381,6 @@ int32_t getCoreSamplerateMode2( { sr_core = INT_FS_16k; } -#ifdef ISM_25k6_HZ_CORE else if ( ( bwidth == SWB || bwidth == FB ) && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && !is_ism_format ) { sr_core = INT_FS_16k; @@ -400,12 +393,6 @@ int32_t getCoreSamplerateMode2( { sr_core = 25600; } -#else - else if ( ( bwidth == SWB && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE ) || ( bwidth == FB && total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE ) ) - { - sr_core = INT_FS_16k; - } -#endif else if ( ( ( bwidth == SWB || bwidth == FB ) && element_mode == EVS_MONO && total_brate <= HQ_64k ) || ( element_mode > IVAS_SCE && ( ( bwidth == SWB && total_brate <= IVAS_96k ) || ( bwidth == FB && total_brate <= IVAS_96k ) ) ) ) { sr_core = 25600; diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 32c89d68b7..09a9f53d71 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -290,9 +290,7 @@ typedef enum #define MAX_VOICED_BRATE ACELP_13k20 /* max. per channel bitrate where VOICED is supported */ #define MIN_TC_BRATE 6450 /* min. per channel bitrate where TRANSITION is supported */ #define MAX_ACELP_BRATE 48000 /* max. per channel bitrate where ACELP core is supported */ -#ifdef ISM_25k6_HZ_CORE #define MAX_ACELP_BRATE_ISM 40000 /* max. per channel bitrate where ACELP core is supported in ISM format */ -#endif #define ACELP_12k8_HIGH_LIMIT 24350 /* max. per channel bitrate where the ACELP@12.8kHz is supported */ #define ACELP_16k_LOW_LIMIT 13250 /* min. per channel bitrate where the ACELP@16kHz is supported */ diff --git a/lib_com/options.h b/lib_com/options.h index b2b8fc1c26..b669bc74e7 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,7 +156,6 @@ #define FIX_383_CLEAN_UP /* Dlb : Clean up of unused functions */ -#define ISM_25k6_HZ_CORE /* VA: issue 540: 1ISM 48 kbps - change ACELP/TCX 16 kHz core to TCX only 25.6 kHz core */ #define FIX_528_ISM_MD_FILE_TOO_SHORT /* VA: issue 528: ISM Metadata file too short */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 39b2f6372e..140c970367 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -9766,10 +9766,8 @@ int16_t getTcxonly( const int16_t element_mode, /* i : IVAS element mode */ const int32_t total_brate, /* i : total bitrate */ const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ -#ifdef ISM_25k6_HZ_CORE , const int16_t is_ism_format -#endif ); int16_t getTnsAllowed( @@ -9807,10 +9805,8 @@ int32_t getCoreSamplerateMode2( const int16_t bwidth, /* i : audio bandwidth */ const int16_t flag_ACELP16k, /* i : ACELP@16kHz flag */ const int16_t rf_mode /* i : flag to signal the RF mode */ -#ifdef ISM_25k6_HZ_CORE , const IVAS_FORMAT is_ism_format /* i : flag indicating ISM format */ -#endif ); float getTcxBandwidth( diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index d54ffe330e..a8b7a08150 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -75,10 +75,8 @@ void open_decoder_LPD( } st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); st->fscale = sr2fscale( st->sr_core ); fscaleFB = sr2fscale( st->output_Fs ); @@ -99,10 +97,8 @@ void open_decoder_LPD( } st->tcxonly = getTcxonly( st->element_mode, total_brate, MCT_flag -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); /* the TD TCX PLC in MODE1 still runs with 80ms subframes */ diff --git a/lib_dec/core_dec_switch.c b/lib_dec/core_dec_switch.c index 3a5f163343..01061f4774 100644 --- a/lib_dec/core_dec_switch.c +++ b/lib_dec/core_dec_switch.c @@ -73,10 +73,8 @@ void mode_switch_decoder_LPD( bSwitchFromAmrwbIO = 1; } sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); fscale = sr2fscale( sr_core ); diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 1be8873271..4767fa6ed2 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -184,10 +184,8 @@ ivas_error evs_dec( /* if previous frame was HQ Core/TCX10/TCX20 (high bitrate), drop partial copy info and continue HQ Core/TCX10/TCX20 concealment */ if ( st->use_partial_copy && ( st->last_core == HQ_CORE || st->last_core == TCX_10_CORE || ( st->last_core == TCX_20_CORE && getTcxonly( EVS_MONO, st->last_total_brate, 0 -#ifdef ISM_25k6_HZ_CORE , 0 -#endif ) ) ) ) { st->bfi = 1; diff --git a/lib_dec/init_dec.c b/lib_dec/init_dec.c index 23656c924e..a094710f06 100644 --- a/lib_dec/init_dec.c +++ b/lib_dec/init_dec.c @@ -732,9 +732,6 @@ ivas_error init_decoder( st->cna_dirac_flag = 0; st->cng_sba_flag = 0; st->cng_ism_flag = 0; -#ifndef ISM_25k6_HZ_CORE - st->is_ism_format = 0; -#endif return error; } diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index f5d7ca746c..a2683860df 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -688,9 +688,7 @@ ivas_error create_cpe_dec( st->total_brate = hCPE->element_brate / ( CPE_CHANNELS ); /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifdef ISM_25k6_HZ_CORE st->is_ism_format = 0; -#endif if ( ( error = init_decoder( st, n, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 37a283e451..e1472d2a37 100755 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -354,13 +354,11 @@ ivas_error create_sce_dec( st->total_brate = hSCE->element_brate; /* dummy initialization for getting right pointers initialization of input buffers in init_coder_ace_plus() */ st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; -#ifdef ISM_25k6_HZ_CORE st->is_ism_format = 0; if ( st_ivas->ivas_format == ISM_FORMAT ) { st->is_ism_format = 1; } -#endif if ( ( error = init_decoder( st, 0, st_ivas->mc_mode ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index d2d327fd6c..63990a46e0 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -74,10 +74,8 @@ void stereo_tcx_init_dec( /*sampling rate*/ st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_flag -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); st->fscale = sr2fscale( st->sr_core ); @@ -113,10 +111,8 @@ void stereo_tcx_init_dec( if ( st->element_mode == IVAS_SCE ) { st->tcxonly = getTcxonly( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, MCT_flag -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); /* LPC quantization */ diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c index 65190ce992..b7081f31b3 100644 --- a/lib_enc/core_enc_init.c +++ b/lib_enc/core_enc_init.c @@ -73,18 +73,14 @@ void init_coder_ace_plus( /* Bitrate */ st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); /* Core Sampling Rate */ st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); st->fscale = sr2fscale( st->sr_core ); diff --git a/lib_enc/core_enc_switch.c b/lib_enc/core_enc_switch.c index 4ccf86eb21..b43f046cd6 100644 --- a/lib_enc/core_enc_switch.c +++ b/lib_enc/core_enc_switch.c @@ -70,10 +70,8 @@ void core_coder_mode_switch( /* force active frame for the first frame when switching from high bitrates when DTX is enabled*/ sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); fscale = sr2fscale( sr_core ); @@ -85,10 +83,8 @@ void core_coder_mode_switch( } tcxonly_tmp = getTcxonly( st->element_mode, st->total_brate, MCT_flag -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); if ( tcxonly_tmp != st->tcxonly ) @@ -102,10 +98,8 @@ void core_coder_mode_switch( st->L_frame = (int16_t) ( sr_core / FRAMES_PER_SEC ); st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); st->bits_frame_nominal = (int16_t) ( (float) st->L_frame / (float) st->fscale * (float) FSCALE_DENOM / 128.0f * (float) st->total_brate / 100.0f + 0.49f ); diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 9e9a7ca4b2..73bb369232 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -105,13 +105,11 @@ ivas_error init_encoder( st->flag_ACELP16k = set_ACELP_flag( st->element_mode, st->total_brate, st->total_brate, idchan, 0, -1, -1 ); -#ifdef ISM_25k6_HZ_CORE st->is_ism_format = 0; if ( ism_mode != ISM_MODE_NONE ) { st->is_ism_format = 1; } -#endif /*-----------------------------------------------------------------* * Bitstream diff --git a/lib_enc/ivas_core_pre_proc.c b/lib_enc/ivas_core_pre_proc.c index b6f86bb887..f6c473a11a 100644 --- a/lib_enc/ivas_core_pre_proc.c +++ b/lib_enc/ivas_core_pre_proc.c @@ -129,12 +129,10 @@ ivas_error pre_proc_ivas( { st->L_frame = L_FRAME32k; } -#ifdef ISM_25k6_HZ_CORE else if ( st->bwidth >= SWB && st->total_brate > MAX_ACELP_BRATE_ISM && st->total_brate <= MAX_ACELP_BRATE && element_mode == IVAS_SCE && st->is_ism_format && st->tcxonly ) { st->L_frame = L_FRAME25_6k; } -#endif else if ( st->flag_ACELP16k ) { st->L_frame = L_FRAME16k; @@ -244,10 +242,8 @@ ivas_error pre_proc_ivas( SetModeIndex( st, st->last_bits_frame_nominal * FRAMES_PER_SEC, last_element_mode, MCT_flag ); st->sr_core = getCoreSamplerateMode2( element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); st->total_brate = total_brate_tmp; diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 8b9e8e42c7..739e7369b2 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -389,10 +389,8 @@ ivas_error ivas_cpe_enc( int32_t internal_Fs; internal_Fs = getTcxonly( IVAS_CPE_MDCT, sts[0]->bits_frame_nominal * FRAMES_PER_SEC, 0 -#ifdef ISM_25k6_HZ_CORE , sts[0]->is_ism_format -#endif ) == 0 ? INT_FS_16k : max( INT_FS_16k, sts[0]->sr_core ); diff --git a/lib_enc/ivas_decision_matrix_enc.c b/lib_enc/ivas_decision_matrix_enc.c index a8a220641d..8f3a9de2f1 100644 --- a/lib_enc/ivas_decision_matrix_enc.c +++ b/lib_enc/ivas_decision_matrix_enc.c @@ -170,12 +170,10 @@ void ivas_decision_matrix_enc( st->core = ACELP_CORE; st->coder_type = AUDIO; st->sp_aud_decision2 = 0; -#ifdef ISM_25k6_HZ_CORE if ( st->low_rate_mode ) { st->coder_type = INACTIVE; } -#endif } } @@ -185,12 +183,10 @@ void ivas_decision_matrix_enc( st->core = ACELP_CORE; } -#ifdef ISM_25k6_HZ_CORE if ( st->is_ism_format && st->tcxonly ) { st->core = TCX_20_CORE; } -#endif #ifdef DEBUGGING if ( st->idchan == 0 ) @@ -231,12 +227,10 @@ void ivas_decision_matrix_enc( st->coder_type = AUDIO; st->sp_aud_decision2 = 0; -#ifdef ISM_25k6_HZ_CORE if ( st->low_rate_mode ) { st->coder_type = INACTIVE; } -#endif } } #endif diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index c5192f0393..644cfb9155 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -80,10 +80,8 @@ void stereo_tcx_init_enc( /*sampling rate*/ st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_mode -#ifdef ISM_25k6_HZ_CORE , st->is_ism_format -#endif ); st->fscale = sr2fscale( st->sr_core ); diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c index e3f672c101..d56387d3ff 100644 --- a/lib_enc/pre_proc.c +++ b/lib_enc/pre_proc.c @@ -601,10 +601,8 @@ void pre_proc( { SetModeIndex( st, st->last_total_brate, EVS_MONO, 0 ); st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode -#ifdef ISM_25k6_HZ_CORE , 0 -#endif ); st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); st->encoderLookahead_enc = NS2SA( st->sr_core, ACELP_LOOK_NS ); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 3d46544937..69877d91ac 100755 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -1569,9 +1569,7 @@ typedef struct enc_core_structure /* MCT Channel mode indication: LFE, ignore channel? */ MCT_CHAN_MODE mct_chan_mode; -#ifdef ISM_25k6_HZ_CORE int16_t is_ism_format; /* Indication whether the codec operates in ISM format */ -#endif int16_t dtx_sce_sba; /* enable use of FD CNG with transform domain cores in SCE SBA */ diff --git a/lib_enc/updt_enc.c b/lib_enc/updt_enc.c index ecfd51b659..c27bb3043a 100644 --- a/lib_enc/updt_enc.c +++ b/lib_enc/updt_enc.c @@ -394,10 +394,8 @@ void updt_enc_common( st->codec_mode = MODE2; st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode -#ifdef ISM_25k6_HZ_CORE , 0 -#endif ); st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); -- GitLab From 1891189cb56d8aebc41d970e4938636f094bf202 Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 18:06:23 +0200 Subject: [PATCH 368/381] [cleanup] accept FIX_528_ISM_MD_FILE_TOO_SHORT --- lib_com/options.h | 1 - lib_util/ism_file_reader.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index b669bc74e7..9ed2b81361 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,7 +157,6 @@ #define FIX_383_CLEAN_UP /* Dlb : Clean up of unused functions */ -#define FIX_528_ISM_MD_FILE_TOO_SHORT /* VA: issue 528: ISM Metadata file too short */ #define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: improve MD coding in ISM inactive frames */ diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index a898651362..da47911d4c 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -113,12 +113,10 @@ ivas_error IsmFileReader_readNextFrame( file = self->file; -#ifdef FIX_528_ISM_MD_FILE_TOO_SHORT while ( feof( self->file ) ) { rewind( self->file ); } -#endif if ( fgets( char_buff, META_LINE_LENGTH, file ) == NULL ) { -- GitLab From 2246d80d4669ea6c03f8407cf9ff4b393c7b262e Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 18:07:15 +0200 Subject: [PATCH 369/381] [cleanup] accept FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG --- apps/decoder.c | 43 ------- apps/renderer.c | 55 --------- lib_com/common_api_types.h | 4 - lib_com/ivas_cnst.h | 5 - lib_com/options.h | 1 - lib_dec/ivas_binRenderer_internal.c | 21 ---- lib_dec/ivas_dec.c | 4 - lib_dec/ivas_init_dec.c | 24 ---- lib_dec/ivas_ism_dec.c | 8 -- lib_dec/ivas_ism_param_dec.c | 16 --- lib_dec/ivas_jbm_dec.c | 10 -- lib_dec/ivas_mct_dec.c | 12 -- lib_dec/ivas_objectRenderer_internal.c | 16 --- lib_dec/ivas_output_config.c | 16 --- lib_dec/ivas_spar_decoder.c | 4 - lib_dec/lib_dec.c | 30 ----- lib_dec/lib_dec.h | 5 - lib_rend/ivas_crend.c | 90 -------------- lib_rend/ivas_objectRenderer.c | 8 -- lib_rend/ivas_output_init.c | 10 -- lib_rend/ivas_prot_rend.h | 4 - lib_rend/ivas_render_config.c | 8 -- lib_rend/ivas_reverb.c | 8 -- lib_rend/ivas_stat_rend.h | 4 - lib_rend/lib_rend.c | 157 ------------------------- lib_rend/lib_rend.h | 5 - lib_util/render_config_reader.c | 18 --- 27 files changed, 586 deletions(-) diff --git a/apps/decoder.c b/apps/decoder.c index 504648b708..b98658eba0 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -257,11 +257,7 @@ int main( if ( arg.hrtfReaderEnabled ) { /* sanity check */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) -#else - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) -#endif { arg.hrtfReaderEnabled = false; fprintf( stderr, "\nError: HRTF binary file cannot be used in this output configuration.\n\n" ); @@ -283,11 +279,7 @@ int main( if ( arg.enableHeadRotation ) { /* sanity check */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) -#else - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) -#endif { fprintf( stderr, "\nError: Head-rotation file file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -307,11 +299,7 @@ int main( if ( arg.enableReferenceRotation ) { /* sanity check */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) -#else - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) -#endif { fprintf( stderr, "\nError: Reference rotation file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -338,11 +326,7 @@ int main( if ( arg.enableReferenceVectorTracking ) { /* sanity check */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) -#else - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) -#endif { fprintf( stderr, "\nError: Reference vector trajectory file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -395,11 +379,7 @@ int main( if ( arg.renderConfigEnabled ) { /* sanity check */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) -#else - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM ) -#endif { fprintf( stderr, "\nError: Renderer configuration file cannot be used in this output configuration.\n\n" ); goto cleanup; @@ -563,17 +543,9 @@ int main( IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB ) -#else - if ( arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL_ROOM && arg.outputFormat != IVAS_DEC_OUTPUT_BINAURAL ) -#endif { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG fprintf( stderr, "\nExternal Renderer Config is supported only for binaural output configurations. Exiting. \n\n" ); -#else - fprintf( stderr, "\nExternal Renderer Config is supported only for BINAURAL and BINAURAL_ROOM. Exiting. \n\n" ); -#endif goto cleanup; } @@ -827,7 +799,6 @@ static IVAS_DEC_AUDIO_CONFIG cmdline2config( { output_config = IVAS_DEC_OUTPUT_HOA3; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG else if ( strcmp( argv_to_upper, "BINAURAL" ) == 0 ) { output_config = IVAS_DEC_OUTPUT_BINAURAL; @@ -840,16 +811,6 @@ static IVAS_DEC_AUDIO_CONFIG cmdline2config( { output_config = IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB; } -#else - else if ( strcmp( argv_to_upper, "BINAURAL" ) == 0 ) - { - output_config = IVAS_DEC_OUTPUT_BINAURAL; - } - else if ( strcmp( argv_to_upper, "BINAURAL_ROOM" ) == 0 ) - { - output_config = IVAS_DEC_OUTPUT_BINAURAL_ROOM; - } -#endif else { output_config = IVAS_DEC_OUTPUT_LS_CUSTOM; @@ -1395,11 +1356,7 @@ static void usage_dec( void ) fprintf( stdout, "Mandatory parameters:\n" ); fprintf( stdout, "---------------------\n" ); fprintf( stdout, "OutputConf : Output configuration: MONO, STEREO, 5_1, 7_1, 5_1_2, 5_1_4, 7_1_4, FOA,\n" ); -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM_IR, BINAURAL_ROOM_REVERB, EXT\n" ); -#else - fprintf( stdout, " HOA2, HOA3, BINAURAL, BINAURAL_ROOM, EXT\n" ); -#endif fprintf( stdout, " By default, channel order and loudspeaker positions are equal to the\n" ); fprintf( stdout, " encoder. For loudspeaker outputs, OutputConf can be a custom loudspeaker\n" ); fprintf( stdout, " layout file. See readme.txt for details.\n" ); diff --git a/apps/renderer.c b/apps/renderer.c index 9ce272926b..760065be91 100644 --- a/apps/renderer.c +++ b/apps/renderer.c @@ -224,41 +224,25 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_trajFile, .match = "trajectory_file", .matchShort = "tf", -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG .description = "Head rotation trajectory file for simulation of head tracking (only for binaural outputs)", -#else - .description = "Head rotation trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", -#endif }, { .id = CmdLnOptionId_refRotFile, .match = "reference_rotation_file", .matchShort = "rf", -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG .description = "Reference rotation trajectory file for simulation of head tracking (only for binaural outputs)", -#else - .description = "Reference rotation trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", -#endif }, { .id = CmdLnOptionId_customHrtfFile, .match = "custom_hrtf", .matchShort = "hrtf", -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG .description = "Custom HRTF file for binaural rendering (only for binaural outputs)", -#else - .description = "Custom HRTF file for binaural rendering (only for BINAURAL and BINAURAL_ROOM outputs)", -#endif }, { .id = CmdLnOptionId_renderConfigFile, .match = "render_config", .matchShort = "rc", -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG .description = "Binaural renderer configuration file (only for binaural outputs)", -#else - .description = "Binaural renderer configuration file (only for BINAURAL and BINAURAL_ROOM outputs)", -#endif }, { .id = CmdLnOptionId_nonDiegeticPan, @@ -270,11 +254,7 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_orientationTracking, .match = "tracking_type", .matchShort = "otr", -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for binaural outputs)", -#else - .description = "Head orientation tracking type: 'none', 'ref', 'avg' or `ref_vec` or `ref_vec_lev` (only for BINAURAL and BINAURAL_ROOM)", -#endif }, { .id = CmdlnOptionId_lfePosition, @@ -314,11 +294,7 @@ static const CmdLnParser_Option cliOptions[] = { .id = CmdLnOptionId_referenceVectorFile, .match = "reference_vector_file", .matchShort = "rvf", -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG .description = "Reference vector trajectory file for simulation of head tracking (only for binaural outputs)", -#else - .description = "Reference vector trajectory file for simulation of head tracking (only for BINAURAL and BINAURAL_ROOM outputs)", -#endif }, { .id = CmdLnOptionId_exteriorOrientationFile, @@ -782,17 +758,9 @@ int main( IVAS_RENDER_CONFIG_DATA renderConfig; /* sanity check */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - if ( ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) && ( args.outConfig.audioConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL ) ) -#endif { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG fprintf( stderr, "\nExternal Renderer Config is only supported for binaural output configurations. Exiting. \n" ); -#else - fprintf( stderr, "\nExternal Renderer Config is supported only when BINAURAL or BINAURAL_ROOM is used as output. Exiting. \n" ); -#endif exit( -1 ); } @@ -808,12 +776,10 @@ int main( exit( -1 ); } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( args.outConfig.audioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { renderConfig.room_acoustics.override = TRUE; } -#endif if ( ( error = IVAS_REND_FeedRenderConfig( hIvasRend, renderConfig ) ) != IVAS_ERR_OK ) { @@ -1704,13 +1670,8 @@ static bool parseOrientationTracking( static IVAS_REND_AudioConfig parseAudioConfig( const char *configString ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG char charBuf[21]; charBuf[20] = '\0'; -#else - char charBuf[14]; - charBuf[13] = '\0'; -#endif strncpy( charBuf, configString, sizeof( charBuf ) - 1 ); charBuf[sizeof( charBuf ) - 1] = '\0'; @@ -1783,7 +1744,6 @@ static IVAS_REND_AudioConfig parseAudioConfig( return IVAS_REND_AUDIO_CONFIG_UNKNOWN; } } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( strcmp( charBuf, "BINAURAL" ) == 0 ) { return IVAS_REND_AUDIO_CONFIG_BINAURAL; @@ -1796,16 +1756,6 @@ static IVAS_REND_AudioConfig parseAudioConfig( { return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB; } -#else - if ( strcmp( charBuf, "BINAURAL_ROOM" ) == 0 ) - { - return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM; - } - if ( strcmp( charBuf, "BINAURAL" ) == 0 ) - { - return IVAS_REND_AUDIO_CONFIG_BINAURAL; - } -#endif return IVAS_REND_AUDIO_CONFIG_UNKNOWN; } @@ -2959,14 +2909,9 @@ static void printSupportedAudioConfigs() "HOA3", "ISMx (input only)", "MASAx (input only)", -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG "BINAURAL (output only)", "BINAURAL_ROOM_IR (output only)", "BINAURAL_ROOM_REVERB (output only)", -#else - "BINAURAL (output only)", - "BINAURAL_ROOM (output only)", -#endif }; fprintf( stdout, "Supported audio formats:\n" ); diff --git a/lib_com/common_api_types.h b/lib_com/common_api_types.h index de14bf7e50..2dc926dfc2 100644 --- a/lib_com/common_api_types.h +++ b/lib_com/common_api_types.h @@ -133,10 +133,6 @@ typedef struct typedef struct _IVAS_ROOM_ACOUSTICS_CONFIG { int16_t override; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - int16_t use_brir; - int16_t late_reverb_on; -#endif int16_t nBands; /* Number of frequency bands for which reverb properties are provided, integer, range [2..256] */ float pFc_input[IVAS_CLDFB_NO_CHANNELS_MAX]; /* Center frequencies for which following values are provided: */ float pAcoustic_rt60[IVAS_CLDFB_NO_CHANNELS_MAX]; /* - The room's T60 per center frequency */ diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 09a9f53d71..a4b7e1c5d5 100755 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -100,14 +100,9 @@ typedef enum AUDIO_CONFIG_HOA2, /* ambisonics, order 2 */ AUDIO_CONFIG_HOA3, /* ambisonics, order 3 */ AUDIO_CONFIG_OBA, /* object based audio */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG AUDIO_CONFIG_BINAURAL, /* binaural with HRIR */ AUDIO_CONFIG_BINAURAL_ROOM_IR, /* binaural with BRIR */ AUDIO_CONFIG_BINAURAL_ROOM_REVERB, /* binaural with HRIR + reverb */ -#else - AUDIO_CONFIG_BINAURAL, /* binaural with HRIR */ - AUDIO_CONFIG_BINAURAL_ROOM, /* binaural with HRIR and BRIR */ -#endif AUDIO_CONFIG_ISM1, /* ISM1 */ AUDIO_CONFIG_ISM2, /* ISM2 */ AUDIO_CONFIG_ISM3, /* ISM3 */ diff --git a/lib_com/options.h b/lib_com/options.h index 9ed2b81361..8d7a256ba1 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -146,7 +146,6 @@ #define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ -#define FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG /* Phi: issue 196 - refactoring renderer output configuration */ #ifdef IND_LIST_DYN #define FIX_545_ASSERT /* VA: fix issue 545, replace assert() with warning message when hitting memory limit in the buffer of indices */ #endif diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index ed6025fbc5..61898bed32 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -127,9 +127,6 @@ static ivas_error ivas_binRenderer_convModuleOpen( const int16_t renderer_type, const int16_t isLoudspeaker, const AUDIO_CONFIG input_config, -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - const RENDER_CONFIG_DATA *hRenderConfig, -#endif const HRTFS_FASTCONV_HANDLE hHrtf ) { int16_t bandIdx, chIdx; @@ -154,11 +151,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( hBinRenderer->nInChannels = ( audioCfg2channels( input_config ) - isLoudspeaker ); } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) -#else - if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && hRenderConfig->roomAcoustics.use_brir ) -#endif { hBinRenConvModule->numTaps = BINAURAL_NTAPS_MAX; @@ -314,11 +307,7 @@ static ivas_error ivas_binRenderer_convModuleOpen( #endif } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) -#else - if ( renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && hRenderConfig->roomAcoustics.use_brir ) -#endif { /* set the memories to zero */ set_zero( hBinRenConvModule->filterStatesLeftReal[bandIdx][chIdx], hBinRenConvModule->numTapsArray[bandIdx] ); @@ -670,9 +659,6 @@ ivas_error ivas_binRenderer_open( st_ivas->renderer_type, 1, AUDIO_CONFIG_7_1_4, -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - st_ivas->hRenderConfig, -#endif st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) { return error; @@ -698,9 +684,6 @@ ivas_error ivas_binRenderer_open( st_ivas->renderer_type, st_ivas->hIntSetup.is_loudspeaker_setup, st_ivas->hIntSetup.output_config, -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - st_ivas->hRenderConfig, -#endif st_ivas->hHrtfFastConv ) ) != IVAS_ERR_OK ) { return error; @@ -740,11 +723,7 @@ ivas_error ivas_binRenderer_open( } /* Allocate memories needed for reverb module */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM && st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) -#endif { if ( ( error = ivas_binaural_reverb_open( &( hBinRenderer->hReverb ), hBinRenderer->conv_band, diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 8f9bd3f3ca..fd0bf5b530 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -263,11 +263,7 @@ ivas_error ivas_dec( { if ( ( error = ivas_rend_crendProcess( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG AUDIO_CONFIG_BINAURAL_ROOM_IR, -#else - AUDIO_CONFIG_BINAURAL_ROOM, -#endif NULL, NULL, NULL, diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d0b4f9ff68..b746baf47b 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -643,22 +643,14 @@ ivas_error ivas_init_decoder_front( * Allocate and initialize Binaural Renderer configuration handle *--------------------------------------------------------------------*/ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { if ( ( error = ivas_render_config_open( &( st_ivas->hRenderConfig ) ) ) != IVAS_ERR_OK ) { return error; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_render_config_init_from_rom( &st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1263,11 +1255,7 @@ ivas_error ivas_init_decoder( return error; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) -#endif { if ( ( error = ivas_reverb_open( &st_ivas->hReverb, st_ivas->hDecoderConfig->output_config, NULL, st_ivas->hRenderConfig, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) { @@ -2125,11 +2113,7 @@ static ivas_error doSanityChecks_IVAS( if ( st_ivas->hDecoderConfig->Opt_Headrotation ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) -#endif { return IVAS_ERROR( IVAS_ERR_HEAD_ROTATION_NOT_SUPPORTED, "Wrong set-up: Head-rotation not supported in this configuration" ); } @@ -2137,22 +2121,14 @@ static ivas_error doSanityChecks_IVAS( if ( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - if ( !( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) -#endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG { return IVAS_ERROR( IVAS_ERR_EXT_ORIENTATION_NOT_SUPPORTED, "Wrong set-up: External orientation not supported in this configuration" ); } } #ifdef DEBUGGING -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || ( output_config != AUDIO_CONFIG_BINAURAL && output_config != AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode != MC_MODE_MCT ) ) ) -#else - if ( ( st_ivas->hDecoderConfig->force_rend == FORCE_TD_RENDERER ) && ( ( st_ivas->ivas_format != MC_FORMAT && st_ivas->ivas_format != ISM_FORMAT ) || output_config != AUDIO_CONFIG_BINAURAL || ( st_ivas->ivas_format == ISM_FORMAT && st_ivas->ism_mode == ISM_MODE_PARAM ) || ( st_ivas->ivas_format == MC_FORMAT && ( st_ivas->mc_mode != MC_MODE_MCT && st_ivas->mc_mode != MC_MODE_PARAMUPMIX ) ) ) ) -#endif { return IVAS_ERROR( IVAS_ERR_INVALID_OUTPUT_FORMAT, "Incorrect output configuration: Time Domain object renderer not supported in this configuration" ); } diff --git a/lib_dec/ivas_ism_dec.c b/lib_dec/ivas_ism_dec.c index 39557a6aa0..66b69c6a2c 100644 --- a/lib_dec/ivas_ism_dec.c +++ b/lib_dec/ivas_ism_dec.c @@ -199,11 +199,7 @@ static ivas_error ivas_ism_bitrate_switching( } } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { /* close the parametric binaural renderer */ ivas_dirac_dec_close_binaural_data( &st_ivas->hDiracDecBin ); @@ -270,11 +266,7 @@ static ivas_error ivas_ism_bitrate_switching( } } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { /* open the parametric binaural renderer */ if ( ( error = ivas_dirac_dec_binaural_copy_hrtfs( &st_ivas->hHrtfParambin ) ) != IVAS_ERR_OK ) diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 42260c7984..71637e7e7b 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -384,11 +384,7 @@ static ivas_error ivas_param_ism_rendering_init( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for interpolator\n" ) ); } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) -#endif { /* computation of proto matrix */ ivas_ism_get_proto_matrix( hOutSetup, nchan_transport, hParamIsmRendering->proto_matrix ); @@ -536,12 +532,8 @@ ivas_error ivas_param_ism_dec_open( } } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) -#else - if ( !( output_config == AUDIO_CONFIG_EXTERNAL || output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM || output_config == AUDIO_CONFIG_MONO || output_config == AUDIO_CONFIG_STEREO ) ) -#endif { /* Initialize efap handle */ if ( ( error = efap_init_data( &( st_ivas->hEFAPdata ), hOutSetup.ls_azimuth, hOutSetup.ls_elevation, hOutSetup.nchan_out_woLFE, EFAP_MODE_EFAP ) ) != IVAS_ERR_OK ) @@ -559,11 +551,7 @@ ivas_error ivas_param_ism_dec_open( hDirAC->dirac_read_idx = 0; hDirAC->spar_to_dirac_write_idx = 0; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) -#endif { if ( ( error = ivas_dirac_allocate_parameters( hDirAC, 1 ) ) != IVAS_ERR_OK ) { @@ -666,11 +654,7 @@ void ivas_param_ism_dec_close( hDirAC->hParamIsm = NULL; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) -#endif { ivas_dirac_deallocate_parameters( hDirAC, 1 ); ivas_dirac_deallocate_parameters( hDirAC, 2 ); diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index d388fe1d1d..6871747db6 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -730,13 +730,8 @@ ivas_error ivas_jbm_dec_render( } else if ( st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, - NULL, st_ivas->hTcBuffer, p_output, p_output, *nSamplesRendered, output_Fs ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1000,13 +995,8 @@ ivas_error ivas_jbm_dec_flush_renderer( set_f( st_ivas->hIsmRendererData->interpolator, 1.0f, hTcBuffer->n_samples_granularity ); ivas_ism_render_sf( st_ivas, p_output, hTcBuffer->n_samples_granularity ); -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, st_ivas->hDecoderConfig, NULL, NULL, NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcessSubframe( st_ivas->hCrendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, st_ivas->hDecoderConfig, NULL, NULL, - NULL, st_ivas->hTcBuffer, p_output, p_output, hTcBuffer->n_samples_granularity, st_ivas->hDecoderConfig->output_Fs ) ) != IVAS_ERR_OK ) -#endif { return error; } diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index 751e693837..c37bd78125 100755 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -1122,22 +1122,14 @@ static ivas_error ivas_mc_dec_reconfig( output_config = st_ivas->hDecoderConfig->output_config; /* binaural renderers*/ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { /* remove unneeded binaural renderers */ if ( st_ivas->hBinRenderer != NULL && ( st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV && st_ivas->renderer_type != RENDERER_BINAURAL_FASTCONV_ROOM ) ) { ivas_binRenderer_close( &st_ivas->hBinRenderer ); } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hIntSetup.output_config != AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) ) -#else - if ( ( st_ivas->hCrendWrapper != NULL ) && ( st_ivas->hCrendWrapper->hCrend != NULL ) && ( st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV && st_ivas->renderer_type != RENDERER_BINAURAL_MIXER_CONV_ROOM && ( st_ivas->renderer_type != RENDERER_BINAURAL_OBJECTS_TD || st_ivas->hRenderConfig->roomAcoustics.late_reverb_on == 0 ) ) ) -#endif { ivas_rend_closeCrend( &( st_ivas->hCrendWrapper ) ); } @@ -1195,11 +1187,7 @@ static ivas_error ivas_mc_dec_reconfig( return error; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) -#endif { if ( ( error = ivas_rend_initCrendWrapper( &st_ivas->hCrendWrapper ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_objectRenderer_internal.c b/lib_dec/ivas_objectRenderer_internal.c index 8e2089d1c6..3be8a2c62e 100644 --- a/lib_dec/ivas_objectRenderer_internal.c +++ b/lib_dec/ivas_objectRenderer_internal.c @@ -183,11 +183,7 @@ ivas_error ivas_td_binaural_renderer_sf( ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->Quaternions : NULL, ( st_ivas->hCombinedOrientationData != NULL ) ? st_ivas->hCombinedOrientationData->listenerPos : NULL ); -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( ( st_ivas->hRenderConfig != NULL ) && ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) ) -#endif { if ( ( error = ivas_reverb_process( st_ivas->hReverb, st_ivas->transport_config, 0, tc_local, p_reverb_signal, 0 ) ) != IVAS_ERR_OK ) { @@ -201,7 +197,6 @@ ivas_error ivas_td_binaural_renderer_sf( return error; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( st_ivas->hRenderConfig != NULL && st_ivas->hIntSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) { /* add reverb to rendered signals */ @@ -209,17 +204,6 @@ ivas_error ivas_td_binaural_renderer_sf( v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); } -#else - if ( st_ivas->hRenderConfig != NULL ) /* Renderer Configuration not enabled in TD standalone renderer */ - { - if ( st_ivas->hRenderConfig->roomAcoustics.late_reverb_on ) - { - /* add reverb to rendered signals */ - v_add( reverb_signal[0], output_f_local[0], output_f_local[0], output_frame ); - v_add( reverb_signal[1], output_f_local[1], output_f_local[1], output_frame ); - } - } -#endif for ( ch = 0; ch < st_ivas->hTcBuffer->nchan_transport_internal; ch++ ) { diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index ead3058519..aeabc49956 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -76,21 +76,13 @@ void ivas_renderer_select( st_ivas->hCombinedOrientationData->shd_rot_max_order = -1; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { if ( st_ivas->ivas_format == ISM_FORMAT ) { if ( st_ivas->ism_mode == ISM_MODE_PARAM ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( output_config == AUDIO_CONFIG_BINAURAL ) -#endif { *renderer_type = RENDERER_BINAURAL_PARAMETRIC; } @@ -101,11 +93,7 @@ void ivas_renderer_select( } else /* ISM_MODE_DISC */ { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( output_config == AUDIO_CONFIG_BINAURAL || output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hRenderConfig->roomAcoustics.use_brir == 0 ) -#endif { #ifdef DEBUGGING if ( st_ivas->hDecoderConfig->force_rend == FORCE_CLDFB_RENDERER ) @@ -239,11 +227,7 @@ void ivas_renderer_select( } } } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG else -#else - else /* AUDIO_CONFIG_BINAURAL_ROOM */ -#endif { if ( st_ivas->mc_mode == MC_MODE_MCT || st_ivas->mc_mode == MC_MODE_PARAMUPMIX ) { diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 9672336510..b80cc08684 100755 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -1672,11 +1672,7 @@ void ivas_spar_dec_upmixer_sf( } else { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_IR || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) ) -#else - if ( hDecoderConfig->output_config == AUDIO_CONFIG_FOA || !( st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL || st_ivas->hOutSetup.output_config == AUDIO_CONFIG_BINAURAL_ROOM ) ) -#endif { for ( ts = 0; ts < hSpar->subframe_nbslots[hSpar->subframes_rendered]; ts++ ) { diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index a7f6fcefd1..9e3ce49b6d 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -344,7 +344,6 @@ static AUDIO_CONFIG mapOutputFormat( { output_config = AUDIO_CONFIG_HOA3; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL ) { output_config = AUDIO_CONFIG_BINAURAL; @@ -357,16 +356,6 @@ static AUDIO_CONFIG mapOutputFormat( { output_config = AUDIO_CONFIG_BINAURAL_ROOM_REVERB; } -#else - else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL ) - { - output_config = AUDIO_CONFIG_BINAURAL; - } - else if ( outputFormat == IVAS_DEC_OUTPUT_BINAURAL_ROOM ) - { - output_config = AUDIO_CONFIG_BINAURAL_ROOM; - } -#endif else { output_config = AUDIO_CONFIG_INVALID; @@ -1452,10 +1441,6 @@ ivas_error IVAS_DEC_GetRenderConfig( } #endif hRCout->room_acoustics.override = hRCin->roomAcoustics.override; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - hRCout->room_acoustics.use_brir = hRCin->roomAcoustics.use_brir; - hRCout->room_acoustics.late_reverb_on = hRCin->roomAcoustics.late_reverb_on; -#endif hRCout->room_acoustics.nBands = hRCin->roomAcoustics.nBands; hRCout->room_acoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; hRCout->room_acoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; @@ -1500,10 +1485,6 @@ ivas_error IVAS_DEC_FeedRenderConfig( } #endif hRenderConfig->roomAcoustics.override = renderConfig.room_acoustics.override; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - hRenderConfig->roomAcoustics.use_brir = renderConfig.room_acoustics.use_brir; - hRenderConfig->roomAcoustics.late_reverb_on = renderConfig.room_acoustics.late_reverb_on; -#endif hRenderConfig->roomAcoustics.nBands = renderConfig.room_acoustics.nBands; hRenderConfig->roomAcoustics.acousticPreDelay = renderConfig.room_acoustics.acousticPreDelay; hRenderConfig->roomAcoustics.inputPreDelay = renderConfig.room_acoustics.inputPreDelay; @@ -2425,7 +2406,6 @@ static ivas_error get_channel_config( { strcpy( str, "Ambisonics: Third Order (HOA3)" ); } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG else if ( config == AUDIO_CONFIG_BINAURAL ) { strcpy( str, "Binaural: no room" ); @@ -2438,16 +2418,6 @@ static ivas_error get_channel_config( { strcpy( str, "Binaural: room with reverb" ); } -#else - else if ( config == AUDIO_CONFIG_BINAURAL ) - { - strcpy( str, "Binaural" ); - } - else if ( config == AUDIO_CONFIG_BINAURAL_ROOM ) - { - strcpy( str, "Binaural_ROOM" ); - } -#endif else if ( config == AUDIO_CONFIG_EXTERNAL ) { strcpy( str, "External renderer" ); diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index 5a6e52870d..f28b4c1672 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -54,14 +54,9 @@ typedef enum _IVAS_DEC_OUTPUT_CONFIG IVAS_DEC_OUTPUT_FOA, IVAS_DEC_OUTPUT_HOA2, IVAS_DEC_OUTPUT_HOA3, -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG IVAS_DEC_OUTPUT_BINAURAL, IVAS_DEC_OUTPUT_BINAURAL_ROOM_IR, IVAS_DEC_OUTPUT_BINAURAL_ROOM_REVERB, -#else - IVAS_DEC_OUTPUT_BINAURAL, - IVAS_DEC_OUTPUT_BINAURAL_ROOM, -#endif IVAS_DEC_OUTPUT_EXT, IVAS_DEC_OUTPUT_UNKNOWN = 0xffff } IVAS_DEC_AUDIO_CONFIG; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index eca2dd4d47..447ccede61 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -157,17 +157,11 @@ static ivas_error ivas_rend_initCrend( CREND_WRAPPER *pCrend, const AUDIO_CONFIG inIvasConfig, const AUDIO_CONFIG outIvasConfig, -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - RENDER_CONFIG_DATA *hRendCfg, -#endif HRTFS_CREND_HANDLE hSetOfHRTF, const int32_t output_Fs ) { int16_t i, j, tmp; int16_t nchan_in; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - bool use_brir; -#endif IVAS_REND_AudioConfigType inConfigType; HRTFS_HANDLE hHrtf; ivas_error error; @@ -186,11 +180,7 @@ static ivas_error ivas_rend_initCrend( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Encountered unsupported input config in Crend" ); } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL && outConfig != IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Encountered unsupported output type in Crend" ); } @@ -203,14 +193,6 @@ static ivas_error ivas_rend_initCrend( } } -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - /* set BRIR flag */ - use_brir = false; - if ( ( ( hRendCfg != NULL ) && hRendCfg->roomAcoustics.use_brir ) || ( ( hRendCfg == NULL ) && ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) ) - { - use_brir = true; - } -#endif if ( ( error = getAudioConfigNumChannels( inConfig, &nchan_in ) ) != IVAS_ERR_OK ) { @@ -232,11 +214,7 @@ static ivas_error ivas_rend_initCrend( if ( output_Fs == 48000 ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz; @@ -251,11 +229,7 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; @@ -273,11 +247,7 @@ static ivas_error ivas_rend_initCrend( } else if ( output_Fs == 32000 ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz; @@ -292,11 +262,7 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; @@ -314,11 +280,7 @@ static ivas_error ivas_rend_initCrend( } else if ( output_Fs == 16000 ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->latency_s = CRendBin_Combined_BRIR_latency_s; hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_16kHz; @@ -333,11 +295,7 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; @@ -387,11 +345,7 @@ static ivas_error ivas_rend_initCrend( if ( output_Fs == 48000 ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz[tmp]; } @@ -402,11 +356,7 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; @@ -424,11 +374,7 @@ static ivas_error ivas_rend_initCrend( } else if ( output_Fs == 32000 ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz[tmp]; } @@ -439,11 +385,7 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; @@ -461,11 +403,7 @@ static ivas_error ivas_rend_initCrend( } else if ( output_Fs == 16000 ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->inv_diffuse_weight[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz[tmp]; } @@ -476,11 +414,7 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; @@ -782,11 +716,7 @@ static ivas_error ivas_rend_initCrend( hHrtf->max_num_ir -= 1; /* subtract LFE */ hHrtf->gain_lfe = GAIN_LFE; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->latency_s = hSetOfHRTF->hHRTF_brir_combined->latency_s; hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_brir_combined->max_num_iterations; @@ -801,11 +731,7 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations_diffuse[j]; hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max_diffuse[j]; @@ -848,11 +774,7 @@ static ivas_error ivas_rend_initCrend( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error: Channel configuration not specified!\n\n" ); } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->inv_diffuse_weight[i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight[tmp]; } @@ -863,11 +785,7 @@ static ivas_error ivas_rend_initCrend( for ( j = 0; j < BINAURAL_CHANNELS; j++ ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) -#else - if ( use_brir ) -#endif { hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max[tmp][j]; @@ -1062,11 +980,7 @@ ivas_error ivas_rend_openCrend( if ( ( *pCrend )->hHrtfCrend == NULL ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_initCrend( *pCrend, inConfig, outConfig, hRendCfg, hSetOfHRTF, output_Fs ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -1138,11 +1052,7 @@ ivas_error ivas_rend_openCrend( hCrend->lfe_delay_line = NULL; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( ( hRendCfg != NULL ) && ( hRendCfg->roomAcoustics.late_reverb_on ) ) -#endif { if ( ( error = ivas_reverb_open( &( hCrend->hReverb ), inConfig, ( *pCrend )->hHrtfCrend, hRendCfg, output_Fs ) ) != IVAS_ERR_OK ) { diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index 49cf6488e0..bf89194224 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -304,11 +304,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( /* Update the listener's location/orientation */ TDREND_Update_listener_orientation( hBinRendererTd, ( enableCombinedOrientation != NULL ) ? enableCombinedOrientation[subframe_idx] : 0, ( Quaternions != NULL ) ? &Quaternions[subframe_idx] : NULL, ( Pos != NULL ) ? &Pos[subframe_idx] : NULL ); -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( hReverb != NULL ) -#else - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) -#endif { if ( ( error = ivas_reverb_process( hReverb, transport_config, 0, output, p_reverb_signal, subframe_idx ) ) != IVAS_ERR_OK ) { @@ -323,11 +319,7 @@ ivas_error ivas_td_binaural_renderer_unwrap( } } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( hReverb != NULL ) -#else - if ( hReverb != NULL && hReverb->pConfig.roomAcoustics.late_reverb_on ) -#endif { /* add reverb to rendered signals */ v_add( reverb_signal[0], output[0], output[0], output_frame ); diff --git a/lib_rend/ivas_output_init.c b/lib_rend/ivas_output_init.c index 32177b90a9..4e1479faf8 100644 --- a/lib_rend/ivas_output_init.c +++ b/lib_rend/ivas_output_init.c @@ -90,14 +90,9 @@ int16_t audioCfg2channels( case AUDIO_CONFIG_OBA: nchan_out = 8; break; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case AUDIO_CONFIG_BINAURAL: case AUDIO_CONFIG_BINAURAL_ROOM_IR: case AUDIO_CONFIG_BINAURAL_ROOM_REVERB: -#else - case AUDIO_CONFIG_BINAURAL: - case AUDIO_CONFIG_BINAURAL_ROOM: -#endif nchan_out = 2; break; case AUDIO_CONFIG_ISM1: @@ -222,14 +217,9 @@ void ivas_output_init( hOutSetup->ls_elevation = ls_elevation_CICP19; hOutSetup->is_planar_setup = 0; break; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case AUDIO_CONFIG_BINAURAL: case AUDIO_CONFIG_BINAURAL_ROOM_IR: case AUDIO_CONFIG_BINAURAL_ROOM_REVERB: -#else - case AUDIO_CONFIG_BINAURAL: - case AUDIO_CONFIG_BINAURAL_ROOM: -#endif case AUDIO_CONFIG_ISM1: case AUDIO_CONFIG_ISM2: case AUDIO_CONFIG_ISM3: diff --git a/lib_rend/ivas_prot_rend.h b/lib_rend/ivas_prot_rend.h index 0dd2723eba..4ea5cb4484 100644 --- a/lib_rend/ivas_prot_rend.h +++ b/lib_rend/ivas_prot_rend.h @@ -890,10 +890,6 @@ void ivas_render_config_close( ivas_error ivas_render_config_init_from_rom( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - , - const int16_t room_flag_on /* i : room effect on/off flag */ -#endif ); diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index 8ada1a8c83..7dfc4b7c4b 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -100,10 +100,6 @@ void ivas_render_config_close( ivas_error ivas_render_config_init_from_rom( RENDER_CONFIG_HANDLE *hRenderConfig /* i/o: Renderer config handle */ -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - , - const int16_t room_flag_on /* i : room effect on/off flag */ -#endif ) { if ( hRenderConfig == NULL || *hRenderConfig == NULL ) @@ -115,10 +111,6 @@ ivas_error ivas_render_config_init_from_rom( ( *hRenderConfig )->renderer_type_override = RENDER_TYPE_OVERRIDE_NONE; #endif ( *hRenderConfig )->roomAcoustics.override = FALSE; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - ( *hRenderConfig )->roomAcoustics.use_brir = room_flag_on; - ( *hRenderConfig )->roomAcoustics.late_reverb_on = FALSE; -#endif ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; ( *hRenderConfig )->roomAcoustics.acousticPreDelay = IVAS_REVERB_DEFAULT_PRE_DELAY; ( *hRenderConfig )->roomAcoustics.inputPreDelay = IVAS_REVERB_DEFAULT_INPUT_DELAY; diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 367d7d5213..6374b6812e 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -1180,10 +1180,6 @@ ivas_error ivas_reverb_open( pState->pConfig.renderer_type_override = hRenderConfig->renderer_type_override; #endif pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - pState->pConfig.roomAcoustics.use_brir = hRenderConfig->roomAcoustics.use_brir; - pState->pConfig.roomAcoustics.late_reverb_on = hRenderConfig->roomAcoustics.late_reverb_on; -#endif pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; /* set up input downmix */ @@ -1898,11 +1894,7 @@ ivas_error ivas_binaural_reverb_open( if ( ( roomAcoustics ) && ( roomAcoustics->override ) ) { -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, output_config, false, sampling_rate, t60, ene ); -#else - ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, output_config, roomAcoustics->use_brir, sampling_rate, t60, ene ); -#endif ivas_binaural_reverb_setReverbTimes( hReverb, sampling_rate, t60, ene ); ivas_binaural_reverb_setPreDelay( hReverb, (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ) ); } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 675740678c..eef7a58bc8 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -326,10 +326,6 @@ typedef struct ivas_combined_orientation_struct typedef struct ivas_roomAcoustics_t { int16_t override; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - int16_t use_brir; - int16_t late_reverb_on; -#endif int16_t nBands; /* Number of frequency bands for which reverb properties are provided, integer, range [2..256] */ float pFc_input[CLDFB_NO_CHANNELS_MAX]; /* Center frequencies for which following values are provided: */ float pAcoustic_rt60[CLDFB_NO_CHANNELS_MAX]; /* - The room's T60 per center frequency */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 585e3a47df..5452ebb9dd 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -355,19 +355,12 @@ AUDIO_CONFIG getIvasAudioConfigFromRendAudioConfig( return AUDIO_CONFIG_HOA3; case IVAS_REND_AUDIO_CONFIG_OBJECT: return AUDIO_CONFIG_OBA; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL: return AUDIO_CONFIG_BINAURAL; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: return AUDIO_CONFIG_BINAURAL_ROOM_IR; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: return AUDIO_CONFIG_BINAURAL_ROOM_REVERB; -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: - return AUDIO_CONFIG_BINAURAL; - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: - return AUDIO_CONFIG_BINAURAL_ROOM; -#endif case IVAS_REND_AUDIO_CONFIG_MASA1: return AUDIO_CONFIG_MASA1; case IVAS_REND_AUDIO_CONFIG_MASA2: @@ -394,19 +387,12 @@ IVAS_REND_AudioConfig getRendAudioConfigFromIvasAudioConfig( return IVAS_REND_AUDIO_CONFIG_MONO; case AUDIO_CONFIG_STEREO: return IVAS_REND_AUDIO_CONFIG_STEREO; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case AUDIO_CONFIG_BINAURAL: return IVAS_REND_AUDIO_CONFIG_BINAURAL; case AUDIO_CONFIG_BINAURAL_ROOM_IR: return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR; case AUDIO_CONFIG_BINAURAL_ROOM_REVERB: return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB; -#else - case AUDIO_CONFIG_BINAURAL: - return IVAS_REND_AUDIO_CONFIG_BINAURAL; - case AUDIO_CONFIG_BINAURAL_ROOM: - return IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM; -#endif case AUDIO_CONFIG_5_1: return IVAS_REND_AUDIO_CONFIG_5_1; case AUDIO_CONFIG_7_1: @@ -451,16 +437,9 @@ static ivas_error validateOutputAudioConfig( case IVAS_REND_AUDIO_CONFIG_FOA: case IVAS_REND_AUDIO_CONFIG_HOA2: case IVAS_REND_AUDIO_CONFIG_HOA3: -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: - case IVAS_REND_AUDIO_CONFIG_MASA1: - case IVAS_REND_AUDIO_CONFIG_MASA2: -#endif return IVAS_ERR_OK; default: break; @@ -532,14 +511,9 @@ ivas_error getAudioConfigNumChannels( *numChannels = 1; break; case IVAS_REND_AUDIO_CONFIG_STEREO: -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL: - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#endif case IVAS_REND_AUDIO_CONFIG_MASA2: *numChannels = 2; break; @@ -828,11 +802,7 @@ static ivas_error initEfap( const float *elevations; int16_t numNonLfeChannels; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { pEfapWrapper->speakerConfig = IVAS_REND_AUDIO_CONFIG_7_1_4; } @@ -1175,7 +1145,6 @@ static ivas_error setRendInputActiveIsm( inputIsm->hOMasa = NULL; error = IVAS_ERR_OK; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR ) { if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg, @@ -1205,45 +1174,6 @@ static ivas_error setRendInputActiveIsm( } } } -#else - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL ) - { - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) - { - if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) - { - if ( ( error = ivas_td_binaural_open_ext( &inputIsm->tdRendWrapper, inConfig, hRendCfg, NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } - - if ( ( error = ivas_reverb_open( &( inputIsm->hReverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - else - { - if ( ( error = ivas_rend_openCrend( &inputIsm->crendWrapper, AUDIO_CONFIG_7_1_4, getIvasAudioConfigFromRendAudioConfig( outConfig ), hRendCfg, - NULL, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } - } - } - else if ( outConfig == IVAS_REND_AUDIO_CONFIG_MASA1 || outConfig == IVAS_REND_AUDIO_CONFIG_MASA2 ) - { - if ( ( error = initIsmMasaRendering( inputIsm, *rendCtx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } - } -#endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG return IVAS_ERR_OK; @@ -1862,12 +1792,8 @@ static ivas_error updateMcPanGains( { case IVAS_REND_AUDIO_CONFIG_BINAURAL: break; /* Do nothing */ -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#endif /* Prepare rendering to intermediate format */ error = updateMcPanGainsForMcOut( inputMc, IVAS_REND_AUDIO_CONFIG_7_1_4 ); break; @@ -1959,11 +1885,7 @@ static ivas_error initMcBinauralRendering( return error; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( hRendCfg != NULL && hRendCfg->roomAcoustics.use_brir == 0 && hRendCfg->roomAcoustics.late_reverb_on ) -#endif { if ( ( error = ivas_reverb_open( &( inputMc->hReverb ), getIvasAudioConfigFromRendAudioConfig( outConfig ), NULL, hRendCfg, outSampleRate ) ) != IVAS_ERR_OK ) { @@ -2107,11 +2029,7 @@ static ivas_error setRendInputActiveMc( initRotGains( inputMc->rot_gains_prev ); inputMc->lfeRouting = defaultLfeRouting( inConfig, inputMc->customLsInput, outConfig, *inputMc->base.ctx.pCustomLsOut ); -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { if ( ( error = initMcBinauralRendering( inputMc, inConfig, outConfig, hRendCfg ) ) != IVAS_ERR_OK ) { @@ -2287,12 +2205,8 @@ static ivas_error updateSbaPanGains( NULL, *rendCtx.pOutSampleRate ); break; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#endif if ( ( error = initSbaPanGainsForMcOut( inputSba, IVAS_REND_AUDIO_CONFIG_7_1_4, NULL ) ) != IVAS_ERR_OK ) { return error; @@ -2738,10 +2652,6 @@ static DecoderDummy *initDecoderDummy( if ( enableRenderConfig ) { ivas_render_config_open( &decDummy->hRenderConfig ); -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - decDummy->hRenderConfig->roomAcoustics.late_reverb_on = 0; - decDummy->hRenderConfig->roomAcoustics.use_brir = 0; -#endif } else { @@ -3496,11 +3406,7 @@ ivas_error IVAS_REND_ConfigureCustomInputLoudspeakerLayout( return error; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) -#else - if ( hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL || hIvasRend->outputConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) -#endif { if ( ( error = initMcBinauralRendering( inputMc, inputMc->base.inConfig, hIvasRend->outputConfig, hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) { @@ -4037,11 +3943,7 @@ ivas_error IVAS_REND_InitConfig( { return error; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_render_config_init_from_rom( &hIvasRend->hRendererConfig, outAudioConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -4089,10 +3991,6 @@ int16_t IVAS_REND_GetRenderConfig( } #endif hRCout->room_acoustics.override = hRCin->roomAcoustics.override; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - hRCout->room_acoustics.use_brir = hRCin->roomAcoustics.use_brir; - hRCout->room_acoustics.late_reverb_on = hRCin->roomAcoustics.late_reverb_on; -#endif hRCout->room_acoustics.nBands = hRCin->roomAcoustics.nBands; hRCout->room_acoustics.acousticPreDelay = hRCin->roomAcoustics.acousticPreDelay; hRCout->room_acoustics.inputPreDelay = hRCin->roomAcoustics.inputPreDelay; @@ -4137,10 +4035,6 @@ int16_t IVAS_REND_FeedRenderConfig( } #endif hRenderConfig->roomAcoustics.override = renderConfig.room_acoustics.override; -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - hRenderConfig->roomAcoustics.use_brir = renderConfig.room_acoustics.use_brir; - hRenderConfig->roomAcoustics.late_reverb_on = renderConfig.room_acoustics.late_reverb_on; -#endif hRenderConfig->roomAcoustics.nBands = renderConfig.room_acoustics.nBands; hRenderConfig->roomAcoustics.acousticPreDelay = renderConfig.room_acoustics.acousticPreDelay; hRenderConfig->roomAcoustics.inputPreDelay = renderConfig.room_acoustics.inputPreDelay; @@ -4839,28 +4733,6 @@ static ivas_error renderIsmToBinauralRoom( } } -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( ismInput->hReverb != NULL && ismInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && ismInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 && - combinedOrientationEnabled ) - { - copyBufferTo2dArray( ismInput->base.inputBuffer, tmpRendBuffer ); - - if ( ( error = ivas_td_binaural_renderer_ext( &ismInput->tdRendWrapper, - ismInput->base.inConfig, - NULL, - ismInput->base.ctx.pCombinedOrientationData, - &ismInput->currentPos, - ismInput->hReverb, - outAudio.config.numSamplesPerChannel, - tmpRendBuffer ) ) != IVAS_ERR_OK ) - { - return error; - } - accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); - } - else - { -#endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( combinedOrientationEnabled ) { @@ -4944,13 +4816,8 @@ static ivas_error renderIsmToBinauralRoom( copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#else - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) -#endif { return error; } @@ -4958,15 +4825,11 @@ static ivas_error renderIsmToBinauralRoom( accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); free( tmpMcBuffer.data ); -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - } -#endif pop_wmops(); return IVAS_ERR_OK; } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG static ivas_error renderIsmToBinauralReverb( input_ism *ismInput, @@ -5006,7 +4869,6 @@ static ivas_error renderIsmToBinauralReverb( return IVAS_ERR_OK; } -#endif static ivas_error renderIsmToMc( const input_ism *ismInput, @@ -5176,18 +5038,12 @@ static ivas_error renderInputIsm( case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderIsmToBinaural( ismInput, outAudio ); break; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: error = renderIsmToBinauralRoom( ismInput, outAudio ); break; case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: error = renderIsmToBinauralReverb( ismInput, outAudio ); break; -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: - error = renderIsmToBinauralRoom( ismInput, outAudio ); - break; -#endif default: return IVAS_ERR_INVALID_OUTPUT_FORMAT; } @@ -5416,13 +5272,8 @@ static ivas_error renderMcToBinauralRoom( } } -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG if ( ( mcInput->hReverb != NULL && outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( combinedOrientationEnabled -#else - if ( ( mcInput->hReverb != NULL && mcInput->hReverb->pConfig.roomAcoustics.use_brir == 0 && mcInput->hReverb->pConfig.roomAcoustics.late_reverb_on == 1 ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( - combinedOrientationEnabled -#endif // FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); @@ -5675,12 +5526,8 @@ static ivas_error renderInputMc( case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderMcToBinaural( mcInput, outConfig, outAudio ); break; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#endif if ( mcInput->base.inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) { error = renderMcCustomLsToBinauralRoom( mcInput, outConfig, outAudio ); @@ -5997,12 +5844,8 @@ static ivas_error renderInputSba( case IVAS_REND_AUDIO_CONFIG_BINAURAL: error = renderSbaToBinaural( sbaInput, outConfig, outAudio ); break; -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR: case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB: -#else - case IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM: -#endif error = renderSbaToBinauralRoom( sbaInput, outConfig, outAudio ); break; default: diff --git a/lib_rend/lib_rend.h b/lib_rend/lib_rend.h index 5f90810862..d8d6127b20 100644 --- a/lib_rend/lib_rend.h +++ b/lib_rend/lib_rend.h @@ -112,14 +112,9 @@ typedef enum IVAS_REND_AUDIO_CONFIG_OBJECT = IVAS_REND_AUDIO_CONFIG_TYPE_OBJECT_BASED << 8 | 0, -#ifdef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_IR = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 2, -#else - IVAS_REND_AUDIO_CONFIG_BINAURAL = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 0, - IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM = IVAS_REND_AUDIO_CONFIG_TYPE_BINAURAL << 8 | 1, -#endif IVAS_REND_AUDIO_CONFIG_MASA1 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 0, IVAS_REND_AUDIO_CONFIG_MASA2 = IVAS_REND_AUDIO_CONFIG_TYPE_MASA << 8 | 1, diff --git a/lib_util/render_config_reader.c b/lib_util/render_config_reader.c index 95ca42779f..d9477ad9dc 100644 --- a/lib_util/render_config_reader.c +++ b/lib_util/render_config_reader.c @@ -422,25 +422,7 @@ ivas_error RenderConfigReader_read( #ifdef DEBUGGING fprintf( stderr, " PARAM: %s -> %s\n", item, pValue ); #endif -#ifndef FIX_196_REFACTOR_RENDERER_OUTPUT_CONFIG - if ( strcmp( item, "REVERB" ) == 0 ) - { - if ( read_bool( pValue, &hRenderConfig->room_acoustics.late_reverb_on ) ) - { - errorHandler( item, ERROR_VALUE_INVALID ); - } - } - else if ( strcmp( item, "BRIR" ) == 0 ) - { - if ( read_bool( pValue, &hRenderConfig->room_acoustics.use_brir ) ) - { - errorHandler( item, ERROR_VALUE_INVALID ); - } - } - else if ( strcmp( item, "NBANDS" ) == 0 ) -#else if ( strcmp( item, "NBANDS" ) == 0 ) -#endif { if ( !sscanf( pValue, "%hd", &hRenderConfig->room_acoustics.nBands ) || hRenderConfig->room_acoustics.nBands > CLDFB_NO_CHANNELS_MAX ) -- GitLab From b549d0485bf1dd3b5999ec614575252fdc70753b Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 18:15:08 +0200 Subject: [PATCH 370/381] formatting --- lib_com/core_com_config.c | 3 +- lib_com/hq_tools.c | 1 - lib_com/ivas_tools.c | 2 +- lib_com/options.h | 8 +- lib_com/prot.h | 3 +- lib_dec/core_dec_init.c | 12 +- lib_dec/core_dec_switch.c | 6 +- lib_dec/evs_dec.c | 5 +- lib_dec/ivas_binRenderer_internal.c | 9 +- lib_dec/ivas_dirac_dec.c | 77 ++++----- lib_dec/ivas_ism_param_dec.c | 3 +- lib_dec/ivas_mc_param_dec.c | 3 +- lib_dec/ivas_output_config.c | 4 +- lib_dec/ivas_spar_md_dec.c | 12 +- lib_dec/ivas_stat_dec.h | 2 +- lib_dec/ivas_tcx_core_dec.c | 12 +- lib_dec/lib_dec.c | 14 +- lib_enc/core_enc_init.c | 12 +- lib_enc/core_enc_switch.c | 18 +- lib_enc/ivas_core_pre_proc.c | 6 +- lib_enc/ivas_cpe_enc.c | 6 +- lib_enc/ivas_stereo_dmx_evs.c | 26 +-- lib_enc/ivas_tcx_core_enc.c | 6 +- lib_enc/lib_enc.c | 8 +- lib_enc/pre_proc.c | 6 +- lib_enc/updt_enc.c | 6 +- lib_rend/ivas_crend.c | 22 +-- lib_rend/ivas_dirac_ana.c | 1 - lib_rend/ivas_dirac_dec_binaural_functions.c | 6 +- lib_rend/ivas_masa_merge.c | 2 - lib_rend/ivas_mcmasa_ana.c | 2 - lib_rend/ivas_objectRenderer.c | 26 +-- lib_rend/ivas_omasa_ana.c | 2 - lib_rend/ivas_rotation.c | 20 +-- lib_rend/ivas_stat_rend.h | 2 +- lib_rend/lib_rend.c | 173 +++++++++---------- lib_util/head_rotation_file_reader.c | 1 - lib_util/rotation_file_reader.c | 1 - 38 files changed, 231 insertions(+), 297 deletions(-) mode change 100755 => 100644 lib_dec/ivas_spar_md_dec.c mode change 100755 => 100644 lib_enc/lib_enc.c diff --git a/lib_com/core_com_config.c b/lib_com/core_com_config.c index 2dc7a0178a..49ca422052 100644 --- a/lib_com/core_com_config.c +++ b/lib_com/core_com_config.c @@ -167,8 +167,7 @@ int16_t getTcxonly( const int32_t total_brate, /* i : total bitrate */ const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ , - const int16_t is_ism_format -) + const int16_t is_ism_format ) { int16_t tcxonly = 0; diff --git a/lib_com/hq_tools.c b/lib_com/hq_tools.c index 0796006ecf..4ad78fc904 100644 --- a/lib_com/hq_tools.c +++ b/lib_com/hq_tools.c @@ -1288,7 +1288,6 @@ int16_t calc_nor_delta_hf( push_indice( hBstr, IND_DELTA_ENV_HQ, delta - min_delta, bitsforDelta ); ynrm[i] += delta; add_bits_denv += bitsforDelta; - } } diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 834b190e47..6679a70a0e 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -75,7 +75,7 @@ float sumAbs( void mvc2c( const uint8_t x[], /* i : input vector */ uint8_t y[], /* o : output vector */ - const int16_t n /* i : vector size */ + const int16_t n /* i : vector size */ ) { int16_t i; diff --git a/lib_com/options.h b/lib_com/options.h index 8d7a256ba1..8a98ccc141 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,17 +150,11 @@ #define FIX_545_ASSERT /* VA: fix issue 545, replace assert() with warning message when hitting memory limit in the buffer of indices */ #endif - - - - #define FIX_383_CLEAN_UP /* Dlb : Clean up of unused functions */ - - #define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: improve MD coding in ISM inactive frames */ - #define FIX_547_NAN_IGF_DEC /* FhG: issue 547: fix possible nan in IGF decoder */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 140c970367..6cfbf0855d 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -9767,8 +9767,7 @@ int16_t getTcxonly( const int32_t total_brate, /* i : total bitrate */ const int16_t MCT_flag /* i : hMCT handle allocated (1) or not (0)*/ , - const int16_t is_ism_format -); + const int16_t is_ism_format ); int16_t getTnsAllowed( const int32_t total_brate, /* i : total bitrate */ diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index a8b7a08150..9b29ba03ab 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -74,10 +74,8 @@ void open_decoder_LPD( st->fscale_old = st->fscale; } - st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag - , - st->is_ism_format - ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag, + st->is_ism_format ); st->fscale = sr2fscale( st->sr_core ); fscaleFB = sr2fscale( st->output_Fs ); @@ -96,10 +94,8 @@ void open_decoder_LPD( } } - st->tcxonly = getTcxonly( st->element_mode, total_brate, MCT_flag - , - st->is_ism_format - ); + st->tcxonly = getTcxonly( st->element_mode, total_brate, MCT_flag, + st->is_ism_format ); /* the TD TCX PLC in MODE1 still runs with 80ms subframes */ if ( ( st->element_mode == EVS_MONO && st->L_frame == L_FRAME16k && total_brate <= ACELP_32k ) || ( st->element_mode > EVS_MONO && st->L_frame == L_FRAME16k && total_brate <= MAX_ACELP_BRATE ) || ( st->tcxonly && ( st->sr_core == 32000 || st->sr_core == 16000 ) ) ) diff --git a/lib_dec/core_dec_switch.c b/lib_dec/core_dec_switch.c index 01061f4774..60859a20fb 100644 --- a/lib_dec/core_dec_switch.c +++ b/lib_dec/core_dec_switch.c @@ -72,10 +72,8 @@ void mode_switch_decoder_LPD( { bSwitchFromAmrwbIO = 1; } - sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag - , - st->is_ism_format - ); + sr_core = getCoreSamplerateMode2( st->element_mode, total_brate, bwidth, st->flag_ACELP16k, st->rf_flag, + st->is_ism_format ); fscale = sr2fscale( sr_core ); /* set number of coded lines */ diff --git a/lib_dec/evs_dec.c b/lib_dec/evs_dec.c index 4767fa6ed2..4b8e5ab9e8 100644 --- a/lib_dec/evs_dec.c +++ b/lib_dec/evs_dec.c @@ -183,10 +183,7 @@ ivas_error evs_dec( } /* if previous frame was HQ Core/TCX10/TCX20 (high bitrate), drop partial copy info and continue HQ Core/TCX10/TCX20 concealment */ - if ( st->use_partial_copy && ( st->last_core == HQ_CORE || st->last_core == TCX_10_CORE || ( st->last_core == TCX_20_CORE && getTcxonly( EVS_MONO, st->last_total_brate, 0 - , - 0 - ) ) ) ) + if ( st->use_partial_copy && ( st->last_core == HQ_CORE || st->last_core == TCX_10_CORE || ( st->last_core == TCX_20_CORE && getTcxonly( EVS_MONO, st->last_total_brate, 0, 0 ) ) ) ) { st->bfi = 1; st->codec_mode = st->last_codec_mode; diff --git a/lib_dec/ivas_binRenderer_internal.c b/lib_dec/ivas_binRenderer_internal.c index 61898bed32..9061f3f39c 100644 --- a/lib_dec/ivas_binRenderer_internal.c +++ b/lib_dec/ivas_binRenderer_internal.c @@ -1120,9 +1120,9 @@ void ivas_binaural_cldfb_sf( *-------------------------------------------------------------------------*/ void ivas_binRenderer( - BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ - COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ - int16_t subframe_idx, /* i : subframe index */ + BINAURAL_RENDERER_HANDLE hBinRenderer, /* i/o: binaural renderer handle */ + COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined head and external orientation handle */ + int16_t subframe_idx, /* i : subframe index */ const int16_t numTimeSlots, /* i : number of time slots to render*/ float Cldfb_RealBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ float Cldfb_ImagBuffer_Binaural[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* o : Binaural signals */ @@ -1147,8 +1147,7 @@ void ivas_binRenderer( /* Head rotation in HOA3 or CICPx */ if ( - hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] - && hBinRenderer->rotInCldfb ) + hCombinedOrientationData != NULL && hCombinedOrientationData->enableCombinedOrientation[subframe_idx] && hBinRenderer->rotInCldfb ) { if ( hBinRenderer->hInputSetup->is_loudspeaker_setup == 0 ) { diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index d96958fce6..521baa405f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1961,14 +1961,14 @@ void ivas_qmetadata_to_dirac( hDirAC->spreadCoherence[block][b] = 0.0f; hDirAC->surroundingCoherence[block][b] = 0.0f; - hDirAC->elevation[tmp_write_idx_band][b] = 0; - hDirAC->azimuth[tmp_write_idx_band][b] = 0; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; - - hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; - hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; - hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + hDirAC->elevation[tmp_write_idx_band][b] = 0; + hDirAC->azimuth[tmp_write_idx_band][b] = 0; + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; + + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } } @@ -2068,29 +2068,29 @@ void ivas_qmetadata_to_dirac( hDirAC->energy_ratio1[tmp_write_idx_band][b] = q_direction->band_data[qBand_idx].energy_ratio[0]; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = diffuseness; - if ( hodirac_flag ) + if ( hodirac_flag ) + { + if ( idx_sec == 0 ) { - if ( idx_sec == 0 ) - { - hDirAC->elevation[tmp_write_idx_band][b] = ele; - hDirAC->azimuth[tmp_write_idx_band][b] = azi; - hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0.f; // not in use - } - else - { - assert( idx_sec == 1 ); - hDirAC->elevation2[tmp_write_idx_band][b] = ele; - hDirAC->azimuth2[tmp_write_idx_band][b] = azi; - hDirAC->energy_ratio2[tmp_write_idx_band][b] = 1.f - diffuseness_sec; - } + hDirAC->elevation[tmp_write_idx_band][b] = ele; + hDirAC->azimuth[tmp_write_idx_band][b] = azi; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0.f; // not in use } else { - hDirAC->elevation[tmp_write_idx_band][b] = ele; - hDirAC->azimuth[tmp_write_idx_band][b] = azi; + assert( idx_sec == 1 ); + hDirAC->elevation2[tmp_write_idx_band][b] = ele; + hDirAC->azimuth2[tmp_write_idx_band][b] = azi; + hDirAC->energy_ratio2[tmp_write_idx_band][b] = 1.f - diffuseness_sec; } + } + else + { + hDirAC->elevation[tmp_write_idx_band][b] = ele; + hDirAC->azimuth[tmp_write_idx_band][b] = azi; + } } tmp_write_idx_param_band = ( tmp_write_idx_param_band + 1 ) % hDirAC->dirac_md_buffer_length; @@ -2110,19 +2110,19 @@ void ivas_qmetadata_to_dirac( hDirAC->surroundingCoherence[block][b] = 0.0f; hDirAC->energy_ratio1[block][b] = 0; - hDirAC->elevation[tmp_write_idx_band][b] = 0; - hDirAC->azimuth[tmp_write_idx_band][b] = 0; - hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; - hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; - hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; - hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; - tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; + hDirAC->elevation[tmp_write_idx_band][b] = 0; + hDirAC->azimuth[tmp_write_idx_band][b] = 0; + hDirAC->diffuseness_vector[tmp_write_idx_band][b] = 0.f; + hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->surroundingCoherence[tmp_write_idx_band][b] = 0.0f; + hDirAC->energy_ratio1[tmp_write_idx_band][b] = 0; + tmp_write_idx_band = ( tmp_write_idx_band + 1 ) % hDirAC->dirac_md_buffer_length; } } } -/* update buffer write index */ - hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length; + /* update buffer write index */ + hDirAC->dirac_bs_md_write_idx = ( hDirAC->dirac_bs_md_write_idx + MAX_PARAM_SPATIAL_SUBFRAMES ) % hDirAC->dirac_md_buffer_length; return; } @@ -2149,7 +2149,7 @@ void ivas_dirac_dec_set_md_map( /* adapt subframes */ hDirAC->num_slots = nCldfbTs; hDirAC->slots_rendered = 0; - num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; + num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; hDirAC->subframes_rendered = 0; ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hDirAC->subframe_nbslots, &hDirAC->nb_subframes ); @@ -2716,16 +2716,14 @@ void ivas_dirac_dec_render_sf( hDirAC->buffer_intensity_real[2][index - 1], num_freq_bands, azimuth, - elevation - ); + elevation ); mvr2r( reference_power, &( hDirAC->buffer_energy[( index - 1 ) * num_freq_bands] ), num_freq_bands ); computeDiffuseness( hDirAC->buffer_intensity_real, hDirAC->buffer_energy, num_freq_bands, - hDirAC->diffuseness_vector[md_idx] - ); + hDirAC->diffuseness_vector[md_idx] ); } #ifdef DEBUG_MODE_DIRAC @@ -2897,7 +2895,6 @@ void ivas_dirac_dec_render_sf( ivas_dirac_dec_output_synthesis_get_interpolator( &hDirAC->h_output_synthesis_psd_params, hDirAC->subframe_nbslots[subframe_idx] ); - if ( hDirAC->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) { ivas_dirac_dec_output_synthesis_process_subframe_gain_shd( Cldfb_RealBuffer, diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 71637e7e7b..ff15bae70d 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -993,8 +993,7 @@ void ivas_ism_dec_digest_tc( elevation = (int16_t) floorf( st_ivas->hIsmMetaData[i]->elevation + 0.5f ); if ( ( st_ivas->renderer_type == RENDERER_TD_PANNING || st_ivas->renderer_type == RENDERER_BINAURAL_MIXER_CONV_ROOM ) && - st_ivas->hCombinedOrientationData == NULL - ) + st_ivas->hCombinedOrientationData == NULL ) { if ( st_ivas->hIntSetup.is_planar_setup ) { diff --git a/lib_dec/ivas_mc_param_dec.c b/lib_dec/ivas_mc_param_dec.c index 9d8eeea5fc..32fbf135ba 100644 --- a/lib_dec/ivas_mc_param_dec.c +++ b/lib_dec/ivas_mc_param_dec.c @@ -1688,8 +1688,7 @@ void ivas_param_mc_dec_render( if ( ( st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV || st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV_ROOM ) ) { if ( - st_ivas->hCombinedOrientationData - && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) + st_ivas->hCombinedOrientationData && st_ivas->renderer_type == RENDERER_BINAURAL_FASTCONV ) { ivas_param_mc_mc2sba_cldfb( st_ivas->hTransSetup, hParamMC->hoa_encoder, slot_idx, Cldfb_RealBuffer, Cldfb_ImagBuffer, nband_synth, GAIN_LFE ); } diff --git a/lib_dec/ivas_output_config.c b/lib_dec/ivas_output_config.c index aeabc49956..16787b63cd 100644 --- a/lib_dec/ivas_output_config.c +++ b/lib_dec/ivas_output_config.c @@ -148,9 +148,7 @@ void ivas_renderer_select( *renderer_type = RENDERER_BINAURAL_FASTCONV_ROOM; } - if ( st_ivas->hDecoderConfig->Opt_Headrotation - || st_ivas->hDecoderConfig->Opt_ExternalOrientation - ) + if ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) { nchan_internal = ivas_sba_get_nchan_metadata( st_ivas->sba_analysis_order, st_ivas->hDecoderConfig->ivas_total_brate ); diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c old mode 100755 new mode 100644 index baefd33e83..92e18c5c2c --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -675,10 +675,8 @@ void ivas_spar_md_dec_process( ivas_spar_dec_parse_md_bs( hMdDec, st0, &nB, &bw, &dtx_vad, st_ivas->hDecoderConfig->ivas_total_brate, - ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode - , - st_ivas->last_active_ivas_total_brate - ); + ivas_spar_br_table_consts[hMdDec->table_idx].usePlanarCoeff, st_ivas->hQMetaData->sba_inactive_mode, + st_ivas->last_active_ivas_total_brate ); #if 0 { @@ -1700,10 +1698,8 @@ static void ivas_spar_dec_parse_md_bs( int16_t *dtx_vad, const int32_t ivas_total_brate, const int16_t use_planar_coeff, - const int16_t sba_inactive_mode - , - const int32_t last_active_brate -) + const int16_t sba_inactive_mode, + const int32_t last_active_brate ) { int16_t i, j, k, num_bands; int16_t ii, jj, ndec, ndm, b, idx; diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 1583f4006a..27375db6fa 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1188,7 +1188,7 @@ typedef struct decoder_config_structure int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ float non_diegetic_pan_gain; /* non diegetic panning gain*/ int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ - int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ + int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ /* temp. development parameters */ #ifdef DEBUGGING diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index 63990a46e0..2617be5f2a 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -73,10 +73,8 @@ void stereo_tcx_init_dec( st->core_brate = st->total_brate; /*sampling rate*/ - st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_flag - , - st->is_ism_format - ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_flag, + st->is_ism_format ); st->fscale = sr2fscale( st->sr_core ); /*frame size*/ @@ -110,10 +108,8 @@ void stereo_tcx_init_dec( if ( st->element_mode == IVAS_SCE ) { - st->tcxonly = getTcxonly( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, MCT_flag - , - st->is_ism_format - ); + st->tcxonly = getTcxonly( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, MCT_flag, + st->is_ism_format ); /* LPC quantization */ if ( st->sr_core <= INT_FS_16k && st->tcxonly == 0 ) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 9e3ce49b6d..e46fe70028 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -404,13 +404,13 @@ static IVAS_DEC_BS_FORMAT mapIvasFormat( *---------------------------------------------------------------------*/ ivas_error IVAS_DEC_Configure( - IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ - const uint32_t sampleRate, /* i : output sampling frequency */ - const IVAS_DEC_AUDIO_CONFIG outputFormat, /* i : output format */ - const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ - const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ - const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ - const int16_t enableExternalOrientation, /* i : enable external orientations */ + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const uint32_t sampleRate, /* i : output sampling frequency */ + const IVAS_DEC_AUDIO_CONFIG outputFormat, /* i : output format */ + const int16_t customLsOutputEnabled, /* i : enable custom loudspeaker setup handle */ + const int16_t hrtfReaderEnabled, /* i : enable HRTF binary file input */ + const int16_t enableHeadRotation, /* i : enable head rotation for binaural output */ + const int16_t enableExternalOrientation, /* i : enable external orientations */ const HEAD_ORIENT_TRK_T orientation_tracking, /* i : head orientation tracking type */ const int16_t renderConfigEnabled, /* i : enable Renderer config. file for binaural output */ const int16_t Opt_non_diegetic_pan, /* i : diegetic or not */ diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c index b7081f31b3..e3faed3d7a 100644 --- a/lib_enc/core_enc_init.c +++ b/lib_enc/core_enc_init.c @@ -72,16 +72,12 @@ void init_coder_ace_plus( int16_t L_subfr; /* Bitrate */ - st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag - , - st->is_ism_format - ); + st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag, + st->is_ism_format ); /* Core Sampling Rate */ - st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode - , - st->is_ism_format - ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, + st->is_ism_format ); st->fscale = sr2fscale( st->sr_core ); /* Narrowband? */ diff --git a/lib_enc/core_enc_switch.c b/lib_enc/core_enc_switch.c index b43f046cd6..e6433bc89a 100644 --- a/lib_enc/core_enc_switch.c +++ b/lib_enc/core_enc_switch.c @@ -69,10 +69,8 @@ void core_coder_mode_switch( } /* force active frame for the first frame when switching from high bitrates when DTX is enabled*/ - sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode - , - st->is_ism_format - ); + sr_core = getCoreSamplerateMode2( st->element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, + st->is_ism_format ); fscale = sr2fscale( sr_core ); @@ -82,10 +80,8 @@ void core_coder_mode_switch( switchWB = 1; /*force init when coming from MODE1*/ } - tcxonly_tmp = getTcxonly( st->element_mode, st->total_brate, MCT_flag - , - st->is_ism_format - ); + tcxonly_tmp = getTcxonly( st->element_mode, st->total_brate, MCT_flag, + st->is_ism_format ); if ( tcxonly_tmp != st->tcxonly ) { @@ -97,10 +93,8 @@ void core_coder_mode_switch( st->sr_core = sr_core; st->L_frame = (int16_t) ( sr_core / FRAMES_PER_SEC ); - st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag - , - st->is_ism_format - ); + st->tcxonly = getTcxonly( st->element_mode, st->total_brate, MCT_flag, + st->is_ism_format ); st->bits_frame_nominal = (int16_t) ( (float) st->L_frame / (float) st->fscale * (float) FSCALE_DENOM / 128.0f * (float) st->total_brate / 100.0f + 0.49f ); diff --git a/lib_enc/ivas_core_pre_proc.c b/lib_enc/ivas_core_pre_proc.c index f6c473a11a..1e536f8026 100644 --- a/lib_enc/ivas_core_pre_proc.c +++ b/lib_enc/ivas_core_pre_proc.c @@ -241,10 +241,8 @@ ivas_error pre_proc_ivas( st->total_brate = st->bits_frame_nominal * FRAMES_PER_SEC; SetModeIndex( st, st->last_bits_frame_nominal * FRAMES_PER_SEC, last_element_mode, MCT_flag ); - st->sr_core = getCoreSamplerateMode2( element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode - , - st->is_ism_format - ); + st->sr_core = getCoreSamplerateMode2( element_mode, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, + st->is_ism_format ); st->total_brate = total_brate_tmp; st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 739e7369b2..970d2c1c8c 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -388,10 +388,8 @@ ivas_error ivas_cpe_enc( { int32_t internal_Fs; - internal_Fs = getTcxonly( IVAS_CPE_MDCT, sts[0]->bits_frame_nominal * FRAMES_PER_SEC, 0 - , - sts[0]->is_ism_format - ) == 0 + internal_Fs = getTcxonly( IVAS_CPE_MDCT, sts[0]->bits_frame_nominal * FRAMES_PER_SEC, 0, + sts[0]->is_ism_format ) == 0 ? INT_FS_16k : max( INT_FS_16k, sts[0]->sr_core ); diff --git a/lib_enc/ivas_stereo_dmx_evs.c b/lib_enc/ivas_stereo_dmx_evs.c index 7dd09f2986..0db97b28d1 100644 --- a/lib_enc/ivas_stereo_dmx_evs.c +++ b/lib_enc/ivas_stereo_dmx_evs.c @@ -176,13 +176,13 @@ void estimate_itd_wnd_fft( static void calc_poc( STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */ - const float wnd[], /* i : window coef */ - const float rfft_coef[], /* i : RFFT coef */ - const float specLr[], /* i : Lch real-part spectra */ - const float specLi[], /* i : Lch imaginary-part input signal */ - const float specRr[], /* i : Rch real-part spectra */ - const float specRi[], /* i : Rch imaginary-part input signal */ - const int16_t input_frame /* i : input frame length per channel */ + const float wnd[], /* i : window coef */ + const float rfft_coef[], /* i : RFFT coef */ + const float specLr[], /* i : Lch real-part spectra */ + const float specLi[], /* i : Lch imaginary-part input signal */ + const float specRr[], /* i : Rch real-part spectra */ + const float specRi[], /* i : Rch imaginary-part input signal */ + const int16_t input_frame /* i : input frame length per channel */ ) { int16_t i, n1, n2; @@ -878,10 +878,10 @@ static ivas_error estimate_itd( float *corr, /* o : correlation */ STEREO_DMX_EVS_POC_HANDLE hPOC, /* i/o: phase only correlation structure */ STEREO_DMX_EVS_PHA_HANDLE hPHA, /* i/o : correlation filter structure */ - const float srcL[], /* i : Lch input signal */ - const float srcR[], /* i : Rch input signal */ - float itd[], /* o : estimated itd */ - const int16_t input_frame /* i : input frame length per channel */ + const float srcL[], /* i : Lch input signal */ + const float srcR[], /* i : Rch input signal */ + float itd[], /* o : estimated itd */ + const int16_t input_frame /* i : input frame length per channel */ ) { float specLr[L_FRAME48k / 2 + 1], specLi[L_FRAME48k / 2 + 1], specRr[L_FRAME48k / 2 + 1], specRi[L_FRAME48k / 2 + 1]; @@ -1116,8 +1116,8 @@ void stereo_dmx_evs_enc( STEREO_DMX_EVS_ENC_HANDLE hStereoDmxEVS, /* i/o: Stereo downmix for EVS encoder handle */ const int32_t input_Fs, /* i : input sampling rate */ int16_t data[CPE_CHANNELS * L_FRAME48k], /* i/o: input signal */ - const int16_t n_samples, /* i : number of input samples */ - const bool is_binaural /* i : indication that input is binaural audio */ + const int16_t n_samples, /* i : number of input samples */ + const bool is_binaural /* i : indication that input is binaural audio */ ) { int16_t n; diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index 644cfb9155..fa21a17943 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -79,10 +79,8 @@ void stereo_tcx_init_enc( } /*sampling rate*/ - st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_mode - , - st->is_ism_format - ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, st->bits_frame_nominal * FRAMES_PER_SEC, st->bwidth, st->flag_ACELP16k, st->rf_mode, + st->is_ism_format ); st->fscale = sr2fscale( st->sr_core ); /*frame size*/ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c old mode 100755 new mode 100644 index 99fad4f631..bb8eeadc5f --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -264,8 +264,8 @@ ivas_error IVAS_ENC_ConfigureForMono( const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ const IVAS_ENC_CHANNEL_AWARE_CONFIG caConfig, /* i : configuration of channel-aware mode, can by set to default by using IVAS_ENC_GetDefaultChannelAwareConfig() */ - const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ - const bool is_binaural /* i : if true, the input is binaural audio */ + const bool downmixFromStereo, /* i : if true, the encoder accepts a stereo input and internally downmixes it to mono before encoding */ + const bool is_binaural /* i : if true, the input is binaural audio */ ) { ivas_error error; @@ -304,8 +304,8 @@ ivas_error IVAS_ENC_ConfigureForStereo( const int32_t bitrate, /* i : requested bitrate of the output bitstream */ const bool max_bwidth_user, /* i : shows if bandwidth limitation was set by the user (true) or if default bandwidth was used (false) */ const IVAS_ENC_BANDWIDTH maxBandwidth, /* i : bandwidth limitation */ - const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ - const bool is_binaural /* i : flag indicating if input is binaural audio */ + const IVAS_ENC_DTX_CONFIG dtxConfig, /* i : configuration of DTX, can by set to default by using IVAS_ENC_GetDefaultDtxConfig() */ + const bool is_binaural /* i : flag indicating if input is binaural audio */ #ifdef DEBUGGING , const IVAS_ENC_STEREO_MODE stereoMode /* i : forces a specific stereo coding mode */ diff --git a/lib_enc/pre_proc.c b/lib_enc/pre_proc.c index d56387d3ff..f32c9ad27c 100644 --- a/lib_enc/pre_proc.c +++ b/lib_enc/pre_proc.c @@ -600,10 +600,8 @@ void pre_proc( else { SetModeIndex( st, st->last_total_brate, EVS_MONO, 0 ); - st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode - , - 0 - ); + st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, + 0 ); st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); st->encoderLookahead_enc = NS2SA( st->sr_core, ACELP_LOOK_NS ); st->encoderPastSamples_enc = ( st->L_frame * 9 ) >> 4; diff --git a/lib_enc/updt_enc.c b/lib_enc/updt_enc.c index c27bb3043a..b958d544f4 100644 --- a/lib_enc/updt_enc.c +++ b/lib_enc/updt_enc.c @@ -393,10 +393,8 @@ void updt_enc_common( { st->codec_mode = MODE2; - st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode - , - 0 - ); + st->sr_core = getCoreSamplerateMode2( EVS_MONO, st->total_brate, st->bwidth, st->flag_ACELP16k, st->rf_mode, + 0 ); st->L_frame = (int16_t) ( st->sr_core / FRAMES_PER_SEC ); diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 447ccede61..b2b4887499 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -1441,18 +1441,18 @@ ivas_error ivas_rend_crendProcess( *-----------------------------------------------------------------------------------------*/ ivas_error ivas_rend_crendProcessSubframe( - const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ - const AUDIO_CONFIG inConfig, /* i : input audio configuration */ - const AUDIO_CONFIG outConfig, /* i : output audio configuration */ - const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ + const CREND_WRAPPER *pCrend, /* i/o: Crend wrapper handle */ + const AUDIO_CONFIG inConfig, /* i : input audio configuration */ + const AUDIO_CONFIG outConfig, /* i : output audio configuration */ + const DECODER_CONFIG_HANDLE hDecoderConfig, /* i : decoder config. structure */ const COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ - const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ - DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ - float *input_f[], /* i : transport channels */ - float *output[], /* i/o: input/output audio channels */ - const int16_t n_samples_to_render, /* i : output frame length per channel */ - const int32_t output_Fs /* i : output sampling rate */ + const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ + DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ + float *input_f[], /* i : transport channels */ + float *output[], /* i/o: input/output audio channels */ + const int16_t n_samples_to_render, /* i : output frame length per channel */ + const int32_t output_Fs /* i : output sampling rate */ ) { int16_t subframe_idx, subframe_len; diff --git a/lib_rend/ivas_dirac_ana.c b/lib_rend/ivas_dirac_ana.c index 71d3c924a0..d0bb2a3899 100644 --- a/lib_rend/ivas_dirac_ana.c +++ b/lib_rend/ivas_dirac_ana.c @@ -401,4 +401,3 @@ static void ivas_dirac_dmx( return; } - diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 86c0a80ef8..8db8d1a471 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -415,10 +415,10 @@ void ivas_dirac_dec_binaural_render( *------------------------------------------------------------------------*/ void ivas_dirac_dec_binaural( - Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : combined orientation handle */ - float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ - const int16_t nchan_transport /* i : number of transport channels */ + float output_f[][L_FRAME48k], /* i/o: synthesized core-coder transport channels/DirAC output */ + const int16_t nchan_transport /* i : number of transport channels */ ) { int16_t subframe; diff --git a/lib_rend/ivas_masa_merge.c b/lib_rend/ivas_masa_merge.c index 5bca5a1754..7e4ad1ae37 100644 --- a/lib_rend/ivas_masa_merge.c +++ b/lib_rend/ivas_masa_merge.c @@ -40,7 +40,6 @@ the United Nations Convention on Contracts on the International Sales of Goods. #include "wmc_auto.h" - static void copy_masa_meta_tile( MASA_DECODER_EXT_OUT_META_HANDLE outMeta, /* o: metadata to be written */ MASA_DECODER_EXT_OUT_META_HANDLE inMeta, /* i: input metadata */ @@ -357,4 +356,3 @@ void masaPrerendClose( return; } - diff --git a/lib_rend/ivas_mcmasa_ana.c b/lib_rend/ivas_mcmasa_ana.c index 233c0b4459..ba5380a09d 100644 --- a/lib_rend/ivas_mcmasa_ana.c +++ b/lib_rend/ivas_mcmasa_ana.c @@ -46,7 +46,6 @@ #include "wmc_auto.h" - /*------------------------------------------------------------------------- * Local constants *------------------------------------------------------------------------*/ @@ -1111,4 +1110,3 @@ void ivas_create_masa_out_meta( return; } - diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index bf89194224..86ec0125d5 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -260,12 +260,12 @@ ivas_error ivas_td_binaural_renderer_unwrap( const int16_t lfe_idx, /* i : LFE channel index */ const IVAS_FORMAT ivas_format, /* i : IVAS format */ ISM_METADATA_HANDLE *hIsmMetaData, /* i : ISM metadata handle */ - const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ - const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ - const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ - const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ - float *output[], /* i/o: SCE channels / Binaural synthesis */ - const int16_t output_frame /* i : output frame length */ + const int16_t *enableCombinedOrientation, /* i : Combined orientation flag */ + const IVAS_QUATERNION *Quaternions, /* i : Head tracking data per subframe */ + const IVAS_VECTOR3 *Pos, /* i : Listener position data per subframe */ + const int16_t ism_md_subframe_update, /* i: Number of subframes to delay ism metadata to sync with audio */ + float *output[], /* i/o: SCE channels / Binaural synthesis */ + const int16_t output_frame /* i : output frame length */ ) { int16_t subframe_length; @@ -610,14 +610,14 @@ ivas_error ivas_td_binaural_open_ext( *---------------------------------------------------------------------*/ ivas_error ivas_td_binaural_renderer_ext( - const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ - const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ - const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ + const TDREND_WRAPPER *pTDRend, /* i : TD Renderer wrapper structure */ + const IVAS_REND_AudioConfig inConfig, /* i : Input audio configuration */ + const LSSETUP_CUSTOM_STRUCT *customLsInput, /* i : Input custom loudspeaker layout */ const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ - const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ - const REVERB_HANDLE hReverb, /* i : Reverberator handle */ - const int16_t output_frame, /* i : output frame length */ - float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ + const IVAS_REND_AudioObjectPosition *currentPos, /* i : Object position */ + const REVERB_HANDLE hReverb, /* i : Reverberator handle */ + const int16_t output_frame, /* i : output frame length */ + float output[][L_FRAME48k] /* i/o: SCE channels / Binaural synthesis */ ) { ISM_METADATA_FRAME hIsmMetaDataFrame; diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index 5013fff9d6..c13815be3c 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -45,7 +45,6 @@ #include "wmc_auto.h" - /*------------------------------------------------------------------------- * Local function prototypes *------------------------------------------------------------------------*/ @@ -581,4 +580,3 @@ void computeReferencePower_ana( return; } - diff --git a/lib_rend/ivas_rotation.c b/lib_rend/ivas_rotation.c index d9a96e7723..f1677def68 100644 --- a/lib_rend/ivas_rotation.c +++ b/lib_rend/ivas_rotation.c @@ -250,10 +250,10 @@ void rotateAziEle( void rotateFrame_shd( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ - float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const int16_t subframe_idx /* i : subframe index */ + float *output[], /* i/o: unrotated HOA3 signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, l, n, m; @@ -351,11 +351,11 @@ void rotateFrame_shd( void rotateFrame_sd( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, /* i : head and external orientation combined handle */ - float *output[], /* i/o: unrotated SD signal buffer in TD */ - const int16_t subframe_len, /* i : subframe length per channel */ - const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - const int16_t subframe_idx /* i : subframe index */ + float *output[], /* i/o: unrotated SD signal buffer in TD */ + const int16_t subframe_len, /* i : subframe length per channel */ + const IVAS_OUTPUT_SETUP hTransSetup, /* i : format for rotation */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + const int16_t subframe_idx /* i : subframe index */ ) { int16_t i, j; @@ -577,7 +577,7 @@ void rotateFrame_shd_cldfb( *------------------------------------------------------------------------*/ void rotateFrame_sd_cldfb( - float Rmat[3][3], /* i : real-space rotation matrix */ + float Rmat[3][3], /* i : real-space rotation matrix */ float Cldfb_RealBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain real part */ float Cldfb_ImagBuffer[][MAX_PARAM_SPATIAL_SUBFRAMES][CLDFB_NO_CHANNELS_MAX], /* i/o: unrotated HOA3 signal buffer in cldfb domain imag part */ const IVAS_OUTPUT_SETUP_HANDLE hOutputSetup, /* i : output format setup number of channels */ diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index eef7a58bc8..c763630325 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -37,7 +37,7 @@ #include "options.h" #include "ivas_cnst.h" #include "ivas_stat_com.h" // note: needed for DIRAC_DEC_BIN_HANDLE until #156 is solved -#include "stat_com.h" /* Note: Currently needed for CLDFB. */ +#include "stat_com.h" /* Note: Currently needed for CLDFB. */ #include "common_api_types.h" diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 5452ebb9dd..4e75d5fea8 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4407,14 +4407,14 @@ static void renderBufferChannel( } static ivas_error rotateFrameMc( - IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ - IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ - LSSETUP_CUSTOM_STRUCT inCustomLs, /* i : Input Custom LS setup */ - const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ + IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ + IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ + LSSETUP_CUSTOM_STRUCT inCustomLs, /* i : Input Custom LS setup */ + const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ - rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ + rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) { int16_t i; @@ -4544,12 +4544,12 @@ static ivas_error rotateFrameMc( } static ivas_error rotateFrameSba( - IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ - IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ - const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ + IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ + IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ + const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ - rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ - IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ + rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ + IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) { int16_t i, l, n, m; @@ -4734,97 +4734,97 @@ static ivas_error renderIsmToBinauralRoom( } - if ( combinedOrientationEnabled ) + if ( combinedOrientationEnabled ) + { + subframe_len = ismInput->base.inputBuffer.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; + // for ( subframe_idx = 0; subframe_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; subframe_idx++ ) + for ( subframe_idx = 0; subframe_idx < 1; subframe_idx++ ) { - subframe_len = ismInput->base.inputBuffer.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; - // for ( subframe_idx = 0; subframe_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; subframe_idx++ ) - for ( subframe_idx = 0; subframe_idx < 1; subframe_idx++ ) + for ( i = 0; i < 3; i++ ) { - for ( i = 0; i < 3; i++ ) + if ( hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) { - if ( hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) - { - for ( j = 0; j < 3; j++ ) - { - Rmat[i][j] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][j]; - } - } - else + for ( j = 0; j < 3; j++ ) { - /* Set to identity */ - set_zero( Rmat[i], 3 ); - Rmat[i][i] = 1.0f; + Rmat[i][j] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][j]; } } + else + { + /* Set to identity */ + set_zero( Rmat[i], 3 ); + Rmat[i][i] = 1.0f; + } } - (void) subframe_len; // avoid warning } + (void) subframe_len; // avoid warning + } - /* TODO tmu : see issue #518 */ - /* Possible optimization: less processing needed if position didn't change - * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ - /* previous position gains */ - if ( combinedOrientationEnabled ) - { - rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 ); - rotatedPos.azimuth = (float) azi_rot; - rotatedPos.elevation = (float) ele_rot; - } + /* TODO tmu : see issue #518 */ + /* Possible optimization: less processing needed if position didn't change + * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ + /* previous position gains */ + if ( combinedOrientationEnabled ) + { + rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 ); + rotatedPos.azimuth = (float) azi_rot; + rotatedPos.elevation = (float) ele_rot; + } - if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, - ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, - ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, - previousPanGains ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, + ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, + ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, + previousPanGains ) ) != IVAS_ERR_OK ) + { + return error; + } - /* current position gains */ - if ( combinedOrientationEnabled ) - { - rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 ); - rotatedPos.azimuth = (float) azi_rot; - rotatedPos.elevation = (float) ele_rot; - } + /* current position gains */ + if ( combinedOrientationEnabled ) + { + rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 ); + rotatedPos.azimuth = (float) azi_rot; + rotatedPos.elevation = (float) ele_rot; + } - if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, - ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, - ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, - currentPanGains ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, + ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, + ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, + currentPanGains ) ) != IVAS_ERR_OK ) + { + return error; + } - for ( i = 0; i < 3; i++ ) - { - mvr2r( Rmat[i], ismInput->rot_mat_prev[i], 3 ); - } + for ( i = 0; i < 3; i++ ) + { + mvr2r( Rmat[i], ismInput->rot_mat_prev[i], 3 ); + } - /* intermediate rendering to 7_1_4 */ - tmpMcBuffer = ismInput->base.inputBuffer; + /* intermediate rendering to 7_1_4 */ + tmpMcBuffer = ismInput->base.inputBuffer; - if ( ( error = getAudioConfigNumChannels( IVAS_REND_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = getAudioConfigNumChannels( IVAS_REND_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) + { + return error; + } - tmpMcBuffer.config.numChannels = tmp; - tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); - set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); + tmpMcBuffer.config.numChannels = tmp; + tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); + set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); - renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, tmpMcBuffer ); + renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, tmpMcBuffer ); - copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); + copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } - accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); - free( tmpMcBuffer.data ); + free( tmpMcBuffer.data ); pop_wmops(); return IVAS_ERR_OK; @@ -5175,10 +5175,9 @@ static ivas_error renderMcToBinaural( } } - if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( - combinedOrientationEnabled + if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( combinedOrientationEnabled - && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) + && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); @@ -5272,9 +5271,7 @@ static ivas_error renderMcToBinauralRoom( } } - if ( ( mcInput->hReverb != NULL && outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( - combinedOrientationEnabled - && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) + if ( ( mcInput->hReverb != NULL && outConfig == IVAS_REND_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) && ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( combinedOrientationEnabled && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); diff --git a/lib_util/head_rotation_file_reader.c b/lib_util/head_rotation_file_reader.c index 745b48a8c9..c26a7b9156 100644 --- a/lib_util/head_rotation_file_reader.c +++ b/lib_util/head_rotation_file_reader.c @@ -35,4 +35,3 @@ #include #include #include "prot.h" - diff --git a/lib_util/rotation_file_reader.c b/lib_util/rotation_file_reader.c index a7686772a1..19721f49ba 100644 --- a/lib_util/rotation_file_reader.c +++ b/lib_util/rotation_file_reader.c @@ -230,4 +230,3 @@ const char *RotationFileReader_getFilePath( return rotReader->file_path; } - -- GitLab From c31ae07aed2ad4565fddadade49d02211d692a0c Mon Sep 17 00:00:00 2001 From: Markus Multrus Date: Wed, 14 Jun 2023 19:45:46 +0200 Subject: [PATCH 371/381] [fix] disable FIX_532_ISM_MD_INACTIVE due to problems --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 8a98ccc141..a0864dee37 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,7 @@ #endif #define FIX_383_CLEAN_UP /* Dlb : Clean up of unused functions */ -#define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: improve MD coding in ISM inactive frames */ +// #define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: improve MD coding in ISM inactive frames */ #define FIX_547_NAN_IGF_DEC /* FhG: issue 547: fix possible nan in IGF decoder */ -- GitLab From 1e5e8f48f4d8da3d4955f7af0643808a166ba06d Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Jun 2023 09:41:10 +0200 Subject: [PATCH 372/381] fix remaining issues with FIX_532_ISM_MD_INACTIVE in OMASA --- lib_enc/ivas_masa_enc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index 349ffa9515..dab2c493e2 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -385,22 +385,28 @@ ivas_error ivas_masa_encode( { /* signal NULL metadata frame */ push_next_indice( hMetaData, 1, ISM_METADATA_MD_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_MD_FLAG_BITS; /* write the ISM class to ISM_NO_META and again the true ISM class */ push_next_indice( hMetaData, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; push_next_indice( hMetaData, hIsmMetaData[0]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; } else { push_next_indice( hMetaData, hIsmMetaData[0]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; if ( hIsmMetaData[0]->ism_imp == ISM_NO_META ) { /* signal low-rate ISM_NO_META frame */ push_next_indice( hMetaData, 0, ISM_METADATA_MD_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_MD_FLAG_BITS; /* signal presence of MD in low-rate ISM_NO_META frame */ push_next_indice( hMetaData, hIsmMetaData[0]->ism_md_lowrate_flag, ISM_METADATA_INACTIVE_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_INACTIVE_FLAG_BITS; } } #else @@ -424,22 +430,28 @@ ivas_error ivas_masa_encode( { /* signal NULL metadata frame */ push_next_indice( hMetaData, 1, ISM_METADATA_MD_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_MD_FLAG_BITS; /* write the ISM class to ISM_NO_META and again the true ISM class */ push_next_indice( hMetaData, ISM_NO_META, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; push_next_indice( hMetaData, hIsmMetaData[i]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; } else { push_next_indice( hMetaData, hIsmMetaData[i]->ism_imp, ISM_METADATA_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_FLAG_BITS; if ( hIsmMetaData[i]->ism_imp == ISM_NO_META ) { /* signal low-rate ISM_NO_META frame */ push_next_indice( hMetaData, 0, ISM_METADATA_MD_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_MD_FLAG_BITS; /* signal presence of MD in low-rate ISM_NO_META frame */ push_next_indice( hMetaData, hIsmMetaData[i]->ism_md_lowrate_flag, ISM_METADATA_INACTIVE_FLAG_BITS ); + hQMetaData->metadata_max_bits -= ISM_METADATA_INACTIVE_FLAG_BITS; } } #else -- GitLab From 6b558e2cc87e9bc37c65a7b309e17993b652d762 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 15 Jun 2023 10:02:52 +0200 Subject: [PATCH 373/381] use new BINAURAL_ROOM* output configs --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 74fd91a604..24a5e46d9f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,7 @@ variables: SANITIZER_TESTS: "CLANG1 CLANG2" OUT_FORMATS_CHANNEL_BASED: "stereo mono 5_1 5_1_2 5_1_4 7_1 7_1_4" OUT_FORMATS_SCENE_BASED: "FOA HOA2 HOA3" - OUT_FORMATS_BINAURAL: "BINAURAL BINAURAL_ROOM" + OUT_FORMATS_BINAURAL: "BINAURAL BINAURAL_ROOM_IR BINAURAL_ROOM_REVERB" EXIT_CODE_NON_BE: 123 EXIT_CODE_FAIL: 1 -- GitLab From f5da52905bf0dae41db283fb5d5a6d1f9efb53d9 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Jun 2023 10:16:37 +0200 Subject: [PATCH 374/381] update within FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH for OMASA --- lib_enc/ivas_spar_md_enc.c | 2 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib_enc/ivas_spar_md_enc.c b/lib_enc/ivas_spar_md_enc.c index dbca3809cc..9ff27f82fc 100644 --- a/lib_enc/ivas_spar_md_enc.c +++ b/lib_enc/ivas_spar_md_enc.c @@ -45,7 +45,7 @@ /*------------------------------------------------------------------------------------------* * PreProcessor *------------------------------------------------------------------------------------------*/ -#define IVAS_MAX_MD_BYTES ( 1000 ) +#define IVAS_MAX_MD_BYTES ( 1000 ) // ToDo: not used static const float pr_boost_range[2] = { 0.1f, 0.4f }; diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 2c916691d0..4b6e364200 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -53,8 +53,8 @@ *------------------------------------------------------------------------*/ #define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f -#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) -#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) // ToDo: not used +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) // ToDo: not used #ifdef MASA_AND_OBJECTS #define STEREO_PREPROCESS_IIR_FACTOR ( 0.9f ) @@ -69,7 +69,11 @@ #define ADAPT_HTPROTO_ROT_LIM_1 0.8f #ifdef FIX_511_OPTIMIZE_PARAMBIN_GAIN_FETCH +#ifdef MASA_AND_OBJECTS +#define MAX_GAIN_CACHE_SIZE ( 5 * 3 ) /* == max number of simultaneous directions * 3 */ +#else #define MAX_GAIN_CACHE_SIZE 6 +#endif typedef struct hrtfGainCache { -- GitLab From 29a8aecfd90a08bac86b35d9c978d87be37f0018 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Jun 2023 11:12:31 +0200 Subject: [PATCH 375/381] fix MAX_GAIN_CACHE_SIZE size --- lib_rend/ivas_dirac_dec_binaural_functions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 1ca593f68e..fe2dc890b4 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -69,7 +69,7 @@ #define ADAPT_HTPROTO_ROT_LIM_1 0.8f #ifdef MASA_AND_OBJECTS -#define MAX_GAIN_CACHE_SIZE ( 5 * 3 ) /* == max number of simultaneous directions * 3 */ +#define MAX_GAIN_CACHE_SIZE ( ( MASA_MAXIMUM_DIRECTIONS + MAX_NUM_OBJECTS ) * 3 ) /* == max number of simultaneous directions * 3 */ #else #define MAX_GAIN_CACHE_SIZE 6 #endif -- GitLab From 9ea697c8c11d35546c396818ec1da181ab5628ff Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Jun 2023 11:36:13 +0200 Subject: [PATCH 376/381] maintenance: new function ivas_omasa_ener_brate() + comments --- lib_com/ivas_prot.h | 16 ++++++++--- lib_enc/ivas_enc.c | 45 +++++++------------------------ lib_enc/ivas_ism_enc.c | 4 +-- lib_enc/ivas_ism_metadata_enc.c | 6 ++--- lib_enc/ivas_masa_enc.c | 4 +-- lib_enc/ivas_omasa_enc.c | 47 +++++++++++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 46 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 69745469ac..e1263217f7 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -947,7 +947,7 @@ ivas_error ivas_ism_enc( int16_t *nb_bits_metadata /* i : number of metadata bits */ #ifdef OMASA_ENERGIES , - int16_t flag_omasa_brate + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ #endif ); @@ -971,7 +971,7 @@ ivas_error ivas_ism_metadata_enc( ,const float lp_noise_CPE /* i : LP filterend total noise estimation */ #ifdef OMASA_ENERGIES , - int16_t flag_omasa_brate + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ #endif #ifdef FIX_OMASA_STEREO_SWITCHING ,int16_t *omasa_stereo_sw_cnt @@ -5078,7 +5078,7 @@ ivas_error ivas_masa_encode( const int16_t ism_imp /* i : importance of separated object */ #ifdef OMASA_ENERGIES , - const int16_t flag_omasa_brate /* i : flag for using less bitrate for objects in OMASA*/ + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ #endif #endif ); @@ -5728,6 +5728,16 @@ void set_ism_importance_interformat( int16_t ism_imp[] /* o : ISM importance flags */ ); +#ifdef OMASA_ENERGIES +/*! r: flag for using less bitrate for objects in OMASA */ +int16_t ivas_omasa_ener_brate( + const int16_t nchan_ism, /* i : number of ISMs */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + float data_f[][L_FRAME48k], /* i : Input / transport audio signals */ + const int16_t input_frame /* i : Input frame size */ +); +#endif + /*! r: adjusted bitrate */ int32_t ivas_interformat_brate( const ISM_MODE ism_mode, /* i : ISM mode */ diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index 9a1ed1ae30..3898b44fc5 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -63,9 +63,6 @@ ivas_error ivas_enc( Encoder_State *st; /* used for bitstream handling */ #ifdef MASA_AND_OBJECTS int16_t nb_bits_metadata[MAX_SCE + 1]; -#ifdef OMASA_ENERGIES - int16_t flag_omasa_brate; -#endif #else int16_t nb_bits_metadata[MAX_SCE]; #endif @@ -92,9 +89,6 @@ ivas_error ivas_enc( #ifdef MASA_AND_OBJECTS set_s( nb_bits_metadata, 0, MAX_SCE + 1 ); -#ifdef OMASA_ENERGIES - flag_omasa_brate = 0; -#endif #else set_s( nb_bits_metadata, 0, MAX_SCE ); #endif @@ -304,6 +298,11 @@ ivas_error ivas_enc( { float data_separated_object[L_FRAME48k]; int16_t idx_separated_object; +#ifdef OMASA_ENERGIES + int16_t flag_omasa_ener_brate; + + flag_omasa_ener_brate = 0; +#endif if ( ( error = ivas_omasa_enc_config( st_ivas ) ) != IVAS_ERR_OK ) { @@ -358,40 +357,14 @@ ivas_error ivas_enc( else if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { #ifdef OMASA_ENERGIES - float energy_ism, energy_masa; - - energy_ism = 0.0f; - - if ( st_ivas->nSCE >= 3 && st_ivas->hEncoderConfig->ivas_total_brate == IVAS_128k ) - { - for ( i = 0; i < st_ivas->nSCE; i++ ) - { - energy_ism += sum2_f( data_f[i], input_frame ); - } - - energy_masa = 0.0f; - - for ( i = st_ivas->nSCE; i < st_ivas->nSCE + 2; i++ ) - { - energy_masa += sum2_f( data_f[i], input_frame ); - } - - energy_ism = energy_ism / ( energy_masa + 1.0f ) * 2.0f / (float) ( st_ivas->nSCE ); - flag_omasa_brate = 0; - if ( energy_ism < 1.0f ) - { - flag_omasa_brate = 1; - } -#ifdef DEBUG_MODE_INFO - dbgwrite( &energy_ism, sizeof( float ), 1, 1, "en_ratio.bin" ); -#endif - } + flag_omasa_ener_brate = ivas_omasa_ener_brate( st_ivas->hEncoderConfig->nchan_ism, ivas_total_brate, data_f, input_frame ); #endif + /* Analysis, decision about bitrates per channel & core coding */ if ( ( error = ivas_ism_enc( st_ivas, data_f, input_frame, &nb_bits_metadata[1] #ifdef OMASA_ENERGIES , - flag_omasa_brate + flag_omasa_ener_brate #endif ) ) != IVAS_ERR_OK ) { @@ -416,7 +389,7 @@ ivas_error ivas_enc( st_ivas->ism_mode, hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, idx_separated_object, st_ivas->hOMasa, st_ivas->hIsmMetaData[0]->ism_imp #ifdef OMASA_ENERGIES , - flag_omasa_brate + flag_omasa_ener_brate #endif ) ) != IVAS_ERR_OK ) { diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index c9ce0e7721..f68940c9dd 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -55,7 +55,7 @@ ivas_error ivas_ism_enc( int16_t *nb_bits_metadata /* i : number of metadata bits */ #ifdef OMASA_ENERGIES , - int16_t flag_omasa_brate + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ #endif ) { @@ -288,7 +288,7 @@ ivas_error ivas_ism_enc( nb_bits_metadata, vad_flag, st_ivas->ism_mode, NULL, st_ivas->hEncoderConfig->ism_extended_metadata_flag, st_ivas->hMasa != NULL ? st_ivas->hMasa->data.lp_noise_CPE : 0 #ifdef OMASA_ENERGIES , - flag_omasa_brate + flag_omasa_ener_brate #endif #ifdef FIX_OMASA_STEREO_SWITCHING , diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 97e10027a9..d9b3645358 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -194,7 +194,7 @@ ivas_error ivas_ism_metadata_enc( const float lp_noise_CPE #ifdef OMASA_ENERGIES , - int16_t flag_omasa_brate + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ #endif #ifdef FIX_OMASA_STEREO_SWITCHING , @@ -704,9 +704,9 @@ ivas_error ivas_ism_metadata_enc( { *ism_total_brate += ivas_interformat_brate( ism_mode, nchan_ism, hSCE[ch]->element_brate, ism_imp[ch], brate_limit_flag ); #ifdef OMASA_ENERGIES - if ( ism_imp[ch] > 1 && flag_omasa_brate == 1 && brate_limit_flag >= 0 ) + if ( ism_imp[ch] > 1 && flag_omasa_ener_brate == 1 && brate_limit_flag >= 0 ) { - *ism_total_brate -= flag_omasa_brate * ADJUST_ISM_BRATE_NEG; + *ism_total_brate -= ADJUST_ISM_BRATE_NEG; } if ( brate_limit_flag == -1 && ism_imp[ch] >= 1 && nchan_ism >= 3 && ( ism_total_brate_ref - *ism_total_brate > IVAS_48k ) ) diff --git a/lib_enc/ivas_masa_enc.c b/lib_enc/ivas_masa_enc.c index dab2c493e2..6fa2d7885f 100644 --- a/lib_enc/ivas_masa_enc.c +++ b/lib_enc/ivas_masa_enc.c @@ -249,7 +249,7 @@ ivas_error ivas_masa_encode( const int16_t ism_imp /* i : importance of separated object */ #ifdef OMASA_ENERGIES , - const int16_t flag_omasa_brate /* i : flag for using less bitrate for objects in OMASA */ + const int16_t flag_omasa_ener_brate /* i : less bitrate for objects in OMASA flag */ #endif #endif ) @@ -470,7 +470,7 @@ ivas_error ivas_masa_encode( #ifdef OMASA_ENERGIES if ( ivas_total_brate == IVAS_128k && nchan_ism >= 3 ) { - push_next_indice( hMetaData, flag_omasa_brate, 1 ); + push_next_indice( hMetaData, flag_omasa_ener_brate, 1 ); hQMetaData->metadata_max_bits -= 1; } #endif diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 24d1cfe140..714054d977 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -727,6 +727,53 @@ void ivas_set_surplus_brate_enc( } +#ifdef OMASA_ENERGIES +/*--------------------------------------------------------------------------* + * ivas_omasa_ener_brate() + * + * + *--------------------------------------------------------------------------*/ + +/*! r: OMASA energy bitrate flag */ +int16_t ivas_omasa_ener_brate( + const int16_t nchan_ism, /* i : number of ISMs */ + const int32_t ivas_total_brate, /* i : IVAS total bitrate */ + float data_f[][L_FRAME48k], /* i : Input / transport audio signals */ + const int16_t input_frame /* i : Input frame size */ +) +{ + int16_t i, flag_omasa_ener_brate; + float energy_ism, energy_masa; + + flag_omasa_ener_brate = 0; + + if ( nchan_ism >= 3 && ivas_total_brate == IVAS_128k ) + { + energy_ism = 0.0f; + for ( i = 0; i < nchan_ism; i++ ) + { + energy_ism += sum2_f( data_f[i], input_frame ); + } + + energy_masa = 0.0f; + for ( i = nchan_ism; i < nchan_ism + MASA_MAXIMUM_DIRECTIONS; i++ ) + { + energy_masa += sum2_f( data_f[i], input_frame ); + } + + energy_ism = energy_ism / ( energy_masa + 1.0f ) * 2.0f / (float) ( nchan_ism ); + + if ( energy_ism < 1.0f ) + { + flag_omasa_ener_brate = 1; + } + } + + return flag_omasa_ener_brate; +} +#endif + + /*--------------------------------------------------------------------------* * Local functions *--------------------------------------------------------------------------*/ -- GitLab From e3d09896b79bb6656de3b657dd1e2d6e371e326e Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Jun 2023 12:42:44 +0200 Subject: [PATCH 377/381] activate FIX_532_ISM_MD_INACTIVE again (non-BE outputs in ISM are expected) --- lib_com/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index a0864dee37..8a98ccc141 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -151,7 +151,7 @@ #endif #define FIX_383_CLEAN_UP /* Dlb : Clean up of unused functions */ -// #define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: improve MD coding in ISM inactive frames */ +#define FIX_532_ISM_MD_INACTIVE /* VA: issue 532: improve MD coding in ISM inactive frames */ #define FIX_547_NAN_IGF_DEC /* FhG: issue 547: fix possible nan in IGF decoder */ -- GitLab From 09102fb7438713ae6f0d3e71fa3032b413c73f97 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 15 Jun 2023 14:22:46 +0300 Subject: [PATCH 378/381] Fix binaural gain cache in relation to OMASA --- lib_rend/ivas_dirac_dec_binaural_functions.c | 38 ++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index fe2dc890b4..e418af9d52 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -69,7 +69,7 @@ #define ADAPT_HTPROTO_ROT_LIM_1 0.8f #ifdef MASA_AND_OBJECTS -#define MAX_GAIN_CACHE_SIZE ( ( MASA_MAXIMUM_DIRECTIONS + MAX_NUM_OBJECTS ) * 3 ) /* == max number of simultaneous directions * 3 */ +#define MAX_GAIN_CACHE_SIZE ( ( MASA_MAXIMUM_DIRECTIONS * 3 ) + MAX_NUM_OBJECTS ) /* == different calls to get gains */ #else #define MAX_GAIN_CACHE_SIZE 6 #endif @@ -814,6 +814,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric int16_t dirac_read_idx; float subFrameTotalEne[CLDFB_NO_CHANNELS_MAX]; PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_GAIN_CACHE_SIZE]; +#ifdef MASA_AND_OBJECTS + int16_t gainCacheBaseIndex; +#endif hDirAC = st_ivas->hDirAC; h = st_ivas->hDiracDecBin; @@ -952,6 +955,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric eleDeg = hDirAC->elevation[dirac_read_idx][bin]; ratio = hDirAC->energy_ratio1[dirac_read_idx][bin]; spreadCoh = hDirAC->spreadCoherence[dirac_read_idx][bin]; +#ifdef MASA_AND_OBJECTS + gainCacheBaseIndex = 0; +#endif } #ifdef MASA_AND_OBJECTS else if ( st_ivas->ivas_format != MASA_ISM_FORMAT || ( st_ivas->ivas_format == MASA_ISM_FORMAT && dirIndex < hDirAC->numParametricDirections ) ) /* For second of the two simultaneous directions */ @@ -970,6 +976,9 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric aziDeg = hDirAC->azimuth2[dirac_read_idx][bin]; eleDeg = hDirAC->elevation2[dirac_read_idx][bin]; spreadCoh = hDirAC->spreadCoherence2[dirac_read_idx][bin]; +#ifdef MASA_AND_OBJECTS + gainCacheBaseIndex = 3; +#endif } #ifdef MASA_AND_OBJECTS else /* For object directions of MASA_ISM_FORMAT */ @@ -989,6 +998,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric } ratio = st_ivas->hMasaIsmData->energy_ratio_ism[ismDirIndex][dirac_read_idx][bin]; spreadCoh = 0.0f; + gainCacheBaseIndex = 6 + ismDirIndex; } #endif @@ -1024,7 +1034,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric spreadCoh = max( spreadCoh, altSpreadCoh ); } +#ifdef MASA_AND_OBJECTS + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex], isHeadtracked ); +#else getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 )], isHeadtracked ); +#endif if ( h->renderStereoOutputInsteadOfBinaural ) { @@ -1067,7 +1081,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric rImagp *= centerMul; /* Apply the gain for the left source of the three coherent sources */ +#ifdef MASA_AND_OBJECTS + getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 1], isHeadtracked ); +#else getDirectPartGains( bin, aziDeg + 30, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 + 1 )], isHeadtracked ); +#endif hrtfEneSides = ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); lRealp += sidesMul * lRealpTmp; @@ -1077,7 +1095,11 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric /* Apply the gain for the right source of the three coherent sources. * -30 degrees to 330 wrapping due to internal functions. */ +#ifdef MASA_AND_OBJECTS + getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[gainCacheBaseIndex + 2], isHeadtracked ); +#else getDirectPartGains( bin, aziDeg + 330, eleDeg, &lRealpTmp, &lImagpTmp, &rRealpTmp, &rImagpTmp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[( dirIndex * 3 + 2 )], isHeadtracked ); +#endif hrtfEneSides += ( lRealpTmp * lRealpTmp ) + ( lImagpTmp * lImagpTmp ) + ( rRealpTmp * rRealpTmp ) + ( rImagpTmp * rImagpTmp ); lRealp += sidesMul * lRealpTmp; @@ -1293,7 +1315,12 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( int16_t dirac_read_idx; #endif DIRAC_DEC_BIN_HANDLE h; +#ifdef MASA_AND_OBJECTS + PARAMBIN_HRTF_GAIN_CACHE gainCache[MAX_NUM_OBJECTS]; + int16_t idx; +#else PARAMBIN_HRTF_GAIN_CACHE gainCache; +#endif h = st_ivas->hDiracDecBin; #ifdef MASA_AND_OBJECTS @@ -1320,7 +1347,14 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( dirac_read_idx = st_ivas->hDirAC->dirac_read_idx; #endif +#ifdef MASA_AND_OBJECTS + for ( idx = 0; idx < MAX_NUM_OBJECTS; idx++ ) + { + gainCache[idx].azi = -1000; /* Use -1000 as value for uninitialized cache. */ + } +#else gainCache.azi = -1000; /* Use -1000 as value for uninitialized cache. */ +#endif for ( bin = 0; bin < nBins; bin++ ) { @@ -1491,7 +1525,7 @@ static void ivas_dirac_dec_binaural_determine_processing_matrices( h->processMtxImPrev[chA][chB + 2][bin] = h->processMtxIm[chA][chB + 2][bin]; } - getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache, isHeadtracked ); + getDirectPartGains( bin, aziDeg, eleDeg, &lRealp, &lImagp, &rRealp, &rImagp, h->renderStereoOutputInsteadOfBinaural, Rmat, &gainCache[chB], isHeadtracked ); h->processMtxRe[0][chB + 2][bin] = lRealp * gainFactor; h->processMtxIm[0][chB + 2][bin] = lImagp * gainFactor; -- GitLab From 94397413be32f288f0dc137bfc88c759d18d1014 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Thu, 15 Jun 2023 15:21:41 +0300 Subject: [PATCH 379/381] Remove todo-comments as the related values are in use. --- lib_rend/ivas_dirac_dec_binaural_functions.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index e418af9d52..e4b70bf588 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -53,8 +53,8 @@ *------------------------------------------------------------------------*/ #define CLDFB_HALF_BIN_FREQUENCY_OFFSET 0.5f -#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) // ToDo: not used -#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) // ToDo: not used +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN ( 2.0f ) +#define IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR ( 3.0f ) #ifdef MASA_AND_OBJECTS #define STEREO_PREPROCESS_IIR_FACTOR ( 0.9f ) -- GitLab From 8e498c6fa40a3026d045487608c62b1971c4d3f9 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Jun 2023 18:50:43 +0200 Subject: [PATCH 380/381] clang-format --- lib_dec/ivas_masa_dec.c | 80 +++++++-------- lib_dec/ivas_stat_dec.h | 2 +- lib_enc/ivas_ism_metadata_enc.c | 22 ++--- lib_enc/ivas_omasa_enc.c | 2 +- lib_rend/lib_rend.c | 166 ++++++++++++++++---------------- 5 files changed, 136 insertions(+), 136 deletions(-) diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index bec64941b9..8499f4504a 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -605,10 +605,10 @@ ivas_error ivas_masa_decode( /*-------------------------------------------------------------------* - * ivas_masa_dec_open() - * - * - *-------------------------------------------------------------------*/ + * ivas_masa_dec_open() + * + * + *-------------------------------------------------------------------*/ ivas_error ivas_masa_dec_open( Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ @@ -706,10 +706,10 @@ ivas_error ivas_masa_dec_open( /*-----------------------------------------------------------------------* - * ivas_masa_dec_close() - * - * close MASA decoder - *-----------------------------------------------------------------------*/ + * ivas_masa_dec_close() + * + * close MASA decoder + *-----------------------------------------------------------------------*/ void ivas_masa_dec_close( MASA_DECODER_HANDLE *hMasa_out /* i/o: MASA metadata structure */ @@ -771,10 +771,10 @@ void ivas_masa_dec_close( /*-------------------------------------------------------------------* - * ivas_masa_dec_config() - * - * Frame-by-frame configuration of MASA decoder - *-------------------------------------------------------------------*/ + * ivas_masa_dec_config() + * + * Frame-by-frame configuration of MASA decoder + *-------------------------------------------------------------------*/ static ivas_error ivas_masa_dec_config( Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ @@ -884,10 +884,10 @@ static ivas_error ivas_masa_dec_config( /*-------------------------------------------------------------------* - * ivas_masa_prerender() - * - * Apply gaining and copying of transport signals when needed - *-------------------------------------------------------------------*/ + * ivas_masa_prerender() + * + * Apply gaining and copying of transport signals when needed + *-------------------------------------------------------------------*/ void ivas_masa_prerender( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -915,8 +915,8 @@ void ivas_masa_prerender( /*-------------------------------------------------------------------* - * Local functions - *-------------------------------------------------------------------*/ + * Local functions + *-------------------------------------------------------------------*/ static void index_16bits( IVAS_QMETADATA_HANDLE hQMetaData, @@ -1074,7 +1074,7 @@ static ivas_error init_lfe_synth_data( int16_t slot_size; /* Ring buffer for the filterbank of the LFE synthesis. - * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */ + * The filterbank is using moving average lowpass filter with the crossover of 120 Hz. */ bufferSize = (int16_t) ( ( output_Fs / FRAMES_PER_SEC ) / MAX_PARAM_SPATIAL_SUBFRAMES ); if ( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) { @@ -1087,7 +1087,7 @@ static ivas_error init_lfe_synth_data( hMasa->hMasaLfeSynth->ringBufferSize = bufferSize; /* Ring buffer for additional lowpass filter for the LFE signal. - * Moving average lowpass filter with the crossover of 240 Hz. */ + * Moving average lowpass filter with the crossover of 240 Hz. */ bufferSize /= 2; if ( ( hMasa->hMasaLfeSynth->lfeSynthRingBuffer2 = (float *) malloc( bufferSize * sizeof( float ) ) ) == NULL ) { @@ -1273,10 +1273,10 @@ static int16_t decode_lfe_to_total_energy_ratio( /*-------------------------------------------------------------------* - * ivas_masa_dec_reconfigure() - * - * Reconfigure IVAS MASA decoder - *-------------------------------------------------------------------*/ + * ivas_masa_dec_reconfigure() + * + * Reconfigure IVAS MASA decoder + *-------------------------------------------------------------------*/ ivas_error ivas_masa_dec_reconfigure( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ @@ -1319,8 +1319,8 @@ ivas_error ivas_masa_dec_reconfigure( /* possible reconfigure is done later */ /*-----------------------------------------------------------------* - * Allocate and initialize SCE/CPE and other handles - *-----------------------------------------------------------------*/ + * Allocate and initialize SCE/CPE and other handles + *-----------------------------------------------------------------*/ bit_stream = st_ivas->hSCE[0] != NULL ? st_ivas->hSCE[0]->hCoreCoder[0]->bit_stream : st_ivas->hCPE[0]->hCoreCoder[0]->bit_stream; @@ -1385,8 +1385,8 @@ ivas_error ivas_masa_dec_reconfigure( { #endif /*-----------------------------------------------------------------* - * TD Decorrelator - *-----------------------------------------------------------------*/ + * TD Decorrelator + *-----------------------------------------------------------------*/ if ( st_ivas->hDiracDecBin != NULL ) { @@ -1397,8 +1397,8 @@ ivas_error ivas_masa_dec_reconfigure( } /*-----------------------------------------------------------------* - * CLDFB instances - *-----------------------------------------------------------------*/ + * CLDFB instances + *-----------------------------------------------------------------*/ if ( ( error = ivas_cldfb_dec_reconfig( st_ivas, st_ivas->nchan_transport, numCldfbAnalyses_old, numCldfbSyntheses_old ) ) != IVAS_ERR_OK ) { @@ -1406,8 +1406,8 @@ ivas_error ivas_masa_dec_reconfigure( } /*-----------------------------------------------------------------* - * Set-up MASA coding elements and bitrates - *-----------------------------------------------------------------*/ + * Set-up MASA coding elements and bitrates + *-----------------------------------------------------------------*/ #ifdef MASA_AND_OBJECTS } #endif @@ -1467,10 +1467,10 @@ ivas_error ivas_masa_dec_reconfigure( /*-------------------------------------------------------------------* - * ivas_spar_param_to_masa_param_mapping() - * - * Determine MASA metadata from the SPAR metadata - *-------------------------------------------------------------------*/ + * ivas_spar_param_to_masa_param_mapping() + * + * Determine MASA metadata from the SPAR metadata + *-------------------------------------------------------------------*/ void ivas_spar_param_to_masa_param_mapping( Decoder_Struct *st_ivas, /* i/o: IVAS decoder struct */ @@ -2416,10 +2416,10 @@ static int16_t ivas_decode_masaism_metadata( /*-------------------------------------------------------------------* - * ivas_masa_ism_set_edited_objects() - * - * - *-------------------------------------------------------------------*/ + * ivas_masa_ism_set_edited_objects() + * + * + *-------------------------------------------------------------------*/ void ivas_masa_ism_set_edited_objects( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index a551ab7f9b..74a757f0b5 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -1237,7 +1237,7 @@ typedef struct decoder_config_structure int16_t Opt_non_diegetic_pan; /* indicates diegetic or not */ float non_diegetic_pan_gain; /* non diegetic panning gain*/ int16_t Opt_AMR_WB; /* flag indicating AMR-WB IO mode */ - int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ + int16_t Opt_ExternalOrientation; /* indiates whether external orientations are used */ /* temp. development parameters */ #ifdef DEBUGGING diff --git a/lib_enc/ivas_ism_metadata_enc.c b/lib_enc/ivas_ism_metadata_enc.c index 199fd99098..53f0dd7941 100644 --- a/lib_enc/ivas_ism_metadata_enc.c +++ b/lib_enc/ivas_ism_metadata_enc.c @@ -452,8 +452,8 @@ ivas_error ivas_ism_metadata_enc( if ( ism_metadata_flag_global ) { /*----------------------------------------------------------------* - * Metadata quantization and coding, loop over all objects - *----------------------------------------------------------------*/ + * Metadata quantization and coding, loop over all objects + *----------------------------------------------------------------*/ int16_t total_bits_metadata = 0; int16_t bits_metadata_ism = 0; @@ -529,8 +529,8 @@ ivas_error ivas_ism_metadata_enc( encode_angle_indices( hBstr, &( hIsmMetaData->position_angle ), hIsmMetaData->last_ism_metadata_flag, hSCE[0]->hCoreCoder[0]->ini_frame, idx_angle1_abs, idx_angle2_abs, &flag_abs_azimuth[ch], &flag_abs_elevation[ch] ); /*----------------------------------------------------------------* - * Quantize and encode radius, yaw, and pitch - *----------------------------------------------------------------*/ + * Quantize and encode radius, yaw, and pitch + *----------------------------------------------------------------*/ if ( ism_mode == ISM_MODE_DISC && ism_extended_metadata_flag ) { @@ -561,9 +561,9 @@ ivas_error ivas_ism_metadata_enc( } /*----------------------------------------------------------------* - * inter-object logic minimizing the use of several absolutely coded - * indexes in the same frame - *----------------------------------------------------------------*/ + * inter-object logic minimizing the use of several absolutely coded + * indexes in the same frame + *----------------------------------------------------------------*/ i = 0; while ( i == 0 || i < nchan_ism / INTER_OBJECT_PARAM_CHECK ) @@ -683,8 +683,8 @@ ivas_error ivas_ism_metadata_enc( #ifdef MASA_AND_OBJECTS /*----------------------------------------------------------------* - * Take into account the combined format bit-budget distribution - *----------------------------------------------------------------*/ + * Take into account the combined format bit-budget distribution + *----------------------------------------------------------------*/ if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) { @@ -736,8 +736,8 @@ ivas_error ivas_ism_metadata_enc( #endif /*----------------------------------------------------------------* - * Configuration and decision about bitrates per channel - *----------------------------------------------------------------*/ + * Configuration and decision about bitrates per channel + *----------------------------------------------------------------*/ #ifdef MASA_AND_OBJECTS if ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c index 714054d977..c10ec862c5 100644 --- a/lib_enc/ivas_omasa_enc.c +++ b/lib_enc/ivas_omasa_enc.c @@ -731,7 +731,7 @@ void ivas_set_surplus_brate_enc( /*--------------------------------------------------------------------------* * ivas_omasa_ener_brate() * - * + * *--------------------------------------------------------------------------*/ /*! r: OMASA energy bitrate flag */ diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index fff3f11ce4..540072679f 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -4407,14 +4407,14 @@ static void renderBufferChannel( } static ivas_error rotateFrameMc( - IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ - IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ - LSSETUP_CUSTOM_STRUCT inCustomLs, /* i : Input Custom LS setup */ - const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ + IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ + IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ + LSSETUP_CUSTOM_STRUCT inCustomLs, /* i : Input Custom LS setup */ + const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ - rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ - const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ - IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ + rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ + const EFAP_HANDLE hEFAPdata, /* i : EFAP structure */ + IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) { int16_t i; @@ -4544,12 +4544,12 @@ static ivas_error rotateFrameMc( } static ivas_error rotateFrameSba( - IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ - IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ - const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ + IVAS_REND_AudioBuffer inAudio, /* i : Input Audio buffer */ + IVAS_REND_AudioConfig inConfig, /* i : Input Audio config */ + const IVAS_REND_HeadRotData *headRotData, /* i : Head rotation data */ const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData, /* i : Combined head and external orientations */ - rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ - IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ + rotation_gains gains_prev, /* i/o: Previous frame rotation gains */ + IVAS_REND_AudioBuffer outAudio /* o : Output Audio buffer */ ) { int16_t i, l, n, m; @@ -4734,97 +4734,97 @@ static ivas_error renderIsmToBinauralRoom( } - if ( combinedOrientationEnabled ) + if ( combinedOrientationEnabled ) + { + subframe_len = ismInput->base.inputBuffer.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; + // for ( subframe_idx = 0; subframe_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; subframe_idx++ ) + for ( subframe_idx = 0; subframe_idx < 1; subframe_idx++ ) { - subframe_len = ismInput->base.inputBuffer.config.numSamplesPerChannel / RENDERER_HEAD_POSITIONS_PER_FRAME; - // for ( subframe_idx = 0; subframe_idx < RENDERER_HEAD_POSITIONS_PER_FRAME; subframe_idx++ ) - for ( subframe_idx = 0; subframe_idx < 1; subframe_idx++ ) + for ( i = 0; i < 3; i++ ) { - for ( i = 0; i < 3; i++ ) + if ( hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) { - if ( hCombinedOrientationData != NULL && ( *hCombinedOrientationData )->enableCombinedOrientation[subframe_idx] ) - { - for ( j = 0; j < 3; j++ ) - { - Rmat[i][j] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][j]; - } - } - else + for ( j = 0; j < 3; j++ ) { - /* Set to identity */ - set_zero( Rmat[i], 3 ); - Rmat[i][i] = 1.0f; + Rmat[i][j] = ( *hCombinedOrientationData )->Rmat[subframe_idx][i][j]; } } + else + { + /* Set to identity */ + set_zero( Rmat[i], 3 ); + Rmat[i][i] = 1.0f; + } } - (void) subframe_len; // avoid warning } + (void) subframe_len; // avoid warning + } - /* TODO tmu : see issue #518 */ - /* Possible optimization: less processing needed if position didn't change - * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ - /* previous position gains */ - if ( combinedOrientationEnabled ) - { - rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 ); - rotatedPos.azimuth = (float) azi_rot; - rotatedPos.elevation = (float) ele_rot; - } + /* TODO tmu : see issue #518 */ + /* Possible optimization: less processing needed if position didn't change + * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */ + /* previous position gains */ + if ( combinedOrientationEnabled ) + { + rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 ); + rotatedPos.azimuth = (float) azi_rot; + rotatedPos.elevation = (float) ele_rot; + } - if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, - ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, - ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, - previousPanGains ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, + ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->previousPos.azimuth, + ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->previousPos.elevation, + previousPanGains ) ) != IVAS_ERR_OK ) + { + return error; + } - /* current position gains */ - if ( combinedOrientationEnabled ) - { - rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 ); - rotatedPos.azimuth = (float) azi_rot; - rotatedPos.elevation = (float) ele_rot; - } + /* current position gains */ + if ( combinedOrientationEnabled ) + { + rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 ); + rotatedPos.azimuth = (float) azi_rot; + rotatedPos.elevation = (float) ele_rot; + } - if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, - ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, - ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, - currentPanGains ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper, + ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth, + ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation, + currentPanGains ) ) != IVAS_ERR_OK ) + { + return error; + } - for ( i = 0; i < 3; i++ ) - { - mvr2r( Rmat[i], ismInput->rot_mat_prev[i], 3 ); - } + for ( i = 0; i < 3; i++ ) + { + mvr2r( Rmat[i], ismInput->rot_mat_prev[i], 3 ); + } - /* intermediate rendering to 7_1_4 */ - tmpMcBuffer = ismInput->base.inputBuffer; + /* intermediate rendering to 7_1_4 */ + tmpMcBuffer = ismInput->base.inputBuffer; - if ( ( error = getAudioConfigNumChannels( IVAS_REND_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = getAudioConfigNumChannels( IVAS_REND_AUDIO_CONFIG_7_1_4, &tmp ) ) != IVAS_ERR_OK ) + { + return error; + } - tmpMcBuffer.config.numChannels = tmp; - tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); - set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); + tmpMcBuffer.config.numChannels = tmp; + tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) ); + set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels ); - renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, tmpMcBuffer ); + renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, tmpMcBuffer ); - copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); + copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer ); - if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, - NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) - { - return error; - } + if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR, + NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate ) ) != IVAS_ERR_OK ) + { + return error; + } - accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); + accumulate2dArrayToBuffer( tmpRendBuffer, &outAudio ); - free( tmpMcBuffer.data ); + free( tmpMcBuffer.data ); pop_wmops(); return IVAS_ERR_OK; @@ -5165,7 +5165,7 @@ static ivas_error renderMcToBinaural( if ( ( inConfig == IVAS_REND_AUDIO_CONFIG_LS_CUSTOM ) || ( combinedOrientationEnabled - && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) + && ( inConfig == IVAS_REND_AUDIO_CONFIG_5_1 || inConfig == IVAS_REND_AUDIO_CONFIG_7_1 ) ) ) { copyBufferTo2dArray( mcInput->base.inputBuffer, tmpRendBuffer ); -- GitLab From cc07d42d5bc298aaba4e866cea9acfcd65a7fb7e Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Fri, 16 Jun 2023 10:53:07 +0300 Subject: [PATCH 381/381] Adjust max indices for OMASA at 96 kbps --- lib_com/bitstream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index cfc353c1c1..07060b6dd9 100755 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -888,7 +888,7 @@ int16_t get_ivas_max_num_indices_metadata( } else if ( ivas_total_brate <= IVAS_96k ) { - return 240 + 100; + return 240 + 150; } else if ( ivas_total_brate <= IVAS_128k ) { -- GitLab